{
  "version": 3,
  "sources": [
    "node_modules/browser-pack/_prelude.js",
    "config/grades.json",
    "config/grants.json",
    "config/languages.json",
    "config/roles.json",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/lib/public/attendance.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/lib/public/settings.js",
    "node_modules/babel-runtime/regenerator/index.js",
    "node_modules/chart.js/src/chart.js",
    "node_modules/chart.js/src/charts/Chart.Bar.js",
    "node_modules/chart.js/src/charts/Chart.Bubble.js",
    "node_modules/chart.js/src/charts/Chart.Doughnut.js",
    "node_modules/chart.js/src/charts/Chart.Line.js",
    "node_modules/chart.js/src/charts/Chart.PolarArea.js",
    "node_modules/chart.js/src/charts/Chart.Radar.js",
    "node_modules/chart.js/src/charts/Chart.Scatter.js",
    "node_modules/chart.js/src/controllers/controller.bar.js",
    "node_modules/chart.js/src/controllers/controller.bubble.js",
    "node_modules/chart.js/src/controllers/controller.doughnut.js",
    "node_modules/chart.js/src/controllers/controller.line.js",
    "node_modules/chart.js/src/controllers/controller.polarArea.js",
    "node_modules/chart.js/src/controllers/controller.radar.js",
    "node_modules/chart.js/src/core/core.animation.js",
    "node_modules/chart.js/src/core/core.canvasHelpers.js",
    "node_modules/chart.js/src/core/core.controller.js",
    "node_modules/chart.js/src/core/core.datasetController.js",
    "node_modules/chart.js/src/core/core.element.js",
    "node_modules/chart.js/src/core/core.helpers.js",
    "node_modules/chart.js/src/core/core.interaction.js",
    "node_modules/chart.js/src/core/core.js",
    "node_modules/chart.js/src/core/core.layoutService.js",
    "node_modules/chart.js/src/core/core.plugin.js",
    "node_modules/chart.js/src/core/core.scale.js",
    "node_modules/chart.js/src/core/core.scaleService.js",
    "node_modules/chart.js/src/core/core.ticks.js",
    "node_modules/chart.js/src/core/core.tooltip.js",
    "node_modules/chart.js/src/elements/element.arc.js",
    "node_modules/chart.js/src/elements/element.line.js",
    "node_modules/chart.js/src/elements/element.point.js",
    "node_modules/chart.js/src/elements/element.rectangle.js",
    "node_modules/chart.js/src/platforms/platform.dom.js",
    "node_modules/chart.js/src/platforms/platform.js",
    "node_modules/chart.js/src/plugins/plugin.filler.js",
    "node_modules/chart.js/src/plugins/plugin.legend.js",
    "node_modules/chart.js/src/plugins/plugin.title.js",
    "node_modules/chart.js/src/scales/scale.category.js",
    "node_modules/chart.js/src/scales/scale.linear.js",
    "node_modules/chart.js/src/scales/scale.linearbase.js",
    "node_modules/chart.js/src/scales/scale.logarithmic.js",
    "node_modules/chart.js/src/scales/scale.radialLinear.js",
    "node_modules/chart.js/src/scales/scale.time.js",
    "node_modules/chartjs-color-string/color-string.js",
    "node_modules/chartjs-color/index.js",
    "node_modules/color-convert/conversions.js",
    "node_modules/color-convert/index.js",
    "node_modules/color-convert/route.js",
    "node_modules/color-name/index.js",
    "node_modules/events/events.js",
    "node_modules/moment-duration-format/lib/moment-duration-format.js",
    "node_modules/path-browserify/index.js",
    "node_modules/process/browser.js",
    "node_modules/querystring-es3/decode.js",
    "node_modules/querystring-es3/encode.js",
    "node_modules/querystring-es3/index.js",
    "node_modules/regenerator-runtime/runtime-module.js",
    "node_modules/regenerator-runtime/runtime.js",
    "node_modules/rester/lib/pylor.js",
    "node_modules/rester/lib/response.js",
    "node_modules/rester/lib/rester.js",
    "node_modules/rester/lib/utilities.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/account/index.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/account/templates/tokens.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/account/views/tokens.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/collections/temporaryPasswordCollection.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/collections/tools/bookExportImportSources.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/collections/tools/promotedGroupCollection.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/collections/tools/promotionPlanCollection.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/collections/tools/resourceRepairSources.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/collections/tools/userContentRepairSources.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/collections/tools/userExportImportSources.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/index.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/models/temporaryPasswordModel.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/models/tools/importModel.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/models/tools/promotedGroupModel.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/models/tools/promotionPlanModel.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/models/tools/sourceModel.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/templates/appVersionModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/templates/appVersions.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/templates/book-choices.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/templates/features.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/templates/logs.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/templates/subjectModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/templates/subjects.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/templates/temporaryPasswords/createModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/templates/temporaryPasswords/layout.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/templates/temporaryPasswords/manager.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/templates/tokens.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/templates/tools/chooser.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/templates/tools/common/importModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/templates/tools/exportImportBookData.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/templates/tools/exportImportUserData.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/templates/tools/migrateStudents.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/templates/tools/resourceRepair.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/templates/tools/restrictAllStudents.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/templates/tools/restrictSomeStudents.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/templates/tools/synchroniseTranches.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/templates/tools/unrestrictSomeUsers.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/templates/tools/userContentRepair.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/views/appVersionModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/views/appVersions.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/views/appVersionsModel.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/views/book-choices.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/views/features.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/views/logs.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/views/subjectModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/views/subjects.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/views/temporaryPasswords/createModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/views/temporaryPasswords/layout.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/views/temporaryPasswords/manager.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/views/tokenModel.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/views/tokens.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/views/tools/chooser.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/views/tools/common/importModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/views/tools/exportImportBookData.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/views/tools/exportImportUserData.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/views/tools/migrateStudents.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/views/tools/resourceRepair.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/views/tools/restrictAllStudents.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/views/tools/restrictSomeStudents.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/views/tools/synchroniseTranches.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/views/tools/unrestrictSomeUsers.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/admin/views/tools/userContentRepair.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/app/events.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/app/index.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/app/modules.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/app/navigation.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/app/regions.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/app/routing.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/app/session.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/app/spinner.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/app/templates/loginModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/app/templates/navigation.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/app/templates/toasts.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/app/toasts.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/app/websockets.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/books/bookModel.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/books/index.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/books/templates/bookModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/books/templates/bookmanage.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/books/templates/bookupload-editor.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/books/templates/bookupload.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/books/views/bookModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/books/views/bookmanager.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/books/views/bookupload.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/content/collections/flashCards/cardCollection.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/content/collections/flashCards/deckCollection.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/content/collections/manager/resourceCollection.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/content/index.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/content/models/flashCards/cardModel.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/content/models/flashCards/deckModel.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/content/models/manager/resourceModel.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/content/templates/flashCards/cardEditor.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/content/templates/flashCards/cardList.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/content/templates/flashCards/cardWidget.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/content/templates/flashCards/deckEditor.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/content/templates/flashCards/manager.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/content/templates/flashCards/playerContainer.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/content/templates/manager/layout.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/content/templates/manager/multiDeleteConfirmation.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/content/views/flashCards/cardEditor.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/content/views/flashCards/cardList.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/content/views/flashCards/cardWidget.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/content/views/flashCards/deckEditor.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/content/views/flashCards/manager.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/content/views/flashCards/playerContainer.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/content/views/manager/layout.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/content/views/manager/multiDeleteConfirmation.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/collections/attendance/attendanceRecordCollection.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/collections/attendance/attendanceRegisterCollection.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/index.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/models/attendance/attendanceRecordModel.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/models/attendance/attendanceRegisterModel.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/attendance/layout.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/attendance/register.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/attendance/registerHeader.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/attendance/registerSelector.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/attendance/registerSelectorHeader.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/attendance/userReport.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/calendar.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/cam.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/console/attachmentRecoveryModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/console/book-view.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/console/bookChooserModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/console/chooserView.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/console/epubNavigation.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/console/groupModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/console/header.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/console/importTocModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/console/index.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/console/learningPathNode.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/console/learningPathTemplateModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/console/learningPathView.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/console/lpNavigation.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/console/pdfNavigation.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/console/resourceOpenedModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/console/resourceSidebar.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/console/sidebar.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/evaluationModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/groupMarks.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/marks.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/tagModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/templates/tags.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/attendance/layout.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/attendance/register.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/attendance/registerHeader.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/attendance/registerSelector.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/attendance/registerSelectorHeader.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/attendance/userReport.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/calendar.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/cam.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/camBtn.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/console/attachmentRecoveryModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/console/bookChooserModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/console/bookView.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/console/chooserView.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/console/epubNavigation.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/console/eventBus.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/console/groupModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/console/header.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/console/importToc.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/console/importTocModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/console/index.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/console/learningPathTemplateModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/console/learningPathView.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/console/lpNavigation.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/console/pdfNavigation.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/console/resourceIcons.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/console/resourceOpenedModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/console/resourceSidebar.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/console/sidebar.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/evaluationModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/groupMarks.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/marks.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/studentMarks.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/tagModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/educators/views/tags.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/groups/index.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/groups/templates/customGroupManager.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/groups/templates/customGroupUploadModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/groups/templates/groupDetails.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/groups/templates/groupmanage.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/groups/templates/groupmodal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/groups/templates/membershipManager.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/groups/templates/tokenCancellationModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/groups/templates/tokenCreationModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/groups/templates/tokenManager.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/groups/views/customGroupManager.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/groups/views/customGroupModel.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/groups/views/customGroupUploadModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/groups/views/groupDetails.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/groups/views/groupModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/groups/views/groupModel.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/groups/views/groupmanager.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/groups/views/membershipManager.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/groups/views/tokenCancellationModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/groups/views/tokenCreationModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/groups/views/tokenManager.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/groups/views/tokenModel.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/home/index.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/home/templates/main.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/home/views/main.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/index.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/accordion.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/actionButton.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/actionHeader.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/actionTitle.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/actionToolbar.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/assessmentImportModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/assessmentImportModel.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/assessmentModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/assessmentModel.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/assessmentPrompt.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/backbacon.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/bigModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/bookChooser.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/booksView.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/bulkDragDropHelper.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/bulkResourceUploadModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/calBack.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/cardModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/changelogModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/dragDropFileChooser.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/errorView.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/errors.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/eventModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/eventModel.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/filter.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/filterBack.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/filterManager.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/flashCardPlayer.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/flashcardPreview.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/gradeMap.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/grid.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/gridBack.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/iago.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/imageChooser.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/infiniteCollection.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/lazyCollection.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/learningPathChooser.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/learningPathsView.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/lightBox.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/modalKit/modal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/nunjucks-env.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/resourceModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/selectra.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/serverFilterManager.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/serverGrid.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/simpleMenu.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/smallModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/statusView.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/switch.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/accordion.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/actionButton.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/actionHeader.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/actionTitle.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/assessmentImportModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/assessmentModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/assessmentPrompt.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/bigModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/bookChooser.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/booksView.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/bulkResourceUploadModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/calBack.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/cardModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/changelogModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/dragDropFileChooser.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/errorView.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/eventModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/filter/date-menu.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/filter/date-time-menu.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/filter/text-menu.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/filter/toggle-menu.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/filterBack.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/filterHost.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/flashcardPreview.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/gridBack.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/learningPathChooser.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/learningPathsView.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/lightBox.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/modalKit/modal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/resourceModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/selectra.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/simpleMenu.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/smallModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/statusView.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/lib/templates/switch.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/login/index.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/login/templates/main.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/login/views/main.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/index.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/serviceModel.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/templates/deviceBindings.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/templates/exceptionConsole/layout.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/templates/greyLabeling.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/templates/greyLabelingModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/templates/licenseChanges.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/templates/manageLicenses.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/templates/manageTokens.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/templates/newsletter.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/templates/reports.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/templates/serviceModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/templates/services.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/templates/sessions.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/templates/trancheChanges.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/templates/userRoleViewer.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/views/deviceBindings.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/views/exceptionConsole/bookChecks.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/views/exceptionConsole/contentChecks.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/views/exceptionConsole/exceptionModel.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/views/exceptionConsole/layout.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/views/exceptionConsole/userChecks.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/views/greyLabeling.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/views/greyLabelingModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/views/greyLabelingModel.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/views/licenseChanges.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/views/manageLicenses.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/views/manageTokens.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/views/newsletter.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/views/reports.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/views/serviceModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/views/services.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/views/sessions.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/views/trancheChanges.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/system/views/userRoleViewer.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/uploads/index.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/uploads/templates/errors.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/uploads/templates/groups.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/uploads/templates/importModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/uploads/templates/index.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/uploads/templates/overview.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/uploads/templates/problem-template.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/uploads/templates/problems.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/uploads/templates/relations.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/uploads/templates/upload-item.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/uploads/templates/upload-list.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/uploads/templates/uploads.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/uploads/templates/users.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/uploads/templates/warnings.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/uploads/views/errorModel.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/uploads/views/errors.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/uploads/views/groups.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/uploads/views/importModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/uploads/views/index.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/uploads/views/overview.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/uploads/views/pageBus.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/uploads/views/problems.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/uploads/views/relations.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/uploads/views/uploadList.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/uploads/views/uploadModel.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/uploads/views/uploads.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/uploads/views/users.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/uploads/views/warnings.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/users/index.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/users/templates/userDetails.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/users/templates/userModal.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/users/templates/usermanage.nunj",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/users/userModel.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/users/views/userDetails.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/users/views/userModal.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/public/js/users/views/usermanage.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/vendor/js/flatpickr.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/vendor/js/pdf_link_service.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/vendor/js/slideout.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/vendor/js/timepicker.js",
    "/home/gitlab-runner/builds/tjcrhryE/1/itsi/pef/alchemy/vendor/js/ui_utils.js"
  ],
  "names": [],
  "mappings": "AAAA;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5sCA,YAEA,QAAO,SACN,yBAA0B,EAC1B,0BAA2B,EAC3B,uBAAwB;;;ACLzB,YAGA,IAAI,KAEJ,GAAE,MAAQ,QAAQ,2BAClB,EAAE,OAAS,QAAQ,4BAEnB,EAAE,YAAc,QAAQ,+BAExB,EAAE,aAAe,EAAE,YAAY,IAAI,SAAU,GAC3C,MAAO,GAAK,QACX,OAEH,EAAE,UAAY,QAAQ,4BAEtB,OAAO,QAAU;;;AChBjB;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/XA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACn1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACx9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC16BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChiBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3gBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1bA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACreA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACv0BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACzsDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AC9SA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrFA;AACA;AACA;AACA;AACA;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AChuBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzcA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5hBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjIA,YAEA,IAAI,UAAW,QAAQ,YAEnB,UAAY,QAAQ,kBAEpB,OAAS,OAAO,QAAU,GAAI,UAAS,WAAW,WAGtD,QAAO,QAAU,SAAU,GAC1B,OAAO,QACN,QACC,OAAQ,gBAGT,aAAc,WACb,EAAI,SAAS,GAAI;;;AChBpB,GAAI,UAAW,QAAS,YACpB,IAAM,SAAS,KAAO,GAAI,UAAS,WAAc,KAAI,KAAK,YAAa,CAC3E,IAAI,UAAW,WAAc,QAAS,GAAK,EAAK,EAAS,EAAO,EAAS,GACzE,GAEI,GAAS,EACb,KACA,GAAI,GAAiB,IACrB,IAAU,uXACP,EACH,EAAe,eAAe,EAAK,EAAS,EAAO,EAAS,GAE5D,EAAG,KAAM,GAGP,MAAO,GACP,EAAG,EAAQ,YAAY,EAbZ,KACD,QAeZ,OACA,KAAM,MAGF,aAAe,SAAS,IAC5B,UAAS,KAAO,SAAU,EAAK,EAAS,EAAO,EAAS,GACvD,GAAI,GAAiB,EAAI,WACzB,GAAI,YAAc,SAAU,EAAM,EAAI,EAAY,GAC/B,kBAAP,KACV,EAAK,EACL,GAAK,EAEN,IAAI,GAAW,SAAS,GACvB,IACC,MAAO,SAAQ,GACd,MAAO,GACR,GAAK,EAAM,IAAK,YAAe,MAAO,GAAM,IAAK,YAAc,KAG7D,E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",
  "file": "generated.js",
  "sourceRoot": "",
  "sourcesContent": [
    "(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})",
    "module.exports={\n\t\"Other\": [\n\t\t{\"name\": \"All Grades\", \"value\": \"ALL\"},\n\t\t{\"name\": \"Teacher/Educator/Lecturer\", \"value\": \"TE\", \"alt\": 0},\n\t\t{\"name\": \"Training\", \"value\": \"TRN\"}\n\t],\n\n\t\"Pre-primary\": [\n\t\t{\"name\": \"Grade 0\", \"value\": \"G0\"},\n\t\t{\"name\": \"Grade R\", \"value\": \"GR\"},\n\t\t{\"name\": \"Grade RR\", \"value\": \"GRR\"},\n\t\t{\"name\": \"Grade RRR\", \"value\": \"GRRR\"}\n\t],\n\n\t\"Primary\": [\n\t\t{\"name\": \"Grade 1\", \"value\": \"G1\", \"alt\": 1, \"lexical\": \"Grade 01\"},\n\t\t{\"name\": \"Grade 2\", \"value\": \"G2\", \"alt\": 2, \"lexical\": \"Grade 02\"},\n\t\t{\"name\": \"Grade 3\", \"value\": \"G3\", \"alt\": 3, \"lexical\": \"Grade 03\"},\n\t\t{\"name\": \"Grade 4\", \"value\": \"G4\", \"alt\": 4, \"lexical\": \"Grade 04\"},\n\t\t{\"name\": \"Grade 5\", \"value\": \"G5\", \"alt\": 5, \"lexical\": \"Grade 05\"},\n\t\t{\"name\": \"Grade 6\", \"value\": \"G6\", \"alt\": 6, \"lexical\": \"Grade 06\"},\n\t\t{\"name\": \"Grade 7\", \"value\": \"G7\", \"alt\": 7, \"lexical\": \"Grade 07\"}\n\t],\n\n\t\"Secondary\": [\n\t\t{\"name\": \"Grade 8\", \"value\": \"G8\", \"alt\": 8, \"lexical\": \"Grade 08\"},\n\t\t{\"name\": \"Grade 9\", \"value\": \"G9\", \"alt\": 9, \"lexical\": \"Grade 09\"},\n\t\t{\"name\": \"Grade 10\", \"value\": \"G10\", \"alt\": 10},\n\t\t{\"name\": \"Grade 11\", \"value\": \"G11\", \"alt\": 11},\n\t\t{\"name\": \"Grade 12\", \"value\": \"G12\", \"alt\": 12}\n\t],\n\n\t\"Tertiary\": [\n\t\t{\"name\": \"1st Year\", \"value\": \"T1\", \"alt\": 13},\n\t\t{\"name\": \"2nd Year\", \"value\": \"T2\", \"alt\": 14},\n\t\t{\"name\": \"3rd Year\", \"value\": \"T3\", \"alt\": 15},\n\t\t{\"name\": \"4th Year\", \"value\": \"T4\", \"alt\": 16},\n\t\t{\"name\": \"5th Year\", \"value\": \"T5\"},\n\t\t{\"name\": \"6th Year\", \"value\": \"T6\"},\n\t\t{\"name\": \"Honours\", \"value\": \"T7\"},\n\t\t{\"name\": \"Masters\", \"value\": \"T8\"},\n\t\t{\"name\": \"Doctorate\", \"value\": \"T9\"},\n\t\t{\"name\": \"General Tertiary\", \"value\": \"TX\" },\n\t\t{\"name\": \"Skills Course\", \"value\": \"SK\" },\n\t\t{\"name\": \"Short Course\", \"value\": \"SC\" }\n\t],\n\n\t\"NQF\": [\n\t\t{\"name\": \"NQF1\", \"value\": \"NQF1\", \"lexical\": \"NQF01\"},\n\t\t{\"name\": \"NQF2\", \"value\": \"NQF2\", \"lexical\": \"NQF02\"},\n\t\t{\"name\": \"NQF3\", \"value\": \"NQF3\", \"lexical\": \"NQF03\"},\n\t\t{\"name\": \"NQF4\", \"value\": \"NQF4\", \"lexical\": \"NQF04\"},\n\t\t{\"name\": \"NQF5\", \"value\": \"NQF5\", \"lexical\": \"NQF05\"},\n\t\t{\"name\": \"NQF6\", \"value\": \"NQF6\", \"lexical\": \"NQF06\"},\n\t\t{\"name\": \"NQF7\", \"value\": \"NQF7\", \"lexical\": \"NQF07\"},\n\t\t{\"name\": \"NQF8\", \"value\": \"NQF8\", \"lexical\": \"NQF08\"},\n\t\t{\"name\": \"NQF9\", \"value\": \"NQF9\", \"lexical\": \"NQF09\"},\n\t\t{\"name\": \"NQF10\", \"value\": \"NQF10\"}\n\t],\n\n\t\"KS\": [\n\t\t{\"name\": \"KS1\", \"value\": \"KS1\", \"lexical\": \"KS01\"},\n\t\t{\"name\": \"KS2\", \"value\": \"KS2\", \"lexical\": \"KS02\"},\n\t\t{\"name\": \"KS3\", \"value\": \"KS3\", \"lexical\": \"KS03\"},\n\t\t{\"name\": \"KS4\", \"value\": \"KS4\", \"lexical\": \"KS04\"},\n\t\t{\"name\": \"KS5\", \"value\": \"KS5\", \"lexical\": \"KS05\"}\n\t],\n\n\t\"Years\": [\n\t\t{\"name\": \"Year 1\", \"value\": \"Y1\", \"lexical\": \"Y01\"},\n\t\t{\"name\": \"Year 2\", \"value\": \"Y2\", \"lexical\": \"Y02\"},\n\t\t{\"name\": \"Year 3\", \"value\": \"Y3\", \"lexical\": \"Y03\"},\n\t\t{\"name\": \"Year 4\", \"value\": \"Y4\", \"lexical\": \"Y04\"},\n\t\t{\"name\": \"Year 5\", \"value\": \"Y5\", \"lexical\": \"Y05\"},\n\t\t{\"name\": \"Year 6\", \"value\": \"Y6\", \"lexical\": \"Y06\"},\n\t\t{\"name\": \"Year 7\", \"value\": \"Y7\", \"lexical\": \"Y07\"},\n\t\t{\"name\": \"Year 8\", \"value\": \"Y8\", \"lexical\": \"Y08\"},\n\t\t{\"name\": \"Year 9\", \"value\": \"Y9\", \"lexical\": \"Y09\"},\n\t\t{\"name\": \"Year 10\", \"value\": \"Y10\"},\n\t\t{\"name\": \"Year 11\", \"value\": \"Y11\"},\n\t\t{\"name\": \"Year 12\", \"value\": \"Y12\"},\n\t\t{\"name\": \"Year 13\", \"value\": \"Y13\"}\n\t],\n\n\t\"Forms\": [\n\t\t{\"name\": \"FORM 1\", \"value\": \"F1\", \"alt\": 1, \"lexical\": \"FORM 01\"},\n\t\t{\"name\": \"FORM 2\", \"value\": \"F2\", \"alt\": 2, \"lexical\": \"FORM 02\"},\n\t\t{\"name\": \"FORM 3\", \"value\": \"F3\", \"alt\": 3, \"lexical\": \"FORM 03\"},\n\t\t{\"name\": \"FORM 4\", \"value\": \"F4\", \"alt\": 4, \"lexical\": \"FORM 04\"},\n\t\t{\"name\": \"FORM 5\", \"value\": \"F5\", \"alt\": 5, \"lexical\": \"FORM 05\"},\n\t\t{\"name\": \"FORM 6\", \"value\": \"F6\", \"alt\": 6, \"lexical\": \"FORM 06\"}\n\t],\n\n\t\"NCV\": [\n\t\t{\"name\": \"Level 2\", \"value\": \"NCV2\"},\n\t\t{\"name\": \"Level 3\", \"value\": \"NCV3\"},\n\t\t{\"name\": \"Level 4\", \"value\": \"NCV4\"}\n\t],\n\n\t\"Nated\": [\n\t\t{\"name\": \"N1\", \"value\": \"N1\"},\n\t\t{\"name\": \"N2\", \"value\": \"N2\"},\n\t\t{\"name\": \"N3\", \"value\": \"N3\"},\n\t\t{\"name\": \"N4\", \"value\": \"N4\"},\n\t\t{\"name\": \"N5\", \"value\": \"N5\"},\n\t\t{\"name\": \"N6\", \"value\": \"N6\"}\n\t]\n}",
    "module.exports={\n\t\"hods\": {\n\t\t\"name\": \"Subjects\",\n\t\t\"grant\": \"\"\n\t},\n\t\"publishers\": {\n\t\t\"name\": \"Publishers\",\n\t\t\"grant\": \"\"\n\t}\n}",
    "module.exports=[\n    {\"name\":\"Afrikaans\", \"local\":\"Afrikaans\", \"1\":\"af\", \"2\":\"afr\", \"3\":\"afr\"},\n    {\"name\":\"Arabic\", \"local\":\"Arabic\", \"1\":\"ar\", \"2\":\"ara\", \"3\":\"ara\"},\n    {\"name\":\"English\", \"local\":\"English\", \"1\":\"en\", \"2\":\"eng\", \"3\":\"eng\"},\n    {\"name\":\"English-Afrikaans\", \"local\":\"English-Afrikaans\", \"1\":\"en-af\", \"2\":\"eng-afr\", \"3\":\"eng-afr\"},\n    {\"name\":\"French\", \"local\":\"French\", \"1\":\"fr\", \"2\":\"fra\", \"3\":\"fra\"},\n    {\"name\":\"German\", \"local\":\"German\", \"1\":\"de\", \"2\":\"deu\", \"3\":\"deu\"},\n    {\"name\":\"Southern Ndebele\", \"local\":\"IsiNdebele\", \"1\":\"nr\", \"2\":\"nbl\", \"3\":\"nbl\"},\n    {\"name\":\"Northern Sotho\", \"local\":\"Sepedi\", \"1\":\"\", \"2\":\"nso\", \"3\":\"nso\"},\n    {\"name\":\"Southern Sotho\", \"local\":\"Sesotho\", \"1\":\"st\", \"2\":\"sot\", \"3\":\"sot\"},\n    {\"name\":\"Swati\", \"local\":\"Siswati\", \"1\":\"ss\", \"2\":\"ssw\", \"3\":\"ssw\"},\n    {\"name\":\"Tswana\", \"local\":\"Setswana\", \"1\":\"tn\", \"2\":\"tsn\", \"3\":\"tsn\"},\n    {\"name\":\"Tsonga\", \"local\":\"Xitsonga\", \"1\":\"ts\", \"2\":\"tso\", \"3\":\"tso\"},\n    {\"name\":\"Venda\", \"local\":\"Tshivenda\", \"1\":\"ve\", \"2\":\"ven\", \"3\":\"ven\"},\n    {\"name\":\"Xhosa\", \"local\":\"IsiXhosa\", \"1\":\"xh\", \"2\":\"xho\", \"3\":\"xho\"},\n    {\"name\":\"Zulu\", \"local\":\"IsiZulu\", \"1\":\"zu\", \"2\":\"zul\", \"3\":\"zul\"}\n]",
    "module.exports={\n\t\"*\": {\n\t\t\"name\": \"Default Role\",\n\t\t\"permissions\": [\n\t\t\t\"api.apk.version.get\",\n\t\t\t\"api.apk.latest.get\",\n\t\t\t\"api.apk.download.get\",\n\t\t\t\"api.apps.version.get\",\n\t\t\t\"api.cdn.*\",\n\t\t\t\"api.data.subjects.get\",\n\t\t\t\"api.data.publishers.get\",\n\t\t\t\"api.epubs._.cover.get\",\n\t\t\t\"api.features.config.get\",\n\t\t\t\"api.features.devices.get\",\n\t\t\t\"api.freeform.*\",\n\t\t\t\"api.flashCards.*\",\n\t\t\t\"api.hermes.alive.get\",\n\t\t\t\"api.ios.version.get\",\n\t\t\t\"api.login.session.get\",\n\t\t\t\"api.login.logout.get\",\n\t\t\t\"api.login.post\",\n\t\t\t\"api.login.oauthlogin.post\",\n\t\t\t\"api.login.oauth.post\",\n\t\t\t\"api.mac.version.get\",\n\t\t\t\"api.news.latest.get\",\n\t\t\t\"api.newsletter.name.get\",\n\t\t\t\"api.newsletter.download.get\",\n\t\t\t\"api.newsletter.get\",\n\t\t\t\"api.prefs.*\",\n\t\t\t\"api.services._.cover.get\",\n\t\t\t\"api.users._.unpersonate.get\",\n\t\t\t\"api.web.*\",\n\t\t\t\"api.windows.version.get\",\n\t\t\t\"api.windows81.version.get\",\n\n\t\t\t\"acacia.books.getGroupBooks.get\",\n\t\t\t\"acacia.books.getBooksByGroups.get\",\n\t\t\t\"acacia.books.getSelectraBooks.get\",\n\t\t\t\"acacia.books.book.activeGroups.get\",\n\t\t\t\"acacia.books.book.lockedGroups.get\",\n\t\t\t\"acacia.books.book.tokenGroups.get\",\n\t\t\t\"acacia.users.user.activeGroups.get\",\n\t\t\t\"acacia.users.user.availableGroups.get\",\n\t\t\t\"acacia.users.user.lockedGroups.get\",\n\t\t\t\"acacia.users.user.oldYearGroups.get\",\n\t\t\t\"acacia.users.user.grants.*\",\n\t\t\t\"acacia.users.getUsersList.get\",\n\t\t\t\"acacia.epub.internal.file.get\",\n\n\t\t\t\"help\",\n\t\t\t\"books.assignGroups\"\n\t\t]\n\t},\n\n\t\"superuser\": {\n\t\t\"name\": \"Superuser\",\n\t\t\"desc\": \"This account has complete access to all EC functions. Only for ITSI staff.\",\n\t\t\"exclusivity\": [\"main\"],\n\t\t\"permissions\": [\n\t\t\t\"api.analytics.*\",\n\t\t\t\"api.apk.post\",\n\t\t\t\"api.apps.version.post\",\n\t\t\t\"api.annotations.*\",\n\t\t\t\"api.assessments.*\",\n\t\t\t\"api.attachments.*\",\n\t\t\t\"api.attendance.*\",\n\t\t\t\"api.books.*\",\n\t\t\t\"api.calendar.*\",\n\t\t\t\"api.data.*\",\n\t\t\t\"api.devices.bindings.*\",\n\t\t\t\"api.epubs.*\",\n\t\t\t\"api.empathy.books.choices.manual.post\",\n\t\t\t\"api.empathy.books.keys.manual.post\",\n\t\t\t\"api.features.get\",\n\t\t\t\"api.features.post\",\n\t\t\t\"api.features.greyLabeling.get\",\n\t\t\t\"api.features.greyLabeling.post\",\n\t\t\t\"api.features.greyLabeling.delete\",\n\t\t\t\"api.groups.*\",\n\t\t\t\"api.highlights.*\",\n\t\t\t\"api.highlights2.*\",\n\t\t\t\"api.imports.*\",\n\t\t\t\"api.ios.version.post\",\n\t\t\t\"api.login.sessions.*\",\n\t\t\t\"api.netch.*\",\n\t\t\t\"api.newsletter.*\",\n\t\t\t\"api.passwords.temporary.*\",\n\t\t\t\"api.reports.*\",\n\t\t\t\"api.resources.*\",\n\t\t\t\"api.services.*\",\n\t\t\t\"api.stats.*\",\n\t\t\t\"api.students.*\",\n\t\t\t\"api.subjects.*\",\n\t\t\t\"api.teachers.*\",\n\t\t\t\"api.tokens.*\",\n\t\t\t\"api.tools.*\",\n\t\t\t\"api.users.*\",\n\t\t\t\"api.windows.version.post\",\n\t\t\t\"api.windows81.version.post\",\n\t\t\t\"api.tags.*\",\n\n\t\t\t\"acacia.books.book.decryptedFile.get\",\n\t\t\t\"acacia.books.book.pages.get\",\n\t\t\t\"acacia.books.book.cam.stats.get\",\n\t\t\t\"acacia.calendar.*\",\n\t\t\t\"acacia.epub.*\",\n\t\t\t\"acacia.groups.*\",\n\t\t\t\"acacia.pdf._.get\",\n\t\t\t\"acacia.learningPaths.*\",\n\t\t\t\"acacia.logs.*\",\n\t\t\t\"acacia.tranches._.groups.get\",\n\t\t\t\"acacia.resources.*\",\n\t\t\t\"acacia.users.*\",\n\n\t\t\t\"attendance.all\",\n\t\t\t\"attendance.register.create\",\n\t\t\t\"attendance.register.modify\",\n\t\t\t\"attendance.register.view\",\n\t\t\t\"analytics.all\",\n\t\t\t\"attachments.public\",\n\t\t\t\"answers\",\n\t\t\t\"books.all\",\n\t\t\t\"books.assignAll\",\n\t\t\t\"books.printOverride\",\n\t\t\t\"books.decryptedDownload\",\n\t\t\t\"books.ui-download\",\n\t\t\t\"calendar.all\",\n\t\t\t\"calendar.groups.*\",\n\t\t\t\"cam\",\n\t\t\t\"data.*\",\n\t\t\t\"educatorview.*\",\n\t\t\t\"exceptions.devices\",\n\t\t\t\"exceptions.users\",\n\t\t\t\"featureControl.*\",\n\t\t\t\"frontPageLinks\",\n\t\t\t\"folders.public\",\n\t\t\t\"grants.all.*\",\n\t\t\t\"groups.*\",\n\t\t\t\"!!groups.customGroups.owner\",\n\t\t\t\"help\",\n\t\t\t\"impersonate\",\n\t\t\t\"imports.*\",\n\t\t\t\"learningPaths.steal\",\n\t\t\t\"learningPaths.canEdit\",\n\t\t\t\"lessons\",\n\t\t\t\"reports.*\",\n\t\t\t\"resources.all\",\n\t\t\t\"resources.public\",\n\t\t\t\"resources.sidebar\",\n\t\t\t\"resources.view\",\n\t\t\t\"resources.bulkFetch\",\n\t\t\t\"roleViewer\",\n\t\t\t\"services.all\",\n\t\t\t\"temporaryPasswords\",\n\t\t\t\"tranches.deactivate\",\n\t\t\t\"users.add.*\",\n\t\t\t\"users.books.all\",\n\t\t\t\"users.enrolment.all\",\n\t\t\t\"users.tokens.all\",\n\t\t\t\"users.get.all\",\n\t\t\t\"users.update.*\",\n\t\t\t\"users.delete.*\",\n\t\t\t\"professionalDevelopment\"\n\t\t]\n\t},\n\n\t\"admin\": {\n\t\t\"name\": \"ITSI Manager\",\n\t\t\"desc\": \"This account has almost complete access to all EC functions. Only for ITSI staff.\",\n\t\t\"exclusivity\": [\"main\"],\n\t\t\"permissions\": [\n\t\t\t\"api.apk.post\",\n\t\t\t\"api.apps.version.post\",\n\t\t\t\"api.annotations.*\",\n\t\t\t\"api.assessments.*\",\n\t\t\t\"api.attachments.*\",\n\t\t\t\"api.attendance.*\",\n\t\t\t\"api.analytics.cam.*\",\n\t\t\t\"api.books.*\",\n\t\t\t\"api.calendar.*\",\n\t\t\t\"api.data.*\",\n\t\t\t\"api.devices.bindings.*\",\n\t\t\t\"api.epubs.*\",\n\t\t\t\"api.empathy.books.choices.manual.post\",\n\t\t\t\"api.empathy.books.keys.manual.post\",\n\t\t\t\"api.features.get\",\n\t\t\t\"api.features.post\",\n\t\t\t\"api.features.greyLabeling.get\",\n\t\t\t\"api.features.greyLabeling.post\",\n\t\t\t\"api.features.greyLabeling.delete\",\n\t\t\t\"api.groups.*\",\n\t\t\t\"api.highlights.*\",\n\t\t\t\"api.highlights2.*\",\n\t\t\t\"api.imports.*\",\n\t\t\t\"api.ios.version.post\",\n\t\t\t\"api.login.sessions.*\",\n\t\t\t\"api.netch.*\",\n\t\t\t\"api.newsletter.*\",\n\t\t\t\"api.passwords.temporary.*\",\n\t\t\t\"api.reports.*\",\n\t\t\t\"api.resources.*\",\n\t\t\t\"api.services.*\",\n\t\t\t\"api.stats.*\",\n\t\t\t\"api.students.*\",\n\t\t\t\"api.tags.*\",\n\t\t\t\"api.teachers.*\",\n\t\t\t\"api.teachingPlans.*\",\n\t\t\t\"api.tokens.*\",\n\t\t\t\"api.tools.*\",\n\t\t\t\"api.users.*\",\n\t\t\t\"api.windows.version.post\",\n\t\t\t\"api.windows81.version.post\",\n\n\t\t\t\"acacia.calendar.*\",\n\t\t\t\"acacia.epub.*\",\n\t\t\t\"acacia.groups.*\",\n\t\t\t\"acacia.pdf._.get\",\n\t\t\t\"acacia.learningPaths.*\",\n\t\t\t\"acacia.logs.*\",\n\t\t\t\"acacia.resources.*\",\n\t\t\t\"acacia.users.*\",\n\t\t\t\"acacia.books.book.pages.get\",\n\t\t\t\"acacia.books.book.cam.stats.get\",\n\t\t\t\"acacia.tranches._.groups.get\",\n\n\t\t\t\"attendance.all\",\n\t\t\t\"attendance.register.create\",\n\t\t\t\"attendance.register.modify\",\n\t\t\t\"attendance.register.view\",\n\n\t\t\t\"answers\",\n\t\t\t\"attachments.public\",\n\t\t\t\"books.all\",\n\t\t\t\"books.assignAll\",\n\t\t\t\"books.printOverride\",\n\t\t\t\"books.ui-download\",\n\t\t\t\"calendar.all\",\n\t\t\t\"calendar.groups.*\",\n\t\t\t\"cam\",\n\t\t\t\"lessons\",\n\t\t\t\"data.*\",\n\t\t\t\"educatorview.*\",\n\t\t\t\"!featureControl.*\",\n\t\t\t\"+featureControl.serverName\",\n\t\t\t\"+featureControl.schoolDescriptor1\",\n\t\t\t\"+featureControl.schoolDescriptor2\",\n\t\t\t\"+featureControl.schoolDescriptor3\",\n\t\t\t\"+featureControl.annualContent\",\n\t\t\t\"+featureControl.perpetualGroups\",\n\t\t\t\"+featureControl.learningPathsCustomName\",\n\t\t\t\"+featureControl.groupsCustomName\",\n\t\t\t\"+featureControl.learningPathsPluralCustomName\",\n\t\t\t\"+featureControl.groupsPluralCustomName\",\n\t\t\t\"+featureControl.ignoreTransferLimitUntil\",\n\t\t\t\"folders.public\",\n\t\t\t\"frontPageLinks\",\n\t\t\t\"impersonate\",\n\t\t\t\"imports.*\",\n\t\t\t\"grants.all.*\",\n\t\t\t\"groups.*\",\n\t\t\t\"!!groups.customGroups.owner\",\n\t\t\t\"learningPaths.steal\",\n\t\t\t\"learningPaths.canEdit\",\n\t\t\t\"reports.*\",\n\t\t\t\"resources.all\",\n\t\t\t\"resources.public\",\n\t\t\t\"resources.sidebar\",\n\t\t\t\"resources.view\",\n\t\t\t\"resources.bulkFetch\",\n\t\t\t\"roleViewer\",\n\t\t\t\"services.all\",\n\t\t\t\"teachingPlans.all\",\n\t\t\t\"temporaryPasswords\",\n\t\t\t\"users.add.*\",\n\t\t\t\"!!users.add.superuser\",\n\t\t\t\"!!users.add.admin\",\n\t\t\t\"!!users.add.featureControl\",\n\t\t\t\"users.books.all\",\n\t\t\t\"users.enrolment.all\",\n\t\t\t\"users.tokens.all\",\n\t\t\t\"users.get.all\",\n\t\t\t\"users.update.*\",\n\t\t\t\"!!users.update.superuser\",\n\t\t\t\"!!users.update.empathy\",\n\t\t\t\"!!users.update.api\",\n\t\t\t\"!!users.update.system\",\n\t\t\t\"!!users.update.featureControl\",\n\t\t\t\"users.delete.*\",\n\t\t\t\"!!users.delete.superuser\",\n\t\t\t\"!!users.delete.empathy\",\n\t\t\t\"!!users.delete.api\",\n\t\t\t\"!!users.delete.system\",\n\t\t\t\"!!users.delete.featureControl\",\n\t\t\t\"api.subjects.*\",\n\t\t\t\"help\",\n\t\t\t\"professionalDevelopment\",\n\t\t\t\"tranches.deactivate\"\n\t\t]\n\t},\n\n\t\"schoolAdmin\": {\n\t\t\"name\": \"Digital Learning Adviser\",\n\t\t\"desc\": \"This account is for organisational users that will support their organisation.\",\n\t\t\"exclusivity\": [\"main\"],\n\t\t\"trancheRole\": true,\n\t\t\"permissions\": [\n\t\t\t\"api.apps.version.post\",\n\t\t\t\"api.annotations.*\",\n\t\t\t\"api.attachments.*\",\n\t\t\t\"api.attendance.*\",\n\t\t\t\"api.analytics.cam.*\",\n\t\t\t\"api.calendar.*\",\n\t\t\t\"api.devices.bindings.*\",\n\t\t\t\"api.data.changelogs.*\",\n\t\t\t\"api.epubs.get\",\n\t\t\t\"api.epubs.put\",\n\t\t\t\"api.epubs._.*\",\n\t\t\t\"api.epubs.bulk.*\",\n\t\t\t\"api.epubs.lists.*\",\n\t\t\t\"api.groups.custom.*\",\n\t\t\t\"api.groups.get\",\n\t\t\t\"api.groups.post\",\n\t\t\t\"api.groups.put\",\n\t\t\t\"api.groups.delete\",\n\t\t\t\"api.groups.lists.*\",\n\t\t\t\"api.groups.manager.clone.get\",\n\t\t\t\"api.groups.manager.custom.*\",\n\t\t\t\"api.groups.manager.put\",\n\t\t\t\"api.highlights.*\",\n\t\t\t\"api.highlights2.*\",\n\t\t\t\"api.netch.*\",\n\t\t\t\"api.newsletter.*\",\n\t\t\t\"api.reports.*\",\n\t\t\t\"api.resources.*\",\n\t\t\t\"api.stats.*\",\n\t\t\t\"api.students.get\",\n\t\t\t\"api.subjects.*\",\n\t\t\t\"api.teachers.get\",\n\t\t\t\"api.teachingPlans.*\",\n\t\t\t\"api.tokens.*\",\n\t\t\t\"api.users.get\",\n\t\t\t\"api.users.post\",\n\t\t\t\"api.users.put\",\n\t\t\t\"api.users._.impersonate.get\",\n\t\t\t\"api.users._.exists.get\",\n\t\t\t\"api.users.lists.*\",\n\t\t\t\"api.features.greyLabeling.get\",\n\t\t\t\"api.features.greyLabeling.post\",\n\t\t\t\"api.features.greyLabeling.delete\",\n\t\t\t\"api.services.*\",\n\t\t\t\"api.tags.*\",\n\n\t\t\t\"acacia.groups.*\",\n\t\t\t\"acacia.learningPaths.*\",\n\t\t\t\"acacia.logs.lastUsed.post\",\n\t\t\t\"acacia.pdf._.get\",\n\t\t\t\"acacia.resources.*\",\n\t\t\t\"acacia.tranches.tranche.groups.get\",\n\t\t\t\"acacia.users.assigned.bookOrGroup.get\",\n\t\t\t\"acacia.users._.learningPaths.get\",\n\t\t\t\"acacia.users._.enrolment.get\",\n\t\t\t\"acacia.users._.camGroups.get\",\n\n\t\t\t\"answers\",\n\t\t\t\"attachments.public\",\n\t\t\t\"books.all\",\n\t\t\t\"books.assignAll\",\n\t\t\t\"folders.public\",\n\t\t\t\"frontPageLinks\",\n\t\t\t\"grants.all.publishers\",\n\t\t\t\"groups.all\",\n\t\t\t\"groups.view\",\n\t\t\t\"groups.private\",\n\t\t\t\"impersonate\",\n\t\t\t\"reports.*\",\n\t\t\t\"resources.all\",\n\t\t\t\"resources.public\",\n\t\t\t\"resources.sidebar\",\n\t\t\t\"resources.bulkFetch\",\n\t\t\t\"teachingPlans.all\",\n\t\t\t\"users.add.*\",\n\t\t\t\"!!users.add.superuser\",\n\t\t\t\"!!users.add.admin\",\n\t\t\t\"!!users.add.autoUploader\",\n\t\t\t\"!!users.add.schoolAdmin\",\n\t\t\t\"!!users.add.featureControl\",\n\t\t\t\"users.books.all\",\n\t\t\t\"users.get.all\",\n\t\t\t\"users.update.*\",\n\t\t\t\"!!users.update.superuser\",\n\t\t\t\"!!users.update.admin\",\n\t\t\t\"!!users.update.empathy\",\n\t\t\t\"!!users.update.api\",\n\t\t\t\"!!users.update.system\",\n\t\t\t\"!!users.update.featureControl\",\n\t\t\t\"users.delete.*\",\n\t\t\t\"!!users.delete.superuser\",\n\t\t\t\"!!users.delete.admin\",\n\t\t\t\"!!users.delete.empathy\",\n\t\t\t\"!!users.delete.api\",\n\t\t\t\"!!users.delete.system\",\n\t\t\t\"!!users.delete.featureControl\",\n\t\t\t\"api.subjects.*\",\n\t\t\t\"help\",\n\t\t\t\"professionalDevelopment\"\n\t\t]\n\t},\n\n\t\"corporate\": {\n\t\t\"name\": \"Corporate DLA\",\n\t\t\"desc\": \"This account has almost complete access to all EC functions.\",\n\t\t\"exclusivity\": [\"main\"],\n\t\t\"permissions\": [\n\t\t\t\"api.apk.post\",\n\t\t\t\"api.apps.version.post\",\n\t\t\t\"api.annotations.*\",\n\t\t\t\"api.assessments.*\",\n\t\t\t\"api.attachments.*\",\n\t\t\t\"api.attendance.*\",\n\t\t\t\"api.analytics.cam.*\",\n\t\t\t\"api.books.*\",\n\t\t\t\"api.calendar.*\",\n\t\t\t\"api.data.*\",\n\t\t\t\"api.devices.bindings.*\",\n\t\t\t\"api.epubs.*\",\n\t\t\t\"api.empathy.books.choices.manual.post\",\n\t\t\t\"api.empathy.books.keys.manual.post\",\n\t\t\t\"api.features.get\",\n\t\t\t\"api.features.post\",\n\t\t\t\"api.features.greyLabeling.get\",\n\t\t\t\"api.features.greyLabeling.post\",\n\t\t\t\"api.features.greyLabeling.delete\",\n\t\t\t\"api.groups.*\",\n\t\t\t\"api.highlights.*\",\n\t\t\t\"api.highlights2.*\",\n\t\t\t\"api.ios.version.post\",\n\t\t\t\"api.netch.*\",\n\t\t\t\"api.newsletter.*\",\n\t\t\t\"api.passwords.temporary.*\",\n\t\t\t\"api.reports.*\",\n\t\t\t\"api.resources.*\",\n\t\t\t\"api.services.*\",\n\t\t\t\"api.stats.*\",\n\t\t\t\"api.students.*\",\n\t\t\t\"api.tags.*\",\n\t\t\t\"api.teachers.*\",\n\t\t\t\"api.teachingPlans.*\",\n\t\t\t\"api.tokens.*\",\n\t\t\t\"api.tools.*\",\n\t\t\t\"api.users.*\",\n\t\t\t\"api.windows.version.post\",\n\t\t\t\"api.windows81.version.post\",\n\n\t\t\t\"acacia.calendar.*\",\n\t\t\t\"acacia.epub.*\",\n\t\t\t\"acacia.groups.*\",\n\t\t\t\"acacia.pdf._.get\",\n\t\t\t\"acacia.learningPaths.*\",\n\t\t\t\"acacia.logs.*\",\n\t\t\t\"acacia.resources.*\",\n\t\t\t\"acacia.users.*\",\n\t\t\t\"acacia.books.book.pages.get\",\n\t\t\t\"acacia.books.book.cam.stats.get\",\n\n\t\t\t\"attendance.all\",\n\t\t\t\"attendance.register.create\",\n\t\t\t\"attendance.register.modify\",\n\t\t\t\"attendance.register.view\",\n\n\t\t\t\"answers\",\n\t\t\t\"attachments.public\",\n\t\t\t\"books.all\",\n\t\t\t\"books.assignAll\",\n\t\t\t\"books.printOverride\",\n\t\t\t\"books.ui-download\",\n\t\t\t\"calendar.all\",\n\t\t\t\"calendar.groups.*\",\n\t\t\t\"cam\",\n\t\t\t\"lessons\",\n\t\t\t\"data.*\",\n\t\t\t\"educatorview.*\",\n\t\t\t\"!featureControl.*\",\n\t\t\t\"+featureControl.serverName\",\n\t\t\t\"+featureControl.schoolDescriptor1\",\n\t\t\t\"+featureControl.schoolDescriptor2\",\n\t\t\t\"+featureControl.schoolDescriptor3\",\n\t\t\t\"+featureControl.annualContent\",\n\t\t\t\"+featureControl.perpetualGroups\",\n\t\t\t\"+featureControl.learningPathsCustomName\",\n\t\t\t\"+featureControl.groupsCustomName\",\n\t\t\t\"+featureControl.learningPathsPluralCustomName\",\n\t\t\t\"+featureControl.groupsPluralCustomName\",\n\t\t\t\"folders.public\",\n\t\t\t\"frontPageLinks\",\n\t\t\t\"impersonate\",\n\t\t\t\"imports.*\",\n\t\t\t\"grants.all.*\",\n\t\t\t\"groups.*\",\n\t\t\t\"!!groups.customGroups.owner\",\n\t\t\t\"learningPaths.steal\",\n\t\t\t\"learningPaths.canEdit\",\n\t\t\t\"reports.*\",\n\t\t\t\"resources.all\",\n\t\t\t\"resources.public\",\n\t\t\t\"resources.sidebar\",\n\t\t\t\"resources.view\",\n\t\t\t\"resources.bulkFetch\",\n\t\t\t\"roleViewer\",\n\t\t\t\"services.all\",\n\t\t\t\"teachingPlans.all\",\n\t\t\t\"temporaryPasswords\",\n\t\t\t\"users.add.*\",\n\t\t\t\"!!users.add.superuser\",\n\t\t\t\"!!users.add.admin\",\n\t\t\t\"!!users.add.featureControl\",\n\t\t\t\"users.books.all\",\n\t\t\t\"users.enrolment.all\",\n\t\t\t\"users.tokens.all\",\n\t\t\t\"users.get.all\",\n\t\t\t\"users.update.*\",\n\t\t\t\"!!users.update.superuser\",\n\t\t\t\"!!users.update.empathy\",\n\t\t\t\"!!users.update.api\",\n\t\t\t\"!!users.update.system\",\n\t\t\t\"!!users.update.featureControl\",\n\t\t\t\"users.delete.*\",\n\t\t\t\"!!users.delete.superuser\",\n\t\t\t\"!!users.delete.empathy\",\n\t\t\t\"!!users.delete.api\",\n\t\t\t\"!!users.delete.system\",\n\t\t\t\"!!users.delete.featureControl\",\n\t\t\t\"api.subjects.*\",\n\t\t\t\"help\",\n\t\t\t\"professionalDevelopment\"\n\t\t]\n\t},\n\n\t\"teacher\": {\n\t\t\"name\": \"Educator\",\n\t\t\"exclusivity\": [\"main\"],\n\t\t\"hasGroups\": true,\n\t\t\"trancheRole\": true,\n\t\t\"permissions\": [\n\t\t\t\"api.annotations.*\",\n\t\t\t\"api.assessments.*\",\n\t\t\t\"api.attachments.*\",\n\t\t\t\"api.attendance.*\",\n\t\t\t\"api.analytics.cam.*\",\n\t\t\t\"api.calendar.*\",\n\t\t\t\"api.epubs.get\",\n\t\t\t\"api.epubs._.*\",\n\t\t\t\"api.epubs.choices.get\",\n\t\t\t\"api.epubs.bulk.*\",\n\t\t\t\"api.groups.get\",\n\t\t\t\"api.groups.custom.*\",\n\t\t\t\"api.groups.manager.clone.get\",\n\t\t\t\"api.groups.manager.custom.*\",\n\t\t\t\"api.groups.manager.put\",\n\t\t\t\"api.groups.lists.*\",\n\t\t\t\"api.groups.token.post\",\n\t\t\t\"api.highlights.*\",\n\t\t\t\"api.highlights2.*\",\n\t\t\t\"api.netch.*\",\n\t\t\t\"api.reports.*\",\n\t\t\t\"api.resources.*\",\n\t\t\t\"api.students.get\",\n\t\t\t\"api.teachingPlans.*\",\n\t\t\t\"api.users.get\",\n\t\t\t\"api.users.lists.*\",\n\t\t\t\"api.users._.*\",\n\n\t\t\t\"api.devices._.bindings.get\",\n\t\t\t\"api.attachments.post\",\n\t\t\t\"api.attachments.put\",\n\t\t\t\"api.attachments.delete\",\n\t\t\t\"api.epubs.files.*\",\n\t\t\t\"api.epubs._.file.get\",\n\t\t\t\"api.resources.post\",\n\t\t\t\"api.resources.put\",\n\t\t\t\"api.resources.delete\",\n\t\t\t\"api.users._.books.get\",\n\t\t\t\"api.users._.books.groups.get\",\n\t\t\t\"api.users._.enrolment.get\",\n\t\t\t\"api.users._.tokens.*\",\n\t\t\t\"api.users._.content.*\",\n\t\t\t\"api.tags.*\",\n\n\t\t\t\"acacia.calendar.*\",\n\t\t\t\"acacia.epub.create._.get\",\n\t\t\t\"acacia.epub.files.*\",\n\t\t\t\"acacia.epub.toc.*\",\n\t\t\t\"acacia.learningPaths.*\",\n\t\t\t\"acacia.logs.lastUsed.post\",\n\t\t\t\"acacia.pdf._.get\",\n\t\t\t\"acacia.resources.*\",\n\t\t\t\"acacia.users._.learningPaths.get\",\n\t\t\t\"acacia.users._.enrolment.get\",\n\t\t\t\"acacia.users._.camGroups.get\",\n\t\t\t\"acacia.users.assigned.bookOrGroup.get\",\n\t\t\t\"acacia.books.book.pages.get\",\n\t\t\t\"acacia.books.book.cam.stats.get\",\n\n\t\t\t\"attendance.register.create\",\n\t\t\t\"attendance.register.modify\",\n\t\t\t\"attendance.register.view\",\n\n\t\t\t\"attachments.public\",\n\t\t\t\"answers\",\n\t\t\t\"calendar.groups.teacher\",\n\t\t\t\"cam\",\n\t\t\t\"lessons\",\n\t\t\t\"learningPaths.canEdit\",\n\t\t\t\"educatorControl\",\n\t\t\t\"educatorview.*\",\n\t\t\t\"folders.public\",\n\t\t\t\"frontPageLinks\",\n\t\t\t\"groups.private\",\n\t\t\t\"groups.view\",\n\t\t\t\"groups.customGroups.owner\",\n\t\t\t\"reports.resourcesCreated\",\n\t\t\t\"reports.resourcesUsed\",\n\t\t\t\"resources.public\",\n\t\t\t\"resources.sidebar\",\n\t\t\t\"resources.bulkFetch\",\n\t\t\t\"resources.view\",\n\t\t\t\"users.get.student\",\n\t\t\t\"api.subjects.get\",\n\t\t\t\"help\",\n\t\t\t\"professionalDevelopment\"\n\t\t]\n\t},\n\n\t\"student\": {\n\t\t\"name\": \"Student\",\n\t\t\"exclusivity\": [\"main\"],\n\t\t\"hasGroups\": true,\n\t\t\"trancheRole\": true,\n\t\t\"permissions\": [\n\t\t\t\"api.annotations.*\",\n\t\t\t\"api.assessments._.marks._.post\",\n\t\t\t\"api.attachments.get\",\n\t\t\t\"api.calendar.events.since._.get\",\n\t\t\t\"api.calendar.since._.get\",\n\t\t\t\"api.data.adminSubjects.get\",\n\t\t\t\"api.elibrary.*\",\n\t\t\t\"api.epubs._.*\",\n\t\t\t\"api.epubs.bulk.*\",\n\t\t\t\"api.epubs.files.get\",\n\t\t\t\"!!api.epubs.choices.*\",\n\t\t\t\"api.groups.token.post\",\n\t\t\t\"api.highlights.*\",\n\t\t\t\"api.highlights2.*\",\n\t\t\t\"api.netch.*\",\n\t\t\t\"api.resources._.*\",\n\t\t\t\"api.resources.get\",\n\t\t\t\"api.users._.*\",\n\n\t\t\t\"api.devices._.bindings.get\",\n\t\t\t\"api.attachments.post\",\n\t\t\t\"api.attachments.put\",\n\t\t\t\"api.attachments.delete\",\n\t\t\t\"api.epubs.files.*\",\n\t\t\t\"api.epubs._.file.get\",\n\t\t\t\"api.resources.post\",\n\t\t\t\"api.resources.put\",\n\t\t\t\"api.resources.delete\",\n\t\t\t\"api.users._.books.get\",\n\t\t\t\"api.users._.books.groups.get\",\n\t\t\t\"api.users._.enrolment.get\",\n\t\t\t\"api.users._.tokens.*\",\n\n\t\t\t\"calendar.groups.student\",\n\t\t\t\"api.assessments.student.get\",\n\t\t\t\"api.assessments._.marks._.report.get\",\n\n\t\t\t\"!help\"\n\t\t]\n\t},\n\n\t\"leaver\": {\n\t\t\"name\": \"Leaver\",\n\t\t\"exclusivity\": [\"main\"],\n\t\t\"hasGroups\": true,\n\t\t\"permissions\": [\n\t\t\t\"api.annotations.*\",\n\t\t\t\"api.assessments._.marks._.post\",\n\t\t\t\"api.attachments.get\",\n\t\t\t\"api.calendar.events.since._.get\",\n\t\t\t\"api.calendar.since._.get\",\n\t\t\t\"api.epubs._.*\",\n\t\t\t\"!!api.epubs.choices.*\",\n\t\t\t\"api.epubs.bulk.*\",\n\t\t\t\"api.epubs.files.get\",\n\t\t\t\"api.highlights.*\",\n\t\t\t\"api.highlights2.*\",\n\t\t\t\"api.netch.*\",\n\t\t\t\"api.resources._.*\",\n\t\t\t\"api.resources.get\",\n\t\t\t\"api.users._.*\",\n\n\t\t\t\"api.devices._.bindings.get\",\n\t\t\t\"api.attachments.post\",\n\t\t\t\"api.attachments.put\",\n\t\t\t\"api.attachments.delete\",\n\t\t\t\"api.epubs.files.*\",\n\t\t\t\"api.epubs._.file.get\",\n\t\t\t\"api.resources.post\",\n\t\t\t\"api.resources.put\",\n\t\t\t\"api.resources.delete\",\n\t\t\t\"api.users._.books.get\",\n\t\t\t\"api.users._.books.groups.get\",\n\t\t\t\"api.users._.enrolment.get\",\n\t\t\t\"api.users._.tokens.*\"\n\t\t]\n\t},\n\n\t\"facilitator\": {\n\t\t\"name\": \"Facilitator\",\n\t\t\"exclusivity\": [\"main\"],\n\t\t\"hasGroups\": true,\n\t\t\"trancheRole\": true,\n\t\t\"permissions\": [\n\t\t\t\"api.annotations.*\",\n\t\t\t\"api.assessments.get\",\n\t\t\t\"api.assessments._.marks._.get\",\n\t\t\t\"api.assessments._.marks._.post\",\n\t\t\t\"api.assessments.group\",\n\t\t\t\"api.assessments.student.get\",\n\t\t\t\"api.assessments._.marks._.report.get\",\n\t\t\t\"api.attachments.*\",\n\t\t\t\"!!api.attachments.post\",\n\t\t\t\"!!api.attachments.put\",\n\t\t\t\"!!api.attachments._.put\",\n\t\t\t\"!!api.attachments.patch\",\n\t\t\t\"!!api.attachments._patch\",\n\t\t\t\"!!api.attachments.delete\",\n\t\t\t\"!!api.attachments._delete\",\n\t\t\t\"api.attendance.get\",\n\t\t\t\"api.attendance.records.byGroup._.get\",\n\t\t\t\"api.attendance.records.byRegister._.get\",\n\t\t\t\"api.attendance.records.put\",\n\t\t\t\"api.attendance.registers.batchMark.put\",\n\t\t\t\"api.attendance.registers.byGroup._.get\",\n\t\t\t\"api.attendance.registers.delete\",\n\t\t\t\"api.attendance.registers.get\",\n\t\t\t\"api.attendance.registers.post\",\n\t\t\t\"acacia.calendar.audience._.get\",\n\t\t\t\"api.calendar.events.delete\",\n\t\t\t\"api.calendar.events.post\",\n\t\t\t\"api.calendar.events.put\",\n\t\t\t\"api.calendar.events.since._.get\",\n\t\t\t\"api.calendar.since._.get\",\n\n\t\t\t\"api.epubs._.*\",\n\t\t\t\"!!api.epubs.choices.get\",\n\t\t\t\"api.epubs.bulk.*\",\n\t\t\t\"api.groups.custom.*\",\n\t\t\t\"api.groups.manager._._.get\",\n\t\t\t\"api.groups.get\",\n\t\t\t\"api.groups.token.post\",\n\t\t\t\"api.highlights.*\",\n\t\t\t\"api.highlights2.*\",\n\t\t\t\"api.groups.manager.put\",\n\t\t\t\"!!api.groups._.users.delete\",\n\t\t\t\"!!api.groups._.users.put\",\n\t\t\t\"api.groups.manager.clone.get\",\n\t\t\t\"api.netch.*\",\n\t\t\t\"api.resources.*\",\n\t\t\t\"api.students.get\",\n\t\t\t\"api.users.get\",\n\t\t\t\"api.users._.*\",\n\n\t\t\t\"api.devices._.bindings.get\",\n\t\t\t\"api.epubs.files.*\",\n\t\t\t\"api.epubs._.file.get\",\n\t\t\t\"api.users._.books.get\",\n\t\t\t\"api.users._.books.groups.get\",\n\t\t\t\"api.users._.enrolment.get\",\n\t\t\t\"api.users._.groups._.custom.get\",\n\t\t\t\"api.users._.learningPaths.get\",\n\t\t\t\"api.users._.content.*\",\n\t\t\t\"api.users._.tokens.*\",\n\n\t\t\t\"acacia.calendar.audience.get\",\n\t\t\t\"acacia.calendar.events._._.get\",\n\t\t\t\"acacia.calendar.locations.get\",\n\t\t\t\"acacia.calendar.tags.get\",\n\t\t\t\"acacia.epub.create._.get\",\n\t\t\t\"acacia.epub.files.*\",\n\t\t\t\"acacia.epub.toc.*\",\n\t\t\t\"acacia.groups._.memberParents.get\",\n\t\t\t\"acacia.learningPaths._.users._.pathState.get\",\n\t\t\t\"acacia.learningPaths.get\",\n\t\t\t\"acacia.learningPaths.items.get\",\n\t\t\t\"acacia.learningPaths.items._.getBookPageLink.get\",\n\t\t\t\"acacia.learningPaths.items._.state.put\",\n\t\t\t\"acacia.learningPaths._.users.get\",\n\t\t\t\"acacia.learningPaths.structure.get\",\n\t\t\t\"acacia.learningPaths.resources.get\",\n\n\t\t\t\"acacia.logs.lastUsed.post\",\n\t\t\t\"acacia.pdf._.get\",\n\t\t\t\"acacia.resources.*\",\n\t\t\t\"acacia.users._.enrolment.get\",\n\t\t\t\"acacia.users._.learningPaths.get\",\n\n\t\t\t\"attendance.register.create\",\n\t\t\t\"attendance.register.modify\",\n\t\t\t\"educatorview.books\",\n\t\t\t\"educatorview.learningPaths\",\n\t\t\t\"frontPageLinks\",\n\t\t\t\"groups.private\",\n\t\t\t\"groups.view\",\n\t\t\t\"groups.customGroups.owner\",\n\t\t\t\"lessons\",\n\t\t\t\"professionalDevelopment\",\n\t\t\t\"resources.bulkFetch\",\n\t\t\t\"resources.view\",\n\t\t\t\"resources.public\",\n\t\t\t\"users.get.all\",\n\t\t\t\"calendar.groups.teacher\",\n\n\t\t\t\"api.subjects.get\",\n\t\t\t\"help\",\n\t\t\t\"answers\",\n\t\t\t\"cam\"\n\t\t]\n\t},\n\n\t\"viewer\": {\n\t\t\"name\": \"Viewer\",\n\t\t\"permissions\": [\n\t\t\t\"!api.epubs.files.*\",\n\t\t\t\"!api.epubs._.file.get\",\n\t\t\t\"!api.epubs._.cover.get\",\n\t\t\t\"api.epubs.get\",\n\t\t\t\"api.epubs.lists.*\",\n\t\t\t\"api.groups.get\",\n\t\t\t\"api.reports.*\",\n\t\t\t\"api.resources.assessments.get\",\n\t\t\t\"api.resources.get\",\n\t\t\t\"api.users.get\",\n\t\t\t\"api.users.lists.*\",\n\t\t\t\"!api.users._.books.get\",\n\n\t\t\t\"answers\",\n\t\t\t\"books.all\",\n\t\t\t\"books.view\",\n\t\t\t\"grants.all.publishers\",\n\t\t\t\"groups.all\",\n\t\t\t\"groups.view\",\n\t\t\t\"resources.all\",\n\t\t\t\"resources.bulkFetch\",\n\t\t\t\"resources.view\",\n\t\t\t\"users.get.all\",\n\t\t\t\"help\"\n\t\t]\n\t},\n\n\t\"curricuview\": {\n\t\t\"name\": \"Curriculum Viewer\",\n\t\t\"exclusivity\": [\"main\"],\n\t\t\"permissions\": [\n\t\t\t\"api.epubs.get\",\n\t\t\t\"api.epubs.lists.*\",\n\t\t\t\"api.groups.get\",\n\t\t\t\"api.reports.*\",\n\t\t\t\"api.resources.assessments.get\",\n\t\t\t\"api.resources.get\",\n\t\t\t\"api.teachingPlans.get\",\n\t\t\t\"api.users.get\",\n\t\t\t\"api.users.lists.*\",\n\n\t\t\t\"acacia.epub.create._.get\",\n\t\t\t\"acacia.epub.files.*\",\n\t\t\t\"acacia.epub.toc.*\",\n\t\t\t\"acacia.pdf._.get\",\n\n\t\t\t\"answers\",\n\t\t\t\"books.all\",\n\t\t\t\"books.view\",\n\t\t\t\"educatorview.books\",\n\t\t\t\"grants.all.publishers\",\n\t\t\t\"groups.all\",\n\t\t\t\"groups.view\",\n\t\t\t\"resources.all\",\n\t\t\t\"resources.bulkFetch\",\n\t\t\t\"resources.view\",\n\t\t\t\"users.get.all\"\n\t\t]\n\t},\n\n\t\"sales\": {\n\t\t\"name\": \"Salesperson\",\n\t\t\"permissions\": [\n\t\t\t\"!api.epubs.files.*\",\n\t\t\t\"!api.epubs._.file.get\",\n\t\t\t\"!api.epubs._.cover.get\",\n\t\t\t\"api.epubs.get\",\n\t\t\t\"api.epubs.lists.*\",\n\t\t\t\"api.groups.get\",\n\t\t\t\"api.groups.lists.*\",\n\t\t\t\"api.reports.*\",\n\t\t\t\"api.resources.assessments.get\",\n\t\t\t\"api.resources.get\",\n\t\t\t\"api.users.get\",\n\t\t\t\"api.users.lists.*\",\n\t\t\t\"!api.users._.books.get\",\n\n\t\t\t\"answers\",\n\t\t\t\"attachments.public\",\n\t\t\t\"books.all\",\n\t\t\t\"books.view\",\n\t\t\t\"cam\",\n\t\t\t\"lessons\",\n\t\t\t\"grants.all.publishers\",\n\t\t\t\"groups.all\",\n\t\t\t\"groups.view\",\n\t\t\t\"resources.all\",\n\t\t\t\"resources.bulkFetch\",\n\t\t\t\"resources.public\",\n\t\t\t\"resources.sidebar\",\n\t\t\t\"resources.view\",\n\t\t\t\"users.get.all\",\n\t\t\t\"help\",\n\t\t\t\"professionalDevelopment\"\n\t\t]\n\t},\n\n\t\"assistant\": {\n\t\t\"name\": \"Assistant\",\n\t\t\"permissions\": [\n\t\t\t\"api.epubs.get\",\n\t\t\t\"api.epubs.lists.*\",\n\t\t\t\"api.groups.get\",\n\t\t\t\"api.groups.lists.*\",\n\t\t\t\"api.reports.*\",\n\t\t\t\"api.users.get\",\n\t\t\t\"api.users._.impersonate.get\",\n\t\t\t\"api.users.put\",\n\t\t\t\"api.users.lists.*\",\n\n\t\t\t\"answers\",\n\t\t\t\"books.all\",\n\t\t\t\"books.view\",\n\t\t\t\"grants.all.publishers\",\n\t\t\t\"groups.all\",\n\t\t\t\"groups.view\",\n\t\t\t\"impersonate\",\n\t\t\t\"reports.*\",\n\t\t\t\"roleViewer\",\n\t\t\t\"users.get.all\",\n\t\t\t\"users.books.all\",\n\t\t\t\"users.update.*\",\n\t\t\t\"!!users.update.superuser\",\n\t\t\t\"!!users.update.admin\",\n\t\t\t\"!!users.update.empathy\",\n\t\t\t\"!!users.update.api\",\n\t\t\t\"!!users.update.system\",\n\t\t\t\"!!users.update.assistant\",\n\t\t\t\"help\"\n\t\t]\n\t},\n\n\t\"newsletterAdmin\": {\n\t\t\"name\": \"Newsletter Admin (+)\",\n\t\t\"permissions\": [\n\t\t\t\"api.newsletter.post\"\n\t\t]\n\t},\n\n\t\"calendarAdmin\": {\n\t\t\"name\": \"Calendar Admin (+)\",\n\t\t\"permissions\": [\n\t\t\t\"api.calendar.*\",\n\n\t\t\t\"calendar.all\",\n\t\t\t\"acacia.calendar.*\"\n\t\t]\n\t},\n\n\t\"bindingAdmin\": {\n\t\t\"name\": \"Device Binding Admin (+)\",\n\t\t\"permissions\": [\n\t\t\t\"api.devices.bindings.*\"\n\t\t]\n\t},\n\n\t\"restrictor\": {\n\t\t\"name\": \"Restrictor (+)\",\n\t\t\"permissions\": [\n\t\t\t\"api.users.get\",\n\t\t\t\"api.tools.restrictAllStudents.*\",\n\t\t\t\"api.tools.restrictSomeStudents.*\",\n\t\t\t\"api.tools.unrestrictSomeUsers.*\",\n\n\t\t\t\"users.get.student\"\n\t\t]\n\t},\n\n\t\"uploader\": {\n\t\t\"name\": \"Book Uploader (+)\",\n\t\t\"permissions\": [\n\t\t\t\"api.data.publishers.name.get\",\n\t\t\t\"api.epubs.get\",\n\t\t\t\"api.epubs.post\",\n\t\t\t\"api.groups.get\",\n\n\t\t\t\"grants.main.publishers\"\n\t\t]\n\t},\n\n\t\"bookManager\": {\n\t\t\"name\": \"Book Manager (+)\",\n\t\t\"permissions\": [\n\t\t\t\"api.data.publishers.name.get\",\n\t\t\t\"api.epubs.get\",\n\t\t\t\"api.epubs.post\",\n\t\t\t\"api.epubs.put\",\n\t\t\t\"api.epubs.delete\",\n\t\t\t\"api.epubs.lists.*\",\n\t\t\t\"api.users._.enrolment.get\",\n\n\t\t\t\"!books.assignGroups\",\n\n\t\t\t\"grants.main.publishers\"\n\t\t]\n\t},\n\n\t\"parent\": {\n\t\t\"name\": \"Parent (+)\",\n\t\t\"permissions\": [\n\t\t\t\"api.assessments._.marks._.post\",\n\t\t\t\"api.attachments.get\",\n\t\t\t\"api.epubs.bulk.*\",\n\t\t\t\"api.epubs.book.*\",\n\t\t\t\"api.epubs.files.get\",\n\t\t\t\"api.users.user.*\",\n\n\t\t\t\"grants.main.parents\"\n\t\t]\n\t},\n\n\t\"hod\": {\n\t\t\"name\": \"Head of Department (+)\",\n\t\t\"permissions\": [\n\t\t\t\"grants.main.hods\",\n\t\t\t\"api.assessments.*\",\n\t\t\t\"api.groups.*\",\n\t\t\t\"groups.private\"\n\t\t]\n\t},\n\n\t\"empathy\": {\n\t\t\"name\": \"Empathy API\",\n\t\t\"permissions\": [\n\t\t\t\"api.empathy.*\",\n\t\t\t\"api.elibrary.logo.post\",\n\t\t\t\"api.users.post\",\n\t\t\t\"api.users.put\",\n\t\t\t\"api.users.delete\",\n\n\t\t\t\"users.add.anywhere\",\n\t\t\t\"users.update.anywhere\",\n\t\t\t\"users.delete.anywhere\",\n\t\t\t\"services.all\",\n\t\t\t\"sessions.disable\"\n\t\t]\n\t},\n\n\t\"api\": {\n\t\t\"name\": \"Hermes API\",\n\t\t\"permissions\": [\n\t\t\t\"api.marks.post\",\n\t\t\t\"api.groups.*\",\n\t\t\t\"api.students.*\",\n\t\t\t\"api.teachers.*\",\n\t\t\t\"groups.*\",\n\t\t\t\"!!groups.customGroups.owner\",\n\t\t\t\"sessions.disable\",\n\n\t\t\t\"api.books.get\",\n\t\t\t\"api.books.latest.get\"\n\t\t]\n\t},\n\n\t\"system\": {\n\t\t\"name\": \"System API\",\n\t\t\"permissions\": [\n\t\t\t\"api.books.get\",\n\t\t\t\"api.books.latest.get\",\n\n\t\t\t\"api.analytics.*\",\n\t\t\t\"api.data.*\",\n\t\t\t\"api.epubs.*\",\n\t\t\t\"api.groups.*\",\n\t\t\t\"api.reports.*\",\n\t\t\t\"api.stats.*\",\n\t\t\t\"api.students.*\",\n\t\t\t\"api.teachers.*\",\n\t\t\t\"api.tokens.tranches.lists.*\",\n\t\t\t\"api.tokens.tranches.licenses.lists.*\",\n\t\t\t\"api.tokens.report.*\",\n\t\t\t\"api.users.*\",\n\t\t\t\"api.web.*\",\n\n\t\t\t\"books.all\",\n\t\t\t\"groups.*\",\n\t\t\t\"!!groups.customGroups.owner\",\n\t\t\t\"sessions.disable\"\n\t\t]\n\t},\n\n\t\"autoUploader\": {\n\t\t\"name\": \"Book Upload API\",\n\t\t\"permissions\": [\n\t\t\t\"api.epubs.get\",\n\t\t\t\"api.epubs.post\",\n\t\t\t\"api.epubs.put\",\n\t\t\t\"api.epubs.delete\",\n\t\t\t\"api.epubs.choices.get\",\n\n\t\t\t\"books.all\",\n\n\t\t\t\"grants.all.publishers\",\n\t\t\t\"sessions.disable\"\n\t\t]\n\t},\n\n\t\"userEditor\": {\n\t\t\"name\": \"User Editor (+)\",\n\t\t\"permissions\": [\n\t\t\t\"api.users.get\",\n\t\t\t\"api.users.put\",\n\t\t\t\"api.users._.exists.get\",\n\n\t\t\t\"users.update.*\"\n\t\t]\n\t},\n\n\t\"featureControl\": {\n\t\t\"name\": \"Feature Controller (+)\",\n\t\t\"permissions\": [\n\t\t\t\"api.features.get\",\n\t\t\t\"api.features.post\",\n\n\t\t\t\"+featureControl.*\"\n\t\t]\n\t},\n\n\t\"anywhere\": {\n\t\t\"name\": \"ITSI Anywhere\",\n\t\t\"hasGroups\": true,\n\t\t\"permissions\": [\n\t\t\t\"api.annotations.*\",\n\t\t\t\"api.assessments._.marks._.post\",\n\t\t\t\"api.attachments.get\",\n\t\t\t\"api.calendar.events.since._.get\",\n\t\t\t\"api.calendar.since._.get\",\n\t\t\t\"api.epubs._.*\",\n\t\t\t\"!!api.epubs.choices.*\",\n\t\t\t\"api.epubs.bulk.*\",\n\t\t\t\"api.epubs.files.get\",\n\t\t\t\"api.groups.token.post\",\n\t\t\t\"api.highlights.*\",\n\t\t\t\"api.highlights2.*\",\n\t\t\t\"api.netch.*\",\n\t\t\t\"api.resources._.*\",\n\t\t\t\"api.resources.get\",\n\t\t\t\"api.users._.*\",\n\n\t\t\t\"api.devices._.bindings.get\",\n\t\t\t\"api.attachments.post\",\n\t\t\t\"api.attachments.put\",\n\t\t\t\"api.attachments.delete\",\n\t\t\t\"api.epubs.files.*\",\n\t\t\t\"api.epubs._.file.get\",\n\t\t\t\"api.resources.post\",\n\t\t\t\"api.resources.put\",\n\t\t\t\"api.resources.delete\",\n\t\t\t\"api.users._.books.get\",\n\t\t\t\"api.users._.books.groups.get\",\n\t\t\t\"api.users._.enrolment.get\",\n\t\t\t\"api.users._.tokens.*\"\n\t\t]\n\t},\n\n\t\"fcBlock\": {\n\t\t\"name\": \"FC Permission Blocker\",\n\t\t\"hasGroups\": false,\n\t\t\"permissions\": [\n\t\t\t\"!!api.epubs.get\",\n\t\t\t\"!!api.epubs.post\",\n\t\t\t\"!!api.epubs._.put\",\n\t\t\t\"!!api.epubs.delete\",\n\t\t\t\"!!api.epubs.lists.*\",\n\t\t\t\"!!api.epubs.put\",\n\t\t\t\"!!api.groups.post\",\n\t\t\t\"!!api.groups.put\",\n\t\t\t\"!!api.groups.delete\",\n\t\t\t\"!!api.groups.custom.upgrade.*\",\n\t\t\t\"!!api.groups.group.students.put\",\n\t\t\t\"!!api.groups.group.students.delete\",\n\t\t\t\"!!api.groups.group.teachers.put\",\n\t\t\t\"!!api.groups.group.teachers.delete\",\n\t\t\t\"!!api.groups.group.users.put\",\n\t\t\t\"!!api.groups.group.users.delete\",\n\t\t\t\"!!api.tokens.tranches.activation.*\",\n\t\t\t\"!!api.tokens.tranches.licenses.delete\",\n\t\t\t\"!!api.tokens.tranches.licenses.license.assign.*\",\n\t\t\t\"!!api.tokens.tranches.licenses.license.transfer.*\",\n\t\t\t\"!!api.tokens.tranches.tranche.groups.*\",\n\n\n\t\t\t\"!!users.add.*\",\n\t\t\t\"!!users.update.*\",\n\t\t\t\"!!users.delete.*\",\n\n\t\t\t\"!!tranches.deactivate\"\n\t\t]\n\t},\n\n\t\"elibraryBlock\": {\n\t\t\"name\": \"E-Library Permission Blocker\",\n\t\t\"permissions\": [\n\t\t\t\"!!api.elibrary.*\"\n\t\t]\n\t}\n}",
    "\"use strict\";\n\nmodule.exports = {\n\tATTENDANCE_STATUS_ABSENT: 0,\n\tATTENDANCE_STATUS_PRESENT: 1,\n\tATTENDANCE_STATUS_LATE: 2\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImF0dGVuZGFuY2UuanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsIkFUVEVOREFOQ0VfU1RBVFVTX0FCU0VOVCIsIkFUVEVOREFOQ0VfU1RBVFVTX1BSRVNFTlQiLCJBVFRFTkRBTkNFX1NUQVRVU19MQVRFIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQUEsT0FBT0MsT0FBUCxHQUFpQjtBQUNoQkMsMkJBQTBCLENBRFY7QUFFaEJDLDRCQUEyQixDQUZYO0FBR2hCQyx5QkFBd0I7QUFIUixDQUFqQiIsImZpbGUiOiJhdHRlbmRhbmNlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0QVRURU5EQU5DRV9TVEFUVVNfQUJTRU5UOiAwLFxuXHRBVFRFTkRBTkNFX1NUQVRVU19QUkVTRU5UOiAxLFxuXHRBVFRFTkRBTkNFX1NUQVRVU19MQVRFOiAyLFxufTtcbiJdfQ==",
    "\"use strict\";\n// Project the result onto this object\n\nvar x = {};\n\nx.roles = require(\"../../config/roles.json\");\nx.grants = require(\"../../config/grants.json\");\n\nx.languageMap = require(\"../../config/languages.json\");\n\nx.languageList = x.languageMap.map(function (lang) {\n  return lang.local;\n}).sort();\n\nx.gradeList = require(\"../../config/grades.json\");\n\nmodule.exports = x;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNldHRpbmdzLmpzIl0sIm5hbWVzIjpbIngiLCJyb2xlcyIsInJlcXVpcmUiLCJncmFudHMiLCJsYW5ndWFnZU1hcCIsImxhbmd1YWdlTGlzdCIsIm1hcCIsImxhbmciLCJsb2NhbCIsInNvcnQiLCJncmFkZUxpc3QiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUNBLElBQU1BLElBQUksRUFBVjs7QUFFQUEsRUFBRUMsS0FBRixHQUFVQyxRQUFRLHlCQUFSLENBQVY7QUFDQUYsRUFBRUcsTUFBRixHQUFXRCxRQUFRLDBCQUFSLENBQVg7O0FBRUFGLEVBQUVJLFdBQUYsR0FBZ0JGLFFBQVEsNkJBQVIsQ0FBaEI7O0FBRUFGLEVBQUVLLFlBQUYsR0FBaUJMLEVBQUVJLFdBQUYsQ0FBY0UsR0FBZCxDQUFrQjtBQUFBLFNBQVFDLEtBQUtDLEtBQWI7QUFBQSxDQUFsQixFQUFzQ0MsSUFBdEMsRUFBakI7O0FBRUFULEVBQUVVLFNBQUYsR0FBY1IsUUFBUSwwQkFBUixDQUFkOztBQUVBUyxPQUFPQyxPQUFQLEdBQWlCWixDQUFqQiIsImZpbGUiOiJzZXR0aW5ncy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuLy8gUHJvamVjdCB0aGUgcmVzdWx0IG9udG8gdGhpcyBvYmplY3RcbmNvbnN0IHggPSB7fTtcblxueC5yb2xlcyA9IHJlcXVpcmUoXCIuLi8uLi9jb25maWcvcm9sZXMuanNvblwiKTtcbnguZ3JhbnRzID0gcmVxdWlyZShcIi4uLy4uL2NvbmZpZy9ncmFudHMuanNvblwiKTtcblxueC5sYW5ndWFnZU1hcCA9IHJlcXVpcmUoXCIuLi8uLi9jb25maWcvbGFuZ3VhZ2VzLmpzb25cIik7XG5cbngubGFuZ3VhZ2VMaXN0ID0geC5sYW5ndWFnZU1hcC5tYXAobGFuZyA9PiBsYW5nLmxvY2FsKS5zb3J0KCk7XG5cbnguZ3JhZGVMaXN0ID0gcmVxdWlyZShcIi4uLy4uL2NvbmZpZy9ncmFkZXMuanNvblwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSB4OyJdfQ==",
    "module.exports = require(\"regenerator-runtime\");\n",
    "/**\n * @namespace Chart\n */\nvar Chart = require('./core/core.js')();\n\nrequire('./core/core.helpers')(Chart);\nrequire('./platforms/platform.js')(Chart);\nrequire('./core/core.canvasHelpers')(Chart);\nrequire('./core/core.element')(Chart);\nrequire('./core/core.plugin.js')(Chart);\nrequire('./core/core.animation')(Chart);\nrequire('./core/core.controller')(Chart);\nrequire('./core/core.datasetController')(Chart);\nrequire('./core/core.layoutService')(Chart);\nrequire('./core/core.scaleService')(Chart);\nrequire('./core/core.ticks.js')(Chart);\nrequire('./core/core.scale')(Chart);\nrequire('./core/core.interaction')(Chart);\nrequire('./core/core.tooltip')(Chart);\n\nrequire('./elements/element.arc')(Chart);\nrequire('./elements/element.line')(Chart);\nrequire('./elements/element.point')(Chart);\nrequire('./elements/element.rectangle')(Chart);\n\nrequire('./scales/scale.linearbase.js')(Chart);\nrequire('./scales/scale.category')(Chart);\nrequire('./scales/scale.linear')(Chart);\nrequire('./scales/scale.logarithmic')(Chart);\nrequire('./scales/scale.radialLinear')(Chart);\nrequire('./scales/scale.time')(Chart);\n\n// Controllers must be loaded after elements\n// See Chart.core.datasetController.dataElementType\nrequire('./controllers/controller.bar')(Chart);\nrequire('./controllers/controller.bubble')(Chart);\nrequire('./controllers/controller.doughnut')(Chart);\nrequire('./controllers/controller.line')(Chart);\nrequire('./controllers/controller.polarArea')(Chart);\nrequire('./controllers/controller.radar')(Chart);\n\nrequire('./charts/Chart.Bar')(Chart);\nrequire('./charts/Chart.Bubble')(Chart);\nrequire('./charts/Chart.Doughnut')(Chart);\nrequire('./charts/Chart.Line')(Chart);\nrequire('./charts/Chart.PolarArea')(Chart);\nrequire('./charts/Chart.Radar')(Chart);\nrequire('./charts/Chart.Scatter')(Chart);\n\n// Loading built-it plugins\nvar plugins = [];\n\nplugins.push(\n    require('./plugins/plugin.filler.js')(Chart),\n    require('./plugins/plugin.legend.js')(Chart),\n    require('./plugins/plugin.title.js')(Chart)\n);\n\nChart.plugins.register(plugins);\n\nmodule.exports = Chart;\nif (typeof window !== 'undefined') {\n\twindow.Chart = Chart;\n}\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Bar = function(context, config) {\n\t\tconfig.type = 'bar';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Bubble = function(context, config) {\n\t\tconfig.type = 'bubble';\n\t\treturn new Chart(context, config);\n\t};\n\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Doughnut = function(context, config) {\n\t\tconfig.type = 'doughnut';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Line = function(context, config) {\n\t\tconfig.type = 'line';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.PolarArea = function(context, config) {\n\t\tconfig.type = 'polarArea';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tChart.Radar = function(context, config) {\n\t\tconfig.type = 'radar';\n\n\t\treturn new Chart(context, config);\n\t};\n\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar defaultConfig = {\n\t\thover: {\n\t\t\tmode: 'single'\n\t\t},\n\n\t\tscales: {\n\t\t\txAxes: [{\n\t\t\t\ttype: 'linear', // scatter should not use a category axis\n\t\t\t\tposition: 'bottom',\n\t\t\t\tid: 'x-axis-1' // need an ID so datasets can reference the scale\n\t\t\t}],\n\t\t\tyAxes: [{\n\t\t\t\ttype: 'linear',\n\t\t\t\tposition: 'left',\n\t\t\t\tid: 'y-axis-1'\n\t\t\t}]\n\t\t},\n\n\t\ttooltips: {\n\t\t\tcallbacks: {\n\t\t\t\ttitle: function() {\n\t\t\t\t\t// Title doesn't make sense for scatter since we format the data as a point\n\t\t\t\t\treturn '';\n\t\t\t\t},\n\t\t\t\tlabel: function(tooltipItem) {\n\t\t\t\t\treturn '(' + tooltipItem.xLabel + ', ' + tooltipItem.yLabel + ')';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t// Register the default config for this type\n\tChart.defaults.scatter = defaultConfig;\n\n\t// Scatter charts use line controllers\n\tChart.controllers.scatter = Chart.controllers.line;\n\n\tChart.Scatter = function(context, config) {\n\t\tconfig.type = 'scatter';\n\t\treturn new Chart(context, config);\n\t};\n\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.defaults.bar = {\n\t\thover: {\n\t\t\tmode: 'label'\n\t\t},\n\n\t\tscales: {\n\t\t\txAxes: [{\n\t\t\t\ttype: 'category',\n\n\t\t\t\t// Specific to Bar Controller\n\t\t\t\tcategoryPercentage: 0.8,\n\t\t\t\tbarPercentage: 0.9,\n\n\t\t\t\t// grid line settings\n\t\t\t\tgridLines: {\n\t\t\t\t\toffsetGridLines: true\n\t\t\t\t}\n\t\t\t}],\n\t\t\tyAxes: [{\n\t\t\t\ttype: 'linear'\n\t\t\t}]\n\t\t}\n\t};\n\n\tChart.controllers.bar = Chart.DatasetController.extend({\n\n\t\tdataElementType: Chart.elements.Rectangle,\n\n\t\tinitialize: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta;\n\n\t\t\tChart.DatasetController.prototype.initialize.apply(me, arguments);\n\n\t\t\tmeta = me.getMeta();\n\t\t\tmeta.stack = me.getDataset().stack;\n\t\t\tmeta.bar = true;\n\t\t},\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar elements = me.getMeta().data;\n\t\t\tvar i, ilen;\n\n\t\t\tme._ruler = me.getRuler();\n\n\t\t\tfor (i = 0, ilen = elements.length; i < ilen; ++i) {\n\t\t\t\tme.updateElement(elements[i], i, reset);\n\t\t\t}\n\t\t},\n\n\t\tupdateElement: function(rectangle, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar custom = rectangle.custom || {};\n\t\t\tvar rectangleOptions = chart.options.elements.rectangle;\n\n\t\t\trectangle._xScale = me.getScaleForId(meta.xAxisID);\n\t\t\trectangle._yScale = me.getScaleForId(meta.yAxisID);\n\t\t\trectangle._datasetIndex = me.index;\n\t\t\trectangle._index = index;\n\n\t\t\trectangle._model = {\n\t\t\t\tdatasetLabel: dataset.label,\n\t\t\t\tlabel: chart.data.labels[index],\n\t\t\t\tborderSkipped: custom.borderSkipped ? custom.borderSkipped : rectangleOptions.borderSkipped,\n\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, rectangleOptions.backgroundColor),\n\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, rectangleOptions.borderColor),\n\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.borderWidth, index, rectangleOptions.borderWidth)\n\t\t\t};\n\n\t\t\tme.updateElementGeometry(rectangle, index, reset);\n\n\t\t\trectangle.pivot();\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tupdateElementGeometry: function(rectangle, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar model = rectangle._model;\n\t\t\tvar vscale = me.getValueScale();\n\t\t\tvar base = vscale.getBasePixel();\n\t\t\tvar horizontal = vscale.isHorizontal();\n\t\t\tvar ruler = me._ruler || me.getRuler();\n\t\t\tvar vpixels = me.calculateBarValuePixels(me.index, index);\n\t\t\tvar ipixels = me.calculateBarIndexPixels(me.index, index, ruler);\n\n\t\t\tmodel.horizontal = horizontal;\n\t\t\tmodel.base = reset? base : vpixels.base;\n\t\t\tmodel.x = horizontal? reset? base : vpixels.head : ipixels.center;\n\t\t\tmodel.y = horizontal? ipixels.center : reset? base : vpixels.head;\n\t\t\tmodel.height = horizontal? ipixels.size : undefined;\n\t\t\tmodel.width = horizontal? undefined : ipixels.size;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetValueScaleId: function() {\n\t\t\treturn this.getMeta().yAxisID;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetIndexScaleId: function() {\n\t\t\treturn this.getMeta().xAxisID;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetValueScale: function() {\n\t\t\treturn this.getScaleForId(this.getValueScaleId());\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetIndexScale: function() {\n\t\t\treturn this.getScaleForId(this.getIndexScaleId());\n\t\t},\n\n\t\t/**\n\t\t * Returns the effective number of stacks based on groups and bar visibility.\n\t\t * @private\n\t\t */\n\t\tgetStackCount: function(last) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar scale = me.getIndexScale();\n\t\t\tvar stacked = scale.options.stacked;\n\t\t\tvar ilen = last === undefined? chart.data.datasets.length : last + 1;\n\t\t\tvar stacks = [];\n\t\t\tvar i, meta;\n\n\t\t\tfor (i = 0; i < ilen; ++i) {\n\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\tif (meta.bar && chart.isDatasetVisible(i) &&\n\t\t\t\t\t(stacked === false ||\n\t\t\t\t\t(stacked === true && stacks.indexOf(meta.stack) === -1) ||\n\t\t\t\t\t(stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1)))) {\n\t\t\t\t\tstacks.push(meta.stack);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn stacks.length;\n\t\t},\n\n\t\t/**\n\t\t * Returns the stack index for the given dataset based on groups and bar visibility.\n\t\t * @private\n\t\t */\n\t\tgetStackIndex: function(datasetIndex) {\n\t\t\treturn this.getStackCount(datasetIndex) - 1;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetRuler: function() {\n\t\t\tvar me = this;\n\t\t\tvar scale = me.getIndexScale();\n\t\t\tvar options = scale.options;\n\t\t\tvar stackCount = me.getStackCount();\n\t\t\tvar fullSize = scale.isHorizontal()? scale.width : scale.height;\n\t\t\tvar tickSize = fullSize / scale.ticks.length;\n\t\t\tvar categorySize = tickSize * options.categoryPercentage;\n\t\t\tvar fullBarSize = categorySize / stackCount;\n\t\t\tvar barSize = fullBarSize * options.barPercentage;\n\n\t\t\tbarSize = Math.min(\n\t\t\t\thelpers.getValueOrDefault(options.barThickness, barSize),\n\t\t\t\thelpers.getValueOrDefault(options.maxBarThickness, Infinity));\n\n\t\t\treturn {\n\t\t\t\tstackCount: stackCount,\n\t\t\t\ttickSize: tickSize,\n\t\t\t\tcategorySize: categorySize,\n\t\t\t\tcategorySpacing: tickSize - categorySize,\n\t\t\t\tfullBarSize: fullBarSize,\n\t\t\t\tbarSize: barSize,\n\t\t\t\tbarSpacing: fullBarSize - barSize,\n\t\t\t\tscale: scale\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Note: pixel values are not clamped to the scale area.\n\t\t * @private\n\t\t */\n\t\tcalculateBarValuePixels: function(datasetIndex, index) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar scale = me.getValueScale();\n\t\t\tvar datasets = chart.data.datasets;\n\t\t\tvar value = Number(datasets[datasetIndex].data[index]);\n\t\t\tvar stacked = scale.options.stacked;\n\t\t\tvar stack = meta.stack;\n\t\t\tvar start = 0;\n\t\t\tvar i, imeta, ivalue, base, head, size;\n\n\t\t\tif (stacked || (stacked === undefined && stack !== undefined)) {\n\t\t\t\tfor (i = 0; i < datasetIndex; ++i) {\n\t\t\t\t\timeta = chart.getDatasetMeta(i);\n\n\t\t\t\t\tif (imeta.bar &&\n\t\t\t\t\t\timeta.stack === stack &&\n\t\t\t\t\t\timeta.controller.getValueScaleId() === scale.id &&\n\t\t\t\t\t\tchart.isDatasetVisible(i)) {\n\n\t\t\t\t\t\tivalue = Number(datasets[i].data[index]);\n\t\t\t\t\t\tif ((value < 0 && ivalue < 0) || (value >= 0 && ivalue > 0)) {\n\t\t\t\t\t\t\tstart += ivalue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbase = scale.getPixelForValue(start);\n\t\t\thead = scale.getPixelForValue(start + value);\n\t\t\tsize = (head - base) / 2;\n\n\t\t\treturn {\n\t\t\t\tsize: size,\n\t\t\t\tbase: base,\n\t\t\t\thead: head,\n\t\t\t\tcenter: head + size / 2\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tcalculateBarIndexPixels: function(datasetIndex, index, ruler) {\n\t\t\tvar me = this;\n\t\t\tvar scale = ruler.scale;\n\t\t\tvar isCombo = me.chart.isCombo;\n\t\t\tvar stackIndex = me.getStackIndex(datasetIndex);\n\t\t\tvar base = scale.getPixelForValue(null, index, datasetIndex, isCombo);\n\t\t\tvar size = ruler.barSize;\n\n\t\t\tbase -= isCombo? ruler.tickSize / 2 : 0;\n\t\t\tbase += ruler.fullBarSize * stackIndex;\n\t\t\tbase += ruler.categorySpacing / 2;\n\t\t\tbase += ruler.barSpacing / 2;\n\n\t\t\treturn {\n\t\t\t\tsize: size,\n\t\t\t\tbase: base,\n\t\t\t\thead: base + size,\n\t\t\t\tcenter: base + size / 2\n\t\t\t};\n\t\t},\n\n\t\tdraw: function() {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar elements = me.getMeta().data;\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar ilen = elements.length;\n\t\t\tvar i = 0;\n\t\t\tvar d;\n\n\t\t\thelpers.canvas.clipArea(chart.ctx, chart.chartArea);\n\n\t\t\tfor (; i<ilen; ++i) {\n\t\t\t\td = dataset.data[i];\n\t\t\t\tif (d !== null && d !== undefined && !isNaN(d)) {\n\t\t\t\t\telements[i].draw();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\thelpers.canvas.unclipArea(chart.ctx);\n\t\t},\n\n\t\tsetHoverStyle: function(rectangle) {\n\t\t\tvar dataset = this.chart.data.datasets[rectangle._datasetIndex];\n\t\t\tvar index = rectangle._index;\n\t\t\tvar custom = rectangle.custom || {};\n\t\t\tvar model = rectangle._model;\n\n\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(dataset.hoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n\t\t\tmodel.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.getValueAtIndexOrDefault(dataset.hoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n\t\t\tmodel.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.getValueAtIndexOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);\n\t\t},\n\n\t\tremoveHoverStyle: function(rectangle) {\n\t\t\tvar dataset = this.chart.data.datasets[rectangle._datasetIndex];\n\t\t\tvar index = rectangle._index;\n\t\t\tvar custom = rectangle.custom || {};\n\t\t\tvar model = rectangle._model;\n\t\t\tvar rectangleElementOptions = this.chart.options.elements.rectangle;\n\n\t\t\tmodel.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.backgroundColor, index, rectangleElementOptions.backgroundColor);\n\t\t\tmodel.borderColor = custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.borderColor, index, rectangleElementOptions.borderColor);\n\t\t\tmodel.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.borderWidth, index, rectangleElementOptions.borderWidth);\n\t\t}\n\t});\n\n\n\t// including horizontalBar in the bar file, instead of a file of its own\n\t// it extends bar (like pie extends doughnut)\n\tChart.defaults.horizontalBar = {\n\t\thover: {\n\t\t\tmode: 'label'\n\t\t},\n\n\t\tscales: {\n\t\t\txAxes: [{\n\t\t\t\ttype: 'linear',\n\t\t\t\tposition: 'bottom'\n\t\t\t}],\n\t\t\tyAxes: [{\n\t\t\t\tposition: 'left',\n\t\t\t\ttype: 'category',\n\n\t\t\t\t// Specific to Horizontal Bar Controller\n\t\t\t\tcategoryPercentage: 0.8,\n\t\t\t\tbarPercentage: 0.9,\n\n\t\t\t\t// grid line settings\n\t\t\t\tgridLines: {\n\t\t\t\t\toffsetGridLines: true\n\t\t\t\t}\n\t\t\t}]\n\t\t},\n\t\telements: {\n\t\t\trectangle: {\n\t\t\t\tborderSkipped: 'left'\n\t\t\t}\n\t\t},\n\t\ttooltips: {\n\t\t\tcallbacks: {\n\t\t\t\ttitle: function(tooltipItems, data) {\n\t\t\t\t\t// Pick first xLabel for now\n\t\t\t\t\tvar title = '';\n\n\t\t\t\t\tif (tooltipItems.length > 0) {\n\t\t\t\t\t\tif (tooltipItems[0].yLabel) {\n\t\t\t\t\t\t\ttitle = tooltipItems[0].yLabel;\n\t\t\t\t\t\t} else if (data.labels.length > 0 && tooltipItems[0].index < data.labels.length) {\n\t\t\t\t\t\t\ttitle = data.labels[tooltipItems[0].index];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn title;\n\t\t\t\t},\n\t\t\t\tlabel: function(tooltipItem, data) {\n\t\t\t\t\tvar datasetLabel = data.datasets[tooltipItem.datasetIndex].label || '';\n\t\t\t\t\treturn datasetLabel + ': ' + tooltipItem.xLabel;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tChart.controllers.horizontalBar = Chart.controllers.bar.extend({\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetValueScaleId: function() {\n\t\t\treturn this.getMeta().xAxisID;\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tgetIndexScaleId: function() {\n\t\t\treturn this.getMeta().yAxisID;\n\t\t}\n\t});\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.defaults.bubble = {\n\t\thover: {\n\t\t\tmode: 'single'\n\t\t},\n\n\t\tscales: {\n\t\t\txAxes: [{\n\t\t\t\ttype: 'linear', // bubble should probably use a linear scale by default\n\t\t\t\tposition: 'bottom',\n\t\t\t\tid: 'x-axis-0' // need an ID so datasets can reference the scale\n\t\t\t}],\n\t\t\tyAxes: [{\n\t\t\t\ttype: 'linear',\n\t\t\t\tposition: 'left',\n\t\t\t\tid: 'y-axis-0'\n\t\t\t}]\n\t\t},\n\n\t\ttooltips: {\n\t\t\tcallbacks: {\n\t\t\t\ttitle: function() {\n\t\t\t\t\t// Title doesn't make sense for scatter since we format the data as a point\n\t\t\t\t\treturn '';\n\t\t\t\t},\n\t\t\t\tlabel: function(tooltipItem, data) {\n\t\t\t\t\tvar datasetLabel = data.datasets[tooltipItem.datasetIndex].label || '';\n\t\t\t\t\tvar dataPoint = data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];\n\t\t\t\t\treturn datasetLabel + ': (' + tooltipItem.xLabel + ', ' + tooltipItem.yLabel + ', ' + dataPoint.r + ')';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tChart.controllers.bubble = Chart.DatasetController.extend({\n\n\t\tdataElementType: Chart.elements.Point,\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar points = meta.data;\n\n\t\t\t// Update Points\n\t\t\thelpers.each(points, function(point, index) {\n\t\t\t\tme.updateElement(point, index, reset);\n\t\t\t});\n\t\t},\n\n\t\tupdateElement: function(point, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar data = dataset.data[index];\n\t\t\tvar pointElementOptions = me.chart.options.elements.point;\n\t\t\tvar dsIndex = me.index;\n\n\t\t\thelpers.extend(point, {\n\t\t\t\t// Utility\n\t\t\t\t_xScale: xScale,\n\t\t\t\t_yScale: yScale,\n\t\t\t\t_datasetIndex: dsIndex,\n\t\t\t\t_index: index,\n\n\t\t\t\t// Desired view properties\n\t\t\t\t_model: {\n\t\t\t\t\tx: reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex, me.chart.isCombo),\n\t\t\t\t\ty: reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex),\n\t\t\t\t\t// Appearance\n\t\t\t\t\tradius: reset ? 0 : custom.radius ? custom.radius : me.getRadius(data),\n\n\t\t\t\t\t// Tooltip\n\t\t\t\t\thitRadius: custom.hitRadius ? custom.hitRadius : helpers.getValueAtIndexOrDefault(dataset.hitRadius, index, pointElementOptions.hitRadius)\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Trick to reset the styles of the point\n\t\t\tChart.DatasetController.prototype.removeHoverStyle.call(me, point, pointElementOptions);\n\n\t\t\tvar model = point._model;\n\t\t\tmodel.skip = custom.skip ? custom.skip : (isNaN(model.x) || isNaN(model.y));\n\n\t\t\tpoint.pivot();\n\t\t},\n\n\t\tgetRadius: function(value) {\n\t\t\treturn value.r || this.chart.options.elements.point.radius;\n\t\t},\n\n\t\tsetHoverStyle: function(point) {\n\t\t\tvar me = this;\n\t\t\tChart.DatasetController.prototype.setHoverStyle.call(me, point);\n\n\t\t\t// Radius\n\t\t\tvar dataset = me.chart.data.datasets[point._datasetIndex];\n\t\t\tvar index = point._index;\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar model = point._model;\n\t\t\tmodel.radius = custom.hoverRadius ? custom.hoverRadius : (helpers.getValueAtIndexOrDefault(dataset.hoverRadius, index, me.chart.options.elements.point.hoverRadius)) + me.getRadius(dataset.data[index]);\n\t\t},\n\n\t\tremoveHoverStyle: function(point) {\n\t\t\tvar me = this;\n\t\t\tChart.DatasetController.prototype.removeHoverStyle.call(me, point, me.chart.options.elements.point);\n\n\t\t\tvar dataVal = me.chart.data.datasets[point._datasetIndex].data[point._index];\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar model = point._model;\n\n\t\t\tmodel.radius = custom.radius ? custom.radius : me.getRadius(dataVal);\n\t\t}\n\t});\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers,\n\t\tdefaults = Chart.defaults;\n\n\tdefaults.doughnut = {\n\t\tanimation: {\n\t\t\t// Boolean - Whether we animate the rotation of the Doughnut\n\t\t\tanimateRotate: true,\n\t\t\t// Boolean - Whether we animate scaling the Doughnut from the centre\n\t\t\tanimateScale: false\n\t\t},\n\t\taspectRatio: 1,\n\t\thover: {\n\t\t\tmode: 'single'\n\t\t},\n\t\tlegendCallback: function(chart) {\n\t\t\tvar text = [];\n\t\t\ttext.push('<ul class=\"' + chart.id + '-legend\">');\n\n\t\t\tvar data = chart.data;\n\t\t\tvar datasets = data.datasets;\n\t\t\tvar labels = data.labels;\n\n\t\t\tif (datasets.length) {\n\t\t\t\tfor (var i = 0; i < datasets[0].data.length; ++i) {\n\t\t\t\t\ttext.push('<li><span style=\"background-color:' + datasets[0].backgroundColor[i] + '\"></span>');\n\t\t\t\t\tif (labels[i]) {\n\t\t\t\t\t\ttext.push(labels[i]);\n\t\t\t\t\t}\n\t\t\t\t\ttext.push('</li>');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttext.push('</ul>');\n\t\t\treturn text.join('');\n\t\t},\n\t\tlegend: {\n\t\t\tlabels: {\n\t\t\t\tgenerateLabels: function(chart) {\n\t\t\t\t\tvar data = chart.data;\n\t\t\t\t\tif (data.labels.length && data.datasets.length) {\n\t\t\t\t\t\treturn data.labels.map(function(label, i) {\n\t\t\t\t\t\t\tvar meta = chart.getDatasetMeta(0);\n\t\t\t\t\t\t\tvar ds = data.datasets[0];\n\t\t\t\t\t\t\tvar arc = meta.data[i];\n\t\t\t\t\t\t\tvar custom = arc && arc.custom || {};\n\t\t\t\t\t\t\tvar getValueAtIndexOrDefault = helpers.getValueAtIndexOrDefault;\n\t\t\t\t\t\t\tvar arcOpts = chart.options.elements.arc;\n\t\t\t\t\t\t\tvar fill = custom.backgroundColor ? custom.backgroundColor : getValueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);\n\t\t\t\t\t\t\tvar stroke = custom.borderColor ? custom.borderColor : getValueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor);\n\t\t\t\t\t\t\tvar bw = custom.borderWidth ? custom.borderWidth : getValueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth);\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\ttext: label,\n\t\t\t\t\t\t\t\tfillStyle: fill,\n\t\t\t\t\t\t\t\tstrokeStyle: stroke,\n\t\t\t\t\t\t\t\tlineWidth: bw,\n\t\t\t\t\t\t\t\thidden: isNaN(ds.data[i]) || meta.data[i].hidden,\n\n\t\t\t\t\t\t\t\t// Extra data used for toggling the correct item\n\t\t\t\t\t\t\t\tindex: i\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tonClick: function(e, legendItem) {\n\t\t\t\tvar index = legendItem.index;\n\t\t\t\tvar chart = this.chart;\n\t\t\t\tvar i, ilen, meta;\n\n\t\t\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\t\t// toggle visibility of index if exists\n\t\t\t\t\tif (meta.data[index]) {\n\t\t\t\t\t\tmeta.data[index].hidden = !meta.data[index].hidden;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tchart.update();\n\t\t\t}\n\t\t},\n\n\t\t// The percentage of the chart that we cut out of the middle.\n\t\tcutoutPercentage: 50,\n\n\t\t// The rotation of the chart, where the first data arc begins.\n\t\trotation: Math.PI * -0.5,\n\n\t\t// The total circumference of the chart.\n\t\tcircumference: Math.PI * 2.0,\n\n\t\t// Need to override these to give a nice default\n\t\ttooltips: {\n\t\t\tcallbacks: {\n\t\t\t\ttitle: function() {\n\t\t\t\t\treturn '';\n\t\t\t\t},\n\t\t\t\tlabel: function(tooltipItem, data) {\n\t\t\t\t\tvar dataLabel = data.labels[tooltipItem.index];\n\t\t\t\t\tvar value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];\n\n\t\t\t\t\tif (helpers.isArray(dataLabel)) {\n\t\t\t\t\t\t// show value on first line of multiline label\n\t\t\t\t\t\t// need to clone because we are changing the value\n\t\t\t\t\t\tdataLabel = dataLabel.slice();\n\t\t\t\t\t\tdataLabel[0] += value;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdataLabel += value;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn dataLabel;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tdefaults.pie = helpers.clone(defaults.doughnut);\n\thelpers.extend(defaults.pie, {\n\t\tcutoutPercentage: 0\n\t});\n\n\n\tChart.controllers.doughnut = Chart.controllers.pie = Chart.DatasetController.extend({\n\n\t\tdataElementType: Chart.elements.Arc,\n\n\t\tlinkScales: helpers.noop,\n\n\t\t// Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly\n\t\tgetRingIndex: function(datasetIndex) {\n\t\t\tvar ringIndex = 0;\n\n\t\t\tfor (var j = 0; j < datasetIndex; ++j) {\n\t\t\t\tif (this.chart.isDatasetVisible(j)) {\n\t\t\t\t\t++ringIndex;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn ringIndex;\n\t\t},\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart,\n\t\t\t\tchartArea = chart.chartArea,\n\t\t\t\topts = chart.options,\n\t\t\t\tarcOpts = opts.elements.arc,\n\t\t\t\tavailableWidth = chartArea.right - chartArea.left - arcOpts.borderWidth,\n\t\t\t\tavailableHeight = chartArea.bottom - chartArea.top - arcOpts.borderWidth,\n\t\t\t\tminSize = Math.min(availableWidth, availableHeight),\n\t\t\t\toffset = {\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: 0\n\t\t\t\t},\n\t\t\t\tmeta = me.getMeta(),\n\t\t\t\tcutoutPercentage = opts.cutoutPercentage,\n\t\t\t\tcircumference = opts.circumference;\n\n\t\t\t// If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc\n\t\t\tif (circumference < Math.PI * 2.0) {\n\t\t\t\tvar startAngle = opts.rotation % (Math.PI * 2.0);\n\t\t\t\tstartAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0);\n\t\t\t\tvar endAngle = startAngle + circumference;\n\t\t\t\tvar start = {x: Math.cos(startAngle), y: Math.sin(startAngle)};\n\t\t\t\tvar end = {x: Math.cos(endAngle), y: Math.sin(endAngle)};\n\t\t\t\tvar contains0 = (startAngle <= 0 && 0 <= endAngle) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle);\n\t\t\t\tvar contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle);\n\t\t\t\tvar contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle);\n\t\t\t\tvar contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle);\n\t\t\t\tvar cutout = cutoutPercentage / 100.0;\n\t\t\t\tvar min = {x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout))};\n\t\t\t\tvar max = {x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout))};\n\t\t\t\tvar size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5};\n\t\t\t\tminSize = Math.min(availableWidth / size.width, availableHeight / size.height);\n\t\t\t\toffset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5};\n\t\t\t}\n\n\t\t\tchart.borderWidth = me.getMaxBorderWidth(meta.data);\n\t\t\tchart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0);\n\t\t\tchart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0);\n\t\t\tchart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\n\t\t\tchart.offsetX = offset.x * chart.outerRadius;\n\t\t\tchart.offsetY = offset.y * chart.outerRadius;\n\n\t\t\tmeta.total = me.calculateTotal();\n\n\t\t\tme.outerRadius = chart.outerRadius - (chart.radiusLength * me.getRingIndex(me.index));\n\t\t\tme.innerRadius = Math.max(me.outerRadius - chart.radiusLength, 0);\n\n\t\t\thelpers.each(meta.data, function(arc, index) {\n\t\t\t\tme.updateElement(arc, index, reset);\n\t\t\t});\n\t\t},\n\n\t\tupdateElement: function(arc, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart,\n\t\t\t\tchartArea = chart.chartArea,\n\t\t\t\topts = chart.options,\n\t\t\t\tanimationOpts = opts.animation,\n\t\t\t\tcenterX = (chartArea.left + chartArea.right) / 2,\n\t\t\t\tcenterY = (chartArea.top + chartArea.bottom) / 2,\n\t\t\t\tstartAngle = opts.rotation, // non reset case handled later\n\t\t\t\tendAngle = opts.rotation, // non reset case handled later\n\t\t\t\tdataset = me.getDataset(),\n\t\t\t\tcircumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI)),\n\t\t\t\tinnerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius,\n\t\t\t\touterRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius,\n\t\t\t\tvalueAtIndexOrDefault = helpers.getValueAtIndexOrDefault;\n\n\t\t\thelpers.extend(arc, {\n\t\t\t\t// Utility\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_index: index,\n\n\t\t\t\t// Desired view properties\n\t\t\t\t_model: {\n\t\t\t\t\tx: centerX + chart.offsetX,\n\t\t\t\t\ty: centerY + chart.offsetY,\n\t\t\t\t\tstartAngle: startAngle,\n\t\t\t\t\tendAngle: endAngle,\n\t\t\t\t\tcircumference: circumference,\n\t\t\t\t\touterRadius: outerRadius,\n\t\t\t\t\tinnerRadius: innerRadius,\n\t\t\t\t\tlabel: valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index])\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tvar model = arc._model;\n\t\t\t// Resets the visual styles\n\t\t\tthis.removeHoverStyle(arc);\n\n\t\t\t// Set correct angles if not resetting\n\t\t\tif (!reset || !animationOpts.animateRotate) {\n\t\t\t\tif (index === 0) {\n\t\t\t\t\tmodel.startAngle = opts.rotation;\n\t\t\t\t} else {\n\t\t\t\t\tmodel.startAngle = me.getMeta().data[index - 1]._model.endAngle;\n\t\t\t\t}\n\n\t\t\t\tmodel.endAngle = model.startAngle + model.circumference;\n\t\t\t}\n\n\t\t\tarc.pivot();\n\t\t},\n\n\t\tremoveHoverStyle: function(arc) {\n\t\t\tChart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc);\n\t\t},\n\n\t\tcalculateTotal: function() {\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar meta = this.getMeta();\n\t\t\tvar total = 0;\n\t\t\tvar value;\n\n\t\t\thelpers.each(meta.data, function(element, index) {\n\t\t\t\tvalue = dataset.data[index];\n\t\t\t\tif (!isNaN(value) && !element.hidden) {\n\t\t\t\t\ttotal += Math.abs(value);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t/* if (total === 0) {\n\t\t\t\ttotal = NaN;\n\t\t\t}*/\n\n\t\t\treturn total;\n\t\t},\n\n\t\tcalculateCircumference: function(value) {\n\t\t\tvar total = this.getMeta().total;\n\t\t\tif (total > 0 && !isNaN(value)) {\n\t\t\t\treturn (Math.PI * 2.0) * (value / total);\n\t\t\t}\n\t\t\treturn 0;\n\t\t},\n\n\t\t// gets the max border or hover width to properly scale pie charts\n\t\tgetMaxBorderWidth: function(elements) {\n\t\t\tvar max = 0,\n\t\t\t\tindex = this.index,\n\t\t\t\tlength = elements.length,\n\t\t\t\tborderWidth,\n\t\t\t\thoverWidth;\n\n\t\t\tfor (var i = 0; i < length; i++) {\n\t\t\t\tborderWidth = elements[i]._model ? elements[i]._model.borderWidth : 0;\n\t\t\t\thoverWidth = elements[i]._chart ? elements[i]._chart.config.data.datasets[index].hoverBorderWidth : 0;\n\n\t\t\t\tmax = borderWidth > max ? borderWidth : max;\n\t\t\t\tmax = hoverWidth > max ? hoverWidth : max;\n\t\t\t}\n\t\t\treturn max;\n\t\t}\n\t});\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.defaults.line = {\n\t\tshowLines: true,\n\t\tspanGaps: false,\n\n\t\thover: {\n\t\t\tmode: 'label'\n\t\t},\n\n\t\tscales: {\n\t\t\txAxes: [{\n\t\t\t\ttype: 'category',\n\t\t\t\tid: 'x-axis-0'\n\t\t\t}],\n\t\t\tyAxes: [{\n\t\t\t\ttype: 'linear',\n\t\t\t\tid: 'y-axis-0'\n\t\t\t}]\n\t\t}\n\t};\n\n\tfunction lineEnabled(dataset, options) {\n\t\treturn helpers.getValueOrDefault(dataset.showLine, options.showLines);\n\t}\n\n\tChart.controllers.line = Chart.DatasetController.extend({\n\n\t\tdatasetElementType: Chart.elements.Line,\n\n\t\tdataElementType: Chart.elements.Point,\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar line = meta.dataset;\n\t\t\tvar points = meta.data || [];\n\t\t\tvar options = me.chart.options;\n\t\t\tvar lineElementOptions = options.elements.line;\n\t\t\tvar scale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar i, ilen, custom;\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar showLine = lineEnabled(dataset, options);\n\n\t\t\t// Update Line\n\t\t\tif (showLine) {\n\t\t\t\tcustom = line.custom || {};\n\n\t\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\t\tif ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {\n\t\t\t\t\tdataset.lineTension = dataset.tension;\n\t\t\t\t}\n\n\t\t\t\t// Utility\n\t\t\t\tline._scale = scale;\n\t\t\t\tline._datasetIndex = me.index;\n\t\t\t\t// Data\n\t\t\t\tline._children = points;\n\t\t\t\t// Model\n\t\t\t\tline._model = {\n\t\t\t\t\t// Appearance\n\t\t\t\t\t// The default behavior of lines is to break at null values, according\n\t\t\t\t\t// to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158\n\t\t\t\t\t// This option gives lines the ability to span gaps\n\t\t\t\t\tspanGaps: dataset.spanGaps ? dataset.spanGaps : options.spanGaps,\n\t\t\t\t\ttension: custom.tension ? custom.tension : helpers.getValueOrDefault(dataset.lineTension, lineElementOptions.tension),\n\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor),\n\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth),\n\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor),\n\t\t\t\t\tborderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle),\n\t\t\t\t\tborderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash),\n\t\t\t\t\tborderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset),\n\t\t\t\t\tborderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle),\n\t\t\t\t\tfill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill),\n\t\t\t\t\tsteppedLine: custom.steppedLine ? custom.steppedLine : helpers.getValueOrDefault(dataset.steppedLine, lineElementOptions.stepped),\n\t\t\t\t\tcubicInterpolationMode: custom.cubicInterpolationMode ? custom.cubicInterpolationMode : helpers.getValueOrDefault(dataset.cubicInterpolationMode, lineElementOptions.cubicInterpolationMode),\n\t\t\t\t};\n\n\t\t\t\tline.pivot();\n\t\t\t}\n\n\t\t\t// Update Points\n\t\t\tfor (i=0, ilen=points.length; i<ilen; ++i) {\n\t\t\t\tme.updateElement(points[i], i, reset);\n\t\t\t}\n\n\t\t\tif (showLine && line._model.tension !== 0) {\n\t\t\t\tme.updateBezierControlPoints();\n\t\t\t}\n\n\t\t\t// Now pivot the point for animation\n\t\t\tfor (i=0, ilen=points.length; i<ilen; ++i) {\n\t\t\t\tpoints[i].pivot();\n\t\t\t}\n\t\t},\n\n\t\tgetPointBackgroundColor: function(point, index) {\n\t\t\tvar backgroundColor = this.chart.options.elements.point.backgroundColor;\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar custom = point.custom || {};\n\n\t\t\tif (custom.backgroundColor) {\n\t\t\t\tbackgroundColor = custom.backgroundColor;\n\t\t\t} else if (dataset.pointBackgroundColor) {\n\t\t\t\tbackgroundColor = helpers.getValueAtIndexOrDefault(dataset.pointBackgroundColor, index, backgroundColor);\n\t\t\t} else if (dataset.backgroundColor) {\n\t\t\t\tbackgroundColor = dataset.backgroundColor;\n\t\t\t}\n\n\t\t\treturn backgroundColor;\n\t\t},\n\n\t\tgetPointBorderColor: function(point, index) {\n\t\t\tvar borderColor = this.chart.options.elements.point.borderColor;\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar custom = point.custom || {};\n\n\t\t\tif (custom.borderColor) {\n\t\t\t\tborderColor = custom.borderColor;\n\t\t\t} else if (dataset.pointBorderColor) {\n\t\t\t\tborderColor = helpers.getValueAtIndexOrDefault(dataset.pointBorderColor, index, borderColor);\n\t\t\t} else if (dataset.borderColor) {\n\t\t\t\tborderColor = dataset.borderColor;\n\t\t\t}\n\n\t\t\treturn borderColor;\n\t\t},\n\n\t\tgetPointBorderWidth: function(point, index) {\n\t\t\tvar borderWidth = this.chart.options.elements.point.borderWidth;\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar custom = point.custom || {};\n\n\t\t\tif (!isNaN(custom.borderWidth)) {\n\t\t\t\tborderWidth = custom.borderWidth;\n\t\t\t} else if (!isNaN(dataset.pointBorderWidth)) {\n\t\t\t\tborderWidth = helpers.getValueAtIndexOrDefault(dataset.pointBorderWidth, index, borderWidth);\n\t\t\t} else if (!isNaN(dataset.borderWidth)) {\n\t\t\t\tborderWidth = dataset.borderWidth;\n\t\t\t}\n\n\t\t\treturn borderWidth;\n\t\t},\n\n\t\tupdateElement: function(point, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar datasetIndex = me.index;\n\t\t\tvar value = dataset.data[index];\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar xScale = me.getScaleForId(meta.xAxisID);\n\t\t\tvar pointOptions = me.chart.options.elements.point;\n\t\t\tvar x, y;\n\t\t\tvar labels = me.chart.data.labels || [];\n\t\t\tvar includeOffset = (labels.length === 1 || dataset.data.length === 1) || me.chart.isCombo;\n\n\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\tif ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {\n\t\t\t\tdataset.pointRadius = dataset.radius;\n\t\t\t}\n\t\t\tif ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) {\n\t\t\t\tdataset.pointHitRadius = dataset.hitRadius;\n\t\t\t}\n\n\t\t\tx = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex, includeOffset);\n\t\t\ty = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex);\n\n\t\t\t// Utility\n\t\t\tpoint._xScale = xScale;\n\t\t\tpoint._yScale = yScale;\n\t\t\tpoint._datasetIndex = datasetIndex;\n\t\t\tpoint._index = index;\n\n\t\t\t// Desired view properties\n\t\t\tpoint._model = {\n\t\t\t\tx: x,\n\t\t\t\ty: y,\n\t\t\t\tskip: custom.skip || isNaN(x) || isNaN(y),\n\t\t\t\t// Appearance\n\t\t\t\tradius: custom.radius || helpers.getValueAtIndexOrDefault(dataset.pointRadius, index, pointOptions.radius),\n\t\t\t\tpointStyle: custom.pointStyle || helpers.getValueAtIndexOrDefault(dataset.pointStyle, index, pointOptions.pointStyle),\n\t\t\t\tbackgroundColor: me.getPointBackgroundColor(point, index),\n\t\t\t\tborderColor: me.getPointBorderColor(point, index),\n\t\t\t\tborderWidth: me.getPointBorderWidth(point, index),\n\t\t\t\ttension: meta.dataset._model ? meta.dataset._model.tension : 0,\n\t\t\t\tsteppedLine: meta.dataset._model ? meta.dataset._model.steppedLine : false,\n\t\t\t\t// Tooltip\n\t\t\t\thitRadius: custom.hitRadius || helpers.getValueAtIndexOrDefault(dataset.pointHitRadius, index, pointOptions.hitRadius)\n\t\t\t};\n\t\t},\n\n\t\tcalculatePointY: function(value, index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar yScale = me.getScaleForId(meta.yAxisID);\n\t\t\tvar sumPos = 0;\n\t\t\tvar sumNeg = 0;\n\t\t\tvar i, ds, dsMeta;\n\n\t\t\tif (yScale.options.stacked) {\n\t\t\t\tfor (i = 0; i < datasetIndex; i++) {\n\t\t\t\t\tds = chart.data.datasets[i];\n\t\t\t\t\tdsMeta = chart.getDatasetMeta(i);\n\t\t\t\t\tif (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) {\n\t\t\t\t\t\tvar stackedRightValue = Number(yScale.getRightValue(ds.data[index]));\n\t\t\t\t\t\tif (stackedRightValue < 0) {\n\t\t\t\t\t\t\tsumNeg += stackedRightValue || 0;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tsumPos += stackedRightValue || 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar rightValue = Number(yScale.getRightValue(value));\n\t\t\t\tif (rightValue < 0) {\n\t\t\t\t\treturn yScale.getPixelForValue(sumNeg + rightValue);\n\t\t\t\t}\n\t\t\t\treturn yScale.getPixelForValue(sumPos + rightValue);\n\t\t\t}\n\n\t\t\treturn yScale.getPixelForValue(value);\n\t\t},\n\n\t\tupdateBezierControlPoints: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar area = me.chart.chartArea;\n\t\t\tvar points = (meta.data || []);\n\t\t\tvar i, ilen, point, model, controlPoints;\n\n\t\t\t// Only consider points that are drawn in case the spanGaps option is used\n\t\t\tif (meta.dataset._model.spanGaps) {\n\t\t\t\tpoints = points.filter(function(pt) {\n\t\t\t\t\treturn !pt._model.skip;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tfunction capControlPoint(pt, min, max) {\n\t\t\t\treturn Math.max(Math.min(pt, max), min);\n\t\t\t}\n\n\t\t\tif (meta.dataset._model.cubicInterpolationMode === 'monotone') {\n\t\t\t\thelpers.splineCurveMonotone(points);\n\t\t\t} else {\n\t\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\t\tpoint = points[i];\n\t\t\t\t\tmodel = point._model;\n\t\t\t\t\tcontrolPoints = helpers.splineCurve(\n\t\t\t\t\t\thelpers.previousItem(points, i)._model,\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\thelpers.nextItem(points, i)._model,\n\t\t\t\t\t\tmeta.dataset._model.tension\n\t\t\t\t\t);\n\t\t\t\t\tmodel.controlPointPreviousX = controlPoints.previous.x;\n\t\t\t\t\tmodel.controlPointPreviousY = controlPoints.previous.y;\n\t\t\t\t\tmodel.controlPointNextX = controlPoints.next.x;\n\t\t\t\t\tmodel.controlPointNextY = controlPoints.next.y;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (me.chart.options.elements.line.capBezierPoints) {\n\t\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\n\t\t\t\t\tmodel = points[i]._model;\n\t\t\t\t\tmodel.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right);\n\t\t\t\t\tmodel.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom);\n\t\t\t\t\tmodel.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right);\n\t\t\t\t\tmodel.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tdraw: function() {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar points = meta.data || [];\n\t\t\tvar area = chart.chartArea;\n\t\t\tvar ilen = points.length;\n\t\t\tvar i = 0;\n\n\t\t\tChart.canvasHelpers.clipArea(chart.ctx, area);\n\n\t\t\tif (lineEnabled(me.getDataset(), chart.options)) {\n\t\t\t\tmeta.dataset.draw();\n\t\t\t}\n\n\t\t\tChart.canvasHelpers.unclipArea(chart.ctx);\n\n\t\t\t// Draw the points\n\t\t\tfor (; i<ilen; ++i) {\n\t\t\t\tpoints[i].draw(area);\n\t\t\t}\n\t\t},\n\n\t\tsetHoverStyle: function(point) {\n\t\t\t// Point\n\t\t\tvar dataset = this.chart.data.datasets[point._datasetIndex];\n\t\t\tvar index = point._index;\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar model = point._model;\n\n\t\t\tmodel.radius = custom.hoverRadius || helpers.getValueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);\n\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor || helpers.getValueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n\t\t\tmodel.borderColor = custom.hoverBorderColor || helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n\t\t\tmodel.borderWidth = custom.hoverBorderWidth || helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth);\n\t\t},\n\n\t\tremoveHoverStyle: function(point) {\n\t\t\tvar me = this;\n\t\t\tvar dataset = me.chart.data.datasets[point._datasetIndex];\n\t\t\tvar index = point._index;\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar model = point._model;\n\n\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\tif ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {\n\t\t\t\tdataset.pointRadius = dataset.radius;\n\t\t\t}\n\n\t\t\tmodel.radius = custom.radius || helpers.getValueAtIndexOrDefault(dataset.pointRadius, index, me.chart.options.elements.point.radius);\n\t\t\tmodel.backgroundColor = me.getPointBackgroundColor(point, index);\n\t\t\tmodel.borderColor = me.getPointBorderColor(point, index);\n\t\t\tmodel.borderWidth = me.getPointBorderWidth(point, index);\n\t\t}\n\t});\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.defaults.polarArea = {\n\n\t\tscale: {\n\t\t\ttype: 'radialLinear',\n\t\t\tangleLines: {\n\t\t\t\tdisplay: false\n\t\t\t},\n\t\t\tgridLines: {\n\t\t\t\tcircular: true\n\t\t\t},\n\t\t\tpointLabels: {\n\t\t\t\tdisplay: false\n\t\t\t},\n\t\t\tticks: {\n\t\t\t\tbeginAtZero: true\n\t\t\t}\n\t\t},\n\n\t\t// Boolean - Whether to animate the rotation of the chart\n\t\tanimation: {\n\t\t\tanimateRotate: true,\n\t\t\tanimateScale: true\n\t\t},\n\n\t\tstartAngle: -0.5 * Math.PI,\n\t\taspectRatio: 1,\n\t\tlegendCallback: function(chart) {\n\t\t\tvar text = [];\n\t\t\ttext.push('<ul class=\"' + chart.id + '-legend\">');\n\n\t\t\tvar data = chart.data;\n\t\t\tvar datasets = data.datasets;\n\t\t\tvar labels = data.labels;\n\n\t\t\tif (datasets.length) {\n\t\t\t\tfor (var i = 0; i < datasets[0].data.length; ++i) {\n\t\t\t\t\ttext.push('<li><span style=\"background-color:' + datasets[0].backgroundColor[i] + '\"></span>');\n\t\t\t\t\tif (labels[i]) {\n\t\t\t\t\t\ttext.push(labels[i]);\n\t\t\t\t\t}\n\t\t\t\t\ttext.push('</li>');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttext.push('</ul>');\n\t\t\treturn text.join('');\n\t\t},\n\t\tlegend: {\n\t\t\tlabels: {\n\t\t\t\tgenerateLabels: function(chart) {\n\t\t\t\t\tvar data = chart.data;\n\t\t\t\t\tif (data.labels.length && data.datasets.length) {\n\t\t\t\t\t\treturn data.labels.map(function(label, i) {\n\t\t\t\t\t\t\tvar meta = chart.getDatasetMeta(0);\n\t\t\t\t\t\t\tvar ds = data.datasets[0];\n\t\t\t\t\t\t\tvar arc = meta.data[i];\n\t\t\t\t\t\t\tvar custom = arc.custom || {};\n\t\t\t\t\t\t\tvar getValueAtIndexOrDefault = helpers.getValueAtIndexOrDefault;\n\t\t\t\t\t\t\tvar arcOpts = chart.options.elements.arc;\n\t\t\t\t\t\t\tvar fill = custom.backgroundColor ? custom.backgroundColor : getValueAtIndexOrDefault(ds.backgroundColor, i, arcOpts.backgroundColor);\n\t\t\t\t\t\t\tvar stroke = custom.borderColor ? custom.borderColor : getValueAtIndexOrDefault(ds.borderColor, i, arcOpts.borderColor);\n\t\t\t\t\t\t\tvar bw = custom.borderWidth ? custom.borderWidth : getValueAtIndexOrDefault(ds.borderWidth, i, arcOpts.borderWidth);\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\ttext: label,\n\t\t\t\t\t\t\t\tfillStyle: fill,\n\t\t\t\t\t\t\t\tstrokeStyle: stroke,\n\t\t\t\t\t\t\t\tlineWidth: bw,\n\t\t\t\t\t\t\t\thidden: isNaN(ds.data[i]) || meta.data[i].hidden,\n\n\t\t\t\t\t\t\t\t// Extra data used for toggling the correct item\n\t\t\t\t\t\t\t\tindex: i\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tonClick: function(e, legendItem) {\n\t\t\t\tvar index = legendItem.index;\n\t\t\t\tvar chart = this.chart;\n\t\t\t\tvar i, ilen, meta;\n\n\t\t\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\n\t\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\t\tmeta.data[index].hidden = !meta.data[index].hidden;\n\t\t\t\t}\n\n\t\t\t\tchart.update();\n\t\t\t}\n\t\t},\n\n\t\t// Need to override these to give a nice default\n\t\ttooltips: {\n\t\t\tcallbacks: {\n\t\t\t\ttitle: function() {\n\t\t\t\t\treturn '';\n\t\t\t\t},\n\t\t\t\tlabel: function(tooltipItem, data) {\n\t\t\t\t\treturn data.labels[tooltipItem.index] + ': ' + tooltipItem.yLabel;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tChart.controllers.polarArea = Chart.DatasetController.extend({\n\n\t\tdataElementType: Chart.elements.Arc,\n\n\t\tlinkScales: helpers.noop,\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar chartArea = chart.chartArea;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar opts = chart.options;\n\t\t\tvar arcOpts = opts.elements.arc;\n\t\t\tvar minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n\t\t\tchart.outerRadius = Math.max((minSize - arcOpts.borderWidth / 2) / 2, 0);\n\t\t\tchart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n\t\t\tchart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\n\n\t\t\tme.outerRadius = chart.outerRadius - (chart.radiusLength * me.index);\n\t\t\tme.innerRadius = me.outerRadius - chart.radiusLength;\n\n\t\t\tmeta.count = me.countVisibleElements();\n\n\t\t\thelpers.each(meta.data, function(arc, index) {\n\t\t\t\tme.updateElement(arc, index, reset);\n\t\t\t});\n\t\t},\n\n\t\tupdateElement: function(arc, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar opts = chart.options;\n\t\t\tvar animationOpts = opts.animation;\n\t\t\tvar scale = chart.scale;\n\t\t\tvar getValueAtIndexOrDefault = helpers.getValueAtIndexOrDefault;\n\t\t\tvar labels = chart.data.labels;\n\n\t\t\tvar circumference = me.calculateCircumference(dataset.data[index]);\n\t\t\tvar centerX = scale.xCenter;\n\t\t\tvar centerY = scale.yCenter;\n\n\t\t\t// If there is NaN data before us, we need to calculate the starting angle correctly.\n\t\t\t// We could be way more efficient here, but its unlikely that the polar area chart will have a lot of data\n\t\t\tvar visibleCount = 0;\n\t\t\tvar meta = me.getMeta();\n\t\t\tfor (var i = 0; i < index; ++i) {\n\t\t\t\tif (!isNaN(dataset.data[i]) && !meta.data[i].hidden) {\n\t\t\t\t\t++visibleCount;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// var negHalfPI = -0.5 * Math.PI;\n\t\t\tvar datasetStartAngle = opts.startAngle;\n\t\t\tvar distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n\t\t\tvar startAngle = datasetStartAngle + (circumference * visibleCount);\n\t\t\tvar endAngle = startAngle + (arc.hidden ? 0 : circumference);\n\n\t\t\tvar resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\n\n\t\t\thelpers.extend(arc, {\n\t\t\t\t// Utility\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_index: index,\n\t\t\t\t_scale: scale,\n\n\t\t\t\t// Desired view properties\n\t\t\t\t_model: {\n\t\t\t\t\tx: centerX,\n\t\t\t\t\ty: centerY,\n\t\t\t\t\tinnerRadius: 0,\n\t\t\t\t\touterRadius: reset ? resetRadius : distance,\n\t\t\t\t\tstartAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle,\n\t\t\t\t\tendAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle,\n\t\t\t\t\tlabel: getValueAtIndexOrDefault(labels, index, labels[index])\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Apply border and fill style\n\t\t\tme.removeHoverStyle(arc);\n\n\t\t\tarc.pivot();\n\t\t},\n\n\t\tremoveHoverStyle: function(arc) {\n\t\t\tChart.DatasetController.prototype.removeHoverStyle.call(this, arc, this.chart.options.elements.arc);\n\t\t},\n\n\t\tcountVisibleElements: function() {\n\t\t\tvar dataset = this.getDataset();\n\t\t\tvar meta = this.getMeta();\n\t\t\tvar count = 0;\n\n\t\t\thelpers.each(meta.data, function(element, index) {\n\t\t\t\tif (!isNaN(dataset.data[index]) && !element.hidden) {\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn count;\n\t\t},\n\n\t\tcalculateCircumference: function(value) {\n\t\t\tvar count = this.getMeta().count;\n\t\t\tif (count > 0 && !isNaN(value)) {\n\t\t\t\treturn (2 * Math.PI) / count;\n\t\t\t}\n\t\t\treturn 0;\n\t\t}\n\t});\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.defaults.radar = {\n\t\taspectRatio: 1,\n\t\tscale: {\n\t\t\ttype: 'radialLinear'\n\t\t},\n\t\telements: {\n\t\t\tline: {\n\t\t\t\ttension: 0 // no bezier in radar\n\t\t\t}\n\t\t}\n\t};\n\n\tChart.controllers.radar = Chart.DatasetController.extend({\n\n\t\tdatasetElementType: Chart.elements.Line,\n\n\t\tdataElementType: Chart.elements.Point,\n\n\t\tlinkScales: helpers.noop,\n\n\t\tupdate: function(reset) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar line = meta.dataset;\n\t\t\tvar points = meta.data;\n\t\t\tvar custom = line.custom || {};\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar lineElementOptions = me.chart.options.elements.line;\n\t\t\tvar scale = me.chart.scale;\n\n\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\tif ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) {\n\t\t\t\tdataset.lineTension = dataset.tension;\n\t\t\t}\n\n\t\t\thelpers.extend(meta.dataset, {\n\t\t\t\t// Utility\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_scale: scale,\n\t\t\t\t// Data\n\t\t\t\t_children: points,\n\t\t\t\t_loop: true,\n\t\t\t\t// Model\n\t\t\t\t_model: {\n\t\t\t\t\t// Appearance\n\t\t\t\t\ttension: custom.tension ? custom.tension : helpers.getValueOrDefault(dataset.lineTension, lineElementOptions.tension),\n\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : (dataset.backgroundColor || lineElementOptions.backgroundColor),\n\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : (dataset.borderWidth || lineElementOptions.borderWidth),\n\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : (dataset.borderColor || lineElementOptions.borderColor),\n\t\t\t\t\tfill: custom.fill ? custom.fill : (dataset.fill !== undefined ? dataset.fill : lineElementOptions.fill),\n\t\t\t\t\tborderCapStyle: custom.borderCapStyle ? custom.borderCapStyle : (dataset.borderCapStyle || lineElementOptions.borderCapStyle),\n\t\t\t\t\tborderDash: custom.borderDash ? custom.borderDash : (dataset.borderDash || lineElementOptions.borderDash),\n\t\t\t\t\tborderDashOffset: custom.borderDashOffset ? custom.borderDashOffset : (dataset.borderDashOffset || lineElementOptions.borderDashOffset),\n\t\t\t\t\tborderJoinStyle: custom.borderJoinStyle ? custom.borderJoinStyle : (dataset.borderJoinStyle || lineElementOptions.borderJoinStyle),\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmeta.dataset.pivot();\n\n\t\t\t// Update Points\n\t\t\thelpers.each(points, function(point, index) {\n\t\t\t\tme.updateElement(point, index, reset);\n\t\t\t}, me);\n\n\t\t\t// Update bezier control points\n\t\t\tme.updateBezierControlPoints();\n\t\t},\n\t\tupdateElement: function(point, index, reset) {\n\t\t\tvar me = this;\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar scale = me.chart.scale;\n\t\t\tvar pointElementOptions = me.chart.options.elements.point;\n\t\t\tvar pointPosition = scale.getPointPositionForValue(index, dataset.data[index]);\n\n\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\n\t\t\tif ((dataset.radius !== undefined) && (dataset.pointRadius === undefined)) {\n\t\t\t\tdataset.pointRadius = dataset.radius;\n\t\t\t}\n\t\t\tif ((dataset.hitRadius !== undefined) && (dataset.pointHitRadius === undefined)) {\n\t\t\t\tdataset.pointHitRadius = dataset.hitRadius;\n\t\t\t}\n\n\t\t\thelpers.extend(point, {\n\t\t\t\t// Utility\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_index: index,\n\t\t\t\t_scale: scale,\n\n\t\t\t\t// Desired view properties\n\t\t\t\t_model: {\n\t\t\t\t\tx: reset ? scale.xCenter : pointPosition.x, // value not used in dataset scale, but we want a consistent API between scales\n\t\t\t\t\ty: reset ? scale.yCenter : pointPosition.y,\n\n\t\t\t\t\t// Appearance\n\t\t\t\t\ttension: custom.tension ? custom.tension : helpers.getValueOrDefault(dataset.lineTension, me.chart.options.elements.line.tension),\n\t\t\t\t\tradius: custom.radius ? custom.radius : helpers.getValueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius),\n\t\t\t\t\tbackgroundColor: custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor),\n\t\t\t\t\tborderColor: custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor),\n\t\t\t\t\tborderWidth: custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth),\n\t\t\t\t\tpointStyle: custom.pointStyle ? custom.pointStyle : helpers.getValueAtIndexOrDefault(dataset.pointStyle, index, pointElementOptions.pointStyle),\n\n\t\t\t\t\t// Tooltip\n\t\t\t\t\thitRadius: custom.hitRadius ? custom.hitRadius : helpers.getValueAtIndexOrDefault(dataset.pointHitRadius, index, pointElementOptions.hitRadius)\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tpoint._model.skip = custom.skip ? custom.skip : (isNaN(point._model.x) || isNaN(point._model.y));\n\t\t},\n\t\tupdateBezierControlPoints: function() {\n\t\t\tvar chartArea = this.chart.chartArea;\n\t\t\tvar meta = this.getMeta();\n\n\t\t\thelpers.each(meta.data, function(point, index) {\n\t\t\t\tvar model = point._model;\n\t\t\t\tvar controlPoints = helpers.splineCurve(\n\t\t\t\t\thelpers.previousItem(meta.data, index, true)._model,\n\t\t\t\t\tmodel,\n\t\t\t\t\thelpers.nextItem(meta.data, index, true)._model,\n\t\t\t\t\tmodel.tension\n\t\t\t\t);\n\n\t\t\t\t// Prevent the bezier going outside of the bounds of the graph\n\t\t\t\tmodel.controlPointPreviousX = Math.max(Math.min(controlPoints.previous.x, chartArea.right), chartArea.left);\n\t\t\t\tmodel.controlPointPreviousY = Math.max(Math.min(controlPoints.previous.y, chartArea.bottom), chartArea.top);\n\n\t\t\t\tmodel.controlPointNextX = Math.max(Math.min(controlPoints.next.x, chartArea.right), chartArea.left);\n\t\t\t\tmodel.controlPointNextY = Math.max(Math.min(controlPoints.next.y, chartArea.bottom), chartArea.top);\n\n\t\t\t\t// Now pivot the point for animation\n\t\t\t\tpoint.pivot();\n\t\t\t});\n\t\t},\n\n\t\tsetHoverStyle: function(point) {\n\t\t\t// Point\n\t\t\tvar dataset = this.chart.data.datasets[point._datasetIndex];\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar index = point._index;\n\t\t\tvar model = point._model;\n\n\t\t\tmodel.radius = custom.hoverRadius ? custom.hoverRadius : helpers.getValueAtIndexOrDefault(dataset.pointHoverRadius, index, this.chart.options.elements.point.hoverRadius);\n\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : helpers.getValueAtIndexOrDefault(dataset.pointHoverBackgroundColor, index, helpers.getHoverColor(model.backgroundColor));\n\t\t\tmodel.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderColor, index, helpers.getHoverColor(model.borderColor));\n\t\t\tmodel.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : helpers.getValueAtIndexOrDefault(dataset.pointHoverBorderWidth, index, model.borderWidth);\n\t\t},\n\n\t\tremoveHoverStyle: function(point) {\n\t\t\tvar dataset = this.chart.data.datasets[point._datasetIndex];\n\t\t\tvar custom = point.custom || {};\n\t\t\tvar index = point._index;\n\t\t\tvar model = point._model;\n\t\t\tvar pointElementOptions = this.chart.options.elements.point;\n\n\t\t\tmodel.radius = custom.radius ? custom.radius : helpers.getValueAtIndexOrDefault(dataset.pointRadius, index, pointElementOptions.radius);\n\t\t\tmodel.backgroundColor = custom.backgroundColor ? custom.backgroundColor : helpers.getValueAtIndexOrDefault(dataset.pointBackgroundColor, index, pointElementOptions.backgroundColor);\n\t\t\tmodel.borderColor = custom.borderColor ? custom.borderColor : helpers.getValueAtIndexOrDefault(dataset.pointBorderColor, index, pointElementOptions.borderColor);\n\t\t\tmodel.borderWidth = custom.borderWidth ? custom.borderWidth : helpers.getValueAtIndexOrDefault(dataset.pointBorderWidth, index, pointElementOptions.borderWidth);\n\t\t}\n\t});\n};\n",
    "/* global window: false */\n'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.defaults.global.animation = {\n\t\tduration: 1000,\n\t\teasing: 'easeOutQuart',\n\t\tonProgress: helpers.noop,\n\t\tonComplete: helpers.noop\n\t};\n\n\tChart.Animation = Chart.Element.extend({\n\t\tchart: null, // the animation associated chart instance\n\t\tcurrentStep: 0, // the current animation step\n\t\tnumSteps: 60, // default number of steps\n\t\teasing: '', // the easing to use for this animation\n\t\trender: null, // render function used by the animation service\n\n\t\tonAnimationProgress: null, // user specified callback to fire on each step of the animation\n\t\tonAnimationComplete: null, // user specified callback to fire when the animation finishes\n\t});\n\n\tChart.animationService = {\n\t\tframeDuration: 17,\n\t\tanimations: [],\n\t\tdropFrames: 0,\n\t\trequest: null,\n\n\t\t/**\n\t\t * @param {Chart} chart - The chart to animate.\n\t\t * @param {Chart.Animation} animation - The animation that we will animate.\n\t\t * @param {Number} duration - The animation duration in ms.\n\t\t * @param {Boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions\n\t\t */\n\t\taddAnimation: function(chart, animation, duration, lazy) {\n\t\t\tvar animations = this.animations;\n\t\t\tvar i, ilen;\n\n\t\t\tanimation.chart = chart;\n\n\t\t\tif (!lazy) {\n\t\t\t\tchart.animating = true;\n\t\t\t}\n\n\t\t\tfor (i=0, ilen=animations.length; i < ilen; ++i) {\n\t\t\t\tif (animations[i].chart === chart) {\n\t\t\t\t\tanimations[i] = animation;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tanimations.push(animation);\n\n\t\t\t// If there are no animations queued, manually kickstart a digest, for lack of a better word\n\t\t\tif (animations.length === 1) {\n\t\t\t\tthis.requestAnimationFrame();\n\t\t\t}\n\t\t},\n\n\t\tcancelAnimation: function(chart) {\n\t\t\tvar index = helpers.findIndex(this.animations, function(animation) {\n\t\t\t\treturn animation.chart === chart;\n\t\t\t});\n\n\t\t\tif (index !== -1) {\n\t\t\t\tthis.animations.splice(index, 1);\n\t\t\t\tchart.animating = false;\n\t\t\t}\n\t\t},\n\n\t\trequestAnimationFrame: function() {\n\t\t\tvar me = this;\n\t\t\tif (me.request === null) {\n\t\t\t\t// Skip animation frame requests until the active one is executed.\n\t\t\t\t// This can happen when processing mouse events, e.g. 'mousemove'\n\t\t\t\t// and 'mouseout' events will trigger multiple renders.\n\t\t\t\tme.request = helpers.requestAnimFrame.call(window, function() {\n\t\t\t\t\tme.request = null;\n\t\t\t\t\tme.startDigest();\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tstartDigest: function() {\n\t\t\tvar me = this;\n\t\t\tvar startTime = Date.now();\n\t\t\tvar framesToDrop = 0;\n\n\t\t\tif (me.dropFrames > 1) {\n\t\t\t\tframesToDrop = Math.floor(me.dropFrames);\n\t\t\t\tme.dropFrames = me.dropFrames % 1;\n\t\t\t}\n\n\t\t\tme.advance(1 + framesToDrop);\n\n\t\t\tvar endTime = Date.now();\n\n\t\t\tme.dropFrames += (endTime - startTime) / me.frameDuration;\n\n\t\t\t// Do we have more stuff to animate?\n\t\t\tif (me.animations.length > 0) {\n\t\t\t\tme.requestAnimationFrame();\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tadvance: function(count) {\n\t\t\tvar animations = this.animations;\n\t\t\tvar animation, chart;\n\t\t\tvar i = 0;\n\n\t\t\twhile (i < animations.length) {\n\t\t\t\tanimation = animations[i];\n\t\t\t\tchart = animation.chart;\n\n\t\t\t\tanimation.currentStep = (animation.currentStep || 0) + count;\n\t\t\t\tanimation.currentStep = Math.min(animation.currentStep, animation.numSteps);\n\n\t\t\t\thelpers.callback(animation.render, [chart, animation], chart);\n\t\t\t\thelpers.callback(animation.onAnimationProgress, [animation], chart);\n\n\t\t\t\tif (animation.currentStep >= animation.numSteps) {\n\t\t\t\t\thelpers.callback(animation.onAnimationComplete, [animation], chart);\n\t\t\t\t\tchart.animating = false;\n\t\t\t\t\tanimations.splice(i, 1);\n\t\t\t\t} else {\n\t\t\t\t\t++i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Provided for backward compatibility, use Chart.Animation instead\n\t * @prop Chart.Animation#animationObject\n\t * @deprecated since version 2.6.0\n\t * @todo remove at version 3\n\t */\n\tObject.defineProperty(Chart.Animation.prototype, 'animationObject', {\n\t\tget: function() {\n\t\t\treturn this;\n\t\t}\n\t});\n\n\t/**\n\t * Provided for backward compatibility, use Chart.Animation#chart instead\n\t * @prop Chart.Animation#chartInstance\n\t * @deprecated since version 2.6.0\n\t * @todo remove at version 3\n\t */\n\tObject.defineProperty(Chart.Animation.prototype, 'chartInstance', {\n\t\tget: function() {\n\t\t\treturn this.chart;\n\t\t},\n\t\tset: function(value) {\n\t\t\tthis.chart = value;\n\t\t}\n\t});\n\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\t// Global Chart canvas helpers object for drawing items to canvas\n\tvar helpers = Chart.canvasHelpers = {};\n\n\thelpers.drawPoint = function(ctx, pointStyle, radius, x, y) {\n\t\tvar type, edgeLength, xOffset, yOffset, height, size;\n\n\t\tif (typeof pointStyle === 'object') {\n\t\t\ttype = pointStyle.toString();\n\t\t\tif (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n\t\t\t\tctx.drawImage(pointStyle, x - pointStyle.width / 2, y - pointStyle.height / 2, pointStyle.width, pointStyle.height);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (isNaN(radius) || radius <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch (pointStyle) {\n\t\t// Default includes circle\n\t\tdefault:\n\t\t\tctx.beginPath();\n\t\t\tctx.arc(x, y, radius, 0, Math.PI * 2);\n\t\t\tctx.closePath();\n\t\t\tctx.fill();\n\t\t\tbreak;\n\t\tcase 'triangle':\n\t\t\tctx.beginPath();\n\t\t\tedgeLength = 3 * radius / Math.sqrt(3);\n\t\t\theight = edgeLength * Math.sqrt(3) / 2;\n\t\t\tctx.moveTo(x - edgeLength / 2, y + height / 3);\n\t\t\tctx.lineTo(x + edgeLength / 2, y + height / 3);\n\t\t\tctx.lineTo(x, y - 2 * height / 3);\n\t\t\tctx.closePath();\n\t\t\tctx.fill();\n\t\t\tbreak;\n\t\tcase 'rect':\n\t\t\tsize = 1 / Math.SQRT2 * radius;\n\t\t\tctx.beginPath();\n\t\t\tctx.fillRect(x - size, y - size, 2 * size, 2 * size);\n\t\t\tctx.strokeRect(x - size, y - size, 2 * size, 2 * size);\n\t\t\tbreak;\n\t\tcase 'rectRounded':\n\t\t\tvar offset = radius / Math.SQRT2;\n\t\t\tvar leftX = x - offset;\n\t\t\tvar topY = y - offset;\n\t\t\tvar sideSize = Math.SQRT2 * radius;\n\t\t\tChart.helpers.drawRoundedRectangle(ctx, leftX, topY, sideSize, sideSize, radius / 2);\n\t\t\tctx.fill();\n\t\t\tbreak;\n\t\tcase 'rectRot':\n\t\t\tsize = 1 / Math.SQRT2 * radius;\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x - size, y);\n\t\t\tctx.lineTo(x, y + size);\n\t\t\tctx.lineTo(x + size, y);\n\t\t\tctx.lineTo(x, y - size);\n\t\t\tctx.closePath();\n\t\t\tctx.fill();\n\t\t\tbreak;\n\t\tcase 'cross':\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x, y + radius);\n\t\t\tctx.lineTo(x, y - radius);\n\t\t\tctx.moveTo(x - radius, y);\n\t\t\tctx.lineTo(x + radius, y);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\tcase 'crossRot':\n\t\t\tctx.beginPath();\n\t\t\txOffset = Math.cos(Math.PI / 4) * radius;\n\t\t\tyOffset = Math.sin(Math.PI / 4) * radius;\n\t\t\tctx.moveTo(x - xOffset, y - yOffset);\n\t\t\tctx.lineTo(x + xOffset, y + yOffset);\n\t\t\tctx.moveTo(x - xOffset, y + yOffset);\n\t\t\tctx.lineTo(x + xOffset, y - yOffset);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\tcase 'star':\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x, y + radius);\n\t\t\tctx.lineTo(x, y - radius);\n\t\t\tctx.moveTo(x - radius, y);\n\t\t\tctx.lineTo(x + radius, y);\n\t\t\txOffset = Math.cos(Math.PI / 4) * radius;\n\t\t\tyOffset = Math.sin(Math.PI / 4) * radius;\n\t\t\tctx.moveTo(x - xOffset, y - yOffset);\n\t\t\tctx.lineTo(x + xOffset, y + yOffset);\n\t\t\tctx.moveTo(x - xOffset, y + yOffset);\n\t\t\tctx.lineTo(x + xOffset, y - yOffset);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\tcase 'line':\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x - radius, y);\n\t\t\tctx.lineTo(x + radius, y);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\tcase 'dash':\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x, y);\n\t\t\tctx.lineTo(x + radius, y);\n\t\t\tctx.closePath();\n\t\t\tbreak;\n\t\t}\n\n\t\tctx.stroke();\n\t};\n\n\thelpers.clipArea = function(ctx, clipArea) {\n\t\tctx.save();\n\t\tctx.beginPath();\n\t\tctx.rect(clipArea.left, clipArea.top, clipArea.right - clipArea.left, clipArea.bottom - clipArea.top);\n\t\tctx.clip();\n\t};\n\n\thelpers.unclipArea = function(ctx) {\n\t\tctx.restore();\n\t};\n\n\thelpers.lineTo = function(ctx, previous, target, flip) {\n\t\tif (target.steppedLine) {\n\t\t\tif (target.steppedLine === 'after') {\n\t\t\t\tctx.lineTo(previous.x, target.y);\n\t\t\t} else {\n\t\t\t\tctx.lineTo(target.x, previous.y);\n\t\t\t}\n\t\t\tctx.lineTo(target.x, target.y);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!target.tension) {\n\t\t\tctx.lineTo(target.x, target.y);\n\t\t\treturn;\n\t\t}\n\n\t\tctx.bezierCurveTo(\n\t\t\tflip? previous.controlPointPreviousX : previous.controlPointNextX,\n\t\t\tflip? previous.controlPointPreviousY : previous.controlPointNextY,\n\t\t\tflip? target.controlPointNextX : target.controlPointPreviousX,\n\t\t\tflip? target.controlPointNextY : target.controlPointPreviousY,\n\t\t\ttarget.x,\n\t\t\ttarget.y);\n\t};\n\n\tChart.helpers.canvas = helpers;\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\tvar plugins = Chart.plugins;\n\tvar platform = Chart.platform;\n\n\t// Create a dictionary of chart types, to allow for extension of existing types\n\tChart.types = {};\n\n\t// Store a reference to each instance - allowing us to globally resize chart instances on window resize.\n\t// Destroy method on the chart will remove the instance of the chart from this reference.\n\tChart.instances = {};\n\n\t// Controllers available for dataset visualization eg. bar, line, slice, etc.\n\tChart.controllers = {};\n\n\t/**\n\t * Initializes the given config with global and chart default values.\n\t */\n\tfunction initConfig(config) {\n\t\tconfig = config || {};\n\n\t\t// Do NOT use configMerge() for the data object because this method merges arrays\n\t\t// and so would change references to labels and datasets, preventing data updates.\n\t\tvar data = config.data = config.data || {};\n\t\tdata.datasets = data.datasets || [];\n\t\tdata.labels = data.labels || [];\n\n\t\tconfig.options = helpers.configMerge(\n\t\t\tChart.defaults.global,\n\t\t\tChart.defaults[config.type],\n\t\t\tconfig.options || {});\n\n\t\treturn config;\n\t}\n\n\t/**\n\t * Updates the config of the chart\n\t * @param chart {Chart} chart to update the options for\n\t */\n\tfunction updateConfig(chart) {\n\t\tvar newOptions = chart.options;\n\n\t\t// Update Scale(s) with options\n\t\tif (newOptions.scale) {\n\t\t\tchart.scale.options = newOptions.scale;\n\t\t} else if (newOptions.scales) {\n\t\t\tnewOptions.scales.xAxes.concat(newOptions.scales.yAxes).forEach(function(scaleOptions) {\n\t\t\t\tchart.scales[scaleOptions.id].options = scaleOptions;\n\t\t\t});\n\t\t}\n\n\t\t// Tooltip\n\t\tchart.tooltip._options = newOptions.tooltips;\n\t}\n\n\tfunction positionIsHorizontal(position) {\n\t\treturn position === 'top' || position === 'bottom';\n\t}\n\n\thelpers.extend(Chart.prototype, /** @lends Chart */ {\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tconstruct: function(item, config) {\n\t\t\tvar me = this;\n\n\t\t\tconfig = initConfig(config);\n\n\t\t\tvar context = platform.acquireContext(item, config);\n\t\t\tvar canvas = context && context.canvas;\n\t\t\tvar height = canvas && canvas.height;\n\t\t\tvar width = canvas && canvas.width;\n\n\t\t\tme.id = helpers.uid();\n\t\t\tme.ctx = context;\n\t\t\tme.canvas = canvas;\n\t\t\tme.config = config;\n\t\t\tme.width = width;\n\t\t\tme.height = height;\n\t\t\tme.aspectRatio = height? width / height : null;\n\t\t\tme.options = config.options;\n\t\t\tme._bufferedRender = false;\n\n\t\t\t/**\n\t\t\t * Provided for backward compatibility, Chart and Chart.Controller have been merged,\n\t\t\t * the \"instance\" still need to be defined since it might be called from plugins.\n\t\t\t * @prop Chart#chart\n\t\t\t * @deprecated since version 2.6.0\n\t\t\t * @todo remove at version 3\n\t\t\t * @private\n\t\t\t */\n\t\t\tme.chart = me;\n\t\t\tme.controller = me;  // chart.chart.controller #inception\n\n\t\t\t// Add the chart instance to the global namespace\n\t\t\tChart.instances[me.id] = me;\n\n\t\t\t// Define alias to the config data: `chart.data === chart.config.data`\n\t\t\tObject.defineProperty(me, 'data', {\n\t\t\t\tget: function() {\n\t\t\t\t\treturn me.config.data;\n\t\t\t\t},\n\t\t\t\tset: function(value) {\n\t\t\t\t\tme.config.data = value;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (!context || !canvas) {\n\t\t\t\t// The given item is not a compatible context2d element, let's return before finalizing\n\t\t\t\t// the chart initialization but after setting basic chart / controller properties that\n\t\t\t\t// can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n\t\t\t\t// https://github.com/chartjs/Chart.js/issues/2807\n\t\t\t\tconsole.error(\"Failed to create chart: can't acquire context from the given item\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tme.initialize();\n\t\t\tme.update();\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tinitialize: function() {\n\t\t\tvar me = this;\n\n\t\t\t// Before init plugin notification\n\t\t\tplugins.notify(me, 'beforeInit');\n\n\t\t\thelpers.retinaScale(me);\n\n\t\t\tme.bindEvents();\n\n\t\t\tif (me.options.responsive) {\n\t\t\t\t// Initial resize before chart draws (must be silent to preserve initial animations).\n\t\t\t\tme.resize(true);\n\t\t\t}\n\n\t\t\t// Make sure scales have IDs and are built before we build any controllers.\n\t\t\tme.ensureScalesHaveIDs();\n\t\t\tme.buildScales();\n\t\t\tme.initToolTip();\n\n\t\t\t// After init plugin notification\n\t\t\tplugins.notify(me, 'afterInit');\n\n\t\t\treturn me;\n\t\t},\n\n\t\tclear: function() {\n\t\t\thelpers.clear(this);\n\t\t\treturn this;\n\t\t},\n\n\t\tstop: function() {\n\t\t\t// Stops any current animation loop occurring\n\t\t\tChart.animationService.cancelAnimation(this);\n\t\t\treturn this;\n\t\t},\n\n\t\tresize: function(silent) {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options;\n\t\t\tvar canvas = me.canvas;\n\t\t\tvar aspectRatio = (options.maintainAspectRatio && me.aspectRatio) || null;\n\n\t\t\t// the canvas render width and height will be casted to integers so make sure that\n\t\t\t// the canvas display style uses the same integer values to avoid blurring effect.\n\t\t\tvar newWidth = Math.floor(helpers.getMaximumWidth(canvas));\n\t\t\tvar newHeight = Math.floor(aspectRatio? newWidth / aspectRatio : helpers.getMaximumHeight(canvas));\n\n\t\t\tif (me.width === newWidth && me.height === newHeight) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcanvas.width = me.width = newWidth;\n\t\t\tcanvas.height = me.height = newHeight;\n\t\t\tcanvas.style.width = newWidth + 'px';\n\t\t\tcanvas.style.height = newHeight + 'px';\n\n\t\t\thelpers.retinaScale(me);\n\n\t\t\tif (!silent) {\n\t\t\t\t// Notify any plugins about the resize\n\t\t\t\tvar newSize = {width: newWidth, height: newHeight};\n\t\t\t\tplugins.notify(me, 'resize', [newSize]);\n\n\t\t\t\t// Notify of resize\n\t\t\t\tif (me.options.onResize) {\n\t\t\t\t\tme.options.onResize(me, newSize);\n\t\t\t\t}\n\n\t\t\t\tme.stop();\n\t\t\t\tme.update(me.options.responsiveAnimationDuration);\n\t\t\t}\n\t\t},\n\n\t\tensureScalesHaveIDs: function() {\n\t\t\tvar options = this.options;\n\t\t\tvar scalesOptions = options.scales || {};\n\t\t\tvar scaleOptions = options.scale;\n\n\t\t\thelpers.each(scalesOptions.xAxes, function(xAxisOptions, index) {\n\t\t\t\txAxisOptions.id = xAxisOptions.id || ('x-axis-' + index);\n\t\t\t});\n\n\t\t\thelpers.each(scalesOptions.yAxes, function(yAxisOptions, index) {\n\t\t\t\tyAxisOptions.id = yAxisOptions.id || ('y-axis-' + index);\n\t\t\t});\n\n\t\t\tif (scaleOptions) {\n\t\t\t\tscaleOptions.id = scaleOptions.id || 'scale';\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Builds a map of scale ID to scale object for future lookup.\n\t\t */\n\t\tbuildScales: function() {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options;\n\t\t\tvar scales = me.scales = {};\n\t\t\tvar items = [];\n\n\t\t\tif (options.scales) {\n\t\t\t\titems = items.concat(\n\t\t\t\t\t(options.scales.xAxes || []).map(function(xAxisOptions) {\n\t\t\t\t\t\treturn {options: xAxisOptions, dtype: 'category', dposition: 'bottom'};\n\t\t\t\t\t}),\n\t\t\t\t\t(options.scales.yAxes || []).map(function(yAxisOptions) {\n\t\t\t\t\t\treturn {options: yAxisOptions, dtype: 'linear', dposition: 'left'};\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (options.scale) {\n\t\t\t\titems.push({\n\t\t\t\t\toptions: options.scale,\n\t\t\t\t\tdtype: 'radialLinear',\n\t\t\t\t\tisDefault: true,\n\t\t\t\t\tdposition: 'chartArea'\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thelpers.each(items, function(item) {\n\t\t\t\tvar scaleOptions = item.options;\n\t\t\t\tvar scaleType = helpers.getValueOrDefault(scaleOptions.type, item.dtype);\n\t\t\t\tvar scaleClass = Chart.scaleService.getScaleConstructor(scaleType);\n\t\t\t\tif (!scaleClass) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) {\n\t\t\t\t\tscaleOptions.position = item.dposition;\n\t\t\t\t}\n\n\t\t\t\tvar scale = new scaleClass({\n\t\t\t\t\tid: scaleOptions.id,\n\t\t\t\t\toptions: scaleOptions,\n\t\t\t\t\tctx: me.ctx,\n\t\t\t\t\tchart: me\n\t\t\t\t});\n\n\t\t\t\tscales[scale.id] = scale;\n\n\t\t\t\t// TODO(SB): I think we should be able to remove this custom case (options.scale)\n\t\t\t\t// and consider it as a regular scale part of the \"scales\"\" map only! This would\n\t\t\t\t// make the logic easier and remove some useless? custom code.\n\t\t\t\tif (item.isDefault) {\n\t\t\t\t\tme.scale = scale;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tChart.scaleService.addScalesToLayout(this);\n\t\t},\n\n\t\tbuildOrUpdateControllers: function() {\n\t\t\tvar me = this;\n\t\t\tvar types = [];\n\t\t\tvar newControllers = [];\n\n\t\t\thelpers.each(me.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tvar meta = me.getDatasetMeta(datasetIndex);\n\t\t\t\tif (!meta.type) {\n\t\t\t\t\tmeta.type = dataset.type || me.config.type;\n\t\t\t\t}\n\n\t\t\t\ttypes.push(meta.type);\n\n\t\t\t\tif (meta.controller) {\n\t\t\t\t\tmeta.controller.updateIndex(datasetIndex);\n\t\t\t\t} else {\n\t\t\t\t\tvar ControllerClass = Chart.controllers[meta.type];\n\t\t\t\t\tif (ControllerClass === undefined) {\n\t\t\t\t\t\tthrow new Error('\"' + meta.type + '\" is not a chart type.');\n\t\t\t\t\t}\n\n\t\t\t\t\tmeta.controller = new ControllerClass(me, datasetIndex);\n\t\t\t\t\tnewControllers.push(meta.controller);\n\t\t\t\t}\n\t\t\t}, me);\n\n\t\t\tif (types.length > 1) {\n\t\t\t\tfor (var i = 1; i < types.length; i++) {\n\t\t\t\t\tif (types[i] !== types[i - 1]) {\n\t\t\t\t\t\tme.isCombo = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn newControllers;\n\t\t},\n\n\t\t/**\n\t\t * Reset the elements of all datasets\n\t\t * @private\n\t\t */\n\t\tresetElements: function() {\n\t\t\tvar me = this;\n\t\t\thelpers.each(me.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tme.getDatasetMeta(datasetIndex).controller.reset();\n\t\t\t}, me);\n\t\t},\n\n\t\t/**\n\t\t* Resets the chart back to it's state before the initial animation\n\t\t*/\n\t\treset: function() {\n\t\t\tthis.resetElements();\n\t\t\tthis.tooltip.initialize();\n\t\t},\n\n\t\tupdate: function(animationDuration, lazy) {\n\t\t\tvar me = this;\n\n\t\t\tupdateConfig(me);\n\n\t\t\tif (plugins.notify(me, 'beforeUpdate') === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// In case the entire data object changed\n\t\t\tme.tooltip._data = me.data;\n\n\t\t\t// Make sure dataset controllers are updated and new controllers are reset\n\t\t\tvar newControllers = me.buildOrUpdateControllers();\n\n\t\t\t// Make sure all dataset controllers have correct meta data counts\n\t\t\thelpers.each(me.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tme.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements();\n\t\t\t}, me);\n\n\t\t\tme.updateLayout();\n\n\t\t\t// Can only reset the new controllers after the scales have been updated\n\t\t\thelpers.each(newControllers, function(controller) {\n\t\t\t\tcontroller.reset();\n\t\t\t});\n\n\t\t\tme.updateDatasets();\n\n\t\t\t// Do this before render so that any plugins that need final scale updates can use it\n\t\t\tplugins.notify(me, 'afterUpdate');\n\n\t\t\tif (me._bufferedRender) {\n\t\t\t\tme._bufferedRequest = {\n\t\t\t\t\tlazy: lazy,\n\t\t\t\t\tduration: animationDuration\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tme.render(animationDuration, lazy);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n\t\t * hook, in which case, plugins will not be called on `afterLayout`.\n\t\t * @private\n\t\t */\n\t\tupdateLayout: function() {\n\t\t\tvar me = this;\n\n\t\t\tif (plugins.notify(me, 'beforeLayout') === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tChart.layoutService.update(this, this.width, this.height);\n\n\t\t\t/**\n\t\t\t * Provided for backward compatibility, use `afterLayout` instead.\n\t\t\t * @method IPlugin#afterScaleUpdate\n\t\t\t * @deprecated since version 2.5.0\n\t\t\t * @todo remove at version 3\n\t\t\t * @private\n\t\t\t */\n\t\t\tplugins.notify(me, 'afterScaleUpdate');\n\t\t\tplugins.notify(me, 'afterLayout');\n\t\t},\n\n\t\t/**\n\t\t * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n\t\t * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n\t\t * @private\n\t\t */\n\t\tupdateDatasets: function() {\n\t\t\tvar me = this;\n\n\t\t\tif (plugins.notify(me, 'beforeDatasetsUpdate') === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n\t\t\t\tme.updateDataset(i);\n\t\t\t}\n\n\t\t\tplugins.notify(me, 'afterDatasetsUpdate');\n\t\t},\n\n\t\t/**\n\t\t * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\n\t\t * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\n\t\t * @private\n\t\t */\n\t\tupdateDataset: function(index) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getDatasetMeta(index);\n\t\t\tvar args = {\n\t\t\t\tmeta: meta,\n\t\t\t\tindex: index\n\t\t\t};\n\n\t\t\tif (plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tmeta.controller.update();\n\n\t\t\tplugins.notify(me, 'afterDatasetUpdate', [args]);\n\t\t},\n\n\t\trender: function(duration, lazy) {\n\t\t\tvar me = this;\n\n\t\t\tif (plugins.notify(me, 'beforeRender') === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar animationOptions = me.options.animation;\n\t\t\tvar onComplete = function(animation) {\n\t\t\t\tplugins.notify(me, 'afterRender');\n\t\t\t\thelpers.callback(animationOptions && animationOptions.onComplete, [animation], me);\n\t\t\t};\n\n\t\t\tif (animationOptions && ((typeof duration !== 'undefined' && duration !== 0) || (typeof duration === 'undefined' && animationOptions.duration !== 0))) {\n\t\t\t\tvar animation = new Chart.Animation({\n\t\t\t\t\tnumSteps: (duration || animationOptions.duration) / 16.66, // 60 fps\n\t\t\t\t\teasing: animationOptions.easing,\n\n\t\t\t\t\trender: function(chart, animationObject) {\n\t\t\t\t\t\tvar easingFunction = helpers.easingEffects[animationObject.easing];\n\t\t\t\t\t\tvar currentStep = animationObject.currentStep;\n\t\t\t\t\t\tvar stepDecimal = currentStep / animationObject.numSteps;\n\n\t\t\t\t\t\tchart.draw(easingFunction(stepDecimal), stepDecimal, currentStep);\n\t\t\t\t\t},\n\n\t\t\t\t\tonAnimationProgress: animationOptions.onProgress,\n\t\t\t\t\tonAnimationComplete: onComplete\n\t\t\t\t});\n\n\t\t\t\tChart.animationService.addAnimation(me, animation, duration, lazy);\n\t\t\t} else {\n\t\t\t\tme.draw();\n\n\t\t\t\t// See https://github.com/chartjs/Chart.js/issues/3781\n\t\t\t\tonComplete(new Chart.Animation({numSteps: 0, chart: me}));\n\t\t\t}\n\n\t\t\treturn me;\n\t\t},\n\n\t\tdraw: function(easingValue) {\n\t\t\tvar me = this;\n\n\t\t\tme.clear();\n\n\t\t\tif (easingValue === undefined || easingValue === null) {\n\t\t\t\teasingValue = 1;\n\t\t\t}\n\n\t\t\tme.transition(easingValue);\n\n\t\t\tif (plugins.notify(me, 'beforeDraw', [easingValue]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Draw all the scales\n\t\t\thelpers.each(me.boxes, function(box) {\n\t\t\t\tbox.draw(me.chartArea);\n\t\t\t}, me);\n\n\t\t\tif (me.scale) {\n\t\t\t\tme.scale.draw();\n\t\t\t}\n\n\t\t\tme.drawDatasets(easingValue);\n\n\t\t\t// Finally draw the tooltip\n\t\t\tme.tooltip.draw();\n\n\t\t\tplugins.notify(me, 'afterDraw', [easingValue]);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\ttransition: function(easingValue) {\n\t\t\tvar me = this;\n\n\t\t\tfor (var i=0, ilen=(me.data.datasets || []).length; i<ilen; ++i) {\n\t\t\t\tif (me.isDatasetVisible(i)) {\n\t\t\t\t\tme.getDatasetMeta(i).controller.transition(easingValue);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.tooltip.transition(easingValue);\n\t\t},\n\n\t\t/**\n\t\t * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n\t\t * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n\t\t * @private\n\t\t */\n\t\tdrawDatasets: function(easingValue) {\n\t\t\tvar me = this;\n\n\t\t\tif (plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Draw datasets reversed to support proper line stacking\n\t\t\tfor (var i=(me.data.datasets || []).length - 1; i >= 0; --i) {\n\t\t\t\tif (me.isDatasetVisible(i)) {\n\t\t\t\t\tme.drawDataset(i, easingValue);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tplugins.notify(me, 'afterDatasetsDraw', [easingValue]);\n\t\t},\n\n\t\t/**\n\t\t * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\n\t\t * hook, in which case, plugins will not be called on `afterDatasetDraw`.\n\t\t * @private\n\t\t */\n\t\tdrawDataset: function(index, easingValue) {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getDatasetMeta(index);\n\t\t\tvar args = {\n\t\t\t\tmeta: meta,\n\t\t\t\tindex: index,\n\t\t\t\teasingValue: easingValue\n\t\t\t};\n\n\t\t\tif (plugins.notify(me, 'beforeDatasetDraw', [args]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tmeta.controller.draw(easingValue);\n\n\t\t\tplugins.notify(me, 'afterDatasetDraw', [args]);\n\t\t},\n\n\t\t// Get the single element that was clicked on\n\t\t// @return : An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw\n\t\tgetElementAtEvent: function(e) {\n\t\t\treturn Chart.Interaction.modes.single(this, e);\n\t\t},\n\n\t\tgetElementsAtEvent: function(e) {\n\t\t\treturn Chart.Interaction.modes.label(this, e, {intersect: true});\n\t\t},\n\n\t\tgetElementsAtXAxis: function(e) {\n\t\t\treturn Chart.Interaction.modes['x-axis'](this, e, {intersect: true});\n\t\t},\n\n\t\tgetElementsAtEventForMode: function(e, mode, options) {\n\t\t\tvar method = Chart.Interaction.modes[mode];\n\t\t\tif (typeof method === 'function') {\n\t\t\t\treturn method(this, e, options);\n\t\t\t}\n\n\t\t\treturn [];\n\t\t},\n\n\t\tgetDatasetAtEvent: function(e) {\n\t\t\treturn Chart.Interaction.modes.dataset(this, e, {intersect: true});\n\t\t},\n\n\t\tgetDatasetMeta: function(datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar dataset = me.data.datasets[datasetIndex];\n\t\t\tif (!dataset._meta) {\n\t\t\t\tdataset._meta = {};\n\t\t\t}\n\n\t\t\tvar meta = dataset._meta[me.id];\n\t\t\tif (!meta) {\n\t\t\t\tmeta = dataset._meta[me.id] = {\n\t\t\t\t\ttype: null,\n\t\t\t\t\tdata: [],\n\t\t\t\t\tdataset: null,\n\t\t\t\t\tcontroller: null,\n\t\t\t\t\thidden: null,\t\t\t// See isDatasetVisible() comment\n\t\t\t\t\txAxisID: null,\n\t\t\t\t\tyAxisID: null\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn meta;\n\t\t},\n\n\t\tgetVisibleDatasetCount: function() {\n\t\t\tvar count = 0;\n\t\t\tfor (var i = 0, ilen = this.data.datasets.length; i<ilen; ++i) {\n\t\t\t\tif (this.isDatasetVisible(i)) {\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn count;\n\t\t},\n\n\t\tisDatasetVisible: function(datasetIndex) {\n\t\t\tvar meta = this.getDatasetMeta(datasetIndex);\n\n\t\t\t// meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n\t\t\t// the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n\t\t\treturn typeof meta.hidden === 'boolean'? !meta.hidden : !this.data.datasets[datasetIndex].hidden;\n\t\t},\n\n\t\tgenerateLegend: function() {\n\t\t\treturn this.options.legendCallback(this);\n\t\t},\n\n\t\tdestroy: function() {\n\t\t\tvar me = this;\n\t\t\tvar canvas = me.canvas;\n\t\t\tvar meta, i, ilen;\n\n\t\t\tme.stop();\n\n\t\t\t// dataset controllers need to cleanup associated data\n\t\t\tfor (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n\t\t\t\tmeta = me.getDatasetMeta(i);\n\t\t\t\tif (meta.controller) {\n\t\t\t\t\tmeta.controller.destroy();\n\t\t\t\t\tmeta.controller = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (canvas) {\n\t\t\t\tme.unbindEvents();\n\t\t\t\thelpers.clear(me);\n\t\t\t\tplatform.releaseContext(me.ctx);\n\t\t\t\tme.canvas = null;\n\t\t\t\tme.ctx = null;\n\t\t\t}\n\n\t\t\tplugins.notify(me, 'destroy');\n\n\t\t\tdelete Chart.instances[me.id];\n\t\t},\n\n\t\ttoBase64Image: function() {\n\t\t\treturn this.canvas.toDataURL.apply(this.canvas, arguments);\n\t\t},\n\n\t\tinitToolTip: function() {\n\t\t\tvar me = this;\n\t\t\tme.tooltip = new Chart.Tooltip({\n\t\t\t\t_chart: me,\n\t\t\t\t_chartInstance: me,            // deprecated, backward compatibility\n\t\t\t\t_data: me.data,\n\t\t\t\t_options: me.options.tooltips\n\t\t\t}, me);\n\t\t\tme.tooltip.initialize();\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tbindEvents: function() {\n\t\t\tvar me = this;\n\t\t\tvar listeners = me._listeners = {};\n\t\t\tvar listener = function() {\n\t\t\t\tme.eventHandler.apply(me, arguments);\n\t\t\t};\n\n\t\t\thelpers.each(me.options.events, function(type) {\n\t\t\t\tplatform.addEventListener(me, type, listener);\n\t\t\t\tlisteners[type] = listener;\n\t\t\t});\n\n\t\t\t// Responsiveness is currently based on the use of an iframe, however this method causes\n\t\t\t// performance issues and could be troublesome when used with ad blockers. So make sure\n\t\t\t// that the user is still able to create a chart without iframe when responsive is false.\n\t\t\t// See https://github.com/chartjs/Chart.js/issues/2210\n\t\t\tif (me.options.responsive) {\n\t\t\t\tlistener = function() {\n\t\t\t\t\tme.resize();\n\t\t\t\t};\n\n\t\t\t\tplatform.addEventListener(me, 'resize', listener);\n\t\t\t\tlisteners.resize = listener;\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tunbindEvents: function() {\n\t\t\tvar me = this;\n\t\t\tvar listeners = me._listeners;\n\t\t\tif (!listeners) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdelete me._listeners;\n\t\t\thelpers.each(listeners, function(listener, type) {\n\t\t\t\tplatform.removeEventListener(me, type, listener);\n\t\t\t});\n\t\t},\n\n\t\tupdateHoverStyle: function(elements, mode, enabled) {\n\t\t\tvar method = enabled? 'setHoverStyle' : 'removeHoverStyle';\n\t\t\tvar element, i, ilen;\n\n\t\t\tfor (i=0, ilen=elements.length; i<ilen; ++i) {\n\t\t\t\telement = elements[i];\n\t\t\t\tif (element) {\n\t\t\t\t\tthis.getDatasetMeta(element._datasetIndex).controller[method](element);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\teventHandler: function(e) {\n\t\t\tvar me = this;\n\t\t\tvar tooltip = me.tooltip;\n\n\t\t\tif (plugins.notify(me, 'beforeEvent', [e]) === false) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Buffer any update calls so that renders do not occur\n\t\t\tme._bufferedRender = true;\n\t\t\tme._bufferedRequest = null;\n\n\t\t\tvar changed = me.handleEvent(e);\n\t\t\tchanged |= tooltip && tooltip.handleEvent(e);\n\n\t\t\tplugins.notify(me, 'afterEvent', [e]);\n\n\t\t\tvar bufferedRequest = me._bufferedRequest;\n\t\t\tif (bufferedRequest) {\n\t\t\t\t// If we have an update that was triggered, we need to do a normal render\n\t\t\t\tme.render(bufferedRequest.duration, bufferedRequest.lazy);\n\t\t\t} else if (changed && !me.animating) {\n\t\t\t\t// If entering, leaving, or changing elements, animate the change via pivot\n\t\t\t\tme.stop();\n\n\t\t\t\t// We only need to render at this point. Updating will cause scales to be\n\t\t\t\t// recomputed generating flicker & using more memory than necessary.\n\t\t\t\tme.render(me.options.hover.animationDuration, true);\n\t\t\t}\n\n\t\t\tme._bufferedRender = false;\n\t\t\tme._bufferedRequest = null;\n\n\t\t\treturn me;\n\t\t},\n\n\t\t/**\n\t\t * Handle an event\n\t\t * @private\n\t\t * @param {IEvent} event the event to handle\n\t\t * @return {Boolean} true if the chart needs to re-render\n\t\t */\n\t\thandleEvent: function(e) {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options || {};\n\t\t\tvar hoverOptions = options.hover;\n\t\t\tvar changed = false;\n\n\t\t\tme.lastActive = me.lastActive || [];\n\n\t\t\t// Find Active Elements for hover and tooltips\n\t\t\tif (e.type === 'mouseout') {\n\t\t\t\tme.active = [];\n\t\t\t} else {\n\t\t\t\tme.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions);\n\t\t\t}\n\n\t\t\t// On Hover hook\n\t\t\tif (hoverOptions.onHover) {\n\t\t\t\t// Need to call with native event here to not break backwards compatibility\n\t\t\t\thoverOptions.onHover.call(me, e.native, me.active);\n\t\t\t}\n\n\t\t\tif (e.type === 'mouseup' || e.type === 'click') {\n\t\t\t\tif (options.onClick) {\n\t\t\t\t\t// Use e.native here for backwards compatibility\n\t\t\t\t\toptions.onClick.call(me, e.native, me.active);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove styling for last active (even if it may still be active)\n\t\t\tif (me.lastActive.length) {\n\t\t\t\tme.updateHoverStyle(me.lastActive, hoverOptions.mode, false);\n\t\t\t}\n\n\t\t\t// Built in hover styling\n\t\t\tif (me.active.length && hoverOptions.mode) {\n\t\t\t\tme.updateHoverStyle(me.active, hoverOptions.mode, true);\n\t\t\t}\n\n\t\t\tchanged = !helpers.arrayEquals(me.active, me.lastActive);\n\n\t\t\t// Remember Last Actives\n\t\t\tme.lastActive = me.active;\n\n\t\t\treturn changed;\n\t\t}\n\t});\n\n\t/**\n\t * Provided for backward compatibility, use Chart instead.\n\t * @class Chart.Controller\n\t * @deprecated since version 2.6.0\n\t * @todo remove at version 3\n\t * @private\n\t */\n\tChart.Controller = Chart;\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tvar arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'];\n\n\t/**\n\t * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n\t * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n\t * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments.\n\t */\n\tfunction listenArrayEvents(array, listener) {\n\t\tif (array._chartjs) {\n\t\t\tarray._chartjs.listeners.push(listener);\n\t\t\treturn;\n\t\t}\n\n\t\tObject.defineProperty(array, '_chartjs', {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: false,\n\t\t\tvalue: {\n\t\t\t\tlisteners: [listener]\n\t\t\t}\n\t\t});\n\n\t\tarrayEvents.forEach(function(key) {\n\t\t\tvar method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1);\n\t\t\tvar base = array[key];\n\n\t\t\tObject.defineProperty(array, key, {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: false,\n\t\t\t\tvalue: function() {\n\t\t\t\t\tvar args = Array.prototype.slice.call(arguments);\n\t\t\t\t\tvar res = base.apply(this, args);\n\n\t\t\t\t\thelpers.each(array._chartjs.listeners, function(object) {\n\t\t\t\t\t\tif (typeof object[method] === 'function') {\n\t\t\t\t\t\t\tobject[method].apply(object, args);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\treturn res;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t/**\n\t * Removes the given array event listener and cleanup extra attached properties (such as\n\t * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n\t */\n\tfunction unlistenArrayEvents(array, listener) {\n\t\tvar stub = array._chartjs;\n\t\tif (!stub) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar listeners = stub.listeners;\n\t\tvar index = listeners.indexOf(listener);\n\t\tif (index !== -1) {\n\t\t\tlisteners.splice(index, 1);\n\t\t}\n\n\t\tif (listeners.length > 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tarrayEvents.forEach(function(key) {\n\t\t\tdelete array[key];\n\t\t});\n\n\t\tdelete array._chartjs;\n\t}\n\n\t// Base class for all dataset controllers (line, bar, etc)\n\tChart.DatasetController = function(chart, datasetIndex) {\n\t\tthis.initialize(chart, datasetIndex);\n\t};\n\n\thelpers.extend(Chart.DatasetController.prototype, {\n\n\t\t/**\n\t\t * Element type used to generate a meta dataset (e.g. Chart.element.Line).\n\t\t * @type {Chart.core.element}\n\t\t */\n\t\tdatasetElementType: null,\n\n\t\t/**\n\t\t * Element type used to generate a meta data (e.g. Chart.element.Point).\n\t\t * @type {Chart.core.element}\n\t\t */\n\t\tdataElementType: null,\n\n\t\tinitialize: function(chart, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tme.chart = chart;\n\t\t\tme.index = datasetIndex;\n\t\t\tme.linkScales();\n\t\t\tme.addElements();\n\t\t},\n\n\t\tupdateIndex: function(datasetIndex) {\n\t\t\tthis.index = datasetIndex;\n\t\t},\n\n\t\tlinkScales: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar dataset = me.getDataset();\n\n\t\t\tif (meta.xAxisID === null) {\n\t\t\t\tmeta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id;\n\t\t\t}\n\t\t\tif (meta.yAxisID === null) {\n\t\t\t\tmeta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id;\n\t\t\t}\n\t\t},\n\n\t\tgetDataset: function() {\n\t\t\treturn this.chart.data.datasets[this.index];\n\t\t},\n\n\t\tgetMeta: function() {\n\t\t\treturn this.chart.getDatasetMeta(this.index);\n\t\t},\n\n\t\tgetScaleForId: function(scaleID) {\n\t\t\treturn this.chart.scales[scaleID];\n\t\t},\n\n\t\treset: function() {\n\t\t\tthis.update(true);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tdestroy: function() {\n\t\t\tif (this._data) {\n\t\t\t\tunlistenArrayEvents(this._data, this);\n\t\t\t}\n\t\t},\n\n\t\tcreateMetaDataset: function() {\n\t\t\tvar me = this;\n\t\t\tvar type = me.datasetElementType;\n\t\t\treturn type && new type({\n\t\t\t\t_chart: me.chart,\n\t\t\t\t_datasetIndex: me.index\n\t\t\t});\n\t\t},\n\n\t\tcreateMetaData: function(index) {\n\t\t\tvar me = this;\n\t\t\tvar type = me.dataElementType;\n\t\t\treturn type && new type({\n\t\t\t\t_chart: me.chart,\n\t\t\t\t_datasetIndex: me.index,\n\t\t\t\t_index: index\n\t\t\t});\n\t\t},\n\n\t\taddElements: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar data = me.getDataset().data || [];\n\t\t\tvar metaData = meta.data;\n\t\t\tvar i, ilen;\n\n\t\t\tfor (i=0, ilen=data.length; i<ilen; ++i) {\n\t\t\t\tmetaData[i] = metaData[i] || me.createMetaData(i);\n\t\t\t}\n\n\t\t\tmeta.dataset = meta.dataset || me.createMetaDataset();\n\t\t},\n\n\t\taddElementAndReset: function(index) {\n\t\t\tvar element = this.createMetaData(index);\n\t\t\tthis.getMeta().data.splice(index, 0, element);\n\t\t\tthis.updateElement(element, index, true);\n\t\t},\n\n\t\tbuildOrUpdateElements: function() {\n\t\t\tvar me = this;\n\t\t\tvar dataset = me.getDataset();\n\t\t\tvar data = dataset.data || (dataset.data = []);\n\n\t\t\t// In order to correctly handle data addition/deletion animation (an thus simulate\n\t\t\t// real-time charts), we need to monitor these data modifications and synchronize\n\t\t\t// the internal meta data accordingly.\n\t\t\tif (me._data !== data) {\n\t\t\t\tif (me._data) {\n\t\t\t\t\t// This case happens when the user replaced the data array instance.\n\t\t\t\t\tunlistenArrayEvents(me._data, me);\n\t\t\t\t}\n\n\t\t\t\tlistenArrayEvents(data, me);\n\t\t\t\tme._data = data;\n\t\t\t}\n\n\t\t\t// Re-sync meta data in case the user replaced the data array or if we missed\n\t\t\t// any updates and so make sure that we handle number of datapoints changing.\n\t\t\tme.resyncElements();\n\t\t},\n\n\t\tupdate: helpers.noop,\n\n\t\ttransition: function(easingValue) {\n\t\t\tvar meta = this.getMeta();\n\t\t\tvar elements = meta.data || [];\n\t\t\tvar ilen = elements.length;\n\t\t\tvar i = 0;\n\n\t\t\tfor (; i<ilen; ++i) {\n\t\t\t\telements[i].transition(easingValue);\n\t\t\t}\n\n\t\t\tif (meta.dataset) {\n\t\t\t\tmeta.dataset.transition(easingValue);\n\t\t\t}\n\t\t},\n\n\t\tdraw: function() {\n\t\t\tvar meta = this.getMeta();\n\t\t\tvar elements = meta.data || [];\n\t\t\tvar ilen = elements.length;\n\t\t\tvar i = 0;\n\n\t\t\tif (meta.dataset) {\n\t\t\t\tmeta.dataset.draw();\n\t\t\t}\n\n\t\t\tfor (; i<ilen; ++i) {\n\t\t\t\telements[i].draw();\n\t\t\t}\n\t\t},\n\n\t\tremoveHoverStyle: function(element, elementOpts) {\n\t\t\tvar dataset = this.chart.data.datasets[element._datasetIndex],\n\t\t\t\tindex = element._index,\n\t\t\t\tcustom = element.custom || {},\n\t\t\t\tvalueOrDefault = helpers.getValueAtIndexOrDefault,\n\t\t\t\tmodel = element._model;\n\n\t\t\tmodel.backgroundColor = custom.backgroundColor ? custom.backgroundColor : valueOrDefault(dataset.backgroundColor, index, elementOpts.backgroundColor);\n\t\t\tmodel.borderColor = custom.borderColor ? custom.borderColor : valueOrDefault(dataset.borderColor, index, elementOpts.borderColor);\n\t\t\tmodel.borderWidth = custom.borderWidth ? custom.borderWidth : valueOrDefault(dataset.borderWidth, index, elementOpts.borderWidth);\n\t\t},\n\n\t\tsetHoverStyle: function(element) {\n\t\t\tvar dataset = this.chart.data.datasets[element._datasetIndex],\n\t\t\t\tindex = element._index,\n\t\t\t\tcustom = element.custom || {},\n\t\t\t\tvalueOrDefault = helpers.getValueAtIndexOrDefault,\n\t\t\t\tgetHoverColor = helpers.getHoverColor,\n\t\t\t\tmodel = element._model;\n\n\t\t\tmodel.backgroundColor = custom.hoverBackgroundColor ? custom.hoverBackgroundColor : valueOrDefault(dataset.hoverBackgroundColor, index, getHoverColor(model.backgroundColor));\n\t\t\tmodel.borderColor = custom.hoverBorderColor ? custom.hoverBorderColor : valueOrDefault(dataset.hoverBorderColor, index, getHoverColor(model.borderColor));\n\t\t\tmodel.borderWidth = custom.hoverBorderWidth ? custom.hoverBorderWidth : valueOrDefault(dataset.hoverBorderWidth, index, model.borderWidth);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tresyncElements: function() {\n\t\t\tvar me = this;\n\t\t\tvar meta = me.getMeta();\n\t\t\tvar data = me.getDataset().data;\n\t\t\tvar numMeta = meta.data.length;\n\t\t\tvar numData = data.length;\n\n\t\t\tif (numData < numMeta) {\n\t\t\t\tmeta.data.splice(numData, numMeta - numData);\n\t\t\t} else if (numData > numMeta) {\n\t\t\t\tme.insertElements(numMeta, numData - numMeta);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tinsertElements: function(start, count) {\n\t\t\tfor (var i=0; i<count; ++i) {\n\t\t\t\tthis.addElementAndReset(start + i);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataPush: function() {\n\t\t\tthis.insertElements(this.getDataset().data.length-1, arguments.length);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataPop: function() {\n\t\t\tthis.getMeta().data.pop();\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataShift: function() {\n\t\t\tthis.getMeta().data.shift();\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataSplice: function(start, count) {\n\t\t\tthis.getMeta().data.splice(start, count);\n\t\t\tthis.insertElements(start, arguments.length - 2);\n\t\t},\n\n\t\t/**\n\t\t * @private\n\t\t */\n\t\tonDataUnshift: function() {\n\t\t\tthis.insertElements(0, arguments.length);\n\t\t}\n\t});\n\n\tChart.DatasetController.extend = helpers.inherits;\n};\n",
    "'use strict';\n\nvar color = require('chartjs-color');\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tfunction interpolate(start, view, model, ease) {\n\t\tvar keys = Object.keys(model);\n\t\tvar i, ilen, key, actual, origin, target, type, c0, c1;\n\n\t\tfor (i=0, ilen=keys.length; i<ilen; ++i) {\n\t\t\tkey = keys[i];\n\n\t\t\ttarget = model[key];\n\n\t\t\t// if a value is added to the model after pivot() has been called, the view\n\t\t\t// doesn't contain it, so let's initialize the view to the target value.\n\t\t\tif (!view.hasOwnProperty(key)) {\n\t\t\t\tview[key] = target;\n\t\t\t}\n\n\t\t\tactual = view[key];\n\n\t\t\tif (actual === target || key[0] === '_') {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!start.hasOwnProperty(key)) {\n\t\t\t\tstart[key] = actual;\n\t\t\t}\n\n\t\t\torigin = start[key];\n\n\t\t\ttype = typeof(target);\n\n\t\t\tif (type === typeof(origin)) {\n\t\t\t\tif (type === 'string') {\n\t\t\t\t\tc0 = color(origin);\n\t\t\t\t\tif (c0.valid) {\n\t\t\t\t\t\tc1 = color(target);\n\t\t\t\t\t\tif (c1.valid) {\n\t\t\t\t\t\t\tview[key] = c1.mix(c0, ease).rgbString();\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (type === 'number' && isFinite(origin) && isFinite(target)) {\n\t\t\t\t\tview[key] = origin + (target - origin) * ease;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tview[key] = target;\n\t\t}\n\t}\n\n\tChart.elements = {};\n\n\tChart.Element = function(configuration) {\n\t\thelpers.extend(this, configuration);\n\t\tthis.initialize.apply(this, arguments);\n\t};\n\n\thelpers.extend(Chart.Element.prototype, {\n\n\t\tinitialize: function() {\n\t\t\tthis.hidden = false;\n\t\t},\n\n\t\tpivot: function() {\n\t\t\tvar me = this;\n\t\t\tif (!me._view) {\n\t\t\t\tme._view = helpers.clone(me._model);\n\t\t\t}\n\t\t\tme._start = {};\n\t\t\treturn me;\n\t\t},\n\n\t\ttransition: function(ease) {\n\t\t\tvar me = this;\n\t\t\tvar model = me._model;\n\t\t\tvar start = me._start;\n\t\t\tvar view = me._view;\n\n\t\t\t// No animation -> No Transition\n\t\t\tif (!model || ease === 1) {\n\t\t\t\tme._view = model;\n\t\t\t\tme._start = null;\n\t\t\t\treturn me;\n\t\t\t}\n\n\t\t\tif (!view) {\n\t\t\t\tview = me._view = {};\n\t\t\t}\n\n\t\t\tif (!start) {\n\t\t\t\tstart = me._start = {};\n\t\t\t}\n\n\t\t\tinterpolate(start, view, model, ease);\n\n\t\t\treturn me;\n\t\t},\n\n\t\ttooltipPosition: function() {\n\t\t\treturn {\n\t\t\t\tx: this._model.x,\n\t\t\t\ty: this._model.y\n\t\t\t};\n\t\t},\n\n\t\thasValue: function() {\n\t\t\treturn helpers.isNumber(this._model.x) && helpers.isNumber(this._model.y);\n\t\t}\n\t});\n\n\tChart.Element.extend = helpers.inherits;\n};\n",
    "/* global window: false */\n/* global document: false */\n'use strict';\n\nvar color = require('chartjs-color');\n\nmodule.exports = function(Chart) {\n\t// Global Chart helpers object for utility methods and classes\n\tvar helpers = Chart.helpers = {};\n\n\t// -- Basic js utility methods\n\thelpers.each = function(loopable, callback, self, reverse) {\n\t\t// Check to see if null or undefined firstly.\n\t\tvar i, len;\n\t\tif (helpers.isArray(loopable)) {\n\t\t\tlen = loopable.length;\n\t\t\tif (reverse) {\n\t\t\t\tfor (i = len - 1; i >= 0; i--) {\n\t\t\t\t\tcallback.call(self, loopable[i], i);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\t\tcallback.call(self, loopable[i], i);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (typeof loopable === 'object') {\n\t\t\tvar keys = Object.keys(loopable);\n\t\t\tlen = keys.length;\n\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\tcallback.call(self, loopable[keys[i]], keys[i]);\n\t\t\t}\n\t\t}\n\t};\n\thelpers.clone = function(obj) {\n\t\tvar objClone = {};\n\t\thelpers.each(obj, function(value, key) {\n\t\t\tif (helpers.isArray(value)) {\n\t\t\t\tobjClone[key] = value.slice(0);\n\t\t\t} else if (typeof value === 'object' && value !== null) {\n\t\t\t\tobjClone[key] = helpers.clone(value);\n\t\t\t} else {\n\t\t\t\tobjClone[key] = value;\n\t\t\t}\n\t\t});\n\t\treturn objClone;\n\t};\n\thelpers.extend = function(base) {\n\t\tvar setFn = function(value, key) {\n\t\t\tbase[key] = value;\n\t\t};\n\t\tfor (var i = 1, ilen = arguments.length; i < ilen; i++) {\n\t\t\thelpers.each(arguments[i], setFn);\n\t\t}\n\t\treturn base;\n\t};\n\t// Need a special merge function to chart configs since they are now grouped\n\thelpers.configMerge = function(_base) {\n\t\tvar base = helpers.clone(_base);\n\t\thelpers.each(Array.prototype.slice.call(arguments, 1), function(extension) {\n\t\t\thelpers.each(extension, function(value, key) {\n\t\t\t\tvar baseHasProperty = base.hasOwnProperty(key);\n\t\t\t\tvar baseVal = baseHasProperty ? base[key] : {};\n\n\t\t\t\tif (key === 'scales') {\n\t\t\t\t\t// Scale config merging is complex. Add our own function here for that\n\t\t\t\t\tbase[key] = helpers.scaleMerge(baseVal, value);\n\t\t\t\t} else if (key === 'scale') {\n\t\t\t\t\t// Used in polar area & radar charts since there is only one scale\n\t\t\t\t\tbase[key] = helpers.configMerge(baseVal, Chart.scaleService.getScaleDefaults(value.type), value);\n\t\t\t\t} else if (baseHasProperty\n\t\t\t\t\t\t&& typeof baseVal === 'object'\n\t\t\t\t\t\t&& !helpers.isArray(baseVal)\n\t\t\t\t\t\t&& baseVal !== null\n\t\t\t\t\t\t&& typeof value === 'object'\n\t\t\t\t\t\t&& !helpers.isArray(value)) {\n\t\t\t\t\t// If we are overwriting an object with an object, do a merge of the properties.\n\t\t\t\t\tbase[key] = helpers.configMerge(baseVal, value);\n\t\t\t\t} else {\n\t\t\t\t\t// can just overwrite the value in this case\n\t\t\t\t\tbase[key] = value;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\treturn base;\n\t};\n\thelpers.scaleMerge = function(_base, extension) {\n\t\tvar base = helpers.clone(_base);\n\n\t\thelpers.each(extension, function(value, key) {\n\t\t\tif (key === 'xAxes' || key === 'yAxes') {\n\t\t\t\t// These properties are arrays of items\n\t\t\t\tif (base.hasOwnProperty(key)) {\n\t\t\t\t\thelpers.each(value, function(valueObj, index) {\n\t\t\t\t\t\tvar axisType = helpers.getValueOrDefault(valueObj.type, key === 'xAxes' ? 'category' : 'linear');\n\t\t\t\t\t\tvar axisDefaults = Chart.scaleService.getScaleDefaults(axisType);\n\t\t\t\t\t\tif (index >= base[key].length || !base[key][index].type) {\n\t\t\t\t\t\t\tbase[key].push(helpers.configMerge(axisDefaults, valueObj));\n\t\t\t\t\t\t} else if (valueObj.type && valueObj.type !== base[key][index].type) {\n\t\t\t\t\t\t\t// Type changed. Bring in the new defaults before we bring in valueObj so that valueObj can override the correct scale defaults\n\t\t\t\t\t\t\tbase[key][index] = helpers.configMerge(base[key][index], axisDefaults, valueObj);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Type is the same\n\t\t\t\t\t\t\tbase[key][index] = helpers.configMerge(base[key][index], valueObj);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tbase[key] = [];\n\t\t\t\t\thelpers.each(value, function(valueObj) {\n\t\t\t\t\t\tvar axisType = helpers.getValueOrDefault(valueObj.type, key === 'xAxes' ? 'category' : 'linear');\n\t\t\t\t\t\tbase[key].push(helpers.configMerge(Chart.scaleService.getScaleDefaults(axisType), valueObj));\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else if (base.hasOwnProperty(key) && typeof base[key] === 'object' && base[key] !== null && typeof value === 'object') {\n\t\t\t\t// If we are overwriting an object with an object, do a merge of the properties.\n\t\t\t\tbase[key] = helpers.configMerge(base[key], value);\n\n\t\t\t} else {\n\t\t\t\t// can just overwrite the value in this case\n\t\t\t\tbase[key] = value;\n\t\t\t}\n\t\t});\n\n\t\treturn base;\n\t};\n\thelpers.getValueAtIndexOrDefault = function(value, index, defaultValue) {\n\t\tif (value === undefined || value === null) {\n\t\t\treturn defaultValue;\n\t\t}\n\n\t\tif (helpers.isArray(value)) {\n\t\t\treturn index < value.length ? value[index] : defaultValue;\n\t\t}\n\n\t\treturn value;\n\t};\n\thelpers.getValueOrDefault = function(value, defaultValue) {\n\t\treturn value === undefined ? defaultValue : value;\n\t};\n\thelpers.indexOf = Array.prototype.indexOf?\n\t\tfunction(array, item) {\n\t\t\treturn array.indexOf(item);\n\t\t}:\n\t\tfunction(array, item) {\n\t\t\tfor (var i = 0, ilen = array.length; i < ilen; ++i) {\n\t\t\t\tif (array[i] === item) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn -1;\n\t\t};\n\thelpers.where = function(collection, filterCallback) {\n\t\tif (helpers.isArray(collection) && Array.prototype.filter) {\n\t\t\treturn collection.filter(filterCallback);\n\t\t}\n\t\tvar filtered = [];\n\n\t\thelpers.each(collection, function(item) {\n\t\t\tif (filterCallback(item)) {\n\t\t\t\tfiltered.push(item);\n\t\t\t}\n\t\t});\n\n\t\treturn filtered;\n\t};\n\thelpers.findIndex = Array.prototype.findIndex?\n\t\tfunction(array, callback, scope) {\n\t\t\treturn array.findIndex(callback, scope);\n\t\t} :\n\t\tfunction(array, callback, scope) {\n\t\t\tscope = scope === undefined? array : scope;\n\t\t\tfor (var i = 0, ilen = array.length; i < ilen; ++i) {\n\t\t\t\tif (callback.call(scope, array[i], i, array)) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn -1;\n\t\t};\n\thelpers.findNextWhere = function(arrayToSearch, filterCallback, startIndex) {\n\t\t// Default to start of the array\n\t\tif (startIndex === undefined || startIndex === null) {\n\t\t\tstartIndex = -1;\n\t\t}\n\t\tfor (var i = startIndex + 1; i < arrayToSearch.length; i++) {\n\t\t\tvar currentItem = arrayToSearch[i];\n\t\t\tif (filterCallback(currentItem)) {\n\t\t\t\treturn currentItem;\n\t\t\t}\n\t\t}\n\t};\n\thelpers.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) {\n\t\t// Default to end of the array\n\t\tif (startIndex === undefined || startIndex === null) {\n\t\t\tstartIndex = arrayToSearch.length;\n\t\t}\n\t\tfor (var i = startIndex - 1; i >= 0; i--) {\n\t\t\tvar currentItem = arrayToSearch[i];\n\t\t\tif (filterCallback(currentItem)) {\n\t\t\t\treturn currentItem;\n\t\t\t}\n\t\t}\n\t};\n\thelpers.inherits = function(extensions) {\n\t\t// Basic javascript inheritance based on the model created in Backbone.js\n\t\tvar me = this;\n\t\tvar ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function() {\n\t\t\treturn me.apply(this, arguments);\n\t\t};\n\n\t\tvar Surrogate = function() {\n\t\t\tthis.constructor = ChartElement;\n\t\t};\n\t\tSurrogate.prototype = me.prototype;\n\t\tChartElement.prototype = new Surrogate();\n\n\t\tChartElement.extend = helpers.inherits;\n\n\t\tif (extensions) {\n\t\t\thelpers.extend(ChartElement.prototype, extensions);\n\t\t}\n\n\t\tChartElement.__super__ = me.prototype;\n\n\t\treturn ChartElement;\n\t};\n\thelpers.noop = function() {};\n\thelpers.uid = (function() {\n\t\tvar id = 0;\n\t\treturn function() {\n\t\t\treturn id++;\n\t\t};\n\t}());\n\t// -- Math methods\n\thelpers.isNumber = function(n) {\n\t\treturn !isNaN(parseFloat(n)) && isFinite(n);\n\t};\n\thelpers.almostEquals = function(x, y, epsilon) {\n\t\treturn Math.abs(x - y) < epsilon;\n\t};\n\thelpers.almostWhole = function(x, epsilon) {\n\t\tvar rounded = Math.round(x);\n\t\treturn (((rounded - epsilon) < x) && ((rounded + epsilon) > x));\n\t};\n\thelpers.max = function(array) {\n\t\treturn array.reduce(function(max, value) {\n\t\t\tif (!isNaN(value)) {\n\t\t\t\treturn Math.max(max, value);\n\t\t\t}\n\t\t\treturn max;\n\t\t}, Number.NEGATIVE_INFINITY);\n\t};\n\thelpers.min = function(array) {\n\t\treturn array.reduce(function(min, value) {\n\t\t\tif (!isNaN(value)) {\n\t\t\t\treturn Math.min(min, value);\n\t\t\t}\n\t\t\treturn min;\n\t\t}, Number.POSITIVE_INFINITY);\n\t};\n\thelpers.sign = Math.sign?\n\t\tfunction(x) {\n\t\t\treturn Math.sign(x);\n\t\t} :\n\t\tfunction(x) {\n\t\t\tx = +x; // convert to a number\n\t\t\tif (x === 0 || isNaN(x)) {\n\t\t\t\treturn x;\n\t\t\t}\n\t\t\treturn x > 0 ? 1 : -1;\n\t\t};\n\thelpers.log10 = Math.log10?\n\t\tfunction(x) {\n\t\t\treturn Math.log10(x);\n\t\t} :\n\t\tfunction(x) {\n\t\t\treturn Math.log(x) / Math.LN10;\n\t\t};\n\thelpers.toRadians = function(degrees) {\n\t\treturn degrees * (Math.PI / 180);\n\t};\n\thelpers.toDegrees = function(radians) {\n\t\treturn radians * (180 / Math.PI);\n\t};\n\t// Gets the angle from vertical upright to the point about a centre.\n\thelpers.getAngleFromPoint = function(centrePoint, anglePoint) {\n\t\tvar distanceFromXCenter = anglePoint.x - centrePoint.x,\n\t\t\tdistanceFromYCenter = anglePoint.y - centrePoint.y,\n\t\t\tradialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n\t\tvar angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n\t\tif (angle < (-0.5 * Math.PI)) {\n\t\t\tangle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n\t\t}\n\n\t\treturn {\n\t\t\tangle: angle,\n\t\t\tdistance: radialDistanceFromCenter\n\t\t};\n\t};\n\thelpers.distanceBetweenPoints = function(pt1, pt2) {\n\t\treturn Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n\t};\n\thelpers.aliasPixel = function(pixelWidth) {\n\t\treturn (pixelWidth % 2 === 0) ? 0 : 0.5;\n\t};\n\thelpers.splineCurve = function(firstPoint, middlePoint, afterPoint, t) {\n\t\t// Props to Rob Spencer at scaled innovation for his post on splining between points\n\t\t// http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n\t\t// This function must also respect \"skipped\" points\n\n\t\tvar previous = firstPoint.skip ? middlePoint : firstPoint,\n\t\t\tcurrent = middlePoint,\n\t\t\tnext = afterPoint.skip ? middlePoint : afterPoint;\n\n\t\tvar d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2));\n\t\tvar d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2));\n\n\t\tvar s01 = d01 / (d01 + d12);\n\t\tvar s12 = d12 / (d01 + d12);\n\n\t\t// If all points are the same, s01 & s02 will be inf\n\t\ts01 = isNaN(s01) ? 0 : s01;\n\t\ts12 = isNaN(s12) ? 0 : s12;\n\n\t\tvar fa = t * s01; // scaling factor for triangle Ta\n\t\tvar fb = t * s12;\n\n\t\treturn {\n\t\t\tprevious: {\n\t\t\t\tx: current.x - fa * (next.x - previous.x),\n\t\t\t\ty: current.y - fa * (next.y - previous.y)\n\t\t\t},\n\t\t\tnext: {\n\t\t\t\tx: current.x + fb * (next.x - previous.x),\n\t\t\t\ty: current.y + fb * (next.y - previous.y)\n\t\t\t}\n\t\t};\n\t};\n\thelpers.EPSILON = Number.EPSILON || 1e-14;\n\thelpers.splineCurveMonotone = function(points) {\n\t\t// This function calculates Bézier control points in a similar way than |splineCurve|,\n\t\t// but preserves monotonicity of the provided data and ensures no local extremums are added\n\t\t// between the dataset discrete points due to the interpolation.\n\t\t// See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n\n\t\tvar pointsWithTangents = (points || []).map(function(point) {\n\t\t\treturn {\n\t\t\t\tmodel: point._model,\n\t\t\t\tdeltaK: 0,\n\t\t\t\tmK: 0\n\t\t\t};\n\t\t});\n\n\t\t// Calculate slopes (deltaK) and initialize tangents (mK)\n\t\tvar pointsLen = pointsWithTangents.length;\n\t\tvar i, pointBefore, pointCurrent, pointAfter;\n\t\tfor (i = 0; i < pointsLen; ++i) {\n\t\t\tpointCurrent = pointsWithTangents[i];\n\t\t\tif (pointCurrent.model.skip) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tpointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\n\t\t\tpointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\n\t\t\tif (pointAfter && !pointAfter.model.skip) {\n\t\t\t\tvar slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x);\n\n\t\t\t\t// In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n\t\t\t\tpointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0;\n\t\t\t}\n\n\t\t\tif (!pointBefore || pointBefore.model.skip) {\n\t\t\t\tpointCurrent.mK = pointCurrent.deltaK;\n\t\t\t} else if (!pointAfter || pointAfter.model.skip) {\n\t\t\t\tpointCurrent.mK = pointBefore.deltaK;\n\t\t\t} else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) {\n\t\t\t\tpointCurrent.mK = 0;\n\t\t\t} else {\n\t\t\t\tpointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2;\n\t\t\t}\n\t\t}\n\n\t\t// Adjust tangents to ensure monotonic properties\n\t\tvar alphaK, betaK, tauK, squaredMagnitude;\n\t\tfor (i = 0; i < pointsLen - 1; ++i) {\n\t\t\tpointCurrent = pointsWithTangents[i];\n\t\t\tpointAfter = pointsWithTangents[i + 1];\n\t\t\tif (pointCurrent.model.skip || pointAfter.model.skip) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (helpers.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) {\n\t\t\t\tpointCurrent.mK = pointAfter.mK = 0;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\talphaK = pointCurrent.mK / pointCurrent.deltaK;\n\t\t\tbetaK = pointAfter.mK / pointCurrent.deltaK;\n\t\t\tsquaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n\t\t\tif (squaredMagnitude <= 9) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ttauK = 3 / Math.sqrt(squaredMagnitude);\n\t\t\tpointCurrent.mK = alphaK * tauK * pointCurrent.deltaK;\n\t\t\tpointAfter.mK = betaK * tauK * pointCurrent.deltaK;\n\t\t}\n\n\t\t// Compute control points\n\t\tvar deltaX;\n\t\tfor (i = 0; i < pointsLen; ++i) {\n\t\t\tpointCurrent = pointsWithTangents[i];\n\t\t\tif (pointCurrent.model.skip) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tpointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\n\t\t\tpointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\n\t\t\tif (pointBefore && !pointBefore.model.skip) {\n\t\t\t\tdeltaX = (pointCurrent.model.x - pointBefore.model.x) / 3;\n\t\t\t\tpointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX;\n\t\t\t\tpointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK;\n\t\t\t}\n\t\t\tif (pointAfter && !pointAfter.model.skip) {\n\t\t\t\tdeltaX = (pointAfter.model.x - pointCurrent.model.x) / 3;\n\t\t\t\tpointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX;\n\t\t\t\tpointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK;\n\t\t\t}\n\t\t}\n\t};\n\thelpers.nextItem = function(collection, index, loop) {\n\t\tif (loop) {\n\t\t\treturn index >= collection.length - 1 ? collection[0] : collection[index + 1];\n\t\t}\n\t\treturn index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1];\n\t};\n\thelpers.previousItem = function(collection, index, loop) {\n\t\tif (loop) {\n\t\t\treturn index <= 0 ? collection[collection.length - 1] : collection[index - 1];\n\t\t}\n\t\treturn index <= 0 ? collection[0] : collection[index - 1];\n\t};\n\t// Implementation of the nice number algorithm used in determining where axis labels will go\n\thelpers.niceNum = function(range, round) {\n\t\tvar exponent = Math.floor(helpers.log10(range));\n\t\tvar fraction = range / Math.pow(10, exponent);\n\t\tvar niceFraction;\n\n\t\tif (round) {\n\t\t\tif (fraction < 1.5) {\n\t\t\t\tniceFraction = 1;\n\t\t\t} else if (fraction < 3) {\n\t\t\t\tniceFraction = 2;\n\t\t\t} else if (fraction < 7) {\n\t\t\t\tniceFraction = 5;\n\t\t\t} else {\n\t\t\t\tniceFraction = 10;\n\t\t\t}\n\t\t} else if (fraction <= 1.0) {\n\t\t\tniceFraction = 1;\n\t\t} else if (fraction <= 2) {\n\t\t\tniceFraction = 2;\n\t\t} else if (fraction <= 5) {\n\t\t\tniceFraction = 5;\n\t\t} else {\n\t\t\tniceFraction = 10;\n\t\t}\n\n\t\treturn niceFraction * Math.pow(10, exponent);\n\t};\n\t// Easing functions adapted from Robert Penner's easing equations\n\t// http://www.robertpenner.com/easing/\n\tvar easingEffects = helpers.easingEffects = {\n\t\tlinear: function(t) {\n\t\t\treturn t;\n\t\t},\n\t\teaseInQuad: function(t) {\n\t\t\treturn t * t;\n\t\t},\n\t\teaseOutQuad: function(t) {\n\t\t\treturn -1 * t * (t - 2);\n\t\t},\n\t\teaseInOutQuad: function(t) {\n\t\t\tif ((t /= 1 / 2) < 1) {\n\t\t\t\treturn 1 / 2 * t * t;\n\t\t\t}\n\t\t\treturn -1 / 2 * ((--t) * (t - 2) - 1);\n\t\t},\n\t\teaseInCubic: function(t) {\n\t\t\treturn t * t * t;\n\t\t},\n\t\teaseOutCubic: function(t) {\n\t\t\treturn 1 * ((t = t / 1 - 1) * t * t + 1);\n\t\t},\n\t\teaseInOutCubic: function(t) {\n\t\t\tif ((t /= 1 / 2) < 1) {\n\t\t\t\treturn 1 / 2 * t * t * t;\n\t\t\t}\n\t\t\treturn 1 / 2 * ((t -= 2) * t * t + 2);\n\t\t},\n\t\teaseInQuart: function(t) {\n\t\t\treturn t * t * t * t;\n\t\t},\n\t\teaseOutQuart: function(t) {\n\t\t\treturn -1 * ((t = t / 1 - 1) * t * t * t - 1);\n\t\t},\n\t\teaseInOutQuart: function(t) {\n\t\t\tif ((t /= 1 / 2) < 1) {\n\t\t\t\treturn 1 / 2 * t * t * t * t;\n\t\t\t}\n\t\t\treturn -1 / 2 * ((t -= 2) * t * t * t - 2);\n\t\t},\n\t\teaseInQuint: function(t) {\n\t\t\treturn 1 * (t /= 1) * t * t * t * t;\n\t\t},\n\t\teaseOutQuint: function(t) {\n\t\t\treturn 1 * ((t = t / 1 - 1) * t * t * t * t + 1);\n\t\t},\n\t\teaseInOutQuint: function(t) {\n\t\t\tif ((t /= 1 / 2) < 1) {\n\t\t\t\treturn 1 / 2 * t * t * t * t * t;\n\t\t\t}\n\t\t\treturn 1 / 2 * ((t -= 2) * t * t * t * t + 2);\n\t\t},\n\t\teaseInSine: function(t) {\n\t\t\treturn -1 * Math.cos(t / 1 * (Math.PI / 2)) + 1;\n\t\t},\n\t\teaseOutSine: function(t) {\n\t\t\treturn 1 * Math.sin(t / 1 * (Math.PI / 2));\n\t\t},\n\t\teaseInOutSine: function(t) {\n\t\t\treturn -1 / 2 * (Math.cos(Math.PI * t / 1) - 1);\n\t\t},\n\t\teaseInExpo: function(t) {\n\t\t\treturn (t === 0) ? 1 : 1 * Math.pow(2, 10 * (t / 1 - 1));\n\t\t},\n\t\teaseOutExpo: function(t) {\n\t\t\treturn (t === 1) ? 1 : 1 * (-Math.pow(2, -10 * t / 1) + 1);\n\t\t},\n\t\teaseInOutExpo: function(t) {\n\t\t\tif (t === 0) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif (t === 1) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\tif ((t /= 1 / 2) < 1) {\n\t\t\t\treturn 1 / 2 * Math.pow(2, 10 * (t - 1));\n\t\t\t}\n\t\t\treturn 1 / 2 * (-Math.pow(2, -10 * --t) + 2);\n\t\t},\n\t\teaseInCirc: function(t) {\n\t\t\tif (t >= 1) {\n\t\t\t\treturn t;\n\t\t\t}\n\t\t\treturn -1 * (Math.sqrt(1 - (t /= 1) * t) - 1);\n\t\t},\n\t\teaseOutCirc: function(t) {\n\t\t\treturn 1 * Math.sqrt(1 - (t = t / 1 - 1) * t);\n\t\t},\n\t\teaseInOutCirc: function(t) {\n\t\t\tif ((t /= 1 / 2) < 1) {\n\t\t\t\treturn -1 / 2 * (Math.sqrt(1 - t * t) - 1);\n\t\t\t}\n\t\t\treturn 1 / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1);\n\t\t},\n\t\teaseInElastic: function(t) {\n\t\t\tvar s = 1.70158;\n\t\t\tvar p = 0;\n\t\t\tvar a = 1;\n\t\t\tif (t === 0) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif ((t /= 1) === 1) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\tif (!p) {\n\t\t\t\tp = 1 * 0.3;\n\t\t\t}\n\t\t\tif (a < Math.abs(1)) {\n\t\t\t\ta = 1;\n\t\t\t\ts = p / 4;\n\t\t\t} else {\n\t\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t\t}\n\t\t\treturn -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p));\n\t\t},\n\t\teaseOutElastic: function(t) {\n\t\t\tvar s = 1.70158;\n\t\t\tvar p = 0;\n\t\t\tvar a = 1;\n\t\t\tif (t === 0) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif ((t /= 1) === 1) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\tif (!p) {\n\t\t\t\tp = 1 * 0.3;\n\t\t\t}\n\t\t\tif (a < Math.abs(1)) {\n\t\t\t\ta = 1;\n\t\t\t\ts = p / 4;\n\t\t\t} else {\n\t\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t\t}\n\t\t\treturn a * Math.pow(2, -10 * t) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) + 1;\n\t\t},\n\t\teaseInOutElastic: function(t) {\n\t\t\tvar s = 1.70158;\n\t\t\tvar p = 0;\n\t\t\tvar a = 1;\n\t\t\tif (t === 0) {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\tif ((t /= 1 / 2) === 2) {\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t\tif (!p) {\n\t\t\t\tp = 1 * (0.3 * 1.5);\n\t\t\t}\n\t\t\tif (a < Math.abs(1)) {\n\t\t\t\ta = 1;\n\t\t\t\ts = p / 4;\n\t\t\t} else {\n\t\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\n\t\t\t}\n\t\t\tif (t < 1) {\n\t\t\t\treturn -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p));\n\t\t\t}\n\t\t\treturn a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) * 0.5 + 1;\n\t\t},\n\t\teaseInBack: function(t) {\n\t\t\tvar s = 1.70158;\n\t\t\treturn 1 * (t /= 1) * t * ((s + 1) * t - s);\n\t\t},\n\t\teaseOutBack: function(t) {\n\t\t\tvar s = 1.70158;\n\t\t\treturn 1 * ((t = t / 1 - 1) * t * ((s + 1) * t + s) + 1);\n\t\t},\n\t\teaseInOutBack: function(t) {\n\t\t\tvar s = 1.70158;\n\t\t\tif ((t /= 1 / 2) < 1) {\n\t\t\t\treturn 1 / 2 * (t * t * (((s *= (1.525)) + 1) * t - s));\n\t\t\t}\n\t\t\treturn 1 / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n\t\t},\n\t\teaseInBounce: function(t) {\n\t\t\treturn 1 - easingEffects.easeOutBounce(1 - t);\n\t\t},\n\t\teaseOutBounce: function(t) {\n\t\t\tif ((t /= 1) < (1 / 2.75)) {\n\t\t\t\treturn 1 * (7.5625 * t * t);\n\t\t\t} else if (t < (2 / 2.75)) {\n\t\t\t\treturn 1 * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75);\n\t\t\t} else if (t < (2.5 / 2.75)) {\n\t\t\t\treturn 1 * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375);\n\t\t\t}\n\t\t\treturn 1 * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375);\n\t\t},\n\t\teaseInOutBounce: function(t) {\n\t\t\tif (t < 1 / 2) {\n\t\t\t\treturn easingEffects.easeInBounce(t * 2) * 0.5;\n\t\t\t}\n\t\t\treturn easingEffects.easeOutBounce(t * 2 - 1) * 0.5 + 1 * 0.5;\n\t\t}\n\t};\n\t// Request animation polyfill - http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/\n\thelpers.requestAnimFrame = (function() {\n\t\tif (typeof window === 'undefined') {\n\t\t\treturn function(callback) {\n\t\t\t\tcallback();\n\t\t\t};\n\t\t}\n\t\treturn window.requestAnimationFrame ||\n\t\t\twindow.webkitRequestAnimationFrame ||\n\t\t\twindow.mozRequestAnimationFrame ||\n\t\t\twindow.oRequestAnimationFrame ||\n\t\t\twindow.msRequestAnimationFrame ||\n\t\t\tfunction(callback) {\n\t\t\t\treturn window.setTimeout(callback, 1000 / 60);\n\t\t\t};\n\t}());\n\t// -- DOM methods\n\thelpers.getRelativePosition = function(evt, chart) {\n\t\tvar mouseX, mouseY;\n\t\tvar e = evt.originalEvent || evt,\n\t\t\tcanvas = evt.currentTarget || evt.srcElement,\n\t\t\tboundingRect = canvas.getBoundingClientRect();\n\n\t\tvar touches = e.touches;\n\t\tif (touches && touches.length > 0) {\n\t\t\tmouseX = touches[0].clientX;\n\t\t\tmouseY = touches[0].clientY;\n\n\t\t} else {\n\t\t\tmouseX = e.clientX;\n\t\t\tmouseY = e.clientY;\n\t\t}\n\n\t\t// Scale mouse coordinates into canvas coordinates\n\t\t// by following the pattern laid out by 'jerryj' in the comments of\n\t\t// http://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/\n\t\tvar paddingLeft = parseFloat(helpers.getStyle(canvas, 'padding-left'));\n\t\tvar paddingTop = parseFloat(helpers.getStyle(canvas, 'padding-top'));\n\t\tvar paddingRight = parseFloat(helpers.getStyle(canvas, 'padding-right'));\n\t\tvar paddingBottom = parseFloat(helpers.getStyle(canvas, 'padding-bottom'));\n\t\tvar width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight;\n\t\tvar height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom;\n\n\t\t// We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However\n\t\t// the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here\n\t\tmouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio);\n\t\tmouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio);\n\n\t\treturn {\n\t\t\tx: mouseX,\n\t\t\ty: mouseY\n\t\t};\n\n\t};\n\thelpers.addEvent = function(node, eventType, method) {\n\t\tif (node.addEventListener) {\n\t\t\tnode.addEventListener(eventType, method);\n\t\t} else if (node.attachEvent) {\n\t\t\tnode.attachEvent('on' + eventType, method);\n\t\t} else {\n\t\t\tnode['on' + eventType] = method;\n\t\t}\n\t};\n\thelpers.removeEvent = function(node, eventType, handler) {\n\t\tif (node.removeEventListener) {\n\t\t\tnode.removeEventListener(eventType, handler, false);\n\t\t} else if (node.detachEvent) {\n\t\t\tnode.detachEvent('on' + eventType, handler);\n\t\t} else {\n\t\t\tnode['on' + eventType] = helpers.noop;\n\t\t}\n\t};\n\n\t// Private helper function to convert max-width/max-height values that may be percentages into a number\n\tfunction parseMaxStyle(styleValue, node, parentProperty) {\n\t\tvar valueInPixels;\n\t\tif (typeof(styleValue) === 'string') {\n\t\t\tvalueInPixels = parseInt(styleValue, 10);\n\n\t\t\tif (styleValue.indexOf('%') !== -1) {\n\t\t\t\t// percentage * size in dimension\n\t\t\t\tvalueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n\t\t\t}\n\t\t} else {\n\t\t\tvalueInPixels = styleValue;\n\t\t}\n\n\t\treturn valueInPixels;\n\t}\n\n\t/**\n\t * Returns if the given value contains an effective constraint.\n\t * @private\n\t */\n\tfunction isConstrainedValue(value) {\n\t\treturn value !== undefined && value !== null && value !== 'none';\n\t}\n\n\t// Private helper to get a constraint dimension\n\t// @param domNode : the node to check the constraint on\n\t// @param maxStyle : the style that defines the maximum for the direction we are using (maxWidth / maxHeight)\n\t// @param percentageProperty : property of parent to use when calculating width as a percentage\n\t// @see http://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser\n\tfunction getConstraintDimension(domNode, maxStyle, percentageProperty) {\n\t\tvar view = document.defaultView;\n\t\tvar parentNode = domNode.parentNode;\n\t\tvar constrainedNode = view.getComputedStyle(domNode)[maxStyle];\n\t\tvar constrainedContainer = view.getComputedStyle(parentNode)[maxStyle];\n\t\tvar hasCNode = isConstrainedValue(constrainedNode);\n\t\tvar hasCContainer = isConstrainedValue(constrainedContainer);\n\t\tvar infinity = Number.POSITIVE_INFINITY;\n\n\t\tif (hasCNode || hasCContainer) {\n\t\t\treturn Math.min(\n\t\t\t\thasCNode? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity,\n\t\t\t\thasCContainer? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity);\n\t\t}\n\n\t\treturn 'none';\n\t}\n\t// returns Number or undefined if no constraint\n\thelpers.getConstraintWidth = function(domNode) {\n\t\treturn getConstraintDimension(domNode, 'max-width', 'clientWidth');\n\t};\n\t// returns Number or undefined if no constraint\n\thelpers.getConstraintHeight = function(domNode) {\n\t\treturn getConstraintDimension(domNode, 'max-height', 'clientHeight');\n\t};\n\thelpers.getMaximumWidth = function(domNode) {\n\t\tvar container = domNode.parentNode;\n\t\tvar paddingLeft = parseInt(helpers.getStyle(container, 'padding-left'), 10);\n\t\tvar paddingRight = parseInt(helpers.getStyle(container, 'padding-right'), 10);\n\t\tvar w = container.clientWidth - paddingLeft - paddingRight;\n\t\tvar cw = helpers.getConstraintWidth(domNode);\n\t\treturn isNaN(cw)? w : Math.min(w, cw);\n\t};\n\thelpers.getMaximumHeight = function(domNode) {\n\t\tvar container = domNode.parentNode;\n\t\tvar paddingTop = parseInt(helpers.getStyle(container, 'padding-top'), 10);\n\t\tvar paddingBottom = parseInt(helpers.getStyle(container, 'padding-bottom'), 10);\n\t\tvar h = container.clientHeight - paddingTop - paddingBottom;\n\t\tvar ch = helpers.getConstraintHeight(domNode);\n\t\treturn isNaN(ch)? h : Math.min(h, ch);\n\t};\n\thelpers.getStyle = function(el, property) {\n\t\treturn el.currentStyle ?\n\t\t\tel.currentStyle[property] :\n\t\t\tdocument.defaultView.getComputedStyle(el, null).getPropertyValue(property);\n\t};\n\thelpers.retinaScale = function(chart) {\n\t\tvar pixelRatio = chart.currentDevicePixelRatio = window.devicePixelRatio || 1;\n\t\tif (pixelRatio === 1) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar canvas = chart.canvas;\n\t\tvar height = chart.height;\n\t\tvar width = chart.width;\n\n\t\tcanvas.height = height * pixelRatio;\n\t\tcanvas.width = width * pixelRatio;\n\t\tchart.ctx.scale(pixelRatio, pixelRatio);\n\n\t\t// If no style has been set on the canvas, the render size is used as display size,\n\t\t// making the chart visually bigger, so let's enforce it to the \"correct\" values.\n\t\t// See https://github.com/chartjs/Chart.js/issues/3575\n\t\tcanvas.style.height = height + 'px';\n\t\tcanvas.style.width = width + 'px';\n\t};\n\t// -- Canvas methods\n\thelpers.clear = function(chart) {\n\t\tchart.ctx.clearRect(0, 0, chart.width, chart.height);\n\t};\n\thelpers.fontString = function(pixelSize, fontStyle, fontFamily) {\n\t\treturn fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n\t};\n\thelpers.longestText = function(ctx, font, arrayOfThings, cache) {\n\t\tcache = cache || {};\n\t\tvar data = cache.data = cache.data || {};\n\t\tvar gc = cache.garbageCollect = cache.garbageCollect || [];\n\n\t\tif (cache.font !== font) {\n\t\t\tdata = cache.data = {};\n\t\t\tgc = cache.garbageCollect = [];\n\t\t\tcache.font = font;\n\t\t}\n\n\t\tctx.font = font;\n\t\tvar longest = 0;\n\t\thelpers.each(arrayOfThings, function(thing) {\n\t\t\t// Undefined strings and arrays should not be measured\n\t\t\tif (thing !== undefined && thing !== null && helpers.isArray(thing) !== true) {\n\t\t\t\tlongest = helpers.measureText(ctx, data, gc, longest, thing);\n\t\t\t} else if (helpers.isArray(thing)) {\n\t\t\t\t// if it is an array lets measure each element\n\t\t\t\t// to do maybe simplify this function a bit so we can do this more recursively?\n\t\t\t\thelpers.each(thing, function(nestedThing) {\n\t\t\t\t\t// Undefined strings and arrays should not be measured\n\t\t\t\t\tif (nestedThing !== undefined && nestedThing !== null && !helpers.isArray(nestedThing)) {\n\t\t\t\t\t\tlongest = helpers.measureText(ctx, data, gc, longest, nestedThing);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tvar gcLen = gc.length / 2;\n\t\tif (gcLen > arrayOfThings.length) {\n\t\t\tfor (var i = 0; i < gcLen; i++) {\n\t\t\t\tdelete data[gc[i]];\n\t\t\t}\n\t\t\tgc.splice(0, gcLen);\n\t\t}\n\t\treturn longest;\n\t};\n\thelpers.measureText = function(ctx, data, gc, longest, string) {\n\t\tvar textWidth = data[string];\n\t\tif (!textWidth) {\n\t\t\ttextWidth = data[string] = ctx.measureText(string).width;\n\t\t\tgc.push(string);\n\t\t}\n\t\tif (textWidth > longest) {\n\t\t\tlongest = textWidth;\n\t\t}\n\t\treturn longest;\n\t};\n\thelpers.numberOfLabelLines = function(arrayOfThings) {\n\t\tvar numberOfLines = 1;\n\t\thelpers.each(arrayOfThings, function(thing) {\n\t\t\tif (helpers.isArray(thing)) {\n\t\t\t\tif (thing.length > numberOfLines) {\n\t\t\t\t\tnumberOfLines = thing.length;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn numberOfLines;\n\t};\n\thelpers.drawRoundedRectangle = function(ctx, x, y, width, height, radius) {\n\t\tctx.beginPath();\n\t\tctx.moveTo(x + radius, y);\n\t\tctx.lineTo(x + width - radius, y);\n\t\tctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n\t\tctx.lineTo(x + width, y + height - radius);\n\t\tctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n\t\tctx.lineTo(x + radius, y + height);\n\t\tctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n\t\tctx.lineTo(x, y + radius);\n\t\tctx.quadraticCurveTo(x, y, x + radius, y);\n\t\tctx.closePath();\n\t};\n\n\thelpers.color = !color?\n\t\tfunction(value) {\n\t\t\tconsole.error('Color.js not found!');\n\t\t\treturn value;\n\t\t} :\n\t\tfunction(value) {\n\t\t\t/* global CanvasGradient */\n\t\t\tif (value instanceof CanvasGradient) {\n\t\t\t\tvalue = Chart.defaults.global.defaultColor;\n\t\t\t}\n\n\t\t\treturn color(value);\n\t\t};\n\n\thelpers.isArray = Array.isArray?\n\t\tfunction(obj) {\n\t\t\treturn Array.isArray(obj);\n\t\t} :\n\t\tfunction(obj) {\n\t\t\treturn Object.prototype.toString.call(obj) === '[object Array]';\n\t\t};\n\t// ! @see http://stackoverflow.com/a/14853974\n\thelpers.arrayEquals = function(a0, a1) {\n\t\tvar i, ilen, v0, v1;\n\n\t\tif (!a0 || !a1 || a0.length !== a1.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (i = 0, ilen=a0.length; i < ilen; ++i) {\n\t\t\tv0 = a0[i];\n\t\t\tv1 = a1[i];\n\n\t\t\tif (v0 instanceof Array && v1 instanceof Array) {\n\t\t\t\tif (!helpers.arrayEquals(v0, v1)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} else if (v0 !== v1) {\n\t\t\t\t// NOTE: two different object instances will never be equal: {x:20} != {x:20}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t};\n\thelpers.callback = function(fn, args, thisArg) {\n\t\tif (fn && typeof fn.call === 'function') {\n\t\t\tfn.apply(thisArg, args);\n\t\t}\n\t};\n\thelpers.getHoverColor = function(colorValue) {\n\t\t/* global CanvasPattern */\n\t\treturn (colorValue instanceof CanvasPattern) ?\n\t\t\tcolorValue :\n\t\t\thelpers.color(colorValue).saturate(0.5).darken(0.1).rgbString();\n\t};\n\n\t/**\n\t * Provided for backward compatibility, use Chart.helpers#callback instead.\n\t * @function Chart.helpers#callCallback\n\t * @deprecated since version 2.6.0\n\t * @todo remove at version 3\n\t */\n\thelpers.callCallback = helpers.callback;\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\tvar helpers = Chart.helpers;\n\n\t/**\n\t * Helper function to get relative position for an event\n\t * @param {Event|IEvent} event - The event to get the position for\n\t * @param {Chart} chart - The chart\n\t * @returns {Point} the event position\n\t */\n\tfunction getRelativePosition(e, chart) {\n\t\tif (e.native) {\n\t\t\treturn {\n\t\t\t\tx: e.x,\n\t\t\t\ty: e.y\n\t\t\t};\n\t\t}\n\n\t\treturn helpers.getRelativePosition(e, chart);\n\t}\n\n\t/**\n\t * Helper function to traverse all of the visible elements in the chart\n\t * @param chart {chart} the chart\n\t * @param handler {Function} the callback to execute for each visible item\n\t */\n\tfunction parseVisibleItems(chart, handler) {\n\t\tvar datasets = chart.data.datasets;\n\t\tvar meta, i, j, ilen, jlen;\n\n\t\tfor (i = 0, ilen = datasets.length; i < ilen; ++i) {\n\t\t\tif (!chart.isDatasetVisible(i)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\tfor (j = 0, jlen = meta.data.length; j < jlen; ++j) {\n\t\t\t\tvar element = meta.data[j];\n\t\t\t\tif (!element._view.skip) {\n\t\t\t\t\thandler(element);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Helper function to get the items that intersect the event position\n\t * @param items {ChartElement[]} elements to filter\n\t * @param position {Point} the point to be nearest to\n\t * @return {ChartElement[]} the nearest items\n\t */\n\tfunction getIntersectItems(chart, position) {\n\t\tvar elements = [];\n\n\t\tparseVisibleItems(chart, function(element) {\n\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\telements.push(element);\n\t\t\t}\n\t\t});\n\n\t\treturn elements;\n\t}\n\n\t/**\n\t * Helper function to get the items nearest to the event position considering all visible items in teh chart\n\t * @param chart {Chart} the chart to look at elements from\n\t * @param position {Point} the point to be nearest to\n\t * @param intersect {Boolean} if true, only consider items that intersect the position\n\t * @param distanceMetric {Function} Optional function to provide the distance between\n\t * @return {ChartElement[]} the nearest items\n\t */\n\tfunction getNearestItems(chart, position, intersect, distanceMetric) {\n\t\tvar minDistance = Number.POSITIVE_INFINITY;\n\t\tvar nearestItems = [];\n\n\t\tif (!distanceMetric) {\n\t\t\tdistanceMetric = helpers.distanceBetweenPoints;\n\t\t}\n\n\t\tparseVisibleItems(chart, function(element) {\n\t\t\tif (intersect && !element.inRange(position.x, position.y)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar center = element.getCenterPoint();\n\t\t\tvar distance = distanceMetric(position, center);\n\n\t\t\tif (distance < minDistance) {\n\t\t\t\tnearestItems = [element];\n\t\t\t\tminDistance = distance;\n\t\t\t} else if (distance === minDistance) {\n\t\t\t\t// Can have multiple items at the same distance in which case we sort by size\n\t\t\t\tnearestItems.push(element);\n\t\t\t}\n\t\t});\n\n\t\treturn nearestItems;\n\t}\n\n\tfunction indexMode(chart, e, options) {\n\t\tvar position = getRelativePosition(e, chart);\n\t\tvar distanceMetric = function(pt1, pt2) {\n\t\t\treturn Math.abs(pt1.x - pt2.x);\n\t\t};\n\t\tvar items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\n\t\tvar elements = [];\n\n\t\tif (!items.length) {\n\t\t\treturn [];\n\t\t}\n\n\t\tchart.data.datasets.forEach(function(dataset, datasetIndex) {\n\t\t\tif (chart.isDatasetVisible(datasetIndex)) {\n\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex),\n\t\t\t\t\telement = meta.data[items[0]._index];\n\n\t\t\t\t// don't count items that are skipped (null data)\n\t\t\t\tif (element && !element._view.skip) {\n\t\t\t\t\telements.push(element);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn elements;\n\t}\n\n\t/**\n\t * @interface IInteractionOptions\n\t */\n\t/**\n\t * If true, only consider items that intersect the point\n\t * @name IInterfaceOptions#boolean\n\t * @type Boolean\n\t */\n\n\t/**\n\t * Contains interaction related functions\n\t * @namespace Chart.Interaction\n\t */\n\tChart.Interaction = {\n\t\t// Helper function for different modes\n\t\tmodes: {\n\t\t\tsingle: function(chart, e) {\n\t\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\t\tvar elements = [];\n\n\t\t\t\tparseVisibleItems(chart, function(element) {\n\t\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\t\telements.push(element);\n\t\t\t\t\t\treturn elements;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn elements.slice(0, 1);\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * @function Chart.Interaction.modes.label\n\t\t\t * @deprecated since version 2.4.0\n\t \t\t * @todo remove at version 3\n\t\t\t * @private\n\t\t\t */\n\t\t\tlabel: indexMode,\n\n\t\t\t/**\n\t\t\t * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t\t * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n\t\t\t * @function Chart.Interaction.modes.index\n\t\t\t * @since v2.4.0\n\t\t\t * @param chart {chart} the chart we are returning items from\n\t\t\t * @param e {Event} the event we are find things at\n\t\t\t * @param options {IInteractionOptions} options to use during interaction\n\t\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t\t */\n\t\t\tindex: indexMode,\n\n\t\t\t/**\n\t\t\t * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t\t * If the options.intersect is false, we find the nearest item and return the items in that dataset\n\t\t\t * @function Chart.Interaction.modes.dataset\n\t\t\t * @param chart {chart} the chart we are returning items from\n\t\t\t * @param e {Event} the event we are find things at\n\t\t\t * @param options {IInteractionOptions} options to use during interaction\n\t\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t\t */\n\t\t\tdataset: function(chart, e, options) {\n\t\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\t\tvar items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false);\n\n\t\t\t\tif (items.length > 0) {\n\t\t\t\t\titems = chart.getDatasetMeta(items[0]._datasetIndex).data;\n\t\t\t\t}\n\n\t\t\t\treturn items;\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * @function Chart.Interaction.modes.x-axis\n\t\t\t * @deprecated since version 2.4.0. Use index mode and intersect == true\n\t\t\t * @todo remove at version 3\n\t\t\t * @private\n\t\t\t */\n\t\t\t'x-axis': function(chart, e) {\n\t\t\t\treturn indexMode(chart, e, true);\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Point mode returns all elements that hit test based on the event position\n\t\t\t * of the event\n\t\t\t * @function Chart.Interaction.modes.intersect\n\t\t\t * @param chart {chart} the chart we are returning items from\n\t\t\t * @param e {Event} the event we are find things at\n\t\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t\t */\n\t\t\tpoint: function(chart, e) {\n\t\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\t\treturn getIntersectItems(chart, position);\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * nearest mode returns the element closest to the point\n\t\t\t * @function Chart.Interaction.modes.intersect\n\t\t\t * @param chart {chart} the chart we are returning items from\n\t\t\t * @param e {Event} the event we are find things at\n\t\t\t * @param options {IInteractionOptions} options to use\n\t\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t\t */\n\t\t\tnearest: function(chart, e, options) {\n\t\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\t\tvar nearestItems = getNearestItems(chart, position, options.intersect);\n\n\t\t\t\t// We have multiple items at the same distance from the event. Now sort by smallest\n\t\t\t\tif (nearestItems.length > 1) {\n\t\t\t\t\tnearestItems.sort(function(a, b) {\n\t\t\t\t\t\tvar sizeA = a.getArea();\n\t\t\t\t\t\tvar sizeB = b.getArea();\n\t\t\t\t\t\tvar ret = sizeA - sizeB;\n\n\t\t\t\t\t\tif (ret === 0) {\n\t\t\t\t\t\t\t// if equal sort by dataset index\n\t\t\t\t\t\t\tret = a._datasetIndex - b._datasetIndex;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn ret;\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Return only 1 item\n\t\t\t\treturn nearestItems.slice(0, 1);\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * x mode returns the elements that hit-test at the current x coordinate\n\t\t\t * @function Chart.Interaction.modes.x\n\t\t\t * @param chart {chart} the chart we are returning items from\n\t\t\t * @param e {Event} the event we are find things at\n\t\t\t * @param options {IInteractionOptions} options to use\n\t\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t\t */\n\t\t\tx: function(chart, e, options) {\n\t\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\t\tvar items = [];\n\t\t\t\tvar intersectsItem = false;\n\n\t\t\t\tparseVisibleItems(chart, function(element) {\n\t\t\t\t\tif (element.inXRange(position.x)) {\n\t\t\t\t\t\titems.push(element);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\t\tintersectsItem = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// If we want to trigger on an intersect and we don't have any items\n\t\t\t\t// that intersect the position, return nothing\n\t\t\t\tif (options.intersect && !intersectsItem) {\n\t\t\t\t\titems = [];\n\t\t\t\t}\n\t\t\t\treturn items;\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * y mode returns the elements that hit-test at the current y coordinate\n\t\t\t * @function Chart.Interaction.modes.y\n\t\t\t * @param chart {chart} the chart we are returning items from\n\t\t\t * @param e {Event} the event we are find things at\n\t\t\t * @param options {IInteractionOptions} options to use\n\t\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\n\t\t\t */\n\t\t\ty: function(chart, e, options) {\n\t\t\t\tvar position = getRelativePosition(e, chart);\n\t\t\t\tvar items = [];\n\t\t\t\tvar intersectsItem = false;\n\n\t\t\t\tparseVisibleItems(chart, function(element) {\n\t\t\t\t\tif (element.inYRange(position.y)) {\n\t\t\t\t\t\titems.push(element);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (element.inRange(position.x, position.y)) {\n\t\t\t\t\t\tintersectsItem = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// If we want to trigger on an intersect and we don't have any items\n\t\t\t\t// that intersect the position, return nothing\n\t\t\t\tif (options.intersect && !intersectsItem) {\n\t\t\t\t\titems = [];\n\t\t\t\t}\n\t\t\t\treturn items;\n\t\t\t}\n\t\t}\n\t};\n};\n",
    "'use strict';\n\nmodule.exports = function() {\n\n\t// Occupy the global variable of Chart, and create a simple base class\n\tvar Chart = function(item, config) {\n\t\tthis.construct(item, config);\n\t\treturn this;\n\t};\n\n\t// Globally expose the defaults to allow for user updating/changing\n\tChart.defaults = {\n\t\tglobal: {\n\t\t\tresponsive: true,\n\t\t\tresponsiveAnimationDuration: 0,\n\t\t\tmaintainAspectRatio: true,\n\t\t\tevents: ['mousemove', 'mouseout', 'click', 'touchstart', 'touchmove'],\n\t\t\thover: {\n\t\t\t\tonHover: null,\n\t\t\t\tmode: 'nearest',\n\t\t\t\tintersect: true,\n\t\t\t\tanimationDuration: 400\n\t\t\t},\n\t\t\tonClick: null,\n\t\t\tdefaultColor: 'rgba(0,0,0,0.1)',\n\t\t\tdefaultFontColor: '#666',\n\t\t\tdefaultFontFamily: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n\t\t\tdefaultFontSize: 12,\n\t\t\tdefaultFontStyle: 'normal',\n\t\t\tshowLines: true,\n\n\t\t\t// Element defaults defined in element extensions\n\t\t\telements: {},\n\n\t\t\t// Legend callback string\n\t\t\tlegendCallback: function(chart) {\n\t\t\t\tvar text = [];\n\t\t\t\ttext.push('<ul class=\"' + chart.id + '-legend\">');\n\t\t\t\tfor (var i = 0; i < chart.data.datasets.length; i++) {\n\t\t\t\t\ttext.push('<li><span style=\"background-color:' + chart.data.datasets[i].backgroundColor + '\"></span>');\n\t\t\t\t\tif (chart.data.datasets[i].label) {\n\t\t\t\t\t\ttext.push(chart.data.datasets[i].label);\n\t\t\t\t\t}\n\t\t\t\t\ttext.push('</li>');\n\t\t\t\t}\n\t\t\t\ttext.push('</ul>');\n\n\t\t\t\treturn text.join('');\n\t\t\t}\n\t\t}\n\t};\n\n\tChart.Chart = Chart;\n\n\treturn Chart;\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tfunction filterByPosition(array, position) {\n\t\treturn helpers.where(array, function(v) {\n\t\t\treturn v.position === position;\n\t\t});\n\t}\n\n\tfunction sortByWeight(array, reverse) {\n\t\tarray.forEach(function(v, i) {\n\t\t\tv._tmpIndex_ = i;\n\t\t\treturn v;\n\t\t});\n\t\tarray.sort(function(a, b) {\n\t\t\tvar v0 = reverse ? b : a;\n\t\t\tvar v1 = reverse ? a : b;\n\t\t\treturn v0.weight === v1.weight ?\n\t\t\t\tv0._tmpIndex_ - v1._tmpIndex_ :\n\t\t\t\tv0.weight - v1.weight;\n\t\t});\n\t\tarray.forEach(function(v) {\n\t\t\tdelete v._tmpIndex_;\n\t\t});\n\t}\n\n\t/**\n\t * @interface ILayoutItem\n\t * @prop {String} position - The position of the item in the chart layout. Possible values are\n\t * 'left', 'top', 'right', 'bottom', and 'chartArea'\n\t * @prop {Number} weight - The weight used to sort the item. Higher weights are further away from the chart area\n\t * @prop {Boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down\n\t * @prop {Function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)\n\t * @prop {Function} update - Takes two parameters: width and height. Returns size of item\n\t * @prop {Function} getPadding -  Returns an object with padding on the edges\n\t * @prop {Number} width - Width of item. Must be valid after update()\n\t * @prop {Number} height - Height of item. Must be valid after update()\n\t * @prop {Number} left - Left edge of the item. Set by layout system and cannot be used in update\n\t * @prop {Number} top - Top edge of the item. Set by layout system and cannot be used in update\n\t * @prop {Number} right - Right edge of the item. Set by layout system and cannot be used in update\n\t * @prop {Number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update\n\t */\n\n\t// The layout service is very self explanatory.  It's responsible for the layout within a chart.\n\t// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\n\t// It is this service's responsibility of carrying out that layout.\n\tChart.layoutService = {\n\t\tdefaults: {},\n\n\t\t/**\n\t\t * Register a box to a chart.\n\t\t * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\n\t\t * @param {Chart} chart - the chart to use\n\t\t * @param {ILayoutItem} item - the item to add to be layed out\n\t\t */\n\t\taddBox: function(chart, item) {\n\t\t\tif (!chart.boxes) {\n\t\t\t\tchart.boxes = [];\n\t\t\t}\n\n\t\t\t// initialize item with default values\n\t\t\titem.fullWidth = item.fullWidth || false;\n\t\t\titem.position = item.position || 'top';\n\t\t\titem.weight = item.weight || 0;\n\n\t\t\tchart.boxes.push(item);\n\t\t},\n\n\t\t/**\n\t\t * Remove a layoutItem from a chart\n\t\t * @param {Chart} chart - the chart to remove the box from\n\t\t * @param {Object} layoutItem - the item to remove from the layout\n\t\t */\n\t\tremoveBox: function(chart, layoutItem) {\n\t\t\tvar index = chart.boxes? chart.boxes.indexOf(layoutItem) : -1;\n\t\t\tif (index !== -1) {\n\t\t\t\tchart.boxes.splice(index, 1);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Sets (or updates) options on the given `item`.\n\t\t * @param {Chart} chart - the chart in which the item lives (or will be added to)\n\t\t * @param {Object} item - the item to configure with the given options\n\t\t * @param {Object} options - the new item options.\n\t\t */\n\t\tconfigure: function(chart, item, options) {\n\t\t\tvar props = ['fullWidth', 'position', 'weight'];\n\t\t\tvar ilen = props.length;\n\t\t\tvar i = 0;\n\t\t\tvar prop;\n\n\t\t\tfor (; i<ilen; ++i) {\n\t\t\t\tprop = props[i];\n\t\t\t\tif (options.hasOwnProperty(prop)) {\n\t\t\t\t\titem[prop] = options[prop];\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Fits boxes of the given chart into the given size by having each box measure itself\n\t\t * then running a fitting algorithm\n\t\t * @param {Chart} chart - the chart\n\t\t * @param {Number} width - the width to fit into\n\t\t * @param {Number} height - the height to fit into\n\t\t */\n\t\tupdate: function(chart, width, height) {\n\t\t\tif (!chart) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar layoutOptions = chart.options.layout;\n\t\t\tvar padding = layoutOptions ? layoutOptions.padding : null;\n\n\t\t\tvar leftPadding = 0;\n\t\t\tvar rightPadding = 0;\n\t\t\tvar topPadding = 0;\n\t\t\tvar bottomPadding = 0;\n\n\t\t\tif (!isNaN(padding)) {\n\t\t\t\t// options.layout.padding is a number. assign to all\n\t\t\t\tleftPadding = padding;\n\t\t\t\trightPadding = padding;\n\t\t\t\ttopPadding = padding;\n\t\t\t\tbottomPadding = padding;\n\t\t\t} else {\n\t\t\t\tleftPadding = padding.left || 0;\n\t\t\t\trightPadding = padding.right || 0;\n\t\t\t\ttopPadding = padding.top || 0;\n\t\t\t\tbottomPadding = padding.bottom || 0;\n\t\t\t}\n\n\t\t\tvar leftBoxes = filterByPosition(chart.boxes, 'left');\n\t\t\tvar rightBoxes = filterByPosition(chart.boxes, 'right');\n\t\t\tvar topBoxes = filterByPosition(chart.boxes, 'top');\n\t\t\tvar bottomBoxes = filterByPosition(chart.boxes, 'bottom');\n\t\t\tvar chartAreaBoxes = filterByPosition(chart.boxes, 'chartArea');\n\n\t\t\t// Sort boxes by weight. A higher weight is further away from the chart area\n\t\t\tsortByWeight(leftBoxes, true);\n\t\t\tsortByWeight(rightBoxes, false);\n\t\t\tsortByWeight(topBoxes, true);\n\t\t\tsortByWeight(bottomBoxes, false);\n\n\t\t\t// Essentially we now have any number of boxes on each of the 4 sides.\n\t\t\t// Our canvas looks like the following.\n\t\t\t// The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n\t\t\t// B1 is the bottom axis\n\t\t\t// There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n\t\t\t// These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n\t\t\t// an error will be thrown.\n\t\t\t//\n\t\t\t// |----------------------------------------------------|\n\t\t\t// |                  T1 (Full Width)                   |\n\t\t\t// |----------------------------------------------------|\n\t\t\t// |    |    |                 T2                  |    |\n\t\t\t// |    |----|-------------------------------------|----|\n\t\t\t// |    |    | C1 |                           | C2 |    |\n\t\t\t// |    |    |----|                           |----|    |\n\t\t\t// |    |    |                                     |    |\n\t\t\t// | L1 | L2 |           ChartArea (C0)            | R1 |\n\t\t\t// |    |    |                                     |    |\n\t\t\t// |    |    |----|                           |----|    |\n\t\t\t// |    |    | C3 |                           | C4 |    |\n\t\t\t// |    |----|-------------------------------------|----|\n\t\t\t// |    |    |                 B1                  |    |\n\t\t\t// |----------------------------------------------------|\n\t\t\t// |                  B2 (Full Width)                   |\n\t\t\t// |----------------------------------------------------|\n\t\t\t//\n\t\t\t// What we do to find the best sizing, we do the following\n\t\t\t// 1. Determine the minimum size of the chart area.\n\t\t\t// 2. Split the remaining width equally between each vertical axis\n\t\t\t// 3. Split the remaining height equally between each horizontal axis\n\t\t\t// 4. Give each layout the maximum size it can be. The layout will return it's minimum size\n\t\t\t// 5. Adjust the sizes of each axis based on it's minimum reported size.\n\t\t\t// 6. Refit each axis\n\t\t\t// 7. Position each axis in the final location\n\t\t\t// 8. Tell the chart the final location of the chart area\n\t\t\t// 9. Tell any axes that overlay the chart area the positions of the chart area\n\n\t\t\t// Step 1\n\t\t\tvar chartWidth = width - leftPadding - rightPadding;\n\t\t\tvar chartHeight = height - topPadding - bottomPadding;\n\t\t\tvar chartAreaWidth = chartWidth / 2; // min 50%\n\t\t\tvar chartAreaHeight = chartHeight / 2; // min 50%\n\n\t\t\t// Step 2\n\t\t\tvar verticalBoxWidth = (width - chartAreaWidth) / (leftBoxes.length + rightBoxes.length);\n\n\t\t\t// Step 3\n\t\t\tvar horizontalBoxHeight = (height - chartAreaHeight) / (topBoxes.length + bottomBoxes.length);\n\n\t\t\t// Step 4\n\t\t\tvar maxChartAreaWidth = chartWidth;\n\t\t\tvar maxChartAreaHeight = chartHeight;\n\t\t\tvar minBoxSizes = [];\n\n\t\t\tfunction getMinimumBoxSize(box) {\n\t\t\t\tvar minSize;\n\t\t\t\tvar isHorizontal = box.isHorizontal();\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tminSize = box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, horizontalBoxHeight);\n\t\t\t\t\tmaxChartAreaHeight -= minSize.height;\n\t\t\t\t} else {\n\t\t\t\t\tminSize = box.update(verticalBoxWidth, chartAreaHeight);\n\t\t\t\t\tmaxChartAreaWidth -= minSize.width;\n\t\t\t\t}\n\n\t\t\t\tminBoxSizes.push({\n\t\t\t\t\thorizontal: isHorizontal,\n\t\t\t\t\tminSize: minSize,\n\t\t\t\t\tbox: box,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thelpers.each(leftBoxes.concat(rightBoxes, topBoxes, bottomBoxes), getMinimumBoxSize);\n\n\t\t\t// If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478)\n\t\t\tvar maxHorizontalLeftPadding = 0;\n\t\t\tvar maxHorizontalRightPadding = 0;\n\t\t\tvar maxVerticalTopPadding = 0;\n\t\t\tvar maxVerticalBottomPadding = 0;\n\n\t\t\thelpers.each(topBoxes.concat(bottomBoxes), function(horizontalBox) {\n\t\t\t\tif (horizontalBox.getPadding) {\n\t\t\t\t\tvar boxPadding = horizontalBox.getPadding();\n\t\t\t\t\tmaxHorizontalLeftPadding = Math.max(maxHorizontalLeftPadding, boxPadding.left);\n\t\t\t\t\tmaxHorizontalRightPadding = Math.max(maxHorizontalRightPadding, boxPadding.right);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\thelpers.each(leftBoxes.concat(rightBoxes), function(verticalBox) {\n\t\t\t\tif (verticalBox.getPadding) {\n\t\t\t\t\tvar boxPadding = verticalBox.getPadding();\n\t\t\t\t\tmaxVerticalTopPadding = Math.max(maxVerticalTopPadding, boxPadding.top);\n\t\t\t\t\tmaxVerticalBottomPadding = Math.max(maxVerticalBottomPadding, boxPadding.bottom);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could\n\t\t\t// be if the axes are drawn at their minimum sizes.\n\t\t\t// Steps 5 & 6\n\t\t\tvar totalLeftBoxesWidth = leftPadding;\n\t\t\tvar totalRightBoxesWidth = rightPadding;\n\t\t\tvar totalTopBoxesHeight = topPadding;\n\t\t\tvar totalBottomBoxesHeight = bottomPadding;\n\n\t\t\t// Function to fit a box\n\t\t\tfunction fitBox(box) {\n\t\t\t\tvar minBoxSize = helpers.findNextWhere(minBoxSizes, function(minBox) {\n\t\t\t\t\treturn minBox.box === box;\n\t\t\t\t});\n\n\t\t\t\tif (minBoxSize) {\n\t\t\t\t\tif (box.isHorizontal()) {\n\t\t\t\t\t\tvar scaleMargin = {\n\t\t\t\t\t\t\tleft: Math.max(totalLeftBoxesWidth, maxHorizontalLeftPadding),\n\t\t\t\t\t\t\tright: Math.max(totalRightBoxesWidth, maxHorizontalRightPadding),\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\tbottom: 0\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t// Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends\n\t\t\t\t\t\t// on the margin. Sometimes they need to increase in size slightly\n\t\t\t\t\t\tbox.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbox.update(minBoxSize.minSize.width, maxChartAreaHeight);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Update, and calculate the left and right margins for the horizontal boxes\n\t\t\thelpers.each(leftBoxes.concat(rightBoxes), fitBox);\n\n\t\t\thelpers.each(leftBoxes, function(box) {\n\t\t\t\ttotalLeftBoxesWidth += box.width;\n\t\t\t});\n\n\t\t\thelpers.each(rightBoxes, function(box) {\n\t\t\t\ttotalRightBoxesWidth += box.width;\n\t\t\t});\n\n\t\t\t// Set the Left and Right margins for the horizontal boxes\n\t\t\thelpers.each(topBoxes.concat(bottomBoxes), fitBox);\n\n\t\t\t// Figure out how much margin is on the top and bottom of the vertical boxes\n\t\t\thelpers.each(topBoxes, function(box) {\n\t\t\t\ttotalTopBoxesHeight += box.height;\n\t\t\t});\n\n\t\t\thelpers.each(bottomBoxes, function(box) {\n\t\t\t\ttotalBottomBoxesHeight += box.height;\n\t\t\t});\n\n\t\t\tfunction finalFitVerticalBox(box) {\n\t\t\t\tvar minBoxSize = helpers.findNextWhere(minBoxSizes, function(minSize) {\n\t\t\t\t\treturn minSize.box === box;\n\t\t\t\t});\n\n\t\t\t\tvar scaleMargin = {\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tright: 0,\n\t\t\t\t\ttop: totalTopBoxesHeight,\n\t\t\t\t\tbottom: totalBottomBoxesHeight\n\t\t\t\t};\n\n\t\t\t\tif (minBoxSize) {\n\t\t\t\t\tbox.update(minBoxSize.minSize.width, maxChartAreaHeight, scaleMargin);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Let the left layout know the final margin\n\t\t\thelpers.each(leftBoxes.concat(rightBoxes), finalFitVerticalBox);\n\n\t\t\t// Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance)\n\t\t\ttotalLeftBoxesWidth = leftPadding;\n\t\t\ttotalRightBoxesWidth = rightPadding;\n\t\t\ttotalTopBoxesHeight = topPadding;\n\t\t\ttotalBottomBoxesHeight = bottomPadding;\n\n\t\t\thelpers.each(leftBoxes, function(box) {\n\t\t\t\ttotalLeftBoxesWidth += box.width;\n\t\t\t});\n\n\t\t\thelpers.each(rightBoxes, function(box) {\n\t\t\t\ttotalRightBoxesWidth += box.width;\n\t\t\t});\n\n\t\t\thelpers.each(topBoxes, function(box) {\n\t\t\t\ttotalTopBoxesHeight += box.height;\n\t\t\t});\n\t\t\thelpers.each(bottomBoxes, function(box) {\n\t\t\t\ttotalBottomBoxesHeight += box.height;\n\t\t\t});\n\n\t\t\t// We may be adding some padding to account for rotated x axis labels\n\t\t\tvar leftPaddingAddition = Math.max(maxHorizontalLeftPadding - totalLeftBoxesWidth, 0);\n\t\t\ttotalLeftBoxesWidth += leftPaddingAddition;\n\t\t\ttotalRightBoxesWidth += Math.max(maxHorizontalRightPadding - totalRightBoxesWidth, 0);\n\n\t\t\tvar topPaddingAddition = Math.max(maxVerticalTopPadding - totalTopBoxesHeight, 0);\n\t\t\ttotalTopBoxesHeight += topPaddingAddition;\n\t\t\ttotalBottomBoxesHeight += Math.max(maxVerticalBottomPadding - totalBottomBoxesHeight, 0);\n\n\t\t\t// Figure out if our chart area changed. This would occur if the dataset layout label rotation\n\t\t\t// changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do\n\t\t\t// without calling `fit` again\n\t\t\tvar newMaxChartAreaHeight = height - totalTopBoxesHeight - totalBottomBoxesHeight;\n\t\t\tvar newMaxChartAreaWidth = width - totalLeftBoxesWidth - totalRightBoxesWidth;\n\n\t\t\tif (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) {\n\t\t\t\thelpers.each(leftBoxes, function(box) {\n\t\t\t\t\tbox.height = newMaxChartAreaHeight;\n\t\t\t\t});\n\n\t\t\t\thelpers.each(rightBoxes, function(box) {\n\t\t\t\t\tbox.height = newMaxChartAreaHeight;\n\t\t\t\t});\n\n\t\t\t\thelpers.each(topBoxes, function(box) {\n\t\t\t\t\tif (!box.fullWidth) {\n\t\t\t\t\t\tbox.width = newMaxChartAreaWidth;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\thelpers.each(bottomBoxes, function(box) {\n\t\t\t\t\tif (!box.fullWidth) {\n\t\t\t\t\t\tbox.width = newMaxChartAreaWidth;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tmaxChartAreaHeight = newMaxChartAreaHeight;\n\t\t\t\tmaxChartAreaWidth = newMaxChartAreaWidth;\n\t\t\t}\n\n\t\t\t// Step 7 - Position the boxes\n\t\t\tvar left = leftPadding + leftPaddingAddition;\n\t\t\tvar top = topPadding + topPaddingAddition;\n\n\t\t\tfunction placeBox(box) {\n\t\t\t\tif (box.isHorizontal()) {\n\t\t\t\t\tbox.left = box.fullWidth ? leftPadding : totalLeftBoxesWidth;\n\t\t\t\t\tbox.right = box.fullWidth ? width - rightPadding : totalLeftBoxesWidth + maxChartAreaWidth;\n\t\t\t\t\tbox.top = top;\n\t\t\t\t\tbox.bottom = top + box.height;\n\n\t\t\t\t\t// Move to next point\n\t\t\t\t\ttop = box.bottom;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbox.left = left;\n\t\t\t\t\tbox.right = left + box.width;\n\t\t\t\t\tbox.top = totalTopBoxesHeight;\n\t\t\t\t\tbox.bottom = totalTopBoxesHeight + maxChartAreaHeight;\n\n\t\t\t\t\t// Move to next point\n\t\t\t\t\tleft = box.right;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\thelpers.each(leftBoxes.concat(topBoxes), placeBox);\n\n\t\t\t// Account for chart width and height\n\t\t\tleft += maxChartAreaWidth;\n\t\t\ttop += maxChartAreaHeight;\n\n\t\t\thelpers.each(rightBoxes, placeBox);\n\t\t\thelpers.each(bottomBoxes, placeBox);\n\n\t\t\t// Step 8\n\t\t\tchart.chartArea = {\n\t\t\t\tleft: totalLeftBoxesWidth,\n\t\t\t\ttop: totalTopBoxesHeight,\n\t\t\t\tright: totalLeftBoxesWidth + maxChartAreaWidth,\n\t\t\t\tbottom: totalTopBoxesHeight + maxChartAreaHeight\n\t\t\t};\n\n\t\t\t// Step 9\n\t\t\thelpers.each(chartAreaBoxes, function(box) {\n\t\t\t\tbox.left = chart.chartArea.left;\n\t\t\t\tbox.top = chart.chartArea.top;\n\t\t\t\tbox.right = chart.chartArea.right;\n\t\t\t\tbox.bottom = chart.chartArea.bottom;\n\n\t\t\t\tbox.update(maxChartAreaWidth, maxChartAreaHeight);\n\t\t\t});\n\t\t}\n\t};\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.defaults.global.plugins = {};\n\n\t/**\n\t * The plugin service singleton\n\t * @namespace Chart.plugins\n\t * @since 2.1.0\n\t */\n\tChart.plugins = {\n\t\t/**\n\t\t * Globally registered plugins.\n\t\t * @private\n\t\t */\n\t\t_plugins: [],\n\n\t\t/**\n\t\t * This identifier is used to invalidate the descriptors cache attached to each chart\n\t\t * when a global plugin is registered or unregistered. In this case, the cache ID is\n\t\t * incremented and descriptors are regenerated during following API calls.\n\t\t * @private\n\t\t */\n\t\t_cacheId: 0,\n\n\t\t/**\n\t\t * Registers the given plugin(s) if not already registered.\n\t\t * @param {Array|Object} plugins plugin instance(s).\n\t\t */\n\t\tregister: function(plugins) {\n\t\t\tvar p = this._plugins;\n\t\t\t([]).concat(plugins).forEach(function(plugin) {\n\t\t\t\tif (p.indexOf(plugin) === -1) {\n\t\t\t\t\tp.push(plugin);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis._cacheId++;\n\t\t},\n\n\t\t/**\n\t\t * Unregisters the given plugin(s) only if registered.\n\t\t * @param {Array|Object} plugins plugin instance(s).\n\t\t */\n\t\tunregister: function(plugins) {\n\t\t\tvar p = this._plugins;\n\t\t\t([]).concat(plugins).forEach(function(plugin) {\n\t\t\t\tvar idx = p.indexOf(plugin);\n\t\t\t\tif (idx !== -1) {\n\t\t\t\t\tp.splice(idx, 1);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis._cacheId++;\n\t\t},\n\n\t\t/**\n\t\t * Remove all registered plugins.\n\t\t * @since 2.1.5\n\t\t */\n\t\tclear: function() {\n\t\t\tthis._plugins = [];\n\t\t\tthis._cacheId++;\n\t\t},\n\n\t\t/**\n\t\t * Returns the number of registered plugins?\n\t\t * @returns {Number}\n\t\t * @since 2.1.5\n\t\t */\n\t\tcount: function() {\n\t\t\treturn this._plugins.length;\n\t\t},\n\n\t\t/**\n\t\t * Returns all registered plugin instances.\n\t\t * @returns {Array} array of plugin objects.\n\t\t * @since 2.1.5\n\t\t */\n\t\tgetAll: function() {\n\t\t\treturn this._plugins;\n\t\t},\n\n\t\t/**\n\t\t * Calls enabled plugins for `chart` on the specified hook and with the given args.\n\t\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t\t * returned value can be used, for instance, to interrupt the current action.\n\t\t * @param {Object} chart - The chart instance for which plugins should be called.\n\t\t * @param {String} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t\t * @param {Array} [args] - Extra arguments to apply to the hook call.\n\t\t * @returns {Boolean} false if any of the plugins return false, else returns true.\n\t\t */\n\t\tnotify: function(chart, hook, args) {\n\t\t\tvar descriptors = this.descriptors(chart);\n\t\t\tvar ilen = descriptors.length;\n\t\t\tvar i, descriptor, plugin, params, method;\n\n\t\t\tfor (i=0; i<ilen; ++i) {\n\t\t\t\tdescriptor = descriptors[i];\n\t\t\t\tplugin = descriptor.plugin;\n\t\t\t\tmethod = plugin[hook];\n\t\t\t\tif (typeof method === 'function') {\n\t\t\t\t\tparams = [chart].concat(args || []);\n\t\t\t\t\tparams.push(descriptor.options);\n\t\t\t\t\tif (method.apply(plugin, params) === false) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\n\t\t/**\n\t\t * Returns descriptors of enabled plugins for the given chart.\n\t\t * @returns {Array} [{ plugin, options }]\n\t\t * @private\n\t\t */\n\t\tdescriptors: function(chart) {\n\t\t\tvar cache = chart._plugins || (chart._plugins = {});\n\t\t\tif (cache.id === this._cacheId) {\n\t\t\t\treturn cache.descriptors;\n\t\t\t}\n\n\t\t\tvar plugins = [];\n\t\t\tvar descriptors = [];\n\t\t\tvar config = (chart && chart.config) || {};\n\t\t\tvar defaults = Chart.defaults.global.plugins;\n\t\t\tvar options = (config.options && config.options.plugins) || {};\n\n\t\t\tthis._plugins.concat(config.plugins || []).forEach(function(plugin) {\n\t\t\t\tvar idx = plugins.indexOf(plugin);\n\t\t\t\tif (idx !== -1) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar id = plugin.id;\n\t\t\t\tvar opts = options[id];\n\t\t\t\tif (opts === false) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (opts === true) {\n\t\t\t\t\topts = helpers.clone(defaults[id]);\n\t\t\t\t}\n\n\t\t\t\tplugins.push(plugin);\n\t\t\t\tdescriptors.push({\n\t\t\t\t\tplugin: plugin,\n\t\t\t\t\toptions: opts || {}\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tcache.descriptors = descriptors;\n\t\t\tcache.id = this._cacheId;\n\t\t\treturn descriptors;\n\t\t}\n\t};\n\n\t/**\n\t * Plugin extension hooks.\n\t * @interface IPlugin\n\t * @since 2.1.0\n\t */\n\t/**\n\t * @method IPlugin#beforeInit\n\t * @desc Called before initializing `chart`.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#afterInit\n\t * @desc Called after `chart` has been initialized and before the first update.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeUpdate\n\t * @desc Called before updating `chart`. If any plugin returns `false`, the update\n\t * is cancelled (and thus subsequent render(s)) until another `update` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart update.\n\t */\n\t/**\n\t * @method IPlugin#afterUpdate\n\t * @desc Called after `chart` has been updated and before rendering. Note that this\n\t * hook will not be called if the chart update has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeDatasetsUpdate\n \t * @desc Called before updating the `chart` datasets. If any plugin returns `false`,\n\t * the datasets update is cancelled until another `update` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} false to cancel the datasets update.\n\t * @since version 2.1.5\n\t */\n\t/**\n\t * @method IPlugin#afterDatasetsUpdate\n\t * @desc Called after the `chart` datasets have been updated. Note that this hook\n\t * will not be called if the datasets update has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t * @since version 2.1.5\n\t */\n\t/**\n\t * @method IPlugin#beforeDatasetUpdate\n \t * @desc Called before updating the `chart` dataset at the given `args.index`. If any plugin\n\t * returns `false`, the datasets update is cancelled until another `update` is triggered.\n\t * @param {Chart} chart - The chart instance.\n\t * @param {Object} args - The call arguments.\n\t * @param {Object} args.index - The dataset index.\n\t * @param {Number} args.meta - The dataset metadata.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart datasets drawing.\n\t */\n\t/**\n\t * @method IPlugin#afterDatasetUpdate\n \t * @desc Called after the `chart` datasets at the given `args.index` has been updated. Note\n\t * that this hook will not be called if the datasets update has been previously cancelled.\n\t * @param {Chart} chart - The chart instance.\n\t * @param {Object} args - The call arguments.\n\t * @param {Object} args.index - The dataset index.\n\t * @param {Number} args.meta - The dataset metadata.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeLayout\n\t * @desc Called before laying out `chart`. If any plugin returns `false`,\n\t * the layout update is cancelled until another `update` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart layout.\n\t */\n\t/**\n\t * @method IPlugin#afterLayout\n\t * @desc Called after the `chart` has been layed out. Note that this hook will not\n\t * be called if the layout update has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeRender\n\t * @desc Called before rendering `chart`. If any plugin returns `false`,\n\t * the rendering is cancelled until another `render` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart rendering.\n\t */\n\t/**\n\t * @method IPlugin#afterRender\n\t * @desc Called after the `chart` has been fully rendered (and animation completed). Note\n\t * that this hook will not be called if the rendering has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeDraw\n\t * @desc Called before drawing `chart` at every animation frame specified by the given\n\t * easing value. If any plugin returns `false`, the frame drawing is cancelled until\n\t * another `render` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart drawing.\n\t */\n\t/**\n\t * @method IPlugin#afterDraw\n\t * @desc Called after the `chart` has been drawn for the specific easing value. Note\n\t * that this hook will not be called if the drawing has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeDatasetsDraw\n \t * @desc Called before drawing the `chart` datasets. If any plugin returns `false`,\n\t * the datasets drawing is cancelled until another `render` is triggered.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart datasets drawing.\n\t */\n\t/**\n\t * @method IPlugin#afterDatasetsDraw\n\t * @desc Called after the `chart` datasets have been drawn. Note that this hook\n\t * will not be called if the datasets drawing has been previously cancelled.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Number} easingValue - The current animation value, between 0.0 and 1.0.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeDatasetDraw\n \t * @desc Called before drawing the `chart` dataset at the given `args.index` (datasets\n\t * are drawn in the reverse order). If any plugin returns `false`, the datasets drawing\n\t * is cancelled until another `render` is triggered.\n\t * @param {Chart} chart - The chart instance.\n\t * @param {Object} args - The call arguments.\n\t * @param {Object} args.index - The dataset index.\n\t * @param {Number} args.meta - The dataset metadata.\n\t * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n\t * @param {Object} options - The plugin options.\n\t * @returns {Boolean} `false` to cancel the chart datasets drawing.\n\t */\n\t/**\n\t * @method IPlugin#afterDatasetDraw\n \t * @desc Called after the `chart` datasets at the given `args.index` have been drawn\n\t * (datasets are drawn in the reverse order). Note that this hook will not be called\n\t * if the datasets drawing has been previously cancelled.\n\t * @param {Chart} chart - The chart instance.\n\t * @param {Object} args - The call arguments.\n\t * @param {Object} args.index - The dataset index.\n\t * @param {Number} args.meta - The dataset metadata.\n\t * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#beforeEvent\n \t * @desc Called before processing the specified `event`. If any plugin returns `false`,\n\t * the event will be discarded.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {IEvent} event - The event object.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#afterEvent\n\t * @desc Called after the `event` has been consumed. Note that this hook\n\t * will not be called if the `event` has been previously discarded.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {IEvent} event - The event object.\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#resize\n\t * @desc Called after the chart as been resized.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Number} size - The new canvas display size (eq. canvas.style width & height).\n\t * @param {Object} options - The plugin options.\n\t */\n\t/**\n\t * @method IPlugin#destroy\n\t * @desc Called after the chart as been destroyed.\n\t * @param {Chart.Controller} chart - The chart instance.\n\t * @param {Object} options - The plugin options.\n\t */\n\n\t/**\n\t * Provided for backward compatibility, use Chart.plugins instead\n\t * @namespace Chart.pluginService\n\t * @deprecated since version 2.1.5\n\t * @todo remove at version 3\n\t * @private\n\t */\n\tChart.pluginService = Chart.plugins;\n\n\t/**\n\t * Provided for backward compatibility, inheriting from Chart.PlugingBase has no\n\t * effect, instead simply create/register plugins via plain JavaScript objects.\n\t * @interface Chart.PluginBase\n\t * @deprecated since version 2.5.0\n\t * @todo remove at version 3\n\t * @private\n\t */\n\tChart.PluginBase = Chart.Element.extend({});\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.defaults.scale = {\n\t\tdisplay: true,\n\t\tposition: 'left',\n\n\t\t// grid line settings\n\t\tgridLines: {\n\t\t\tdisplay: true,\n\t\t\tcolor: 'rgba(0, 0, 0, 0.1)',\n\t\t\tlineWidth: 1,\n\t\t\tdrawBorder: true,\n\t\t\tdrawOnChartArea: true,\n\t\t\tdrawTicks: true,\n\t\t\ttickMarkLength: 10,\n\t\t\tzeroLineWidth: 1,\n\t\t\tzeroLineColor: 'rgba(0,0,0,0.25)',\n\t\t\tzeroLineBorderDash: [],\n\t\t\tzeroLineBorderDashOffset: 0.0,\n\t\t\toffsetGridLines: false,\n\t\t\tborderDash: [],\n\t\t\tborderDashOffset: 0.0\n\t\t},\n\n\t\t// scale label\n\t\tscaleLabel: {\n\t\t\t// actual label\n\t\t\tlabelString: '',\n\n\t\t\t// display property\n\t\t\tdisplay: false\n\t\t},\n\n\t\t// label settings\n\t\tticks: {\n\t\t\tbeginAtZero: false,\n\t\t\tminRotation: 0,\n\t\t\tmaxRotation: 50,\n\t\t\tmirror: false,\n\t\t\tpadding: 0,\n\t\t\treverse: false,\n\t\t\tdisplay: true,\n\t\t\tautoSkip: true,\n\t\t\tautoSkipPadding: 0,\n\t\t\tlabelOffset: 0,\n\t\t\t// We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n\t\t\tcallback: Chart.Ticks.formatters.values\n\t\t}\n\t};\n\n\tfunction computeTextSize(context, tick, font) {\n\t\treturn helpers.isArray(tick) ?\n\t\t\thelpers.longestText(context, font, tick) :\n\t\t\tcontext.measureText(tick).width;\n\t}\n\n\tfunction parseFontOptions(options) {\n\t\tvar getValueOrDefault = helpers.getValueOrDefault;\n\t\tvar globalDefaults = Chart.defaults.global;\n\t\tvar size = getValueOrDefault(options.fontSize, globalDefaults.defaultFontSize);\n\t\tvar style = getValueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle);\n\t\tvar family = getValueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily);\n\n\t\treturn {\n\t\t\tsize: size,\n\t\t\tstyle: style,\n\t\t\tfamily: family,\n\t\t\tfont: helpers.fontString(size, style, family)\n\t\t};\n\t}\n\n\tChart.Scale = Chart.Element.extend({\n\t\t/**\n\t\t * Get the padding needed for the scale\n\t\t * @method getPadding\n\t\t * @private\n\t\t * @returns {Padding} the necessary padding\n\t\t */\n\t\tgetPadding: function() {\n\t\t\tvar me = this;\n\t\t\treturn {\n\t\t\t\tleft: me.paddingLeft || 0,\n\t\t\t\ttop: me.paddingTop || 0,\n\t\t\t\tright: me.paddingRight || 0,\n\t\t\t\tbottom: me.paddingBottom || 0\n\t\t\t};\n\t\t},\n\n\t\t// These methods are ordered by lifecyle. Utilities then follow.\n\t\t// Any function defined here is inherited by all scale types.\n\t\t// Any function can be extended by the scale type\n\n\t\tbeforeUpdate: function() {\n\t\t\thelpers.callback(this.options.beforeUpdate, [this]);\n\t\t},\n\t\tupdate: function(maxWidth, maxHeight, margins) {\n\t\t\tvar me = this;\n\n\t\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\t\t\tme.beforeUpdate();\n\n\t\t\t// Absorb the master measurements\n\t\t\tme.maxWidth = maxWidth;\n\t\t\tme.maxHeight = maxHeight;\n\t\t\tme.margins = helpers.extend({\n\t\t\t\tleft: 0,\n\t\t\t\tright: 0,\n\t\t\t\ttop: 0,\n\t\t\t\tbottom: 0\n\t\t\t}, margins);\n\t\t\tme.longestTextCache = me.longestTextCache || {};\n\n\t\t\t// Dimensions\n\t\t\tme.beforeSetDimensions();\n\t\t\tme.setDimensions();\n\t\t\tme.afterSetDimensions();\n\n\t\t\t// Data min/max\n\t\t\tme.beforeDataLimits();\n\t\t\tme.determineDataLimits();\n\t\t\tme.afterDataLimits();\n\n\t\t\t// Ticks\n\t\t\tme.beforeBuildTicks();\n\t\t\tme.buildTicks();\n\t\t\tme.afterBuildTicks();\n\n\t\t\tme.beforeTickToLabelConversion();\n\t\t\tme.convertTicksToLabels();\n\t\t\tme.afterTickToLabelConversion();\n\n\t\t\t// Tick Rotation\n\t\t\tme.beforeCalculateTickRotation();\n\t\t\tme.calculateTickRotation();\n\t\t\tme.afterCalculateTickRotation();\n\t\t\t// Fit\n\t\t\tme.beforeFit();\n\t\t\tme.fit();\n\t\t\tme.afterFit();\n\t\t\t//\n\t\t\tme.afterUpdate();\n\n\t\t\treturn me.minSize;\n\n\t\t},\n\t\tafterUpdate: function() {\n\t\t\thelpers.callback(this.options.afterUpdate, [this]);\n\t\t},\n\n\t\t//\n\n\t\tbeforeSetDimensions: function() {\n\t\t\thelpers.callback(this.options.beforeSetDimensions, [this]);\n\t\t},\n\t\tsetDimensions: function() {\n\t\t\tvar me = this;\n\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.width = me.maxWidth;\n\t\t\t\tme.left = 0;\n\t\t\t\tme.right = me.width;\n\t\t\t} else {\n\t\t\t\tme.height = me.maxHeight;\n\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.top = 0;\n\t\t\t\tme.bottom = me.height;\n\t\t\t}\n\n\t\t\t// Reset padding\n\t\t\tme.paddingLeft = 0;\n\t\t\tme.paddingTop = 0;\n\t\t\tme.paddingRight = 0;\n\t\t\tme.paddingBottom = 0;\n\t\t},\n\t\tafterSetDimensions: function() {\n\t\t\thelpers.callback(this.options.afterSetDimensions, [this]);\n\t\t},\n\n\t\t// Data limits\n\t\tbeforeDataLimits: function() {\n\t\t\thelpers.callback(this.options.beforeDataLimits, [this]);\n\t\t},\n\t\tdetermineDataLimits: helpers.noop,\n\t\tafterDataLimits: function() {\n\t\t\thelpers.callback(this.options.afterDataLimits, [this]);\n\t\t},\n\n\t\t//\n\t\tbeforeBuildTicks: function() {\n\t\t\thelpers.callback(this.options.beforeBuildTicks, [this]);\n\t\t},\n\t\tbuildTicks: helpers.noop,\n\t\tafterBuildTicks: function() {\n\t\t\thelpers.callback(this.options.afterBuildTicks, [this]);\n\t\t},\n\n\t\tbeforeTickToLabelConversion: function() {\n\t\t\thelpers.callback(this.options.beforeTickToLabelConversion, [this]);\n\t\t},\n\t\tconvertTicksToLabels: function() {\n\t\t\tvar me = this;\n\t\t\t// Convert ticks to strings\n\t\t\tvar tickOpts = me.options.ticks;\n\t\t\tme.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback);\n\t\t},\n\t\tafterTickToLabelConversion: function() {\n\t\t\thelpers.callback(this.options.afterTickToLabelConversion, [this]);\n\t\t},\n\n\t\t//\n\n\t\tbeforeCalculateTickRotation: function() {\n\t\t\thelpers.callback(this.options.beforeCalculateTickRotation, [this]);\n\t\t},\n\t\tcalculateTickRotation: function() {\n\t\t\tvar me = this;\n\t\t\tvar context = me.ctx;\n\t\t\tvar tickOpts = me.options.ticks;\n\n\t\t\t// Get the width of each grid by calculating the difference\n\t\t\t// between x offsets between 0 and 1.\n\t\t\tvar tickFont = parseFontOptions(tickOpts);\n\t\t\tcontext.font = tickFont.font;\n\n\t\t\tvar labelRotation = tickOpts.minRotation || 0;\n\n\t\t\tif (me.options.display && me.isHorizontal()) {\n\t\t\t\tvar originalLabelWidth = helpers.longestText(context, tickFont.font, me.ticks, me.longestTextCache);\n\t\t\t\tvar labelWidth = originalLabelWidth;\n\t\t\t\tvar cosRotation;\n\t\t\t\tvar sinRotation;\n\n\t\t\t\t// Allow 3 pixels x2 padding either side for label readability\n\t\t\t\tvar tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6;\n\n\t\t\t\t// Max label rotation can be set or default to 90 - also act as a loop counter\n\t\t\t\twhile (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) {\n\t\t\t\t\tvar angleRadians = helpers.toRadians(labelRotation);\n\t\t\t\t\tcosRotation = Math.cos(angleRadians);\n\t\t\t\t\tsinRotation = Math.sin(angleRadians);\n\n\t\t\t\t\tif (sinRotation * originalLabelWidth > me.maxHeight) {\n\t\t\t\t\t\t// go back one step\n\t\t\t\t\t\tlabelRotation--;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tlabelRotation++;\n\t\t\t\t\tlabelWidth = cosRotation * originalLabelWidth;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.labelRotation = labelRotation;\n\t\t},\n\t\tafterCalculateTickRotation: function() {\n\t\t\thelpers.callback(this.options.afterCalculateTickRotation, [this]);\n\t\t},\n\n\t\t//\n\n\t\tbeforeFit: function() {\n\t\t\thelpers.callback(this.options.beforeFit, [this]);\n\t\t},\n\t\tfit: function() {\n\t\t\tvar me = this;\n\t\t\t// Reset\n\t\t\tvar minSize = me.minSize = {\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0\n\t\t\t};\n\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\t\t\tvar scaleLabelOpts = opts.scaleLabel;\n\t\t\tvar gridLineOpts = opts.gridLines;\n\t\t\tvar display = opts.display;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\tvar tickFont = parseFontOptions(tickOpts);\n\t\t\tvar scaleLabelFontSize = parseFontOptions(scaleLabelOpts).size * 1.5;\n\t\t\tvar tickMarkLength = opts.gridLines.tickMarkLength;\n\n\t\t\t// Width\n\t\t\tif (isHorizontal) {\n\t\t\t\t// subtract the margins to line up with the chartArea if we are a full width scale\n\t\t\t\tminSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth;\n\t\t\t} else {\n\t\t\t\tminSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0;\n\t\t\t}\n\n\t\t\t// height\n\t\t\tif (isHorizontal) {\n\t\t\t\tminSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0;\n\t\t\t} else {\n\t\t\t\tminSize.height = me.maxHeight; // fill all the height\n\t\t\t}\n\n\t\t\t// Are we showing a title for the scale?\n\t\t\tif (scaleLabelOpts.display && display) {\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tminSize.height += scaleLabelFontSize;\n\t\t\t\t} else {\n\t\t\t\t\tminSize.width += scaleLabelFontSize;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Don't bother fitting the ticks if we are not showing them\n\t\t\tif (tickOpts.display && display) {\n\t\t\t\tvar largestTextWidth = helpers.longestText(me.ctx, tickFont.font, me.ticks, me.longestTextCache);\n\t\t\t\tvar tallestLabelHeightInLines = helpers.numberOfLabelLines(me.ticks);\n\t\t\t\tvar lineSpace = tickFont.size * 0.5;\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t// A horizontal axis is more constrained by the height.\n\t\t\t\t\tme.longestLabelWidth = largestTextWidth;\n\n\t\t\t\t\tvar angleRadians = helpers.toRadians(me.labelRotation);\n\t\t\t\t\tvar cosRotation = Math.cos(angleRadians);\n\t\t\t\t\tvar sinRotation = Math.sin(angleRadians);\n\n\t\t\t\t\t// TODO - improve this calculation\n\t\t\t\t\tvar labelHeight = (sinRotation * largestTextWidth)\n\t\t\t\t\t\t+ (tickFont.size * tallestLabelHeightInLines)\n\t\t\t\t\t\t+ (lineSpace * tallestLabelHeightInLines);\n\n\t\t\t\t\tminSize.height = Math.min(me.maxHeight, minSize.height + labelHeight);\n\t\t\t\t\tme.ctx.font = tickFont.font;\n\n\t\t\t\t\tvar firstTick = me.ticks[0];\n\t\t\t\t\tvar firstLabelWidth = computeTextSize(me.ctx, firstTick, tickFont.font);\n\n\t\t\t\t\tvar lastTick = me.ticks[me.ticks.length - 1];\n\t\t\t\t\tvar lastLabelWidth = computeTextSize(me.ctx, lastTick, tickFont.font);\n\n\t\t\t\t\t// Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned which means that the right padding is dominated\n\t\t\t\t\t// by the font height\n\t\t\t\t\tif (me.labelRotation !== 0) {\n\t\t\t\t\t\tme.paddingLeft = opts.position === 'bottom'? (cosRotation * firstLabelWidth) + 3: (cosRotation * lineSpace) + 3; // add 3 px to move away from canvas edges\n\t\t\t\t\t\tme.paddingRight = opts.position === 'bottom'? (cosRotation * lineSpace) + 3: (cosRotation * lastLabelWidth) + 3;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tme.paddingLeft = firstLabelWidth / 2 + 3; // add 3 px to move away from canvas edges\n\t\t\t\t\t\tme.paddingRight = lastLabelWidth / 2 + 3;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// A vertical axis is more constrained by the width. Labels are the dominant factor here, so get that length first\n\t\t\t\t\t// Account for padding\n\n\t\t\t\t\tif (tickOpts.mirror) {\n\t\t\t\t\t\tlargestTextWidth = 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlargestTextWidth += me.options.ticks.padding;\n\t\t\t\t\t}\n\t\t\t\t\tminSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth);\n\t\t\t\t\tme.paddingTop = tickFont.size / 2;\n\t\t\t\t\tme.paddingBottom = tickFont.size / 2;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.handleMargins();\n\n\t\t\tme.width = minSize.width;\n\t\t\tme.height = minSize.height;\n\t\t},\n\n\t\t/**\n\t\t * Handle margins and padding interactions\n\t\t * @private\n\t\t */\n\t\thandleMargins: function() {\n\t\t\tvar me = this;\n\t\t\tif (me.margins) {\n\t\t\t\tme.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0);\n\t\t\t\tme.paddingTop = Math.max(me.paddingTop - me.margins.top, 0);\n\t\t\t\tme.paddingRight = Math.max(me.paddingRight - me.margins.right, 0);\n\t\t\t\tme.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0);\n\t\t\t}\n\t\t},\n\n\t\tafterFit: function() {\n\t\t\thelpers.callback(this.options.afterFit, [this]);\n\t\t},\n\n\t\t// Shared Methods\n\t\tisHorizontal: function() {\n\t\t\treturn this.options.position === 'top' || this.options.position === 'bottom';\n\t\t},\n\t\tisFullWidth: function() {\n\t\t\treturn (this.options.fullWidth);\n\t\t},\n\n\t\t// Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not\n\t\tgetRightValue: function(rawValue) {\n\t\t\t// Null and undefined values first\n\t\t\tif (rawValue === null || typeof(rawValue) === 'undefined') {\n\t\t\t\treturn NaN;\n\t\t\t}\n\t\t\t// isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values\n\t\t\tif (typeof(rawValue) === 'number' && !isFinite(rawValue)) {\n\t\t\t\treturn NaN;\n\t\t\t}\n\t\t\t// If it is in fact an object, dive in one more level\n\t\t\tif (typeof(rawValue) === 'object') {\n\t\t\t\tif ((rawValue instanceof Date) || (rawValue.isValid)) {\n\t\t\t\t\treturn rawValue;\n\t\t\t\t}\n\t\t\t\treturn this.getRightValue(this.isHorizontal() ? rawValue.x : rawValue.y);\n\t\t\t}\n\n\t\t\t// Value is good, return it\n\t\t\treturn rawValue;\n\t\t},\n\n\t\t// Used to get the value to display in the tooltip for the data at the given index\n\t\t// function getLabelForIndex(index, datasetIndex)\n\t\tgetLabelForIndex: helpers.noop,\n\n\t\t// Used to get data value locations.  Value can either be an index or a numerical value\n\t\tgetPixelForValue: helpers.noop,\n\n\t\t// Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n\t\tgetValueForPixel: helpers.noop,\n\n\t\t// Used for tick location, should\n\t\tgetPixelForTick: function(index, includeOffset) {\n\t\t\tvar me = this;\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tvar innerWidth = me.width - (me.paddingLeft + me.paddingRight);\n\t\t\t\tvar tickWidth = innerWidth / Math.max((me.ticks.length - ((me.options.gridLines.offsetGridLines) ? 0 : 1)), 1);\n\t\t\t\tvar pixel = (tickWidth * index) + me.paddingLeft;\n\n\t\t\t\tif (includeOffset) {\n\t\t\t\t\tpixel += tickWidth / 2;\n\t\t\t\t}\n\n\t\t\t\tvar finalVal = me.left + Math.round(pixel);\n\t\t\t\tfinalVal += me.isFullWidth() ? me.margins.left : 0;\n\t\t\t\treturn finalVal;\n\t\t\t}\n\t\t\tvar innerHeight = me.height - (me.paddingTop + me.paddingBottom);\n\t\t\treturn me.top + (index * (innerHeight / (me.ticks.length - 1)));\n\t\t},\n\n\t\t// Utility for getting the pixel location of a percentage of scale\n\t\tgetPixelForDecimal: function(decimal /* , includeOffset*/) {\n\t\t\tvar me = this;\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tvar innerWidth = me.width - (me.paddingLeft + me.paddingRight);\n\t\t\t\tvar valueOffset = (innerWidth * decimal) + me.paddingLeft;\n\n\t\t\t\tvar finalVal = me.left + Math.round(valueOffset);\n\t\t\t\tfinalVal += me.isFullWidth() ? me.margins.left : 0;\n\t\t\t\treturn finalVal;\n\t\t\t}\n\t\t\treturn me.top + (decimal * me.height);\n\t\t},\n\n\t\tgetBasePixel: function() {\n\t\t\treturn this.getPixelForValue(this.getBaseValue());\n\t\t},\n\n\t\tgetBaseValue: function() {\n\t\t\tvar me = this;\n\t\t\tvar min = me.min;\n\t\t\tvar max = me.max;\n\n\t\t\treturn me.beginAtZero ? 0:\n\t\t\t\tmin < 0 && max < 0? max :\n\t\t\t\tmin > 0 && max > 0? min :\n\t\t\t\t0;\n\t\t},\n\n\t\t// Actually draw the scale on the canvas\n\t\t// @param {rectangle} chartArea : the area of the chart to draw full grid lines on\n\t\tdraw: function(chartArea) {\n\t\t\tvar me = this;\n\t\t\tvar options = me.options;\n\t\t\tif (!options.display) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar context = me.ctx;\n\t\t\tvar globalDefaults = Chart.defaults.global;\n\t\t\tvar optionTicks = options.ticks;\n\t\t\tvar gridLines = options.gridLines;\n\t\t\tvar scaleLabel = options.scaleLabel;\n\n\t\t\tvar isRotated = me.labelRotation !== 0;\n\t\t\tvar skipRatio;\n\t\t\tvar useAutoskipper = optionTicks.autoSkip;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\t// figure out the maximum number of gridlines to show\n\t\t\tvar maxTicks;\n\t\t\tif (optionTicks.maxTicksLimit) {\n\t\t\t\tmaxTicks = optionTicks.maxTicksLimit;\n\t\t\t}\n\n\t\t\tvar tickFontColor = helpers.getValueOrDefault(optionTicks.fontColor, globalDefaults.defaultFontColor);\n\t\t\tvar tickFont = parseFontOptions(optionTicks);\n\n\t\t\tvar tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0;\n\n\t\t\tvar scaleLabelFontColor = helpers.getValueOrDefault(scaleLabel.fontColor, globalDefaults.defaultFontColor);\n\t\t\tvar scaleLabelFont = parseFontOptions(scaleLabel);\n\n\t\t\tvar labelRotationRadians = helpers.toRadians(me.labelRotation);\n\t\t\tvar cosRotation = Math.cos(labelRotationRadians);\n\t\t\tvar longestRotatedLabel = me.longestLabelWidth * cosRotation;\n\n\t\t\t// Make sure we draw text in the correct color and font\n\t\t\tcontext.fillStyle = tickFontColor;\n\n\t\t\tvar itemsToDraw = [];\n\n\t\t\tif (isHorizontal) {\n\t\t\t\tskipRatio = false;\n\n\t\t\t\tif ((longestRotatedLabel + optionTicks.autoSkipPadding) * me.ticks.length > (me.width - (me.paddingLeft + me.paddingRight))) {\n\t\t\t\t\tskipRatio = 1 + Math.floor(((longestRotatedLabel + optionTicks.autoSkipPadding) * me.ticks.length) / (me.width - (me.paddingLeft + me.paddingRight)));\n\t\t\t\t}\n\n\t\t\t\t// if they defined a max number of optionTicks,\n\t\t\t\t// increase skipRatio until that number is met\n\t\t\t\tif (maxTicks && me.ticks.length > maxTicks) {\n\t\t\t\t\twhile (!skipRatio || me.ticks.length / (skipRatio || 1) > maxTicks) {\n\t\t\t\t\t\tif (!skipRatio) {\n\t\t\t\t\t\t\tskipRatio = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tskipRatio += 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!useAutoskipper) {\n\t\t\t\t\tskipRatio = false;\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\tvar xTickStart = options.position === 'right' ? me.left : me.right - tl;\n\t\t\tvar xTickEnd = options.position === 'right' ? me.left + tl : me.right;\n\t\t\tvar yTickStart = options.position === 'bottom' ? me.top : me.bottom - tl;\n\t\t\tvar yTickEnd = options.position === 'bottom' ? me.top + tl : me.bottom;\n\n\t\t\thelpers.each(me.ticks, function(label, index) {\n\t\t\t\t// If the callback returned a null or undefined value, do not draw this line\n\t\t\t\tif (label === undefined || label === null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar isLastTick = me.ticks.length === index + 1;\n\n\t\t\t\t// Since we always show the last tick,we need may need to hide the last shown one before\n\t\t\t\tvar shouldSkip = (skipRatio > 1 && index % skipRatio > 0) || (index % skipRatio === 0 && index + skipRatio >= me.ticks.length);\n\t\t\t\tif (shouldSkip && !isLastTick || (label === undefined || label === null)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar lineWidth, lineColor, borderDash, borderDashOffset;\n\t\t\t\tif (index === (typeof me.zeroLineIndex !== 'undefined' ? me.zeroLineIndex : 0)) {\n\t\t\t\t\t// Draw the first index specially\n\t\t\t\t\tlineWidth = gridLines.zeroLineWidth;\n\t\t\t\t\tlineColor = gridLines.zeroLineColor;\n\t\t\t\t\tborderDash = gridLines.zeroLineBorderDash;\n\t\t\t\t\tborderDashOffset = gridLines.zeroLineBorderDashOffset;\n\t\t\t\t} else {\n\t\t\t\t\tlineWidth = helpers.getValueAtIndexOrDefault(gridLines.lineWidth, index);\n\t\t\t\t\tlineColor = helpers.getValueAtIndexOrDefault(gridLines.color, index);\n\t\t\t\t\tborderDash = helpers.getValueOrDefault(gridLines.borderDash, globalDefaults.borderDash);\n\t\t\t\t\tborderDashOffset = helpers.getValueOrDefault(gridLines.borderDashOffset, globalDefaults.borderDashOffset);\n\t\t\t\t}\n\n\t\t\t\t// Common properties\n\t\t\t\tvar tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY;\n\t\t\t\tvar textAlign = 'middle';\n\t\t\t\tvar textBaseline = 'middle';\n\n\t\t\t\tif (isHorizontal) {\n\n\t\t\t\t\tif (options.position === 'bottom') {\n\t\t\t\t\t\t// bottom\n\t\t\t\t\t\ttextBaseline = !isRotated? 'top':'middle';\n\t\t\t\t\t\ttextAlign = !isRotated? 'center': 'right';\n\t\t\t\t\t\tlabelY = me.top + tl;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// top\n\t\t\t\t\t\ttextBaseline = !isRotated? 'bottom':'middle';\n\t\t\t\t\t\ttextAlign = !isRotated? 'center': 'left';\n\t\t\t\t\t\tlabelY = me.bottom - tl;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar xLineValue = me.getPixelForTick(index) + helpers.aliasPixel(lineWidth); // xvalues for grid lines\n\t\t\t\t\tlabelX = me.getPixelForTick(index, gridLines.offsetGridLines) + optionTicks.labelOffset; // x values for optionTicks (need to consider offsetLabel option)\n\n\t\t\t\t\ttx1 = tx2 = x1 = x2 = xLineValue;\n\t\t\t\t\tty1 = yTickStart;\n\t\t\t\t\tty2 = yTickEnd;\n\t\t\t\t\ty1 = chartArea.top;\n\t\t\t\t\ty2 = chartArea.bottom;\n\t\t\t\t} else {\n\t\t\t\t\tvar isLeft = options.position === 'left';\n\t\t\t\t\tvar tickPadding = optionTicks.padding;\n\t\t\t\t\tvar labelXOffset;\n\n\t\t\t\t\tif (optionTicks.mirror) {\n\t\t\t\t\t\ttextAlign = isLeft ? 'left' : 'right';\n\t\t\t\t\t\tlabelXOffset = tickPadding;\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttextAlign = isLeft ? 'right' : 'left';\n\t\t\t\t\t\tlabelXOffset = tl + tickPadding;\n\t\t\t\t\t}\n\n\t\t\t\t\tlabelX = isLeft ? me.right - labelXOffset : me.left + labelXOffset;\n\n\t\t\t\t\tvar yLineValue = me.getPixelForTick(index); // xvalues for grid lines\n\t\t\t\t\tyLineValue += helpers.aliasPixel(lineWidth);\n\t\t\t\t\tlabelY = me.getPixelForTick(index, gridLines.offsetGridLines);\n\n\t\t\t\t\ttx1 = xTickStart;\n\t\t\t\t\ttx2 = xTickEnd;\n\t\t\t\t\tx1 = chartArea.left;\n\t\t\t\t\tx2 = chartArea.right;\n\t\t\t\t\tty1 = ty2 = y1 = y2 = yLineValue;\n\t\t\t\t}\n\n\t\t\t\titemsToDraw.push({\n\t\t\t\t\ttx1: tx1,\n\t\t\t\t\tty1: ty1,\n\t\t\t\t\ttx2: tx2,\n\t\t\t\t\tty2: ty2,\n\t\t\t\t\tx1: x1,\n\t\t\t\t\ty1: y1,\n\t\t\t\t\tx2: x2,\n\t\t\t\t\ty2: y2,\n\t\t\t\t\tlabelX: labelX,\n\t\t\t\t\tlabelY: labelY,\n\t\t\t\t\tglWidth: lineWidth,\n\t\t\t\t\tglColor: lineColor,\n\t\t\t\t\tglBorderDash: borderDash,\n\t\t\t\t\tglBorderDashOffset: borderDashOffset,\n\t\t\t\t\trotation: -1 * labelRotationRadians,\n\t\t\t\t\tlabel: label,\n\t\t\t\t\ttextBaseline: textBaseline,\n\t\t\t\t\ttextAlign: textAlign\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t// Draw all of the tick labels, tick marks, and grid lines at the correct places\n\t\t\thelpers.each(itemsToDraw, function(itemToDraw) {\n\t\t\t\tif (gridLines.display) {\n\t\t\t\t\tcontext.save();\n\t\t\t\t\tcontext.lineWidth = itemToDraw.glWidth;\n\t\t\t\t\tcontext.strokeStyle = itemToDraw.glColor;\n\t\t\t\t\tif (context.setLineDash) {\n\t\t\t\t\t\tcontext.setLineDash(itemToDraw.glBorderDash);\n\t\t\t\t\t\tcontext.lineDashOffset = itemToDraw.glBorderDashOffset;\n\t\t\t\t\t}\n\n\t\t\t\t\tcontext.beginPath();\n\n\t\t\t\t\tif (gridLines.drawTicks) {\n\t\t\t\t\t\tcontext.moveTo(itemToDraw.tx1, itemToDraw.ty1);\n\t\t\t\t\t\tcontext.lineTo(itemToDraw.tx2, itemToDraw.ty2);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (gridLines.drawOnChartArea) {\n\t\t\t\t\t\tcontext.moveTo(itemToDraw.x1, itemToDraw.y1);\n\t\t\t\t\t\tcontext.lineTo(itemToDraw.x2, itemToDraw.y2);\n\t\t\t\t\t}\n\n\t\t\t\t\tcontext.stroke();\n\t\t\t\t\tcontext.restore();\n\t\t\t\t}\n\n\t\t\t\tif (optionTicks.display) {\n\t\t\t\t\tcontext.save();\n\t\t\t\t\tcontext.translate(itemToDraw.labelX, itemToDraw.labelY);\n\t\t\t\t\tcontext.rotate(itemToDraw.rotation);\n\t\t\t\t\tcontext.font = tickFont.font;\n\t\t\t\t\tcontext.textBaseline = itemToDraw.textBaseline;\n\t\t\t\t\tcontext.textAlign = itemToDraw.textAlign;\n\n\t\t\t\t\tvar label = itemToDraw.label;\n\t\t\t\t\tif (helpers.isArray(label)) {\n\t\t\t\t\t\tfor (var i = 0, y = 0; i < label.length; ++i) {\n\t\t\t\t\t\t\t// We just make sure the multiline element is a string here..\n\t\t\t\t\t\t\tcontext.fillText('' + label[i], 0, y);\n\t\t\t\t\t\t\t// apply same lineSpacing as calculated @ L#320\n\t\t\t\t\t\t\ty += (tickFont.size * 1.5);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.fillText(label, 0, 0);\n\t\t\t\t\t}\n\t\t\t\t\tcontext.restore();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (scaleLabel.display) {\n\t\t\t\t// Draw the scale label\n\t\t\t\tvar scaleLabelX;\n\t\t\t\tvar scaleLabelY;\n\t\t\t\tvar rotation = 0;\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tscaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width\n\t\t\t\t\tscaleLabelY = options.position === 'bottom' ? me.bottom - (scaleLabelFont.size / 2) : me.top + (scaleLabelFont.size / 2);\n\t\t\t\t} else {\n\t\t\t\t\tvar isLeft = options.position === 'left';\n\t\t\t\t\tscaleLabelX = isLeft ? me.left + (scaleLabelFont.size / 2) : me.right - (scaleLabelFont.size / 2);\n\t\t\t\t\tscaleLabelY = me.top + ((me.bottom - me.top) / 2);\n\t\t\t\t\trotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI;\n\t\t\t\t}\n\n\t\t\t\tcontext.save();\n\t\t\t\tcontext.translate(scaleLabelX, scaleLabelY);\n\t\t\t\tcontext.rotate(rotation);\n\t\t\t\tcontext.textAlign = 'center';\n\t\t\t\tcontext.textBaseline = 'middle';\n\t\t\t\tcontext.fillStyle = scaleLabelFontColor; // render in correct colour\n\t\t\t\tcontext.font = scaleLabelFont.font;\n\t\t\t\tcontext.fillText(scaleLabel.labelString, 0, 0);\n\t\t\t\tcontext.restore();\n\t\t\t}\n\n\t\t\tif (gridLines.drawBorder) {\n\t\t\t\t// Draw the line at the edge of the axis\n\t\t\t\tcontext.lineWidth = helpers.getValueAtIndexOrDefault(gridLines.lineWidth, 0);\n\t\t\t\tcontext.strokeStyle = helpers.getValueAtIndexOrDefault(gridLines.color, 0);\n\t\t\t\tvar x1 = me.left,\n\t\t\t\t\tx2 = me.right,\n\t\t\t\t\ty1 = me.top,\n\t\t\t\t\ty2 = me.bottom;\n\n\t\t\t\tvar aliasPixel = helpers.aliasPixel(context.lineWidth);\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\ty1 = y2 = options.position === 'top' ? me.bottom : me.top;\n\t\t\t\t\ty1 += aliasPixel;\n\t\t\t\t\ty2 += aliasPixel;\n\t\t\t\t} else {\n\t\t\t\t\tx1 = x2 = options.position === 'left' ? me.right : me.left;\n\t\t\t\t\tx1 += aliasPixel;\n\t\t\t\t\tx2 += aliasPixel;\n\t\t\t\t}\n\n\t\t\t\tcontext.beginPath();\n\t\t\t\tcontext.moveTo(x1, y1);\n\t\t\t\tcontext.lineTo(x2, y2);\n\t\t\t\tcontext.stroke();\n\t\t\t}\n\t\t}\n\t});\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tChart.scaleService = {\n\t\t// Scale registration object. Extensions can register new scale types (such as log or DB scales) and then\n\t\t// use the new chart options to grab the correct scale\n\t\tconstructors: {},\n\t\t// Use a registration function so that we can move to an ES6 map when we no longer need to support\n\t\t// old browsers\n\n\t\t// Scale config defaults\n\t\tdefaults: {},\n\t\tregisterScaleType: function(type, scaleConstructor, defaults) {\n\t\t\tthis.constructors[type] = scaleConstructor;\n\t\t\tthis.defaults[type] = helpers.clone(defaults);\n\t\t},\n\t\tgetScaleConstructor: function(type) {\n\t\t\treturn this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined;\n\t\t},\n\t\tgetScaleDefaults: function(type) {\n\t\t\t// Return the scale defaults merged with the global settings so that we always use the latest ones\n\t\t\treturn this.defaults.hasOwnProperty(type) ? helpers.scaleMerge(Chart.defaults.scale, this.defaults[type]) : {};\n\t\t},\n\t\tupdateScaleDefaults: function(type, additions) {\n\t\t\tvar defaults = this.defaults;\n\t\t\tif (defaults.hasOwnProperty(type)) {\n\t\t\t\tdefaults[type] = helpers.extend(defaults[type], additions);\n\t\t\t}\n\t\t},\n\t\taddScalesToLayout: function(chart) {\n\t\t\t// Adds each scale to the chart.boxes array to be sized accordingly\n\t\t\thelpers.each(chart.scales, function(scale) {\n\t\t\t\t// Set ILayoutItem parameters for backwards compatibility\n\t\t\t\tscale.fullWidth = scale.options.fullWidth;\n\t\t\t\tscale.position = scale.options.position;\n\t\t\t\tscale.weight = scale.options.weight;\n\t\t\t\tChart.layoutService.addBox(chart, scale);\n\t\t\t});\n\t\t}\n\t};\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\t/**\n\t * Namespace to hold static tick generation functions\n\t * @namespace Chart.Ticks\n\t */\n\tChart.Ticks = {\n\t\t/**\n\t\t * Namespace to hold generators for different types of ticks\n\t\t * @namespace Chart.Ticks.generators\n\t\t */\n\t\tgenerators: {\n\t\t\t/**\n\t\t\t * Interface for the options provided to the numeric tick generator\n\t\t\t * @interface INumericTickGenerationOptions\n\t\t\t */\n\t\t\t/**\n\t\t\t * The maximum number of ticks to display\n\t\t\t * @name INumericTickGenerationOptions#maxTicks\n\t\t\t * @type Number\n\t\t\t */\n\t\t\t/**\n\t\t\t * The distance between each tick.\n\t\t\t * @name INumericTickGenerationOptions#stepSize\n\t\t\t * @type Number\n\t\t\t * @optional\n\t\t\t */\n\t\t\t/**\n\t\t\t * Forced minimum for the ticks. If not specified, the minimum of the data range is used to calculate the tick minimum\n\t\t\t * @name INumericTickGenerationOptions#min\n\t\t\t * @type Number\n\t\t\t * @optional\n\t\t\t */\n\t\t\t/**\n\t\t\t * The maximum value of the ticks. If not specified, the maximum of the data range is used to calculate the tick maximum\n\t\t\t * @name INumericTickGenerationOptions#max\n\t\t\t * @type Number\n\t\t\t * @optional\n\t\t\t */\n\n\t\t\t/**\n\t\t\t * Generate a set of linear ticks\n\t\t\t * @method Chart.Ticks.generators.linear\n\t\t\t * @param generationOptions {INumericTickGenerationOptions} the options used to generate the ticks\n\t\t\t * @param dataRange {IRange} the range of the data\n\t\t\t * @returns {Array<Number>} array of tick values\n\t\t\t */\n\t\t\tlinear: function(generationOptions, dataRange) {\n\t\t\t\tvar ticks = [];\n\t\t\t\t// To get a \"nice\" value for the tick spacing, we will use the appropriately named\n\t\t\t\t// \"nice number\" algorithm. See http://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n\t\t\t\t// for details.\n\n\t\t\t\tvar spacing;\n\t\t\t\tif (generationOptions.stepSize && generationOptions.stepSize > 0) {\n\t\t\t\t\tspacing = generationOptions.stepSize;\n\t\t\t\t} else {\n\t\t\t\t\tvar niceRange = helpers.niceNum(dataRange.max - dataRange.min, false);\n\t\t\t\t\tspacing = helpers.niceNum(niceRange / (generationOptions.maxTicks - 1), true);\n\t\t\t\t}\n\t\t\t\tvar niceMin = Math.floor(dataRange.min / spacing) * spacing;\n\t\t\t\tvar niceMax = Math.ceil(dataRange.max / spacing) * spacing;\n\n\t\t\t\t// If min, max and stepSize is set and they make an evenly spaced scale use it.\n\t\t\t\tif (generationOptions.min && generationOptions.max && generationOptions.stepSize) {\n\t\t\t\t\t// If very close to our whole number, use it.\n\t\t\t\t\tif (helpers.almostWhole((generationOptions.max - generationOptions.min) / generationOptions.stepSize, spacing / 1000)) {\n\t\t\t\t\t\tniceMin = generationOptions.min;\n\t\t\t\t\t\tniceMax = generationOptions.max;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar numSpaces = (niceMax - niceMin) / spacing;\n\t\t\t\t// If very close to our rounded value, use it.\n\t\t\t\tif (helpers.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n\t\t\t\t\tnumSpaces = Math.round(numSpaces);\n\t\t\t\t} else {\n\t\t\t\t\tnumSpaces = Math.ceil(numSpaces);\n\t\t\t\t}\n\n\t\t\t\t// Put the values into the ticks array\n\t\t\t\tticks.push(generationOptions.min !== undefined ? generationOptions.min : niceMin);\n\t\t\t\tfor (var j = 1; j < numSpaces; ++j) {\n\t\t\t\t\tticks.push(niceMin + (j * spacing));\n\t\t\t\t}\n\t\t\t\tticks.push(generationOptions.max !== undefined ? generationOptions.max : niceMax);\n\n\t\t\t\treturn ticks;\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Generate a set of logarithmic ticks\n\t\t\t * @method Chart.Ticks.generators.logarithmic\n\t\t\t * @param generationOptions {INumericTickGenerationOptions} the options used to generate the ticks\n\t\t\t * @param dataRange {IRange} the range of the data\n\t\t\t * @returns {Array<Number>} array of tick values\n\t\t\t */\n\t\t\tlogarithmic: function(generationOptions, dataRange) {\n\t\t\t\tvar ticks = [];\n\t\t\t\tvar getValueOrDefault = helpers.getValueOrDefault;\n\n\t\t\t\t// Figure out what the max number of ticks we can support it is based on the size of\n\t\t\t\t// the axis area. For now, we say that the minimum tick spacing in pixels must be 50\n\t\t\t\t// We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n\t\t\t\t// the graph\n\t\t\t\tvar tickVal = getValueOrDefault(generationOptions.min, Math.pow(10, Math.floor(helpers.log10(dataRange.min))));\n\n\t\t\t\tvar endExp = Math.floor(helpers.log10(dataRange.max));\n\t\t\t\tvar endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp));\n\t\t\t\tvar exp;\n\t\t\t\tvar significand;\n\n\t\t\t\tif (tickVal === 0) {\n\t\t\t\t\texp = Math.floor(helpers.log10(dataRange.minNotZero));\n\t\t\t\t\tsignificand = Math.floor(dataRange.minNotZero / Math.pow(10, exp));\n\n\t\t\t\t\tticks.push(tickVal);\n\t\t\t\t\ttickVal = significand * Math.pow(10, exp);\n\t\t\t\t} else {\n\t\t\t\t\texp = Math.floor(helpers.log10(tickVal));\n\t\t\t\t\tsignificand = Math.floor(tickVal / Math.pow(10, exp));\n\t\t\t\t}\n\n\t\t\t\tdo {\n\t\t\t\t\tticks.push(tickVal);\n\n\t\t\t\t\t++significand;\n\t\t\t\t\tif (significand === 10) {\n\t\t\t\t\t\tsignificand = 1;\n\t\t\t\t\t\t++exp;\n\t\t\t\t\t}\n\n\t\t\t\t\ttickVal = significand * Math.pow(10, exp);\n\t\t\t\t} while (exp < endExp || (exp === endExp && significand < endSignificand));\n\n\t\t\t\tvar lastTick = getValueOrDefault(generationOptions.max, tickVal);\n\t\t\t\tticks.push(lastTick);\n\n\t\t\t\treturn ticks;\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Namespace to hold formatters for different types of ticks\n\t\t * @namespace Chart.Ticks.formatters\n\t\t */\n\t\tformatters: {\n\t\t\t/**\n\t\t\t * Formatter for value labels\n\t\t\t * @method Chart.Ticks.formatters.values\n\t\t\t * @param value the value to display\n\t\t\t * @return {String|Array} the label to display\n\t\t\t */\n\t\t\tvalues: function(value) {\n\t\t\t\treturn helpers.isArray(value) ? value : '' + value;\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Formatter for linear numeric ticks\n\t\t\t * @method Chart.Ticks.formatters.linear\n\t\t\t * @param tickValue {Number} the value to be formatted\n\t\t\t * @param index {Number} the position of the tickValue parameter in the ticks array\n\t\t\t * @param ticks {Array<Number>} the list of ticks being converted\n\t\t\t * @return {String} string representation of the tickValue parameter\n\t\t\t */\n\t\t\tlinear: function(tickValue, index, ticks) {\n\t\t\t\t// If we have lots of ticks, don't use the ones\n\t\t\t\tvar delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0];\n\n\t\t\t\t// If we have a number like 2.5 as the delta, figure out how many decimal places we need\n\t\t\t\tif (Math.abs(delta) > 1) {\n\t\t\t\t\tif (tickValue !== Math.floor(tickValue)) {\n\t\t\t\t\t\t// not an integer\n\t\t\t\t\t\tdelta = tickValue - Math.floor(tickValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar logDelta = helpers.log10(Math.abs(delta));\n\t\t\t\tvar tickString = '';\n\n\t\t\t\tif (tickValue !== 0) {\n\t\t\t\t\tvar numDecimal = -1 * Math.floor(logDelta);\n\t\t\t\t\tnumDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places\n\t\t\t\t\ttickString = tickValue.toFixed(numDecimal);\n\t\t\t\t} else {\n\t\t\t\t\ttickString = '0'; // never show decimal places for 0\n\t\t\t\t}\n\n\t\t\t\treturn tickString;\n\t\t\t},\n\n\t\t\tlogarithmic: function(tickValue, index, ticks) {\n\t\t\t\tvar remain = tickValue / (Math.pow(10, Math.floor(helpers.log10(tickValue))));\n\n\t\t\t\tif (tickValue === 0) {\n\t\t\t\t\treturn '0';\n\t\t\t\t} else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) {\n\t\t\t\t\treturn tickValue.toExponential();\n\t\t\t\t}\n\t\t\t\treturn '';\n\t\t\t}\n\t\t}\n\t};\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\t/**\n \t * Helper method to merge the opacity into a color\n \t */\n\tfunction mergeOpacity(colorString, opacity) {\n\t\tvar color = helpers.color(colorString);\n\t\treturn color.alpha(opacity * color.alpha()).rgbaString();\n\t}\n\n\tChart.defaults.global.tooltips = {\n\t\tenabled: true,\n\t\tcustom: null,\n\t\tmode: 'nearest',\n\t\tposition: 'average',\n\t\tintersect: true,\n\t\tbackgroundColor: 'rgba(0,0,0,0.8)',\n\t\ttitleFontStyle: 'bold',\n\t\ttitleSpacing: 2,\n\t\ttitleMarginBottom: 6,\n\t\ttitleFontColor: '#fff',\n\t\ttitleAlign: 'left',\n\t\tbodySpacing: 2,\n\t\tbodyFontColor: '#fff',\n\t\tbodyAlign: 'left',\n\t\tfooterFontStyle: 'bold',\n\t\tfooterSpacing: 2,\n\t\tfooterMarginTop: 6,\n\t\tfooterFontColor: '#fff',\n\t\tfooterAlign: 'left',\n\t\tyPadding: 6,\n\t\txPadding: 6,\n\t\tcaretPadding: 2,\n\t\tcaretSize: 5,\n\t\tcornerRadius: 6,\n\t\tmultiKeyBackground: '#fff',\n\t\tdisplayColors: true,\n\t\tborderColor: 'rgba(0,0,0,0)',\n\t\tborderWidth: 0,\n\t\tcallbacks: {\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tbeforeTitle: helpers.noop,\n\t\t\ttitle: function(tooltipItems, data) {\n\t\t\t\t// Pick first xLabel for now\n\t\t\t\tvar title = '';\n\t\t\t\tvar labels = data.labels;\n\t\t\t\tvar labelCount = labels ? labels.length : 0;\n\n\t\t\t\tif (tooltipItems.length > 0) {\n\t\t\t\t\tvar item = tooltipItems[0];\n\n\t\t\t\t\tif (item.xLabel) {\n\t\t\t\t\t\ttitle = item.xLabel;\n\t\t\t\t\t} else if (labelCount > 0 && item.index < labelCount) {\n\t\t\t\t\t\ttitle = labels[item.index];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn title;\n\t\t\t},\n\t\t\tafterTitle: helpers.noop,\n\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tbeforeBody: helpers.noop,\n\n\t\t\t// Args are: (tooltipItem, data)\n\t\t\tbeforeLabel: helpers.noop,\n\t\t\tlabel: function(tooltipItem, data) {\n\t\t\t\tvar label = data.datasets[tooltipItem.datasetIndex].label || '';\n\n\t\t\t\tif (label) {\n\t\t\t\t\tlabel += ': ';\n\t\t\t\t}\n\t\t\t\tlabel += tooltipItem.yLabel;\n\t\t\t\treturn label;\n\t\t\t},\n\t\t\tlabelColor: function(tooltipItem, chart) {\n\t\t\t\tvar meta = chart.getDatasetMeta(tooltipItem.datasetIndex);\n\t\t\t\tvar activeElement = meta.data[tooltipItem.index];\n\t\t\t\tvar view = activeElement._view;\n\t\t\t\treturn {\n\t\t\t\t\tborderColor: view.borderColor,\n\t\t\t\t\tbackgroundColor: view.backgroundColor\n\t\t\t\t};\n\t\t\t},\n\t\t\tafterLabel: helpers.noop,\n\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tafterBody: helpers.noop,\n\n\t\t\t// Args are: (tooltipItems, data)\n\t\t\tbeforeFooter: helpers.noop,\n\t\t\tfooter: helpers.noop,\n\t\t\tafterFooter: helpers.noop\n\t\t}\n\t};\n\n\t// Helper to push or concat based on if the 2nd parameter is an array or not\n\tfunction pushOrConcat(base, toPush) {\n\t\tif (toPush) {\n\t\t\tif (helpers.isArray(toPush)) {\n\t\t\t\t// base = base.concat(toPush);\n\t\t\t\tArray.prototype.push.apply(base, toPush);\n\t\t\t} else {\n\t\t\t\tbase.push(toPush);\n\t\t\t}\n\t\t}\n\n\t\treturn base;\n\t}\n\n\t// Private helper to create a tooltip item model\n\t// @param element : the chart element (point, arc, bar) to create the tooltip item for\n\t// @return : new tooltip item\n\tfunction createTooltipItem(element) {\n\t\tvar xScale = element._xScale;\n\t\tvar yScale = element._yScale || element._scale; // handle radar || polarArea charts\n\t\tvar index = element._index,\n\t\t\tdatasetIndex = element._datasetIndex;\n\n\t\treturn {\n\t\t\txLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '',\n\t\t\tyLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '',\n\t\t\tindex: index,\n\t\t\tdatasetIndex: datasetIndex,\n\t\t\tx: element._model.x,\n\t\t\ty: element._model.y\n\t\t};\n\t}\n\n\t/**\n\t * Helper to get the reset model for the tooltip\n\t * @param tooltipOpts {Object} the tooltip options\n\t */\n\tfunction getBaseModel(tooltipOpts) {\n\t\tvar globalDefaults = Chart.defaults.global;\n\t\tvar getValueOrDefault = helpers.getValueOrDefault;\n\n\t\treturn {\n\t\t\t// Positioning\n\t\t\txPadding: tooltipOpts.xPadding,\n\t\t\tyPadding: tooltipOpts.yPadding,\n\t\t\txAlign: tooltipOpts.xAlign,\n\t\t\tyAlign: tooltipOpts.yAlign,\n\n\t\t\t// Body\n\t\t\tbodyFontColor: tooltipOpts.bodyFontColor,\n\t\t\t_bodyFontFamily: getValueOrDefault(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily),\n\t\t\t_bodyFontStyle: getValueOrDefault(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle),\n\t\t\t_bodyAlign: tooltipOpts.bodyAlign,\n\t\t\tbodyFontSize: getValueOrDefault(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize),\n\t\t\tbodySpacing: tooltipOpts.bodySpacing,\n\n\t\t\t// Title\n\t\t\ttitleFontColor: tooltipOpts.titleFontColor,\n\t\t\t_titleFontFamily: getValueOrDefault(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily),\n\t\t\t_titleFontStyle: getValueOrDefault(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle),\n\t\t\ttitleFontSize: getValueOrDefault(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize),\n\t\t\t_titleAlign: tooltipOpts.titleAlign,\n\t\t\ttitleSpacing: tooltipOpts.titleSpacing,\n\t\t\ttitleMarginBottom: tooltipOpts.titleMarginBottom,\n\n\t\t\t// Footer\n\t\t\tfooterFontColor: tooltipOpts.footerFontColor,\n\t\t\t_footerFontFamily: getValueOrDefault(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily),\n\t\t\t_footerFontStyle: getValueOrDefault(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle),\n\t\t\tfooterFontSize: getValueOrDefault(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize),\n\t\t\t_footerAlign: tooltipOpts.footerAlign,\n\t\t\tfooterSpacing: tooltipOpts.footerSpacing,\n\t\t\tfooterMarginTop: tooltipOpts.footerMarginTop,\n\n\t\t\t// Appearance\n\t\t\tcaretSize: tooltipOpts.caretSize,\n\t\t\tcornerRadius: tooltipOpts.cornerRadius,\n\t\t\tbackgroundColor: tooltipOpts.backgroundColor,\n\t\t\topacity: 0,\n\t\t\tlegendColorBackground: tooltipOpts.multiKeyBackground,\n\t\t\tdisplayColors: tooltipOpts.displayColors,\n\t\t\tborderColor: tooltipOpts.borderColor,\n\t\t\tborderWidth: tooltipOpts.borderWidth\n\t\t};\n\t}\n\n\t/**\n\t * Get the size of the tooltip\n\t */\n\tfunction getTooltipSize(tooltip, model) {\n\t\tvar ctx = tooltip._chart.ctx;\n\n\t\tvar height = model.yPadding * 2; // Tooltip Padding\n\t\tvar width = 0;\n\n\t\t// Count of all lines in the body\n\t\tvar body = model.body;\n\t\tvar combinedBodyLength = body.reduce(function(count, bodyItem) {\n\t\t\treturn count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length;\n\t\t}, 0);\n\t\tcombinedBodyLength += model.beforeBody.length + model.afterBody.length;\n\n\t\tvar titleLineCount = model.title.length;\n\t\tvar footerLineCount = model.footer.length;\n\t\tvar titleFontSize = model.titleFontSize,\n\t\t\tbodyFontSize = model.bodyFontSize,\n\t\t\tfooterFontSize = model.footerFontSize;\n\n\t\theight += titleLineCount * titleFontSize; // Title Lines\n\t\theight += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing\n\t\theight += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin\n\t\theight += combinedBodyLength * bodyFontSize; // Body Lines\n\t\theight += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing\n\t\theight += footerLineCount ? model.footerMarginTop : 0; // Footer Margin\n\t\theight += footerLineCount * (footerFontSize); // Footer Lines\n\t\theight += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing\n\n\t\t// Title width\n\t\tvar widthPadding = 0;\n\t\tvar maxLineWidth = function(line) {\n\t\t\twidth = Math.max(width, ctx.measureText(line).width + widthPadding);\n\t\t};\n\n\t\tctx.font = helpers.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily);\n\t\thelpers.each(model.title, maxLineWidth);\n\n\t\t// Body width\n\t\tctx.font = helpers.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily);\n\t\thelpers.each(model.beforeBody.concat(model.afterBody), maxLineWidth);\n\n\t\t// Body lines may include some extra width due to the color box\n\t\twidthPadding = model.displayColors ? (bodyFontSize + 2) : 0;\n\t\thelpers.each(body, function(bodyItem) {\n\t\t\thelpers.each(bodyItem.before, maxLineWidth);\n\t\t\thelpers.each(bodyItem.lines, maxLineWidth);\n\t\t\thelpers.each(bodyItem.after, maxLineWidth);\n\t\t});\n\n\t\t// Reset back to 0\n\t\twidthPadding = 0;\n\n\t\t// Footer width\n\t\tctx.font = helpers.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily);\n\t\thelpers.each(model.footer, maxLineWidth);\n\n\t\t// Add padding\n\t\twidth += 2 * model.xPadding;\n\n\t\treturn {\n\t\t\twidth: width,\n\t\t\theight: height\n\t\t};\n\t}\n\n\t/**\n\t * Helper to get the alignment of a tooltip given the size\n\t */\n\tfunction determineAlignment(tooltip, size) {\n\t\tvar model = tooltip._model;\n\t\tvar chart = tooltip._chart;\n\t\tvar chartArea = tooltip._chart.chartArea;\n\t\tvar xAlign = 'center';\n\t\tvar yAlign = 'center';\n\n\t\tif (model.y < size.height) {\n\t\t\tyAlign = 'top';\n\t\t} else if (model.y > (chart.height - size.height)) {\n\t\t\tyAlign = 'bottom';\n\t\t}\n\n\t\tvar lf, rf; // functions to determine left, right alignment\n\t\tvar olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart\n\t\tvar yf; // function to get the y alignment if the tooltip goes outside of the left or right edges\n\t\tvar midX = (chartArea.left + chartArea.right) / 2;\n\t\tvar midY = (chartArea.top + chartArea.bottom) / 2;\n\n\t\tif (yAlign === 'center') {\n\t\t\tlf = function(x) {\n\t\t\t\treturn x <= midX;\n\t\t\t};\n\t\t\trf = function(x) {\n\t\t\t\treturn x > midX;\n\t\t\t};\n\t\t} else {\n\t\t\tlf = function(x) {\n\t\t\t\treturn x <= (size.width / 2);\n\t\t\t};\n\t\t\trf = function(x) {\n\t\t\t\treturn x >= (chart.width - (size.width / 2));\n\t\t\t};\n\t\t}\n\n\t\tolf = function(x) {\n\t\t\treturn x + size.width > chart.width;\n\t\t};\n\t\torf = function(x) {\n\t\t\treturn x - size.width < 0;\n\t\t};\n\t\tyf = function(y) {\n\t\t\treturn y <= midY ? 'top' : 'bottom';\n\t\t};\n\n\t\tif (lf(model.x)) {\n\t\t\txAlign = 'left';\n\n\t\t\t// Is tooltip too wide and goes over the right side of the chart.?\n\t\t\tif (olf(model.x)) {\n\t\t\t\txAlign = 'center';\n\t\t\t\tyAlign = yf(model.y);\n\t\t\t}\n\t\t} else if (rf(model.x)) {\n\t\t\txAlign = 'right';\n\n\t\t\t// Is tooltip too wide and goes outside left edge of canvas?\n\t\t\tif (orf(model.x)) {\n\t\t\t\txAlign = 'center';\n\t\t\t\tyAlign = yf(model.y);\n\t\t\t}\n\t\t}\n\n\t\tvar opts = tooltip._options;\n\t\treturn {\n\t\t\txAlign: opts.xAlign ? opts.xAlign : xAlign,\n\t\t\tyAlign: opts.yAlign ? opts.yAlign : yAlign\n\t\t};\n\t}\n\n\t/**\n\t * @Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\n\t */\n\tfunction getBackgroundPoint(vm, size, alignment) {\n\t\t// Background Position\n\t\tvar x = vm.x;\n\t\tvar y = vm.y;\n\n\t\tvar caretSize = vm.caretSize,\n\t\t\tcaretPadding = vm.caretPadding,\n\t\t\tcornerRadius = vm.cornerRadius,\n\t\t\txAlign = alignment.xAlign,\n\t\t\tyAlign = alignment.yAlign,\n\t\t\tpaddingAndSize = caretSize + caretPadding,\n\t\t\tradiusAndPadding = cornerRadius + caretPadding;\n\n\t\tif (xAlign === 'right') {\n\t\t\tx -= size.width;\n\t\t} else if (xAlign === 'center') {\n\t\t\tx -= (size.width / 2);\n\t\t}\n\n\t\tif (yAlign === 'top') {\n\t\t\ty += paddingAndSize;\n\t\t} else if (yAlign === 'bottom') {\n\t\t\ty -= size.height + paddingAndSize;\n\t\t} else {\n\t\t\ty -= (size.height / 2);\n\t\t}\n\n\t\tif (yAlign === 'center') {\n\t\t\tif (xAlign === 'left') {\n\t\t\t\tx += paddingAndSize;\n\t\t\t} else if (xAlign === 'right') {\n\t\t\t\tx -= paddingAndSize;\n\t\t\t}\n\t\t} else if (xAlign === 'left') {\n\t\t\tx -= radiusAndPadding;\n\t\t} else if (xAlign === 'right') {\n\t\t\tx += radiusAndPadding;\n\t\t}\n\n\t\treturn {\n\t\t\tx: x,\n\t\t\ty: y\n\t\t};\n\t}\n\n\tChart.Tooltip = Chart.Element.extend({\n\t\tinitialize: function() {\n\t\t\tthis._model = getBaseModel(this._options);\n\t\t},\n\n\t\t// Get the title\n\t\t// Args are: (tooltipItem, data)\n\t\tgetTitle: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me._options;\n\t\t\tvar callbacks = opts.callbacks;\n\n\t\t\tvar beforeTitle = callbacks.beforeTitle.apply(me, arguments),\n\t\t\t\ttitle = callbacks.title.apply(me, arguments),\n\t\t\t\tafterTitle = callbacks.afterTitle.apply(me, arguments);\n\n\t\t\tvar lines = [];\n\t\t\tlines = pushOrConcat(lines, beforeTitle);\n\t\t\tlines = pushOrConcat(lines, title);\n\t\t\tlines = pushOrConcat(lines, afterTitle);\n\n\t\t\treturn lines;\n\t\t},\n\n\t\t// Args are: (tooltipItem, data)\n\t\tgetBeforeBody: function() {\n\t\t\tvar lines = this._options.callbacks.beforeBody.apply(this, arguments);\n\t\t\treturn helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : [];\n\t\t},\n\n\t\t// Args are: (tooltipItem, data)\n\t\tgetBody: function(tooltipItems, data) {\n\t\t\tvar me = this;\n\t\t\tvar callbacks = me._options.callbacks;\n\t\t\tvar bodyItems = [];\n\n\t\t\thelpers.each(tooltipItems, function(tooltipItem) {\n\t\t\t\tvar bodyItem = {\n\t\t\t\t\tbefore: [],\n\t\t\t\t\tlines: [],\n\t\t\t\t\tafter: []\n\t\t\t\t};\n\t\t\t\tpushOrConcat(bodyItem.before, callbacks.beforeLabel.call(me, tooltipItem, data));\n\t\t\t\tpushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data));\n\t\t\t\tpushOrConcat(bodyItem.after, callbacks.afterLabel.call(me, tooltipItem, data));\n\n\t\t\t\tbodyItems.push(bodyItem);\n\t\t\t});\n\n\t\t\treturn bodyItems;\n\t\t},\n\n\t\t// Args are: (tooltipItem, data)\n\t\tgetAfterBody: function() {\n\t\t\tvar lines = this._options.callbacks.afterBody.apply(this, arguments);\n\t\t\treturn helpers.isArray(lines) ? lines : lines !== undefined ? [lines] : [];\n\t\t},\n\n\t\t// Get the footer and beforeFooter and afterFooter lines\n\t\t// Args are: (tooltipItem, data)\n\t\tgetFooter: function() {\n\t\t\tvar me = this;\n\t\t\tvar callbacks = me._options.callbacks;\n\n\t\t\tvar beforeFooter = callbacks.beforeFooter.apply(me, arguments);\n\t\t\tvar footer = callbacks.footer.apply(me, arguments);\n\t\t\tvar afterFooter = callbacks.afterFooter.apply(me, arguments);\n\n\t\t\tvar lines = [];\n\t\t\tlines = pushOrConcat(lines, beforeFooter);\n\t\t\tlines = pushOrConcat(lines, footer);\n\t\t\tlines = pushOrConcat(lines, afterFooter);\n\n\t\t\treturn lines;\n\t\t},\n\n\t\tupdate: function(changed) {\n\t\t\tvar me = this;\n\t\t\tvar opts = me._options;\n\n\t\t\t// Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition\n\t\t\t// that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time\n\t\t\t// which breaks any animations.\n\t\t\tvar existingModel = me._model;\n\t\t\tvar model = me._model = getBaseModel(opts);\n\t\t\tvar active = me._active;\n\n\t\t\tvar data = me._data;\n\n\t\t\t// In the case where active.length === 0 we need to keep these at existing values for good animations\n\t\t\tvar alignment = {\n\t\t\t\txAlign: existingModel.xAlign,\n\t\t\t\tyAlign: existingModel.yAlign\n\t\t\t};\n\t\t\tvar backgroundPoint = {\n\t\t\t\tx: existingModel.x,\n\t\t\t\ty: existingModel.y\n\t\t\t};\n\t\t\tvar tooltipSize = {\n\t\t\t\twidth: existingModel.width,\n\t\t\t\theight: existingModel.height\n\t\t\t};\n\t\t\tvar tooltipPosition = {\n\t\t\t\tx: existingModel.caretX,\n\t\t\t\ty: existingModel.caretY\n\t\t\t};\n\n\t\t\tvar i, len;\n\n\t\t\tif (active.length) {\n\t\t\t\tmodel.opacity = 1;\n\n\t\t\t\tvar labelColors = [];\n\t\t\t\ttooltipPosition = Chart.Tooltip.positioners[opts.position](active, me._eventPosition);\n\n\t\t\t\tvar tooltipItems = [];\n\t\t\t\tfor (i = 0, len = active.length; i < len; ++i) {\n\t\t\t\t\ttooltipItems.push(createTooltipItem(active[i]));\n\t\t\t\t}\n\n\t\t\t\t// If the user provided a filter function, use it to modify the tooltip items\n\t\t\t\tif (opts.filter) {\n\t\t\t\t\ttooltipItems = tooltipItems.filter(function(a) {\n\t\t\t\t\t\treturn opts.filter(a, data);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// If the user provided a sorting function, use it to modify the tooltip items\n\t\t\t\tif (opts.itemSort) {\n\t\t\t\t\ttooltipItems = tooltipItems.sort(function(a, b) {\n\t\t\t\t\t\treturn opts.itemSort(a, b, data);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Determine colors for boxes\n\t\t\t\thelpers.each(tooltipItems, function(tooltipItem) {\n\t\t\t\t\tlabelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart));\n\t\t\t\t});\n\n\t\t\t\t// Build the Text Lines\n\t\t\t\tmodel.title = me.getTitle(tooltipItems, data);\n\t\t\t\tmodel.beforeBody = me.getBeforeBody(tooltipItems, data);\n\t\t\t\tmodel.body = me.getBody(tooltipItems, data);\n\t\t\t\tmodel.afterBody = me.getAfterBody(tooltipItems, data);\n\t\t\t\tmodel.footer = me.getFooter(tooltipItems, data);\n\n\t\t\t\t// Initial positioning and colors\n\t\t\t\tmodel.x = Math.round(tooltipPosition.x);\n\t\t\t\tmodel.y = Math.round(tooltipPosition.y);\n\t\t\t\tmodel.caretPadding = opts.caretPadding;\n\t\t\t\tmodel.labelColors = labelColors;\n\n\t\t\t\t// data points\n\t\t\t\tmodel.dataPoints = tooltipItems;\n\n\t\t\t\t// We need to determine alignment of the tooltip\n\t\t\t\ttooltipSize = getTooltipSize(this, model);\n\t\t\t\talignment = determineAlignment(this, tooltipSize);\n\t\t\t\t// Final Size and Position\n\t\t\t\tbackgroundPoint = getBackgroundPoint(model, tooltipSize, alignment);\n\t\t\t} else {\n\t\t\t\tmodel.opacity = 0;\n\t\t\t}\n\n\t\t\tmodel.xAlign = alignment.xAlign;\n\t\t\tmodel.yAlign = alignment.yAlign;\n\t\t\tmodel.x = backgroundPoint.x;\n\t\t\tmodel.y = backgroundPoint.y;\n\t\t\tmodel.width = tooltipSize.width;\n\t\t\tmodel.height = tooltipSize.height;\n\n\t\t\t// Point where the caret on the tooltip points to\n\t\t\tmodel.caretX = tooltipPosition.x;\n\t\t\tmodel.caretY = tooltipPosition.y;\n\n\t\t\tme._model = model;\n\n\t\t\tif (changed && opts.custom) {\n\t\t\t\topts.custom.call(me, model);\n\t\t\t}\n\n\t\t\treturn me;\n\t\t},\n\t\tdrawCaret: function(tooltipPoint, size) {\n\t\t\tvar ctx = this._chart.ctx;\n\t\t\tvar vm = this._view;\n\t\t\tvar caretPosition = this.getCaretPosition(tooltipPoint, size, vm);\n\n\t\t\tctx.lineTo(caretPosition.x1, caretPosition.y1);\n\t\t\tctx.lineTo(caretPosition.x2, caretPosition.y2);\n\t\t\tctx.lineTo(caretPosition.x3, caretPosition.y3);\n\t\t},\n\t\tgetCaretPosition: function(tooltipPoint, size, vm) {\n\t\t\tvar x1, x2, x3;\n\t\t\tvar y1, y2, y3;\n\t\t\tvar caretSize = vm.caretSize;\n\t\t\tvar cornerRadius = vm.cornerRadius;\n\t\t\tvar xAlign = vm.xAlign,\n\t\t\t\tyAlign = vm.yAlign;\n\t\t\tvar ptX = tooltipPoint.x,\n\t\t\t\tptY = tooltipPoint.y;\n\t\t\tvar width = size.width,\n\t\t\t\theight = size.height;\n\n\t\t\tif (yAlign === 'center') {\n\t\t\t\ty2 = ptY + (height / 2);\n\n\t\t\t\tif (xAlign === 'left') {\n\t\t\t\t\tx1 = ptX;\n\t\t\t\t\tx2 = x1 - caretSize;\n\t\t\t\t\tx3 = x1;\n\n\t\t\t\t\ty1 = y2 + caretSize;\n\t\t\t\t\ty3 = y2 - caretSize;\n\t\t\t\t} else {\n\t\t\t\t\tx1 = ptX + width;\n\t\t\t\t\tx2 = x1 + caretSize;\n\t\t\t\t\tx3 = x1;\n\n\t\t\t\t\ty1 = y2 - caretSize;\n\t\t\t\t\ty3 = y2 + caretSize;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (xAlign === 'left') {\n\t\t\t\t\tx2 = ptX + cornerRadius + (caretSize);\n\t\t\t\t\tx1 = x2 - caretSize;\n\t\t\t\t\tx3 = x2 + caretSize;\n\t\t\t\t} else if (xAlign === 'right') {\n\t\t\t\t\tx2 = ptX + width - cornerRadius - caretSize;\n\t\t\t\t\tx1 = x2 - caretSize;\n\t\t\t\t\tx3 = x2 + caretSize;\n\t\t\t\t} else {\n\t\t\t\t\tx2 = ptX + (width / 2);\n\t\t\t\t\tx1 = x2 - caretSize;\n\t\t\t\t\tx3 = x2 + caretSize;\n\t\t\t\t}\n\t\t\t\tif (yAlign === 'top') {\n\t\t\t\t\ty1 = ptY;\n\t\t\t\t\ty2 = y1 - caretSize;\n\t\t\t\t\ty3 = y1;\n\t\t\t\t} else {\n\t\t\t\t\ty1 = ptY + height;\n\t\t\t\t\ty2 = y1 + caretSize;\n\t\t\t\t\ty3 = y1;\n\t\t\t\t\t// invert drawing order\n\t\t\t\t\tvar tmp = x3;\n\t\t\t\t\tx3 = x1;\n\t\t\t\t\tx1 = tmp;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3};\n\t\t},\n\t\tdrawTitle: function(pt, vm, ctx, opacity) {\n\t\t\tvar title = vm.title;\n\n\t\t\tif (title.length) {\n\t\t\t\tctx.textAlign = vm._titleAlign;\n\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\tvar titleFontSize = vm.titleFontSize,\n\t\t\t\t\ttitleSpacing = vm.titleSpacing;\n\n\t\t\t\tctx.fillStyle = mergeOpacity(vm.titleFontColor, opacity);\n\t\t\t\tctx.font = helpers.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily);\n\n\t\t\t\tvar i, len;\n\t\t\t\tfor (i = 0, len = title.length; i < len; ++i) {\n\t\t\t\t\tctx.fillText(title[i], pt.x, pt.y);\n\t\t\t\t\tpt.y += titleFontSize + titleSpacing; // Line Height and spacing\n\n\t\t\t\t\tif (i + 1 === title.length) {\n\t\t\t\t\t\tpt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tdrawBody: function(pt, vm, ctx, opacity) {\n\t\t\tvar bodyFontSize = vm.bodyFontSize;\n\t\t\tvar bodySpacing = vm.bodySpacing;\n\t\t\tvar body = vm.body;\n\n\t\t\tctx.textAlign = vm._bodyAlign;\n\t\t\tctx.textBaseline = 'top';\n\n\t\t\tvar textColor = mergeOpacity(vm.bodyFontColor, opacity);\n\t\t\tctx.fillStyle = textColor;\n\t\t\tctx.font = helpers.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);\n\n\t\t\t// Before Body\n\t\t\tvar xLinePadding = 0;\n\t\t\tvar fillLineOfText = function(line) {\n\t\t\t\tctx.fillText(line, pt.x + xLinePadding, pt.y);\n\t\t\t\tpt.y += bodyFontSize + bodySpacing;\n\t\t\t};\n\n\t\t\t// Before body lines\n\t\t\thelpers.each(vm.beforeBody, fillLineOfText);\n\n\t\t\tvar drawColorBoxes = vm.displayColors;\n\t\t\txLinePadding = drawColorBoxes ? (bodyFontSize + 2) : 0;\n\n\t\t\t// Draw body lines now\n\t\t\thelpers.each(body, function(bodyItem, i) {\n\t\t\t\thelpers.each(bodyItem.before, fillLineOfText);\n\n\t\t\t\thelpers.each(bodyItem.lines, function(line) {\n\t\t\t\t\t// Draw Legend-like boxes if needed\n\t\t\t\t\tif (drawColorBoxes) {\n\t\t\t\t\t\t// Fill a white rect so that colours merge nicely if the opacity is < 1\n\t\t\t\t\t\tctx.fillStyle = mergeOpacity(vm.legendColorBackground, opacity);\n\t\t\t\t\t\tctx.fillRect(pt.x, pt.y, bodyFontSize, bodyFontSize);\n\n\t\t\t\t\t\t// Border\n\t\t\t\t\t\tctx.strokeStyle = mergeOpacity(vm.labelColors[i].borderColor, opacity);\n\t\t\t\t\t\tctx.strokeRect(pt.x, pt.y, bodyFontSize, bodyFontSize);\n\n\t\t\t\t\t\t// Inner square\n\t\t\t\t\t\tctx.fillStyle = mergeOpacity(vm.labelColors[i].backgroundColor, opacity);\n\t\t\t\t\t\tctx.fillRect(pt.x + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2);\n\n\t\t\t\t\t\tctx.fillStyle = textColor;\n\t\t\t\t\t}\n\n\t\t\t\t\tfillLineOfText(line);\n\t\t\t\t});\n\n\t\t\t\thelpers.each(bodyItem.after, fillLineOfText);\n\t\t\t});\n\n\t\t\t// Reset back to 0 for after body\n\t\t\txLinePadding = 0;\n\n\t\t\t// After body lines\n\t\t\thelpers.each(vm.afterBody, fillLineOfText);\n\t\t\tpt.y -= bodySpacing; // Remove last body spacing\n\t\t},\n\t\tdrawFooter: function(pt, vm, ctx, opacity) {\n\t\t\tvar footer = vm.footer;\n\n\t\t\tif (footer.length) {\n\t\t\t\tpt.y += vm.footerMarginTop;\n\n\t\t\t\tctx.textAlign = vm._footerAlign;\n\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\tctx.fillStyle = mergeOpacity(vm.footerFontColor, opacity);\n\t\t\t\tctx.font = helpers.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily);\n\n\t\t\t\thelpers.each(footer, function(line) {\n\t\t\t\t\tctx.fillText(line, pt.x, pt.y);\n\t\t\t\t\tpt.y += vm.footerFontSize + vm.footerSpacing;\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tdrawBackground: function(pt, vm, ctx, tooltipSize, opacity) {\n\t\t\tctx.fillStyle = mergeOpacity(vm.backgroundColor, opacity);\n\t\t\tctx.strokeStyle = mergeOpacity(vm.borderColor, opacity);\n\t\t\tctx.lineWidth = vm.borderWidth;\n\t\t\tvar xAlign = vm.xAlign;\n\t\t\tvar yAlign = vm.yAlign;\n\t\t\tvar x = pt.x;\n\t\t\tvar y = pt.y;\n\t\t\tvar width = tooltipSize.width;\n\t\t\tvar height = tooltipSize.height;\n\t\t\tvar radius = vm.cornerRadius;\n\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x + radius, y);\n\t\t\tif (yAlign === 'top') {\n\t\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t\t}\n\t\t\tctx.lineTo(x + width - radius, y);\n\t\t\tctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n\t\t\tif (yAlign === 'center' && xAlign === 'right') {\n\t\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t\t}\n\t\t\tctx.lineTo(x + width, y + height - radius);\n\t\t\tctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n\t\t\tif (yAlign === 'bottom') {\n\t\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t\t}\n\t\t\tctx.lineTo(x + radius, y + height);\n\t\t\tctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n\t\t\tif (yAlign === 'center' && xAlign === 'left') {\n\t\t\t\tthis.drawCaret(pt, tooltipSize);\n\t\t\t}\n\t\t\tctx.lineTo(x, y + radius);\n\t\t\tctx.quadraticCurveTo(x, y, x + radius, y);\n\t\t\tctx.closePath();\n\n\t\t\tctx.fill();\n\n\t\t\tif (vm.borderWidth > 0) {\n\t\t\t\tctx.stroke();\n\t\t\t}\n\t\t},\n\t\tdraw: function() {\n\t\t\tvar ctx = this._chart.ctx;\n\t\t\tvar vm = this._view;\n\n\t\t\tif (vm.opacity === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar tooltipSize = {\n\t\t\t\twidth: vm.width,\n\t\t\t\theight: vm.height\n\t\t\t};\n\t\t\tvar pt = {\n\t\t\t\tx: vm.x,\n\t\t\t\ty: vm.y\n\t\t\t};\n\n\t\t\t// IE11/Edge does not like very small opacities, so snap to 0\n\t\t\tvar opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity;\n\n\t\t\t// Truthy/falsey value for empty tooltip\n\t\t\tvar hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length;\n\n\t\t\tif (this._options.enabled && hasTooltipContent) {\n\t\t\t\t// Draw Background\n\t\t\t\tthis.drawBackground(pt, vm, ctx, tooltipSize, opacity);\n\n\t\t\t\t// Draw Title, Body, and Footer\n\t\t\t\tpt.x += vm.xPadding;\n\t\t\t\tpt.y += vm.yPadding;\n\n\t\t\t\t// Titles\n\t\t\t\tthis.drawTitle(pt, vm, ctx, opacity);\n\n\t\t\t\t// Body\n\t\t\t\tthis.drawBody(pt, vm, ctx, opacity);\n\n\t\t\t\t// Footer\n\t\t\t\tthis.drawFooter(pt, vm, ctx, opacity);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Handle an event\n\t\t * @private\n\t\t * @param {IEvent} event - The event to handle\n\t\t * @returns {Boolean} true if the tooltip changed\n\t\t */\n\t\thandleEvent: function(e) {\n\t\t\tvar me = this;\n\t\t\tvar options = me._options;\n\t\t\tvar changed = false;\n\n\t\t\tme._lastActive = me._lastActive || [];\n\n\t\t\t// Find Active Elements for tooltips\n\t\t\tif (e.type === 'mouseout') {\n\t\t\t\tme._active = [];\n\t\t\t} else {\n\t\t\t\tme._active = me._chart.getElementsAtEventForMode(e, options.mode, options);\n\t\t\t}\n\n\t\t\t// Remember Last Actives\n\t\t\tchanged = !helpers.arrayEquals(me._active, me._lastActive);\n\n\t\t\t// If tooltip didn't change, do not handle the target event\n\t\t\tif (!changed) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tme._lastActive = me._active;\n\n\t\t\tif (options.enabled || options.custom) {\n\t\t\t\tme._eventPosition = {\n\t\t\t\t\tx: e.x,\n\t\t\t\t\ty: e.y\n\t\t\t\t};\n\n\t\t\t\tvar model = me._model;\n\t\t\t\tme.update(true);\n\t\t\t\tme.pivot();\n\n\t\t\t\t// See if our tooltip position changed\n\t\t\t\tchanged |= (model.x !== me._model.x) || (model.y !== me._model.y);\n\t\t\t}\n\n\t\t\treturn changed;\n\t\t}\n\t});\n\n\t/**\n\t * @namespace Chart.Tooltip.positioners\n\t */\n\tChart.Tooltip.positioners = {\n\t\t/**\n\t\t * Average mode places the tooltip at the average position of the elements shown\n\t\t * @function Chart.Tooltip.positioners.average\n\t\t * @param elements {ChartElement[]} the elements being displayed in the tooltip\n\t\t * @returns {Point} tooltip position\n\t\t */\n\t\taverage: function(elements) {\n\t\t\tif (!elements.length) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvar i, len;\n\t\t\tvar x = 0;\n\t\t\tvar y = 0;\n\t\t\tvar count = 0;\n\n\t\t\tfor (i = 0, len = elements.length; i < len; ++i) {\n\t\t\t\tvar el = elements[i];\n\t\t\t\tif (el && el.hasValue()) {\n\t\t\t\t\tvar pos = el.tooltipPosition();\n\t\t\t\t\tx += pos.x;\n\t\t\t\t\ty += pos.y;\n\t\t\t\t\t++count;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tx: Math.round(x / count),\n\t\t\t\ty: Math.round(y / count)\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Gets the tooltip position nearest of the item nearest to the event position\n\t\t * @function Chart.Tooltip.positioners.nearest\n\t\t * @param elements {Chart.Element[]} the tooltip elements\n\t\t * @param eventPosition {Point} the position of the event in canvas coordinates\n\t\t * @returns {Point} the tooltip position\n\t\t */\n\t\tnearest: function(elements, eventPosition) {\n\t\t\tvar x = eventPosition.x;\n\t\t\tvar y = eventPosition.y;\n\n\t\t\tvar nearestElement;\n\t\t\tvar minDistance = Number.POSITIVE_INFINITY;\n\t\t\tvar i, len;\n\t\t\tfor (i = 0, len = elements.length; i < len; ++i) {\n\t\t\t\tvar el = elements[i];\n\t\t\t\tif (el && el.hasValue()) {\n\t\t\t\t\tvar center = el.getCenterPoint();\n\t\t\t\t\tvar d = helpers.distanceBetweenPoints(eventPosition, center);\n\n\t\t\t\t\tif (d < minDistance) {\n\t\t\t\t\t\tminDistance = d;\n\t\t\t\t\t\tnearestElement = el;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (nearestElement) {\n\t\t\t\tvar tp = nearestElement.tooltipPosition();\n\t\t\t\tx = tp.x;\n\t\t\t\ty = tp.y;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tx: x,\n\t\t\t\ty: y\n\t\t\t};\n\t\t}\n\t};\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers,\n\t\tglobalOpts = Chart.defaults.global;\n\n\tglobalOpts.elements.arc = {\n\t\tbackgroundColor: globalOpts.defaultColor,\n\t\tborderColor: '#fff',\n\t\tborderWidth: 2\n\t};\n\n\tChart.elements.Arc = Chart.Element.extend({\n\t\tinLabelRange: function(mouseX) {\n\t\t\tvar vm = this._view;\n\n\t\t\tif (vm) {\n\t\t\t\treturn (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2));\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tinRange: function(chartX, chartY) {\n\t\t\tvar vm = this._view;\n\n\t\t\tif (vm) {\n\t\t\t\tvar pointRelativePosition = helpers.getAngleFromPoint(vm, {\n\t\t\t\t\t\tx: chartX,\n\t\t\t\t\t\ty: chartY\n\t\t\t\t\t}),\n\t\t\t\t\tangle = pointRelativePosition.angle,\n\t\t\t\t\tdistance = pointRelativePosition.distance;\n\n\t\t\t\t// Sanitise angle range\n\t\t\t\tvar startAngle = vm.startAngle;\n\t\t\t\tvar endAngle = vm.endAngle;\n\t\t\t\twhile (endAngle < startAngle) {\n\t\t\t\t\tendAngle += 2.0 * Math.PI;\n\t\t\t\t}\n\t\t\t\twhile (angle > endAngle) {\n\t\t\t\t\tangle -= 2.0 * Math.PI;\n\t\t\t\t}\n\t\t\t\twhile (angle < startAngle) {\n\t\t\t\t\tangle += 2.0 * Math.PI;\n\t\t\t\t}\n\n\t\t\t\t// Check if within the range of the open/close angle\n\t\t\t\tvar betweenAngles = (angle >= startAngle && angle <= endAngle),\n\t\t\t\t\twithinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius);\n\n\t\t\t\treturn (betweenAngles && withinRadius);\n\t\t\t}\n\t\t\treturn false;\n\t\t},\n\t\tgetCenterPoint: function() {\n\t\t\tvar vm = this._view;\n\t\t\tvar halfAngle = (vm.startAngle + vm.endAngle) / 2;\n\t\t\tvar halfRadius = (vm.innerRadius + vm.outerRadius) / 2;\n\t\t\treturn {\n\t\t\t\tx: vm.x + Math.cos(halfAngle) * halfRadius,\n\t\t\t\ty: vm.y + Math.sin(halfAngle) * halfRadius\n\t\t\t};\n\t\t},\n\t\tgetArea: function() {\n\t\t\tvar vm = this._view;\n\t\t\treturn Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2));\n\t\t},\n\t\ttooltipPosition: function() {\n\t\t\tvar vm = this._view;\n\n\t\t\tvar centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2),\n\t\t\t\trangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius;\n\t\t\treturn {\n\t\t\t\tx: vm.x + (Math.cos(centreAngle) * rangeFromCentre),\n\t\t\t\ty: vm.y + (Math.sin(centreAngle) * rangeFromCentre)\n\t\t\t};\n\t\t},\n\t\tdraw: function() {\n\n\t\t\tvar ctx = this._chart.ctx,\n\t\t\t\tvm = this._view,\n\t\t\t\tsA = vm.startAngle,\n\t\t\t\teA = vm.endAngle;\n\n\t\t\tctx.beginPath();\n\n\t\t\tctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA);\n\t\t\tctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true);\n\n\t\t\tctx.closePath();\n\t\t\tctx.strokeStyle = vm.borderColor;\n\t\t\tctx.lineWidth = vm.borderWidth;\n\n\t\t\tctx.fillStyle = vm.backgroundColor;\n\n\t\t\tctx.fill();\n\t\t\tctx.lineJoin = 'bevel';\n\n\t\t\tif (vm.borderWidth) {\n\t\t\t\tctx.stroke();\n\t\t\t}\n\t\t}\n\t});\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\tvar globalDefaults = Chart.defaults.global;\n\n\tChart.defaults.global.elements.line = {\n\t\ttension: 0.4,\n\t\tbackgroundColor: globalDefaults.defaultColor,\n\t\tborderWidth: 3,\n\t\tborderColor: globalDefaults.defaultColor,\n\t\tborderCapStyle: 'butt',\n\t\tborderDash: [],\n\t\tborderDashOffset: 0.0,\n\t\tborderJoinStyle: 'miter',\n\t\tcapBezierPoints: true,\n\t\tfill: true, // do we fill in the area between the line and its base axis\n\t};\n\n\tChart.elements.Line = Chart.Element.extend({\n\t\tdraw: function() {\n\t\t\tvar me = this;\n\t\t\tvar vm = me._view;\n\t\t\tvar ctx = me._chart.ctx;\n\t\t\tvar spanGaps = vm.spanGaps;\n\t\t\tvar points = me._children.slice(); // clone array\n\t\t\tvar globalOptionLineElements = globalDefaults.elements.line;\n\t\t\tvar lastDrawnIndex = -1;\n\t\t\tvar index, current, previous, currentVM;\n\n\t\t\t// If we are looping, adding the first point again\n\t\t\tif (me._loop && points.length) {\n\t\t\t\tpoints.push(points[0]);\n\t\t\t}\n\n\t\t\tctx.save();\n\n\t\t\t// Stroke Line Options\n\t\t\tctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle;\n\n\t\t\t// IE 9 and 10 do not support line dash\n\t\t\tif (ctx.setLineDash) {\n\t\t\t\tctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash);\n\t\t\t}\n\n\t\t\tctx.lineDashOffset = vm.borderDashOffset || globalOptionLineElements.borderDashOffset;\n\t\t\tctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle;\n\t\t\tctx.lineWidth = vm.borderWidth || globalOptionLineElements.borderWidth;\n\t\t\tctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor;\n\n\t\t\t// Stroke Line\n\t\t\tctx.beginPath();\n\t\t\tlastDrawnIndex = -1;\n\n\t\t\tfor (index = 0; index < points.length; ++index) {\n\t\t\t\tcurrent = points[index];\n\t\t\t\tprevious = helpers.previousItem(points, index);\n\t\t\t\tcurrentVM = current._view;\n\n\t\t\t\t// First point moves to it's starting position no matter what\n\t\t\t\tif (index === 0) {\n\t\t\t\t\tif (!currentVM.skip) {\n\t\t\t\t\t\tctx.moveTo(currentVM.x, currentVM.y);\n\t\t\t\t\t\tlastDrawnIndex = index;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tprevious = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex];\n\n\t\t\t\t\tif (!currentVM.skip) {\n\t\t\t\t\t\tif ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) {\n\t\t\t\t\t\t\t// There was a gap and this is the first point after the gap\n\t\t\t\t\t\t\tctx.moveTo(currentVM.x, currentVM.y);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Line to next point\n\t\t\t\t\t\t\thelpers.canvas.lineTo(ctx, previous._view, current._view);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlastDrawnIndex = index;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tctx.stroke();\n\t\t\tctx.restore();\n\t\t}\n\t});\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers,\n\t\tglobalOpts = Chart.defaults.global,\n\t\tdefaultColor = globalOpts.defaultColor;\n\n\tglobalOpts.elements.point = {\n\t\tradius: 3,\n\t\tpointStyle: 'circle',\n\t\tbackgroundColor: defaultColor,\n\t\tborderWidth: 1,\n\t\tborderColor: defaultColor,\n\t\t// Hover\n\t\thitRadius: 1,\n\t\thoverRadius: 4,\n\t\thoverBorderWidth: 1\n\t};\n\n\tfunction xRange(mouseX) {\n\t\tvar vm = this._view;\n\t\treturn vm ? (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hitRadius, 2)) : false;\n\t}\n\n\tfunction yRange(mouseY) {\n\t\tvar vm = this._view;\n\t\treturn vm ? (Math.pow(mouseY - vm.y, 2) < Math.pow(vm.radius + vm.hitRadius, 2)) : false;\n\t}\n\n\tChart.elements.Point = Chart.Element.extend({\n\t\tinRange: function(mouseX, mouseY) {\n\t\t\tvar vm = this._view;\n\t\t\treturn vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false;\n\t\t},\n\n\t\tinLabelRange: xRange,\n\t\tinXRange: xRange,\n\t\tinYRange: yRange,\n\n\t\tgetCenterPoint: function() {\n\t\t\tvar vm = this._view;\n\t\t\treturn {\n\t\t\t\tx: vm.x,\n\t\t\t\ty: vm.y\n\t\t\t};\n\t\t},\n\t\tgetArea: function() {\n\t\t\treturn Math.PI * Math.pow(this._view.radius, 2);\n\t\t},\n\t\ttooltipPosition: function() {\n\t\t\tvar vm = this._view;\n\t\t\treturn {\n\t\t\t\tx: vm.x,\n\t\t\t\ty: vm.y,\n\t\t\t\tpadding: vm.radius + vm.borderWidth\n\t\t\t};\n\t\t},\n\t\tdraw: function(chartArea) {\n\t\t\tvar vm = this._view;\n\t\t\tvar model = this._model;\n\t\t\tvar ctx = this._chart.ctx;\n\t\t\tvar pointStyle = vm.pointStyle;\n\t\t\tvar radius = vm.radius;\n\t\t\tvar x = vm.x;\n\t\t\tvar y = vm.y;\n\t\t\tvar color = Chart.helpers.color;\n\t\t\tvar errMargin = 1.01; // 1.01 is margin for Accumulated error. (Especially Edge, IE.)\n\t\t\tvar ratio = 0;\n\n\t\t\tif (vm.skip) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tctx.strokeStyle = vm.borderColor || defaultColor;\n\t\t\tctx.lineWidth = helpers.getValueOrDefault(vm.borderWidth, globalOpts.elements.point.borderWidth);\n\t\t\tctx.fillStyle = vm.backgroundColor || defaultColor;\n\n\t\t\t// Cliping for Points.\n\t\t\t// going out from inner charArea?\n\t\t\tif ((chartArea !== undefined) && ((model.x < chartArea.left) || (chartArea.right*errMargin < model.x) || (model.y < chartArea.top) || (chartArea.bottom*errMargin < model.y))) {\n\t\t\t\t// Point fade out\n\t\t\t\tif (model.x < chartArea.left) {\n\t\t\t\t\tratio = (x - model.x) / (chartArea.left - model.x);\n\t\t\t\t} else if (chartArea.right*errMargin < model.x) {\n\t\t\t\t\tratio = (model.x - x) / (model.x - chartArea.right);\n\t\t\t\t} else if (model.y < chartArea.top) {\n\t\t\t\t\tratio = (y - model.y) / (chartArea.top - model.y);\n\t\t\t\t} else if (chartArea.bottom*errMargin < model.y) {\n\t\t\t\t\tratio = (model.y - y) / (model.y - chartArea.bottom);\n\t\t\t\t}\n\t\t\t\tratio = Math.round(ratio*100) / 100;\n\t\t\t\tctx.strokeStyle = color(ctx.strokeStyle).alpha(ratio).rgbString();\n\t\t\t\tctx.fillStyle = color(ctx.fillStyle).alpha(ratio).rgbString();\n\t\t\t}\n\n\t\t\tChart.canvasHelpers.drawPoint(ctx, pointStyle, radius, x, y);\n\t\t}\n\t});\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar globalOpts = Chart.defaults.global;\n\n\tglobalOpts.elements.rectangle = {\n\t\tbackgroundColor: globalOpts.defaultColor,\n\t\tborderWidth: 0,\n\t\tborderColor: globalOpts.defaultColor,\n\t\tborderSkipped: 'bottom'\n\t};\n\n\tfunction isVertical(bar) {\n\t\treturn bar._view.width !== undefined;\n\t}\n\n\t/**\n\t * Helper function to get the bounds of the bar regardless of the orientation\n\t * @private\n\t * @param bar {Chart.Element.Rectangle} the bar\n\t * @return {Bounds} bounds of the bar\n\t */\n\tfunction getBarBounds(bar) {\n\t\tvar vm = bar._view;\n\t\tvar x1, x2, y1, y2;\n\n\t\tif (isVertical(bar)) {\n\t\t\t// vertical\n\t\t\tvar halfWidth = vm.width / 2;\n\t\t\tx1 = vm.x - halfWidth;\n\t\t\tx2 = vm.x + halfWidth;\n\t\t\ty1 = Math.min(vm.y, vm.base);\n\t\t\ty2 = Math.max(vm.y, vm.base);\n\t\t} else {\n\t\t\t// horizontal bar\n\t\t\tvar halfHeight = vm.height / 2;\n\t\t\tx1 = Math.min(vm.x, vm.base);\n\t\t\tx2 = Math.max(vm.x, vm.base);\n\t\t\ty1 = vm.y - halfHeight;\n\t\t\ty2 = vm.y + halfHeight;\n\t\t}\n\n\t\treturn {\n\t\t\tleft: x1,\n\t\t\ttop: y1,\n\t\t\tright: x2,\n\t\t\tbottom: y2\n\t\t};\n\t}\n\n\tChart.elements.Rectangle = Chart.Element.extend({\n\t\tdraw: function() {\n\t\t\tvar ctx = this._chart.ctx;\n\t\t\tvar vm = this._view;\n\t\t\tvar left, right, top, bottom, signX, signY, borderSkipped;\n\t\t\tvar borderWidth = vm.borderWidth;\n\n\t\t\tif (!vm.horizontal) {\n\t\t\t\t// bar\n\t\t\t\tleft = vm.x - vm.width / 2;\n\t\t\t\tright = vm.x + vm.width / 2;\n\t\t\t\ttop = vm.y;\n\t\t\t\tbottom = vm.base;\n\t\t\t\tsignX = 1;\n\t\t\t\tsignY = bottom > top? 1: -1;\n\t\t\t\tborderSkipped = vm.borderSkipped || 'bottom';\n\t\t\t} else {\n\t\t\t\t// horizontal bar\n\t\t\t\tleft = vm.base;\n\t\t\t\tright = vm.x;\n\t\t\t\ttop = vm.y - vm.height / 2;\n\t\t\t\tbottom = vm.y + vm.height / 2;\n\t\t\t\tsignX = right > left? 1: -1;\n\t\t\t\tsignY = 1;\n\t\t\t\tborderSkipped = vm.borderSkipped || 'left';\n\t\t\t}\n\n\t\t\t// Canvas doesn't allow us to stroke inside the width so we can\n\t\t\t// adjust the sizes to fit if we're setting a stroke on the line\n\t\t\tif (borderWidth) {\n\t\t\t\t// borderWidth shold be less than bar width and bar height.\n\t\t\t\tvar barSize = Math.min(Math.abs(left - right), Math.abs(top - bottom));\n\t\t\t\tborderWidth = borderWidth > barSize? barSize: borderWidth;\n\t\t\t\tvar halfStroke = borderWidth / 2;\n\t\t\t\t// Adjust borderWidth when bar top position is near vm.base(zero).\n\t\t\t\tvar borderLeft = left + (borderSkipped !== 'left'? halfStroke * signX: 0);\n\t\t\t\tvar borderRight = right + (borderSkipped !== 'right'? -halfStroke * signX: 0);\n\t\t\t\tvar borderTop = top + (borderSkipped !== 'top'? halfStroke * signY: 0);\n\t\t\t\tvar borderBottom = bottom + (borderSkipped !== 'bottom'? -halfStroke * signY: 0);\n\t\t\t\t// not become a vertical line?\n\t\t\t\tif (borderLeft !== borderRight) {\n\t\t\t\t\ttop = borderTop;\n\t\t\t\t\tbottom = borderBottom;\n\t\t\t\t}\n\t\t\t\t// not become a horizontal line?\n\t\t\t\tif (borderTop !== borderBottom) {\n\t\t\t\t\tleft = borderLeft;\n\t\t\t\t\tright = borderRight;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tctx.beginPath();\n\t\t\tctx.fillStyle = vm.backgroundColor;\n\t\t\tctx.strokeStyle = vm.borderColor;\n\t\t\tctx.lineWidth = borderWidth;\n\n\t\t\t// Corner points, from bottom-left to bottom-right clockwise\n\t\t\t// | 1 2 |\n\t\t\t// | 0 3 |\n\t\t\tvar corners = [\n\t\t\t\t[left, bottom],\n\t\t\t\t[left, top],\n\t\t\t\t[right, top],\n\t\t\t\t[right, bottom]\n\t\t\t];\n\n\t\t\t// Find first (starting) corner with fallback to 'bottom'\n\t\t\tvar borders = ['bottom', 'left', 'top', 'right'];\n\t\t\tvar startCorner = borders.indexOf(borderSkipped, 0);\n\t\t\tif (startCorner === -1) {\n\t\t\t\tstartCorner = 0;\n\t\t\t}\n\n\t\t\tfunction cornerAt(index) {\n\t\t\t\treturn corners[(startCorner + index) % 4];\n\t\t\t}\n\n\t\t\t// Draw rectangle from 'startCorner'\n\t\t\tvar corner = cornerAt(0);\n\t\t\tctx.moveTo(corner[0], corner[1]);\n\n\t\t\tfor (var i = 1; i < 4; i++) {\n\t\t\t\tcorner = cornerAt(i);\n\t\t\t\tctx.lineTo(corner[0], corner[1]);\n\t\t\t}\n\n\t\t\tctx.fill();\n\t\t\tif (borderWidth) {\n\t\t\t\tctx.stroke();\n\t\t\t}\n\t\t},\n\t\theight: function() {\n\t\t\tvar vm = this._view;\n\t\t\treturn vm.base - vm.y;\n\t\t},\n\t\tinRange: function(mouseX, mouseY) {\n\t\t\tvar inRange = false;\n\n\t\t\tif (this._view) {\n\t\t\t\tvar bounds = getBarBounds(this);\n\t\t\t\tinRange = mouseX >= bounds.left && mouseX <= bounds.right && mouseY >= bounds.top && mouseY <= bounds.bottom;\n\t\t\t}\n\n\t\t\treturn inRange;\n\t\t},\n\t\tinLabelRange: function(mouseX, mouseY) {\n\t\t\tvar me = this;\n\t\t\tif (!me._view) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvar inRange = false;\n\t\t\tvar bounds = getBarBounds(me);\n\n\t\t\tif (isVertical(me)) {\n\t\t\t\tinRange = mouseX >= bounds.left && mouseX <= bounds.right;\n\t\t\t} else {\n\t\t\t\tinRange = mouseY >= bounds.top && mouseY <= bounds.bottom;\n\t\t\t}\n\n\t\t\treturn inRange;\n\t\t},\n\t\tinXRange: function(mouseX) {\n\t\t\tvar bounds = getBarBounds(this);\n\t\t\treturn mouseX >= bounds.left && mouseX <= bounds.right;\n\t\t},\n\t\tinYRange: function(mouseY) {\n\t\t\tvar bounds = getBarBounds(this);\n\t\t\treturn mouseY >= bounds.top && mouseY <= bounds.bottom;\n\t\t},\n\t\tgetCenterPoint: function() {\n\t\t\tvar vm = this._view;\n\t\t\tvar x, y;\n\t\t\tif (isVertical(this)) {\n\t\t\t\tx = vm.x;\n\t\t\t\ty = (vm.y + vm.base) / 2;\n\t\t\t} else {\n\t\t\t\tx = (vm.x + vm.base) / 2;\n\t\t\t\ty = vm.y;\n\t\t\t}\n\n\t\t\treturn {x: x, y: y};\n\t\t},\n\t\tgetArea: function() {\n\t\t\tvar vm = this._view;\n\t\t\treturn vm.width * Math.abs(vm.y - vm.base);\n\t\t},\n\t\ttooltipPosition: function() {\n\t\t\tvar vm = this._view;\n\t\t\treturn {\n\t\t\t\tx: vm.x,\n\t\t\t\ty: vm.y\n\t\t\t};\n\t\t}\n\t});\n\n};\n",
    "'use strict';\n\n// Chart.Platform implementation for targeting a web browser\nmodule.exports = function(Chart) {\n\tvar helpers = Chart.helpers;\n\n\t// DOM event types -> Chart.js event types.\n\t// Note: only events with different types are mapped.\n\t// https://developer.mozilla.org/en-US/docs/Web/Events\n\tvar eventTypeMap = {\n\t\t// Touch events\n\t\ttouchstart: 'mousedown',\n\t\ttouchmove: 'mousemove',\n\t\ttouchend: 'mouseup',\n\n\t\t// Pointer events\n\t\tpointerenter: 'mouseenter',\n\t\tpointerdown: 'mousedown',\n\t\tpointermove: 'mousemove',\n\t\tpointerup: 'mouseup',\n\t\tpointerleave: 'mouseout',\n\t\tpointerout: 'mouseout'\n\t};\n\n\t/**\n\t * The \"used\" size is the final value of a dimension property after all calculations have\n\t * been performed. This method uses the computed style of `element` but returns undefined\n\t * if the computed style is not expressed in pixels. That can happen in some cases where\n\t * `element` has a size relative to its parent and this last one is not yet displayed,\n\t * for example because of `display: none` on a parent node.\n\t * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n\t * @returns {Number} Size in pixels or undefined if unknown.\n\t */\n\tfunction readUsedSize(element, property) {\n\t\tvar value = helpers.getStyle(element, property);\n\t\tvar matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n\t\treturn matches? Number(matches[1]) : undefined;\n\t}\n\n\t/**\n\t * Initializes the canvas style and render size without modifying the canvas display size,\n\t * since responsiveness is handled by the controller.resize() method. The config is used\n\t * to determine the aspect ratio to apply in case no explicit height has been specified.\n\t */\n\tfunction initCanvas(canvas, config) {\n\t\tvar style = canvas.style;\n\n\t\t// NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n\t\t// returns null or '' if no explicit value has been set to the canvas attribute.\n\t\tvar renderHeight = canvas.getAttribute('height');\n\t\tvar renderWidth = canvas.getAttribute('width');\n\n\t\t// Chart.js modifies some canvas values that we want to restore on destroy\n\t\tcanvas._chartjs = {\n\t\t\tinitial: {\n\t\t\t\theight: renderHeight,\n\t\t\t\twidth: renderWidth,\n\t\t\t\tstyle: {\n\t\t\t\t\tdisplay: style.display,\n\t\t\t\t\theight: style.height,\n\t\t\t\t\twidth: style.width\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Force canvas to display as block to avoid extra space caused by inline\n\t\t// elements, which would interfere with the responsive resize process.\n\t\t// https://github.com/chartjs/Chart.js/issues/2538\n\t\tstyle.display = style.display || 'block';\n\n\t\tif (renderWidth === null || renderWidth === '') {\n\t\t\tvar displayWidth = readUsedSize(canvas, 'width');\n\t\t\tif (displayWidth !== undefined) {\n\t\t\t\tcanvas.width = displayWidth;\n\t\t\t}\n\t\t}\n\n\t\tif (renderHeight === null || renderHeight === '') {\n\t\t\tif (canvas.style.height === '') {\n\t\t\t\t// If no explicit render height and style height, let's apply the aspect ratio,\n\t\t\t\t// which one can be specified by the user but also by charts as default option\n\t\t\t\t// (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\n\t\t\t\tcanvas.height = canvas.width / (config.options.aspectRatio || 2);\n\t\t\t} else {\n\t\t\t\tvar displayHeight = readUsedSize(canvas, 'height');\n\t\t\t\tif (displayWidth !== undefined) {\n\t\t\t\t\tcanvas.height = displayHeight;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn canvas;\n\t}\n\n\tfunction createEvent(type, chart, x, y, nativeEvent) {\n\t\treturn {\n\t\t\ttype: type,\n\t\t\tchart: chart,\n\t\t\tnative: nativeEvent || null,\n\t\t\tx: x !== undefined? x : null,\n\t\t\ty: y !== undefined? y : null,\n\t\t};\n\t}\n\n\tfunction fromNativeEvent(event, chart) {\n\t\tvar type = eventTypeMap[event.type] || event.type;\n\t\tvar pos = helpers.getRelativePosition(event, chart);\n\t\treturn createEvent(type, chart, pos.x, pos.y, event);\n\t}\n\n\tfunction createResizer(handler) {\n\t\tvar iframe = document.createElement('iframe');\n\t\tiframe.className = 'chartjs-hidden-iframe';\n\t\tiframe.style.cssText =\n\t\t\t'display:block;'+\n\t\t\t'overflow:hidden;'+\n\t\t\t'border:0;'+\n\t\t\t'margin:0;'+\n\t\t\t'top:0;'+\n\t\t\t'left:0;'+\n\t\t\t'bottom:0;'+\n\t\t\t'right:0;'+\n\t\t\t'height:100%;'+\n\t\t\t'width:100%;'+\n\t\t\t'position:absolute;'+\n\t\t\t'pointer-events:none;'+\n\t\t\t'z-index:-1;';\n\n\t\t// Prevent the iframe to gain focus on tab.\n\t\t// https://github.com/chartjs/Chart.js/issues/3090\n\t\tiframe.tabIndex = -1;\n\n\t\t// If the iframe is re-attached to the DOM, the resize listener is removed because the\n\t\t// content is reloaded, so make sure to install the handler after the iframe is loaded.\n\t\t// https://github.com/chartjs/Chart.js/issues/3521\n\t\thelpers.addEvent(iframe, 'load', function() {\n\t\t\thelpers.addEvent(iframe.contentWindow || iframe, 'resize', handler);\n\n\t\t\t// The iframe size might have changed while loading, which can also\n\t\t\t// happen if the size has been changed while detached from the DOM.\n\t\t\thandler();\n\t\t});\n\n\t\treturn iframe;\n\t}\n\n\tfunction addResizeListener(node, listener, chart) {\n\t\tvar stub = node._chartjs = {\n\t\t\tticking: false\n\t\t};\n\n\t\t// Throttle the callback notification until the next animation frame.\n\t\tvar notify = function() {\n\t\t\tif (!stub.ticking) {\n\t\t\t\tstub.ticking = true;\n\t\t\t\thelpers.requestAnimFrame.call(window, function() {\n\t\t\t\t\tif (stub.resizer) {\n\t\t\t\t\t\tstub.ticking = false;\n\t\t\t\t\t\treturn listener(createEvent('resize', chart));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\t// Let's keep track of this added iframe and thus avoid DOM query when removing it.\n\t\tstub.resizer = createResizer(notify);\n\n\t\tnode.insertBefore(stub.resizer, node.firstChild);\n\t}\n\n\tfunction removeResizeListener(node) {\n\t\tif (!node || !node._chartjs) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar resizer = node._chartjs.resizer;\n\t\tif (resizer) {\n\t\t\tresizer.parentNode.removeChild(resizer);\n\t\t\tnode._chartjs.resizer = null;\n\t\t}\n\n\t\tdelete node._chartjs;\n\t}\n\n\treturn {\n\t\tacquireContext: function(item, config) {\n\t\t\tif (typeof item === 'string') {\n\t\t\t\titem = document.getElementById(item);\n\t\t\t} else if (item.length) {\n\t\t\t\t// Support for array based queries (such as jQuery)\n\t\t\t\titem = item[0];\n\t\t\t}\n\n\t\t\tif (item && item.canvas) {\n\t\t\t\t// Support for any object associated to a canvas (including a context2d)\n\t\t\t\titem = item.canvas;\n\t\t\t}\n\n\t\t\t// To prevent canvas fingerprinting, some add-ons undefine the getContext\n\t\t\t// method, for example: https://github.com/kkapsner/CanvasBlocker\n\t\t\t// https://github.com/chartjs/Chart.js/issues/2807\n\t\t\tvar context = item && item.getContext && item.getContext('2d');\n\n\t\t\t// `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is\n\t\t\t// inside an iframe or when running in a protected environment. We could guess the\n\t\t\t// types from their toString() value but let's keep things flexible and assume it's\n\t\t\t// a sufficient condition if the item has a context2D which has item as `canvas`.\n\t\t\t// https://github.com/chartjs/Chart.js/issues/3887\n\t\t\t// https://github.com/chartjs/Chart.js/issues/4102\n\t\t\t// https://github.com/chartjs/Chart.js/issues/4152\n\t\t\tif (context && context.canvas === item) {\n\t\t\t\tinitCanvas(item, config);\n\t\t\t\treturn context;\n\t\t\t}\n\n\t\t\treturn null;\n\t\t},\n\n\t\treleaseContext: function(context) {\n\t\t\tvar canvas = context.canvas;\n\t\t\tif (!canvas._chartjs) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar initial = canvas._chartjs.initial;\n\t\t\t['height', 'width'].forEach(function(prop) {\n\t\t\t\tvar value = initial[prop];\n\t\t\t\tif (value === undefined || value === null) {\n\t\t\t\t\tcanvas.removeAttribute(prop);\n\t\t\t\t} else {\n\t\t\t\t\tcanvas.setAttribute(prop, value);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\thelpers.each(initial.style || {}, function(value, key) {\n\t\t\t\tcanvas.style[key] = value;\n\t\t\t});\n\n\t\t\t// The canvas render size might have been changed (and thus the state stack discarded),\n\t\t\t// we can't use save() and restore() to restore the initial state. So make sure that at\n\t\t\t// least the canvas context is reset to the default state by setting the canvas width.\n\t\t\t// https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n\t\t\tcanvas.width = canvas.width;\n\n\t\t\tdelete canvas._chartjs;\n\t\t},\n\n\t\taddEventListener: function(chart, type, listener) {\n\t\t\tvar canvas = chart.canvas;\n\t\t\tif (type === 'resize') {\n\t\t\t\t// Note: the resize event is not supported on all browsers.\n\t\t\t\taddResizeListener(canvas.parentNode, listener, chart);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar stub = listener._chartjs || (listener._chartjs = {});\n\t\t\tvar proxies = stub.proxies || (stub.proxies = {});\n\t\t\tvar proxy = proxies[chart.id + '_' + type] = function(event) {\n\t\t\t\tlistener(fromNativeEvent(event, chart));\n\t\t\t};\n\n\t\t\thelpers.addEvent(canvas, type, proxy);\n\t\t},\n\n\t\tremoveEventListener: function(chart, type, listener) {\n\t\t\tvar canvas = chart.canvas;\n\t\t\tif (type === 'resize') {\n\t\t\t\t// Note: the resize event is not supported on all browsers.\n\t\t\t\tremoveResizeListener(canvas.parentNode, listener);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar stub = listener._chartjs || {};\n\t\t\tvar proxies = stub.proxies || {};\n\t\t\tvar proxy = proxies[chart.id + '_' + type];\n\t\t\tif (!proxy) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\thelpers.removeEvent(canvas, type, proxy);\n\t\t}\n\t};\n};\n",
    "'use strict';\n\n// By default, select the browser (DOM) platform.\n// @TODO Make possible to select another platform at build time.\nvar implementation = require('./platform.dom.js');\n\nmodule.exports = function(Chart) {\n\t/**\n\t * @namespace Chart.platform\n\t * @see https://chartjs.gitbooks.io/proposals/content/Platform.html\n\t * @since 2.4.0\n\t */\n\tChart.platform = {\n\t\t/**\n\t\t * Called at chart construction time, returns a context2d instance implementing\n\t\t * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n\t\t * @param {*} item - The native item from which to acquire context (platform specific)\n\t\t * @param {Object} options - The chart options\n\t\t * @returns {CanvasRenderingContext2D} context2d instance\n\t\t */\n\t\tacquireContext: function() {},\n\n\t\t/**\n\t\t * Called at chart destruction time, releases any resources associated to the context\n\t\t * previously returned by the acquireContext() method.\n\t\t * @param {CanvasRenderingContext2D} context - The context2d instance\n\t\t * @returns {Boolean} true if the method succeeded, else false\n\t\t */\n\t\treleaseContext: function() {},\n\n\t\t/**\n\t\t * Registers the specified listener on the given chart.\n\t\t * @param {Chart} chart - Chart from which to listen for event\n\t\t * @param {String} type - The ({@link IEvent}) type to listen for\n\t\t * @param {Function} listener - Receives a notification (an object that implements\n\t\t * the {@link IEvent} interface) when an event of the specified type occurs.\n\t\t */\n\t\taddEventListener: function() {},\n\n\t\t/**\n\t\t * Removes the specified listener previously registered with addEventListener.\n\t\t * @param {Chart} chart -Chart from which to remove the listener\n\t\t * @param {String} type - The ({@link IEvent}) type to remove\n\t\t * @param {Function} listener - The listener function to remove from the event target.\n\t\t */\n\t\tremoveEventListener: function() {}\n\t};\n\n\t/**\n\t * @interface IPlatform\n\t * Allows abstracting platform dependencies away from the chart\n\t * @borrows Chart.platform.acquireContext as acquireContext\n\t * @borrows Chart.platform.releaseContext as releaseContext\n\t * @borrows Chart.platform.addEventListener as addEventListener\n\t * @borrows Chart.platform.removeEventListener as removeEventListener\n\t */\n\n\t/**\n\t * @interface IEvent\n\t * @prop {String} type - The event type name, possible values are:\n\t * 'contextmenu', 'mouseenter', 'mousedown', 'mousemove', 'mouseup', 'mouseout',\n\t * 'click', 'dblclick', 'keydown', 'keypress', 'keyup' and 'resize'\n\t * @prop {*} native - The original native event (null for emulated events, e.g. 'resize')\n\t * @prop {Number} x - The mouse x position, relative to the canvas (null for incompatible events)\n\t * @prop {Number} y - The mouse y position, relative to the canvas (null for incompatible events)\n\t */\n\n\tChart.helpers.extend(Chart.platform, implementation(Chart));\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\t/**\n\t * Plugin based on discussion from the following Chart.js issues:\n\t * @see https://github.com/chartjs/Chart.js/issues/2380#issuecomment-279961569\n\t * @see https://github.com/chartjs/Chart.js/issues/2440#issuecomment-256461897\n\t */\n\tChart.defaults.global.plugins.filler = {\n\t\tpropagate: true\n\t};\n\n\tvar defaults = Chart.defaults;\n\tvar helpers = Chart.helpers;\n\tvar mappers = {\n\t\tdataset: function(source) {\n\t\t\tvar index = source.fill;\n\t\t\tvar chart = source.chart;\n\t\t\tvar meta = chart.getDatasetMeta(index);\n\t\t\tvar visible = meta && chart.isDatasetVisible(index);\n\t\t\tvar points = (visible && meta.dataset._children) || [];\n\n\t\t\treturn !points.length? null : function(point, i) {\n\t\t\t\treturn points[i]._view || null;\n\t\t\t};\n\t\t},\n\n\t\tboundary: function(source) {\n\t\t\tvar boundary = source.boundary;\n\t\t\tvar x = boundary? boundary.x : null;\n\t\t\tvar y = boundary? boundary.y : null;\n\n\t\t\treturn function(point) {\n\t\t\t\treturn {\n\t\t\t\t\tx: x === null? point.x : x,\n\t\t\t\t\ty: y === null? point.y : y,\n\t\t\t\t};\n\t\t\t};\n\t\t}\n\t};\n\n\t// @todo if (fill[0] === '#')\n\tfunction decodeFill(el, index, count) {\n\t\tvar model = el._model || {};\n\t\tvar fill = model.fill;\n\t\tvar target;\n\n\t\tif (fill === undefined) {\n\t\t\tfill = !!model.backgroundColor;\n\t\t}\n\n\t\tif (fill === false || fill === null) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (fill === true) {\n\t\t\treturn 'origin';\n\t\t}\n\n\t\ttarget = parseFloat(fill, 10);\n\t\tif (isFinite(target) && Math.floor(target) === target) {\n\t\t\tif (fill[0] === '-' || fill[0] === '+') {\n\t\t\t\ttarget = index + target;\n\t\t\t}\n\n\t\t\tif (target === index || target < 0 || target >= count) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn target;\n\t\t}\n\n\t\tswitch (fill) {\n\t\t// compatibility\n\t\tcase 'bottom':\n\t\t\treturn 'start';\n\t\tcase 'top':\n\t\t\treturn 'end';\n\t\tcase 'zero':\n\t\t\treturn 'origin';\n\t\t// supported boundaries\n\t\tcase 'origin':\n\t\tcase 'start':\n\t\tcase 'end':\n\t\t\treturn fill;\n\t\t// invalid fill values\n\t\tdefault:\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tfunction computeBoundary(source) {\n\t\tvar model = source.el._model || {};\n\t\tvar scale = source.el._scale || {};\n\t\tvar fill = source.fill;\n\t\tvar target = null;\n\t\tvar horizontal;\n\n\t\tif (isFinite(fill)) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Backward compatibility: until v3, we still need to support boundary values set on\n\t\t// the model (scaleTop, scaleBottom and scaleZero) because some external plugins and\n\t\t// controllers might still use it (e.g. the Smith chart).\n\n\t\tif (fill === 'start') {\n\t\t\ttarget = model.scaleBottom === undefined? scale.bottom : model.scaleBottom;\n\t\t} else if (fill === 'end') {\n\t\t\ttarget = model.scaleTop === undefined? scale.top : model.scaleTop;\n\t\t} else if (model.scaleZero !== undefined) {\n\t\t\ttarget = model.scaleZero;\n\t\t} else if (scale.getBasePosition) {\n\t\t\ttarget = scale.getBasePosition();\n\t\t} else if (scale.getBasePixel) {\n\t\t\ttarget = scale.getBasePixel();\n\t\t}\n\n\t\tif (target !== undefined && target !== null) {\n\t\t\tif (target.x !== undefined && target.y !== undefined) {\n\t\t\t\treturn target;\n\t\t\t}\n\n\t\t\tif (typeof target === 'number' && isFinite(target)) {\n\t\t\t\thorizontal = scale.isHorizontal();\n\t\t\t\treturn {\n\t\t\t\t\tx: horizontal? target : null,\n\t\t\t\t\ty: horizontal? null : target\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tfunction resolveTarget(sources, index, propagate) {\n\t\tvar source = sources[index];\n\t\tvar fill = source.fill;\n\t\tvar visited = [index];\n\t\tvar target;\n\n\t\tif (!propagate) {\n\t\t\treturn fill;\n\t\t}\n\n\t\twhile (fill !== false && visited.indexOf(fill) === -1) {\n\t\t\tif (!isFinite(fill)) {\n\t\t\t\treturn fill;\n\t\t\t}\n\n\t\t\ttarget = sources[fill];\n\t\t\tif (!target) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (target.visible) {\n\t\t\t\treturn fill;\n\t\t\t}\n\n\t\t\tvisited.push(fill);\n\t\t\tfill = target.fill;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tfunction createMapper(source) {\n\t\tvar fill = source.fill;\n\t\tvar type = 'dataset';\n\n\t\tif (fill === false) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (!isFinite(fill)) {\n\t\t\ttype = 'boundary';\n\t\t}\n\n\t\treturn mappers[type](source);\n\t}\n\n\tfunction isDrawable(point) {\n\t\treturn point && !point.skip;\n\t}\n\n\tfunction drawArea(ctx, curve0, curve1, len0, len1) {\n\t\tvar i;\n\n\t\tif (!len0 || !len1) {\n\t\t\treturn;\n\t\t}\n\n\t\t// building first area curve (normal)\n\t\tctx.moveTo(curve0[0].x, curve0[0].y);\n\t\tfor (i=1; i<len0; ++i) {\n\t\t\thelpers.canvas.lineTo(ctx, curve0[i-1], curve0[i]);\n\t\t}\n\n\t\t// joining the two area curves\n\t\tctx.lineTo(curve1[len1-1].x, curve1[len1-1].y);\n\n\t\t// building opposite area curve (reverse)\n\t\tfor (i=len1-1; i>0; --i) {\n\t\t\thelpers.canvas.lineTo(ctx, curve1[i], curve1[i-1], true);\n\t\t}\n\t}\n\n\tfunction doFill(ctx, points, mapper, view, color, loop) {\n\t\tvar count = points.length;\n\t\tvar span = view.spanGaps;\n\t\tvar curve0 = [];\n\t\tvar curve1 = [];\n\t\tvar len0 = 0;\n\t\tvar len1 = 0;\n\t\tvar i, ilen, index, p0, p1, d0, d1;\n\n\t\tctx.beginPath();\n\n\t\tfor (i = 0, ilen = (count + !!loop); i < ilen; ++i) {\n\t\t\tindex = i%count;\n\t\t\tp0 = points[index]._view;\n\t\t\tp1 = mapper(p0, index, view);\n\t\t\td0 = isDrawable(p0);\n\t\t\td1 = isDrawable(p1);\n\n\t\t\tif (d0 && d1) {\n\t\t\t\tlen0 = curve0.push(p0);\n\t\t\t\tlen1 = curve1.push(p1);\n\t\t\t} else if (len0 && len1) {\n\t\t\t\tif (!span) {\n\t\t\t\t\tdrawArea(ctx, curve0, curve1, len0, len1);\n\t\t\t\t\tlen0 = len1 = 0;\n\t\t\t\t\tcurve0 = [];\n\t\t\t\t\tcurve1 = [];\n\t\t\t\t} else {\n\t\t\t\t\tif (d0) {\n\t\t\t\t\t\tcurve0.push(p0);\n\t\t\t\t\t}\n\t\t\t\t\tif (d1) {\n\t\t\t\t\t\tcurve1.push(p1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tdrawArea(ctx, curve0, curve1, len0, len1);\n\n\t\tctx.closePath();\n\t\tctx.fillStyle = color;\n\t\tctx.fill();\n\t}\n\n\treturn {\n\t\tid: 'filler',\n\n\t\tafterDatasetsUpdate: function(chart, options) {\n\t\t\tvar count = (chart.data.datasets || []).length;\n\t\t\tvar propagate = options.propagate;\n\t\t\tvar sources = [];\n\t\t\tvar meta, i, el, source;\n\n\t\t\tfor (i = 0; i < count; ++i) {\n\t\t\t\tmeta = chart.getDatasetMeta(i);\n\t\t\t\tel = meta.dataset;\n\t\t\t\tsource = null;\n\n\t\t\t\tif (el && el._model && el instanceof Chart.elements.Line) {\n\t\t\t\t\tsource = {\n\t\t\t\t\t\tvisible: chart.isDatasetVisible(i),\n\t\t\t\t\t\tfill: decodeFill(el, i, count),\n\t\t\t\t\t\tchart: chart,\n\t\t\t\t\t\tel: el\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tmeta.$filler = source;\n\t\t\t\tsources.push(source);\n\t\t\t}\n\n\t\t\tfor (i=0; i<count; ++i) {\n\t\t\t\tsource = sources[i];\n\t\t\t\tif (!source) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tsource.fill = resolveTarget(sources, i, propagate);\n\t\t\t\tsource.boundary = computeBoundary(source);\n\t\t\t\tsource.mapper = createMapper(source);\n\t\t\t}\n\t\t},\n\n\t\tbeforeDatasetDraw: function(chart, args) {\n\t\t\tvar meta = args.meta.$filler;\n\t\t\tif (!meta) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar el = meta.el;\n\t\t\tvar view = el._view;\n\t\t\tvar points = el._children || [];\n\t\t\tvar mapper = meta.mapper;\n\t\t\tvar color = view.backgroundColor || defaults.global.defaultColor;\n\n\t\t\tif (mapper && color && points.length) {\n\t\t\t\tdoFill(chart.ctx, points, mapper, view, color, el._loop);\n\t\t\t}\n\t\t}\n\t};\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\tvar layout = Chart.layoutService;\n\tvar noop = helpers.noop;\n\n\tChart.defaults.global.legend = {\n\t\tdisplay: true,\n\t\tposition: 'top',\n\t\tfullWidth: true,\n\t\treverse: false,\n\t\tweight: 1000,\n\n\t\t// a callback that will handle\n\t\tonClick: function(e, legendItem) {\n\t\t\tvar index = legendItem.datasetIndex;\n\t\t\tvar ci = this.chart;\n\t\t\tvar meta = ci.getDatasetMeta(index);\n\n\t\t\t// See controller.isDatasetVisible comment\n\t\t\tmeta.hidden = meta.hidden === null? !ci.data.datasets[index].hidden : null;\n\n\t\t\t// We hid a dataset ... rerender the chart\n\t\t\tci.update();\n\t\t},\n\n\t\tonHover: null,\n\n\t\tlabels: {\n\t\t\tboxWidth: 40,\n\t\t\tpadding: 10,\n\t\t\t// Generates labels shown in the legend\n\t\t\t// Valid properties to return:\n\t\t\t// text : text to display\n\t\t\t// fillStyle : fill of coloured box\n\t\t\t// strokeStyle: stroke of coloured box\n\t\t\t// hidden : if this legend item refers to a hidden item\n\t\t\t// lineCap : cap style for line\n\t\t\t// lineDash\n\t\t\t// lineDashOffset :\n\t\t\t// lineJoin :\n\t\t\t// lineWidth :\n\t\t\tgenerateLabels: function(chart) {\n\t\t\t\tvar data = chart.data;\n\t\t\t\treturn helpers.isArray(data.datasets) ? data.datasets.map(function(dataset, i) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttext: dataset.label,\n\t\t\t\t\t\tfillStyle: (!helpers.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]),\n\t\t\t\t\t\thidden: !chart.isDatasetVisible(i),\n\t\t\t\t\t\tlineCap: dataset.borderCapStyle,\n\t\t\t\t\t\tlineDash: dataset.borderDash,\n\t\t\t\t\t\tlineDashOffset: dataset.borderDashOffset,\n\t\t\t\t\t\tlineJoin: dataset.borderJoinStyle,\n\t\t\t\t\t\tlineWidth: dataset.borderWidth,\n\t\t\t\t\t\tstrokeStyle: dataset.borderColor,\n\t\t\t\t\t\tpointStyle: dataset.pointStyle,\n\n\t\t\t\t\t\t// Below is extra data used for toggling the datasets\n\t\t\t\t\t\tdatasetIndex: i\n\t\t\t\t\t};\n\t\t\t\t}, this) : [];\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Helper function to get the box width based on the usePointStyle option\n\t * @param labelopts {Object} the label options on the legend\n\t * @param fontSize {Number} the label font size\n\t * @return {Number} width of the color box area\n\t */\n\tfunction getBoxWidth(labelOpts, fontSize) {\n\t\treturn labelOpts.usePointStyle ?\n\t\t\tfontSize * Math.SQRT2 :\n\t\t\tlabelOpts.boxWidth;\n\t}\n\n\tChart.Legend = Chart.Element.extend({\n\n\t\tinitialize: function(config) {\n\t\t\thelpers.extend(this, config);\n\n\t\t\t// Contains hit boxes for each dataset (in dataset order)\n\t\t\tthis.legendHitBoxes = [];\n\n\t\t\t// Are we in doughnut mode which has a different data type\n\t\t\tthis.doughnutMode = false;\n\t\t},\n\n\t\t// These methods are ordered by lifecycle. Utilities then follow.\n\t\t// Any function defined here is inherited by all legend types.\n\t\t// Any function can be extended by the legend type\n\n\t\tbeforeUpdate: noop,\n\t\tupdate: function(maxWidth, maxHeight, margins) {\n\t\t\tvar me = this;\n\n\t\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\t\t\tme.beforeUpdate();\n\n\t\t\t// Absorb the master measurements\n\t\t\tme.maxWidth = maxWidth;\n\t\t\tme.maxHeight = maxHeight;\n\t\t\tme.margins = margins;\n\n\t\t\t// Dimensions\n\t\t\tme.beforeSetDimensions();\n\t\t\tme.setDimensions();\n\t\t\tme.afterSetDimensions();\n\t\t\t// Labels\n\t\t\tme.beforeBuildLabels();\n\t\t\tme.buildLabels();\n\t\t\tme.afterBuildLabels();\n\n\t\t\t// Fit\n\t\t\tme.beforeFit();\n\t\t\tme.fit();\n\t\t\tme.afterFit();\n\t\t\t//\n\t\t\tme.afterUpdate();\n\n\t\t\treturn me.minSize;\n\t\t},\n\t\tafterUpdate: noop,\n\n\t\t//\n\n\t\tbeforeSetDimensions: noop,\n\t\tsetDimensions: function() {\n\t\t\tvar me = this;\n\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.width = me.maxWidth;\n\t\t\t\tme.left = 0;\n\t\t\t\tme.right = me.width;\n\t\t\t} else {\n\t\t\t\tme.height = me.maxHeight;\n\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.top = 0;\n\t\t\t\tme.bottom = me.height;\n\t\t\t}\n\n\t\t\t// Reset padding\n\t\t\tme.paddingLeft = 0;\n\t\t\tme.paddingTop = 0;\n\t\t\tme.paddingRight = 0;\n\t\t\tme.paddingBottom = 0;\n\n\t\t\t// Reset minSize\n\t\t\tme.minSize = {\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0\n\t\t\t};\n\t\t},\n\t\tafterSetDimensions: noop,\n\n\t\t//\n\n\t\tbeforeBuildLabels: noop,\n\t\tbuildLabels: function() {\n\t\t\tvar me = this;\n\t\t\tvar labelOpts = me.options.labels;\n\t\t\tvar legendItems = labelOpts.generateLabels.call(me, me.chart);\n\n\t\t\tif (labelOpts.filter) {\n\t\t\t\tlegendItems = legendItems.filter(function(item) {\n\t\t\t\t\treturn labelOpts.filter(item, me.chart.data);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (me.options.reverse) {\n\t\t\t\tlegendItems.reverse();\n\t\t\t}\n\n\t\t\tme.legendItems = legendItems;\n\t\t},\n\t\tafterBuildLabels: noop,\n\n\t\t//\n\n\t\tbeforeFit: noop,\n\t\tfit: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar labelOpts = opts.labels;\n\t\t\tvar display = opts.display;\n\n\t\t\tvar ctx = me.ctx;\n\n\t\t\tvar globalDefault = Chart.defaults.global,\n\t\t\t\titemOrDefault = helpers.getValueOrDefault,\n\t\t\t\tfontSize = itemOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize),\n\t\t\t\tfontStyle = itemOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle),\n\t\t\t\tfontFamily = itemOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily),\n\t\t\t\tlabelFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n\n\t\t\t// Reset hit boxes\n\t\t\tvar hitboxes = me.legendHitBoxes = [];\n\n\t\t\tvar minSize = me.minSize;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\tif (isHorizontal) {\n\t\t\t\tminSize.width = me.maxWidth; // fill all the width\n\t\t\t\tminSize.height = display ? 10 : 0;\n\t\t\t} else {\n\t\t\t\tminSize.width = display ? 10 : 0;\n\t\t\t\tminSize.height = me.maxHeight; // fill all the height\n\t\t\t}\n\n\t\t\t// Increase sizes here\n\t\t\tif (display) {\n\t\t\t\tctx.font = labelFont;\n\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t// Labels\n\n\t\t\t\t\t// Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n\t\t\t\t\tvar lineWidths = me.lineWidths = [0];\n\t\t\t\t\tvar totalHeight = me.legendItems.length ? fontSize + (labelOpts.padding) : 0;\n\n\t\t\t\t\tctx.textAlign = 'left';\n\t\t\t\t\tctx.textBaseline = 'top';\n\n\t\t\t\t\thelpers.each(me.legendItems, function(legendItem, i) {\n\t\t\t\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize);\n\t\t\t\t\t\tvar width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n\t\t\t\t\t\tif (lineWidths[lineWidths.length - 1] + width + labelOpts.padding >= me.width) {\n\t\t\t\t\t\t\ttotalHeight += fontSize + (labelOpts.padding);\n\t\t\t\t\t\t\tlineWidths[lineWidths.length] = me.left;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Store the hitbox width and height here. Final position will be updated in `draw`\n\t\t\t\t\t\thitboxes[i] = {\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\twidth: width,\n\t\t\t\t\t\t\theight: fontSize\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tlineWidths[lineWidths.length - 1] += width + labelOpts.padding;\n\t\t\t\t\t});\n\n\t\t\t\t\tminSize.height += totalHeight;\n\n\t\t\t\t} else {\n\t\t\t\t\tvar vPadding = labelOpts.padding;\n\t\t\t\t\tvar columnWidths = me.columnWidths = [];\n\t\t\t\t\tvar totalWidth = labelOpts.padding;\n\t\t\t\t\tvar currentColWidth = 0;\n\t\t\t\t\tvar currentColHeight = 0;\n\t\t\t\t\tvar itemHeight = fontSize + vPadding;\n\n\t\t\t\t\thelpers.each(me.legendItems, function(legendItem, i) {\n\t\t\t\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize);\n\t\t\t\t\t\tvar itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\n\t\t\t\t\t\t// If too tall, go to new column\n\t\t\t\t\t\tif (currentColHeight + itemHeight > minSize.height) {\n\t\t\t\t\t\t\ttotalWidth += currentColWidth + labelOpts.padding;\n\t\t\t\t\t\t\tcolumnWidths.push(currentColWidth); // previous column width\n\n\t\t\t\t\t\t\tcurrentColWidth = 0;\n\t\t\t\t\t\t\tcurrentColHeight = 0;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Get max width\n\t\t\t\t\t\tcurrentColWidth = Math.max(currentColWidth, itemWidth);\n\t\t\t\t\t\tcurrentColHeight += itemHeight;\n\n\t\t\t\t\t\t// Store the hitbox width and height here. Final position will be updated in `draw`\n\t\t\t\t\t\thitboxes[i] = {\n\t\t\t\t\t\t\tleft: 0,\n\t\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\t\twidth: itemWidth,\n\t\t\t\t\t\t\theight: fontSize\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\n\t\t\t\t\ttotalWidth += currentColWidth;\n\t\t\t\t\tcolumnWidths.push(currentColWidth);\n\t\t\t\t\tminSize.width += totalWidth;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tme.width = minSize.width;\n\t\t\tme.height = minSize.height;\n\t\t},\n\t\tafterFit: noop,\n\n\t\t// Shared Methods\n\t\tisHorizontal: function() {\n\t\t\treturn this.options.position === 'top' || this.options.position === 'bottom';\n\t\t},\n\n\t\t// Actually draw the legend on the canvas\n\t\tdraw: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar labelOpts = opts.labels;\n\t\t\tvar globalDefault = Chart.defaults.global,\n\t\t\t\tlineDefault = globalDefault.elements.line,\n\t\t\t\tlegendWidth = me.width,\n\t\t\t\tlineWidths = me.lineWidths;\n\n\t\t\tif (opts.display) {\n\t\t\t\tvar ctx = me.ctx,\n\t\t\t\t\tcursor,\n\t\t\t\t\titemOrDefault = helpers.getValueOrDefault,\n\t\t\t\t\tfontColor = itemOrDefault(labelOpts.fontColor, globalDefault.defaultFontColor),\n\t\t\t\t\tfontSize = itemOrDefault(labelOpts.fontSize, globalDefault.defaultFontSize),\n\t\t\t\t\tfontStyle = itemOrDefault(labelOpts.fontStyle, globalDefault.defaultFontStyle),\n\t\t\t\t\tfontFamily = itemOrDefault(labelOpts.fontFamily, globalDefault.defaultFontFamily),\n\t\t\t\t\tlabelFont = helpers.fontString(fontSize, fontStyle, fontFamily);\n\n\t\t\t\t// Canvas setup\n\t\t\t\tctx.textAlign = 'left';\n\t\t\t\tctx.textBaseline = 'top';\n\t\t\t\tctx.lineWidth = 0.5;\n\t\t\t\tctx.strokeStyle = fontColor; // for strikethrough effect\n\t\t\t\tctx.fillStyle = fontColor; // render in correct colour\n\t\t\t\tctx.font = labelFont;\n\n\t\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize),\n\t\t\t\t\thitboxes = me.legendHitBoxes;\n\n\t\t\t\t// current position\n\t\t\t\tvar drawLegendBox = function(x, y, legendItem) {\n\t\t\t\t\tif (isNaN(boxWidth) || boxWidth <= 0) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Set the ctx for the box\n\t\t\t\t\tctx.save();\n\n\t\t\t\t\tctx.fillStyle = itemOrDefault(legendItem.fillStyle, globalDefault.defaultColor);\n\t\t\t\t\tctx.lineCap = itemOrDefault(legendItem.lineCap, lineDefault.borderCapStyle);\n\t\t\t\t\tctx.lineDashOffset = itemOrDefault(legendItem.lineDashOffset, lineDefault.borderDashOffset);\n\t\t\t\t\tctx.lineJoin = itemOrDefault(legendItem.lineJoin, lineDefault.borderJoinStyle);\n\t\t\t\t\tctx.lineWidth = itemOrDefault(legendItem.lineWidth, lineDefault.borderWidth);\n\t\t\t\t\tctx.strokeStyle = itemOrDefault(legendItem.strokeStyle, globalDefault.defaultColor);\n\t\t\t\t\tvar isLineWidthZero = (itemOrDefault(legendItem.lineWidth, lineDefault.borderWidth) === 0);\n\n\t\t\t\t\tif (ctx.setLineDash) {\n\t\t\t\t\t\t// IE 9 and 10 do not support line dash\n\t\t\t\t\t\tctx.setLineDash(itemOrDefault(legendItem.lineDash, lineDefault.borderDash));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (opts.labels && opts.labels.usePointStyle) {\n\t\t\t\t\t\t// Recalculate x and y for drawPoint() because its expecting\n\t\t\t\t\t\t// x and y to be center of figure (instead of top left)\n\t\t\t\t\t\tvar radius = fontSize * Math.SQRT2 / 2;\n\t\t\t\t\t\tvar offSet = radius / Math.SQRT2;\n\t\t\t\t\t\tvar centerX = x + offSet;\n\t\t\t\t\t\tvar centerY = y + offSet;\n\n\t\t\t\t\t\t// Draw pointStyle as legend symbol\n\t\t\t\t\t\tChart.canvasHelpers.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Draw box as legend symbol\n\t\t\t\t\t\tif (!isLineWidthZero) {\n\t\t\t\t\t\t\tctx.strokeRect(x, y, boxWidth, fontSize);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tctx.fillRect(x, y, boxWidth, fontSize);\n\t\t\t\t\t}\n\n\t\t\t\t\tctx.restore();\n\t\t\t\t};\n\t\t\t\tvar fillText = function(x, y, legendItem, textWidth) {\n\t\t\t\t\tctx.fillText(legendItem.text, boxWidth + (fontSize / 2) + x, y);\n\n\t\t\t\t\tif (legendItem.hidden) {\n\t\t\t\t\t\t// Strikethrough the text if hidden\n\t\t\t\t\t\tctx.beginPath();\n\t\t\t\t\t\tctx.lineWidth = 2;\n\t\t\t\t\t\tctx.moveTo(boxWidth + (fontSize / 2) + x, y + (fontSize / 2));\n\t\t\t\t\t\tctx.lineTo(boxWidth + (fontSize / 2) + x + textWidth, y + (fontSize / 2));\n\t\t\t\t\t\tctx.stroke();\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Horizontal\n\t\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\t\tif (isHorizontal) {\n\t\t\t\t\tcursor = {\n\t\t\t\t\t\tx: me.left + ((legendWidth - lineWidths[0]) / 2),\n\t\t\t\t\t\ty: me.top + labelOpts.padding,\n\t\t\t\t\t\tline: 0\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tcursor = {\n\t\t\t\t\t\tx: me.left + labelOpts.padding,\n\t\t\t\t\t\ty: me.top + labelOpts.padding,\n\t\t\t\t\t\tline: 0\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tvar itemHeight = fontSize + labelOpts.padding;\n\t\t\t\thelpers.each(me.legendItems, function(legendItem, i) {\n\t\t\t\t\tvar textWidth = ctx.measureText(legendItem.text).width,\n\t\t\t\t\t\twidth = boxWidth + (fontSize / 2) + textWidth,\n\t\t\t\t\t\tx = cursor.x,\n\t\t\t\t\t\ty = cursor.y;\n\n\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\tif (x + width >= legendWidth) {\n\t\t\t\t\t\t\ty = cursor.y += itemHeight;\n\t\t\t\t\t\t\tcursor.line++;\n\t\t\t\t\t\t\tx = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (y + itemHeight > me.bottom) {\n\t\t\t\t\t\tx = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding;\n\t\t\t\t\t\ty = cursor.y = me.top + labelOpts.padding;\n\t\t\t\t\t\tcursor.line++;\n\t\t\t\t\t}\n\n\t\t\t\t\tdrawLegendBox(x, y, legendItem);\n\n\t\t\t\t\thitboxes[i].left = x;\n\t\t\t\t\thitboxes[i].top = y;\n\n\t\t\t\t\t// Fill the actual label\n\t\t\t\t\tfillText(x, y, legendItem, textWidth);\n\n\t\t\t\t\tif (isHorizontal) {\n\t\t\t\t\t\tcursor.x += width + (labelOpts.padding);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcursor.y += itemHeight;\n\t\t\t\t\t}\n\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Handle an event\n\t\t * @private\n\t\t * @param {IEvent} event - The event to handle\n\t\t * @return {Boolean} true if a change occured\n\t\t */\n\t\thandleEvent: function(e) {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar type = e.type === 'mouseup' ? 'click' : e.type;\n\t\t\tvar changed = false;\n\n\t\t\tif (type === 'mousemove') {\n\t\t\t\tif (!opts.onHover) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else if (type === 'click') {\n\t\t\t\tif (!opts.onClick) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Chart event already has relative position in it\n\t\t\tvar x = e.x,\n\t\t\t\ty = e.y;\n\n\t\t\tif (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) {\n\t\t\t\t// See if we are touching one of the dataset boxes\n\t\t\t\tvar lh = me.legendHitBoxes;\n\t\t\t\tfor (var i = 0; i < lh.length; ++i) {\n\t\t\t\t\tvar hitBox = lh[i];\n\n\t\t\t\t\tif (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) {\n\t\t\t\t\t\t// Touching an element\n\t\t\t\t\t\tif (type === 'click') {\n\t\t\t\t\t\t\t// use e.native for backwards compatibility\n\t\t\t\t\t\t\topts.onClick.call(me, e.native, me.legendItems[i]);\n\t\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t} else if (type === 'mousemove') {\n\t\t\t\t\t\t\t// use e.native for backwards compatibility\n\t\t\t\t\t\t\topts.onHover.call(me, e.native, me.legendItems[i]);\n\t\t\t\t\t\t\tchanged = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn changed;\n\t\t}\n\t});\n\n\tfunction createNewLegendAndAttach(chart, legendOpts) {\n\t\tvar legend = new Chart.Legend({\n\t\t\tctx: chart.ctx,\n\t\t\toptions: legendOpts,\n\t\t\tchart: chart\n\t\t});\n\n\t\tlayout.configure(chart, legend, legendOpts);\n\t\tlayout.addBox(chart, legend);\n\t\tchart.legend = legend;\n\t}\n\n\treturn {\n\t\tid: 'legend',\n\n\t\tbeforeInit: function(chart) {\n\t\t\tvar legendOpts = chart.options.legend;\n\n\t\t\tif (legendOpts) {\n\t\t\t\tcreateNewLegendAndAttach(chart, legendOpts);\n\t\t\t}\n\t\t},\n\n\t\tbeforeUpdate: function(chart) {\n\t\t\tvar legendOpts = chart.options.legend;\n\t\t\tvar legend = chart.legend;\n\n\t\t\tif (legendOpts) {\n\t\t\t\tlegendOpts = helpers.configMerge(Chart.defaults.global.legend, legendOpts);\n\n\t\t\t\tif (legend) {\n\t\t\t\t\tlayout.configure(chart, legend, legendOpts);\n\t\t\t\t\tlegend.options = legendOpts;\n\t\t\t\t} else {\n\t\t\t\t\tcreateNewLegendAndAttach(chart, legendOpts);\n\t\t\t\t}\n\t\t\t} else if (legend) {\n\t\t\t\tlayout.removeBox(chart, legend);\n\t\t\t\tdelete chart.legend;\n\t\t\t}\n\t\t},\n\n\t\tafterEvent: function(chart, e) {\n\t\t\tvar legend = chart.legend;\n\t\t\tif (legend) {\n\t\t\t\tlegend.handleEvent(e);\n\t\t\t}\n\t\t}\n\t};\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\tvar layout = Chart.layoutService;\n\tvar noop = helpers.noop;\n\n\tChart.defaults.global.title = {\n\t\tdisplay: false,\n\t\tposition: 'top',\n\t\tfullWidth: true,\n\t\tweight: 2000,        // by default greater than legend (1000) to be above\n\t\tfontStyle: 'bold',\n\t\tpadding: 10,\n\n\t\t// actual title\n\t\ttext: ''\n\t};\n\n\tChart.Title = Chart.Element.extend({\n\t\tinitialize: function(config) {\n\t\t\tvar me = this;\n\t\t\thelpers.extend(me, config);\n\n\t\t\t// Contains hit boxes for each dataset (in dataset order)\n\t\t\tme.legendHitBoxes = [];\n\t\t},\n\n\t\t// These methods are ordered by lifecycle. Utilities then follow.\n\n\t\tbeforeUpdate: noop,\n\t\tupdate: function(maxWidth, maxHeight, margins) {\n\t\t\tvar me = this;\n\n\t\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n\t\t\tme.beforeUpdate();\n\n\t\t\t// Absorb the master measurements\n\t\t\tme.maxWidth = maxWidth;\n\t\t\tme.maxHeight = maxHeight;\n\t\t\tme.margins = margins;\n\n\t\t\t// Dimensions\n\t\t\tme.beforeSetDimensions();\n\t\t\tme.setDimensions();\n\t\t\tme.afterSetDimensions();\n\t\t\t// Labels\n\t\t\tme.beforeBuildLabels();\n\t\t\tme.buildLabels();\n\t\t\tme.afterBuildLabels();\n\n\t\t\t// Fit\n\t\t\tme.beforeFit();\n\t\t\tme.fit();\n\t\t\tme.afterFit();\n\t\t\t//\n\t\t\tme.afterUpdate();\n\n\t\t\treturn me.minSize;\n\n\t\t},\n\t\tafterUpdate: noop,\n\n\t\t//\n\n\t\tbeforeSetDimensions: noop,\n\t\tsetDimensions: function() {\n\t\t\tvar me = this;\n\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.width = me.maxWidth;\n\t\t\t\tme.left = 0;\n\t\t\t\tme.right = me.width;\n\t\t\t} else {\n\t\t\t\tme.height = me.maxHeight;\n\n\t\t\t\t// Reset position before calculating rotation\n\t\t\t\tme.top = 0;\n\t\t\t\tme.bottom = me.height;\n\t\t\t}\n\n\t\t\t// Reset padding\n\t\t\tme.paddingLeft = 0;\n\t\t\tme.paddingTop = 0;\n\t\t\tme.paddingRight = 0;\n\t\t\tme.paddingBottom = 0;\n\n\t\t\t// Reset minSize\n\t\t\tme.minSize = {\n\t\t\t\twidth: 0,\n\t\t\t\theight: 0\n\t\t\t};\n\t\t},\n\t\tafterSetDimensions: noop,\n\n\t\t//\n\n\t\tbeforeBuildLabels: noop,\n\t\tbuildLabels: noop,\n\t\tafterBuildLabels: noop,\n\n\t\t//\n\n\t\tbeforeFit: noop,\n\t\tfit: function() {\n\t\t\tvar me = this,\n\t\t\t\tvalueOrDefault = helpers.getValueOrDefault,\n\t\t\t\topts = me.options,\n\t\t\t\tglobalDefaults = Chart.defaults.global,\n\t\t\t\tdisplay = opts.display,\n\t\t\t\tfontSize = valueOrDefault(opts.fontSize, globalDefaults.defaultFontSize),\n\t\t\t\tminSize = me.minSize;\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tminSize.width = me.maxWidth; // fill all the width\n\t\t\t\tminSize.height = display ? fontSize + (opts.padding * 2) : 0;\n\t\t\t} else {\n\t\t\t\tminSize.width = display ? fontSize + (opts.padding * 2) : 0;\n\t\t\t\tminSize.height = me.maxHeight; // fill all the height\n\t\t\t}\n\n\t\t\tme.width = minSize.width;\n\t\t\tme.height = minSize.height;\n\n\t\t},\n\t\tafterFit: noop,\n\n\t\t// Shared Methods\n\t\tisHorizontal: function() {\n\t\t\tvar pos = this.options.position;\n\t\t\treturn pos === 'top' || pos === 'bottom';\n\t\t},\n\n\t\t// Actually draw the title block on the canvas\n\t\tdraw: function() {\n\t\t\tvar me = this,\n\t\t\t\tctx = me.ctx,\n\t\t\t\tvalueOrDefault = helpers.getValueOrDefault,\n\t\t\t\topts = me.options,\n\t\t\t\tglobalDefaults = Chart.defaults.global;\n\n\t\t\tif (opts.display) {\n\t\t\t\tvar fontSize = valueOrDefault(opts.fontSize, globalDefaults.defaultFontSize),\n\t\t\t\t\tfontStyle = valueOrDefault(opts.fontStyle, globalDefaults.defaultFontStyle),\n\t\t\t\t\tfontFamily = valueOrDefault(opts.fontFamily, globalDefaults.defaultFontFamily),\n\t\t\t\t\ttitleFont = helpers.fontString(fontSize, fontStyle, fontFamily),\n\t\t\t\t\trotation = 0,\n\t\t\t\t\ttitleX,\n\t\t\t\t\ttitleY,\n\t\t\t\t\ttop = me.top,\n\t\t\t\t\tleft = me.left,\n\t\t\t\t\tbottom = me.bottom,\n\t\t\t\t\tright = me.right,\n\t\t\t\t\tmaxWidth;\n\n\t\t\t\tctx.fillStyle = valueOrDefault(opts.fontColor, globalDefaults.defaultFontColor); // render in correct colour\n\t\t\t\tctx.font = titleFont;\n\n\t\t\t\t// Horizontal\n\t\t\t\tif (me.isHorizontal()) {\n\t\t\t\t\ttitleX = left + ((right - left) / 2); // midpoint of the width\n\t\t\t\t\ttitleY = top + ((bottom - top) / 2); // midpoint of the height\n\t\t\t\t\tmaxWidth = right - left;\n\t\t\t\t} else {\n\t\t\t\t\ttitleX = opts.position === 'left' ? left + (fontSize / 2) : right - (fontSize / 2);\n\t\t\t\t\ttitleY = top + ((bottom - top) / 2);\n\t\t\t\t\tmaxWidth = bottom - top;\n\t\t\t\t\trotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5);\n\t\t\t\t}\n\n\t\t\t\tctx.save();\n\t\t\t\tctx.translate(titleX, titleY);\n\t\t\t\tctx.rotate(rotation);\n\t\t\t\tctx.textAlign = 'center';\n\t\t\t\tctx.textBaseline = 'middle';\n\t\t\t\tctx.fillText(opts.text, 0, 0, maxWidth);\n\t\t\t\tctx.restore();\n\t\t\t}\n\t\t}\n\t});\n\n\tfunction createNewTitleBlockAndAttach(chart, titleOpts) {\n\t\tvar title = new Chart.Title({\n\t\t\tctx: chart.ctx,\n\t\t\toptions: titleOpts,\n\t\t\tchart: chart\n\t\t});\n\n\t\tlayout.configure(chart, title, titleOpts);\n\t\tlayout.addBox(chart, title);\n\t\tchart.titleBlock = title;\n\t}\n\n\treturn {\n\t\tid: 'title',\n\n\t\tbeforeInit: function(chart) {\n\t\t\tvar titleOpts = chart.options.title;\n\n\t\t\tif (titleOpts) {\n\t\t\t\tcreateNewTitleBlockAndAttach(chart, titleOpts);\n\t\t\t}\n\t\t},\n\n\t\tbeforeUpdate: function(chart) {\n\t\t\tvar titleOpts = chart.options.title;\n\t\t\tvar titleBlock = chart.titleBlock;\n\n\t\t\tif (titleOpts) {\n\t\t\t\ttitleOpts = helpers.configMerge(Chart.defaults.global.title, titleOpts);\n\n\t\t\t\tif (titleBlock) {\n\t\t\t\t\tlayout.configure(chart, titleBlock, titleOpts);\n\t\t\t\t\ttitleBlock.options = titleOpts;\n\t\t\t\t} else {\n\t\t\t\t\tcreateNewTitleBlockAndAttach(chart, titleOpts);\n\t\t\t\t}\n\t\t\t} else if (titleBlock) {\n\t\t\t\tChart.layoutService.removeBox(chart, titleBlock);\n\t\t\t\tdelete chart.titleBlock;\n\t\t\t}\n\t\t}\n\t};\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\t// Default config for a category scale\n\tvar defaultConfig = {\n\t\tposition: 'bottom'\n\t};\n\n\tvar DatasetScale = Chart.Scale.extend({\n\t\t/**\n\t\t* Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those\n\t\t* else fall back to data.labels\n\t\t* @private\n\t\t*/\n\t\tgetLabels: function() {\n\t\t\tvar data = this.chart.data;\n\t\t\treturn (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels;\n\t\t},\n\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tvar labels = me.getLabels();\n\t\t\tme.minIndex = 0;\n\t\t\tme.maxIndex = labels.length - 1;\n\t\t\tvar findIndex;\n\n\t\t\tif (me.options.ticks.min !== undefined) {\n\t\t\t\t// user specified min value\n\t\t\t\tfindIndex = helpers.indexOf(labels, me.options.ticks.min);\n\t\t\t\tme.minIndex = findIndex !== -1 ? findIndex : me.minIndex;\n\t\t\t}\n\n\t\t\tif (me.options.ticks.max !== undefined) {\n\t\t\t\t// user specified max value\n\t\t\t\tfindIndex = helpers.indexOf(labels, me.options.ticks.max);\n\t\t\t\tme.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex;\n\t\t\t}\n\n\t\t\tme.min = labels[me.minIndex];\n\t\t\tme.max = labels[me.maxIndex];\n\t\t},\n\n\t\tbuildTicks: function() {\n\t\t\tvar me = this;\n\t\t\tvar labels = me.getLabels();\n\t\t\t// If we are viewing some subset of labels, slice the original array\n\t\t\tme.ticks = (me.minIndex === 0 && me.maxIndex === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1);\n\t\t},\n\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar data = me.chart.data;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\n\t\t\tif (data.yLabels && !isHorizontal) {\n\t\t\t\treturn me.getRightValue(data.datasets[datasetIndex].data[index]);\n\t\t\t}\n\t\t\treturn me.ticks[index - me.minIndex];\n\t\t},\n\n\t\t// Used to get data value locations.  Value can either be an index or a numerical value\n\t\tgetPixelForValue: function(value, index, datasetIndex, includeOffset) {\n\t\t\tvar me = this;\n\t\t\t// 1 is added because we need the length but we have the indexes\n\t\t\tvar offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - ((me.options.gridLines.offsetGridLines) ? 0 : 1)), 1);\n\n\t\t\t// If value is a data object, then index is the index in the data array,\n\t\t\t// not the index of the scale. We need to change that.\n\t\t\tvar valueCategory;\n\t\t\tif (value !== undefined && value !== null) {\n\t\t\t\tvalueCategory = me.isHorizontal() ? value.x : value.y;\n\t\t\t}\n\t\t\tif (valueCategory !== undefined || (value !== undefined && isNaN(index))) {\n\t\t\t\tvar labels = me.getLabels();\n\t\t\t\tvalue = valueCategory || value;\n\t\t\t\tvar idx = labels.indexOf(value);\n\t\t\t\tindex = idx !== -1 ? idx : index;\n\t\t\t}\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tvar valueWidth = me.width / offsetAmt;\n\t\t\t\tvar widthOffset = (valueWidth * (index - me.minIndex));\n\n\t\t\t\tif (me.options.gridLines.offsetGridLines && includeOffset || me.maxIndex === me.minIndex && includeOffset) {\n\t\t\t\t\twidthOffset += (valueWidth / 2);\n\t\t\t\t}\n\n\t\t\t\treturn me.left + Math.round(widthOffset);\n\t\t\t}\n\t\t\tvar valueHeight = me.height / offsetAmt;\n\t\t\tvar heightOffset = (valueHeight * (index - me.minIndex));\n\n\t\t\tif (me.options.gridLines.offsetGridLines && includeOffset) {\n\t\t\t\theightOffset += (valueHeight / 2);\n\t\t\t}\n\n\t\t\treturn me.top + Math.round(heightOffset);\n\t\t},\n\t\tgetPixelForTick: function(index, includeOffset) {\n\t\t\treturn this.getPixelForValue(this.ticks[index], index + this.minIndex, null, includeOffset);\n\t\t},\n\t\tgetValueForPixel: function(pixel) {\n\t\t\tvar me = this;\n\t\t\tvar value;\n\t\t\tvar offsetAmt = Math.max((me.ticks.length - ((me.options.gridLines.offsetGridLines) ? 0 : 1)), 1);\n\t\t\tvar horz = me.isHorizontal();\n\t\t\tvar valueDimension = (horz ? me.width : me.height) / offsetAmt;\n\n\t\t\tpixel -= horz ? me.left : me.top;\n\n\t\t\tif (me.options.gridLines.offsetGridLines) {\n\t\t\t\tpixel -= (valueDimension / 2);\n\t\t\t}\n\n\t\t\tif (pixel <= 0) {\n\t\t\t\tvalue = 0;\n\t\t\t} else {\n\t\t\t\tvalue = Math.round(pixel / valueDimension);\n\t\t\t}\n\n\t\t\treturn value;\n\t\t},\n\t\tgetBasePixel: function() {\n\t\t\treturn this.bottom;\n\t\t}\n\t});\n\n\tChart.scaleService.registerScaleType('category', DatasetScale, defaultConfig);\n\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tvar defaultConfig = {\n\t\tposition: 'left',\n\t\tticks: {\n\t\t\tcallback: Chart.Ticks.formatters.linear\n\t\t}\n\t};\n\n\tvar LinearScale = Chart.LinearScaleBase.extend({\n\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar chart = me.chart;\n\t\t\tvar data = chart.data;\n\t\t\tvar datasets = data.datasets;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\tvar DEFAULT_MIN = 0;\n\t\t\tvar DEFAULT_MAX = 1;\n\n\t\t\tfunction IDMatches(meta) {\n\t\t\t\treturn isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\n\t\t\t}\n\n\t\t\t// First Calculate the range\n\t\t\tme.min = null;\n\t\t\tme.max = null;\n\n\t\t\tvar hasStacks = opts.stacked;\n\t\t\tif (hasStacks === undefined) {\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tif (hasStacks) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) &&\n\t\t\t\t\t\tmeta.stack !== undefined) {\n\t\t\t\t\t\thasStacks = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (opts.stacked || hasStacks) {\n\t\t\t\tvar valuesPerStack = {};\n\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tvar key = [\n\t\t\t\t\t\tmeta.type,\n\t\t\t\t\t\t// we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\n\t\t\t\t\t\t((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''),\n\t\t\t\t\t\tmeta.stack\n\t\t\t\t\t].join('.');\n\n\t\t\t\t\tif (valuesPerStack[key] === undefined) {\n\t\t\t\t\t\tvaluesPerStack[key] = {\n\t\t\t\t\t\t\tpositiveValues: [],\n\t\t\t\t\t\t\tnegativeValues: []\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Store these per type\n\t\t\t\t\tvar positiveValues = valuesPerStack[key].positiveValues;\n\t\t\t\t\tvar negativeValues = valuesPerStack[key].negativeValues;\n\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tpositiveValues[index] = positiveValues[index] || 0;\n\t\t\t\t\t\t\tnegativeValues[index] = negativeValues[index] || 0;\n\n\t\t\t\t\t\t\tif (opts.relativePoints) {\n\t\t\t\t\t\t\t\tpositiveValues[index] = 100;\n\t\t\t\t\t\t\t} else if (value < 0) {\n\t\t\t\t\t\t\t\tnegativeValues[index] += value;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tpositiveValues[index] += value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\thelpers.each(valuesPerStack, function(valuesForType) {\n\t\t\t\t\tvar values = valuesForType.positiveValues.concat(valuesForType.negativeValues);\n\t\t\t\t\tvar minVal = helpers.min(values);\n\t\t\t\t\tvar maxVal = helpers.max(values);\n\t\t\t\t\tme.min = me.min === null ? minVal : Math.min(me.min, minVal);\n\t\t\t\t\tme.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\n\t\t\t\t});\n\n\t\t\t} else {\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (me.min === null) {\n\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t} else if (value < me.min) {\n\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (me.max === null) {\n\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t} else if (value > me.max) {\n\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tme.min = isFinite(me.min) ? me.min : DEFAULT_MIN;\n\t\t\tme.max = isFinite(me.max) ? me.max : DEFAULT_MAX;\n\n\t\t\t// Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\n\t\t\tthis.handleTickRangeOptions();\n\t\t},\n\t\tgetTickLimit: function() {\n\t\t\tvar maxTicks;\n\t\t\tvar me = this;\n\t\t\tvar tickOpts = me.options.ticks;\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tmaxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.width / 50));\n\t\t\t} else {\n\t\t\t\t// The factor of 2 used to scale the font size has been experimentally determined.\n\t\t\t\tvar tickFontSize = helpers.getValueOrDefault(tickOpts.fontSize, Chart.defaults.global.defaultFontSize);\n\t\t\t\tmaxTicks = Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(me.height / (2 * tickFontSize)));\n\t\t\t}\n\n\t\t\treturn maxTicks;\n\t\t},\n\t\t// Called after the ticks are built. We need\n\t\thandleDirectionalChanges: function() {\n\t\t\tif (!this.isHorizontal()) {\n\t\t\t\t// We are in a vertical orientation. The top value is the highest. So reverse the array\n\t\t\t\tthis.ticks.reverse();\n\t\t\t}\n\t\t},\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\treturn +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n\t\t},\n\t\t// Utils\n\t\tgetPixelForValue: function(value) {\n\t\t\t// This must be called after fit has been run so that\n\t\t\t// this.left, this.top, this.right, and this.bottom have been defined\n\t\t\tvar me = this;\n\t\t\tvar start = me.start;\n\n\t\t\tvar rightValue = +me.getRightValue(value);\n\t\t\tvar pixel;\n\t\t\tvar range = me.end - start;\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tpixel = me.left + (me.width / range * (rightValue - start));\n\t\t\t\treturn Math.round(pixel);\n\t\t\t}\n\n\t\t\tpixel = me.bottom - (me.height / range * (rightValue - start));\n\t\t\treturn Math.round(pixel);\n\t\t},\n\t\tgetValueForPixel: function(pixel) {\n\t\t\tvar me = this;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\tvar innerDimension = isHorizontal ? me.width : me.height;\n\t\t\tvar offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension;\n\t\t\treturn me.start + ((me.end - me.start) * offset);\n\t\t},\n\t\tgetPixelForTick: function(index) {\n\t\t\treturn this.getPixelForValue(this.ticksAsNumbers[index]);\n\t\t}\n\t});\n\tChart.scaleService.registerScaleType('linear', LinearScale, defaultConfig);\n\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers,\n\t\tnoop = helpers.noop;\n\n\tChart.LinearScaleBase = Chart.Scale.extend({\n\t\thandleTickRangeOptions: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\n\t\t\t// If we are forcing it to begin at 0, but 0 will already be rendered on the chart,\n\t\t\t// do nothing since that would make the chart weird. If the user really wants a weird chart\n\t\t\t// axis, they can manually override it\n\t\t\tif (tickOpts.beginAtZero) {\n\t\t\t\tvar minSign = helpers.sign(me.min);\n\t\t\t\tvar maxSign = helpers.sign(me.max);\n\n\t\t\t\tif (minSign < 0 && maxSign < 0) {\n\t\t\t\t\t// move the top up to 0\n\t\t\t\t\tme.max = 0;\n\t\t\t\t} else if (minSign > 0 && maxSign > 0) {\n\t\t\t\t\t// move the bottom down to 0\n\t\t\t\t\tme.min = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (tickOpts.min !== undefined) {\n\t\t\t\tme.min = tickOpts.min;\n\t\t\t} else if (tickOpts.suggestedMin !== undefined) {\n\t\t\t\tif (me.min === null) {\n\t\t\t\t\tme.min = tickOpts.suggestedMin;\n\t\t\t\t} else {\n\t\t\t\t\tme.min = Math.min(me.min, tickOpts.suggestedMin);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (tickOpts.max !== undefined) {\n\t\t\t\tme.max = tickOpts.max;\n\t\t\t} else if (tickOpts.suggestedMax !== undefined) {\n\t\t\t\tif (me.max === null) {\n\t\t\t\t\tme.max = tickOpts.suggestedMax;\n\t\t\t\t} else {\n\t\t\t\t\tme.max = Math.max(me.max, tickOpts.suggestedMax);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (me.min === me.max) {\n\t\t\t\tme.max++;\n\n\t\t\t\tif (!tickOpts.beginAtZero) {\n\t\t\t\t\tme.min--;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tgetTickLimit: noop,\n\t\thandleDirectionalChanges: noop,\n\n\t\tbuildTicks: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\n\t\t\t// Figure out what the max number of ticks we can support it is based on the size of\n\t\t\t// the axis area. For now, we say that the minimum tick spacing in pixels must be 50\n\t\t\t// We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n\t\t\t// the graph. Make sure we always have at least 2 ticks\n\t\t\tvar maxTicks = me.getTickLimit();\n\t\t\tmaxTicks = Math.max(2, maxTicks);\n\n\t\t\tvar numericGeneratorOptions = {\n\t\t\t\tmaxTicks: maxTicks,\n\t\t\t\tmin: tickOpts.min,\n\t\t\t\tmax: tickOpts.max,\n\t\t\t\tstepSize: helpers.getValueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize)\n\t\t\t};\n\t\t\tvar ticks = me.ticks = Chart.Ticks.generators.linear(numericGeneratorOptions, me);\n\n\t\t\tme.handleDirectionalChanges();\n\n\t\t\t// At this point, we need to update our max and min given the tick values since we have expanded the\n\t\t\t// range of the scale\n\t\t\tme.max = helpers.max(ticks);\n\t\t\tme.min = helpers.min(ticks);\n\n\t\t\tif (tickOpts.reverse) {\n\t\t\t\tticks.reverse();\n\n\t\t\t\tme.start = me.max;\n\t\t\t\tme.end = me.min;\n\t\t\t} else {\n\t\t\t\tme.start = me.min;\n\t\t\t\tme.end = me.max;\n\t\t\t}\n\t\t},\n\t\tconvertTicksToLabels: function() {\n\t\t\tvar me = this;\n\t\t\tme.ticksAsNumbers = me.ticks.slice();\n\t\t\tme.zeroLineIndex = me.ticks.indexOf(0);\n\n\t\t\tChart.Scale.prototype.convertTicksToLabels.call(me);\n\t\t}\n\t});\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\n\tvar defaultConfig = {\n\t\tposition: 'left',\n\n\t\t// label settings\n\t\tticks: {\n\t\t\tcallback: Chart.Ticks.formatters.logarithmic\n\t\t}\n\t};\n\n\tvar LogarithmicScale = Chart.Scale.extend({\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\t\t\tvar chart = me.chart;\n\t\t\tvar data = chart.data;\n\t\t\tvar datasets = data.datasets;\n\t\t\tvar getValueOrDefault = helpers.getValueOrDefault;\n\t\t\tvar isHorizontal = me.isHorizontal();\n\t\t\tfunction IDMatches(meta) {\n\t\t\t\treturn isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\n\t\t\t}\n\n\t\t\t// Calculate Range\n\t\t\tme.min = null;\n\t\t\tme.max = null;\n\t\t\tme.minNotZero = null;\n\n\t\t\tvar hasStacks = opts.stacked;\n\t\t\tif (hasStacks === undefined) {\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tif (hasStacks) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) &&\n\t\t\t\t\t\tmeta.stack !== undefined) {\n\t\t\t\t\t\thasStacks = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (opts.stacked || hasStacks) {\n\t\t\t\tvar valuesPerStack = {};\n\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tvar key = [\n\t\t\t\t\t\tmeta.type,\n\t\t\t\t\t\t// we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\n\t\t\t\t\t\t((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''),\n\t\t\t\t\t\tmeta.stack\n\t\t\t\t\t].join('.');\n\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\tif (valuesPerStack[key] === undefined) {\n\t\t\t\t\t\t\tvaluesPerStack[key] = [];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\t\tvar values = valuesPerStack[key];\n\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvalues[index] = values[index] || 0;\n\n\t\t\t\t\t\t\tif (opts.relativePoints) {\n\t\t\t\t\t\t\t\tvalues[index] = 100;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Don't need to split positive and negative since the log scale can't handle a 0 crossing\n\t\t\t\t\t\t\t\tvalues[index] += value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\thelpers.each(valuesPerStack, function(valuesForType) {\n\t\t\t\t\tvar minVal = helpers.min(valuesForType);\n\t\t\t\t\tvar maxVal = helpers.max(valuesForType);\n\t\t\t\t\tme.min = me.min === null ? minVal : Math.min(me.min, minVal);\n\t\t\t\t\tme.max = me.max === null ? maxVal : Math.max(me.max, maxVal);\n\t\t\t\t});\n\n\t\t\t} else {\n\t\t\t\thelpers.each(datasets, function(dataset, datasetIndex) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\t\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\n\t\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (me.min === null) {\n\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t} else if (value < me.min) {\n\t\t\t\t\t\t\t\tme.min = value;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (me.max === null) {\n\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t} else if (value > me.max) {\n\t\t\t\t\t\t\t\tme.max = value;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) {\n\t\t\t\t\t\t\t\tme.minNotZero = value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tme.min = getValueOrDefault(tickOpts.min, me.min);\n\t\t\tme.max = getValueOrDefault(tickOpts.max, me.max);\n\n\t\t\tif (me.min === me.max) {\n\t\t\t\tif (me.min !== 0 && me.min !== null) {\n\t\t\t\t\tme.min = Math.pow(10, Math.floor(helpers.log10(me.min)) - 1);\n\t\t\t\t\tme.max = Math.pow(10, Math.floor(helpers.log10(me.max)) + 1);\n\t\t\t\t} else {\n\t\t\t\t\tme.min = 1;\n\t\t\t\t\tme.max = 10;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tbuildTicks: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\n\t\t\tvar generationOptions = {\n\t\t\t\tmin: tickOpts.min,\n\t\t\t\tmax: tickOpts.max\n\t\t\t};\n\t\t\tvar ticks = me.ticks = Chart.Ticks.generators.logarithmic(generationOptions, me);\n\n\t\t\tif (!me.isHorizontal()) {\n\t\t\t\t// We are in a vertical orientation. The top value is the highest. So reverse the array\n\t\t\t\tticks.reverse();\n\t\t\t}\n\n\t\t\t// At this point, we need to update our max and min given the tick values since we have expanded the\n\t\t\t// range of the scale\n\t\t\tme.max = helpers.max(ticks);\n\t\t\tme.min = helpers.min(ticks);\n\n\t\t\tif (tickOpts.reverse) {\n\t\t\t\tticks.reverse();\n\n\t\t\t\tme.start = me.max;\n\t\t\t\tme.end = me.min;\n\t\t\t} else {\n\t\t\t\tme.start = me.min;\n\t\t\t\tme.end = me.max;\n\t\t\t}\n\t\t},\n\t\tconvertTicksToLabels: function() {\n\t\t\tthis.tickValues = this.ticks.slice();\n\n\t\t\tChart.Scale.prototype.convertTicksToLabels.call(this);\n\t\t},\n\t\t// Get the correct tooltip label\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\treturn +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n\t\t},\n\t\tgetPixelForTick: function(index) {\n\t\t\treturn this.getPixelForValue(this.tickValues[index]);\n\t\t},\n\t\tgetPixelForValue: function(value) {\n\t\t\tvar me = this;\n\t\t\tvar innerDimension;\n\t\t\tvar pixel;\n\n\t\t\tvar start = me.start;\n\t\t\tvar newVal = +me.getRightValue(value);\n\t\t\tvar range;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\trange = helpers.log10(me.end) - helpers.log10(start); // todo: if start === 0\n\t\t\t\tif (newVal === 0) {\n\t\t\t\t\tpixel = me.left;\n\t\t\t\t} else {\n\t\t\t\t\tinnerDimension = me.width;\n\t\t\t\t\tpixel = me.left + (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start)));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Bottom - top since pixels increase downward on a screen\n\t\t\t\tinnerDimension = me.height;\n\t\t\t\tif (start === 0 && !tickOpts.reverse) {\n\t\t\t\t\trange = helpers.log10(me.end) - helpers.log10(me.minNotZero);\n\t\t\t\t\tif (newVal === start) {\n\t\t\t\t\t\tpixel = me.bottom;\n\t\t\t\t\t} else if (newVal === me.minNotZero) {\n\t\t\t\t\t\tpixel = me.bottom - innerDimension * 0.02;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpixel = me.bottom - innerDimension * 0.02 - (innerDimension * 0.98/ range * (helpers.log10(newVal)-helpers.log10(me.minNotZero)));\n\t\t\t\t\t}\n\t\t\t\t} else if (me.end === 0 && tickOpts.reverse) {\n\t\t\t\t\trange = helpers.log10(me.start) - helpers.log10(me.minNotZero);\n\t\t\t\t\tif (newVal === me.end) {\n\t\t\t\t\t\tpixel = me.top;\n\t\t\t\t\t} else if (newVal === me.minNotZero) {\n\t\t\t\t\t\tpixel = me.top + innerDimension * 0.02;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpixel = me.top + innerDimension * 0.02 + (innerDimension * 0.98/ range * (helpers.log10(newVal)-helpers.log10(me.minNotZero)));\n\t\t\t\t\t}\n\t\t\t\t} else if (newVal === 0) {\n\t\t\t\t\tpixel = tickOpts.reverse ? me.top : me.bottom;\n\t\t\t\t} else {\n\t\t\t\t\trange = helpers.log10(me.end) - helpers.log10(start);\n\t\t\t\t\tinnerDimension = me.height;\n\t\t\t\t\tpixel = me.bottom - (innerDimension / range * (helpers.log10(newVal) - helpers.log10(start)));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn pixel;\n\t\t},\n\t\tgetValueForPixel: function(pixel) {\n\t\t\tvar me = this;\n\t\t\tvar range = helpers.log10(me.end) - helpers.log10(me.start);\n\t\t\tvar value, innerDimension;\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tinnerDimension = me.width;\n\t\t\t\tvalue = me.start * Math.pow(10, (pixel - me.left) * range / innerDimension);\n\t\t\t} else {  // todo: if start === 0\n\t\t\t\tinnerDimension = me.height;\n\t\t\t\tvalue = Math.pow(10, (me.bottom - pixel) * range / innerDimension) / me.start;\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\t});\n\tChart.scaleService.registerScaleType('logarithmic', LogarithmicScale, defaultConfig);\n\n};\n",
    "'use strict';\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\tvar globalDefaults = Chart.defaults.global;\n\n\tvar defaultConfig = {\n\t\tdisplay: true,\n\n\t\t// Boolean - Whether to animate scaling the chart from the centre\n\t\tanimate: true,\n\t\tposition: 'chartArea',\n\n\t\tangleLines: {\n\t\t\tdisplay: true,\n\t\t\tcolor: 'rgba(0, 0, 0, 0.1)',\n\t\t\tlineWidth: 1\n\t\t},\n\n\t\tgridLines: {\n\t\t\tcircular: false\n\t\t},\n\n\t\t// label settings\n\t\tticks: {\n\t\t\t// Boolean - Show a backdrop to the scale label\n\t\t\tshowLabelBackdrop: true,\n\n\t\t\t// String - The colour of the label backdrop\n\t\t\tbackdropColor: 'rgba(255,255,255,0.75)',\n\n\t\t\t// Number - The backdrop padding above & below the label in pixels\n\t\t\tbackdropPaddingY: 2,\n\n\t\t\t// Number - The backdrop padding to the side of the label in pixels\n\t\t\tbackdropPaddingX: 2,\n\n\t\t\tcallback: Chart.Ticks.formatters.linear\n\t\t},\n\n\t\tpointLabels: {\n\t\t\t// Boolean - if true, show point labels\n\t\t\tdisplay: true,\n\n\t\t\t// Number - Point label font size in pixels\n\t\t\tfontSize: 10,\n\n\t\t\t// Function - Used to convert point labels\n\t\t\tcallback: function(label) {\n\t\t\t\treturn label;\n\t\t\t}\n\t\t}\n\t};\n\n\tfunction getValueCount(scale) {\n\t\tvar opts = scale.options;\n\t\treturn opts.angleLines.display || opts.pointLabels.display ? scale.chart.data.labels.length : 0;\n\t}\n\n\tfunction getPointLabelFontOptions(scale) {\n\t\tvar pointLabelOptions = scale.options.pointLabels;\n\t\tvar fontSize = helpers.getValueOrDefault(pointLabelOptions.fontSize, globalDefaults.defaultFontSize);\n\t\tvar fontStyle = helpers.getValueOrDefault(pointLabelOptions.fontStyle, globalDefaults.defaultFontStyle);\n\t\tvar fontFamily = helpers.getValueOrDefault(pointLabelOptions.fontFamily, globalDefaults.defaultFontFamily);\n\t\tvar font = helpers.fontString(fontSize, fontStyle, fontFamily);\n\n\t\treturn {\n\t\t\tsize: fontSize,\n\t\t\tstyle: fontStyle,\n\t\t\tfamily: fontFamily,\n\t\t\tfont: font\n\t\t};\n\t}\n\n\tfunction measureLabelSize(ctx, fontSize, label) {\n\t\tif (helpers.isArray(label)) {\n\t\t\treturn {\n\t\t\t\tw: helpers.longestText(ctx, ctx.font, label),\n\t\t\t\th: (label.length * fontSize) + ((label.length - 1) * 1.5 * fontSize)\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tw: ctx.measureText(label).width,\n\t\t\th: fontSize\n\t\t};\n\t}\n\n\tfunction determineLimits(angle, pos, size, min, max) {\n\t\tif (angle === min || angle === max) {\n\t\t\treturn {\n\t\t\t\tstart: pos - (size / 2),\n\t\t\t\tend: pos + (size / 2)\n\t\t\t};\n\t\t} else if (angle < min || angle > max) {\n\t\t\treturn {\n\t\t\t\tstart: pos - size - 5,\n\t\t\t\tend: pos\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tstart: pos,\n\t\t\tend: pos + size + 5\n\t\t};\n\t}\n\n\t/**\n\t * Helper function to fit a radial linear scale with point labels\n\t */\n\tfunction fitWithPointLabels(scale) {\n\t\t/*\n\t\t * Right, this is really confusing and there is a lot of maths going on here\n\t\t * The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n\t\t *\n\t\t * Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n\t\t *\n\t\t * Solution:\n\t\t *\n\t\t * We assume the radius of the polygon is half the size of the canvas at first\n\t\t * at each index we check if the text overlaps.\n\t\t *\n\t\t * Where it does, we store that angle and that index.\n\t\t *\n\t\t * After finding the largest index and angle we calculate how much we need to remove\n\t\t * from the shape radius to move the point inwards by that x.\n\t\t *\n\t\t * We average the left and right distances to get the maximum shape radius that can fit in the box\n\t\t * along with labels.\n\t\t *\n\t\t * Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n\t\t * on each side, removing that from the size, halving it and adding the left x protrusion width.\n\t\t *\n\t\t * This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n\t\t * and position it in the most space efficient manner\n\t\t *\n\t\t * https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n\t\t */\n\n\t\tvar plFont = getPointLabelFontOptions(scale);\n\n\t\t// Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n\t\t// Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n\t\tvar largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2);\n\t\tvar furthestLimits = {\n\t\t\tr: scale.width,\n\t\t\tl: 0,\n\t\t\tt: scale.height,\n\t\t\tb: 0\n\t\t};\n\t\tvar furthestAngles = {};\n\t\tvar i;\n\t\tvar textSize;\n\t\tvar pointPosition;\n\n\t\tscale.ctx.font = plFont.font;\n\t\tscale._pointLabelSizes = [];\n\n\t\tvar valueCount = getValueCount(scale);\n\t\tfor (i = 0; i < valueCount; i++) {\n\t\t\tpointPosition = scale.getPointPosition(i, largestPossibleRadius);\n\t\t\ttextSize = measureLabelSize(scale.ctx, plFont.size, scale.pointLabels[i] || '');\n\t\t\tscale._pointLabelSizes[i] = textSize;\n\n\t\t\t// Add quarter circle to make degree 0 mean top of circle\n\t\t\tvar angleRadians = scale.getIndexAngle(i);\n\t\t\tvar angle = helpers.toDegrees(angleRadians) % 360;\n\t\t\tvar hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n\t\t\tvar vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n\n\t\t\tif (hLimits.start < furthestLimits.l) {\n\t\t\t\tfurthestLimits.l = hLimits.start;\n\t\t\t\tfurthestAngles.l = angleRadians;\n\t\t\t}\n\n\t\t\tif (hLimits.end > furthestLimits.r) {\n\t\t\t\tfurthestLimits.r = hLimits.end;\n\t\t\t\tfurthestAngles.r = angleRadians;\n\t\t\t}\n\n\t\t\tif (vLimits.start < furthestLimits.t) {\n\t\t\t\tfurthestLimits.t = vLimits.start;\n\t\t\t\tfurthestAngles.t = angleRadians;\n\t\t\t}\n\n\t\t\tif (vLimits.end > furthestLimits.b) {\n\t\t\t\tfurthestLimits.b = vLimits.end;\n\t\t\t\tfurthestAngles.b = angleRadians;\n\t\t\t}\n\t\t}\n\n\t\tscale.setReductions(largestPossibleRadius, furthestLimits, furthestAngles);\n\t}\n\n\t/**\n\t * Helper function to fit a radial linear scale with no point labels\n\t */\n\tfunction fit(scale) {\n\t\tvar largestPossibleRadius = Math.min(scale.height / 2, scale.width / 2);\n\t\tscale.drawingArea = Math.round(largestPossibleRadius);\n\t\tscale.setCenterPoint(0, 0, 0, 0);\n\t}\n\n\tfunction getTextAlignForAngle(angle) {\n\t\tif (angle === 0 || angle === 180) {\n\t\t\treturn 'center';\n\t\t} else if (angle < 180) {\n\t\t\treturn 'left';\n\t\t}\n\n\t\treturn 'right';\n\t}\n\n\tfunction fillText(ctx, text, position, fontSize) {\n\t\tif (helpers.isArray(text)) {\n\t\t\tvar y = position.y;\n\t\t\tvar spacing = 1.5 * fontSize;\n\n\t\t\tfor (var i = 0; i < text.length; ++i) {\n\t\t\t\tctx.fillText(text[i], position.x, y);\n\t\t\t\ty+= spacing;\n\t\t\t}\n\t\t} else {\n\t\t\tctx.fillText(text, position.x, position.y);\n\t\t}\n\t}\n\n\tfunction adjustPointPositionForLabelHeight(angle, textSize, position) {\n\t\tif (angle === 90 || angle === 270) {\n\t\t\tposition.y -= (textSize.h / 2);\n\t\t} else if (angle > 270 || angle < 90) {\n\t\t\tposition.y -= textSize.h;\n\t\t}\n\t}\n\n\tfunction drawPointLabels(scale) {\n\t\tvar ctx = scale.ctx;\n\t\tvar getValueOrDefault = helpers.getValueOrDefault;\n\t\tvar opts = scale.options;\n\t\tvar angleLineOpts = opts.angleLines;\n\t\tvar pointLabelOpts = opts.pointLabels;\n\n\t\tctx.lineWidth = angleLineOpts.lineWidth;\n\t\tctx.strokeStyle = angleLineOpts.color;\n\n\t\tvar outerDistance = scale.getDistanceFromCenterForValue(opts.reverse ? scale.min : scale.max);\n\n\t\t// Point Label Font\n\t\tvar plFont = getPointLabelFontOptions(scale);\n\n\t\tctx.textBaseline = 'top';\n\n\t\tfor (var i = getValueCount(scale) - 1; i >= 0; i--) {\n\t\t\tif (angleLineOpts.display) {\n\t\t\t\tvar outerPosition = scale.getPointPosition(i, outerDistance);\n\t\t\t\tctx.beginPath();\n\t\t\t\tctx.moveTo(scale.xCenter, scale.yCenter);\n\t\t\t\tctx.lineTo(outerPosition.x, outerPosition.y);\n\t\t\t\tctx.stroke();\n\t\t\t\tctx.closePath();\n\t\t\t}\n\n\t\t\tif (pointLabelOpts.display) {\n\t\t\t\t// Extra 3px out for some label spacing\n\t\t\t\tvar pointLabelPosition = scale.getPointPosition(i, outerDistance + 5);\n\n\t\t\t\t// Keep this in loop since we may support array properties here\n\t\t\t\tvar pointLabelFontColor = getValueOrDefault(pointLabelOpts.fontColor, globalDefaults.defaultFontColor);\n\t\t\t\tctx.font = plFont.font;\n\t\t\t\tctx.fillStyle = pointLabelFontColor;\n\n\t\t\t\tvar angleRadians = scale.getIndexAngle(i);\n\t\t\t\tvar angle = helpers.toDegrees(angleRadians);\n\t\t\t\tctx.textAlign = getTextAlignForAngle(angle);\n\t\t\t\tadjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition);\n\t\t\t\tfillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.size);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction drawRadiusLine(scale, gridLineOpts, radius, index) {\n\t\tvar ctx = scale.ctx;\n\t\tctx.strokeStyle = helpers.getValueAtIndexOrDefault(gridLineOpts.color, index - 1);\n\t\tctx.lineWidth = helpers.getValueAtIndexOrDefault(gridLineOpts.lineWidth, index - 1);\n\n\t\tif (scale.options.gridLines.circular) {\n\t\t\t// Draw circular arcs between the points\n\t\t\tctx.beginPath();\n\t\t\tctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2);\n\t\t\tctx.closePath();\n\t\t\tctx.stroke();\n\t\t} else {\n\t\t\t// Draw straight lines connecting each index\n\t\t\tvar valueCount = getValueCount(scale);\n\n\t\t\tif (valueCount === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tctx.beginPath();\n\t\t\tvar pointPosition = scale.getPointPosition(0, radius);\n\t\t\tctx.moveTo(pointPosition.x, pointPosition.y);\n\n\t\t\tfor (var i = 1; i < valueCount; i++) {\n\t\t\t\tpointPosition = scale.getPointPosition(i, radius);\n\t\t\t\tctx.lineTo(pointPosition.x, pointPosition.y);\n\t\t\t}\n\n\t\t\tctx.closePath();\n\t\t\tctx.stroke();\n\t\t}\n\t}\n\n\tfunction numberOrZero(param) {\n\t\treturn helpers.isNumber(param) ? param : 0;\n\t}\n\n\tvar LinearRadialScale = Chart.LinearScaleBase.extend({\n\t\tsetDimensions: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar tickOpts = opts.ticks;\n\t\t\t// Set the unconstrained dimension before label rotation\n\t\t\tme.width = me.maxWidth;\n\t\t\tme.height = me.maxHeight;\n\t\t\tme.xCenter = Math.round(me.width / 2);\n\t\t\tme.yCenter = Math.round(me.height / 2);\n\n\t\t\tvar minSize = helpers.min([me.height, me.width]);\n\t\t\tvar tickFontSize = helpers.getValueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n\t\t\tme.drawingArea = opts.display ? (minSize / 2) - (tickFontSize / 2 + tickOpts.backdropPaddingY) : (minSize / 2);\n\t\t},\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tvar chart = me.chart;\n\t\t\tvar min = Number.POSITIVE_INFINITY;\n\t\t\tvar max = Number.NEGATIVE_INFINITY;\n\n\t\t\thelpers.each(chart.data.datasets, function(dataset, datasetIndex) {\n\t\t\t\tif (chart.isDatasetVisible(datasetIndex)) {\n\t\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\n\n\t\t\t\t\thelpers.each(dataset.data, function(rawValue, index) {\n\t\t\t\t\t\tvar value = +me.getRightValue(rawValue);\n\t\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmin = Math.min(value, min);\n\t\t\t\t\t\tmax = Math.max(value, max);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tme.min = (min === Number.POSITIVE_INFINITY ? 0 : min);\n\t\t\tme.max = (max === Number.NEGATIVE_INFINITY ? 0 : max);\n\n\t\t\t// Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\n\t\t\tme.handleTickRangeOptions();\n\t\t},\n\t\tgetTickLimit: function() {\n\t\t\tvar tickOpts = this.options.ticks;\n\t\t\tvar tickFontSize = helpers.getValueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n\t\t\treturn Math.min(tickOpts.maxTicksLimit ? tickOpts.maxTicksLimit : 11, Math.ceil(this.drawingArea / (1.5 * tickFontSize)));\n\t\t},\n\t\tconvertTicksToLabels: function() {\n\t\t\tvar me = this;\n\t\t\tChart.LinearScaleBase.prototype.convertTicksToLabels.call(me);\n\n\t\t\t// Point labels\n\t\t\tme.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me);\n\t\t},\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\treturn +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\n\t\t},\n\t\tfit: function() {\n\t\t\tif (this.options.pointLabels.display) {\n\t\t\t\tfitWithPointLabels(this);\n\t\t\t} else {\n\t\t\t\tfit(this);\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * Set radius reductions and determine new radius and center point\n\t\t * @private\n\t\t */\n\t\tsetReductions: function(largestPossibleRadius, furthestLimits, furthestAngles) {\n\t\t\tvar me = this;\n\t\t\tvar radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l);\n\t\t\tvar radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r);\n\t\t\tvar radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t);\n\t\t\tvar radiusReductionBottom = -Math.max(furthestLimits.b - me.height, 0) / Math.cos(furthestAngles.b);\n\n\t\t\tradiusReductionLeft = numberOrZero(radiusReductionLeft);\n\t\t\tradiusReductionRight = numberOrZero(radiusReductionRight);\n\t\t\tradiusReductionTop = numberOrZero(radiusReductionTop);\n\t\t\tradiusReductionBottom = numberOrZero(radiusReductionBottom);\n\n\t\t\tme.drawingArea = Math.min(\n\t\t\t\tMath.round(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2),\n\t\t\t\tMath.round(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2));\n\t\t\tme.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom);\n\t\t},\n\t\tsetCenterPoint: function(leftMovement, rightMovement, topMovement, bottomMovement) {\n\t\t\tvar me = this;\n\t\t\tvar maxRight = me.width - rightMovement - me.drawingArea,\n\t\t\t\tmaxLeft = leftMovement + me.drawingArea,\n\t\t\t\tmaxTop = topMovement + me.drawingArea,\n\t\t\t\tmaxBottom = me.height - bottomMovement - me.drawingArea;\n\n\t\t\tme.xCenter = Math.round(((maxLeft + maxRight) / 2) + me.left);\n\t\t\tme.yCenter = Math.round(((maxTop + maxBottom) / 2) + me.top);\n\t\t},\n\n\t\tgetIndexAngle: function(index) {\n\t\t\tvar angleMultiplier = (Math.PI * 2) / getValueCount(this);\n\t\t\tvar startAngle = this.chart.options && this.chart.options.startAngle ?\n\t\t\t\tthis.chart.options.startAngle :\n\t\t\t\t0;\n\n\t\t\tvar startAngleRadians = startAngle * Math.PI * 2 / 360;\n\n\t\t\t// Start from the top instead of right, so remove a quarter of the circle\n\t\t\treturn index * angleMultiplier + startAngleRadians;\n\t\t},\n\t\tgetDistanceFromCenterForValue: function(value) {\n\t\t\tvar me = this;\n\n\t\t\tif (value === null) {\n\t\t\t\treturn 0; // null always in center\n\t\t\t}\n\n\t\t\t// Take into account half font size + the yPadding of the top value\n\t\t\tvar scalingFactor = me.drawingArea / (me.max - me.min);\n\t\t\tif (me.options.reverse) {\n\t\t\t\treturn (me.max - value) * scalingFactor;\n\t\t\t}\n\t\t\treturn (value - me.min) * scalingFactor;\n\t\t},\n\t\tgetPointPosition: function(index, distanceFromCenter) {\n\t\t\tvar me = this;\n\t\t\tvar thisAngle = me.getIndexAngle(index) - (Math.PI / 2);\n\t\t\treturn {\n\t\t\t\tx: Math.round(Math.cos(thisAngle) * distanceFromCenter) + me.xCenter,\n\t\t\t\ty: Math.round(Math.sin(thisAngle) * distanceFromCenter) + me.yCenter\n\t\t\t};\n\t\t},\n\t\tgetPointPositionForValue: function(index, value) {\n\t\t\treturn this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n\t\t},\n\n\t\tgetBasePosition: function() {\n\t\t\tvar me = this;\n\t\t\tvar min = me.min;\n\t\t\tvar max = me.max;\n\n\t\t\treturn me.getPointPositionForValue(0,\n\t\t\t\tme.beginAtZero? 0:\n\t\t\t\tmin < 0 && max < 0? max :\n\t\t\t\tmin > 0 && max > 0? min :\n\t\t\t\t0);\n\t\t},\n\n\t\tdraw: function() {\n\t\t\tvar me = this;\n\t\t\tvar opts = me.options;\n\t\t\tvar gridLineOpts = opts.gridLines;\n\t\t\tvar tickOpts = opts.ticks;\n\t\t\tvar getValueOrDefault = helpers.getValueOrDefault;\n\n\t\t\tif (opts.display) {\n\t\t\t\tvar ctx = me.ctx;\n\n\t\t\t\t// Tick Font\n\t\t\t\tvar tickFontSize = getValueOrDefault(tickOpts.fontSize, globalDefaults.defaultFontSize);\n\t\t\t\tvar tickFontStyle = getValueOrDefault(tickOpts.fontStyle, globalDefaults.defaultFontStyle);\n\t\t\t\tvar tickFontFamily = getValueOrDefault(tickOpts.fontFamily, globalDefaults.defaultFontFamily);\n\t\t\t\tvar tickLabelFont = helpers.fontString(tickFontSize, tickFontStyle, tickFontFamily);\n\n\t\t\t\thelpers.each(me.ticks, function(label, index) {\n\t\t\t\t\t// Don't draw a centre value (if it is minimum)\n\t\t\t\t\tif (index > 0 || opts.reverse) {\n\t\t\t\t\t\tvar yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);\n\t\t\t\t\t\tvar yHeight = me.yCenter - yCenterOffset;\n\n\t\t\t\t\t\t// Draw circular lines around the scale\n\t\t\t\t\t\tif (gridLineOpts.display && index !== 0) {\n\t\t\t\t\t\t\tdrawRadiusLine(me, gridLineOpts, yCenterOffset, index);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (tickOpts.display) {\n\t\t\t\t\t\t\tvar tickFontColor = getValueOrDefault(tickOpts.fontColor, globalDefaults.defaultFontColor);\n\t\t\t\t\t\t\tctx.font = tickLabelFont;\n\n\t\t\t\t\t\t\tif (tickOpts.showLabelBackdrop) {\n\t\t\t\t\t\t\t\tvar labelWidth = ctx.measureText(label).width;\n\t\t\t\t\t\t\t\tctx.fillStyle = tickOpts.backdropColor;\n\t\t\t\t\t\t\t\tctx.fillRect(\n\t\t\t\t\t\t\t\t\tme.xCenter - labelWidth / 2 - tickOpts.backdropPaddingX,\n\t\t\t\t\t\t\t\t\tyHeight - tickFontSize / 2 - tickOpts.backdropPaddingY,\n\t\t\t\t\t\t\t\t\tlabelWidth + tickOpts.backdropPaddingX * 2,\n\t\t\t\t\t\t\t\t\ttickFontSize + tickOpts.backdropPaddingY * 2\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tctx.textAlign = 'center';\n\t\t\t\t\t\t\tctx.textBaseline = 'middle';\n\t\t\t\t\t\t\tctx.fillStyle = tickFontColor;\n\t\t\t\t\t\t\tctx.fillText(label, me.xCenter, yHeight);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif (opts.angleLines.display || opts.pointLabels.display) {\n\t\t\t\t\tdrawPointLabels(me);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\tChart.scaleService.registerScaleType('radialLinear', LinearRadialScale, defaultConfig);\n\n};\n",
    "/* global window: false */\n'use strict';\n\nvar moment = require('moment');\nmoment = typeof(moment) === 'function' ? moment : window.moment;\n\nmodule.exports = function(Chart) {\n\n\tvar helpers = Chart.helpers;\n\tvar interval = {\n\t\tmillisecond: {\n\t\t\tsize: 1,\n\t\t\tsteps: [1, 2, 5, 10, 20, 50, 100, 250, 500]\n\t\t},\n\t\tsecond: {\n\t\t\tsize: 1000,\n\t\t\tsteps: [1, 2, 5, 10, 30]\n\t\t},\n\t\tminute: {\n\t\t\tsize: 60000,\n\t\t\tsteps: [1, 2, 5, 10, 30]\n\t\t},\n\t\thour: {\n\t\t\tsize: 3600000,\n\t\t\tsteps: [1, 2, 3, 6, 12]\n\t\t},\n\t\tday: {\n\t\t\tsize: 86400000,\n\t\t\tsteps: [1, 2, 5]\n\t\t},\n\t\tweek: {\n\t\t\tsize: 604800000,\n\t\t\tmaxStep: 4\n\t\t},\n\t\tmonth: {\n\t\t\tsize: 2.628e9,\n\t\t\tmaxStep: 3\n\t\t},\n\t\tquarter: {\n\t\t\tsize: 7.884e9,\n\t\t\tmaxStep: 4\n\t\t},\n\t\tyear: {\n\t\t\tsize: 3.154e10,\n\t\t\tmaxStep: false\n\t\t}\n\t};\n\n\tvar defaultConfig = {\n\t\tposition: 'bottom',\n\n\t\ttime: {\n\t\t\tparser: false, // false == a pattern string from http://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment\n\t\t\tformat: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from http://momentjs.com/docs/#/parsing/string-format/\n\t\t\tunit: false, // false == automatic or override with week, month, year, etc.\n\t\t\tround: false, // none, or override with week, month, year, etc.\n\t\t\tdisplayFormat: false, // DEPRECATED\n\t\t\tisoWeekday: false, // override week start day - see http://momentjs.com/docs/#/get-set/iso-weekday/\n\t\t\tminUnit: 'millisecond',\n\n\t\t\t// defaults to unit's corresponding unitFormat below or override using pattern string from http://momentjs.com/docs/#/displaying/format/\n\t\t\tdisplayFormats: {\n\t\t\t\tmillisecond: 'h:mm:ss.SSS a', // 11:20:01.123 AM,\n\t\t\t\tsecond: 'h:mm:ss a', // 11:20:01 AM\n\t\t\t\tminute: 'h:mm:ss a', // 11:20:01 AM\n\t\t\t\thour: 'MMM D, hA', // Sept 4, 5PM\n\t\t\t\tday: 'll', // Sep 4 2015\n\t\t\t\tweek: 'll', // Week 46, or maybe \"[W]WW - YYYY\" ?\n\t\t\t\tmonth: 'MMM YYYY', // Sept 2015\n\t\t\t\tquarter: '[Q]Q - YYYY', // Q3\n\t\t\t\tyear: 'YYYY' // 2015\n\t\t\t},\n\t\t},\n\t\tticks: {\n\t\t\tautoSkip: false\n\t\t}\n\t};\n\n\t/**\n\t * Helper function to parse time to a moment object\n\t * @param axis {TimeAxis} the time axis\n\t * @param label {Date|string|number|Moment} The thing to parse\n\t * @return {Moment} parsed time\n\t */\n\tfunction parseTime(axis, label) {\n\t\tvar timeOpts = axis.options.time;\n\t\tif (typeof timeOpts.parser === 'string') {\n\t\t\treturn moment(label, timeOpts.parser);\n\t\t}\n\t\tif (typeof timeOpts.parser === 'function') {\n\t\t\treturn timeOpts.parser(label);\n\t\t}\n\t\tif (typeof label.getMonth === 'function' || typeof label === 'number') {\n\t\t\t// Date objects\n\t\t\treturn moment(label);\n\t\t}\n\t\tif (label.isValid && label.isValid()) {\n\t\t\t// Moment support\n\t\t\treturn label;\n\t\t}\n\t\tvar format = timeOpts.format;\n\t\tif (typeof format !== 'string' && format.call) {\n\t\t\t// Custom parsing (return an instance of moment)\n\t\t\tconsole.warn('options.time.format is deprecated and replaced by options.time.parser.');\n\t\t\treturn format(label);\n\t\t}\n\t\t// Moment format parsing\n\t\treturn moment(label, format);\n\t}\n\n\t/**\n\t * Figure out which is the best unit for the scale\n\t * @param minUnit {String} minimum unit to use\n\t * @param min {Number} scale minimum\n\t * @param max {Number} scale maximum\n\t * @return {String} the unit to use\n\t */\n\tfunction determineUnit(minUnit, min, max, maxTicks) {\n\t\tvar units = Object.keys(interval);\n\t\tvar unit;\n\t\tvar numUnits = units.length;\n\n\t\tfor (var i = units.indexOf(minUnit); i < numUnits; i++) {\n\t\t\tunit = units[i];\n\t\t\tvar unitDetails = interval[unit];\n\t\t\tvar steps = (unitDetails.steps && unitDetails.steps[unitDetails.steps.length - 1]) || unitDetails.maxStep;\n\t\t\tif (steps === undefined || Math.ceil((max - min) / (steps * unitDetails.size)) <= maxTicks) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn unit;\n\t}\n\n\t/**\n\t * Determines how we scale the unit\n\t * @param min {Number} the scale minimum\n\t * @param max {Number} the scale maximum\n\t * @param unit {String} the unit determined by the {@see determineUnit} method\n\t * @return {Number} the axis step size as a multiple of unit\n\t */\n\tfunction determineStepSize(min, max, unit, maxTicks) {\n\t\t// Using our unit, figoure out what we need to scale as\n\t\tvar unitDefinition = interval[unit];\n\t\tvar unitSizeInMilliSeconds = unitDefinition.size;\n\t\tvar sizeInUnits = Math.ceil((max - min) / unitSizeInMilliSeconds);\n\t\tvar multiplier = 1;\n\t\tvar range = max - min;\n\n\t\tif (unitDefinition.steps) {\n\t\t\t// Have an array of steps\n\t\t\tvar numSteps = unitDefinition.steps.length;\n\t\t\tfor (var i = 0; i < numSteps && sizeInUnits > maxTicks; i++) {\n\t\t\t\tmultiplier = unitDefinition.steps[i];\n\t\t\t\tsizeInUnits = Math.ceil(range / (unitSizeInMilliSeconds * multiplier));\n\t\t\t}\n\t\t} else {\n\t\t\twhile (sizeInUnits > maxTicks && maxTicks > 0) {\n\t\t\t\t++multiplier;\n\t\t\t\tsizeInUnits = Math.ceil(range / (unitSizeInMilliSeconds * multiplier));\n\t\t\t}\n\t\t}\n\n\t\treturn multiplier;\n\t}\n\n\t/**\n\t * Helper for generating axis labels.\n\t * @param options {ITimeGeneratorOptions} the options for generation\n\t * @param dataRange {IRange} the data range\n\t * @param niceRange {IRange} the pretty range to display\n\t * @return {Number[]} ticks\n\t */\n\tfunction generateTicks(options, dataRange, niceRange) {\n\t\tvar ticks = [];\n\t\tif (options.maxTicks) {\n\t\t\tvar stepSize = options.stepSize;\n\t\t\tticks.push(options.min !== undefined ? options.min : niceRange.min);\n\t\t\tvar cur = moment(niceRange.min);\n\t\t\twhile (cur.add(stepSize, options.unit).valueOf() < niceRange.max) {\n\t\t\t\tticks.push(cur.valueOf());\n\t\t\t}\n\t\t\tvar realMax = options.max || niceRange.max;\n\t\t\tif (ticks[ticks.length - 1] !== realMax) {\n\t\t\t\tticks.push(realMax);\n\t\t\t}\n\t\t}\n\t\treturn ticks;\n\t}\n\n\t/**\n\t * @function Chart.Ticks.generators.time\n\t * @param options {ITimeGeneratorOptions} the options for generation\n\t * @param dataRange {IRange} the data range\n\t * @return {Number[]} ticks\n\t */\n\tChart.Ticks.generators.time = function(options, dataRange) {\n\t\tvar niceMin;\n\t\tvar niceMax;\n\t\tvar isoWeekday = options.isoWeekday;\n\t\tif (options.unit === 'week' && isoWeekday !== false) {\n\t\t\tniceMin = moment(dataRange.min).startOf('isoWeek').isoWeekday(isoWeekday).valueOf();\n\t\t\tniceMax = moment(dataRange.max).startOf('isoWeek').isoWeekday(isoWeekday);\n\t\t\tif (dataRange.max - niceMax > 0) {\n\t\t\t\tniceMax.add(1, 'week');\n\t\t\t}\n\t\t\tniceMax = niceMax.valueOf();\n\t\t} else {\n\t\t\tniceMin = moment(dataRange.min).startOf(options.unit).valueOf();\n\t\t\tniceMax = moment(dataRange.max).startOf(options.unit);\n\t\t\tif (dataRange.max - niceMax > 0) {\n\t\t\t\tniceMax.add(1, options.unit);\n\t\t\t}\n\t\t\tniceMax = niceMax.valueOf();\n\t\t}\n\t\treturn generateTicks(options, dataRange, {\n\t\t\tmin: niceMin,\n\t\t\tmax: niceMax\n\t\t});\n\t};\n\n\tvar TimeScale = Chart.Scale.extend({\n\t\tinitialize: function() {\n\t\t\tif (!moment) {\n\t\t\t\tthrow new Error('Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com');\n\t\t\t}\n\n\t\t\tChart.Scale.prototype.initialize.call(this);\n\t\t},\n\t\tdetermineDataLimits: function() {\n\t\t\tvar me = this;\n\t\t\tvar timeOpts = me.options.time;\n\n\t\t\t// We store the data range as unix millisecond timestamps so dataMin and dataMax will always be integers.\n\t\t\tvar dataMin = Number.MAX_SAFE_INTEGER;\n\t\t\tvar dataMax = Number.MIN_SAFE_INTEGER;\n\n\t\t\tvar chartData = me.chart.data;\n\t\t\tvar parsedData = {\n\t\t\t\tlabels: [],\n\t\t\t\tdatasets: []\n\t\t\t};\n\n\t\t\tvar timestamp;\n\n\t\t\thelpers.each(chartData.labels, function(label, labelIndex) {\n\t\t\t\tvar labelMoment = parseTime(me, label);\n\n\t\t\t\tif (labelMoment.isValid()) {\n\t\t\t\t\t// We need to round the time\n\t\t\t\t\tif (timeOpts.round) {\n\t\t\t\t\t\tlabelMoment.startOf(timeOpts.round);\n\t\t\t\t\t}\n\n\t\t\t\t\ttimestamp = labelMoment.valueOf();\n\t\t\t\t\tdataMin = Math.min(timestamp, dataMin);\n\t\t\t\t\tdataMax = Math.max(timestamp, dataMax);\n\n\t\t\t\t\t// Store this value for later\n\t\t\t\t\tparsedData.labels[labelIndex] = timestamp;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\thelpers.each(chartData.datasets, function(dataset, datasetIndex) {\n\t\t\t\tvar timestamps = [];\n\n\t\t\t\tif (typeof dataset.data[0] === 'object' && dataset.data[0] !== null && me.chart.isDatasetVisible(datasetIndex)) {\n\t\t\t\t\t// We have potential point data, so we need to parse this\n\t\t\t\t\thelpers.each(dataset.data, function(value, dataIndex) {\n\t\t\t\t\t\tvar dataMoment = parseTime(me, me.getRightValue(value));\n\n\t\t\t\t\t\tif (dataMoment.isValid()) {\n\t\t\t\t\t\t\tif (timeOpts.round) {\n\t\t\t\t\t\t\t\tdataMoment.startOf(timeOpts.round);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\ttimestamp = dataMoment.valueOf();\n\t\t\t\t\t\t\tdataMin = Math.min(timestamp, dataMin);\n\t\t\t\t\t\t\tdataMax = Math.max(timestamp, dataMax);\n\t\t\t\t\t\t\ttimestamps[dataIndex] = timestamp;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// We have no x coordinates, so use the ones from the labels\n\t\t\t\t\ttimestamps = parsedData.labels.slice();\n\t\t\t\t}\n\n\t\t\t\tparsedData.datasets[datasetIndex] = timestamps;\n\t\t\t});\n\n\t\t\tme.dataMin = dataMin;\n\t\t\tme.dataMax = dataMax;\n\t\t\tme._parsedData = parsedData;\n\t\t},\n\t\tbuildTicks: function() {\n\t\t\tvar me = this;\n\t\t\tvar timeOpts = me.options.time;\n\n\t\t\tvar minTimestamp;\n\t\t\tvar maxTimestamp;\n\t\t\tvar dataMin = me.dataMin;\n\t\t\tvar dataMax = me.dataMax;\n\n\t\t\tif (timeOpts.min) {\n\t\t\t\tvar minMoment = parseTime(me, timeOpts.min);\n\t\t\t\tif (timeOpts.round) {\n\t\t\t\t\tminMoment.round(timeOpts.round);\n\t\t\t\t}\n\t\t\t\tminTimestamp = minMoment.valueOf();\n\t\t\t}\n\n\t\t\tif (timeOpts.max) {\n\t\t\t\tmaxTimestamp = parseTime(me, timeOpts.max).valueOf();\n\t\t\t}\n\n\t\t\tvar maxTicks = me.getLabelCapacity(minTimestamp || dataMin);\n\t\t\tvar unit = timeOpts.unit || determineUnit(timeOpts.minUnit, minTimestamp || dataMin, maxTimestamp || dataMax, maxTicks);\n\t\t\tme.displayFormat = timeOpts.displayFormats[unit];\n\n\t\t\tvar stepSize = timeOpts.stepSize || determineStepSize(minTimestamp || dataMin, maxTimestamp || dataMax, unit, maxTicks);\n\t\t\tme.ticks = Chart.Ticks.generators.time({\n\t\t\t\tmaxTicks: maxTicks,\n\t\t\t\tmin: minTimestamp,\n\t\t\t\tmax: maxTimestamp,\n\t\t\t\tstepSize: stepSize,\n\t\t\t\tunit: unit,\n\t\t\t\tisoWeekday: timeOpts.isoWeekday\n\t\t\t}, {\n\t\t\t\tmin: dataMin,\n\t\t\t\tmax: dataMax\n\t\t\t});\n\n\t\t\t// At this point, we need to update our max and min given the tick values since we have expanded the\n\t\t\t// range of the scale\n\t\t\tme.max = helpers.max(me.ticks);\n\t\t\tme.min = helpers.min(me.ticks);\n\t\t},\n\t\t// Get tooltip label\n\t\tgetLabelForIndex: function(index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar label = me.chart.data.labels && index < me.chart.data.labels.length ? me.chart.data.labels[index] : '';\n\t\t\tvar value = me.chart.data.datasets[datasetIndex].data[index];\n\n\t\t\tif (value !== null && typeof value === 'object') {\n\t\t\t\tlabel = me.getRightValue(value);\n\t\t\t}\n\n\t\t\t// Format nicely\n\t\t\tif (me.options.time.tooltipFormat) {\n\t\t\t\tlabel = parseTime(me, label).format(me.options.time.tooltipFormat);\n\t\t\t}\n\n\t\t\treturn label;\n\t\t},\n\t\t// Function to format an individual tick mark\n\t\ttickFormatFunction: function(tick, index, ticks) {\n\t\t\tvar formattedTick = tick.format(this.displayFormat);\n\t\t\tvar tickOpts = this.options.ticks;\n\t\t\tvar callback = helpers.getValueOrDefault(tickOpts.callback, tickOpts.userCallback);\n\n\t\t\tif (callback) {\n\t\t\t\treturn callback(formattedTick, index, ticks);\n\t\t\t}\n\t\t\treturn formattedTick;\n\t\t},\n\t\tconvertTicksToLabels: function() {\n\t\t\tvar me = this;\n\t\t\tme.ticksAsTimestamps = me.ticks;\n\t\t\tme.ticks = me.ticks.map(function(tick) {\n\t\t\t\treturn moment(tick);\n\t\t\t}).map(me.tickFormatFunction, me);\n\t\t},\n\t\tgetPixelForOffset: function(offset) {\n\t\t\tvar me = this;\n\t\t\tvar epochWidth = me.max - me.min;\n\t\t\tvar decimal = epochWidth ? (offset - me.min) / epochWidth : 0;\n\n\t\t\tif (me.isHorizontal()) {\n\t\t\t\tvar valueOffset = (me.width * decimal);\n\t\t\t\treturn me.left + Math.round(valueOffset);\n\t\t\t}\n\n\t\t\tvar heightOffset = (me.height * decimal);\n\t\t\treturn me.top + Math.round(heightOffset);\n\t\t},\n\t\tgetPixelForValue: function(value, index, datasetIndex) {\n\t\t\tvar me = this;\n\t\t\tvar offset = null;\n\t\t\tif (index !== undefined && datasetIndex !== undefined) {\n\t\t\t\toffset = me._parsedData.datasets[datasetIndex][index];\n\t\t\t}\n\n\t\t\tif (offset === null) {\n\t\t\t\tif (!value || !value.isValid) {\n\t\t\t\t\t// not already a moment object\n\t\t\t\t\tvalue = parseTime(me, me.getRightValue(value));\n\t\t\t\t}\n\n\t\t\t\tif (value && value.isValid && value.isValid()) {\n\t\t\t\t\toffset = value.valueOf();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (offset !== null) {\n\t\t\t\treturn me.getPixelForOffset(offset);\n\t\t\t}\n\t\t},\n\t\tgetPixelForTick: function(index) {\n\t\t\treturn this.getPixelForOffset(this.ticksAsTimestamps[index]);\n\t\t},\n\t\tgetValueForPixel: function(pixel) {\n\t\t\tvar me = this;\n\t\t\tvar innerDimension = me.isHorizontal() ? me.width : me.height;\n\t\t\tvar offset = (pixel - (me.isHorizontal() ? me.left : me.top)) / innerDimension;\n\t\t\treturn moment(me.min + (offset * (me.max - me.min)));\n\t\t},\n\t\t// Crude approximation of what the label width might be\n\t\tgetLabelWidth: function(label) {\n\t\t\tvar me = this;\n\t\t\tvar ticks = me.options.ticks;\n\n\t\t\tvar tickLabelWidth = me.ctx.measureText(label).width;\n\t\t\tvar cosRotation = Math.cos(helpers.toRadians(ticks.maxRotation));\n\t\t\tvar sinRotation = Math.sin(helpers.toRadians(ticks.maxRotation));\n\t\t\tvar tickFontSize = helpers.getValueOrDefault(ticks.fontSize, Chart.defaults.global.defaultFontSize);\n\t\t\treturn (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation);\n\t\t},\n\t\tgetLabelCapacity: function(exampleTime) {\n\t\t\tvar me = this;\n\n\t\t\tme.displayFormat = me.options.time.displayFormats.millisecond;\t// Pick the longest format for guestimation\n\t\t\tvar exampleLabel = me.tickFormatFunction(moment(exampleTime), 0, []);\n\t\t\tvar tickLabelWidth = me.getLabelWidth(exampleLabel);\n\n\t\t\tvar innerWidth = me.isHorizontal() ? me.width : me.height;\n\t\t\tvar labelCapacity = innerWidth / tickLabelWidth;\n\t\t\treturn labelCapacity;\n\t\t}\n\t});\n\tChart.scaleService.registerScaleType('time', TimeScale, defaultConfig);\n\n};\n",
    "/* MIT license */\nvar colorNames = require('color-name');\n\nmodule.exports = {\n   getRgba: getRgba,\n   getHsla: getHsla,\n   getRgb: getRgb,\n   getHsl: getHsl,\n   getHwb: getHwb,\n   getAlpha: getAlpha,\n\n   hexString: hexString,\n   rgbString: rgbString,\n   rgbaString: rgbaString,\n   percentString: percentString,\n   percentaString: percentaString,\n   hslString: hslString,\n   hslaString: hslaString,\n   hwbString: hwbString,\n   keyword: keyword\n}\n\nfunction getRgba(string) {\n   if (!string) {\n      return;\n   }\n   var abbr =  /^#([a-fA-F0-9]{3,4})$/i,\n       hex =  /^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i,\n       rgba = /^rgba?\\(\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/i,\n       per = /^rgba?\\(\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/i,\n       keyword = /(\\w+)/;\n\n   var rgb = [0, 0, 0],\n       a = 1,\n       match = string.match(abbr),\n       hexAlpha = \"\";\n   if (match) {\n      match = match[1];\n      hexAlpha = match[3];\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = parseInt(match[i] + match[i], 16);\n      }\n      if (hexAlpha) {\n         a = Math.round((parseInt(hexAlpha + hexAlpha, 16) / 255) * 100) / 100;\n      }\n   }\n   else if (match = string.match(hex)) {\n      hexAlpha = match[2];\n      match = match[1];\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16);\n      }\n      if (hexAlpha) {\n         a = Math.round((parseInt(hexAlpha, 16) / 255) * 100) / 100;\n      }\n   }\n   else if (match = string.match(rgba)) {\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = parseInt(match[i + 1]);\n      }\n      a = parseFloat(match[4]);\n   }\n   else if (match = string.match(per)) {\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);\n      }\n      a = parseFloat(match[4]);\n   }\n   else if (match = string.match(keyword)) {\n      if (match[1] == \"transparent\") {\n         return [0, 0, 0, 0];\n      }\n      rgb = colorNames[match[1]];\n      if (!rgb) {\n         return;\n      }\n   }\n\n   for (var i = 0; i < rgb.length; i++) {\n      rgb[i] = scale(rgb[i], 0, 255);\n   }\n   if (!a && a != 0) {\n      a = 1;\n   }\n   else {\n      a = scale(a, 0, 1);\n   }\n   rgb[3] = a;\n   return rgb;\n}\n\nfunction getHsla(string) {\n   if (!string) {\n      return;\n   }\n   var hsl = /^hsla?\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/;\n   var match = string.match(hsl);\n   if (match) {\n      var alpha = parseFloat(match[4]);\n      var h = scale(parseInt(match[1]), 0, 360),\n          s = scale(parseFloat(match[2]), 0, 100),\n          l = scale(parseFloat(match[3]), 0, 100),\n          a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);\n      return [h, s, l, a];\n   }\n}\n\nfunction getHwb(string) {\n   if (!string) {\n      return;\n   }\n   var hwb = /^hwb\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/;\n   var match = string.match(hwb);\n   if (match) {\n    var alpha = parseFloat(match[4]);\n      var h = scale(parseInt(match[1]), 0, 360),\n          w = scale(parseFloat(match[2]), 0, 100),\n          b = scale(parseFloat(match[3]), 0, 100),\n          a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);\n      return [h, w, b, a];\n   }\n}\n\nfunction getRgb(string) {\n   var rgba = getRgba(string);\n   return rgba && rgba.slice(0, 3);\n}\n\nfunction getHsl(string) {\n  var hsla = getHsla(string);\n  return hsla && hsla.slice(0, 3);\n}\n\nfunction getAlpha(string) {\n   var vals = getRgba(string);\n   if (vals) {\n      return vals[3];\n   }\n   else if (vals = getHsla(string)) {\n      return vals[3];\n   }\n   else if (vals = getHwb(string)) {\n      return vals[3];\n   }\n}\n\n// generators\nfunction hexString(rgba, a) {\n   var a = (a !== undefined && rgba.length === 3) ? a : rgba[3];\n   return \"#\" + hexDouble(rgba[0]) \n              + hexDouble(rgba[1])\n              + hexDouble(rgba[2])\n              + (\n                 (a >= 0 && a < 1)\n                 ? hexDouble(Math.round(a * 255))\n                 : \"\"\n              );\n}\n\nfunction rgbString(rgba, alpha) {\n   if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {\n      return rgbaString(rgba, alpha);\n   }\n   return \"rgb(\" + rgba[0] + \", \" + rgba[1] + \", \" + rgba[2] + \")\";\n}\n\nfunction rgbaString(rgba, alpha) {\n   if (alpha === undefined) {\n      alpha = (rgba[3] !== undefined ? rgba[3] : 1);\n   }\n   return \"rgba(\" + rgba[0] + \", \" + rgba[1] + \", \" + rgba[2]\n           + \", \" + alpha + \")\";\n}\n\nfunction percentString(rgba, alpha) {\n   if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {\n      return percentaString(rgba, alpha);\n   }\n   var r = Math.round(rgba[0]/255 * 100),\n       g = Math.round(rgba[1]/255 * 100),\n       b = Math.round(rgba[2]/255 * 100);\n\n   return \"rgb(\" + r + \"%, \" + g + \"%, \" + b + \"%)\";\n}\n\nfunction percentaString(rgba, alpha) {\n   var r = Math.round(rgba[0]/255 * 100),\n       g = Math.round(rgba[1]/255 * 100),\n       b = Math.round(rgba[2]/255 * 100);\n   return \"rgba(\" + r + \"%, \" + g + \"%, \" + b + \"%, \" + (alpha || rgba[3] || 1) + \")\";\n}\n\nfunction hslString(hsla, alpha) {\n   if (alpha < 1 || (hsla[3] && hsla[3] < 1)) {\n      return hslaString(hsla, alpha);\n   }\n   return \"hsl(\" + hsla[0] + \", \" + hsla[1] + \"%, \" + hsla[2] + \"%)\";\n}\n\nfunction hslaString(hsla, alpha) {\n   if (alpha === undefined) {\n      alpha = (hsla[3] !== undefined ? hsla[3] : 1);\n   }\n   return \"hsla(\" + hsla[0] + \", \" + hsla[1] + \"%, \" + hsla[2] + \"%, \"\n           + alpha + \")\";\n}\n\n// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax\n// (hwb have alpha optional & 1 is default value)\nfunction hwbString(hwb, alpha) {\n   if (alpha === undefined) {\n      alpha = (hwb[3] !== undefined ? hwb[3] : 1);\n   }\n   return \"hwb(\" + hwb[0] + \", \" + hwb[1] + \"%, \" + hwb[2] + \"%\"\n           + (alpha !== undefined && alpha !== 1 ? \", \" + alpha : \"\") + \")\";\n}\n\nfunction keyword(rgb) {\n  return reverseNames[rgb.slice(0, 3)];\n}\n\n// helpers\nfunction scale(num, min, max) {\n   return Math.min(Math.max(min, num), max);\n}\n\nfunction hexDouble(num) {\n  var str = num.toString(16).toUpperCase();\n  return (str.length < 2) ? \"0\" + str : str;\n}\n\n\n//create a list of reverse color names\nvar reverseNames = {};\nfor (var name in colorNames) {\n   reverseNames[colorNames[name]] = name;\n}\n",
    "/* MIT license */\nvar convert = require('color-convert');\nvar string = require('chartjs-color-string');\n\nvar Color = function (obj) {\n\tif (obj instanceof Color) {\n\t\treturn obj;\n\t}\n\tif (!(this instanceof Color)) {\n\t\treturn new Color(obj);\n\t}\n\n\tthis.valid = false;\n\tthis.values = {\n\t\trgb: [0, 0, 0],\n\t\thsl: [0, 0, 0],\n\t\thsv: [0, 0, 0],\n\t\thwb: [0, 0, 0],\n\t\tcmyk: [0, 0, 0, 0],\n\t\talpha: 1\n\t};\n\n\t// parse Color() argument\n\tvar vals;\n\tif (typeof obj === 'string') {\n\t\tvals = string.getRgba(obj);\n\t\tif (vals) {\n\t\t\tthis.setValues('rgb', vals);\n\t\t} else if (vals = string.getHsla(obj)) {\n\t\t\tthis.setValues('hsl', vals);\n\t\t} else if (vals = string.getHwb(obj)) {\n\t\t\tthis.setValues('hwb', vals);\n\t\t}\n\t} else if (typeof obj === 'object') {\n\t\tvals = obj;\n\t\tif (vals.r !== undefined || vals.red !== undefined) {\n\t\t\tthis.setValues('rgb', vals);\n\t\t} else if (vals.l !== undefined || vals.lightness !== undefined) {\n\t\t\tthis.setValues('hsl', vals);\n\t\t} else if (vals.v !== undefined || vals.value !== undefined) {\n\t\t\tthis.setValues('hsv', vals);\n\t\t} else if (vals.w !== undefined || vals.whiteness !== undefined) {\n\t\t\tthis.setValues('hwb', vals);\n\t\t} else if (vals.c !== undefined || vals.cyan !== undefined) {\n\t\t\tthis.setValues('cmyk', vals);\n\t\t}\n\t}\n};\n\nColor.prototype = {\n\tisValid: function () {\n\t\treturn this.valid;\n\t},\n\trgb: function () {\n\t\treturn this.setSpace('rgb', arguments);\n\t},\n\thsl: function () {\n\t\treturn this.setSpace('hsl', arguments);\n\t},\n\thsv: function () {\n\t\treturn this.setSpace('hsv', arguments);\n\t},\n\thwb: function () {\n\t\treturn this.setSpace('hwb', arguments);\n\t},\n\tcmyk: function () {\n\t\treturn this.setSpace('cmyk', arguments);\n\t},\n\n\trgbArray: function () {\n\t\treturn this.values.rgb;\n\t},\n\thslArray: function () {\n\t\treturn this.values.hsl;\n\t},\n\thsvArray: function () {\n\t\treturn this.values.hsv;\n\t},\n\thwbArray: function () {\n\t\tvar values = this.values;\n\t\tif (values.alpha !== 1) {\n\t\t\treturn values.hwb.concat([values.alpha]);\n\t\t}\n\t\treturn values.hwb;\n\t},\n\tcmykArray: function () {\n\t\treturn this.values.cmyk;\n\t},\n\trgbaArray: function () {\n\t\tvar values = this.values;\n\t\treturn values.rgb.concat([values.alpha]);\n\t},\n\thslaArray: function () {\n\t\tvar values = this.values;\n\t\treturn values.hsl.concat([values.alpha]);\n\t},\n\talpha: function (val) {\n\t\tif (val === undefined) {\n\t\t\treturn this.values.alpha;\n\t\t}\n\t\tthis.setValues('alpha', val);\n\t\treturn this;\n\t},\n\n\tred: function (val) {\n\t\treturn this.setChannel('rgb', 0, val);\n\t},\n\tgreen: function (val) {\n\t\treturn this.setChannel('rgb', 1, val);\n\t},\n\tblue: function (val) {\n\t\treturn this.setChannel('rgb', 2, val);\n\t},\n\thue: function (val) {\n\t\tif (val) {\n\t\t\tval %= 360;\n\t\t\tval = val < 0 ? 360 + val : val;\n\t\t}\n\t\treturn this.setChannel('hsl', 0, val);\n\t},\n\tsaturation: function (val) {\n\t\treturn this.setChannel('hsl', 1, val);\n\t},\n\tlightness: function (val) {\n\t\treturn this.setChannel('hsl', 2, val);\n\t},\n\tsaturationv: function (val) {\n\t\treturn this.setChannel('hsv', 1, val);\n\t},\n\twhiteness: function (val) {\n\t\treturn this.setChannel('hwb', 1, val);\n\t},\n\tblackness: function (val) {\n\t\treturn this.setChannel('hwb', 2, val);\n\t},\n\tvalue: function (val) {\n\t\treturn this.setChannel('hsv', 2, val);\n\t},\n\tcyan: function (val) {\n\t\treturn this.setChannel('cmyk', 0, val);\n\t},\n\tmagenta: function (val) {\n\t\treturn this.setChannel('cmyk', 1, val);\n\t},\n\tyellow: function (val) {\n\t\treturn this.setChannel('cmyk', 2, val);\n\t},\n\tblack: function (val) {\n\t\treturn this.setChannel('cmyk', 3, val);\n\t},\n\n\thexString: function () {\n\t\treturn string.hexString(this.values.rgb);\n\t},\n\trgbString: function () {\n\t\treturn string.rgbString(this.values.rgb, this.values.alpha);\n\t},\n\trgbaString: function () {\n\t\treturn string.rgbaString(this.values.rgb, this.values.alpha);\n\t},\n\tpercentString: function () {\n\t\treturn string.percentString(this.values.rgb, this.values.alpha);\n\t},\n\thslString: function () {\n\t\treturn string.hslString(this.values.hsl, this.values.alpha);\n\t},\n\thslaString: function () {\n\t\treturn string.hslaString(this.values.hsl, this.values.alpha);\n\t},\n\thwbString: function () {\n\t\treturn string.hwbString(this.values.hwb, this.values.alpha);\n\t},\n\tkeyword: function () {\n\t\treturn string.keyword(this.values.rgb, this.values.alpha);\n\t},\n\n\trgbNumber: function () {\n\t\tvar rgb = this.values.rgb;\n\t\treturn (rgb[0] << 16) | (rgb[1] << 8) | rgb[2];\n\t},\n\n\tluminosity: function () {\n\t\t// http://www.w3.org/TR/WCAG20/#relativeluminancedef\n\t\tvar rgb = this.values.rgb;\n\t\tvar lum = [];\n\t\tfor (var i = 0; i < rgb.length; i++) {\n\t\t\tvar chan = rgb[i] / 255;\n\t\t\tlum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4);\n\t\t}\n\t\treturn 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];\n\t},\n\n\tcontrast: function (color2) {\n\t\t// http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n\t\tvar lum1 = this.luminosity();\n\t\tvar lum2 = color2.luminosity();\n\t\tif (lum1 > lum2) {\n\t\t\treturn (lum1 + 0.05) / (lum2 + 0.05);\n\t\t}\n\t\treturn (lum2 + 0.05) / (lum1 + 0.05);\n\t},\n\n\tlevel: function (color2) {\n\t\tvar contrastRatio = this.contrast(color2);\n\t\tif (contrastRatio >= 7.1) {\n\t\t\treturn 'AAA';\n\t\t}\n\n\t\treturn (contrastRatio >= 4.5) ? 'AA' : '';\n\t},\n\n\tdark: function () {\n\t\t// YIQ equation from http://24ways.org/2010/calculating-color-contrast\n\t\tvar rgb = this.values.rgb;\n\t\tvar yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;\n\t\treturn yiq < 128;\n\t},\n\n\tlight: function () {\n\t\treturn !this.dark();\n\t},\n\n\tnegate: function () {\n\t\tvar rgb = [];\n\t\tfor (var i = 0; i < 3; i++) {\n\t\t\trgb[i] = 255 - this.values.rgb[i];\n\t\t}\n\t\tthis.setValues('rgb', rgb);\n\t\treturn this;\n\t},\n\n\tlighten: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[2] += hsl[2] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\tdarken: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[2] -= hsl[2] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\tsaturate: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[1] += hsl[1] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\tdesaturate: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[1] -= hsl[1] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\twhiten: function (ratio) {\n\t\tvar hwb = this.values.hwb;\n\t\thwb[1] += hwb[1] * ratio;\n\t\tthis.setValues('hwb', hwb);\n\t\treturn this;\n\t},\n\n\tblacken: function (ratio) {\n\t\tvar hwb = this.values.hwb;\n\t\thwb[2] += hwb[2] * ratio;\n\t\tthis.setValues('hwb', hwb);\n\t\treturn this;\n\t},\n\n\tgreyscale: function () {\n\t\tvar rgb = this.values.rgb;\n\t\t// http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale\n\t\tvar val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;\n\t\tthis.setValues('rgb', [val, val, val]);\n\t\treturn this;\n\t},\n\n\tclearer: function (ratio) {\n\t\tvar alpha = this.values.alpha;\n\t\tthis.setValues('alpha', alpha - (alpha * ratio));\n\t\treturn this;\n\t},\n\n\topaquer: function (ratio) {\n\t\tvar alpha = this.values.alpha;\n\t\tthis.setValues('alpha', alpha + (alpha * ratio));\n\t\treturn this;\n\t},\n\n\trotate: function (degrees) {\n\t\tvar hsl = this.values.hsl;\n\t\tvar hue = (hsl[0] + degrees) % 360;\n\t\thsl[0] = hue < 0 ? 360 + hue : hue;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\t/**\n\t * Ported from sass implementation in C\n\t * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209\n\t */\n\tmix: function (mixinColor, weight) {\n\t\tvar color1 = this;\n\t\tvar color2 = mixinColor;\n\t\tvar p = weight === undefined ? 0.5 : weight;\n\n\t\tvar w = 2 * p - 1;\n\t\tvar a = color1.alpha() - color2.alpha();\n\n\t\tvar w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n\t\tvar w2 = 1 - w1;\n\n\t\treturn this\n\t\t\t.rgb(\n\t\t\t\tw1 * color1.red() + w2 * color2.red(),\n\t\t\t\tw1 * color1.green() + w2 * color2.green(),\n\t\t\t\tw1 * color1.blue() + w2 * color2.blue()\n\t\t\t)\n\t\t\t.alpha(color1.alpha() * p + color2.alpha() * (1 - p));\n\t},\n\n\ttoJSON: function () {\n\t\treturn this.rgb();\n\t},\n\n\tclone: function () {\n\t\t// NOTE(SB): using node-clone creates a dependency to Buffer when using browserify,\n\t\t// making the final build way to big to embed in Chart.js. So let's do it manually,\n\t\t// assuming that values to clone are 1 dimension arrays containing only numbers,\n\t\t// except 'alpha' which is a number.\n\t\tvar result = new Color();\n\t\tvar source = this.values;\n\t\tvar target = result.values;\n\t\tvar value, type;\n\n\t\tfor (var prop in source) {\n\t\t\tif (source.hasOwnProperty(prop)) {\n\t\t\t\tvalue = source[prop];\n\t\t\t\ttype = ({}).toString.call(value);\n\t\t\t\tif (type === '[object Array]') {\n\t\t\t\t\ttarget[prop] = value.slice(0);\n\t\t\t\t} else if (type === '[object Number]') {\n\t\t\t\t\ttarget[prop] = value;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error('unexpected color value:', value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n};\n\nColor.prototype.spaces = {\n\trgb: ['red', 'green', 'blue'],\n\thsl: ['hue', 'saturation', 'lightness'],\n\thsv: ['hue', 'saturation', 'value'],\n\thwb: ['hue', 'whiteness', 'blackness'],\n\tcmyk: ['cyan', 'magenta', 'yellow', 'black']\n};\n\nColor.prototype.maxes = {\n\trgb: [255, 255, 255],\n\thsl: [360, 100, 100],\n\thsv: [360, 100, 100],\n\thwb: [360, 100, 100],\n\tcmyk: [100, 100, 100, 100]\n};\n\nColor.prototype.getValues = function (space) {\n\tvar values = this.values;\n\tvar vals = {};\n\n\tfor (var i = 0; i < space.length; i++) {\n\t\tvals[space.charAt(i)] = values[space][i];\n\t}\n\n\tif (values.alpha !== 1) {\n\t\tvals.a = values.alpha;\n\t}\n\n\t// {r: 255, g: 255, b: 255, a: 0.4}\n\treturn vals;\n};\n\nColor.prototype.setValues = function (space, vals) {\n\tvar values = this.values;\n\tvar spaces = this.spaces;\n\tvar maxes = this.maxes;\n\tvar alpha = 1;\n\tvar i;\n\n\tthis.valid = true;\n\n\tif (space === 'alpha') {\n\t\talpha = vals;\n\t} else if (vals.length) {\n\t\t// [10, 10, 10]\n\t\tvalues[space] = vals.slice(0, space.length);\n\t\talpha = vals[space.length];\n\t} else if (vals[space.charAt(0)] !== undefined) {\n\t\t// {r: 10, g: 10, b: 10}\n\t\tfor (i = 0; i < space.length; i++) {\n\t\t\tvalues[space][i] = vals[space.charAt(i)];\n\t\t}\n\n\t\talpha = vals.a;\n\t} else if (vals[spaces[space][0]] !== undefined) {\n\t\t// {red: 10, green: 10, blue: 10}\n\t\tvar chans = spaces[space];\n\n\t\tfor (i = 0; i < space.length; i++) {\n\t\t\tvalues[space][i] = vals[chans[i]];\n\t\t}\n\n\t\talpha = vals.alpha;\n\t}\n\n\tvalues.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha)));\n\n\tif (space === 'alpha') {\n\t\treturn false;\n\t}\n\n\tvar capped;\n\n\t// cap values of the space prior converting all values\n\tfor (i = 0; i < space.length; i++) {\n\t\tcapped = Math.max(0, Math.min(maxes[space][i], values[space][i]));\n\t\tvalues[space][i] = Math.round(capped);\n\t}\n\n\t// convert to all the other color spaces\n\tfor (var sname in spaces) {\n\t\tif (sname !== space) {\n\t\t\tvalues[sname] = convert[space][sname](values[space]);\n\t\t}\n\t}\n\n\treturn true;\n};\n\nColor.prototype.setSpace = function (space, args) {\n\tvar vals = args[0];\n\n\tif (vals === undefined) {\n\t\t// color.rgb()\n\t\treturn this.getValues(space);\n\t}\n\n\t// color.rgb(10, 10, 10)\n\tif (typeof vals === 'number') {\n\t\tvals = Array.prototype.slice.call(args);\n\t}\n\n\tthis.setValues(space, vals);\n\treturn this;\n};\n\nColor.prototype.setChannel = function (space, index, val) {\n\tvar svalues = this.values[space];\n\tif (val === undefined) {\n\t\t// color.red()\n\t\treturn svalues[index];\n\t} else if (val === svalues[index]) {\n\t\t// color.red(color.red())\n\t\treturn this;\n\t}\n\n\t// color.red(100)\n\tsvalues[index] = val;\n\tthis.setValues(space, svalues);\n\n\treturn this;\n};\n\nif (typeof window !== 'undefined') {\n\twindow.Color = Color;\n}\n\nmodule.exports = Color;\n",
    "/* MIT license */\n/* eslint-disable no-mixed-operators */\nconst cssKeywords = require('color-name');\n\n// NOTE: conversions should only return primitive values (i.e. arrays, or\n//       values that give correct `typeof` results).\n//       do not use box values types (i.e. Number(), String(), etc.)\n\nconst reverseKeywords = {};\nfor (const key of Object.keys(cssKeywords)) {\n\treverseKeywords[cssKeywords[key]] = key;\n}\n\nconst convert = {\n\trgb: {channels: 3, labels: 'rgb'},\n\thsl: {channels: 3, labels: 'hsl'},\n\thsv: {channels: 3, labels: 'hsv'},\n\thwb: {channels: 3, labels: 'hwb'},\n\tcmyk: {channels: 4, labels: 'cmyk'},\n\txyz: {channels: 3, labels: 'xyz'},\n\tlab: {channels: 3, labels: 'lab'},\n\tlch: {channels: 3, labels: 'lch'},\n\thex: {channels: 1, labels: ['hex']},\n\tkeyword: {channels: 1, labels: ['keyword']},\n\tansi16: {channels: 1, labels: ['ansi16']},\n\tansi256: {channels: 1, labels: ['ansi256']},\n\thcg: {channels: 3, labels: ['h', 'c', 'g']},\n\tapple: {channels: 3, labels: ['r16', 'g16', 'b16']},\n\tgray: {channels: 1, labels: ['gray']}\n};\n\nmodule.exports = convert;\n\n// Hide .channels and .labels properties\nfor (const model of Object.keys(convert)) {\n\tif (!('channels' in convert[model])) {\n\t\tthrow new Error('missing channels property: ' + model);\n\t}\n\n\tif (!('labels' in convert[model])) {\n\t\tthrow new Error('missing channel labels property: ' + model);\n\t}\n\n\tif (convert[model].labels.length !== convert[model].channels) {\n\t\tthrow new Error('channel and label counts mismatch: ' + model);\n\t}\n\n\tconst {channels, labels} = convert[model];\n\tdelete convert[model].channels;\n\tdelete convert[model].labels;\n\tObject.defineProperty(convert[model], 'channels', {value: channels});\n\tObject.defineProperty(convert[model], 'labels', {value: labels});\n}\n\nconvert.rgb.hsl = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst min = Math.min(r, g, b);\n\tconst max = Math.max(r, g, b);\n\tconst delta = max - min;\n\tlet h;\n\tlet s;\n\n\tif (max === min) {\n\t\th = 0;\n\t} else if (r === max) {\n\t\th = (g - b) / delta;\n\t} else if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t} else if (b === max) {\n\t\th = 4 + (r - g) / delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tconst l = (min + max) / 2;\n\n\tif (max === min) {\n\t\ts = 0;\n\t} else if (l <= 0.5) {\n\t\ts = delta / (max + min);\n\t} else {\n\t\ts = delta / (2 - max - min);\n\t}\n\n\treturn [h, s * 100, l * 100];\n};\n\nconvert.rgb.hsv = function (rgb) {\n\tlet rdif;\n\tlet gdif;\n\tlet bdif;\n\tlet h;\n\tlet s;\n\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst v = Math.max(r, g, b);\n\tconst diff = v - Math.min(r, g, b);\n\tconst diffc = function (c) {\n\t\treturn (v - c) / 6 / diff + 1 / 2;\n\t};\n\n\tif (diff === 0) {\n\t\th = 0;\n\t\ts = 0;\n\t} else {\n\t\ts = diff / v;\n\t\trdif = diffc(r);\n\t\tgdif = diffc(g);\n\t\tbdif = diffc(b);\n\n\t\tif (r === v) {\n\t\t\th = bdif - gdif;\n\t\t} else if (g === v) {\n\t\t\th = (1 / 3) + rdif - bdif;\n\t\t} else if (b === v) {\n\t\t\th = (2 / 3) + gdif - rdif;\n\t\t}\n\n\t\tif (h < 0) {\n\t\t\th += 1;\n\t\t} else if (h > 1) {\n\t\t\th -= 1;\n\t\t}\n\t}\n\n\treturn [\n\t\th * 360,\n\t\ts * 100,\n\t\tv * 100\n\t];\n};\n\nconvert.rgb.hwb = function (rgb) {\n\tconst r = rgb[0];\n\tconst g = rgb[1];\n\tlet b = rgb[2];\n\tconst h = convert.rgb.hsl(rgb)[0];\n\tconst w = 1 / 255 * Math.min(r, Math.min(g, b));\n\n\tb = 1 - 1 / 255 * Math.max(r, Math.max(g, b));\n\n\treturn [h, w * 100, b * 100];\n};\n\nconvert.rgb.cmyk = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\n\tconst k = Math.min(1 - r, 1 - g, 1 - b);\n\tconst c = (1 - r - k) / (1 - k) || 0;\n\tconst m = (1 - g - k) / (1 - k) || 0;\n\tconst y = (1 - b - k) / (1 - k) || 0;\n\n\treturn [c * 100, m * 100, y * 100, k * 100];\n};\n\nfunction comparativeDistance(x, y) {\n\t/*\n\t\tSee https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance\n\t*/\n\treturn (\n\t\t((x[0] - y[0]) ** 2) +\n\t\t((x[1] - y[1]) ** 2) +\n\t\t((x[2] - y[2]) ** 2)\n\t);\n}\n\nconvert.rgb.keyword = function (rgb) {\n\tconst reversed = reverseKeywords[rgb];\n\tif (reversed) {\n\t\treturn reversed;\n\t}\n\n\tlet currentClosestDistance = Infinity;\n\tlet currentClosestKeyword;\n\n\tfor (const keyword of Object.keys(cssKeywords)) {\n\t\tconst value = cssKeywords[keyword];\n\n\t\t// Compute comparative distance\n\t\tconst distance = comparativeDistance(rgb, value);\n\n\t\t// Check if its less, if so set as closest\n\t\tif (distance < currentClosestDistance) {\n\t\t\tcurrentClosestDistance = distance;\n\t\t\tcurrentClosestKeyword = keyword;\n\t\t}\n\t}\n\n\treturn currentClosestKeyword;\n};\n\nconvert.keyword.rgb = function (keyword) {\n\treturn cssKeywords[keyword];\n};\n\nconvert.rgb.xyz = function (rgb) {\n\tlet r = rgb[0] / 255;\n\tlet g = rgb[1] / 255;\n\tlet b = rgb[2] / 255;\n\n\t// Assume sRGB\n\tr = r > 0.04045 ? (((r + 0.055) / 1.055) ** 2.4) : (r / 12.92);\n\tg = g > 0.04045 ? (((g + 0.055) / 1.055) ** 2.4) : (g / 12.92);\n\tb = b > 0.04045 ? (((b + 0.055) / 1.055) ** 2.4) : (b / 12.92);\n\n\tconst x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n\tconst y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n\tconst z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n\treturn [x * 100, y * 100, z * 100];\n};\n\nconvert.rgb.lab = function (rgb) {\n\tconst xyz = convert.rgb.xyz(rgb);\n\tlet x = xyz[0];\n\tlet y = xyz[1];\n\tlet z = xyz[2];\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);\n\n\tconst l = (116 * y) - 16;\n\tconst a = 500 * (x - y);\n\tconst b = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.hsl.rgb = function (hsl) {\n\tconst h = hsl[0] / 360;\n\tconst s = hsl[1] / 100;\n\tconst l = hsl[2] / 100;\n\tlet t2;\n\tlet t3;\n\tlet val;\n\n\tif (s === 0) {\n\t\tval = l * 255;\n\t\treturn [val, val, val];\n\t}\n\n\tif (l < 0.5) {\n\t\tt2 = l * (1 + s);\n\t} else {\n\t\tt2 = l + s - l * s;\n\t}\n\n\tconst t1 = 2 * l - t2;\n\n\tconst rgb = [0, 0, 0];\n\tfor (let i = 0; i < 3; i++) {\n\t\tt3 = h + 1 / 3 * -(i - 1);\n\t\tif (t3 < 0) {\n\t\t\tt3++;\n\t\t}\n\n\t\tif (t3 > 1) {\n\t\t\tt3--;\n\t\t}\n\n\t\tif (6 * t3 < 1) {\n\t\t\tval = t1 + (t2 - t1) * 6 * t3;\n\t\t} else if (2 * t3 < 1) {\n\t\t\tval = t2;\n\t\t} else if (3 * t3 < 2) {\n\t\t\tval = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n\t\t} else {\n\t\t\tval = t1;\n\t\t}\n\n\t\trgb[i] = val * 255;\n\t}\n\n\treturn rgb;\n};\n\nconvert.hsl.hsv = function (hsl) {\n\tconst h = hsl[0];\n\tlet s = hsl[1] / 100;\n\tlet l = hsl[2] / 100;\n\tlet smin = s;\n\tconst lmin = Math.max(l, 0.01);\n\n\tl *= 2;\n\ts *= (l <= 1) ? l : 2 - l;\n\tsmin *= lmin <= 1 ? lmin : 2 - lmin;\n\tconst v = (l + s) / 2;\n\tconst sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);\n\n\treturn [h, sv * 100, v * 100];\n};\n\nconvert.hsv.rgb = function (hsv) {\n\tconst h = hsv[0] / 60;\n\tconst s = hsv[1] / 100;\n\tlet v = hsv[2] / 100;\n\tconst hi = Math.floor(h) % 6;\n\n\tconst f = h - Math.floor(h);\n\tconst p = 255 * v * (1 - s);\n\tconst q = 255 * v * (1 - (s * f));\n\tconst t = 255 * v * (1 - (s * (1 - f)));\n\tv *= 255;\n\n\tswitch (hi) {\n\t\tcase 0:\n\t\t\treturn [v, t, p];\n\t\tcase 1:\n\t\t\treturn [q, v, p];\n\t\tcase 2:\n\t\t\treturn [p, v, t];\n\t\tcase 3:\n\t\t\treturn [p, q, v];\n\t\tcase 4:\n\t\t\treturn [t, p, v];\n\t\tcase 5:\n\t\t\treturn [v, p, q];\n\t}\n};\n\nconvert.hsv.hsl = function (hsv) {\n\tconst h = hsv[0];\n\tconst s = hsv[1] / 100;\n\tconst v = hsv[2] / 100;\n\tconst vmin = Math.max(v, 0.01);\n\tlet sl;\n\tlet l;\n\n\tl = (2 - s) * v;\n\tconst lmin = (2 - s) * vmin;\n\tsl = s * vmin;\n\tsl /= (lmin <= 1) ? lmin : 2 - lmin;\n\tsl = sl || 0;\n\tl /= 2;\n\n\treturn [h, sl * 100, l * 100];\n};\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nconvert.hwb.rgb = function (hwb) {\n\tconst h = hwb[0] / 360;\n\tlet wh = hwb[1] / 100;\n\tlet bl = hwb[2] / 100;\n\tconst ratio = wh + bl;\n\tlet f;\n\n\t// Wh + bl cant be > 1\n\tif (ratio > 1) {\n\t\twh /= ratio;\n\t\tbl /= ratio;\n\t}\n\n\tconst i = Math.floor(6 * h);\n\tconst v = 1 - bl;\n\tf = 6 * h - i;\n\n\tif ((i & 0x01) !== 0) {\n\t\tf = 1 - f;\n\t}\n\n\tconst n = wh + f * (v - wh); // Linear interpolation\n\n\tlet r;\n\tlet g;\n\tlet b;\n\t/* eslint-disable max-statements-per-line,no-multi-spaces */\n\tswitch (i) {\n\t\tdefault:\n\t\tcase 6:\n\t\tcase 0: r = v;  g = n;  b = wh; break;\n\t\tcase 1: r = n;  g = v;  b = wh; break;\n\t\tcase 2: r = wh; g = v;  b = n; break;\n\t\tcase 3: r = wh; g = n;  b = v; break;\n\t\tcase 4: r = n;  g = wh; b = v; break;\n\t\tcase 5: r = v;  g = wh; b = n; break;\n\t}\n\t/* eslint-enable max-statements-per-line,no-multi-spaces */\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.cmyk.rgb = function (cmyk) {\n\tconst c = cmyk[0] / 100;\n\tconst m = cmyk[1] / 100;\n\tconst y = cmyk[2] / 100;\n\tconst k = cmyk[3] / 100;\n\n\tconst r = 1 - Math.min(1, c * (1 - k) + k);\n\tconst g = 1 - Math.min(1, m * (1 - k) + k);\n\tconst b = 1 - Math.min(1, y * (1 - k) + k);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.rgb = function (xyz) {\n\tconst x = xyz[0] / 100;\n\tconst y = xyz[1] / 100;\n\tconst z = xyz[2] / 100;\n\tlet r;\n\tlet g;\n\tlet b;\n\n\tr = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n\tg = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n\tb = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n\t// Assume sRGB\n\tr = r > 0.0031308\n\t\t? ((1.055 * (r ** (1.0 / 2.4))) - 0.055)\n\t\t: r * 12.92;\n\n\tg = g > 0.0031308\n\t\t? ((1.055 * (g ** (1.0 / 2.4))) - 0.055)\n\t\t: g * 12.92;\n\n\tb = b > 0.0031308\n\t\t? ((1.055 * (b ** (1.0 / 2.4))) - 0.055)\n\t\t: b * 12.92;\n\n\tr = Math.min(Math.max(0, r), 1);\n\tg = Math.min(Math.max(0, g), 1);\n\tb = Math.min(Math.max(0, b), 1);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.lab = function (xyz) {\n\tlet x = xyz[0];\n\tlet y = xyz[1];\n\tlet z = xyz[2];\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);\n\n\tconst l = (116 * y) - 16;\n\tconst a = 500 * (x - y);\n\tconst b = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.lab.xyz = function (lab) {\n\tconst l = lab[0];\n\tconst a = lab[1];\n\tconst b = lab[2];\n\tlet x;\n\tlet y;\n\tlet z;\n\n\ty = (l + 16) / 116;\n\tx = a / 500 + y;\n\tz = y - b / 200;\n\n\tconst y2 = y ** 3;\n\tconst x2 = x ** 3;\n\tconst z2 = z ** 3;\n\ty = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;\n\tx = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;\n\tz = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;\n\n\tx *= 95.047;\n\ty *= 100;\n\tz *= 108.883;\n\n\treturn [x, y, z];\n};\n\nconvert.lab.lch = function (lab) {\n\tconst l = lab[0];\n\tconst a = lab[1];\n\tconst b = lab[2];\n\tlet h;\n\n\tconst hr = Math.atan2(b, a);\n\th = hr * 360 / 2 / Math.PI;\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tconst c = Math.sqrt(a * a + b * b);\n\n\treturn [l, c, h];\n};\n\nconvert.lch.lab = function (lch) {\n\tconst l = lch[0];\n\tconst c = lch[1];\n\tconst h = lch[2];\n\n\tconst hr = h / 360 * 2 * Math.PI;\n\tconst a = c * Math.cos(hr);\n\tconst b = c * Math.sin(hr);\n\n\treturn [l, a, b];\n};\n\nconvert.rgb.ansi16 = function (args, saturation = null) {\n\tconst [r, g, b] = args;\n\tlet value = saturation === null ? convert.rgb.hsv(args)[2] : saturation; // Hsv -> ansi16 optimization\n\n\tvalue = Math.round(value / 50);\n\n\tif (value === 0) {\n\t\treturn 30;\n\t}\n\n\tlet ansi = 30\n\t\t+ ((Math.round(b / 255) << 2)\n\t\t| (Math.round(g / 255) << 1)\n\t\t| Math.round(r / 255));\n\n\tif (value === 2) {\n\t\tansi += 60;\n\t}\n\n\treturn ansi;\n};\n\nconvert.hsv.ansi16 = function (args) {\n\t// Optimization here; we already know the value and don't need to get\n\t// it converted for us.\n\treturn convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);\n};\n\nconvert.rgb.ansi256 = function (args) {\n\tconst r = args[0];\n\tconst g = args[1];\n\tconst b = args[2];\n\n\t// We use the extended greyscale palette here, with the exception of\n\t// black and white. normal palette only has 4 greyscale shades.\n\tif (r === g && g === b) {\n\t\tif (r < 8) {\n\t\t\treturn 16;\n\t\t}\n\n\t\tif (r > 248) {\n\t\t\treturn 231;\n\t\t}\n\n\t\treturn Math.round(((r - 8) / 247) * 24) + 232;\n\t}\n\n\tconst ansi = 16\n\t\t+ (36 * Math.round(r / 255 * 5))\n\t\t+ (6 * Math.round(g / 255 * 5))\n\t\t+ Math.round(b / 255 * 5);\n\n\treturn ansi;\n};\n\nconvert.ansi16.rgb = function (args) {\n\tlet color = args % 10;\n\n\t// Handle greyscale\n\tif (color === 0 || color === 7) {\n\t\tif (args > 50) {\n\t\t\tcolor += 3.5;\n\t\t}\n\n\t\tcolor = color / 10.5 * 255;\n\n\t\treturn [color, color, color];\n\t}\n\n\tconst mult = (~~(args > 50) + 1) * 0.5;\n\tconst r = ((color & 1) * mult) * 255;\n\tconst g = (((color >> 1) & 1) * mult) * 255;\n\tconst b = (((color >> 2) & 1) * mult) * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.ansi256.rgb = function (args) {\n\t// Handle greyscale\n\tif (args >= 232) {\n\t\tconst c = (args - 232) * 10 + 8;\n\t\treturn [c, c, c];\n\t}\n\n\targs -= 16;\n\n\tlet rem;\n\tconst r = Math.floor(args / 36) / 5 * 255;\n\tconst g = Math.floor((rem = args % 36) / 6) / 5 * 255;\n\tconst b = (rem % 6) / 5 * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hex = function (args) {\n\tconst integer = ((Math.round(args[0]) & 0xFF) << 16)\n\t\t+ ((Math.round(args[1]) & 0xFF) << 8)\n\t\t+ (Math.round(args[2]) & 0xFF);\n\n\tconst string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.hex.rgb = function (args) {\n\tconst match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);\n\tif (!match) {\n\t\treturn [0, 0, 0];\n\t}\n\n\tlet colorString = match[0];\n\n\tif (match[0].length === 3) {\n\t\tcolorString = colorString.split('').map(char => {\n\t\t\treturn char + char;\n\t\t}).join('');\n\t}\n\n\tconst integer = parseInt(colorString, 16);\n\tconst r = (integer >> 16) & 0xFF;\n\tconst g = (integer >> 8) & 0xFF;\n\tconst b = integer & 0xFF;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hcg = function (rgb) {\n\tconst r = rgb[0] / 255;\n\tconst g = rgb[1] / 255;\n\tconst b = rgb[2] / 255;\n\tconst max = Math.max(Math.max(r, g), b);\n\tconst min = Math.min(Math.min(r, g), b);\n\tconst chroma = (max - min);\n\tlet grayscale;\n\tlet hue;\n\n\tif (chroma < 1) {\n\t\tgrayscale = min / (1 - chroma);\n\t} else {\n\t\tgrayscale = 0;\n\t}\n\n\tif (chroma <= 0) {\n\t\thue = 0;\n\t} else\n\tif (max === r) {\n\t\thue = ((g - b) / chroma) % 6;\n\t} else\n\tif (max === g) {\n\t\thue = 2 + (b - r) / chroma;\n\t} else {\n\t\thue = 4 + (r - g) / chroma;\n\t}\n\n\thue /= 6;\n\thue %= 1;\n\n\treturn [hue * 360, chroma * 100, grayscale * 100];\n};\n\nconvert.hsl.hcg = function (hsl) {\n\tconst s = hsl[1] / 100;\n\tconst l = hsl[2] / 100;\n\n\tconst c = l < 0.5 ? (2.0 * s * l) : (2.0 * s * (1.0 - l));\n\n\tlet f = 0;\n\tif (c < 1.0) {\n\t\tf = (l - 0.5 * c) / (1.0 - c);\n\t}\n\n\treturn [hsl[0], c * 100, f * 100];\n};\n\nconvert.hsv.hcg = function (hsv) {\n\tconst s = hsv[1] / 100;\n\tconst v = hsv[2] / 100;\n\n\tconst c = s * v;\n\tlet f = 0;\n\n\tif (c < 1.0) {\n\t\tf = (v - c) / (1 - c);\n\t}\n\n\treturn [hsv[0], c * 100, f * 100];\n};\n\nconvert.hcg.rgb = function (hcg) {\n\tconst h = hcg[0] / 360;\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tif (c === 0.0) {\n\t\treturn [g * 255, g * 255, g * 255];\n\t}\n\n\tconst pure = [0, 0, 0];\n\tconst hi = (h % 1) * 6;\n\tconst v = hi % 1;\n\tconst w = 1 - v;\n\tlet mg = 0;\n\n\t/* eslint-disable max-statements-per-line */\n\tswitch (Math.floor(hi)) {\n\t\tcase 0:\n\t\t\tpure[0] = 1; pure[1] = v; pure[2] = 0; break;\n\t\tcase 1:\n\t\t\tpure[0] = w; pure[1] = 1; pure[2] = 0; break;\n\t\tcase 2:\n\t\t\tpure[0] = 0; pure[1] = 1; pure[2] = v; break;\n\t\tcase 3:\n\t\t\tpure[0] = 0; pure[1] = w; pure[2] = 1; break;\n\t\tcase 4:\n\t\t\tpure[0] = v; pure[1] = 0; pure[2] = 1; break;\n\t\tdefault:\n\t\t\tpure[0] = 1; pure[1] = 0; pure[2] = w;\n\t}\n\t/* eslint-enable max-statements-per-line */\n\n\tmg = (1.0 - c) * g;\n\n\treturn [\n\t\t(c * pure[0] + mg) * 255,\n\t\t(c * pure[1] + mg) * 255,\n\t\t(c * pure[2] + mg) * 255\n\t];\n};\n\nconvert.hcg.hsv = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tconst v = c + g * (1.0 - c);\n\tlet f = 0;\n\n\tif (v > 0.0) {\n\t\tf = c / v;\n\t}\n\n\treturn [hcg[0], f * 100, v * 100];\n};\n\nconvert.hcg.hsl = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\n\tconst l = g * (1.0 - c) + 0.5 * c;\n\tlet s = 0;\n\n\tif (l > 0.0 && l < 0.5) {\n\t\ts = c / (2 * l);\n\t} else\n\tif (l >= 0.5 && l < 1.0) {\n\t\ts = c / (2 * (1 - l));\n\t}\n\n\treturn [hcg[0], s * 100, l * 100];\n};\n\nconvert.hcg.hwb = function (hcg) {\n\tconst c = hcg[1] / 100;\n\tconst g = hcg[2] / 100;\n\tconst v = c + g * (1.0 - c);\n\treturn [hcg[0], (v - c) * 100, (1 - v) * 100];\n};\n\nconvert.hwb.hcg = function (hwb) {\n\tconst w = hwb[1] / 100;\n\tconst b = hwb[2] / 100;\n\tconst v = 1 - b;\n\tconst c = v - w;\n\tlet g = 0;\n\n\tif (c < 1) {\n\t\tg = (v - c) / (1 - c);\n\t}\n\n\treturn [hwb[0], c * 100, g * 100];\n};\n\nconvert.apple.rgb = function (apple) {\n\treturn [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];\n};\n\nconvert.rgb.apple = function (rgb) {\n\treturn [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];\n};\n\nconvert.gray.rgb = function (args) {\n\treturn [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];\n};\n\nconvert.gray.hsl = function (args) {\n\treturn [0, 0, args[0]];\n};\n\nconvert.gray.hsv = convert.gray.hsl;\n\nconvert.gray.hwb = function (gray) {\n\treturn [0, 100, gray[0]];\n};\n\nconvert.gray.cmyk = function (gray) {\n\treturn [0, 0, 0, gray[0]];\n};\n\nconvert.gray.lab = function (gray) {\n\treturn [gray[0], 0, 0];\n};\n\nconvert.gray.hex = function (gray) {\n\tconst val = Math.round(gray[0] / 100 * 255) & 0xFF;\n\tconst integer = (val << 16) + (val << 8) + val;\n\n\tconst string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.rgb.gray = function (rgb) {\n\tconst val = (rgb[0] + rgb[1] + rgb[2]) / 3;\n\treturn [val / 255 * 100];\n};\n",
    "const conversions = require('./conversions');\nconst route = require('./route');\n\nconst convert = {};\n\nconst models = Object.keys(conversions);\n\nfunction wrapRaw(fn) {\n\tconst wrappedFn = function (...args) {\n\t\tconst arg0 = args[0];\n\t\tif (arg0 === undefined || arg0 === null) {\n\t\t\treturn arg0;\n\t\t}\n\n\t\tif (arg0.length > 1) {\n\t\t\targs = arg0;\n\t\t}\n\n\t\treturn fn(args);\n\t};\n\n\t// Preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nfunction wrapRounded(fn) {\n\tconst wrappedFn = function (...args) {\n\t\tconst arg0 = args[0];\n\n\t\tif (arg0 === undefined || arg0 === null) {\n\t\t\treturn arg0;\n\t\t}\n\n\t\tif (arg0.length > 1) {\n\t\t\targs = arg0;\n\t\t}\n\n\t\tconst result = fn(args);\n\n\t\t// We're assuming the result is an array here.\n\t\t// see notice in conversions.js; don't use box types\n\t\t// in conversion functions.\n\t\tif (typeof result === 'object') {\n\t\t\tfor (let len = result.length, i = 0; i < len; i++) {\n\t\t\t\tresult[i] = Math.round(result[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t};\n\n\t// Preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nmodels.forEach(fromModel => {\n\tconvert[fromModel] = {};\n\n\tObject.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});\n\tObject.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});\n\n\tconst routes = route(fromModel);\n\tconst routeModels = Object.keys(routes);\n\n\trouteModels.forEach(toModel => {\n\t\tconst fn = routes[toModel];\n\n\t\tconvert[fromModel][toModel] = wrapRounded(fn);\n\t\tconvert[fromModel][toModel].raw = wrapRaw(fn);\n\t});\n});\n\nmodule.exports = convert;\n",
    "const conversions = require('./conversions');\n\n/*\n\tThis function routes a model to all other models.\n\n\tall functions that are routed have a property `.conversion` attached\n\tto the returned synthetic function. This property is an array\n\tof strings, each with the steps in between the 'from' and 'to'\n\tcolor models (inclusive).\n\n\tconversions that are not possible simply are not included.\n*/\n\nfunction buildGraph() {\n\tconst graph = {};\n\t// https://jsperf.com/object-keys-vs-for-in-with-closure/3\n\tconst models = Object.keys(conversions);\n\n\tfor (let len = models.length, i = 0; i < len; i++) {\n\t\tgraph[models[i]] = {\n\t\t\t// http://jsperf.com/1-vs-infinity\n\t\t\t// micro-opt, but this is simple.\n\t\t\tdistance: -1,\n\t\t\tparent: null\n\t\t};\n\t}\n\n\treturn graph;\n}\n\n// https://en.wikipedia.org/wiki/Breadth-first_search\nfunction deriveBFS(fromModel) {\n\tconst graph = buildGraph();\n\tconst queue = [fromModel]; // Unshift -> queue -> pop\n\n\tgraph[fromModel].distance = 0;\n\n\twhile (queue.length) {\n\t\tconst current = queue.pop();\n\t\tconst adjacents = Object.keys(conversions[current]);\n\n\t\tfor (let len = adjacents.length, i = 0; i < len; i++) {\n\t\t\tconst adjacent = adjacents[i];\n\t\t\tconst node = graph[adjacent];\n\n\t\t\tif (node.distance === -1) {\n\t\t\t\tnode.distance = graph[current].distance + 1;\n\t\t\t\tnode.parent = current;\n\t\t\t\tqueue.unshift(adjacent);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn graph;\n}\n\nfunction link(from, to) {\n\treturn function (args) {\n\t\treturn to(from(args));\n\t};\n}\n\nfunction wrapConversion(toModel, graph) {\n\tconst path = [graph[toModel].parent, toModel];\n\tlet fn = conversions[graph[toModel].parent][toModel];\n\n\tlet cur = graph[toModel].parent;\n\twhile (graph[cur].parent) {\n\t\tpath.unshift(graph[cur].parent);\n\t\tfn = link(conversions[graph[cur].parent][cur], fn);\n\t\tcur = graph[cur].parent;\n\t}\n\n\tfn.conversion = path;\n\treturn fn;\n}\n\nmodule.exports = function (fromModel) {\n\tconst graph = deriveBFS(fromModel);\n\tconst conversion = {};\n\n\tconst models = Object.keys(graph);\n\tfor (let len = models.length, i = 0; i < len; i++) {\n\t\tconst toModel = models[i];\n\t\tconst node = graph[toModel];\n\n\t\tif (node.parent === null) {\n\t\t\t// No possible conversion, or this node is the source model.\n\t\t\tcontinue;\n\t\t}\n\n\t\tconversion[toModel] = wrapConversion(toModel, graph);\n\t}\n\n\treturn conversion;\n};\n\n",
    "'use strict'\r\n\r\nmodule.exports = {\r\n\t\"aliceblue\": [240, 248, 255],\r\n\t\"antiquewhite\": [250, 235, 215],\r\n\t\"aqua\": [0, 255, 255],\r\n\t\"aquamarine\": [127, 255, 212],\r\n\t\"azure\": [240, 255, 255],\r\n\t\"beige\": [245, 245, 220],\r\n\t\"bisque\": [255, 228, 196],\r\n\t\"black\": [0, 0, 0],\r\n\t\"blanchedalmond\": [255, 235, 205],\r\n\t\"blue\": [0, 0, 255],\r\n\t\"blueviolet\": [138, 43, 226],\r\n\t\"brown\": [165, 42, 42],\r\n\t\"burlywood\": [222, 184, 135],\r\n\t\"cadetblue\": [95, 158, 160],\r\n\t\"chartreuse\": [127, 255, 0],\r\n\t\"chocolate\": [210, 105, 30],\r\n\t\"coral\": [255, 127, 80],\r\n\t\"cornflowerblue\": [100, 149, 237],\r\n\t\"cornsilk\": [255, 248, 220],\r\n\t\"crimson\": [220, 20, 60],\r\n\t\"cyan\": [0, 255, 255],\r\n\t\"darkblue\": [0, 0, 139],\r\n\t\"darkcyan\": [0, 139, 139],\r\n\t\"darkgoldenrod\": [184, 134, 11],\r\n\t\"darkgray\": [169, 169, 169],\r\n\t\"darkgreen\": [0, 100, 0],\r\n\t\"darkgrey\": [169, 169, 169],\r\n\t\"darkkhaki\": [189, 183, 107],\r\n\t\"darkmagenta\": [139, 0, 139],\r\n\t\"darkolivegreen\": [85, 107, 47],\r\n\t\"darkorange\": [255, 140, 0],\r\n\t\"darkorchid\": [153, 50, 204],\r\n\t\"darkred\": [139, 0, 0],\r\n\t\"darksalmon\": [233, 150, 122],\r\n\t\"darkseagreen\": [143, 188, 143],\r\n\t\"darkslateblue\": [72, 61, 139],\r\n\t\"darkslategray\": [47, 79, 79],\r\n\t\"darkslategrey\": [47, 79, 79],\r\n\t\"darkturquoise\": [0, 206, 209],\r\n\t\"darkviolet\": [148, 0, 211],\r\n\t\"deeppink\": [255, 20, 147],\r\n\t\"deepskyblue\": [0, 191, 255],\r\n\t\"dimgray\": [105, 105, 105],\r\n\t\"dimgrey\": [105, 105, 105],\r\n\t\"dodgerblue\": [30, 144, 255],\r\n\t\"firebrick\": [178, 34, 34],\r\n\t\"floralwhite\": [255, 250, 240],\r\n\t\"forestgreen\": [34, 139, 34],\r\n\t\"fuchsia\": [255, 0, 255],\r\n\t\"gainsboro\": [220, 220, 220],\r\n\t\"ghostwhite\": [248, 248, 255],\r\n\t\"gold\": [255, 215, 0],\r\n\t\"goldenrod\": [218, 165, 32],\r\n\t\"gray\": [128, 128, 128],\r\n\t\"green\": [0, 128, 0],\r\n\t\"greenyellow\": [173, 255, 47],\r\n\t\"grey\": [128, 128, 128],\r\n\t\"honeydew\": [240, 255, 240],\r\n\t\"hotpink\": [255, 105, 180],\r\n\t\"indianred\": [205, 92, 92],\r\n\t\"indigo\": [75, 0, 130],\r\n\t\"ivory\": [255, 255, 240],\r\n\t\"khaki\": [240, 230, 140],\r\n\t\"lavender\": [230, 230, 250],\r\n\t\"lavenderblush\": [255, 240, 245],\r\n\t\"lawngreen\": [124, 252, 0],\r\n\t\"lemonchiffon\": [255, 250, 205],\r\n\t\"lightblue\": [173, 216, 230],\r\n\t\"lightcoral\": [240, 128, 128],\r\n\t\"lightcyan\": [224, 255, 255],\r\n\t\"lightgoldenrodyellow\": [250, 250, 210],\r\n\t\"lightgray\": [211, 211, 211],\r\n\t\"lightgreen\": [144, 238, 144],\r\n\t\"lightgrey\": [211, 211, 211],\r\n\t\"lightpink\": [255, 182, 193],\r\n\t\"lightsalmon\": [255, 160, 122],\r\n\t\"lightseagreen\": [32, 178, 170],\r\n\t\"lightskyblue\": [135, 206, 250],\r\n\t\"lightslategray\": [119, 136, 153],\r\n\t\"lightslategrey\": [119, 136, 153],\r\n\t\"lightsteelblue\": [176, 196, 222],\r\n\t\"lightyellow\": [255, 255, 224],\r\n\t\"lime\": [0, 255, 0],\r\n\t\"limegreen\": [50, 205, 50],\r\n\t\"linen\": [250, 240, 230],\r\n\t\"magenta\": [255, 0, 255],\r\n\t\"maroon\": [128, 0, 0],\r\n\t\"mediumaquamarine\": [102, 205, 170],\r\n\t\"mediumblue\": [0, 0, 205],\r\n\t\"mediumorchid\": [186, 85, 211],\r\n\t\"mediumpurple\": [147, 112, 219],\r\n\t\"mediumseagreen\": [60, 179, 113],\r\n\t\"mediumslateblue\": [123, 104, 238],\r\n\t\"mediumspringgreen\": [0, 250, 154],\r\n\t\"mediumturquoise\": [72, 209, 204],\r\n\t\"mediumvioletred\": [199, 21, 133],\r\n\t\"midnightblue\": [25, 25, 112],\r\n\t\"mintcream\": [245, 255, 250],\r\n\t\"mistyrose\": [255, 228, 225],\r\n\t\"moccasin\": [255, 228, 181],\r\n\t\"navajowhite\": [255, 222, 173],\r\n\t\"navy\": [0, 0, 128],\r\n\t\"oldlace\": [253, 245, 230],\r\n\t\"olive\": [128, 128, 0],\r\n\t\"olivedrab\": [107, 142, 35],\r\n\t\"orange\": [255, 165, 0],\r\n\t\"orangered\": [255, 69, 0],\r\n\t\"orchid\": [218, 112, 214],\r\n\t\"palegoldenrod\": [238, 232, 170],\r\n\t\"palegreen\": [152, 251, 152],\r\n\t\"paleturquoise\": [175, 238, 238],\r\n\t\"palevioletred\": [219, 112, 147],\r\n\t\"papayawhip\": [255, 239, 213],\r\n\t\"peachpuff\": [255, 218, 185],\r\n\t\"peru\": [205, 133, 63],\r\n\t\"pink\": [255, 192, 203],\r\n\t\"plum\": [221, 160, 221],\r\n\t\"powderblue\": [176, 224, 230],\r\n\t\"purple\": [128, 0, 128],\r\n\t\"rebeccapurple\": [102, 51, 153],\r\n\t\"red\": [255, 0, 0],\r\n\t\"rosybrown\": [188, 143, 143],\r\n\t\"royalblue\": [65, 105, 225],\r\n\t\"saddlebrown\": [139, 69, 19],\r\n\t\"salmon\": [250, 128, 114],\r\n\t\"sandybrown\": [244, 164, 96],\r\n\t\"seagreen\": [46, 139, 87],\r\n\t\"seashell\": [255, 245, 238],\r\n\t\"sienna\": [160, 82, 45],\r\n\t\"silver\": [192, 192, 192],\r\n\t\"skyblue\": [135, 206, 235],\r\n\t\"slateblue\": [106, 90, 205],\r\n\t\"slategray\": [112, 128, 144],\r\n\t\"slategrey\": [112, 128, 144],\r\n\t\"snow\": [255, 250, 250],\r\n\t\"springgreen\": [0, 255, 127],\r\n\t\"steelblue\": [70, 130, 180],\r\n\t\"tan\": [210, 180, 140],\r\n\t\"teal\": [0, 128, 128],\r\n\t\"thistle\": [216, 191, 216],\r\n\t\"tomato\": [255, 99, 71],\r\n\t\"turquoise\": [64, 224, 208],\r\n\t\"violet\": [238, 130, 238],\r\n\t\"wheat\": [245, 222, 179],\r\n\t\"white\": [255, 255, 255],\r\n\t\"whitesmoke\": [245, 245, 245],\r\n\t\"yellow\": [255, 255, 0],\r\n\t\"yellowgreen\": [154, 205, 50]\r\n};\r\n",
    "// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nfunction EventEmitter() {\n  this._events = this._events || {};\n  this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nEventEmitter.defaultMaxListeners = 10;\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function(n) {\n  if (!isNumber(n) || n < 0 || isNaN(n))\n    throw TypeError('n must be a positive number');\n  this._maxListeners = n;\n  return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n  var er, handler, len, args, i, listeners;\n\n  if (!this._events)\n    this._events = {};\n\n  // If there is no 'error' event listener then throw.\n  if (type === 'error') {\n    if (!this._events.error ||\n        (isObject(this._events.error) && !this._events.error.length)) {\n      er = arguments[1];\n      if (er instanceof Error) {\n        throw er; // Unhandled 'error' event\n      }\n      throw TypeError('Uncaught, unspecified \"error\" event.');\n    }\n  }\n\n  handler = this._events[type];\n\n  if (isUndefined(handler))\n    return false;\n\n  if (isFunction(handler)) {\n    switch (arguments.length) {\n      // fast cases\n      case 1:\n        handler.call(this);\n        break;\n      case 2:\n        handler.call(this, arguments[1]);\n        break;\n      case 3:\n        handler.call(this, arguments[1], arguments[2]);\n        break;\n      // slower\n      default:\n        len = arguments.length;\n        args = new Array(len - 1);\n        for (i = 1; i < len; i++)\n          args[i - 1] = arguments[i];\n        handler.apply(this, args);\n    }\n  } else if (isObject(handler)) {\n    len = arguments.length;\n    args = new Array(len - 1);\n    for (i = 1; i < len; i++)\n      args[i - 1] = arguments[i];\n\n    listeners = handler.slice();\n    len = listeners.length;\n    for (i = 0; i < len; i++)\n      listeners[i].apply(this, args);\n  }\n\n  return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n  var m;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events)\n    this._events = {};\n\n  // To avoid recursion in the case that type === \"newListener\"! Before\n  // adding it to the listeners, first emit \"newListener\".\n  if (this._events.newListener)\n    this.emit('newListener', type,\n              isFunction(listener.listener) ?\n              listener.listener : listener);\n\n  if (!this._events[type])\n    // Optimize the case of one listener. Don't need the extra array object.\n    this._events[type] = listener;\n  else if (isObject(this._events[type]))\n    // If we've already got an array, just append.\n    this._events[type].push(listener);\n  else\n    // Adding the second element, need to change to array.\n    this._events[type] = [this._events[type], listener];\n\n  // Check for listener leak\n  if (isObject(this._events[type]) && !this._events[type].warned) {\n    var m;\n    if (!isUndefined(this._maxListeners)) {\n      m = this._maxListeners;\n    } else {\n      m = EventEmitter.defaultMaxListeners;\n    }\n\n    if (m && m > 0 && this._events[type].length > m) {\n      this._events[type].warned = true;\n      console.error('(node) warning: possible EventEmitter memory ' +\n                    'leak detected. %d listeners added. ' +\n                    'Use emitter.setMaxListeners() to increase limit.',\n                    this._events[type].length);\n      if (typeof console.trace === 'function') {\n        // not supported in IE 10\n        console.trace();\n      }\n    }\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  var fired = false;\n\n  function g() {\n    this.removeListener(type, g);\n\n    if (!fired) {\n      fired = true;\n      listener.apply(this, arguments);\n    }\n  }\n\n  g.listener = listener;\n  this.on(type, g);\n\n  return this;\n};\n\n// emits a 'removeListener' event iff the listener was removed\nEventEmitter.prototype.removeListener = function(type, listener) {\n  var list, position, length, i;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events || !this._events[type])\n    return this;\n\n  list = this._events[type];\n  length = list.length;\n  position = -1;\n\n  if (list === listener ||\n      (isFunction(list.listener) && list.listener === listener)) {\n    delete this._events[type];\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n\n  } else if (isObject(list)) {\n    for (i = length; i-- > 0;) {\n      if (list[i] === listener ||\n          (list[i].listener && list[i].listener === listener)) {\n        position = i;\n        break;\n      }\n    }\n\n    if (position < 0)\n      return this;\n\n    if (list.length === 1) {\n      list.length = 0;\n      delete this._events[type];\n    } else {\n      list.splice(position, 1);\n    }\n\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n  var key, listeners;\n\n  if (!this._events)\n    return this;\n\n  // not listening for removeListener, no need to emit\n  if (!this._events.removeListener) {\n    if (arguments.length === 0)\n      this._events = {};\n    else if (this._events[type])\n      delete this._events[type];\n    return this;\n  }\n\n  // emit removeListener for all listeners on all events\n  if (arguments.length === 0) {\n    for (key in this._events) {\n      if (key === 'removeListener') continue;\n      this.removeAllListeners(key);\n    }\n    this.removeAllListeners('removeListener');\n    this._events = {};\n    return this;\n  }\n\n  listeners = this._events[type];\n\n  if (isFunction(listeners)) {\n    this.removeListener(type, listeners);\n  } else {\n    // LIFO order\n    while (listeners.length)\n      this.removeListener(type, listeners[listeners.length - 1]);\n  }\n  delete this._events[type];\n\n  return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n  var ret;\n  if (!this._events || !this._events[type])\n    ret = [];\n  else if (isFunction(this._events[type]))\n    ret = [this._events[type]];\n  else\n    ret = this._events[type].slice();\n  return ret;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  var ret;\n  if (!emitter._events || !emitter._events[type])\n    ret = 0;\n  else if (isFunction(emitter._events[type]))\n    ret = 1;\n  else\n    ret = emitter._events[type].length;\n  return ret;\n};\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\n",
    "/*! Moment Duration Format v2.2.2\n *  https://github.com/jsmreese/moment-duration-format\n *  Date: 2018-02-16\n *\n *  Duration format plugin function for the Moment.js library\n *  http://momentjs.com/\n *\n *  Copyright 2018 John Madhavan-Reese\n *  Released under the MIT license\n */\n\n(function (root, factory) {\n    if (typeof define === 'function' && define.amd) {\n        // AMD. Register as an anonymous module.\n        define(['moment'], factory);\n    } else if (typeof exports === 'object') {\n        // Node. Does not work with strict CommonJS, but only CommonJS-like\n        // enviroments that support module.exports, like Node.\n        try {\n            module.exports = factory(require('moment'));\n        } catch (e) {\n            // If moment is not available, leave the setup up to the user.\n            // Like when using moment-timezone or similar moment-based package.\n            module.exports = factory;\n        }\n    }\n\n    if (root) {\n        // Globals.\n        root.momentDurationFormatSetup = root.moment ? factory(root.moment) : factory;\n    }\n})(this, function (moment) {\n    // `Number#tolocaleString` is tested on plugin initialization.\n    // If the feature test passes, `toLocaleStringWorks` will be set to `true` and the\n    // native function will be used to generate formatted output. If the feature\n    // test fails, the fallback format function internal to this plugin will be\n    // used.\n    var toLocaleStringWorks = false;\n\n    // `Number#toLocaleString` rounds incorrectly for select numbers in Microsoft\n    // environments (Edge, IE11, Windows Phone) and possibly other environments.\n    // If the rounding test fails and `toLocaleString` will be used for formatting,\n    // the plugin will \"pre-round\" number values using the fallback number format\n    // function before passing them to `toLocaleString` for final formatting.\n    var toLocaleStringRoundingWorks = false;\n\n    // `Intl.NumberFormat#format` is tested on plugin initialization.\n    // If the feature test passes, `intlNumberFormatRoundingWorks` will be set to\n    // `true` and the native function will be used to generate formatted output.\n    // If the feature test fails, either `Number#tolocaleString` (if\n    // `toLocaleStringWorks` is `true`), or the fallback format function internal\n    //  to this plugin will be used.\n    var intlNumberFormatWorks = false;\n\n    // `Intl.NumberFormat#format` rounds incorrectly for select numbers in Microsoft\n    // environments (Edge, IE11, Windows Phone) and possibly other environments.\n    // If the rounding test fails and `Intl.NumberFormat#format` will be used for\n    // formatting, the plugin will \"pre-round\" number values using the fallback number\n    // format function before passing them to `Intl.NumberFormat#format` for final\n    // formatting.\n    var intlNumberFormatRoundingWorks = false;\n\n    // Token type names in order of descending magnitude.\n    var types = \"escape years months weeks days hours minutes seconds milliseconds general\".split(\" \");\n\n    var bubbles = [\n        {\n            type: \"seconds\",\n            targets: [\n                { type: \"minutes\", value: 60 },\n                { type: \"hours\", value: 3600 },\n                { type: \"days\", value: 86400 },\n                { type: \"weeks\", value: 604800 },\n                { type: \"months\", value: 2678400 },\n                { type: \"years\", value: 31536000 }\n            ]\n        },\n        {\n            type: \"minutes\",\n            targets: [\n                { type: \"hours\", value: 60 },\n                { type: \"days\", value: 1440 },\n                { type: \"weeks\", value: 10080 },\n                { type: \"months\", value: 44640 },\n                { type: \"years\", value: 525600 }\n            ]\n        },\n        {\n            type: \"hours\",\n            targets: [\n                { type: \"days\", value: 24 },\n                { type: \"weeks\", value: 168 },\n                { type: \"months\", value: 744 },\n                { type: \"years\", value: 8760 }\n            ]\n        },\n        {\n            type: \"days\",\n            targets: [\n                { type: \"weeks\", value: 7 },\n                { type: \"months\", value: 31 },\n                { type: \"years\", value: 365 }\n            ]\n        },\n        {\n            type: \"months\",\n            targets: [\n                { type: \"years\", value: 12 }\n            ]\n        }\n    ];\n\n    // stringIncludes\n    function stringIncludes(str, search) {\n        if (search.length > str.length) {\n          return false;\n        }\n\n        return str.indexOf(search) !== -1;\n    }\n\n    // repeatZero(qty)\n    // Returns \"0\" repeated `qty` times.\n    // `qty` must be a integer >= 0.\n    function repeatZero(qty) {\n        var result = \"\";\n\n        while (qty) {\n            result += \"0\";\n            qty -= 1;\n        }\n\n        return result;\n    }\n\n    function stringRound(digits) {\n        var digitsArray = digits.split(\"\").reverse();\n        var i = 0;\n        var carry = true;\n\n        while (carry && i < digitsArray.length) {\n            if (i) {\n                if (digitsArray[i] === \"9\") {\n                    digitsArray[i] = \"0\";\n                } else {\n                    digitsArray[i] = (parseInt(digitsArray[i], 10) + 1).toString();\n                    carry = false;\n                }\n            } else {\n                if (parseInt(digitsArray[i], 10) < 5) {\n                    carry = false;\n                }\n\n                digitsArray[i] = \"0\";\n            }\n\n            i += 1;\n        }\n\n        if (carry) {\n            digitsArray.push(\"1\");\n        }\n\n        return digitsArray.reverse().join(\"\");\n    }\n\n    // cachedNumberFormat\n    // Returns an `Intl.NumberFormat` instance for the given locale and configuration.\n    // On first use of a particular configuration, the instance is cached for fast\n    // repeat access.\n    function cachedNumberFormat(locale, options) {\n        // Create a sorted, stringified version of `options`\n        // for use as part of the cache key\n        var optionsString = map(\n            keys(options).sort(),\n            function(key) {\n                return key + ':' + options[key];\n            }\n        ).join(',');\n\n        // Set our cache key\n        var cacheKey = locale + '+' + optionsString;\n\n        // If we don't have this configuration cached, configure and cache it\n        if (!cachedNumberFormat.cache[cacheKey]) {\n            cachedNumberFormat.cache[cacheKey] = Intl.NumberFormat(locale, options);\n        }\n\n        // Return the cached version of this configuration\n        return cachedNumberFormat.cache[cacheKey];\n    }\n    cachedNumberFormat.cache = {};\n\n    // formatNumber\n    // Formats any number greater than or equal to zero using these options:\n    // - userLocale\n    // - useToLocaleString\n    // - useGrouping\n    // - grouping\n    // - maximumSignificantDigits\n    // - minimumIntegerDigits\n    // - fractionDigits\n    // - groupingSeparator\n    // - decimalSeparator\n    //\n    // `useToLocaleString` will use `Intl.NumberFormat` or `toLocaleString` for formatting.\n    // `userLocale` option is passed through to the formatting function.\n    // `fractionDigits` is passed through to `maximumFractionDigits` and `minimumFractionDigits`\n    // Using `maximumSignificantDigits` will override `minimumIntegerDigits` and `fractionDigits`.\n    function formatNumber(number, options, userLocale) {\n        var useToLocaleString = options.useToLocaleString;\n        var useGrouping = options.useGrouping;\n        var grouping = useGrouping && options.grouping.slice();\n        var maximumSignificantDigits = options.maximumSignificantDigits;\n        var minimumIntegerDigits = options.minimumIntegerDigits || 1;\n        var fractionDigits = options.fractionDigits || 0;\n        var groupingSeparator = options.groupingSeparator;\n        var decimalSeparator = options.decimalSeparator;\n\n        if (useToLocaleString && userLocale) {\n            var localeStringOptions = {\n                minimumIntegerDigits: minimumIntegerDigits,\n                useGrouping: useGrouping\n            };\n\n            if (fractionDigits) {\n                localeStringOptions.maximumFractionDigits = fractionDigits;\n                localeStringOptions.minimumFractionDigits = fractionDigits;\n            }\n\n            // toLocaleString output is \"0.0\" instead of \"0\" for HTC browsers\n            // when maximumSignificantDigits is set. See #96.\n            if (maximumSignificantDigits && number > 0) {\n                localeStringOptions.maximumSignificantDigits = maximumSignificantDigits;\n            }\n\n            if (intlNumberFormatWorks) {\n                if (!intlNumberFormatRoundingWorks) {\n                    var roundingOptions = extend({}, options);\n                    roundingOptions.useGrouping = false;\n                    roundingOptions.decimalSeparator = \".\";\n                    number = parseFloat(formatNumber(number, roundingOptions), 10);\n                }\n\n                return cachedNumberFormat(userLocale, localeStringOptions).format(number);\n            } else {\n                if (!toLocaleStringRoundingWorks) {\n                    var roundingOptions = extend({}, options);\n                    roundingOptions.useGrouping = false;\n                    roundingOptions.decimalSeparator = \".\";\n                    number = parseFloat(formatNumber(number, roundingOptions), 10);\n                }\n\n                return number.toLocaleString(userLocale, localeStringOptions);\n            }\n        }\n\n        var numberString;\n\n        // Add 1 to digit output length for floating point errors workaround. See below.\n        if (maximumSignificantDigits) {\n            numberString = number.toPrecision(maximumSignificantDigits + 1);\n        } else {\n            numberString = number.toFixed(fractionDigits + 1);\n        }\n\n        var integerString;\n        var fractionString;\n        var exponentString;\n\n        var temp = numberString.split(\"e\");\n\n        exponentString = temp[1] || \"\";\n\n        temp = temp[0].split(\".\");\n\n        fractionString = temp[1] || \"\";\n        integerString = temp[0] || \"\";\n\n        // Workaround for floating point errors in `toFixed` and `toPrecision`.\n        // (3.55).toFixed(1); --> \"3.5\"\n        // (123.55 - 120).toPrecision(2); --> \"3.5\"\n        // (123.55 - 120); --> 3.549999999999997\n        // (123.55 - 120).toFixed(2); --> \"3.55\"\n        // Round by examing the string output of the next digit.\n\n        // *************** Implement String Rounding here ***********************\n        // Check integerString + fractionString length of toPrecision before rounding.\n        // Check length of fractionString from toFixed output before rounding.\n        var integerLength = integerString.length;\n        var fractionLength = fractionString.length;\n        var digitCount = integerLength + fractionLength;\n        var digits = integerString + fractionString;\n\n        if (maximumSignificantDigits && digitCount === (maximumSignificantDigits + 1) || !maximumSignificantDigits && fractionLength === (fractionDigits + 1)) {\n            // Round digits.\n            digits = stringRound(digits);\n\n            if (digits.length === digitCount + 1) {\n                integerLength = integerLength + 1;\n            }\n\n            // Discard final fractionDigit.\n            if (fractionLength) {\n                digits = digits.slice(0, -1);\n            }\n\n            // Separate integer and fraction.\n            integerString = digits.slice(0, integerLength);\n            fractionString = digits.slice(integerLength);\n        }\n\n        // Trim trailing zeroes from fractionString because toPrecision outputs\n        // precision, not significant digits.\n        if (maximumSignificantDigits) {\n            fractionString = fractionString.replace(/0*$/, \"\");\n        }\n\n        // Handle exponent.\n        var exponent = parseInt(exponentString, 10);\n\n        if (exponent > 0) {\n            if (fractionString.length <= exponent) {\n                fractionString = fractionString + repeatZero(exponent - fractionString.length);\n\n                integerString = integerString + fractionString;\n                fractionString = \"\";\n            } else {\n                integerString = integerString + fractionString.slice(0, exponent);\n                fractionString = fractionString.slice(exponent);\n            }\n        } else if (exponent < 0) {\n            fractionString = (repeatZero(Math.abs(exponent) - integerString.length) + integerString + fractionString);\n\n            integerString = \"0\";\n        }\n\n        if (!maximumSignificantDigits) {\n            // Trim or pad fraction when not using maximumSignificantDigits.\n            fractionString = fractionString.slice(0, fractionDigits);\n\n            if (fractionString.length < fractionDigits) {\n                fractionString = fractionString + repeatZero(fractionDigits - fractionString.length);\n            }\n\n            // Pad integer when using minimumIntegerDigits\n            // and not using maximumSignificantDigits.\n            if (integerString.length < minimumIntegerDigits) {\n                integerString = repeatZero(minimumIntegerDigits - integerString.length) + integerString;\n            }\n        }\n\n        var formattedString = \"\";\n\n        // Handle grouping.\n        if (useGrouping) {\n            temp = integerString;\n            var group;\n\n            while (temp.length) {\n                if (grouping.length) {\n                    group = grouping.shift();\n                }\n\n                if (formattedString) {\n                    formattedString = groupingSeparator + formattedString;\n                }\n\n                formattedString = temp.slice(-group) + formattedString;\n\n                temp = temp.slice(0, -group);\n            }\n        } else {\n            formattedString = integerString;\n        }\n\n        // Add decimalSeparator and fraction.\n        if (fractionString) {\n            formattedString = formattedString + decimalSeparator + fractionString;\n        }\n\n        return formattedString;\n    }\n\n    // durationLabelCompare\n    function durationLabelCompare(a, b) {\n        if (a.label.length > b.label.length) {\n            return -1;\n        }\n\n        if (a.label.length < b.label.length) {\n            return 1;\n        }\n\n        // a must be equal to b\n        return 0;\n    }\n\n    // durationGetLabels\n    function durationGetLabels(token, localeData) {\n        var labels = [];\n\n        each(keys(localeData), function (localeDataKey) {\n            if (localeDataKey.slice(0, 15) !== \"_durationLabels\") {\n                return;\n            }\n\n            var labelType = localeDataKey.slice(15).toLowerCase();\n\n            each(keys(localeData[localeDataKey]), function (labelKey) {\n                if (labelKey.slice(0, 1) === token) {\n                    labels.push({\n                        type: labelType,\n                        key: labelKey,\n                        label: localeData[localeDataKey][labelKey]\n                    });\n                }\n            });\n        });\n\n        return labels;\n    }\n\n    // durationPluralKey\n    function durationPluralKey(token, integerValue, decimalValue) {\n        // Singular for a value of `1`, but not for `1.0`.\n        if (integerValue === 1 && decimalValue === null) {\n            return token;\n        }\n\n        return token + token;\n    }\n\n    var engLocale = {\n        durationLabelsStandard: {\n            S: 'millisecond',\n            SS: 'milliseconds',\n            s: 'second',\n            ss: 'seconds',\n            m: 'minute',\n            mm: 'minutes',\n            h: 'hour',\n            hh: 'hours',\n            d: 'day',\n            dd: 'days',\n            w: 'week',\n            ww: 'weeks',\n            M: 'month',\n            MM: 'months',\n            y: 'year',\n            yy: 'years'\n        },\n        durationLabelsShort: {\n            S: 'msec',\n            SS: 'msecs',\n            s: 'sec',\n            ss: 'secs',\n            m: 'min',\n            mm: 'mins',\n            h: 'hr',\n            hh: 'hrs',\n            d: 'dy',\n            dd: 'dys',\n            w: 'wk',\n            ww: 'wks',\n            M: 'mo',\n            MM: 'mos',\n            y: 'yr',\n            yy: 'yrs'\n        },\n        durationTimeTemplates: {\n            HMS: 'h:mm:ss',\n            HM: 'h:mm',\n            MS: 'm:ss'\n        },\n        durationLabelTypes: [\n            { type: \"standard\", string: \"__\" },\n            { type: \"short\", string: \"_\" }\n        ],\n        durationPluralKey: durationPluralKey\n    };\n\n    // isArray\n    function isArray(array) {\n        return Object.prototype.toString.call(array) === \"[object Array]\";\n    }\n\n    // isObject\n    function isObject(obj) {\n        return Object.prototype.toString.call(obj) === \"[object Object]\";\n    }\n\n    // findLast\n    function findLast(array, callback) {\n        var index = array.length;\n\n        while (index -= 1) {\n            if (callback(array[index])) { return array[index]; }\n        }\n    }\n\n    // find\n    function find(array, callback) {\n        var index = 0;\n\n        var max = array && array.length || 0;\n\n        var match;\n\n        if (typeof callback !== \"function\") {\n            match = callback;\n            callback = function (item) {\n                return item === match;\n            };\n        }\n\n        while (index < max) {\n            if (callback(array[index])) { return array[index]; }\n            index += 1;\n        }\n    }\n\n    // each\n    function each(array, callback) {\n        var index = 0,\n            max = array.length;\n\n        if (!array || !max) { return; }\n\n        while (index < max) {\n            if (callback(array[index], index) === false) { return; }\n            index += 1;\n        }\n    }\n\n    // map\n    function map(array, callback) {\n        var index = 0,\n            max = array.length,\n            ret = [];\n\n        if (!array || !max) { return ret; }\n\n        while (index < max) {\n            ret[index] = callback(array[index], index);\n            index += 1;\n        }\n\n        return ret;\n    }\n\n    // pluck\n    function pluck(array, prop) {\n        return map(array, function (item) {\n            return item[prop];\n        });\n    }\n\n    // compact\n    function compact(array) {\n        var ret = [];\n\n        each(array, function (item) {\n            if (item) { ret.push(item); }\n        });\n\n        return ret;\n    }\n\n    // unique\n    function unique(array) {\n        var ret = [];\n\n        each(array, function (_a) {\n            if (!find(ret, _a)) { ret.push(_a); }\n        });\n\n        return ret;\n    }\n\n    // intersection\n    function intersection(a, b) {\n        var ret = [];\n\n        each(a, function (_a) {\n            each(b, function (_b) {\n                if (_a === _b) { ret.push(_a); }\n            });\n        });\n\n        return unique(ret);\n    }\n\n    // rest\n    function rest(array, callback) {\n        var ret = [];\n\n        each(array, function (item, index) {\n            if (!callback(item)) {\n                ret = array.slice(index);\n                return false;\n            }\n        });\n\n        return ret;\n    }\n\n    // initial\n    function initial(array, callback) {\n        var reversed = array.slice().reverse();\n\n        return rest(reversed, callback).reverse();\n    }\n\n    // extend\n    function extend(a, b) {\n        for (var key in b) {\n            if (b.hasOwnProperty(key)) { a[key] = b[key]; }\n        }\n\n        return a;\n    }\n\n    // keys\n    function keys(a) {\n        var ret = [];\n\n        for (var key in a) {\n            if (a.hasOwnProperty(key)) { ret.push(key); }\n        }\n\n        return ret;\n    }\n\n    // any\n    function any(array, callback) {\n        var index = 0,\n            max = array.length;\n\n        if (!array || !max) { return false; }\n\n        while (index < max) {\n            if (callback(array[index], index) === true) { return true; }\n            index += 1;\n        }\n\n        return false;\n    }\n\n    // flatten\n    function flatten(array) {\n        var ret = [];\n\n        each(array, function(child) {\n            ret = ret.concat(child);\n        });\n\n        return ret;\n    }\n\n    function toLocaleStringSupportsLocales() {\n        var number = 0;\n        try {\n            number.toLocaleString('i');\n        } catch (e) {\n            return e.name === 'RangeError';\n        }\n        return false;\n    }\n\n    function featureTestFormatterRounding(formatter) {\n        return formatter(3.55, \"en\", {\n            useGrouping: false,\n            minimumIntegerDigits: 1,\n            minimumFractionDigits: 1,\n            maximumFractionDigits: 1\n        }) === \"3.6\";\n    }\n\n    function featureTestFormatter(formatter) {\n        var passed = true;\n\n        // Test minimumIntegerDigits.\n        passed = passed && formatter(1, \"en\", { minimumIntegerDigits: 1 }) === \"1\";\n        passed = passed && formatter(1, \"en\", { minimumIntegerDigits: 2 }) === \"01\";\n        passed = passed && formatter(1, \"en\", { minimumIntegerDigits: 3 }) === \"001\";\n        if (!passed) { return false; }\n\n        // Test maximumFractionDigits and minimumFractionDigits.\n        passed = passed && formatter(99.99, \"en\", { maximumFractionDigits: 0, minimumFractionDigits: 0 }) === \"100\";\n        passed = passed && formatter(99.99, \"en\", { maximumFractionDigits: 1, minimumFractionDigits: 1 }) === \"100.0\";\n        passed = passed && formatter(99.99, \"en\", { maximumFractionDigits: 2, minimumFractionDigits: 2 }) === \"99.99\";\n        passed = passed && formatter(99.99, \"en\", { maximumFractionDigits: 3, minimumFractionDigits: 3 }) === \"99.990\";\n        if (!passed) { return false; }\n\n        // Test maximumSignificantDigits.\n        passed = passed && formatter(99.99, \"en\", { maximumSignificantDigits: 1 }) === \"100\";\n        passed = passed && formatter(99.99, \"en\", { maximumSignificantDigits: 2 }) === \"100\";\n        passed = passed && formatter(99.99, \"en\", { maximumSignificantDigits: 3 }) === \"100\";\n        passed = passed && formatter(99.99, \"en\", { maximumSignificantDigits: 4 }) === \"99.99\";\n        passed = passed && formatter(99.99, \"en\", { maximumSignificantDigits: 5 }) === \"99.99\";\n        if (!passed) { return false; }\n\n        // Test grouping.\n        passed = passed && formatter(1000, \"en\", { useGrouping: true }) === \"1,000\";\n        passed = passed && formatter(1000, \"en\", { useGrouping: false }) === \"1000\";\n        if (!passed) { return false; }\n\n        return true;\n    }\n\n    // durationsFormat(durations [, template] [, precision] [, settings])\n    function durationsFormat() {\n        var args = [].slice.call(arguments);\n        var settings = {};\n        var durations;\n\n        // Parse arguments.\n        each(args, function (arg, index) {\n            if (!index) {\n                if (!isArray(arg)) {\n                    throw \"Expected array as the first argument to durationsFormat.\";\n                }\n\n                durations = arg;\n            }\n\n            if (typeof arg === \"string\" || typeof arg === \"function\") {\n                settings.template = arg;\n                return;\n            }\n\n            if (typeof arg === \"number\") {\n                settings.precision = arg;\n                return;\n            }\n\n            if (isObject(arg)) {\n                extend(settings, arg);\n            }\n        });\n\n        if (!durations || !durations.length) {\n            return [];\n        }\n\n        settings.returnMomentTypes = true;\n\n        var formattedDurations = map(durations, function (dur) {\n            return dur.format(settings);\n        });\n\n        // Merge token types from all durations.\n        var outputTypes = intersection(types, unique(pluck(flatten(formattedDurations), \"type\")));\n\n        var largest = settings.largest;\n\n        if (largest) {\n            outputTypes = outputTypes.slice(0, largest);\n        }\n\n        settings.returnMomentTypes = false;\n        settings.outputTypes = outputTypes;\n\n        return map(durations, function (dur) {\n            return dur.format(settings);\n        });\n    }\n\n    // durationFormat([template] [, precision] [, settings])\n    function durationFormat() {\n\n        var args = [].slice.call(arguments);\n        var settings = extend({}, this.format.defaults);\n\n        // Keep a shadow copy of this moment for calculating remainders.\n        // Perform all calculations on positive duration value, handle negative\n        // sign at the very end.\n        var asMilliseconds = this.asMilliseconds();\n        var asMonths = this.asMonths();\n\n        // Treat invalid durations as having a value of 0 milliseconds.\n        if (typeof this.isValid === \"function\" && this.isValid() === false) {\n            asMilliseconds = 0;\n            asMonths = 0;\n        }\n\n        var isNegative = asMilliseconds < 0;\n\n        // Two shadow copies are needed because of the way moment.js handles\n        // duration arithmetic for years/months and for weeks/days/hours/minutes/seconds.\n        var remainder = moment.duration(Math.abs(asMilliseconds), \"milliseconds\");\n        var remainderMonths = moment.duration(Math.abs(asMonths), \"months\");\n\n        // Parse arguments.\n        each(args, function (arg) {\n            if (typeof arg === \"string\" || typeof arg === \"function\") {\n                settings.template = arg;\n                return;\n            }\n\n            if (typeof arg === \"number\") {\n                settings.precision = arg;\n                return;\n            }\n\n            if (isObject(arg)) {\n                extend(settings, arg);\n            }\n        });\n\n        var momentTokens = {\n            years: \"y\",\n            months: \"M\",\n            weeks: \"w\",\n            days: \"d\",\n            hours: \"h\",\n            minutes: \"m\",\n            seconds: \"s\",\n            milliseconds: \"S\"\n        };\n\n        var tokenDefs = {\n            escape: /\\[(.+?)\\]/,\n            years: /\\*?[Yy]+/,\n            months: /\\*?M+/,\n            weeks: /\\*?[Ww]+/,\n            days: /\\*?[Dd]+/,\n            hours: /\\*?[Hh]+/,\n            minutes: /\\*?m+/,\n            seconds: /\\*?s+/,\n            milliseconds: /\\*?S+/,\n            general: /.+?/\n        };\n\n        // Types array is available in the template function.\n        settings.types = types;\n\n        var typeMap = function (token) {\n            return find(types, function (type) {\n                return tokenDefs[type].test(token);\n            });\n        };\n\n        var tokenizer = new RegExp(map(types, function (type) {\n            return tokenDefs[type].source;\n        }).join(\"|\"), \"g\");\n\n        // Current duration object is available in the template function.\n        settings.duration = this;\n\n        // Eval template function and cache template string.\n        var template = typeof settings.template === \"function\" ? settings.template.apply(settings) : settings.template;\n\n        // outputTypes and returnMomentTypes are settings to support durationsFormat().\n\n        // outputTypes is an array of moment token types that determines\n        // the tokens returned in formatted output. This option overrides\n        // trim, largest, stopTrim, etc.\n        var outputTypes = settings.outputTypes;\n\n        // returnMomentTypes is a boolean that sets durationFormat to return\n        // the processed momentTypes instead of formatted output.\n        var returnMomentTypes = settings.returnMomentTypes;\n\n        var largest = settings.largest;\n\n        // Setup stopTrim array of token types.\n        var stopTrim = [];\n\n        if (!outputTypes) {\n            if (isArray(settings.stopTrim)) {\n                settings.stopTrim = settings.stopTrim.join(\"\");\n            }\n\n            // Parse stopTrim string to create token types array.\n            if (settings.stopTrim) {\n                each(settings.stopTrim.match(tokenizer), function (token) {\n                    var type = typeMap(token);\n\n                    if (type === \"escape\" || type === \"general\") {\n                        return;\n                    }\n\n                    stopTrim.push(type);\n                });\n            }\n        }\n\n        // Cache moment's locale data.\n        var localeData = moment.localeData();\n\n        if (!localeData) {\n            localeData = {};\n        }\n\n        // Fall back to this plugin's `eng` extension.\n        each(keys(engLocale), function (key) {\n            if (typeof engLocale[key] === \"function\") {\n                if (!localeData[key]) {\n                    localeData[key] = engLocale[key];\n                }\n\n                return;\n            }\n\n            if (!localeData[\"_\" + key]) {\n                localeData[\"_\" + key] = engLocale[key];\n            }\n        });\n\n        // Replace Duration Time Template strings.\n        // For locale `eng`: `_HMS_`, `_HM_`, and `_MS_`.\n        each(keys(localeData._durationTimeTemplates), function (item) {\n            template = template.replace(\"_\" + item + \"_\", localeData._durationTimeTemplates[item]);\n        });\n\n        // Determine user's locale.\n        var userLocale = settings.userLocale || moment.locale();\n\n        var useLeftUnits = settings.useLeftUnits;\n        var usePlural = settings.usePlural;\n        var precision = settings.precision;\n        var forceLength = settings.forceLength;\n        var useGrouping = settings.useGrouping;\n        var trunc = settings.trunc;\n\n        // Use significant digits only when precision is greater than 0.\n        var useSignificantDigits = settings.useSignificantDigits && precision > 0;\n        var significantDigits = useSignificantDigits ? settings.precision : 0;\n        var significantDigitsCache = significantDigits;\n\n        var minValue = settings.minValue;\n        var isMinValue = false;\n\n        var maxValue = settings.maxValue;\n        var isMaxValue = false;\n\n        // formatNumber fallback options.\n        var useToLocaleString = settings.useToLocaleString;\n        var groupingSeparator = settings.groupingSeparator;\n        var decimalSeparator = settings.decimalSeparator;\n        var grouping = settings.grouping;\n\n        useToLocaleString = useToLocaleString && (toLocaleStringWorks || intlNumberFormatWorks);\n\n        // Trim options.\n        var trim = settings.trim;\n\n        if (isArray(trim)) {\n            trim = trim.join(\" \");\n        }\n\n        if (trim === null && (largest || maxValue || useSignificantDigits)) {\n            trim = \"all\";\n        }\n\n        if (trim === null || trim === true || trim === \"left\" || trim === \"right\") {\n            trim = \"large\";\n        }\n\n        if (trim === false) {\n            trim = \"\";\n        }\n\n        var trimIncludes = function (item) {\n            return item.test(trim);\n        };\n\n        var rLarge = /large/;\n        var rSmall = /small/;\n        var rBoth = /both/;\n        var rMid = /mid/;\n        var rAll = /^all|[^sm]all/;\n        var rFinal = /final/;\n\n        var trimLarge = largest > 0 || any([rLarge, rBoth, rAll], trimIncludes);\n        var trimSmall = any([rSmall, rBoth, rAll], trimIncludes);\n        var trimMid = any([rMid, rAll], trimIncludes);\n        var trimFinal = any([rFinal, rAll], trimIncludes);\n\n        // Parse format string to create raw tokens array.\n        var rawTokens = map(template.match(tokenizer), function (token, index) {\n            var type = typeMap(token);\n\n            if (token.slice(0, 1) === \"*\") {\n                token = token.slice(1);\n\n                if (type !== \"escape\" && type !== \"general\") {\n                    stopTrim.push(type);\n                }\n            }\n\n            return {\n                index: index,\n                length: token.length,\n                text: \"\",\n\n                // Replace escaped tokens with the non-escaped token text.\n                token: (type === \"escape\" ? token.replace(tokenDefs.escape, \"$1\") : token),\n\n                // Ignore type on non-moment tokens.\n                type: ((type === \"escape\" || type === \"general\") ? null : type)\n            };\n        });\n\n        // Associate text tokens with moment tokens.\n        var currentToken = {\n            index: 0,\n            length: 0,\n            token: \"\",\n            text: \"\",\n            type: null\n        };\n\n        var tokens = [];\n\n        if (useLeftUnits) {\n            rawTokens.reverse();\n        }\n\n        each(rawTokens, function (token) {\n            if (token.type) {\n                if (currentToken.type || currentToken.text) {\n                    tokens.push(currentToken);\n                }\n\n                currentToken = token;\n\n                return;\n            }\n\n            if (useLeftUnits) {\n                currentToken.text = token.token + currentToken.text;\n            } else {\n                currentToken.text += token.token;\n            }\n        });\n\n        if (currentToken.type || currentToken.text) {\n            tokens.push(currentToken);\n        }\n\n        if (useLeftUnits) {\n            tokens.reverse();\n        }\n\n        // Find unique moment token types in the template in order of\n        // descending magnitude.\n        var momentTypes = intersection(types, unique(compact(pluck(tokens, \"type\"))));\n\n        // Exit early if there are no moment token types.\n        if (!momentTypes.length) {\n            return pluck(tokens, \"text\").join(\"\");\n        }\n\n        // Calculate values for each moment type in the template.\n        // For processing the settings, values are associated with moment types.\n        // Values will be assigned to tokens at the last step in order to\n        // assume nothing about frequency or order of tokens in the template.\n        momentTypes = map(momentTypes, function (momentType, index) {\n            // Is this the least-magnitude moment token found?\n            var isSmallest = ((index + 1) === momentTypes.length);\n\n            // Is this the greatest-magnitude moment token found?\n            var isLargest = (!index);\n\n            // Get the raw value in the current units.\n            var rawValue;\n\n            if (momentType === \"years\" || momentType === \"months\") {\n                rawValue = remainderMonths.as(momentType);\n            } else {\n                rawValue = remainder.as(momentType);\n            }\n\n            var wholeValue = Math.floor(rawValue);\n            var decimalValue = rawValue - wholeValue;\n\n            var token = find(tokens, function (token) {\n                return momentType === token.type;\n            });\n\n            if (isLargest && maxValue && rawValue > maxValue) {\n                isMaxValue = true;\n            }\n\n            if (isSmallest && minValue && Math.abs(settings.duration.as(momentType)) < minValue) {\n                isMinValue = true;\n            }\n\n            // Note the length of the largest-magnitude moment token:\n            // if it is greater than one and forceLength is not set,\n            // then default forceLength to `true`.\n            //\n            // Rationale is this: If the template is \"h:mm:ss\" and the\n            // moment value is 5 minutes, the user-friendly output is\n            // \"5:00\", not \"05:00\". We shouldn't pad the `minutes` token\n            // even though it has length of two if the template is \"h:mm:ss\";\n            //\n            // If the minutes output should always include the leading zero\n            // even when the hour is trimmed then set `{ forceLength: true }`\n            // to output \"05:00\". If the template is \"hh:mm:ss\", the user\n            // clearly wanted everything padded so we should output \"05:00\";\n            //\n            // If the user wants the full padded output, they can use\n            // template \"hh:mm:ss\" and set `{ trim: false }` to output\n            // \"00:05:00\".\n            if (isLargest && forceLength === null && token.length > 1) {\n                forceLength = true;\n            }\n\n            // Update remainder.\n            remainder.subtract(wholeValue, momentType);\n            remainderMonths.subtract(wholeValue, momentType);\n\n            return {\n                rawValue: rawValue,\n                wholeValue: wholeValue,\n                // Decimal value is only retained for the least-magnitude\n                // moment type in the format template.\n                decimalValue: isSmallest ? decimalValue : 0,\n                isSmallest: isSmallest,\n                isLargest: isLargest,\n                type: momentType,\n                // Tokens can appear multiple times in a template string,\n                // but all instances must share the same length.\n                tokenLength: token.length\n            };\n        });\n\n        var truncMethod = trunc ? Math.floor : Math.round;\n        var truncate = function (value, places) {\n            var factor = Math.pow(10, places);\n            return truncMethod(value * factor) / factor;\n        };\n\n        var foundFirst = false;\n        var bubbled = false;\n\n        var formatValue = function (momentType, index) {\n            var formatOptions = {\n                useGrouping: useGrouping,\n                groupingSeparator: groupingSeparator,\n                decimalSeparator: decimalSeparator,\n                grouping: grouping,\n                useToLocaleString: useToLocaleString\n            };\n\n            if (useSignificantDigits) {\n                if (significantDigits <= 0) {\n                    momentType.rawValue = 0;\n                    momentType.wholeValue = 0;\n                    momentType.decimalValue = 0;\n                } else {\n                    formatOptions.maximumSignificantDigits = significantDigits;\n                    momentType.significantDigits = significantDigits;\n                }\n            }\n\n            if (isMaxValue && !bubbled) {\n                if (momentType.isLargest) {\n                    momentType.wholeValue = maxValue;\n                    momentType.decimalValue = 0;\n                } else {\n                    momentType.wholeValue = 0;\n                    momentType.decimalValue = 0;\n                }\n            }\n\n            if (isMinValue && !bubbled) {\n                if (momentType.isSmallest) {\n                    momentType.wholeValue = minValue;\n                    momentType.decimalValue = 0;\n                } else {\n                    momentType.wholeValue = 0;\n                    momentType.decimalValue = 0;\n                }\n            }\n\n            if (momentType.isSmallest || momentType.significantDigits && momentType.significantDigits - momentType.wholeValue.toString().length <= 0) {\n                // Apply precision to least significant token value.\n                if (precision < 0) {\n                    momentType.value = truncate(momentType.wholeValue, precision);\n                } else if (precision === 0) {\n                    momentType.value = truncMethod(momentType.wholeValue + momentType.decimalValue);\n                } else { // precision > 0\n                    if (useSignificantDigits) {\n                        if (trunc) {\n                            momentType.value = truncate(momentType.rawValue, significantDigits - momentType.wholeValue.toString().length);\n                        } else {\n                            momentType.value = momentType.rawValue;\n                        }\n\n                        if (momentType.wholeValue) {\n                            significantDigits -= momentType.wholeValue.toString().length;\n                        }\n                    } else {\n                        formatOptions.fractionDigits = precision;\n\n                        if (trunc) {\n                            momentType.value = momentType.wholeValue + truncate(momentType.decimalValue, precision);\n                        } else {\n                            momentType.value = momentType.wholeValue + momentType.decimalValue;\n                        }\n                    }\n                }\n            } else {\n                if (useSignificantDigits && momentType.wholeValue) {\n                    // Outer Math.round required here to handle floating point errors.\n                    momentType.value = Math.round(truncate(momentType.wholeValue, momentType.significantDigits - momentType.wholeValue.toString().length));\n\n                    significantDigits -= momentType.wholeValue.toString().length;\n                } else {\n                    momentType.value = momentType.wholeValue;\n                }\n            }\n\n            if (momentType.tokenLength > 1 && (forceLength || foundFirst)) {\n                formatOptions.minimumIntegerDigits = momentType.tokenLength;\n\n                if (bubbled && formatOptions.maximumSignificantDigits < momentType.tokenLength) {\n                    delete formatOptions.maximumSignificantDigits;\n                }\n            }\n\n            if (!foundFirst && (momentType.value > 0 || trim === \"\" /* trim: false */ || find(stopTrim, momentType.type) || find(outputTypes, momentType.type))) {\n                foundFirst = true;\n            }\n\n            momentType.formattedValue = formatNumber(momentType.value, formatOptions, userLocale);\n\n            formatOptions.useGrouping = false;\n            formatOptions.decimalSeparator = \".\";\n            momentType.formattedValueEn = formatNumber(momentType.value, formatOptions, \"en\");\n\n            if (momentType.tokenLength === 2 && momentType.type === \"milliseconds\") {\n                momentType.formattedValueMS = formatNumber(momentType.value, {\n                    minimumIntegerDigits: 3,\n                    useGrouping: false\n                }, \"en\").slice(0, 2);\n            }\n\n            return momentType;\n        };\n\n        // Calculate formatted values.\n        momentTypes = map(momentTypes, formatValue);\n        momentTypes = compact(momentTypes);\n\n        // Bubble rounded values.\n        if (momentTypes.length > 1) {\n            var findType = function (type) {\n                return find(momentTypes, function (momentType) {\n                    return momentType.type === type;\n                });\n            };\n\n            var bubbleTypes = function (bubble) {\n                var bubbleMomentType = findType(bubble.type);\n\n                if (!bubbleMomentType) {\n                    return;\n                }\n\n                each(bubble.targets, function (target) {\n                    var targetMomentType = findType(target.type);\n\n                    if (!targetMomentType) {\n                        return;\n                    }\n\n                    if (parseInt(bubbleMomentType.formattedValueEn, 10) === target.value) {\n                        bubbleMomentType.rawValue = 0;\n                        bubbleMomentType.wholeValue = 0;\n                        bubbleMomentType.decimalValue = 0;\n                        targetMomentType.rawValue += 1;\n                        targetMomentType.wholeValue += 1;\n                        targetMomentType.decimalValue = 0;\n                        targetMomentType.formattedValueEn = targetMomentType.wholeValue.toString();\n                        bubbled = true;\n                    }\n                });\n            };\n\n            each(bubbles, bubbleTypes);\n        }\n\n        // Recalculate formatted values.\n        if (bubbled) {\n            foundFirst = false;\n            significantDigits = significantDigitsCache;\n            momentTypes = map(momentTypes, formatValue);\n            momentTypes = compact(momentTypes);\n        }\n\n        if (outputTypes && !(isMaxValue && !settings.trim)) {\n            momentTypes = map(momentTypes, function (momentType) {\n                if (find(outputTypes, function (outputType) {\n                    return momentType.type === outputType;\n                })) {\n                    return momentType;\n                }\n\n                return null;\n            });\n\n            momentTypes = compact(momentTypes);\n        } else {\n            // Trim Large.\n            if (trimLarge) {\n                momentTypes = rest(momentTypes, function (momentType) {\n                    // Stop trimming on:\n                    // - the smallest moment type\n                    // - a type marked for stopTrim\n                    // - a type that has a whole value\n                    return !momentType.isSmallest && !momentType.wholeValue && !find(stopTrim, momentType.type);\n                });\n            }\n\n            // Largest.\n            if (largest && momentTypes.length) {\n                momentTypes = momentTypes.slice(0, largest);\n            }\n\n            // Trim Small.\n            if (trimSmall && momentTypes.length > 1) {\n                momentTypes = initial(momentTypes, function (momentType) {\n                    // Stop trimming on:\n                    // - a type marked for stopTrim\n                    // - a type that has a whole value\n                    // - the largest momentType\n                    return !momentType.wholeValue && !find(stopTrim, momentType.type) && !momentType.isLargest;\n                });\n            }\n\n            // Trim Mid.\n            if (trimMid) {\n                momentTypes = map(momentTypes, function (momentType, index) {\n                    if (index > 0 && index < momentTypes.length - 1 && !momentType.wholeValue) {\n                        return null;\n                    }\n\n                    return momentType;\n                });\n\n                momentTypes = compact(momentTypes);\n            }\n\n            // Trim Final.\n            if (trimFinal && momentTypes.length === 1 && !momentTypes[0].wholeValue && !(!trunc && momentTypes[0].isSmallest && momentTypes[0].rawValue < minValue)) {\n                momentTypes = [];\n            }\n        }\n\n        if (returnMomentTypes) {\n            return momentTypes;\n        }\n\n        // Localize and pluralize unit labels.\n        each(tokens, function (token) {\n            var key = momentTokens[token.type];\n\n            var momentType = find(momentTypes, function (momentType) {\n                return momentType.type === token.type;\n            });\n\n            if (!key || !momentType) {\n                return;\n            }\n\n            var values = momentType.formattedValueEn.split(\".\");\n\n            values[0] = parseInt(values[0], 10);\n\n            if (values[1]) {\n                values[1] = parseFloat(\"0.\" + values[1], 10);\n            } else {\n                values[1] = null;\n            }\n\n            var pluralKey = localeData.durationPluralKey(key, values[0], values[1]);\n\n            var labels = durationGetLabels(key, localeData);\n\n            var autoLocalized = false;\n\n            var pluralizedLabels = {};\n\n            // Auto-Localized unit labels.\n            each(localeData._durationLabelTypes, function (labelType) {\n                var label = find(labels, function (label) {\n                    return label.type === labelType.type && label.key === pluralKey;\n                });\n\n                if (label) {\n                    pluralizedLabels[label.type] = label.label;\n\n                    if (stringIncludes(token.text, labelType.string)) {\n                        token.text = token.text.replace(labelType.string, label.label);\n                        autoLocalized = true;\n                    }\n                }\n            });\n\n            // Auto-pluralized unit labels.\n            if (usePlural && !autoLocalized) {\n                labels.sort(durationLabelCompare);\n\n                each(labels, function (label) {\n                    if (pluralizedLabels[label.type] === label.label) {\n                        if (stringIncludes(token.text, label.label)) {\n                            // Stop checking this token if its label is already\n                            // correctly pluralized.\n                            return false;\n                        }\n\n                        // Skip this label if it is correct, but not present in\n                        // the token's text.\n                        return;\n                    }\n\n                    if (stringIncludes(token.text, label.label)) {\n                        // Replece this token's label and stop checking.\n                        token.text = token.text.replace(label.label, pluralizedLabels[label.type]);\n                        return false;\n                    }\n                });\n            }\n        });\n\n        // Build ouptut.\n        tokens = map(tokens, function (token) {\n            if (!token.type) {\n                return token.text;\n            }\n\n            var momentType = find(momentTypes, function (momentType) {\n                return momentType.type === token.type;\n            });\n\n            if (!momentType) {\n                return \"\";\n            }\n\n            var out = \"\";\n\n            if (useLeftUnits) {\n                out += token.text;\n            }\n\n            if (isNegative && isMaxValue || !isNegative && isMinValue) {\n                out += \"< \";\n                isMaxValue = false;\n                isMinValue = false;\n            }\n\n            if (isNegative && isMinValue || !isNegative && isMaxValue) {\n                out += \"> \";\n                isMaxValue = false;\n                isMinValue = false;\n            }\n\n            if (isNegative && (momentType.value > 0 || trim === \"\" || find(stopTrim, momentType.type) || find(outputTypes, momentType.type))) {\n                out += \"-\";\n                isNegative = false;\n            }\n\n            if (token.type === \"milliseconds\" && momentType.formattedValueMS) {\n                out += momentType.formattedValueMS;\n            } else {\n                out += momentType.formattedValue;\n            }\n\n            if (!useLeftUnits) {\n                out += token.text;\n            }\n\n            return out;\n        });\n\n        // Trim leading and trailing comma, space, colon, and dot.\n        return tokens.join(\"\").replace(/(,| |:|\\.)*$/, \"\").replace(/^(,| |:|\\.)*/, \"\");\n    }\n\n    // defaultFormatTemplate\n    function defaultFormatTemplate() {\n        var dur = this.duration;\n\n        var findType = function findType(type) {\n            return dur._data[type];\n        };\n\n        var firstType = find(this.types, findType);\n\n        var lastType = findLast(this.types, findType);\n\n        // Default template strings for each duration dimension type.\n        switch (firstType) {\n            case \"milliseconds\":\n                return \"S __\";\n            case \"seconds\": // Fallthrough.\n            case \"minutes\":\n                return \"*_MS_\";\n            case \"hours\":\n                return \"_HMS_\";\n            case \"days\": // Possible Fallthrough.\n                if (firstType === lastType) {\n                    return \"d __\";\n                }\n            case \"weeks\":\n                if (firstType === lastType) {\n                    return \"w __\";\n                }\n\n                if (this.trim === null) {\n                    this.trim = \"both\";\n                }\n\n                return \"w __, d __, h __\";\n            case \"months\": // Possible Fallthrough.\n                if (firstType === lastType) {\n                    return \"M __\";\n                }\n            case \"years\":\n                if (firstType === lastType) {\n                    return \"y __\";\n                }\n\n                if (this.trim === null) {\n                    this.trim = \"both\";\n                }\n\n                return \"y __, M __, d __\";\n            default:\n                if (this.trim === null) {\n                    this.trim = \"both\";\n                }\n\n                return \"y __, d __, h __, m __, s __\";\n        }\n    }\n\n    // init\n    function init(context) {\n        if (!context) {\n            throw \"Moment Duration Format init cannot find moment instance.\";\n        }\n\n        context.duration.format = durationsFormat;\n        context.duration.fn.format = durationFormat;\n\n        context.duration.fn.format.defaults = {\n            // Many options are defaulted to `null` to distinguish between\n            // 'not set' and 'set to `false`'\n\n            // trim\n            // Can be a string, a delimited list of strings, an array of strings,\n            // or a boolean.\n            // \"large\" - will trim largest-magnitude zero-value tokens until\n            // finding a token with a value, a token identified as 'stopTrim', or\n            // the final token of the format string.\n            // \"small\" - will trim smallest-magnitude zero-value tokens until\n            // finding a token with a value, a token identified as 'stopTrim', or\n            // the final token of the format string.\n            // \"both\" - will execute \"large\" trim then \"small\" trim.\n            // \"mid\" - will trim any zero-value tokens that are not the first or\n            // last tokens. Usually used in conjunction with \"large\" or \"both\".\n            // e.g. \"large mid\" or \"both mid\".\n            // \"final\" - will trim the final token if it is zero-value. Use this\n            // option with \"large\" or \"both\" to output an empty string when\n            // formatting a zero-value duration. e.g. \"large final\" or \"both final\".\n            // \"all\" - Will trim all zero-value tokens. Shorthand for \"both mid final\".\n            // \"left\" - maps to \"large\" to support plugin's version 1 API.\n            // \"right\" - maps to \"large\" to support plugin's version 1 API.\n            // `false` - template tokens are not trimmed.\n            // `true` - treated as \"large\".\n            // `null` - treated as \"large\".\n            trim: null,\n\n            // stopTrim\n            // A moment token string, a delimited set of moment token strings,\n            // or an array of moment token strings. Trimming will stop when a token\n            // listed in this option is reached. A \"*\" character in the format\n            // template string will also mark a moment token as stopTrim.\n            // e.g. \"d [days] *h:mm:ss\" will always stop trimming at the 'hours' token.\n            stopTrim: null,\n\n            // largest\n            // Set to a positive integer to output only the \"n\" largest-magnitude\n            // moment tokens that have a value. All lesser-magnitude moment tokens\n            // will be ignored. This option takes effect even if `trim` is set\n            // to `false`.\n            largest: null,\n\n            // maxValue\n            // Use `maxValue` to render generalized output for large duration values,\n            // e.g. `\"> 60 days\"`. `maxValue` must be a positive integer and is\n            /// applied to the greatest-magnitude moment token in the format template.\n            maxValue: null,\n\n            // minValue\n            // Use `minValue` to render generalized output for small duration values,\n            // e.g. `\"< 5 minutes\"`. `minValue` must be a positive integer and is\n            // applied to the least-magnitude moment token in the format template.\n            minValue: null,\n\n            // precision\n            // If a positive integer, number of decimal fraction digits to render.\n            // If a negative integer, number of integer place digits to truncate to 0.\n            // If `useSignificantDigits` is set to `true` and `precision` is a positive\n            // integer, sets the maximum number of significant digits used in the\n            // formatted output.\n            precision: 0,\n\n            // trunc\n            // Default behavior rounds final token value. Set to `true` to\n            // truncate final token value, which was the default behavior in\n            // version 1 of this plugin.\n            trunc: false,\n\n            // forceLength\n            // Force first moment token with a value to render at full length\n            // even when template is trimmed and first moment token has length of 1.\n            forceLength: null,\n\n            // userLocale\n            // Formatted numerical output is rendered using `toLocaleString`\n            // and the locale of the user's environment. Set this option to render\n            // numerical output using a different locale. Unit names are rendered\n            // and detected using the locale set in moment.js, which can be different\n            // from the locale of user's environment.\n            userLocale: null,\n\n            // usePlural\n            // Will automatically singularize or pluralize unit names when they\n            // appear in the text associated with each moment token. Standard and\n            // short unit labels are singularized and pluralized, based on locale.\n            // e.g. in english, \"1 second\" or \"1 sec\" would be rendered instead\n            // of \"1 seconds\" or \"1 secs\". The default pluralization function\n            // renders a plural label for a value with decimal precision.\n            // e.g. \"1.0 seconds\" is never rendered as \"1.0 second\".\n            // Label types and pluralization function are configurable in the\n            // localeData extensions.\n            usePlural: true,\n\n            // useLeftUnits\n            // The text to the right of each moment token in a format string\n            // is treated as that token's units for the purposes of trimming,\n            // singularizing, and auto-localizing.\n            // e.g. \"h [hours], m [minutes], s [seconds]\".\n            // To properly singularize or localize a format string such as\n            // \"[hours] h, [minutes] m, [seconds] s\", where the units appear\n            // to the left of each moment token, set useLeftUnits to `true`.\n            // This plugin is not tested in the context of rtl text.\n            useLeftUnits: false,\n\n            // useGrouping\n            // Enables locale-based digit grouping in the formatted output. See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString\n            useGrouping: true,\n\n            // useSignificantDigits\n            // Treat the `precision` option as the maximum significant digits\n            // to be rendered. Precision must be a positive integer. Significant\n            // digits extend across unit types,\n            // e.g. \"6 hours 37.5 minutes\" represents 4 significant digits.\n            // Enabling this option causes token length to be ignored. See  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString\n            useSignificantDigits: false,\n\n            // template\n            // The template string used to format the duration. May be a function\n            // or a string. Template functions are executed with the `this` binding\n            // of the settings object so that template strings may be dynamically\n            // generated based on the duration object (accessible via `this.duration`)\n            // or any of the other settings. Leading and trailing space, comma,\n            // period, and colon characters are trimmed from the resulting string.\n            template: defaultFormatTemplate,\n\n            // useToLocaleString\n            // Set this option to `false` to ignore the `toLocaleString` feature\n            // test and force the use of the `formatNumber` fallback function\n            // included in this plugin.\n            useToLocaleString: true,\n\n            // formatNumber fallback options.\n            // When `toLocaleString` is detected and passes the feature test, the\n            // following options will have no effect: `toLocaleString` will be used\n            // for formatting and the grouping separator, decimal separator, and\n            // integer digit grouping will be determined by the user locale.\n\n            // groupingSeparator\n            // The integer digit grouping separator used when using the fallback\n            // formatNumber function.\n            groupingSeparator: \",\",\n\n            // decimalSeparator\n            // The decimal separator used when using the fallback formatNumber\n            // function.\n            decimalSeparator: \".\",\n\n            // grouping\n            // The integer digit grouping used when using the fallback formatNumber\n            // function. Must be an array. The default value of `[3]` gives the\n            // standard 3-digit thousand/million/billion digit groupings for the\n            // \"en\" locale. Setting this option to `[3, 2]` would generate the\n            // thousand/lakh/crore digit groupings used in the \"en-IN\" locale.\n            grouping: [3]\n        };\n\n        context.updateLocale('en', engLocale);\n    }\n\n    // Run feature tests for `Number#toLocaleString`.\n    var toLocaleStringFormatter = function(number, locale, options) {\n        return number.toLocaleString(locale, options);\n    };\n\n    toLocaleStringWorks = toLocaleStringSupportsLocales() && featureTestFormatter(toLocaleStringFormatter);\n    toLocaleStringRoundingWorks = toLocaleStringWorks && featureTestFormatterRounding(toLocaleStringFormatter);\n\n    // Run feature tests for `Intl.NumberFormat#format`.\n    var intlNumberFormatFormatter = function(number, locale, options) {\n        if (typeof window !== 'undefined' && window && window.Intl && window.Intl.NumberFormat) {\n            return window.Intl.NumberFormat(locale, options).format(number);\n        }\n    };\n\n    intlNumberFormatWorks = featureTestFormatter(intlNumberFormatFormatter);\n    intlNumberFormatRoundingWorks = intlNumberFormatWorks && featureTestFormatterRounding(intlNumberFormatFormatter);\n\n    // Initialize duration format on the global moment instance.\n    init(moment);\n\n    // Return the init function so that duration format can be\n    // initialized on other moment instances.\n    return init;\n});\n",
    "// .dirname, .basename, and .extname methods are extracted from Node.js v8.11.1,\n// backported and transplited with Babel, with backwards-compat fixes\n\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// resolves . and .. elements in a path array with directory names there\n// must be no slashes, empty elements, or device names (c:\\) in the array\n// (so also no leading and trailing slashes - it does not distinguish\n// relative and absolute paths)\nfunction normalizeArray(parts, allowAboveRoot) {\n  // if the path tries to go above the root, `up` ends up > 0\n  var up = 0;\n  for (var i = parts.length - 1; i >= 0; i--) {\n    var last = parts[i];\n    if (last === '.') {\n      parts.splice(i, 1);\n    } else if (last === '..') {\n      parts.splice(i, 1);\n      up++;\n    } else if (up) {\n      parts.splice(i, 1);\n      up--;\n    }\n  }\n\n  // if the path is allowed to go above the root, restore leading ..s\n  if (allowAboveRoot) {\n    for (; up--; up) {\n      parts.unshift('..');\n    }\n  }\n\n  return parts;\n}\n\n// path.resolve([from ...], to)\n// posix version\nexports.resolve = function() {\n  var resolvedPath = '',\n      resolvedAbsolute = false;\n\n  for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n    var path = (i >= 0) ? arguments[i] : process.cwd();\n\n    // Skip empty and invalid entries\n    if (typeof path !== 'string') {\n      throw new TypeError('Arguments to path.resolve must be strings');\n    } else if (!path) {\n      continue;\n    }\n\n    resolvedPath = path + '/' + resolvedPath;\n    resolvedAbsolute = path.charAt(0) === '/';\n  }\n\n  // At this point the path should be resolved to a full absolute path, but\n  // handle relative paths to be safe (might happen when process.cwd() fails)\n\n  // Normalize the path\n  resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {\n    return !!p;\n  }), !resolvedAbsolute).join('/');\n\n  return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n};\n\n// path.normalize(path)\n// posix version\nexports.normalize = function(path) {\n  var isAbsolute = exports.isAbsolute(path),\n      trailingSlash = substr(path, -1) === '/';\n\n  // Normalize the path\n  path = normalizeArray(filter(path.split('/'), function(p) {\n    return !!p;\n  }), !isAbsolute).join('/');\n\n  if (!path && !isAbsolute) {\n    path = '.';\n  }\n  if (path && trailingSlash) {\n    path += '/';\n  }\n\n  return (isAbsolute ? '/' : '') + path;\n};\n\n// posix version\nexports.isAbsolute = function(path) {\n  return path.charAt(0) === '/';\n};\n\n// posix version\nexports.join = function() {\n  var paths = Array.prototype.slice.call(arguments, 0);\n  return exports.normalize(filter(paths, function(p, index) {\n    if (typeof p !== 'string') {\n      throw new TypeError('Arguments to path.join must be strings');\n    }\n    return p;\n  }).join('/'));\n};\n\n\n// path.relative(from, to)\n// posix version\nexports.relative = function(from, to) {\n  from = exports.resolve(from).substr(1);\n  to = exports.resolve(to).substr(1);\n\n  function trim(arr) {\n    var start = 0;\n    for (; start < arr.length; start++) {\n      if (arr[start] !== '') break;\n    }\n\n    var end = arr.length - 1;\n    for (; end >= 0; end--) {\n      if (arr[end] !== '') break;\n    }\n\n    if (start > end) return [];\n    return arr.slice(start, end - start + 1);\n  }\n\n  var fromParts = trim(from.split('/'));\n  var toParts = trim(to.split('/'));\n\n  var length = Math.min(fromParts.length, toParts.length);\n  var samePartsLength = length;\n  for (var i = 0; i < length; i++) {\n    if (fromParts[i] !== toParts[i]) {\n      samePartsLength = i;\n      break;\n    }\n  }\n\n  var outputParts = [];\n  for (var i = samePartsLength; i < fromParts.length; i++) {\n    outputParts.push('..');\n  }\n\n  outputParts = outputParts.concat(toParts.slice(samePartsLength));\n\n  return outputParts.join('/');\n};\n\nexports.sep = '/';\nexports.delimiter = ':';\n\nexports.dirname = function (path) {\n  if (typeof path !== 'string') path = path + '';\n  if (path.length === 0) return '.';\n  var code = path.charCodeAt(0);\n  var hasRoot = code === 47 /*/*/;\n  var end = -1;\n  var matchedSlash = true;\n  for (var i = path.length - 1; i >= 1; --i) {\n    code = path.charCodeAt(i);\n    if (code === 47 /*/*/) {\n        if (!matchedSlash) {\n          end = i;\n          break;\n        }\n      } else {\n      // We saw the first non-path separator\n      matchedSlash = false;\n    }\n  }\n\n  if (end === -1) return hasRoot ? '/' : '.';\n  if (hasRoot && end === 1) {\n    // return '//';\n    // Backwards-compat fix:\n    return '/';\n  }\n  return path.slice(0, end);\n};\n\nfunction basename(path) {\n  if (typeof path !== 'string') path = path + '';\n\n  var start = 0;\n  var end = -1;\n  var matchedSlash = true;\n  var i;\n\n  for (i = path.length - 1; i >= 0; --i) {\n    if (path.charCodeAt(i) === 47 /*/*/) {\n        // If we reached a path separator that was not part of a set of path\n        // separators at the end of the string, stop now\n        if (!matchedSlash) {\n          start = i + 1;\n          break;\n        }\n      } else if (end === -1) {\n      // We saw the first non-path separator, mark this as the end of our\n      // path component\n      matchedSlash = false;\n      end = i + 1;\n    }\n  }\n\n  if (end === -1) return '';\n  return path.slice(start, end);\n}\n\n// Uses a mixed approach for backwards-compatibility, as ext behavior changed\n// in new Node.js versions, so only basename() above is backported here\nexports.basename = function (path, ext) {\n  var f = basename(path);\n  if (ext && f.substr(-1 * ext.length) === ext) {\n    f = f.substr(0, f.length - ext.length);\n  }\n  return f;\n};\n\nexports.extname = function (path) {\n  if (typeof path !== 'string') path = path + '';\n  var startDot = -1;\n  var startPart = 0;\n  var end = -1;\n  var matchedSlash = true;\n  // Track the state of characters (if any) we see before our first dot and\n  // after any path separator we find\n  var preDotState = 0;\n  for (var i = path.length - 1; i >= 0; --i) {\n    var code = path.charCodeAt(i);\n    if (code === 47 /*/*/) {\n        // If we reached a path separator that was not part of a set of path\n        // separators at the end of the string, stop now\n        if (!matchedSlash) {\n          startPart = i + 1;\n          break;\n        }\n        continue;\n      }\n    if (end === -1) {\n      // We saw the first non-path separator, mark this as the end of our\n      // extension\n      matchedSlash = false;\n      end = i + 1;\n    }\n    if (code === 46 /*.*/) {\n        // If this is our first dot, mark it as the start of our extension\n        if (startDot === -1)\n          startDot = i;\n        else if (preDotState !== 1)\n          preDotState = 1;\n    } else if (startDot !== -1) {\n      // We saw a non-dot and non-path separator before our dot, so we should\n      // have a good chance at having a non-empty extension\n      preDotState = -1;\n    }\n  }\n\n  if (startDot === -1 || end === -1 ||\n      // We saw a non-dot character immediately before the dot\n      preDotState === 0 ||\n      // The (right-most) trimmed path component is exactly '..'\n      preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n    return '';\n  }\n  return path.slice(startDot, end);\n};\n\nfunction filter (xs, f) {\n    if (xs.filter) return xs.filter(f);\n    var res = [];\n    for (var i = 0; i < xs.length; i++) {\n        if (f(xs[i], i, xs)) res.push(xs[i]);\n    }\n    return res;\n}\n\n// String.prototype.substr - negative index don't work in IE8\nvar substr = 'ab'.substr(-1) === 'b'\n    ? function (str, start, len) { return str.substr(start, len) }\n    : function (str, start, len) {\n        if (start < 0) start = str.length + start;\n        return str.substr(start, len);\n    }\n;\n",
    "// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things.  But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals.  It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n    throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n    throw new Error('clearTimeout has not been defined');\n}\n(function () {\n    try {\n        if (typeof setTimeout === 'function') {\n            cachedSetTimeout = setTimeout;\n        } else {\n            cachedSetTimeout = defaultSetTimout;\n        }\n    } catch (e) {\n        cachedSetTimeout = defaultSetTimout;\n    }\n    try {\n        if (typeof clearTimeout === 'function') {\n            cachedClearTimeout = clearTimeout;\n        } else {\n            cachedClearTimeout = defaultClearTimeout;\n        }\n    } catch (e) {\n        cachedClearTimeout = defaultClearTimeout;\n    }\n} ())\nfunction runTimeout(fun) {\n    if (cachedSetTimeout === setTimeout) {\n        //normal enviroments in sane situations\n        return setTimeout(fun, 0);\n    }\n    // if setTimeout wasn't available but was latter defined\n    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n        cachedSetTimeout = setTimeout;\n        return setTimeout(fun, 0);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedSetTimeout(fun, 0);\n    } catch(e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n            return cachedSetTimeout.call(null, fun, 0);\n        } catch(e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n            return cachedSetTimeout.call(this, fun, 0);\n        }\n    }\n\n\n}\nfunction runClearTimeout(marker) {\n    if (cachedClearTimeout === clearTimeout) {\n        //normal enviroments in sane situations\n        return clearTimeout(marker);\n    }\n    // if clearTimeout wasn't available but was latter defined\n    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n        cachedClearTimeout = clearTimeout;\n        return clearTimeout(marker);\n    }\n    try {\n        // when when somebody has screwed with setTimeout but no I.E. maddness\n        return cachedClearTimeout(marker);\n    } catch (e){\n        try {\n            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally\n            return cachedClearTimeout.call(null, marker);\n        } catch (e){\n            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n            // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n            return cachedClearTimeout.call(this, marker);\n        }\n    }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    if (!draining || !currentQueue) {\n        return;\n    }\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = runTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        runTimeout(drainQueue);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n",
    "// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\n// If obj.hasOwnProperty has been overridden, then calling\n// obj.hasOwnProperty(prop) will break.\n// See: https://github.com/joyent/node/issues/1707\nfunction hasOwnProperty(obj, prop) {\n  return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nmodule.exports = function(qs, sep, eq, options) {\n  sep = sep || '&';\n  eq = eq || '=';\n  var obj = {};\n\n  if (typeof qs !== 'string' || qs.length === 0) {\n    return obj;\n  }\n\n  var regexp = /\\+/g;\n  qs = qs.split(sep);\n\n  var maxKeys = 1000;\n  if (options && typeof options.maxKeys === 'number') {\n    maxKeys = options.maxKeys;\n  }\n\n  var len = qs.length;\n  // maxKeys <= 0 means that we should not limit keys count\n  if (maxKeys > 0 && len > maxKeys) {\n    len = maxKeys;\n  }\n\n  for (var i = 0; i < len; ++i) {\n    var x = qs[i].replace(regexp, '%20'),\n        idx = x.indexOf(eq),\n        kstr, vstr, k, v;\n\n    if (idx >= 0) {\n      kstr = x.substr(0, idx);\n      vstr = x.substr(idx + 1);\n    } else {\n      kstr = x;\n      vstr = '';\n    }\n\n    k = decodeURIComponent(kstr);\n    v = decodeURIComponent(vstr);\n\n    if (!hasOwnProperty(obj, k)) {\n      obj[k] = v;\n    } else if (isArray(obj[k])) {\n      obj[k].push(v);\n    } else {\n      obj[k] = [obj[k], v];\n    }\n  }\n\n  return obj;\n};\n\nvar isArray = Array.isArray || function (xs) {\n  return Object.prototype.toString.call(xs) === '[object Array]';\n};\n",
    "// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar stringifyPrimitive = function(v) {\n  switch (typeof v) {\n    case 'string':\n      return v;\n\n    case 'boolean':\n      return v ? 'true' : 'false';\n\n    case 'number':\n      return isFinite(v) ? v : '';\n\n    default:\n      return '';\n  }\n};\n\nmodule.exports = function(obj, sep, eq, name) {\n  sep = sep || '&';\n  eq = eq || '=';\n  if (obj === null) {\n    obj = undefined;\n  }\n\n  if (typeof obj === 'object') {\n    return map(objectKeys(obj), function(k) {\n      var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;\n      if (isArray(obj[k])) {\n        return map(obj[k], function(v) {\n          return ks + encodeURIComponent(stringifyPrimitive(v));\n        }).join(sep);\n      } else {\n        return ks + encodeURIComponent(stringifyPrimitive(obj[k]));\n      }\n    }).join(sep);\n\n  }\n\n  if (!name) return '';\n  return encodeURIComponent(stringifyPrimitive(name)) + eq +\n         encodeURIComponent(stringifyPrimitive(obj));\n};\n\nvar isArray = Array.isArray || function (xs) {\n  return Object.prototype.toString.call(xs) === '[object Array]';\n};\n\nfunction map (xs, f) {\n  if (xs.map) return xs.map(f);\n  var res = [];\n  for (var i = 0; i < xs.length; i++) {\n    res.push(f(xs[i], i));\n  }\n  return res;\n}\n\nvar objectKeys = Object.keys || function (obj) {\n  var res = [];\n  for (var key in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);\n  }\n  return res;\n};\n",
    "'use strict';\n\nexports.decode = exports.parse = require('./decode');\nexports.encode = exports.stringify = require('./encode');\n",
    "// This method of obtaining a reference to the global object needs to be\n// kept identical to the way it is obtained in runtime.js\nvar g =\n  typeof global === \"object\" ? global :\n  typeof window === \"object\" ? window :\n  typeof self === \"object\" ? self : this;\n\n// Use `getOwnPropertyNames` because not all browsers support calling\n// `hasOwnProperty` on the global `self` object in a worker. See #183.\nvar hadRuntime = g.regeneratorRuntime &&\n  Object.getOwnPropertyNames(g).indexOf(\"regeneratorRuntime\") >= 0;\n\n// Save the old regeneratorRuntime in case it needs to be restored later.\nvar oldRuntime = hadRuntime && g.regeneratorRuntime;\n\n// Force reevalutation of runtime.js.\ng.regeneratorRuntime = undefined;\n\nmodule.exports = require(\"./runtime\");\n\nif (hadRuntime) {\n  // Restore the original runtime.\n  g.regeneratorRuntime = oldRuntime;\n} else {\n  // Remove the global property added by runtime.js.\n  try {\n    delete g.regeneratorRuntime;\n  } catch(e) {\n    g.regeneratorRuntime = undefined;\n  }\n}\n",
    "/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * https://raw.github.com/facebook/regenerator/master/LICENSE file. An\n * additional grant of patent rights can be found in the PATENTS file in\n * the same directory.\n */\n\n!(function(global) {\n  \"use strict\";\n\n  var Op = Object.prototype;\n  var hasOwn = Op.hasOwnProperty;\n  var undefined; // More compressible than void 0.\n  var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n  var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n  var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n  var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n  var inModule = typeof module === \"object\";\n  var runtime = global.regeneratorRuntime;\n  if (runtime) {\n    if (inModule) {\n      // If regeneratorRuntime is defined globally and we're in a module,\n      // make the exports object identical to regeneratorRuntime.\n      module.exports = runtime;\n    }\n    // Don't bother evaluating the rest of this file if the runtime was\n    // already defined globally.\n    return;\n  }\n\n  // Define the runtime globally (as expected by generated code) as either\n  // module.exports (if we're in a module) or a new, empty object.\n  runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n  function wrap(innerFn, outerFn, self, tryLocsList) {\n    // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n    var generator = Object.create(protoGenerator.prototype);\n    var context = new Context(tryLocsList || []);\n\n    // The ._invoke method unifies the implementations of the .next,\n    // .throw, and .return methods.\n    generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n    return generator;\n  }\n  runtime.wrap = wrap;\n\n  // Try/catch helper to minimize deoptimizations. Returns a completion\n  // record like context.tryEntries[i].completion. This interface could\n  // have been (and was previously) designed to take a closure to be\n  // invoked without arguments, but in all the cases we care about we\n  // already have an existing method we want to call, so there's no need\n  // to create a new function object. We can even get away with assuming\n  // the method takes exactly one argument, since that happens to be true\n  // in every case, so we don't have to touch the arguments object. The\n  // only additional allocation required is the completion record, which\n  // has a stable shape and so hopefully should be cheap to allocate.\n  function tryCatch(fn, obj, arg) {\n    try {\n      return { type: \"normal\", arg: fn.call(obj, arg) };\n    } catch (err) {\n      return { type: \"throw\", arg: err };\n    }\n  }\n\n  var GenStateSuspendedStart = \"suspendedStart\";\n  var GenStateSuspendedYield = \"suspendedYield\";\n  var GenStateExecuting = \"executing\";\n  var GenStateCompleted = \"completed\";\n\n  // Returning this object from the innerFn has the same effect as\n  // breaking out of the dispatch switch statement.\n  var ContinueSentinel = {};\n\n  // Dummy constructor functions that we use as the .constructor and\n  // .constructor.prototype properties for functions that return Generator\n  // objects. For full spec compliance, you may wish to configure your\n  // minifier not to mangle the names of these two functions.\n  function Generator() {}\n  function GeneratorFunction() {}\n  function GeneratorFunctionPrototype() {}\n\n  // This is a polyfill for %IteratorPrototype% for environments that\n  // don't natively support it.\n  var IteratorPrototype = {};\n  IteratorPrototype[iteratorSymbol] = function () {\n    return this;\n  };\n\n  var getProto = Object.getPrototypeOf;\n  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n  if (NativeIteratorPrototype &&\n      NativeIteratorPrototype !== Op &&\n      hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n    // This environment has a native %IteratorPrototype%; use it instead\n    // of the polyfill.\n    IteratorPrototype = NativeIteratorPrototype;\n  }\n\n  var Gp = GeneratorFunctionPrototype.prototype =\n    Generator.prototype = Object.create(IteratorPrototype);\n  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n  GeneratorFunctionPrototype.constructor = GeneratorFunction;\n  GeneratorFunctionPrototype[toStringTagSymbol] =\n    GeneratorFunction.displayName = \"GeneratorFunction\";\n\n  // Helper for defining the .next, .throw, and .return methods of the\n  // Iterator interface in terms of a single ._invoke method.\n  function defineIteratorMethods(prototype) {\n    [\"next\", \"throw\", \"return\"].forEach(function(method) {\n      prototype[method] = function(arg) {\n        return this._invoke(method, arg);\n      };\n    });\n  }\n\n  runtime.isGeneratorFunction = function(genFun) {\n    var ctor = typeof genFun === \"function\" && genFun.constructor;\n    return ctor\n      ? ctor === GeneratorFunction ||\n        // For the native GeneratorFunction constructor, the best we can\n        // do is to check its .name property.\n        (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n      : false;\n  };\n\n  runtime.mark = function(genFun) {\n    if (Object.setPrototypeOf) {\n      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n    } else {\n      genFun.__proto__ = GeneratorFunctionPrototype;\n      if (!(toStringTagSymbol in genFun)) {\n        genFun[toStringTagSymbol] = \"GeneratorFunction\";\n      }\n    }\n    genFun.prototype = Object.create(Gp);\n    return genFun;\n  };\n\n  // Within the body of any async function, `await x` is transformed to\n  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n  // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n  // meant to be awaited.\n  runtime.awrap = function(arg) {\n    return { __await: arg };\n  };\n\n  function AsyncIterator(generator) {\n    function invoke(method, arg, resolve, reject) {\n      var record = tryCatch(generator[method], generator, arg);\n      if (record.type === \"throw\") {\n        reject(record.arg);\n      } else {\n        var result = record.arg;\n        var value = result.value;\n        if (value &&\n            typeof value === \"object\" &&\n            hasOwn.call(value, \"__await\")) {\n          return Promise.resolve(value.__await).then(function(value) {\n            invoke(\"next\", value, resolve, reject);\n          }, function(err) {\n            invoke(\"throw\", err, resolve, reject);\n          });\n        }\n\n        return Promise.resolve(value).then(function(unwrapped) {\n          // When a yielded Promise is resolved, its final value becomes\n          // the .value of the Promise<{value,done}> result for the\n          // current iteration. If the Promise is rejected, however, the\n          // result for this iteration will be rejected with the same\n          // reason. Note that rejections of yielded Promises are not\n          // thrown back into the generator function, as is the case\n          // when an awaited Promise is rejected. This difference in\n          // behavior between yield and await is important, because it\n          // allows the consumer to decide what to do with the yielded\n          // rejection (swallow it and continue, manually .throw it back\n          // into the generator, abandon iteration, whatever). With\n          // await, by contrast, there is no opportunity to examine the\n          // rejection reason outside the generator function, so the\n          // only option is to throw it from the await expression, and\n          // let the generator function handle the exception.\n          result.value = unwrapped;\n          resolve(result);\n        }, reject);\n      }\n    }\n\n    if (typeof global.process === \"object\" && global.process.domain) {\n      invoke = global.process.domain.bind(invoke);\n    }\n\n    var previousPromise;\n\n    function enqueue(method, arg) {\n      function callInvokeWithMethodAndArg() {\n        return new Promise(function(resolve, reject) {\n          invoke(method, arg, resolve, reject);\n        });\n      }\n\n      return previousPromise =\n        // If enqueue has been called before, then we want to wait until\n        // all previous Promises have been resolved before calling invoke,\n        // so that results are always delivered in the correct order. If\n        // enqueue has not been called before, then it is important to\n        // call invoke immediately, without waiting on a callback to fire,\n        // so that the async generator function has the opportunity to do\n        // any necessary setup in a predictable way. This predictability\n        // is why the Promise constructor synchronously invokes its\n        // executor callback, and why async functions synchronously\n        // execute code before the first await. Since we implement simple\n        // async functions in terms of async generators, it is especially\n        // important to get this right, even though it requires care.\n        previousPromise ? previousPromise.then(\n          callInvokeWithMethodAndArg,\n          // Avoid propagating failures to Promises returned by later\n          // invocations of the iterator.\n          callInvokeWithMethodAndArg\n        ) : callInvokeWithMethodAndArg();\n    }\n\n    // Define the unified helper method that is used to implement .next,\n    // .throw, and .return (see defineIteratorMethods).\n    this._invoke = enqueue;\n  }\n\n  defineIteratorMethods(AsyncIterator.prototype);\n  AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n    return this;\n  };\n  runtime.AsyncIterator = AsyncIterator;\n\n  // Note that simple async functions are implemented on top of\n  // AsyncIterator objects; they just return a Promise for the value of\n  // the final result produced by the iterator.\n  runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n    var iter = new AsyncIterator(\n      wrap(innerFn, outerFn, self, tryLocsList)\n    );\n\n    return runtime.isGeneratorFunction(outerFn)\n      ? iter // If outerFn is a generator, return the full iterator.\n      : iter.next().then(function(result) {\n          return result.done ? result.value : iter.next();\n        });\n  };\n\n  function makeInvokeMethod(innerFn, self, context) {\n    var state = GenStateSuspendedStart;\n\n    return function invoke(method, arg) {\n      if (state === GenStateExecuting) {\n        throw new Error(\"Generator is already running\");\n      }\n\n      if (state === GenStateCompleted) {\n        if (method === \"throw\") {\n          throw arg;\n        }\n\n        // Be forgiving, per 25.3.3.3.3 of the spec:\n        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n        return doneResult();\n      }\n\n      context.method = method;\n      context.arg = arg;\n\n      while (true) {\n        var delegate = context.delegate;\n        if (delegate) {\n          var delegateResult = maybeInvokeDelegate(delegate, context);\n          if (delegateResult) {\n            if (delegateResult === ContinueSentinel) continue;\n            return delegateResult;\n          }\n        }\n\n        if (context.method === \"next\") {\n          // Setting context._sent for legacy support of Babel's\n          // function.sent implementation.\n          context.sent = context._sent = context.arg;\n\n        } else if (context.method === \"throw\") {\n          if (state === GenStateSuspendedStart) {\n            state = GenStateCompleted;\n            throw context.arg;\n          }\n\n          context.dispatchException(context.arg);\n\n        } else if (context.method === \"return\") {\n          context.abrupt(\"return\", context.arg);\n        }\n\n        state = GenStateExecuting;\n\n        var record = tryCatch(innerFn, self, context);\n        if (record.type === \"normal\") {\n          // If an exception is thrown from innerFn, we leave state ===\n          // GenStateExecuting and loop back for another invocation.\n          state = context.done\n            ? GenStateCompleted\n            : GenStateSuspendedYield;\n\n          if (record.arg === ContinueSentinel) {\n            continue;\n          }\n\n          return {\n            value: record.arg,\n            done: context.done\n          };\n\n        } else if (record.type === \"throw\") {\n          state = GenStateCompleted;\n          // Dispatch the exception by looping back around to the\n          // context.dispatchException(context.arg) call above.\n          context.method = \"throw\";\n          context.arg = record.arg;\n        }\n      }\n    };\n  }\n\n  // Call delegate.iterator[context.method](context.arg) and handle the\n  // result, either by returning a { value, done } result from the\n  // delegate iterator, or by modifying context.method and context.arg,\n  // setting context.delegate to null, and returning the ContinueSentinel.\n  function maybeInvokeDelegate(delegate, context) {\n    var method = delegate.iterator[context.method];\n    if (method === undefined) {\n      // A .throw or .return when the delegate iterator has no .throw\n      // method always terminates the yield* loop.\n      context.delegate = null;\n\n      if (context.method === \"throw\") {\n        if (delegate.iterator.return) {\n          // If the delegate iterator has a return method, give it a\n          // chance to clean up.\n          context.method = \"return\";\n          context.arg = undefined;\n          maybeInvokeDelegate(delegate, context);\n\n          if (context.method === \"throw\") {\n            // If maybeInvokeDelegate(context) changed context.method from\n            // \"return\" to \"throw\", let that override the TypeError below.\n            return ContinueSentinel;\n          }\n        }\n\n        context.method = \"throw\";\n        context.arg = new TypeError(\n          \"The iterator does not provide a 'throw' method\");\n      }\n\n      return ContinueSentinel;\n    }\n\n    var record = tryCatch(method, delegate.iterator, context.arg);\n\n    if (record.type === \"throw\") {\n      context.method = \"throw\";\n      context.arg = record.arg;\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    var info = record.arg;\n\n    if (! info) {\n      context.method = \"throw\";\n      context.arg = new TypeError(\"iterator result is not an object\");\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    if (info.done) {\n      // Assign the result of the finished delegate to the temporary\n      // variable specified by delegate.resultName (see delegateYield).\n      context[delegate.resultName] = info.value;\n\n      // Resume execution at the desired location (see delegateYield).\n      context.next = delegate.nextLoc;\n\n      // If context.method was \"throw\" but the delegate handled the\n      // exception, let the outer generator proceed normally. If\n      // context.method was \"next\", forget context.arg since it has been\n      // \"consumed\" by the delegate iterator. If context.method was\n      // \"return\", allow the original .return call to continue in the\n      // outer generator.\n      if (context.method !== \"return\") {\n        context.method = \"next\";\n        context.arg = undefined;\n      }\n\n    } else {\n      // Re-yield the result returned by the delegate method.\n      return info;\n    }\n\n    // The delegate iterator is finished, so forget it and continue with\n    // the outer generator.\n    context.delegate = null;\n    return ContinueSentinel;\n  }\n\n  // Define Generator.prototype.{next,throw,return} in terms of the\n  // unified ._invoke helper method.\n  defineIteratorMethods(Gp);\n\n  Gp[toStringTagSymbol] = \"Generator\";\n\n  // A Generator should always return itself as the iterator object when the\n  // @@iterator function is called on it. Some browsers' implementations of the\n  // iterator prototype chain incorrectly implement this, causing the Generator\n  // object to not be returned from this call. This ensures that doesn't happen.\n  // See https://github.com/facebook/regenerator/issues/274 for more details.\n  Gp[iteratorSymbol] = function() {\n    return this;\n  };\n\n  Gp.toString = function() {\n    return \"[object Generator]\";\n  };\n\n  function pushTryEntry(locs) {\n    var entry = { tryLoc: locs[0] };\n\n    if (1 in locs) {\n      entry.catchLoc = locs[1];\n    }\n\n    if (2 in locs) {\n      entry.finallyLoc = locs[2];\n      entry.afterLoc = locs[3];\n    }\n\n    this.tryEntries.push(entry);\n  }\n\n  function resetTryEntry(entry) {\n    var record = entry.completion || {};\n    record.type = \"normal\";\n    delete record.arg;\n    entry.completion = record;\n  }\n\n  function Context(tryLocsList) {\n    // The root entry object (effectively a try statement without a catch\n    // or a finally block) gives us a place to store values thrown from\n    // locations where there is no enclosing try statement.\n    this.tryEntries = [{ tryLoc: \"root\" }];\n    tryLocsList.forEach(pushTryEntry, this);\n    this.reset(true);\n  }\n\n  runtime.keys = function(object) {\n    var keys = [];\n    for (var key in object) {\n      keys.push(key);\n    }\n    keys.reverse();\n\n    // Rather than returning an object with a next method, we keep\n    // things simple and return the next function itself.\n    return function next() {\n      while (keys.length) {\n        var key = keys.pop();\n        if (key in object) {\n          next.value = key;\n          next.done = false;\n          return next;\n        }\n      }\n\n      // To avoid creating an additional object, we just hang the .value\n      // and .done properties off the next function object itself. This\n      // also ensures that the minifier will not anonymize the function.\n      next.done = true;\n      return next;\n    };\n  };\n\n  function values(iterable) {\n    if (iterable) {\n      var iteratorMethod = iterable[iteratorSymbol];\n      if (iteratorMethod) {\n        return iteratorMethod.call(iterable);\n      }\n\n      if (typeof iterable.next === \"function\") {\n        return iterable;\n      }\n\n      if (!isNaN(iterable.length)) {\n        var i = -1, next = function next() {\n          while (++i < iterable.length) {\n            if (hasOwn.call(iterable, i)) {\n              next.value = iterable[i];\n              next.done = false;\n              return next;\n            }\n          }\n\n          next.value = undefined;\n          next.done = true;\n\n          return next;\n        };\n\n        return next.next = next;\n      }\n    }\n\n    // Return an iterator with no values.\n    return { next: doneResult };\n  }\n  runtime.values = values;\n\n  function doneResult() {\n    return { value: undefined, done: true };\n  }\n\n  Context.prototype = {\n    constructor: Context,\n\n    reset: function(skipTempReset) {\n      this.prev = 0;\n      this.next = 0;\n      // Resetting context._sent for legacy support of Babel's\n      // function.sent implementation.\n      this.sent = this._sent = undefined;\n      this.done = false;\n      this.delegate = null;\n\n      this.method = \"next\";\n      this.arg = undefined;\n\n      this.tryEntries.forEach(resetTryEntry);\n\n      if (!skipTempReset) {\n        for (var name in this) {\n          // Not sure about the optimal order of these conditions:\n          if (name.charAt(0) === \"t\" &&\n              hasOwn.call(this, name) &&\n              !isNaN(+name.slice(1))) {\n            this[name] = undefined;\n          }\n        }\n      }\n    },\n\n    stop: function() {\n      this.done = true;\n\n      var rootEntry = this.tryEntries[0];\n      var rootRecord = rootEntry.completion;\n      if (rootRecord.type === \"throw\") {\n        throw rootRecord.arg;\n      }\n\n      return this.rval;\n    },\n\n    dispatchException: function(exception) {\n      if (this.done) {\n        throw exception;\n      }\n\n      var context = this;\n      function handle(loc, caught) {\n        record.type = \"throw\";\n        record.arg = exception;\n        context.next = loc;\n\n        if (caught) {\n          // If the dispatched exception was caught by a catch block,\n          // then let that catch block handle the exception normally.\n          context.method = \"next\";\n          context.arg = undefined;\n        }\n\n        return !! caught;\n      }\n\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        var record = entry.completion;\n\n        if (entry.tryLoc === \"root\") {\n          // Exception thrown outside of any try block that could handle\n          // it, so set the completion value of the entire function to\n          // throw the exception.\n          return handle(\"end\");\n        }\n\n        if (entry.tryLoc <= this.prev) {\n          var hasCatch = hasOwn.call(entry, \"catchLoc\");\n          var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n          if (hasCatch && hasFinally) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            } else if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else if (hasCatch) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            }\n\n          } else if (hasFinally) {\n            if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else {\n            throw new Error(\"try statement without catch or finally\");\n          }\n        }\n      }\n    },\n\n    abrupt: function(type, arg) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc <= this.prev &&\n            hasOwn.call(entry, \"finallyLoc\") &&\n            this.prev < entry.finallyLoc) {\n          var finallyEntry = entry;\n          break;\n        }\n      }\n\n      if (finallyEntry &&\n          (type === \"break\" ||\n           type === \"continue\") &&\n          finallyEntry.tryLoc <= arg &&\n          arg <= finallyEntry.finallyLoc) {\n        // Ignore the finally entry if control is not jumping to a\n        // location outside the try/catch block.\n        finallyEntry = null;\n      }\n\n      var record = finallyEntry ? finallyEntry.completion : {};\n      record.type = type;\n      record.arg = arg;\n\n      if (finallyEntry) {\n        this.method = \"next\";\n        this.next = finallyEntry.finallyLoc;\n        return ContinueSentinel;\n      }\n\n      return this.complete(record);\n    },\n\n    complete: function(record, afterLoc) {\n      if (record.type === \"throw\") {\n        throw record.arg;\n      }\n\n      if (record.type === \"break\" ||\n          record.type === \"continue\") {\n        this.next = record.arg;\n      } else if (record.type === \"return\") {\n        this.rval = this.arg = record.arg;\n        this.method = \"return\";\n        this.next = \"end\";\n      } else if (record.type === \"normal\" && afterLoc) {\n        this.next = afterLoc;\n      }\n\n      return ContinueSentinel;\n    },\n\n    finish: function(finallyLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.finallyLoc === finallyLoc) {\n          this.complete(entry.completion, entry.afterLoc);\n          resetTryEntry(entry);\n          return ContinueSentinel;\n        }\n      }\n    },\n\n    \"catch\": function(tryLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc === tryLoc) {\n          var record = entry.completion;\n          if (record.type === \"throw\") {\n            var thrown = record.arg;\n            resetTryEntry(entry);\n          }\n          return thrown;\n        }\n      }\n\n      // The context.catch method must only be called with a location\n      // argument that corresponds to a known catch block.\n      throw new Error(\"illegal catch attempt\");\n    },\n\n    delegateYield: function(iterable, resultName, nextLoc) {\n      this.delegate = {\n        iterator: values(iterable),\n        resultName: resultName,\n        nextLoc: nextLoc\n      };\n\n      if (this.method === \"next\") {\n        // Deliberately forget the last sent value so that we don't\n        // accidentally pass it on to the delegate.\n        this.arg = undefined;\n      }\n\n      return ContinueSentinel;\n    }\n  };\n})(\n  // Among the various tricks for obtaining a reference to the global\n  // object, this seems to be the most reliable technique that does not\n  // use indirect eval (which violates Content Security Policy).\n  typeof global === \"object\" ? global :\n  typeof window === \"object\" ? window :\n  typeof self === \"object\" ? self : this\n);\n",
    "var utils = require(\"./utilities\");\n\nvar defaultRole = \"*\";\nvar wildcard = \"*\";\nvar patternMatch = \"_\";\nvar grantExtensions = {};\nvar accessExtensions = {};\n\nexports.log;\n\nexports = module.exports = {\n\tDEFAULT_ROLE: defaultRole,\n\tpermissions: {},\n\troles: {},\n\tgrants: {},\n};\n\nexports.resolveRole = function(role) {\n\t// Resolve the roles into a permissions set. Compact to remove duplicates.\n\tvar set = utils.compact(role.permissions);\n\n\t// Expand the permission strings into an object for easier parsing\n\tvar ret = {plus: {}, minus: {}, superminus: {}, superplus: {}};\n\n\tvar handlePiece = function(base, pieces) {\n\t\tvar piece = pieces.shift();\n\n\t\tif(!(piece in base)) {\n\t\t\t// If we don't have deeper permissions, we terminate the chain with null for easy comparison\n\t\t\tif(!pieces.length)\n\t\t\t\tbase[piece] = null;\n\t\t\telse\n\t\t\t\tbase[piece] = handlePiece({}, pieces);\n\t\t\treturn base;\n\t\t}\n\t\telse {\n\t\t\t// If the existing key is a wildcard, ignore the rest of this chain\n\t\t\tif(wildcard in base[piece])\n\t\t\t\treturn base;\n\t\t\telse\n\t\t\t\treturn handlePiece(base[piece], pieces);\n\t\t}\n\t};\n\n\tset.forEach(function(item) {\n\t\tif(item[0] === \"!\" && item[1] === \"!\")\n\t\t\thandlePiece(ret.superminus, utils.compact(item.slice(2).split(\".\")));\n\t\telse if(item[0] === \"!\")\n\t\t\thandlePiece(ret.minus, utils.compact(item.slice(1).split(\".\")));\n\t\telse if(item[0] === \"+\")\n\t\t\thandlePiece(ret.superplus, utils.compact(item.slice(1).split(\".\")));\n\t\telse\n\t\t\thandlePiece(ret.plus, utils.compact(item.split(\".\")));\n\t});\n\n\treturn ret;\n};\n\nexports.init = function(opts) {\n\texports.log = opts.log || console;\n\texports.roles = opts.roles;\n\texports.permissions = {};\n\texports.grants = opts.grants;\n\n\t// Precalculate permissions for roles\n\tfor(var key in exports.roles) {\n\t\texports.permissions[key] = exports.resolveRole(exports.roles[key]);\n\t}\n};\n\nexports.reset = function() {\n\texports.permissions = {};\n\texports.roles = {};\n\texports.grants = {};\n\taccessExtensions = {};\n\tgrantExtensions = {};\n};\n\nexports.hasAccess = function(checks, user, noExtensions) {\n\tif(!checks)\n\t\tthrow new Error(\"No permission provided for check\");\n\tif(!user)\n\t\tthrow new Error(\"No user provided for roles check\");\n\tif(!user.roles)\n\t\tthrow new Error(\"Supplied user has no roles\");\n\n\tvar roles = user.roles.concat(defaultRole);\n\n\tvar readObj = function(base, pieces, plus) {\n\t\t// If this is an empty object, there cannot be any permissions\n\t\tif(base === null || !Object.keys(base).length)\n\t\t\treturn false;\n\n\t\tvar x;\n\t\twhile((x = pieces.shift())) {\n\t\t\tif(base === null)\n\t\t\t\treturn false;\n\n\t\t\t// If the provided permission itself is trying to match a wildcard, pass as long as there's at least one sub-entry\n\t\t\t// Pass with 1 to check later\n\t\t\tif(x === wildcard && plus)\n\t\t\t\treturn Object.keys(base).length > 0 ? 1 : 0;\n\n\t\t\t// If we're parsing negated conditions, we give it a higher priority if there's a matching wildcard\n\t\t\tif(x === wildcard && !plus)\n\t\t\t\treturn wildcard in base ? 1 : 0;\n\n\t\t\t// If this element has an \"all\" sub-match, we know we have permission\n\t\t\tif(wildcard in base)\n\t\t\t\treturn 1;\n\n\t\t\tif(x === patternMatch) {\n\t\t\t\t// Impossible to iterate deeper? Then we've passed the match.\n\t\t\t\tif(!pieces.length)\n\t\t\t\t\treturn true;\n\n\t\t\t\t// If there's more than one key, we don't know which one to match on with the pattern. So we parallelise.\n\t\t\t\treturn utils.some(Object.keys(base), function(key) {\n\t\t\t\t\treturn readObj(base[key], Array.prototype.slice.call(pieces, 0), plus);\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// No element, no permission\n\t\t\t\tif(!(x in base) && !(patternMatch in base))\n\t\t\t\t\treturn false;\n\n\t\t\t\tif(pieces.length) {\n\t\t\t\t\t// Iterate deeper\n\t\t\t\t\tif(x in base)\n\t\t\t\t\t\tbase = base[x];\n\t\t\t\t\telse if(patternMatch in base)\n\t\t\t\t\t\tbase = base[patternMatch];\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// No deeper permissions, and we know the permission exists on this level...pass\n\t\t\t\tif(base[x] === null)\n\t\t\t\t\treturn true;\n\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t};\n\n\tvar validateCheck = function(check) {\n\t\tvar no = false, yes = false, veryno = false, veryyes = false, i;\n\n\t\tfor(i = 0; i < roles.length; i++) {\n\t\t\tif(roles[i] in exports.permissions) {\n\t\t\t\tveryno = veryno || readObj(exports.permissions[roles[i]].superminus, check.split(\".\"), false);\n\t\t\t\tno = no || readObj(exports.permissions[roles[i]].minus, check.split(\".\"), false);\n\t\t\t\tyes = yes || readObj(exports.permissions[roles[i]].plus, check.split(\".\"), true);\n\t\t\t\tveryyes = veryyes || readObj(exports.permissions[roles[i]].superplus, check.split(\".\"), false);\n\t\t\t}\n\t\t}\n\n\t\t// If veryyes === true, only strong negation can defeat it.\n\t\t// If no === 1, it means we are negated with a wildcard, the highest priority.\n\t\t// If veryno === true, it means we are negated with a strong negative, the second highest priority\n\t\t// If veryno === 1, it means we are negated with a strong negative wildcard\n\t\t// if yes === 1, it means we have permission with a wildcard, which has third highest priority\n\t\t// Negation has the next highest priority\n\n\t\tif (veryyes === true && veryno !== true)\n\t\t\treturn true;\n\t\tif (veryyes === 1 && !veryno)\n\t\t\treturn true;\n\t\t// Priority 1\n\t\tif(no === 1)\n\t\t\treturn false;\n\t\t// Priority 2\n\t\tif(veryno === true)\n\t\t\treturn false;\n\t\t// Priority 3\n\t\tif(veryno === 1)\n\t\t\treturn false;\n\t\t// Priority 4\n\t\tif(yes === 1)\n\t\t\treturn true;\n\n\t\treturn !no && !veryno && (yes || (veryyes && !veryno));\n\t};\n\n\tvar parseCheck = function(check) {\n\t\tvar ret = validateCheck(check);\n\n\t\tif(!noExtensions && check in accessExtensions)\n\t\t\tfor(var i = 0; i < accessExtensions[check].length; i++)\n\t\t\t\tret |= accessExtensions[check][i](user);\n\n\t\treturn ret;\n\t};\n\n\tif(typeof checks == \"string\")\n\t\treturn utils.some([checks], parseCheck);\n\telse if(Array.isArray(checks))\n\t\treturn utils.some(checks, parseCheck);\n\telse if(checks.only && checks.only.length)\n\t\treturn utils.every(checks.only, parseCheck);\n\telse if(checks.any && checks.any.length)\n\t\treturn utils.some(checks.any, parseCheck);\n\telse\n\t\treturn false;\n};\n\nexports.registerAccessExtension = function(access, lookup) {\n\tif(!(access in accessExtensions))\n\t\taccessExtensions[access] = [];\n\taccessExtensions[access].push(lookup);\n};\n\n\n//___________________________________________________________________\n\n\n// Does the user have access to a specific type of grant in any way?\n// This does not make presumptions about the form of the access.\nexports.hasGrantAccess = function(grant, user) {\n\tif(!grant)\n\t\tthrow new Error(\"No grant provided for hasGrantAccess check\");\n\tif(!user)\n\t\tthrow new Error(\"No user provided for hasGrantAccess check\");\n\tif(!(\"roles\" in user))\n\t\tthrow new Error(\"User provided for hasGrantAccess check has no roles\");\n\n\tif(typeof grant === \"string\")\n\t\treturn exports.hasAccess(\"grants.all.\" + grant, user) || exports.hasAccess(\"grants.main.\" + grant, user);\n\n\tif(\"grant\" in grant)\n\t\treturn exports.hasAccess(\"grants.all.\" + grant.grant, user) || exports.hasAccess(\"grants.main.\" + grant.grant, user);\n\n\tthrow new Error(\"Grant object supplied for hasGrantAccess has no 'grant' property\");\n};\n\n// Check if there is a match on any of the values provided\nexports.matchGrantValues = function(grant, user, match, extra) {\n\tif(!grant)\n\t\tthrow new Error(\"No grant provided for matchGrantValues check\");\n\tif(!user)\n\t\tthrow new Error(\"No user provided for matchGrantValues check\");\n\tif(!(\"roles\" in user))\n\t\tthrow new Error(\"User provided for matchGrantValues check has no roles\");\n\n\tuser.grants = user.grants || {};\n\n\tif(typeof grant === \"string\" && exports.hasAccess(\"grants.all.\" + grant, user))\n\t\treturn true;\n\n\tif(typeof grant !== \"string\" && \"grant\" in grant && exports.hasAccess(\"grants.all.\" + grant.grant, user))\n\t\treturn true;\n\n\t// If the user does not have full access, and is checking for full access, they obviously fail\n\tif(match === null)\n\t\treturn false;\n\n\tif(typeof grant === \"string\" && !exports.hasAccess(\"grants.main.\" + grant, user))\n\t\treturn false;\n\n\tif(typeof grant !== \"string\" && \"grant\" in grant && !exports.hasAccess(\"grants.main.\" + grant.grant, user))\n\t\treturn false;\n\n\tvar vals = exports.getGrantValues(grant, user, false, extra);\n\tif(vals === null)\n\t\treturn true;\n\n\tif(!Array.isArray(match))\n\t\treturn vals.indexOf(match) > -1;\n\n\treturn utils.some(vals, function(x) { return match.indexOf(x) > -1; });\n};\n\n// Get a list of the grant values a user has for a specific grant\nexports.getGrantValues = function(grant, user, noExtensions, extra) {\n\tif(!grant)\n\t\tthrow new Error(\"No grant provided for getGrantValues check\");\n\tif(!user)\n\t\tthrow new Error(\"No user provided for getGrantValues check\");\n\tif(!(\"roles\" in user))\n\t\tthrow new Error(\"User provided for getGrantValues check has no roles\");\n\n\tvar g = grant;\n\tif(typeof g === \"object\") {\n\t\tif(!(\"grant\" in g))\n\t\t\tthrow new Error(\"Grant object supplied for getGrantValues has no grant property\");\n\t\tg = g.grant;\n\t}\n\tif(!g)\n\t\tthrow new Error(\"No valid grant provided for getGrantValues\");\n\n\tif(!(g in exports.grants))\n\t\tthrow new Error(\"Grant '\" + g + \"' does not exist\");\n\n\tif(exports.hasAccess(\"grants.all.\" + g, user))\n\t\treturn null;\n\n\tif(!(\"grants\" in user))\n\t\treturn [];\n\n\tvar ret = [];\n\t// If the user innately has this grant, then use the values they have.\n\t// Without the \"innate\" portion of the check, we might use values they\n\t// still have from a previous assignment but for which they no longer\n\t// have access.\n\tif(exports.hasAccess(\"grants.main.\" + g, user, true))\n\t\tret = user.grants[g] || [];\n\n\tif(!noExtensions && g in grantExtensions) {\n\t\tfor(var i = 0; i < grantExtensions[g].length; i++) {\n\t\t\tconst v = grantExtensions[g][i](user, extra);\n\t\t\tif(v === null)\n\t\t\t\treturn null;\n\t\t\tret = ret.concat(v);\n\t\t}\n\t}\n\n\treturn ret;\n};\n\n// Register a function to extend the values of a given grant lookup\nexports.registerGrantExtension = function(grant, lookup) {\n\tvar g = grant;\n\tif(typeof g === \"object\") {\n\t\tif(\"grant\" in g)\n\t\t\tg = g.grant;\n\t\telse\n\t\t\tg = \"\";\n\t}\n\n\tif(!g)\n\t\tthrow new Error(\"Did not supply a valid grant for grant extension\");\n\n\tif(!(g in grantExtensions))\n\t\tgrantExtensions[g] = [];\n\tgrantExtensions[g].push(lookup);\n};\n\n\n//_______________________________________________________\n\nexports.checkPermission = function(req, res, next) {\n\tif(!req.pylor)\n\t\treq.pylor = {};\n\tvar any = req.pylor.any || [];\n\tvar only = req.pylor.only || [];\n\n\tif(req.pylor.ssl && !req.ssl) {\n\t\tif(!req.pylor.noLog)\n\t\t\texports.log.warn(\"Denying access to SSL-only resource\", {path: req.path});\n\t\treturn res.status(403).json({info: \"That path requires SSL\", path: req.path});\n\t}\n\n\t// If there's no permission checks set, carry on\n\tif((!any.length && !only.length))\n\t\treturn next();\n\n\t// If user is logged in\n\tif(req.session && req.session.user && req.session.user.roles) {\n\t\tvar user = req.session.user;\n\t\tif(exports.hasAccess({ any: any, only: only }, user))\n\t\t\treturn next();\n\n\t\tif(!req.pylor.noLog)\n\t\t\texports.log.warn(\"Denying access to person that does not have the right permissions\", {person: user._id, userRoles: user.roles, allowed: {any: any, only: only}, route: req.route.path, method: req.method});\n\t\treturn res.status(403).json({info: \"Access denied\", detail: \"User does not have the right permissions\"});\n\t}\n\n\t// Check default role\n\tif(exports.hasAccess({any: any, only: only}, {roles: []}))\n\t\treturn next();\n\n\t// Catch-all...person must not be logged in\n\tif(!req.pylor.noLog)\n\t\texports.log.warn(\"Denying access to person that isn't logged in\", {route: req.route.path, method: req.method});\n\tif(res.statusCode === 200)\n\t\tres.status(401);\n\tres.json({info: \"Access denied\", detail: \"User is not logged in\"});\n};\n\nexports.sslOn = function(req, res, next) {\n\tif(!req.pylor)\n\t\treq.pylor = {};\n\treq.pylor.ssl = true;\n\tnext();\n};\n\nexports.sslOff = function(req, res, next) {\n\tif(req.pylor)\n\t\tdelete req.pylor.ssl;\n\tnext();\n};\n\nexports.any = function(perms, override) {\n\tvar ret = {any: utils.flatten([perms])};\n\n\treturn function(req, res, next) {\n\t\tif(next) {\n\t\t\tvar ssl = req.pylor ? Boolean(req.pylor.ssl) : false;\n\t\t\tif(override)\n\t\t\t\tdelete req.pylor;\n\n\t\t\tif(!req.pylor)\n\t\t\t\treq.pylor = {ssl: ssl};\n\n\t\t\t// Raw middleware\n\t\t\tif(req.pylor.only)\n\t\t\t\treturn next();\n\t\t\tif(req.pylor.any)\n\t\t\t\treq.pylor.any = utils.union(req.pylor.any, ret.any);\n\t\t\telse\n\t\t\t\treq.pylor.any = ret.any;\n\n\t\t\treturn next();\n\t\t}\n\t\treturn ret;\n\t};\n};\n\nexports.only = function(perms, override) {\n\tvar ret = {only: utils.flatten([perms])};\n\n\treturn function(req, res, next) {\n\t\tif(next) {\n\t\t\tvar ssl = req.pylor ? !!req.pylor.ssl : false;\n\t\t\tif(override)\n\t\t\t\tdelete req.pylor;\n\n\t\t\tif(!req.pylor)\n\t\t\t\treq.pylor = {ssl: ssl};\n\n\t\t\t// Raw middleware\n\t\t\tdelete req.pylor.any;\n\t\t\tif(req.pylor.only)\n\t\t\t\treq.pylor.only = utils.union(req.pylor.only, ret.only);\n\t\t\telse\n\t\t\t\treq.pylor.only = ret.only;\n\t\t\treturn next();\n\t\t}\n\t\treturn ret;\n\t};\n};\n\nexports.all = function(req, res, next) {\n\tif(!req.pylor)\n\t\treturn next();\n\tif(req.pylor.any)\n\t\tdelete req.pylor.any;\n\tif(req.pylor.only)\n\t\tdelete req.pylor.only;\n\tnext();\n};\n\nexports.noLog = function(req, res, next) {\n\tif(!req.pylor)\n\t\treq.pylor = {};\n\treq.pylor.noLog = true;\n\tnext();\n};",
    "var EventEmitter = require(\"events\");\nvar utils = require(\"./utilities\");\n\nmodule.exports = exports = function(input) {\n\texports.prototype.response = function(r) {\n\t\tthis.result = r;\n\t\treturn this;\n\t};\n\n\texports.prototype.streamResponse = function(s) {\n\t\tthis.stream = s;\n\t\treturn this;\n\t};\n\n\texports.prototype.rawResponse = function() {\n\t\tthis.raw = true;\n\t\treturn this;\n\t};\n\n\texports.prototype.addCookies = function(c) {\n\t\tif(!this.cookies)\n\t\t\tthis.cookies = {};\n\n\t\tthis.cookies = utils.merge(this.cookies, c);\n\t\treturn this;\n\t};\n\n\texports.prototype.removeCookies = function() {\n\t\tif(!this.cookies)\n\t\t\treturn this;\n\n\t\tvar delCookies = utils.flatten([Array.prototype.slice.call(arguments)]);\n\t\tfor(var x in delCookies)\n\t\t\tthis.cookies[delCookies[x]] = null;\n\n\t\treturn this;\n\t};\n\n\texports.prototype.addHeaders = function(h) {\n\t\tthis.headers = h;\n\t\treturn this;\n\t};\n\n\texports.prototype.setSession = function(s) {\n\t\tthis.session = s;\n\t\treturn this;\n\t};\n\n\texports.prototype.status = exports.prototype.hc = function(s) {\n\t\tthis.code = s;\n\t\treturn this;\n\t};\n\n\texports.prototype.expectResult = function() {\n\t\tthis.checkResult = true;\n\t\treturn this;\n\t};\n\n\texports.prototype.csrf = function() {\n\t\tthis.appendCSRF = true;\n\t\treturn this;\n\t};\n\n\texports.prototype.end = function() {\n\t\tthis.endResponse = true;\n\t\treturn this;\n\t};\n\n\tif(input instanceof EventEmitter)\n\t\treturn this.streamResponse(input);\n\telse if(input)\n\t\treturn this.response(input);\n};",
    "var Pylor = require(\"./pylor\");\nvar utils = require(\"./utilities\");\nvar Response = require(\"./response\");\n\nexports = module.exports = {options: {}};\n\nvar rolePermissionsCache = {};\n\nexports.init = function(opts) {\n\texports.server = opts.server;\n\texports.passport = opts.passport;\n\n\tif(opts.window || !(typeof setImmediate === \"function\" && setImmediate))\n\t\t(opts.window || window).setImmediate = function (fn, a1, a2) { setTimeout(function() { fn(a1, a2); }, 0); };\n\n\texports.log = opts.log || console;\n\texports.options.ssl = !!opts.ssl;\n\texports.options.version = opts.version || \"1.0\";\n\texports.options.apiRoot = opts.apiRoot || \"api\";\n\texports.options.endpoint = opts.endpoint || \"acacia\";\n\texports.options.mockDogfood = opts.mockDogfood || false;\n\texports.options.mockExceptions = opts.mockExceptions || [];\n\n\texports.permissions = opts.permissions || {};\n\texports.grants = opts.grants || {};\n\n\texports.permissions = utils.generateGrantPermissions(exports.permissions, exports.grants);\n\n\t// If the library is being used in a web environment, it might provide its own dehydrated set of role permissions\n\trolePermissionsCache = utils.expandObject(opts.rolePermissions || {}, []);\n\texports.p = utils.expandObject(opts.permissions, []);\n\texports.g = utils.mapGrants(exports.grants);\n\tif(opts.rolePermissions)\n\t\texports.p = utils.merge(exports.p, rolePermissionsCache);\n\n\tif(opts.roles)\n\t\tPylor.init({roles: opts.roles, log: opts.log, grants: exports.g});\n\n\texports.Pylor = Pylor;\n\n\tvar latest = {};\n\n\texports.api = {};\n\texports.api[exports.options.version] = latest;\n\texports.api.latest = latest;\n\texports.acacia = {};\n};\n\nexports.getRolePermissions = function() {\n\treturn rolePermissionsCache;\n};\n\n[\"hasAccess\", \"DEFAULT_ROLE\", \"sslOn\", \"sslOff\", \"any\", \"only\", \"all\", \"registerAccessExtension\", \"getGrantValues\", \"registerGrantExtension\", \"matchGrantValues\", \"hasGrantAccess\"].forEach(function(f) {\n\texports[f] = Pylor[f];\n});\n\n// Disable HTTP basic\nexports.noBasic = function(req, res, next) {\n\treq.noBasic = true;\n\n\tnext();\n};\n\nexports.simpleErrors = function(req, res, next) {\n\treq.fullErrors = false;\n\n\tnext();\n};\n\nexports.fullErrors = function(req, res, next) {\n\treq.fullErrors = true;\n\n\tnext();\n};\n\nexports.response = function(res) {\n\treturn new Response(res);\n};\n\nexports.end = exports.endResponse = function() {\n\treturn new Response().end();\n};\n\n// Allow HTTP Basic authentication\nexports.httpBasic = function(req, res, next) {\n\tif(req.noBasic || (\"headers\" in req && req.headers[\"x-auth-mechanism\"] == \"no-basic\"))\n\t\treturn next();\n\tif(req.session && req.session.user && (\"_id\" in req.session.user || \"user_id\" in req.session.user))\n\t\treturn next();\n\tif(!(\"pylor\" in req) || (!(\"any\" in req.pylor) && !(\"only\" in req.pylor)))\n\t\treturn next();\n\n\tif(req.url)\n\t\texports.passport.authenticate(\"basic\", { session: false })(req, res, next);\n\telse\n\t\tnext();\n};\n\nexports.httpEndpoint = function(req, res, err, opts) {\n\topts = opts || {};\n\n\tvar headers = opts.headers || {};\n\n\tvar cacheBust = {\n\t\t\"cache-control\": \"no-cache, no-store, must-revalidate\",\n\t\t\"pragma\": \"no-cache\",\n\t\t\"expires\": 0\n\t};\n\n\tvar heads = Object.keys(headers).map(function(item) { return item.toLowerCase(); });\n\tvar caches = Object.keys(cacheBust).map(function(item) { return item.toLowerCase(); });\n\n\tcaches.forEach(function(item) {\n\t\tif(heads.indexOf(item) == -1)\n\t\t\theaders[item] = cacheBust[item];\n\t});\n\n\tif(opts.checkResult && !opts.result) {\n\t\terr = {\n\t\t\tinfo: \"Resource not found\",\n\t\t\tstatusCode: 410,\n\t\t};\n\t}\n\n\tif(opts.appendCSRF && req.csrfToken)\n\t\topts.result._csrf = req.csrfToken();\n\n\tif(err) {\n\t\terr.reqPath = req.method + \" \" + req.path;\n\t\tvar q = \"\";\n\t\tfor(var qkey in req.query) {\n\t\t\tif(q === \"\")\n\t\t\t\tq = \"?\";\n\t\t\tif(qkey !== \"_\")\n\t\t\t\tq += qkey + \"=\" + req.query[qkey] + \"&\";\n\t\t}\n\t\terr.reqPath += q.slice(0, -1);\n\n\t\tif(!err.info)\n\t\t\terr.info = err.message;\n\t\tif(!err.detail)\n\t\t\terr.detail = err.message || err.info;\n\t\tif(req.session && req.session.user)\n\t\t\terr.person = req.session.user._id || req.session.user.user_id;\n\n\t\t// Log the full error\n\t\tif(!opts.noLog && !err.noLog)\n\t\t\texports.log.error(err);\n\n\t\tvar propDesc = Object.getOwnPropertyDescriptor(err, \"_xerror\");\n\t\tif(!propDesc && !req.fullErrors)\n\t\t\treturn res.status(err.statusCode || 500).json({ info: \"There was an error completing the request\", detail: \"An unexpected error occurred on the server\" });\n\n\t\terr.stack = undefined;\n\n\t\tvar code = err.statusCode || 500;\n\t\terr.statusCode = undefined;\n\t\terr.noLog = undefined;\n\n\t\treturn res.status(code).json(err);\n\t}\n\n\tif(opts.session && req.session) {\n\t\tfor(var key in opts.session)\n\t\t\treq.session[key] = opts.session[key];\n\t}\n\tif(opts.cookies) {\n\t\tfor(var key2 in opts.cookies) {\n\t\t\tif(!opts.cookies[key2])\n\t\t\t\tres.clearCookie(key2);\n\t\t\telse\n\t\t\t\tres.cookie(key2, opts.cookies[key2].value, opts.cookies[key2].options);\n\t\t}\n\t}\n\n\tres.set(headers);\n\tif(opts.endResponse)\n\t\treturn res.status(opts.code || 200).end();\n\n\tif(opts.raw)\n\t\tres.status(opts.code || 200).send(opts.result || \"\");\n\telse if(opts.stream)\n\t\topts.stream.pipe(res);\n\telse\n\t\tres.status(opts.code || 200).json(opts.result || {});\n};\n\nexports.createHttpHandler = function(verb, cb, endpoint) {\n\treturn function(req, res) {\n\t\tvar stack = [];\n\t\tvar opts = {};\n\n\t\tif(req.query.id) {\n\t\t\topts.uid = req.query.id;\n\t\t\topts.uids = utils.flatten([req.query.id]);\n\t\t}\n\t\telse {\n\t\t\tvar p = req.route.path.split(\"/\");\n\t\t\twhile(p.length) {\n\t\t\t\tvar piece = p.pop();\n\t\t\t\tif(piece.indexOf(\":\") === 0) {\n\t\t\t\t\topts.uid = req.params[piece.slice(1).replace(/[\\*\\+\\.\\?]/g, \"\")];\n\t\t\t\t\t// Handles slashes and such\n\t\t\t\t\tif(req.params[0] && Object.keys(req.params).length === 2) {\n\t\t\t\t\t\topts.uid += req.params[0];\n\t\t\t\t\t\treq.params[piece.slice(1).replace(/[\\*\\+\\.\\?]/g, \"\")] += req.params[0];\n\t\t\t\t\t}\n\t\t\t\t\topts.uids = utils.flatten([opts.uid]);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\topts.multiID = !Boolean(opts.uid) || Boolean(req.query.id) || Array.isArray(opts.uid);\n\n\t\topts.headers = req.headers;\n\t\topts.session = req.session || {};\n\n\t\tutils.extend(opts, req.params);\n\n\t\tstack.push(opts);\n\n\t\tif(cb.length < 2) {\n\t\t\t// No callback means a promise-based system\n\t\t\tvar caller = endpoint || exports.httpEndpoint;\n\t\t\ttry {\n\t\t\t\treturn Promise.resolve(cb.apply(req, stack))\n\t\t\t\t\t.then(function(x) {\n\t\t\t\t\t\tif(typeof x === \"undefined\" || x === null)\n\t\t\t\t\t\t\tx = {};\n\t\t\t\t\t\t// Allow promises to return raw values\n\t\t\t\t\t\tif([\"boolean\", \"string\", \"number\"].indexOf(typeof x) > -1 || (!(x instanceof Response) && !(\"result\" in x) && !(\"stream\" in x) && !(\"endResponse\" in x)))\n\t\t\t\t\t\t\tcaller(req, res, null, { result: x });\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tcaller(req, res, null, x);\n\t\t\t\t\t})\n\t\t\t\t\t.catch(function(e) { caller(req, res, e); });\n\t\t\t}\n\t\t\tcatch(e) {\n\t\t\t\tcaller(req, res, e);\n\t\t\t\treturn Promise.reject(e);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// Supply a callback if the function expects it\n\t\t\tstack.push(function(e, x) {\n\t\t\t\tif(typeof x === \"undefined\" || x === null)\n\t\t\t\t\tx = {};\n\t\t\t\tif([\"boolean\", \"string\", \"number\"].indexOf(typeof x) > -1 || (!(x instanceof Response) && !(\"result\" in x) && !(\"stream\" in x) && !(\"endResponse\" in x)))\n\t\t\t\t\tx = { result: x };\n\t\t\t\t(endpoint || exports.httpEndpoint)(req, res, e, x);\n\t\t\t});\n\t\t}\n\n\t\t//exports.log.debug(\"Loading API path\", {path: req.path, verb: verb});\n\t\tcb.apply(req, stack);\n\t};\n};\n\nexports.createApiHandler = function(options, cb) {\n\t// If mocking is enabled and the current module is not excluded from the dummy list, return a dummy module\n\t// that allows for curated responses\n\tvar mockDog = options.mockDogfood || exports.options.mockDogfood;\n\tvar mockExcept = options.mockExceptions || exports.options.mockExceptions;\n\n\tif(mockDog && (!mockExcept || mockExcept.indexOf(Object.keys(options.spec || {})[0]) === -1)) {\n\t\treturn function(opts, callback) {\n\t\t\tif(!callback || callback.length < 2) {\n\t\t\t\tif(opts.mockError)\n\t\t\t\t\treturn Promise.reject(opts.mockError);\n\t\t\t\treturn Promise.resolve(opts.mockResponse);\n\t\t\t}\n\n\t\t\tsetImmediate(callback, opts.mockError, opts.mockResponse);\n\t\t};\n\t}\n\n\treturn function(opts, callback) {\n\t\tif(typeof opts == \"function\") {\n\t\t\tcallback = opts;\n\t\t\topts = {};\n\t\t}\n\t\topts = opts || {};\n\t\topts.internal = true;\n\n\t\tvar params = [];\n\n\t\tif(opts.uid)\n\t\t\topts.uids = utils.flatten([opts.uid]);\n\t\topts.multiID = !(\"uid\" in opts) || Array.isArray(opts.uid);\n\n\t\topts.headers = this.headers || opts.headers || {};\n\t\topts.query = this.query || opts.query || {};\n\t\topts.session = this.session || opts.session || {};\n\t\topts.body = this.body || opts.body || {};\n\n\t\tparams.push(opts);\n\n\t\tif(!callback) {\n\t\t\t// The target function is promise based\n\n\t\t\tif(cb.length < 2) {\n\t\t\t\t// The source function is promise based\n\t\t\t\ttry {\n\t\t\t\t\treturn cb.call(opts, opts).then(function(x) {\n\t\t\t\t\t\tif(x instanceof Response) {\n\t\t\t\t\t\t\t// If we're mocking, send back the entire response so we can verify all the contents\n\t\t\t\t\t\t\tif(mockDog)\n\t\t\t\t\t\t\t\treturn x;\n\t\t\t\t\t\t\treturn x.result;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn x;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcatch(e) {\n\t\t\t\t\treturn Promise.reject(e);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// The source function is callback based\n\t\t\t\treturn new Promise(function(resolve, reject) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tcb.call(opts, opts, function(e, x) {\n\t\t\t\t\t\t\tif(e)\n\t\t\t\t\t\t\t\treturn reject(e);\n\t\t\t\t\t\t\tresolve(x.result);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tcatch(e) {\n\t\t\t\t\t\treject(e);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// The target function is callback based\n\t\t\tif(cb.length < 2) {\n\t\t\t\t// The source function is promise based\n\t\t\t\ttry {\n\t\t\t\t\tcb.call(opts, opts)\n\t\t\t\t\t\t.then(function(x) {\n\t\t\t\t\t\t\tif(x instanceof Response)\n\t\t\t\t\t\t\t\tx = x.result;\n\t\t\t\t\t\t\tsetImmediate(callback, null, x);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch(function(e) { setImmediate(callback, e); });\n\t\t\t\t}\n\t\t\t\tcatch(e) {\n\t\t\t\t\tsetImmediate(callback, e);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// The source function is callback based\n\t\t\t\tparams.push(function(e, r) {\n\t\t\t\t\tif(r && \"result\" in r && r.result instanceof Response)\n\t\t\t\t\t\treturn callback(e, r.result.result);\n\n\t\t\t\t\tcallback(e, r ? r.result : undefined);\n\t\t\t\t});\n\t\t\t\tcb.apply(opts, params);\n\t\t\t}\n\t\t}\n\t};\n};\n\nexports.createApiPermissionChecks = function(path, verb) {\n\tvar ret = [];\n\n\tvar root = \"\";\n\tif(path.indexOf(\"/api\") === 0)\n\t\troot = \"api.\";\n\n\tvar pathPieces = path.split(\"/\");\n\t// Drop the API root and the version\n\tif(pathPieces[1] === \"api\")\n\t\tpathPieces = pathPieces.slice(3);\n\telse\n\t\tpathPieces = pathPieces.slice(1);\n\n\tvar paths = [];\n\n\tif(path.indexOf(\"/:\") > -1) {\n\t\tpaths.push(pathPieces.map(function(item) {\n\t\t\t// Wildcard\n\t\t\tif(item[0] == \":\")\n\t\t\t\treturn item.slice(1).replace(/[\\*\\+\\.\\?]/g, \"\");\n\t\t\treturn item;\n\t\t}));\n\t}\n\n\tpaths.push(utils.compact(pathPieces.map(function(item, index) {\n\t\tif(index === (pathPieces.length - 1) && item === \":uid\")\n\t\t\treturn;\n\t\t// Wildcard\n\t\tif(item[0] == \":\")\n\t\t\treturn \"_\";\n\t\treturn item;\n\t})));\n\n\tpaths.forEach(function(pathPieces) {\n\t\tret.push(root + pathPieces.join(\".\") + \".\" + verb);\n\t});\n\n\treturn ret;\n};\n\n// Construct permissions for a given path\nexports.buildPathPermissions = function(path, verb) {\n\tvar paths = exports.createApiPermissionChecks(path, verb);\n\n\tvar ret = {}, link;\n\n\tpaths.forEach(function(p) {\n\t\tlink = ret;\n\n\t\tp.split(\".\").slice(0, -1).forEach(function(item) {\n\t\t\tif(!(item in link))\n\t\t\t\tlink[item] = {};\n\t\t\tlink = link[item];\n\t\t});\n\n\t\tlink[verb] = p;\n\t});\n\n\treturn ret;\n};\n\n// Parse a JSON REST spec and activate it in Express\nexports.activate = function(spec, options) {\n\toptions = options || {};\n\n\toptions.spec = spec;\n\n\t// \"get+\" is for endpoints that should listen for both single and multiple values\n\t// Ordinary get does not listen for IDs\n\tvar verbs = [\"get\", \"post\", \"put\", \"delete\", \"del\", \"get+\", \"patch\", \"put-\"];\n\n\tvar readRestObject = function(obj, path, access, mware) {\n\t\tvar deeper = [];\n\t\tif(!obj)\n\t\t\tthrow new Error(\"Missing handler for endpoint: \" + path.join(\"/\"));\n\n\t\t// Check for middlware keys first\n\t\tif(\"_middleware\" in obj) {\n\t\t\tmware = mware.concat(obj._middleware);\n\t\t\tdelete obj._middleware;\n\t\t}\n\n\t\tObject.keys(obj).forEach(function(key) {\n\t\t\tif(verbs.indexOf(key.toLowerCase()) > -1 || typeof obj[key] === \"function\" || Array.isArray(obj[key])) {\n\t\t\t\tvar verb = key.toLowerCase();\n\t\t\t\tvar localPath = path.slice(0);\n\t\t\t\tif((typeof obj[key] == \"function\" || Array.isArray(obj[key])) && verbs.indexOf(key) == -1) {\n\t\t\t\t\tverb = \"get\";\n\t\t\t\t\tlocalPath = localPath.concat(key);\n\t\t\t\t}\n\n\t\t\t\tif(verb == \"del\") verb = \"delete\";\n\t\t\t\tvar actives = [], inlineMware;\n\n\t\t\t\t// Allow inline middleware specification\n\t\t\t\tvar func = obj[key];\n\t\t\t\tif(Array.isArray(func)) {\n\t\t\t\t\tinlineMware = mware.concat(func.slice(0, -1));\n\t\t\t\t\tfunc = func.slice(-1)[0];\n\t\t\t\t}\n\n\t\t\t\tif(!func)\n\t\t\t\t\tthrow new Error(\"No valid handler was found for the endpoint '\" + key.toUpperCase() + \" \" + path.join(\"/\") + \"'\");\n\n\t\t\t\tif([\"get\", \"post\", \"get+\", \"put-\"].indexOf(verb) > -1)\n\t\t\t\t\tactives.push(localPath.join(\"/\"));\n\t\t\t\tif([\"get+\", \"put\", \"delete\", \"patch\"].indexOf(verb) > -1)\n\t\t\t\t\tactives.push(localPath.join(\"/\") + \"/:uid\");\n\n\t\t\t\tif(verb == \"get+\")\n\t\t\t\t\tverb = \"get\";\n\t\t\t\tif(verb == \"put-\")\n\t\t\t\t\tverb = \"put\";\n\n\t\t\t\t// Attach to the Express-compatible server\n\t\t\t\tif(exports.server) {\n\t\t\t\t\tactives.forEach(function(val) {\n\t\t\t\t\t\tvar pp = exports.buildPathPermissions(val, verb);\n\t\t\t\t\t\t// Save the permissions into a cache to be fetched later and sent to a web client\n\t\t\t\t\t\t// Web clients don't know about the server-side paths and therefore would not be able to do permission checks on them\n\t\t\t\t\t\t// Sending them a dehydrated copy of these permissions allows them to\n\t\t\t\t\t\tutils.merge(rolePermissionsCache, pp);\n\t\t\t\t\t\tutils.merge(exports.p, pp);\n\n\t\t\t\t\t\t// (path, sslCheck, apiPermissionDefine, middleware1, middleware2...middlewareN, permissionsCheck, handler)\n\t\t\t\t\t\t//console.log(inlineMware || mware);\n\t\t\t\t\t\tvar args = [val, exports.options.ssl ? Pylor.sslOn : Pylor.sslOff, Pylor.any(exports.createApiPermissionChecks(val, verb))].concat(inlineMware || mware);\n\t\t\t\t\t\tif(exports.passport)\n\t\t\t\t\t\t\targs = args.concat(exports.httpBasic);\n\t\t\t\t\t\targs = args.concat(Pylor.checkPermission).concat(exports.createHttpHandler(verb, func));\n\t\t\t\t\t\texports.server[verb].apply(exports.server, args);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Methods for internal use\n\t\t\t\t// Parameters are renamed as the key name, for convenience.\n\t\t\t\tif(key[0] == \":\") {\n\t\t\t\t\tif(!access[key.slice(1).replace(/[\\*\\+\\.\\?]/g, \"\")])\n\t\t\t\t\t\taccess[key.slice(1).replace(/[\\*\\+\\.\\?]/g, \"\")] = {};\n\t\t\t\t\tif(!access[key.replace(/[\\*\\+\\.\\?]/g, \"\")])\n\t\t\t\t\t\taccess[key.replace(/[\\*\\+\\.\\?]/g, \"\")] = {};\n\n\t\t\t\t\taccess[key.slice(1).replace(/[\\*\\+\\.\\?]/g, \"\")][verb] = access[key.replace(/[\\*\\+\\.\\?]/g, \"\")][verb] = exports.createApiHandler(options, func);\n\t\t\t\t}\n\t\t\t\telse if(verbs.indexOf(key) === -1) {\n\t\t\t\t\tif(!access[key])\n\t\t\t\t\t\taccess[key] = {};\n\t\t\t\t\taccess[key][verb] = exports.createApiHandler(options, func);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\taccess[verb] = exports.createApiHandler(options, func);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdeeper.push(key);\n\t\t\t\tif(key[0] == \":\")\n\t\t\t\t\taccess[key.slice(1).replace(/[\\*\\+\\.\\?]/g, \"\")] = {};\n\t\t\t\telse\n\t\t\t\t\taccess[key] = {};\n\t\t\t}\n\t\t});\n\n\t\t// Recuse on the keys that were not middleware or verbs\n\t\tdeeper.forEach(function(key) {\n\t\t\treadRestObject(obj[key], path.concat(key), access[key[0] === \":\" ? key.slice(1).replace(/[\\*\\+\\.\\?]/g, \"\") : key], mware);\n\t\t});\n\t};\n\n\tvar pathRoot = [\"/\" + exports.options.apiRoot + \"/\" + exports.options.version];\n\tvar objRoot = exports.api.latest;\n\tif(options.api === false) {\n\t\tpathRoot = [\"/\" + exports.options.endpoint];\n\t\tobjRoot = exports.acacia;\n\t}\n\treadRestObject(spec, pathRoot, objRoot, []);\n};",
    "module.exports = {\n\tcompact: function(arr) {\n\t\tvar ret = [];\n\n\t\tarr.forEach(function(item) {\n\t\t\tif(item)\n\t\t\t\tret.push(item);\n\t\t});\n\n\t\treturn ret;\n\t},\n\n\tunion: function(a, b, c) {\n\t\tvar ret = [];\n\t\tif(a)\n\t\t\ta.forEach(function(elem) {\n\t\t\t\tif(ret.indexOf(elem) === -1)\n\t\t\t\t\tret.push(elem);\n\t\t\t});\n\n\t\tif(b)\n\t\t\tb.forEach(function(elem) {\n\t\t\t\tif(ret.indexOf(elem) === -1)\n\t\t\t\t\tret.push(elem);\n\t\t\t});\n\n\t\tif(c)\n\t\t\tc.forEach(function(elem) {\n\t\t\t\tif(ret.indexOf(elem) === -1)\n\t\t\t\t\tret.push(elem);\n\t\t\t});\n\n\t\treturn ret;\n\t},\n\n\tflatten: function(arr, level, current) {\n\t\tlevel = level || Infinity;\n\t\tcurrent = current || 0;\n\t\tvar result = [];\n\t\tarr.forEach(function(el) {\n\t\t\tif(Array.isArray(el) && current < level) {\n\t\t\t\tresult = result.concat(module.exports.flatten(el, level, current + 1));\n\t\t\t} else {\n\t\t\t\tresult.push(el);\n\t\t\t}\n\t\t});\n\t\treturn result;\n\t},\n\n\tsome: function(arr, handler) {\n\t\tfor(var i = 0; i < arr.length; i++)\n\t\t\tif(handler(arr[i]))\n\t\t\t\treturn true;\n\t\treturn false;\n\t},\n\n\tevery: function(arr, handler) {\n\t\tfor(var i = 0; i < arr.length; i++)\n\t\t\tif(!handler(arr[i]))\n\t\t\t\treturn false;\n\t\treturn true;\n\t},\n\n\textend: function(out, other) {\n\t\tfor (var key in other) {\n\t\t\tif (other.hasOwnProperty(key))\n\t\t\t\tout[key] = other[key];\n\t\t}\n\n\t\treturn out;\n\t},\n\n\tmerge: function(target, source) {\n\t\t/* Merges two (or more) objects,\n\t\tgiving the last one precedence */\n\t\tif (typeof target !== \"object\" || target === null)\n\t\t\ttarget = {};\n\n\t\tfor (var property in source) {\n\t\t\tif (source.hasOwnProperty(property) ) {\n\t\t\t\tvar sourceProperty = source[ property ];\n\t\t\t\tif (typeof sourceProperty === \"object\") {\n\t\t\t\t\ttarget[property] = module.exports.merge(target[property], sourceProperty);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\ttarget[property] = sourceProperty;\n\t\t\t}\n\t\t}\n\t\t//for (var a = 2, l = arguments.length; a < l; a++) {\n\t\t//\tmodule.exports.merge(target, arguments[a]);\n\t\t//}\n\t\treturn target;\n\t},\n\n\texpandObject: function(obj, pth) {\n\t\tvar ret = {}, path = pth || [];\n\t\tfor(var key in obj) {\n\t\t\tif(typeof obj[key] === \"object\") {\n\t\t\t\tret[key.toLowerCase()] = module.exports.expandObject(obj[key], path.concat([key]));\n\t\t\t\tif(key.toLowerCase() !== key)\n\t\t\t\t\tret[key] = module.exports.expandObject(obj[key], path.concat([key]));\n\t\t\t}\n\t\t\telse if(obj[key] === \"\") {\n\t\t\t\tret[key.toLowerCase()] = path.concat([key]).join(\".\");\n\t\t\t\tif(key.toLowerCase() !== key)\n\t\t\t\t\tret[key] = path.concat([key]).join(\".\");\n\t\t\t}\n\t\t}\n\t\treturn ret;\n\t},\n\n\tmapGrants: function(grants) {\n\t\tvar ret = {};\n\t\tfor(var key in grants) {\n\t\t\tret[key] = grants[key] || {};\n\t\t\tret[key].grant = key;\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tgenerateGrantPermissions: function(permissions, grants) {\n\t\tpermissions.grants = { main: {}, all: {} };\n\t\tfor(var key in grants) {\n\t\t\tpermissions.grants.main[key] = \"\";\n\t\t\tpermissions.grants.all[key] = \"\";\n\t\t}\n\t\treturn permissions;\n\t},\n};",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar TokenView = require(\"./views/tokens\");\n\nvar Module = module.exports = new Backbone.Marionette.Application();\n\n// Add intra-module routing\nModule.routing = function (App) {\n\tModule.Router = {\n\t\troutes: {\n\t\t\ttokens: \"manageTokens\"\n\t\t},\n\n\t\tmanageTokens: function manageTokens() {\n\t\t\tApp.loadView(new TokenView());\n\t\t}\n\t};\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIlRva2VuVmlldyIsIk1vZHVsZSIsIm1vZHVsZSIsImV4cG9ydHMiLCJNYXJpb25ldHRlIiwiQXBwbGljYXRpb24iLCJyb3V0aW5nIiwiUm91dGVyIiwicm91dGVzIiwidG9rZW5zIiwibWFuYWdlVG9rZW5zIiwiQXBwIiwibG9hZFZpZXciXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjs7QUFFQSxJQUFNQyxZQUFZRCxRQUFRLGdCQUFSLENBQWxCOztBQUVBLElBQU1FLFNBQVNDLE9BQU9DLE9BQVAsR0FBaUIsSUFBSUwsU0FBU00sVUFBVCxDQUFvQkMsV0FBeEIsRUFBaEM7O0FBRUE7QUFDQUosT0FBT0ssT0FBUCxHQUFpQixlQUFPO0FBQ3ZCTCxRQUFPTSxNQUFQLEdBQWdCO0FBQ2ZDLFVBQVE7QUFDUEMsV0FBUTtBQURELEdBRE87O0FBS2ZDLGdCQUFjLHdCQUFXO0FBQ3hCQyxPQUFJQyxRQUFKLENBQWEsSUFBSVosU0FBSixFQUFiO0FBQ0E7QUFQYyxFQUFoQjtBQVNBLENBVkQiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuXG5jb25zdCBUb2tlblZpZXcgPSByZXF1aXJlKFwiLi92aWV3cy90b2tlbnNcIik7XG5cbmNvbnN0IE1vZHVsZSA9IG1vZHVsZS5leHBvcnRzID0gbmV3IEJhY2tib25lLk1hcmlvbmV0dGUuQXBwbGljYXRpb24oKTtcblxuLy8gQWRkIGludHJhLW1vZHVsZSByb3V0aW5nXG5Nb2R1bGUucm91dGluZyA9IEFwcCA9PiB7XG5cdE1vZHVsZS5Sb3V0ZXIgPSB7XG5cdFx0cm91dGVzOiB7XG5cdFx0XHR0b2tlbnM6IFwibWFuYWdlVG9rZW5zXCIsXG5cdFx0fSxcblxuXHRcdG1hbmFnZVRva2VuczogZnVuY3Rpb24oKSB7XG5cdFx0XHRBcHAubG9hZFZpZXcobmV3IFRva2VuVmlldygpKTtcblx0XHR9LFxuXHR9O1xufTsiXX0=",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"header\\\">\\n\\t<h4 class=\\\"title left\\\"><span class=\\\"fal fa-key\\\"/>&nbsp;Store Tokens</h4>\\n\\n\\t<div class=\\\"actions\\\">\\n\\t\\t<div class=\\\"activate\\\"><span class=\\\"fal fa-plus\\\"/> Activate Token</div>\\n\\t</div>\\n</div>\\n\\n<div class=\\\"ops-bar\\\">\\n\\t<div class=\\\"filters\\\"></div>\\n\\t<div class=\\\"counter\\\"></div>\\n</div>\\n\\n<div class=\\\"grid\\\"></div>\\n\\n<div class=\\\"paging\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\n\nvar App = require(\"../../index\");\nvar settings = require(\"app-settings\");\n\nvar gradeMap = require(\"../../lib/gradeMap\");\nvar ServerGrid = require(\"../../lib/serverGrid\");\nvar SmallModal = require(\"../../lib/smallModal\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar Model = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"_id\",\n\n\tcomputeds: {\n\t\tbookGrade: function bookGrade() {\n\t\t\treturn gradeMap.codeToHumanValue(this.get(\"grade\"));\n\t\t},\n\t\tbookFormat: function bookFormat() {\n\t\t\treturn \"<img src='\" + settings.urlRoot + \"/images/\" + (this.get(\"format\") === \"mpub\" ? \"epub\" : \"pdf\") + \".png' style='max-width: 25px;'>\";\n\t\t},\n\t\tbookVersion: function bookVersion() {\n\t\t\treturn this.has(\"metadata\") ? this.get(\"metadata\").version : \"\";\n\t\t},\n\t\tbookTitle: function bookTitle() {\n\t\t\treturn this.get(\"title\") || \"<book not loaded>\";\n\t\t}\n\t},\n\n\turlRoot: function urlRoot() {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\t\treturn settings.urlRoot + \"/api/1.0/users/\" + encodeURIComponent(user.username) + \"/tokens\";\n\t}\n});\n\nvar Collection = Backbone.PageableCollection.extend({\n\tmodel: Model,\n\n\turl: function url() {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\t\treturn settings.urlRoot + \"/api/1.0/users/\" + encodeURIComponent(user.username) + \"/tokens?paged=true\";\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttemplate: require(\"../templates/tokens.nunj\"),\n\n\tclassName: \"content user-tokens\",\n\n\tui: {\n\t\tfilterBar: \".ops-bar .filters\",\n\t\tcounter: \".ops-bar .counter\",\n\t\tpaging: \".paging\",\n\t\tgrid: \"div.grid\",\n\n\t\tadd: \"div.activate\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.add\": \"addToken\"\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"bookFormat\", label: \"Format\", cell: ServerGrid.HTMLCell.extend({}), editable: false }, { name: \"universalid\", label: \"Universal ID\", cell: \"string\", editable: false }, { name: \"bookTitle\", label: \"Title\", cell: \"string\", editable: false }, { name: \"subject\", label: \"Subject\", cell: \"string\", editable: false }, { name: \"bookGrade\", label: \"Grade\", cell: \"string\", editable: false }, { name: \"language\", label: \"Language\", cell: \"string\", editable: false }, { name: \"isbn\", label: \"ISBN\", cell: \"string\", editable: false }, { name: \"bookVersion\", label: \"Version\", cell: ServerGrid.VersionCell.extend({}), editable: false }, {\n\t\t\tname: \"created\", label: \"Activated\", editable: false, cell: ServerGrid.MomentCell.extend({\n\t\t\t\tmodelInUnixTimestamp: true,\n\t\t\t\tdisplayFormat: \"DD MMM YYYY, HH:mm a\",\n\t\t\t\tdisplayInUTC: false\n\t\t\t})\n\t\t}, { name: \"timeleft\", label: \"Time Left\", cell: ServerGrid.DurationCell.extend({}), editable: false }];\n\n\t\tvar grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new Collection(),\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counter,\n\t\t\t\ttemplate: \"Tokens $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 400,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar languageFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"languageFilter\",\n\t\t\tlabel: \"Language\",\n\t\t\tcategories: [{ items: settings.languageList }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar subjectFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"subjectFilter\",\n\t\t\tlabel: \"Subject\",\n\t\t\tserver: {\n\t\t\t\tkey: \"subject_id\",\n\t\t\t\tvalue: \"subject\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/subjects\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\t\tvar gradeFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"gradeFilter\",\n\t\t\tlabel: \"Year of Study\",\n\t\t\tcategories: _.map(settings.gradeList, function (val, key) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: key,\n\t\t\t\t\titems: _.reduce(val.sort(function (a, b) {\n\t\t\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t\t\t}), function (sum, num) {\n\t\t\t\t\t\tsum.push({ name: num.value, label: num.name });return sum;\n\t\t\t\t\t}, [])\n\t\t\t\t};\n\t\t\t}),\n\t\t\tserver: true\n\t\t};\n\n\t\tvar formatFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"formatFilter\",\n\t\t\tlabel: \"Format\",\n\t\t\tcategories: [{ items: { mpdf: \"PDF\", mpub: \"EPUB\" } }],\n\t\t\tserver: true\n\t\t};\n\n\t\tthis.ui.filterBar.prepend(grid.filter({\n\t\t\tfilterContainer: this.ui.filterBar,\n\t\t\tfilters: [textFilter, languageFilter, subjectFilter, gradeFilter, formatFilter],\n\t\t\tdefaultFilters: [\"textFilter\"]\n\t\t}).render().el);\n\t},\n\n\taddToken: function addToken(evt) {\n\t\tvar _this = this;\n\n\t\tevt.stopPropagation();\n\n\t\tvar modal = new SmallModal({\n\t\t\ttitle: \"<span class='fal fa-key'/> Activate A New Token\",\n\t\t\tbody: \"<p>Enter the token below.</p><p><textarea rows='8'></textarea></p>\",\n\t\t\tpersist: true\n\t\t});\n\n\t\tvar tokenSuccess = function tokenSuccess(model) {\n\t\t\t_this.collection.add(model);\n\t\t\tmodal.destroy();\n\t\t};\n\n\t\tvar tokenError = function tokenError(model, xhr) {\n\t\t\tvar answer = App.parseResponse(xhr);\n\t\t\treturn modal.enableButtons().hideSpinner().showError(answer.detail || answer.info);\n\t\t};\n\n\t\tmodal.on(\"button:ok\", function () {\n\t\t\tvar token = $(\"textarea\", modal.el).val();\n\t\t\tif (!token) return modal.enableButtons().hideSpinner().showError(\"No token provided\");\n\n\t\t\tvar model = new Model({ token: token });\n\n\t\t\tmodel.save(null, { wait: true, success: tokenSuccess.bind(_this), error: tokenError.bind(_this) });\n\t\t});\n\n\t\tmodal.show();\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRva2Vucy5qcyJdLCJuYW1lcyI6WyIkIiwicmVxdWlyZSIsIl8iLCJCYWNrYm9uZSIsIkFwcCIsInNldHRpbmdzIiwiZ3JhZGVNYXAiLCJTZXJ2ZXJHcmlkIiwiU21hbGxNb2RhbCIsInJhZGlvIiwiUmFkaW8iLCJjaGFubmVsIiwiTW9kZWwiLCJFcG94eSIsImV4dGVuZCIsImlkQXR0cmlidXRlIiwiY29tcHV0ZWRzIiwiYm9va0dyYWRlIiwiY29kZVRvSHVtYW5WYWx1ZSIsImdldCIsImJvb2tGb3JtYXQiLCJ1cmxSb290IiwiYm9va1ZlcnNpb24iLCJoYXMiLCJ2ZXJzaW9uIiwiYm9va1RpdGxlIiwidXNlciIsInJlcXVlc3QiLCJFdmVudHMiLCJSZXF1ZXN0cyIsIkN1cnJlbnRVc2VyIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwidXNlcm5hbWUiLCJDb2xsZWN0aW9uIiwiUGFnZWFibGVDb2xsZWN0aW9uIiwibW9kZWwiLCJ1cmwiLCJzdGF0ZSIsInBhZ2VTaXplIiwibW9kZSIsInF1ZXJ5UGFyYW1zIiwic29ydEtleSIsInBhcnNlU3RhdGUiLCJyZXNwIiwidG90YWxSZWNvcmRzIiwidG90YWwiLCJwYXJzZVJlY29yZHMiLCJyb3dzIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1hcmlvbmV0dGUiLCJWaWV3IiwidGVtcGxhdGUiLCJjbGFzc05hbWUiLCJ1aSIsImZpbHRlckJhciIsImNvdW50ZXIiLCJwYWdpbmciLCJncmlkIiwiYWRkIiwiZXZlbnRzIiwib25SZW5kZXIiLCJjb2x1bW5zIiwibmFtZSIsImxhYmVsIiwiY2VsbCIsIkhUTUxDZWxsIiwiZWRpdGFibGUiLCJWZXJzaW9uQ2VsbCIsIk1vbWVudENlbGwiLCJtb2RlbEluVW5peFRpbWVzdGFtcCIsImRpc3BsYXlGb3JtYXQiLCJkaXNwbGF5SW5VVEMiLCJEdXJhdGlvbkNlbGwiLCJlbCIsImNvbGxlY3Rpb24iLCJlbGVtZW50IiwidGV4dEZpbHRlciIsInR5cGUiLCJkZWJvdW5jZSIsInNlcnZlciIsImxhbmd1YWdlRmlsdGVyIiwiY2F0ZWdvcmllcyIsIml0ZW1zIiwibGFuZ3VhZ2VMaXN0Iiwic3ViamVjdEZpbHRlciIsImtleSIsInZhbHVlIiwiZmV0Y2giLCJpbmZpbml0ZSIsImdyYWRlRmlsdGVyIiwibWFwIiwiZ3JhZGVMaXN0IiwidmFsIiwicmVkdWNlIiwic29ydCIsImEiLCJiIiwibGV4aWNhbCIsInRvVXBwZXJDYXNlIiwibG9jYWxlQ29tcGFyZSIsInN1bSIsIm51bSIsInB1c2giLCJmb3JtYXRGaWx0ZXIiLCJtcGRmIiwibXB1YiIsInByZXBlbmQiLCJmaWx0ZXIiLCJmaWx0ZXJDb250YWluZXIiLCJmaWx0ZXJzIiwiZGVmYXVsdEZpbHRlcnMiLCJyZW5kZXIiLCJhZGRUb2tlbiIsImV2dCIsInN0b3BQcm9wYWdhdGlvbiIsIm1vZGFsIiwidGl0bGUiLCJib2R5IiwicGVyc2lzdCIsInRva2VuU3VjY2VzcyIsImRlc3Ryb3kiLCJ0b2tlbkVycm9yIiwieGhyIiwiYW5zd2VyIiwicGFyc2VSZXNwb25zZSIsImVuYWJsZUJ1dHRvbnMiLCJoaWRlU3Bpbm5lciIsInNob3dFcnJvciIsImRldGFpbCIsImluZm8iLCJvbiIsInRva2VuIiwic2F2ZSIsIndhaXQiLCJzdWNjZXNzIiwiYmluZCIsImVycm9yIiwic2hvdyJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsSUFBSUMsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1FLFdBQVdGLFFBQVEsVUFBUixDQUFqQjs7QUFFQSxJQUFNRyxNQUFNSCxRQUFRLGFBQVIsQ0FBWjtBQUNBLElBQU1JLFdBQVdKLFFBQVEsY0FBUixDQUFqQjs7QUFFQSxJQUFNSyxXQUFXTCxRQUFRLG9CQUFSLENBQWpCO0FBQ0EsSUFBTU0sYUFBYU4sUUFBUSxzQkFBUixDQUFuQjtBQUNBLElBQU1PLGFBQWFQLFFBQVEsc0JBQVIsQ0FBbkI7O0FBRUEsSUFBTVEsUUFBUU4sU0FBU08sS0FBVCxDQUFl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aURBRHFCO0FBRTVCQyxTQUFNLG9FQUZzQjtBQUc1QkMsWUFBUztBQUhtQixHQUFmLENBQWQ7O0FBTUEsTUFBTUMsZUFBZSxTQUFmQSxZQUFlLFFBQVM7QUFDN0IsU0FBSzdDLFVBQUwsQ0FBZ0JoQixHQUFoQixDQUFvQnhCLEtBQXBCO0FBQ0FpRixTQUFNSyxPQUFOO0FBQ0EsR0FIRDs7QUFLQSxNQUFNQyxhQUFhLFNBQWJBLFVBQWEsQ0FBQ3ZGLEtBQUQsRUFBUXdGLEdBQVIsRUFBZ0I7QUFDbEMsT0FBTUMsU0FBU3hILElBQUl5SCxhQUFKLENBQWtCRixHQUFsQixDQUFmO0FBQ0EsVUFBT1AsTUFBTVUsYUFBTixHQUFzQkMsV0FBdEIsR0FBb0NDLFNBQXBDLENBQThDSixPQUFPSyxNQUFQLElBQWlCTCxPQUFPTSxJQUF0RSxDQUFQO0FBQ0EsR0FIRDs7QUFLQWQsUUFBTWUsRUFBTixDQUFTLFdBQVQsRUFBc0IsWUFBTTtBQUMzQixPQUFNQyxRQUFRcEksRUFBRSxVQUFGLEVBQWNvSCxNQUFNMUMsRUFBcEIsRUFBd0JtQixHQUF4QixFQUFkO0FBQ0EsT0FBSSxDQUFDdUMsS0FBTCxFQUNDLE9BQU9oQixNQUFNVSxhQUFOLEdBQXNCQyxXQUF0QixHQUFvQ0MsU0FBcEMsQ0FBOEMsbUJBQTlDLENBQVA7O0FBRUQsT0FBTTdGLFFBQVEsSUFBSXZCLEtBQUosQ0FBVSxFQUFFd0gsT0FBT0EsS0FBVCxFQUFWLENBQWQ7O0FBRUFqRyxTQUFNa0csSUFBTixDQUFXLElBQVgsRUFBaUIsRUFBRUMsTUFBTSxJQUFSLEVBQWNDLFNBQVNmLGFBQWFnQixJQUFiLENBQWtCLEtBQWxCLENBQXZCLEVBQWdEQyxPQUFPZixXQUFXYyxJQUFYLENBQWdCLEtBQWhCLENBQXZELEVBQWpCO0FBQ0EsR0FSRDs7QUFVQXBCLFFBQU1zQixJQUFOO0FBQ0E7QUEvSStDLENBQWhDLENBQWpCIiwiZmlsZSI6InRva2Vucy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuXG5jb25zdCBBcHAgPSByZXF1aXJlKFwiLi4vLi4vaW5kZXhcIik7XG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IGdyYWRlTWFwID0gcmVxdWlyZShcIi4uLy4uL2xpYi9ncmFkZU1hcFwiKTtcbmNvbnN0IFNlcnZlckdyaWQgPSByZXF1aXJlKFwiLi4vLi4vbGliL3NlcnZlckdyaWRcIik7XG5jb25zdCBTbWFsbE1vZGFsID0gcmVxdWlyZShcIi4uLy4uL2xpYi9zbWFsbE1vZGFsXCIpO1xuXG5jb25zdCByYWRpbyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJnbG9iYWxcIik7XG5cbmNvbnN0IE1vZGVsID0gQmFja2JvbmUuRXBveHkuTW9kZWwuZXh0ZW5kKHtcblx0aWRBdHRyaWJ1dGU6IFwiX2lkXCIsXG5cblx0Y29tcHV0ZWRzOiB7XG5cdFx0Ym9va0dyYWRlOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBncmFkZU1hcC5jb2RlVG9IdW1hblZhbHVlKHRoaXMuZ2V0KFwiZ3JhZGVcIikpO1xuXHRcdH0sXG5cdFx0Ym9va0Zvcm1hdDogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gXCI8aW1nIHNyYz0nXCIgKyBzZXR0aW5ncy51cmxSb290ICsgXCIvaW1hZ2VzL1wiICsgKHRoaXMuZ2V0KFwiZm9ybWF0XCIpID09PSBcIm1wdWJcIiA/IFwiZXB1YlwiIDogXCJwZGZcIikgKyBcIi5wbmcnIHN0eWxlPSdtYXgtd2lkdGg6IDI1cHg7Jz5cIjtcblx0XHR9LFxuXHRcdGJvb2tWZXJzaW9uOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLmhhcyhcIm1ldGFkYXRhXCIpID8gdGhpcy5nZXQoXCJtZXRhZGF0YVwiKS52ZXJzaW9uIDogXCJcIjtcblx0XHR9LFxuXHRcdGJvb2tUaXRsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXQoXCJ0aXRsZVwiKSB8fCBcIjxib29rIG5vdCBsb2FkZWQ+XCI7XG5cdFx0fSxcblx0fSxcblxuXHR1cmxSb290OiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCB1c2VyID0gcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvdXNlcnMvXCIgKyBlbmNvZGVVUklDb21wb25lbnQodXNlci51c2VybmFtZSkgKyBcIi90b2tlbnNcIjtcblx0fSxcbn0pO1xuXG5jb25zdCBDb2xsZWN0aW9uID0gQmFja2JvbmUuUGFnZWFibGVDb2xsZWN0aW9uLmV4dGVuZCh7XG5cdG1vZGVsOiBNb2RlbCxcblxuXHR1cmw6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHVzZXIgPSByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpO1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC91c2Vycy9cIiArIGVuY29kZVVSSUNvbXBvbmVudCh1c2VyLnVzZXJuYW1lKSArIFwiL3Rva2Vucz9wYWdlZD10cnVlXCI7XG5cdH0sXG5cblx0c3RhdGU6IHtcblx0XHRwYWdlU2l6ZTogMzAsXG5cdH0sXG5cdG1vZGU6IFwic2VydmVyXCIsXG5cblx0cXVlcnlQYXJhbXM6IHtcblx0XHRwYWdlU2l6ZTogXCJwYWdlU2l6ZVwiLFxuXHRcdHNvcnRLZXk6IFwic29ydEJ5XCIsXG5cdH0sXG5cblx0cGFyc2VTdGF0ZTogZnVuY3Rpb24ocmVzcCkge1xuXHRcdHJldHVybiB7IHRvdGFsUmVjb3JkczogcmVzcC50b3RhbCB9O1xuXHR9LFxuXG5cdHBhcnNlUmVjb3JkczogZnVuY3Rpb24ocmVzcCkge1xuXHRcdHJldHVybiByZXNwLnJvd3M7XG5cdH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvdG9rZW5zLm51bmpcIiksXG5cblx0Y2xhc3NOYW1lOiBcImNvbnRlbnQgdXNlci10b2tlbnNcIixcblxuXHR1aToge1xuXHRcdGZpbHRlckJhcjogXCIub3BzLWJhciAuZmlsdGVyc1wiLFxuXHRcdGNvdW50ZXI6IFwiLm9wcy1iYXIgLmNvdW50ZXJcIixcblx0XHRwYWdpbmc6IFwiLnBhZ2luZ1wiLFxuXHRcdGdyaWQ6IFwiZGl2LmdyaWRcIixcblxuXHRcdGFkZDogXCJkaXYuYWN0aXZhdGVcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5hZGRcIjogXCJhZGRUb2tlblwiLFxuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBjb2x1bW5zID0gW1xuXHRcdFx0eyBuYW1lOiBcImJvb2tGb3JtYXRcIiwgbGFiZWw6IFwiRm9ybWF0XCIsIGNlbGw6IFNlcnZlckdyaWQuSFRNTENlbGwuZXh0ZW5kKHt9KSwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwidW5pdmVyc2FsaWRcIiwgbGFiZWw6IFwiVW5pdmVyc2FsIElEXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImJvb2tUaXRsZVwiLCBsYWJlbDogXCJUaXRsZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJzdWJqZWN0XCIsIGxhYmVsOiBcIlN1YmplY3RcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiYm9va0dyYWRlXCIsIGxhYmVsOiBcIkdyYWRlXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImxhbmd1YWdlXCIsIGxhYmVsOiBcIkxhbmd1YWdlXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImlzYm5cIiwgbGFiZWw6IFwiSVNCTlwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJib29rVmVyc2lvblwiLCBsYWJlbDogXCJWZXJzaW9uXCIsIGNlbGw6IFNlcnZlckdyaWQuVmVyc2lvbkNlbGwuZXh0ZW5kKHt9KSwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwiY3JlYXRlZFwiLCBsYWJlbDogXCJBY3RpdmF0ZWRcIiwgZWRpdGFibGU6IGZhbHNlLCBjZWxsOiBTZXJ2ZXJHcmlkLk1vbWVudENlbGwuZXh0ZW5kKHtcblx0XHRcdFx0XHRtb2RlbEluVW5peFRpbWVzdGFtcDogdHJ1ZSxcblx0XHRcdFx0XHRkaXNwbGF5Rm9ybWF0OiBcIkREIE1NTSBZWVlZLCBISDptbSBhXCIsXG5cdFx0XHRcdFx0ZGlzcGxheUluVVRDOiBmYWxzZSxcblx0XHRcdFx0fSksXG5cdFx0XHR9LFxuXHRcdFx0eyBuYW1lOiBcInRpbWVsZWZ0XCIsIGxhYmVsOiBcIlRpbWUgTGVmdFwiLCBjZWxsOiBTZXJ2ZXJHcmlkLkR1cmF0aW9uQ2VsbC5leHRlbmQoe30pLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRdO1xuXG5cdFx0Y29uc3QgZ3JpZCA9IG5ldyBTZXJ2ZXJHcmlkKHtcblx0XHRcdGVsOiB0aGlzLnVpLmdyaWQsXG5cdFx0XHRjb2x1bW5zOiBjb2x1bW5zLFxuXHRcdFx0Y29sbGVjdGlvbjogbmV3IENvbGxlY3Rpb24oKSxcblx0XHRcdGNvdW50ZXI6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5jb3VudGVyLFxuXHRcdFx0XHR0ZW1wbGF0ZTogXCJUb2tlbnMgJHN0YXJ0IC0gJGVuZCBvZiAkdG90YWxcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5wYWdpbmcsXG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0Y29uc3QgdGV4dEZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwidGV4dFwiLFxuXHRcdFx0bmFtZTogXCJ0ZXh0RmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJUZXh0IFNlYXJjaFwiLFxuXHRcdFx0ZGVib3VuY2U6IDQwMCxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgbGFuZ3VhZ2VGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcImxhbmd1YWdlRmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJMYW5ndWFnZVwiLFxuXHRcdFx0Y2F0ZWdvcmllczogW1xuXHRcdFx0XHR7IGl0ZW1zOiBzZXR0aW5ncy5sYW5ndWFnZUxpc3QgfSxcblx0XHRcdF0sXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdGNvbnN0IHN1YmplY3RGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcInN1YmplY3RGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlN1YmplY3RcIixcblx0XHRcdHNlcnZlcjoge1xuXHRcdFx0XHRrZXk6IFwic3ViamVjdF9pZFwiLFxuXHRcdFx0XHR2YWx1ZTogXCJzdWJqZWN0XCIsXG5cdFx0XHRcdGZldGNoOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9kYXRhL3N1YmplY3RzXCIsXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdHBhZ2VTaXplOiAzMCxcblx0XHRcdFx0aW5maW5pdGU6IHRydWUsXG5cdFx0XHR9LFxuXHRcdH07XG5cdFx0Y29uc3QgZ3JhZGVGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcImdyYWRlRmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJZZWFyIG9mIFN0dWR5XCIsXG5cdFx0XHRjYXRlZ29yaWVzOiBfLm1hcChzZXR0aW5ncy5ncmFkZUxpc3QsICh2YWwsIGtleSkgPT4gKHtcblx0XHRcdFx0bGFiZWw6IGtleSxcblx0XHRcdFx0aXRlbXM6IF8ucmVkdWNlKHZhbC5zb3J0KChhLCBiKSA9PiAoXCJsZXhpY2FsXCIgaW4gYSA/IGEubGV4aWNhbCA6IGEubmFtZSkudG9VcHBlckNhc2UoKS5sb2NhbGVDb21wYXJlKChcImxleGljYWxcIiBpbiBiID8gYi5sZXhpY2FsIDogYi5uYW1lKS50b1VwcGVyQ2FzZSgpKSksIChzdW0sIG51bSkgPT4ge1xuXHRcdFx0XHRcdHN1bS5wdXNoKHsgbmFtZTogbnVtLnZhbHVlLCBsYWJlbDogbnVtLm5hbWUgfSk7IHJldHVybiBzdW07XG5cdFx0XHRcdH0sIFtdKSxcblx0XHRcdH0pKSxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgZm9ybWF0RmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJmb3JtYXRGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIkZvcm1hdFwiLFxuXHRcdFx0Y2F0ZWdvcmllczogW1xuXHRcdFx0XHR7IGl0ZW1zOiB7IG1wZGY6IFwiUERGXCIsIG1wdWI6IFwiRVBVQlwiIH0gfSxcblx0XHRcdF0sXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdHRoaXMudWkuZmlsdGVyQmFyLnByZXBlbmQoZ3JpZC5maWx0ZXIoe1xuXHRcdFx0ZmlsdGVyQ29udGFpbmVyOiB0aGlzLnVpLmZpbHRlckJhcixcblx0XHRcdGZpbHRlcnM6IFt0ZXh0RmlsdGVyLCBsYW5ndWFnZUZpbHRlciwgc3ViamVjdEZpbHRlciwgZ3JhZGVGaWx0ZXIsIGZvcm1hdEZpbHRlcl0sXG5cdFx0XHRkZWZhdWx0RmlsdGVyczogW1widGV4dEZpbHRlclwiXSxcblx0XHR9KS5yZW5kZXIoKS5lbCk7XG5cdH0sXG5cblx0YWRkVG9rZW46IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGNvbnN0IG1vZGFsID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0dGl0bGU6IFwiPHNwYW4gY2xhc3M9J2ZhbCBmYS1rZXknLz4gQWN0aXZhdGUgQSBOZXcgVG9rZW5cIixcblx0XHRcdGJvZHk6IFwiPHA+RW50ZXIgdGhlIHRva2VuIGJlbG93LjwvcD48cD48dGV4dGFyZWEgcm93cz0nOCc+PC90ZXh0YXJlYT48L3A+XCIsXG5cdFx0XHRwZXJzaXN0OiB0cnVlLFxuXHRcdH0pO1xuXG5cdFx0Y29uc3QgdG9rZW5TdWNjZXNzID0gbW9kZWwgPT4ge1xuXHRcdFx0dGhpcy5jb2xsZWN0aW9uLmFkZChtb2RlbCk7XG5cdFx0XHRtb2RhbC5kZXN0cm95KCk7XG5cdFx0fTtcblxuXHRcdGNvbnN0IHRva2VuRXJyb3IgPSAobW9kZWwsIHhocikgPT4ge1xuXHRcdFx0Y29uc3QgYW5zd2VyID0gQXBwLnBhcnNlUmVzcG9uc2UoeGhyKTtcblx0XHRcdHJldHVybiBtb2RhbC5lbmFibGVCdXR0b25zKCkuaGlkZVNwaW5uZXIoKS5zaG93RXJyb3IoYW5zd2VyLmRldGFpbCB8fCBhbnN3ZXIuaW5mbyk7XG5cdFx0fTtcblxuXHRcdG1vZGFsLm9uKFwiYnV0dG9uOm9rXCIsICgpID0+IHtcblx0XHRcdGNvbnN0IHRva2VuID0gJChcInRleHRhcmVhXCIsIG1vZGFsLmVsKS52YWwoKTtcblx0XHRcdGlmICghdG9rZW4pXG5cdFx0XHRcdHJldHVybiBtb2RhbC5lbmFibGVCdXR0b25zKCkuaGlkZVNwaW5uZXIoKS5zaG93RXJyb3IoXCJObyB0b2tlbiBwcm92aWRlZFwiKTtcblxuXHRcdFx0Y29uc3QgbW9kZWwgPSBuZXcgTW9kZWwoeyB0b2tlbjogdG9rZW4gfSk7XG5cblx0XHRcdG1vZGVsLnNhdmUobnVsbCwgeyB3YWl0OiB0cnVlLCBzdWNjZXNzOiB0b2tlblN1Y2Nlc3MuYmluZCh0aGlzKSwgZXJyb3I6IHRva2VuRXJyb3IuYmluZCh0aGlzKSB9KTtcblx0XHR9KTtcblxuXHRcdG1vZGFsLnNob3coKTtcblx0fSxcbn0pOyJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\n\nvar TemporaryPasswordModel = require(\"../models/temporaryPasswordModel\");\n\nmodule.exports = Backbone.PageableCollection.extend({\n\tmodel: TemporaryPasswordModel,\n\n\turl: function url() {\n\t\treturn this.nonCachedURL();\n\t},\n\n\tnonCachedURL: function nonCachedURL() {\n\t\treturn settings.urlRoot + \"/api/1.0/passwords/temporary?paged=true&includeInvalid=\" + (this.unmanagedFilters.includeInvalid ? \"true\" : \"false\");\n\t},\n\n\tmode: \"server\",\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.unmanagedFilters = {\n\t\t\tincludeInvalid: false\n\t\t};\n\n\t\tthis.listenTo(Backbone.Radio.channel(\"temporaryPasswords\"), \"filter:includeInvalid\", this.onFilterIncludeInvalid.bind(this));\n\t},\n\n\tonFilterIncludeInvalid: function onFilterIncludeInvalid(newState) {\n\t\tthis.unmanagedFilters.includeInvalid = newState;\n\n\t\tthis.fetch({\n\t\t\treset: true,\n\t\t\turl: this.nonCachedURL()\n\t\t});\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlbXBvcmFyeVBhc3N3b3JkQ29sbGVjdGlvbi5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCJzZXR0aW5ncyIsIlRlbXBvcmFyeVBhc3N3b3JkTW9kZWwiLCJtb2R1bGUiLCJleHBvcnRzIiwiUGFnZWFibGVDb2xsZWN0aW9uIiwiZXh0ZW5kIiwibW9kZWwiLCJ1cmwiLCJub25DYWNoZWRVUkwiLCJ1cmxSb290IiwidW5tYW5hZ2VkRmlsdGVycyIsImluY2x1ZGVJbnZhbGlkIiwibW9kZSIsInN0YXRlIiwicGFnZVNpemUiLCJxdWVyeVBhcmFtcyIsInNvcnRLZXkiLCJpbml0aWFsaXplIiwibGlzdGVuVG8iLCJSYWRpbyIsImNoYW5uZWwiLCJvbkZpbHRlckluY2x1ZGVJbnZhbGlkIiwiYmluZCIsIm5ld1N0YXRlIiwiZmV0Y2giLCJyZXNldCIsInBhcnNlU3RhdGUiLCJyZXNwIiwidG90YWxSZWNvcmRzIiwidG90YWwiLCJwYXJzZVJlY29yZHMiLCJyb3dzIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7O0FBRUEsSUFBTUMsV0FBV0QsUUFBUSxjQUFSLENBQWpCOztBQUVBLElBQU1FLHlCQUF5QkYsUUFBUSxrQ0FBUixDQUEvQjs7QUFFQUcsT0FBT0MsT0FBUCxHQUFpQkwsU0FBU00sa0JBQVQsQ0FBNEJDLE1BQTVCLENBQW1DO0FBQ25EQyxRQUFPTCxzQkFENEM7O0FBR25ETSxNQUFLLGVBQVc7QUFDZixTQUFPLEtBQUtDLFlBQUwsRUFBUDtBQUNBLEVBTGtEOztBQU9uREEsZUFBYyx3QkFBVztBQUN4QixTQUFPUixTQUFTUyxPQUFULEdBQW1CLHlEQUFuQixJQUNMLEtBQUtDLGdCQUFMLENBQXNCQyxjQUF0QixHQUF1QyxNQUF2QyxHQUFnRCxPQUQzQyxDQUFQO0FBRUEsRUFWa0Q7O0FBWW5EQyxPQUFNLFFBWjZDOztBQWNuREMsUUFBTztBQUNOQyxZQUFVO0FBREosRUFkNEM7O0FBa0JuREMsY0FBYTtBQUNaRCxZQUFVLFVBREU7QUFFWkUsV0FBUztBQUZHLEVBbEJzQzs7QUF1Qm5EQyxhQUFZLHNCQUFXO0FBQ3RCLE9BQUtQLGdCQUFMLEdBQXdCO0FBQ3ZCQyxtQkFBZ0I7QUFETyxHQUF4Qjs7QUFJQSxPQUFLTyxRQUFMLENBQWNwQixTQUFTcUIsS0FBVCxDQUFlQyxPQUFmLENBQXVCLG9CQUF2QixDQUFkLEVBQTRELHVCQUE1RCxFQUFxRixLQUFLQyxzQkFBTCxDQUE0QkMsSUFBNUIsQ0FBaUMsSUFBakMsQ0FBckY7QUFDQSxFQTdCa0Q7O0FBK0JuREQseUJBQXdCLGdDQUFTRSxRQUFULEVBQW1CO0FBQzFDLE9BQUtiLGdCQUFMLENBQXNCQyxjQUF0QixHQUF1Q1ksUUFBdkM7O0FBRUEsT0FBS0MsS0FBTCxDQUFXO0FBQ1ZDLFVBQU8sSUFERztBQUVWbEIsUUFBSyxLQUFLQyxZQUFMO0FBRkssR0FBWDtBQUlBLEVBdENrRDs7QUF3Q25Ea0IsYUFBWSxvQkFBU0MsSUFBVCxFQUFlO0FBQzFCLFNBQU8sRUFBRUMsY0FBY0QsS0FBS0UsS0FBckIsRUFBUDtBQUNBLEVBMUNrRDs7QUE0Q25EQyxlQUFjLHNCQUFTSCxJQUFULEVBQWU7QUFDNUIsU0FBT0EsS0FBS0ksSUFBWjtBQUNBO0FBOUNrRCxDQUFuQyxDQUFqQiIsImZpbGUiOiJ0ZW1wb3JhcnlQYXNzd29yZENvbGxlY3Rpb24uanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IFRlbXBvcmFyeVBhc3N3b3JkTW9kZWwgPSByZXF1aXJlKFwiLi4vbW9kZWxzL3RlbXBvcmFyeVBhc3N3b3JkTW9kZWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuUGFnZWFibGVDb2xsZWN0aW9uLmV4dGVuZCh7XG5cdG1vZGVsOiBUZW1wb3JhcnlQYXNzd29yZE1vZGVsLFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubm9uQ2FjaGVkVVJMKCk7XG5cdH0sXG5cblx0bm9uQ2FjaGVkVVJMOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvcGFzc3dvcmRzL3RlbXBvcmFyeT9wYWdlZD10cnVlJmluY2x1ZGVJbnZhbGlkPVwiICtcblx0XHRcdCh0aGlzLnVubWFuYWdlZEZpbHRlcnMuaW5jbHVkZUludmFsaWQgPyBcInRydWVcIiA6IFwiZmFsc2VcIik7XG5cdH0sXG5cblx0bW9kZTogXCJzZXJ2ZXJcIixcblxuXHRzdGF0ZToge1xuXHRcdHBhZ2VTaXplOiAzMCxcblx0fSxcblxuXHRxdWVyeVBhcmFtczoge1xuXHRcdHBhZ2VTaXplOiBcInBhZ2VTaXplXCIsXG5cdFx0c29ydEtleTogXCJzb3J0QnlcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVubWFuYWdlZEZpbHRlcnMgPSB7XG5cdFx0XHRpbmNsdWRlSW52YWxpZDogZmFsc2UsXG5cdFx0fTtcblxuXHRcdHRoaXMubGlzdGVuVG8oQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcInRlbXBvcmFyeVBhc3N3b3Jkc1wiKSwgXCJmaWx0ZXI6aW5jbHVkZUludmFsaWRcIiwgdGhpcy5vbkZpbHRlckluY2x1ZGVJbnZhbGlkLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdG9uRmlsdGVySW5jbHVkZUludmFsaWQ6IGZ1bmN0aW9uKG5ld1N0YXRlKSB7XG5cdFx0dGhpcy51bm1hbmFnZWRGaWx0ZXJzLmluY2x1ZGVJbnZhbGlkID0gbmV3U3RhdGU7XG5cblx0XHR0aGlzLmZldGNoKHtcblx0XHRcdHJlc2V0OiB0cnVlLFxuXHRcdFx0dXJsOiB0aGlzLm5vbkNhY2hlZFVSTCgpLFxuXHRcdH0pO1xuXHR9LFxuXG5cdHBhcnNlU3RhdGU6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRyZXR1cm4geyB0b3RhbFJlY29yZHM6IHJlc3AudG90YWwgfTtcblx0fSxcblxuXHRwYXJzZVJlY29yZHM6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRyZXR1cm4gcmVzcC5yb3dzO1xuXHR9LFxufSk7XG4iXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\n\nvar SourceModel = require(\"../../models/tools/sourceModel.js\");\n\nmodule.exports = Backbone.PageableCollection.extend({\n\tmodel: SourceModel,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/tools/getExportImportBooks\";\n\t},\n\n\tstate: {\n\t\tpageSize: 10\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJvb2tFeHBvcnRJbXBvcnRTb3VyY2VzLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsInNldHRpbmdzIiwiU291cmNlTW9kZWwiLCJtb2R1bGUiLCJleHBvcnRzIiwiUGFnZWFibGVDb2xsZWN0aW9uIiwiZXh0ZW5kIiwibW9kZWwiLCJ1cmwiLCJ1cmxSb290Iiwic3RhdGUiLCJwYWdlU2l6ZSIsIm1vZGUiLCJxdWVyeVBhcmFtcyIsInNvcnRLZXkiLCJwYXJzZVN0YXRlIiwicmVzcCIsInRvdGFsUmVjb3JkcyIsInRvdGFsIiwicGFyc2VSZWNvcmRzIiwicm93cyJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCOztBQUVBLElBQU1DLFdBQVdELFFBQVEsY0FBUixDQUFqQjs7QUFFQSxJQUFNRSxjQUFjRixRQUFRLG1DQUFSLENBQXBCOztBQUVBRyxPQUFPQyxPQUFQLEdBQWlCTCxTQUFTTSxrQkFBVCxDQUE0QkMsTUFBNUIsQ0FBbUM7QUFDbkRDLFFBQU9MLFdBRDRDOztBQUduRE0sTUFBSyxlQUFXO0FBQ2YsU0FBT1AsU0FBU1EsT0FBVCxHQUFtQixxQ0FBMUI7QUFDQSxFQUxrRDs7QUFPbkRDLFFBQU87QUFDTkMsWUFBVTtBQURKLEVBUDRDO0FBVW5EQyxPQUFNLFFBVjZDOztBQVluREMsY0FBYTtBQUNaRixZQUFVLFVBREU7QUFFWkcsV0FBUztBQUZHLEVBWnNDOztBQWlCbkRDLGFBQVksb0JBQVNDLElBQVQsRUFBZTtBQUMxQixTQUFPLEVBQUVDLGNBQWNELEtBQUtFLEtBQXJCLEVBQVA7QUFDQSxFQW5Ca0Q7O0FBcUJuREMsZUFBYyxzQkFBU0gsSUFBVCxFQUFlO0FBQzVCLFNBQU9BLEtBQUtJLElBQVo7QUFDQTtBQXZCa0QsQ0FBbkMsQ0FBakIiLCJmaWxlIjoiYm9va0V4cG9ydEltcG9ydFNvdXJjZXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IFNvdXJjZU1vZGVsID0gcmVxdWlyZShcIi4uLy4uL21vZGVscy90b29scy9zb3VyY2VNb2RlbC5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5QYWdlYWJsZUNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IFNvdXJjZU1vZGVsLFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3Rvb2xzL2dldEV4cG9ydEltcG9ydEJvb2tzXCI7XG5cdH0sXG5cblx0c3RhdGU6IHtcblx0XHRwYWdlU2l6ZTogMTAsXG5cdH0sXG5cdG1vZGU6IFwic2VydmVyXCIsXG5cblx0cXVlcnlQYXJhbXM6IHtcblx0XHRwYWdlU2l6ZTogXCJwYWdlU2l6ZVwiLFxuXHRcdHNvcnRLZXk6IFwic29ydEJ5XCIsXG5cdH0sXG5cblx0cGFyc2VTdGF0ZTogZnVuY3Rpb24ocmVzcCkge1xuXHRcdHJldHVybiB7IHRvdGFsUmVjb3JkczogcmVzcC50b3RhbCB9O1xuXHR9LFxuXG5cdHBhcnNlUmVjb3JkczogZnVuY3Rpb24ocmVzcCkge1xuXHRcdHJldHVybiByZXNwLnJvd3M7XG5cdH0sXG59KTtcbiJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\n\nvar PromotedGroupModel = require(\"../../models/tools/promotedGroupModel\");\n\nmodule.exports = Backbone.Collection.extend({\n\tmodel: PromotedGroupModel,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/tools/migrateStudents/groups\";\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInByb21vdGVkR3JvdXBDb2xsZWN0aW9uLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsInNldHRpbmdzIiwiUHJvbW90ZWRHcm91cE1vZGVsIiwibW9kdWxlIiwiZXhwb3J0cyIsIkNvbGxlY3Rpb24iLCJleHRlbmQiLCJtb2RlbCIsInVybCIsInVybFJvb3QiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjs7QUFFQSxJQUFNQyxXQUFXRCxRQUFRLGNBQVIsQ0FBakI7O0FBRUEsSUFBTUUscUJBQXFCRixRQUFRLHVDQUFSLENBQTNCOztBQUVBRyxPQUFPQyxPQUFQLEdBQWlCTCxTQUFTTSxVQUFULENBQW9CQyxNQUFwQixDQUEyQjtBQUMzQ0MsUUFBT0wsa0JBRG9DOztBQUczQ00sTUFBSyxlQUFXO0FBQ2YsU0FBT1AsU0FBU1EsT0FBVCxHQUFtQix1Q0FBMUI7QUFDQTtBQUwwQyxDQUEzQixDQUFqQiIsImZpbGUiOiJwcm9tb3RlZEdyb3VwQ29sbGVjdGlvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5cbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxuY29uc3QgUHJvbW90ZWRHcm91cE1vZGVsID0gcmVxdWlyZShcIi4uLy4uL21vZGVscy90b29scy9wcm9tb3RlZEdyb3VwTW9kZWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuQ29sbGVjdGlvbi5leHRlbmQoe1xuXHRtb2RlbDogUHJvbW90ZWRHcm91cE1vZGVsLFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3Rvb2xzL21pZ3JhdGVTdHVkZW50cy9ncm91cHNcIjtcblx0fSxcbn0pO1xuIl19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\n\nvar PromotionPlanModel = require(\"../../models/tools/promotionPlanModel\");\n\nmodule.exports = Backbone.Collection.extend({\n\tmodel: PromotionPlanModel,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/tools/migrateStudents/plan\";\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInByb21vdGlvblBsYW5Db2xsZWN0aW9uLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsInNldHRpbmdzIiwiUHJvbW90aW9uUGxhbk1vZGVsIiwibW9kdWxlIiwiZXhwb3J0cyIsIkNvbGxlY3Rpb24iLCJleHRlbmQiLCJtb2RlbCIsInVybCIsInVybFJvb3QiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjs7QUFFQSxJQUFNQyxXQUFXRCxRQUFRLGNBQVIsQ0FBakI7O0FBRUEsSUFBTUUscUJBQXFCRixRQUFRLHVDQUFSLENBQTNCOztBQUVBRyxPQUFPQyxPQUFQLEdBQWlCTCxTQUFTTSxVQUFULENBQW9CQyxNQUFwQixDQUEyQjtBQUMzQ0MsUUFBT0wsa0JBRG9DOztBQUczQ00sTUFBSyxlQUFXO0FBQ2YsU0FBT1AsU0FBU1EsT0FBVCxHQUFtQixxQ0FBMUI7QUFDQTtBQUwwQyxDQUEzQixDQUFqQiIsImZpbGUiOiJwcm9tb3Rpb25QbGFuQ29sbGVjdGlvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5cbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxuY29uc3QgUHJvbW90aW9uUGxhbk1vZGVsID0gcmVxdWlyZShcIi4uLy4uL21vZGVscy90b29scy9wcm9tb3Rpb25QbGFuTW9kZWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuQ29sbGVjdGlvbi5leHRlbmQoe1xuXHRtb2RlbDogUHJvbW90aW9uUGxhbk1vZGVsLFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3Rvb2xzL21pZ3JhdGVTdHVkZW50cy9wbGFuXCI7XG5cdH0sXG59KTtcbiJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\n\nvar SourceModel = require(\"../../models/tools/sourceModel.js\");\n\nmodule.exports = Backbone.PageableCollection.extend({\n\tmodel: SourceModel,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/tools/resourceRepair/sources\";\n\t},\n\n\tstate: {\n\t\tpageSize: 10\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJlc291cmNlUmVwYWlyU291cmNlcy5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCJzZXR0aW5ncyIsIlNvdXJjZU1vZGVsIiwibW9kdWxlIiwiZXhwb3J0cyIsIlBhZ2VhYmxlQ29sbGVjdGlvbiIsImV4dGVuZCIsIm1vZGVsIiwidXJsIiwidXJsUm9vdCIsInN0YXRlIiwicGFnZVNpemUiLCJtb2RlIiwicXVlcnlQYXJhbXMiLCJzb3J0S2V5IiwicGFyc2VTdGF0ZSIsInJlc3AiLCJ0b3RhbFJlY29yZHMiLCJ0b3RhbCIsInBhcnNlUmVjb3JkcyIsInJvd3MiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjs7QUFFQSxJQUFNQyxXQUFXRCxRQUFRLGNBQVIsQ0FBakI7O0FBRUEsSUFBTUUsY0FBY0YsUUFBUSxtQ0FBUixDQUFwQjs7QUFFQUcsT0FBT0MsT0FBUCxHQUFpQkwsU0FBU00sa0JBQVQsQ0FBNEJDLE1BQTVCLENBQW1DO0FBQ25EQyxRQUFPTCxXQUQ0Qzs7QUFHbkRNLE1BQUssZUFBVztBQUNmLFNBQU9QLFNBQVNRLE9BQVQsR0FBbUIsdUNBQTFCO0FBQ0EsRUFMa0Q7O0FBT25EQyxRQUFPO0FBQ05DLFlBQVU7QUFESixFQVA0QztBQVVuREMsT0FBTSxRQVY2Qzs7QUFZbkRDLGNBQWE7QUFDWkYsWUFBVSxVQURFO0FBRVpHLFdBQVM7QUFGRyxFQVpzQzs7QUFpQm5EQyxhQUFZLG9CQUFTQyxJQUFULEVBQWU7QUFDMUIsU0FBTyxFQUFFQyxjQUFjRCxLQUFLRSxLQUFyQixFQUFQO0FBQ0EsRUFuQmtEOztBQXFCbkRDLGVBQWMsc0JBQVNILElBQVQsRUFBZTtBQUM1QixTQUFPQSxLQUFLSSxJQUFaO0FBQ0E7QUF2QmtELENBQW5DLENBQWpCIiwiZmlsZSI6InJlc291cmNlUmVwYWlyU291cmNlcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5cbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxuY29uc3QgU291cmNlTW9kZWwgPSByZXF1aXJlKFwiLi4vLi4vbW9kZWxzL3Rvb2xzL3NvdXJjZU1vZGVsLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLlBhZ2VhYmxlQ29sbGVjdGlvbi5leHRlbmQoe1xuXHRtb2RlbDogU291cmNlTW9kZWwsXG5cblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvdG9vbHMvcmVzb3VyY2VSZXBhaXIvc291cmNlc1wiO1xuXHR9LFxuXG5cdHN0YXRlOiB7XG5cdFx0cGFnZVNpemU6IDEwLFxuXHR9LFxuXHRtb2RlOiBcInNlcnZlclwiLFxuXG5cdHF1ZXJ5UGFyYW1zOiB7XG5cdFx0cGFnZVNpemU6IFwicGFnZVNpemVcIixcblx0XHRzb3J0S2V5OiBcInNvcnRCeVwiLFxuXHR9LFxuXG5cdHBhcnNlU3RhdGU6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRyZXR1cm4geyB0b3RhbFJlY29yZHM6IHJlc3AudG90YWwgfTtcblx0fSxcblxuXHRwYXJzZVJlY29yZHM6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRyZXR1cm4gcmVzcC5yb3dzO1xuXHR9LFxufSk7XG4iXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\n\nvar SourceModel = require(\"../../models/tools/sourceModel.js\");\n\nmodule.exports = Backbone.PageableCollection.extend({\n\tmodel: SourceModel,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/tools/userContentRepair/sources\";\n\t},\n\n\tstate: {\n\t\tpageSize: 10\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInVzZXJDb250ZW50UmVwYWlyU291cmNlcy5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCJzZXR0aW5ncyIsIlNvdXJjZU1vZGVsIiwibW9kdWxlIiwiZXhwb3J0cyIsIlBhZ2VhYmxlQ29sbGVjdGlvbiIsImV4dGVuZCIsIm1vZGVsIiwidXJsIiwidXJsUm9vdCIsInN0YXRlIiwicGFnZVNpemUiLCJtb2RlIiwicXVlcnlQYXJhbXMiLCJzb3J0S2V5IiwicGFyc2VTdGF0ZSIsInJlc3AiLCJ0b3RhbFJlY29yZHMiLCJ0b3RhbCIsInBhcnNlUmVjb3JkcyIsInJvd3MiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjs7QUFFQSxJQUFNQyxXQUFXRCxRQUFRLGNBQVIsQ0FBakI7O0FBRUEsSUFBTUUsY0FBY0YsUUFBUSxtQ0FBUixDQUFwQjs7QUFFQUcsT0FBT0MsT0FBUCxHQUFpQkwsU0FBU00sa0JBQVQsQ0FBNEJDLE1BQTVCLENBQW1DO0FBQ25EQyxRQUFPTCxXQUQ0Qzs7QUFHbkRNLE1BQUssZUFBVztBQUNmLFNBQU9QLFNBQVNRLE9BQVQsR0FBbUIsMENBQTFCO0FBQ0EsRUFMa0Q7O0FBT25EQyxRQUFPO0FBQ05DLFlBQVU7QUFESixFQVA0QztBQVVuREMsT0FBTSxRQVY2Qzs7QUFZbkRDLGNBQWE7QUFDWkYsWUFBVSxVQURFO0FBRVpHLFdBQVM7QUFGRyxFQVpzQzs7QUFpQm5EQyxhQUFZLG9CQUFTQyxJQUFULEVBQWU7QUFDMUIsU0FBTyxFQUFFQyxjQUFjRCxLQUFLRSxLQUFyQixFQUFQO0FBQ0EsRUFuQmtEOztBQXFCbkRDLGVBQWMsc0JBQVNILElBQVQsRUFBZTtBQUM1QixTQUFPQSxLQUFLSSxJQUFaO0FBQ0E7QUF2QmtELENBQW5DLENBQWpCIiwiZmlsZSI6InVzZXJDb250ZW50UmVwYWlyU291cmNlcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5cbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxuY29uc3QgU291cmNlTW9kZWwgPSByZXF1aXJlKFwiLi4vLi4vbW9kZWxzL3Rvb2xzL3NvdXJjZU1vZGVsLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLlBhZ2VhYmxlQ29sbGVjdGlvbi5leHRlbmQoe1xuXHRtb2RlbDogU291cmNlTW9kZWwsXG5cblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvdG9vbHMvdXNlckNvbnRlbnRSZXBhaXIvc291cmNlc1wiO1xuXHR9LFxuXG5cdHN0YXRlOiB7XG5cdFx0cGFnZVNpemU6IDEwLFxuXHR9LFxuXHRtb2RlOiBcInNlcnZlclwiLFxuXG5cdHF1ZXJ5UGFyYW1zOiB7XG5cdFx0cGFnZVNpemU6IFwicGFnZVNpemVcIixcblx0XHRzb3J0S2V5OiBcInNvcnRCeVwiLFxuXHR9LFxuXG5cdHBhcnNlU3RhdGU6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRyZXR1cm4geyB0b3RhbFJlY29yZHM6IHJlc3AudG90YWwgfTtcblx0fSxcblxuXHRwYXJzZVJlY29yZHM6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRyZXR1cm4gcmVzcC5yb3dzO1xuXHR9LFxufSk7XG4iXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\n\nvar SourceModel = require(\"../../models/tools/sourceModel.js\");\n\nmodule.exports = Backbone.PageableCollection.extend({\n\tmodel: SourceModel,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/tools/getExportImportUsers\";\n\t},\n\n\tstate: {\n\t\tpageSize: 10\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInVzZXJFeHBvcnRJbXBvcnRTb3VyY2VzLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsInNldHRpbmdzIiwiU291cmNlTW9kZWwiLCJtb2R1bGUiLCJleHBvcnRzIiwiUGFnZWFibGVDb2xsZWN0aW9uIiwiZXh0ZW5kIiwibW9kZWwiLCJ1cmwiLCJ1cmxSb290Iiwic3RhdGUiLCJwYWdlU2l6ZSIsIm1vZGUiLCJxdWVyeVBhcmFtcyIsInNvcnRLZXkiLCJwYXJzZVN0YXRlIiwicmVzcCIsInRvdGFsUmVjb3JkcyIsInRvdGFsIiwicGFyc2VSZWNvcmRzIiwicm93cyJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCOztBQUVBLElBQU1DLFdBQVdELFFBQVEsY0FBUixDQUFqQjs7QUFFQSxJQUFNRSxjQUFjRixRQUFRLG1DQUFSLENBQXBCOztBQUVBRyxPQUFPQyxPQUFQLEdBQWlCTCxTQUFTTSxrQkFBVCxDQUE0QkMsTUFBNUIsQ0FBbUM7QUFDbkRDLFFBQU9MLFdBRDRDOztBQUduRE0sTUFBSyxlQUFXO0FBQ2YsU0FBT1AsU0FBU1EsT0FBVCxHQUFtQixxQ0FBMUI7QUFDQSxFQUxrRDs7QUFPbkRDLFFBQU87QUFDTkMsWUFBVTtBQURKLEVBUDRDO0FBVW5EQyxPQUFNLFFBVjZDOztBQVluREMsY0FBYTtBQUNaRixZQUFVLFVBREU7QUFFWkcsV0FBUztBQUZHLEVBWnNDOztBQWlCbkRDLGFBQVksb0JBQVNDLElBQVQsRUFBZTtBQUMxQixTQUFPLEVBQUVDLGNBQWNELEtBQUtFLEtBQXJCLEVBQVA7QUFDQSxFQW5Ca0Q7O0FBcUJuREMsZUFBYyxzQkFBU0gsSUFBVCxFQUFlO0FBQzVCLFNBQU9BLEtBQUtJLElBQVo7QUFDQTtBQXZCa0QsQ0FBbkMsQ0FBakIiLCJmaWxlIjoidXNlckV4cG9ydEltcG9ydFNvdXJjZXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IFNvdXJjZU1vZGVsID0gcmVxdWlyZShcIi4uLy4uL21vZGVscy90b29scy9zb3VyY2VNb2RlbC5qc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5QYWdlYWJsZUNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IFNvdXJjZU1vZGVsLFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3Rvb2xzL2dldEV4cG9ydEltcG9ydFVzZXJzXCI7XG5cdH0sXG5cblx0c3RhdGU6IHtcblx0XHRwYWdlU2l6ZTogMTAsXG5cdH0sXG5cdG1vZGU6IFwic2VydmVyXCIsXG5cblx0cXVlcnlQYXJhbXM6IHtcblx0XHRwYWdlU2l6ZTogXCJwYWdlU2l6ZVwiLFxuXHRcdHNvcnRLZXk6IFwic29ydEJ5XCIsXG5cdH0sXG5cblx0cGFyc2VTdGF0ZTogZnVuY3Rpb24ocmVzcCkge1xuXHRcdHJldHVybiB7IHRvdGFsUmVjb3JkczogcmVzcC50b3RhbCB9O1xuXHR9LFxuXG5cdHBhcnNlUmVjb3JkczogZnVuY3Rpb24ocmVzcCkge1xuXHRcdHJldHVybiByZXNwLnJvd3M7XG5cdH0sXG59KTtcbiJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar $ = require(\"jquery\");\nvar raygun = require(\"raygun\");\n\nvar settings = require(\"app-settings\");\nvar SmallModal = require(\"../lib/smallModal\");\n\nvar AppsView = require(\"./views/appVersions\");\nvar BookChoices = require(\"./views/book-choices\");\nvar FeaturesView = require(\"./views/features\");\nvar LogsView = require(\"./views/logs\");\nvar SubjectView = require(\"./views/subjects\");\nvar TemporaryPasswordsView = require(\"./views/temporaryPasswords/layout\");\nvar TokenView = require(\"./views/tokens\");\nvar Tools = require(\"./views/tools/chooser\");\n\nvar Module = module.exports = new Backbone.Marionette.Application();\n\nvar radio = Backbone.Radio.channel(\"global\");\n\n// Add intra-module routing\nModule.routing = function (App) {\n\tModule.Router = {\n\t\troutes: {\n\t\t\tlogs: \"logs\",\n\t\t\tfeatures: \"features\",\n\t\t\t\"app-versions\": \"apps\",\n\t\t\t\"impersonate(/:username)\": \"impersonate\",\n\t\t\tunpersonate: \"unpersonate\",\n\t\t\ttemporaryPasswords: \"temporaryPasswords\",\n\t\t\t\"tools(/:tool)\": \"tools\",\n\t\t\t\"book-choices\": \"choices\",\n\t\t\ttokens: \"tokens\",\n\t\t\tsubjects: \"subjects\"\n\t\t},\n\n\t\tlogs: function logs() {\n\t\t\tApp.loadView(new LogsView());\n\t\t},\n\n\t\tfeatures: function features() {\n\t\t\tApp.loadView(new FeaturesView());\n\t\t},\n\n\t\tapps: function apps() {\n\t\t\tApp.loadView(new AppsView());\n\t\t},\n\n\t\ttools: function tools(tool) {\n\t\t\tApp.loadView(new Tools({ tool: tool }));\n\t\t},\n\n\t\tchoices: function choices() {\n\t\t\tApp.loadView(new BookChoices());\n\t\t},\n\n\t\ttokens: function tokens() {\n\t\t\tApp.loadView(new TokenView());\n\t\t},\n\n\t\tsubjects: function subjects() {\n\t\t\tApp.loadView(new SubjectView());\n\t\t},\n\n\t\timpersonate: function impersonate(username) {\n\t\t\tvar modal = new SmallModal({\n\t\t\t\ttitle: \"<span class='fa fa-user-secret'/> Impersonate User\",\n\t\t\t\tbody: \"<p>Who do you want to become?</p><input type='text' name='username' id='impersonateUserInput' autofocus/>\",\n\t\t\t\tpersist: true\n\t\t\t});\n\n\t\t\tvar fireImpersonate = function fireImpersonate(un) {\n\t\t\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\t\t\t$.ajax({\n\t\t\t\t\turl: settings.urlRoot + \"/api/1.0/users/\" + encodeURIComponent(un) + \"/impersonate\",\n\t\t\t\t\tdataType: \"json\",\n\t\t\t\t\tsuccess: function success(data) {\n\t\t\t\t\t\t// Disconnect any current websocket to allow it to reconnect\n\t\t\t\t\t\tApp.ws.loggedOut();\n\n\t\t\t\t\t\tApp.Session.loginSuccess(data, \"success\");\n\n\t\t\t\t\t\traygun(\"setUser\", {\n\t\t\t\t\t\t\tisAnonymous: false,\n\t\t\t\t\t\t\tidentifier: data.user.username,\n\t\t\t\t\t\t\temail: data.user.email,\n\t\t\t\t\t\t\tfirstName: data.user.firstname + \" <\" + user.username + \">\",\n\t\t\t\t\t\t\tfullName: data.user.firstname + \" \" + data.user.surname,\n\t\t\t\t\t\t\tuuid: user._id\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tApp.Router.initialLoaded = false;\n\n\t\t\t\t\t\tradio.trigger(App.Events.Commands.Navigate, \"/\");\n\t\t\t\t\t\tmodal.destroy();\n\t\t\t\t\t},\n\t\t\t\t\terror: function error(xhr) {\n\t\t\t\t\t\tvar answer = App.parseResponse(xhr);\n\t\t\t\t\t\tif (username) radio.trigger(App.Events.Commands.Toast, { content: answer.detail, icon: \"fa-exclamation-triangle\", iconColour: \"red\" });else modal.showError(answer.detail || answer.info);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tif (username) {\n\t\t\t\tfireImpersonate(username);\n\t\t\t} else {\n\t\t\t\tmodal.on(\"button:ok\", function (m) {\n\t\t\t\t\tfireImpersonate($(\"input\", m.el).val());\n\t\t\t\t});\n\t\t\t\tmodal.on(\"button:cancel\", function () {\n\t\t\t\t\tradio.trigger(App.Events.Commands.Navigate, \"/\");\n\t\t\t\t});\n\n\t\t\t\tmodal.show();\n\n\t\t\t\t$(\"#impersonateUserInput\").focus().on(\"keyup\", function (key) {\n\t\t\t\t\tif (key.which === 13) //enter\n\t\t\t\t\t\tfireImpersonate(key.target.value);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\tunpersonate: function unpersonate() {\n\t\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\t\t$.ajax({\n\t\t\t\turl: settings.urlRoot + \"/api/1.0/users/\" + encodeURIComponent(user.username) + \"/unpersonate\",\n\t\t\t\tdataType: \"json\",\n\t\t\t\tsuccess: function success(data) {\n\t\t\t\t\t// Disconnect any current websocket to allow it to reconnect\n\t\t\t\t\tApp.ws.loggedOut();\n\n\t\t\t\t\tApp.Session.loginSuccess(data, \"success\");\n\n\t\t\t\t\traygun(\"setUser\", {\n\t\t\t\t\t\tisAnonymous: false,\n\t\t\t\t\t\tidentifier: data.user.username,\n\t\t\t\t\t\temail: data.user.email,\n\t\t\t\t\t\tfirstName: data.user.firstname,\n\t\t\t\t\t\tfullName: data.user.firstname + \" \" + data.user.surname,\n\t\t\t\t\t\tuuid: data.user._id\n\t\t\t\t\t});\n\n\t\t\t\t\tApp.Router.initialLoaded = false;\n\n\t\t\t\t\tradio.trigger(App.Events.Commands.Navigate, \"/\");\n\t\t\t\t},\n\t\t\t\terror: function error() {\n\t\t\t\t\tuser.success = true;\n\t\t\t\t\tApp.Session.loginSuccess(user, \"success\");\n\t\t\t\t\tradio.trigger(App.Events.Commands.Navigate, \"/\");\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\ttemporaryPasswords: function temporaryPasswords() {\n\t\t\tApp.loadView(new TemporaryPasswordsView());\n\t\t}\n\t};\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIiQiLCJyYXlndW4iLCJzZXR0aW5ncyIsIlNtYWxsTW9kYWwiLCJBcHBzVmlldyIsIkJvb2tDaG9pY2VzIiwiRmVhdHVyZXNWaWV3IiwiTG9nc1ZpZXciLCJTdWJqZWN0VmlldyIsIlRlbXBvcmFyeVBhc3N3b3Jkc1ZpZXciLCJUb2tlblZpZXciLCJUb29scyIsIk1vZHVsZSIsIm1vZHVsZSIsImV4cG9ydHMiLCJNYXJpb25ldHRlIiwiQXBwbGljYXRpb24iLCJyYWRpbyIsIlJhZGlvIiwiY2hhbm5lbCIsInJvdXRpbmciLCJSb3V0ZXIiLCJyb3V0ZXMiLCJsb2dzIiwiZmVhdHVyZXMiLCJ1bnBlcnNvbmF0ZSIsInRlbXBvcmFyeVBhc3N3b3JkcyIsInRva2VucyIsInN1YmplY3RzIiwiQXBwIiwibG9hZFZpZXciLCJhcHBzIiwidG9vbHMiLCJ0b29sIiwiY2hvaWNlcyIsImltcGVyc29uYXRlIiwidXNlcm5hbWUiLCJtb2RhbCIsInRpdGxlIiwiYm9keSIsInBlcnNpc3QiLCJmaXJlSW1wZXJzb25hdGUiLCJ1c2VyIiwicmVxdWVzdCIsIkV2ZW50cyIsIlJlcXVlc3RzIiwiQ3VycmVudFVzZXIiLCJhamF4IiwidXJsIiwidXJsUm9vdCIsImVuY29kZVVSSUNvbXBvbmVudCIsInVuIiwiZGF0YVR5cGUiLCJzdWNjZXNzIiwiZGF0YSIsIndzIiwibG9nZ2VkT3V0IiwiU2Vzc2lvbiIsImxvZ2luU3VjY2VzcyIsImlzQW5vbnltb3VzIiwiaWRlbnRpZmllciIsImVtYWlsIiwiZmlyc3ROYW1lIiwiZmlyc3RuYW1lIiwiZnVsbE5hbWUiLCJzdXJuYW1lIiwidXVpZCIsIl9pZCIsImluaXRpYWxMb2FkZWQiLCJ0cmlnZ2VyIiwiQ29tbWFuZHMiLCJOYXZpZ2F0ZSIsImRlc3Ryb3kiLCJlcnJvciIsInhociIsImFuc3dlciIsInBhcnNlUmVzcG9uc2UiLCJUb2FzdCIsImNvbnRlbnQiLCJkZXRhaWwiLCJpY29uIiwiaWNvbkNvbG91ciIsInNob3dFcnJvciIsImluZm8iLCJvbiIsIm0iLCJlbCIsInZhbCIsInNob3ciLCJmb2N1cyIsImtleSIsIndoaWNoIiwidGFyZ2V0IiwidmFsdWUiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1DLElBQUlELFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUUsU0FBU0YsUUFBUSxRQUFSLENBQWY7O0FBRUEsSUFBTUcsV0FBV0gsUUFBUSxjQUFSLENBQWpCO0FBQ0EsSUFBTUksYUFBYUosUUFBUSxtQkFBUixDQUFuQjs7QUFFQSxJQUFNSyxXQUFXTCxRQUFRLHFCQUFSLENBQWpCO0FBQ0EsSUFBTU0sY0FBY04sUUFBUSxzQkFBUixDQUFwQjtBQUNBLElBQU1PLGVBQWVQLFFBQVEsa0JBQVIsQ0FBckI7QUFDQSxJQUFNUSxXQUFXUixRQUFRLGNBQVIsQ0FBakI7QUFDQSxJQUFNUyxjQUFjVCxRQUFRLGtCQUFSLENBQXBCO0FBQ0EsSUFBTVUseUJBQXlCVixRQUFRLG1DQUFSLENBQS9CO0FBQ0EsSUFBTVcsWUFBWVgsUUFBUSxnQkFBUixDQUFsQjtBQUNBLElBQU1ZLFFBQVFaLFFBQVEsdUJBQVIsQ0FBZDs7QUFFQSxJQUFNYSxTQUFTQyxPQUFPQyxPQUFQLEdBQWlCLElBQUloQixTQUFTaUIsVUFBVCxDQUFvQkMsV0FBeEIsRUFBaEM7O0FBRUEsSUFBTUMsUUFBUW5CLFNBQVNvQixLQUFULENBQWVDLE9BQWYsQ0FBdUIsUUFBdkIsQ0FBZDs7QUFFQTtBQUNBUCxPQUFPUSxPQUFQLEdBQWlCLGVBQU87QUFDdkJSLFFBQU9TLE1BQVAsR0FBZ0I7QUFDZkMsVUFBUTtBQUNQQyxTQUFNLE1BREM7QUFFUEMsYUFBVSxVQUZIO0FBR1AsbUJBQWdCLE1BSFQ7QUFJUCw4QkFBMkIsYUFKcEI7QUFLUEMsZ0JBQWEsYUFMTjtBQU1QQyx1QkFBb0Isb0JBTmI7QUFPUCxvQkFBaUIsT0FQVjtBQVFQLG1CQUFn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QjBELG1CQUFhLEtBREk7QUFFakJDLGtCQUFZTixLQUFLWixJQUFMLENBQVVOLFFBRkw7QUFHakJ5QixhQUFPUCxLQUFLWixJQUFMLENBQVVtQixLQUhBO0FBSWpCQyxpQkFBV1IsS0FBS1osSUFBTCxDQUFVcUIsU0FKSjtBQUtqQkMsZ0JBQVVWLEtBQUtaLElBQUwsQ0FBVXFCLFNBQVYsR0FBc0IsR0FBdEIsR0FBNEJULEtBQUtaLElBQUwsQ0FBVXVCLE9BTC9CO0FBTWpCQyxZQUFNWixLQUFLWixJQUFMLENBQVV5QjtBQU5DLE1BQWxCOztBQVNBdEMsU0FBSVIsTUFBSixDQUFXK0MsYUFBWCxHQUEyQixLQUEzQjs7QUFFQW5ELFdBQU1vRCxPQUFOLENBQWN4QyxJQUFJZSxNQUFKLENBQVcwQixRQUFYLENBQW9CQyxRQUFsQyxFQUE0QyxHQUE1QztBQUNBLEtBckJLO0FBc0JORSxXQUFPLGlCQUFXO0FBQ2pCL0IsVUFBS1csT0FBTCxHQUFlLElBQWY7QUFDQXhCLFNBQUk0QixPQUFKLENBQVlDLFlBQVosQ0FBeUJoQixJQUF6QixFQUErQixTQUEvQjtBQUNBekIsV0FBTW9ELE9BQU4sQ0FBY3hDLElBQUllLE1BQUosQ0FBVzBCLFFBQVgsQ0FBb0JDLFFBQWxDLEVBQTRDLEdBQTVDO0FBQ0E7QUExQkssSUFBUDtBQTRCQSxHQXhJYzs7QUEwSWY3QyxzQkFBb0IsOEJBQVc7QUFDOUJHLE9BQUlDLFFBQUosQ0FBYSxJQUFJckIsc0JBQUosRUFBYjtBQUNBO0FBNUljLEVBQWhCO0FBOElBLENBL0lEIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgcmF5Z3VuID0gcmVxdWlyZShcInJheWd1blwiKTtcblxuY29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuY29uc3QgU21hbGxNb2RhbCA9IHJlcXVpcmUoXCIuLi9saWIvc21hbGxNb2RhbFwiKTtcblxuY29uc3QgQXBwc1ZpZXcgPSByZXF1aXJlKFwiLi92aWV3cy9hcHBWZXJzaW9uc1wiKTtcbmNvbnN0IEJvb2tDaG9pY2VzID0gcmVxdWlyZShcIi4vdmlld3MvYm9vay1jaG9pY2VzXCIpO1xuY29uc3QgRmVhdHVyZXNWaWV3ID0gcmVxdWlyZShcIi4vdmlld3MvZmVhdHVyZXNcIik7XG5jb25zdCBMb2dzVmlldyA9IHJlcXVpcmUoXCIuL3ZpZXdzL2xvZ3NcIik7XG5jb25zdCBTdWJqZWN0VmlldyA9IHJlcXVpcmUoXCIuL3ZpZXdzL3N1YmplY3RzXCIpO1xuY29uc3QgVGVtcG9yYXJ5UGFzc3dvcmRzVmlldyA9IHJlcXVpcmUoXCIuL3ZpZXdzL3RlbXBvcmFyeVBhc3N3b3Jkcy9sYXlvdXRcIik7XG5jb25zdCBUb2tlblZpZXcgPSByZXF1aXJlKFwiLi92aWV3cy90b2tlbnNcIik7XG5jb25zdCBUb29scyA9IHJlcXVpcmUoXCIuL3ZpZXdzL3Rvb2xzL2Nob29zZXJcIik7XG5cbmNvbnN0IE1vZHVsZSA9IG1vZHVsZS5leHBvcnRzID0gbmV3IEJhY2tib25lLk1hcmlvbmV0dGUuQXBwbGljYXRpb24oKTtcblxuY29uc3QgcmFkaW8gPSBCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZ2xvYmFsXCIpO1xuXG4vLyBBZGQgaW50cmEtbW9kdWxlIHJvdXRpbmdcbk1vZHVsZS5yb3V0aW5nID0gQXBwID0+IHtcblx0TW9kdWxlLlJvdXRlciA9IHtcblx0XHRyb3V0ZXM6IHtcblx0XHRcdGxvZ3M6IFwibG9nc1wiLFxuXHRcdFx0ZmVhdHVyZXM6IFwiZmVhdHVyZXNcIixcblx0XHRcdFwiYXBwLXZlcnNpb25zXCI6IFwiYXBwc1wiLFxuXHRcdFx0XCJpbXBlcnNvbmF0ZSgvOnVzZXJuYW1lKVwiOiBcImltcGVyc29uYXRlXCIsXG5cdFx0XHR1bnBlcnNvbmF0ZTogXCJ1bnBlcnNvbmF0ZVwiLFxuXHRcdFx0dGVtcG9yYXJ5UGFzc3dvcmRzOiBcInRlbXBvcmFyeVBhc3N3b3Jkc1wiLFxuXHRcdFx0XCJ0b29scygvOnRvb2wpXCI6IFwidG9vbHNcIixcblx0XHRcdFwiYm9vay1jaG9pY2VzXCI6IFwiY2hvaWNlc1wiLFxuXHRcdFx0dG9rZW5zOiBcInRva2Vuc1wiLFxuXHRcdFx0c3ViamVjdHM6IFwic3ViamVjdHNcIixcblx0XHR9LFxuXG5cdFx0bG9nczogZnVuY3Rpb24oKSB7XG5cdFx0XHRBcHAubG9hZFZpZXcobmV3IExvZ3NWaWV3KCkpO1xuXHRcdH0sXG5cblx0XHRmZWF0dXJlczogZnVuY3Rpb24oKSB7XG5cdFx0XHRBcHAubG9hZFZpZXcobmV3IEZlYXR1cmVzVmlldygpKTtcblx0XHR9LFxuXG5cdFx0YXBwczogZnVuY3Rpb24oKSB7XG5cdFx0XHRBcHAubG9hZFZpZXcobmV3IEFwcHNWaWV3KCkpO1xuXHRcdH0sXG5cblx0XHR0b29sczogZnVuY3Rpb24odG9vbCkge1xuXHRcdFx0QXBwLmxvYWRWaWV3KG5ldyBUb29scyh7IHRvb2w6IHRvb2wgfSkpO1xuXHRcdH0sXG5cblx0XHRjaG9pY2VzOiBmdW5jdGlvbigpIHtcblx0XHRcdEFwcC5sb2FkVmlldyhuZXcgQm9va0Nob2ljZXMoKSk7XG5cdFx0fSxcblxuXHRcdHRva2VuczogZnVuY3Rpb24oKSB7XG5cdFx0XHRBcHAubG9hZFZpZXcobmV3IFRva2VuVmlldygpKTtcblx0XHR9LFxuXG5cdFx0c3ViamVjdHM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0QXBwLmxvYWRWaWV3KG5ldyBTdWJqZWN0VmlldygpKTtcblx0XHR9LFxuXG5cdFx0aW1wZXJzb25hdGU6IGZ1bmN0aW9uKHVzZXJuYW1lKSB7XG5cdFx0XHRjb25zdCBtb2RhbCA9IG5ldyBTbWFsbE1vZGFsKHtcblx0XHRcdFx0dGl0bGU6IFwiPHNwYW4gY2xhc3M9J2ZhIGZhLXVzZXItc2VjcmV0Jy8+IEltcGVyc29uYXRlIFVzZXJcIixcblx0XHRcdFx0Ym9keTogXCI8cD5XaG8gZG8geW91IHdhbnQgdG8gYmVjb21lPzwvcD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0ndXNlcm5hbWUnIGlkPSdpbXBlcnNvbmF0ZVVzZXJJbnB1dCcgYXV0b2ZvY3VzLz5cIixcblx0XHRcdFx0cGVyc2lzdDogdHJ1ZSxcblx0XHRcdH0pO1xuXG5cdFx0XHRjb25zdCBmaXJlSW1wZXJzb25hdGUgPSB1biA9PiB7XG5cdFx0XHRcdGNvbnN0IHVzZXIgPSByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpO1xuXG5cdFx0XHRcdCQuYWpheCh7XG5cdFx0XHRcdFx0dXJsOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC91c2Vycy9cIiArIGVuY29kZVVSSUNvbXBvbmVudCh1bikgKyBcIi9pbXBlcnNvbmF0ZVwiLFxuXHRcdFx0XHRcdGRhdGFUeXBlOiBcImpzb25cIixcblx0XHRcdFx0XHRzdWNjZXNzOiBmdW5jdGlvbihkYXRhKSB7XG5cdFx0XHRcdFx0XHQvLyBEaXNjb25uZWN0IGFueSBjdXJyZW50IHdlYnNvY2tldCB0byBhbGxvdyBpdCB0byByZWNvbm5lY3Rcblx0XHRcdFx0XHRcdEFwcC53cy5sb2dnZWRPdXQoKTtcblxuXHRcdFx0XHRcdFx0QXBwLlNlc3Npb24ubG9naW5TdWNjZXNzKGRhdGEsIFwic3VjY2Vzc1wiKTtcblxuXHRcdFx0XHRcdFx0cmF5Z3VuKFwic2V0VXNlclwiLCB7XG5cdFx0XHRcdFx0XHRcdGlzQW5vbnltb3VzOiBmYWxzZSxcblx0XHRcdFx0XHRcdFx0aWRlbnRpZmllcjogZGF0YS51c2VyLnVzZXJuYW1lLFxuXHRcdFx0XHRcdFx0XHRlbWFpbDogZGF0YS51c2VyLmVtYWlsLFxuXHRcdFx0XHRcdFx0XHRmaXJzdE5hbWU6IGRhdGEudXNlci5maXJzdG5hbWUgKyBcIiA8XCIgKyB1c2VyLnVzZXJuYW1lICsgXCI+XCIsXG5cdFx0XHRcdFx0XHRcdGZ1bGxOYW1lOiBkYXRhLnVzZXIuZmlyc3RuYW1lICsgXCIgXCIgKyBkYXRhLnVzZXIuc3VybmFtZSxcblx0XHRcdFx0XHRcdFx0dXVpZDogdXNlci5faWQsXG5cdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFx0QXBwLlJvdXRlci5pbml0aWFsTG9hZGVkID0gZmFsc2U7XG5cblx0XHRcdFx0XHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0ZSwgXCIvXCIpO1xuXHRcdFx0XHRcdFx0bW9kYWwuZGVzdHJveSgpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0ZXJyb3I6IGZ1bmN0aW9uKHhocikge1xuXHRcdFx0XHRcdFx0Y29uc3QgYW5zd2VyID0gQXBwLnBhcnNlUmVzcG9uc2UoeGhyKTtcblx0XHRcdFx0XHRcdGlmICh1c2VybmFtZSlcblx0XHRcdFx0XHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7IGNvbnRlbnQ6IGFuc3dlci5kZXRhaWwsIGljb246IFwiZmEtZXhjbGFtYXRpb24tdHJpYW5nbGVcIiwgaWNvbkNvbG91cjogXCJyZWRcIiB9KTtcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0bW9kYWwuc2hvd0Vycm9yKGFuc3dlci5kZXRhaWwgfHwgYW5zd2VyLmluZm8pO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0pO1xuXHRcdFx0fTtcblxuXHRcdFx0aWYgKHVzZXJuYW1lKSB7XG5cdFx0XHRcdGZpcmVJbXBlcnNvbmF0ZSh1c2VybmFtZSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0bW9kYWwub24oXCJidXR0b246b2tcIiwgbSA9PiB7XG5cdFx0XHRcdFx0ZmlyZUltcGVyc29uYXRlKCQoXCJpbnB1dFwiLCBtLmVsKS52YWwoKSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRtb2RhbC5vbihcImJ1dHRvbjpjYW5jZWxcIiwgKCkgPT4ge1xuXHRcdFx0XHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0ZSwgXCIvXCIpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRtb2RhbC5zaG93KCk7XG5cblx0XHRcdFx0JChcIiNpbXBlcnNvbmF0ZVVzZXJJbnB1dFwiKS5mb2N1cygpLm9uKFwia2V5dXBcIiwga2V5ID0+IHtcblx0XHRcdFx0XHRpZiAoa2V5LndoaWNoID09PSAxMylcdC8vZW50ZXJcblx0XHRcdFx0XHRcdGZpcmVJbXBlcnNvbmF0ZShrZXkudGFyZ2V0LnZhbHVlKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdHVucGVyc29uYXRlOiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbnN0IHVzZXIgPSByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpO1xuXG5cdFx0XHQkLmFqYXgoe1xuXHRcdFx0XHR1cmw6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3VzZXJzL1wiICsgZW5jb2RlVVJJQ29tcG9uZW50KHVzZXIudXNlcm5hbWUpICsgXCIvdW5wZXJzb25hdGVcIixcblx0XHRcdFx0ZGF0YVR5cGU6IFwianNvblwiLFxuXHRcdFx0XHRzdWNjZXNzOiBmdW5jdGlvbihkYXRhKSB7XG5cdFx0XHRcdFx0Ly8gRGlzY29ubmVjdCBhbnkgY3VycmVudCB3ZWJzb2NrZXQgdG8gYWxsb3cgaXQgdG8gcmVjb25uZWN0XG5cdFx0XHRcdFx0QXBwLndzLmxvZ2dlZE91dCgpO1xuXG5cdFx0XHRcdFx0QXBwLlNlc3Npb24ubG9naW5TdWNjZXNzKGRhdGEsIFwic3VjY2Vzc1wiKTtcblxuXHRcdFx0XHRcdHJheWd1bihcInNldFVzZXJcIiwge1xuXHRcdFx0XHRcdFx0aXNBbm9ueW1vdXM6IGZhbHNlLFxuXHRcdFx0XHRcdFx0aWRlbnRpZmllcjogZGF0YS51c2VyLnVzZXJuYW1lLFxuXHRcdFx0XHRcdFx0ZW1haWw6IGRhdGEudXNlci5lbWFpbCxcblx0XHRcdFx0XHRcdGZpcnN0TmFtZTogZGF0YS51c2VyLmZpcnN0bmFtZSxcblx0XHRcdFx0XHRcdGZ1bGxOYW1lOiBkYXRhLnVzZXIuZmlyc3RuYW1lICsgXCIgXCIgKyBkYXRhLnVzZXIuc3VybmFtZSxcblx0XHRcdFx0XHRcdHV1aWQ6IGRhdGEudXNlci5faWQsXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRBcHAuUm91dGVyLmluaXRpYWxMb2FkZWQgPSBmYWxzZTtcblxuXHRcdFx0XHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0ZSwgXCIvXCIpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRlcnJvcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0dXNlci5zdWNjZXNzID0gdHJ1ZTtcblx0XHRcdFx0XHRBcHAuU2Vzc2lvbi5sb2dpblN1Y2Nlc3ModXNlciwgXCJzdWNjZXNzXCIpO1xuXHRcdFx0XHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0ZSwgXCIvXCIpO1xuXHRcdFx0XHR9LFxuXHRcdFx0fSk7XG5cdFx0fSxcblxuXHRcdHRlbXBvcmFyeVBhc3N3b3JkczogZnVuY3Rpb24oKSB7XG5cdFx0XHRBcHAubG9hZFZpZXcobmV3IFRlbXBvcmFyeVBhc3N3b3Jkc1ZpZXcoKSk7XG5cdFx0fSxcblx0fTtcbn07Il19",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\n\nmodule.exports = Backbone.Model.extend({\n\tdefaults: {\n\t\tauthenticated: false\n\t},\n\n\tidAttribute: \"record_id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/passwords/temporary\";\n\t},\n\n\tvalidate: function validate(attributes, options) {\n\t\tvar errors = {};\n\n\t\tif ((!options.validateAttributes || options.validateAttributes.user_id) && !attributes.user_id) errors.life = \"You must a user for whom to create a temporary password.\";\n\n\t\tif (_.keys(errors).length > 0) return errors;\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlbXBvcmFyeVBhc3N3b3JkTW9kZWwuanMiXSwibmFtZXMiOlsiXyIsInJlcXVpcmUiLCJCYWNrYm9uZSIsInNldHRpbmdzIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1vZGVsIiwiZXh0ZW5kIiwiZGVmYXVsdHMiLCJhdXRoZW50aWNhdGVkIiwiaWRBdHRyaWJ1dGUiLCJ1cmxSb290IiwidmFsaWRhdGUiLCJhdHRyaWJ1dGVzIiwib3B0aW9ucyIsImVycm9ycyIsInZhbGlkYXRlQXR0cmlidXRlcyIsInVzZXJfaWQiLCJsaWZlIiwia2V5cyIsImxlbmd0aCJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsSUFBSUMsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNQyxXQUFXRCxRQUFRLFVBQVIsQ0FBakI7O0FBRUEsSUFBTUUsV0FBV0YsUUFBUSxjQUFSLENBQWpCOztBQUVBRyxPQUFPQyxPQUFQLEdBQWlCSCxTQUFTSSxLQUFULENBQWVDLE1BQWYsQ0FBc0I7QUFDdENDLFdBQVU7QUFDVEMsaUJBQWU7QUFETixFQUQ0Qjs7QUFLdENDLGNBQWEsV0FMeUI7O0FBT3RDQyxVQUFTLG1CQUFXO0FBQ25CLFNBQU9SLFNBQVNRLE9BQVQsR0FBbUIsOEJBQTFCO0FBQ0EsRUFUcUM7O0FBV3RDQyxXQUFVLGtCQUFTQyxVQUFULEVBQXFCQyxPQUFyQixFQUE4QjtBQUN2QyxNQUFNQyxTQUFTLEVBQWY7O0FBRUEsTUFBSSxDQUFDLENBQUNELFFBQVFFLGtCQUFULElBQStCRixRQUFRRSxrQkFBUixDQUEyQkMsT0FBM0QsS0FBdUUsQ0FBQ0osV0FBV0ksT0FBdkYsRUFDQ0YsT0FBT0csSUFBUCxHQUFjLDBEQUFkOztBQUVELE1BQUlsQixFQUFFbUIsSUFBRixDQUFPSixNQUFQLEVBQWVLLE1BQWYsR0FBd0IsQ0FBNUIsRUFDQyxPQUFPTCxNQUFQO0FBQ0Q7QUFuQnFDLENBQXRCLENBQWpCIiwiZmlsZSI6InRlbXBvcmFyeVBhc3N3b3JkTW9kZWwuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5cbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5Nb2RlbC5leHRlbmQoe1xuXHRkZWZhdWx0czoge1xuXHRcdGF1dGhlbnRpY2F0ZWQ6IGZhbHNlLFxuXHR9LFxuXG5cdGlkQXR0cmlidXRlOiBcInJlY29yZF9pZFwiLFxuXG5cdHVybFJvb3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9wYXNzd29yZHMvdGVtcG9yYXJ5XCI7XG5cdH0sXG5cblx0dmFsaWRhdGU6IGZ1bmN0aW9uKGF0dHJpYnV0ZXMsIG9wdGlvbnMpIHtcblx0XHRjb25zdCBlcnJvcnMgPSB7fTtcblxuXHRcdGlmICgoIW9wdGlvbnMudmFsaWRhdGVBdHRyaWJ1dGVzIHx8IG9wdGlvbnMudmFsaWRhdGVBdHRyaWJ1dGVzLnVzZXJfaWQpICYmICFhdHRyaWJ1dGVzLnVzZXJfaWQpXG5cdFx0XHRlcnJvcnMubGlmZSA9IFwiWW91IG11c3QgYSB1c2VyIGZvciB3aG9tIHRvIGNyZWF0ZSBhIHRlbXBvcmFyeSBwYXNzd29yZC5cIjtcblxuXHRcdGlmIChfLmtleXMoZXJyb3JzKS5sZW5ndGggPiAwKVxuXHRcdFx0cmV0dXJuIGVycm9ycztcblx0fSxcbn0pO1xuIl19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\n\nmodule.exports = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"_id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/tools/\" + this.get(\"endpoint\") + \"?_id=\" + this.get(\"id\");\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImltcG9ydE1vZGVsLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsInNldHRpbmdzIiwibW9kdWxlIiwiZXhwb3J0cyIsIkVwb3h5IiwiTW9kZWwiLCJleHRlbmQiLCJpZEF0dHJpYnV0ZSIsInVybFJvb3QiLCJnZXQiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjs7QUFFQSxJQUFNQyxXQUFXRCxRQUFRLGNBQVIsQ0FBakI7O0FBRUFFLE9BQU9DLE9BQVAsR0FBaUJKLFNBQVNLLEtBQVQsQ0FBZUMsS0FBZixDQUFxQkMsTUFBckIsQ0FBNEI7QUFDNUNDLGNBQWEsS0FEK0I7O0FBRzVDQyxVQUFTLG1CQUFXO0FBQ25CLFNBQU9QLFNBQVNPLE9BQVQsR0FBbUIsaUJBQW5CLEdBQXVDLEtBQUtDLEdBQUwsQ0FBUyxVQUFULENBQXZDLEdBQThELE9BQTlELEdBQXdFLEtBQUtBLEdBQUwsQ0FBUyxJQUFULENBQS9FO0FBQ0E7QUFMMkMsQ0FBNUIsQ0FBakIiLCJmaWxlIjoiaW1wb3J0TW9kZWwuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuRXBveHkuTW9kZWwuZXh0ZW5kKHtcblx0aWRBdHRyaWJ1dGU6IFwiX2lkXCIsXG5cblx0dXJsUm9vdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3Rvb2xzL1wiICsgdGhpcy5nZXQoXCJlbmRwb2ludFwiKSArIFwiP19pZD1cIiArIHRoaXMuZ2V0KFwiaWRcIik7XG5cdH0sXG59KTtcbiJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nmodule.exports = Backbone.Model.extend({\n\tdefaults: {\n\t\t_id: null\n\t},\n\n\tidAttribute: \"_id\"\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInByb21vdGVkR3JvdXBNb2RlbC5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCJtb2R1bGUiLCJleHBvcnRzIiwiTW9kZWwiLCJleHRlbmQiLCJkZWZhdWx0cyIsIl9pZCIsImlkQXR0cmlidXRlIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7O0FBRUFDLE9BQU9DLE9BQVAsR0FBaUJILFNBQVNJLEtBQVQsQ0FBZUMsTUFBZixDQUFzQjtBQUN0Q0MsV0FBVTtBQUNUQyxPQUFLO0FBREksRUFENEI7O0FBS3RDQyxjQUFhO0FBTHlCLENBQXRCLENBQWpCIiwiZmlsZSI6InByb21vdGVkR3JvdXBNb2RlbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHtcblx0XHRfaWQ6IG51bGwsXG5cdH0sXG5cblx0aWRBdHRyaWJ1dGU6IFwiX2lkXCIsXG59KTtcbiJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nmodule.exports = Backbone.Model.extend({\n\tdefaults: {\n\t\tvalue: \"NO DATA\"\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInByb21vdGlvblBsYW5Nb2RlbC5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCJtb2R1bGUiLCJleHBvcnRzIiwiTW9kZWwiLCJleHRlbmQiLCJkZWZhdWx0cyIsInZhbHVlIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7O0FBRUFDLE9BQU9DLE9BQVAsR0FBaUJILFNBQVNJLEtBQVQsQ0FBZUMsTUFBZixDQUFzQjtBQUN0Q0MsV0FBVTtBQUNUQyxTQUFPO0FBREU7QUFENEIsQ0FBdEIsQ0FBakIiLCJmaWxlIjoicHJvbW90aW9uUGxhbk1vZGVsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5Nb2RlbC5leHRlbmQoe1xuXHRkZWZhdWx0czoge1xuXHRcdHZhbHVlOiBcIk5PIERBVEFcIixcblx0fSxcbn0pO1xuIl19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\n\nmodule.exports = Backbone.Model.extend({\n\tdefaults: {},\n\n\tidAttribute: \"_id\",\n\n\tcomputeds: {\n\t\tbookFormat: function bookFormat() {\n\t\t\treturn \"<img src='\" + settings.urlRoot + \"/images/\" + (this.get(\"format\") === \"mpub\" ? \"epub\" : \"pdf\") + \".png' style='max-width: 25px;'>\";\n\t\t}\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNvdXJjZU1vZGVsLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsInNldHRpbmdzIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1vZGVsIiwiZXh0ZW5kIiwiZGVmYXVsdHMiLCJpZEF0dHJpYnV0ZSIsImNvbXB1dGVkcyIsImJvb2tGb3JtYXQiLCJ1cmxSb290IiwiZ2V0Il0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7O0FBRUEsSUFBTUMsV0FBV0QsUUFBUSxjQUFSLENBQWpCOztBQUVBRSxPQUFPQyxPQUFQLEdBQWlCSixTQUFTSyxLQUFULENBQWVDLE1BQWYsQ0FBc0I7QUFDdENDLFdBQVUsRUFENEI7O0FBR3RDQyxjQUFhLEtBSHlCOztBQUt0Q0MsWUFBVztBQUNWQyxjQUFZLHNCQUFXO0FBQ3RCLFVBQU8sZUFBZVIsU0FBU1MsT0FBeEIsR0FBa0MsVUFBbEMsSUFBZ0QsS0FBS0MsR0FBTCxDQUFTLFFBQVQsTUFBdUIsTUFBdkIsR0FBZ0MsTUFBaEMsR0FBeUMsS0FBekYsSUFBa0csaUNBQXpHO0FBQ0E7QUFIUztBQUwyQixDQUF0QixDQUFqQiIsImZpbGUiOiJzb3VyY2VNb2RlbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5cbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5Nb2RlbC5leHRlbmQoe1xuXHRkZWZhdWx0czoge30sXG5cblx0aWRBdHRyaWJ1dGU6IFwiX2lkXCIsXG5cblx0Y29tcHV0ZWRzOiB7XG5cdFx0Ym9va0Zvcm1hdDogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gXCI8aW1nIHNyYz0nXCIgKyBzZXR0aW5ncy51cmxSb290ICsgXCIvaW1hZ2VzL1wiICsgKHRoaXMuZ2V0KFwiZm9ybWF0XCIpID09PSBcIm1wdWJcIiA/IFwiZXB1YlwiIDogXCJwZGZcIikgKyBcIi5wbmcnIHN0eWxlPSdtYXgtd2lkdGg6IDI1cHg7Jz5cIjtcblx0XHR9LFxuXHR9LFxufSk7XG4iXX0=",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar formBody_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"form-field-container\\\">\\n\\t\\t<div class=\\\"form-field-label\\\">\\n\\t\\t\\t<span>\";\noutput += runtime.suppressValue(((lineno = 3, colno = 27, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isFileInput\"), \"isFileInput\", context, []))?\"\":\"Version\"), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"form-field-value-container app-version-modal-version-region\\\">\\n\\t\\t\\t\";\nif((lineno = 7, colno = 18, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isFileInput\"), \"isFileInput\", context, []))) {\noutput += \"\\n\\t\\t\\t\\t<input type=\\\"file\\\" class=\\\"app-version-modal-file-input\\\" accept=\\\".apk\\\">\\n\\t\\t\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t\\t\\t<input type=\\\"text\\\" value=\\\"\";\noutput += runtime.suppressValue((lineno = 10, colno = 34, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"val\"), \"val\", context, [])), env.opts.autoescape);\noutput += \"\\\"/>\\n\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar formBody_oldRoot = formBody_obj.root;\nformBody_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tformBody_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"formBody\": new nunjucks.Template( {obj: formBody_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar editor_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"app-versions-form-panel form-panel\\\">\\n\\t\\t<table class=\\\"app-versions-table\\\">\\n\\t\\t\\t<thead>\\n\\t\\t\\t\\t<tr>\\n\\t\\t\\t\\t\\t<td>Device Platform</td>\\n\\t\\t\\t\\t\\t<td>Version</td>\\n\\t\\t\\t\\t</tr>\\n\\t\\t\\t</thead>\\n\\n\\t\\t\\t<tbody>\\n\\t\\t\\t\\t<tr>\\n\\t\\t\\t\\t\\t<td><span class=\\\"app-version-label\\\">Android</span></td>\\n\\t\\t\\t\\t\\t<td>\\n\\t\\t\\t\\t\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"apkUploads\")) {\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t<span class=\\\"app-version-value app-version-android\\\">\\n\\t\\t\\t\\t\\t\\t\\t\\t\";\noutput += runtime.suppressValue(((lineno = 16, colno = 44, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isAndroidAPKSet\"), \"isAndroidAPKSet\", context, []))?\"(pending save)\":(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"android\")),\"version\") || \"(none)\")), env.opts.autoescape);\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t</span>\\n\\t\\t\\t\\t\\t\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t<span>\";\noutput += runtime.suppressValue((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"android\")),\"version\") || \"(none)\"), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t\\t</td>\\n\\t\\t\\t\\t</tr>\\n\\n\\t\\t\\t\\t<tr>\\n\\t\\t\\t\\t\\t<td><span class=\\\"app-version-label\\\">Android (Compatibility)</span></td>\\n\\t\\t\\t\\t\\t<td>\\n\\t\\t\\t\\t\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"apkUploads\")) {\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t<span class=\\\"app-version-value app-version-android-compatibility\\\">\\n\\t\\t\\t\\t\\t\\t\\t\\t\";\noutput += runtime.suppressValue(((lineno = 29, colno = 57, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isAndroidCompatibilityAPKSet\"), \"isAndroidCompatibilityAPKSet\", context, []))?\"(pending save)\":(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"androidCompatibility\")),\"version\") || \"(none)\")), env.opts.autoescape);\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t</span>\\n\\t\\t\\t\\t\\t\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t<span>\";\noutput += runtime.suppressValue((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"androidCompatibility\")),\"version\") || \"(none)\"), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t\\t</td>\\n\\t\\t\\t\\t</tr>\\n\\n\\t\\t\\t\\t<tr>\\n\\t\\t\\t\\t\\t<td><span class=\\\"app-version-label\\\">iOS</span></td>\\n\\t\\t\\t\\t\\t<td><span class=\\\"app-version-value app-version-ios\\\">\";\noutput += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"ios\")),\"version\") || \"(none)\", env.opts.autoescape);\noutput += \"</span></td>\\n\\t\\t\\t\\t</tr>\\n\\n\\t\\t\\t\\t<tr>\\n\\t\\t\\t\\t\\t<td><span class=\\\"app-version-label\\\">Windows</span></td>\\n\\t\\t\\t\\t\\t<td><span class=\\\"app-version-value app-version-windows\\\">\";\noutput += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"windows\")),\"version\") || \"(none)\", env.opts.autoescape);\noutput += \"</span></td>\\n\\t\\t\\t\\t</tr>\\n\\n\\t\\t\\t\\t<tr>\\n\\t\\t\\t\\t\\t<td><span class=\\\"app-version-label\\\">Windows 8.1</span></td>\\n\\t\\t\\t\\t\\t<td><span class=\\\"app-version-value app-version-windows81\\\">\";\noutput += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"windows81\")),\"version\") || \"(none)\", env.opts.autoescape);\noutput += \"</span></td>\\n\\t\\t\\t\\t</tr>\\n\\n\\t\\t\\t\\t<tr>\\n\\t\\t\\t\\t\\t<td><span class=\\\"app-version-label\\\">Mac</span></td>\\n\\t\\t\\t\\t\\t<td><span class=\\\"app-version-value app-version-mac\\\">\";\noutput += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"mac\")),\"version\") || \"(none)\", env.opts.autoescape);\noutput += \"</span></td>\\n\\t\\t\\t\\t</tr>\\n\\t\\t\\t</tbody>\\n\\t\\t</table>\\n\\t</div>\\n\\n\\t<div class=\\\"app-versions-control-panel\\\">\\n\\t\\t<button type=\\\"button\\\" class=\\\"button save \";\noutput += runtime.suppressValue(((lineno = 61, colno = 63, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isDataChanged\"), \"isDataChanged\", context, []))?\"\":\"disabled\"), env.opts.autoescape);\noutput += \"\\\">Save</button>\\n\\t\\t<span class=\\\"working hide\\\"><span class=\\\"spinner-icon spinner-small\\\"/> Updating...</span>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar editor_oldRoot = editor_obj.root;\neditor_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\teditor_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar layout_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"header-region hide\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"status-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"editor-region hide\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"app-versions-success-result-panel hide\\\">\\n\\t\\t<span>App versions saved.</span>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar layout_oldRoot = layout_obj.root;\nlayout_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlayout_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"editor\": new nunjucks.Template( {obj: editor_obj, type: \"code\"}, env),\t\"layout\": new nunjucks.Template( {obj: layout_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"header\\\">\\n\\t<h4 class=\\\"title left\\\"><span class=\\\"fal fa-check-circle\\\"/>&nbsp;Book Choices</h4>\\n\\t<div class=\\\"actions\\\">\\n\\t\\t<div class=\\\"upload\\\"><span class=\\\"fal fa-cloud-upload\\\"/> Upload Choices Manually</div>\\n\\t</div>\\n</div>\\n\\n<div class=\\\"ops-bar\\\">\\n\\t<div class=\\\"filters\\\"></div>\\n\\t<div class=\\\"counter\\\"></div>\\n</div>\\n\\n<div class=\\\"grid\\\"></div>\\n\\n<div class=\\\"paging\\\"></div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar initial_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n<span class=\\\"spinner-icon spinner-small\\\"/> Loading features...\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar initial_oldRoot = initial_obj.root;\ninitial_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tinitial_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\";\nvar macro_t_1 = runtime.makeMacro(\n[\"key\", \"feat\"], \n[\"subkey\", \"disabled\"], \nfunction (l_key, l_feat, kwargs) {\nframe = frame.push();\nkwargs = kwargs || {};\nif (kwargs.hasOwnProperty(\"caller\")) {\nframe.set(\"caller\", kwargs.caller); }\nframe.set(\"key\", l_key);\nframe.set(\"feat\", l_feat);\nframe.set(\"subkey\", kwargs.hasOwnProperty(\"subkey\") ? kwargs[\"subkey\"] : \"\");\nframe.set(\"disabled\", kwargs.hasOwnProperty(\"disabled\") ? kwargs[\"disabled\"] : false);\nvar t_2 = \"\";t_2 += \"\\n\\t<div class=\\\"row\\\">\\n\\t\";\nif(runtime.memberLookup((l_feat),\"type\") == \"object\") {\nt_2 += \"\\n\\n\\t\\t<div class=\\\"large-3 columns\\\">\\n\\t\\t\\t<label class=\\\"inlined prefix\\\">\";\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"</label>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"large-9 columns\\\">\\n\\t\\t\\t\";\nframe = frame.push();\nvar t_5 = runtime.memberLookup((l_feat),\"def\");\nif(t_5) {var t_3;\nif(runtime.isArray(t_5)) {\nvar t_4 = t_5.length;\nfor(t_3=0; t_3 < t_5.length; t_3++) {\nvar t_6 = t_5[t_3][0]\nframe.set(\"key2\", t_5[t_3][0]);\nvar t_7 = t_5[t_3][1]\nframe.set(\"feat2\", t_5[t_3][1]);\nframe.set(\"loop.index\", t_3 + 1);\nframe.set(\"loop.index0\", t_3);\nframe.set(\"loop.revindex\", t_4 - t_3);\nframe.set(\"loop.revindex0\", t_4 - t_3 - 1);\nframe.set(\"loop.first\", t_3 === 0);\nframe.set(\"loop.last\", t_3 === t_4 - 1);\nframe.set(\"loop.length\", t_4);\nt_2 += \"\\n\\t\\t\\t\\t\";\nt_2 += runtime.suppressValue((lineno = 10, colno = 11, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"render\"), \"render\", context, [t_6,t_7,l_key + \".\",runtime.contextOrFrameLookup(context, frame, \"disabled\")])), env.opts.autoescape);\nt_2 += \"\\n\\t\\t\\t\";\n;\n}\n} else {\nt_3 = -1;\nvar t_4 = runtime.keys(t_5).length;\nfor(var t_8 in t_5) {\nt_3++;\nvar t_9 = t_5[t_8];\nframe.set(\"key2\", t_8);\nframe.set(\"feat2\", t_9);\nframe.set(\"loop.index\", t_3 + 1);\nframe.set(\"loop.index0\", t_3);\nframe.set(\"loop.revindex\", t_4 - t_3);\nframe.set(\"loop.revindex0\", t_4 - t_3 - 1);\nframe.set(\"loop.first\", t_3 === 0);\nframe.set(\"loop.last\", t_3 === t_4 - 1);\nframe.set(\"loop.length\", t_4);\nt_2 += \"\\n\\t\\t\\t\\t\";\nt_2 += runtime.suppressValue((lineno = 10, colno = 11, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"render\"), \"render\", context, [t_8,t_9,l_key + \".\",runtime.contextOrFrameLookup(context, frame, \"disabled\")])), env.opts.autoescape);\nt_2 += \"\\n\\t\\t\\t\";\n;\n}\n}\n}\nframe = frame.pop();\nt_2 += \"\\n\\t\\t</div>\\n\\t\";\n;\n}\nelse {\nif(runtime.memberLookup((l_feat),\"type\") == \"display-array\") {\nt_2 += \"\\n\\n\\t\\t<div class=\\\"large-3 columns\\\">\\n\\t\\t\\t<label class=\\\"inlined prefix\\\">\";\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"</label>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"large-9 columns\\\">\\n\\t\\t\\t<label for=\\\"_\";\nt_2 += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"subkey\"), env.opts.autoescape);\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"\\\">\";\nt_2 += runtime.suppressValue(runtime.memberLookup((l_feat),\"desc\"), env.opts.autoescape);\nt_2 += \"</label>\\n\\t\\t\\t<div style=\\\"margin-bottom: 10px\\\">\";\nt_2 += runtime.suppressValue((lineno = 20, colno = 50, runtime.callWrap(runtime.memberLookup((runtime.memberLookup((l_feat),\"val\")),\"join\"), \"feat[\\\"val\\\"][\\\"join\\\"]\", context, [\", \"])), env.opts.autoescape);\nt_2 += \"</div>\\n\\t\\t</div>\\n\\n\\t\";\n;\n}\nelse {\nif(runtime.memberLookup((l_feat),\"type\") == \"display\") {\nt_2 += \"\\n\\n\\t\\t<div class=\\\"large-3 columns\\\">\\n\\t\\t\\t<label class=\\\"inlined prefix\\\">\";\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"</label>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"large-9 columns\\\">\\n\\t\\t\\t<label for=\\\"_\";\nt_2 += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"subkey\"), env.opts.autoescape);\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"\\\">\";\nt_2 += runtime.suppressValue(runtime.memberLookup((l_feat),\"desc\"), env.opts.autoescape);\nt_2 += \"</label>\\n\\t\\t\\t<div style=\\\"margin-bottom: 10px\\\">\";\nt_2 += runtime.suppressValue(runtime.memberLookup((l_feat),\"val\"), env.opts.autoescape);\nt_2 += \"</div>\\n\\t\\t</div>\\n\\n\\t\";\n;\n}\nelse {\nif(runtime.memberLookup((l_feat),\"type\") == \"set-number\") {\nt_2 += \"\\n\\n\\t\\t<div class=\\\"large-3 columns\\\">\\n\\t\\t\\t<label class=\\\"inlined prefix\\\">\";\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"</label>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"large-9 columns\\\">\\n\\t\\t\\t<label for=\\\"_\";\nt_2 += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"subkey\"), env.opts.autoescape);\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"\\\">\";\nt_2 += runtime.suppressValue(runtime.memberLookup((l_feat),\"desc\"), env.opts.autoescape);\nt_2 += \"</label>\\n\\t\\t\\t<select name=\\\"\";\nt_2 += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"subkey\"), env.opts.autoescape);\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"\\\" id=\\\"_\";\nt_2 += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"subkey\"), env.opts.autoescape);\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"\\\" class=\\\"set-number\\\" \";\nt_2 += runtime.suppressValue((runtime.memberLookup((l_feat),\"multiple\")?\"multiple\":\"\"), env.opts.autoescape);\nt_2 += \" \";\nt_2 += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"disabled\") || !(lineno = 40, colno = 140, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"hasFeatureAccess\"), \"hasFeatureAccess\", context, [runtime.contextOrFrameLookup(context, frame, \"subkey\"),l_key]))?\"disabled\":\"\"), env.opts.autoescape);\nt_2 += \">\\n\\t\\t\\t\";\nframe = frame.push();\nvar t_12 = runtime.memberLookup((l_feat),\"values\");\nif(t_12) {var t_11 = t_12.length;\nfor(var t_10=0; t_10 < t_12.length; t_10++) {\nvar t_13 = t_12[t_10];\nframe.set(\"v\", t_13);\nframe.set(\"loop.index\", t_10 + 1);\nframe.set(\"loop.index0\", t_10);\nframe.set(\"loop.revindex\", t_11 - t_10);\nframe.set(\"loop.revindex0\", t_11 - t_10 - 1);\nframe.set(\"loop.first\", t_10 === 0);\nframe.set(\"loop.last\", t_10 === t_11 - 1);\nframe.set(\"loop.length\", t_11);\nt_2 += \"\\n\\t\\t\\t\\t<option value=\\\"\";\nt_2 += runtime.suppressValue(t_13, env.opts.autoescape);\nt_2 += \"\\\" \";\nt_2 += runtime.suppressValue(((env.getFilter(\"contains\").call(context, runtime.memberLookup((l_feat),\"val\"),t_13))?\"selected\":\"\"), env.opts.autoescape);\nt_2 += \">\";\nt_2 += runtime.suppressValue(t_13, env.opts.autoescape);\nt_2 += \"</option>\\n\\t\\t\\t\";\n;\n}\n}\nframe = frame.pop();\nt_2 += \"\\n\\t\\t\\t</select>\\n\\t\\t</div>\\n\\n\\t\";\n;\n}\nelse {\nif(runtime.memberLookup((l_feat),\"type\") == \"set-string\") {\nt_2 += \"\\n\\n\\t\\t<div class=\\\"large-3 columns\\\">\\n\\t\\t\\t<label class=\\\"inlined prefix\\\">\";\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"</label>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"large-9 columns\\\">\\n\\t\\t\\t<label for=\\\"_\";\nt_2 += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"subkey\"), env.opts.autoescape);\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"\\\">\";\nt_2 += runtime.suppressValue(runtime.memberLookup((l_feat),\"desc\"), env.opts.autoescape);\nt_2 += \"</label>\\n\\t\\t\\t<select name=\\\"\";\nt_2 += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"subkey\"), env.opts.autoescape);\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"\\\" id=\\\"_\";\nt_2 += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"subkey\"), env.opts.autoescape);\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"\\\" class=\\\"set-string\\\" \";\nt_2 += runtime.suppressValue((runtime.memberLookup((l_feat),\"multiple\")?\"multiple\":\"\"), env.opts.autoescape);\nt_2 += \" \";\nt_2 += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"disabled\") || !(lineno = 54, colno = 148, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"hasFeatureAccess\"), \"hasFeatureAccess\", context, [runtime.contextOrFrameLookup(context, frame, \"subkey\"),l_key]))?\"disabled\":\"\"), env.opts.autoescape);\nt_2 += \">\\n\\t\\t\\t\";\nframe = frame.push();\nvar t_16 = runtime.memberLookup((l_feat),\"values\");\nif(t_16) {var t_15 = t_16.length;\nfor(var t_14=0; t_14 < t_16.length; t_14++) {\nvar t_17 = t_16[t_14];\nframe.set(\"v\", t_17);\nframe.set(\"loop.index\", t_14 + 1);\nframe.set(\"loop.index0\", t_14);\nframe.set(\"loop.revindex\", t_15 - t_14);\nframe.set(\"loop.revindex0\", t_15 - t_14 - 1);\nframe.set(\"loop.first\", t_14 === 0);\nframe.set(\"loop.last\", t_14 === t_15 - 1);\nframe.set(\"loop.length\", t_15);\nt_2 += \"\\n\\t\\t\\t\\t<option value=\\\"\";\nt_2 += runtime.suppressValue(t_17, env.opts.autoescape);\nt_2 += \"\\\" \";\nt_2 += runtime.suppressValue(((env.getFilter(\"contains\").call(context, runtime.memberLookup((l_feat),\"val\"),t_17))?\"selected\":\"\"), env.opts.autoescape);\nt_2 += \">\";\nt_2 += runtime.suppressValue(t_17, env.opts.autoescape);\nt_2 += \"</option>\\n\\t\\t\\t\";\n;\n}\n}\nframe = frame.pop();\nt_2 += \"\\n\\t\\t\\t</select>\\n\\t\\t</div>\\n\\n\\t\";\n;\n}\nelse {\nif(runtime.memberLookup((l_feat),\"type\") == \"boolean\") {\nt_2 += \"\\n\\n\\t\\t<div class=\\\"large-3 columns\\\">\\n\\t\\t\\t<label class=\\\"inlined prefix\\\">\";\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"</label>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"large-9 columns\\\">\\n\\t\\t\\t<label for=\\\"_\";\nt_2 += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"subkey\"), env.opts.autoescape);\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"\\\">\";\nt_2 += runtime.suppressValue(runtime.memberLookup((l_feat),\"desc\"), env.opts.autoescape);\nt_2 += \"</label>\\n\\t\\t\\t<input type=\\\"checkbox\\\" name=\\\"\";\nt_2 += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"subkey\"), env.opts.autoescape);\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"\\\" id=\\\"_\";\nt_2 += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"subkey\"), env.opts.autoescape);\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"\\\" \";\nt_2 += runtime.suppressValue((runtime.memberLookup((l_feat),\"val\")?\"checked\":\"\"), env.opts.autoescape);\nt_2 += \" value=\\\"1\\\" \";\nt_2 += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"disabled\") || !(lineno = 68, colno = 146, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"hasFeatureAccess\"), \"hasFeatureAccess\", context, [runtime.contextOrFrameLookup(context, frame, \"subkey\"),l_key]))?\"disabled\":\"\"), env.opts.autoescape);\nt_2 += \"/>\\n\\t\\t</div>\\n\\n\\t\";\n;\n}\nelse {\nif(runtime.memberLookup((l_feat),\"type\") == \"string\" || runtime.memberLookup((l_feat),\"type\") == \"number\") {\nt_2 += \"\\n\\n\\t\\t<div class=\\\"large-3 columns\\\">\\n\\t\\t\\t<label class=\\\"inlined prefix\\\">\";\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"</label>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"large-9 columns\\\">\\n\\t\\t\\t<label>\";\nt_2 += runtime.suppressValue(runtime.memberLookup((l_feat),\"desc\"), env.opts.autoescape);\nt_2 += \"\\n\\t\\t\\t\\t<input type=\\\"text\\\" name=\\\"\";\nt_2 += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"subkey\"), env.opts.autoescape);\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"\\\" class=\\\"\";\nt_2 += runtime.suppressValue(runtime.memberLookup((l_feat),\"type\"), env.opts.autoescape);\nt_2 += \"\\\" value=\\\"\";\nt_2 += runtime.suppressValue(runtime.memberLookup((l_feat),\"val\"), env.opts.autoescape);\nt_2 += \"\\\" placeholder=\\\"\";\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"\\\" \";\nt_2 += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"disabled\") || !(lineno = 78, colno = 140, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"hasFeatureAccess\"), \"hasFeatureAccess\", context, [runtime.contextOrFrameLookup(context, frame, \"subkey\"),l_key]))?\"readonly\":\"\"), env.opts.autoescape);\nt_2 += \"/>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\";\n;\n}\nelse {\nif(runtime.memberLookup((l_feat),\"type\") == \"array\") {\nt_2 += \"\\n\\n\\t\\t<div class=\\\"large-3 columns\\\">\\n\\t\\t\\t<label class=\\\"inlined prefix\\\">\";\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"</label>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"large-9 columns\\\">\\n\\t\\t\\t<label>\";\nt_2 += runtime.suppressValue(runtime.memberLookup((l_feat),\"desc\"), env.opts.autoescape);\nt_2 += \"\\n\\t\\t\\t\\t<textarea name=\\\"\";\nt_2 += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"subkey\"), env.opts.autoescape);\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"\\\" value=\\\"\";\nt_2 += runtime.suppressValue(runtime.memberLookup((l_feat),\"val\"), env.opts.autoescape);\nt_2 += \"\\\" placeholder=\\\"\";\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"\\\" rows=\\\"5\\\" \";\nt_2 += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"disabled\") || !(lineno = 89, colno = 122, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"hasFeatureAccess\"), \"hasFeatureAccess\", context, [runtime.contextOrFrameLookup(context, frame, \"subkey\"),l_key]))?\"readonly\":\"\"), env.opts.autoescape);\nt_2 += \">\";\nt_2 += runtime.suppressValue(env.getFilter(\"join\").call(context, runtime.memberLookup((l_feat),\"val\"),\"\\n\"), env.opts.autoescape);\nt_2 += \"</textarea>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\";\n;\n}\nelse {\nif(runtime.memberLookup((l_feat),\"type\") == \"date\") {\nt_2 += \"\\n\\n\\t\\t<div class=\\\"large-3 columns\\\">\\n\\t\\t\\t<label class=\\\"inlined prefix\\\">\";\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"</label>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"large-9 columns\\\">\\n\\t\\t\\t<label>\";\nt_2 += runtime.suppressValue(runtime.memberLookup((l_feat),\"desc\"), env.opts.autoescape);\nt_2 += \"\\n\\t\\t\\t\\t<input type=\\\"text\\\" readonly name=\\\"\";\nt_2 += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"subkey\"), env.opts.autoescape);\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"\\\" class=\\\"date\\\" value=\\\"\";\nt_2 += runtime.suppressValue(runtime.memberLookup((l_feat),\"val\"), env.opts.autoescape);\nt_2 += \"\\\" placeholder=\\\"\";\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"\\\" data-value=\\\"\";\nt_2 += runtime.suppressValue(runtime.memberLookup((l_feat),\"val\"), env.opts.autoescape);\nt_2 += \"\\\" \";\nt_2 += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"disabled\") || !(lineno = 100, colno = 166, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"hasFeatureAccess\"), \"hasFeatureAccess\", context, [runtime.contextOrFrameLookup(context, frame, \"subkey\"),l_key]))?\"readonly\":\"\"), env.opts.autoescape);\nt_2 += \"/>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\";\n;\n}\nelse {\nif(runtime.memberLookup((l_feat),\"type\") == \"unixdate\") {\nt_2 += \"\\n\\n\\t\\t<div class=\\\"large-3 columns\\\">\\n\\t\\t\\t<label class=\\\"inlined prefix\\\">\";\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"</label>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"large-9 columns\\\">\\n\\t\\t\\t<label>\";\nt_2 += runtime.suppressValue(runtime.memberLookup((l_feat),\"desc\"), env.opts.autoescape);\nt_2 += \"\\n\\t\\t\\t\\t<input type=\\\"text\\\" readonly name=\\\"\";\nt_2 += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"subkey\"), env.opts.autoescape);\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"\\\" class=\\\"unixdate\\\" value=\\\"\";\nt_2 += runtime.suppressValue(runtime.memberLookup((l_feat),\"val\"), env.opts.autoescape);\nt_2 += \"\\\" placeholder=\\\"\";\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"\\\" data-value=\\\"\";\nt_2 += runtime.suppressValue(runtime.memberLookup((l_feat),\"val\"), env.opts.autoescape);\nt_2 += \"\\\" \";\nt_2 += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"disabled\") || !(lineno = 111, colno = 170, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"hasFeatureAccess\"), \"hasFeatureAccess\", context, [runtime.contextOrFrameLookup(context, frame, \"subkey\"),l_key]))?\"readonly\":\"\"), env.opts.autoescape);\nt_2 += \"/>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\";\n;\n}\nelse {\nif(runtime.memberLookup((l_feat),\"type\") == \"timerange\") {\nt_2 += \"\\n\\n\\t\\t<div class=\\\"large-3 columns\\\">\\n\\t\\t\\t<label class=\\\"inlined prefix\\\">\";\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"</label>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"large-9 columns\\\">\\n\\t\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t\\t<label>\";\nt_2 += runtime.suppressValue(runtime.memberLookup((l_feat),\"desc\"), env.opts.autoescape);\nt_2 += \"</label>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t\\t<div class=\\\"row collapse\\\">\\n\\t\\t\\t\\t<div class=\\\"large-4 columns\\\">\\n\\t\\t\\t\\t\\t<label>from\\n\\t\\t\\t\\t\\t\\t<input type=\\\"text\\\" size=\\\"6\\\" name=\\\"\";\nt_2 += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"subkey\"), env.opts.autoescape);\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"-1\\\" class=\\\"time\\\" data-value=\\\"\";\nt_2 += runtime.suppressValue(env.getFilter(\"first\").call(context, env.getFilter(\"split\").call(context, runtime.memberLookup((l_feat),\"val\"),\"-\")), env.opts.autoescape);\nt_2 += \"\\\" \";\nt_2 += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"disabled\") || !(lineno = 129, colno = 156, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"hasFeatureAccess\"), \"hasFeatureAccess\", context, [runtime.contextOrFrameLookup(context, frame, \"subkey\"),l_key]))?\"readonly\":\"\"), env.opts.autoescape);\nt_2 += \">\\n\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t<div class=\\\"large-4 columns\\\">\\n\\t\\t\\t\\t\\t<label>until\\n\\t\\t\\t\\t\\t\\t<input type=\\\"text\\\" size=\\\"6\\\" name=\\\"\";\nt_2 += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"subkey\"), env.opts.autoescape);\nt_2 += runtime.suppressValue(l_key, env.opts.autoescape);\nt_2 += \"-2\\\" class=\\\"time\\\" data-value=\\\"\";\nt_2 += runtime.suppressValue(env.getFilter(\"last\").call(context, env.getFilter(\"split\").call(context, runtime.memberLookup((l_feat),\"val\"),\"-\")), env.opts.autoescape);\nt_2 += \"\\\" \";\nt_2 += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"disabled\") || !(lineno = 134, colno = 155, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"hasFeatureAccess\"), \"hasFeatureAccess\", context, [runtime.contextOrFrameLookup(context, frame, \"subkey\"),l_key]))?\"readonly\":\"\"), env.opts.autoescape);\nt_2 += \">\\n\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t<div class=\\\"large-4 columns\\\"></div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\";\n;\n}\n;\n}\n;\n}\n;\n}\n;\n}\n;\n}\n;\n}\n;\n}\n;\n}\n;\n}\n;\n}\nt_2 += \"\\n\\t</div>\\n\";\n;\nframe = frame.pop();\nreturn new runtime.SafeString(t_2);\n});\ncontext.addExport(\"render\");\ncontext.setVariable(\"render\", macro_t_1);\noutput += \"\\n\\n<h3 class=\\\"fal fa-cogs\\\"> Features</h3>\\n\\n\";\nframe = frame.push();\nvar t_20 = runtime.contextOrFrameLookup(context, frame, \"features\");\nif(t_20) {var t_18;\nif(runtime.isArray(t_20)) {\nvar t_19 = t_20.length;\nfor(t_18=0; t_18 < t_20.length; t_18++) {\nvar t_21 = t_20[t_18][0]\nframe.set(\"key\", t_20[t_18][0]);\nvar t_22 = t_20[t_18][1]\nframe.set(\"feat\", t_20[t_18][1]);\nframe.set(\"loop.index\", t_18 + 1);\nframe.set(\"loop.index0\", t_18);\nframe.set(\"loop.revindex\", t_19 - t_18);\nframe.set(\"loop.revindex0\", t_19 - t_18 - 1);\nframe.set(\"loop.first\", t_18 === 0);\nframe.set(\"loop.last\", t_18 === t_19 - 1);\nframe.set(\"loop.length\", t_19);\noutput += \"\\n\\t\";\noutput += runtime.suppressValue((lineno = 148, colno = 8, runtime.callWrap(macro_t_1, \"render\", context, [t_21,t_22])), env.opts.autoescape);\noutput += \"\\n\";\n;\n}\n} else {\nt_18 = -1;\nvar t_19 = runtime.keys(t_20).length;\nfor(var t_23 in t_20) {\nt_18++;\nvar t_24 = t_20[t_23];\nframe.set(\"key\", t_23);\nframe.set(\"feat\", t_24);\nframe.set(\"loop.index\", t_18 + 1);\nframe.set(\"loop.index0\", t_18);\nframe.set(\"loop.revindex\", t_19 - t_18);\nframe.set(\"loop.revindex0\", t_19 - t_18 - 1);\nframe.set(\"loop.first\", t_18 === 0);\nframe.set(\"loop.last\", t_18 === t_19 - 1);\nframe.set(\"loop.length\", t_19);\noutput += \"\\n\\t\";\noutput += runtime.suppressValue((lineno = 148, colno = 8, runtime.callWrap(macro_t_1, \"render\", context, [t_23,t_24])), env.opts.autoescape);\noutput += \"\\n\";\n;\n}\n}\n}\nframe = frame.pop();\noutput += \"\\n\\n<div class=\\\"row\\\">\\n\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t<button type=\\\"button\\\" class=\\\"button save\\\">Save Changes</button>\\n\\t</div>\\n</div>\\n\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"initial\": new nunjucks.Template( {obj: initial_obj, type: \"code\"}, env),\t\"main\": new nunjucks.Template( {obj: main_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"logViewer\\\">\\n\\t\\t<div class=\\\"header\\\">\\n\\t\\t\\t<h4 class=\\\"title left\\\"><span class=\\\"fal fa-list\\\"/>&nbsp;Logs</h4>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"blocks\\\">\\n\\t\\t\\t<button type=\\\"button\\\" class=\\\"button medium\\\" id=\\\"searchLogs\\\" alt=\\\"Refresh logs\\\"><span class=\\\"fal fa-repeat\\\"/></button>\\n\\t\\t\\t<div class=\\\"filterBlock\\\"></div>\\n\\t\\t</div>\\n\\n\\t\\t<div id=\\\"logs\\\"></div>\\n\\t</div>\\n\\n\\t<div class=\\\"logSearcher\\\">\\n\\t\\t<div class=\\\"search\\\">\\n\\t\\t\\t<input type=\\\"text\\\" placeholder=\\\"Search for something...\\\" name=\\\"dbSearchField\\\"/>&nbsp;&nbsp;<button type=\\\"button\\\" class=\\\"button medium\\\" name=\\\"find\\\"><span class=\\\"fal fa-search\\\"/></button>\\n\\t\\t\\t&nbsp;&nbsp;<span class=\\\"spinner-icon spinner-small hide dbSearching\\\"/>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"dbResult\\\">\\n\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar logline_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t\";\noutput += runtime.suppressValue((lineno = 1, colno = 11, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"timestamp\"), \"timestamp\", context, [])), env.opts.autoescape);\noutput += \"<span style=\\\"margin-left: 15px; display: inline-block;\\\">\";\noutput += runtime.suppressValue((lineno = 1, colno = 76, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"title\"), \"title\", context, [])), env.opts.autoescape);\noutput += \"</span>\\n\\t<div class=\\\"detail hide\\\"><pre><code class=\\\"codeblock\\\"></code></pre></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar logline_oldRoot = logline_obj.root;\nlogline_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlogline_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar renderDbItem_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"large-12 columns\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"query\"), env.opts.autoescape);\noutput += \"</div>\\n\\t</div>\\n\\t\";\nframe = frame.push();\nvar t_3 = runtime.contextOrFrameLookup(context, frame, \"item\");\nif(t_3) {var t_1;\nif(runtime.isArray(t_3)) {\nvar t_2 = t_3.length;\nfor(t_1=0; t_1 < t_3.length; t_1++) {\nvar t_4 = t_3[t_1][0]\nframe.set(\"key\", t_3[t_1][0]);\nvar t_5 = t_3[t_1][1]\nframe.set(\"val\", t_3[t_1][1]);\nframe.set(\"loop.index\", t_1 + 1);\nframe.set(\"loop.index0\", t_1);\nframe.set(\"loop.revindex\", t_2 - t_1);\nframe.set(\"loop.revindex0\", t_2 - t_1 - 1);\nframe.set(\"loop.first\", t_1 === 0);\nframe.set(\"loop.last\", t_1 === t_2 - 1);\nframe.set(\"loop.length\", t_2);\noutput += \"\\n\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t<div class=\\\"large-3 columns\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, t_4), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t<div class=\\\"large-9 columns\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, t_5), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t</div>\\n\\t\";\n;\n}\n} else {\nt_1 = -1;\nvar t_2 = runtime.keys(t_3).length;\nfor(var t_6 in t_3) {\nt_1++;\nvar t_7 = t_3[t_6];\nframe.set(\"key\", t_6);\nframe.set(\"val\", t_7);\nframe.set(\"loop.index\", t_1 + 1);\nframe.set(\"loop.index0\", t_1);\nframe.set(\"loop.revindex\", t_2 - t_1);\nframe.set(\"loop.revindex0\", t_2 - t_1 - 1);\nframe.set(\"loop.first\", t_1 === 0);\nframe.set(\"loop.last\", t_1 === t_2 - 1);\nframe.set(\"loop.length\", t_2);\noutput += \"\\n\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t<div class=\\\"large-3 columns\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, t_6), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t<div class=\\\"large-9 columns\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, t_7), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t</div>\\n\\t\";\n;\n}\n}\n}\nframe = frame.pop();\noutput += \"\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar renderDbItem_oldRoot = renderDbItem_obj.root;\nrenderDbItem_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\trenderDbItem_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar empty_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\tNo data to show for that time period or filter combination.\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar empty_oldRoot = empty_obj.root;\nempty_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tempty_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"main\": new nunjucks.Template( {obj: main_obj, type: \"code\"}, env),\t\"logline\": new nunjucks.Template( {obj: logline_obj, type: \"code\"}, env),\t\"renderDbItem\": new nunjucks.Template( {obj: renderDbItem_obj, type: \"code\"}, env),\t\"empty\": new nunjucks.Template( {obj: empty_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar content_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<label>\\n\\t\\t\\t\\t\";\nif((lineno = 4, colno = 13, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isNew\"), \"isNew\", context, []))) {\noutput += \"\\n\\t\\t\\t\\t\\t<span class=\\\"subject-label\\\">Subject Names (one per line)</span>\\n\\t\\t\\t\\t\\t<textarea name=\\\"subject\\\" placeholder=\\\"Subject Name\\\" rows=\\\"5\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"locked\") || !(lineno = 6, colno = 103, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, []))?\"readonly\":\"\"), env.opts.autoescape);\noutput += \"/>\\n\\t\\t\\t\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t\\t\\t\\t<span class=\\\"subject-label\\\">Subject Name</span>\\n\\t\\t\\t\\t\\t<input type=\\\"text\\\" name=\\\"subject\\\" placeholder=\\\"Subject Name\\\" value=\\\"\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"subject\")), env.opts.autoescape);\noutput += \"\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"locked\") || !(lineno = 9, colno = 128, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, []))?\"readonly\":\"\"), env.opts.autoescape);\noutput += \"/>\\n\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\t</div>\\n\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar content_oldRoot = content_obj.root;\ncontent_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcontent_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar placeholder_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"modal-title\\\">Loading...</div>\\n\\t<div class=\\\"modal-body\\\">\\n\\t\\t<div class=\\\"spinner-icon spinner-small\\\"/> Fetching user data\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar placeholder_oldRoot = placeholder_obj.root;\nplaceholder_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tplaceholder_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"content\": new nunjucks.Template( {obj: content_obj, type: \"code\"}, env),\t\"placeholder\": new nunjucks.Template( {obj: placeholder_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"header\\\">\\n\\t<h4 class=\\\"title left\\\"><span class=\\\"fal fa-th-list\\\"/>&nbsp;Subjects</h4>\\n\\t<div class=\\\"actions\\\">\\n\\t\\t\";\nif((env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"api\")),\"subjects\")),\"post\"))) && !runtime.contextOrFrameLookup(context, frame, \"fcClient\")) {\noutput += \"\\n\\t\\t\\t<div class=\\\"add-subject\\\"><span class=\\\"fal fa-plus\\\"/> Add Subject</div>\\n\\t\\t\";\n;\n}\noutput += \"\\n\\t</div>\\n</div>\\n\\n<div class=\\\"ops-bar\\\">\\n\\t<div class=\\\"filters\\\"></div>\\n\\t<div class=\\\"counter\\\"></div>\\n</div>\\n\\n<div class=\\\"grid\\\"></div>\\n\\n<div class=\\\"paging\\\"></div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar displayBody_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<p class=\\\"temporary-password-creation-modal-body-text\\\">The temporary password is</p>\\n\\t<br/><br/>\\n\\t<p class=\\\"temporary-password-creation-modal-display-body-temporary-password\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"password\"), env.opts.autoescape);\noutput += \"</p>\\n\\t<br/><br/>\\n\\t<p class=\\\"temporary-password-creation-modal-body-text\\\">Use this password to log in to the previously selected user's account.\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar displayBody_oldRoot = displayBody_obj.root;\ndisplayBody_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tdisplayBody_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar errorBody_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<p class=\\\"temporary-password-creation-modal-body-text\\\">\\n\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"_error\")) {\noutput += \"\\n\\t\\t\\t\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"_error\"), env.opts.autoescape);\noutput += \"\\n\\t\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t\\tAn error occurred and a temporary password could not be generated. Please try again or contact your support representative.\\n\\t\\t\";\n;\n}\noutput += \"\\n\\t</p>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar errorBody_oldRoot = errorBody_obj.root;\nerrorBody_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\terrorBody_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar statusBody_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"status-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar statusBody_oldRoot = statusBody_obj.root;\nstatusBody_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tstatusBody_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar formBody_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"user-selector-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar formBody_oldRoot = formBody_obj.root;\nformBody_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tformBody_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"displayBody\": new nunjucks.Template( {obj: displayBody_obj, type: \"code\"}, env),\t\"errorBody\": new nunjucks.Template( {obj: errorBody_obj, type: \"code\"}, env),\t\"statusBody\": new nunjucks.Template( {obj: statusBody_obj, type: \"code\"}, env),\t\"formBody\": new nunjucks.Template( {obj: formBody_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"header\\\">\\n\\t<h4 class=\\\"title left\\\"><span class=\\\"fal fa-key\\\"/>&nbsp;Temporary Passwords</h4>\\n</div>\\n\\n<div class=\\\"manager-region\\\">\\n</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"ops-bar\\\">\\n\\t<div class=\\\"filters\\\">\\n\\t\\t<div class=\\\"filters-managed\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"filters-unmanaged\\\">\\n\\t\\t\\t<input type=\\\"checkbox\\\" id=\\\"include-invalid\\\">\\n\\t\\t\\t<label for=\\\"include-invalid\\\">Show old passwords</label>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"actions\\\">\\n\\t\\t<span class=\\\"fal fa-plus-circle button-add\\\"/>\\n\\t</div>\\n\\n\\t<div class=\\\"counter\\\">\\n\\t</div>\\n</div>\\n\\n<div class=\\\"grid\\\">\\n</div>\\n\\n<div class=\\\"paging\\\">\\n</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"header\\\">\\n\\t<h4 class=\\\"title left\\\"><span class=\\\"fal fa-key\\\"/>&nbsp;All Tokens</h4>\\n\\n\\t<div class=\\\"actions\\\">\\n\\t\\t<div class=\\\"downloadList\\\"><span class=\\\"fal fa-cloud-download\\\"/> Downloads</div>\\n\\t</div>\\n</div>\\n\\n<div class=\\\"ops-bar\\\">\\n\\t<div class=\\\"filters\\\"></div>\\n\\t<div class=\\\"counter\\\"></div>\\n</div>\\n\\n<div class=\\\"token-grid grid\\\"></div>\\n\\n<div class=\\\"paging\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar permissionDeniedMessage_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span>You do not have the necessary permission to use the tool,</span>\\n\\t<br/>\\n\\t<span class=\\\"tool-name\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"toolName\"), env.opts.autoescape);\noutput += \"</span>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar permissionDeniedMessage_oldRoot = permissionDeniedMessage_obj.root;\npermissionDeniedMessage_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tpermissionDeniedMessage_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar layout_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"header\\\">\\n\\t\\t<h4 class=\\\"title left\\\"><span class=\\\"fal fa-cogs\\\"/>&nbsp;Tools</h4>\\n\\n\\t\\t<div class=\\\"dropdown\\\">\\n\\t\\t\\t<select id=\\\"tool-list\\\">\\n\\t\\t\\t</select>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"display-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar layout_oldRoot = layout_obj.root;\nlayout_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlayout_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"permissionDeniedMessage\": new nunjucks.Template( {obj: permissionDeniedMessage_obj, type: \"code\"}, env),\t\"layout\": new nunjucks.Template( {obj: layout_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"modal-title\\\">\\n\\t<span class=\\\"fal fa-cloud-upload\\\"/> Import <span class=\\\"importType\\\"></span> content</span>\\n</div>\\n\\n<div class=\\\"modal-body\\\">\\n\\t<div class=\\\"row form-container\\\">\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<div class=\\\"import-form\\\">\\n\\t\\t\\t\\t<label>Select the file that contains the <span class=\\\"importType\\\"></span> content to import:\\n\\t\\t\\t\\t\\t<input type=\\\"file\\\" id=\\\"data\\\" name=\\\"data\\\" accept=\\\".zip\\\">\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t<p class=\\\"warn\\\">\\n\\t\\t\\t\\t\\t\\t<span class='fal fa-exclamation-triangle'/> You are importing into the following <span class=\\\"details\\\"></span><br/>\\n\\t\\t\\t\\t\\t\\t<span class='fal fa-exclamation-triangle'/> This operation makes irrevocable changes; they cannot be undone.\\n\\t\\t\\t\\t\\t</p>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"import-result hide\\\">\\n\\t\\t\\t  <span class=\\\"import-result-message\\\">Import complete.</span>\\n\\n\\t\\t\\t\\t<span>The following number of <span class=\\\"importType\\\"></span> content was added:</span>\\n\\n\\t\\t\\t\\t<table class=\\\"content-metadata\\\">\\n\\t\\t\\t\\t\\t<tr class=\\\"metadata-attachments\\\">\\n\\t\\t\\t\\t\\t\\t<td class=\\\"content-metadata-label\\\">Attachments</td>\\n\\t\\t\\t\\t\\t\\t<td class=\\\"content-metadata-value\\\">0</td>\\n\\t\\t\\t\\t\\t</tr>\\n\\t\\t\\t\\t\\t<tr class=\\\"metadata-resources\\\">\\n\\t\\t\\t\\t\\t\\t<td class=\\\"content-metadata-label\\\">Resources</td>\\n\\t\\t\\t\\t\\t\\t<td class=\\\"content-metadata-value\\\">0</td>\\n\\t\\t\\t\\t\\t</tr>\\n\\t\\t\\t\\t\\t<tr class=\\\"metadata-folders\\\">\\n\\t\\t\\t\\t\\t\\t<td class=\\\"content-metadata-label\\\">Folders</td>\\n\\t\\t\\t\\t\\t\\t<td class=\\\"content-metadata-value\\\">0</td>\\n\\t\\t\\t\\t\\t</tr>\\n\\t\\t\\t\\t\\t<tr class=\\\"metadata-highlights\\\">\\n\\t\\t\\t\\t\\t\\t<td class=\\\"content-metadata-label\\\">Highlights</td>\\n\\t\\t\\t\\t\\t\\t<td class=\\\"content-metadata-value\\\">0</td>\\n\\t\\t\\t\\t\\t</tr>\\n\\t\\t\\t\\t\\t<tr class=\\\"metadata-annotations\\\">\\n\\t\\t\\t\\t\\t\\t<td class=\\\"content-metadata-label\\\">Annotations</td>\\n\\t\\t\\t\\t\\t\\t<td class=\\\"content-metadata-value\\\">0</td>\\n\\t\\t\\t\\t\\t</tr>\\n\\t\\t\\t\\t\\t<tr class=\\\"metadata-netch\\\">\\n\\t\\t\\t\\t\\t\\t<td class=\\\"content-metadata-label\\\">Netch</td>\\n\\t\\t\\t\\t\\t\\t<td class=\\\"content-metadata-value\\\">0</td>\\n\\t\\t\\t\\t\\t</tr>\\n\\t\\t\\t\\t\\t<tr class=\\\"metadata-private-attachments\\\">\\n\\t\\t\\t\\t\\t\\t<td class=\\\"content-metadata-label\\\">Private attachments</td>\\n\\t\\t\\t\\t\\t\\t<td class=\\\"content-metadata-value\\\">0</td>\\n\\t\\t\\t\\t\\t</tr>\\n\\t\\t\\t\\t</table>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</div>\\n</div>\\n\\n<div class=\\\"modal-footer left\\\">\\n\\t<button type=\\\"button\\\" class=\\\"button success import\\\">Import</button>&nbsp;&nbsp;&nbsp;&nbsp;\\n\\t<button type=\\\"button\\\" class=\\\"button secondary cancel\\\">Cancel</button>&nbsp;&nbsp;&nbsp;&nbsp;\\n\\t<button type=\\\"button\\\" class=\\\"button secondary close hide\\\">Close</button>&nbsp;&nbsp;&nbsp;&nbsp;\\n\\n\\t<span class=\\\"spinner-icon spinner-small spinner-working hide\\\"/>\\n\\t<span class=\\\"message hide\\\"></span>\\n</div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<h4>Export/Import book data</h4>\\n\\n<div class=\\\"what block\\\">\\n\\t<span class=\\\"title\\\">What is it?</span>\\n\\t<p>Book content (highlights, annotations, attachments, attachments resources) is associated with books via their unique ID. Book content can be exported and then imported to another book in the same EC instance.</p>\\n\\n\\t<span class=\\\"title\\\">When should I use it?</span>\\n\\t<p>When you want to transfer book content between books on the same EC instance. The books must have the same content.</p>\\n\\n\\t<span class=\\\"title\\\">When should I *NOT* use it?</span>\\n\\t<p>When a book has already started generating content on the EC. <strong>IT IS NOT SAFE TO MERGE THIS DATA WITH EXISTING USER DATA IF THERE IS A RISK OF OVERLAP IN BOOKS WITH E.G. HIGHLIGHTS.</strong></p>\\n\\n\\t<div class=\\\"warn\\\"><span class=\\\"fal fa-exclamation-triangle\\\"/> This tool makes irreversible changes; use with caution <span class=\\\"fal fa-exclamation-triangle\\\"/></div>\\n</div>\\n\\nOn the actions column in the grid of books, you can choose Import/Export of the books data.<br/><br/>\\n\\n<div class=\\\"ops-bar\\\">\\n\\t<div class=\\\"filters\\\"></div>\\n\\t<div class=\\\"counter\\\"></div>\\n</div>\\n\\n<div class=\\\"grid\\\"></div>\\n\\n<div class=\\\"paging\\\"></div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<h4>Export/Import user data</h4>\\n\\n<div class=\\\"what block\\\">\\n\\t<span class=\\\"title\\\">What is it?</span>\\n\\t<p>Personal content (highlights, annotations, private resources, private folders) is associated with users via their unique ID. If they have moved to another EC instance, their user content can be exported and then imported to the other EC instance.</p>\\n\\n\\t<span class=\\\"title\\\">When should I use it?</span>\\n\\t<p>When a user has moved to another EC, and can no longer see their personal content.</p>\\n\\n\\t<span class=\\\"title\\\">When should I *NOT* use it?</span>\\n\\t<p>When a user has already started generating content on the new EC. <strong>IT IS NOT SAFE TO MERGE THIS DATA WITH EXISTING USER DATA IF THERE IS A RISK OF OVERLAP IN BOOKS WITH E.G. HIGHLIGHTS.</strong></p>\\n\\n\\t<div class=\\\"warn\\\"><span class=\\\"fal fa-exclamation-triangle\\\"/> This tool makes irreversible changes; use with caution <span class=\\\"fal fa-exclamation-triangle\\\"/></div>\\n</div>\\n\\nOn the actions column in the grid of users, you can choose Import/Export of the users data.<br/><br/>\\n\\n<div class=\\\"ops-bar\\\">\\n\\t<div class=\\\"filters\\\"></div>\\n\\t<div class=\\\"counter\\\"></div>\\n</div>\\n\\n<div class=\\\"grid\\\"></div>\\n\\n<div class=\\\"paging\\\"></div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar introduction_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<h4>Migrate Learners</h4>\\n\\n\\t<div class=\\\"what block\\\">\\n\\t\\t<span class=\\\"title\\\">What is it?</span>\\n\\t\\t<p>As learners make progress, they move up a grade. EC does not automatically move learners into new grades so it is up to Support to migrate learners each year, as required. This tool allows a Support user to specify which grades should be migrated and will automatically create new groups for the affected learners.</p>\\n\\n\\t\\t<span class=\\\"title\\\">When should I use it?</span>\\n\\t\\t<p>Before the end of this school's academic year and before parents and learners begin buying books for the next academic year.</p>\\n\\n\\t\\t<div class=\\\"warn\\\"><span class=\\\"fal fa-exclamation-triangle\\\"/> This tool cannot be used more than once per year. Do not use unless the school is ready to migrate its learners. <span class=\\\"fal fa-exclamation-triangle\\\"/></div>\\n\\t</div>\\n\\n\\t<div class=\\\"button-container\\\">\\n\\t\\t<button type=\\\"button\\\" class=\\\"button\\\" id=\\\"begin\\\">Begin Migration</button>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar introduction_oldRoot = introduction_obj.root;\nintroduction_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tintroduction_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar guide_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n  <span class=\\\"title\\\">Step&nbsp;\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"step\"), env.opts.autoescape);\noutput += \"</span>\\n\\n  <div class=\\\"line\\\"/>\\n\\n  <p class=\\\"prompt\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"prompt\"), env.opts.autoescape);\noutput += \"</p>\\n\\n  <div class=\\\"line\\\"/>\\n\\n  <div class=\\\"button-container\\\">\\n    <button type=\\\"button\\\" class=\\\"button \";\noutput += runtime.suppressValue(((runtime.contextOrFrameLookup(context, frame, \"buttons\").indexOf(runtime.contextOrFrameLookup(context, frame, \"buttonPrevious\")) !== -1)?\"\":\"hide\"), env.opts.autoescape);\noutput += \"\\\" id=\\\"previous\\\">Previous</button>\\n    <button type=\\\"button\\\" class=\\\"button \";\noutput += runtime.suppressValue(((runtime.contextOrFrameLookup(context, frame, \"buttons\").indexOf(runtime.contextOrFrameLookup(context, frame, \"buttonNext\")) !== -1)?\"\":\"hide\"), env.opts.autoescape);\noutput += \"\\\" id=\\\"next\\\">Next</button>\\n    <button type=\\\"button\\\" class=\\\"button \";\noutput += runtime.suppressValue(((runtime.contextOrFrameLookup(context, frame, \"buttons\").indexOf(runtime.contextOrFrameLookup(context, frame, \"buttonStart\")) !== -1)?\"\":\"hide\"), env.opts.autoescape);\noutput += \"\\\" id=\\\"start\\\">Start</button>\\n    <button type=\\\"button\\\" class=\\\"button \";\noutput += runtime.suppressValue(((runtime.contextOrFrameLookup(context, frame, \"buttons\").indexOf(runtime.contextOrFrameLookup(context, frame, \"buttonFinish\")) !== -1)?\"\":\"hide\"), env.opts.autoescape);\noutput += \"\\\" id=\\\"finish\\\">Finish</button>\\n  </div>\\n\\n\\t<div class=\\\"status-container hide\\\">\\n\\t\\t<span class=\\\"status-text\\\"/>\\n\\t\\t<span class=\\\"spinner-icon main\\\"/>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar guide_oldRoot = guide_obj.root;\nguide_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tguide_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar listCategory_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"value\"), env.opts.autoescape);\noutput += \"</span>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar listCategory_oldRoot = listCategory_obj.root;\nlistCategory_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlistCategory_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar listItem_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div title=\\\"Old Name: \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"oldName\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t<span class=\\\"select-toggle\\\" title=\\\"Select/Deselect\\\">\\n\\t\\t\\t<span class=\\\"fa-circle fas hide selected-icon\\\"/>\\n\\t\\t\\t<span class=\\\"fa-circle fal hide unselected-icon\\\"/>\\n\\t\\t</span>\\n\\t\\t<span class=\\\"fa-edit fas hide edit-btn\\\" title=\\\"Edit\\\"/><span class=\\\"value\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"value\"), env.opts.autoescape);\noutput += \"</span>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar listItem_oldRoot = listItem_obj.root;\nlistItem_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlistItem_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar selector_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"list-title\\\" id=\\\"left\\\">\\n\\t\\t<span>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"leftListTitle\"), env.opts.autoescape);\noutput += \"</span>\\n\\t</div>\\n\\n\\t<div class=\\\"list-title\\\" id=\\\"right\\\">\\n\\t\\t<span>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"rightListTitle\"), env.opts.autoescape);\noutput += \"</span>\\n\\t</div>\\n\\n\\t<div class=\\\"list-region\\\" id=\\\"left\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"list-region\\\" id=\\\"right\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar selector_oldRoot = selector_obj.root;\nselector_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tselector_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar plan_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"list-title\\\">\\n\\t\\t<span>Migration Plan</span>\\n\\t</div>\\n\\n\\t<div class=\\\"list-download\\\">\\n\\t\\t<a>Download CSV</a>\\n\\t</div>\\n\\n\\t<div class=\\\"list-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar plan_oldRoot = plan_obj.root;\nplan_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tplan_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar message_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span class=\\\"title\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"title\"), env.opts.autoescape);\noutput += \"</span>\\n\\t<br>\\n\\t<p class=\\\"message\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"message\"), env.opts.autoescape);\noutput += \"</p>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar message_oldRoot = message_obj.root;\nmessage_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmessage_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar restore_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span class=\\\"title\\\">Roll back migration</span>\\n\\t<br>\\n\\t<p class=\\\"message\\\">A backup file was found. Click the Restore button to roll back the previous migration.<br><br>WARNING: All newly created groups will be deleted permanently and previously promoted learners will be returned to their former grades. This operation cannot be undone.</p>\\n\\t<br>\\n\\t<button type=\\\"button\\\" class=\\\"button\\\" id=\\\"restore\\\">Restore</button>\\n\\t<span class=\\\"spinner-icon main hide\\\"/>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar restore_oldRoot = restore_obj.root;\nrestore_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\trestore_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar migration_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<a id=\\\"download-helper\\\" class=\\\"hide\\\" href=\\\"\\\" download=\\\"Learner Migration Plan.csv\\\"></a>\\n\\n\\t<div class=\\\"guide-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"work-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar migration_oldRoot = migration_obj.root;\nmigration_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmigration_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar layout_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"display-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar layout_oldRoot = layout_obj.root;\nlayout_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlayout_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"introduction\": new nunjucks.Template( {obj: introduction_obj, type: \"code\"}, env),\t\"guide\": new nunjucks.Template( {obj: guide_obj, type: \"code\"}, env),\t\"listCategory\": new nunjucks.Template( {obj: listCategory_obj, type: \"code\"}, env),\t\"listItem\": new nunjucks.Template( {obj: listItem_obj, type: \"code\"}, env),\t\"selector\": new nunjucks.Template( {obj: selector_obj, type: \"code\"}, env),\t\"plan\": new nunjucks.Template( {obj: plan_obj, type: \"code\"}, env),\t\"message\": new nunjucks.Template( {obj: message_obj, type: \"code\"}, env),\t\"restore\": new nunjucks.Template( {obj: restore_obj, type: \"code\"}, env),\t\"migration\": new nunjucks.Template( {obj: migration_obj, type: \"code\"}, env),\t\"layout\": new nunjucks.Template( {obj: layout_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<h4>Book Content Repair</h4>\\n\\n<div class=\\\"what block\\\">\\n\\t<span class=\\\"title\\\">What is it?</span>\\n\\t<p>Content (resources/attachments) is linked to their creator via the creator's unique ID. If their account is deleted, this ID is lost forever - even if a new user is identical in every other way. Their content is still in the database, but it is not linked to the new user.</p>\\n\\n\\t<span class=\\\"title\\\">When should I use it?</span>\\n\\t<p>If an educator is removed and re-added, and they can no longer see their content.</p>\\n\\n\\t<div class=\\\"warn\\\"><span class=\\\"fal fa-exclamation-triangle\\\"/> This tool makes irreversible changes; use with caution <span class=\\\"fal fa-exclamation-triangle\\\"/></div>\\n</div>\\n\\nOn the left are the users that no longer exist in the system, to which at least one content item (resource/attachment) is assigned. Choose the new user to assign them to on the right (or leave blank to ignore).<br/><br/>\\n\\n<div class=\\\"ops-bar\\\">\\n\\t<div class=\\\"filters\\\"></div>\\n\\t<div class=\\\"counter\\\"></div>\\n</div>\\n\\n<div class=\\\"grid\\\"></div>\\n\\n<div class=\\\"paging\\\"></div>\\n\\n<button type=\\\"button\\\" class=\\\"button\\\" id=\\\"save\\\">Save Changes</button>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<h4>Restrict All Learners</h4>\\n<div class=\\\"what block\\\">\\n\\t<span class=\\\"title\\\">What is it?</span>\\n\\t<p>Restricted learners cannot access any content or books, except books that were already unlocked at the time of restriction.</p>\\n\\n\\t<span class=\\\"title\\\">When should I use it?</span>\\n\\t<p>When you want to restrict all the learners in the entire database.</p>\\n\\n\\t<div class=\\\"warn\\\"><span class=\\\"fal fa-exclamation-triangle\\\"/> This tool makes irreversible changes; use with caution <span class=\\\"fal fa-exclamation-triangle\\\"/></div>\\n</div>\\n\\n<button type=\\\"button\\\" class=\\\"button\\\" id=\\\"save\\\" class=\\\"alert\\\">Restrict All Learners</button>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<h4>Restrict Some Learners</h4>\\n<div class=\\\"what block\\\">\\n\\t<span class=\\\"title\\\">What is it?</span>\\n\\t<p>Restricted learners cannot access any content or books, except books that were already unlocked at the time of restriction.</p>\\n\\n\\t<span class=\\\"title\\\">When should I use it?</span>\\n\\t<p>When you want to restrict some of the learners in the database.</p>\\n\\n\\t<div class=\\\"warn\\\"><span class=\\\"fal fa-exclamation-triangle\\\"/> This tool makes irreversible changes; use with caution <span class=\\\"fal fa-exclamation-triangle\\\"/></div>\\n</div>\\n\\nOne username per line.<br/><br/>\\n\\n<textarea name=\\\"students\\\" cols=\\\"80\\\" rows=\\\"10\\\"></textarea><br/><br/>\\n\\n<button type=\\\"button\\\" class=\\\"button\\\" id=\\\"save\\\" class=\\\"alert\\\">Restrict Some Learners</button>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<h4>Tranche License Repair</h4>\\n\\n<div class=\\\"what block\\\">\\n\\t<span class=\\\"title\\\">What is it?</span>\\n\\t<p>Scans all active tranches on the system to determine if there are any unused licenses that can be allocated to users.</p>\\n\\n\\t<span class=\\\"title\\\">When should I use it?</span>\\n\\t<p>If license allocations appear incorrect.</p>\\n</div>\\n\\n<button type=\\\"button\\\" class=\\\"button\\\" id=\\\"save\\\">Execute</button>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<h4>Unrestrict Some Users</h4>\\n<div class=\\\"what block\\\">\\n\\t<span class=\\\"title\\\">What is it?</span>\\n\\t<p>Restricted users cannot access any content or books, except books that were already unlocked at the time of restriction.</p>\\n\\n\\t<span class=\\\"title\\\">When should I use it?</span>\\n\\t<p>When you want to unrestrict some of the users in the database.</p>\\n\\n\\t<div class=\\\"warn\\\"><span class=\\\"fal fa-exclamation-triangle\\\"/> This tool makes irreversible changes; use with caution <span class=\\\"fal fa-exclamation-triangle\\\"/></div>\\n</div>\\n\\nOne username per line.<br/><br/>\\n\\n<textarea name=\\\"students\\\" cols=\\\"80\\\" rows=\\\"10\\\"></textarea><br/><br/>\\n\\n<button type=\\\"button\\\" class=\\\"button\\\" id=\\\"save\\\" class=\\\"alert\\\">Unrestrict Some Users</button>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<h4>Personal Content Repair</h4>\\n\\n<div class=\\\"what block\\\">\\n\\t<span class=\\\"title\\\">What is it?</span>\\n\\t<p>Personal content (highlights, annotations, private resources, private folders) is associated with users via their unique ID. If their account is deleted, this ID is lost forever - even if the new user is identical in every other way. Their user content is still in the database, but it is not linked to the new user.</p>\\n\\n\\t<span class=\\\"title\\\">When should I use it?</span>\\n\\t<p>If a user was deleted and re-created, and can no longer see their personal content.</p>\\n\\n\\t<div class=\\\"warn\\\"><span class=\\\"fal fa-exclamation-triangle\\\"/> This tool makes irreversible changes; use with caution <span class=\\\"fal fa-exclamation-triangle\\\"/></div>\\n</div>\\n\\nOn the left are the users that no longer exist in the system, to which at least one item is assigned. Choose the new user to assign them to on the right (or leave blank to ignore).<br/><br/>\\n\\n<div class=\\\"ops-bar\\\">\\n\\t<div class=\\\"filters\\\"></div>\\n\\t<div class=\\\"counter\\\"></div>\\n</div>\\n\\n<div class=\\\"grid\\\"></div>\\n\\n<div class=\\\"paging\\\"></div>\\n\\n<button type=\\\"button\\\" class=\\\"button\\\" id=\\\"save\\\">Save Changes</button>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\n\nvar modalKit = require(\"../../lib/modalKit/modal\");\n\nvar FormBody = modalKit.Body.extend({\n\tclassName: \"topic-modal-form-body\",\n\n\ttemplate: require(\"../templates/appVersionModal.nunj\").formBody,\n\n\tui: {\n\t\tinput: \"input\"\n\t},\n\n\tevents: {\n\t\t\"change @ui.input\": \"onChangeVersion\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this = this;\n\n\t\treturn {\n\t\t\tisFileInput: function isFileInput() {\n\t\t\t\treturn _this.options.userOptions.fileInput;\n\t\t\t},\n\t\t\tval: function val() {\n\t\t\t\treturn _this.model.get(_this.options.userOptions.modelAttribute);\n\t\t\t}\n\t\t};\n\t},\n\n\tonRender: function onRender() {\n\t\tif (this.options.userOptions.fileInput) {\n\t\t\tthis.ui.file = $(\"input.app-version-modal-file-input\", this.$el);\n\t\t\tthis.ui.file.on(\"change\", this.onFileChanged.bind(this));\n\t\t}\n\t},\n\n\tonFileChanged: function onFileChanged() {\n\t\tif (this.ui.file.get(0).files.length > 0) {\n\t\t\tthis.model.unset(this.options.userOptions.modelAttribute);\n\t\t\tthis.model.set(this.options.userOptions.modelAttribute, this.ui.file.get(0).files[0]);\n\t\t}\n\t},\n\n\tonChangeVersion: function onChangeVersion() {\n\t\tthis.model.unset(this.options.userOptions.modelAttribute);\n\t\tthis.model.set(this.options.userOptions.modelAttribute, this.ui.input.val());\n\t},\n\n\tonAcceptInput: function onAcceptInput(enterPressed) {\n\t\tif (enterPressed) this.closeModal(\"accept\");\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tif (this.options.userOptions.fileInput) this.ui.file.off(\"change\");else this.stopListening(this.versionInput);\n\t}\n});\n\nvar FormPage = modalKit.Page.extend({\n\theaderView: function headerView() {\n\t\treturn modalKit.Header.extend({ title: this.options.userOptions.prompt });\n\t},\n\n\tbodyView: function bodyView() {\n\t\treturn FormBody;\n\t},\n\n\tfooterView: function footerView() {\n\t\treturn modalKit.Footer.extend({\n\t\t\tbehaviors: {\n\t\t\t\tAcceptButton: { requireValidation: true },\n\t\t\t\tCancelButton: {}\n\t\t\t}\n\t\t});\n\t},\n\n\tonAccept: function onAccept() {\n\t\tthis.closeModal(\"accept\");\n\t},\n\n\tonCancel: function onCancel() {\n\t\tthis.closeModal(\"cancel\");\n\t}\n});\n\nmodule.exports = modalKit.Host.extend({\n\tpages: {\n\t\tform: FormPage\n\t},\n\n\toptions: {\n\t\tfirstPage: \"form\"\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFwcFZlcnNpb25Nb2RhbC5qcyJdLCJuYW1lcyI6WyIkIiwicmVxdWlyZSIsIm1vZGFsS2l0IiwiRm9ybUJvZHkiLCJCb2R5IiwiZXh0ZW5kIiwiY2xhc3NOYW1lIiwidGVtcGxhdGUiLCJmb3JtQm9keSIsInVpIiwiaW5wdXQiLCJldmVudHMiLCJ0ZW1wbGF0ZUNvbnRleHQiLCJpc0ZpbGVJbnB1dCIsIm9wdGlvbnMiLCJ1c2VyT3B0aW9ucyIsImZpbGVJbnB1dCIsInZhbCIsIm1vZGVsIiwiZ2V0IiwibW9kZWxBdHRyaWJ1dGUiLCJvblJlbmRlciIsImZpbGUiLCIkZWwiLCJvbiIsIm9uRmlsZUNoYW5nZWQiLCJiaW5kIiwiZmlsZXMiLCJsZW5ndGgiLCJ1bnNldCIsInNldCIsIm9uQ2hhbmdlVmVyc2lvbiIsIm9uQWNjZXB0SW5wdXQiLCJlbnRlclByZXNzZWQiLCJjbG9zZU1vZGFsIiwib25CZWZvcmVEZXN0cm95Iiwib2ZmIiwic3RvcExpc3RlbmluZyIsInZlcnNpb25JbnB1dCIsIkZvcm1QYWdlIiwiUGFnZSIsImhlYWRlclZpZXciLCJIZWFkZXIiLCJ0aXRsZSIsInByb21wdCIsImJvZHlWaWV3IiwiZm9vdGVyVmlldyIsIkZvb3RlciIsImJlaGF2aW9ycyIsIkFjY2VwdEJ1dHRvbiIsInJlcXVpcmVWYWxpZGF0aW9uIiwiQ2FuY2VsQnV0dG9uIiwib25BY2NlcHQiLCJvbkNhbmNlbCIsIm1vZHVsZSIsImV4cG9ydHMiLCJIb3N0IiwicGFnZXMiLCJmb3JtIiwiZmlyc3RQYWdlIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjs7QUFFQSxJQUFNQyxXQUFXRCxRQUFRLDBCQUFSLENBQWpCOztBQUVBLElBQU1FLFdBQVdELFNBQVNFLElBQVQsQ0FBY0MsTUFBZCxDQUFxQjtBQUNyQ0MsWUFBVyx1QkFEMEI7O0FBR3JDQyxXQUFVTixRQUFRLG1DQUFSLEVBQTZDTyxRQUhsQjs7QUFLckNDLEtBQUk7QUFD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S2xCLFVBQUwsQ0FBZ0IsUUFBaEI7QUFDQSxFQXBCb0M7O0FBc0JyQ21CLFdBQVUsb0JBQVc7QUFDcEIsT0FBS25CLFVBQUwsQ0FBZ0IsUUFBaEI7QUFDQTtBQXhCb0MsQ0FBckIsQ0FBakI7O0FBMkJBb0IsT0FBT0MsT0FBUCxHQUFpQnJELFNBQVNzRCxJQUFULENBQWNuRCxNQUFkLENBQXFCO0FBQ3JDb0QsUUFBTztBQUNOQyxRQUFNbkI7QUFEQSxFQUQ4Qjs7QUFLckN6QixVQUFTO0FBQ1I2QyxhQUFXO0FBREg7QUFMNEIsQ0FBckIsQ0FBakIiLCJmaWxlIjoiYXBwVmVyc2lvbk1vZGFsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcblxuY29uc3QgbW9kYWxLaXQgPSByZXF1aXJlKFwiLi4vLi4vbGliL21vZGFsS2l0L21vZGFsXCIpO1xuXG5jb25zdCBGb3JtQm9keSA9IG1vZGFsS2l0LkJvZHkuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInRvcGljLW1vZGFsLWZvcm0tYm9keVwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2FwcFZlcnNpb25Nb2RhbC5udW5qXCIpLmZvcm1Cb2R5LFxuXG5cdHVpOiB7XG5cdFx0aW5wdXQ6IFwiaW5wdXRcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNoYW5nZSBAdWkuaW5wdXRcIjogXCJvbkNoYW5nZVZlcnNpb25cIixcblx0fSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRpc0ZpbGVJbnB1dDogKCkgPT4gdGhpcy5vcHRpb25zLnVzZXJPcHRpb25zLmZpbGVJbnB1dCxcblx0XHRcdHZhbDogKCkgPT4gdGhpcy5tb2RlbC5nZXQodGhpcy5vcHRpb25zLnVzZXJPcHRpb25zLm1vZGVsQXR0cmlidXRlKSxcblx0XHR9O1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5vcHRpb25zLnVzZXJPcHRpb25zLmZpbGVJbnB1dCkge1xuXHRcdFx0dGhpcy51aS5maWxlID0gJChcImlucHV0LmFwcC12ZXJzaW9uLW1vZGFsLWZpbGUtaW5wdXRcIiwgdGhpcy4kZWwpO1xuXHRcdFx0dGhpcy51aS5maWxlLm9uKFwiY2hhbmdlXCIsIHRoaXMub25GaWxlQ2hhbmdlZC5iaW5kKHRoaXMpKTtcblx0XHR9XG5cdH0sXG5cblx0b25GaWxlQ2hhbmdlZDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMudWkuZmlsZS5nZXQoMCkuZmlsZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0dGhpcy5tb2RlbC51bnNldCh0aGlzLm9wdGlvbnMudXNlck9wdGlvbnMubW9kZWxBdHRyaWJ1dGUpO1xuXHRcdFx0dGhpcy5tb2RlbC5zZXQodGhpcy5vcHRpb25zLnVzZXJPcHRpb25zLm1vZGVsQXR0cmlidXRlLCB0aGlzLnVpLmZpbGUuZ2V0KDApLmZpbGVzWzBdKTtcblx0XHR9XG5cdH0sXG5cblx0b25DaGFuZ2VWZXJzaW9uOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm1vZGVsLnVuc2V0KHRoaXMub3B0aW9ucy51c2VyT3B0aW9ucy5tb2RlbEF0dHJpYnV0ZSk7XG5cdFx0dGhpcy5tb2RlbC5zZXQodGhpcy5vcHRpb25zLnVzZXJPcHRpb25zLm1vZGVsQXR0cmlidXRlLCB0aGlzLnVpLmlucHV0LnZhbCgpKTtcblx0fSxcblxuXHRvbkFjY2VwdElucHV0OiBmdW5jdGlvbihlbnRlclByZXNzZWQpIHtcblx0XHRpZiAoZW50ZXJQcmVzc2VkKVxuXHRcdFx0dGhpcy5jbG9zZU1vZGFsKFwiYWNjZXB0XCIpO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMub3B0aW9ucy51c2VyT3B0aW9ucy5maWxlSW5wdXQpXG5cdFx0XHR0aGlzLnVpLmZpbGUub2ZmKFwiY2hhbmdlXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLnZlcnNpb25JbnB1dCk7XG5cdH0sXG59KTtcblxuY29uc3QgRm9ybVBhZ2UgPSBtb2RhbEtpdC5QYWdlLmV4dGVuZCh7XG5cdGhlYWRlclZpZXc6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBtb2RhbEtpdC5IZWFkZXIuZXh0ZW5kKHsgdGl0bGU6IHRoaXMub3B0aW9ucy51c2VyT3B0aW9ucy5wcm9tcHQgfSk7XG5cdH0sXG5cblx0Ym9keVZpZXc6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBGb3JtQm9keTtcblx0fSxcblxuXHRmb290ZXJWaWV3OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gbW9kYWxLaXQuRm9vdGVyLmV4dGVuZCh7XG5cdFx0XHRiZWhhdmlvcnM6IHtcblx0XHRcdFx0QWNjZXB0QnV0dG9uOiB7IHJlcXVpcmVWYWxpZGF0aW9uOiB0cnVlIH0sXG5cdFx0XHRcdENhbmNlbEJ1dHRvbjoge30sXG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9LFxuXG5cdG9uQWNjZXB0OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmNsb3NlTW9kYWwoXCJhY2NlcHRcIik7XG5cdH0sXG5cblx0b25DYW5jZWw6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY2xvc2VNb2RhbChcImNhbmNlbFwiKTtcblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG1vZGFsS2l0Lkhvc3QuZXh0ZW5kKHtcblx0cGFnZXM6IHtcblx0XHRmb3JtOiBGb3JtUGFnZSxcblx0fSxcblxuXHRvcHRpb25zOiB7XG5cdFx0Zmlyc3RQYWdlOiBcImZvcm1cIixcblx0fSxcbn0pOyJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar _ = require(\"lodash\");\n\nvar ActionHeader = require(\"../../lib/actionHeader\");\nvar ActionTitle = require(\"../../lib/actionTitle\");\nvar AppVersionModal = require(\"./appVersionModal\");\nvar AppVersionsModel = require(\"./appVersionsModel\");\nvar ErrorView = require(\"../../lib/errorView\");\nvar StatusView = require(\"../../lib/statusView\");\n\nvar Header = ActionHeader.extend({\n\ttitleView: function titleView() {\n\t\treturn ActionTitle;\n\t},\n\n\tonTitleReady: function onTitleReady() {\n\t\tthis.eventBus.trigger(\"action-title:change-glyph\", \"fa-sliders-h\");\n\t\tthis.eventBus.trigger(\"action-title:change-title\", \"App Versions\");\n\t}\n});\n\nvar Editor = Backbone.Marionette.View.extend({\n\tclassName: \"app-versions-editor\",\n\n\ttemplate: require(\"../templates/appVersions.nunj\").editor,\n\n\tui: {\n\t\tresultPanel: \".app-versions-result-panel\",\n\t\tsaveButton: \"button.save\",\n\t\tversionAndroid: \".app-version-android\",\n\t\tversionAndroidCompatibility: \".app-version-android-compatibility\",\n\t\tversioniOS: \".app-version-ios\",\n\t\tversionWindows: \".app-version-windows\",\n\t\tversionWindows81: \".app-version-windows81\",\n\t\tversionMac: \".app-version-mac\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.saveButton\": \"onSaveButtonClick\",\n\t\t\"click @ui.versionAndroid\": \"onVersionAndroidClick\",\n\t\t\"click @ui.versionAndroidCompatibility\": \"onVersionAndroidCompatibilityClick\",\n\t\t\"click @ui.versioniOS\": \"onVersioniOSClick\",\n\t\t\"click @ui.versionWindows\": \"onVersionWindowsClick\",\n\t\t\"click @ui.versionWindows81\": \"onVersionWindows81Click\",\n\t\t\"click @ui.versionMac\": \"onVersionMacClick\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this = this;\n\n\t\treturn {\n\t\t\tisAndroidAPKSet: function isAndroidAPKSet() {\n\t\t\t\treturn _this.valueModel.has(\"androidAPK\");\n\t\t\t},\n\t\t\tisAndroidCompatibilityAPKSet: function isAndroidCompatibilityAPKSet() {\n\t\t\t\treturn _this.valueModel.has(\"androidCompatibilityAPK\");\n\t\t\t},\n\t\t\tisDataChanged: function isDataChanged() {\n\t\t\t\treturn _this.dataChanged;\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.eventBus = options.eventBus;\n\t\tthis.valueModel = new AppVersionsModel({\n\t\t\tios: this.model.get(\"ios\").version,\n\t\t\tmac: this.model.get(\"mac\").version,\n\t\t\twindows: this.model.get(\"windows\").version,\n\t\t\twindows81: this.model.get(\"windows81\").version\n\t\t});\n\t\tthis.dataChanged = false;\n\t},\n\n\tsetDataChanged: function setDataChanged(changed) {\n\t\tthis.dataChanged = changed;\n\n\t\tif (changed) this.eventBus.trigger(\"editor:data-changed\");\n\t},\n\n\tonVersionAndroidClick: function onVersionAndroidClick() {\n\t\tthis.editFile(\"androidAPK\", \"Android\");\n\t},\n\n\tonVersionAndroidCompatibilityClick: function onVersionAndroidCompatibilityClick() {\n\t\tthis.editFile(\"androidCompatibilityAPK\", \"Android (Compatibility)\");\n\t},\n\n\tonVersioniOSClick: function onVersioniOSClick() {\n\t\tthis.editVersion(\"ios\", \"iOS\");\n\t},\n\n\tonVersionWindowsClick: function onVersionWindowsClick() {\n\t\tthis.editVersion(\"windows\", \"Windows\");\n\t},\n\n\tonVersionWindows81Click: function onVersionWindows81Click() {\n\t\tthis.editVersion(\"windows81\", \"Windows 8.1\");\n\t},\n\n\tonVersionMacClick: function onVersionMacClick() {\n\t\tthis.editVersion(\"mac\", \"Mac\");\n\t},\n\n\teditFile: function editFile(modelAttribute, platformName) {\n\t\tvar _this2 = this;\n\n\t\tvar modal = new AppVersionModal({\n\t\t\tmodel: this.valueModel,\n\t\t\tuserOptions: {\n\t\t\t\tfileInput: true,\n\t\t\t\tmodelAttribute: modelAttribute,\n\t\t\t\tprompt: \"Select the file for \" + platformName\n\t\t\t}\n\t\t});\n\n\t\tthis.listenTo(modal, \"accept\", function (model) {\n\t\t\t_this2.valueModel.set(modelAttribute, model.get(modelAttribute));\n\n\t\t\t_this2.dataChanged = true;\n\t\t\t_this2.render();\n\n\t\t\t_this2.stopListening(modal);\n\t\t});\n\n\t\tthis.listenTo(modal, \"cancel\", function () {\n\t\t\t_this2.valueModel.unset(modelAttribute);\n\n\t\t\t_this2.stopListening(modal);\n\t\t});\n\n\t\tmodal.show();\n\t},\n\n\teditVersion: function editVersion(modelAttribute, platformName) {\n\t\tvar _this3 = this;\n\n\t\tvar modal = new AppVersionModal({\n\t\t\tmodel: this.valueModel,\n\t\t\tuserOptions: {\n\t\t\t\tmodelAttribute: modelAttribute,\n\t\t\t\tprompt: \"Enter the version for \" + platformName\n\t\t\t}\n\t\t});\n\n\t\tthis.listenTo(modal, \"accept\", function (model) {\n\t\t\tvar platform = _this3.model.get(modelAttribute);\n\t\t\tplatform.version = _.trim(model.get(modelAttribute));\n\n\t\t\t_this3.valueModel.set(modelAttribute, platform.version);\n\n\t\t\t_this3.dataChanged = true;\n\t\t\t_this3.render();\n\n\t\t\t_this3.stopListening(modal);\n\t\t});\n\n\t\tthis.listenTo(modal, \"cancel\", function () {\n\t\t\t_this3.valueModel.unset(modelAttribute);\n\n\t\t\t_this3.stopListening(modal);\n\t\t});\n\n\t\tmodal.show();\n\t},\n\n\tonSaveButtonClick: function onSaveButtonClick() {\n\t\tif (this.valueModel.has(\"androidAPK\")) this.model.setFile(\"androidAPK\", this.valueModel.get(\"androidAPK\"));\n\n\t\tif (this.valueModel.has(\"androidCompatibilityAPK\")) this.model.setFile(\"androidCompatibilityAPK\", this.valueModel.get(\"androidCompatibilityAPK\"));\n\n\t\tvar data = {\n\t\t\tios: this.valueModel.has(\"ios\") ? this.valueModel.get(\"ios\") : this.model.get(\"ios\").version,\n\t\t\twindows: this.valueModel.has(\"windows\") ? this.valueModel.get(\"windows\") : this.model.get(\"windows\").version,\n\t\t\twindows81: this.valueModel.has(\"windows81\") ? this.valueModel.get(\"windows81\") : this.model.get(\"windows81\").version,\n\t\t\tmac: this.valueModel.has(\"mac\") ? this.valueModel.get(\"mac\") : this.model.get(\"mac\").version\n\t\t};\n\n\t\tthis.eventBus.trigger(\"editor:saving\");\n\n\t\tthis.model.upload(data, {\n\t\t\tsuccess: this.onSaveSuccess.bind(this),\n\t\t\terror: this.onSaveError.bind(this)\n\t\t});\n\t},\n\n\tonSaveSuccess: function onSaveSuccess() {\n\t\tthis.valueModel.clear({ silent: true });\n\t\tthis.dataChanged = false;\n\t\tthis.render();\n\n\t\tthis.eventBus.trigger(\"editor:saved\");\n\t},\n\n\tonSaveError: function onSaveError(model, response) {\n\t\tthis.eventBus.trigger(\"editor:saved\", response);\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"app-versions-layout content\",\n\n\ttemplate: require(\"../templates/appVersions.nunj\").layout,\n\n\tregions: {\n\t\teditor: \".editor-region\",\n\t\theader: \".header-region\",\n\t\tstatus: \".status-region\"\n\t},\n\n\tui: {\n\t\teditorRegion: \".editor-region\",\n\t\theaderRegion: \".header-region\",\n\t\tstatusRegion: \".status-region\",\n\n\t\tsaveSuccessResultPanel: \".app-versions-success-result-panel\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.eventBus = new Backbone.Marionette.Object();\n\n\t\tthis.listenTo(this.eventBus, \"editor:data-changed\", this.onEditorDataChanged.bind(this));\n\t\tthis.listenTo(this.eventBus, \"editor:saving\", this.onEditorSaving.bind(this));\n\t\tthis.listenTo(this.eventBus, \"editor:saved\", this.onEditorSaved.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.renderLoadingStatus();\n\n\t\tthis.appVersionsModel = new AppVersionsModel();\n\t\tthis.appVersionsModel.fetch({\n\t\t\tsuccess: this.onFetchSuccess.bind(this),\n\t\t\terror: this.onFetchError.bind(this)\n\t\t});\n\t},\n\n\tonFetchSuccess: function onFetchSuccess() {\n\t\tthis.renderPage();\n\t},\n\n\tonFetchError: function onFetchError(model, response) {\n\t\tthis.renderError(response);\n\t},\n\n\trenderLoadingStatus: function renderLoadingStatus() {\n\t\tthis.getRegion(\"status\").empty();\n\t\tthis.showChildView(\"status\", new StatusView({\n\t\t\tmessage: \"Loading app versions...\",\n\t\t\ttype: \"busy\"\n\t\t}));\n\t},\n\n\trenderSavingStatus: function renderSavingStatus() {\n\t\tthis.getRegion(\"status\").empty();\n\t\tthis.showChildView(\"status\", new StatusView({\n\t\t\tmessage: \"Saving app versions...\",\n\t\t\ttype: \"busy\"\n\t\t}));\n\t},\n\n\trenderError: function renderError(error) {\n\t\tthis.getRegion(\"status\").empty();\n\t\tthis.showChildView(\"status\", new ErrorView({ fetchError: error }));\n\t},\n\n\trenderPage: function renderPage() {\n\t\tthis.ui.statusRegion.addClass(\"hide\");\n\t\tthis.ui.headerRegion.removeClass(\"hide\");\n\t\tthis.ui.editorRegion.removeClass(\"hide\");\n\n\t\tthis.header = new Header({ eventBus: this.eventBus });\n\t\tthis.showChildView(\"header\", this.header);\n\t\tthis.editor = new Editor({\n\t\t\teventBus: this.eventBus,\n\t\t\tmodel: this.appVersionsModel\n\t\t});\n\t\tthis.showChildView(\"editor\", this.editor);\n\t},\n\n\tonEditorDataChanged: function onEditorDataChanged() {\n\t\tif (!this.saveSuccessResultPanel.hasClass(\"hide\")) this.saveSuccessResultPanel.addClass(\"hide\");\n\t},\n\n\tonEditorSaving: function onEditorSaving() {\n\t\tthis.renderSavingStatus();\n\n\t\tthis.ui.saveSuccessResultPanel.addClass(\"hide\");\n\t\tthis.ui.editorRegion.addClass(\"hide\");\n\t\tthis.ui.statusRegion.removeClass(\"hide\");\n\t},\n\n\tonEditorSaved: function onEditorSaved(errorResponse) {\n\t\tif (errorResponse) {\n\t\t\tthis.renderError(errorResponse);\n\t\t} else {\n\t\t\tthis.ui.statusRegion.addClass(\"hide\");\n\t\t\tthis.ui.editorRegion.removeClass(\"hide\");\n\t\t\tthis.ui.saveSuccessResultPanel.removeClass(\"hide\");\n\t\t}\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFwcFZlcnNpb25zLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIl8iLCJBY3Rpb25IZWFkZXIiLCJBY3Rpb25UaXRsZSIsIkFwcFZlcnNpb25Nb2RhbCIsIkFwcFZlcnNpb25zTW9kZWwiLCJFcnJvclZpZXciLCJTdGF0dXNWaWV3IiwiSGVhZGVyIiwiZXh0ZW5kIiwidGl0bGVWaWV3Iiwib25UaXRsZVJlYWR5IiwiZXZlbnRCdXMiLCJ0cmlnZ2VyIiwiRWRpdG9yIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsImVkaXRvciIsInVpIiwicmVzdWx0UGFuZWwiLCJzYXZlQnV0dG9uIiwidmVyc2lvbkFuZHJvaWQiLCJ2ZXJzaW9uQW5kcm9pZENvbXBhdGliaWxpdHkiLCJ2ZXJzaW9uaU9TIiwidmVyc2lvbldpbmRvd3MiLCJ2ZXJzaW9uV2luZG93czgxIiwidmVyc2lvbk1hYyIsImV2ZW50cyIsInRlbXBsYXRlQ29udGV4dCIsImlzQW5kcm9pZEFQS1NldCIsInZhbHVlTW9kZWwiLCJoYXMiLCJpc0FuZHJvaWRDb21wYXRpYmlsaXR5QVBLU2V0IiwiaXNEYXRhQ2hhbmdlZCIsImRhdGFDaGFuZ2VkIiwiaW5pdGlhbGl6ZSIsIm9wdGlvbnMiLCJpb3MiLCJtb2RlbCIsImdldCIsInZlcnNpb24iLCJtYWMiLCJ3aW5kb3dzIiwid2luZG93czgxIiwic2V0RGF0YUNoYW5nZWQiLCJjaGFuZ2VkIiwib25WZXJzaW9uQW5kcm9pZENsaWNrIiwiZWRpdEZpbGUiLCJvblZlcnNpb25BbmRyb2lkQ29tcGF0aWJpbGl0eUNsaWNrIiwib25WZXJzaW9uaU9TQ2xpY2siLCJlZGl0VmVyc2lvbiIsIm9uVmVyc2lvbldpbmRvd3NDbGljayIsIm9uVmVyc2lvbldpbmRvd3M4MUNsaWNrIiwib25WZXJzaW9uTWFjQ2xpY2siLCJtb2RlbEF0dHJpYnV0ZSIsInBsYXRmb3JtTmFtZSIsIm1vZGFsIiwidXNlck9wdGlvbnMiLCJmaWxlSW5wdXQiLCJwcm9tcHQiLCJsaXN0ZW5UbyIsInNldCIsInJlbmRlciIsInN0b3BMaXN0ZW5pbmciLCJ1bnNldCIsInNob3ciLCJwbGF0Zm9ybSIsInRyaW0iLCJvblNhdmVCdXR0b25DbGljayIsInNldEZpbGUiLCJkYXRhIiwidXBsb2FkIiwic3VjY2VzcyIsIm9uU2F2ZVN1Y2Nlc3MiLCJiaW5kIiwiZXJyb3IiLCJvblNhdmVFcnJvciIsImNsZWFyIiwic2lsZW50IiwicmVzcG9uc2UiLCJtb2R1bGUiLCJleHBvcnRzIiwibGF5b3V0IiwicmVnaW9ucyIsImhlYWRlciIsInN0YXR1cyIsImVkaXRvclJlZ2lvbiIsImhlYWRlclJlZ2lvbiIsInN0YXR1c1JlZ2lvbiIsInNhdmVTdWNjZXNzUmVzdWx0UGFuZWwiLCJPYmplY3QiLCJvbkVkaXRvckRhdGFDaGFuZ2VkIiwib25FZGl0b3JTYXZpbmciLCJvbkVkaXRvclNhdmVkIiwib25SZW5kZXIiLCJyZW5kZXJMb2FkaW5nU3RhdHVzIiwiYXBwVmVyc2lvbnNNb2RlbCIsImZldGNoIiwib25GZXRjaFN1Y2Nlc3MiLCJvbkZldGNoRXJyb3IiLCJyZW5kZXJQYWdlIiwicmVuZGVyRXJyb3IiLCJnZXRSZWdpb24iLCJlbXB0eSIsInNob3dDaGlsZFZpZXciLCJtZXNzYWdlIiwidHlwZSIsInJlbmRlclNhdmluZ1N0YXR1cyIsImZldGNoRXJyb3IiLCJhZGRDbGFzcyIsInJlbW92ZUNsYXNzIiwiaGFzQ2xhc3MiLCJlcnJvclJlc3BvbnNlIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjs7QUFFQSxJQUFNRSxlQUFlRixRQUFRLHdCQUFSLENBQXJCO0FBQ0EsSUFBTUcsY0FBY0gsUUFBUSx1QkFBUixDQUFwQjtBQUNBLElBQU1JLGtCQUFrQkosUUFBUSxtQkFBUixDQUF4QjtBQUNBLElBQU1LLG1CQUFtQkwsUUFBUSxvQkFBUixDQUF6QjtBQUNB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RSxZQUFSLENBQXFCcUIsUUFBckIsQ0FBOEIsTUFBOUI7QUFDQSxRQUFLM0YsRUFBTCxDQUFRb0UsWUFBUixDQUFxQndCLFdBQXJCLENBQWlDLE1BQWpDO0FBQ0EsUUFBSzVGLEVBQUwsQ0FBUXVFLHNCQUFSLENBQStCcUIsV0FBL0IsQ0FBMkMsTUFBM0M7QUFDQTtBQUNEO0FBdEcrQyxDQUFoQyxDQUFqQiIsImZpbGUiOiJhcHBWZXJzaW9ucy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcblxuY29uc3QgQWN0aW9uSGVhZGVyID0gcmVxdWlyZShcIi4uLy4uL2xpYi9hY3Rpb25IZWFkZXJcIik7XG5jb25zdCBBY3Rpb25UaXRsZSA9IHJlcXVpcmUoXCIuLi8uLi9saWIvYWN0aW9uVGl0bGVcIik7XG5jb25zdCBBcHBWZXJzaW9uTW9kYWwgPSByZXF1aXJlKFwiLi9hcHBWZXJzaW9uTW9kYWxcIik7XG5jb25zdCBBcHBWZXJzaW9uc01vZGVsID0gcmVxdWlyZShcIi4vYXBwVmVyc2lvbnNNb2RlbFwiKTtcbmNvbnN0IEVycm9yVmlldyA9IHJlcXVpcmUoXCIuLi8uLi9saWIvZXJyb3JWaWV3XCIpO1xuY29uc3QgU3RhdHVzVmlldyA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc3RhdHVzVmlld1wiKTtcblxuY29uc3QgSGVhZGVyID0gQWN0aW9uSGVhZGVyLmV4dGVuZCh7XG5cdHRpdGxlVmlldzogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIEFjdGlvblRpdGxlO1xuXHR9LFxuXG5cdG9uVGl0bGVSZWFkeTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwiYWN0aW9uLXRpdGxlOmNoYW5nZS1nbHlwaFwiLCBcImZhLXNsaWRlcnMtaFwiKTtcblx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJhY3Rpb24tdGl0bGU6Y2hhbmdlLXRpdGxlXCIsIFwiQXBwIFZlcnNpb25zXCIpO1xuXHR9LFxufSk7XG5cbmNvbnN0IEVkaXRvciA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiYXBwLXZlcnNpb25zLWVkaXRvclwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2FwcFZlcnNpb25zLm51bmpcIikuZWRpdG9yLFxuXG5cdHVpOiB7XG5cdFx0cmVzdWx0UGFuZWw6IFwiLmFwcC12ZXJzaW9ucy1yZXN1bHQtcGFuZWxcIixcblx0XHRzYXZlQnV0dG9uOiBcImJ1dHRvbi5zYXZlXCIsXG5cdFx0dmVyc2lvbkFuZHJvaWQ6IFwiLmFwcC12ZXJzaW9uLWFuZHJvaWRcIixcblx0XHR2ZXJzaW9uQW5kcm9pZENvbXBhdGliaWxpdHk6IFwiLmFwcC12ZXJzaW9uLWFuZHJvaWQtY29tcGF0aWJpbGl0eVwiLFxuXHRcdHZlcnNpb25pT1M6IFwiLmFwcC12ZXJzaW9uLWlvc1wiLFxuXHRcdHZlcnNpb25XaW5kb3dzOiBcIi5hcHAtdmVyc2lvbi13aW5kb3dzXCIsXG5cdFx0dmVyc2lvbldpbmRvd3M4MTogXCIuYXBwLXZlcnNpb24td2luZG93czgxXCIsXG5cdFx0dmVyc2lvbk1hYzogXCIuYXBwLXZlcnNpb24tbWFjXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkuc2F2ZUJ1dHRvblwiOiBcIm9uU2F2ZUJ1dHRvbkNsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkudmVyc2lvbkFuZHJvaWRcIjogXCJvblZlcnNpb25BbmRyb2lkQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS52ZXJzaW9uQW5kcm9pZENvbXBhdGliaWxpdHlcIjogXCJvblZlcnNpb25BbmRyb2lkQ29tcGF0aWJpbGl0eUNsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkudmVyc2lvbmlPU1wiOiBcIm9uVmVyc2lvbmlPU0NsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkudmVyc2lvbldpbmRvd3NcIjogXCJvblZlcnNpb25XaW5kb3dzQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS52ZXJzaW9uV2luZG93czgxXCI6IFwib25WZXJzaW9uV2luZG93czgxQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS52ZXJzaW9uTWFjXCI6IFwib25WZXJzaW9uTWFjQ2xpY2tcIixcblx0fSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRpc0FuZHJvaWRBUEtTZXQ6ICgpID0+IHRoaXMudmFsdWVNb2RlbC5oYXMoXCJhbmRyb2lkQVBLXCIpLFxuXHRcdFx0aXNBbmRyb2lkQ29tcGF0aWJpbGl0eUFQS1NldDogKCkgPT4gdGhpcy52YWx1ZU1vZGVsLmhhcyhcImFuZHJvaWRDb21wYXRpYmlsaXR5QVBLXCIpLFxuXHRcdFx0aXNEYXRhQ2hhbmdlZDogKCkgPT4gdGhpcy5kYXRhQ2hhbmdlZCxcblx0XHR9O1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLmV2ZW50QnVzID0gb3B0aW9ucy5ldmVudEJ1cztcblx0XHR0aGlzLnZhbHVlTW9kZWwgPSBuZXcgQXBwVmVyc2lvbnNNb2RlbCh7XG5cdFx0XHRpb3M6IHRoaXMubW9kZWwuZ2V0KFwiaW9zXCIpLnZlcnNpb24sXG5cdFx0XHRtYWM6IHRoaXMubW9kZWwuZ2V0KFwibWFjXCIpLnZlcnNpb24sXG5cdFx0XHR3aW5kb3dzOiB0aGlzLm1vZGVsLmdldChcIndpbmRvd3NcIikudmVyc2lvbixcblx0XHRcdHdpbmRvd3M4MTogdGhpcy5tb2RlbC5nZXQoXCJ3aW5kb3dzODFcIikudmVyc2lvbixcblx0XHR9KTtcblx0XHR0aGlzLmRhdGFDaGFuZ2VkID0gZmFsc2U7XG5cdH0sXG5cblx0c2V0RGF0YUNoYW5nZWQ6IGZ1bmN0aW9uKGNoYW5nZWQpIHtcblx0XHR0aGlzLmRhdGFDaGFuZ2VkID0gY2hhbmdlZDtcblxuXHRcdGlmIChjaGFuZ2VkKVxuXHRcdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwiZWRpdG9yOmRhdGEtY2hhbmdlZFwiKTtcblx0fSxcblxuXHRvblZlcnNpb25BbmRyb2lkQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZWRpdEZpbGUoXCJhbmRyb2lkQVBLXCIsIFwiQW5kcm9pZFwiKTtcblx0fSxcblxuXHRvblZlcnNpb25BbmRyb2lkQ29tcGF0aWJpbGl0eUNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmVkaXRGaWxlKFwiYW5kcm9pZENvbXBhdGliaWxpdHlBUEtcIiwgXCJBbmRyb2lkIChDb21wYXRpYmlsaXR5KVwiKTtcblx0fSxcblxuXHRvblZlcnNpb25pT1NDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5lZGl0VmVyc2lvbihcImlvc1wiLCBcImlPU1wiKTtcblx0fSxcblxuXHRvblZlcnNpb25XaW5kb3dzQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZWRpdFZlcnNpb24oXCJ3aW5kb3dzXCIsIFwiV2luZG93c1wiKTtcblx0fSxcblxuXHRvblZlcnNpb25XaW5kb3dzODFDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5lZGl0VmVyc2lvbihcIndpbmRvd3M4MVwiLCBcIldpbmRvd3MgOC4xXCIpO1xuXHR9LFxuXG5cdG9uVmVyc2lvbk1hY0NsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmVkaXRWZXJzaW9uKFwibWFjXCIsIFwiTWFjXCIpO1xuXHR9LFxuXG5cdGVkaXRGaWxlOiBmdW5jdGlvbihtb2RlbEF0dHJpYnV0ZSwgcGxhdGZvcm1OYW1lKSB7XG5cdFx0Y29uc3QgbW9kYWwgPSBuZXcgQXBwVmVyc2lvbk1vZGFsKHtcblx0XHRcdG1vZGVsOiB0aGlzLnZhbHVlTW9kZWwsXG5cdFx0XHR1c2VyT3B0aW9uczoge1xuXHRcdFx0XHRmaWxlSW5wdXQ6IHRydWUsXG5cdFx0XHRcdG1vZGVsQXR0cmlidXRlOiBtb2RlbEF0dHJpYnV0ZSxcblx0XHRcdFx0cHJvbXB0OiBcIlNlbGVjdCB0aGUgZmlsZSBmb3IgXCIgKyBwbGF0Zm9ybU5hbWUsXG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5saXN0ZW5Ubyhtb2RhbCwgXCJhY2NlcHRcIiwgbW9kZWwgPT4ge1xuXHRcdFx0dGhpcy52YWx1ZU1vZGVsLnNldChtb2RlbEF0dHJpYnV0ZSwgbW9kZWwuZ2V0KG1vZGVsQXR0cmlidXRlKSk7XG5cblx0XHRcdHRoaXMuZGF0YUNoYW5nZWQgPSB0cnVlO1xuXHRcdFx0dGhpcy5yZW5kZXIoKTtcblxuXHRcdFx0dGhpcy5zdG9wTGlzdGVuaW5nKG1vZGFsKTtcblx0XHR9KTtcblxuXHRcdHRoaXMubGlzdGVuVG8obW9kYWwsIFwiY2FuY2VsXCIsICgpID0+IHtcblx0XHRcdHRoaXMudmFsdWVNb2RlbC51bnNldChtb2RlbEF0dHJpYnV0ZSk7XG5cblx0XHRcdHRoaXMuc3RvcExpc3RlbmluZyhtb2RhbCk7XG5cdFx0fSk7XG5cblx0XHRtb2RhbC5zaG93KCk7XG5cdH0sXG5cblx0ZWRpdFZlcnNpb246IGZ1bmN0aW9uKG1vZGVsQXR0cmlidXRlLCBwbGF0Zm9ybU5hbWUpIHtcblx0XHRjb25zdCBtb2RhbCA9IG5ldyBBcHBWZXJzaW9uTW9kYWwoe1xuXHRcdFx0bW9kZWw6IHRoaXMudmFsdWVNb2RlbCxcblx0XHRcdHVzZXJPcHRpb25zOiB7XG5cdFx0XHRcdG1vZGVsQXR0cmlidXRlOiBtb2RlbEF0dHJpYnV0ZSxcblx0XHRcdFx0cHJvbXB0OiBcIkVudGVyIHRoZSB2ZXJzaW9uIGZvciBcIiArIHBsYXRmb3JtTmFtZSxcblx0XHRcdH0sXG5cdFx0fSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKG1vZGFsLCBcImFjY2VwdFwiLCBtb2RlbCA9PiB7XG5cdFx0XHRjb25zdCBwbGF0Zm9ybSA9IHRoaXMubW9kZWwuZ2V0KG1vZGVsQXR0cmlidXRlKTtcblx0XHRcdHBsYXRmb3JtLnZlcnNpb24gPSBfLnRyaW0obW9kZWwuZ2V0KG1vZGVsQXR0cmlidXRlKSk7XG5cblx0XHRcdHRoaXMudmFsdWVNb2RlbC5zZXQobW9kZWxBdHRyaWJ1dGUsIHBsYXRmb3JtLnZlcnNpb24pO1xuXG5cdFx0XHR0aGlzLmRhdGFDaGFuZ2VkID0gdHJ1ZTtcblx0XHRcdHRoaXMucmVuZGVyKCk7XG5cblx0XHRcdHRoaXMuc3RvcExpc3RlbmluZyhtb2RhbCk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKG1vZGFsLCBcImNhbmNlbFwiLCAoKSA9PiB7XG5cdFx0XHR0aGlzLnZhbHVlTW9kZWwudW5zZXQobW9kZWxBdHRyaWJ1dGUpO1xuXG5cdFx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcobW9kYWwpO1xuXHRcdH0pO1xuXG5cdFx0bW9kYWwuc2hvdygpO1xuXHR9LFxuXG5cdG9uU2F2ZUJ1dHRvbkNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy52YWx1ZU1vZGVsLmhhcyhcImFuZHJvaWRBUEtcIikpXG5cdFx0XHR0aGlzLm1vZGVsLnNldEZpbGUoXCJhbmRyb2lkQVBLXCIsIHRoaXMudmFsdWVNb2RlbC5nZXQoXCJhbmRyb2lkQVBLXCIpKTtcblxuXHRcdGlmICh0aGlzLnZhbHVlTW9kZWwuaGFzKFwiYW5kcm9pZENvbXBhdGliaWxpdHlBUEtcIikpXG5cdFx0XHR0aGlzLm1vZGVsLnNldEZpbGUoXCJhbmRyb2lkQ29tcGF0aWJpbGl0eUFQS1wiLCB0aGlzLnZhbHVlTW9kZWwuZ2V0KFwiYW5kcm9pZENvbXBhdGliaWxpdHlBUEtcIikpO1xuXG5cdFx0Y29uc3QgZGF0YSA9IHtcblx0XHRcdGlvczogdGhpcy52YWx1ZU1vZGVsLmhhcyhcImlvc1wiKSA/IHRoaXMudmFsdWVNb2RlbC5nZXQoXCJpb3NcIikgOiB0aGlzLm1vZGVsLmdldChcImlvc1wiKS52ZXJzaW9uLFxuXHRcdFx0d2luZG93czogdGhpcy52YWx1ZU1vZGVsLmhhcyhcIndpbmRvd3NcIikgPyB0aGlzLnZhbHVlTW9kZWwuZ2V0KFwid2luZG93c1wiKSA6IHRoaXMubW9kZWwuZ2V0KFwid2luZG93c1wiKS52ZXJzaW9uLFxuXHRcdFx0d2luZG93czgxOiB0aGlzLnZhbHVlTW9kZWwuaGFzKFwid2luZG93czgxXCIpID8gdGhpcy52YWx1ZU1vZGVsLmdldChcIndpbmRvd3M4MVwiKSA6IHRoaXMubW9kZWwuZ2V0KFwid2luZG93czgxXCIpLnZlcnNpb24sXG5cdFx0XHRtYWM6IHRoaXMudmFsdWVNb2RlbC5oYXMoXCJtYWNcIikgPyB0aGlzLnZhbHVlTW9kZWwuZ2V0KFwibWFjXCIpIDogdGhpcy5tb2RlbC5nZXQoXCJtYWNcIikudmVyc2lvbixcblx0XHR9O1xuXG5cdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwiZWRpdG9yOnNhdmluZ1wiKTtcblxuXHRcdHRoaXMubW9kZWwudXBsb2FkKGRhdGEsIHtcblx0XHRcdHN1Y2Nlc3M6IHRoaXMub25TYXZlU3VjY2Vzcy5iaW5kKHRoaXMpLFxuXHRcdFx0ZXJyb3I6IHRoaXMub25TYXZlRXJyb3IuYmluZCh0aGlzKSxcblx0XHR9KTtcblx0fSxcblxuXHRvblNhdmVTdWNjZXNzOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnZhbHVlTW9kZWwuY2xlYXIoeyBzaWxlbnQ6IHRydWUgfSk7XG5cdFx0dGhpcy5kYXRhQ2hhbmdlZCA9IGZhbHNlO1xuXHRcdHRoaXMucmVuZGVyKCk7XG5cblx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJlZGl0b3I6c2F2ZWRcIik7XG5cdH0sXG5cblx0b25TYXZlRXJyb3I6IGZ1bmN0aW9uKG1vZGVsLCByZXNwb25zZSkge1xuXHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImVkaXRvcjpzYXZlZFwiLCByZXNwb25zZSk7XG5cdH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImFwcC12ZXJzaW9ucy1sYXlvdXQgY29udGVudFwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2FwcFZlcnNpb25zLm51bmpcIikubGF5b3V0LFxuXG5cdHJlZ2lvbnM6IHtcblx0XHRlZGl0b3I6IFwiLmVkaXRvci1yZWdpb25cIixcblx0XHRoZWFkZXI6IFwiLmhlYWRlci1yZWdpb25cIixcblx0XHRzdGF0dXM6IFwiLnN0YXR1cy1yZWdpb25cIixcblx0fSxcblxuXHR1aToge1xuXHRcdGVkaXRvclJlZ2lvbjogXCIuZWRpdG9yLXJlZ2lvblwiLFxuXHRcdGhlYWRlclJlZ2lvbjogXCIuaGVhZGVyLXJlZ2lvblwiLFxuXHRcdHN0YXR1c1JlZ2lvbjogXCIuc3RhdHVzLXJlZ2lvblwiLFxuXG5cdFx0c2F2ZVN1Y2Nlc3NSZXN1bHRQYW5lbDogXCIuYXBwLXZlcnNpb25zLXN1Y2Nlc3MtcmVzdWx0LXBhbmVsXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5ldmVudEJ1cyA9IG5ldyBCYWNrYm9uZS5NYXJpb25ldHRlLk9iamVjdCgpO1xuXG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmV2ZW50QnVzLCBcImVkaXRvcjpkYXRhLWNoYW5nZWRcIiwgdGhpcy5vbkVkaXRvckRhdGFDaGFuZ2VkLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJlZGl0b3I6c2F2aW5nXCIsIHRoaXMub25FZGl0b3JTYXZpbmcuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmV2ZW50QnVzLCBcImVkaXRvcjpzYXZlZFwiLCB0aGlzLm9uRWRpdG9yU2F2ZWQuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMucmVuZGVyTG9hZGluZ1N0YXR1cygpO1xuXG5cdFx0dGhpcy5hcHBWZXJzaW9uc01vZGVsID0gbmV3IEFwcFZlcnNpb25zTW9kZWwoKTtcblx0XHR0aGlzLmFwcFZlcnNpb25zTW9kZWwuZmV0Y2goe1xuXHRcdFx0c3VjY2VzczogdGhpcy5vbkZldGNoU3VjY2Vzcy5iaW5kKHRoaXMpLFxuXHRcdFx0ZXJyb3I6IHRoaXMub25GZXRjaEVycm9yLmJpbmQodGhpcyksXG5cdFx0fSk7XG5cdH0sXG5cblx0b25GZXRjaFN1Y2Nlc3M6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMucmVuZGVyUGFnZSgpO1xuXHR9LFxuXG5cdG9uRmV0Y2hFcnJvcjogZnVuY3Rpb24obW9kZWwsIHJlc3BvbnNlKSB7XG5cdFx0dGhpcy5yZW5kZXJFcnJvcihyZXNwb25zZSk7XG5cdH0sXG5cblx0cmVuZGVyTG9hZGluZ1N0YXR1czogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5nZXRSZWdpb24oXCJzdGF0dXNcIikuZW1wdHkoKTtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJzdGF0dXNcIiwgbmV3IFN0YXR1c1ZpZXcoe1xuXHRcdFx0bWVzc2FnZTogXCJMb2FkaW5nIGFwcCB2ZXJzaW9ucy4uLlwiLFxuXHRcdFx0dHlwZTogXCJidXN5XCIsXG5cdFx0fSkpO1xuXHR9LFxuXG5cdHJlbmRlclNhdmluZ1N0YXR1czogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5nZXRSZWdpb24oXCJzdGF0dXNcIikuZW1wdHkoKTtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJzdGF0dXNcIiwgbmV3IFN0YXR1c1ZpZXcoe1xuXHRcdFx0bWVzc2FnZTogXCJTYXZpbmcgYXBwIHZlcnNpb25zLi4uXCIsXG5cdFx0XHR0eXBlOiBcImJ1c3lcIixcblx0XHR9KSk7XG5cdH0sXG5cblx0cmVuZGVyRXJyb3I6IGZ1bmN0aW9uKGVycm9yKSB7XG5cdFx0dGhpcy5nZXRSZWdpb24oXCJzdGF0dXNcIikuZW1wdHkoKTtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJzdGF0dXNcIiwgbmV3IEVycm9yVmlldyh7IGZldGNoRXJyb3I6IGVycm9yIH0pKTtcblx0fSxcblxuXHRyZW5kZXJQYWdlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLnN0YXR1c1JlZ2lvbi5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5oZWFkZXJSZWdpb24ucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkuZWRpdG9yUmVnaW9uLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblxuXHRcdHRoaXMuaGVhZGVyID0gbmV3IEhlYWRlcih7IGV2ZW50QnVzOiB0aGlzLmV2ZW50QnVzIH0pO1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImhlYWRlclwiLCB0aGlzLmhlYWRlcik7XG5cdFx0dGhpcy5lZGl0b3IgPSBuZXcgRWRpdG9yKHtcblx0XHRcdGV2ZW50QnVzOiB0aGlzLmV2ZW50QnVzLFxuXHRcdFx0bW9kZWw6IHRoaXMuYXBwVmVyc2lvbnNNb2RlbCxcblx0XHR9KTtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJlZGl0b3JcIiwgdGhpcy5lZGl0b3IpO1xuXHR9LFxuXG5cdG9uRWRpdG9yRGF0YUNoYW5nZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghdGhpcy5zYXZlU3VjY2Vzc1Jlc3VsdFBhbmVsLmhhc0NsYXNzKFwiaGlkZVwiKSlcblx0XHRcdHRoaXMuc2F2ZVN1Y2Nlc3NSZXN1bHRQYW5lbC5hZGRDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0b25FZGl0b3JTYXZpbmc6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMucmVuZGVyU2F2aW5nU3RhdHVzKCk7XG5cblx0XHR0aGlzLnVpLnNhdmVTdWNjZXNzUmVzdWx0UGFuZWwuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkuZWRpdG9yUmVnaW9uLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLnN0YXR1c1JlZ2lvbi5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0b25FZGl0b3JTYXZlZDogZnVuY3Rpb24oZXJyb3JSZXNwb25zZSkge1xuXHRcdGlmIChlcnJvclJlc3BvbnNlKSB7XG5cdFx0XHR0aGlzLnJlbmRlckVycm9yKGVycm9yUmVzcG9uc2UpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMudWkuc3RhdHVzUmVnaW9uLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHRoaXMudWkuZWRpdG9yUmVnaW9uLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHRoaXMudWkuc2F2ZVN1Y2Nlc3NSZXN1bHRQYW5lbC5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0fVxuXHR9LFxufSk7Il19",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\n\nmodule.exports = Backbone.Model.extend({\n\tdefaults: {},\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/apps/version\";\n\t},\n\n\tupload: function upload(_attrs, _options) {\n\t\tvar options = _options;\n\t\tvar attrs = _attrs;\n\n\t\tif (_options === null) {\n\t\t\toptions = _attrs;\n\t\t\tattrs = null;\n\t\t}\n\n\t\treturn this.binarySave(attrs, _.extend({ wait: true }, options));\n\t},\n\n\tvalidate: function validate(attributes) {\n\t\tvar errors = {};\n\n\t\tif (!attributes.androidAPK && !attributes.androidCompatibilityAPK && !attributes.ios && !attributes.windows && !attributes.windows81 && !attributes.mac) errors.version = \"A version or APK is required.\";else if (attributes.androidAPK) _.extend(errors, this.validateFile(attributes.androidAPK.name, [\"apk\"], \"androidAPK\"));else if (attributes.androidCompatibilityAPK) _.extend(errors, this.validateFile(attributes.androidCompatibilityAPK.name, [\"apk\"], \"androidCompatibilityAPK\"));\n\n\t\tif (_.keys(errors).length > 0) return errors;\n\t},\n\n\tvalidateFile: function validateFile(fileName, validExtensions, errorKey) {\n\t\tvar errors = {};\n\n\t\tvar acceptedExtensions = _.flatten([validExtensions]);\n\t\tvar extension = fileName.toLowerCase().split(\".\");\n\t\textension = extension[extension.length - 1];\n\n\t\tif (!_.some(acceptedExtensions, function (x) {\n\t\t\treturn x === extension;\n\t\t})) errors[errorKey] = \"The selected file must have one of these extensions: \" + acceptedExtensions.join(\", \");\n\n\t\treturn errors;\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFwcFZlcnNpb25zTW9kZWwuanMiXSwibmFtZXMiOlsiXyIsInJlcXVpcmUiLCJCYWNrYm9uZSIsInNldHRpbmdzIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1vZGVsIiwiZXh0ZW5kIiwiZGVmYXVsdHMiLCJ1cmwiLCJ1cmxSb290IiwidXBsb2FkIiwiX2F0dHJzIiwiX29wdGlvbnMiLCJvcHRpb25zIiwiYXR0cnMiLCJiaW5hcnlTYXZlIiwid2FpdCIsInZhbGlkYXRlIiwiYXR0cmlidXRlcyIsImVycm9ycyIsImFuZHJvaWRBUEsiLCJhbmRyb2lkQ29tcGF0aWJpbGl0eUFQSyIsImlvcyIsIndpbmRvd3MiLCJ3aW5kb3dzODEiLCJtYWMiLCJ2ZXJzaW9uIiwidmFsaWRhdGVGaWxlIiwibmFtZSIsImtleXMiLCJsZW5ndGgiLCJmaWxlTmFtZSIsInZhbGlkRXh0ZW5zaW9ucyIsImVycm9yS2V5IiwiYWNjZXB0ZWRFeHRlbnNpb25zIiwiZmxhdHRlbiIsImV4dGVuc2lvbiIsInRvTG93ZXJDYXNlIiwic3BsaXQiLCJzb21lIiwieCIsImpvaW4iXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsV0FBV0QsUUFBUSxVQUFSLENBQWpCOztBQUVBLElBQU1FLFdBQVdGLFFBQVEsY0FBUixDQUFqQjs7QUFFQUcsT0FBT0MsT0FBUCxHQUFpQkgsU0FBU0ksS0FBVCxDQUFlQyxNQUFmLENBQXNCO0FBQ3RDQyxXQUFVLEVBRDRCOztBQUd0Q0MsTUFBSyxlQUFXO0FBQ2YsU0FBT04sU0FBU08sT0FBVCxHQUFtQix1QkFBMUI7QUFDQSxFQUxxQzs7QUFPdENDLFNBQVEsZ0JBQVNDLE1BQVQsRUFBaUJDLFFBQWpCLEVBQTJCO0FBQ2xDLE1BQUlDLFVBQVVELFFBQWQ7QUFDQSxNQUFJRSxRQUFRSCxNQUFaOztBQUVBLE1BQUlDLGFBQWEsSUFBakIsRUFBdUI7QUFDdEJDLGFBQVVGLE1BQVY7QUFDQUcsV0FBUSxJQUFSO0FBQ0E7O0FBRUQsU0FBTyxLQUFLQyxVQUFMLENBQWdCRCxLQUFoQixFQUF1QmYsRUFBRU8sTUFBRixDQUFTLEVBQUVVLE1BQU0sSUFBUixFQUFULEVBQXlCSCxPQUF6QixDQUF2QixDQUFQO0FBQ0EsRUFqQnFDOztBQW1CdENJLFdBQVUsa0JBQVNDLFVBQVQsRUFBcUI7QUFDOUIsTUFBTUMsU0FBUyxFQUFmOztBQUVBLE1BQUksQ0FBQ0QsV0FBV0UsVUFBWixJQUEwQixDQUFDRixXQUFXRyx1QkFBdEMsSUFBaUUsQ0FBQ0gsV0FBV0ksR0FBN0UsSUFDSCxDQUFDSixXQUFXSyxPQURULElBQ29CLENBQUNMLFdBQVdNLFNBRGhDLElBQzZDLENBQUNOLFdBQVdPLEdBRDdELEVBRUNOLE9BQU9PLE9BQVAsR0FBaUIsK0JBQWpCLENBRkQsS0FHSyxJQUFJUixXQUFXRSxVQUFmLEVBQ0pyQixFQUFFTyxNQUFGLENBQVNhLE1BQVQsRUFBaUIsS0FBS1EsWUFBTCxDQUFrQlQsV0FBV0UsVUFBWCxDQUFzQlEsSUFBeEMsRUFBOEMsQ0FBQyxLQUFELENBQTlDLEVBQXVELFlBQXZELENBQWpCLEVBREksS0FFQSxJQUFJVixXQUFXRyx1QkFBZixFQUNKdEIsRUFBRU8sTUFBRixDQUFTYSxNQUFULEVBQWlCLEtBQUtRLFlBQUwsQ0FBa0JULFdBQVdHLHVCQUFYLENBQW1DTyxJQUFyRCxFQUEyRCxDQUFDLEtBQUQsQ0FBM0QsRUFBb0UseUJBQXBFLENBQWpCOztBQUVELE1BQUk3QixFQUFFOEIsSUFBRixDQUFPVixNQUFQLEVBQWVXLE1BQWYsR0FBd0IsQ0FBNUIsRUFDQyxPQUFPWCxNQUFQO0FBQ0QsRUFoQ3FDOztBQWtDdENRLGVBQWMsc0JBQVNJLFFBQVQsRUFBbUJDLGVBQW5CLEVBQW9DQyxRQUFwQyxFQUE4QztBQUMzRCxNQUFNZCxTQUFTLEVBQWY7O0FBRUEsTUFBTWUscUJBQXFCbkMsRUFBRW9DLE9BQUYsQ0FBVSxDQUFDSCxlQUFELENBQVYsQ0FBM0I7QUFDQSxNQUFJSSxZQUFZTCxTQUFTTSxXQUFULEdBQXVCQyxLQUF2QixDQUE2QixHQUE3QixDQUFoQjtBQUNBRixjQUFZQSxVQUFVQSxVQUFVTixNQUFWLEdBQW1CLENBQTdCLENBQVo7O0FBRUEsTUFBSSxDQUFDL0IsRUFBRXdDLElBQUYsQ0FBT0wsa0JBQVAsRUFBMkI7QUFBQSxVQUFLTSxNQUFNSixTQUFYO0FBQUEsR0FBM0IsQ0FBTCxFQUNDakIsT0FBT2MsUUFBUCxJQUFtQiwwREFBMERDLG1CQUFtQk8sSUFBbkIsQ0FBd0IsSUFBeEIsQ0FBN0U7O0FBRUQsU0FBT3RCLE1BQVA7QUFDQTtBQTdDcUMsQ0FBdEIsQ0FBakIiLCJmaWxlIjoiYXBwVmVyc2lvbnNNb2RlbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcblxuY29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7fSxcblxuXHR1cmw6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9hcHBzL3ZlcnNpb25cIjtcblx0fSxcblxuXHR1cGxvYWQ6IGZ1bmN0aW9uKF9hdHRycywgX29wdGlvbnMpIHtcblx0XHRsZXQgb3B0aW9ucyA9IF9vcHRpb25zO1xuXHRcdGxldCBhdHRycyA9IF9hdHRycztcblxuXHRcdGlmIChfb3B0aW9ucyA9PT0gbnVsbCkge1xuXHRcdFx0b3B0aW9ucyA9IF9hdHRycztcblx0XHRcdGF0dHJzID0gbnVsbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5iaW5hcnlTYXZlKGF0dHJzLCBfLmV4dGVuZCh7IHdhaXQ6IHRydWUgfSwgb3B0aW9ucykpO1xuXHR9LFxuXG5cdHZhbGlkYXRlOiBmdW5jdGlvbihhdHRyaWJ1dGVzKSB7XG5cdFx0Y29uc3QgZXJyb3JzID0ge307XG5cblx0XHRpZiAoIWF0dHJpYnV0ZXMuYW5kcm9pZEFQSyAmJiAhYXR0cmlidXRlcy5hbmRyb2lkQ29tcGF0aWJpbGl0eUFQSyAmJiAhYXR0cmlidXRlcy5pb3MgJiZcblx0XHRcdCFhdHRyaWJ1dGVzLndpbmRvd3MgJiYgIWF0dHJpYnV0ZXMud2luZG93czgxICYmICFhdHRyaWJ1dGVzLm1hYylcblx0XHRcdGVycm9ycy52ZXJzaW9uID0gXCJBIHZlcnNpb24gb3IgQVBLIGlzIHJlcXVpcmVkLlwiO1xuXHRcdGVsc2UgaWYgKGF0dHJpYnV0ZXMuYW5kcm9pZEFQSylcblx0XHRcdF8uZXh0ZW5kKGVycm9ycywgdGhpcy52YWxpZGF0ZUZpbGUoYXR0cmlidXRlcy5hbmRyb2lkQVBLLm5hbWUsIFtcImFwa1wiXSwgXCJhbmRyb2lkQVBLXCIpKTtcblx0XHRlbHNlIGlmIChhdHRyaWJ1dGVzLmFuZHJvaWRDb21wYXRpYmlsaXR5QVBLKVxuXHRcdFx0Xy5leHRlbmQoZXJyb3JzLCB0aGlzLnZhbGlkYXRlRmlsZShhdHRyaWJ1dGVzLmFuZHJvaWRDb21wYXRpYmlsaXR5QVBLLm5hbWUsIFtcImFwa1wiXSwgXCJhbmRyb2lkQ29tcGF0aWJpbGl0eUFQS1wiKSk7XG5cblx0XHRpZiAoXy5rZXlzKGVycm9ycykubGVuZ3RoID4gMClcblx0XHRcdHJldHVybiBlcnJvcnM7XG5cdH0sXG5cblx0dmFsaWRhdGVGaWxlOiBmdW5jdGlvbihmaWxlTmFtZSwgdmFsaWRFeHRlbnNpb25zLCBlcnJvcktleSkge1xuXHRcdGNvbnN0IGVycm9ycyA9IHt9O1xuXG5cdFx0Y29uc3QgYWNjZXB0ZWRFeHRlbnNpb25zID0gXy5mbGF0dGVuKFt2YWxpZEV4dGVuc2lvbnNdKTtcblx0XHRsZXQgZXh0ZW5zaW9uID0gZmlsZU5hbWUudG9Mb3dlckNhc2UoKS5zcGxpdChcIi5cIik7XG5cdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9uW2V4dGVuc2lvbi5sZW5ndGggLSAxXTtcblxuXHRcdGlmICghXy5zb21lKGFjY2VwdGVkRXh0ZW5zaW9ucywgeCA9PiB4ID09PSBleHRlbnNpb24pKVxuXHRcdFx0ZXJyb3JzW2Vycm9yS2V5XSA9IFwiVGhlIHNlbGVjdGVkIGZpbGUgbXVzdCBoYXZlIG9uZSBvZiB0aGVzZSBleHRlbnNpb25zOiBcIiArIGFjY2VwdGVkRXh0ZW5zaW9ucy5qb2luKFwiLCBcIik7XG5cblx0XHRyZXR1cm4gZXJyb3JzO1xuXHR9LFxufSk7XG4iXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar path = require(\"path\");\nvar moment = require(\"moment\");\n\nvar App = require(\"../../index\");\n\nvar gradeMap = require(\"../../lib/gradeMap\");\n\nvar ServerGrid = require(\"../../lib/serverGrid\");\nvar settings = require(\"app-settings\");\nvar SmallModal = require(\"../../lib/smallModal\");\n\nvar Model = Backbone.Epoxy.Model.extend({\n\tcomputeds: {\n\t\tisLoaded: function isLoaded() {\n\t\t\treturn this.has(\"_id\");\n\t\t},\n\t\tbookGrade: function bookGrade() {\n\t\t\treturn gradeMap.codeToHumanValue(this.get(\"grade\"));\n\t\t}\n\t}\n});\n\nvar Collection = Backbone.PageableCollection.extend({\n\tmodel: Model,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/epubs/choices?paged=true\";\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"content book-choices\",\n\n\ttemplate: require(\"../templates/book-choices.nunj\"),\n\n\tui: {\n\t\tfilterBar: \".ops-bar .filters\",\n\t\tcounter: \".ops-bar .counter\",\n\t\tuploader: \".upload\",\n\t\tpaging: \".paging\",\n\t\tgrid: \"div.grid\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.download\": \"showDownloads\",\n\t\t\"click @ui.uploader\": \"uploadChoices\"\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"isLoaded\", label: \"Book Uploaded?\", cell: ServerGrid.BooleanIconCell.extend({}), editable: false }, { name: \"universal_id\", label: \"Book ID\", cell: \"string\", editable: false }, { name: \"title\", label: \"Book Name\", cell: \"string\", editable: false }, { name: \"subject\", label: \"Subject\", editable: false, cell: \"string\" }, { name: \"bookGrade\", label: \"Grade\", cell: \"string\", editable: false }, { name: \"language\", label: \"Language\", cell: \"string\", editable: false }, { name: \"isbn\", label: \"ISBN\", cell: \"string\", editable: false }, { name: \"publisher\", label: \"Publisher\", cell: \"string\", editable: false }, { name: \"years\", label: \"Chosen Years\", cell: \"string\", editable: false }];\n\n\t\tvar grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new Collection(),\n\t\t\tclickable: false,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counter,\n\t\t\t\ttemplate: \"Choices $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar languageFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"languageFilter\",\n\t\t\tlabel: \"Language\",\n\t\t\tcategories: [{ items: settings.languageList }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar subjectFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"subjectFilter\",\n\t\t\tlabel: \"Subject\",\n\t\t\tserver: {\n\t\t\t\tkey: \"subject_id\",\n\t\t\t\tvalue: \"subject\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/subjects\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\n\t\tvar gradeFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"gradeFilter\",\n\t\t\tlabel: \"Year of Study\",\n\t\t\tserver: true,\n\t\t\tcategories: _.map(settings.gradeList, function (val, key) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: key,\n\t\t\t\t\titems: _.reduce(val.sort(function (a, b) {\n\t\t\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t\t\t}), function (sum, num) {\n\t\t\t\t\t\tsum.push({ name: num.value, label: num.name });return sum;\n\t\t\t\t\t}, [])\n\t\t\t\t};\n\t\t\t})\n\t\t};\n\n\t\tvar yearFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"yearFilter\",\n\t\t\tlabel: \"Chosen Year\",\n\t\t\tcategories: [{ items: _.range(2014, moment().year() + 2) }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar formatFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"formatFilter\",\n\t\t\tlabel: \"Format\",\n\t\t\tcategories: [{ items: { mpdf: \"PDF\", mpub: \"EPUB\" } }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar pubFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"pubFilter\",\n\t\t\tlabel: \"Publisher\",\n\t\t\tserver: {\n\t\t\t\tkey: \"publisher_id\",\n\t\t\t\tvalue: \"fullname\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/publishers?dummy=false\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\n\t\tvar filterList = [textFilter, languageFilter, subjectFilter, gradeFilter, yearFilter, formatFilter, pubFilter];\n\n\t\tthis.ui.filterBar.prepend(grid.filter({\n\t\t\tfilterContainer: this.ui.filterBar,\n\t\t\tfilters: filterList,\n\t\t\tdefaultFilters: [\"textFilter\"]\n\t\t}).render().el);\n\t},\n\n\tuploadChoices: function uploadChoices() {\n\t\tvar modal = new SmallModal({\n\t\t\ttitle: \"<span class='fal fa-cloud-upload'/> Upload Choices Manually\",\n\t\t\tbody: \"<p>You can upload book choices manually. Provide the JSON file below:</p><p><input type='file'/></p>\",\n\t\t\tpersist: true\n\t\t});\n\n\t\tmodal.on(\"button:ok\", function () {\n\t\t\tif ($(\"input\", modal.el).get(0).files.length === 0) return modal.showError(\"No file provided\");\n\t\t\tif (path.extname($(\"input\", modal.el).get(0).files[0].name).toLowerCase() !== \".json\") return modal.showError(\"Only JSON files allowed\");\n\n\t\t\tvar reader = new FileReader();\n\t\t\treader.addEventListener(\"load\", function (evt) {\n\t\t\t\tvar model = new Backbone.Model(JSON.parse(evt.target.result));\n\t\t\t\tmodel.save({}, {\n\t\t\t\t\turl: settings.urlRoot + \"/api/1.0/empathy/books/choices/manual\",\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tsuccess: function success() {\n\t\t\t\t\t\talert(\"Success\");modal.destroy();\n\t\t\t\t\t},\n\t\t\t\t\terror: function error(model2, xhr) {\n\t\t\t\t\t\tmodal.showError(App.parseResponse(xhr).detail);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t\treader.readAsText($(\"input\", modal.el).get(0).files[0]);\n\t\t});\n\n\t\tmodal.show();\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJvb2stY2hvaWNlcy5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCIkIiwiXyIsInBhdGgiLCJtb21lbnQiLCJBcHAiLCJncmFkZU1hcCIsIlNlcnZlckdyaWQiLCJzZXR0aW5ncyIsIlNtYWxsTW9kYWwiLCJNb2RlbCIsIkVwb3h5IiwiZXh0ZW5kIiwiY29tcHV0ZWRzIiwiaXNMb2FkZWQiLCJoYXMiLCJib29rR3JhZGUiLCJjb2RlVG9IdW1hblZhbHVlIiwiZ2V0IiwiQ29sbGVjdGlvbiIsIlBhZ2VhYmxlQ29sbGVjdGlvbiIsIm1vZGVsIiwidXJsIiwidXJsUm9vdCIsInN0YXRlIiwicGFnZVNpemUiLCJtb2RlIiwicXVlcnlQYXJhbXMiLCJzb3J0S2V5IiwicGFyc2VTdGF0ZSIsInJlc3AiLCJ0b3RhbFJlY29yZHMiLCJ0b3RhbCIsInBhcnNlUmVjb3JkcyIsInJvd3MiLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJ0YWdOYW1lIiwiY2xhc3NOYW1lIiwidGVtcGxhdGUiLCJ1aSIsImZpbHRlckJhciIsImNvdW50ZXIiLCJ1cGxvYWRlciIsInBhZ2luZyIsImdyaWQiLCJldmVudHMiLCJvblJlbmRlciIsImNvbHVtbnMiLCJuYW1lIiwibGFiZWwiLCJjZWxsIiwiQm9vbGVhbkljb25DZWxsIiwiZWRpdGFibGUiLCJlbCIsImNvbGxlY3Rpb24iLCJjbGlja2FibGUiLCJlbGVtZW50IiwidGV4dEZpbHRlciIsInR5cGUiLCJkZWJvdW5jZSIsInNlcnZlciIsImxhbmd1YWdlRmlsdGVyIiwiY2F0ZWdvcmllcyIsIml0ZW1zIiwibGFuZ3VhZ2VMaXN0Iiwic3ViamVjdEZpbHRlciIsImtleSIsInZhbHVlIiwiZmV0Y2giLCJpbmZpbml0ZSIsImdyYWRlRmlsdGVyIiwibWFwIiwiZ3JhZGVMaXN0IiwidmFsIiwicmVkdWNlIiwic29ydCIsImEiLCJiIiwibGV4aWNhbCIsInRvVXBwZXJDYXNlIiwibG9jYWxlQ29tcGFyZSIsInN1bSIsIm51bSIsInB1c2giLCJ5ZWFyRmlsdGVyIiwicmFuZ2UiLCJ5ZWFyIiwiZm9ybWF0RmlsdGVyIiwibXBkZiIsIm1wdWIiLCJwdWJGaWx0ZXIiLCJmaWx0ZXJMaXN0IiwicHJlcGVuZCIsImZpbHRlciIsImZpbHRlckNvbnRhaW5lciIsImZpbHRlcnMiLCJkZWZhdWx0RmlsdGVycyIsInJlbmRlciIsInVwbG9hZENob2ljZXMiLCJtb2RhbCIsInRpdGxlIiwiYm9keSIsInBlcnNpc3QiLCJvbiIsImZpbGVzIiwibGVuZ3RoIiwic2hvd0Vycm9yIiwiZXh0bmFtZSIsInRvTG93ZXJDYXNlIiwicmVhZGVyIiwiRmlsZVJlYWRlciIsImFkZEV2ZW50TGlzdGVuZXIiLCJKU09OIiwicGFyc2UiLCJldnQiLCJ0YXJnZXQiLCJyZXN1bHQiLCJzYXZlIiwibWV0aG9kIiwic3VjY2VzcyIsImFsZXJ0IiwiZGVzdHJveSIsImVycm9yIiwibW9kZWwyIiwieGhyIiwicGFyc2VSZXNwb25zZSIsImRldGFpbCIsInJlYWRBc1RleHQiLCJzaG93Il0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1FLElBQUlGLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUcsT0FBT0gsUUFBUSxNQUFSLENBQWI7QUFDQSxJQUFNSSxTQUFTSixRQUFRLFFBQVIsQ0FBZjs7QUFFQSxJQUFNSyxNQUFNTCxRQUFRLGFBQVIsQ0FBWjs7QUFFQSxJQUFNTSxXQUFXTixRQUFRLG9CQUFSLENBQWpCOztBQUVBLElBQU1PLGFBQWFQLFFBQVEsc0JBQVIsQ0FBbkI7QUFDQSxJQUFNUSxXQUFXUixRQUFRLGNBQVIsQ0FBakI7QUFDQSxJQUFNUyxhQUFhVCxRQUFRLHNCQUFSLENBQW5COztBQUVBLElBQU1VLFFBQVFYLFNBQVNZLEtBQVQsQ0FBZUQsS0FBZixDQUFxQkUsTUFBckIsQ0FBNEI7QUFDekNDLFlBQVc7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LGVBQU87QUFDdEMsUUFBTTdGLFFBQVEsSUFBSXRCLFNBQVNXLEtBQWIsQ0FBbUJ5RyxLQUFLQyxLQUFMLENBQVdDLElBQUlDLE1BQUosQ0FBV0MsTUFBdEIsQ0FBbkIsQ0FBZDtBQUNBbEcsVUFBTW1HLElBQU4sQ0FBVyxFQUFYLEVBQWU7QUFDZGxHLFVBQUtkLFNBQVNlLE9BQVQsR0FBbUIsdUNBRFY7QUFFZGtHLGFBQVEsTUFGTTtBQUdkQyxjQUFTLG1CQUFNO0FBQUVDLFlBQU0sU0FBTixFQUFrQnJCLE1BQU1zQixPQUFOO0FBQWtCLE1BSHZDO0FBSWRDLFlBQU8sZUFBQ0MsTUFBRCxFQUFTQyxHQUFULEVBQWlCO0FBQUV6QixZQUFNTyxTQUFOLENBQWdCeEcsSUFBSTJILGFBQUosQ0FBa0JELEdBQWxCLEVBQXVCRSxNQUF2QztBQUFpRDtBQUo3RCxLQUFmO0FBTUEsSUFSRDtBQVNBakIsVUFBT2tCLFVBQVAsQ0FBa0JqSSxFQUFFLE9BQUYsRUFBV3FHLE1BQU05QyxFQUFqQixFQUFxQnRDLEdBQXJCLENBQXlCLENBQXpCLEVBQTRCeUYsS0FBNUIsQ0FBa0MsQ0FBbEMsQ0FBbEI7QUFDQSxHQWpCRDs7QUFtQkFMLFFBQU02QixJQUFOO0FBQ0E7QUFsSytDLENBQWhDLENBQWpCIiwiZmlsZSI6ImJvb2stY2hvaWNlcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuY29uc3QgbW9tZW50ID0gcmVxdWlyZShcIm1vbWVudFwiKTtcblxuY29uc3QgQXBwID0gcmVxdWlyZShcIi4uLy4uL2luZGV4XCIpO1xuXG5jb25zdCBncmFkZU1hcCA9IHJlcXVpcmUoXCIuLi8uLi9saWIvZ3JhZGVNYXBcIik7XG5cbmNvbnN0IFNlcnZlckdyaWQgPSByZXF1aXJlKFwiLi4vLi4vbGliL3NlcnZlckdyaWRcIik7XG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5jb25zdCBTbWFsbE1vZGFsID0gcmVxdWlyZShcIi4uLy4uL2xpYi9zbWFsbE1vZGFsXCIpO1xuXG5jb25zdCBNb2RlbCA9IEJhY2tib25lLkVwb3h5Lk1vZGVsLmV4dGVuZCh7XG5cdGNvbXB1dGVkczoge1xuXHRcdGlzTG9hZGVkOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLmhhcyhcIl9pZFwiKTtcblx0XHR9LFxuXHRcdGJvb2tHcmFkZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gZ3JhZGVNYXAuY29kZVRvSHVtYW5WYWx1ZSh0aGlzLmdldChcImdyYWRlXCIpKTtcblx0XHR9LFxuXHR9LFxufSk7XG5cbmNvbnN0IENvbGxlY3Rpb24gPSBCYWNrYm9uZS5QYWdlYWJsZUNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IE1vZGVsLFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2VwdWJzL2Nob2ljZXM/cGFnZWQ9dHJ1ZVwiO1xuXHR9LFxuXG5cdHN0YXRlOiB7XG5cdFx0cGFnZVNpemU6IDMwLFxuXHR9LFxuXHRtb2RlOiBcInNlcnZlclwiLFxuXG5cdHF1ZXJ5UGFyYW1zOiB7XG5cdFx0cGFnZVNpemU6IFwicGFnZVNpemVcIixcblx0XHRzb3J0S2V5OiBcInNvcnRCeVwiLFxuXHR9LFxuXG5cdHBhcnNlU3RhdGU6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRyZXR1cm4geyB0b3RhbFJlY29yZHM6IHJlc3AudG90YWwgfTtcblx0fSxcblxuXHRwYXJzZVJlY29yZHM6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRyZXR1cm4gcmVzcC5yb3dzO1xuXHR9LFxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6IFwiZGl2XCIsXG5cdGNsYXNzTmFtZTogXCJjb250ZW50IGJvb2stY2hvaWNlc1wiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2Jvb2stY2hvaWNlcy5udW5qXCIpLFxuXG5cdHVpOiB7XG5cdFx0ZmlsdGVyQmFyOiBcIi5vcHMtYmFyIC5maWx0ZXJzXCIsXG5cdFx0Y291bnRlcjogXCIub3BzLWJhciAuY291bnRlclwiLFxuXHRcdHVwbG9hZGVyOiBcIi51cGxvYWRcIixcblx0XHRwYWdpbmc6IFwiLnBhZ2luZ1wiLFxuXHRcdGdyaWQ6IFwiZGl2LmdyaWRcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5kb3dubG9hZFwiOiBcInNob3dEb3dubG9hZHNcIixcblx0XHRcImNsaWNrIEB1aS51cGxvYWRlclwiOiBcInVwbG9hZENob2ljZXNcIixcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgY29sdW1ucyA9IFtcblx0XHRcdHsgbmFtZTogXCJpc0xvYWRlZFwiLCBsYWJlbDogXCJCb29rIFVwbG9hZGVkP1wiLCBjZWxsOiBTZXJ2ZXJHcmlkLkJvb2xlYW5JY29uQ2VsbC5leHRlbmQoe30pLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJ1bml2ZXJzYWxfaWRcIiwgbGFiZWw6IFwiQm9vayBJRFwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJ0aXRsZVwiLCBsYWJlbDogXCJCb29rIE5hbWVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwic3ViamVjdFwiLCBsYWJlbDogXCJTdWJqZWN0XCIsIGVkaXRhYmxlOiBmYWxzZSwgY2VsbDogXCJzdHJpbmdcIiB9LFxuXHRcdFx0eyBuYW1lOiBcImJvb2tHcmFkZVwiLCBsYWJlbDogXCJHcmFkZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJsYW5ndWFnZVwiLCBsYWJlbDogXCJMYW5ndWFnZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJpc2JuXCIsIGxhYmVsOiBcIklTQk5cIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwicHVibGlzaGVyXCIsIGxhYmVsOiBcIlB1Ymxpc2hlclwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJ5ZWFyc1wiLCBsYWJlbDogXCJDaG9zZW4gWWVhcnNcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XTtcblxuXHRcdGNvbnN0IGdyaWQgPSBuZXcgU2VydmVyR3JpZCh7XG5cdFx0XHRlbDogdGhpcy51aS5ncmlkLFxuXHRcdFx0Y29sdW1uczogY29sdW1ucyxcblx0XHRcdGNvbGxlY3Rpb246IG5ldyBDb2xsZWN0aW9uKCksXG5cdFx0XHRjbGlja2FibGU6IGZhbHNlLFxuXHRcdFx0Y291bnRlcjoge1xuXHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLmNvdW50ZXIsXG5cdFx0XHRcdHRlbXBsYXRlOiBcIkNob2ljZXMgJHN0YXJ0IC0gJGVuZCBvZiAkdG90YWxcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5wYWdpbmcsXG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0Y29uc3QgdGV4dEZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwidGV4dFwiLFxuXHRcdFx0bmFtZTogXCJ0ZXh0RmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJUZXh0IFNlYXJjaFwiLFxuXHRcdFx0ZGVib3VuY2U6IDIwMCxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgbGFuZ3VhZ2VGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcImxhbmd1YWdlRmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJMYW5ndWFnZVwiLFxuXHRcdFx0Y2F0ZWdvcmllczogW1xuXHRcdFx0XHR7IGl0ZW1zOiBzZXR0aW5ncy5sYW5ndWFnZUxpc3QgfSxcblx0XHRcdF0sXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdGNvbnN0IHN1YmplY3RGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcInN1YmplY3RGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlN1YmplY3RcIixcblx0XHRcdHNlcnZlcjoge1xuXHRcdFx0XHRrZXk6IFwic3ViamVjdF9pZFwiLFxuXHRcdFx0XHR2YWx1ZTogXCJzdWJqZWN0XCIsXG5cdFx0XHRcdGZldGNoOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9kYXRhL3N1YmplY3RzXCIsXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdHBhZ2VTaXplOiAzMCxcblx0XHRcdFx0aW5maW5pdGU6IHRydWUsXG5cdFx0XHR9LFxuXHRcdH07XG5cblx0XHRjb25zdCBncmFkZUZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiaXRlbWl6ZWRcIixcblx0XHRcdG5hbWU6IFwiZ3JhZGVGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlllYXIgb2YgU3R1ZHlcIixcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHRcdGNhdGVnb3JpZXM6IF8ubWFwKHNldHRpbmdzLmdyYWRlTGlzdCwgKHZhbCwga2V5KSA9PiAoe1xuXHRcdFx0XHRsYWJlbDoga2V5LFxuXHRcdFx0XHRpdGVtczogXy5yZWR1Y2UodmFsLnNvcnQoKGEsIGIpID0+IChcImxleGljYWxcIiBpbiBhID8gYS5sZXhpY2FsIDogYS5uYW1lKS50b1VwcGVyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoKFwibGV4aWNhbFwiIGluIGIgPyBiLmxleGljYWwgOiBiLm5hbWUpLnRvVXBwZXJDYXNlKCkpKSxcblx0XHRcdFx0XHQoc3VtLCBudW0pID0+IHsgc3VtLnB1c2goeyBuYW1lOiBudW0udmFsdWUsIGxhYmVsOiBudW0ubmFtZSB9KTsgcmV0dXJuIHN1bTsgfSwgW10pLFxuXHRcdFx0fSkpLFxuXHRcdH07XG5cblx0XHRjb25zdCB5ZWFyRmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJ5ZWFyRmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJDaG9zZW4gWWVhclwiLFxuXHRcdFx0Y2F0ZWdvcmllczogW1xuXHRcdFx0XHR7IGl0ZW1zOiBfLnJhbmdlKDIwMTQsIG1vbWVudCgpLnllYXIoKSArIDIpIH0sXG5cdFx0XHRdLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdH07XG5cblx0XHRjb25zdCBmb3JtYXRGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcImZvcm1hdEZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiRm9ybWF0XCIsXG5cdFx0XHRjYXRlZ29yaWVzOiBbXG5cdFx0XHRcdHsgaXRlbXM6IHsgbXBkZjogXCJQREZcIiwgbXB1YjogXCJFUFVCXCIgfSB9LFxuXHRcdFx0XSxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgcHViRmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJwdWJGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlB1Ymxpc2hlclwiLFxuXHRcdFx0c2VydmVyOiB7XG5cdFx0XHRcdGtleTogXCJwdWJsaXNoZXJfaWRcIixcblx0XHRcdFx0dmFsdWU6IFwiZnVsbG5hbWVcIixcblx0XHRcdFx0ZmV0Y2g6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2RhdGEvcHVibGlzaGVycz9kdW1teT1mYWxzZVwiLFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRwYWdlU2l6ZTogMzAsXG5cdFx0XHRcdGluZmluaXRlOiB0cnVlLFxuXHRcdFx0fSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgZmlsdGVyTGlzdCA9IFt0ZXh0RmlsdGVyLCBsYW5ndWFnZUZpbHRlciwgc3ViamVjdEZpbHRlciwgZ3JhZGVGaWx0ZXIsIHllYXJGaWx0ZXIsIGZvcm1hdEZpbHRlciwgcHViRmlsdGVyXTtcblxuXHRcdHRoaXMudWkuZmlsdGVyQmFyLnByZXBlbmQoZ3JpZC5maWx0ZXIoe1xuXHRcdFx0ZmlsdGVyQ29udGFpbmVyOiB0aGlzLnVpLmZpbHRlckJhcixcblx0XHRcdGZpbHRlcnM6IGZpbHRlckxpc3QsXG5cdFx0XHRkZWZhdWx0RmlsdGVyczogW1widGV4dEZpbHRlclwiXSxcblx0XHR9KS5yZW5kZXIoKS5lbCk7XG5cdH0sXG5cblx0dXBsb2FkQ2hvaWNlczogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgbW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmFsIGZhLWNsb3VkLXVwbG9hZCcvPiBVcGxvYWQgQ2hvaWNlcyBNYW51YWxseVwiLFxuXHRcdFx0Ym9keTogXCI8cD5Zb3UgY2FuIHVwbG9hZCBib29rIGNob2ljZXMgbWFudWFsbHkuIFByb3ZpZGUgdGhlIEpTT04gZmlsZSBiZWxvdzo8L3A+PHA+PGlucHV0IHR5cGU9J2ZpbGUnLz48L3A+XCIsXG5cdFx0XHRwZXJzaXN0OiB0cnVlLFxuXHRcdH0pO1xuXG5cdFx0bW9kYWwub24oXCJidXR0b246b2tcIiwgKCkgPT4ge1xuXHRcdFx0aWYgKCQoXCJpbnB1dFwiLCBtb2RhbC5lbCkuZ2V0KDApLmZpbGVzLmxlbmd0aCA9PT0gMClcblx0XHRcdFx0cmV0dXJuIG1vZGFsLnNob3dFcnJvcihcIk5vIGZpbGUgcHJvdmlkZWRcIik7XG5cdFx0XHRpZiAocGF0aC5leHRuYW1lKCQoXCJpbnB1dFwiLCBtb2RhbC5lbCkuZ2V0KDApLmZpbGVzWzBdLm5hbWUpLnRvTG93ZXJDYXNlKCkgIT09IFwiLmpzb25cIilcblx0XHRcdFx0cmV0dXJuIG1vZGFsLnNob3dFcnJvcihcIk9ubHkgSlNPTiBmaWxlcyBhbGxvd2VkXCIpO1xuXG5cdFx0XHRjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuXHRcdFx0cmVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsIGV2dCA9PiB7XG5cdFx0XHRcdGNvbnN0IG1vZGVsID0gbmV3IEJhY2tib25lLk1vZGVsKEpTT04ucGFyc2UoZXZ0LnRhcmdldC5yZXN1bHQpKTtcblx0XHRcdFx0bW9kZWwuc2F2ZSh7fSwge1xuXHRcdFx0XHRcdHVybDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvZW1wYXRoeS9ib29rcy9jaG9pY2VzL21hbnVhbFwiLFxuXHRcdFx0XHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0XHRcdFx0c3VjY2VzczogKCkgPT4geyBhbGVydChcIlN1Y2Nlc3NcIik7IG1vZGFsLmRlc3Ryb3koKTsgfSxcblx0XHRcdFx0XHRlcnJvcjogKG1vZGVsMiwgeGhyKSA9PiB7IG1vZGFsLnNob3dFcnJvcihBcHAucGFyc2VSZXNwb25zZSh4aHIpLmRldGFpbCk7IH0sXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0XHRyZWFkZXIucmVhZEFzVGV4dCgkKFwiaW5wdXRcIiwgbW9kYWwuZWwpLmdldCgwKS5maWxlc1swXSk7XG5cdFx0fSk7XG5cblx0XHRtb2RhbC5zaG93KCk7XG5cdH0sXG59KTtcbiJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar settings = require(\"app-settings\");\nvar moment = require(\"moment\");\nvar pikaday = require(\"pikaday\");\nvar rester = require(\"rester\");\n\nvar App = require(\"../../index\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar Features = Backbone.Model.extend({\n\tdefaults: {},\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/features\";\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"content\",\n\n\tgetTemplate: function getTemplate() {\n\t\tif (!this.model) return require(\"../templates/features.nunj\").initial;\n\t\treturn require(\"../templates/features.nunj\").main;\n\t},\n\n\tui: {\n\t\tsaveButton: \"button.save\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.saveButton\": \"save\"\n\t},\n\n\tsave: function save(evt) {\n\t\tvar _this = this;\n\n\t\tevt.preventDefault();\n\t\tevt.stopPropagation();\n\n\t\t// Parse all the values\n\t\tvar data = {};\n\n\t\t$(\"input[type='checkbox']\", this.el).each(function (idx, e) {\n\t\t\tvar el = $(e);\n\t\t\tdata[el.attr(\"name\")] = el.prop(\"checked\");\n\t\t});\n\n\t\t$(\"input.string, input.number\", this.el).each(function (idx, e) {\n\t\t\tvar el = $(e);\n\t\t\tdata[el.attr(\"name\")] = el.val().replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\") || \"\";\n\t\t});\n\n\t\t$(\"textarea\", this.$el).each(function (idx, e) {\n\t\t\tvar el = $(e);\n\t\t\tdata[el.attr(\"name\")] = _.compact(el.val().replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").split(\"\\n\")) || [];\n\t\t});\n\n\t\t$(\"select\", this.$el).each(function (idx, e) {\n\t\t\tvar el = $(e);\n\t\t\tdata[el.attr(\"name\")] = el.val() || (el.prop(\"multiple\") ? [] : \"\");\n\t\t});\n\n\t\t_.each(this.model.get(\"features\"), function (val, key) {\n\t\t\tif (val.type === \"date\") {\n\t\t\t\tvar el = $(\"input[name='\" + key + \"']\", _this.el);\n\n\t\t\t\tdata[key] = el.val();\n\t\t\t}\n\n\t\t\tif (val.type === \"unixdate\") data[key] = _this.dates[key].getDate() ? Math.floor(_this.dates[key].getDate().getTime() / 1000) : \"\";\n\n\t\t\tif (val.type === \"timerange\") {\n\t\t\t\tvar el1 = $(\"input[name='\" + key + \"-1']\", _this.el);\n\t\t\t\tvar el2 = $(\"input[name='\" + key + \"-2']\", _this.el);\n\n\t\t\t\tvar time1 = el1.val();\n\t\t\t\tvar time2 = el2.val();\n\n\t\t\t\tvar time = \"\";\n\t\t\t\tif (time1 && time2) {\n\t\t\t\t\ttime1 = moment(time1, \"hh:mma\");\n\t\t\t\t\ttime2 = moment(time2, \"hh:mma\");\n\t\t\t\t\tif (time1.isValid() && time2.isValid()) {\n\t\t\t\t\t\tif (time1.isBefore(time2)) time = time1.format(\"HHmm\") + \"-\" + time2.format(\"HHmm\");\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tdata[key] = time;\n\t\t\t}\n\t\t});\n\n\t\tthis.model.save({ update: data }, { success: this.saveSuccess.bind(this), error: this.saveError.bind(this), wait: true });\n\t\tthis.ui.saveButton.attr(\"disabled\", true);\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\thasFeatureAccess: function hasFeatureAccess(subkey, key) {\n\t\t\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\t\t\t\tvar p = rester.p.featureControl;\n\t\t\t\tif (subkey) p = p[subkey.slice(0, -1)];\n\t\t\t\treturn rester.hasAccess(p[key], user);\n\t\t\t}\n\t\t};\n\t},\n\n\tsaveSuccess: function saveSuccess() {\n\t\tif (this.ui.saveButton.attr) {\n\t\t\twindow.scrollTo(0, 0);\n\t\t\tthis.ui.saveButton.attr(\"disabled\", false);\n\n\t\t\tradio.trigger(App.Events.Commands.Toast, { content: \"Features updated. Reload page to see changes.\" });\n\t\t}\n\t},\n\n\tsaveError: function saveError(model, xhr) {\n\t\tif (this.ui.saveButton.attr) {\n\t\t\tthis.ui.saveButton.attr(\"disabled\", false);\n\t\t\tvar answer = App.parseResponse(xhr);\n\t\t\twindow.alert(answer.detail || answer.info);\n\t\t}\n\t},\n\n\tonAttach: function onAttach() {\n\t\tthis.model = new Features();\n\t\tthis.model.fetch({ success: this.fetchSuccess.bind(this), error: this.fetchError.bind(this) });\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.dates = {};\n\t\tvar dates = this.dates;\n\n\t\t$(\".date\", this.el).each(function (item, el) {\n\t\t\tvar val = moment($(el).data(\"value\"), \"DD MMM YYYY\");\n\t\t\tif (val.unix() === 0) val = \"\";\n\n\t\t\t// eslint-disable-next-line new-cap, no-new\n\t\t\tnew pikaday({\n\t\t\t\tfield: el,\n\t\t\t\tformat: \"DD MMM YYYY\",\n\t\t\t\tdefaultDate: val ? val.toDate() : undefined,\n\t\t\t\tsetDefaultDate: Boolean(val)\n\t\t\t});\n\t\t});\n\n\t\t$(\".time\", this.el).each(function (item, el) {\n\t\t\tvar val = _.trim($(el).data(\"value\"));\n\n\t\t\tif (val) {\n\t\t\t\tval = moment(val, \"HHmm\");\n\t\t\t\tif (val.isValid()) val = val.format(\"hh:mma\");else val = \"\";\n\t\t\t}\n\n\t\t\t$(el).val(val).timePicker();\n\t\t});\n\n\t\t$(\".unixdate\", this.el).each(function (item, el) {\n\t\t\tvar val = moment.unix($(el).data(\"value\"));\n\t\t\tif (val.unix() === 0) {\n\t\t\t\tval = \"\";\n\t\t\t\t$(el).val(\"\");\n\t\t\t} else {\n\t\t\t\t$(el).val(val.format(\"DD MMM YYYY\"));\n\t\t\t}\n\n\t\t\t// eslint-disable-next-line new-cap, no-new\n\t\t\tdates[$(el).attr(\"name\")] = new pikaday({\n\t\t\t\tfield: el,\n\t\t\t\tformat: \"DD MMM YYYY\",\n\t\t\t\tdefaultDate: val ? val.toDate() : undefined,\n\t\t\t\tsetDefaultDate: true\n\t\t\t});\n\t\t});\n\t},\n\n\tfetchSuccess: function fetchSuccess() {\n\t\tthis.render();\n\t},\n\n\tfetchError: function fetchError(model, xhr) {\n\t\tvar answer = App.parseResponse(xhr);\n\t\talert(answer.detail || answer.info);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZlYXR1cmVzLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIiQiLCJfIiwic2V0dGluZ3MiLCJtb21lbnQiLCJwaWthZGF5IiwicmVzdGVyIiwiQXBwIiwicmFkaW8iLCJSYWRpbyIsImNoYW5uZWwiLCJGZWF0dXJlcyIsIk1vZGVsIiwiZXh0ZW5kIiwiZGVmYXVsdHMiLCJ1cmwiLCJ1cmxSb290IiwibW9kdWxlIiwiZXhwb3J0cyIsIk1hcmlvbmV0dGUiLCJWaWV3IiwidGFnTmFtZSIsImNsYXNzTmFtZSIsImdldFRlbXBsYXRlIiwibW9kZWwiLCJpbml0aWFsIiwibWFpbiIsInVpIiwic2F2ZUJ1dHRvbiIsImV2ZW50cyIsInNhdmUiLCJldnQiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsImRhdGEiLCJlbCIsImVhY2giLCJpZHgiLCJlIiwiYXR0ciIsInByb3AiLCJ2YWwiLCJyZXBsYWNlIiwiJGVsIiwiY29tcGFjdCIsInNwbGl0IiwiZ2V0Iiwia2V5IiwidHlwZSIsImRhdGVzIiwiZ2V0RGF0ZSIsIk1hdGgiLCJmbG9vciIsImdldFRpbWUiLCJlbDEiLCJlbDIiLCJ0aW1lMSIsInRpbWUyIiwidGltZSIsImlzVmFsaWQiLCJpc0JlZm9yZSIsImZvcm1hdCIsInVwZGF0ZSIsInN1Y2Nlc3MiLCJzYXZlU3VjY2VzcyIsImJpbmQiLCJlcnJvciIsInNhdmVFcnJvciIsIndhaXQiLCJ0ZW1wbGF0ZUNvbnRleHQiLCJoYXNGZWF0dXJlQWNjZXNzIiwic3Via2V5IiwidXNlciIsInJlcXVlc3QiLCJFdmVudHMiLCJSZXF1ZXN0cyIsIkN1cnJlbnRVc2VyIiwicCIsImZlYXR1cmVDb250cm9sIiwic2xpY2UiLCJoYXNBY2Nlc3MiLCJ3aW5kb3ciLCJzY3JvbGxUbyIsInRyaWdnZXIiLCJDb21tYW5kcyIsIlRvYXN0IiwiY29udGVudCIsInhociIsImFuc3dlciIsInBhcnNlUmVzcG9uc2UiLCJhbGVydCIsImRldGFpbCIsImluZm8iLCJvbkF0dGFjaCIsImZldGNoIiwiZmV0Y2hTdWNjZXNzIiwiZmV0Y2hFcnJvciIsIm9uUmVuZGVyIiwiaXRlbSIsInVuaXgiLCJmaWVsZCIsImRlZmF1bHREYXRlIiwidG9EYXRlIiwidW5kZWZpbmVkIiwic2V0RGVmYXVsdERhdGUiLCJCb29sZWFuIiwidHJpbSIsInRpbWVQaWNrZXIiLCJyZW5kZXIiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1DLElBQUlELFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUUsSUFBSUYsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNRyxXQUFXSCxRQUFRLGNBQVIsQ0FBakI7QUFDQSxJQUFNSSxTQUFTSixRQUFRLFFBQVIsQ0FBZjtBQUNBLElBQU1LLFVBQVVMLFFBQVEsU0FBUixDQUFoQjtBQUNBLElBQU1NLFNBQVNOLFFBQVEsUUFBUixDQUFmOztBQUVBLElBQU1PLE1BQU1QLFFBQVEsYUFBUixDQUFaOztBQUVBLElBQU1RLFFBQVFULFNBQVNVLEtBQVQsQ0FBZUMsT0FBZixDQUF1QixRQUF2QixDQUFkOztBQUVBLElBQU1DLFdBQVdaLFNBQVNhLEtBQVQsQ0FBZUMsTUFBZixDQUFzQjtBQUN0Q0MsV0FBVSxFQUQ0QjtBQUV0Q0MsTUFBSyxlQUFXO0FBQ2YsU0FBT1osU0FBU2EsT0FBVCxHQUFtQixtQkFBMUI7QUFDQTtBQUpxQyxDQUF0QixDQUFqQjs7QUFPQUMsT0FBT0MsT0FBUCxHQUFpQm5CLFNBQVNvQixVQUFULENBQW9CQyxJQUFwQixDQUF5QlAsTUFBekIsQ0FBZ0M7QUFDaERRLFVBQVMsS0FEdUM7QUFFaERDLFlBQVcsU0FGcUM7O0FBSWhEQyxjQUFhLHVCQUFXO0FBQ3ZCLE1BQUksQ0FBQyxLQUFLQyxLQUFWLEVBQ0MsT0FBT3hCLFFBQVEsNEJBQVIsRUFBc0N5QixPQUE3QztBQUNELFNBQU96QixRQUFRLDRCQUFSLEVBQXNDMEIsSUFBN0M7QUFDQSxFQVIrQzs7QUFVaERDLEtB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QUFOLENBQVVBLEdBQVYsRUFBZWtFLFVBQWY7QUFDQSxHQVpEOztBQWNBMUcsSUFBRSxXQUFGLEVBQWUsS0FBS2tDLEVBQXBCLEVBQXdCQyxJQUF4QixDQUE2QixVQUFDOEQsSUFBRCxFQUFPL0QsRUFBUCxFQUFjO0FBQzFDLE9BQUlNLE1BQU1yQyxPQUFPK0YsSUFBUCxDQUFZbEcsRUFBRWtDLEVBQUYsRUFBTUQsSUFBTixDQUFXLE9BQVgsQ0FBWixDQUFWO0FBQ0EsT0FBSU8sSUFBSTBELElBQUosT0FBZSxDQUFuQixFQUFzQjtBQUNyQjFELFVBQU0sRUFBTjtBQUNBeEMsTUFBRWtDLEVBQUYsRUFBTU0sR0FBTixDQUFVLEVBQVY7QUFDQSxJQUhELE1BSUs7QUFDSnhDLE1BQUVrQyxFQUFGLEVBQU1NLEdBQU4sQ0FBVUEsSUFBSW9CLE1BQUosQ0FBVyxhQUFYLENBQVY7QUFDQTs7QUFFRDtBQUNBWixTQUFNaEQsRUFBRWtDLEVBQUYsRUFBTUksSUFBTixDQUFXLE1BQVgsQ0FBTixJQUE0QixJQUFJbEMsT0FBSixDQUFZO0FBQ3ZDK0YsV0FBT2pFLEVBRGdDO0FBRXZDMEIsWUFBUSxhQUYrQjtBQUd2Q3dDLGlCQUFhNUQsTUFBTUEsSUFBSTZELE1BQUosRUFBTixHQUFxQkMsU0FISztBQUl2Q0Msb0JBQWdCO0FBSnVCLElBQVosQ0FBNUI7QUFNQSxHQWpCRDtBQWtCQSxFQXBLK0M7O0FBc0toRFQsZUFBYyx3QkFBVztBQUN4QixPQUFLYSxNQUFMO0FBQ0EsRUF4SytDOztBQTBLaERaLGFBQVksb0JBQVN4RSxLQUFULEVBQWdCK0QsR0FBaEIsRUFBcUI7QUFDaEMsTUFBTUMsU0FBU2pGLElBQUlrRixhQUFKLENBQWtCRixHQUFsQixDQUFmO0FBQ0FHLFFBQU1GLE9BQU9HLE1BQVAsSUFBaUJILE9BQU9JLElBQTlCO0FBQ0E7QUE3SytDLENBQWhDLENBQWpCIiwiZmlsZSI6ImZlYXR1cmVzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5jb25zdCBtb21lbnQgPSByZXF1aXJlKFwibW9tZW50XCIpO1xuY29uc3QgcGlrYWRheSA9IHJlcXVpcmUoXCJwaWthZGF5XCIpO1xuY29uc3QgcmVzdGVyID0gcmVxdWlyZShcInJlc3RlclwiKTtcblxuY29uc3QgQXBwID0gcmVxdWlyZShcIi4uLy4uL2luZGV4XCIpO1xuXG5jb25zdCByYWRpbyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJnbG9iYWxcIik7XG5cbmNvbnN0IEZlYXR1cmVzID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHt9LFxuXHR1cmw6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9mZWF0dXJlc1wiO1xuXHR9LFxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6IFwiZGl2XCIsXG5cdGNsYXNzTmFtZTogXCJjb250ZW50XCIsXG5cblx0Z2V0VGVtcGxhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghdGhpcy5tb2RlbClcblx0XHRcdHJldHVybiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2ZlYXR1cmVzLm51bmpcIikuaW5pdGlhbDtcblx0XHRyZXR1cm4gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9mZWF0dXJlcy5udW5qXCIpLm1haW47XG5cdH0sXG5cblx0dWk6IHtcblx0XHRzYXZlQnV0dG9uOiBcImJ1dHRvbi5zYXZlXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkuc2F2ZUJ1dHRvblwiOiBcInNhdmVcIixcblx0fSxcblxuXHRzYXZlOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQucHJldmVudERlZmF1bHQoKTtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHQvLyBQYXJzZSBhbGwgdGhlIHZhbHVlc1xuXHRcdGNvbnN0IGRhdGEgPSB7fTtcblxuXHRcdCQoXCJpbnB1dFt0eXBlPSdjaGVja2JveCddXCIsIHRoaXMuZWwpLmVhY2goKGlkeCwgZSkgPT4ge1xuXHRcdFx0Y29uc3QgZWwgPSAkKGUpO1xuXHRcdFx0ZGF0YVtlbC5hdHRyKFwibmFtZVwiKV0gPSBlbC5wcm9wKFwiY2hlY2tlZFwiKTtcblx0XHR9KTtcblxuXHRcdCQoXCJpbnB1dC5zdHJpbmcsIGlucHV0Lm51bWJlclwiLCB0aGlzLmVsKS5lYWNoKChpZHgsIGUpID0+IHtcblx0XHRcdGNvbnN0IGVsID0gJChlKTtcblx0XHRcdGRhdGFbZWwuYXR0cihcIm5hbWVcIildID0gZWwudmFsKCkucmVwbGFjZSgvPC9nLCBcIiZsdDtcIikucmVwbGFjZSgvPi9nLCBcIiZndDtcIikgfHwgXCJcIjtcblx0XHR9KTtcblxuXHRcdCQoXCJ0ZXh0YXJlYVwiLCB0aGlzLiRlbCkuZWFjaCgoaWR4LCBlKSA9PiB7XG5cdFx0XHRjb25zdCBlbCA9ICQoZSk7XG5cdFx0XHRkYXRhW2VsLmF0dHIoXCJuYW1lXCIpXSA9IF8uY29tcGFjdChlbC52YWwoKS5yZXBsYWNlKC88L2csIFwiJmx0O1wiKS5yZXBsYWNlKC8+L2csIFwiJmd0O1wiKS5zcGxpdChcIlxcblwiKSkgfHwgW107XG5cdFx0fSk7XG5cblx0XHQkKFwic2VsZWN0XCIsIHRoaXMuJGVsKS5lYWNoKChpZHgsIGUpID0+IHtcblx0XHRcdGNvbnN0IGVsID0gJChlKTtcblx0XHRcdGRhdGFbZWwuYXR0cihcIm5hbWVcIildID0gZWwudmFsKCkgfHwgKGVsLnByb3AoXCJtdWx0aXBsZVwiKSA/IFtdIDogXCJcIik7XG5cdFx0fSk7XG5cblx0XHRfLmVhY2godGhpcy5tb2RlbC5nZXQoXCJmZWF0dXJlc1wiKSwgKHZhbCwga2V5KSA9PiB7XG5cdFx0XHRpZiAodmFsLnR5cGUgPT09IFwiZGF0ZVwiKSB7XG5cdFx0XHRcdGNvbnN0IGVsID0gJChcImlucHV0W25hbWU9J1wiICsga2V5ICsgXCInXVwiLCB0aGlzLmVsKTtcblxuXHRcdFx0XHRkYXRhW2tleV0gPSBlbC52YWwoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHZhbC50eXBlID09PSBcInVuaXhkYXRlXCIpXG5cdFx0XHRcdGRhdGFba2V5XSA9IHRoaXMuZGF0ZXNba2V5XS5nZXREYXRlKCkgPyBNYXRoLmZsb29yKHRoaXMuZGF0ZXNba2V5XS5nZXREYXRlKCkuZ2V0VGltZSgpIC8gMTAwMCkgOiBcIlwiO1xuXG5cdFx0XHRpZiAodmFsLnR5cGUgPT09IFwidGltZXJhbmdlXCIpIHtcblx0XHRcdFx0Y29uc3QgZWwxID0gJChcImlucHV0W25hbWU9J1wiICsga2V5ICsgXCItMSddXCIsIHRoaXMuZWwpO1xuXHRcdFx0XHRjb25zdCBlbDIgPSAkKFwiaW5wdXRbbmFtZT0nXCIgKyBrZXkgKyBcIi0yJ11cIiwgdGhpcy5lbCk7XG5cblx0XHRcdFx0bGV0IHRpbWUxID0gZWwxLnZhbCgpO1xuXHRcdFx0XHRsZXQgdGltZTIgPSBlbDIudmFsKCk7XG5cblx0XHRcdFx0bGV0IHRpbWUgPSBcIlwiO1xuXHRcdFx0XHRpZiAodGltZTEgJiYgdGltZTIpIHtcblx0XHRcdFx0XHR0aW1lMSA9IG1vbWVudCh0aW1lMSwgXCJoaDptbWFcIik7XG5cdFx0XHRcdFx0dGltZTIgPSBtb21lbnQodGltZTIsIFwiaGg6bW1hXCIpO1xuXHRcdFx0XHRcdGlmICh0aW1lMS5pc1ZhbGlkKCkgJiYgdGltZTIuaXNWYWxpZCgpKSB7XG5cdFx0XHRcdFx0XHRpZiAodGltZTEuaXNCZWZvcmUodGltZTIpKVxuXHRcdFx0XHRcdFx0XHR0aW1lID0gdGltZTEuZm9ybWF0KFwiSEhtbVwiKSArIFwiLVwiICsgdGltZTIuZm9ybWF0KFwiSEhtbVwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkYXRhW2tleV0gPSB0aW1lO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0dGhpcy5tb2RlbC5zYXZlKHsgdXBkYXRlOiBkYXRhIH0sIHsgc3VjY2VzczogdGhpcy5zYXZlU3VjY2Vzcy5iaW5kKHRoaXMpLCBlcnJvcjogdGhpcy5zYXZlRXJyb3IuYmluZCh0aGlzKSwgd2FpdDogdHJ1ZSB9KTtcblx0XHR0aGlzLnVpLnNhdmVCdXR0b24uYXR0cihcImRpc2FibGVkXCIsIHRydWUpO1xuXHR9LFxuXG5cdHRlbXBsYXRlQ29udGV4dDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGhhc0ZlYXR1cmVBY2Nlc3M6IChzdWJrZXksIGtleSkgPT4ge1xuXHRcdFx0XHRjb25zdCB1c2VyID0gcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblx0XHRcdFx0bGV0IHAgPSByZXN0ZXIucC5mZWF0dXJlQ29udHJvbDtcblx0XHRcdFx0aWYgKHN1YmtleSlcblx0XHRcdFx0XHRwID0gcFtzdWJrZXkuc2xpY2UoMCwgLTEpXTtcblx0XHRcdFx0cmV0dXJuIHJlc3Rlci5oYXNBY2Nlc3MocFtrZXldLCB1c2VyKTtcblx0XHRcdH0sXG5cdFx0fTtcblx0fSxcblxuXHRzYXZlU3VjY2VzczogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMudWkuc2F2ZUJ1dHRvbi5hdHRyKSB7XG5cdFx0XHR3aW5kb3cuc2Nyb2xsVG8oMCwgMCk7XG5cdFx0XHR0aGlzLnVpLnNhdmVCdXR0b24uYXR0cihcImRpc2FibGVkXCIsIGZhbHNlKTtcblxuXHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7IGNvbnRlbnQ6IFwiRmVhdHVyZXMgdXBkYXRlZC4gUmVsb2FkIHBhZ2UgdG8gc2VlIGNoYW5nZXMuXCIgfSk7XG5cdFx0fVxuXHR9LFxuXG5cdHNhdmVFcnJvcjogZnVuY3Rpb24obW9kZWwsIHhocikge1xuXHRcdGlmICh0aGlzLnVpLnNhdmVCdXR0b24uYXR0cikge1xuXHRcdFx0dGhpcy51aS5zYXZlQnV0dG9uLmF0dHIoXCJkaXNhYmxlZFwiLCBmYWxzZSk7XG5cdFx0XHRjb25zdCBhbnN3ZXIgPSBBcHAucGFyc2VSZXNwb25zZSh4aHIpO1xuXHRcdFx0d2luZG93LmFsZXJ0KGFuc3dlci5kZXRhaWwgfHwgYW5zd2VyLmluZm8pO1xuXHRcdH1cblx0fSxcblxuXHRvbkF0dGFjaDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5tb2RlbCA9IG5ldyBGZWF0dXJlcygpO1xuXHRcdHRoaXMubW9kZWwuZmV0Y2goeyBzdWNjZXNzOiB0aGlzLmZldGNoU3VjY2Vzcy5iaW5kKHRoaXMpLCBlcnJvcjogdGhpcy5mZXRjaEVycm9yLmJpbmQodGhpcykgfSk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZGF0ZXMgPSB7fTtcblx0XHRjb25zdCBkYXRlcyA9IHRoaXMuZGF0ZXM7XG5cblx0XHQkKFwiLmRhdGVcIiwgdGhpcy5lbCkuZWFjaCgoaXRlbSwgZWwpID0+IHtcblx0XHRcdGxldCB2YWwgPSBtb21lbnQoJChlbCkuZGF0YShcInZhbHVlXCIpLCBcIkREIE1NTSBZWVlZXCIpO1xuXHRcdFx0aWYgKHZhbC51bml4KCkgPT09IDApXG5cdFx0XHRcdHZhbCA9IFwiXCI7XG5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwLCBuby1uZXdcblx0XHRcdG5ldyBwaWthZGF5KHtcblx0XHRcdFx0ZmllbGQ6IGVsLFxuXHRcdFx0XHRmb3JtYXQ6IFwiREQgTU1NIFlZWVlcIixcblx0XHRcdFx0ZGVmYXVsdERhdGU6IHZhbCA/IHZhbC50b0RhdGUoKSA6IHVuZGVmaW5lZCxcblx0XHRcdFx0c2V0RGVmYXVsdERhdGU6IEJvb2xlYW4odmFsKSxcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0JChcIi50aW1lXCIsIHRoaXMuZWwpLmVhY2goKGl0ZW0sIGVsKSA9PiB7XG5cdFx0XHRsZXQgdmFsID0gXy50cmltKCQoZWwpLmRhdGEoXCJ2YWx1ZVwiKSk7XG5cblx0XHRcdGlmICh2YWwpIHtcblx0XHRcdFx0dmFsID0gbW9tZW50KHZhbCwgXCJISG1tXCIpO1xuXHRcdFx0XHRpZiAodmFsLmlzVmFsaWQoKSlcblx0XHRcdFx0XHR2YWwgPSB2YWwuZm9ybWF0KFwiaGg6bW1hXCIpO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dmFsID0gXCJcIjtcblx0XHRcdH1cblxuXHRcdFx0JChlbCkudmFsKHZhbCkudGltZVBpY2tlcigpO1xuXHRcdH0pO1xuXG5cdFx0JChcIi51bml4ZGF0ZVwiLCB0aGlzLmVsKS5lYWNoKChpdGVtLCBlbCkgPT4ge1xuXHRcdFx0bGV0IHZhbCA9IG1vbWVudC51bml4KCQoZWwpLmRhdGEoXCJ2YWx1ZVwiKSk7XG5cdFx0XHRpZiAodmFsLnVuaXgoKSA9PT0gMCkge1xuXHRcdFx0XHR2YWwgPSBcIlwiO1xuXHRcdFx0XHQkKGVsKS52YWwoXCJcIik7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0JChlbCkudmFsKHZhbC5mb3JtYXQoXCJERCBNTU0gWVlZWVwiKSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwLCBuby1uZXdcblx0XHRcdGRhdGVzWyQoZWwpLmF0dHIoXCJuYW1lXCIpXSA9IG5ldyBwaWthZGF5KHtcblx0XHRcdFx0ZmllbGQ6IGVsLFxuXHRcdFx0XHRmb3JtYXQ6IFwiREQgTU1NIFlZWVlcIixcblx0XHRcdFx0ZGVmYXVsdERhdGU6IHZhbCA/IHZhbC50b0RhdGUoKSA6IHVuZGVmaW5lZCxcblx0XHRcdFx0c2V0RGVmYXVsdERhdGU6IHRydWUsXG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fSxcblxuXHRmZXRjaFN1Y2Nlc3M6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMucmVuZGVyKCk7XG5cdH0sXG5cblx0ZmV0Y2hFcnJvcjogZnVuY3Rpb24obW9kZWwsIHhocikge1xuXHRcdGNvbnN0IGFuc3dlciA9IEFwcC5wYXJzZVJlc3BvbnNlKHhocik7XG5cdFx0YWxlcnQoYW5zd2VyLmRldGFpbCB8fCBhbnN3ZXIuaW5mbyk7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar _ = require(\"lodash\");\nvar settings = require(\"app-settings\");\nvar moment = require(\"moment\");\nvar $ = require(\"jquery\");\n\nvar ServerFilterManager = require(\"../../lib/serverFilterManager\");\nvar App = require(\"../../index\");\nvar InfiniteCollection = require(\"../../lib/infiniteCollection\");\n\nvar Searcher = Backbone.Model.extend({\n\tdefaults: {},\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/acacia/logs/search/\" + this.get(\"query\");\n\t}\n});\n\nvar LogLine = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"logline\",\n\n\ttemplate: require(\"../templates/logs.nunj\").logline,\n\n\tui: {\n\t\tplus: \".plus\",\n\t\tdetail: \"div.detail\",\n\t\tcodeblock: \".codeblock\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.plus\": \"expand\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this = this;\n\n\t\treturn {\n\t\t\ttimestamp: function timestamp() {\n\t\t\t\treturn moment(new Date(_this.model.get(\"time\"))).format(\"[[]DD-MMM-YYYY HH:mm[]]\");\n\t\t\t},\n\t\t\ttitle: function title() {\n\t\t\t\tvar j = _this.model.get(\"data\");\n\t\t\t\tvar t = _.escape(j.info || j.message);\n\t\t\t\tvar ret = \"\";\n\t\t\t\tif (_this.model.get(\"child_count\") && _this.model.get(\"child_count\") > 1) ret = \"<span class='logbadge'>\" + _this.model.get(\"child_count\") + \"</span> \" + t;else ret = t;\n\n\t\t\t\tif (_.isPlainObject(j)) ret += \" <a class='bold plus' style='text-decoration:none'>(+)</a>\";\n\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.detailed = false;\n\n\t\tswitch (this.model.get(\"level\")) {\n\t\t\tcase 2:\n\t\t\t\tthis.$el.addClass(\"info\");break;\n\t\t\tcase 3:\n\t\t\t\tthis.$el.addClass(\"warn\");break;\n\t\t\tcase 4:\n\t\t\t\tthis.$el.addClass(\"error\");break;\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"Unknown error level\");\n\t\t}\n\t},\n\n\tonDomRefresh: function onDomRefresh() {\n\t\t$(\"span.logbadge\", this.$el).one(\"click\", this.onBadgeClick.bind(this));\n\t},\n\n\texpand: function expand() {\n\t\tthis.ui.detail.toggleClass(\"hide\");\n\t\tif (this.ui.detail.hasClass(\"hide\")) {\n\t\t\tthis.ui.plus.text(\"(+)\");\n\t\t} else {\n\t\t\tthis.ui.plus.text(\"(-)\");\n\t\t\tif (!this.detailed) {\n\t\t\t\tthis.ui.codeblock.html(this.prettyPrint(this.model.get(\"data\")));\n\t\t\t\tthis.detailed = true;\n\t\t\t}\n\t\t}\n\t},\n\n\treplacer: function replacer(match, pIndent, pKey, pVal, pEnd) {\n\t\tvar key = \"<span class=json-key>\";\n\t\tvar val = \"<span class=json-value>\";\n\t\tvar str = \"<span class=json-string>\";\n\t\tvar r = pIndent || \"\";\n\t\tif (pKey) r = r + key + pKey.replace(/[\": ]/g, \"\") + \"</span>: \";\n\t\tif (pVal) r = r + (pVal[0] === \"\\\"\" ? str : val) + pVal + \"</span>\";\n\t\treturn r + (pEnd || \"\");\n\t},\n\n\tprettyPrint: function prettyPrint(obj) {\n\t\t// eslint-disable-next-line unicorn/no-unsafe-regex\n\t\tvar jsonLine = /^( *)(\"[\\w]+\": )?(\"[^\"]*\"|[\\w.+-]*)?([,[{])?$/mg;\n\t\treturn JSON.stringify(obj, null, 3).replace(/&/g, \"&amp;\").replace(/\\\\\"/g, \"&quot;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(jsonLine, this.replacer);\n\t},\n\n\tonBadgeClick: function onBadgeClick(evt) {\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\n\t\tthis.model.set({ selected: true });\n\t}\n});\n\nvar EmptyView = Backbone.Marionette.View.extend({\n\ttemplate: require(\"../templates/logs.nunj\").empty\n});\n\nvar c = new InfiniteCollection([], {\n\tstate: {\n\t\tpageSize: 100\n\t},\n\turl: settings.urlRoot + \"/acacia/logs\",\n\temptyView: EmptyView\n});\n\nvar Logs = Backbone.Marionette.CollectionView.extend({\n\tclassName: \"logs-list\",\n\tcollection: c.fullCollection,\n\tchildView: LogLine\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"content logs-content\",\n\n\ttemplate: require(\"../templates/logs.nunj\").main,\n\n\tregions: {\n\t\tlogs: {\n\t\t\tel: \"#logs\",\n\t\t\treplaceElement: true\n\t\t}\n\t},\n\n\tui: {\n\t\tlogs: \"#logs\",\n\t\tfilterBlock: \".filterBlock\",\n\t\tsearchLogs: \"button#searchLogs\",\n\n\t\tdbSearch: \"[name='find']\",\n\t\tdbSearchField: \"input[name='dbSearchField']\",\n\t\tdbResults: \"div.dbResult\",\n\t\tdbSpinner: \".dbSearching\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.dbSearch\": \"searchDatabase\",\n\t\t\"click @ui.searchLogs\": \"searchLogs\",\n\t\t\"scroll @ui.logs\": \"onScroll\"\n\t},\n\n\tcollectionEvents: {\n\t\tsync: \"fetchedLogs\",\n\t\trequest: \"requestedLogs\",\n\t\t\"change:selected\": \"onSelectionChange\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.bindEvents(c, this.collectionEvents);\n\n\t\tthis.onScroll = this.onScroll.bind(this);\n\t},\n\n\tonSelectionChange: function onSelectionChange(model) {\n\t\tif (model && model.get(\"selected\")) {\n\t\t\tif (c._params.parentFilter === model.get(\"log_id\").toString()) return;\n\n\t\t\tthis.oldSince = c._params.sinceFilter[0];\n\t\t\t// We selected a grouped log, so update the filter to include it and refetch\n\t\t\tthis.filter.setFilterValue(\"parentFilter\", model.get(\"log_id\"));\n\t\t\tthis.filter.setFilterValue(\"sinceFilter\", moment(model.get(\"created\")).unix());\n\n\t\t\tthis.parentModel = model;\n\t\t} else {\n\t\t\tif (!c._params.parentFilter) return;\n\n\t\t\tthis.filter.setFilterValue(\"parentFilter\", \"\");\n\t\t\tthis.filter.setFilterValue(\"sinceFilter\", this.oldSince);\n\n\t\t\tthis.parentModel = null;\n\t\t}\n\t},\n\n\trequestedLogs: function requestedLogs() {\n\t\t$(\".eol, .sublist\").remove();\n\t\t$(\".logs-overlay\").removeClass(\"hide\");\n\t},\n\n\tfetchedLogs: function fetchedLogs() {\n\t\tvar _this2 = this;\n\n\t\t$(\".eol, .sublist\").remove();\n\t\t$(\".logs-overlay\").addClass(\"hide\");\n\n\t\tif (c._params.parentFilter) {\n\t\t\t// We're filtering to a subset, so add the element that indicates that\n\t\t\tvar el = $(\"<div class='sublist'>Showing sub-errors for \\\"\" + c.first().get(\"data\").info + \"\\\"</div>\");\n\t\t\tel.one(\"click\", function () {\n\t\t\t\t_this2.parentModel.set({ selected: false });\n\t\t\t\t_this2.onSelectionChange(_this2.parentModel);\n\t\t\t});\n\n\t\t\t$(\".logs-list\").prepend(el);\n\t\t}\n\n\t\t// Check if we can scroll the list\n\t\tvar scrollPos = $(\".logs-list\").get(0).scrollTop + $(\".logs-list\").height();\n\t\tvar height = $(\".logs-list\").get(0).scrollHeight;\n\n\t\tif (scrollPos > height) {\n\t\t\t// We can't scroll, so add a manual element to trigger the next page\n\t\t\t// Or don't, because if we can't scroll\n\t\t}\n\n\t\tif (!c.hasNextPage()) {\n\t\t\t// Add an element to indicate we're at the end of the content\n\t\t\t$(\".logs-list\").append($(\"<div class='eol'>No further content to show matching those filters</div>\"));\n\t\t}\n\t},\n\n\tsearchLogs: function searchLogs() {\n\t\tthis.filter.updateServerFilters();\n\t},\n\n\tonScroll: _.throttle(function (evt) {\n\t\t/* eslint-disable no-invalid-this */\n\n\t\tvar scrollPos = evt.currentTarget.scrollTop + $(\".logs-list\").height();\n\t\tvar height = evt.currentTarget.scrollHeight;\n\n\t\tif (scrollPos / height > 0.9 && !c.get(\"fetching\") && c.hasNextPage()) c.getNextPage();\n\n\t\t/* eslint-enable no-invalid-this */\n\t}, 25),\n\n\tonRender: function onRender() {\n\t\tvar _this3 = this;\n\n\t\tvar logView = new Logs();\n\n\t\tthis.showChildView(\"logs\", logView);\n\n\t\tvar since = moment().subtract(24, \"hours\").unix();\n\t\tvar until = moment().unix();\n\n\t\t$(\".logs-list\").append($(\"<div class=\\\"logs-overlay hide\\\">\\n\\t\\t\\t<span class=\\\"spinner-icon spinner-red\\\"/> Fetching data...</div>\"));\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"logTextFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar usersFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"usersFilter\",\n\t\t\tlabel: \"Users\",\n\t\t\tserver: {\n\t\t\t\tkey: \"_id\",\n\t\t\t\tvalue: \"name\",\n\t\t\t\tfetch: settings.urlRoot + \"/acacia/logs/getSelectraUsers\",\n\t\t\t\tparams: function params() {\n\t\t\t\t\treturn _this3.filter.getServerFilters();\n\t\t\t\t}\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t},\n\t\t\tplaceholder: true\n\t\t};\n\n\t\tvar typesFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"typesFilter\",\n\t\t\tlabel: \"Level\",\n\t\t\tcategories: [{\n\t\t\t\titems: [{ name: 2, label: \"Information\" }, { name: 3, label: \"Warnings\" }, { name: 4, label: \"Errors\", selected: true }]\n\t\t\t}],\n\t\t\tinitialValue: function initialValue() {\n\t\t\t\treturn [4];\n\t\t\t},\n\t\t\tserver: true\n\t\t};\n\n\t\tvar booksFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"booksFilter\",\n\t\t\tlabel: \"Books\",\n\t\t\tserver: {\n\t\t\t\tkey: \"id\",\n\t\t\t\tvalue: \"book\",\n\t\t\t\tfetch: settings.urlRoot + \"/acacia/logs/getSelectraBooks\",\n\t\t\t\tparams: function params() {\n\t\t\t\t\treturn _this3.filter.getServerFilters();\n\t\t\t\t}\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t},\n\t\t\tplaceholder: true\n\t\t};\n\n\t\tvar sinceFilter = {\n\t\t\ttype: \"dateTime\",\n\t\t\tname: \"sinceFilter\",\n\t\t\tlabel: \"Since\",\n\t\t\tinitialValue: function initialValue() {\n\t\t\t\treturn [since];\n\t\t\t},\n\t\t\tserver: true\n\t\t};\n\n\t\tvar untilFilter = {\n\t\t\ttype: \"dateTime\",\n\t\t\tname: \"untilFilter\",\n\t\t\tlabel: \"Until\",\n\t\t\tinitialValue: function initialValue() {\n\t\t\t\treturn [until];\n\t\t\t},\n\t\t\tserver: true\n\t\t};\n\n\t\tvar parentFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"parentFilter\",\n\t\t\tlabel: \"Parent\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true,\n\t\t\tshow: false\n\t\t};\n\n\t\tvar filterList = [textFilter, typesFilter, usersFilter, booksFilter, sinceFilter, untilFilter, parentFilter];\n\n\t\tthis.filter = new ServerFilterManager({\n\t\t\traw: c,\n\t\t\tfilterContainer: this.ui.filterBlock,\n\t\t\tfilters: filterList,\n\t\t\tdefaultFilters: [\"logTextFilter\", \"typesFilter\", \"usersFilter\", \"sinceFilter\", \"parentFilter\"]\n\t\t});\n\n\t\tthis.ui.filterBlock.prepend(this.filter.render().el);\n\t},\n\n\tonAttach: function onAttach() {\n\t\t$(\".logs-list\").on(\"scroll\", this.onScroll);\n\t},\n\n\tsearchDatabase: function searchDatabase() {\n\t\tvar query = this.ui.dbSearchField.val();\n\t\tif (!query || !_.trim(query)) return;\n\n\t\tvar search = new Searcher({ query: query });\n\t\tthis.ui.dbSpinner.removeClass(\"hide\");\n\t\tsearch.fetch({ success: this.searchDone.bind(this), error: this.searchFail.bind(this) });\n\t},\n\n\tsearchDone: function searchDone(model) {\n\t\tvar DBResult = Backbone.Marionette.View.extend({\n\t\t\ttemplate: require(\"../templates/logs.nunj\").renderDbItem,\n\n\t\t\tserializeData: function serializeData() {\n\t\t\t\tvar ret = { item: this.model.toJSON(), query: this.model.get(\"query\") };\n\t\t\t\tdelete ret.item.query;\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t});\n\n\t\tthis.ui.dbSpinner.addClass(\"hide\");\n\t\tthis.ui.dbResults.empty().append(new DBResult({ model: model }).render().el);\n\t},\n\n\tsearchFail: function searchFail(model, xhr) {\n\t\tthis.ui.dbSpinner.addClass(\"hide\");\n\n\t\tvar answer = App.parseResponse(xhr);\n\t\tthis.ui.dbResults.empty().text(model.get(\"query\") + \" : \" + (answer.detail || answer.info));\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxvZ3MuanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwiXyIsInNldHRpbmdzIiwibW9tZW50IiwiJCIsIlNlcnZlckZpbHRlck1hbmFnZXIiLCJBcHAiLCJJbmZpbml0ZUNvbGxlY3Rpb24iLCJTZWFyY2hlciIsIk1vZGVsIiwiZXh0ZW5kIiwiZGVmYXVsdHMiLCJ1cmwiLCJ1cmxSb290IiwiZ2V0IiwiTG9nTGluZSIsIk1hcmlvbmV0dGUiLCJWaWV3IiwidGFnTmFtZSIsImNsYXNzTmFtZSIsInRlbXBsYXRlIiwibG9nbGluZSIsInVpIiwicGx1cyIsImRldGFpbCIsImNvZGVibG9jayIsImV2ZW50cyIsInRlbXBsYXRlQ29udGV4dCIsInRpbWVzdGFtcCIsIkRhdGUiLCJtb2RlbCIsImZvcm1hdCIsInRpdGxlIiwiaiIsInQiLCJlc2NhcGUiLCJpbmZvIiwibWVzc2FnZSIsInJldCIsImlzUGxhaW5PYmplY3QiLCJpbml0aWFsaXplIiwiZGV0YWlsZWQiLCIkZWwiLCJhZGRDbGFzcyIsIkVycm9yIiwib25Eb21SZWZyZXNoIiwib25lIiwib25CYWRnZUNsaWNrIiwiYmluZCIsImV4cGFuZCIsInRvZ2dsZUNsYXNzIiwiaGFzQ2xhc3MiLCJ0ZXh0IiwiaHRtbCIsInByZXR0eVByaW50IiwicmVwbGFjZXIiLCJtYXRjaCIsInBJbmRlbnQiLCJwS2V5IiwicFZhbCIsInBFbmQiLCJrZXkiLCJ2YWwiLCJzdHIiLCJyIiwicmVwbGFjZSIsIm9iaiIsImpzb25MaW5lIiwiSlNPTiIsInN0cmluZ2lmeSIsImV2dCIsInN0b3BQcm9wYWdhdGlvbiIsInByZXZlbnREZWZhdWx0Iiwic2V0Iiwic2VsZWN0ZWQiLCJFbXB0eVZpZXciLCJlbXB0eSIsImMiLCJzdGF0ZSIsInBhZ2VTaXplIiwiZW1wdHlWaWV3IiwiTG9ncyIsIkNvbGxlY3Rpb25WaWV3IiwiY29sbGVjdGlvbiIsImZ1bGxDb2xsZWN0aW9uIiwiY2hpbGRWaWV3IiwibW9kdWxlIiwiZXhwb3J0cyIsIm1haW4iLCJyZWdpb25zIiwibG9ncyIsImVsIiwicmVwbGFjZUVsZW1lbnQiLCJmaWx0ZXJCbG9jayIsInNlYXJjaExvZ3MiLCJkYlNlYXJjaCIsImRiU2VhcmNoRmllbGQiLCJkYlJlc3VsdHMiLCJkYlNwaW5uZXIiLCJjb2xsZWN0aW9uRXZlbnRzIiwic3luYyIsInJlcXVlc3QiLCJiaW5kRXZlbnRzIiwib25TY3JvbGwiLCJvblNlbGVjdGlvbkNoYW5nZSIsIl9wYXJhbXMiLCJwYXJlbnRGaWx0ZXIiLCJ0b1N0cmluZyIsIm9sZFNpbmNlIiwic2luY2VGaWx0ZXIiLCJmaWx0ZXIiLCJzZXRGaWx0ZXJWYWx1ZSIsInVuaXgiLCJwYXJlbnRNb2RlbCIsInJlcXVlc3RlZExvZ3MiLCJyZW1vdmUiLCJyZW1vdmVDbGFzcyIsImZldGNoZWRMb2dzIiwiZmlyc3QiLCJwcmVwZW5kIiwic2Nyb2xsUG9zIiwic2Nyb2xsVG9wIiwiaGVpZ2h0Iiwic2Nyb2xsSGVpZ2h0IiwiaGFzTmV4dFBhZ2UiLCJhcHBlbmQiLCJ1cGRhdGVTZXJ2ZXJGaWx0ZXJzIiwidGhyb3R0bGUiLCJjdXJyZW50VGFyZ2V0IiwiZ2V0TmV4dFBhZ2UiLCJvblJlbmRlciIsImxvZ1ZpZXciLCJzaG93Q2hpbGRWaWV3Iiwic2luY2UiLCJzdWJ0cmFjdCIsInVudGlsIiwidGV4dEZpbHRlciIsInR5cGUiLCJuYW1lIiwibGFiZWwiLCJkZWJvdW5jZSIsInNlcnZlciIsInVzZXJzRmlsdGVyIiwidmFsdWUiLCJmZXRjaCIsInBhcmFtcyIsImdldFNlcnZlckZpbHRlcnMiLCJwYWdpbmciLCJpbmZpbml0ZSIsInBsYWNlaG9sZGVyIiwidHlwZXNGaWx0ZXIiLCJjYXRlZ29yaWVzIiwiaXRlbXMiLCJpbml0aWFsVmFsdWUiLCJib29rc0ZpbHRlciIsInVudGlsRmlsdGVyIiwic2hvdyIsImZpbHRlckxpc3QiLCJyYXciLCJmaWx0ZXJDb250YWluZXIiLCJmaWx0ZXJzIiwiZGVmYXVsdEZpbHRlcnMiLCJyZW5kZXIiLCJvbkF0dGFjaCIsIm9uIiwic2VhcmNoRGF0YWJhc2UiLCJxdWVyeSIsInRyaW0iLCJzZWFyY2giLCJzdWNjZXNzIiwic2VhcmNoRG9uZSIsImVycm9yIiwic2VhcmNoRmFpbCIsIkRCUmVzdWx0IiwicmVuZGVyRGJJdGVtIiwic2VyaWFsaXplRGF0YSIsIml0ZW0iLCJ0b0pTT04iLCJ4aHIiLCJhbnN3ZXIiLCJwYXJzZVJlc3BvbnNlIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1FLFdBQVdGLFFBQVEsY0FBUixDQUFqQjtBQUNBLElBQU1HLFNBQVNILFFBQVEsUUFBUixDQUFmO0FBQ0EsSUFBTUksSUFBSUosUUFBUSxRQUFSLENBQVY7O0FBRUEsSUFBTUssc0JBQXNCTCxRQUFRLCtCQUFSLENBQTVCO0FBQ0EsSUFBTU0sTUFBTU4sUUFBUSxhQUFSLENBQVo7QUFDQSxJQUFNTyxxQkFBcUJQLFFBQVEsOEJBQVIsQ0FBM0I7O0FBRUEsSUFBTVEsV0FBV1QsU0FBU1UsS0FBVCxDQUFlQyxNQUFmLENBQXNCO0FBQ3RDQyxXQUFVLEVBRDRCOztBQUd0Q0MsTUFBSyxlQUFXO0FBQ2YsU0FBT1YsU0FBU1csT0FBVCxHQUFtQixzQkFBbkIsR0FBNEMsS0FBS0MsR0FBTCxDQUFTLE9BQVQsQ0FBbkQ7QUFDQTtBQUxxQyxDQUF0QixDQUFqQjs7QUFRQSxJQUFNQyxVQUFVaEIsU0FBU2lCLFVBQVQsQ0FBb0JDLElBQXBCLENBQXlCUCxNQUF6QixDQUFnQztBQUMvQ1EsVUFBUyxLQURzQztBQUUvQ0MsWUFBVyxTQUZvQzs7QUFJL0NDLFdBQVVwQixRQUFRLHdCQUFSLEVBQWtDcUIsT0FKRzs7QUFNL0NDLEtBQUk7QUFDSEMsUUFBTSxPQURIO0FBRUhDLFVBQVEsWUFGTDtBQUdIQyxhQUFXO0FBSFIsRUFOMkM7O0FBWS9DQyxTQUFRO0FBQ1Asb0JBQWtCO0FBRFgsRUFadUM7O0FBZ0IvQ0Msa0JBQWlCLDJC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XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuY29uc3QgbW9tZW50ID0gcmVxdWlyZShcIm1vbWVudFwiKTtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuXG5jb25zdCBTZXJ2ZXJGaWx0ZXJNYW5hZ2VyID0gcmVxdWlyZShcIi4uLy4uL2xpYi9zZXJ2ZXJGaWx0ZXJNYW5hZ2VyXCIpO1xuY29uc3QgQXBwID0gcmVxdWlyZShcIi4uLy4uL2luZGV4XCIpO1xuY29uc3QgSW5maW5pdGVDb2xsZWN0aW9uID0gcmVxdWlyZShcIi4uLy4uL2xpYi9pbmZpbml0ZUNvbGxlY3Rpb25cIik7XG5cbmNvbnN0IFNlYXJjaGVyID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHt9LFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hY2FjaWEvbG9ncy9zZWFyY2gvXCIgKyB0aGlzLmdldChcInF1ZXJ5XCIpO1xuXHR9LFxufSk7XG5cbmNvbnN0IExvZ0xpbmUgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogXCJkaXZcIixcblx0Y2xhc3NOYW1lOiBcImxvZ2xpbmVcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9sb2dzLm51bmpcIikubG9nbGluZSxcblxuXHR1aToge1xuXHRcdHBsdXM6IFwiLnBsdXNcIixcblx0XHRkZXRhaWw6IFwiZGl2LmRldGFpbFwiLFxuXHRcdGNvZGVibG9jazogXCIuY29kZWJsb2NrXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkucGx1c1wiOiBcImV4cGFuZFwiLFxuXHR9LFxuXG5cdHRlbXBsYXRlQ29udGV4dDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRpbWVzdGFtcDogKCkgPT4gbW9tZW50KG5ldyBEYXRlKHRoaXMubW9kZWwuZ2V0KFwidGltZVwiKSkpLmZvcm1hdChcIltbXURELU1NTS1ZWVlZIEhIOm1tW11dXCIpLFxuXHRcdFx0dGl0bGU6ICgpID0+IHtcblx0XHRcdFx0Y29uc3QgaiA9IHRoaXMubW9kZWwuZ2V0KFwiZGF0YVwiKTtcblx0XHRcdFx0Y29uc3QgdCA9IF8uZXNjYXBlKGouaW5mbyB8fCBqLm1lc3NhZ2UpO1xuXHRcdFx0XHRsZXQgcmV0ID0gXCJcIjtcblx0XHRcdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwiY2hpbGRfY291bnRcIikgJiYgdGhpcy5tb2RlbC5nZXQoXCJjaGlsZF9jb3VudFwiKSA+IDEpXG5cdFx0XHRcdFx0cmV0ID0gYDxzcGFuIGNsYXNzPSdsb2diYWRnZSc+JHt0aGlzLm1vZGVsLmdldChcImNoaWxkX2NvdW50XCIpfTwvc3Bhbj4gJHt0fWA7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRyZXQgPSB0O1xuXG5cdFx0XHRcdGlmIChfLmlzUGxhaW5PYmplY3QoaikpXG5cdFx0XHRcdFx0cmV0ICs9IFwiIDxhIGNsYXNzPSdib2xkIHBsdXMnIHN0eWxlPSd0ZXh0LWRlY29yYXRpb246bm9uZSc+KCspPC9hPlwiO1xuXG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9LFxuXHRcdH07XG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5kZXRhaWxlZCA9IGZhbHNlO1xuXG5cdFx0c3dpdGNoICh0aGlzLm1vZGVsLmdldChcImxldmVsXCIpKSB7XG5cdFx0XHRjYXNlIDI6IHRoaXMuJGVsLmFkZENsYXNzKFwiaW5mb1wiKTsgYnJlYWs7XG5cdFx0XHRjYXNlIDM6IHRoaXMuJGVsLmFkZENsYXNzKFwid2FyblwiKTsgYnJlYWs7XG5cdFx0XHRjYXNlIDQ6IHRoaXMuJGVsLmFkZENsYXNzKFwiZXJyb3JcIik7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBlcnJvciBsZXZlbFwiKTtcblx0XHR9XG5cdH0sXG5cblx0b25Eb21SZWZyZXNoOiBmdW5jdGlvbigpIHtcblx0XHQkKFwic3Bhbi5sb2diYWRnZVwiLCB0aGlzLiRlbCkub25lKFwiY2xpY2tcIiwgdGhpcy5vbkJhZGdlQ2xpY2suYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0ZXhwYW5kOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmRldGFpbC50b2dnbGVDbGFzcyhcImhpZGVcIik7XG5cdFx0aWYgKHRoaXMudWkuZGV0YWlsLmhhc0NsYXNzKFwiaGlkZVwiKSkgeyB0aGlzLnVpLnBsdXMudGV4dChcIigrKVwiKTsgfVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy51aS5wbHVzLnRleHQoXCIoLSlcIik7XG5cdFx0XHRpZiAoIXRoaXMuZGV0YWlsZWQpIHtcblx0XHRcdFx0dGhpcy51aS5jb2RlYmxvY2suaHRtbCh0aGlzLnByZXR0eVByaW50KHRoaXMubW9kZWwuZ2V0KFwiZGF0YVwiKSkpO1xuXHRcdFx0XHR0aGlzLmRldGFpbGVkID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0cmVwbGFjZXI6IGZ1bmN0aW9uKG1hdGNoLCBwSW5kZW50LCBwS2V5LCBwVmFsLCBwRW5kKSB7XG5cdFx0Y29uc3Qga2V5ID0gXCI8c3BhbiBjbGFzcz1qc29uLWtleT5cIjtcblx0XHRjb25zdCB2YWwgPSBcIjxzcGFuIGNsYXNzPWpzb24tdmFsdWU+XCI7XG5cdFx0Y29uc3Qgc3RyID0gXCI8c3BhbiBjbGFzcz1qc29uLXN0cmluZz5cIjtcblx0XHRsZXQgciA9IHBJbmRlbnQgfHwgXCJcIjtcblx0XHRpZiAocEtleSlcblx0XHRcdHIgPSByICsga2V5ICsgcEtleS5yZXBsYWNlKC9bXCI6IF0vZywgXCJcIikgKyBcIjwvc3Bhbj46IFwiO1xuXHRcdGlmIChwVmFsKVxuXHRcdFx0ciA9IHIgKyAocFZhbFswXSA9PT0gXCJcXFwiXCIgPyBzdHIgOiB2YWwpICsgcFZhbCArIFwiPC9zcGFuPlwiO1xuXHRcdHJldHVybiByICsgKHBFbmQgfHwgXCJcIik7XG5cdH0sXG5cblx0cHJldHR5UHJpbnQ6IGZ1bmN0aW9uKG9iaikge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25vLXVuc2FmZS1yZWdleFxuXHRcdGNvbnN0IGpzb25MaW5lID0gL14oICopKFwiW1xcd10rXCI6ICk/KFwiW15cIl0qXCJ8W1xcdy4rLV0qKT8oWyxbe10pPyQvbWc7XG5cdFx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMylcblx0XHRcdC5yZXBsYWNlKC8mL2csIFwiJmFtcDtcIikucmVwbGFjZSgvXFxcXFwiL2csIFwiJnF1b3Q7XCIpXG5cdFx0XHQucmVwbGFjZSgvPC9nLCBcIiZsdDtcIikucmVwbGFjZSgvPi9nLCBcIiZndDtcIilcblx0XHRcdC5yZXBsYWNlKGpzb25MaW5lLCB0aGlzLnJlcGxhY2VyKTtcblx0fSxcblxuXHRvbkJhZGdlQ2xpY2s6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRldnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdHRoaXMubW9kZWwuc2V0KHsgc2VsZWN0ZWQ6IHRydWUgfSk7XG5cdH0sXG59KTtcblxuY29uc3QgRW1wdHlWaWV3ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2xvZ3MubnVualwiKS5lbXB0eSxcbn0pO1xuXG5jb25zdCBjID0gbmV3IEluZmluaXRlQ29sbGVjdGlvbihbXSwge1xuXHRzdGF0ZToge1xuXHRcdHBhZ2VTaXplOiAxMDAsXG5cdH0sXG5cdHVybDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FjYWNpYS9sb2dzXCIsXG5cdGVtcHR5VmlldzogRW1wdHlWaWV3LFxufSk7XG5cbmNvbnN0IExvZ3MgPSBCYWNrYm9uZS5NYXJpb25ldHRlLkNvbGxlY3Rpb25WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJsb2dzLWxpc3RcIixcblx0Y29sbGVjdGlvbjogYy5mdWxsQ29sbGVjdGlvbixcblx0Y2hpbGRWaWV3OiBMb2dMaW5lLFxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6IFwiZGl2XCIsXG5cdGNsYXNzTmFtZTogXCJjb250ZW50IGxvZ3MtY29udGVudFwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2xvZ3MubnVualwiKS5tYWluLFxuXG5cdHJlZ2lvbnM6IHtcblx0XHRsb2dzOiB7XG5cdFx0XHRlbDogXCIjbG9nc1wiLFxuXHRcdFx0cmVwbGFjZUVsZW1lbnQ6IHRydWUsXG5cdFx0fSxcblx0fSxcblxuXHR1aToge1xuXHRcdGxvZ3M6IFwiI2xvZ3NcIixcblx0XHRmaWx0ZXJCbG9jazogXCIuZmlsdGVyQmxvY2tcIixcblx0XHRzZWFyY2hMb2dzOiBcImJ1dHRvbiNzZWFyY2hMb2dzXCIsXG5cblx0XHRkYlNlYXJjaDogXCJbbmFtZT0nZmluZCddXCIsXG5cdFx0ZGJTZWFyY2hGaWVsZDogXCJpbnB1dFtuYW1lPSdkYlNlYXJjaEZpZWxkJ11cIixcblx0XHRkYlJlc3VsdHM6IFwiZGl2LmRiUmVzdWx0XCIsXG5cdFx0ZGJTcGlubmVyOiBcIi5kYlNlYXJjaGluZ1wiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmRiU2VhcmNoXCI6IFwic2VhcmNoRGF0YWJhc2VcIixcblx0XHRcImNsaWNrIEB1aS5zZWFyY2hMb2dzXCI6IFwic2VhcmNoTG9nc1wiLFxuXHRcdFwic2Nyb2xsIEB1aS5sb2dzXCI6IFwib25TY3JvbGxcIixcblx0fSxcblxuXHRjb2xsZWN0aW9uRXZlbnRzOiB7XG5cdFx0c3luYzogXCJmZXRjaGVkTG9nc1wiLFxuXHRcdHJlcXVlc3Q6IFwicmVxdWVzdGVkTG9nc1wiLFxuXHRcdFwiY2hhbmdlOnNlbGVjdGVkXCI6IFwib25TZWxlY3Rpb25DaGFuZ2VcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmJpbmRFdmVudHMoYywgdGhpcy5jb2xsZWN0aW9uRXZlbnRzKTtcblxuXHRcdHRoaXMub25TY3JvbGwgPSB0aGlzLm9uU2Nyb2xsLmJpbmQodGhpcyk7XG5cdH0sXG5cblx0b25TZWxlY3Rpb25DaGFuZ2U6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0aWYgKG1vZGVsICYmIG1vZGVsLmdldChcInNlbGVjdGVkXCIpKSB7XG5cdFx0XHRpZiAoYy5fcGFyYW1zLnBhcmVudEZpbHRlciA9PT0gbW9kZWwuZ2V0KFwibG9nX2lkXCIpLnRvU3RyaW5nKCkpXG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0dGhpcy5vbGRTaW5jZSA9IGMuX3BhcmFtcy5zaW5jZUZpbHRlclswXTtcblx0XHRcdC8vIFdlIHNlbGVjdGVkIGEgZ3JvdXBlZCBsb2csIHNvIHVwZGF0ZSB0aGUgZmlsdGVyIHRvIGluY2x1ZGUgaXQgYW5kIHJlZmV0Y2hcblx0XHRcdHRoaXMuZmlsdGVyLnNldEZpbHRlclZhbHVlKFwicGFyZW50RmlsdGVyXCIsIG1vZGVsLmdldChcImxvZ19pZFwiKSk7XG5cdFx0XHR0aGlzLmZpbHRlci5zZXRGaWx0ZXJWYWx1ZShcInNpbmNlRmlsdGVyXCIsIG1vbWVudChtb2RlbC5nZXQoXCJjcmVhdGVkXCIpKS51bml4KCkpO1xuXG5cdFx0XHR0aGlzLnBhcmVudE1vZGVsID0gbW9kZWw7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0aWYgKCFjLl9wYXJhbXMucGFyZW50RmlsdGVyKVxuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdHRoaXMuZmlsdGVyLnNldEZpbHRlclZhbHVlKFwicGFyZW50RmlsdGVyXCIsIFwiXCIpO1xuXHRcdFx0dGhpcy5maWx0ZXIuc2V0RmlsdGVyVmFsdWUoXCJzaW5jZUZpbHRlclwiLCB0aGlzLm9sZFNpbmNlKTtcblxuXHRcdFx0dGhpcy5wYXJlbnRNb2RlbCA9IG51bGw7XG5cdFx0fVxuXHR9LFxuXG5cdHJlcXVlc3RlZExvZ3M6IGZ1bmN0aW9uKCkge1xuXHRcdCQoXCIuZW9sLCAuc3VibGlzdFwiKS5yZW1vdmUoKTtcblx0XHQkKFwiLmxvZ3Mtb3ZlcmxheVwiKS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0ZmV0Y2hlZExvZ3M6IGZ1bmN0aW9uKCkge1xuXHRcdCQoXCIuZW9sLCAuc3VibGlzdFwiKS5yZW1vdmUoKTtcblx0XHQkKFwiLmxvZ3Mtb3ZlcmxheVwiKS5hZGRDbGFzcyhcImhpZGVcIik7XG5cblx0XHRpZiAoYy5fcGFyYW1zLnBhcmVudEZpbHRlcikge1xuXHRcdFx0Ly8gV2UncmUgZmlsdGVyaW5nIHRvIGEgc3Vic2V0LCBzbyBhZGQgdGhlIGVsZW1lbnQgdGhhdCBpbmRpY2F0ZXMgdGhhdFxuXHRcdFx0Y29uc3QgZWwgPSAkKGA8ZGl2IGNsYXNzPSdzdWJsaXN0Jz5TaG93aW5nIHN1Yi1lcnJvcnMgZm9yIFwiJHtjLmZpcnN0KCkuZ2V0KFwiZGF0YVwiKS5pbmZvfVwiPC9kaXY+YCk7XG5cdFx0XHRlbC5vbmUoXCJjbGlja1wiLCAoKSA9PiB7XG5cdFx0XHRcdHRoaXMucGFyZW50TW9kZWwuc2V0KHsgc2VsZWN0ZWQ6IGZhbHNlIH0pO1xuXHRcdFx0XHR0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKHRoaXMucGFyZW50TW9kZWwpO1xuXHRcdFx0fSk7XG5cblx0XHRcdCQoXCIubG9ncy1saXN0XCIpLnByZXBlbmQoZWwpO1xuXHRcdH1cblxuXHRcdC8vIENoZWNrIGlmIHdlIGNhbiBzY3JvbGwgdGhlIGxpc3Rcblx0XHRjb25zdCBzY3JvbGxQb3MgPSAkKFwiLmxvZ3MtbGlzdFwiKS5nZXQoMCkuc2Nyb2xsVG9wICsgJChcIi5sb2dzLWxpc3RcIikuaGVpZ2h0KCk7XG5cdFx0Y29uc3QgaGVpZ2h0ID0gJChcIi5sb2dzLWxpc3RcIikuZ2V0KDApLnNjcm9sbEhlaWdodDtcblxuXHRcdGlmIChzY3JvbGxQb3MgPiBoZWlnaHQpIHtcblx0XHRcdC8vIFdlIGNhbid0IHNjcm9sbCwgc28gYWRkIGEgbWFudWFsIGVsZW1lbnQgdG8gdHJpZ2dlciB0aGUgbmV4dCBwYWdlXG5cdFx0XHQvLyBPciBkb24ndCwgYmVjYXVzZSBpZiB3ZSBjYW4ndCBzY3JvbGxcblx0XHR9XG5cblx0XHRpZiAoIWMuaGFzTmV4dFBhZ2UoKSkge1xuXHRcdFx0Ly8gQWRkIGFuIGVsZW1lbnQgdG8gaW5kaWNhdGUgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgY29udGVudFxuXHRcdFx0JChcIi5sb2dzLWxpc3RcIikuYXBwZW5kKCQoXCI8ZGl2IGNsYXNzPSdlb2wnPk5vIGZ1cnRoZXIgY29udGVudCB0byBzaG93IG1hdGNoaW5nIHRob3NlIGZpbHRlcnM8L2Rpdj5cIikpO1xuXHRcdH1cblx0fSxcblxuXHRzZWFyY2hMb2dzOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmZpbHRlci51cGRhdGVTZXJ2ZXJGaWx0ZXJzKCk7XG5cdH0sXG5cblx0b25TY3JvbGw6IF8udGhyb3R0bGUoZXZ0ID0+IHtcblx0XHQvKiBlc2xpbnQtZGlzYWJsZSBuby1pbnZhbGlkLXRoaXMgKi9cblxuXHRcdGNvbnN0IHNjcm9sbFBvcyA9IGV2dC5jdXJyZW50VGFyZ2V0LnNjcm9sbFRvcCArICQoXCIubG9ncy1saXN0XCIpLmhlaWdodCgpO1xuXHRcdGNvbnN0IGhlaWdodCA9IGV2dC5jdXJyZW50VGFyZ2V0LnNjcm9sbEhlaWdodDtcblxuXHRcdGlmIChzY3JvbGxQb3MgLyBoZWlnaHQgPiAwLjkgJiYgIWMuZ2V0KFwiZmV0Y2hpbmdcIikgJiYgYy5oYXNOZXh0UGFnZSgpKVxuXHRcdFx0Yy5nZXROZXh0UGFnZSgpO1xuXG5cdFx0LyogZXNsaW50LWVuYWJsZSBuby1pbnZhbGlkLXRoaXMgKi9cblx0fSwgMjUpLFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBsb2dWaWV3ID0gbmV3IExvZ3MoKTtcblxuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImxvZ3NcIiwgbG9nVmlldyk7XG5cblx0XHRjb25zdCBzaW5jZSA9IG1vbWVudCgpLnN1YnRyYWN0KDI0LCBcImhvdXJzXCIpLnVuaXgoKTtcblx0XHRjb25zdCB1bnRpbCA9IG1vbWVudCgpLnVuaXgoKTtcblxuXHRcdCQoXCIubG9ncy1saXN0XCIpLmFwcGVuZCgkKGA8ZGl2IGNsYXNzPVwibG9ncy1vdmVybGF5IGhpZGVcIj5cblx0XHRcdDxzcGFuIGNsYXNzPVwic3Bpbm5lci1pY29uIHNwaW5uZXItcmVkXCIvPiBGZXRjaGluZyBkYXRhLi4uPC9kaXY+YCkpO1xuXG5cdFx0Y29uc3QgdGV4dEZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwidGV4dFwiLFxuXHRcdFx0bmFtZTogXCJsb2dUZXh0RmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJUZXh0IFNlYXJjaFwiLFxuXHRcdFx0ZGVib3VuY2U6IDIwMCxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgdXNlcnNGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcInVzZXJzRmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJVc2Vyc1wiLFxuXHRcdFx0c2VydmVyOiB7XG5cdFx0XHRcdGtleTogXCJfaWRcIixcblx0XHRcdFx0dmFsdWU6IFwibmFtZVwiLFxuXHRcdFx0XHRmZXRjaDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FjYWNpYS9sb2dzL2dldFNlbGVjdHJhVXNlcnNcIixcblx0XHRcdFx0cGFyYW1zOiAoKSA9PiB0aGlzLmZpbHRlci5nZXRTZXJ2ZXJGaWx0ZXJzKCksXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdHBhZ2VTaXplOiAzMCxcblx0XHRcdFx0aW5maW5pdGU6IHRydWUsXG5cdFx0XHR9LFxuXHRcdFx0cGxhY2Vob2xkZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdGNvbnN0IHR5cGVzRmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJ0eXBlc0ZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiTGV2ZWxcIixcblx0XHRcdGNhdGVnb3JpZXM6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGl0ZW1zOiBbXG5cdFx0XHRcdFx0XHR7IG5hbWU6IDIsIGxhYmVsOiBcIkluZm9ybWF0aW9uXCIgfSxcblx0XHRcdFx0XHRcdHsgbmFtZTogMywgbGFiZWw6IFwiV2FybmluZ3NcIiB9LFxuXHRcdFx0XHRcdFx0eyBuYW1lOiA0LCBsYWJlbDogXCJFcnJvcnNcIiwgc2VsZWN0ZWQ6IHRydWUgfSxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHR9LFxuXHRcdFx0XSxcblx0XHRcdGluaXRpYWxWYWx1ZTogKCkgPT4gWzRdLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdH07XG5cblx0XHRjb25zdCBib29rc0ZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiaXRlbWl6ZWRcIixcblx0XHRcdG5hbWU6IFwiYm9va3NGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIkJvb2tzXCIsXG5cdFx0XHRzZXJ2ZXI6IHtcblx0XHRcdFx0a2V5OiBcImlkXCIsXG5cdFx0XHRcdHZhbHVlOiBcImJvb2tcIixcblx0XHRcdFx0ZmV0Y2g6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hY2FjaWEvbG9ncy9nZXRTZWxlY3RyYUJvb2tzXCIsXG5cdFx0XHRcdHBhcmFtczogKCkgPT4gdGhpcy5maWx0ZXIuZ2V0U2VydmVyRmlsdGVycygpLFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRwYWdlU2l6ZTogMzAsXG5cdFx0XHRcdGluZmluaXRlOiB0cnVlLFxuXHRcdFx0fSxcblx0XHRcdHBsYWNlaG9sZGVyOiB0cnVlLFxuXHRcdH07XG5cblxuXHRcdGNvbnN0IHNpbmNlRmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJkYXRlVGltZVwiLFxuXHRcdFx0bmFtZTogXCJzaW5jZUZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiU2luY2VcIixcblx0XHRcdGluaXRpYWxWYWx1ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBbc2luY2VdO1xuXHRcdFx0fSxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgdW50aWxGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcImRhdGVUaW1lXCIsXG5cdFx0XHRuYW1lOiBcInVudGlsRmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJVbnRpbFwiLFxuXHRcdFx0aW5pdGlhbFZhbHVlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIFt1bnRpbF07XG5cdFx0XHR9LFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdH07XG5cblx0XHRjb25zdCBwYXJlbnRGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcInRleHRcIixcblx0XHRcdG5hbWU6IFwicGFyZW50RmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJQYXJlbnRcIixcblx0XHRcdGRlYm91bmNlOiAyMDAsXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0XHRzaG93OiBmYWxzZSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgZmlsdGVyTGlzdCA9IFt0ZXh0RmlsdGVyLCB0eXBlc0ZpbHRlciwgdXNlcnNGaWx0ZXIsIGJvb2tzRmlsdGVyLCBzaW5jZUZpbHRlciwgdW50aWxGaWx0ZXIsIHBhcmVudEZpbHRlcl07XG5cblx0XHR0aGlzLmZpbHRlciA9IG5ldyBTZXJ2ZXJGaWx0ZXJNYW5hZ2VyKHtcblx0XHRcdHJhdzogYyxcblx0XHRcdGZpbHRlckNvbnRhaW5lcjogdGhpcy51aS5maWx0ZXJCbG9jayxcblx0XHRcdGZpbHRlcnM6IGZpbHRlckxpc3QsXG5cdFx0XHRkZWZhdWx0RmlsdGVyczogW1wibG9nVGV4dEZpbHRlclwiLCBcInR5cGVzRmlsdGVyXCIsIFwidXNlcnNGaWx0ZXJcIiwgXCJzaW5jZUZpbHRlclwiLCBcInBhcmVudEZpbHRlclwiXSxcblx0XHR9KTtcblxuXHRcdHRoaXMudWkuZmlsdGVyQmxvY2sucHJlcGVuZCh0aGlzLmZpbHRlci5yZW5kZXIoKS5lbCk7XG5cdH0sXG5cblx0b25BdHRhY2g6IGZ1bmN0aW9uKCkge1xuXHRcdCQoXCIubG9ncy1saXN0XCIpLm9uKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpO1xuXHR9LFxuXG5cdHNlYXJjaERhdGFiYXNlOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBxdWVyeSA9IHRoaXMudWkuZGJTZWFyY2hGaWVsZC52YWwoKTtcblx0XHRpZiAoIXF1ZXJ5IHx8ICFfLnRyaW0ocXVlcnkpKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0Y29uc3Qgc2VhcmNoID0gbmV3IFNlYXJjaGVyKHsgcXVlcnk6IHF1ZXJ5IH0pO1xuXHRcdHRoaXMudWkuZGJTcGlubmVyLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRzZWFyY2guZmV0Y2goeyBzdWNjZXNzOiB0aGlzLnNlYXJjaERvbmUuYmluZCh0aGlzKSwgZXJyb3I6IHRoaXMuc2VhcmNoRmFpbC5iaW5kKHRoaXMpIH0pO1xuXHR9LFxuXG5cdHNlYXJjaERvbmU6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0Y29uc3QgREJSZXN1bHQgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0XHRcdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2xvZ3MubnVualwiKS5yZW5kZXJEYkl0ZW0sXG5cblx0XHRcdHNlcmlhbGl6ZURhdGE6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRjb25zdCByZXQgPSB7IGl0ZW06IHRoaXMubW9kZWwudG9KU09OKCksIHF1ZXJ5OiB0aGlzLm1vZGVsLmdldChcInF1ZXJ5XCIpIH07XG5cdFx0XHRcdGRlbGV0ZSByZXQuaXRlbS5xdWVyeTtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH0sXG5cdFx0fSk7XG5cblx0XHR0aGlzLnVpLmRiU3Bpbm5lci5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5kYlJlc3VsdHMuZW1wdHkoKS5hcHBlbmQobmV3IERCUmVzdWx0KHsgbW9kZWw6IG1vZGVsIH0pLnJlbmRlcigpLmVsKTtcblx0fSxcblxuXHRzZWFyY2hGYWlsOiBmdW5jdGlvbihtb2RlbCwgeGhyKSB7XG5cdFx0dGhpcy51aS5kYlNwaW5uZXIuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0Y29uc3QgYW5zd2VyID0gQXBwLnBhcnNlUmVzcG9uc2UoeGhyKTtcblx0XHR0aGlzLnVpLmRiUmVzdWx0cy5lbXB0eSgpLnRleHQobW9kZWwuZ2V0KFwicXVlcnlcIikgKyBcIiA6IFwiICsgKGFuc3dlci5kZXRhaWwgfHwgYW5zd2VyLmluZm8pKTtcblx0fSxcbn0pOyJdfQ==",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar rester = require(\"rester\");\nvar Backbone = require(\"backbone\");\n// This needs to be here to fix IE11. Don't remove.\n// No I don't know either. It's stupid.\n// eslint-disable-next-line no-unused-vars\nvar Promise = require(\"bluebird\");\n\nvar App = require(\"../../index\");\nvar settings = require(\"app-settings\");\n\nvar BigModal = require(\"../../lib/bigModal\");\n\nvar SubjectModel = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"subject_id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/subjects\";\n\t}\n});\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nmodule.exports = BigModal.extend({\n\tui: {\n\t\tsubjectLabel: \".subject-label\",\n\t\tsubject: \"[name='subject']\"\n\t},\n\n\tevents: {\n\t\t\"keydown @ui.subject\": \"clearSubjectnameValidationError\"\n\t},\n\n\tactions: {\n\t\tcreate: \"onSubjectCreated\",\n\t\tcreateAnother: \"onCreateAnother\",\n\t\tupdate: \"onSubjectUpdated\"\n\t},\n\n\terrorMap: {\n\t\tsubject: {\n\t\t\tattractionElement: \"subjectLabel\",\n\t\t\tposition: \"right\"\n\t\t}\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this = this;\n\n\t\treturn _.extend({\n\t\t\teditable: function editable() {\n\t\t\t\tvar subject = radio.request(App.Events.Requests.CurrentUser);\n\n\t\t\t\treturn _this.model.isNew() && rester.hasAccess(rester.p.api.subjects.post, subject) || !_this.model.isNew() && rester.hasAccess(rester.p.api.subjects.put, subject);\n\t\t\t},\n\t\t\tisNew: function isNew() {\n\t\t\t\treturn _this.model.isNew();\n\t\t\t}\n\t\t}, BigModal.prototype.templateContext.call(this));\n\t},\n\n\tinitialize: function initialize() {\n\t\t_.bindAll(this);\n\n\t\tthis.Options = {\n\t\t\ttemplate: require(\"../templates/subjectModal.nunj\").content,\n\t\t\tbuttons: {\n\t\t\t\tcreate: {\n\t\t\t\t\ttype: \"accept\",\n\t\t\t\t\tlabel: \"Create & Close\",\n\t\t\t\t\tmode: \"create\",\n\t\t\t\t\tpermission: this.permissionToCreate.bind(this),\n\t\t\t\t\tsave: true,\n\t\t\t\t\tvalidate: true\n\t\t\t\t},\n\t\t\t\tcreateAnother: {\n\t\t\t\t\ttype: \"accept\",\n\t\t\t\t\tlabel: \"Create\",\n\t\t\t\t\tmode: \"create\",\n\t\t\t\t\tpermission: this.permissionToCreate.bind(this),\n\t\t\t\t\tsave: true,\n\t\t\t\t\tvalidate: true\n\t\t\t\t},\n\t\t\t\tupdate: {\n\t\t\t\t\ttype: \"accept\",\n\t\t\t\t\tlabel: \"Update\",\n\t\t\t\t\tmode: \"edit\",\n\t\t\t\t\t//permission: this.permissionToUpdate.bind(this),\n\t\t\t\t\tsave: true,\n\t\t\t\t\tvalidate: true\n\t\t\t\t},\n\t\t\t\tcancel: {\n\t\t\t\t\ttype: \"cancel\",\n\t\t\t\t\tlabel: \"Cancel\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tdataNoun: \"subject\" + (this.model.isNew() ? \"\" : \": \" + this.model.get(\"subject\"))\n\t\t};\n\n\t\tthis.ui = _.extend(this.ui, BigModal.prototype.ui);\n\t\tthis.events = _.extend(this.events, BigModal.prototype.events);\n\n\t\tBigModal.prototype.initialize.call(this);\n\t},\n\n\tpermissionToCreate: function permissionToCreate() {\n\t\treturn rester.hasAccess(rester.p.api.subjects.post, radio.request(App.Events.Requests.CurrentUser));\n\t},\n\n\tpermissionToUpdate: function permissionToUpdate() {\n\t\treturn rester.hasAccess(rester.p.api.subjects.put, radio.request(App.Events.Requests.CurrentUser));\n\t},\n\n\tserializeData: function serializeData() {\n\t\treturn this.model.toJSON({ computed: true });\n\t},\n\n\tclearSubjectnameValidationError: function clearSubjectnameValidationError() {\n\t\tthis.hideValidationErrorMessage(this.ui.subject);\n\t},\n\n\tassembleData: function assembleData() {\n\t\treturn {\n\t\t\tattributes: {\n\t\t\t\tsubject: this.model.isNew() ? (this.ui.subject.val() || \"\").split(/\\n/g).map(function (x) {\n\t\t\t\t\treturn _.trim(x);\n\t\t\t\t}) : _.trim(this.ui.subject.val())\n\t\t\t}\n\t\t};\n\t},\n\n\tonSubjectCreated: function onSubjectCreated(result) {\n\t\tApp.trigger(App.Events.SubjectCreated, result.model);\n\t\tthis.CurrentSubjectForm = null;\n\t},\n\n\tonSubjectUpdated: function onSubjectUpdated(result) {\n\t\tApp.trigger(App.Events.SubjectUpdated, result.model);\n\t},\n\n\tonCreateAnother: function onCreateAnother() {\n\t\treturn new SubjectModel();\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN1YmplY3RNb2RhbC5qcyJdLCJuYW1lcyI6WyJfIiwicmVxdWlyZSIsInJlc3RlciIsIkJhY2tib25lIiwiUHJvbWlzZSIsIkFwcCIsInNldHRpbmdzIiwiQmlnTW9kYWwiLCJTdWJqZWN0TW9kZWwiLCJFcG94eSIsIk1vZGVsIiwiZXh0ZW5kIiwiaWRBdHRyaWJ1dGUiLCJ1cmxSb290IiwicmFkaW8iLCJSYWRpbyIsImNoYW5uZWwiLCJtb2R1bGUiLCJleHBvcnRzIiwidWkiLCJzdWJqZWN0TGFiZWwiLCJzdWJqZWN0IiwiZXZlbnRzIiwiYWN0aW9ucyIsImNyZWF0ZSIsImNyZWF0ZUFub3RoZXIiLCJ1cGRhdGUiLCJlcnJvck1hcCIsImF0dHJhY3Rpb25FbGVtZW50IiwicG9zaXRpb24iLCJ0ZW1wbGF0ZUNvbnRleHQiLCJlZGl0YWJsZSIsInJlcXVlc3QiLCJFdmVudHMiLCJSZXF1ZXN0cyIsIkN1cnJlbnRVc2VyIiwibW9kZWwiLCJpc05ldyIsImhhc0FjY2VzcyIsInAiLCJhcGkiLCJzdWJqZWN0cyIsInBvc3QiLCJwdXQiLCJwcm90b3R5cGUiLCJjYWxsIiwiaW5pdGlhbGl6ZSIsImJpbmRBbGwiLCJPcHRpb25zIiwidGVtcGxhdGUiLCJjb250ZW50IiwiYnV0dG9ucyIsInR5cGUiLCJsYWJlbCIsIm1vZGUiLCJwZXJtaXNzaW9uIiwicGVybWlzc2lvblRvQ3JlYXRlIiwiYmluZCIsInNhdmUiLCJ2YWxpZGF0ZSIsImNhbmNlbCIsImRhdGFOb3VuIiwiZ2V0IiwicGVybWlzc2lvblRvVXBkYXRlIiwic2VyaWFsaXplRGF0YSIsInRvSlNPTiIsImNvbXB1dGVkIiwiY2xlYXJTdWJqZWN0bmFtZVZhbGlkYXRpb25FcnJvciIsImhpZGVWYWxpZGF0aW9uRXJyb3JNZXNzYWdlIiwiYXNzZW1ibGVEYXRhIiwiYXR0cmlidXRlcyIsInZhbCIsInNwbGl0IiwibWFwIiwidHJpbSIsIngiLCJvblN1YmplY3RDcmVhdGVkIiwicmVzdWx0IiwidHJpZ2dlciIsIlN1YmplY3RDcmVhdGVkIiwiQ3VycmVudFN1YmplY3RGb3JtIiwib25TdWJqZWN0VXBkYXRlZCIsIlN1YmplY3RVcGRhdGVkIiwib25DcmVhdGVBbm90aGVyIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLFNBQVNELFFBQVEsUUFBUixDQUFmO0FBQ0EsSUFBTUUsV0FBV0YsUUFBUSxVQUFSLENBQWpCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBTUcsVUFBVUgsUUFBUSxVQUFSLENBQWhCOztBQUVBLElBQU1JLE1BQU1KLFFBQVEsYUFBUixDQUFaO0FBQ0EsSUFBTUssV0FBV0wsUUFBUSxjQUFSLENBQWpCOztBQUVBLElBQU1NLFdBQVdOLFFBQVEsb0JBQVIsQ0FBakI7O0FBRUEsSUFBTU8sZUFBZUwsU0FBU00sS0FBVCxDQUFlQyxLQUFmLENBQXFCQyxNQUFyQixDQUE0QjtBQUNoREMsY0FBYSxZQURtQzs7QUFHaERDLFVBQVMsbUJBQVc7QUFDbkIsU0FBT1AsU0FBU08sT0FBVCxHQUFtQixtQkFBMUI7QUFDQTtBQUwrQyxDQUE1QixDQUFyQjs7QUFRQSxJQUFNQyxRQUFRWCxTQUFTWSxLQUFULENBQWVDLE9BQWYsQ0FBdUIsUUFBdkIsQ0FBZDs7QUFFQUMsT0FBT0MsT0FBUCxHQUFpQlgsU0FBU0ksTUFBVCxDQUFnQjtBQUNoQ1EsS0FBSTtBQUNIQyxnQkFBYyxnQkFEWDtBQUVIQyxXQUFTO0FBRk4sRUFENEI7O0FBTWhDQyxTQUFRO0FBQ1AseUJBQXVCO0FBRGhCLEVBTndCOztBQVVoQ0MsVUFBUztBQUNSQyxVQUFRLGtCQURBO0FBRVJDLGlCQUFlLGlCQUZQO0FBR1JDLFVBQVE7QUFIQSxFQVZ1Qjs7QUFnQmhDQyxXQUFVO0FBQ1ROLFdBQVM7QUFDUk8sc0JBQW1CLGNBRFg7QUFFUkMsYUFBVTtBQUZGO0FBREEsRUFoQnNCOztBQXVCaENDLGtCQUFpQiwyQkFBVztBQUFBOztBQUMzQixTQUFPOUIsRUFBRVcsTUFBRixDQUFTO0FB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c3ViamVjdE1vZGFsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IHJlc3RlciA9IHJlcXVpcmUoXCJyZXN0ZXJcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbi8vIFRoaXMgbmVlZHMgdG8gYmUgaGVyZSB0byBmaXggSUUxMS4gRG9uJ3QgcmVtb3ZlLlxuLy8gTm8gSSBkb24ndCBrbm93IGVpdGhlci4gSXQncyBzdHVwaWQuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmNvbnN0IFByb21pc2UgPSByZXF1aXJlKFwiYmx1ZWJpcmRcIik7XG5cbmNvbnN0IEFwcCA9IHJlcXVpcmUoXCIuLi8uLi9pbmRleFwiKTtcbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxuY29uc3QgQmlnTW9kYWwgPSByZXF1aXJlKFwiLi4vLi4vbGliL2JpZ01vZGFsXCIpO1xuXG5jb25zdCBTdWJqZWN0TW9kZWwgPSBCYWNrYm9uZS5FcG94eS5Nb2RlbC5leHRlbmQoe1xuXHRpZEF0dHJpYnV0ZTogXCJzdWJqZWN0X2lkXCIsXG5cblx0dXJsUm9vdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3N1YmplY3RzXCI7XG5cdH0sXG59KTtcblxuY29uc3QgcmFkaW8gPSBCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZ2xvYmFsXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJpZ01vZGFsLmV4dGVuZCh7XG5cdHVpOiB7XG5cdFx0c3ViamVjdExhYmVsOiBcIi5zdWJqZWN0LWxhYmVsXCIsXG5cdFx0c3ViamVjdDogXCJbbmFtZT0nc3ViamVjdCddXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJrZXlkb3duIEB1aS5zdWJqZWN0XCI6IFwiY2xlYXJTdWJqZWN0bmFtZVZhbGlkYXRpb25FcnJvclwiLFxuXHR9LFxuXG5cdGFjdGlvbnM6IHtcblx0XHRjcmVhdGU6IFwib25TdWJqZWN0Q3JlYXRlZFwiLFxuXHRcdGNyZWF0ZUFub3RoZXI6IFwib25DcmVhdGVBbm90aGVyXCIsXG5cdFx0dXBkYXRlOiBcIm9uU3ViamVjdFVwZGF0ZWRcIixcblx0fSxcblxuXHRlcnJvck1hcDoge1xuXHRcdHN1YmplY3Q6IHtcblx0XHRcdGF0dHJhY3Rpb25FbGVtZW50OiBcInN1YmplY3RMYWJlbFwiLFxuXHRcdFx0cG9zaXRpb246IFwicmlnaHRcIixcblx0XHR9LFxuXHR9LFxuXG5cdHRlbXBsYXRlQ29udGV4dDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIF8uZXh0ZW5kKHtcblx0XHRcdGVkaXRhYmxlOiAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHN1YmplY3QgPSByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpO1xuXG5cdFx0XHRcdHJldHVybiB0aGlzLm1vZGVsLmlzTmV3KCkgJiYgcmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5hcGkuc3ViamVjdHMucG9zdCwgc3ViamVjdCkgfHwgIXRoaXMubW9kZWwuaXNOZXcoKSAmJiByZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmFwaS5zdWJqZWN0cy5wdXQsIHN1YmplY3QpO1xuXHRcdFx0fSxcblx0XHRcdGlzTmV3OiAoKSA9PiB0aGlzLm1vZGVsLmlzTmV3KCksXG5cdFx0fSwgQmlnTW9kYWwucHJvdG90eXBlLnRlbXBsYXRlQ29udGV4dC5jYWxsKHRoaXMpKTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRfLmJpbmRBbGwodGhpcyk7XG5cblx0XHR0aGlzLk9wdGlvbnMgPSB7XG5cdFx0XHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9zdWJqZWN0TW9kYWwubnVualwiKS5jb250ZW50LFxuXHRcdFx0YnV0dG9uczoge1xuXHRcdFx0XHRjcmVhdGU6IHtcblx0XHRcdFx0XHR0eXBlOiBcImFjY2VwdFwiLFxuXHRcdFx0XHRcdGxhYmVsOiBcIkNyZWF0ZSAmIENsb3NlXCIsXG5cdFx0XHRcdFx0bW9kZTogXCJjcmVhdGVcIixcblx0XHRcdFx0XHRwZXJtaXNzaW9uOiB0aGlzLnBlcm1pc3Npb25Ub0NyZWF0ZS5iaW5kKHRoaXMpLFxuXHRcdFx0XHRcdHNhdmU6IHRydWUsXG5cdFx0XHRcdFx0dmFsaWRhdGU6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGNyZWF0ZUFub3RoZXI6IHtcblx0XHRcdFx0XHR0eXBlOiBcImFjY2VwdFwiLFxuXHRcdFx0XHRcdGxhYmVsOiBcIkNyZWF0ZVwiLFxuXHRcdFx0XHRcdG1vZGU6IFwiY3JlYXRlXCIsXG5cdFx0XHRcdFx0cGVybWlzc2lvbjogdGhpcy5wZXJtaXNzaW9uVG9DcmVhdGUuYmluZCh0aGlzKSxcblx0XHRcdFx0XHRzYXZlOiB0cnVlLFxuXHRcdFx0XHRcdHZhbGlkYXRlOiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR1cGRhdGU6IHtcblx0XHRcdFx0XHR0eXBlOiBcImFjY2VwdFwiLFxuXHRcdFx0XHRcdGxhYmVsOiBcIlVwZGF0ZVwiLFxuXHRcdFx0XHRcdG1vZGU6IFwiZWRpdFwiLFxuXHRcdFx0XHRcdC8vcGVybWlzc2lvbjogdGhpcy5wZXJtaXNzaW9uVG9VcGRhdGUuYmluZCh0aGlzKSxcblx0XHRcdFx0XHRzYXZlOiB0cnVlLFxuXHRcdFx0XHRcdHZhbGlkYXRlOiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRjYW5jZWw6IHtcblx0XHRcdFx0XHR0eXBlOiBcImNhbmNlbFwiLFxuXHRcdFx0XHRcdGxhYmVsOiBcIkNhbmNlbFwiLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHRcdGRhdGFOb3VuOiBcInN1YmplY3RcIiArICh0aGlzLm1vZGVsLmlzTmV3KCkgPyBcIlwiIDogXCI6IFwiICsgdGhpcy5tb2RlbC5nZXQoXCJzdWJqZWN0XCIpKSxcblx0XHR9O1xuXG5cdFx0dGhpcy51aSA9IF8uZXh0ZW5kKHRoaXMudWksIEJpZ01vZGFsLnByb3RvdHlwZS51aSk7XG5cdFx0dGhpcy5ldmVudHMgPSBfLmV4dGVuZCh0aGlzLmV2ZW50cywgQmlnTW9kYWwucHJvdG90eXBlLmV2ZW50cyk7XG5cblx0XHRCaWdNb2RhbC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMpO1xuXHR9LFxuXG5cdHBlcm1pc3Npb25Ub0NyZWF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAuYXBpLnN1YmplY3RzLnBvc3QsIHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcikpO1xuXHR9LFxuXG5cdHBlcm1pc3Npb25Ub1VwZGF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAuYXBpLnN1YmplY3RzLnB1dCwgcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKSk7XG5cdH0sXG5cblx0c2VyaWFsaXplRGF0YTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubW9kZWwudG9KU09OKHsgY29tcHV0ZWQ6IHRydWUgfSk7XG5cdH0sXG5cblx0Y2xlYXJTdWJqZWN0bmFtZVZhbGlkYXRpb25FcnJvcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5oaWRlVmFsaWRhdGlvbkVycm9yTWVzc2FnZSh0aGlzLnVpLnN1YmplY3QpO1xuXHR9LFxuXG5cdGFzc2VtYmxlRGF0YTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGF0dHJpYnV0ZXM6IHtcblx0XHRcdFx0c3ViamVjdDogdGhpcy5tb2RlbC5pc05ldygpID8gKHRoaXMudWkuc3ViamVjdC52YWwoKSB8fCBcIlwiKS5zcGxpdCgvXFxuL2cpLm1hcCh4ID0+IF8udHJpbSh4KSkgOiBfLnRyaW0odGhpcy51aS5zdWJqZWN0LnZhbCgpKSxcblx0XHRcdH0sXG5cdFx0fTtcblx0fSxcblxuXHRvblN1YmplY3RDcmVhdGVkOiBmdW5jdGlvbihyZXN1bHQpIHtcblx0XHRBcHAudHJpZ2dlcihBcHAuRXZlbnRzLlN1YmplY3RDcmVhdGVkLCByZXN1bHQubW9kZWwpO1xuXHRcdHRoaXMuQ3VycmVudFN1YmplY3RGb3JtID0gbnVsbDtcblx0fSxcblxuXHRvblN1YmplY3RVcGRhdGVkOiBmdW5jdGlvbihyZXN1bHQpIHtcblx0XHRBcHAudHJpZ2dlcihBcHAuRXZlbnRzLlN1YmplY3RVcGRhdGVkLCByZXN1bHQubW9kZWwpO1xuXHR9LFxuXG5cdG9uQ3JlYXRlQW5vdGhlcjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIG5ldyBTdWJqZWN0TW9kZWwoKTtcblx0fSxcbn0pOyJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar rester = require(\"rester\");\nvar _ = require(\"lodash\");\n\nvar App = require(\"../../index\");\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar ServerGrid = require(\"../../lib/serverGrid\");\nvar settings = require(\"app-settings\");\nvar SmallModal = require(\"../../lib/smallModal\");\nvar SimpleMenu = require(\"../../lib/simpleMenu\");\nvar SubjectModal = require(\"./subjectModal\");\n\nvar SubjectModel = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"subject_id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/subjects\";\n\t}\n});\n\nvar Collection = Backbone.PageableCollection.extend({\n\tmodel: SubjectModel,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/subjects?paged=true\";\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"content subject-manager\",\n\n\ttemplate: require(\"../templates/subjects.nunj\"),\n\n\tui: {\n\t\tfilterBar: \".ops-bar .filters\",\n\t\tcounterBar: \".ops-bar .counter\",\n\t\taddSubjectIcon: \".add-subject\",\n\t\tdownload: \"div.download\",\n\t\tpaging: \".paging\",\n\t\tgrid: \"div.grid\"\n\t},\n\n\tcollectionEvents: {\n\t\t\"toolbar:click:delete\": \"deleteSubject\",\n\t\t\"toolbar:click:edit\": \"addEditSubject\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.addSubjectIcon\": \"addEditSubject\",\n\t\t\"click @ui.download\": \"showDownloads\"\n\t},\n\n\tshowDownloads: function showDownloads(evt) {\n\t\tevt.stopPropagation();\n\n\t\tvar list = new SimpleMenu({\n\t\t\tanchor: this.ui.download,\n\t\t\tside: \"left\",\n\t\t\tstructure: [{ closeOnClick: true, elements: [{ text: \"Export list of subjects\", id: \"subjects\" }, { text: \"Export list of subject groups\", id: \"subjectGroups\" }, { text: \"Export list of subject groups (compatible with CSV Imports)\", id: \"subjectGroupsForImport\" }] }]\n\t\t});\n\t\tlist.show();\n\n\t\tthis.listenTo(list, \"clicked:subjects\", this.downloadList.bind(this));\n\t\tthis.listenTo(list, \"clicked:subjectGroups\", this.downloadGroupList.bind(this));\n\t\tthis.listenTo(list, \"clicked:subjectGroupsForImport\", this.downloadGroupListForImport.bind(this));\n\t},\n\n\tdownloadList: function downloadList() {\n\t\twindow.open(settings.urlRoot + \"/api/1.0/subjects/lists/subjects\");\n\t},\n\n\tdownloadGroupList: function downloadGroupList() {\n\t\twindow.open(settings.urlRoot + \"/api/1.0/subjects/lists/subjectGroups\");\n\t},\n\n\tdownloadGroupListForImport: function downloadGroupListForImport() {\n\t\twindow.open(settings.urlRoot + \"/api/1.0/subjects/lists/subjectGroupsCompatCSV\");\n\t},\n\n\taddEditSubject: function addEditSubject(model) {\n\t\tvar _this = this;\n\n\t\tif (settings.fcClient) return;\n\n\t\tvar modal = new SubjectModal({\n\t\t\tmodel: model instanceof Backbone.Model && model.get(\"subject_id\") ? model : new SubjectModel()\n\t\t});\n\n\t\tmodal.show({\n\t\t\tcreate: function create() {\n\t\t\t\t_this.grid.collection.getFirstPage();\n\n\t\t\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\t\t\tcontent: \"New subject successfully created\"\n\t\t\t\t});\n\t\t\t},\n\t\t\tcreateAnother: function createAnother() {\n\t\t\t\t_this.grid.collection.getFirstPage();\n\t\t\t},\n\t\t\tupdate: function update(result) {\n\t\t\t\tresult.model.trigger(\"grid:render\");\n\t\t\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\t\t\tcontent: \"Subject successfully updated\"\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t},\n\n\tfilterDelete: function filterDelete(model) {\n\t\tvar subject = radio.request(App.Events.Requests.CurrentUser);\n\t\tif (settings.fcClient || model.id === subject._id || !rester.hasAccess(rester.p.api.subjects.delete, subject)) return false;\n\n\t\treturn _.every(model.get(\"roles\"), function (key) {\n\t\t\treturn key in settings.roles && rester.hasAccess(rester.p.subjects.delete[key], subject);\n\t\t});\n\t},\n\n\tfilterEdit: function filterEdit() {\n\t\tvar subject = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tif (settings.fcClient || !rester.hasAccess(rester.p.api.subjects.put, subject)) return false;\n\n\t\treturn true;\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"subject\", label: \"Subject\", cell: \"string\", editable: false }, { name: \"hidden\", label: \"Hidden\", cell: \"string\", editable: false }, { name: \"categories_string\", label: \"Source\", cell: \"string\", editable: false }, { label: \"Actions\", cell: new ServerGrid.ToolbarCell({ tooltips: [{ title: \"Edit\", icon: \"fa-edit\", filter: this.filterEdit.bind(this) }, { title: \"Delete\", icon: \"fa-trash-alt\", filter: this.filterDelete.bind(this) }] }), editable: false, sortable: false }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new Collection(),\n\t\t\tclickable: true,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counterBar,\n\t\t\t\ttemplate: \"Subjects $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tthis.bindEvents(this.grid.collection, this.collectionEvents);\n\n\t\tif (!settings.fcClient) this.listenTo(this.grid, \"row:clicked\", this.addEditSubject.bind(this));\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tthis.ui.filterBar.prepend(this.grid.filter({\n\t\t\tfilterContainer: this.ui.filterBar,\n\t\t\tfilters: [textFilter],\n\t\t\tdefaultFilters: [\"textFilter\"]\n\t\t}).render().el);\n\t},\n\n\t/*viewSubjectDetails: function(model) {\n \tthis.subjectDetails = new SubjectDetails({\n \t\teventBus: this,\n \t\tsubjectModel: model,\n \t});\n \t\tthis.on(\"subjectDetails:close\", () => {\n \t\tthis.off(\"subjectDetails:close\");\n \t}, this);\n \t\tthis.subjectDetails.show();\n },*/\n\n\tdeleteSubject: function deleteSubject(model) {\n\t\tvar _this2 = this;\n\n\t\tthis.delModal = new SmallModal({\n\t\t\tpersist: true,\n\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Delete Subject: \" + model.get(\"subject\").replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t}),\n\t\t\tbody: \"<p>Are you sure you want to delete this subject?</p>\",\n\t\t\twarning: true\n\t\t});\n\t\tthis.delModal.on(\"button:ok\", function () {\n\t\t\tmodel.destroy({ wait: true, success: _this2.deletionSuccess.bind(_this2), error: _this2.deletionError.bind(_this2) });\n\t\t});\n\n\t\tthis.delModal.show();\n\t},\n\n\tdeletionSuccess: function deletionSuccess(model) {\n\t\tthis.delModal.destroy();\n\t\tradio.trigger(App.Events.Commands.Toast, { content: \"Subject \" + model.get(\"subject\") + \" successfully deleted\", icon: \"fa-trash-alt\", iconColour: \"red\" });\n\t},\n\n\tdeletionError: function deletionError(model, xhr) {\n\t\tvar answer = App.parseResponse(xhr);\n\t\tthis.delModal.showError(\"Deletion failed: \" + (answer.detail || answer.info));\n\t},\n\n\tdownloadAllAssessments: function downloadAllAssessments(model) {\n\t\twindow.open(settings.urlRoot + \"/api/1.0/assessments/student/allmarks/\" + model.get(\"_id\") + \"/report?individual=true&allMarks=true\");\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN1YmplY3RzLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsInJlc3RlciIsIl8iLCJBcHAiLCJyYWRpbyIsIlJhZGlvIiwiY2hhbm5lbCIsIlNlcnZlckdyaWQiLCJzZXR0aW5ncyIsIlNtYWxsTW9kYWwiLCJTaW1wbGVNZW51IiwiU3ViamVjdE1vZGFsIiwiU3ViamVjdE1vZGVsIiwiRXBveHkiLCJNb2RlbCIsImV4dGVuZCIsImlkQXR0cmlidXRlIiwidXJsUm9vdCIsIkNvbGxlY3Rpb24iLCJQYWdlYWJsZUNvbGxlY3Rpb24iLCJtb2RlbCIsInVybCIsInN0YXRlIiwicGFnZVNpemUiLCJtb2RlIiwicXVlcnlQYXJhbXMiLCJzb3J0S2V5IiwicGFyc2VTdGF0ZSIsInJlc3AiLCJ0b3RhbFJlY29yZHMiLCJ0b3RhbCIsInBhcnNlUmVjb3JkcyIsInJvd3MiLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJ0YWdOYW1lIiwiY2xhc3NOYW1lIiwidGVtcGxhdGUiLCJ1aSIsImZpbHRlckJhciIsImNvdW50ZXJCYXIiLCJhZGRTdWJqZWN0SWNvbiIsImRvd25sb2FkIiwicGFnaW5nIiwiZ3JpZCIsImNvbGxlY3Rpb25FdmVudHMiLCJldmVudHMiLCJzaG93RG93bmxvYWRzIiwiZXZ0Iiwic3RvcFByb3BhZ2F0aW9uIiwibGlzdCIsImFuY2hvciIsInNpZGUiLCJzdHJ1Y3R1cmUiLCJjbG9zZU9uQ2xpY2siLCJlbGVtZW50cyIsInRleHQiLCJpZCIsInNob3ciLCJsaXN0ZW5UbyIsImRvd25sb2FkTGlzdCIsImJpbmQiLCJkb3dubG9hZEdyb3VwTGlzdCIsImRvd25sb2FkR3JvdXBMaXN0Rm9ySW1wb3J0Iiwid2luZG93Iiwib3BlbiIsImFkZEVkaXRTdWJqZWN0IiwiZmNDbGllbnQiLCJtb2RhbCIsImdldCIsImNyZWF0ZSIsImNvbGxlY3Rpb24iLCJnZXRGaXJzdFBhZ2UiLCJ0cmlnZ2VyIiwiRXZlbnRzIiwiQ29tbWFuZHMiLCJUb2FzdCIsImNvbnRlbnQiLCJjcmVhdGVBbm90aGVyIiwidXBkYXRlIiwicmVzdWx0IiwiZmlsdGVyRGVsZXRlIiwic3ViamVjdCIsInJlcXVlc3QiLCJSZXF1ZXN0cyIsIkN1cnJlbnRVc2VyIiwiX2lkIiwiaGFzQWNjZXNzIiwicCIsImFwaSIsInN1YmplY3RzIiwiZGVsZXRlIiwiZXZlcnkiLCJrZXkiLCJyb2xlcyIsImZpbHRlckVkaXQiLCJwdXQiLCJvblJlbmRlciIsImNvbHVtbnMiLCJuYW1lIiwibGFiZWwiLCJjZWxsIiwiZWRpdGFibGUiLCJUb29sYmFyQ2VsbCIsInRvb2x0aXBzIiwidGl0bGUiLCJpY29uIiwiZmlsdGVyIiwic29ydGFibGUiLCJlbCIsImNsaWNrYWJsZSIsImNvdW50ZXIiLCJlbGVtZW50IiwiYmluZEV2ZW50cyIsInRleHRGaWx0ZXIiLCJ0eXBlIiwiZGVib3VuY2UiLCJzZXJ2ZXIiLCJwcmVwZW5kIiwiZmlsdGVyQ29udGFpbmVyIiwiZmlsdGVycyIsImRlZmF1bHRGaWx0ZXJzIiwicmVuZGVyIiwiZGVsZXRlU3ViamVjdCIsImRlbE1vZGFsIiwicGVyc2lzdCIsInJlcGxhY2UiLCJ4IiwiY2hhckNvZGVBdCIsImJvZHkiLCJ3YXJuaW5nIiwib24iLCJkZXN0cm95Iiwid2FpdCIsInN1Y2Nlc3MiLCJkZWxldGlvblN1Y2Nlc3MiLCJlcnJvciIsImRlbGV0aW9uRXJyb3IiLCJpY29uQ29sb3VyIiwieGhyIiwiYW5zd2VyIiwicGFyc2VSZXNwb25zZSIsInNob3dFcnJvciIsImRldGFpbCIsImluZm8iLCJkb3dubG9hZEFsbEFzc2Vzc21lbnRzIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNQyxTQUFTRCxRQUFRLFFBQVIsQ0FBZjtBQUNBLElBQU1FLElBQUlGLFFBQVEsUUFBUixDQUFWOztBQUVBLElBQU1HLE1BQU1ILFFBQVEsYUFBUixDQUFaO0FBQ0EsSUFBTUksUUFBUUwsU0FBU00s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QUEvRCxFQUFkO0FBQ0EsR0FGRDs7QUFJQSxPQUFLK0QsUUFBTCxDQUFjbEUsSUFBZDtBQUNBLEVBN0srQzs7QUErS2hENkUsa0JBQWlCLHlCQUFTckgsS0FBVCxFQUFnQjtBQUNoQyxPQUFLMEcsUUFBTCxDQUFjUSxPQUFkO0FBQ0FsSSxRQUFNdUUsT0FBTixDQUFjeEUsSUFBSXlFLE1BQUosQ0FBV0MsUUFBWCxDQUFvQkMsS0FBbEMsRUFBeUMsRUFBRUMsU0FBUyxhQUFhM0QsTUFBTW1ELEdBQU4sQ0FBVSxTQUFWLENBQWIsR0FBb0MsdUJBQS9DLEVBQXdFcUMsTUFBTSxjQUE5RSxFQUE4RmdDLFlBQVksS0FBMUcsRUFBekM7QUFDQSxFQWxMK0M7O0FBb0xoREQsZ0JBQWUsdUJBQVN2SCxLQUFULEVBQWdCeUgsR0FBaEIsRUFBcUI7QUFDbkMsTUFBTUMsU0FBUzNJLElBQUk0SSxhQUFKLENBQWtCRixHQUFsQixDQUFmO0FBQ0EsT0FBS2YsUUFBTCxDQUFja0IsU0FBZCxDQUF3Qix1QkFBdUJGLE9BQU9HLE1BQVAsSUFBaUJILE9BQU9JLElBQS9DLENBQXhCO0FBQ0EsRUF2TCtDOztBQXlMaERDLHlCQUF3QixnQ0FBUy9ILEtBQVQsRUFBZ0I7QUFDdkM4QyxTQUFPQyxJQUFQLENBQVkzRCxTQUFTUyxPQUFULEdBQW1CLHdDQUFuQixHQUE4REcsTUFBTW1ELEdBQU4sQ0FBVSxLQUFWLENBQTlELEdBQWlGLHVDQUE3RjtBQUNBO0FBM0wrQyxDQUFoQyxDQUFqQiIsImZpbGUiOiJzdWJqZWN0cy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCByZXN0ZXIgPSByZXF1aXJlKFwicmVzdGVyXCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5cbmNvbnN0IEFwcCA9IHJlcXVpcmUoXCIuLi8uLi9pbmRleFwiKTtcbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcblxuY29uc3QgU2VydmVyR3JpZCA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc2VydmVyR3JpZFwiKTtcbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcbmNvbnN0IFNtYWxsTW9kYWwgPSByZXF1aXJlKFwiLi4vLi4vbGliL3NtYWxsTW9kYWxcIik7XG5jb25zdCBTaW1wbGVNZW51ID0gcmVxdWlyZShcIi4uLy4uL2xpYi9zaW1wbGVNZW51XCIpO1xuY29uc3QgU3ViamVjdE1vZGFsID0gcmVxdWlyZShcIi4vc3ViamVjdE1vZGFsXCIpO1xuXG5jb25zdCBTdWJqZWN0TW9kZWwgPSBCYWNrYm9uZS5FcG94eS5Nb2RlbC5leHRlbmQoe1xuXHRpZEF0dHJpYnV0ZTogXCJzdWJqZWN0X2lkXCIsXG5cblx0dXJsUm9vdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3N1YmplY3RzXCI7XG5cdH0sXG59KTtcblxuY29uc3QgQ29sbGVjdGlvbiA9IEJhY2tib25lLlBhZ2VhYmxlQ29sbGVjdGlvbi5leHRlbmQoe1xuXHRtb2RlbDogU3ViamVjdE1vZGVsLFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3N1YmplY3RzP3BhZ2VkPXRydWVcIjtcblx0fSxcblxuXHRzdGF0ZToge1xuXHRcdHBhZ2VTaXplOiAzMCxcblx0fSxcblx0bW9kZTogXCJzZXJ2ZXJcIixcblxuXHRxdWVyeVBhcmFtczoge1xuXHRcdHBhZ2VTaXplOiBcInBhZ2VTaXplXCIsXG5cdFx0c29ydEtleTogXCJzb3J0QnlcIixcblx0fSxcblxuXHRwYXJzZVN0YXRlOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0cmV0dXJuIHsgdG90YWxSZWNvcmRzOiByZXNwLnRvdGFsIH07XG5cdH0sXG5cblx0cGFyc2VSZWNvcmRzOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0cmV0dXJuIHJlc3Aucm93cztcblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwiY29udGVudCBzdWJqZWN0LW1hbmFnZXJcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9zdWJqZWN0cy5udW5qXCIpLFxuXG5cdHVpOiB7XG5cdFx0ZmlsdGVyQmFyOiBcIi5vcHMtYmFyIC5maWx0ZXJzXCIsXG5cdFx0Y291bnRlckJhcjogXCIub3BzLWJhciAuY291bnRlclwiLFxuXHRcdGFkZFN1YmplY3RJY29uOiBcIi5hZGQtc3ViamVjdFwiLFxuXHRcdGRvd25sb2FkOiBcImRpdi5kb3dubG9hZFwiLFxuXHRcdHBhZ2luZzogXCIucGFnaW5nXCIsXG5cdFx0Z3JpZDogXCJkaXYuZ3JpZFwiLFxuXHR9LFxuXG5cdGNvbGxlY3Rpb25FdmVudHM6IHtcblx0XHRcInRvb2xiYXI6Y2xpY2s6ZGVsZXRlXCI6IFwiZGVsZXRlU3ViamVjdFwiLFxuXHRcdFwidG9vbGJhcjpjbGljazplZGl0XCI6IFwiYWRkRWRpdFN1YmplY3RcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5hZGRTdWJqZWN0SWNvblwiOiBcImFkZEVkaXRTdWJqZWN0XCIsXG5cdFx0XCJjbGljayBAdWkuZG93bmxvYWRcIjogXCJzaG93RG93bmxvYWRzXCIsXG5cdH0sXG5cblx0c2hvd0Rvd25sb2FkczogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0Y29uc3QgbGlzdCA9IG5ldyBTaW1wbGVNZW51KHtcblx0XHRcdGFuY2hvcjogdGhpcy51aS5kb3dubG9hZCxcblx0XHRcdHNpZGU6IFwibGVmdFwiLFxuXHRcdFx0c3RydWN0dXJlOiBbXG5cdFx0XHRcdHsgY2xvc2VPbkNsaWNrOiB0cnVlLCBlbGVtZW50czogW1xuXHRcdFx0XHRcdHsgdGV4dDogXCJFeHBvcnQgbGlzdCBvZiBzdWJqZWN0c1wiLCBpZDogXCJzdWJqZWN0c1wiIH0sXG5cdFx0XHRcdFx0eyB0ZXh0OiBcIkV4cG9ydCBsaXN0IG9mIHN1YmplY3QgZ3JvdXBzXCIsIGlkOiBcInN1YmplY3RHcm91cHNcIiB9LFxuXHRcdFx0XHRcdHsgdGV4dDogXCJFeHBvcnQgbGlzdCBvZiBzdWJqZWN0IGdyb3VwcyAoY29tcGF0aWJsZSB3aXRoIENTViBJbXBvcnRzKVwiLCBpZDogXCJzdWJqZWN0R3JvdXBzRm9ySW1wb3J0XCIgfSxcblx0XHRcdFx0XSB9LFxuXHRcdFx0XSxcblx0XHR9KTtcblx0XHRsaXN0LnNob3coKTtcblxuXHRcdHRoaXMubGlzdGVuVG8obGlzdCwgXCJjbGlja2VkOnN1YmplY3RzXCIsIHRoaXMuZG93bmxvYWRMaXN0LmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8obGlzdCwgXCJjbGlja2VkOnN1YmplY3RHcm91cHNcIiwgdGhpcy5kb3dubG9hZEdyb3VwTGlzdC5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKGxpc3QsIFwiY2xpY2tlZDpzdWJqZWN0R3JvdXBzRm9ySW1wb3J0XCIsIHRoaXMuZG93bmxvYWRHcm91cExpc3RGb3JJbXBvcnQuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0ZG93bmxvYWRMaXN0OiBmdW5jdGlvbigpIHtcblx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9zdWJqZWN0cy9saXN0cy9zdWJqZWN0c1wiKTtcblx0fSxcblxuXHRkb3dubG9hZEdyb3VwTGlzdDogZnVuY3Rpb24oKSB7XG5cdFx0d2luZG93Lm9wZW4oc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvc3ViamVjdHMvbGlzdHMvc3ViamVjdEdyb3Vwc1wiKTtcblx0fSxcblxuXHRkb3dubG9hZEdyb3VwTGlzdEZvckltcG9ydDogZnVuY3Rpb24oKSB7XG5cdFx0d2luZG93Lm9wZW4oc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvc3ViamVjdHMvbGlzdHMvc3ViamVjdEdyb3Vwc0NvbXBhdENTVlwiKTtcblx0fSxcblxuXHRhZGRFZGl0U3ViamVjdDogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRpZiAoc2V0dGluZ3MuZmNDbGllbnQpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRjb25zdCBtb2RhbCA9IG5ldyBTdWJqZWN0TW9kYWwoe1xuXHRcdFx0bW9kZWw6IG1vZGVsIGluc3RhbmNlb2YgQmFja2JvbmUuTW9kZWwgJiYgbW9kZWwuZ2V0KFwic3ViamVjdF9pZFwiKSA/IG1vZGVsIDogbmV3IFN1YmplY3RNb2RlbCgpLFxuXHRcdH0pO1xuXG5cdFx0bW9kYWwuc2hvdyh7XG5cdFx0XHRjcmVhdGU6ICgpID0+IHtcblx0XHRcdFx0dGhpcy5ncmlkLmNvbGxlY3Rpb24uZ2V0Rmlyc3RQYWdlKCk7XG5cblx0XHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7XG5cdFx0XHRcdFx0Y29udGVudDogXCJOZXcgc3ViamVjdCBzdWNjZXNzZnVsbHkgY3JlYXRlZFwiLFxuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRjcmVhdGVBbm90aGVyOiAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuZ3JpZC5jb2xsZWN0aW9uLmdldEZpcnN0UGFnZSgpO1xuXHRcdFx0fSxcblx0XHRcdHVwZGF0ZTogcmVzdWx0ID0+IHtcblx0XHRcdFx0cmVzdWx0Lm1vZGVsLnRyaWdnZXIoXCJncmlkOnJlbmRlclwiKTtcblx0XHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7XG5cdFx0XHRcdFx0Y29udGVudDogXCJTdWJqZWN0IHN1Y2Nlc3NmdWxseSB1cGRhdGVkXCIsXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fSxcblxuXHRmaWx0ZXJEZWxldGU6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0Y29uc3Qgc3ViamVjdCA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cdFx0aWYgKHNldHRpbmdzLmZjQ2xpZW50IHx8IG1vZGVsLmlkID09PSBzdWJqZWN0Ll9pZCB8fCAhcmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5hcGkuc3ViamVjdHMuZGVsZXRlLCBzdWJqZWN0KSlcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdHJldHVybiBfLmV2ZXJ5KG1vZGVsLmdldChcInJvbGVzXCIpLCBrZXkgPT4ga2V5IGluIHNldHRpbmdzLnJvbGVzICYmIHJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAuc3ViamVjdHMuZGVsZXRlW2tleV0sIHN1YmplY3QpKTtcblx0fSxcblxuXHRmaWx0ZXJFZGl0OiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBzdWJqZWN0ID0gcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblxuXHRcdGlmIChzZXR0aW5ncy5mY0NsaWVudCB8fCAhcmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5hcGkuc3ViamVjdHMucHV0LCBzdWJqZWN0KSlcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBjb2x1bW5zID0gW1xuXHRcdFx0eyBuYW1lOiBcInN1YmplY3RcIiwgbGFiZWw6IFwiU3ViamVjdFwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJoaWRkZW5cIiwgbGFiZWw6IFwiSGlkZGVuXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImNhdGVnb3JpZXNfc3RyaW5nXCIsIGxhYmVsOiBcIlNvdXJjZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbGFiZWw6IFwiQWN0aW9uc1wiLCBjZWxsOiBuZXcgU2VydmVyR3JpZC5Ub29sYmFyQ2VsbCh7IHRvb2x0aXBzOiBbXG5cdFx0XHRcdHsgdGl0bGU6IFwiRWRpdFwiLCBpY29uOiBcImZhLWVkaXRcIiwgZmlsdGVyOiB0aGlzLmZpbHRlckVkaXQuYmluZCh0aGlzKSB9LFxuXHRcdFx0XHR7IHRpdGxlOiBcIkRlbGV0ZVwiLCBpY29uOiBcImZhLXRyYXNoLWFsdFwiLCBmaWx0ZXI6IHRoaXMuZmlsdGVyRGVsZXRlLmJpbmQodGhpcykgfSxcblx0XHRcdF0gfSksIGVkaXRhYmxlOiBmYWxzZSwgc29ydGFibGU6IGZhbHNlIH0sXG5cdFx0XTtcblxuXHRcdHRoaXMuZ3JpZCA9IG5ldyBTZXJ2ZXJHcmlkKHtcblx0XHRcdGVsOiB0aGlzLnVpLmdyaWQsXG5cdFx0XHRjb2x1bW5zOiBjb2x1bW5zLFxuXHRcdFx0Y29sbGVjdGlvbjogbmV3IENvbGxlY3Rpb24oKSxcblx0XHRcdGNsaWNrYWJsZTogdHJ1ZSxcblx0XHRcdGNvdW50ZXI6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5jb3VudGVyQmFyLFxuXHRcdFx0XHR0ZW1wbGF0ZTogXCJTdWJqZWN0cyAkc3RhcnQgLSAkZW5kIG9mICR0b3RhbFwiLFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLnBhZ2luZyxcblx0XHRcdH0sXG5cdFx0fSk7XG5cblx0XHR0aGlzLmJpbmRFdmVudHModGhpcy5ncmlkLmNvbGxlY3Rpb24sIHRoaXMuY29sbGVjdGlvbkV2ZW50cyk7XG5cblx0XHRpZiAoIXNldHRpbmdzLmZjQ2xpZW50KVxuXHRcdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmdyaWQsIFwicm93OmNsaWNrZWRcIiwgdGhpcy5hZGRFZGl0U3ViamVjdC5iaW5kKHRoaXMpKTtcblxuXHRcdGNvbnN0IHRleHRGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcInRleHRcIixcblx0XHRcdG5hbWU6IFwidGV4dEZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiVGV4dCBTZWFyY2hcIixcblx0XHRcdGRlYm91bmNlOiAyMDAsXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdHRoaXMudWkuZmlsdGVyQmFyLnByZXBlbmQodGhpcy5ncmlkLmZpbHRlcih7XG5cdFx0XHRmaWx0ZXJDb250YWluZXI6IHRoaXMudWkuZmlsdGVyQmFyLFxuXHRcdFx0ZmlsdGVyczogW3RleHRGaWx0ZXJdLFxuXHRcdFx0ZGVmYXVsdEZpbHRlcnM6IFtcInRleHRGaWx0ZXJcIl0sXG5cdFx0fSkucmVuZGVyKCkuZWwpO1xuXHR9LFxuXG5cdC8qdmlld1N1YmplY3REZXRhaWxzOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdHRoaXMuc3ViamVjdERldGFpbHMgPSBuZXcgU3ViamVjdERldGFpbHMoe1xuXHRcdFx0ZXZlbnRCdXM6IHRoaXMsXG5cdFx0XHRzdWJqZWN0TW9kZWw6IG1vZGVsLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5vbihcInN1YmplY3REZXRhaWxzOmNsb3NlXCIsICgpID0+IHtcblx0XHRcdHRoaXMub2ZmKFwic3ViamVjdERldGFpbHM6Y2xvc2VcIik7XG5cdFx0fSwgdGhpcyk7XG5cblx0XHR0aGlzLnN1YmplY3REZXRhaWxzLnNob3coKTtcblx0fSwqL1xuXG5cdGRlbGV0ZVN1YmplY3Q6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0dGhpcy5kZWxNb2RhbCA9IG5ldyBTbWFsbE1vZGFsKHtcblx0XHRcdHBlcnNpc3Q6IHRydWUsXG5cdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmFsIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJy8+IERlbGV0ZSBTdWJqZWN0OiBcIiArIChtb2RlbC5nZXQoXCJzdWJqZWN0XCIpKS5yZXBsYWNlKC9bXFwmXFw8XFw+XFwnXFxcIl0vZywgeCA9PiBcIiYjXCIgKyB4LmNoYXJDb2RlQXQoMCkgKyBcIjtcIiksXG5cdFx0XHRib2R5OiBcIjxwPkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBzdWJqZWN0PzwvcD5cIixcblx0XHRcdHdhcm5pbmc6IHRydWUsXG5cdFx0fSk7XG5cdFx0dGhpcy5kZWxNb2RhbC5vbihcImJ1dHRvbjpva1wiLCAoKSA9PiB7XG5cdFx0XHRtb2RlbC5kZXN0cm95KHsgd2FpdDogdHJ1ZSwgc3VjY2VzczogdGhpcy5kZWxldGlvblN1Y2Nlc3MuYmluZCh0aGlzKSwgZXJyb3I6IHRoaXMuZGVsZXRpb25FcnJvci5iaW5kKHRoaXMpIH0pO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5kZWxNb2RhbC5zaG93KCk7XG5cdH0sXG5cblx0ZGVsZXRpb25TdWNjZXNzOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdHRoaXMuZGVsTW9kYWwuZGVzdHJveSgpO1xuXHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5Ub2FzdCwgeyBjb250ZW50OiBcIlN1YmplY3QgXCIgKyBtb2RlbC5nZXQoXCJzdWJqZWN0XCIpICsgXCIgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWRcIiwgaWNvbjogXCJmYS10cmFzaC1hbHRcIiwgaWNvbkNvbG91cjogXCJyZWRcIiB9KTtcblx0fSxcblxuXHRkZWxldGlvbkVycm9yOiBmdW5jdGlvbihtb2RlbCwgeGhyKSB7XG5cdFx0Y29uc3QgYW5zd2VyID0gQXBwLnBhcnNlUmVzcG9uc2UoeGhyKTtcblx0XHR0aGlzLmRlbE1vZGFsLnNob3dFcnJvcihcIkRlbGV0aW9uIGZhaWxlZDogXCIgKyAoYW5zd2VyLmRldGFpbCB8fCBhbnN3ZXIuaW5mbykpO1xuXHR9LFxuXG5cdGRvd25sb2FkQWxsQXNzZXNzbWVudHM6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0d2luZG93Lm9wZW4oc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvYXNzZXNzbWVudHMvc3R1ZGVudC9hbGxtYXJrcy9cIiArIG1vZGVsLmdldChcIl9pZFwiKSArIFwiL3JlcG9ydD9pbmRpdmlkdWFsPXRydWUmYWxsTWFya3M9dHJ1ZVwiKTtcblx0fSxcbn0pOyJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\n\nvar modalKit = require(\"../../../lib/modalKit/modal\");\nvar Selectra = require(\"../../../lib/selectra\");\nvar StatusView = require(\"../../../lib/statusView\");\n\nvar MODAL_TITLE = \"Create a temporary password\";\n\n// -----------------------------------------------------------------------------\n// Display\n// -----------------------------------------------------------------------------\n\nvar CreateModalDisplayBody = modalKit.Body.extend({\n\tclassName: \"temporary-password-creation-modal-display-body\",\n\n\ttemplate: require(\"../../templates/temporaryPasswords/createModal.nunj\").displayBody\n});\n\nvar CreateModalDisplayPage = modalKit.Page.extend({\n\theaderView: function headerView() {\n\t\treturn modalKit.Header.extend({ title: \"Temporary Password\" });\n\t},\n\n\tbodyView: function bodyView() {\n\t\treturn CreateModalDisplayBody;\n\t},\n\n\tfooterView: function footerView() {\n\t\treturn modalKit.Footer.extend({\n\t\t\tbehaviors: {\n\t\t\t\tCloseButton: {}\n\t\t\t}\n\t\t});\n\t},\n\n\tonClose: function onClose() {\n\t\tthis.closeModal(\"close:success\");\n\t}\n});\n\n// -----------------------------------------------------------------------------\n// Error\n// -----------------------------------------------------------------------------\n\nvar CreateModalErrorBody = modalKit.Body.extend({\n\tclassName: \"temporary-password-creation-modal-error-body\",\n\n\ttemplate: require(\"../../templates/temporaryPasswords/createModal.nunj\").errorBody\n});\n\nvar CreateModalErrorPage = modalKit.Page.extend({\n\theaderView: function headerView() {\n\t\treturn modalKit.Header.extend({ title: MODAL_TITLE });\n\t},\n\n\tbodyView: function bodyView() {\n\t\treturn CreateModalErrorBody;\n\t},\n\n\tfooterView: function footerView() {\n\t\treturn modalKit.Footer.extend({\n\t\t\tbehaviors: {\n\t\t\t\tCloseButton: {}\n\t\t\t}\n\t\t});\n\t},\n\n\tonClose: function onClose() {\n\t\tthis.closeModal(\"close:error\");\n\t}\n});\n\n// -----------------------------------------------------------------------------\n// Status\n// -----------------------------------------------------------------------------\n\nvar CreateModalStatusBody = modalKit.Body.extend({\n\tclassName: \"temporary-password-creation-modal-status-body\",\n\n\ttemplate: require(\"../../templates/temporaryPasswords/createModal.nunj\").statusBody,\n\n\tregions: {\n\t\tstatus: \".status-region\"\n\t},\n\n\tonRender: function onRender() {\n\t\t// Create the status view\n\t\tthis.showChildView(\"status\", new StatusView({\n\t\t\tmessage: \"Generating temporary password...\",\n\t\t\ttype: \"loading\"\n\t\t}));\n\n\t\t// Generate the temporary password\n\t\tthis.saveModel();\n\t},\n\n\tonModelSaved: function onModelSaved() {\n\t\tthis.changePage(\"display\");\n\t},\n\n\tonModelError: function onModelError(model, response) {\n\t\tvar responseHash = JSON.parse(response.responseText);\n\n\t\tif (responseHash.info) this.model.set(\"_error\", responseHash.info);\n\n\t\tthis.changePage(\"error\");\n\t}\n});\n\nvar CreateModalStatusPage = modalKit.Page.extend({\n\theaderView: function headerView() {\n\t\treturn modalKit.Header.extend({ title: MODAL_TITLE });\n\t},\n\n\tbodyView: function bodyView() {\n\t\treturn CreateModalStatusBody;\n\t},\n\n\tfooterView: function footerView() {\n\t\treturn modalKit.Footer.extend({\n\t\t\tbehaviors: {}\n\t\t});\n\t}\n});\n\n// -----------------------------------------------------------------------------\n// Form\n// -----------------------------------------------------------------------------\n\nvar CreateModalFormBody = modalKit.Body.extend({\n\tclassName: \"temporary-password-creation-modal-form-body\",\n\n\ttemplate: require(\"../../templates/temporaryPasswords/createModal.nunj\").formBody,\n\n\tregions: {\n\t\tuserSelector: \".user-selector-region\"\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.listenTo(Backbone.Radio.channel(\"userSelector\"), \"Events.ValueChanged\", this.onUserSelected.bind(this));\n\n\t\tvar userSelector = new Selectra({\n\t\t\tbusChannel: \"userSelector\",\n\t\t\tserver: {\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/users\",\n\t\t\t\tdelayLoad: true,\n\t\t\t\tmap: function map(x) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkey: x.user_id,\n\t\t\t\t\t\tvalue: x.firstname + \" \" + x.surname + \" (\" + x.username + \")\"\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 20,\n\t\t\t\tinfinite: true\n\t\t\t},\n\t\t\tplaceholder: \"No user selected\",\n\t\t\tddHost: \".modal-container\"\n\t\t});\n\n\t\tthis.showChildView(\"userSelector\", userSelector);\n\t},\n\n\tonUserSelected: function onUserSelected(user_id) {\n\t\tthis.model.set(\"user_id\", user_id);\n\t}\n});\n\nvar CreateModalFormPage = modalKit.Page.extend({\n\theaderView: function headerView() {\n\t\treturn modalKit.Header.extend({ title: MODAL_TITLE });\n\t},\n\n\tbodyView: function bodyView() {\n\t\treturn CreateModalFormBody;\n\t},\n\n\tfooterView: function footerView() {\n\t\treturn modalKit.Footer.extend({\n\t\t\tbehaviors: {\n\t\t\t\tAcceptButton: { requireValidation: true },\n\t\t\t\tCancelButton: {}\n\t\t\t}\n\t\t});\n\t},\n\n\tonAccept: function onAccept() {\n\t\tthis.changePage(\"status\");\n\t},\n\n\tonCancel: function onCancel() {\n\t\tthis.closeModal(\"cancel\");\n\t}\n});\n\n// -----------------------------------------------------------------------------\n// Host\n// -----------------------------------------------------------------------------\n\nmodule.exports = modalKit.Host.extend({\n\tpages: {\n\t\tform: CreateModalFormPage,\n\t\tstatus: CreateModalStatusPage,\n\t\terror: CreateModalErrorPage,\n\t\tdisplay: CreateModalDisplayPage\n\t},\n\n\toptions: {\n\t\tfirstPage: \"form\"\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNyZWF0ZU1vZGFsLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsInNldHRpbmdzIiwibW9kYWxLaXQiLCJTZWxlY3RyYSIsIlN0YXR1c1ZpZXciLCJNT0RBTF9USVRMRSIsIkNyZWF0ZU1vZGFsRGlzcGxheUJvZHkiLCJCb2R5IiwiZXh0ZW5kIiwiY2xhc3NOYW1lIiwidGVtcGxhdGUiLCJkaXNwbGF5Qm9keSIsIkNyZWF0ZU1vZGFsRGlzcGxheVBhZ2UiLCJQYWdlIiwiaGVhZGVyVmlldyIsIkhlYWRlciIsInRpdGxlIiwiYm9keVZpZXciLCJmb290ZXJWaWV3IiwiRm9vdGVyIiwiYmVoYXZpb3JzIiwiQ2xvc2VCdXR0b24iLCJvbkNsb3NlIiwiY2xvc2VNb2RhbCIsIkNyZWF0ZU1vZGFsRXJyb3JCb2R5IiwiZXJyb3JCb2R5IiwiQ3JlYXRlTW9kYWxFcnJvclBhZ2UiLCJDcmVhdGVNb2RhbFN0YXR1c0JvZHkiLCJzdGF0dXNCb2R5IiwicmVnaW9ucyIsInN0YXR1cyIsIm9uUmVuZGVyIiwic2hvd0NoaWxkVmlldyIsIm1lc3NhZ2UiLCJ0eXBlIiwic2F2ZU1vZGVsIiwib25Nb2RlbFNhdmVkIiwiY2hhbmdlUGFnZSIsIm9uTW9kZWxFcnJvciIsIm1vZGVsIiwicmVzcG9uc2UiLCJyZXNwb25zZUhhc2giLCJKU09OIiwicGFyc2UiLCJyZXNwb25zZVRleHQiLCJpbmZvIiwic2V0IiwiQ3JlYXRlTW9kYWxTdGF0dXNQYWdlIiwiQ3JlYXRlTW9kYWxGb3JtQm9keSIsImZvcm1Cb2R5IiwidXNlclNlbGVjdG9yIiwibGlzdGVuVG8iLCJSYWRpbyIsImNoYW5uZWwiLCJvblVzZXJTZWxlY3RlZCIsImJpbmQiLCJidXNDaGFubmVsIiwic2VydmVyIiwiZmV0Y2giLCJ1cmxSb290IiwiZGVsYXlMb2FkIiwibWFwIiwia2V5IiwieCIsInVzZXJfaWQiLCJ2YWx1ZSIsImZpcnN0bmFtZSIsInN1cm5hbWUiLCJ1c2VybmFtZSIsInBhZ2luZyIsInBhZ2VTaXplIiwiaW5maW5pdGUiLCJwbGFjZWhvbGRlciIsImRkSG9zdCIsIkNyZWF0ZU1vZGFsRm9ybVBhZ2UiLCJBY2NlcHRCdXR0b24iLCJyZXF1aXJlVmFsaWRhdGlvbiIsIkNhbmNlbEJ1dHRvbiIsIm9uQWNjZXB0Iiwib25DYW5jZWwiLCJtb2R1bGUiLCJleHBvcnRzIiwiSG9zdCIsInBhZ2VzIiwiZm9ybSIsImVycm9yIiwiZGlzcGxheSIsIm9wdGlvbnMiLCJmaXJzdFBhZ2UiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjs7QUFFQSxJQUFNQyxXQUFXRCxRQUFRLGNBQVIsQ0FBakI7O0FBRUEsSUFBTUUsV0FBV0YsUUFBUSw2QkFBUixDQUFqQjtBQUNBLElBQU1HLFdBQVdILFFBQVEsdUJBQVIsQ0FBakI7QUFDQSxJQUFNSSxhQUFhSixRQUFRLHlCQUFSLENBQW5COztBQUVBLElBQU1LLGNBQWMsNkJBQXBCOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxJQUFNQyx5QkFBeUJKLFNBQVNLLElBQVQsQ0FBY0MsTUFBZCxDQUFxQjtBQUNuREMsWUFBVyxnREFEd0M7O0FBR25EQyxXQUFVVixRQUFRLHFEQUFSLEVBQStEVztBQUh0QixDQUFyQixDQUEvQjs7QUFNQSxJQUFNQyx5QkFBeUJWLFNBQVNXLElBQVQsQ0FBY0wsTUFBZCxDQUFxQjtBQUNuRE0sYUFBWSxzQkFBVztBQUN0QixTQUFPWixTQUFTYSxNQUFULENBQWdCUCxNQUFoQixDQUF1QixFQUFFUSxPQUFPLG9CQUFULEVBQXZCLENBQVA7QUFDQSxFQUhrRDs7QUFLbkRDLFdBQVUsb0JBQVc7QUFDcEIsU0FBT1gsc0JBQVA7QUFDQSxFQVBrRDs7QUFTbkRZLGFBQVksc0JBQVc7QUFDdEIsU0FBT2hCLFNBQVNpQixNQUFULENBQWdCWCxNQUFoQixDQUF1QjtBQUM3QlksY0FBVztBQUNWQyxpQkFBYTtBQURIO0FBRGtCLEdBQXZCLENBQVA7QUFLQSxFQWZrRDs7QUFpQm5EQyxVQUFTLG1CQUFXO0FB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QitDOztBQWtCaERDLFdBQVUsb0JBQVc7QUFDcEIsT0FBS3pDLFVBQUwsQ0FBZ0IsUUFBaEI7QUFDQSxFQXBCK0M7O0FBc0JoRDBDLFdBQVUsb0JBQVc7QUFDcEIsT0FBS3hELFVBQUwsQ0FBZ0IsUUFBaEI7QUFDQTtBQXhCK0MsQ0FBckIsQ0FBNUI7O0FBMkJBO0FBQ0E7QUFDQTs7QUFFQXlELE9BQU9DLE9BQVAsR0FBaUIvRSxTQUFTZ0YsSUFBVCxDQUFjMUUsTUFBZCxDQUFxQjtBQUNyQzJFLFFBQU87QUFDTkMsUUFBTVYsbUJBREE7QUFFTjVDLFVBQVFpQixxQkFGRjtBQUdOc0MsU0FBTzNELG9CQUhEO0FBSU40RCxXQUFTMUU7QUFKSCxFQUQ4Qjs7QUFRckMyRSxVQUFTO0FBQ1JDLGFBQVc7QUFESDtBQVI0QixDQUFyQixDQUFqQiIsImZpbGUiOiJjcmVhdGVNb2RhbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5cbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxuY29uc3QgbW9kYWxLaXQgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL21vZGFsS2l0L21vZGFsXCIpO1xuY29uc3QgU2VsZWN0cmEgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL3NlbGVjdHJhXCIpO1xuY29uc3QgU3RhdHVzVmlldyA9IHJlcXVpcmUoXCIuLi8uLi8uLi9saWIvc3RhdHVzVmlld1wiKTtcblxuY29uc3QgTU9EQUxfVElUTEUgPSBcIkNyZWF0ZSBhIHRlbXBvcmFyeSBwYXNzd29yZFwiO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRGlzcGxheVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgQ3JlYXRlTW9kYWxEaXNwbGF5Qm9keSA9IG1vZGFsS2l0LkJvZHkuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInRlbXBvcmFyeS1wYXNzd29yZC1jcmVhdGlvbi1tb2RhbC1kaXNwbGF5LWJvZHlcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy90ZW1wb3JhcnlQYXNzd29yZHMvY3JlYXRlTW9kYWwubnVualwiKS5kaXNwbGF5Qm9keSxcbn0pO1xuXG5jb25zdCBDcmVhdGVNb2RhbERpc3BsYXlQYWdlID0gbW9kYWxLaXQuUGFnZS5leHRlbmQoe1xuXHRoZWFkZXJWaWV3OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gbW9kYWxLaXQuSGVhZGVyLmV4dGVuZCh7IHRpdGxlOiBcIlRlbXBvcmFyeSBQYXNzd29yZFwiIH0pO1xuXHR9LFxuXG5cdGJvZHlWaWV3OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gQ3JlYXRlTW9kYWxEaXNwbGF5Qm9keTtcblx0fSxcblxuXHRmb290ZXJWaWV3OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gbW9kYWxLaXQuRm9vdGVyLmV4dGVuZCh7XG5cdFx0XHRiZWhhdmlvcnM6IHtcblx0XHRcdFx0Q2xvc2VCdXR0b246IHt9LFxuXHRcdFx0fSxcblx0XHR9KTtcblx0fSxcblxuXHRvbkNsb3NlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmNsb3NlTW9kYWwoXCJjbG9zZTpzdWNjZXNzXCIpO1xuXHR9LFxufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFcnJvclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgQ3JlYXRlTW9kYWxFcnJvckJvZHkgPSBtb2RhbEtpdC5Cb2R5LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJ0ZW1wb3JhcnktcGFzc3dvcmQtY3JlYXRpb24tbW9kYWwtZXJyb3ItYm9keVwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL3RlbXBvcmFyeVBhc3N3b3Jkcy9jcmVhdGVNb2RhbC5udW5qXCIpLmVycm9yQm9keSxcbn0pO1xuXG5jb25zdCBDcmVhdGVNb2RhbEVycm9yUGFnZSA9IG1vZGFsS2l0LlBhZ2UuZXh0ZW5kKHtcblx0aGVhZGVyVmlldzogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIG1vZGFsS2l0LkhlYWRlci5leHRlbmQoeyB0aXRsZTogTU9EQUxfVElUTEUgfSk7XG5cdH0sXG5cblx0Ym9keVZpZXc6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBDcmVhdGVNb2RhbEVycm9yQm9keTtcblx0fSxcblxuXHRmb290ZXJWaWV3OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gbW9kYWxLaXQuRm9vdGVyLmV4dGVuZCh7XG5cdFx0XHRiZWhhdmlvcnM6IHtcblx0XHRcdFx0Q2xvc2VCdXR0b246IHt9LFxuXHRcdFx0fSxcblx0XHR9KTtcblx0fSxcblxuXHRvbkNsb3NlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmNsb3NlTW9kYWwoXCJjbG9zZTplcnJvclwiKTtcblx0fSxcbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gU3RhdHVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBDcmVhdGVNb2RhbFN0YXR1c0JvZHkgPSBtb2RhbEtpdC5Cb2R5LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJ0ZW1wb3JhcnktcGFzc3dvcmQtY3JlYXRpb24tbW9kYWwtc3RhdHVzLWJvZHlcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy90ZW1wb3JhcnlQYXNzd29yZHMvY3JlYXRlTW9kYWwubnVualwiKS5zdGF0dXNCb2R5LFxuXG5cdHJlZ2lvbnM6IHtcblx0XHRzdGF0dXM6IFwiLnN0YXR1cy1yZWdpb25cIixcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gQ3JlYXRlIHRoZSBzdGF0dXMgdmlld1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcInN0YXR1c1wiLCBuZXcgU3RhdHVzVmlldyh7XG5cdFx0XHRtZXNzYWdlOiBcIkdlbmVyYXRpbmcgdGVtcG9yYXJ5IHBhc3N3b3JkLi4uXCIsXG5cdFx0XHR0eXBlOiBcImxvYWRpbmdcIixcblx0XHR9KSk7XG5cblx0XHQvLyBHZW5lcmF0ZSB0aGUgdGVtcG9yYXJ5IHBhc3N3b3JkXG5cdFx0dGhpcy5zYXZlTW9kZWwoKTtcblx0fSxcblxuXHRvbk1vZGVsU2F2ZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY2hhbmdlUGFnZShcImRpc3BsYXlcIik7XG5cdH0sXG5cblx0b25Nb2RlbEVycm9yOiBmdW5jdGlvbihtb2RlbCwgcmVzcG9uc2UpIHtcblx0XHRjb25zdCByZXNwb25zZUhhc2ggPSBKU09OLnBhcnNlKHJlc3BvbnNlLnJlc3BvbnNlVGV4dCk7XG5cblx0XHRpZiAocmVzcG9uc2VIYXNoLmluZm8pXG5cdFx0XHR0aGlzLm1vZGVsLnNldChcIl9lcnJvclwiLCByZXNwb25zZUhhc2guaW5mbyk7XG5cblx0XHR0aGlzLmNoYW5nZVBhZ2UoXCJlcnJvclwiKTtcblx0fSxcbn0pO1xuXG5jb25zdCBDcmVhdGVNb2RhbFN0YXR1c1BhZ2UgPSBtb2RhbEtpdC5QYWdlLmV4dGVuZCh7XG5cdGhlYWRlclZpZXc6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBtb2RhbEtpdC5IZWFkZXIuZXh0ZW5kKHsgdGl0bGU6IE1PREFMX1RJVExFIH0pO1xuXHR9LFxuXG5cdGJvZHlWaWV3OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gQ3JlYXRlTW9kYWxTdGF0dXNCb2R5O1xuXHR9LFxuXG5cdGZvb3RlclZpZXc6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBtb2RhbEtpdC5Gb290ZXIuZXh0ZW5kKHtcblx0XHRcdGJlaGF2aW9yczoge1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fSxcbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRm9ybVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgQ3JlYXRlTW9kYWxGb3JtQm9keSA9IG1vZGFsS2l0LkJvZHkuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInRlbXBvcmFyeS1wYXNzd29yZC1jcmVhdGlvbi1tb2RhbC1mb3JtLWJvZHlcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy90ZW1wb3JhcnlQYXNzd29yZHMvY3JlYXRlTW9kYWwubnVualwiKS5mb3JtQm9keSxcblxuXHRyZWdpb25zOiB7XG5cdFx0dXNlclNlbGVjdG9yOiBcIi51c2VyLXNlbGVjdG9yLXJlZ2lvblwiLFxuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmxpc3RlblRvKEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJ1c2VyU2VsZWN0b3JcIiksIFwiRXZlbnRzLlZhbHVlQ2hhbmdlZFwiLCB0aGlzLm9uVXNlclNlbGVjdGVkLmJpbmQodGhpcykpO1xuXG5cdFx0Y29uc3QgdXNlclNlbGVjdG9yID0gbmV3IFNlbGVjdHJhKHtcblx0XHRcdGJ1c0NoYW5uZWw6IFwidXNlclNlbGVjdG9yXCIsXG5cdFx0XHRzZXJ2ZXI6IHtcblx0XHRcdFx0ZmV0Y2g6IGAke3NldHRpbmdzLnVybFJvb3R9L2FwaS8xLjAvdXNlcnNgLFxuXHRcdFx0XHRkZWxheUxvYWQ6IHRydWUsXG5cdFx0XHRcdG1hcDogeCA9PiAoe1xuXHRcdFx0XHRcdGtleTogeC51c2VyX2lkLFxuXHRcdFx0XHRcdHZhbHVlOiB4LmZpcnN0bmFtZSArIFwiIFwiICsgeC5zdXJuYW1lICsgXCIgKFwiICsgeC51c2VybmFtZSArIFwiKVwiLFxuXHRcdFx0XHR9KSxcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0cGFnZVNpemU6IDIwLFxuXHRcdFx0XHRpbmZpbml0ZTogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0XHRwbGFjZWhvbGRlcjogXCJObyB1c2VyIHNlbGVjdGVkXCIsXG5cdFx0XHRkZEhvc3Q6IFwiLm1vZGFsLWNvbnRhaW5lclwiLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwidXNlclNlbGVjdG9yXCIsIHVzZXJTZWxlY3Rvcik7XG5cdH0sXG5cblx0b25Vc2VyU2VsZWN0ZWQ6IGZ1bmN0aW9uKHVzZXJfaWQpIHtcblx0XHR0aGlzLm1vZGVsLnNldChcInVzZXJfaWRcIiwgdXNlcl9pZCk7XG5cdH0sXG59KTtcblxuY29uc3QgQ3JlYXRlTW9kYWxGb3JtUGFnZSA9IG1vZGFsS2l0LlBhZ2UuZXh0ZW5kKHtcblx0aGVhZGVyVmlldzogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIG1vZGFsS2l0LkhlYWRlci5leHRlbmQoeyB0aXRsZTogTU9EQUxfVElUTEUgfSk7XG5cdH0sXG5cblx0Ym9keVZpZXc6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBDcmVhdGVNb2RhbEZvcm1Cb2R5O1xuXHR9LFxuXG5cdGZvb3RlclZpZXc6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBtb2RhbEtpdC5Gb290ZXIuZXh0ZW5kKHtcblx0XHRcdGJlaGF2aW9yczoge1xuXHRcdFx0XHRBY2NlcHRCdXR0b246IHsgcmVxdWlyZVZhbGlkYXRpb246IHRydWUgfSxcblx0XHRcdFx0Q2FuY2VsQnV0dG9uOiB7fSxcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH0sXG5cblx0b25BY2NlcHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY2hhbmdlUGFnZShcInN0YXR1c1wiKTtcblx0fSxcblxuXHRvbkNhbmNlbDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jbG9zZU1vZGFsKFwiY2FuY2VsXCIpO1xuXHR9LFxufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBIb3N0XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1vZGFsS2l0Lkhvc3QuZXh0ZW5kKHtcblx0cGFnZXM6IHtcblx0XHRmb3JtOiBDcmVhdGVNb2RhbEZvcm1QYWdlLFxuXHRcdHN0YXR1czogQ3JlYXRlTW9kYWxTdGF0dXNQYWdlLFxuXHRcdGVycm9yOiBDcmVhdGVNb2RhbEVycm9yUGFnZSxcblx0XHRkaXNwbGF5OiBDcmVhdGVNb2RhbERpc3BsYXlQYWdlLFxuXHR9LFxuXG5cdG9wdGlvbnM6IHtcblx0XHRmaXJzdFBhZ2U6IFwiZm9ybVwiLFxuXHR9LFxufSk7XG4iXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar ManagerView = require(\"./manager\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"fixed-content temporary-password-layout\",\n\n\ttemplate: require(\"../../templates/temporaryPasswords/layout.nunj\"),\n\n\tregions: {\n\t\tmanager: \".manager-region\"\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.showChildView(\"manager\", new ManagerView());\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxheW91dC5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCJNYW5hZ2VyVmlldyIsIm1vZHVsZSIsImV4cG9ydHMiLCJNYXJpb25ldHRlIiwiVmlldyIsImV4dGVuZCIsImNsYXNzTmFtZSIsInRlbXBsYXRlIiwicmVnaW9ucyIsIm1hbmFnZXIiLCJvblJlbmRlciIsInNob3dDaGlsZFZpZXciXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjs7QUFFQSxJQUFNQyxjQUFjRCxRQUFRLFdBQVIsQ0FBcEI7O0FBRUFFLE9BQU9DLE9BQVAsR0FBaUJKLFNBQVNLLFVBQVQsQ0FBb0JDLElBQXBCLENBQXlCQyxNQUF6QixDQUFnQztBQUNoREMsWUFBVyx5Q0FEcUM7O0FBR2hEQyxXQUFVUixRQUFRLGdEQUFSLENBSHNDOztBQUtoRFMsVUFBUztBQUNSQyxXQUFTO0FBREQsRUFMdUM7O0FBU2hEQyxXQUFVLG9CQUFXO0FBQ3BCLE9BQUtDLGFBQUwsQ0FBbUIsU0FBbkIsRUFBOEIsSUFBSVgsV0FBSixFQUE5QjtBQUNBO0FBWCtDLENBQWhDLENBQWpCIiwiZmlsZSI6ImxheW91dC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5cbmNvbnN0IE1hbmFnZXJWaWV3ID0gcmVxdWlyZShcIi4vbWFuYWdlclwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImZpeGVkLWNvbnRlbnQgdGVtcG9yYXJ5LXBhc3N3b3JkLWxheW91dFwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL3RlbXBvcmFyeVBhc3N3b3Jkcy9sYXlvdXQubnVualwiKSxcblxuXHRyZWdpb25zOiB7XG5cdFx0bWFuYWdlcjogXCIubWFuYWdlci1yZWdpb25cIixcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwibWFuYWdlclwiLCBuZXcgTWFuYWdlclZpZXcoKSk7XG5cdH0sXG59KTtcbiJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar ServerGrid = require(\"../../../lib/serverGrid\");\n\nvar CreateModal = require(\"./createModal\");\nvar TemporaryPasswordCollection = require(\"../../collections/temporaryPasswordCollection\");\nvar TemporaryPasswordModel = require(\"../../models/temporaryPasswordModel\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"content temporary-password-manager\",\n\n\ttemplate: require(\"../../templates/temporaryPasswords/manager.nunj\"),\n\n\tui: {\n\t\tbuttonAdd: \".button-add\",\n\t\tcounter: \".ops-bar .counter\",\n\t\tfilters: \".ops-bar .filters .filters-managed\",\n\t\tincludeInvalid: \"input[type='checkbox']#include-invalid\",\n\t\tpaging: \".paging\",\n\t\tgrid: \"div.grid\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonAdd\": \"onButtonAddClick\",\n\t\t\"change @ui.includeInvalid\": \"onIncludeInvalidChange\"\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"username\", label: \"Username\", cell: \"string\", editable: false }, { name: \"surname\", label: \"Surname\", cell: \"string\", editable: false }, { name: \"firstname\", label: \"First Name\", cell: \"string\", editable: false }, {\n\t\t\tname: \"created\", label: \"Created\", editable: false, cell: ServerGrid.MomentCell.extend({\n\t\t\t\tmodelInUnixTimestamp: true,\n\t\t\t\tdisplayFormat: \"DD MMM YYYY, HH:mm a\",\n\t\t\t\tdisplayInUTC: false\n\t\t\t})\n\t\t}, {\n\t\t\tname: \"expires\", label: \"Expires\", editable: false, cell: ServerGrid.MomentCell.extend({\n\t\t\t\tmodelInUnixTimestamp: true,\n\t\t\t\tdisplayFormat: \"DD MMM YYYY, HH:mm a\",\n\t\t\t\tdisplayInUTC: false\n\t\t\t})\n\t\t}, { name: \"password\", label: \"Password\", cell: \"string\", editable: false }, { name: \"authenticated\", label: \"Authenticated?\", editable: false, cell: ServerGrid.BooleanIconCell.extend({}), sortable: false }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new TemporaryPasswordCollection(),\n\t\t\tclickable: true,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counter,\n\t\t\t\ttemplate: \"Temporary passwords $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tthis.bindEvents(this.grid.collection, this.collectionEvents);\n\n\t\t//\t\tthis.listenTo(this.grid, \"row:clicked\", this.addEditToken.bind(this));\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar filterList = [textFilter];\n\n\t\tthis.ui.filters.prepend(this.grid.filter({\n\t\t\tdefaultFilters: [\"textFilter\"],\n\t\t\tfilterContainer: this.ui.filters,\n\t\t\tfilters: filterList\n\t\t}).render().el);\n\t},\n\n\tonButtonAddClick: function onButtonAddClick() {\n\t\tthis.addNewTemporaryPassword();\n\t},\n\n\tonIncludeInvalidChange: function onIncludeInvalidChange() {\n\t\tBackbone.Radio.channel(\"temporaryPasswords\").trigger(\"filter:includeInvalid\", this.ui.includeInvalid.prop(\"checked\"));\n\t},\n\n\taddNewTemporaryPassword: function addNewTemporaryPassword() {\n\t\tvar _this = this;\n\n\t\tvar modal = new CreateModal({\n\t\t\tmodel: new TemporaryPasswordModel()\n\t\t});\n\n\t\tthis.listenTo(modal, \"close:success\", function () {\n\t\t\t_this.grid.collection.fetch({ reset: true });\n\t\t\t_this.stopListening(modal);\n\t\t});\n\n\t\tthis.listenTo(modal, \"close:error\", function () {\n\t\t\t_this.stopListening(modal);\n\t\t});\n\n\t\tthis.listenTo(modal, \"cancel\", function () {\n\t\t\t_this.stopListening(modal);\n\t\t});\n\n\t\tmodal.show();\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1hbmFnZXIuanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwiU2VydmVyR3JpZCIsIkNyZWF0ZU1vZGFsIiwiVGVtcG9yYXJ5UGFzc3dvcmRDb2xsZWN0aW9uIiwiVGVtcG9yYXJ5UGFzc3dvcmRNb2RlbCIsIm1vZHVsZSIsImV4cG9ydHMiLCJNYXJpb25ldHRlIiwiVmlldyIsImV4dGVuZCIsInRhZ05hbWUiLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsInVpIiwiYnV0dG9uQWRkIiwiY291bnRlciIsImZpbHRlcnMiLCJpbmNsdWRlSW52YWxpZCIsInBhZ2luZyIsImdyaWQiLCJldmVudHMiLCJvblJlbmRlciIsImNvbHVtbnMiLCJuYW1lIiwibGFiZWwiLCJjZWxsIiwiZWRpdGFibGUiLCJNb21lbnRDZWxsIiwibW9kZWxJblVuaXhUaW1lc3RhbXAiLCJkaXNwbGF5Rm9ybWF0IiwiZGlzcGxheUluVVRDIiwiQm9vbGVhbkljb25DZWxsIiwic29ydGFibGUiLCJlbCIsImNvbGxlY3Rpb24iLCJjbGlja2FibGUiLCJlbGVtZW50IiwiYmluZEV2ZW50cyIsImNvbGxlY3Rpb25FdmVudHMiLCJ0ZXh0RmlsdGVyIiwidHlwZSIsImRlYm91bmNlIiwic2VydmVyIiwiZmlsdGVyTGlzdCIsInByZXBlbmQiLCJmaWx0ZXIiLCJkZWZhdWx0RmlsdGVycyIsImZpbHRlckNvbnRhaW5lciIsInJlbmRlciIsIm9uQnV0dG9uQWRkQ2xpY2siLCJhZGROZXdUZW1wb3JhcnlQYXNzd29yZCIsIm9uSW5jbHVkZUludmFsaWRDaGFuZ2UiLCJSYWRpbyIsImNoYW5uZWwiLCJ0cmlnZ2VyIiwicHJvcCIsIm1vZGFsIiwibW9kZWwiLCJsaXN0ZW5UbyIsImZldGNoIiwicmVzZXQiLCJzdG9wTGlzdGVuaW5nIiwic2hvdyJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCOztBQUVBLElBQU1DLGFBQWFELFFBQVEseUJBQVIs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QiIsImZpbGUiOiJtYW5hZ2VyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcblxuY29uc3QgU2VydmVyR3JpZCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9saWIvc2VydmVyR3JpZFwiKTtcblxuY29uc3QgQ3JlYXRlTW9kYWwgPSByZXF1aXJlKFwiLi9jcmVhdGVNb2RhbFwiKTtcbmNvbnN0IFRlbXBvcmFyeVBhc3N3b3JkQ29sbGVjdGlvbiA9IHJlcXVpcmUoXCIuLi8uLi9jb2xsZWN0aW9ucy90ZW1wb3JhcnlQYXNzd29yZENvbGxlY3Rpb25cIik7XG5jb25zdCBUZW1wb3JhcnlQYXNzd29yZE1vZGVsID0gcmVxdWlyZShcIi4uLy4uL21vZGVscy90ZW1wb3JhcnlQYXNzd29yZE1vZGVsXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwiY29udGVudCB0ZW1wb3JhcnktcGFzc3dvcmQtbWFuYWdlclwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL3RlbXBvcmFyeVBhc3N3b3Jkcy9tYW5hZ2VyLm51bmpcIiksXG5cblx0dWk6IHtcblx0XHRidXR0b25BZGQ6IFwiLmJ1dHRvbi1hZGRcIixcblx0XHRjb3VudGVyOiBcIi5vcHMtYmFyIC5jb3VudGVyXCIsXG5cdFx0ZmlsdGVyczogXCIub3BzLWJhciAuZmlsdGVycyAuZmlsdGVycy1tYW5hZ2VkXCIsXG5cdFx0aW5jbHVkZUludmFsaWQ6IFwiaW5wdXRbdHlwZT0nY2hlY2tib3gnXSNpbmNsdWRlLWludmFsaWRcIixcblx0XHRwYWdpbmc6IFwiLnBhZ2luZ1wiLFxuXHRcdGdyaWQ6IFwiZGl2LmdyaWRcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5idXR0b25BZGRcIjogXCJvbkJ1dHRvbkFkZENsaWNrXCIsXG5cdFx0XCJjaGFuZ2UgQHVpLmluY2x1ZGVJbnZhbGlkXCI6IFwib25JbmNsdWRlSW52YWxpZENoYW5nZVwiLFxuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBjb2x1bW5zID0gW1xuXHRcdFx0eyBuYW1lOiBcInVzZXJuYW1lXCIsIGxhYmVsOiBcIlVzZXJuYW1lXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcInN1cm5hbWVcIiwgbGFiZWw6IFwiU3VybmFtZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJmaXJzdG5hbWVcIiwgbGFiZWw6IFwiRmlyc3QgTmFtZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCJjcmVhdGVkXCIsIGxhYmVsOiBcIkNyZWF0ZWRcIiwgZWRpdGFibGU6IGZhbHNlLCBjZWxsOiBTZXJ2ZXJHcmlkLk1vbWVudENlbGwuZXh0ZW5kKHtcblx0XHRcdFx0XHRtb2RlbEluVW5peFRpbWVzdGFtcDogdHJ1ZSxcblx0XHRcdFx0XHRkaXNwbGF5Rm9ybWF0OiBcIkREIE1NTSBZWVlZLCBISDptbSBhXCIsXG5cdFx0XHRcdFx0ZGlzcGxheUluVVRDOiBmYWxzZSxcblx0XHRcdFx0fSksXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcImV4cGlyZXNcIiwgbGFiZWw6IFwiRXhwaXJlc1wiLCBlZGl0YWJsZTogZmFsc2UsIGNlbGw6IFNlcnZlckdyaWQuTW9tZW50Q2VsbC5leHRlbmQoe1xuXHRcdFx0XHRcdG1vZGVsSW5Vbml4VGltZXN0YW1wOiB0cnVlLFxuXHRcdFx0XHRcdGRpc3BsYXlGb3JtYXQ6IFwiREQgTU1NIFlZWVksIEhIOm1tIGFcIixcblx0XHRcdFx0XHRkaXNwbGF5SW5VVEM6IGZhbHNlLFxuXHRcdFx0XHR9KSxcblx0XHRcdH0sXG5cdFx0XHR7IG5hbWU6IFwicGFzc3dvcmRcIiwgbGFiZWw6IFwiUGFzc3dvcmRcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiYXV0aGVudGljYXRlZFwiLCBsYWJlbDogXCJBdXRoZW50aWNhdGVkP1wiLCBlZGl0YWJsZTogZmFsc2UsIGNlbGw6IFNlcnZlckdyaWQuQm9vbGVhbkljb25DZWxsLmV4dGVuZCh7fSksIHNvcnRhYmxlOiBmYWxzZSB9LFxuXHRcdF07XG5cblx0XHR0aGlzLmdyaWQgPSBuZXcgU2VydmVyR3JpZCh7XG5cdFx0XHRlbDogdGhpcy51aS5ncmlkLFxuXHRcdFx0Y29sdW1uczogY29sdW1ucyxcblx0XHRcdGNvbGxlY3Rpb246IG5ldyBUZW1wb3JhcnlQYXNzd29yZENvbGxlY3Rpb24oKSxcblx0XHRcdGNsaWNrYWJsZTogdHJ1ZSxcblx0XHRcdGNvdW50ZXI6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5jb3VudGVyLFxuXHRcdFx0XHR0ZW1wbGF0ZTogXCJUZW1wb3JhcnkgcGFzc3dvcmRzICRzdGFydCAtICRlbmQgb2YgJHRvdGFsXCIsXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdGVsZW1lbnQ6IHRoaXMudWkucGFnaW5nLFxuXHRcdFx0fSxcblx0XHR9KTtcblxuXHRcdHRoaXMuYmluZEV2ZW50cyh0aGlzLmdyaWQuY29sbGVjdGlvbiwgdGhpcy5jb2xsZWN0aW9uRXZlbnRzKTtcblxuXHRcdC8vXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ncmlkLCBcInJvdzpjbGlja2VkXCIsIHRoaXMuYWRkRWRpdFRva2VuLmJpbmQodGhpcykpO1xuXG5cdFx0Y29uc3QgdGV4dEZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwidGV4dFwiLFxuXHRcdFx0bmFtZTogXCJ0ZXh0RmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJUZXh0IFNlYXJjaFwiLFxuXHRcdFx0ZGVib3VuY2U6IDIwMCxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgZmlsdGVyTGlzdCA9IFt0ZXh0RmlsdGVyXTtcblxuXHRcdHRoaXMudWkuZmlsdGVycy5wcmVwZW5kKHRoaXMuZ3JpZC5maWx0ZXIoe1xuXHRcdFx0ZGVmYXVsdEZpbHRlcnM6IFtcInRleHRGaWx0ZXJcIl0sXG5cdFx0XHRmaWx0ZXJDb250YWluZXI6IHRoaXMudWkuZmlsdGVycyxcblx0XHRcdGZpbHRlcnM6IGZpbHRlckxpc3QsXG5cdFx0fSkucmVuZGVyKCkuZWwpO1xuXHR9LFxuXG5cdG9uQnV0dG9uQWRkQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuYWRkTmV3VGVtcG9yYXJ5UGFzc3dvcmQoKTtcblx0fSxcblxuXHRvbkluY2x1ZGVJbnZhbGlkQ2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHRCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwidGVtcG9yYXJ5UGFzc3dvcmRzXCIpLnRyaWdnZXIoXCJmaWx0ZXI6aW5jbHVkZUludmFsaWRcIiwgdGhpcy51aS5pbmNsdWRlSW52YWxpZC5wcm9wKFwiY2hlY2tlZFwiKSk7XG5cdH0sXG5cblx0YWRkTmV3VGVtcG9yYXJ5UGFzc3dvcmQ6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IG1vZGFsID0gbmV3IENyZWF0ZU1vZGFsKHtcblx0XHRcdG1vZGVsOiBuZXcgVGVtcG9yYXJ5UGFzc3dvcmRNb2RlbCgpLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5saXN0ZW5Ubyhtb2RhbCwgXCJjbG9zZTpzdWNjZXNzXCIsICgpID0+IHtcblx0XHRcdHRoaXMuZ3JpZC5jb2xsZWN0aW9uLmZldGNoKHsgcmVzZXQ6IHRydWUgfSk7XG5cdFx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcobW9kYWwpO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5saXN0ZW5Ubyhtb2RhbCwgXCJjbG9zZTplcnJvclwiLCAoKSA9PiB7XG5cdFx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcobW9kYWwpO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5saXN0ZW5Ubyhtb2RhbCwgXCJjYW5jZWxcIiwgKCkgPT4ge1xuXHRcdFx0dGhpcy5zdG9wTGlzdGVuaW5nKG1vZGFsKTtcblx0XHR9KTtcblxuXHRcdG1vZGFsLnNob3coKTtcblx0fSxcbn0pO1xuIl19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar settings = require(\"app-settings\");\n\nmodule.exports = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"_id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/tokens\";\n\t},\n\n\tcomputeds: {\n\t\tbookName: function bookName() {\n\t\t\treturn this.has(\"metadata\") ? this.get(\"metadata\").title : \"<book not loaded>\";\n\t\t},\n\t\tbookID: function bookID() {\n\t\t\treturn this.get(\"universal_id\");\n\t\t},\n\t\tbookFormat: function bookFormat() {\n\t\t\treturn \"<img src='\" + settings.urlRoot + \"/images/\" + (this.has(\"format\") && this.get(\"format\") ? this.get(\"format\") === \"mpub\" ? \"epub\" : \"pdf\" : \"epub\") + \".png' style='max-width: 25px;'>\";\n\t\t}\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRva2VuTW9kZWwuanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwic2V0dGluZ3MiLCJtb2R1bGUiLCJleHBvcnRzIiwiRXBveHkiLCJNb2RlbCIsImV4dGVuZCIsImlkQXR0cmlidXRlIiwidXJsUm9vdCIsImNvbXB1dGVkcyIsImJvb2tOYW1lIiwiaGFzIiwiZ2V0IiwidGl0bGUiLCJib29rSUQiLCJib29rRm9ybWF0Il0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNQyxXQUFXRCxRQUFRLGNBQVIsQ0FBakI7O0FBRUFFLE9BQU9DLE9BQVAsR0FBaUJKLFNBQVNLLEtBQVQsQ0FBZUMsS0FBZixDQUFxQkMsTUFBckIsQ0FBNEI7QUFDNUNDLGNBQWEsS0FEK0I7O0FBRzVDQyxVQUFTLG1CQUFXO0FBQ25CLFNBQU9QLFNBQVNPLE9BQVQsR0FBbUIsaUJBQTFCO0FBQ0EsRUFMMkM7O0FBTzVDQyxZQUFXO0FBQ1ZDLFlBQVUsb0JBQVc7QUFDcEIsVUFBTyxLQUFLQyxHQUFMLENBQVMsVUFBVCxJQUF1QixLQUFLQyxHQUFMLENBQVMsVUFBVCxFQUFxQkMsS0FBNUMsR0FBb0QsbUJBQTNEO0FBQ0EsR0FIUztBQUlWQyxVQUFRLGtCQUFXO0FBQ2xCLFVBQU8sS0FBS0YsR0FBTCxDQUFTLGNBQVQsQ0FBUDtBQUNBLEdBTlM7QUFPVkcsY0FBWSxzQkFBVztBQUN0QixVQUFPLGVBQWVkLFNBQVNPLE9BQXhCLEdBQWtDLFVBQWxDLElBQ0wsS0FBS0csR0FBTCxDQUFTLFFBQVQsS0FBc0IsS0FBS0MsR0FBTCxDQUFTLFFBQVQsQ0FBdEIsR0FBNEMsS0FBS0EsR0FBTCxDQUFTLFFBQVQsTUFBdUIsTUFBdkIsR0FBZ0MsTUFBaEMsR0FBeUMsS0FBckYsR0FBOEYsTUFEekYsSUFDbUcsaUNBRDFHO0FBRUE7QUFWUztBQVBpQyxDQUE1QixDQUFqQiIsImZpbGUiOiJ0b2tlbk1vZGVsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5FcG94eS5Nb2RlbC5leHRlbmQoe1xuXHRpZEF0dHJpYnV0ZTogXCJfaWRcIixcblxuXHR1cmxSb290OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvdG9rZW5zXCI7XG5cdH0sXG5cblx0Y29tcHV0ZWRzOiB7XG5cdFx0Ym9va05hbWU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuaGFzKFwibWV0YWRhdGFcIikgPyB0aGlzLmdldChcIm1ldGFkYXRhXCIpLnRpdGxlIDogXCI8Ym9vayBub3QgbG9hZGVkPlwiO1xuXHRcdH0sXG5cdFx0Ym9va0lEOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLmdldChcInVuaXZlcnNhbF9pZFwiKTtcblx0XHR9LFxuXHRcdGJvb2tGb3JtYXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIFwiPGltZyBzcmM9J1wiICsgc2V0dGluZ3MudXJsUm9vdCArIFwiL2ltYWdlcy9cIiArXG5cdFx0XHRcdCh0aGlzLmhhcyhcImZvcm1hdFwiKSAmJiB0aGlzLmdldChcImZvcm1hdFwiKSA/ICh0aGlzLmdldChcImZvcm1hdFwiKSA9PT0gXCJtcHViXCIgPyBcImVwdWJcIiA6IFwicGRmXCIpIDogXCJlcHViXCIpICsgXCIucG5nJyBzdHlsZT0nbWF4LXdpZHRoOiAyNXB4Oyc+XCI7XG5cdFx0fSxcblx0fSxcbn0pO1xuIl19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar _ = require(\"lodash\");\n\nvar ServerGrid = require(\"../../lib/serverGrid\");\nvar settings = require(\"app-settings\");\n\nvar SimpleMenu = require(\"../../lib/simpleMenu\");\nvar TokenModel = require(\"./tokenModel\");\n\nvar Collection = Backbone.PageableCollection.extend({\n\tmodel: TokenModel,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/tokens?paged=true\";\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"content token-manager\",\n\n\ttemplate: require(\"../templates/tokens.nunj\"),\n\n\tui: {\n\t\tdownloadList: \".downloadList\",\n\t\tfilterBar: \".ops-bar .filters\",\n\t\tcounterBar: \".ops-bar .counter\",\n\t\tpaging: \".paging\",\n\t\tgrid: \"div.grid\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.downloadList\": \"showDownloads\",\n\t\t\"click @ui.addUserIcon\": \"addEditUser\"\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"bookFormat\", label: \"Format\", cell: ServerGrid.HTMLCell.extend({}), editable: false }, { name: \"universalid\", label: \"Universal ID\", cell: \"string\", editable: false }, { name: \"bookName\", label: \"Book Title\", cell: \"string\", editable: false }, { name: \"username\", label: \"Username\", cell: \"string\", editable: false }, { name: \"firstname\", label: \"First Name\", cell: \"string\", editable: false }, { name: \"surname\", label: \"Surname\", cell: \"string\", editable: false }, { name: \"createdDate\", label: \"Created\", editable: false, cell: ServerGrid.MomentCell.extend({\n\t\t\t\tmodelInUnixTimestamp: true,\n\t\t\t\tdisplayFormat: \"DD MMM YYYY, HH:mm a\",\n\t\t\t\tdisplayInUTC: false\n\t\t\t}) }, { name: \"emailIdentifier\", label: \"Email Identifier\", cell: ServerGrid.BooleanIconCell.extend({}), editable: false }, { name: \"timeleft\", label: \"Time Left\", cell: ServerGrid.DurationCell.extend({}), editable: false }, { name: \"book_version\", label: \"Current Version\", cell: ServerGrid.VersionCell.extend({}), editable: false }, { name: \"chosen_version\", label: \"Chosen Version\", cell: ServerGrid.VersionCell.extend({}), editable: false }];\n\n\t\tvar grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new Collection(),\n\t\t\tclickable: true,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counterBar,\n\t\t\t\ttemplate: \"Tokens $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tserver: true,\n\t\t\tdebounce: 400\n\t\t};\n\n\t\tvar languageFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"languageFilter\",\n\t\t\tlabel: \"Language\",\n\t\t\tcategories: [{ items: settings.languageList }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar subjectFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"subjectFilter\",\n\t\t\tlabel: \"Subject\",\n\t\t\tserver: {\n\t\t\t\tkey: \"subject_id\",\n\t\t\t\tvalue: \"subject\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/subjects\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\n\t\tvar gradeFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"gradeFilter\",\n\t\t\tlabel: \"Year of Study\",\n\t\t\tserver: true,\n\t\t\tcategories: _.map(settings.gradeList, function (val, key) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: key,\n\t\t\t\t\titems: _.reduce(val.sort(function (a, b) {\n\t\t\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t\t\t}), function (sum, num) {\n\t\t\t\t\t\tsum.push({ name: num.value, label: num.name });return sum;\n\t\t\t\t\t}, [])\n\t\t\t\t};\n\t\t\t})\n\t\t};\n\n\t\tvar formatFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"formatFilter\",\n\t\t\tlabel: \"Format\",\n\t\t\tcategories: [{ items: { mpdf: \"PDF\", mpub: \"EPUB\" } }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar pubFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"pubFilter\",\n\t\t\tlabel: \"Publisher\",\n\t\t\tserver: {\n\t\t\t\tkey: \"publisher_id\",\n\t\t\t\tvalue: \"fullname\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/publishers?dummy=false\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\n\t\tvar filterList = [textFilter, languageFilter, subjectFilter, gradeFilter, formatFilter, pubFilter];\n\n\t\tthis.ui.filterBar.prepend(grid.filter({\n\t\t\tfilterContainer: this.ui.filterBar,\n\t\t\tfilters: filterList,\n\t\t\tdefaultFilters: [\"textFilter\", \"subjectFilter\", \"gradeFilter\", \"languageFilter\", \"formatFilter\", \"pubFilter\"]\n\t\t}).render().el);\n\t},\n\n\tshowDownloads: function showDownloads(evt) {\n\t\tevt.stopPropagation();\n\n\t\tvar list = new SimpleMenu({\n\t\t\tanchor: this.ui.downloadList,\n\t\t\tside: \"left\",\n\t\t\tstructure: [{ closeOnClick: true, elements: [{ text: \"Download as CSV\", id: \"books\" }] }]\n\t\t});\n\t\tlist.show();\n\n\t\tthis.listenTo(list, \"clicked:books\", this.downloadList.bind(this));\n\t},\n\n\tdownloadList: function downloadList() {\n\t\twindow.open(settings.urlRoot + \"/api/1.0/tokens/report\");\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRva2Vucy5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCJfIiwiU2VydmVyR3JpZCIsInNldHRpbmdzIiwiU2ltcGxlTWVudSIsIlRva2VuTW9kZWwiLCJDb2xsZWN0aW9uIiwiUGFnZWFibGVDb2xsZWN0aW9uIiwiZXh0ZW5kIiwibW9kZWwiLCJ1cmwiLCJ1cmxSb290Iiwic3RhdGUiLCJwYWdlU2l6ZSIsIm1vZGUiLCJxdWVyeVBhcmFtcyIsInNvcnRLZXkiLCJwYXJzZVN0YXRlIiwicmVzcCIsInRvdGFsUmVjb3JkcyIsInRvdGFsIiwicGFyc2VSZWNvcmRzIiwicm93cyIsIm1vZHVsZSIsImV4cG9ydHMiLCJNYXJpb25ldHRlIiwiVmlldyIsInRhZ05hbWUiLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsInVpIiwiZG93bmxvYWRMaXN0IiwiZmlsdGVyQmFyIiwiY291bnRlckJhciIsInBhZ2luZyIsImdyaWQiLCJldmVudHMiLCJvblJlbmRlciIsImNvbHVtbnMiLCJuYW1lIiwibGFiZWwiLCJjZWxsIiwiSFRNTENlbGwiLCJlZGl0YWJsZSIsIk1vbWVudENlbGwiLCJtb2RlbEluVW5peFRpbWVzdGFtcCIsImRpc3BsYXlGb3JtYXQiLCJkaXNwbGF5SW5VVEMiLCJCb29sZWFuSWNvbkNlbGwiLCJEdXJhdGlvbkNlbGwiLCJWZXJzaW9uQ2VsbCIsImVsIiwiY29sbGVjdGlvbiIsImNsaWNrYWJsZSIsImNvdW50ZXIiLCJlbGVtZW50IiwidGV4dEZpbHRlciIsInR5cGUiLCJzZXJ2ZXIiLCJkZWJvdW5jZSIsImxhbmd1YWdlRmlsdGVyIiwiY2F0ZWdvcmllcyIsIml0ZW1zIiwibGFuZ3VhZ2VMaXN0Iiwic3ViamVjdEZpbHRlciIsImtleSIsInZhbHVlIiwiZmV0Y2giLCJpbmZpbml0ZSIsImdyYWRlRmlsdGVyIiwibWFwIiwiZ3JhZGVMaXN0IiwidmFsIiwicmVkdWNlIiwic29ydCIsImEiLCJiIiwibGV4aWNhbCIsInRvVXBwZXJDYXNlIiwibG9jYWxlQ29tcGFyZSIsInN1bSIsIm51bSIsInB1c2giLCJmb3JtYXRGaWx0ZXIiLCJtcGRmIiwibXB1YiIsInB1YkZpbHRlciIsImZpbHRlckxpc3QiLCJwcmVwZW5kIiwiZmlsdGVyIiwiZmlsdGVyQ29udGFpbmVyIiwiZmlsdGVycyIsImRlZmF1bHRGaWx0ZXJzIiwicmVuZGVyIiwic2hvd0Rvd25sb2FkcyIsImV2dCIsInN0b3BQcm9wYWdhdGlvbiIsImxpc3QiLCJhbmNob3IiLCJzaWRlIiwic3RydWN0dXJlIiwiY2xvc2VPbkNsaWNrIiwiZWxlbWVudHMiLCJ0ZXh0IiwiaWQiLCJzaG93IiwibGlzdGVuVG8iLCJiaW5kIiwid2luZG93Iiwib3BlbiJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUMsSUFBSUQsUUFBUSxRQUFSLENBQVY7O0FBRUEsSUFBTUUsYUFBYUYsUUFBUSxzQkFBUixDQUFuQjtBQUNBLElBQU1HLFdBQVdILFFBQVEsY0FBUixDQUFqQjs7QUFFQSxJQUFNSSxhQUFhSixRQUFRLHNCQUFSLENBQW5CO0FBQ0EsSUFBTUssYUFBYUwsUUFBUSxjQUFSLENBQW5COztBQUVBLElBQU1NLGFBQWFQLFNBQVNRLGtCQUFULENBQTRCQyxNQUE1QixDQUFtQztBQUNyREMsUUFBT0osVUFEOEM7O0FBR3JESyxNQUFLLGVBQVc7QUFDZixTQUFPUCxTQUFTUSxPQUFULEdBQW1CLDRCQUExQjtBQUNBLEVBTG9EOztBQU9yREMsUUFBTztBQUNOQyxZQUFVO0FBREosRUFQOEM7QUFVckRDLE9BQU0sUUFWK0M7O0FBWXJEQyxjQUFhO0FBQ1pGLFlBQVUsVUFERTtBQUVaRyxXQUFTO0FBRkcsRUFad0M7O0FBaUJyREMsYUFBWSxvQkFBU0MsSUFBVCxFQUFlO0FBQzFCLFNBQU8sRUFBRUMsY0FBY0QsS0FBS0UsS0FBckIsRUFBUDtBQUNBLEVBbkJvRDs7QUFxQnJEQyxlQUFjLHNCQUFTSCxJQUFULEVBQWU7QUFDNUIsU0FBT0Es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QUFnQyxhQUFoQyxFQUErQyxnQkFBL0MsRUFBaUUsY0FBakUsRUFBaUYsV0FBakY7QUFIcUIsR0FBWixFQUl2QkMsTUFKdUIsR0FJZDFDLEVBSlo7QUFLQSxFQWpJK0M7O0FBbUloRDJDLGdCQUFlLHVCQUFTQyxHQUFULEVBQWM7QUFDNUJBLE1BQUlDLGVBQUo7O0FBRUEsTUFBTUMsT0FBTyxJQUFJN0YsVUFBSixDQUFlO0FBQzNCOEYsV0FBUSxLQUFLcEUsRUFBTCxDQUFRQyxZQURXO0FBRTNCb0UsU0FBTSxNQUZxQjtBQUczQkMsY0FBVyxDQUNWLEVBQUVDLGNBQWMsSUFBaEIsRUFBc0JDLFVBQVUsQ0FDL0IsRUFBRUMsTUFBTSxpQkFBUixFQUEyQkMsSUFBSSxPQUEvQixFQUQrQixDQUFoQyxFQURVO0FBSGdCLEdBQWYsQ0FBYjtBQVNBUCxPQUFLUSxJQUFMOztBQUVBLE9BQUtDLFFBQUwsQ0FBY1QsSUFBZCxFQUFvQixlQUFwQixFQUFxQyxLQUFLbEUsWUFBTCxDQUFrQjRFLElBQWxCLENBQXVCLElBQXZCLENBQXJDO0FBQ0EsRUFsSitDOztBQW9KaEQ1RSxlQUFjLHdCQUFXO0FBQ3hCNkUsU0FBT0MsSUFBUCxDQUFZMUcsU0FBU1EsT0FBVCxHQUFtQix3QkFBL0I7QUFDQTtBQXRKK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoidG9rZW5zLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuXG5jb25zdCBTZXJ2ZXJHcmlkID0gcmVxdWlyZShcIi4uLy4uL2xpYi9zZXJ2ZXJHcmlkXCIpO1xuY29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuXG5jb25zdCBTaW1wbGVNZW51ID0gcmVxdWlyZShcIi4uLy4uL2xpYi9zaW1wbGVNZW51XCIpO1xuY29uc3QgVG9rZW5Nb2RlbCA9IHJlcXVpcmUoXCIuL3Rva2VuTW9kZWxcIik7XG5cbmNvbnN0IENvbGxlY3Rpb24gPSBCYWNrYm9uZS5QYWdlYWJsZUNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IFRva2VuTW9kZWwsXG5cblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvdG9rZW5zP3BhZ2VkPXRydWVcIjtcblx0fSxcblxuXHRzdGF0ZToge1xuXHRcdHBhZ2VTaXplOiAzMCxcblx0fSxcblx0bW9kZTogXCJzZXJ2ZXJcIixcblxuXHRxdWVyeVBhcmFtczoge1xuXHRcdHBhZ2VTaXplOiBcInBhZ2VTaXplXCIsXG5cdFx0c29ydEtleTogXCJzb3J0QnlcIixcblx0fSxcblxuXHRwYXJzZVN0YXRlOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0cmV0dXJuIHsgdG90YWxSZWNvcmRzOiByZXNwLnRvdGFsIH07XG5cdH0sXG5cblx0cGFyc2VSZWNvcmRzOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0cmV0dXJuIHJlc3Aucm93cztcblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwiY29udGVudCB0b2tlbi1tYW5hZ2VyXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvdG9rZW5zLm51bmpcIiksXG5cblx0dWk6IHtcblx0XHRkb3dubG9hZExpc3Q6IFwiLmRvd25sb2FkTGlzdFwiLFxuXHRcdGZpbHRlckJhcjogXCIub3BzLWJhciAuZmlsdGVyc1wiLFxuXHRcdGNvdW50ZXJCYXI6IFwiLm9wcy1iYXIgLmNvdW50ZXJcIixcblx0XHRwYWdpbmc6IFwiLnBhZ2luZ1wiLFxuXHRcdGdyaWQ6IFwiZGl2LmdyaWRcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5kb3dubG9hZExpc3RcIjogXCJzaG93RG93bmxvYWRzXCIsXG5cdFx0XCJjbGljayBAdWkuYWRkVXNlckljb25cIjogXCJhZGRFZGl0VXNlclwiLFxuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBjb2x1bW5zID0gW1xuXHRcdFx0eyBuYW1lOiBcImJvb2tGb3JtYXRcIiwgbGFiZWw6IFwiRm9ybWF0XCIsIGNlbGw6IFNlcnZlckdyaWQuSFRNTENlbGwuZXh0ZW5kKHt9KSwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwidW5pdmVyc2FsaWRcIiwgbGFiZWw6IFwiVW5pdmVyc2FsIElEXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImJvb2tOYW1lXCIsIGxhYmVsOiBcIkJvb2sgVGl0bGVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwidXNlcm5hbWVcIiwgbGFiZWw6IFwiVXNlcm5hbWVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiZmlyc3RuYW1lXCIsIGxhYmVsOiBcIkZpcnN0IE5hbWVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwic3VybmFtZVwiLCBsYWJlbDogXCJTdXJuYW1lXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImNyZWF0ZWREYXRlXCIsIGxhYmVsOiBcIkNyZWF0ZWRcIiwgZWRpdGFibGU6IGZhbHNlLCBjZWxsOiBTZXJ2ZXJHcmlkLk1vbWVudENlbGwuZXh0ZW5kKHtcblx0XHRcdFx0bW9kZWxJblVuaXhUaW1lc3RhbXA6IHRydWUsXG5cdFx0XHRcdGRpc3BsYXlGb3JtYXQ6IFwiREQgTU1NIFlZWVksIEhIOm1tIGFcIixcblx0XHRcdFx0ZGlzcGxheUluVVRDOiBmYWxzZSxcblx0XHRcdH0pIH0sXG5cdFx0XHR7IG5hbWU6IFwiZW1haWxJZGVudGlmaWVyXCIsIGxhYmVsOiBcIkVtYWlsIElkZW50aWZpZXJcIiwgY2VsbDogU2VydmVyR3JpZC5Cb29sZWFuSWNvbkNlbGwuZXh0ZW5kKHt9KSwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwidGltZWxlZnRcIiwgbGFiZWw6IFwiVGltZSBMZWZ0XCIsIGNlbGw6IFNlcnZlckdyaWQuRHVyYXRpb25DZWxsLmV4dGVuZCh7fSksIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImJvb2tfdmVyc2lvblwiLCBsYWJlbDogXCJDdXJyZW50IFZlcnNpb25cIiwgY2VsbDogU2VydmVyR3JpZC5WZXJzaW9uQ2VsbC5leHRlbmQoe30pLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJjaG9zZW5fdmVyc2lvblwiLCBsYWJlbDogXCJDaG9zZW4gVmVyc2lvblwiLCBjZWxsOiBTZXJ2ZXJHcmlkLlZlcnNpb25DZWxsLmV4dGVuZCh7fSksIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdF07XG5cblx0XHRjb25zdCBncmlkID0gbmV3IFNlcnZlckdyaWQoe1xuXHRcdFx0ZWw6IHRoaXMudWkuZ3JpZCxcblx0XHRcdGNvbHVtbnM6IGNvbHVtbnMsXG5cdFx0XHRjb2xsZWN0aW9uOiBuZXcgQ29sbGVjdGlvbigpLFxuXHRcdFx0Y2xpY2thYmxlOiB0cnVlLFxuXHRcdFx0Y291bnRlcjoge1xuXHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLmNvdW50ZXJCYXIsXG5cdFx0XHRcdHRlbXBsYXRlOiBcIlRva2VucyAkc3RhcnQgLSAkZW5kIG9mICR0b3RhbFwiLFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLnBhZ2luZyxcblx0XHRcdH0sXG5cdFx0fSk7XG5cblx0XHRjb25zdCB0ZXh0RmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJ0ZXh0XCIsXG5cdFx0XHRuYW1lOiBcInRleHRGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlRleHQgU2VhcmNoXCIsXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0XHRkZWJvdW5jZTogNDAwLFxuXHRcdH07XG5cblx0XHRjb25zdCBsYW5ndWFnZUZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiaXRlbWl6ZWRcIixcblx0XHRcdG5hbWU6IFwibGFuZ3VhZ2VGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIkxhbmd1YWdlXCIsXG5cdFx0XHRjYXRlZ29yaWVzOiBbXG5cdFx0XHRcdHsgaXRlbXM6IHNldHRpbmdzLmxhbmd1YWdlTGlzdCB9LFxuXHRcdFx0XSxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3Qgc3ViamVjdEZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiaXRlbWl6ZWRcIixcblx0XHRcdG5hbWU6IFwic3ViamVjdEZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiU3ViamVjdFwiLFxuXHRcdFx0c2VydmVyOiB7XG5cdFx0XHRcdGtleTogXCJzdWJqZWN0X2lkXCIsXG5cdFx0XHRcdHZhbHVlOiBcInN1YmplY3RcIixcblx0XHRcdFx0ZmV0Y2g6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2RhdGEvc3ViamVjdHNcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0cGFnZVNpemU6IDMwLFxuXHRcdFx0XHRpbmZpbml0ZTogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0fTtcblxuXHRcdGNvbnN0IGdyYWRlRmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJncmFkZUZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiWWVhciBvZiBTdHVkeVwiLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdFx0Y2F0ZWdvcmllczogXy5tYXAoc2V0dGluZ3MuZ3JhZGVMaXN0LCAodmFsLCBrZXkpID0+ICh7XG5cdFx0XHRcdGxhYmVsOiBrZXksXG5cdFx0XHRcdGl0ZW1zOiBfLnJlZHVjZSh2YWwuc29ydCgoYSwgYikgPT4gKFwibGV4aWNhbFwiIGluIGEgPyBhLmxleGljYWwgOiBhLm5hbWUpLnRvVXBwZXJDYXNlKCkubG9jYWxlQ29tcGFyZSgoXCJsZXhpY2FsXCIgaW4gYiA/IGIubGV4aWNhbCA6IGIubmFtZSkudG9VcHBlckNhc2UoKSkpLFxuXHRcdFx0XHRcdChzdW0sIG51bSkgPT4geyBzdW0ucHVzaCh7IG5hbWU6IG51bS52YWx1ZSwgbGFiZWw6IG51bS5uYW1lIH0pOyByZXR1cm4gc3VtOyB9LCBbXSksXG5cdFx0XHR9KSksXG5cdFx0fTtcblxuXHRcdGNvbnN0IGZvcm1hdEZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiaXRlbWl6ZWRcIixcblx0XHRcdG5hbWU6IFwiZm9ybWF0RmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJGb3JtYXRcIixcblx0XHRcdGNhdGVnb3JpZXM6IFtcblx0XHRcdFx0eyBpdGVtczogeyBtcGRmOiBcIlBERlwiLCBtcHViOiBcIkVQVUJcIiB9IH0sXG5cdFx0XHRdLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdH07XG5cblx0XHRjb25zdCBwdWJGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcInB1YkZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiUHVibGlzaGVyXCIsXG5cdFx0XHRzZXJ2ZXI6IHtcblx0XHRcdFx0a2V5OiBcInB1Ymxpc2hlcl9pZFwiLFxuXHRcdFx0XHR2YWx1ZTogXCJmdWxsbmFtZVwiLFxuXHRcdFx0XHRmZXRjaDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvZGF0YS9wdWJsaXNoZXJzP2R1bW15PWZhbHNlXCIsXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdHBhZ2VTaXplOiAzMCxcblx0XHRcdFx0aW5maW5pdGU6IHRydWUsXG5cdFx0XHR9LFxuXHRcdH07XG5cblx0XHRjb25zdCBmaWx0ZXJMaXN0ID0gW3RleHRGaWx0ZXIsIGxhbmd1YWdlRmlsdGVyLCBzdWJqZWN0RmlsdGVyLCBncmFkZUZpbHRlciwgZm9ybWF0RmlsdGVyLCBwdWJGaWx0ZXJdO1xuXG5cdFx0dGhpcy51aS5maWx0ZXJCYXIucHJlcGVuZChncmlkLmZpbHRlcih7XG5cdFx0XHRmaWx0ZXJDb250YWluZXI6IHRoaXMudWkuZmlsdGVyQmFyLFxuXHRcdFx0ZmlsdGVyczogZmlsdGVyTGlzdCxcblx0XHRcdGRlZmF1bHRGaWx0ZXJzOiBbXCJ0ZXh0RmlsdGVyXCIsIFwic3ViamVjdEZpbHRlclwiLCBcImdyYWRlRmlsdGVyXCIsIFwibGFuZ3VhZ2VGaWx0ZXJcIiwgXCJmb3JtYXRGaWx0ZXJcIiwgXCJwdWJGaWx0ZXJcIl0sXG5cdFx0fSkucmVuZGVyKCkuZWwpO1xuXHR9LFxuXG5cdHNob3dEb3dubG9hZHM6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGNvbnN0IGxpc3QgPSBuZXcgU2ltcGxlTWVudSh7XG5cdFx0XHRhbmNob3I6IHRoaXMudWkuZG93bmxvYWRMaXN0LFxuXHRcdFx0c2lkZTogXCJsZWZ0XCIsXG5cdFx0XHRzdHJ1Y3R1cmU6IFtcblx0XHRcdFx0eyBjbG9zZU9uQ2xpY2s6IHRydWUsIGVsZW1lbnRzOiBbXG5cdFx0XHRcdFx0eyB0ZXh0OiBcIkRvd25sb2FkIGFzIENTVlwiLCBpZDogXCJib29rc1wiIH0sXG5cdFx0XHRcdF0gfSxcblx0XHRcdF0sXG5cdFx0fSk7XG5cdFx0bGlzdC5zaG93KCk7XG5cblx0XHR0aGlzLmxpc3RlblRvKGxpc3QsIFwiY2xpY2tlZDpib29rc1wiLCB0aGlzLmRvd25sb2FkTGlzdC5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRkb3dubG9hZExpc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHdpbmRvdy5vcGVuKHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3Rva2Vucy9yZXBvcnRcIik7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\n\nvar App = require(\"../../../index\");\nvar rester = require(\"rester\");\n\nvar Selectra = require(\"../../../lib/selectra\");\n\nvar globalChannel = Backbone.Radio.channel(\"global\");\n\nvar tools = {\n\texportImportBookData: {\n\t\tlabel: \"Export/Import book data\",\n\t\tmodule: require(\"./exportImportBookData\"),\n\t\trequiredPermission: rester.p.api.tools.exportBookData.get\n\t},\n\texportImportUserData: {\n\t\tlabel: \"Export/Import user data\",\n\t\tmodule: require(\"./exportImportUserData\"),\n\t\trequiredPermission: rester.p.api.tools.exportUserData.get\n\t},\n\tmigrateLearners: {\n\t\tlabel: \"Migrate learners\",\n\t\tmodule: require(\"./migrateStudents\"),\n\t\trequiredPermission: rester.p.api.tools.migrateStudents.groups.get\n\t},\n\tresourceRepair: {\n\t\tlabel: \"Book content repair\",\n\t\tmodule: require(\"./resourceRepair\"),\n\t\trequiredPermission: rester.p.api.tools.resourceRepair.post\n\t},\n\trestrictAllStudents: {\n\t\tlabel: \"Restrict all learners\",\n\t\tmodule: require(\"./restrictAllStudents\"),\n\t\trequiredPermission: rester.p.api.tools.restrictAllStudents.post\n\t},\n\trestrictSomeStudents: {\n\t\tlabel: \"Restrict some learners\",\n\t\tmodule: require(\"./restrictSomeStudents\"),\n\t\trequiredPermission: rester.p.api.tools.restrictSomeStudents.post\n\t},\n\tunrestrictSomeUsers: {\n\t\tlabel: \"Unrestrict some users\",\n\t\tmodule: require(\"./unrestrictSomeUsers\"),\n\t\trequiredPermission: rester.p.api.tools.unrestrictSomeUsers.post\n\t},\n\tuserContentRepair: {\n\t\tlabel: \"Personal content repair\",\n\t\tmodule: require(\"./userContentRepair\"),\n\t\trequiredPermission: rester.p.api.tools.userContentRepair.post\n\t},\n\tsynchroniseTranches: {\n\t\tlabel: \"Tranche license allocation repair\",\n\t\tmodule: require(\"./synchroniseTranches\"),\n\t\trequiredPermission: rester.p.api.tools.synchroniseTranches.get\n\t}\n};\n\nvar PermissionDeniedMessageView = Backbone.Marionette.View.extend({\n\tclassName: \"permission-denied-message\",\n\n\ttemplate: require(\"../../templates/tools/chooser.nunj\").permissionDeniedMessage,\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\ttoolName: this.options.toolName\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"content admin-tools\",\n\n\ttemplate: require(\"../../templates/tools/chooser.nunj\").layout,\n\n\tregions: {\n\t\tdisplay: \"div.display-region\"\n\t},\n\n\tui: {\n\t\ttoolList: \"#tool-list\"\n\t},\n\n\tevents: {\n\t\t\"change @ui.toolList\": \"onToolListChange\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.selectedTool = options.tool;\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this = this;\n\n\t\tvar toolList = new Selectra({\n\t\t\titems: _.sortBy(_.compact(_.map(tools, function (toolDescriptor, toolName) {\n\t\t\t\treturn _this.isPermitted(toolName) ? {\n\t\t\t\t\tkey: toolName,\n\t\t\t\t\tvalue: toolDescriptor.label,\n\t\t\t\t\tselected: toolName === _this.selectedTool\n\t\t\t\t} : null;\n\t\t\t})), \"value\"),\n\t\t\tplaceholder: \"Choose a tool to run\",\n\t\t\tsearch: true\n\t\t});\n\n\t\ttoolList.show({ el: this.ui.toolList });\n\n\t\tif (this.selectedTool) {\n\t\t\tif (this.isPermitted(this.selectedTool)) this.loadTool();else this.showPermissionDenied();\n\t\t}\n\t},\n\n\tisPermitted: function isPermitted(toolName) {\n\t\treturn rester.hasAccess(tools[toolName].requiredPermission, globalChannel.request(App.Events.Requests.CurrentUser));\n\t},\n\n\tloadTool: function loadTool() {\n\t\t// eslint-disable-next-line new-cap\n\t\tthis.showChildView(\"display\", new tools[this.selectedTool].module());\n\t\tglobalChannel.trigger(App.Events.Commands.Navigate, \"/admin/tools/\" + this.selectedTool, { trigger: false });\n\t},\n\n\tshowPermissionDenied: function showPermissionDenied() {\n\t\tthis.showChildView(\"display\", new PermissionDeniedMessageView({ toolName: tools[this.selectedTool].label }));\n\t},\n\n\tonToolListChange: function onToolListChange() {\n\t\tthis.selectedTool = this.ui.toolList.val();\n\t\tthis.loadTool();\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNob29zZXIuanMiXSwibmFtZXMiOlsiXyIsInJlcXVpcmUiLCJCYWNrYm9uZSIsIkFwcCIsInJlc3RlciIsIlNlbGVjdHJhIiwiZ2xvYmFsQ2hhbm5lbCIsIlJhZGlvIiwiY2hhbm5lbCIsInRvb2xzIiwiZXhwb3J0SW1wb3J0Qm9va0RhdGEiLCJsYWJlbCIsIm1vZHVsZSIsInJlcXVpcmVkUGVybWlzc2lvbiIsInAiLCJhcGkiLCJleHBvcnRCb29rRGF0YSIsImdldCIsImV4cG9ydEltcG9ydFVzZXJEYXRhIiwiZXhwb3J0VXNlckRhdGEiLCJtaWdyYXRlTGVhcm5lcnMiLCJtaWdyYXRlU3R1ZGVudHMiLCJncm91cHMiLCJyZXNvdXJjZVJlcGFpciIsInBvc3QiLCJyZXN0cmljdEFsbFN0dWRlbnRzIiwicmVzdHJpY3RTb21lU3R1ZGVudHMiLCJ1bnJlc3RyaWN0U29tZVVzZXJzIiwidXNlckNvbnRlbnRSZXBhaXIiLCJzeW5jaHJvbmlzZVRyYW5jaGVzIiwiUGVybWlzc2lvbkRlbmllZE1lc3NhZ2VWaWV3IiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJleHRlbmQiLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsInBlcm1pc3Npb25EZW5pZWRNZXNzYWdlIiwidGVtcGxhdGVDb250ZXh0IiwidG9vbE5hbWUiLCJvcHRpb25zIiwiaW5pdGlhbGl6ZSIsImV4cG9ydHMiLCJsYXlvdXQiLCJyZWdpb25zIiwiZGlzcGxheSIsInVpIiwidG9vbExpc3QiLCJldmVudHMiLCJzZWxlY3RlZFRvb2wiLCJ0b29sIiwib25SZW5kZXIiLCJpdGVtcyIsInNvcnRCeSIsImNvbXBhY3QiLCJtYXAiLCJ0b29sRGVzY3JpcHRvciIsImlzUGVybWl0dGVkIiwia2V5IiwidmFsdWUiLCJzZWxlY3RlZCIsInBsYWNlaG9sZGVyIiwic2VhcmNoIiwic2hvdyIsImVsIiwibG9hZFRvb2wiLCJzaG93UGVybWlzc2lvbkRlbmllZCIsImhhc0FjY2VzcyIsInJlcXVlc3QiLCJFdmVudHMiLCJSZXF1ZXN0cyIsIkN1cnJlbnRVc2VyIiwic2hvd0NoaWxkVmlldyIsInRyaWdnZXIiLCJDb21tYW5kcyIsIk5hdmlnYXRlIiwib25Ub29sTGlzdENoYW5nZSIsInZhbCJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsSUFBSUMsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNQyxXQUFXRCxRQUFRLFVBQVIsQ0FBakI7O0FBRUEsSUFBTUUsTUFBTUYsUUFBUSxnQkFBUixDQUFaO0FBQ0EsSUFBTUcsU0FBU0gsUUFBUSxRQUFSLENBQWY7O0FBRUEsSUFBTUksV0FBV0osUUFBUSx1QkFBUixDQUFqQjs7QUFFQSxJQUFNSyxnQkFBZ0JKLFNBQVNLLEtBQVQsQ0FBZUMsT0FBZixDQUF1QixRQUF2QixDQUF0Qjs7QUFFQSxJQUFNQyxRQUFRO0FBQ2JDLHVCQUFzQjtBQUNyQkMsU0FBTyx5QkFEYztBQUVyQkMsVUFBUVgsUUFBUSx3QkFBUixDQUZhO0FBR3JCWSxzQkFBb0JULE9BQU9VLENBQVAsQ0FBU0MsR0FBVCxDQUFhTixLQUFiLENBQW1CTyxjQUFuQixDQUFrQ0M7QUFIakMsRUFEVDtBQU1iQyx1QkFBc0I7QUFDckJQLFNBQU8seUJBRGM7QUFFckJDLFVBQVFYLFFBQVEsd0JBQVIsQ0FGYTtBQUdyQlksc0JBQW9CVCxPQUFPVSxDQUFQLENBQVNDLEdBQVQsQ0FBYU4sS0FBYixDQUFtQlUsY0FBbkIsQ0FBa0NGO0FBSGpDLEVBTlQ7QUFXYkcsa0JBQWlCO0FBQ2hCVCxTQUFPLGtCQURTO0FBRWhCQyxVQUFRWCxRQUFRLG1CQUFSLENBRlE7QUFHaEJZLHNCQUFvQlQsT0FBT1UsQ0FBUCxDQUFTQyxHQUFULENBQWFOLEtBQWIsQ0FBbUJZLGVBQW5CLENBQW1DQyxNQUFuQyxDQUEwQ0w7QUFIOUMsRUFYSjtBQWdCYk0saUJBQWdCO0FBQ2ZaLFNBQU8scUJBRFE7QUFFZkMsVUFBUVgsUUFBUSxrQkFBUixDQUZPO0FBR2ZZLHNCQUFvQlQsT0FBT1UsQ0FBUCxDQUFTQyxHQUFULENBQWFOLEtBQWIsQ0FBbUJj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UUFBZCxFQUFkOztBQUVBLE1BQUksS0FBS0UsWUFBVCxFQUF1QjtBQUN0QixPQUFJLEtBQUtRLFdBQUwsQ0FBaUIsS0FBS1IsWUFBdEIsQ0FBSixFQUNDLEtBQUtnQixRQUFMLEdBREQsS0FHQyxLQUFLQyxvQkFBTDtBQUNEO0FBQ0QsRUExQytDOztBQTRDaERULGNBQWEscUJBQVNsQixRQUFULEVBQW1CO0FBQy9CLFNBQU9sQyxPQUFPOEQsU0FBUCxDQUFpQnpELE1BQU02QixRQUFOLEVBQWdCekIsa0JBQWpDLEVBQXFEUCxjQUFjNkQsT0FBZCxDQUFzQmhFLElBQUlpRSxNQUFKLENBQVdDLFFBQVgsQ0FBb0JDLFdBQTFDLENBQXJELENBQVA7QUFDQSxFQTlDK0M7O0FBZ0RoRE4sV0FBVSxvQkFBVztBQUNwQjtBQUNBLE9BQUtPLGFBQUwsQ0FBbUIsU0FBbkIsRUFBOEIsSUFBSTlELE1BQU0sS0FBS3VDLFlBQVgsRUFBeUJwQyxNQUE3QixFQUE5QjtBQUNBTixnQkFBY2tFLE9BQWQsQ0FBc0JyRSxJQUFJaUUsTUFBSixDQUFXSyxRQUFYLENBQW9CQyxRQUExQyxFQUFvRCxrQkFBa0IsS0FBSzFCLFlBQTNFLEVBQXlGLEVBQUV3QixTQUFTLEtBQVgsRUFBekY7QUFDQSxFQXBEK0M7O0FBc0RoRFAsdUJBQXNCLGdDQUFXO0FBQ2hDLE9BQUtNLGFBQUwsQ0FBbUIsU0FBbkIsRUFBOEIsSUFBSXpDLDJCQUFKLENBQWdDLEVBQUVRLFVBQVU3QixNQUFNLEtBQUt1QyxZQUFYLEVBQXlCckMsS0FBckMsRUFBaEMsQ0FBOUI7QUFDQSxFQXhEK0M7O0FBMERoRGdFLG1CQUFrQiw0QkFBVztBQUM1QixPQUFLM0IsWUFBTCxHQUFvQixLQUFLSCxFQUFMLENBQVFDLFFBQVIsQ0FBaUI4QixHQUFqQixFQUFwQjtBQUNBLE9BQUtaLFFBQUw7QUFDQTtBQTdEK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoiY2hvb3Nlci5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcblxuY29uc3QgQXBwID0gcmVxdWlyZShcIi4uLy4uLy4uL2luZGV4XCIpO1xuY29uc3QgcmVzdGVyID0gcmVxdWlyZShcInJlc3RlclwiKTtcblxuY29uc3QgU2VsZWN0cmEgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL3NlbGVjdHJhXCIpO1xuXG5jb25zdCBnbG9iYWxDaGFubmVsID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcblxuY29uc3QgdG9vbHMgPSB7XG5cdGV4cG9ydEltcG9ydEJvb2tEYXRhOiB7XG5cdFx0bGFiZWw6IFwiRXhwb3J0L0ltcG9ydCBib29rIGRhdGFcIixcblx0XHRtb2R1bGU6IHJlcXVpcmUoXCIuL2V4cG9ydEltcG9ydEJvb2tEYXRhXCIpLFxuXHRcdHJlcXVpcmVkUGVybWlzc2lvbjogcmVzdGVyLnAuYXBpLnRvb2xzLmV4cG9ydEJvb2tEYXRhLmdldCxcblx0fSxcblx0ZXhwb3J0SW1wb3J0VXNlckRhdGE6IHtcblx0XHRsYWJlbDogXCJFeHBvcnQvSW1wb3J0IHVzZXIgZGF0YVwiLFxuXHRcdG1vZHVsZTogcmVxdWlyZShcIi4vZXhwb3J0SW1wb3J0VXNlckRhdGFcIiksXG5cdFx0cmVxdWlyZWRQZXJtaXNzaW9uOiByZXN0ZXIucC5hcGkudG9vbHMuZXhwb3J0VXNlckRhdGEuZ2V0LFxuXHR9LFxuXHRtaWdyYXRlTGVhcm5lcnM6IHtcblx0XHRsYWJlbDogXCJNaWdyYXRlIGxlYXJuZXJzXCIsXG5cdFx0bW9kdWxlOiByZXF1aXJlKFwiLi9taWdyYXRlU3R1ZGVudHNcIiksXG5cdFx0cmVxdWlyZWRQZXJtaXNzaW9uOiByZXN0ZXIucC5hcGkudG9vbHMubWlncmF0ZVN0dWRlbnRzLmdyb3Vwcy5nZXQsXG5cdH0sXG5cdHJlc291cmNlUmVwYWlyOiB7XG5cdFx0bGFiZWw6IFwiQm9vayBjb250ZW50IHJlcGFpclwiLFxuXHRcdG1vZHVsZTogcmVxdWlyZShcIi4vcmVzb3VyY2VSZXBhaXJcIiksXG5cdFx0cmVxdWlyZWRQZXJtaXNzaW9uOiByZXN0ZXIucC5hcGkudG9vbHMucmVzb3VyY2VSZXBhaXIucG9zdCxcblx0fSxcblx0cmVzdHJpY3RBbGxTdHVkZW50czoge1xuXHRcdGxhYmVsOiBcIlJlc3RyaWN0IGFsbCBsZWFybmVyc1wiLFxuXHRcdG1vZHVsZTogcmVxdWlyZShcIi4vcmVzdHJpY3RBbGxTdHVkZW50c1wiKSxcblx0XHRyZXF1aXJlZFBlcm1pc3Npb246IHJlc3Rlci5wLmFwaS50b29scy5yZXN0cmljdEFsbFN0dWRlbnRzLnBvc3QsXG5cdH0sXG5cdHJlc3RyaWN0U29tZVN0dWRlbnRzOiB7XG5cdFx0bGFiZWw6IFwiUmVzdHJpY3Qgc29tZSBsZWFybmVyc1wiLFxuXHRcdG1vZHVsZTogcmVxdWlyZShcIi4vcmVzdHJpY3RTb21lU3R1ZGVudHNcIiksXG5cdFx0cmVxdWlyZWRQZXJtaXNzaW9uOiByZXN0ZXIucC5hcGkudG9vbHMucmVzdHJpY3RTb21lU3R1ZGVudHMucG9zdCxcblx0fSxcblx0dW5yZXN0cmljdFNvbWVVc2Vyczoge1xuXHRcdGxhYmVsOiBcIlVucmVzdHJpY3Qgc29tZSB1c2Vyc1wiLFxuXHRcdG1vZHVsZTogcmVxdWlyZShcIi4vdW5yZXN0cmljdFNvbWVVc2Vyc1wiKSxcblx0XHRyZXF1aXJlZFBlcm1pc3Npb246IHJlc3Rlci5wLmFwaS50b29scy51bnJlc3RyaWN0U29tZVVzZXJzLnBvc3QsXG5cdH0sXG5cdHVzZXJDb250ZW50UmVwYWlyOiB7XG5cdFx0bGFiZWw6IFwiUGVyc29uYWwgY29udGVudCByZXBhaXJcIixcblx0XHRtb2R1bGU6IHJlcXVpcmUoXCIuL3VzZXJDb250ZW50UmVwYWlyXCIpLFxuXHRcdHJlcXVpcmVkUGVybWlzc2lvbjogcmVzdGVyLnAuYXBpLnRvb2xzLnVzZXJDb250ZW50UmVwYWlyLnBvc3QsXG5cdH0sXG5cdHN5bmNocm9uaXNlVHJhbmNoZXM6IHtcblx0XHRsYWJlbDogXCJUcmFuY2hlIGxpY2Vuc2UgYWxsb2NhdGlvbiByZXBhaXJcIixcblx0XHRtb2R1bGU6IHJlcXVpcmUoXCIuL3N5bmNocm9uaXNlVHJhbmNoZXNcIiksXG5cdFx0cmVxdWlyZWRQZXJtaXNzaW9uOiByZXN0ZXIucC5hcGkudG9vbHMuc3luY2hyb25pc2VUcmFuY2hlcy5nZXQsXG5cdH0sXG59O1xuXG5jb25zdCBQZXJtaXNzaW9uRGVuaWVkTWVzc2FnZVZpZXcgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInBlcm1pc3Npb24tZGVuaWVkLW1lc3NhZ2VcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy90b29scy9jaG9vc2VyLm51bmpcIikucGVybWlzc2lvbkRlbmllZE1lc3NhZ2UsXG5cblx0dGVtcGxhdGVDb250ZXh0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9vbE5hbWU6IHRoaXMub3B0aW9ucy50b29sTmFtZSxcblx0XHR9O1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXHR9LFxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJjb250ZW50IGFkbWluLXRvb2xzXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvdG9vbHMvY2hvb3Nlci5udW5qXCIpLmxheW91dCxcblxuXHRyZWdpb25zOiB7XG5cdFx0ZGlzcGxheTogXCJkaXYuZGlzcGxheS1yZWdpb25cIixcblx0fSxcblxuXHR1aToge1xuXHRcdHRvb2xMaXN0OiBcIiN0b29sLWxpc3RcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNoYW5nZSBAdWkudG9vbExpc3RcIjogXCJvblRvb2xMaXN0Q2hhbmdlXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuc2VsZWN0ZWRUb29sID0gb3B0aW9ucy50b29sO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCB0b29sTGlzdCA9IG5ldyBTZWxlY3RyYSh7XG5cdFx0XHRpdGVtczogXy5zb3J0QnkoXy5jb21wYWN0KF8ubWFwKHRvb2xzLCAodG9vbERlc2NyaXB0b3IsIHRvb2xOYW1lKSA9PiAoXG5cdFx0XHRcdHRoaXMuaXNQZXJtaXR0ZWQodG9vbE5hbWUpID8ge1xuXHRcdFx0XHRcdGtleTogdG9vbE5hbWUsXG5cdFx0XHRcdFx0dmFsdWU6IHRvb2xEZXNjcmlwdG9yLmxhYmVsLFxuXHRcdFx0XHRcdHNlbGVjdGVkOiB0b29sTmFtZSA9PT0gdGhpcy5zZWxlY3RlZFRvb2wsXG5cdFx0XHRcdH0gOiBudWxsXG5cdFx0XHQpKSksIFwidmFsdWVcIiksXG5cdFx0XHRwbGFjZWhvbGRlcjogXCJDaG9vc2UgYSB0b29sIHRvIHJ1blwiLFxuXHRcdFx0c2VhcmNoOiB0cnVlLFxuXHRcdH0pO1xuXG5cdFx0dG9vbExpc3Quc2hvdyh7IGVsOiB0aGlzLnVpLnRvb2xMaXN0IH0pO1xuXG5cdFx0aWYgKHRoaXMuc2VsZWN0ZWRUb29sKSB7XG5cdFx0XHRpZiAodGhpcy5pc1Blcm1pdHRlZCh0aGlzLnNlbGVjdGVkVG9vbCkpXG5cdFx0XHRcdHRoaXMubG9hZFRvb2woKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5zaG93UGVybWlzc2lvbkRlbmllZCgpO1xuXHRcdH1cblx0fSxcblxuXHRpc1Blcm1pdHRlZDogZnVuY3Rpb24odG9vbE5hbWUpIHtcblx0XHRyZXR1cm4gcmVzdGVyLmhhc0FjY2Vzcyh0b29sc1t0b29sTmFtZV0ucmVxdWlyZWRQZXJtaXNzaW9uLCBnbG9iYWxDaGFubmVsLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcikpO1xuXHR9LFxuXG5cdGxvYWRUb29sOiBmdW5jdGlvbigpIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImRpc3BsYXlcIiwgbmV3IHRvb2xzW3RoaXMuc2VsZWN0ZWRUb29sXS5tb2R1bGUoKSk7XG5cdFx0Z2xvYmFsQ2hhbm5lbC50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuTmF2aWdhdGUsIFwiL2FkbWluL3Rvb2xzL1wiICsgdGhpcy5zZWxlY3RlZFRvb2wsIHsgdHJpZ2dlcjogZmFsc2UgfSk7XG5cdH0sXG5cblx0c2hvd1Blcm1pc3Npb25EZW5pZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImRpc3BsYXlcIiwgbmV3IFBlcm1pc3Npb25EZW5pZWRNZXNzYWdlVmlldyh7IHRvb2xOYW1lOiB0b29sc1t0aGlzLnNlbGVjdGVkVG9vbF0ubGFiZWwgfSkpO1xuXHR9LFxuXG5cdG9uVG9vbExpc3RDaGFuZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc2VsZWN0ZWRUb29sID0gdGhpcy51aS50b29sTGlzdC52YWwoKTtcblx0XHR0aGlzLmxvYWRUb29sKCk7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar NProgress = require(\"nprogress\");\n\nvar ImportModel = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"import_id\"\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"content-import-modal\",\n\n\ttemplate: require(\"../../../templates/tools/common/importModal.nunj\"),\n\n\tui: {\n\t\tform: \"div.form\",\n\t\timportButton: \"button.import\",\n\t\tcancelButton: \"button.cancel\",\n\t\tcloseButton: \"button.close\",\n\t\tmessage: \"span.message\",\n\t\tworkingSpinner: \"span.spinner-working\",\n\n\t\timportForm: \".import-form\",\n\t\timportResult: \".import-result\",\n\t\tresultMessage: \".import-result-message\",\n\t\tResourcesCount: \".metadata-resources\",\n\t\tFoldersCount: \".metadata-folders\",\n\t\tAttachmentsCount: \".metadata-attachments\",\n\t\tPrivateAttachmentsCount: \".metadata-private-attachments\",\n\t\tHighlightsCount: \".metadata-highlights\",\n\t\tAnnotationsCount: \".metadata-annotations\",\n\t\tNetchCount: \".metadata-netch\",\n\t\tdata: \"input[name='data']\",\n\t\tdetails: \".details\",\n\t\timportType: \".importType\"\n\t},\n\n\tevents: {\n\t\tclick: \"onClick\",\n\t\t\"click @ui.importButton\": \"onImport\",\n\t\t\"click @ui.cancelButton\": \"onCancel\",\n\t\t\"click @ui.closeButton\": \"onClose\",\n\n\t\t\"change @ui.data\": \"onFileChanged\"\n\t},\n\n\tmodelEvents: {\n\t\t\"upload:progress\": \"onUploadProgress\",\n\t\tinvalid: \"validationFail\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.host = options.host || \"#modals\";\n\t\tthis.model = options.model;\n\t\tthis.model.importType = options.importType;\n\t\tthis.importType = options.importType;\n\t},\n\n\tshow: function show() {\n\t\t$(\".modal-container\", $(this.host)).append(this.render().el);\n\t},\n\n\tonRender: function onRender() {\n\t\t// Render a background\n\t\t$(\".modal-element\", $(this.host)).removeClass(\"hide\");\n\t\t$(\"body\").addClass(\"hide-overflow\");\n\n\t\tif (this.importType === \"user\") this.ui.details.text(\"user: \" + this.model.get(\"firstname\") + \" \" + this.model.get(\"surname\") + \" (Username: \" + this.model.get(\"username\") + \")\");else this.ui.details.text(\"book: \" + this.model.get(\"title\") + \" (ISBN: \" + this.model.get(\"isbn\") + \")\");\n\n\t\tthis.ui.importType.text(this.importType);\n\t\t// Initialize the UI\n\t\tthis.onFileChanged();\n\t},\n\n\tonDestroy: function onDestroy() {\n\t\t// Clean up the background\n\t\t$(\".modal-element\", $(this.host)).addClass(\"hide\");\n\t\t$(\"body\").removeClass(\"hide-overflow\");\n\t},\n\n\tgetFile: function getFile() {\n\t\treturn this.ui.data.get(0).files.length === 0 ? null : this.ui.data.get(0).files[0];\n\t},\n\n\tonClick: function onClick(event) {\n\t\tevent.stopPropagation();\n\t},\n\n\tonFileChanged: function onFileChanged() {\n\t\tif (this.getFile()) {\n\t\t\tthis.ui.importButton.prop(\"disabled\", false);\n\t\t\tthis.ui.importButton.removeClass(\"disabled\");\n\t\t} else {\n\t\t\tthis.ui.importButton.prop(\"disabled\", true);\n\t\t\tthis.ui.importButton.addClass(\"disabled\");\n\t\t}\n\t},\n\n\tonImport: function onImport() {\n\t\t// Set the file\n\t\tthis.model.setFile(\"file\", this.getFile());\n\n\t\tif (this.model.isValid()) {\n\t\t\t// Disable the modal buttons\n\t\t\tthis.setUIBusy();\n\n\t\t\t// Configure and start the progress bar\n\t\t\tNProgress.configure({\n\t\t\t\tparent: $(\".modal-footer\", this.$el).getPath(),\n\t\t\t\tshowSpinner: false,\n\t\t\t\ttrickle: true,\n\t\t\t\tminimum: 0.0\n\t\t\t}).start(0.0);\n\n\t\t\t// Save the model, uploading the file\n\t\t\tthis.xhr = this.model.binarySave(null, {\n\t\t\t\t//data: this.model.attributes,\n\t\t\t\tvalidate: false,\n\t\t\t\twait: true,\n\t\t\t\tsuccess: this.onImportSuccess.bind(this),\n\t\t\t\terror: this.onImportError.bind(this)\n\t\t\t});\n\t\t}\n\t},\n\n\tonImportSuccess: function onImportSuccess(result) {\n\t\tthis.xhr = null;\n\n\t\tthis.Result = new ImportModel(_.merge(result.toJSON(), { importType: this.importType }));\n\n\t\tNProgress.set(1.0);\n\t\tthis.setUIReady();\n\n\t\tthis.ui.importButton.addClass(\"hide\");\n\t\tthis.ui.cancelButton.addClass(\"hide\");\n\t\tthis.ui.closeButton.removeClass(\"hide\");\n\n\t\tif (this.importType === \"user\") {\n\t\t\tthis.ui.AttachmentsCount.remove();\n\t\t\tthis.ui.PrivateAttachmentsCount.remove();\n\t\t\tthis.ui.ResourcesCount.find(\".content-metadata-value\").text(this.Result.get(\"resources\"));\n\t\t\tthis.ui.FoldersCount.find(\".content-metadata-value\").text(this.Result.get(\"folders\"));\n\t\t} else {\n\t\t\tthis.ui.ResourcesCount.remove();\n\t\t\tthis.ui.FoldersCount.remove();\n\t\t\tthis.ui.AttachmentsCount.find(\".content-metadata-value\").text(this.Result.get(\"attachments\"));\n\t\t\tthis.ui.PrivateAttachmentsCount.find(\".content-metadata-value\").text(this.Result.get(\"private_attachments\"));\n\t\t}\n\n\t\tthis.ui.HighlightsCount.find(\".content-metadata-value\").text(this.Result.get(\"highlights\"));\n\t\tthis.ui.AnnotationsCount.find(\".content-metadata-value\").text(this.Result.get(\"annotations\"));\n\t\tthis.ui.NetchCount.find(\".content-metadata-value\").text(this.Result.get(\"netch\"));\n\n\t\tthis.ui.importForm.addClass(\"hide\");\n\t\tthis.ui.importResult.removeClass(\"hide\");\n\t},\n\n\tonImportError: function onImportError(model, response) {\n\t\tthis.xhr = null;\n\n\t\tNProgress.set(1.0);\n\t\tthis.setUIReady();\n\n\t\tvar answer = {};\n\n\t\ttry {\n\t\t\tanswer = JSON.parse(response.responseText);\n\t\t} catch (error) {\n\t\t\tanswer.detail = (response.status === 0 ? \"Connection error\" : response.statusText) + \" (code \" + response.status + \")\";\n\t\t}\n\n\t\tthis.ui.message.text(\"Error importing user content: \" + answer.detail || answer.info).removeClass(\"hide\");\n\t},\n\n\tonCancel: function onCancel() {\n\t\tif (this.xhr) this.xhr.abort();\n\n\t\tthis.destroy();\n\t\tthis.trigger(\"action\", \"cancel\");\n\t},\n\n\tonClose: function onClose() {\n\t\tthis.destroy();\n\t\tthis.trigger(\"action\", \"close\", { model: this.Result });\n\t},\n\n\tsetUIBusy: function setUIBusy() {\n\t\tthis.ui.importButton.addClass(\"disabled\");\n\t\tthis.ui.workingSpinner.removeClass(\"hide\");\n\n\t\tthis.ui.message.addClass(\"hide\");\n\t},\n\n\tsetUIReady: function setUIReady() {\n\t\tthis.ui.importButton.removeClass(\"disabled\");\n\t\tthis.ui.workingSpinner.addClass(\"hide\");\n\t},\n\n\tonUploadProgress: function onUploadProgress(percentage) {\n\t\tNProgress.set(percentage / 100);\n\t},\n\n\tvalidationFail: function validationFail() {\n\t\tvar _this = this;\n\n\t\tthis.clearError();\n\t\tthis.setUIReady();\n\n\t\t_.each(this.model.validationError, function (message, key) {\n\t\t\t_this.displayError(message, _this.ui[key]);\n\t\t});\n\t},\n\n\tdisplayError: function displayError(message, element) {\n\t\telement.parent().append(\"<span class='error'>\" + message + \"</span>\");\n\t\telement.one(\"change keyup\", this.clearError.bind(this));\n\t},\n\n\tclearError: function clearError(event) {\n\t\tif (event) $(event.currentTarget).parent().find(\".error\").remove();else $(\".error\", this.el).remove();\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImltcG9ydE1vZGFsLmpzIl0sIm5hbWVzIjpbIiQiLCJyZXF1aXJlIiwiXyIsIkJhY2tib25lIiwiTlByb2dyZXNzIiwiSW1wb3J0TW9kZWwiLCJFcG94eSIsIk1vZGVsIiwiZXh0ZW5kIiwiaWRBdHRyaWJ1dGUiLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsInVpIiwiZm9ybSIsImltcG9ydEJ1dHRvbiIsImNhbmNlbEJ1dHRvbiIsImNsb3NlQnV0dG9uIiwibWVzc2FnZSIsIndvcmtpbmdTcGlubmVyIiwiaW1wb3J0Rm9ybSIsImltcG9ydFJlc3VsdCIsInJlc3VsdE1lc3NhZ2UiLCJSZXNvdXJjZXNDb3VudCIsIkZvbGRlcnNDb3VudCIsIkF0dGFjaG1lbnRzQ291bnQiLCJQcml2YXRlQXR0YWNobWVudHNDb3VudCIsIkhpZ2hsaWdodHNDb3VudCIsIkFubm90YXRpb25zQ291bnQiLCJOZXRjaENvdW50IiwiZGF0YSIsImRldGFpbHMiLCJpbXBvcnRUeXBlIiwiZXZlbnRzIiwiY2xpY2siLCJtb2RlbEV2ZW50cyIsImludmFsaWQiLCJpbml0aWFsaXplIiwib3B0aW9ucyIsImhvc3QiLCJtb2RlbCIsInNob3ciLCJhcHBlbmQiLCJyZW5kZXIiLCJlbCIsIm9uUmVuZGVyIiwicmVtb3ZlQ2xhc3MiLCJhZGRDbGFzcyIsInRleHQiLCJnZXQiLCJvbkZpbGVDaGFuZ2VkIiwib25EZXN0cm95IiwiZ2V0RmlsZSIsImZpbGVzIiwibGVuZ3RoIiwib25DbGljayIsImV2ZW50Iiwic3RvcFByb3BhZ2F0aW9uIiwicHJvcCIsIm9uSW1wb3J0Iiwic2V0RmlsZSIsImlzVmFsaWQiLCJzZXRVSUJ1c3kiLCJjb25maWd1cmUiLCJwYXJlbnQiLCIkZWwiLCJnZXRQYXRoIiwic2hvd1NwaW5uZXIiLCJ0cmlja2xlIiwibWluaW11bSIsInN0YXJ0IiwieGhyIiwiYmluYXJ5U2F2ZSIsInZhbGlkYXRlIiwid2FpdCIsInN1Y2Nlc3MiLCJvbkltcG9ydFN1Y2Nlc3MiLCJiaW5kIiwiZXJyb3IiLCJvbkltcG9ydEVycm9yIiwicmVzdWx0IiwiUmVzdWx0IiwibWVyZ2UiLCJ0b0pTT04iLCJzZXQiLCJzZXRVSVJlYWR5IiwicmVtb3ZlIiwiZmluZCIsInJlc3BvbnNlIiwiYW5zd2VyIiwiSlNPTiIsInBhcnNlIiwicmVzcG9uc2VUZXh0IiwiZGV0YWlsIiwic3RhdHVzIiwic3RhdHVzVGV4dCIsImluZm8iLCJvbkNhbmNlbCIsImFib3J0IiwiZGVzdHJveSIsInRyaWdnZXIiLCJvbkNsb3NlIiwib25VcGxvYWRQcm9ncmVzcyIsInBlcmNlbnRhZ2UiLCJ2YWxpZGF0aW9uRmFpbCIsImNsZWFyRXJyb3IiLCJlYWNoIiwidmFsaWRhdGlvbkVycm9yIiwia2V5IiwiZGlzcGxheUVycm9yIiwiZWxlbWVudCIsIm9uZSIsImN1cnJlbnRUYXJnZXQiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsSUFBSUQsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNRSxXQUFXRixRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNRyxZQUFZSCxRQUFRLFdBQVIsQ0FBbEI7O0FBRUEsSUFBTUksY0FBY0YsU0FBU0csS0FBVCxDQUFlQyxLQUFmLENBQXFCQyxNQUFyQixDQUE0QjtBQUMvQ0MsY0FBYTtBQURrQyxDQUE1QixDQUFwQjs7QUFJQUMsT0FBT0MsT0FBUCxHQUFpQlIsU0FBU1MsVUFBVCxDQUFvQkMsSUFBcEIsQ0FBeUJMLE1BQXpCLENBQWdDO0FBQ2hETSxZQUFXLHNCQURxQzs7QUFHaERDLFdBQVVkLFFBQVEsa0RBQVIsQ0FIc0M7O0FBS2hEZSxLQUFJO0FBQ0hDLFFBQU0sVUFESDtBQUVIQyxnQkFBYyxlQUZYO0FBR0hDLGdCQUFjLGVBSFg7QUFJSEMsZUFBYSxjQUpWO0FBS0hDLFdBQVMsY0FMTjtBQU1IQyxrQkFBZ0Isc0JBTmI7O0FBUUhDLGNBQVksY0FSVDtB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VUFBVCxFQUFxQjtBQUN0Q3RHLFlBQVVtRixHQUFWLENBQWNtQixhQUFhLEdBQTNCO0FBQ0EsRUF0TStDOztBQXdNaERDLGlCQUFnQiwwQkFBVztBQUFBOztBQUMxQixPQUFLQyxVQUFMO0FBQ0EsT0FBS3BCLFVBQUw7O0FBRUF0RixJQUFFMkcsSUFBRixDQUFPLEtBQUtsRSxLQUFMLENBQVdtRSxlQUFsQixFQUFtQyxVQUFDekYsT0FBRCxFQUFVMEYsR0FBVixFQUFrQjtBQUNwRCxTQUFLQyxZQUFMLENBQWtCM0YsT0FBbEIsRUFBMkIsTUFBS0wsRUFBTCxDQUFRK0YsR0FBUixDQUEzQjtBQUNBLEdBRkQ7QUFHQSxFQS9NK0M7O0FBaU5oREMsZUFBYyxzQkFBUzNGLE9BQVQsRUFBa0I0RixPQUFsQixFQUEyQjtBQUN4Q0EsVUFBUTlDLE1BQVIsR0FBaUJ0QixNQUFqQixDQUF3Qix5QkFBeUJ4QixPQUF6QixHQUFtQyxTQUEzRDtBQUNBNEYsVUFBUUMsR0FBUixDQUFZLGNBQVosRUFBNEIsS0FBS04sVUFBTCxDQUFnQjVCLElBQWhCLENBQXFCLElBQXJCLENBQTVCO0FBQ0EsRUFwTitDOztBQXNOaEQ0QixhQUFZLG9CQUFTakQsS0FBVCxFQUFnQjtBQUMzQixNQUFJQSxLQUFKLEVBQ0MzRCxFQUFFMkQsTUFBTXdELGFBQVIsRUFBdUJoRCxNQUF2QixHQUFnQ3VCLElBQWhDLENBQXFDLFFBQXJDLEVBQStDRCxNQUEvQyxHQURELEtBR0N6RixFQUFFLFFBQUYsRUFBWSxLQUFLK0MsRUFBakIsRUFBcUIwQyxNQUFyQjtBQUNEO0FBM04rQyxDQUFoQyxDQUFqQiIsImZpbGUiOiJpbXBvcnRNb2RhbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgTlByb2dyZXNzID0gcmVxdWlyZShcIm5wcm9ncmVzc1wiKTtcblxuY29uc3QgSW1wb3J0TW9kZWwgPSBCYWNrYm9uZS5FcG94eS5Nb2RlbC5leHRlbmQoe1xuXHRpZEF0dHJpYnV0ZTogXCJpbXBvcnRfaWRcIixcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiY29udGVudC1pbXBvcnQtbW9kYWxcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uLy4uL3RlbXBsYXRlcy90b29scy9jb21tb24vaW1wb3J0TW9kYWwubnVualwiKSxcblxuXHR1aToge1xuXHRcdGZvcm06IFwiZGl2LmZvcm1cIixcblx0XHRpbXBvcnRCdXR0b246IFwiYnV0dG9uLmltcG9ydFwiLFxuXHRcdGNhbmNlbEJ1dHRvbjogXCJidXR0b24uY2FuY2VsXCIsXG5cdFx0Y2xvc2VCdXR0b246IFwiYnV0dG9uLmNsb3NlXCIsXG5cdFx0bWVzc2FnZTogXCJzcGFuLm1lc3NhZ2VcIixcblx0XHR3b3JraW5nU3Bpbm5lcjogXCJzcGFuLnNwaW5uZXItd29ya2luZ1wiLFxuXG5cdFx0aW1wb3J0Rm9ybTogXCIuaW1wb3J0LWZvcm1cIixcblx0XHRpbXBvcnRSZXN1bHQ6IFwiLmltcG9ydC1yZXN1bHRcIixcblx0XHRyZXN1bHRNZXNzYWdlOiBcIi5pbXBvcnQtcmVzdWx0LW1lc3NhZ2VcIixcblx0XHRSZXNvdXJjZXNDb3VudDogXCIubWV0YWRhdGEtcmVzb3VyY2VzXCIsXG5cdFx0Rm9sZGVyc0NvdW50OiBcIi5tZXRhZGF0YS1mb2xkZXJzXCIsXG5cdFx0QXR0YWNobWVudHNDb3VudDogXCIubWV0YWRhdGEtYXR0YWNobWVudHNcIixcblx0XHRQcml2YXRlQXR0YWNobWVudHNDb3VudDogXCIubWV0YWRhdGEtcHJpdmF0ZS1hdHRhY2htZW50c1wiLFxuXHRcdEhpZ2hsaWdodHNDb3VudDogXCIubWV0YWRhdGEtaGlnaGxpZ2h0c1wiLFxuXHRcdEFubm90YXRpb25zQ291bnQ6IFwiLm1ldGFkYXRhLWFubm90YXRpb25zXCIsXG5cdFx0TmV0Y2hDb3VudDogXCIubWV0YWRhdGEtbmV0Y2hcIixcblx0XHRkYXRhOiBcImlucHV0W25hbWU9J2RhdGEnXVwiLFxuXHRcdGRldGFpbHM6IFwiLmRldGFpbHNcIixcblx0XHRpbXBvcnRUeXBlOiBcIi5pbXBvcnRUeXBlXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0Y2xpY2s6IFwib25DbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmltcG9ydEJ1dHRvblwiOiBcIm9uSW1wb3J0XCIsXG5cdFx0XCJjbGljayBAdWkuY2FuY2VsQnV0dG9uXCI6IFwib25DYW5jZWxcIixcblx0XHRcImNsaWNrIEB1aS5jbG9zZUJ1dHRvblwiOiBcIm9uQ2xvc2VcIixcblxuXHRcdFwiY2hhbmdlIEB1aS5kYXRhXCI6IFwib25GaWxlQ2hhbmdlZFwiLFxuXHR9LFxuXG5cdG1vZGVsRXZlbnRzOiB7XG5cdFx0XCJ1cGxvYWQ6cHJvZ3Jlc3NcIjogXCJvblVwbG9hZFByb2dyZXNzXCIsXG5cdFx0aW52YWxpZDogXCJ2YWxpZGF0aW9uRmFpbFwiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLmhvc3QgPSBvcHRpb25zLmhvc3QgfHwgXCIjbW9kYWxzXCI7XG5cdFx0dGhpcy5tb2RlbCA9IG9wdGlvbnMubW9kZWw7XG5cdFx0dGhpcy5tb2RlbC5pbXBvcnRUeXBlID0gb3B0aW9ucy5pbXBvcnRUeXBlO1xuXHRcdHRoaXMuaW1wb3J0VHlwZSA9IG9wdGlvbnMuaW1wb3J0VHlwZTtcblx0fSxcblxuXHRzaG93OiBmdW5jdGlvbigpIHtcblx0XHQkKFwiLm1vZGFsLWNvbnRhaW5lclwiLCAkKHRoaXMuaG9zdCkpLmFwcGVuZCh0aGlzLnJlbmRlcigpLmVsKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gUmVuZGVyIGEgYmFja2dyb3VuZFxuXHRcdCQoXCIubW9kYWwtZWxlbWVudFwiLCAkKHRoaXMuaG9zdCkpLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHQkKFwiYm9keVwiKS5hZGRDbGFzcyhcImhpZGUtb3ZlcmZsb3dcIik7XG5cblx0XHRpZiAodGhpcy5pbXBvcnRUeXBlID09PSBcInVzZXJcIilcblx0XHRcdHRoaXMudWkuZGV0YWlscy50ZXh0KFwidXNlcjogXCIgKyB0aGlzLm1vZGVsLmdldChcImZpcnN0bmFtZVwiKSArIFwiIFwiICsgdGhpcy5tb2RlbC5nZXQoXCJzdXJuYW1lXCIpICsgXCIgKFVzZXJuYW1lOiBcIiArIHRoaXMubW9kZWwuZ2V0KFwidXNlcm5hbWVcIikgKyBcIilcIik7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy51aS5kZXRhaWxzLnRleHQoXCJib29rOiBcIiArIHRoaXMubW9kZWwuZ2V0KFwidGl0bGVcIikgKyBcIiAoSVNCTjogXCIgKyB0aGlzLm1vZGVsLmdldChcImlzYm5cIikgKyBcIilcIik7XG5cblx0XHR0aGlzLnVpLmltcG9ydFR5cGUudGV4dCh0aGlzLmltcG9ydFR5cGUpO1xuXHRcdC8vIEluaXRpYWxpemUgdGhlIFVJXG5cdFx0dGhpcy5vbkZpbGVDaGFuZ2VkKCk7XG5cdH0sXG5cblx0b25EZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHQvLyBDbGVhbiB1cCB0aGUgYmFja2dyb3VuZFxuXHRcdCQoXCIubW9kYWwtZWxlbWVudFwiLCAkKHRoaXMuaG9zdCkpLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHQkKFwiYm9keVwiKS5yZW1vdmVDbGFzcyhcImhpZGUtb3ZlcmZsb3dcIik7XG5cdH0sXG5cblx0Z2V0RmlsZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMudWkuZGF0YS5nZXQoMCkuZmlsZXMubGVuZ3RoID09PSAwID8gbnVsbCA6IHRoaXMudWkuZGF0YS5nZXQoMCkuZmlsZXNbMF07XG5cdH0sXG5cblx0b25DbGljazogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0fSxcblxuXHRvbkZpbGVDaGFuZ2VkOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5nZXRGaWxlKCkpIHtcblx0XHRcdHRoaXMudWkuaW1wb3J0QnV0dG9uLnByb3AoXCJkaXNhYmxlZFwiLCBmYWxzZSk7XG5cdFx0XHR0aGlzLnVpLmltcG9ydEJ1dHRvbi5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMudWkuaW1wb3J0QnV0dG9uLnByb3AoXCJkaXNhYmxlZFwiLCB0cnVlKTtcblx0XHRcdHRoaXMudWkuaW1wb3J0QnV0dG9uLmFkZENsYXNzKFwiZGlzYWJsZWRcIik7XG5cdFx0fVxuXHR9LFxuXG5cdG9uSW1wb3J0OiBmdW5jdGlvbigpIHtcblx0XHQvLyBTZXQgdGhlIGZpbGVcblx0XHR0aGlzLm1vZGVsLnNldEZpbGUoXCJmaWxlXCIsIHRoaXMuZ2V0RmlsZSgpKTtcblxuXHRcdGlmICh0aGlzLm1vZGVsLmlzVmFsaWQoKSkge1xuXHRcdFx0Ly8gRGlzYWJsZSB0aGUgbW9kYWwgYnV0dG9uc1xuXHRcdFx0dGhpcy5zZXRVSUJ1c3koKTtcblxuXHRcdFx0Ly8gQ29uZmlndXJlIGFuZCBzdGFydCB0aGUgcHJvZ3Jlc3MgYmFyXG5cdFx0XHROUHJvZ3Jlc3MuY29uZmlndXJlKHtcblx0XHRcdFx0cGFyZW50OiAkKFwiLm1vZGFsLWZvb3RlclwiLCB0aGlzLiRlbCkuZ2V0UGF0aCgpLFxuXHRcdFx0XHRzaG93U3Bpbm5lcjogZmFsc2UsXG5cdFx0XHRcdHRyaWNrbGU6IHRydWUsXG5cdFx0XHRcdG1pbmltdW06IDAuMCxcblx0XHRcdH0pLnN0YXJ0KDAuMCk7XG5cblx0XHRcdC8vIFNhdmUgdGhlIG1vZGVsLCB1cGxvYWRpbmcgdGhlIGZpbGVcblx0XHRcdHRoaXMueGhyID0gdGhpcy5tb2RlbC5iaW5hcnlTYXZlKG51bGwsIHtcblx0XHRcdFx0Ly9kYXRhOiB0aGlzLm1vZGVsLmF0dHJpYnV0ZXMsXG5cdFx0XHRcdHZhbGlkYXRlOiBmYWxzZSxcblx0XHRcdFx0d2FpdDogdHJ1ZSxcblx0XHRcdFx0c3VjY2VzczogdGhpcy5vbkltcG9ydFN1Y2Nlc3MuYmluZCh0aGlzKSxcblx0XHRcdFx0ZXJyb3I6IHRoaXMub25JbXBvcnRFcnJvci5iaW5kKHRoaXMpLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdG9uSW1wb3J0U3VjY2VzczogZnVuY3Rpb24ocmVzdWx0KSB7XG5cdFx0dGhpcy54aHIgPSBudWxsO1xuXG5cdFx0dGhpcy5SZXN1bHQgPSBuZXcgSW1wb3J0TW9kZWwoXy5tZXJnZShyZXN1bHQudG9KU09OKCksIHsgaW1wb3J0VHlwZTogdGhpcy5pbXBvcnRUeXBlIH0pKTtcblxuXHRcdE5Qcm9ncmVzcy5zZXQoMS4wKTtcblx0XHR0aGlzLnNldFVJUmVhZHkoKTtcblxuXHRcdHRoaXMudWkuaW1wb3J0QnV0dG9uLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLmNhbmNlbEJ1dHRvbi5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5jbG9zZUJ1dHRvbi5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cblx0XHRpZiAodGhpcy5pbXBvcnRUeXBlID09PSBcInVzZXJcIikge1xuXHRcdFx0dGhpcy51aS5BdHRhY2htZW50c0NvdW50LnJlbW92ZSgpO1xuXHRcdFx0dGhpcy51aS5Qcml2YXRlQXR0YWNobWVudHNDb3VudC5yZW1vdmUoKTtcblx0XHRcdHRoaXMudWkuUmVzb3VyY2VzQ291bnQuZmluZChcIi5jb250ZW50LW1ldGFkYXRhLXZhbHVlXCIpLnRleHQodGhpcy5SZXN1bHQuZ2V0KFwicmVzb3VyY2VzXCIpKTtcblx0XHRcdHRoaXMudWkuRm9sZGVyc0NvdW50LmZpbmQoXCIuY29udGVudC1tZXRhZGF0YS12YWx1ZVwiKS50ZXh0KHRoaXMuUmVzdWx0LmdldChcImZvbGRlcnNcIikpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMudWkuUmVzb3VyY2VzQ291bnQucmVtb3ZlKCk7XG5cdFx0XHR0aGlzLnVpLkZvbGRlcnNDb3VudC5yZW1vdmUoKTtcblx0XHRcdHRoaXMudWkuQXR0YWNobWVudHNDb3VudC5maW5kKFwiLmNvbnRlbnQtbWV0YWRhdGEtdmFsdWVcIikudGV4dCh0aGlzLlJlc3VsdC5nZXQoXCJhdHRhY2htZW50c1wiKSk7XG5cdFx0XHR0aGlzLnVpLlByaXZhdGVBdHRhY2htZW50c0NvdW50LmZpbmQoXCIuY29udGVudC1tZXRhZGF0YS12YWx1ZVwiKS50ZXh0KHRoaXMuUmVzdWx0LmdldChcInByaXZhdGVfYXR0YWNobWVudHNcIikpO1xuXHRcdH1cblxuXHRcdHRoaXMudWkuSGlnaGxpZ2h0c0NvdW50LmZpbmQoXCIuY29udGVudC1tZXRhZGF0YS12YWx1ZVwiKS50ZXh0KHRoaXMuUmVzdWx0LmdldChcImhpZ2hsaWdodHNcIikpO1xuXHRcdHRoaXMudWkuQW5ub3RhdGlvbnNDb3VudC5maW5kKFwiLmNvbnRlbnQtbWV0YWRhdGEtdmFsdWVcIikudGV4dCh0aGlzLlJlc3VsdC5nZXQoXCJhbm5vdGF0aW9uc1wiKSk7XG5cdFx0dGhpcy51aS5OZXRjaENvdW50LmZpbmQoXCIuY29udGVudC1tZXRhZGF0YS12YWx1ZVwiKS50ZXh0KHRoaXMuUmVzdWx0LmdldChcIm5ldGNoXCIpKTtcblxuXHRcdHRoaXMudWkuaW1wb3J0Rm9ybS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5pbXBvcnRSZXN1bHQucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdG9uSW1wb3J0RXJyb3I6IGZ1bmN0aW9uKG1vZGVsLCByZXNwb25zZSkge1xuXHRcdHRoaXMueGhyID0gbnVsbDtcblxuXHRcdE5Qcm9ncmVzcy5zZXQoMS4wKTtcblx0XHR0aGlzLnNldFVJUmVhZHkoKTtcblxuXHRcdGxldCBhbnN3ZXIgPSB7fTtcblxuXHRcdHRyeSB7XG5cdFx0XHRhbnN3ZXIgPSBKU09OLnBhcnNlKHJlc3BvbnNlLnJlc3BvbnNlVGV4dCk7XG5cdFx0fVxuXHRcdGNhdGNoIChlcnJvcikge1xuXHRcdFx0YW5zd2VyLmRldGFpbCA9IChyZXNwb25zZS5zdGF0dXMgPT09IDAgPyBcIkNvbm5lY3Rpb24gZXJyb3JcIiA6IHJlc3BvbnNlLnN0YXR1c1RleHQpICsgXCIgKGNvZGUgXCIgKyByZXNwb25zZS5zdGF0dXMgKyBcIilcIjtcblx0XHR9XG5cblx0XHR0aGlzLnVpLm1lc3NhZ2UudGV4dChcIkVycm9yIGltcG9ydGluZyB1c2VyIGNvbnRlbnQ6IFwiICsgYW5zd2VyLmRldGFpbCB8fCBhbnN3ZXIuaW5mbykucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdG9uQ2FuY2VsOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy54aHIpXG5cdFx0XHR0aGlzLnhoci5hYm9ydCgpO1xuXG5cdFx0dGhpcy5kZXN0cm95KCk7XG5cdFx0dGhpcy50cmlnZ2VyKFwiYWN0aW9uXCIsIFwiY2FuY2VsXCIpO1xuXHR9LFxuXG5cdG9uQ2xvc2U6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZGVzdHJveSgpO1xuXHRcdHRoaXMudHJpZ2dlcihcImFjdGlvblwiLCBcImNsb3NlXCIsIHsgbW9kZWw6IHRoaXMuUmVzdWx0IH0pO1xuXHR9LFxuXG5cdHNldFVJQnVzeTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5pbXBvcnRCdXR0b24uYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblx0XHR0aGlzLnVpLndvcmtpbmdTcGlubmVyLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblxuXHRcdHRoaXMudWkubWVzc2FnZS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0c2V0VUlSZWFkeTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5pbXBvcnRCdXR0b24ucmVtb3ZlQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblx0XHR0aGlzLnVpLndvcmtpbmdTcGlubmVyLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRvblVwbG9hZFByb2dyZXNzOiBmdW5jdGlvbihwZXJjZW50YWdlKSB7XG5cdFx0TlByb2dyZXNzLnNldChwZXJjZW50YWdlIC8gMTAwKTtcblx0fSxcblxuXHR2YWxpZGF0aW9uRmFpbDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jbGVhckVycm9yKCk7XG5cdFx0dGhpcy5zZXRVSVJlYWR5KCk7XG5cblx0XHRfLmVhY2godGhpcy5tb2RlbC52YWxpZGF0aW9uRXJyb3IsIChtZXNzYWdlLCBrZXkpID0+IHtcblx0XHRcdHRoaXMuZGlzcGxheUVycm9yKG1lc3NhZ2UsIHRoaXMudWlba2V5XSk7XG5cdFx0fSk7XG5cdH0sXG5cblx0ZGlzcGxheUVycm9yOiBmdW5jdGlvbihtZXNzYWdlLCBlbGVtZW50KSB7XG5cdFx0ZWxlbWVudC5wYXJlbnQoKS5hcHBlbmQoXCI8c3BhbiBjbGFzcz0nZXJyb3InPlwiICsgbWVzc2FnZSArIFwiPC9zcGFuPlwiKTtcblx0XHRlbGVtZW50Lm9uZShcImNoYW5nZSBrZXl1cFwiLCB0aGlzLmNsZWFyRXJyb3IuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0Y2xlYXJFcnJvcjogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRpZiAoZXZlbnQpXG5cdFx0XHQkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLnBhcmVudCgpLmZpbmQoXCIuZXJyb3JcIikucmVtb3ZlKCk7XG5cdFx0ZWxzZVxuXHRcdFx0JChcIi5lcnJvclwiLCB0aGlzLmVsKS5yZW1vdmUoKTtcblx0fSxcbn0pO1xuIl19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\nvar rester = require(\"rester\");\n\nvar App = require(\"../../../index\");\nvar BookExportImportSources = require(\"../../collections/tools/bookExportImportSources\");\nvar ImportModal = require(\"./common/importModal\");\nvar ImportModel = require(\"../../models/tools/importModel\");\nvar ServerGrid = require(\"../../../lib/serverGrid\");\n\nvar globalChannel = Backbone.Radio.channel(\"global\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"ExportImportBookData\",\n\n\tui: {\n\t\tsaveButton: \"#save\",\n\t\tanswers: \"select.answer\",\n\t\tgrid: \"div.grid\",\n\n\t\tfilterBar: \".ops-bar .filters\",\n\t\tcounterBar: \".ops-bar .counter\",\n\t\tpaging: \".paging\"\n\t},\n\n\tcollectionEvents: {\n\t\t\"toolbar:click:import\": \"importBookData\",\n\t\t\"toolbar:click:export\": \"exportBookData\"\n\t},\n\n\ttemplate: require(\"../../templates/tools/exportImportBookData.nunj\"),\n\n\tfilterExport: function filterExport() {\n\t\tvar user = globalChannel.request(App.Events.Requests.CurrentUser);\n\t\treturn rester.hasAccess(rester.p.api.tools.exportBookData.get, user);\n\t},\n\n\tfilterImport: function filterImport() {\n\t\tvar user = globalChannel.request(App.Events.Requests.CurrentUser);\n\t\treturn rester.hasAccess(rester.p.api.tools.importBookData.post, user);\n\t},\n\n\tonRender: function onRender() {\n\t\tvar tooltips = [{ title: \"Export\", icon: \"fa-cloud-download\", filter: this.filterExport.bind(this) }, { title: \"Import\", icon: \"fa-cloud-upload\", filter: this.filterImport.bind(this) }];\n\n\t\tvar columns = [{ name: \"bookFormat\", label: \"Format\", cell: ServerGrid.HTMLCell.extend({}), editable: false }, { name: \"title\", label: \"Title\", cell: \"string\", editable: false, sortValue: ServerGrid.stringSort }, { name: \"isbn\", label: \"ISBN\", cell: \"string\", editable: false }, { name: \"_id\", label: \"ID\", cell: \"string\", editable: false }, { name: \"version\", label: \"Version\", cell: ServerGrid.VersionCell.extend({}), editable: false }, { label: \"Actions\", cell: new ServerGrid.ToolbarCell({ tooltips: tooltips }), editable: false, sortable: false }];\n\n\t\tvar grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new BookExportImportSources(),\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counterBar,\n\t\t\t\ttemplate: \"Records $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tthis.bindEvents(grid.collection, this.collectionEvents);\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tthis.ui.filterBar.prepend(grid.filter({\n\t\t\tfilterContainer: this.ui.filterBar,\n\t\t\tfilters: [textFilter],\n\t\t\tdefaultFilters: [\"textFilter\"]\n\t\t}).render().el);\n\t},\n\n\texportBookData: function exportBookData(model) {\n\t\twindow.open(settings.urlRoot + \"/api/1.0/tools/exportBookData/?_id=\" + model.get(\"_id\"));\n\t},\n\n\timportBookData: function importBookData(model) {\n\t\tvar modal = new ImportModal({ importType: \"book\", model: new ImportModel({\n\t\t\t\tid: model.get(\"_id\"),\n\t\t\t\ttitle: model.get(\"title\"),\n\t\t\t\tisbn: model.get(\"isbn\"),\n\t\t\t\tendpoint: \"importBookData\"\n\t\t\t}) });\n\n\t\tmodal.show();\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV4cG9ydEltcG9ydEJvb2tEYXRhLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsInNldHRpbmdzIiwicmVzdGVyIiwiQXBwIiwiQm9va0V4cG9ydEltcG9ydFNvdXJjZXMiLCJJbXBvcnRNb2RhbCIsIkltcG9ydE1vZGVsIiwiU2VydmVyR3JpZCIsImdsb2JhbENoYW5uZWwiLCJSYWRpbyIsImNoYW5uZWwiLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJleHRlbmQiLCJjbGFzc05hbWUiLCJ1aSIsInNhdmVCdXR0b24iLCJhbnN3ZXJzIiwiZ3JpZCIsImZpbHRlckJhciIsImNvdW50ZXJCYXIiLCJwYWdpbmciLCJjb2xsZWN0aW9uRXZlbnRzIiwidGVtcGxhdGUiLCJmaWx0ZXJFeHBvcnQiLCJ1c2VyIiwicmVxdWVzdCIsIkV2ZW50cyIsIlJlcXVlc3RzIiwiQ3VycmVudFVzZXIiLCJoYXNBY2Nlc3MiLCJwIiwiYXBpIiwidG9vbHMiLCJleHBvcnRCb29rRGF0YSIsImdldCIsImZpbHRlckltcG9ydCIsImltcG9ydEJvb2tEYXRhIiwicG9zdCIsIm9uUmVuZGVyIiwidG9vbHRpcHMiLCJ0aXRsZSIsImljb24iLCJmaWx0ZXIiLCJiaW5kIiwiY29sdW1ucyIsIm5hbWUiLCJsYWJlbCIsImNlbGwiLCJIVE1MQ2VsbCIsImVkaXRhYmxlIiwic29ydFZhbHVlIiwic3RyaW5nU29ydCIsIlZlcnNpb25DZWxsIiwiVG9vbGJhckNlbGwiLCJzb3J0YWJsZSIsImVsIiwiY29sbGVjdGlvbiIsImNvdW50ZXIiLCJlbGVtZW50IiwiYmluZEV2ZW50cyIsInRleHRGaWx0ZXIiLCJ0eXBlIiwiZGVib3VuY2UiLCJzZXJ2ZXIiLCJwcmVwZW5kIiwiZmlsdGVyQ29udGFpbmVyIiwiZmlsdGVycyIsImRlZmF1bHRGaWx0ZXJzIiwicmVuZGVyIiwibW9kZWwiLCJ3aW5kb3ciLCJvcGVuIiwidXJsUm9vdCIsIm1vZGFsIiwiaW1wb3J0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QUMvQkMsU0FBT0MsSUFBUCxDQUFZekUsU0FBUzBFLE9BQVQsR0FBbUIscUNBQW5CLEdBQTJESCxNQUFNbkMsR0FBTixDQUFVLEtBQVYsQ0FBdkU7QUFDQSxFQTdFK0M7O0FBK0VoREUsaUJBQWdCLHdCQUFTaUMsS0FBVCxFQUFnQjtBQUMvQixNQUFNSSxRQUFRLElBQUl2RSxXQUFKLENBQWdCLEVBQUV3RSxZQUFZLE1BQWQsRUFBc0JMLE9BQU8sSUFBSWxFLFdBQUosQ0FBZ0I7QUFDMUV3RSxRQUFJTixNQUFNbkMsR0FBTixDQUFVLEtBQVYsQ0FEc0U7QUFFMUVNLFdBQU82QixNQUFNbkMsR0FBTixDQUFVLE9BQVYsQ0FGbUU7QUFHMUUwQyxVQUFNUCxNQUFNbkMsR0FBTixDQUFVLE1BQVYsQ0FIb0U7QUFJMUUyQyxjQUFVO0FBSmdFLElBQWhCLENBQTdCLEVBQWhCLENBQWQ7O0FBT0FKLFFBQU1LLElBQU47QUFDQTtBQXhGK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoiZXhwb3J0SW1wb3J0Qm9va0RhdGEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5jb25zdCByZXN0ZXIgPSByZXF1aXJlKFwicmVzdGVyXCIpO1xuXG5jb25zdCBBcHAgPSByZXF1aXJlKFwiLi4vLi4vLi4vaW5kZXhcIik7XG5jb25zdCBCb29rRXhwb3J0SW1wb3J0U291cmNlcyA9IHJlcXVpcmUoXCIuLi8uLi9jb2xsZWN0aW9ucy90b29scy9ib29rRXhwb3J0SW1wb3J0U291cmNlc1wiKTtcbmNvbnN0IEltcG9ydE1vZGFsID0gcmVxdWlyZShcIi4vY29tbW9uL2ltcG9ydE1vZGFsXCIpO1xuY29uc3QgSW1wb3J0TW9kZWwgPSByZXF1aXJlKFwiLi4vLi4vbW9kZWxzL3Rvb2xzL2ltcG9ydE1vZGVsXCIpO1xuY29uc3QgU2VydmVyR3JpZCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9saWIvc2VydmVyR3JpZFwiKTtcblxuY29uc3QgZ2xvYmFsQ2hhbm5lbCA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJnbG9iYWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJFeHBvcnRJbXBvcnRCb29rRGF0YVwiLFxuXG5cdHVpOiB7XG5cdFx0c2F2ZUJ1dHRvbjogXCIjc2F2ZVwiLFxuXHRcdGFuc3dlcnM6IFwic2VsZWN0LmFuc3dlclwiLFxuXHRcdGdyaWQ6IFwiZGl2LmdyaWRcIixcblxuXHRcdGZpbHRlckJhcjogXCIub3BzLWJhciAuZmlsdGVyc1wiLFxuXHRcdGNvdW50ZXJCYXI6IFwiLm9wcy1iYXIgLmNvdW50ZXJcIixcblx0XHRwYWdpbmc6IFwiLnBhZ2luZ1wiLFxuXHR9LFxuXG5cdGNvbGxlY3Rpb25FdmVudHM6IHtcblx0XHRcInRvb2xiYXI6Y2xpY2s6aW1wb3J0XCI6IFwiaW1wb3J0Qm9va0RhdGFcIixcblx0XHRcInRvb2xiYXI6Y2xpY2s6ZXhwb3J0XCI6IFwiZXhwb3J0Qm9va0RhdGFcIixcblx0fSxcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy90b29scy9leHBvcnRJbXBvcnRCb29rRGF0YS5udW5qXCIpLFxuXG5cdGZpbHRlckV4cG9ydDogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgdXNlciA9IGdsb2JhbENoYW5uZWwucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblx0XHRyZXR1cm4gcmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5hcGkudG9vbHMuZXhwb3J0Qm9va0RhdGEuZ2V0LCB1c2VyKTtcblx0fSxcblxuXHRmaWx0ZXJJbXBvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHVzZXIgPSBnbG9iYWxDaGFubmVsLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cdFx0cmV0dXJuIHJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAuYXBpLnRvb2xzLmltcG9ydEJvb2tEYXRhLnBvc3QsIHVzZXIpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCB0b29sdGlwcyA9IFtcblx0XHRcdHsgdGl0bGU6IFwiRXhwb3J0XCIsIGljb246IFwiZmEtY2xvdWQtZG93bmxvYWRcIiwgZmlsdGVyOiB0aGlzLmZpbHRlckV4cG9ydC5iaW5kKHRoaXMpIH0sXG5cdFx0XHR7IHRpdGxlOiBcIkltcG9ydFwiLCBpY29uOiBcImZhLWNsb3VkLXVwbG9hZFwiLCBmaWx0ZXI6IHRoaXMuZmlsdGVySW1wb3J0LmJpbmQodGhpcykgfSxcblx0XHRdO1xuXG5cdFx0Y29uc3QgY29sdW1ucyA9IFtcblx0XHRcdHsgbmFtZTogXCJib29rRm9ybWF0XCIsIGxhYmVsOiBcIkZvcm1hdFwiLCBjZWxsOiBTZXJ2ZXJHcmlkLkhUTUxDZWxsLmV4dGVuZCh7fSksIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcInRpdGxlXCIsIGxhYmVsOiBcIlRpdGxlXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSwgc29ydFZhbHVlOiBTZXJ2ZXJHcmlkLnN0cmluZ1NvcnQgfSxcblx0XHRcdHsgbmFtZTogXCJpc2JuXCIsIGxhYmVsOiBcIklTQk5cIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiX2lkXCIsIGxhYmVsOiBcIklEXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcInZlcnNpb25cIiwgbGFiZWw6IFwiVmVyc2lvblwiLCBjZWxsOiBTZXJ2ZXJHcmlkLlZlcnNpb25DZWxsLmV4dGVuZCh7fSksIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBsYWJlbDogXCJBY3Rpb25zXCIsIGNlbGw6IG5ldyBTZXJ2ZXJHcmlkLlRvb2xiYXJDZWxsKHsgdG9vbHRpcHM6IHRvb2x0aXBzIH0pLCBlZGl0YWJsZTogZmFsc2UsIHNvcnRhYmxlOiBmYWxzZSB9LFxuXHRcdF07XG5cblx0XHRjb25zdCBncmlkID0gbmV3IFNlcnZlckdyaWQoe1xuXHRcdFx0ZWw6IHRoaXMudWkuZ3JpZCxcblx0XHRcdGNvbHVtbnM6IGNvbHVtbnMsXG5cdFx0XHRjb2xsZWN0aW9uOiBuZXcgQm9va0V4cG9ydEltcG9ydFNvdXJjZXMoKSxcblx0XHRcdGNvdW50ZXI6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5jb3VudGVyQmFyLFxuXHRcdFx0XHR0ZW1wbGF0ZTogXCJSZWNvcmRzICRzdGFydCAtICRlbmQgb2YgJHRvdGFsXCIsXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdGVsZW1lbnQ6IHRoaXMudWkucGFnaW5nLFxuXHRcdFx0fSxcblx0XHR9KTtcblxuXHRcdHRoaXMuYmluZEV2ZW50cyhncmlkLmNvbGxlY3Rpb24sIHRoaXMuY29sbGVjdGlvbkV2ZW50cyk7XG5cblx0XHRjb25zdCB0ZXh0RmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJ0ZXh0XCIsXG5cdFx0XHRuYW1lOiBcInRleHRGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlRleHQgU2VhcmNoXCIsXG5cdFx0XHRkZWJvdW5jZTogMjAwLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdH07XG5cblx0XHR0aGlzLnVpLmZpbHRlckJhci5wcmVwZW5kKGdyaWQuZmlsdGVyKHtcblx0XHRcdGZpbHRlckNvbnRhaW5lcjogdGhpcy51aS5maWx0ZXJCYXIsXG5cdFx0XHRmaWx0ZXJzOiBbdGV4dEZpbHRlcl0sXG5cdFx0XHRkZWZhdWx0RmlsdGVyczogW1widGV4dEZpbHRlclwiXSxcblx0XHR9KS5yZW5kZXIoKS5lbCk7XG5cdH0sXG5cblx0ZXhwb3J0Qm9va0RhdGE6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0d2luZG93Lm9wZW4oc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvdG9vbHMvZXhwb3J0Qm9va0RhdGEvP19pZD1cIiArIG1vZGVsLmdldChcIl9pZFwiKSk7XG5cdH0sXG5cblx0aW1wb3J0Qm9va0RhdGE6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0Y29uc3QgbW9kYWwgPSBuZXcgSW1wb3J0TW9kYWwoeyBpbXBvcnRUeXBlOiBcImJvb2tcIiwgbW9kZWw6IG5ldyBJbXBvcnRNb2RlbCh7XG5cdFx0XHRpZDogbW9kZWwuZ2V0KFwiX2lkXCIpLFxuXHRcdFx0dGl0bGU6IG1vZGVsLmdldChcInRpdGxlXCIpLFxuXHRcdFx0aXNibjogbW9kZWwuZ2V0KFwiaXNiblwiKSxcblx0XHRcdGVuZHBvaW50OiBcImltcG9ydEJvb2tEYXRhXCIsXG5cdFx0fSkgfSk7XG5cblx0XHRtb2RhbC5zaG93KCk7XG5cdH0sXG59KTtcbiJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\nvar rester = require(\"rester\");\n\nvar App = require(\"../../../index\");\nvar ImportModal = require(\"./common/importModal\");\nvar ImportModel = require(\"../../models/tools/importModel\");\nvar ServerGrid = require(\"../../../lib/serverGrid\");\nvar UserExportImportSources = require(\"../../collections/tools/userExportImportSources\");\n\nvar globalChannel = Backbone.Radio.channel(\"global\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"ExportImportUserData\",\n\n\tui: {\n\t\tsaveButton: \"#save\",\n\t\tanswers: \"select.answer\",\n\t\tgrid: \"div.grid\",\n\n\t\tfilterBar: \".ops-bar .filters\",\n\t\tcounterBar: \".ops-bar .counter\",\n\t\tpaging: \".paging\"\n\t},\n\n\tcollectionEvents: {\n\t\t\"toolbar:click:import\": \"importUserData\",\n\t\t\"toolbar:click:export\": \"exportUserData\"\n\t},\n\n\ttemplate: require(\"../../templates/tools/exportImportUserData.nunj\"),\n\n\tfilterExport: function filterExport() {\n\t\tvar user = globalChannel.request(App.Events.Requests.CurrentUser);\n\t\treturn rester.hasAccess(rester.p.api.tools.exportUserData.get, user);\n\t},\n\n\tfilterImport: function filterImport() {\n\t\tvar user = globalChannel.request(App.Events.Requests.CurrentUser);\n\t\treturn rester.hasAccess(rester.p.api.tools.importUserData.post, user);\n\t},\n\n\tonRender: function onRender() {\n\t\tvar tooltips = [{ title: \"Export\", icon: \"fa-cloud-download\", filter: this.filterExport.bind(this) }, { title: \"Import\", icon: \"fa-cloud-upload\", filter: this.filterImport.bind(this) }];\n\n\t\tvar columns = [{ name: \"firstname\", label: \"First Name\", cell: \"string\", editable: false }, { name: \"surname\", label: \"Surname\", cell: \"string\", editable: false }, { name: \"_id\", label: \"ID\", cell: \"string\", editable: false }, { label: \"Actions\", cell: new ServerGrid.ToolbarCell({ tooltips: tooltips }), editable: false, sortable: false }];\n\n\t\tvar grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new UserExportImportSources(),\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counterBar,\n\t\t\t\ttemplate: \"Records $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tthis.bindEvents(grid.collection, this.collectionEvents);\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tthis.ui.filterBar.prepend(grid.filter({\n\t\t\tfilterContainer: this.ui.filterBar,\n\t\t\tfilters: [textFilter],\n\t\t\tdefaultFilters: [\"textFilter\"]\n\t\t}).render().el);\n\t},\n\n\texportUserData: function exportUserData(model) {\n\t\twindow.open(settings.urlRoot + \"/api/1.0/tools/exportUserData/?_id=\" + model.get(\"_id\"));\n\t},\n\n\timportUserData: function importUserData(model) {\n\t\tvar modal = new ImportModal({ importType: \"user\", model: new ImportModel({\n\t\t\t\tid: model.get(\"user_id\"),\n\t\t\t\tfirstname: model.get(\"firstname\"),\n\t\t\t\tsurname: model.get(\"surname\"),\n\t\t\t\tusername: model.get(\"username\"),\n\t\t\t\tendpoint: \"importUserData\"\n\t\t\t}) });\n\n\t\tmodal.show();\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV4cG9ydEltcG9ydFVzZXJEYXRhLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsInNldHRpbmdzIiwicmVzdGVyIiwiQXBwIiwiSW1wb3J0TW9kYWwiLCJJbXBvcnRNb2RlbCIsIlNlcnZlckdyaWQiLCJVc2VyRXhwb3J0SW1wb3J0U291cmNlcyIsImdsb2JhbENoYW5uZWwiLCJSYWRpbyIsImNoYW5uZWwiLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJleHRlbmQiLCJjbGFzc05hbWUiLCJ1aSIsInNhdmVCdXR0b24iLCJhbnN3ZXJzIiwiZ3JpZCIsImZpbHRlckJhciIsImNvdW50ZXJCYXIiLCJwYWdpbmciLCJjb2xsZWN0aW9uRXZlbnRzIiwidGVtcGxhdGUiLCJmaWx0ZXJFeHBvcnQiLCJ1c2VyIiwicmVxdWVzdCIsIkV2ZW50cyIsIlJlcXVlc3RzIiwiQ3VycmVudFVzZXIiLCJoYXNBY2Nlc3MiLCJwIiwiYXBpIiwidG9vbHMiLCJleHBvcnRVc2VyRGF0YSIsImdldCIsImZpbHRlckltcG9ydCIsImltcG9ydFVzZXJEYXRhIiwicG9zdCIsIm9uUmVuZGVyIiwidG9vbHRpcHMiLCJ0aXRsZSIsImljb24iLCJmaWx0ZXIiLCJiaW5kIiwiY29sdW1ucyIsIm5hbWUiLCJsYWJlbCIsImNlbGwiLCJlZGl0YWJsZSIsIlRvb2xiYXJDZWxsIiwic29ydGFibGUiLCJlbCIsImNvbGxlY3Rpb24iLCJjb3VudGVyIiwiZWxlbWVudCIsImJpbmRFdmVudHMiLCJ0ZXh0RmlsdGVyIiwidHlwZSIsImRlYm91bmNlIiwic2VydmVyIiwicHJlcGVuZCIsImZpbHRlckNvbnRhaW5lciIsImZpbHRlcnMiLCJkZWZhdWx0RmlsdGVycyIsInJlbmRlciIsIm1vZGVsIiwid2luZG93Iiwib3BlbiIsInVybFJvb3QiLCJtb2RhbCIsImltcG9ydFR5cGUiLCJpZCIsImZpcnN0bmFtZSIsInN1cm5hbWUiLCJ1c2VybmFtZSIsImVuZHBv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RDtBQUcxRXVDLGFBQVNSLE1BQU0vQixHQUFOLENBQVUsU0FBVixDQUhpRTtBQUkxRXdDLGNBQVVULE1BQU0vQixHQUFOLENBQVUsVUFBVixDQUpnRTtBQUsxRXlDLGNBQVU7QUFMZ0UsSUFBaEIsQ0FBN0IsRUFBaEIsQ0FBZDs7QUFRQU4sUUFBTU8sSUFBTjtBQUNBO0FBdkYrQyxDQUFoQyxDQUFqQiIsImZpbGUiOiJleHBvcnRJbXBvcnRVc2VyRGF0YS5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5cbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcbmNvbnN0IHJlc3RlciA9IHJlcXVpcmUoXCJyZXN0ZXJcIik7XG5cbmNvbnN0IEFwcCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9pbmRleFwiKTtcbmNvbnN0IEltcG9ydE1vZGFsID0gcmVxdWlyZShcIi4vY29tbW9uL2ltcG9ydE1vZGFsXCIpO1xuY29uc3QgSW1wb3J0TW9kZWwgPSByZXF1aXJlKFwiLi4vLi4vbW9kZWxzL3Rvb2xzL2ltcG9ydE1vZGVsXCIpO1xuY29uc3QgU2VydmVyR3JpZCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9saWIvc2VydmVyR3JpZFwiKTtcbmNvbnN0IFVzZXJFeHBvcnRJbXBvcnRTb3VyY2VzID0gcmVxdWlyZShcIi4uLy4uL2NvbGxlY3Rpb25zL3Rvb2xzL3VzZXJFeHBvcnRJbXBvcnRTb3VyY2VzXCIpO1xuXG5jb25zdCBnbG9iYWxDaGFubmVsID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcIkV4cG9ydEltcG9ydFVzZXJEYXRhXCIsXG5cblx0dWk6IHtcblx0XHRzYXZlQnV0dG9uOiBcIiNzYXZlXCIsXG5cdFx0YW5zd2VyczogXCJzZWxlY3QuYW5zd2VyXCIsXG5cdFx0Z3JpZDogXCJkaXYuZ3JpZFwiLFxuXG5cdFx0ZmlsdGVyQmFyOiBcIi5vcHMtYmFyIC5maWx0ZXJzXCIsXG5cdFx0Y291bnRlckJhcjogXCIub3BzLWJhciAuY291bnRlclwiLFxuXHRcdHBhZ2luZzogXCIucGFnaW5nXCIsXG5cdH0sXG5cblx0Y29sbGVjdGlvbkV2ZW50czoge1xuXHRcdFwidG9vbGJhcjpjbGljazppbXBvcnRcIjogXCJpbXBvcnRVc2VyRGF0YVwiLFxuXHRcdFwidG9vbGJhcjpjbGljazpleHBvcnRcIjogXCJleHBvcnRVc2VyRGF0YVwiLFxuXHR9LFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL3Rvb2xzL2V4cG9ydEltcG9ydFVzZXJEYXRhLm51bmpcIiksXG5cblx0ZmlsdGVyRXhwb3J0OiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCB1c2VyID0gZ2xvYmFsQ2hhbm5lbC5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpO1xuXHRcdHJldHVybiByZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmFwaS50b29scy5leHBvcnRVc2VyRGF0YS5nZXQsIHVzZXIpO1xuXHR9LFxuXG5cdGZpbHRlckltcG9ydDogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgdXNlciA9IGdsb2JhbENoYW5uZWwucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblx0XHRyZXR1cm4gcmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5hcGkudG9vbHMuaW1wb3J0VXNlckRhdGEucG9zdCwgdXNlcik7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHRvb2x0aXBzID0gW1xuXHRcdFx0eyB0aXRsZTogXCJFeHBvcnRcIiwgaWNvbjogXCJmYS1jbG91ZC1kb3dubG9hZFwiLCBmaWx0ZXI6IHRoaXMuZmlsdGVyRXhwb3J0LmJpbmQodGhpcykgfSxcblx0XHRcdHsgdGl0bGU6IFwiSW1wb3J0XCIsIGljb246IFwiZmEtY2xvdWQtdXBsb2FkXCIsIGZpbHRlcjogdGhpcy5maWx0ZXJJbXBvcnQuYmluZCh0aGlzKSB9LFxuXHRcdF07XG5cblx0XHRjb25zdCBjb2x1bW5zID0gW1xuXHRcdFx0eyBuYW1lOiBcImZpcnN0bmFtZVwiLCBsYWJlbDogXCJGaXJzdCBOYW1lXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcInN1cm5hbWVcIiwgbGFiZWw6IFwiU3VybmFtZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJfaWRcIiwgbGFiZWw6IFwiSURcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IGxhYmVsOiBcIkFjdGlvbnNcIiwgY2VsbDogbmV3IFNlcnZlckdyaWQuVG9vbGJhckNlbGwoeyB0b29sdGlwczogdG9vbHRpcHMgfSksIGVkaXRhYmxlOiBmYWxzZSwgc29ydGFibGU6IGZhbHNlIH0sXG5cdFx0XTtcblxuXHRcdGNvbnN0IGdyaWQgPSBuZXcgU2VydmVyR3JpZCh7XG5cdFx0XHRlbDogdGhpcy51aS5ncmlkLFxuXHRcdFx0Y29sdW1uczogY29sdW1ucyxcblx0XHRcdGNvbGxlY3Rpb246IG5ldyBVc2VyRXhwb3J0SW1wb3J0U291cmNlcygpLFxuXHRcdFx0Y291bnRlcjoge1xuXHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLmNvdW50ZXJCYXIsXG5cdFx0XHRcdHRlbXBsYXRlOiBcIlJlY29yZHMgJHN0YXJ0IC0gJGVuZCBvZiAkdG90YWxcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5wYWdpbmcsXG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5iaW5kRXZlbnRzKGdyaWQuY29sbGVjdGlvbiwgdGhpcy5jb2xsZWN0aW9uRXZlbnRzKTtcblxuXHRcdGNvbnN0IHRleHRGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcInRleHRcIixcblx0XHRcdG5hbWU6IFwidGV4dEZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiVGV4dCBTZWFyY2hcIixcblx0XHRcdGRlYm91bmNlOiAyMDAsXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdHRoaXMudWkuZmlsdGVyQmFyLnByZXBlbmQoZ3JpZC5maWx0ZXIoe1xuXHRcdFx0ZmlsdGVyQ29udGFpbmVyOiB0aGlzLnVpLmZpbHRlckJhcixcblx0XHRcdGZpbHRlcnM6IFt0ZXh0RmlsdGVyXSxcblx0XHRcdGRlZmF1bHRGaWx0ZXJzOiBbXCJ0ZXh0RmlsdGVyXCJdLFxuXHRcdH0pLnJlbmRlcigpLmVsKTtcblx0fSxcblxuXHRleHBvcnRVc2VyRGF0YTogZnVuY3Rpb24obW9kZWwpIHtcblx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC90b29scy9leHBvcnRVc2VyRGF0YS8/X2lkPVwiICsgbW9kZWwuZ2V0KFwiX2lkXCIpKTtcblx0fSxcblxuXHRpbXBvcnRVc2VyRGF0YTogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRjb25zdCBtb2RhbCA9IG5ldyBJbXBvcnRNb2RhbCh7IGltcG9ydFR5cGU6IFwidXNlclwiLCBtb2RlbDogbmV3IEltcG9ydE1vZGVsKHtcblx0XHRcdGlkOiBtb2RlbC5nZXQoXCJ1c2VyX2lkXCIpLFxuXHRcdFx0Zmlyc3RuYW1lOiBtb2RlbC5nZXQoXCJmaXJzdG5hbWVcIiksXG5cdFx0XHRzdXJuYW1lOiBtb2RlbC5nZXQoXCJzdXJuYW1lXCIpLFxuXHRcdFx0dXNlcm5hbWU6IG1vZGVsLmdldChcInVzZXJuYW1lXCIpLFxuXHRcdFx0ZW5kcG9pbnQ6IFwiaW1wb3J0VXNlckRhdGFcIixcblx0XHR9KSB9KTtcblxuXHRcdG1vZGFsLnNob3coKTtcblx0fSxcbn0pO1xuIl19",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\nvar Promise = require(\"bluebird\");\n\nvar settings = require(\"app-settings\");\n\nvar PromotedGroupCollection = require(\"../../collections/tools/promotedGroupCollection\");\nvar PromotionPlanCollection = require(\"../../collections/tools/promotionPlanCollection\");\nvar SmallModal = require(\"../../../lib/smallModal\");\nvar GroupModal = require(\"../../../groups/views/groupModal\");\n\nvar guideViewButton = {\n\tfinish: \"finish\",\n\tnext: \"next\",\n\tprevious: \"previous\",\n\tstart: \"start\"\n};\n\nvar migrationChannel = Backbone.Radio.channel(\"migrateStudents\");\n\nvar IntroductionView = Backbone.Marionette.View.extend({\n\tclassName: \"introduction-view\",\n\n\ttemplate: require(\"../../templates/tools/migrateStudents.nunj\").introduction\n});\n\nvar GuideView = Backbone.Marionette.View.extend({\n\tclassName: \"guide-view\",\n\n\ttemplate: require(\"../../templates/tools/migrateStudents.nunj\").guide,\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tbuttonFinish: guideViewButton.finish,\n\t\t\tbuttonNext: guideViewButton.next,\n\t\t\tbuttonPrevious: guideViewButton.previous,\n\t\t\tbuttonStart: guideViewButton.start,\n\n\t\t\tbuttons: this.options.buttons,\n\t\t\tprompt: this.options.prompt,\n\t\t\tstep: this.options.step\n\t\t};\n\t},\n\n\tui: {\n\t\tbuttonContainer: \".button-container\",\n\t\tstatusContainer: \".status-container\",\n\n\t\tbuttonFinish: \"button#finish\",\n\t\tbuttonNext: \"button#next\",\n\t\tbuttonPrevious: \"button#previous\",\n\t\tbuttonStart: \"button#start\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonFinish\": \"onButtonFinishClick\",\n\t\t\"click @ui.buttonNext\": \"onButtonNextClick\",\n\t\t\"click @ui.buttonPrevious\": \"onButtonPreviousClick\",\n\t\t\"click @ui.buttonStart\": \"onButtonStartClick\",\n\t\t\"change select\": \"onSelectChange\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\n\t\tthis.listenTo(migrationChannel, {\n\t\t\t\"status:busy\": this.onStatusBusy.bind(this),\n\t\t\t\"status:ready\": this.onStatusReady.bind(this)\n\t\t});\n\t},\n\n\tonSelectChange: function onSelectChange() {\n\t\t$(\"select[name='yearChooser']\", this.el).prop(\"disabled\", true);\n\t\tthis.trigger(\"yearChange\", parseInt($(\"select[name='yearChooser']\", this.el).val(), 10));\n\t},\n\n\tonButtonFinishClick: function onButtonFinishClick() {\n\t\tmigrationChannel.trigger(\"guide:finish\");\n\t},\n\n\tonButtonNextClick: function onButtonNextClick() {\n\t\tmigrationChannel.trigger(\"guide:next\");\n\t},\n\n\tonButtonPreviousClick: function onButtonPreviousClick() {\n\t\tmigrationChannel.trigger(\"guide:previous\");\n\t},\n\n\tonButtonStartClick: function onButtonStartClick() {\n\t\tmigrationChannel.trigger(\"guide:start\");\n\t},\n\n\tonStatusBusy: function onStatusBusy() {\n\t\tthis.showSpinner();\n\t},\n\n\tonStatusReady: function onStatusReady() {\n\t\tthis.hideSpinner();\n\t},\n\n\tshowSpinner: function showSpinner() {\n\t\tthis.ui.buttonContainer.addClass(\"hide\");\n\t\tthis.ui.statusContainer.removeClass(\"hide\");\n\t},\n\n\thideSpinner: function hideSpinner() {\n\t\tthis.ui.statusContainer.addClass(\"hide\");\n\t\tthis.ui.buttonContainer.removeClass(\"hide\");\n\t}\n});\n\nvar ListCategory = Backbone.Marionette.View.extend({\n\tclassName: \"list-category\",\n\n\ttemplate: require(\"../../templates/tools/migrateStudents.nunj\").listCategory,\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\t\tthis.visible = false;\n\n\t\tthis.listenTo(this.model, \"list:category:change\", this.onListCategoryChange.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\tif (this.visible) this.$el.removeClass(\"hide\");else this.$el.addClass(\"hide\");\n\t},\n\n\tonListCategoryChange: function onListCategoryChange(selectedCategories, unselectedCategories) {\n\t\tthis.visible = true;\n\n\t\tif (this.options.hideOn) {\n\t\t\tif (_.includes(selectedCategories, this.model.get(\"value\"))) this.visible = false;\n\t\t} else if (_.includes(unselectedCategories, this.model.get(\"value\"))) {\n\t\t\tthis.visible = false;\n\t\t}\n\n\t\tif (!_.isNil(this.$el)) this.render();\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(this.model);\n\t}\n});\n\nvar ListItem = Backbone.Marionette.View.extend({\n\tclassName: \"list-item\",\n\n\ttemplate: require(\"../../templates/tools/migrateStudents.nunj\").listItem,\n\n\tui: {\n\t\tvalue: \".value\",\n\t\tselectToggle: \".select-toggle\",\n\t\tselectedIcon: \".selected-icon\",\n\t\tunselectedIcon: \".unselected-icon\",\n\t\teditBtn: \".edit-btn\"\n\t},\n\n\tevents: {\n\t\tclick: \"onClick\"\n\t},\n\n\tmodelEvents: {\n\t\t\"change:selected\": \"onModelSelectedChange\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\n\t\tthis.listenTo(migrationChannel, \"list:item:click\", this.onListItemClick.bind(this));\n\t\tthis.listenTo(migrationChannel, \"list:item:toggle\", this.onListItemToggle.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\tif (this.options.interactive) {\n\t\t\tthis.$el.addClass(\"interactive\");\n\n\t\t\tif (!_.isUndefined(this.options.hideOn)) {\n\t\t\t\tif (this.model.get(\"selected\") === this.options.hideOn) this.$el.addClass(\"hide\");else this.$el.removeClass(\"hide\");\n\t\t\t}\n\n\t\t\tif (this.options.editable) this.ui.editBtn.removeClass(\"hide\");\n\n\t\t\tif (this.options.selectedIcon) {\n\t\t\t\tthis.$el.unbind(\"click\");\n\t\t\t\tthis.$el.removeClass(\"interactive\");\n\t\t\t\tthis.ui.selectToggle.bind(\"click\", this.toggleSelected.bind(this));\n\t\t\t\tthis.ui.editBtn.bind(\"click\", this.editBtnClick.bind(this));\n\n\t\t\t\tif (this.model.get(\"selected\")) {\n\t\t\t\t\tthis.ui.selectedIcon.removeClass(\"hide\");\n\t\t\t\t\tthis.ui.unselectedIcon.addClass(\"hide\");\n\t\t\t\t} else {\n\t\t\t\t\tthis.ui.selectedIcon.addClass(\"hide\");\n\t\t\t\t\tthis.ui.unselectedIcon.removeClass(\"hide\");\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.$el.removeClass(\"interactive\");\n\t\t}\n\t},\n\n\tonClick: function onClick() {\n\t\tif (this.options.interactive) {\n\t\t\tif (this.options.toggleMode) {\n\t\t\t\tthis.model.set(\"selected\", !this.model.get(\"selected\"));\n\t\t\t\tmigrationChannel.trigger(\"list:item:toggle\");\n\t\t\t} else {\n\t\t\t\tmigrationChannel.trigger(\"list:item:click\", this.model.get(\"key\"));\n\t\t\t}\n\t\t}\n\t},\n\n\tonListItemClick: function onListItemClick(key) {\n\t\tif (this.model.has(\"key\") && this.model.get(\"key\") === key) this.$el.addClass(\"highlighted\");else this.$el.removeClass(\"highlighted\");\n\t},\n\n\tonListItemToggle: function onListItemToggle(key) {\n\t\tif (this.model.has(\"key\") && this.model.get(\"key\") === key) this.toggleSelected();\n\t},\n\n\ttoggleSelected: function toggleSelected() {\n\t\tif (this.options.toggleMode) this.model.set(\"selected\", !this.model.get(\"selected\"));\n\t\tif (this.model.get(\"selected\")) {\n\t\t\tthis.ui.selectedIcon.removeClass(\"hide\");\n\t\t\tthis.ui.unselectedIcon.addClass(\"hide\");\n\t\t} else {\n\t\t\tthis.ui.selectedIcon.addClass(\"hide\");\n\t\t\tthis.ui.unselectedIcon.removeClass(\"hide\");\n\t\t}\n\t},\n\n\tonModelSelectedChange: function onModelSelectedChange() {\n\t\tthis.render();\n\t},\n\n\tonValueChange: function onValueChange(field) {\n\t\tthis.model.set(\"value\", this.model.get(field));\n\t\tthis.ui.value.text(this.model.get(field));\n\t},\n\n\teditBtnClick: function editBtnClick() {\n\t\tthis.model.set(\"subject_name\", this.model.get(\"subject\"));\n\t\tthis.model.set(\"subject\", this.model.get(\"subject_id\"));\n\t\tthis.listenTo(this.model, \"change:name\", this.onValueChange.bind(this, \"name\"));\n\n\t\tvar modal = new GroupModal({\n\t\t\tmodel: this.model,\n\t\t\tdontSave: true\n\t\t});\n\n\t\tmodal.show();\n\t}\n});\n\nvar List = Backbone.Marionette.CollectionView.extend({\n\tclassName: \"list\",\n\n\tchildView: function childView(model) {\n\t\tif (model.has(\"category\") && model.get(\"category\")) return ListCategory;\n\n\t\treturn ListItem;\n\t},\n\n\tchildViewOptions: function childViewOptions() {\n\t\treturn {\n\t\t\thideOn: this.options.hideOn,\n\t\t\tinteractive: this.options.interactive,\n\t\t\ttoggleMode: this.options.toggleMode,\n\t\t\tselectedIcon: this.options.showSelected,\n\t\t\teditable: this.options.editable\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = _.isNil(options) ? {} : options;\n\t\tthis.options.interactive = _.isUndefined(this.options.interactive) ? true : this.options.interactive;\n\n\t\tthis.listenTo(migrationChannel, \"list:item:toggle\", this.onListItemToggle.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.updateCategories();\n\t},\n\n\tupdateCategories: function updateCategories() {\n\t\tvar selectedCategories = this.getSelectedCategories();\n\t\tvar unselectedCategories = this.getUnselectedCategories();\n\n\t\t_.forEach(this.collection.models, function (model) {\n\t\t\tif (model.has(\"category\") && model.get(\"category\")) model.trigger(\"list:category:change\", selectedCategories, unselectedCategories);\n\t\t});\n\t},\n\n\tonListItemToggle: function onListItemToggle() {\n\t\tthis.updateCategories();\n\t},\n\n\tgetSelectedCategories: function getSelectedCategories() {\n\t\treturn _.compact(_.map(this.getCategoryMap(), function (occurrences, category) {\n\t\t\treturn occurrences.selected === occurrences.total ? category : null;\n\t\t}));\n\t},\n\n\tgetUnselectedCategories: function getUnselectedCategories() {\n\t\treturn _.compact(_.map(this.getCategoryMap(), function (occurrences, category) {\n\t\t\treturn occurrences.selected === 0 ? category : null;\n\t\t}));\n\t},\n\n\tgetCategoryMap: function getCategoryMap() {\n\t\treturn _.reduce(this.collection.models, function (acc, model) {\n\t\t\tif (model.has(\"parent\")) {\n\t\t\t\tif (_.isNil(acc[model.get(\"parent\")])) {\n\t\t\t\t\tacc[model.get(\"parent\")] = {\n\t\t\t\t\t\tselected: 0,\n\t\t\t\t\t\ttotal: 0\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tacc[model.get(\"parent\")].selected += model.get(\"selected\") ? 1 : 0;\n\t\t\t\tacc[model.get(\"parent\")].total++;\n\t\t\t}\n\n\t\t\treturn acc;\n\t\t}, {});\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(migrationChannel);\n\t}\n});\n\nvar GradeSelector = Backbone.Marionette.View.extend({\n\tclassName: \"selector\",\n\n\ttemplate: require(\"../../templates/tools/migrateStudents.nunj\").selector,\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tleftListTitle: this.options.sourceYear,\n\t\t\trightListTitle: this.options.targetYear\n\t\t};\n\t},\n\n\tregions: {\n\t\tleft: \".list-region#left\",\n\t\tright: \".list-region#right\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.gradeCollection = options.gradeCollection;\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.showChildView(\"left\", new List({\n\t\t\tcollection: this.gradeCollection,\n\t\t\thideOn: true,\n\t\t\ttoggleMode: true\n\t\t}));\n\n\t\tthis.showChildView(\"right\", new List({\n\t\t\tcollection: this.gradeCollection,\n\t\t\thideOn: false,\n\t\t\ttoggleMode: true\n\t\t}));\n\t}\n});\n\nvar GroupViewer = Backbone.Marionette.View.extend({\n\tclassName: \"selector\",\n\n\ttemplate: require(\"../../templates/tools/migrateStudents.nunj\").selector,\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tleftListTitle: \"Grades\",\n\t\t\trightListTitle: \"New Groups\"\n\t\t};\n\t},\n\n\tregions: {\n\t\tleft: \".list-region#left\",\n\t\tright: \".list-region#right\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.gradeCollection = options.gradeCollection;\n\t\tthis.promotedGroupCollection = options.promotedGroupCollection;\n\t\tthis.currentGroupCollection = new Backbone.Collection(_.map(options.promotedGroupCollection.models, function (model) {\n\t\t\tif (model.has(\"selected\")) model.set({ value: model.get(\"name\") });else model.set({ selected: true, value: model.get(\"name\") });\n\t\t\treturn model;\n\t\t}));\n\n\t\tthis.listenTo(migrationChannel, \"list:item:click\", this.onListItemClick.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.showChildView(\"left\", new List({\n\t\t\tcollection: this.gradeCollection,\n\t\t\thideOn: false,\n\t\t\ttoggleMode: false\n\t\t}));\n\n\t\tthis.showChildView(\"right\", new List({\n\t\t\tcollection: this.currentGroupCollection,\n\t\t\tinteractive: true,\n\t\t\ttoggleMode: true,\n\t\t\tshowSelected: true,\n\t\t\teditable: true\n\t\t}));\n\t},\n\n\tonListItemClick: function onListItemClick(grade) {\n\t\tvar groupsForGrade = _.filter(this.promotedGroupCollection.models, function (model) {\n\t\t\treturn model.get(\"oldGrade\") === grade;\n\t\t});\n\n\t\tthis.currentGroupCollection.reset(_.map(groupsForGrade, function (model) {\n\t\t\tif (model.has(\"selected\")) model.set({ value: model.get(\"name\") });else model.set({ selected: true, value: model.get(\"name\") });\n\t\t\treturn model;\n\t\t}));\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(migrationChannel);\n\t}\n});\n\nvar PlanView = Backbone.Marionette.View.extend({\n\tclassName: \"plan\",\n\n\ttemplate: require(\"../../templates/tools/migrateStudents.nunj\").plan,\n\n\tregions: {\n\t\tlist: \".list-region\"\n\t},\n\n\tui: {\n\t\tlinkDownload: \".list-download > a\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.linkDownload\": \"onLinkDownloadClick\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.promotionPlanCollection = options.promotionPlanCollection;\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.showChildView(\"list\", new List({\n\t\t\tcollection: this.promotionPlanCollection,\n\t\t\tinteractive: false\n\t\t}));\n\t},\n\n\tonLinkDownloadClick: function onLinkDownloadClick() {\n\t\tmigrationChannel.trigger(\"plan:download\");\n\t}\n});\n\nvar SuccessView = Backbone.Marionette.View.extend({\n\tclassName: \"message-view\",\n\n\ttemplate: require(\"../../templates/tools/migrateStudents.nunj\").message,\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tmessage: this.options.message,\n\t\t\ttitle: \"Success\"\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\t}\n});\n\nvar MigrationView = Backbone.Marionette.View.extend({\n\tclassName: \"migration-view\",\n\n\ttemplate: require(\"../../templates/tools/migrateStudents.nunj\").migration,\n\n\tregions: {\n\t\tguide: \".guide-region\",\n\t\twork: \".work-region\"\n\t},\n\n\tui: {\n\t\tdownloadHelper: \"a#download-helper\",\n\t\tworkRegion: \".work-region\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tvar currentYear = moment().year();\n\n\t\tthis.sourceYear = moment().month() < settings.yearStart ? currentYear - 1 : currentYear;\n\t\tthis.targetYear = this.sourceYear + 1;\n\n\t\tvar gradeCategories = _.reduce(settings.gradeList, function (sum, num, key) {\n\t\t\tsum[key] = _.reduce(num.sort(function (a, b) {\n\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t}), function (sum1, num1) {\n\t\t\t\tsum1.push({ key: num1.value, value: num1.name });\n\t\t\t\treturn sum1;\n\t\t\t}, []);\n\t\t\treturn sum;\n\t\t}, {});\n\n\t\tdelete gradeCategories.Other;\n\n\t\tthis.gradeCollection = new Backbone.Collection(_.flatMapDeep(gradeCategories, function (grades, category) {\n\t\t\treturn [{ category: true, value: category }, _.map(grades, function (grade) {\n\t\t\t\tvar newGrade = _.clone(grade);\n\n\t\t\t\tnewGrade.selected = false;\n\t\t\t\tnewGrade.parent = category;\n\n\t\t\t\treturn newGrade;\n\t\t\t})];\n\t\t}));\n\n\t\tthis.logCollection = new Backbone.Collection();\n\n\t\tthis.currentStep = 1;\n\n\t\tthis.listenTo(migrationChannel, {\n\t\t\t\"guide:finish\": this.onGuideNext.bind(this),\n\t\t\t\"guide:next\": this.onGuideNext.bind(this),\n\t\t\t\"guide:previous\": this.onGuidePrevious.bind(this),\n\t\t\t\"guide:start\": this.onGuideNext.bind(this),\n\t\t\t\"plan:download\": this.onPlanDownload.bind(this)\n\t\t});\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.showCurrentStep();\n\t},\n\n\tonGuideNext: function onGuideNext() {\n\t\tvar validationError = this.validateCurrentStep();\n\n\t\tif (_.isNil(validationError)) this.processCurrentStep();else migrationChannel.trigger(\"error\", \"Input Error\", validationError);\n\t},\n\n\tonGuidePrevious: function onGuidePrevious() {\n\t\tthis.showPreviousStep();\n\t},\n\n\tprocessCurrentStep: function processCurrentStep() {\n\t\tvar _this = this;\n\n\t\tswitch (this.currentStep) {\n\t\t\tcase 1:\n\t\t\t\tif (this.promotedGroupCollection) {\n\t\t\t\t\tthis.showNextStep();\n\t\t\t\t} else {\n\t\t\t\t\tthis.showBusyState();\n\t\t\t\t\tthis.promotedGroupCollection = new PromotedGroupCollection();\n\t\t\t\t\tthis.promotedGroupCollection.fetch({\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tgrades: _.compact(_.map(this.gradeCollection.models, function (model) {\n\t\t\t\t\t\t\t\treturn model.has(\"selected\") && model.get(\"selected\") ? model.get(\"key\") : null;\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t\tsourceYear: this.sourceYear,\n\t\t\t\t\t\t\ttargetYear: this.targetYear\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsuccess: function success() {\n\t\t\t\t\t\t\t_this.hideBusyState();\n\t\t\t\t\t\t\t_this.showNextStep();\n\t\t\t\t\t\t},\n\t\t\t\t\t\terror: function error(collection, response) {\n\t\t\t\t\t\t\t_this.hideBusyState();\n\t\t\t\t\t\t\tmigrationChannel.trigger(\"error\", \"Communication Error\", JSON.stringify(response));\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tthis.showBusyState();\n\t\t\t\tthis.promotionPlanCollection = new PromotionPlanCollection();\n\n\t\t\t\tPromise.resolve($.post(settings.urlRoot + \"/api/1.0/tools/migrateStudents/plan/getPlan\", {\n\t\t\t\t\tgrades: _.compact(_.map(this.gradeCollection.models, function (model) {\n\t\t\t\t\t\treturn model.has(\"selected\") && model.get(\"selected\") ? model.get(\"key\") : null;\n\t\t\t\t\t})),\n\t\t\t\t\tsourceYear: this.sourceYear,\n\t\t\t\t\ttargetYear: this.targetYear,\n\t\t\t\t\tgroups: _.map(_.filter(this.promotedGroupCollection.models, function (model) {\n\t\t\t\t\t\treturn model.get(\"selected\");\n\t\t\t\t\t}), function (model) {\n\t\t\t\t\t\treturn model.attributes;\n\t\t\t\t\t})\n\t\t\t\t}, function (response) {\n\t\t\t\t\t_this.promotionPlanCollection = new PromotionPlanCollection(response);\n\t\t\t\t\t_this.hideBusyState();\n\t\t\t\t\t_this.showNextStep();\n\t\t\t\t})).catch(function (error) {\n\t\t\t\t\t_this.hideBusyState();\n\t\t\t\t\tmigrationChannel.trigger(\"error\", \"Communication Error\", JSON.stringify(error));\n\t\t\t\t});\n\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tthis.showBusyState();\n\t\t\t\tPromise.resolve($.post(settings.urlRoot + \"/api/1.0/tools/migrateStudents/plan\", {\n\t\t\t\t\tgrades: _.compact(_.map(this.gradeCollection.models, function (model) {\n\t\t\t\t\t\treturn model.has(\"selected\") && model.get(\"selected\") ? model.get(\"key\") : null;\n\t\t\t\t\t})),\n\t\t\t\t\tsourceYear: this.sourceYear,\n\t\t\t\t\ttargetYear: this.targetYear,\n\t\t\t\t\tgroups: _.map(_.filter(this.promotedGroupCollection.models, function (model) {\n\t\t\t\t\t\treturn model.get(\"selected\");\n\t\t\t\t\t}), function (model) {\n\t\t\t\t\t\treturn model.attributes;\n\t\t\t\t\t})\n\t\t\t\t}, function () {\n\t\t\t\t\t_this.hideBusyState();\n\t\t\t\t\t_this.showNextStep();\n\t\t\t\t})).catch(function (error) {\n\t\t\t\t\t_this.hideBusyState();\n\t\t\t\t\tmigrationChannel.trigger(\"error\", \"Communication Error\", JSON.stringify(error));\n\t\t\t\t});\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"Unknown step!\");\n\t\t}\n\t},\n\n\tshowBusyState: function showBusyState() {\n\t\tmigrationChannel.trigger(\"state:busy\");\n\t\tthis.ui.workRegion.addClass(\"disabled\");\n\t},\n\n\thideBusyState: function hideBusyState() {\n\t\tmigrationChannel.trigger(\"state:ready\");\n\t\tthis.ui.workRegion.removeClass(\"disabled\");\n\t},\n\n\tshowNextStep: function showNextStep() {\n\t\tthis.currentStep++;\n\t\tthis.showCurrentStep();\n\t},\n\n\tshowPreviousStep: function showPreviousStep() {\n\t\tthis.currentStep--;\n\t\tthis.showCurrentStep();\n\t},\n\n\tshowCurrentStep: function showCurrentStep() {\n\t\tswitch (this.currentStep) {\n\t\t\tcase 1:\n\t\t\t\tthis.showStep1();\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tthis.showStep2();\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tthis.showStep3();\n\t\t\t\tbreak;\n\n\t\t\tcase 4:\n\t\t\t\tmigrationChannel.trigger(\"success\", \"A backup file has been created. If you need to roll back the migration, then please contact DevOps.\");\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"Unknown step!\");\n\t\t}\n\t},\n\n\tshowStep1: function showStep1() {\n\t\tvar _this2 = this;\n\n\t\tvar gv = new GuideView({\n\t\t\tbuttons: [guideViewButton.next],\n\t\t\tprompt: \"Select the grades that will be migrated to the next year.<br><br>Click on a grade to move it.<br><br> Choose start year to override default:\\n\\t\\t\\t\\t<select name='yearChooser'><option value=\\\"\" + (this.sourceYear - 1) + \"\\\">\" + (this.sourceYear - 1) + \"\\n\\t\\t\\t\\t<option selected value=\\\"\" + this.sourceYear + \"\\\">\" + this.sourceYear + \"<option value=\\\"\" + moment().year() + \"\\\">\" + moment().year() + \"</select>\",\n\t\t\tstep: \"1\"\n\t\t});\n\n\t\tthis.listenTo(gv, \"yearChange\", function (year) {\n\t\t\t_this2.sourceYear = moment().month() < settings.yearStart ? year - 1 : year;\n\t\t\t_this2.targetYear = _this2.sourceYear + 1;\n\n\t\t\tgv.destroy();\n\n\t\t\t_this2.showStep1();\n\t\t});\n\n\t\tthis.showChildView(\"guide\", gv);\n\n\t\tthis.showChildView(\"work\", new GradeSelector({\n\t\t\tgradeCollection: this.gradeCollection,\n\t\t\tsourceYear: this.sourceYear,\n\t\t\ttargetYear: this.targetYear\n\t\t}));\n\t},\n\n\tshowStep2: function showStep2() {\n\t\tthis.showChildView(\"guide\", new GuideView({\n\t\t\tbuttons: [guideViewButton.previous, guideViewButton.start],\n\t\t\tprompt: \"Review the groups that will be created.<br><br>Click on a grade to view the groups that will be created.<br><br>Click the Start button to execute a dry run of the migration.\",\n\t\t\tstep: \"2\"\n\t\t}));\n\n\t\tthis.showChildView(\"work\", new GroupViewer({\n\t\t\tgradeCollection: this.gradeCollection,\n\t\t\tpromotedGroupCollection: this.promotedGroupCollection\n\t\t}));\n\t},\n\n\tshowStep3: function showStep3() {\n\t\tthis.showChildView(\"guide\", new GuideView({\n\t\t\tbuttons: [guideViewButton.previous, guideViewButton.finish],\n\t\t\tprompt: \"Migrate learners.<br><br>The proposed changes are displayed in the Migration Plan on the right.<br><br>Click the Finish button to commit the changes to the database.\",\n\t\t\tstep: \"3\"\n\t\t}));\n\n\t\tthis.showChildView(\"work\", new PlanView({ promotionPlanCollection: this.promotionPlanCollection }));\n\t},\n\n\tvalidateCurrentStep: function validateCurrentStep() {\n\t\tvar validationError = void 0;\n\n\t\tswitch (this.currentStep) {\n\t\t\tcase 1:\n\t\t\t\tif (_.isUndefined(_.find(this.gradeCollection.models, function (model) {\n\t\t\t\t\treturn model.get(\"selected\");\n\t\t\t\t}))) validationError = \"You must select at least one grade to migrate.\";\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\t_.noop();\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\t_.noop();\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"Unknown step!\");\n\t\t}\n\n\t\treturn validationError;\n\t},\n\n\tonPlanDownload: function onPlanDownload() {\n\t\tvar _this3 = this;\n\n\t\tPromise.resolve($.post(settings.urlRoot + \"/api/1.0/tools/migrateStudents/plan/csv\", {\n\t\t\tgrades: _.compact(_.map(this.gradeCollection.models, function (model) {\n\t\t\t\treturn model.has(\"selected\") && model.get(\"selected\") ? model.get(\"key\") : null;\n\t\t\t})),\n\t\t\tsourceYear: this.sourceYear,\n\t\t\ttargetYear: this.targetYear,\n\t\t\tgroups: _.map(_.filter(this.promotedGroupCollection.models, function (model) {\n\t\t\t\treturn model.get(\"selected\");\n\t\t\t}), function (model) {\n\t\t\t\treturn model.attributes;\n\t\t\t})\n\t\t}, function (csv) {\n\t\t\t_this3.ui.downloadHelper.attr(\"href\", \"data:text/csv,\" + csv);\n\t\t\t_this3.ui.downloadHelper.get(0).click();\n\t\t})).catch(function (error) {\n\t\t\tmigrationChannel.trigger(\"error\", \"Communication Error\", JSON.stringify(error));\n\t\t});\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(migrationChannel);\n\t}\n});\n\nvar LockView = Backbone.Marionette.View.extend({\n\tclassName: \"message-view\",\n\n\ttemplate: require(\"../../templates/tools/migrateStudents.nunj\").message,\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tmessage: \"A learner migration was completed on \" + moment.unix(this.options.created).format(\"YYYY-MM-DD\") + \" at \" + moment.unix(this.options.created).format(\"HH:mm\") + \" by \" + this.options.personName + \". If you need to roll back this migration or perform a new migration, then please contact DevOps.\",\n\t\t\ttitle: \"Locked\"\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\t}\n});\n\nvar RestoreView = Backbone.Marionette.View.extend({\n\tclassName: \"message-view\",\n\n\ttemplate: require(\"../../templates/tools/migrateStudents.nunj\").restore,\n\n\tui: {\n\t\tbuttonRestore: \"button#restore\",\n\t\tspinner: \".spinner-icon\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonRestore\": \"onButtonRestoreClick\"\n\t},\n\n\tonButtonRestoreClick: function onButtonRestoreClick() {\n\t\tvar _this4 = this;\n\n\t\tthis.showBusyState();\n\t\tPromise.resolve($.post(settings.urlRoot + \"/api/1.0/tools/migrateStudents/backup\", function (response) {\n\t\t\tif (response.ack) migrationChannel.trigger(\"success\", \"The previous state has been restored. Backup file removed.\");\n\t\t})).catch(function (error) {\n\t\t\t_this4.hideBusyState();\n\t\t\tmigrationChannel.trigger(\"error\", \"Communication Error\", JSON.stringify(error));\n\t\t});\n\t},\n\n\tshowBusyState: function showBusyState() {\n\t\tthis.ui.buttonRestore.addClass(\"hide\");\n\t\tthis.ui.spinner.removeClass(\"hide\");\n\t},\n\n\thideBusyState: function hideBusyState() {\n\t\tthis.ui.spinner.addClass(\"hide\");\n\t\tthis.ui.buttonRestore.removeClass(\"hide\");\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"migrate-students-tool\",\n\n\ttemplate: require(\"../../templates/tools/migrateStudents.nunj\").layout,\n\n\tregions: {\n\t\tdisplay: \".display-region\"\n\t},\n\n\tui: {\n\t\tbuttonBegin: \".button#begin\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonBegin\": \"onButtonBeginClick\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.listenTo(migrationChannel, {\n\t\t\terror: this.onError.bind(this),\n\t\t\tsuccess: this.onSuccess.bind(this)\n\t\t});\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this5 = this;\n\n\t\tPromise.resolve($.get(settings.urlRoot + \"/api/1.0/tools/migrateStudents/lock\", function (data) {\n\t\t\tif (data.lock === null) {\n\t\t\t\tPromise.resolve($.get(settings.urlRoot + \"/api/1.0/tools/migrateStudents/backup\", function (response) {\n\t\t\t\t\tif (response.ack) _this5.showChildView(\"display\", new RestoreView());else _this5.showChildView(\"display\", new IntroductionView());\n\t\t\t\t})).catch(function () {\n\t\t\t\t\tmigrationChannel.trigger(\"error\", \"Communication Error\", \"Unable to determine backup status.\");\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t_this5.showChildView(\"display\", new LockView(data.lock));\n\t\t\t}\n\t\t})).catch(function () {\n\t\t\tmigrationChannel.trigger(\"error\", \"Communication Error\", \"Unable to determine lock status.\");\n\t\t});\n\t},\n\n\tonButtonBeginClick: function onButtonBeginClick() {\n\t\tthis.showChildView(\"display\", new MigrationView());\n\t},\n\n\tonSuccess: function onSuccess(message) {\n\t\tthis.showChildView(\"display\", new SuccessView({ message: message }));\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(migrationChannel);\n\t},\n\n\tonError: function onError(title, message) {\n\t\tvar modal = new SmallModal({\n\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> \" + title,\n\t\t\tbody: \"<p>\" + message + \"</p>\",\n\t\t\thideButtons: [\"cancel\"],\n\t\t\twarning: true\n\t\t});\n\n\t\tmodal.show();\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1pZ3JhdGVTdHVkZW50cy5qcyJdLCJuYW1lcyI6WyIkIiwicmVxdWlyZSIsIl8iLCJCYWNrYm9uZSIsIm1vbWVudCIsIlByb21pc2UiLCJzZXR0aW5ncyIsIlByb21vdGVkR3JvdXBDb2xsZWN0aW9uIiwiUHJvbW90aW9uUGxhbkNvbGxlY3Rpb24iLCJTbWFsbE1vZGFsIiwiR3JvdXBNb2RhbCIsImd1aWRlVmlld0J1dHRvbiIsImZpbmlzaCIsIm5leHQiLCJwcmV2aW91cyIsInN0YXJ0IiwibWlncmF0aW9uQ2hhbm5lbCIsIlJhZGlvIiwiY2hhbm5lbCIsIkludHJvZHVjdGlvblZpZXciLCJNYXJpb25ldHRlIiwiVmlldyIsImV4dGVuZCIsImNsYXNzTmFtZSIsInRlbXBsYXRlIiwiaW50cm9kdWN0aW9uIiwiR3VpZGVWaWV3IiwiZ3VpZGUiLCJ0ZW1wbGF0ZUNvbnRleHQiLCJidXR0b25GaW5pc2giLCJidXR0b25OZXh0IiwiYnV0dG9uUHJldmlvdXMiLCJidXR0b25TdGFydCIsImJ1dHRvbnMiLCJvcHRpb25zIiwicHJvbXB0Iiwic3RlcCIsInVpIiwiYnV0dG9uQ29udGFpbmVyIiwic3RhdHVzQ29udGFpbmVyIiwiZXZlbnRzIiwiaW5pdGlhbGl6ZSIsImxpc3RlblRvIiwib25TdGF0dXNCdXN5IiwiYmluZCIsIm9uU3RhdHVzUmVhZHkiLCJvblNlbGVjdENoYW5nZSIsImVsIiwicHJvcCIsInRyaWdnZXIiLCJwYXJzZUludCIsInZhbCIsIm9uQnV0dG9uRmluaXNoQ2xpY2siLCJvbkJ1dHRvbk5leHRDbGljayIsIm9uQnV0dG9uUHJldmlvdXNDbGljayIsIm9uQnV0dG9uU3RhcnRDbGljayIsInNob3dTcGlubmVyIiwiaGlkZVNwaW5uZXIiLCJhZGRDbGFzcyIsInJlbW92ZUNsYXNzIiwiTGlzdENhdGVnb3J5IiwibGlzdENhdGVnb3J5IiwidmlzaWJsZSIsIm1vZGVsIiwib25MaXN0Q2F0ZWdvcnlDaGFuZ2UiLCJvblJlbmRlciIsIiRlbCIsInNlbGVjdGVkQ2F0ZWdvcmllcyIsInVuc2VsZWN0ZWRDYXRlZ29yaWVzIiwiaGlkZU9uIiwiaW5jbHVkZXMiLCJnZXQiLCJpc05pbCIsInJlbmRlciIsIm9uQmVmb3JlRGVzdHJveSIsInN0b3BMaXN0ZW5pbmciLCJMaXN0SXRlbSIsImxpc3RJdGVtIiwidmFsdWUiLCJzZWxlY3RUb2dnbGUiLCJzZWxlY3RlZEljb24iLCJ1bnNlbGVjdGVkSWNvbiIsImVkaXRCdG4iLCJjbGljayIsIm1vZGVsRXZlbnRzIiwib25MaXN0SXRlbUNsaWNrIiwib25MaXN0SXRlbVRvZ2dsZSIsImludGVyYWN0aXZlIiwiaXNVbmRlZmluZWQiLCJlZGl0YWJsZSIsInVuYmluZCIsInRvZ2dsZVNlbGVjdGVkIiwiZWRpdEJ0bkNsaWNrIiwib25DbGljayIsInRvZ2dsZU1vZGUiLCJzZXQiLCJrZXkiLCJoYXMiLCJvbk1vZGVsU2VsZWN0ZWRDaGFuZ2UiLCJvblZhbHVlQ2hhbmdlIiwiZmllbGQiLCJ0ZXh0IiwibW9kYWwiLCJkb250U2F2ZSIsInNob3ciLCJMaXN0IiwiQ29sbGVjdGlvblZpZXciLCJjaGlsZFZpZXciLCJjaGlsZFZpZXdPcHRpb25zIiwic2hvd1NlbGVjdGVkIiwidXBkYXRlQ2F0ZWdvcmllcyIsImdldFNlbGVjdGVkQ2F0ZWdvcmllcyIsImdldFVuc2VsZWN0ZWRDYXRlZ29yaWVzIiwiZm9yRWFjaCIsImNvbGxlY3Rpb24iLCJtb2RlbHMiLCJjb21wYWN0IiwibWFwIiwiZ2V0Q2F0ZWdvcnlNYXAiLCJvY2N1cnJlbmNlcyIsImNhdGVnb3J5Iiwic2VsZWN0ZWQiLCJ0b3RhbCIsInJlZHVjZSIsImFjYyIsIkdyYWRlU2VsZWN0b3IiLCJzZWxlY3RvciIsImxlZnRMaXN0VGl0bGUiLCJzb3VyY2VZZWFyIiwicmlnaHRMaXN0VGl0bGUiLCJ0YXJnZXRZZWFyIiwicmVnaW9ucyIsImxlZnQiLCJyaWdodCIsImdyYWRlQ29sbGVjdGlvbiIsInNob3dDaGlsZFZpZXciLCJHcm91cFZpZXdlciIsInByb21vdGVkR3JvdXBDb2xsZWN0aW9uIiwiY3VycmVudEdyb3VwQ29sbGVjdGlvbiIsIkNvbGxlY3Rpb24iLCJncmFkZSIsImdyb3Vwc0ZvckdyYWRlIiwiZmlsdGVyIiwicmVzZXQiLCJQbGFuVmlldyIsInBsYW4iLCJsaXN0IiwibGlua0Rvd25sb2FkIiwicHJvbW90aW9uUGxhbkNvbGxlY3Rpb24iLCJvbkxpbmtEb3dubG9hZENsaWNrIiwiU3VjY2Vzc1ZpZXciLCJtZXNzYWdlIiwidGl0bGUiLCJNaWdyYXRpb25WaWV3IiwibWlncmF0aW9uIiwid29yayIsImRvd25sb2FkSGVscGVyIiwid29ya1JlZ2lvbiIsImN1cnJlbnRZZWFyIiwieWVhciIsIm1vbnRoIiwieWVhclN0YXJ0IiwiZ3JhZGVDYXRlZ29yaWVzIiwiZ3JhZGVMaXN0Iiwic3VtIiwibnVtIiwic29ydCIsImEiLCJiIiwibGV4aWNhbCIsIm5hbWUiLCJ0b1VwcGVyQ2FzZSIsImxvY2FsZUNvbXBhcmUiLCJzdW0xIiwibnVtMSIsInB1c2giLCJPdGhlciIsImZsYXRNYXBEZWVwIiwiZ3JhZGVzIiwibmV3R3JhZGUiLCJjbG9uZSIsInBhcmVudCIsImxvZ0NvbGxlY3Rpb24iLCJjdXJyZW50U3RlcCIsIm9uR3VpZGVOZXh0Iiwib25HdWlkZVByZXZpb3VzIiwib25QbGFuRG93bmxvYWQiLCJzaG93Q3VycmVudFN0ZXAiLCJ2YWxpZGF0aW9uRXJyb3IiLCJ2YWxpZGF0ZUN1cnJlbnRTdGVwIiwicHJvY2Vzc0N1cnJlbnRTdGVwIiwic2hvd1ByZXZpb3VzU3RlcCIsInNob3dOZXh0U3RlcCIsInNob3dCdXN5U3RhdGUiLCJmZXRjaCIsImRhdGEiLCJzdWNjZXNzIiwiaGlkZUJ1c3lTdGF0ZSIsImVycm9yIiwicmVzcG9uc2UiLCJKU09OIiwic3RyaW5naWZ5IiwicmVzb2x2ZSIsInBvc3QiLCJ1cmxSb290IiwiZ3JvdXBzIiwiYXR0cmlidXRlcyIsImNhdGNoIiwiRXJyb3IiLCJzaG93U3RlcDEiLCJzaG93U3RlcDIiLCJzaG93U3RlcDMiLCJndiIsImRlc3Ryb3kiLCJmaW5kIiwibm9vcCIsImF0dHIiLCJjc3YiLCJMb2NrVmlldyIsInVuaXgiLCJjcmVhdGVkIiwiZm9ybWF0IiwicGVyc29uTmFtZSIsIlJlc3RvcmVWaWV3IiwicmVzdG9yZSIsImJ1dHRvblJlc3RvcmUiLCJzcGlubmVyIiwib25CdXR0b25SZXN0b3JlQ2xpY2siLCJhY2siLCJtb2R1bGUiLCJleHBvcnRzIiwibGF5b3V0IiwiZGlzcGxheSIsImJ1dHRvbkJlZ2luIiwib25FcnJvciIsIm9uU3VjY2VzcyIsImxvY2siLCJvbkJ1dHRvbkJlZ2luQ2xpY2siLCJib2R5IiwiaGlkZUJ1dHRvbnMiLCJ3YXJuaW5nIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLElBQUlELFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUUsV0FBV0YsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUcsU0FBU0gsUUFBUSxRQUFSLENBQWY7QUFDQSxJQUFNSSxVQUFVSixRQUFRLFVBQVIsQ0FBaEI7O0FBRUEsSUFBTUssV0FBV0wsUUFBUSxjQUFSLENBQWpCOztBQUVBLElBQU1NLDBCQUEwQk4sUUFBUSxpREFBUixDQUFoQztBQUNBLElBQU1PLDBCQUEwQlAsUUFBUSxpREFBUixDQUFoQztBQUNBLElBQU1RLGFBQWFSLFFBQVEseUJBQVIsQ0FBbkI7QUFDQSxJQUFNUyxhQUFhVCxRQUFRLGtDQUFSLENBQW5COztBQUVBLElBQU1VLGtCQUFrQjtBQUN2QkMsU0FBUSxRQURlO0FBRXZCQyxPQUFNLE1BRmlCO0FBR3ZCQyxXQUFVLFVBSGE7QUFJdkJDLFFBQU87QUFKZ0IsQ0FBeEI7O0FBT0EsSUFBTUMsbUJBQW1CYixTQUFTYyxLQUFULENBQWVDLE9BQWYsQ0FBdUIsaUJBQXZCLENBQXpCOztBQUVBLElBQU1DLG1CQUFtQmhCLFNBQVNpQixVQUFULENBQW9CQyxJQUFwQixDQUF5QkMsTUFBekIsQ0FBZ0M7QUFDeERDLFlBQVcsbUJBRDZDOztBQUd4REMs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QUFuQjtBQUNBLEVBdEQrQzs7QUF3RGhEME4sVUFBUyxpQkFBU2xGLEtBQVQsRUFBZ0JELE9BQWhCLEVBQXlCO0FBQ2pDLE1BQU1qRCxRQUFRLElBQUk3RixVQUFKLENBQWU7QUFDNUIrSSxVQUFPLGlEQUFpREEsS0FENUI7QUFFNUJzRixTQUFNLFFBQVF2RixPQUFSLEdBQWtCLE1BRkk7QUFHNUJ3RixnQkFBYSxDQUFDLFFBQUQsQ0FIZTtBQUk1QkMsWUFBUztBQUptQixHQUFmLENBQWQ7O0FBT0ExSSxRQUFNRSxJQUFOO0FBQ0E7QUFqRStDLENBQWhDLENBQWpCIiwiZmlsZSI6Im1pZ3JhdGVTdHVkZW50cy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgbW9tZW50ID0gcmVxdWlyZShcIm1vbWVudFwiKTtcbmNvbnN0IFByb21pc2UgPSByZXF1aXJlKFwiYmx1ZWJpcmRcIik7XG5cbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxuY29uc3QgUHJvbW90ZWRHcm91cENvbGxlY3Rpb24gPSByZXF1aXJlKFwiLi4vLi4vY29sbGVjdGlvbnMvdG9vbHMvcHJvbW90ZWRHcm91cENvbGxlY3Rpb25cIik7XG5jb25zdCBQcm9tb3Rpb25QbGFuQ29sbGVjdGlvbiA9IHJlcXVpcmUoXCIuLi8uLi9jb2xsZWN0aW9ucy90b29scy9wcm9tb3Rpb25QbGFuQ29sbGVjdGlvblwiKTtcbmNvbnN0IFNtYWxsTW9kYWwgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL3NtYWxsTW9kYWxcIik7XG5jb25zdCBHcm91cE1vZGFsID0gcmVxdWlyZShcIi4uLy4uLy4uL2dyb3Vwcy92aWV3cy9ncm91cE1vZGFsXCIpO1xuXG5jb25zdCBndWlkZVZpZXdCdXR0b24gPSB7XG5cdGZpbmlzaDogXCJmaW5pc2hcIixcblx0bmV4dDogXCJuZXh0XCIsXG5cdHByZXZpb3VzOiBcInByZXZpb3VzXCIsXG5cdHN0YXJ0OiBcInN0YXJ0XCIsXG59O1xuXG5jb25zdCBtaWdyYXRpb25DaGFubmVsID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcIm1pZ3JhdGVTdHVkZW50c1wiKTtcblxuY29uc3QgSW50cm9kdWN0aW9uVmlldyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiaW50cm9kdWN0aW9uLXZpZXdcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy90b29scy9taWdyYXRlU3R1ZGVudHMubnVualwiKS5pbnRyb2R1Y3Rpb24sXG59KTtcblxuY29uc3QgR3VpZGVWaWV3ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJndWlkZS12aWV3XCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvdG9vbHMvbWlncmF0ZVN0dWRlbnRzLm51bmpcIikuZ3VpZGUsXG5cblx0dGVtcGxhdGVDb250ZXh0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0YnV0dG9uRmluaXNoOiBndWlkZVZpZXdCdXR0b24uZmluaXNoLFxuXHRcdFx0YnV0dG9uTmV4dDogZ3VpZGVWaWV3QnV0dG9uLm5leHQsXG5cdFx0XHRidXR0b25QcmV2aW91czogZ3VpZGVWaWV3QnV0dG9uLnByZXZpb3VzLFxuXHRcdFx0YnV0dG9uU3RhcnQ6IGd1aWRlVmlld0J1dHRvbi5zdGFydCxcblxuXHRcdFx0YnV0dG9uczogdGhpcy5vcHRpb25zLmJ1dHRvbnMsXG5cdFx0XHRwcm9tcHQ6IHRoaXMub3B0aW9ucy5wcm9tcHQsXG5cdFx0XHRzdGVwOiB0aGlzLm9wdGlvbnMuc3RlcCxcblx0XHR9O1xuXHR9LFxuXG5cdHVpOiB7XG5cdFx0YnV0dG9uQ29udGFpbmVyOiBcIi5idXR0b24tY29udGFpbmVyXCIsXG5cdFx0c3RhdHVzQ29udGFpbmVyOiBcIi5zdGF0dXMtY29udGFpbmVyXCIsXG5cblx0XHRidXR0b25GaW5pc2g6IFwiYnV0dG9uI2ZpbmlzaFwiLFxuXHRcdGJ1dHRvbk5leHQ6IFwiYnV0dG9uI25leHRcIixcblx0XHRidXR0b25QcmV2aW91czogXCJidXR0b24jcHJldmlvdXNcIixcblx0XHRidXR0b25TdGFydDogXCJidXR0b24jc3RhcnRcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5idXR0b25GaW5pc2hcIjogXCJvbkJ1dHRvbkZpbmlzaENsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkuYnV0dG9uTmV4dFwiOiBcIm9uQnV0dG9uTmV4dENsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkuYnV0dG9uUHJldmlvdXNcIjogXCJvbkJ1dHRvblByZXZpb3VzQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5idXR0b25TdGFydFwiOiBcIm9uQnV0dG9uU3RhcnRDbGlja1wiLFxuXHRcdFwiY2hhbmdlIHNlbGVjdFwiOiBcIm9uU2VsZWN0Q2hhbmdlXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cblx0XHR0aGlzLmxpc3RlblRvKG1pZ3JhdGlvbkNoYW5uZWwsIHtcblx0XHRcdFwic3RhdHVzOmJ1c3lcIjogdGhpcy5vblN0YXR1c0J1c3kuYmluZCh0aGlzKSxcblx0XHRcdFwic3RhdHVzOnJlYWR5XCI6IHRoaXMub25TdGF0dXNSZWFkeS5iaW5kKHRoaXMpLFxuXHRcdH0pO1xuXHR9LFxuXG5cdG9uU2VsZWN0Q2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHQkKFwic2VsZWN0W25hbWU9J3llYXJDaG9vc2VyJ11cIiwgdGhpcy5lbCkucHJvcChcImRpc2FibGVkXCIsIHRydWUpO1xuXHRcdHRoaXMudHJpZ2dlcihcInllYXJDaGFuZ2VcIiwgcGFyc2VJbnQoJChcInNlbGVjdFtuYW1lPSd5ZWFyQ2hvb3NlciddXCIsIHRoaXMuZWwpLnZhbCgpLCAxMCkpO1xuXHR9LFxuXG5cdG9uQnV0dG9uRmluaXNoQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdG1pZ3JhdGlvbkNoYW5uZWwudHJpZ2dlcihcImd1aWRlOmZpbmlzaFwiKTtcblx0fSxcblxuXHRvbkJ1dHRvbk5leHRDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0bWlncmF0aW9uQ2hhbm5lbC50cmlnZ2VyKFwiZ3VpZGU6bmV4dFwiKTtcblx0fSxcblxuXHRvbkJ1dHRvblByZXZpb3VzQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdG1pZ3JhdGlvbkNoYW5uZWwudHJpZ2dlcihcImd1aWRlOnByZXZpb3VzXCIpO1xuXHR9LFxuXG5cdG9uQnV0dG9uU3RhcnRDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0bWlncmF0aW9uQ2hhbm5lbC50cmlnZ2VyKFwiZ3VpZGU6c3RhcnRcIik7XG5cdH0sXG5cblx0b25TdGF0dXNCdXN5OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNob3dTcGlubmVyKCk7XG5cdH0sXG5cblx0b25TdGF0dXNSZWFkeTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5oaWRlU3Bpbm5lcigpO1xuXHR9LFxuXG5cdHNob3dTcGlubmVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmJ1dHRvbkNvbnRhaW5lci5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5zdGF0dXNDb250YWluZXIucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdGhpZGVTcGlubmVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLnN0YXR1c0NvbnRhaW5lci5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5idXR0b25Db250YWluZXIucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxufSk7XG5cbmNvbnN0IExpc3RDYXRlZ29yeSA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwibGlzdC1jYXRlZ29yeVwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL3Rvb2xzL21pZ3JhdGVTdHVkZW50cy5udW5qXCIpLmxpc3RDYXRlZ29yeSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucztcblx0XHR0aGlzLnZpc2libGUgPSBmYWxzZTtcblxuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwgXCJsaXN0OmNhdGVnb3J5OmNoYW5nZVwiLCB0aGlzLm9uTGlzdENhdGVnb3J5Q2hhbmdlLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy52aXNpYmxlKVxuXHRcdFx0dGhpcy4kZWwucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuJGVsLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRvbkxpc3RDYXRlZ29yeUNoYW5nZTogZnVuY3Rpb24oc2VsZWN0ZWRDYXRlZ29yaWVzLCB1bnNlbGVjdGVkQ2F0ZWdvcmllcykge1xuXHRcdHRoaXMudmlzaWJsZSA9IHRydWU7XG5cblx0XHRpZiAodGhpcy5vcHRpb25zLmhpZGVPbikge1xuXHRcdFx0aWYgKF8uaW5jbHVkZXMoc2VsZWN0ZWRDYXRlZ29yaWVzLCB0aGlzLm1vZGVsLmdldChcInZhbHVlXCIpKSlcblx0XHRcdFx0dGhpcy52aXNpYmxlID0gZmFsc2U7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKF8uaW5jbHVkZXModW5zZWxlY3RlZENhdGVnb3JpZXMsIHRoaXMubW9kZWwuZ2V0KFwidmFsdWVcIikpKSB7XG5cdFx0XHR0aGlzLnZpc2libGUgPSBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAoIV8uaXNOaWwodGhpcy4kZWwpKVxuXHRcdFx0dGhpcy5yZW5kZXIoKTtcblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLm1vZGVsKTtcblx0fSxcbn0pO1xuXG5jb25zdCBMaXN0SXRlbSA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwibGlzdC1pdGVtXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvdG9vbHMvbWlncmF0ZVN0dWRlbnRzLm51bmpcIikubGlzdEl0ZW0sXG5cblx0dWk6IHtcblx0XHR2YWx1ZTogXCIudmFsdWVcIixcblx0XHRzZWxlY3RUb2dnbGU6IFwiLnNlbGVjdC10b2dnbGVcIixcblx0XHRzZWxlY3RlZEljb246IFwiLnNlbGVjdGVkLWljb25cIixcblx0XHR1bnNlbGVjdGVkSWNvbjogXCIudW5zZWxlY3RlZC1pY29uXCIsXG5cdFx0ZWRpdEJ0bjogXCIuZWRpdC1idG5cIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRjbGljazogXCJvbkNsaWNrXCIsXG5cdH0sXG5cblx0bW9kZWxFdmVudHM6IHtcblx0XHRcImNoYW5nZTpzZWxlY3RlZFwiOiBcIm9uTW9kZWxTZWxlY3RlZENoYW5nZVwiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhtaWdyYXRpb25DaGFubmVsLCBcImxpc3Q6aXRlbTpjbGlja1wiLCB0aGlzLm9uTGlzdEl0ZW1DbGljay5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKG1pZ3JhdGlvbkNoYW5uZWwsIFwibGlzdDppdGVtOnRvZ2dsZVwiLCB0aGlzLm9uTGlzdEl0ZW1Ub2dnbGUuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLm9wdGlvbnMuaW50ZXJhY3RpdmUpIHtcblx0XHRcdHRoaXMuJGVsLmFkZENsYXNzKFwiaW50ZXJhY3RpdmVcIik7XG5cblx0XHRcdGlmICghXy5pc1VuZGVmaW5lZCh0aGlzLm9wdGlvbnMuaGlkZU9uKSkge1xuXHRcdFx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJzZWxlY3RlZFwiKSA9PT0gdGhpcy5vcHRpb25zLmhpZGVPbilcblx0XHRcdFx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLm9wdGlvbnMuZWRpdGFibGUpXG5cdFx0XHRcdHRoaXMudWkuZWRpdEJ0bi5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cblx0XHRcdGlmICh0aGlzLm9wdGlvbnMuc2VsZWN0ZWRJY29uKSB7XG5cdFx0XHRcdHRoaXMuJGVsLnVuYmluZChcImNsaWNrXCIpO1xuXHRcdFx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyhcImludGVyYWN0aXZlXCIpO1xuXHRcdFx0XHR0aGlzLnVpLnNlbGVjdFRvZ2dsZS5iaW5kKFwiY2xpY2tcIiwgdGhpcy50b2dnbGVTZWxlY3RlZC5iaW5kKHRoaXMpKTtcblx0XHRcdFx0dGhpcy51aS5lZGl0QnRuLmJpbmQoXCJjbGlja1wiLCB0aGlzLmVkaXRCdG5DbGljay5iaW5kKHRoaXMpKTtcblxuXHRcdFx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJzZWxlY3RlZFwiKSkge1xuXHRcdFx0XHRcdHRoaXMudWkuc2VsZWN0ZWRJY29uLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRcdFx0XHR0aGlzLnVpLnVuc2VsZWN0ZWRJY29uLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHR0aGlzLnVpLnNlbGVjdGVkSWNvbi5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHRcdFx0dGhpcy51aS51bnNlbGVjdGVkSWNvbi5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyhcImludGVyYWN0aXZlXCIpO1xuXHRcdH1cblx0fSxcblxuXHRvbkNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5vcHRpb25zLmludGVyYWN0aXZlKSB7XG5cdFx0XHRpZiAodGhpcy5vcHRpb25zLnRvZ2dsZU1vZGUpIHtcblx0XHRcdFx0dGhpcy5tb2RlbC5zZXQoXCJzZWxlY3RlZFwiLCAhdGhpcy5tb2RlbC5nZXQoXCJzZWxlY3RlZFwiKSk7XG5cdFx0XHRcdG1pZ3JhdGlvbkNoYW5uZWwudHJpZ2dlcihcImxpc3Q6aXRlbTp0b2dnbGVcIik7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0bWlncmF0aW9uQ2hhbm5lbC50cmlnZ2VyKFwibGlzdDppdGVtOmNsaWNrXCIsIHRoaXMubW9kZWwuZ2V0KFwia2V5XCIpKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0b25MaXN0SXRlbUNsaWNrOiBmdW5jdGlvbihrZXkpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5oYXMoXCJrZXlcIikgJiYgdGhpcy5tb2RlbC5nZXQoXCJrZXlcIikgPT09IGtleSlcblx0XHRcdHRoaXMuJGVsLmFkZENsYXNzKFwiaGlnaGxpZ2h0ZWRcIik7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy4kZWwucmVtb3ZlQ2xhc3MoXCJoaWdobGlnaHRlZFwiKTtcblx0fSxcblxuXHRvbkxpc3RJdGVtVG9nZ2xlOiBmdW5jdGlvbihrZXkpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5oYXMoXCJrZXlcIikgJiYgdGhpcy5tb2RlbC5nZXQoXCJrZXlcIikgPT09IGtleSlcblx0XHRcdHRoaXMudG9nZ2xlU2VsZWN0ZWQoKTtcblx0fSxcblxuXHR0b2dnbGVTZWxlY3RlZDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMub3B0aW9ucy50b2dnbGVNb2RlKVxuXHRcdFx0dGhpcy5tb2RlbC5zZXQoXCJzZWxlY3RlZFwiLCAhdGhpcy5tb2RlbC5nZXQoXCJzZWxlY3RlZFwiKSk7XG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwic2VsZWN0ZWRcIikpIHtcblx0XHRcdHRoaXMudWkuc2VsZWN0ZWRJY29uLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHRoaXMudWkudW5zZWxlY3RlZEljb24uYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMudWkuc2VsZWN0ZWRJY29uLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHRoaXMudWkudW5zZWxlY3RlZEljb24ucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblx0fSxcblxuXHRvbk1vZGVsU2VsZWN0ZWRDaGFuZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMucmVuZGVyKCk7XG5cdH0sXG5cblx0b25WYWx1ZUNoYW5nZTogZnVuY3Rpb24oZmllbGQpIHtcblx0XHR0aGlzLm1vZGVsLnNldChcInZhbHVlXCIsIHRoaXMubW9kZWwuZ2V0KGZpZWxkKSk7XG5cdFx0dGhpcy51aS52YWx1ZS50ZXh0KHRoaXMubW9kZWwuZ2V0KGZpZWxkKSk7XG5cdH0sXG5cblx0ZWRpdEJ0bkNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm1vZGVsLnNldChcInN1YmplY3RfbmFtZVwiLCB0aGlzLm1vZGVsLmdldChcInN1YmplY3RcIikpO1xuXHRcdHRoaXMubW9kZWwuc2V0KFwic3ViamVjdFwiLCB0aGlzLm1vZGVsLmdldChcInN1YmplY3RfaWRcIikpO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwgXCJjaGFuZ2U6bmFtZVwiLCB0aGlzLm9uVmFsdWVDaGFuZ2UuYmluZCh0aGlzLCBcIm5hbWVcIikpO1xuXG5cdFx0Y29uc3QgbW9kYWwgPSBuZXcgR3JvdXBNb2RhbCh7XG5cdFx0XHRtb2RlbDogdGhpcy5tb2RlbCxcblx0XHRcdGRvbnRTYXZlOiB0cnVlLFxuXHRcdH0pO1xuXG5cdFx0bW9kYWwuc2hvdygpO1xuXHR9LFxufSk7XG5cbmNvbnN0IExpc3QgPSBCYWNrYm9uZS5NYXJpb25ldHRlLkNvbGxlY3Rpb25WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJsaXN0XCIsXG5cblx0Y2hpbGRWaWV3OiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdGlmIChtb2RlbC5oYXMoXCJjYXRlZ29yeVwiKSAmJiBtb2RlbC5nZXQoXCJjYXRlZ29yeVwiKSlcblx0XHRcdHJldHVybiBMaXN0Q2F0ZWdvcnk7XG5cblx0XHRyZXR1cm4gTGlzdEl0ZW07XG5cdH0sXG5cblx0Y2hpbGRWaWV3T3B0aW9uczogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGhpZGVPbjogdGhpcy5vcHRpb25zLmhpZGVPbixcblx0XHRcdGludGVyYWN0aXZlOiB0aGlzLm9wdGlvbnMuaW50ZXJhY3RpdmUsXG5cdFx0XHR0b2dnbGVNb2RlOiB0aGlzLm9wdGlvbnMudG9nZ2xlTW9kZSxcblx0XHRcdHNlbGVjdGVkSWNvbjogdGhpcy5vcHRpb25zLnNob3dTZWxlY3RlZCxcblx0XHRcdGVkaXRhYmxlOiB0aGlzLm9wdGlvbnMuZWRpdGFibGUsXG5cdFx0fTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5vcHRpb25zID0gXy5pc05pbChvcHRpb25zKSA/IHt9IDogb3B0aW9ucztcblx0XHR0aGlzLm9wdGlvbnMuaW50ZXJhY3RpdmUgPSBfLmlzVW5kZWZpbmVkKHRoaXMub3B0aW9ucy5pbnRlcmFjdGl2ZSkgPyB0cnVlIDogdGhpcy5vcHRpb25zLmludGVyYWN0aXZlO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhtaWdyYXRpb25DaGFubmVsLCBcImxpc3Q6aXRlbTp0b2dnbGVcIiwgdGhpcy5vbkxpc3RJdGVtVG9nZ2xlLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVwZGF0ZUNhdGVnb3JpZXMoKTtcblx0fSxcblxuXHR1cGRhdGVDYXRlZ29yaWVzOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBzZWxlY3RlZENhdGVnb3JpZXMgPSB0aGlzLmdldFNlbGVjdGVkQ2F0ZWdvcmllcygpO1xuXHRcdGNvbnN0IHVuc2VsZWN0ZWRDYXRlZ29yaWVzID0gdGhpcy5nZXRVbnNlbGVjdGVkQ2F0ZWdvcmllcygpO1xuXG5cdFx0Xy5mb3JFYWNoKHRoaXMuY29sbGVjdGlvbi5tb2RlbHMsIG1vZGVsID0+IHtcblx0XHRcdGlmIChtb2RlbC5oYXMoXCJjYXRlZ29yeVwiKSAmJiBtb2RlbC5nZXQoXCJjYXRlZ29yeVwiKSlcblx0XHRcdFx0bW9kZWwudHJpZ2dlcihcImxpc3Q6Y2F0ZWdvcnk6Y2hhbmdlXCIsIHNlbGVjdGVkQ2F0ZWdvcmllcywgdW5zZWxlY3RlZENhdGVnb3JpZXMpO1xuXHRcdH0pO1xuXHR9LFxuXG5cdG9uTGlzdEl0ZW1Ub2dnbGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudXBkYXRlQ2F0ZWdvcmllcygpO1xuXHR9LFxuXG5cdGdldFNlbGVjdGVkQ2F0ZWdvcmllczogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIF8uY29tcGFjdChfLm1hcCh0aGlzLmdldENhdGVnb3J5TWFwKCksIChvY2N1cnJlbmNlcywgY2F0ZWdvcnkpID0+IChvY2N1cnJlbmNlcy5zZWxlY3RlZCA9PT0gb2NjdXJyZW5jZXMudG90YWwgPyBjYXRlZ29yeSA6IG51bGwpKSk7XG5cdH0sXG5cblx0Z2V0VW5zZWxlY3RlZENhdGVnb3JpZXM6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBfLmNvbXBhY3QoXy5tYXAodGhpcy5nZXRDYXRlZ29yeU1hcCgpLCAob2NjdXJyZW5jZXMsIGNhdGVnb3J5KSA9PiAob2NjdXJyZW5jZXMuc2VsZWN0ZWQgPT09IDAgPyBjYXRlZ29yeSA6IG51bGwpKSk7XG5cdH0sXG5cblx0Z2V0Q2F0ZWdvcnlNYXA6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBfLnJlZHVjZSh0aGlzLmNvbGxlY3Rpb24ubW9kZWxzLCAoYWNjLCBtb2RlbCkgPT4ge1xuXHRcdFx0aWYgKG1vZGVsLmhhcyhcInBhcmVudFwiKSkge1xuXHRcdFx0XHRpZiAoXy5pc05pbChhY2NbbW9kZWwuZ2V0KFwicGFyZW50XCIpXSkpIHtcblx0XHRcdFx0XHRhY2NbbW9kZWwuZ2V0KFwicGFyZW50XCIpXSA9IHtcblx0XHRcdFx0XHRcdHNlbGVjdGVkOiAwLFxuXHRcdFx0XHRcdFx0dG90YWw6IDAsXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGFjY1ttb2RlbC5nZXQoXCJwYXJlbnRcIildLnNlbGVjdGVkICs9IG1vZGVsLmdldChcInNlbGVjdGVkXCIpID8gMSA6IDA7XG5cdFx0XHRcdGFjY1ttb2RlbC5nZXQoXCJwYXJlbnRcIildLnRvdGFsKys7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBhY2M7XG5cdFx0fSwge30pO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKG1pZ3JhdGlvbkNoYW5uZWwpO1xuXHR9LFxufSk7XG5cbmNvbnN0IEdyYWRlU2VsZWN0b3IgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInNlbGVjdG9yXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvdG9vbHMvbWlncmF0ZVN0dWRlbnRzLm51bmpcIikuc2VsZWN0b3IsXG5cblx0dGVtcGxhdGVDb250ZXh0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bGVmdExpc3RUaXRsZTogdGhpcy5vcHRpb25zLnNvdXJjZVllYXIsXG5cdFx0XHRyaWdodExpc3RUaXRsZTogdGhpcy5vcHRpb25zLnRhcmdldFllYXIsXG5cdFx0fTtcblx0fSxcblxuXHRyZWdpb25zOiB7XG5cdFx0bGVmdDogXCIubGlzdC1yZWdpb24jbGVmdFwiLFxuXHRcdHJpZ2h0OiBcIi5saXN0LXJlZ2lvbiNyaWdodFwiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLmdyYWRlQ29sbGVjdGlvbiA9IG9wdGlvbnMuZ3JhZGVDb2xsZWN0aW9uO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJsZWZ0XCIsIG5ldyBMaXN0KHtcblx0XHRcdGNvbGxlY3Rpb246IHRoaXMuZ3JhZGVDb2xsZWN0aW9uLFxuXHRcdFx0aGlkZU9uOiB0cnVlLFxuXHRcdFx0dG9nZ2xlTW9kZTogdHJ1ZSxcblx0XHR9KSk7XG5cblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJyaWdodFwiLCBuZXcgTGlzdCh7XG5cdFx0XHRjb2xsZWN0aW9uOiB0aGlzLmdyYWRlQ29sbGVjdGlvbixcblx0XHRcdGhpZGVPbjogZmFsc2UsXG5cdFx0XHR0b2dnbGVNb2RlOiB0cnVlLFxuXHRcdH0pKTtcblx0fSxcbn0pO1xuXG5jb25zdCBHcm91cFZpZXdlciA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwic2VsZWN0b3JcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy90b29scy9taWdyYXRlU3R1ZGVudHMubnVualwiKS5zZWxlY3RvcixcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRsZWZ0TGlzdFRpdGxlOiBcIkdyYWRlc1wiLFxuXHRcdFx0cmlnaHRMaXN0VGl0bGU6IFwiTmV3IEdyb3Vwc1wiLFxuXHRcdH07XG5cdH0sXG5cblx0cmVnaW9uczoge1xuXHRcdGxlZnQ6IFwiLmxpc3QtcmVnaW9uI2xlZnRcIixcblx0XHRyaWdodDogXCIubGlzdC1yZWdpb24jcmlnaHRcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5ncmFkZUNvbGxlY3Rpb24gPSBvcHRpb25zLmdyYWRlQ29sbGVjdGlvbjtcblx0XHR0aGlzLnByb21vdGVkR3JvdXBDb2xsZWN0aW9uID0gb3B0aW9ucy5wcm9tb3RlZEdyb3VwQ29sbGVjdGlvbjtcblx0XHR0aGlzLmN1cnJlbnRHcm91cENvbGxlY3Rpb24gPSBuZXcgQmFja2JvbmUuQ29sbGVjdGlvbihfLm1hcChvcHRpb25zLnByb21vdGVkR3JvdXBDb2xsZWN0aW9uLm1vZGVscywgbW9kZWwgPT4ge1xuXHRcdFx0aWYgKG1vZGVsLmhhcyhcInNlbGVjdGVkXCIpKVxuXHRcdFx0XHRtb2RlbC5zZXQoeyB2YWx1ZTogbW9kZWwuZ2V0KFwibmFtZVwiKSB9KTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0bW9kZWwuc2V0KHsgc2VsZWN0ZWQ6IHRydWUsIHZhbHVlOiBtb2RlbC5nZXQoXCJuYW1lXCIpIH0pO1xuXHRcdFx0cmV0dXJuIG1vZGVsO1xuXHRcdH0pKTtcblxuXHRcdHRoaXMubGlzdGVuVG8obWlncmF0aW9uQ2hhbm5lbCwgXCJsaXN0Oml0ZW06Y2xpY2tcIiwgdGhpcy5vbkxpc3RJdGVtQ2xpY2suYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImxlZnRcIiwgbmV3IExpc3Qoe1xuXHRcdFx0Y29sbGVjdGlvbjogdGhpcy5ncmFkZUNvbGxlY3Rpb24sXG5cdFx0XHRoaWRlT246IGZhbHNlLFxuXHRcdFx0dG9nZ2xlTW9kZTogZmFsc2UsXG5cdFx0fSkpO1xuXG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwicmlnaHRcIiwgbmV3IExpc3Qoe1xuXHRcdFx0Y29sbGVjdGlvbjogdGhpcy5jdXJyZW50R3JvdXBDb2xsZWN0aW9uLFxuXHRcdFx0aW50ZXJhY3RpdmU6IHRydWUsXG5cdFx0XHR0b2dnbGVNb2RlOiB0cnVlLFxuXHRcdFx0c2hvd1NlbGVjdGVkOiB0cnVlLFxuXHRcdFx0ZWRpdGFibGU6IHRydWUsXG5cdFx0fSkpO1xuXHR9LFxuXG5cdG9uTGlzdEl0ZW1DbGljazogZnVuY3Rpb24oZ3JhZGUpIHtcblx0XHRjb25zdCBncm91cHNGb3JHcmFkZSA9IF8uZmlsdGVyKHRoaXMucHJvbW90ZWRHcm91cENvbGxlY3Rpb24ubW9kZWxzLCBtb2RlbCA9PiBtb2RlbC5nZXQoXCJvbGRHcmFkZVwiKSA9PT0gZ3JhZGUpO1xuXG5cdFx0dGhpcy5jdXJyZW50R3JvdXBDb2xsZWN0aW9uLnJlc2V0KF8ubWFwKGdyb3Vwc0ZvckdyYWRlLCBtb2RlbCA9PiB7XG5cdFx0XHRpZiAobW9kZWwuaGFzKFwic2VsZWN0ZWRcIikpXG5cdFx0XHRcdG1vZGVsLnNldCh7IHZhbHVlOiBtb2RlbC5nZXQoXCJuYW1lXCIpIH0pO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRtb2RlbC5zZXQoeyBzZWxlY3RlZDogdHJ1ZSwgdmFsdWU6IG1vZGVsLmdldChcIm5hbWVcIikgfSk7XG5cdFx0XHRyZXR1cm4gbW9kZWw7XG5cdFx0fSkpO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKG1pZ3JhdGlvbkNoYW5uZWwpO1xuXHR9LFxufSk7XG5cbmNvbnN0IFBsYW5WaWV3ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJwbGFuXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvdG9vbHMvbWlncmF0ZVN0dWRlbnRzLm51bmpcIikucGxhbixcblxuXHRyZWdpb25zOiB7XG5cdFx0bGlzdDogXCIubGlzdC1yZWdpb25cIixcblx0fSxcblxuXHR1aToge1xuXHRcdGxpbmtEb3dubG9hZDogXCIubGlzdC1kb3dubG9hZCA+IGFcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5saW5rRG93bmxvYWRcIjogXCJvbkxpbmtEb3dubG9hZENsaWNrXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMucHJvbW90aW9uUGxhbkNvbGxlY3Rpb24gPSBvcHRpb25zLnByb21vdGlvblBsYW5Db2xsZWN0aW9uO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJsaXN0XCIsIG5ldyBMaXN0KHtcblx0XHRcdGNvbGxlY3Rpb246IHRoaXMucHJvbW90aW9uUGxhbkNvbGxlY3Rpb24sXG5cdFx0XHRpbnRlcmFjdGl2ZTogZmFsc2UsXG5cdFx0fSkpO1xuXHR9LFxuXG5cdG9uTGlua0Rvd25sb2FkQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdG1pZ3JhdGlvbkNoYW5uZWwudHJpZ2dlcihcInBsYW46ZG93bmxvYWRcIik7XG5cdH0sXG59KTtcblxuY29uc3QgU3VjY2Vzc1ZpZXcgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcIm1lc3NhZ2Utdmlld1wiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL3Rvb2xzL21pZ3JhdGVTdHVkZW50cy5udW5qXCIpLm1lc3NhZ2UsXG5cblx0dGVtcGxhdGVDb250ZXh0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bWVzc2FnZTogdGhpcy5vcHRpb25zLm1lc3NhZ2UsXG5cdFx0XHR0aXRsZTogXCJTdWNjZXNzXCIsXG5cdFx0fTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucztcblx0fSxcbn0pO1xuXG5jb25zdCBNaWdyYXRpb25WaWV3ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJtaWdyYXRpb24tdmlld1wiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL3Rvb2xzL21pZ3JhdGVTdHVkZW50cy5udW5qXCIpLm1pZ3JhdGlvbixcblxuXHRyZWdpb25zOiB7XG5cdFx0Z3VpZGU6IFwiLmd1aWRlLXJlZ2lvblwiLFxuXHRcdHdvcms6IFwiLndvcmstcmVnaW9uXCIsXG5cdH0sXG5cblx0dWk6IHtcblx0XHRkb3dubG9hZEhlbHBlcjogXCJhI2Rvd25sb2FkLWhlbHBlclwiLFxuXHRcdHdvcmtSZWdpb246IFwiLndvcmstcmVnaW9uXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgY3VycmVudFllYXIgPSBtb21lbnQoKS55ZWFyKCk7XG5cblx0XHR0aGlzLnNvdXJjZVllYXIgPSBtb21lbnQoKS5tb250aCgpIDwgc2V0dGluZ3MueWVhclN0YXJ0ID8gY3VycmVudFllYXIgLSAxIDogY3VycmVudFllYXI7XG5cdFx0dGhpcy50YXJnZXRZZWFyID0gdGhpcy5zb3VyY2VZZWFyICsgMTtcblxuXHRcdGNvbnN0IGdyYWRlQ2F0ZWdvcmllcyA9IF8ucmVkdWNlKHNldHRpbmdzLmdyYWRlTGlzdCwgKHN1bSwgbnVtLCBrZXkpID0+IHtcblx0XHRcdHN1bVtrZXldID0gXy5yZWR1Y2UobnVtLnNvcnQoKGEsIGIpID0+IChcImxleGljYWxcIiBpbiBhID8gYS5sZXhpY2FsIDogYS5uYW1lKS50b1VwcGVyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoKFwibGV4aWNhbFwiIGluIGIgPyBiLmxleGljYWwgOiBiLm5hbWUpLnRvVXBwZXJDYXNlKCkpKSxcblx0XHRcdFx0KHN1bTEsIG51bTEpID0+IHtcblx0XHRcdFx0XHRzdW0xLnB1c2goeyBrZXk6IG51bTEudmFsdWUsIHZhbHVlOiBudW0xLm5hbWUgfSk7XG5cdFx0XHRcdFx0cmV0dXJuIHN1bTE7XG5cdFx0XHRcdH0sIFtdKTtcblx0XHRcdHJldHVybiBzdW07XG5cdFx0fSwge30pO1xuXG5cdFx0ZGVsZXRlIGdyYWRlQ2F0ZWdvcmllcy5PdGhlcjtcblxuXHRcdHRoaXMuZ3JhZGVDb2xsZWN0aW9uID0gbmV3IEJhY2tib25lLkNvbGxlY3Rpb24oXy5mbGF0TWFwRGVlcChncmFkZUNhdGVnb3JpZXMsIChncmFkZXMsIGNhdGVnb3J5KSA9PlxuXHRcdFx0W3sgY2F0ZWdvcnk6IHRydWUsIHZhbHVlOiBjYXRlZ29yeSB9LCBfLm1hcChncmFkZXMsIGdyYWRlID0+IHtcblx0XHRcdFx0Y29uc3QgbmV3R3JhZGUgPSBfLmNsb25lKGdyYWRlKTtcblxuXHRcdFx0XHRuZXdHcmFkZS5zZWxlY3RlZCA9IGZhbHNlO1xuXHRcdFx0XHRuZXdHcmFkZS5wYXJlbnQgPSBjYXRlZ29yeTtcblxuXHRcdFx0XHRyZXR1cm4gbmV3R3JhZGU7XG5cdFx0XHR9KV1cblx0XHQpKTtcblxuXHRcdHRoaXMubG9nQ29sbGVjdGlvbiA9IG5ldyBCYWNrYm9uZS5Db2xsZWN0aW9uKCk7XG5cblx0XHR0aGlzLmN1cnJlbnRTdGVwID0gMTtcblxuXHRcdHRoaXMubGlzdGVuVG8obWlncmF0aW9uQ2hhbm5lbCwge1xuXHRcdFx0XCJndWlkZTpmaW5pc2hcIjogdGhpcy5vbkd1aWRlTmV4dC5iaW5kKHRoaXMpLFxuXHRcdFx0XCJndWlkZTpuZXh0XCI6IHRoaXMub25HdWlkZU5leHQuYmluZCh0aGlzKSxcblx0XHRcdFwiZ3VpZGU6cHJldmlvdXNcIjogdGhpcy5vbkd1aWRlUHJldmlvdXMuYmluZCh0aGlzKSxcblx0XHRcdFwiZ3VpZGU6c3RhcnRcIjogdGhpcy5vbkd1aWRlTmV4dC5iaW5kKHRoaXMpLFxuXHRcdFx0XCJwbGFuOmRvd25sb2FkXCI6IHRoaXMub25QbGFuRG93bmxvYWQuYmluZCh0aGlzKSxcblx0XHR9KTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zaG93Q3VycmVudFN0ZXAoKTtcblx0fSxcblxuXHRvbkd1aWRlTmV4dDogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgdmFsaWRhdGlvbkVycm9yID0gdGhpcy52YWxpZGF0ZUN1cnJlbnRTdGVwKCk7XG5cblx0XHRpZiAoXy5pc05pbCh2YWxpZGF0aW9uRXJyb3IpKVxuXHRcdFx0dGhpcy5wcm9jZXNzQ3VycmVudFN0ZXAoKTtcblx0XHRlbHNlXG5cdFx0XHRtaWdyYXRpb25DaGFubmVsLnRyaWdnZXIoXCJlcnJvclwiLCBcIklucHV0IEVycm9yXCIsIHZhbGlkYXRpb25FcnJvcik7XG5cdH0sXG5cblx0b25HdWlkZVByZXZpb3VzOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNob3dQcmV2aW91c1N0ZXAoKTtcblx0fSxcblxuXHRwcm9jZXNzQ3VycmVudFN0ZXA6IGZ1bmN0aW9uKCkge1xuXHRcdHN3aXRjaCAodGhpcy5jdXJyZW50U3RlcCkge1xuXHRcdFx0Y2FzZSAxOlxuXHRcdFx0XHRpZiAodGhpcy5wcm9tb3RlZEdyb3VwQ29sbGVjdGlvbikge1xuXHRcdFx0XHRcdHRoaXMuc2hvd05leHRTdGVwKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5zaG93QnVzeVN0YXRlKCk7XG5cdFx0XHRcdFx0dGhpcy5wcm9tb3RlZEdyb3VwQ29sbGVjdGlvbiA9IG5ldyBQcm9tb3RlZEdyb3VwQ29sbGVjdGlvbigpO1xuXHRcdFx0XHRcdHRoaXMucHJvbW90ZWRHcm91cENvbGxlY3Rpb24uZmV0Y2goe1xuXHRcdFx0XHRcdFx0ZGF0YToge1xuXHRcdFx0XHRcdFx0XHRncmFkZXM6IF8uY29tcGFjdChfLm1hcCh0aGlzLmdyYWRlQ29sbGVjdGlvbi5tb2RlbHMsIG1vZGVsID0+IChtb2RlbC5oYXMoXCJzZWxlY3RlZFwiKSAmJiBtb2RlbC5nZXQoXCJzZWxlY3RlZFwiKSA/IG1vZGVsLmdldChcImtleVwiKSA6IG51bGwpKSksXG5cdFx0XHRcdFx0XHRcdHNvdXJjZVllYXI6IHRoaXMuc291cmNlWWVhcixcblx0XHRcdFx0XHRcdFx0dGFyZ2V0WWVhcjogdGhpcy50YXJnZXRZZWFyLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdHN1Y2Nlc3M6ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5oaWRlQnVzeVN0YXRlKCk7XG5cdFx0XHRcdFx0XHRcdHRoaXMuc2hvd05leHRTdGVwKCk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0ZXJyb3I6IChjb2xsZWN0aW9uLCByZXNwb25zZSkgPT4ge1xuXHRcdFx0XHRcdFx0XHR0aGlzLmhpZGVCdXN5U3RhdGUoKTtcblx0XHRcdFx0XHRcdFx0bWlncmF0aW9uQ2hhbm5lbC50cmlnZ2VyKFwiZXJyb3JcIiwgXCJDb21tdW5pY2F0aW9uIEVycm9yXCIsIEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlKSk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIDI6XG5cdFx0XHRcdHRoaXMuc2hvd0J1c3lTdGF0ZSgpO1xuXHRcdFx0XHR0aGlzLnByb21vdGlvblBsYW5Db2xsZWN0aW9uID0gbmV3IFByb21vdGlvblBsYW5Db2xsZWN0aW9uKCk7XG5cblx0XHRcdFx0UHJvbWlzZS5yZXNvbHZlKCQucG9zdChzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC90b29scy9taWdyYXRlU3R1ZGVudHMvcGxhbi9nZXRQbGFuXCIsIHtcblx0XHRcdFx0XHRncmFkZXM6IF8uY29tcGFjdChfLm1hcCh0aGlzLmdyYWRlQ29sbGVjdGlvbi5tb2RlbHMsIG1vZGVsID0+IChtb2RlbC5oYXMoXCJzZWxlY3RlZFwiKSAmJiBtb2RlbC5nZXQoXCJzZWxlY3RlZFwiKSA/IG1vZGVsLmdldChcImtleVwiKSA6IG51bGwpKSksXG5cdFx0XHRcdFx0c291cmNlWWVhcjogdGhpcy5zb3VyY2VZZWFyLFxuXHRcdFx0XHRcdHRhcmdldFllYXI6IHRoaXMudGFyZ2V0WWVhcixcblx0XHRcdFx0XHRncm91cHM6IF8ubWFwKF8uZmlsdGVyKHRoaXMucHJvbW90ZWRHcm91cENvbGxlY3Rpb24ubW9kZWxzLCBtb2RlbCA9PiBtb2RlbC5nZXQoXCJzZWxlY3RlZFwiKSksIG1vZGVsID0+IG1vZGVsLmF0dHJpYnV0ZXMpLFxuXHRcdFx0XHR9LCByZXNwb25zZSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5wcm9tb3Rpb25QbGFuQ29sbGVjdGlvbiA9IG5ldyBQcm9tb3Rpb25QbGFuQ29sbGVjdGlvbihyZXNwb25zZSk7XG5cdFx0XHRcdFx0dGhpcy5oaWRlQnVzeVN0YXRlKCk7XG5cdFx0XHRcdFx0dGhpcy5zaG93TmV4dFN0ZXAoKTtcblx0XHRcdFx0fSkpLmNhdGNoKGVycm9yID0+IHtcblx0XHRcdFx0XHR0aGlzLmhpZGVCdXN5U3RhdGUoKTtcblx0XHRcdFx0XHRtaWdyYXRpb25DaGFubmVsLnRyaWdnZXIoXCJlcnJvclwiLCBcIkNvbW11bmljYXRpb24gRXJyb3JcIiwgSlNPTi5zdHJpbmdpZnkoZXJyb3IpKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgMzpcblx0XHRcdFx0dGhpcy5zaG93QnVzeVN0YXRlKCk7XG5cdFx0XHRcdFByb21pc2UucmVzb2x2ZSgkLnBvc3Qoc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvdG9vbHMvbWlncmF0ZVN0dWRlbnRzL3BsYW5cIiwge1xuXHRcdFx0XHRcdGdyYWRlczogXy5jb21wYWN0KF8ubWFwKHRoaXMuZ3JhZGVDb2xsZWN0aW9uLm1vZGVscywgbW9kZWwgPT4gKG1vZGVsLmhhcyhcInNlbGVjdGVkXCIpICYmIG1vZGVsLmdldChcInNlbGVjdGVkXCIpID8gbW9kZWwuZ2V0KFwia2V5XCIpIDogbnVsbCkpKSxcblx0XHRcdFx0XHRzb3VyY2VZZWFyOiB0aGlzLnNvdXJjZVllYXIsXG5cdFx0XHRcdFx0dGFyZ2V0WWVhcjogdGhpcy50YXJnZXRZZWFyLFxuXHRcdFx0XHRcdGdyb3VwczogXy5tYXAoXy5maWx0ZXIodGhpcy5wcm9tb3RlZEdyb3VwQ29sbGVjdGlvbi5tb2RlbHMsIG1vZGVsID0+IG1vZGVsLmdldChcInNlbGVjdGVkXCIpKSwgbW9kZWwgPT4gbW9kZWwuYXR0cmlidXRlcyksXG5cdFx0XHRcdH0sICgpID0+IHtcblx0XHRcdFx0XHR0aGlzLmhpZGVCdXN5U3RhdGUoKTtcblx0XHRcdFx0XHR0aGlzLnNob3dOZXh0U3RlcCgpO1xuXHRcdFx0XHR9KSkuY2F0Y2goZXJyb3IgPT4ge1xuXHRcdFx0XHRcdHRoaXMuaGlkZUJ1c3lTdGF0ZSgpO1xuXHRcdFx0XHRcdG1pZ3JhdGlvbkNoYW5uZWwudHJpZ2dlcihcImVycm9yXCIsIFwiQ29tbXVuaWNhdGlvbiBFcnJvclwiLCBKU09OLnN0cmluZ2lmeShlcnJvcikpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIlVua25vd24gc3RlcCFcIik7XG5cdFx0fVxuXHR9LFxuXG5cdHNob3dCdXN5U3RhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdG1pZ3JhdGlvbkNoYW5uZWwudHJpZ2dlcihcInN0YXRlOmJ1c3lcIik7XG5cdFx0dGhpcy51aS53b3JrUmVnaW9uLmFkZENsYXNzKFwiZGlzYWJsZWRcIik7XG5cdH0sXG5cblx0aGlkZUJ1c3lTdGF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0bWlncmF0aW9uQ2hhbm5lbC50cmlnZ2VyKFwic3RhdGU6cmVhZHlcIik7XG5cdFx0dGhpcy51aS53b3JrUmVnaW9uLnJlbW92ZUNsYXNzKFwiZGlzYWJsZWRcIik7XG5cdH0sXG5cblx0c2hvd05leHRTdGVwOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmN1cnJlbnRTdGVwKys7XG5cdFx0dGhpcy5zaG93Q3VycmVudFN0ZXAoKTtcblx0fSxcblxuXHRzaG93UHJldmlvdXNTdGVwOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmN1cnJlbnRTdGVwLS07XG5cdFx0dGhpcy5zaG93Q3VycmVudFN0ZXAoKTtcblx0fSxcblxuXHRzaG93Q3VycmVudFN0ZXA6IGZ1bmN0aW9uKCkge1xuXHRcdHN3aXRjaCAodGhpcy5jdXJyZW50U3RlcCkge1xuXHRcdFx0Y2FzZSAxOlxuXHRcdFx0XHR0aGlzLnNob3dTdGVwMSgpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAyOlxuXHRcdFx0XHR0aGlzLnNob3dTdGVwMigpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAzOlxuXHRcdFx0XHR0aGlzLnNob3dTdGVwMygpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSA0OlxuXHRcdFx0XHRtaWdyYXRpb25DaGFubmVsLnRyaWdnZXIoXCJzdWNjZXNzXCIsIFwiQSBiYWNrdXAgZmlsZSBoYXMgYmVlbiBjcmVhdGVkLiBJZiB5b3UgbmVlZCB0byByb2xsIGJhY2sgdGhlIG1pZ3JhdGlvbiwgdGhlbiBwbGVhc2UgY29udGFjdCBEZXZPcHMuXCIpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBzdGVwIVwiKTtcblx0XHR9XG5cdH0sXG5cblx0c2hvd1N0ZXAxOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBndiA9IG5ldyBHdWlkZVZpZXcoe1xuXHRcdFx0YnV0dG9uczogW2d1aWRlVmlld0J1dHRvbi5uZXh0XSxcblx0XHRcdHByb21wdDogYFNlbGVjdCB0aGUgZ3JhZGVzIHRoYXQgd2lsbCBiZSBtaWdyYXRlZCB0byB0aGUgbmV4dCB5ZWFyLjxicj48YnI+Q2xpY2sgb24gYSBncmFkZSB0byBtb3ZlIGl0Ljxicj48YnI+IENob29zZSBzdGFydCB5ZWFyIHRvIG92ZXJyaWRlIGRlZmF1bHQ6XG5cdFx0XHRcdDxzZWxlY3QgbmFtZT0neWVhckNob29zZXInPjxvcHRpb24gdmFsdWU9XCIke3RoaXMuc291cmNlWWVhciAtIDF9XCI+JHt0aGlzLnNvdXJjZVllYXIgLSAxfVxuXHRcdFx0XHQ8b3B0aW9uIHNlbGVjdGVkIHZhbHVlPVwiJHt0aGlzLnNvdXJjZVllYXJ9XCI+JHt0aGlzLnNvdXJjZVllYXJ9PG9wdGlvbiB2YWx1ZT1cIiR7bW9tZW50KCkueWVhcigpfVwiPiR7bW9tZW50KCkueWVhcigpfTwvc2VsZWN0PmAsXG5cdFx0XHRzdGVwOiBcIjFcIixcblx0XHR9KTtcblxuXHRcdHRoaXMubGlzdGVuVG8oZ3YsIFwieWVhckNoYW5nZVwiLCB5ZWFyID0+IHtcblx0XHRcdHRoaXMuc291cmNlWWVhciA9IG1vbWVudCgpLm1vbnRoKCkgPCBzZXR0aW5ncy55ZWFyU3RhcnQgPyB5ZWFyIC0gMSA6IHllYXI7XG5cdFx0XHR0aGlzLnRhcmdldFllYXIgPSB0aGlzLnNvdXJjZVllYXIgKyAxO1xuXG5cdFx0XHRndi5kZXN0cm95KCk7XG5cblx0XHRcdHRoaXMuc2hvd1N0ZXAxKCk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJndWlkZVwiLCBndik7XG5cblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJ3b3JrXCIsIG5ldyBHcmFkZVNlbGVjdG9yKHtcblx0XHRcdGdyYWRlQ29sbGVjdGlvbjogdGhpcy5ncmFkZUNvbGxlY3Rpb24sXG5cdFx0XHRzb3VyY2VZZWFyOiB0aGlzLnNvdXJjZVllYXIsXG5cdFx0XHR0YXJnZXRZZWFyOiB0aGlzLnRhcmdldFllYXIsXG5cdFx0fSkpO1xuXHR9LFxuXG5cdHNob3dTdGVwMjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiZ3VpZGVcIiwgbmV3IEd1aWRlVmlldyh7XG5cdFx0XHRidXR0b25zOiBbZ3VpZGVWaWV3QnV0dG9uLnByZXZpb3VzLCBndWlkZVZpZXdCdXR0b24uc3RhcnRdLFxuXHRcdFx0cHJvbXB0OiBcIlJldmlldyB0aGUgZ3JvdXBzIHRoYXQgd2lsbCBiZSBjcmVhdGVkLjxicj48YnI+Q2xpY2sgb24gYSBncmFkZSB0byB2aWV3IHRoZSBncm91cHMgdGhhdCB3aWxsIGJlIGNyZWF0ZWQuPGJyPjxicj5DbGljayB0aGUgU3RhcnQgYnV0dG9uIHRvIGV4ZWN1dGUgYSBkcnkgcnVuIG9mIHRoZSBtaWdyYXRpb24uXCIsXG5cdFx0XHRzdGVwOiBcIjJcIixcblx0XHR9KSk7XG5cblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJ3b3JrXCIsIG5ldyBHcm91cFZpZXdlcih7XG5cdFx0XHRncmFkZUNvbGxlY3Rpb246IHRoaXMuZ3JhZGVDb2xsZWN0aW9uLFxuXHRcdFx0cHJvbW90ZWRHcm91cENvbGxlY3Rpb246IHRoaXMucHJvbW90ZWRHcm91cENvbGxlY3Rpb24sXG5cdFx0fSkpO1xuXHR9LFxuXG5cdHNob3dTdGVwMzogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiZ3VpZGVcIiwgbmV3IEd1aWRlVmlldyh7XG5cdFx0XHRidXR0b25zOiBbZ3VpZGVWaWV3QnV0dG9uLnByZXZpb3VzLCBndWlkZVZpZXdCdXR0b24uZmluaXNoXSxcblx0XHRcdHByb21wdDogXCJNaWdyYXRlIGxlYXJuZXJzLjxicj48YnI+VGhlIHByb3Bvc2VkIGNoYW5nZXMgYXJlIGRpc3BsYXllZCBpbiB0aGUgTWlncmF0aW9uIFBsYW4gb24gdGhlIHJpZ2h0Ljxicj48YnI+Q2xpY2sgdGhlIEZpbmlzaCBidXR0b24gdG8gY29tbWl0IHRoZSBjaGFuZ2VzIHRvIHRoZSBkYXRhYmFzZS5cIixcblx0XHRcdHN0ZXA6IFwiM1wiLFxuXHRcdH0pKTtcblxuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcIndvcmtcIiwgbmV3IFBsYW5WaWV3KHsgcHJvbW90aW9uUGxhbkNvbGxlY3Rpb246IHRoaXMucHJvbW90aW9uUGxhbkNvbGxlY3Rpb24gfSkpO1xuXHR9LFxuXG5cdHZhbGlkYXRlQ3VycmVudFN0ZXA6IGZ1bmN0aW9uKCkge1xuXHRcdGxldCB2YWxpZGF0aW9uRXJyb3I7XG5cblx0XHRzd2l0Y2ggKHRoaXMuY3VycmVudFN0ZXApIHtcblx0XHRcdGNhc2UgMTpcblx0XHRcdFx0aWYgKF8uaXNVbmRlZmluZWQoXy5maW5kKHRoaXMuZ3JhZGVDb2xsZWN0aW9uLm1vZGVscywgbW9kZWwgPT4gbW9kZWwuZ2V0KFwic2VsZWN0ZWRcIikpKSlcblx0XHRcdFx0XHR2YWxpZGF0aW9uRXJyb3IgPSBcIllvdSBtdXN0IHNlbGVjdCBhdCBsZWFzdCBvbmUgZ3JhZGUgdG8gbWlncmF0ZS5cIjtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgMjpcblx0XHRcdFx0Xy5ub29wKCk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIDM6XG5cdFx0XHRcdF8ubm9vcCgpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBzdGVwIVwiKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsaWRhdGlvbkVycm9yO1xuXHR9LFxuXG5cdG9uUGxhbkRvd25sb2FkOiBmdW5jdGlvbigpIHtcblx0XHRQcm9taXNlLnJlc29sdmUoJC5wb3N0KHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3Rvb2xzL21pZ3JhdGVTdHVkZW50cy9wbGFuL2NzdlwiLCB7XG5cdFx0XHRncmFkZXM6IF8uY29tcGFjdChfLm1hcCh0aGlzLmdyYWRlQ29sbGVjdGlvbi5tb2RlbHMsIG1vZGVsID0+IChtb2RlbC5oYXMoXCJzZWxlY3RlZFwiKSAmJiBtb2RlbC5nZXQoXCJzZWxlY3RlZFwiKSA/IG1vZGVsLmdldChcImtleVwiKSA6IG51bGwpKSksXG5cdFx0XHRzb3VyY2VZZWFyOiB0aGlzLnNvdXJjZVllYXIsXG5cdFx0XHR0YXJnZXRZZWFyOiB0aGlzLnRhcmdldFllYXIsXG5cdFx0XHRncm91cHM6IF8ubWFwKF8uZmlsdGVyKHRoaXMucHJvbW90ZWRHcm91cENvbGxlY3Rpb24ubW9kZWxzLCBtb2RlbCA9PiBtb2RlbC5nZXQoXCJzZWxlY3RlZFwiKSksIG1vZGVsID0+IG1vZGVsLmF0dHJpYnV0ZXMpLFxuXHRcdH0sIGNzdiA9PiB7XG5cdFx0XHR0aGlzLnVpLmRvd25sb2FkSGVscGVyLmF0dHIoXCJocmVmXCIsIFwiZGF0YTp0ZXh0L2NzdixcIiArIGNzdik7XG5cdFx0XHR0aGlzLnVpLmRvd25sb2FkSGVscGVyLmdldCgwKS5jbGljaygpO1xuXHRcdH0pKS5jYXRjaChlcnJvciA9PiB7XG5cdFx0XHRtaWdyYXRpb25DaGFubmVsLnRyaWdnZXIoXCJlcnJvclwiLCBcIkNvbW11bmljYXRpb24gRXJyb3JcIiwgSlNPTi5zdHJpbmdpZnkoZXJyb3IpKTtcblx0XHR9KTtcblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc3RvcExpc3RlbmluZyhtaWdyYXRpb25DaGFubmVsKTtcblx0fSxcbn0pO1xuXG5jb25zdCBMb2NrVmlldyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwibWVzc2FnZS12aWV3XCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvdG9vbHMvbWlncmF0ZVN0dWRlbnRzLm51bmpcIikubWVzc2FnZSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRtZXNzYWdlOiBcIkEgbGVhcm5lciBtaWdyYXRpb24gd2FzIGNvbXBsZXRlZCBvbiBcIiArIG1vbWVudC51bml4KHRoaXMub3B0aW9ucy5jcmVhdGVkKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpICsgXCIgYXQgXCIgK1xuXHRcdFx0XHRtb21lbnQudW5peCh0aGlzLm9wdGlvbnMuY3JlYXRlZCkuZm9ybWF0KFwiSEg6bW1cIikgKyBcIiBieSBcIiArIHRoaXMub3B0aW9ucy5wZXJzb25OYW1lICtcblx0XHRcdFx0XCIuIElmIHlvdSBuZWVkIHRvIHJvbGwgYmFjayB0aGlzIG1pZ3JhdGlvbiBvciBwZXJmb3JtIGEgbmV3IG1pZ3JhdGlvbiwgdGhlbiBwbGVhc2UgY29udGFjdCBEZXZPcHMuXCIsXG5cdFx0XHR0aXRsZTogXCJMb2NrZWRcIixcblx0XHR9O1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXHR9LFxufSk7XG5cbmNvbnN0IFJlc3RvcmVWaWV3ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJtZXNzYWdlLXZpZXdcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy90b29scy9taWdyYXRlU3R1ZGVudHMubnVualwiKS5yZXN0b3JlLFxuXG5cdHVpOiB7XG5cdFx0YnV0dG9uUmVzdG9yZTogXCJidXR0b24jcmVzdG9yZVwiLFxuXHRcdHNwaW5uZXI6IFwiLnNwaW5uZXItaWNvblwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmJ1dHRvblJlc3RvcmVcIjogXCJvbkJ1dHRvblJlc3RvcmVDbGlja1wiLFxuXHR9LFxuXG5cdG9uQnV0dG9uUmVzdG9yZUNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNob3dCdXN5U3RhdGUoKTtcblx0XHRQcm9taXNlLnJlc29sdmUoJC5wb3N0KHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3Rvb2xzL21pZ3JhdGVTdHVkZW50cy9iYWNrdXBcIiwgcmVzcG9uc2UgPT4ge1xuXHRcdFx0aWYgKHJlc3BvbnNlLmFjaylcblx0XHRcdFx0bWlncmF0aW9uQ2hhbm5lbC50cmlnZ2VyKFwic3VjY2Vzc1wiLCBcIlRoZSBwcmV2aW91cyBzdGF0ZSBoYXMgYmVlbiByZXN0b3JlZC4gQmFja3VwIGZpbGUgcmVtb3ZlZC5cIik7XG5cdFx0fSkpLmNhdGNoKGVycm9yID0+IHtcblx0XHRcdHRoaXMuaGlkZUJ1c3lTdGF0ZSgpO1xuXHRcdFx0bWlncmF0aW9uQ2hhbm5lbC50cmlnZ2VyKFwiZXJyb3JcIiwgXCJDb21tdW5pY2F0aW9uIEVycm9yXCIsIEpTT04uc3RyaW5naWZ5KGVycm9yKSk7XG5cdFx0fSk7XG5cdH0sXG5cblx0c2hvd0J1c3lTdGF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5idXR0b25SZXN0b3JlLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLnNwaW5uZXIucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdGhpZGVCdXN5U3RhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkuc3Bpbm5lci5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5idXR0b25SZXN0b3JlLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwibWlncmF0ZS1zdHVkZW50cy10b29sXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvdG9vbHMvbWlncmF0ZVN0dWRlbnRzLm51bmpcIikubGF5b3V0LFxuXG5cdHJlZ2lvbnM6IHtcblx0XHRkaXNwbGF5OiBcIi5kaXNwbGF5LXJlZ2lvblwiLFxuXHR9LFxuXG5cdHVpOiB7XG5cdFx0YnV0dG9uQmVnaW46IFwiLmJ1dHRvbiNiZWdpblwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmJ1dHRvbkJlZ2luXCI6IFwib25CdXR0b25CZWdpbkNsaWNrXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5saXN0ZW5UbyhtaWdyYXRpb25DaGFubmVsLCB7XG5cdFx0XHRlcnJvcjogdGhpcy5vbkVycm9yLmJpbmQodGhpcyksXG5cdFx0XHRzdWNjZXNzOiB0aGlzLm9uU3VjY2Vzcy5iaW5kKHRoaXMpLFxuXHRcdH0pO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRQcm9taXNlLnJlc29sdmUoJC5nZXQoc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvdG9vbHMvbWlncmF0ZVN0dWRlbnRzL2xvY2tcIiwgZGF0YSA9PiB7XG5cdFx0XHRpZiAoZGF0YS5sb2NrID09PSBudWxsKSB7XG5cdFx0XHRcdFByb21pc2UucmVzb2x2ZSgkLmdldChzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC90b29scy9taWdyYXRlU3R1ZGVudHMvYmFja3VwXCIsIHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRpZiAocmVzcG9uc2UuYWNrKVxuXHRcdFx0XHRcdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiZGlzcGxheVwiLCBuZXcgUmVzdG9yZVZpZXcoKSk7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiZGlzcGxheVwiLCBuZXcgSW50cm9kdWN0aW9uVmlldygpKTtcblx0XHRcdFx0fSkpLmNhdGNoKCgpID0+IHtcblx0XHRcdFx0XHRtaWdyYXRpb25DaGFubmVsLnRyaWdnZXIoXCJlcnJvclwiLCBcIkNvbW11bmljYXRpb24gRXJyb3JcIiwgXCJVbmFibGUgdG8gZGV0ZXJtaW5lIGJhY2t1cCBzdGF0dXMuXCIpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJkaXNwbGF5XCIsIG5ldyBMb2NrVmlldyhkYXRhLmxvY2spKTtcblx0XHRcdH1cblx0XHR9KSkuY2F0Y2goKCkgPT4ge1xuXHRcdFx0bWlncmF0aW9uQ2hhbm5lbC50cmlnZ2VyKFwiZXJyb3JcIiwgXCJDb21tdW5pY2F0aW9uIEVycm9yXCIsIFwiVW5hYmxlIHRvIGRldGVybWluZSBsb2NrIHN0YXR1cy5cIik7XG5cdFx0fSk7XG5cdH0sXG5cblx0b25CdXR0b25CZWdpbkNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJkaXNwbGF5XCIsIG5ldyBNaWdyYXRpb25WaWV3KCkpO1xuXHR9LFxuXG5cdG9uU3VjY2VzczogZnVuY3Rpb24obWVzc2FnZSkge1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImRpc3BsYXlcIiwgbmV3IFN1Y2Nlc3NWaWV3KHsgbWVzc2FnZSB9KSk7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcobWlncmF0aW9uQ2hhbm5lbCk7XG5cdH0sXG5cblx0b25FcnJvcjogZnVuY3Rpb24odGl0bGUsIG1lc3NhZ2UpIHtcblx0XHRjb25zdCBtb2RhbCA9IG5ldyBTbWFsbE1vZGFsKHtcblx0XHRcdHRpdGxlOiBcIjxzcGFuIGNsYXNzPSdmYWwgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUnLz4gXCIgKyB0aXRsZSxcblx0XHRcdGJvZHk6IFwiPHA+XCIgKyBtZXNzYWdlICsgXCI8L3A+XCIsXG5cdFx0XHRoaWRlQnV0dG9uczogW1wiY2FuY2VsXCJdLFxuXHRcdFx0d2FybmluZzogdHJ1ZSxcblx0XHR9KTtcblxuXHRcdG1vZGFsLnNob3coKTtcblx0fSxcbn0pOyJdfQ==",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar Backbone = require(\"backbone\");\nvar Promise = require(\"bluebird\");\nvar _ = require(\"lodash\");\n\nvar settings = require(\"app-settings\");\n\nvar ResourceRepairSources = require(\"../../collections/tools/resourceRepairSources\");\nvar ServerGrid = require(\"../../../lib/serverGrid\");\nvar SmallModal = require(\"../../../lib/smallModal\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"resourceFix\",\n\n\tui: {\n\t\tsaveButton: \"#save\",\n\t\tanswers: \"select.answer\",\n\t\tgrid: \"div.grid\",\n\n\t\tfilterBar: \".ops-bar .filters\",\n\t\tcounterBar: \".ops-bar .counter\",\n\t\tpaging: \"div.paging\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.saveButton\": \"save\"\n\t},\n\n\ttemplate: require(\"../../templates/tools/resourceRepair.nunj\"),\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"firstname\", label: \"First Name\", cell: \"string\", editable: false }, { name: \"surname\", label: \"Surname\", cell: \"string\", editable: false }, { name: \"_id\", label: \"ID\", cell: \"string\", editable: false }, { name: \"target\", cell: ServerGrid.SelectraCell.extend({\n\t\t\t\toptions: {\n\t\t\t\t\tserver: {\n\t\t\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/tools/resourceRepair/targets\",\n\t\t\t\t\t\tdelayLoad: true\n\t\t\t\t\t},\n\t\t\t\t\tpaging: {\n\t\t\t\t\t\tpageSize: 20,\n\t\t\t\t\t\tinfinite: true\n\t\t\t\t\t},\n\t\t\t\t\twidth: \"400px\"\n\t\t\t\t}\n\t\t\t}), label: \"New Person\", editable: true, sortable: false }];\n\n\t\tvar grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new ResourceRepairSources(),\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counterBar,\n\t\t\t\ttemplate: \"Records $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tthis.listenTo(grid.collection, \"change:target\", this.handleEdit.bind(this));\n\t\tthis.listenTo(grid.collection, \"sync\", this.applyEdits.bind(this));\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tthis.ui.filterBar.prepend(grid.filter({\n\t\t\tfilterContainer: this.ui.filterBar,\n\t\t\tfilters: [textFilter],\n\t\t\tdefaultFilters: [\"textFilter\"]\n\t\t}).render().el);\n\t},\n\n\thandleEdit: function handleEdit(model) {\n\t\tif (!this.edits) this.edits = {};\n\n\t\tif (model.get(\"key\")) this.edits[model.get(\"user_id\")] = model.pick([\"target\", \"key\", \"value\"]);else delete this.edits[model.get(\"user_id\")];\n\t},\n\n\tapplyEdits: function applyEdits(col) {\n\t\tvar _this = this;\n\n\t\tif (!this.edits) return;\n\n\t\t_.each(col.models, function (x) {\n\t\t\tif (x.get(\"user_id\") in _this.edits) x.set(_this.edits[x.get(\"user_id\")]);\n\t\t\tx.trigger(\"grid:rendered\");\n\t\t});\n\t},\n\n\tsave: function save(evt) {\n\t\tvar _this2 = this;\n\n\t\tevt.preventDefault();\n\t\tevt.stopPropagation();\n\n\t\tif (!this.edits || !_.keys(this.edits).length) return alert(\"No changes to save; exiting\");\n\n\t\tvar rest = function rest() {\n\t\t\t_this2.ui.saveButton.attr({ disabled: true });\n\n\t\t\t_.each(_this2.edits, function (y, k) {\n\t\t\t\t_this2.edits[k] = y.target;\n\t\t\t});\n\n\t\t\tPromise.resolve($.post(settings.urlRoot + \"/api/1.0/tools/resourceRepair\", { data: _this2.edits }, function (resp) {\n\t\t\t\t_this2.ui.saveButton.attr({ disabled: false });\n\n\t\t\t\tif (!resp.ack) return alert(\"No changes made\");\n\n\t\t\t\talert(\"Changes saved\");\n\n\t\t\t\t_this2.destroy();\n\t\t\t})).catch(function () {\n\t\t\t\talert(\"Error saving changes\");\n\t\t\t});\n\t\t};\n\n\t\tvar m = new SmallModal({\n\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Confirm Action\",\n\t\t\tbody: \"<p>This operation makes irrevocable changes; they cannot be undone. Are you sure?</p><p>\" + _.keys(this.edits).length + \" users' data will be changed.</p>\"\n\t\t});\n\n\t\tm.on(\"button:ok\", rest);\n\n\t\tm.show();\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJlc291cmNlUmVwYWlyLmpzIl0sIm5hbWVzIjpbIiQiLCJyZXF1aXJlIiwiQmFja2JvbmUiLCJQcm9taXNlIiwiXyIsInNldHRpbmdzIiwiUmVzb3VyY2VSZXBhaXJTb3VyY2VzIiwiU2VydmVyR3JpZCIsIlNtYWxsTW9kYWwiLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJleHRlbmQiLCJjbGFzc05hbWUiLCJ1aSIsInNhdmVCdXR0b24iLCJhbnN3ZXJzIiwiZ3JpZCIsImZpbHRlckJhciIsImNvdW50ZXJCYXIiLCJwYWdpbmciLCJldmVudHMiLCJ0ZW1wbGF0ZSIsIm9uUmVuZGVyIiwiY29sdW1ucyIsIm5hbWUiLCJsYWJlbCIsImNlbGwiLCJlZGl0YWJsZSIsIlNlbGVjdHJhQ2VsbCIsIm9wdGlvbnMiLCJzZXJ2ZXIiLCJmZXRjaCIsInVybFJvb3QiLCJkZWxheUxvYWQiLCJwYWdlU2l6ZSIsImluZmluaXRlIiwid2lkdGgiLCJzb3J0YWJsZSIsImVsIiwiY29sbGVjdGlvbiIsImNvdW50ZXIiLCJlbGVtZW50IiwibGlzdGVuVG8iLCJoYW5kbGVFZGl0IiwiYmluZCIsImFwcGx5RWRpdHMiLCJ0ZXh0RmlsdGVyIiwidHlwZSIsImRlYm91bmNlIiwicHJlcGVuZCIsImZpbHRlciIsImZpbHRlckNvbnRhaW5lciIsImZpbHRlcnMiLCJkZWZhdWx0RmlsdGVycyIsInJlbmRlciIsIm1vZGVsIiwiZWRpdHMiLCJnZXQiLCJwaWNrIiwiY29sIiwiZWFjaCIsIm1vZGVscyIsIngiLCJzZXQiLCJ0cmlnZ2VyIiwic2F2ZSIsImV2dCIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwia2V5cyIsImxlbmd0aCIsImFsZXJ0IiwicmVzdCIsImF0dHIiLCJkaXNhYmxlZCIsInkiLCJrIiwidGFyZ2V0IiwicmVzb2x2ZSIsInBvc3QiLCJkYXRhIiwicmVzcCIsImFjayIsImRlc3Ryb3kiLCJjYXRjaCIsIm0iLCJ0aXRsZSIs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QUFNQyxPQUFPLFNBQVBBLElBQU8sR0FBTTtBQUNsQixVQUFLM0QsRUFBTCxDQUFRQyxVQUFSLENBQW1CMkQsSUFBbkIsQ0FBd0IsRUFBRUMsVUFBVSxJQUFaLEVBQXhCOztBQUVBeEUsS0FBRTBELElBQUYsQ0FBTyxPQUFLSixLQUFaLEVBQW1CLFVBQUNtQixDQUFELEVBQUlDLENBQUosRUFBVTtBQUM1QixXQUFLcEIsS0FBTCxDQUFXb0IsQ0FBWCxJQUFnQkQsRUFBRUUsTUFBbEI7QUFDQSxJQUZEOztBQUlBNUUsV0FBUTZFLE9BQVIsQ0FBZ0JoRixFQUFFaUYsSUFBRixDQUFPNUUsU0FBUzZCLE9BQVQsR0FBbUIsK0JBQTFCLEVBQTJELEVBQUVnRCxNQUFNLE9BQUt4QixLQUFiLEVBQTNELEVBQWlGLGdCQUFRO0FBQ3hHLFdBQUszQyxFQUFMLENBQVFDLFVBQVIsQ0FBbUIyRCxJQUFuQixDQUF3QixFQUFFQyxVQUFVLEtBQVosRUFBeEI7O0FBRUEsUUFBSSxDQUFDTyxLQUFLQyxHQUFWLEVBQ0MsT0FBT1gsTUFBTSxpQkFBTixDQUFQOztBQUVEQSxVQUFNLGVBQU47O0FBRUEsV0FBS1ksT0FBTDtBQUNBLElBVGUsQ0FBaEIsRUFTSUMsS0FUSixDQVNVLFlBQU07QUFDZmIsVUFBTSxzQkFBTjtBQUNBLElBWEQ7QUFZQSxHQW5CRDs7QUFxQkEsTUFBTWMsSUFBSSxJQUFJL0UsVUFBSixDQUFlO0FBQ3hCZ0YsVUFBTyw0REFEaUI7QUFFeEJDLFNBQU0sNkZBQTZGckYsRUFBRW1FLElBQUYsQ0FBTyxLQUFLYixLQUFaLEVBQW1CYyxNQUFoSCxHQUF5SDtBQUZ2RyxHQUFmLENBQVY7O0FBS0FlLElBQUVHLEVBQUYsQ0FBSyxXQUFMLEVBQWtCaEIsSUFBbEI7O0FBRUFhLElBQUVJLElBQUY7QUFDQTtBQS9IK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoicmVzb3VyY2VSZXBhaXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCBQcm9taXNlID0gcmVxdWlyZShcImJsdWViaXJkXCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5cbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxuY29uc3QgUmVzb3VyY2VSZXBhaXJTb3VyY2VzID0gcmVxdWlyZShcIi4uLy4uL2NvbGxlY3Rpb25zL3Rvb2xzL3Jlc291cmNlUmVwYWlyU291cmNlc1wiKTtcbmNvbnN0IFNlcnZlckdyaWQgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL3NlcnZlckdyaWRcIik7XG5jb25zdCBTbWFsbE1vZGFsID0gcmVxdWlyZShcIi4uLy4uLy4uL2xpYi9zbWFsbE1vZGFsXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwicmVzb3VyY2VGaXhcIixcblxuXHR1aToge1xuXHRcdHNhdmVCdXR0b246IFwiI3NhdmVcIixcblx0XHRhbnN3ZXJzOiBcInNlbGVjdC5hbnN3ZXJcIixcblx0XHRncmlkOiBcImRpdi5ncmlkXCIsXG5cblx0XHRmaWx0ZXJCYXI6IFwiLm9wcy1iYXIgLmZpbHRlcnNcIixcblx0XHRjb3VudGVyQmFyOiBcIi5vcHMtYmFyIC5jb3VudGVyXCIsXG5cdFx0cGFnaW5nOiBcImRpdi5wYWdpbmdcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5zYXZlQnV0dG9uXCI6IFwic2F2ZVwiLFxuXHR9LFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL3Rvb2xzL3Jlc291cmNlUmVwYWlyLm51bmpcIiksXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGNvbHVtbnMgPSBbXG5cdFx0XHR7IG5hbWU6IFwiZmlyc3RuYW1lXCIsIGxhYmVsOiBcIkZpcnN0IE5hbWVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwic3VybmFtZVwiLCBsYWJlbDogXCJTdXJuYW1lXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcIl9pZFwiLCBsYWJlbDogXCJJRFwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJ0YXJnZXRcIiwgY2VsbDogU2VydmVyR3JpZC5TZWxlY3RyYUNlbGwuZXh0ZW5kKHtcblx0XHRcdFx0b3B0aW9uczoge1xuXHRcdFx0XHRcdHNlcnZlcjoge1xuXHRcdFx0XHRcdFx0ZmV0Y2g6IGAke3NldHRpbmdzLnVybFJvb3R9L2FwaS8xLjAvdG9vbHMvcmVzb3VyY2VSZXBhaXIvdGFyZ2V0c2AsXG5cdFx0XHRcdFx0XHRkZWxheUxvYWQ6IHRydWUsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0XHRcdHBhZ2VTaXplOiAyMCxcblx0XHRcdFx0XHRcdGluZmluaXRlOiB0cnVlLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0d2lkdGg6IFwiNDAwcHhcIixcblx0XHRcdFx0fSxcblx0XHRcdH0pLCBsYWJlbDogXCJOZXcgUGVyc29uXCIsIGVkaXRhYmxlOiB0cnVlLCBzb3J0YWJsZTogZmFsc2UgfSxcblx0XHRdO1xuXG5cdFx0Y29uc3QgZ3JpZCA9IG5ldyBTZXJ2ZXJHcmlkKHtcblx0XHRcdGVsOiB0aGlzLnVpLmdyaWQsXG5cdFx0XHRjb2x1bW5zOiBjb2x1bW5zLFxuXHRcdFx0Y29sbGVjdGlvbjogbmV3IFJlc291cmNlUmVwYWlyU291cmNlcygpLFxuXHRcdFx0Y291bnRlcjoge1xuXHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLmNvdW50ZXJCYXIsXG5cdFx0XHRcdHRlbXBsYXRlOiBcIlJlY29yZHMgJHN0YXJ0IC0gJGVuZCBvZiAkdG90YWxcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5wYWdpbmcsXG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhncmlkLmNvbGxlY3Rpb24sIFwiY2hhbmdlOnRhcmdldFwiLCB0aGlzLmhhbmRsZUVkaXQuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5UbyhncmlkLmNvbGxlY3Rpb24sIFwic3luY1wiLCB0aGlzLmFwcGx5RWRpdHMuYmluZCh0aGlzKSk7XG5cblx0XHRjb25zdCB0ZXh0RmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJ0ZXh0XCIsXG5cdFx0XHRuYW1lOiBcInRleHRGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlRleHQgU2VhcmNoXCIsXG5cdFx0XHRkZWJvdW5jZTogMjAwLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdH07XG5cblx0XHR0aGlzLnVpLmZpbHRlckJhci5wcmVwZW5kKGdyaWQuZmlsdGVyKHtcblx0XHRcdGZpbHRlckNvbnRhaW5lcjogdGhpcy51aS5maWx0ZXJCYXIsXG5cdFx0XHRmaWx0ZXJzOiBbdGV4dEZpbHRlcl0sXG5cdFx0XHRkZWZhdWx0RmlsdGVyczogW1widGV4dEZpbHRlclwiXSxcblx0XHR9KS5yZW5kZXIoKS5lbCk7XG5cdH0sXG5cblx0aGFuZGxlRWRpdDogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRpZiAoIXRoaXMuZWRpdHMpXG5cdFx0XHR0aGlzLmVkaXRzID0ge307XG5cblx0XHRpZiAobW9kZWwuZ2V0KFwia2V5XCIpKVxuXHRcdFx0dGhpcy5lZGl0c1ttb2RlbC5nZXQoXCJ1c2VyX2lkXCIpXSA9IG1vZGVsLnBpY2soW1widGFyZ2V0XCIsIFwia2V5XCIsIFwidmFsdWVcIl0pO1xuXHRcdGVsc2Vcblx0XHRcdGRlbGV0ZSB0aGlzLmVkaXRzW21vZGVsLmdldChcInVzZXJfaWRcIildO1xuXHR9LFxuXG5cdGFwcGx5RWRpdHM6IGZ1bmN0aW9uKGNvbCkge1xuXHRcdGlmICghdGhpcy5lZGl0cylcblx0XHRcdHJldHVybjtcblxuXHRcdF8uZWFjaChjb2wubW9kZWxzLCB4ID0+IHtcblx0XHRcdGlmICh4LmdldChcInVzZXJfaWRcIikgaW4gdGhpcy5lZGl0cylcblx0XHRcdFx0eC5zZXQodGhpcy5lZGl0c1t4LmdldChcInVzZXJfaWRcIildKTtcblx0XHRcdHgudHJpZ2dlcihcImdyaWQ6cmVuZGVyZWRcIik7XG5cdFx0fSk7XG5cdH0sXG5cblx0c2F2ZTogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0aWYgKCF0aGlzLmVkaXRzIHx8ICFfLmtleXModGhpcy5lZGl0cykubGVuZ3RoKVxuXHRcdFx0cmV0dXJuIGFsZXJ0KFwiTm8gY2hhbmdlcyB0byBzYXZlOyBleGl0aW5nXCIpO1xuXG5cdFx0Y29uc3QgcmVzdCA9ICgpID0+IHtcblx0XHRcdHRoaXMudWkuc2F2ZUJ1dHRvbi5hdHRyKHsgZGlzYWJsZWQ6IHRydWUgfSk7XG5cblx0XHRcdF8uZWFjaCh0aGlzLmVkaXRzLCAoeSwgaykgPT4ge1xuXHRcdFx0XHR0aGlzLmVkaXRzW2tdID0geS50YXJnZXQ7XG5cdFx0XHR9KTtcblxuXHRcdFx0UHJvbWlzZS5yZXNvbHZlKCQucG9zdChzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC90b29scy9yZXNvdXJjZVJlcGFpclwiLCB7IGRhdGE6IHRoaXMuZWRpdHMgfSwgcmVzcCA9PiB7XG5cdFx0XHRcdHRoaXMudWkuc2F2ZUJ1dHRvbi5hdHRyKHsgZGlzYWJsZWQ6IGZhbHNlIH0pO1xuXG5cdFx0XHRcdGlmICghcmVzcC5hY2spXG5cdFx0XHRcdFx0cmV0dXJuIGFsZXJ0KFwiTm8gY2hhbmdlcyBtYWRlXCIpO1xuXG5cdFx0XHRcdGFsZXJ0KFwiQ2hhbmdlcyBzYXZlZFwiKTtcblxuXHRcdFx0XHR0aGlzLmRlc3Ryb3koKTtcblx0XHRcdH0pKS5jYXRjaCgoKSA9PiB7XG5cdFx0XHRcdGFsZXJ0KFwiRXJyb3Igc2F2aW5nIGNoYW5nZXNcIik7XG5cdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0Y29uc3QgbSA9IG5ldyBTbWFsbE1vZGFsKHtcblx0XHRcdHRpdGxlOiBcIjxzcGFuIGNsYXNzPSdmYWwgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUnLz4gQ29uZmlybSBBY3Rpb25cIixcblx0XHRcdGJvZHk6IFwiPHA+VGhpcyBvcGVyYXRpb24gbWFrZXMgaXJyZXZvY2FibGUgY2hhbmdlczsgdGhleSBjYW5ub3QgYmUgdW5kb25lLiBBcmUgeW91IHN1cmU/PC9wPjxwPlwiICsgXy5rZXlzKHRoaXMuZWRpdHMpLmxlbmd0aCArIFwiIHVzZXJzJyBkYXRhIHdpbGwgYmUgY2hhbmdlZC48L3A+XCIsXG5cdFx0fSk7XG5cblx0XHRtLm9uKFwiYnV0dG9uOm9rXCIsIHJlc3QpO1xuXG5cdFx0bS5zaG93KCk7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\n\nvar SmallModal = require(\"../../../lib/smallModal\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"restrictAllStudents\",\n\n\tui: {\n\t\tsaveButton: \"#save\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.saveButton\": \"save\"\n\t},\n\n\ttemplate: require(\"../../templates/tools/restrictAllStudents.nunj\"),\n\n\tsave: function save(evt) {\n\t\tvar _this = this;\n\n\t\tevt.preventDefault();\n\t\tevt.stopPropagation();\n\n\t\tvar rest = function rest() {\n\t\t\t_this.ui.saveButton.attr({ disabled: true });\n\n\t\t\t$.post(settings.urlRoot + \"/api/1.0/tools/restrictAllStudents\", {}, function (resp) {\n\t\t\t\t_this.ui.saveButton.attr({ disabled: false });\n\n\t\t\t\tif (!resp.ack) return alert(\"No changes made\");\n\n\t\t\t\talert(\"Changes saved\");\n\n\t\t\t\t_this.destroy();\n\t\t\t});\n\t\t};\n\n\t\tvar m = new SmallModal({\n\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Confirm Action\",\n\t\t\tbody: \"<p>This operation makes irrevocable changes; they cannot be undone. Are you sure?</p>\"\n\t\t});\n\n\t\tm.on(\"button:ok\", rest);\n\n\t\tm.show();\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJlc3RyaWN0QWxsU3R1ZGVudHMuanMiXSwibmFtZXMiOlsiJCIsInJlcXVpcmUiLCJCYWNrYm9uZSIsInNldHRpbmdzIiwiU21hbGxNb2RhbCIsIm1vZHVsZSIsImV4cG9ydHMiLCJNYXJpb25ldHRlIiwiVmlldyIsImV4dGVuZCIsImNsYXNzTmFtZSIsInVpIiwic2F2ZUJ1dHRvbiIsImV2ZW50cyIsInRlbXBsYXRlIiwic2F2ZSIsImV2dCIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwicmVzdCIsImF0dHIiLCJkaXNhYmxlZCIsInBvc3QiLCJ1cmxSb290IiwicmVzcCIsImFjayIsImFsZXJ0IiwiZGVzdHJveSIsIm0iLCJ0aXRsZSIsImJvZHkiLCJvbiIsInNob3ciXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsV0FBV0QsUUFBUSxVQUFSLENBQWpCOztBQUVBLElBQU1FLFdBQVdGLFFBQVEsY0FBUixDQUFqQjs7QUFFQSxJQUFNRyxhQUFhSCxRQUFRLHlCQUFSLENBQW5COztBQUVBSSxPQUFPQyxPQUFQLEdBQWlCSixTQUFTSyxVQUFULENBQW9CQyxJQUFwQixDQUF5QkMsTUFBekIsQ0FBZ0M7QUFDaERDLFlBQVcscUJBRHFDOztBQUdoREMsS0FBSTtBQUNIQyxjQUFZO0FBRFQsRUFINEM7O0FBT2hEQyxTQUFRO0FBQ1AsMEJBQXdCO0FBRGpCLEVBUHdDOztBQVdoREMsV0FBVWIsUUFBUSxnREFBUixDQVhzQzs7QUFhaERjLE9BQU0sY0FBU0MsR0FBVCxFQUFjO0FBQUE7O0FBQ25CQSxNQUFJQyxjQUFKO0FBQ0FELE1BQUlFLGVBQUo7O0FBRUEsTUFBTUMsT0FBTyxTQUFQQSxJQUFPLEdBQU07QUFDbEIsU0FBS1IsRUFBTCxDQUFRQyxVQUFSLENBQW1CUSxJQUFuQixDQUF3QixFQUFFQyxVQUFVLElBQVosRUFBeEI7O0FBRUFyQixLQUFFc0IsSUFBRixDQUFPbkIsU0FBU29CLE9BQVQsR0FBbUIsb0NBQTFCLEVBQWdFLEVBQWhFLEVBQW9FLGdCQUFRO0FBQzNFLFVBQUtaLEVBQUwsQ0FBUUMsVUFBUixDQUFtQlEsSUFBbkIsQ0FBd0IsRUFBRUMsVUFBVSxLQUFaLEVBQXhCOztBQUVBLFFBQUksQ0FBQ0csS0FBS0MsR0FBVixFQUNDLE9BQU9DLE1BQU0saUJBQU4sQ0FBUDs7QUFFREEsVUFBTSxlQUFOOztBQUVBLFVBQUtDLE9BQUw7QUFDQSxJQVREO0FBVUEsR0FiRDs7QUFlQSxNQUFNQyxJQUFJLElBQUl4QixVQUFKLENBQWU7QUFDeEJ5QixVQUFPLDREQURpQjtBQUV4QkMsU0FBTTtBQUZrQixHQUFmLENBQVY7O0FBS0FGLElBQUVHLEVBQUYsQ0FBSyxXQUFMLEVBQWtCWixJQUFsQjs7QUFFQVMsSUFBRUksSUFBRjtBQUNBO0FBeEMrQyxDQUFoQyxDQUFqQiIsImZpbGUiOiJyZXN0cmljdEFsbFN0dWRlbnRzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IFNtYWxsTW9kYWwgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL3NtYWxsTW9kYWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJyZXN0cmljdEFsbFN0dWRlbnRzXCIsXG5cblx0dWk6IHtcblx0XHRzYXZlQnV0dG9uOiBcIiNzYXZlXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkuc2F2ZUJ1dHRvblwiOiBcInNhdmVcIixcblx0fSxcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy90b29scy9yZXN0cmljdEFsbFN0dWRlbnRzLm51bmpcIiksXG5cblx0c2F2ZTogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0Y29uc3QgcmVzdCA9ICgpID0+IHtcblx0XHRcdHRoaXMudWkuc2F2ZUJ1dHRvbi5hdHRyKHsgZGlzYWJsZWQ6IHRydWUgfSk7XG5cblx0XHRcdCQucG9zdChzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC90b29scy9yZXN0cmljdEFsbFN0dWRlbnRzXCIsIHt9LCByZXNwID0+IHtcblx0XHRcdFx0dGhpcy51aS5zYXZlQnV0dG9uLmF0dHIoeyBkaXNhYmxlZDogZmFsc2UgfSk7XG5cblx0XHRcdFx0aWYgKCFyZXNwLmFjaylcblx0XHRcdFx0XHRyZXR1cm4gYWxlcnQoXCJObyBjaGFuZ2VzIG1hZGVcIik7XG5cblx0XHRcdFx0YWxlcnQoXCJDaGFuZ2VzIHNhdmVkXCIpO1xuXG5cdFx0XHRcdHRoaXMuZGVzdHJveSgpO1xuXHRcdFx0fSk7XG5cdFx0fTtcblxuXHRcdGNvbnN0IG0gPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmFsIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJy8+IENvbmZpcm0gQWN0aW9uXCIsXG5cdFx0XHRib2R5OiBcIjxwPlRoaXMgb3BlcmF0aW9uIG1ha2VzIGlycmV2b2NhYmxlIGNoYW5nZXM7IHRoZXkgY2Fubm90IGJlIHVuZG9uZS4gQXJlIHlvdSBzdXJlPzwvcD5cIixcblx0XHR9KTtcblxuXHRcdG0ub24oXCJidXR0b246b2tcIiwgcmVzdCk7XG5cblx0XHRtLnNob3coKTtcblx0fSxcbn0pOyJdfQ==",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\n\nvar SmallModal = require(\"../../../lib/smallModal\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"restrictSomeStudents\",\n\n\tui: {\n\t\tsaveButton: \"#save\",\n\t\tstudents: \"textarea\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.saveButton\": \"save\"\n\t},\n\n\ttemplate: require(\"../../templates/tools/restrictSomeStudents.nunj\"),\n\n\tsave: function save(evt) {\n\t\tvar _this = this;\n\n\t\tevt.preventDefault();\n\t\tevt.stopPropagation();\n\n\t\tvar rest = function rest() {\n\t\t\t_this.ui.saveButton.attr({ disabled: true });\n\n\t\t\t$.post(settings.urlRoot + \"/api/1.0/tools/restrictSomeStudents\", { data: _this.ui.students.val() }, function (resp) {\n\t\t\t\t_this.ui.saveButton.attr({ disabled: false });\n\n\t\t\t\tif (!resp.ack) return alert(\"No changes made\");\n\n\t\t\t\talert(\"Changes saved\");\n\n\t\t\t\t_this.destroy();\n\t\t\t});\n\t\t};\n\n\t\tvar m = new SmallModal({\n\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Confirm Action\",\n\t\t\tbody: \"<p>This operation makes irrevocable changes; they cannot be undone. Are you sure?</p>\"\n\t\t});\n\n\t\tm.on(\"button:ok\", rest);\n\n\t\tm.show();\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJlc3RyaWN0U29tZVN0dWRlbnRzLmpzIl0sIm5hbWVzIjpbIiQiLCJyZXF1aXJlIiwiQmFja2JvbmUiLCJzZXR0aW5ncyIsIlNtYWxsTW9kYWwiLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJleHRlbmQiLCJjbGFzc05hbWUiLCJ1aSIsInNhdmVCdXR0b24iLCJzdHVkZW50cyIsImV2ZW50cyIsInRlbXBsYXRlIiwic2F2ZSIsImV2dCIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwicmVzdCIsImF0dHIiLCJkaXNhYmxlZCIsInBvc3QiLCJ1cmxSb290IiwiZGF0YSIsInZhbCIsInJlc3AiLCJhY2siLCJhbGVydCIsImRlc3Ryb3kiLCJtIiwidGl0bGUiLCJib2R5Iiwib24iLCJzaG93Il0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLFdBQVdELFFBQVEsVUFBUixDQUFqQjs7QUFFQSxJQUFNRSxXQUFXRixRQUFRLGNBQVIsQ0FBakI7O0FBRUEsSUFBTUcsYUFBYUgsUUFBUSx5QkFBUixDQUFuQjs7QUFFQUksT0FBT0MsT0FBUCxHQUFpQkosU0FBU0ssVUFBVCxDQUFvQkMsSUFBcEIsQ0FBeUJDLE1BQXpCLENBQWdDO0FBQ2hEQyxZQUFXLHNCQURxQzs7QUFHaERDLEtBQUk7QUFDSEMsY0FBWSxPQURUO0FBRUhDLFlBQVU7QUFGUCxFQUg0Qzs7QUFRaERDLFNBQVE7QUFDUCwwQkFBd0I7QUFEakIsRUFSd0M7O0FBWWhEQyxXQUFVZCxRQUFRLGlEQUFSLENBWnNDOztBQWNoRGUsT0FBTSxjQUFTQyxHQUFULEVBQWM7QUFBQTs7QUFDbkJBLE1BQUlDLGNBQUo7QUFDQUQsTUFBSUUsZUFBSjs7QUFFQSxNQUFNQyxPQUFPLFNBQVBBLElBQU8sR0FBTTtBQUNsQixTQUFLVCxFQUFMLENBQVFDLFVBQVIsQ0FBbUJTLElBQW5CLENBQXdCLEVBQUVDLFVBQVUsSUFBWixFQUF4Qjs7QUFFQXRCLEtBQUV1QixJQUFGLENBQU9wQixTQUFTcUIsT0FBVCxHQUFtQixxQ0FBMUIsRUFBaUUsRUFBRUMsTUFBTSxNQUFLZCxFQUFMLENBQVFFLFFBQVIsQ0FBaUJhLEdBQWpCLEVBQVIsRUFBakUsRUFBbUcsZ0JBQVE7QUFDMUcsVUFBS2YsRUFBTCxDQUFRQyxVQUFSLENBQW1CUyxJQUFuQixDQUF3QixFQUFFQyxVQUFVLEtBQVosRUFBeEI7O0FBRUEsUUFBSSxDQUFDSyxLQUFLQyxHQUFWLEVBQ0MsT0FBT0MsTUFBTSxpQkFBTixDQUFQOztBQUVEQSxVQUFNLGVBQU47O0FBRUEsVUFBS0MsT0FBTDtBQUNBLElBVEQ7QUFVQSxHQWJEOztBQWVBLE1BQU1DLElBQUksSUFBSTNCLFVBQUosQ0FBZTtBQUN4QjRCLFVBQU8sNERBRGlCO0FBRXhCQyxTQUFNO0FBRmtCLEdBQWYsQ0FBVjs7QUFLQUYsSUFBRUcsRUFBRixDQUFLLFdBQUwsRUFBa0JkLElBQWxCOztBQUVBVyxJQUFFSSxJQUFGO0FBQ0E7QUF6QytDLENBQWhDLENBQWpCIiwiZmlsZSI6InJlc3RyaWN0U29tZVN0dWRlbnRzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IFNtYWxsTW9kYWwgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL3NtYWxsTW9kYWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJyZXN0cmljdFNvbWVTdHVkZW50c1wiLFxuXG5cdHVpOiB7XG5cdFx0c2F2ZUJ1dHRvbjogXCIjc2F2ZVwiLFxuXHRcdHN0dWRlbnRzOiBcInRleHRhcmVhXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkuc2F2ZUJ1dHRvblwiOiBcInNhdmVcIixcblx0fSxcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy90b29scy9yZXN0cmljdFNvbWVTdHVkZW50cy5udW5qXCIpLFxuXG5cdHNhdmU6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGNvbnN0IHJlc3QgPSAoKSA9PiB7XG5cdFx0XHR0aGlzLnVpLnNhdmVCdXR0b24uYXR0cih7IGRpc2FibGVkOiB0cnVlIH0pO1xuXG5cdFx0XHQkLnBvc3Qoc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvdG9vbHMvcmVzdHJpY3RTb21lU3R1ZGVudHNcIiwgeyBkYXRhOiB0aGlzLnVpLnN0dWRlbnRzLnZhbCgpIH0sIHJlc3AgPT4ge1xuXHRcdFx0XHR0aGlzLnVpLnNhdmVCdXR0b24uYXR0cih7IGRpc2FibGVkOiBmYWxzZSB9KTtcblxuXHRcdFx0XHRpZiAoIXJlc3AuYWNrKVxuXHRcdFx0XHRcdHJldHVybiBhbGVydChcIk5vIGNoYW5nZXMgbWFkZVwiKTtcblxuXHRcdFx0XHRhbGVydChcIkNoYW5nZXMgc2F2ZWRcIik7XG5cblx0XHRcdFx0dGhpcy5kZXN0cm95KCk7XG5cdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0Y29uc3QgbSA9IG5ldyBTbWFsbE1vZGFsKHtcblx0XHRcdHRpdGxlOiBcIjxzcGFuIGNsYXNzPSdmYWwgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUnLz4gQ29uZmlybSBBY3Rpb25cIixcblx0XHRcdGJvZHk6IFwiPHA+VGhpcyBvcGVyYXRpb24gbWFrZXMgaXJyZXZvY2FibGUgY2hhbmdlczsgdGhleSBjYW5ub3QgYmUgdW5kb25lLiBBcmUgeW91IHN1cmU/PC9wPlwiLFxuXHRcdH0pO1xuXG5cdFx0bS5vbihcImJ1dHRvbjpva1wiLCByZXN0KTtcblxuXHRcdG0uc2hvdygpO1xuXHR9LFxufSk7Il19",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar Backbone = require(\"backbone\");\nvar Promise = require(\"bluebird\");\n\nvar settings = require(\"app-settings\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"synchroniseTranches\",\n\n\tui: {\n\t\tsaveButton: \"#save\",\n\t\tanswers: \"select.answer\",\n\t\tgrid: \"div.grid\",\n\n\t\tfilterBar: \".ops-bar .filters\",\n\t\tcounterBar: \".ops-bar .counter\",\n\t\tpaging: \"div.paging\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.saveButton\": \"save\"\n\t},\n\n\ttemplate: require(\"../../templates/tools/synchroniseTranches.nunj\"),\n\n\tsave: function save(evt) {\n\t\tvar _this = this;\n\n\t\tevt.preventDefault();\n\t\tevt.stopPropagation();\n\n\t\tthis.ui.saveButton.attr({ disabled: true });\n\n\t\tPromise.resolve($.get(settings.urlRoot + \"/api/1.0/tools/synchroniseTranches\", function () {\n\t\t\t_this.ui.saveButton.attr({ disabled: false });\n\n\t\t\talert(\"Finished executing\");\n\n\t\t\t_this.destroy();\n\t\t})).catch(function () {\n\t\t\talert(\"Execution error\");\n\t\t});\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN5bmNocm9uaXNlVHJhbmNoZXMuanMiXSwibmFtZXMiOlsiJCIsInJlcXVpcmUiLCJCYWNrYm9uZSIsIlByb21pc2UiLCJzZXR0aW5ncyIsIm1vZHVsZSIsImV4cG9ydHMiLCJNYXJpb25ldHRlIiwiVmlldyIsImV4dGVuZCIsImNsYXNzTmFtZSIsInVpIiwic2F2ZUJ1dHRvbiIsImFuc3dlcnMiLCJncmlkIiwiZmlsdGVyQmFyIiwiY291bnRlckJhciIsInBhZ2luZyIsImV2ZW50cyIsInRlbXBsYXRlIiwic2F2ZSIsImV2dCIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwiYXR0ciIsImRpc2FibGVkIiwicmVzb2x2ZSIsImdldCIsInVybFJvb3QiLCJhbGVydCIsImRlc3Ryb3kiLCJjYXRjaCJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsSUFBSUMsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNQyxXQUFXRCxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNRSxVQUFVRixRQUFRLFVBQVIsQ0FBaEI7O0FBRUEsSUFBTUcsV0FBV0gsUUFBUSxjQUFSLENBQWpCOztBQUVBSSxPQUFPQyxPQUFQLEdBQWlCSixTQUFTSyxVQUFULENBQW9CQyxJQUFwQixDQUF5QkMsTUFBekIsQ0FBZ0M7QUFDaERDLFlBQVcscUJBRHFDOztBQUdoREMsS0FBSTtBQUNIQyxjQUFZLE9BRFQ7QUFFSEMsV0FBUyxlQUZOO0FBR0hDLFFBQU0sVUFISDs7QUFLSEMsYUFBVyxtQkFMUjtBQU1IQyxjQUFZLG1CQU5UO0FBT0hDLFVBQVE7QUFQTCxFQUg0Qzs7QUFhaERDLFNBQVE7QUFDUCwwQkFBd0I7QUFEakIsRUFid0M7O0FBaUJoREMsV0FBVWxCLFFBQVEsZ0RBQVIsQ0FqQnNDOztBQW1CaERtQixPQUFNLGNBQVNDLEdBQVQsRUFBYztBQUFBOztBQUNuQkEsTUFBSUMsY0FBSjtBQUNBRCxNQUFJRSxlQUFKOztBQUVBLE9BQUtaLEVBQUwsQ0FBUUMsVUFBUixDQUFtQlksSUFBbkIsQ0FBd0IsRUFBRUMsVUFBVSxJQUFaLEVBQXhCOztBQUVBdEIsVUFBUXVCLE9BQVIsQ0FBZ0IxQixFQUFFMkIsR0FBRixDQUFNdkIsU0FBU3dCLE9BQVQsR0FBbUIsb0NBQXpCLEVBQStELFlBQU07QUFDcEYsU0FBS2pCLEVBQUwsQ0FBUUMsVUFBUixDQUFtQlksSUFBbkIsQ0FBd0IsRUFBRUMsVUFBVSxLQUFaLEVBQXhCOztBQUVBSSxTQUFNLG9CQUFOOztBQUVBLFNBQUtDLE9BQUw7QUFDQSxHQU5lLENBQWhCLEVBTUlDLEtBTkosQ0FNVSxZQUFNO0FBQ2ZGLFNBQU0saUJBQU47QUFDQSxHQVJEO0FBU0E7QUFsQytDLENBQWhDLENBQWpCIiwiZmlsZSI6InN5bmNocm9uaXNlVHJhbmNoZXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCBQcm9taXNlID0gcmVxdWlyZShcImJsdWViaXJkXCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJzeW5jaHJvbmlzZVRyYW5jaGVzXCIsXG5cblx0dWk6IHtcblx0XHRzYXZlQnV0dG9uOiBcIiNzYXZlXCIsXG5cdFx0YW5zd2VyczogXCJzZWxlY3QuYW5zd2VyXCIsXG5cdFx0Z3JpZDogXCJkaXYuZ3JpZFwiLFxuXG5cdFx0ZmlsdGVyQmFyOiBcIi5vcHMtYmFyIC5maWx0ZXJzXCIsXG5cdFx0Y291bnRlckJhcjogXCIub3BzLWJhciAuY291bnRlclwiLFxuXHRcdHBhZ2luZzogXCJkaXYucGFnaW5nXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkuc2F2ZUJ1dHRvblwiOiBcInNhdmVcIixcblx0fSxcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy90b29scy9zeW5jaHJvbmlzZVRyYW5jaGVzLm51bmpcIiksXG5cblx0c2F2ZTogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0dGhpcy51aS5zYXZlQnV0dG9uLmF0dHIoeyBkaXNhYmxlZDogdHJ1ZSB9KTtcblxuXHRcdFByb21pc2UucmVzb2x2ZSgkLmdldChzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC90b29scy9zeW5jaHJvbmlzZVRyYW5jaGVzXCIsICgpID0+IHtcblx0XHRcdHRoaXMudWkuc2F2ZUJ1dHRvbi5hdHRyKHsgZGlzYWJsZWQ6IGZhbHNlIH0pO1xuXG5cdFx0XHRhbGVydChcIkZpbmlzaGVkIGV4ZWN1dGluZ1wiKTtcblxuXHRcdFx0dGhpcy5kZXN0cm95KCk7XG5cdFx0fSkpLmNhdGNoKCgpID0+IHtcblx0XHRcdGFsZXJ0KFwiRXhlY3V0aW9uIGVycm9yXCIpO1xuXHRcdH0pO1xuXHR9LFxufSk7Il19",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\n\nvar SmallModal = require(\"../../../lib/smallModal\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"unrestrictAllStudents\",\n\n\tui: {\n\t\tsaveButton: \"#save\",\n\t\tstudents: \"textarea\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.saveButton\": \"save\"\n\t},\n\n\ttemplate: require(\"../../templates/tools/unrestrictSomeUsers.nunj\"),\n\n\tsave: function save(evt) {\n\t\tvar _this = this;\n\n\t\tevt.preventDefault();\n\t\tevt.stopPropagation();\n\n\t\tvar rest = function rest() {\n\t\t\t_this.ui.saveButton.attr({ disabled: true });\n\n\t\t\t$.post(settings.urlRoot + \"/api/1.0/tools/unrestrictSomeUsers\", { data: _this.ui.students.val() }, function (resp) {\n\t\t\t\t_this.ui.saveButton.attr({ disabled: false });\n\n\t\t\t\tif (!resp.ack) return alert(\"No changes made\");\n\n\t\t\t\talert(\"Changes saved\");\n\n\t\t\t\t_this.destroy();\n\t\t\t});\n\t\t};\n\n\t\tvar m = new SmallModal({\n\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Confirm Action\",\n\t\t\tbody: \"<p>This operation makes irrevocable changes; they cannot be undone. Are you sure?</p>\"\n\t\t});\n\n\t\tm.on(\"button:ok\", rest);\n\n\t\tm.show();\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInVucmVzdHJpY3RTb21lVXNlcnMuanMiXSwibmFtZXMiOlsiJCIsInJlcXVpcmUiLCJCYWNrYm9uZSIsInNldHRpbmdzIiwiU21hbGxNb2RhbCIsIm1vZHVsZSIsImV4cG9ydHMiLCJNYXJpb25ldHRlIiwiVmlldyIsImV4dGVuZCIsImNsYXNzTmFtZSIsInVpIiwic2F2ZUJ1dHRvbiIsInN0dWRlbnRzIiwiZXZlbnRzIiwidGVtcGxhdGUiLCJzYXZlIiwiZXZ0IiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJyZXN0IiwiYXR0ciIsImRpc2FibGVkIiwicG9zdCIsInVybFJvb3QiLCJkYXRhIiwidmFsIiwicmVzcCIsImFjayIsImFsZXJ0IiwiZGVzdHJveSIsIm0iLCJ0aXRsZSIsImJvZHkiLCJvbiIsInNob3ciXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsV0FBV0QsUUFBUSxVQUFSLENBQWpCOztBQUVBLElBQU1FLFdBQVdGLFFBQVEsY0FBUixDQUFqQjs7QUFFQSxJQUFNRyxhQUFhSCxRQUFRLHlCQUFSLENBQW5COztBQUVBSSxPQUFPQyxPQUFQLEdBQWlCSixTQUFTSyxVQUFULENBQW9CQyxJQUFwQixDQUF5QkMsTUFBekIsQ0FBZ0M7QUFDaERDLFlBQVcsdUJBRHFDOztBQUdoREMsS0FBSTtBQUNIQyxjQUFZLE9BRFQ7QUFFSEMsWUFBVTtBQUZQLEVBSDRDOztBQVFoREMsU0FBUTtBQUNQLDBCQUF3QjtBQURqQixFQVJ3Qzs7QUFZaERDLFdBQVVkLFFBQVEsZ0RBQVIsQ0Fac0M7O0FBY2hEZSxPQUFNLGNBQVNDLEdBQVQsRUFBYztBQUFBOztBQUNuQkEsTUFBSUMsY0FBSjtBQUNBRCxNQUFJRSxlQUFKOztBQUVBLE1BQU1DLE9BQU8sU0FBUEEsSUFBTyxHQUFNO0FBQ2xCLFNBQUtULEVBQUwsQ0FBUUMsVUFBUixDQUFtQlMsSUFBbkIsQ0FBd0IsRUFBRUMsVUFBVSxJQUFaLEVBQXhCOztBQUVBdEIsS0FBRXVCLElBQUYsQ0FBT3BCLFNBQVNxQixPQUFULEdBQW1CLG9DQUExQixFQUFnRSxFQUFFQyxNQUFNLE1BQUtkLEVBQUwsQ0FBUUUsUUFBUixDQUFpQmEsR0FBakIsRUFBUixFQUFoRSxFQUFrRyxnQkFBUTtBQUN6RyxVQUFLZixFQUFMLENBQVFDLFVBQVIsQ0FBbUJTLElBQW5CLENBQXdCLEVBQUVDLFVBQVUsS0FBWixFQUF4Qjs7QUFFQSxRQUFJLENBQUNLLEtBQUtDLEdBQVYsRUFDQyxPQUFPQyxNQUFNLGlCQUFOLENBQVA7O0FBRURBLFVBQU0sZUFBTjs7QUFFQSxVQUFLQyxPQUFMO0FBQ0EsSUFURDtBQVVBLEdBYkQ7O0FBZUEsTUFBTUMsSUFBSSxJQUFJM0IsVUFBSixDQUFlO0FBQ3hCNEIsVUFBTyw0REFEaUI7QUFFeEJDLFNBQU07QUFGa0IsR0FBZixDQUFWOztBQUtBRixJQUFFRyxFQUFGLENBQUssV0FBTCxFQUFrQmQsSUFBbEI7O0FBRUFXLElBQUVJLElBQUY7QUFDQTtBQXpDK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoidW5yZXN0cmljdFNvbWVVc2Vycy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcblxuY29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuXG5jb25zdCBTbWFsbE1vZGFsID0gcmVxdWlyZShcIi4uLy4uLy4uL2xpYi9zbWFsbE1vZGFsXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwidW5yZXN0cmljdEFsbFN0dWRlbnRzXCIsXG5cblx0dWk6IHtcblx0XHRzYXZlQnV0dG9uOiBcIiNzYXZlXCIsXG5cdFx0c3R1ZGVudHM6IFwidGV4dGFyZWFcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5zYXZlQnV0dG9uXCI6IFwic2F2ZVwiLFxuXHR9LFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL3Rvb2xzL3VucmVzdHJpY3RTb21lVXNlcnMubnVualwiKSxcblxuXHRzYXZlOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQucHJldmVudERlZmF1bHQoKTtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRjb25zdCByZXN0ID0gKCkgPT4ge1xuXHRcdFx0dGhpcy51aS5zYXZlQnV0dG9uLmF0dHIoeyBkaXNhYmxlZDogdHJ1ZSB9KTtcblxuXHRcdFx0JC5wb3N0KHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3Rvb2xzL3VucmVzdHJpY3RTb21lVXNlcnNcIiwgeyBkYXRhOiB0aGlzLnVpLnN0dWRlbnRzLnZhbCgpIH0sIHJlc3AgPT4ge1xuXHRcdFx0XHR0aGlzLnVpLnNhdmVCdXR0b24uYXR0cih7IGRpc2FibGVkOiBmYWxzZSB9KTtcblxuXHRcdFx0XHRpZiAoIXJlc3AuYWNrKVxuXHRcdFx0XHRcdHJldHVybiBhbGVydChcIk5vIGNoYW5nZXMgbWFkZVwiKTtcblxuXHRcdFx0XHRhbGVydChcIkNoYW5nZXMgc2F2ZWRcIik7XG5cblx0XHRcdFx0dGhpcy5kZXN0cm95KCk7XG5cdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0Y29uc3QgbSA9IG5ldyBTbWFsbE1vZGFsKHtcblx0XHRcdHRpdGxlOiBcIjxzcGFuIGNsYXNzPSdmYWwgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUnLz4gQ29uZmlybSBBY3Rpb25cIixcblx0XHRcdGJvZHk6IFwiPHA+VGhpcyBvcGVyYXRpb24gbWFrZXMgaXJyZXZvY2FibGUgY2hhbmdlczsgdGhleSBjYW5ub3QgYmUgdW5kb25lLiBBcmUgeW91IHN1cmU/PC9wPlwiLFxuXHRcdH0pO1xuXG5cdFx0bS5vbihcImJ1dHRvbjpva1wiLCByZXN0KTtcblxuXHRcdG0uc2hvdygpO1xuXHR9LFxufSk7Il19",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar Backbone = require(\"backbone\");\nvar Promise = require(\"bluebird\");\nvar _ = require(\"lodash\");\n\nvar settings = require(\"app-settings\");\n\nvar ServerGrid = require(\"../../../lib/serverGrid\");\nvar SmallModal = require(\"../../../lib/smallModal\");\nvar UserContentRepairSources = require(\"../../collections/tools/userContentRepairSources\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"userContentRepair\",\n\n\tui: {\n\t\tsaveButton: \"#save\",\n\t\tanswers: \"select.answer\",\n\t\tgrid: \"div.grid\",\n\n\t\tfilterBar: \".ops-bar .filters\",\n\t\tcounterBar: \".ops-bar .counter\",\n\t\tpaging: \".paging\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.saveButton\": \"save\"\n\t},\n\n\tcollectionEvents: {\n\t\t\"sync reset\": \"updateCounter\"\n\t},\n\n\ttemplate: require(\"../../templates/tools/userContentRepair.nunj\"),\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"firstname\", label: \"First Name\", cell: \"string\", editable: false }, { name: \"surname\", label: \"Surname\", cell: \"string\", editable: false }, { name: \"_id\", label: \"ID\", cell: \"string\", editable: false }, { name: \"target\", cell: ServerGrid.SelectraCell.extend({\n\t\t\t\toptions: {\n\t\t\t\t\tserver: {\n\t\t\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/tools/userContentRepair/targets\",\n\t\t\t\t\t\tdelayLoad: true\n\t\t\t\t\t},\n\t\t\t\t\tpaging: {\n\t\t\t\t\t\tpageSize: 20,\n\t\t\t\t\t\tinfinite: true\n\t\t\t\t\t},\n\t\t\t\t\twidth: \"400px\"\n\t\t\t\t}\n\t\t\t}), label: \"New Person\", editable: true, sortable: false }];\n\n\t\tvar grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new UserContentRepairSources(),\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counterBar,\n\t\t\t\ttemplate: \"Records $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tthis.listenTo(grid.collection, \"change:target\", this.handleEdit.bind(this));\n\t\tthis.listenTo(grid.collection, \"sync\", this.applyEdits.bind(this));\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tthis.ui.filterBar.prepend(grid.filter({\n\t\t\tfilterContainer: this.ui.filterBar,\n\t\t\tfilters: [textFilter],\n\t\t\tdefaultFilters: [\"textFilter\"]\n\t\t}).render().el);\n\t},\n\n\thandleEdit: function handleEdit(model) {\n\t\tif (!this.edits) this.edits = {};\n\n\t\tif (model.get(\"key\")) this.edits[model.get(\"user_id\")] = model.pick([\"target\", \"key\", \"value\"]);else delete this.edits[model.get(\"user_id\")];\n\t},\n\n\tapplyEdits: function applyEdits(col) {\n\t\tvar _this = this;\n\n\t\tif (!this.edits) return;\n\n\t\t_.each(col.models, function (x) {\n\t\t\tif (x.get(\"user_id\") in _this.edits) x.set(_this.edits[x.get(\"user_id\")]);\n\t\t\tx.trigger(\"grid:rendered\");\n\t\t});\n\t},\n\n\tsave: function save(evt) {\n\t\tvar _this2 = this;\n\n\t\tevt.preventDefault();\n\t\tevt.stopPropagation();\n\n\t\tif (!this.edits || !_.keys(this.edits).length) return alert(\"No changes to save; exiting\");\n\n\t\tvar rest = function rest() {\n\t\t\t_this2.ui.saveButton.attr({ disabled: true });\n\n\t\t\t_.each(_this2.edits, function (y, k) {\n\t\t\t\t_this2.edits[k] = y.target;\n\t\t\t});\n\n\t\t\tPromise.resolve($.post(settings.urlRoot + \"/api/1.0/tools/userContentRepair\", { data: _this2.edits }, function (resp) {\n\t\t\t\t_this2.ui.saveButton.attr({ disabled: false });\n\n\t\t\t\tif (!resp.ack) return alert(\"No changes made\");\n\n\t\t\t\talert(\"Changes saved\");\n\n\t\t\t\t_this2.destroy();\n\t\t\t})).catch(function () {\n\t\t\t\talert(\"Error saving changes\");\n\t\t\t});\n\t\t};\n\n\t\tvar m = new SmallModal({\n\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Confirm Action\",\n\t\t\tbody: \"<p>This operation makes irrevocable changes; they cannot be undone. Are you sure?</p><p>\" + _.keys(this.edits).length + \" users' data will be changed.</p>\"\n\t\t});\n\n\t\tm.on(\"button:ok\", rest);\n\n\t\tm.show();\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInVzZXJDb250ZW50UmVwYWlyLmpzIl0sIm5hbWVzIjpbIiQiLCJyZXF1aXJlIiwiQmFja2JvbmUiLCJQcm9taXNlIiwiXyIsInNldHRpbmdzIiwiU2VydmVyR3JpZCIsIlNtYWxsTW9kYWwiLCJVc2VyQ29udGVudFJlcGFpclNvdXJjZXMiLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJleHRlbmQiLCJjbGFzc05hbWUiLCJ1aSIsInNhdmVCdXR0b24iLCJhbnN3ZXJzIiwiZ3JpZCIsImZpbHRlckJhciIsImNvdW50ZXJCYXIiLCJwYWdpbmciLCJldmVudHMiLCJjb2xsZWN0aW9uRXZlbnRzIiwidGVtcGxhdGUiLCJvblJlbmRlciIsImNvbHVtbnMiLCJuYW1lIiwibGFiZWwiLCJjZWxsIiwiZWRpdGFibGUiLCJTZWxlY3RyYUNlbGwiLCJvcHRpb25zIiwic2VydmVyIiwiZmV0Y2giLCJ1cmxSb290IiwiZGVsYXlMb2FkIiwicGFnZVNpemUiLCJpbmZpbml0ZSIsIndpZHRoIiwic29ydGFibGUiLCJlbCIsImNvbGxlY3Rpb24iLCJjb3VudGVyIiwiZWxlbWVudCIsImxpc3RlblRvIiwiaGFuZGxlRWRpdCIsImJpbmQiLCJhcHBseUVkaXRzIiwidGV4dEZpbHRlciIsInR5cGUiLCJkZWJvdW5jZSIsInByZXBlbmQiLCJmaWx0ZXIiLCJmaWx0ZXJDb250YWluZXIiLCJmaWx0ZXJzIiwiZGVmYXVsdEZpbHRlcnMiLCJyZW5kZXIiLCJtb2RlbCIsImVkaXRzIiwiZ2V0IiwicGljayIsImNvbCIsImVhY2giLCJtb2RlbHMiLCJ4Iiwic2V0IiwidHJpZ2dlciIsInNhdmUiLCJldnQiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsImtleXMiLCJsZW5ndGgiLCJhbGVydCIsInJlc3QiLCJhdHRyIiwiZGlzYWJsZWQiLCJ5IiwiayIsInRhcmdldCIsInJlc29sdmUiLCJwb3N0IiwiZGF0YSIsInJlc3AiLCJhY2siLCJkZXN0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Iiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgUHJvbWlzZSA9IHJlcXVpcmUoXCJibHVlYmlyZFwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IFNlcnZlckdyaWQgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL3NlcnZlckdyaWRcIik7XG5jb25zdCBTbWFsbE1vZGFsID0gcmVxdWlyZShcIi4uLy4uLy4uL2xpYi9zbWFsbE1vZGFsXCIpO1xuY29uc3QgVXNlckNvbnRlbnRSZXBhaXJTb3VyY2VzID0gcmVxdWlyZShcIi4uLy4uL2NvbGxlY3Rpb25zL3Rvb2xzL3VzZXJDb250ZW50UmVwYWlyU291cmNlc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInVzZXJDb250ZW50UmVwYWlyXCIsXG5cblx0dWk6IHtcblx0XHRzYXZlQnV0dG9uOiBcIiNzYXZlXCIsXG5cdFx0YW5zd2VyczogXCJzZWxlY3QuYW5zd2VyXCIsXG5cdFx0Z3JpZDogXCJkaXYuZ3JpZFwiLFxuXG5cdFx0ZmlsdGVyQmFyOiBcIi5vcHMtYmFyIC5maWx0ZXJzXCIsXG5cdFx0Y291bnRlckJhcjogXCIub3BzLWJhciAuY291bnRlclwiLFxuXHRcdHBhZ2luZzogXCIucGFnaW5nXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkuc2F2ZUJ1dHRvblwiOiBcInNhdmVcIixcblx0fSxcblxuXHRjb2xsZWN0aW9uRXZlbnRzOiB7XG5cdFx0XCJzeW5jIHJlc2V0XCI6IFwidXBkYXRlQ291bnRlclwiLFxuXHR9LFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL3Rvb2xzL3VzZXJDb250ZW50UmVwYWlyLm51bmpcIiksXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGNvbHVtbnMgPSBbXG5cdFx0XHR7IG5hbWU6IFwiZmlyc3RuYW1lXCIsIGxhYmVsOiBcIkZpcnN0IE5hbWVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwic3VybmFtZVwiLCBsYWJlbDogXCJTdXJuYW1lXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcIl9pZFwiLCBsYWJlbDogXCJJRFwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJ0YXJnZXRcIiwgY2VsbDogU2VydmVyR3JpZC5TZWxlY3RyYUNlbGwuZXh0ZW5kKHtcblx0XHRcdFx0b3B0aW9uczoge1xuXHRcdFx0XHRcdHNlcnZlcjoge1xuXHRcdFx0XHRcdFx0ZmV0Y2g6IGAke3NldHRpbmdzLnVybFJvb3R9L2FwaS8xLjAvdG9vbHMvdXNlckNvbnRlbnRSZXBhaXIvdGFyZ2V0c2AsXG5cdFx0XHRcdFx0XHRkZWxheUxvYWQ6IHRydWUsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0XHRcdHBhZ2VTaXplOiAyMCxcblx0XHRcdFx0XHRcdGluZmluaXRlOiB0cnVlLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0d2lkdGg6IFwiNDAwcHhcIixcblx0XHRcdFx0fSxcblx0XHRcdH0pLCBsYWJlbDogXCJOZXcgUGVyc29uXCIsIGVkaXRhYmxlOiB0cnVlLCBzb3J0YWJsZTogZmFsc2UgfSxcblx0XHRdO1xuXG5cdFx0Y29uc3QgZ3JpZCA9IG5ldyBTZXJ2ZXJHcmlkKHtcblx0XHRcdGVsOiB0aGlzLnVpLmdyaWQsXG5cdFx0XHRjb2x1bW5zOiBjb2x1bW5zLFxuXHRcdFx0Y29sbGVjdGlvbjogbmV3IFVzZXJDb250ZW50UmVwYWlyU291cmNlcygpLFxuXHRcdFx0Y291bnRlcjoge1xuXHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLmNvdW50ZXJCYXIsXG5cdFx0XHRcdHRlbXBsYXRlOiBcIlJlY29yZHMgJHN0YXJ0IC0gJGVuZCBvZiAkdG90YWxcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5wYWdpbmcsXG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhncmlkLmNvbGxlY3Rpb24sIFwiY2hhbmdlOnRhcmdldFwiLCB0aGlzLmhhbmRsZUVkaXQuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5UbyhncmlkLmNvbGxlY3Rpb24sIFwic3luY1wiLCB0aGlzLmFwcGx5RWRpdHMuYmluZCh0aGlzKSk7XG5cblx0XHRjb25zdCB0ZXh0RmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJ0ZXh0XCIsXG5cdFx0XHRuYW1lOiBcInRleHRGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlRleHQgU2VhcmNoXCIsXG5cdFx0XHRkZWJvdW5jZTogMjAwLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdH07XG5cblx0XHR0aGlzLnVpLmZpbHRlckJhci5wcmVwZW5kKGdyaWQuZmlsdGVyKHtcblx0XHRcdGZpbHRlckNvbnRhaW5lcjogdGhpcy51aS5maWx0ZXJCYXIsXG5cdFx0XHRmaWx0ZXJzOiBbdGV4dEZpbHRlcl0sXG5cdFx0XHRkZWZhdWx0RmlsdGVyczogW1widGV4dEZpbHRlclwiXSxcblx0XHR9KS5yZW5kZXIoKS5lbCk7XG5cdH0sXG5cblx0aGFuZGxlRWRpdDogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRpZiAoIXRoaXMuZWRpdHMpXG5cdFx0XHR0aGlzLmVkaXRzID0ge307XG5cblx0XHRpZiAobW9kZWwuZ2V0KFwia2V5XCIpKVxuXHRcdFx0dGhpcy5lZGl0c1ttb2RlbC5nZXQoXCJ1c2VyX2lkXCIpXSA9IG1vZGVsLnBpY2soW1widGFyZ2V0XCIsIFwia2V5XCIsIFwidmFsdWVcIl0pO1xuXHRcdGVsc2Vcblx0XHRcdGRlbGV0ZSB0aGlzLmVkaXRzW21vZGVsLmdldChcInVzZXJfaWRcIildO1xuXHR9LFxuXG5cdGFwcGx5RWRpdHM6IGZ1bmN0aW9uKGNvbCkge1xuXHRcdGlmICghdGhpcy5lZGl0cylcblx0XHRcdHJldHVybjtcblxuXHRcdF8uZWFjaChjb2wubW9kZWxzLCB4ID0+IHtcblx0XHRcdGlmICh4LmdldChcInVzZXJfaWRcIikgaW4gdGhpcy5lZGl0cylcblx0XHRcdFx0eC5zZXQodGhpcy5lZGl0c1t4LmdldChcInVzZXJfaWRcIildKTtcblx0XHRcdHgudHJpZ2dlcihcImdyaWQ6cmVuZGVyZWRcIik7XG5cdFx0fSk7XG5cdH0sXG5cblx0c2F2ZTogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0aWYgKCF0aGlzLmVkaXRzIHx8ICFfLmtleXModGhpcy5lZGl0cykubGVuZ3RoKVxuXHRcdFx0cmV0dXJuIGFsZXJ0KFwiTm8gY2hhbmdlcyB0byBzYXZlOyBleGl0aW5nXCIpO1xuXG5cdFx0Y29uc3QgcmVzdCA9ICgpID0+IHtcblx0XHRcdHRoaXMudWkuc2F2ZUJ1dHRvbi5hdHRyKHsgZGlzYWJsZWQ6IHRydWUgfSk7XG5cblx0XHRcdF8uZWFjaCh0aGlzLmVkaXRzLCAoeSwgaykgPT4ge1xuXHRcdFx0XHR0aGlzLmVkaXRzW2tdID0geS50YXJnZXQ7XG5cdFx0XHR9KTtcblxuXHRcdFx0UHJvbWlzZS5yZXNvbHZlKCQucG9zdChzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC90b29scy91c2VyQ29udGVudFJlcGFpclwiLCB7IGRhdGE6IHRoaXMuZWRpdHMgfSwgcmVzcCA9PiB7XG5cdFx0XHRcdHRoaXMudWkuc2F2ZUJ1dHRvbi5hdHRyKHsgZGlzYWJsZWQ6IGZhbHNlIH0pO1xuXG5cdFx0XHRcdGlmICghcmVzcC5hY2spXG5cdFx0XHRcdFx0cmV0dXJuIGFsZXJ0KFwiTm8gY2hhbmdlcyBtYWRlXCIpO1xuXG5cdFx0XHRcdGFsZXJ0KFwiQ2hhbmdlcyBzYXZlZFwiKTtcblxuXHRcdFx0XHR0aGlzLmRlc3Ryb3koKTtcblx0XHRcdH0pKS5jYXRjaCgoKSA9PiB7XG5cdFx0XHRcdGFsZXJ0KFwiRXJyb3Igc2F2aW5nIGNoYW5nZXNcIik7XG5cdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0Y29uc3QgbSA9IG5ldyBTbWFsbE1vZGFsKHtcblx0XHRcdHRpdGxlOiBcIjxzcGFuIGNsYXNzPSdmYWwgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUnLz4gQ29uZmlybSBBY3Rpb25cIixcblx0XHRcdGJvZHk6IFwiPHA+VGhpcyBvcGVyYXRpb24gbWFrZXMgaXJyZXZvY2FibGUgY2hhbmdlczsgdGhleSBjYW5ub3QgYmUgdW5kb25lLiBBcmUgeW91IHN1cmU/PC9wPjxwPlwiICsgXy5rZXlzKHRoaXMuZWRpdHMpLmxlbmd0aCArIFwiIHVzZXJzJyBkYXRhIHdpbGwgYmUgY2hhbmdlZC48L3A+XCIsXG5cdFx0fSk7XG5cblx0XHRtLm9uKFwiYnV0dG9uOm9rXCIsIHJlc3QpO1xuXG5cdFx0bS5zaG93KCk7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nmodule.exports = {\n\t// Whenever the session check completes\n\tSessionLoaded: \"App.SessionLoaded\",\n\t// When someone logs in successfully\n\tLoginSuccess: \"App.LoginSuccess\",\n\t// When someone logs out successfully\n\tLogoutSuccess: \"App.LogoutSuccess\",\n\tLoginFailure: \"App.LoginFailure\",\n\t// When a logout is close\n\tLogoutWarning: \"App.LogoutWarning\",\n\t// Navigation loaded\n\tNavLoaded: \"App.NavLoaded\",\n\t// When a page sets up a new context for modals\n\tModalContextChange: \"App.ModalContextChange\",\n\n\tWebsocketConnected: \"App.WebsocketConnected\",\n\tWebsocketDisconnected: \"App.WebsocketDisconnected\",\n\tWebsocketMessage: \"App.WebsocketMessage\",\n\n\t// Update the details of the current user in the session\n\tUpdateUserDetails: \"App.UpdateDetails\",\n\n\t// Assessments\n\tAssessmentCacheInvalidated: \"App.AssessmentCacheInvalidated\",\n\n\t// Some content events\n\tResourceCreated: \"App.ResourceCreated\",\n\tResourceUpdated: \"App.ResourceUpdated\",\n\tUnloadBook: \"App.UnloadBook\",\n\n\tCommands: {\n\t\t// Trigger a route\n\t\tNavigate: \"App.Commands.Navigate\",\n\t\tHideSpinner: \"App.Commands.HideSpinner\",\n\t\tShowSpinner: \"App.Commands.ShowSpinner\",\n\t\tLogin: \"App.Commands.Login\",\n\t\tLogout: \"App.Commands.Logout\",\n\n\t\t// A prompt to show when the user tries to navigate away from a page\n\t\tNavigationPrompt: \"App.Commands.NavigationPrompt\",\n\n\t\t// A prompt to show a toast\n\t\tToast: \"App.Commands.Toast\",\n\t\t// Kill any current toast\n\t\tBurnToast: \"App.Commands.BurnToast\"\n\t},\n\n\tRequests: {\n\t\tIsAuthenticated: \"App.Requests.IsAuthenticated\",\n\t\tIsImpersonating: \"App.Requests.IsImpersonating\",\n\t\tCurrentUser: \"App.Requests.CurrentUser\"\n\t}\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV2ZW50cy5qcyJdLCJuYW1lcyI6WyJtb2R1bGUiLCJleHBvcnRzIiwiU2Vzc2lvbkxvYWRlZCIsIkxvZ2luU3VjY2VzcyIsIkxvZ291dFN1Y2Nlc3MiLCJMb2dpbkZhaWx1cmUiLCJMb2dvdXRXYXJuaW5nIiwiTmF2TG9hZGVkIiwiTW9kYWxDb250ZXh0Q2hhbmdlIiwiV2Vic29ja2V0Q29ubmVjdGVkIiwiV2Vic29ja2V0RGlzY29ubmVjdGVkIiwiV2Vic29ja2V0TWVzc2FnZSIsIlVwZGF0ZVVzZXJEZXRhaWxzIiwiQXNzZXNzbWVudENhY2hlSW52YWxpZGF0ZWQiLCJSZXNvdXJjZUNyZWF0ZWQiLCJSZXNvdXJjZVVwZGF0ZWQiLCJVbmxvYWRCb29rIiwiQ29tbWFuZHMiLCJOYXZpZ2F0ZSIsIkhpZGVTcGlubmVyIiwiU2hvd1NwaW5uZXIiLCJMb2dpbiIsIkxvZ291dCIsIk5hdmlnYXRpb25Qcm9tcHQiLCJUb2FzdCIsIkJ1cm5Ub2FzdCIsIlJlcXVlc3RzIiwiSXNBdXRoZW50aWNhdGVkIiwiSXNJbXBlcnNvbmF0aW5nIiwiQ3VycmVudFVzZXIiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBQSxPQUFPQyxPQUFQLEdBQWlCO0FBQ2hCO0FBQ0FDLGdCQUFlLG1CQUZDO0FBR2hCO0FBQ0FDLGVBQWMsa0JBSkU7QUFLaEI7QUFDQUMsZ0JBQWUsbUJBTkM7QUFPaEJDLGVBQWMsa0JBUEU7QUFRaEI7QUFDQUMsZ0JBQWUsbUJBVEM7QUFVaEI7QUFDQUMsWUFBVyxlQVhLO0FBWWhCO0FBQ0FDLHFCQUFvQix3QkFiSjs7QUFlaEJDLHFCQUFvQix3QkFmSjtBQWdCaEJDLHdCQUF1QiwyQkFoQlA7QUFpQmhCQyxtQkFBa0Isc0JBakJGOztBQW1CaEI7QUFDQUMsb0JBQW1CLG1CQXBCSDs7QUFzQmhCO0FBQ0FDLDZCQUE0QixnQ0F2Qlo7O0FBeUJoQjtBQUNBQyxrQkFBaUIscUJBMUJEO0FBMkJoQkMsa0JBQWlCLHFCQTNCRDtBQTRCaEJDLGFBQVksZ0JBNUJJOztBQThCaEJDLFdBQVU7QUFDVDtBQUNBQyxZQUFVLHVCQUZEO0FBR1RDLGVBQWEsMEJBSEo7QUFJVEMsZUFBYSwwQkFKSjtBQUtUQyxTQUFPLG9CQUxFO0FBTVRDLFVBQVEscUJBTkM7O0FBUVQ7QUFDQUMsb0JBQWtCLCtCQVRUOztBQVdUO0FBQ0FDLFNBQU8sb0JBWkU7QUFhVDtBQUNBQyxhQUFXO0FBZEYsRUE5Qk07O0FBK0NoQkMsV0FBVTtBQUNUQyxtQkFBaUIsOEJBRFI7QUFFVEMsbUJBQWlCLDhCQUZSO0FBR1RDLGVBQWE7QUFISjtBQS9DTSxDQUFqQiIsImZpbGUiOiJldmVudHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbm1vZHVsZS5leHBvcnRzID0ge1xuXHQvLyBXaGVuZXZlciB0aGUgc2Vzc2lvbiBjaGVjayBjb21wbGV0ZXNcblx0U2Vzc2lvbkxvYWRlZDogXCJBcHAuU2Vzc2lvbkxvYWRlZFwiLFxuXHQvLyBXaGVuIHNvbWVvbmUgbG9ncyBpbiBzdWNjZXNzZnVsbHlcblx0TG9naW5TdWNjZXNzOiBcIkFwcC5Mb2dpblN1Y2Nlc3NcIixcblx0Ly8gV2hlbiBzb21lb25lIGxvZ3Mgb3V0IHN1Y2Nlc3NmdWxseVxuXHRMb2dvdXRTdWNjZXNzOiBcIkFwcC5Mb2dvdXRTdWNjZXNzXCIsXG5cdExvZ2luRmFpbHVyZTogXCJBcHAuTG9naW5GYWlsdXJlXCIsXG5cdC8vIFdoZW4gYSBsb2dvdXQgaXMgY2xvc2Vcblx0TG9nb3V0V2FybmluZzogXCJBcHAuTG9nb3V0V2FybmluZ1wiLFxuXHQvLyBOYXZpZ2F0aW9uIGxvYWRlZFxuXHROYXZMb2FkZWQ6IFwiQXBwLk5hdkxvYWRlZFwiLFxuXHQvLyBXaGVuIGEgcGFnZSBzZXRzIHVwIGEgbmV3IGNvbnRleHQgZm9yIG1vZGFsc1xuXHRNb2RhbENvbnRleHRDaGFuZ2U6IFwiQXBwLk1vZGFsQ29udGV4dENoYW5nZVwiLFxuXG5cdFdlYnNvY2tldENvbm5lY3RlZDogXCJBcHAuV2Vic29ja2V0Q29ubmVjdGVkXCIsXG5cdFdlYnNvY2tldERpc2Nvbm5lY3RlZDogXCJBcHAuV2Vic29ja2V0RGlzY29ubmVjdGVkXCIsXG5cdFdlYnNvY2tldE1lc3NhZ2U6IFwiQXBwLldlYnNvY2tldE1lc3NhZ2VcIixcblxuXHQvLyBVcGRhdGUgdGhlIGRldGFpbHMgb2YgdGhlIGN1cnJlbnQgdXNlciBpbiB0aGUgc2Vzc2lvblxuXHRVcGRhdGVVc2VyRGV0YWlsczogXCJBcHAuVXBkYXRlRGV0YWlsc1wiLFxuXG5cdC8vIEFzc2Vzc21lbnRzXG5cdEFzc2Vzc21lbnRDYWNoZUludmFsaWRhdGVkOiBcIkFwcC5Bc3Nlc3NtZW50Q2FjaGVJbnZhbGlkYXRlZFwiLFxuXG5cdC8vIFNvbWUgY29udGVudCBldmVudHNcblx0UmVzb3VyY2VDcmVhdGVkOiBcIkFwcC5SZXNvdXJjZUNyZWF0ZWRcIixcblx0UmVzb3VyY2VVcGRhdGVkOiBcIkFwcC5SZXNvdXJjZVVwZGF0ZWRcIixcblx0VW5sb2FkQm9vazogXCJBcHAuVW5sb2FkQm9va1wiLFxuXG5cdENvbW1hbmRzOiB7XG5cdFx0Ly8gVHJpZ2dlciBhIHJvdXRlXG5cdFx0TmF2aWdhdGU6IFwiQXBwLkNvbW1hbmRzLk5hdmlnYXRlXCIsXG5cdFx0SGlkZVNwaW5uZXI6IFwiQXBwLkNvbW1hbmRzLkhpZGVTcGlubmVyXCIsXG5cdFx0U2hvd1NwaW5uZXI6IFwiQXBwLkNvbW1hbmRzLlNob3dTcGlubmVyXCIsXG5cdFx0TG9naW46IFwiQXBwLkNvbW1hbmRzLkxvZ2luXCIsXG5cdFx0TG9nb3V0OiBcIkFwcC5Db21tYW5kcy5Mb2dvdXRcIixcblxuXHRcdC8vIEEgcHJvbXB0IHRvIHNob3cgd2hlbiB0aGUgdXNlciB0cmllcyB0byBuYXZpZ2F0ZSBhd2F5IGZyb20gYSBwYWdlXG5cdFx0TmF2aWdhdGlvblByb21wdDogXCJBcHAuQ29tbWFuZHMuTmF2aWdhdGlvblByb21wdFwiLFxuXG5cdFx0Ly8gQSBwcm9tcHQgdG8gc2hvdyBhIHRvYXN0XG5cdFx0VG9hc3Q6IFwiQXBwLkNvbW1hbmRzLlRvYXN0XCIsXG5cdFx0Ly8gS2lsbCBhbnkgY3VycmVudCB0b2FzdFxuXHRcdEJ1cm5Ub2FzdDogXCJBcHAuQ29tbWFuZHMuQnVyblRvYXN0XCIsXG5cdH0sXG5cblx0UmVxdWVzdHM6IHtcblx0XHRJc0F1dGhlbnRpY2F0ZWQ6IFwiQXBwLlJlcXVlc3RzLklzQXV0aGVudGljYXRlZFwiLFxuXHRcdElzSW1wZXJzb25hdGluZzogXCJBcHAuUmVxdWVzdHMuSXNJbXBlcnNvbmF0aW5nXCIsXG5cdFx0Q3VycmVudFVzZXI6IFwiQXBwLlJlcXVlc3RzLkN1cnJlbnRVc2VyXCIsXG5cdH0sXG59O1xuIl19",
    "\"use strict\";\n// System Initialiser\n//-------------------\n// Kicks off the initialisation of the page\n\nrequire(\"modernizr\");\nrequire(\"../lib/backbacon.js\");\nvar $ = require(\"jquery\");\nvar nunjucks = require(\"nunjucks\");\nvar settings = require(\"app-settings\");\nvar _ = require(\"lodash\");\nvar moment = require(\"moment\");\nvar rester = require(\"rester\");\nvar raygun = require(\"raygun\");\nrequire(\"foundation\");\n\nraygun(\"apiKey\", \"5G5yLPnf8Wl4Z9cK9tY+mw==\");\nraygun(\"filterSensitiveData\", [\"password\"]);\n\nvar beforeSend = function beforeSend(payload) {\n\tif (settings.debug && !settings.reportErrors) return false;\n\n\tvar result = payload;\n\n\tvar ignoredCalls = [{ method: \"GET\", url: /^\\/unity\\/api\\/1.0\\/login\\/session/i }, { method: \"POST\", url: /^\\/unity\\/api\\/1.0\\/users\\/.+?\\/tokens/i }];\n\tignoredCalls.push({ method: \"GET\", url: /^\\/unity\\/acacia\\/epub\\/create\\/.+?/i }, { method: \"POST\", url: /^\\/unity\\/api\\/1.0\\/users/i });\n\tignoredCalls.push({ method: \"GET\", url: /^\\/unity\\/api\\/1.0\\/users\\/.+?\\/impersonate/i }, { method: \"GET\", url: /^\\/unity\\/acacia\\/logs\\/search\\/.+?/i });\n\tignoredCalls.push({ method: \"POST\", url: /^\\/unity\\/api\\/1.0\\/login/i });\n\tignoredCalls.push({ method: \"POST\", url: /^\\/unity\\/api\\/1.0\\/resources/i }, { method: \"PUT\", url: /^\\/unity\\/api\\/1.0\\/groups\\/.+?\\/users\\/.+?/i });\n\tignoredCalls.push({ method: \"PUT\", url: /^\\/unity\\/api\\/1.0\\/groups\\/.+?/i });\n\n\tif (_.includes(result.Details.Error.Message, \"AJAX\") && _.some(ignoredCalls, function (item) {\n\t\treturn result.Details.UserCustomData.url.search(item.url) === 0 && result.Details.UserCustomData.type === item.method;\n\t})) return false;\n\n\t// Replace the _ parameter to make messages group nicely in the UI\n\tresult.Details.Error.Message = result.Details.Error.Message.replace(/&_(=[^&]*)?|_(=[^&]*)?&?/, \"\");\n\n\tif (result.Details.Error.Message[result.Details.Error.Message.length - 1] === \"?\") result.Details.Error.Message = result.Details.Error.Message.slice(0, -1);\n\n\treturn result;\n};\n\nraygun(\"onBeforeSend\", beforeSend);\n\nraygun(\"options\", {\n\tallowInsecureSubmissions: false,\n\tignoreAjaxAbort: true,\n\tignore3rdPartyErrors: true,\n\texcludedHostnames: [\"localhost\", /192\\.168\\..+/, \"127.0.0.1\"],\n\tpulseIgnoreUrlCasing: false,\n\tdisableErrorTracking: false,\n\tdisablePulse: false\n});\n\nvar App = require(\"../index\");\n\n// Set the custom Nunjucks environment, to load filters etc\nnunjucks.env = require(\"../lib/nunjucks-env\");\n\n$(document).ready(function () {\n\t// Test for features before we do anything else\n\tvar available = document.getElementsByTagName(\"html\")[0].className.split(\" \");\n\n\tvar features = [\"csstransitions\", \"cssanimations\", \"flexbox\", \"websockets\", \"history\"];\n\n\tfor (var i = 0; i < features.length; i++) {\n\t\tif (!_.includes(available, features[i])) {\n\t\t\t// Something important is missing\n\t\t\tdocument.getElementsByTagName(\"main\")[0].innerHTML = \"<div class='missing-features'>Your browser does not support all the features required to use this website.<br/><br/>\\n\\t\\t\\t\\tPlease use the latest version of <a target='_new' href='http://www.mozilla.org/firefox'>Firefox</a>, <a target='_new' href='http://www.google.com/chrome'>Chrome</a>,\\n\\t\\t\\t\\t<a target='_new' href='http://www.opera.com'>Opera</a>, <a target='_new' href='http://windows.microsoft.com/en-gb/internet-explorer/download-ie'>Internet Explorer 11</a>,\\n\\t\\t\\t\\tor <a target='_new' href='https://www.microsoft.com/en-gb/windows/microsoft-edge'>Edge</a> (Windows 10).</div>\";\n\n\t\t\tdocument.getElementById(\"loader\").style.display = \"none\";\n\t\t\tvar spinner = document.getElementsByClassName(\"spinner-icon\");\n\t\t\tif (spinner && spinner.style) spinner.style.display = \"none\";\n\t\t\treturn;\n\t\t}\n\t}\n\n\tvar configSuccess = function configSuccess(data) {\n\t\tsettings = _.merge(settings, data);\n\n\t\traygun(\"options\", {\n\t\t\tdisableErrorTracking: settings.debug && !settings.reportErrors,\n\t\t\tdisablePulse: settings.debug\n\t\t});\n\n\t\traygun(\"setVersion\", settings.version.replace(\"-\", \".\"));\n\n\t\t// Initialise rester so that we can use hasAccess() later\n\t\trester.init({\n\t\t\troles: settings.roles,\n\t\t\tpermissions: settings.permissions,\n\t\t\tgrants: settings.grants,\n\t\t\trolePermissions: settings.rolePermissions\n\t\t});\n\n\t\t// Set the custom Nunjucks environment, to load filters etc\n\t\tvar fields = [\"urlRoot\", \"languageList\", \"gradeList\", \"userDataSource\", \"externalSync\", \"bookTokenMode\"];\n\t\tfields.push(\"contentIcons\", \"resourceEditing\", \"enableCustomGroups\", \"officeContent\", \"restrictByDefault\", \"serverName\");\n\t\tfields.push(\"perpetualGroups\", \"apkUploads\", \"inBookFCWidget\", \"debug\", \"enableLearningPaths\", \"learningPathsCustomName\", \"groupsCustomName\");\n\t\tfields.push(\"learningPathsPluralCustomName\", \"groupsPluralCustomName\", \"maxFileSize\");\n\n\t\t_.each(fields, function (item) {\n\t\t\tnunjucks.env.addGlobal(item, settings[item]);\n\t\t});\n\n\t\tvar customNameFields = [\"learningPathsCustomName\", \"learningPathsPluralCustomName\", \"groupsCustomName\", \"groupsPluralCustomName\"];\n\t\tvar customNames = [];\n\t\t_.each(customNameFields, function (item) {\n\t\t\tcustomNames[item] = settings[item];\n\t\t});\n\t\tnunjucks.env.addGlobal(\"customNames\", customNames);\n\n\t\tnunjucks.env.addGlobal(\"permissions\", rester.p);\n\t\tnunjucks.env.addGlobal(\"grantList\", rester.g);\n\t\tnunjucks.env.addGlobal(\"copyrightYear\", moment().year());\n\n\t\t// Session tracker\n\t\tApp.Session = require(\"./session\")(App);\n\n\t\t// Current year calculator\n\t\t// Options: unix, end\n\t\tApp.currentYear = function () {\n\t\t\tvar options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n\t\t\tif (moment().month() >= settings.yearStart) {\n\t\t\t\tif (!options.unix) return moment().year();\n\n\t\t\t\tvar _ret = moment().month(settings.yearStart);\n\t\t\t\tif (options.end) {\n\t\t\t\t\tif (settings.yearStart > 0) _ret = _ret.year(moment().year() + 1);\n\t\t\t\t\treturn _ret.endOf(\"month\").unix();\n\t\t\t\t}\n\n\t\t\t\treturn _ret.startOf(\"month\").unix();\n\t\t\t}\n\n\t\t\tif (!options.unix) return moment().year() - 1;\n\n\t\t\tvar ret = moment().month(settings.yearStart).year(moment().year() - 1);\n\t\t\tif (options.end) {\n\t\t\t\tif (settings.yearStart > 0) ret = ret.year(moment().year() + 1);\n\t\t\t\treturn ret.endOf(\"month\").unix();\n\t\t\t}\n\n\t\t\treturn ret.startOf(\"month\").unix();\n\t\t};\n\n\t\tApp.start(App);\n\n\t\t$(\"body\").foundation();\n\t};\n\n\tvar configError = function configError() {\n\t\twindow.alert(\"There was an error loading required data from the server. Please try again.\");\n\t};\n\n\t// Fetch some server-side settings\n\tvar urlPieces = window.location.href.split(\"/\");\n\n\tvar redir = false;\n\n\twhile (!urlPieces[3]) {\n\t\tredir = true;\n\t\turlPieces.splice(3, 1);\n\t}\n\n\tif (redir) {\n\t\twindow.location.href = urlPieces[3] && _.includes([\"unity2\", \"unity\", \"alchemy\", \"educator\"], urlPieces[3]) ? \"/\" + urlPieces[3] : \"\";\n\t\treturn;\n\t}\n\n\t$.ajax({\n\t\tdataType: \"json\",\n\t\turl: (urlPieces[3] && _.includes([\"unity2\", \"unity\", \"alchemy\", \"educator\"], urlPieces[3]) ? \"/\" + urlPieces[3] : \"\") + \"/api/1.0/features/config\",\n\t\tsuccess: configSuccess,\n\t\terror: configError,\n\t\tuncancellable: true\n\t});\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbInJlcXVpcmUiLCIkIiwibnVuanVja3MiLCJzZXR0aW5ncyIsIl8iLCJtb21lbnQiLCJyZXN0ZXIiLCJyYXlndW4iLCJiZWZvcmVTZW5kIiwicGF5bG9hZCIsImRlYnVnIiwicmVwb3J0RXJyb3JzIiwicmVzdWx0IiwiaWdub3JlZENhbGxzIiwibWV0aG9kIiwidXJsIiwicHVzaCIsImluY2x1ZGVzIiwiRGV0YWlscyIsIkVycm9yIiwiTWVzc2FnZSIsInNvbWUiLCJVc2VyQ3VzdG9tRGF0YSIsInNlYXJjaCIsIml0ZW0iLCJ0eXBlIiwicmVwbGFjZSIsImxlbmd0aCIsInNsaWNlIiwiYWxsb3dJbnNlY3VyZVN1Ym1pc3Npb25zIiwiaWdub3JlQWpheEFib3J0IiwiaWdub3JlM3JkUGFydHlFcnJvcnMiLCJleGNsdWRlZEhvc3RuYW1lcyIsInB1bHNlSWdub3JlVXJsQ2FzaW5nIiwiZGlzYWJsZUVycm9yVHJhY2tpbmciLCJkaXNhYmxlUHVsc2UiLCJBcHAiLCJlbnYiLCJkb2N1bWVudCIsInJlYWR5IiwiYXZhaWxhYmxlIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJjbGFzc05hbWUiLCJzcGxpdCIsImZlYXR1cmVzIiwiaSIsImlubmVySFRNTCIsImdldEVsZW1lbnRCeUlkIiwic3R5bGUiLCJkaXNwbGF5Iiwic3Bpbm5lciIsImdldEVsZW1lbnRzQnlDbGFzc05hbWUiLCJjb25maWdTdWNjZXNzIiwiZGF0YSIsIm1lcmdlIiwidmVyc2lvbiIsImluaXQiLCJyb2xlcyIsInBlcm1pc3Npb25zIiwiZ3JhbnRzIiwicm9sZVBlcm1pc3Npb25zIiwiZmllbGRzIiwiZWFjaCIsImFkZEdsb2JhbCIsImN1c3RvbU5hbWVGaWVsZHMiLCJjdXN0b21OYW1lcyIsInAiLCJnIiwieWVhciIsIlNlc3Npb24iLCJjdXJyZW50WWVhciIsIm9wdGlvbnMiLCJtb250aCIsInllYXJTdGFydCIsInVuaXgiLCJyZXQiLCJlbmQiLCJlbmRPZiIsInN0YXJ0T2YiLCJzdGFydCIsImZvdW5kYXRpb24iLCJjb25maWdFcnJvciIsIndpbmRvdyIsImFsZXJ0IiwidXJsUGllY2VzIiwibG9jYXRpb24iLCJocmVmIiwicmVkaXIiLCJzcGxpY2UiLCJhamF4IiwiZGF0YVR5cGUiLCJzdWNjZXNzIiwiZXJyb3IiLCJ1bmNhbmNlbGxhYmxlIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQUEsUUFBUSxXQUFSO0FBQ0FBLFFBQVEscUJBQVI7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1FLFdBQVdGLFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQUlHLFdBQVdILFFBQVEsY0FBUixDQUFmO0FBQ0EsSUFBTUksSUFBSUosUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNSyxTQUFTTCxRQUFRLFFBQVIsQ0FBZjtBQUNBLElBQU1NLFNBQVNOLFFBQVEsUUFBUixDQUFmO0FBQ0EsSUFBTU8sU0FBU1AsUUFBUSxRQUFSLENBQWY7QUFDQUEsUUFBUSxZQUFSOztBQUVBTyxPQUFPLFFBQVAsRUFBaUIsMEJBQWpCO0FBQ0FBLE9BQU8scUJBQVAsRUFBOEIsQ0FBQyxVQUFELENBQTlCOztBQUVBLElBQU1DLGFBQWEsU0FBYkEsVUFBYSxDQUFTQyxPQUFULEVBQWtCO0FBQ3BDLEtBQUlOLFNBQVNPLEtBQVQsSUFBa0IsQ0FBQ1AsU0FBU1EsWUFBaEMsRUFDQyxPQUFPLEtBQVA7O0FBRUQsS0FBTUMsU0FBU0gsT0FBZjs7QUFFQSxLQUFNSSxlQUFlLENBQUMsRUFBRUMsUUFBUSxLQUFWLEVBQWlCQyxLQUFLLHFDQUF0QixFQUFELEVBQWdFLEVBQUVELFFBQVEsTUFBVixFQUFrQkMsS0FBSyx5Q0FBdkIsRUFBaEUsQ0FBckI7QUFDQUYsY0FBYUcsSUFBYixDQUFrQixFQUFFRixRQUFRLEtBQVYsRUFBaUJDLEtBQUssc0NBQXRCLEVBQWxCLEVBQWtGLEVBQUVELFFBQVEsTUFBVixFQUFrQkMsS0FBSyw0QkFBdkIsRUFBbEY7QUFD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QTJCLEdBQTNCLENBQWxCOztBQUVBLEtBQUk0QyxRQUFRLEtBQVo7O0FBRUEsUUFBTSxDQUFDSCxVQUFVLENBQVYsQ0FBUCxFQUFxQjtBQUNwQkcsVUFBUSxJQUFSO0FBQ0FILFlBQVVJLE1BQVYsQ0FBaUIsQ0FBakIsRUFBb0IsQ0FBcEI7QUFDQTs7QUFFRCxLQUFJRCxLQUFKLEVBQVc7QUFDVkwsU0FBT0csUUFBUCxDQUFnQkMsSUFBaEIsR0FBdUJGLFVBQVUsQ0FBVixLQUFnQmhGLEVBQUVhLFFBQUYsQ0FBVyxDQUFDLFFBQUQsRUFBVyxPQUFYLEVBQW9CLFNBQXBCLEVBQStCLFVBQS9CLENBQVgsRUFBdURtRSxVQUFVLENBQVYsQ0FBdkQsQ0FBaEIsR0FBdUYsTUFBTUEsVUFBVSxDQUFWLENBQTdGLEdBQTRHLEVBQW5JO0FBQ0E7QUFDQTs7QUFFRG5GLEdBQUV3RixJQUFGLENBQU87QUFDTkMsWUFBVSxNQURKO0FBRU4zRSxPQUFLLENBQUNxRSxVQUFVLENBQVYsS0FBZ0JoRixFQUFFYSxRQUFGLENBQVcsQ0FBQyxRQUFELEVBQVcsT0FBWCxFQUFvQixTQUFwQixFQUErQixVQUEvQixDQUFYLEVBQXVEbUUsVUFBVSxDQUFWLENBQXZELENBQWhCLEdBQXVGLE1BQU1BLFVBQVUsQ0FBVixDQUE3RixHQUE0RyxFQUE3RyxJQUFtSCwwQkFGbEg7QUFHTk8sV0FBU3ZDLGFBSEg7QUFJTndDLFNBQU9YLFdBSkQ7QUFLTlksaUJBQWU7QUFMVCxFQUFQO0FBT0EsQ0E3SEQiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbi8vIFN5c3RlbSBJbml0aWFsaXNlclxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBLaWNrcyBvZmYgdGhlIGluaXRpYWxpc2F0aW9uIG9mIHRoZSBwYWdlXG5cbnJlcXVpcmUoXCJtb2Rlcm5penJcIik7XG5yZXF1aXJlKFwiLi4vbGliL2JhY2tiYWNvbi5qc1wiKTtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgbnVuanVja3MgPSByZXF1aXJlKFwibnVuanVja3NcIik7XG5sZXQgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBtb21lbnQgPSByZXF1aXJlKFwibW9tZW50XCIpO1xuY29uc3QgcmVzdGVyID0gcmVxdWlyZShcInJlc3RlclwiKTtcbmNvbnN0IHJheWd1biA9IHJlcXVpcmUoXCJyYXlndW5cIik7XG5yZXF1aXJlKFwiZm91bmRhdGlvblwiKTtcblxucmF5Z3VuKFwiYXBpS2V5XCIsIFwiNUc1eUxQbmY4V2w0WjljSzl0WSttdz09XCIpO1xucmF5Z3VuKFwiZmlsdGVyU2Vuc2l0aXZlRGF0YVwiLCBbXCJwYXNzd29yZFwiXSk7XG5cbmNvbnN0IGJlZm9yZVNlbmQgPSBmdW5jdGlvbihwYXlsb2FkKSB7XG5cdGlmIChzZXR0aW5ncy5kZWJ1ZyAmJiAhc2V0dGluZ3MucmVwb3J0RXJyb3JzKVxuXHRcdHJldHVybiBmYWxzZTtcblxuXHRjb25zdCByZXN1bHQgPSBwYXlsb2FkO1xuXG5cdGNvbnN0IGlnbm9yZWRDYWxscyA9IFt7IG1ldGhvZDogXCJHRVRcIiwgdXJsOiAvXlxcL3VuaXR5XFwvYXBpXFwvMS4wXFwvbG9naW5cXC9zZXNzaW9uL2kgfSwgeyBtZXRob2Q6IFwiUE9TVFwiLCB1cmw6IC9eXFwvdW5pdHlcXC9hcGlcXC8xLjBcXC91c2Vyc1xcLy4rP1xcL3Rva2Vucy9pIH1dO1xuXHRpZ25vcmVkQ2FsbHMucHVzaCh7IG1ldGhvZDogXCJHRVRcIiwgdXJsOiAvXlxcL3VuaXR5XFwvYWNhY2lhXFwvZXB1YlxcL2NyZWF0ZVxcLy4rPy9pIH0sIHsgbWV0aG9kOiBcIlBPU1RcIiwgdXJsOiAvXlxcL3VuaXR5XFwvYXBpXFwvMS4wXFwvdXNlcnMvaSB9KTtcblx0aWdub3JlZENhbGxzLnB1c2goeyBtZXRob2Q6IFwiR0VUXCIsIHVybDogL15cXC91bml0eVxcL2FwaVxcLzEuMFxcL3VzZXJzXFwvLis/XFwvaW1wZXJzb25hdGUvaSB9LCB7IG1ldGhvZDogXCJHRVRcIiwgdXJsOiAvXlxcL3VuaXR5XFwvYWNhY2lhXFwvbG9nc1xcL3NlYXJjaFxcLy4rPy9pIH0pO1xuXHRpZ25vcmVkQ2FsbHMucHVzaCh7IG1ldGhvZDogXCJQT1NUXCIsIHVybDogL15cXC91bml0eVxcL2FwaVxcLzEuMFxcL2xvZ2luL2kgfSk7XG5cdGlnbm9yZWRDYWxscy5wdXNoKHsgbWV0aG9kOiBcIlBPU1RcIiwgdXJsOiAvXlxcL3VuaXR5XFwvYXBpXFwvMS4wXFwvcmVzb3VyY2VzL2kgfSwgeyBtZXRob2Q6IFwiUFVUXCIsIHVybDogL15cXC91bml0eVxcL2FwaVxcLzEuMFxcL2dyb3Vwc1xcLy4rP1xcL3VzZXJzXFwvLis/L2kgfSk7XG5cdGlnbm9yZWRDYWxscy5wdXNoKHsgbWV0aG9kOiBcIlBVVFwiLCB1cmw6IC9eXFwvdW5pdHlcXC9hcGlcXC8xLjBcXC9ncm91cHNcXC8uKz8vaSB9KTtcblxuXHRpZiAoXy5pbmNsdWRlcyhyZXN1bHQuRGV0YWlscy5FcnJvci5NZXNzYWdlLCBcIkFKQVhcIikgJiZcblx0XHRfLnNvbWUoaWdub3JlZENhbGxzLCBpdGVtID0+IHJlc3VsdC5EZXRhaWxzLlVzZXJDdXN0b21EYXRhLnVybC5zZWFyY2goaXRlbS51cmwpID09PSAwICYmIHJlc3VsdC5EZXRhaWxzLlVzZXJDdXN0b21EYXRhLnR5cGUgPT09IGl0ZW0ubWV0aG9kKSlcblx0XHRyZXR1cm4gZmFsc2U7XG5cblx0Ly8gUmVwbGFjZSB0aGUgXyBwYXJhbWV0ZXIgdG8gbWFrZSBtZXNzYWdlcyBncm91cCBuaWNlbHkgaW4gdGhlIFVJXG5cdHJlc3VsdC5EZXRhaWxzLkVycm9yLk1lc3NhZ2UgPSByZXN1bHQuRGV0YWlscy5FcnJvci5NZXNzYWdlLnJlcGxhY2UoLyZfKD1bXiZdKik/fF8oPVteJl0qKT8mPy8sIFwiXCIpO1xuXG5cdGlmIChyZXN1bHQuRGV0YWlscy5FcnJvci5NZXNzYWdlW3Jlc3VsdC5EZXRhaWxzLkVycm9yLk1lc3NhZ2UubGVuZ3RoIC0gMV0gPT09IFwiP1wiKVxuXHRcdHJlc3VsdC5EZXRhaWxzLkVycm9yLk1lc3NhZ2UgPSByZXN1bHQuRGV0YWlscy5FcnJvci5NZXNzYWdlLnNsaWNlKDAsIC0xKTtcblxuXHRyZXR1cm4gcmVzdWx0O1xufTtcblxucmF5Z3VuKFwib25CZWZvcmVTZW5kXCIsIGJlZm9yZVNlbmQpO1xuXG5yYXlndW4oXCJvcHRpb25zXCIsIHtcblx0YWxsb3dJbnNlY3VyZVN1Ym1pc3Npb25zOiBmYWxzZSxcblx0aWdub3JlQWpheEFib3J0OiB0cnVlLFxuXHRpZ25vcmUzcmRQYXJ0eUVycm9yczogdHJ1ZSxcblx0ZXhjbHVkZWRIb3N0bmFtZXM6IFtcImxvY2FsaG9zdFwiLCAvMTkyXFwuMTY4XFwuLisvLCBcIjEyNy4wLjAuMVwiXSxcblx0cHVsc2VJZ25vcmVVcmxDYXNpbmc6IGZhbHNlLFxuXHRkaXNhYmxlRXJyb3JUcmFja2luZzogZmFsc2UsXG5cdGRpc2FibGVQdWxzZTogZmFsc2UsXG59KTtcblxuY29uc3QgQXBwID0gcmVxdWlyZShcIi4uL2luZGV4XCIpO1xuXG4vLyBTZXQgdGhlIGN1c3RvbSBOdW5qdWNrcyBlbnZpcm9ubWVudCwgdG8gbG9hZCBmaWx0ZXJzIGV0Y1xubnVuanVja3MuZW52ID0gcmVxdWlyZShcIi4uL2xpYi9udW5qdWNrcy1lbnZcIik7XG5cbiQoZG9jdW1lbnQpLnJlYWR5KCgpID0+IHtcblx0Ly8gVGVzdCBmb3IgZmVhdHVyZXMgYmVmb3JlIHdlIGRvIGFueXRoaW5nIGVsc2Vcblx0Y29uc3QgYXZhaWxhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJodG1sXCIpWzBdLmNsYXNzTmFtZS5zcGxpdChcIiBcIik7XG5cblx0Y29uc3QgZmVhdHVyZXMgPSBbXCJjc3N0cmFuc2l0aW9uc1wiLCBcImNzc2FuaW1hdGlvbnNcIiwgXCJmbGV4Ym94XCIsIFwid2Vic29ja2V0c1wiLCBcImhpc3RvcnlcIl07XG5cblx0Zm9yKGxldCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKCFfLmluY2x1ZGVzKGF2YWlsYWJsZSwgZmVhdHVyZXNbaV0pKSB7XG5cdFx0XHQvLyBTb21ldGhpbmcgaW1wb3J0YW50IGlzIG1pc3Npbmdcblx0XHRcdGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwibWFpblwiKVswXS5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz0nbWlzc2luZy1mZWF0dXJlcyc+WW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgYWxsIHRoZSBmZWF0dXJlcyByZXF1aXJlZCB0byB1c2UgdGhpcyB3ZWJzaXRlLjxici8+PGJyLz5cblx0XHRcdFx0UGxlYXNlIHVzZSB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgPGEgdGFyZ2V0PSdfbmV3JyBocmVmPSdodHRwOi8vd3d3Lm1vemlsbGEub3JnL2ZpcmVmb3gnPkZpcmVmb3g8L2E+LCA8YSB0YXJnZXQ9J19uZXcnIGhyZWY9J2h0dHA6Ly93d3cuZ29vZ2xlLmNvbS9jaHJvbWUnPkNocm9tZTwvYT4sXG5cdFx0XHRcdDxhIHRhcmdldD0nX25ldycgaHJlZj0naHR0cDovL3d3dy5vcGVyYS5jb20nPk9wZXJhPC9hPiwgPGEgdGFyZ2V0PSdfbmV3JyBocmVmPSdodHRwOi8vd2luZG93cy5taWNyb3NvZnQuY29tL2VuLWdiL2ludGVybmV0LWV4cGxvcmVyL2Rvd25sb2FkLWllJz5JbnRlcm5ldCBFeHBsb3JlciAxMTwvYT4sXG5cdFx0XHRcdG9yIDxhIHRhcmdldD0nX25ldycgaHJlZj0naHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS9lbi1nYi93aW5kb3dzL21pY3Jvc29mdC1lZGdlJz5FZGdlPC9hPiAoV2luZG93cyAxMCkuPC9kaXY+YDtcblxuXHRcdFx0ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJsb2FkZXJcIikuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXHRcdFx0Y29uc3Qgc3Bpbm5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJzcGlubmVyLWljb25cIik7XG5cdFx0XHRpZiAoc3Bpbm5lciAmJiBzcGlubmVyLnN0eWxlKVxuXHRcdFx0XHRzcGlubmVyLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdH1cblxuXHRjb25zdCBjb25maWdTdWNjZXNzID0gZnVuY3Rpb24oZGF0YSkge1xuXHRcdHNldHRpbmdzID0gXy5tZXJnZShzZXR0aW5ncywgZGF0YSk7XG5cblx0XHRyYXlndW4oXCJvcHRpb25zXCIsIHtcblx0XHRcdGRpc2FibGVFcnJvclRyYWNraW5nOiBzZXR0aW5ncy5kZWJ1ZyAmJiAhc2V0dGluZ3MucmVwb3J0RXJyb3JzLFxuXHRcdFx0ZGlzYWJsZVB1bHNlOiBzZXR0aW5ncy5kZWJ1Zyxcblx0XHR9KTtcblxuXHRcdHJheWd1bihcInNldFZlcnNpb25cIiwgc2V0dGluZ3MudmVyc2lvbi5yZXBsYWNlKFwiLVwiLCBcIi5cIikpO1xuXG5cdFx0Ly8gSW5pdGlhbGlzZSByZXN0ZXIgc28gdGhhdCB3ZSBjYW4gdXNlIGhhc0FjY2VzcygpIGxhdGVyXG5cdFx0cmVzdGVyLmluaXQoe1xuXHRcdFx0cm9sZXM6IHNldHRpbmdzLnJvbGVzLFxuXHRcdFx0cGVybWlzc2lvbnM6IHNldHRpbmdzLnBlcm1pc3Npb25zLFxuXHRcdFx0Z3JhbnRzOiBzZXR0aW5ncy5ncmFudHMsXG5cdFx0XHRyb2xlUGVybWlzc2lvbnM6IHNldHRpbmdzLnJvbGVQZXJtaXNzaW9ucyxcblx0XHR9KTtcblxuXHRcdC8vIFNldCB0aGUgY3VzdG9tIE51bmp1Y2tzIGVudmlyb25tZW50LCB0byBsb2FkIGZpbHRlcnMgZXRjXG5cdFx0Y29uc3QgZmllbGRzID0gW1widXJsUm9vdFwiLCBcImxhbmd1YWdlTGlzdFwiLCBcImdyYWRlTGlzdFwiLCBcInVzZXJEYXRhU291cmNlXCIsIFwiZXh0ZXJuYWxTeW5jXCIsIFwiYm9va1Rva2VuTW9kZVwiXTtcblx0XHRmaWVsZHMucHVzaChcImNvbnRlbnRJY29uc1wiLCBcInJlc291cmNlRWRpdGluZ1wiLCBcImVuYWJsZUN1c3RvbUdyb3Vwc1wiLCBcIm9mZmljZUNvbnRlbnRcIiwgXCJyZXN0cmljdEJ5RGVmYXVsdFwiLCBcInNlcnZlck5hbWVcIik7XG5cdFx0ZmllbGRzLnB1c2goXCJwZXJwZXR1YWxHcm91cHNcIiwgXCJhcGtVcGxvYWRzXCIsIFwiaW5Cb29rRkNXaWRnZXRcIiwgXCJkZWJ1Z1wiLCBcImVuYWJsZUxlYXJuaW5nUGF0aHNcIiwgXCJsZWFybmluZ1BhdGhzQ3VzdG9tTmFtZVwiLCBcImdyb3Vwc0N1c3RvbU5hbWVcIik7XG5cdFx0ZmllbGRzLnB1c2goXCJsZWFybmluZ1BhdGhzUGx1cmFsQ3VzdG9tTmFtZVwiLCBcImdyb3Vwc1BsdXJhbEN1c3RvbU5hbWVcIiwgXCJtYXhGaWxlU2l6ZVwiKTtcblxuXHRcdF8uZWFjaChmaWVsZHMsIGl0ZW0gPT4ge1xuXHRcdFx0bnVuanVja3MuZW52LmFkZEdsb2JhbChpdGVtLCBzZXR0aW5nc1tpdGVtXSk7XG5cdFx0fSk7XG5cblx0XHRjb25zdCBjdXN0b21OYW1lRmllbGRzID0gW1wibGVhcm5pbmdQYXRoc0N1c3RvbU5hbWVcIiwgXCJsZWFybmluZ1BhdGhzUGx1cmFsQ3VzdG9tTmFtZVwiLCBcImdyb3Vwc0N1c3RvbU5hbWVcIiwgXCJncm91cHNQbHVyYWxDdXN0b21OYW1lXCJdO1xuXHRcdGNvbnN0IGN1c3RvbU5hbWVzID0gW107XG5cdFx0Xy5lYWNoKGN1c3RvbU5hbWVGaWVsZHMsIGl0ZW0gPT4ge1xuXHRcdFx0Y3VzdG9tTmFtZXNbaXRlbV0gPSBzZXR0aW5nc1tpdGVtXTtcblx0XHR9KTtcblx0XHRudW5qdWNrcy5lbnYuYWRkR2xvYmFsKFwiY3VzdG9tTmFtZXNcIiwgY3VzdG9tTmFtZXMpO1xuXG5cdFx0bnVuanVja3MuZW52LmFkZEdsb2JhbChcInBlcm1pc3Npb25zXCIsIHJlc3Rlci5wKTtcblx0XHRudW5qdWNrcy5lbnYuYWRkR2xvYmFsKFwiZ3JhbnRMaXN0XCIsIHJlc3Rlci5nKTtcblx0XHRudW5qdWNrcy5lbnYuYWRkR2xvYmFsKFwiY29weXJpZ2h0WWVhclwiLCBtb21lbnQoKS55ZWFyKCkpO1xuXG5cdFx0Ly8gU2Vzc2lvbiB0cmFja2VyXG5cdFx0QXBwLlNlc3Npb24gPSByZXF1aXJlKFwiLi9zZXNzaW9uXCIpKEFwcCk7XG5cblx0XHQvLyBDdXJyZW50IHllYXIgY2FsY3VsYXRvclxuXHRcdC8vIE9wdGlvbnM6IHVuaXgsIGVuZFxuXHRcdEFwcC5jdXJyZW50WWVhciA9IChvcHRpb25zID0ge30pID0+IHtcblx0XHRcdGlmIChtb21lbnQoKS5tb250aCgpID49IHNldHRpbmdzLnllYXJTdGFydCkge1xuXHRcdFx0XHRpZiAoIW9wdGlvbnMudW5peClcblx0XHRcdFx0XHRyZXR1cm4gbW9tZW50KCkueWVhcigpO1xuXG5cdFx0XHRcdGxldCByZXQgPSBtb21lbnQoKS5tb250aChzZXR0aW5ncy55ZWFyU3RhcnQpO1xuXHRcdFx0XHRpZiAob3B0aW9ucy5lbmQpIHtcblx0XHRcdFx0XHRpZiAoc2V0dGluZ3MueWVhclN0YXJ0ID4gMClcblx0XHRcdFx0XHRcdHJldCA9IHJldC55ZWFyKG1vbWVudCgpLnllYXIoKSArIDEpO1xuXHRcdFx0XHRcdHJldHVybiByZXQuZW5kT2YoXCJtb250aFwiKS51bml4KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gcmV0LnN0YXJ0T2YoXCJtb250aFwiKS51bml4KCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghb3B0aW9ucy51bml4KVxuXHRcdFx0XHRyZXR1cm4gbW9tZW50KCkueWVhcigpIC0gMTtcblxuXHRcdFx0bGV0IHJldCA9IG1vbWVudCgpLm1vbnRoKHNldHRpbmdzLnllYXJTdGFydCkueWVhcihtb21lbnQoKS55ZWFyKCkgLSAxKTtcblx0XHRcdGlmIChvcHRpb25zLmVuZCkge1xuXHRcdFx0XHRpZiAoc2V0dGluZ3MueWVhclN0YXJ0ID4gMClcblx0XHRcdFx0XHRyZXQgPSByZXQueWVhcihtb21lbnQoKS55ZWFyKCkgKyAxKTtcblx0XHRcdFx0cmV0dXJuIHJldC5lbmRPZihcIm1vbnRoXCIpLnVuaXgoKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHJldC5zdGFydE9mKFwibW9udGhcIikudW5peCgpO1xuXHRcdH07XG5cblx0XHRBcHAuc3RhcnQoQXBwKTtcblxuXHRcdCQoXCJib2R5XCIpLmZvdW5kYXRpb24oKTtcblx0fTtcblxuXHRjb25zdCBjb25maWdFcnJvciA9IGZ1bmN0aW9uKCkge1xuXHRcdHdpbmRvdy5hbGVydChcIlRoZXJlIHdhcyBhbiBlcnJvciBsb2FkaW5nIHJlcXVpcmVkIGRhdGEgZnJvbSB0aGUgc2VydmVyLiBQbGVhc2UgdHJ5IGFnYWluLlwiKTtcblx0fTtcblxuXHQvLyBGZXRjaCBzb21lIHNlcnZlci1zaWRlIHNldHRpbmdzXG5cdGNvbnN0IHVybFBpZWNlcyA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KFwiL1wiKTtcblxuXHRsZXQgcmVkaXIgPSBmYWxzZTtcblxuXHR3aGlsZSghdXJsUGllY2VzWzNdKSB7XG5cdFx0cmVkaXIgPSB0cnVlO1xuXHRcdHVybFBpZWNlcy5zcGxpY2UoMywgMSk7XG5cdH1cblxuXHRpZiAocmVkaXIpIHtcblx0XHR3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybFBpZWNlc1szXSAmJiBfLmluY2x1ZGVzKFtcInVuaXR5MlwiLCBcInVuaXR5XCIsIFwiYWxjaGVteVwiLCBcImVkdWNhdG9yXCJdLCB1cmxQaWVjZXNbM10pID8gXCIvXCIgKyB1cmxQaWVjZXNbM10gOiBcIlwiO1xuXHRcdHJldHVybjtcblx0fVxuXG5cdCQuYWpheCh7XG5cdFx0ZGF0YVR5cGU6IFwianNvblwiLFxuXHRcdHVybDogKHVybFBpZWNlc1szXSAmJiBfLmluY2x1ZGVzKFtcInVuaXR5MlwiLCBcInVuaXR5XCIsIFwiYWxjaGVteVwiLCBcImVkdWNhdG9yXCJdLCB1cmxQaWVjZXNbM10pID8gXCIvXCIgKyB1cmxQaWVjZXNbM10gOiBcIlwiKSArIFwiL2FwaS8xLjAvZmVhdHVyZXMvY29uZmlnXCIsXG5cdFx0c3VjY2VzczogY29uZmlnU3VjY2Vzcyxcblx0XHRlcnJvcjogY29uZmlnRXJyb3IsXG5cdFx0dW5jYW5jZWxsYWJsZTogdHJ1ZSxcblx0fSk7XG59KTsiXX0=",
    "\"use strict\";\n// Module definition\n//------------------\n// Centralises the declaration of all the modules in the app\n\nvar _ = require(\"lodash\");\n\nmodule.exports = function (App) {\n\tvar modules = {\n\t\thome: require(\"../home/index\"),\n\t\tlogin: require(\"../login/index\"),\n\t\tusers: require(\"../users/index\"),\n\t\tadmin: require(\"../admin/index\"),\n\t\tbooks: require(\"../books/index\"),\n\t\tconsole: require(\"../educators/index\"),\n\t\tgroups: require(\"../groups/index\"),\n\t\taccount: require(\"../account/index\"),\n\t\tcontent: require(\"../content/index\"),\n\t\tsystem: require(\"../system/index\"),\n\t\tuploads: require(\"../uploads/index\")\n\t};\n\n\tvar routeInitialiser = function routeInitialiser(mod, route) {\n\t\treturn function () {\n\t\t\tvar routeApplicator = function routeApplicator(val, key) {\n\t\t\t\tApp.Router.route(route + (key ? \"/\" + key : \"\") + \"(/)\", route + \":\" + key, mod.Router[val]);\n\t\t\t};\n\n\t\t\t_.each(mod.Router.routes, routeApplicator);\n\t\t};\n\t};\n\n\t_.each(modules, function (m, routeName) {\n\t\tif (m.routing) {\n\t\t\tm.routing(App);\n\t\t\trouteInitialiser(m, routeName)();\n\t\t}\n\t});\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1vZHVsZXMuanMiXSwibmFtZXMiOlsiXyIsInJlcXVpcmUiLCJtb2R1bGUiLCJleHBvcnRzIiwiQXBwIiwibW9kdWxlcyIsImhvbWUiLCJsb2dpbiIsInVzZXJzIiwiYWRtaW4iLCJib29rcyIsImNvbnNvbGUiLCJncm91cHMiLCJhY2NvdW50IiwiY29udGVudCIsInN5c3RlbSIsInVwbG9hZHMiLCJyb3V0ZUluaXRpYWxpc2VyIiwibW9kIiwicm91dGUiLCJyb3V0ZUFwcGxpY2F0b3IiLCJ2YWwiLCJrZXkiLCJSb3V0ZXIiLCJlYWNoIiwicm91dGVzIiwibSIsInJvdXRlTmFtZSIsInJvdXRpbmciXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWOztBQUVBQyxPQUFPQyxPQUFQLEdBQWlCLFVBQVNDLEdBQVQsRUFBYztBQUM5QixLQUFNQyxVQUFVO0FBQ2ZDLFFBQU1MLFFBQVEsZUFBUixDQURTO0FBRWZNLFNBQU9OLFFBQVEsZ0JBQVIsQ0FGUTtBQUdmTyxTQUFPUCxRQUFRLGdCQUFSLENBSFE7QUFJZlEsU0FBT1IsUUFBUSxnQkFBUixDQUpRO0FBS2ZTLFNBQU9ULFFBQVEsZ0JBQVIsQ0FMUTtBQU1mVSxXQUFTVixRQUFRLG9CQUFSLENBTk07QUFPZlcsVUFBUVgsUUFBUSxpQkFBUixDQVBPO0FBUWZZLFdBQVNaLFFBQVEsa0JBQVIsQ0FSTTtBQVNmYSxXQUFTYixRQUFRLGtCQUFSLENBVE07QUFVZmMsVUFBUWQsUUFBUSxpQkFBUixDQVZPO0FBV2ZlLFdBQVNmLFFBQVEsa0JBQVI7QUFYTSxFQUFoQjs7QUFjQSxLQUFNZ0IsbUJBQW1CLFNBQW5CQSxnQkFBbUIsQ0FBU0MsR0FBVCxFQUFjQyxLQUFkLEVBQXFCO0FBQzdDLFNBQU8sWUFBTTtBQUNaLE9BQU1DLGtCQUFrQixTQUFsQkEsZUFBa0IsQ0FBQ0MsR0FBRCxFQUFNQyxHQUFOLEVBQWM7QUFDckNsQixRQUFJbUIsTUFBSixDQUFXSixLQUFYLENBQWlCQSxTQUFTRyxNQUFNLE1BQU1BLEdBQVosR0FBa0IsRUFBM0IsSUFBaUMsS0FBbEQsRUFBeURILFFBQVEsR0FBUixHQUFjRyxHQUF2RSxFQUE0RUosSUFBSUssTUFBSixDQUFXRixHQUFYLENBQTVFO0FBQ0EsSUFGRDs7QUFJQXJCLEtBQUV3QixJQUFGLENBQU9OLElBQUlLLE1BQUosQ0FBV0UsTUFBbEIsRUFBMEJMLGVBQTFCO0FBQ0EsR0FORDtBQU9BLEVBUkQ7O0FBVUFwQixHQUFFd0IsSUFBRixDQUFPbkIsT0FBUCxFQUFnQixVQUFDcUIsQ0FBRCxFQUFJQyxTQUFKLEVBQWtCO0FBQ2pDLE1BQUlELEVBQUVFLE9BQU4sRUFBZTtBQUNkRixLQUFFRSxPQUFGLENBQVV4QixHQUFWO0FBQ0FhLG9CQUFpQlMsQ0FBakIsRUFBb0JDLFNBQXBCO0FBQ0E7QUFDRCxFQUxEO0FBTUEsQ0EvQkQiLCJmaWxlIjoibW9kdWxlcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuLy8gTW9kdWxlIGRlZmluaXRpb25cbi8vLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDZW50cmFsaXNlcyB0aGUgZGVjbGFyYXRpb24gb2YgYWxsIHRoZSBtb2R1bGVzIGluIHRoZSBhcHBcblxuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQXBwKSB7XG5cdGNvbnN0IG1vZHVsZXMgPSB7XG5cdFx0aG9tZTogcmVxdWlyZShcIi4uL2hvbWUvaW5kZXhcIiksXG5cdFx0bG9naW46IHJlcXVpcmUoXCIuLi9sb2dpbi9pbmRleFwiKSxcblx0XHR1c2VyczogcmVxdWlyZShcIi4uL3VzZXJzL2luZGV4XCIpLFxuXHRcdGFkbWluOiByZXF1aXJlKFwiLi4vYWRtaW4vaW5kZXhcIiksXG5cdFx0Ym9va3M6IHJlcXVpcmUoXCIuLi9ib29rcy9pbmRleFwiKSxcblx0XHRjb25zb2xlOiByZXF1aXJlKFwiLi4vZWR1Y2F0b3JzL2luZGV4XCIpLFxuXHRcdGdyb3VwczogcmVxdWlyZShcIi4uL2dyb3Vwcy9pbmRleFwiKSxcblx0XHRhY2NvdW50OiByZXF1aXJlKFwiLi4vYWNjb3VudC9pbmRleFwiKSxcblx0XHRjb250ZW50OiByZXF1aXJlKFwiLi4vY29udGVudC9pbmRleFwiKSxcblx0XHRzeXN0ZW06IHJlcXVpcmUoXCIuLi9zeXN0ZW0vaW5kZXhcIiksXG5cdFx0dXBsb2FkczogcmVxdWlyZShcIi4uL3VwbG9hZHMvaW5kZXhcIiksXG5cdH07XG5cblx0Y29uc3Qgcm91dGVJbml0aWFsaXNlciA9IGZ1bmN0aW9uKG1vZCwgcm91dGUpIHtcblx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0Y29uc3Qgcm91dGVBcHBsaWNhdG9yID0gKHZhbCwga2V5KSA9PiB7XG5cdFx0XHRcdEFwcC5Sb3V0ZXIucm91dGUocm91dGUgKyAoa2V5ID8gXCIvXCIgKyBrZXkgOiBcIlwiKSArIFwiKC8pXCIsIHJvdXRlICsgXCI6XCIgKyBrZXksIG1vZC5Sb3V0ZXJbdmFsXSk7XG5cdFx0XHR9O1xuXG5cdFx0XHRfLmVhY2gobW9kLlJvdXRlci5yb3V0ZXMsIHJvdXRlQXBwbGljYXRvcik7XG5cdFx0fTtcblx0fTtcblxuXHRfLmVhY2gobW9kdWxlcywgKG0sIHJvdXRlTmFtZSkgPT4ge1xuXHRcdGlmIChtLnJvdXRpbmcpIHtcblx0XHRcdG0ucm91dGluZyhBcHApO1xuXHRcdFx0cm91dGVJbml0aWFsaXNlcihtLCByb3V0ZU5hbWUpKCk7XG5cdFx0fVxuXHR9KTtcbn07XG4iXX0=",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nmodule.exports = function (App) {\n\tApp.Views.Nav = Backbone.Marionette.View.extend({\n\t\ttemplate: require(\"./templates/navigation.nunj\"),\n\n\t\tevents: {\n\t\t\t\"click a\": \"link\",\n\t\t\t\"click #notifications li\": \"link\"\n\t\t},\n\n\t\tinitialize: function initialize() {\n\t\t\tthis.listenTo(radio, App.Events.SessionLoaded, this.render.bind(this));\n\t\t\tthis.listenTo(radio, App.Events.LogoutSuccess, this.render.bind(this));\n\t\t\tthis.listenTo(radio, App.Events.UpdateUserDetails, this.render.bind(this, true));\n\n\t\t\tif (App.Session.get(\"checked\")) this.render();\n\t\t},\n\n\t\trender: function render(authd) {\n\t\t\tvar nav = void 0;\n\n\t\t\tif (authd) {\n\t\t\t\tvar data = App.Session.toJSON();\n\n\t\t\t\tvar impersonating = data.impersonating;\n\n\t\t\t\tnav = {\n\t\t\t\t\tlinks: [],\n\t\t\t\t\tname: (data.user.firstname + (data.user.surname ? \" \" + data.user.surname : \"\")).replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t\t\t}),\n\t\t\t\t\tsubtitle: \"User Actions\",\n\t\t\t\t\turl: \"#\"\n\t\t\t\t};\n\n\t\t\t\t/*nav.links.push({\n    \tname: \"<span class='fa fa-gear'/> Account Settings\",\n    \turl: \"/account/preferences\"\n    });*/\n\n\t\t\t\tif (settings.bookTokenMode) {\n\t\t\t\t\tnav.links.push({\n\t\t\t\t\t\tname: \"Store Tokens\",\n\t\t\t\t\t\turl: \"/account/tokens\"\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tnav.links.push({\n\t\t\t\t\tname: \"Log Out\",\n\t\t\t\t\turl: \"/logout\"\n\t\t\t\t});\n\n\t\t\t\tdata = _.reverse(_.clone(data.navigation));\n\n\t\t\t\tif (impersonating) {\n\t\t\t\t\tdata.push({\n\t\t\t\t\t\tactive: true,\n\t\t\t\t\t\tname: \"Unpersonate\",\n\t\t\t\t\t\turl: \"/admin/unpersonate\"\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tdata.push(nav);\n\n\t\t\t\t$(this.el).html(this.template.render({ navigation: data }));\n\t\t\t} else {\n\t\t\t\tnav = [{\n\t\t\t\t\tname: \"Login\",\n\t\t\t\t\turl: \"/login\"\n\t\t\t\t}];\n\n\t\t\t\t$(this.el).html(this.template.render({ navigation: nav }));\n\t\t\t}\n\n\t\t\t// Set up Foundation\n\t\t\t$(\"header\").foundation();\n\n\t\t\tradio.trigger(App.Events.NavLoaded);\n\t\t},\n\n\t\tlink: function link(evt) {\n\t\t\t//\t\t\tevt.stopPropagation();\n\t\t\tevt.preventDefault();\n\n\t\t\tvar tag = $(evt.currentTarget);\n\t\t\tvar href = tag.attr(\"href\");\n\n\t\t\tif (href === \"#\") return;\n\n\t\t\tif ($(evt.target).data(\"new\")) return window.open(href);\n\n\t\t\t// Global notification of a new link being clicked\n\t\t\tradio.trigger(App.Events.Commands.Navigate, href);\n\t\t}\n\t});\n\n\treturn new App.Views.Nav({ el: \"div.top-bar\" });\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5hdmlnYXRpb24uanMiXSwibmFtZXMiOlsiJCIsInJlcXVpcmUiLCJfIiwiQmFja2JvbmUiLCJzZXR0aW5ncyIsInJhZGlvIiwiUmFkaW8iLCJjaGFubmVsIiwibW9kdWxlIiwiZXhwb3J0cyIsIkFwcCIsIlZpZXdzIiwiTmF2IiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJleHRlbmQiLCJ0ZW1wbGF0ZSIsImV2ZW50cyIsImluaXRpYWxpemUiLCJsaXN0ZW5UbyIsIkV2ZW50cyIsIlNlc3Npb25Mb2FkZWQiLCJyZW5kZXIiLCJiaW5kIiwiTG9nb3V0U3VjY2VzcyIsIlVwZGF0ZVVzZXJEZXRhaWxzIiwiU2Vzc2lvbiIsImdldCIsImF1dGhkIiwibmF2IiwiZGF0YSIsInRvSlNPTiIsImltcGVyc29uYXRpbmciLCJsaW5rcyIsIm5hbWUiLCJ1c2VyIiwiZmlyc3RuYW1lIiwic3VybmFtZSIsInJlcGxhY2UiLCJ4IiwiY2hhckNvZGVBdCIsInN1YnRpdGxlIiwidXJsIiwiYm9va1Rva2VuTW9kZSIsInB1c2giLCJyZXZlcnNlIiwiY2xvbmUiLCJuYXZpZ2F0aW9uIiwiYWN0aXZlIiwiZWwiLCJodG1sIiwiZm91bmRhdGlvbiIsInRyaWdnZXIiLCJOYXZMb2FkZWQiLCJsaW5rIiwiZXZ0IiwicHJldmVudERlZmF1bHQiLCJ0YWciLCJjdXJyZW50VGFyZ2V0IiwiaHJlZiIsImF0dHIiLCJ0YXJnZXQiLCJ3aW5kb3ciLCJvcGVuIiwiQ29tbWFuZHMiLCJOYXZpZ2F0ZSJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsSUFBSUMsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1FLFdBQVdGLFFBQVEsVUFBUixDQUFqQjs7QUFFQSxJQUFNRyxXQUFXSCxRQUFRLGNBQVIsQ0FBakI7O0FBRUEsSUFBTUksUUFBUUYsU0FBU0csS0FBVCxDQUFlQyxPQUFmLENBQXVCLFFBQXZCLENBQWQ7O0FBRUFDLE9BQU9DLE9B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LFNBQXpCO0FBQ0EsR0E1RThDOztBQThFL0NDLFFBQU0sY0FBU0MsR0FBVCxFQUFjO0FBQ25CO0FBQ0FBLE9BQUlDLGNBQUo7O0FBRUEsT0FBTUMsTUFBTXpELEVBQUV1RCxJQUFJRyxhQUFOLENBQVo7QUFDQSxPQUFNQyxPQUFPRixJQUFJRyxJQUFKLENBQVMsTUFBVCxDQUFiOztBQUVBLE9BQUlELFNBQVMsR0FBYixFQUNDOztBQUVELE9BQUkzRCxFQUFFdUQsSUFBSU0sTUFBTixFQUFjL0IsSUFBZCxDQUFtQixLQUFuQixDQUFKLEVBQ0MsT0FBT2dDLE9BQU9DLElBQVAsQ0FBWUosSUFBWixDQUFQOztBQUVEO0FBQ0F0RCxTQUFNK0MsT0FBTixDQUFjMUMsSUFBSVUsTUFBSixDQUFXNEMsUUFBWCxDQUFvQkMsUUFBbEMsRUFBNENOLElBQTVDO0FBQ0E7QUE3RjhDLEVBQWhDLENBQWhCOztBQWdHQSxRQUFPLElBQUlqRCxJQUFJQyxLQUFKLENBQVVDLEdBQWQsQ0FBa0IsRUFBRXFDLElBQUksYUFBTixFQUFsQixDQUFQO0FBQ0EsQ0FsR0QiLCJmaWxlIjoibmF2aWdhdGlvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihBcHApIHtcblx0QXBwLlZpZXdzLk5hdiA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRcdHRlbXBsYXRlOiByZXF1aXJlKFwiLi90ZW1wbGF0ZXMvbmF2aWdhdGlvbi5udW5qXCIpLFxuXG5cdFx0ZXZlbnRzOiB7XG5cdFx0XHRcImNsaWNrIGFcIjogXCJsaW5rXCIsXG5cdFx0XHRcImNsaWNrICNub3RpZmljYXRpb25zIGxpXCI6IFwibGlua1wiLFxuXHRcdH0sXG5cblx0XHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRcdHRoaXMubGlzdGVuVG8ocmFkaW8sIEFwcC5FdmVudHMuU2Vzc2lvbkxvYWRlZCwgdGhpcy5yZW5kZXIuYmluZCh0aGlzKSk7XG5cdFx0XHR0aGlzLmxpc3RlblRvKHJhZGlvLCBBcHAuRXZlbnRzLkxvZ291dFN1Y2Nlc3MsIHRoaXMucmVuZGVyLmJpbmQodGhpcykpO1xuXHRcdFx0dGhpcy5saXN0ZW5UbyhyYWRpbywgQXBwLkV2ZW50cy5VcGRhdGVVc2VyRGV0YWlscywgdGhpcy5yZW5kZXIuYmluZCh0aGlzLCB0cnVlKSk7XG5cblx0XHRcdGlmIChBcHAuU2Vzc2lvbi5nZXQoXCJjaGVja2VkXCIpKVxuXHRcdFx0XHR0aGlzLnJlbmRlcigpO1xuXHRcdH0sXG5cblx0XHRyZW5kZXI6IGZ1bmN0aW9uKGF1dGhkKSB7XG5cdFx0XHRsZXQgbmF2O1xuXG5cdFx0XHRpZiAoYXV0aGQpIHtcblx0XHRcdFx0bGV0IGRhdGEgPSBBcHAuU2Vzc2lvbi50b0pTT04oKTtcblxuXHRcdFx0XHRjb25zdCBpbXBlcnNvbmF0aW5nID0gZGF0YS5pbXBlcnNvbmF0aW5nO1xuXG5cdFx0XHRcdG5hdiA9IHtcblx0XHRcdFx0XHRsaW5rczogW10sXG5cdFx0XHRcdFx0bmFtZTogKGRhdGEudXNlci5maXJzdG5hbWUgKyAoZGF0YS51c2VyLnN1cm5hbWUgPyBcIiBcIiArIGRhdGEudXNlci5zdXJuYW1lIDogXCJcIikpLnJlcGxhY2UoL1tcXCZcXDxcXD5cXCdcXFwiXS9nLCB4ID0+IFwiJiNcIiArIHguY2hhckNvZGVBdCgwKSArIFwiO1wiKSxcblx0XHRcdFx0XHRzdWJ0aXRsZTogXCJVc2VyIEFjdGlvbnNcIixcblx0XHRcdFx0XHR1cmw6IFwiI1wiLFxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8qbmF2LmxpbmtzLnB1c2goe1xuXHRcdFx0XHRcdG5hbWU6IFwiPHNwYW4gY2xhc3M9J2ZhIGZhLWdlYXInLz4gQWNjb3VudCBTZXR0aW5nc1wiLFxuXHRcdFx0XHRcdHVybDogXCIvYWNjb3VudC9wcmVmZXJlbmNlc1wiXG5cdFx0XHRcdH0pOyovXG5cblx0XHRcdFx0aWYgKHNldHRpbmdzLmJvb2tUb2tlbk1vZGUpIHtcblx0XHRcdFx0XHRuYXYubGlua3MucHVzaCh7XG5cdFx0XHRcdFx0XHRuYW1lOiBcIlN0b3JlIFRva2Vuc1wiLFxuXHRcdFx0XHRcdFx0dXJsOiBcIi9hY2NvdW50L3Rva2Vuc1wiLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bmF2LmxpbmtzLnB1c2goe1xuXHRcdFx0XHRcdG5hbWU6IFwiTG9nIE91dFwiLFxuXHRcdFx0XHRcdHVybDogXCIvbG9nb3V0XCIsXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGRhdGEgPSBfLnJldmVyc2UoXy5jbG9uZShkYXRhLm5hdmlnYXRpb24pKTtcblxuXHRcdFx0XHRpZiAoaW1wZXJzb25hdGluZykge1xuXHRcdFx0XHRcdGRhdGEucHVzaCh7XG5cdFx0XHRcdFx0XHRhY3RpdmU6IHRydWUsXG5cdFx0XHRcdFx0XHRuYW1lOiBcIlVucGVyc29uYXRlXCIsXG5cdFx0XHRcdFx0XHR1cmw6IFwiL2FkbWluL3VucGVyc29uYXRlXCIsXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkYXRhLnB1c2gobmF2KTtcblxuXHRcdFx0XHQkKHRoaXMuZWwpLmh0bWwodGhpcy50ZW1wbGF0ZS5yZW5kZXIoeyBuYXZpZ2F0aW9uOiBkYXRhIH0pKTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRuYXYgPSBbe1xuXHRcdFx0XHRcdG5hbWU6IFwiTG9naW5cIixcblx0XHRcdFx0XHR1cmw6IFwiL2xvZ2luXCIsXG5cdFx0XHRcdH1dO1xuXG5cdFx0XHRcdCQodGhpcy5lbCkuaHRtbCh0aGlzLnRlbXBsYXRlLnJlbmRlcih7IG5hdmlnYXRpb246IG5hdiB9KSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCB1cCBGb3VuZGF0aW9uXG5cdFx0XHQkKFwiaGVhZGVyXCIpLmZvdW5kYXRpb24oKTtcblxuXHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLk5hdkxvYWRlZCk7XG5cdFx0fSxcblxuXHRcdGxpbms6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdFx0Ly9cdFx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRldnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdFx0Y29uc3QgdGFnID0gJChldnQuY3VycmVudFRhcmdldCk7XG5cdFx0XHRjb25zdCBocmVmID0gdGFnLmF0dHIoXCJocmVmXCIpO1xuXG5cdFx0XHRpZiAoaHJlZiA9PT0gXCIjXCIpXG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0aWYgKCQoZXZ0LnRhcmdldCkuZGF0YShcIm5ld1wiKSlcblx0XHRcdFx0cmV0dXJuIHdpbmRvdy5vcGVuKGhyZWYpO1xuXG5cdFx0XHQvLyBHbG9iYWwgbm90aWZpY2F0aW9uIG9mIGEgbmV3IGxpbmsgYmVpbmcgY2xpY2tlZFxuXHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLk5hdmlnYXRlLCBocmVmKTtcblx0XHR9LFxuXHR9KTtcblxuXHRyZXR1cm4gbmV3IEFwcC5WaWV3cy5OYXYoeyBlbDogXCJkaXYudG9wLWJhclwiIH0pO1xufTsiXX0=",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar Backbone = require(\"backbone\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nmodule.exports = function (App) {\n\tApp.getRegion().on(\"before:swap before:show\", function () {\n\t\tradio.trigger(App.Events.Commands.ShowSpinner);\n\t});\n\n\tApp.getRegion().on(\"before:empty\", function () {\n\t\t// Abort any current Ajax\n\t\t$.abortAllXhr();\n\t});\n\n\tApp.getRegion().on(\"show\", function () {\n\t\tradio.trigger(App.Events.ModalContextChange, App.modalContext);\n\t\tdelete App.modalContext;\n\n\t\tradio.trigger(App.Events.Commands.HideSpinner);\n\t});\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJlZ2lvbnMuanMiXSwibmFtZXMiOlsiJCIsInJlcXVpcmUiLCJCYWNrYm9uZSIsInJhZGlvIiwiUmFkaW8iLCJjaGFubmVsIiwibW9kdWxlIiwiZXhwb3J0cyIsIkFwcCIsImdldFJlZ2lvbiIsIm9uIiwidHJpZ2dlciIsIkV2ZW50cyIsIkNvbW1hbmRzIiwiU2hvd1NwaW5uZXIiLCJhYm9ydEFsbFhociIsIk1vZGFsQ29udGV4dENoYW5nZSIsIm1vZGFsQ29udGV4dCIsIkhpZGVTcGlubmVyIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLFdBQVdELFFBQVEsVUFBUixDQUFqQjs7QUFFQSxJQUFNRSxRQUFRRCxTQUFTRSxLQUFULENBQWVDLE9BQWYsQ0FBdUIsUUFBdkIsQ0FBZDs7QUFFQUMsT0FBT0MsT0FBUCxHQUFpQixVQUFTQyxHQUFULEVBQWM7QUFDOUJBLEtBQUlDLFNBQUosR0FBZ0JDLEVBQWhCLENBQW1CLHlCQUFuQixFQUE4QyxZQUFNO0FBQ25EUCxRQUFNUSxPQUFOLENBQWNILElBQUlJLE1BQUosQ0FBV0MsUUFBWCxDQUFvQkMsV0FBbEM7QUFDQSxFQUZEOztBQUlBTixLQUFJQyxTQUFKLEdBQWdCQyxFQUFoQixDQUFtQixjQUFuQixFQUFtQyxZQUFNO0FBQ3hDO0FBQ0FWLElBQUVlLFdBQUY7QUFDQSxFQUhEOztBQUtBUCxLQUFJQyxTQUFKLEdBQWdCQyxFQUFoQixDQUFtQixNQUFuQixFQUEyQixZQUFNO0FBQ2hDUCxRQUFNUSxPQUFOLENBQWNILElBQUlJLE1BQUosQ0FBV0ksa0JBQXpCLEVBQTZDUixJQUFJUyxZQUFqRDtBQUNBLFNBQU9ULElBQUlTLFlBQVg7O0FBRUFkLFFBQU1RLE9BQU4sQ0FBY0gsSUFBSUksTUFBSixDQUFXQyxRQUFYLENBQW9CSyxXQUFsQztBQUNBLEVBTEQ7QUFNQSxDQWhCRCIsImZpbGUiOiJyZWdpb25zLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuXG5jb25zdCByYWRpbyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJnbG9iYWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQXBwKSB7XG5cdEFwcC5nZXRSZWdpb24oKS5vbihcImJlZm9yZTpzd2FwIGJlZm9yZTpzaG93XCIsICgpID0+IHtcblx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuU2hvd1NwaW5uZXIpO1xuXHR9KTtcblxuXHRBcHAuZ2V0UmVnaW9uKCkub24oXCJiZWZvcmU6ZW1wdHlcIiwgKCkgPT4ge1xuXHRcdC8vIEFib3J0IGFueSBjdXJyZW50IEFqYXhcblx0XHQkLmFib3J0QWxsWGhyKCk7XG5cdH0pO1xuXG5cdEFwcC5nZXRSZWdpb24oKS5vbihcInNob3dcIiwgKCkgPT4ge1xuXHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Nb2RhbENvbnRleHRDaGFuZ2UsIEFwcC5tb2RhbENvbnRleHQpO1xuXHRcdGRlbGV0ZSBBcHAubW9kYWxDb250ZXh0O1xuXG5cdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLkhpZGVTcGlubmVyKTtcblx0fSk7XG59OyJdfQ==",
    "\"use strict\";\n// Routing\n//----------------\n// Set up all the routes used by the app\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar Backbone = require(\"backbone\");\nvar settings = require(\"app-settings\");\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar raygun = require(\"raygun\");\n\nvar SmallModal = require(\"../lib/smallModal\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nmodule.exports = function (App) {\n\tvar handoffWhitelist = [\"/realtime\", \"/answers\", \"/monitor\", \"/resourcestore\", \"/analytics-beta\", \"/analytics\", \"/lessons\", \"@insights.it.si\", \"@insights.myitsi.com\", \"@lessons.myitsi.com\", \"@insights.dev.it.si\", \"/reader\"];\n\n\t// Central handler for all URL changes\n\tradio.on(App.Events.Commands.Navigate, function (u) {\n\t\tvar opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\tvar url = u;\n\t\t// null is interpreted as \"redirect to previous attempted location\"\n\t\tif (url === null) {\n\t\t\tif (App.Router.handoffUrl) {\n\t\t\t\tif (_.some(handoffWhitelist, function (x) {\n\t\t\t\t\treturn _.startsWith(\"/\" + App.Router.handoffUrl, x);\n\t\t\t\t})) {\n\t\t\t\t\twindow.location.href = \"/\" + App.Router.handoffUrl + (window.location.search ? \"?\" + window.location.search : \"\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// New location\n\t\t\t\tif (_.some(handoffWhitelist, function (x) {\n\t\t\t\t\treturn _.startsWith(\"@\" + App.Router.handoffUrl, x);\n\t\t\t\t})) {\n\t\t\t\t\twindow.location.href = \"https://\" + App.Router.handoffUrl + (window.location.search ? \"?\" + window.location.search + \"&token=\" + App.Session.get(\"token\") + \"&username=\" + encodeURIComponent(App.Session.get(\"user\").username) : \"?token=\" + App.Session.get(\"token\") + \"&username=\" + encodeURIComponent(App.Session.get(\"user\").username));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\treturn alert(\"Handoff rejected. Please refresh.\");\n\t\t\t} else if (App.Router.loginRedirect) {\n\t\t\t\tvar loc = App.Router.loginRedirect;\n\t\t\t\tdelete App.Router.loginRedirect;\n\t\t\t\tApp.Router.navigate(loc.url);\n\n\t\t\t\tvar pather = url;\n\t\t\t\t// Remove the leading urlRoot\n\t\t\t\t_.each(settings.altUrlRoots.concat(settings.urlRoot), function (item) {\n\t\t\t\t\tif (_.startsWith(pather, item)) pather = pather.slice(item.length);\n\t\t\t\t});\n\n\t\t\t\traygun(\"trackEvent\", {\n\t\t\t\t\ttype: \"pageView\",\n\t\t\t\t\tpath: pather\n\t\t\t\t});\n\t\t\t\treturn loc.callback();\n\t\t\t}\n\t\t\turl = \"/\";\n\t\t}\n\n\t\tif (\"/\" + Backbone.history.getFragment() === url) return false;\n\n\t\t// Remove the leading urlRoot\n\t\t_.each(settings.altUrlRoots.concat(settings.urlRoot), function (item) {\n\t\t\tif (_.startsWith(url, item)) url = url.slice(item.length);\n\t\t});\n\n\t\tvar trigger = true,\n\t\t    replace = false;\n\t\tif (!_.isUndefined(opts.trigger)) trigger = false;\n\t\tif (opts.replace) replace = true;\n\n\t\tradio.trigger(App.Events.Commands.BurnToast);\n\n\t\tif (App.Router.navPromptContent) {\n\t\t\tvar modal = new SmallModal({ title: \"<span class='fal fa-exclamation-triangle'/> Navigation Warning\", body: App.Router.navPromptContent });\n\t\t\tmodal.once(\"button:ok\", function () {\n\t\t\t\tApp.Router.navPromptContent = null;\n\t\t\t\twindow.addEventListener(\"beforeunload\", null);\n\t\t\t\tApp.Router.navigate(url, { trigger: trigger, replace: replace });\n\n\t\t\t\traygun(\"trackEvent\", {\n\t\t\t\t\ttype: \"pageView\",\n\t\t\t\t\tpath: url\n\t\t\t\t});\n\t\t\t\tradio.trigger(App.Events.PageChange, url);\n\t\t\t});\n\n\t\t\t$(\"#modals .modal-container\").append(modal.render().el);\n\t\t\treturn false;\n\t\t}\n\n\t\tApp.Router.navigate(url, { trigger: trigger, replace: replace });\n\n\t\traygun(\"trackEvent\", {\n\t\t\ttype: \"pageView\",\n\t\t\tpath: url\n\t\t});\n\t\tradio.trigger(App.Events.PageChange, url);\n\t});\n\n\tvar MainRouter = Backbone.Router.extend({\n\t\troutes: {\n\t\t\t\"\": \"initialLoad\",\n\t\t\t\"educators/console\": \"navigateToBookSelector\",\n\t\t\tlogout: \"logout\",\n\t\t\t\"handoff/*path\": \"handoff\",\n\t\t\t\".*\": \"catchAll\"\n\t\t},\n\n\t\tinitialize: function initialize() {\n\t\t\tthis.listenTo(radio, App.Events.LogoutSuccess, this.logoutSuccess.bind(this));\n\n\t\t\tradio.on(App.Events.Commands.NavigationPrompt, this.setNavPrompt.bind(this));\n\t\t},\n\n\t\texecute: function execute(callback, args, route) {\n\t\t\tvar _this = this;\n\n\t\t\t// Some paths don't need a login check\n\t\t\tvar safePaths = [\"login:\", \"logout\"];\n\t\t\tif (_.includes(safePaths, route) && callback) return callback.apply(this, args);\n\n\t\t\tthis.stopListening(App.Session);\n\t\t\tvar handoff = false;\n\n\t\t\t// Handoff is for redirecting to another ITSI endpoint after login\n\t\t\tif (route === \"handoff\") handoff = true;\n\n\t\t\t//If there is a handoff stored in localStorage\n\t\t\tif (route !== \"handoff\" && window.localStorage.getItem(\"handoff\")) {\n\t\t\t\tvar handoffUrl = window.localStorage.getItem(\"handoff\");\n\t\t\t\t//Clear handoff from localStorage\n\t\t\t\twindow.localStorage.removeItem(\"handoff\");\n\t\t\t\t//Redirect to the handoff url\n\t\t\t\tthis.handoff(handoffUrl);\n\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Switch to login page?\n\t\t\tif (App.Session.get(\"checked\")) {\n\t\t\t\tif (!App.Session.isAuthenticated()) {\n\t\t\t\t\tif (handoff) this.handoffUrl = args[0] + (args[1] ? \"?\" + args[1] : window.location.hash ? window.location.hash : \"\");else this.loginRedirect = { callback: callback.bind.apply(callback, [this].concat(_toConsumableArray(args))), url: Backbone.history.getFragment() };\n\t\t\t\t\tthis.navigate(\"/login\", { trigger: true, replace: true });\n\t\t\t\t\treturn false;\n\t\t\t\t} else if (callback) {\n\t\t\t\t\tdelete this.handoffUrl;\n\t\t\t\t\treturn callback.apply(this, args);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.listenToOnce(radio, App.Events.SessionLoaded, function () {\n\t\t\t\t\tif (!App.Session.get(\"checked\") || !App.Session.isAuthenticated()) {\n\t\t\t\t\t\tif (handoff) _this.handoffUrl = args[0] + (args[1] ? \"?\" + args[1] : window.location.hash ? window.location.hash : \"\");else _this.loginRedirect = { callback: callback.bind.apply(callback, [_this].concat(_toConsumableArray(args))), url: Backbone.history.getFragment() };\n\t\t\t\t\t\t_this.navigate(\"/login\", { trigger: true, replace: true });\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} else if (callback) {\n\t\t\t\t\t\tdelete _this.handoffUrl;\n\t\t\t\t\t\treturn callback.apply(_this, args);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\n\t\tsetNavPrompt: function setNavPrompt(content) {\n\t\t\tApp.Router.navPromptContent = content;\n\t\t\tif (content) window.addEventListener(\"beforeunload\", function () {\n\t\t\t\treturn content;\n\t\t\t});else window.addEventListener(\"beforeunload\", null);\n\t\t},\n\n\t\tinitialLoad: function initialLoad() {\n\t\t\tif (!this.initialLoaded) {\n\t\t\t\tthis.initialLoaded = true;\n\t\t\t\tthis.navigate(\"/home\", { trigger: true, replace: true });\n\t\t\t}\n\t\t},\n\n\t\tnavigateToBookSelector: function navigateToBookSelector() {\n\t\t\tradio.trigger(App.Events.Commands.Navigate, settings.urlRoot + \"/console/books\");\n\t\t},\n\n\t\tlogout: function logout() {\n\t\t\tthis.initialLoaded = false;\n\t\t\tradio.trigger(App.Events.Commands.Logout);\n\t\t},\n\n\t\thandoff: function handoff(_handoff) {\n\t\t\t// Local location\n\t\t\tif (_.some(handoffWhitelist, function (x) {\n\t\t\t\treturn _.startsWith(\"/\" + _handoff, x);\n\t\t\t})) {\n\t\t\t\twindow.location.href = \"/\" + _handoff + (window.location.search ? \"?\" + window.location.search : \"\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// New location\n\t\t\tif (_.some(handoffWhitelist, function (x) {\n\t\t\t\treturn _.startsWith(\"@\" + _handoff, x);\n\t\t\t})) {\n\t\t\t\tvar t = (App.Session.get(\"user\") || {}).cookieToken || App.Session.get(\"token\");\n\t\t\t\twindow.location.href = \"https://\" + _handoff + (window.location.search ? \"?\" + window.location.search + \"&token=\" + t + \"&username=\" + encodeURIComponent(App.Session.get(\"user\").username) : \"?token=\" + t + \"&username=\" + encodeURIComponent(App.Session.get(\"user\").username));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treturn alert(\"Handoff rejected\");\n\t\t},\n\n\t\tlogoutSuccess: function logoutSuccess(authd, noNav) {\n\t\t\tif (!noNav) this.navigate(\"/login\", { trigger: true, replace: true });\n\t\t},\n\n\t\tcatchAll: function catchAll() {\n\t\t\tthis.navigate(\"/\", { trigger: true, replace: true });\n\t\t}\n\t});\n\n\tApp.Router = new MainRouter();\n\n\tvar urlPieces = window.location.href.split(\"/\");\n\n\twhile (!urlPieces[3]) {\n\t\turlPieces.splice(3, 1);\n\t}var valid = settings.altUrlRoots.concat([settings.urlRoot]);\n\tif (!_.includes(valid, \"/\" + urlPieces[3])) {\n\t\talert(\"There was a problem loading the site. Please try again, or check the address\");\n\t\treturn;\n\t}\n\n\t// Don't route anywhere until we know if we're logged in or not\n\tradio.once(App.Events.SessionLoaded, function () {\n\t\tBackbone.history.start({ pushState: true, root: urlPieces[3] });\n\t});\n\n\t//If a urlPieces contains handoff\n\tif (!window.localStorage.getItem(\"handoff\") && _.includes(urlPieces, \"handoff\") && urlPieces[_.indexOf(urlPieces, \"handoff\") + 1]) {\n\t\tif (_.includes(handoffWhitelist, \"/\" + urlPieces[_.indexOf(urlPieces, \"handoff\") + 1]) || _.includes(handoffWhitelist, \"@\" + urlPieces[_.indexOf(urlPieces, \"handoff\") + 1])) {\n\t\t\t//Store it in localStorage\n\t\t\twindow.localStorage.setItem(\"handoff\", urlPieces[_.indexOf(urlPieces, \"handoff\") + 1]);\n\t\t\t//Make sure it is cleared before redirecting away\n\t\t\twindow.addEventListener(\"beforeunload\", function (e) {\n\t\t\t\tif (!_.includes(e.target.activeElement.classList, \"loginBtn\")) {\n\t\t\t\t\t// What was clicked is not login button, remove handoff before navigating\"\n\t\t\t\t\tif (window.localStorage.getItem(\"handoff\")) window.localStorage.removeItem(\"handoff\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJvdXRpbmcuanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwic2V0dGluZ3MiLCIkIiwiXyIsInJheWd1biIsIlNtYWxsTW9kYWwiLCJyYWRpbyIsIlJhZGlvIiwiY2hhbm5lbCIsIm1vZHVsZSIsImV4cG9ydHMiLCJBcHAiLCJoYW5kb2ZmV2hpdGVsaXN0Iiwib24iLCJFdmVudHMiLCJDb21tYW5kcyIsIk5hdmlnYXRlIiwidSIsIm9wdHMiLCJ1cmwiLCJSb3V0ZXIiLCJoYW5kb2ZmVXJsIiwic29tZSIsInN0YXJ0c1dpdGgiLCJ4Iiwid2luZG93IiwibG9jYXRpb24iLCJocmVmIiwic2VhcmNoIiwiU2Vzc2lvbiIsImdldCIsImVuY29kZVVSSUNvbXBvbmVudCIsInVzZXJuYW1lIiwiYWxlcnQiLCJsb2dpblJlZGlyZWN0IiwibG9jIiwibmF2aWdhdGUiLCJwYXRoZXIiLCJlYWNoIiwiYWx0VXJsUm9vdHMiLCJjb25jYXQiLCJ1cmxSb290IiwiaXRlbSIsInNsaWNlIiwibGVuZ3RoIiwidHlwZSIsInBhdGgiLCJjYWxsYmFjayIsImhpc3RvcnkiLCJnZXRGcmFnbWVudCIsInRyaWdnZXIiLCJyZXBsYWNlIiwiaXNVbmRlZmluZWQiLCJCdXJuVG9hc3QiLCJuYXZQcm9tcHRDb250ZW50IiwibW9kYWwiLCJ0aXRsZSIsImJvZHkiLCJvbmNlIiwiYWRkRXZlbnRMaXN0ZW5lciIsIlBhZ2VDaGFuZ2UiLCJhcHBlbmQiLCJyZW5kZXIiLCJlbCIsIk1haW5Sb3V0ZXIiLCJleHRlbmQiLCJyb3V0ZXMiLCJsb2dvdXQiLCJpbml0aWFsaXplIiwibGlzdGVuVG8iLCJMb2dvdXRTdWNjZXNzIiwibG9nb3V0U3VjY2VzcyIsImJpbmQiLCJOYXZpZ2F0aW9uUHJvbXB0Iiwic2V0TmF2UHJvbXB0IiwiZXhlY3V0ZSIsImFyZ3MiLCJyb3V0ZSIsInNhZmVQYXRocyIsImluY2x1ZGVzIiwiYXBwbHkiLCJzdG9wTGlzdGVuaW5nIiwiaGFuZG9mZiIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJyZW1vdmVJdGVtIiwiaXNBdXRoZW50aWNhdGVkIiwiaGFzaCIsImxpc3RlblRvT25jZSIsIlNlc3Npb25Mb2FkZWQiLCJjb250ZW50IiwiaW5pdGlhbExvYWQiLCJpbml0aWFsTG9hZGVkIiwibmF2aWdhdGVUb0Jvb2tTZWxlY3RvciIsIkxvZ291dCIsInQiLCJjb29raWVUb2tlbiIsImF1dGhkIiwibm9OYXYiLCJjYXRjaEFsbCIsInVybFBpZWNlcyIsInNwbGl0Iiwic3BsaWNlIiwidmFsaWQiLCJzdGFydCIsInB1c2hTdGF0ZSIsInJvb3QiLCJpbmRleE9mIiwic2V0SXRlbSIsImUiLCJ0YXJnZXQiLCJhY3RpdmVFbGVtZW50IiwiY2xhc3NMaXN0Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTs7OztBQUVBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1DLFdBQVdELFFBQVEsY0FBUixDQUFqQjtBQUNBLElBQU1FLElBQUlGLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUcsSUFBSUgsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNSSxTQUFTSixRQUFRLFFBQVIsQ0FBZjs7QUFFQSxJQUFNSyxhQUFhTCxRQUFRLG1CQUFSLENBQW5COztBQUVBLElBQU1NLFFBQVFQLFNBQVNRLEtBQVQsQ0FBZUMsT0FBZixDQUF1QixRQUF2QixDQUFkOztBQUVBQyxPQUFPQyxPQUFQLEdBQWlCLFVBQVNDLEdBQVQsRUFBYztBQUM5QixLQUFNQyxtQkFBbUIsQ0FBQyxXQUFELEVBQWMsVUFBZCxFQUEwQixVQUExQixFQUFzQyxnQkFBdEMsRUFBd0QsaUJBQXhELEVBQTJFLFlBQTNFLEVBQXlGLFVBQXpGLEVBQ3hCLGlCQUR3QixFQUNMLHNCQURLLEVBQ21CLHFCQURuQixFQUMwQyxxQkFEMUMsRUFDaUUsU0FEakUsQ0FBekI7O0FBR0E7QUFDQU4sT0FBTU8sRUFBTixDQUFTRixJQUFJRyxNQUFKLENBQVdDLFFBQVgsQ0FBb0JDLFFBQTdCLEVBQXVD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QixJQUFrQyxDQUE1QyxDQUF2QztBQUNBO0FBQ0EzRSxVQUFPa0MsZ0JBQVAsQ0FBd0IsY0FBeEIsRUFBd0MsYUFBSztBQUM1QyxRQUFJLENBQUN4RCxFQUFFNEUsUUFBRixDQUFXOEIsRUFBRUMsTUFBRixDQUFTQyxhQUFULENBQXVCQyxTQUFsQyxFQUE2QyxVQUE3QyxDQUFMLEVBQStEO0FBQzlEO0FBQ0EsU0FBSXZGLE9BQU8wRCxZQUFQLENBQW9CQyxPQUFwQixDQUE0QixTQUE1QixDQUFKLEVBQ0MzRCxPQUFPMEQsWUFBUCxDQUFvQkUsVUFBcEIsQ0FBK0IsU0FBL0I7QUFDRDtBQUNELElBTkQ7QUFPQTtBQUNEO0FBQ0QsQ0F6UEQiLCJmaWxlIjoicm91dGluZy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuLy8gUm91dGluZ1xuLy8tLS0tLS0tLS0tLS0tLS0tXG4vLyBTZXQgdXAgYWxsIHRoZSByb3V0ZXMgdXNlZCBieSB0aGUgYXBwXG5cbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IHJheWd1biA9IHJlcXVpcmUoXCJyYXlndW5cIik7XG5cbmNvbnN0IFNtYWxsTW9kYWwgPSByZXF1aXJlKFwiLi4vbGliL3NtYWxsTW9kYWxcIik7XG5cbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihBcHApIHtcblx0Y29uc3QgaGFuZG9mZldoaXRlbGlzdCA9IFtcIi9yZWFsdGltZVwiLCBcIi9hbnN3ZXJzXCIsIFwiL21vbml0b3JcIiwgXCIvcmVzb3VyY2VzdG9yZVwiLCBcIi9hbmFseXRpY3MtYmV0YVwiLCBcIi9hbmFseXRpY3NcIiwgXCIvbGVzc29uc1wiLFxuXHRcdFwiQGluc2lnaHRzLml0LnNpXCIsIFwiQGluc2lnaHRzLm15aXRzaS5jb21cIiwgXCJAbGVzc29ucy5teWl0c2kuY29tXCIsIFwiQGluc2lnaHRzLmRldi5pdC5zaVwiLCBcIi9yZWFkZXJcIl07XG5cblx0Ly8gQ2VudHJhbCBoYW5kbGVyIGZvciBhbGwgVVJMIGNoYW5nZXNcblx0cmFkaW8ub24oQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0ZSwgKHUsIG9wdHMgPSB7fSkgPT4ge1xuXHRcdGxldCB1cmwgPSB1O1xuXHRcdC8vIG51bGwgaXMgaW50ZXJwcmV0ZWQgYXMgXCJyZWRpcmVjdCB0byBwcmV2aW91cyBhdHRlbXB0ZWQgbG9jYXRpb25cIlxuXHRcdGlmICh1cmwgPT09IG51bGwpIHtcblx0XHRcdGlmIChBcHAuUm91dGVyLmhhbmRvZmZVcmwpIHtcblx0XHRcdFx0aWYgKF8uc29tZShoYW5kb2ZmV2hpdGVsaXN0LCB4ID0+IF8uc3RhcnRzV2l0aChcIi9cIiArIEFwcC5Sb3V0ZXIuaGFuZG9mZlVybCwgeCkpKSB7XG5cdFx0XHRcdFx0d2luZG93LmxvY2F0aW9uLmhyZWYgPSBcIi9cIiArIEFwcC5Sb3V0ZXIuaGFuZG9mZlVybCArICh3aW5kb3cubG9jYXRpb24uc2VhcmNoID8gXCI/XCIgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoIDogXCJcIik7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gTmV3IGxvY2F0aW9uXG5cdFx0XHRcdGlmIChfLnNvbWUoaGFuZG9mZldoaXRlbGlzdCwgeCA9PiBfLnN0YXJ0c1dpdGgoXCJAXCIgKyBBcHAuUm91dGVyLmhhbmRvZmZVcmwsIHgpKSkge1xuXHRcdFx0XHRcdHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gXCJodHRwczovL1wiICsgQXBwLlJvdXRlci5oYW5kb2ZmVXJsICtcblx0XHRcdFx0XHRcdCh3aW5kb3cubG9jYXRpb24uc2VhcmNoID8gYD8ke3dpbmRvdy5sb2NhdGlvbi5zZWFyY2h9JnRva2VuPSR7QXBwLlNlc3Npb24uZ2V0KFwidG9rZW5cIil9JnVzZXJuYW1lPSR7ZW5jb2RlVVJJQ29tcG9uZW50KEFwcC5TZXNzaW9uLmdldChcInVzZXJcIikudXNlcm5hbWUpfWAgOlxuXHRcdFx0XHRcdFx0XHRgP3Rva2VuPSR7QXBwLlNlc3Npb24uZ2V0KFwidG9rZW5cIil9JnVzZXJuYW1lPSR7ZW5jb2RlVVJJQ29tcG9uZW50KEFwcC5TZXNzaW9uLmdldChcInVzZXJcIikudXNlcm5hbWUpfWApO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBhbGVydChcIkhhbmRvZmYgcmVqZWN0ZWQuIFBsZWFzZSByZWZyZXNoLlwiKTtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKEFwcC5Sb3V0ZXIubG9naW5SZWRpcmVjdCkge1xuXHRcdFx0XHRjb25zdCBsb2MgPSBBcHAuUm91dGVyLmxvZ2luUmVkaXJlY3Q7XG5cdFx0XHRcdGRlbGV0ZSBBcHAuUm91dGVyLmxvZ2luUmVkaXJlY3Q7XG5cdFx0XHRcdEFwcC5Sb3V0ZXIubmF2aWdhdGUobG9jLnVybCk7XG5cblx0XHRcdFx0bGV0IHBhdGhlciA9IHVybDtcblx0XHRcdFx0Ly8gUmVtb3ZlIHRoZSBsZWFkaW5nIHVybFJvb3Rcblx0XHRcdFx0Xy5lYWNoKHNldHRpbmdzLmFsdFVybFJvb3RzLmNvbmNhdChzZXR0aW5ncy51cmxSb290KSwgaXRlbSA9PiB7XG5cdFx0XHRcdFx0aWYgKF8uc3RhcnRzV2l0aChwYXRoZXIsIGl0ZW0pKVxuXHRcdFx0XHRcdFx0cGF0aGVyID0gcGF0aGVyLnNsaWNlKGl0ZW0ubGVuZ3RoKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0cmF5Z3VuKFwidHJhY2tFdmVudFwiLCB7XG5cdFx0XHRcdFx0dHlwZTogXCJwYWdlVmlld1wiLFxuXHRcdFx0XHRcdHBhdGg6IHBhdGhlcixcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBsb2MuY2FsbGJhY2soKTtcblx0XHRcdH1cblx0XHRcdHVybCA9IFwiL1wiO1xuXHRcdH1cblxuXHRcdGlmICgoXCIvXCIgKyBCYWNrYm9uZS5oaXN0b3J5LmdldEZyYWdtZW50KCkpID09PSB1cmwpXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHQvLyBSZW1vdmUgdGhlIGxlYWRpbmcgdXJsUm9vdFxuXHRcdF8uZWFjaChzZXR0aW5ncy5hbHRVcmxSb290cy5jb25jYXQoc2V0dGluZ3MudXJsUm9vdCksIGl0ZW0gPT4ge1xuXHRcdFx0aWYgKF8uc3RhcnRzV2l0aCh1cmwsIGl0ZW0pKVxuXHRcdFx0XHR1cmwgPSB1cmwuc2xpY2UoaXRlbS5sZW5ndGgpO1xuXHRcdH0pO1xuXG5cdFx0bGV0IHRyaWdnZXIgPSB0cnVlLCByZXBsYWNlID0gZmFsc2U7XG5cdFx0aWYgKCFfLmlzVW5kZWZpbmVkKG9wdHMudHJpZ2dlcikpXG5cdFx0XHR0cmlnZ2VyID0gZmFsc2U7XG5cdFx0aWYgKG9wdHMucmVwbGFjZSlcblx0XHRcdHJlcGxhY2UgPSB0cnVlO1xuXG5cdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLkJ1cm5Ub2FzdCk7XG5cblx0XHRpZiAoQXBwLlJvdXRlci5uYXZQcm9tcHRDb250ZW50KSB7XG5cdFx0XHRjb25zdCBtb2RhbCA9IG5ldyBTbWFsbE1vZGFsKHsgdGl0bGU6IFwiPHNwYW4gY2xhc3M9J2ZhbCBmYS1leGNsYW1hdGlvbi10cmlhbmdsZScvPiBOYXZpZ2F0aW9uIFdhcm5pbmdcIiwgYm9keTogQXBwLlJvdXRlci5uYXZQcm9tcHRDb250ZW50IH0pO1xuXHRcdFx0bW9kYWwub25jZShcImJ1dHRvbjpva1wiLCAoKSA9PiB7XG5cdFx0XHRcdEFwcC5Sb3V0ZXIubmF2UHJvbXB0Q29udGVudCA9IG51bGw7XG5cdFx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsIG51bGwpO1xuXHRcdFx0XHRBcHAuUm91dGVyLm5hdmlnYXRlKHVybCwgeyB0cmlnZ2VyOiB0cmlnZ2VyLCByZXBsYWNlOiByZXBsYWNlIH0pO1xuXG5cdFx0XHRcdHJheWd1bihcInRyYWNrRXZlbnRcIiwge1xuXHRcdFx0XHRcdHR5cGU6IFwicGFnZVZpZXdcIixcblx0XHRcdFx0XHRwYXRoOiB1cmwsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuUGFnZUNoYW5nZSwgdXJsKTtcblx0XHRcdH0pO1xuXG5cdFx0XHQkKFwiI21vZGFscyAubW9kYWwtY29udGFpbmVyXCIpLmFwcGVuZChtb2RhbC5yZW5kZXIoKS5lbCk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0QXBwLlJvdXRlci5uYXZpZ2F0ZSh1cmwsIHsgdHJpZ2dlcjogdHJpZ2dlciwgcmVwbGFjZTogcmVwbGFjZSB9KTtcblxuXHRcdHJheWd1bihcInRyYWNrRXZlbnRcIiwge1xuXHRcdFx0dHlwZTogXCJwYWdlVmlld1wiLFxuXHRcdFx0cGF0aDogdXJsLFxuXHRcdH0pO1xuXHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5QYWdlQ2hhbmdlLCB1cmwpO1xuXHR9KTtcblxuXHRjb25zdCBNYWluUm91dGVyID0gQmFja2JvbmUuUm91dGVyLmV4dGVuZCh7XG5cdFx0cm91dGVzOiB7XG5cdFx0XHRcIlwiOiBcImluaXRpYWxMb2FkXCIsXG5cdFx0XHRcImVkdWNhdG9ycy9jb25zb2xlXCI6IFwibmF2aWdhdGVUb0Jvb2tTZWxlY3RvclwiLFxuXHRcdFx0bG9nb3V0OiBcImxvZ291dFwiLFxuXHRcdFx0XCJoYW5kb2ZmLypwYXRoXCI6IFwiaGFuZG9mZlwiLFxuXHRcdFx0XCIuKlwiOiBcImNhdGNoQWxsXCIsXG5cdFx0fSxcblxuXHRcdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dGhpcy5saXN0ZW5UbyhyYWRpbywgQXBwLkV2ZW50cy5Mb2dvdXRTdWNjZXNzLCB0aGlzLmxvZ291dFN1Y2Nlc3MuYmluZCh0aGlzKSk7XG5cblx0XHRcdHJhZGlvLm9uKEFwcC5FdmVudHMuQ29tbWFuZHMuTmF2aWdhdGlvblByb21wdCwgdGhpcy5zZXROYXZQcm9tcHQuYmluZCh0aGlzKSk7XG5cdFx0fSxcblxuXHRcdGV4ZWN1dGU6IGZ1bmN0aW9uKGNhbGxiYWNrLCBhcmdzLCByb3V0ZSkge1xuXHRcdFx0Ly8gU29tZSBwYXRocyBkb24ndCBuZWVkIGEgbG9naW4gY2hlY2tcblx0XHRcdGNvbnN0IHNhZmVQYXRocyA9IFtcImxvZ2luOlwiLCBcImxvZ291dFwiXTtcblx0XHRcdGlmIChfLmluY2x1ZGVzKHNhZmVQYXRocywgcm91dGUpICYmIGNhbGxiYWNrKVxuXHRcdFx0XHRyZXR1cm4gY2FsbGJhY2suYXBwbHkodGhpcywgYXJncyk7XG5cblx0XHRcdHRoaXMuc3RvcExpc3RlbmluZyhBcHAuU2Vzc2lvbik7XG5cdFx0XHRsZXQgaGFuZG9mZiA9IGZhbHNlO1xuXG5cdFx0XHQvLyBIYW5kb2ZmIGlzIGZvciByZWRpcmVjdGluZyB0byBhbm90aGVyIElUU0kgZW5kcG9pbnQgYWZ0ZXIgbG9naW5cblx0XHRcdGlmIChyb3V0ZSA9PT0gXCJoYW5kb2ZmXCIpXG5cdFx0XHRcdGhhbmRvZmYgPSB0cnVlO1xuXG5cdFx0XHQvL0lmIHRoZXJlIGlzIGEgaGFuZG9mZiBzdG9yZWQgaW4gbG9jYWxTdG9yYWdlXG5cdFx0XHRpZiAocm91dGUgIT09IFwiaGFuZG9mZlwiICYmIHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhhbmRvZmZcIikpIHtcblx0XHRcdFx0Y29uc3QgaGFuZG9mZlVybCA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhhbmRvZmZcIik7XG5cdFx0XHRcdC8vQ2xlYXIgaGFuZG9mZiBmcm9tIGxvY2FsU3RvcmFnZVxuXHRcdFx0XHR3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJoYW5kb2ZmXCIpO1xuXHRcdFx0XHQvL1JlZGlyZWN0IHRvIHRoZSBoYW5kb2ZmIHVybFxuXHRcdFx0XHR0aGlzLmhhbmRvZmYoaGFuZG9mZlVybCk7XG5cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTd2l0Y2ggdG8gbG9naW4gcGFnZT9cblx0XHRcdGlmIChBcHAuU2Vzc2lvbi5nZXQoXCJjaGVja2VkXCIpKSB7XG5cdFx0XHRcdGlmICghQXBwLlNlc3Npb24uaXNBdXRoZW50aWNhdGVkKCkpIHtcblx0XHRcdFx0XHRpZiAoaGFuZG9mZilcblx0XHRcdFx0XHRcdHRoaXMuaGFuZG9mZlVybCA9IGFyZ3NbMF0gKyAoYXJnc1sxXSA/IFwiP1wiICsgYXJnc1sxXSA6IHdpbmRvdy5sb2NhdGlvbi5oYXNoID8gd2luZG93LmxvY2F0aW9uLmhhc2ggOiBcIlwiKTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHR0aGlzLmxvZ2luUmVkaXJlY3QgPSB7IGNhbGxiYWNrOiBjYWxsYmFjay5iaW5kKHRoaXMsIC4uLmFyZ3MpLCB1cmw6IEJhY2tib25lLmhpc3RvcnkuZ2V0RnJhZ21lbnQoKSB9O1xuXHRcdFx0XHRcdHRoaXMubmF2aWdhdGUoXCIvbG9naW5cIiwgeyB0cmlnZ2VyOiB0cnVlLCByZXBsYWNlOiB0cnVlIH0pO1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIGlmIChjYWxsYmFjaykge1xuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLmhhbmRvZmZVcmw7XG5cdFx0XHRcdFx0cmV0dXJuIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0dGhpcy5saXN0ZW5Ub09uY2UocmFkaW8sIEFwcC5FdmVudHMuU2Vzc2lvbkxvYWRlZCwgKCkgPT4ge1xuXHRcdFx0XHRcdGlmICghQXBwLlNlc3Npb24uZ2V0KFwiY2hlY2tlZFwiKSB8fCAhQXBwLlNlc3Npb24uaXNBdXRoZW50aWNhdGVkKCkpIHtcblx0XHRcdFx0XHRcdGlmIChoYW5kb2ZmKVxuXHRcdFx0XHRcdFx0XHR0aGlzLmhhbmRvZmZVcmwgPSBhcmdzWzBdICsgKGFyZ3NbMV0gPyBcIj9cIiArIGFyZ3NbMV0gOiB3aW5kb3cubG9jYXRpb24uaGFzaCA/IHdpbmRvdy5sb2NhdGlvbi5oYXNoIDogXCJcIik7XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdHRoaXMubG9naW5SZWRpcmVjdCA9IHsgY2FsbGJhY2s6IGNhbGxiYWNrLmJpbmQodGhpcywgLi4uYXJncyksIHVybDogQmFja2JvbmUuaGlzdG9yeS5nZXRGcmFnbWVudCgpIH07XG5cdFx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlKFwiL2xvZ2luXCIsIHsgdHJpZ2dlcjogdHJ1ZSwgcmVwbGFjZTogdHJ1ZSB9KTtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZSBpZiAoY2FsbGJhY2spIHtcblx0XHRcdFx0XHRcdGRlbGV0ZSB0aGlzLmhhbmRvZmZVcmw7XG5cdFx0XHRcdFx0XHRyZXR1cm4gY2FsbGJhY2suYXBwbHkodGhpcywgYXJncyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRzZXROYXZQcm9tcHQ6IGZ1bmN0aW9uKGNvbnRlbnQpIHtcblx0XHRcdEFwcC5Sb3V0ZXIubmF2UHJvbXB0Q29udGVudCA9IGNvbnRlbnQ7XG5cdFx0XHRpZiAoY29udGVudClcblx0XHRcdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIiwgKCkgPT4gY29udGVudCk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsIG51bGwpO1xuXHRcdH0sXG5cblx0XHRpbml0aWFsTG9hZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIXRoaXMuaW5pdGlhbExvYWRlZCkge1xuXHRcdFx0XHR0aGlzLmluaXRpYWxMb2FkZWQgPSB0cnVlO1xuXHRcdFx0XHR0aGlzLm5hdmlnYXRlKFwiL2hvbWVcIiwgeyB0cmlnZ2VyOiB0cnVlLCByZXBsYWNlOiB0cnVlIH0pO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRuYXZpZ2F0ZVRvQm9va1NlbGVjdG9yOiBmdW5jdGlvbigpIHtcblx0XHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0ZSwgc2V0dGluZ3MudXJsUm9vdCArIFwiL2NvbnNvbGUvYm9va3NcIik7XG5cdFx0fSxcblxuXHRcdGxvZ291dDogZnVuY3Rpb24oKSB7XG5cdFx0XHR0aGlzLmluaXRpYWxMb2FkZWQgPSBmYWxzZTtcblx0XHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5Mb2dvdXQpO1xuXHRcdH0sXG5cblx0XHRoYW5kb2ZmOiBmdW5jdGlvbihoYW5kb2ZmKSB7XG5cdFx0XHQvLyBMb2NhbCBsb2NhdGlvblxuXHRcdFx0aWYgKF8uc29tZShoYW5kb2ZmV2hpdGVsaXN0LCB4ID0+IF8uc3RhcnRzV2l0aChcIi9cIiArIGhhbmRvZmYsIHgpKSkge1xuXHRcdFx0XHR3aW5kb3cubG9jYXRpb24uaHJlZiA9IFwiL1wiICsgaGFuZG9mZiArICh3aW5kb3cubG9jYXRpb24uc2VhcmNoID8gXCI/XCIgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoIDogXCJcIik7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTmV3IGxvY2F0aW9uXG5cdFx0XHRpZiAoXy5zb21lKGhhbmRvZmZXaGl0ZWxpc3QsIHggPT4gXy5zdGFydHNXaXRoKFwiQFwiICsgaGFuZG9mZiwgeCkpKSB7XG5cdFx0XHRcdGNvbnN0IHQgPSAoQXBwLlNlc3Npb24uZ2V0KFwidXNlclwiKSB8fCB7fSkuY29va2llVG9rZW4gfHwgQXBwLlNlc3Npb24uZ2V0KFwidG9rZW5cIik7XG5cdFx0XHRcdHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gXCJodHRwczovL1wiICsgaGFuZG9mZiArXG5cdFx0XHRcdFx0KHdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggPyBgPyR7d2luZG93LmxvY2F0aW9uLnNlYXJjaH0mdG9rZW49JHt0fSZ1c2VybmFtZT0ke2VuY29kZVVSSUNvbXBvbmVudChBcHAuU2Vzc2lvbi5nZXQoXCJ1c2VyXCIpLnVzZXJuYW1lKX1gIDpcblx0XHRcdFx0XHRcdGA/dG9rZW49JHt0fSZ1c2VybmFtZT0ke2VuY29kZVVSSUNvbXBvbmVudChBcHAuU2Vzc2lvbi5nZXQoXCJ1c2VyXCIpLnVzZXJuYW1lKX1gKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gYWxlcnQoXCJIYW5kb2ZmIHJlamVjdGVkXCIpO1xuXHRcdH0sXG5cblx0XHRsb2dvdXRTdWNjZXNzOiBmdW5jdGlvbihhdXRoZCwgbm9OYXYpIHtcblx0XHRcdGlmICghbm9OYXYpXG5cdFx0XHRcdHRoaXMubmF2aWdhdGUoXCIvbG9naW5cIiwgeyB0cmlnZ2VyOiB0cnVlLCByZXBsYWNlOiB0cnVlIH0pO1xuXHRcdH0sXG5cblx0XHRjYXRjaEFsbDogZnVuY3Rpb24oKSB7XG5cdFx0XHR0aGlzLm5hdmlnYXRlKFwiL1wiLCB7IHRyaWdnZXI6IHRydWUsIHJlcGxhY2U6IHRydWUgfSk7XG5cdFx0fSxcblx0fSk7XG5cblx0QXBwLlJvdXRlciA9IG5ldyBNYWluUm91dGVyKCk7XG5cblx0Y29uc3QgdXJsUGllY2VzID0gd2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoXCIvXCIpO1xuXG5cdHdoaWxlKCF1cmxQaWVjZXNbM10pXG5cdFx0dXJsUGllY2VzLnNwbGljZSgzLCAxKTtcblxuXHRjb25zdCB2YWxpZCA9IHNldHRpbmdzLmFsdFVybFJvb3RzLmNvbmNhdChbc2V0dGluZ3MudXJsUm9vdF0pO1xuXHRpZiAoIV8uaW5jbHVkZXModmFsaWQsIFwiL1wiICsgdXJsUGllY2VzWzNdKSkge1xuXHRcdGFsZXJ0KFwiVGhlcmUgd2FzIGEgcHJvYmxlbSBsb2FkaW5nIHRoZSBzaXRlLiBQbGVhc2UgdHJ5IGFnYWluLCBvciBjaGVjayB0aGUgYWRkcmVzc1wiKTtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyBEb24ndCByb3V0ZSBhbnl3aGVyZSB1bnRpbCB3ZSBrbm93IGlmIHdlJ3JlIGxvZ2dlZCBpbiBvciBub3Rcblx0cmFkaW8ub25jZShBcHAuRXZlbnRzLlNlc3Npb25Mb2FkZWQsICgpID0+IHtcblx0XHRCYWNrYm9uZS5oaXN0b3J5LnN0YXJ0KHsgcHVzaFN0YXRlOiB0cnVlLCByb290OiB1cmxQaWVjZXNbM10gfSk7XG5cdH0pO1xuXG5cdC8vSWYgYSB1cmxQaWVjZXMgY29udGFpbnMgaGFuZG9mZlxuXHRpZiAoIXdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhhbmRvZmZcIikgJiYgXy5pbmNsdWRlcyh1cmxQaWVjZXMsIFwiaGFuZG9mZlwiKSAmJiB1cmxQaWVjZXNbXy5pbmRleE9mKHVybFBpZWNlcywgXCJoYW5kb2ZmXCIpICsgMV0pIHtcblx0XHRpZiAoXy5pbmNsdWRlcyhoYW5kb2ZmV2hpdGVsaXN0LCBcIi9cIiArIHVybFBpZWNlc1tfLmluZGV4T2YodXJsUGllY2VzLCBcImhhbmRvZmZcIikgKyAxXSkgfHwgXy5pbmNsdWRlcyhoYW5kb2ZmV2hpdGVsaXN0LCBcIkBcIiArIHVybFBpZWNlc1tfLmluZGV4T2YodXJsUGllY2VzLCBcImhhbmRvZmZcIikgKyAxXSkpIHtcblx0XHRcdC8vU3RvcmUgaXQgaW4gbG9jYWxTdG9yYWdlXG5cdFx0XHR3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJoYW5kb2ZmXCIsIHVybFBpZWNlc1tfLmluZGV4T2YodXJsUGllY2VzLCBcImhhbmRvZmZcIikgKyAxXSk7XG5cdFx0XHQvL01ha2Ugc3VyZSBpdCBpcyBjbGVhcmVkIGJlZm9yZSByZWRpcmVjdGluZyBhd2F5XG5cdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJlZm9yZXVubG9hZFwiLCBlID0+IHtcblx0XHRcdFx0aWYgKCFfLmluY2x1ZGVzKGUudGFyZ2V0LmFjdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LCBcImxvZ2luQnRuXCIpKSB7XG5cdFx0XHRcdFx0Ly8gV2hhdCB3YXMgY2xpY2tlZCBpcyBub3QgbG9naW4gYnV0dG9uLCByZW1vdmUgaGFuZG9mZiBiZWZvcmUgbmF2aWdhdGluZ1wiXG5cdFx0XHRcdFx0aWYgKHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImhhbmRvZmZcIikpXG5cdFx0XHRcdFx0XHR3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJoYW5kb2ZmXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cbn07Il19",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar settings = require(\"app-settings\");\nvar raygun = require(\"raygun\");\nvar App = require(\"../index\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar WarnModal = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"warn-modal\",\n\n\ttype: \"warn\",\n\n\ttemplate: require(\"./templates/loginModal.nunj\").logoutWarning,\n\n\tevents: {\n\t\t\"click .relogin\": \"relogin\",\n\t\t\"click .ignore\": \"ignore\"\n\t},\n\n\trelogin: function relogin() {\n\t\tApp.Session.updateSession();\n\t},\n\n\tignore: function ignore() {\n\t\tthis.trigger(\"ignore\");\n\t}\n});\n\nvar LoginModal = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"login-modal\",\n\n\ttype: \"login\",\n\n\ttemplate: require(\"./templates/loginModal.nunj\").logoutTimeout,\n\n\tui: {\n\t\tusername: \"input[role='username']\",\n\t\tpassword: \"input[role='password']\",\n\t\tbutton: \"input[type='submit']\",\n\t\tinfo: \".info-text\",\n\t\tspinner: \"span.spinner-icon\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.button\": \"login\",\n\t\t\"click button.ignore\": \"ignore\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.listenTo(radio, App.Events.LoginSuccess, this.success.bind(this));\n\t\tthis.listenTo(radio, App.Events.LoginFailure, this.failure.bind(this));\n\n\t\tthis.host = options.host;\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this = this;\n\n\t\t// Render a background\n\t\t$(\".modal-element\", $(this.host)).removeClass(\"hide\");\n\t\t$(\"body\").addClass(\"hide-overflow\");\n\n\t\t// If there's any other modals visible right now, hide them, and restore it after\n\t\tthis.dunked = $.map($(\".modal-container\", $(this.host)).children(), function (item) {\n\t\t\tif ($(item).is(_this.$el)) return;\n\t\t\t$(item).addClass(\"hide\");\n\t\t\treturn $(item).getPath();\n\t\t});\n\t},\n\n\tonDestroy: function onDestroy() {\n\t\t// Clean up the background\n\t\tif (this.dunked && this.dunked.length === 0) {\n\t\t\t$(\".modal-element\", $(this.host)).addClass(\"hide\");\n\t\t\t$(\"body\").removeClass(\"hide-overflow\");\n\t\t}\n\n\t\tif (this.dunked) {\n\t\t\t_.each(this.dunked, function (item) {\n\t\t\t\tif (!item) return;\n\t\t\t\tvar el = $(item);\n\t\t\t\tif (el && el.length) el.removeClass(\"hide\");\n\t\t\t});\n\t\t} else {\n\t\t\t$(\".modal-container\", $(this.host)).empty();\n\t\t}\n\t},\n\n\tlogin: function login(evt) {\n\t\tevt.preventDefault();\n\n\t\tradio.trigger(App.Events.Commands.Login, { username: _.trim(this.ui.username.val()), password: this.ui.password.val() });\n\t\tthis.ui.button.attr(\"disabled\", true);\n\n\t\tthis.ui.spinner.removeClass(\"hide\");\n\t\tthis.ui.info.removeClass(\"error hide\").text(\"Logging in...\");\n\t},\n\n\tignore: function ignore() {\n\t\tif (this.dunked) {\n\t\t\t_.each(this.dunked, function (item) {\n\t\t\t\tif (!item) return;\n\t\t\t\tvar el = $(item);\n\t\t\t\tif (el && el.length && el.destroy) el.destroy();\n\t\t\t});\n\t\t}\n\t\tradio.trigger(App.Events.Commands.Navigate, null);\n\t\tthis.destroy();\n\t},\n\n\tfailure: function failure(err) {\n\t\tthis.ui.spinner.addClass(\"hide\");\n\t\tthis.ui.info.addClass(\"error\").removeClass(\"hide\").text(\"Login failed: \" + err.detail);\n\t\tthis.ui.button.attr(\"disabled\", false);\n\t},\n\n\tsuccess: function success() {\n\t\tthis.destroy();\n\t}\n});\n\nvar Session = Backbone.Model.extend({\n\tdefaults: {},\n\n\tinitialize: function initialize() {\n\t\tthis.listenTo(radio, App.Events.Commands.Login, this.doLogin, this);\n\t\tthis.listenTo(radio, App.Events.Commands.Logout, this.doLogout, this);\n\t\tthis.listenTo(radio, App.Events.UpdateUserDetails, this.updateUserDetails, this);\n\t\tthis.listenTo(radio, App.Events.LogoutSuccess, this.logoutSuccess.bind(this));\n\n\t\tradio.reply(App.Events.Requests.CurrentUser, this.getUser, this);\n\t\tradio.reply(App.Events.Requests.Impersonator, this.getImpersonator, this);\n\t\tradio.reply(App.Events.Requests.IsAuthenticated, this.isAuthenticated, this);\n\t\tradio.reply(App.Events.Requests.IsImpersonating, this.isImpersonating, this);\n\n\t\tthis.listenTo(radio, App.Events.ModalContextChange, this.changeModalContext.bind(this));\n\n\t\tthis.host = \"#modals\";\n\n\t\t// Listen for the end of all Ajax calls, and update the session timeout\n\t\t//$(document).ajaxComplete(function() { this.refreshTimeout(); }.bind(this));\n\n\t\t// Immediately kick off an authentication check that will run while the rest of the app does its thing\n\t\tthis.fetch({ success: this.checkSuccess.bind(this), error: this.checkError.bind(this), uncancellable: true });\n\t},\n\n\tidAttribute: \"_id\",\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/login/session\";\n\t},\n\n\tchangeModalContext: function changeModalContext(context) {\n\t\tthis.host = context || \"#modals\";\n\t},\n\n\tcheckSuccess: function checkSuccess(model) {\n\t\tmodel.set({ checked: true, authenticated: true, date: new Date().getTime(), expiry: new Date().getTime() + settings.sessionTimeout });\n\t\tthis.loginTimeoutTimer();\n\n\t\tif (!this.get(\"user\").customGroups) this.get(\"user\").customGroups = [];\n\n\t\traygun(\"setUser\", {\n\t\t\tisAnonymous: false,\n\t\t\tidentifier: this.get(\"user\").username,\n\t\t\temail: this.get(\"user\").email,\n\t\t\tfirstName: this.get(\"user\").firstname,\n\t\t\tfullName: this.get(\"user\").firstname + \" \" + this.get(\"user\").surname,\n\t\t\tuuid: this.get(\"user\")._id\n\t\t});\n\n\t\tradio.trigger(App.Events.SessionLoaded, this.isAuthenticated());\n\t},\n\n\tcheckError: function checkError(model) {\n\t\tmodel.set({ checked: true });\n\n\t\tradio.trigger(App.Events.SessionLoaded, this.isAuthenticated());\n\t},\n\n\tgetUser: function getUser() {\n\t\treturn this.get(\"user\");\n\t},\n\n\tgetImpersonator: function getImpersonator() {\n\t\treturn this.get(\"impersonator\");\n\t},\n\n\tisAuthenticated: function isAuthenticated() {\n\t\treturn this.get(\"authenticated\") && this.has(\"date\") && this.get(\"expiry\") > new Date().getTime();\n\t},\n\n\tisImpersonating: function isImpersonating() {\n\t\treturn this.get(\"impersonating\");\n\t},\n\n\tupdateSession: function updateSession() {\n\t\tclearInterval(this.logoutTimer);\n\t\tthis.stopListening(this.loginModal, \"ignore\");\n\t\tif (this.loginModal) this.loginModal.destroy();\n\t\tthis.loginModal = null;\n\t\tdelete this.ignoreWarning;\n\t\tthis.fetch({\n\t\t\tsuccess: this.sessionUpdated.bind(this),\n\t\t\terror: this.sessionUpdateFail.bind(this),\n\t\t\tuncancellable: true\n\t\t});\n\t},\n\n\tsessionUpdated: function sessionUpdated() {\n\t\tthis.set({ expiry: new Date().getTime() + settings.sessionTimeout });\n\t\tthis.loginTimeoutTimer();\n\t},\n\n\tsessionUpdateFail: function sessionUpdateFail() {\n\t\tthis.logoutSuccess();\n\t\tradio.trigger(App.Events.Commands.Navigate, \"/\");\n\t},\n\n\tupdateUserDetails: function updateUserDetails(user) {\n\t\tthis.set({ user: user });\n\t},\n\n\t/*refreshTimeout: function() {\n \tthis.set({expiry: new Date().getTime() + settings.sessionTimeout});\n },*/\n\n\tshowWarningModal: function showWarningModal() {\n\t\tvar _this2 = this;\n\n\t\tthis.loginModal = new WarnModal({ Session: this });\n\t\t$(\"body\").append(this.loginModal.render().el);\n\t\tthis.listenToOnce(this.loginModal, \"ignore\", function () {\n\t\t\tif (_this2.loginModal) _this2.loginModal.destroy();\n\t\t\t_this2.loginModal = null;\n\t\t\t_this2.ignoreWarning = true;\n\t\t});\n\t},\n\n\tshowLoginModal: function showLoginModal() {\n\t\tthis.loginModal = new LoginModal({ host: this.host });\n\t\t$(\".modal-container\", $(this.host)).append(this.loginModal.render().el);\n\t},\n\n\tloginTimeoutWarn: function loginTimeoutWarn() {\n\t\t// Warn the user 10 mins before logout\n\t\tvar warnAt = 10 * 60 * 1000;\n\n\t\tif (this.get(\"expiry\") < new Date().getTime()) {\n\t\t\tthis.set({ authenticated: false, impersonating: false });\n\t\t\tradio.trigger(App.Events.LogoutSuccess, this.isAuthenticated(), true);\n\n\t\t\tif (this.loginModal && this.loginModal.type === \"warn\") {\n\t\t\t\tthis.stopListening(this.loginModal, \"ignore\");\n\t\t\t\tthis.loginModal.destroy();\n\t\t\t\tthis.loginModal = null;\n\t\t\t}\n\t\t\tif (!this.loginModal) {\n\t\t\t\tthis.showLoginModal();\n\t\t\t\tdelete this.ignoreWarning;\n\t\t\t\tclearInterval(this.logoutTimer);\n\t\t\t}\n\t\t} else if (!this.ignoreWarning && this.get(\"expiry\") - new Date().getTime() <= warnAt) {\n\t\t\tif (!this.loginModal) this.showWarningModal();\n\t\t}\n\t},\n\n\tloginTimeoutTimer: function loginTimeoutTimer() {\n\t\tif (this.logoutTimer) clearInterval(this.logoutTimer);\n\t\tthis.logoutTimer = setInterval(this.loginTimeoutWarn.bind(this), 5000);\n\t},\n\n\tdoLogin: function doLogin(opts) {\n\t\tthis.oldUser = this.get(\"user\") ? this.get(\"user\").username : null;\n\t\tclearInterval(this.logoutTimer);\n\t\tdelete this.ignoreWarning;\n\t\t$.ajax({\n\t\t\tmethod: \"POST\",\n\t\t\tdataType: \"json\",\n\t\t\turl: settings.urlRoot + \"/api/1.0/login\" + (opts.handoff ? \"?handoff=true\" : \"\"),\n\t\t\tdata: { username: _.trim(opts.username), password: opts.password, withNav: true, ui: true },\n\t\t\tsuccess: this.loginSuccess.bind(this),\n\t\t\terror: this.loginFailure.bind(this),\n\t\t\tuncancellable: true\n\t\t});\n\t},\n\n\tloginSuccess: function loginSuccess(data, status) {\n\t\tif (status === \"success\" && data.success) {\n\t\t\t// Save the user details\n\t\t\tdelete data.success;\n\t\t\tdelete this.ignoreWarning;\n\n\t\t\tdata.authenticated = true;\n\t\t\tdata.date = new Date().getTime();\n\t\t\tdata.expiry = new Date().getTime() + settings.sessionTimeout;\n\t\t\tthis.set(data);\n\n\t\t\tif (!this.get(\"user\").customGroups) this.get(\"user\").customGroups = [];\n\n\t\t\tif (this.loginModal) this.loginModal = null;\n\t\t\tthis.loginTimeoutTimer();\n\n\t\t\traygun(\"setUser\", {\n\t\t\t\tisAnonymous: false,\n\t\t\t\tidentifier: this.get(\"user\").username,\n\t\t\t\temail: this.get(\"user\").email,\n\t\t\t\tfirstName: this.get(\"user\").firstname,\n\t\t\t\tfullName: this.get(\"user\").firstname + \" \" + this.get(\"user\").surname,\n\t\t\t\tuuid: this.get(\"user\")._id\n\t\t\t});\n\n\t\t\tradio.trigger(App.Events.SessionLoaded, this.isAuthenticated());\n\t\t\tradio.trigger(App.Events.LoginSuccess, this.isAuthenticated());\n\n\t\t\t// Check if we've logged in as a different user\n\t\t\tif (this.oldUser && this.oldUser !== this.get(\"user\").username) radio.trigger(App.Events.Commands.Navigate, \"/\");\n\t\t} else {\n\t\t\tradio.trigger(App.Events.LoginFailure, data);\n\t\t}\n\t},\n\n\tloginFailure: function loginFailure(xhr) {\n\t\tvar answer = App.parseResponse(xhr);\n\t\tradio.trigger(App.Events.LoginFailure, answer);\n\t},\n\n\tdoLogout: function doLogout() {\n\t\tvar _this3 = this;\n\n\t\t$.ajax({\n\t\t\tmethod: \"GET\",\n\t\t\turl: settings.urlRoot + \"/api/1.0/login/logout\",\n\t\t\tsuccess: function success() {\n\t\t\t\t_this3.logoutSuccess();\n\t\t\t},\n\t\t\terror: function error(xhr) {\n\t\t\t\tvar answer = App.parseResponse(xhr);\n\t\t\t\twindow.alert(answer.detail || answer.info);\n\t\t\t},\n\t\t\tuncancellable: true\n\t\t});\n\t},\n\n\tlogoutSuccess: function logoutSuccess(authd) {\n\t\t// If we've triggered this method ourselves, prevent a loop\n\t\tif (_.isBoolean(authd)) return;\n\n\t\traygun(\"setUser\", {\n\t\t\tisAnonymous: true,\n\t\t\tidentifier: \"\"\n\t\t});\n\n\t\tthis.unset(\"user\");\n\t\tthis.unset(\"date\");\n\t\tthis.unset(\"navigation\");\n\t\tthis.unset(\"impersonator\");\n\t\tthis.set({ authenticated: false, impersonating: false });\n\t\tclearInterval(this.logoutTimer);\n\t\tdelete this.ignoreWarning;\n\n\t\tradio.trigger(App.Events.LogoutSuccess, this.isAuthenticated());\n\t}\n});\n\nmodule.exports = function () {\n\treturn new Session({ authenticated: false, checked: false });\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNlc3Npb24uanMiXSwibmFtZXMiOlsiJCIsInJlcXVpcmUiLCJfIiwiQmFja2JvbmUiLCJzZXR0aW5ncyIsInJheWd1biIsIkFwcCIsInJhZGlvIiwiUmFkaW8iLCJjaGFubmVsIiwiV2Fybk1vZGFsIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJleHRlbmQiLCJ0YWdOYW1lIiwiY2xhc3NOYW1lIiwidHlwZSIsInRlbXBsYXRlIiwibG9nb3V0V2FybmluZyIsImV2ZW50cyIsInJlbG9naW4iLCJTZXNzaW9uIiwidXBkYXRlU2Vzc2lvbiIsImlnbm9yZSIsInRyaWdnZXIiLCJMb2dpbk1vZGFsIiwibG9nb3V0VGltZW91dCIsInVpIiwidXNlcm5hbWUiLCJwYXNzd29yZCIsImJ1dHRvbiIsImluZm8iLCJzcGlubmVyIiwiaW5pdGlhbGl6ZSIsIm9wdGlvbnMiLCJsaXN0ZW5UbyIsIkV2ZW50cyIsIkxvZ2luU3VjY2VzcyIsInN1Y2Nlc3MiLCJiaW5kIiwiTG9naW5GYWlsdXJlIiwiZmFpbHVyZSIsImhvc3QiLCJvblJlbmRlciIsInJlbW92ZUNsYXNzIiwiYWRkQ2xhc3MiLCJkdW5rZWQiLCJtYXAiLCJjaGlsZHJlbiIsIml0ZW0iLCJpcyIsIiRlbCIsImdldFBhdGgiLCJvbkRlc3Ryb3kiLCJsZW5ndGgiLCJlYWNoIiwiZWwiLCJlbXB0eSIsImxvZ2luIiwiZXZ0IiwicHJldmVudERlZmF1bHQiLCJDb21tYW5kcyIsIkxvZ2luIiwidHJpbSIsInZhbCIsImF0dHIiLCJ0ZXh0IiwiZGVzdHJveSIsIk5hdmlnYXRlIiwiZXJyIiwiZGV0YWlsIiwiTW9kZWwiLCJkZWZhdWx0cyIsImRvTG9naW4iLCJMb2dvdXQiLCJkb0xvZ291dCIsIlVwZGF0ZVVzZXJEZXRhaWxzIiwidXBkYXRlVXNlckRldGFpbHMiLCJMb2dvdXRTdWNjZXNzIiwibG9nb3V0U3VjY2VzcyIsInJlcGx5IiwiUmVxdWVzdHMiLCJDdXJyZW50VXNlciIsImdldFVzZXIiLCJJbXBlcnNvbmF0b3IiLCJnZXRJbXBlcnNvbmF0b3IiLCJJc0F1dGhlbnRpY2F0ZWQiLCJpc0F1dGhlbnRpY2F0ZWQiLCJJc0ltcGVyc29uYXRpbmciLCJpc0ltcGVyc29uYXRpbmciLCJNb2RhbENvbnRleHRDaGFuZ2UiLCJjaGFuZ2VNb2RhbENvbnRleHQiLCJmZXRjaCIsImNoZWNrU3VjY2VzcyIsImVycm9yIiwiY2hlY2tFcnJvciIsInVuY2FuY2VsbGFibGUiLCJpZEF0dHJpYnV0ZSIsInVybCIsInVybFJvb3QiLCJjb250ZXh0IiwibW9kZWwiLCJzZXQiLCJjaGVja2VkIiwiYXV0aGVudGljYXRlZCIsImRhdGUiLCJEYXRlIiwiZ2V0VGltZSIsImV4cGlyeSIsInNlc3Npb25UaW1lb3V0IiwibG9naW5UaW1lb3V0VGltZXIiLCJnZXQiLCJjdXN0b21Hcm91cHMiLCJpc0Fub255bW91cyIsImlkZW50aWZpZXIiLCJlbWFpbCIsImZpcnN0TmFtZSIsImZpcnN0bmFtZSIsImZ1bGxOYW1lIiwic3VybmFtZSIsInV1aWQiLCJfaWQiLCJTZXNzaW9uTG9hZGVkIiwiaGFzIiwiY2xlYXJJbnRlcnZhbCIsImxvZ291dFRpbWVyIiwic3RvcExpc3RlbmluZyIsImxvZ2luTW9kYWwiLCJpZ25vcmVXYXJuaW5nIiwic2Vzc2lvblVwZGF0ZWQiLCJzZXNzaW9uVXBkYXRlRmFpbCIsInVzZXIiLCJzaG93V2FybmluZ01vZGFsIiwiYXBwZW5kIiwicmVuZGVyIiwibGlzdGVuVG9PbmNlIiwic2hvd0xvZ2luTW9kYWwiLCJsb2dpblRpbWVvdXRXYXJuIiwid2FybkF0IiwiaW1wZXJzb25hdGluZyIsInNldEludGVydmFsIiwib3B0cyIsIm9sZFVzZXIiLCJhamF4IiwibWV0aG9kIiwiZGF0YVR5cGUiLCJoYW5kb2ZmIiwiZGF0YSIsIndpdGhOYXYiLCJsb2dpblN1Y2Nlc3MiLCJsb2dpbkZhaWx1cmUiLCJzdGF0dXMiLCJ4aHIiLCJhbnN3ZXIiLCJwYXJzZVJlc3BvbnNlIiwid2luZG93IiwiYWxlcnQiLCJhdXRoZCIsImlzQm9vbGVh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QyxFQUFUO0FBQ0FmLGdCQUFjLEtBQUtDLFdBQW5CO0FBQ0EsU0FBTyxLQUFLRyxhQUFaOztBQUVBekgsUUFBTWlCLE9BQU4sQ0FBY2xCLElBQUk4QixNQUFKLENBQVcwQyxhQUF6QixFQUF3QyxLQUFLUyxlQUFMLEVBQXhDO0FBQ0E7QUF2UG9DLENBQXRCLENBQWhCOztBQTBQQXlFLE9BQU9DLE9BQVAsR0FBaUIsWUFBVztBQUMzQixRQUFPLElBQUk1SSxPQUFKLENBQVksRUFBRW1GLGVBQWUsS0FBakIsRUFBd0JELFNBQVMsS0FBakMsRUFBWixDQUFQO0FBQ0EsQ0FGRCIsImZpbGUiOiJzZXNzaW9uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5jb25zdCByYXlndW4gPSByZXF1aXJlKFwicmF5Z3VuXCIpO1xuY29uc3QgQXBwID0gcmVxdWlyZShcIi4uL2luZGV4XCIpO1xuXG5jb25zdCByYWRpbyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJnbG9iYWxcIik7XG5cbmNvbnN0IFdhcm5Nb2RhbCA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwid2Fybi1tb2RhbFwiLFxuXG5cdHR5cGU6IFwid2FyblwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi90ZW1wbGF0ZXMvbG9naW5Nb2RhbC5udW5qXCIpLmxvZ291dFdhcm5pbmcsXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayAucmVsb2dpblwiOiBcInJlbG9naW5cIixcblx0XHRcImNsaWNrIC5pZ25vcmVcIjogXCJpZ25vcmVcIixcblx0fSxcblxuXHRyZWxvZ2luOiBmdW5jdGlvbigpIHtcblx0XHRBcHAuU2Vzc2lvbi51cGRhdGVTZXNzaW9uKCk7XG5cdH0sXG5cblx0aWdub3JlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnRyaWdnZXIoXCJpZ25vcmVcIik7XG5cdH0sXG59KTtcblxuY29uc3QgTG9naW5Nb2RhbCA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwibG9naW4tbW9kYWxcIixcblxuXHR0eXBlOiBcImxvZ2luXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9sb2dpbk1vZGFsLm51bmpcIikubG9nb3V0VGltZW91dCxcblxuXHR1aToge1xuXHRcdHVzZXJuYW1lOiBcImlucHV0W3JvbGU9J3VzZXJuYW1lJ11cIixcblx0XHRwYXNzd29yZDogXCJpbnB1dFtyb2xlPSdwYXNzd29yZCddXCIsXG5cdFx0YnV0dG9uOiBcImlucHV0W3R5cGU9J3N1Ym1pdCddXCIsXG5cdFx0aW5mbzogXCIuaW5mby10ZXh0XCIsXG5cdFx0c3Bpbm5lcjogXCJzcGFuLnNwaW5uZXItaWNvblwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmJ1dHRvblwiOiBcImxvZ2luXCIsXG5cdFx0XCJjbGljayBidXR0b24uaWdub3JlXCI6IFwiaWdub3JlXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMubGlzdGVuVG8ocmFkaW8sIEFwcC5FdmVudHMuTG9naW5TdWNjZXNzLCB0aGlzLnN1Y2Nlc3MuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5UbyhyYWRpbywgQXBwLkV2ZW50cy5Mb2dpbkZhaWx1cmUsIHRoaXMuZmFpbHVyZS5iaW5kKHRoaXMpKTtcblxuXHRcdHRoaXMuaG9zdCA9IG9wdGlvbnMuaG9zdDtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gUmVuZGVyIGEgYmFja2dyb3VuZFxuXHRcdCQoXCIubW9kYWwtZWxlbWVudFwiLCAkKHRoaXMuaG9zdCkpLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHQkKFwiYm9keVwiKS5hZGRDbGFzcyhcImhpZGUtb3ZlcmZsb3dcIik7XG5cblx0XHQvLyBJZiB0aGVyZSdzIGFueSBvdGhlciBtb2RhbHMgdmlzaWJsZSByaWdodCBub3csIGhpZGUgdGhlbSwgYW5kIHJlc3RvcmUgaXQgYWZ0ZXJcblx0XHR0aGlzLmR1bmtlZCA9ICQubWFwKCQoXCIubW9kYWwtY29udGFpbmVyXCIsICQodGhpcy5ob3N0KSkuY2hpbGRyZW4oKSwgaXRlbSA9PiB7XG5cdFx0XHRpZiAoJChpdGVtKS5pcyh0aGlzLiRlbCkpXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdCQoaXRlbSkuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0cmV0dXJuICQoaXRlbSkuZ2V0UGF0aCgpO1xuXHRcdH0pO1xuXHR9LFxuXG5cdG9uRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gQ2xlYW4gdXAgdGhlIGJhY2tncm91bmRcblx0XHRpZiAodGhpcy5kdW5rZWQgJiYgdGhpcy5kdW5rZWQubGVuZ3RoID09PSAwKSB7XG5cdFx0XHQkKFwiLm1vZGFsLWVsZW1lbnRcIiwgJCh0aGlzLmhvc3QpKS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHQkKFwiYm9keVwiKS5yZW1vdmVDbGFzcyhcImhpZGUtb3ZlcmZsb3dcIik7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuZHVua2VkKSB7XG5cdFx0XHRfLmVhY2godGhpcy5kdW5rZWQsIGl0ZW0gPT4ge1xuXHRcdFx0XHRpZiAoIWl0ZW0pXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRjb25zdCBlbCA9ICQoaXRlbSk7XG5cdFx0XHRcdGlmIChlbCAmJiBlbC5sZW5ndGgpXG5cdFx0XHRcdFx0ZWwucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGVsc2UgeyAkKFwiLm1vZGFsLWNvbnRhaW5lclwiLCAkKHRoaXMuaG9zdCkpLmVtcHR5KCk7IH1cblx0fSxcblxuXHRsb2dpbjogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuTG9naW4sIHsgdXNlcm5hbWU6IF8udHJpbSh0aGlzLnVpLnVzZXJuYW1lLnZhbCgpKSwgcGFzc3dvcmQ6IHRoaXMudWkucGFzc3dvcmQudmFsKCkgfSk7XG5cdFx0dGhpcy51aS5idXR0b24uYXR0cihcImRpc2FibGVkXCIsIHRydWUpO1xuXG5cdFx0dGhpcy51aS5zcGlubmVyLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLmluZm8ucmVtb3ZlQ2xhc3MoXCJlcnJvciBoaWRlXCIpLnRleHQoXCJMb2dnaW5nIGluLi4uXCIpO1xuXHR9LFxuXG5cdGlnbm9yZTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuZHVua2VkKSB7XG5cdFx0XHRfLmVhY2godGhpcy5kdW5rZWQsIGl0ZW0gPT4ge1xuXHRcdFx0XHRpZiAoIWl0ZW0pXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRjb25zdCBlbCA9ICQoaXRlbSk7XG5cdFx0XHRcdGlmIChlbCAmJiBlbC5sZW5ndGggJiYgZWwuZGVzdHJveSlcblx0XHRcdFx0XHRlbC5kZXN0cm95KCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLk5hdmlnYXRlLCBudWxsKTtcblx0XHR0aGlzLmRlc3Ryb3koKTtcblx0fSxcblxuXHRmYWlsdXJlOiBmdW5jdGlvbihlcnIpIHtcblx0XHR0aGlzLnVpLnNwaW5uZXIuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkuaW5mby5hZGRDbGFzcyhcImVycm9yXCIpLnJlbW92ZUNsYXNzKFwiaGlkZVwiKS50ZXh0KFwiTG9naW4gZmFpbGVkOiBcIiArIGVyci5kZXRhaWwpO1xuXHRcdHRoaXMudWkuYnV0dG9uLmF0dHIoXCJkaXNhYmxlZFwiLCBmYWxzZSk7XG5cdH0sXG5cblx0c3VjY2VzczogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5kZXN0cm95KCk7XG5cdH0sXG59KTtcblxuY29uc3QgU2Vzc2lvbiA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmxpc3RlblRvKHJhZGlvLCBBcHAuRXZlbnRzLkNvbW1hbmRzLkxvZ2luLCB0aGlzLmRvTG9naW4sIHRoaXMpO1xuXHRcdHRoaXMubGlzdGVuVG8ocmFkaW8sIEFwcC5FdmVudHMuQ29tbWFuZHMuTG9nb3V0LCB0aGlzLmRvTG9nb3V0LCB0aGlzKTtcblx0XHR0aGlzLmxpc3RlblRvKHJhZGlvLCBBcHAuRXZlbnRzLlVwZGF0ZVVzZXJEZXRhaWxzLCB0aGlzLnVwZGF0ZVVzZXJEZXRhaWxzLCB0aGlzKTtcblx0XHR0aGlzLmxpc3RlblRvKHJhZGlvLCBBcHAuRXZlbnRzLkxvZ291dFN1Y2Nlc3MsIHRoaXMubG9nb3V0U3VjY2Vzcy5iaW5kKHRoaXMpKTtcblxuXHRcdHJhZGlvLnJlcGx5KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIsIHRoaXMuZ2V0VXNlciwgdGhpcyk7XG5cdFx0cmFkaW8ucmVwbHkoQXBwLkV2ZW50cy5SZXF1ZXN0cy5JbXBlcnNvbmF0b3IsIHRoaXMuZ2V0SW1wZXJzb25hdG9yLCB0aGlzKTtcblx0XHRyYWRpby5yZXBseShBcHAuRXZlbnRzLlJlcXVlc3RzLklzQXV0aGVudGljYXRlZCwgdGhpcy5pc0F1dGhlbnRpY2F0ZWQsIHRoaXMpO1xuXHRcdHJhZGlvLnJlcGx5KEFwcC5FdmVudHMuUmVxdWVzdHMuSXNJbXBlcnNvbmF0aW5nLCB0aGlzLmlzSW1wZXJzb25hdGluZywgdGhpcyk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHJhZGlvLCBBcHAuRXZlbnRzLk1vZGFsQ29udGV4dENoYW5nZSwgdGhpcy5jaGFuZ2VNb2RhbENvbnRleHQuYmluZCh0aGlzKSk7XG5cblx0XHR0aGlzLmhvc3QgPSBcIiNtb2RhbHNcIjtcblxuXHRcdC8vIExpc3RlbiBmb3IgdGhlIGVuZCBvZiBhbGwgQWpheCBjYWxscywgYW5kIHVwZGF0ZSB0aGUgc2Vzc2lvbiB0aW1lb3V0XG5cdFx0Ly8kKGRvY3VtZW50KS5hamF4Q29tcGxldGUoZnVuY3Rpb24oKSB7IHRoaXMucmVmcmVzaFRpbWVvdXQoKTsgfS5iaW5kKHRoaXMpKTtcblxuXHRcdC8vIEltbWVkaWF0ZWx5IGtpY2sgb2ZmIGFuIGF1dGhlbnRpY2F0aW9uIGNoZWNrIHRoYXQgd2lsbCBydW4gd2hpbGUgdGhlIHJlc3Qgb2YgdGhlIGFwcCBkb2VzIGl0cyB0aGluZ1xuXHRcdHRoaXMuZmV0Y2goeyBzdWNjZXNzOiB0aGlzLmNoZWNrU3VjY2Vzcy5iaW5kKHRoaXMpLCBlcnJvcjogdGhpcy5jaGVja0Vycm9yLmJpbmQodGhpcyksIHVuY2FuY2VsbGFibGU6IHRydWUgfSk7XG5cdH0sXG5cblx0aWRBdHRyaWJ1dGU6IFwiX2lkXCIsXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2xvZ2luL3Nlc3Npb25cIjtcblx0fSxcblxuXHRjaGFuZ2VNb2RhbENvbnRleHQ6IGZ1bmN0aW9uKGNvbnRleHQpIHtcblx0XHR0aGlzLmhvc3QgPSBjb250ZXh0IHx8IFwiI21vZGFsc1wiO1xuXHR9LFxuXG5cdGNoZWNrU3VjY2VzczogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRtb2RlbC5zZXQoeyBjaGVja2VkOiB0cnVlLCBhdXRoZW50aWNhdGVkOiB0cnVlLCBkYXRlOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSwgZXhwaXJ5OiBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIHNldHRpbmdzLnNlc3Npb25UaW1lb3V0IH0pO1xuXHRcdHRoaXMubG9naW5UaW1lb3V0VGltZXIoKTtcblxuXHRcdGlmICghdGhpcy5nZXQoXCJ1c2VyXCIpLmN1c3RvbUdyb3Vwcylcblx0XHRcdHRoaXMuZ2V0KFwidXNlclwiKS5jdXN0b21Hcm91cHMgPSBbXTtcblxuXHRcdHJheWd1bihcInNldFVzZXJcIiwge1xuXHRcdFx0aXNBbm9ueW1vdXM6IGZhbHNlLFxuXHRcdFx0aWRlbnRpZmllcjogdGhpcy5nZXQoXCJ1c2VyXCIpLnVzZXJuYW1lLFxuXHRcdFx0ZW1haWw6IHRoaXMuZ2V0KFwidXNlclwiKS5lbWFpbCxcblx0XHRcdGZpcnN0TmFtZTogdGhpcy5nZXQoXCJ1c2VyXCIpLmZpcnN0bmFtZSxcblx0XHRcdGZ1bGxOYW1lOiB0aGlzLmdldChcInVzZXJcIikuZmlyc3RuYW1lICsgXCIgXCIgKyB0aGlzLmdldChcInVzZXJcIikuc3VybmFtZSxcblx0XHRcdHV1aWQ6IHRoaXMuZ2V0KFwidXNlclwiKS5faWQsXG5cdFx0fSk7XG5cblx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuU2Vzc2lvbkxvYWRlZCwgdGhpcy5pc0F1dGhlbnRpY2F0ZWQoKSk7XG5cdH0sXG5cblx0Y2hlY2tFcnJvcjogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRtb2RlbC5zZXQoeyBjaGVja2VkOiB0cnVlIH0pO1xuXG5cdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLlNlc3Npb25Mb2FkZWQsIHRoaXMuaXNBdXRoZW50aWNhdGVkKCkpO1xuXHR9LFxuXG5cdGdldFVzZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmdldChcInVzZXJcIik7XG5cdH0sXG5cblx0Z2V0SW1wZXJzb25hdG9yOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXQoXCJpbXBlcnNvbmF0b3JcIik7XG5cdH0sXG5cblx0aXNBdXRoZW50aWNhdGVkOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXQoXCJhdXRoZW50aWNhdGVkXCIpICYmIHRoaXMuaGFzKFwiZGF0ZVwiKSAmJiB0aGlzLmdldChcImV4cGlyeVwiKSA+IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuXHR9LFxuXG5cdGlzSW1wZXJzb25hdGluZzogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0KFwiaW1wZXJzb25hdGluZ1wiKTtcblx0fSxcblxuXHR1cGRhdGVTZXNzaW9uOiBmdW5jdGlvbigpIHtcblx0XHRjbGVhckludGVydmFsKHRoaXMubG9nb3V0VGltZXIpO1xuXHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLmxvZ2luTW9kYWwsIFwiaWdub3JlXCIpO1xuXHRcdGlmICh0aGlzLmxvZ2luTW9kYWwpXG5cdFx0XHR0aGlzLmxvZ2luTW9kYWwuZGVzdHJveSgpO1xuXHRcdHRoaXMubG9naW5Nb2RhbCA9IG51bGw7XG5cdFx0ZGVsZXRlIHRoaXMuaWdub3JlV2FybmluZztcblx0XHR0aGlzLmZldGNoKHtcblx0XHRcdHN1Y2Nlc3M6IHRoaXMuc2Vzc2lvblVwZGF0ZWQuYmluZCh0aGlzKSxcblx0XHRcdGVycm9yOiB0aGlzLnNlc3Npb25VcGRhdGVGYWlsLmJpbmQodGhpcyksXG5cdFx0XHR1bmNhbmNlbGxhYmxlOiB0cnVlLFxuXHRcdH0pO1xuXHR9LFxuXG5cdHNlc3Npb25VcGRhdGVkOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNldCh7IGV4cGlyeTogbmV3IERhdGUoKS5nZXRUaW1lKCkgKyBzZXR0aW5ncy5zZXNzaW9uVGltZW91dCB9KTtcblx0XHR0aGlzLmxvZ2luVGltZW91dFRpbWVyKCk7XG5cdH0sXG5cblx0c2Vzc2lvblVwZGF0ZUZhaWw6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMubG9nb3V0U3VjY2VzcygpO1xuXHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0ZSwgXCIvXCIpO1xuXHR9LFxuXG5cdHVwZGF0ZVVzZXJEZXRhaWxzOiBmdW5jdGlvbih1c2VyKSB7XG5cdFx0dGhpcy5zZXQoeyB1c2VyOiB1c2VyIH0pO1xuXHR9LFxuXG5cdC8qcmVmcmVzaFRpbWVvdXQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc2V0KHtleHBpcnk6IG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgc2V0dGluZ3Muc2Vzc2lvblRpbWVvdXR9KTtcblx0fSwqL1xuXG5cdHNob3dXYXJuaW5nTW9kYWw6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMubG9naW5Nb2RhbCA9IG5ldyBXYXJuTW9kYWwoeyBTZXNzaW9uOiB0aGlzIH0pO1xuXHRcdCQoXCJib2R5XCIpLmFwcGVuZCh0aGlzLmxvZ2luTW9kYWwucmVuZGVyKCkuZWwpO1xuXHRcdHRoaXMubGlzdGVuVG9PbmNlKHRoaXMubG9naW5Nb2RhbCwgXCJpZ25vcmVcIiwgKCkgPT4ge1xuXHRcdFx0aWYgKHRoaXMubG9naW5Nb2RhbClcblx0XHRcdFx0dGhpcy5sb2dpbk1vZGFsLmRlc3Ryb3koKTtcblx0XHRcdHRoaXMubG9naW5Nb2RhbCA9IG51bGw7XG5cdFx0XHR0aGlzLmlnbm9yZVdhcm5pbmcgPSB0cnVlO1xuXHRcdH0pO1xuXHR9LFxuXG5cdHNob3dMb2dpbk1vZGFsOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmxvZ2luTW9kYWwgPSBuZXcgTG9naW5Nb2RhbCh7IGhvc3Q6IHRoaXMuaG9zdCB9KTtcblx0XHQkKFwiLm1vZGFsLWNvbnRhaW5lclwiLCAkKHRoaXMuaG9zdCkpLmFwcGVuZCh0aGlzLmxvZ2luTW9kYWwucmVuZGVyKCkuZWwpO1xuXHR9LFxuXG5cdGxvZ2luVGltZW91dFdhcm46IGZ1bmN0aW9uKCkge1xuXHRcdC8vIFdhcm4gdGhlIHVzZXIgMTAgbWlucyBiZWZvcmUgbG9nb3V0XG5cdFx0Y29uc3Qgd2FybkF0ID0gMTAgKiA2MCAqIDEwMDA7XG5cblx0XHRpZiAodGhpcy5nZXQoXCJleHBpcnlcIikgPCBuZXcgRGF0ZSgpLmdldFRpbWUoKSkge1xuXHRcdFx0dGhpcy5zZXQoeyBhdXRoZW50aWNhdGVkOiBmYWxzZSwgaW1wZXJzb25hdGluZzogZmFsc2UgfSk7XG5cdFx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuTG9nb3V0U3VjY2VzcywgdGhpcy5pc0F1dGhlbnRpY2F0ZWQoKSwgdHJ1ZSk7XG5cblx0XHRcdGlmICh0aGlzLmxvZ2luTW9kYWwgJiYgdGhpcy5sb2dpbk1vZGFsLnR5cGUgPT09IFwid2FyblwiKSB7XG5cdFx0XHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLmxvZ2luTW9kYWwsIFwiaWdub3JlXCIpO1xuXHRcdFx0XHR0aGlzLmxvZ2luTW9kYWwuZGVzdHJveSgpO1xuXHRcdFx0XHR0aGlzLmxvZ2luTW9kYWwgPSBudWxsO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCF0aGlzLmxvZ2luTW9kYWwpIHtcblx0XHRcdFx0dGhpcy5zaG93TG9naW5Nb2RhbCgpO1xuXHRcdFx0XHRkZWxldGUgdGhpcy5pZ25vcmVXYXJuaW5nO1xuXHRcdFx0XHRjbGVhckludGVydmFsKHRoaXMubG9nb3V0VGltZXIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRlbHNlIGlmICghdGhpcy5pZ25vcmVXYXJuaW5nICYmIHRoaXMuZ2V0KFwiZXhwaXJ5XCIpIC0gbmV3IERhdGUoKS5nZXRUaW1lKCkgPD0gd2FybkF0KSB7XG5cdFx0XHRpZiAoIXRoaXMubG9naW5Nb2RhbClcblx0XHRcdFx0dGhpcy5zaG93V2FybmluZ01vZGFsKCk7XG5cdFx0fVxuXHR9LFxuXG5cdGxvZ2luVGltZW91dFRpbWVyOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5sb2dvdXRUaW1lcilcblx0XHRcdGNsZWFySW50ZXJ2YWwodGhpcy5sb2dvdXRUaW1lcik7XG5cdFx0dGhpcy5sb2dvdXRUaW1lciA9IHNldEludGVydmFsKHRoaXMubG9naW5UaW1lb3V0V2Fybi5iaW5kKHRoaXMpLCA1MDAwKTtcblx0fSxcblxuXHRkb0xvZ2luOiBmdW5jdGlvbihvcHRzKSB7XG5cdFx0dGhpcy5vbGRVc2VyID0gdGhpcy5nZXQoXCJ1c2VyXCIpID8gdGhpcy5nZXQoXCJ1c2VyXCIpLnVzZXJuYW1lIDogbnVsbDtcblx0XHRjbGVhckludGVydmFsKHRoaXMubG9nb3V0VGltZXIpO1xuXHRcdGRlbGV0ZSB0aGlzLmlnbm9yZVdhcm5pbmc7XG5cdFx0JC5hamF4KHtcblx0XHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0XHRkYXRhVHlwZTogXCJqc29uXCIsXG5cdFx0XHR1cmw6IGAke3NldHRpbmdzLnVybFJvb3R9L2FwaS8xLjAvbG9naW4ke29wdHMuaGFuZG9mZiA/IFwiP2hhbmRvZmY9dHJ1ZVwiIDogXCJcIn1gLFxuXHRcdFx0ZGF0YTogeyB1c2VybmFtZTogXy50cmltKG9wdHMudXNlcm5hbWUpLCBwYXNzd29yZDogb3B0cy5wYXNzd29yZCwgd2l0aE5hdjogdHJ1ZSwgdWk6IHRydWUgfSxcblx0XHRcdHN1Y2Nlc3M6IHRoaXMubG9naW5TdWNjZXNzLmJpbmQodGhpcyksXG5cdFx0XHRlcnJvcjogdGhpcy5sb2dpbkZhaWx1cmUuYmluZCh0aGlzKSxcblx0XHRcdHVuY2FuY2VsbGFibGU6IHRydWUsXG5cdFx0fSk7XG5cdH0sXG5cblx0bG9naW5TdWNjZXNzOiBmdW5jdGlvbihkYXRhLCBzdGF0dXMpIHtcblx0XHRpZiAoc3RhdHVzID09PSBcInN1Y2Nlc3NcIiAmJiBkYXRhLnN1Y2Nlc3MpIHtcblx0XHRcdC8vIFNhdmUgdGhlIHVzZXIgZGV0YWlsc1xuXHRcdFx0ZGVsZXRlIGRhdGEuc3VjY2Vzcztcblx0XHRcdGRlbGV0ZSB0aGlzLmlnbm9yZVdhcm5pbmc7XG5cblx0XHRcdGRhdGEuYXV0aGVudGljYXRlZCA9IHRydWU7XG5cdFx0XHRkYXRhLmRhdGUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblx0XHRcdGRhdGEuZXhwaXJ5ID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgKyBzZXR0aW5ncy5zZXNzaW9uVGltZW91dDtcblx0XHRcdHRoaXMuc2V0KGRhdGEpO1xuXG5cdFx0XHRpZiAoIXRoaXMuZ2V0KFwidXNlclwiKS5jdXN0b21Hcm91cHMpXG5cdFx0XHRcdHRoaXMuZ2V0KFwidXNlclwiKS5jdXN0b21Hcm91cHMgPSBbXTtcblxuXHRcdFx0aWYgKHRoaXMubG9naW5Nb2RhbClcblx0XHRcdFx0dGhpcy5sb2dpbk1vZGFsID0gbnVsbDtcblx0XHRcdHRoaXMubG9naW5UaW1lb3V0VGltZXIoKTtcblxuXHRcdFx0cmF5Z3VuKFwic2V0VXNlclwiLCB7XG5cdFx0XHRcdGlzQW5vbnltb3VzOiBmYWxzZSxcblx0XHRcdFx0aWRlbnRpZmllcjogdGhpcy5nZXQoXCJ1c2VyXCIpLnVzZXJuYW1lLFxuXHRcdFx0XHRlbWFpbDogdGhpcy5nZXQoXCJ1c2VyXCIpLmVtYWlsLFxuXHRcdFx0XHRmaXJzdE5hbWU6IHRoaXMuZ2V0KFwidXNlclwiKS5maXJzdG5hbWUsXG5cdFx0XHRcdGZ1bGxOYW1lOiB0aGlzLmdldChcInVzZXJcIikuZmlyc3RuYW1lICsgXCIgXCIgKyB0aGlzLmdldChcInVzZXJcIikuc3VybmFtZSxcblx0XHRcdFx0dXVpZDogdGhpcy5nZXQoXCJ1c2VyXCIpLl9pZCxcblx0XHRcdH0pO1xuXG5cdFx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuU2Vzc2lvbkxvYWRlZCwgdGhpcy5pc0F1dGhlbnRpY2F0ZWQoKSk7XG5cdFx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuTG9naW5TdWNjZXNzLCB0aGlzLmlzQXV0aGVudGljYXRlZCgpKTtcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgd2UndmUgbG9nZ2VkIGluIGFzIGEgZGlmZmVyZW50IHVzZXJcblx0XHRcdGlmICh0aGlzLm9sZFVzZXIgJiYgdGhpcy5vbGRVc2VyICE9PSB0aGlzLmdldChcInVzZXJcIikudXNlcm5hbWUpXG5cdFx0XHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0ZSwgXCIvXCIpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Mb2dpbkZhaWx1cmUsIGRhdGEpO1xuXHRcdH1cblx0fSxcblxuXHRsb2dpbkZhaWx1cmU6IGZ1bmN0aW9uKHhocikge1xuXHRcdGNvbnN0IGFuc3dlciA9IEFwcC5wYXJzZVJlc3BvbnNlKHhocik7XG5cdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkxvZ2luRmFpbHVyZSwgYW5zd2VyKTtcblx0fSxcblxuXHRkb0xvZ291dDogZnVuY3Rpb24oKSB7XG5cdFx0JC5hamF4KHtcblx0XHRcdG1ldGhvZDogXCJHRVRcIixcblx0XHRcdHVybDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvbG9naW4vbG9nb3V0XCIsXG5cdFx0XHRzdWNjZXNzOiAoKSA9PiB7XG5cdFx0XHRcdHRoaXMubG9nb3V0U3VjY2VzcygpO1xuXHRcdFx0fSxcblx0XHRcdGVycm9yOiBmdW5jdGlvbih4aHIpIHtcblx0XHRcdFx0Y29uc3QgYW5zd2VyID0gQXBwLnBhcnNlUmVzcG9uc2UoeGhyKTtcblx0XHRcdFx0d2luZG93LmFsZXJ0KGFuc3dlci5kZXRhaWwgfHwgYW5zd2VyLmluZm8pO1xuXHRcdFx0fSxcblx0XHRcdHVuY2FuY2VsbGFibGU6IHRydWUsXG5cdFx0fSk7XG5cdH0sXG5cblx0bG9nb3V0U3VjY2VzczogZnVuY3Rpb24oYXV0aGQpIHtcblx0XHQvLyBJZiB3ZSd2ZSB0cmlnZ2VyZWQgdGhpcyBtZXRob2Qgb3Vyc2VsdmVzLCBwcmV2ZW50IGEgbG9vcFxuXHRcdGlmIChfLmlzQm9vbGVhbihhdXRoZCkpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRyYXlndW4oXCJzZXRVc2VyXCIsIHtcblx0XHRcdGlzQW5vbnltb3VzOiB0cnVlLFxuXHRcdFx0aWRlbnRpZmllcjogXCJcIixcblx0XHR9KTtcblxuXHRcdHRoaXMudW5zZXQoXCJ1c2VyXCIpO1xuXHRcdHRoaXMudW5zZXQoXCJkYXRlXCIpO1xuXHRcdHRoaXMudW5zZXQoXCJuYXZpZ2F0aW9uXCIpO1xuXHRcdHRoaXMudW5zZXQoXCJpbXBlcnNvbmF0b3JcIik7XG5cdFx0dGhpcy5zZXQoeyBhdXRoZW50aWNhdGVkOiBmYWxzZSwgaW1wZXJzb25hdGluZzogZmFsc2UgfSk7XG5cdFx0Y2xlYXJJbnRlcnZhbCh0aGlzLmxvZ291dFRpbWVyKTtcblx0XHRkZWxldGUgdGhpcy5pZ25vcmVXYXJuaW5nO1xuXG5cdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkxvZ291dFN1Y2Nlc3MsIHRoaXMuaXNBdXRoZW50aWNhdGVkKCkpO1xuXHR9LFxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiBuZXcgU2Vzc2lvbih7IGF1dGhlbnRpY2F0ZWQ6IGZhbHNlLCBjaGVja2VkOiBmYWxzZSB9KTtcbn07Il19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nmodule.exports = function (App) {\n\tvar SpinnerView = Backbone.Marionette.View.extend({\n\t\tinitialize: function initialize() {\n\t\t\tthis.listenTo(radio, App.Events.Commands.HideSpinner, this.hide, this);\n\t\t\tthis.listenTo(radio, App.Events.Commands.ShowSpinner, this.show, this);\n\n\t\t\tthis.$el.removeClass(\"hide\");\n\t\t},\n\n\t\trender: function render() {\n\t\t\treturn this;\n\t\t},\n\n\t\tshow: function show() {\n\t\t\tthis.$el.removeClass(\"fade-out\");\n\t\t},\n\n\t\thide: function hide() {\n\t\t\tthis.$el.addClass(\"fade-out\");\n\t\t},\n\n\t\tclose: function close() {\n\t\t\tif (!this.$el.hasClass(\"fade-out\")) this.$el.addClass(\"fade-out\");\n\n\t\t\t//App.vent.off(null, null, this);\n\t\t}\n\t});\n\n\tApp.Views.Spinner = new SpinnerView({ el: \"#loader\" });\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNwaW5uZXIuanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwicmFkaW8iLCJSYWRpbyIsImNoYW5uZWwiLCJtb2R1bGUiLCJleHBvcnRzIiwiQXBwIiwiU3Bpbm5lclZpZXciLCJNYXJpb25ldHRlIiwiVmlldyIsImV4dGVuZCIsImluaXRpYWxpemUiLCJsaXN0ZW5UbyIsIkV2ZW50cyIsIkNvbW1hbmRzIiwiSGlkZVNwaW5uZXIiLCJoaWRlIiwiU2hvd1NwaW5uZXIiLCJzaG93IiwiJGVsIiwicmVtb3ZlQ2xhc3MiLCJyZW5kZXIiLCJhZGRDbGFzcyIsImNsb3NlIiwiaGFzQ2xhc3MiLCJWaWV3cyIsIlNwaW5uZXIiLCJlbCJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCOztBQUVBLElBQU1DLFFBQVFGLFNBQVNHLEtBQVQsQ0FBZUMsT0FBZixDQUF1QixRQUF2QixDQUFkOztBQUVBQyxPQUFPQyxPQUFQLEdBQWlCLFVBQVNDLEdBQVQsRUFBYztBQUM5QixLQUFNQyxjQUFjUixTQUFTUyxVQUFULENBQW9CQyxJQUFwQixDQUF5QkMsTUFBekIsQ0FBZ0M7QUFDbkRDLGNBQVksc0JBQVc7QUFDdEIsUUFBS0MsUUFBTCxDQUFjWCxLQUFkLEVBQXFCSyxJQUFJTyxNQUFKLENBQVdDLFFBQVgsQ0FBb0JDLFdBQXpDLEVBQXNELEtBQUtDLElBQTNELEVBQWlFLElBQWpFO0FBQ0EsUUFBS0osUUFBTCxDQUFjWCxLQUFkLEVBQXFCSyxJQUFJTyxNQUFKLENBQVdDLFFBQVgsQ0FBb0JHLFdBQXpDLEVBQXNELEtBQUtDLElBQTNELEVBQWlFLElBQWpFOztBQUVBLFFBQUtDLEdBQUwsQ0FBU0MsV0FBVCxDQUFxQixNQUFyQjtBQUNBLEdBTmtEOztBQVFuREMsVUFBUSxrQkFBVztBQUNsQixVQUFPLElBQVA7QUFDQSxHQVZrRDs7QUFZbkRILFFBQU0sZ0JBQVc7QUFDaEIsUUFBS0MsR0FBTCxDQUFTQyxXQUFULENBQXFCLFVBQXJCO0FBQ0EsR0Fka0Q7O0FBZ0JuREosUUFBTSxnQkFBVztBQUNoQixRQUFLRyxHQUFMLENBQVNHLFFBQVQsQ0FBa0IsVUFBbEI7QUFDQSxHQWxCa0Q7O0FBb0JuREMsU0FBTyxpQkFBVztBQUNqQixPQUFJLENBQUMsS0FBS0osR0FBTCxDQUFTSyxRQUFULENBQWtCLFVBQWxCLENBQUwsRUFDQyxLQUFLTCxHQUFMLENBQVNHLFFBQVQsQ0FBa0IsVUFBbEI7O0FBRUQ7QUFDQTtBQXpCa0QsRUFBaEMsQ0FBcEI7O0FBNEJBaEIsS0FBSW1CLEtBQUosQ0FBVUMsT0FBVixHQUFvQixJQUFJbkIsV0FBSixDQUFnQixFQUFFb0IsSUFBSSxTQUFOLEVBQWhCLENBQXBCO0FBQ0EsQ0E5QkQiLCJmaWxlIjoic3Bpbm5lci5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5cbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihBcHApIHtcblx0Y29uc3QgU3Bpbm5lclZpZXcgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0XHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRcdHRoaXMubGlzdGVuVG8ocmFkaW8sIEFwcC5FdmVudHMuQ29tbWFuZHMuSGlkZVNwaW5uZXIsIHRoaXMuaGlkZSwgdGhpcyk7XG5cdFx0XHR0aGlzLmxpc3RlblRvKHJhZGlvLCBBcHAuRXZlbnRzLkNvbW1hbmRzLlNob3dTcGlubmVyLCB0aGlzLnNob3csIHRoaXMpO1xuXG5cdFx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0fSxcblxuXHRcdHJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9LFxuXG5cdFx0c2hvdzogZnVuY3Rpb24oKSB7XG5cdFx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyhcImZhZGUtb3V0XCIpO1xuXHRcdH0sXG5cblx0XHRoaWRlOiBmdW5jdGlvbigpIHtcblx0XHRcdHRoaXMuJGVsLmFkZENsYXNzKFwiZmFkZS1vdXRcIik7XG5cdFx0fSxcblxuXHRcdGNsb3NlOiBmdW5jdGlvbigpIHtcblx0XHRcdGlmICghdGhpcy4kZWwuaGFzQ2xhc3MoXCJmYWRlLW91dFwiKSlcblx0XHRcdFx0dGhpcy4kZWwuYWRkQ2xhc3MoXCJmYWRlLW91dFwiKTtcblxuXHRcdFx0Ly9BcHAudmVudC5vZmYobnVsbCwgbnVsbCwgdGhpcyk7XG5cdFx0fSxcblx0fSk7XG5cblx0QXBwLlZpZXdzLlNwaW5uZXIgPSBuZXcgU3Bpbm5lclZpZXcoeyBlbDogXCIjbG9hZGVyXCIgfSk7XG59OyJdfQ==",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar logoutWarning_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div>You will be logged out soon.</div><br/>\\n\\n\\t<button type=\\\"button\\\" class=\\\"button small relogin\\\">Stay Logged In</button>&nbsp;&nbsp;\\n\\t<button type=\\\"button\\\" class=\\\"button small ignore secondary\\\">Ignore</button>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar logoutWarning_oldRoot = logoutWarning_obj.root;\nlogoutWarning_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlogoutWarning_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar logoutTimeout_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n<div>You have been logged out! Re-enter your login details below to avoid losing any work.</div><br/>\\n\\n<form>\\n\\t<input type=\\\"text\\\" role=\\\"username\\\" name=\\\"username\\\" placeholder=\\\"Username\\\">\\n\\t<input type=\\\"password\\\" role=\\\"password\\\" name=\\\"password\\\" placeholder=\\\"Password\\\">\\n\\t<input type=\\\"submit\\\" class=\\\"button small login\\\" value=\\\"Log In\\\"/>\\n\\t<button type=\\\"button\\\" class=\\\"button small ignore secondary\\\">Ignore</button>\\n\\t<span class=\\\"spinner-icon hide\\\"></span>\\n\\t<div class=\\\"info-text hide\\\"></div>\\n</form>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar logoutTimeout_oldRoot = logoutTimeout_obj.root;\nlogoutTimeout_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlogoutTimeout_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"logoutWarning\": new nunjucks.Template( {obj: logoutWarning_obj, type: \"code\"}, env),\t\"logoutTimeout\": new nunjucks.Template( {obj: logoutTimeout_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\nvar macro_t_1 = runtime.makeMacro(\n[\"item\"], \n[], \nfunction (l_item, kwargs) {\nframe = frame.push();\nkwargs = kwargs || {};\nif (kwargs.hasOwnProperty(\"caller\")) {\nframe.set(\"caller\", kwargs.caller); }\nframe.set(\"item\", l_item);\nvar t_2 = \"\";t_2 += \"\\n\\t\";\nif(runtime.memberLookup((runtime.memberLookup((l_item),\"links\")),\"length\") > 0) {\nt_2 += \"\\n\\t\\t<li class=\\\"\";\nif(runtime.memberLookup((l_item),\"active\") == true) {\nt_2 += \"active\";\n;\n}\nt_2 += \"\\\"><a href=\\\"\";\nt_2 += runtime.suppressValue((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"link\")),\"newWindow\")?\"\":runtime.contextOrFrameLookup(context, frame, \"urlRoot\")), env.opts.autoescape);\nt_2 += runtime.suppressValue(runtime.memberLookup((l_item),\"url\"), env.opts.autoescape);\nt_2 += \"\\\" data-replace=\\\"\";\nt_2 += runtime.suppressValue(runtime.memberLookup((l_item),\"replace\"), env.opts.autoescape);\nt_2 += \"\\\" \";\nif(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"link\")),\"newWindow\")) {\nt_2 += \"data-new=\\\"true\\\"\";\n;\n}\nt_2 += \">\";\nt_2 += runtime.suppressValue((lineno = 2, colno = 184, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"getName\"), \"getName\", context, [runtime.memberLookup((l_item),\"name\")])), env.opts.autoescape);\nt_2 += \"</a>\\n\\t\\t\\t<ul class=\\\"menu vertical\\\">\\n\\t\\t\\t\\t\";\nframe = frame.push();\nvar t_5 = runtime.memberLookup((l_item),\"links\");\nif(t_5) {var t_4 = t_5.length;\nfor(var t_3=0; t_3 < t_5.length; t_3++) {\nvar t_6 = t_5[t_3];\nframe.set(\"link\", t_6);\nframe.set(\"loop.index\", t_3 + 1);\nframe.set(\"loop.index0\", t_3);\nframe.set(\"loop.revindex\", t_4 - t_3);\nframe.set(\"loop.revindex0\", t_4 - t_3 - 1);\nframe.set(\"loop.first\", t_3 === 0);\nframe.set(\"loop.last\", t_3 === t_4 - 1);\nframe.set(\"loop.length\", t_4);\nt_2 += \"\\n\\t\\t\\t\\t\\t\";\nif(runtime.memberLookup((runtime.memberLookup((t_6),\"links\")),\"length\") > 0) {\nt_2 += \"\\n\\t\\t\\t\\t\\t\\t\";\nt_2 += runtime.suppressValue((lineno = 6, colno = 13, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"subset\"), \"subset\", context, [t_6])), env.opts.autoescape);\nt_2 += \"\\n\\t\\t\\t\\t\\t\";\n;\n}\nelse {\nt_2 += \"\\n\\t\\t\\t\\t\\t\\t\";\nif(runtime.memberLookup((t_6),\"divider\")) {\nt_2 += \"\\n\\t\\t\\t\\t\\t\\t\\t<li class=\\\"divider\\\"><hr/></li>\\n\\t\\t\\t\\t\\t\\t\";\n;\n}\nelse {\nt_2 += \"\\n\\t\\t\\t\\t\\t\\t\\t<li \";\nif(runtime.memberLookup((t_6),\"active\") == true) {\nt_2 += \"class=\\\"active\\\"\";\n;\n}\nt_2 += \"><a href=\\\"\";\nt_2 += runtime.suppressValue((runtime.memberLookup((t_6),\"newWindow\")?\"\":runtime.contextOrFrameLookup(context, frame, \"urlRoot\")), env.opts.autoescape);\nt_2 += runtime.suppressValue(runtime.memberLookup((t_6),\"url\"), env.opts.autoescape);\nt_2 += \"\\\" data-replace=\\\"\";\nt_2 += runtime.suppressValue(runtime.memberLookup((t_6),\"replace\"), env.opts.autoescape);\nt_2 += \"\\\" \";\nif(runtime.memberLookup((t_6),\"newWindow\")) {\nt_2 += \"data-new=\\\"true\\\"\";\n;\n}\nt_2 += \">\";\nt_2 += runtime.suppressValue((lineno = 11, colno = 189, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"getName\"), \"getName\", context, [runtime.memberLookup((t_6),\"name\")])), env.opts.autoescape);\nt_2 += \"</a></li>\\n\\t\\t\\t\\t\\t\\t\";\n;\n}\nt_2 += \"\\n\\t\\t\\t\\t\\t\";\n;\n}\nt_2 += \"\\n\\t\\t\\t\\t\";\n;\n}\n}\nframe = frame.pop();\nt_2 += \"\\n\\t\\t\\t</ul>\\n\\t\";\n;\n}\nelse {\nt_2 += \"\\n\\t\\t<li \";\nif(runtime.memberLookup((l_item),\"active\") == true) {\nt_2 += \"class=\\\"active\\\"\";\n;\n}\nt_2 += \"><a href=\\\"\";\nt_2 += runtime.suppressValue((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"link\")),\"newWindow\")?\"\":runtime.contextOrFrameLookup(context, frame, \"urlRoot\")), env.opts.autoescape);\nt_2 += runtime.suppressValue(runtime.memberLookup((l_item),\"url\"), env.opts.autoescape);\nt_2 += \"\\\" data-replace=\\\"\";\nt_2 += runtime.suppressValue(runtime.memberLookup((l_item),\"replace\"), env.opts.autoescape);\nt_2 += \"\\\" \";\nif(runtime.memberLookup((l_item),\"newWindow\")) {\nt_2 += \"data-new=\\\"true\\\"\";\n;\n}\nt_2 += \">\";\nt_2 += runtime.suppressValue((lineno = 17, colno = 184, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"getName\"), \"getName\", context, [runtime.memberLookup((l_item),\"name\")])), env.opts.autoescape);\nt_2 += \"</a>\\n\\t\";\n;\n}\nt_2 += \"\\n\\t</li>\\n\";\n;\nframe = frame.pop();\nreturn new runtime.SafeString(t_2);\n});\ncontext.addExport(\"subset\");\ncontext.setVariable(\"subset\", macro_t_1);\noutput += \"\\n\\n\";\nvar macro_t_7 = runtime.makeMacro(\n[\"main\"], \n[], \nfunction (l_main, kwargs) {\nframe = frame.push();\nkwargs = kwargs || {};\nif (kwargs.hasOwnProperty(\"caller\")) {\nframe.set(\"caller\", kwargs.caller); }\nframe.set(\"main\", l_main);\nvar t_8 = \"\";t_8 += \"\\n\\t<ul class=\\\"dropdown menu\\\" data-dropdown-menu id=\\\"menu-top-el\\\">\\n\\t\\t\";\nframe = frame.push();\nvar t_11 = l_main;\nif(t_11) {var t_10 = t_11.length;\nfor(var t_9=0; t_9 < t_11.length; t_9++) {\nvar t_12 = t_11[t_9];\nframe.set(\"item\", t_12);\nframe.set(\"loop.index\", t_9 + 1);\nframe.set(\"loop.index0\", t_9);\nframe.set(\"loop.revindex\", t_10 - t_9);\nframe.set(\"loop.revindex0\", t_10 - t_9 - 1);\nframe.set(\"loop.first\", t_9 === 0);\nframe.set(\"loop.last\", t_9 === t_10 - 1);\nframe.set(\"loop.length\", t_10);\nt_8 += \"\\n\\t\\t\\t\";\nt_8 += runtime.suppressValue((lineno = 25, colno = 10, runtime.callWrap(macro_t_1, \"subset\", context, [t_12])), env.opts.autoescape);\nt_8 += \"\\n\\t\\t\";\n;\n}\n}\nframe = frame.pop();\nt_8 += \"\\n\\t</ul>\\n\\n\\t<!--<ul class=\\\"right\\\" style=\\\"position: relative\\\" id=\\\"notifications\\\">\\n\\n\\t</ul>-->\\n\\n\";\n;\nframe = frame.pop();\nreturn new runtime.SafeString(t_8);\n});\ncontext.addExport(\"render\");\ncontext.setVariable(\"render\", macro_t_7);\noutput += \"\\n\\n\";\nvar macro_t_13 = runtime.makeMacro(\n[\"name\"], \n[], \nfunction (l_name, kwargs) {\nframe = frame.push();\nkwargs = kwargs || {};\nif (kwargs.hasOwnProperty(\"caller\")) {\nframe.set(\"caller\", kwargs.caller); }\nframe.set(\"name\", l_name);\nvar t_14 = \"\";t_14 += \"\\n\\t\";\nt_14 += \"\\n\\t\";\nif((lineno = 37, colno = 18, runtime.callWrap(runtime.memberLookup((l_name),\"includes\"), \"name[\\\"includes\\\"]\", context, [\"customName::\"]))) {\nt_14 += \"\\n\\t\\t\";\nvar t_15;\nt_15 = (lineno = 38, colno = 32, runtime.callWrap(runtime.memberLookup((l_name),\"replace\"), \"name[\\\"replace\\\"]\", context, [\"customName::\",\"\"]));\nframe.set(\"customName\", t_15, true);\nif(frame.topLevel) {\ncontext.setVariable(\"customName\", t_15);\n}\nif(frame.topLevel) {\ncontext.addExport(\"customName\", t_15);\n}\nt_14 += \"\\n\\t\\t\";\nt_14 += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"customNames\")),runtime.contextOrFrameLookup(context, frame, \"customName\")), env.opts.autoescape);\nt_14 += \"\\n\\t\";\n;\n}\nelse {\nt_14 += \"\\n\\t\\t\";\nt_14 += runtime.suppressValue(l_name, env.opts.autoescape);\nt_14 += \"\\n\\t\";\n;\n}\nt_14 += \"\\n\";\n;\nframe = frame.pop();\nreturn new runtime.SafeString(t_14);\n});\ncontext.addExport(\"getName\");\ncontext.setVariable(\"getName\", macro_t_13);\noutput += \"\\n\\n<div class=\\\"top-bar-right\\\">\\n\\t\";\noutput += runtime.suppressValue((lineno = 46, colno = 8, runtime.callWrap(macro_t_7, \"render\", context, [runtime.contextOrFrameLookup(context, frame, \"navigation\")])), env.opts.autoescape);\noutput += \"\\n</div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"bread\\\">\\n\\t<div class=\\\"icon fal \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"icon\"), env.opts.autoescape);\noutput += \"\\\" style=\\\"color: \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"iconColour\"), env.opts.autoescape);\noutput += \"\\\"></div>\\n\\t<div class=\\\"content\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"content\")), env.opts.autoescape);\noutput += \"</div>\\n</div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar $ = require(\"jquery\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar Toast = Backbone.Marionette.View.extend({\n\ttemplate: require(\"./templates/toasts.nunj\"),\n\n\tclassName: \"toaster\",\n\n\tevents: {\n\t\tmouseover: \"pause\",\n\t\tmouseout: \"resume\",\n\t\tclick: \"destroy\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\t},\n\n\tserializeData: function serializeData() {\n\t\treturn { icon: this.options.icon || \"fa-check\", iconColour: this.options.iconColour || \"green\", content: this.options.content };\n\t},\n\n\tpause: function pause() {\n\t\tclearTimeout(this.timer);\n\t},\n\n\tresume: function resume(time) {\n\t\tthis.timer = setTimeout(this.kill.bind(this), (parseInt(time, 10) || 2) * 1000);\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.resume(5);\n\n\t\tthis.$el.addClass(\"fade-in\");\n\t},\n\n\tonAfterDestroy: function onAfterDestroy() {\n\t\tclearTimeout(this.timer);\n\t},\n\n\tkill: function kill() {\n\t\tthis.$el.removeClass(\"fade-in\");\n\t\tsetTimeout(this.destroy.bind(this), 1000);\n\t}\n});\n\nvar workingToast = null;\n\nvar showToast = function showToast(options) {\n\tif (workingToast) workingToast.destroy();\n\n\tworkingToast = new Toast(options);\n\n\t$(options.host || \"body\").append(workingToast.render().el);\n};\n\nvar hideToast = function hideToast() {\n\tif (workingToast) workingToast.destroy();\n};\n\nmodule.exports = function (App) {\n\t// Listen for toast requests\n\tradio.on(App.Events.Commands.Toast, showToast);\n\tradio.on(App.Events.Commands.BurnToast, hideToast);\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRvYXN0cy5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCIkIiwicmFkaW8iLCJSYWRpbyIsImNoYW5uZWwiLCJUb2FzdCIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiZXh0ZW5kIiwidGVtcGxhdGUiLCJjbGFzc05hbWUiLCJldmVudHMiLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsImNsaWNrIiwiaW5pdGlhbGl6ZSIsIm9wdGlvbnMiLCJzZXJpYWxpemVEYXRhIiwiaWNvbiIsImljb25Db2xvdXIiLCJjb250ZW50IiwicGF1c2UiLCJjbGVhclRpbWVvdXQiLCJ0aW1lciIsInJlc3VtZSIsInRpbWUiLCJzZXRUaW1lb3V0Iiwia2lsbCIsImJpbmQiLCJwYXJzZUludCIsIm9uUmVuZGVyIiwiJGVsIiwiYWRkQ2xhc3MiLCJvbkFmdGVyRGVzdHJveSIsInJlbW92ZUNsYXNzIiwiZGVzdHJveSIsIndvcmtpbmdUb2FzdCIsInNob3dUb2FzdCIsImhvc3QiLCJhcHBlbmQiLCJyZW5kZXIiLCJlbCIsImhpZGVUb2FzdCIsIm1vZHVsZSIsImV4cG9ydHMiLCJBcHAiLCJvbiIsIkV2ZW50cyIsIkNvbW1hbmRzIiwiQnVyblRvYXN0Il0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjs7QUFFQSxJQUFNRSxRQUFRSCxTQUFTSSxLQUFULENBQWVDLE9BQWYsQ0FBdUIsUUFBdkIsQ0FBZDs7QUFFQSxJQUFNQyxRQUFRTixTQUFTTyxVQUFULENBQW9CQyxJQUFwQixDQUF5QkMsTUFBekIsQ0FBZ0M7QUFDN0NDLFdBQVVULFFBQVEseUJBQVIsQ0FEbUM7O0FBRzdDVSxZQUFXLFNBSGtDOztBQUs3Q0MsU0FBUTtBQUNQQyxhQUFXLE9BREo7QUFFUEMsWUFBVSxRQUZIO0FBR1BDLFNBQU87QUFIQSxFQUxxQzs7QUFXN0NDLGFBQVksb0JBQVNDLE9BQVQsRUFBa0I7QUFDN0IsT0FBS0EsT0FBTCxHQUFlQSxPQUFmO0FBQ0EsRUFiNEM7O0FBZTdDQyxnQkFBZSx5QkFBVztBQUN6QixTQUFPLEVBQUVDLE1BQU0sS0FBS0YsT0FBTCxDQUFhRSxJQUFiLElBQXFCLFVBQTdCLEVBQXlDQyxZQUFZLEtBQUtILE9BQUwsQ0FBYUcsVUFBYixJQUEyQixPQUFoRixFQUF5RkMsU0FBUyxLQUFLSixPQUFMLENBQWFJLE9BQS9HLEVBQVA7QUFDQSxFQWpCNEM7O0FBbUI3Q0MsUUFBTyxpQkFBVztBQUNqQkMsZUFBYSxLQUFLQyxLQUFsQjtBQUNBLEVBckI0Qzs7QUF1QjdDQyxTQUFRLGdCQUFTQyxJQUFULEVBQWU7QUFDdEIsT0FBS0YsS0FBTCxHQUFhRyxXQUFXLEtBQUtDLElBQUwsQ0FBVUMsSUFBVixDQUFlLElBQWYsQ0FBWCxFQUFpQyxDQUFDQyxTQUFTSixJQUFULEVBQWUsRUFBZixLQUFzQixDQUF2QixJQUE0QixJQUE3RCxDQUFiO0FBQ0EsRUF6QjRDOztBQTJCN0NLLFdBQVUsb0JBQVc7QUFDcEIsT0FBS04sTUFBTCxDQUFZLENBQVo7O0FBRUEsT0FBS08sR0FBTCxDQUFTQyxRQUFULENBQWtCLFNBQWxCO0FBQ0EsRUEvQjRDOztBQWlDN0NDLGlCQUFnQiwwQkFBVztBQUMxQlgsZUFBYSxLQUFLQyxLQUFsQjtBQUNBLEVBbkM0Qzs7QUFxQzdDSSxPQUFNLGdCQUFXO0FBQ2hCLE9BQUtJLEdBQUwsQ0FBU0csV0FBVCxDQUFxQixTQUFyQjtBQUNBUixhQUFXLEtBQUtTLE9BQUwsQ0FBYVAsSUFBYixDQUFrQixJQUFsQixDQUFYLEVBQW9DLElBQXBDO0FBQ0E7QUF4QzRDLENBQWhDLENBQWQ7O0FBMkNBLElBQUlRLGVBQWUsSUFBbkI7O0FBRUEsSUFBTUMsWUFBWSxTQUFaQSxTQUFZLENBQVNyQixPQUFULEVBQWtCO0FBQ25DLEtBQUlvQixZQUFKLEVBQ0NBLGFBQWFELE9BQWI7O0FBRURDLGdCQUFlLElBQUkvQixLQUFKLENBQVVXLE9BQVYsQ0FBZjs7QUFFQWYsR0FBRWUsUUFBUXNCLElBQVIsSUFBZ0IsTUFBbEIsRUFBMEJDLE1BQTFCLENBQWlDSCxhQUFhSSxNQUFiLEdBQXNCQyxFQUF2RDtBQUNBLENBUEQ7O0FBU0EsSUFBTUMsWUFBWSxTQUFaQSxTQUFZLEdBQVc7QUFDNUIsS0FBSU4sWUFBSixFQUNDQSxhQUFhRCxPQUFiO0FBQ0QsQ0FIRDs7QUFLQVEsT0FBT0MsT0FBUCxHQUFpQixVQUFTQyxHQUFULEVBQWM7QUFDOUI7QUFDQTNDLE9BQU00QyxFQUFOLENBQVNELElBQUlFLE1BQUosQ0FBV0MsUUFBWCxDQUFvQjNDLEtBQTdCLEVBQW9DZ0MsU0FBcEM7QUFDQW5DLE9BQU00QyxFQUFOLENBQVNELElBQUlFLE1BQUosQ0FBV0MsUUFBWCxDQUFvQkMsU0FBN0IsRUFBd0NQLFNBQXhDO0FBQ0EsQ0FKRCIsImZpbGUiOiJ0b2FzdHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5cbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcblxuY29uc3QgVG9hc3QgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy90b2FzdHMubnVualwiKSxcblxuXHRjbGFzc05hbWU6IFwidG9hc3RlclwiLFxuXG5cdGV2ZW50czoge1xuXHRcdG1vdXNlb3ZlcjogXCJwYXVzZVwiLFxuXHRcdG1vdXNlb3V0OiBcInJlc3VtZVwiLFxuXHRcdGNsaWNrOiBcImRlc3Ryb3lcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucztcblx0fSxcblxuXHRzZXJpYWxpemVEYXRhOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4geyBpY29uOiB0aGlzLm9wdGlvbnMuaWNvbiB8fCBcImZhLWNoZWNrXCIsIGljb25Db2xvdXI6IHRoaXMub3B0aW9ucy5pY29uQ29sb3VyIHx8IFwiZ3JlZW5cIiwgY29udGVudDogdGhpcy5vcHRpb25zLmNvbnRlbnQgfTtcblx0fSxcblxuXHRwYXVzZTogZnVuY3Rpb24oKSB7XG5cdFx0Y2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xuXHR9LFxuXG5cdHJlc3VtZTogZnVuY3Rpb24odGltZSkge1xuXHRcdHRoaXMudGltZXIgPSBzZXRUaW1lb3V0KHRoaXMua2lsbC5iaW5kKHRoaXMpLCAocGFyc2VJbnQodGltZSwgMTApIHx8IDIpICogMTAwMCk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMucmVzdW1lKDUpO1xuXG5cdFx0dGhpcy4kZWwuYWRkQ2xhc3MoXCJmYWRlLWluXCIpO1xuXHR9LFxuXG5cdG9uQWZ0ZXJEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHRjbGVhclRpbWVvdXQodGhpcy50aW1lcik7XG5cdH0sXG5cblx0a2lsbDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy4kZWwucmVtb3ZlQ2xhc3MoXCJmYWRlLWluXCIpO1xuXHRcdHNldFRpbWVvdXQodGhpcy5kZXN0cm95LmJpbmQodGhpcyksIDEwMDApO1xuXHR9LFxufSk7XG5cbmxldCB3b3JraW5nVG9hc3QgPSBudWxsO1xuXG5jb25zdCBzaG93VG9hc3QgPSBmdW5jdGlvbihvcHRpb25zKSB7XG5cdGlmICh3b3JraW5nVG9hc3QpXG5cdFx0d29ya2luZ1RvYXN0LmRlc3Ryb3koKTtcblxuXHR3b3JraW5nVG9hc3QgPSBuZXcgVG9hc3Qob3B0aW9ucyk7XG5cblx0JChvcHRpb25zLmhvc3QgfHwgXCJib2R5XCIpLmFwcGVuZCh3b3JraW5nVG9hc3QucmVuZGVyKCkuZWwpO1xufTtcblxuY29uc3QgaGlkZVRvYXN0ID0gZnVuY3Rpb24oKSB7XG5cdGlmICh3b3JraW5nVG9hc3QpXG5cdFx0d29ya2luZ1RvYXN0LmRlc3Ryb3koKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQXBwKSB7XG5cdC8vIExpc3RlbiBmb3IgdG9hc3QgcmVxdWVzdHNcblx0cmFkaW8ub24oQXBwLkV2ZW50cy5Db21tYW5kcy5Ub2FzdCwgc2hvd1RvYXN0KTtcblx0cmFkaW8ub24oQXBwLkV2ZW50cy5Db21tYW5kcy5CdXJuVG9hc3QsIGhpZGVUb2FzdCk7XG59OyJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar Primus = require(\"primus\");\nvar _ = require(\"lodash\");\nvar Promise = require(\"bluebird\");\n\nvar settings = require(\"app-settings\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar wsapi = {};\n\nexports = module.exports = function (App) {\n\tvar Websocket = Backbone.Marionette.Object.extend({\n\t\tinitialize: function initialize() {\n\t\t\tthis.listenTo(radio, App.Events.SessionLoaded, this.loggedIn.bind(this));\n\t\t\tthis.listenTo(radio, App.Events.LoginSuccess, this.loggedIn.bind(this));\n\t\t\tthis.listenTo(radio, App.Events.LogoutSuccess, this.loggedOut.bind(this));\n\n\t\t\tthis.isConnected = false;\n\t\t},\n\n\t\tloggedIn: function loggedIn(authd) {\n\t\t\tif (authd) this.connectSocket();\n\t\t},\n\n\t\tloggedOut: function loggedOut() {\n\t\t\tthis.disconnectSocket();\n\t\t},\n\n\t\tconnectSocket: function connectSocket() {\n\t\t\tif (this.websocket) return;\n\n\t\t\tthis.websocket = Primus.connect(window.location.protocol + \"//\" + window.location.hostname);\n\n\t\t\tthis.websocket.on(\"data\", this.data.bind(this));\n\t\t\tthis.websocket.on(\"error\", this.error.bind(this));\n\t\t\tthis.websocket.on(\"open\", this.connected.bind(this));\n\t\t\tthis.websocket.on(\"close\", this.disconnected.bind(this));\n\t\t},\n\n\t\tdisconnectSocket: function disconnectSocket() {\n\t\t\tif (this.websocket) {\n\t\t\t\tthis.stopListening(this.websocket);\n\n\t\t\t\tthis.websocket.end();\n\t\t\t}\n\n\t\t\tthis.websocket = null;\n\t\t\tthis.disconnected();\n\t\t},\n\n\t\tconnected: function connected() {\n\t\t\tthis.isConnected = true;\n\t\t\tradio.trigger(App.Events.WebsocketConnected);\n\t\t},\n\n\t\tdisconnected: function disconnected() {\n\t\t\tthis.isConnected = false;\n\t\t\tradio.trigger(App.Events.WebsocketDisconnected);\n\t\t},\n\n\t\tgetID: function getID() {\n\t\t\tvar _this = this;\n\n\t\t\treturn new Promise(function (resolve) {\n\t\t\t\t_this.websocket.id(function (id) {\n\t\t\t\t\treturn resolve(id);\n\t\t\t\t});\n\t\t\t});\n\t\t},\n\n\t\tdata: function data(message) {\n\t\t\tif (message.wsapi) {\n\t\t\t\t// Find the pending promise for this call and finalise it\n\t\t\t\tvar p = wsapi[message.i];\n\t\t\t\tdelete wsapi[message._i];\n\n\t\t\t\tif (message.error) return p.reject(new Error(message.error));\n\n\t\t\t\treturn p.resolve(message.payload);\n\t\t\t}\n\n\t\t\tradio.trigger(App.Events.WebsocketMessage, message);\n\t\t},\n\n\t\terror: function error() {\n\t\t\tfor (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n\t\t\t\targs[_key] = arguments[_key];\n\t\t\t}\n\n\t\t\tconsole.log(\"Websocket error\", args);\n\t\t},\n\n\t\tfilter: function filter(_filter, cb) {\n\t\t\treturn function (msg) {\n\t\t\t\tif (_.includes(_.flatten([_filter]), msg.action)) return cb(msg);\n\t\t\t};\n\t\t},\n\n\t\tget: function get(url) {\n\t\t\tvar _this2 = this;\n\n\t\t\tvar options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\t\tvar identifier = _.random(99999999);\n\t\t\twsapi[identifier] = {};\n\n\t\t\treturn new Promise(function (resolve, reject) {\n\t\t\t\t_this2.websocket.write({\n\t\t\t\t\ti: identifier,\n\t\t\t\t\twsapi: true,\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\turl: url.slice(settings.urlRoot.length),\n\t\t\t\t\toptions: options\n\t\t\t\t});\n\n\t\t\t\twsapi[identifier].resolve = resolve;\n\t\t\t\twsapi[identifier].reject = reject;\n\t\t\t});\n\t\t},\n\n\t\tpatch: function patch(url) {\n\t\t\tvar _this3 = this;\n\n\t\t\tvar data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\t\t\tvar options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n\t\t\tvar identifier = _.random(99999999);\n\t\t\twsapi[identifier] = {};\n\n\t\t\treturn new Promise(function (resolve, reject) {\n\t\t\t\t_this3.websocket.write({\n\t\t\t\t\ti: identifier,\n\t\t\t\t\twsapi: true,\n\t\t\t\t\tmethod: \"PATCH\",\n\t\t\t\t\turl: url.slice(settings.urlRoot.length),\n\t\t\t\t\tbody: data,\n\t\t\t\t\toptions: options\n\t\t\t\t});\n\n\t\t\t\twsapi[identifier].resolve = resolve;\n\t\t\t\twsapi[identifier].reject = reject;\n\t\t\t});\n\t\t}\n\n\t\t/*post: function() {\n  \t},\n  \tput: function() {\n  \t},\n  \tdel: function() {\n  \t}*/\n\t});\n\n\tApp.Websockets = App.ws = new Websocket();\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnNvY2tldHMuanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwiUHJpbXVzIiwiXyIsIlByb21pc2UiLCJzZXR0aW5ncyIsInJhZGlvIiwiUmFkaW8iLCJjaGFubmVsIiwid3NhcGkiLCJleHBvcnRzIiwibW9kdWxlIiwiQXBwIiwiV2Vic29ja2V0IiwiTWFyaW9uZXR0ZSIsIk9iamVjdCIsImV4dGVuZCIsImluaXRpYWxpemUiLCJsaXN0ZW5UbyIsIkV2ZW50cyIsIlNlc3Npb25Mb2FkZWQiLCJsb2dnZWRJbiIsImJpbmQiLCJMb2dpblN1Y2Nlc3MiLCJMb2dvdXRTdWNjZXNzIiwibG9nZ2VkT3V0IiwiaXNDb25uZWN0ZWQiLCJhdXRoZCIsImNvbm5lY3RTb2NrZXQiLCJkaXNjb25uZWN0U29ja2V0Iiwid2Vic29ja2V0IiwiY29ubmVjdCIsIndpbmRvdyIsImxvY2F0aW9uIiwicHJvdG9jb2wiLCJob3N0bmFtZSIsIm9uIiwiZGF0YSIsImVycm9yIiwiY29ubmVjdGVkIiwiZGlzY29ubmVjdGVkIiwic3RvcExpc3RlbmluZyIsImVuZCIsInRyaWdnZXIiLCJXZWJzb2NrZXRDb25uZWN0ZWQiLCJXZWJzb2NrZXREaXNjb25uZWN0ZWQiLCJnZXRJRCIsImlkIiwicmVzb2x2ZSIsIm1lc3NhZ2UiLCJwIiwiaSIsIl9pIiwicmVqZWN0IiwiRXJyb3IiLCJwYXlsb2FkIiwiV2Vic29ja2V0TWVzc2FnZSIsImFyZ3MiLCJjb25zb2xlIiwibG9nIiwiZmlsdGVyIiwiY2IiLCJtc2ciLCJpbmNsdWRlcyIsImZsYXR0ZW4iLCJhY3Rpb24iLCJnZXQiLCJ1cmwiLCJvcHRpb25zIiwiaWRlbnRpZmllciIsInJhbmRvbSIsIndyaXRlIiwibWV0aG9kIiwic2xpY2UiLCJ1cmxSb290IiwibGVuZ3RoIiwicGF0Y2giLCJib2R5IiwiV2Vic29ja2V0cyIsIndzIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7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QUFQO0FBYUE7O0FBRUQ7Ozs7OztBQXpIbUQsRUFBbEMsQ0FBbEI7O0FBc0lBekMsS0FBSWtFLFVBQUosR0FBaUJsRSxJQUFJbUUsRUFBSixHQUFTLElBQUlsRSxTQUFKLEVBQTFCO0FBQ0EsQ0F4SUQiLCJmaWxlIjoid2Vic29ja2V0cy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCBQcmltdXMgPSByZXF1aXJlKFwicHJpbXVzXCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBQcm9taXNlID0gcmVxdWlyZShcImJsdWViaXJkXCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcblxuY29uc3Qgd3NhcGkgPSB7fTtcblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQXBwKSB7XG5cdGNvbnN0IFdlYnNvY2tldCA9IEJhY2tib25lLk1hcmlvbmV0dGUuT2JqZWN0LmV4dGVuZCh7XG5cdFx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHR0aGlzLmxpc3RlblRvKHJhZGlvLCBBcHAuRXZlbnRzLlNlc3Npb25Mb2FkZWQsIHRoaXMubG9nZ2VkSW4uYmluZCh0aGlzKSk7XG5cdFx0XHR0aGlzLmxpc3RlblRvKHJhZGlvLCBBcHAuRXZlbnRzLkxvZ2luU3VjY2VzcywgdGhpcy5sb2dnZWRJbi5iaW5kKHRoaXMpKTtcblx0XHRcdHRoaXMubGlzdGVuVG8ocmFkaW8sIEFwcC5FdmVudHMuTG9nb3V0U3VjY2VzcywgdGhpcy5sb2dnZWRPdXQuYmluZCh0aGlzKSk7XG5cblx0XHRcdHRoaXMuaXNDb25uZWN0ZWQgPSBmYWxzZTtcblx0XHR9LFxuXG5cdFx0bG9nZ2VkSW46IGZ1bmN0aW9uKGF1dGhkKSB7XG5cdFx0XHRpZiAoYXV0aGQpXG5cdFx0XHRcdHRoaXMuY29ubmVjdFNvY2tldCgpO1xuXHRcdH0sXG5cblx0XHRsb2dnZWRPdXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dGhpcy5kaXNjb25uZWN0U29ja2V0KCk7XG5cdFx0fSxcblxuXHRcdGNvbm5lY3RTb2NrZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKHRoaXMud2Vic29ja2V0KVxuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdHRoaXMud2Vic29ja2V0ID0gUHJpbXVzLmNvbm5lY3Qod2luZG93LmxvY2F0aW9uLnByb3RvY29sICsgXCIvL1wiICsgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTtcblxuXHRcdFx0dGhpcy53ZWJzb2NrZXQub24oXCJkYXRhXCIsIHRoaXMuZGF0YS5iaW5kKHRoaXMpKTtcblx0XHRcdHRoaXMud2Vic29ja2V0Lm9uKFwiZXJyb3JcIiwgdGhpcy5lcnJvci5iaW5kKHRoaXMpKTtcblx0XHRcdHRoaXMud2Vic29ja2V0Lm9uKFwib3BlblwiLCB0aGlzLmNvbm5lY3RlZC5iaW5kKHRoaXMpKTtcblx0XHRcdHRoaXMud2Vic29ja2V0Lm9uKFwiY2xvc2VcIiwgdGhpcy5kaXNjb25uZWN0ZWQuYmluZCh0aGlzKSk7XG5cdFx0fSxcblxuXHRcdGRpc2Nvbm5lY3RTb2NrZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKHRoaXMud2Vic29ja2V0KSB7XG5cdFx0XHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLndlYnNvY2tldCk7XG5cblx0XHRcdFx0dGhpcy53ZWJzb2NrZXQuZW5kKCk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMud2Vic29ja2V0ID0gbnVsbDtcblx0XHRcdHRoaXMuZGlzY29ubmVjdGVkKCk7XG5cdFx0fSxcblxuXHRcdGNvbm5lY3RlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHR0aGlzLmlzQ29ubmVjdGVkID0gdHJ1ZTtcblx0XHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5XZWJzb2NrZXRDb25uZWN0ZWQpO1xuXHRcdH0sXG5cblx0XHRkaXNjb25uZWN0ZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dGhpcy5pc0Nvbm5lY3RlZCA9IGZhbHNlO1xuXHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLldlYnNvY2tldERpc2Nvbm5lY3RlZCk7XG5cdFx0fSxcblxuXHRcdGdldElEOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcblx0XHRcdFx0dGhpcy53ZWJzb2NrZXQuaWQoaWQgPT4gcmVzb2x2ZShpZCkpO1xuXHRcdFx0fSk7XG5cdFx0fSxcblxuXHRcdGRhdGE6IGZ1bmN0aW9uKG1lc3NhZ2UpIHtcblx0XHRcdGlmIChtZXNzYWdlLndzYXBpKSB7XG5cdFx0XHRcdC8vIEZpbmQgdGhlIHBlbmRpbmcgcHJvbWlzZSBmb3IgdGhpcyBjYWxsIGFuZCBmaW5hbGlzZSBpdFxuXHRcdFx0XHRjb25zdCBwID0gd3NhcGlbbWVzc2FnZS5pXTtcblx0XHRcdFx0ZGVsZXRlIHdzYXBpW21lc3NhZ2UuX2ldO1xuXG5cdFx0XHRcdGlmIChtZXNzYWdlLmVycm9yKVxuXHRcdFx0XHRcdHJldHVybiBwLnJlamVjdChuZXcgRXJyb3IobWVzc2FnZS5lcnJvcikpO1xuXG5cdFx0XHRcdHJldHVybiBwLnJlc29sdmUobWVzc2FnZS5wYXlsb2FkKTtcblx0XHRcdH1cblxuXHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLldlYnNvY2tldE1lc3NhZ2UsIG1lc3NhZ2UpO1xuXHRcdH0sXG5cblx0XHRlcnJvcjogZnVuY3Rpb24oLi4uYXJncykge1xuXHRcdFx0Y29uc29sZS5sb2coXCJXZWJzb2NrZXQgZXJyb3JcIiwgYXJncyk7XG5cdFx0fSxcblxuXHRcdGZpbHRlcjogZnVuY3Rpb24oZmlsdGVyLCBjYikge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKG1zZykge1xuXHRcdFx0XHRpZiAoXy5pbmNsdWRlcyhfLmZsYXR0ZW4oW2ZpbHRlcl0pLCBtc2cuYWN0aW9uKSlcblx0XHRcdFx0XHRyZXR1cm4gY2IobXNnKTtcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdGdldDogZnVuY3Rpb24odXJsLCBvcHRpb25zID0ge30pIHtcblx0XHRcdGNvbnN0IGlkZW50aWZpZXIgPSBfLnJhbmRvbSg5OTk5OTk5OSk7XG5cdFx0XHR3c2FwaVtpZGVudGlmaWVyXSA9IHt9O1xuXG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHR0aGlzLndlYnNvY2tldC53cml0ZSh7XG5cdFx0XHRcdFx0aTogaWRlbnRpZmllcixcblx0XHRcdFx0XHR3c2FwaTogdHJ1ZSxcblx0XHRcdFx0XHRtZXRob2Q6IFwiR0VUXCIsXG5cdFx0XHRcdFx0dXJsOiB1cmwuc2xpY2Uoc2V0dGluZ3MudXJsUm9vdC5sZW5ndGgpLFxuXHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHdzYXBpW2lkZW50aWZpZXJdLnJlc29sdmUgPSByZXNvbHZlO1xuXHRcdFx0XHR3c2FwaVtpZGVudGlmaWVyXS5yZWplY3QgPSByZWplY3Q7XG5cdFx0XHR9KTtcblx0XHR9LFxuXG5cblx0XHRwYXRjaDogZnVuY3Rpb24odXJsLCBkYXRhID0ge30sIG9wdGlvbnMgPSB7fSkge1xuXHRcdFx0Y29uc3QgaWRlbnRpZmllciA9IF8ucmFuZG9tKDk5OTk5OTk5KTtcblx0XHRcdHdzYXBpW2lkZW50aWZpZXJdID0ge307XG5cblx0XHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdHRoaXMud2Vic29ja2V0LndyaXRlKHtcblx0XHRcdFx0XHRpOiBpZGVudGlmaWVyLFxuXHRcdFx0XHRcdHdzYXBpOiB0cnVlLFxuXHRcdFx0XHRcdG1ldGhvZDogXCJQQVRDSFwiLFxuXHRcdFx0XHRcdHVybDogdXJsLnNsaWNlKHNldHRpbmdzLnVybFJvb3QubGVuZ3RoKSxcblx0XHRcdFx0XHRib2R5OiBkYXRhLFxuXHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHdzYXBpW2lkZW50aWZpZXJdLnJlc29sdmUgPSByZXNvbHZlO1xuXHRcdFx0XHR3c2FwaVtpZGVudGlmaWVyXS5yZWplY3QgPSByZWplY3Q7XG5cdFx0XHR9KTtcblx0XHR9LFxuXG5cdFx0Lypwb3N0OiBmdW5jdGlvbigpIHtcblxuXHRcdH0sXG5cblx0XHRwdXQ6IGZ1bmN0aW9uKCkge1xuXG5cdFx0fSxcblxuXHRcdGRlbDogZnVuY3Rpb24oKSB7XG5cblx0XHR9Ki9cblx0fSk7XG5cblx0QXBwLldlYnNvY2tldHMgPSBBcHAud3MgPSBuZXcgV2Vic29ja2V0KCk7XG59OyJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\n\nvar gradeMap = require(\"../lib/gradeMap\");\n\nmodule.exports = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"_id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/epubs\";\n\t},\n\n\tcomputeds: {\n\t\tbookGrade: function bookGrade() {\n\t\t\treturn gradeMap.codeToHumanValue(this.get(\"grade\"));\n\t\t},\n\t\tbookFormat: function bookFormat() {\n\t\t\treturn \"<img src='\" + settings.urlRoot + \"/images/\" + (this.get(\"format\") === \"mpub\" ? \"epub\" : \"pdf\") + \".png' style='max-width: 25px;'>\";\n\t\t},\n\t\tbookChanged: function bookChanged() {\n\t\t\treturn this.get(\"updated\") || this.get(\"created\");\n\t\t},\n\t\tbookGroups: function bookGroups() {\n\t\t\treturn this.get(\"groups\") === null ? \"*\" : this.get(\"groups\").length;\n\t\t},\n\t\tbookYears: function bookYears() {\n\t\t\treturn (this.get(\"years\") || [\"-\"]).sort().join(\",\");\n\t\t}\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJvb2tNb2RlbC5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCJzZXR0aW5ncyIsImdyYWRlTWFwIiwibW9kdWxlIiwiZXhwb3J0cyIsIkVwb3h5IiwiTW9kZWwiLCJleHRlbmQiLCJpZEF0dHJpYnV0ZSIsInVybFJvb3QiLCJjb21wdXRlZHMiLCJib29rR3JhZGUiLCJjb2RlVG9IdW1hblZhbHVlIiwiZ2V0IiwiYm9va0Zvcm1hdCIsImJvb2tDaGFuZ2VkIiwiYm9va0dyb3VwcyIsImxlbmd0aCIsImJvb2tZZWFycyIsInNvcnQiLCJqb2luIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7O0FBRUEsSUFBTUMsV0FBV0QsUUFBUSxjQUFSLENBQWpCOztBQUVBLElBQU1FLFdBQVdGLFFBQVEsaUJBQVIsQ0FBakI7O0FBRUFHLE9BQU9DLE9BQVAsR0FBaUJMLFNBQVNNLEtBQVQsQ0FBZUMsS0FBZixDQUFxQkMsTUFBckIsQ0FBNEI7QUFDNUNDLGNBQWEsS0FEK0I7O0FBRzVDQyxVQUFTLG1CQUFXO0FBQ25CLFNBQU9SLFNBQVNRLE9BQVQsR0FBbUIsZ0JBQTFCO0FBQ0EsRUFMMkM7O0FBTzVDQyxZQUFXO0FBQ1ZDLGFBQVcscUJBQVc7QUFDckIsVUFBT1QsU0FBU1UsZ0JBQVQsQ0FBMEIsS0FBS0MsR0FBTCxDQUFTLE9BQVQsQ0FBMUIsQ0FBUDtBQUNBLEdBSFM7QUFJVkMsY0FBWSxzQkFBVztBQUN0QixVQUFPLGVBQWViLFNBQVNRLE9BQXhCLEdBQWtDLFVBQWxDLElBQWdELEtBQUtJLEdBQUwsQ0FBUyxRQUFULE1BQXVCLE1BQXZCLEdBQWdDLE1BQWhDLEdBQXlDLEtBQXpGLElBQWtHLGlDQUF6RztBQUNBLEdBTlM7QUFPVkUsZUFBYSx1QkFBVztBQUN2QixVQUFPLEtBQUtGLEdBQUwsQ0FBUyxTQUFULEtBQXVCLEtBQUtBLEdBQUwsQ0FBUyxTQUFULENBQTlCO0FBQ0EsR0FUUztBQVVWRyxjQUFZLHNCQUFXO0FBQ3RCLFVBQU8sS0FBS0gsR0FBTCxDQUFTLFFBQVQsTUFBdUIsSUFBdkIsR0FBOEIsR0FBOUIsR0FBb0MsS0FBS0EsR0FBTCxDQUFTLFFBQVQsRUFBbUJJLE1BQTlEO0FBQ0EsR0FaUztBQWFWQyxhQUFXLHFCQUFXO0FBQ3JCLFVBQU8sQ0FBQyxLQUFLTCxHQUFMLENBQVMsT0FBVCxLQUFxQixDQUFDLEdBQUQsQ0FBdEIsRUFBNkJNLElBQTdCLEdBQW9DQyxJQUFwQyxDQUF5QyxHQUF6QyxDQUFQO0FBQ0E7QUFmUztBQVBpQyxDQUE1QixDQUFqQiIsImZpbGUiOiJib29rTW9kZWwuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IGdyYWRlTWFwID0gcmVxdWlyZShcIi4uL2xpYi9ncmFkZU1hcFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5FcG94eS5Nb2RlbC5leHRlbmQoe1xuXHRpZEF0dHJpYnV0ZTogXCJfaWRcIixcblxuXHR1cmxSb290OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvZXB1YnNcIjtcblx0fSxcblxuXHRjb21wdXRlZHM6IHtcblx0XHRib29rR3JhZGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIGdyYWRlTWFwLmNvZGVUb0h1bWFuVmFsdWUodGhpcy5nZXQoXCJncmFkZVwiKSk7XG5cdFx0fSxcblx0XHRib29rRm9ybWF0OiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBcIjxpbWcgc3JjPSdcIiArIHNldHRpbmdzLnVybFJvb3QgKyBcIi9pbWFnZXMvXCIgKyAodGhpcy5nZXQoXCJmb3JtYXRcIikgPT09IFwibXB1YlwiID8gXCJlcHViXCIgOiBcInBkZlwiKSArIFwiLnBuZycgc3R5bGU9J21heC13aWR0aDogMjVweDsnPlwiO1xuXHRcdH0sXG5cdFx0Ym9va0NoYW5nZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0KFwidXBkYXRlZFwiKSB8fCB0aGlzLmdldChcImNyZWF0ZWRcIik7XG5cdFx0fSxcblx0XHRib29rR3JvdXBzOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLmdldChcImdyb3Vwc1wiKSA9PT0gbnVsbCA/IFwiKlwiIDogdGhpcy5nZXQoXCJncm91cHNcIikubGVuZ3RoO1xuXHRcdH0sXG5cdFx0Ym9va1llYXJzOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiAodGhpcy5nZXQoXCJ5ZWFyc1wiKSB8fCBbXCItXCJdKS5zb3J0KCkuam9pbihcIixcIik7XG5cdFx0fSxcblx0fSxcbn0pOyJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar BookUploader = require(\"./views/bookupload\");\nvar BookManager = require(\"./views/bookmanager\");\n\nvar Module = module.exports = new Backbone.Marionette.Application();\n\n// Add intra-module routing\nModule.routing = function (App) {\n\tModule.Router = {\n\t\troutes: {\n\t\t\tupload: \"uploadBooks\",\n\t\t\tmanage: \"manageBooks\"\n\t\t},\n\n\t\tuploadBooks: function uploadBooks() {\n\t\t\tApp.loadView(new BookUploader());\n\t\t},\n\n\t\tmanageBooks: function manageBooks() {\n\t\t\tApp.loadView(new BookManager());\n\t\t}\n\t};\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIkJvb2tVcGxvYWRlciIsIkJvb2tNYW5hZ2VyIiwiTW9kdWxlIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1hcmlvbmV0dGUiLCJBcHBsaWNhdGlvbiIsInJvdXRpbmciLCJSb3V0ZXIiLCJyb3V0ZXMiLCJ1cGxvYWQiLCJtYW5hZ2UiLCJ1cGxvYWRCb29rcyIsIkFwcCIsImxvYWRWaWV3IiwibWFuYWdlQm9va3MiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjs7QUFFQSxJQUFNQyxlQUFlRCxRQUFRLG9CQUFSLENBQXJCO0FBQ0EsSUFBTUUsY0FBY0YsUUFBUSxxQkFBUixDQUFwQjs7QUFFQSxJQUFNRyxTQUFTQyxPQUFPQyxPQUFQLEdBQWlCLElBQUlOLFNBQVNPLFVBQVQsQ0FBb0JDLFdBQXhCLEVBQWhDOztBQUVBO0FBQ0FKLE9BQU9LLE9BQVAsR0FBaUIsZUFBTztBQUN2QkwsUUFBT00sTUFBUCxHQUFnQjtBQUNmQyxVQUFRO0FBQ1BDLFdBQVEsYUFERDtBQUVQQyxXQUFRO0FBRkQsR0FETzs7QUFNZkMsZUFBYSx1QkFBVztBQUN2QkMsT0FBSUMsUUFBSixDQUFhLElBQUlkLFlBQUosRUFBYjtBQUNBLEdBUmM7O0FBVWZlLGVBQWEsdUJBQVc7QUFDdkJGLE9BQUlDLFFBQUosQ0FBYSxJQUFJYixXQUFKLEVBQWI7QUFDQTtBQVpjLEVBQWhCO0FBY0EsQ0FmRCIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5cbmNvbnN0IEJvb2tVcGxvYWRlciA9IHJlcXVpcmUoXCIuL3ZpZXdzL2Jvb2t1cGxvYWRcIik7XG5jb25zdCBCb29rTWFuYWdlciA9IHJlcXVpcmUoXCIuL3ZpZXdzL2Jvb2ttYW5hZ2VyXCIpO1xuXG5jb25zdCBNb2R1bGUgPSBtb2R1bGUuZXhwb3J0cyA9IG5ldyBCYWNrYm9uZS5NYXJpb25ldHRlLkFwcGxpY2F0aW9uKCk7XG5cbi8vIEFkZCBpbnRyYS1tb2R1bGUgcm91dGluZ1xuTW9kdWxlLnJvdXRpbmcgPSBBcHAgPT4ge1xuXHRNb2R1bGUuUm91dGVyID0ge1xuXHRcdHJvdXRlczoge1xuXHRcdFx0dXBsb2FkOiBcInVwbG9hZEJvb2tzXCIsXG5cdFx0XHRtYW5hZ2U6IFwibWFuYWdlQm9va3NcIixcblx0XHR9LFxuXG5cdFx0dXBsb2FkQm9va3M6IGZ1bmN0aW9uKCkge1xuXHRcdFx0QXBwLmxvYWRWaWV3KG5ldyBCb29rVXBsb2FkZXIoKSk7XG5cdFx0fSxcblxuXHRcdG1hbmFnZUJvb2tzOiBmdW5jdGlvbigpIHtcblx0XHRcdEFwcC5sb2FkVmlldyhuZXcgQm9va01hbmFnZXIoKSk7XG5cdFx0fSxcblx0fTtcbn07Il19",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar content_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n<div class=\\\"container\\\">\\n\\t<div class=\\\"book-metadata\\\">\\n\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t\\t<label>Universal ID\\n\\t\\t\\t\\t\\t<div class=\\\"textual\\\">\\n\\t\\t\\t\\t\\t\\t<strong>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"universal_id\"), env.opts.autoescape);\noutput += \"</strong>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t\\t<label>Local ID\\n\\t\\t\\t\\t\\t<div class=\\\"textual\\\">\\n\\t\\t\\t\\t\\t\\t<strong>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"_id\"), env.opts.autoescape);\noutput += \"</strong>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t\\t<label>Book Name\\n\\t\\t\\t\\t\\t<div class=\\\"textual\\\">\\n\\t\\t\\t\\t\\t\\t<strong>\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"title\")), env.opts.autoescape);\noutput += \"</strong>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t\\t<label>Publisher\\n\\t\\t\\t\\t\\t<div class=\\\"textual publisherText\\\">\\n\\t\\t\\t\\t\\t\\t<strong>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"publisher\"), env.opts.autoescape);\noutput += \"</strong>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t\\t<label>Subject\\n\\t\\t\\t\\t\\t<div class=\\\"textual\\\">\\n\\t\\t\\t\\t\\t\\t<strong>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"subject\"), env.opts.autoescape);\noutput += \"</strong>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t\\t<label>Year of Study\\n\\t\\t\\t\\t\\t<div class=\\\"textual\\\">\\n\\t\\t\\t\\t\\t\\t<strong>\";\noutput += runtime.suppressValue(env.getFilter(\"gradeMap\").call(context, runtime.contextOrFrameLookup(context, frame, \"grade\")), env.opts.autoescape);\noutput += \"</strong>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t\\t<label>Language\\n\\t\\t\\t\\t\\t<div class=\\\"textual\\\">\\n\\t\\t\\t\\t\\t\\t<strong>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"language\"), env.opts.autoescape);\noutput += \"</strong>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t\\t<label>Edition\\n\\t\\t\\t\\t\\t<div class=\\\"textual\\\">\\n\\t\\t\\t\\t\\t\\t<strong>\";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"edition\")?runtime.contextOrFrameLookup(context, frame, \"edition\"):\"(not specified)\"), env.opts.autoescape);\noutput += \"</strong>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t\\t<label>ISBN\\n\\t\\t\\t\\t\\t<div class=\\\"textual\\\">\\n\\t\\t\\t\\t\\t\\t<strong>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"isbn\"), env.opts.autoescape);\noutput += \"</strong>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t\\t<label>Version\\n\\t\\t\\t\\t\\t<div class=\\\"textual\\\">\\n\\t\\t\\t\\t\\t\\t<strong>\";\noutput += runtime.suppressValue(env.getFilter(\"versionFormat\").call(context, runtime.contextOrFrameLookup(context, frame, \"version\")), env.opts.autoescape);\noutput += \"</strong>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t\\t<label>Chosen For Years\\n\\t\\t\\t\\t\\t<div class=\\\"textual\\\">\\n\\t\\t\\t\\t\\t\\t<strong>\";\noutput += runtime.suppressValue((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"years\")),\"length\")?(lineno = 97, colno = 25, runtime.callWrap(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"years\")),\"join\"), \"years[\\\"join\\\"]\", context, [\", \"])):\"(none)\"), env.opts.autoescape);\noutput += \"</strong>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t\\t<label>Activation Date\\n\\t\\t\\t\\t\\t<input type=\\\"text\\\" name=\\\"activation\\\" readonly placeholder=\\\"When the book will become accessible\\\" \";\noutput += runtime.suppressValue((!(lineno = 104, colno = 129, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, []))?\"disabled\":\"\"), env.opts.autoescape);\noutput += \"/>\\n\\t\\t\\t\\t\\t<div class=\\\"input-overlay hide\\\" title=\\\"Clear field\\\"><span class=\\\"fal fa-times\\\"/></div>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t\\t<label>Printability\\n\\t\\t\\t\\t\\t<div class=\\\"textual\\\">\\n\\t\\t\\t\\t\\t\\t<strong>Printing of this book is \";\noutput += runtime.suppressValue((!runtime.contextOrFrameLookup(context, frame, \"allowPrint\")?\"not\":\"\"), env.opts.autoescape);\noutput += \" allowed</strong>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t\";\nif(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"externalSync\")),\"bookGroupAllocations\") == \"rw\") {\noutput += \"\\n\\t\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t\\t<label>Groups Locked By External Sync<br/>\\n\\t\\t\\t\\t\\t\\t<select name=\\\"locked-groups\\\" data-placeholder=\\\"Book groups\\\" multiple disabled/>\\n\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t\";\n;\n}\noutput += \"\\n\\n\\t\\t\";\nif(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"externalSync\")),\"bookGroupAllocations\") != \"rw\" || runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"externalSync\")),\"groupYearExclusions\")),\"length\")) {\noutput += \"\\n\\t\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t\\t<label>Groups\\n\\t\\t\\t\\t\\t\\t<select name=\\\"groups\\\" data-placeholder=\\\"Book groups\\\" multiple \";\noutput += runtime.suppressValue((!(lineno = 134, colno = 95, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, [])) || (runtime.contextOrFrameLookup(context, frame, \"groups\") == runtime.contextOrFrameLookup(context, frame, \"null\") && !(env.getFilter(\"isArray\").call(context, runtime.contextOrFrameLookup(context, frame, \"groups\")))) || !(env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"books\")),\"assignGroups\")))?\"disabled\":\"\"), env.opts.autoescape);\noutput += \"/>\\n\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t\";\n;\n}\noutput += \"\\n\\n\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"has_tokens\")) {\noutput += \"\\n\\t\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t\\t<br><strong>This book has active tokens. Access to the book can only be granted through licenses, not groups.</strong>\\n\\t\\t\\t\\t\\t<label>Token Groups<br/>\\n\\t\\t\\t\\t\\t\\t<select name=\\\"token-groups\\\" data-placeholder=\\\"Token groups\\\" multiple disabled/>\\n\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t\";\n;\n}\noutput += \"\\n\\n\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t\\t\";\nif(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"externalSync\")),\"bookGroupAllocations\") != \"rw\" && (lineno = 153, colno = 62, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, []))) {\noutput += \"\\n\\t\\t\\t\\t\\t<label><input type=\\\"checkbox\\\" name=\\\"assignAll\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"groups\") == runtime.contextOrFrameLookup(context, frame, \"null\") && !(env.getFilter(\"isArray\").call(context, runtime.contextOrFrameLookup(context, frame, \"groups\")))?\"checked\":\"\"), env.opts.autoescape);\noutput += \" \";\noutput += runtime.suppressValue((!(lineno = 154, colno = 144, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, [])) || !(env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"books\")),\"assignAll\")))?\"disabled\":\"\"), env.opts.autoescape);\noutput += \"/> Assign book to all users</label>\\n\\t\\t\\t\\t\";\n;\n}\nelse {\nif(!(lineno = 155, colno = 22, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, [])) || (runtime.contextOrFrameLookup(context, frame, \"groups\") == \"\" && !(env.getFilter(\"isArray\").call(context, runtime.contextOrFrameLookup(context, frame, \"groups\"))))) {\noutput += \"\\n\\t\\t\\t\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"groups\") == \"\" && !(env.getFilter(\"isArray\").call(context, runtime.contextOrFrameLookup(context, frame, \"groups\")))) {\noutput += \"\\n\\t\\t\\t\\t\\t\\t<label><div class=\\\"textual\\\"><strong>&middot; Book is assigned to all users</strong></div></label>\\n\\t\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t\";\n;\n}\n;\n}\noutput += \"\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"bookTokenMode\")) {\noutput += \"\\n\\t\\t\\t\\t\";\nif((lineno = 164, colno = 16, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, []))) {\noutput += \"\\n\\t\\t\\t\\t\\t<label><input type=\\\"checkbox\\\" name=\\\"purchaseOverride\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"purchaseOverride\")?\"checked\":\"\"), env.opts.autoescape);\noutput += \"/> Make available without purchase</label>\\n\\t\\t\\t\\t\";\n;\n}\nelse {\nif(runtime.contextOrFrameLookup(context, frame, \"purchaseOverride\")) {\noutput += \"\\n\\t\\t\\t\\t\\t<label><div class=\\\"textual\\\"><strong>&middot; Available without purchase</strong></div></label>\\n\\t\\t\\t\\t\";\n;\n}\n;\n}\noutput += \"\\n\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t\\t\";\nif((lineno = 175, colno = 16, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, []))) {\noutput += \"\\n\\t\\t\\t\\t\\t<label><input type=\\\"checkbox\\\" name=\\\"ignoreErrors\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"ignoreErrors\")?\"checked\":\"\"), env.opts.autoescape);\noutput += \"/> Do not log access errors for this book</label>\\n\\t\\t\\t\\t\";\n;\n}\nelse {\nif(runtime.contextOrFrameLookup(context, frame, \"ignoreErrors\")) {\noutput += \"\\n\\t\\t\\t\\t\\t<label><div class=\\\"textual\\\"><strong>&middot; Not logging access errors for this book</strong></div></label>\\n\\t\\t\\t\\t\";\n;\n}\n;\n}\noutput += \"\\n\\t\\t\\t</div>\\n\\t\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t\\t\";\nif((lineno = 182, colno = 21, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"printOverride\"), \"printOverride\", context, []))) {\noutput += \"\\n\\t\\t\\t\\t\\t<label><input type=\\\"checkbox\\\" name=\\\"allowPrint\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"allowPrint\")?\"checked\":\"\"), env.opts.autoescape);\noutput += \"/> Allow book to be printed</label>\\n\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</div>\\n\\t<div class=\\\"book-cover-image-chooser\\\">\\n\\t\\t<div class=\\\"book-cover-image\\\"></div>\\n\\t</div>\\n</div>\\n\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar content_oldRoot = content_obj.root;\ncontent_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcontent_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"content\": new nunjucks.Template( {obj: content_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"header\\\">\\n\\t<h4 class=\\\"title left\\\"><span class=\\\"fal fa-book\\\"/>&nbsp;Book Management</h4>\\n\\n\\t<div class=\\\"actions\\\">\\n\\t\\t<div class=\\\"upload\\\"><span class=\\\"fal fa-key\\\"/> Upload Keys Manually</div>\\n\\t\\t<div class=\\\"downloadList\\\"><span class=\\\"fal fa-cloud-download\\\"/> Downloads</div>\\n\\t</div>\\n</div>\\n\\n<div class=\\\"ops-bar\\\">\\n\\t<div class=\\\"filters\\\"></div>\\n\\t<div class=\\\"counter\\\"></div>\\n</div>\\n\\n<div class=\\\"grid\\\"></div>\\n\\n<div class=\\\"paging\\\"></div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\nvar macro_t_1 = runtime.makeMacro(\n[], \n[], \nfunction (kwargs) {\nframe = frame.push();\nkwargs = kwargs || {};\nif (kwargs.hasOwnProperty(\"caller\")) {\nframe.set(\"caller\", kwargs.caller); }\nvar t_2 = \"\";t_2 += \"\\n<div class=\\\"book-metadata\\\">\\n\\t\";\nif(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"metadata\")),\"format\") == 5) {\nt_2 += \"\\n\\t<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"large-12 columns\\\" style=\\\"margin-bottom: 20px\\\">\\n\\t\\t\\t<strong style=\\\"color: red\\\"><span class=\\\"fal fa-exclamation-triangle\\\"/> The encryption format of this book is out of date; maths and page numbers will not function. If possible, please get an updated copy of this book instead.</strong>\\n\\t\\t</div>\\n\\t</div>\\n\\t\";\n;\n}\nt_2 += \"\\n\\t<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<label>Universal ID\\n\\t\\t\\t\\t<div class=\\\"textual\\\">\\n\\t\\t\\t\\t\\t<strong>\";\nt_2 += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"metadata\")),\"bookID\"), env.opts.autoescape);\nt_2 += \"</strong>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t<label>Book Name\\n\\t\\t\\t\\t<div class=\\\"textual\\\">\\n\\t\\t\\t\\t\\t<strong>\";\nt_2 += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"metadata\")),\"title\"), env.opts.autoescape);\nt_2 += \"</strong>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t<label>Publisher\\n\\t\\t\\t\\t<div class=\\\"textual publisherText\\\">\\n\\t\\t\\t\\t\\t<strong>\";\nt_2 += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"metadata\")),\"publisher\"), env.opts.autoescape);\nt_2 += \"</strong>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t<label>Subject\\n\\t\\t\\t\\t<div class=\\\"textual\\\">\\n\\t\\t\\t\\t\\t<strong>\";\nt_2 += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"metadata\")),\"subject\"), env.opts.autoescape);\nt_2 += \"</strong>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t<label>Year of Study\\n\\t\\t\\t\\t<div class=\\\"textual\\\">\\n\\t\\t\\t\\t\\t<strong>\";\nt_2 += runtime.suppressValue(env.getFilter(\"gradeMap\").call(context, runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"metadata\")),\"grade\")), env.opts.autoescape);\nt_2 += \"</strong>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t<label>Language\\n\\t\\t\\t\\t<div class=\\\"textual\\\">\\n\\t\\t\\t\\t\\t<strong>\";\nt_2 += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"metadata\")),\"language\"), env.opts.autoescape);\nt_2 += \"</strong>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t<label>ISBN\\n\\t\\t\\t\\t<div class=\\\"textual\\\">\\n\\t\\t\\t\\t\\t<strong>\";\nt_2 += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"metadata\")),\"isbn\"), env.opts.autoescape);\nt_2 += \"</strong>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t<label>Markets\\n\\t\\t\\t\\t<div class=\\\"textual\\\">\\n\\t\\t\\t\\t\\t<strong>\";\nt_2 += runtime.suppressValue((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"metadata\")),\"markets\")?(lineno = 77, colno = 35, runtime.callWrap(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"metadata\")),\"markets\")),\"join\"), \"metadata[\\\"markets\\\"][\\\"join\\\"]\", context, [\", \"])):\"(none)\"), env.opts.autoescape);\nt_2 += \"</strong>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\n\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t<label>Regions\\n\\t\\t\\t\\t<div class=\\\"textual\\\">\\n\\t\\t\\t\\t\\t<strong>\";\nt_2 += runtime.suppressValue((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"metadata\")),\"regions\")?(lineno = 86, colno = 35, runtime.callWrap(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"metadata\")),\"regions\")),\"join\"), \"metadata[\\\"regions\\\"][\\\"join\\\"]\", context, [\", \"])):\"(none)\"), env.opts.autoescape);\nt_2 += \"</strong>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t<label>Curricula\\n\\t\\t\\t\\t<div class=\\\"textual\\\">\\n\\t\\t\\t\\t\\t<strong>\";\nt_2 += runtime.suppressValue((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"metadata\")),\"curriculum\") && runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"metadata\")),\"curriculum\")),\"length\")?(lineno = 96, colno = 38, runtime.callWrap(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"metadata\")),\"curriculum\")),\"join\"), \"metadata[\\\"curriculum\\\"][\\\"join\\\"]\", context, [\", \"])):\"(none)\"), env.opts.autoescape);\nt_2 += \"</strong>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t<label>Version\\n\\t\\t\\t\\t<div class=\\\"textual\\\">\\n\\t\\t\\t\\t\\t<strong>\";\nt_2 += runtime.suppressValue(env.getFilter(\"versionFormat\").call(context, runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"metadata\")),\"version\")), env.opts.autoescape);\nt_2 += \"</strong>\\n\\t\\t\\t\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"_old\")) {\nt_2 += \"<span class='fal fa-info-circle' style='color: #00008B'></span> <em>minor update to existing v\";\nt_2 += runtime.suppressValue(env.getFilter(\"versionFormat\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"_old\")),\"metadata\")),\"version\")), env.opts.autoescape);\nt_2 += \"</em>\";\n;\n}\nt_2 += \"\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t<label>Edition\\n\\t\\t\\t\\t<div class=\\\"textual\\\">\\n\\t\\t\\t\\t\\t<strong>\";\nt_2 += runtime.suppressValue((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"metadata\")),\"edition\")?runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"metadata\")),\"edition\"):\"(not specified)\"), env.opts.autoescape);\nt_2 += \"</strong>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t<label>Activation Date\\n\\t\\t\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"_old\")) {\nt_2 += \"\\n\\t\\t\\t\\t\\t<div class=\\\"textual\\\"><strong>Cannot be changed during a minor version update</strong></div>\\n\\t\\t\\t\\t\";\n;\n}\nelse {\nt_2 += \"\\n\\t\\t\\t\\t\\t<input type=\\\"text\\\" readonly name=\\\"activation\\\" placeholder=\\\"When the book will become accessible\\\"/>\\n\\t\\t\\t\\t\\t<div class=\\\"input-overlay hide\\\" title=\\\"Clear field\\\"><span class=\\\"fal fa-times\\\"/></div>\\n\\t\\t\\t\\t\";\n;\n}\nt_2 += \"\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t<label>Printability\\n\\t\\t\\t\\t<div class=\\\"textual\\\">\\n\\t\\t\\t\\t\\t<strong>Printing of this book is \";\nt_2 += runtime.suppressValue((!runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"metadata\")),\"allowPrint\")?\"not\":\"\"), env.opts.autoescape);\nt_2 += \" allowed</strong>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"_old\")) {\nt_2 += \"\\n\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t<label>Book Groups\\n\\t\\t\\t\\t\\t<div class=\\\"textual\\\"><strong>Cannot be changed during a minor version update</strong></div>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t\";\n;\n}\nelse {\nif(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"externalSync\")),\"bookGroupAllocations\") != \"rw\") {\nt_2 += \"\\n\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t<label>Book Groups\\n\\t\\t\\t\\t\\t<select name=\\\"groups\\\" data-placeholder=\\\"Book groups\\\" multiple \";\nt_2 += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"assignAll\") || !(env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"books\")),\"assignGroups\")))?\"disabled\":\"\"), env.opts.autoescape);\nt_2 += \"/>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t\";\n;\n}\nelse {\nt_2 += \"\\n\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t<label>Book Groups\\n\\t\\t\\t\\t\\t<div class=\\\"textual\\\"><strong>Locked by external sync</strong></div>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t\";\n;\n}\n;\n}\nt_2 += \"\\n\\n\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\";\nif(!runtime.contextOrFrameLookup(context, frame, \"_old\")) {\nt_2 += \"\\n\\t\\t\\t\\t\";\nif(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"externalSync\")),\"bookGroupAllocations\") != \"rw\") {\nt_2 += \"\\n\\t\\t\\t\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t\\t\\t\\t<label><input type=\\\"checkbox\\\" name=\\\"assignAll\\\" \";\nt_2 += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"assignAll\") && (env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"books\")),\"assignGroups\")))?\"checked\":\"\"), env.opts.autoescape);\nt_2 += \" \";\nt_2 += runtime.suppressValue(((env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"books\")),\"assignAll\"))) && (env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"books\")),\"assignGroups\")))?\"\":\"disabled\"), env.opts.autoescape);\nt_2 += \"/> Assign book to all users</label>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t\";\n;\n}\nt_2 += \"\\n\\n\\t\\t\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"bookTokenMode\")) {\nt_2 += \"\\n\\t\\t\\t\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t\\t\\t\\t<label><input type=\\\"checkbox\\\" name=\\\"purchaseOverride\\\" \";\nt_2 += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"purchaseOverride\")?\"checked\":\"\"), env.opts.autoescape);\nt_2 += \"/> Make available without purchase</label>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t\";\n;\n}\nt_2 += \"\\n\\t\\t\\t\";\n;\n}\nt_2 += \"\\n\\n\\t\\t\\t\";\nif((lineno = 183, colno = 20, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"printOverride\"), \"printOverride\", context, []))) {\nt_2 += \"\\n\\t\\t\\t\\t<div class=\\\"large-6 columns\\\">\\n\\t\\t\\t\\t\\t<label><input type=\\\"checkbox\\\" name=\\\"allowPrint\\\" \";\nt_2 += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"allowPrint\") || runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"metadata\")),\"allowPrint\")?\"checked\":\"\"), env.opts.autoescape);\nt_2 += \"/> Allow book to be printed</label>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\";\n;\n}\nt_2 += \"\\n\\t\\t</div>\\n\\n</div>\\n<div class=\\\"book-cover-image-chooser\\\">\\n\\t<div class=\\\"book-cover-image\\\"></div>\\n</div>\\n\";\n;\nframe = frame.pop();\nreturn new runtime.SafeString(t_2);\n});\ncontext.addExport(\"encrypted\");\ncontext.setVariable(\"encrypted\", macro_t_1);\noutput += \"\\n\\n\\n<div class=\\\"modal-title \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"overrideError\")?\"modal-warning\":\"\"), env.opts.autoescape);\noutput += \"\\\"><span class='fal fa-wrench'/> \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"overrideError\")?\"[Book Replacement] \":\"\"), env.opts.autoescape);\noutput += \" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"filename\")?(env.getFilter(\"escape\").call(context, env.getFilter(\"replace\").call(context, \"Reviewing Book: %s\",\"%s\",runtime.contextOrFrameLookup(context, frame, \"filename\")))):\"Loading book...\"), env.opts.autoescape);\noutput += \"</div>\\n<div class=\\\"modal-body\\\">\\n\\t\";\nif(!runtime.contextOrFrameLookup(context, frame, \"parsed\")) {\noutput += \"\\n\\t\\t<div><span class=\\\"spinner-icon spinner-small\\\"></span> Please wait a moment...</div>\\n\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"error\")) {\noutput += \"\\n\\t\\t\\t<div>\\n\\t\\t\\t\\t<p>There was an error processing this book:</p>\\n\\n\\t\\t\\t\\t<p>\";\noutput += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"error\")),\"message\"), env.opts.autoescape);\noutput += \"</p>\\n\\t\\t\\t</div>\\n\\t\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t\\t\";\noutput += runtime.suppressValue((lineno = 209, colno = 13, runtime.callWrap(macro_t_1, \"encrypted\", context, [])), env.opts.autoescape);\noutput += \"\\n\\t\\t\";\n;\n}\noutput += \"\\n\\t\";\n;\n}\noutput += \"\\n</div>\\n\";\nif(runtime.contextOrFrameLookup(context, frame, \"parsed\")) {\noutput += \"\\n<div class=\\\"modal-footer\\\">\\n\\t\";\nif(!runtime.contextOrFrameLookup(context, frame, \"error\")) {\noutput += \"<a class=\\\"button next-book success \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"overrideError\")?\"alert\":\"\"), env.opts.autoescape);\noutput += \"\\\">\";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"overrideError\")?\"Upload, Override & Replace Existing Book\":\"Upload Book\"), env.opts.autoescape);\noutput += \"</a>&nbsp;&nbsp;&nbsp;\";\n;\n}\noutput += \"\\n\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"error\") && (runtime.contextOrFrameLookup(context, frame, \"deleteExistingVersion\"))) {\noutput += \"<a class=\\\"button del-existing success\\\">Upload Anyway</a>&nbsp;&nbsp;&nbsp;\";\n;\n}\noutput += \"\\n\\t<a class=\\\"button secondary skip-book\\\">Skip Book</a>&nbsp;&nbsp;&nbsp;\\n\\t<span class=\\\"spinner-icon spinner-small hide spinner-working\\\"/> <span class=\\\"message hide\\\"></span>\\n</div>\\n\";\n;\n}\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div id=\\\"bookupload-support\\\"></div>\\n\\n\\t<div id=\\\"bookupload-main\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar backlog_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"book-upload-drop-small\\\"></div>\\n\\n\\t<div class=\\\"book-upload-backlog-list\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar backlog_oldRoot = backlog_obj.root;\nbacklog_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tbacklog_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar backlogAdd_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<input type=\\\"file\\\" multiple=\\\"multiple\\\" class=\\\"upload-input hide\\\"></input>\\n\\t<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<button type=\\\"button\\\" class=\\\"button books\\\"><span class=\\\"fal fa-book\\\"/> Add Books / Upload CSV</button>\\n\\t\\t\\t<span class=\\\"csvCounter\\\"></span>\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar backlogAdd_oldRoot = backlogAdd_obj.root;\nbacklogAdd_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tbacklogAdd_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar backlogItem_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"item-name\\\"><span class=\\\"item-category \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"type\"), env.opts.autoescape);\noutput += \"\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"type\"), env.opts.autoescape);\noutput += \"</span> \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"filename\"), env.opts.autoescape);\noutput += \"</div>\\n\\t<div class=\\\"item-icon\\\">\\n\\t\\t<span class=\\\"spinner-icon spinner-small hide\\\" title=\\\"Processing book\\\"></span>\\n\\t\\t<span class=\\\"fal fa-check valid hide\\\" title=\\\"This book is valid\\\"></span>\\n\\t\\t<span class=\\\"fal fa-times invalid hide\\\"></span>\\n\\t\\t<span class=\\\"fal fa-exclamation-triangle override hide\\\" title=\\\"This book will override an existing book\\\"></span>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar backlogItem_oldRoot = backlogItem_obj.root;\nbacklogItem_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tbacklogItem_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar queueItem_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"item-name\\\"><span class=\\\"item-category \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"type\"), env.opts.autoescape);\noutput += \"\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"type\"), env.opts.autoescape);\noutput += \"</span> \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"filename\"), env.opts.autoescape);\noutput += \"</div>\\n\\t<div class=\\\"item-icon\\\">\\n\\t\\t<span class=\\\"spinner-icon spinner-small hide\\\" title=\\\"Uploading book\\\"></span>\\n\\t\\t<span class=\\\"fal fa-times invalid hide\\\"></span>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar queueItem_oldRoot = queueItem_obj.root;\nqueueItem_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tqueueItem_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar doneItem_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"item-name\\\"><span class=\\\"item-category \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"format\"), env.opts.autoescape);\noutput += \"\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"format\"), env.opts.autoescape);\noutput += \"</span> \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"filename\"), env.opts.autoescape);\noutput += \"</div>\\n\\t<div class=\\\"item-icon\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar doneItem_oldRoot = doneItem_obj.root;\ndoneItem_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tdoneItem_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar noBooks_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<input type=\\\"file\\\" multiple=\\\"multiple\\\" class=\\\"upload-input hide\\\"></input>\\n\\n\\t<div class=\\\"row upload-drop-block\\\">\\n\\t\\t<div class=\\\"block large-12 columns\\\">\\n\\t\\t\\t<p>You can add books by clicking the button on the left, or drag and drop files into this block. You can upload MPUB and MPDF files.</p>\\n\\n\\t\\t\\t<p>Please note that uploading is generally much slower than downloading, and it may take a long time to upload a large number of books.</p>\\n\\n\\t\\t\\t<h4>Using CSVs</h4>\\n\\t\\t\\t<p>You can also upload CSVs to populate fields automatically. An example of the CSV format can be downloaded <a href=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"urlRoot\"), env.opts.autoescape);\noutput += \"/files/csvExample.csv\\\">here</a>. Group codes should be separated with commas or semicolons - whichever is the opposite of the delimiter in the file.<p>\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar noBooks_oldRoot = noBooks_obj.root;\nnoBooks_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tnoBooks_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar pdfPermissions_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n<h4><strong>Printing</strong></h4>\\n\\n\\t<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"small-1 columns\\\">\\n\\t\\t\\t<div class=\\\"switch round tiny\\\">\\n\\t\\t\\t\\t<input id=\\\"noPrint\\\" type=\\\"radio\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"print\") == \"none\"?\"checked\":\"\"), env.opts.autoescape);\noutput += \" name=\\\"print\\\" value=\\\"none\\\"/>\\n\\t\\t\\t\\t<label for=\\\"noPrint\\\"></label>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"small-11 columns\\\">No printing</div>\\n\\t</div>\\n\\n\\t<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"small-1 columns\\\">\\n\\t\\t\\t<div class=\\\"switch round tiny\\\">\\n\\t\\t\\t\\t<input id=\\\"lowPrint\\\" type=\\\"radio\\\" name=\\\"print\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"print\") == \"low\"?\"checked\":\"\"), env.opts.autoescape);\noutput += \" value=\\\"low\\\"/>\\n\\t\\t\\t\\t<label for=\\\"lowPrint\\\"></label>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"small-11 columns\\\">Low-resolution printing</div>\\n\\t</div>\\n\\n\\t<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"small-1 columns\\\">\\n\\t\\t\\t<div class=\\\"switch round tiny\\\">\\n\\t\\t\\t\\t<input id=\\\"fullPrint\\\" type=\\\"radio\\\" name=\\\"print\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"print\") == \"full\"?\"checked\":\"\"), env.opts.autoescape);\noutput += \" value=\\\"full\\\"/>\\n\\t\\t\\t\\t<label for=\\\"fullPrint\\\"></label>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"small-11 columns\\\">Full-resolution printing</div>\\n\\t</div>\\n\\n<br/>\\n\\n<h4><strong>Content Extraction</strong></h4>\\n\\n\\t<!--<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"small-1 columns\\\">\\n\\t\\t\\t<div class=\\\"switch round tiny\\\">\\n\\t\\t\\t\\t<input id=\\\"none\\\" type=\\\"radio\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"extract\") == \"n\"?\"checked\":\"\"), env.opts.autoescape);\noutput += \" name=\\\"extract\\\" value=\\\"n\\\"/>\\n\\t\\t\\t\\t<label for=\\\"none\\\"></label>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"small-11 columns\\\">Disallow extraction</div>\\n\\t</div>-->\\n\\n\\t<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"small-1 columns\\\">\\n\\t\\t\\t<div class=\\\"switch round tiny\\\">\\n\\t\\t\\t\\t<input id=\\\"allowExtract\\\" type=\\\"radio\\\" name=\\\"extract\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"extract\") == \"y\"?\"checked\":\"\"), env.opts.autoescape);\noutput += \" value=\\\"y\\\"/>\\n\\t\\t\\t\\t<label for=\\\"allowExtract\\\"></label>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"small-11 columns\\\">Allow text/image extraction</div>\\n\\t</div>\\n\\n<br/>\\n\\n<h4><strong>Document Modification</strong></h4>\\n\\n\\t<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"small-1 columns\\\">\\n\\t\\t\\t<div class=\\\"switch round tiny\\\">\\n\\t\\t\\t\\t<input id=\\\"basic\\\" type=\\\"radio\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"modify\") == \"annotate\"?\"checked\":\"\"), env.opts.autoescape);\noutput += \" name=\\\"modify\\\" value=\\\"annotate\\\"/>\\n\\t\\t\\t\\t<label for=\\\"basic\\\"></label>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"small-11 columns\\\">Allow highlighting & annotations only</div>\\n\\t</div>\\n\\n\\t<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"small-1 columns\\\">\\n\\t\\t\\t<div class=\\\"switch round tiny\\\">\\n\\t\\t\\t\\t<input id=\\\"all\\\" type=\\\"radio\\\" name=\\\"modify\\\" value=\\\"all\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"modify\") == \"all\"?\"checked\":\"\"), env.opts.autoescape);\noutput += \"/>\\n\\t\\t\\t\\t<label for=\\\"all\\\"></label>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"small-11 columns\\\">Allow all modifications</div>\\n\\t</div>\\n\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar pdfPermissions_oldRoot = pdfPermissions_obj.root;\npdfPermissions_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tpdfPermissions_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"main\": new nunjucks.Template( {obj: main_obj, type: \"code\"}, env),\t\"backlog\": new nunjucks.Template( {obj: backlog_obj, type: \"code\"}, env),\t\"backlogAdd\": new nunjucks.Template( {obj: backlogAdd_obj, type: \"code\"}, env),\t\"backlogItem\": new nunjucks.Template( {obj: backlogItem_obj, type: \"code\"}, env),\t\"queueItem\": new nunjucks.Template( {obj: queueItem_obj, type: \"code\"}, env),\t\"doneItem\": new nunjucks.Template( {obj: doneItem_obj, type: \"code\"}, env),\t\"noBooks\": new nunjucks.Template( {obj: noBooks_obj, type: \"code\"}, env),\t\"pdfPermissions\": new nunjucks.Template( {obj: pdfPermissions_obj, type: \"code\"}, env),};\n",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar moment = require(\"moment\");\nvar Pikaday = require(\"pikaday\");\nvar Backbone = require(\"backbone\");\n\nvar App = require(\"../../index\");\nvar rester = require(\"rester\");\nvar settings = require(\"app-settings\");\n\nvar BigModal = require(\"../../lib/bigModal\");\nvar ImageChooser = require(\"../../lib/imageChooser\");\nvar Selectra = require(\"../../lib/selectra\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nmodule.exports = BigModal.extend({\n\tui: {\n\t\tcover: \".book-cover-image\",\n\t\tactivation: \"input[name='activation']\",\n\t\tactivationOverlay: \"div.input-overlay\",\n\t\tpurchaseOverride: \"input[name='purchaseOverride']\",\n\t\tignoreErrors: \"input[name='ignoreErrors']\",\n\t\tassignAll: \"input[name='assignAll']\",\n\t\tgroups: \"select[name='groups']\",\n\t\tlockedGroups: \"select[name='locked-groups']\",\n\t\ttokenGroups: \"select[name='token-groups']\",\n\t\tallowPrint: \"input[name='allowPrint']\"\n\t},\n\n\tevents: {\n\t\t\"click label @ui.activationOverlay\": \"clearBox\",\n\t\t\"change @ui.activation\": \"changeDate\",\n\t\t\"click @ui.assignAll\": \"assignAll\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this = this;\n\n\t\treturn _.extend({\n\t\t\thasGroups: function hasGroups() {\n\t\t\t\treturn _this.model.get(\"groups\") !== null && _this.model.get(\"groups\").length;\n\t\t\t},\n\t\t\teditable: function editable() {\n\t\t\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\t\t\treturn rester.hasAccess(rester.p.api.epubs.put, user);\n\t\t\t},\n\t\t\tprintOverride: function printOverride() {\n\t\t\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\t\t\treturn rester.hasAccess(rester.p.books.printOverride, user);\n\t\t\t}\n\t\t}, BigModal.prototype.templateContext.call(this));\n\t},\n\n\tinitialize: function initialize() {\n\t\t_.bindAll(this);\n\n\t\tthis.Options = {\n\t\t\tclasses: [\"book-edit-modal\"],\n\t\t\ttemplate: require(\"../templates/bookModal.nunj\").content,\n\t\t\tbuttons: {\n\t\t\t\tupdate: {\n\t\t\t\t\ttype: \"accept\",\n\t\t\t\t\tlabel: \"Update\",\n\t\t\t\t\tmode: \"edit\",\n\t\t\t\t\tpermission: this.permissionToUpdate.bind(this),\n\t\t\t\t\tsave: true,\n\t\t\t\t\tvalidate: true\n\t\t\t\t},\n\t\t\t\tcancel: {\n\t\t\t\t\ttype: \"cancel\",\n\t\t\t\t\tlabel: \"Cancel\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tdataNoun: \"book\" + (this.model.isNew() ? \"\" : \": \" + this.model.get(\"title\"))\n\t\t};\n\n\t\tthis.ui = _.extend(this.ui, BigModal.prototype.ui);\n\t\tthis.events = _.extend(this.events, BigModal.prototype.events);\n\n\t\tBigModal.prototype.initialize.call(this);\n\t},\n\n\tpermissionToUpdate: function permissionToUpdate() {\n\t\treturn rester.hasAccess(rester.p.api.epubs.put, radio.request(App.Events.Requests.CurrentUser));\n\t},\n\n\tclearBox: function clearBox(evt) {\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\n\t\tvar el = $(evt.currentTarget);\n\t\tel.siblings(\"input\").val(\"\");\n\t\tthis.ui.activationOverlay.addClass(\"hide\");\n\t},\n\n\tchangeDate: function changeDate() {\n\t\tif (this.ui.activation.val()) this.ui.activationOverlay.removeClass(\"hide\");else this.ui.activationOverlay.addClass(\"hide\");\n\t},\n\n\tassignAll: function assignAll() {\n\t\tthis.activeGroups.model.set({ disabled: this.ui.assignAll.prop(\"checked\") });\n\t},\n\n\trenderForm: function renderForm() {\n\t\tthis.img = ImageChooser.create($(\".book-cover-image\", this.el), { transcode: true, passive: true });\n\n\t\tthis.img.setImage(settings.urlRoot + \"/api/1.0/epubs/\" + this.model.id + \"/cover\");\n\n\t\tthis.activeGroups = new Selectra({\n\t\t\tmultiple: true,\n\t\t\tsort: true,\n\t\t\tserver: {\n\t\t\t\tkey: \"code\",\n\t\t\t\tvalue: \"name\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/groups\",\n\t\t\t\tdefault: {\n\t\t\t\t\tfetch: settings.urlRoot + \"/acacia/books/\" + this.model.get(\"universal_id\") + \"/activeGroups\"\n\t\t\t\t},\n\t\t\t\tparams: {\n\t\t\t\t\textendedName: true\n\t\t\t\t}\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t},\n\t\t\tplaceholder: \"No groups selected\",\n\t\t\tddHost: \".modal-container\"\n\t\t});\n\n\t\tthis.activeGroups.show({ el: this.ui.groups });\n\n\t\tthis.lockedGroups = new Selectra({\n\t\t\tmultiple: true,\n\t\t\tsort: true,\n\t\t\tserver: {\n\t\t\t\tkey: \"code\",\n\t\t\t\tvalue: \"name\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/groups\",\n\t\t\t\tdefault: {\n\t\t\t\t\tfetch: settings.urlRoot + \"/acacia/books/\" + this.model.get(\"universal_id\") + \"/lockedGroups\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t},\n\t\t\tplaceholder: \"No locked groups\",\n\t\t\tddHost: \".modal-container\"\n\t\t});\n\n\t\tthis.lockedGroups.show({ el: this.ui.lockedGroups });\n\n\t\tif (this.model.get(\"has_tokens\")) {\n\t\t\tthis.tokenGroups = new Selectra({\n\t\t\t\tmultiple: true,\n\t\t\t\tsort: true,\n\t\t\t\tdeselection: false,\n\t\t\t\tserver: {\n\t\t\t\t\tkey: \"code\",\n\t\t\t\t\tvalue: \"name\",\n\t\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/groups\",\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\tfetch: settings.urlRoot + \"/acacia/books/\" + this.model.get(\"universal_id\") + \"/tokenGroups\"\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tpaging: {\n\t\t\t\t\tpageSize: 30,\n\t\t\t\t\tinfinite: true\n\t\t\t\t},\n\t\t\t\tplaceholder: \"No token groups\",\n\t\t\t\tddHost: \".modal-container\"\n\t\t\t});\n\n\t\t\tthis.tokenGroups.show({ el: this.ui.tokenGroups });\n\t\t}\n\n\t\tif (this.model && this.model.get(\"activationDate\")) this.ui.activation.val(moment.unix(this.model.get(\"activationDate\")).format(\"DD MMMM YYYY\"));else this.ui.activation.val(\"\");\n\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tif (rester.hasAccess(rester.p.api.epubs.put, user)) {\n\t\t\tthis.activationDatePicker = new Pikaday({\n\t\t\t\tfield: this.ui.activation.get(0),\n\t\t\t\tformat: \"DD MMMM YYYY\"\n\t\t\t});\n\t\t}\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tif (this.activationDatePicker) this.activationDatePicker.destroy();\n\n\t\tthis.activeGroups.destroy();\n\t\tthis.lockedGroups.destroy();\n\n\t\tif (this.img) this.img.destroy();\n\t},\n\n\tassembleData: function assembleData() {\n\t\tvar data = {\n\t\t\tattributes: {}\n\t\t};\n\n\t\tif (this.ui.activation.val()) data.attributes.activationDate = moment(this.ui.activation.val(), \"DD MMM YYYY\").unix();else data.attributes.activationDate = null;\n\n\t\tif (settings.bookTokenMode) data.attributes.purchaseOverride = this.ui.purchaseOverride.prop(\"checked\");\n\n\t\tdata.attributes.ignoreErrors = this.ui.ignoreErrors.prop(\"checked\");\n\n\t\t// eslint-disable-next-line no-sync\n\t\tif (settings.externalSync.bookGroupAllocations !== \"rw\" || settings.externalSync.groupYearExclusions.length) {\n\t\t\tif (!this.ui.assignAll.prop(\"checked\")) {\n\t\t\t\t// eslint-disable-next-line no-sync\n\t\t\t\tif (settings.externalSync.bookGroupAllocations === \"rw\") data.attributes.groups = (this.ui.lockedGroups.val() || []).concat(this.ui.groups.val() || []);else data.attributes.groups = this.ui.groups.val() || [];\n\t\t\t}\n\t\t\t// eslint-disable-next-line no-sync\n\t\t\telse if (settings.externalSync.bookGroupAllocations !== \"rw\") {\n\t\t\t\t\tdata.attributes.groups = null;\n\t\t\t\t}\n\t\t}\n\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\t\tif (rester.hasAccess(rester.p.books.printOverride, user)) data.attributes.allowPrint = this.ui.allowPrint.prop(\"checked\");\n\n\t\treturn data;\n\t},\n\n\tonAfterSave: function onAfterSave(model) {\n\t\tmodel.unset(\"cover\");\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJvb2tNb2RhbC5qcyJdLCJuYW1lcyI6WyIkIiwicmVxdWlyZSIsIl8iLCJtb21lbnQiLCJQaWthZGF5IiwiQmFja2JvbmUiLCJBcHAiLCJyZXN0ZXIiLCJzZXR0aW5ncyIsIkJpZ01vZGFsIiwiSW1hZ2VDaG9vc2VyIiwiU2VsZWN0cmEiLCJyYWRpbyIsIlJhZGlvIiwiY2hhbm5lbCIsIm1vZHVsZSIsImV4cG9ydHMiLCJleHRlbmQiLCJ1aSIsImNvdmVyIiwiYWN0aXZhdGlvbiIsImFjdGl2YXRpb25PdmVybGF5IiwicHVyY2hhc2VPdmVycmlkZSIsImlnbm9yZUVycm9ycyIsImFzc2lnbkFsbCIsImdyb3VwcyIsImxvY2tlZEdyb3VwcyIsInRva2VuR3JvdXBzIiwiYWxsb3dQcmludCIsImV2ZW50cyIsInRlbXBsYXRlQ29udGV4dCIsImhhc0dyb3VwcyIsIm1vZGVsIiwiZ2V0IiwibGVuZ3RoIiwiZWRpdGFibGUiLCJ1c2VyIiwicmVxdWVzdCIsIkV2ZW50cyIsIlJlcXVlc3RzIiwiQ3VycmVudFVzZXIiLCJoYXNBY2Nlc3MiLCJwIiwiYXBpIiwiZXB1YnMiLCJwdXQiLCJwcmludE92ZXJyaWRlIiwiYm9va3MiLCJwcm90b3R5cGUiLCJjYWxsIiwiaW5pdGlhbGl6ZSIsImJpbmRBbGwiLCJPcHRpb25zIiwiY2xhc3NlcyIsInRlbXBsYXRlIiwiY29udGVudCIsImJ1dHRvbnMiLCJ1cGRhdGUiLCJ0eXBlIiwibGFiZWwiLCJtb2RlIiwicGVybWlzc2lvbiIsInBlcm1pc3Npb25Ub1VwZGF0ZSIsImJpbmQiLCJzYXZlIiwidmFsaWRhdGUiLCJjYW5jZWwiLCJkYXRhTm91biIsImlzTmV3IiwiY2xlYXJCb3giLCJldnQiLCJzdG9wUHJvcGFnYXRpb24iLCJwcmV2ZW50RGVmYXVsdCIsImVsIiwiY3VycmVudFRhcmdldCIsInNpYmxpbmdzIiwidmFsIiwiYWRkQ2xhc3MiLCJjaGFuZ2VEYXRlIiwicmVtb3ZlQ2xhc3MiLCJhY3RpdmVHcm91cHMiLCJzZXQiLCJkaXNhYmxlZCIsInByb3AiLCJyZW5kZXJGb3JtIiwiaW1nIiwiY3JlYXRlIiwidHJhbnNjb2RlIiwicGFzc2l2ZSIsInNldEltYWdlIiwidXJsUm9vdCIsImlkIiwibXVsdGlwbGUiLCJzb3J0Iiwic2VydmVyIiwia2V5IiwidmFsdWUiLCJmZXRjaCIsImRlZmF1bHQiLCJwYXJhbXMiLCJleHRlbmRlZE5hbWUiLCJwYWdpbmciLCJwYWdlU2l6ZSIsImluZmluaXRlIiwicGxhY2Vob2xkZXIiLCJkZEhvc3QiLCJzaG93IiwiZGVzZWxlY3Rpb24iLCJ1bml4IiwiZm9ybWF0IiwiYWN0aXZhdGlvbkRhdGVQaWNrZXIiLCJmaWVsZCIsIm9uQmVmb3JlRGVzdHJveSIsImRlc3Ryb3kiLCJhc3NlbWJsZURhdGEiLCJkYXRhIiwiYXR0cmlidXRlcyIsImFjdGl2YXRpb25EYXRlIiwiYm9va1Rva2VuTW9kZSIsImV4dGVybmFsU3luYyIsImJvb2tHcm91cEFsbG9jYXRpb25zIiwiZ3JvdXBZZWFyRXhjbHVzaW9ucyIsImNvbmNhdCIsIm9uQWZ0ZXJTYXZlIiwidW5zZXQiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsSUFBSUQsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNRSxTQUFTRixRQUFRLFFBQVIsQ0FBZjtBQUNBLElBQU1HLFVBQVVILFFBQVEsU0FBUixDQUFoQjtBQUNBLElBQU1JLFdBQVdKLFFBQVEsVUFBUixDQUFqQjs7QUFFQSxJQUFNSyxNQUFNTCxRQUFRLGFBQVIsQ0FBWjtBQUNBLElBQU1NLFNBQVNOLFFBQVEsUUFBUixDQUFmO0FBQ0EsSUFBTU8sV0FBV1AsUUFBUSxjQUFSLENBQWpCOztBQUVBLElBQU1RLFdBQVdSLFFBQVEsb0JBQVIsQ0FBakI7QUFDQSxJQUFNUyxlQUFlVCxRQUFRLHdCQUFSLENBQXJCO0FBQ0EsSUFBTVUsV0FBV1YsUUFBUSxvQkFBUixDQUFqQjs7QUFFQSxJQUFNVyxRQUFRUCxTQUFTUSxLQUFULENBQWVDLE9BQWYsQ0FBdUIsUUFBdkIsQ0FBZDs7QUFFQUMsT0FBT0MsT0FBUCxHQUFpQlAsU0FBU1EsTUFBVCxDQUFnQjtBQUNoQ0MsS0FBSTtBQUNIQyxTQUFPLG1CQURKO0FBRUhDLGNBQVksMEJBRlQ7QUFHSEMscUJBQW1CLG1CQUhoQjtBQUlIQyxvQkFBa0IsZ0NBSmY7QUFLSEMsZ0JBQWMsNEJBTFg7QUFNSEMsYUFBVyx5QkFOUjtBQU9IQyxVQUFRLHVCQVBMO0FBUUhDLGdCQUFjLDhCQVJYO0FBU0hDLGVBQWEsNkJBVFY7QUFVSEMsY0FBWTtBQVZULEVBRDRCOztBQWNoQ0MsU0FBUTtBQUNQLHVDQUFxQyxVQUQ5QjtBQUVQLDJCQUF5QixZQUZsQjtBQUdQLHlCQUF1QjtBQUhoQixFQWR3Qjs7QUFvQmhDQyxrQkFBaUIsMkJBQVc7QUFBQTs7QUFDM0IsU0FBTzVCLEVBQUVlLE1BQUYsQ0FBUztBQUNmYyxjQUFXO0FBQUEsV0FBTSxNQUFLQyxLQUFMLENBQVdDLEdBQVgsQ0FBZSxRQUFmLE1BQTZCLElBQTdCLElBQXFDLE1BQUtELEtBQUwsQ0FBV0MsR0FBWCxDQUFlLFFBQWYsRUFBeUJDLE1BQXBFO0FBQUEsSUFESTtBQUVmQyxhQUFVLG9CQUFNO0FBQ2YsUUFBTUMsT0FBT3hCLE1BQU15QixPQUFOLENBQWMvQixJQUFJZ0MsTUFBSixDQUFXQyxRQUFYLENBQW9CQyxXQUFsQyxDQUFiOztBQUVBLFdBQU9qQyxPQUFPa0MsU0FBUCxDQUFpQmxDLE9BQU9tQyxDQUFQLENBQVNDLEdBQVQsQ0FBYUMsS0FBYixDQUFtQkMsR0FBcEMsRUFBeUNULElBQXpDLENBQVA7QUFDQSxJQU5jO0FBT2ZVLGtCQUFlLHlCQUFNO0FBQ3BCLFFBQU1WLE9BQU94QixNQUFNeUIsT0FBTixDQUFjL0IsSUFBSWdDLE1BQUosQ0FBV0MsUUFBWCxDQUFvQkMsV0FBbEMsQ0FBYjs7QUFFQSxXQUFPakMsT0FBT2tDLFNBQVAsQ0FBaUJsQyxPQUFPbUMsQ0FBUCxDQUFTSyxLQUFULENBQWVELGFBQWhDLEVBQStDVixJQUEvQyxDQUFQO0FBQ0E7QUFYYyxHQUFULEVBWUozQixTQUFTdUMsU0FBVCxDQUFtQmxCLGVBQW5CLENBQW1DbUIsSUFBbkMsQ0FBd0MsSUFBeEMsQ0FaSSxDQUFQO0FBYUEsRUFsQytCOztBQW9DaENDLGFBQVksc0JBQVc7QUFDdEJoRCxJQUFFaUQsT0FBRixDQUFVLElBQVY7O0FBRUEsT0FBS0MsT0FBTCxHQUFlO0FBQ2RDLFlBQVMsQ0FBQyxpQkFBRCxDQURLO0FBRWRDLGFBQVVyRCxRQUFRLDZCQUFSLEVBQXVDc0QsT0FGbkM7QUFHZEMsWUFBUztBQUNSQyxZQUFRO0FBQ1BDLFdBQU0sUUFEQztBQUVQQyxZQUFPLFFBRkE7QUFHUEMsV0FBTSxNQUhDO0FBSVBDLGlCQUFZLEtBQUtDLGtCQUFMLENBQXdCQyxJQUF4QixDQUE2QixJQUE3QixDQUpMO0FBS1BDLFdBQU0sSUFMQztBQU1QQyxlQUFVO0FBTkgsS0FEQTtBQVNSQyxZQUFRO0FBQ1BSLFdBQU0sUUFEQztBQUVQQyxZQUFPO0FBRkE7QUFUQSxJQUhLO0FBaUJkUSxhQUFVLFVBQVUsS0FBS25DLEtBQUwsQ0FBV29DLEtBQVgsS0FBcUIsRUFBckIsR0FBMEIsT0FBTyxLQUFLcEMsS0FBTCxDQUFXQyxHQUFYLENBQWUsT0FBZixDQUEzQztBQWpCSSxHQUFmOztBQW9CQSxPQUFLZixFQUFMLEdBQVVoQixFQUFFZSxNQUFGLENBQVMsS0FBS0MsRUFBZCxFQUFrQlQsU0FBU3VDLFNBQVQsQ0FBbUI5QixFQUFyQyxDQUFWO0FBQ0EsT0FBS1csTUFBTCxHQUFjM0IsRUFBRWUsTUFBRixDQUFTLEtBQUtZLE1BQWQsRUFBc0JwQixTQUFTdUMsU0FBVCxDQUFtQm5CLE1BQXpDLENBQWQ7O0FBRUFwQixXQUFTdUMsU0FBVCxDQUFtQkUsVUFBbkIsQ0FBOEJELElBQTlCLENBQW1DLElBQW5DO0FBQ0EsRUEvRCtCOztBQWlFaENhLHFCQUFvQiw4QkFBVztBQUM5QixTQUFPdkQsT0FBT2tDLFNBQVAsQ0FBaUJsQyxPQUFPbUMsQ0FBUCxDQUFTQyxHQUFULENBQWFDLEtBQWIsQ0FBbUJDLEdBQXBDLEVBQXlDakMsTUFBTXlCLE9BQU4sQ0FBYy9CLElBQUlnQyxNQUFKLENBQVdDLFFBQVgsQ0FBb0JDLFdBQWxDLENBQXpDLENBQVA7QUFDQSxFQW5FK0I7O0FBcUVoQzZCLFdBQVUsa0JBQVNDLEdBQVQsRUFBYztBQUN2QkEsTUFBSUMsZUFBSjtBQUNBRCxNQUFJRSxjQUFKOztBQUVBLE1BQU1DLEtBQUt6RSxFQUFFc0UsSUFBSUksYUFBTixDQUFYO0FBQ0FELEtBQUdFLFFBQUgsQ0FBWSxPQUFaLEVBQXFCQyxHQUFyQixDQUF5QixFQUF6QjtBQUNBLE9BQUsxRCxFQUFMLENBQVFHLGlCQUFSLENBQTBCd0QsUUFBMUIsQ0FBbUMsTUFBbkM7QUFDQSxFQTVFK0I7O0FBOEVoQ0MsYUFBWSxzQkFBVztBQUN0QixNQUFJLEtBQUs1RCxFQUFMLENBQVFFLFVBQVIsQ0FBbUJ3RCxHQUFuQixFQUFKLEVBQ0MsS0FBSzFELEVBQUwsQ0FBUUcsaUJBQVIsQ0FBMEIwRCxXQUExQixDQUFzQyxNQUF0QyxFQURELEtBR0MsS0FBSzdELEVBQUwsQ0FBUUcsaUJBQVIsQ0FBMEJ3RCxRQUExQixDQUFtQyxNQUFuQztBQUNELEVBbkYrQjs7QUFxRmhDckQsWUFBVyxxQkFBVztBQUNyQixPQUFLd0QsWUFBTCxDQUFrQmhELEtBQWxCLENBQXdCaUQsR0FBeEIsQ0FBNEIsRUFBRUMsVUFBVSxLQUFLaEUsRUFBTCxDQUFRTSxTQUFSLENBQWtCMkQsSUFBbEIsQ0FBdUIsU0FBdkIsQ0FBWixFQUE1QjtBQUNBLEVBdkYrQjs7QUF5RmhDQyxhQUFZLHNCQUFXO0FBQ3RCLE9BQUtDLEdBQUwsR0FBVzNFLGFBQWE0RSxNQUFiLENBQW9CdEYsRUFBRSxtQkFBRixFQUF1QixLQUFLeUUsRUFBNUIsQ0FBcEIsRUFBcUQsRUFBRWMsV0FBVyxJQUFiLEVBQW1CQyxTQUFTLElBQTVCLEVBQXJELENBQVg7O0FBRUEsT0FBS0gsR0FBTCxDQUFTSSxRQUFULENBQWtCakYsU0FBU2tGLE9BQVQsR0FBbUIsaUJBQW5CLEdBQXVDLEtBQUsxRCxLQUFMLENBQVcyRCxFQUFsRCxHQUF1RCxRQUF6RTs7QUFFQSxPQUFLWCxZQUFMLEdBQW9CLElBQUlyRSxRQUFKLENBQWE7QUFDaENpRixhQUFVLElBRHNCO0FBRWhDQyxTQUFNLElBRjBCO0FBR2hDQyxXQUFRO0FBQ1BDLFNBQUssTUFERTtBQUVQQyxXQUFPLE1BRkE7QUFHUEMsV0FBT3pGLFNBQVNrRixPQUFULEdBQW1CLGlCQUhuQjtBQUlQUSxhQUFTO0FBQ1JELFlBQU96RixTQUFTa0YsT0FBVCxHQUFtQixnQkFBbkIsR0FBc0MsS0FBSzFELEtBQUwsQ0FBV0MsR0FBWCxDQUFlLGNBQWYsQ0FBdEMsR0FBdUU7QUFEdEUsS0FKRjtBQU9Qa0UsWUFBUTtBQUNQQyxtQkFBYztBQURQO0FBUEQsSUFId0I7QUFjaENDLFdBQVE7QUFDUEMsY0FBVSxFQURIO0FBRVBDLGNBQVU7QUFGSCxJQWR3QjtBQWtCaENDLGdCQUFhLG9CQWxCbUI7QUFtQmhDQyxXQUFRO0FBbkJ3QixHQUFiLENBQXBCOztBQXNCQSxPQUFLekIsWUFBTCxDQUFrQjBCLElBQWxCLENBQXVCLEVBQUVqQyxJQUFJLEtBQUt2RCxFQUFMLENBQVFPLE1BQWQsRUFBdkI7O0FBRUEsT0FBS0MsWUFBTCxHQUFvQixJQUFJZixRQUFKLENBQWE7QUFDaENpRixhQUFVLElBRHNCO0FBRWhDQyxTQUFNLElBRjBCO0FBR2hDQyxXQUFRO0FBQ1BDLFNBQUssTUFERTtBQUVQQyxXQUFPLE1BRkE7QUFHUEMsV0FBT3pGLFNBQVNrRixPQUFULEdBQW1CLGlCQUhuQjtBQUlQUSxhQUFTO0FBQ1JELFlBQU96RixTQUFTa0YsT0FBVCxHQUFtQixnQkFBbkIsR0FBc0MsS0FBSzFELEtBQUwsQ0FBV0MsR0FBWCxDQUFlLGNBQWYsQ0FBdEMsR0FBdUU7QUFEdEU7QUFKRixJQUh3QjtBQVdoQ29FLFdBQVE7QUFDUEMsY0FBVSxFQURIO0FBRVBDLGNBQVU7QUFGSCxJQVh3QjtBQWVoQ0MsZ0JBQWEsa0JBZm1CO0FBZ0JoQ0MsV0FBUTtBQWhCd0IsR0FBYixDQUFwQjs7QUFtQkEsT0FBSy9FLFlBQUwsQ0FBa0JnRixJQUFsQixDQUF1QixFQUFFakMsSUFBSSxLQUFLdkQsRUFBTCxDQUFRUSxZQUFkLEVBQXZCOztBQUVBLE1BQUksS0FBS00sS0FBTCxDQUFXQyxHQUFYLENBQWUsWUFBZixDQUFKLEVBQWtDO0FBQ2pDLFFBQUtOLFdBQUwsR0FBbUIsSUFBSWhCLFFBQUosQ0FBYTtBQUMvQmlGLGNBQVUsSUFEcUI7QUFFL0JDLFVBQU0sSUFGeUI7QUFHL0JjLGlCQUFhLEtBSGtCO0FBSS9CYixZQUFRO0FBQ1BDLFVBQUssTUFERTtBQUVQQyxZQUFPLE1BRkE7QUFHUEMsWUFBT3pGLFNBQVNrRixPQUFULEdBQW1CLGlCQUhuQjtBQUlQUSxjQUFTO0FBQ1JELGFBQU96RixTQUFTa0YsT0FBVCxHQUFtQixnQkFBbkIsR0FBc0MsS0FBSzFELEtBQUwsQ0FBV0MsR0FBWCxDQUFlLGNBQWYsQ0FBdEMsR0FBdUU7QUFEdEU7QUFKRixLQUp1QjtBQVkvQm9FLFlBQVE7QUFDUEMsZUFBVSxFQURIO0FBRVBDLGVBQVU7QUFGSCxLQVp1QjtBQWdCL0JDLGlCQUFhLGlCQWhCa0I7QUFpQi9CQyxZQUFRO0FBakJ1QixJQUFiLENBQW5COztBQW9CQSxRQUFLOUUsV0FBTCxDQUFpQitFLElBQWpCLENBQXNCLEVBQUVqQyxJQUFJLEtBQUt2RCxFQUFMLENBQVFTLFdBQWQsRUFBdEI7QUFDQTs7QUFFRCxNQUFJLEtBQUtLLEtBQUwsSUFBYyxLQUFLQSxLQUFMLENBQVdDLEdBQVgsQ0FBZSxnQkFBZixDQUFsQixFQUNDLEtBQUtmLEVBQUwsQ0FBUUUsVUFBUixDQUFtQndELEdBQW5CLENBQXVCekUsT0FBT3lHLElBQVAsQ0FBWSxLQUFLNUUsS0FBTCxDQUFXQyxHQUFYLENBQWUsZ0JBQWYsQ0FBWixFQUE4QzRFLE1BQTlDLENBQXFELGNBQXJELENBQXZCLEVBREQsS0FHQyxLQUFLM0YsRUFBTCxDQUFRRSxVQUFSLENBQW1Cd0QsR0FBbkIsQ0FBdUIsRUFBdkI7O0FBRUQsTUFBTXhDLE9BQU94QixNQUFNeUIsT0FBTixDQUFjL0IsSUFBSWdDLE1BQUosQ0FBV0MsUUFBWCxDQUFvQkMsV0FBbEMsQ0FBYjs7QUFFQSxNQUFJakMsT0FBT2tDLFNBQVAsQ0FBaUJsQyxPQUFPbUMsQ0FBUCxDQUFTQyxHQUFULENBQWFDLEtBQWIsQ0FBbUJDLEdBQXBDLEVBQXlDVCxJQUF6QyxDQUFKLEVBQW9EO0FBQ25ELFFBQUswRSxvQkFBTCxHQUE0QixJQUFJMUcsT0FBSixDQUFZO0FBQ3ZDMkcsV0FBTyxLQUFLN0YsRUFBTCxDQUFRRSxVQUFSLENBQW1CYSxHQUFuQixDQUF1QixDQUF2QixDQURnQztBQUV2QzRFLFlBQVE7QUFGK0IsSUFBWixDQUE1QjtBQUlBO0FBQ0QsRUFoTCtCOztBQWtMaENHLGtCQUFpQiwyQkFBVztBQUMzQixNQUFJLEtBQUtGLG9CQUFULEVBQ0MsS0FBS0Esb0JBQUwsQ0FBMEJHLE9BQTFCOztBQUVELE9BQUtqQyxZQUFMLENBQWtCaUMsT0FBbEI7QUFDQSxPQUFLdkYsWUFBTCxDQUFrQnVGLE9BQWxCOztBQUVBLE1BQUksS0FBSzVCLEdBQVQsRUFDQyxLQUFLQSxHQUFMLENBQVM0QixPQUFUO0FBQ0QsRUEzTCtCOztBQTZMaENDLGVBQWMsd0JBQVc7QUFDeEIsTUFBTUMsT0FBTztBQUNaQyxlQUFZO0FBREEsR0FBYjs7QUFJQSxNQUFJLEtBQUtsRyxFQUFMLENBQVFFLFVBQVIsQ0FBbUJ3RCxHQUFuQixFQUFKLEVBQ0N1QyxLQUFLQyxVQUFMLENBQWdCQyxjQUFoQixHQUFpQ2xILE9BQU8sS0FBS2UsRUFBTCxDQUFRRSxVQUFSLENBQW1Cd0QsR0FBbkIsRUFBUCxFQUFpQyxhQUFqQyxFQUFnRGdDLElBQWhELEVBQWpDLENBREQsS0FHQ08sS0FBS0MsVUFBTCxDQUFnQkMsY0FBaEIsR0FBaUMsSUFBakM7O0FBRUQsTUFBSTdHLFNBQVM4RyxhQUFiLEVBQ0NILEtBQUtDLFVBQUwsQ0FBZ0I5RixnQkFBaEIsR0FBbUMsS0FBS0osRUFBTCxDQUFRSSxnQkFBUixDQUF5QjZELElBQXpCLENBQThCLFNBQTlCLENBQW5DOztBQUVEZ0MsT0FBS0MsVUFBTCxDQUFnQjdGLFlBQWhCLEdBQStCLEtBQUtMLEVBQUwsQ0FBUUssWUFBUixDQUFxQjRELElBQXJCLENBQTBCLFNBQTFCLENBQS9COztBQUVBO0FBQ0EsTUFBSTNFLFNBQVMrRyxZQUFULENBQXNCQyxvQkFBdEIsS0FBK0MsSUFBL0MsSUFBdURoSCxTQUFTK0csWUFBVCxDQUFzQkUsbUJBQXRCLENBQTBDdkYsTUFBckcsRUFBNkc7QUFDNUcsT0FBSSxDQUFDLEtBQUtoQixFQUFMLENBQVFNLFNBQVIsQ0FBa0IyRCxJQUFsQixDQUF1QixTQUF2QixDQUFMLEVBQXdDO0FBQ3ZDO0FBQ0EsUUFBSTNFLFNBQVMrRyxZQUFULENBQXNCQyxvQkFBdEIsS0FBK0MsSUFBbkQsRUFDQ0wsS0FBS0MsVUFBTCxDQUFnQjNGLE1BQWhCLEdBQXlCLENBQUMsS0FBS1AsRUFBTCxDQUFRUSxZQUFSLENBQXFCa0QsR0FBckIsTUFBOEIsRUFBL0IsRUFBbUM4QyxNQUFuQyxDQUEwQyxLQUFLeEcsRUFBTCxDQUFRTyxNQUFSLENBQWVtRCxHQUFmLE1BQXdCLEVBQWxFLENBQXpCLENBREQsS0FHQ3VDLEtBQUtDLFVBQUwsQ0FBZ0IzRixNQUFoQixHQUF5QixLQUFLUCxFQUFMLENBQVFPLE1BQVIsQ0FBZW1ELEdBQWYsTUFBd0IsRUFBakQ7QUFDRDtBQUNEO0FBUEEsUUFRSyxJQUFJcEUsU0FBUytHLFlBQVQsQ0FBc0JDLG9CQUF0QixLQUErQyxJQUFuRCxFQUF5RDtBQUM3REwsVUFBS0MsVUFBTCxDQUFnQjNGLE1BQWhCLEdBQXlCLElBQXpCO0FBQ0E7QUFDRDs7QUFFRCxNQUFNVyxPQUFPeEIsTUFBTXlCLE9BQU4sQ0FBYy9CLElBQUlnQyxNQUFKLENBQVdDLFFBQVgsQ0FBb0JDLFdBQWxDLENBQWI7QUFDQSxNQUFJakMsT0FBT2tDLFNBQVAsQ0FBaUJsQyxPQUFPbUMsQ0FBUCxDQUFTSyxLQUFULENBQWVELGFBQWhDLEVBQStDVixJQUEvQyxDQUFKLEVBQ0MrRSxLQUFLQyxVQUFMLENBQWdCeEYsVUFBaEIsR0FBNkIsS0FBS1YsRUFBTCxDQUFRVSxVQUFSLENBQW1CdUQsSUFBbkIsQ0FBd0IsU0FBeEIsQ0FBN0I7O0FBRUQsU0FBT2dDLElBQVA7QUFDQSxFQWhPK0I7O0FBa09oQ1EsY0FBYSxxQkFBUzNGLEtBQVQsRUFBZ0I7QUFDNUJBLFFBQU00RixLQUFOLENBQVksT0FBWjtBQUNBO0FBcE8rQixDQUFoQixDQUFqQiIsImZpbGUiOiJib29rTW9kYWwuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBtb21lbnQgPSByZXF1aXJlKFwibW9tZW50XCIpO1xuY29uc3QgUGlrYWRheSA9IHJlcXVpcmUoXCJwaWthZGF5XCIpO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5cbmNvbnN0IEFwcCA9IHJlcXVpcmUoXCIuLi8uLi9pbmRleFwiKTtcbmNvbnN0IHJlc3RlciA9IHJlcXVpcmUoXCJyZXN0ZXJcIik7XG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IEJpZ01vZGFsID0gcmVxdWlyZShcIi4uLy4uL2xpYi9iaWdNb2RhbFwiKTtcbmNvbnN0IEltYWdlQ2hvb3NlciA9IHJlcXVpcmUoXCIuLi8uLi9saWIvaW1hZ2VDaG9vc2VyXCIpO1xuY29uc3QgU2VsZWN0cmEgPSByZXF1aXJlKFwiLi4vLi4vbGliL3NlbGVjdHJhXCIpO1xuXG5jb25zdCByYWRpbyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJnbG9iYWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmlnTW9kYWwuZXh0ZW5kKHtcblx0dWk6IHtcblx0XHRjb3ZlcjogXCIuYm9vay1jb3Zlci1pbWFnZVwiLFxuXHRcdGFjdGl2YXRpb246IFwiaW5wdXRbbmFtZT0nYWN0aXZhdGlvbiddXCIsXG5cdFx0YWN0aXZhdGlvbk92ZXJsYXk6IFwiZGl2LmlucHV0LW92ZXJsYXlcIixcblx0XHRwdXJjaGFzZU92ZXJyaWRlOiBcImlucHV0W25hbWU9J3B1cmNoYXNlT3ZlcnJpZGUnXVwiLFxuXHRcdGlnbm9yZUVycm9yczogXCJpbnB1dFtuYW1lPSdpZ25vcmVFcnJvcnMnXVwiLFxuXHRcdGFzc2lnbkFsbDogXCJpbnB1dFtuYW1lPSdhc3NpZ25BbGwnXVwiLFxuXHRcdGdyb3VwczogXCJzZWxlY3RbbmFtZT0nZ3JvdXBzJ11cIixcblx0XHRsb2NrZWRHcm91cHM6IFwic2VsZWN0W25hbWU9J2xvY2tlZC1ncm91cHMnXVwiLFxuXHRcdHRva2VuR3JvdXBzOiBcInNlbGVjdFtuYW1lPSd0b2tlbi1ncm91cHMnXVwiLFxuXHRcdGFsbG93UHJpbnQ6IFwiaW5wdXRbbmFtZT0nYWxsb3dQcmludCddXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBsYWJlbCBAdWkuYWN0aXZhdGlvbk92ZXJsYXlcIjogXCJjbGVhckJveFwiLFxuXHRcdFwiY2hhbmdlIEB1aS5hY3RpdmF0aW9uXCI6IFwiY2hhbmdlRGF0ZVwiLFxuXHRcdFwiY2xpY2sgQHVpLmFzc2lnbkFsbFwiOiBcImFzc2lnbkFsbFwiLFxuXHR9LFxuXG5cdHRlbXBsYXRlQ29udGV4dDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIF8uZXh0ZW5kKHtcblx0XHRcdGhhc0dyb3VwczogKCkgPT4gdGhpcy5tb2RlbC5nZXQoXCJncm91cHNcIikgIT09IG51bGwgJiYgdGhpcy5tb2RlbC5nZXQoXCJncm91cHNcIikubGVuZ3RoLFxuXHRcdFx0ZWRpdGFibGU6ICgpID0+IHtcblx0XHRcdFx0Y29uc3QgdXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cblx0XHRcdFx0cmV0dXJuIHJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAuYXBpLmVwdWJzLnB1dCwgdXNlcik7XG5cdFx0XHR9LFxuXHRcdFx0cHJpbnRPdmVycmlkZTogKCkgPT4ge1xuXHRcdFx0XHRjb25zdCB1c2VyID0gcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblxuXHRcdFx0XHRyZXR1cm4gcmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5ib29rcy5wcmludE92ZXJyaWRlLCB1c2VyKTtcblx0XHRcdH0sXG5cdFx0fSwgQmlnTW9kYWwucHJvdG90eXBlLnRlbXBsYXRlQ29udGV4dC5jYWxsKHRoaXMpKTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRfLmJpbmRBbGwodGhpcyk7XG5cblx0XHR0aGlzLk9wdGlvbnMgPSB7XG5cdFx0XHRjbGFzc2VzOiBbXCJib29rLWVkaXQtbW9kYWxcIl0sXG5cdFx0XHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9ib29rTW9kYWwubnVualwiKS5jb250ZW50LFxuXHRcdFx0YnV0dG9uczoge1xuXHRcdFx0XHR1cGRhdGU6IHtcblx0XHRcdFx0XHR0eXBlOiBcImFjY2VwdFwiLFxuXHRcdFx0XHRcdGxhYmVsOiBcIlVwZGF0ZVwiLFxuXHRcdFx0XHRcdG1vZGU6IFwiZWRpdFwiLFxuXHRcdFx0XHRcdHBlcm1pc3Npb246IHRoaXMucGVybWlzc2lvblRvVXBkYXRlLmJpbmQodGhpcyksXG5cdFx0XHRcdFx0c2F2ZTogdHJ1ZSxcblx0XHRcdFx0XHR2YWxpZGF0ZTogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0Y2FuY2VsOiB7XG5cdFx0XHRcdFx0dHlwZTogXCJjYW5jZWxcIixcblx0XHRcdFx0XHRsYWJlbDogXCJDYW5jZWxcIixcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XHRkYXRhTm91bjogXCJib29rXCIgKyAodGhpcy5tb2RlbC5pc05ldygpID8gXCJcIiA6IFwiOiBcIiArIHRoaXMubW9kZWwuZ2V0KFwidGl0bGVcIikpLFxuXHRcdH07XG5cblx0XHR0aGlzLnVpID0gXy5leHRlbmQodGhpcy51aSwgQmlnTW9kYWwucHJvdG90eXBlLnVpKTtcblx0XHR0aGlzLmV2ZW50cyA9IF8uZXh0ZW5kKHRoaXMuZXZlbnRzLCBCaWdNb2RhbC5wcm90b3R5cGUuZXZlbnRzKTtcblxuXHRcdEJpZ01vZGFsLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyk7XG5cdH0sXG5cblx0cGVybWlzc2lvblRvVXBkYXRlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gcmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5hcGkuZXB1YnMucHV0LCByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpKTtcblx0fSxcblxuXHRjbGVhckJveDogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0Y29uc3QgZWwgPSAkKGV2dC5jdXJyZW50VGFyZ2V0KTtcblx0XHRlbC5zaWJsaW5ncyhcImlucHV0XCIpLnZhbChcIlwiKTtcblx0XHR0aGlzLnVpLmFjdGl2YXRpb25PdmVybGF5LmFkZENsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRjaGFuZ2VEYXRlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy51aS5hY3RpdmF0aW9uLnZhbCgpKVxuXHRcdFx0dGhpcy51aS5hY3RpdmF0aW9uT3ZlcmxheS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy51aS5hY3RpdmF0aW9uT3ZlcmxheS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0YXNzaWduQWxsOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmFjdGl2ZUdyb3Vwcy5tb2RlbC5zZXQoeyBkaXNhYmxlZDogdGhpcy51aS5hc3NpZ25BbGwucHJvcChcImNoZWNrZWRcIikgfSk7XG5cdH0sXG5cblx0cmVuZGVyRm9ybTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5pbWcgPSBJbWFnZUNob29zZXIuY3JlYXRlKCQoXCIuYm9vay1jb3Zlci1pbWFnZVwiLCB0aGlzLmVsKSwgeyB0cmFuc2NvZGU6IHRydWUsIHBhc3NpdmU6IHRydWUgfSk7XG5cblx0XHR0aGlzLmltZy5zZXRJbWFnZShzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9lcHVicy9cIiArIHRoaXMubW9kZWwuaWQgKyBcIi9jb3ZlclwiKTtcblxuXHRcdHRoaXMuYWN0aXZlR3JvdXBzID0gbmV3IFNlbGVjdHJhKHtcblx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0c29ydDogdHJ1ZSxcblx0XHRcdHNlcnZlcjoge1xuXHRcdFx0XHRrZXk6IFwiY29kZVwiLFxuXHRcdFx0XHR2YWx1ZTogXCJuYW1lXCIsXG5cdFx0XHRcdGZldGNoOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9ncm91cHNcIixcblx0XHRcdFx0ZGVmYXVsdDoge1xuXHRcdFx0XHRcdGZldGNoOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYWNhY2lhL2Jvb2tzL1wiICsgdGhpcy5tb2RlbC5nZXQoXCJ1bml2ZXJzYWxfaWRcIikgKyBcIi9hY3RpdmVHcm91cHNcIixcblx0XHRcdFx0fSxcblx0XHRcdFx0cGFyYW1zOiB7XG5cdFx0XHRcdFx0ZXh0ZW5kZWROYW1lOiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRwYWdlU2l6ZTogMzAsXG5cdFx0XHRcdGluZmluaXRlOiB0cnVlLFxuXHRcdFx0fSxcblx0XHRcdHBsYWNlaG9sZGVyOiBcIk5vIGdyb3VwcyBzZWxlY3RlZFwiLFxuXHRcdFx0ZGRIb3N0OiBcIi5tb2RhbC1jb250YWluZXJcIixcblx0XHR9KTtcblxuXHRcdHRoaXMuYWN0aXZlR3JvdXBzLnNob3coeyBlbDogdGhpcy51aS5ncm91cHMgfSk7XG5cblx0XHR0aGlzLmxvY2tlZEdyb3VwcyA9IG5ldyBTZWxlY3RyYSh7XG5cdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdHNvcnQ6IHRydWUsXG5cdFx0XHRzZXJ2ZXI6IHtcblx0XHRcdFx0a2V5OiBcImNvZGVcIixcblx0XHRcdFx0dmFsdWU6IFwibmFtZVwiLFxuXHRcdFx0XHRmZXRjaDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvZ3JvdXBzXCIsXG5cdFx0XHRcdGRlZmF1bHQ6IHtcblx0XHRcdFx0XHRmZXRjaDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FjYWNpYS9ib29rcy9cIiArIHRoaXMubW9kZWwuZ2V0KFwidW5pdmVyc2FsX2lkXCIpICsgXCIvbG9ja2VkR3JvdXBzXCIsXG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdHBhZ2VTaXplOiAzMCxcblx0XHRcdFx0aW5maW5pdGU6IHRydWUsXG5cdFx0XHR9LFxuXHRcdFx0cGxhY2Vob2xkZXI6IFwiTm8gbG9ja2VkIGdyb3Vwc1wiLFxuXHRcdFx0ZGRIb3N0OiBcIi5tb2RhbC1jb250YWluZXJcIixcblx0XHR9KTtcblxuXHRcdHRoaXMubG9ja2VkR3JvdXBzLnNob3coeyBlbDogdGhpcy51aS5sb2NrZWRHcm91cHMgfSk7XG5cblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJoYXNfdG9rZW5zXCIpKSB7XG5cdFx0XHR0aGlzLnRva2VuR3JvdXBzID0gbmV3IFNlbGVjdHJhKHtcblx0XHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRcdHNvcnQ6IHRydWUsXG5cdFx0XHRcdGRlc2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdFx0c2VydmVyOiB7XG5cdFx0XHRcdFx0a2V5OiBcImNvZGVcIixcblx0XHRcdFx0XHR2YWx1ZTogXCJuYW1lXCIsXG5cdFx0XHRcdFx0ZmV0Y2g6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2dyb3Vwc1wiLFxuXHRcdFx0XHRcdGRlZmF1bHQ6IHtcblx0XHRcdFx0XHRcdGZldGNoOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYWNhY2lhL2Jvb2tzL1wiICsgdGhpcy5tb2RlbC5nZXQoXCJ1bml2ZXJzYWxfaWRcIikgKyBcIi90b2tlbkdyb3Vwc1wiLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRcdHBhZ2VTaXplOiAzMCxcblx0XHRcdFx0XHRpbmZpbml0ZTogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0cGxhY2Vob2xkZXI6IFwiTm8gdG9rZW4gZ3JvdXBzXCIsXG5cdFx0XHRcdGRkSG9zdDogXCIubW9kYWwtY29udGFpbmVyXCIsXG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy50b2tlbkdyb3Vwcy5zaG93KHsgZWw6IHRoaXMudWkudG9rZW5Hcm91cHMgfSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMubW9kZWwgJiYgdGhpcy5tb2RlbC5nZXQoXCJhY3RpdmF0aW9uRGF0ZVwiKSlcblx0XHRcdHRoaXMudWkuYWN0aXZhdGlvbi52YWwobW9tZW50LnVuaXgodGhpcy5tb2RlbC5nZXQoXCJhY3RpdmF0aW9uRGF0ZVwiKSkuZm9ybWF0KFwiREQgTU1NTSBZWVlZXCIpKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnVpLmFjdGl2YXRpb24udmFsKFwiXCIpO1xuXG5cdFx0Y29uc3QgdXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cblx0XHRpZiAocmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5hcGkuZXB1YnMucHV0LCB1c2VyKSkge1xuXHRcdFx0dGhpcy5hY3RpdmF0aW9uRGF0ZVBpY2tlciA9IG5ldyBQaWthZGF5KHtcblx0XHRcdFx0ZmllbGQ6IHRoaXMudWkuYWN0aXZhdGlvbi5nZXQoMCksXG5cdFx0XHRcdGZvcm1hdDogXCJERCBNTU1NIFlZWVlcIixcblx0XHRcdH0pO1xuXHRcdH1cblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLmFjdGl2YXRpb25EYXRlUGlja2VyKVxuXHRcdFx0dGhpcy5hY3RpdmF0aW9uRGF0ZVBpY2tlci5kZXN0cm95KCk7XG5cblx0XHR0aGlzLmFjdGl2ZUdyb3Vwcy5kZXN0cm95KCk7XG5cdFx0dGhpcy5sb2NrZWRHcm91cHMuZGVzdHJveSgpO1xuXG5cdFx0aWYgKHRoaXMuaW1nKVxuXHRcdFx0dGhpcy5pbWcuZGVzdHJveSgpO1xuXHR9LFxuXG5cdGFzc2VtYmxlRGF0YTogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgZGF0YSA9IHtcblx0XHRcdGF0dHJpYnV0ZXM6IHt9LFxuXHRcdH07XG5cblx0XHRpZiAodGhpcy51aS5hY3RpdmF0aW9uLnZhbCgpKVxuXHRcdFx0ZGF0YS5hdHRyaWJ1dGVzLmFjdGl2YXRpb25EYXRlID0gbW9tZW50KHRoaXMudWkuYWN0aXZhdGlvbi52YWwoKSwgXCJERCBNTU0gWVlZWVwiKS51bml4KCk7XG5cdFx0ZWxzZVxuXHRcdFx0ZGF0YS5hdHRyaWJ1dGVzLmFjdGl2YXRpb25EYXRlID0gbnVsbDtcblxuXHRcdGlmIChzZXR0aW5ncy5ib29rVG9rZW5Nb2RlKVxuXHRcdFx0ZGF0YS5hdHRyaWJ1dGVzLnB1cmNoYXNlT3ZlcnJpZGUgPSB0aGlzLnVpLnB1cmNoYXNlT3ZlcnJpZGUucHJvcChcImNoZWNrZWRcIik7XG5cblx0XHRkYXRhLmF0dHJpYnV0ZXMuaWdub3JlRXJyb3JzID0gdGhpcy51aS5pZ25vcmVFcnJvcnMucHJvcChcImNoZWNrZWRcIik7XG5cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc3luY1xuXHRcdGlmIChzZXR0aW5ncy5leHRlcm5hbFN5bmMuYm9va0dyb3VwQWxsb2NhdGlvbnMgIT09IFwicndcIiB8fCBzZXR0aW5ncy5leHRlcm5hbFN5bmMuZ3JvdXBZZWFyRXhjbHVzaW9ucy5sZW5ndGgpIHtcblx0XHRcdGlmICghdGhpcy51aS5hc3NpZ25BbGwucHJvcChcImNoZWNrZWRcIikpIHtcblx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXN5bmNcblx0XHRcdFx0aWYgKHNldHRpbmdzLmV4dGVybmFsU3luYy5ib29rR3JvdXBBbGxvY2F0aW9ucyA9PT0gXCJyd1wiKVxuXHRcdFx0XHRcdGRhdGEuYXR0cmlidXRlcy5ncm91cHMgPSAodGhpcy51aS5sb2NrZWRHcm91cHMudmFsKCkgfHwgW10pLmNvbmNhdCh0aGlzLnVpLmdyb3Vwcy52YWwoKSB8fCBbXSk7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRkYXRhLmF0dHJpYnV0ZXMuZ3JvdXBzID0gdGhpcy51aS5ncm91cHMudmFsKCkgfHwgW107XG5cdFx0XHR9XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc3luY1xuXHRcdFx0ZWxzZSBpZiAoc2V0dGluZ3MuZXh0ZXJuYWxTeW5jLmJvb2tHcm91cEFsbG9jYXRpb25zICE9PSBcInJ3XCIpIHtcblx0XHRcdFx0ZGF0YS5hdHRyaWJ1dGVzLmdyb3VwcyA9IG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgdXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cdFx0aWYgKHJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAuYm9va3MucHJpbnRPdmVycmlkZSwgdXNlcikpXG5cdFx0XHRkYXRhLmF0dHJpYnV0ZXMuYWxsb3dQcmludCA9IHRoaXMudWkuYWxsb3dQcmludC5wcm9wKFwiY2hlY2tlZFwiKTtcblxuXHRcdHJldHVybiBkYXRhO1xuXHR9LFxuXG5cdG9uQWZ0ZXJTYXZlOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdG1vZGVsLnVuc2V0KFwiY292ZXJcIik7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar $ = require(\"jquery\");\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\nvar rester = require(\"rester\");\nvar qs = require(\"querystring\");\nvar Promise = require(\"bluebird\");\nvar path = require(\"path\");\n\nvar App = require(\"../../index\");\nvar ServerGrid = require(\"../../lib/serverGrid\");\nvar settings = require(\"app-settings\");\n\nvar BookModal = require(\"./bookModal\");\nvar BookModel = require(\"../bookModel\");\n\nvar SimpleMenu = require(\"../../lib/simpleMenu\");\nvar SmallModal = require(\"../../lib/smallModal\");\nvar ChangelogModal = require(\"../../lib/changelogModal\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar Collection = Backbone.PageableCollection.extend({\n\tmodel: BookModel,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/epubs?paged=true\";\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"content book-manager\",\n\n\ttemplate: require(\"../templates/bookmanage.nunj\"),\n\n\tui: {\n\t\tcounter: \".ops-bar .counter\",\n\t\tfilters: \".ops-bar .filters\",\n\t\tdownloadList: \".downloadList\",\n\t\toperations: \".operations\",\n\t\tpaging: \".paging\",\n\t\tgrid: \"div.grid\",\n\t\tuploader: \".upload\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.downloadList\": \"showDownloads\",\n\t\t\"click @ui.operations\": \"showOperations\",\n\t\t\"click @ui.uploader\": \"uploadKeys\"\n\t},\n\n\tcollectionEvents: {\n\t\t\"toolbar:click:delete\": \"deleteBook\",\n\t\t\"toolbar:click:download\": \"downloadBook\",\n\t\t\"toolbar:click:wipecache\": \"wipeCache\",\n\t\t\"toolbar:click:changelog\": \"changelog\",\n\t\t\"toolbar:click:checksum\": \"checksum\"\n\t},\n\n\tshowDownloads: function showDownloads(evt) {\n\t\tevt.stopPropagation();\n\n\t\tvar list = new SimpleMenu({\n\t\t\tanchor: this.ui.downloadList,\n\t\t\tside: \"left\",\n\t\t\tstructure: [{ closeOnClick: true, elements: [{ text: \"Export list of all books\", id: \"books\" }] }]\n\t\t});\n\t\tlist.show();\n\n\t\tthis.listenTo(list, \"clicked:books\", this.downloadList.bind(this));\n\t},\n\n\tdownloadList: function downloadList() {\n\t\tvar params = this.grid.filter.getServerFilters();\n\t\twindow.open(settings.urlRoot + \"/api/1.0/epubs/lists/csv?\" + qs.stringify(params));\n\t},\n\n\tshowOperations: function showOperations(evt) {\n\t\tevt.stopPropagation();\n\t},\n\n\tfilterDelete: function filterDelete(model) {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\t\tif (rester.hasAccess(rester.p.api.epubs.delete, user) && !settings.fcClient) return rester.matchGrantValues(rester.g.publishers, user, (model.get(\"publisher_id\") || \"0\").toString());\n\t},\n\n\tfilterDownload: function filterDownload() {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\t\treturn rester.hasAccess(rester.p.books[\"ui-download\"], user);\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"bookFormat\", label: \"Format\", cell: ServerGrid.HTMLCell.extend({}), editable: false }, { name: \"title\", label: \"Title\", cell: \"string\", editable: false, sortValue: ServerGrid.stringSort }, { name: \"language\", label: \"Language\", cell: \"string\", editable: false }, { name: \"subject\", label: \"Subject\", cell: \"string\", editable: false }, { name: \"bookGrade\", label: \"Study Year\", cell: \"string\", editable: false }, { name: \"isbn\", label: \"ISBN\", cell: \"string\", editable: false }, { name: \"publisher\", label: \"Publisher\", cell: \"string\", editable: false, sortValue: ServerGrid.stringSort }, { name: \"bookYears\", label: \"Chosen Years\", cell: \"string\", editable: false, sortValue: ServerGrid.stringSort }, { name: \"bookGroups\", label: \"Groups\", cell: \"string\", editable: false }, { name: \"version\", label: \"Version\", cell: ServerGrid.VersionCell.extend({}), editable: false }, { name: \"bookChanged\", label: \"Last Changed\", editable: false, cell: ServerGrid.MomentCell.extend({\n\t\t\t\tmodelInUnixTimestamp: true,\n\t\t\t\tdisplayFormat: \"DD MMM YYYY, HH:mm a\",\n\t\t\t\tdisplayInUTC: false\n\t\t\t}) }, { label: \"Actions\", cell: new ServerGrid.ToolbarCell({ tooltips: [{ title: \"Changelog\", icon: \"fa-list-ul\" }, { title: \"Wipe Cache\", icon: \"fa-eraser\", data: \"wipecache\" }, { title: \"Checksum\", icon: \"fa-sigma\", data: \"checksum\" }, { title: \"Download\", icon: \"fa-download\", data: \"download\", filter: this.filterDownload.bind(this) }, { title: \"Delete\", icon: \"fa-trash-alt\", data: \"delete\", filter: this.filterDelete.bind(this) }] }), editable: false, sortable: false }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new Collection(),\n\t\t\tclickable: true,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counter,\n\t\t\t\ttemplate: \"Books $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tthis.bindEvents(this.grid.collection, this.collectionEvents);\n\n\t\tthis.listenTo(this.grid, \"row:clicked\", this.editMetadata.bind(this));\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar languageFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"languageFilter\",\n\t\t\tlabel: \"Language\",\n\t\t\tcategories: [{ items: settings.languageList }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar subjectFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"subjectFilter\",\n\t\t\tlabel: \"Subject\",\n\t\t\tserver: {\n\t\t\t\tkey: \"subject_id\",\n\t\t\t\tvalue: \"subject\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/subjects\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\n\t\tvar gradeFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"gradeFilter\",\n\t\t\tlabel: \"Year of Study\",\n\t\t\tserver: true,\n\t\t\tcategories: _.map(settings.gradeList, function (val, key) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: key,\n\t\t\t\t\titems: _.reduce(val.sort(function (a, b) {\n\t\t\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t\t\t}), function (sum, num) {\n\t\t\t\t\t\tsum.push({ name: num.value, label: num.name });return sum;\n\t\t\t\t\t}, [])\n\t\t\t\t};\n\t\t\t})\n\t\t};\n\n\t\tvar yearFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"yearFilter\",\n\t\t\tlabel: \"Chosen Year\",\n\t\t\tcategories: [{ items: _.range(2014, moment().year() + 2) }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar formatFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"formatFilter\",\n\t\t\tlabel: \"Format\",\n\t\t\tcategories: [{ items: { mpdf: \"PDF\", mpub: \"EPUB\" } }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar pubFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"pubFilter\",\n\t\t\tlabel: \"Publisher\",\n\t\t\tserver: {\n\t\t\t\tkey: \"publisher_id\",\n\t\t\t\tvalue: \"fullname\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/publishers?dummy=false&active=true\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\n\t\tvar filterList = [textFilter, languageFilter, subjectFilter, gradeFilter, yearFilter, formatFilter, pubFilter];\n\n\t\tthis.ui.filters.prepend(this.grid.filter({ filterContainer: this.ui.filters, filters: filterList, defaultFilters: [\"textFilter\"] }).render().el);\n\t},\n\n\teditMetadata: function editMetadata(model) {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tif (settings.fcClient || !rester.hasAccess(rester.p.api.epubs.put, user) && !rester.matchGrantValues(rester.g.publishers, user, model.get(\"publisher\").toString())) return radio.trigger(App.Events.Commands.Toast, { content: \"You do not have permission to edit books for that publisher\" });\n\n\t\tvar modal = new BookModal({ model: model });\n\n\t\tmodal.show({\n\t\t\tupdate: function update(result) {\n\t\t\t\tresult.model.trigger(\"grid:render\");\n\n\t\t\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\t\t\tcontent: \"Book \" + result.model.get(\"title\") + \" successfully updated\"\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t},\n\n\tdownloadBook: function downloadBook(model) {\n\t\tvar _this = this;\n\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tvar modal = new SmallModal({\n\t\t\ttitle: \"<span class='fal fa-download'/> Download \" + model.get(\"title\"),\n\t\t\tbody: \"<p>\\n\\t\\t\\t\\t\\t<input type=\\\"radio\\\" id=\\\"encrypted\\\" value=\\\"encrypted\\\" name=\\\"downloadType\\\" checked>\\n\\t\\t\\t\\t\\t<label for=\\\"encrypted\\\">Encrypted Book</label>\\n\\t\\t\\t\\t</p>\" + (settings.decryptedBookDownloads && rester.hasAccess(rester.p.books.decryptedDownload, user) ? \"<p>\\n\\t\\t\\t\\t\\t<input type=\\\"radio\\\" id=\\\"decrypted\\\" value=\\\"decrypted\\\" name=\\\"downloadType\\\">\\n\\t\\t\\t\\t\\t<label for=\\\"decrypted\\\">Decrypted Book</label>\\n\\t\\t\\t\\t</p>\" : \"\"),\n\t\t\tpersist: true\n\t\t});\n\n\t\tmodal.on(\"button:ok\", function () {\n\t\t\tif (document.getElementById(\"decrypted\") && document.getElementById(\"decrypted\").checked) {\n\t\t\t\t_this.confirmModal = new SmallModal({\n\t\t\t\t\tpersist: true,\n\t\t\t\t\twarning: true,\n\t\t\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Download Confirmation\",\n\t\t\t\t\tbody: \"<p>You are about to download a decrypted version of the book: \" + model.get(\"title\") + \".<br> You should not give the decrypted book to anyone and you must delete it as soon as you are done using it.</p>\\n\\t\\t\\t\\t\\t\\t\\t<p>The following information will be logged for auditing purposes: <ul><li>User Details</li><li>Book Details</li></ul></p>\\n\\t\\t\\t\\t\\t\\t\\t<p>Are you sure you want to download this book?</p>\"\n\t\t\t\t});\n\n\t\t\t\t_this.confirmModal.on(\"button:ok\", function () {\n\t\t\t\t\t_this.confirmModal.destroy();\n\t\t\t\t\twindow.open(settings.urlRoot + \"/acacia/books/\" + model.id + \"/decryptedFile\");\n\t\t\t\t});\n\n\t\t\t\tmodal.destroy();\n\t\t\t\t_this.confirmModal.show();\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\twindow.open(settings.urlRoot + \"/api/1.0/epubs/\" + model.id + \"/file?browser=1\");\n\t\t\tmodal.destroy();\n\t\t});\n\n\t\tmodal.show();\n\t},\n\n\tdeleteBook: function deleteBook(model) {\n\t\tvar _this2 = this;\n\n\t\tif (!model) return;\n\n\t\tthis.delModal = new SmallModal({\n\t\t\tpersist: true,\n\t\t\twarning: true,\n\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Deletion Confirmation\",\n\t\t\tbody: \"<p>Are you sure you want to delete this book?</p> <p>The following information will disappear <strong>FOREVER</strong>:<ul><li>All attachments made by teachers</ul></p>\\n\\t\\t\\t\\t<p>The following information will NOT disappear, and will automatically re-appear if the <strong>identical</strong> book is re-uploaded:<ul><li>Highlights<li>Annotations</ul></p>\"\n\t\t});\n\n\t\tthis.delModal.on(\"button:ok\", function () {\n\t\t\tmodel.destroy({\n\t\t\t\twait: true,\n\t\t\t\tsuccess: _this2.deletionSuccess.bind(_this2, model),\n\t\t\t\terror: _this2.deletionError.bind(_this2)\n\t\t\t});\n\t\t});\n\n\t\tthis.delModal.show();\n\t},\n\n\tdeletionSuccess: function deletionSuccess(model) {\n\t\tradio.trigger(App.Events.Commands.Toast, { icon: \"fa-trash-alt\", colour: \"red\", content: \"Book \" + model.get(\"title\") + \" successfully deleted\" });\n\t\tthis.delModal.destroy();\n\t},\n\n\tdeletionError: function deletionError(model, xhr) {\n\t\tvar answer = App.parseResponse(xhr);\n\t\tthis.delModal.showError(\"Deletion failed: \" + (answer.detail || answer.info));\n\t},\n\n\twipeCache: function wipeCache(model) {\n\t\tvar _this3 = this;\n\n\t\tif (!model) return;\n\n\t\tthis.delModal = new SmallModal({\n\t\t\tpersist: true,\n\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Wipe Extracted Book Cache\",\n\t\t\tbody: \"<p>This will remove all extracted files for this book. It will not remove the book. This can resolve issues with viewing the book in the EC book viewer.</p>\"\n\t\t});\n\n\t\tthis.delModal.on(\"button:ok\", function () {\n\t\t\tPromise.try(function () {\n\t\t\t\treturn $.get(settings.urlRoot + \"/api/1.0/epubs/\" + model.id + \"/wipeCache\");\n\t\t\t}).then(function () {\n\t\t\t\talert(\"Success\");return _this3.delModal.destroy();\n\t\t\t}).catch(function (x) {\n\t\t\t\talert(\"Error: \" + x.responseJSON.info);_this3.delModal.destroy();\n\t\t\t});\n\t\t});\n\n\t\tthis.delModal.show();\n\t},\n\n\tuploadKeys: function uploadKeys() {\n\t\tif (settings.fcClient) return;\n\n\t\tvar modal = new SmallModal({\n\t\t\ttitle: \"<span class='fal fa-cloud-upload'/> Upload Keys Manually\",\n\t\t\tbody: \"<p>You can upload book keys manually. Provide the JSON file below:</p><p><input type='file'/></p>\",\n\t\t\tpersist: true\n\t\t});\n\n\t\tmodal.on(\"button:ok\", function () {\n\t\t\tif ($(\"input\", modal.el).get(0).files.length === 0) return modal.showError(\"No file provided\");\n\t\t\tif (path.extname($(\"input\", modal.el).get(0).files[0].name).toLowerCase() !== \".json\") return modal.showError(\"Only JSON files allowed\");\n\n\t\t\tvar reader = new FileReader();\n\t\t\treader.addEventListener(\"load\", function (evt) {\n\t\t\t\tvar model = new Backbone.Model(JSON.parse(evt.target.result));\n\t\t\t\tmodel.save({}, {\n\t\t\t\t\turl: settings.urlRoot + \"/api/1.0/empathy/books/keys/manual\",\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\tsuccess: function success() {\n\t\t\t\t\t\talert(\"Success\");modal.destroy();\n\t\t\t\t\t},\n\t\t\t\t\terror: function error(m, xhr) {\n\t\t\t\t\t\tmodal.showError(App.parseResponse(xhr).detail);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t\treader.readAsText($(\"input\", modal.el).get(0).files[0]);\n\t\t});\n\n\t\tmodal.show();\n\t},\n\n\tchangelog: function changelog(model) {\n\t\tvar mod = new Backbone.Model({\n\t\t\ttitle: model.get(\"title\"),\n\t\t\tidentifier: model.get(\"book_id\"),\n\t\t\tcategory: \"book\"\n\t\t});\n\n\t\tvar modal = new ChangelogModal({ model: mod });\n\n\t\tmodal.show();\n\t},\n\n\tchecksum: function checksum(model) {\n\t\t$.ajax({\n\t\t\turl: settings.urlRoot + \"/api/1.0/epubs/\" + model.get(\"_id\") + \"/validateChecksum\",\n\t\t\tmethod: \"GET\",\n\t\t\tsuccess: function success(data) {\n\t\t\t\tvar body = \"<strong><i class=\\\"fal fa-check\\\"/> Checksum Valid</strong><br/><br/>\\n\\t\\t\\t\\t\\t<strong>DB checksum:</strong> <code>\" + data.db + \"</code><br/>\\n\\t\\t\\t\\t\\t<strong>File checksum:</strong> <code>\" + data.file + \"</code>\";\n\t\t\t\tif (data.file !== data.db) {\n\t\t\t\t\tbody = \"<strong><i class=\\\"fal fa-times\\\"/> CHECKSUM MISMATCH</strong><br/><br/>\\n\\t\\t\\t\\t\\t<strong>DB checksum:</strong> <code>\" + data.db + \"</code><br/>\\n\\t\\t\\t\\t\\t<strong>File checksum:</strong> <code>\" + data.file + \"</code><br/><br/>\\n\\t\\t\\t\\t\\t<input type=\\\"button\\\" class=\\\"button\\\" value=\\\"Fix DB Checksum\\\"/>\";\n\t\t\t\t}\n\t\t\t\tvar modal = new SmallModal({\n\t\t\t\t\twarning: data.file !== data.db,\n\t\t\t\t\ttitle: \"Checksum Validation\",\n\t\t\t\t\thideButtons: [\"cancel\"],\n\t\t\t\t\tbody: body\n\t\t\t\t});\n\n\t\t\t\tmodal.show();\n\n\t\t\t\t$(\"input[type='button']\", modal.el).on(\"click\", function () {\n\t\t\t\t\t$.ajax({\n\t\t\t\t\t\turl: settings.urlRoot + \"/api/1.0/epubs/\" + model.get(\"_id\") + \"/validateChecksum\",\n\t\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\t\tdata: { checksum: data.file },\n\t\t\t\t\t\tsuccess: function success() {\n\t\t\t\t\t\t\tmodal.destroy();\n\n\t\t\t\t\t\t\tradio.trigger(App.Events.Commands.Toast, { content: \"Checksum updated\" });\n\t\t\t\t\t\t},\n\t\t\t\t\t\terror: function error(m, xhr) {\n\t\t\t\t\t\t\tmodal.showError(App.parseResponse(xhr).detail);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t},\n\t\t\terror: function error() {\n\t\t\t\tradio.trigger(App.Events.Commands.Toast, { content: \"There was a problem loading the checksum data (the book might not exist)\", icon: \"fa-times\" });\n\t\t\t}\n\t\t});\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJvb2ttYW5hZ2VyLmpzIl0sIm5hbWVzIjpbIl8iLCJyZXF1aXJlIiwiJCIsIkJhY2tib25lIiwibW9tZW50IiwicmVzdGVyIiwicXMiLCJQcm9taXNlIiwicGF0aCIsIkFwcCIsIlNlcnZlckdyaWQiLCJzZXR0aW5ncyIsIkJvb2tNb2RhbCIsIkJvb2tNb2RlbCIsIlNpbXBsZU1lbnUiLCJTbWFsbE1vZGFsIiwiQ2hhbmdlbG9nTW9kYWwiLCJyYWRpbyIsIlJhZGlvIiwiY2hhbm5lbCIsIkNvbGxlY3Rpb24iLCJQYWdlYWJsZUNvbGxlY3Rpb24iLCJleHRlbmQiLCJtb2RlbCIsInVybCIsInVybFJvb3QiLCJzdGF0ZSIsInBhZ2VTaXplIiwibW9kZSIsInF1ZXJ5UGFyYW1zIiwic29ydEtleSIsInBhcnNlU3RhdGUiLCJyZXNwIiwidG90YWxSZWNvcmRzIiwidG90YWwiLCJwYXJzZVJlY29yZHMiLCJyb3dzIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1hcmlvbmV0dGUiLCJWaWV3IiwidGFnTmFtZSIsImNsYXNzTmFtZSIsInRlbXBsYXRlIiwidWkiLCJjb3VudGVyIiwiZmlsdGVycyIsImRvd25sb2FkTGlzdCIsIm9wZXJhdGlvbnMiLCJwYWdpbmciLCJncmlkIiwidXBsb2FkZXIiLCJldmVudHMiLCJjb2xsZWN0aW9uRXZlbnRzIiwic2hvd0Rvd25sb2FkcyIsImV2dCIsInN0b3BQcm9wYWdhdGlvbiIsImxpc3QiLCJhbmNob3IiLCJzaWRlIiwic3RydWN0dXJlIiwiY2xvc2VPbkNsaWNrIiwiZWxlbWVudHMiLCJ0ZXh0IiwiaWQiLCJzaG93IiwibGlzdGVuVG8iLCJiaW5kIiwicGFyYW1zIiwiZmlsdGVyIiwiZ2V0U2VydmVyRmlsdGVycyIsIndpbmRvdyIsIm9wZW4iLCJzdHJpbmdpZnkiLCJzaG93T3BlcmF0aW9ucyIsImZpbHRlckRlbGV0ZSIsInVzZXIiLCJyZXF1ZXN0IiwiRXZlbnRzIiwiUmVxdWVzdHMiLCJDdXJyZW50VXNlciIsImhhc0FjY2VzcyIsInAiLCJhcGkiLCJlcHVicyIsImRlbGV0ZSIsImZjQ2xpZW50IiwibWF0Y2hHcmFudFZhbHVlcyIsImciLCJwdWJsaXNoZXJzIiwiZ2V0IiwidG9TdHJpbmciLCJmaWx0ZXJEb3dubG9hZCIsImJvb2tzIiwib25SZW5kZXIiLCJjb2x1bW5zIiwibmFtZSIsImxhYmVsIiwiY2VsbCIsIkhUTUxDZWxsIiwiZWRpdGFibGUiLCJzb3J0VmFsdWUiLCJzdHJpbmdTb3J0IiwiVmVyc2lvbkNlbGwiLCJNb21lbnRDZWxsIiwibW9kZWxJblVuaXhUaW1lc3RhbXAiLCJkaXNwbGF5Rm9ybWF0IiwiZGlzcGxheUluVVRDIiwiVG9vbGJhckNlbGwiLCJ0b29sdGlwcyIsInRpdGxlIiwiaWNvbiIsImRhdGEiLCJzb3J0YWJsZSIsImVsIiwiY29sbGVjdGlvbiIsImNsaWNrYWJsZSIsImVsZW1lbnQiLCJiaW5kRXZlbnRzIiwiZWRpdE1ldGFkYXRhIiwidGV4dEZpbHRlciIsInR5cGUiLCJkZWJvdW5jZSIsInNlcnZlciIsImxhbmd1YWdlRmlsdGVyIiwiY2F0ZWdvcmllcyIsIml0ZW1zIiwibGFuZ3VhZ2VMaXN0Iiwic3ViamVjdEZpbHRlciIsImtleSIsInZhbHVlIiwiZmV0Y2giLCJpbmZpbml0ZSIsImdyYWRlRmlsdGVyIiwibWFwIiwiZ3JhZGVMaXN0IiwidmFsIiwicmVkdWNlIiwic29ydCIsImEiLCJiIiwibGV4aWNhbCIsInRvVXBwZXJDYXNlIiwibG9jYWxlQ29tcGFyZSIsInN1bSIsIm51bSIsInB1c2giLCJ5ZWFyRmlsdGVyIiwicmFuZ2UiLCJ5ZWFyIiwiZm9ybWF0RmlsdGVyIiwibXBkZiIsIm1wdWIiLCJwdWJGaWx0ZXIiLCJmaWx0ZXJMaXN0IiwicHJlcGVuZCIsImZpbHRlckNvbnRhaW5lciIsImRlZmF1bHRGaWx0ZXJzIiwicmVuZGVyIiwicHV0IiwidHJpZ2dlciIsIkNvbW1hbmRzIiwiVG9hc3QiLCJjb250ZW50IiwibW9kYWwiLCJ1cGRhdGUiLCJyZXN1bHQiLCJkb3dubG9hZEJvb2siLCJib2R5IiwiZGVjcnlwdGVkQm9va0Rvd25sb2FkcyIsImRlY3J5cHRlZERvd25sb2FkIiwicGVyc2lzdCIsIm9uIiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImNoZWNrZWQiLCJjb25maXJtTW9kYWwiLCJ3YXJuaW5nIiwiZGVzdHJveSIsImRlbGV0ZUJvb2siLCJkZWxNb2RhbCIsIndhaXQiLCJzdWNjZXNzIiwiZGVsZXRpb25TdWNjZXNzIiwiZXJyb3IiLCJkZWxldGlvbkVycm9yIiwiY29sb3VyIiwieGhyIiwiYW5zd2VyIiwicGFyc2VSZXNwb25zZSIsInNob3dFcnJvciIsImRldGFpbCIsImluZm8iLCJ3aXBlQ2FjaGUiLCJ0cnkiLCJ0aGVuIiwiYWxlcnQiLCJjYXRjaCIsIngiLCJyZXNwb25zZUpTT04iLCJ1cGxvYWRLZXlzIiwiZmlsZXMiLCJsZW5ndGgiLCJleHRuYW1lIiwidG9Mb3dlckNhc2UiLCJyZWFkZXIiLCJGaWxlUmVhZGVyIiwiYWRkRXZlbnRMaXN0ZW5lciIsIk1vZGVsIiwiSlNPTiIsInBhcnNlIiwidGFyZ2V0Iiwic2F2ZSIsIm1ldGhvZCIsIm0iLCJyZWFkQXNUZXh0IiwiY2hhbmdlbG9nIiwibW9kIiwiaWRlbnRpZmllciIsImNhdGVnb3J5IiwiY2hlY2tzdW0iLCJhamF4IiwiZGIiLCJmaWxlIiwiaGlkZUJ1dHRvbnMiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsSUFBSUQsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNRSxXQUFXRixRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNRyxTQUFTSCxRQUFRLFFBQVIsQ0FBZjtBQUNBLElBQU1JLFNBQVNKLFFBQVEsUUFBUixDQUFmO0FBQ0EsSUFBTUssS0FBS0wsUUFBUSxhQUFSLENBQVg7QUFDQSxJQUFNTSxVQUFVTixRQUFRLFVBQVIsQ0FBaEI7QUFDQSxJQUFNTyxPQUFPUCxRQUFRLE1BQVIsQ0FBYjs7QUFFQSxJQUFNUSxNQUFNUixRQUFRLGFB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akUsS0FBSytHLElBQUwsS0FBYy9HLEtBQUs4RyxFQURBO0FBRTVCaEgsWUFBTyxxQkFGcUI7QUFHNUJrSCxrQkFBYSxDQUFDLFFBQUQsQ0FIZTtBQUk1QnhEO0FBSjRCLEtBQWYsQ0FBZDs7QUFPQUosVUFBTW5HLElBQU47O0FBRUEvRCxNQUFFLHNCQUFGLEVBQTBCa0ssTUFBTWxELEVBQWhDLEVBQW9DMEQsRUFBcEMsQ0FBdUMsT0FBdkMsRUFBZ0QsWUFBTTtBQUNyRDFLLE9BQUUyTixJQUFGLENBQU87QUFDTnJNLFdBQVFiLFNBQVNjLE9BQWpCLHVCQUEwQ0YsTUFBTW1FLEdBQU4sQ0FBVSxLQUFWLENBQTFDLHNCQURNO0FBRU4ySCxjQUFRLE1BRkY7QUFHTnJHLFlBQU0sRUFBRTRHLFVBQVU1RyxLQUFLK0csSUFBakIsRUFIQTtBQUlOekMsZUFBUyxtQkFBTTtBQUNkbEIsYUFBTWMsT0FBTjs7QUFFQWpLLGFBQU0rSSxPQUFOLENBQWN2SixJQUFJcUUsTUFBSixDQUFXbUYsUUFBWCxDQUFvQkMsS0FBbEMsRUFBeUMsRUFBRUMsU0FBUyxrQkFBWCxFQUF6QztBQUNBLE9BUks7QUFTTnFCLGFBQU8sZUFBQzhCLENBQUQsRUFBSTNCLEdBQUosRUFBWTtBQUNsQnZCLGFBQU0wQixTQUFOLENBQWdCckwsSUFBSW9MLGFBQUosQ0FBa0JGLEdBQWxCLEVBQXVCSSxNQUF2QztBQUNBO0FBWEssTUFBUDtBQWFBLEtBZEQ7QUFlQSxJQXJDSztBQXNDTlAsVUFBTyxpQkFBTTtBQUNadkssVUFBTStJLE9BQU4sQ0FBY3ZKLElBQUlxRSxNQUFKLENBQVdtRixRQUFYLENBQW9CQyxLQUFsQyxFQUF5QyxFQUFFQyxTQUFTLDBFQUFYLEVBQXVGcEQsTUFBTSxVQUE3RixFQUF6QztBQUNBO0FBeENLLEdBQVA7QUEwQ0E7QUFoWitDLENBQWhDLENBQWpCIiwiZmlsZSI6ImJvb2ttYW5hZ2VyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCBtb21lbnQgPSByZXF1aXJlKFwibW9tZW50XCIpO1xuY29uc3QgcmVzdGVyID0gcmVxdWlyZShcInJlc3RlclwiKTtcbmNvbnN0IHFzID0gcmVxdWlyZShcInF1ZXJ5c3RyaW5nXCIpO1xuY29uc3QgUHJvbWlzZSA9IHJlcXVpcmUoXCJibHVlYmlyZFwiKTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcblxuY29uc3QgQXBwID0gcmVxdWlyZShcIi4uLy4uL2luZGV4XCIpO1xuY29uc3QgU2VydmVyR3JpZCA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc2VydmVyR3JpZFwiKTtcbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxuY29uc3QgQm9va01vZGFsID0gcmVxdWlyZShcIi4vYm9va01vZGFsXCIpO1xuY29uc3QgQm9va01vZGVsID0gcmVxdWlyZShcIi4uL2Jvb2tNb2RlbFwiKTtcblxuY29uc3QgU2ltcGxlTWVudSA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc2ltcGxlTWVudVwiKTtcbmNvbnN0IFNtYWxsTW9kYWwgPSByZXF1aXJlKFwiLi4vLi4vbGliL3NtYWxsTW9kYWxcIik7XG5jb25zdCBDaGFuZ2Vsb2dNb2RhbCA9IHJlcXVpcmUoXCIuLi8uLi9saWIvY2hhbmdlbG9nTW9kYWxcIik7XG5cbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcblxuY29uc3QgQ29sbGVjdGlvbiA9IEJhY2tib25lLlBhZ2VhYmxlQ29sbGVjdGlvbi5leHRlbmQoe1xuXHRtb2RlbDogQm9va01vZGVsLFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2VwdWJzP3BhZ2VkPXRydWVcIjtcblx0fSxcblxuXHRzdGF0ZToge1xuXHRcdHBhZ2VTaXplOiAzMCxcblx0fSxcblx0bW9kZTogXCJzZXJ2ZXJcIixcblxuXHRxdWVyeVBhcmFtczoge1xuXHRcdHBhZ2VTaXplOiBcInBhZ2VTaXplXCIsXG5cdFx0c29ydEtleTogXCJzb3J0QnlcIixcblx0fSxcblxuXHRwYXJzZVN0YXRlOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0cmV0dXJuIHsgdG90YWxSZWNvcmRzOiByZXNwLnRvdGFsIH07XG5cdH0sXG5cblx0cGFyc2VSZWNvcmRzOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0cmV0dXJuIHJlc3Aucm93cztcblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwiY29udGVudCBib29rLW1hbmFnZXJcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9ib29rbWFuYWdlLm51bmpcIiksXG5cblx0dWk6IHtcblx0XHRjb3VudGVyOiBcIi5vcHMtYmFyIC5jb3VudGVyXCIsXG5cdFx0ZmlsdGVyczogXCIub3BzLWJhciAuZmlsdGVyc1wiLFxuXHRcdGRvd25sb2FkTGlzdDogXCIuZG93bmxvYWRMaXN0XCIsXG5cdFx0b3BlcmF0aW9uczogXCIub3BlcmF0aW9uc1wiLFxuXHRcdHBhZ2luZzogXCIucGFnaW5nXCIsXG5cdFx0Z3JpZDogXCJkaXYuZ3JpZFwiLFxuXHRcdHVwbG9hZGVyOiBcIi51cGxvYWRcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5kb3dubG9hZExpc3RcIjogXCJzaG93RG93bmxvYWRzXCIsXG5cdFx0XCJjbGljayBAdWkub3BlcmF0aW9uc1wiOiBcInNob3dPcGVyYXRpb25zXCIsXG5cdFx0XCJjbGljayBAdWkudXBsb2FkZXJcIjogXCJ1cGxvYWRLZXlzXCIsXG5cdH0sXG5cblx0Y29sbGVjdGlvbkV2ZW50czoge1xuXHRcdFwidG9vbGJhcjpjbGljazpkZWxldGVcIjogXCJkZWxldGVCb29rXCIsXG5cdFx0XCJ0b29sYmFyOmNsaWNrOmRvd25sb2FkXCI6IFwiZG93bmxvYWRCb29rXCIsXG5cdFx0XCJ0b29sYmFyOmNsaWNrOndpcGVjYWNoZVwiOiBcIndpcGVDYWNoZVwiLFxuXHRcdFwidG9vbGJhcjpjbGljazpjaGFuZ2Vsb2dcIjogXCJjaGFuZ2Vsb2dcIixcblx0XHRcInRvb2xiYXI6Y2xpY2s6Y2hlY2tzdW1cIjogXCJjaGVja3N1bVwiLFxuXHR9LFxuXG5cdHNob3dEb3dubG9hZHM6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGNvbnN0IGxpc3QgPSBuZXcgU2ltcGxlTWVudSh7XG5cdFx0XHRhbmNob3I6IHRoaXMudWkuZG93bmxvYWRMaXN0LFxuXHRcdFx0c2lkZTogXCJsZWZ0XCIsXG5cdFx0XHRzdHJ1Y3R1cmU6IFtcblx0XHRcdFx0eyBjbG9zZU9uQ2xpY2s6IHRydWUsIGVsZW1lbnRzOiBbXG5cdFx0XHRcdFx0eyB0ZXh0OiBcIkV4cG9ydCBsaXN0IG9mIGFsbCBib29rc1wiLCBpZDogXCJib29rc1wiIH0sXG5cdFx0XHRcdF0gfSxcblx0XHRcdF0sXG5cdFx0fSk7XG5cdFx0bGlzdC5zaG93KCk7XG5cblx0XHR0aGlzLmxpc3RlblRvKGxpc3QsIFwiY2xpY2tlZDpib29rc1wiLCB0aGlzLmRvd25sb2FkTGlzdC5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRkb3dubG9hZExpc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHBhcmFtcyA9IHRoaXMuZ3JpZC5maWx0ZXIuZ2V0U2VydmVyRmlsdGVycygpO1xuXHRcdHdpbmRvdy5vcGVuKHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2VwdWJzL2xpc3RzL2Nzdj9cIiArIHFzLnN0cmluZ2lmeShwYXJhbXMpKTtcblx0fSxcblxuXHRzaG93T3BlcmF0aW9uczogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9LFxuXG5cdGZpbHRlckRlbGV0ZTogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRjb25zdCB1c2VyID0gcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblx0XHRpZiAocmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5hcGkuZXB1YnMuZGVsZXRlLCB1c2VyKSAmJiAhc2V0dGluZ3MuZmNDbGllbnQpXG5cdFx0XHRyZXR1cm4gcmVzdGVyLm1hdGNoR3JhbnRWYWx1ZXMocmVzdGVyLmcucHVibGlzaGVycywgdXNlciwgKG1vZGVsLmdldChcInB1Ymxpc2hlcl9pZFwiKSB8fCBcIjBcIikudG9TdHJpbmcoKSk7XG5cdH0sXG5cblx0ZmlsdGVyRG93bmxvYWQ6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHVzZXIgPSByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpO1xuXHRcdHJldHVybiByZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmJvb2tzW1widWktZG93bmxvYWRcIl0sIHVzZXIpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBjb2x1bW5zID0gW1xuXHRcdFx0eyBuYW1lOiBcImJvb2tGb3JtYXRcIiwgbGFiZWw6IFwiRm9ybWF0XCIsIGNlbGw6IFNlcnZlckdyaWQuSFRNTENlbGwuZXh0ZW5kKHt9KSwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwidGl0bGVcIiwgbGFiZWw6IFwiVGl0bGVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlLCBzb3J0VmFsdWU6IFNlcnZlckdyaWQuc3RyaW5nU29ydCB9LFxuXHRcdFx0eyBuYW1lOiBcImxhbmd1YWdlXCIsIGxhYmVsOiBcIkxhbmd1YWdlXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcInN1YmplY3RcIiwgbGFiZWw6IFwiU3ViamVjdFwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJib29rR3JhZGVcIiwgbGFiZWw6IFwiU3R1ZHkgWWVhclwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJpc2JuXCIsIGxhYmVsOiBcIklTQk5cIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwicHVibGlzaGVyXCIsIGxhYmVsOiBcIlB1Ymxpc2hlclwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UsIHNvcnRWYWx1ZTogU2VydmVyR3JpZC5zdHJpbmdTb3J0IH0sXG5cdFx0XHR7IG5hbWU6IFwiYm9va1llYXJzXCIsIGxhYmVsOiBcIkNob3NlbiBZZWFyc1wiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UsIHNvcnRWYWx1ZTogU2VydmVyR3JpZC5zdHJpbmdTb3J0IH0sXG5cdFx0XHR7IG5hbWU6IFwiYm9va0dyb3Vwc1wiLCBsYWJlbDogXCJHcm91cHNcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwidmVyc2lvblwiLCBsYWJlbDogXCJWZXJzaW9uXCIsIGNlbGw6IFNlcnZlckdyaWQuVmVyc2lvbkNlbGwuZXh0ZW5kKHt9KSwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiYm9va0NoYW5nZWRcIiwgbGFiZWw6IFwiTGFzdCBDaGFuZ2VkXCIsIGVkaXRhYmxlOiBmYWxzZSwgY2VsbDogU2VydmVyR3JpZC5Nb21lbnRDZWxsLmV4dGVuZCh7XG5cdFx0XHRcdG1vZGVsSW5Vbml4VGltZXN0YW1wOiB0cnVlLFxuXHRcdFx0XHRkaXNwbGF5Rm9ybWF0OiBcIkREIE1NTSBZWVlZLCBISDptbSBhXCIsXG5cdFx0XHRcdGRpc3BsYXlJblVUQzogZmFsc2UsXG5cdFx0XHR9KSB9LFxuXHRcdFx0eyBsYWJlbDogXCJBY3Rpb25zXCIsIGNlbGw6IG5ldyBTZXJ2ZXJHcmlkLlRvb2xiYXJDZWxsKHsgdG9vbHRpcHM6IFtcblx0XHRcdFx0eyB0aXRsZTogXCJDaGFuZ2Vsb2dcIiwgaWNvbjogXCJmYS1saXN0LXVsXCIgfSxcblx0XHRcdFx0eyB0aXRsZTogXCJXaXBlIENhY2hlXCIsIGljb246IFwiZmEtZXJhc2VyXCIsIGRhdGE6IFwid2lwZWNhY2hlXCIgfSxcblx0XHRcdFx0eyB0aXRsZTogXCJDaGVja3N1bVwiLCBpY29uOiBcImZhLXNpZ21hXCIsIGRhdGE6IFwiY2hlY2tzdW1cIiB9LFxuXHRcdFx0XHR7IHRpdGxlOiBcIkRvd25sb2FkXCIsIGljb246IFwiZmEtZG93bmxvYWRcIiwgZGF0YTogXCJkb3dubG9hZFwiLCBmaWx0ZXI6IHRoaXMuZmlsdGVyRG93bmxvYWQuYmluZCh0aGlzKSB9LFxuXHRcdFx0XHR7IHRpdGxlOiBcIkRlbGV0ZVwiLCBpY29uOiBcImZhLXRyYXNoLWFsdFwiLCBkYXRhOiBcImRlbGV0ZVwiLCBmaWx0ZXI6IHRoaXMuZmlsdGVyRGVsZXRlLmJpbmQodGhpcykgfSxcblx0XHRcdF0gfSksIGVkaXRhYmxlOiBmYWxzZSwgc29ydGFibGU6IGZhbHNlIH0sXG5cdFx0XTtcblxuXHRcdHRoaXMuZ3JpZCA9IG5ldyBTZXJ2ZXJHcmlkKHtcblx0XHRcdGVsOiB0aGlzLnVpLmdyaWQsXG5cdFx0XHRjb2x1bW5zOiBjb2x1bW5zLFxuXHRcdFx0Y29sbGVjdGlvbjogbmV3IENvbGxlY3Rpb24oKSxcblx0XHRcdGNsaWNrYWJsZTogdHJ1ZSxcblx0XHRcdGNvdW50ZXI6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5jb3VudGVyLFxuXHRcdFx0XHR0ZW1wbGF0ZTogXCJCb29rcyAkc3RhcnQgLSAkZW5kIG9mICR0b3RhbFwiLFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLnBhZ2luZyxcblx0XHRcdH0sXG5cdFx0fSk7XG5cblx0XHR0aGlzLmJpbmRFdmVudHModGhpcy5ncmlkLmNvbGxlY3Rpb24sIHRoaXMuY29sbGVjdGlvbkV2ZW50cyk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZ3JpZCwgXCJyb3c6Y2xpY2tlZFwiLCB0aGlzLmVkaXRNZXRhZGF0YS5iaW5kKHRoaXMpKTtcblxuXHRcdGNvbnN0IHRleHRGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcInRleHRcIixcblx0XHRcdG5hbWU6IFwidGV4dEZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiVGV4dCBTZWFyY2hcIixcblx0XHRcdGRlYm91bmNlOiAyMDAsXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdGNvbnN0IGxhbmd1YWdlRmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJsYW5ndWFnZUZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiTGFuZ3VhZ2VcIixcblx0XHRcdGNhdGVnb3JpZXM6IFtcblx0XHRcdFx0eyBpdGVtczogc2V0dGluZ3MubGFuZ3VhZ2VMaXN0IH0sXG5cdFx0XHRdLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdH07XG5cblx0XHRjb25zdCBzdWJqZWN0RmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJzdWJqZWN0RmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJTdWJqZWN0XCIsXG5cdFx0XHRzZXJ2ZXI6IHtcblx0XHRcdFx0a2V5OiBcInN1YmplY3RfaWRcIixcblx0XHRcdFx0dmFsdWU6IFwic3ViamVjdFwiLFxuXHRcdFx0XHRmZXRjaDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvZGF0YS9zdWJqZWN0c1wiLFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRwYWdlU2l6ZTogMzAsXG5cdFx0XHRcdGluZmluaXRlOiB0cnVlLFxuXHRcdFx0fSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgZ3JhZGVGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcImdyYWRlRmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJZZWFyIG9mIFN0dWR5XCIsXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0XHRjYXRlZ29yaWVzOiBfLm1hcChzZXR0aW5ncy5ncmFkZUxpc3QsICh2YWwsIGtleSkgPT4gKHtcblx0XHRcdFx0bGFiZWw6IGtleSxcblx0XHRcdFx0aXRlbXM6IF8ucmVkdWNlKHZhbC5zb3J0KChhLCBiKSA9PiAoXCJsZXhpY2FsXCIgaW4gYSA/IGEubGV4aWNhbCA6IGEubmFtZSkudG9VcHBlckNhc2UoKS5sb2NhbGVDb21wYXJlKChcImxleGljYWxcIiBpbiBiID8gYi5sZXhpY2FsIDogYi5uYW1lKS50b1VwcGVyQ2FzZSgpKSksXG5cdFx0XHRcdFx0KHN1bSwgbnVtKSA9PiB7IHN1bS5wdXNoKHsgbmFtZTogbnVtLnZhbHVlLCBsYWJlbDogbnVtLm5hbWUgfSk7IHJldHVybiBzdW07IH0sIFtdKSxcblx0XHRcdH0pKSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgeWVhckZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiaXRlbWl6ZWRcIixcblx0XHRcdG5hbWU6IFwieWVhckZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiQ2hvc2VuIFllYXJcIixcblx0XHRcdGNhdGVnb3JpZXM6IFtcblx0XHRcdFx0eyBpdGVtczogXy5yYW5nZSgyMDE0LCBtb21lbnQoKS55ZWFyKCkgKyAyKSB9LFxuXHRcdFx0XSxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgZm9ybWF0RmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJmb3JtYXRGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIkZvcm1hdFwiLFxuXHRcdFx0Y2F0ZWdvcmllczogW1xuXHRcdFx0XHR7IGl0ZW1zOiB7IG1wZGY6IFwiUERGXCIsIG1wdWI6IFwiRVBVQlwiIH0gfSxcblx0XHRcdF0sXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdGNvbnN0IHB1YkZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiaXRlbWl6ZWRcIixcblx0XHRcdG5hbWU6IFwicHViRmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJQdWJsaXNoZXJcIixcblx0XHRcdHNlcnZlcjoge1xuXHRcdFx0XHRrZXk6IFwicHVibGlzaGVyX2lkXCIsXG5cdFx0XHRcdHZhbHVlOiBcImZ1bGxuYW1lXCIsXG5cdFx0XHRcdGZldGNoOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9kYXRhL3B1Ymxpc2hlcnM/ZHVtbXk9ZmFsc2UmYWN0aXZlPXRydWVcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0cGFnZVNpemU6IDMwLFxuXHRcdFx0XHRpbmZpbml0ZTogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0fTtcblxuXHRcdGNvbnN0IGZpbHRlckxpc3QgPSBbdGV4dEZpbHRlciwgbGFuZ3VhZ2VGaWx0ZXIsIHN1YmplY3RGaWx0ZXIsIGdyYWRlRmlsdGVyLCB5ZWFyRmlsdGVyLCBmb3JtYXRGaWx0ZXIsIHB1YkZpbHRlcl07XG5cblx0XHR0aGlzLnVpLmZpbHRlcnMucHJlcGVuZCh0aGlzLmdyaWQuZmlsdGVyKHsgZmlsdGVyQ29udGFpbmVyOiB0aGlzLnVpLmZpbHRlcnMsIGZpbHRlcnM6IGZpbHRlckxpc3QsIGRlZmF1bHRGaWx0ZXJzOiBbXCJ0ZXh0RmlsdGVyXCJdIH0pLnJlbmRlcigpLmVsKTtcblx0fSxcblxuXHRlZGl0TWV0YWRhdGE6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0Y29uc3QgdXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cblx0XHRpZiAoc2V0dGluZ3MuZmNDbGllbnQgfHwgIXJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAuYXBpLmVwdWJzLnB1dCwgdXNlcikgJiYgIXJlc3Rlci5tYXRjaEdyYW50VmFsdWVzKHJlc3Rlci5nLnB1Ymxpc2hlcnMsIHVzZXIsIG1vZGVsLmdldChcInB1Ymxpc2hlclwiKS50b1N0cmluZygpKSlcblx0XHRcdHJldHVybiByYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuVG9hc3QsIHsgY29udGVudDogXCJZb3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbiB0byBlZGl0IGJvb2tzIGZvciB0aGF0IHB1Ymxpc2hlclwiIH0pO1xuXG5cdFx0Y29uc3QgbW9kYWwgPSBuZXcgQm9va01vZGFsKHsgbW9kZWw6IG1vZGVsIH0pO1xuXG5cdFx0bW9kYWwuc2hvdyh7XG5cdFx0XHR1cGRhdGU6IHJlc3VsdCA9PiB7XG5cdFx0XHRcdHJlc3VsdC5tb2RlbC50cmlnZ2VyKFwiZ3JpZDpyZW5kZXJcIik7XG5cblx0XHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7XG5cdFx0XHRcdFx0Y29udGVudDogXCJCb29rIFwiICsgcmVzdWx0Lm1vZGVsLmdldChcInRpdGxlXCIpICsgXCIgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWRcIixcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9LFxuXG5cdGRvd25sb2FkQm9vazogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRjb25zdCB1c2VyID0gcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblxuXHRcdGNvbnN0IG1vZGFsID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0dGl0bGU6IFwiPHNwYW4gY2xhc3M9J2ZhbCBmYS1kb3dubG9hZCcvPiBEb3dubG9hZCBcIiArIG1vZGVsLmdldChcInRpdGxlXCIpLFxuXHRcdFx0Ym9keTogYDxwPlxuXHRcdFx0XHRcdDxpbnB1dCB0eXBlPVwicmFkaW9cIiBpZD1cImVuY3J5cHRlZFwiIHZhbHVlPVwiZW5jcnlwdGVkXCIgbmFtZT1cImRvd25sb2FkVHlwZVwiIGNoZWNrZWQ+XG5cdFx0XHRcdFx0PGxhYmVsIGZvcj1cImVuY3J5cHRlZFwiPkVuY3J5cHRlZCBCb29rPC9sYWJlbD5cblx0XHRcdFx0PC9wPmAgKyAoc2V0dGluZ3MuZGVjcnlwdGVkQm9va0Rvd25sb2FkcyAmJiByZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmJvb2tzLmRlY3J5cHRlZERvd25sb2FkLCB1c2VyKSA/XG5cdFx0XHRcdGA8cD5cblx0XHRcdFx0XHQ8aW5wdXQgdHlwZT1cInJhZGlvXCIgaWQ9XCJkZWNyeXB0ZWRcIiB2YWx1ZT1cImRlY3J5cHRlZFwiIG5hbWU9XCJkb3dubG9hZFR5cGVcIj5cblx0XHRcdFx0XHQ8bGFiZWwgZm9yPVwiZGVjcnlwdGVkXCI+RGVjcnlwdGVkIEJvb2s8L2xhYmVsPlxuXHRcdFx0XHQ8L3A+YCA6IFwiXCIpLFxuXHRcdFx0cGVyc2lzdDogdHJ1ZSxcblx0XHR9KTtcblxuXHRcdG1vZGFsLm9uKFwiYnV0dG9uOm9rXCIsICgpID0+IHtcblx0XHRcdGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImRlY3J5cHRlZFwiKSAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImRlY3J5cHRlZFwiKS5jaGVja2VkKSB7XG5cdFx0XHRcdHRoaXMuY29uZmlybU1vZGFsID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0XHRcdHBlcnNpc3Q6IHRydWUsXG5cdFx0XHRcdFx0d2FybmluZzogdHJ1ZSxcblx0XHRcdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmFsIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJy8+IERvd25sb2FkIENvbmZpcm1hdGlvblwiLFxuXHRcdFx0XHRcdGJvZHk6IFwiPHA+WW91IGFyZSBhYm91dCB0byBkb3dubG9hZCBhIGRlY3J5cHRlZCB2ZXJzaW9uIG9mIHRoZSBib29rOiBcIiArIG1vZGVsLmdldChcInRpdGxlXCIpICtcblx0XHRcdFx0XHRcdFx0YC48YnI+IFlvdSBzaG91bGQgbm90IGdpdmUgdGhlIGRlY3J5cHRlZCBib29rIHRvIGFueW9uZSBhbmQgeW91IG11c3QgZGVsZXRlIGl0IGFzIHNvb24gYXMgeW91IGFyZSBkb25lIHVzaW5nIGl0LjwvcD5cblx0XHRcdFx0XHRcdFx0PHA+VGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiB3aWxsIGJlIGxvZ2dlZCBmb3IgYXVkaXRpbmcgcHVycG9zZXM6IDx1bD48bGk+VXNlciBEZXRhaWxzPC9saT48bGk+Qm9vayBEZXRhaWxzPC9saT48L3VsPjwvcD5cblx0XHRcdFx0XHRcdFx0PHA+QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRvd25sb2FkIHRoaXMgYm9vaz88L3A+YCxcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dGhpcy5jb25maXJtTW9kYWwub24oXCJidXR0b246b2tcIiwgKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuY29uZmlybU1vZGFsLmRlc3Ryb3koKTtcblx0XHRcdFx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvYWNhY2lhL2Jvb2tzL1wiICsgbW9kZWwuaWQgKyBcIi9kZWNyeXB0ZWRGaWxlXCIpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRtb2RhbC5kZXN0cm95KCk7XG5cdFx0XHRcdHRoaXMuY29uZmlybU1vZGFsLnNob3coKTtcblxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHdpbmRvdy5vcGVuKHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2VwdWJzL1wiICsgbW9kZWwuaWQgKyBcIi9maWxlP2Jyb3dzZXI9MVwiKTtcblx0XHRcdG1vZGFsLmRlc3Ryb3koKTtcblx0XHR9KTtcblxuXHRcdG1vZGFsLnNob3coKTtcblx0fSxcblxuXHRkZWxldGVCb29rOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdGlmICghbW9kZWwpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLmRlbE1vZGFsID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0cGVyc2lzdDogdHJ1ZSxcblx0XHRcdHdhcm5pbmc6IHRydWUsXG5cdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmFsIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJy8+IERlbGV0aW9uIENvbmZpcm1hdGlvblwiLFxuXHRcdFx0Ym9keTogYDxwPkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBib29rPzwvcD4gPHA+VGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiB3aWxsIGRpc2FwcGVhciA8c3Ryb25nPkZPUkVWRVI8L3N0cm9uZz46PHVsPjxsaT5BbGwgYXR0YWNobWVudHMgbWFkZSBieSB0ZWFjaGVyczwvdWw+PC9wPlxuXHRcdFx0XHQ8cD5UaGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIHdpbGwgTk9UIGRpc2FwcGVhciwgYW5kIHdpbGwgYXV0b21hdGljYWxseSByZS1hcHBlYXIgaWYgdGhlIDxzdHJvbmc+aWRlbnRpY2FsPC9zdHJvbmc+IGJvb2sgaXMgcmUtdXBsb2FkZWQ6PHVsPjxsaT5IaWdobGlnaHRzPGxpPkFubm90YXRpb25zPC91bD48L3A+YCxcblx0XHR9KTtcblxuXHRcdHRoaXMuZGVsTW9kYWwub24oXCJidXR0b246b2tcIiwgKCkgPT4ge1xuXHRcdFx0bW9kZWwuZGVzdHJveSh7XG5cdFx0XHRcdHdhaXQ6IHRydWUsXG5cdFx0XHRcdHN1Y2Nlc3M6IHRoaXMuZGVsZXRpb25TdWNjZXNzLmJpbmQodGhpcywgbW9kZWwpLFxuXHRcdFx0XHRlcnJvcjogdGhpcy5kZWxldGlvbkVycm9yLmJpbmQodGhpcyksXG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdHRoaXMuZGVsTW9kYWwuc2hvdygpO1xuXHR9LFxuXG5cdGRlbGV0aW9uU3VjY2VzczogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuVG9hc3QsIHsgaWNvbjogXCJmYS10cmFzaC1hbHRcIiwgY29sb3VyOiBcInJlZFwiLCBjb250ZW50OiBcIkJvb2sgXCIgKyBtb2RlbC5nZXQoXCJ0aXRsZVwiKSArIFwiIHN1Y2Nlc3NmdWxseSBkZWxldGVkXCIgfSk7XG5cdFx0dGhpcy5kZWxNb2RhbC5kZXN0cm95KCk7XG5cdH0sXG5cblx0ZGVsZXRpb25FcnJvcjogZnVuY3Rpb24obW9kZWwsIHhocikge1xuXHRcdGNvbnN0IGFuc3dlciA9IEFwcC5wYXJzZVJlc3BvbnNlKHhocik7XG5cdFx0dGhpcy5kZWxNb2RhbC5zaG93RXJyb3IoXCJEZWxldGlvbiBmYWlsZWQ6IFwiICsgKGFuc3dlci5kZXRhaWwgfHwgYW5zd2VyLmluZm8pKTtcblx0fSxcblxuXHR3aXBlQ2FjaGU6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0aWYgKCFtb2RlbClcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuZGVsTW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHRwZXJzaXN0OiB0cnVlLFxuXHRcdFx0dGl0bGU6IFwiPHNwYW4gY2xhc3M9J2ZhbCBmYS1leGNsYW1hdGlvbi10cmlhbmdsZScvPiBXaXBlIEV4dHJhY3RlZCBCb29rIENhY2hlXCIsXG5cdFx0XHRib2R5OiBcIjxwPlRoaXMgd2lsbCByZW1vdmUgYWxsIGV4dHJhY3RlZCBmaWxlcyBmb3IgdGhpcyBib29rLiBJdCB3aWxsIG5vdCByZW1vdmUgdGhlIGJvb2suIFRoaXMgY2FuIHJlc29sdmUgaXNzdWVzIHdpdGggdmlld2luZyB0aGUgYm9vayBpbiB0aGUgRUMgYm9vayB2aWV3ZXIuPC9wPlwiLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5kZWxNb2RhbC5vbihcImJ1dHRvbjpva1wiLCAoKSA9PiB7XG5cdFx0XHRQcm9taXNlLnRyeSgoKSA9PiAkLmdldChzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9lcHVicy9cIiArIG1vZGVsLmlkICsgXCIvd2lwZUNhY2hlXCIpKVxuXHRcdFx0XHQudGhlbigoKSA9PiB7IGFsZXJ0KFwiU3VjY2Vzc1wiKTsgcmV0dXJuIHRoaXMuZGVsTW9kYWwuZGVzdHJveSgpOyB9KVxuXHRcdFx0XHQuY2F0Y2goeCA9PiB7IGFsZXJ0KFwiRXJyb3I6IFwiICsgeC5yZXNwb25zZUpTT04uaW5mbyk7IHRoaXMuZGVsTW9kYWwuZGVzdHJveSgpOyB9KTtcblx0XHR9KTtcblxuXHRcdHRoaXMuZGVsTW9kYWwuc2hvdygpO1xuXHR9LFxuXG5cdHVwbG9hZEtleXM6IGZ1bmN0aW9uKCkge1xuXHRcdGlmIChzZXR0aW5ncy5mY0NsaWVudClcblx0XHRcdHJldHVybjtcblxuXHRcdGNvbnN0IG1vZGFsID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0dGl0bGU6IFwiPHNwYW4gY2xhc3M9J2ZhbCBmYS1jbG91ZC11cGxvYWQnLz4gVXBsb2FkIEtleXMgTWFudWFsbHlcIixcblx0XHRcdGJvZHk6IFwiPHA+WW91IGNhbiB1cGxvYWQgYm9vayBrZXlzIG1hbnVhbGx5LiBQcm92aWRlIHRoZSBKU09OIGZpbGUgYmVsb3c6PC9wPjxwPjxpbnB1dCB0eXBlPSdmaWxlJy8+PC9wPlwiLFxuXHRcdFx0cGVyc2lzdDogdHJ1ZSxcblx0XHR9KTtcblxuXHRcdG1vZGFsLm9uKFwiYnV0dG9uOm9rXCIsICgpID0+IHtcblx0XHRcdGlmICgkKFwiaW5wdXRcIiwgbW9kYWwuZWwpLmdldCgwKS5maWxlcy5sZW5ndGggPT09IDApXG5cdFx0XHRcdHJldHVybiBtb2RhbC5zaG93RXJyb3IoXCJObyBmaWxlIHByb3ZpZGVkXCIpO1xuXHRcdFx0aWYgKHBhdGguZXh0bmFtZSgkKFwiaW5wdXRcIiwgbW9kYWwuZWwpLmdldCgwKS5maWxlc1swXS5uYW1lKS50b0xvd2VyQ2FzZSgpICE9PSBcIi5qc29uXCIpXG5cdFx0XHRcdHJldHVybiBtb2RhbC5zaG93RXJyb3IoXCJPbmx5IEpTT04gZmlsZXMgYWxsb3dlZFwiKTtcblxuXHRcdFx0Y29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcblx0XHRcdHJlYWRlci5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCBldnQgPT4ge1xuXHRcdFx0XHRjb25zdCBtb2RlbCA9IG5ldyBCYWNrYm9uZS5Nb2RlbChKU09OLnBhcnNlKGV2dC50YXJnZXQucmVzdWx0KSk7XG5cdFx0XHRcdG1vZGVsLnNhdmUoe30sIHtcblx0XHRcdFx0XHR1cmw6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2VtcGF0aHkvYm9va3Mva2V5cy9tYW51YWxcIixcblx0XHRcdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0XHRcdHN1Y2Nlc3M6ICgpID0+IHsgYWxlcnQoXCJTdWNjZXNzXCIpOyBtb2RhbC5kZXN0cm95KCk7IH0sXG5cdFx0XHRcdFx0ZXJyb3I6IChtLCB4aHIpID0+IHsgbW9kYWwuc2hvd0Vycm9yKEFwcC5wYXJzZVJlc3BvbnNlKHhocikuZGV0YWlsKTsgfSxcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHRcdHJlYWRlci5yZWFkQXNUZXh0KCQoXCJpbnB1dFwiLCBtb2RhbC5lbCkuZ2V0KDApLmZpbGVzWzBdKTtcblx0XHR9KTtcblxuXHRcdG1vZGFsLnNob3coKTtcblx0fSxcblxuXHRjaGFuZ2Vsb2c6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0Y29uc3QgbW9kID0gbmV3IEJhY2tib25lLk1vZGVsKHtcblx0XHRcdHRpdGxlOiBtb2RlbC5nZXQoXCJ0aXRsZVwiKSxcblx0XHRcdGlkZW50aWZpZXI6IG1vZGVsLmdldChcImJvb2tfaWRcIiksXG5cdFx0XHRjYXRlZ29yeTogXCJib29rXCIsXG5cdFx0fSk7XG5cblx0XHRjb25zdCBtb2RhbCA9IG5ldyBDaGFuZ2Vsb2dNb2RhbCh7IG1vZGVsOiBtb2QgfSk7XG5cblx0XHRtb2RhbC5zaG93KCk7XG5cdH0sXG5cblx0Y2hlY2tzdW06IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0JC5hamF4KHtcblx0XHRcdHVybDogYCR7c2V0dGluZ3MudXJsUm9vdH0vYXBpLzEuMC9lcHVicy8ke21vZGVsLmdldChcIl9pZFwiKX0vdmFsaWRhdGVDaGVja3N1bWAsXG5cdFx0XHRtZXRob2Q6IFwiR0VUXCIsXG5cdFx0XHRzdWNjZXNzOiBkYXRhID0+IHtcblx0XHRcdFx0bGV0IGJvZHkgPSBgPHN0cm9uZz48aSBjbGFzcz1cImZhbCBmYS1jaGVja1wiLz4gQ2hlY2tzdW0gVmFsaWQ8L3N0cm9uZz48YnIvPjxici8+XG5cdFx0XHRcdFx0PHN0cm9uZz5EQiBjaGVja3N1bTo8L3N0cm9uZz4gPGNvZGU+JHtkYXRhLmRifTwvY29kZT48YnIvPlxuXHRcdFx0XHRcdDxzdHJvbmc+RmlsZSBjaGVja3N1bTo8L3N0cm9uZz4gPGNvZGU+JHtkYXRhLmZpbGV9PC9jb2RlPmA7XG5cdFx0XHRcdGlmIChkYXRhLmZpbGUgIT09IGRhdGEuZGIpIHtcblx0XHRcdFx0XHRib2R5ID0gYDxzdHJvbmc+PGkgY2xhc3M9XCJmYWwgZmEtdGltZXNcIi8+IENIRUNLU1VNIE1JU01BVENIPC9zdHJvbmc+PGJyLz48YnIvPlxuXHRcdFx0XHRcdDxzdHJvbmc+REIgY2hlY2tzdW06PC9zdHJvbmc+IDxjb2RlPiR7ZGF0YS5kYn08L2NvZGU+PGJyLz5cblx0XHRcdFx0XHQ8c3Ryb25nPkZpbGUgY2hlY2tzdW06PC9zdHJvbmc+IDxjb2RlPiR7ZGF0YS5maWxlfTwvY29kZT48YnIvPjxici8+XG5cdFx0XHRcdFx0PGlucHV0IHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ1dHRvblwiIHZhbHVlPVwiRml4IERCIENoZWNrc3VtXCIvPmA7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgbW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHRcdFx0d2FybmluZzogZGF0YS5maWxlICE9PSBkYXRhLmRiLFxuXHRcdFx0XHRcdHRpdGxlOiBcIkNoZWNrc3VtIFZhbGlkYXRpb25cIixcblx0XHRcdFx0XHRoaWRlQnV0dG9uczogW1wiY2FuY2VsXCJdLFxuXHRcdFx0XHRcdGJvZHksXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdG1vZGFsLnNob3coKTtcblxuXHRcdFx0XHQkKFwiaW5wdXRbdHlwZT0nYnV0dG9uJ11cIiwgbW9kYWwuZWwpLm9uKFwiY2xpY2tcIiwgKCkgPT4ge1xuXHRcdFx0XHRcdCQuYWpheCh7XG5cdFx0XHRcdFx0XHR1cmw6IGAke3NldHRpbmdzLnVybFJvb3R9L2FwaS8xLjAvZXB1YnMvJHttb2RlbC5nZXQoXCJfaWRcIil9L3ZhbGlkYXRlQ2hlY2tzdW1gLFxuXHRcdFx0XHRcdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRcdFx0XHRcdGRhdGE6IHsgY2hlY2tzdW06IGRhdGEuZmlsZSB9LFxuXHRcdFx0XHRcdFx0c3VjY2VzczogKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRtb2RhbC5kZXN0cm95KCk7XG5cblx0XHRcdFx0XHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7IGNvbnRlbnQ6IFwiQ2hlY2tzdW0gdXBkYXRlZFwiIH0pO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGVycm9yOiAobSwgeGhyKSA9PiB7XG5cdFx0XHRcdFx0XHRcdG1vZGFsLnNob3dFcnJvcihBcHAucGFyc2VSZXNwb25zZSh4aHIpLmRldGFpbCk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRlcnJvcjogKCkgPT4ge1xuXHRcdFx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuVG9hc3QsIHsgY29udGVudDogXCJUaGVyZSB3YXMgYSBwcm9ibGVtIGxvYWRpbmcgdGhlIGNoZWNrc3VtIGRhdGEgKHRoZSBib29rIG1pZ2h0IG5vdCBleGlzdClcIiwgaWNvbjogXCJmYS10aW1lc1wiIH0pO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fSxcbn0pOyJdfQ==",
    "\"use strict\";\n\nvar _regenerator = require(\"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _tippy = require(\"tippy.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\nvar Backbone = require(\"backbone\");\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar JSZip = require(\"jszip\");\nvar settings = require(\"app-settings\");\nvar NProgress = require(\"nprogress\");\nvar moment = require(\"moment\");\nvar Promise = require(\"bluebird\");\nvar tippy = require(\"tippy.js\").default;\n\n\n// eslint-disable-next-line node/no-extraneous-require\nvar Papa = require(\"papaparse\");\nvar pikaday = require(\"pikaday\");\nvar raygun = require(\"raygun\");\n\nvar rester = require(\"rester\");\n\nvar App = require(\"../../index\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar ImageChooser = require(\"../../lib/imageChooser\");\nvar Accordion = require(\"../../lib/accordion\");\nvar SmallModal = require(\"../../lib/smallModal\");\nvar Selectra = require(\"../../lib/selectra\");\n\nvar bookWarning = \"<p>There are unprocessed books left in the queue, or in the review area. If you leave the page, they will be abandoned.</p><p>Are you sure you want to leave this page?</p>\";\n\nvar Page = Backbone.Radio.channel(\"book-upload\");\nPage = _.extend(Page, { Models: {}, Views: {}, Collections: {}, Mixins: {} });\n\nPage.Events = {\n\tBookAdded: \"Page.BookAdded\",\n\tBookParsed: \"Page.BookParsed\",\n\tUploaded: \"Page.Uploaded\",\n\tUploadDone: \"Page.UploadDone\",\n\tCSVAdded: \"Page.CSVAdded\",\n\tCSVProcessed: \"Page.CSVProcessed\",\n\n\tStartUpload: \"Page.StartUpload\"\n};\n\nvar BookStates = {\n\tNew: \"new\",\n\tReviewing: \"reviewing\",\n\tQueued: \"queued\",\n\tComplete: \"complete\"\n};\n\nPage.Models.Group = Backbone.Model.extend({\n\tdefaults: {},\n\tidAttribute: \"code\"\n});\n\nPage.Models.ExistingBook = Backbone.Model.extend({\n\tdefaults: {},\n\tidAttribute: \"_id\"\n});\n\nPage.Collections.Groups = Backbone.Collection.extend({\n\tmodel: Page.Models.Group\n});\n\nPage.Collections.ExistingBooks = Backbone.Collection.extend({\n\tmodel: Page.Models.ExistingBook\n});\n\nPage.Models.Book = Backbone.Model.extend({\n\tdefaults: {},\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/epubs\";\n\t},\n\n\tinitialize: function initialize(attrs, options) {\n\t\tthis.options = options;\n\n\t\tvar filePieces = options.file.name.match(/(.+)\\.(.+?)$/);\n\n\t\tthis.set({ parsing: false, parsed: false, filename: filePieces[1], type: filePieces[2].toLowerCase() });\n\t},\n\n\tutf8encode: function utf8encode(s) {\n\t\treturn unescape(encodeURIComponent(s));\n\t},\n\n\tutf8decode: function utf8decode(s) {\n\t\treturn decodeURIComponent(escape(s));\n\t},\n\n\tupload: function upload(options) {\n\t\tvar fields = this.pick(\"type\", \"filename\", \"groups\", \"activationDate\", \"purchaseOverride\", \"replaceExisting\", \"allowPrint\");\n\n\t\treturn this.binarySave(null, _.extend({ wait: true, data: fields }, options));\n\t},\n\n\tvalidate: function validate(attrs) {\n\t\tvar ret = {};\n\n\t\tif (!attrs.metadata) ret.publisher = \"Invalid metadata\";else if (!attrs.metadata.publisher) ret.publisher = \"No valid publisher chosen\";\n\n\t\t//else {\n\t\t//\tconst pub = _.find(settings.publisherList, val => val.shortname == attrs.metadata.publisher || (val.fullname && val.fullname == attrs.metadata.publisher));\n\t\t//\tif(!pub)\n\t\t//\t\tret.publisher = \"This publisher does not exist in the system\";\n\t\t//}\n\n\t\tif (_.keys(ret).length > 0) return ret;\n\t},\n\n\tprocessBook: function processBook() {\n\t\tif (this.get(\"parsed\")) return this.trigger(Page.Events.BookParsed, this);\n\t\tif (this.get(\"parsing\")) return;\n\n\t\tswitch (this.get(\"type\")) {\n\t\t\tcase \"mpub\":\n\t\t\t\treturn this.parseMpub(this.options.file);\n\t\t\tcase \"mpdf\":\n\t\t\t\treturn this.parseMpdf(this.options.file);\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"Unknown file type\");\n\t\t}\n\t},\n\n\tparseMpub: function parseMpub(file) {\n\t\tvar _this = this;\n\n\t\tthis.set({ parsing: true });\n\n\t\tthis.readZip(file).then(this.checkMpub.bind(this)).then(this.checkBook.bind(this)).then(this.attemptCSV.bind(this)).then(function () {\n\t\t\t_this.set({ parsed: true, parsing: false, \"cover-format\": \"image/png\" });\n\t\t\tdelete _this.zip;\n\t\t\t_this.trigger(Page.Events.BookParsed, _this);\n\t\t\treturn;\n\t\t}).catch(function (err) {\n\t\t\tif (!settings.debug || settings.reportErrors) raygun(\"send\", err);\n\t\t\tdelete _this.zip;\n\t\t\t_this.set({ error: err, parsed: true, parsing: false });\n\t\t\t_this.trigger(Page.Events.BookParsed, _this);\n\t\t});\n\t},\n\n\treadZip: function readZip(file) {\n\t\tvar _this2 = this;\n\n\t\tvar reader = new FileReader();\n\n\t\tthis.setFile(\"book\", file);\n\n\t\tvar p = new Promise(function (resolve, reject) {\n\t\t\treader.onloadend = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee() {\n\t\t\t\treturn _regenerator2.default.wrap(function _callee$(_context) {\n\t\t\t\t\twhile (1) {\n\t\t\t\t\t\tswitch (_context.prev = _context.next) {\n\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\t_context.prev = 0;\n\n\t\t\t\t\t\t\t\t_this2.filename = file.name;\n\t\t\t\t\t\t\t\t_context.next = 4;\n\t\t\t\t\t\t\t\treturn JSZip.loadAsync(reader.result);\n\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\t_this2.zip = _context.sent;\n\n\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t\t_context.next = 11;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 8:\n\t\t\t\t\t\t\t\t_context.prev = 8;\n\t\t\t\t\t\t\t\t_context.t0 = _context[\"catch\"](0);\n\n\t\t\t\t\t\t\t\treject(_context.t0);\n\n\t\t\t\t\t\t\tcase 11:\n\t\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\t\treturn _context.stop();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, _callee, _this2, [[0, 8]]);\n\t\t\t}));\n\t\t\treader.addEventListener(\"error\", reject);\n\t\t});\n\n\t\treader.readAsArrayBuffer(file);\n\t\treturn p;\n\t},\n\n\tcheckMpub: function () {\n\t\tvar _ref2 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee2() {\n\t\t\tvar zip, coverData, mpubData, metadata, files, required;\n\t\t\treturn _regenerator2.default.wrap(function _callee2$(_context2) {\n\t\t\t\twhile (1) {\n\t\t\t\t\tswitch (_context2.prev = _context2.next) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tzip = this.zip;\n\t\t\t\t\t\t\t_context2.next = 3;\n\t\t\t\t\t\t\treturn zip.file(\"cover.png\").async(\"uint8array\");\n\n\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\tcoverData = _context2.sent;\n\n\t\t\t\t\t\t\tthis.set(\"cover\", this.base64ArrayBuffer(coverData.subarray(1)));\n\n\t\t\t\t\t\t\t_context2.next = 7;\n\t\t\t\t\t\t\treturn zip.file(\"mpub.json\").async(\"string\");\n\n\t\t\t\t\t\tcase 7:\n\t\t\t\t\t\t\tmpubData = _context2.sent;\n\t\t\t\t\t\t\tmetadata = JSON.parse(mpubData.slice(1).replace(/[\\u0000-\\u001F]/g, \" \"));\n\n\n\t\t\t\t\t\t\tmetadata.grade = _.map(metadata.grade, function (y) {\n\t\t\t\t\t\t\t\tif (/^\\d{1,2}$/.test(y.toString())) return \"G\" + y;\n\t\t\t\t\t\t\t\treturn y;\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tthis.set(\"metadata\", metadata);\n\n\t\t\t\t\t\t\tfiles = zip.files;\n\t\t\t\t\t\t\trequired = [\"cover.png\", \"mpub.json\", \"encrypted.key\", \"publisher.pem\"];\n\n\t\t\t\t\t\t\tif (!_.some(required, function (item) {\n\t\t\t\t\t\t\t\treturn !(item in files);\n\t\t\t\t\t\t\t})) {\n\t\t\t\t\t\t\t\t_context2.next = 15;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthrow new Error(\"One or more required files are missing from this MPUB\");\n\n\t\t\t\t\t\tcase 15:\n\t\t\t\t\t\t\treturn _context2.abrupt(\"return\", Promise.resolve());\n\n\t\t\t\t\t\tcase 16:\n\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\treturn _context2.stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, _callee2, this);\n\t\t}));\n\n\t\tfunction checkMpub() {\n\t\t\treturn _ref2.apply(this, arguments);\n\t\t}\n\n\t\treturn checkMpub;\n\t}(),\n\n\t//___________________________________________________________\n\n\n\tparseMpdf: function parseMpdf(file) {\n\t\tvar _this3 = this;\n\n\t\tthis.set({ parsing: true, metadata: { filename: this.get(\"filename\") } });\n\n\t\tthis.readPdf(file).then(this.checkMpdf.bind(this)).then(this.checkBook.bind(this)).then(this.attemptCSV.bind(this)).then(function () {\n\t\t\t_this3.set({ parsed: true, parsing: false, \"cover-format\": \"image/png\" });\n\t\t\t_this3.trigger(Page.Events.BookParsed, _this3);\n\t\t\treturn;\n\t\t}).catch(function (err) {\n\t\t\tif (!settings.debug || settings.reportErrors) raygun(\"send\", err);\n\t\t\t_this3.set({ error: err, parsed: true, parsing: false });\n\t\t\t_this3.trigger(Page.Events.BookParsed, _this3);\n\t\t});\n\t},\n\n\treadPdf: function readPdf(file) {\n\t\tvar _this4 = this;\n\n\t\tvar reader = new FileReader();\n\n\t\tthis.setFile(\"book\", file);\n\n\t\tvar p = new Promise(function (resolve, reject) {\n\t\t\treader.onloadend = function () {\n\t\t\t\t_this4.filename = file.name;\n\t\t\t\tresolve(reader.result);\n\t\t\t};\n\t\t\treader.addEventListener(\"error\", reject);\n\t\t});\n\n\t\treader.readAsArrayBuffer(file);\n\t\treturn p;\n\t},\n\n\tcheckMpdf: function checkMpdf(pdf) {\n\t\t// Read the last 256 bytes of footer.\n\t\tvar footer = new DataView(pdf.slice(-256));\n\n\t\tvar offset = 4;\n\n\t\tvar pairCount = footer.getUint32(offset);\n\n\t\tvar pairs = [];\n\t\tfor (var i = 0; i < pairCount; i++) {\n\t\t\toffset += 4;\n\t\t\tpairs.push(footer.getUint32(offset));\n\t\t\toffset += 4;\n\t\t\tpairs.push(footer.getUint32(offset));\n\t\t}\n\n\t\tvar mdata = new Uint8Array(pdf.slice(pairs[4], pairs[4] + pairs[5]));\n\n\t\tvar metadata = JSON.parse(this.decodeUtf8(mdata));\n\t\tmetadata.grade = _.map(metadata.grade, function (y) {\n\t\t\tif (/^\\d{1,2}$/.test(y.toString())) return \"G\" + y;\n\t\t\treturn y;\n\t\t});\n\n\t\tthis.set(\"metadata\", metadata);\n\t\tthis.set(\"cover\", this.base64ArrayBuffer(new Uint8Array(pdf.slice(pairs[6], pairs[6] + pairs[7]))));\n\t},\n\n\tcheckBook: function () {\n\t\tvar _ref3 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee3() {\n\t\t\tvar mdata, _ref4, _ref5, exist, err, user, pub, _err;\n\n\t\t\treturn _regenerator2.default.wrap(function _callee3$(_context3) {\n\t\t\t\twhile (1) {\n\t\t\t\t\tswitch (_context3.prev = _context3.next) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tmdata = this.get(\"metadata\");\n\n\t\t\t\t\t\t\tif (!(!_.includes(settings.schoolRegions, \"ALL\") && !mdata.regions)) {\n\t\t\t\t\t\t\t\t_context3.next = 3;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthrow new Error(\"You cannot upload books that do not have a region\");\n\n\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\tif (!(!_.includes(settings.schoolRegions, \"ALL\") && _.intersection(mdata.regions, settings.schoolRegions).length === 0 && !_.includes(mdata.regions, \"ALL\"))) {\n\t\t\t\t\t\t\t\t_context3.next = 5;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthrow new Error(\"The regions for this book are invalid for this server\");\n\n\t\t\t\t\t\tcase 5:\n\t\t\t\t\t\t\t_context3.prev = 5;\n\t\t\t\t\t\t\t_context3.next = 8;\n\t\t\t\t\t\t\treturn Promise.resolve($.get(settings.urlRoot + \"/api/1.0/epubs?id=\" + mdata.bookID));\n\n\t\t\t\t\t\tcase 8:\n\t\t\t\t\t\t\t_ref4 = _context3.sent;\n\t\t\t\t\t\t\t_ref5 = _slicedToArray(_ref4, 1);\n\t\t\t\t\t\t\texist = _ref5[0];\n\n\t\t\t\t\t\t\tif (!(exist && exist.metadata.version === mdata.version)) {\n\t\t\t\t\t\t\t\t_context3.next = 13;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthrow new Error(\"That exact book has already been uploaded.\");\n\n\t\t\t\t\t\tcase 13:\n\t\t\t\t\t\t\tif (!(exist && exist.metadata.version < mdata.version)) {\n\t\t\t\t\t\t\t\t_context3.next = 18;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// This means a newer minor version. Tell the server to replace the existing book.\n\t\t\t\t\t\t\tthis.set(\"replaceExisting\", true);\n\t\t\t\t\t\t\tthis.set(\"_old\", exist);\n\t\t\t\t\t\t\t_context3.next = 20;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 18:\n\t\t\t\t\t\t\tif (!(exist && exist.metadata.version > mdata.version && Math.floor(exist.metadata.version) === Math.floor(mdata.version))) {\n\t\t\t\t\t\t\t\t_context3.next = 20;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthrow new Error(\"A newer minor version of that book has already been uploaded.\");\n\n\t\t\t\t\t\tcase 20:\n\t\t\t\t\t\t\t_context3.next = 26;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 22:\n\t\t\t\t\t\t\t_context3.prev = 22;\n\t\t\t\t\t\t\t_context3.t0 = _context3[\"catch\"](5);\n\t\t\t\t\t\t\terr = _context3.t0.responseJSON ? _context3.t0.responseJSON.detail || _context3.t0.responseJSON.info : _context3.t0.message;\n\t\t\t\t\t\t\treturn _context3.abrupt(\"return\", Promise.reject(new Error(\"Error during duplicate verification: <br>\" + err)));\n\n\t\t\t\t\t\tcase 26:\n\t\t\t\t\t\t\tif (!(!mdata.format || mdata.format < 4 || mdata.version === 0)) {\n\t\t\t\t\t\t\t\t_context3.next = 28;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthrow new Error(\"This server does not allow old-format books.\");\n\n\t\t\t\t\t\tcase 28:\n\t\t\t\t\t\t\tuser = radio.request(App.Events.Requests.CurrentUser);\n\t\t\t\t\t\t\t// Get the publisher for this value\n\n\t\t\t\t\t\t\tif (rester.hasAccess(rester.p.grants.all.publishers, user)) {\n\t\t\t\t\t\t\t\t_context3.next = 44;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_context3.prev = 30;\n\t\t\t\t\t\t\t_context3.next = 33;\n\t\t\t\t\t\t\treturn Promise.resolve($.get(settings.urlRoot + \"/api/1.0/data/publishers/\" + encodeURIComponent(mdata.publisher)));\n\n\t\t\t\t\t\tcase 33:\n\t\t\t\t\t\t\tpub = _context3.sent;\n\n\t\t\t\t\t\t\tif (pub) {\n\t\t\t\t\t\t\t\t_context3.next = 36;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn _context3.abrupt(\"return\", Promise.reject(new Error(\"Cannot upload that book; the publisher cannot be identified\")));\n\n\t\t\t\t\t\tcase 36:\n\t\t\t\t\t\t\tif (rester.matchGrantValues(rester.g.publishers, user, pub.publisher_id.toString())) {\n\t\t\t\t\t\t\t\t_context3.next = 38;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn _context3.abrupt(\"return\", Promise.reject(new Error(\"Cannot upload books for that publisher; it does not match your assigned publishers\")));\n\n\t\t\t\t\t\tcase 38:\n\t\t\t\t\t\t\t_context3.next = 44;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 40:\n\t\t\t\t\t\t\t_context3.prev = 40;\n\t\t\t\t\t\t\t_context3.t1 = _context3[\"catch\"](30);\n\t\t\t\t\t\t\t_err = _context3.t1.responseJSON ? _context3.t1.responseJSON.detail || _context3.t1.responseJSON.info : _context3.t1.message;\n\t\t\t\t\t\t\treturn _context3.abrupt(\"return\", Promise.reject(new Error(\"Error during publisher resolution: \" + _err)));\n\n\t\t\t\t\t\tcase 44:\n\t\t\t\t\t\t\treturn _context3.abrupt(\"return\", Promise.resolve());\n\n\t\t\t\t\t\tcase 45:\n\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\treturn _context3.stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, _callee3, this, [[5, 22], [30, 40]]);\n\t\t}));\n\n\t\tfunction checkBook() {\n\t\t\treturn _ref3.apply(this, arguments);\n\t\t}\n\n\t\treturn checkBook;\n\t}(),\n\n\tattemptCSV: function attemptCSV() {\n\t\tvar isbn = this.get(\"metadata\").isbn;\n\n\t\tif (!isbn) return;\n\n\t\tvar match = Page.csv.get(isbn);\n\n\t\tif (!match) return;\n\n\t\tif (match.get(\"activationDate\")) this.set(\"activationDate\", match.get(\"activationDate\"));\n\n\t\tif (match.get(\"assignAll\")) {\n\t\t\tthis.set(\"assignAll\", true);\n\t\t\tthis.set(\"groups\", []);\n\t\t} else if (match.get(\"groups\")) {\n\t\t\tthis.set(\"groups\", match.get(\"groups\").split(/[,;]/g));\n\t\t}\n\n\t\tif (settings.bookTokenMode && match.get(\"withoutPurchase\")) this.set(\"purchaseOverride\", true);\n\n\t\treturn Promise.resolve();\n\t},\n\n\tbase64ArrayBuffer: function base64ArrayBuffer(bytes) {\n\t\tvar base64 = \"\";\n\t\tvar encodings = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n\t\tvar byteLength = bytes.byteLength;\n\t\tvar byteRemainder = byteLength % 3;\n\t\tvar mainLength = byteLength - byteRemainder;\n\n\t\tvar a = void 0,\n\t\t    b = void 0,\n\t\t    c = void 0,\n\t\t    d = void 0;\n\t\tvar chunk = void 0;\n\n\t\t// Main loop deals with bytes in chunks of 3\n\t\tfor (var i = 0; i < mainLength; i = i + 3) {\n\t\t\t// Combine the three bytes into a single integer\n\t\t\tchunk = bytes[i] << 16 | bytes[i + 1] << 8 | bytes[i + 2];\n\n\t\t\t// Use bitmasks to extract 6-bit segments from the triplet\n\t\t\ta = (chunk & 16515072) >> 18; // 16515072 = (2^6 - 1) << 18\n\t\t\tb = (chunk & 258048) >> 12; // 258048 = (2^6 - 1) << 12\n\t\t\tc = (chunk & 4032) >> 6; // 4032 = (2^6 - 1) << 6\n\t\t\td = chunk & 63; // 63 = 2^6 - 1\n\n\t\t\t// Convert the raw binary segments to the appropriate ASCII encoding\n\t\t\tbase64 += encodings[a] + encodings[b] + encodings[c] + encodings[d];\n\t\t}\n\n\t\t// Deal with the remaining bytes and padding\n\t\tif (byteRemainder === 1) {\n\t\t\tchunk = bytes[mainLength];\n\n\t\t\ta = (chunk & 252) >> 2; // 252 = (2^6 - 1) << 2\n\n\t\t\t// Set the 4 least significant bits to zero\n\t\t\tb = (chunk & 3) << 4; // 3 = 2^2 - 1\n\n\t\t\tbase64 += encodings[a] + encodings[b] + \"==\";\n\t\t} else if (byteRemainder === 2) {\n\t\t\tchunk = bytes[mainLength] << 8 | bytes[mainLength + 1];\n\n\t\t\ta = (chunk & 64512) >> 10; // 64512 = (2^6 - 1) << 10\n\t\t\tb = (chunk & 1008) >> 4; // 1008 = (2^6 - 1) << 4\n\n\t\t\t// Set the 2 least significant bits to zero\n\t\t\tc = (chunk & 15) << 2; // 15 = 2^4 - 1\n\n\t\t\tbase64 += encodings[a] + encodings[b] + encodings[c] + \"=\";\n\t\t}\n\t\treturn base64;\n\t},\n\n\tdecodeUtf8: function decodeUtf8(arrayBuffer) {\n\t\tvar result = \"\";\n\t\tvar i = 0;\n\t\tvar c = 0;\n\t\tvar c3 = 0;\n\t\tvar c2 = 0;\n\n\t\tvar data = new Uint8Array(arrayBuffer);\n\n\t\t// If we have a BOM skip it\n\t\tif (data.length >= 3 && data[0] === 0xEF && data[1] === 0xBB && data[2] === 0xBF) i = 3;\n\n\t\twhile (i < data.length) {\n\t\t\tc = data[i];\n\n\t\t\tif (c < 128) {\n\t\t\t\tresult += String.fromCharCode(c);\n\t\t\t\ti++;\n\t\t\t} else if (c > 191 && c < 224) {\n\t\t\t\tif (i + 1 >= data.length) throw new Error(\"UTF-8 Decode failed. Two byte character was truncated.\");\n\n\t\t\t\tc2 = data[i + 1];\n\t\t\t\tresult += String.fromCharCode((c & 31) << 6 | c2 & 63);\n\t\t\t\ti += 2;\n\t\t\t} else {\n\t\t\t\tif (i + 2 >= data.length) throw new Error(\"UTF-8 Decode failed. Multi byte character was truncated.\");\n\n\t\t\t\tc2 = data[i + 1];\n\t\t\t\tc3 = data[i + 2];\n\t\t\t\tresult += String.fromCharCode((c & 15) << 12 | (c2 & 63) << 6 | c3 & 63);\n\t\t\t\ti += 3;\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n});\n\nPage.Collections.Books = Backbone.Collection.extend({\n\tmodel: Page.Models.Book\n});\n\nPage.Collections.Backlog = Backbone.VirtualCollection.extend({\n\tprocessing: false,\n\n\tinitialize: function initialize() {\n\t\tthis.ticker = setInterval(this.process.bind(this), 4000);\n\t},\n\n\tprocess: function process() {\n\t\tif (this.processing) return;\n\n\t\tvar found = _.find(this.models, function (item) {\n\t\t\treturn item.get(\"state\") === BookStates.New && !item.get(\"parsed\") && !item.get(\"parsing\");\n\t\t});\n\t\tif (!found) return;\n\n\t\tthis.processing = true;\n\t\tthis.listenTo(found, Page.Events.BookParsed, this.parseDone.bind(this));\n\n\t\tfound.processBook();\n\t},\n\n\tparseDone: function parseDone(model) {\n\t\tthis.stopListening(model, Page.Events.BookParsed);\n\t\tthis.processing = false;\n\t},\n\n\tstop: function stop() {\n\t\tclearInterval(this.ticker);\n\t}\n});\n\nPage.Collections.Queue = Backbone.VirtualCollection.extend({\n\tprocessing: false,\n\n\tinitialize: function initialize() {\n\t\tthis.ticker = setInterval(this.process.bind(this), 4000);\n\t},\n\n\tprocess: function process() {\n\t\tif (this.processing) return;\n\n\t\tvar found = _.find(this.models, function (item) {\n\t\t\treturn item.get(\"state\") === BookStates.Queued && !item.has(\"uploadError\");\n\t\t});\n\t\tif (!found) return;\n\n\t\tthis.processing = true;\n\t\tthis.listenTo(found, Page.Events.UploadDone, this.uploadDone.bind(this));\n\n\t\t// Delay this by a second or so to give the UI time to settle down\n\t\tsetTimeout(function () {\n\t\t\tfound.trigger(Page.Events.StartUpload);\n\t\t}, 1000);\n\t},\n\n\tuploadDone: function uploadDone(model) {\n\t\tthis.stopListening(model, Page.Events.UploadDone);\n\n\t\tthis.processing = false;\n\t},\n\n\tstop: function stop() {\n\t\tclearInterval(this.ticker);\n\t}\n});\n\nPage.Collections.CSV = Backbone.Collection.extend({\n\tmodel: Backbone.Model.extend({\n\t\tdefaults: {},\n\t\tidAttribute: \"isbn\"\n\t})\n});\n\nPage.Mixins.BookDragger = {\n\tnoop: function noop(evt) {\n\t\tevt.preventDefault();\n\t\tevt.stopPropagation();\n\t},\n\n\tfileChosen: function fileChosen(evt) {\n\t\tvar _this5 = this;\n\n\t\tvar list = [],\n\t\t    failed = [];\n\n\t\t_.each(evt.currentTarget.files, function (item) {\n\t\t\tif (_this5.filterFiles(item)) list.push(item);else failed.push(item);\n\t\t});\n\n\t\tvar csv = _.filter(list, function (x) {\n\t\t\treturn _.last(x.name.split(\".\")).toLowerCase() === \"csv\";\n\t\t});\n\t\tvar rest = _.filter(list, function (x) {\n\t\t\treturn _.last(x.name.split(\".\")).toLowerCase() !== \"csv\";\n\t\t});\n\n\t\t// Process CSVs first\n\t\t_.each(csv, this.appendChosenFile.bind(this));\n\t\t_.each(rest, this.appendChosenFile.bind(this));\n\n\t\tif (failed.length === 1 && !list.length) radio.trigger(App.Events.Commands.Toast, { content: \"Books must be in MPUB or MPDF format\", icon: \"fa-times\", iconColour: \"red\" });else if (failed.length === 1) radio.trigger(App.Events.Commands.Toast, { content: \"Some books were not in MPUB or MPDF format\", icon: \"fa-times\", iconColour: \"red\" });\n\t},\n\n\tfileDropped: function fileDropped(evt) {\n\t\tvar _this6 = this;\n\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\n\t\tvar list = [],\n\t\t    failed = [];\n\n\t\t_.each(evt.originalEvent.dataTransfer.files, function (item) {\n\t\t\tif (_this6.filterFiles(item)) list.push(item);else failed.push(item);\n\t\t});\n\n\t\tvar csv = _.filter(list, function (x) {\n\t\t\treturn _.last(x.name.split(\".\")).toLowerCase() === \"csv\";\n\t\t});\n\t\tvar rest = _.filter(list, function (x) {\n\t\t\treturn _.last(x.name.split(\".\")).toLowerCase() !== \"csv\";\n\t\t});\n\n\t\t// Process CSVs first\n\t\t_.each(csv, this.appendChosenFile.bind(this));\n\t\t_.each(rest, this.appendChosenFile.bind(this));\n\n\t\tif (failed.length === 1 && !list.length) radio.trigger(App.Events.Commands.Toast, { content: \"Books must be in MPUB or MPDF format\", icon: \"fa-times\", iconColour: \"red\" });else if (failed.length === 1) radio.trigger(App.Events.Commands.Toast, { content: \"Some books were not in MPUB or MPDF format\", icon: \"fa-times\", iconColour: \"red\" });\n\t},\n\n\tchooseFiles: function chooseFiles(evt) {\n\t\tevt.stopPropagation();\n\t\tthis.ui.fileInput.get(0).click();\n\t},\n\n\tappendChosenFile: function appendChosenFile(book) {\n\t\tif (_.last(book.name.split(\".\")).toLowerCase() === \"csv\") Page.trigger(Page.Events.CSVAdded, book);else Page.trigger(Page.Events.BookAdded, book);\n\t},\n\n\tfilterFiles: function filterFiles(file) {\n\t\treturn _.includes([\"mpub\", \"csv\", \"mpdf\"], _.last(file.name.split(\".\")).toLowerCase());\n\t}\n};\n\n//___________________________________________________\n\n\nPage.Views.Layout = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"content book-content\",\n\n\ttemplate: require(\"../templates/bookupload.nunj\").main,\n\n\tregions: {\n\t\tleft: \"#bookupload-support\",\n\t\tcentre: \"#bookupload-main\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.collection = new Page.Collections.Books();\n\n\t\tthis.listenTo(Page, Page.Events.BookAdded, this.bookAdded.bind(this));\n\t\tthis.listenTo(Page, Page.Events.CSVAdded, this.csvAdded.bind(this));\n\n\t\t// Keep the session alive, because this page will be used a lot\n\t\tthis.startPing();\n\t},\n\n\tonRender: function onRender() {\n\t\tvar backlogFilter = function backlogFilter(item) {\n\t\t\treturn item.get(\"state\") === BookStates.New || item.get(\"state\") === BookStates.Reviewing;\n\t\t};\n\n\t\tvar queueFilter = function queueFilter(item) {\n\t\t\treturn item.get(\"state\") === BookStates.Queued;\n\t\t};\n\n\t\tvar doneFilter = function doneFilter(item) {\n\t\t\treturn item.get(\"state\") === BookStates.Complete;\n\t\t};\n\n\t\tvar reviewFilter = function reviewFilter(item) {\n\t\t\treturn item.get(\"state\") === BookStates.Reviewing;\n\t\t};\n\n\t\tthis.showChildView(\"left\", new Page.Views.Backlog({\n\t\t\tbacklog: new Page.Collections.Backlog(this.collection, { filter: backlogFilter }),\n\t\t\treview: new Page.Collections.Queue(this.collection, { filter: reviewFilter }),\n\t\t\tqueue: new Page.Collections.Queue(this.collection, { filter: queueFilter }),\n\t\t\tdone: new Page.Collections.Queue(this.collection, { filter: doneFilter })\n\t\t}));\n\n\t\tthis.showChildView(\"centre\", new Page.Views.Editor({ collection: this.collection }));\n\t},\n\n\tonDestroy: function onDestroy() {\n\t\tthis.stopPing();\n\t},\n\n\tbookAdded: function bookAdded(book) {\n\t\tvar model = new Page.Models.Book({ state: BookStates.New }, { file: book });\n\t\tthis.collection.add(model);\n\t},\n\n\tcsvAdded: function csvAdded(file) {\n\t\tvar count = 0;\n\n\t\tPapa.parse(file, {\n\t\t\tencoding: \"iso-8859-1\",\n\t\t\tskipEmptyLines: true,\n\t\t\tstep: function step(r) {\n\t\t\t\tif (!r) return;\n\t\t\t\tvar row = r.data[0];\n\t\t\t\tif (row[0].toLowerCase() === \"isbn\") return;\n\n\t\t\t\tPage.csv.add({\n\t\t\t\t\tisbn: row[0],\n\t\t\t\t\tactivationDate: moment(row[1], \"DD/MM/YYYY\").unix() || 0,\n\t\t\t\t\twithoutPurchase: Boolean(row[2]),\n\t\t\t\t\tassignAll: _.toLower(row[3]) === \"all\" || _.toLower(row[3]) === \"yes\",\n\t\t\t\t\tgroups: _.toLower(row[3]) !== \"all\" && _.toLower(row[3]) !== \"yes\" ? row[3] : \"\"\n\t\t\t\t});\n\t\t\t\tcount++;\n\t\t\t},\n\t\t\tcomplete: function complete() {\n\t\t\t\tradio.trigger(App.Events.Commands.Toast, { content: \"CSV import finished (\" + count + \"  rows found)\" });\n\t\t\t\tPage.trigger(Page.Events.CSVProcessed, { length: Page.csv.length });\n\t\t\t}\n\t\t});\n\t},\n\n\tstartPing: function startPing() {\n\t\tthis.pingTimer = setInterval(function () {\n\t\t\t$.get(settings.urlRoot + \"/version\");\n\t\t}, 1000 * 60 * 30);\n\t},\n\n\tstopPing: function stopPing() {\n\t\tclearInterval(this.pingTimer);\n\t}\n});\n\nPage.Views.Backlog = Backbone.Marionette.View.extend({\n\tclassName: \"book-upload-accordion\",\n\n\ttemplate: require(\"../templates/bookupload.nunj\").backlog,\n\n\tregions: {\n\t\tuploader: \".book-upload-drop-small\",\n\t\tlist: \".book-upload-backlog-list\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.backlogColl = options.backlog;\n\t\tthis.queueColl = options.queue;\n\t\tthis.doneColl = options.done;\n\t\tthis.reviewColl = options.review;\n\n\t\tthis.listenTo(this.backlogColl, \"add\", this.colChange.bind(this));\n\t\tthis.listenTo(this.reviewColl, \"add\", this.colChange.bind(this));\n\t\tthis.listenTo(this.queueColl, \"add\", this.colChange.bind(this));\n\n\t\tthis.listenTo(this.backlogColl, \"remove\", this.colChange.bind(this));\n\t\tthis.listenTo(this.reviewColl, \"remove\", this.colChange.bind(this));\n\t\tthis.listenTo(this.queueColl, \"remove\", this.colChange.bind(this));\n\t},\n\n\tcolChange: function colChange() {\n\t\tvar count = this.queueColl.length + this.reviewColl.length + this.backlogColl.length;\n\n\t\tif (count === 0) radio.trigger(App.Events.Commands.NavigationPrompt, null);else radio.trigger(App.Events.Commands.NavigationPrompt, bookWarning);\n\t},\n\n\tonRender: function onRender() {\n\t\t// Create models to represent the sections\n\t\tvar review = new Accordion.Section({ title: \"Awaiting Review\", icon: \"fa-edit\", items: this.backlogColl, itemView: Page.Views.BacklogItem });\n\t\tvar queue = new Accordion.Section({ title: \"Uploading\", icon: \"fa-arrow-circle-up\", items: this.queueColl, itemView: Page.Views.QueueItem });\n\t\tvar done = new Accordion.Section({ title: \"Complete\", icon: \"fa-check-circle\", items: this.doneColl, itemView: Page.Views.DoneItem });\n\n\t\tvar col = new Backbone.Collection([review, queue, done]);\n\n\t\tthis.showChildView(\"uploader\", new Page.Views.BacklogUploader());\n\t\tthis.showChildView(\"list\", new Accordion({ collection: col, parent: this.$el.parent(), parentAdjust: 80 }));\n\t},\n\n\tonDestroy: function onDestroy() {\n\t\tthis.backlogColl.stop();\n\t\tthis.queueColl.stop();\n\t}\n});\n\nPage.Views.BacklogUploader = Backbone.Marionette.View.extend({\n\ttemplate: require(\"../templates/bookupload.nunj\").backlogAdd,\n\n\tui: {\n\t\tfileInput: \".upload-input\",\n\t\tcsvCount: \"span.csvCounter\"\n\t},\n\n\tevents: {\n\t\tdragenter: \"noop\",\n\t\tdragover: \"noop\",\n\t\t\"click button\": \"chooseFiles\",\n\t\t\"click @ui.fileInput\": \"chooseFiles\",\n\t\t\"change input.upload-input\": \"fileChosen\",\n\t\t\"drop button\": \"fileDropped\"\n\t},\n\n\tinitialize: function initialize() {\n\t\t_.extend(this, Page.Mixins.BookDragger);\n\n\t\tthis.delegateEvents();\n\n\t\tthis.listenTo(Page, Page.Events.CSVProcessed, this.setCsvTotal.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\ttippy($(\"button\", this.$el).get(0), {\n\t\t\ttheme: \"black\",\n\t\t\tanimation: \"fade\",\n\t\t\tplacement: \"right\",\n\t\t\tarrow: true,\n\t\t\tcontent: \"Upload some books, or a CSV of metadata\"\n\t\t});\n\t},\n\n\tsetCsvTotal: function setCsvTotal(opts) {\n\t\tthis.ui.csvCount.text(\"Total CSV rows: \" + opts.length);\n\t}\n});\n\nPage.Views.BacklogItem = Backbone.Marionette.View.extend({\n\tclassName: \"book-backlog-item\",\n\n\ttemplate: require(\"../templates/bookupload.nunj\").backlogItem,\n\n\tmodelEvents: {\n\t\t\"change:parsing change:error\": \"checkState\",\n\t\t\"change:state\": \"changeState\"\n\t},\n\n\tevents: {\n\t\t\"click button\": \"skip\",\n\t\tclick: \"clicked\"\n\t},\n\n\tui: {\n\t\tspinner: \"span.spinner-icon\",\n\t\tvalid: \"span.valid\",\n\t\tinvalid: \"span.invalid\",\n\t\toverride: \"span.override\",\n\t\tname: \"div.item-name\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tif (options.clickable) this.$el.addClass(\"accordion-clickable\");\n\t},\n\n\tchangeState: function changeState() {\n\t\tif (this.model.get(\"state\") === BookStates.Reviewing) this.ui.name.addClass(\"bold\");else this.ui.name.removeClass(\"bold\");\n\t},\n\n\tcheckState: _.debounce(function () {\n\t\tvar _this7 = this;\n\n\t\t/* eslint-disable no-invalid-this */\n\t\tif (!this.model || !this.ui.invalid.addClass) return;\n\n\t\tif (this.model.get(\"parsing\")) {\n\t\t\tthis.ui.spinner.removeClass(\"hide\");\n\t\t} else {\n\t\t\tthis.ui.invalid.addClass(\"hide\");\n\t\t\tthis.ui.spinner.addClass(\"hide\");\n\n\t\t\tif (this.model.get(\"error\") && !this.model.get(\"overrideError\")) {\n\t\t\t\tthis.ui.invalid.removeClass(\"hide\");\n\n\t\t\t\tvar content = \"<div>This book has an error and cannot be uploaded:</div><br/><div>\" + this.model.get(\"error\").message + \"</div><br/>\";\n\t\t\t\tcontent += \"<button class='tiny alert button'>Skip Book</button>\";\n\n\t\t\t\ttippy($(\"span.invalid\", this.el).get(0), {\n\t\t\t\t\ttheme: \"light\",\n\t\t\t\t\tanimation: \"fade\",\n\t\t\t\t\tplacement: \"left\",\n\t\t\t\t\tarrow: true,\n\t\t\t\t\tinteractive: true,\n\t\t\t\t\tcontent: content,\n\t\t\t\t\tonShown: function onShown() {\n\t\t\t\t\t\t$(\"button.tiny.alert.button\").on(\"click\", function () {\n\t\t\t\t\t\t\t(0, _tippy.hideAll)();\n\t\t\t\t\t\t\t_this7.skip();\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t$(\"button.success\").on(\"click\", function () {\n\t\t\t\t\t\t\t(0, _tippy.hideAll)();\n\t\t\t\t\t\t\t_this7.override();\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else if (this.model.get(\"overrideError\")) {\n\t\t\t\tthis.ui.override.removeClass(\"hide\");\n\t\t\t} else {\n\t\t\t\tthis.ui.valid.removeClass(\"hide\");\n\t\t\t}\n\t\t\t/* eslint-enable no-invalid-this */\n\t\t}\n\t}, 10),\n\n\tskip: function skip() {\n\t\tif (this.model.collection) this.model.collection.remove(this.model);\n\t\tif (this.model.get(\"state\") === BookStates.Reviewing) this.model.trigger(\"removed\");\n\t},\n\n\toverride: function override() {\n\t\tthis.model.trigger(\"override\");\n\t},\n\n\tclicked: function clicked(evt) {\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\n\t\tif (!this.options.clickable || this.model.get(\"state\") === BookStates.Reviewing) return;\n\n\t\tthis.model.trigger(\"clicked\", this.model);\n\t}\n});\n\nPage.Views.QueueItem = Backbone.Marionette.View.extend({\n\ttemplate: require(\"../templates/bookupload.nunj\").queueItem,\n\n\tclassName: \"book-queue-item h-flex flex-vert-centre\",\n\n\tmodelEvents: {\n\t\t\"upload:progress\": \"uploadProgress\",\n\t\t\"Page.StartUpload\": \"startUpload\"\n\t},\n\n\tui: {\n\t\tspinner: \"span.spinner-icon\",\n\t\tvalid: \"span.valid\",\n\t\tinvalid: \"span.invalid\"\n\t},\n\n\tstartUpload: function startUpload() {\n\t\tthis.ui.spinner.removeClass(\"hide\");\n\n\t\tthis.xhr = this.model.upload({ timeout: 1000 * 60 * 30, success: this.uploadSuccess.bind(this), error: this.uploadError.bind(this) });\n\n\t\tNProgress.configure({ parent: this.$el.getPath(), showSpinner: false, trickle: false }).start(0.0);\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tif (this.xhr) this.xhr.abort();\n\n\t\tNProgress.set(100);\n\t},\n\n\tuploadSuccess: function uploadSuccess() {\n\t\tNProgress.set(100);\n\n\t\tthis.ui.spinner.addClass(\"hide\");\n\n\t\tthis.model.trigger(Page.Events.UploadDone);\n\n\t\tthis.model.set({ state: BookStates.Complete });\n\t},\n\n\tuploadError: function uploadError(model, xhr) {\n\t\tvar _this8 = this;\n\n\t\tNProgress.set(100);\n\n\t\tvar answer = App.parseResponse(xhr);\n\n\t\tthis.ui.spinner.addClass(\"hide\");\n\t\tthis.ui.invalid.removeClass(\"hide\");\n\n\t\tthis.model.set({ uploadError: \"Upload Error\" });\n\n\t\ttippy($(\"span.invalid\", this.el).get(0), {\n\t\t\tanimation: \"fade\",\n\t\t\tplacement: \"right\",\n\t\t\tarrow: true,\n\t\t\tinteractive: true,\n\t\t\tcontent: \"<div>There was an error while uploading this book:</div><br/><div>\" + (answer.detail || answer.info) + \"</div><br/>\\n\\t\\t\\t\\t<button class='tiny success button'>Try Again</button> <button class='tiny alert button'>Skip Book</button>\",\n\t\t\tonShown: function onShown() {\n\t\t\t\t$(\"button.tiny.alert\").on(\"click\", function () {\n\t\t\t\t\t(0, _tippy.hideAll)();\n\t\t\t\t\t_this8.model.trigger(\"destroy\", _this8.model);\n\t\t\t\t});\n\n\t\t\t\t$(\"button.tiny.success\").on(\"click\", function () {\n\t\t\t\t\t(0, _tippy.hideAll)();\n\t\t\t\t\t_this8.ui.invalid.addClass(\"hide\");\n\t\t\t\t\t_this8.model.unset(\"uploadError\");\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tthis.model.trigger(Page.Events.UploadDone);\n\t},\n\n\tuploadProgress: function uploadProgress(perc) {\n\t\tNProgress.set(perc / 100);\n\t}\n});\n\nPage.Views.DoneItem = Backbone.Marionette.View.extend({\n\tclassName: \"book-done-item\",\n\n\ttemplate: require(\"../templates/bookupload.nunj\").doneItem,\n\n\tmodelEvents: {\n\t\t\"change:parsing\": \"checkState\"\n\t},\n\n\tui: {\n\t\tspinner: \"span.spinner-icon\",\n\t\tvalid: \"span.valid\",\n\t\tinvalid: \"span.invalid\"\n\t},\n\n\tcheckState: function checkState() {\n\t\tif (this.model.get(\"parsing\")) {\n\t\t\tthis.ui.spinner.removeClass(\"hide\");\n\t\t} else {\n\t\t\tthis.ui.spinner.addClass(\"hide\");\n\t\t\tif (this.model.get(\"error\")) this.ui.invalid.removeClass(\"hide\");else this.ui.valid.removeClass(\"hide\");\n\t\t}\n\t}\n});\n\nPage.Views.Editor = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"book-upload-editor\",\n\tprocessing: false,\n\n\tui: {\n\t\tfileInput: \".upload-input\",\n\n\t\tnextButton: \"a.next-book\",\n\t\tskipButton: \"a.skip-book\",\n\t\tdeleteExisting: \"a.del-existing\",\n\t\tmessage: \"span.message\",\n\t\tworkingSpinner: \"span.spinner-working\",\n\n\t\tcover: \".book-cover-image\",\n\t\tpublisher: \".publisherText\",\n\t\tactivation: \"input[name='activation']\",\n\t\tactivationOverlay: \"div.input-overlay\",\n\t\tpurchaseOverride: \"input[name='purchaseOverride']\",\n\t\tassignAll: \"input[name='assignAll']\",\n\t\tgroups: \"select[name='groups']\",\n\t\tallowPrint: \"input[name='allowPrint']\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.nextButton\": \"nextBook\",\n\t\t\"click @ui.skipButton\": \"skipBook\",\n\t\t\"click @ui.deleteExisting\": \"deleteExisting\",\n\n\t\t\"click label @ui.activationOverlay\": \"clearBox\",\n\n\t\t\"dragenter .upload-drop-block\": \"noop\",\n\t\t\"dragover .upload-drop-block\": \"noop\",\n\n\t\t\"change input.upload-input\": \"fileChosen\",\n\t\t\"drop .upload-drop-block\": \"fileDropped\",\n\n\t\t\"change @ui.activation\": \"changeDate\",\n\t\t\"click @ui.assignAll\": \"assignAll\"\n\t},\n\n\tcollectionEvents: {\n\t\tadd: \"newModel\",\n\t\tclicked: \"jumpToModel\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this9 = this;\n\n\t\treturn {\n\t\t\thasGroups: function hasGroups() {\n\t\t\t\treturn !_this9.model.isNew() && _this9.model.get(\"groups\") !== null && _.isArray(_this9.model.get(\"groups\"));\n\t\t\t},\n\t\t\tprintOverride: function printOverride() {\n\t\t\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\t\t\treturn rester.hasAccess(rester.p.books.printOverride, user);\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize() {\n\t\t_.extend(this, Page.Mixins.BookDragger);\n\n\t\tPage.csv = new Page.Collections.CSV();\n\n\t\tthis.delegateEvents();\n\t},\n\n\tgetTemplate: function getTemplate() {\n\t\tif (this.model) return require(\"../templates/bookupload-editor.nunj\");\n\t\treturn require(\"../templates/bookupload.nunj\").noBooks;\n\t},\n\n\tnewModel: function newModel(model) {\n\t\tif (this.model || this.processing) return;\n\n\t\tthis.loadModel(model);\n\t},\n\n\tjumpToModel: function jumpToModel(model) {\n\t\t//if(this.model || this.processing)\n\t\t//\treturn;\n\n\t\tif (this.model) this.model.set({ state: BookStates.New });\n\n\t\tthis.loadModel(model);\n\t},\n\n\tcheckForNewModel: function checkForNewModel() {\n\t\tthis.processing = false;\n\t\tthis.ui.workingSpinner.addClass(\"hide\");\n\t\tthis.ui.nextButton.removeClass(\"disabled\");\n\n\t\t// Look for a new model to display\n\t\tvar models = _.find(this.collection.models, function (item) {\n\t\t\treturn item && item.get(\"state\") === BookStates.New;\n\t\t});\n\n\t\tif (models) {\n\t\t\tthis.loadModel(models);\n\t\t} else {\n\t\t\t// Nothing more to do for now.\n\t\t\tif (this.model) this.stopListening(this.model);\n\n\t\t\tif (this.img) this.img.destroy();\n\t\t\tthis.model = null;\n\t\t\tthis.render();\n\t\t}\n\t},\n\n\tloadModel: function loadModel(model) {\n\t\tthis.processing = false;\n\t\tif (this.model) this.stopListening(this.model);\n\n\t\tthis.model = model;\n\t\tthis.model.set({ state: BookStates.Reviewing });\n\n\t\tif (this.model.get(\"parsed\")) {\n\t\t\tthis.bookParsed();\n\t\t} else {\n\t\t\tthis.listenTo(this.model, Page.Events.BookParsed, this.bookParsed.bind(this));\n\t\t\tthis.listenTo(this.model, \"invalid\", this.renderErrors.bind(this));\n\t\t\tthis.listenTo(this.model, \"remove removed\", this.skipBook.bind(this));\n\t\t\tthis.listenTo(this.model, \"change:cover\", this.changeCover.bind(this));\n\t\t\tthis.listenTo(this.model, \"override\", this.deleteExisting.bind(this));\n\t\t\tif (!this.model.get(\"parsing\")) model.processBook();\n\t\t}\n\t},\n\n\tbookParsed: function bookParsed() {\n\t\tthis.template = require(\"../templates/bookupload-editor.nunj\");\n\n\t\tthis.render();\n\t},\n\n\tchangeCover: function changeCover() {\n\t\tif (!this.img || !this.model) return;\n\n\t\tif (this.model.has(\"cover\")) this.img.setImage(\"data:\" + this.model.get(\"cover-format\") + \";base64,\" + this.model.get(\"cover\"));\n\t},\n\n\tchangeDate: function changeDate() {\n\t\tif (this.ui.activation.val()) this.ui.activationOverlay.removeClass(\"hide\");else this.ui.activationOverlay.addClass(\"hide\");\n\t},\n\n\tassignAll: function assignAll() {\n\t\tthis.groups.model.set({ disabled: this.ui.assignAll.prop(\"checked\") });\n\t},\n\n\tonBeforeRender: function onBeforeRender() {\n\t\tif (this.img) this.img.destroy();\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tif (this.groups) this.groups.destroy();\n\t},\n\n\tonDomRefresh: function onDomRefresh() {\n\t\tif (!this.model) return;\n\n\t\tthis.img = ImageChooser.create($(\".book-cover-image\", this.el), { transcode: true, passive: true });\n\n\t\tif (this.img && this.model && this.model.has(\"cover\")) this.img.setImage(\"data:\" + this.model.get(\"cover-format\") + \";base64,\" + this.model.get(\"cover\"));\n\n\t\tvar o = {\n\t\t\tmultiple: true,\n\t\t\tsort: true,\n\t\t\tserver: {\n\t\t\t\tkey: \"code\",\n\t\t\t\tvalue: \"name\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/groups\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t},\n\t\t\tplaceholder: \"No groups selected\"\n\t\t};\n\n\t\tif (this.model.get(\"groups\") && this.model.get(\"groups\").length) {\n\t\t\to.server.default = {\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/groups\",\n\t\t\t\tparams: { id: this.model.get(\"groups\") }\n\t\t\t};\n\t\t}\n\n\t\tthis.groups = new Selectra(o);\n\n\t\tthis.groups.show({ el: this.ui.groups });\n\n\t\t// eslint-disable-next-line new-cap, no-new\n\t\tnew pikaday({\n\t\t\tfield: this.ui.activation.get(0),\n\t\t\tformat: \"DD MMMM YYYY\"\n\t\t});\n\n\t\tif (this.model && this.model.get(\"activationDate\")) {\n\t\t\tthis.ui.activation.val(moment.unix(this.model.get(\"activationDate\")).format(\"DD MMMM YYYY\"));\n\t\t\tthis.ui.activationOverlay.removeClass(\"hide\");\n\t\t}\n\t},\n\n\tskipBook: function skipBook() {\n\t\tthis.stopListening(this.model);\n\t\tthis.collection.remove(this.model);\n\t\tthis.checkForNewModel();\n\t},\n\n\tnextBook: function nextBook() {\n\t\tvar _this10 = this;\n\n\t\tvar rest = function rest() {\n\t\t\t// Show loader\n\t\t\t_this10.ui.workingSpinner.removeClass(\"hide\");\n\t\t\t_this10.ui.message.text(\"Preparing book data for upload\").removeClass(\"hide\");\n\t\t\t_this10.ui.nextButton.addClass(\"disabled\");\n\n\t\t\t_this10.captureMpubFields().then(function () {\n\t\t\t\tif (_this10.model && _this10.model.isValid()) {\n\t\t\t\t\t_this10.ui.message.addClass(\"hide\");\n\t\t\t\t\t_this10.queueBook();\n\t\t\t\t\t_this10.checkForNewModel();\n\t\t\t\t} else {\n\t\t\t\t\t_this10.renderErrors();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}).catch(function (err) {\n\t\t\t\tif (!settings.debug || settings.reportErrors) raygun(\"send\", err);\n\t\t\t\t_this10.ui.workingSpinner.addClass(\"hide\");\n\t\t\t\t_this10.ui.message.text(\"There was an error while preparing the book for upload: \" + err.message).removeClass(\"hide\");\n\t\t\t\t_this10.ui.nextButton.removeClass(\"disabled\");\n\t\t\t});\n\t\t};\n\n\t\tif (this.model.get(\"overrideError\")) {\n\t\t\tvar modal = new SmallModal({\n\t\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Book Replacement Confirmation\",\n\t\t\t\tbody: \"<p><strong>THIS CANNOT BE UNDONE AND HAS MAJOR RAMIFICATIONS. IF YOU ARE UNSURE, WALK AWAY. JUST WALK...AWAY.</strong></p>\\n\\t\\t\\t\\t\\t<p>Just to confirm: please click the boxes below to indicate you understand what is about to happen.</p><p>\\n\\t\\t\\t\\t\\t<label><input type='checkbox' name='understand'> Yes, I understand that continuing with this will <strong>ANNIHILATE</strong> the existing book and all its contents.</label>\\n\\t\\t\\t\\t\\t<br/><label><input type='checkbox'> I understand that everyone that has the book on their devices will <strong>INSTANTLY</strong> and permanently lose access to it.</label>\\n\\t\\t\\t\\t\\t<br/><label><input type='checkbox'> I understand and agree, and I accept that I will be held <strong>COMPLETELY AT FAULT</strong> if I am making a mistake.</label>\",\n\t\t\t\tcustomOK: \"YES. DESTROY this book and everything in it FOREVER\",\n\t\t\t\thideButtons: [\"ok\"],\n\t\t\t\twarning: true\n\t\t\t});\n\n\t\t\tmodal.on(\"button:ok\", function () {\n\t\t\t\trest();\n\t\t\t}, this);\n\n\t\t\tmodal.show();\n\n\t\t\t$(\"input[type='checkbox']\", modal.el).on(\"change\", function () {\n\t\t\t\tvar checks = $(\"input[type='checkbox']\", modal.el);\n\t\t\t\tif (_.every(checks, function (x) {\n\t\t\t\t\treturn $(x).prop(\"checked\");\n\t\t\t\t})) modal.showButtons();\n\t\t\t});\n\t\t} else {\n\t\t\trest();\n\t\t}\n\t},\n\n\tdeleteExisting: function deleteExisting() {\n\t\tvar _this11 = this;\n\n\t\tvar modal = new SmallModal({\n\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Book Replacement Warning\",\n\t\t\tbody: \"<p>You can choose to replace the existing book matching this ISBN, with this version.</p><p>\\n\\t\\t\\t\\t<strong>WARNING:</strong> This will completely replace the old book. All highlights, annotations and resources in the old book will DISAPPEAR.</p>\\n\\t\\t\\t\\t<p>To continue, please click the boxes below to indicate you understand.</p><p><label><input type='checkbox' name='understand'> Yes, I understand that continuing with this will\\n\\t\\t\\t\\t<strong>ANNIHILATE</strong> the existing book and all its contents.</label><br/><label><input type='checkbox'> I understand that everyone that has the book on their devices will\\n\\t\\t\\t\\t<strong>INSTANTLY</strong> and permanently lose access to it.</label><br/><label><input type='checkbox'> I understand and agree, and I accept that I will be held\\n\\t\\t\\t\\t<strong>COMPLETELY AT FAULT</strong> if I am making a mistake.</label>\",\n\t\t\tcustomOK: \"YES. DESTROY this book and everything in it FOREVER\",\n\t\t\thideButtons: [\"ok\"],\n\t\t\twarning: true\n\t\t});\n\n\t\tmodal.on(\"button:cancel\", this.skipBook.bind(this), this);\n\n\t\tmodal.on(\"button:ok\", function () {\n\t\t\t_this11.model.set(\"overrideError\", true);\n\t\t\t_this11.model.unset(\"error\");\n\t\t\t_this11.loadModel(_this11.model);\n\t\t}, this);\n\n\t\tmodal.show();\n\n\t\t$(\"input[type='checkbox']\", modal.el).on(\"change\", function () {\n\t\t\tvar checks = $(\"input[type='checkbox']\", modal.el);\n\t\t\tif (_.every(checks, function (x) {\n\t\t\t\treturn $(x).prop(\"checked\");\n\t\t\t})) modal.showButtons();\n\t\t});\n\t},\n\n\tqueueBook: function queueBook() {\n\t\tthis.model.set({ state: BookStates.Queued });\n\t},\n\n\tcaptureMpubFields: function captureMpubFields() {\n\t\tif (this.ui.activation.val()) this.model.set({ activationDate: moment(this.ui.activation.val(), \"DD MMM YYYY\").unix() });\n\n\t\tif (settings.bookTokenMode) this.model.set({ purchaseOverride: Boolean(this.ui.purchaseOverride.prop(\"checked\")) });\n\n\t\tif (this.ui.assignAll.prop(\"checked\")) this.model.set({ groups: null });else this.model.set({ groups: JSON.stringify(this.ui.groups.val() || []) });\n\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\t\tif (rester.hasAccess(rester.p.books.printOverride, user)) this.model.set({ allowPrint: this.ui.allowPrint.prop(\"checked\") });else this.model.set({ allowPrint: this.model.get(\"metadata\").allowPrint || false });\n\n\t\treturn Promise.resolve();\n\t},\n\n\trenderErrors: function renderErrors() {\n\t\tvar _this12 = this;\n\n\t\t$(\".error\", this.el).remove();\n\t\tthis.ui.workingSpinner.addClass(\"hide\");\n\t\tthis.ui.message.text(\"There were some errors, and the book was not queued\").removeClass(\"hide\");\n\t\tthis.ui.nextButton.removeClass(\"disabled\");\n\n\t\t_.each(this.model.validationError, function (item, key) {\n\t\t\tif (!_this12.ui[key] || !_this12.ui[key].parent) return;\n\n\t\t\t_this12.ui[key].parent().append(\"<span class='error'>\" + item + \"</span>\");\n\t\t\t_this12.ui[key].one(\"change keyup\", _this12.clearError);\n\t\t});\n\t},\n\n\tclearError: function clearError(evt) {\n\t\tvar el = $(evt.currentTarget);\n\t\tel.parent().find(\".error\").remove();\n\t},\n\n\tclearBox: function clearBox(evt) {\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\n\t\tvar el = $(evt.currentTarget);\n\t\tel.siblings(\"input\").val(\"\");\n\t\tthis.ui.activationOverlay.addClass(\"hide\");\n\t}\n});\n\nmodule.exports = Page.Views.Layout;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJvb2t1cGxvYWQuanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwiJCIsIl8iLCJKU1ppcCIsInNldHRpbmdzIiwiTlByb2dyZXNzIiwibW9tZW50IiwiUHJvbWlzZSIsInRpcHB5IiwiZGVmYXVsdCIsIlBhcGEiLCJwaWthZGF5IiwicmF5Z3VuIiwicmVzdGVyIiwiQXBwIiwicmFkaW8iLCJSYWRpbyIsImNoYW5uZWwiLCJJbWFnZUNob29zZXIiLCJBY2NvcmRpb24iLCJTbWFsbE1vZGFsIiwiU2VsZWN0cmEiLCJib29rV2FybmluZyIsIlBhZ2UiLCJleHRlbmQiLCJNb2RlbHMiLCJWaWV3cyIsIkNvbGxlY3Rpb25zIiwiTWl4aW5zIiwiRXZlbnRzIiwiQm9va0FkZGVkIiwiQm9va1BhcnNlZCIsIlVwbG9hZGVkIiwiVXBsb2FkRG9uZSIsIkNTVkFkZGVkIiwiQ1NWUHJvY2Vzc2VkIiwiU3RhcnRVcGxvYWQiLCJCb29rU3RhdGVzIiwiTmV3IiwiUmV2aWV3aW5nIiwiUXVldWVkIiwiQ29tcGxldGUiLCJHcm91cCIsIk1vZGVsIiwiZGVmYXVsdHMiLCJpZEF0dHJpYnV0ZSIsIkV4aXN0aW5nQm9vayIsIkdyb3VwcyIsIkNvbGxlY3Rpb24iLCJtb2RlbCIsIkV4aXN0aW5nQm9va3MiLCJCb29rIiwidXJsIiwidXJsUm9vdCIsImluaXRpYWxpemUiLCJhdHRycyIsIm9wdGlvbnMiLCJmaWxlUGllY2VzIiwiZmlsZSIsIm5hbWUiLCJtYXRjaCIsInNldCIsInBhcnNpbmciLCJwYXJzZWQiLCJmaWxlbmFtZSIsInR5cGUiLCJ0b0xvd2VyQ2FzZSIsInV0ZjhlbmNvZGUiLCJzIiwidW5lc2NhcGUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJ1dGY4ZGVjb2RlIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiZXNjYXBlIiwidXBsb2FkIiwiZmllbGRzIiwicGljayIsImJpbmFyeVNhdmUiLCJ3YWl0IiwiZGF0YSIsInZhbGlkYXRlIiwicmV0IiwibWV0YWRhdGEiLCJwdWJsaXNoZXIiLCJrZXlzIiwibGVuZ3RoIiwicHJvY2Vzc0Jvb2siLCJnZXQiLCJ0cmlnZ2VyIiwicGFyc2VNcHViIiwicGFyc2VNcGRmIiwiRXJyb3IiLCJyZWFkWmlwIiwidGhlbiIsImNoZWNrTXB1YiIsImJpbmQiLCJjaGVja0Jvb2siLCJhdHRlbXB0Q1NWIiwiemlwIiwiY2F0Y2giLCJkZWJ1ZyIsInJlcG9ydEVycm9ycyIsImVyciIsImVycm9yIiwicmVhZGVyIiwiRmlsZVJlYWRlciIsInNldEZpbGUiLCJwIiwicmVzb2x2ZSIsInJlamVjdCIsIm9ubG9hZGVuZCIsImxvYWRBc3luYyIsInJlc3VsdCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZWFkQXNBcnJheUJ1ZmZlciIsImFzeW5jIiwiY292ZXJEYXRhIiwiYmFzZTY0QXJyYXlCdWZmZXIiLCJzdWJhcnJheSIsIm1wdWJEYXRhIiwiSlNPTiIsInBhcnNlIiwic2xpY2UiLCJyZXBsYWNlIiwiZ3JhZGUiLCJtYXAiLCJ0ZXN0IiwieSIsInRvU3RyaW5nIiwiZmlsZXMiLCJyZXF1aXJlZCIsInNvbWUiLCJpdGVtIiwicmVhZFBkZiIsImNoZWNrTXBkZiIsInBkZiIsImZvb3RlciIsIkRhdGFWaWV3Iiwib2Zmc2V0IiwicGFpckNvdW50IiwiZ2V0VWludDMyIiwicGFpcnMiLCJpIiwicHVzaCIsIm1kYXRhIiwiVWludDhBcnJheSIsImRlY29kZVV0ZjgiLCJpbmNsdWRlcyIsInNjaG9vbFJlZ2lvbnMiLCJyZWdpb25zIiwiaW50ZXJzZWN0aW9uIiwiYm9va0lEIiwiZXhpc3QiLCJ2ZXJzaW9uIiwiTWF0aCIsImZsb29yIiwicmVzcG9uc2VKU09OIiwiZGV0YWlsIiwiaW5mbyIsIm1lc3NhZ2UiLCJmb3JtYXQiLCJ1c2VyIiwicmVxdWVzdCIsIlJlcXVlc3RzIiwiQ3VycmVudFVzZXIiLCJoYXNBY2Nlc3MiLCJncmFudHMiLCJhbGwiLCJwdWJsaXNoZXJzIiwicHViIiwibWF0Y2hHcmFudFZhbHVlcyIsImciLCJwdWJsaXNoZXJfaWQiLCJpc2JuIiwiY3N2Iiwic3BsaXQiLCJib29rVG9rZW5Nb2RlIiwiYnl0ZXMiLCJiYXNlNjQiLCJlbmNvZGluZ3MiLCJieXRlTGVuZ3RoIiwiYnl0ZVJlbWFpbmRlciIsIm1haW5MZW5ndGgiLCJhIiwiYiIsImMiLCJkIiwiY2h1bmsiLCJhcnJheUJ1ZmZlciIsImMzIiwiYzIiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJCb29rcyIsIkJhY2tsb2ciLCJWaXJ0dWFsQ29sbGVjdGlvbiIsInByb2Nlc3NpbmciLCJ0aWNrZXIiLCJzZXRJbnRlcnZhbCIsInByb2Nlc3MiLCJmb3VuZCIsImZpbmQiLCJtb2RlbHMiLCJsaXN0ZW5UbyIsInBhcnNlRG9uZSIsInN0b3BMaXN0ZW5pbmciLCJzdG9wIiwiY2xlYXJJbnRlcnZhbCIsIlF1ZXVlIiwiaGFzIiwidXBsb2FkRG9uZSIsInNldFRpbWVvdXQiLCJDU1YiLCJCb29rRHJhZ2dlciIsIm5vb3AiLCJldnQiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsImZpbGVDaG9zZW4iLCJsaXN0IiwiZmFpbGVkIiwiZWFjaCIsImN1cnJlbnRUYXJnZXQiLCJmaWx0ZXJGaWxlcyIsImZpbHRlciIsImxhc3QiLCJ4IiwicmVzdCIsImFwcGVuZENob3NlbkZpbGUiLCJDb21tYW5kcyIsIlRvYXN0IiwiY29udGVudCIsImljb24iLCJpY29uQ29sb3VyIiwiZmlsZURyb3BwZWQiLCJvcmlnaW5hbEV2ZW50IiwiZGF0YVRyYW5zZmVyIiwiY2hvb3NlRmlsZXMiLCJ1aSIsImZpbGVJbnB1dCIsImNsaWNrIiwiYm9vayIsIkxheW91dCIsIk1hcmlvbmV0dGUiLCJWaWV3IiwidGFnTmFtZSIsImNsYXNzTmFtZSIsInRlbXBsYXRlIiwibWFpbiIsImxlZnQiLCJjZW50cmUiLCJjb2xsZWN0aW9uIiwiYm9va0FkZGVkIiwiY3N2QWRkZWQiLCJzdGFydFBpbmciLCJvblJlbmRlciIsImJhY2tsb2dGaWx0ZXIiLCJxdWV1ZUZpbHRlciIsImRvbmVGaWx0ZXIiLCJyZXZpZXdGaWx0ZXIiLCJzaG93Q2hpbGRWaWV3IiwiYmFja2xvZyIsInJldmlldyIsInF1ZXVlIiwiZG9uZSIsIkVkaXRvciIsIm9uRGVzdHJveSIsInN0b3BQaW5nIiwic3RhdGUiLCJhZGQiLCJjb3VudCIsImVuY29kaW5nIiwic2tpcEVtcHR5TGluZXMiLCJzdGVwIiwiciIsInJvdyIsImFjdGl2YXRpb25EYXRlIiwidW5peCIsIndpdGhvdXRQdXJjaGFzZSIsIkJvb2xlYW4iLCJhc3NpZ25BbGwiLCJ0b0xvd2VyIiwiZ3JvdXBzIiwiY29tcGxldGUiLCJwaW5nVGltZXIiLCJ1cGxvYWRlciIsImJhY2tsb2dDb2xsIiwicXVldWVDb2xsIiwiZG9uZUNvbGwiLCJyZXZpZXdDb2xsIiwiY29sQ2hhbmdlIiwiTmF2aWdhdGlvblByb21wdCIsIlNlY3Rpb24iLCJ0aXRsZSIsIml0ZW1zIiwiaXRlbVZpZXciLCJCYWNrbG9nSXRlbSIsIlF1ZXVlSXRlbSIsIkRvbmVJdGVtIiwiY29sIiwiQmFja2xvZ1VwbG9hZGVyIiwicGFyZW50IiwiJGVsIiwicGFyZW50QWRqdXN0IiwiYmFja2xvZ0FkZCIsImNzdkNvdW50IiwiZXZlbnRzIiwiZHJhZ2VudGVyIiwiZHJhZ292ZXIiLCJkZWxlZ2F0ZUV2ZW50cyIsInNldENzdlRvdGFsIiwidGhlbWUiLCJhbmltYXRpb24iLCJwbGFjZW1lbnQiLCJhcnJvdyIsIm9wdHMiLCJ0ZXh0IiwiYmFja2xvZ0l0ZW0iLCJtb2RlbEV2ZW50cyIsInNwaW5uZXIiLCJ2YWxpZCIsImludmFsaWQiLCJvdmVycmlkZSIsImNsaWNrYWJsZSIsImFkZENsYXNzIiwiY2hhbmdlU3RhdGUiLCJyZW1vdmVDbGFzcyIsImNoZWNrU3RhdGUiLCJkZWJvdW5jZSIsImVsIiwiaW50ZXJhY3RpdmUiLCJvblNob3duIiwib24iLCJza2lwIiwicmVtb3ZlIiwiY2xpY2tlZCIsInF1ZXVlSXRlbSIsInN0YXJ0VXBsb2FkIiwieGhyIiwidGltZW91dCIsInN1Y2Nlc3MiLCJ1cGxvYWRTdWNjZXNzIiwidXBsb2FkRXJyb3IiLCJjb25maWd1cmUiLCJnZXRQYXRoIiwic2hvd1NwaW5uZXIiLCJ0cmlja2xlIiwic3RhcnQiLCJvbkJlZm9yZURlc3Ryb3kiLCJhYm9ydCIsImFuc3dlciIsInBhcnNlUmVzcG9uc2UiLCJ1bnNldCIsInVwbG9hZFByb2dyZXNzIiwicGVyYyIsImRvbmVJdGVtIiwibmV4dEJ1dHRvbiIsInNraXBCdXR0b24iLCJkZWxldGVFeGlzdGluZyIsIndvcmtpbmdTcGlubmVyIiwiY292ZXIiLCJhY3RpdmF0aW9uIiwiYWN0aXZhdGlvbk92ZXJsYXkiLCJwdXJjaGFzZU92ZXJyaWRlIiwiYWxsb3dQcmludCIsImNvbGxlY3Rpb25FdmVudHMiLCJ0ZW1wbGF0ZUNvbnRleHQiLCJoYXNHcm91cHMiLCJpc05ldyIsImlzQXJyYXkiLCJwcmludE92ZXJyaWRlIiwiYm9va3MiLCJnZXRUZW1wbGF0ZSIsIm5vQm9va3MiLCJuZXdNb2RlbCIsImxvYWRNb2RlbCIsImp1bXBUb01vZGVsIiwiY2hlY2tGb3JOZXdNb2RlbCIsImltZyIsImRlc3Ryb3kiLCJyZW5kZXIiLCJib29rUGFyc2VkIiwicmVuZGVyRXJyb3JzIiwic2tpcEJvb2siLCJjaGFuZ2VDb3ZlciIsInNldEltYWdlIiwiY2hhbmdlRGF0ZSIsInZhbCIsImRpc2FibGVkIiwicHJvcCIsIm9uQmVmb3JlUmVuZGVyIiwib25Eb21SZWZyZXNoIiwiY3JlYXRlIiwidHJhbnNjb2RlIiwicGFzc2l2ZSIsIm8iLCJtdWx0aXBsZSIsInNvcnQiLCJzZXJ2ZXIiLCJrZXkiLCJ2YWx1ZSIsImZldGNoIiwicGFnaW5nIiwicGFnZVNpemUiLCJpbmZpbml0ZSIsInBsYWNlaG9sZGVyIiwicGFyYW1zIiwiaWQiLCJzaG93IiwiZmllbGQiLCJuZXh0Qm9vayIsImNhcHR1cmVNcHViRmllbGRzIiwiaXNWYWxpZCIsInF1ZXVlQm9vayIsIm1vZGFsIiwiYm9keSIsImN1c3RvbU9LIiwiaGlkZUJ1dHRvbnMiLCJ3YXJuaW5nIiwiY2hlY2tzIiwiZXZlcnkiLCJzaG93QnV0dG9ucyIsInN0cmluZ2lmeSIsInZhbGlkYXRpb25FcnJvciIsImFwcGVuZCIsIm9uZSIsImNsZWFyRXJyb3IiLCJjbGVhckJveCIsInNpYmxpbmdzIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0FBVUE7Ozs7OztBQVRBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1DLElBQUlELFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUUsSUFBSUYsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNRyxRQUFRSCxRQUFRLE9BQVIsQ0FBZDtBQUNBLElBQU1JLFdBQVdKLFFBQVEsY0FBUixDQUFqQjtBQUNBLElBQU1LLFlBQVlMLFFBQVEsV0FBUixDQUFsQjtBQUNBLElBQU1NLFNBQVNOLFFBQVEsUUFBUixDQUFmO0FBQ0EsSUFBTU8sVUFBVVAsUUFBUSxVQUFSLENBQWhCO0FBQ0EsSUFBTVEsUUFBUVIsUUFBUSxVQUFSLEVBQW9CUyxPQUFsQzs7O0FBR0E7QUFDQSxJQUFNQyxPQUFPVixRQUFRLFdBQVIsQ0FBYjtBQUNBLElBQU1XLFVBQVVYLFFBQVEsU0FBUixDQUFoQjtBQUNBLElBQU1ZLFNBQVNaLFFBQVEsUUFBUixDQUFmOztBQUVBLElBQU1hLFNBQVNiLFFBQVEsUUFBUixDQUFmOztBQUVBLElBQU1jLE1BQU1kLFFBQVEsYUFBUixDQUFaOztBQUVBLElBQU1lLFFBQVFoQixTQUFTaUIsS0FBVCxDQUFlQyxPQUFmLENBQXVCLFFBQXZCLENBQWQ7O0FBRUEsSUFBTUMsZUFBZWxCLFFBQVEsd0JBQVIsQ0FBckI7QUFDQSxJQUFNbUIsWUFBWW5CLFFBQVEscUJBQVIsQ0FBbEI7QUFDQSxJQUFNb0IsYUFBYXBCLFFBQVEsc0JBQVIsQ0FBbkI7QUFDQSxJQUFNcUIsV0FBV3JCLFFBQVEsb0JBQVIsQ0FBakI7O0FBRUEsSUFBTXNCLGNBQWMsNktBQXBCOztBQUVBLElBQUlDLE9BQU94QixTQUFTaUIsS0FBVCxDQUFlQyxPQUFmLENBQXVCLGFBQXZC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ekIsTUFBTWtILEtBQUt4VSxFQUFFc04sSUFBSU8sYUFBTixDQUFYO0FBQ0EyRyxLQUFHNUIsTUFBSCxHQUFZcEcsSUFBWixDQUFpQixRQUFqQixFQUEyQnFJLE1BQTNCO0FBQ0EsRUE1VmtEOztBQThWbkQ2RixXQUFVLGtCQUFTcE4sR0FBVCxFQUFjO0FBQ3ZCQSxNQUFJRSxlQUFKO0FBQ0FGLE1BQUlDLGNBQUo7O0FBRUEsTUFBTWlILEtBQUt4VSxFQUFFc04sSUFBSU8sYUFBTixDQUFYO0FBQ0EyRyxLQUFHbUcsUUFBSCxDQUFZLE9BQVosRUFBcUJ6QyxHQUFyQixDQUF5QixFQUF6QjtBQUNBLE9BQUtySixFQUFMLENBQVE0SCxpQkFBUixDQUEwQnRDLFFBQTFCLENBQW1DLE1BQW5DO0FBQ0E7QUFyV2tELENBQWhDLENBQXBCOztBQXdXQXlHLE9BQU9DLE9BQVAsR0FBaUJ2WixLQUFLRyxLQUFMLENBQVd3TixNQUE1QiIsImZpbGUiOiJib29rdXBsb2FkLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBKU1ppcCA9IHJlcXVpcmUoXCJqc3ppcFwiKTtcbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcbmNvbnN0IE5Qcm9ncmVzcyA9IHJlcXVpcmUoXCJucHJvZ3Jlc3NcIik7XG5jb25zdCBtb21lbnQgPSByZXF1aXJlKFwibW9tZW50XCIpO1xuY29uc3QgUHJvbWlzZSA9IHJlcXVpcmUoXCJibHVlYmlyZFwiKTtcbmNvbnN0IHRpcHB5ID0gcmVxdWlyZShcInRpcHB5LmpzXCIpLmRlZmF1bHQ7XG5pbXBvcnQgeyBoaWRlQWxsIH0gZnJvbSBcInRpcHB5LmpzXCI7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBub2RlL25vLWV4dHJhbmVvdXMtcmVxdWlyZVxuY29uc3QgUGFwYSA9IHJlcXVpcmUoXCJwYXBhcGFyc2VcIik7XG5jb25zdCBwaWthZGF5ID0gcmVxdWlyZShcInBpa2FkYXlcIik7XG5jb25zdCByYXlndW4gPSByZXF1aXJlKFwicmF5Z3VuXCIpO1xuXG5jb25zdCByZXN0ZXIgPSByZXF1aXJlKFwicmVzdGVyXCIpO1xuXG5jb25zdCBBcHAgPSByZXF1aXJlKFwiLi4vLi4vaW5kZXhcIik7XG5cbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcblxuY29uc3QgSW1hZ2VDaG9vc2VyID0gcmVxdWlyZShcIi4uLy4uL2xpYi9pbWFnZUNob29zZXJcIik7XG5jb25zdCBBY2NvcmRpb24gPSByZXF1aXJlKFwiLi4vLi4vbGliL2FjY29yZGlvblwiKTtcbmNvbnN0IFNtYWxsTW9kYWwgPSByZXF1aXJlKFwiLi4vLi4vbGliL3NtYWxsTW9kYWxcIik7XG5jb25zdCBTZWxlY3RyYSA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc2VsZWN0cmFcIik7XG5cbmNvbnN0IGJvb2tXYXJuaW5nID0gXCI8cD5UaGVyZSBhcmUgdW5wcm9jZXNzZWQgYm9va3MgbGVmdCBpbiB0aGUgcXVldWUsIG9yIGluIHRoZSByZXZpZXcgYXJlYS4gSWYgeW91IGxlYXZlIHRoZSBwYWdlLCB0aGV5IHdpbGwgYmUgYWJhbmRvbmVkLjwvcD48cD5BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gbGVhdmUgdGhpcyBwYWdlPzwvcD5cIjtcblxubGV0IFBhZ2UgPSBCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiYm9vay11cGxvYWRcIik7XG5QYWdlID0gXy5leHRlbmQoUGFnZSwgeyBNb2RlbHM6IHt9LCBWaWV3czoge30sIENvbGxlY3Rpb25zOiB7fSwgTWl4aW5zOiB7fSB9KTtcblxuUGFnZS5FdmVudHMgPSB7XG5cdEJvb2tBZGRlZDogXCJQYWdlLkJvb2tBZGRlZFwiLFxuXHRCb29rUGFyc2VkOiBcIlBhZ2UuQm9va1BhcnNlZFwiLFxuXHRVcGxvYWRlZDogXCJQYWdlLlVwbG9hZGVkXCIsXG5cdFVwbG9hZERvbmU6IFwiUGFnZS5VcGxvYWREb25lXCIsXG5cdENTVkFkZGVkOiBcIlBhZ2UuQ1NWQWRkZWRcIixcblx0Q1NWUHJvY2Vzc2VkOiBcIlBhZ2UuQ1NWUHJvY2Vzc2VkXCIsXG5cblx0U3RhcnRVcGxvYWQ6IFwiUGFnZS5TdGFydFVwbG9hZFwiLFxufTtcblxuY29uc3QgQm9va1N0YXRlcyA9IHtcblx0TmV3OiBcIm5ld1wiLFxuXHRSZXZpZXdpbmc6IFwicmV2aWV3aW5nXCIsXG5cdFF1ZXVlZDogXCJxdWV1ZWRcIixcblx0Q29tcGxldGU6IFwiY29tcGxldGVcIixcbn07XG5cblBhZ2UuTW9kZWxzLkdyb3VwID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHt9LFxuXHRpZEF0dHJpYnV0ZTogXCJjb2RlXCIsXG59KTtcblxuUGFnZS5Nb2RlbHMuRXhpc3RpbmdCb29rID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHt9LFxuXHRpZEF0dHJpYnV0ZTogXCJfaWRcIixcbn0pO1xuXG5QYWdlLkNvbGxlY3Rpb25zLkdyb3VwcyA9IEJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IFBhZ2UuTW9kZWxzLkdyb3VwLFxufSk7XG5cblBhZ2UuQ29sbGVjdGlvbnMuRXhpc3RpbmdCb29rcyA9IEJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IFBhZ2UuTW9kZWxzLkV4aXN0aW5nQm9vayxcbn0pO1xuXG5QYWdlLk1vZGVscy5Cb29rID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHt9LFxuXHR1cmw6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9lcHVic1wiO1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKGF0dHJzLCBvcHRpb25zKSB7XG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuXHRcdGNvbnN0IGZpbGVQaWVjZXMgPSBvcHRpb25zLmZpbGUubmFtZS5tYXRjaCgvKC4rKVxcLiguKz8pJC8pO1xuXG5cdFx0dGhpcy5zZXQoeyBwYXJzaW5nOiBmYWxzZSwgcGFyc2VkOiBmYWxzZSwgZmlsZW5hbWU6IGZpbGVQaWVjZXNbMV0sIHR5cGU6IGZpbGVQaWVjZXNbMl0udG9Mb3dlckNhc2UoKSB9KTtcblx0fSxcblxuXHR1dGY4ZW5jb2RlOiBmdW5jdGlvbihzKSB7XG5cdFx0cmV0dXJuIHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzKSk7XG5cdH0sXG5cblx0dXRmOGRlY29kZTogZnVuY3Rpb24ocykge1xuXHRcdHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKHMpKTtcblx0fSxcblxuXHR1cGxvYWQ6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHRjb25zdCBmaWVsZHMgPSB0aGlzLnBpY2soXCJ0eXBlXCIsIFwiZmlsZW5hbWVcIiwgXCJncm91cHNcIiwgXCJhY3RpdmF0aW9uRGF0ZVwiLCBcInB1cmNoYXNlT3ZlcnJpZGVcIiwgXCJyZXBsYWNlRXhpc3RpbmdcIiwgXCJhbGxvd1ByaW50XCIpO1xuXG5cdFx0cmV0dXJuIHRoaXMuYmluYXJ5U2F2ZShudWxsLCBfLmV4dGVuZCh7IHdhaXQ6IHRydWUsIGRhdGE6IGZpZWxkcyB9LCBvcHRpb25zKSk7XG5cdH0sXG5cblx0dmFsaWRhdGU6IGZ1bmN0aW9uKGF0dHJzKSB7XG5cdFx0Y29uc3QgcmV0ID0ge307XG5cblx0XHRpZiAoIWF0dHJzLm1ldGFkYXRhKVxuXHRcdFx0cmV0LnB1Ymxpc2hlciA9IFwiSW52YWxpZCBtZXRhZGF0YVwiO1xuXHRcdGVsc2UgaWYgKCFhdHRycy5tZXRhZGF0YS5wdWJsaXNoZXIpXG5cdFx0XHRyZXQucHVibGlzaGVyID0gXCJObyB2YWxpZCBwdWJsaXNoZXIgY2hvc2VuXCI7XG5cblx0XHQvL2Vsc2Uge1xuXHRcdC8vXHRjb25zdCBwdWIgPSBfLmZpbmQoc2V0dGluZ3MucHVibGlzaGVyTGlzdCwgdmFsID0+IHZhbC5zaG9ydG5hbWUgPT0gYXR0cnMubWV0YWRhdGEucHVibGlzaGVyIHx8ICh2YWwuZnVsbG5hbWUgJiYgdmFsLmZ1bGxuYW1lID09IGF0dHJzLm1ldGFkYXRhLnB1Ymxpc2hlcikpO1xuXHRcdC8vXHRpZighcHViKVxuXHRcdC8vXHRcdHJldC5wdWJsaXNoZXIgPSBcIlRoaXMgcHVibGlzaGVyIGRvZXMgbm90IGV4aXN0IGluIHRoZSBzeXN0ZW1cIjtcblx0XHQvL31cblxuXHRcdGlmIChfLmtleXMocmV0KS5sZW5ndGggPiAwKVxuXHRcdFx0cmV0dXJuIHJldDtcblx0fSxcblxuXHRwcm9jZXNzQm9vazogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuZ2V0KFwicGFyc2VkXCIpKVxuXHRcdFx0cmV0dXJuIHRoaXMudHJpZ2dlcihQYWdlLkV2ZW50cy5Cb29rUGFyc2VkLCB0aGlzKTtcblx0XHRpZiAodGhpcy5nZXQoXCJwYXJzaW5nXCIpKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0c3dpdGNoICh0aGlzLmdldChcInR5cGVcIikpIHtcblx0XHRcdGNhc2UgXCJtcHViXCI6IHJldHVybiB0aGlzLnBhcnNlTXB1Yih0aGlzLm9wdGlvbnMuZmlsZSk7XG5cdFx0XHRjYXNlIFwibXBkZlwiOiByZXR1cm4gdGhpcy5wYXJzZU1wZGYodGhpcy5vcHRpb25zLmZpbGUpO1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBmaWxlIHR5cGVcIik7XG5cdFx0fVxuXHR9LFxuXG5cdHBhcnNlTXB1YjogZnVuY3Rpb24oZmlsZSkge1xuXHRcdHRoaXMuc2V0KHsgcGFyc2luZzogdHJ1ZSB9KTtcblxuXHRcdHRoaXMucmVhZFppcChmaWxlKVxuXHRcdFx0LnRoZW4odGhpcy5jaGVja01wdWIuYmluZCh0aGlzKSlcblx0XHRcdC50aGVuKHRoaXMuY2hlY2tCb29rLmJpbmQodGhpcykpXG5cdFx0XHQudGhlbih0aGlzLmF0dGVtcHRDU1YuYmluZCh0aGlzKSlcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0dGhpcy5zZXQoeyBwYXJzZWQ6IHRydWUsIHBhcnNpbmc6IGZhbHNlLCBcImNvdmVyLWZvcm1hdFwiOiBcImltYWdlL3BuZ1wiIH0pO1xuXHRcdFx0XHRkZWxldGUgdGhpcy56aXA7XG5cdFx0XHRcdHRoaXMudHJpZ2dlcihQYWdlLkV2ZW50cy5Cb29rUGFyc2VkLCB0aGlzKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSkuY2F0Y2goZXJyID0+IHtcblx0XHRcdFx0aWYgKCFzZXR0aW5ncy5kZWJ1ZyB8fCBzZXR0aW5ncy5yZXBvcnRFcnJvcnMpXG5cdFx0XHRcdFx0cmF5Z3VuKFwic2VuZFwiLCBlcnIpO1xuXHRcdFx0XHRkZWxldGUgdGhpcy56aXA7XG5cdFx0XHRcdHRoaXMuc2V0KHsgZXJyb3I6IGVyciwgcGFyc2VkOiB0cnVlLCBwYXJzaW5nOiBmYWxzZSB9KTtcblx0XHRcdFx0dGhpcy50cmlnZ2VyKFBhZ2UuRXZlbnRzLkJvb2tQYXJzZWQsIHRoaXMpO1xuXHRcdFx0fSk7XG5cdH0sXG5cblx0cmVhZFppcDogZnVuY3Rpb24oZmlsZSkge1xuXHRcdGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cblx0XHR0aGlzLnNldEZpbGUoXCJib29rXCIsIGZpbGUpO1xuXG5cdFx0Y29uc3QgcCA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdHJlYWRlci5vbmxvYWRlbmQgPSBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0dGhpcy5maWxlbmFtZSA9IGZpbGUubmFtZTtcblx0XHRcdFx0XHR0aGlzLnppcCA9IGF3YWl0IEpTWmlwLmxvYWRBc3luYyhyZWFkZXIucmVzdWx0KTtcblx0XHRcdFx0XHRyZXNvbHZlKCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRyZWplY3QoZSk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRyZWFkZXIuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIHJlamVjdCk7XG5cdFx0fSk7XG5cblx0XHRyZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7XG5cdFx0cmV0dXJuIHA7XG5cdH0sXG5cblx0Y2hlY2tNcHViOiBhc3luYyBmdW5jdGlvbigpIHtcblx0XHRjb25zdCB6aXAgPSB0aGlzLnppcDtcblxuXHRcdGNvbnN0IGNvdmVyRGF0YSA9IGF3YWl0IHppcC5maWxlKFwiY292ZXIucG5nXCIpLmFzeW5jKFwidWludDhhcnJheVwiKTtcblx0XHR0aGlzLnNldChcImNvdmVyXCIsIHRoaXMuYmFzZTY0QXJyYXlCdWZmZXIoY292ZXJEYXRhLnN1YmFycmF5KDEpKSk7XG5cblx0XHRjb25zdCBtcHViRGF0YSA9IGF3YWl0IHppcC5maWxlKFwibXB1Yi5qc29uXCIpLmFzeW5jKFwic3RyaW5nXCIpO1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gSlNPTi5wYXJzZShtcHViRGF0YS5zbGljZSgxKS5yZXBsYWNlKC9bXFx1MDAwMC1cXHUwMDFGXS9nLCBcIiBcIikpO1xuXG5cdFx0bWV0YWRhdGEuZ3JhZGUgPSBfLm1hcChtZXRhZGF0YS5ncmFkZSwgeSA9PiB7XG5cdFx0XHRpZiAoKC9eXFxkezEsMn0kLykudGVzdCh5LnRvU3RyaW5nKCkpKVxuXHRcdFx0XHRyZXR1cm4gXCJHXCIgKyB5O1xuXHRcdFx0cmV0dXJuIHk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLnNldChcIm1ldGFkYXRhXCIsIG1ldGFkYXRhKTtcblxuXHRcdGNvbnN0IGZpbGVzID0gemlwLmZpbGVzO1xuXHRcdGNvbnN0IHJlcXVpcmVkID0gW1wiY292ZXIucG5nXCIsIFwibXB1Yi5qc29uXCIsIFwiZW5jcnlwdGVkLmtleVwiLCBcInB1Ymxpc2hlci5wZW1cIl07XG5cdFx0aWYgKF8uc29tZShyZXF1aXJlZCwgaXRlbSA9PiAhKGl0ZW0gaW4gZmlsZXMpKSlcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIk9uZSBvciBtb3JlIHJlcXVpcmVkIGZpbGVzIGFyZSBtaXNzaW5nIGZyb20gdGhpcyBNUFVCXCIpO1xuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHR9LFxuXG5cdC8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19cblxuXG5cdHBhcnNlTXBkZjogZnVuY3Rpb24oZmlsZSkge1xuXHRcdHRoaXMuc2V0KHsgcGFyc2luZzogdHJ1ZSwgbWV0YWRhdGE6IHsgZmlsZW5hbWU6IHRoaXMuZ2V0KFwiZmlsZW5hbWVcIikgfSB9KTtcblxuXHRcdHRoaXMucmVhZFBkZihmaWxlKVxuXHRcdFx0LnRoZW4odGhpcy5jaGVja01wZGYuYmluZCh0aGlzKSlcblx0XHRcdC50aGVuKHRoaXMuY2hlY2tCb29rLmJpbmQodGhpcykpXG5cdFx0XHQudGhlbih0aGlzLmF0dGVtcHRDU1YuYmluZCh0aGlzKSlcblx0XHRcdC50aGVuKCgpID0+IHtcblx0XHRcdFx0dGhpcy5zZXQoeyBwYXJzZWQ6IHRydWUsIHBhcnNpbmc6IGZhbHNlLCBcImNvdmVyLWZvcm1hdFwiOiBcImltYWdlL3BuZ1wiIH0pO1xuXHRcdFx0XHR0aGlzLnRyaWdnZXIoUGFnZS5FdmVudHMuQm9va1BhcnNlZCwgdGhpcyk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pLmNhdGNoKGVyciA9PiB7XG5cdFx0XHRcdGlmICghc2V0dGluZ3MuZGVidWcgfHwgc2V0dGluZ3MucmVwb3J0RXJyb3JzKVxuXHRcdFx0XHRcdHJheWd1bihcInNlbmRcIiwgZXJyKTtcblx0XHRcdFx0dGhpcy5zZXQoeyBlcnJvcjogZXJyLCBwYXJzZWQ6IHRydWUsIHBhcnNpbmc6IGZhbHNlIH0pO1xuXHRcdFx0XHR0aGlzLnRyaWdnZXIoUGFnZS5FdmVudHMuQm9va1BhcnNlZCwgdGhpcyk7XG5cdFx0XHR9KTtcblx0fSxcblxuXHRyZWFkUGRmOiBmdW5jdGlvbihmaWxlKSB7XG5cdFx0Y29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcblxuXHRcdHRoaXMuc2V0RmlsZShcImJvb2tcIiwgZmlsZSk7XG5cblx0XHRjb25zdCBwID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0cmVhZGVyLm9ubG9hZGVuZCA9ICgpID0+IHtcblx0XHRcdFx0dGhpcy5maWxlbmFtZSA9IGZpbGUubmFtZTtcblx0XHRcdFx0cmVzb2x2ZShyZWFkZXIucmVzdWx0KTtcblx0XHRcdH07XG5cdFx0XHRyZWFkZXIuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIHJlamVjdCk7XG5cdFx0fSk7XG5cblx0XHRyZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7XG5cdFx0cmV0dXJuIHA7XG5cdH0sXG5cblx0Y2hlY2tNcGRmOiBmdW5jdGlvbihwZGYpIHtcblx0XHQvLyBSZWFkIHRoZSBsYXN0IDI1NiBieXRlcyBvZiBmb290ZXIuXG5cdFx0Y29uc3QgZm9vdGVyID0gbmV3IERhdGFWaWV3KHBkZi5zbGljZSgtMjU2KSk7XG5cblx0XHRsZXQgb2Zmc2V0ID0gNDtcblxuXHRcdGNvbnN0IHBhaXJDb3VudCA9IGZvb3Rlci5nZXRVaW50MzIob2Zmc2V0KTtcblxuXHRcdGNvbnN0IHBhaXJzID0gW107XG5cdFx0Zm9yKGxldCBpID0gMDsgaSA8IHBhaXJDb3VudDsgaSsrKSB7XG5cdFx0XHRvZmZzZXQgKz0gNDtcblx0XHRcdHBhaXJzLnB1c2goZm9vdGVyLmdldFVpbnQzMihvZmZzZXQpKTtcblx0XHRcdG9mZnNldCArPSA0O1xuXHRcdFx0cGFpcnMucHVzaChmb290ZXIuZ2V0VWludDMyKG9mZnNldCkpO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1kYXRhID0gbmV3IFVpbnQ4QXJyYXkocGRmLnNsaWNlKHBhaXJzWzRdLCBwYWlyc1s0XSArIHBhaXJzWzVdKSk7XG5cblx0XHRjb25zdCBtZXRhZGF0YSA9IEpTT04ucGFyc2UodGhpcy5kZWNvZGVVdGY4KG1kYXRhKSk7XG5cdFx0bWV0YWRhdGEuZ3JhZGUgPSBfLm1hcChtZXRhZGF0YS5ncmFkZSwgeSA9PiB7XG5cdFx0XHRpZiAoKC9eXFxkezEsMn0kLykudGVzdCh5LnRvU3RyaW5nKCkpKVxuXHRcdFx0XHRyZXR1cm4gXCJHXCIgKyB5O1xuXHRcdFx0cmV0dXJuIHk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLnNldChcIm1ldGFkYXRhXCIsIG1ldGFkYXRhKTtcblx0XHR0aGlzLnNldChcImNvdmVyXCIsIHRoaXMuYmFzZTY0QXJyYXlCdWZmZXIobmV3IFVpbnQ4QXJyYXkocGRmLnNsaWNlKHBhaXJzWzZdLCBwYWlyc1s2XSArIHBhaXJzWzddKSkpKTtcblx0fSxcblxuXHRjaGVja0Jvb2s6IGFzeW5jIGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IG1kYXRhID0gdGhpcy5nZXQoXCJtZXRhZGF0YVwiKTtcblxuXHRcdGlmICghXy5pbmNsdWRlcyhzZXR0aW5ncy5zY2hvb2xSZWdpb25zLCBcIkFMTFwiKSAmJiAhbWRhdGEucmVnaW9ucylcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIllvdSBjYW5ub3QgdXBsb2FkIGJvb2tzIHRoYXQgZG8gbm90IGhhdmUgYSByZWdpb25cIik7XG5cblx0XHRpZiAoIV8uaW5jbHVkZXMoc2V0dGluZ3Muc2Nob29sUmVnaW9ucywgXCJBTExcIikgJiYgXy5pbnRlcnNlY3Rpb24obWRhdGEucmVnaW9ucywgc2V0dGluZ3Muc2Nob29sUmVnaW9ucykubGVuZ3RoID09PSAwICYmICFfLmluY2x1ZGVzKG1kYXRhLnJlZ2lvbnMsIFwiQUxMXCIpKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIHJlZ2lvbnMgZm9yIHRoaXMgYm9vayBhcmUgaW52YWxpZCBmb3IgdGhpcyBzZXJ2ZXJcIik7XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgW2V4aXN0XSA9IGF3YWl0IFByb21pc2UucmVzb2x2ZSgkLmdldChzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9lcHVicz9pZD1cIiArIG1kYXRhLmJvb2tJRCkpO1xuXG5cdFx0XHRpZiAoZXhpc3QgJiYgZXhpc3QubWV0YWRhdGEudmVyc2lvbiA9PT0gbWRhdGEudmVyc2lvbilcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhhdCBleGFjdCBib29rIGhhcyBhbHJlYWR5IGJlZW4gdXBsb2FkZWQuXCIpO1xuXG5cdFx0XHRpZiAoZXhpc3QgJiYgZXhpc3QubWV0YWRhdGEudmVyc2lvbiA8IG1kYXRhLnZlcnNpb24pIHtcblx0XHRcdFx0Ly8gVGhpcyBtZWFucyBhIG5ld2VyIG1pbm9yIHZlcnNpb24uIFRlbGwgdGhlIHNlcnZlciB0byByZXBsYWNlIHRoZSBleGlzdGluZyBib29rLlxuXHRcdFx0XHR0aGlzLnNldChcInJlcGxhY2VFeGlzdGluZ1wiLCB0cnVlKTtcblx0XHRcdFx0dGhpcy5zZXQoXCJfb2xkXCIsIGV4aXN0KTtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKGV4aXN0ICYmIGV4aXN0Lm1ldGFkYXRhLnZlcnNpb24gPiBtZGF0YS52ZXJzaW9uICYmIE1hdGguZmxvb3IoZXhpc3QubWV0YWRhdGEudmVyc2lvbikgPT09IE1hdGguZmxvb3IobWRhdGEudmVyc2lvbikpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQSBuZXdlciBtaW5vciB2ZXJzaW9uIG9mIHRoYXQgYm9vayBoYXMgYWxyZWFkeSBiZWVuIHVwbG9hZGVkLlwiKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0Y2F0Y2ggKGUpIHtcblx0XHRcdGNvbnN0IGVyciA9IGUucmVzcG9uc2VKU09OID8gKGUucmVzcG9uc2VKU09OLmRldGFpbCB8fCBlLnJlc3BvbnNlSlNPTi5pbmZvKSA6IGUubWVzc2FnZTtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJFcnJvciBkdXJpbmcgZHVwbGljYXRlIHZlcmlmaWNhdGlvbjogPGJyPlwiICsgZXJyKSk7XG5cdFx0fVxuXG5cdFx0Ly9pZihib29rcy5zb21lKGl0ZW0gPT4gaXRlbSAmJiAhaXRlbS5nZXQoXCJwZW5kaW5nXCIpICYmIGl0ZW0uY2lkICE9PSB0aGlzLmNpZCAmJiBpdGVtLmhhcyhcIm1ldGFkYXRhXCIpICYmXG5cdFx0Ly9cdChpdGVtLmdldChcIm1ldGFkYXRhXCIpLmlzYm4gPT0gbWRhdGEuaXNibiAmJiBpdGVtLmdldChcIm1ldGFkYXRhXCIpLnZlcnNpb24gPj0gbWRhdGEudmVyc2lvbikpKVxuXHRcdC8vXHR0aHJvdyBuZXcgRXJyb3IoXCJUaGVyZSBpcyBhIG1vcmUgcmVjZW50LCBvciBlcXVhbCwgdmVyc2lvbiBvZiB0aGlzIElTQk4gaW4gdGhlIHF1ZXVlIHJpZ2h0IG5vdy5cIik7XG5cblx0XHRpZiAoIW1kYXRhLmZvcm1hdCB8fCBtZGF0YS5mb3JtYXQgPCA0IHx8IG1kYXRhLnZlcnNpb24gPT09IDApXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIHNlcnZlciBkb2VzIG5vdCBhbGxvdyBvbGQtZm9ybWF0IGJvb2tzLlwiKTtcblxuXHRcdGNvbnN0IHVzZXIgPSByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpO1xuXHRcdC8vIEdldCB0aGUgcHVibGlzaGVyIGZvciB0aGlzIHZhbHVlXG5cdFx0aWYgKCFyZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmdyYW50cy5hbGwucHVibGlzaGVycywgdXNlcikpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IHB1YiA9IGF3YWl0IFByb21pc2UucmVzb2x2ZSgkLmdldChzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9kYXRhL3B1Ymxpc2hlcnMvXCIgKyBlbmNvZGVVUklDb21wb25lbnQobWRhdGEucHVibGlzaGVyKSkpO1xuXHRcdFx0XHRpZiAoIXB1Yilcblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiQ2Fubm90IHVwbG9hZCB0aGF0IGJvb2s7IHRoZSBwdWJsaXNoZXIgY2Fubm90IGJlIGlkZW50aWZpZWRcIikpO1xuXHRcdFx0XHRpZiAoIXJlc3Rlci5tYXRjaEdyYW50VmFsdWVzKHJlc3Rlci5nLnB1Ymxpc2hlcnMsIHVzZXIsIHB1Yi5wdWJsaXNoZXJfaWQudG9TdHJpbmcoKSkpXG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkNhbm5vdCB1cGxvYWQgYm9va3MgZm9yIHRoYXQgcHVibGlzaGVyOyBpdCBkb2VzIG5vdCBtYXRjaCB5b3VyIGFzc2lnbmVkIHB1Ymxpc2hlcnNcIikpO1xuXHRcdFx0fVxuXHRcdFx0Y2F0Y2ggKGUpIHtcblx0XHRcdFx0Y29uc3QgZXJyID0gZS5yZXNwb25zZUpTT04gPyAoZS5yZXNwb25zZUpTT04uZGV0YWlsIHx8IGUucmVzcG9uc2VKU09OLmluZm8pIDogZS5tZXNzYWdlO1xuXHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiRXJyb3IgZHVyaW5nIHB1Ymxpc2hlciByZXNvbHV0aW9uOiBcIiArIGVycikpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fSxcblxuXHRhdHRlbXB0Q1NWOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBpc2JuID0gdGhpcy5nZXQoXCJtZXRhZGF0YVwiKS5pc2JuO1xuXG5cdFx0aWYgKCFpc2JuKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0Y29uc3QgbWF0Y2ggPSBQYWdlLmNzdi5nZXQoaXNibik7XG5cblx0XHRpZiAoIW1hdGNoKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0aWYgKG1hdGNoLmdldChcImFjdGl2YXRpb25EYXRlXCIpKVxuXHRcdFx0dGhpcy5zZXQoXCJhY3RpdmF0aW9uRGF0ZVwiLCBtYXRjaC5nZXQoXCJhY3RpdmF0aW9uRGF0ZVwiKSk7XG5cblx0XHRpZiAobWF0Y2guZ2V0KFwiYXNzaWduQWxsXCIpKSB7XG5cdFx0XHR0aGlzLnNldChcImFzc2lnbkFsbFwiLCB0cnVlKTtcblx0XHRcdHRoaXMuc2V0KFwiZ3JvdXBzXCIsIFtdKTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAobWF0Y2guZ2V0KFwiZ3JvdXBzXCIpKSB7XG5cdFx0XHR0aGlzLnNldChcImdyb3Vwc1wiLCBtYXRjaC5nZXQoXCJncm91cHNcIikuc3BsaXQoL1ssO10vZykpO1xuXHRcdH1cblxuXHRcdGlmIChzZXR0aW5ncy5ib29rVG9rZW5Nb2RlICYmIG1hdGNoLmdldChcIndpdGhvdXRQdXJjaGFzZVwiKSlcblx0XHRcdHRoaXMuc2V0KFwicHVyY2hhc2VPdmVycmlkZVwiLCB0cnVlKTtcblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fSxcblxuXHRiYXNlNjRBcnJheUJ1ZmZlcjogZnVuY3Rpb24oYnl0ZXMpIHtcblx0XHRsZXQgYmFzZTY0ID0gXCJcIjtcblx0XHRjb25zdCBlbmNvZGluZ3MgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky9cIjtcblxuXHRcdGNvbnN0IGJ5dGVMZW5ndGggPSBieXRlcy5ieXRlTGVuZ3RoO1xuXHRcdGNvbnN0IGJ5dGVSZW1haW5kZXIgPSBieXRlTGVuZ3RoICUgMztcblx0XHRjb25zdCBtYWluTGVuZ3RoID0gYnl0ZUxlbmd0aCAtIGJ5dGVSZW1haW5kZXI7XG5cblx0XHRsZXQgYSwgYiwgYywgZDtcblx0XHRsZXQgY2h1bms7XG5cblx0XHQvLyBNYWluIGxvb3AgZGVhbHMgd2l0aCBieXRlcyBpbiBjaHVua3Mgb2YgM1xuXHRcdGZvcihsZXQgaSA9IDA7IGkgPCBtYWluTGVuZ3RoOyBpID0gaSArIDMpIHtcblx0XHQvLyBDb21iaW5lIHRoZSB0aHJlZSBieXRlcyBpbnRvIGEgc2luZ2xlIGludGVnZXJcblx0XHRcdGNodW5rID0gKGJ5dGVzW2ldIDw8IDE2KSB8IChieXRlc1tpICsgMV0gPDwgOCkgfCBieXRlc1tpICsgMl07XG5cblx0XHRcdC8vIFVzZSBiaXRtYXNrcyB0byBleHRyYWN0IDYtYml0IHNlZ21lbnRzIGZyb20gdGhlIHRyaXBsZXRcblx0XHRcdGEgPSAoY2h1bmsgJiAxNjUxNTA3MikgPj4gMTg7IC8vIDE2NTE1MDcyID0gKDJeNiAtIDEpIDw8IDE4XG5cdFx0XHRiID0gKGNodW5rICYgMjU4MDQ4KSA+PiAxMjsgLy8gMjU4MDQ4ID0gKDJeNiAtIDEpIDw8IDEyXG5cdFx0XHRjID0gKGNodW5rICYgNDAzMikgPj4gNjsgLy8gNDAzMiA9ICgyXjYgLSAxKSA8PCA2XG5cdFx0XHRkID0gY2h1bmsgJiA2MzsgLy8gNjMgPSAyXjYgLSAxXG5cblx0XHRcdC8vIENvbnZlcnQgdGhlIHJhdyBiaW5hcnkgc2VnbWVudHMgdG8gdGhlIGFwcHJvcHJpYXRlIEFTQ0lJIGVuY29kaW5nXG5cdFx0XHRiYXNlNjQgKz0gZW5jb2RpbmdzW2FdICsgZW5jb2RpbmdzW2JdICsgZW5jb2RpbmdzW2NdICsgZW5jb2RpbmdzW2RdO1xuXHRcdH1cblxuXHRcdC8vIERlYWwgd2l0aCB0aGUgcmVtYWluaW5nIGJ5dGVzIGFuZCBwYWRkaW5nXG5cdFx0aWYgKGJ5dGVSZW1haW5kZXIgPT09IDEpIHtcblx0XHRcdGNodW5rID0gYnl0ZXNbbWFpbkxlbmd0aF07XG5cblx0XHRcdGEgPSAoY2h1bmsgJiAyNTIpID4+IDI7IC8vIDI1MiA9ICgyXjYgLSAxKSA8PCAyXG5cblx0XHRcdC8vIFNldCB0aGUgNCBsZWFzdCBzaWduaWZpY2FudCBiaXRzIHRvIHplcm9cblx0XHRcdGIgPSAoY2h1bmsgJiAzKSA8PCA0OyAvLyAzID0gMl4yIC0gMVxuXG5cdFx0XHRiYXNlNjQgKz0gZW5jb2RpbmdzW2FdICsgZW5jb2RpbmdzW2JdICsgXCI9PVwiO1xuXHRcdH1cblx0XHRlbHNlIGlmIChieXRlUmVtYWluZGVyID09PSAyKSB7XG5cdFx0XHRjaHVuayA9IChieXRlc1ttYWluTGVuZ3RoXSA8PCA4KSB8IGJ5dGVzW21haW5MZW5ndGggKyAxXTtcblxuXHRcdFx0YSA9IChjaHVuayAmIDY0NTEyKSA+PiAxMDsgLy8gNjQ1MTIgPSAoMl42IC0gMSkgPDwgMTBcblx0XHRcdGIgPSAoY2h1bmsgJiAxMDA4KSA+PiA0OyAvLyAxMDA4ID0gKDJeNiAtIDEpIDw8IDRcblxuXHRcdFx0Ly8gU2V0IHRoZSAyIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgdG8gemVyb1xuXHRcdFx0YyA9IChjaHVuayAmIDE1KSA8PCAyOyAvLyAxNSA9IDJeNCAtIDFcblxuXHRcdFx0YmFzZTY0ICs9IGVuY29kaW5nc1thXSArIGVuY29kaW5nc1tiXSArIGVuY29kaW5nc1tjXSArIFwiPVwiO1xuXHRcdH1cblx0XHRyZXR1cm4gYmFzZTY0O1xuXHR9LFxuXG5cdGRlY29kZVV0Zjg6IGZ1bmN0aW9uKGFycmF5QnVmZmVyKSB7XG5cdFx0bGV0IHJlc3VsdCA9IFwiXCI7XG5cdFx0bGV0IGkgPSAwO1xuXHRcdGxldCBjID0gMDtcblx0XHRsZXQgYzMgPSAwO1xuXHRcdGxldCBjMiA9IDA7XG5cblx0XHRjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuXG5cdFx0Ly8gSWYgd2UgaGF2ZSBhIEJPTSBza2lwIGl0XG5cdFx0aWYgKGRhdGEubGVuZ3RoID49IDMgJiYgZGF0YVswXSA9PT0gMHhFRiAmJiBkYXRhWzFdID09PSAweEJCICYmIGRhdGFbMl0gPT09IDB4QkYpXG5cdFx0XHRpID0gMztcblxuXG5cdFx0d2hpbGUoaSA8IGRhdGEubGVuZ3RoKSB7XG5cdFx0XHRjID0gZGF0YVtpXTtcblxuXHRcdFx0aWYgKGMgPCAxMjgpIHtcblx0XHRcdFx0cmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYyk7XG5cdFx0XHRcdGkrKztcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKGMgPiAxOTEgJiYgYyA8IDIyNCkge1xuXHRcdFx0XHRpZiAoaSArIDEgPj0gZGF0YS5sZW5ndGgpXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVVRGLTggRGVjb2RlIGZhaWxlZC4gVHdvIGJ5dGUgY2hhcmFjdGVyIHdhcyB0cnVuY2F0ZWQuXCIpO1xuXG5cdFx0XHRcdGMyID0gZGF0YVtpICsgMV07XG5cdFx0XHRcdHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCgoYyAmIDMxKSA8PCA2KSB8IChjMiAmIDYzKSk7XG5cdFx0XHRcdGkgKz0gMjtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRpZiAoaSArIDIgPj0gZGF0YS5sZW5ndGgpXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVVRGLTggRGVjb2RlIGZhaWxlZC4gTXVsdGkgYnl0ZSBjaGFyYWN0ZXIgd2FzIHRydW5jYXRlZC5cIik7XG5cblx0XHRcdFx0YzIgPSBkYXRhW2kgKyAxXTtcblx0XHRcdFx0YzMgPSBkYXRhW2kgKyAyXTtcblx0XHRcdFx0cmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKChjICYgMTUpIDw8IDEyKSB8ICgoYzIgJiA2MykgPDwgNikgfCAoYzMgJiA2MykpO1xuXHRcdFx0XHRpICs9IDM7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG59KTtcblxuUGFnZS5Db2xsZWN0aW9ucy5Cb29rcyA9IEJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IFBhZ2UuTW9kZWxzLkJvb2ssXG59KTtcblxuUGFnZS5Db2xsZWN0aW9ucy5CYWNrbG9nID0gQmFja2JvbmUuVmlydHVhbENvbGxlY3Rpb24uZXh0ZW5kKHtcblx0cHJvY2Vzc2luZzogZmFsc2UsXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy50aWNrZXIgPSBzZXRJbnRlcnZhbCh0aGlzLnByb2Nlc3MuYmluZCh0aGlzKSwgNDAwMCk7XG5cdH0sXG5cblx0cHJvY2VzczogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMucHJvY2Vzc2luZylcblx0XHRcdHJldHVybjtcblxuXHRcdGNvbnN0IGZvdW5kID0gXy5maW5kKHRoaXMubW9kZWxzLCBpdGVtID0+IGl0ZW0uZ2V0KFwic3RhdGVcIikgPT09IEJvb2tTdGF0ZXMuTmV3ICYmICFpdGVtLmdldChcInBhcnNlZFwiKSAmJiAhaXRlbS5nZXQoXCJwYXJzaW5nXCIpKTtcblx0XHRpZiAoIWZvdW5kKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5wcm9jZXNzaW5nID0gdHJ1ZTtcblx0XHR0aGlzLmxpc3RlblRvKGZvdW5kLCBQYWdlLkV2ZW50cy5Cb29rUGFyc2VkLCB0aGlzLnBhcnNlRG9uZS5iaW5kKHRoaXMpKTtcblxuXHRcdGZvdW5kLnByb2Nlc3NCb29rKCk7XG5cdH0sXG5cblx0cGFyc2VEb25lOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdHRoaXMuc3RvcExpc3RlbmluZyhtb2RlbCwgUGFnZS5FdmVudHMuQm9va1BhcnNlZCk7XG5cdFx0dGhpcy5wcm9jZXNzaW5nID0gZmFsc2U7XG5cdH0sXG5cblx0c3RvcDogZnVuY3Rpb24oKSB7XG5cdFx0Y2xlYXJJbnRlcnZhbCh0aGlzLnRpY2tlcik7XG5cdH0sXG59KTtcblxuUGFnZS5Db2xsZWN0aW9ucy5RdWV1ZSA9IEJhY2tib25lLlZpcnR1YWxDb2xsZWN0aW9uLmV4dGVuZCh7XG5cdHByb2Nlc3Npbmc6IGZhbHNlLFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudGlja2VyID0gc2V0SW50ZXJ2YWwodGhpcy5wcm9jZXNzLmJpbmQodGhpcyksIDQwMDApO1xuXHR9LFxuXG5cdHByb2Nlc3M6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLnByb2Nlc3NpbmcpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRjb25zdCBmb3VuZCA9IF8uZmluZCh0aGlzLm1vZGVscywgaXRlbSA9PiBpdGVtLmdldChcInN0YXRlXCIpID09PSBCb29rU3RhdGVzLlF1ZXVlZCAmJiAhaXRlbS5oYXMoXCJ1cGxvYWRFcnJvclwiKSk7XG5cdFx0aWYgKCFmb3VuZClcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMucHJvY2Vzc2luZyA9IHRydWU7XG5cdFx0dGhpcy5saXN0ZW5Ubyhmb3VuZCwgUGFnZS5FdmVudHMuVXBsb2FkRG9uZSwgdGhpcy51cGxvYWREb25lLmJpbmQodGhpcykpO1xuXG5cdFx0Ly8gRGVsYXkgdGhpcyBieSBhIHNlY29uZCBvciBzbyB0byBnaXZlIHRoZSBVSSB0aW1lIHRvIHNldHRsZSBkb3duXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRmb3VuZC50cmlnZ2VyKFBhZ2UuRXZlbnRzLlN0YXJ0VXBsb2FkKTtcblx0XHR9LCAxMDAwKTtcblx0fSxcblxuXHR1cGxvYWREb25lOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdHRoaXMuc3RvcExpc3RlbmluZyhtb2RlbCwgUGFnZS5FdmVudHMuVXBsb2FkRG9uZSk7XG5cblx0XHR0aGlzLnByb2Nlc3NpbmcgPSBmYWxzZTtcblx0fSxcblxuXHRzdG9wOiBmdW5jdGlvbigpIHtcblx0XHRjbGVhckludGVydmFsKHRoaXMudGlja2VyKTtcblx0fSxcbn0pO1xuXG5QYWdlLkNvbGxlY3Rpb25zLkNTViA9IEJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG5cdFx0ZGVmYXVsdHM6IHt9LFxuXHRcdGlkQXR0cmlidXRlOiBcImlzYm5cIixcblx0fSksXG59KTtcblxuUGFnZS5NaXhpbnMuQm9va0RyYWdnZXIgPSB7XG5cdG5vb3A6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblx0fSxcblxuXHRmaWxlQ2hvc2VuOiBmdW5jdGlvbihldnQpIHtcblx0XHRjb25zdCBsaXN0ID0gW10sIGZhaWxlZCA9IFtdO1xuXG5cdFx0Xy5lYWNoKGV2dC5jdXJyZW50VGFyZ2V0LmZpbGVzLCBpdGVtID0+IHtcblx0XHRcdGlmICh0aGlzLmZpbHRlckZpbGVzKGl0ZW0pKVxuXHRcdFx0XHRsaXN0LnB1c2goaXRlbSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdGZhaWxlZC5wdXNoKGl0ZW0pO1xuXHRcdH0pO1xuXG5cdFx0Y29uc3QgY3N2ID0gXy5maWx0ZXIobGlzdCwgeCA9PiBfLmxhc3QoeC5uYW1lLnNwbGl0KFwiLlwiKSkudG9Mb3dlckNhc2UoKSA9PT0gXCJjc3ZcIik7XG5cdFx0Y29uc3QgcmVzdCA9IF8uZmlsdGVyKGxpc3QsIHggPT4gXy5sYXN0KHgubmFtZS5zcGxpdChcIi5cIikpLnRvTG93ZXJDYXNlKCkgIT09IFwiY3N2XCIpO1xuXG5cdFx0Ly8gUHJvY2VzcyBDU1ZzIGZpcnN0XG5cdFx0Xy5lYWNoKGNzdiwgdGhpcy5hcHBlbmRDaG9zZW5GaWxlLmJpbmQodGhpcykpO1xuXHRcdF8uZWFjaChyZXN0LCB0aGlzLmFwcGVuZENob3NlbkZpbGUuYmluZCh0aGlzKSk7XG5cblx0XHRpZiAoZmFpbGVkLmxlbmd0aCA9PT0gMSAmJiAhbGlzdC5sZW5ndGgpXG5cdFx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuVG9hc3QsIHsgY29udGVudDogXCJCb29rcyBtdXN0IGJlIGluIE1QVUIgb3IgTVBERiBmb3JtYXRcIiwgaWNvbjogXCJmYS10aW1lc1wiLCBpY29uQ29sb3VyOiBcInJlZFwiIH0pO1xuXHRcdGVsc2UgaWYgKGZhaWxlZC5sZW5ndGggPT09IDEpXG5cdFx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuVG9hc3QsIHsgY29udGVudDogXCJTb21lIGJvb2tzIHdlcmUgbm90IGluIE1QVUIgb3IgTVBERiBmb3JtYXRcIiwgaWNvbjogXCJmYS10aW1lc1wiLCBpY29uQ29sb3VyOiBcInJlZFwiIH0pO1xuXHR9LFxuXG5cdGZpbGVEcm9wcGVkOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0ZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRjb25zdCBsaXN0ID0gW10sIGZhaWxlZCA9IFtdO1xuXG5cdFx0Xy5lYWNoKGV2dC5vcmlnaW5hbEV2ZW50LmRhdGFUcmFuc2Zlci5maWxlcywgaXRlbSA9PiB7XG5cdFx0XHRpZiAodGhpcy5maWx0ZXJGaWxlcyhpdGVtKSlcblx0XHRcdFx0bGlzdC5wdXNoKGl0ZW0pO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRmYWlsZWQucHVzaChpdGVtKTtcblx0XHR9KTtcblxuXHRcdGNvbnN0IGNzdiA9IF8uZmlsdGVyKGxpc3QsIHggPT4gXy5sYXN0KHgubmFtZS5zcGxpdChcIi5cIikpLnRvTG93ZXJDYXNlKCkgPT09IFwiY3N2XCIpO1xuXHRcdGNvbnN0IHJlc3QgPSBfLmZpbHRlcihsaXN0LCB4ID0+IF8ubGFzdCh4Lm5hbWUuc3BsaXQoXCIuXCIpKS50b0xvd2VyQ2FzZSgpICE9PSBcImNzdlwiKTtcblxuXHRcdC8vIFByb2Nlc3MgQ1NWcyBmaXJzdFxuXHRcdF8uZWFjaChjc3YsIHRoaXMuYXBwZW5kQ2hvc2VuRmlsZS5iaW5kKHRoaXMpKTtcblx0XHRfLmVhY2gocmVzdCwgdGhpcy5hcHBlbmRDaG9zZW5GaWxlLmJpbmQodGhpcykpO1xuXG5cdFx0aWYgKGZhaWxlZC5sZW5ndGggPT09IDEgJiYgIWxpc3QubGVuZ3RoKVxuXHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7IGNvbnRlbnQ6IFwiQm9va3MgbXVzdCBiZSBpbiBNUFVCIG9yIE1QREYgZm9ybWF0XCIsIGljb246IFwiZmEtdGltZXNcIiwgaWNvbkNvbG91cjogXCJyZWRcIiB9KTtcblx0XHRlbHNlIGlmIChmYWlsZWQubGVuZ3RoID09PSAxKVxuXHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7IGNvbnRlbnQ6IFwiU29tZSBib29rcyB3ZXJlIG5vdCBpbiBNUFVCIG9yIE1QREYgZm9ybWF0XCIsIGljb246IFwiZmEtdGltZXNcIiwgaWNvbkNvbG91cjogXCJyZWRcIiB9KTtcblx0fSxcblxuXHRjaG9vc2VGaWxlczogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdHRoaXMudWkuZmlsZUlucHV0LmdldCgwKS5jbGljaygpO1xuXHR9LFxuXG5cdGFwcGVuZENob3NlbkZpbGU6IGZ1bmN0aW9uKGJvb2spIHtcblx0XHRpZiAoXy5sYXN0KGJvb2submFtZS5zcGxpdChcIi5cIikpLnRvTG93ZXJDYXNlKCkgPT09IFwiY3N2XCIpXG5cdFx0XHRQYWdlLnRyaWdnZXIoUGFnZS5FdmVudHMuQ1NWQWRkZWQsIGJvb2spO1xuXHRcdGVsc2Vcblx0XHRcdFBhZ2UudHJpZ2dlcihQYWdlLkV2ZW50cy5Cb29rQWRkZWQsIGJvb2spO1xuXHR9LFxuXG5cdGZpbHRlckZpbGVzOiBmdW5jdGlvbihmaWxlKSB7XG5cdFx0cmV0dXJuIF8uaW5jbHVkZXMoW1wibXB1YlwiLCBcImNzdlwiLCBcIm1wZGZcIl0sIF8ubGFzdChmaWxlLm5hbWUuc3BsaXQoXCIuXCIpKS50b0xvd2VyQ2FzZSgpKTtcblx0fSxcbn07XG5cblxuLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19cblxuXG5QYWdlLlZpZXdzLkxheW91dCA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwiY29udGVudCBib29rLWNvbnRlbnRcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9ib29rdXBsb2FkLm51bmpcIikubWFpbixcblxuXHRyZWdpb25zOiB7XG5cdFx0bGVmdDogXCIjYm9va3VwbG9hZC1zdXBwb3J0XCIsXG5cdFx0Y2VudHJlOiBcIiNib29rdXBsb2FkLW1haW5cIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmNvbGxlY3Rpb24gPSBuZXcgUGFnZS5Db2xsZWN0aW9ucy5Cb29rcygpO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhQYWdlLCBQYWdlLkV2ZW50cy5Cb29rQWRkZWQsIHRoaXMuYm9va0FkZGVkLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8oUGFnZSwgUGFnZS5FdmVudHMuQ1NWQWRkZWQsIHRoaXMuY3N2QWRkZWQuYmluZCh0aGlzKSk7XG5cblx0XHQvLyBLZWVwIHRoZSBzZXNzaW9uIGFsaXZlLCBiZWNhdXNlIHRoaXMgcGFnZSB3aWxsIGJlIHVzZWQgYSBsb3Rcblx0XHR0aGlzLnN0YXJ0UGluZygpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBiYWNrbG9nRmlsdGVyID0gZnVuY3Rpb24oaXRlbSkge1xuXHRcdFx0cmV0dXJuIGl0ZW0uZ2V0KFwic3RhdGVcIikgPT09IEJvb2tTdGF0ZXMuTmV3IHx8IGl0ZW0uZ2V0KFwic3RhdGVcIikgPT09IEJvb2tTdGF0ZXMuUmV2aWV3aW5nO1xuXHRcdH07XG5cblx0XHRjb25zdCBxdWV1ZUZpbHRlciA9IGZ1bmN0aW9uKGl0ZW0pIHtcblx0XHRcdHJldHVybiBpdGVtLmdldChcInN0YXRlXCIpID09PSBCb29rU3RhdGVzLlF1ZXVlZDtcblx0XHR9O1xuXG5cdFx0Y29uc3QgZG9uZUZpbHRlciA9IGZ1bmN0aW9uKGl0ZW0pIHtcblx0XHRcdHJldHVybiBpdGVtLmdldChcInN0YXRlXCIpID09PSBCb29rU3RhdGVzLkNvbXBsZXRlO1xuXHRcdH07XG5cblx0XHRjb25zdCByZXZpZXdGaWx0ZXIgPSBmdW5jdGlvbihpdGVtKSB7XG5cdFx0XHRyZXR1cm4gaXRlbS5nZXQoXCJzdGF0ZVwiKSA9PT0gQm9va1N0YXRlcy5SZXZpZXdpbmc7XG5cdFx0fTtcblxuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImxlZnRcIiwgbmV3IFBhZ2UuVmlld3MuQmFja2xvZyh7XG5cdFx0XHRiYWNrbG9nOiBuZXcgUGFnZS5Db2xsZWN0aW9ucy5CYWNrbG9nKHRoaXMuY29sbGVjdGlvbiwgeyBmaWx0ZXI6IGJhY2tsb2dGaWx0ZXIgfSksXG5cdFx0XHRyZXZpZXc6IG5ldyBQYWdlLkNvbGxlY3Rpb25zLlF1ZXVlKHRoaXMuY29sbGVjdGlvbiwgeyBmaWx0ZXI6IHJldmlld0ZpbHRlciB9KSxcblx0XHRcdHF1ZXVlOiBuZXcgUGFnZS5Db2xsZWN0aW9ucy5RdWV1ZSh0aGlzLmNvbGxlY3Rpb24sIHsgZmlsdGVyOiBxdWV1ZUZpbHRlciB9KSxcblx0XHRcdGRvbmU6IG5ldyBQYWdlLkNvbGxlY3Rpb25zLlF1ZXVlKHRoaXMuY29sbGVjdGlvbiwgeyBmaWx0ZXI6IGRvbmVGaWx0ZXIgfSksXG5cdFx0fSkpO1xuXG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiY2VudHJlXCIsIG5ldyBQYWdlLlZpZXdzLkVkaXRvcih7IGNvbGxlY3Rpb246IHRoaXMuY29sbGVjdGlvbiB9KSk7XG5cdH0sXG5cblx0b25EZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnN0b3BQaW5nKCk7XG5cdH0sXG5cblx0Ym9va0FkZGVkOiBmdW5jdGlvbihib29rKSB7XG5cdFx0Y29uc3QgbW9kZWwgPSBuZXcgUGFnZS5Nb2RlbHMuQm9vayh7IHN0YXRlOiBCb29rU3RhdGVzLk5ldyB9LCB7IGZpbGU6IGJvb2sgfSk7XG5cdFx0dGhpcy5jb2xsZWN0aW9uLmFkZChtb2RlbCk7XG5cdH0sXG5cblx0Y3N2QWRkZWQ6IGZ1bmN0aW9uKGZpbGUpIHtcblx0XHRsZXQgY291bnQgPSAwO1xuXG5cdFx0UGFwYS5wYXJzZShmaWxlLCB7XG5cdFx0XHRlbmNvZGluZzogXCJpc28tODg1OS0xXCIsXG5cdFx0XHRza2lwRW1wdHlMaW5lczogdHJ1ZSxcblx0XHRcdHN0ZXA6IGZ1bmN0aW9uKHIpIHtcblx0XHRcdFx0aWYgKCFyKVxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0Y29uc3Qgcm93ID0gci5kYXRhWzBdO1xuXHRcdFx0XHRpZiAocm93WzBdLnRvTG93ZXJDYXNlKCkgPT09IFwiaXNiblwiKVxuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRQYWdlLmNzdi5hZGQoe1xuXHRcdFx0XHRcdGlzYm46IHJvd1swXSxcblx0XHRcdFx0XHRhY3RpdmF0aW9uRGF0ZTogbW9tZW50KHJvd1sxXSwgXCJERC9NTS9ZWVlZXCIpLnVuaXgoKSB8fCAwLFxuXHRcdFx0XHRcdHdpdGhvdXRQdXJjaGFzZTogQm9vbGVhbihyb3dbMl0pLFxuXHRcdFx0XHRcdGFzc2lnbkFsbDogXy50b0xvd2VyKHJvd1szXSkgPT09IFwiYWxsXCIgfHwgXy50b0xvd2VyKHJvd1szXSkgPT09IFwieWVzXCIsXG5cdFx0XHRcdFx0Z3JvdXBzOiBfLnRvTG93ZXIocm93WzNdKSAhPT0gXCJhbGxcIiAmJiBfLnRvTG93ZXIocm93WzNdKSAhPT0gXCJ5ZXNcIiA/IHJvd1szXSA6IFwiXCIsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRjb3VudCsrO1xuXHRcdFx0fSxcblx0XHRcdGNvbXBsZXRlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7IGNvbnRlbnQ6IFwiQ1NWIGltcG9ydCBmaW5pc2hlZCAoXCIgKyBjb3VudCArIFwiICByb3dzIGZvdW5kKVwiIH0pO1xuXHRcdFx0XHRQYWdlLnRyaWdnZXIoUGFnZS5FdmVudHMuQ1NWUHJvY2Vzc2VkLCB7IGxlbmd0aDogUGFnZS5jc3YubGVuZ3RoIH0pO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fSxcblxuXHRzdGFydFBpbmc6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMucGluZ1RpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4geyAkLmdldChzZXR0aW5ncy51cmxSb290ICsgXCIvdmVyc2lvblwiKTsgfSwgMTAwMCAqIDYwICogMzApO1xuXHR9LFxuXG5cdHN0b3BQaW5nOiBmdW5jdGlvbigpIHtcblx0XHRjbGVhckludGVydmFsKHRoaXMucGluZ1RpbWVyKTtcblx0fSxcbn0pO1xuXG5QYWdlLlZpZXdzLkJhY2tsb2cgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImJvb2stdXBsb2FkLWFjY29yZGlvblwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2Jvb2t1cGxvYWQubnVualwiKS5iYWNrbG9nLFxuXG5cdHJlZ2lvbnM6IHtcblx0XHR1cGxvYWRlcjogXCIuYm9vay11cGxvYWQtZHJvcC1zbWFsbFwiLFxuXHRcdGxpc3Q6IFwiLmJvb2stdXBsb2FkLWJhY2tsb2ctbGlzdFwiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLmJhY2tsb2dDb2xsID0gb3B0aW9ucy5iYWNrbG9nO1xuXHRcdHRoaXMucXVldWVDb2xsID0gb3B0aW9ucy5xdWV1ZTtcblx0XHR0aGlzLmRvbmVDb2xsID0gb3B0aW9ucy5kb25lO1xuXHRcdHRoaXMucmV2aWV3Q29sbCA9IG9wdGlvbnMucmV2aWV3O1xuXG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmJhY2tsb2dDb2xsLCBcImFkZFwiLCB0aGlzLmNvbENoYW5nZS5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMucmV2aWV3Q29sbCwgXCJhZGRcIiwgdGhpcy5jb2xDaGFuZ2UuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLnF1ZXVlQ29sbCwgXCJhZGRcIiwgdGhpcy5jb2xDaGFuZ2UuYmluZCh0aGlzKSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuYmFja2xvZ0NvbGwsIFwicmVtb3ZlXCIsIHRoaXMuY29sQ2hhbmdlLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5yZXZpZXdDb2xsLCBcInJlbW92ZVwiLCB0aGlzLmNvbENoYW5nZS5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMucXVldWVDb2xsLCBcInJlbW92ZVwiLCB0aGlzLmNvbENoYW5nZS5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRjb2xDaGFuZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGNvdW50ID0gdGhpcy5xdWV1ZUNvbGwubGVuZ3RoICsgdGhpcy5yZXZpZXdDb2xsLmxlbmd0aCArIHRoaXMuYmFja2xvZ0NvbGwubGVuZ3RoO1xuXG5cdFx0aWYgKGNvdW50ID09PSAwKVxuXHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLk5hdmlnYXRpb25Qcm9tcHQsIG51bGwpO1xuXHRcdGVsc2Vcblx0XHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0aW9uUHJvbXB0LCBib29rV2FybmluZyk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIENyZWF0ZSBtb2RlbHMgdG8gcmVwcmVzZW50IHRoZSBzZWN0aW9uc1xuXHRcdGNvbnN0IHJldmlldyA9IG5ldyBBY2NvcmRpb24uU2VjdGlvbih7IHRpdGxlOiBcIkF3YWl0aW5nIFJldmlld1wiLCBpY29uOiBcImZhLWVkaXRcIiwgaXRlbXM6IHRoaXMuYmFja2xvZ0NvbGwsIGl0ZW1WaWV3OiBQYWdlLlZpZXdzLkJhY2tsb2dJdGVtIH0pO1xuXHRcdGNvbnN0IHF1ZXVlID0gbmV3IEFjY29yZGlvbi5TZWN0aW9uKHsgdGl0bGU6IFwiVXBsb2FkaW5nXCIsIGljb246IFwiZmEtYXJyb3ctY2lyY2xlLXVwXCIsIGl0ZW1zOiB0aGlzLnF1ZXVlQ29sbCwgaXRlbVZpZXc6IFBhZ2UuVmlld3MuUXVldWVJdGVtIH0pO1xuXHRcdGNvbnN0IGRvbmUgPSBuZXcgQWNjb3JkaW9uLlNlY3Rpb24oeyB0aXRsZTogXCJDb21wbGV0ZVwiLCBpY29uOiBcImZhLWNoZWNrLWNpcmNsZVwiLCBpdGVtczogdGhpcy5kb25lQ29sbCwgaXRlbVZpZXc6IFBhZ2UuVmlld3MuRG9uZUl0ZW0gfSk7XG5cblx0XHRjb25zdCBjb2wgPSBuZXcgQmFja2JvbmUuQ29sbGVjdGlvbihbcmV2aWV3LCBxdWV1ZSwgZG9uZV0pO1xuXG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwidXBsb2FkZXJcIiwgbmV3IFBhZ2UuVmlld3MuQmFja2xvZ1VwbG9hZGVyKCkpO1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImxpc3RcIiwgbmV3IEFjY29yZGlvbih7IGNvbGxlY3Rpb246IGNvbCwgcGFyZW50OiB0aGlzLiRlbC5wYXJlbnQoKSwgcGFyZW50QWRqdXN0OiA4MCB9KSk7XG5cdH0sXG5cblx0b25EZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmJhY2tsb2dDb2xsLnN0b3AoKTtcblx0XHR0aGlzLnF1ZXVlQ29sbC5zdG9wKCk7XG5cdH0sXG59KTtcblxuUGFnZS5WaWV3cy5CYWNrbG9nVXBsb2FkZXIgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvYm9va3VwbG9hZC5udW5qXCIpLmJhY2tsb2dBZGQsXG5cblx0dWk6IHtcblx0XHRmaWxlSW5wdXQ6IFwiLnVwbG9hZC1pbnB1dFwiLFxuXHRcdGNzdkNvdW50OiBcInNwYW4uY3N2Q291bnRlclwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdGRyYWdlbnRlcjogXCJub29wXCIsXG5cdFx0ZHJhZ292ZXI6IFwibm9vcFwiLFxuXHRcdFwiY2xpY2sgYnV0dG9uXCI6IFwiY2hvb3NlRmlsZXNcIixcblx0XHRcImNsaWNrIEB1aS5maWxlSW5wdXRcIjogXCJjaG9vc2VGaWxlc1wiLFxuXHRcdFwiY2hhbmdlIGlucHV0LnVwbG9hZC1pbnB1dFwiOiBcImZpbGVDaG9zZW5cIixcblx0XHRcImRyb3AgYnV0dG9uXCI6IFwiZmlsZURyb3BwZWRcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRfLmV4dGVuZCh0aGlzLCBQYWdlLk1peGlucy5Cb29rRHJhZ2dlcik7XG5cblx0XHR0aGlzLmRlbGVnYXRlRXZlbnRzKCk7XG5cblx0XHR0aGlzLmxpc3RlblRvKFBhZ2UsIFBhZ2UuRXZlbnRzLkNTVlByb2Nlc3NlZCwgdGhpcy5zZXRDc3ZUb3RhbC5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGlwcHkoJChcImJ1dHRvblwiLCB0aGlzLiRlbCkuZ2V0KDApLCB7XG5cdFx0XHR0aGVtZTogXCJibGFja1wiLFxuXHRcdFx0YW5pbWF0aW9uOiBcImZhZGVcIixcblx0XHRcdHBsYWNlbWVudDogXCJyaWdodFwiLFxuXHRcdFx0YXJyb3c6IHRydWUsXG5cdFx0XHRjb250ZW50OiBcIlVwbG9hZCBzb21lIGJvb2tzLCBvciBhIENTViBvZiBtZXRhZGF0YVwiLFxuXHRcdH0pO1xuXHR9LFxuXG5cdHNldENzdlRvdGFsOiBmdW5jdGlvbihvcHRzKSB7XG5cdFx0dGhpcy51aS5jc3ZDb3VudC50ZXh0KFwiVG90YWwgQ1NWIHJvd3M6IFwiICsgb3B0cy5sZW5ndGgpO1xuXHR9LFxufSk7XG5cblBhZ2UuVmlld3MuQmFja2xvZ0l0ZW0gPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImJvb2stYmFja2xvZy1pdGVtXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvYm9va3VwbG9hZC5udW5qXCIpLmJhY2tsb2dJdGVtLFxuXG5cdG1vZGVsRXZlbnRzOiB7XG5cdFx0XCJjaGFuZ2U6cGFyc2luZyBjaGFuZ2U6ZXJyb3JcIjogXCJjaGVja1N0YXRlXCIsXG5cdFx0XCJjaGFuZ2U6c3RhdGVcIjogXCJjaGFuZ2VTdGF0ZVwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgYnV0dG9uXCI6IFwic2tpcFwiLFxuXHRcdGNsaWNrOiBcImNsaWNrZWRcIixcblx0fSxcblxuXHR1aToge1xuXHRcdHNwaW5uZXI6IFwic3Bhbi5zcGlubmVyLWljb25cIixcblx0XHR2YWxpZDogXCJzcGFuLnZhbGlkXCIsXG5cdFx0aW52YWxpZDogXCJzcGFuLmludmFsaWRcIixcblx0XHRvdmVycmlkZTogXCJzcGFuLm92ZXJyaWRlXCIsXG5cdFx0bmFtZTogXCJkaXYuaXRlbS1uYW1lXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdGlmIChvcHRpb25zLmNsaWNrYWJsZSlcblx0XHRcdHRoaXMuJGVsLmFkZENsYXNzKFwiYWNjb3JkaW9uLWNsaWNrYWJsZVwiKTtcblx0fSxcblxuXHRjaGFuZ2VTdGF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwic3RhdGVcIikgPT09IEJvb2tTdGF0ZXMuUmV2aWV3aW5nKVxuXHRcdFx0dGhpcy51aS5uYW1lLmFkZENsYXNzKFwiYm9sZFwiKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnVpLm5hbWUucmVtb3ZlQ2xhc3MoXCJib2xkXCIpO1xuXHR9LFxuXG5cdGNoZWNrU3RhdGU6IF8uZGVib3VuY2UoZnVuY3Rpb24oKSB7XG5cdFx0LyogZXNsaW50LWRpc2FibGUgbm8taW52YWxpZC10aGlzICovXG5cdFx0aWYgKCF0aGlzLm1vZGVsIHx8ICF0aGlzLnVpLmludmFsaWQuYWRkQ2xhc3MpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJwYXJzaW5nXCIpKSB7IHRoaXMudWkuc3Bpbm5lci5yZW1vdmVDbGFzcyhcImhpZGVcIik7IH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMudWkuaW52YWxpZC5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLnVpLnNwaW5uZXIuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJlcnJvclwiKSAmJiAhdGhpcy5tb2RlbC5nZXQoXCJvdmVycmlkZUVycm9yXCIpKSB7XG5cdFx0XHRcdHRoaXMudWkuaW52YWxpZC5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cblx0XHRcdFx0bGV0IGNvbnRlbnQgPSBcIjxkaXY+VGhpcyBib29rIGhhcyBhbiBlcnJvciBhbmQgY2Fubm90IGJlIHVwbG9hZGVkOjwvZGl2Pjxici8+PGRpdj5cIiArIHRoaXMubW9kZWwuZ2V0KFwiZXJyb3JcIikubWVzc2FnZSArIFwiPC9kaXY+PGJyLz5cIjtcblx0XHRcdFx0Y29udGVudCArPSBcIjxidXR0b24gY2xhc3M9J3RpbnkgYWxlcnQgYnV0dG9uJz5Ta2lwIEJvb2s8L2J1dHRvbj5cIjtcblxuXHRcdFx0XHR0aXBweSgkKFwic3Bhbi5pbnZhbGlkXCIsIHRoaXMuZWwpLmdldCgwKSwge1xuXHRcdFx0XHRcdHRoZW1lOiBcImxpZ2h0XCIsXG5cdFx0XHRcdFx0YW5pbWF0aW9uOiBcImZhZGVcIixcblx0XHRcdFx0XHRwbGFjZW1lbnQ6IFwibGVmdFwiLFxuXHRcdFx0XHRcdGFycm93OiB0cnVlLFxuXHRcdFx0XHRcdGludGVyYWN0aXZlOiB0cnVlLFxuXHRcdFx0XHRcdGNvbnRlbnQsXG5cdFx0XHRcdFx0b25TaG93bjogKCkgPT4ge1xuXHRcdFx0XHRcdFx0JChcImJ1dHRvbi50aW55LmFsZXJ0LmJ1dHRvblwiKS5vbihcImNsaWNrXCIsICgpID0+IHtcblx0XHRcdFx0XHRcdFx0aGlkZUFsbCgpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLnNraXAoKTtcblx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHQkKFwiYnV0dG9uLnN1Y2Nlc3NcIikub24oXCJjbGlja1wiLCAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGhpZGVBbGwoKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5vdmVycmlkZSgpO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmICh0aGlzLm1vZGVsLmdldChcIm92ZXJyaWRlRXJyb3JcIikpIHsgdGhpcy51aS5vdmVycmlkZS5yZW1vdmVDbGFzcyhcImhpZGVcIik7IH1cblx0XHRcdGVsc2UgeyB0aGlzLnVpLnZhbGlkLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTsgfVxuXHRcdFx0LyogZXNsaW50LWVuYWJsZSBuby1pbnZhbGlkLXRoaXMgKi9cblx0XHR9XG5cdH0sIDEwKSxcblxuXHRza2lwOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5jb2xsZWN0aW9uKVxuXHRcdFx0dGhpcy5tb2RlbC5jb2xsZWN0aW9uLnJlbW92ZSh0aGlzLm1vZGVsKTtcblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJzdGF0ZVwiKSA9PT0gQm9va1N0YXRlcy5SZXZpZXdpbmcpXG5cdFx0XHR0aGlzLm1vZGVsLnRyaWdnZXIoXCJyZW1vdmVkXCIpO1xuXHR9LFxuXG5cdG92ZXJyaWRlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm1vZGVsLnRyaWdnZXIoXCJvdmVycmlkZVwiKTtcblx0fSxcblxuXHRjbGlja2VkOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0ZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRpZiAoIXRoaXMub3B0aW9ucy5jbGlja2FibGUgfHwgdGhpcy5tb2RlbC5nZXQoXCJzdGF0ZVwiKSA9PT0gQm9va1N0YXRlcy5SZXZpZXdpbmcpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLm1vZGVsLnRyaWdnZXIoXCJjbGlja2VkXCIsIHRoaXMubW9kZWwpO1xuXHR9LFxufSk7XG5cblBhZ2UuVmlld3MuUXVldWVJdGVtID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2Jvb2t1cGxvYWQubnVualwiKS5xdWV1ZUl0ZW0sXG5cblx0Y2xhc3NOYW1lOiBcImJvb2stcXVldWUtaXRlbSBoLWZsZXggZmxleC12ZXJ0LWNlbnRyZVwiLFxuXG5cdG1vZGVsRXZlbnRzOiB7XG5cdFx0XCJ1cGxvYWQ6cHJvZ3Jlc3NcIjogXCJ1cGxvYWRQcm9ncmVzc1wiLFxuXHRcdFwiUGFnZS5TdGFydFVwbG9hZFwiOiBcInN0YXJ0VXBsb2FkXCIsXG5cdH0sXG5cblx0dWk6IHtcblx0XHRzcGlubmVyOiBcInNwYW4uc3Bpbm5lci1pY29uXCIsXG5cdFx0dmFsaWQ6IFwic3Bhbi52YWxpZFwiLFxuXHRcdGludmFsaWQ6IFwic3Bhbi5pbnZhbGlkXCIsXG5cdH0sXG5cblx0c3RhcnRVcGxvYWQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkuc3Bpbm5lci5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cblx0XHR0aGlzLnhociA9IHRoaXMubW9kZWwudXBsb2FkKHsgdGltZW91dDogMTAwMCAqIDYwICogMzAsIHN1Y2Nlc3M6IHRoaXMudXBsb2FkU3VjY2Vzcy5iaW5kKHRoaXMpLCBlcnJvcjogdGhpcy51cGxvYWRFcnJvci5iaW5kKHRoaXMpIH0pO1xuXG5cdFx0TlByb2dyZXNzLmNvbmZpZ3VyZSh7IHBhcmVudDogdGhpcy4kZWwuZ2V0UGF0aCgpLCBzaG93U3Bpbm5lcjogZmFsc2UsIHRyaWNrbGU6IGZhbHNlIH0pLnN0YXJ0KDAuMCk7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy54aHIpXG5cdFx0XHR0aGlzLnhoci5hYm9ydCgpO1xuXG5cdFx0TlByb2dyZXNzLnNldCgxMDApO1xuXHR9LFxuXG5cdHVwbG9hZFN1Y2Nlc3M6IGZ1bmN0aW9uKCkge1xuXHRcdE5Qcm9ncmVzcy5zZXQoMTAwKTtcblxuXHRcdHRoaXMudWkuc3Bpbm5lci5hZGRDbGFzcyhcImhpZGVcIik7XG5cblx0XHR0aGlzLm1vZGVsLnRyaWdnZXIoUGFnZS5FdmVudHMuVXBsb2FkRG9uZSk7XG5cblx0XHR0aGlzLm1vZGVsLnNldCh7IHN0YXRlOiBCb29rU3RhdGVzLkNvbXBsZXRlIH0pO1xuXHR9LFxuXG5cdHVwbG9hZEVycm9yOiBmdW5jdGlvbihtb2RlbCwgeGhyKSB7XG5cdFx0TlByb2dyZXNzLnNldCgxMDApO1xuXG5cdFx0Y29uc3QgYW5zd2VyID0gQXBwLnBhcnNlUmVzcG9uc2UoeGhyKTtcblxuXHRcdHRoaXMudWkuc3Bpbm5lci5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5pbnZhbGlkLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblxuXHRcdHRoaXMubW9kZWwuc2V0KHsgdXBsb2FkRXJyb3I6IFwiVXBsb2FkIEVycm9yXCIgfSk7XG5cblx0XHR0aXBweSgkKFwic3Bhbi5pbnZhbGlkXCIsIHRoaXMuZWwpLmdldCgwKSwge1xuXHRcdFx0YW5pbWF0aW9uOiBcImZhZGVcIixcblx0XHRcdHBsYWNlbWVudDogXCJyaWdodFwiLFxuXHRcdFx0YXJyb3c6IHRydWUsXG5cdFx0XHRpbnRlcmFjdGl2ZTogdHJ1ZSxcblx0XHRcdGNvbnRlbnQ6IGA8ZGl2PlRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSB1cGxvYWRpbmcgdGhpcyBib29rOjwvZGl2Pjxici8+PGRpdj4keyhhbnN3ZXIuZGV0YWlsIHx8IGFuc3dlci5pbmZvKX08L2Rpdj48YnIvPlxuXHRcdFx0XHQ8YnV0dG9uIGNsYXNzPSd0aW55IHN1Y2Nlc3MgYnV0dG9uJz5UcnkgQWdhaW48L2J1dHRvbj4gPGJ1dHRvbiBjbGFzcz0ndGlueSBhbGVydCBidXR0b24nPlNraXAgQm9vazwvYnV0dG9uPmAsXG5cdFx0XHRvblNob3duOiAoKSA9PiB7XG5cdFx0XHRcdCQoXCJidXR0b24udGlueS5hbGVydFwiKS5vbihcImNsaWNrXCIsICgpID0+IHtcblx0XHRcdFx0XHRoaWRlQWxsKCk7XG5cdFx0XHRcdFx0dGhpcy5tb2RlbC50cmlnZ2VyKFwiZGVzdHJveVwiLCB0aGlzLm1vZGVsKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0JChcImJ1dHRvbi50aW55LnN1Y2Nlc3NcIikub24oXCJjbGlja1wiLCAoKSA9PiB7XG5cdFx0XHRcdFx0aGlkZUFsbCgpO1xuXHRcdFx0XHRcdHRoaXMudWkuaW52YWxpZC5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHRcdFx0dGhpcy5tb2RlbC51bnNldChcInVwbG9hZEVycm9yXCIpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0fSk7XG5cblx0XHR0aGlzLm1vZGVsLnRyaWdnZXIoUGFnZS5FdmVudHMuVXBsb2FkRG9uZSk7XG5cdH0sXG5cblx0dXBsb2FkUHJvZ3Jlc3M6IGZ1bmN0aW9uKHBlcmMpIHtcblx0XHROUHJvZ3Jlc3Muc2V0KHBlcmMgLyAxMDApO1xuXHR9LFxufSk7XG5cblBhZ2UuVmlld3MuRG9uZUl0ZW0gPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImJvb2stZG9uZS1pdGVtXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvYm9va3VwbG9hZC5udW5qXCIpLmRvbmVJdGVtLFxuXG5cdG1vZGVsRXZlbnRzOiB7XG5cdFx0XCJjaGFuZ2U6cGFyc2luZ1wiOiBcImNoZWNrU3RhdGVcIixcblx0fSxcblxuXHR1aToge1xuXHRcdHNwaW5uZXI6IFwic3Bhbi5zcGlubmVyLWljb25cIixcblx0XHR2YWxpZDogXCJzcGFuLnZhbGlkXCIsXG5cdFx0aW52YWxpZDogXCJzcGFuLmludmFsaWRcIixcblx0fSxcblxuXHRjaGVja1N0YXRlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJwYXJzaW5nXCIpKSB7IHRoaXMudWkuc3Bpbm5lci5yZW1vdmVDbGFzcyhcImhpZGVcIik7IH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMudWkuc3Bpbm5lci5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJlcnJvclwiKSlcblx0XHRcdFx0dGhpcy51aS5pbnZhbGlkLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy51aS52YWxpZC5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0fVxuXHR9LFxufSk7XG5cblBhZ2UuVmlld3MuRWRpdG9yID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6IFwiZGl2XCIsXG5cdGNsYXNzTmFtZTogXCJib29rLXVwbG9hZC1lZGl0b3JcIixcblx0cHJvY2Vzc2luZzogZmFsc2UsXG5cblx0dWk6IHtcblx0XHRmaWxlSW5wdXQ6IFwiLnVwbG9hZC1pbnB1dFwiLFxuXG5cdFx0bmV4dEJ1dHRvbjogXCJhLm5leHQtYm9va1wiLFxuXHRcdHNraXBCdXR0b246IFwiYS5za2lwLWJvb2tcIixcblx0XHRkZWxldGVFeGlzdGluZzogXCJhLmRlbC1leGlzdGluZ1wiLFxuXHRcdG1lc3NhZ2U6IFwic3Bhbi5tZXNzYWdlXCIsXG5cdFx0d29ya2luZ1NwaW5uZXI6IFwic3Bhbi5zcGlubmVyLXdvcmtpbmdcIixcblxuXHRcdGNvdmVyOiBcIi5ib29rLWNvdmVyLWltYWdlXCIsXG5cdFx0cHVibGlzaGVyOiBcIi5wdWJsaXNoZXJUZXh0XCIsXG5cdFx0YWN0aXZhdGlvbjogXCJpbnB1dFtuYW1lPSdhY3RpdmF0aW9uJ11cIixcblx0XHRhY3RpdmF0aW9uT3ZlcmxheTogXCJkaXYuaW5wdXQtb3ZlcmxheVwiLFxuXHRcdHB1cmNoYXNlT3ZlcnJpZGU6IFwiaW5wdXRbbmFtZT0ncHVyY2hhc2VPdmVycmlkZSddXCIsXG5cdFx0YXNzaWduQWxsOiBcImlucHV0W25hbWU9J2Fzc2lnbkFsbCddXCIsXG5cdFx0Z3JvdXBzOiBcInNlbGVjdFtuYW1lPSdncm91cHMnXVwiLFxuXHRcdGFsbG93UHJpbnQ6IFwiaW5wdXRbbmFtZT0nYWxsb3dQcmludCddXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkubmV4dEJ1dHRvblwiOiBcIm5leHRCb29rXCIsXG5cdFx0XCJjbGljayBAdWkuc2tpcEJ1dHRvblwiOiBcInNraXBCb29rXCIsXG5cdFx0XCJjbGljayBAdWkuZGVsZXRlRXhpc3RpbmdcIjogXCJkZWxldGVFeGlzdGluZ1wiLFxuXG5cdFx0XCJjbGljayBsYWJlbCBAdWkuYWN0aXZhdGlvbk92ZXJsYXlcIjogXCJjbGVhckJveFwiLFxuXG5cdFx0XCJkcmFnZW50ZXIgLnVwbG9hZC1kcm9wLWJsb2NrXCI6IFwibm9vcFwiLFxuXHRcdFwiZHJhZ292ZXIgLnVwbG9hZC1kcm9wLWJsb2NrXCI6IFwibm9vcFwiLFxuXG5cdFx0XCJjaGFuZ2UgaW5wdXQudXBsb2FkLWlucHV0XCI6IFwiZmlsZUNob3NlblwiLFxuXHRcdFwiZHJvcCAudXBsb2FkLWRyb3AtYmxvY2tcIjogXCJmaWxlRHJvcHBlZFwiLFxuXG5cdFx0XCJjaGFuZ2UgQHVpLmFjdGl2YXRpb25cIjogXCJjaGFuZ2VEYXRlXCIsXG5cdFx0XCJjbGljayBAdWkuYXNzaWduQWxsXCI6IFwiYXNzaWduQWxsXCIsXG5cdH0sXG5cblx0Y29sbGVjdGlvbkV2ZW50czoge1xuXHRcdGFkZDogXCJuZXdNb2RlbFwiLFxuXHRcdGNsaWNrZWQ6IFwianVtcFRvTW9kZWxcIixcblx0fSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRoYXNHcm91cHM6ICgpID0+ICF0aGlzLm1vZGVsLmlzTmV3KCkgJiYgdGhpcy5tb2RlbC5nZXQoXCJncm91cHNcIikgIT09IG51bGwgJiYgXy5pc0FycmF5KHRoaXMubW9kZWwuZ2V0KFwiZ3JvdXBzXCIpKSxcblx0XHRcdHByaW50T3ZlcnJpZGU6ICgpID0+IHtcblx0XHRcdFx0Y29uc3QgdXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cblx0XHRcdFx0cmV0dXJuIHJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAuYm9va3MucHJpbnRPdmVycmlkZSwgdXNlcik7XG5cdFx0XHR9LFxuXHRcdH07XG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0Xy5leHRlbmQodGhpcywgUGFnZS5NaXhpbnMuQm9va0RyYWdnZXIpO1xuXG5cdFx0UGFnZS5jc3YgPSBuZXcgUGFnZS5Db2xsZWN0aW9ucy5DU1YoKTtcblxuXHRcdHRoaXMuZGVsZWdhdGVFdmVudHMoKTtcblx0fSxcblxuXHRnZXRUZW1wbGF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwpXG5cdFx0XHRyZXR1cm4gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9ib29rdXBsb2FkLWVkaXRvci5udW5qXCIpO1xuXHRcdHJldHVybiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2Jvb2t1cGxvYWQubnVualwiKS5ub0Jvb2tzO1xuXHR9LFxuXG5cdG5ld01vZGVsOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdGlmICh0aGlzLm1vZGVsIHx8IHRoaXMucHJvY2Vzc2luZylcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMubG9hZE1vZGVsKG1vZGVsKTtcblx0fSxcblxuXHRqdW1wVG9Nb2RlbDogZnVuY3Rpb24obW9kZWwpIHtcblx0XHQvL2lmKHRoaXMubW9kZWwgfHwgdGhpcy5wcm9jZXNzaW5nKVxuXHRcdC8vXHRyZXR1cm47XG5cblx0XHRpZiAodGhpcy5tb2RlbClcblx0XHRcdHRoaXMubW9kZWwuc2V0KHsgc3RhdGU6IEJvb2tTdGF0ZXMuTmV3IH0pO1xuXG5cdFx0dGhpcy5sb2FkTW9kZWwobW9kZWwpO1xuXHR9LFxuXG5cdGNoZWNrRm9yTmV3TW9kZWw6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMucHJvY2Vzc2luZyA9IGZhbHNlO1xuXHRcdHRoaXMudWkud29ya2luZ1NwaW5uZXIuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkubmV4dEJ1dHRvbi5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xuXG5cdFx0Ly8gTG9vayBmb3IgYSBuZXcgbW9kZWwgdG8gZGlzcGxheVxuXHRcdGNvbnN0IG1vZGVscyA9IF8uZmluZCh0aGlzLmNvbGxlY3Rpb24ubW9kZWxzLCBpdGVtID0+IGl0ZW0gJiYgaXRlbS5nZXQoXCJzdGF0ZVwiKSA9PT0gQm9va1N0YXRlcy5OZXcpO1xuXG5cdFx0aWYgKG1vZGVscykge1xuXHRcdFx0dGhpcy5sb2FkTW9kZWwobW9kZWxzKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHQvLyBOb3RoaW5nIG1vcmUgdG8gZG8gZm9yIG5vdy5cblx0XHRcdGlmICh0aGlzLm1vZGVsKVxuXHRcdFx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcodGhpcy5tb2RlbCk7XG5cblx0XHRcdGlmICh0aGlzLmltZylcblx0XHRcdFx0dGhpcy5pbWcuZGVzdHJveSgpO1xuXHRcdFx0dGhpcy5tb2RlbCA9IG51bGw7XG5cdFx0XHR0aGlzLnJlbmRlcigpO1xuXHRcdH1cblx0fSxcblxuXHRsb2FkTW9kZWw6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0dGhpcy5wcm9jZXNzaW5nID0gZmFsc2U7XG5cdFx0aWYgKHRoaXMubW9kZWwpXG5cdFx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcodGhpcy5tb2RlbCk7XG5cblx0XHR0aGlzLm1vZGVsID0gbW9kZWw7XG5cdFx0dGhpcy5tb2RlbC5zZXQoeyBzdGF0ZTogQm9va1N0YXRlcy5SZXZpZXdpbmcgfSk7XG5cblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJwYXJzZWRcIikpIHsgdGhpcy5ib29rUGFyc2VkKCk7IH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwgUGFnZS5FdmVudHMuQm9va1BhcnNlZCwgdGhpcy5ib29rUGFyc2VkLmJpbmQodGhpcykpO1xuXHRcdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCBcImludmFsaWRcIiwgdGhpcy5yZW5kZXJFcnJvcnMuYmluZCh0aGlzKSk7XG5cdFx0XHR0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsIFwicmVtb3ZlIHJlbW92ZWRcIiwgdGhpcy5za2lwQm9vay5iaW5kKHRoaXMpKTtcblx0XHRcdHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwgXCJjaGFuZ2U6Y292ZXJcIiwgdGhpcy5jaGFuZ2VDb3Zlci5iaW5kKHRoaXMpKTtcblx0XHRcdHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwgXCJvdmVycmlkZVwiLCB0aGlzLmRlbGV0ZUV4aXN0aW5nLmJpbmQodGhpcykpO1xuXHRcdFx0aWYgKCF0aGlzLm1vZGVsLmdldChcInBhcnNpbmdcIikpXG5cdFx0XHRcdG1vZGVsLnByb2Nlc3NCb29rKCk7XG5cdFx0fVxuXHR9LFxuXG5cdGJvb2tQYXJzZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudGVtcGxhdGUgPSByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2Jvb2t1cGxvYWQtZWRpdG9yLm51bmpcIik7XG5cblx0XHR0aGlzLnJlbmRlcigpO1xuXHR9LFxuXG5cdGNoYW5nZUNvdmVyOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIXRoaXMuaW1nIHx8ICF0aGlzLm1vZGVsKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0aWYgKHRoaXMubW9kZWwuaGFzKFwiY292ZXJcIikpXG5cdFx0XHR0aGlzLmltZy5zZXRJbWFnZShcImRhdGE6XCIgKyB0aGlzLm1vZGVsLmdldChcImNvdmVyLWZvcm1hdFwiKSArIFwiO2Jhc2U2NCxcIiArIHRoaXMubW9kZWwuZ2V0KFwiY292ZXJcIikpO1xuXHR9LFxuXG5cdGNoYW5nZURhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLnVpLmFjdGl2YXRpb24udmFsKCkpXG5cdFx0XHR0aGlzLnVpLmFjdGl2YXRpb25PdmVybGF5LnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnVpLmFjdGl2YXRpb25PdmVybGF5LmFkZENsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRhc3NpZ25BbGw6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZ3JvdXBzLm1vZGVsLnNldCh7IGRpc2FibGVkOiB0aGlzLnVpLmFzc2lnbkFsbC5wcm9wKFwiY2hlY2tlZFwiKSB9KTtcblx0fSxcblxuXHRvbkJlZm9yZVJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuaW1nKVxuXHRcdFx0dGhpcy5pbWcuZGVzdHJveSgpO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuZ3JvdXBzKVxuXHRcdFx0dGhpcy5ncm91cHMuZGVzdHJveSgpO1xuXHR9LFxuXG5cdG9uRG9tUmVmcmVzaDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLm1vZGVsKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5pbWcgPSBJbWFnZUNob29zZXIuY3JlYXRlKCQoXCIuYm9vay1jb3Zlci1pbWFnZVwiLCB0aGlzLmVsKSwgeyB0cmFuc2NvZGU6IHRydWUsIHBhc3NpdmU6IHRydWUgfSk7XG5cblx0XHRpZiAodGhpcy5pbWcgJiYgdGhpcy5tb2RlbCAmJiB0aGlzLm1vZGVsLmhhcyhcImNvdmVyXCIpKVxuXHRcdFx0dGhpcy5pbWcuc2V0SW1hZ2UoXCJkYXRhOlwiICsgdGhpcy5tb2RlbC5nZXQoXCJjb3Zlci1mb3JtYXRcIikgKyBcIjtiYXNlNjQsXCIgKyB0aGlzLm1vZGVsLmdldChcImNvdmVyXCIpKTtcblxuXHRcdGNvbnN0IG8gPSB7XG5cdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdHNvcnQ6IHRydWUsXG5cdFx0XHRzZXJ2ZXI6IHtcblx0XHRcdFx0a2V5OiBcImNvZGVcIixcblx0XHRcdFx0dmFsdWU6IFwibmFtZVwiLFxuXHRcdFx0XHRmZXRjaDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvZ3JvdXBzXCIsXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdHBhZ2VTaXplOiAzMCxcblx0XHRcdFx0aW5maW5pdGU6IHRydWUsXG5cdFx0XHR9LFxuXHRcdFx0cGxhY2Vob2xkZXI6IFwiTm8gZ3JvdXBzIHNlbGVjdGVkXCIsXG5cdFx0fTtcblxuXG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwiZ3JvdXBzXCIpICYmIHRoaXMubW9kZWwuZ2V0KFwiZ3JvdXBzXCIpLmxlbmd0aCkge1xuXHRcdFx0by5zZXJ2ZXIuZGVmYXVsdCA9IHtcblx0XHRcdFx0ZmV0Y2g6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2dyb3Vwc1wiLFxuXHRcdFx0XHRwYXJhbXM6IHsgaWQ6IHRoaXMubW9kZWwuZ2V0KFwiZ3JvdXBzXCIpIH0sXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdHRoaXMuZ3JvdXBzID0gbmV3IFNlbGVjdHJhKG8pO1xuXG5cdFx0dGhpcy5ncm91cHMuc2hvdyh7IGVsOiB0aGlzLnVpLmdyb3VwcyB9KTtcblxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwLCBuby1uZXdcblx0XHRuZXcgcGlrYWRheSh7XG5cdFx0XHRmaWVsZDogdGhpcy51aS5hY3RpdmF0aW9uLmdldCgwKSxcblx0XHRcdGZvcm1hdDogXCJERCBNTU1NIFlZWVlcIixcblx0XHR9KTtcblxuXHRcdGlmICh0aGlzLm1vZGVsICYmIHRoaXMubW9kZWwuZ2V0KFwiYWN0aXZhdGlvbkRhdGVcIikpIHtcblx0XHRcdHRoaXMudWkuYWN0aXZhdGlvbi52YWwobW9tZW50LnVuaXgodGhpcy5tb2RlbC5nZXQoXCJhY3RpdmF0aW9uRGF0ZVwiKSkuZm9ybWF0KFwiREQgTU1NTSBZWVlZXCIpKTtcblx0XHRcdHRoaXMudWkuYWN0aXZhdGlvbk92ZXJsYXkucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblx0fSxcblxuXHRza2lwQm9vazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKHRoaXMubW9kZWwpO1xuXHRcdHRoaXMuY29sbGVjdGlvbi5yZW1vdmUodGhpcy5tb2RlbCk7XG5cdFx0dGhpcy5jaGVja0Zvck5ld01vZGVsKCk7XG5cdH0sXG5cblx0bmV4dEJvb2s6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHJlc3QgPSAoKSA9PiB7XG5cdFx0XHQvLyBTaG93IGxvYWRlclxuXHRcdFx0dGhpcy51aS53b3JraW5nU3Bpbm5lci5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLnVpLm1lc3NhZ2UudGV4dChcIlByZXBhcmluZyBib29rIGRhdGEgZm9yIHVwbG9hZFwiKS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLnVpLm5leHRCdXR0b24uYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblxuXHRcdFx0dGhpcy5jYXB0dXJlTXB1YkZpZWxkcygpLnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5tb2RlbCAmJiB0aGlzLm1vZGVsLmlzVmFsaWQoKSkge1xuXHRcdFx0XHRcdHRoaXMudWkubWVzc2FnZS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHRcdFx0dGhpcy5xdWV1ZUJvb2soKTtcblx0XHRcdFx0XHR0aGlzLmNoZWNrRm9yTmV3TW9kZWwoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHR0aGlzLnJlbmRlckVycm9ycygpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0pLmNhdGNoKGVyciA9PiB7XG5cdFx0XHRcdGlmICghc2V0dGluZ3MuZGVidWcgfHwgc2V0dGluZ3MucmVwb3J0RXJyb3JzKVxuXHRcdFx0XHRcdHJheWd1bihcInNlbmRcIiwgZXJyKTtcblx0XHRcdFx0dGhpcy51aS53b3JraW5nU3Bpbm5lci5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHRcdHRoaXMudWkubWVzc2FnZS50ZXh0KFwiVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHByZXBhcmluZyB0aGUgYm9vayBmb3IgdXBsb2FkOiBcIiArIGVyci5tZXNzYWdlKS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHRcdHRoaXMudWkubmV4dEJ1dHRvbi5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xuXHRcdFx0fSk7XG5cdFx0fTtcblxuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcIm92ZXJyaWRlRXJyb3JcIikpIHtcblx0XHRcdGNvbnN0IG1vZGFsID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmFsIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJy8+IEJvb2sgUmVwbGFjZW1lbnQgQ29uZmlybWF0aW9uXCIsXG5cdFx0XHRcdGJvZHk6IGA8cD48c3Ryb25nPlRISVMgQ0FOTk9UIEJFIFVORE9ORSBBTkQgSEFTIE1BSk9SIFJBTUlGSUNBVElPTlMuIElGIFlPVSBBUkUgVU5TVVJFLCBXQUxLIEFXQVkuIEpVU1QgV0FMSy4uLkFXQVkuPC9zdHJvbmc+PC9wPlxuXHRcdFx0XHRcdDxwPkp1c3QgdG8gY29uZmlybTogcGxlYXNlIGNsaWNrIHRoZSBib3hlcyBiZWxvdyB0byBpbmRpY2F0ZSB5b3UgdW5kZXJzdGFuZCB3aGF0IGlzIGFib3V0IHRvIGhhcHBlbi48L3A+PHA+XG5cdFx0XHRcdFx0PGxhYmVsPjxpbnB1dCB0eXBlPSdjaGVja2JveCcgbmFtZT0ndW5kZXJzdGFuZCc+IFllcywgSSB1bmRlcnN0YW5kIHRoYXQgY29udGludWluZyB3aXRoIHRoaXMgd2lsbCA8c3Ryb25nPkFOTklISUxBVEU8L3N0cm9uZz4gdGhlIGV4aXN0aW5nIGJvb2sgYW5kIGFsbCBpdHMgY29udGVudHMuPC9sYWJlbD5cblx0XHRcdFx0XHQ8YnIvPjxsYWJlbD48aW5wdXQgdHlwZT0nY2hlY2tib3gnPiBJIHVuZGVyc3RhbmQgdGhhdCBldmVyeW9uZSB0aGF0IGhhcyB0aGUgYm9vayBvbiB0aGVpciBkZXZpY2VzIHdpbGwgPHN0cm9uZz5JTlNUQU5UTFk8L3N0cm9uZz4gYW5kIHBlcm1hbmVudGx5IGxvc2UgYWNjZXNzIHRvIGl0LjwvbGFiZWw+XG5cdFx0XHRcdFx0PGJyLz48bGFiZWw+PGlucHV0IHR5cGU9J2NoZWNrYm94Jz4gSSB1bmRlcnN0YW5kIGFuZCBhZ3JlZSwgYW5kIEkgYWNjZXB0IHRoYXQgSSB3aWxsIGJlIGhlbGQgPHN0cm9uZz5DT01QTEVURUxZIEFUIEZBVUxUPC9zdHJvbmc+IGlmIEkgYW0gbWFraW5nIGEgbWlzdGFrZS48L2xhYmVsPmAsXG5cdFx0XHRcdGN1c3RvbU9LOiBcIllFUy4gREVTVFJPWSB0aGlzIGJvb2sgYW5kIGV2ZXJ5dGhpbmcgaW4gaXQgRk9SRVZFUlwiLFxuXHRcdFx0XHRoaWRlQnV0dG9uczogW1wib2tcIl0sXG5cdFx0XHRcdHdhcm5pbmc6IHRydWUsXG5cdFx0XHR9KTtcblxuXHRcdFx0bW9kYWwub24oXCJidXR0b246b2tcIiwgKCkgPT4ge1xuXHRcdFx0XHRyZXN0KCk7XG5cdFx0XHR9LCB0aGlzKTtcblxuXHRcdFx0bW9kYWwuc2hvdygpO1xuXG5cdFx0XHQkKFwiaW5wdXRbdHlwZT0nY2hlY2tib3gnXVwiLCBtb2RhbC5lbCkub24oXCJjaGFuZ2VcIiwgKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBjaGVja3MgPSAkKFwiaW5wdXRbdHlwZT0nY2hlY2tib3gnXVwiLCBtb2RhbC5lbCk7XG5cdFx0XHRcdGlmIChfLmV2ZXJ5KGNoZWNrcywgeCA9PiAkKHgpLnByb3AoXCJjaGVja2VkXCIpKSlcblx0XHRcdFx0XHRtb2RhbC5zaG93QnV0dG9ucygpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGVsc2UgeyByZXN0KCk7IH1cblx0fSxcblxuXHRkZWxldGVFeGlzdGluZzogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgbW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmFsIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJy8+IEJvb2sgUmVwbGFjZW1lbnQgV2FybmluZ1wiLFxuXHRcdFx0Ym9keTogYDxwPllvdSBjYW4gY2hvb3NlIHRvIHJlcGxhY2UgdGhlIGV4aXN0aW5nIGJvb2sgbWF0Y2hpbmcgdGhpcyBJU0JOLCB3aXRoIHRoaXMgdmVyc2lvbi48L3A+PHA+XG5cdFx0XHRcdDxzdHJvbmc+V0FSTklORzo8L3N0cm9uZz4gVGhpcyB3aWxsIGNvbXBsZXRlbHkgcmVwbGFjZSB0aGUgb2xkIGJvb2suIEFsbCBoaWdobGlnaHRzLCBhbm5vdGF0aW9ucyBhbmQgcmVzb3VyY2VzIGluIHRoZSBvbGQgYm9vayB3aWxsIERJU0FQUEVBUi48L3A+XG5cdFx0XHRcdDxwPlRvIGNvbnRpbnVlLCBwbGVhc2UgY2xpY2sgdGhlIGJveGVzIGJlbG93IHRvIGluZGljYXRlIHlvdSB1bmRlcnN0YW5kLjwvcD48cD48bGFiZWw+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSd1bmRlcnN0YW5kJz4gWWVzLCBJIHVuZGVyc3RhbmQgdGhhdCBjb250aW51aW5nIHdpdGggdGhpcyB3aWxsXG5cdFx0XHRcdDxzdHJvbmc+QU5OSUhJTEFURTwvc3Ryb25nPiB0aGUgZXhpc3RpbmcgYm9vayBhbmQgYWxsIGl0cyBjb250ZW50cy48L2xhYmVsPjxici8+PGxhYmVsPjxpbnB1dCB0eXBlPSdjaGVja2JveCc+IEkgdW5kZXJzdGFuZCB0aGF0IGV2ZXJ5b25lIHRoYXQgaGFzIHRoZSBib29rIG9uIHRoZWlyIGRldmljZXMgd2lsbFxuXHRcdFx0XHQ8c3Ryb25nPklOU1RBTlRMWTwvc3Ryb25nPiBhbmQgcGVybWFuZW50bHkgbG9zZSBhY2Nlc3MgdG8gaXQuPC9sYWJlbD48YnIvPjxsYWJlbD48aW5wdXQgdHlwZT0nY2hlY2tib3gnPiBJIHVuZGVyc3RhbmQgYW5kIGFncmVlLCBhbmQgSSBhY2NlcHQgdGhhdCBJIHdpbGwgYmUgaGVsZFxuXHRcdFx0XHQ8c3Ryb25nPkNPTVBMRVRFTFkgQVQgRkFVTFQ8L3N0cm9uZz4gaWYgSSBhbSBtYWtpbmcgYSBtaXN0YWtlLjwvbGFiZWw+YCxcblx0XHRcdGN1c3RvbU9LOiBcIllFUy4gREVTVFJPWSB0aGlzIGJvb2sgYW5kIGV2ZXJ5dGhpbmcgaW4gaXQgRk9SRVZFUlwiLFxuXHRcdFx0aGlkZUJ1dHRvbnM6IFtcIm9rXCJdLFxuXHRcdFx0d2FybmluZzogdHJ1ZSxcblx0XHR9KTtcblxuXHRcdG1vZGFsLm9uKFwiYnV0dG9uOmNhbmNlbFwiLCB0aGlzLnNraXBCb29rLmJpbmQodGhpcyksIHRoaXMpO1xuXG5cdFx0bW9kYWwub24oXCJidXR0b246b2tcIiwgKCkgPT4ge1xuXHRcdFx0dGhpcy5tb2RlbC5zZXQoXCJvdmVycmlkZUVycm9yXCIsIHRydWUpO1xuXHRcdFx0dGhpcy5tb2RlbC51bnNldChcImVycm9yXCIpO1xuXHRcdFx0dGhpcy5sb2FkTW9kZWwodGhpcy5tb2RlbCk7XG5cdFx0fSwgdGhpcyk7XG5cblx0XHRtb2RhbC5zaG93KCk7XG5cblx0XHQkKFwiaW5wdXRbdHlwZT0nY2hlY2tib3gnXVwiLCBtb2RhbC5lbCkub24oXCJjaGFuZ2VcIiwgKCkgPT4ge1xuXHRcdFx0Y29uc3QgY2hlY2tzID0gJChcImlucHV0W3R5cGU9J2NoZWNrYm94J11cIiwgbW9kYWwuZWwpO1xuXHRcdFx0aWYgKF8uZXZlcnkoY2hlY2tzLCB4ID0+ICQoeCkucHJvcChcImNoZWNrZWRcIikpKVxuXHRcdFx0XHRtb2RhbC5zaG93QnV0dG9ucygpO1xuXHRcdH0pO1xuXHR9LFxuXG5cdHF1ZXVlQm9vazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5tb2RlbC5zZXQoeyBzdGF0ZTogQm9va1N0YXRlcy5RdWV1ZWQgfSk7XG5cdH0sXG5cblx0Y2FwdHVyZU1wdWJGaWVsZHM6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLnVpLmFjdGl2YXRpb24udmFsKCkpXG5cdFx0XHR0aGlzLm1vZGVsLnNldCh7IGFjdGl2YXRpb25EYXRlOiBtb21lbnQodGhpcy51aS5hY3RpdmF0aW9uLnZhbCgpLCBcIkREIE1NTSBZWVlZXCIpLnVuaXgoKSB9KTtcblxuXHRcdGlmIChzZXR0aW5ncy5ib29rVG9rZW5Nb2RlKVxuXHRcdFx0dGhpcy5tb2RlbC5zZXQoeyBwdXJjaGFzZU92ZXJyaWRlOiBCb29sZWFuKHRoaXMudWkucHVyY2hhc2VPdmVycmlkZS5wcm9wKFwiY2hlY2tlZFwiKSkgfSk7XG5cblx0XHRpZiAodGhpcy51aS5hc3NpZ25BbGwucHJvcChcImNoZWNrZWRcIikpXG5cdFx0XHR0aGlzLm1vZGVsLnNldCh7IGdyb3VwczogbnVsbCB9KTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLm1vZGVsLnNldCh7IGdyb3VwczogSlNPTi5zdHJpbmdpZnkodGhpcy51aS5ncm91cHMudmFsKCkgfHwgW10pIH0pO1xuXG5cdFx0Y29uc3QgdXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cdFx0aWYgKHJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAuYm9va3MucHJpbnRPdmVycmlkZSwgdXNlcikpXG5cdFx0XHR0aGlzLm1vZGVsLnNldCh7IGFsbG93UHJpbnQ6IHRoaXMudWkuYWxsb3dQcmludC5wcm9wKFwiY2hlY2tlZFwiKSB9KTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLm1vZGVsLnNldCh7IGFsbG93UHJpbnQ6IHRoaXMubW9kZWwuZ2V0KFwibWV0YWRhdGFcIikuYWxsb3dQcmludCB8fCBmYWxzZSB9KTtcblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0fSxcblxuXHRyZW5kZXJFcnJvcnM6IGZ1bmN0aW9uKCkge1xuXHRcdCQoXCIuZXJyb3JcIiwgdGhpcy5lbCkucmVtb3ZlKCk7XG5cdFx0dGhpcy51aS53b3JraW5nU3Bpbm5lci5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5tZXNzYWdlLnRleHQoXCJUaGVyZSB3ZXJlIHNvbWUgZXJyb3JzLCBhbmQgdGhlIGJvb2sgd2FzIG5vdCBxdWV1ZWRcIikucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkubmV4dEJ1dHRvbi5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xuXG5cdFx0Xy5lYWNoKHRoaXMubW9kZWwudmFsaWRhdGlvbkVycm9yLCAoaXRlbSwga2V5KSA9PiB7XG5cdFx0XHRpZiAoIXRoaXMudWlba2V5XSB8fCAhdGhpcy51aVtrZXldLnBhcmVudClcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR0aGlzLnVpW2tleV0ucGFyZW50KCkuYXBwZW5kKFwiPHNwYW4gY2xhc3M9J2Vycm9yJz5cIiArIGl0ZW0gKyBcIjwvc3Bhbj5cIik7XG5cdFx0XHR0aGlzLnVpW2tleV0ub25lKFwiY2hhbmdlIGtleXVwXCIsIHRoaXMuY2xlYXJFcnJvcik7XG5cdFx0fSk7XG5cdH0sXG5cblx0Y2xlYXJFcnJvcjogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0Y29uc3QgZWwgPSAkKGV2dC5jdXJyZW50VGFyZ2V0KTtcblx0XHRlbC5wYXJlbnQoKS5maW5kKFwiLmVycm9yXCIpLnJlbW92ZSgpO1xuXHR9LFxuXG5cdGNsZWFyQm94OiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0ZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRjb25zdCBlbCA9ICQoZXZ0LmN1cnJlbnRUYXJnZXQpO1xuXHRcdGVsLnNpYmxpbmdzKFwiaW5wdXRcIikudmFsKFwiXCIpO1xuXHRcdHRoaXMudWkuYWN0aXZhdGlvbk92ZXJsYXkuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gUGFnZS5WaWV3cy5MYXlvdXQ7Il19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\n\nvar CardModel = require(\"../../models/flashCards/cardModel\");\n\nmodule.exports = Backbone.Collection.extend({\n\tmodel: CardModel,\n\n\tinitialize: function initialize(models, options) {\n\t\tthis.deck = options.deck;\n\t},\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/flashCards/\" + encodeURIComponent(this.deck);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNhcmRDb2xsZWN0aW9uLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsInNldHRpbmdzIiwiQ2FyZE1vZGVsIiwibW9kdWxlIiwiZXhwb3J0cyIsIkNvbGxlY3Rpb24iLCJleHRlbmQiLCJtb2RlbCIsImluaXRpYWxpemUiLCJtb2RlbHMiLCJvcHRpb25zIiwiZGVjayIsInVybCIsInVybFJvb3QiLCJlbmNvZGVVUklDb21wb25lbnQiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjs7QUFFQSxJQUFNQyxXQUFXRCxRQUFRLGNBQVIsQ0FBakI7O0FBRUEsSUFBTUUsWUFBWUYsUUFBUSxtQ0FBUixDQUFsQjs7QUFFQUcsT0FBT0MsT0FBUCxHQUFpQkwsU0FBU00sVUFBVCxDQUFvQkMsTUFBcEIsQ0FBMkI7QUFDM0NDLFFBQU9MLFNBRG9DOztBQUczQ00sYUFBWSxvQkFBU0MsTUFBVCxFQUFpQkMsT0FBakIsRUFBMEI7QUFDckMsT0FBS0MsSUFBTCxHQUFZRCxRQUFRQyxJQUFwQjtBQUNBLEVBTDBDOztBQU8zQ0MsTUFBSyxlQUFXO0FBQ2YsU0FBT1gsU0FBU1ksT0FBVCxHQUFtQixzQkFBbkIsR0FBNENDLG1CQUFtQixLQUFLSCxJQUF4QixDQUFuRDtBQUNBO0FBVDBDLENBQTNCLENBQWpCIiwiZmlsZSI6ImNhcmRDb2xsZWN0aW9uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcblxuY29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuXG5jb25zdCBDYXJkTW9kZWwgPSByZXF1aXJlKFwiLi4vLi4vbW9kZWxzL2ZsYXNoQ2FyZHMvY2FyZE1vZGVsXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IENhcmRNb2RlbCxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihtb2RlbHMsIG9wdGlvbnMpIHtcblx0XHR0aGlzLmRlY2sgPSBvcHRpb25zLmRlY2s7XG5cdH0sXG5cblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvZmxhc2hDYXJkcy9cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLmRlY2spO1xuXHR9LFxufSk7XG4iXX0=",
    "\"use strict\";\n//const Backbone = require(\"backbone\");\n\n//const settings = require(\"app-settings\");\n\nvar DeckModel = require(\"../../models/flashCards/deckModel\");\nvar LazyCollection = require(\"../../../lib/lazyCollection\");\n\nmodule.exports = LazyCollection.extend({\n\tmodel: DeckModel,\n\n\t/*\turl: function() {\n \treturn settings.urlRoot + \"/api/1.0/flashCards\";\n }, */\n\n\tcomparator: function comparator(deckModel) {\n\t\treturn deckModel.has(\"title\") ? deckModel.get(\"title\") : 0;\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRlY2tDb2xsZWN0aW9uLmpzIl0sIm5hbWVzIjpbIkRlY2tNb2RlbCIsInJlcXVpcmUiLCJMYXp5Q29sbGVjdGlvbiIsIm1vZHVsZSIsImV4cG9ydHMiLCJleHRlbmQiLCJtb2RlbCIsImNvbXBhcmF0b3IiLCJkZWNrTW9kZWwiLCJoYXMiLCJnZXQiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7O0FBRUE7O0FBRUEsSUFBTUEsWUFBWUMsUUFBUSxtQ0FBUixDQUFsQjtBQUNBLElBQU1DLGlCQUFpQkQsUUFBUSw2QkFBUixDQUF2Qjs7QUFFQUUsT0FBT0MsT0FBUCxHQUFpQkYsZUFBZUcsTUFBZixDQUFzQjtBQUN0Q0MsUUFBT04sU0FEK0I7O0FBR3RDOzs7O0FBSUFPLGFBQVksb0JBQVNDLFNBQVQsRUFBb0I7QUFDL0IsU0FBT0EsVUFBVUMsR0FBVixDQUFjLE9BQWQsSUFBeUJELFVBQVVFLEdBQVYsQ0FBYyxPQUFkLENBQXpCLEdBQWtELENBQXpEO0FBQ0E7QUFUcUMsQ0FBdEIsQ0FBakIiLCJmaWxlIjoiZGVja0NvbGxlY3Rpb24uanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbi8vY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5cbi8vY29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuXG5jb25zdCBEZWNrTW9kZWwgPSByZXF1aXJlKFwiLi4vLi4vbW9kZWxzL2ZsYXNoQ2FyZHMvZGVja01vZGVsXCIpO1xuY29uc3QgTGF6eUNvbGxlY3Rpb24gPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL2xhenlDb2xsZWN0aW9uXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IExhenlDb2xsZWN0aW9uLmV4dGVuZCh7XG5cdG1vZGVsOiBEZWNrTW9kZWwsXG5cblx0LypcdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2ZsYXNoQ2FyZHNcIjtcblx0fSwgKi9cblxuXHRjb21wYXJhdG9yOiBmdW5jdGlvbihkZWNrTW9kZWwpIHtcblx0XHRyZXR1cm4gZGVja01vZGVsLmhhcyhcInRpdGxlXCIpID8gZGVja01vZGVsLmdldChcInRpdGxlXCIpIDogMDtcblx0fSxcbn0pO1xuIl19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\n\nvar Resource = require(\"../../models/manager/resourceModel.js\");\n\nmodule.exports = Backbone.PageableCollection.extend({\n\tmodel: Resource,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/resources?own=true&paged=true\";\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseRecords: function parseRecords(response) {\n\t\treturn response.rows;\n\t},\n\n\tparseState: function parseState(response) {\n\t\treturn { totalRecords: response.total };\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJlc291cmNlQ29sbGVjdGlvbi5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCJzZXR0aW5ncyIsIlJlc291cmNlIiwibW9kdWxlIiwiZXhwb3J0cyIsIlBhZ2VhYmxlQ29sbGVjdGlvbiIsImV4dGVuZCIsIm1vZGVsIiwidXJsIiwidXJsUm9vdCIsInN0YXRlIiwicGFnZVNpemUiLCJtb2RlIiwicXVlcnlQYXJhbXMiLCJzb3J0S2V5IiwicGFyc2VSZWNvcmRzIiwicmVzcG9uc2UiLCJyb3dzIiwicGFyc2VTdGF0ZSIsInRvdGFsUmVjb3JkcyIsInRvdGFsIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7O0FBRUEsSUFBTUMsV0FBV0QsUUFBUSxjQUFSLENBQWpCOztBQUVBLElBQU1FLFdBQVdGLFFBQVEsdUNBQVIsQ0FBakI7O0FBRUFHLE9BQU9DLE9BQVAsR0FBaUJMLFNBQVNNLGtCQUFULENBQTRCQyxNQUE1QixDQUFtQztBQUNuREMsUUFBT0wsUUFENEM7O0FBR25ETSxNQUFLLGVBQVc7QUFDZixTQUFPUCxTQUFTUSxPQUFULEdBQW1CLHdDQUExQjtBQUNBLEVBTGtEOztBQU9uREMsUUFBTztBQUNOQyxZQUFVO0FBREosRUFQNEM7O0FBV25EQyxPQUFNLFFBWDZDOztBQWFuREMsY0FBYTtBQUNaRixZQUFVLFVBREU7QUFFWkcsV0FBUztBQUZHLEVBYnNDOztBQWtCbkRDLGVBQWMsc0JBQVNDLFFBQVQsRUFBbUI7QUFDaEMsU0FBT0EsU0FBU0MsSUFBaEI7QUFDQSxFQXBCa0Q7O0FBc0JuREMsYUFBWSxvQkFBU0YsUUFBVCxFQUFtQjtBQUM5QixTQUFPLEVBQUVHLGNBQWNILFNBQVNJLEtBQXpCLEVBQVA7QUFDQTtBQXhCa0QsQ0FBbkMsQ0FBakIiLCJmaWxlIjoicmVzb3VyY2VDb2xsZWN0aW9uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcblxuY29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuXG5jb25zdCBSZXNvdXJjZSA9IHJlcXVpcmUoXCIuLi8uLi9tb2RlbHMvbWFuYWdlci9yZXNvdXJjZU1vZGVsLmpzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLlBhZ2VhYmxlQ29sbGVjdGlvbi5leHRlbmQoe1xuXHRtb2RlbDogUmVzb3VyY2UsXG5cblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvcmVzb3VyY2VzP293bj10cnVlJnBhZ2VkPXRydWVcIjtcblx0fSxcblxuXHRzdGF0ZToge1xuXHRcdHBhZ2VTaXplOiAzMCxcblx0fSxcblxuXHRtb2RlOiBcInNlcnZlclwiLFxuXG5cdHF1ZXJ5UGFyYW1zOiB7XG5cdFx0cGFnZVNpemU6IFwicGFnZVNpemVcIixcblx0XHRzb3J0S2V5OiBcInNvcnRCeVwiLFxuXHR9LFxuXG5cdHBhcnNlUmVjb3JkczogZnVuY3Rpb24ocmVzcG9uc2UpIHtcblx0XHRyZXR1cm4gcmVzcG9uc2Uucm93cztcblx0fSxcblxuXHRwYXJzZVN0YXRlOiBmdW5jdGlvbihyZXNwb25zZSkge1xuXHRcdHJldHVybiB7IHRvdGFsUmVjb3JkczogcmVzcG9uc2UudG90YWwgfTtcblx0fSxcbn0pO1xuIl19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar ContentManager = require(\"./views/manager/layout\");\nvar FlashCardManager = require(\"./views/flashCards/manager\");\n\nvar Module = module.exports = new Backbone.Marionette.Application();\n\n// Add intra-module routing\nModule.routing = function (App) {\n\tModule.Router = {\n\t\troutes: {\n\t\t\taddAssessment: \"addAssessment\",\n\t\t\taddEvent: \"addEvent\",\n\t\t\taddResource: \"addResource\",\n\t\t\tflashCards: \"showFlashCardManager\",\n\t\t\tmanage: \"showContentManager\"\n\t\t},\n\n\t\taddAssessment: function addAssessment() {\n\t\t\tvar view = new ContentManager();\n\n\t\t\tApp.loadView(view);\n\t\t\tview.assembleAssessment();\n\t\t\tApp.Router.navigate(\"content\", { trigger: false });\n\t\t},\n\n\t\taddEvent: function addEvent() {\n\t\t\tvar view = new ContentManager();\n\n\t\t\tApp.loadView(view);\n\t\t\tview.assembleEvent();\n\t\t\tApp.Router.navigate(\"content\", { trigger: false });\n\t\t},\n\n\t\taddResource: function addResource() {\n\t\t\tvar view = new ContentManager();\n\n\t\t\tApp.loadView(view);\n\t\t\tview.assembleResource();\n\t\t\tApp.Router.navigate(\"content\", { trigger: false });\n\t\t},\n\n\t\tshowContentManager: function showContentManager() {\n\t\t\tApp.loadView(new ContentManager());\n\t\t},\n\n\t\tshowFlashCardManager: function showFlashCardManager() {\n\t\t\tApp.loadView(new FlashCardManager());\n\t\t}\n\t};\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIkNvbnRlbnRNYW5hZ2VyIiwiRmxhc2hDYXJkTWFuYWdlciIsIk1vZHVsZSIsIm1vZHVsZSIsImV4cG9ydHMiLCJNYXJpb25ldHRlIiwiQXBwbGljYXRpb24iLCJyb3V0aW5nIiwiUm91dGVyIiwicm91dGVzIiwiYWRkQXNzZXNzbWVudCIsImFkZEV2ZW50IiwiYWRkUmVzb3VyY2UiLCJmbGFzaENhcmRzIiwibWFuYWdlIiwidmlldyIsIkFwcCIsImxvYWRWaWV3IiwiYXNzZW1ibGVBc3Nlc3NtZW50IiwibmF2aWdhdGUiLCJ0cmlnZ2VyIiwiYXNzZW1ibGVFdmVudCIsImFzc2VtYmxlUmVzb3VyY2UiLCJzaG93Q29udGVudE1hbmFnZXIiLCJzaG93Rmxhc2hDYXJkTWFuYWdlciJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCOztBQUVBLElBQU1DLGlCQUFpQkQsUUFBUSx3QkFBUixDQUF2QjtBQUNBLElBQU1FLG1CQUFtQkYsUUFBUSw0QkFBUixDQUF6Qjs7QUFFQSxJQUFNRyxTQUFTQyxPQUFPQyxPQUFQLEdBQWlCLElBQUlOLFNBQVNPLFVBQVQsQ0FBb0JDLFdBQXhCLEVBQWhDOztBQUVBO0FBQ0FKLE9BQU9LLE9BQVAsR0FBaUIsZUFBTztBQUN2QkwsUUFBT00sTUFBUCxHQUFnQjtBQUNmQyxVQUFRO0FBQ1BDLGtCQUFlLGVBRFI7QUFFUEMsYUFBVSxVQUZIO0FBR1BDLGdCQUFhLGFBSE47QUFJUEMsZUFBWSxzQkFKTDtBQUtQQyxXQUFRO0FBTEQsR0FETzs7QUFTZkosaUJBQWUseUJBQVc7QUFDekIsT0FBTUssT0FBTyxJQUFJZixjQUFKLEVBQWI7O0FBRUFnQixPQUFJQyxRQUFKLENBQWFGLElBQWI7QUFDQUEsUUFBS0csa0JBQUw7QUFDQUYsT0FBSVIsTUFBSixDQUFXVyxRQUFYLENBQW9CLFNBQXBCLEVBQStCLEVBQUVDLFNBQVMsS0FBWCxFQUEvQjtBQUNBLEdBZmM7O0FBaUJmVCxZQUFVLG9CQUFXO0FBQ3BCLE9BQU1JLE9BQU8sSUFBSWYsY0FBSixFQUFiOztBQUVBZ0IsT0FBSUMsUUFBSixDQUFhRixJQUFiO0FBQ0FBLFFBQUtNLGFBQUw7QUFDQUwsT0FBSVIsTUFBSixDQUFXVyxRQUFYLENBQW9CLFNBQXBCLEVBQStCLEVBQUVDLFNBQVMsS0FBWCxFQUEvQjtBQUNBLEdBdkJjOztBQXlCZlIsZUFBYSx1QkFBVztBQUN2QixPQUFNRyxPQUFPLElBQUlmLGNBQUosRUFBYjs7QUFFQWdCLE9BQUlDLFFBQUosQ0FBYUYsSUFBYjtBQUNBQSxRQUFLTyxnQkFBTDtBQUNBTixPQUFJUixNQUFKLENBQVdXLFFBQVgsQ0FBb0IsU0FBcEIsRUFBK0IsRUFBRUMsU0FBUyxLQUFYLEVBQS9CO0FBQ0EsR0EvQmM7O0FBaUNmRyxzQkFBb0IsOEJBQVc7QUFDOUJQLE9BQUlDLFFBQUosQ0FBYSxJQUFJakIsY0FBSixFQUFiO0FBQ0EsR0FuQ2M7O0FBcUNmd0Isd0JBQXNCLGdDQUFXO0FBQ2hDUixPQUFJQyxRQUFKLENBQWEsSUFBSWhCLGdCQUFKLEVBQWI7QUFDQTtBQXZDYyxFQUFoQjtBQXlDQSxDQTFDRCIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5cbmNvbnN0IENvbnRlbnRNYW5hZ2VyID0gcmVxdWlyZShcIi4vdmlld3MvbWFuYWdlci9sYXlvdXRcIik7XG5jb25zdCBGbGFzaENhcmRNYW5hZ2VyID0gcmVxdWlyZShcIi4vdmlld3MvZmxhc2hDYXJkcy9tYW5hZ2VyXCIpO1xuXG5jb25zdCBNb2R1bGUgPSBtb2R1bGUuZXhwb3J0cyA9IG5ldyBCYWNrYm9uZS5NYXJpb25ldHRlLkFwcGxpY2F0aW9uKCk7XG5cbi8vIEFkZCBpbnRyYS1tb2R1bGUgcm91dGluZ1xuTW9kdWxlLnJvdXRpbmcgPSBBcHAgPT4ge1xuXHRNb2R1bGUuUm91dGVyID0ge1xuXHRcdHJvdXRlczoge1xuXHRcdFx0YWRkQXNzZXNzbWVudDogXCJhZGRBc3Nlc3NtZW50XCIsXG5cdFx0XHRhZGRFdmVudDogXCJhZGRFdmVudFwiLFxuXHRcdFx0YWRkUmVzb3VyY2U6IFwiYWRkUmVzb3VyY2VcIixcblx0XHRcdGZsYXNoQ2FyZHM6IFwic2hvd0ZsYXNoQ2FyZE1hbmFnZXJcIixcblx0XHRcdG1hbmFnZTogXCJzaG93Q29udGVudE1hbmFnZXJcIixcblx0XHR9LFxuXG5cdFx0YWRkQXNzZXNzbWVudDogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb25zdCB2aWV3ID0gbmV3IENvbnRlbnRNYW5hZ2VyKCk7XG5cblx0XHRcdEFwcC5sb2FkVmlldyh2aWV3KTtcblx0XHRcdHZpZXcuYXNzZW1ibGVBc3Nlc3NtZW50KCk7XG5cdFx0XHRBcHAuUm91dGVyLm5hdmlnYXRlKFwiY29udGVudFwiLCB7IHRyaWdnZXI6IGZhbHNlIH0pO1xuXHRcdH0sXG5cblx0XHRhZGRFdmVudDogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb25zdCB2aWV3ID0gbmV3IENvbnRlbnRNYW5hZ2VyKCk7XG5cblx0XHRcdEFwcC5sb2FkVmlldyh2aWV3KTtcblx0XHRcdHZpZXcuYXNzZW1ibGVFdmVudCgpO1xuXHRcdFx0QXBwLlJvdXRlci5uYXZpZ2F0ZShcImNvbnRlbnRcIiwgeyB0cmlnZ2VyOiBmYWxzZSB9KTtcblx0XHR9LFxuXG5cdFx0YWRkUmVzb3VyY2U6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29uc3QgdmlldyA9IG5ldyBDb250ZW50TWFuYWdlcigpO1xuXG5cdFx0XHRBcHAubG9hZFZpZXcodmlldyk7XG5cdFx0XHR2aWV3LmFzc2VtYmxlUmVzb3VyY2UoKTtcblx0XHRcdEFwcC5Sb3V0ZXIubmF2aWdhdGUoXCJjb250ZW50XCIsIHsgdHJpZ2dlcjogZmFsc2UgfSk7XG5cdFx0fSxcblxuXHRcdHNob3dDb250ZW50TWFuYWdlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRBcHAubG9hZFZpZXcobmV3IENvbnRlbnRNYW5hZ2VyKCkpO1xuXHRcdH0sXG5cblx0XHRzaG93Rmxhc2hDYXJkTWFuYWdlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRBcHAubG9hZFZpZXcobmV3IEZsYXNoQ2FyZE1hbmFnZXIoKSk7XG5cdFx0fSxcblx0fTtcbn07XG4iXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\n\nmodule.exports = Backbone.Model.extend({\n\tdefaults: {\n\t\tback: \"\",\n\t\tcreated: moment().unix(),\n\t\tfront: \"\"\n\t},\n\n\tidAttribute: \"_id\",\n\n\tvalidate: function validate(attributes) {\n\t\tvar errorMessage = void 0;\n\n\t\tif (!attributes.back || attributes.back.length === 0) errorMessage = \"You must enter content for the back of the card.\";else if (!attributes.front || attributes.front.length === 0) errorMessage = \"You must enter content for the front of the card.\";\n\n\t\treturn errorMessage;\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNhcmRNb2RlbC5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCJtb21lbnQiLCJtb2R1bGUiLCJleHBvcnRzIiwiTW9kZWwiLCJleHRlbmQiLCJkZWZhdWx0cyIsImJhY2siLCJjcmVhdGVkIiwidW5peCIsImZyb250IiwiaWRBdHRyaWJ1dGUiLCJ2YWxpZGF0ZSIsImF0dHJpYnV0ZXMiLCJlcnJvck1lc3NhZ2UiLCJsZW5ndGgiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1DLFNBQVNELFFBQVEsUUFBUixDQUFmOztBQUVBRSxPQUFPQyxPQUFQLEdBQWlCSixTQUFTSyxLQUFULENBQWVDLE1BQWYsQ0FBc0I7QUFDdENDLFdBQVU7QUFDVEMsUUFBTSxFQURHO0FBRVRDLFdBQVNQLFNBQVNRLElBQVQsRUFGQTtBQUdUQyxTQUFPO0FBSEUsRUFENEI7O0FBT3RDQyxjQUFhLEtBUHlCOztBQVN0Q0MsV0FBVSxrQkFBU0MsVUFBVCxFQUFxQjtBQUM5QixNQUFJQyxxQkFBSjs7QUFFQSxNQUFJLENBQUNELFdBQVdOLElBQVosSUFBb0JNLFdBQVdOLElBQVgsQ0FBZ0JRLE1BQWhCLEtBQTJCLENBQW5ELEVBQ0NELGVBQWUsa0RBQWYsQ0FERCxLQUVLLElBQUksQ0FBQ0QsV0FBV0gsS0FBWixJQUFxQkcsV0FBV0gsS0FBWCxDQUFpQkssTUFBakIsS0FBNEIsQ0FBckQsRUFDSkQsZUFBZSxtREFBZjs7QUFFRCxTQUFPQSxZQUFQO0FBQ0E7QUFsQnFDLENBQXRCLENBQWpCIiwiZmlsZSI6ImNhcmRNb2RlbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCBtb21lbnQgPSByZXF1aXJlKFwibW9tZW50XCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7XG5cdFx0YmFjazogXCJcIixcblx0XHRjcmVhdGVkOiBtb21lbnQoKS51bml4KCksXG5cdFx0ZnJvbnQ6IFwiXCIsXG5cdH0sXG5cblx0aWRBdHRyaWJ1dGU6IFwiX2lkXCIsXG5cblx0dmFsaWRhdGU6IGZ1bmN0aW9uKGF0dHJpYnV0ZXMpIHtcblx0XHRsZXQgZXJyb3JNZXNzYWdlO1xuXG5cdFx0aWYgKCFhdHRyaWJ1dGVzLmJhY2sgfHwgYXR0cmlidXRlcy5iYWNrLmxlbmd0aCA9PT0gMClcblx0XHRcdGVycm9yTWVzc2FnZSA9IFwiWW91IG11c3QgZW50ZXIgY29udGVudCBmb3IgdGhlIGJhY2sgb2YgdGhlIGNhcmQuXCI7XG5cdFx0ZWxzZSBpZiAoIWF0dHJpYnV0ZXMuZnJvbnQgfHwgYXR0cmlidXRlcy5mcm9udC5sZW5ndGggPT09IDApXG5cdFx0XHRlcnJvck1lc3NhZ2UgPSBcIllvdSBtdXN0IGVudGVyIGNvbnRlbnQgZm9yIHRoZSBmcm9udCBvZiB0aGUgY2FyZC5cIjtcblxuXHRcdHJldHVybiBlcnJvck1lc3NhZ2U7XG5cdH0sXG59KTtcbiJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar ResourceModel = require(\"../manager/resourceModel\");\n\nmodule.exports = ResourceModel.extend({\n\tdefaults: {\n\t\tcategory: \"flashcarddeck\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tResourceModel.prototype.initialize.call(this);\n\n\t\tthis.listenTo(Backbone.Radio.channel(\"flashCards\"), \"deck:select\", this.onDeckSelected.bind(this));\n\t},\n\n\tonDeckSelected: function onDeckSelected(modelCid) {\n\t\tif (this.cid === modelCid) this.set(\"selected\", true);else this.set(\"selected\", false);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRlY2tNb2RlbC5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCJSZXNvdXJjZU1vZGVsIiwibW9kdWxlIiwiZXhwb3J0cyIsImV4dGVuZCIsImRlZmF1bHRzIiwiY2F0ZWdvcnkiLCJpbml0aWFsaXplIiwicHJvdG90eXBlIiwiY2FsbCIsImxpc3RlblRvIiwiUmFkaW8iLCJjaGFubmVsIiwib25EZWNrU2VsZWN0ZWQiLCJiaW5kIiwibW9kZWxDaWQiLCJjaWQiLCJzZXQiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjs7QUFFQSxJQUFNQyxnQkFBZ0JELFFBQVEsMEJBQVIsQ0FBdEI7O0FBRUFFLE9BQU9DLE9BQVAsR0FBaUJGLGNBQWNHLE1BQWQsQ0FBcUI7QUFDckNDLFdBQVU7QUFDVEMsWUFBVTtBQURELEVBRDJCOztBQUtyQ0MsYUFBWSxzQkFBVztBQUN0Qk4sZ0JBQWNPLFNBQWQsQ0FBd0JELFVBQXhCLENBQW1DRSxJQUFuQyxDQUF3QyxJQUF4Qzs7QUFFQSxPQUFLQyxRQUFMLENBQWNYLFNBQVNZLEtBQVQsQ0FBZUMsT0FBZixDQUF1QixZQUF2QixDQUFkLEVBQW9ELGFBQXBELEVBQW1FLEtBQUtDLGNBQUwsQ0FBb0JDLElBQXBCLENBQXlCLElBQXpCLENBQW5FO0FBQ0EsRUFUb0M7O0FBV3JDRCxpQkFBZ0Isd0JBQVNFLFFBQVQsRUFBbUI7QUFDbEMsTUFBSSxLQUFLQyxHQUFMLEtBQWFELFFBQWpCLEVBQ0MsS0FBS0UsR0FBTCxDQUFTLFVBQVQsRUFBcUIsSUFBckIsRUFERCxLQUdDLEtBQUtBLEdBQUwsQ0FBUyxVQUFULEVBQXFCLEtBQXJCO0FBQ0Q7QUFoQm9DLENBQXJCLENBQWpCIiwiZmlsZSI6ImRlY2tNb2RlbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5cbmNvbnN0IFJlc291cmNlTW9kZWwgPSByZXF1aXJlKFwiLi4vbWFuYWdlci9yZXNvdXJjZU1vZGVsXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlc291cmNlTW9kZWwuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHtcblx0XHRjYXRlZ29yeTogXCJmbGFzaGNhcmRkZWNrXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0UmVzb3VyY2VNb2RlbC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMpO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKSwgXCJkZWNrOnNlbGVjdFwiLCB0aGlzLm9uRGVja1NlbGVjdGVkLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdG9uRGVja1NlbGVjdGVkOiBmdW5jdGlvbihtb2RlbENpZCkge1xuXHRcdGlmICh0aGlzLmNpZCA9PT0gbW9kZWxDaWQpXG5cdFx0XHR0aGlzLnNldChcInNlbGVjdGVkXCIsIHRydWUpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuc2V0KFwic2VsZWN0ZWRcIiwgZmFsc2UpO1xuXHR9LFxufSk7XG4iXX0=",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar App = require(\"../../../index\");\nvar settings = require(\"app-settings\");\n\nvar gradeMap = require(\"../../../lib/gradeMap\");\n\n// TOUCHPOINT: RESOURCE TYPE\nvar CATEGORY_ASSETS = {\n\tassessment: { icon: \"fa-list-ul\", img: \"annotation_interactive\", typeName: \"Annotation\" },\n\taudio: { icon: \"fa-audio\", img: \"annotation_mp3\", typeName: \"Audio\" },\n\texcel: { icon: \"fa-file-excel\", img: \"annotation_excel\", typeName: \"Microsoft Excel\" },\n\tflashcarddeck: { icon: \"fa-star-exclamation\", img: \"annotation_flashcards\", typeName: \"Flash Card Deck\" },\n\tgoogledrive: { icon: \"fa-google-drive\", img: \"annotation_googledrive\", typeName: \"Google Drive\" },\n\timage: { icon: \"fa-image\", img: \"annotation_graphic\", typeName: \"Image\" },\n\toffice: { icon: \"fa-file-word\", img: \"annotation_office\", typeName: \"Microsoft Office\" },\n\tonenote: { icon: \"fa-one-note\", img: \"annotation_onenote\", typeName: \"One Note\" },\n\tpdf: { icon: \"fa-file-pdf\", img: \"annotation_pdf\", typeName: \"PDF\" },\n\tpowerpoint: { icon: \"fa-file-powerpoint\", img: \"annotation_powerpoint\", typeName: \"Microsoft PowerPoint\" },\n\ttext: { icon: \"fa-file-alt\", img: \"annotation_text\", typeName: \"Text\" },\n\tunknown: { icon: \"fa-question-circle\", img: \"annotation_unknown\", typeName: \"UNKNOWN\" },\n\turl: { icon: \"fa-external-link\", img: \"annotation_url\", typeName: \"URL\" },\n\tvideo: { icon: \"fa-video-camera\", img: \"annotation_video\", typeName: \"Video\" },\n\tvidimus: { icon: \"fa-video-camera\", img: \"annotation_vidimus\", typeName: \"Vidimus\" },\n\tword: { icon: \"fa-file-word\", img: \"annotation_word\", typeName: \"Microsoft Word\" }\n};\n\nmodule.exports = Backbone.Model.extend({\n\tdefaults: {\n\t\tusage: 0\n\t},\n\n\tinitialize: function initialize() {\n\t\tvar _this = this;\n\n\t\t// Listen for book unloading and reset usage accordingly\n\t\tthis.listenTo(radio, App.Events.UnloadBook, function () {\n\t\t\t_this.set(\"usage\", 0);\n\t\t});\n\t\tthis.listenTo(radio, App.Events.UnloadLearningPath, function () {\n\t\t\t_this.set(\"usage\", 0);\n\t\t});\n\n\t\tif (this.isNew()) {\n\t\t\tthis.listenTo(this, \"change:_id\", this.linkEvents.bind(this));\n\t\t\tthis.listenTo(this, \"sync change:category\", this.setAsset.bind(this));\n\t\t} else {\n\t\t\tthis.setAsset();\n\t\t\tthis.linkEvents();\n\t\t}\n\t},\n\n\tidAttribute: \"_id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/resources\" + (this.andAttachments ? \"/withAttachments\" : \"\");\n\t},\n\n\tcomputeds: {\n\t\tcontentGrade: function contentGrade() {\n\t\t\treturn gradeMap.codeToHumanValue(this.get(\"studyYear\") || this.get(\"grade\")) || \"\";\n\t\t},\n\n\t\tcontentType: function contentType() {\n\t\t\tif (!this.has(\"img\") || !this.has(\"icon\")) this.setAsset();\n\n\t\t\treturn settings.contentIcons === \"img\" ? \"<img src='\" + settings.urlRoot + \"/images/content/\" + this.get(\"img\") + \".png'/>\" : \"<span class='fa \" + this.get(\"icon\") + \"'/>\";\n\t\t},\n\n\t\tlastChange: function lastChange() {\n\t\t\treturn this.get(\"updated\") || this.get(\"created\");\n\t\t},\n\n\t\tlastUpdated: function lastUpdated() {\n\t\t\treturn this.get(\"updated\") || this.get(\"created\");\n\t\t},\n\n\t\treadableSize: function readableSize() {\n\t\t\treturn this.formatBytes(this.get(\"size\") || (this.get(\"text\") || \"\").length || (this.get(\"url\") || \"\").length);\n\t\t}\n\t},\n\n\tformatBytes: function formatBytes(a, b) {\n\t\tif (!a || a < 0) return \"0 bytes\";\n\n\t\tvar c = 1e3,\n\t\t    d = b || 2,\n\t\t    e = [\"bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"],\n\t\t    f = Math.floor(Math.log(a) / Math.log(c));\n\t\treturn parseFloat((a / Math.pow(c, f)).toFixed(d)) + \" \" + e[f];\n\t},\n\n\tlinkEvents: function linkEvents() {\n\t\tthis.listenTo(radio, \"attachmentAdded:\" + this.get(\"_id\"), this.incrementUsage.bind(this));\n\t\tthis.listenTo(radio, \"attachmentRemoved:\" + this.get(\"_id\"), this.decrementUsage.bind(this));\n\t},\n\n\tsetAsset: function setAsset() {\n\t\tvar asset = CATEGORY_ASSETS.unknown;\n\t\tvar category = this.get(\"category\");\n\n\t\tif (category in CATEGORY_ASSETS) {\n\t\t\tif (category === \"url\") {\n\t\t\t\tif (_.includes(this.get(\"url\"), \"1drv.ms\") || _.includes(this.get(\"url\"), \"onedrive.live.com\")) asset = CATEGORY_ASSETS.onenote;else if (_.includes(this.get(\"url\"), \"drive.google.com\")) asset = CATEGORY_ASSETS.googledrive;else asset = CATEGORY_ASSETS.url;\n\t\t\t} else {\n\t\t\t\tasset = CATEGORY_ASSETS[category];\n\t\t\t}\n\t\t}\n\n\t\tthis.set(asset);\n\t},\n\n\tvalidate: function validate(attributes) {\n\t\tvar errors = {};\n\n\t\tif (attributes.category) {\n\t\t\tswitch (attributes.category) {\n\t\t\t\tcase \"audio\":\n\t\t\t\t\t_.extend(errors, this.validateFile(\"file\", \"mp3\", settings.maxFileSize.audio, \"audioFileChooser\"));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"excel\":\n\t\t\t\t\t_.extend(errors, this.validateFile(\"file\", [\"xls\", \"xlsx\"], settings.maxFileSize.excel, \"officeFileChooser\"));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"flashcarddeck\":\n\t\t\t\t\tif (!attributes.flashCards) throw new Error(\"Flash card array not set for new flash card deck resource.\");\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"image\":\n\t\t\t\t\t_.extend(errors, this.validateFile(\"file\", [\"jpg\", \"jpeg\", \"png\", \"gif\"], settings.maxFileSize.image, \"imageFileChooser\"));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"pdf\":\n\t\t\t\t\t_.extend(errors, this.validateFile(\"file\", \"pdf\", settings.maxFileSize.pdf, \"pdfFileChooser\"));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"powerpoint\":\n\t\t\t\t\t_.extend(errors, this.validateFile(\"file\", [\"ppt\", \"pptx\", \"pps\", \"ppsx\"], settings.maxFileSize.powerpoint, \"officeFileChooser\"));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"text\":\n\t\t\t\t\tif (!attributes.text) errors.text = \"You must enter some text for this resource.\";\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"url\":\n\t\t\t\t\tif (!attributes.url) errors.url = \"You must enter a URL for this resource.\";\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"onenote\":\n\t\t\t\t\tif (!attributes.onenote) errors.url = \"You must enter a One Note URL for this resource.\";\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"googledrive\":\n\t\t\t\t\tif (!attributes.googledrive) errors.url = \"You must enter a Google Drive URL for this resource.\";\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"video\":\n\t\t\t\t\t_.extend(errors, this.validateFile(\"file\", \"mp4\", settings.maxFileSize.video, \"videoFileChooser\"));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"word\":\n\t\t\t\t\t_.extend(errors, this.validateFile(\"file\", [\"doc\", \"docx\"], settings.maxFileSize.word, \"officeFileChooser\"));\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"unknown\":\n\t\t\t\t\t_.extend(errors, { category: \"Unrecognised resource type.\" });\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\"Unrecognised resource type.\");\n\t\t\t}\n\t\t} else {\n\t\t\terrors.category = \"You must select a resource type.\";\n\t\t}\n\n\t\tif (!attributes.language) errors.language = \"You must select a language for this resource.\";\n\n\t\tif (!attributes.studyYear) errors.studyYear = \"You must select a grade for this resource.\";\n\n\t\tif (!attributes.title) errors.title = \"You must enter a title for this resource.\";\n\n\t\tif (!attributes.subject) errors.subject = \"You must select a subject for this resource.\";\n\n\t\tif (_.keys(errors).length > 0) return errors;\n\t},\n\n\tvalidateFile: function validateFile(fileKey, validExtensions, maxSize, errorKey) {\n\t\tvar errors = {};\n\n\t\tvar file = this.getFile(fileKey);\n\n\t\tif (this.isNew() && !file) errors[errorKey] = \"You must provide a file for this resource.\";\n\n\t\tif (file && validExtensions) {\n\t\t\tvar flattenedValidExtensions = _.flatten([validExtensions]);\n\t\t\tvar extension = file.name.toLowerCase().split(\".\");\n\t\t\textension = extension[extension.length - 1];\n\n\t\t\tif (!_.some(flattenedValidExtensions, function (x) {\n\t\t\t\treturn x === extension;\n\t\t\t})) errors[errorKey] = \"The selected file must have one of these extensions: \" + flattenedValidExtensions.join(\", \");\n\t\t}\n\n\t\tif (file && (file.size > 1048576 * maxSize || file.size > settings.maxUpload)) errors[errorKey] = \"The file you have selected is larger than the maximum allowed file size (\" + maxSize + \"MB max.).\";\n\n\t\treturn errors;\n\t},\n\n\tincrementUsage: function incrementUsage() {\n\t\tif (this.has(\"usage\")) this.set(\"usage\", (parseInt(this.get(\"usage\"), 0) || 0) + 1);else this.set(\"usage\", 1);\n\t},\n\n\tdecrementUsage: function decrementUsage() {\n\t\tthis.set(\"usage\", Math.max(0, (parseInt(this.get(\"usage\"), 0) || 0) - 1));\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJlc291cmNlTW9kZWwuanMiXSwibmFtZXMiOlsiXyIsInJlcXVpcmUiLCJCYWNrYm9uZSIsInJhZGlvIiwiUmFkaW8iLCJjaGFubmVsIiwiQXBwIiwic2V0dGluZ3MiLCJncmFkZU1hcCIsIkNBVEVHT1JZX0FTU0VUUyIsImFzc2Vzc21lbnQiLCJpY29uIiwiaW1nIiwidHlwZU5hbWUiLCJhdWRpbyIsImV4Y2VsIiwiZmxhc2hjYXJkZGVjayIsImdvb2dsZWRyaXZlIiwiaW1hZ2UiLCJvZmZpY2UiLCJvbmVub3RlIiwicGRmIiwicG93ZXJwb2ludCIsInRleHQiLCJ1bmtub3duIiwidXJsIiwidmlkZW8iLCJ2aWRpbXVzIiwid29yZCIsIm1vZHVsZSIsImV4cG9ydHMiLCJNb2RlbCIsImV4dGVuZCIsImRlZmF1bHRzIiwidXNhZ2UiLCJpbml0aWFsaXplIiwibGlzdGVuVG8iLCJFdmVudHMiLCJVbmxvYWRCb29rIiwic2V0IiwiVW5sb2FkTGVhcm5pbmdQYXRoIiwiaXNOZXciLCJsaW5rRXZlbnRzIiwiYmluZCIsInNldEFzc2V0IiwiaWRBdHRyaWJ1dGUiLCJ1cmxSb290IiwiYW5kQXR0YWNobWVudHMiLCJjb21wdXRlZHMiLCJjb250ZW50R3JhZGUiLCJjb2RlVG9IdW1hblZhbHVlIiwiZ2V0IiwiY29udGVudFR5cGUiLCJoYXMiLCJjb250ZW50SWNvbnMiLCJsYXN0Q2hhbmdlIiwibGFzdFVwZGF0ZWQiLCJyZWFkYWJsZVNpemUiLCJmb3JtYXRCeXRlcyIsImxlbmd0aCIsImEiLCJiIiwiYyIsImQiLCJlIiwiZiIsIk1hdGgiLCJmbG9vciIsImxvZyIsInBhcnNlRmxvYXQiLCJwb3ciLCJ0b0ZpeGVkIiwiaW5jcmVtZW50VXNhZ2UiLCJkZWNyZW1lbnRVc2FnZSIsImFzc2V0IiwiY2F0ZWdvcnkiLCJpbmNsdWRlcyIsInZhbGlkYXRlIiwiYXR0cmlidXRlcyIsImVycm9ycyIsInZhbGlkYXRlRmlsZSIsIm1heEZpbGVTaXplIiwiZmxhc2hDYXJkcyIsIkVycm9yIiwibGFuZ3VhZ2UiLCJzdHVkeVllYXIiLCJ0aXRsZSIsInN1YmplY3QiLCJrZXlzIiwiZmlsZUtleSIsInZhbGlkRXh0ZW5zaW9ucyIsIm1heFNpemUiLCJlcnJvcktleSIsImZpbGUiLCJnZXRGaWxlIiwiZmxhdHRlbmVkVmFsaWRFeHRlbnNpb25zIiwiZmxhdHRlbiIsImV4dGVuc2lvbiIsIm5hbWUiLCJ0b0xvd2VyQ2FzZSIsInNwbGl0Iiwic29tZSIsIngiLCJqb2luIiwic2l6ZSIsIm1heFVwbG9hZCIsInBhcnNlSW50IiwibWF4Il0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLFdBQVdELFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1FLFFBQVFELFNBQVNFLEtBQVQsQ0FBZUMsT0FBZixDQUF1QixRQUF2QixDQUFkOztBQUVBLElBQU1DLE1BQU1MLFFBQVEsZ0JBQVIsQ0FBWjtBQUNBLElBQU1NLFdBQVdOLFFBQVEsY0FBUixDQUFqQjs7QUFFQSxJQUFNTyxXQUFXUCxRQUFRLHVCQUFSLENBQWpCOztBQUVBO0FBQ0EsSUFBTVEsa0JBQWtCO0FBQ3ZCQyxhQUFZLEVBQUVDLE1BQU0sWUFBUixFQUFzQkMsS0FBSyx3QkFBM0IsRUFBcURDLFVBQVUsWUFBL0QsRUFEVztBQUV2QkMsUUFBTyxFQUFFSCxNQUFNLFVBQVIsRUFBb0JDLEtBQUssZ0JBQXpCLEVBQTJDQyxVQUFVLE9BQXJELEVBRmdCO0FBR3ZCRSxRQUFPLEVBQUVKLE1BQU0sZUFBUixFQUF5QkMsS0FBSyxrQkFBOUIsRUFBa0RDLFVBQVUsaUJBQTVELEVBSGdCO0FBSXZCRyxnQkFBZSxFQUFFTCxNQUFNLHFCQUFSLEVBQStCQyxLQUFLLHVCQUFwQyxFQUE2REMsVUFBVSxpQkFBdkUsRUFKUTtBQUt2QkksY0FBYSxFQUFFTixNQUFNLGlCQUFSLEVBQTJCQyxLQUFLLHdCQUFoQyxFQUEwREMsVUFBVSxjQUFwRSxFQUxVO0FBTXZCSyxRQUFPLEVBQUVQLE1BQU0s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QW1CLENBQTdCLENBQVo7O0FBRUEsT0FBSSxDQUFDM0QsRUFBRXFHLElBQUYsQ0FBT04sd0JBQVAsRUFBaUM7QUFBQSxXQUFLTyxNQUFNTCxTQUFYO0FBQUEsSUFBakMsQ0FBTCxFQUNDbEIsT0FBT2EsUUFBUCxJQUFtQiwwREFBMERHLHlCQUF5QlEsSUFBekIsQ0FBOEIsSUFBOUIsQ0FBN0U7QUFDRDs7QUFFRCxNQUFJVixTQUFTQSxLQUFLVyxJQUFMLEdBQWEsVUFBVWIsT0FBdkIsSUFBbUNFLEtBQUtXLElBQUwsR0FBWWpHLFNBQVNrRyxTQUFqRSxDQUFKLEVBQ0MxQixPQUFPYSxRQUFQLElBQW1CLDhFQUE4RUQsT0FBOUUsR0FBd0YsV0FBM0c7O0FBRUQsU0FBT1osTUFBUDtBQUNBLEVBbE1xQzs7QUFvTXRDUCxpQkFBZ0IsMEJBQVc7QUFDMUIsTUFBSSxLQUFLbkIsR0FBTCxDQUFTLE9BQVQsQ0FBSixFQUNDLEtBQUtkLEdBQUwsQ0FBUyxPQUFULEVBQWtCLENBQUNtRSxTQUFTLEtBQUt2RCxHQUFMLENBQVMsT0FBVCxDQUFULEVBQTRCLENBQTVCLEtBQWtDLENBQW5DLElBQXdDLENBQTFELEVBREQsS0FHQyxLQUFLWixHQUFMLENBQVMsT0FBVCxFQUFrQixDQUFsQjtBQUNELEVBek1xQzs7QUEyTXRDa0MsaUJBQWdCLDBCQUFXO0FBQzFCLE9BQUtsQyxHQUFMLENBQVMsT0FBVCxFQUFrQjJCLEtBQUt5QyxHQUFMLENBQVMsQ0FBVCxFQUFZLENBQUNELFNBQVMsS0FBS3ZELEdBQUwsQ0FBUyxPQUFULENBQVQsRUFBNEIsQ0FBNUIsS0FBa0MsQ0FBbkMsSUFBd0MsQ0FBcEQsQ0FBbEI7QUFDQTtBQTdNcUMsQ0FBdEIsQ0FBakIiLCJmaWxlIjoicmVzb3VyY2VNb2RlbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcblxuY29uc3QgQXBwID0gcmVxdWlyZShcIi4uLy4uLy4uL2luZGV4XCIpO1xuY29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuXG5jb25zdCBncmFkZU1hcCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9saWIvZ3JhZGVNYXBcIik7XG5cbi8vIFRPVUNIUE9JTlQ6IFJFU09VUkNFIFRZUEVcbmNvbnN0IENBVEVHT1JZX0FTU0VUUyA9IHtcblx0YXNzZXNzbWVudDogeyBpY29uOiBcImZhLWxpc3QtdWxcIiwgaW1nOiBcImFubm90YXRpb25faW50ZXJhY3RpdmVcIiwgdHlwZU5hbWU6IFwiQW5ub3RhdGlvblwiIH0sXG5cdGF1ZGlvOiB7IGljb246IFwiZmEtYXVkaW9cIiwgaW1nOiBcImFubm90YXRpb25fbXAzXCIsIHR5cGVOYW1lOiBcIkF1ZGlvXCIgfSxcblx0ZXhjZWw6IHsgaWNvbjogXCJmYS1maWxlLWV4Y2VsXCIsIGltZzogXCJhbm5vdGF0aW9uX2V4Y2VsXCIsIHR5cGVOYW1lOiBcIk1pY3Jvc29mdCBFeGNlbFwiIH0sXG5cdGZsYXNoY2FyZGRlY2s6IHsgaWNvbjogXCJmYS1zdGFyLWV4Y2xhbWF0aW9uXCIsIGltZzogXCJhbm5vdGF0aW9uX2ZsYXNoY2FyZHNcIiwgdHlwZU5hbWU6IFwiRmxhc2ggQ2FyZCBEZWNrXCIgfSxcblx0Z29vZ2xlZHJpdmU6IHsgaWNvbjogXCJmYS1nb29nbGUtZHJpdmVcIiwgaW1nOiBcImFubm90YXRpb25fZ29vZ2xlZHJpdmVcIiwgdHlwZU5hbWU6IFwiR29vZ2xlIERyaXZlXCIgfSxcblx0aW1hZ2U6IHsgaWNvbjogXCJmYS1pbWFnZVwiLCBpbWc6IFwiYW5ub3RhdGlvbl9ncmFwaGljXCIsIHR5cGVOYW1lOiBcIkltYWdlXCIgfSxcblx0b2ZmaWNlOiB7IGljb246IFwiZmEtZmlsZS13b3JkXCIsIGltZzogXCJhbm5vdGF0aW9uX29mZmljZVwiLCB0eXBlTmFtZTogXCJNaWNyb3NvZnQgT2ZmaWNlXCIgfSxcblx0b25lbm90ZTogeyBpY29uOiBcImZhLW9uZS1ub3RlXCIsIGltZzogXCJhbm5vdGF0aW9uX29uZW5vdGVcIiwgdHlwZU5hbWU6IFwiT25lIE5vdGVcIiB9LFxuXHRwZGY6IHsgaWNvbjogXCJmYS1maWxlLXBkZlwiLCBpbWc6IFwiYW5ub3RhdGlvbl9wZGZcIiwgdHlwZU5hbWU6IFwiUERGXCIgfSxcblx0cG93ZXJwb2ludDogeyBpY29uOiBcImZhLWZpbGUtcG93ZXJwb2ludFwiLCBpbWc6IFwiYW5ub3RhdGlvbl9wb3dlcnBvaW50XCIsIHR5cGVOYW1lOiBcIk1pY3Jvc29mdCBQb3dlclBvaW50XCIgfSxcblx0dGV4dDogeyBpY29uOiBcImZhLWZpbGUtYWx0XCIsIGltZzogXCJhbm5vdGF0aW9uX3RleHRcIiwgdHlwZU5hbWU6IFwiVGV4dFwiIH0sXG5cdHVua25vd246IHsgaWNvbjogXCJmYS1xdWVzdGlvbi1jaXJjbGVcIiwgaW1nOiBcImFubm90YXRpb25fdW5rbm93blwiLCB0eXBlTmFtZTogXCJVTktOT1dOXCIgfSxcblx0dXJsOiB7IGljb246IFwiZmEtZXh0ZXJuYWwtbGlua1wiLCBpbWc6IFwiYW5ub3RhdGlvbl91cmxcIiwgdHlwZU5hbWU6IFwiVVJMXCIgfSxcblx0dmlkZW86IHsgaWNvbjogXCJmYS12aWRlby1jYW1lcmFcIiwgaW1nOiBcImFubm90YXRpb25fdmlkZW9cIiwgdHlwZU5hbWU6IFwiVmlkZW9cIiB9LFxuXHR2aWRpbXVzOiB7IGljb246IFwiZmEtdmlkZW8tY2FtZXJhXCIsIGltZzogXCJhbm5vdGF0aW9uX3ZpZGltdXNcIiwgdHlwZU5hbWU6IFwiVmlkaW11c1wiIH0sXG5cdHdvcmQ6IHsgaWNvbjogXCJmYS1maWxlLXdvcmRcIiwgaW1nOiBcImFubm90YXRpb25fd29yZFwiLCB0eXBlTmFtZTogXCJNaWNyb3NvZnQgV29yZFwiIH0sXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7XG5cdFx0dXNhZ2U6IDAsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gTGlzdGVuIGZvciBib29rIHVubG9hZGluZyBhbmQgcmVzZXQgdXNhZ2UgYWNjb3JkaW5nbHlcblx0XHR0aGlzLmxpc3RlblRvKHJhZGlvLCBBcHAuRXZlbnRzLlVubG9hZEJvb2ssICgpID0+IHsgdGhpcy5zZXQoXCJ1c2FnZVwiLCAwKTsgfSk7XG5cdFx0dGhpcy5saXN0ZW5UbyhyYWRpbywgQXBwLkV2ZW50cy5VbmxvYWRMZWFybmluZ1BhdGgsICgpID0+IHsgdGhpcy5zZXQoXCJ1c2FnZVwiLCAwKTsgfSk7XG5cblx0XHRpZiAodGhpcy5pc05ldygpKSB7XG5cdFx0XHR0aGlzLmxpc3RlblRvKHRoaXMsIFwiY2hhbmdlOl9pZFwiLCB0aGlzLmxpbmtFdmVudHMuYmluZCh0aGlzKSk7XG5cdFx0XHR0aGlzLmxpc3RlblRvKHRoaXMsIFwic3luYyBjaGFuZ2U6Y2F0ZWdvcnlcIiwgdGhpcy5zZXRBc3NldC5iaW5kKHRoaXMpKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLnNldEFzc2V0KCk7XG5cdFx0XHR0aGlzLmxpbmtFdmVudHMoKTtcblx0XHR9XG5cdH0sXG5cblx0aWRBdHRyaWJ1dGU6IFwiX2lkXCIsXG5cblx0dXJsUm9vdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3Jlc291cmNlc1wiICsgKHRoaXMuYW5kQXR0YWNobWVudHMgPyBcIi93aXRoQXR0YWNobWVudHNcIiA6IFwiXCIpO1xuXHR9LFxuXG5cdGNvbXB1dGVkczoge1xuXHRcdGNvbnRlbnRHcmFkZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gZ3JhZGVNYXAuY29kZVRvSHVtYW5WYWx1ZSh0aGlzLmdldChcInN0dWR5WWVhclwiKSB8fCB0aGlzLmdldChcImdyYWRlXCIpKSB8fCBcIlwiO1xuXHRcdH0sXG5cblx0XHRjb250ZW50VHlwZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIXRoaXMuaGFzKFwiaW1nXCIpIHx8ICF0aGlzLmhhcyhcImljb25cIikpXG5cdFx0XHRcdHRoaXMuc2V0QXNzZXQoKTtcblxuXHRcdFx0cmV0dXJuIHNldHRpbmdzLmNvbnRlbnRJY29ucyA9PT0gXCJpbWdcIiA/XG5cdFx0XHRcdFwiPGltZyBzcmM9J1wiICsgc2V0dGluZ3MudXJsUm9vdCArIFwiL2ltYWdlcy9jb250ZW50L1wiICsgdGhpcy5nZXQoXCJpbWdcIikgKyBcIi5wbmcnLz5cIiA6XG5cdFx0XHRcdFwiPHNwYW4gY2xhc3M9J2ZhIFwiICsgdGhpcy5nZXQoXCJpY29uXCIpICsgXCInLz5cIjtcblx0XHR9LFxuXG5cdFx0bGFzdENoYW5nZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXQoXCJ1cGRhdGVkXCIpIHx8IHRoaXMuZ2V0KFwiY3JlYXRlZFwiKTtcblx0XHR9LFxuXG5cdFx0bGFzdFVwZGF0ZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0KFwidXBkYXRlZFwiKSB8fCB0aGlzLmdldChcImNyZWF0ZWRcIik7XG5cdFx0fSxcblxuXHRcdHJlYWRhYmxlU2l6ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5mb3JtYXRCeXRlcyh0aGlzLmdldChcInNpemVcIikgfHwgKHRoaXMuZ2V0KFwidGV4dFwiKSB8fCBcIlwiKS5sZW5ndGggfHwgKHRoaXMuZ2V0KFwidXJsXCIpIHx8IFwiXCIpLmxlbmd0aCk7XG5cdFx0fSxcblx0fSxcblxuXHRmb3JtYXRCeXRlczogZnVuY3Rpb24oYSwgYikge1xuXHRcdGlmICghYSB8fCBhIDwgMClcblx0XHRcdHJldHVybiBcIjAgYnl0ZXNcIjtcblxuXHRcdGNvbnN0IGMgPSAxZTMsIGQgPSBiIHx8IDIsIGUgPSBbXCJieXRlc1wiLCBcIktCXCIsIFwiTUJcIiwgXCJHQlwiLCBcIlRCXCIsIFwiUEJcIiwgXCJFQlwiLCBcIlpCXCIsIFwiWUJcIl0sIGYgPSBNYXRoLmZsb29yKE1hdGgubG9nKGEpIC8gTWF0aC5sb2coYykpO1xuXHRcdHJldHVybiBwYXJzZUZsb2F0KChhIC8gTWF0aC5wb3coYywgZikpLnRvRml4ZWQoZCkpICsgXCIgXCIgKyBlW2ZdO1xuXHR9LFxuXG5cdGxpbmtFdmVudHM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMubGlzdGVuVG8ocmFkaW8sIFwiYXR0YWNobWVudEFkZGVkOlwiICsgdGhpcy5nZXQoXCJfaWRcIiksIHRoaXMuaW5jcmVtZW50VXNhZ2UuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5UbyhyYWRpbywgXCJhdHRhY2htZW50UmVtb3ZlZDpcIiArIHRoaXMuZ2V0KFwiX2lkXCIpLCB0aGlzLmRlY3JlbWVudFVzYWdlLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdHNldEFzc2V0OiBmdW5jdGlvbigpIHtcblx0XHRsZXQgYXNzZXQgPSBDQVRFR09SWV9BU1NFVFMudW5rbm93bjtcblx0XHRjb25zdCBjYXRlZ29yeSA9IHRoaXMuZ2V0KFwiY2F0ZWdvcnlcIik7XG5cblx0XHRpZiAoY2F0ZWdvcnkgaW4gQ0FURUdPUllfQVNTRVRTKSB7XG5cdFx0XHRpZiAoY2F0ZWdvcnkgPT09IFwidXJsXCIpIHtcblx0XHRcdFx0aWYgKF8uaW5jbHVkZXModGhpcy5nZXQoXCJ1cmxcIiksIFwiMWRydi5tc1wiKSB8fCBfLmluY2x1ZGVzKHRoaXMuZ2V0KFwidXJsXCIpLCBcIm9uZWRyaXZlLmxpdmUuY29tXCIpKVxuXHRcdFx0XHRcdGFzc2V0ID0gQ0FURUdPUllfQVNTRVRTLm9uZW5vdGU7XG5cdFx0XHRcdGVsc2UgaWYgKF8uaW5jbHVkZXModGhpcy5nZXQoXCJ1cmxcIiksIFwiZHJpdmUuZ29vZ2xlLmNvbVwiKSlcblx0XHRcdFx0XHRhc3NldCA9IENBVEVHT1JZX0FTU0VUUy5nb29nbGVkcml2ZTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdGFzc2V0ID0gQ0FURUdPUllfQVNTRVRTLnVybDtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRhc3NldCA9IENBVEVHT1JZX0FTU0VUU1tjYXRlZ29yeV07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5zZXQoYXNzZXQpO1xuXHR9LFxuXG5cdHZhbGlkYXRlOiBmdW5jdGlvbihhdHRyaWJ1dGVzKSB7XG5cdFx0Y29uc3QgZXJyb3JzID0ge307XG5cblx0XHRpZiAoYXR0cmlidXRlcy5jYXRlZ29yeSkge1xuXHRcdFx0c3dpdGNoIChhdHRyaWJ1dGVzLmNhdGVnb3J5KSB7XG5cdFx0XHRcdGNhc2UgXCJhdWRpb1wiOlxuXHRcdFx0XHRcdF8uZXh0ZW5kKGVycm9ycywgdGhpcy52YWxpZGF0ZUZpbGUoXCJmaWxlXCIsIFwibXAzXCIsIHNldHRpbmdzLm1heEZpbGVTaXplLmF1ZGlvLCBcImF1ZGlvRmlsZUNob29zZXJcIikpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJleGNlbFwiOlxuXHRcdFx0XHRcdF8uZXh0ZW5kKGVycm9ycywgdGhpcy52YWxpZGF0ZUZpbGUoXCJmaWxlXCIsIFtcInhsc1wiLCBcInhsc3hcIl0sIHNldHRpbmdzLm1heEZpbGVTaXplLmV4Y2VsLCBcIm9mZmljZUZpbGVDaG9vc2VyXCIpKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiZmxhc2hjYXJkZGVja1wiOlxuXHRcdFx0XHRcdGlmICghYXR0cmlidXRlcy5mbGFzaENhcmRzKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiRmxhc2ggY2FyZCBhcnJheSBub3Qgc2V0IGZvciBuZXcgZmxhc2ggY2FyZCBkZWNrIHJlc291cmNlLlwiKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiaW1hZ2VcIjpcblx0XHRcdFx0XHRfLmV4dGVuZChlcnJvcnMsIHRoaXMudmFsaWRhdGVGaWxlKFwiZmlsZVwiLCBbXCJqcGdcIiwgXCJqcGVnXCIsIFwicG5nXCIsIFwiZ2lmXCJdLCBzZXR0aW5ncy5tYXhGaWxlU2l6ZS5pbWFnZSwgXCJpbWFnZUZpbGVDaG9vc2VyXCIpKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwicGRmXCI6XG5cdFx0XHRcdFx0Xy5leHRlbmQoZXJyb3JzLCB0aGlzLnZhbGlkYXRlRmlsZShcImZpbGVcIiwgXCJwZGZcIiwgc2V0dGluZ3MubWF4RmlsZVNpemUucGRmLCBcInBkZkZpbGVDaG9vc2VyXCIpKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwicG93ZXJwb2ludFwiOlxuXHRcdFx0XHRcdF8uZXh0ZW5kKGVycm9ycywgdGhpcy52YWxpZGF0ZUZpbGUoXCJmaWxlXCIsIFtcInBwdFwiLCBcInBwdHhcIiwgXCJwcHNcIiwgXCJwcHN4XCJdLCBzZXR0aW5ncy5tYXhGaWxlU2l6ZS5wb3dlcnBvaW50LCBcIm9mZmljZUZpbGVDaG9vc2VyXCIpKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwidGV4dFwiOlxuXHRcdFx0XHRcdGlmICghYXR0cmlidXRlcy50ZXh0KVxuXHRcdFx0XHRcdFx0ZXJyb3JzLnRleHQgPSBcIllvdSBtdXN0IGVudGVyIHNvbWUgdGV4dCBmb3IgdGhpcyByZXNvdXJjZS5cIjtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwidXJsXCI6XG5cdFx0XHRcdFx0aWYgKCFhdHRyaWJ1dGVzLnVybClcblx0XHRcdFx0XHRcdGVycm9ycy51cmwgPSBcIllvdSBtdXN0IGVudGVyIGEgVVJMIGZvciB0aGlzIHJlc291cmNlLlwiO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJvbmVub3RlXCI6XG5cdFx0XHRcdFx0aWYgKCFhdHRyaWJ1dGVzLm9uZW5vdGUpXG5cdFx0XHRcdFx0XHRlcnJvcnMudXJsID0gXCJZb3UgbXVzdCBlbnRlciBhIE9uZSBOb3RlIFVSTCBmb3IgdGhpcyByZXNvdXJjZS5cIjtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiZ29vZ2xlZHJpdmVcIjpcblx0XHRcdFx0XHRpZiAoIWF0dHJpYnV0ZXMuZ29vZ2xlZHJpdmUpXG5cdFx0XHRcdFx0XHRlcnJvcnMudXJsID0gXCJZb3UgbXVzdCBlbnRlciBhIEdvb2dsZSBEcml2ZSBVUkwgZm9yIHRoaXMgcmVzb3VyY2UuXCI7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcInZpZGVvXCI6XG5cdFx0XHRcdFx0Xy5leHRlbmQoZXJyb3JzLCB0aGlzLnZhbGlkYXRlRmlsZShcImZpbGVcIiwgXCJtcDRcIiwgc2V0dGluZ3MubWF4RmlsZVNpemUudmlkZW8sIFwidmlkZW9GaWxlQ2hvb3NlclwiKSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcIndvcmRcIjpcblx0XHRcdFx0XHRfLmV4dGVuZChlcnJvcnMsIHRoaXMudmFsaWRhdGVGaWxlKFwiZmlsZVwiLCBbXCJkb2NcIiwgXCJkb2N4XCJdLCBzZXR0aW5ncy5tYXhGaWxlU2l6ZS53b3JkLCBcIm9mZmljZUZpbGVDaG9vc2VyXCIpKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwidW5rbm93blwiOlxuXHRcdFx0XHRcdF8uZXh0ZW5kKGVycm9ycywgeyBjYXRlZ29yeTogXCJVbnJlY29nbmlzZWQgcmVzb3VyY2UgdHlwZS5cIiB9KTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIlVucmVjb2duaXNlZCByZXNvdXJjZSB0eXBlLlwiKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRlcnJvcnMuY2F0ZWdvcnkgPSBcIllvdSBtdXN0IHNlbGVjdCBhIHJlc291cmNlIHR5cGUuXCI7XG5cdFx0fVxuXG5cdFx0aWYgKCFhdHRyaWJ1dGVzLmxhbmd1YWdlKVxuXHRcdFx0ZXJyb3JzLmxhbmd1YWdlID0gXCJZb3UgbXVzdCBzZWxlY3QgYSBsYW5ndWFnZSBmb3IgdGhpcyByZXNvdXJjZS5cIjtcblxuXHRcdGlmICghYXR0cmlidXRlcy5zdHVkeVllYXIpXG5cdFx0XHRlcnJvcnMuc3R1ZHlZZWFyID0gXCJZb3UgbXVzdCBzZWxlY3QgYSBncmFkZSBmb3IgdGhpcyByZXNvdXJjZS5cIjtcblxuXHRcdGlmICghYXR0cmlidXRlcy50aXRsZSlcblx0XHRcdGVycm9ycy50aXRsZSA9IFwiWW91IG11c3QgZW50ZXIgYSB0aXRsZSBmb3IgdGhpcyByZXNvdXJjZS5cIjtcblxuXHRcdGlmICghYXR0cmlidXRlcy5zdWJqZWN0KVxuXHRcdFx0ZXJyb3JzLnN1YmplY3QgPSBcIllvdSBtdXN0IHNlbGVjdCBhIHN1YmplY3QgZm9yIHRoaXMgcmVzb3VyY2UuXCI7XG5cblx0XHRpZiAoXy5rZXlzKGVycm9ycykubGVuZ3RoID4gMClcblx0XHRcdHJldHVybiBlcnJvcnM7XG5cdH0sXG5cblx0dmFsaWRhdGVGaWxlOiBmdW5jdGlvbihmaWxlS2V5LCB2YWxpZEV4dGVuc2lvbnMsIG1heFNpemUsIGVycm9yS2V5KSB7XG5cdFx0Y29uc3QgZXJyb3JzID0ge307XG5cblx0XHRjb25zdCBmaWxlID0gdGhpcy5nZXRGaWxlKGZpbGVLZXkpO1xuXG5cdFx0aWYgKHRoaXMuaXNOZXcoKSAmJiAhZmlsZSlcblx0XHRcdGVycm9yc1tlcnJvcktleV0gPSBcIllvdSBtdXN0IHByb3ZpZGUgYSBmaWxlIGZvciB0aGlzIHJlc291cmNlLlwiO1xuXG5cdFx0aWYgKGZpbGUgJiYgdmFsaWRFeHRlbnNpb25zKSB7XG5cdFx0XHRjb25zdCBmbGF0dGVuZWRWYWxpZEV4dGVuc2lvbnMgPSBfLmZsYXR0ZW4oW3ZhbGlkRXh0ZW5zaW9uc10pO1xuXHRcdFx0bGV0IGV4dGVuc2lvbiA9IGZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLnNwbGl0KFwiLlwiKTtcblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbltleHRlbnNpb24ubGVuZ3RoIC0gMV07XG5cblx0XHRcdGlmICghXy5zb21lKGZsYXR0ZW5lZFZhbGlkRXh0ZW5zaW9ucywgeCA9PiB4ID09PSBleHRlbnNpb24pKVxuXHRcdFx0XHRlcnJvcnNbZXJyb3JLZXldID0gXCJUaGUgc2VsZWN0ZWQgZmlsZSBtdXN0IGhhdmUgb25lIG9mIHRoZXNlIGV4dGVuc2lvbnM6IFwiICsgZmxhdHRlbmVkVmFsaWRFeHRlbnNpb25zLmpvaW4oXCIsIFwiKTtcblx0XHR9XG5cblx0XHRpZiAoZmlsZSAmJiAoZmlsZS5zaXplID4gKDEwNDg1NzYgKiBtYXhTaXplKSB8fCBmaWxlLnNpemUgPiBzZXR0aW5ncy5tYXhVcGxvYWQpKVxuXHRcdFx0ZXJyb3JzW2Vycm9yS2V5XSA9IFwiVGhlIGZpbGUgeW91IGhhdmUgc2VsZWN0ZWQgaXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gYWxsb3dlZCBmaWxlIHNpemUgKFwiICsgbWF4U2l6ZSArIFwiTUIgbWF4LikuXCI7XG5cblx0XHRyZXR1cm4gZXJyb3JzO1xuXHR9LFxuXG5cdGluY3JlbWVudFVzYWdlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5oYXMoXCJ1c2FnZVwiKSlcblx0XHRcdHRoaXMuc2V0KFwidXNhZ2VcIiwgKHBhcnNlSW50KHRoaXMuZ2V0KFwidXNhZ2VcIiksIDApIHx8IDApICsgMSk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5zZXQoXCJ1c2FnZVwiLCAxKTtcblx0fSxcblxuXHRkZWNyZW1lbnRVc2FnZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zZXQoXCJ1c2FnZVwiLCBNYXRoLm1heCgwLCAocGFyc2VJbnQodGhpcy5nZXQoXCJ1c2FnZVwiKSwgMCkgfHwgMCkgLSAxKSk7XG5cdH0sXG59KTsiXX0=",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar header_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span class=\\\"flash-card-face-label\\\"></span>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar header_oldRoot = header_obj.root;\nheader_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\theader_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar error_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"flash-card-error-message-container\\\">\\n\\t\\t<span>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"message\"), env.opts.autoescape);\noutput += \"</span>\\n\\t</div>\\n\\n\\t<div class=\\\"flash-card-error-button-container\\\">\\n\\t\\t<span class=\\\"fal fa-check button-dismiss\\\"/>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar error_oldRoot = error_obj.root;\nerror_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\terror_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar saveConfirmation_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"flash-card-save-confirmation-message-container\\\">\\n\\t\\t<span>Save changes before leaving?</span>\\n\\t</div>\\n\\n\\t<div class=\\\"flash-card-save-confirmation-button-container\\\">\\n\\t\\t<div class=\\\"flash-card-save-confirmation-card-spacer\\\">\\n\\t\\t</div>\\n\\n\\t\\t<span class=\\\"fal fa-check button-accept\\\"/>\\n\\n\\t\\t<div class=\\\"flash-card-save-confirmation-card-spacer\\\">\\n\\t\\t</div>\\n\\n\\t\\t<span class=\\\"fal fa-times button-reject\\\"/>\\n\\n\\t\\t<div class=\\\"flash-card-save-confirmation-card-spacer\\\">\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar saveConfirmation_oldRoot = saveConfirmation_obj.root;\nsaveConfirmation_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tsaveConfirmation_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar status_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span class=\\\"spinner-icon\\\"/>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar status_oldRoot = status_obj.root;\nstatus_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tstatus_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar controls_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span class=\\\"fal fa-exchange button-flip\\\"/>\\n\\t<span class=\\\"fal fa-check button-accept\\\"/>\\n\\t<span class=\\\"fal fa-times button-reject\\\"/>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar controls_oldRoot = controls_obj.root;\ncontrols_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcontrols_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar editor_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"header-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"flash-card-container\\\">\\n\\t\\t<div class=\\\"flash-card-warning-container\\\" id=\\\"top\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"flash-card\\\" id=\\\"the-flash-card\\\">\\n\\t\\t\\t<div class=\\\"front reversible\\\">\\n\\t\\t\\t\\t<div class=\\\"flash-card-text-input\\\" id=\\\"text-front\\\" contenteditable=\\\"true\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, (lineno = 10, colno = 84, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"front\"), \"front\", context, []))), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"back reversible\\\">\\n\\t\\t\\t\\t<div class=\\\"flash-card-text-input\\\" id=\\\"text-back\\\" contenteditable=\\\"true\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, (lineno = 14, colno = 82, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"back\"), \"back\", context, []))), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"flash-card-warning-container\\\" id=\\\"bottom\\\">\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"control-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar editor_oldRoot = editor_obj.root;\neditor_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\teditor_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"header\": new nunjucks.Template( {obj: header_obj, type: \"code\"}, env),\t\"error\": new nunjucks.Template( {obj: error_obj, type: \"code\"}, env),\t\"saveConfirmation\": new nunjucks.Template( {obj: saveConfirmation_obj, type: \"code\"}, env),\t\"status\": new nunjucks.Template( {obj: status_obj, type: \"code\"}, env),\t\"controls\": new nunjucks.Template( {obj: controls_obj, type: \"code\"}, env),\t\"editor\": new nunjucks.Template( {obj: editor_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar header_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span class=\\\"fal fa-plus sub-header-button button-add\\\"/>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar header_oldRoot = header_obj.root;\nheader_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\theader_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar subHeader_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"flash-card-list-sub-header-content-container\\\">\\n\\t\\t<div class=\\\"flash-card-list-column-container\\\">\\n\\t\\t\\t<div class=\\\"flash-card-list-column-spacer\\\">\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"flash-card-list-column-label\\\">\\n\\t\\t\\t\\t<span>Front</span>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"flash-card-list-column-spacer\\\">\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"flash-card-list-column-label\\\">\\n\\t\\t\\t\\t<span>Back</span>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"flash-card-list-column-spacer\\\">\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"flash-card-list-column-spacer\\\">\\n\\t\\t\\t<span class=\\\"fal fa-trash-alt button-delete\\\"/>\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar subHeader_oldRoot = subHeader_obj.root;\nsubHeader_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tsubHeader_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar itemDisplay_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"flash-card-list-item-card-container\\\">\\n\\t\\t<div class=\\\"flash-card-list-item-card-spacer\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"flash-card-list-item-card front\\\">\\n\\t\\t\\t<div>\\n\\t\\t\\t\\t\";\noutput += runtime.suppressValue((lineno = 7, colno = 10, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"front\"), \"front\", context, [])), env.opts.autoescape);\noutput += \"\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"flash-card-list-item-card-spacer\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"flash-card-list-item-card back\\\">\\n\\t\\t\\t<div>\\n\\t\\t\\t\\t\";\noutput += runtime.suppressValue((lineno = 16, colno = 9, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"back\"), \"back\", context, [])), env.opts.autoescape);\noutput += \"\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"flash-card-list-item-card-spacer\\\">\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"flash-card-list-item-button-container flash-card-list-item-button-container-vertical\\\">\\n\\t\\t<div class=\\\"flash-card-list-item-card-spacer\\\">\\n\\t\\t</div>\\n\\n\\t\\t<span class=\\\"fal fa-pencil button-edit\\\"/>\\n\\n\\t\\t<div class=\\\"flash-card-list-item-card-spacer\\\">\\n\\t\\t</div>\\n\\n\\t\\t<span class=\\\"fal fa-trash-alt button-delete\\\"/>\\n\\n\\t\\t<div class=\\\"flash-card-list-item-card-spacer\\\">\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar itemDisplay_oldRoot = itemDisplay_obj.root;\nitemDisplay_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\titemDisplay_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar itemDeleteConfirmation_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"flash-card-list-item-message-container\\\">\\n\\t\\t<span>Delete this card?</span>\\n\\t</div>\\n\\n\\t<div class=\\\"flash-card-list-item-button-container\\\">\\n\\t\\t<div class=\\\"flash-card-list-item-card-spacer\\\">\\n\\t\\t</div>\\n\\n\\t\\t<span class=\\\"fal fa-check button-accept\\\"/>\\n\\n\\t\\t<div class=\\\"flash-card-list-item-card-spacer\\\">\\n\\t\\t</div>\\n\\n\\t\\t<span class=\\\"fal fa-times button-reject\\\"/>\\n\\n\\t\\t<div class=\\\"flash-card-list-item-card-spacer\\\">\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar itemDeleteConfirmation_oldRoot = itemDeleteConfirmation_obj.root;\nitemDeleteConfirmation_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\titemDeleteConfirmation_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar itemStatus_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span class=\\\"spinner-icon\\\"/>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar itemStatus_oldRoot = itemStatus_obj.root;\nitemStatus_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\titemStatus_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar itemError_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"flash-card-list-item-message-container\\\">\\n\\t\\t<span>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"message\"), env.opts.autoescape);\noutput += \"</span>\\n\\t</div>\\n\\n\\t<div class=\\\"flash-card-list-item-button-container\\\">\\n\\t\\t<span class=\\\"fal fa-check button-dismiss\\\"/>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar itemError_oldRoot = itemError_obj.root;\nitemError_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\titemError_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar item_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"flash-card-list-item-content-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar item_oldRoot = item_obj.root;\nitem_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\titem_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar layout_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"header-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"sub-header-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"body-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar layout_oldRoot = layout_obj.root;\nlayout_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlayout_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"header\": new nunjucks.Template( {obj: header_obj, type: \"code\"}, env),\t\"subHeader\": new nunjucks.Template( {obj: subHeader_obj, type: \"code\"}, env),\t\"itemDisplay\": new nunjucks.Template( {obj: itemDisplay_obj, type: \"code\"}, env),\t\"itemDeleteConfirmation\": new nunjucks.Template( {obj: itemDeleteConfirmation_obj, type: \"code\"}, env),\t\"itemStatus\": new nunjucks.Template( {obj: itemStatus_obj, type: \"code\"}, env),\t\"itemError\": new nunjucks.Template( {obj: itemError_obj, type: \"code\"}, env),\t\"item\": new nunjucks.Template( {obj: item_obj, type: \"code\"}, env),\t\"layout\": new nunjucks.Template( {obj: layout_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar deckTitle_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"title\")) {\noutput += \"\\n\\t\\t<div class=\\\"deck-title-container\\\">\\n\\t\\t\\t<span class=\\\"deck-title-label\\\">Flashcard Decks</span>\\n\\t\\t\\t<span>&nbsp;&gt;&nbsp;</span>\\n\\t\\t\\t<span class=\\\"deck-title\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"title\"), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"deck-size-container\\\">\\n\\t\\t\\t<div class=\\\"card-count-container\\\">\\n\\t\\t\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"cardNumber\") == runtime.contextOrFrameLookup(context, frame, \"null\")) {\noutput += \"\\n\\t\\t\\t\\t\\t<span>&ndash;</span>\\n\\t\\t\\t\\t\\t<span>&nbsp;of&nbsp;</span>\\n\\t\\t\\t\\t\\t<span>&ndash;</span>\\n\\t\\t\\t\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t\\t\\t\\t<span>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"cardNumber\"), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t\\t\\t\\t<span>&nbsp;of&nbsp;</span>\\n\\t\\t\\t\\t\\t<span>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"cardCount\"), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<span class=\\\"card-max-label\\\">Max.&nbsp;\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"cardCountMax\"), env.opts.autoescape);\noutput += \"&nbsp;cards</span>\\n\\t\\t</div>\\n\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t<div class=\\\"deck-title-container-empty\\\">\\n\\t\\t\\t<span class=\\\"deck-title-label-empty\\\">No deck selected.</span>\\n\\t\\t</div>\\n\\t\";\n;\n}\noutput += \"\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar deckTitle_oldRoot = deckTitle_obj.root;\ndeckTitle_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tdeckTitle_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar cardEditor_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"flash-card-editor-navigator\\\">\\n\\t\\t<span class=\\\"fal fa-angle-left\\\" id=\\\"button-previous\\\"/>\\n\\t</div>\\n\\n\\t<div class=\\\"flash-card-editor-container\\\">\\n\\t\\t<div class=\\\"flash-card-warning-container\\\" id=\\\"top\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"flash-card \";\noutput += runtime.suppressValue(((lineno = 9, colno = 47, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"cardModelExists\"), \"cardModelExists\", context, []))?\"\":\"flash-card-disabled\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t<div class=\\\"reversible front\\\">\\n\\t\\t\\t\\t<textarea class=\\\"flash-card-text-input-area\\\" id=\\\"text-front\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, (lineno = 11, colno = 71, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"front\"), \"front\", context, []))), env.opts.autoescape);\noutput += \"</textarea>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"reversible back\\\">\\n\\t\\t\\t\\t<textarea class=\\\"flash-card-text-input-area\\\" id=\\\"text-back\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, (lineno = 15, colno = 69, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"back\"), \"back\", context, []))), env.opts.autoescape);\noutput += \"</textarea>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"flash-card-warning-container\\\" id=\\\"bottom\\\">\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"flash-card-editor-navigator\\\">\\n\\t\\t<span class=\\\"fal fa-angle-right\\\" id=\\\"button-next\\\"/>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar cardEditor_oldRoot = cardEditor_obj.root;\ncardEditor_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcardEditor_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar controls_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span class=\\\"fal fa-exchange button-flip\\\"/>\\n\\n\\t<span class=\\\"fal fa-check button-accept hide\\\"/>\\n\\t<span class=\\\"fal fa-times button-reject hide\\\"/>\\n\\n\\t<span class=\\\"fal fa-plus-circle button-create\\\"/>\\n\\t<span class=\\\"fal fa-trash-alt button-delete\\\"/>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar controls_oldRoot = controls_obj.root;\ncontrols_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcontrols_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar deleteConfirmation_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"flash-card-editor-list-item-tab\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"flash-card-editor-list-item-message-container\\\">\\n\\t\\t<span>Delete this flashcard?</span>\\n\\t</div>\\n\\n\\t<div class=\\\"flash-card-editor-list-item-button-container\\\">\\n\\t\\t<span class=\\\"fal fa-check button-accept\\\" />\\n\\t\\t<span class=\\\"fal fa-times button-reject\\\" />\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar deleteConfirmation_oldRoot = deleteConfirmation_obj.root;\ndeleteConfirmation_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tdeleteConfirmation_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar error_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"flash-card-error-message-container\\\">\\n\\t\\t<span>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"message\"), env.opts.autoescape);\noutput += \"</span>\\n\\t</div>\\n\\n\\t<div class=\\\"flash-card-error-button-container\\\">\\n\\t\\t<span class=\\\"fal fa-check button-dismiss\\\"/>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar error_oldRoot = error_obj.root;\nerror_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\terror_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar status_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span class=\\\"spinner-icon\\\"/>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar status_oldRoot = status_obj.root;\nstatus_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tstatus_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar layout_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"flash-card-widget-layout-header\\\">\\n\\t\\t<span>Flashcard Creation Tool</span>\\n\\t\\t<span class=\\\"fal fa-times button-close\\\"/>\\n\\t</div>\\n\\n\\t<div class=\\\"status-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"flash-card-widget-layout-body hide\\\">\\n\\t\\t<div class=\\\"deck-title-region\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"card-editor-region\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"control-region\\\">\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"deck-selector-slider deck-selector-slider-open hide\\\">\\n\\t\\t<div class=\\\"deck-selector-region\\\">\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar layout_oldRoot = layout_obj.root;\nlayout_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlayout_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"deckTitle\": new nunjucks.Template( {obj: deckTitle_obj, type: \"code\"}, env),\t\"cardEditor\": new nunjucks.Template( {obj: cardEditor_obj, type: \"code\"}, env),\t\"controls\": new nunjucks.Template( {obj: controls_obj, type: \"code\"}, env),\t\"deleteConfirmation\": new nunjucks.Template( {obj: deleteConfirmation_obj, type: \"code\"}, env),\t\"error\": new nunjucks.Template( {obj: error_obj, type: \"code\"}, env),\t\"status\": new nunjucks.Template( {obj: status_obj, type: \"code\"}, env),\t\"layout\": new nunjucks.Template( {obj: layout_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar header_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"sub-header-title-container\\\">\\n\\t\\t<span class=\\\"sub-header-title\\\">Flashcard Decks</span>\\n\\t</div>\\n\\n\\t<div class=\\\"flash-card-deck-editor-header-button-container\\\">\\n\\t\\t<span class=\\\"fal fa-plus sub-header-button button-add\\\"/>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar header_oldRoot = header_obj.root;\nheader_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\theader_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar textFilter_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"fal fa-search search-glyph\\\" />\\n\\t<input type=\\\"text\\\" class=\\\"text-filter-input\\\" placeholder=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"placeholderText\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t<div class=\\\"fal fa-times button-clear hide\\\" />\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar textFilter_oldRoot = textFilter_obj.root;\ntextFilter_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\ttextFilter_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar listItemDisplay_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"flash-card-editor-list-item-tab\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"flash-card-editor-list-item-text-container\\\">\\n\\t\\t<div class=\\\"flash-card-editor-list-item-title-container\\\">\\n\\t\\t\\t<span class=\\\"flash-card-editor-list-item-title\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"title\")), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"flash-card-deck-editor-list-item-metadata\\\">\\n\\t\\t\\t<div class=\\\"flash-card-deck-editor-list-item-metadata-row\\\">\\n\\t\\t\\t\\t<span class=\\\"flash-card-deck-editor-list-item-card-count\\\"></span>\\n\\t\\t\\t</div>\\n\\t\\t\\t<div class=\\\"flash-card-deck-editor-list-item-metadata-row\\\">\\n\\t\\t\\t\\t<span>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"language\"), env.opts.autoescape);\noutput += \",&nbsp;\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"contentGrade\"), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t\\t</div>\\n\\t\\t\\t<div class=\\\"flash-card-deck-editor-list-item-metadata\\\">\\n\\t\\t\\t\\t<span>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"subject_name\"), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t\\t</div>\\n\\t\\t\\t<div class=\\\"flash-card-deck-editor-list-item-metadata-row\\\">\\n\\t\\t\\t\\t<span class=\\\"flash-card-deck-editor-list-item-metadata-label\\\">Created:&nbsp;</span><span>\";\noutput += runtime.suppressValue((lineno = 20, colno = 105, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"createdDate\"), \"createdDate\", context, [])), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t\\t\\t<span class=\\\"flash-card-deck-editor-list-item-metadata-label\\\">Updated:&nbsp;</span><span>\";\noutput += runtime.suppressValue(((lineno = 21, colno = 122, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"updatedDate\"), \"updatedDate\", context, []))?(lineno = 21, colno = 105, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"updatedDate\"), \"updatedDate\", context, [])):\"never\"), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"flash-card-editor-list-item-button-container\\\">\\n\\t\\t<span class=\\\"fal fa-play flash-card-editor-list-button button-play \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"canPlay\")?\"\":\"hide\"), env.opts.autoescape);\noutput += \"\\\" />\\n\\t\\t<span class=\\\"fal fa-stop flash-card-editor-list-button button-stop hide\\\" />\\n\\t\\t<span class=\\\"fal fa-expand-alt flash-card-editor-list-button button-fullscreen hide\\\" />\\n\\t\\t<span class=\\\"fal fa-pencil flash-card-editor-list-button button-edit \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"showEditButton\")?\"\":\"hide\"), env.opts.autoescape);\noutput += \"\\\" />\\n\\t\\t<span class=\\\"fal fa-trash-alt flash-card-editor-list-button button-delete\\\" />\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar listItemDisplay_oldRoot = listItemDisplay_obj.root;\nlistItemDisplay_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlistItemDisplay_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar listItemEditor_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"flash-card-editor-list-item-tab\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"flash-card-editor-list-item-text-container\\\">\\n\\t\\t<input type=\\\"text\\\" value=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"title\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"flash-card-editor-list-item-button-container\\\">\\n\\t\\t<span class=\\\"fal fa-check flash-card-editor-list-button button-accept\\\" />\\n\\t\\t<span class=\\\"fal fa-times flash-card-editor-list-button button-reject\\\" />\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar listItemEditor_oldRoot = listItemEditor_obj.root;\nlistItemEditor_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlistItemEditor_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar listItemDeleteConfirmation_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"flash-card-editor-list-item-tab\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"flash-card-editor-list-item-message-container\\\">\\n\\t\\t<span>Delete this deck and all of its cards?</span>\\n\\t</div>\\n\\n\\t<div class=\\\"flash-card-editor-list-item-button-container\\\">\\n\\t\\t<span class=\\\"fal fa-check flash-card-editor-list-button button-accept\\\" />\\n\\t\\t<span class=\\\"fal fa-times flash-card-editor-list-button button-reject\\\" />\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar listItemDeleteConfirmation_oldRoot = listItemDeleteConfirmation_obj.root;\nlistItemDeleteConfirmation_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlistItemDeleteConfirmation_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar listItemError_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"flash-card-editor-list-item-tab\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"flash-card-editor-list-item-message-container\\\">\\n\\t\\t<span>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"message\"), env.opts.autoescape);\noutput += \"</span>\\n\\t</div>\\n\\n\\t<div class=\\\"flash-card-editor-list-item-button-container\\\">\\n\\t\\t<span class=\\\"fal fa-check flash-card-editor-list-button button-dismiss\\\" />\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar listItemError_oldRoot = listItemError_obj.root;\nlistItemError_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlistItemError_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar listItemStatus_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"flash-card-editor-list-item-message-container\\\">\\n\\t\\t<span class=\\\"spinner-icon small\\\"/>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar listItemStatus_oldRoot = listItemStatus_obj.root;\nlistItemStatus_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlistItemStatus_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar listItem_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"flash-card-editor-list-item-content-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar listItem_oldRoot = listItem_obj.root;\nlistItem_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlistItem_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar emptyList_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span>No decks available.</span>\\n\\t<span>Select + to create a new deck.</span>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar emptyList_oldRoot = emptyList_obj.root;\nemptyList_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\temptyList_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar layout_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"header-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"filter-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"list-container\\\">\\n\\t\\t<div class=\\\"list-region\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"list-spinner hide\\\">\\n\\t\\t\\t<span class=\\\"spinner-icon spinner-large spinner-working\\\"/>\\n\\t\\t\\t<span>Fetching decks...</span>\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar layout_oldRoot = layout_obj.root;\nlayout_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlayout_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"header\": new nunjucks.Template( {obj: header_obj, type: \"code\"}, env),\t\"textFilter\": new nunjucks.Template( {obj: textFilter_obj, type: \"code\"}, env),\t\"listItemDisplay\": new nunjucks.Template( {obj: listItemDisplay_obj, type: \"code\"}, env),\t\"listItemEditor\": new nunjucks.Template( {obj: listItemEditor_obj, type: \"code\"}, env),\t\"listItemDeleteConfirmation\": new nunjucks.Template( {obj: listItemDeleteConfirmation_obj, type: \"code\"}, env),\t\"listItemError\": new nunjucks.Template( {obj: listItemError_obj, type: \"code\"}, env),\t\"listItemStatus\": new nunjucks.Template( {obj: listItemStatus_obj, type: \"code\"}, env),\t\"listItem\": new nunjucks.Template( {obj: listItem_obj, type: \"code\"}, env),\t\"emptyList\": new nunjucks.Template( {obj: emptyList_obj, type: \"code\"}, env),\t\"layout\": new nunjucks.Template( {obj: layout_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar cardEditorBlank_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span>Create or select a deck of cards to edit.</span>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar cardEditorBlank_oldRoot = cardEditorBlank_obj.root;\ncardEditorBlank_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcardEditorBlank_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar layout_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"status-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"content-container hide\\\">\\n\\t\\t<div class=\\\"deck-region\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"card-region\\\">\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar layout_oldRoot = layout_obj.root;\nlayout_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlayout_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"cardEditorBlank\": new nunjucks.Template( {obj: cardEditorBlank_obj, type: \"code\"}, env),\t\"layout\": new nunjucks.Template( {obj: layout_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"flash-card-player-background\\\">\\n\\t<!-- ==================================================================== -->\\n\\t<!-- Error -->\\n\\t<!-- ==================================================================== -->\\n\\t<div class=\\\"flash-card-player-view hidden\\\" id=\\\"error\\\">\\n\\t\\t<div class=\\\"flash-card-player-console-header\\\">\\n\\t\\t\\t<div class=\\\"flash-card-player-header-button-container\\\">\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"flash-card-player-console-title-container\\\">\\n\\t\\t\\t\\t<span id=\\\"deck-title\\\">Deck Title</span>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"flash-card-player-header-button-container\\\">\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"flash-card-player-viewer-sub-header\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"flash-card-player-console\\\" id=\\\"error-console\\\">\\n\\t\\t\\t<p id=\\\"error-message\\\">\\n\\t\\t\\t</p>\\n\\n\\t\\t\\t<div class=\\\"flash-card-player-menu-button hidden\\\" id=\\\"console-button-close\\\">\\n\\t\\t\\t\\t<span>Close</span>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"flash-card-player-footer\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"version-information-container\\\">\\n\\t\\t\\t<span></span>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<!-- ==================================================================== -->\\n\\t<!-- Menu -->\\n\\t<!-- ==================================================================== -->\\n\\t<div class=\\\"flash-card-player-view hidden\\\" id=\\\"menu\\\">\\n\\t\\t<div class=\\\"flash-card-player-console-header\\\">\\n\\t\\t\\t<div class=\\\"flash-card-player-header-button-container\\\">\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"flash-card-player-console-title-container\\\">\\n\\t\\t\\t\\t<span id=\\\"deck-title\\\">Deck Title</span>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"flash-card-player-header-button-container\\\">\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"flash-card-player-viewer-sub-header\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"flash-card-player-console\\\">\\n\\t\\t\\t<div class=\\\"flash-card-player-menu-button-container\\\">\\n\\t\\t\\t\\t<div class=\\\"flash-card-player-menu-button\\\" id=\\\"console-button-statistics\\\">\\n\\t\\t\\t\\t\\t<span>Review performance</span>\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div class=\\\"flash-card-player-menu-button hidden\\\" id=\\\"console-button-resume\\\">\\n\\t\\t\\t\\t\\t<span>Resume</span>\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div class=\\\"flash-card-player-menu-button\\\" id=\\\"console-button-configure\\\">\\n\\t\\t\\t\\t\\t<span>Start</span>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"flash-card-player-footer\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"version-information-container\\\">\\n\\t\\t\\t<span></span>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<!-- ==================================================================== -->\\n\\t<!-- Configuration -->\\n\\t<!-- ==================================================================== -->\\n\\t<div class=\\\"flash-card-player-view hidden\\\" id=\\\"configuration\\\">\\n\\t\\t<div class=\\\"flash-card-player-console-header\\\">\\n\\t\\t\\t<div class=\\\"flash-card-player-header-button-container\\\">\\n\\t\\t\\t\\t<span class=\\\"flash-card-player-back-button\\\">Back to menu</span>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"flash-card-player-console-title-container\\\">\\n\\t\\t\\t\\t<span id=\\\"deck-title\\\">Deck Title</span>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"flash-card-player-header-button-container\\\">\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"flash-card-player-viewer-sub-header\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"flash-card-player-console\\\">\\n\\t\\t\\t<div id=\\\"configuration-control-container\\\">\\n\\t\\t\\t\\t<div id=\\\"configuration-options\\\">\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div class=\\\"flash-card-player-menu-button-container\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"flash-card-player-menu-button\\\" id=\\\"console-button-start\\\">\\n\\t\\t\\t\\t\\t\\t<span>Start</span>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"flash-card-player-footer\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"version-information-container\\\">\\n\\t\\t\\t<span></span>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<!-- ==================================================================== -->\\n\\t<!-- Statistics -->\\n\\t<!-- ==================================================================== -->\\n\\t<div class=\\\"flash-card-player-view hidden\\\" id=\\\"statistics\\\">\\n\\t\\t<div class=\\\"flash-card-player-console-header\\\">\\n\\t\\t\\t<div class=\\\"flash-card-player-header-button-container\\\">\\n\\t\\t\\t\\t<span class=\\\"flash-card-player-back-button\\\">Back to menu</span>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"flash-card-player-console-title-container\\\">\\n\\t\\t\\t\\t<span id=\\\"deck-title\\\">Deck Title</span>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"flash-card-player-header-button-container\\\">\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"flash-card-player-viewer-sub-header\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"flash-card-player-console\\\">\\n\\t\\t\\t<div id=\\\"session-history-chart\\\">\\n\\t\\t\\t\\t<div>\\n\\t\\t\\t\\t\\t<span id=\\\"session-history-chart-title\\\">Past Study Sessions</span>\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div id=\\\"session-history-chart-data\\\">\\n\\t\\t\\t\\t\\t<div id=\\\"y-axis\\\">\\n\\t\\t\\t\\t\\t\\t<span id=\\\"y-axis-title\\\">Progress (Number of Cards)</span>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div id=\\\"x-axis-title\\\">\\n\\t\\t\\t\\t\\t<span>Session</span>\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div id=\\\"session-history-chart-legend\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"legend-entry\\\">\\n\\t\\t\\t\\t\\t\\t<div class=\\\"legend-label\\\" id=\\\"legend-label-got-it\\\"></div>\\n\\t\\t\\t\\t\\t\\t<span>Got it</span>\\n\\t\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t\\t<div class=\\\"legend-entry\\\">\\n\\t\\t\\t\\t\\t\\t<div class=\\\"legend-label\\\" id=\\\"legend-label-needs-practise\\\"></div>\\n\\t\\t\\t\\t\\t\\t<span>Needs practise</span>\\n\\t\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t\\t<div class=\\\"legend-entry\\\">\\n\\t\\t\\t\\t\\t\\t<div class=\\\"legend-label\\\" id=\\\"legend-label-skipped\\\"></div>\\n\\t\\t\\t\\t\\t\\t<span>Skipped</span>\\n\\t\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t\\t<div class=\\\"legend-entry\\\">\\n\\t\\t\\t\\t\\t\\t<div class=\\\"legend-label\\\" id=\\\"legend-label-incomplete\\\"></div>\\n\\t\\t\\t\\t\\t\\t<span>Incomplete</span>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"flash-card-player-footer\\\">\\n\\t\\t\\t<div class=\\\"flash-card-player-viewer-button-container\\\">\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"flash-card-player-viewer-button\\\" id=\\\"statistics-button-try-again\\\">\\n\\t\\t\\t\\t<span>Try again</span>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"version-information-container\\\">\\n\\t\\t\\t<span></span>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<!-- ==================================================================== -->\\n\\t<!-- Flashcards -->\\n\\t<!-- ==================================================================== -->\\n\\t<div class=\\\"flash-card-player-view hidden\\\" id=\\\"viewer\\\">\\n\\t\\t<div class=\\\"flash-card-player-viewer-header\\\">\\n\\t\\t\\t<div class=\\\"flash-card-player-header-button-container\\\">\\n\\t\\t\\t\\t<span class=\\\"flash-card-player-back-button\\\">Quit</span>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"flash-card-player-console-title-container\\\">\\n\\t\\t\\t\\t<span id=\\\"deck-title\\\">Deck Title</span>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"flash-card-player-header-button-container\\\">\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"flash-card-player-viewer-sub-header\\\">\\n\\t\\t\\t<div class=\\\"flash-card-player-viewer-information-display-container\\\" id=\\\"left-information-container\\\">\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"flash-card-player-viewer-information-display-container\\\" id=\\\"center-information-container\\\">\\n\\t\\t\\t\\t<span class=\\\"flash-card-player-viewer-static-information-display\\\">Tap the card to flip it</span>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"flash-card-player-viewer-information-display-container\\\" id=\\\"right-information-container\\\">\\n\\t\\t\\t\\t<span class=\\\"flash-card-player-viewer-information-display\\\" id=\\\"card-number-display\\\">Card # of #</span>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div id=\\\"flash-card-player-card-container\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"flash-card-player-footer hidden\\\" id=\\\"preview-footer\\\">\\n\\t\\t\\t<div class=\\\"flash-card-player-viewer-button-container\\\">\\n\\t\\t\\t\\t<div class=\\\"flash-card-player-viewer-button\\\" id=\\\"viewer-button-previous\\\">\\n\\t\\t\\t\\t\\t<span>Previous</span>\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div class=\\\"flash-card-player-viewer-button\\\" id=\\\"viewer-button-next\\\">\\n\\t\\t\\t\\t\\t<span>Next</span>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"flash-card-player-footer\\\" id=\\\"live-footer\\\">\\n\\t\\t\\t<div class=\\\"flash-card-player-viewer-button-container\\\">\\n\\t\\t\\t\\t<span id=\\\"viewer-button-skip\\\">Skip</span>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"flash-card-player-viewer-button-container\\\">\\n\\t\\t\\t\\t<div class=\\\"flash-card-player-viewer-button\\\" id=\\\"viewer-button-needs-practise\\\">\\n\\t\\t\\t\\t\\t<span>Needs practise</span>\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div class=\\\"flash-card-player-viewer-button\\\" id=\\\"viewer-button-got-it\\\">\\n\\t\\t\\t\\t\\t<span>Got it</span>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"version-information-container\\\">\\n\\t\\t\\t<span></span>\\n\\t\\t</div>\\n\\t</div>\\n</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"header\\\">\\n\\t<h4 class=\\\"title left\\\"><span class=\\\"fal fa-cubes\\\"/>&nbsp;\";\noutput += runtime.suppressValue(((env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"resources\")),\"all\")))?\"All\":\"Your\"), env.opts.autoescape);\noutput += \" Content</h4>\\n\\t<div class=\\\"actions\\\">\\n\\t\\t\";\nif((env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"api\")),\"resources\")),\"post\")))) {\noutput += \"\\n\\t\\t\\t<div class=\\\"other-actions\\\">\\n\\t\\t\\t\\t<div class=\\\"multiselect-container\\\">\\n\\t\\t\\t\\t\\t<label><input type=\\\"checkbox\\\"/>&nbsp;&nbsp;Select&nbsp;Multiple</label>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t<div class=\\\"add-item\\\"><span class=\\\"fal fa-plus\\\"/> Add New...</div>\\n\\t\\t\\t\\t<div class=\\\"import-item\\\"><span class=\\\"fal fa-cloud-upload\\\"/> Import Existing...</div>\\n\\t\\t\\t</div>\\n\\t\\t\\t<div class=\\\"multi-actions hide\\\">\\n\\t\\t\\t\\t<div>\\n\\t\\t\\t\\t\\t<div class=\\\"delete\\\"><span class=\\\"fal fa-trash-alt\\\"></span>&nbsp;Delete</div>\\n\\t\\t\\t\\t\\t<div class=\\\"cancel\\\">Cancel</div>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t<!--<div class=\\\"download\\\"><span class=\\\"fa fa-cloud-download\\\"/> Downloads</div>-->\\n\\t</div>\\n</div>\\n\\n<div class=\\\"ops-bar\\\">\\n\\t<div class=\\\"filters\\\"></div>\\n\\t<div class=\\\"counter\\\"></div>\\n</div>\\n\\n<div class=\\\"grid\\\">\\n\\t<div class=\\\"overlay\\\">\\n\\t\\t<h2>Drop files to upload them <span class=\\\"fal fa-cloud-upload\\\"/></h2>\\n\\t\\t<div class=\\\"cancel-drop\\\"><span class=\\\"fal fa-trash-alt\\\"></span>Don't&nbspUpload</div>\\n\\t</div>\\n</div>\\n\\n<div class=\\\"paging\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar content_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<h4>Are you sure you want to delete these items?</h4>\\n\\t\\t\\t<div class=\\\"list-container\\\">\\n\\t\\t\\t\\t<table class=\\\"confirm-items\\\">\\n\\t\\t\\t\\t\\t<thead>\\n\\t\\t\\t\\t\\t\\t<tr><th>Title</th><th>Selected</th></tr>\\n\\t\\t\\t\\t\\t</thead>\\n\\t\\t\\t\\t\\t\";\nframe = frame.push();\nvar t_3 = runtime.contextOrFrameLookup(context, frame, \"models\");\nif(t_3) {var t_2 = t_3.length;\nfor(var t_1=0; t_1 < t_3.length; t_1++) {\nvar t_4 = t_3[t_1];\nframe.set(\"model\", t_4);\nframe.set(\"loop.index\", t_1 + 1);\nframe.set(\"loop.index0\", t_1);\nframe.set(\"loop.revindex\", t_2 - t_1);\nframe.set(\"loop.revindex0\", t_2 - t_1 - 1);\nframe.set(\"loop.first\", t_1 === 0);\nframe.set(\"loop.last\", t_1 === t_2 - 1);\nframe.set(\"loop.length\", t_2);\noutput += \"\\n\\t\\t\\t\\t\\t\\t<tr class=\\\"item\\\"><td>\";\noutput += runtime.suppressValue(runtime.memberLookup((t_4),\"title\"), env.opts.autoescape);\noutput += \"</td><td><span class=\\\"fa-circle fas status-icon status-selected\\\" data-id=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_4),\"_id\"), env.opts.autoescape);\noutput += \"\\\"></span></td></tr>\\n\\t\\t\\t\\t\\t\";\n;\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t\\t\\t</table>\\n\\t\\t\\t</div>\\t\\n\\t\\t\\t<p>They will not be removed from books and learning paths; they will just become unusable going forward. You can choose to remove them from your books and learning paths by clicking the option below.</p>\\n\\t\\t\\t<p><label><input type='checkbox' value='1' class=\\\"and-attachments\\\"> Yes, also remove all instances of this item from my books and \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"learningPathsPluralCustomName\"), env.opts.autoescape);\noutput += \" </label></p>\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar content_oldRoot = content_obj.root;\ncontent_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcontent_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"content\": new nunjucks.Template( {obj: content_obj, type: \"code\"}, env),};\n",
    "\"use strict\";\n\nrequire(\"jquery.flip\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar Radio = Backbone.Radio;\nvar tippy = require(\"tippy.js\").default;\n\nvar DEFAULT_BACK_TEXT = \"Enter text for the back of the card...\";\nvar DEFAULT_FRONT_TEXT = \"Enter text for the front of the card...\";\nvar MAX_NEW_LINE_CHARACTERS = 15;\nvar MAX_TEXT_LENGTH = 500;\n\nvar Header = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-header\",\n\n\ttemplate: require(\"../../templates/flashCards/cardEditor.nunj\").header,\n\n\tui: {\n\t\tfaceLabel: \".flash-card-face-label\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.listenTo(Radio.channel(\"flashCards\"), \"card:edit:flipped\", this.onCardFlip.bind(this));\n\t},\n\n\tonCardFlip: function onCardFlip(cardNumber, cardCount, newFace) {\n\t\tthis.ui.faceLabel.text(\"Card \" + cardNumber + \" of \" + cardCount + \" (\" + (newFace === \"back\" ? \"Back\" : \"Front\") + \")\");\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(Radio.channel(\"flashCards\"));\n\t}\n});\n\nvar Error = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-editor-error\",\n\n\ttemplate: require(\"../../templates/flashCards/cardEditor.nunj\").error,\n\n\tui: {\n\t\tbuttonDismiss: \".button-dismiss\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonDismiss\": \"onButtonDismissClick\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tmessage: this.message\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.message = options.message;\n\t},\n\n\tonRender: function onRender() {\n\t\ttippy(this.ui.buttonDismiss.get(0), {\n\t\t\ttheme: \"black\",\n\t\t\tplacement: \"bottom\",\n\t\t\tcontent: \"Ok\"\n\t\t});\n\t},\n\n\tonButtonDismissClick: function onButtonDismissClick() {\n\t\tRadio.channel(\"flashCards\").trigger(\"card:error:dismiss\");\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\t_.each(this.tooltipViews, function (t) {\n\t\t\treturn t.destroy();\n\t\t});\n\t}\n});\n\nvar SaveConfirmation = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-editor-save-confirmation\",\n\n\ttemplate: require(\"../../templates/flashCards/cardEditor.nunj\").saveConfirmation,\n\n\tui: {\n\t\tbuttonAccept: \".button-accept\",\n\t\tbuttonReject: \".button-reject\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonAccept\": \"onButtonAcceptClick\",\n\t\t\"click @ui.buttonReject\": \"onButtonRejectClick\"\n\t},\n\n\tonRender: function onRender() {\n\t\t_.each([{\n\t\t\ttargetEl: this.ui.buttonAccept.get(0),\n\t\t\tcontent: \"Yes\"\n\t\t}, {\n\t\t\ttargetEl: this.ui.buttonReject.get(0),\n\t\t\tcontent: \"No\"\n\t\t}], function (spec) {\n\t\t\treturn tippy(spec.targetEl, _.extend(_.omit(spec, [\"targetEl\"]), {\n\t\t\t\ttheme: \"black\",\n\t\t\t\tplacement: \"bottom\"\n\t\t\t}));\n\t\t});\n\t},\n\n\tonButtonAcceptClick: function onButtonAcceptClick() {\n\t\tRadio.channel(\"flashCards\").trigger(\"card:edit:accept\", this.model.cid);\n\t},\n\n\tonButtonRejectClick: function onButtonRejectClick() {\n\t\tRadio.channel(\"flashCards\").trigger(\"card:edit:reject\", this.model.cid);\n\t}\n});\n\nvar Status = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-editor-status\",\n\n\ttemplate: require(\"../../templates/flashCards/cardEditor.nunj\").status\n});\n\nvar Controls = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-editor-controls\",\n\n\ttemplate: require(\"../../templates/flashCards/cardEditor.nunj\").controls,\n\n\tui: {\n\t\tbuttonAccept: \".button-accept\",\n\t\tbuttonFlip: \".button-flip\",\n\t\tbuttonReject: \".button-reject\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonAccept\": \"onButtonAcceptClick\",\n\t\t\"click @ui.buttonFlip\": \"onButtonFlipClick\",\n\t\t\"click @ui.buttonReject\": \"onButtonRejectClick\"\n\t},\n\n\tonRender: function onRender() {\n\t\t_.each([{\n\t\t\ttargetEl: this.ui.buttonAccept.get(0),\n\t\t\tcontent: \"Save the card\"\n\t\t}, {\n\t\t\ttargetEl: this.ui.buttonFlip.get(0),\n\t\t\tcontent: \"Flip the card\"\n\t\t}, {\n\t\t\ttargetEl: this.ui.buttonReject.get(0),\n\t\t\tcontent: \"Cancel\"\n\t\t}], function (spec) {\n\t\t\treturn tippy(spec.targetEl, _.extend(_.omit(spec, [\"targetEl\"]), {\n\t\t\t\ttheme: \"black\",\n\t\t\t\tplacement: \"bottom\"\n\t\t\t}));\n\t\t});\n\t},\n\n\tonButtonAcceptClick: function onButtonAcceptClick() {\n\t\tRadio.channel(\"flashCards\").trigger(\"card:edit:accept\");\n\t},\n\n\tonButtonFlipClick: function onButtonFlipClick() {\n\t\tRadio.channel(\"flashCards\").trigger(\"card:edit:flip\");\n\t},\n\n\tonButtonRejectClick: function onButtonRejectClick() {\n\t\tRadio.channel(\"flashCards\").trigger(\"card:edit:reject:request\");\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-editor\",\n\n\ttemplate: require(\"../../templates/flashCards/cardEditor.nunj\").editor,\n\n\tregions: {\n\t\theader: \".header-region\",\n\t\tcontrol: \".control-region\"\n\t},\n\n\tui: {\n\t\tflashCard: \"#the-flash-card\",\n\t\ttextBack: \"#text-back\",\n\t\ttextFront: \"#text-front\",\n\t\twarningContainerBottom: \".flash-card-warning-container#bottom\"\n\t},\n\n\tevents: {\n\t\t\"blur @ui.textFront\": \"onTextBlur\",\n\t\t\"blur @ui.textBack\": \"onTextBlur\",\n\t\t\"focus @ui.textFront\": \"onTextFocus\",\n\t\t\"focus @ui.textBack\": \"onTextFocus\",\n\t\t\"keyup @ui.textFront\": \"onTextKey\",\n\t\t\"keyup @ui.textBack\": \"onTextKey\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar model = this.model;\n\n\t\treturn {\n\t\t\tback: function back() {\n\t\t\t\treturn model.get(\"back\").length === 0 ? DEFAULT_BACK_TEXT : model.get(\"back\");\n\t\t\t},\n\n\t\t\tfront: function front() {\n\t\t\t\treturn model.get(\"front\").length === 0 ? DEFAULT_FRONT_TEXT : model.get(\"front\");\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.deckModelCid = options.deckModelCid;\n\n\t\tthis.listenTo(Radio.channel(\"flashCards\"), {\n\t\t\t\"card:edit:accept\": this.onCardEditAccepted.bind(this),\n\t\t\t\"card:edit:flip\": this.onCardEditFlip.bind(this),\n\t\t\t\"card:edit:flipped\": this.onCardEditFlipped.bind(this),\n\t\t\t\"card:edit:reject:request\": this.onCardEditRejectRequested.bind(this),\n\t\t\t\"card:edit:save\": this.onCardEditSave.bind(this),\n\t\t\t\"card:error:dismiss\": this.onCardErrorDismissed.bind(this)\n\t\t});\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this = this;\n\n\t\tthis.showHeader();\n\t\tthis.showControls();\n\n\t\tthis.ui.flashCard.flip({\n\t\t\tspeed: 400,\n\t\t\ttrigger: \"manual\"\n\t\t}, function () {\n\t\t\tRadio.channel(\"flashCards\").trigger(\"card:edit:flipped\", Radio.channel(\"flashCards\").request(\"card:number\", _this.model), Radio.channel(\"flashCards\").request(\"cards:count\"), \"front\");\n\t\t});\n\t},\n\n\tonCardEditAccepted: function onCardEditAccepted() {\n\t\tvar _this2 = this;\n\n\t\tRadio.channel(\"flashCards\").trigger(\"card:edit:save\");\n\n\t\tif (this.validateTextLength()) {\n\t\t\tthis.model.once(\"invalid\", function () {\n\t\t\t\t_this2.showError(_this2.model.validationError);\n\t\t\t});\n\n\t\t\tvar attributes = {\n\t\t\t\tback: this.ui.textBack.get(0).innerText === DEFAULT_BACK_TEXT ? \"\" : this.ui.textBack.get(0).innerText,\n\t\t\t\tfront: this.ui.textFront.get(0).innerText === DEFAULT_FRONT_TEXT ? \"\" : this.ui.textFront.get(0).innerText\n\t\t\t};\n\n\t\t\tthis.model.save(attributes, {\n\t\t\t\twait: true,\n\n\t\t\t\tsuccess: function success(model) {\n\t\t\t\t\tRadio.channel(\"flashCards\").trigger(\"card:edit:saved\", _this2.model.cid, _this2.deckModelCid, model.has(\"updated\") ? model.get(\"updated\") : model.get(\"created\"));\n\t\t\t\t},\n\n\t\t\t\terror: function error() {\n\t\t\t\t\t_this2.showError(\"Error saving card.\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n\n\tvalidateTextLength: function validateTextLength() {\n\t\tvar valid = true;\n\t\tvar invalidTextLengthSide = void 0;\n\n\t\tif (!this.isTextLengthValid(\"back\")) invalidTextLengthSide = \"back\";\n\n\t\tif (!this.isTextLengthValid(\"front\")) {\n\t\t\tif (_.isNil(invalidTextLengthSide)) invalidTextLengthSide = \"front\";else invalidTextLengthSide = \"both\";\n\t\t}\n\n\t\tif (!_.isNil(invalidTextLengthSide)) {\n\t\t\tif (invalidTextLengthSide === \"both\") this.showError(\"Text on both sides of card is too long\");else this.showError(\"Text on \" + invalidTextLengthSide + \" of card is too long\");\n\n\t\t\tvalid = false;\n\t\t}\n\n\t\treturn valid;\n\t},\n\n\tonCardEditFlip: function onCardEditFlip() {\n\t\tthis.flipFlashCard();\n\t},\n\n\tonCardEditFlipped: function onCardEditFlipped(cardNumber, cardCount, newFace) {\n\t\tif (newFace === \"back\") this.ui.textBack.focus();else this.ui.textFront.focus();\n\t},\n\n\tonCardEditRejectRequested: function onCardEditRejectRequested() {\n\t\tif (this.isCardTextChanged()) this.showSaveConfirmation();else Radio.channel(\"flashCards\").trigger(\"card:edit:reject\", this.model.cid);\n\t},\n\n\tonCardEditSave: function onCardEditSave() {\n\t\tthis.disableInput();\n\t\tthis.showStatus();\n\t},\n\n\tonCardErrorDismissed: function onCardErrorDismissed() {\n\t\tthis.enableInput();\n\t\tthis.showControls();\n\t},\n\n\tonTextBlur: function onTextBlur() {\n\t\tif (this.ui.textBack.get(0).innerText.length === 0) this.ui.textBack.text(DEFAULT_BACK_TEXT);\n\n\t\tif (this.ui.textFront.get(0).innerText.length === 0) this.ui.textFront.text(DEFAULT_FRONT_TEXT);\n\t},\n\n\tonTextFocus: function onTextFocus(event) {\n\t\tvar range = document.createRange();\n\t\trange.selectNodeContents(event.currentTarget);\n\n\t\tvar selection = window.getSelection();\n\t\tselection.removeAllRanges();\n\t\tselection.addRange(range);\n\t},\n\n\tonTextKey: function onTextKey() {\n\t\tvar valid = this.isTextLengthValid(this.cardFlipped ? \"back\" : \"front\");\n\n\t\tif (valid) this.hideTextLengthWarning();else this.showTextLengthWarning();\n\t},\n\n\tisTextLengthValid: function isTextLengthValid(side) {\n\t\tvar valid = true;\n\t\tvar content = side === \"back\" ? this.ui.textBack.get(0).innerText : this.ui.textFront.get(0).innerText;\n\n\t\tvar newlineCharacterCount = _.reduce(content, function (acc, character) {\n\t\t\tvar result = acc;\n\n\t\t\tif (character === \"\\n\") result++;\n\n\t\t\treturn result;\n\t\t}, 0);\n\n\t\tif (newlineCharacterCount > MAX_NEW_LINE_CHARACTERS || content.length > MAX_TEXT_LENGTH) valid = false;\n\n\t\treturn valid;\n\t},\n\n\thideTextLengthWarning: function hideTextLengthWarning() {\n\t\tthis.ui.warningContainerBottom.text(\"\");\n\t},\n\n\tshowTextLengthWarning: function showTextLengthWarning() {\n\t\tthis.ui.warningContainerBottom.text(\"Max. \" + (MAX_NEW_LINE_CHARACTERS + 1) + \" lines or \" + MAX_TEXT_LENGTH + \" characters allowed on a flashcard.\");\n\t},\n\n\tdisableInput: function disableInput() {\n\t\tthis.ui.flashCard.addClass(\"flash-card-disabled\");\n\t},\n\n\tenableInput: function enableInput() {\n\t\tthis.ui.flashCard.removeClass(\"flash-card-disabled\");\n\t},\n\n\tflipFlashCard: function flipFlashCard() {\n\t\tvar _this3 = this;\n\n\t\tvar newFace = void 0;\n\n\t\tif (this.cardFlipped) {\n\t\t\tthis.cardFlipped = false;\n\t\t\tnewFace = \"front\";\n\t\t} else {\n\t\t\tthis.cardFlipped = true;\n\t\t\tnewFace = \"back\";\n\t\t}\n\n\t\tthis.hideTextLengthWarning();\n\n\t\tthis.ui.flashCard.flip(this.cardFlipped, function () {\n\t\t\tif (!_this3.isTextLengthValid(newFace)) _this3.showTextLengthWarning();\n\n\t\t\tRadio.channel(\"flashCards\").trigger(\"card:edit:flipped\", Radio.channel(\"flashCards\").request(\"card:number\", _this3.model), Radio.channel(\"flashCards\").request(\"cards:count\"), newFace);\n\t\t});\n\t},\n\n\tisCardTextChanged: function isCardTextChanged() {\n\t\treturn this.ui.textBack.get(0).innerText !== this.model.get(\"back\") && this.ui.textBack.get(0).innerText !== DEFAULT_BACK_TEXT || this.ui.textFront.get(0).innerText !== this.model.get(\"front\") && this.ui.textFront.get(0).innerText !== DEFAULT_FRONT_TEXT;\n\t},\n\n\tshowHeader: function showHeader() {\n\t\tthis.showChildView(\"header\", new Header());\n\t},\n\n\tshowControls: function showControls() {\n\t\tthis.showChildView(\"control\", new Controls());\n\t},\n\n\tshowError: function showError(message) {\n\t\tthis.showChildView(\"control\", new Error({ message: message }));\n\t},\n\n\tshowSaveConfirmation: function showSaveConfirmation() {\n\t\tthis.showChildView(\"control\", new SaveConfirmation({ model: this.model }));\n\t},\n\n\tshowStatus: function showStatus() {\n\t\tthis.showChildView(\"control\", new Status());\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(Radio.channel(\"flashCards\"));\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNhcmRFZGl0b3IuanMiXSwibmFtZXMiOlsicmVxdWlyZSIsIl8iLCJCYWNrYm9uZSIsIlJhZGlvIiwidGlwcHkiLCJkZWZhdWx0IiwiREVGQVVMVF9CQUNLX1RFWFQiLCJERUZBVUxUX0ZST05UX1RFWFQiLCJNQVhfTkVXX0xJTkVfQ0hBUkFDVEVSUyIsIk1BWF9URVhUX0xFTkdUSCIsIkhlYWRlciIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiZXh0ZW5kIiwiY2xhc3NOYW1lIiwidGVtcGxhdGUiLCJoZWFkZXIiLCJ1aSIsImZhY2VMYWJlbCIsImluaXRpYWxpemUiLCJsaXN0ZW5UbyIsImNoYW5uZWwiLCJvbkNhcmRGbGlwIiwiYmluZCIsImNhcmROdW1iZXIiLCJjYXJkQ291bnQiLCJuZXdGYWNlIiwidGV4dCIsIm9uQmVmb3JlRGVzdHJveSIsInN0b3BMaXN0ZW5pbmciLCJFcnJvciIsImVycm9yIiwiYnV0dG9uRGlzbWlzcyIsImV2ZW50cyIsInRlbXBsYXRlQ29udGV4dCIsIm1lc3NhZ2UiLCJvcHRpb25zIiwib25SZW5kZXIiLCJnZXQiLCJ0aGVtZSIsInBsYWNlbWVudCIsImNvbnRlbnQiLCJvbkJ1dHRvbkRpc21pc3NDbGljayIsInRyaWdnZXIiLCJlYWNoIiwidG9vbHRpcFZpZXdzIiwidCIsImRlc3Ryb3kiLCJTYXZlQ29uZmlybWF0aW9uIiwic2F2ZUNvbmZpcm1hdGlvbiIsImJ1dHRvbkFjY2VwdCIsImJ1dHRvblJlamVjdCIsInRhcmdldEVsIiwic3BlYyIsIm9taXQiLCJvbkJ1dHRvbkFjY2VwdENsaWNrIiwibW9kZWwiLCJjaWQiLCJvbkJ1dHRvblJlamVjdENsaWNrIiwiU3RhdHVzIiwic3RhdHVzIiwiQ29udHJvbHMiLCJjb250cm9scyIsImJ1dHRvbkZsaXAiLCJvbkJ1dHRvbkZsaXBDbGljayIsIm1vZHVsZSIsImV4cG9ydHMiLCJlZGl0b3IiLCJyZWdpb25zIiwiY29udHJvbCIsImZsYXNoQ2FyZCIsInRleHRCYWNrIiwidGV4dEZyb250Iiwid2FybmluZ0NvbnRhaW5lckJvdHRvbSIsImJhY2siLCJsZW5ndGgiLCJmcm9udCIsImRlY2tNb2RlbENpZCIsIm9uQ2FyZEVkaXRBY2NlcHRlZCIsIm9uQ2FyZEVkaXRGbGlwIiwib25DYXJkRWRpdEZsaXBwZWQiLCJvbkNhcmRFZGl0UmVqZWN0UmVxdWVzdGVkIiwib25DYXJkRWRpdFNhdmUiLCJvbkNhcmRFcnJvckRpc21pc3NlZCIsInNob3dIZWFkZXIiLCJzaG93Q29udHJvbHMiLCJmbGlwIiwic3BlZWQiLCJyZXF1ZXN0IiwidmFsaWRhdGVUZXh0TGVuZ3RoIiwib25jZSIsInNob3dFcnJvciIsInZhbGlkYXRpb25FcnJvciIsImF0dHJpYnV0ZXMiLCJpbm5lclRleHQiLCJzYXZlIiwid2FpdCIsInN1Y2Nlc3MiLCJoYXMiLCJ2YWxpZCIsImludmFsaWRUZXh0TGVuZ3RoU2lkZSIsImlzVGV4dExlbmd0aFZhbGlkIiwiaXNOaWwiLCJmbGlwRmxhc2hDYXJkIiwiZm9jdXMiLCJpc0NhcmRUZXh0Q2hhbmdlZCIsInNob3dTYXZlQ29uZmlybWF0aW9uIiwiZGlzYWJsZUlucHV0Iiwic2hvd1N0YXR1cyIsImVuYWJsZUlucHV0Iiwib25UZXh0Qmx1ciIsIm9uVGV4dEZvY3VzIiwiZXZlbnQiLCJyYW5nZSIsImRvY3VtZW50IiwiY3JlYXRlUmFuZ2UiLCJzZWxlY3ROb2RlQ29udGVudHMiLCJjdXJyZW50VGFyZ2V0Iiwic2VsZWN0aW9uIiwid2luZG93IiwiZ2V0U2VsZWN0aW9uIiwicmVtb3ZlQWxsUmFuZ2VzIiwiYWRkUmFuZ2UiLCJvblRleHRLZXkiLCJjYXJkRmxpcHBlZCIsImhpZGVUZXh0TGVuZ3RoV2FybmluZyIsInNob3dUZXh0TGVuZ3RoV2FybmluZyIsInNpZGUiLCJuZXdsaW5lQ2hhcmFjdGVyQ291bnQiLCJyZWR1Y2UiLCJhY2MiLCJjaGFyYWN0ZXIiLCJyZXN1bHQiLCJhZGRDbGFzcyIsInJlbW92ZUNsYXNzIiwic2hvd0NoaWxkVmlldyJdLCJtYXBwaW5ncyI6IkFBQUE7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Q0FBdkMsSUFBa0UsS0FBS3JCLEVBQUwsQ0FBUXVELFNBQVIsQ0FBa0JsQyxHQUFsQixDQUFzQixDQUF0QixFQUF5QndELFNBQXpCLEtBQXVDdkYsa0JBRDFHO0FBRUEsRUE5TytDOztBQWdQaEQ2RSxhQUFZLHNCQUFXO0FBQ3RCLE9BQUttRCxhQUFMLENBQW1CLFFBQW5CLEVBQTZCLElBQUk3SCxNQUFKLEVBQTdCO0FBQ0EsRUFsUCtDOztBQW9QaEQyRSxlQUFjLHdCQUFXO0FBQ3hCLE9BQUtrRCxhQUFMLENBQW1CLFNBQW5CLEVBQThCLElBQUkxRSxRQUFKLEVBQTlCO0FBQ0EsRUF0UCtDOztBQXdQaEQ4QixZQUFXLG1CQUFTeEQsT0FBVCxFQUFrQjtBQUM1QixPQUFLb0csYUFBTCxDQUFtQixTQUFuQixFQUE4QixJQUFJekcsS0FBSixDQUFVLEVBQUVLLFNBQVNBLE9BQVgsRUFBVixDQUE5QjtBQUNBLEVBMVArQzs7QUE0UGhEdUUsdUJBQXNCLGdDQUFXO0FBQ2hDLE9BQUs2QixhQUFMLENBQW1CLFNBQW5CLEVBQThCLElBQUl2RixnQkFBSixDQUFxQixFQUFFUSxPQUFPLEtBQUtBLEtBQWQsRUFBckIsQ0FBOUI7QUFDQSxFQTlQK0M7O0FBZ1FoRG9ELGFBQVksc0JBQVc7QUFDdEIsT0FBSzJCLGFBQUwsQ0FBbUIsU0FBbkIsRUFBOEIsSUFBSTVFLE1BQUosRUFBOUI7QUFDQSxFQWxRK0M7O0FBb1FoRC9CLGtCQUFpQiwyQkFBVztBQUMzQixPQUFLQyxhQUFMLENBQW1CMUIsTUFBTWtCLE9BQU4sQ0FBYyxZQUFkLENBQW5CO0FBQ0E7QUF0UStDLENBQWhDLENBQWpCIiwiZmlsZSI6ImNhcmRFZGl0b3IuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnJlcXVpcmUoXCJqcXVlcnkuZmxpcFwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCBSYWRpbyA9IEJhY2tib25lLlJhZGlvO1xuY29uc3QgdGlwcHkgPSByZXF1aXJlKFwidGlwcHkuanNcIikuZGVmYXVsdDtcblxuY29uc3QgREVGQVVMVF9CQUNLX1RFWFQgPSBcIkVudGVyIHRleHQgZm9yIHRoZSBiYWNrIG9mIHRoZSBjYXJkLi4uXCI7XG5jb25zdCBERUZBVUxUX0ZST05UX1RFWFQgPSBcIkVudGVyIHRleHQgZm9yIHRoZSBmcm9udCBvZiB0aGUgY2FyZC4uLlwiO1xuY29uc3QgTUFYX05FV19MSU5FX0NIQVJBQ1RFUlMgPSAxNTtcbmNvbnN0IE1BWF9URVhUX0xFTkdUSCA9IDUwMDtcblxuY29uc3QgSGVhZGVyID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJmbGFzaC1jYXJkLWhlYWRlclwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2ZsYXNoQ2FyZHMvY2FyZEVkaXRvci5udW5qXCIpLmhlYWRlcixcblxuXHR1aToge1xuXHRcdGZhY2VMYWJlbDogXCIuZmxhc2gtY2FyZC1mYWNlLWxhYmVsXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5saXN0ZW5UbyhSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKSwgXCJjYXJkOmVkaXQ6ZmxpcHBlZFwiLCB0aGlzLm9uQ2FyZEZsaXAuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0b25DYXJkRmxpcDogZnVuY3Rpb24oY2FyZE51bWJlciwgY2FyZENvdW50LCBuZXdGYWNlKSB7XG5cdFx0dGhpcy51aS5mYWNlTGFiZWwudGV4dChcIkNhcmQgXCIgKyBjYXJkTnVtYmVyICsgXCIgb2YgXCIgKyBjYXJkQ291bnQgKyBcIiAoXCIgKyAobmV3RmFjZSA9PT0gXCJiYWNrXCIgPyBcIkJhY2tcIiA6IFwiRnJvbnRcIikgKyBcIilcIik7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcoUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikpO1xuXHR9LFxufSk7XG5cbmNvbnN0IEVycm9yID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJmbGFzaC1jYXJkLWVkaXRvci1lcnJvclwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2ZsYXNoQ2FyZHMvY2FyZEVkaXRvci5udW5qXCIpLmVycm9yLFxuXG5cdHVpOiB7XG5cdFx0YnV0dG9uRGlzbWlzczogXCIuYnV0dG9uLWRpc21pc3NcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5idXR0b25EaXNtaXNzXCI6IFwib25CdXR0b25EaXNtaXNzQ2xpY2tcIixcblx0fSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG5cdFx0fTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5tZXNzYWdlID0gb3B0aW9ucy5tZXNzYWdlO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR0aXBweSh0aGlzLnVpLmJ1dHRvbkRpc21pc3MuZ2V0KDApLCB7XG5cdFx0XHR0aGVtZTogXCJibGFja1wiLFxuXHRcdFx0cGxhY2VtZW50OiBcImJvdHRvbVwiLFxuXHRcdFx0Y29udGVudDogXCJPa1wiLFxuXHRcdH0pO1xuXHR9LFxuXG5cdG9uQnV0dG9uRGlzbWlzc0NsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS50cmlnZ2VyKFwiY2FyZDplcnJvcjpkaXNtaXNzXCIpO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0Xy5lYWNoKHRoaXMudG9vbHRpcFZpZXdzLCB0ID0+IHQuZGVzdHJveSgpKTtcblx0fSxcbn0pO1xuXG5jb25zdCBTYXZlQ29uZmlybWF0aW9uID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJmbGFzaC1jYXJkLWVkaXRvci1zYXZlLWNvbmZpcm1hdGlvblwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2ZsYXNoQ2FyZHMvY2FyZEVkaXRvci5udW5qXCIpLnNhdmVDb25maXJtYXRpb24sXG5cblx0dWk6IHtcblx0XHRidXR0b25BY2NlcHQ6IFwiLmJ1dHRvbi1hY2NlcHRcIixcblx0XHRidXR0b25SZWplY3Q6IFwiLmJ1dHRvbi1yZWplY3RcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5idXR0b25BY2NlcHRcIjogXCJvbkJ1dHRvbkFjY2VwdENsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkuYnV0dG9uUmVqZWN0XCI6IFwib25CdXR0b25SZWplY3RDbGlja1wiLFxuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRfLmVhY2goW1xuXHRcdFx0e1xuXHRcdFx0XHR0YXJnZXRFbDogdGhpcy51aS5idXR0b25BY2NlcHQuZ2V0KDApLFxuXHRcdFx0XHRjb250ZW50OiBcIlllc1wiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0dGFyZ2V0RWw6IHRoaXMudWkuYnV0dG9uUmVqZWN0LmdldCgwKSxcblx0XHRcdFx0Y29udGVudDogXCJOb1wiLFxuXHRcdFx0fSxcblx0XHRdLCBzcGVjID0+IHRpcHB5KHNwZWMudGFyZ2V0RWwsIF8uZXh0ZW5kKF8ub21pdChzcGVjLCBbXCJ0YXJnZXRFbFwiXSksIHtcblx0XHRcdHRoZW1lOiBcImJsYWNrXCIsXG5cdFx0XHRwbGFjZW1lbnQ6IFwiYm90dG9tXCIsXG5cdFx0fSkpKTtcblx0fSxcblxuXHRvbkJ1dHRvbkFjY2VwdENsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS50cmlnZ2VyKFwiY2FyZDplZGl0OmFjY2VwdFwiLCB0aGlzLm1vZGVsLmNpZCk7XG5cdH0sXG5cblx0b25CdXR0b25SZWplY3RDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0UmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikudHJpZ2dlcihcImNhcmQ6ZWRpdDpyZWplY3RcIiwgdGhpcy5tb2RlbC5jaWQpO1xuXHR9LFxufSk7XG5cbmNvbnN0IFN0YXR1cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZmxhc2gtY2FyZC1lZGl0b3Itc3RhdHVzXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvZmxhc2hDYXJkcy9jYXJkRWRpdG9yLm51bmpcIikuc3RhdHVzLFxufSk7XG5cbmNvbnN0IENvbnRyb2xzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJmbGFzaC1jYXJkLWVkaXRvci1jb250cm9sc1wiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2ZsYXNoQ2FyZHMvY2FyZEVkaXRvci5udW5qXCIpLmNvbnRyb2xzLFxuXG5cdHVpOiB7XG5cdFx0YnV0dG9uQWNjZXB0OiBcIi5idXR0b24tYWNjZXB0XCIsXG5cdFx0YnV0dG9uRmxpcDogXCIuYnV0dG9uLWZsaXBcIixcblx0XHRidXR0b25SZWplY3Q6IFwiLmJ1dHRvbi1yZWplY3RcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5idXR0b25BY2NlcHRcIjogXCJvbkJ1dHRvbkFjY2VwdENsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkuYnV0dG9uRmxpcFwiOiBcIm9uQnV0dG9uRmxpcENsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkuYnV0dG9uUmVqZWN0XCI6IFwib25CdXR0b25SZWplY3RDbGlja1wiLFxuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRfLmVhY2goW1xuXHRcdFx0e1xuXHRcdFx0XHR0YXJnZXRFbDogdGhpcy51aS5idXR0b25BY2NlcHQuZ2V0KDApLFxuXHRcdFx0XHRjb250ZW50OiBcIlNhdmUgdGhlIGNhcmRcIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHRhcmdldEVsOiB0aGlzLnVpLmJ1dHRvbkZsaXAuZ2V0KDApLFxuXHRcdFx0XHRjb250ZW50OiBcIkZsaXAgdGhlIGNhcmRcIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHRhcmdldEVsOiB0aGlzLnVpLmJ1dHRvblJlamVjdC5nZXQoMCksXG5cdFx0XHRcdGNvbnRlbnQ6IFwiQ2FuY2VsXCIsXG5cdFx0XHR9LFxuXHRcdF0sIHNwZWMgPT4gdGlwcHkoc3BlYy50YXJnZXRFbCwgXy5leHRlbmQoXy5vbWl0KHNwZWMsIFtcInRhcmdldEVsXCJdKSwge1xuXHRcdFx0dGhlbWU6IFwiYmxhY2tcIixcblx0XHRcdHBsYWNlbWVudDogXCJib3R0b21cIixcblx0XHR9KSkpO1xuXHR9LFxuXG5cdG9uQnV0dG9uQWNjZXB0Q2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJjYXJkOmVkaXQ6YWNjZXB0XCIpO1xuXHR9LFxuXG5cdG9uQnV0dG9uRmxpcENsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS50cmlnZ2VyKFwiY2FyZDplZGl0OmZsaXBcIik7XG5cdH0sXG5cblx0b25CdXR0b25SZWplY3RDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0UmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikudHJpZ2dlcihcImNhcmQ6ZWRpdDpyZWplY3Q6cmVxdWVzdFwiKTtcblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZmxhc2gtY2FyZC1lZGl0b3JcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9mbGFzaENhcmRzL2NhcmRFZGl0b3IubnVualwiKS5lZGl0b3IsXG5cblx0cmVnaW9uczoge1xuXHRcdGhlYWRlcjogXCIuaGVhZGVyLXJlZ2lvblwiLFxuXHRcdGNvbnRyb2w6IFwiLmNvbnRyb2wtcmVnaW9uXCIsXG5cdH0sXG5cblx0dWk6IHtcblx0XHRmbGFzaENhcmQ6IFwiI3RoZS1mbGFzaC1jYXJkXCIsXG5cdFx0dGV4dEJhY2s6IFwiI3RleHQtYmFja1wiLFxuXHRcdHRleHRGcm9udDogXCIjdGV4dC1mcm9udFwiLFxuXHRcdHdhcm5pbmdDb250YWluZXJCb3R0b206IFwiLmZsYXNoLWNhcmQtd2FybmluZy1jb250YWluZXIjYm90dG9tXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJibHVyIEB1aS50ZXh0RnJvbnRcIjogXCJvblRleHRCbHVyXCIsXG5cdFx0XCJibHVyIEB1aS50ZXh0QmFja1wiOiBcIm9uVGV4dEJsdXJcIixcblx0XHRcImZvY3VzIEB1aS50ZXh0RnJvbnRcIjogXCJvblRleHRGb2N1c1wiLFxuXHRcdFwiZm9jdXMgQHVpLnRleHRCYWNrXCI6IFwib25UZXh0Rm9jdXNcIixcblx0XHRcImtleXVwIEB1aS50ZXh0RnJvbnRcIjogXCJvblRleHRLZXlcIixcblx0XHRcImtleXVwIEB1aS50ZXh0QmFja1wiOiBcIm9uVGV4dEtleVwiLFxuXHR9LFxuXG5cdHRlbXBsYXRlQ29udGV4dDogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGJhY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbW9kZWwuZ2V0KFwiYmFja1wiKS5sZW5ndGggPT09IDAgPyBERUZBVUxUX0JBQ0tfVEVYVCA6IG1vZGVsLmdldChcImJhY2tcIik7XG5cdFx0XHR9LFxuXG5cdFx0XHRmcm9udDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2RlbC5nZXQoXCJmcm9udFwiKS5sZW5ndGggPT09IDAgPyBERUZBVUxUX0ZST05UX1RFWFQgOiBtb2RlbC5nZXQoXCJmcm9udFwiKTtcblx0XHRcdH0sXG5cdFx0fTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5kZWNrTW9kZWxDaWQgPSBvcHRpb25zLmRlY2tNb2RlbENpZDtcblxuXHRcdHRoaXMubGlzdGVuVG8oUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIiksIHtcblx0XHRcdFwiY2FyZDplZGl0OmFjY2VwdFwiOiB0aGlzLm9uQ2FyZEVkaXRBY2NlcHRlZC5iaW5kKHRoaXMpLFxuXHRcdFx0XCJjYXJkOmVkaXQ6ZmxpcFwiOiB0aGlzLm9uQ2FyZEVkaXRGbGlwLmJpbmQodGhpcyksXG5cdFx0XHRcImNhcmQ6ZWRpdDpmbGlwcGVkXCI6IHRoaXMub25DYXJkRWRpdEZsaXBwZWQuYmluZCh0aGlzKSxcblx0XHRcdFwiY2FyZDplZGl0OnJlamVjdDpyZXF1ZXN0XCI6IHRoaXMub25DYXJkRWRpdFJlamVjdFJlcXVlc3RlZC5iaW5kKHRoaXMpLFxuXHRcdFx0XCJjYXJkOmVkaXQ6c2F2ZVwiOiB0aGlzLm9uQ2FyZEVkaXRTYXZlLmJpbmQodGhpcyksXG5cdFx0XHRcImNhcmQ6ZXJyb3I6ZGlzbWlzc1wiOiB0aGlzLm9uQ2FyZEVycm9yRGlzbWlzc2VkLmJpbmQodGhpcyksXG5cdFx0fSk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc2hvd0hlYWRlcigpO1xuXHRcdHRoaXMuc2hvd0NvbnRyb2xzKCk7XG5cblx0XHR0aGlzLnVpLmZsYXNoQ2FyZC5mbGlwKHtcblx0XHRcdHNwZWVkOiA0MDAsXG5cdFx0XHR0cmlnZ2VyOiBcIm1hbnVhbFwiLFxuXHRcdH0sICgpID0+IHtcblx0XHRcdFJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJjYXJkOmVkaXQ6ZmxpcHBlZFwiLFxuXHRcdFx0XHRSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS5yZXF1ZXN0KFwiY2FyZDpudW1iZXJcIiwgdGhpcy5tb2RlbCksXG5cdFx0XHRcdFJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnJlcXVlc3QoXCJjYXJkczpjb3VudFwiKSxcblx0XHRcdFx0XCJmcm9udFwiKTtcblx0XHR9KTtcblx0fSxcblxuXHRvbkNhcmRFZGl0QWNjZXB0ZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJjYXJkOmVkaXQ6c2F2ZVwiKTtcblxuXHRcdGlmICh0aGlzLnZhbGlkYXRlVGV4dExlbmd0aCgpKSB7XG5cdFx0XHR0aGlzLm1vZGVsLm9uY2UoXCJpbnZhbGlkXCIsICgpID0+IHtcblx0XHRcdFx0dGhpcy5zaG93RXJyb3IodGhpcy5tb2RlbC52YWxpZGF0aW9uRXJyb3IpO1xuXHRcdFx0fSk7XG5cblx0XHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSB7XG5cdFx0XHRcdGJhY2s6IHRoaXMudWkudGV4dEJhY2suZ2V0KDApLmlubmVyVGV4dCA9PT0gREVGQVVMVF9CQUNLX1RFWFQgPyBcIlwiIDogdGhpcy51aS50ZXh0QmFjay5nZXQoMCkuaW5uZXJUZXh0LFxuXHRcdFx0XHRmcm9udDogdGhpcy51aS50ZXh0RnJvbnQuZ2V0KDApLmlubmVyVGV4dCA9PT0gREVGQVVMVF9GUk9OVF9URVhUID8gXCJcIiA6IHRoaXMudWkudGV4dEZyb250LmdldCgwKS5pbm5lclRleHQsXG5cdFx0XHR9O1xuXG5cdFx0XHR0aGlzLm1vZGVsLnNhdmUoYXR0cmlidXRlcywge1xuXHRcdFx0XHR3YWl0OiB0cnVlLFxuXG5cdFx0XHRcdHN1Y2Nlc3M6IG1vZGVsID0+IHtcblx0XHRcdFx0XHRSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS50cmlnZ2VyKFwiY2FyZDplZGl0OnNhdmVkXCIsIHRoaXMubW9kZWwuY2lkLCB0aGlzLmRlY2tNb2RlbENpZCwgbW9kZWwuaGFzKFwidXBkYXRlZFwiKSA/IG1vZGVsLmdldChcInVwZGF0ZWRcIikgOiBtb2RlbC5nZXQoXCJjcmVhdGVkXCIpKTtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHRlcnJvcjogKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuc2hvd0Vycm9yKFwiRXJyb3Igc2F2aW5nIGNhcmQuXCIpO1xuXHRcdFx0XHR9LFxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdHZhbGlkYXRlVGV4dExlbmd0aDogZnVuY3Rpb24oKSB7XG5cdFx0bGV0IHZhbGlkID0gdHJ1ZTtcblx0XHRsZXQgaW52YWxpZFRleHRMZW5ndGhTaWRlO1xuXG5cdFx0aWYgKCF0aGlzLmlzVGV4dExlbmd0aFZhbGlkKFwiYmFja1wiKSlcblx0XHRcdGludmFsaWRUZXh0TGVuZ3RoU2lkZSA9IFwiYmFja1wiO1xuXG5cdFx0aWYgKCF0aGlzLmlzVGV4dExlbmd0aFZhbGlkKFwiZnJvbnRcIikpIHtcblx0XHRcdGlmIChfLmlzTmlsKGludmFsaWRUZXh0TGVuZ3RoU2lkZSkpXG5cdFx0XHRcdGludmFsaWRUZXh0TGVuZ3RoU2lkZSA9IFwiZnJvbnRcIjtcblx0XHRcdGVsc2Vcblx0XHRcdFx0aW52YWxpZFRleHRMZW5ndGhTaWRlID0gXCJib3RoXCI7XG5cdFx0fVxuXG5cdFx0aWYgKCFfLmlzTmlsKGludmFsaWRUZXh0TGVuZ3RoU2lkZSkpIHtcblx0XHRcdGlmIChpbnZhbGlkVGV4dExlbmd0aFNpZGUgPT09IFwiYm90aFwiKVxuXHRcdFx0XHR0aGlzLnNob3dFcnJvcihcIlRleHQgb24gYm90aCBzaWRlcyBvZiBjYXJkIGlzIHRvbyBsb25nXCIpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLnNob3dFcnJvcihcIlRleHQgb24gXCIgKyBpbnZhbGlkVGV4dExlbmd0aFNpZGUgKyBcIiBvZiBjYXJkIGlzIHRvbyBsb25nXCIpO1xuXG5cdFx0XHR2YWxpZCA9IGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB2YWxpZDtcblx0fSxcblxuXHRvbkNhcmRFZGl0RmxpcDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5mbGlwRmxhc2hDYXJkKCk7XG5cdH0sXG5cblx0b25DYXJkRWRpdEZsaXBwZWQ6IGZ1bmN0aW9uKGNhcmROdW1iZXIsIGNhcmRDb3VudCwgbmV3RmFjZSkge1xuXHRcdGlmIChuZXdGYWNlID09PSBcImJhY2tcIilcblx0XHRcdHRoaXMudWkudGV4dEJhY2suZm9jdXMoKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnVpLnRleHRGcm9udC5mb2N1cygpO1xuXHR9LFxuXG5cdG9uQ2FyZEVkaXRSZWplY3RSZXF1ZXN0ZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLmlzQ2FyZFRleHRDaGFuZ2VkKCkpXG5cdFx0XHR0aGlzLnNob3dTYXZlQ29uZmlybWF0aW9uKCk7XG5cdFx0ZWxzZVxuXHRcdFx0UmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikudHJpZ2dlcihcImNhcmQ6ZWRpdDpyZWplY3RcIiwgdGhpcy5tb2RlbC5jaWQpO1xuXHR9LFxuXG5cdG9uQ2FyZEVkaXRTYXZlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmRpc2FibGVJbnB1dCgpO1xuXHRcdHRoaXMuc2hvd1N0YXR1cygpO1xuXHR9LFxuXG5cdG9uQ2FyZEVycm9yRGlzbWlzc2VkOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmVuYWJsZUlucHV0KCk7XG5cdFx0dGhpcy5zaG93Q29udHJvbHMoKTtcblx0fSxcblxuXHRvblRleHRCbHVyOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy51aS50ZXh0QmFjay5nZXQoMCkuaW5uZXJUZXh0Lmxlbmd0aCA9PT0gMClcblx0XHRcdHRoaXMudWkudGV4dEJhY2sudGV4dChERUZBVUxUX0JBQ0tfVEVYVCk7XG5cblx0XHRpZiAodGhpcy51aS50ZXh0RnJvbnQuZ2V0KDApLmlubmVyVGV4dC5sZW5ndGggPT09IDApXG5cdFx0XHR0aGlzLnVpLnRleHRGcm9udC50ZXh0KERFRkFVTFRfRlJPTlRfVEVYVCk7XG5cdH0sXG5cblx0b25UZXh0Rm9jdXM6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0Y29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuXHRcdHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhldmVudC5jdXJyZW50VGFyZ2V0KTtcblxuXHRcdGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcblx0XHRzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG5cdFx0c2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcblx0fSxcblxuXHRvblRleHRLZXk6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHZhbGlkID0gdGhpcy5pc1RleHRMZW5ndGhWYWxpZCh0aGlzLmNhcmRGbGlwcGVkID8gXCJiYWNrXCIgOiBcImZyb250XCIpO1xuXG5cdFx0aWYgKHZhbGlkKVxuXHRcdFx0dGhpcy5oaWRlVGV4dExlbmd0aFdhcm5pbmcoKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnNob3dUZXh0TGVuZ3RoV2FybmluZygpO1xuXHR9LFxuXG5cdGlzVGV4dExlbmd0aFZhbGlkOiBmdW5jdGlvbihzaWRlKSB7XG5cdFx0bGV0IHZhbGlkID0gdHJ1ZTtcblx0XHRjb25zdCBjb250ZW50ID0gc2lkZSA9PT0gXCJiYWNrXCIgPyB0aGlzLnVpLnRleHRCYWNrLmdldCgwKS5pbm5lclRleHQgOiB0aGlzLnVpLnRleHRGcm9udC5nZXQoMCkuaW5uZXJUZXh0O1xuXG5cdFx0Y29uc3QgbmV3bGluZUNoYXJhY3RlckNvdW50ID0gXy5yZWR1Y2UoY29udGVudCwgKGFjYywgY2hhcmFjdGVyKSA9PiB7XG5cdFx0XHRsZXQgcmVzdWx0ID0gYWNjO1xuXG5cdFx0XHRpZiAoY2hhcmFjdGVyID09PSBcIlxcblwiKVxuXHRcdFx0XHRyZXN1bHQrKztcblxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9LCAwKTtcblxuXHRcdGlmIChuZXdsaW5lQ2hhcmFjdGVyQ291bnQgPiBNQVhfTkVXX0xJTkVfQ0hBUkFDVEVSUyB8fCBjb250ZW50Lmxlbmd0aCA+IE1BWF9URVhUX0xFTkdUSClcblx0XHRcdHZhbGlkID0gZmFsc2U7XG5cblx0XHRyZXR1cm4gdmFsaWQ7XG5cdH0sXG5cblx0aGlkZVRleHRMZW5ndGhXYXJuaW5nOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLndhcm5pbmdDb250YWluZXJCb3R0b20udGV4dChcIlwiKTtcblx0fSxcblxuXHRzaG93VGV4dExlbmd0aFdhcm5pbmc6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkud2FybmluZ0NvbnRhaW5lckJvdHRvbS50ZXh0KFwiTWF4LiBcIiArIChNQVhfTkVXX0xJTkVfQ0hBUkFDVEVSUyArIDEpICsgXCIgbGluZXMgb3IgXCIgKyBNQVhfVEVYVF9MRU5HVEggKyBcIiBjaGFyYWN0ZXJzIGFsbG93ZWQgb24gYSBmbGFzaGNhcmQuXCIpO1xuXHR9LFxuXG5cdGRpc2FibGVJbnB1dDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5mbGFzaENhcmQuYWRkQ2xhc3MoXCJmbGFzaC1jYXJkLWRpc2FibGVkXCIpO1xuXHR9LFxuXG5cdGVuYWJsZUlucHV0OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmZsYXNoQ2FyZC5yZW1vdmVDbGFzcyhcImZsYXNoLWNhcmQtZGlzYWJsZWRcIik7XG5cdH0sXG5cblx0ZmxpcEZsYXNoQ2FyZDogZnVuY3Rpb24oKSB7XG5cdFx0bGV0IG5ld0ZhY2U7XG5cblx0XHRpZiAodGhpcy5jYXJkRmxpcHBlZCkge1xuXHRcdFx0dGhpcy5jYXJkRmxpcHBlZCA9IGZhbHNlO1xuXHRcdFx0bmV3RmFjZSA9IFwiZnJvbnRcIjtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLmNhcmRGbGlwcGVkID0gdHJ1ZTtcblx0XHRcdG5ld0ZhY2UgPSBcImJhY2tcIjtcblx0XHR9XG5cblx0XHR0aGlzLmhpZGVUZXh0TGVuZ3RoV2FybmluZygpO1xuXG5cdFx0dGhpcy51aS5mbGFzaENhcmQuZmxpcCh0aGlzLmNhcmRGbGlwcGVkLCAoKSA9PiB7XG5cdFx0XHRpZiAoIXRoaXMuaXNUZXh0TGVuZ3RoVmFsaWQobmV3RmFjZSkpXG5cdFx0XHRcdHRoaXMuc2hvd1RleHRMZW5ndGhXYXJuaW5nKCk7XG5cblx0XHRcdFJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJjYXJkOmVkaXQ6ZmxpcHBlZFwiLFxuXHRcdFx0XHRSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS5yZXF1ZXN0KFwiY2FyZDpudW1iZXJcIiwgdGhpcy5tb2RlbCksXG5cdFx0XHRcdFJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnJlcXVlc3QoXCJjYXJkczpjb3VudFwiKSxcblx0XHRcdFx0bmV3RmFjZSk7XG5cdFx0fSk7XG5cdH0sXG5cblx0aXNDYXJkVGV4dENoYW5nZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnVpLnRleHRCYWNrLmdldCgwKS5pbm5lclRleHQgIT09IHRoaXMubW9kZWwuZ2V0KFwiYmFja1wiKSAmJiB0aGlzLnVpLnRleHRCYWNrLmdldCgwKS5pbm5lclRleHQgIT09IERFRkFVTFRfQkFDS19URVhUIHx8XG5cdFx0XHR0aGlzLnVpLnRleHRGcm9udC5nZXQoMCkuaW5uZXJUZXh0ICE9PSB0aGlzLm1vZGVsLmdldChcImZyb250XCIpICYmIHRoaXMudWkudGV4dEZyb250LmdldCgwKS5pbm5lclRleHQgIT09IERFRkFVTFRfRlJPTlRfVEVYVDtcblx0fSxcblxuXHRzaG93SGVhZGVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJoZWFkZXJcIiwgbmV3IEhlYWRlcigpKTtcblx0fSxcblxuXHRzaG93Q29udHJvbHM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImNvbnRyb2xcIiwgbmV3IENvbnRyb2xzKCkpO1xuXHR9LFxuXG5cdHNob3dFcnJvcjogZnVuY3Rpb24obWVzc2FnZSkge1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImNvbnRyb2xcIiwgbmV3IEVycm9yKHsgbWVzc2FnZTogbWVzc2FnZSB9KSk7XG5cdH0sXG5cblx0c2hvd1NhdmVDb25maXJtYXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImNvbnRyb2xcIiwgbmV3IFNhdmVDb25maXJtYXRpb24oeyBtb2RlbDogdGhpcy5tb2RlbCB9KSk7XG5cdH0sXG5cblx0c2hvd1N0YXR1czogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiY29udHJvbFwiLCBuZXcgU3RhdHVzKCkpO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKFJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpKTtcblx0fSxcbn0pO1xuIl19",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar Radio = Backbone.Radio;\nvar tippy = require(\"tippy.js\").default;\n\nvar Header = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-list-header\",\n\n\ttemplate: require(\"../../templates/flashCards/cardList.nunj\").header,\n\n\tui: {\n\t\tbuttonAdd: \".button-add\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonAdd\": \"onButtonAddClick\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.listenTo(Radio.channel(\"flashCards\"), {\n\t\t\t\"card:add\": this.onCardAdd.bind(this),\n\t\t\t\"card:delete\": this.disable.bind(this),\n\t\t\t\"card:delete:reject\": this.enable.bind(this),\n\t\t\t\"card:delete:saved\": this.enable.bind(this),\n\t\t\t\"card:error:dismiss\": this.enable.bind(this)\n\t\t});\n\t},\n\n\tonRender: function onRender() {\n\t\t_.each([{\n\t\t\ttargetEl: this.ui.buttonAdd.get(0),\n\t\t\tcontent: \"Add a flashcard\"\n\t\t}], function (spec) {\n\t\t\treturn tippy(spec.targetEl, _.extend(_.omit(spec, [\"targetEl\"]), {\n\t\t\t\ttheme: \"black\",\n\t\t\t\tplacement: \"bottom\"\n\t\t\t}));\n\t\t});\n\t},\n\n\tonButtonAddClick: function onButtonAddClick() {\n\t\tRadio.channel(\"flashCards\").trigger(\"card:add\");\n\t},\n\n\tonCardAdd: function onCardAdd() {\n\t\t_.each(this.tooltipViews, function (t) {\n\t\t\treturn t.hide();\n\t\t});\n\t},\n\n\tdisable: function disable() {\n\t\tthis.$el.addClass(\"flash-card-list-header-disabled\");\n\t},\n\n\tenable: function enable() {\n\t\tthis.$el.removeClass(\"flash-card-list-header-disabled\");\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(Radio.channel(\"flashCards\"));\n\t}\n});\n\nvar SubHeader = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-list-header flash-card-list-sub-header\",\n\n\ttemplate: require(\"../../templates/flashCards/cardList.nunj\").subHeader\n});\n\nvar FlashCardItemDisplay = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-list-item-display\",\n\n\ttemplate: require(\"../../templates/flashCards/cardList.nunj\").itemDisplay,\n\n\tui: {\n\t\tbuttonDelete: \".button-delete\",\n\t\tbuttonEdit: \".button-edit\"\n\t},\n\n\tevents: {\n\t\tclick: \"onClick\",\n\t\t\"click @ui.buttonDelete\": \"onButtonDeleteClick\",\n\t\t\"click @ui.buttonEdit\": \"onButtonEditClick\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this = this;\n\n\t\treturn {\n\t\t\tback: function back() {\n\t\t\t\treturn _this.model.get(\"back\").trim().replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t\t}).replace(/\\n/g, \"<br>\");\n\t\t\t},\n\t\t\tfront: function front() {\n\t\t\t\treturn _this.model.get(\"front\").trim().replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t\t}).replace(/\\n/g, \"<br>\");\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.listenTo(Radio.channel(\"flashCards\"), \"card:edit:saved\", this.render.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\t_.each([{\n\t\t\ttargetEl: this.ui.buttonDelete.get(0),\n\t\t\tcontent: \"Delete\"\n\t\t}, {\n\t\t\ttargetEl: this.ui.buttonEdit.get(0),\n\t\t\tcontent: \"Edit\"\n\t\t}], function (spec) {\n\t\t\treturn tippy(spec.targetEl, _.extend(_.omit(spec, [\"targetEl\"]), {\n\t\t\t\ttheme: \"black\",\n\t\t\t\tplacement: \"bottom\"\n\t\t\t}));\n\t\t});\n\t},\n\n\tonClick: function onClick() {\n\t\tthis.editCard();\n\t},\n\n\tonButtonDeleteClick: function onButtonDeleteClick(event) {\n\t\tevent.stopPropagation();\n\t\tRadio.channel(\"flashCards\").trigger(\"card:delete\", this.model.cid);\n\t},\n\n\tonButtonEditClick: function onButtonEditClick(event) {\n\t\tevent.stopPropagation();\n\t\tthis.editCard();\n\t\tthis.ui.buttonEdit.trigger(\"mouseout\");\n\t},\n\n\teditCard: function editCard() {\n\t\tRadio.channel(\"flashCards\").trigger(\"card:edit\", this.model.cid);\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(Radio.channel(\"flashCards\"));\n\t}\n});\n\nvar FlashCardItemDeleteConfirmation = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-list-item-delete-confirmation\",\n\n\ttemplate: require(\"../../templates/flashCards/cardList.nunj\").itemDeleteConfirmation,\n\n\tui: {\n\t\tbuttonAccept: \".button-accept\",\n\t\tbuttonReject: \".button-reject\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonAccept\": \"onButtonAcceptClick\",\n\t\t\"click @ui.buttonReject\": \"onButtonRejectClick\"\n\t},\n\n\tonRender: function onRender() {\n\t\t_.each([{\n\t\t\ttargetEl: this.ui.buttonAccept.get(0),\n\t\t\tcontent: \"Yes\"\n\t\t}, {\n\t\t\ttargetEl: this.ui.buttonReject.get(0),\n\t\t\tcontent: \"No\"\n\t\t}], function (spec) {\n\t\t\treturn tippy(spec.targetEl, _.extend(_.omit(spec, [\"targetEl\"]), {\n\t\t\t\ttheme: \"black\",\n\t\t\t\tplacement: \"bottom\"\n\t\t\t}));\n\t\t});\n\t},\n\n\tonButtonAcceptClick: function onButtonAcceptClick() {\n\t\tRadio.channel(\"flashCards\").trigger(\"card:delete:accept\", this.model.cid);\n\t},\n\n\tonButtonRejectClick: function onButtonRejectClick() {\n\t\tRadio.channel(\"flashCards\").trigger(\"card:delete:reject\", this.model.cid);\n\t}\n});\n\nvar FlashCardItemStatus = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-list-item-status\",\n\n\ttemplate: require(\"../../templates/flashCards/cardList.nunj\").itemStatus\n});\n\nvar FlashCardItemError = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-list-item-error\",\n\n\ttemplate: require(\"../../templates/flashCards/cardList.nunj\").itemError,\n\n\tui: {\n\t\tbuttonDismiss: \".button-dismiss\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonDismiss\": \"onButtonDismissClick\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tmessage: this.message\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.message = options.message;\n\t},\n\n\tonRender: function onRender() {\n\t\t_.each([{\n\t\t\ttargetEl: this.ui.buttonDismiss.get(0),\n\t\t\tcontent: \"Ok\"\n\t\t}], function (spec) {\n\t\t\treturn tippy(spec.targetEl, _.extend(_.omit(spec, [\"targetEl\"]), {\n\t\t\t\ttheme: \"black\",\n\t\t\t\tplacement: \"bottom\"\n\t\t\t}));\n\t\t});\n\t},\n\n\tonButtonDismissClick: function onButtonDismissClick() {\n\t\tRadio.channel(\"flashCards\").trigger(\"card:error:dismiss\", this.model.cid);\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\t_.each(this.tooltipViews, function (t) {\n\t\t\treturn t.destroy();\n\t\t});\n\t}\n});\n\nvar FlashCardItem = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-list-item\",\n\n\ttemplate: require(\"../../templates/flashCards/cardList.nunj\").item,\n\n\tregions: {\n\t\tcontent: \".flash-card-list-item-content-region\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.listenTo(Radio.channel(\"flashCards\"), {\n\t\t\t\"card:delete\": this.onCardDelete.bind(this),\n\t\t\t\"card:delete:reject\": this.onCardDeleteRejected.bind(this),\n\t\t\t\"card:delete:save\": this.onCardDeleteSave.bind(this),\n\t\t\t\"card:delete:saved\": this.onCardDeleteSaved.bind(this),\n\t\t\t\"card:error:dismiss\": this.onCardErrorDismissed.bind(this)\n\t\t});\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.switchToDisplayMode();\n\t},\n\n\tonCardDelete: function onCardDelete(cardModelCid) {\n\t\tif (this.model.cid === cardModelCid) this.switchToDeleteConfirmationMode();else this.disable();\n\t},\n\n\tonCardDeleteRejected: function onCardDeleteRejected(cardModelCid) {\n\t\tif (this.model.cid === cardModelCid) this.switchToDisplayMode();else this.enable();\n\t},\n\n\tonCardDeleteSave: function onCardDeleteSave(cardModelCid) {\n\t\tif (this.model.cid === cardModelCid) this.switchToStatusMode();\n\t},\n\n\tonCardDeleteSaved: function onCardDeleteSaved(cardModelCid) {\n\t\tif (this.model.cid !== cardModelCid) this.enable();\n\t},\n\n\tonCardErrorDismissed: function onCardErrorDismissed(cardModelCid) {\n\t\tif (this.model.cid === cardModelCid) this.switchToDisplayMode();else this.enable();\n\t},\n\n\tdisable: function disable() {\n\t\tthis.$el.addClass(\"flash-card-list-item-disabled\");\n\t},\n\n\tenable: function enable() {\n\t\tthis.$el.removeClass(\"flash-card-list-item-disabled\");\n\t},\n\n\tswitchToDisplayMode: function switchToDisplayMode() {\n\t\tthis.showChildView(\"content\", new FlashCardItemDisplay({ model: this.model }));\n\t},\n\n\tswitchToDeleteConfirmationMode: function switchToDeleteConfirmationMode() {\n\t\tthis.showChildView(\"content\", new FlashCardItemDeleteConfirmation({ model: this.model }));\n\t},\n\n\tswitchToErrorMode: function switchToErrorMode(message) {\n\t\tthis.showChildView(\"content\", new FlashCardItemError({\n\t\t\tmessage: message,\n\t\t\tmodel: this.model\n\t\t}));\n\t},\n\n\tswitchToStatusMode: function switchToStatusMode() {\n\t\tthis.showChildView(\"content\", new FlashCardItemStatus());\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(Radio.channel(\"flashCards\"));\n\t}\n});\n\nvar FlashCardList = Backbone.Marionette.CollectionView.extend({\n\tclassName: \"flash-card-list\",\n\n\tchildView: FlashCardItem\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-list-layout\",\n\n\ttemplate: require(\"../../templates/flashCards/cardList.nunj\").layout,\n\n\tregions: {\n\t\theader: \".header-region\",\n\t\tsubHeader: \".sub-header-region\",\n\t\tbody: \".body-region\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.cardCollection = options.cardCollection;\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.showChildView(\"header\", new Header());\n\t\tthis.showChildView(\"subHeader\", new SubHeader({ collection: this.cardCollection }));\n\t\tthis.showChildView(\"body\", new FlashCardList({ collection: this.cardCollection }));\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNhcmRMaXN0LmpzIl0sIm5hbWVzIjpbIl8iLCJyZXF1aXJlIiwiQmFja2JvbmUiLCJSYWRpbyIsInRpcHB5IiwiZGVmYXVsdCIsIkhlYWRlciIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiZXh0ZW5kIiwiY2xhc3NOYW1lIiwidGVtcGxhdGUiLCJoZWFkZXIiLCJ1aSIsImJ1dHRvbkFkZCIsImV2ZW50cyIsImluaXRpYWxpemUiLCJsaXN0ZW5UbyIsImNoYW5uZWwiLCJvbkNhcmRBZGQiLCJiaW5kIiwiZGlzYWJsZSIsImVuYWJsZSIsIm9uUmVuZGVyIiwiZWFjaCIsInRhcmdldEVsIiwiZ2V0IiwiY29udGVudCIsInNwZWMiLCJvbWl0IiwidGhlbWUiLCJwbGFjZW1lbnQiLCJvbkJ1dHRvbkFkZENsaWNrIiwidHJpZ2dlciIsInRvb2x0aXBWaWV3cyIsInQiLCJoaWRlIiwiJGVsIiwiYWRkQ2xhc3MiLCJyZW1vdmVDbGFzcyIsIm9uQmVmb3JlRGVzdHJveSIsInN0b3BMaXN0ZW5pbmciLCJTdWJIZWFkZXIiLCJzdWJIZWFkZXIiLCJGbGFzaENhcmRJdGVtRGlzcGxheSIsIml0ZW1EaXNwbGF5IiwiYnV0dG9uRGVsZXRlIiwiYnV0dG9uRWRpdCIsImNsaWNrIiwidGVtcGxhdGVDb250ZXh0IiwiYmFjayIsIm1vZGVsIiwidHJpbSIsInJlcGxhY2UiLCJ4IiwiY2hhckNvZGVBdCIsImZyb250IiwicmVuZGVyIiwib25DbGljayIsImVkaXRDYXJkIiwib25CdXR0b25EZWxldGVDbGljayIsImV2ZW50Iiwic3RvcFByb3BhZ2F0aW9uIiwiY2lkIiwib25CdXR0b25FZGl0Q2xpY2siLCJGbGFzaENhcmRJdGVtRGVsZXRlQ29uZmlybWF0aW9uIiwiaXRlbURlbGV0ZUNvbmZpcm1hdGlvbiIsImJ1dHRvbkFjY2VwdCIsImJ1dHRvblJlamVjdCIsIm9uQnV0dG9uQWNjZXB0Q2xpY2siLCJvbkJ1dHRvblJlamVjdENsaWNrIiwiRmxhc2hDYXJkSXRlbVN0YXR1cyIsIml0ZW1TdGF0dXMiLCJGbGFzaENhcmRJdGVtRXJyb3IiLCJpdGVtRXJyb3IiLCJidXR0b25EaXNtaXNzIiwibWVzc2FnZSIsIm9wdGlvbnMiLCJvbkJ1dHRvbkRpc21pc3NDbGljayIsImRlc3Ryb3kiLCJGbGFzaENhcmRJdGVtIiwiaXRlbSIsInJlZ2lvbnMiLCJvbkNhcmREZWxldGUiLCJvbkNhcmREZWxldGVSZWplY3RlZCIsIm9uQ2FyZERlbGV0ZVNhdmUiLCJvbkNhcmREZWxldGVTYXZlZCIsIm9uQ2FyZEVycm9yRGlzbWlzc2VkIiwic3dpdGNoVG9EaXNwbGF5TW9kZSIsImNhcmRNb2RlbENpZCIsInN3aXRjaFRvRGVsZXRlQ29uZmlybWF0aW9uTW9kZSIsInN3aXRjaFRvU3RhdHVzTW9kZSIsInNob3dDaGlsZFZpZXciLCJzd2l0Y2hUb0Vycm9yTW9kZSIsIkZsYXNoQ2FyZExpc3QiLCJDb2xsZWN0aW9uVmlldyIsImNoaWxkVmlldyIsIm1vZHVsZSIsImV4cG9ydHMiLCJsYXlvdXQiLCJib2R5IiwiY2FyZENvbGxlY3Rpb24iLCJjb2xsZWN0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLFdBQVdELFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1FLFFBQVFELFNBQVNDLEtBQXZCO0FBQ0EsSUFBTUMsUUFBUUgsUUFBUSxVQUFSLEVBQW9CSSxPQUFsQzs7QUFFQSxJQUFNQyxTQUFTSixTQUFTSyxVQUFULENBQW9CQyxJQUFwQixDQUF5QkMsTUFBekIsQ0FBZ0M7QUFDOUNDLFlBQVcsd0JBRG1DOztBQUc5Q0MsV0FBVVYsUUFBUSwwQ0FBUixFQUFvRFcsTUFIaEI7O0FBSzlDQyxLQUFJO0FBQ0hDLGFBQVc7QUFEUixFQUwwQzs7QUFTOUNDLFNBQVE7QUFDUCx5QkFBdUI7QUFEaEIsRUFUc0M7O0FBYTlDQyxhQUFZLHNCQUFXO0FBQ3RCLE9BQUtDLFFBQUwsQ0FBY2QsTUFBTWUsT0FBTixDQUFjLFlBQWQsQ0FBZCxFQUEyQztBQUMxQyxlQUFZLEtBQUtDLFNBQUwsQ0FBZUMsSUFBZixDQUFvQixJQUFwQixDQUQ4QjtBQUUxQyxrQkFBZSxLQUFLQyxPQUFMLENBQWFELElBQWIsQ0FBa0IsSUFBbEIsQ0FGMkI7QUFHMUMseUJBQXNCLEtBQUtFLE1BQUwsQ0FBWUYsSUFBWixDQUFpQixJQUFqQixDQUhvQjtBQUkxQyx3QkFBcUIsS0FBS0UsTUFBTCxDQUFZRixJQUFaLENBQWlCLElBQWpCLENBSnFCO0FBSzFDLHlCQUFzQixLQUFLRSxNQUFMLENBQVlGLElBQVosQ0FBaUIsSUFBakI7QUFMb0IsR0FBM0M7QUFPQSxFQXJCNkM7O0FBdUI5Q0csV0FBVSxvQkFBVztBQUNwQnZCLElBQUV3QixJQUFGLENBQU8sQ0FDTjtBQUNDQyxhQUFVLEtBQUtaLEVBQUwsQ0FBUUMsU0FBUixDQUFrQlksR0FBbEIsQ0FBc0IsQ0FBdEIsQ0FEWDtBQUVDQyxZQUFTO0FBRlYsR0FETSxDQUFQLEVBS0c7QUFBQSxVQUFRdkIsTUFBTXdCLEtBQUtILFFBQVgsRUFBcUJ6QixFQUFFUyxNQUFGLENBQVNULEVBQUU2QixJQUFGLENBQU9ELElBQVAsRUFBYSxDQUFDLFVBQUQsQ0FBYixDQUFULEVBQXFDO0FBQ3BFRSxXQUFPLE9BRDZEO0FBRXBFQyxlQUFXO0FBRnlELElBQXJDLENBQXJCLENBQVI7QUFBQSxHQUxIO0FBU0EsRUFqQzZDOztBQW1DOUNDLG1CQUFrQiw0QkFBVztBQUM1QjdCLFFBQU1lLE9BQU4sQ0FBYyxZQUFkLEVBQTRCZSxPQUE1QixDQUFvQyxVQUFwQztBQUNBLEVBckM2Qzs7QUF1QzlDZCxZQUFXLHFCQUFXO0FBQ3JCbkIsSUFBRXdCLElBQUYsQ0FBTyxLQUFLVSxZQUFaLEVBQTBCO0FBQUEsVUFBS0MsRUFBRUMsSUFBRixFQUFMO0FBQUEsR0FBMUI7QUFDQSxFQXpDNkM7O0FBMkM5Q2YsVUFBUyxtQkFBVztBQUNuQixPQUFLZ0IsR0FBTCxDQUFTQyxRQUFULENBQWtCLGlDQUFsQjtBQUNBLEVBN0M2Qzs7QUErQzlDaEIsU0FBUSxrQkFBVztBQUNsQixPQUFLZSxHQUFMLENBQVNFLFdBQVQsQ0FBcUIsaUNBQXJCO0FBQ0EsRUFqRDZDOztBQW1EOUNDLGtCQUFpQiwyQkFBVztBQUMzQixPQUFLQyxhQUFMLENBQW1CdEMsTUFBTWUsT0FBTixDQUFjLFlBQWQsQ0FBbkI7QUFDQTtBQXJENkMsQ0FBaEMsQ0FBZjs7QUF3REEsSUFBTXdCLFlBQVl4QyxTQUFTSyxVQUFULENBQW9CQyxJQUFwQixDQUF5QkMsTUFBekIsQ0FBZ0M7QUFDakRDLFlBQVcsbURBRHNDOztBQUdqREMsV0FBVVYsUUFBUSwwQ0FBUixFQUFvRDBDO0FBSGIsQ0FBaEMsQ0FBbEI7O0FBTUEsSUFBTUMsdUJBQXVCMUMsU0FBU0ssVUFBVCxDQUFvQkMsSUFBcEIsQ0FBeUJDLE1BQXpCLENBQWdDO0FBQzVEQyxZQUFXLDhCQURpRDs7QUFHNURDLFdBQVVWLFFBQVEsMENBQVIsRUFBb0Q0QyxXQUhGOztBQUs1RGhDLEtBQUk7QUFDSGlDLGdCQUFjLGdCQURYO0FBRUhDLGNBQVk7QUFGVCxFQUx3RDs7QUFVNURoQyxTQUFRO0FBQ1BpQyxTQUFPLFNBREE7QUFFUCw0QkFBMEIscUJBRm5CO0FBR1AsMEJBQXdCO0FBSGpCLEVBVm9EOztBQWdCNURDLGtCQUFpQiwyQkFBVztBQUFBOztBQUMzQixTQUFPO0FBQ05DLFNBQU07QUFBQSxXQUFNLE1BQUtDLEtBQUwsQ0FBV3pCLEdBQVgsQ0FBZSxNQUFmLEVBQXVCMEIsSUFBdkIsR0FBOEJDLE9BQTlCLENBQXNDLGVBQXRDLEVBQXVEO0FBQUEsWUFBSyxPQUFPQyxFQUFFQyxVQUFGLENBQWEsQ0FBYixDQUFQLEdBQXlCLEdBQTlCO0FBQUEsS0FBdkQsRUFBMEZGLE9BQTFGLENBQWtHLEtBQWxHLEVBQXlHLE1BQXpHLENBQU47QUFBQSxJQURBO0FBRU5HLFVBQU87QUFBQSxXQUFNLE1BQUtMLEtBQUwsQ0FBV3pCLEdBQVgsQ0FBZSxPQUFmLEVBQXdCMEIsSUFBeEIsR0FBK0JDLE9BQS9CLENBQXVDLGVBQXZDLEVBQXdEO0FBQUEsWUFBSyxPQUFPQyxFQUFFQyxVQUFGLENBQWEsQ0FBYixDQUFQLEdBQXlCLEdBQTlCO0FBQUEsS0FBeEQsRUFBMkZGLE9BQTNGLENBQW1HLEtBQW5HLEVBQTBHLE1BQTFHLENBQU47QUFBQTtBQUZELEdBQVA7QUFJQSxFQXJCMkQ7O0FBdUI1RHJDLGFBQVksc0JBQVc7QUFDdEIsT0FBS0MsUUFBTCxDQUFjZCxNQUFNZSxPQUFOLENBQWMsWUFBZCxDQUFkLEVBQTJDLGlCQUEzQyxFQUE4RCxLQUFLdUMsTUFBTCxDQUFZckMsSUFBWixDQUFpQixJQUFqQixDQUE5RDtBQUNBLEVBekIyRDs7QUEyQjVERyxXQUFVLG9CQUFXO0FBQ3BCdkIsSUFBRXdCLElBQUYsQ0FBTyxDQUNOO0FBQ0NDLGFBQVUsS0FBS1osRUFBTCxDQUFRaUMsWUFBUixDQUFxQnBCLEdBQXJCLENBQXlCLENBQXpCLENBRFg7QUFFQ0MsWUFBUztBQUZWLEdBRE0sRUFLTjtBQUNDRixhQUFVLEtBQUtaLEVBQUwsQ0FBUWtDLFVBQVIsQ0FBbUJyQixHQUFuQixDQUF1QixDQUF2QixDQURYO0FBRUNDLFlBQVM7QUFGVixHQUxNLENBQVAsRUFTRztBQUFBLFVBQVF2QixNQUFNd0IsS0FBS0gsUUFBWCxFQUFxQnpCLEVBQUVTLE1BQUYsQ0FBU1QsRUFBRTZCLElBQUYsQ0FBT0QsSUFBUCxFQUFhLENBQUMsVUFBRCxDQUFiLENBQVQsRUFBcUM7QUFDcEVFLFdBQU8sT0FENkQ7QUFFcEVDLGVBQVc7QUFGeUQsSUFBckMsQ0FBckIsQ0FBUjtBQUFBLEdBVEg7QUFhQSxFQXpDMkQ7O0FBMkM1RDJCLFVBQVMsbUJBQVc7QUFDbkIsT0FBS0MsUUFBTDtBQUNBLEVBN0MyRDs7QUErQzVEQyxzQkFBcUIsNkJBQVNDLEtBQVQsRUFBZ0I7QUFDcENBLFFBQU1DLGVBQU47QUFDQTNELFFBQU1lLE9BQU4sQ0FBYyxZQUFkLEVBQTRCZSxPQUE1QixDQUFvQyxhQUFwQyxFQUFtRCxLQUFLa0IsS0FBTCxDQUFXWSxHQUE5RDtBQUNBLEVBbEQyRDs7QUFvRDVEQyxvQkFBbUIsMkJBQVNILEtBQVQsRUFBZ0I7QUFDbENBLFFBQU1DLGVBQU47QUFDQSxPQUFLSCxRQUFMO0FBQ0EsT0FBSzlDLEVBQUwsQ0FBUWtDLFVBQVIsQ0FBbUJkLE9BQW5CLENBQTJCLFVBQTNCO0FBQ0EsRUF4RDJEOztBQTBENUQwQixXQUFVLG9CQUFXO0FBQ3BCeEQsUUFBTWUsT0FBTixDQUFjLFlBQWQsRUFBNEJlLE9BQTVCLENBQW9DLFdBQXBDLEVBQWlELEtBQUtrQixLQUFMLENBQVdZLEdBQTVEO0FBQ0EsRUE1RDJEOztBQThENUR2QixrQkFBaUIsMkJBQVc7QUFDM0IsT0FBS0MsYUFBTCxDQUFtQnRDLE1BQU1lLE9BQU4sQ0FBYyxZQUFkLENBQW5CO0FBQ0E7QUFoRTJELENBQWhDLENBQTdCOztBQW1FQSxJQUFNK0Msa0NBQWtDL0QsU0FBU0ssVUFBVCxDQUFvQkMsSUFBcEIsQ0FBeUJDLE1BQXpCLENBQWdDO0FBQ3ZFQyxZQUFXLDBDQUQ0RDs7QUFHdkVDLFdBQVVWLFFBQVEsMENBQVIsRUFBb0RpRSxzQkFIUzs7QUFLdkVyRCxLQUFJO0FBQ0hzRCxnQkFBYyxnQkFEWDtBQUVIQyxnQkFBYztBQUZYLEVBTG1FOztBQVV2RXJELFNBQVE7QUFDUCw0QkFBMEIscUJBRG5CO0FBRVAsNEJBQTBCO0FBRm5CLEVBVitEOztBQWV2RVEsV0FBVSxvQkFBVztBQUNwQnZCLElBQUV3QixJQUFGLENBQU8sQ0FDTjtBQUNDQyxhQUFVLEtBQUtaLEVBQUwsQ0FBUXNELFlBQVIsQ0FBcUJ6QyxHQUFyQixDQUF5QixDQUF6QixDQURYO0FBRUNDLFlBQVM7QUFGVixHQURNLEVBS047QUFDQ0YsYUFBVSxLQUFLWixFQUFMLENBQVF1RCxZQUFSLENBQXFCMUMsR0FBckIsQ0FBeUIsQ0FBekIsQ0FEWDtBQUVDQyxZQUFTO0FBRlYsR0FMTSxDQUFQLEVBU0c7QUFBQSxVQUFRdkIsTUFBTXdCLEtBQUtILFFBQVgsRUFBcUJ6QixFQUFFUyxNQUFGLENBQVNULEVBQUU2QixJQUFGLENBQU9ELElBQVAsRUFBYSxDQUFDLFVBQUQsQ0FBYixDQUFULEVBQXFDO0FBQ3BFRSxXQUFPLE9BRDZEO0FBRXBFQyxlQUFXO0FBRnlELElBQXJDLENBQXJCLENBQVI7QUFBQSxHQVRIO0FBYUEsRUE3QnNFOztBQStCdkVzQyxzQkFBcUIsK0JBQVc7QUFDL0JsRSxRQUFNZSxPQUFOLENBQWMsWUFBZCxFQUE0QmUsT0FBNUIsQ0FBb0Msb0JBQXBDLEVBQTBELEtBQUtrQixLQUFMLENBQVdZLEdBQXJFO0FBQ0EsRUFqQ3NFOztBQW1DdkVPLHNCQUFxQiwrQkFBVztBQUMvQm5FLFFBQU1lLE9BQU4sQ0FBYyxZQUFkLEVBQTRCZSxPQUE1QixDQUFvQyxvQkFBcEMsRUFBMEQsS0FBS2tCLEtBQUwsQ0FBV1ksR0FBckU7QUFDQTtBQXJDc0UsQ0FBaEMsQ0FBeEM7O0FBd0NBLElBQU1RLHNCQUFzQnJFLFNBQVNLLFVBQVQsQ0FBb0JDLElBQXBCLENBQXlCQyxNQUF6QixDQUFnQztBQUMzREMsWUFBVyw2QkFEZ0Q7O0FBRzNEQyxXQUFVVixRQUFRLDBDQUFSLEVBQW9EdUU7QUFISCxDQUFoQyxDQUE1Qjs7QUFNQSxJQUFNQyxxQkFBcUJ2RSxTQUFTSyxVQUFULENBQW9CQyxJQUFwQixDQUF5QkMsTUFBekIsQ0FBZ0M7QUFDMURDLFlBQVcsNEJBRCtDOztBQUcxREMsV0FBVVYsUUFBUSwwQ0FBUixFQUFvRHlFLFNBSEo7O0FBSzFEN0QsS0FBSTtBQUNIOEQsaUJBQWU7QUFEWixFQUxzRDs7QUFTMUQ1RCxTQUFRO0FBQ1AsNkJBQTJCO0FBRHBCLEVBVGtEOztBQWExRGtDLGtCQUFpQiwyQkFBVztBQUMzQixTQUFPO0FBQ04yQixZQUFTLEtBQUtBO0FBRFIsR0FBUDtBQUdBLEVBakJ5RDs7QUFtQjFENUQsYUFBWSxvQkFBUzZELE9BQVQsRUFBa0I7QUFDN0IsT0FBS0QsT0FBTCxHQUFlQyxRQUFRRCxPQUF2QjtBQUNBLEVBckJ5RDs7QUF1QjFEckQsV0FBVSxvQkFBVztBQUNwQnZCLElBQUV3QixJQUFGLENBQU8sQ0FDTjtBQUNDQyxhQUFVLEtBQUtaLEVBQUwsQ0FBUThELGFBQVIsQ0FBc0JqRCxHQUF0QixDQUEwQixDQUExQixDQURYO0FBRUNDLFlBQVM7QUFGVixHQURNLENBQVAsRUFLRztBQUFBLFVBQVF2QixNQUFNd0IsS0FBS0gsUUFBWCxFQUFxQnpCLEVBQUVTLE1BQUYsQ0FBU1QsRUFBRTZCLElBQUYsQ0FBT0QsSUFBUCxFQUFhLENBQUMsVUFBRCxDQUFiLENBQVQsRUFBcUM7QUFDcEVFLFdBQU8sT0FENkQ7QUFFcEVDLGVBQVc7QUFGeUQsSUFBckMsQ0FBckIsQ0FBUjtBQUFBLEdBTEg7QUFTQSxFQWpDeUQ7O0FBbUMxRCtDLHVCQUFzQixnQ0FBVztBQUNoQzNFLFFBQU1lLE9BQU4sQ0FBYyxZQUFkLEVBQTRCZSxPQUE1QixDQUFvQyxvQkFBcEMsRUFBMEQsS0FBS2tCLEtBQUwsQ0FBV1ksR0FBckU7QUFDQSxFQXJDeUQ7O0FBdUMxRHZCLGtCQUFpQiwyQkFBVztBQUMzQnhDLElBQUV3QixJQUFGLENBQU8sS0FBS1UsWUFBWixFQUEwQjtBQUFBLFVBQUtDLEVBQUU0QyxPQUFGLEVBQUw7QUFBQSxHQUExQjtBQUNBO0FBekN5RCxDQUFoQyxDQUEzQjs7QUE0Q0EsSUFBTUMsZ0JBQWdCOUUsU0FBU0ssVUFBVCxDQUFvQkMsSUFBcEIsQ0FBeUJDLE1BQXpCLENBQWdDO0FBQ3JEQyxZQUFXLHNCQUQwQzs7QUFHckRDLFdBQVVWLFFBQVEsMENBQVIsRUFBb0RnRixJQUhUOztBQUtyREMsVUFBUztBQUNSdkQsV0FBUztBQURELEVBTDRDOztBQVNyRFgsYUFBWSxzQkFBVztBQUN0QixPQUFLQyxRQUFMLENBQWNkLE1BQU1lLE9BQU4sQ0FBYyxZQUFkLENBQWQsRUFBMkM7QUFDMUMsa0JBQWUsS0FBS2lFLFlBQUwsQ0FBa0IvRCxJQUFsQixDQUF1QixJQUF2QixDQUQyQjtBQUUxQyx5QkFBc0IsS0FBS2dFLG9CQUFMLENBQTBCaEUsSUFBMUIsQ0FBK0IsSUFBL0IsQ0FGb0I7QUFHMUMsdUJBQW9CLEtBQUtpRSxnQkFBTCxDQUFzQmpFLElBQXRCLENBQTJCLElBQTNCLENBSHNCO0FBSTFDLHdCQUFxQixLQUFLa0UsaUJBQUwsQ0FBdUJsRSxJQUF2QixDQUE0QixJQUE1QixDQUpxQjtBQUsxQyx5QkFBc0IsS0FBS21FLG9CQUFMLENBQTBCbkUsSUFBMUIsQ0FBK0IsSUFBL0I7QUFMb0IsR0FBM0M7QUFPQSxFQWpCb0Q7O0FBbUJyREcsV0FBVSxvQkFBVztBQUNwQixPQUFLaUUsbUJBQUw7QUFDQSxFQXJCb0Q7O0FBdUJyREwsZUFBYyxzQkFBU00sWUFBVCxFQUF1QjtBQUNwQyxNQUFJLEtBQUt0QyxLQUFMLENBQVdZLEdBQVgsS0FBbUIwQixZQUF2QixFQUNDLEtBQUtDLDhCQUFMLEdBREQsS0FHQyxLQUFLckUsT0FBTDtBQUNELEVBNUJvRDs7QUE4QnJEK0QsdUJBQXNCLDhCQUFTSyxZQUFULEVBQXVCO0FBQzVDLE1BQUksS0FBS3RDLEtBQUwsQ0FBV1ksR0FBWCxLQUFtQjBCLFlBQXZCLEVBQ0MsS0FBS0QsbUJBQUwsR0FERCxLQUdDLEtBQUtsRSxNQUFMO0FBQ0QsRUFuQ29EOztBQXFDckQrRCxtQkFBa0IsMEJBQVNJLFlBQVQsRUFBdUI7QUFDeEMsTUFBSSxLQUFLdEMsS0FBTCxDQUFXWSxHQUFYLEtBQW1CMEIsWUFBdkIsRUFDQyxLQUFLRSxrQkFBTDtBQUNELEVBeENvRDs7QUEwQ3JETCxvQkFBbUIsMkJBQVNHLFlBQVQsRUFBdUI7QUFDekMsTUFBSSxLQUFLdEMsS0FBTCxDQUFXWSxHQUFYLEtBQW1CMEIsWUFBdkIsRUFDQyxLQUFLbkUsTUFBTDtBQUNELEVBN0NvRDs7QUErQ3JEaUUsdUJBQXNCLDhCQUFTRSxZQUFULEVBQXVCO0FBQzVDLE1BQUksS0FBS3RDLEtBQUwsQ0FBV1ksR0FBWCxLQUFtQjBCLFlBQXZCLEVBQ0MsS0FBS0QsbUJBQUwsR0FERCxLQUdDLEtBQUtsRSxNQUFMO0FBQ0QsRUFwRG9EOztBQXNEckRELFVBQVMsbUJBQVc7QUFDbkIsT0FBS2dCLEdBQUwsQ0FBU0MsUUFBVCxDQUFrQiwrQkFBbEI7QUFDQSxFQXhEb0Q7O0FBMERyRGhCLFNBQVEsa0JBQVc7QUFDbEIsT0FBS2UsR0FBTCxDQUFTRSxXQUFULENBQXFCLCtCQUFyQjtBQUNBLEVBNURvRDs7QUE4RHJEaUQsc0JBQXFCLCtCQUFXO0FBQy9CLE9BQUtJLGFBQUwsQ0FBbUIsU0FBbkIsRUFBOEIsSUFBSWhELG9CQUFKLENBQXlCLEVBQUVPLE9BQU8sS0FBS0EsS0FBZCxFQUF6QixDQUE5QjtBQUNBLEVBaEVvRDs7QUFrRXJEdUMsaUNBQWdDLDBDQUFXO0FBQzFDLE9BQUtFLGFBQUwsQ0FBbUIsU0FBbkIsRUFBOEIsSUFBSTNCLCtCQUFKLENBQW9DLEVBQUVkLE9BQU8sS0FBS0EsS0FBZCxFQUFwQyxDQUE5QjtBQUNBLEVBcEVvRDs7QUFzRXJEMEMsb0JBQW1CLDJCQUFTakIsT0FBVCxFQUFrQjtBQUNwQyxPQUFLZ0IsYUFBTCxDQUFtQixTQUFuQixFQUE4QixJQUFJbkIsa0JBQUosQ0FBdUI7QUFDcERHLFlBQVNBLE9BRDJDO0FBRXBEekIsVUFBTyxLQUFLQTtBQUZ3QyxHQUF2QixDQUE5QjtBQUlBLEVBM0VvRDs7QUE2RXJEd0MscUJBQW9CLDhCQUFXO0FBQzlCLE9BQUtDLGFBQUwsQ0FBbUIsU0FBbkIsRUFBOEIsSUFBSXJCLG1CQUFKLEVBQTlCO0FBQ0EsRUEvRW9EOztBQWlGckQvQixrQkFBaUIsMkJBQVc7QUFDM0IsT0FBS0MsYUFBTCxDQUFtQnRDLE1BQU1lLE9BQU4sQ0FBYyxZQUFkLENBQW5CO0FBQ0E7QUFuRm9ELENBQWhDLENBQXRCOztBQXNGQSxJQUFNNEUsZ0JBQWdCNUYsU0FBU0ssVUFBVCxDQUFvQndGLGNBQXBCLENBQW1DdEYsTUFBbkMsQ0FBMEM7QUFDL0RDLFlBQVcsaUJBRG9EOztBQUcvRHNGLFlBQVdoQjtBQUhvRCxDQUExQyxDQUF0Qjs7QUFNQWlCLE9BQU9DLE9BQVAsR0FBaUJoRyxTQUFTSyxVQUFULENBQW9CQyxJQUFwQixDQUF5QkMsTUFBekIsQ0FBZ0M7QUFDaERDLFlBQVcsd0JBRHFDOztBQUdoREMsV0FBVVYsUUFBUSwwQ0FBUixFQUFvRGtHLE1BSGQ7O0FBS2hEakIsVUFBUztBQUNSdEUsVUFBUSxnQkFEQTtBQUVSK0IsYUFBVyxvQkFGSDtBQUdSeUQsUUFBTTtBQUhFLEVBTHVDOztBQVdoRHBGLGFBQVksb0JBQVM2RCxPQUFULEVBQWtCO0FBQzdCLE9BQUt3QixjQUFMLEdBQXNCeEIsUUFBUXdCLGNBQTlCO0FBQ0EsRUFiK0M7O0FBZWhEOUUsV0FBVSxvQkFBVztBQUNwQixPQUFLcUUsYUFBTCxDQUFtQixRQUFuQixFQUE2QixJQUFJdEYsTUFBSixFQUE3QjtBQUNBLE9BQUtzRixhQUFMLENBQW1CLFdBQW5CLEVBQWdDLElBQUlsRCxTQUFKLENBQWMsRUFBRTRELFlBQVksS0FBS0QsY0FBbkIsRUFBZCxDQUFoQztBQUNBLE9BQUtULGFBQUwsQ0FBbUIsTUFBbkIsRUFBMkIsSUFBSUUsYUFBSixDQUFrQixFQUFFUSxZQUFZLEtBQUtELGNBQW5CLEVBQWxCLENBQTNCO0FBQ0E7QUFuQitDLENBQWhDLENBQWpCIiwiZmlsZSI6ImNhcmRMaXN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgUmFkaW8gPSBCYWNrYm9uZS5SYWRpbztcbmNvbnN0IHRpcHB5ID0gcmVxdWlyZShcInRpcHB5LmpzXCIpLmRlZmF1bHQ7XG5cbmNvbnN0IEhlYWRlciA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZmxhc2gtY2FyZC1saXN0LWhlYWRlclwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2ZsYXNoQ2FyZHMvY2FyZExpc3QubnVualwiKS5oZWFkZXIsXG5cblx0dWk6IHtcblx0XHRidXR0b25BZGQ6IFwiLmJ1dHRvbi1hZGRcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5idXR0b25BZGRcIjogXCJvbkJ1dHRvbkFkZENsaWNrXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5saXN0ZW5UbyhSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKSwge1xuXHRcdFx0XCJjYXJkOmFkZFwiOiB0aGlzLm9uQ2FyZEFkZC5iaW5kKHRoaXMpLFxuXHRcdFx0XCJjYXJkOmRlbGV0ZVwiOiB0aGlzLmRpc2FibGUuYmluZCh0aGlzKSxcblx0XHRcdFwiY2FyZDpkZWxldGU6cmVqZWN0XCI6IHRoaXMuZW5hYmxlLmJpbmQodGhpcyksXG5cdFx0XHRcImNhcmQ6ZGVsZXRlOnNhdmVkXCI6IHRoaXMuZW5hYmxlLmJpbmQodGhpcyksXG5cdFx0XHRcImNhcmQ6ZXJyb3I6ZGlzbWlzc1wiOiB0aGlzLmVuYWJsZS5iaW5kKHRoaXMpLFxuXHRcdH0pO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRfLmVhY2goW1xuXHRcdFx0e1xuXHRcdFx0XHR0YXJnZXRFbDogdGhpcy51aS5idXR0b25BZGQuZ2V0KDApLFxuXHRcdFx0XHRjb250ZW50OiBcIkFkZCBhIGZsYXNoY2FyZFwiLFxuXHRcdFx0fSxcblx0XHRdLCBzcGVjID0+IHRpcHB5KHNwZWMudGFyZ2V0RWwsIF8uZXh0ZW5kKF8ub21pdChzcGVjLCBbXCJ0YXJnZXRFbFwiXSksIHtcblx0XHRcdHRoZW1lOiBcImJsYWNrXCIsXG5cdFx0XHRwbGFjZW1lbnQ6IFwiYm90dG9tXCIsXG5cdFx0fSkpKTtcblx0fSxcblxuXHRvbkJ1dHRvbkFkZENsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS50cmlnZ2VyKFwiY2FyZDphZGRcIik7XG5cdH0sXG5cblx0b25DYXJkQWRkOiBmdW5jdGlvbigpIHtcblx0XHRfLmVhY2godGhpcy50b29sdGlwVmlld3MsIHQgPT4gdC5oaWRlKCkpO1xuXHR9LFxuXG5cdGRpc2FibGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJGVsLmFkZENsYXNzKFwiZmxhc2gtY2FyZC1saXN0LWhlYWRlci1kaXNhYmxlZFwiKTtcblx0fSxcblxuXHRlbmFibGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKFwiZmxhc2gtY2FyZC1saXN0LWhlYWRlci1kaXNhYmxlZFwiKTtcblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc3RvcExpc3RlbmluZyhSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKSk7XG5cdH0sXG59KTtcblxuY29uc3QgU3ViSGVhZGVyID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJmbGFzaC1jYXJkLWxpc3QtaGVhZGVyIGZsYXNoLWNhcmQtbGlzdC1zdWItaGVhZGVyXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvZmxhc2hDYXJkcy9jYXJkTGlzdC5udW5qXCIpLnN1YkhlYWRlcixcbn0pO1xuXG5jb25zdCBGbGFzaENhcmRJdGVtRGlzcGxheSA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZmxhc2gtY2FyZC1saXN0LWl0ZW0tZGlzcGxheVwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2ZsYXNoQ2FyZHMvY2FyZExpc3QubnVualwiKS5pdGVtRGlzcGxheSxcblxuXHR1aToge1xuXHRcdGJ1dHRvbkRlbGV0ZTogXCIuYnV0dG9uLWRlbGV0ZVwiLFxuXHRcdGJ1dHRvbkVkaXQ6IFwiLmJ1dHRvbi1lZGl0XCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0Y2xpY2s6IFwib25DbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmJ1dHRvbkRlbGV0ZVwiOiBcIm9uQnV0dG9uRGVsZXRlQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5idXR0b25FZGl0XCI6IFwib25CdXR0b25FZGl0Q2xpY2tcIixcblx0fSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRiYWNrOiAoKSA9PiB0aGlzLm1vZGVsLmdldChcImJhY2tcIikudHJpbSgpLnJlcGxhY2UoL1tcXCZcXDxcXD5cXCdcXFwiXS9nLCB4ID0+IFwiJiNcIiArIHguY2hhckNvZGVBdCgwKSArIFwiO1wiKS5yZXBsYWNlKC9cXG4vZywgXCI8YnI+XCIpLFxuXHRcdFx0ZnJvbnQ6ICgpID0+IHRoaXMubW9kZWwuZ2V0KFwiZnJvbnRcIikudHJpbSgpLnJlcGxhY2UoL1tcXCZcXDxcXD5cXCdcXFwiXS9nLCB4ID0+IFwiJiNcIiArIHguY2hhckNvZGVBdCgwKSArIFwiO1wiKS5yZXBsYWNlKC9cXG4vZywgXCI8YnI+XCIpLFxuXHRcdH07XG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5saXN0ZW5UbyhSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKSwgXCJjYXJkOmVkaXQ6c2F2ZWRcIiwgdGhpcy5yZW5kZXIuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdF8uZWFjaChbXG5cdFx0XHR7XG5cdFx0XHRcdHRhcmdldEVsOiB0aGlzLnVpLmJ1dHRvbkRlbGV0ZS5nZXQoMCksXG5cdFx0XHRcdGNvbnRlbnQ6IFwiRGVsZXRlXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHR0YXJnZXRFbDogdGhpcy51aS5idXR0b25FZGl0LmdldCgwKSxcblx0XHRcdFx0Y29udGVudDogXCJFZGl0XCIsXG5cdFx0XHR9LFxuXHRcdF0sIHNwZWMgPT4gdGlwcHkoc3BlYy50YXJnZXRFbCwgXy5leHRlbmQoXy5vbWl0KHNwZWMsIFtcInRhcmdldEVsXCJdKSwge1xuXHRcdFx0dGhlbWU6IFwiYmxhY2tcIixcblx0XHRcdHBsYWNlbWVudDogXCJib3R0b21cIixcblx0XHR9KSkpO1xuXHR9LFxuXG5cdG9uQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZWRpdENhcmQoKTtcblx0fSxcblxuXHRvbkJ1dHRvbkRlbGV0ZUNsaWNrOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJjYXJkOmRlbGV0ZVwiLCB0aGlzLm1vZGVsLmNpZCk7XG5cdH0sXG5cblx0b25CdXR0b25FZGl0Q2xpY2s6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0dGhpcy5lZGl0Q2FyZCgpO1xuXHRcdHRoaXMudWkuYnV0dG9uRWRpdC50cmlnZ2VyKFwibW91c2VvdXRcIik7XG5cdH0sXG5cblx0ZWRpdENhcmQ6IGZ1bmN0aW9uKCkge1xuXHRcdFJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJjYXJkOmVkaXRcIiwgdGhpcy5tb2RlbC5jaWQpO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKFJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpKTtcblx0fSxcbn0pO1xuXG5jb25zdCBGbGFzaENhcmRJdGVtRGVsZXRlQ29uZmlybWF0aW9uID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJmbGFzaC1jYXJkLWxpc3QtaXRlbS1kZWxldGUtY29uZmlybWF0aW9uXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvZmxhc2hDYXJkcy9jYXJkTGlzdC5udW5qXCIpLml0ZW1EZWxldGVDb25maXJtYXRpb24sXG5cblx0dWk6IHtcblx0XHRidXR0b25BY2NlcHQ6IFwiLmJ1dHRvbi1hY2NlcHRcIixcblx0XHRidXR0b25SZWplY3Q6IFwiLmJ1dHRvbi1yZWplY3RcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5idXR0b25BY2NlcHRcIjogXCJvbkJ1dHRvbkFjY2VwdENsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkuYnV0dG9uUmVqZWN0XCI6IFwib25CdXR0b25SZWplY3RDbGlja1wiLFxuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRfLmVhY2goW1xuXHRcdFx0e1xuXHRcdFx0XHR0YXJnZXRFbDogdGhpcy51aS5idXR0b25BY2NlcHQuZ2V0KDApLFxuXHRcdFx0XHRjb250ZW50OiBcIlllc1wiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0dGFyZ2V0RWw6IHRoaXMudWkuYnV0dG9uUmVqZWN0LmdldCgwKSxcblx0XHRcdFx0Y29udGVudDogXCJOb1wiLFxuXHRcdFx0fSxcblx0XHRdLCBzcGVjID0+IHRpcHB5KHNwZWMudGFyZ2V0RWwsIF8uZXh0ZW5kKF8ub21pdChzcGVjLCBbXCJ0YXJnZXRFbFwiXSksIHtcblx0XHRcdHRoZW1lOiBcImJsYWNrXCIsXG5cdFx0XHRwbGFjZW1lbnQ6IFwiYm90dG9tXCIsXG5cdFx0fSkpKTtcblx0fSxcblxuXHRvbkJ1dHRvbkFjY2VwdENsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS50cmlnZ2VyKFwiY2FyZDpkZWxldGU6YWNjZXB0XCIsIHRoaXMubW9kZWwuY2lkKTtcblx0fSxcblxuXHRvbkJ1dHRvblJlamVjdENsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS50cmlnZ2VyKFwiY2FyZDpkZWxldGU6cmVqZWN0XCIsIHRoaXMubW9kZWwuY2lkKTtcblx0fSxcbn0pO1xuXG5jb25zdCBGbGFzaENhcmRJdGVtU3RhdHVzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJmbGFzaC1jYXJkLWxpc3QtaXRlbS1zdGF0dXNcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9mbGFzaENhcmRzL2NhcmRMaXN0Lm51bmpcIikuaXRlbVN0YXR1cyxcbn0pO1xuXG5jb25zdCBGbGFzaENhcmRJdGVtRXJyb3IgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImZsYXNoLWNhcmQtbGlzdC1pdGVtLWVycm9yXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvZmxhc2hDYXJkcy9jYXJkTGlzdC5udW5qXCIpLml0ZW1FcnJvcixcblxuXHR1aToge1xuXHRcdGJ1dHRvbkRpc21pc3M6IFwiLmJ1dHRvbi1kaXNtaXNzXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkuYnV0dG9uRGlzbWlzc1wiOiBcIm9uQnV0dG9uRGlzbWlzc0NsaWNrXCIsXG5cdH0sXG5cblx0dGVtcGxhdGVDb250ZXh0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuXHRcdH07XG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMubWVzc2FnZSA9IG9wdGlvbnMubWVzc2FnZTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Xy5lYWNoKFtcblx0XHRcdHtcblx0XHRcdFx0dGFyZ2V0RWw6IHRoaXMudWkuYnV0dG9uRGlzbWlzcy5nZXQoMCksXG5cdFx0XHRcdGNvbnRlbnQ6IFwiT2tcIixcblx0XHRcdH0sXG5cdFx0XSwgc3BlYyA9PiB0aXBweShzcGVjLnRhcmdldEVsLCBfLmV4dGVuZChfLm9taXQoc3BlYywgW1widGFyZ2V0RWxcIl0pLCB7XG5cdFx0XHR0aGVtZTogXCJibGFja1wiLFxuXHRcdFx0cGxhY2VtZW50OiBcImJvdHRvbVwiLFxuXHRcdH0pKSk7XG5cdH0sXG5cblx0b25CdXR0b25EaXNtaXNzQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJjYXJkOmVycm9yOmRpc21pc3NcIiwgdGhpcy5tb2RlbC5jaWQpO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0Xy5lYWNoKHRoaXMudG9vbHRpcFZpZXdzLCB0ID0+IHQuZGVzdHJveSgpKTtcblx0fSxcbn0pO1xuXG5jb25zdCBGbGFzaENhcmRJdGVtID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJmbGFzaC1jYXJkLWxpc3QtaXRlbVwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2ZsYXNoQ2FyZHMvY2FyZExpc3QubnVualwiKS5pdGVtLFxuXG5cdHJlZ2lvbnM6IHtcblx0XHRjb250ZW50OiBcIi5mbGFzaC1jYXJkLWxpc3QtaXRlbS1jb250ZW50LXJlZ2lvblwiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMubGlzdGVuVG8oUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIiksIHtcblx0XHRcdFwiY2FyZDpkZWxldGVcIjogdGhpcy5vbkNhcmREZWxldGUuYmluZCh0aGlzKSxcblx0XHRcdFwiY2FyZDpkZWxldGU6cmVqZWN0XCI6IHRoaXMub25DYXJkRGVsZXRlUmVqZWN0ZWQuYmluZCh0aGlzKSxcblx0XHRcdFwiY2FyZDpkZWxldGU6c2F2ZVwiOiB0aGlzLm9uQ2FyZERlbGV0ZVNhdmUuYmluZCh0aGlzKSxcblx0XHRcdFwiY2FyZDpkZWxldGU6c2F2ZWRcIjogdGhpcy5vbkNhcmREZWxldGVTYXZlZC5iaW5kKHRoaXMpLFxuXHRcdFx0XCJjYXJkOmVycm9yOmRpc21pc3NcIjogdGhpcy5vbkNhcmRFcnJvckRpc21pc3NlZC5iaW5kKHRoaXMpLFxuXHRcdH0pO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnN3aXRjaFRvRGlzcGxheU1vZGUoKTtcblx0fSxcblxuXHRvbkNhcmREZWxldGU6IGZ1bmN0aW9uKGNhcmRNb2RlbENpZCkge1xuXHRcdGlmICh0aGlzLm1vZGVsLmNpZCA9PT0gY2FyZE1vZGVsQ2lkKVxuXHRcdFx0dGhpcy5zd2l0Y2hUb0RlbGV0ZUNvbmZpcm1hdGlvbk1vZGUoKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLmRpc2FibGUoKTtcblx0fSxcblxuXHRvbkNhcmREZWxldGVSZWplY3RlZDogZnVuY3Rpb24oY2FyZE1vZGVsQ2lkKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwuY2lkID09PSBjYXJkTW9kZWxDaWQpXG5cdFx0XHR0aGlzLnN3aXRjaFRvRGlzcGxheU1vZGUoKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLmVuYWJsZSgpO1xuXHR9LFxuXG5cdG9uQ2FyZERlbGV0ZVNhdmU6IGZ1bmN0aW9uKGNhcmRNb2RlbENpZCkge1xuXHRcdGlmICh0aGlzLm1vZGVsLmNpZCA9PT0gY2FyZE1vZGVsQ2lkKVxuXHRcdFx0dGhpcy5zd2l0Y2hUb1N0YXR1c01vZGUoKTtcblx0fSxcblxuXHRvbkNhcmREZWxldGVTYXZlZDogZnVuY3Rpb24oY2FyZE1vZGVsQ2lkKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwuY2lkICE9PSBjYXJkTW9kZWxDaWQpXG5cdFx0XHR0aGlzLmVuYWJsZSgpO1xuXHR9LFxuXG5cdG9uQ2FyZEVycm9yRGlzbWlzc2VkOiBmdW5jdGlvbihjYXJkTW9kZWxDaWQpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5jaWQgPT09IGNhcmRNb2RlbENpZClcblx0XHRcdHRoaXMuc3dpdGNoVG9EaXNwbGF5TW9kZSgpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuZW5hYmxlKCk7XG5cdH0sXG5cblx0ZGlzYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy4kZWwuYWRkQ2xhc3MoXCJmbGFzaC1jYXJkLWxpc3QtaXRlbS1kaXNhYmxlZFwiKTtcblx0fSxcblxuXHRlbmFibGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKFwiZmxhc2gtY2FyZC1saXN0LWl0ZW0tZGlzYWJsZWRcIik7XG5cdH0sXG5cblx0c3dpdGNoVG9EaXNwbGF5TW9kZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiY29udGVudFwiLCBuZXcgRmxhc2hDYXJkSXRlbURpc3BsYXkoeyBtb2RlbDogdGhpcy5tb2RlbCB9KSk7XG5cdH0sXG5cblx0c3dpdGNoVG9EZWxldGVDb25maXJtYXRpb25Nb2RlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJjb250ZW50XCIsIG5ldyBGbGFzaENhcmRJdGVtRGVsZXRlQ29uZmlybWF0aW9uKHsgbW9kZWw6IHRoaXMubW9kZWwgfSkpO1xuXHR9LFxuXG5cdHN3aXRjaFRvRXJyb3JNb2RlOiBmdW5jdGlvbihtZXNzYWdlKSB7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiY29udGVudFwiLCBuZXcgRmxhc2hDYXJkSXRlbUVycm9yKHtcblx0XHRcdG1lc3NhZ2U6IG1lc3NhZ2UsXG5cdFx0XHRtb2RlbDogdGhpcy5tb2RlbCxcblx0XHR9KSk7XG5cdH0sXG5cblx0c3dpdGNoVG9TdGF0dXNNb2RlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJjb250ZW50XCIsIG5ldyBGbGFzaENhcmRJdGVtU3RhdHVzKCkpO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKFJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpKTtcblx0fSxcbn0pO1xuXG5jb25zdCBGbGFzaENhcmRMaXN0ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5Db2xsZWN0aW9uVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZmxhc2gtY2FyZC1saXN0XCIsXG5cblx0Y2hpbGRWaWV3OiBGbGFzaENhcmRJdGVtLFxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJmbGFzaC1jYXJkLWxpc3QtbGF5b3V0XCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvZmxhc2hDYXJkcy9jYXJkTGlzdC5udW5qXCIpLmxheW91dCxcblxuXHRyZWdpb25zOiB7XG5cdFx0aGVhZGVyOiBcIi5oZWFkZXItcmVnaW9uXCIsXG5cdFx0c3ViSGVhZGVyOiBcIi5zdWItaGVhZGVyLXJlZ2lvblwiLFxuXHRcdGJvZHk6IFwiLmJvZHktcmVnaW9uXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuY2FyZENvbGxlY3Rpb24gPSBvcHRpb25zLmNhcmRDb2xsZWN0aW9uO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJoZWFkZXJcIiwgbmV3IEhlYWRlcigpKTtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJzdWJIZWFkZXJcIiwgbmV3IFN1YkhlYWRlcih7IGNvbGxlY3Rpb246IHRoaXMuY2FyZENvbGxlY3Rpb24gfSkpO1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImJvZHlcIiwgbmV3IEZsYXNoQ2FyZExpc3QoeyBjb2xsZWN0aW9uOiB0aGlzLmNhcmRDb2xsZWN0aW9uIH0pKTtcblx0fSxcbn0pO1xuIl19",
    "\"use strict\";\n\nrequire(\"jquery.flip\");\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\nvar Promise = require(\"bluebird\");\nvar Radio = Backbone.Radio;\nvar raygun = require(\"raygun\");\n\nvar eventBus = require(\"../../../educators/views/console/eventBus\");\n\nvar settings = require(\"app-settings\");\n\nvar CardCollection = require(\"../../collections/flashCards/cardCollection\");\nvar CardModel = require(\"../../models/flashCards/cardModel\");\nvar DeckCollection = require(\"../../collections/flashCards/deckCollection\");\nvar DeckEditor = require(\"./deckEditor\");\nvar tippy = require(\"tippy.js\").default;\nvar SmallModal = require(\"../../../lib/smallModal\");\nvar StatusView = require(\"../../../lib/statusView\");\n\nvar CARD_COUNT_MAX = 200;\nvar DEFAULT_BACK_TEXT = \"Enter text for the back of the card...\";\nvar DEFAULT_FRONT_TEXT = \"Enter text for the front of the card...\";\nvar MAX_NEW_LINE_CHARACTERS = 15;\nvar MAX_TEXT_LENGTH = 500;\n\nvar DeckTitle = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-widget-deck-title\",\n\n\ttemplate: require(\"../../templates/flashCards/cardWidget.nunj\").deckTitle,\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tcardCount: this.cardCount,\n\t\t\tcardCountMax: CARD_COUNT_MAX,\n\t\t\tcardNumber: this.cardNumber,\n\t\t\ttitle: this.deckModel ? this.deckModel.get(\"title\") : undefined\n\t\t};\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.listenTo(Radio.channel(\"flashCards\"), {\n\t\t\t\"card:select\": this.onCardSelected.bind(this),\n\n\t\t\t\"deck:delete:saved\": this.onDeckDeleteSaved.bind(this),\n\t\t\t\"deck:select\": this.onDeckSelected.bind(this),\n\t\t\t\"deck:size:updated\": this.onDeckSizeUpdated.bind(this)\n\t\t});\n\t},\n\n\tonCardSelected: function onCardSelected(cardModelCid) {\n\t\tthis.cardNumber = _.isNil(cardModelCid) ? null : Backbone.Radio.channel(\"flashCards\").request(\"card:model:index\", cardModelCid);\n\n\t\tif (!_.isNil(this.cardNumber)) this.cardNumber++;\n\n\t\tthis.render();\n\t},\n\n\tonDeckDeleteSaved: function onDeckDeleteSaved() {\n\t\tthis.deckModel = null;\n\t\tthis.render();\n\t},\n\n\tonDeckSelected: function onDeckSelected(deckModelCid) {\n\t\tthis.deckModel = Backbone.Radio.channel(\"flashCards\").request(\"deck:model:get\", deckModelCid);\n\t\tthis.render();\n\t},\n\n\tonDeckSizeUpdated: function onDeckSizeUpdated(deckModelCid, cardCount) {\n\t\tthis.cardCount = cardCount;\n\n\t\tif (cardCount === 0) this.cardNumber = null;\n\n\t\tthis.render();\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(Radio.channel(\"flashCards\"));\n\t}\n});\n\nvar CardEditor = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-widget-card-editor\",\n\n\ttemplate: require(\"../../templates/flashCards/cardWidget.nunj\").cardEditor,\n\n\tui: {\n\t\tbuttonNavigateNext: \".flash-card-editor-navigator > #button-next\",\n\t\tbuttonNavigatePrevious: \".flash-card-editor-navigator > #button-previous\",\n\t\tdisplaySide: \".flash-card-warning-container#top\",\n\t\tflashCard: \".flash-card\",\n\t\ttextBack: \"#text-back\",\n\t\ttextFront: \"#text-front\",\n\t\twarningContainerBottom: \".flash-card-warning-container#bottom\"\n\t},\n\n\tevents: {\n\t\t\"blur @ui.textBack\": \"onTextBlur\",\n\t\t\"blur @ui.textFront\": \"onTextBlur\",\n\t\t\"change @ui.textBack\": \"onCardTextChanged\",\n\t\t\"change @ui.textFront\": \"onCardTextChanged\",\n\t\t\"click @ui.buttonNavigateNext\": \"onButtonNavigateNextClick\",\n\t\t\"click @ui.buttonNavigatePrevious\": \"onButtonNavigatePreviousClick\",\n\t\t\"focus @ui.textBack\": \"onTextFocus\",\n\t\t\"focus @ui.textFront\": \"onTextFocus\",\n\t\t\"keyup @ui.textBack\": \"onTextKeyUp\",\n\t\t\"keyup @ui.textFront\": \"onTextKeyUp\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar model = this.model;\n\n\t\treturn {\n\t\t\tback: function back() {\n\t\t\t\treturn _.isNil(model) ? \"\" : model.get(\"back\").length === 0 ? DEFAULT_BACK_TEXT : model.get(\"back\");\n\t\t\t},\n\n\t\t\tfront: function front() {\n\t\t\t\treturn _.isNil(model) ? \"\" : model.get(\"front\").length === 0 ? DEFAULT_FRONT_TEXT : model.get(\"front\");\n\t\t\t},\n\n\t\t\tcardModelExists: function cardModelExists() {\n\t\t\t\treturn !_.isNil(model);\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.cardCollection = options.cardCollection;\n\t\tthis.deckCollection = options.deckCollection;\n\t\tthis.deckModel = options.deckModel;\n\t\tthis.disabled = options.disabled;\n\n\t\tif (this.cardCollection.length === 0) {\n\t\t\tthis.currentCardIndex = 0;\n\t\t\tthis.model = new CardModel();\n\t\t\tthis.cardCollection.add(this.model);\n\t\t} else {\n\t\t\tthis.currentCardIndex = this.cardCollection.length - 1;\n\t\t\tthis.model = this.cardCollection.at(this.currentCardIndex);\n\t\t}\n\n\t\tthis.listenTo(Radio.channel(\"flashCards\"), {\n\t\t\t\"card:create\": this.onCardCreate.bind(this),\n\t\t\t\"card:delete\": this.onCardDelete.bind(this),\n\t\t\t\"card:delete:accept\": this.onCardDeleteAccepted.bind(this),\n\t\t\t\"card:delete:reject\": this.onCardDeleteRejected.bind(this),\n\t\t\t\"card:delete:saved\": this.onCardDeleteSaved.bind(this),\n\t\t\t\"card:edit\": this.onCardEdit.bind(this),\n\t\t\t\"card:edit:accept\": this.onCardEditAccepted.bind(this),\n\t\t\t\"card:edit:flip\": this.onCardEditFlip.bind(this),\n\t\t\t\"card:edit:flipped\": this.onCardEditFlipped.bind(this),\n\t\t\t\"card:edit:reject\": this.onCardEditRejected.bind(this),\n\t\t\t\"card:edit:save\": this.onCardEditSave.bind(this),\n\t\t\t\"card:edit:saved\": this.onCardEditSaved.bind(this),\n\t\t\t\"card:error:dismiss\": this.onCardErrorDismissed.bind(this),\n\n\t\t\t\"deck:add\": this.onCardEditRejected.bind(this),\n\t\t\t\"deck:delete:saved\": this.onDeckDeleteSaved.bind(this),\n\t\t\t\"deck:size:updated\": this.onDeckSizeUpdated.bind(this)\n\t\t});\n\t},\n\n\tonRender: function onRender() {\n\t\tif (this.disabled) {\n\t\t\tthis.disable();\n\t\t\tthis.disabled = false;\n\t\t}\n\n\t\tthis.ui.flashCard.flip({\n\t\t\tspeed: 400,\n\t\t\ttrigger: \"manual\"\n\t\t}, function () {\n\t\t\tRadio.channel(\"flashCards\").trigger(\"card:edit:flipped\", \"front\");\n\t\t});\n\n\t\tif (_.isNil(this.model)) {\n\t\t\tthis.disableNavigation();\n\t\t} else if (this.model.isNew()) {\n\t\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"card:select\", this.model.cid);\n\t\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"card:edit\", this.model.cid, { preventDisable: true });\n\t\t} else {\n\t\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"card:select\", this.model.cid);\n\t\t\tthis.updateNavigationButtons();\n\t\t}\n\t},\n\n\tupdateNavigationButtons: function updateNavigationButtons() {\n\t\tif (this.currentCardIndex === 0) this.disableNavigationButton(this.ui.buttonNavigatePrevious);else this.enableNavigationButton(this.ui.buttonNavigatePrevious);\n\n\t\tif (this.currentCardIndex + 1 < this.cardCollection.length) this.enableNavigationButton(this.ui.buttonNavigateNext);else this.disableNavigationButton(this.ui.buttonNavigateNext);\n\t},\n\n\tdisableNavigationButton: function disableNavigationButton($button) {\n\t\t$button.addClass(\"button-disabled\");\n\t},\n\n\tenableNavigationButton: function enableNavigationButton($button) {\n\t\t$button.removeClass(\"button-disabled\");\n\t},\n\n\tonButtonNavigateNextClick: function onButtonNavigateNextClick(event) {\n\t\tevent.stopPropagation();\n\n\t\tthis.currentCardIndex++;\n\t\tthis.renderCurrentCard();\n\t},\n\n\tonButtonNavigatePreviousClick: function onButtonNavigatePreviousClick(event) {\n\t\tevent.stopPropagation();\n\n\t\tthis.currentCardIndex--;\n\t\tthis.renderCurrentCard();\n\t},\n\n\trenderCurrentCard: function renderCurrentCard() {\n\t\tif (this.cardCollection.length === 0) {\n\t\t\tthis.model = null;\n\t\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"card:select\", null);\n\t\t} else {\n\t\t\tthis.model = this.cardCollection.at(this.currentCardIndex);\n\t\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"card:select\", this.model.cid);\n\t\t}\n\n\t\tthis.render();\n\t},\n\n\tonTextBlur: function onTextBlur() {\n\t\tif (this.ui.textBack.val().length === 0) this.ui.textBack.val(DEFAULT_BACK_TEXT);\n\n\t\tif (this.ui.textFront.val().length === 0) this.ui.textFront.val(DEFAULT_FRONT_TEXT);\n\t},\n\n\tonCardTextChanged: function onCardTextChanged() {\n\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"card:edit\");\n\t},\n\n\tonTextFocus: function onTextFocus(event) {\n\t\tevent.target.select();\n\t},\n\n\tonTextKeyUp: function onTextKeyUp() {\n\t\tif (this.ui.textBack.val() !== this.model.get(\"back\") || this.ui.textFront.val() !== this.model.get(\"front\")) Radio.channel(\"flashCards\").trigger(\"card:edit\");\n\n\t\tif (this.isTextLengthValid()) this.hideTextLengthWarning();else this.showTextLengthWarning();\n\t},\n\n\tonCardCreate: function onCardCreate() {\n\t\tthis.currentCardIndex++;\n\t\tthis.cardCollection.add(new CardModel(), { at: this.currentCardIndex });\n\t\tthis.renderCurrentCard();\n\t},\n\n\tonCardDelete: function onCardDelete() {\n\t\tthis.disable();\n\t\tthis.disableNavigation();\n\t},\n\n\tonCardDeleteAccepted: function onCardDeleteAccepted() {\n\t\tvar _this = this;\n\n\t\tRadio.channel(\"flashCards\").trigger(\"card:delete:save\", this.model.cid);\n\n\t\tthis.model.destroy({\n\t\t\twait: true,\n\n\t\t\tsuccess: function success(model) {\n\t\t\t\t_this.cardCollection.remove(_this.model);\n\t\t\t\t_this.currentCardIndex--;\n\t\t\t\tRadio.channel(\"flashCards\").trigger(\"card:delete:saved\", null, _this.deckModel.cid, model.has(\"deletedDate\") ? model.get(\"deletedDate\") : moment().unix());\n\t\t\t},\n\n\t\t\terror: function error() {\n\t\t\t\tRadio.channel(\"flashCards\").trigger(\"card:error\", \"Error deleting card.\", { edit: false });\n\t\t\t}\n\t\t});\n\t},\n\n\tonCardDeleteRejected: function onCardDeleteRejected() {\n\t\tthis.enable();\n\t\tthis.enableNavigation();\n\t},\n\n\tonCardDeleteSaved: function onCardDeleteSaved() {\n\t\tthis.enable();\n\t\tthis.enableNavigation();\n\t\tthis.renderCurrentCard();\n\t},\n\n\tonCardEdit: function onCardEdit() {\n\t\tthis.disableNavigation();\n\t},\n\n\tdisableNavigation: function disableNavigation() {\n\t\tthis.disableNavigationButton(this.ui.buttonNavigateNext);\n\t\tthis.disableNavigationButton(this.ui.buttonNavigatePrevious);\n\t},\n\n\tenableNavigation: function enableNavigation() {\n\t\tthis.updateNavigationButtons();\n\t},\n\n\tonCardEditAccepted: function onCardEditAccepted() {\n\t\tvar _this2 = this;\n\n\t\tRadio.channel(\"flashCards\").trigger(\"card:edit:save\");\n\n\t\tif (this.validateTextLength()) {\n\t\t\tthis.model.once(\"invalid\", function () {\n\t\t\t\t_this2.showError(_this2.model.validationError);\n\t\t\t});\n\n\t\t\tvar attributes = {\n\t\t\t\tback: this.ui.textBack.val(),\n\t\t\t\tfront: this.ui.textFront.val(),\n\t\t\t\tindex: this.currentCardIndex\n\t\t\t};\n\n\t\t\tthis.model.save(attributes, {\n\t\t\t\twait: true,\n\n\t\t\t\tsuccess: function success(model) {\n\t\t\t\t\t_this2.model.unset(\"index\");\n\t\t\t\t\t_this2.cardCollection.add(_this2.model);\n\t\t\t\t\tRadio.channel(\"flashCards\").trigger(\"card:edit:saved\", _this2.model.cid, _this2.deckModel.cid, model.has(\"updated\") ? model.get(\"updated\") : model.get(\"created\"));\n\t\t\t\t},\n\n\t\t\t\terror: function error() {\n\t\t\t\t\tRadio.channel(\"flashCards\").trigger(\"card:error\", \"Error saving card.\", { edit: true });\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n\n\tvalidateTextLength: function validateTextLength() {\n\t\tvar valid = true;\n\t\tvar invalidTextLengthSide = void 0;\n\n\t\tif (!this.isTextLengthValid(\"back\")) invalidTextLengthSide = \"back\";\n\n\t\tif (!this.isTextLengthValid(\"front\")) {\n\t\t\tif (_.isNil(invalidTextLengthSide)) invalidTextLengthSide = \"front\";else invalidTextLengthSide = \"both\";\n\t\t}\n\n\t\tif (!_.isNil(invalidTextLengthSide)) {\n\t\t\tif (invalidTextLengthSide === \"both\") Radio.channel(\"flashCards\").trigger(\"card:error\", \"Text on both sides of card is too long\", { edit: true });else Radio.channel(\"flashCards\").trigger(\"card:error\", \"Text on \" + invalidTextLengthSide + \" of card is too long\", { edit: true });\n\n\t\t\tvalid = false;\n\t\t}\n\n\t\treturn valid;\n\t},\n\n\tonCardEditFlip: function onCardEditFlip() {\n\t\tthis.flipFlashCard();\n\t},\n\n\tonCardEditFlipped: function onCardEditFlipped(newFace) {\n\t\tif (newFace === \"back\") this.ui.displaySide.text(\"Back\");else this.ui.displaySide.text(\"Front\");\n\t},\n\n\tonCardEditRejected: function onCardEditRejected() {\n\t\tif (!_.isNil(this.model) && this.model.isNew()) {\n\t\t\tthis.cardCollection.remove(this.model);\n\t\t\tthis.currentCardIndex--;\n\t\t\tthis.renderCurrentCard();\n\t\t} else {\n\t\t\tthis.render();\n\t\t}\n\t},\n\n\tonCardEditSave: function onCardEditSave() {\n\t\tthis.disable();\n\t},\n\n\tonCardEditSaved: function onCardEditSaved() {\n\t\tthis.enable();\n\t\tthis.enableNavigation();\n\t},\n\n\tonCardErrorDismissed: function onCardErrorDismissed() {\n\t\tthis.enable();\n\t},\n\n\tonDeckDeleteSaved: function onDeckDeleteSaved() {\n\t\tthis.deckModel = null;\n\t\tthis.disable();\n\t},\n\n\tonDeckSizeUpdated: function onDeckSizeUpdated(deckModelCid, cardCount) {\n\t\tif (cardCount < CARD_COUNT_MAX) this.enable();else this.disable();\n\t},\n\n\tdisable: function disable() {\n\t\tthis.ui.flashCard.addClass(\"flash-card-disabled\");\n\t},\n\n\tenable: function enable() {\n\t\tthis.ui.flashCard.removeClass(\"flash-card-disabled\");\n\t},\n\n\tflipFlashCard: function flipFlashCard() {\n\t\tvar _this3 = this;\n\n\t\tvar newFace = void 0;\n\n\t\tif (this.cardFlipped) {\n\t\t\tthis.cardFlipped = false;\n\t\t\tnewFace = \"front\";\n\t\t} else {\n\t\t\tthis.cardFlipped = true;\n\t\t\tnewFace = \"back\";\n\t\t}\n\n\t\tthis.hideTextLengthWarning();\n\n\t\tthis.ui.flashCard.flip(this.cardFlipped, function () {\n\t\t\tif (!_this3.isTextLengthValid(newFace)) _this3.showTextLengthWarning();\n\n\t\t\tRadio.channel(\"flashCards\").trigger(\"card:edit:flipped\", newFace);\n\t\t});\n\t},\n\n\tisTextLengthValid: function isTextLengthValid(side) {\n\t\tvar valid = true;\n\t\tvar content = side === \"back\" ? this.ui.textBack.val() : this.ui.textFront.val();\n\n\t\tvar newlineCharacterCount = _.reduce(content, function (acc, character) {\n\t\t\tvar result = acc;\n\n\t\t\tif (character === \"\\n\") result++;\n\n\t\t\treturn result;\n\t\t}, 0);\n\n\t\tif (newlineCharacterCount > MAX_NEW_LINE_CHARACTERS || content.length > MAX_TEXT_LENGTH) valid = false;\n\n\t\treturn valid;\n\t},\n\n\thideTextLengthWarning: function hideTextLengthWarning() {\n\t\tthis.ui.warningContainerBottom.text(\"\");\n\t},\n\n\tshowTextLengthWarning: function showTextLengthWarning() {\n\t\tthis.ui.warningContainerBottom.text(\"Flashcard content is too long.\");\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(Radio.channel(\"flashCards\"));\n\t}\n});\n\nvar Controls = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-widget-controls\",\n\n\ttemplate: require(\"../../templates/flashCards/cardWidget.nunj\").controls,\n\n\tui: {\n\t\tbuttonAccept: \".button-accept\",\n\t\tbuttonCreate: \".button-create\",\n\t\tbuttonDelete: \".button-delete\",\n\t\tbuttonFlip: \".button-flip\",\n\t\tbuttonReject: \".button-reject\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonAccept\": \"onButtonAcceptClick\",\n\t\t\"click @ui.buttonCreate\": \"onButtonCreateClick\",\n\t\t\"click @ui.buttonDelete\": \"onButtonDeleteClick\",\n\t\t\"click @ui.buttonFlip\": \"onButtonFlipClick\",\n\t\t\"click @ui.buttonReject\": \"onButtonRejectClick\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.disabled = options.disabled;\n\t\tthis.edit = options.edit;\n\n\t\tthis.listenTo(Radio.channel(\"flashCards\"), {\n\t\t\t\"card:create\": this.onCardCreate.bind(this),\n\t\t\t\"card:edit\": this.onCardEdit.bind(this),\n\t\t\t\"card:edit:reject\": this.showCardControls.bind(this),\n\n\t\t\t\"deck:add\": this.showCardControls.bind(this),\n\t\t\t\"deck:delete:saved\": this.onDeckDeleteSaved.bind(this),\n\t\t\t\"deck:select\": this.onDeckSelected.bind(this),\n\t\t\t\"deck:size:updated\": this.onDeckSizeUpdated.bind(this)\n\t\t});\n\t},\n\n\tonBeforeAttach: function onBeforeAttach() {\n\t\tif (this.disabled) this.disable();\n\t},\n\n\tonRender: function onRender() {\n\t\t_.each([{\n\t\t\ttargetEl: this.ui.buttonAccept.get(0),\n\t\t\tcontent: \"Save the flashcard\"\n\t\t}, {\n\t\t\ttargetEl: this.ui.buttonCreate.get(0),\n\t\t\tcontent: \"Add a flashcard\"\n\t\t}, {\n\t\t\ttargetEl: this.ui.buttonDelete.get(0),\n\t\t\tcontent: \"Delete the flashcard\"\n\t\t}, {\n\t\t\ttargetEl: this.ui.buttonFlip.get(0),\n\t\t\tcontent: \"Flip the flashcard\"\n\t\t}, {\n\t\t\ttargetEl: this.ui.buttonReject.get(0),\n\t\t\tcontent: \"Cancel\"\n\t\t}], function (spec) {\n\t\t\treturn tippy(spec.targetEl, _.extend(_.omit(spec, [\"targetEl\"]), {\n\t\t\t\ttheme: \"black\",\n\t\t\t\tplacement: \"bottom\"\n\t\t\t}));\n\t\t});\n\n\t\tif (this.edit) {\n\t\t\tthis.showEditControls();\n\t\t\tdelete this.edit;\n\t\t}\n\t},\n\n\tonCardCreate: function onCardCreate() {\n\t\tthis.showEditControls();\n\t},\n\n\tonCardEdit: function onCardEdit() {\n\t\tthis.showEditControls();\n\t},\n\n\tshowCardControls: function showCardControls() {\n\t\tthis.ui.buttonAccept.addClass(\"hide\");\n\t\tthis.ui.buttonReject.addClass(\"hide\");\n\n\t\tthis.ui.buttonCreate.removeClass(\"hide\");\n\t\tthis.ui.buttonDelete.removeClass(\"hide\");\n\t},\n\n\tshowEditControls: function showEditControls() {\n\t\tthis.ui.buttonCreate.addClass(\"hide\");\n\t\tthis.ui.buttonDelete.addClass(\"hide\");\n\n\t\tthis.ui.buttonAccept.removeClass(\"hide\");\n\t\tthis.ui.buttonReject.removeClass(\"hide\");\n\t},\n\n\tonDeckDeleteSaved: function onDeckDeleteSaved() {\n\t\tthis.disable();\n\t},\n\n\tonDeckSelected: function onDeckSelected(deckModelCid) {\n\t\tif (deckModelCid === null) this.disable();else this.enable();\n\t},\n\n\tonDeckSizeUpdated: function onDeckSizeUpdated(deckModelCid, cardCount) {\n\t\tif (cardCount < CARD_COUNT_MAX) this.enable();else this.disable();\n\n\t\tif (cardCount === 0) {\n\t\t\tthis.showCardControls();\n\t\t\tthis.ui.buttonDelete.addClass(\"button-disabled\");\n\t\t} else {\n\t\t\tthis.ui.buttonDelete.removeClass(\"button-disabled\");\n\t\t}\n\t},\n\n\tonButtonAcceptClick: function onButtonAcceptClick() {\n\t\tRadio.channel(\"flashCards\").trigger(\"card:edit:accept\");\n\t},\n\n\tonButtonCreateClick: function onButtonCreateClick() {\n\t\tRadio.channel(\"flashCards\").trigger(\"card:create\");\n\t},\n\n\tonButtonDeleteClick: function onButtonDeleteClick() {\n\t\tRadio.channel(\"flashCards\").trigger(\"card:delete\");\n\t},\n\n\tonButtonFlipClick: function onButtonFlipClick() {\n\t\tRadio.channel(\"flashCards\").trigger(\"card:edit:flip\");\n\t},\n\n\tonButtonRejectClick: function onButtonRejectClick() {\n\t\tRadio.channel(\"flashCards\").trigger(\"card:edit:reject\");\n\t},\n\n\tdisable: function disable() {\n\t\tthis.ui.buttonAccept.addClass(\"button-disabled\");\n\t\tthis.ui.buttonFlip.addClass(\"button-disabled\");\n\t\tthis.ui.buttonReject.addClass(\"button-disabled\");\n\t},\n\n\tenable: function enable() {\n\t\tthis.ui.buttonAccept.removeClass(\"button-disabled\");\n\t\tthis.ui.buttonFlip.removeClass(\"button-disabled\");\n\t\tthis.ui.buttonReject.removeClass(\"button-disabled\");\n\t}\n});\n\nvar DeleteConfirmation = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-widget-delete-confirmation\",\n\n\ttemplate: require(\"../../templates/flashCards/cardWidget.nunj\").deleteConfirmation,\n\n\tui: {\n\t\tbuttonAccept: \".button-accept\",\n\t\tbuttonReject: \".button-reject\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonAccept\": \"onButtonAcceptClick\",\n\t\t\"click @ui.buttonReject\": \"onButtonRejectClick\"\n\t},\n\n\tonRender: function onRender() {\n\t\t_.each([{\n\t\t\ttargetEl: this.ui.buttonAccept.get(0),\n\t\t\tcontent: \"Yes\"\n\t\t}, {\n\t\t\ttargetEl: this.ui.buttonReject.get(0),\n\t\t\tcontent: \"No\"\n\t\t}], function (spec) {\n\t\t\treturn tippy(spec.targetEl, _.extend(_.omit(spec, [\"targetEl\"]), {\n\t\t\t\ttheme: \"black\",\n\t\t\t\tplacement: \"bottom\"\n\t\t\t}));\n\t\t});\n\t},\n\n\tonButtonAcceptClick: function onButtonAcceptClick(event) {\n\t\tevent.stopPropagation();\n\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"card:delete:accept\");\n\t},\n\n\tonButtonRejectClick: function onButtonRejectClick(event) {\n\t\tevent.stopPropagation();\n\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"card:delete:reject\");\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\t_.each(this.tooltipViews, function (t) {\n\t\t\treturn t.destroy();\n\t\t});\n\t}\n});\n\nvar CardError = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-widget-error\",\n\n\ttemplate: require(\"../../templates/flashCards/cardWidget.nunj\").error,\n\n\tui: {\n\t\tbuttonDismiss: \".button-dismiss\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonDismiss\": \"onButtonDismissClick\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tmessage: this.message\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.message = options.message;\n\t\tthis.previousState = options.previousState;\n\t},\n\n\tonButtonDismissClick: function onButtonDismissClick() {\n\t\tRadio.channel(\"flashCards\").trigger(\"card:error:dismiss\", this.previousState);\n\t},\n\n\tonRender: function onRender() {\n\t\t_.each([{\n\t\t\ttargetEl: this.ui.buttonDismiss.get(0),\n\t\t\tcontent: \"Ok\"\n\t\t}], function (spec) {\n\t\t\treturn tippy(spec.targetEl, _.extend(_.omit(spec, [\"targetEl\"]), {\n\t\t\t\ttheme: \"black\",\n\t\t\t\tplacement: \"bottom\"\n\t\t\t}));\n\t\t});\n\t}\n});\n\nvar Status = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-widget-status\",\n\n\ttemplate: require(\"../../templates/flashCards/cardWidget.nunj\").status\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-widget-layout flash-card-widget-hidden\",\n\n\ttemplate: require(\"../../templates/flashCards/cardWidget.nunj\").layout,\n\n\tregions: {\n\t\tdeckSelector: \".deck-selector-region\",\n\t\tcardEditor: \".card-editor-region\",\n\t\tcontrol: \".control-region\",\n\t\tdeckTitle: \".deck-title-region\",\n\t\tstatus: \".status-region\"\n\t},\n\n\tui: {\n\t\tbody: \".flash-card-widget-layout-body\",\n\t\tbuttonClose: \".button-close\",\n\t\tdeckSelectorSlider: \".deck-selector-slider\",\n\t\tdeckTitleLabel: \".deck-title-label\",\n\t\theader: \".flash-card-widget-layout-header\",\n\t\tstatusRegion: \".status-region\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonClose\": \"onButtonCloseClick\",\n\t\t\"click @ui.deckTitleLabel\": \"onDeckTitleLabelClick\",\n\t\t\"mousedown @ui.header\": \"onMouseDown\",\n\t\t\"mouseup @ui.header\": \"onMouseUp\",\n\t\t\"transitionend @ui.deckSelectorSlider\": \"onDeckSelectorSliderTransitionEnd\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.listenTo(Radio.channel(\"flashCards\"), {\n\t\t\t\"card:delete\": this.showDeleteConfirmation.bind(this),\n\t\t\t\"card:delete:reject\": this.showControls.bind(this),\n\t\t\t\"card:delete:saved\": this.showControls.bind(this),\n\t\t\t\"card:edit:save\": this.onCardEditSave.bind(this),\n\t\t\t\"card:edit:saved\": this.onCardEditSaved.bind(this),\n\t\t\t\"card:error\": this.showError.bind(this),\n\t\t\t\"card:error:dismiss\": this.onCardErrorDismissed.bind(this),\n\n\t\t\t\"cards:edit\": this.onEditCards.bind(this),\n\n\t\t\t\"deck:delete:saved\": this.onDeckDeleteSaved.bind(this),\n\t\t\t\"deck:select\": this.onDeckSelected.bind(this)\n\t\t});\n\n\t\tBackbone.Radio.channel(\"flashCards\").reply(\"card:model:get\", this.getCardModel.bind(this));\n\t\tBackbone.Radio.channel(\"flashCards\").reply(\"card:model:index\", this.getCardModelIndex.bind(this));\n\t\tBackbone.Radio.channel(\"flashCards\").reply(\"deck:model:get\", this.getDeckModel.bind(this));\n\t},\n\n\tgetCardModel: function getCardModel(cardModelCid) {\n\t\treturn _.isNil(cardModelCid) ? null : this.cardCollection.get(cardModelCid);\n\t},\n\n\tgetCardModelIndex: function getCardModelIndex(cardModelCid) {\n\t\treturn _.isNil(cardModelCid) ? null : _.findIndex(this.cardCollection.models, function (m) {\n\t\t\treturn m.cid === cardModelCid;\n\t\t});\n\t},\n\n\tgetDeckModel: function getDeckModel(deckModelCid) {\n\t\treturn _.isNil(deckModelCid) ? null : this.deckCollection.get(deckModelCid);\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.$el.css({\n\t\t\tleft: this.left,\n\t\t\ttop: this.top\n\t\t});\n\n\t\tthis.$el.removeClass(\"flash-card-widget-hidden\");\n\n\t\tthis.fetchDeckCollection();\n\t},\n\n\tonButtonCloseClick: function onButtonCloseClick(event) {\n\t\tevent.stopPropagation();\n\t\teventBus.trigger(eventBus.Events.HideFlashCardWidget);\n\t},\n\n\tonDeckTitleLabelClick: function onDeckTitleLabelClick(event) {\n\t\tevent.stopPropagation();\n\t\tthis.openSlider();\n\t},\n\n\tonEditCards: function onEditCards() {\n\t\tthis.closeSlider();\n\t},\n\n\tcloseSlider: function closeSlider() {\n\t\tthis.ui.deckSelectorSlider.removeClass(\"deck-selector-slider-open\");\n\t},\n\n\topenSlider: function openSlider() {\n\t\tthis.ui.deckSelectorSlider.addClass(\"deck-selector-slider-open\");\n\t},\n\n\tonIFrameMouseMove: function onIFrameMouseMove(event) {\n\t\tif (this.iFrameMouseMove) this.iFrameMouseMove(event);\n\n\t\tvar iframe = $(\"#book-display\", $(document)).get(0);\n\t\tvar newEvent = document.createEvent(\"MouseEvents\");\n\t\tvar boundingClientRect = iframe.getBoundingClientRect();\n\n\t\tnewEvent.initMouseEvent(\"mousemove\", true, false, window, event.detail, event.screenX, event.screenY, event.clientX + boundingClientRect.left, event.clientY + boundingClientRect.top, event.ctrlKey, event.altKey, event.shiftKey, event.metaKey, event.button, null);\n\n\t\tiframe.dispatchEvent(newEvent);\n\t},\n\n\tbindMouseMoveToIFrame: function bindMouseMoveToIFrame() {\n\t\tvar iframe = $(\"#book-display\", $(document)).get(0);\n\n\t\tif (!iframe) return;\n\n\t\tthis.iFrameMouseMove = iframe.contentWindow.onmousemove;\n\t\tiframe.contentWindow.addEventListener(\"mousemove\", this.onIFrameMouseMove.bind(this));\n\t},\n\n\tunbindMouseMoveFromIFrame: function unbindMouseMoveFromIFrame() {\n\t\tvar iframe = $(\"#book-display\", $(document)).get(0);\n\n\t\tif (!iframe) return;\n\n\t\tiframe.contentWindow.removeEventListener(\"mousemove\", this.onIFrameMouseMove.bind(this));\n\n\t\tif (!this.iFrameMouseMove) return;\n\n\t\tiframe.contentWindow.addEventListener(\"mousemove\", this.iFrameMouseMove);\n\t},\n\n\tonMouseDown: function onMouseDown(event) {\n\t\tevent.stopPropagation();\n\n\t\tthis.ui.header.addClass(\"dragging\");\n\n\t\tthis.dragAnchor = {\n\t\t\tx: event.screenX,\n\t\t\ty: event.screenY\n\t\t};\n\n\t\t$(window).on(\"mousemove\", this.onMouseMove.bind(this));\n\t\tthis.bindMouseMoveToIFrame();\n\t\t$(\"iframe\", $(window)).on(\"mousemove\", this.onMouseMove.bind(this));\n\t},\n\n\tonMouseMove: function onMouseMove(event) {\n\t\tevent.stopPropagation();\n\n\t\tif (this.dragAnchor) {\n\t\t\tvar offset = {\n\t\t\t\tx: event.screenX - this.dragAnchor.x,\n\t\t\t\ty: event.screenY - this.dragAnchor.y\n\t\t\t};\n\n\t\t\tvar position = this.$el.offset();\n\n\t\t\tthis.$el.offset({\n\t\t\t\tleft: position.left + offset.x,\n\t\t\t\ttop: position.top + offset.y\n\t\t\t});\n\n\t\t\tthis.dragAnchor.x = event.screenX;\n\t\t\tthis.dragAnchor.y = event.screenY;\n\t\t}\n\t},\n\n\tonMouseUp: function onMouseUp(event) {\n\t\tevent.stopPropagation();\n\n\t\t$(window).off(\"onmousemove\");\n\t\t$(\"iframe\", $(window)).off(\"onmousemove\", this.onMouseMove.bind(this));\n\t\tthis.unbindMouseMoveFromIFrame();\n\n\t\tthis.ui.header.removeClass(\"dragging\");\n\n\t\tthis.dragAnchor = undefined;\n\t},\n\n\tonCardEditSave: function onCardEditSave() {\n\t\tthis.showStatus();\n\t},\n\n\tonCardEditSaved: function onCardEditSaved(cardModelCid) {\n\t\tvar cardModel = this.cardCollection.get(cardModelCid);\n\t\tvar flashCards = this.deckModel.get(\"flashCards\");\n\n\t\tif (!_.includes(flashCards, cardModel.get(\"_id\"))) {\n\t\t\tflashCards = _.map(this.cardCollection.models, function (flashCardModel) {\n\t\t\t\treturn flashCardModel.get(\"_id\");\n\t\t\t});\n\t\t\tthis.deckModel.set(\"flashCards\", flashCards);\n\t\t}\n\n\t\tthis.showControls();\n\t},\n\n\tonCardErrorDismissed: function onCardErrorDismissed(previousState) {\n\t\tthis.showControls({ edit: previousState.edit });\n\t},\n\n\tonDeckDeleteSaved: function onDeckDeleteSaved() {\n\t\tthis.deckModel = null;\n\t},\n\n\tonDeckSelected: function onDeckSelected(deckModelCid) {\n\t\tif (deckModelCid === null) {\n\t\t\tthis.deckModel = null;\n\t\t} else {\n\t\t\tthis.deckModel = this.deckCollection.get(deckModelCid);\n\t\t\tthis.loadCards(this.deckModel);\n\t\t}\n\t},\n\n\tloadCards: function loadCards(deckModel) {\n\t\tvar _this4 = this;\n\n\t\tvar collections = [new CardCollection([], { deck: deckModel.get(\"_id\") }).lazyFetch()];\n\n\t\tPromise.all(collections).spread(function (cardCollection) {\n\t\t\t_this4.stopListeningToCardCollection();\n\n\t\t\t_this4.cardCollection = cardCollection;\n\t\t\t_this4.listenTo(_this4.cardCollection, \"update\", _this4.onCardCollectionUpdated.bind(_this4, deckModel.cid));\n\n\t\t\t_this4.showCardEditor();\n\n\t\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"deck:size:updated\", deckModel.cid, _this4.cardCollection.length);\n\t\t}).catch(this.showCardLoadError.bind(this));\n\t},\n\n\tonCardCollectionUpdated: function onCardCollectionUpdated(deckModelCid) {\n\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"deck:size:updated\", deckModelCid, this.cardCollection.length);\n\t},\n\n\tshowCardLoadError: function showCardLoadError(error) {\n\t\tvar _this5 = this;\n\n\t\tif (!settings.debug || settings.reportErrors) raygun(\"send\", error);\n\n\t\tthis.errorModal = new SmallModal({\n\t\t\twarning: true,\n\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Error Fetching Flashcards\",\n\t\t\tbody: \"<br><p style='text-align:center'>An error occurred while fetching flashcards.</p>\",\n\t\t\thideButtons: [\"cancel\"]\n\t\t});\n\n\t\tthis.listenTo(this.errorModal, \"button:ok\", function () {\n\t\t\t_this5.stopListening(_this5.errorModal);\n\t\t\teventBus.trigger(eventBus.Events.HideFlashCardWidget);\n\t\t});\n\n\t\tthis.errorModal.show();\n\t},\n\n\tcreateDeckEditor: function createDeckEditor() {\n\t\tthis.showChildView(\"deckSelector\", new DeckEditor({\n\t\t\tcanPlay: false,\n\t\t\tdeckCollection: this.deckCollection,\n\t\t\tpreventDisableAddOnDeckAdd: true,\n\t\t\tshowEditButton: true\n\t\t}));\n\t},\n\n\tfetchDeckCollection: function fetchDeckCollection() {\n\t\tvar _this6 = this;\n\n\t\tthis.renderLoadingStatus();\n\n\t\tthis.deckCollection = new DeckCollection([], {\n\t\t\tpageSize: 100,\n\t\t\turl: settings.urlRoot + \"/api/1.0/flashCards\"\n\t\t});\n\n\t\tthis.listenToOnce(this.deckCollection, \"sync\", function () {\n\t\t\t_this6.renderPage();\n\n\t\t\t_this6.listenTo(_this6.deckCollection, {\n\t\t\t\tsync: _this6.onDeckCollectionSync.bind(_this6) // eslint-disable-line no-sync\n\t\t\t});\n\t\t});\n\n\t\tthis.deckCollection.getFirstBatch();\n\t},\n\n\tonDeckCollectionSync: function onDeckCollectionSync() {\n\t\tif (!_.isNil(this.deckModel) && !_.isNil(this.deckModel.id) && !_.isNil(this.deckCollection.get(this.deckModel.id))) Backbone.Radio.channel(\"flashCards\").trigger(\"deck:select\", this.deckCollection.get(this.deckModel.id).cid, true);else Backbone.Radio.channel(\"flashCards\").trigger(\"deck:select\", null);\n\t},\n\n\trenderLoadingStatus: function renderLoadingStatus() {\n\t\tthis.showChildView(\"status\", new StatusView({ type: \"loading\" }));\n\t},\n\n\trenderPage: function renderPage() {\n\t\tthis.ui.statusRegion.addClass(\"hide\");\n\t\tthis.ui.body.removeClass(\"hide\");\n\t\tthis.ui.deckSelectorSlider.removeClass(\"hide\");\n\n\t\tthis.createDeckEditor();\n\t\tthis.showDeckTitle();\n\t\tthis.showControls({ disabled: true });\n\t},\n\n\tshowDeckTitle: function showDeckTitle() {\n\t\tthis.showChildView(\"deckTitle\", new DeckTitle());\n\t},\n\n\tshowCardEditor: function showCardEditor(options) {\n\t\tthis.showChildView(\"cardEditor\", new CardEditor({\n\t\t\tcardCollection: this.cardCollection,\n\t\t\tdeckCollection: this.deckCollection,\n\t\t\tdeckModel: this.deckModel,\n\t\t\tdisabled: options && options.disabled\n\t\t}));\n\t},\n\n\tshowControls: function showControls(options) {\n\t\tthis.controlsView = new Controls(options);\n\t\tthis.showChildView(\"control\", this.controlsView);\n\t},\n\n\tshowDeleteConfirmation: function showDeleteConfirmation() {\n\t\tthis.destroyControls();\n\t\tthis.showChildView(\"control\", new DeleteConfirmation({ model: this.model }));\n\t},\n\n\tshowError: function showError(message, previousState) {\n\t\tthis.destroyControls();\n\t\tthis.showChildView(\"control\", new CardError({\n\t\t\tmessage: message,\n\t\t\tpreviousState: previousState\n\t\t}));\n\t},\n\n\tshowStatus: function showStatus() {\n\t\tthis.destroyControls();\n\t\tthis.showChildView(\"control\", new Status());\n\t},\n\n\tdestroyControls: function destroyControls() {\n\t\tif (!_.isNil(this.controlsView)) {\n\t\t\tthis.controlsView.destroy();\n\t\t\tthis.controlsView = null;\n\t\t}\n\t},\n\n\tstopListeningToCardCollection: function stopListeningToCardCollection() {\n\t\tif (this.cardCollection) this.stopListening(this.cardCollection);\n\t},\n\n\tstopListeningToDeckCollection: function stopListeningToDeckCollection() {\n\t\tif (this.deckCollection) this.stopListening(this.deckCollection);\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(this.deckSelector);\n\t\tthis.stopListeningToCardCollection();\n\t\tthis.stopListeningToDeckCollection();\n\n\t\tif (this.deckCollection) this.stopListening(this.deckCollection);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNhcmRXaWRnZXQuanMiXSwibmFtZXMiOlsicmVxdWlyZSIsIiQiLCJfIiwiQmFja2JvbmUiLCJtb21lbnQiLCJQcm9taXNlIiwiUmFkaW8iLCJyYXlndW4iLCJldmVudEJ1cyIsInNldHRpbmdzIiwiQ2FyZENvbGxlY3Rpb24iLCJDYXJkTW9kZWwiLCJEZWNrQ29sbGVjdGlvbiIsIkRlY2tFZGl0b3IiLCJ0aXBweSIsImRlZmF1bHQiLCJTbWFsbE1vZGFsIiwiU3RhdHVzVmlldyIsIkNBUkRfQ09VTlRfTUFYIiwiREVGQVVMVF9CQUNLX1RFWFQiLCJERUZBVUxUX0ZST05UX1RFWFQiLCJNQVhfTkVXX0xJTkVfQ0hBUkFDVEVSUyIsIk1BWF9URVhUX0xFTkdUSCIsIkRlY2tUaXRsZSIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiZXh0ZW5kIiwiY2xhc3NOYW1lIiwidGVtcGxhdGUiLCJkZWNrVGl0bGUiLCJ0ZW1wbGF0ZUNvbnRleHQiLCJjYXJkQ291bnQiLCJjYXJkQ291bnRNYXgiLCJjYXJkTnVtYmVyIiwidGl0bGUiLCJkZWNrTW9kZWwiLCJnZXQiLCJ1bmRlZmluZWQiLCJpbml0aWFsaXplIiwibGlzdGVuVG8iLCJjaGFubmVsIiwib25DYXJkU2VsZWN0ZWQiLCJiaW5kIiwib25EZWNrRGVsZXRlU2F2ZWQiLCJvbkRlY2tTZWxlY3RlZCIsIm9uRGVja1NpemVVcGRhdGVkIiwiY2FyZE1vZGVsQ2lkIiwiaXNOaWwiLCJyZXF1ZXN0IiwicmVuZGVyIiwiZGVja01vZGVsQ2lkIiwib25CZWZvcmVEZXN0cm95Iiwic3RvcExpc3RlbmluZyIsIkNhcmRFZGl0b3IiLCJjYXJkRWRpdG9yIiwidWkiLCJidXR0b25OYXZpZ2F0ZU5leHQiLCJidXR0b25OYXZpZ2F0ZVByZXZpb3VzIiwiZGlzcGxheVNpZGUiLCJmbGFzaENhcmQiLCJ0ZXh0QmFjayIsInRleHRGcm9udCIsIndhcm5pbmdDb250YWluZXJCb3R0b20iLCJldmVudHMiLCJtb2RlbCIsImJhY2siLCJsZW5ndGgiLCJmcm9udCIsImNhcmRNb2RlbEV4aXN0cyIsIm9wdGlvbnMiLCJjYXJkQ29sbGVjdGlvbiIsImRlY2tDb2xsZWN0aW9uIiwiZGlzYWJsZWQiLCJjdXJyZW50Q2FyZEluZGV4IiwiYWRkIiwiYXQiLCJvbkNhcmRDcmVhdGUiLCJvbkNhcmREZWxldGUiLCJvbkNhcmREZWxldGVBY2NlcHRlZCIsIm9uQ2FyZERlbGV0ZVJlamVjdGVkIiwib25DYXJkRGVsZXRlU2F2ZWQiLCJvbkNhcmRFZGl0Iiwib25DYXJkRWRpdEFjY2VwdGVkIiwib25DYXJkRWRpdEZsaXAiLCJvbkNhcmRFZGl0RmxpcHBlZCIsIm9uQ2FyZEVkaXRSZWplY3RlZCIsIm9uQ2FyZEVkaXRTYXZlIiwib25DYXJkRWRpdFNhdmVkIiwib25DYXJkRXJyb3JEaXNtaXNzZWQiLCJvblJlbmRlciIsImRpc2FibGUiLCJmbGlwIiwic3BlZWQiLCJ0cmlnZ2VyIiwiZGlzYWJsZU5hdmlnYXRpb24iLCJpc05ldyIsImNpZCIsInByZXZlbnREaXNhYmxlIiwidXBkYXRlTmF2aWdhdGlvbkJ1dHRvbnMiLCJkaXNhYmxlTmF2aWdhdGlvbkJ1dHRvbiIsImVuYWJsZU5hdmlnYXRpb25CdXR0b24iLCIkYnV0dG9uIiwiYWRkQ2xhc3MiLCJyZW1vdmVDbGFzcyIsIm9uQnV0dG9uTmF2aWdhdGVOZXh0Q2xpY2siLCJldmVudCIsInN0b3BQcm9wYWdhdGlvbiIsInJlbmRlckN1cnJlbnRDYXJkIiwib25CdXR0b25OYXZpZ2F0ZVByZXZpb3VzQ2xpY2siLCJvblRleHRCbHVyIiwidmFsIiwib25DYXJkVGV4dENoYW5nZWQiLCJvblRleHRGb2N1cyIsInRhcmdldCIsInNlbGVjdCIsIm9uVGV4dEtleVVwIiwiaXNUZXh0TGVuZ3RoVmFsaWQiLCJoaWRlVGV4dExlbmd0aFdhcm5pbmciLCJzaG93VGV4dExlbmd0aFdhcm5pbmciLCJkZXN0cm95Iiwid2FpdCIsInN1Y2Nlc3MiLCJyZW1vdmUiLCJoYXMiLCJ1bml4IiwiZXJyb3IiLCJlZGl0IiwiZW5hYmxlIiwiZW5hYmxlTmF2aWdhdGlvbiIsInZhbGlkYXRlVGV4dExlbmd0aCIsIm9uY2UiLCJzaG93RXJyb3IiLCJ2YWxpZGF0aW9uRXJyb3IiLCJhdHRyaWJ1dGVzIiwiaW5kZXgiLCJzYXZlIiwidW5zZXQiLCJ2YWxpZCIsImludmFsaWRUZXh0TGVuZ3RoU2lkZSIsImZsaXBGbGFzaENhcmQiLCJuZXdGYWNlIiwidGV4dCIsImNhcmRGbGlwcGVkIiwic2lkZSIsImNvbnRlbnQiLCJuZXdsaW5lQ2hhcmFjdGVyQ291bnQiLCJyZWR1Y2UiLCJhY2MiLCJjaGFyYWN0ZXIiLCJyZXN1bHQiLCJDb250cm9scyIsImNvbnRyb2xzIiwiYnV0dG9uQWNjZXB0IiwiYnV0dG9uQ3JlYXRlIiwiYnV0dG9uRGVsZXRlIiwiYnV0dG9uRmxpcCIsImJ1dHRvblJlamVjdCIsInNob3dDYXJkQ29udHJvbHMiLCJvbkJlZm9yZUF0dGFjaCIsImVhY2giLCJ0YXJnZXRFbCIsInNwZWMiLCJvbWl0IiwidGhlbWUiLCJwbGFjZW1lbnQiLCJzaG93RWRpdENvbnRyb2xzIiwib25CdXR0b25BY2NlcHRDbGljayIsIm9uQnV0dG9uQ3JlYXRlQ2xpY2siLCJvbkJ1dHRvbkRlbGV0ZUNsaWNrIiwib25CdXR0b25GbGlwQ2xpY2siLCJvbkJ1dHRvblJlamVjdENsaWNrIiwiRGVsZXRlQ29uZmlybWF0aW9uIiwiZGVsZXRlQ29uZmlybWF0aW9uIiwidG9vbHRpcFZpZXdzIiwidCIsIkNhcmRFcnJvciIsImJ1dHRvbkRpc21pc3MiLCJtZXNzYWdlIiwicHJldmlvdXNTdGF0ZSIsIm9uQnV0dG9uRGlzbWlzc0NsaWNrIiwiU3RhdHVzIiwic3RhdHVzIiwibW9kdWxlIiwiZXhwb3J0cyIsImxheW91dCIsInJlZ2lvbnMiLCJkZWNrU2VsZWN0b3IiLCJjb250cm9sIiwiYm9keSIsImJ1dHRvbkNsb3NlIiwiZGVja1NlbGVjdG9yU2xpZGVyIiwiZGVja1RpdGxlTGFiZWwiLCJoZWFkZXIiLCJzdGF0dXNSZWdpb24iLCJzaG93RGVsZXRlQ29uZmlybWF0aW9uIiwic2hvd0NvbnRyb2xzIiwib25FZGl0Q2FyZHMiLCJyZXBseSIsImdldENhcmRNb2RlbCIsImdldENhcmRNb2RlbEluZGV4IiwiZ2V0RGVja01vZGVsIiwiZmluZEluZGV4IiwibW9kZWxzIiwibSIsIiRlbCIsImNzcyIsImxlZnQiLCJ0b3AiLCJmZXRjaERlY2tDb2xsZWN0aW9uIiwib25CdXR0b25DbG9zZUNsaWNrIiwiRXZlbnRzIiwiSGlkZUZsYXNoQ2FyZFdpZGdldCIsIm9uRGVja1RpdGxlTGFiZWxDbGljayIsIm9wZW5TbGlkZXIiLCJjbG9zZVNsaWRlciIsIm9uSUZyYW1lTW91c2VNb3ZlIiwiaUZyYW1lTW91c2VNb3ZlIiwiaWZyYW1lIiwiZG9jdW1lbnQiLCJuZXdFdmVudCIsImNyZWF0ZUV2ZW50IiwiYm91bmRpbmdDbGllbnRSZWN0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiaW5pdE1vdXNlRXZlbnQiLCJ3aW5kb3ciLCJkZXRhaWwiLCJzY3JlZW5YIiwic2NyZWVuWSIsImNsaWVudFgiLCJjbGllbnRZIiwiY3RybEtleSIsImFsdEtleSIsInNoaWZ0S2V5IiwibWV0YUtleSIsImJ1dHRvbiIsImRpc3BhdGNoRXZlbnQiLCJiaW5kTW91c2VNb3ZlVG9JRnJhbWUiLCJjb250ZW50V2luZG93Iiwib25tb3VzZW1vdmUiLCJhZGRFdmVudExpc3RlbmVyIiwidW5iaW5kTW91c2VNb3ZlRnJvbUlGcmFtZSIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJvbk1vdXNlRG93biIsImRyYWdBbmNob3IiLCJ4IiwieSIsIm9uIiwib25Nb3VzZU1vdmUiLCJvZmZzZXQiLCJwb3NpdGlvbiIsIm9uTW91c2VVcCIsIm9mZiIsInNob3dTdGF0dXMiLCJjYXJkTW9kZWwiLCJmbGFzaENhcmRzIiwiaW5jbHVkZXMiLCJtYXAiLCJmbGFzaENhcmRNb2RlbCIsInNldCIsImxvYWRDYXJkcyIsImNvbGxlY3Rpb25zIiwiZGVjayIsImxhenlGZXRjaCIsImFsbCIsInNwcmVhZCIsInN0b3BMaXN0ZW5pbmdUb0NhcmRDb2xsZWN0aW9uIiwib25DYXJkQ29sbGVjdGlvblVwZGF0ZWQiLCJzaG93Q2FyZEVkaXRvciIsImNhdGNoIiwic2hvd0NhcmRMb2FkRXJyb3IiLCJkZWJ1ZyIsInJlcG9ydEVycm9ycyIsImVycm9yTW9kYWwiLCJ3YXJuaW5nIiwiaGlkZUJ1dHRvbnMiLCJzaG93IiwiY3JlYXRlRGVja0VkaXRvciIsInNob3dDaGlsZFZpZXciLCJjYW5QbGF5IiwicHJldmVudERpc2FibGVBZGRPbkRlY2tBZGQiLCJzaG93RWRpdEJ1dHRvbiIsInJlbmRlckxvYWRpbmdTdGF0dXMiLCJwYWdlU2l6ZSIsInVybCIsInVybFJvb3QiLCJsaXN0ZW5Ub09uY2UiLCJyZW5kZXJQYWdlIiwic3luYyIsIm9uRGVja0NvbGxlY3Rpb25TeW5jIiwiZ2V0Rmlyc3RCYXRjaCIsImlkIiwidHlwZSIsInNob3dEZWNrVGl0bGUiLCJjb250cm9sc1ZpZXciLCJkZXN0cm95Q29udHJvbHMiLCJzdG9wTGlzdGVuaW5nVG9EZWNrQ29sbGVjdGlvbiJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0FBLFFBQVEsYUFBUjtBQUNBLElBQU1DLElBQUlELFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUUsSUFBSUYsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNRyxXQUFXSCxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNSSxTQUFTSixRQUFRLFFBQVIsQ0FBZjtBQUNBLElBQU1LLFVBQVVMLFFBQVEsVUFBUixDQUFoQjtBQUNBLElBQU1NLFFBQVFILFNBQVNHLEtBQXZCO0FBQ0EsSUFBTUMsU0FBU1AsUUFBUSxRQUFSLENBQWY7O0FBRUEsSUFBTVEsV0FBV1IsUUFBUSwyQ0FBUixDQUFqQjs7QUFFQSxJQUFNUyxXQUFXVCxRQUFRLGNBQVIsQ0FBakI7O0FBRUEsSUFBTVUsaUJBQWlCVixRQUFRLDZDQUFSLENBQXZCO0FBQ0EsSUFBTVcsWUFBWVgsUUFBUSxtQ0FBUixDQUFsQjtBQUNBLElBQU1ZLGlCQUFpQlosUUFBUSw2Q0FBUixDQUF2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QkFBUzhDLE9BQVQsRUFBa0JDLGFBQWxCLEVBQWlDO0FBQzNDLE9BQUtvSCxlQUFMO0FBQ0EsT0FBS2pCLGFBQUwsQ0FBbUIsU0FBbkIsRUFBOEIsSUFBSXRHLFNBQUosQ0FBYztBQUMzQ0UsWUFBU0EsT0FEa0M7QUFFM0NDO0FBRjJDLEdBQWQsQ0FBOUI7QUFJQSxFQTNWK0M7O0FBNlZoRDBFLGFBQVksc0JBQVc7QUFDdEIsT0FBSzBDLGVBQUw7QUFDQSxPQUFLakIsYUFBTCxDQUFtQixTQUFuQixFQUE4QixJQUFJakcsTUFBSixFQUE5QjtBQUNBLEVBaFcrQzs7QUFrV2hEa0gsa0JBQWlCLDJCQUFXO0FBQzNCLE1BQUksQ0FBQ3BTLEVBQUU2QyxLQUFGLENBQVEsS0FBS3NQLFlBQWIsQ0FBTCxFQUFpQztBQUNoQyxRQUFLQSxZQUFMLENBQWtCOUssT0FBbEI7QUFDQSxRQUFLOEssWUFBTCxHQUFvQixJQUFwQjtBQUNBO0FBQ0QsRUF2VytDOztBQXlXaEQ1QixnQ0FBK0IseUNBQVc7QUFDekMsTUFBSSxLQUFLbk0sY0FBVCxFQUNDLEtBQUtsQixhQUFMLENBQW1CLEtBQUtrQixjQUF4QjtBQUNELEVBNVcrQzs7QUE4V2hEaU8sZ0NBQStCLHlDQUFXO0FBQ3pDLE1BQUksS0FBS2hPLGNBQVQsRUFDQyxLQUFLbkIsYUFBTCxDQUFtQixLQUFLbUIsY0FBeEI7QUFDRCxFQWpYK0M7O0FBbVhoRHBCLGtCQUFpQiwyQkFBVztBQUMzQixPQUFLQyxhQUFMLENBQW1CLEtBQUtzSSxZQUF4QjtBQUNBLE9BQUsrRSw2QkFBTDtBQUNBLE9BQUs4Qiw2QkFBTDs7QUFFQSxNQUFJLEtBQUtoTyxjQUFULEVBQ0MsS0FBS25CLGFBQUwsQ0FBbUIsS0FBS21CLGNBQXhCO0FBQ0Q7QUExWCtDLENBQWhDLENBQWpCIiwiZmlsZSI6ImNhcmRXaWRnZXQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbnJlcXVpcmUoXCJqcXVlcnkuZmxpcFwiKTtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IG1vbWVudCA9IHJlcXVpcmUoXCJtb21lbnRcIik7XG5jb25zdCBQcm9taXNlID0gcmVxdWlyZShcImJsdWViaXJkXCIpO1xuY29uc3QgUmFkaW8gPSBCYWNrYm9uZS5SYWRpbztcbmNvbnN0IHJheWd1biA9IHJlcXVpcmUoXCJyYXlndW5cIik7XG5cbmNvbnN0IGV2ZW50QnVzID0gcmVxdWlyZShcIi4uLy4uLy4uL2VkdWNhdG9ycy92aWV3cy9jb25zb2xlL2V2ZW50QnVzXCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IENhcmRDb2xsZWN0aW9uID0gcmVxdWlyZShcIi4uLy4uL2NvbGxlY3Rpb25zL2ZsYXNoQ2FyZHMvY2FyZENvbGxlY3Rpb25cIik7XG5jb25zdCBDYXJkTW9kZWwgPSByZXF1aXJlKFwiLi4vLi4vbW9kZWxzL2ZsYXNoQ2FyZHMvY2FyZE1vZGVsXCIpO1xuY29uc3QgRGVja0NvbGxlY3Rpb24gPSByZXF1aXJlKFwiLi4vLi4vY29sbGVjdGlvbnMvZmxhc2hDYXJkcy9kZWNrQ29sbGVjdGlvblwiKTtcbmNvbnN0IERlY2tFZGl0b3IgPSByZXF1aXJlKFwiLi9kZWNrRWRpdG9yXCIpO1xuY29uc3QgdGlwcHkgPSByZXF1aXJlKFwidGlwcHkuanNcIikuZGVmYXVsdDtcbmNvbnN0IFNtYWxsTW9kYWwgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL3NtYWxsTW9kYWxcIik7XG5jb25zdCBTdGF0dXNWaWV3ID0gcmVxdWlyZShcIi4uLy4uLy4uL2xpYi9zdGF0dXNWaWV3XCIpO1xuXG5jb25zdCBDQVJEX0NPVU5UX01BWCA9IDIwMDtcbmNvbnN0IERFRkFVTFRfQkFDS19URVhUID0gXCJFbnRlciB0ZXh0IGZvciB0aGUgYmFjayBvZiB0aGUgY2FyZC4uLlwiO1xuY29uc3QgREVGQVVMVF9GUk9OVF9URVhUID0gXCJFbnRlciB0ZXh0IGZvciB0aGUgZnJvbnQgb2YgdGhlIGNhcmQuLi5cIjtcbmNvbnN0IE1BWF9ORVdfTElORV9DSEFSQUNURVJTID0gMTU7XG5jb25zdCBNQVhfVEVYVF9MRU5HVEggPSA1MDA7XG5cbmNvbnN0IERlY2tUaXRsZSA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZmxhc2gtY2FyZC13aWRnZXQtZGVjay10aXRsZVwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2ZsYXNoQ2FyZHMvY2FyZFdpZGdldC5udW5qXCIpLmRlY2tUaXRsZSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRjYXJkQ291bnQ6IHRoaXMuY2FyZENvdW50LFxuXHRcdFx0Y2FyZENvdW50TWF4OiBDQVJEX0NPVU5UX01BWCxcblx0XHRcdGNhcmROdW1iZXI6IHRoaXMuY2FyZE51bWJlcixcblx0XHRcdHRpdGxlOiB0aGlzLmRlY2tNb2RlbCA/IHRoaXMuZGVja01vZGVsLmdldChcInRpdGxlXCIpIDogdW5kZWZpbmVkLFxuXHRcdH07XG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5saXN0ZW5UbyhSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKSwge1xuXHRcdFx0XCJjYXJkOnNlbGVjdFwiOiB0aGlzLm9uQ2FyZFNlbGVjdGVkLmJpbmQodGhpcyksXG5cblx0XHRcdFwiZGVjazpkZWxldGU6c2F2ZWRcIjogdGhpcy5vbkRlY2tEZWxldGVTYXZlZC5iaW5kKHRoaXMpLFxuXHRcdFx0XCJkZWNrOnNlbGVjdFwiOiB0aGlzLm9uRGVja1NlbGVjdGVkLmJpbmQodGhpcyksXG5cdFx0XHRcImRlY2s6c2l6ZTp1cGRhdGVkXCI6IHRoaXMub25EZWNrU2l6ZVVwZGF0ZWQuYmluZCh0aGlzKSxcblx0XHR9KTtcblx0fSxcblxuXHRvbkNhcmRTZWxlY3RlZDogZnVuY3Rpb24oY2FyZE1vZGVsQ2lkKSB7XG5cdFx0dGhpcy5jYXJkTnVtYmVyID0gXy5pc05pbChjYXJkTW9kZWxDaWQpID8gbnVsbCA6IEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnJlcXVlc3QoXCJjYXJkOm1vZGVsOmluZGV4XCIsIGNhcmRNb2RlbENpZCk7XG5cblx0XHRpZiAoIV8uaXNOaWwodGhpcy5jYXJkTnVtYmVyKSlcblx0XHRcdHRoaXMuY2FyZE51bWJlcisrO1xuXG5cdFx0dGhpcy5yZW5kZXIoKTtcblx0fSxcblxuXHRvbkRlY2tEZWxldGVTYXZlZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5kZWNrTW9kZWwgPSBudWxsO1xuXHRcdHRoaXMucmVuZGVyKCk7XG5cdH0sXG5cblx0b25EZWNrU2VsZWN0ZWQ6IGZ1bmN0aW9uKGRlY2tNb2RlbENpZCkge1xuXHRcdHRoaXMuZGVja01vZGVsID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikucmVxdWVzdChcImRlY2s6bW9kZWw6Z2V0XCIsIGRlY2tNb2RlbENpZCk7XG5cdFx0dGhpcy5yZW5kZXIoKTtcblx0fSxcblxuXHRvbkRlY2tTaXplVXBkYXRlZDogZnVuY3Rpb24oZGVja01vZGVsQ2lkLCBjYXJkQ291bnQpIHtcblx0XHR0aGlzLmNhcmRDb3VudCA9IGNhcmRDb3VudDtcblxuXHRcdGlmIChjYXJkQ291bnQgPT09IDApXG5cdFx0XHR0aGlzLmNhcmROdW1iZXIgPSBudWxsO1xuXG5cdFx0dGhpcy5yZW5kZXIoKTtcblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc3RvcExpc3RlbmluZyhSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKSk7XG5cdH0sXG59KTtcblxuY29uc3QgQ2FyZEVkaXRvciA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZmxhc2gtY2FyZC13aWRnZXQtY2FyZC1lZGl0b3JcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9mbGFzaENhcmRzL2NhcmRXaWRnZXQubnVualwiKS5jYXJkRWRpdG9yLFxuXG5cdHVpOiB7XG5cdFx0YnV0dG9uTmF2aWdhdGVOZXh0OiBcIi5mbGFzaC1jYXJkLWVkaXRvci1uYXZpZ2F0b3IgPiAjYnV0dG9uLW5leHRcIixcblx0XHRidXR0b25OYXZpZ2F0ZVByZXZpb3VzOiBcIi5mbGFzaC1jYXJkLWVkaXRvci1uYXZpZ2F0b3IgPiAjYnV0dG9uLXByZXZpb3VzXCIsXG5cdFx0ZGlzcGxheVNpZGU6IFwiLmZsYXNoLWNhcmQtd2FybmluZy1jb250YWluZXIjdG9wXCIsXG5cdFx0Zmxhc2hDYXJkOiBcIi5mbGFzaC1jYXJkXCIsXG5cdFx0dGV4dEJhY2s6IFwiI3RleHQtYmFja1wiLFxuXHRcdHRleHRGcm9udDogXCIjdGV4dC1mcm9udFwiLFxuXHRcdHdhcm5pbmdDb250YWluZXJCb3R0b206IFwiLmZsYXNoLWNhcmQtd2FybmluZy1jb250YWluZXIjYm90dG9tXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJibHVyIEB1aS50ZXh0QmFja1wiOiBcIm9uVGV4dEJsdXJcIixcblx0XHRcImJsdXIgQHVpLnRleHRGcm9udFwiOiBcIm9uVGV4dEJsdXJcIixcblx0XHRcImNoYW5nZSBAdWkudGV4dEJhY2tcIjogXCJvbkNhcmRUZXh0Q2hhbmdlZFwiLFxuXHRcdFwiY2hhbmdlIEB1aS50ZXh0RnJvbnRcIjogXCJvbkNhcmRUZXh0Q2hhbmdlZFwiLFxuXHRcdFwiY2xpY2sgQHVpLmJ1dHRvbk5hdmlnYXRlTmV4dFwiOiBcIm9uQnV0dG9uTmF2aWdhdGVOZXh0Q2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5idXR0b25OYXZpZ2F0ZVByZXZpb3VzXCI6IFwib25CdXR0b25OYXZpZ2F0ZVByZXZpb3VzQ2xpY2tcIixcblx0XHRcImZvY3VzIEB1aS50ZXh0QmFja1wiOiBcIm9uVGV4dEZvY3VzXCIsXG5cdFx0XCJmb2N1cyBAdWkudGV4dEZyb250XCI6IFwib25UZXh0Rm9jdXNcIixcblx0XHRcImtleXVwIEB1aS50ZXh0QmFja1wiOiBcIm9uVGV4dEtleVVwXCIsXG5cdFx0XCJrZXl1cCBAdWkudGV4dEZyb250XCI6IFwib25UZXh0S2V5VXBcIixcblx0fSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbDtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRiYWNrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIF8uaXNOaWwobW9kZWwpID8gXCJcIiA6IG1vZGVsLmdldChcImJhY2tcIikubGVuZ3RoID09PSAwID8gREVGQVVMVF9CQUNLX1RFWFQgOiBtb2RlbC5nZXQoXCJiYWNrXCIpO1xuXHRcdFx0fSxcblxuXHRcdFx0ZnJvbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gXy5pc05pbChtb2RlbCkgPyBcIlwiIDogbW9kZWwuZ2V0KFwiZnJvbnRcIikubGVuZ3RoID09PSAwID8gREVGQVVMVF9GUk9OVF9URVhUIDogbW9kZWwuZ2V0KFwiZnJvbnRcIik7XG5cdFx0XHR9LFxuXG5cdFx0XHRjYXJkTW9kZWxFeGlzdHM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gIV8uaXNOaWwobW9kZWwpO1xuXHRcdFx0fSxcblx0XHR9O1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLmNhcmRDb2xsZWN0aW9uID0gb3B0aW9ucy5jYXJkQ29sbGVjdGlvbjtcblx0XHR0aGlzLmRlY2tDb2xsZWN0aW9uID0gb3B0aW9ucy5kZWNrQ29sbGVjdGlvbjtcblx0XHR0aGlzLmRlY2tNb2RlbCA9IG9wdGlvbnMuZGVja01vZGVsO1xuXHRcdHRoaXMuZGlzYWJsZWQgPSBvcHRpb25zLmRpc2FibGVkO1xuXG5cdFx0aWYgKHRoaXMuY2FyZENvbGxlY3Rpb24ubGVuZ3RoID09PSAwKSB7XG5cdFx0XHR0aGlzLmN1cnJlbnRDYXJkSW5kZXggPSAwO1xuXHRcdFx0dGhpcy5tb2RlbCA9IG5ldyBDYXJkTW9kZWwoKTtcblx0XHRcdHRoaXMuY2FyZENvbGxlY3Rpb24uYWRkKHRoaXMubW9kZWwpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMuY3VycmVudENhcmRJbmRleCA9IHRoaXMuY2FyZENvbGxlY3Rpb24ubGVuZ3RoIC0gMTtcblx0XHRcdHRoaXMubW9kZWwgPSB0aGlzLmNhcmRDb2xsZWN0aW9uLmF0KHRoaXMuY3VycmVudENhcmRJbmRleCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5saXN0ZW5UbyhSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKSwge1xuXHRcdFx0XCJjYXJkOmNyZWF0ZVwiOiB0aGlzLm9uQ2FyZENyZWF0ZS5iaW5kKHRoaXMpLFxuXHRcdFx0XCJjYXJkOmRlbGV0ZVwiOiB0aGlzLm9uQ2FyZERlbGV0ZS5iaW5kKHRoaXMpLFxuXHRcdFx0XCJjYXJkOmRlbGV0ZTphY2NlcHRcIjogdGhpcy5vbkNhcmREZWxldGVBY2NlcHRlZC5iaW5kKHRoaXMpLFxuXHRcdFx0XCJjYXJkOmRlbGV0ZTpyZWplY3RcIjogdGhpcy5vbkNhcmREZWxldGVSZWplY3RlZC5iaW5kKHRoaXMpLFxuXHRcdFx0XCJjYXJkOmRlbGV0ZTpzYXZlZFwiOiB0aGlzLm9uQ2FyZERlbGV0ZVNhdmVkLmJpbmQodGhpcyksXG5cdFx0XHRcImNhcmQ6ZWRpdFwiOiB0aGlzLm9uQ2FyZEVkaXQuYmluZCh0aGlzKSxcblx0XHRcdFwiY2FyZDplZGl0OmFjY2VwdFwiOiB0aGlzLm9uQ2FyZEVkaXRBY2NlcHRlZC5iaW5kKHRoaXMpLFxuXHRcdFx0XCJjYXJkOmVkaXQ6ZmxpcFwiOiB0aGlzLm9uQ2FyZEVkaXRGbGlwLmJpbmQodGhpcyksXG5cdFx0XHRcImNhcmQ6ZWRpdDpmbGlwcGVkXCI6IHRoaXMub25DYXJkRWRpdEZsaXBwZWQuYmluZCh0aGlzKSxcblx0XHRcdFwiY2FyZDplZGl0OnJlamVjdFwiOiB0aGlzLm9uQ2FyZEVkaXRSZWplY3RlZC5iaW5kKHRoaXMpLFxuXHRcdFx0XCJjYXJkOmVkaXQ6c2F2ZVwiOiB0aGlzLm9uQ2FyZEVkaXRTYXZlLmJpbmQodGhpcyksXG5cdFx0XHRcImNhcmQ6ZWRpdDpzYXZlZFwiOiB0aGlzLm9uQ2FyZEVkaXRTYXZlZC5iaW5kKHRoaXMpLFxuXHRcdFx0XCJjYXJkOmVycm9yOmRpc21pc3NcIjogdGhpcy5vbkNhcmRFcnJvckRpc21pc3NlZC5iaW5kKHRoaXMpLFxuXG5cdFx0XHRcImRlY2s6YWRkXCI6IHRoaXMub25DYXJkRWRpdFJlamVjdGVkLmJpbmQodGhpcyksXG5cdFx0XHRcImRlY2s6ZGVsZXRlOnNhdmVkXCI6IHRoaXMub25EZWNrRGVsZXRlU2F2ZWQuYmluZCh0aGlzKSxcblx0XHRcdFwiZGVjazpzaXplOnVwZGF0ZWRcIjogdGhpcy5vbkRlY2tTaXplVXBkYXRlZC5iaW5kKHRoaXMpLFxuXHRcdH0pO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5kaXNhYmxlZCkge1xuXHRcdFx0dGhpcy5kaXNhYmxlKCk7XG5cdFx0XHR0aGlzLmRpc2FibGVkID0gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dGhpcy51aS5mbGFzaENhcmQuZmxpcCh7XG5cdFx0XHRzcGVlZDogNDAwLFxuXHRcdFx0dHJpZ2dlcjogXCJtYW51YWxcIixcblx0XHR9LCAoKSA9PiB7XG5cdFx0XHRSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS50cmlnZ2VyKFwiY2FyZDplZGl0OmZsaXBwZWRcIiwgXCJmcm9udFwiKTtcblx0XHR9KTtcblxuXHRcdGlmIChfLmlzTmlsKHRoaXMubW9kZWwpKSB7XG5cdFx0XHR0aGlzLmRpc2FibGVOYXZpZ2F0aW9uKCk7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKHRoaXMubW9kZWwuaXNOZXcoKSkge1xuXHRcdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikudHJpZ2dlcihcImNhcmQ6c2VsZWN0XCIsIHRoaXMubW9kZWwuY2lkKTtcblx0XHRcdEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJjYXJkOmVkaXRcIiwgdGhpcy5tb2RlbC5jaWQsIHsgcHJldmVudERpc2FibGU6IHRydWUgfSk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikudHJpZ2dlcihcImNhcmQ6c2VsZWN0XCIsIHRoaXMubW9kZWwuY2lkKTtcblx0XHRcdHRoaXMudXBkYXRlTmF2aWdhdGlvbkJ1dHRvbnMoKTtcblx0XHR9XG5cdH0sXG5cblx0dXBkYXRlTmF2aWdhdGlvbkJ1dHRvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLmN1cnJlbnRDYXJkSW5kZXggPT09IDApXG5cdFx0XHR0aGlzLmRpc2FibGVOYXZpZ2F0aW9uQnV0dG9uKHRoaXMudWkuYnV0dG9uTmF2aWdhdGVQcmV2aW91cyk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5lbmFibGVOYXZpZ2F0aW9uQnV0dG9uKHRoaXMudWkuYnV0dG9uTmF2aWdhdGVQcmV2aW91cyk7XG5cblx0XHRpZiAodGhpcy5jdXJyZW50Q2FyZEluZGV4ICsgMSA8IHRoaXMuY2FyZENvbGxlY3Rpb24ubGVuZ3RoKVxuXHRcdFx0dGhpcy5lbmFibGVOYXZpZ2F0aW9uQnV0dG9uKHRoaXMudWkuYnV0dG9uTmF2aWdhdGVOZXh0KTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLmRpc2FibGVOYXZpZ2F0aW9uQnV0dG9uKHRoaXMudWkuYnV0dG9uTmF2aWdhdGVOZXh0KTtcblx0fSxcblxuXHRkaXNhYmxlTmF2aWdhdGlvbkJ1dHRvbjogZnVuY3Rpb24oJGJ1dHRvbikge1xuXHRcdCRidXR0b24uYWRkQ2xhc3MoXCJidXR0b24tZGlzYWJsZWRcIik7XG5cdH0sXG5cblx0ZW5hYmxlTmF2aWdhdGlvbkJ1dHRvbjogZnVuY3Rpb24oJGJ1dHRvbikge1xuXHRcdCRidXR0b24ucmVtb3ZlQ2xhc3MoXCJidXR0b24tZGlzYWJsZWRcIik7XG5cdH0sXG5cblx0b25CdXR0b25OYXZpZ2F0ZU5leHRDbGljazogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdHRoaXMuY3VycmVudENhcmRJbmRleCsrO1xuXHRcdHRoaXMucmVuZGVyQ3VycmVudENhcmQoKTtcblx0fSxcblxuXHRvbkJ1dHRvbk5hdmlnYXRlUHJldmlvdXNDbGljazogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdHRoaXMuY3VycmVudENhcmRJbmRleC0tO1xuXHRcdHRoaXMucmVuZGVyQ3VycmVudENhcmQoKTtcblx0fSxcblxuXHRyZW5kZXJDdXJyZW50Q2FyZDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuY2FyZENvbGxlY3Rpb24ubGVuZ3RoID09PSAwKSB7XG5cdFx0XHR0aGlzLm1vZGVsID0gbnVsbDtcblx0XHRcdEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJjYXJkOnNlbGVjdFwiLCBudWxsKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLm1vZGVsID0gdGhpcy5jYXJkQ29sbGVjdGlvbi5hdCh0aGlzLmN1cnJlbnRDYXJkSW5kZXgpO1xuXHRcdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikudHJpZ2dlcihcImNhcmQ6c2VsZWN0XCIsIHRoaXMubW9kZWwuY2lkKTtcblx0XHR9XG5cblx0XHR0aGlzLnJlbmRlcigpO1xuXHR9LFxuXG5cdG9uVGV4dEJsdXI6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLnVpLnRleHRCYWNrLnZhbCgpLmxlbmd0aCA9PT0gMClcblx0XHRcdHRoaXMudWkudGV4dEJhY2sudmFsKERFRkFVTFRfQkFDS19URVhUKTtcblxuXHRcdGlmICh0aGlzLnVpLnRleHRGcm9udC52YWwoKS5sZW5ndGggPT09IDApXG5cdFx0XHR0aGlzLnVpLnRleHRGcm9udC52YWwoREVGQVVMVF9GUk9OVF9URVhUKTtcblx0fSxcblxuXHRvbkNhcmRUZXh0Q2hhbmdlZDogZnVuY3Rpb24oKSB7XG5cdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikudHJpZ2dlcihcImNhcmQ6ZWRpdFwiKTtcblx0fSxcblxuXHRvblRleHRGb2N1czogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC50YXJnZXQuc2VsZWN0KCk7XG5cdH0sXG5cblx0b25UZXh0S2V5VXA6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLnVpLnRleHRCYWNrLnZhbCgpICE9PSB0aGlzLm1vZGVsLmdldChcImJhY2tcIikgfHwgdGhpcy51aS50ZXh0RnJvbnQudmFsKCkgIT09IHRoaXMubW9kZWwuZ2V0KFwiZnJvbnRcIikpXG5cdFx0XHRSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS50cmlnZ2VyKFwiY2FyZDplZGl0XCIpO1xuXG5cdFx0aWYgKHRoaXMuaXNUZXh0TGVuZ3RoVmFsaWQoKSlcblx0XHRcdHRoaXMuaGlkZVRleHRMZW5ndGhXYXJuaW5nKCk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5zaG93VGV4dExlbmd0aFdhcm5pbmcoKTtcblx0fSxcblxuXHRvbkNhcmRDcmVhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY3VycmVudENhcmRJbmRleCsrO1xuXHRcdHRoaXMuY2FyZENvbGxlY3Rpb24uYWRkKG5ldyBDYXJkTW9kZWwoKSwgeyBhdDogdGhpcy5jdXJyZW50Q2FyZEluZGV4IH0pO1xuXHRcdHRoaXMucmVuZGVyQ3VycmVudENhcmQoKTtcblx0fSxcblxuXHRvbkNhcmREZWxldGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZGlzYWJsZSgpO1xuXHRcdHRoaXMuZGlzYWJsZU5hdmlnYXRpb24oKTtcblx0fSxcblxuXHRvbkNhcmREZWxldGVBY2NlcHRlZDogZnVuY3Rpb24oKSB7XG5cdFx0UmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikudHJpZ2dlcihcImNhcmQ6ZGVsZXRlOnNhdmVcIiwgdGhpcy5tb2RlbC5jaWQpO1xuXG5cdFx0dGhpcy5tb2RlbC5kZXN0cm95KHtcblx0XHRcdHdhaXQ6IHRydWUsXG5cblx0XHRcdHN1Y2Nlc3M6IG1vZGVsID0+IHtcblx0XHRcdFx0dGhpcy5jYXJkQ29sbGVjdGlvbi5yZW1vdmUodGhpcy5tb2RlbCk7XG5cdFx0XHRcdHRoaXMuY3VycmVudENhcmRJbmRleC0tO1xuXHRcdFx0XHRSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS50cmlnZ2VyKFwiY2FyZDpkZWxldGU6c2F2ZWRcIiwgbnVsbCwgdGhpcy5kZWNrTW9kZWwuY2lkLCBtb2RlbC5oYXMoXCJkZWxldGVkRGF0ZVwiKSA/IG1vZGVsLmdldChcImRlbGV0ZWREYXRlXCIpIDogbW9tZW50KCkudW5peCgpKTtcblx0XHRcdH0sXG5cblx0XHRcdGVycm9yOiAoKSA9PiB7XG5cdFx0XHRcdFJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJjYXJkOmVycm9yXCIsIFwiRXJyb3IgZGVsZXRpbmcgY2FyZC5cIiwgeyBlZGl0OiBmYWxzZSB9KTtcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH0sXG5cblx0b25DYXJkRGVsZXRlUmVqZWN0ZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZW5hYmxlKCk7XG5cdFx0dGhpcy5lbmFibGVOYXZpZ2F0aW9uKCk7XG5cdH0sXG5cblx0b25DYXJkRGVsZXRlU2F2ZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZW5hYmxlKCk7XG5cdFx0dGhpcy5lbmFibGVOYXZpZ2F0aW9uKCk7XG5cdFx0dGhpcy5yZW5kZXJDdXJyZW50Q2FyZCgpO1xuXHR9LFxuXG5cdG9uQ2FyZEVkaXQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZGlzYWJsZU5hdmlnYXRpb24oKTtcblx0fSxcblxuXHRkaXNhYmxlTmF2aWdhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5kaXNhYmxlTmF2aWdhdGlvbkJ1dHRvbih0aGlzLnVpLmJ1dHRvbk5hdmlnYXRlTmV4dCk7XG5cdFx0dGhpcy5kaXNhYmxlTmF2aWdhdGlvbkJ1dHRvbih0aGlzLnVpLmJ1dHRvbk5hdmlnYXRlUHJldmlvdXMpO1xuXHR9LFxuXG5cdGVuYWJsZU5hdmlnYXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudXBkYXRlTmF2aWdhdGlvbkJ1dHRvbnMoKTtcblx0fSxcblxuXHRvbkNhcmRFZGl0QWNjZXB0ZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJjYXJkOmVkaXQ6c2F2ZVwiKTtcblxuXHRcdGlmICh0aGlzLnZhbGlkYXRlVGV4dExlbmd0aCgpKSB7XG5cdFx0XHR0aGlzLm1vZGVsLm9uY2UoXCJpbnZhbGlkXCIsICgpID0+IHtcblx0XHRcdFx0dGhpcy5zaG93RXJyb3IodGhpcy5tb2RlbC52YWxpZGF0aW9uRXJyb3IpO1xuXHRcdFx0fSk7XG5cblx0XHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSB7XG5cdFx0XHRcdGJhY2s6IHRoaXMudWkudGV4dEJhY2sudmFsKCksXG5cdFx0XHRcdGZyb250OiB0aGlzLnVpLnRleHRGcm9udC52YWwoKSxcblx0XHRcdFx0aW5kZXg6IHRoaXMuY3VycmVudENhcmRJbmRleCxcblx0XHRcdH07XG5cblx0XHRcdHRoaXMubW9kZWwuc2F2ZShhdHRyaWJ1dGVzLCB7XG5cdFx0XHRcdHdhaXQ6IHRydWUsXG5cblx0XHRcdFx0c3VjY2VzczogbW9kZWwgPT4ge1xuXHRcdFx0XHRcdHRoaXMubW9kZWwudW5zZXQoXCJpbmRleFwiKTtcblx0XHRcdFx0XHR0aGlzLmNhcmRDb2xsZWN0aW9uLmFkZCh0aGlzLm1vZGVsKTtcblx0XHRcdFx0XHRSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS50cmlnZ2VyKFwiY2FyZDplZGl0OnNhdmVkXCIsIHRoaXMubW9kZWwuY2lkLCB0aGlzLmRlY2tNb2RlbC5jaWQsIG1vZGVsLmhhcyhcInVwZGF0ZWRcIikgPyBtb2RlbC5nZXQoXCJ1cGRhdGVkXCIpIDogbW9kZWwuZ2V0KFwiY3JlYXRlZFwiKSk7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0ZXJyb3I6ICgpID0+IHtcblx0XHRcdFx0XHRSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS50cmlnZ2VyKFwiY2FyZDplcnJvclwiLCBcIkVycm9yIHNhdmluZyBjYXJkLlwiLCB7IGVkaXQ6IHRydWUgfSk7XG5cdFx0XHRcdH0sXG5cdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0dmFsaWRhdGVUZXh0TGVuZ3RoOiBmdW5jdGlvbigpIHtcblx0XHRsZXQgdmFsaWQgPSB0cnVlO1xuXHRcdGxldCBpbnZhbGlkVGV4dExlbmd0aFNpZGU7XG5cblx0XHRpZiAoIXRoaXMuaXNUZXh0TGVuZ3RoVmFsaWQoXCJiYWNrXCIpKVxuXHRcdFx0aW52YWxpZFRleHRMZW5ndGhTaWRlID0gXCJiYWNrXCI7XG5cblx0XHRpZiAoIXRoaXMuaXNUZXh0TGVuZ3RoVmFsaWQoXCJmcm9udFwiKSkge1xuXHRcdFx0aWYgKF8uaXNOaWwoaW52YWxpZFRleHRMZW5ndGhTaWRlKSlcblx0XHRcdFx0aW52YWxpZFRleHRMZW5ndGhTaWRlID0gXCJmcm9udFwiO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRpbnZhbGlkVGV4dExlbmd0aFNpZGUgPSBcImJvdGhcIjtcblx0XHR9XG5cblx0XHRpZiAoIV8uaXNOaWwoaW52YWxpZFRleHRMZW5ndGhTaWRlKSkge1xuXHRcdFx0aWYgKGludmFsaWRUZXh0TGVuZ3RoU2lkZSA9PT0gXCJib3RoXCIpXG5cdFx0XHRcdFJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJjYXJkOmVycm9yXCIsIFwiVGV4dCBvbiBib3RoIHNpZGVzIG9mIGNhcmQgaXMgdG9vIGxvbmdcIiwgeyBlZGl0OiB0cnVlIH0pO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS50cmlnZ2VyKFwiY2FyZDplcnJvclwiLCBcIlRleHQgb24gXCIgKyBpbnZhbGlkVGV4dExlbmd0aFNpZGUgKyBcIiBvZiBjYXJkIGlzIHRvbyBsb25nXCIsIHsgZWRpdDogdHJ1ZSB9KTtcblxuXHRcdFx0dmFsaWQgPSBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsaWQ7XG5cdH0sXG5cblx0b25DYXJkRWRpdEZsaXA6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZmxpcEZsYXNoQ2FyZCgpO1xuXHR9LFxuXG5cdG9uQ2FyZEVkaXRGbGlwcGVkOiBmdW5jdGlvbihuZXdGYWNlKSB7XG5cdFx0aWYgKG5ld0ZhY2UgPT09IFwiYmFja1wiKVxuXHRcdFx0dGhpcy51aS5kaXNwbGF5U2lkZS50ZXh0KFwiQmFja1wiKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnVpLmRpc3BsYXlTaWRlLnRleHQoXCJGcm9udFwiKTtcblx0fSxcblxuXHRvbkNhcmRFZGl0UmVqZWN0ZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghXy5pc05pbCh0aGlzLm1vZGVsKSAmJiB0aGlzLm1vZGVsLmlzTmV3KCkpIHtcblx0XHRcdHRoaXMuY2FyZENvbGxlY3Rpb24ucmVtb3ZlKHRoaXMubW9kZWwpO1xuXHRcdFx0dGhpcy5jdXJyZW50Q2FyZEluZGV4LS07XG5cdFx0XHR0aGlzLnJlbmRlckN1cnJlbnRDYXJkKCk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5yZW5kZXIoKTtcblx0XHR9XG5cdH0sXG5cblx0b25DYXJkRWRpdFNhdmU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZGlzYWJsZSgpO1xuXHR9LFxuXG5cdG9uQ2FyZEVkaXRTYXZlZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5lbmFibGUoKTtcblx0XHR0aGlzLmVuYWJsZU5hdmlnYXRpb24oKTtcblx0fSxcblxuXHRvbkNhcmRFcnJvckRpc21pc3NlZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5lbmFibGUoKTtcblx0fSxcblxuXHRvbkRlY2tEZWxldGVTYXZlZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5kZWNrTW9kZWwgPSBudWxsO1xuXHRcdHRoaXMuZGlzYWJsZSgpO1xuXHR9LFxuXG5cdG9uRGVja1NpemVVcGRhdGVkOiBmdW5jdGlvbihkZWNrTW9kZWxDaWQsIGNhcmRDb3VudCkge1xuXHRcdGlmIChjYXJkQ291bnQgPCBDQVJEX0NPVU5UX01BWClcblx0XHRcdHRoaXMuZW5hYmxlKCk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5kaXNhYmxlKCk7XG5cdH0sXG5cblx0ZGlzYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5mbGFzaENhcmQuYWRkQ2xhc3MoXCJmbGFzaC1jYXJkLWRpc2FibGVkXCIpO1xuXHR9LFxuXG5cdGVuYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5mbGFzaENhcmQucmVtb3ZlQ2xhc3MoXCJmbGFzaC1jYXJkLWRpc2FibGVkXCIpO1xuXHR9LFxuXG5cdGZsaXBGbGFzaENhcmQ6IGZ1bmN0aW9uKCkge1xuXHRcdGxldCBuZXdGYWNlO1xuXG5cdFx0aWYgKHRoaXMuY2FyZEZsaXBwZWQpIHtcblx0XHRcdHRoaXMuY2FyZEZsaXBwZWQgPSBmYWxzZTtcblx0XHRcdG5ld0ZhY2UgPSBcImZyb250XCI7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5jYXJkRmxpcHBlZCA9IHRydWU7XG5cdFx0XHRuZXdGYWNlID0gXCJiYWNrXCI7XG5cdFx0fVxuXG5cdFx0dGhpcy5oaWRlVGV4dExlbmd0aFdhcm5pbmcoKTtcblxuXHRcdHRoaXMudWkuZmxhc2hDYXJkLmZsaXAodGhpcy5jYXJkRmxpcHBlZCwgKCkgPT4ge1xuXHRcdFx0aWYgKCF0aGlzLmlzVGV4dExlbmd0aFZhbGlkKG5ld0ZhY2UpKVxuXHRcdFx0XHR0aGlzLnNob3dUZXh0TGVuZ3RoV2FybmluZygpO1xuXG5cdFx0XHRSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS50cmlnZ2VyKFwiY2FyZDplZGl0OmZsaXBwZWRcIiwgbmV3RmFjZSk7XG5cdFx0fSk7XG5cdH0sXG5cblx0aXNUZXh0TGVuZ3RoVmFsaWQ6IGZ1bmN0aW9uKHNpZGUpIHtcblx0XHRsZXQgdmFsaWQgPSB0cnVlO1xuXHRcdGNvbnN0IGNvbnRlbnQgPSBzaWRlID09PSBcImJhY2tcIiA/IHRoaXMudWkudGV4dEJhY2sudmFsKCkgOiB0aGlzLnVpLnRleHRGcm9udC52YWwoKTtcblxuXHRcdGNvbnN0IG5ld2xpbmVDaGFyYWN0ZXJDb3VudCA9IF8ucmVkdWNlKGNvbnRlbnQsIChhY2MsIGNoYXJhY3RlcikgPT4ge1xuXHRcdFx0bGV0IHJlc3VsdCA9IGFjYztcblxuXHRcdFx0aWYgKGNoYXJhY3RlciA9PT0gXCJcXG5cIilcblx0XHRcdFx0cmVzdWx0Kys7XG5cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fSwgMCk7XG5cblx0XHRpZiAobmV3bGluZUNoYXJhY3RlckNvdW50ID4gTUFYX05FV19MSU5FX0NIQVJBQ1RFUlMgfHwgY29udGVudC5sZW5ndGggPiBNQVhfVEVYVF9MRU5HVEgpXG5cdFx0XHR2YWxpZCA9IGZhbHNlO1xuXG5cdFx0cmV0dXJuIHZhbGlkO1xuXHR9LFxuXG5cdGhpZGVUZXh0TGVuZ3RoV2FybmluZzogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS53YXJuaW5nQ29udGFpbmVyQm90dG9tLnRleHQoXCJcIik7XG5cdH0sXG5cblx0c2hvd1RleHRMZW5ndGhXYXJuaW5nOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLndhcm5pbmdDb250YWluZXJCb3R0b20udGV4dChcIkZsYXNoY2FyZCBjb250ZW50IGlzIHRvbyBsb25nLlwiKTtcblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc3RvcExpc3RlbmluZyhSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKSk7XG5cdH0sXG59KTtcblxuY29uc3QgQ29udHJvbHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImZsYXNoLWNhcmQtd2lkZ2V0LWNvbnRyb2xzXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvZmxhc2hDYXJkcy9jYXJkV2lkZ2V0Lm51bmpcIikuY29udHJvbHMsXG5cblx0dWk6IHtcblx0XHRidXR0b25BY2NlcHQ6IFwiLmJ1dHRvbi1hY2NlcHRcIixcblx0XHRidXR0b25DcmVhdGU6IFwiLmJ1dHRvbi1jcmVhdGVcIixcblx0XHRidXR0b25EZWxldGU6IFwiLmJ1dHRvbi1kZWxldGVcIixcblx0XHRidXR0b25GbGlwOiBcIi5idXR0b24tZmxpcFwiLFxuXHRcdGJ1dHRvblJlamVjdDogXCIuYnV0dG9uLXJlamVjdFwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmJ1dHRvbkFjY2VwdFwiOiBcIm9uQnV0dG9uQWNjZXB0Q2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5idXR0b25DcmVhdGVcIjogXCJvbkJ1dHRvbkNyZWF0ZUNsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkuYnV0dG9uRGVsZXRlXCI6IFwib25CdXR0b25EZWxldGVDbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmJ1dHRvbkZsaXBcIjogXCJvbkJ1dHRvbkZsaXBDbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmJ1dHRvblJlamVjdFwiOiBcIm9uQnV0dG9uUmVqZWN0Q2xpY2tcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5kaXNhYmxlZCA9IG9wdGlvbnMuZGlzYWJsZWQ7XG5cdFx0dGhpcy5lZGl0ID0gb3B0aW9ucy5lZGl0O1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKSwge1xuXHRcdFx0XCJjYXJkOmNyZWF0ZVwiOiB0aGlzLm9uQ2FyZENyZWF0ZS5iaW5kKHRoaXMpLFxuXHRcdFx0XCJjYXJkOmVkaXRcIjogdGhpcy5vbkNhcmRFZGl0LmJpbmQodGhpcyksXG5cdFx0XHRcImNhcmQ6ZWRpdDpyZWplY3RcIjogdGhpcy5zaG93Q2FyZENvbnRyb2xzLmJpbmQodGhpcyksXG5cblx0XHRcdFwiZGVjazphZGRcIjogdGhpcy5zaG93Q2FyZENvbnRyb2xzLmJpbmQodGhpcyksXG5cdFx0XHRcImRlY2s6ZGVsZXRlOnNhdmVkXCI6IHRoaXMub25EZWNrRGVsZXRlU2F2ZWQuYmluZCh0aGlzKSxcblx0XHRcdFwiZGVjazpzZWxlY3RcIjogdGhpcy5vbkRlY2tTZWxlY3RlZC5iaW5kKHRoaXMpLFxuXHRcdFx0XCJkZWNrOnNpemU6dXBkYXRlZFwiOiB0aGlzLm9uRGVja1NpemVVcGRhdGVkLmJpbmQodGhpcyksXG5cdFx0fSk7XG5cdH0sXG5cblx0b25CZWZvcmVBdHRhY2g6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLmRpc2FibGVkKVxuXHRcdFx0dGhpcy5kaXNhYmxlKCk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdF8uZWFjaChbXG5cdFx0XHR7XG5cdFx0XHRcdHRhcmdldEVsOiB0aGlzLnVpLmJ1dHRvbkFjY2VwdC5nZXQoMCksXG5cdFx0XHRcdGNvbnRlbnQ6IFwiU2F2ZSB0aGUgZmxhc2hjYXJkXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHR0YXJnZXRFbDogdGhpcy51aS5idXR0b25DcmVhdGUuZ2V0KDApLFxuXHRcdFx0XHRjb250ZW50OiBcIkFkZCBhIGZsYXNoY2FyZFwiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0dGFyZ2V0RWw6IHRoaXMudWkuYnV0dG9uRGVsZXRlLmdldCgwKSxcblx0XHRcdFx0Y29udGVudDogXCJEZWxldGUgdGhlIGZsYXNoY2FyZFwiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0dGFyZ2V0RWw6IHRoaXMudWkuYnV0dG9uRmxpcC5nZXQoMCksXG5cdFx0XHRcdGNvbnRlbnQ6IFwiRmxpcCB0aGUgZmxhc2hjYXJkXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHR0YXJnZXRFbDogdGhpcy51aS5idXR0b25SZWplY3QuZ2V0KDApLFxuXHRcdFx0XHRjb250ZW50OiBcIkNhbmNlbFwiLFxuXHRcdFx0fSxcblx0XHRdLCBzcGVjID0+IHRpcHB5KHNwZWMudGFyZ2V0RWwsIF8uZXh0ZW5kKF8ub21pdChzcGVjLCBbXCJ0YXJnZXRFbFwiXSksIHtcblx0XHRcdHRoZW1lOiBcImJsYWNrXCIsXG5cdFx0XHRwbGFjZW1lbnQ6IFwiYm90dG9tXCIsXG5cdFx0fSkpKTtcblxuXHRcdGlmICh0aGlzLmVkaXQpIHtcblx0XHRcdHRoaXMuc2hvd0VkaXRDb250cm9scygpO1xuXHRcdFx0ZGVsZXRlIHRoaXMuZWRpdDtcblx0XHR9XG5cdH0sXG5cblx0b25DYXJkQ3JlYXRlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNob3dFZGl0Q29udHJvbHMoKTtcblx0fSxcblxuXHRvbkNhcmRFZGl0OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNob3dFZGl0Q29udHJvbHMoKTtcblx0fSxcblxuXHRzaG93Q2FyZENvbnRyb2xzOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmJ1dHRvbkFjY2VwdC5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5idXR0b25SZWplY3QuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0dGhpcy51aS5idXR0b25DcmVhdGUucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkuYnV0dG9uRGVsZXRlLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRzaG93RWRpdENvbnRyb2xzOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmJ1dHRvbkNyZWF0ZS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5idXR0b25EZWxldGUuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0dGhpcy51aS5idXR0b25BY2NlcHQucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkuYnV0dG9uUmVqZWN0LnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRvbkRlY2tEZWxldGVTYXZlZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5kaXNhYmxlKCk7XG5cdH0sXG5cblx0b25EZWNrU2VsZWN0ZWQ6IGZ1bmN0aW9uKGRlY2tNb2RlbENpZCkge1xuXHRcdGlmIChkZWNrTW9kZWxDaWQgPT09IG51bGwpXG5cdFx0XHR0aGlzLmRpc2FibGUoKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLmVuYWJsZSgpO1xuXHR9LFxuXG5cdG9uRGVja1NpemVVcGRhdGVkOiBmdW5jdGlvbihkZWNrTW9kZWxDaWQsIGNhcmRDb3VudCkge1xuXHRcdGlmIChjYXJkQ291bnQgPCBDQVJEX0NPVU5UX01BWClcblx0XHRcdHRoaXMuZW5hYmxlKCk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5kaXNhYmxlKCk7XG5cblx0XHRpZiAoY2FyZENvdW50ID09PSAwKSB7XG5cdFx0XHR0aGlzLnNob3dDYXJkQ29udHJvbHMoKTtcblx0XHRcdHRoaXMudWkuYnV0dG9uRGVsZXRlLmFkZENsYXNzKFwiYnV0dG9uLWRpc2FibGVkXCIpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMudWkuYnV0dG9uRGVsZXRlLnJlbW92ZUNsYXNzKFwiYnV0dG9uLWRpc2FibGVkXCIpO1xuXHRcdH1cblx0fSxcblxuXHRvbkJ1dHRvbkFjY2VwdENsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS50cmlnZ2VyKFwiY2FyZDplZGl0OmFjY2VwdFwiKTtcblx0fSxcblxuXHRvbkJ1dHRvbkNyZWF0ZUNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS50cmlnZ2VyKFwiY2FyZDpjcmVhdGVcIik7XG5cdH0sXG5cblx0b25CdXR0b25EZWxldGVDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0UmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikudHJpZ2dlcihcImNhcmQ6ZGVsZXRlXCIpO1xuXHR9LFxuXG5cdG9uQnV0dG9uRmxpcENsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS50cmlnZ2VyKFwiY2FyZDplZGl0OmZsaXBcIik7XG5cdH0sXG5cblx0b25CdXR0b25SZWplY3RDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0UmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikudHJpZ2dlcihcImNhcmQ6ZWRpdDpyZWplY3RcIik7XG5cdH0sXG5cblx0ZGlzYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5idXR0b25BY2NlcHQuYWRkQ2xhc3MoXCJidXR0b24tZGlzYWJsZWRcIik7XG5cdFx0dGhpcy51aS5idXR0b25GbGlwLmFkZENsYXNzKFwiYnV0dG9uLWRpc2FibGVkXCIpO1xuXHRcdHRoaXMudWkuYnV0dG9uUmVqZWN0LmFkZENsYXNzKFwiYnV0dG9uLWRpc2FibGVkXCIpO1xuXHR9LFxuXG5cdGVuYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5idXR0b25BY2NlcHQucmVtb3ZlQ2xhc3MoXCJidXR0b24tZGlzYWJsZWRcIik7XG5cdFx0dGhpcy51aS5idXR0b25GbGlwLnJlbW92ZUNsYXNzKFwiYnV0dG9uLWRpc2FibGVkXCIpO1xuXHRcdHRoaXMudWkuYnV0dG9uUmVqZWN0LnJlbW92ZUNsYXNzKFwiYnV0dG9uLWRpc2FibGVkXCIpO1xuXHR9LFxufSk7XG5cbmNvbnN0IERlbGV0ZUNvbmZpcm1hdGlvbiA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZmxhc2gtY2FyZC13aWRnZXQtZGVsZXRlLWNvbmZpcm1hdGlvblwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2ZsYXNoQ2FyZHMvY2FyZFdpZGdldC5udW5qXCIpLmRlbGV0ZUNvbmZpcm1hdGlvbixcblxuXHR1aToge1xuXHRcdGJ1dHRvbkFjY2VwdDogXCIuYnV0dG9uLWFjY2VwdFwiLFxuXHRcdGJ1dHRvblJlamVjdDogXCIuYnV0dG9uLXJlamVjdFwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmJ1dHRvbkFjY2VwdFwiOiBcIm9uQnV0dG9uQWNjZXB0Q2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5idXR0b25SZWplY3RcIjogXCJvbkJ1dHRvblJlamVjdENsaWNrXCIsXG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdF8uZWFjaChbXG5cdFx0XHR7XG5cdFx0XHRcdHRhcmdldEVsOiB0aGlzLnVpLmJ1dHRvbkFjY2VwdC5nZXQoMCksXG5cdFx0XHRcdGNvbnRlbnQ6IFwiWWVzXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHR0YXJnZXRFbDogdGhpcy51aS5idXR0b25SZWplY3QuZ2V0KDApLFxuXHRcdFx0XHRjb250ZW50OiBcIk5vXCIsXG5cdFx0XHR9LFxuXHRcdF0sIHNwZWMgPT4gdGlwcHkoc3BlYy50YXJnZXRFbCwgXy5leHRlbmQoXy5vbWl0KHNwZWMsIFtcInRhcmdldEVsXCJdKSwge1xuXHRcdFx0dGhlbWU6IFwiYmxhY2tcIixcblx0XHRcdHBsYWNlbWVudDogXCJib3R0b21cIixcblx0XHR9KSkpO1xuXHR9LFxuXG5cdG9uQnV0dG9uQWNjZXB0Q2xpY2s6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikudHJpZ2dlcihcImNhcmQ6ZGVsZXRlOmFjY2VwdFwiKTtcblx0fSxcblxuXHRvbkJ1dHRvblJlamVjdENsaWNrOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJjYXJkOmRlbGV0ZTpyZWplY3RcIik7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHRfLmVhY2godGhpcy50b29sdGlwVmlld3MsIHQgPT4gdC5kZXN0cm95KCkpO1xuXHR9LFxufSk7XG5cbmNvbnN0IENhcmRFcnJvciA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZmxhc2gtY2FyZC13aWRnZXQtZXJyb3JcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9mbGFzaENhcmRzL2NhcmRXaWRnZXQubnVualwiKS5lcnJvcixcblxuXHR1aToge1xuXHRcdGJ1dHRvbkRpc21pc3M6IFwiLmJ1dHRvbi1kaXNtaXNzXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkuYnV0dG9uRGlzbWlzc1wiOiBcIm9uQnV0dG9uRGlzbWlzc0NsaWNrXCIsXG5cdH0sXG5cblx0dGVtcGxhdGVDb250ZXh0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuXHRcdH07XG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMubWVzc2FnZSA9IG9wdGlvbnMubWVzc2FnZTtcblx0XHR0aGlzLnByZXZpb3VzU3RhdGUgPSBvcHRpb25zLnByZXZpb3VzU3RhdGU7XG5cdH0sXG5cblx0b25CdXR0b25EaXNtaXNzQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJjYXJkOmVycm9yOmRpc21pc3NcIiwgdGhpcy5wcmV2aW91c1N0YXRlKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Xy5lYWNoKFtcblx0XHRcdHtcblx0XHRcdFx0dGFyZ2V0RWw6IHRoaXMudWkuYnV0dG9uRGlzbWlzcy5nZXQoMCksXG5cdFx0XHRcdGNvbnRlbnQ6IFwiT2tcIixcblx0XHRcdH0sXG5cdFx0XSwgc3BlYyA9PiB0aXBweShzcGVjLnRhcmdldEVsLCBfLmV4dGVuZChfLm9taXQoc3BlYywgW1widGFyZ2V0RWxcIl0pLCB7XG5cdFx0XHR0aGVtZTogXCJibGFja1wiLFxuXHRcdFx0cGxhY2VtZW50OiBcImJvdHRvbVwiLFxuXHRcdH0pKSk7XG5cdH0sXG59KTtcblxuY29uc3QgU3RhdHVzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJmbGFzaC1jYXJkLXdpZGdldC1zdGF0dXNcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9mbGFzaENhcmRzL2NhcmRXaWRnZXQubnVualwiKS5zdGF0dXMsXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImZsYXNoLWNhcmQtd2lkZ2V0LWxheW91dCBmbGFzaC1jYXJkLXdpZGdldC1oaWRkZW5cIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9mbGFzaENhcmRzL2NhcmRXaWRnZXQubnVualwiKS5sYXlvdXQsXG5cblx0cmVnaW9uczoge1xuXHRcdGRlY2tTZWxlY3RvcjogXCIuZGVjay1zZWxlY3Rvci1yZWdpb25cIixcblx0XHRjYXJkRWRpdG9yOiBcIi5jYXJkLWVkaXRvci1yZWdpb25cIixcblx0XHRjb250cm9sOiBcIi5jb250cm9sLXJlZ2lvblwiLFxuXHRcdGRlY2tUaXRsZTogXCIuZGVjay10aXRsZS1yZWdpb25cIixcblx0XHRzdGF0dXM6IFwiLnN0YXR1cy1yZWdpb25cIixcblx0fSxcblxuXHR1aToge1xuXHRcdGJvZHk6IFwiLmZsYXNoLWNhcmQtd2lkZ2V0LWxheW91dC1ib2R5XCIsXG5cdFx0YnV0dG9uQ2xvc2U6IFwiLmJ1dHRvbi1jbG9zZVwiLFxuXHRcdGRlY2tTZWxlY3RvclNsaWRlcjogXCIuZGVjay1zZWxlY3Rvci1zbGlkZXJcIixcblx0XHRkZWNrVGl0bGVMYWJlbDogXCIuZGVjay10aXRsZS1sYWJlbFwiLFxuXHRcdGhlYWRlcjogXCIuZmxhc2gtY2FyZC13aWRnZXQtbGF5b3V0LWhlYWRlclwiLFxuXHRcdHN0YXR1c1JlZ2lvbjogXCIuc3RhdHVzLXJlZ2lvblwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmJ1dHRvbkNsb3NlXCI6IFwib25CdXR0b25DbG9zZUNsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkuZGVja1RpdGxlTGFiZWxcIjogXCJvbkRlY2tUaXRsZUxhYmVsQ2xpY2tcIixcblx0XHRcIm1vdXNlZG93biBAdWkuaGVhZGVyXCI6IFwib25Nb3VzZURvd25cIixcblx0XHRcIm1vdXNldXAgQHVpLmhlYWRlclwiOiBcIm9uTW91c2VVcFwiLFxuXHRcdFwidHJhbnNpdGlvbmVuZCBAdWkuZGVja1NlbGVjdG9yU2xpZGVyXCI6IFwib25EZWNrU2VsZWN0b3JTbGlkZXJUcmFuc2l0aW9uRW5kXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5saXN0ZW5UbyhSYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKSwge1xuXHRcdFx0XCJjYXJkOmRlbGV0ZVwiOiB0aGlzLnNob3dEZWxldGVDb25maXJtYXRpb24uYmluZCh0aGlzKSxcblx0XHRcdFwiY2FyZDpkZWxldGU6cmVqZWN0XCI6IHRoaXMuc2hvd0NvbnRyb2xzLmJpbmQodGhpcyksXG5cdFx0XHRcImNhcmQ6ZGVsZXRlOnNhdmVkXCI6IHRoaXMuc2hvd0NvbnRyb2xzLmJpbmQodGhpcyksXG5cdFx0XHRcImNhcmQ6ZWRpdDpzYXZlXCI6IHRoaXMub25DYXJkRWRpdFNhdmUuYmluZCh0aGlzKSxcblx0XHRcdFwiY2FyZDplZGl0OnNhdmVkXCI6IHRoaXMub25DYXJkRWRpdFNhdmVkLmJpbmQodGhpcyksXG5cdFx0XHRcImNhcmQ6ZXJyb3JcIjogdGhpcy5zaG93RXJyb3IuYmluZCh0aGlzKSxcblx0XHRcdFwiY2FyZDplcnJvcjpkaXNtaXNzXCI6IHRoaXMub25DYXJkRXJyb3JEaXNtaXNzZWQuYmluZCh0aGlzKSxcblxuXHRcdFx0XCJjYXJkczplZGl0XCI6IHRoaXMub25FZGl0Q2FyZHMuYmluZCh0aGlzKSxcblxuXHRcdFx0XCJkZWNrOmRlbGV0ZTpzYXZlZFwiOiB0aGlzLm9uRGVja0RlbGV0ZVNhdmVkLmJpbmQodGhpcyksXG5cdFx0XHRcImRlY2s6c2VsZWN0XCI6IHRoaXMub25EZWNrU2VsZWN0ZWQuYmluZCh0aGlzKSxcblx0XHR9KTtcblxuXHRcdEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnJlcGx5KFwiY2FyZDptb2RlbDpnZXRcIiwgdGhpcy5nZXRDYXJkTW9kZWwuYmluZCh0aGlzKSk7XG5cdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikucmVwbHkoXCJjYXJkOm1vZGVsOmluZGV4XCIsIHRoaXMuZ2V0Q2FyZE1vZGVsSW5kZXguYmluZCh0aGlzKSk7XG5cdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikucmVwbHkoXCJkZWNrOm1vZGVsOmdldFwiLCB0aGlzLmdldERlY2tNb2RlbC5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRnZXRDYXJkTW9kZWw6IGZ1bmN0aW9uKGNhcmRNb2RlbENpZCkge1xuXHRcdHJldHVybiBfLmlzTmlsKGNhcmRNb2RlbENpZCkgPyBudWxsIDogdGhpcy5jYXJkQ29sbGVjdGlvbi5nZXQoY2FyZE1vZGVsQ2lkKTtcblx0fSxcblxuXHRnZXRDYXJkTW9kZWxJbmRleDogZnVuY3Rpb24oY2FyZE1vZGVsQ2lkKSB7XG5cdFx0cmV0dXJuIF8uaXNOaWwoY2FyZE1vZGVsQ2lkKSA/IG51bGwgOiBfLmZpbmRJbmRleCh0aGlzLmNhcmRDb2xsZWN0aW9uLm1vZGVscywgbSA9PiBtLmNpZCA9PT0gY2FyZE1vZGVsQ2lkKTtcblx0fSxcblxuXHRnZXREZWNrTW9kZWw6IGZ1bmN0aW9uKGRlY2tNb2RlbENpZCkge1xuXHRcdHJldHVybiBfLmlzTmlsKGRlY2tNb2RlbENpZCkgPyBudWxsIDogdGhpcy5kZWNrQ29sbGVjdGlvbi5nZXQoZGVja01vZGVsQ2lkKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy4kZWwuY3NzKHtcblx0XHRcdGxlZnQ6IHRoaXMubGVmdCxcblx0XHRcdHRvcDogdGhpcy50b3AsXG5cdFx0fSk7XG5cblx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyhcImZsYXNoLWNhcmQtd2lkZ2V0LWhpZGRlblwiKTtcblxuXHRcdHRoaXMuZmV0Y2hEZWNrQ29sbGVjdGlvbigpO1xuXHR9LFxuXG5cdG9uQnV0dG9uQ2xvc2VDbGljazogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5IaWRlRmxhc2hDYXJkV2lkZ2V0KTtcblx0fSxcblxuXHRvbkRlY2tUaXRsZUxhYmVsQ2xpY2s6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0dGhpcy5vcGVuU2xpZGVyKCk7XG5cdH0sXG5cblx0b25FZGl0Q2FyZHM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY2xvc2VTbGlkZXIoKTtcblx0fSxcblxuXHRjbG9zZVNsaWRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5kZWNrU2VsZWN0b3JTbGlkZXIucmVtb3ZlQ2xhc3MoXCJkZWNrLXNlbGVjdG9yLXNsaWRlci1vcGVuXCIpO1xuXHR9LFxuXG5cdG9wZW5TbGlkZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkuZGVja1NlbGVjdG9yU2xpZGVyLmFkZENsYXNzKFwiZGVjay1zZWxlY3Rvci1zbGlkZXItb3BlblwiKTtcblx0fSxcblxuXHRvbklGcmFtZU1vdXNlTW92ZTogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRpZiAodGhpcy5pRnJhbWVNb3VzZU1vdmUpXG5cdFx0XHR0aGlzLmlGcmFtZU1vdXNlTW92ZShldmVudCk7XG5cblx0XHRjb25zdCBpZnJhbWUgPSAkKFwiI2Jvb2stZGlzcGxheVwiLCAkKGRvY3VtZW50KSkuZ2V0KDApO1xuXHRcdGNvbnN0IG5ld0V2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJNb3VzZUV2ZW50c1wiKTtcblx0XHRjb25zdCBib3VuZGluZ0NsaWVudFJlY3QgPSBpZnJhbWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cblx0XHRuZXdFdmVudC5pbml0TW91c2VFdmVudChcblx0XHRcdFwibW91c2Vtb3ZlXCIsXG5cdFx0XHR0cnVlLFxuXHRcdFx0ZmFsc2UsXG5cdFx0XHR3aW5kb3csXG5cdFx0XHRldmVudC5kZXRhaWwsXG5cdFx0XHRldmVudC5zY3JlZW5YLFxuXHRcdFx0ZXZlbnQuc2NyZWVuWSxcblx0XHRcdGV2ZW50LmNsaWVudFggKyBib3VuZGluZ0NsaWVudFJlY3QubGVmdCxcblx0XHRcdGV2ZW50LmNsaWVudFkgKyBib3VuZGluZ0NsaWVudFJlY3QudG9wLFxuXHRcdFx0ZXZlbnQuY3RybEtleSxcblx0XHRcdGV2ZW50LmFsdEtleSxcblx0XHRcdGV2ZW50LnNoaWZ0S2V5LFxuXHRcdFx0ZXZlbnQubWV0YUtleSxcblx0XHRcdGV2ZW50LmJ1dHRvbixcblx0XHRcdG51bGxcblx0XHQpO1xuXG5cdFx0aWZyYW1lLmRpc3BhdGNoRXZlbnQobmV3RXZlbnQpO1xuXHR9LFxuXG5cdGJpbmRNb3VzZU1vdmVUb0lGcmFtZTogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgaWZyYW1lID0gJChcIiNib29rLWRpc3BsYXlcIiwgJChkb2N1bWVudCkpLmdldCgwKTtcblxuXHRcdGlmICghaWZyYW1lKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5pRnJhbWVNb3VzZU1vdmUgPSBpZnJhbWUuY29udGVudFdpbmRvdy5vbm1vdXNlbW92ZTtcblx0XHRpZnJhbWUuY29udGVudFdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMub25JRnJhbWVNb3VzZU1vdmUuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0dW5iaW5kTW91c2VNb3ZlRnJvbUlGcmFtZTogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgaWZyYW1lID0gJChcIiNib29rLWRpc3BsYXlcIiwgJChkb2N1bWVudCkpLmdldCgwKTtcblxuXHRcdGlmICghaWZyYW1lKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0aWZyYW1lLmNvbnRlbnRXaW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCB0aGlzLm9uSUZyYW1lTW91c2VNb3ZlLmJpbmQodGhpcykpO1xuXG5cdFx0aWYgKCF0aGlzLmlGcmFtZU1vdXNlTW92ZSlcblx0XHRcdHJldHVybjtcblxuXHRcdGlmcmFtZS5jb250ZW50V2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5pRnJhbWVNb3VzZU1vdmUpO1xuXHR9LFxuXG5cdG9uTW91c2VEb3duOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0dGhpcy51aS5oZWFkZXIuYWRkQ2xhc3MoXCJkcmFnZ2luZ1wiKTtcblxuXHRcdHRoaXMuZHJhZ0FuY2hvciA9IHtcblx0XHRcdHg6IGV2ZW50LnNjcmVlblgsXG5cdFx0XHR5OiBldmVudC5zY3JlZW5ZLFxuXHRcdH07XG5cblx0XHQkKHdpbmRvdykub24oXCJtb3VzZW1vdmVcIiwgdGhpcy5vbk1vdXNlTW92ZS5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmJpbmRNb3VzZU1vdmVUb0lGcmFtZSgpO1xuXHRcdCQoXCJpZnJhbWVcIiwgJCh3aW5kb3cpKS5vbihcIm1vdXNlbW92ZVwiLCB0aGlzLm9uTW91c2VNb3ZlLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdG9uTW91c2VNb3ZlOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0aWYgKHRoaXMuZHJhZ0FuY2hvcikge1xuXHRcdFx0Y29uc3Qgb2Zmc2V0ID0ge1xuXHRcdFx0XHR4OiBldmVudC5zY3JlZW5YIC0gdGhpcy5kcmFnQW5jaG9yLngsXG5cdFx0XHRcdHk6IGV2ZW50LnNjcmVlblkgLSB0aGlzLmRyYWdBbmNob3IueSxcblx0XHRcdH07XG5cblx0XHRcdGNvbnN0IHBvc2l0aW9uID0gdGhpcy4kZWwub2Zmc2V0KCk7XG5cblx0XHRcdHRoaXMuJGVsLm9mZnNldCh7XG5cdFx0XHRcdGxlZnQ6IHBvc2l0aW9uLmxlZnQgKyBvZmZzZXQueCxcblx0XHRcdFx0dG9wOiBwb3NpdGlvbi50b3AgKyBvZmZzZXQueSxcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLmRyYWdBbmNob3IueCA9IGV2ZW50LnNjcmVlblg7XG5cdFx0XHR0aGlzLmRyYWdBbmNob3IueSA9IGV2ZW50LnNjcmVlblk7XG5cdFx0fVxuXHR9LFxuXG5cdG9uTW91c2VVcDogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdCQod2luZG93KS5vZmYoXCJvbm1vdXNlbW92ZVwiKTtcblx0XHQkKFwiaWZyYW1lXCIsICQod2luZG93KSkub2ZmKFwib25tb3VzZW1vdmVcIiwgdGhpcy5vbk1vdXNlTW92ZS5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLnVuYmluZE1vdXNlTW92ZUZyb21JRnJhbWUoKTtcblxuXHRcdHRoaXMudWkuaGVhZGVyLnJlbW92ZUNsYXNzKFwiZHJhZ2dpbmdcIik7XG5cblx0XHR0aGlzLmRyYWdBbmNob3IgPSB1bmRlZmluZWQ7XG5cdH0sXG5cblx0b25DYXJkRWRpdFNhdmU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc2hvd1N0YXR1cygpO1xuXHR9LFxuXG5cdG9uQ2FyZEVkaXRTYXZlZDogZnVuY3Rpb24oY2FyZE1vZGVsQ2lkKSB7XG5cdFx0Y29uc3QgY2FyZE1vZGVsID0gdGhpcy5jYXJkQ29sbGVjdGlvbi5nZXQoY2FyZE1vZGVsQ2lkKTtcblx0XHRsZXQgZmxhc2hDYXJkcyA9IHRoaXMuZGVja01vZGVsLmdldChcImZsYXNoQ2FyZHNcIik7XG5cblx0XHRpZiAoIV8uaW5jbHVkZXMoZmxhc2hDYXJkcywgY2FyZE1vZGVsLmdldChcIl9pZFwiKSkpIHtcblx0XHRcdGZsYXNoQ2FyZHMgPSBfLm1hcCh0aGlzLmNhcmRDb2xsZWN0aW9uLm1vZGVscywgZmxhc2hDYXJkTW9kZWwgPT4gZmxhc2hDYXJkTW9kZWwuZ2V0KFwiX2lkXCIpKTtcblx0XHRcdHRoaXMuZGVja01vZGVsLnNldChcImZsYXNoQ2FyZHNcIiwgZmxhc2hDYXJkcyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5zaG93Q29udHJvbHMoKTtcblx0fSxcblxuXHRvbkNhcmRFcnJvckRpc21pc3NlZDogZnVuY3Rpb24ocHJldmlvdXNTdGF0ZSkge1xuXHRcdHRoaXMuc2hvd0NvbnRyb2xzKHsgZWRpdDogcHJldmlvdXNTdGF0ZS5lZGl0IH0pO1xuXHR9LFxuXG5cdG9uRGVja0RlbGV0ZVNhdmVkOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmRlY2tNb2RlbCA9IG51bGw7XG5cdH0sXG5cblx0b25EZWNrU2VsZWN0ZWQ6IGZ1bmN0aW9uKGRlY2tNb2RlbENpZCkge1xuXHRcdGlmIChkZWNrTW9kZWxDaWQgPT09IG51bGwpIHtcblx0XHRcdHRoaXMuZGVja01vZGVsID0gbnVsbDtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLmRlY2tNb2RlbCA9IHRoaXMuZGVja0NvbGxlY3Rpb24uZ2V0KGRlY2tNb2RlbENpZCk7XG5cdFx0XHR0aGlzLmxvYWRDYXJkcyh0aGlzLmRlY2tNb2RlbCk7XG5cdFx0fVxuXHR9LFxuXG5cdGxvYWRDYXJkczogZnVuY3Rpb24oZGVja01vZGVsKSB7XG5cdFx0Y29uc3QgY29sbGVjdGlvbnMgPSBbbmV3IENhcmRDb2xsZWN0aW9uKFtdLCB7IGRlY2s6IGRlY2tNb2RlbC5nZXQoXCJfaWRcIikgfSkubGF6eUZldGNoKCldO1xuXG5cdFx0UHJvbWlzZS5hbGwoY29sbGVjdGlvbnMpLnNwcmVhZChjYXJkQ29sbGVjdGlvbiA9PiB7XG5cdFx0XHR0aGlzLnN0b3BMaXN0ZW5pbmdUb0NhcmRDb2xsZWN0aW9uKCk7XG5cblx0XHRcdHRoaXMuY2FyZENvbGxlY3Rpb24gPSBjYXJkQ29sbGVjdGlvbjtcblx0XHRcdHRoaXMubGlzdGVuVG8odGhpcy5jYXJkQ29sbGVjdGlvbiwgXCJ1cGRhdGVcIiwgdGhpcy5vbkNhcmRDb2xsZWN0aW9uVXBkYXRlZC5iaW5kKHRoaXMsIGRlY2tNb2RlbC5jaWQpKTtcblxuXHRcdFx0dGhpcy5zaG93Q2FyZEVkaXRvcigpO1xuXG5cdFx0XHRCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS50cmlnZ2VyKFwiZGVjazpzaXplOnVwZGF0ZWRcIiwgZGVja01vZGVsLmNpZCwgdGhpcy5jYXJkQ29sbGVjdGlvbi5sZW5ndGgpO1xuXHRcdH0pLmNhdGNoKHRoaXMuc2hvd0NhcmRMb2FkRXJyb3IuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0b25DYXJkQ29sbGVjdGlvblVwZGF0ZWQ6IGZ1bmN0aW9uKGRlY2tNb2RlbENpZCkge1xuXHRcdEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJkZWNrOnNpemU6dXBkYXRlZFwiLCBkZWNrTW9kZWxDaWQsIHRoaXMuY2FyZENvbGxlY3Rpb24ubGVuZ3RoKTtcblx0fSxcblxuXHRzaG93Q2FyZExvYWRFcnJvcjogZnVuY3Rpb24oZXJyb3IpIHtcblx0XHRpZiAoIXNldHRpbmdzLmRlYnVnIHx8IHNldHRpbmdzLnJlcG9ydEVycm9ycylcblx0XHRcdHJheWd1bihcInNlbmRcIiwgZXJyb3IpO1xuXG5cdFx0dGhpcy5lcnJvck1vZGFsID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0d2FybmluZzogdHJ1ZSxcblx0XHRcdHRpdGxlOiBcIjxzcGFuIGNsYXNzPSdmYWwgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUnLz4gRXJyb3IgRmV0Y2hpbmcgRmxhc2hjYXJkc1wiLFxuXHRcdFx0Ym9keTogXCI8YnI+PHAgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz5BbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBmZXRjaGluZyBmbGFzaGNhcmRzLjwvcD5cIixcblx0XHRcdGhpZGVCdXR0b25zOiBbXCJjYW5jZWxcIl0sXG5cdFx0fSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXJyb3JNb2RhbCwgXCJidXR0b246b2tcIiwgKCkgPT4ge1xuXHRcdFx0dGhpcy5zdG9wTGlzdGVuaW5nKHRoaXMuZXJyb3JNb2RhbCk7XG5cdFx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5IaWRlRmxhc2hDYXJkV2lkZ2V0KTtcblx0XHR9KTtcblxuXHRcdHRoaXMuZXJyb3JNb2RhbC5zaG93KCk7XG5cdH0sXG5cblx0Y3JlYXRlRGVja0VkaXRvcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiZGVja1NlbGVjdG9yXCIsIG5ldyBEZWNrRWRpdG9yKHtcblx0XHRcdGNhblBsYXk6IGZhbHNlLFxuXHRcdFx0ZGVja0NvbGxlY3Rpb246IHRoaXMuZGVja0NvbGxlY3Rpb24sXG5cdFx0XHRwcmV2ZW50RGlzYWJsZUFkZE9uRGVja0FkZDogdHJ1ZSxcblx0XHRcdHNob3dFZGl0QnV0dG9uOiB0cnVlLFxuXHRcdH0pKTtcblx0fSxcblxuXHRmZXRjaERlY2tDb2xsZWN0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnJlbmRlckxvYWRpbmdTdGF0dXMoKTtcblxuXHRcdHRoaXMuZGVja0NvbGxlY3Rpb24gPSBuZXcgRGVja0NvbGxlY3Rpb24oW10sIHtcblx0XHRcdHBhZ2VTaXplOiAxMDAsXG5cdFx0XHR1cmw6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2ZsYXNoQ2FyZHNcIixcblx0XHR9KTtcblxuXHRcdHRoaXMubGlzdGVuVG9PbmNlKHRoaXMuZGVja0NvbGxlY3Rpb24sIFwic3luY1wiLCAoKSA9PiB7XG5cdFx0XHR0aGlzLnJlbmRlclBhZ2UoKTtcblxuXHRcdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmRlY2tDb2xsZWN0aW9uLCB7XG5cdFx0XHRcdHN5bmM6IHRoaXMub25EZWNrQ29sbGVjdGlvblN5bmMuYmluZCh0aGlzKSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zeW5jXG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdHRoaXMuZGVja0NvbGxlY3Rpb24uZ2V0Rmlyc3RCYXRjaCgpO1xuXHR9LFxuXG5cdG9uRGVja0NvbGxlY3Rpb25TeW5jOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIV8uaXNOaWwodGhpcy5kZWNrTW9kZWwpICYmICFfLmlzTmlsKHRoaXMuZGVja01vZGVsLmlkKSAmJiAhXy5pc05pbCh0aGlzLmRlY2tDb2xsZWN0aW9uLmdldCh0aGlzLmRlY2tNb2RlbC5pZCkpKVxuXHRcdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikudHJpZ2dlcihcImRlY2s6c2VsZWN0XCIsIHRoaXMuZGVja0NvbGxlY3Rpb24uZ2V0KHRoaXMuZGVja01vZGVsLmlkKS5jaWQsIHRydWUpO1xuXHRcdGVsc2Vcblx0XHRcdEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJkZWNrOnNlbGVjdFwiLCBudWxsKTtcblx0fSxcblxuXHRyZW5kZXJMb2FkaW5nU3RhdHVzOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJzdGF0dXNcIiwgbmV3IFN0YXR1c1ZpZXcoeyB0eXBlOiBcImxvYWRpbmdcIiB9KSk7XG5cdH0sXG5cblx0cmVuZGVyUGFnZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5zdGF0dXNSZWdpb24uYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkuYm9keS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5kZWNrU2VsZWN0b3JTbGlkZXIucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0dGhpcy5jcmVhdGVEZWNrRWRpdG9yKCk7XG5cdFx0dGhpcy5zaG93RGVja1RpdGxlKCk7XG5cdFx0dGhpcy5zaG93Q29udHJvbHMoeyBkaXNhYmxlZDogdHJ1ZSB9KTtcblx0fSxcblxuXHRzaG93RGVja1RpdGxlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJkZWNrVGl0bGVcIiwgbmV3IERlY2tUaXRsZSgpKTtcblx0fSxcblxuXHRzaG93Q2FyZEVkaXRvcjogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImNhcmRFZGl0b3JcIiwgbmV3IENhcmRFZGl0b3Ioe1xuXHRcdFx0Y2FyZENvbGxlY3Rpb246IHRoaXMuY2FyZENvbGxlY3Rpb24sXG5cdFx0XHRkZWNrQ29sbGVjdGlvbjogdGhpcy5kZWNrQ29sbGVjdGlvbixcblx0XHRcdGRlY2tNb2RlbDogdGhpcy5kZWNrTW9kZWwsXG5cdFx0XHRkaXNhYmxlZDogb3B0aW9ucyAmJiBvcHRpb25zLmRpc2FibGVkLFxuXHRcdH0pKTtcblx0fSxcblxuXHRzaG93Q29udHJvbHM6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLmNvbnRyb2xzVmlldyA9IG5ldyBDb250cm9scyhvcHRpb25zKTtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJjb250cm9sXCIsIHRoaXMuY29udHJvbHNWaWV3KTtcblx0fSxcblxuXHRzaG93RGVsZXRlQ29uZmlybWF0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmRlc3Ryb3lDb250cm9scygpO1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImNvbnRyb2xcIiwgbmV3IERlbGV0ZUNvbmZpcm1hdGlvbih7IG1vZGVsOiB0aGlzLm1vZGVsIH0pKTtcblx0fSxcblxuXHRzaG93RXJyb3I6IGZ1bmN0aW9uKG1lc3NhZ2UsIHByZXZpb3VzU3RhdGUpIHtcblx0XHR0aGlzLmRlc3Ryb3lDb250cm9scygpO1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImNvbnRyb2xcIiwgbmV3IENhcmRFcnJvcih7XG5cdFx0XHRtZXNzYWdlOiBtZXNzYWdlLFxuXHRcdFx0cHJldmlvdXNTdGF0ZSxcblx0XHR9KSk7XG5cdH0sXG5cblx0c2hvd1N0YXR1czogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5kZXN0cm95Q29udHJvbHMoKTtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJjb250cm9sXCIsIG5ldyBTdGF0dXMoKSk7XG5cdH0sXG5cblx0ZGVzdHJveUNvbnRyb2xzOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIV8uaXNOaWwodGhpcy5jb250cm9sc1ZpZXcpKSB7XG5cdFx0XHR0aGlzLmNvbnRyb2xzVmlldy5kZXN0cm95KCk7XG5cdFx0XHR0aGlzLmNvbnRyb2xzVmlldyA9IG51bGw7XG5cdFx0fVxuXHR9LFxuXG5cdHN0b3BMaXN0ZW5pbmdUb0NhcmRDb2xsZWN0aW9uOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5jYXJkQ29sbGVjdGlvbilcblx0XHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLmNhcmRDb2xsZWN0aW9uKTtcblx0fSxcblxuXHRzdG9wTGlzdGVuaW5nVG9EZWNrQ29sbGVjdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuZGVja0NvbGxlY3Rpb24pXG5cdFx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcodGhpcy5kZWNrQ29sbGVjdGlvbik7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcodGhpcy5kZWNrU2VsZWN0b3IpO1xuXHRcdHRoaXMuc3RvcExpc3RlbmluZ1RvQ2FyZENvbGxlY3Rpb24oKTtcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmdUb0RlY2tDb2xsZWN0aW9uKCk7XG5cblx0XHRpZiAodGhpcy5kZWNrQ29sbGVjdGlvbilcblx0XHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLmRlY2tDb2xsZWN0aW9uKTtcblx0fSxcbn0pO1xuIl19",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\n\nvar ConsoleEventBus = require(\"../../../educators/views/console/eventBus\");\nvar DeckModel = require(\"../../models/flashCards/deckModel\");\nvar ResourceModal = require(\"../../../lib/resourceModal\");\nvar tippy = require(\"tippy.js\").default;\n\nvar Header = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-deck-editor-header sub-header\",\n\n\ttemplate: require(\"../../templates/flashCards/deckEditor.nunj\").header,\n\n\tui: {\n\t\tbuttonAdd: \".button-add\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonAdd\": \"onButtonAddClick\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.preventDisableOnDeckAdd = options.preventDisableOnDeckAdd;\n\n\t\tthis.listenTo(Backbone.Radio.channel(\"flashCards\"), {\n\t\t\t\"card:add\": this.disable.bind(this),\n\t\t\t\"card:delete\": this.disable.bind(this),\n\t\t\t\"card:delete:reject\": this.enable.bind(this),\n\t\t\t\"card:delete:saved\": this.enable.bind(this),\n\t\t\t\"card:edit\": this.disable.bind(this),\n\t\t\t\"card:edit:reject\": this.enable.bind(this),\n\t\t\t\"card:edit:saved\": this.enable.bind(this),\n\n\t\t\t\"deck:add\": this.disable.bind(this),\n\t\t\t\"deck:add:cancelled\": this.enable.bind(this),\n\t\t\t\"deck:add:saved\": this.enable.bind(this),\n\t\t\t\"deck:delete\": this.disable.bind(this),\n\t\t\t\"deck:delete:reject\": this.enable.bind(this),\n\t\t\t\"deck:delete:saved\": this.enable.bind(this),\n\t\t\t\"deck:edit\": this.disable.bind(this),\n\t\t\t\"deck:edit:cancelled\": this.enable.bind(this),\n\t\t\t\"deck:edit:saved\": this.enable.bind(this)\n\t\t});\n\t},\n\n\tonRender: function onRender() {\n\t\t_.each([{\n\t\t\ttargetEl: this.ui.buttonAdd.get(0),\n\t\t\tcontent: \"Add a deck\"\n\t\t}], function (spec) {\n\t\t\treturn tippy(spec.targetEl, _.extend(_.omit(spec, [\"targetEl\"]), {\n\t\t\t\ttheme: \"black\",\n\t\t\t\tplacement: \"bottom\"\n\t\t\t}));\n\t\t});\n\t},\n\n\tonButtonAddClick: function onButtonAddClick() {\n\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"deck:add\");\n\t},\n\n\tdisable: function disable() {\n\t\tif (!this.preventDisableOnDeckAdd) this.$el.addClass(\"sub-header-disabled\");\n\t},\n\n\tenable: function enable() {\n\t\tthis.$el.removeClass(\"sub-header-disabled\");\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(Backbone.Radio.channel(\"flashCards\"));\n\t}\n});\n\nvar ListItemDisplay = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-editor-list-item-display\",\n\n\ttemplate: require(\"../../templates/flashCards/deckEditor.nunj\").listItemDisplay,\n\n\tui: {\n\t\tbuttonDelete: \".button-delete\",\n\t\tbuttonEdit: \".button-edit\",\n\t\tbuttonFullscreen: \".button-fullscreen\",\n\t\tbuttonPlay: \".button-play\",\n\t\tbuttonStop: \".button-stop\",\n\t\ttitleDisplay: \".flash-card-editor-list-item-title\",\n\t\tcountDisplay: \".flash-card-deck-editor-list-item-card-count\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonDelete\": \"onButtonDeleteClick\",\n\t\t\"click @ui.buttonEdit\": \"onButtonEditClick\",\n\t\t\"click @ui.buttonFullscreen\": \"onButtonFullscreen\",\n\t\t\"click @ui.buttonPlay\": \"onButtonPlayClick\",\n\t\t\"click @ui.buttonStop\": \"onButtonStopClick\",\n\t\t\"click @ui.titleDisplay\": \"onTitleClick\"\n\t},\n\n\tserializeData: function serializeData() {\n\t\treturn this.model.toJSON({ computed: true });\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this = this;\n\n\t\treturn {\n\t\t\tcanPlay: this.canPlay,\n\t\t\tcreatedDate: function createdDate() {\n\t\t\t\treturn moment.unix(_this.model.get(\"created\")).format(\"DD-MM-YYYY\");\n\t\t\t},\n\t\t\tupdatedDate: function updatedDate() {\n\t\t\t\treturn _this.model.has(\"updated\") && _this.model.get(\"updated\") ? moment.unix(_this.model.get(\"updated\")).format(\"DD-MM-YYYY\") : undefined;\n\t\t\t},\n\t\t\tshowEditButton: this.showEditButton\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.canPlay = options.canPlay;\n\t\tthis.showEditButton = options.showEditButton;\n\n\t\tthis.listenTo(Backbone.Radio.channel(\"flashCards\"), {\n\t\t\t\"cardList:shown\": this.onCardListShown.bind(this),\n\t\t\t\"deck:size:updated\": this.onDeckSizeUpdated.bind(this),\n\t\t\t\"player:fullscreen:entered\": this.onPlayerEnteredFullscreen.bind(this),\n\t\t\t\"player:fullscreen:exited\": this.onPlayerExitedFullscreen.bind(this),\n\t\t\t\"player:started\": this.onPlayerStarted.bind(this),\n\t\t\t\"player:stopped\": this.onPlayerStopped.bind(this)\n\t\t});\n\t},\n\n\tonRender: function onRender() {\n\t\t_.each([{\n\t\t\ttargetEl: this.ui.titleDisplay.get(0),\n\t\t\tcontent: \"Edit<br/>deck<br/>metadata\"\n\t\t}, {\n\t\t\ttargetEl: this.ui.buttonDelete.get(0),\n\t\t\tcontent: \"Delete deck\"\n\t\t}, {\n\t\t\ttargetEl: this.ui.buttonEdit.get(0),\n\t\t\tcontent: \"Add/edit flashcards\"\n\t\t}, {\n\t\t\ttargetEl: this.ui.buttonFullscreen.get(0),\n\t\t\tcontent: \"Fullscreen mode\"\n\t\t}, {\n\t\t\ttargetEl: this.ui.buttonPlay.get(0),\n\t\t\tcontent: \"Preview deck\"\n\t\t}, {\n\t\t\ttargetEl: this.ui.buttonStop.get(0),\n\t\t\tcontent: \"Stop preview\"\n\t\t}], function (spec) {\n\t\t\treturn tippy(spec.targetEl, _.extend(_.omit(spec, [\"targetEl\"]), {\n\t\t\t\ttheme: \"black\",\n\t\t\t\tplacement: \"bottom\"\n\t\t\t}));\n\t\t});\n\n\t\tthis.updateCardCount();\n\t},\n\n\tonDeckSizeUpdated: function onDeckSizeUpdated(deckModelCid, newSize) {\n\t\tif (this.model.cid === deckModelCid) this.updateCardCount(newSize);\n\t},\n\n\tupdateCardCount: function updateCardCount(deckSize) {\n\t\tvar flashCardCount = void 0;\n\n\t\tif (_.isNil(deckSize)) flashCardCount = this.model.get(\"flashCards\") ? this.model.get(\"flashCards\").length : 0;else flashCardCount = deckSize;\n\n\t\tthis.ui.countDisplay.text(flashCardCount + \" card\" + (flashCardCount === 1 ? \"\" : \"s\"));\n\t},\n\n\tonButtonDeleteClick: function onButtonDeleteClick(event) {\n\t\tevent.stopPropagation();\n\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"deck:delete\", this.model.cid);\n\t},\n\n\tonButtonEditClick: function onButtonEditClick(event) {\n\t\tevent.stopPropagation();\n\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"cards:edit\", this.model.cid);\n\t},\n\n\tonButtonFullscreen: function onButtonFullscreen(event) {\n\t\tevent.stopPropagation();\n\n\t\tif (this.ui.buttonFullscreen.hasClass(\"fa-expand-alt\")) Backbone.Radio.channel(\"flashCards\").trigger(\"player:fullscreen:enter\");else Backbone.Radio.channel(\"flashCards\").trigger(\"player:fullscreen:exit\");\n\t},\n\n\tonButtonPlayClick: function onButtonPlayClick(event) {\n\t\tevent.stopPropagation();\n\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"player:start\", this.model.cid);\n\t},\n\n\tonButtonStopClick: function onButtonStopClick(event) {\n\t\tevent.stopPropagation();\n\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"player:stop\", this.model.cid);\n\t},\n\n\tonTitleClick: function onTitleClick(event) {\n\t\tevent.stopPropagation();\n\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"deck:edit\", this.model.cid);\n\t},\n\n\tonCardListShown: function onCardListShown(modelCid) {\n\t\tif (this.model.cid === modelCid) this.showDeckEditorControls();\n\t},\n\n\tonPlayerEnteredFullscreen: function onPlayerEnteredFullscreen(modelCid) {\n\t\tif (this.model.cid === modelCid) {\n\t\t\tthis.ui.buttonFullscreen.removeClass(\"fa-expand-alt\");\n\t\t\tthis.ui.buttonFullscreen.addClass(\"fa-compress-alt\");\n\t\t}\n\t},\n\n\tonPlayerExitedFullscreen: function onPlayerExitedFullscreen(modelCid) {\n\t\tif (this.model.cid === modelCid) {\n\t\t\tthis.ui.buttonFullscreen.removeClass(\"fa-compress-alt\");\n\t\t\tthis.ui.buttonFullscreen.addClass(\"fa-expand-alt\");\n\t\t}\n\t},\n\n\tonPlayerStarted: function onPlayerStarted(modelCid) {\n\t\tif (this.model.cid === modelCid) this.showFlashCardPlayerControls();else this.showDeckEditorControls();\n\t},\n\n\tonPlayerStopped: function onPlayerStopped(modelCid) {\n\t\tif (this.model.cid === modelCid) this.showDeckEditorControls();\n\t},\n\n\tshowDeckEditorControls: function showDeckEditorControls() {\n\t\tthis.ui.buttonFullscreen.addClass(\"hide\");\n\t\tthis.ui.buttonStop.addClass(\"hide\");\n\n\t\tthis.ui.buttonDelete.removeClass(\"hide\");\n\n\t\tif (this.showEditButton) this.ui.buttonEdit.removeClass(\"hide\");\n\n\t\tthis.ui.buttonPlay.removeClass(\"hide\");\n\t},\n\n\tshowFlashCardPlayerControls: function showFlashCardPlayerControls() {\n\t\tthis.ui.buttonDelete.addClass(\"hide\");\n\t\tthis.ui.buttonEdit.addClass(\"hide\");\n\t\tthis.ui.buttonPlay.addClass(\"hide\");\n\n\t\tthis.ui.buttonFullscreen.removeClass(\"hide\");\n\t\tthis.ui.buttonStop.removeClass(\"hide\");\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(Backbone.Radio.channel(\"flashCards\"));\n\t}\n});\n\nvar ListItemEditor = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-editor-list-item-editor\",\n\n\ttemplate: require(\"../../templates/flashCards/deckEditor.nunj\").listItemEditor,\n\n\tui: {\n\t\tbuttonAccept: \".button-accept\",\n\t\tbuttonReject: \".button-reject\",\n\t\ttitleInput: \".flash-card-editor-list-item-text-container > input\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonAccept\": \"onButtonAcceptClick\",\n\t\t\"click @ui.buttonReject\": \"onButtonRejectClick\",\n\t\t\"keydown @ui.titleInput\": \"onTitleInputKeyDown\"\n\t},\n\n\tserializeData: function serializeData() {\n\t\treturn this.attributes || this.model.toJSON();\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.attributes = options.attributes;\n\t},\n\n\tonAttach: function onAttach() {\n\t\tthis.ui.titleInput.focus();\n\t\tthis.ui.titleInput.select();\n\t},\n\n\tonButtonAcceptClick: function onButtonAcceptClick(event) {\n\t\tevent.stopPropagation();\n\t\tthis.acceptInput();\n\t},\n\n\tonButtonRejectClick: function onButtonRejectClick(event) {\n\t\tevent.stopPropagation();\n\t\tthis.rejectInput();\n\t},\n\n\tonTitleInputKeyDown: function onTitleInputKeyDown(event) {\n\t\tif (event.which === 13) this.acceptInput();else if (event.which === 27) this.rejectInput();\n\t},\n\n\tacceptInput: function acceptInput() {\n\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"deck:edit:accept\", this.model.cid, { title: this.ui.titleInput.val() });\n\t},\n\n\trejectInput: function rejectInput() {\n\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"deck:edit:reject\", this.model.cid);\n\t}\n});\n\nvar ListItemDeleteConfirmation = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-editor-list-item-delete-confirmation\",\n\n\ttemplate: require(\"../../templates/flashCards/deckEditor.nunj\").listItemDeleteConfirmation,\n\n\tui: {\n\t\tbuttonAccept: \".button-accept\",\n\t\tbuttonReject: \".button-reject\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonAccept\": \"onButtonAcceptClick\",\n\t\t\"click @ui.buttonReject\": \"onButtonRejectClick\"\n\t},\n\n\tonRender: function onRender() {\n\t\t_.each([{\n\t\t\ttargetEl: this.ui.buttonAccept.get(0),\n\t\t\tcontent: \"Yes\"\n\t\t}, {\n\t\t\ttargetEl: this.ui.buttonReject.get(0),\n\t\t\tcontent: \"No\"\n\t\t}], function (spec) {\n\t\t\treturn tippy(spec.targetEl, _.extend(_.omit(spec, [\"targetEl\"]), {\n\t\t\t\ttheme: \"black\",\n\t\t\t\tplacement: \"bottom\"\n\t\t\t}));\n\t\t});\n\t},\n\n\tonButtonAcceptClick: function onButtonAcceptClick(event) {\n\t\tevent.stopPropagation();\n\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"deck:delete:accept\", this.model.cid);\n\t},\n\n\tonButtonRejectClick: function onButtonRejectClick(event) {\n\t\tevent.stopPropagation();\n\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"deck:delete:reject\", this.model.cid);\n\t}\n});\n\nvar ListItemError = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-editor-list-item-error\",\n\n\ttemplate: require(\"../../templates/flashCards/deckEditor.nunj\").listItemError,\n\n\tui: {\n\t\tbuttonDismiss: \".button-dismiss\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonDismiss\": \"onButtonDismissClicked\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tmessage: this.message\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.attributes = options.attributes;\n\t\tthis.message = options.message;\n\t\tthis.operation = options.operation;\n\t},\n\n\tonRender: function onRender() {\n\t\t_.each([{\n\t\t\ttargetEl: this.ui.buttonDismiss.get(0),\n\t\t\tcontent: \"Ok\"\n\t\t}], function (spec) {\n\t\t\treturn tippy(spec.targetEl, _.extend(_.omit(spec, [\"targetEl\"]), {\n\t\t\t\ttheme: \"black\",\n\t\t\t\tplacement: \"bottom\"\n\t\t\t}));\n\t\t});\n\t},\n\n\tonButtonDismissClicked: function onButtonDismissClicked(event) {\n\t\tevent.stopPropagation();\n\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"deck:\" + this.operation + \":error:ok\", this.model.cid, this.attributes);\n\t}\n});\n\nvar ListItemStatus = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-editor-list-item-status\",\n\n\ttemplate: require(\"../../templates/flashCards/deckEditor.nunj\").listItemStatus\n});\n\nvar ListItem = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-editor-list-item flash-card-deck-editor-list-item\",\n\n\ttemplate: require(\"../../templates/flashCards/deckEditor.nunj\").listItem,\n\n\tregions: {\n\t\tcontent: \".flash-card-editor-list-item-content-region\"\n\t},\n\n\tevents: {\n\t\tclick: \"onClick\"\n\t},\n\n\tmodelEvents: {\n\t\t\"change:description\": \"onResourceMetadataChanged\",\n\t\t\"change:language\": \"onResourceMetadataChanged\",\n\t\t\"change:studyYear\": \"onResourceMetadataChanged\",\n\t\t\"change:selected\": \"onDeckSelected\",\n\t\t\"change:subject\": \"onResourceMetadataChanged\",\n\t\t\"change:title\": \"onResourceMetadataChanged\",\n\t\t\"change:hidden\": \"onHiddenChanged\",\n\t\t\"change:updated\": \"onResourceMetadataChanged\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.canPlay = options.canPlay;\n\t\tthis.showEditButton = options.showEditButton;\n\n\t\tthis.listenTo(Backbone.Radio.channel(\"flashCards\"), {\n\t\t\t\"card:delete:saved\": this.onCardDeleteSaved.bind(this),\n\t\t\t\"card:edit\": this.onCardEdit.bind(this),\n\t\t\t\"card:edit:reject\": this.onCardEditRejected.bind(this),\n\t\t\t\"card:edit:saved\": this.onCardEditSaved.bind(this),\n\n\t\t\t\"deck:add:saved\": this.onDeckAdded.bind(this),\n\t\t\t\"deck:delete\": this.onDeckDelete.bind(this),\n\t\t\t\"deck:delete:reject\": this.onDeckDeleteRejected.bind(this),\n\t\t\t\"deck:delete:save\": this.onDeckDeleteSave.bind(this),\n\t\t\t\"deck:delete:save:error\": this.onDeckDeleteSaveError.bind(this),\n\t\t\t\"deck:delete:save:error:ok\": this.onDeckDeleteSaveErrorOk.bind(this),\n\t\t\t\"deck:delete:saved\": this.onDeckDeleteSaved.bind(this)\n\t\t});\n\t},\n\n\tonRender: function onRender() {\n\t\tif (this.model.has(\"selected\") && this.model.get(\"selected\")) this.select();\n\n\t\tthis.switchToDisplayMode();\n\t},\n\n\tonResourceMetadataChanged: function onResourceMetadataChanged() {\n\t\tthis.render();\n\t},\n\n\tonClick: function onClick() {\n\t\tif (!this.isSelected()) {\n\t\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"card:edit:reject\", this.cardModelCid);\n\t\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"deck:select\", this.model.cid);\n\t\t}\n\t},\n\n\tonCardDeleteSaved: function onCardDeleteSaved(cardModelCid, deckModelCid, updatedTimestamp) {\n\t\tif (this.model.cid === deckModelCid) this.model.set(\"updated\", updatedTimestamp);\n\t},\n\n\tonCardEdit: function onCardEdit(cardModelCid, options) {\n\t\tthis.cardModelCid = cardModelCid;\n\n\t\tif (options && !options.preventDisable) this.disable();\n\t},\n\n\tonCardEditRejected: function onCardEditRejected(cardModelCid) {\n\t\tif (this.cardModelCid === cardModelCid) this.cardModelCid = null;\n\n\t\tthis.enable();\n\t},\n\n\tonCardEditSaved: function onCardEditSaved(cardModelCid, deckModelCid, updatedTimestamp) {\n\t\tthis.enable();\n\n\t\tif (this.model.cid === deckModelCid) this.model.set(\"updated\", updatedTimestamp);\n\t},\n\n\tonDeckAdded: function onDeckAdded(modelCid) {\n\t\tif (this.model.cid === modelCid) {\n\t\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"card:edit:reject\");\n\t\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"deck:select\", this.model.cid);\n\t\t}\n\t},\n\n\tonDeckDelete: function onDeckDelete(modelCid) {\n\t\tif (this.model.cid === modelCid) this.switchToDeleteConfirmationMode();else this.disable();\n\t},\n\n\tonDeckDeleteRejected: function onDeckDeleteRejected(modelCid) {\n\t\tif (this.model.cid === modelCid) this.switchToDisplayMode();else this.enable();\n\t},\n\n\tonDeckDeleteSave: function onDeckDeleteSave(modelCid) {\n\t\tif (this.model.cid === modelCid) this.switchToStatusMode();\n\t},\n\n\tonDeckDeleteSaveError: function onDeckDeleteSaveError(modelCid) {\n\t\tif (this.model.cid === modelCid) this.switchToErrorMode(\"Error deleting deck.\", \"delete:save\");\n\t},\n\n\tonDeckDeleteSaveErrorOk: function onDeckDeleteSaveErrorOk(modelCid) {\n\t\tif (this.model.cid === modelCid) this.switchToDisplayMode();else this.enable();\n\t},\n\n\tonDeckDeleteSaved: function onDeckDeleteSaved(modelCid) {\n\t\tif (this.model.cid !== modelCid) this.enable();\n\t},\n\n\tonDeckSelected: function onDeckSelected() {\n\t\tif (this.model.has(\"selected\") && this.model.get(\"selected\")) this.select();else this.deselect();\n\t},\n\n\tdisable: function disable() {\n\t\tthis.$el.addClass(\"flash-card-editor-list-item-disabled-mode\");\n\t},\n\n\tenable: function enable() {\n\t\tthis.$el.removeClass(\"flash-card-editor-list-item-disabled-mode\");\n\t},\n\n\tisSelected: function isSelected() {\n\t\treturn this.$el.hasClass(\"flash-card-editor-list-item-selected\");\n\t},\n\n\tdeselect: function deselect() {\n\t\tthis.$el.removeClass(\"flash-card-editor-list-item-selected\");\n\t},\n\n\tselect: function select() {\n\t\tthis.$el.addClass(\"flash-card-editor-list-item-selected\");\n\t},\n\n\tswitchToDeleteConfirmationMode: function switchToDeleteConfirmationMode() {\n\t\tthis.showChildView(\"content\", new ListItemDeleteConfirmation({ model: this.model }));\n\t},\n\n\tswitchToDisplayMode: function switchToDisplayMode() {\n\t\tthis.showChildView(\"content\", new ListItemDisplay({\n\t\t\tcanPlay: this.canPlay,\n\t\t\tmodel: this.model,\n\t\t\tshowEditButton: this.showEditButton\n\t\t}));\n\t},\n\n\tswitchToEditMode: function switchToEditMode(attributes) {\n\t\tthis.showChildView(\"content\", new ListItemEditor({\n\t\t\tattributes: attributes,\n\t\t\tmodel: this.model\n\t\t}));\n\t},\n\n\tswitchToErrorMode: function switchToErrorMode(errorMessage, operation, attributes) {\n\t\tthis.showChildView(\"content\", new ListItemError({\n\t\t\tattributes: attributes,\n\t\t\tmessage: errorMessage,\n\t\t\tmodel: this.model,\n\t\t\toperation: operation\n\t\t}));\n\t},\n\n\tswitchToStatusMode: function switchToStatusMode() {\n\t\tthis.showChildView(\"content\", new ListItemStatus());\n\t},\n\n\tonHiddenChanged: function onHiddenChanged() {\n\t\tif (this.model.get(\"hidden\")) this.$el.addClass(\"hide\");else this.$el.removeClass(\"hide\");\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(this.model);\n\t}\n});\n\nvar EmptyList = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-empty-list\",\n\n\ttemplate: require(\"../../templates/flashCards/deckEditor.nunj\").emptyList\n});\n\nvar List = Backbone.Marionette.CollectionView.extend({\n\tclassName: \"flash-card-deck-editor-list\",\n\n\tchildView: ListItem,\n\n\temptyView: EmptyList,\n\n\tchildViewOptions: function childViewOptions() {\n\t\treturn {\n\t\t\tcanPlay: this.canPlay,\n\t\t\tshowEditButton: this.showEditButton\n\t\t};\n\t},\n\n\tevents: {\n\t\tscroll: \"onScroll\"\n\t},\n\n\tcollectionEvents: {\n\t\trequest: \"onCollectionRequest\",\n\t\tsync: \"onCollectionSync\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.canPlay = options.canPlay;\n\t\tthis.showEditButton = options.showEditButton;\n\n\t\tthis.listenTo(Backbone.Radio.channel(\"flashCards\"), {\n\t\t\t\"card:add\": this.disable.bind(this),\n\t\t\t\"card:delete\": this.disable.bind(this),\n\t\t\t\"card:delete:reject\": this.enable.bind(this),\n\t\t\t\"card:delete:saved\": this.enable.bind(this),\n\t\t\t\"card:edit\": this.onCardEdit.bind(this),\n\t\t\t\"card:edit:reject\": this.enable.bind(this),\n\t\t\t\"card:edit:saved\": this.enable.bind(this)\n\t\t});\n\t},\n\n\tdisable: function disable() {\n\t\tthis.$el.addClass(\"flash-card-editor-list-disabled\");\n\t},\n\n\tenable: function enable() {\n\t\tthis.$el.removeClass(\"flash-card-editor-list-disabled\");\n\t},\n\n\tonCardEdit: function onCardEdit(cardModelCid, options) {\n\t\tif (options && !options.preventDisable) this.disable();\n\t},\n\n\tonScroll: _.throttle(function (evt) {\n\t\t/* eslint-disable no-invalid-this */\n\n\t\tif (!this._fetching) {\n\t\t\tvar scrollPos = evt.currentTarget.scrollTop + this.$el.height();\n\t\t\tvar height = evt.currentTarget.scrollHeight;\n\n\t\t\tif (scrollPos / height > 0.9 && this.collection.hasNextBatch()) this.collection.getNextBatch();\n\t\t}\n\n\t\t/* eslint-enable no-invalid-this */\n\t}, 25),\n\n\tonCollectionRequest: function onCollectionRequest() {\n\t\tthis.$el.addClass(\"faded\");\n\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"deck:fetch\");\n\n\t\tthis._fetching = true;\n\t},\n\n\tonCollectionSync: function onCollectionSync() {\n\t\tthis.$el.removeClass(\"faded\");\n\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"deck:sync\");\n\n\t\tthis._fetching = false;\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(Backbone.Radio.channel(\"flashCards\"));\n\t}\n});\n\nvar TextFilter = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-deck-editor-text-filter\",\n\n\ttemplate: require(\"../../templates/flashCards/deckEditor.nunj\").textFilter,\n\n\tui: {\n\t\tinput: \".text-filter-input\",\n\t\tbuttonClear: \".button-clear\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonClear\": \"onButtonClearClick\",\n\t\t\"input @ui.input\": \"onInputChange\",\n\t\t\"keyup @ui.input\": \"onInputKeyUp\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tplaceholderText: this.placeholderText\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.filterAttribute = options.filterAttribute;\n\t\tthis.placeholderText = options.placeholderText || \"Type to search...\";\n\t},\n\n\tonButtonClearClick: function onButtonClearClick() {\n\t\tthis.ui.input.val(\"\");\n\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"deck:fetch\");\n\t\tthis.execute();\n\t},\n\n\tonInputChange: function onInputChange() {\n\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"deck:fetch\");\n\t\tthis.execute();\n\t},\n\n\tonInputKeyUp: function onInputKeyUp(event) {\n\t\tif (event.which === 27) {\n\t\t\tthis.ui.input.val(\"\");\n\t\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"deck:fetch\");\n\t\t\tthis.execute();\n\t\t}\n\t},\n\n\texecute: _.debounce(function () {\n\t\t/* eslint-disable no-invalid-this */\n\n\t\tvar inputValue = _.toLower(_.trim(this.ui.input.val()) || \"\");\n\n\t\tif (inputValue) {\n\t\t\tthis.ui.buttonClear.removeClass(\"hide\");\n\t\t\tthis.collection.setSearchTerms(inputValue);\n\t\t} else {\n\t\t\tthis.ui.buttonClear.addClass(\"hide\");\n\t\t\tthis.collection.setSearchTerms(null);\n\t\t}\n\n\t\t/* eslint-enable no-invalid-this */\n\t}, 400),\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.unbindEvents(this.collection, this.pagedCollectionEvents);\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-deck-editor\",\n\n\ttemplate: require(\"../../templates/flashCards/deckEditor.nunj\").layout,\n\n\tregions: {\n\t\theader: \".header-region\",\n\t\tfilter: \".filter-region\",\n\t\tlist: \".list-region\"\n\t},\n\n\tui: {\n\t\tdeckListSpinner: \".list-spinner\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.canPlay = options.canPlay;\n\t\tthis.preventDisableAddOnDeckAdd = options.preventDisableAddOnDeckAdd;\n\t\tthis.deckCollection = options.deckCollection;\n\t\tthis.showEditButton = options.showEditButton;\n\n\t\tthis.listenTo(Backbone.Radio.channel(\"flashCards\"), {\n\t\t\t\"deck:add\": this.addDeck.bind(this),\n\t\t\t\"deck:delete:accept\": this.onDeckDeleteAccepted.bind(this),\n\t\t\t\"deck:edit\": this.editDeck.bind(this),\n\t\t\t\"deck:fetch\": this.onDeckFetch.bind(this),\n\t\t\t\"deck:sync\": this.onDeckSync.bind(this) // eslint-disable-line no-sync\n\t\t});\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.showChildView(\"header\", new Header({ preventDisableOnDeckAdd: this.preventDisableAddOnDeckAdd }));\n\n\t\tthis.textFilter = new TextFilter({\n\t\t\tcollection: this.deckCollection,\n\t\t\tfilterAttribute: \"title\"\n\t\t});\n\t\tthis.showChildView(\"filter\", this.textFilter);\n\n\t\tthis.showChildView(\"list\", new List({\n\t\t\tcanPlay: this.canPlay,\n\t\t\tcollection: this.deckCollection,\n\t\t\tshowEditButton: this.showEditButton\n\t\t}));\n\t},\n\n\tgenerateTemporaryDeckTitle: function generateTemporaryDeckTitle() {\n\t\tvar _this2 = this;\n\n\t\tvar temporaryTitle = \"New Deck\";\n\t\tvar i = 0;\n\n\t\tvar isDuplicateTitle = function isDuplicateTitle(title) {\n\t\t\treturn _.find(_this2.deckCollection.models, function (d) {\n\t\t\t\treturn d.get(\"title\") === title;\n\t\t\t}) !== undefined;\n\t\t};\n\n\t\twhile (isDuplicateTitle(temporaryTitle)) {\n\t\t\ti++;\n\t\t\ttemporaryTitle = \"New Deck (\" + i + \")\";\n\t\t}\n\n\t\treturn temporaryTitle;\n\t},\n\n\taddDeck: function addDeck() {\n\t\tvar _this3 = this;\n\n\t\tvar currentBook = ConsoleEventBus.request(ConsoleEventBus.Events.GetCurrentBook);\n\t\tvar currentGroup = ConsoleEventBus.request(ConsoleEventBus.Events.GetCurrentGroup);\n\t\tvar deckModel = new DeckModel();\n\n\t\tif (currentBook && currentBook.has && currentBook.has(\"metadata\") && currentBook.get(\"metadata\")) {\n\t\t\tdeckModel.set({\n\t\t\t\tlanguage: currentBook.get(\"metadata\").language,\n\t\t\t\tstudyYear: currentBook.get(\"metadata\").grade,\n\t\t\t\tsubject: currentBook.get(\"subject\"),\n\t\t\t\tsubject_name: currentBook.get(\"metadata\").subject\n\t\t\t});\n\t\t} else if (currentGroup && currentGroup.id) {\n\t\t\tdeckModel.set({\n\t\t\t\tlanguage: currentGroup.get(\"language\"),\n\t\t\t\tstudyYear: currentGroup.get(\"grade\"),\n\t\t\t\tsubject: currentGroup.get(\"subject_id\") || currentGroup.get(\"subject\"),\n\t\t\t\tsubject_name: currentGroup.get(\"subject_name\") || currentGroup.get(\"subject\")\n\t\t\t});\n\t\t}\n\n\t\tvar modal = new ResourceModal({\n\t\t\tdisableBatchCreate: true,\n\t\t\tlockCategory: true,\n\t\t\tmodel: deckModel\n\t\t});\n\n\t\tmodal.show({\n\t\t\tcreate: function create(result) {\n\t\t\t\tresult.model.clearFiles();\n\t\t\t\t_this3.deckCollection.add(result.model, { at: 0 });\n\t\t\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"deck:add:saved\", result.model.cid);\n\t\t\t},\n\t\t\tcancel: function cancel() {\n\t\t\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"deck:add:cancelled\", null);\n\t\t\t}\n\t\t});\n\t},\n\n\teditDeck: function editDeck(modelCid) {\n\t\tvar deckModel = this.deckCollection.get(modelCid);\n\t\tvar modal = new ResourceModal({ model: deckModel });\n\n\t\tmodal.show({\n\t\t\tupdate: function update(result) {\n\t\t\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"deck:edit:saved\", result.model.cid);\n\t\t\t},\n\t\t\tcancel: function cancel() {\n\t\t\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"deck:edit:cancelled\", null);\n\t\t\t}\n\t\t});\n\t},\n\n\tonDeckFetch: function onDeckFetch() {\n\t\tthis.ui.deckListSpinner.removeClass(\"hide\");\n\t},\n\n\tonDeckSync: function onDeckSync() {\n\t\tthis.ui.deckListSpinner.addClass(\"hide\");\n\t},\n\n\tonDeckDeleteAccepted: function onDeckDeleteAccepted(modelCid) {\n\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"deck:delete:save\", modelCid);\n\n\t\tvar deckModel = this.deckCollection.get(modelCid);\n\n\t\tdeckModel.destroy({\n\t\t\twait: true,\n\n\t\t\tsuccess: function success() {\n\t\t\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"deck:delete:saved\", modelCid);\n\t\t\t},\n\n\t\t\terror: function error() {\n\t\t\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"deck:delete:save:error\", modelCid);\n\t\t\t}\n\t\t});\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(Backbone.Radio.channel(\"flashCards\"));\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRlY2tFZGl0b3IuanMiXSwibmFtZXMiOlsiXyIsInJlcXVpcmUiLCJCYWNrYm9uZSIsIm1vbWVudCIsIkNvbnNvbGVFdmVudEJ1cyIsIkRlY2tNb2RlbCIsIlJlc291cmNlTW9kYWwiLCJ0aXBweSIsImRlZmF1bHQiLCJIZWFkZXIiLCJNYXJpb25ldHRlIiwiVmlldyIsImV4dGVuZCIsImNsYXNzTmFtZSIsInRlbXBsYXRlIiwiaGVhZGVyIiwidWkiLCJidXR0b25BZGQiLCJldmVudHMiLCJpbml0aWFsaXplIiwib3B0aW9ucyIsInByZXZlbnREaXNhYmxlT25EZWNrQWRkIiwibGlzdGVuVG8iLCJSYWRpbyIsImNoYW5uZWwiLCJkaXNhYmxlIiwiYmluZCIsImVuYWJsZSIsIm9uUmVuZGVyIiwiZWFjaCIsInRhcmdldEVsIiwiZ2V0IiwiY29udGVudCIsInNwZWMiLCJvbWl0IiwidGhlbWUiLCJwbGFjZW1lbnQiLCJvbkJ1dHRvbkFkZENsaWNrIiwidHJpZ2dlciIsIiRlbCIsImFkZENsYXNzIiwicmVtb3ZlQ2xhc3MiLCJvbkJlZm9yZURlc3Ryb3kiLCJzdG9wTGlzdGVuaW5nIiwiTGlzdEl0ZW1EaXNwbGF5IiwibGlzdEl0ZW1EaXNwbGF5IiwiYnV0dG9uRGVsZXRlIiwiYnV0dG9uRWRpdCIsImJ1dHRvbkZ1bGxzY3JlZW4iLCJidXR0b25QbGF5IiwiYnV0dG9uU3RvcCIsInRpdGxlRGlzcGxheSIsImNvdW50RGlzcGxheSIsInNlcmlhbGl6ZURhdGEiLCJtb2RlbCIsInRvSlNPTiIsImNvbXB1dGVkIiwidGVtcGxhdGVDb250ZXh0IiwiY2FuUGxheSIsImNyZWF0ZWREYXRlIiwidW5peCIsImZvcm1hdCIsInVwZGF0ZWREYXRlIiwiaGFzIiwidW5kZWZpbmVkIiwic2hvd0VkaXRCdXR0b24iLCJvbkNhcmRMaXN0U2hvd24iLCJvbkRlY2tTaXplVXBkYXRlZCIsIm9uUGxheWVyRW50ZXJlZEZ1bGxzY3JlZW4iLCJvblBsYXllckV4aXRlZEZ1bGxzY3JlZW4iLCJvblBsYXllclN0YXJ0ZWQiLCJvblBsYXllclN0b3BwZWQiLCJ1cGRhdGVDYXJkQ291bnQiLCJkZWNrTW9kZWxDaWQiLCJuZXdTaXplIiwiY2lkIiwiZGVja1NpemUiLCJmbGFzaENhcmRDb3VudCIsImlzTmlsIiwibGVuZ3RoIiwidGV4dCIsIm9uQnV0dG9uRGVsZXRlQ2xpY2siLCJldmVudCIsInN0b3BQcm9wYWdhdGlvbiIsIm9uQnV0dG9uRWRpdENsaWNrIiwib25CdXR0b25GdWxsc2NyZWVuIiwiaGFzQ2xhc3MiLCJvbkJ1dHRvblBsYXlDbGljayIsIm9uQnV0dG9uU3RvcENsaWNrIiwib25UaXRsZUNsaWNrIiwibW9kZWxDaWQiLCJzaG93RGVja0VkaXRvckNvbnRyb2xzIiwic2hvd0ZsYXNoQ2FyZFBsYXllckNvbnRyb2xzIiwiTGlzdEl0ZW1FZGl0b3IiLCJsaXN0SXRlbUVkaXRvciIsImJ1dHRvbkFjY2VwdCIsImJ1dHRvblJlamVjdCIsInRpdGxlSW5wdXQiLCJhdHRyaWJ1dGVzIiwib25BdHRhY2giLCJmb2N1cyIsInNlbGVjdCIsIm9uQnV0dG9uQWNjZXB0Q2xpY2siLCJhY2NlcHRJbnB1dCIsIm9uQnV0dG9uUmVqZWN0Q2xpY2siLCJyZWplY3RJbnB1dCIsIm9uVGl0bGVJbnB1dEtleURvd24iLCJ3aGljaCIsInRpdGxlIiwidmFsIiwiTGlzdEl0ZW1EZWxldGVDb25maXJtYXRpb24iLCJsaXN0SXRlbURlbGV0ZUNvbmZpcm1hdGlvbiIsIkxpc3RJdGVtRXJyb3IiLCJsaXN0SXRlbUVycm9yIiwiYnV0dG9uRGlzbWlzcyIsIm1lc3NhZ2UiLCJvcGVyYXRpb24iLCJvbkJ1dHRvbkRpc21pc3NDbGlja2VkIiwiTGlzdEl0ZW1TdGF0dXMiLCJsaXN0SXRlbVN0YXR1cyIsIkxpc3RJdGVtIiwibGlzdEl0ZW0iLCJyZWdpb25zIiwiY2xpY2siLCJtb2RlbEV2ZW50cyIsIm9uQ2FyZERlbGV0ZVNhdmVkIiwib25DYXJkRWRpdCIsIm9uQ2FyZEVkaXRSZWplY3RlZCIsIm9uQ2FyZEVkaXRTYXZlZCIsIm9uRGVja0FkZGVkIiwib25EZWNrRGVsZXRlIiwib25EZWNrRGVsZXRlUmVqZWN0ZWQiLCJvbkRlY2tEZWxldGVTYXZlIiwib25EZWNrRGVsZXRlU2F2ZUVycm9yIiwib25EZWNrRGVsZXRlU2F2ZUVycm9yT2siLCJvbkRlY2tEZWxldGVTYXZlZCIsInN3aXRjaFRvRGlzcGxheU1vZGUiLCJvblJlc291cmNlTWV0YWRhdGFDaGFuZ2VkIiwicmVuZGVyIiwib25DbGljayIsImlzU2VsZWN0ZWQiLCJjYXJkTW9kZWxDaWQiLCJ1cGRhdGVkVGltZXN0YW1wIiwic2V0IiwicHJldmVudERpc2FibGUiLCJzd2l0Y2hUb0RlbGV0ZUNvbmZpcm1hdGlvbk1vZGUiLCJzd2l0Y2hUb1N0YXR1c01vZGUiLCJzd2l0Y2hUb0Vycm9yTW9kZSIsIm9uRGVja1NlbGVjdGVkIiwiZGVzZWxlY3QiLCJzaG93Q2hpbGRWaWV3Iiwic3dpdGNoVG9FZGl0TW9kZSIsImVycm9yTWVzc2FnZSIsIm9uSGlkZGVuQ2hhbmdlZCIsIkVtcHR5TGlzdCIsImVtcHR5TGlzdCIsIkxpc3QiLCJDb2xsZWN0aW9uVmlldyIsImNoaWxkVmlldyIsImVtcHR5VmlldyIsImNoaWxkVmlld09wdGlvbnMiLCJzY3JvbGwiLCJjb2xsZWN0aW9uRXZlbnRzIiwicmVxdWVzdCIsInN5bmMiLCJvblNjcm9sbCIsInRocm90dGxlIiwiZXZ0IiwiX2ZldGNoaW5nIiwic2Nyb2xsUG9zIiwiY3VycmVudFRhcmdldCIsInNjcm9sbFRvcCIsImhlaWdodCIsInNjcm9sbEhlaWdodCIsImNvbGxlY3Rpb24iLCJoYXNOZXh0QmF0Y2giLCJnZXROZXh0QmF0Y2giLCJvbkNvbGxlY3Rpb25SZXF1ZXN0Iiwib25Db2xsZWN0aW9uU3luYyIsIlRleHRGaWx0ZXIiLCJ0ZXh0RmlsdGVyIiwiaW5wdXQiLCJidXR0b25DbGVhciIsInBsYWNlaG9sZGVyVGV4dCIsImZpbHRlckF0dHJpYnV0ZSIsIm9uQnV0dG9uQ2xlYXJDbGljayIsImV4ZWN1dGUiLCJvbklucHV0Q2hhbmdlIiwib25JbnB1dEtleVVwIiwiZGVib3VuY2UiLCJpbnB1dFZhbHVlIiwidG9Mb3dlciIsInRyaW0iLCJzZXRTZWFyY2hUZXJtcyIsInVuYmluZEV2ZW50cyIsInBhZ2VkQ29sbGVjdGlvbkV2ZW50cyIsIm1vZHVsZSIsImV4cG9ydHMiLCJsYXlvdXQiLCJmaWx0ZXIiLCJsaXN0IiwiZGVja0xpc3RTcGlubmVyIiwicHJldmVudERpc2FibGVBZGRPbkRlY2tBZGQiLCJkZWNrQ29sbGVjdGlvbiIsImFkZERlY2siLCJvbkRlY2tEZWxldGVBY2NlcHRlZCIsImVkaXREZWNrIiwib25EZWNrRmV0Y2giLCJvbkRlY2tTeW5jIiwiZ2VuZXJhdGVUZW1wb3JhcnlEZWNrVGl0bGUiLCJ0ZW1wb3JhcnlUaXRsZSIsImkiLCJpc0R1cGxpY2F0ZVRpdGxlIiwiZmluZCIsIm1vZGVscyIsImQiLCJjdXJyZW50Qm9vayIsIkV2ZW50cyIsIkdldEN1cnJlbnRCb29rIiwiY3VycmVudEdyb3VwIiwiR2V0Q3VycmVudEdyb3VwIiwiZGVja01vZGVsIiwibGFuZ3VhZ2UiLCJzdHVkeVllYXIiLCJncmFkZSIsInN1YmplY3QiLCJzdWJqZWN0X25hbWUiLCJpZCIsIm1vZGFsIiwiZGlzYWJsZUJhdGNoQ3JlYXRlIiwibG9ja0NhdGVnb3J5Iiwic2hvdyIsImNyZWF0ZSIsInJlc3VsdCIsImNsZWFyRmlsZXMiLCJhZGQiLCJhdCIsImNhbmNlbCIsInVwZGF0ZSIsImRlc3Ryb3kiLCJ3YWl0Iiwic3VjY2VzcyIsImVycm9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLFdBQVdELFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1FLFNBQVNGLFFBQVEsUUFBUixDQUFmOztBQUVBLElBQU1HLGtCQUFrQkgsUUFBUSwyQ0FBUixDQUF4QjtBQUNBLElBQU1JLFlBQVlKLFFBQVEsbUNBQVIsQ0FBbEI7QUFDQSxJQUFNSyxnQkFBZ0JMLFFBQVEsNEJB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ID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgbW9tZW50ID0gcmVxdWlyZShcIm1vbWVudFwiKTtcblxuY29uc3QgQ29uc29sZUV2ZW50QnVzID0gcmVxdWlyZShcIi4uLy4uLy4uL2VkdWNhdG9ycy92aWV3cy9jb25zb2xlL2V2ZW50QnVzXCIpO1xuY29uc3QgRGVja01vZGVsID0gcmVxdWlyZShcIi4uLy4uL21vZGVscy9mbGFzaENhcmRzL2RlY2tNb2RlbFwiKTtcbmNvbnN0IFJlc291cmNlTW9kYWwgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL3Jlc291cmNlTW9kYWxcIik7XG5jb25zdCB0aXBweSA9IHJlcXVpcmUoXCJ0aXBweS5qc1wiKS5kZWZhdWx0O1xuXG5jb25zdCBIZWFkZXIgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImZsYXNoLWNhcmQtZGVjay1lZGl0b3ItaGVhZGVyIHN1Yi1oZWFkZXJcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9mbGFzaENhcmRzL2RlY2tFZGl0b3IubnVualwiKS5oZWFkZXIsXG5cblx0dWk6IHtcblx0XHRidXR0b25BZGQ6IFwiLmJ1dHRvbi1hZGRcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5idXR0b25BZGRcIjogXCJvbkJ1dHRvbkFkZENsaWNrXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMucHJldmVudERpc2FibGVPbkRlY2tBZGQgPSBvcHRpb25zLnByZXZlbnREaXNhYmxlT25EZWNrQWRkO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKSwge1xuXHRcdFx0XCJjYXJkOmFkZFwiOiB0aGlzLmRpc2FibGUuYmluZCh0aGlzKSxcblx0XHRcdFwiY2FyZDpkZWxldGVcIjogdGhpcy5kaXNhYmxlLmJpbmQodGhpcyksXG5cdFx0XHRcImNhcmQ6ZGVsZXRlOnJlamVjdFwiOiB0aGlzLmVuYWJsZS5iaW5kKHRoaXMpLFxuXHRcdFx0XCJjYXJkOmRlbGV0ZTpzYXZlZFwiOiB0aGlzLmVuYWJsZS5iaW5kKHRoaXMpLFxuXHRcdFx0XCJjYXJkOmVkaXRcIjogdGhpcy5kaXNhYmxlLmJpbmQodGhpcyksXG5cdFx0XHRcImNhcmQ6ZWRpdDpyZWplY3RcIjogdGhpcy5lbmFibGUuYmluZCh0aGlzKSxcblx0XHRcdFwiY2FyZDplZGl0OnNhdmVkXCI6IHRoaXMuZW5hYmxlLmJpbmQodGhpcyksXG5cblx0XHRcdFwiZGVjazphZGRcIjogdGhpcy5kaXNhYmxlLmJpbmQodGhpcyksXG5cdFx0XHRcImRlY2s6YWRkOmNhbmNlbGxlZFwiOiB0aGlzLmVuYWJsZS5iaW5kKHRoaXMpLFxuXHRcdFx0XCJkZWNrOmFkZDpzYXZlZFwiOiB0aGlzLmVuYWJsZS5iaW5kKHRoaXMpLFxuXHRcdFx0XCJkZWNrOmRlbGV0ZVwiOiB0aGlzLmRpc2FibGUuYmluZCh0aGlzKSxcblx0XHRcdFwiZGVjazpkZWxldGU6cmVqZWN0XCI6IHRoaXMuZW5hYmxlLmJpbmQodGhpcyksXG5cdFx0XHRcImRlY2s6ZGVsZXRlOnNhdmVkXCI6IHRoaXMuZW5hYmxlLmJpbmQodGhpcyksXG5cdFx0XHRcImRlY2s6ZWRpdFwiOiB0aGlzLmRpc2FibGUuYmluZCh0aGlzKSxcblx0XHRcdFwiZGVjazplZGl0OmNhbmNlbGxlZFwiOiB0aGlzLmVuYWJsZS5iaW5kKHRoaXMpLFxuXHRcdFx0XCJkZWNrOmVkaXQ6c2F2ZWRcIjogdGhpcy5lbmFibGUuYmluZCh0aGlzKSxcblx0XHR9KTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Xy5lYWNoKFtcblx0XHRcdHtcblx0XHRcdFx0dGFyZ2V0RWw6IHRoaXMudWkuYnV0dG9uQWRkLmdldCgwKSxcblx0XHRcdFx0Y29udGVudDogXCJBZGQgYSBkZWNrXCIsXG5cdFx0XHR9LFxuXHRcdF0sIHNwZWMgPT4gdGlwcHkoc3BlYy50YXJnZXRFbCwgXy5leHRlbmQoXy5vbWl0KHNwZWMsIFtcInRhcmdldEVsXCJdKSwge1xuXHRcdFx0dGhlbWU6IFwiYmxhY2tcIixcblx0XHRcdHBsYWNlbWVudDogXCJib3R0b21cIixcblx0XHR9KSkpO1xuXHR9LFxuXG5cdG9uQnV0dG9uQWRkQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJkZWNrOmFkZFwiKTtcblx0fSxcblxuXHRkaXNhYmxlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIXRoaXMucHJldmVudERpc2FibGVPbkRlY2tBZGQpXG5cdFx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcInN1Yi1oZWFkZXItZGlzYWJsZWRcIik7XG5cdH0sXG5cblx0ZW5hYmxlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyhcInN1Yi1oZWFkZXItZGlzYWJsZWRcIik7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcoQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikpO1xuXHR9LFxufSk7XG5cbmNvbnN0IExpc3RJdGVtRGlzcGxheSA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZmxhc2gtY2FyZC1lZGl0b3ItbGlzdC1pdGVtLWRpc3BsYXlcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9mbGFzaENhcmRzL2RlY2tFZGl0b3IubnVualwiKS5saXN0SXRlbURpc3BsYXksXG5cblx0dWk6IHtcblx0XHRidXR0b25EZWxldGU6IFwiLmJ1dHRvbi1kZWxldGVcIixcblx0XHRidXR0b25FZGl0OiBcIi5idXR0b24tZWRpdFwiLFxuXHRcdGJ1dHRvbkZ1bGxzY3JlZW46IFwiLmJ1dHRvbi1mdWxsc2NyZWVuXCIsXG5cdFx0YnV0dG9uUGxheTogXCIuYnV0dG9uLXBsYXlcIixcblx0XHRidXR0b25TdG9wOiBcIi5idXR0b24tc3RvcFwiLFxuXHRcdHRpdGxlRGlzcGxheTogXCIuZmxhc2gtY2FyZC1lZGl0b3ItbGlzdC1pdGVtLXRpdGxlXCIsXG5cdFx0Y291bnREaXNwbGF5OiBcIi5mbGFzaC1jYXJkLWRlY2stZWRpdG9yLWxpc3QtaXRlbS1jYXJkLWNvdW50XCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkuYnV0dG9uRGVsZXRlXCI6IFwib25CdXR0b25EZWxldGVDbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmJ1dHRvbkVkaXRcIjogXCJvbkJ1dHRvbkVkaXRDbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmJ1dHRvbkZ1bGxzY3JlZW5cIjogXCJvbkJ1dHRvbkZ1bGxzY3JlZW5cIixcblx0XHRcImNsaWNrIEB1aS5idXR0b25QbGF5XCI6IFwib25CdXR0b25QbGF5Q2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5idXR0b25TdG9wXCI6IFwib25CdXR0b25TdG9wQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS50aXRsZURpc3BsYXlcIjogXCJvblRpdGxlQ2xpY2tcIixcblx0fSxcblxuXHRzZXJpYWxpemVEYXRhOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tb2RlbC50b0pTT04oeyBjb21wdXRlZDogdHJ1ZSB9KTtcblx0fSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRjYW5QbGF5OiB0aGlzLmNhblBsYXksXG5cdFx0XHRjcmVhdGVkRGF0ZTogKCkgPT4gbW9tZW50LnVuaXgodGhpcy5tb2RlbC5nZXQoXCJjcmVhdGVkXCIpKS5mb3JtYXQoXCJERC1NTS1ZWVlZXCIpLFxuXHRcdFx0dXBkYXRlZERhdGU6ICgpID0+ICh0aGlzLm1vZGVsLmhhcyhcInVwZGF0ZWRcIikgJiYgdGhpcy5tb2RlbC5nZXQoXCJ1cGRhdGVkXCIpID8gbW9tZW50LnVuaXgodGhpcy5tb2RlbC5nZXQoXCJ1cGRhdGVkXCIpKS5mb3JtYXQoXCJERC1NTS1ZWVlZXCIpIDogdW5kZWZpbmVkKSxcblx0XHRcdHNob3dFZGl0QnV0dG9uOiB0aGlzLnNob3dFZGl0QnV0dG9uLFxuXHRcdH07XG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuY2FuUGxheSA9IG9wdGlvbnMuY2FuUGxheTtcblx0XHR0aGlzLnNob3dFZGl0QnV0dG9uID0gb3B0aW9ucy5zaG93RWRpdEJ1dHRvbjtcblxuXHRcdHRoaXMubGlzdGVuVG8oQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIiksIHtcblx0XHRcdFwiY2FyZExpc3Q6c2hvd25cIjogdGhpcy5vbkNhcmRMaXN0U2hvd24uYmluZCh0aGlzKSxcblx0XHRcdFwiZGVjazpzaXplOnVwZGF0ZWRcIjogdGhpcy5vbkRlY2tTaXplVXBkYXRlZC5iaW5kKHRoaXMpLFxuXHRcdFx0XCJwbGF5ZXI6ZnVsbHNjcmVlbjplbnRlcmVkXCI6IHRoaXMub25QbGF5ZXJFbnRlcmVkRnVsbHNjcmVlbi5iaW5kKHRoaXMpLFxuXHRcdFx0XCJwbGF5ZXI6ZnVsbHNjcmVlbjpleGl0ZWRcIjogdGhpcy5vblBsYXllckV4aXRlZEZ1bGxzY3JlZW4uYmluZCh0aGlzKSxcblx0XHRcdFwicGxheWVyOnN0YXJ0ZWRcIjogdGhpcy5vblBsYXllclN0YXJ0ZWQuYmluZCh0aGlzKSxcblx0XHRcdFwicGxheWVyOnN0b3BwZWRcIjogdGhpcy5vblBsYXllclN0b3BwZWQuYmluZCh0aGlzKSxcblx0XHR9KTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Xy5lYWNoKFtcblx0XHRcdHtcblx0XHRcdFx0dGFyZ2V0RWw6IHRoaXMudWkudGl0bGVEaXNwbGF5LmdldCgwKSxcblx0XHRcdFx0Y29udGVudDogXCJFZGl0PGJyLz5kZWNrPGJyLz5tZXRhZGF0YVwiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0dGFyZ2V0RWw6IHRoaXMudWkuYnV0dG9uRGVsZXRlLmdldCgwKSxcblx0XHRcdFx0Y29udGVudDogXCJEZWxldGUgZGVja1wiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0dGFyZ2V0RWw6IHRoaXMudWkuYnV0dG9uRWRpdC5nZXQoMCksXG5cdFx0XHRcdGNvbnRlbnQ6IFwiQWRkL2VkaXQgZmxhc2hjYXJkc1wiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0dGFyZ2V0RWw6IHRoaXMudWkuYnV0dG9uRnVsbHNjcmVlbi5nZXQoMCksXG5cdFx0XHRcdGNvbnRlbnQ6IFwiRnVsbHNjcmVlbiBtb2RlXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHR0YXJnZXRFbDogdGhpcy51aS5idXR0b25QbGF5LmdldCgwKSxcblx0XHRcdFx0Y29udGVudDogXCJQcmV2aWV3IGRlY2tcIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHRhcmdldEVsOiB0aGlzLnVpLmJ1dHRvblN0b3AuZ2V0KDApLFxuXHRcdFx0XHRjb250ZW50OiBcIlN0b3AgcHJldmlld1wiLFxuXHRcdFx0fSxcblx0XHRdLCBzcGVjID0+IHRpcHB5KHNwZWMudGFyZ2V0RWwsIF8uZXh0ZW5kKF8ub21pdChzcGVjLCBbXCJ0YXJnZXRFbFwiXSksIHtcblx0XHRcdHRoZW1lOiBcImJsYWNrXCIsXG5cdFx0XHRwbGFjZW1lbnQ6IFwiYm90dG9tXCIsXG5cdFx0fSkpKTtcblxuXHRcdHRoaXMudXBkYXRlQ2FyZENvdW50KCk7XG5cdH0sXG5cblx0b25EZWNrU2l6ZVVwZGF0ZWQ6IGZ1bmN0aW9uKGRlY2tNb2RlbENpZCwgbmV3U2l6ZSkge1xuXHRcdGlmICh0aGlzLm1vZGVsLmNpZCA9PT0gZGVja01vZGVsQ2lkKVxuXHRcdFx0dGhpcy51cGRhdGVDYXJkQ291bnQobmV3U2l6ZSk7XG5cdH0sXG5cblx0dXBkYXRlQ2FyZENvdW50OiBmdW5jdGlvbihkZWNrU2l6ZSkge1xuXHRcdGxldCBmbGFzaENhcmRDb3VudDtcblxuXHRcdGlmIChfLmlzTmlsKGRlY2tTaXplKSlcblx0XHRcdGZsYXNoQ2FyZENvdW50ID0gdGhpcy5tb2RlbC5nZXQoXCJmbGFzaENhcmRzXCIpID8gdGhpcy5tb2RlbC5nZXQoXCJmbGFzaENhcmRzXCIpLmxlbmd0aCA6IDA7XG5cdFx0ZWxzZVxuXHRcdFx0Zmxhc2hDYXJkQ291bnQgPSBkZWNrU2l6ZTtcblxuXHRcdHRoaXMudWkuY291bnREaXNwbGF5LnRleHQoZmxhc2hDYXJkQ291bnQgKyBcIiBjYXJkXCIgKyAoZmxhc2hDYXJkQ291bnQgPT09IDEgPyBcIlwiIDogXCJzXCIpKTtcblx0fSxcblxuXHRvbkJ1dHRvbkRlbGV0ZUNsaWNrOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJkZWNrOmRlbGV0ZVwiLCB0aGlzLm1vZGVsLmNpZCk7XG5cdH0sXG5cblx0b25CdXR0b25FZGl0Q2xpY2s6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikudHJpZ2dlcihcImNhcmRzOmVkaXRcIiwgdGhpcy5tb2RlbC5jaWQpO1xuXHR9LFxuXG5cdG9uQnV0dG9uRnVsbHNjcmVlbjogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGlmICh0aGlzLnVpLmJ1dHRvbkZ1bGxzY3JlZW4uaGFzQ2xhc3MoXCJmYS1leHBhbmQtYWx0XCIpKVxuXHRcdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikudHJpZ2dlcihcInBsYXllcjpmdWxsc2NyZWVuOmVudGVyXCIpO1xuXHRcdGVsc2Vcblx0XHRcdEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJwbGF5ZXI6ZnVsbHNjcmVlbjpleGl0XCIpO1xuXHR9LFxuXG5cdG9uQnV0dG9uUGxheUNsaWNrOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJwbGF5ZXI6c3RhcnRcIiwgdGhpcy5tb2RlbC5jaWQpO1xuXHR9LFxuXG5cdG9uQnV0dG9uU3RvcENsaWNrOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJwbGF5ZXI6c3RvcFwiLCB0aGlzLm1vZGVsLmNpZCk7XG5cdH0sXG5cblx0b25UaXRsZUNsaWNrOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJkZWNrOmVkaXRcIiwgdGhpcy5tb2RlbC5jaWQpO1xuXHR9LFxuXG5cdG9uQ2FyZExpc3RTaG93bjogZnVuY3Rpb24obW9kZWxDaWQpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5jaWQgPT09IG1vZGVsQ2lkKVxuXHRcdFx0dGhpcy5zaG93RGVja0VkaXRvckNvbnRyb2xzKCk7XG5cdH0sXG5cblx0b25QbGF5ZXJFbnRlcmVkRnVsbHNjcmVlbjogZnVuY3Rpb24obW9kZWxDaWQpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5jaWQgPT09IG1vZGVsQ2lkKSB7XG5cdFx0XHR0aGlzLnVpLmJ1dHRvbkZ1bGxzY3JlZW4ucmVtb3ZlQ2xhc3MoXCJmYS1leHBhbmQtYWx0XCIpO1xuXHRcdFx0dGhpcy51aS5idXR0b25GdWxsc2NyZWVuLmFkZENsYXNzKFwiZmEtY29tcHJlc3MtYWx0XCIpO1xuXHRcdH1cblx0fSxcblxuXHRvblBsYXllckV4aXRlZEZ1bGxzY3JlZW46IGZ1bmN0aW9uKG1vZGVsQ2lkKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwuY2lkID09PSBtb2RlbENpZCkge1xuXHRcdFx0dGhpcy51aS5idXR0b25GdWxsc2NyZWVuLnJlbW92ZUNsYXNzKFwiZmEtY29tcHJlc3MtYWx0XCIpO1xuXHRcdFx0dGhpcy51aS5idXR0b25GdWxsc2NyZWVuLmFkZENsYXNzKFwiZmEtZXhwYW5kLWFsdFwiKTtcblx0XHR9XG5cdH0sXG5cblx0b25QbGF5ZXJTdGFydGVkOiBmdW5jdGlvbihtb2RlbENpZCkge1xuXHRcdGlmICh0aGlzLm1vZGVsLmNpZCA9PT0gbW9kZWxDaWQpXG5cdFx0XHR0aGlzLnNob3dGbGFzaENhcmRQbGF5ZXJDb250cm9scygpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuc2hvd0RlY2tFZGl0b3JDb250cm9scygpO1xuXHR9LFxuXG5cdG9uUGxheWVyU3RvcHBlZDogZnVuY3Rpb24obW9kZWxDaWQpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5jaWQgPT09IG1vZGVsQ2lkKVxuXHRcdFx0dGhpcy5zaG93RGVja0VkaXRvckNvbnRyb2xzKCk7XG5cdH0sXG5cblx0c2hvd0RlY2tFZGl0b3JDb250cm9sczogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5idXR0b25GdWxsc2NyZWVuLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLmJ1dHRvblN0b3AuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0dGhpcy51aS5idXR0b25EZWxldGUucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0aWYgKHRoaXMuc2hvd0VkaXRCdXR0b24pXG5cdFx0XHR0aGlzLnVpLmJ1dHRvbkVkaXQucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0dGhpcy51aS5idXR0b25QbGF5LnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRzaG93Rmxhc2hDYXJkUGxheWVyQ29udHJvbHM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkuYnV0dG9uRGVsZXRlLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLmJ1dHRvbkVkaXQuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkuYnV0dG9uUGxheS5hZGRDbGFzcyhcImhpZGVcIik7XG5cblx0XHR0aGlzLnVpLmJ1dHRvbkZ1bGxzY3JlZW4ucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkuYnV0dG9uU3RvcC5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcoQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikpO1xuXHR9LFxufSk7XG5cbmNvbnN0IExpc3RJdGVtRWRpdG9yID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJmbGFzaC1jYXJkLWVkaXRvci1saXN0LWl0ZW0tZWRpdG9yXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvZmxhc2hDYXJkcy9kZWNrRWRpdG9yLm51bmpcIikubGlzdEl0ZW1FZGl0b3IsXG5cblx0dWk6IHtcblx0XHRidXR0b25BY2NlcHQ6IFwiLmJ1dHRvbi1hY2NlcHRcIixcblx0XHRidXR0b25SZWplY3Q6IFwiLmJ1dHRvbi1yZWplY3RcIixcblx0XHR0aXRsZUlucHV0OiBcIi5mbGFzaC1jYXJkLWVkaXRvci1saXN0LWl0ZW0tdGV4dC1jb250YWluZXIgPiBpbnB1dFwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmJ1dHRvbkFjY2VwdFwiOiBcIm9uQnV0dG9uQWNjZXB0Q2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5idXR0b25SZWplY3RcIjogXCJvbkJ1dHRvblJlamVjdENsaWNrXCIsXG5cdFx0XCJrZXlkb3duIEB1aS50aXRsZUlucHV0XCI6IFwib25UaXRsZUlucHV0S2V5RG93blwiLFxuXHR9LFxuXG5cdHNlcmlhbGl6ZURhdGE6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmF0dHJpYnV0ZXMgfHwgdGhpcy5tb2RlbC50b0pTT04oKTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5hdHRyaWJ1dGVzID0gb3B0aW9ucy5hdHRyaWJ1dGVzO1xuXHR9LFxuXG5cdG9uQXR0YWNoOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLnRpdGxlSW5wdXQuZm9jdXMoKTtcblx0XHR0aGlzLnVpLnRpdGxlSW5wdXQuc2VsZWN0KCk7XG5cdH0sXG5cblx0b25CdXR0b25BY2NlcHRDbGljazogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHR0aGlzLmFjY2VwdElucHV0KCk7XG5cdH0sXG5cblx0b25CdXR0b25SZWplY3RDbGljazogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHR0aGlzLnJlamVjdElucHV0KCk7XG5cdH0sXG5cblx0b25UaXRsZUlucHV0S2V5RG93bjogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRpZiAoZXZlbnQud2hpY2ggPT09IDEzKVxuXHRcdFx0dGhpcy5hY2NlcHRJbnB1dCgpO1xuXHRcdGVsc2UgaWYgKGV2ZW50LndoaWNoID09PSAyNylcblx0XHRcdHRoaXMucmVqZWN0SW5wdXQoKTtcblx0fSxcblxuXHRhY2NlcHRJbnB1dDogZnVuY3Rpb24oKSB7XG5cdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikudHJpZ2dlcihcImRlY2s6ZWRpdDphY2NlcHRcIiwgdGhpcy5tb2RlbC5jaWQsIHsgdGl0bGU6IHRoaXMudWkudGl0bGVJbnB1dC52YWwoKSB9KTtcblx0fSxcblxuXHRyZWplY3RJbnB1dDogZnVuY3Rpb24oKSB7XG5cdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikudHJpZ2dlcihcImRlY2s6ZWRpdDpyZWplY3RcIiwgdGhpcy5tb2RlbC5jaWQpO1xuXHR9LFxufSk7XG5cbmNvbnN0IExpc3RJdGVtRGVsZXRlQ29uZmlybWF0aW9uID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJmbGFzaC1jYXJkLWVkaXRvci1saXN0LWl0ZW0tZGVsZXRlLWNvbmZpcm1hdGlvblwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2ZsYXNoQ2FyZHMvZGVja0VkaXRvci5udW5qXCIpLmxpc3RJdGVtRGVsZXRlQ29uZmlybWF0aW9uLFxuXG5cdHVpOiB7XG5cdFx0YnV0dG9uQWNjZXB0OiBcIi5idXR0b24tYWNjZXB0XCIsXG5cdFx0YnV0dG9uUmVqZWN0OiBcIi5idXR0b24tcmVqZWN0XCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkuYnV0dG9uQWNjZXB0XCI6IFwib25CdXR0b25BY2NlcHRDbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmJ1dHRvblJlamVjdFwiOiBcIm9uQnV0dG9uUmVqZWN0Q2xpY2tcIixcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Xy5lYWNoKFtcblx0XHRcdHtcblx0XHRcdFx0dGFyZ2V0RWw6IHRoaXMudWkuYnV0dG9uQWNjZXB0LmdldCgwKSxcblx0XHRcdFx0Y29udGVudDogXCJZZXNcIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHRhcmdldEVsOiB0aGlzLnVpLmJ1dHRvblJlamVjdC5nZXQoMCksXG5cdFx0XHRcdGNvbnRlbnQ6IFwiTm9cIixcblx0XHRcdH0sXG5cdFx0XSwgc3BlYyA9PiB0aXBweShzcGVjLnRhcmdldEVsLCBfLmV4dGVuZChfLm9taXQoc3BlYywgW1widGFyZ2V0RWxcIl0pLCB7XG5cdFx0XHR0aGVtZTogXCJibGFja1wiLFxuXHRcdFx0cGxhY2VtZW50OiBcImJvdHRvbVwiLFxuXHRcdH0pKSk7XG5cdH0sXG5cblx0b25CdXR0b25BY2NlcHRDbGljazogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS50cmlnZ2VyKFwiZGVjazpkZWxldGU6YWNjZXB0XCIsIHRoaXMubW9kZWwuY2lkKTtcblx0fSxcblxuXHRvbkJ1dHRvblJlamVjdENsaWNrOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJkZWNrOmRlbGV0ZTpyZWplY3RcIiwgdGhpcy5tb2RlbC5jaWQpO1xuXHR9LFxufSk7XG5cbmNvbnN0IExpc3RJdGVtRXJyb3IgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImZsYXNoLWNhcmQtZWRpdG9yLWxpc3QtaXRlbS1lcnJvclwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2ZsYXNoQ2FyZHMvZGVja0VkaXRvci5udW5qXCIpLmxpc3RJdGVtRXJyb3IsXG5cblx0dWk6IHtcblx0XHRidXR0b25EaXNtaXNzOiBcIi5idXR0b24tZGlzbWlzc1wiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmJ1dHRvbkRpc21pc3NcIjogXCJvbkJ1dHRvbkRpc21pc3NDbGlja2VkXCIsXG5cdH0sXG5cblx0dGVtcGxhdGVDb250ZXh0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuXHRcdH07XG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuYXR0cmlidXRlcyA9IG9wdGlvbnMuYXR0cmlidXRlcztcblx0XHR0aGlzLm1lc3NhZ2UgPSBvcHRpb25zLm1lc3NhZ2U7XG5cdFx0dGhpcy5vcGVyYXRpb24gPSBvcHRpb25zLm9wZXJhdGlvbjtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Xy5lYWNoKFtcblx0XHRcdHtcblx0XHRcdFx0dGFyZ2V0RWw6IHRoaXMudWkuYnV0dG9uRGlzbWlzcy5nZXQoMCksXG5cdFx0XHRcdGNvbnRlbnQ6IFwiT2tcIixcblx0XHRcdH0sXG5cdFx0XSwgc3BlYyA9PiB0aXBweShzcGVjLnRhcmdldEVsLCBfLmV4dGVuZChfLm9taXQoc3BlYywgW1widGFyZ2V0RWxcIl0pLCB7XG5cdFx0XHR0aGVtZTogXCJibGFja1wiLFxuXHRcdFx0cGxhY2VtZW50OiBcImJvdHRvbVwiLFxuXHRcdH0pKSk7XG5cdH0sXG5cblx0b25CdXR0b25EaXNtaXNzQ2xpY2tlZDogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS50cmlnZ2VyKFwiZGVjazpcIiArIHRoaXMub3BlcmF0aW9uICsgXCI6ZXJyb3I6b2tcIiwgdGhpcy5tb2RlbC5jaWQsIHRoaXMuYXR0cmlidXRlcyk7XG5cdH0sXG59KTtcblxuY29uc3QgTGlzdEl0ZW1TdGF0dXMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImZsYXNoLWNhcmQtZWRpdG9yLWxpc3QtaXRlbS1zdGF0dXNcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9mbGFzaENhcmRzL2RlY2tFZGl0b3IubnVualwiKS5saXN0SXRlbVN0YXR1cyxcbn0pO1xuXG5jb25zdCBMaXN0SXRlbSA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZmxhc2gtY2FyZC1lZGl0b3ItbGlzdC1pdGVtIGZsYXNoLWNhcmQtZGVjay1lZGl0b3ItbGlzdC1pdGVtXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvZmxhc2hDYXJkcy9kZWNrRWRpdG9yLm51bmpcIikubGlzdEl0ZW0sXG5cblx0cmVnaW9uczoge1xuXHRcdGNvbnRlbnQ6IFwiLmZsYXNoLWNhcmQtZWRpdG9yLWxpc3QtaXRlbS1jb250ZW50LXJlZ2lvblwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdGNsaWNrOiBcIm9uQ2xpY2tcIixcblx0fSxcblxuXHRtb2RlbEV2ZW50czoge1xuXHRcdFwiY2hhbmdlOmRlc2NyaXB0aW9uXCI6IFwib25SZXNvdXJjZU1ldGFkYXRhQ2hhbmdlZFwiLFxuXHRcdFwiY2hhbmdlOmxhbmd1YWdlXCI6IFwib25SZXNvdXJjZU1ldGFkYXRhQ2hhbmdlZFwiLFxuXHRcdFwiY2hhbmdlOnN0dWR5WWVhclwiOiBcIm9uUmVzb3VyY2VNZXRhZGF0YUNoYW5nZWRcIixcblx0XHRcImNoYW5nZTpzZWxlY3RlZFwiOiBcIm9uRGVja1NlbGVjdGVkXCIsXG5cdFx0XCJjaGFuZ2U6c3ViamVjdFwiOiBcIm9uUmVzb3VyY2VNZXRhZGF0YUNoYW5nZWRcIixcblx0XHRcImNoYW5nZTp0aXRsZVwiOiBcIm9uUmVzb3VyY2VNZXRhZGF0YUNoYW5nZWRcIixcblx0XHRcImNoYW5nZTpoaWRkZW5cIjogXCJvbkhpZGRlbkNoYW5nZWRcIixcblx0XHRcImNoYW5nZTp1cGRhdGVkXCI6IFwib25SZXNvdXJjZU1ldGFkYXRhQ2hhbmdlZFwiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLmNhblBsYXkgPSBvcHRpb25zLmNhblBsYXk7XG5cdFx0dGhpcy5zaG93RWRpdEJ1dHRvbiA9IG9wdGlvbnMuc2hvd0VkaXRCdXR0b247XG5cblx0XHR0aGlzLmxpc3RlblRvKEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLCB7XG5cdFx0XHRcImNhcmQ6ZGVsZXRlOnNhdmVkXCI6IHRoaXMub25DYXJkRGVsZXRlU2F2ZWQuYmluZCh0aGlzKSxcblx0XHRcdFwiY2FyZDplZGl0XCI6IHRoaXMub25DYXJkRWRpdC5iaW5kKHRoaXMpLFxuXHRcdFx0XCJjYXJkOmVkaXQ6cmVqZWN0XCI6IHRoaXMub25DYXJkRWRpdFJlamVjdGVkLmJpbmQodGhpcyksXG5cdFx0XHRcImNhcmQ6ZWRpdDpzYXZlZFwiOiB0aGlzLm9uQ2FyZEVkaXRTYXZlZC5iaW5kKHRoaXMpLFxuXG5cdFx0XHRcImRlY2s6YWRkOnNhdmVkXCI6IHRoaXMub25EZWNrQWRkZWQuYmluZCh0aGlzKSxcblx0XHRcdFwiZGVjazpkZWxldGVcIjogdGhpcy5vbkRlY2tEZWxldGUuYmluZCh0aGlzKSxcblx0XHRcdFwiZGVjazpkZWxldGU6cmVqZWN0XCI6IHRoaXMub25EZWNrRGVsZXRlUmVqZWN0ZWQuYmluZCh0aGlzKSxcblx0XHRcdFwiZGVjazpkZWxldGU6c2F2ZVwiOiB0aGlzLm9uRGVja0RlbGV0ZVNhdmUuYmluZCh0aGlzKSxcblx0XHRcdFwiZGVjazpkZWxldGU6c2F2ZTplcnJvclwiOiB0aGlzLm9uRGVja0RlbGV0ZVNhdmVFcnJvci5iaW5kKHRoaXMpLFxuXHRcdFx0XCJkZWNrOmRlbGV0ZTpzYXZlOmVycm9yOm9rXCI6IHRoaXMub25EZWNrRGVsZXRlU2F2ZUVycm9yT2suYmluZCh0aGlzKSxcblx0XHRcdFwiZGVjazpkZWxldGU6c2F2ZWRcIjogdGhpcy5vbkRlY2tEZWxldGVTYXZlZC5iaW5kKHRoaXMpLFxuXHRcdH0pO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5oYXMoXCJzZWxlY3RlZFwiKSAmJiB0aGlzLm1vZGVsLmdldChcInNlbGVjdGVkXCIpKVxuXHRcdFx0dGhpcy5zZWxlY3QoKTtcblxuXHRcdHRoaXMuc3dpdGNoVG9EaXNwbGF5TW9kZSgpO1xuXHR9LFxuXG5cdG9uUmVzb3VyY2VNZXRhZGF0YUNoYW5nZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMucmVuZGVyKCk7XG5cdH0sXG5cblx0b25DbGljazogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLmlzU2VsZWN0ZWQoKSkge1xuXHRcdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikudHJpZ2dlcihcImNhcmQ6ZWRpdDpyZWplY3RcIiwgdGhpcy5jYXJkTW9kZWxDaWQpO1xuXHRcdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikudHJpZ2dlcihcImRlY2s6c2VsZWN0XCIsIHRoaXMubW9kZWwuY2lkKTtcblx0XHR9XG5cdH0sXG5cblx0b25DYXJkRGVsZXRlU2F2ZWQ6IGZ1bmN0aW9uKGNhcmRNb2RlbENpZCwgZGVja01vZGVsQ2lkLCB1cGRhdGVkVGltZXN0YW1wKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwuY2lkID09PSBkZWNrTW9kZWxDaWQpXG5cdFx0XHR0aGlzLm1vZGVsLnNldChcInVwZGF0ZWRcIiwgdXBkYXRlZFRpbWVzdGFtcCk7XG5cdH0sXG5cblx0b25DYXJkRWRpdDogZnVuY3Rpb24oY2FyZE1vZGVsQ2lkLCBvcHRpb25zKSB7XG5cdFx0dGhpcy5jYXJkTW9kZWxDaWQgPSBjYXJkTW9kZWxDaWQ7XG5cblx0XHRpZiAob3B0aW9ucyAmJiAhb3B0aW9ucy5wcmV2ZW50RGlzYWJsZSlcblx0XHRcdHRoaXMuZGlzYWJsZSgpO1xuXHR9LFxuXG5cdG9uQ2FyZEVkaXRSZWplY3RlZDogZnVuY3Rpb24oY2FyZE1vZGVsQ2lkKSB7XG5cdFx0aWYgKHRoaXMuY2FyZE1vZGVsQ2lkID09PSBjYXJkTW9kZWxDaWQpXG5cdFx0XHR0aGlzLmNhcmRNb2RlbENpZCA9IG51bGw7XG5cblx0XHR0aGlzLmVuYWJsZSgpO1xuXHR9LFxuXG5cdG9uQ2FyZEVkaXRTYXZlZDogZnVuY3Rpb24oY2FyZE1vZGVsQ2lkLCBkZWNrTW9kZWxDaWQsIHVwZGF0ZWRUaW1lc3RhbXApIHtcblx0XHR0aGlzLmVuYWJsZSgpO1xuXG5cdFx0aWYgKHRoaXMubW9kZWwuY2lkID09PSBkZWNrTW9kZWxDaWQpXG5cdFx0XHR0aGlzLm1vZGVsLnNldChcInVwZGF0ZWRcIiwgdXBkYXRlZFRpbWVzdGFtcCk7XG5cdH0sXG5cblx0b25EZWNrQWRkZWQ6IGZ1bmN0aW9uKG1vZGVsQ2lkKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwuY2lkID09PSBtb2RlbENpZCkge1xuXHRcdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikudHJpZ2dlcihcImNhcmQ6ZWRpdDpyZWplY3RcIik7XG5cdFx0XHRCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS50cmlnZ2VyKFwiZGVjazpzZWxlY3RcIiwgdGhpcy5tb2RlbC5jaWQpO1xuXHRcdH1cblx0fSxcblxuXHRvbkRlY2tEZWxldGU6IGZ1bmN0aW9uKG1vZGVsQ2lkKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwuY2lkID09PSBtb2RlbENpZClcblx0XHRcdHRoaXMuc3dpdGNoVG9EZWxldGVDb25maXJtYXRpb25Nb2RlKCk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5kaXNhYmxlKCk7XG5cdH0sXG5cblx0b25EZWNrRGVsZXRlUmVqZWN0ZWQ6IGZ1bmN0aW9uKG1vZGVsQ2lkKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwuY2lkID09PSBtb2RlbENpZClcblx0XHRcdHRoaXMuc3dpdGNoVG9EaXNwbGF5TW9kZSgpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuZW5hYmxlKCk7XG5cdH0sXG5cblx0b25EZWNrRGVsZXRlU2F2ZTogZnVuY3Rpb24obW9kZWxDaWQpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5jaWQgPT09IG1vZGVsQ2lkKVxuXHRcdFx0dGhpcy5zd2l0Y2hUb1N0YXR1c01vZGUoKTtcblx0fSxcblxuXHRvbkRlY2tEZWxldGVTYXZlRXJyb3I6IGZ1bmN0aW9uKG1vZGVsQ2lkKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwuY2lkID09PSBtb2RlbENpZClcblx0XHRcdHRoaXMuc3dpdGNoVG9FcnJvck1vZGUoXCJFcnJvciBkZWxldGluZyBkZWNrLlwiLCBcImRlbGV0ZTpzYXZlXCIpO1xuXHR9LFxuXG5cdG9uRGVja0RlbGV0ZVNhdmVFcnJvck9rOiBmdW5jdGlvbihtb2RlbENpZCkge1xuXHRcdGlmICh0aGlzLm1vZGVsLmNpZCA9PT0gbW9kZWxDaWQpXG5cdFx0XHR0aGlzLnN3aXRjaFRvRGlzcGxheU1vZGUoKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLmVuYWJsZSgpO1xuXHR9LFxuXG5cdG9uRGVja0RlbGV0ZVNhdmVkOiBmdW5jdGlvbihtb2RlbENpZCkge1xuXHRcdGlmICh0aGlzLm1vZGVsLmNpZCAhPT0gbW9kZWxDaWQpXG5cdFx0XHR0aGlzLmVuYWJsZSgpO1xuXHR9LFxuXG5cdG9uRGVja1NlbGVjdGVkOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5oYXMoXCJzZWxlY3RlZFwiKSAmJiB0aGlzLm1vZGVsLmdldChcInNlbGVjdGVkXCIpKVxuXHRcdFx0dGhpcy5zZWxlY3QoKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLmRlc2VsZWN0KCk7XG5cdH0sXG5cblx0ZGlzYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy4kZWwuYWRkQ2xhc3MoXCJmbGFzaC1jYXJkLWVkaXRvci1saXN0LWl0ZW0tZGlzYWJsZWQtbW9kZVwiKTtcblx0fSxcblxuXHRlbmFibGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKFwiZmxhc2gtY2FyZC1lZGl0b3ItbGlzdC1pdGVtLWRpc2FibGVkLW1vZGVcIik7XG5cdH0sXG5cblx0aXNTZWxlY3RlZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuJGVsLmhhc0NsYXNzKFwiZmxhc2gtY2FyZC1lZGl0b3ItbGlzdC1pdGVtLXNlbGVjdGVkXCIpO1xuXHR9LFxuXG5cdGRlc2VsZWN0OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyhcImZsYXNoLWNhcmQtZWRpdG9yLWxpc3QtaXRlbS1zZWxlY3RlZFwiKTtcblx0fSxcblxuXHRzZWxlY3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJGVsLmFkZENsYXNzKFwiZmxhc2gtY2FyZC1lZGl0b3ItbGlzdC1pdGVtLXNlbGVjdGVkXCIpO1xuXHR9LFxuXG5cdHN3aXRjaFRvRGVsZXRlQ29uZmlybWF0aW9uTW9kZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiY29udGVudFwiLCBuZXcgTGlzdEl0ZW1EZWxldGVDb25maXJtYXRpb24oeyBtb2RlbDogdGhpcy5tb2RlbCB9KSk7XG5cdH0sXG5cblx0c3dpdGNoVG9EaXNwbGF5TW9kZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiY29udGVudFwiLCBuZXcgTGlzdEl0ZW1EaXNwbGF5KHtcblx0XHRcdGNhblBsYXk6IHRoaXMuY2FuUGxheSxcblx0XHRcdG1vZGVsOiB0aGlzLm1vZGVsLFxuXHRcdFx0c2hvd0VkaXRCdXR0b246IHRoaXMuc2hvd0VkaXRCdXR0b24sXG5cdFx0fSkpO1xuXHR9LFxuXG5cdHN3aXRjaFRvRWRpdE1vZGU6IGZ1bmN0aW9uKGF0dHJpYnV0ZXMpIHtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJjb250ZW50XCIsIG5ldyBMaXN0SXRlbUVkaXRvcih7XG5cdFx0XHRhdHRyaWJ1dGVzOiBhdHRyaWJ1dGVzLFxuXHRcdFx0bW9kZWw6IHRoaXMubW9kZWwsXG5cdFx0fSkpO1xuXHR9LFxuXG5cdHN3aXRjaFRvRXJyb3JNb2RlOiBmdW5jdGlvbihlcnJvck1lc3NhZ2UsIG9wZXJhdGlvbiwgYXR0cmlidXRlcykge1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImNvbnRlbnRcIiwgbmV3IExpc3RJdGVtRXJyb3Ioe1xuXHRcdFx0YXR0cmlidXRlczogYXR0cmlidXRlcyxcblx0XHRcdG1lc3NhZ2U6IGVycm9yTWVzc2FnZSxcblx0XHRcdG1vZGVsOiB0aGlzLm1vZGVsLFxuXHRcdFx0b3BlcmF0aW9uOiBvcGVyYXRpb24sXG5cdFx0fSkpO1xuXHR9LFxuXG5cdHN3aXRjaFRvU3RhdHVzTW9kZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiY29udGVudFwiLCBuZXcgTGlzdEl0ZW1TdGF0dXMoKSk7XG5cdH0sXG5cblx0b25IaWRkZW5DaGFuZ2VkOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJoaWRkZW5cIikpXG5cdFx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy4kZWwucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKHRoaXMubW9kZWwpO1xuXHR9LFxufSk7XG5cbmNvbnN0IEVtcHR5TGlzdCA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZmxhc2gtY2FyZC1lbXB0eS1saXN0XCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvZmxhc2hDYXJkcy9kZWNrRWRpdG9yLm51bmpcIikuZW1wdHlMaXN0LFxufSk7XG5cbmNvbnN0IExpc3QgPSBCYWNrYm9uZS5NYXJpb25ldHRlLkNvbGxlY3Rpb25WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJmbGFzaC1jYXJkLWRlY2stZWRpdG9yLWxpc3RcIixcblxuXHRjaGlsZFZpZXc6IExpc3RJdGVtLFxuXG5cdGVtcHR5VmlldzogRW1wdHlMaXN0LFxuXG5cdGNoaWxkVmlld09wdGlvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRjYW5QbGF5OiB0aGlzLmNhblBsYXksXG5cdFx0XHRzaG93RWRpdEJ1dHRvbjogdGhpcy5zaG93RWRpdEJ1dHRvbixcblx0XHR9O1xuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdHNjcm9sbDogXCJvblNjcm9sbFwiLFxuXHR9LFxuXG5cdGNvbGxlY3Rpb25FdmVudHM6IHtcblx0XHRyZXF1ZXN0OiBcIm9uQ29sbGVjdGlvblJlcXVlc3RcIixcblx0XHRzeW5jOiBcIm9uQ29sbGVjdGlvblN5bmNcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5jYW5QbGF5ID0gb3B0aW9ucy5jYW5QbGF5O1xuXHRcdHRoaXMuc2hvd0VkaXRCdXR0b24gPSBvcHRpb25zLnNob3dFZGl0QnV0dG9uO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKSwge1xuXHRcdFx0XCJjYXJkOmFkZFwiOiB0aGlzLmRpc2FibGUuYmluZCh0aGlzKSxcblx0XHRcdFwiY2FyZDpkZWxldGVcIjogdGhpcy5kaXNhYmxlLmJpbmQodGhpcyksXG5cdFx0XHRcImNhcmQ6ZGVsZXRlOnJlamVjdFwiOiB0aGlzLmVuYWJsZS5iaW5kKHRoaXMpLFxuXHRcdFx0XCJjYXJkOmRlbGV0ZTpzYXZlZFwiOiB0aGlzLmVuYWJsZS5iaW5kKHRoaXMpLFxuXHRcdFx0XCJjYXJkOmVkaXRcIjogdGhpcy5vbkNhcmRFZGl0LmJpbmQodGhpcyksXG5cdFx0XHRcImNhcmQ6ZWRpdDpyZWplY3RcIjogdGhpcy5lbmFibGUuYmluZCh0aGlzKSxcblx0XHRcdFwiY2FyZDplZGl0OnNhdmVkXCI6IHRoaXMuZW5hYmxlLmJpbmQodGhpcyksXG5cdFx0fSk7XG5cdH0sXG5cblx0ZGlzYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy4kZWwuYWRkQ2xhc3MoXCJmbGFzaC1jYXJkLWVkaXRvci1saXN0LWRpc2FibGVkXCIpO1xuXHR9LFxuXG5cdGVuYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy4kZWwucmVtb3ZlQ2xhc3MoXCJmbGFzaC1jYXJkLWVkaXRvci1saXN0LWRpc2FibGVkXCIpO1xuXHR9LFxuXG5cdG9uQ2FyZEVkaXQ6IGZ1bmN0aW9uKGNhcmRNb2RlbENpZCwgb3B0aW9ucykge1xuXHRcdGlmIChvcHRpb25zICYmICFvcHRpb25zLnByZXZlbnREaXNhYmxlKVxuXHRcdFx0dGhpcy5kaXNhYmxlKCk7XG5cdH0sXG5cblx0b25TY3JvbGw6IF8udGhyb3R0bGUoZnVuY3Rpb24oZXZ0KSB7XG5cdFx0LyogZXNsaW50LWRpc2FibGUgbm8taW52YWxpZC10aGlzICovXG5cblx0XHRpZiAoIXRoaXMuX2ZldGNoaW5nKSB7XG5cdFx0XHRjb25zdCBzY3JvbGxQb3MgPSBldnQuY3VycmVudFRhcmdldC5zY3JvbGxUb3AgKyB0aGlzLiRlbC5oZWlnaHQoKTtcblx0XHRcdGNvbnN0IGhlaWdodCA9IGV2dC5jdXJyZW50VGFyZ2V0LnNjcm9sbEhlaWdodDtcblxuXHRcdFx0aWYgKHNjcm9sbFBvcyAvIGhlaWdodCA+IDAuOSAmJiB0aGlzLmNvbGxlY3Rpb24uaGFzTmV4dEJhdGNoKCkpXG5cdFx0XHRcdHRoaXMuY29sbGVjdGlvbi5nZXROZXh0QmF0Y2goKTtcblx0XHR9XG5cblx0XHQvKiBlc2xpbnQtZW5hYmxlIG5vLWludmFsaWQtdGhpcyAqL1xuXHR9LCAyNSksXG5cblx0b25Db2xsZWN0aW9uUmVxdWVzdDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy4kZWwuYWRkQ2xhc3MoXCJmYWRlZFwiKTtcblx0XHRCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS50cmlnZ2VyKFwiZGVjazpmZXRjaFwiKTtcblxuXHRcdHRoaXMuX2ZldGNoaW5nID0gdHJ1ZTtcblx0fSxcblxuXHRvbkNvbGxlY3Rpb25TeW5jOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyhcImZhZGVkXCIpO1xuXHRcdEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJkZWNrOnN5bmNcIik7XG5cblx0XHR0aGlzLl9mZXRjaGluZyA9IGZhbHNlO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpKTtcblx0fSxcbn0pO1xuXG5jb25zdCBUZXh0RmlsdGVyID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJmbGFzaC1jYXJkLWRlY2stZWRpdG9yLXRleHQtZmlsdGVyXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvZmxhc2hDYXJkcy9kZWNrRWRpdG9yLm51bmpcIikudGV4dEZpbHRlcixcblxuXHR1aToge1xuXHRcdGlucHV0OiBcIi50ZXh0LWZpbHRlci1pbnB1dFwiLFxuXHRcdGJ1dHRvbkNsZWFyOiBcIi5idXR0b24tY2xlYXJcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5idXR0b25DbGVhclwiOiBcIm9uQnV0dG9uQ2xlYXJDbGlja1wiLFxuXHRcdFwiaW5wdXQgQHVpLmlucHV0XCI6IFwib25JbnB1dENoYW5nZVwiLFxuXHRcdFwia2V5dXAgQHVpLmlucHV0XCI6IFwib25JbnB1dEtleVVwXCIsXG5cdH0sXG5cblx0dGVtcGxhdGVDb250ZXh0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0cGxhY2Vob2xkZXJUZXh0OiB0aGlzLnBsYWNlaG9sZGVyVGV4dCxcblx0XHR9O1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLmZpbHRlckF0dHJpYnV0ZSA9IG9wdGlvbnMuZmlsdGVyQXR0cmlidXRlO1xuXHRcdHRoaXMucGxhY2Vob2xkZXJUZXh0ID0gb3B0aW9ucy5wbGFjZWhvbGRlclRleHQgfHwgXCJUeXBlIHRvIHNlYXJjaC4uLlwiO1xuXHR9LFxuXG5cdG9uQnV0dG9uQ2xlYXJDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5pbnB1dC52YWwoXCJcIik7XG5cdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikudHJpZ2dlcihcImRlY2s6ZmV0Y2hcIik7XG5cdFx0dGhpcy5leGVjdXRlKCk7XG5cdH0sXG5cblx0b25JbnB1dENoYW5nZTogZnVuY3Rpb24oKSB7XG5cdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikudHJpZ2dlcihcImRlY2s6ZmV0Y2hcIik7XG5cdFx0dGhpcy5leGVjdXRlKCk7XG5cdH0sXG5cblx0b25JbnB1dEtleVVwOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGlmIChldmVudC53aGljaCA9PT0gMjcpIHtcblx0XHRcdHRoaXMudWkuaW5wdXQudmFsKFwiXCIpO1xuXHRcdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikudHJpZ2dlcihcImRlY2s6ZmV0Y2hcIik7XG5cdFx0XHR0aGlzLmV4ZWN1dGUoKTtcblx0XHR9XG5cdH0sXG5cblx0ZXhlY3V0ZTogXy5kZWJvdW5jZShmdW5jdGlvbigpIHtcblx0XHQvKiBlc2xpbnQtZGlzYWJsZSBuby1pbnZhbGlkLXRoaXMgKi9cblxuXHRcdGNvbnN0IGlucHV0VmFsdWUgPSBfLnRvTG93ZXIoXy50cmltKHRoaXMudWkuaW5wdXQudmFsKCkpIHx8IFwiXCIpO1xuXG5cdFx0aWYgKGlucHV0VmFsdWUpIHtcblx0XHRcdHRoaXMudWkuYnV0dG9uQ2xlYXIucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0dGhpcy5jb2xsZWN0aW9uLnNldFNlYXJjaFRlcm1zKGlucHV0VmFsdWUpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMudWkuYnV0dG9uQ2xlYXIuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0dGhpcy5jb2xsZWN0aW9uLnNldFNlYXJjaFRlcm1zKG51bGwpO1xuXHRcdH1cblxuXHRcdC8qIGVzbGludC1lbmFibGUgbm8taW52YWxpZC10aGlzICovXG5cdH0sIDQwMCksXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVuYmluZEV2ZW50cyh0aGlzLmNvbGxlY3Rpb24sIHRoaXMucGFnZWRDb2xsZWN0aW9uRXZlbnRzKTtcblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZmxhc2gtY2FyZC1kZWNrLWVkaXRvclwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2ZsYXNoQ2FyZHMvZGVja0VkaXRvci5udW5qXCIpLmxheW91dCxcblxuXHRyZWdpb25zOiB7XG5cdFx0aGVhZGVyOiBcIi5oZWFkZXItcmVnaW9uXCIsXG5cdFx0ZmlsdGVyOiBcIi5maWx0ZXItcmVnaW9uXCIsXG5cdFx0bGlzdDogXCIubGlzdC1yZWdpb25cIixcblx0fSxcblxuXHR1aToge1xuXHRcdGRlY2tMaXN0U3Bpbm5lcjogXCIubGlzdC1zcGlubmVyXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuY2FuUGxheSA9IG9wdGlvbnMuY2FuUGxheTtcblx0XHR0aGlzLnByZXZlbnREaXNhYmxlQWRkT25EZWNrQWRkID0gb3B0aW9ucy5wcmV2ZW50RGlzYWJsZUFkZE9uRGVja0FkZDtcblx0XHR0aGlzLmRlY2tDb2xsZWN0aW9uID0gb3B0aW9ucy5kZWNrQ29sbGVjdGlvbjtcblx0XHR0aGlzLnNob3dFZGl0QnV0dG9uID0gb3B0aW9ucy5zaG93RWRpdEJ1dHRvbjtcblxuXHRcdHRoaXMubGlzdGVuVG8oQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIiksIHtcblx0XHRcdFwiZGVjazphZGRcIjogdGhpcy5hZGREZWNrLmJpbmQodGhpcyksXG5cdFx0XHRcImRlY2s6ZGVsZXRlOmFjY2VwdFwiOiB0aGlzLm9uRGVja0RlbGV0ZUFjY2VwdGVkLmJpbmQodGhpcyksXG5cdFx0XHRcImRlY2s6ZWRpdFwiOiB0aGlzLmVkaXREZWNrLmJpbmQodGhpcyksXG5cdFx0XHRcImRlY2s6ZmV0Y2hcIjogdGhpcy5vbkRlY2tGZXRjaC5iaW5kKHRoaXMpLFxuXHRcdFx0XCJkZWNrOnN5bmNcIjogdGhpcy5vbkRlY2tTeW5jLmJpbmQodGhpcyksIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc3luY1xuXHRcdH0pO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJoZWFkZXJcIiwgbmV3IEhlYWRlcih7IHByZXZlbnREaXNhYmxlT25EZWNrQWRkOiB0aGlzLnByZXZlbnREaXNhYmxlQWRkT25EZWNrQWRkIH0pKTtcblxuXHRcdHRoaXMudGV4dEZpbHRlciA9IG5ldyBUZXh0RmlsdGVyKHtcblx0XHRcdGNvbGxlY3Rpb246IHRoaXMuZGVja0NvbGxlY3Rpb24sXG5cdFx0XHRmaWx0ZXJBdHRyaWJ1dGU6IFwidGl0bGVcIixcblx0XHR9KTtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJmaWx0ZXJcIiwgdGhpcy50ZXh0RmlsdGVyKTtcblxuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImxpc3RcIiwgbmV3IExpc3Qoe1xuXHRcdFx0Y2FuUGxheTogdGhpcy5jYW5QbGF5LFxuXHRcdFx0Y29sbGVjdGlvbjogdGhpcy5kZWNrQ29sbGVjdGlvbixcblx0XHRcdHNob3dFZGl0QnV0dG9uOiB0aGlzLnNob3dFZGl0QnV0dG9uLFxuXHRcdH0pKTtcblx0fSxcblxuXHRnZW5lcmF0ZVRlbXBvcmFyeURlY2tUaXRsZTogZnVuY3Rpb24oKSB7XG5cdFx0bGV0IHRlbXBvcmFyeVRpdGxlID0gXCJOZXcgRGVja1wiO1xuXHRcdGxldCBpID0gMDtcblxuXHRcdGNvbnN0IGlzRHVwbGljYXRlVGl0bGUgPSB0aXRsZSA9PiBfLmZpbmQodGhpcy5kZWNrQ29sbGVjdGlvbi5tb2RlbHMsIGQgPT4gZC5nZXQoXCJ0aXRsZVwiKSA9PT0gdGl0bGUpICE9PSB1bmRlZmluZWQ7XG5cblx0XHR3aGlsZShpc0R1cGxpY2F0ZVRpdGxlKHRlbXBvcmFyeVRpdGxlKSkge1xuXHRcdFx0aSsrO1xuXHRcdFx0dGVtcG9yYXJ5VGl0bGUgPSBcIk5ldyBEZWNrIChcIiArIGkgKyBcIilcIjtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGVtcG9yYXJ5VGl0bGU7XG5cdH0sXG5cblx0YWRkRGVjazogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgY3VycmVudEJvb2sgPSBDb25zb2xlRXZlbnRCdXMucmVxdWVzdChDb25zb2xlRXZlbnRCdXMuRXZlbnRzLkdldEN1cnJlbnRCb29rKTtcblx0XHRjb25zdCBjdXJyZW50R3JvdXAgPSBDb25zb2xlRXZlbnRCdXMucmVxdWVzdChDb25zb2xlRXZlbnRCdXMuRXZlbnRzLkdldEN1cnJlbnRHcm91cCk7XG5cdFx0Y29uc3QgZGVja01vZGVsID0gbmV3IERlY2tNb2RlbCgpO1xuXG5cdFx0aWYgKGN1cnJlbnRCb29rICYmIGN1cnJlbnRCb29rLmhhcyAmJiBjdXJyZW50Qm9vay5oYXMoXCJtZXRhZGF0YVwiKSAmJiBjdXJyZW50Qm9vay5nZXQoXCJtZXRhZGF0YVwiKSkge1xuXHRcdFx0ZGVja01vZGVsLnNldCh7XG5cdFx0XHRcdGxhbmd1YWdlOiBjdXJyZW50Qm9vay5nZXQoXCJtZXRhZGF0YVwiKS5sYW5ndWFnZSxcblx0XHRcdFx0c3R1ZHlZZWFyOiBjdXJyZW50Qm9vay5nZXQoXCJtZXRhZGF0YVwiKS5ncmFkZSxcblx0XHRcdFx0c3ViamVjdDogY3VycmVudEJvb2suZ2V0KFwic3ViamVjdFwiKSxcblx0XHRcdFx0c3ViamVjdF9uYW1lOiBjdXJyZW50Qm9vay5nZXQoXCJtZXRhZGF0YVwiKS5zdWJqZWN0LFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKGN1cnJlbnRHcm91cCAmJiBjdXJyZW50R3JvdXAuaWQpIHtcblx0XHRcdGRlY2tNb2RlbC5zZXQoe1xuXHRcdFx0XHRsYW5ndWFnZTogY3VycmVudEdyb3VwLmdldChcImxhbmd1YWdlXCIpLFxuXHRcdFx0XHRzdHVkeVllYXI6IGN1cnJlbnRHcm91cC5nZXQoXCJncmFkZVwiKSxcblx0XHRcdFx0c3ViamVjdDogY3VycmVudEdyb3VwLmdldChcInN1YmplY3RfaWRcIikgfHwgY3VycmVudEdyb3VwLmdldChcInN1YmplY3RcIiksXG5cdFx0XHRcdHN1YmplY3RfbmFtZTogY3VycmVudEdyb3VwLmdldChcInN1YmplY3RfbmFtZVwiKSB8fCBjdXJyZW50R3JvdXAuZ2V0KFwic3ViamVjdFwiKSxcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1vZGFsID0gbmV3IFJlc291cmNlTW9kYWwoe1xuXHRcdFx0ZGlzYWJsZUJhdGNoQ3JlYXRlOiB0cnVlLFxuXHRcdFx0bG9ja0NhdGVnb3J5OiB0cnVlLFxuXHRcdFx0bW9kZWw6IGRlY2tNb2RlbCxcblx0XHR9KTtcblxuXHRcdG1vZGFsLnNob3coe1xuXHRcdFx0Y3JlYXRlOiByZXN1bHQgPT4ge1xuXHRcdFx0XHRyZXN1bHQubW9kZWwuY2xlYXJGaWxlcygpO1xuXHRcdFx0XHR0aGlzLmRlY2tDb2xsZWN0aW9uLmFkZChyZXN1bHQubW9kZWwsIHsgYXQ6IDAgfSk7XG5cdFx0XHRcdEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJkZWNrOmFkZDpzYXZlZFwiLCByZXN1bHQubW9kZWwuY2lkKTtcblx0XHRcdH0sXG5cdFx0XHRjYW5jZWw6ICgpID0+IHtcblx0XHRcdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikudHJpZ2dlcihcImRlY2s6YWRkOmNhbmNlbGxlZFwiLCBudWxsKTtcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH0sXG5cblx0ZWRpdERlY2s6IGZ1bmN0aW9uKG1vZGVsQ2lkKSB7XG5cdFx0Y29uc3QgZGVja01vZGVsID0gdGhpcy5kZWNrQ29sbGVjdGlvbi5nZXQobW9kZWxDaWQpO1xuXHRcdGNvbnN0IG1vZGFsID0gbmV3IFJlc291cmNlTW9kYWwoeyBtb2RlbDogZGVja01vZGVsIH0pO1xuXG5cdFx0bW9kYWwuc2hvdyh7XG5cdFx0XHR1cGRhdGU6IHJlc3VsdCA9PiB7XG5cdFx0XHRcdEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJkZWNrOmVkaXQ6c2F2ZWRcIiwgcmVzdWx0Lm1vZGVsLmNpZCk7XG5cdFx0XHR9LFxuXHRcdFx0Y2FuY2VsOiAoKSA9PiB7XG5cdFx0XHRcdEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJkZWNrOmVkaXQ6Y2FuY2VsbGVkXCIsIG51bGwpO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fSxcblxuXHRvbkRlY2tGZXRjaDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5kZWNrTGlzdFNwaW5uZXIucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdG9uRGVja1N5bmM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkuZGVja0xpc3RTcGlubmVyLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRvbkRlY2tEZWxldGVBY2NlcHRlZDogZnVuY3Rpb24obW9kZWxDaWQpIHtcblx0XHRCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS50cmlnZ2VyKFwiZGVjazpkZWxldGU6c2F2ZVwiLCBtb2RlbENpZCk7XG5cblx0XHRjb25zdCBkZWNrTW9kZWwgPSB0aGlzLmRlY2tDb2xsZWN0aW9uLmdldChtb2RlbENpZCk7XG5cblx0XHRkZWNrTW9kZWwuZGVzdHJveSh7XG5cdFx0XHR3YWl0OiB0cnVlLFxuXG5cdFx0XHRzdWNjZXNzOiAoKSA9PiB7XG5cdFx0XHRcdEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJkZWNrOmRlbGV0ZTpzYXZlZFwiLCBtb2RlbENpZCk7XG5cdFx0XHR9LFxuXG5cdFx0XHRlcnJvcjogKCkgPT4ge1xuXHRcdFx0XHRCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS50cmlnZ2VyKFwiZGVjazpkZWxldGU6c2F2ZTplcnJvclwiLCBtb2RlbENpZCk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpKTtcblx0fSxcbn0pO1xuIl19",
    "\"use strict\";\n\nvar _regenerator = require(\"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\nvar Promise = require(\"bluebird\");\nvar raygun = require(\"raygun\");\n\nvar settings = require(\"app-settings\");\n\nvar CardCollection = require(\"../../collections/flashCards/cardCollection\");\nvar CardEditor = require(\"./cardEditor\");\nvar CardList = require(\"./cardList\");\nvar CardModel = require(\"../../models/flashCards/cardModel\");\nvar DeckCollection = require(\"../../collections/flashCards/deckCollection\");\nvar DeckEditor = require(\"./deckEditor\");\nvar ErrorView = require(\"../../../lib/errorView\");\nvar PlayerContainer = require(\"./playerContainer\");\nvar SmallModal = require(\"../../../lib/smallModal\");\nvar StatusView = require(\"../../../lib/statusView\");\n\nvar CARD_COUNT_MAX = 200;\n\nvar CardEditorBlank = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-editor-blank\",\n\n\ttemplate: require(\"../../templates/flashCards/manager.nunj\").cardEditorBlank\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"fixed-content flash-card-manager\",\n\n\ttemplate: require(\"../../templates/flashCards/manager.nunj\").layout,\n\n\tregions: {\n\t\tstatus: \".status-region\",\n\t\tdeck: \".deck-region\",\n\t\tcard: \".card-region\"\n\t},\n\n\tui: {\n\t\tstatusRegion: \".status-region\",\n\t\tcardRegion: \".card-region\",\n\t\tcontentContainer: \".content-container\",\n\t\tplayerContainer: \".player-container\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.listenTo(Backbone.Radio.channel(\"flashCards\"), {\n\t\t\t\"card:add\": this.onCardAdd.bind(this),\n\t\t\t\"card:delete:accept\": this.onCardDeleteAccepted.bind(this),\n\t\t\t\"card:delete:saved\": this.onCardDeleteSaved.bind(this),\n\t\t\t\"card:edit\": this.onCardEdit.bind(this),\n\t\t\t\"card:edit:reject\": this.onCardEditRejected.bind(this),\n\t\t\t\"card:edit:saved\": this.onCardEditSaved.bind(this),\n\n\t\t\t\"deck:delete\": this.onDeckDelete.bind(this),\n\t\t\t\"deck:delete:reject\": this.onDeckDeleteRejected.bind(this),\n\t\t\t\"deck:delete:saved\": this.onDeckDeleteSaved.bind(this),\n\t\t\t\"deck:edit:reject\": this.onDeckEditRejected.bind(this),\n\t\t\t\"deck:edit:saved\": this.onDeckEditSaved.bind(this),\n\t\t\t\"deck:select\": this.onDeckSelected.bind(this),\n\n\t\t\t\"player:close\": this.onPlayerClose.bind(this),\n\t\t\t\"player:start\": this.onPlayerStart.bind(this),\n\t\t\t\"player:stop\": this.onPlayerStop.bind(this)\n\t\t});\n\n\t\tBackbone.Radio.channel(\"flashCards\").reply(\"card:number\", this.getCardNumber.bind(this));\n\t\tBackbone.Radio.channel(\"flashCards\").reply(\"cards:count\", this.getCardCount.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this = this;\n\n\t\tthis.flashCardPlayerDOM = this.ui.playerContainer.clone();\n\n\t\tthis.renderLoadingStatus();\n\n\t\tthis.deckCollection = new DeckCollection([], {\n\t\t\tpageSize: 100,\n\t\t\turl: settings.urlRoot + \"/api/1.0/flashCards\"\n\t\t});\n\n\t\tthis.listenToOnce(this.deckCollection, \"sync\", function () {\n\t\t\t_this.renderPage();\n\n\t\t\t_this.listenTo(_this.deckCollection, {\n\t\t\t\tsync: _this.onDeckCollectionSync.bind(_this) // eslint-disable-line no-sync\n\t\t\t});\n\t\t});\n\n\t\tthis.deckCollection.getFirstBatch();\n\t},\n\n\tonCardAdd: function onCardAdd() {\n\t\tif (this.cardCollection.length === CARD_COUNT_MAX) {\n\t\t\tvar modal = new SmallModal({\n\t\t\t\twarning: true,\n\t\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Flashcard Limit Reached\",\n\t\t\t\tbody: \"<br><p style='text-align:center'>Flashcard decks are limited to 200 cards.</p>\",\n\t\t\t\thideButtons: [\"cancel\"]\n\t\t\t});\n\n\t\t\tmodal.show();\n\t\t} else {\n\t\t\tthis.editNewCard();\n\t\t}\n\t},\n\n\teditNewCard: function editNewCard() {\n\t\tvar newCardModel = new CardModel();\n\t\tthis.cardCollection.add(newCardModel);\n\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"card:edit\", newCardModel.cid);\n\t\t//this.showCardEditor(newCardModel.cid);\n\t},\n\n\tonCardDeleteAccepted: function onCardDeleteAccepted(cardModelCid) {\n\t\tvar _this2 = this;\n\n\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"card:delete:save\", cardModelCid);\n\n\t\tvar cardModel = this.cardCollection.get(cardModelCid);\n\n\t\tcardModel.destroy({\n\t\t\twait: true,\n\n\t\t\tsuccess: function success(model) {\n\t\t\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"card:delete:saved\", cardModelCid, _this2.deckModel.cid, model.has(\"deletedDate\") ? model.get(\"deletedDate\") : moment().unix());\n\t\t\t},\n\n\t\t\terror: function error() {\n\t\t\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"card:delete:save:error\", cardModelCid);\n\t\t\t}\n\t\t});\n\t},\n\n\tonCardDeleteSaved: function onCardDeleteSaved() {\n\t\tvar remainingFlashCards = _.map(this.cardCollection.models, function (cardModel) {\n\t\t\treturn cardModel.get(\"_id\");\n\t\t});\n\t\tthis.deckModel.set(\"flashCards\", remainingFlashCards);\n\n\t\tthis.showCardList();\n\t},\n\n\tonCardEdit: function onCardEdit(modelCid) {\n\t\tthis.showCardEditor(modelCid);\n\t},\n\n\tonCardEditRejected: function onCardEditRejected(cardModelCid) {\n\t\tif (!_.isNil(cardModelCid)) {\n\t\t\tvar cardModel = this.cardCollection.get(cardModelCid);\n\n\t\t\tif (cardModel.isNew()) this.cardCollection.remove(cardModel);\n\n\t\t\tthis.showCardList();\n\t\t}\n\t},\n\n\tonCardEditSaved: function onCardEditSaved(cardModelCid) {\n\t\tvar cardModel = this.cardCollection.get(cardModelCid);\n\t\tvar flashCards = this.deckModel.get(\"flashCards\");\n\n\t\tif (!_.includes(flashCards, cardModel.get(\"_id\"))) {\n\t\t\tflashCards.push(cardModel.get(\"_id\"));\n\t\t\tthis.deckModel.set(\"flashCards\", flashCards);\n\t\t}\n\n\t\tthis.showCardList();\n\t},\n\n\tonDeckCollectionSync: function onDeckCollectionSync() {\n\t\tif (!_.isNil(this.deckModel) && !_.isNil(this.deckModel.id) && !_.isNil(this.deckCollection.get(this.deckModel.id))) Backbone.Radio.channel(\"flashCards\").trigger(\"deck:select\", this.deckCollection.get(this.deckModel.id).cid, true);else Backbone.Radio.channel(\"flashCards\").trigger(\"deck:select\", null);\n\t},\n\n\tonDeckDelete: function onDeckDelete() {\n\t\tthis.ui.cardRegion.addClass(\"flash-card-manager-disabled\");\n\t},\n\n\tonDeckDeleteRejected: function onDeckDeleteRejected() {\n\t\tthis.ui.cardRegion.removeClass(\"flash-card-manager-disabled\");\n\t},\n\n\tonDeckDeleteSaved: function onDeckDeleteSaved() {\n\t\tthis.showBlankCardEditor();\n\t\tthis.ui.cardRegion.removeClass(\"flash-card-manager-disabled\");\n\t},\n\n\tonDeckEditSaved: function () {\n\t\tvar _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee(deckModelCid) {\n\t\t\tvar deckModel;\n\t\t\treturn _regenerator2.default.wrap(function _callee$(_context) {\n\t\t\t\twhile (1) {\n\t\t\t\t\tswitch (_context.prev = _context.next) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tif (this.cardList === null) {\n\t\t\t\t\t\t\t\tdeckModel = this.deckCollection.get(deckModelCid);\n\n\n\t\t\t\t\t\t\t\tthis.showChildView(\"card\", new StatusView({ type: \"loading\" }));\n\t\t\t\t\t\t\t\tthis.loadCards(deckModel);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthis.ui.cardRegion.removeClass(\"flash-card-manager-disabled\");\n\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\treturn _context.stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, _callee, this);\n\t\t}));\n\n\t\tfunction onDeckEditSaved(_x) {\n\t\t\treturn _ref.apply(this, arguments);\n\t\t}\n\n\t\treturn onDeckEditSaved;\n\t}(),\n\n\tonDeckEditRejected: function onDeckEditRejected() {\n\t\tthis.cardList = this.getRegion(\"card\").currentView;\n\t\tthis.ui.cardRegion.removeClass(\"flash-card-manager-disabled\");\n\t},\n\n\tonDeckSelected: function onDeckSelected(deckModelCid, skipCardListRefresh) {\n\t\tif (deckModelCid === null) {\n\t\t\tthis.deckModel = null;\n\t\t\tthis.showBlankCardEditor();\n\t\t} else {\n\t\t\tthis.deckModel = this.deckCollection.get(deckModelCid);\n\n\t\t\tif (!skipCardListRefresh) {\n\t\t\t\tthis.cardList = null;\n\n\t\t\t\tif (this.deckModel.isNew()) {\n\t\t\t\t\tthis.showBlankCardEditor();\n\t\t\t\t} else {\n\t\t\t\t\tthis.showChildView(\"card\", new StatusView({ type: \"loading\" }));\n\t\t\t\t\tthis.loadCards(this.deckModel);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tonPlayerClose: function onPlayerClose() {\n\t\tthis.exitFullscreen();\n\t},\n\n\tonPlayerStart: function onPlayerStart(deckModelCid) {\n\t\tthis.showChildView(\"card\", new PlayerContainer({\n\t\t\tcardCollection: this.cardCollection,\n\t\t\tmodel: this.deckCollection.get(deckModelCid)\n\t\t}), { preventDestroy: true });\n\t},\n\n\tonPlayerStop: function onPlayerStop() {\n\t\tthis.showCardList();\n\t},\n\n\tgetCardCount: function getCardCount() {\n\t\treturn this.cardCollection.length;\n\t},\n\n\tgetCardNumber: function getCardNumber(cardModel) {\n\t\treturn this.cardCollection.indexOf(cardModel) + 1;\n\t},\n\n\tshowCardList: function showCardList() {\n\t\tif (!this.cardList) this.cardList = new CardList({ cardCollection: this.cardCollection });\n\n\t\tthis.showChildView(\"card\", this.cardList);\n\n\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"cardList:shown\");\n\t},\n\n\tshowCardEditor: function showCardEditor(cardModelCid) {\n\t\tvar cardModel = this.cardCollection.get(cardModelCid);\n\t\t// DEPRECATION WARNING: preventDestroy is deprecated in Marionette 3.4.4\n\t\tthis.showChildView(\"card\", new CardEditor({\n\t\t\tdeckModelCid: this.deckModel.cid,\n\t\t\tmodel: cardModel\n\t\t}), { preventDestroy: true });\n\t},\n\n\tloadCards: function loadCards(deckModel) {\n\t\tvar _this3 = this;\n\n\t\tvar collections = [new CardCollection([], { deck: deckModel.get(\"_id\") }).lazyFetch()];\n\n\t\tPromise.all(collections).spread(function (cardCollection) {\n\t\t\t_this3.stopListeningToCardCollection();\n\n\t\t\t_this3.cardCollection = cardCollection;\n\n\t\t\t_this3.listenTo(_this3.cardCollection, \"update\", _this3.onCardCollectionUpdated.bind(_this3, deckModel.cid));\n\n\t\t\tif (_this3.cardCollection.length > 0) _this3.showCardList();else _this3.editNewCard();\n\t\t}).catch(this.showCardLoadError.bind(this));\n\t},\n\n\tonCardCollectionUpdated: function onCardCollectionUpdated(deckModelCid) {\n\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"deck:size:updated\", deckModelCid, this.cardCollection.length);\n\t},\n\n\tshowCardLoadError: function showCardLoadError(error) {\n\t\tthis.showChildView(\"card\", new ErrorView({ fetchError: error }));\n\n\t\tif (!settings.debug || settings.reportErrors) raygun(\"send\", error);\n\t},\n\n\trenderLoadingStatus: function renderLoadingStatus() {\n\t\tthis.showChildView(\"status\", new StatusView({ type: \"loading\" }));\n\t},\n\n\trenderError: function renderError(error) {\n\t\tthis.showChildView(\"status\", new ErrorView({ fetchError: error }));\n\t},\n\n\trenderPage: function renderPage() {\n\t\tthis.ui.statusRegion.addClass(\"hide\");\n\t\tthis.ui.contentContainer.removeClass(\"hide\");\n\n\t\t// Create the deck editor\n\t\tthis.deckEditor = new DeckEditor({\n\t\t\tcanPlay: true,\n\t\t\tdeckCollection: this.deckCollection\n\t\t});\n\t\tthis.showChildView(\"deck\", this.deckEditor);\n\n\t\t// Show a blank page in place of the card editor\n\t\tthis.showBlankCardEditor();\n\t},\n\n\tshowBlankCardEditor: function showBlankCardEditor() {\n\t\tthis.showChildView(\"card\", new CardEditorBlank());\n\t},\n\n\tstopListeningToCardCollection: function stopListeningToCardCollection() {\n\t\tif (this.cardCollection) this.stopListening(this.cardCollection);\n\t},\n\n\tstopListeningToDeckCollection: function stopListeningToDeckCollection() {\n\t\tif (this.deckCollection) this.stopListening(this.deckCollection);\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListeningToCardCollection();\n\t\tthis.stopListeningToDeckCollection();\n\t\tthis.stopListening(Backbone.Radio.channel(\"flashCards\"));\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1hbmFnZXIuanMiXSwibmFtZXMiOlsiXyIsInJlcXVpcmUiLCJCYWNrYm9uZSIsIm1vbWVudCIsIlByb21pc2UiLCJyYXlndW4iLCJzZXR0aW5ncyIsIkNhcmRDb2xsZWN0aW9uIiwiQ2FyZEVkaXRvciIsIkNhcmRMaXN0IiwiQ2FyZE1vZGVsIiwiRGVja0NvbGxlY3Rpb24iLCJEZWNrRWRpdG9yIiwiRXJyb3JWaWV3IiwiUGxheWVyQ29udGFpbmVyIiwiU21hbGxNb2RhbCIsIlN0YXR1c1ZpZXciLCJDQVJEX0NPVU5UX01BWCIsIkNhcmRFZGl0b3JCbGFuayIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiZXh0ZW5kIiwiY2xhc3NOYW1lIiwidGVtcGxhdGUiLCJjYXJkRWRpdG9yQmxhbmsiLCJtb2R1bGUiLCJleHBvcnRzIiwibGF5b3V0IiwicmVnaW9ucyIsInN0YXR1cyIsImRlY2siLCJjYXJkIiwidWkiLCJzdGF0dXNSZWdpb24iLCJjYXJkUmVnaW9uIiwiY29udGVudENvbnRhaW5lciIsInBsYXllckNvbnRhaW5lciIsImluaXRpYWxpemUiLCJsaXN0ZW5UbyIsIlJhZGlvIiwiY2hhbm5lbCIsIm9uQ2FyZEFkZCIsImJpbmQiLCJvbkNhcmREZWxldGVBY2NlcHRlZCIsIm9uQ2FyZERlbGV0ZVNhdmVkIiwib25DYXJkRWRpdCIsIm9uQ2FyZEVkaXRSZWplY3RlZCIsIm9uQ2FyZEVkaXRTYXZlZCIsIm9uRGVja0RlbGV0ZSIsIm9uRGVja0RlbGV0ZVJlamVjdGVkIiwib25EZWNrRGVsZXRlU2F2ZWQiLCJvbkRlY2tFZGl0UmVqZWN0ZWQiLCJvbkRlY2tFZGl0U2F2ZWQiLCJvbkRlY2tTZWxlY3RlZCIsIm9uUGxheWVyQ2xvc2UiLCJvblBsYXllclN0YXJ0Iiwib25QbGF5ZXJTdG9wIiwicmVwbHkiLCJnZXRDYXJkTnVtYmVyIiwiZ2V0Q2FyZENvdW50Iiwib25SZW5kZXIiLCJmbGFzaENhcmRQbGF5ZXJET00iLCJjbG9uZSIsInJlbmRlckxvYWRpbmdTdGF0dXMiLCJkZWNrQ29sbGVjdGlvbiIsInBhZ2VTaXplIiwidXJsIiwidXJsUm9vdCIsImxpc3RlblRvT25jZSIsInJlbmRlclBhZ2UiLCJzeW5jIiwib25EZWNrQ29sbGVjdGlvblN5bmMiLCJnZXRGaXJzdEJhdGNoIiwiY2FyZENvbGxlY3Rpb24iLCJsZW5ndGgiLCJtb2RhbCIsIndhcm5pbmciLCJ0aXRsZSIsImJvZHkiLCJoaWRlQnV0dG9ucyIsInNob3ciLCJlZGl0TmV3Q2FyZCIsIm5ld0NhcmRNb2RlbCIsImFkZCIsInRyaWdnZXIiLCJjaWQiLCJjYXJkTW9kZWxDaWQiLCJjYXJkTW9kZWwiLCJnZXQiLCJkZXN0cm95Iiwid2FpdCIsInN1Y2Nlc3MiLCJkZWNrTW9kZWwiLCJtb2RlbCIsImhhcyIsInVuaXgiLCJlcnJvciIsInJlbWFpbmluZ0ZsYXNoQ2FyZHMiLCJtYXAiLCJtb2RlbHMiLCJzZXQiLCJzaG93Q2FyZExpc3QiLCJtb2RlbENpZCIsInNob3dDYXJkRWRpdG9yIiwiaXNOaWwiLCJpc05ldyIsInJlbW92ZSIsImZsYXNoQ2FyZHMiLCJpbmNsdWRlcyIsInB1c2giLCJpZCIsImFkZENsYXNzIiwicmVtb3ZlQ2xhc3MiLCJzaG93QmxhbmtDYXJkRWRpdG9yIiwiZGVja01vZGVsQ2lkIiwiY2FyZExpc3QiLCJzaG93Q2hpbGRWaWV3IiwidHlwZSIsImxvYWRDYXJkcyIsImdldFJlZ2lvbiIsImN1cnJlbnRWaWV3Iiwic2tpcENhcmRMaXN0UmVmcmVzaCIsImV4aXRGdWxsc2NyZWVuIiwicHJldmVudERlc3Ryb3kiLCJpbmRleE9mIiwiY29sbGVjdGlvbnMiLCJsYXp5RmV0Y2giLCJhbGwiLCJzcHJlYWQiLCJzdG9wTGlzdGVuaW5nVG9DYXJkQ29sbGVjdGlvbiIsIm9uQ2FyZENvbGxlY3Rpb25VcGRhdGVkIiwiY2F0Y2giLCJzaG93Q2FyZExvYWRFcnJvciIsImZldGNoRXJyb3IiLCJkZWJ1ZyIsInJlcG9ydEVycm9ycyIsInJlbmRlckVycm9yIiwiZGVja0VkaXRvciIsImNhblBsYXkiLCJzdG9wTGlzdGVuaW5nIiwic3RvcExpc3RlbmluZ1RvRGVja0NvbGxlY3Rpb24iLCJvbkJlZm9yZURlc3Ryb3kiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0FBQ0EsSUFBTUEsSUFBSUMsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNQyxXQUFXRCxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNRSxTQUFTRixRQUFRLFFBQVIsQ0FBZjtBQUNBLElBQU1HLFVBQVVILFFBQVEsVUFBUixDQUFoQjtBQUNBLElBQU1JLFNBQVNKLFFBQVEsUUFBUixDQUFmOztBQUVBLElBQU1LLFdBQVdMLFFBQVEsY0FBUixDQUFqQjs7QUFFQSxJQUFNTSxpQkFBaUJOLFFBQVEsNkNBQVIsQ0FBdkI7QUFDQSxJQUFNTyxhQUFhUCxRQUFRLGNBQVIsQ0FBbkI7QUFDQSxJQUFNUSxXQUFXUixRQUFRLFlBQVIsQ0FBakI7QUFDQSxJQUFNUyxZQUFZVCxRQUFRLG1DQUFSLENBQWxCO0FBQ0EsSUFBTVUsaUJBQWlCVixRQUFRLDZDQUFSLENBQXZCO0FBQ0EsSUFBTVcsYUFBYVgsUUFBUSxjQUFSLENBQW5CO0FBQ0EsSUFBTVksWUFBWVosUUFBUSx3QkFBUixDQUFsQjtBQUNBLElBQU1hLGtCQUFrQmIsUUFBUSxtQkFBUixDQUF4QjtBQUNBLElBQU1jLGFBQWFkLFFBQVEseUJBQVIsQ0FBbkI7QUFDQSxJQUFNZSxhQUFhZixRQUFRLHlCQUFSLENBQW5COztBQUVBLElBQU1nQixpQkFBaUIsR0FBdkI7O0FBRUEsSUFBTUMsa0JBQWtCaEIsU0FBU2lCLFVBQVQsQ0FBb0JDLElBQXBCLENBQXlCQyxNQUF6QixDQUFnQztBQUN2REMsWUFBVyx5QkFENEM7O0FBR3ZEQyxXQUFVdEIsUUFBUSx5Q0FBUixFQUFtRHVCO0FBSE4sQ0FBaEMsQ0FBeEI7O0FBTUFDLE9BQU9DLE9BQVAsR0FBaUJ4QixTQUFTaUIsVUFBVCxDQUFvQkMsSUFBcEIsQ0FBeUJDLE1BQXpCLENBQWdDO0FBQ2hEQyxZQUFXLGtDQURxQzs7QUFHaERDLFdBQVV0QixR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QUFMLENBQW1CLE1BQW5CLEVBQTJCLEtBQUtxQixVQUFoQzs7QUFFQTtBQUNBLE9BQUt4QixtQkFBTDtBQUNBLEVBL1IrQzs7QUFpU2hEQSxzQkFBcUIsK0JBQVc7QUFDL0IsT0FBS0csYUFBTCxDQUFtQixNQUFuQixFQUEyQixJQUFJbEcsZUFBSixFQUEzQjtBQUNBLEVBblMrQzs7QUFxU2hEK0csZ0NBQStCLHlDQUFXO0FBQ3pDLE1BQUksS0FBS3hELGNBQVQsRUFDQyxLQUFLa0UsYUFBTCxDQUFtQixLQUFLbEUsY0FBeEI7QUFDRCxFQXhTK0M7O0FBMFNoRG1FLGdDQUErQix5Q0FBVztBQUN6QyxNQUFJLEtBQUs1RSxjQUFULEVBQ0MsS0FBSzJFLGFBQUwsQ0FBbUIsS0FBSzNFLGNBQXhCO0FBQ0QsRUE3UytDOztBQStTaEQ2RSxrQkFBaUIsMkJBQVc7QUFDM0IsT0FBS1osNkJBQUw7QUFDQSxPQUFLVyw2QkFBTDtBQUNBLE9BQUtELGFBQUwsQ0FBbUJ6SSxTQUFTcUMsS0FBVCxDQUFlQyxPQUFmLENBQXVCLFlBQXZCLENBQW5CO0FBQ0E7QUFuVCtDLENBQWhDLENBQWpCIiwiZmlsZSI6Im1hbmFnZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCBtb21lbnQgPSByZXF1aXJlKFwibW9tZW50XCIpO1xuY29uc3QgUHJvbWlzZSA9IHJlcXVpcmUoXCJibHVlYmlyZFwiKTtcbmNvbnN0IHJheWd1biA9IHJlcXVpcmUoXCJyYXlndW5cIik7XG5cbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxuY29uc3QgQ2FyZENvbGxlY3Rpb24gPSByZXF1aXJlKFwiLi4vLi4vY29sbGVjdGlvbnMvZmxhc2hDYXJkcy9jYXJkQ29sbGVjdGlvblwiKTtcbmNvbnN0IENhcmRFZGl0b3IgPSByZXF1aXJlKFwiLi9jYXJkRWRpdG9yXCIpO1xuY29uc3QgQ2FyZExpc3QgPSByZXF1aXJlKFwiLi9jYXJkTGlzdFwiKTtcbmNvbnN0IENhcmRNb2RlbCA9IHJlcXVpcmUoXCIuLi8uLi9tb2RlbHMvZmxhc2hDYXJkcy9jYXJkTW9kZWxcIik7XG5jb25zdCBEZWNrQ29sbGVjdGlvbiA9IHJlcXVpcmUoXCIuLi8uLi9jb2xsZWN0aW9ucy9mbGFzaENhcmRzL2RlY2tDb2xsZWN0aW9uXCIpO1xuY29uc3QgRGVja0VkaXRvciA9IHJlcXVpcmUoXCIuL2RlY2tFZGl0b3JcIik7XG5jb25zdCBFcnJvclZpZXcgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL2Vycm9yVmlld1wiKTtcbmNvbnN0IFBsYXllckNvbnRhaW5lciA9IHJlcXVpcmUoXCIuL3BsYXllckNvbnRhaW5lclwiKTtcbmNvbnN0IFNtYWxsTW9kYWwgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL3NtYWxsTW9kYWxcIik7XG5jb25zdCBTdGF0dXNWaWV3ID0gcmVxdWlyZShcIi4uLy4uLy4uL2xpYi9zdGF0dXNWaWV3XCIpO1xuXG5jb25zdCBDQVJEX0NPVU5UX01BWCA9IDIwMDtcblxuY29uc3QgQ2FyZEVkaXRvckJsYW5rID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJmbGFzaC1jYXJkLWVkaXRvci1ibGFua1wiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2ZsYXNoQ2FyZHMvbWFuYWdlci5udW5qXCIpLmNhcmRFZGl0b3JCbGFuayxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZml4ZWQtY29udGVudCBmbGFzaC1jYXJkLW1hbmFnZXJcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9mbGFzaENhcmRzL21hbmFnZXIubnVualwiKS5sYXlvdXQsXG5cblx0cmVnaW9uczoge1xuXHRcdHN0YXR1czogXCIuc3RhdHVzLXJlZ2lvblwiLFxuXHRcdGRlY2s6IFwiLmRlY2stcmVnaW9uXCIsXG5cdFx0Y2FyZDogXCIuY2FyZC1yZWdpb25cIixcblx0fSxcblxuXHR1aToge1xuXHRcdHN0YXR1c1JlZ2lvbjogXCIuc3RhdHVzLXJlZ2lvblwiLFxuXHRcdGNhcmRSZWdpb246IFwiLmNhcmQtcmVnaW9uXCIsXG5cdFx0Y29udGVudENvbnRhaW5lcjogXCIuY29udGVudC1jb250YWluZXJcIixcblx0XHRwbGF5ZXJDb250YWluZXI6IFwiLnBsYXllci1jb250YWluZXJcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmxpc3RlblRvKEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLCB7XG5cdFx0XHRcImNhcmQ6YWRkXCI6IHRoaXMub25DYXJkQWRkLmJpbmQodGhpcyksXG5cdFx0XHRcImNhcmQ6ZGVsZXRlOmFjY2VwdFwiOiB0aGlzLm9uQ2FyZERlbGV0ZUFjY2VwdGVkLmJpbmQodGhpcyksXG5cdFx0XHRcImNhcmQ6ZGVsZXRlOnNhdmVkXCI6IHRoaXMub25DYXJkRGVsZXRlU2F2ZWQuYmluZCh0aGlzKSxcblx0XHRcdFwiY2FyZDplZGl0XCI6IHRoaXMub25DYXJkRWRpdC5iaW5kKHRoaXMpLFxuXHRcdFx0XCJjYXJkOmVkaXQ6cmVqZWN0XCI6IHRoaXMub25DYXJkRWRpdFJlamVjdGVkLmJpbmQodGhpcyksXG5cdFx0XHRcImNhcmQ6ZWRpdDpzYXZlZFwiOiB0aGlzLm9uQ2FyZEVkaXRTYXZlZC5iaW5kKHRoaXMpLFxuXG5cdFx0XHRcImRlY2s6ZGVsZXRlXCI6IHRoaXMub25EZWNrRGVsZXRlLmJpbmQodGhpcyksXG5cdFx0XHRcImRlY2s6ZGVsZXRlOnJlamVjdFwiOiB0aGlzLm9uRGVja0RlbGV0ZVJlamVjdGVkLmJpbmQodGhpcyksXG5cdFx0XHRcImRlY2s6ZGVsZXRlOnNhdmVkXCI6IHRoaXMub25EZWNrRGVsZXRlU2F2ZWQuYmluZCh0aGlzKSxcblx0XHRcdFwiZGVjazplZGl0OnJlamVjdFwiOiB0aGlzLm9uRGVja0VkaXRSZWplY3RlZC5iaW5kKHRoaXMpLFxuXHRcdFx0XCJkZWNrOmVkaXQ6c2F2ZWRcIjogdGhpcy5vbkRlY2tFZGl0U2F2ZWQuYmluZCh0aGlzKSxcblx0XHRcdFwiZGVjazpzZWxlY3RcIjogdGhpcy5vbkRlY2tTZWxlY3RlZC5iaW5kKHRoaXMpLFxuXG5cdFx0XHRcInBsYXllcjpjbG9zZVwiOiB0aGlzLm9uUGxheWVyQ2xvc2UuYmluZCh0aGlzKSxcblx0XHRcdFwicGxheWVyOnN0YXJ0XCI6IHRoaXMub25QbGF5ZXJTdGFydC5iaW5kKHRoaXMpLFxuXHRcdFx0XCJwbGF5ZXI6c3RvcFwiOiB0aGlzLm9uUGxheWVyU3RvcC5iaW5kKHRoaXMpLFxuXHRcdH0pO1xuXG5cdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikucmVwbHkoXCJjYXJkOm51bWJlclwiLCB0aGlzLmdldENhcmROdW1iZXIuYmluZCh0aGlzKSk7XG5cdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikucmVwbHkoXCJjYXJkczpjb3VudFwiLCB0aGlzLmdldENhcmRDb3VudC5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5mbGFzaENhcmRQbGF5ZXJET00gPSB0aGlzLnVpLnBsYXllckNvbnRhaW5lci5jbG9uZSgpO1xuXG5cdFx0dGhpcy5yZW5kZXJMb2FkaW5nU3RhdHVzKCk7XG5cblx0XHR0aGlzLmRlY2tDb2xsZWN0aW9uID0gbmV3IERlY2tDb2xsZWN0aW9uKFtdLCB7XG5cdFx0XHRwYWdlU2l6ZTogMTAwLFxuXHRcdFx0dXJsOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9mbGFzaENhcmRzXCIsXG5cdFx0fSk7XG5cblx0XHR0aGlzLmxpc3RlblRvT25jZSh0aGlzLmRlY2tDb2xsZWN0aW9uLCBcInN5bmNcIiwgKCkgPT4ge1xuXHRcdFx0dGhpcy5yZW5kZXJQYWdlKCk7XG5cblx0XHRcdHRoaXMubGlzdGVuVG8odGhpcy5kZWNrQ29sbGVjdGlvbiwge1xuXHRcdFx0XHRzeW5jOiB0aGlzLm9uRGVja0NvbGxlY3Rpb25TeW5jLmJpbmQodGhpcyksIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc3luY1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLmRlY2tDb2xsZWN0aW9uLmdldEZpcnN0QmF0Y2goKTtcblx0fSxcblxuXHRvbkNhcmRBZGQ6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLmNhcmRDb2xsZWN0aW9uLmxlbmd0aCA9PT0gQ0FSRF9DT1VOVF9NQVgpIHtcblx0XHRcdGNvbnN0IG1vZGFsID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0XHR3YXJuaW5nOiB0cnVlLFxuXHRcdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmFsIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJy8+IEZsYXNoY2FyZCBMaW1pdCBSZWFjaGVkXCIsXG5cdFx0XHRcdGJvZHk6IFwiPGJyPjxwIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+Rmxhc2hjYXJkIGRlY2tzIGFyZSBsaW1pdGVkIHRvIDIwMCBjYXJkcy48L3A+XCIsXG5cdFx0XHRcdGhpZGVCdXR0b25zOiBbXCJjYW5jZWxcIl0sXG5cdFx0XHR9KTtcblxuXHRcdFx0bW9kYWwuc2hvdygpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMuZWRpdE5ld0NhcmQoKTtcblx0XHR9XG5cdH0sXG5cblx0ZWRpdE5ld0NhcmQ6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IG5ld0NhcmRNb2RlbCA9IG5ldyBDYXJkTW9kZWwoKTtcblx0XHR0aGlzLmNhcmRDb2xsZWN0aW9uLmFkZChuZXdDYXJkTW9kZWwpO1xuXHRcdEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJjYXJkOmVkaXRcIiwgbmV3Q2FyZE1vZGVsLmNpZCk7XG5cdFx0Ly90aGlzLnNob3dDYXJkRWRpdG9yKG5ld0NhcmRNb2RlbC5jaWQpO1xuXHR9LFxuXG5cdG9uQ2FyZERlbGV0ZUFjY2VwdGVkOiBmdW5jdGlvbihjYXJkTW9kZWxDaWQpIHtcblx0XHRCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS50cmlnZ2VyKFwiY2FyZDpkZWxldGU6c2F2ZVwiLCBjYXJkTW9kZWxDaWQpO1xuXG5cdFx0Y29uc3QgY2FyZE1vZGVsID0gdGhpcy5jYXJkQ29sbGVjdGlvbi5nZXQoY2FyZE1vZGVsQ2lkKTtcblxuXHRcdGNhcmRNb2RlbC5kZXN0cm95KHtcblx0XHRcdHdhaXQ6IHRydWUsXG5cblx0XHRcdHN1Y2Nlc3M6IG1vZGVsID0+IHtcblx0XHRcdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikudHJpZ2dlcihcImNhcmQ6ZGVsZXRlOnNhdmVkXCIsIGNhcmRNb2RlbENpZCwgdGhpcy5kZWNrTW9kZWwuY2lkLCBtb2RlbC5oYXMoXCJkZWxldGVkRGF0ZVwiKSA/IG1vZGVsLmdldChcImRlbGV0ZWREYXRlXCIpIDogbW9tZW50KCkudW5peCgpKTtcblx0XHRcdH0sXG5cblx0XHRcdGVycm9yOiAoKSA9PiB7XG5cdFx0XHRcdEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJjYXJkOmRlbGV0ZTpzYXZlOmVycm9yXCIsIGNhcmRNb2RlbENpZCk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9LFxuXG5cdG9uQ2FyZERlbGV0ZVNhdmVkOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCByZW1haW5pbmdGbGFzaENhcmRzID0gXy5tYXAodGhpcy5jYXJkQ29sbGVjdGlvbi5tb2RlbHMsIGNhcmRNb2RlbCA9PiBjYXJkTW9kZWwuZ2V0KFwiX2lkXCIpKTtcblx0XHR0aGlzLmRlY2tNb2RlbC5zZXQoXCJmbGFzaENhcmRzXCIsIHJlbWFpbmluZ0ZsYXNoQ2FyZHMpO1xuXG5cdFx0dGhpcy5zaG93Q2FyZExpc3QoKTtcblx0fSxcblxuXHRvbkNhcmRFZGl0OiBmdW5jdGlvbihtb2RlbENpZCkge1xuXHRcdHRoaXMuc2hvd0NhcmRFZGl0b3IobW9kZWxDaWQpO1xuXHR9LFxuXG5cdG9uQ2FyZEVkaXRSZWplY3RlZDogZnVuY3Rpb24oY2FyZE1vZGVsQ2lkKSB7XG5cdFx0aWYgKCFfLmlzTmlsKGNhcmRNb2RlbENpZCkpIHtcblx0XHRcdGNvbnN0IGNhcmRNb2RlbCA9IHRoaXMuY2FyZENvbGxlY3Rpb24uZ2V0KGNhcmRNb2RlbENpZCk7XG5cblx0XHRcdGlmIChjYXJkTW9kZWwuaXNOZXcoKSlcblx0XHRcdFx0dGhpcy5jYXJkQ29sbGVjdGlvbi5yZW1vdmUoY2FyZE1vZGVsKTtcblxuXHRcdFx0dGhpcy5zaG93Q2FyZExpc3QoKTtcblx0XHR9XG5cdH0sXG5cblx0b25DYXJkRWRpdFNhdmVkOiBmdW5jdGlvbihjYXJkTW9kZWxDaWQpIHtcblx0XHRjb25zdCBjYXJkTW9kZWwgPSB0aGlzLmNhcmRDb2xsZWN0aW9uLmdldChjYXJkTW9kZWxDaWQpO1xuXHRcdGNvbnN0IGZsYXNoQ2FyZHMgPSB0aGlzLmRlY2tNb2RlbC5nZXQoXCJmbGFzaENhcmRzXCIpO1xuXG5cdFx0aWYgKCFfLmluY2x1ZGVzKGZsYXNoQ2FyZHMsIGNhcmRNb2RlbC5nZXQoXCJfaWRcIikpKSB7XG5cdFx0XHRmbGFzaENhcmRzLnB1c2goY2FyZE1vZGVsLmdldChcIl9pZFwiKSk7XG5cdFx0XHR0aGlzLmRlY2tNb2RlbC5zZXQoXCJmbGFzaENhcmRzXCIsIGZsYXNoQ2FyZHMpO1xuXHRcdH1cblxuXHRcdHRoaXMuc2hvd0NhcmRMaXN0KCk7XG5cdH0sXG5cblx0b25EZWNrQ29sbGVjdGlvblN5bmM6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghXy5pc05pbCh0aGlzLmRlY2tNb2RlbCkgJiYgIV8uaXNOaWwodGhpcy5kZWNrTW9kZWwuaWQpICYmICFfLmlzTmlsKHRoaXMuZGVja0NvbGxlY3Rpb24uZ2V0KHRoaXMuZGVja01vZGVsLmlkKSkpXG5cdFx0XHRCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS50cmlnZ2VyKFwiZGVjazpzZWxlY3RcIiwgdGhpcy5kZWNrQ29sbGVjdGlvbi5nZXQodGhpcy5kZWNrTW9kZWwuaWQpLmNpZCwgdHJ1ZSk7XG5cdFx0ZWxzZVxuXHRcdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikudHJpZ2dlcihcImRlY2s6c2VsZWN0XCIsIG51bGwpO1xuXHR9LFxuXG5cdG9uRGVja0RlbGV0ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5jYXJkUmVnaW9uLmFkZENsYXNzKFwiZmxhc2gtY2FyZC1tYW5hZ2VyLWRpc2FibGVkXCIpO1xuXHR9LFxuXG5cdG9uRGVja0RlbGV0ZVJlamVjdGVkOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmNhcmRSZWdpb24ucmVtb3ZlQ2xhc3MoXCJmbGFzaC1jYXJkLW1hbmFnZXItZGlzYWJsZWRcIik7XG5cdH0sXG5cblx0b25EZWNrRGVsZXRlU2F2ZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc2hvd0JsYW5rQ2FyZEVkaXRvcigpO1xuXHRcdHRoaXMudWkuY2FyZFJlZ2lvbi5yZW1vdmVDbGFzcyhcImZsYXNoLWNhcmQtbWFuYWdlci1kaXNhYmxlZFwiKTtcblx0fSxcblxuXHRvbkRlY2tFZGl0U2F2ZWQ6IGFzeW5jIGZ1bmN0aW9uKGRlY2tNb2RlbENpZCkge1xuXHRcdGlmICh0aGlzLmNhcmRMaXN0ID09PSBudWxsKSB7XG5cdFx0XHRjb25zdCBkZWNrTW9kZWwgPSB0aGlzLmRlY2tDb2xsZWN0aW9uLmdldChkZWNrTW9kZWxDaWQpO1xuXG5cdFx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJjYXJkXCIsIG5ldyBTdGF0dXNWaWV3KHsgdHlwZTogXCJsb2FkaW5nXCIgfSkpO1xuXHRcdFx0dGhpcy5sb2FkQ2FyZHMoZGVja01vZGVsKTtcblx0XHR9XG5cblx0XHR0aGlzLnVpLmNhcmRSZWdpb24ucmVtb3ZlQ2xhc3MoXCJmbGFzaC1jYXJkLW1hbmFnZXItZGlzYWJsZWRcIik7XG5cdH0sXG5cblx0b25EZWNrRWRpdFJlamVjdGVkOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmNhcmRMaXN0ID0gdGhpcy5nZXRSZWdpb24oXCJjYXJkXCIpLmN1cnJlbnRWaWV3O1xuXHRcdHRoaXMudWkuY2FyZFJlZ2lvbi5yZW1vdmVDbGFzcyhcImZsYXNoLWNhcmQtbWFuYWdlci1kaXNhYmxlZFwiKTtcblx0fSxcblxuXHRvbkRlY2tTZWxlY3RlZDogZnVuY3Rpb24oZGVja01vZGVsQ2lkLCBza2lwQ2FyZExpc3RSZWZyZXNoKSB7XG5cdFx0aWYgKGRlY2tNb2RlbENpZCA9PT0gbnVsbCkge1xuXHRcdFx0dGhpcy5kZWNrTW9kZWwgPSBudWxsO1xuXHRcdFx0dGhpcy5zaG93QmxhbmtDYXJkRWRpdG9yKCk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5kZWNrTW9kZWwgPSB0aGlzLmRlY2tDb2xsZWN0aW9uLmdldChkZWNrTW9kZWxDaWQpO1xuXG5cdFx0XHRpZiAoIXNraXBDYXJkTGlzdFJlZnJlc2gpIHtcblx0XHRcdFx0dGhpcy5jYXJkTGlzdCA9IG51bGw7XG5cblx0XHRcdFx0aWYgKHRoaXMuZGVja01vZGVsLmlzTmV3KCkpIHtcblx0XHRcdFx0XHR0aGlzLnNob3dCbGFua0NhcmRFZGl0b3IoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJjYXJkXCIsIG5ldyBTdGF0dXNWaWV3KHsgdHlwZTogXCJsb2FkaW5nXCIgfSkpO1xuXHRcdFx0XHRcdHRoaXMubG9hZENhcmRzKHRoaXMuZGVja01vZGVsKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRvblBsYXllckNsb3NlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmV4aXRGdWxsc2NyZWVuKCk7XG5cdH0sXG5cblx0b25QbGF5ZXJTdGFydDogZnVuY3Rpb24oZGVja01vZGVsQ2lkKSB7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiY2FyZFwiLCBuZXcgUGxheWVyQ29udGFpbmVyKHtcblx0XHRcdGNhcmRDb2xsZWN0aW9uOiB0aGlzLmNhcmRDb2xsZWN0aW9uLFxuXHRcdFx0bW9kZWw6IHRoaXMuZGVja0NvbGxlY3Rpb24uZ2V0KGRlY2tNb2RlbENpZCksXG5cdFx0fSksIHsgcHJldmVudERlc3Ryb3k6IHRydWUgfSk7XG5cdH0sXG5cblx0b25QbGF5ZXJTdG9wOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNob3dDYXJkTGlzdCgpO1xuXHR9LFxuXG5cdGdldENhcmRDb3VudDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuY2FyZENvbGxlY3Rpb24ubGVuZ3RoO1xuXHR9LFxuXG5cdGdldENhcmROdW1iZXI6IGZ1bmN0aW9uKGNhcmRNb2RlbCkge1xuXHRcdHJldHVybiB0aGlzLmNhcmRDb2xsZWN0aW9uLmluZGV4T2YoY2FyZE1vZGVsKSArIDE7XG5cdH0sXG5cblx0c2hvd0NhcmRMaXN0OiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIXRoaXMuY2FyZExpc3QpXG5cdFx0XHR0aGlzLmNhcmRMaXN0ID0gbmV3IENhcmRMaXN0KHsgY2FyZENvbGxlY3Rpb246IHRoaXMuY2FyZENvbGxlY3Rpb24gfSk7XG5cblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJjYXJkXCIsIHRoaXMuY2FyZExpc3QpO1xuXG5cdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikudHJpZ2dlcihcImNhcmRMaXN0OnNob3duXCIpO1xuXHR9LFxuXG5cdHNob3dDYXJkRWRpdG9yOiBmdW5jdGlvbihjYXJkTW9kZWxDaWQpIHtcblx0XHRjb25zdCBjYXJkTW9kZWwgPSB0aGlzLmNhcmRDb2xsZWN0aW9uLmdldChjYXJkTW9kZWxDaWQpO1xuXHRcdC8vIERFUFJFQ0FUSU9OIFdBUk5JTkc6IHByZXZlbnREZXN0cm95IGlzIGRlcHJlY2F0ZWQgaW4gTWFyaW9uZXR0ZSAzLjQuNFxuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImNhcmRcIiwgbmV3IENhcmRFZGl0b3Ioe1xuXHRcdFx0ZGVja01vZGVsQ2lkOiB0aGlzLmRlY2tNb2RlbC5jaWQsXG5cdFx0XHRtb2RlbDogY2FyZE1vZGVsLFxuXHRcdH0pLCB7IHByZXZlbnREZXN0cm95OiB0cnVlIH0pO1xuXHR9LFxuXG5cdGxvYWRDYXJkczogZnVuY3Rpb24oZGVja01vZGVsKSB7XG5cdFx0Y29uc3QgY29sbGVjdGlvbnMgPSBbbmV3IENhcmRDb2xsZWN0aW9uKFtdLCB7IGRlY2s6IGRlY2tNb2RlbC5nZXQoXCJfaWRcIikgfSkubGF6eUZldGNoKCldO1xuXG5cdFx0UHJvbWlzZS5hbGwoY29sbGVjdGlvbnMpLnNwcmVhZChjYXJkQ29sbGVjdGlvbiA9PiB7XG5cdFx0XHR0aGlzLnN0b3BMaXN0ZW5pbmdUb0NhcmRDb2xsZWN0aW9uKCk7XG5cblx0XHRcdHRoaXMuY2FyZENvbGxlY3Rpb24gPSBjYXJkQ29sbGVjdGlvbjtcblxuXHRcdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmNhcmRDb2xsZWN0aW9uLCBcInVwZGF0ZVwiLCB0aGlzLm9uQ2FyZENvbGxlY3Rpb25VcGRhdGVkLmJpbmQodGhpcywgZGVja01vZGVsLmNpZCkpO1xuXG5cdFx0XHRpZiAodGhpcy5jYXJkQ29sbGVjdGlvbi5sZW5ndGggPiAwKVxuXHRcdFx0XHR0aGlzLnNob3dDYXJkTGlzdCgpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLmVkaXROZXdDYXJkKCk7XG5cdFx0fSkuY2F0Y2godGhpcy5zaG93Q2FyZExvYWRFcnJvci5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRvbkNhcmRDb2xsZWN0aW9uVXBkYXRlZDogZnVuY3Rpb24oZGVja01vZGVsQ2lkKSB7XG5cdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikudHJpZ2dlcihcImRlY2s6c2l6ZTp1cGRhdGVkXCIsIGRlY2tNb2RlbENpZCwgdGhpcy5jYXJkQ29sbGVjdGlvbi5sZW5ndGgpO1xuXHR9LFxuXG5cdHNob3dDYXJkTG9hZEVycm9yOiBmdW5jdGlvbihlcnJvcikge1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImNhcmRcIiwgbmV3IEVycm9yVmlldyh7IGZldGNoRXJyb3I6IGVycm9yIH0pKTtcblxuXHRcdGlmICghc2V0dGluZ3MuZGVidWcgfHwgc2V0dGluZ3MucmVwb3J0RXJyb3JzKVxuXHRcdFx0cmF5Z3VuKFwic2VuZFwiLCBlcnJvcik7XG5cdH0sXG5cblx0cmVuZGVyTG9hZGluZ1N0YXR1czogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwic3RhdHVzXCIsIG5ldyBTdGF0dXNWaWV3KHsgdHlwZTogXCJsb2FkaW5nXCIgfSkpO1xuXHR9LFxuXG5cdHJlbmRlckVycm9yOiBmdW5jdGlvbihlcnJvcikge1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcInN0YXR1c1wiLCBuZXcgRXJyb3JWaWV3KHsgZmV0Y2hFcnJvcjogZXJyb3IgfSkpO1xuXHR9LFxuXG5cdHJlbmRlclBhZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkuc3RhdHVzUmVnaW9uLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLmNvbnRlbnRDb250YWluZXIucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0Ly8gQ3JlYXRlIHRoZSBkZWNrIGVkaXRvclxuXHRcdHRoaXMuZGVja0VkaXRvciA9IG5ldyBEZWNrRWRpdG9yKHtcblx0XHRcdGNhblBsYXk6IHRydWUsXG5cdFx0XHRkZWNrQ29sbGVjdGlvbjogdGhpcy5kZWNrQ29sbGVjdGlvbixcblx0XHR9KTtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJkZWNrXCIsIHRoaXMuZGVja0VkaXRvcik7XG5cblx0XHQvLyBTaG93IGEgYmxhbmsgcGFnZSBpbiBwbGFjZSBvZiB0aGUgY2FyZCBlZGl0b3Jcblx0XHR0aGlzLnNob3dCbGFua0NhcmRFZGl0b3IoKTtcblx0fSxcblxuXHRzaG93QmxhbmtDYXJkRWRpdG9yOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJjYXJkXCIsIG5ldyBDYXJkRWRpdG9yQmxhbmsoKSk7XG5cdH0sXG5cblx0c3RvcExpc3RlbmluZ1RvQ2FyZENvbGxlY3Rpb246IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLmNhcmRDb2xsZWN0aW9uKVxuXHRcdFx0dGhpcy5zdG9wTGlzdGVuaW5nKHRoaXMuY2FyZENvbGxlY3Rpb24pO1xuXHR9LFxuXG5cdHN0b3BMaXN0ZW5pbmdUb0RlY2tDb2xsZWN0aW9uOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5kZWNrQ29sbGVjdGlvbilcblx0XHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLmRlY2tDb2xsZWN0aW9uKTtcblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc3RvcExpc3RlbmluZ1RvQ2FyZENvbGxlY3Rpb24oKTtcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmdUb0RlY2tDb2xsZWN0aW9uKCk7XG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpKTtcblx0fSxcbn0pO1xuIl19",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nrequire(\"jquery.flip\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\nvar seedrandom = require(\"seedrandom\");\n\nvar FlashCardPlayer = require(\"../../../lib/flashCardPlayer\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"flash-card-player-container hide\",\n\n\ttemplate: require(\"../../templates/flashCards/playerContainer.nunj\"),\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\n\t\tthis.listenTo(Backbone.Radio.channel(\"flashCards\"), {\n\t\t\t\"player:fullscreen:enter\": this.enterFullscreen.bind(this),\n\t\t\t\"player:fullscreen:exit\": this.exitFullscreen.bind(this)\n\t\t});\n\t},\n\n\tonRender: function onRender() {\n\t\t$(document).on(\"webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange\", this.onFullScreenChange.bind(this));\n\t\t//\t\tthis.ui.playerContainer.on(\"webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange\", this.onFullScreenChange.bind(this));\n\n\t\tthis.flashCardPlayer = new FlashCardPlayer({\n\t\t\t$: $,\n\t\t\tmoment: moment,\n\t\t\tparent: this.$el,\n\t\t\tseedrandom: seedrandom\n\t\t});\n\n\t\tvar flashCardDeck = this.model.toJSON();\n\t\tvar flashCards = { flashCards: _.invokeMap(this.options.cardCollection.models, \"toJSON\") };\n\n\t\tthis.flashCardPlayer.start(flashCardDeck, flashCards, { sessions: [] }, { previewMode: true });\n\n\t\tthis.$el.removeClass(\"hide\");\n\n\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"player:started\", this.model.cid);\n\t},\n\n\tenterFullscreen: function enterFullscreen() {\n\t\tvar element = this.$el.get(0);\n\t\tvar method = element.requestFullscreen || element.msRequestFullscreen || element.mozRequestFullScreen || element.webkitRequestFullscreen;\n\n\t\tif (method) method.call(element);else throw new Error(\"Unable to enter fullscreen mode.\");\n\t},\n\n\texitFullscreen: function exitFullscreen() {\n\t\tvar method = document.exitFullscreen || document.mozCancelFullScreen || document.webkitExitFullscreen || document.msExitFullscreen;\n\n\t\tif (method) method.call(document);else throw new Error(\"Unable to exit fullscreen mode.\");\n\t},\n\n\tonFullScreenChange: function onFullScreenChange() {\n\t\tif (this.fullscreen) {\n\t\t\tthis.fullscreen = false;\n\t\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"player:fullscreen:exited\", this.model.cid);\n\t\t} else {\n\t\t\tthis.fullscreen = true;\n\t\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"player:fullscreen:entered\", this.model.cid);\n\t\t}\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(Backbone.Radio.channel(\"flashCards\"));\n\n\t\t$(document).off(\"webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange\", this.onFullScreenChange.bind(this));\n\t\t//\t\tthis.ui.playerContainer.off(\"webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange\", this.onFullScreenChange.bind(this));\n\n\t\tBackbone.Radio.channel(\"flashCards\").trigger(\"player:stopped\", this.model.cid);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBsYXllckNvbnRhaW5lci5qcyJdLCJuYW1lcyI6WyIkIiwicmVxdWlyZSIsIl8iLCJCYWNrYm9uZSIsIm1vbWVudCIsInNlZWRyYW5kb20iLCJGbGFzaENhcmRQbGF5ZXIiLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJleHRlbmQiLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsImluaXRpYWxpemUiLCJvcHRpb25zIiwibGlzdGVuVG8iLCJSYWRpbyIsImNoYW5uZWwiLCJlbnRlckZ1bGxzY3JlZW4iLCJiaW5kIiwiZXhpdEZ1bGxzY3JlZW4iLCJvblJlbmRlciIsImRvY3VtZW50Iiwib24iLCJvbkZ1bGxTY3JlZW5DaGFuZ2UiLCJmbGFzaENhcmRQbGF5ZXIiLCJwYXJlbnQiLCIkZWwiLCJmbGFzaENhcmREZWNrIiwibW9kZWwiLCJ0b0pTT04iLCJmbGFzaENhcmRzIiwiaW52b2tlTWFwIiwiY2FyZENvbGxlY3Rpb24iLCJtb2RlbHMiLCJzdGFydCIsInNlc3Npb25zIiwicHJldmlld01vZGUiLCJyZW1vdmVDbGFzcyIsInRyaWdnZXIiLCJjaWQiLCJlbGVtZW50IiwiZ2V0IiwibWV0aG9kIiwicmVxdWVzdEZ1bGxzY3JlZW4iLCJtc1JlcXVlc3RGdWxsc2NyZWVuIiwibW96UmVxdWVzdEZ1bGxTY3JlZW4iLCJ3ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbiIsImNhbGwiLCJFcnJvciIsIm1vekNhbmNlbEZ1bGxTY3JlZW4iLCJ3ZWJraXRFeGl0RnVsbHNjcmVlbiIsIm1zRXhpdEZ1bGxzY3JlZW4iLCJmdWxsc2NyZWVuIiwib25CZWZvcmVEZXN0cm95Iiwic3RvcExpc3RlbmluZyIsIm9mZiJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsSUFBSUMsUUFBUSxRQUFSLENBQVY7QUFDQUEsUUFBUSxhQUFSO0FBQ0EsSUFBTUMsSUFBSUQsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNRSxXQUFXRixRQUFRLFVBQVIsQ0FBakI7QUFD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cEY7QUFDQSxHQUhELE1BSUs7QUFDSixRQUFLYSxVQUFMLEdBQWtCLElBQWxCO0FBQ0FuRCxZQUFTYyxLQUFULENBQWVDLE9BQWYsQ0FBdUIsWUFBdkIsRUFBcUNzQixPQUFyQyxDQUE2QywyQkFBN0MsRUFBMEUsS0FBS1YsS0FBTCxDQUFXVyxHQUFyRjtBQUNBO0FBQ0QsRUEvRCtDOztBQWlFaERjLGtCQUFpQiwyQkFBVztBQUMzQixPQUFLQyxhQUFMLENBQW1CckQsU0FBU2MsS0FBVCxDQUFlQyxPQUFmLENBQXVCLFlBQXZCLENBQW5COztBQUVBbEIsSUFBRXVCLFFBQUYsRUFBWWtDLEdBQVosQ0FBZ0IsZ0ZBQWhCLEVBQWtHLEtBQUtoQyxrQkFBTCxDQUF3QkwsSUFBeEIsQ0FBNkIsSUFBN0IsQ0FBbEc7QUFDQTs7QUFFQWpCLFdBQVNjLEtBQVQsQ0FBZUMsT0FBZixDQUF1QixZQUF2QixFQUFxQ3NCLE9BQXJDLENBQTZDLGdCQUE3QyxFQUErRCxLQUFLVixLQUFMLENBQVdXLEdBQTFFO0FBQ0E7QUF4RStDLENBQWhDLENBQWpCIiwiZmlsZSI6InBsYXllckNvbnRhaW5lci5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5yZXF1aXJlKFwianF1ZXJ5LmZsaXBcIik7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgbW9tZW50ID0gcmVxdWlyZShcIm1vbWVudFwiKTtcbmNvbnN0IHNlZWRyYW5kb20gPSByZXF1aXJlKFwic2VlZHJhbmRvbVwiKTtcblxuY29uc3QgRmxhc2hDYXJkUGxheWVyID0gcmVxdWlyZShcIi4uLy4uLy4uL2xpYi9mbGFzaENhcmRQbGF5ZXJcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJmbGFzaC1jYXJkLXBsYXllci1jb250YWluZXIgaGlkZVwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2ZsYXNoQ2FyZHMvcGxheWVyQ29udGFpbmVyLm51bmpcIiksXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cblx0XHR0aGlzLmxpc3RlblRvKEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLCB7XG5cdFx0XHRcInBsYXllcjpmdWxsc2NyZWVuOmVudGVyXCI6IHRoaXMuZW50ZXJGdWxsc2NyZWVuLmJpbmQodGhpcyksXG5cdFx0XHRcInBsYXllcjpmdWxsc2NyZWVuOmV4aXRcIjogdGhpcy5leGl0RnVsbHNjcmVlbi5iaW5kKHRoaXMpLFxuXHRcdH0pO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHQkKGRvY3VtZW50KS5vbihcIndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UgbW96ZnVsbHNjcmVlbmNoYW5nZSBmdWxsc2NyZWVuY2hhbmdlIE1TRnVsbHNjcmVlbkNoYW5nZVwiLCB0aGlzLm9uRnVsbFNjcmVlbkNoYW5nZS5iaW5kKHRoaXMpKTtcblx0XHQvL1x0XHR0aGlzLnVpLnBsYXllckNvbnRhaW5lci5vbihcIndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UgbW96ZnVsbHNjcmVlbmNoYW5nZSBmdWxsc2NyZWVuY2hhbmdlIE1TRnVsbHNjcmVlbkNoYW5nZVwiLCB0aGlzLm9uRnVsbFNjcmVlbkNoYW5nZS5iaW5kKHRoaXMpKTtcblxuXHRcdHRoaXMuZmxhc2hDYXJkUGxheWVyID0gbmV3IEZsYXNoQ2FyZFBsYXllcih7XG5cdFx0XHQkOiAkLFxuXHRcdFx0bW9tZW50OiBtb21lbnQsXG5cdFx0XHRwYXJlbnQ6IHRoaXMuJGVsLFxuXHRcdFx0c2VlZHJhbmRvbTogc2VlZHJhbmRvbSxcblx0XHR9KTtcblxuXHRcdGNvbnN0IGZsYXNoQ2FyZERlY2sgPSB0aGlzLm1vZGVsLnRvSlNPTigpO1xuXHRcdGNvbnN0IGZsYXNoQ2FyZHMgPSB7IGZsYXNoQ2FyZHM6IF8uaW52b2tlTWFwKHRoaXMub3B0aW9ucy5jYXJkQ29sbGVjdGlvbi5tb2RlbHMsIFwidG9KU09OXCIpIH07XG5cblx0XHR0aGlzLmZsYXNoQ2FyZFBsYXllci5zdGFydChmbGFzaENhcmREZWNrLCBmbGFzaENhcmRzLCB7IHNlc3Npb25zOiBbXSB9LCB7IHByZXZpZXdNb2RlOiB0cnVlIH0pO1xuXG5cdFx0dGhpcy4kZWwucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImZsYXNoQ2FyZHNcIikudHJpZ2dlcihcInBsYXllcjpzdGFydGVkXCIsIHRoaXMubW9kZWwuY2lkKTtcblx0fSxcblxuXHRlbnRlckZ1bGxzY3JlZW46IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGVsZW1lbnQgPSB0aGlzLiRlbC5nZXQoMCk7XG5cdFx0Y29uc3QgbWV0aG9kID0gZWxlbWVudC5yZXF1ZXN0RnVsbHNjcmVlbiB8fCBlbGVtZW50Lm1zUmVxdWVzdEZ1bGxzY3JlZW4gfHwgZWxlbWVudC5tb3pSZXF1ZXN0RnVsbFNjcmVlbiB8fCBlbGVtZW50LndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuO1xuXG5cdFx0aWYgKG1ldGhvZClcblx0XHRcdG1ldGhvZC5jYWxsKGVsZW1lbnQpO1xuXHRcdGVsc2Vcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBlbnRlciBmdWxsc2NyZWVuIG1vZGUuXCIpO1xuXHR9LFxuXG5cdGV4aXRGdWxsc2NyZWVuOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBtZXRob2QgPSBkb2N1bWVudC5leGl0RnVsbHNjcmVlbiB8fCBkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuIHx8IGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuIHx8IGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW47XG5cblx0XHRpZiAobWV0aG9kKVxuXHRcdFx0bWV0aG9kLmNhbGwoZG9jdW1lbnQpO1xuXHRcdGVsc2Vcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBleGl0IGZ1bGxzY3JlZW4gbW9kZS5cIik7XG5cdH0sXG5cblx0b25GdWxsU2NyZWVuQ2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5mdWxsc2NyZWVuKSB7XG5cdFx0XHR0aGlzLmZ1bGxzY3JlZW4gPSBmYWxzZTtcblx0XHRcdEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpLnRyaWdnZXIoXCJwbGF5ZXI6ZnVsbHNjcmVlbjpleGl0ZWRcIiwgdGhpcy5tb2RlbC5jaWQpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMuZnVsbHNjcmVlbiA9IHRydWU7XG5cdFx0XHRCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS50cmlnZ2VyKFwicGxheWVyOmZ1bGxzY3JlZW46ZW50ZXJlZFwiLCB0aGlzLm1vZGVsLmNpZCk7XG5cdFx0fVxuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJmbGFzaENhcmRzXCIpKTtcblxuXHRcdCQoZG9jdW1lbnQpLm9mZihcIndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UgbW96ZnVsbHNjcmVlbmNoYW5nZSBmdWxsc2NyZWVuY2hhbmdlIE1TRnVsbHNjcmVlbkNoYW5nZVwiLCB0aGlzLm9uRnVsbFNjcmVlbkNoYW5nZS5iaW5kKHRoaXMpKTtcblx0XHQvL1x0XHR0aGlzLnVpLnBsYXllckNvbnRhaW5lci5vZmYoXCJ3ZWJraXRmdWxsc2NyZWVuY2hhbmdlIG1vemZ1bGxzY3JlZW5jaGFuZ2UgZnVsbHNjcmVlbmNoYW5nZSBNU0Z1bGxzY3JlZW5DaGFuZ2VcIiwgdGhpcy5vbkZ1bGxTY3JlZW5DaGFuZ2UuYmluZCh0aGlzKSk7XG5cblx0XHRCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZmxhc2hDYXJkc1wiKS50cmlnZ2VyKFwicGxheWVyOnN0b3BwZWRcIiwgdGhpcy5tb2RlbC5jaWQpO1xuXHR9LFxufSk7XG4iXX0=",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\n\nvar App = require(\"../../../index\");\nvar settings = require(\"app-settings\");\n\nvar radio = Backbone.Radio.channel(\"global\");\nvar rester = require(\"rester\");\n\nvar AssessmentImportModal = require(\"../../../lib/assessmentImportModal\");\nvar AssessmentImportModel = require(\"../../../lib/assessmentImportModel\");\nvar BulkResourceUploadModal = require(\"../../../lib/bulkResourceUploadModal\");\nvar AssessmentModal = require(\"../../../lib/assessmentModal\");\nvar Assessment = require(\"../../../lib/assessmentModel\");\nvar ChangelogModal = require(\"../../../lib/changelogModal\");\nvar EventModal = require(\"../../../lib/eventModal\");\nvar EventModel = require(\"../../../lib/eventModel\");\nvar LightBox = require(\"../../../lib/lightBox\");\nvar ResourceCollection = require(\"../../collections/manager/resourceCollection\");\nvar ResourceModal = require(\"../../../lib/resourceModal\");\nvar Resource = require(\"../../models/manager/resourceModel\");\nvar ServerGrid = require(\"../../../lib/serverGrid\");\nvar SimpleMenu = require(\"../../../lib/simpleMenu\");\nvar SmallModal = require(\"../../../lib/smallModal\");\nvar BulkDragDropHelper = require(\"../../../lib/bulkDragDropHelper\");\nvar ConfirmationModal = require(\"./multiDeleteConfirmation\");\nvar FlashcardPreview = require(\"../../../lib/flashcardPreview\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"content content-manager\",\n\n\ttemplate: require(\"../../templates/manager/layout.nunj\"),\n\n\tui: {\n\t\tfilterBar: \".ops-bar .filters\",\n\t\tcounterBar: \".ops-bar .counter\",\n\t\taddIcon: \".add-item\",\n\t\timportIcon: \".import-item\",\n\t\tdownload: \"div.download\",\n\t\tpaging: \".paging\",\n\t\tgrid: \"div.grid\",\n\t\tcancelDrop: \".cancel-drop\",\n\n\t\tmultiSelect: \".multiselect-container input\",\n\t\tmultiActions: \".multi-actions\",\n\t\tmultiDelete: \".multi-actions .delete\",\n\t\tmultiCancel: \".multi-actions .cancel\"\n\t},\n\n\tcollectionEvents: {\n\t\t\"toolbar:click:clone\": \"cloneItem\",\n\t\t\"toolbar:click:delete\": \"deleteItem\",\n\t\t\"toolbar:click:edit\": \"editItem\",\n\t\t\"toolbar:click:download\": \"downloadItem\",\n\t\t\"toolbar:click:pdf\": \"reproduceItem\",\n\t\t\"toolbar:click:export\": \"exportItem\",\n\t\t\"toolbar:click:changelog\": \"changelog\",\n\t\t\"sync error\": \"fetchEnd\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.addIcon\": \"showAdd\",\n\t\t\"click @ui.importIcon\": \"showImport\",\n\t\t\"click @ui.download\": \"showDownloads\",\n\n\t\t\"drop @ui.grid\": \"onDrop\",\n\t\t\"dragenter @ui.grid\": \"onDragEnter\",\n\t\t\"dragleave @ui.grid\": \"onDragLeave\",\n\t\t\"dragover @ui.grid\": \"onDragOver\",\n\t\t\"change @ui.fileInput\": \"onFileInputChange\",\n\t\t\"drop @ui.cancelDrop\": \"onCancelFileDrop\",\n\n\t\t\"change @ui.multiSelect\": \"multiSelectChange\",\n\t\t\"click @ui.multiDelete\": \"onMultiDelete\",\n\t\t\"click @ui.multiCancel\": \"onMultiCancel\"\n\t},\n\n\tshowAdd: function showAdd(evt) {\n\t\tevt.stopPropagation();\n\n\t\tvar els = [{ text: \"Add new resource\", id: \"addResource\" }];\n\t\tif (settings.assessments) els.push({ text: \"Add new assessment / survey\", id: \"addAssessment\" });\n\t\tels.push({ text: \"Add new event\", id: \"addEvent\" });\n\n\t\tvar Menu = new SimpleMenu({\n\t\t\tanchor: this.ui.addIcon,\n\t\t\tside: \"left\",\n\t\t\tstructure: [{\n\t\t\t\tcloseOnClick: true,\n\t\t\t\telements: els\n\t\t\t}]\n\t\t});\n\n\t\tMenu.on(\"clicked:addResource\", this.onAddResourceClicked.bind(this));\n\t\tMenu.on(\"clicked:addAssessment\", this.onAddAssessmentClicked.bind(this));\n\t\tMenu.on(\"clicked:addEvent\", this.onAddEventClicked.bind(this));\n\n\t\tthis.onMultiCancel();\n\n\t\tMenu.show();\n\t},\n\n\tshowImport: function showImport(event) {\n\t\tevent.stopPropagation();\n\n\t\tvar items = [{ text: \"Import from my computer\", id: \"importResources\" }, { text: \"Import existing assessment\", id: \"importAssessment\" }];\n\n\t\tvar Menu = new SimpleMenu({\n\t\t\tanchor: this.ui.importIcon,\n\t\t\tside: \"left\",\n\t\t\tstructure: [{\n\t\t\t\tcloseOnClick: true,\n\t\t\t\telements: items\n\t\t\t}]\n\t\t});\n\n\t\tMenu.on(\"clicked:importAssessment\", this.onImportAssessmentClicked.bind(this));\n\t\tMenu.on(\"clicked:importResources\", this.onImportResourcesClicked.bind(this));\n\n\t\tthis.onMultiCancel();\n\n\t\tMenu.show();\n\t},\n\n\tonAddResourceClicked: function onAddResourceClicked() {\n\t\tthis.assembleResource();\n\t},\n\n\tassembleResource: function assembleResource(model) {\n\t\tvar _this = this;\n\n\t\tvar modal = new ResourceModal({\n\t\t\tmodel: model || new Resource()\n\t\t});\n\n\t\tmodal.show({\n\t\t\tcreate: function create(result) {\n\t\t\t\t_this.grid.collection.getFirstPage();\n\n\t\t\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\t\t\tcontent: \"New item \" + result.model.get(\"title\") + \" successfully created\"\n\t\t\t\t});\n\t\t\t},\n\t\t\tcreateAnother: function createAnother() {\n\t\t\t\t_this.grid.collection.getFirstPage();\n\t\t\t},\n\t\t\tupdate: function update(result) {\n\t\t\t\tresult.model.trigger(\"grid:render\");\n\n\t\t\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\t\t\tcontent: \"Item \" + result.model.get(\"title\") + \" successfully updated\"\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t},\n\n\tonAddAssessmentClicked: function onAddAssessmentClicked() {\n\t\tthis.assembleAssessment();\n\t},\n\n\tassembleAssessment: function assembleAssessment(model) {\n\t\tvar modal = new AssessmentModal({\n\t\t\tmodel: model || new Assessment()\n\t\t});\n\n\t\tmodal.show({\n\t\t\tcreate: function create(result) {\n\t\t\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\t\t\tcontent: \"New item \" + result.model.get(\"title\") + \" successfully created\"\n\t\t\t\t});\n\t\t\t},\n\t\t\tupdate: function update(result) {\n\t\t\t\tresult.model.trigger(\"grid:render\");\n\n\t\t\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\t\t\tcontent: \"Item \" + result.model.get(\"title\") + \" successfully updated\"\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t},\n\n\tonAddEventClicked: function onAddEventClicked() {\n\t\tthis.assembleEvent();\n\t},\n\n\tassembleEvent: function assembleEvent(model) {\n\t\tvar _this2 = this;\n\n\t\tthis.EventModal = new EventModal({\n\t\t\tmodel: model ? model : new EventModel(),\n\t\t\tmetadata: this.EventMetadataModel\n\t\t});\n\n\t\tvar createEvent = function createEvent(newEvent) {\n\t\t\t_this2.trigger(\"event:created\", newEvent);\n\t\t};\n\n\t\tthis.EventModal.show({\n\t\t\tcreate: function create(result) {\n\t\t\t\tcreateEvent(result.model);\n\n\t\t\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\t\t\tcontent: \"New event \" + result.model.get(\"title\") + \" successfully created\"\n\t\t\t\t});\n\t\t\t},\n\t\t\tcreateAnother: function createAnother(result) {\n\t\t\t\tcreateEvent(result.model);\n\t\t\t},\n\t\t\tupdate: function update(result) {\n\t\t\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\t\t\tcontent: \"Event \" + result.model.get(\"title\") + \" successfully updated\"\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t},\n\n\tonImportAssessmentClicked: function onImportAssessmentClicked() {\n\t\tvar _this3 = this;\n\n\t\tvar modal = new AssessmentImportModal({ model: new AssessmentImportModel() });\n\n\t\tmodal.once(\"action\", function (action) {\n\t\t\tif (action === \"close\") _this3.grid.collection.getFirstPage();\n\t\t});\n\n\t\tmodal.show();\n\t},\n\n\tonImportResourcesClicked: function onImportResourcesClicked() {\n\t\tvar _this4 = this;\n\n\t\tvar modal = new BulkResourceUploadModal({ model: new Backbone.Model({ chooseFiles: true }) });\n\n\t\tmodal.once(\"action\", function (action) {\n\t\t\tif (action === \"save\") _this4.grid.collection.getFirstPage();\n\t\t});\n\n\t\tmodal.show();\n\t},\n\n\tshowDownloads: function showDownloads(evt) {\n\t\tevt.stopPropagation();\n\n\t\tvar list = new SimpleMenu({\n\t\t\tanchor: this.ui.download,\n\t\t\tside: \"left\",\n\t\t\tstructure: [{ closeOnClick: true, elements: [{ text: \"Export list of users\", id: \"users\" }] }]\n\t\t});\n\t\tlist.show();\n\n\t\tthis.listenTo(list, \"clicked:users\", this.downloadList.bind(this));\n\t},\n\n\tdownloadList: function downloadList() {\n\t\twindow.open(settings.urlRoot + \"/api/1.0/resources/lists/content\");\n\t},\n\n\tfilterClone: function filterClone(model) {\n\t\treturn model.get(\"category\") === \"assessment\";\n\t},\n\n\tfilterDownload: function filterDownload(model) {\n\t\treturn !_.includes([\"assessment\", \"vidimus\", \"event\"], model.get(\"category\"));\n\t},\n\n\tfilterDelete: function filterDelete() {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\t\treturn rester.hasAccess(rester.p.api.resources.delete, user);\n\t},\n\n\tfilterAssessments: function filterAssessments(model) {\n\t\treturn _.includes([\"assessment\"], model.get(\"category\"));\n\t},\n\n\tonRender: function onRender() {\n\t\tvar tooltips = [{ title: \"Clone\", icon: \"fa-clone\", filter: this.filterClone.bind(this) }, { title: \"Download\", icon: \"fa-download\", filter: this.filterDownload.bind(this) }, { title: \"PDF\", icon: \"fa-file-pdf\", filter: this.filterAssessments.bind(this) }, { title: \"Export\", icon: \"fa-cloud-download\", filter: this.filterAssessments.bind(this) }, { title: \"Delete\", icon: \"fa-trash-alt\", filter: this.filterDelete.bind(this) }];\n\n\t\tif (settings.resourceEditing) tooltips.unshift({ title: \"Edit\", icon: \"fa-edit\" });\n\n\t\ttooltips.unshift({ title: \"Changelog\", icon: \"fa-list-ul\" });\n\n\t\tvar columns = [{ name: \"selected\", label: \"\", headerCell: ServerGrid.SelectAllHeaderCell.extend({}), cell: ServerGrid.CheckboxCell.extend({}), editable: false, sortable: false }, { name: \"contentType\", label: \"Type\", cell: ServerGrid.HTMLCell.extend({}), editable: false }, { name: \"title\", label: \"Title\", cell: \"string\", editable: false, sortValue: ServerGrid.stringSort }, { name: \"subject_name\", label: \"Subject\", cell: \"string\", editable: false }, { name: \"contentGrade\", label: \"Grade\", cell: \"string\", editable: false }, { name: \"language\", label: \"Language\", cell: \"string\", editable: false }, { name: \"readableSize\", label: \"Size\", cell: \"string\", editable: false }, { name: \"lastUpdated\", label: \"Last Changed\", editable: false, cell: ServerGrid.MomentCell.extend({\n\t\t\t\tmodelInUnixTimestamp: true,\n\t\t\t\tdisplayFormat: \"DD MMM YYYY, HH:mm a\",\n\t\t\t\tdisplayInUTC: false\n\t\t\t}) }, { label: \"Actions\", cell: new ServerGrid.ToolbarCell({ tooltips: tooltips }), editable: false, sortable: false }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new ResourceCollection(),\n\t\t\tclickable: true,\n\t\t\twaitForFilters: true,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counterBar,\n\t\t\t\ttemplate: \"Content $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tthis.collection = this.grid.collection;\n\n\t\tthis.bindEvents(this.collection, this.collectionEvents);\n\n\t\tthis.listenTo(this.grid, \"row:clicked\", this.editItem.bind(this));\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar currentYear = {\n\t\t\ttype: \"toggle\",\n\t\t\tname: \"currentYear\",\n\t\t\tlabel: \"Current year's content\",\n\t\t\tserver: true,\n\t\t\tinitialValue: function initialValue() {\n\t\t\t\treturn [true];\n\t\t\t}\n\t\t};\n\n\t\tvar languageFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"languageFilter\",\n\t\t\tlabel: \"Language\",\n\t\t\tcategories: [{ items: settings.languageList }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar subjectFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"subjectFilter\",\n\t\t\tlabel: \"Subject\",\n\t\t\tserver: {\n\t\t\t\tkey: \"subject_id\",\n\t\t\t\tvalue: \"subject\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/subjects\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\n\t\tvar gradeFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"gradeFilter\",\n\t\t\tlabel: \"Year of Study\",\n\t\t\tserver: true,\n\t\t\tcategories: _.map(settings.gradeList, function (val, key) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: key,\n\t\t\t\t\titems: _.reduce(val.sort(function (a, b) {\n\t\t\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t\t\t}), function (sum, num) {\n\t\t\t\t\t\tsum.push({ name: num.value, label: num.name });\n\t\t\t\t\t\treturn sum;\n\t\t\t\t\t}, [])\n\t\t\t\t};\n\t\t\t})\n\t\t};\n\n\t\tvar categories = [{ name: \"assessment\", label: \"Assessment\", image: settings.urlRoot + \"/images/content/annotation_interactive.png\" }, { name: \"audio\", label: \"Audio\", image: settings.urlRoot + \"/images/content/annotation_mp3.png\" }, { name: \"flashcarddeck\", label: \"Flashcard Deck\", image: settings.urlRoot + \"/images/content/annotation_flashcards.png\" }, { name: \"image\", label: \"Image\", image: settings.urlRoot + \"/images/content/annotation_graphic.png\" }, { name: \"pdf\", label: \"PDF\", image: settings.urlRoot + \"/images/content/annotation_pdf.png\" }, { name: \"text\", label: \"Text\", image: settings.urlRoot + \"/images/content/annotation_text.png\" }, { name: \"url\", label: \"URL\", image: settings.urlRoot + \"/images/content/annotation_url.png\" }, { name: \"video\", label: \"Video\", image: settings.urlRoot + \"/images/content/annotation_video.png\" }];\n\n\t\tif (settings.officeContent) {\n\t\t\tcategories.push({ name: \"excel\", label: \"MS Excel\", image: settings.urlRoot + \"/images/content/annotation_excel.png\" }, { name: \"powerpoint\", label: \"MS PowerPoint\", image: settings.urlRoot + \"/images/content/annotation_powerpoint.png\" }, { name: \"word\", label: \"MS Word\", image: settings.urlRoot + \"/images/content/annotation_word.png\" });\n\t\t}\n\n\t\tcategories = _.sortBy(categories, function (c) {\n\t\t\treturn c.label;\n\t\t});\n\n\t\tvar typeFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"typeFilter\",\n\t\t\tlabel: \"Type\",\n\t\t\tcategories: [{ items: categories }],\n\t\t\tserver: true,\n\t\t\ticons: true\n\t\t};\n\n\t\tthis.ui.filterBar.prepend(this.grid.filter({\n\t\t\tfilterContainer: this.ui.filterBar,\n\t\t\tfilters: [textFilter, currentYear, languageFilter, subjectFilter, gradeFilter, typeFilter],\n\t\t\tdefaultFilters: [\"textFilter\", \"currentYear\", \"typeFilter\"]\n\t\t}).render().el);\n\n\t\tthis.listenTo(this.grid.filter, \"change changed\", this.onFilterChange.bind(this));\n\n\t\tif (!settings.assessments) this.ui.importIcon.addClass(\"hide\");\n\n\t\tthis.dragCount = 0;\n\t},\n\n\tonFilterChange: function onFilterChange() {\n\t\tthis.grid.collection.trigger(\"filter:change\");\n\t},\n\n\tdeleteItem: function deleteItem(model) {\n\t\tvar _this5 = this;\n\n\t\tthis.delModal = new SmallModal({\n\t\t\tpersist: true,\n\t\t\twarning: true,\n\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Delete Item: \" + model.get(\"title\").replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t}),\n\t\t\tbody: \"<p>Are you sure you want to delete this item?</p>\\n\\t\\t\\t\\t<p>It will not be removed from books and \" + _.toLower(settings.learningPathsPluralCustomName) + \"; it will just become unusable going forward.</p>\\n\\t\\t\\t\\t<p>You can choose to remove it from your books and \" + _.toLower(settings.learningPathsPluralCustomName) + \" by clicking the option below.<p>\\n\\t\\t\\t\\t<p><label><input type='checkbox' value='1'> Yes, also remove all instances of this item from my books and \" + _.toLower(settings.learningPathsPluralCustomName) + \"</label></p>\"\n\t\t});\n\t\tthis.delModal.on(\"button:ok\", function () {\n\t\t\tmodel.andAttachments = $(\"input\", _this5.delModal.el).prop(\"checked\");\n\t\t\tmodel.destroy({ wait: true, data: { andAttachments: $(\"input\", _this5.delModal.el).prop(\"checked\") }, success: _this5.deletionSuccess.bind(_this5), error: _this5.deletionError.bind(_this5) });\n\n\t\t\tif (model.has(\"category\") && model.get(\"category\") === \"assessment\") App.trigger(\"cache:invalidate:assessments\");\n\t\t});\n\n\t\tthis.delModal.show();\n\t},\n\n\tcloneItem: function cloneItem(model) {\n\t\tvar model2 = new Assessment(model.toJSON());\n\t\tmodel2.set(\"cloned\", true);\n\t\tmodel2.set(\"title\", model.get(\"title\") + \" (cloned)\");\n\t\tthis.assembleAssessment(model2);\n\t},\n\n\tdeletionSuccess: function deletionSuccess(model) {\n\t\tthis.delModal.destroy();\n\t\tradio.trigger(App.Events.Commands.Toast, { content: \"Item \" + model.get(\"title\") + \" successfully deleted\", icon: \"fa-trash-alt\", iconColour: \"red\" });\n\t},\n\n\tdeletionError: function deletionError(model, xhr) {\n\t\tvar answer = App.parseResponse(xhr);\n\t\tthis.delModal.showError(\"Deletion failed: \" + (answer.detail || answer.info));\n\t\tthis.deleteError = false;\n\t},\n\n\teditItem: function editItem(model) {\n\t\tif (this.ui.multiSelect.is(\":checked\")) {\n\t\t\tmodel.trigger(\"backgrid:select\", model, !model.get(\"checked\"));\n\t\t\treturn;\n\t\t}\n\n\t\tif (!settings.resourceEditing) return;\n\n\t\tswitch (model.get(\"category\")) {\n\t\t\tcase \"assessment\":\n\t\t\t\tthis.assembleAssessment(new Assessment(model.toJSON()));\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthis.assembleResource(model);\n\t\t\t\tbreak;\n\t\t}\n\t},\n\n\tdownloadItem: function downloadItem(model) {\n\t\tvar parseResourceModelText = function parseResourceModelText(resourceModel) {\n\t\t\tvar text = \"\";\n\n\t\t\tif (resourceModel.has(\"text\")) {\n\t\t\t\ttext = model.get(\"text\").replace(/\\n/g, \"<br/>\");\n\t\t\t} else {\n\t\t\t\tvar url = \"\";\n\n\t\t\t\tif (model.get(\"category\") === \"onenote\") url = model.get(\"onenote\");else if (model.get(\"category\") === \"googledrive\") url = model.get(\"googledrive\");else url = model.get(\"url\");\n\n\t\t\t\ttext = \"<a target='_blank' href=\\\"\" + url + \"\\\">\" + url + \"</a>\";\n\t\t\t}\n\n\t\t\treturn text;\n\t\t};\n\n\t\tswitch (model.get(\"category\")) {\n\t\t\tcase \"flashcarddeck\":\n\t\t\t\t//window.open(settings.urlRoot + \"/api/1.0/resources/\" + model.id + \"/data?format=csv\");\n\t\t\t\tnew FlashcardPreview({\n\t\t\t\t\tmodel: model\n\t\t\t\t}).show();\n\t\t\t\tbreak;\n\n\t\t\tcase \"text\":\n\t\t\tcase \"onenote\":\n\t\t\tcase \"googledrive\":\n\t\t\tcase \"url\":\n\t\t\t\t{\n\t\t\t\t\tnew SmallModal({\n\t\t\t\t\t\tcustomOK: \"Close\",\n\t\t\t\t\t\thideButtons: [\"cancel\"],\n\t\t\t\t\t\tbody: parseResourceModelText(model),\n\t\t\t\t\t\ttitle: \"Viewing Resource: \" + model.get(\"title\").replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t\t\t\t})\n\t\t\t\t\t}).show();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\tcase \"image\":\n\t\t\t\tnew LightBox({ image: settings.urlRoot + \"/api/1.0/resources/\" + model.id + \"/data\" }).show();\n\t\t\t\tbreak;\n\n\t\t\t//\t\t\tcase \"video\":\n\t\t\t//\t\t\t\tnew LightBox({ video: settings.urlRoot + \"/api/1.0/resources/\" + model.id + \"/data\" }).show();\n\t\t\t//\t\t\t\tbreak;\n\n\t\t\tcase \"video\":\n\t\t\tcase \"pdf\":\n\t\t\tcase \"excel\":\n\t\t\tcase \"word\":\n\t\t\tcase \"powerpoint\":\n\t\t\t\twindow.open(settings.urlRoot + \"/api/1.0/resources/\" + model.id + \"/data\");\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"Unrecognised resource type.\");\n\t\t}\n\t},\n\n\treproduceItem: function reproduceItem(model) {\n\t\twindow.open(settings.urlRoot + \"/api/1.0/assessments/\" + model.get(\"_id\") + \"/report?memoOnly=true\");\n\t},\n\n\texportItem: function exportItem(model) {\n\t\twindow.open(settings.urlRoot + \"/api/1.0/assessments/\" + model.get(\"_id\") + \"/export\");\n\t},\n\n\tchangelog: function changelog(model) {\n\t\tvar mod = new Backbone.Model({\n\t\t\ttitle: model.get(\"name\"),\n\t\t\tidentifier: model.get(\"resource_id\"),\n\t\t\tcategory: \"resource\"\n\t\t});\n\n\t\tvar modal = new ChangelogModal({ model: mod });\n\n\t\tmodal.show();\n\t},\n\n\tonDragOver: function onDragOver(event) {\n\t\tevent.preventDefault();\n\t\tevent.originalEvent.dataTransfer.dropEffect = \"copy\";\n\t},\n\n\tonDrop: function onDrop(event) {\n\t\tvar _this6 = this;\n\n\t\tevent.preventDefault();\n\t\tif (this.cancelDrop) return;\n\n\t\tif (!this.bulkDragDropHelper) this.bulkDragDropHelper = new BulkDragDropHelper();\n\n\t\tvar files = _.filter(this.bulkDragDropHelper.extractFilesFromEvent(event), function (f) {\n\t\t\treturn f !== null;\n\t\t});\n\n\t\tthis.ui.grid.removeClass(\"dragging\");\n\n\t\tif (files.length > 0) {\n\t\t\tvar modal = new BulkResourceUploadModal({ model: new Backbone.Model({ files: files }) });\n\n\t\t\tmodal.once(\"action\", function (action) {\n\t\t\t\tif (action === \"save\" || action === \"close\") {\n\t\t\t\t\t_this6.grid.collection.queryParams.sortBy = \"lastUpdated\";\n\t\t\t\t\t_this6.grid.collection.state.order = 1;\n\t\t\t\t\t_this6.grid.collection.state.sortKey = \"sortBy\";\n\t\t\t\t\t_this6.grid.collection.fetch();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmodal.show();\n\t\t}\n\n\t\tthis.dragCount = 0;\n\t},\n\n\tonDragEnter: function onDragEnter(event) {\n\t\tevent.preventDefault();\n\t\tthis.dragCount++;\n\t\tthis.ui.grid.addClass(\"dragging\");\n\t},\n\n\tonDragLeave: function onDragLeave(event) {\n\t\tevent.preventDefault();\n\t\tthis.dragCount--;\n\t\tif (this.dragCount === 0) this.ui.grid.removeClass(\"dragging\");\n\t},\n\n\tonCancelFileDrop: function onCancelFileDrop(event) {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tthis.ui.grid.removeClass(\"dragging\");\n\t\tthis.dragCount = 0;\n\t},\n\n\tmultiSelectChange: function multiSelectChange() {\n\t\tif (this.ui.multiSelect.is(\":checked\")) {\n\t\t\tthis.ui.grid.find(\".selectable\").removeClass(\"hide\");\n\t\t\tthis.ui.multiActions.removeClass(\"hide\");\n\t\t\tthis.ui.grid.find(\"td:last-child\").addClass(\"hide\");\n\t\t\tthis.ui.grid.find(\"th:last-child\").addClass(\"hide\");\n\t\t\tthis.ui.grid.addClass(\"multi-select-mode\");\n\t\t} else {\n\t\t\tthis.ui.grid.find(\".selectable\").addClass(\"hide\");\n\t\t\tthis.ui.multiActions.addClass(\"hide\");\n\t\t\tthis.ui.grid.find(\"td:last-child\").removeClass(\"hide\");\n\t\t\tthis.ui.grid.find(\"th:last-child\").removeClass(\"hide\");\n\t\t\tthis.ui.grid.removeClass(\"multi-select-mode\");\n\t\t\tthis.grid.collection.trigger(\"backgrid:selectNone\");\n\t\t}\n\t},\n\n\tfetchEnd: function fetchEnd() {\n\t\tthis.multiSelectChange();\n\t},\n\n\tonMultiDelete: function onMultiDelete() {\n\t\tvar _this7 = this;\n\n\t\tif (this.collection.selectedModelsCollection.length) {\n\t\t\tthis.delModal = new ConfirmationModal({\n\t\t\t\tmodel: new Backbone.Model({\n\t\t\t\t\tmodels: this.collection.selectedModelsCollection.toJSON(),\n\t\t\t\t\tandAttachments: false,\n\t\t\t\t\tcollection: this.grid.collection\n\t\t\t\t})\n\t\t\t});\n\n\t\t\tthis.deleteError = false;\n\t\t\tthis.delModal.show({\n\t\t\t\tyes: function yes(result) {\n\t\t\t\t\t_.each(result.model.get(\"models\"), function (model) {\n\t\t\t\t\t\tif (model.checked) {\n\t\t\t\t\t\t\tvar resourceModel = new Resource(model);\n\t\t\t\t\t\t\tresourceModel.andAttachments = result.model.get(\"andAttachments\");\n\t\t\t\t\t\t\tresourceModel.destroy({\n\t\t\t\t\t\t\t\twait: true,\n\t\t\t\t\t\t\t\tdata: { andAttachments: result.model.get(\"andAttachments\") },\n\t\t\t\t\t\t\t\tsuccess: _this7.singleDeletionSuccess.bind(_this7),\n\t\t\t\t\t\t\t\terror: _this7.deletionError.bind(_this7)\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (resourceModel.has(\"category\") && resourceModel.get(\"category\") === \"assessment\") App.trigger(\"cache:invalidate:assessments\");\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\t_this7.onMultiCancel();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n\n\tonMultiCancel: function onMultiCancel() {\n\t\tthis.ui.multiActions.addClass(\"hide\");\n\t\tthis.ui.grid.find(\".selectable\").addClass(\"hide\");\n\t\tthis.ui.multiSelect.prop(\"checked\", false);\n\t\tthis.grid.collection.trigger(\"backgrid:selectNone\");\n\t\tthis.multiSelectChange();\n\t},\n\n\tsingleDeletionSuccess: function singleDeletionSuccess(model) {\n\t\tthis.grid.collection.trigger(\"remove\", model);\n\t\tthis.grid.collection.fetch({ reset: true });\n\n\t\tif (this.collection.selectedModelsCollection.length === 0 && !this.deleteError) this.multiDeletionSuccess();\n\t},\n\n\tmultiDeletionSuccess: function multiDeletionSuccess() {\n\t\tthis.delModal.destroy();\n\t\tradio.trigger(App.Events.Commands.Toast, { content: \"The items have been successfully deleted\", icon: \"fa-trash-alt\", iconColour: \"red\" });\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxheW91dC5qcyJdLCJuYW1lcyI6WyIkIiwicmVxdWlyZSIsIl8iLCJCYWNrYm9uZSIsIkFwcCIsInNldHRpbmdzIiwicmFkaW8iLCJSYWRpbyIsImNoYW5uZWwiLCJyZXN0ZXIiLCJBc3Nlc3NtZW50SW1wb3J0TW9kYWwiLCJBc3Nlc3NtZW50SW1wb3J0TW9kZWwiLCJCdWxrUmVzb3VyY2VVcGxvYWRNb2RhbCIsIkFzc2Vzc21lbnRNb2RhbCIsIkFzc2Vzc21lbnQiLCJDaGFuZ2Vsb2dNb2RhbCIsIkV2ZW50TW9kYWwiLCJFdmVudE1vZGVsIiwiTGlnaHRCb3giLCJSZXNvdXJjZUNvbGxlY3Rpb24iLCJSZXNvdXJjZU1vZGFsIiwiUmVzb3VyY2UiLCJTZXJ2ZXJHcmlkIiwiU2ltcGxlTWVudSIsIlNtYWxsTW9kYWwiLCJCdWxrRHJhZ0Ryb3BIZWxwZXIiLCJDb25maXJtYXRpb25Nb2RhbCIsIkZsYXNoY2FyZFByZXZpZXciLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJleHRlbmQiLCJ0YWdOYW1lIiwiY2xhc3NOYW1lIiwidGVtcGxhdGUiLCJ1aSIsImZpbHRlckJhciIsImNvdW50ZXJCYXIiLCJhZGRJY29uIiwiaW1wb3J0SWNvbiIsImRvd25sb2FkIiwicGFnaW5nIiwiZ3JpZCIsImNhbmNlbERyb3AiLCJtdWx0aVNlbGVjdCIsIm11bHRpQWN0aW9ucyIsIm11bHRpRGVsZXRlIiwibXVsdGlDYW5jZWwiLCJjb2xsZWN0aW9uRXZlbnRzIiwiZXZlbnRzIiwic2hvd0FkZCIsImV2dCIsInN0b3BQcm9wYWdhdGlvbiIsImVscyIsInRleHQiLCJpZCIsImFzc2Vzc21lbnRzIiwicHVzaCIsIk1lbnUiLCJhbmNob3IiLCJzaWRlIiwic3RydWN0dXJlIiwiY2xvc2VPbkNsaWNrIiwiZWxlbWVudHMiLCJvbiIsIm9uQWRkUmVzb3VyY2VDbGlja2VkIiwiYmluZCIsIm9uQWRkQXNzZXNzbWVudENsaWNrZWQiLCJvbkFkZEV2ZW50Q2xpY2tlZCIsIm9uTXVsdGlDYW5jZWwiLCJzaG93Iiwic2hvd0ltcG9ydCIsImV2ZW50IiwiaXRlbXMiLCJvbkltcG9ydEFzc2Vzc21lbnRDbGlja2VkIiwib25JbXBvcnRSZXNvdXJjZXNDbGlja2VkIiwiYXNzZW1ibGVSZXNvdXJjZSIsIm1vZGVsIiwibW9kYWwiLCJjcmVhdGUiLCJjb2xsZWN0aW9uIiwiZ2V0Rmlyc3RQYWdlIiwidHJpZ2dlciIsIkV2ZW50cyIsIkNvbW1hbmRzIiwiVG9hc3QiLCJjb250ZW50IiwicmVzdWx0IiwiZ2V0IiwiY3JlYXRlQW5vdGhlciIsInVwZGF0ZSIsImFzc2VtYmxlQXNzZXNzbWVudCIsImFzc2VtYmxlRXZlbnQiLCJtZXRhZGF0YSIsIkV2ZW50TWV0YWRhdGFNb2RlbCIsImNyZWF0ZUV2ZW50IiwibmV3RXZlbnQiLCJvbmNlIiwiYWN0aW9uIiwiTW9kZWwiLCJjaG9vc2VGaWxlcyIsInNob3dEb3dubG9hZHMiLCJsaXN0IiwibGlzdGVuVG8iLCJkb3dubG9hZExpc3QiLCJ3aW5kb3ciLCJvcGVuIiwidXJsUm9vdCIsImZpbHRlckNsb25lIiwiZmlsdGVyRG93bmxvYWQiLCJpbmNsdWRlcyIsImZpbHRlckRlbGV0ZSIsInVzZXIiLCJyZXF1ZXN0IiwiUmVxdWVzdHMiLCJDdXJyZW50VXNlciIsImhhc0FjY2VzcyIsInAiLCJhcGkiLCJyZXNvdXJjZXMiLCJkZWxldGUiLCJmaWx0ZXJBc3Nlc3NtZW50cyIsIm9uUmVuZGVyIiwidG9vbHRpcHMiLCJ0aXRsZSIsImljb24iLCJmaWx0ZXIiLCJyZXNvdXJjZUVkaXRpbmciLCJ1bnNoaWZ0IiwiY29sdW1ucyIsIm5hbWUiLCJsYWJlbCIsImhlYWRlckNlbGwiLCJTZWxlY3RBbGxIZWFkZXJDZWxsIiwiY2VsbCIsIkNoZWNrYm94Q2VsbCIsImVkaXRhYmxlIiwic29ydGFibGUiLCJIVE1MQ2VsbCIsInNvcnRWYWx1ZSIsInN0cmluZ1NvcnQiLCJNb21lbnRDZWxsIiwibW9kZWxJblVuaXhUaW1lc3RhbXAiLCJkaXNwbGF5Rm9ybWF0IiwiZGlzcGxheUluVVRDIiwiVG9vbGJhckNlbGwiLCJlbCIsImNsaWNrYWJsZSIsIndhaXRGb3JGaWx0ZXJzIiwiY291bnRlciIsImVsZW1lbnQiLCJiaW5kRXZlbnRzIiwiZWRpdEl0ZW0iLCJ0ZXh0RmlsdGVyIiwidHlwZSIsImRlYm91bmNlIiwic2VydmVyIiwiY3VycmVudFllYXIiLCJpbml0aWFsVmFsdWUiLCJsYW5ndWFnZUZpbHRlciIsImNhdGVnb3JpZXMiLCJsYW5ndWFnZUxpc3QiLCJzdWJqZWN0RmlsdGVyIiwia2V5IiwidmFsdWUiLCJmZXRjaCIsInBhZ2VTaXplIiwiaW5maW5pdGUiLCJncmFkZUZpbHRlciIsIm1hcCIsImdyYWRlTGlzdCIsInZhbCIsInJlZHVjZSIsInNvcnQiLCJhIiwiYiIsImxleGljYWwiLCJ0b1VwcGVyQ2FzZSIsImxvY2FsZUNvbXBhcmUiLCJzdW0iLCJudW0iLCJpbWFnZSIsIm9mZmljZUNvbnRlbnQiLCJzb3J0QnkiLCJjIiwidHlwZUZpbHRlciIsImljb25zIiwicHJlcGVuZCIsImZpbHRlckNvbnRhaW5lciIsImZpbHRlcnMiLCJkZWZhdWx0RmlsdGVycyIsInJlbmRlciIsIm9uRmlsdGVyQ2hhbmdlIiwiYWRkQ2xhc3MiLCJkcmFnQ291bnQiLCJkZWxldGVJdGVtIiwiZGVsTW9kYWwiLCJwZXJzaXN0Iiwid2FybmluZyIsInJlcGxhY2UiLCJ4IiwiY2hhckNvZGVBdCIsImJvZHkiLCJ0b0xvd2VyIiwibGVhcm5pbmdQYXRoc1BsdXJhbEN1c3RvbU5hbWUiLCJhbmRBdHRhY2htZW50cyIsInByb3AiLCJkZXN0cm95Iiwid2FpdCIsImRhdGEiLCJzdWNjZXNzIiwiZGVsZXRpb25TdWNjZXNzIiwiZXJyb3IiLCJkZWxldGlvbkVycm9yIiwiaGFzIiwiY2xvbmVJdGVtIiwibW9kZWwyIiwidG9KU09OIiwic2V0IiwiaWNvbkNvbG91ciIsInhociIsImFuc3dlciIsInBhcnNlUmVzcG9uc2UiLCJzaG93RXJyb3IiLCJkZXRhaWwiLCJpbmZvIiwiZGVsZXRlRXJyb3IiLCJpcyIsImRvd25sb2FkSXRlbSIsInBhcnNlUmVzb3VyY2VNb2RlbFRleHQiLCJyZXNvdXJjZU1vZGVsIiwidXJsIiwiY3VzdG9tT0siLCJoaWRlQnV0dG9ucyIsIkVycm9yIiwicmVwcm9kdWNlSXRlbSIsImV4cG9ydEl0ZW0iLCJjaGFuZ2Vsb2ciLCJtb2QiLCJpZGVudGlmaWVyIiwiY2F0ZWdvcnkiLCJvbkRyYWdPdmVyIiwicHJldmVudERlZmF1bHQiLCJvcmlnaW5hbEV2ZW50IiwiZGF0YVRyYW5zZmVyIiwiZHJvcEVmZmVjdCIsIm9uRHJvcCIsImJ1bGtEcmFnRHJvcEhlbHBlciIsImZpbGVzIiwiZXh0cmFjdEZpbGVzRnJvbUV2ZW50IiwiZiIsInJlbW92ZUNsYXNzIiwibGVuZ3RoIiwicXVlcnlQYXJhbXMiLCJzdGF0ZSIsIm9yZGVyIiwic29ydEtleSIsIm9uRHJhZ0VudGVyIiwib25EcmFnTGVhdmUiLCJvbkNhbmNlbEZpbGVEcm9wIiwibXVsdGlTZWxlY3RDaGFuZ2UiLCJmaW5kIiwiZmV0Y2hFbmQiLCJvbk11bHRpRGVsZXRlIiwic2VsZWN0ZWRNb2RlbHNDb2xsZWN0aW9uIiwibW9kZWxzIiwieWVzIiwiZWFjaCIsImNoZWNrZWQiLCJzaW5nbGVEZWxldGlvblN1Y2Nlc3MiLCJyZXNldCIsIm11bHRpRGVsZXRpb25TdWNjZXNzIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLElBQUlELFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUUsV0FBV0YsUUFBUSxVQUFSLENBQWpCOztBQUVBLElBQU1HLE1BQU1ILFFBQVEsZ0JBQVIsQ0FBWjtBQUNBLElBQU1JLFdBQVdKLFFBQVEsY0FBUixDQUFqQjs7QUFFQSxJQUFNSyxRQUFRSCxTQUFTSSxLQUFULENBQWVDLE9BQWYsQ0FBdUIsUUFBdkIsQ0FBZDtBQUNBLElBQU1DLFNBQVNSLFFBQVEsUUFBUixDQUFmOztBQUVBLElBQU1TLHdCQUF3QlQsUUFBUSxv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QUFPLElBQVQsRUFBM0I7O0FBRUEsTUFBSSxLQUFLOUwsVUFBTCxDQUFnQndMLHdCQUFoQixDQUF5Q1osTUFBekMsS0FBb0QsQ0FBcEQsSUFBeUQsQ0FBQyxLQUFLMUIsV0FBbkUsRUFDQyxLQUFLNkMsb0JBQUw7QUFDRCxFQWhxQitDOztBQWtxQmhEQSx1QkFBc0IsZ0NBQVc7QUFDaEMsT0FBSzNFLFFBQUwsQ0FBY1csT0FBZDtBQUNBMU0sUUFBTTZFLE9BQU4sQ0FBYy9FLElBQUlnRixNQUFKLENBQVdDLFFBQVgsQ0FBb0JDLEtBQWxDLEVBQXlDLEVBQUVDLFNBQVMsMENBQVgsRUFBdUR1QyxNQUFNLGNBQTdELEVBQTZFOEYsWUFBWSxLQUF6RixFQUF6QztBQUNBO0FBcnFCK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoibGF5b3V0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5cbmNvbnN0IEFwcCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9pbmRleFwiKTtcbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxuY29uc3QgcmFkaW8gPSBCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZ2xvYmFsXCIpO1xuY29uc3QgcmVzdGVyID0gcmVxdWlyZShcInJlc3RlclwiKTtcblxuY29uc3QgQXNzZXNzbWVudEltcG9ydE1vZGFsID0gcmVxdWlyZShcIi4uLy4uLy4uL2xpYi9hc3Nlc3NtZW50SW1wb3J0TW9kYWxcIik7XG5jb25zdCBBc3Nlc3NtZW50SW1wb3J0TW9kZWwgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL2Fzc2Vzc21lbnRJbXBvcnRNb2RlbFwiKTtcbmNvbnN0IEJ1bGtSZXNvdXJjZVVwbG9hZE1vZGFsID0gcmVxdWlyZShcIi4uLy4uLy4uL2xpYi9idWxrUmVzb3VyY2VVcGxvYWRNb2RhbFwiKTtcbmNvbnN0IEFzc2Vzc21lbnRNb2RhbCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9saWIvYXNzZXNzbWVudE1vZGFsXCIpO1xuY29uc3QgQXNzZXNzbWVudCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9saWIvYXNzZXNzbWVudE1vZGVsXCIpO1xuY29uc3QgQ2hhbmdlbG9nTW9kYWwgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL2NoYW5nZWxvZ01vZGFsXCIpO1xuY29uc3QgRXZlbnRNb2RhbCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9saWIvZXZlbnRNb2RhbFwiKTtcbmNvbnN0IEV2ZW50TW9kZWwgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL2V2ZW50TW9kZWxcIik7XG5jb25zdCBMaWdodEJveCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9saWIvbGlnaHRCb3hcIik7XG5jb25zdCBSZXNvdXJjZUNvbGxlY3Rpb24gPSByZXF1aXJlKFwiLi4vLi4vY29sbGVjdGlvbnMvbWFuYWdlci9yZXNvdXJjZUNvbGxlY3Rpb25cIik7XG5jb25zdCBSZXNvdXJjZU1vZGFsID0gcmVxdWlyZShcIi4uLy4uLy4uL2xpYi9yZXNvdXJjZU1vZGFsXCIpO1xuY29uc3QgUmVzb3VyY2UgPSByZXF1aXJlKFwiLi4vLi4vbW9kZWxzL21hbmFnZXIvcmVzb3VyY2VNb2RlbFwiKTtcbmNvbnN0IFNlcnZlckdyaWQgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL3NlcnZlckdyaWRcIik7XG5jb25zdCBTaW1wbGVNZW51ID0gcmVxdWlyZShcIi4uLy4uLy4uL2xpYi9zaW1wbGVNZW51XCIpO1xuY29uc3QgU21hbGxNb2RhbCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9saWIvc21hbGxNb2RhbFwiKTtcbmNvbnN0IEJ1bGtEcmFnRHJvcEhlbHBlciA9IHJlcXVpcmUoXCIuLi8uLi8uLi9saWIvYnVsa0RyYWdEcm9wSGVscGVyXCIpO1xuY29uc3QgQ29uZmlybWF0aW9uTW9kYWwgPSByZXF1aXJlKFwiLi9tdWx0aURlbGV0ZUNvbmZpcm1hdGlvblwiKTtcbmNvbnN0IEZsYXNoY2FyZFByZXZpZXcgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL2ZsYXNoY2FyZFByZXZpZXdcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6IFwiZGl2XCIsXG5cdGNsYXNzTmFtZTogXCJjb250ZW50IGNvbnRlbnQtbWFuYWdlclwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL21hbmFnZXIvbGF5b3V0Lm51bmpcIiksXG5cblx0dWk6IHtcblx0XHRmaWx0ZXJCYXI6IFwiLm9wcy1iYXIgLmZpbHRlcnNcIixcblx0XHRjb3VudGVyQmFyOiBcIi5vcHMtYmFyIC5jb3VudGVyXCIsXG5cdFx0YWRkSWNvbjogXCIuYWRkLWl0ZW1cIixcblx0XHRpbXBvcnRJY29uOiBcIi5pbXBvcnQtaXRlbVwiLFxuXHRcdGRvd25sb2FkOiBcImRpdi5kb3dubG9hZFwiLFxuXHRcdHBhZ2luZzogXCIucGFnaW5nXCIsXG5cdFx0Z3JpZDogXCJkaXYuZ3JpZFwiLFxuXHRcdGNhbmNlbERyb3A6IFwiLmNhbmNlbC1kcm9wXCIsXG5cblx0XHRtdWx0aVNlbGVjdDogXCIubXVsdGlzZWxlY3QtY29udGFpbmVyIGlucHV0XCIsXG5cdFx0bXVsdGlBY3Rpb25zOiBcIi5tdWx0aS1hY3Rpb25zXCIsXG5cdFx0bXVsdGlEZWxldGU6IFwiLm11bHRpLWFjdGlvbnMgLmRlbGV0ZVwiLFxuXHRcdG11bHRpQ2FuY2VsOiBcIi5tdWx0aS1hY3Rpb25zIC5jYW5jZWxcIixcblx0fSxcblxuXHRjb2xsZWN0aW9uRXZlbnRzOiB7XG5cdFx0XCJ0b29sYmFyOmNsaWNrOmNsb25lXCI6IFwiY2xvbmVJdGVtXCIsXG5cdFx0XCJ0b29sYmFyOmNsaWNrOmRlbGV0ZVwiOiBcImRlbGV0ZUl0ZW1cIixcblx0XHRcInRvb2xiYXI6Y2xpY2s6ZWRpdFwiOiBcImVkaXRJdGVtXCIsXG5cdFx0XCJ0b29sYmFyOmNsaWNrOmRvd25sb2FkXCI6IFwiZG93bmxvYWRJdGVtXCIsXG5cdFx0XCJ0b29sYmFyOmNsaWNrOnBkZlwiOiBcInJlcHJvZHVjZUl0ZW1cIixcblx0XHRcInRvb2xiYXI6Y2xpY2s6ZXhwb3J0XCI6IFwiZXhwb3J0SXRlbVwiLFxuXHRcdFwidG9vbGJhcjpjbGljazpjaGFuZ2Vsb2dcIjogXCJjaGFuZ2Vsb2dcIixcblx0XHRcInN5bmMgZXJyb3JcIjogXCJmZXRjaEVuZFwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmFkZEljb25cIjogXCJzaG93QWRkXCIsXG5cdFx0XCJjbGljayBAdWkuaW1wb3J0SWNvblwiOiBcInNob3dJbXBvcnRcIixcblx0XHRcImNsaWNrIEB1aS5kb3dubG9hZFwiOiBcInNob3dEb3dubG9hZHNcIixcblxuXHRcdFwiZHJvcCBAdWkuZ3JpZFwiOiBcIm9uRHJvcFwiLFxuXHRcdFwiZHJhZ2VudGVyIEB1aS5ncmlkXCI6IFwib25EcmFnRW50ZXJcIixcblx0XHRcImRyYWdsZWF2ZSBAdWkuZ3JpZFwiOiBcIm9uRHJhZ0xlYXZlXCIsXG5cdFx0XCJkcmFnb3ZlciBAdWkuZ3JpZFwiOiBcIm9uRHJhZ092ZXJcIixcblx0XHRcImNoYW5nZSBAdWkuZmlsZUlucHV0XCI6IFwib25GaWxlSW5wdXRDaGFuZ2VcIixcblx0XHRcImRyb3AgQHVpLmNhbmNlbERyb3BcIjogXCJvbkNhbmNlbEZpbGVEcm9wXCIsXG5cblx0XHRcImNoYW5nZSBAdWkubXVsdGlTZWxlY3RcIjogXCJtdWx0aVNlbGVjdENoYW5nZVwiLFxuXHRcdFwiY2xpY2sgQHVpLm11bHRpRGVsZXRlXCI6IFwib25NdWx0aURlbGV0ZVwiLFxuXHRcdFwiY2xpY2sgQHVpLm11bHRpQ2FuY2VsXCI6IFwib25NdWx0aUNhbmNlbFwiLFxuXHR9LFxuXG5cdHNob3dBZGQ6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGNvbnN0IGVscyA9IFt7IHRleHQ6IFwiQWRkIG5ldyByZXNvdXJjZVwiLCBpZDogXCJhZGRSZXNvdXJjZVwiIH1dO1xuXHRcdGlmIChzZXR0aW5ncy5hc3Nlc3NtZW50cylcblx0XHRcdGVscy5wdXNoKHsgdGV4dDogXCJBZGQgbmV3IGFzc2Vzc21lbnQgLyBzdXJ2ZXlcIiwgaWQ6IFwiYWRkQXNzZXNzbWVudFwiIH0pO1xuXHRcdGVscy5wdXNoKHsgdGV4dDogXCJBZGQgbmV3IGV2ZW50XCIsIGlkOiBcImFkZEV2ZW50XCIgfSk7XG5cblx0XHRjb25zdCBNZW51ID0gbmV3IFNpbXBsZU1lbnUoe1xuXHRcdFx0YW5jaG9yOiB0aGlzLnVpLmFkZEljb24sXG5cdFx0XHRzaWRlOiBcImxlZnRcIixcblx0XHRcdHN0cnVjdHVyZTogW3tcblx0XHRcdFx0Y2xvc2VPbkNsaWNrOiB0cnVlLFxuXHRcdFx0XHRlbGVtZW50czogZWxzLFxuXHRcdFx0fV0sXG5cdFx0fSk7XG5cblx0XHRNZW51Lm9uKFwiY2xpY2tlZDphZGRSZXNvdXJjZVwiLCB0aGlzLm9uQWRkUmVzb3VyY2VDbGlja2VkLmJpbmQodGhpcykpO1xuXHRcdE1lbnUub24oXCJjbGlja2VkOmFkZEFzc2Vzc21lbnRcIiwgdGhpcy5vbkFkZEFzc2Vzc21lbnRDbGlja2VkLmJpbmQodGhpcykpO1xuXHRcdE1lbnUub24oXCJjbGlja2VkOmFkZEV2ZW50XCIsIHRoaXMub25BZGRFdmVudENsaWNrZWQuYmluZCh0aGlzKSk7XG5cblx0XHR0aGlzLm9uTXVsdGlDYW5jZWwoKTtcblxuXHRcdE1lbnUuc2hvdygpO1xuXHR9LFxuXG5cdHNob3dJbXBvcnQ6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRjb25zdCBpdGVtcyA9IFt7IHRleHQ6IFwiSW1wb3J0IGZyb20gbXkgY29tcHV0ZXJcIiwgaWQ6IFwiaW1wb3J0UmVzb3VyY2VzXCIgfSwgeyB0ZXh0OiBcIkltcG9ydCBleGlzdGluZyBhc3Nlc3NtZW50XCIsIGlkOiBcImltcG9ydEFzc2Vzc21lbnRcIiB9XTtcblxuXHRcdGNvbnN0IE1lbnUgPSBuZXcgU2ltcGxlTWVudSh7XG5cdFx0XHRhbmNob3I6IHRoaXMudWkuaW1wb3J0SWNvbixcblx0XHRcdHNpZGU6IFwibGVmdFwiLFxuXHRcdFx0c3RydWN0dXJlOiBbe1xuXHRcdFx0XHRjbG9zZU9uQ2xpY2s6IHRydWUsXG5cdFx0XHRcdGVsZW1lbnRzOiBpdGVtcyxcblx0XHRcdH1dLFxuXHRcdH0pO1xuXG5cdFx0TWVudS5vbihcImNsaWNrZWQ6aW1wb3J0QXNzZXNzbWVudFwiLCB0aGlzLm9uSW1wb3J0QXNzZXNzbWVudENsaWNrZWQuYmluZCh0aGlzKSk7XG5cdFx0TWVudS5vbihcImNsaWNrZWQ6aW1wb3J0UmVzb3VyY2VzXCIsIHRoaXMub25JbXBvcnRSZXNvdXJjZXNDbGlja2VkLmJpbmQodGhpcykpO1xuXG5cdFx0dGhpcy5vbk11bHRpQ2FuY2VsKCk7XG5cblx0XHRNZW51LnNob3coKTtcblx0fSxcblxuXHRvbkFkZFJlc291cmNlQ2xpY2tlZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5hc3NlbWJsZVJlc291cmNlKCk7XG5cdH0sXG5cblx0YXNzZW1ibGVSZXNvdXJjZTogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRjb25zdCBtb2RhbCA9IG5ldyBSZXNvdXJjZU1vZGFsKHtcblx0XHRcdG1vZGVsOiBtb2RlbCB8fCBuZXcgUmVzb3VyY2UoKSxcblx0XHR9KTtcblxuXHRcdG1vZGFsLnNob3coe1xuXHRcdFx0Y3JlYXRlOiByZXN1bHQgPT4ge1xuXHRcdFx0XHR0aGlzLmdyaWQuY29sbGVjdGlvbi5nZXRGaXJzdFBhZ2UoKTtcblxuXHRcdFx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuVG9hc3QsIHtcblx0XHRcdFx0XHRjb250ZW50OiBcIk5ldyBpdGVtIFwiICsgcmVzdWx0Lm1vZGVsLmdldChcInRpdGxlXCIpICsgXCIgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWRcIixcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0Y3JlYXRlQW5vdGhlcjogKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmdyaWQuY29sbGVjdGlvbi5nZXRGaXJzdFBhZ2UoKTtcblx0XHRcdH0sXG5cdFx0XHR1cGRhdGU6IHJlc3VsdCA9PiB7XG5cdFx0XHRcdHJlc3VsdC5tb2RlbC50cmlnZ2VyKFwiZ3JpZDpyZW5kZXJcIik7XG5cblx0XHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7XG5cdFx0XHRcdFx0Y29udGVudDogXCJJdGVtIFwiICsgcmVzdWx0Lm1vZGVsLmdldChcInRpdGxlXCIpICsgXCIgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWRcIixcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9LFxuXG5cdG9uQWRkQXNzZXNzbWVudENsaWNrZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuYXNzZW1ibGVBc3Nlc3NtZW50KCk7XG5cdH0sXG5cblx0YXNzZW1ibGVBc3Nlc3NtZW50OiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdGNvbnN0IG1vZGFsID0gbmV3IEFzc2Vzc21lbnRNb2RhbCh7XG5cdFx0XHRtb2RlbDogbW9kZWwgfHwgbmV3IEFzc2Vzc21lbnQoKSxcblx0XHR9KTtcblxuXHRcdG1vZGFsLnNob3coe1xuXHRcdFx0Y3JlYXRlOiByZXN1bHQgPT4ge1xuXHRcdFx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuVG9hc3QsIHtcblx0XHRcdFx0XHRjb250ZW50OiBcIk5ldyBpdGVtIFwiICsgcmVzdWx0Lm1vZGVsLmdldChcInRpdGxlXCIpICsgXCIgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWRcIixcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0dXBkYXRlOiByZXN1bHQgPT4ge1xuXHRcdFx0XHRyZXN1bHQubW9kZWwudHJpZ2dlcihcImdyaWQ6cmVuZGVyXCIpO1xuXG5cdFx0XHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5Ub2FzdCwge1xuXHRcdFx0XHRcdGNvbnRlbnQ6IFwiSXRlbSBcIiArIHJlc3VsdC5tb2RlbC5nZXQoXCJ0aXRsZVwiKSArIFwiIHN1Y2Nlc3NmdWxseSB1cGRhdGVkXCIsXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fSxcblxuXHRvbkFkZEV2ZW50Q2xpY2tlZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5hc3NlbWJsZUV2ZW50KCk7XG5cdH0sXG5cblx0YXNzZW1ibGVFdmVudDogZnVuY3Rpb24obW9kZWwpIHtcblx0XHR0aGlzLkV2ZW50TW9kYWwgPSBuZXcgRXZlbnRNb2RhbCh7XG5cdFx0XHRtb2RlbDogbW9kZWwgPyBtb2RlbCA6IG5ldyBFdmVudE1vZGVsKCksXG5cdFx0XHRtZXRhZGF0YTogdGhpcy5FdmVudE1ldGFkYXRhTW9kZWwsXG5cdFx0fSk7XG5cblx0XHRjb25zdCBjcmVhdGVFdmVudCA9IG5ld0V2ZW50ID0+IHtcblx0XHRcdHRoaXMudHJpZ2dlcihcImV2ZW50OmNyZWF0ZWRcIiwgbmV3RXZlbnQpO1xuXHRcdH07XG5cblx0XHR0aGlzLkV2ZW50TW9kYWwuc2hvdyh7XG5cdFx0XHRjcmVhdGU6IHJlc3VsdCA9PiB7XG5cdFx0XHRcdGNyZWF0ZUV2ZW50KHJlc3VsdC5tb2RlbCk7XG5cblx0XHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7XG5cdFx0XHRcdFx0Y29udGVudDogXCJOZXcgZXZlbnQgXCIgKyByZXN1bHQubW9kZWwuZ2V0KFwidGl0bGVcIikgKyBcIiBzdWNjZXNzZnVsbHkgY3JlYXRlZFwiLFxuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRjcmVhdGVBbm90aGVyOiByZXN1bHQgPT4ge1xuXHRcdFx0XHRjcmVhdGVFdmVudChyZXN1bHQubW9kZWwpO1xuXHRcdFx0fSxcblx0XHRcdHVwZGF0ZTogcmVzdWx0ID0+IHtcblx0XHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7XG5cdFx0XHRcdFx0Y29udGVudDogXCJFdmVudCBcIiArIHJlc3VsdC5tb2RlbC5nZXQoXCJ0aXRsZVwiKSArIFwiIHN1Y2Nlc3NmdWxseSB1cGRhdGVkXCIsXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fSxcblxuXHRvbkltcG9ydEFzc2Vzc21lbnRDbGlja2VkOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBtb2RhbCA9IG5ldyBBc3Nlc3NtZW50SW1wb3J0TW9kYWwoeyBtb2RlbDogbmV3IEFzc2Vzc21lbnRJbXBvcnRNb2RlbCgpIH0pO1xuXG5cdFx0bW9kYWwub25jZShcImFjdGlvblwiLCBhY3Rpb24gPT4ge1xuXHRcdFx0aWYgKGFjdGlvbiA9PT0gXCJjbG9zZVwiKVxuXHRcdFx0XHR0aGlzLmdyaWQuY29sbGVjdGlvbi5nZXRGaXJzdFBhZ2UoKTtcblx0XHR9KTtcblxuXHRcdG1vZGFsLnNob3coKTtcblx0fSxcblxuXHRvbkltcG9ydFJlc291cmNlc0NsaWNrZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IG1vZGFsID0gbmV3IEJ1bGtSZXNvdXJjZVVwbG9hZE1vZGFsKHsgbW9kZWw6IG5ldyBCYWNrYm9uZS5Nb2RlbCh7IGNob29zZUZpbGVzOiB0cnVlIH0pIH0pO1xuXG5cdFx0bW9kYWwub25jZShcImFjdGlvblwiLCBhY3Rpb24gPT4ge1xuXHRcdFx0aWYgKGFjdGlvbiA9PT0gXCJzYXZlXCIpXG5cdFx0XHRcdHRoaXMuZ3JpZC5jb2xsZWN0aW9uLmdldEZpcnN0UGFnZSgpO1xuXHRcdH0pO1xuXG5cdFx0bW9kYWwuc2hvdygpO1xuXHR9LFxuXG5cdHNob3dEb3dubG9hZHM6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGNvbnN0IGxpc3QgPSBuZXcgU2ltcGxlTWVudSh7XG5cdFx0XHRhbmNob3I6IHRoaXMudWkuZG93bmxvYWQsXG5cdFx0XHRzaWRlOiBcImxlZnRcIixcblx0XHRcdHN0cnVjdHVyZTogW1xuXHRcdFx0XHR7IGNsb3NlT25DbGljazogdHJ1ZSwgZWxlbWVudHM6IFtcblx0XHRcdFx0XHR7IHRleHQ6IFwiRXhwb3J0IGxpc3Qgb2YgdXNlcnNcIiwgaWQ6IFwidXNlcnNcIiB9LFxuXHRcdFx0XHRdIH0sXG5cdFx0XHRdLFxuXHRcdH0pO1xuXHRcdGxpc3Quc2hvdygpO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhsaXN0LCBcImNsaWNrZWQ6dXNlcnNcIiwgdGhpcy5kb3dubG9hZExpc3QuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0ZG93bmxvYWRMaXN0OiBmdW5jdGlvbigpIHtcblx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9yZXNvdXJjZXMvbGlzdHMvY29udGVudFwiKTtcblx0fSxcblxuXHRmaWx0ZXJDbG9uZTogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRyZXR1cm4gbW9kZWwuZ2V0KFwiY2F0ZWdvcnlcIikgPT09IFwiYXNzZXNzbWVudFwiO1xuXHR9LFxuXG5cdGZpbHRlckRvd25sb2FkOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdHJldHVybiAhXy5pbmNsdWRlcyhbXCJhc3Nlc3NtZW50XCIsIFwidmlkaW11c1wiLCBcImV2ZW50XCJdLCBtb2RlbC5nZXQoXCJjYXRlZ29yeVwiKSk7XG5cdH0sXG5cblx0ZmlsdGVyRGVsZXRlOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCB1c2VyID0gcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblx0XHRyZXR1cm4gcmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5hcGkucmVzb3VyY2VzLmRlbGV0ZSwgdXNlcik7XG5cdH0sXG5cblx0ZmlsdGVyQXNzZXNzbWVudHM6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0cmV0dXJuIF8uaW5jbHVkZXMoW1wiYXNzZXNzbWVudFwiXSwgbW9kZWwuZ2V0KFwiY2F0ZWdvcnlcIikpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCB0b29sdGlwcyA9IFtcblx0XHRcdHsgdGl0bGU6IFwiQ2xvbmVcIiwgaWNvbjogXCJmYS1jbG9uZVwiLCBmaWx0ZXI6IHRoaXMuZmlsdGVyQ2xvbmUuYmluZCh0aGlzKSB9LFxuXHRcdFx0eyB0aXRsZTogXCJEb3dubG9hZFwiLCBpY29uOiBcImZhLWRvd25sb2FkXCIsIGZpbHRlcjogdGhpcy5maWx0ZXJEb3dubG9hZC5iaW5kKHRoaXMpIH0sXG5cdFx0XHR7IHRpdGxlOiBcIlBERlwiLCBpY29uOiBcImZhLWZpbGUtcGRmXCIsIGZpbHRlcjogdGhpcy5maWx0ZXJBc3Nlc3NtZW50cy5iaW5kKHRoaXMpIH0sXG5cdFx0XHR7IHRpdGxlOiBcIkV4cG9ydFwiLCBpY29uOiBcImZhLWNsb3VkLWRvd25sb2FkXCIsIGZpbHRlcjogdGhpcy5maWx0ZXJBc3Nlc3NtZW50cy5iaW5kKHRoaXMpIH0sXG5cdFx0XHR7IHRpdGxlOiBcIkRlbGV0ZVwiLCBpY29uOiBcImZhLXRyYXNoLWFsdFwiLCBmaWx0ZXI6IHRoaXMuZmlsdGVyRGVsZXRlLmJpbmQodGhpcykgfSxcblx0XHRdO1xuXG5cdFx0aWYgKHNldHRpbmdzLnJlc291cmNlRWRpdGluZylcblx0XHRcdHRvb2x0aXBzLnVuc2hpZnQoeyB0aXRsZTogXCJFZGl0XCIsIGljb246IFwiZmEtZWRpdFwiIH0pO1xuXG5cdFx0dG9vbHRpcHMudW5zaGlmdCh7IHRpdGxlOiBcIkNoYW5nZWxvZ1wiLCBpY29uOiBcImZhLWxpc3QtdWxcIiB9KTtcblxuXHRcdGNvbnN0IGNvbHVtbnMgPSBbXG5cdFx0XHR7IG5hbWU6IFwic2VsZWN0ZWRcIiwgbGFiZWw6IFwiXCIsIGhlYWRlckNlbGw6IFNlcnZlckdyaWQuU2VsZWN0QWxsSGVhZGVyQ2VsbC5leHRlbmQoe30pLCBjZWxsOiBTZXJ2ZXJHcmlkLkNoZWNrYm94Q2VsbC5leHRlbmQoe30pLCBlZGl0YWJsZTogZmFsc2UsIHNvcnRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImNvbnRlbnRUeXBlXCIsIGxhYmVsOiBcIlR5cGVcIiwgY2VsbDogU2VydmVyR3JpZC5IVE1MQ2VsbC5leHRlbmQoe30pLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJ0aXRsZVwiLCBsYWJlbDogXCJUaXRsZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UsIHNvcnRWYWx1ZTogU2VydmVyR3JpZC5zdHJpbmdTb3J0IH0sXG5cdFx0XHR7IG5hbWU6IFwic3ViamVjdF9uYW1lXCIsIGxhYmVsOiBcIlN1YmplY3RcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiY29udGVudEdyYWRlXCIsIGxhYmVsOiBcIkdyYWRlXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImxhbmd1YWdlXCIsIGxhYmVsOiBcIkxhbmd1YWdlXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcInJlYWRhYmxlU2l6ZVwiLCBsYWJlbDogXCJTaXplXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImxhc3RVcGRhdGVkXCIsIGxhYmVsOiBcIkxhc3QgQ2hhbmdlZFwiLCBlZGl0YWJsZTogZmFsc2UsIGNlbGw6IFNlcnZlckdyaWQuTW9tZW50Q2VsbC5leHRlbmQoe1xuXHRcdFx0XHRtb2RlbEluVW5peFRpbWVzdGFtcDogdHJ1ZSxcblx0XHRcdFx0ZGlzcGxheUZvcm1hdDogXCJERCBNTU0gWVlZWSwgSEg6bW0gYVwiLFxuXHRcdFx0XHRkaXNwbGF5SW5VVEM6IGZhbHNlLFxuXHRcdFx0fSkgfSxcblx0XHRcdHsgbGFiZWw6IFwiQWN0aW9uc1wiLCBjZWxsOiBuZXcgU2VydmVyR3JpZC5Ub29sYmFyQ2VsbCh7IHRvb2x0aXBzOiB0b29sdGlwcyB9KSwgZWRpdGFibGU6IGZhbHNlLCBzb3J0YWJsZTogZmFsc2UgfSxcblx0XHRdO1xuXG5cdFx0dGhpcy5ncmlkID0gbmV3IFNlcnZlckdyaWQoe1xuXHRcdFx0ZWw6IHRoaXMudWkuZ3JpZCxcblx0XHRcdGNvbHVtbnM6IGNvbHVtbnMsXG5cdFx0XHRjb2xsZWN0aW9uOiBuZXcgUmVzb3VyY2VDb2xsZWN0aW9uKCksXG5cdFx0XHRjbGlja2FibGU6IHRydWUsXG5cdFx0XHR3YWl0Rm9yRmlsdGVyczogdHJ1ZSxcblx0XHRcdGNvdW50ZXI6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5jb3VudGVyQmFyLFxuXHRcdFx0XHR0ZW1wbGF0ZTogXCJDb250ZW50ICRzdGFydCAtICRlbmQgb2YgJHRvdGFsXCIsXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdGVsZW1lbnQ6IHRoaXMudWkucGFnaW5nLFxuXHRcdFx0fSxcblx0XHR9KTtcblxuXHRcdHRoaXMuY29sbGVjdGlvbiA9IHRoaXMuZ3JpZC5jb2xsZWN0aW9uO1xuXG5cdFx0dGhpcy5iaW5kRXZlbnRzKHRoaXMuY29sbGVjdGlvbiwgdGhpcy5jb2xsZWN0aW9uRXZlbnRzKTtcblxuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ncmlkLCBcInJvdzpjbGlja2VkXCIsIHRoaXMuZWRpdEl0ZW0uYmluZCh0aGlzKSk7XG5cblx0XHRjb25zdCB0ZXh0RmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJ0ZXh0XCIsXG5cdFx0XHRuYW1lOiBcInRleHRGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlRleHQgU2VhcmNoXCIsXG5cdFx0XHRkZWJvdW5jZTogMjAwLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdH07XG5cblx0XHRjb25zdCBjdXJyZW50WWVhciA9IHtcblx0XHRcdHR5cGU6IFwidG9nZ2xlXCIsXG5cdFx0XHRuYW1lOiBcImN1cnJlbnRZZWFyXCIsXG5cdFx0XHRsYWJlbDogXCJDdXJyZW50IHllYXIncyBjb250ZW50XCIsXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0XHRpbml0aWFsVmFsdWU6ICgpID0+IFt0cnVlXSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgbGFuZ3VhZ2VGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcImxhbmd1YWdlRmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJMYW5ndWFnZVwiLFxuXHRcdFx0Y2F0ZWdvcmllczogW1xuXHRcdFx0XHR7IGl0ZW1zOiBzZXR0aW5ncy5sYW5ndWFnZUxpc3QgfSxcblx0XHRcdF0sXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdGNvbnN0IHN1YmplY3RGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcInN1YmplY3RGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlN1YmplY3RcIixcblx0XHRcdHNlcnZlcjoge1xuXHRcdFx0XHRrZXk6IFwic3ViamVjdF9pZFwiLFxuXHRcdFx0XHR2YWx1ZTogXCJzdWJqZWN0XCIsXG5cdFx0XHRcdGZldGNoOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9kYXRhL3N1YmplY3RzXCIsXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdHBhZ2VTaXplOiAzMCxcblx0XHRcdFx0aW5maW5pdGU6IHRydWUsXG5cdFx0XHR9LFxuXHRcdH07XG5cblx0XHRjb25zdCBncmFkZUZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiaXRlbWl6ZWRcIixcblx0XHRcdG5hbWU6IFwiZ3JhZGVGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlllYXIgb2YgU3R1ZHlcIixcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHRcdGNhdGVnb3JpZXM6IF8ubWFwKHNldHRpbmdzLmdyYWRlTGlzdCwgKHZhbCwga2V5KSA9PiAoe1xuXHRcdFx0XHRsYWJlbDoga2V5LFxuXHRcdFx0XHRpdGVtczogXy5yZWR1Y2UodmFsLnNvcnQoKGEsIGIpID0+XG5cdFx0XHRcdFx0KFwibGV4aWNhbFwiIGluIGEgPyBhLmxleGljYWwgOiBhLm5hbWUpLnRvVXBwZXJDYXNlKCkubG9jYWxlQ29tcGFyZSgoXCJsZXhpY2FsXCIgaW4gYiA/IGIubGV4aWNhbCA6IGIubmFtZSkudG9VcHBlckNhc2UoKSlcblx0XHRcdFx0KSwgKHN1bSwgbnVtKSA9PiB7XG5cdFx0XHRcdFx0c3VtLnB1c2goeyBuYW1lOiBudW0udmFsdWUsIGxhYmVsOiBudW0ubmFtZSB9KTtcblx0XHRcdFx0XHRyZXR1cm4gc3VtO1xuXHRcdFx0XHR9LCBbXSksXG5cdFx0XHR9KSksXG5cdFx0fTtcblxuXHRcdGxldCBjYXRlZ29yaWVzID0gW1xuXHRcdFx0eyBuYW1lOiBcImFzc2Vzc21lbnRcIiwgbGFiZWw6IFwiQXNzZXNzbWVudFwiLCBpbWFnZTogc2V0dGluZ3MudXJsUm9vdCArIFwiL2ltYWdlcy9jb250ZW50L2Fubm90YXRpb25faW50ZXJhY3RpdmUucG5nXCIgfSxcblx0XHRcdHsgbmFtZTogXCJhdWRpb1wiLCBsYWJlbDogXCJBdWRpb1wiLCBpbWFnZTogc2V0dGluZ3MudXJsUm9vdCArIFwiL2ltYWdlcy9jb250ZW50L2Fubm90YXRpb25fbXAzLnBuZ1wiIH0sXG5cdFx0XHR7IG5hbWU6IFwiZmxhc2hjYXJkZGVja1wiLCBsYWJlbDogXCJGbGFzaGNhcmQgRGVja1wiLCBpbWFnZTogc2V0dGluZ3MudXJsUm9vdCArIFwiL2ltYWdlcy9jb250ZW50L2Fubm90YXRpb25fZmxhc2hjYXJkcy5wbmdcIiB9LFxuXHRcdFx0eyBuYW1lOiBcImltYWdlXCIsIGxhYmVsOiBcIkltYWdlXCIsIGltYWdlOiBzZXR0aW5ncy51cmxSb290ICsgXCIvaW1hZ2VzL2NvbnRlbnQvYW5ub3RhdGlvbl9ncmFwaGljLnBuZ1wiIH0sXG5cdFx0XHR7IG5hbWU6IFwicGRmXCIsIGxhYmVsOiBcIlBERlwiLCBpbWFnZTogc2V0dGluZ3MudXJsUm9vdCArIFwiL2ltYWdlcy9jb250ZW50L2Fubm90YXRpb25fcGRmLnBuZ1wiIH0sXG5cdFx0XHR7IG5hbWU6IFwidGV4dFwiLCBsYWJlbDogXCJUZXh0XCIsIGltYWdlOiBzZXR0aW5ncy51cmxSb290ICsgXCIvaW1hZ2VzL2NvbnRlbnQvYW5ub3RhdGlvbl90ZXh0LnBuZ1wiIH0sXG5cdFx0XHR7IG5hbWU6IFwidXJsXCIsIGxhYmVsOiBcIlVSTFwiLCBpbWFnZTogc2V0dGluZ3MudXJsUm9vdCArIFwiL2ltYWdlcy9jb250ZW50L2Fubm90YXRpb25fdXJsLnBuZ1wiIH0sXG5cdFx0XHR7IG5hbWU6IFwidmlkZW9cIiwgbGFiZWw6IFwiVmlkZW9cIiwgaW1hZ2U6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9pbWFnZXMvY29udGVudC9hbm5vdGF0aW9uX3ZpZGVvLnBuZ1wiIH0sXG5cdFx0XTtcblxuXHRcdGlmIChzZXR0aW5ncy5vZmZpY2VDb250ZW50KSB7XG5cdFx0XHRjYXRlZ29yaWVzLnB1c2goeyBuYW1lOiBcImV4Y2VsXCIsIGxhYmVsOiBcIk1TIEV4Y2VsXCIsIGltYWdlOiBzZXR0aW5ncy51cmxSb290ICsgXCIvaW1hZ2VzL2NvbnRlbnQvYW5ub3RhdGlvbl9leGNlbC5wbmdcIiB9LFxuXHRcdFx0XHR7IG5hbWU6IFwicG93ZXJwb2ludFwiLCBsYWJlbDogXCJNUyBQb3dlclBvaW50XCIsIGltYWdlOiBzZXR0aW5ncy51cmxSb290ICsgXCIvaW1hZ2VzL2NvbnRlbnQvYW5ub3RhdGlvbl9wb3dlcnBvaW50LnBuZ1wiIH0sXG5cdFx0XHRcdHsgbmFtZTogXCJ3b3JkXCIsIGxhYmVsOiBcIk1TIFdvcmRcIiwgaW1hZ2U6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9pbWFnZXMvY29udGVudC9hbm5vdGF0aW9uX3dvcmQucG5nXCIgfSk7XG5cdFx0fVxuXG5cdFx0Y2F0ZWdvcmllcyA9IF8uc29ydEJ5KGNhdGVnb3JpZXMsIGMgPT4gYy5sYWJlbCk7XG5cblx0XHRjb25zdCB0eXBlRmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJ0eXBlRmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJUeXBlXCIsXG5cdFx0XHRjYXRlZ29yaWVzOiBbXG5cdFx0XHRcdHsgaXRlbXM6IGNhdGVnb3JpZXMgfSxcblx0XHRcdF0sXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0XHRpY29uczogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0dGhpcy51aS5maWx0ZXJCYXIucHJlcGVuZCh0aGlzLmdyaWQuZmlsdGVyKHtcblx0XHRcdGZpbHRlckNvbnRhaW5lcjogdGhpcy51aS5maWx0ZXJCYXIsXG5cdFx0XHRmaWx0ZXJzOiBbdGV4dEZpbHRlciwgY3VycmVudFllYXIsIGxhbmd1YWdlRmlsdGVyLCBzdWJqZWN0RmlsdGVyLCBncmFkZUZpbHRlciwgdHlwZUZpbHRlcl0sXG5cdFx0XHRkZWZhdWx0RmlsdGVyczogW1widGV4dEZpbHRlclwiLCBcImN1cnJlbnRZZWFyXCIsIFwidHlwZUZpbHRlclwiXSxcblx0XHR9KS5yZW5kZXIoKS5lbCk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZ3JpZC5maWx0ZXIsIFwiY2hhbmdlIGNoYW5nZWRcIiwgdGhpcy5vbkZpbHRlckNoYW5nZS5iaW5kKHRoaXMpKTtcblxuXHRcdGlmICghc2V0dGluZ3MuYXNzZXNzbWVudHMpXG5cdFx0XHR0aGlzLnVpLmltcG9ydEljb24uYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0dGhpcy5kcmFnQ291bnQgPSAwO1xuXHR9LFxuXG5cdG9uRmlsdGVyQ2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmdyaWQuY29sbGVjdGlvbi50cmlnZ2VyKFwiZmlsdGVyOmNoYW5nZVwiKTtcblx0fSxcblxuXHRkZWxldGVJdGVtOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdHRoaXMuZGVsTW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHRwZXJzaXN0OiB0cnVlLFxuXHRcdFx0d2FybmluZzogdHJ1ZSxcblx0XHRcdHRpdGxlOiBcIjxzcGFuIGNsYXNzPSdmYWwgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUnLz4gRGVsZXRlIEl0ZW06IFwiICsgbW9kZWwuZ2V0KFwidGl0bGVcIikucmVwbGFjZSgvW1xcJlxcPFxcPlxcJ1xcXCJdL2csIHggPT4gXCImI1wiICsgeC5jaGFyQ29kZUF0KDApICsgXCI7XCIpLFxuXHRcdFx0Ym9keTogYDxwPkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBpdGVtPzwvcD5cblx0XHRcdFx0PHA+SXQgd2lsbCBub3QgYmUgcmVtb3ZlZCBmcm9tIGJvb2tzIGFuZCBgICsgXy50b0xvd2VyKHNldHRpbmdzLmxlYXJuaW5nUGF0aHNQbHVyYWxDdXN0b21OYW1lKSArIGA7IGl0IHdpbGwganVzdCBiZWNvbWUgdW51c2FibGUgZ29pbmcgZm9yd2FyZC48L3A+XG5cdFx0XHRcdDxwPllvdSBjYW4gY2hvb3NlIHRvIHJlbW92ZSBpdCBmcm9tIHlvdXIgYm9va3MgYW5kIGAgKyBfLnRvTG93ZXIoc2V0dGluZ3MubGVhcm5pbmdQYXRoc1BsdXJhbEN1c3RvbU5hbWUpICsgYCBieSBjbGlja2luZyB0aGUgb3B0aW9uIGJlbG93LjxwPlxuXHRcdFx0XHQ8cD48bGFiZWw+PGlucHV0IHR5cGU9J2NoZWNrYm94JyB2YWx1ZT0nMSc+IFllcywgYWxzbyByZW1vdmUgYWxsIGluc3RhbmNlcyBvZiB0aGlzIGl0ZW0gZnJvbSBteSBib29rcyBhbmQgYCArIF8udG9Mb3dlcihzZXR0aW5ncy5sZWFybmluZ1BhdGhzUGx1cmFsQ3VzdG9tTmFtZSkgKyBcIjwvbGFiZWw+PC9wPlwiLFxuXHRcdH0pO1xuXHRcdHRoaXMuZGVsTW9kYWwub24oXCJidXR0b246b2tcIiwgKCkgPT4ge1xuXHRcdFx0bW9kZWwuYW5kQXR0YWNobWVudHMgPSAkKFwiaW5wdXRcIiwgdGhpcy5kZWxNb2RhbC5lbCkucHJvcChcImNoZWNrZWRcIik7XG5cdFx0XHRtb2RlbC5kZXN0cm95KHsgd2FpdDogdHJ1ZSwgZGF0YTogeyBhbmRBdHRhY2htZW50czogJChcImlucHV0XCIsIHRoaXMuZGVsTW9kYWwuZWwpLnByb3AoXCJjaGVja2VkXCIpIH0sIHN1Y2Nlc3M6IHRoaXMuZGVsZXRpb25TdWNjZXNzLmJpbmQodGhpcyksIGVycm9yOiB0aGlzLmRlbGV0aW9uRXJyb3IuYmluZCh0aGlzKSB9KTtcblxuXHRcdFx0aWYgKG1vZGVsLmhhcyhcImNhdGVnb3J5XCIpICYmIG1vZGVsLmdldChcImNhdGVnb3J5XCIpID09PSBcImFzc2Vzc21lbnRcIilcblx0XHRcdFx0QXBwLnRyaWdnZXIoXCJjYWNoZTppbnZhbGlkYXRlOmFzc2Vzc21lbnRzXCIpO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5kZWxNb2RhbC5zaG93KCk7XG5cdH0sXG5cblx0Y2xvbmVJdGVtOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdGNvbnN0IG1vZGVsMiA9IG5ldyBBc3Nlc3NtZW50KG1vZGVsLnRvSlNPTigpKTtcblx0XHRtb2RlbDIuc2V0KFwiY2xvbmVkXCIsIHRydWUpO1xuXHRcdG1vZGVsMi5zZXQoXCJ0aXRsZVwiLCBtb2RlbC5nZXQoXCJ0aXRsZVwiKSArIFwiIChjbG9uZWQpXCIpO1xuXHRcdHRoaXMuYXNzZW1ibGVBc3Nlc3NtZW50KG1vZGVsMik7XG5cdH0sXG5cblx0ZGVsZXRpb25TdWNjZXNzOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdHRoaXMuZGVsTW9kYWwuZGVzdHJveSgpO1xuXHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5Ub2FzdCwgeyBjb250ZW50OiBcIkl0ZW0gXCIgKyBtb2RlbC5nZXQoXCJ0aXRsZVwiKSArIFwiIHN1Y2Nlc3NmdWxseSBkZWxldGVkXCIsIGljb246IFwiZmEtdHJhc2gtYWx0XCIsIGljb25Db2xvdXI6IFwicmVkXCIgfSk7XG5cdH0sXG5cblx0ZGVsZXRpb25FcnJvcjogZnVuY3Rpb24obW9kZWwsIHhocikge1xuXHRcdGNvbnN0IGFuc3dlciA9IEFwcC5wYXJzZVJlc3BvbnNlKHhocik7XG5cdFx0dGhpcy5kZWxNb2RhbC5zaG93RXJyb3IoXCJEZWxldGlvbiBmYWlsZWQ6IFwiICsgKGFuc3dlci5kZXRhaWwgfHwgYW5zd2VyLmluZm8pKTtcblx0XHR0aGlzLmRlbGV0ZUVycm9yID0gZmFsc2U7XG5cdH0sXG5cblx0ZWRpdEl0ZW06IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0aWYgKHRoaXMudWkubXVsdGlTZWxlY3QuaXMoXCI6Y2hlY2tlZFwiKSkge1xuXHRcdFx0bW9kZWwudHJpZ2dlcihcImJhY2tncmlkOnNlbGVjdFwiLCBtb2RlbCwgIW1vZGVsLmdldChcImNoZWNrZWRcIikpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICghc2V0dGluZ3MucmVzb3VyY2VFZGl0aW5nKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0c3dpdGNoIChtb2RlbC5nZXQoXCJjYXRlZ29yeVwiKSkge1xuXHRcdFx0Y2FzZSBcImFzc2Vzc21lbnRcIjpcblx0XHRcdFx0dGhpcy5hc3NlbWJsZUFzc2Vzc21lbnQobmV3IEFzc2Vzc21lbnQobW9kZWwudG9KU09OKCkpKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRoaXMuYXNzZW1ibGVSZXNvdXJjZShtb2RlbCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fSxcblxuXHRkb3dubG9hZEl0ZW06IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0Y29uc3QgcGFyc2VSZXNvdXJjZU1vZGVsVGV4dCA9IHJlc291cmNlTW9kZWwgPT4ge1xuXHRcdFx0bGV0IHRleHQgPSBcIlwiO1xuXG5cdFx0XHRpZiAocmVzb3VyY2VNb2RlbC5oYXMoXCJ0ZXh0XCIpKSB7XG5cdFx0XHRcdHRleHQgPSBtb2RlbC5nZXQoXCJ0ZXh0XCIpLnJlcGxhY2UoL1xcbi9nLCBcIjxici8+XCIpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdGxldCB1cmwgPSBcIlwiO1xuXG5cdFx0XHRcdGlmIChtb2RlbC5nZXQoXCJjYXRlZ29yeVwiKSA9PT0gXCJvbmVub3RlXCIpXG5cdFx0XHRcdFx0dXJsID0gbW9kZWwuZ2V0KFwib25lbm90ZVwiKTtcblx0XHRcdFx0ZWxzZSBpZiAobW9kZWwuZ2V0KFwiY2F0ZWdvcnlcIikgPT09IFwiZ29vZ2xlZHJpdmVcIilcblx0XHRcdFx0XHR1cmwgPSBtb2RlbC5nZXQoXCJnb29nbGVkcml2ZVwiKTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHVybCA9IG1vZGVsLmdldChcInVybFwiKTtcblxuXHRcdFx0XHR0ZXh0ID0gXCI8YSB0YXJnZXQ9J19ibGFuaycgaHJlZj1cXFwiXCIgKyB1cmwgKyBcIlxcXCI+XCIgKyB1cmwgKyBcIjwvYT5cIjtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRleHQ7XG5cdFx0fTtcblxuXHRcdHN3aXRjaCAobW9kZWwuZ2V0KFwiY2F0ZWdvcnlcIikpIHtcblx0XHRcdGNhc2UgXCJmbGFzaGNhcmRkZWNrXCI6XG5cdFx0XHRcdC8vd2luZG93Lm9wZW4oc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvcmVzb3VyY2VzL1wiICsgbW9kZWwuaWQgKyBcIi9kYXRhP2Zvcm1hdD1jc3ZcIik7XG5cdFx0XHRcdG5ldyBGbGFzaGNhcmRQcmV2aWV3KHtcblx0XHRcdFx0XHRtb2RlbCxcblx0XHRcdFx0fSkuc2hvdygpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcInRleHRcIjpcblx0XHRcdGNhc2UgXCJvbmVub3RlXCI6XG5cdFx0XHRjYXNlIFwiZ29vZ2xlZHJpdmVcIjpcblx0XHRcdGNhc2UgXCJ1cmxcIjoge1xuXHRcdFx0XHRuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHRcdFx0Y3VzdG9tT0s6IFwiQ2xvc2VcIixcblx0XHRcdFx0XHRoaWRlQnV0dG9uczogW1wiY2FuY2VsXCJdLFxuXHRcdFx0XHRcdGJvZHk6IHBhcnNlUmVzb3VyY2VNb2RlbFRleHQobW9kZWwpLFxuXHRcdFx0XHRcdHRpdGxlOiBcIlZpZXdpbmcgUmVzb3VyY2U6IFwiICsgbW9kZWwuZ2V0KFwidGl0bGVcIikucmVwbGFjZSgvW1xcJlxcPFxcPlxcJ1xcXCJdL2csIHggPT4gXCImI1wiICsgeC5jaGFyQ29kZUF0KDApICsgXCI7XCIpLFxuXHRcdFx0XHR9KS5zaG93KCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHRjYXNlIFwiaW1hZ2VcIjpcblx0XHRcdFx0bmV3IExpZ2h0Qm94KHsgaW1hZ2U6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3Jlc291cmNlcy9cIiArIG1vZGVsLmlkICsgXCIvZGF0YVwiIH0pLnNob3coKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Ly9cdFx0XHRjYXNlIFwidmlkZW9cIjpcblx0XHRcdFx0Ly9cdFx0XHRcdG5ldyBMaWdodEJveCh7IHZpZGVvOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9yZXNvdXJjZXMvXCIgKyBtb2RlbC5pZCArIFwiL2RhdGFcIiB9KS5zaG93KCk7XG5cdFx0XHRcdC8vXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcInZpZGVvXCI6XG5cdFx0XHRjYXNlIFwicGRmXCI6XG5cdFx0XHRjYXNlIFwiZXhjZWxcIjpcblx0XHRcdGNhc2UgXCJ3b3JkXCI6XG5cdFx0XHRjYXNlIFwicG93ZXJwb2ludFwiOlxuXHRcdFx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9yZXNvdXJjZXMvXCIgKyBtb2RlbC5pZCArIFwiL2RhdGFcIik7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJVbnJlY29nbmlzZWQgcmVzb3VyY2UgdHlwZS5cIik7XG5cdFx0fVxuXHR9LFxuXG5cdHJlcHJvZHVjZUl0ZW06IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0d2luZG93Lm9wZW4oc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvYXNzZXNzbWVudHMvXCIgKyBtb2RlbC5nZXQoXCJfaWRcIikgKyBcIi9yZXBvcnQ/bWVtb09ubHk9dHJ1ZVwiKTtcblx0fSxcblxuXHRleHBvcnRJdGVtOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdHdpbmRvdy5vcGVuKHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2Fzc2Vzc21lbnRzL1wiICsgbW9kZWwuZ2V0KFwiX2lkXCIpICsgXCIvZXhwb3J0XCIpO1xuXHR9LFxuXG5cdGNoYW5nZWxvZzogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRjb25zdCBtb2QgPSBuZXcgQmFja2JvbmUuTW9kZWwoe1xuXHRcdFx0dGl0bGU6IG1vZGVsLmdldChcIm5hbWVcIiksXG5cdFx0XHRpZGVudGlmaWVyOiBtb2RlbC5nZXQoXCJyZXNvdXJjZV9pZFwiKSxcblx0XHRcdGNhdGVnb3J5OiBcInJlc291cmNlXCIsXG5cdFx0fSk7XG5cblx0XHRjb25zdCBtb2RhbCA9IG5ldyBDaGFuZ2Vsb2dNb2RhbCh7IG1vZGVsOiBtb2QgfSk7XG5cblx0XHRtb2RhbC5zaG93KCk7XG5cdH0sXG5cblx0b25EcmFnT3ZlcjogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdGV2ZW50Lm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSBcImNvcHlcIjtcblx0fSxcblxuXHRvbkRyb3A6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRpZiAodGhpcy5jYW5jZWxEcm9wKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0aWYgKCF0aGlzLmJ1bGtEcmFnRHJvcEhlbHBlcilcblx0XHRcdHRoaXMuYnVsa0RyYWdEcm9wSGVscGVyID0gbmV3IEJ1bGtEcmFnRHJvcEhlbHBlcigpO1xuXG5cdFx0Y29uc3QgZmlsZXMgPSBfLmZpbHRlcih0aGlzLmJ1bGtEcmFnRHJvcEhlbHBlci5leHRyYWN0RmlsZXNGcm9tRXZlbnQoZXZlbnQpLCBmID0+IGYgIT09IG51bGwpO1xuXG5cdFx0dGhpcy51aS5ncmlkLnJlbW92ZUNsYXNzKFwiZHJhZ2dpbmdcIik7XG5cblx0XHRpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3QgbW9kYWwgPSBuZXcgQnVsa1Jlc291cmNlVXBsb2FkTW9kYWwoeyBtb2RlbDogbmV3IEJhY2tib25lLk1vZGVsKHsgZmlsZXMgfSkgfSk7XG5cblx0XHRcdG1vZGFsLm9uY2UoXCJhY3Rpb25cIiwgYWN0aW9uID0+IHtcblx0XHRcdFx0aWYgKGFjdGlvbiA9PT0gXCJzYXZlXCIgfHwgYWN0aW9uID09PSBcImNsb3NlXCIpIHtcblx0XHRcdFx0XHR0aGlzLmdyaWQuY29sbGVjdGlvbi5xdWVyeVBhcmFtcy5zb3J0QnkgPSBcImxhc3RVcGRhdGVkXCI7XG5cdFx0XHRcdFx0dGhpcy5ncmlkLmNvbGxlY3Rpb24uc3RhdGUub3JkZXIgPSAxO1xuXHRcdFx0XHRcdHRoaXMuZ3JpZC5jb2xsZWN0aW9uLnN0YXRlLnNvcnRLZXkgPSBcInNvcnRCeVwiO1xuXHRcdFx0XHRcdHRoaXMuZ3JpZC5jb2xsZWN0aW9uLmZldGNoKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRtb2RhbC5zaG93KCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5kcmFnQ291bnQgPSAwO1xuXHR9LFxuXG5cdG9uRHJhZ0VudGVyOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0dGhpcy5kcmFnQ291bnQrKztcblx0XHR0aGlzLnVpLmdyaWQuYWRkQ2xhc3MoXCJkcmFnZ2luZ1wiKTtcblx0fSxcblxuXHRvbkRyYWdMZWF2ZTogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdHRoaXMuZHJhZ0NvdW50LS07XG5cdFx0aWYgKHRoaXMuZHJhZ0NvdW50ID09PSAwKVxuXHRcdFx0dGhpcy51aS5ncmlkLnJlbW92ZUNsYXNzKFwiZHJhZ2dpbmdcIik7XG5cdH0sXG5cblx0b25DYW5jZWxGaWxlRHJvcDogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdHRoaXMudWkuZ3JpZC5yZW1vdmVDbGFzcyhcImRyYWdnaW5nXCIpO1xuXHRcdHRoaXMuZHJhZ0NvdW50ID0gMDtcblx0fSxcblxuXHRtdWx0aVNlbGVjdENoYW5nZTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMudWkubXVsdGlTZWxlY3QuaXMoXCI6Y2hlY2tlZFwiKSkge1xuXHRcdFx0dGhpcy51aS5ncmlkLmZpbmQoXCIuc2VsZWN0YWJsZVwiKS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLnVpLm11bHRpQWN0aW9ucy5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLnVpLmdyaWQuZmluZChcInRkOmxhc3QtY2hpbGRcIikuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0dGhpcy51aS5ncmlkLmZpbmQoXCJ0aDpsYXN0LWNoaWxkXCIpLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHRoaXMudWkuZ3JpZC5hZGRDbGFzcyhcIm11bHRpLXNlbGVjdC1tb2RlXCIpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMudWkuZ3JpZC5maW5kKFwiLnNlbGVjdGFibGVcIikuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0dGhpcy51aS5tdWx0aUFjdGlvbnMuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0dGhpcy51aS5ncmlkLmZpbmQoXCJ0ZDpsYXN0LWNoaWxkXCIpLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHRoaXMudWkuZ3JpZC5maW5kKFwidGg6bGFzdC1jaGlsZFwiKS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLnVpLmdyaWQucmVtb3ZlQ2xhc3MoXCJtdWx0aS1zZWxlY3QtbW9kZVwiKTtcblx0XHRcdHRoaXMuZ3JpZC5jb2xsZWN0aW9uLnRyaWdnZXIoXCJiYWNrZ3JpZDpzZWxlY3ROb25lXCIpO1xuXHRcdH1cblx0fSxcblxuXHRmZXRjaEVuZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5tdWx0aVNlbGVjdENoYW5nZSgpO1xuXHR9LFxuXG5cdG9uTXVsdGlEZWxldGU6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLmNvbGxlY3Rpb24uc2VsZWN0ZWRNb2RlbHNDb2xsZWN0aW9uLmxlbmd0aCkge1xuXHRcdFx0dGhpcy5kZWxNb2RhbCA9IG5ldyBDb25maXJtYXRpb25Nb2RhbCh7XG5cdFx0XHRcdG1vZGVsOiBuZXcgQmFja2JvbmUuTW9kZWwoe1xuXHRcdFx0XHRcdG1vZGVsczogdGhpcy5jb2xsZWN0aW9uLnNlbGVjdGVkTW9kZWxzQ29sbGVjdGlvbi50b0pTT04oKSxcblx0XHRcdFx0XHRhbmRBdHRhY2htZW50czogZmFsc2UsXG5cdFx0XHRcdFx0Y29sbGVjdGlvbjogdGhpcy5ncmlkLmNvbGxlY3Rpb24sXG5cdFx0XHRcdH0pLFxuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMuZGVsZXRlRXJyb3IgPSBmYWxzZTtcblx0XHRcdHRoaXMuZGVsTW9kYWwuc2hvdyh7XG5cdFx0XHRcdHllczogcmVzdWx0ID0+IHtcblx0XHRcdFx0XHRfLmVhY2gocmVzdWx0Lm1vZGVsLmdldChcIm1vZGVsc1wiKSwgbW9kZWwgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKG1vZGVsLmNoZWNrZWQpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgcmVzb3VyY2VNb2RlbCA9IG5ldyBSZXNvdXJjZShtb2RlbCk7XG5cdFx0XHRcdFx0XHRcdHJlc291cmNlTW9kZWwuYW5kQXR0YWNobWVudHMgPSByZXN1bHQubW9kZWwuZ2V0KFwiYW5kQXR0YWNobWVudHNcIik7XG5cdFx0XHRcdFx0XHRcdHJlc291cmNlTW9kZWwuZGVzdHJveSh7XG5cdFx0XHRcdFx0XHRcdFx0d2FpdDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRkYXRhOiB7IGFuZEF0dGFjaG1lbnRzOiByZXN1bHQubW9kZWwuZ2V0KFwiYW5kQXR0YWNobWVudHNcIikgfSxcblx0XHRcdFx0XHRcdFx0XHRzdWNjZXNzOiB0aGlzLnNpbmdsZURlbGV0aW9uU3VjY2Vzcy5iaW5kKHRoaXMpLFxuXHRcdFx0XHRcdFx0XHRcdGVycm9yOiB0aGlzLmRlbGV0aW9uRXJyb3IuYmluZCh0aGlzKSxcblx0XHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKHJlc291cmNlTW9kZWwuaGFzKFwiY2F0ZWdvcnlcIikgJiYgcmVzb3VyY2VNb2RlbC5nZXQoXCJjYXRlZ29yeVwiKSA9PT0gXCJhc3Nlc3NtZW50XCIpXG5cdFx0XHRcdFx0XHRcdFx0QXBwLnRyaWdnZXIoXCJjYWNoZTppbnZhbGlkYXRlOmFzc2Vzc21lbnRzXCIpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0dGhpcy5vbk11bHRpQ2FuY2VsKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0b25NdWx0aUNhbmNlbDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5tdWx0aUFjdGlvbnMuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkuZ3JpZC5maW5kKFwiLnNlbGVjdGFibGVcIikuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkubXVsdGlTZWxlY3QucHJvcChcImNoZWNrZWRcIiwgZmFsc2UpO1xuXHRcdHRoaXMuZ3JpZC5jb2xsZWN0aW9uLnRyaWdnZXIoXCJiYWNrZ3JpZDpzZWxlY3ROb25lXCIpO1xuXHRcdHRoaXMubXVsdGlTZWxlY3RDaGFuZ2UoKTtcblx0fSxcblxuXHRzaW5nbGVEZWxldGlvblN1Y2Nlc3M6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0dGhpcy5ncmlkLmNvbGxlY3Rpb24udHJpZ2dlcihcInJlbW92ZVwiLCBtb2RlbCk7XG5cdFx0dGhpcy5ncmlkLmNvbGxlY3Rpb24uZmV0Y2goeyByZXNldDogdHJ1ZSB9KTtcblxuXHRcdGlmICh0aGlzLmNvbGxlY3Rpb24uc2VsZWN0ZWRNb2RlbHNDb2xsZWN0aW9uLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5kZWxldGVFcnJvcilcblx0XHRcdHRoaXMubXVsdGlEZWxldGlvblN1Y2Nlc3MoKTtcblx0fSxcblxuXHRtdWx0aURlbGV0aW9uU3VjY2VzczogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5kZWxNb2RhbC5kZXN0cm95KCk7XG5cdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7IGNvbnRlbnQ6IFwiVGhlIGl0ZW1zIGhhdmUgYmVlbiBzdWNjZXNzZnVsbHkgZGVsZXRlZFwiLCBpY29uOiBcImZhLXRyYXNoLWFsdFwiLCBpY29uQ29sb3VyOiBcInJlZFwiIH0pO1xuXHR9LFxufSk7Il19",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\n\nvar BigModal = require(\"../../../lib/bigModal\");\n\nmodule.exports = BigModal.extend({\n\tui: {\n\t\tandAttachments: \"input.and-attachments\",\n\t\tconfirmItems: \".confirm-items\",\n\t\titem: \".item\"\n\t},\n\n\tevents: {\n\t\t\"change @ui.andAttachments\": \"onAndAttachmentsChange\",\n\t\t\"click @ui.item\": \"onItemClick\"\n\t},\n\n\tinitialize: function initialize() {\n\t\t_.bindAll(this);\n\n\t\tthis.Options = {\n\t\t\ttemplate: require(\"../../templates/manager/multiDeleteConfirmation.nunj\").content,\n\t\t\ttype: \"warning\",\n\t\t\tbuttons: {\n\t\t\t\tyes: {\n\t\t\t\t\ttype: \"delete\",\n\t\t\t\t\tlabel: \"Yes\"\n\t\t\t\t},\n\t\t\t\tno: {\n\t\t\t\t\ttype: \"cancel\",\n\t\t\t\t\tlabel: \"No\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tdataNoun: \"\",\n\t\t\tcreateIcon: \"fa-exclamation-triangle\",\n\t\t\tcreateVerb: \"delete\",\n\t\t\tsizeConstraints: {\n\t\t\t\tminHeight: \"30vh\",\n\t\t\t\tminWidth: \"50vw\"\n\t\t\t}\n\t\t};\n\n\t\tvar newModels = _.map(this.model.get(\"models\"), function (model) {\n\t\t\tmodel.checked = true;\n\t\t\treturn model;\n\t\t});\n\t\tthis.model.set(\"models\", newModels);\n\n\t\tthis.ui = _.extend(this.ui, BigModal.prototype.ui);\n\t\tthis.events = _.extend(this.events, BigModal.prototype.events);\n\n\t\tBigModal.prototype.initialize.call(this);\n\t},\n\n\tonAndAttachmentsChange: function onAndAttachmentsChange() {\n\t\tthis.model.set(\"andAttachments\", this.ui.andAttachments.prop(\"checked\"));\n\t},\n\n\tonItemChange: function onItemChange(e) {\n\t\tvar id = $(e.currentTarget).val();\n\t\tvar checked = $(e.currentTarget).prop(\"checked\");\n\t\tvar newModels = _.map(this.model.get(\"models\"), function (model) {\n\t\t\tif (model._id === id) model.checked = checked;\n\t\t\treturn model;\n\t\t});\n\t\tthis.model.set(\"models\", newModels);\n\t},\n\n\tonItemClick: function onItemClick(e) {\n\t\tvar id = $(e.currentTarget).find(\".status-icon\").attr(\"data-id\");\n\n\t\tif ($(e.currentTarget).find(\".status-icon\").hasClass(\"status-selected\")) {\n\t\t\t$(e.currentTarget).find(\".status-icon\").removeClass(\"status-selected\").removeClass(\"fas\").addClass(\"fal\");\n\n\t\t\tthis.model.set(\"models\", _.map(this.model.get(\"models\"), function (model) {\n\t\t\t\tif (model._id === id) model.checked = false;\n\t\t\t\treturn model;\n\t\t\t}));\n\t\t} else {\n\t\t\t$(e.currentTarget).find(\".status-icon\").removeClass(\"fal\").addClass(\"status-selected\").addClass(\"fas\");\n\t\t\tthis.model.set(\"models\", _.map(this.model.get(\"models\"), function (model) {\n\t\t\t\tif (model._id === id) model.checked = true;\n\t\t\t\treturn model;\n\t\t\t}));\n\t\t}\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm11bHRpRGVsZXRlQ29uZmlybWF0aW9uLmpzIl0sIm5hbWVzIjpbIiQiLCJyZXF1aXJlIiwiXyIsIkJpZ01vZGFsIiwibW9kdWxlIiwiZXhwb3J0cyIsImV4dGVuZCIsInVpIiwiYW5kQXR0YWNobWVudHMiLCJjb25maXJtSXRlbXMiLCJpdGVtIiwiZXZlbnRzIiwiaW5pdGlhbGl6ZSIsImJpbmRBbGwiLCJPcHRpb25zIiwidGVtcGxhdGUiLCJjb250ZW50IiwidHlwZSIsImJ1dHRvbnMiLCJ5ZXMiLCJsYWJlbCIsIm5vIiwiZGF0YU5vdW4iLCJjcmVhdGVJY29uIiwiY3JlYXRlVmVyYiIsInNpemVDb25zdHJhaW50cyIsIm1pbkhlaWdodCIsIm1pbldpZHRoIiwibmV3TW9kZWxzIiwibWFwIiwibW9kZWwiLCJnZXQiLCJjaGVja2VkIiwic2V0IiwicHJvdG90eXBlIiwiY2FsbCIsIm9uQW5kQXR0YWNobWVudHNDaGFuZ2UiLCJwcm9wIiwib25JdGVtQ2hhbmdlIiwiZSIsImlkIiwiY3VycmVudFRhcmdldCIsInZhbCIsIl9pZCIsIm9uSXRlbUNsaWNrIiwiZmluZCIsImF0dHIiLCJoYXNDbGFzcyIsInJlbW92ZUNsYXNzIiwiYWRkQ2xhc3MiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsSUFBSUQsUUFBUSxRQUFSLENBQVY7O0FBRUEsSUFBTUUsV0FBV0YsUUFBUSx1QkFBUixDQUFqQjs7QUFFQUcsT0FBT0MsT0FBUCxHQUFpQkYsU0FBU0csTUFBVCxDQUFnQjtBQUNoQ0MsS0FBSTtBQUNIQyxrQkFBZ0IsdUJBRGI7QUFFSEMsZ0JBQWMsZ0JBRlg7QUFHSEMsUUFBTTtBQUhILEVBRDRCOztBQU9oQ0MsU0FBUTtBQUNQLCtCQUE2Qix3QkFEdEI7QUFFUCxvQkFBa0I7QUFGWCxFQVB3Qjs7QUFZaENDLGFBQVksc0JBQVc7QUFDdEJWLElBQUVXLE9BQUYsQ0FBVSxJQUFWOztBQUVBLE9BQUtDLE9BQUwsR0FBZTtBQUNkQyxhQUFVZCxRQUFRLHNEQUFSLEVBQWdFZSxPQUQ1RDtBQUVkQyxTQUFNLFNBRlE7QUFHZEMsWUFBUztBQUNSQyxTQUFLO0FBQ0pGLFdBQU0sUUFERjtBQUVKRyxZQUFPO0FBRkgsS0FERztBQUtSQyxRQUFJO0FBQ0hKLFdBQU0sUUFESDtBQUVIRyxZQUFPO0FBRko7QUFMSSxJQUhLO0FBYWRFLGFBQVUsRUFiSTtBQWNkQyxlQUFZLHlCQWRFO0FBZWRDLGVBQVksUUFmRTtBQWdCZEMsb0JBQWlCO0FBQ2hCQyxlQUFXLE1BREs7QUFFaEJDLGNBQVU7QUFGTTtBQWhCSCxHQUFmOztBQXNCQSxNQUFNQyxZQUFZMUIsRUFBRTJCLEdBQUYsQ0FBTSxLQUFLQyxLQUFMLENBQVdDLEdBQVgsQ0FBZSxRQUFmLENBQU4sRUFBZ0MsaUJBQVM7QUFDMURELFNBQU1FLE9BQU4sR0FBZ0IsSUFBaEI7QUFDQSxVQUFPRixLQUFQO0FBQ0EsR0FIaUIsQ0FBbEI7QUFJQSxPQUFLQSxLQUFMLENBQVdHLEdBQVgsQ0FBZSxRQUFmLEVBQXlCTCxTQUF6Qjs7QUFFQSxPQUFLckIsRUFBTCxHQUFVTCxFQUFFSSxNQUFGLENBQVMsS0FBS0MsRUFBZCxFQUFrQkosU0FBUytCLFNBQVQsQ0FBbUIzQixFQUFyQyxDQUFWO0FBQ0EsT0FBS0ksTUFBTCxHQUFjVCxFQUFFSSxNQUFGLENBQVMsS0FBS0ssTUFBZCxFQUFzQlIsU0FBUytCLFNBQVQsQ0FBbUJ2QixNQUF6QyxDQUFkOztBQUVBUixXQUFTK0IsU0FBVCxDQUFtQnRCLFVBQW5CLENBQThCdUIsSUFBOUIsQ0FBbUMsSUFBbkM7QUFDQSxFQS9DK0I7O0FBaURoQ0MseUJBQXdCLGtDQUFXO0FBQ2xDLE9BQUtOLEtBQUwsQ0FBV0csR0FBWCxDQUFlLGdCQUFmLEVBQWlDLEtBQUsxQixFQUFMLENBQVFDLGNBQVIsQ0FBdUI2QixJQUF2QixDQUE0QixTQUE1QixDQUFqQztBQUNBLEVBbkQrQjs7QUFxRGhDQyxlQUFjLHNCQUFTQyxDQUFULEVBQVk7QUFDekIsTUFBTUMsS0FBS3hDLEVBQUV1QyxFQUFFRSxhQUFKLEVBQW1CQyxHQUFuQixFQUFYO0FBQ0EsTUFBTVYsVUFBVWhDLEVBQUV1QyxFQUFFRSxhQUFKLEVBQW1CSixJQUFuQixDQUF3QixTQUF4QixDQUFoQjtBQUNBLE1BQU1ULFlBQVkxQixFQUFFMkIsR0FBRixDQUFNLEtBQUtDLEtBQUwsQ0FBV0MsR0FBWCxDQUFlLFFBQWYsQ0FBTixFQUFnQyxpQkFBUztBQUMxRCxPQUFJRCxNQUFNYSxHQUFOLEtBQWNILEVBQWxCLEVBQ0NWLE1BQU1FLE9BQU4sR0FBZ0JBLE9BQWhCO0FBQ0QsVUFBT0YsS0FBUDtBQUNBLEdBSmlCLENBQWxCO0FBS0EsT0FBS0EsS0FBTCxDQUFXRyxHQUFYLENBQWUsUUFBZixFQUF5QkwsU0FBekI7QUFDQSxFQTlEK0I7O0FBZ0VoQ2dCLGNBQWEscUJBQVNMLENBQVQsRUFBWTtBQUN4QixNQUFNQyxLQUFLeEMsRUFBRXVDLEVBQUVFLGFBQUosRUFBbUJJLElBQW5CLENBQXdCLGNBQXhCLEVBQXdDQyxJQUF4QyxDQUE2QyxTQUE3QyxDQUFYOztBQUVBLE1BQUk5QyxFQUFFdUMsRUFBRUUsYUFBSixFQUFtQkksSUFBbkIsQ0FBd0IsY0FBeEIsRUFBd0NFLFFBQXhDLENBQWlELGlCQUFqRCxDQUFKLEVBQXlFO0FBQ3hFL0MsS0FBRXVDLEVBQUVFLGFBQUosRUFBbUJJLElBQW5CLENBQXdCLGNBQXhCLEVBQXdDRyxXQUF4QyxDQUFvRCxpQkFBcEQsRUFBdUVBLFdBQXZFLENBQW1GLEtBQW5GLEVBQTBGQyxRQUExRixDQUFtRyxLQUFuRzs7QUFFQSxRQUFLbkIsS0FBTCxDQUFXRyxHQUFYLENBQWUsUUFBZixFQUF5Qi9CLEVBQUUyQixHQUFGLENBQU0sS0FBS0MsS0FBTCxDQUFXQyxHQUFYLENBQWUsUUFBZixDQUFOLEVBQWdDLGlCQUFTO0FBQ2pFLFFBQUlELE1BQU1hLEdBQU4sS0FBY0gsRUFBbEIsRUFDQ1YsTUFBTUUsT0FBTixHQUFnQixLQUFoQjtBQUNELFdBQU9GLEtBQVA7QUFDQSxJQUp3QixDQUF6QjtBQUtBLEdBUkQsTUFTSztBQUNKOUIsS0FBRXVDLEVBQUVFLGFBQUosRUFBbUJJLElBQW5CLENBQXdCLGNBQXhCLEVBQXdDRyxXQUF4QyxDQUFvRCxLQUFwRCxFQUEyREMsUUFBM0QsQ0FBb0UsaUJBQXBFLEVBQXVGQSxRQUF2RixDQUFnRyxLQUFoRztBQUNBLFFBQUtuQixLQUFMLENBQVdHLEdBQVgsQ0FBZSxRQUFmLEVBQXlCL0IsRUFBRTJCLEdBQUYsQ0FBTSxLQUFLQyxLQUFMLENBQVdDLEdBQVgsQ0FBZSxRQUFmLENBQU4sRUFBZ0MsaUJBQVM7QUFDakUsUUFBSUQsTUFBTWEsR0FBTixLQUFjSCxFQUFsQixFQUNDVixNQUFNRSxPQUFOLEdBQWdCLElBQWhCO0FBQ0QsV0FBT0YsS0FBUDtBQUNBLElBSndCLENBQXpCO0FBS0E7QUFDRDtBQXBGK0IsQ0FBaEIsQ0FBakIiLCJmaWxlIjoibXVsdGlEZWxldGVDb25maXJtYXRpb24uanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5cbmNvbnN0IEJpZ01vZGFsID0gcmVxdWlyZShcIi4uLy4uLy4uL2xpYi9iaWdNb2RhbFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCaWdNb2RhbC5leHRlbmQoe1xuXHR1aToge1xuXHRcdGFuZEF0dGFjaG1lbnRzOiBcImlucHV0LmFuZC1hdHRhY2htZW50c1wiLFxuXHRcdGNvbmZpcm1JdGVtczogXCIuY29uZmlybS1pdGVtc1wiLFxuXHRcdGl0ZW06IFwiLml0ZW1cIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNoYW5nZSBAdWkuYW5kQXR0YWNobWVudHNcIjogXCJvbkFuZEF0dGFjaG1lbnRzQ2hhbmdlXCIsXG5cdFx0XCJjbGljayBAdWkuaXRlbVwiOiBcIm9uSXRlbUNsaWNrXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0Xy5iaW5kQWxsKHRoaXMpO1xuXG5cdFx0dGhpcy5PcHRpb25zID0ge1xuXHRcdFx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvbWFuYWdlci9tdWx0aURlbGV0ZUNvbmZpcm1hdGlvbi5udW5qXCIpLmNvbnRlbnQsXG5cdFx0XHR0eXBlOiBcIndhcm5pbmdcIixcblx0XHRcdGJ1dHRvbnM6IHtcblx0XHRcdFx0eWVzOiB7XG5cdFx0XHRcdFx0dHlwZTogXCJkZWxldGVcIixcblx0XHRcdFx0XHRsYWJlbDogXCJZZXNcIixcblx0XHRcdFx0fSxcblx0XHRcdFx0bm86IHtcblx0XHRcdFx0XHR0eXBlOiBcImNhbmNlbFwiLFxuXHRcdFx0XHRcdGxhYmVsOiBcIk5vXCIsXG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdFx0ZGF0YU5vdW46IFwiXCIsXG5cdFx0XHRjcmVhdGVJY29uOiBcImZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlXCIsXG5cdFx0XHRjcmVhdGVWZXJiOiBcImRlbGV0ZVwiLFxuXHRcdFx0c2l6ZUNvbnN0cmFpbnRzOiB7XG5cdFx0XHRcdG1pbkhlaWdodDogXCIzMHZoXCIsXG5cdFx0XHRcdG1pbldpZHRoOiBcIjUwdndcIixcblx0XHRcdH0sXG5cdFx0fTtcblxuXHRcdGNvbnN0IG5ld01vZGVscyA9IF8ubWFwKHRoaXMubW9kZWwuZ2V0KFwibW9kZWxzXCIpLCBtb2RlbCA9PiB7XG5cdFx0XHRtb2RlbC5jaGVja2VkID0gdHJ1ZTtcblx0XHRcdHJldHVybiBtb2RlbDtcblx0XHR9KTtcblx0XHR0aGlzLm1vZGVsLnNldChcIm1vZGVsc1wiLCBuZXdNb2RlbHMpO1xuXG5cdFx0dGhpcy51aSA9IF8uZXh0ZW5kKHRoaXMudWksIEJpZ01vZGFsLnByb3RvdHlwZS51aSk7XG5cdFx0dGhpcy5ldmVudHMgPSBfLmV4dGVuZCh0aGlzLmV2ZW50cywgQmlnTW9kYWwucHJvdG90eXBlLmV2ZW50cyk7XG5cblx0XHRCaWdNb2RhbC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMpO1xuXHR9LFxuXG5cdG9uQW5kQXR0YWNobWVudHNDaGFuZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMubW9kZWwuc2V0KFwiYW5kQXR0YWNobWVudHNcIiwgdGhpcy51aS5hbmRBdHRhY2htZW50cy5wcm9wKFwiY2hlY2tlZFwiKSk7XG5cdH0sXG5cblx0b25JdGVtQ2hhbmdlOiBmdW5jdGlvbihlKSB7XG5cdFx0Y29uc3QgaWQgPSAkKGUuY3VycmVudFRhcmdldCkudmFsKCk7XG5cdFx0Y29uc3QgY2hlY2tlZCA9ICQoZS5jdXJyZW50VGFyZ2V0KS5wcm9wKFwiY2hlY2tlZFwiKTtcblx0XHRjb25zdCBuZXdNb2RlbHMgPSBfLm1hcCh0aGlzLm1vZGVsLmdldChcIm1vZGVsc1wiKSwgbW9kZWwgPT4ge1xuXHRcdFx0aWYgKG1vZGVsLl9pZCA9PT0gaWQpXG5cdFx0XHRcdG1vZGVsLmNoZWNrZWQgPSBjaGVja2VkO1xuXHRcdFx0cmV0dXJuIG1vZGVsO1xuXHRcdH0pO1xuXHRcdHRoaXMubW9kZWwuc2V0KFwibW9kZWxzXCIsIG5ld01vZGVscyk7XG5cdH0sXG5cblx0b25JdGVtQ2xpY2s6IGZ1bmN0aW9uKGUpIHtcblx0XHRjb25zdCBpZCA9ICQoZS5jdXJyZW50VGFyZ2V0KS5maW5kKFwiLnN0YXR1cy1pY29uXCIpLmF0dHIoXCJkYXRhLWlkXCIpO1xuXG5cdFx0aWYgKCQoZS5jdXJyZW50VGFyZ2V0KS5maW5kKFwiLnN0YXR1cy1pY29uXCIpLmhhc0NsYXNzKFwic3RhdHVzLXNlbGVjdGVkXCIpKSB7XG5cdFx0XHQkKGUuY3VycmVudFRhcmdldCkuZmluZChcIi5zdGF0dXMtaWNvblwiKS5yZW1vdmVDbGFzcyhcInN0YXR1cy1zZWxlY3RlZFwiKS5yZW1vdmVDbGFzcyhcImZhc1wiKS5hZGRDbGFzcyhcImZhbFwiKTtcblxuXHRcdFx0dGhpcy5tb2RlbC5zZXQoXCJtb2RlbHNcIiwgXy5tYXAodGhpcy5tb2RlbC5nZXQoXCJtb2RlbHNcIiksIG1vZGVsID0+IHtcblx0XHRcdFx0aWYgKG1vZGVsLl9pZCA9PT0gaWQpXG5cdFx0XHRcdFx0bW9kZWwuY2hlY2tlZCA9IGZhbHNlO1xuXHRcdFx0XHRyZXR1cm4gbW9kZWw7XG5cdFx0XHR9KSk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0JChlLmN1cnJlbnRUYXJnZXQpLmZpbmQoXCIuc3RhdHVzLWljb25cIikucmVtb3ZlQ2xhc3MoXCJmYWxcIikuYWRkQ2xhc3MoXCJzdGF0dXMtc2VsZWN0ZWRcIikuYWRkQ2xhc3MoXCJmYXNcIik7XG5cdFx0XHR0aGlzLm1vZGVsLnNldChcIm1vZGVsc1wiLCBfLm1hcCh0aGlzLm1vZGVsLmdldChcIm1vZGVsc1wiKSwgbW9kZWwgPT4ge1xuXHRcdFx0XHRpZiAobW9kZWwuX2lkID09PSBpZClcblx0XHRcdFx0XHRtb2RlbC5jaGVja2VkID0gdHJ1ZTtcblx0XHRcdFx0cmV0dXJuIG1vZGVsO1xuXHRcdFx0fSkpO1xuXHRcdH1cblx0fSxcbn0pOyJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\n\nvar AttendanceRecordModel = require(\"../../models/attendance/attendanceRecordModel\");\n\nmodule.exports = Backbone.PageableCollection.extend({\n\tmodel: AttendanceRecordModel,\n\n\tinitialize: function initialize(options) {\n\t\tif (options) {\n\t\t\tthis.attendanceRegister = options.attendanceRegister;\n\t\t\tthis.group = options.group;\n\t\t}\n\t},\n\n\turl: function url() {\n\t\tvar url = settings.urlRoot + \"/api/1.0/attendance/records/\";\n\n\t\tif (this.attendanceRegister) url += \"byRegister/\" + this.attendanceRegister;else if (this.group) url += \"byGroup/\" + this.group;else url = \"\";\n\n\t\treturn url ? url + \"?paged=true\" : \"\";\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImF0dGVuZGFuY2VSZWNvcmRDb2xsZWN0aW9uLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsInNldHRpbmdzIiwiQXR0ZW5kYW5jZVJlY29yZE1vZGVsIiwibW9kdWxlIiwiZXhwb3J0cyIsIlBhZ2VhYmxlQ29sbGVjdGlvbiIsImV4dGVuZCIsIm1vZGVsIiwiaW5pdGlhbGl6ZSIsIm9wdGlvbnMiLCJhdHRlbmRhbmNlUmVnaXN0ZXIiLCJncm91cCIsInVybCIsInVybFJvb3QiLCJzdGF0ZSIsInBhZ2VTaXplIiwibW9kZSIsInF1ZXJ5UGFyYW1zIiwic29ydEtleSIsInBhcnNlU3RhdGUiLCJyZXNwIiwidG90YWxSZWNvcmRzIiwidG90YWwiLCJwYXJzZVJlY29yZHMiLCJyb3dzIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7O0FBRUEsSUFBTUMsV0FBV0QsUUFBUSxjQUFSLENBQWpCOztBQUVBLElBQU1FLHdCQUF3QkYsUUFBUSwrQ0FBUixDQUE5Qjs7QUFFQUcsT0FBT0MsT0FBUCxHQUFpQkwsU0FBU00sa0JBQVQsQ0FBNEJDLE1BQTVCLENBQW1DO0FBQ25EQyxRQUFPTCxxQkFENEM7O0FBR25ETSxhQUFZLG9CQUFTQyxPQUFULEVBQWtCO0FBQzdCLE1BQUlBLE9BQUosRUFBYTtBQUNaLFFBQUtDLGtCQUFMLEdBQTBCRCxRQUFRQyxrQkFBbEM7QUFDQSxRQUFLQyxLQUFMLEdBQWFGLFFBQVFFLEtBQXJCO0FBQ0E7QUFDRCxFQVJrRDs7QUFVbkRDLE1BQUssZUFBVztBQUNmLE1BQUlBLE1BQU1YLFNBQVNZLE9BQVQsR0FBbUIsOEJBQTdCOztBQUVBLE1BQUksS0FBS0gsa0JBQVQsRUFDQ0UsT0FBTyxnQkFBZ0IsS0FBS0Ysa0JBQTVCLENBREQsS0FFSyxJQUFJLEtBQUtDLEtBQVQsRUFDSkMsT0FBTyxhQUFhLEtBQUtELEtBQXpCLENBREksS0FHSkMsTUFBTSxFQUFOOztBQUVELFNBQU9BLE1BQU1BLE1BQU0sYUFBWixHQUE0QixFQUFuQztBQUNBLEVBckJrRDs7QUF1Qm5ERSxRQUFPO0FBQ05DLFlBQVU7QUFESixFQXZCNEM7QUEwQm5EQyxPQUFNLFFBMUI2Qzs7QUE0Qm5EQyxjQUFhO0FBQ1pGLFlBQVUsVUFERTtBQUVaRyxXQUFTO0FBRkcsRUE1QnNDOztBQWlDbkRDLGFBQVksb0JBQVNDLElBQVQsRUFBZTtBQUMxQixTQUFPLEVBQUVDLGNBQWNELEtBQUtFLEtBQXJCLEVBQVA7QUFDQSxFQW5Da0Q7O0FBcUNuREMsZUFBYyxzQkFBU0gsSUFBVCxFQUFlO0FBQzVCLFNBQU9BLEtBQUtJLElBQVo7QUFDQTtBQXZDa0QsQ0FBbkMsQ0FBakIiLCJmaWxlIjoiYXR0ZW5kYW5jZVJlY29yZENvbGxlY3Rpb24uanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IEF0dGVuZGFuY2VSZWNvcmRNb2RlbCA9IHJlcXVpcmUoXCIuLi8uLi9tb2RlbHMvYXR0ZW5kYW5jZS9hdHRlbmRhbmNlUmVjb3JkTW9kZWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuUGFnZWFibGVDb2xsZWN0aW9uLmV4dGVuZCh7XG5cdG1vZGVsOiBBdHRlbmRhbmNlUmVjb3JkTW9kZWwsXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdGlmIChvcHRpb25zKSB7XG5cdFx0XHR0aGlzLmF0dGVuZGFuY2VSZWdpc3RlciA9IG9wdGlvbnMuYXR0ZW5kYW5jZVJlZ2lzdGVyO1xuXHRcdFx0dGhpcy5ncm91cCA9IG9wdGlvbnMuZ3JvdXA7XG5cdFx0fVxuXHR9LFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0bGV0IHVybCA9IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2F0dGVuZGFuY2UvcmVjb3Jkcy9cIjtcblxuXHRcdGlmICh0aGlzLmF0dGVuZGFuY2VSZWdpc3Rlcilcblx0XHRcdHVybCArPSBcImJ5UmVnaXN0ZXIvXCIgKyB0aGlzLmF0dGVuZGFuY2VSZWdpc3Rlcjtcblx0XHRlbHNlIGlmICh0aGlzLmdyb3VwKVxuXHRcdFx0dXJsICs9IFwiYnlHcm91cC9cIiArIHRoaXMuZ3JvdXA7XG5cdFx0ZWxzZVxuXHRcdFx0dXJsID0gXCJcIjtcblxuXHRcdHJldHVybiB1cmwgPyB1cmwgKyBcIj9wYWdlZD10cnVlXCIgOiBcIlwiO1xuXHR9LFxuXG5cdHN0YXRlOiB7XG5cdFx0cGFnZVNpemU6IDMwLFxuXHR9LFxuXHRtb2RlOiBcInNlcnZlclwiLFxuXG5cdHF1ZXJ5UGFyYW1zOiB7XG5cdFx0cGFnZVNpemU6IFwicGFnZVNpemVcIixcblx0XHRzb3J0S2V5OiBcInNvcnRCeVwiLFxuXHR9LFxuXG5cdHBhcnNlU3RhdGU6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRyZXR1cm4geyB0b3RhbFJlY29yZHM6IHJlc3AudG90YWwgfTtcblx0fSxcblxuXHRwYXJzZVJlY29yZHM6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRyZXR1cm4gcmVzcC5yb3dzO1xuXHR9LFxufSk7XG4iXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\n\nvar AttendanceRegisterModel = require(\"../../models/attendance/attendanceRegisterModel\");\n\nmodule.exports = Backbone.Collection.extend({\n\tmodel: AttendanceRegisterModel,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/attendance/registers/byGroup\";\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImF0dGVuZGFuY2VSZWdpc3RlckNvbGxlY3Rpb24uanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwic2V0dGluZ3MiLCJBdHRlbmRhbmNlUmVnaXN0ZXJNb2RlbCIsIm1vZHVsZSIsImV4cG9ydHMiLCJDb2xsZWN0aW9uIiwiZXh0ZW5kIiwibW9kZWwiLCJ1cmwiLCJ1cmxSb290Il0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7O0FBRUEsSUFBTUMsV0FBV0QsUUFBUSxjQUFSLENBQWpCOztBQUVBLElBQU1FLDBCQUEwQkYsUUFBUSxpREFBUixDQUFoQzs7QUFFQUcsT0FBT0MsT0FBUCxHQUFpQkwsU0FBU00sVUFBVCxDQUFvQkMsTUFBcEIsQ0FBMkI7QUFDM0NDLFFBQU9MLHVCQURvQzs7QUFHM0NNLE1BQUssZUFBVztBQUNmLFNBQU9QLFNBQVNRLE9BQVQsR0FBbUIsdUNBQTFCO0FBQ0E7QUFMMEMsQ0FBM0IsQ0FBakIiLCJmaWxlIjoiYXR0ZW5kYW5jZVJlZ2lzdGVyQ29sbGVjdGlvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5cbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxuY29uc3QgQXR0ZW5kYW5jZVJlZ2lzdGVyTW9kZWwgPSByZXF1aXJlKFwiLi4vLi4vbW9kZWxzL2F0dGVuZGFuY2UvYXR0ZW5kYW5jZVJlZ2lzdGVyTW9kZWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuQ29sbGVjdGlvbi5leHRlbmQoe1xuXHRtb2RlbDogQXR0ZW5kYW5jZVJlZ2lzdGVyTW9kZWwsXG5cblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvYXR0ZW5kYW5jZS9yZWdpc3RlcnMvYnlHcm91cFwiO1xuXHR9LFxufSk7XG4iXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\n\nvar AttendanceLayout = require(\"./views/attendance/layout\");\nvar Console = require(\"./views/console/index\");\nvar Calendar = require(\"./views/calendar\");\nvar Marks = require(\"./views/marks\");\nvar StudentMarks = require(\"./views/studentMarks\");\nvar GroupMarks = require(\"./views/groupMarks\");\nvar Tags = require(\"./views/tags\");\nvar CAM = require(\"./views/cam\");\n\nvar Module = module.exports = new Backbone.Marionette.Application();\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nModule.Views = {};\n\nvar consoleCommon = function consoleCommon(App, filler) {\n\tif (!Module.Views.eduConsole) Module.Views.eduConsole = new Console();\n\n\tif (App.getRegion().currentView !== Module.Views.eduConsole) {\n\t\tApp.getRegion().show(Module.Views.eduConsole);\n\n\t\t// Destroy the semi-persistent view if we go elsewhere\n\t\tApp.getRegion().once(\"before:swap before:empty\", function () {\n\t\t\tif (Module.Views.eduConsole) {\n\t\t\t\tModule.Views.eduConsole.destroy();\n\t\t\t\tdelete Module.Views.eduConsole;\n\t\t\t}\n\t\t});\n\t}\n\n\tfiller();\n};\n\n// Add intra-module routing\nModule.routing = function (App) {\n\tModule.Router = {\n\t\troutes: {\n\t\t\t\"\": \"navigateToBookSelector\",\n\t\t\t\"attendance/register(/:group)(/:user)(/:displayDate)(/:attendanceRegister)\": \"loadAttendanceRegister\",\n\t\t\t\"attendance/report/user(/:group)(/:user)\": \"loadUserAttendanceReport\",\n\t\t\t\"books(/:book)(/*path)\": \"loadBook\",\n\t\t\t\"marks(/:assessment)(/:instance)(/:submission)\": \"loadMarks\",\n\t\t\t\"groups(/:group)\": \"loadLearningPath\",\n\t\t\t\"learningPaths(/:learningPath)(/*path)\": \"loadLearningPath\",\n\t\t\t\"student/marks\": \"loadStudentMarks\",\n\t\t\t\"group/marks\": \"loadGroupMarks\",\n\t\t\tcalendar: \"calendar\",\n\t\t\t\"tags(/:learningPath)\": \"loadTags\",\n\t\t\tcam: \"loadCAM\",\n\n\t\t\t\".*\": \"catchAll\"\n\t\t},\n\n\t\tnavigateToBookSelector: function navigateToBookSelector() {\n\t\t\tradio.trigger(App.Events.Commands.Navigate, settings.urlRoot + \"/console/books\");\n\t\t},\n\n\t\tloadAttendanceRegisterLayout: function loadAttendanceRegisterLayout() {\n\t\t\tif (!Module.Views.attendance) Module.Views.attendance = new AttendanceLayout();\n\n\t\t\tif (App.getRegion().currentView !== Module.Views.attendance) App.loadView(Module.Views.attendance);\n\n\t\t\tApp.getRegion().once(\"before:swap before:empty\", function () {\n\t\t\t\tif (Module.Views.attendance) {\n\t\t\t\t\tModule.Views.attendance.destroy();\n\t\t\t\t\tdelete Module.Views.attendance;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\tloadAttendanceRegister: function loadAttendanceRegister(group, user, displayDate, attendanceRegister) {\n\t\t\tModule.Router.loadAttendanceRegisterLayout();\n\n\t\t\tModule.Views.attendance.navigateToSection({\n\t\t\t\tgroup: group || undefined,\n\t\t\t\tuser: user || undefined,\n\t\t\t\tdisplayDate: displayDate || undefined,\n\t\t\t\tattendanceRegister: attendanceRegister || undefined\n\t\t\t});\n\t\t},\n\n\t\tloadUserAttendanceReport: function loadUserAttendanceReport(group, user) {\n\t\t\tModule.Router.loadAttendanceRegisterLayout();\n\n\t\t\tModule.Views.attendance.navigateToUserReport({\n\t\t\t\tgroup: group,\n\t\t\t\tuser: user\n\t\t\t});\n\t\t},\n\n\t\tloadConsole: function loadConsole(id) {\n\t\t\tApp.modalContext = \"#link-resources\";\n\n\t\t\tif (id) {\n\t\t\t\tconsoleCommon(App, function () {\n\t\t\t\t\tModule.Views.eduConsole.loadConsole(id);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tradio.trigger(App.Events.Commands.Navigate, settings.urlRoot);\n\t\t\t}\n\t\t},\n\n\t\tloadBook: function loadBook(book, params) {\n\t\t\tApp.modalContext = \"#link-resources\";\n\n\t\t\tif (book) {\n\t\t\t\tconsoleCommon(App, function () {\n\t\t\t\t\tModule.Views.eduConsole.loadBook(book, params || \"\", window.location.hash);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconsoleCommon(App, function () {\n\t\t\t\t\tModule.Views.eduConsole.loadConsole(\"books\");\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\tloadLearningPath: function loadLearningPath(learningPath, params) {\n\t\t\tApp.modalContext = \"#link-resources\";\n\n\t\t\tif (learningPath) {\n\t\t\t\tconsoleCommon(App, function () {\n\t\t\t\t\tModule.Views.eduConsole.loadLearningPath(learningPath, params);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconsoleCommon(App, function () {\n\t\t\t\t\tModule.Views.eduConsole.loadConsole(\"learning-paths\");\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\tcalendar: function calendar() {\n\t\t\tApp.loadView(new Calendar());\n\t\t},\n\n\t\tloadMarks: function loadMarks(assessmentID, instanceID, submissionID) {\n\t\t\tif (!Module.Views.marks) Module.Views.marks = new Marks();\n\n\t\t\tif (App.getRegion().currentView !== Module.Views.marks) App.loadView(Module.Views.marks);\n\n\t\t\tModule.Views.marks.navigateToSection({\n\t\t\t\tassessmentID: assessmentID,\n\t\t\t\tinstanceID: instanceID,\n\t\t\t\tsubmissionID: submissionID\n\t\t\t});\n\n\t\t\tApp.getRegion().once(\"before:swap before:empty\", function () {\n\t\t\t\tif (Module.Views.marks) {\n\t\t\t\t\tModule.Views.marks.destroy();\n\t\t\t\t\tdelete Module.Views.marks;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\tloadStudentMarks: function loadStudentMarks() {\n\t\t\tApp.loadView(new StudentMarks());\n\t\t},\n\n\t\tloadGroupMarks: function loadGroupMarks() {\n\t\t\tApp.loadView(new GroupMarks());\n\t\t},\n\n\t\tloadTags: function loadTags(learningPath) {\n\t\t\tApp.loadView(new Tags({ learningPath: learningPath }));\n\t\t},\n\n\t\tloadCAM: function loadCAM() {\n\t\t\tApp.loadView(new CAM());\n\t\t},\n\n\t\tcatchAll: function catchAll() {\n\t\t\tthis.navigate(\"/\", { trigger: true, replace: true });\n\t\t}\n\t};\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsInNldHRpbmdzIiwiQXR0ZW5kYW5jZUxheW91dCIsIkNvbnNvbGUiLCJDYWxlbmRhciIsIk1hcmtzIiwiU3R1ZGVudE1hcmtzIiwiR3JvdXBNYXJrcyIsIlRhZ3MiLCJDQU0iLCJNb2R1bGUiLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIkFwcGxpY2F0aW9uIiwicmFkaW8iLCJSYWRpbyIsImNoYW5uZWwiLCJWaWV3cyIsImNvbnNvbGVDb21tb24iLCJBcHAiLCJmaWxsZXIiLCJlZHVDb25zb2xlIiwiZ2V0UmVnaW9uIiwiY3VycmVudFZpZXciLCJzaG93Iiwib25jZSIsImRlc3Ryb3kiLCJyb3V0aW5nIiwiUm91dGVyIiwicm91dGVzIiwiY2FsZW5kYXIiLCJjYW0iLCJuYXZpZ2F0ZVRvQm9va1NlbGVjdG9yIiwidHJpZ2dlciIsIkV2ZW50cyIsIkNvbW1hbmRzIiwiTmF2aWdhdGUiLCJ1cmxSb290IiwibG9hZEF0dGVuZGFuY2VSZWdpc3RlckxheW91dCIsImF0dGVuZGFuY2UiLCJsb2FkVmlldyIsImxvYWRBdHRlbmRhbmNlUmVnaXN0ZXIiLCJncm91cCIsInVzZXIiLCJkaXNwbGF5RGF0ZSIsImF0dGVuZGFuY2VSZWdpc3RlciIsIm5hdmlnYXRlVG9TZWN0aW9uIiwidW5kZWZpbmVkIiwibG9hZFVzZXJBdHRlbmRhbmNlUmVwb3J0IiwibmF2aWdhdGVUb1VzZXJSZXBvcnQiLCJsb2FkQ29uc29sZSIsImlkIiwibW9kYWxDb250ZXh0IiwibG9hZEJvb2siLCJib29rIiwicGFyYW1zIiwid2luZG93IiwibG9jYXRpb24iLCJoYXNoIiwibG9hZExlYXJuaW5nUGF0aCIsImxlYXJuaW5nUGF0aCIsImxvYWRNYXJrcyIsImFzc2Vzc21lbnRJRCIsImluc3RhbmNlSUQiLCJzdWJtaXNzaW9uSUQiLCJtYXJrcyIsImxvYWRTdHVkZW50TWFya3MiLCJsb2FkR3JvdXBNYXJr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QUFuQjtBQUNBO0FBL0ljLEVBQWhCO0FBaUpBLENBbEpEIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcblxuY29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuXG5jb25zdCBBdHRlbmRhbmNlTGF5b3V0ID0gcmVxdWlyZShcIi4vdmlld3MvYXR0ZW5kYW5jZS9sYXlvdXRcIik7XG5jb25zdCBDb25zb2xlID0gcmVxdWlyZShcIi4vdmlld3MvY29uc29sZS9pbmRleFwiKTtcbmNvbnN0IENhbGVuZGFyID0gcmVxdWlyZShcIi4vdmlld3MvY2FsZW5kYXJcIik7XG5jb25zdCBNYXJrcyA9IHJlcXVpcmUoXCIuL3ZpZXdzL21hcmtzXCIpO1xuY29uc3QgU3R1ZGVudE1hcmtzID0gcmVxdWlyZShcIi4vdmlld3Mvc3R1ZGVudE1hcmtzXCIpO1xuY29uc3QgR3JvdXBNYXJrcyA9IHJlcXVpcmUoXCIuL3ZpZXdzL2dyb3VwTWFya3NcIik7XG5jb25zdCBUYWdzID0gcmVxdWlyZShcIi4vdmlld3MvdGFnc1wiKTtcbmNvbnN0IENBTSA9IHJlcXVpcmUoXCIuL3ZpZXdzL2NhbVwiKTtcblxuY29uc3QgTW9kdWxlID0gbW9kdWxlLmV4cG9ydHMgPSBuZXcgQmFja2JvbmUuTWFyaW9uZXR0ZS5BcHBsaWNhdGlvbigpO1xuXG5jb25zdCByYWRpbyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJnbG9iYWxcIik7XG5cbk1vZHVsZS5WaWV3cyA9IHt9O1xuXG5jb25zdCBjb25zb2xlQ29tbW9uID0gZnVuY3Rpb24oQXBwLCBmaWxsZXIpIHtcblx0aWYgKCFNb2R1bGUuVmlld3MuZWR1Q29uc29sZSlcblx0XHRNb2R1bGUuVmlld3MuZWR1Q29uc29sZSA9IG5ldyBDb25zb2xlKCk7XG5cblx0aWYgKEFwcC5nZXRSZWdpb24oKS5jdXJyZW50VmlldyAhPT0gTW9kdWxlLlZpZXdzLmVkdUNvbnNvbGUpIHtcblx0XHRBcHAuZ2V0UmVnaW9uKCkuc2hvdyhNb2R1bGUuVmlld3MuZWR1Q29uc29sZSk7XG5cblx0XHQvLyBEZXN0cm95IHRoZSBzZW1pLXBlcnNpc3RlbnQgdmlldyBpZiB3ZSBnbyBlbHNld2hlcmVcblx0XHRBcHAuZ2V0UmVnaW9uKCkub25jZShcImJlZm9yZTpzd2FwIGJlZm9yZTplbXB0eVwiLCAoKSA9PiB7XG5cdFx0XHRpZiAoTW9kdWxlLlZpZXdzLmVkdUNvbnNvbGUpIHtcblx0XHRcdFx0TW9kdWxlLlZpZXdzLmVkdUNvbnNvbGUuZGVzdHJveSgpO1xuXHRcdFx0XHRkZWxldGUgTW9kdWxlLlZpZXdzLmVkdUNvbnNvbGU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRmaWxsZXIoKTtcbn07XG5cbi8vIEFkZCBpbnRyYS1tb2R1bGUgcm91dGluZ1xuTW9kdWxlLnJvdXRpbmcgPSBBcHAgPT4ge1xuXHRNb2R1bGUuUm91dGVyID0ge1xuXHRcdHJvdXRlczoge1xuXHRcdFx0XCJcIjogXCJuYXZpZ2F0ZVRvQm9va1NlbGVjdG9yXCIsXG5cdFx0XHRcImF0dGVuZGFuY2UvcmVnaXN0ZXIoLzpncm91cCkoLzp1c2VyKSgvOmRpc3BsYXlEYXRlKSgvOmF0dGVuZGFuY2VSZWdpc3RlcilcIjogXCJsb2FkQXR0ZW5kYW5jZVJlZ2lzdGVyXCIsXG5cdFx0XHRcImF0dGVuZGFuY2UvcmVwb3J0L3VzZXIoLzpncm91cCkoLzp1c2VyKVwiOiBcImxvYWRVc2VyQXR0ZW5kYW5jZVJlcG9ydFwiLFxuXHRcdFx0XCJib29rcygvOmJvb2spKC8qcGF0aClcIjogXCJsb2FkQm9va1wiLFxuXHRcdFx0XCJtYXJrcygvOmFzc2Vzc21lbnQpKC86aW5zdGFuY2UpKC86c3VibWlzc2lvbilcIjogXCJsb2FkTWFya3NcIixcblx0XHRcdFwiZ3JvdXBzKC86Z3JvdXApXCI6IFwibG9hZExlYXJuaW5nUGF0aFwiLFxuXHRcdFx0XCJsZWFybmluZ1BhdGhzKC86bGVhcm5pbmdQYXRoKSgvKnBhdGgpXCI6IFwibG9hZExlYXJuaW5nUGF0aFwiLFxuXHRcdFx0XCJzdHVkZW50L21hcmtzXCI6IFwibG9hZFN0dWRlbnRNYXJrc1wiLFxuXHRcdFx0XCJncm91cC9tYXJrc1wiOiBcImxvYWRHcm91cE1hcmtzXCIsXG5cdFx0XHRjYWxlbmRhcjogXCJjYWxlbmRhclwiLFxuXHRcdFx0XCJ0YWdzKC86bGVhcm5pbmdQYXRoKVwiOiBcImxvYWRUYWdzXCIsXG5cdFx0XHRjYW06IFwibG9hZENBTVwiLFxuXG5cdFx0XHRcIi4qXCI6IFwiY2F0Y2hBbGxcIixcblx0XHR9LFxuXG5cdFx0bmF2aWdhdGVUb0Jvb2tTZWxlY3RvcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuTmF2aWdhdGUsIHNldHRpbmdzLnVybFJvb3QgKyBcIi9jb25zb2xlL2Jvb2tzXCIpO1xuXHRcdH0sXG5cblx0XHRsb2FkQXR0ZW5kYW5jZVJlZ2lzdGVyTGF5b3V0OiBmdW5jdGlvbigpIHtcblx0XHRcdGlmICghTW9kdWxlLlZpZXdzLmF0dGVuZGFuY2UpXG5cdFx0XHRcdE1vZHVsZS5WaWV3cy5hdHRlbmRhbmNlID0gbmV3IEF0dGVuZGFuY2VMYXlvdXQoKTtcblxuXHRcdFx0aWYgKEFwcC5nZXRSZWdpb24oKS5jdXJyZW50VmlldyAhPT0gTW9kdWxlLlZpZXdzLmF0dGVuZGFuY2UpXG5cdFx0XHRcdEFwcC5sb2FkVmlldyhNb2R1bGUuVmlld3MuYXR0ZW5kYW5jZSk7XG5cblx0XHRcdEFwcC5nZXRSZWdpb24oKS5vbmNlKFwiYmVmb3JlOnN3YXAgYmVmb3JlOmVtcHR5XCIsICgpID0+IHtcblx0XHRcdFx0aWYgKE1vZHVsZS5WaWV3cy5hdHRlbmRhbmNlKSB7XG5cdFx0XHRcdFx0TW9kdWxlLlZpZXdzLmF0dGVuZGFuY2UuZGVzdHJveSgpO1xuXHRcdFx0XHRcdGRlbGV0ZSBNb2R1bGUuVmlld3MuYXR0ZW5kYW5jZTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSxcblxuXHRcdGxvYWRBdHRlbmRhbmNlUmVnaXN0ZXI6IGZ1bmN0aW9uKGdyb3VwLCB1c2VyLCBkaXNwbGF5RGF0ZSwgYXR0ZW5kYW5jZVJlZ2lzdGVyKSB7XG5cdFx0XHRNb2R1bGUuUm91dGVyLmxvYWRBdHRlbmRhbmNlUmVnaXN0ZXJMYXlvdXQoKTtcblxuXHRcdFx0TW9kdWxlLlZpZXdzLmF0dGVuZGFuY2UubmF2aWdhdGVUb1NlY3Rpb24oe1xuXHRcdFx0XHRncm91cDogZ3JvdXAgfHwgdW5kZWZpbmVkLFxuXHRcdFx0XHR1c2VyOiB1c2VyIHx8IHVuZGVmaW5lZCxcblx0XHRcdFx0ZGlzcGxheURhdGU6IGRpc3BsYXlEYXRlIHx8IHVuZGVmaW5lZCxcblx0XHRcdFx0YXR0ZW5kYW5jZVJlZ2lzdGVyOiBhdHRlbmRhbmNlUmVnaXN0ZXIgfHwgdW5kZWZpbmVkLFxuXHRcdFx0fSk7XG5cdFx0fSxcblxuXHRcdGxvYWRVc2VyQXR0ZW5kYW5jZVJlcG9ydDogZnVuY3Rpb24oZ3JvdXAsIHVzZXIpIHtcblx0XHRcdE1vZHVsZS5Sb3V0ZXIubG9hZEF0dGVuZGFuY2VSZWdpc3RlckxheW91dCgpO1xuXG5cdFx0XHRNb2R1bGUuVmlld3MuYXR0ZW5kYW5jZS5uYXZpZ2F0ZVRvVXNlclJlcG9ydCh7XG5cdFx0XHRcdGdyb3VwOiBncm91cCxcblx0XHRcdFx0dXNlcjogdXNlcixcblx0XHRcdH0pO1xuXHRcdH0sXG5cblx0XHRsb2FkQ29uc29sZTogZnVuY3Rpb24oaWQpIHtcblx0XHRcdEFwcC5tb2RhbENvbnRleHQgPSBcIiNsaW5rLXJlc291cmNlc1wiO1xuXG5cdFx0XHRpZiAoaWQpIHtcblx0XHRcdFx0Y29uc29sZUNvbW1vbihBcHAsICgpID0+IHtcblx0XHRcdFx0XHRNb2R1bGUuVmlld3MuZWR1Q29uc29sZS5sb2FkQ29uc29sZShpZCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0ZSwgc2V0dGluZ3MudXJsUm9vdCk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGxvYWRCb29rOiBmdW5jdGlvbihib29rLCBwYXJhbXMpIHtcblx0XHRcdEFwcC5tb2RhbENvbnRleHQgPSBcIiNsaW5rLXJlc291cmNlc1wiO1xuXG5cdFx0XHRpZiAoYm9vaykge1xuXHRcdFx0XHRjb25zb2xlQ29tbW9uKEFwcCwgKCkgPT4ge1xuXHRcdFx0XHRcdE1vZHVsZS5WaWV3cy5lZHVDb25zb2xlLmxvYWRCb29rKGJvb2ssIHBhcmFtcyB8fCBcIlwiLCB3aW5kb3cubG9jYXRpb24uaGFzaCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdGNvbnNvbGVDb21tb24oQXBwLCAoKSA9PiB7XG5cdFx0XHRcdFx0TW9kdWxlLlZpZXdzLmVkdUNvbnNvbGUubG9hZENvbnNvbGUoXCJib29rc1wiKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGxvYWRMZWFybmluZ1BhdGg6IGZ1bmN0aW9uKGxlYXJuaW5nUGF0aCwgcGFyYW1zKSB7XG5cdFx0XHRBcHAubW9kYWxDb250ZXh0ID0gXCIjbGluay1yZXNvdXJjZXNcIjtcblxuXHRcdFx0aWYgKGxlYXJuaW5nUGF0aCkge1xuXHRcdFx0XHRjb25zb2xlQ29tbW9uKEFwcCwgKCkgPT4ge1xuXHRcdFx0XHRcdE1vZHVsZS5WaWV3cy5lZHVDb25zb2xlLmxvYWRMZWFybmluZ1BhdGgobGVhcm5pbmdQYXRoLCBwYXJhbXMpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRjb25zb2xlQ29tbW9uKEFwcCwgKCkgPT4ge1xuXHRcdFx0XHRcdE1vZHVsZS5WaWV3cy5lZHVDb25zb2xlLmxvYWRDb25zb2xlKFwibGVhcm5pbmctcGF0aHNcIik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRjYWxlbmRhcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRBcHAubG9hZFZpZXcobmV3IENhbGVuZGFyKCkpO1xuXHRcdH0sXG5cblx0XHRsb2FkTWFya3M6IGZ1bmN0aW9uKGFzc2Vzc21lbnRJRCwgaW5zdGFuY2VJRCwgc3VibWlzc2lvbklEKSB7XG5cdFx0XHRpZiAoIU1vZHVsZS5WaWV3cy5tYXJrcylcblx0XHRcdFx0TW9kdWxlLlZpZXdzLm1hcmtzID0gbmV3IE1hcmtzKCk7XG5cblx0XHRcdGlmIChBcHAuZ2V0UmVnaW9uKCkuY3VycmVudFZpZXcgIT09IE1vZHVsZS5WaWV3cy5tYXJrcylcblx0XHRcdFx0QXBwLmxvYWRWaWV3KE1vZHVsZS5WaWV3cy5tYXJrcyk7XG5cblx0XHRcdE1vZHVsZS5WaWV3cy5tYXJrcy5uYXZpZ2F0ZVRvU2VjdGlvbih7XG5cdFx0XHRcdGFzc2Vzc21lbnRJRDogYXNzZXNzbWVudElELFxuXHRcdFx0XHRpbnN0YW5jZUlEOiBpbnN0YW5jZUlELFxuXHRcdFx0XHRzdWJtaXNzaW9uSUQ6IHN1Ym1pc3Npb25JRCxcblx0XHRcdH0pO1xuXG5cdFx0XHRBcHAuZ2V0UmVnaW9uKCkub25jZShcImJlZm9yZTpzd2FwIGJlZm9yZTplbXB0eVwiLCAoKSA9PiB7XG5cdFx0XHRcdGlmIChNb2R1bGUuVmlld3MubWFya3MpIHtcblx0XHRcdFx0XHRNb2R1bGUuVmlld3MubWFya3MuZGVzdHJveSgpO1xuXHRcdFx0XHRcdGRlbGV0ZSBNb2R1bGUuVmlld3MubWFya3M7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0sXG5cblx0XHRsb2FkU3R1ZGVudE1hcmtzOiBmdW5jdGlvbigpIHtcblx0XHRcdEFwcC5sb2FkVmlldyhuZXcgU3R1ZGVudE1hcmtzKCkpO1xuXHRcdH0sXG5cblx0XHRsb2FkR3JvdXBNYXJrczogZnVuY3Rpb24oKSB7XG5cdFx0XHRBcHAubG9hZFZpZXcobmV3IEdyb3VwTWFya3MoKSk7XG5cdFx0fSxcblxuXHRcdGxvYWRUYWdzOiBmdW5jdGlvbihsZWFybmluZ1BhdGgpIHtcblx0XHRcdEFwcC5sb2FkVmlldyhuZXcgVGFncyh7IGxlYXJuaW5nUGF0aDogbGVhcm5pbmdQYXRoIH0pKTtcblx0XHR9LFxuXG5cdFx0bG9hZENBTTogZnVuY3Rpb24oKSB7XG5cdFx0XHRBcHAubG9hZFZpZXcobmV3IENBTSgpKTtcblx0XHR9LFxuXG5cdFx0Y2F0Y2hBbGw6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dGhpcy5uYXZpZ2F0ZShcIi9cIiwgeyB0cmlnZ2VyOiB0cnVlLCByZXBsYWNlOiB0cnVlIH0pO1xuXHRcdH0sXG5cdH07XG59OyJdfQ==",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\n\nvar settings = require(\"app-settings\");\n\nmodule.exports = Backbone.Model.extend({\n\tdefaults: {\n\t\tcreated: moment().unix()\n\t},\n\n\tidAttribute: \"_id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/attendance/records\";\n\t},\n\n\tcomputeds: {\n\t\tuserRole: function userRole() {\n\t\t\tvar role = \"\";\n\n\t\t\tif (this.has(\"roles\")) {\n\t\t\t\tvar roles = this.get(\"roles\");\n\n\t\t\t\tif (_.includes(roles, \"student\")) role = \"Student\";else if (_.includes(roles, \"teacher\")) role = \"Teacher\";\n\t\t\t}\n\n\t\t\treturn role;\n\t\t}\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImF0dGVuZGFuY2VSZWNvcmRNb2RlbC5qcyJdLCJuYW1lcyI6WyJfIiwicmVxdWlyZSIsIkJhY2tib25lIiwibW9tZW50Iiwic2V0dGluZ3MiLCJtb2R1bGUiLCJleHBvcnRzIiwiTW9kZWwiLCJleHRlbmQiLCJkZWZhdWx0cyIsImNyZWF0ZWQiLCJ1bml4IiwiaWRBdHRyaWJ1dGUiLCJ1cmxSb290IiwiY29tcHV0ZWRzIiwidXNlclJvbGUiLCJyb2xlIiwiaGFzIiwicm9sZXMiLCJnZXQiLCJpbmNsdWRlcyJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsSUFBSUMsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNQyxXQUFXRCxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNRSxTQUFTRixRQUFRLFFBQVIsQ0FBZjs7QUFFQSxJQUFNRyxXQUFXSCxRQUFRLGNBQVIsQ0FBakI7O0FBRUFJLE9BQU9DLE9BQVAsR0FBaUJKLFNBQVNLLEtBQVQsQ0FBZUMsTUFBZixDQUFzQjtBQUN0Q0MsV0FBVTtBQUNUQyxXQUFTUCxTQUFTUSxJQUFUO0FBREEsRUFENEI7O0FBS3RDQyxjQUFhLEtBTHlCOztBQU90Q0MsVUFBUyxtQkFBVztBQUNuQixTQUFPVCxTQUFTUyxPQUFULEdBQW1CLDZCQUExQjtBQUNBLEVBVHFDOztBQVd0Q0MsWUFBVztBQUNWQyxZQUFVLG9CQUFXO0FBQ3BCLE9BQUlDLE9BQU8sRUFBWDs7QUFFQSxPQUFJLEtBQUtDLEdBQUwsQ0FBUyxPQUFULENBQUosRUFBdUI7QUFDdEIsUUFBTUMsUUFBUSxLQUFLQyxHQUFMLENBQVMsT0FBVCxDQUFkOztBQUVBLFFBQUluQixFQUFFb0IsUUFBRixDQUFXRixLQUFYLEVBQWtCLFNBQWxCLENBQUosRUFDQ0YsT0FBTyxTQUFQLENBREQsS0FFSyxJQUFJaEIsRUFBRW9CLFFBQUYsQ0FBV0YsS0FBWCxFQUFrQixTQUFsQixDQUFKLEVBQ0pGLE9BQU8sU0FBUDtBQUNEOztBQUVELFVBQU9BLElBQVA7QUFDQTtBQWRTO0FBWDJCLENBQXRCLENBQWpCIiwiZmlsZSI6ImF0dGVuZGFuY2VSZWNvcmRNb2RlbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IG1vbWVudCA9IHJlcXVpcmUoXCJtb21lbnRcIik7XG5cbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5Nb2RlbC5leHRlbmQoe1xuXHRkZWZhdWx0czoge1xuXHRcdGNyZWF0ZWQ6IG1vbWVudCgpLnVuaXgoKSxcblx0fSxcblxuXHRpZEF0dHJpYnV0ZTogXCJfaWRcIixcblxuXHR1cmxSb290OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvYXR0ZW5kYW5jZS9yZWNvcmRzXCI7XG5cdH0sXG5cblx0Y29tcHV0ZWRzOiB7XG5cdFx0dXNlclJvbGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0bGV0IHJvbGUgPSBcIlwiO1xuXG5cdFx0XHRpZiAodGhpcy5oYXMoXCJyb2xlc1wiKSkge1xuXHRcdFx0XHRjb25zdCByb2xlcyA9IHRoaXMuZ2V0KFwicm9sZXNcIik7XG5cblx0XHRcdFx0aWYgKF8uaW5jbHVkZXMocm9sZXMsIFwic3R1ZGVudFwiKSlcblx0XHRcdFx0XHRyb2xlID0gXCJTdHVkZW50XCI7XG5cdFx0XHRcdGVsc2UgaWYgKF8uaW5jbHVkZXMocm9sZXMsIFwidGVhY2hlclwiKSlcblx0XHRcdFx0XHRyb2xlID0gXCJUZWFjaGVyXCI7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByb2xlO1xuXHRcdH0sXG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\n\nvar settings = require(\"app-settings\");\n\nmodule.exports = Backbone.Model.extend({\n\tdefaults: {\n\t\tcreated: moment().unix()\n\t},\n\n\tidAttribute: \"register_id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/attendance/registers\";\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImF0dGVuZGFuY2VSZWdpc3Rlck1vZGVsLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIm1vbWVudCIsInNldHRpbmdzIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1vZGVsIiwiZXh0ZW5kIiwiZGVmYXVsdHMiLCJjcmVhdGVkIiwidW5peCIsImlkQXR0cmlidXRlIiwidXJsUm9vdCJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUMsU0FBU0QsUUFBUSxRQUFSLENBQWY7O0FBRUEsSUFBTUUsV0FBV0YsUUFBUSxjQUFSLENBQWpCOztBQUVBRyxPQUFPQyxPQUFQLEdBQWlCTCxTQUFTTSxLQUFULENBQWVDLE1BQWYsQ0FBc0I7QUFDdENDLFdBQVU7QUFDVEMsV0FBU1AsU0FBU1EsSUFBVDtBQURBLEVBRDRCOztBQUt0Q0MsY0FBYSxhQUx5Qjs7QUFPdENDLFVBQVMsbUJBQVc7QUFDbkIsU0FBT1QsU0FBU1MsT0FBVCxHQUFtQiwrQkFBMUI7QUFDQTtBQVRxQyxDQUF0QixDQUFqQiIsImZpbGUiOiJhdHRlbmRhbmNlUmVnaXN0ZXJNb2RlbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCBtb21lbnQgPSByZXF1aXJlKFwibW9tZW50XCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHtcblx0XHRjcmVhdGVkOiBtb21lbnQoKS51bml4KCksXG5cdH0sXG5cblx0aWRBdHRyaWJ1dGU6IFwicmVnaXN0ZXJfaWRcIixcblxuXHR1cmxSb290OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvYXR0ZW5kYW5jZS9yZWdpc3RlcnNcIjtcblx0fSxcbn0pO1xuIl19",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\";\noutput += \"\\n\";\noutput += \"\\n<div class=\\\"header-region\\\">\\n</div>\\n\\n<div class=\\\"body-region\\\">\\n</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar layout_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"grid-header\\\">\\n\\t\\t<div class=\\\"grid-filter-container\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"grid-counter-container\\\">\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"grid-container\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"grid-navigator-container\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar layout_oldRoot = layout_obj.root;\nlayout_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlayout_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"layout\": new nunjucks.Template( {obj: layout_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar navigator_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"navigator-button button-delete-register\\\">\\n\\t\\t<span class=\\\"glyph fal fa-times-circle\\\" />\\n\\t</div>\\n\\n\\t<div class=\\\"navigator-button button-mark-all-present\\\">\\n\\t\\t<span class=\\\"glyph fas fa-circle\\\" />\\n\\t</div>\\n\\n\\t<div class=\\\"navigator-button button-mark-all-late\\\">\\n\\t\\t<span class=\\\"glyph fal fa-dot-circle\\\" />\\n\\t</div>\\n\\n\\t<div class=\\\"navigator-button button-mark-all-absent\\\">\\n\\t\\t<span class=\\\"glyph fal fa-circle\\\" />\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar navigator_oldRoot = navigator_obj.root;\nnavigator_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tnavigator_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar layout_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"sub-header-title-container\\\">\\n\\t\\t<span class=\\\"sub-header-title\\\">Attendance for: \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"name\"), env.opts.autoescape);\noutput += \"</span>\\n\\t</div>\\n\\n\\t<div class=\\\"date-container\\\">\\n\\t\\t<span class=\\\"attendance-register-date\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"formatDateShort\").call(context, runtime.contextOrFrameLookup(context, frame, \"created\")), env.opts.autoescape);\noutput += \"</span>\\n\\t</div>\\n\\n\\t<div class=\\\"navigator-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar layout_oldRoot = layout_obj.root;\nlayout_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlayout_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"navigator\": new nunjucks.Template( {obj: navigator_obj, type: \"code\"}, env),\t\"layout\": new nunjucks.Template( {obj: layout_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar blank_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span>Select a <strong>group</strong>\";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"isAdminUser\")?\" and a <strong>user</strong> \":\" \"), env.opts.autoescape);\noutput += \"from the list above to begin taking roll call.</span>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar blank_oldRoot = blank_obj.root;\nblank_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tblank_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar calendar_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"content-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar calendar_oldRoot = calendar_obj.root;\ncalendar_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcalendar_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"blank\": new nunjucks.Template( {obj: blank_obj, type: \"code\"}, env),\t\"calendar\": new nunjucks.Template( {obj: calendar_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar navigator_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n<!--\\t<div class=\\\"navigator-button button-report-by-date\\\">\\n\\t\\t<span class=\\\"glyph fal fa-check-circle\\\" />\\n\\t</div>\\n\\n\\t<div class=\\\"navigator-button button-report-by-user\\\">\\n\\t\\t<span class=\\\"glyph fal fa-user-circle\\\" />\\n\\t</div> -->\\n\\n\\t<div class=\\\"navigator-button button-download-report\\\">\\n\\t\\t<span class=\\\"glyph fal fa-arrow-circle-down\\\" />\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar navigator_oldRoot = navigator_obj.root;\nnavigator_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tnavigator_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar layout_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"sub-header-title-container\\\">\\n\\t\\t<div class=\\\"switch-region\\\">\\n\\t\\t</div>\\n\\t\\t<span class=\\\"sub-header-title\\\">&nbsp;for&nbsp;group\";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"isAdminUser\")?\"&nbsp;and&nbsp;owner\":\"\"), env.opts.autoescape);\noutput += \"</span>\\n\\t</div>\\n\\n\\t<div class=\\\"group-selector-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"user-selector-region \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"isAdminUser\")?\"region-disabled\":\"hide\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"navigator-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar layout_oldRoot = layout_obj.root;\nlayout_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlayout_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"navigator\": new nunjucks.Template( {obj: navigator_obj, type: \"code\"}, env),\t\"layout\": new nunjucks.Template( {obj: layout_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar blank_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span>Select a <strong>group</strong>\";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"isAdminUser\")?\" and a <strong>user</strong> \":\" \"), env.opts.autoescape);\noutput += \"from the list above to view a report.</span>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar blank_oldRoot = blank_obj.root;\nblank_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tblank_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar userSelector_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<p>Choose a student to display attendance details:</p>\\n\\n\\t<select name=\\\"users\\\" data-placeholder=\\\"Select a student...\\\">\\n\\t</select>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar userSelector_oldRoot = userSelector_obj.root;\nuserSelector_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tuserSelector_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar userAttendance_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"attendance-calendar-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar userAttendance_oldRoot = userAttendance_obj.root;\nuserAttendance_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tuserAttendance_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar userStatistics_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"chart-container\\\">\\n\\t\\t<canvas class=\\\"attendance-chart\\\">\\n\\t\\t</canvas>\\n\\n\\t\\t<div class=\\\"chart-number-container\\\">\\n\\t\\t\\t<div class=\\\"chart-number-label\\\">\\n\\t\\t\\t\\t<div class=\\\"chart-legend-container\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"chart-legend chart-legend-present\\\"></div>\\n\\t\\t\\t\\t\\t<span>&nbsp;Present</span>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t<span class=\\\"days-present\\\"></span>\\n\\t\\t\\t\\t<span class=\\\"proportion-present\\\"></span>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"chart-number-label\\\">\\n\\t\\t\\t\\t<div class=\\\"chart-legend-container\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"chart-legend chart-legend-absent\\\"></div>\\n\\t\\t\\t\\t\\t<span>&nbsp;Absent</span>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t<span class=\\\"days-absent\\\"></span>\\n\\t\\t\\t\\t<span class=\\\"proportion-absent\\\"></span>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"chart-number-label\\\">\\n\\t\\t\\t\\t<div class=\\\"chart-legend-container\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"chart-legend chart-legend-late\\\"></div>\\n\\t\\t\\t\\t\\t<span>&nbsp;Late</span>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t<span class=\\\"days-late\\\"></span>\\n\\t\\t\\t\\t<span class=\\\"proportion-late\\\"></span>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar userStatistics_oldRoot = userStatistics_obj.root;\nuserStatistics_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tuserStatistics_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar reportLayout_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"glyph-panel user-panel\\\">\\n\\t\\t<div class=\\\"glyph-background user-panel-glyph-background\\\">\\n\\t\\t\\t<div class=\\\"glyph-border\\\">\\n\\t\\t\\t\\t<span class=\\\"fal fa-universal-access user-panel-glyph\\\" />\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"user-selector-region\\\">\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"glyph-panel statistics-panel hide\\\">\\n\\t\\t<div class=\\\"glyph-background statistics-panel-glyph-background\\\">\\n\\t\\t\\t<div class=\\\"glyph-border\\\">\\n\\t\\t\\t\\t<span class=\\\"fal fa-hourglass-half statistics-panel-glyph\\\" />\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"user-statistics-region\\\">\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"glyph-panel calendar-panel hide\\\">\\n\\t\\t<div class=\\\"glyph-background calendar-panel-glyph-background\\\">\\n\\t\\t\\t<div class=\\\"glyph-border\\\">\\n\\t\\t\\t\\t<span class=\\\"fal fa-calendar calendar-panel-glyph\\\" />\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"user-attendance-region\\\">\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar reportLayout_oldRoot = reportLayout_obj.root;\nreportLayout_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\treportLayout_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar console_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"header-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"body-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar console_oldRoot = console_obj.root;\nconsole_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tconsole_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"blank\": new nunjucks.Template( {obj: blank_obj, type: \"code\"}, env),\t\"userSelector\": new nunjucks.Template( {obj: userSelector_obj, type: \"code\"}, env),\t\"userAttendance\": new nunjucks.Template( {obj: userAttendance_obj, type: \"code\"}, env),\t\"userStatistics\": new nunjucks.Template( {obj: userStatistics_obj, type: \"code\"}, env),\t\"reportLayout\": new nunjucks.Template( {obj: reportLayout_obj, type: \"code\"}, env),\t\"console\": new nunjucks.Template( {obj: console_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar calendarHeader_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"calendar-navigation-controls-left\\\">\\n\\t\\t<div class=\\\"calendar-button enabled\\\" id=\\\"back\\\" title=\\\"Back\\\">\\n\\t\\t\\t<span class=\\\"fal fa-angle-left\\\"></span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"calendar-button enabled\\\" id=\\\"forward\\\" title=\\\"Forward\\\">\\n\\t\\t\\t<span class=\\\"fal fa-angle-right\\\"></span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"calendar-button enabled soft\\\" id=\\\"today\\\" title=\\\"Today\\\">\\n\\t\\t\\t<span>Today</span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"calendar-filter-region\\\">\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"calendar-title\\\">\\n\\t\\t<span></span>\\n\\t</div>\\n\\n\\t<div class=\\\"calendar-navigation-controls-right\\\">\\n\\t\\t<div class=\\\"calendar-button enabled soft\\\" id=\\\"month\\\" title=\\\"Month View\\\">\\n\\t\\t\\t<span class=\\\"\\\">month</span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"calendar-button enabled soft\\\" id=\\\"week\\\" title=\\\"Week View\\\">\\n\\t\\t\\t<span class=\\\"\\\">week</span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"calendar-button enabled soft\\\" id=\\\"day\\\" title=\\\"Day View\\\">\\n\\t\\t\\t<span class=\\\"\\\">day</span>\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar calendarHeader_oldRoot = calendarHeader_obj.root;\ncalendarHeader_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcalendarHeader_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar layout_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"calendar-header-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"status-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"calendar-body-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar layout_oldRoot = layout_obj.root;\nlayout_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlayout_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"calendarHeader\": new nunjucks.Template( {obj: calendarHeader_obj, type: \"code\"}, env),\t\"layout\": new nunjucks.Template( {obj: layout_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar layout_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"cam-user-selector-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar layout_oldRoot = layout_obj.root;\nlayout_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlayout_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar camUserSelector_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"header\\\">\\n\\t\\t<h4 class=\\\"title left\\\"><span class=\\\"fal fa-chart-bar\\\"/>&nbsp;Classroom Activity Monitor&nbsp;<span class=\\\"item-id\\\"></span></h4>\\n\\t</div>\\n\\t<div class=\\\"top-bar\\\">\\n\\t\\t<div class=\\\"filters\\\">\\n\\t\\t\\t<div class=\\\"filter-option\\\">\\n\\t\\t\\t\\t<span class=\\\"filter-label\\\">Group(s)&nbsp;to&nbsp;monitor&nbsp;&nbsp;</span>\\n\\t\\t\\t\\t<div class=\\\"groups-container\\\">\\n\\t\\t\\t\\t\\t<select name=\\\"groups\\\" data-placeholder=\\\"Groups...\\\"></select>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t\\t<div class=\\\"filter-option\\\">\\n\\t\\t\\t\\t<div class=\\\"cam-flipswitch\\\">\\n\\t\\t\\t\\t\\t<span>In&nbsp;Group&nbsp;&nbsp;&nbsp;&nbsp;</span>\\n\\t\\t\\t\\t\\t<div class=\\\"flipswitch\\\">\\n\\t\\t\\t\\t\\t\\t<input type=\\\"checkbox\\\" name=\\\"monitor_books\\\" class=\\\"flipswitch-cb\\\" id=\\\"fs\\\">\\n\\t\\t\\t\\t\\t\\t<label class=\\\"flipswitch-label\\\" for=\\\"fs\\\">\\n\\t\\t\\t\\t\\t\\t\\t<div class=\\\"flipswitch-inner\\\"></div>\\n\\t\\t\\t\\t\\t\\t\\t<div class=\\\"flipswitch-switch\\\"></div>\\n\\t\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t\\t<span>&nbsp;&nbsp;&nbsp;&nbsp;In&nbsp;Book&nbsp;&nbsp;&nbsp;&nbsp;</span>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t<div class=\\\"books-container hide\\\">\\n\\t\\t\\t\\t\\t<select name=\\\"books\\\" data-placeholder=\\\"Books...\\\"></select>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"actions\\\">\\n\\t\\t\\t<button type=\\\"button\\\" class=\\\"button success btn-monitor\\\">\\n\\t\\t\\t\\t<div class=\\\"monitor-text\\\"><span class=\\\"fal fa-eye\\\"/> Monitor</div>\\n\\t\\t\\t\\t<div class=\\\"restart-text hide\\\"><span class=\\\"fal fa-times\\\"/> Stop Monitoring</div>\\n\\t\\t\\t</button>\\n\\t\\t\\t<div class=\\\"session-time-container\\\">Session&nbsp;time:&nbsp;<span class=\\\"session-time\\\">00:00:00</span></div>\\n\\t\\t</div>\\n\\t</div>\\n\\t<div class=\\\"cam-body hide\\\">\\n\\t\\t<div class=\\\"status-map connection-lost hide\\\">\\n\\t\\t\\t<div class=\\\"status\\\"><div class=\\\"status-color status-red\\\"></div>Connection Lost<div class=\\\"status-color status-red\\\"></div></div>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"cam-user-filter-region\\\">\\n\\t\\t\\t<div class=\\\"filters\\\">\\n\\t\\t\\t\\t<div class=\\\"text-filter-container\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"fal fa-search\\\"></div>\\n\\t\\t\\t\\t\\t<input type=\\\"text\\\" class=\\\"text-filter-input\\\" placeholder=\\\"Search\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"fal fa-times hide clear-search\\\"></div>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t\\t<div class=\\\"status-map\\\">\\n\\t\\t\\t\\t<div class=\\\"status filter-option selected-status status-filter-0\\\" data-status=\\\"0\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"status-color status-red\\\"><span class=\\\"tick fas fa-check\\\"/></div>Not&nbsp;in&nbsp;<span class=\\\"filter-type\\\"></span>&nbsp;<span class=\\\"status-percentage\\\"></span>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t<div class=\\\"status filter-option selected-status status-filter-1\\\" data-status=\\\"1\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"status-color status-orange\\\"><span class=\\\"tick fas fa-check\\\"/></div>In&nbsp;<span class=\\\"filter-type\\\"></span>,&nbsp;but&nbsp;exited&nbsp;<span class=\\\"filter-type\\\"></span>&nbsp;at&nbsp;least&nbsp;once&nbsp;during&nbsp;session&nbsp;<span class=\\\"status-percentage\\\"></span>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t<div class=\\\"status filter-option selected-status status-filter-2\\\" data-status=\\\"2\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"status-color status-green\\\"><span class=\\\"tick fas fa-check\\\"/></div>In&nbsp;<span class=\\\"filter-type\\\"></span>&nbsp;<span class=\\\"status-percentage\\\"></span>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t\\t<div class=\\\"counter\\\"></div>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"overlay\\\"></div>\\n\\n\\t\\t<div class=\\\"cam-user-grid-region grid0\\\"></div>\\n\\t\\t<div class=\\\"cam-user-grid-region grid1\\\"></div>\\n\\t\\t<div class=\\\"cam-user-grid-region grid2\\\"></div>\\n\\t</div>\\n\\t<div class=\\\"cam-user-timeline-region hide\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar camUserSelector_oldRoot = camUserSelector_obj.root;\ncamUserSelector_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcamUserSelector_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar userView_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div title=\\\"Click to view timeline\\\">\\n\\t\\t<span class=\\\"fas fa-\";\noutput += runtime.suppressValue((lineno = 2, colno = 33, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"userStatus\"), \"userStatus\", context, [runtime.contextOrFrameLookup(context, frame, \"status\")])), env.opts.autoescape);\noutput += \" user-status\\\"></span>\\n\\t\\t<div class=\\\"name-container\\\" title=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"firstname\") + \" \" + env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"surname\")), env.opts.autoescape);\noutput += \"\\\" >\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"firstname\") + \" \" + env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"surname\")), env.opts.autoescape);\noutput += \"</div>\\t\\t\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar userView_oldRoot = userView_obj.root;\nuserView_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tuserView_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar timeline_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"timeline-header\\\">\\n\\t\\t<div class=\\\"left-side\\\">\\n\\t\\t\\t<button type=\\\"button\\\" class=\\\"button primary btn-back left\\\">\\n\\t\\t\\t\\t<div class=\\\"monitor-text\\\"><span class=\\\"fal fa-chevron-left\\\"/> Back</div>\\n\\t\\t\\t</button>\\n\\t\\t\\t<h4 class=\\\"title left\\\"><span class=\\\"fal fa-user-clock\\\"/>&nbsp;Timeline: \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"firstname\") + \" \" + runtime.contextOrFrameLookup(context, frame, \"surname\") + \" (\" + runtime.contextOrFrameLookup(context, frame, \"username\") + env.getFilter(\"escape\").call(context, \")\"), env.opts.autoescape);\noutput += \"</h4>\\t\\t\\t\\n\\t\\t</div>\\n\\t</div>\\n\\t<div class=\\\"timeline-body\\\">\\n\\t\\t<div class=\\\"events-region\\\">\\n\\t\\t</div>\\n\\t</div>\\n\\t<div class=\\\"overlay timeline-overlay\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar timeline_oldRoot = timeline_obj.root;\ntimeline_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\ttimeline_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar stat_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"inline event-icon\\\"><span class=\\\"fal fa-\";\noutput += runtime.suppressValue((lineno = 1, colno = 68, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"fontAwesomeName\"), \"fontAwesomeName\", context, [runtime.contextOrFrameLookup(context, frame, \"event_name\")])), env.opts.autoescape);\noutput += \"\\\"/></div>\\n\\t<div class=\\\"inline\\\">\\n\\t\\t<div class=\\\"event-name\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, (lineno = 3, colno = 35, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"statName\"), \"statName\", context, [runtime.contextOrFrameLookup(context, frame, \"display\"),runtime.contextOrFrameLookup(context, frame, \"event_name\")]))), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t<div class=\\\"small-date\\\">\\n\\t\\t\\t\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, (lineno = 5, colno = 11, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"fromNow\"), \"fromNow\", context, [runtime.contextOrFrameLookup(context, frame, \"timestamp\")]))), env.opts.autoescape);\noutput += \"\\n\\t\\t</div>\\n\\t</div>\\n\\t<div class=\\\"inline event-time\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, (lineno = 8, colno = 43, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"event_time\"), \"event_time\", context, [runtime.contextOrFrameLookup(context, frame, \"timestamp\")]))), env.opts.autoescape);\noutput += \"</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar stat_oldRoot = stat_obj.root;\nstat_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tstat_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar dayStats_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"date-divider\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, (lineno = 1, colno = 38, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"formatDate\"), \"formatDate\", context, [runtime.contextOrFrameLookup(context, frame, \"date\")]))), env.opts.autoescape);\noutput += \"</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar dayStats_oldRoot = dayStats_obj.root;\ndayStats_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tdayStats_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar camBtn_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span class=\\\"fal fa-chart-bar\\\"></span>&nbsp;<span class=\\\"active-users\\\">0</span>/<span class=\\\"total-users\\\">0</span>&nbsp;In&nbsp;<span class=\\\"monitor-type\\\"></span>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar camBtn_oldRoot = camBtn_obj.root;\ncamBtn_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcamBtn_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"layout\": new nunjucks.Template( {obj: layout_obj, type: \"code\"}, env),\t\"camUserSelector\": new nunjucks.Template( {obj: camUserSelector_obj, type: \"code\"}, env),\t\"userView\": new nunjucks.Template( {obj: userView_obj, type: \"code\"}, env),\t\"timeline\": new nunjucks.Template( {obj: timeline_obj, type: \"code\"}, env),\t\"stat\": new nunjucks.Template( {obj: stat_obj, type: \"code\"}, env),\t\"dayStats\": new nunjucks.Template( {obj: dayStats_obj, type: \"code\"}, env),\t\"camBtn\": new nunjucks.Template( {obj: camBtn_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar content_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\n\\t<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<div>Click on an attachment to put it back where it was in the book when you deleted it.</div>\\n\\t\\t\\t<br/>\\n\\t\\t\\t<div class=\\\"attachment-list-container\\\">\\n\\t\\t\\t\\t<div class=\\\"attachment-list-header\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"deleted-attachment-item-value\\\"></div>\\n\\t\\t\\t\\t\\t<div class=\\\"deleted-attachment-item-value\\\">Title</div>\\n\\t\\t\\t\\t\\t<div class=\\\"deleted-attachment-item-value\\\">Subject</div>\\n\\t\\t\\t\\t\\t<div class=\\\"deleted-attachment-item-value\\\">Language</div>\\n\\t\\t\\t\\t\\t<div class=\\\"deleted-attachment-item-value\\\">Grade</div>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t<div class=\\\"attachment-list\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"empty-message hide\\\">\\n\\t\\t\\t\\t\\t\\t<span>The attachment bin is empty.</span>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar content_oldRoot = content_obj.root;\ncontent_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcontent_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar deletedAttachmentItem_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"deleted-attachment-item-value \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"icon\"), env.opts.autoescape);\noutput += \"\\\"></div>\\n\\t<div class=\\\"deleted-attachment-item-value\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"title\"), env.opts.autoescape);\noutput += \"</div>\\n\\t<div class=\\\"deleted-attachment-item-value\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"subject\"), env.opts.autoescape);\noutput += \"</div>\\n\\t<div class=\\\"deleted-attachment-item-value\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"language\"), env.opts.autoescape);\noutput += \"</div>\\n\\t<div class=\\\"deleted-attachment-item-value\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"grade\"), env.opts.autoescape);\noutput += \"</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar deletedAttachmentItem_oldRoot = deletedAttachmentItem_obj.root;\ndeletedAttachmentItem_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tdeletedAttachmentItem_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"content\": new nunjucks.Template( {obj: content_obj, type: \"code\"}, env),\t\"deletedAttachmentItem\": new nunjucks.Template( {obj: deletedAttachmentItem_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar mpub_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"book-display-container\\\">\\n\\t\\t<div class=\\\"drop-overlay\\\">\\n\\t\\t\\t<div class=\\\"cancel-drop hide\\\"><span class=\\\"fal fa-trash-alt\\\"></span>Don't&nbspUpload</div>\\n\\t\\t</div>\\n\\t\\t<iframe id=\\\"book-display\\\" name=\\\"book-display\\\" frameborder=\\\"0\\\">\\n\\t\\t</iframe>\\n\\t</div>\\n\\n\\t<div class=\\\"attachment-bin attachment-bin-hidden\\\">\\n\\t\\t<span class=\\\"fal fa-trash-alt\\\"></span>\\n\\t</div>\\n\\n\\t<div id=\\\"book-overlay\\\">\\n\\t\\t<div id=\\\"ie-pip\\\" style=\\\"z-index: 9999; width: 32px; height: 32px; position: absolute; pointer-events: none; opacity: 0.75\\\" class=\\\"hide\\\"></div>\\n\\t\\t<div class=\\\"notifications\\\">\\n\\t\\t\\t<div class=\\\"red groups hide\\\">\\n\\t\\t\\t\\t<span>\\n\\t\\t\\t\\t\\t<span class=\\\"fal fa-exclamation-circle\\\"/> Not all global groups are currently selected for attachments (click here if you need to change group allocations)\\n\\t\\t\\t\\t</span>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"infoBlock\\\">\\n\\t\\t\\t<span class=\\\"spinner-icon spinner-red\\\">&nbsp;</span>\\n\\t\\t\\t<span class=\\\"warn\\\">Please note that books with lots of images may be slow to load over remote or mobile connections.</span>\\n\\t\\t\\t<div class=\\\"hint invisible\\\">\\n\\t\\t\\t\\t<div class=\\\"title\\\"><span class=\\\"fal fa-info-circle\\\"/> Did you know?</div>\\n\\t\\t\\t\\t<div>\";\noutput += runtime.suppressValue((lineno = 28, colno = 14, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"hint\"), \"hint\", context, [])), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"paging-button up hide\\\">\\n\\t\\t\\t<span class=\\\"fal fa-chevron-up\\\"></span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"paging-button down hide\\\">\\n\\t\\t\\t<span class=\\\"fal fa-chevron-down\\\"></span>\\n\\t\\t</div>\\n\\n\\t\\t<div id=\\\"attachment-container\\\"></div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar mpub_oldRoot = mpub_obj.root;\nmpub_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmpub_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar mpdf_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div id=\\\"canvas-display\\\">\\n\\t\\t<canvas></canvas>\\n\\t\\t<div class=\\\"cancel-drop hide\\\"><span class=\\\"fal fa-trash-alt\\\"></span>Don't&nbspUpload</div>\\n\\t</div>\\n\\n\\t<div class=\\\"attachment-bin attachment-bin-hidden\\\">\\n\\t\\t<span class=\\\"fal fa-trash-alt\\\"></span>\\n\\t</div>\\n\\n\\t<div id=\\\"book-overlay\\\">\\n\\t\\t<div class=\\\"notifications\\\">\\n\\t\\t\\t<div class=\\\"red groups hide\\\">\\n\\t\\t\\t\\t<span>\\n\\t\\t\\t\\t\\t<span class=\\\"fal fa-exclamation-circle\\\"/> Not all global groups are currently selected for attachments (click here if you need to change group allocations)\\n\\t\\t\\t\\t</span>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"infoBlock\\\">\\n\\t\\t\\t<span class=\\\"spinner-icon spinner-red\\\">&nbsp;</span>\\n\\t\\t\\t<span class=\\\"warn\\\">Please note that large PDFs may be slow to load over remote or mobile connections.</span>\\n\\t\\t\\t<div class=\\\"hint invisible\\\">\\n\\t\\t\\t\\t<div class=\\\"title\\\"><span class=\\\"fal fa-info-circle\\\"/> Did you know?</div>\\n\\t\\t\\t\\t<div>\";\noutput += runtime.suppressValue((lineno = 24, colno = 14, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"hint\"), \"hint\", context, [])), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"highlight-bar hide\\\"></div>\\n\\n\\t\\t<div class=\\\"paging-button up hide\\\">\\n\\t\\t\\t<span class=\\\"fas fa-chevron-up\\\"></span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"paging-button down hide\\\">\\n\\t\\t\\t<span class=\\\"fas fa-chevron-down\\\"></span>\\n\\t\\t</div>\\n\\n\\t\\t<div id=\\\"attachment-container\\\"></div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar mpdf_oldRoot = mpdf_obj.root;\nmpdf_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmpdf_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar attachment_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span class=\\\"\";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"contentIcons\") == \"img\"?\"\":\"fa\"), env.opts.autoescape);\noutput += \" attachment-icon \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"_id\")?\"\":\"busy\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\";\nif(!runtime.contextOrFrameLookup(context, frame, \"_id\")) {\noutput += \"\\n\\t\\t<span class=\\\"spinner-icon spinner-small spinner-red\\\"/>\\n\\t\";\n;\n}\noutput += \"\\n\\t</span>\\n\\t<span class=\\\"fal fa-history age hide\\\" title=\\\"Old attachment\\\" />\\n\\t<span class=\\\"fal fa-lock nationality\\\" title=\\\"Not part of your book.\\\"/>\\n\\t<span class=\\\"fal fa-share-alt shared hide\\\" title=\\\"Shared Attachment\\\"/>\\n\\t<span class=\\\"fal fa-exclamation-circle error hide\\\" title=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"errors\")),\"error\"), env.opts.autoescape);\noutput += \"\\\" />\\n\\n\\t<span class=\\\"fal fa-eye-slash visible hide\\\" title=\\\"The attachment is hidden.\\\" />\\n\\t<span class=\\\"fal fa-lock locked hide\\\" title=\\\"The attachment is locked.\\\" />\\n\\n\\t<div class=\\\"highlight-overlay\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar attachment_oldRoot = attachment_obj.root;\nattachment_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tattachment_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar description_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t\";\nif((runtime.contextOrFrameLookup(context, frame, \"isOld\") || runtime.contextOrFrameLookup(context, frame, \"isForeign\")) && env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"resources\")),\"public\"))) {\noutput += \"\\n\\t\\t<div class=\\\"status clone\\\">\";\noutput += runtime.suppressValue((!runtime.contextOrFrameLookup(context, frame, \"isOld\")?\"\":\"<span class='fal fa-bolt'/>\"), env.opts.autoescape);\noutput += \" \";\noutput += runtime.suppressValue((!runtime.contextOrFrameLookup(context, frame, \"isForeign\")?\"\":\"<span class='fal fa-lock'/>\"), env.opts.autoescape);\noutput += \" Not part of your book</div>\\n\\t\";\n;\n}\nelse {\nif(runtime.contextOrFrameLookup(context, frame, \"isShared\")) {\noutput += \"\\n\\t\\t<div class=\\\"status share\\\"><span class='fal fa-share-alt'/> Shared with other groups</div>\\n\\t\";\n;\n}\n;\n}\noutput += \"\\n\\n\\t<div class=\\\"main\\\">\\n\\t\\t<div class=\\\"preview\\\">\\n\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"summary\\\">\\n\\t\\t\\t<div class=\\\"title\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"title\")), env.opts.autoescape);\noutput += \"</div>\\n\\n\\t\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"_id\")) {\noutput += \"\\n\\t\\t\\t\\t<div class=\\\"summary-item\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"subject_name\"), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t\\t<div class=\\\"summary-item\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"gradeMap\").call(context, runtime.contextOrFrameLookup(context, frame, \"grade\")), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t\\t<div class=\\\"summary-item\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"language\"), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t\\t<div class=\\\"summary-item show-code \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"category\") != \"assessment\" || !runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"settings\")),\"requireCode\")?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\"><span class=\\\"fal fa-key\\\"/> Show Code</div>\\n\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"actions\\\">\\n\\t\\t\\t<span class=\\\"fal fa-map-marker show-tippy\\\" id=\\\"action-find-resource\\\" data-title=\\\"Show in Content List\\\"></span>\\n\\t\\t\\t\";\nif(env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"resources\")),\"public\"))) {\noutput += \"\\n\\t\\t\\t<span class=\\\"fal fa-users-class show-tippy hide\\\" id=\\\"action-select-groups\\\" data-title=\\\"Change Groups\\\"></span>\\n\\t\\t\\t<span class=\\\"fal fa-clone hide show-tippy\\\" id=\\\"action-clone\\\" data-title=\\\"Clone\\\"></span>\\n\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t<span class=\\\"fal fa-chart-bar show-tippy\\\" id=\\\"action-resource-opened-by\\\" data-title=\\\"Resource Opened By\\\"/>\\n\\t\\t\\t\";\nif(env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"api\")),\"resources\")),\"get\"))) {\noutput += \"<span class=\\\"fal fa-eye show-tippy\\\" id=\\\"action-open-resource\\\" data-title=\\\"Open Item\\\"/>\";\n;\n}\noutput += \"\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar description_oldRoot = description_obj.root;\ndescription_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tdescription_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar attachmentProgress_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"uploading-attachment\\\">\\n\\t\\t<div class=\\\"actions\\\">\\n\\t\\t\\t<span class=\\\"cancel-btn fas fa-times-circle upload-btn\\\" title=\\\"Cancel Upload\\\"/>\\n\\t\\t\\t<span class=\\\"completed-btn fas fa-check-circle upload-btn hide\\\" title=\\\"Upload Completed\\\"/>\\n\\t\\t\\t<span class=\\\"error-btn fas fa-exclamation-triangle upload-btn hide\\\" title=\\\"Upload Error\\\"/>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"title\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"title\"), env.opts.autoescape);\noutput += \"</div>\\n\\t</div>\\n\\t<div class=\\\"upload-progress\\\"><div class=\\\"progress-bar\\\"></div></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar attachmentProgress_oldRoot = attachmentProgress_obj.root;\nattachmentProgress_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tattachmentProgress_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"mpub\": new nunjucks.Template( {obj: mpub_obj, type: \"code\"}, env),\t\"mpdf\": new nunjucks.Template( {obj: mpdf_obj, type: \"code\"}, env),\t\"attachment\": new nunjucks.Template( {obj: attachment_obj, type: \"code\"}, env),\t\"description\": new nunjucks.Template( {obj: description_obj, type: \"code\"}, env),\t\"attachmentProgress\": new nunjucks.Template( {obj: attachmentProgress_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar container_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<h4 id=\\\"error\\\"></h4>\\n\\t<div id=\\\"loading\\\" class=\\\"\";\noutput += runtime.suppressValue((!runtime.contextOrFrameLookup(context, frame, \"loading\")?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t<i class='fas fa-spinner fa-spin'></i>\\n\\t</div>\\n\\t<p class=\\\"form-label\\\">Select book:</p>\\n\\t<div id=\\\"bookSelector\\\">\\n\\t\\t\";\nframe = frame.push();\nvar t_3 = runtime.contextOrFrameLookup(context, frame, \"books\");\nif(t_3) {var t_2 = t_3.length;\nfor(var t_1=0; t_1 < t_3.length; t_1++) {\nvar t_4 = t_3[t_1];\nframe.set(\"book\", t_4);\nframe.set(\"loop.index\", t_1 + 1);\nframe.set(\"loop.index0\", t_1);\nframe.set(\"loop.revindex\", t_2 - t_1);\nframe.set(\"loop.revindex0\", t_2 - t_1 - 1);\nframe.set(\"loop.first\", t_1 === 0);\nframe.set(\"loop.last\", t_1 === t_2 - 1);\nframe.set(\"loop.length\", t_2);\noutput += \"\\n\\t\\t\\t<div class=\\\"book-cover\\\" data-uid=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_4),\"universal_id\"), env.opts.autoescape);\noutput += \"\\\"><img src=\\\"/unity/api/1.0/epubs/\";\noutput += runtime.suppressValue(runtime.memberLookup((t_4),\"_id\"), env.opts.autoescape);\noutput += \"/cover\\\" /></div>\\n\\t\\t\";\n;\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar container_oldRoot = container_obj.root;\ncontainer_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcontainer_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"container\": new nunjucks.Template( {obj: container_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar consoleSelector_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"console-container\\\">\\n\\t\\t<div class=\\\"content console-blank hide\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"content console-books hide\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"content console-educator-folders hide\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"content console-learning-paths hide\\\">\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar consoleSelector_oldRoot = consoleSelector_obj.root;\nconsoleSelector_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tconsoleSelector_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"consoleSelector\": new nunjucks.Template( {obj: consoleSelector_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar regions_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"nav-header\\\">\\n\\t\\t<label class=\\\"search-box\\\">\\n\\t\\t\\t<div class=\\\"fal fa-search\\\"></div>\\n\\t\\t\\t<input type=\\\"text\\\" placeholder=\\\"Search for page or text...\\\" required title=\\\" \\\"/>\\n\\t\\t\\t<div class=\\\"input-overlay fal fa-times\\\" title=\\\"Clear field\\\"/>\\n\\t\\t</label>\\n\\t\\t<span class=\\\"fal fa-times hide\\\" title=\\\"Close navigation pane\\\">&nbsp;</span>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar regions_oldRoot = regions_obj.root;\nregions_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tregions_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar pages_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"title\\\">Pages</div>\\n\\t<div class=\\\"content\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar pages_oldRoot = pages_obj.root;\npages_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tpages_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar body_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"title\\\">Table of Contents</div>\\n\\t<div class=\\\"content\\\">\\n\\t\\t<iframe frameborder=\\\"0\\\"></iframe>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar body_oldRoot = body_obj.root;\nbody_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tbody_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar page_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\tPage \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"page\"), env.opts.autoescape);\noutput += \"\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar page_oldRoot = page_obj.root;\npage_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tpage_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"regions\": new nunjucks.Template( {obj: regions_obj, type: \"code\"}, env),\t\"pages\": new nunjucks.Template( {obj: pages_obj, type: \"code\"}, env),\t\"body\": new nunjucks.Template( {obj: body_obj, type: \"code\"}, env),\t\"page\": new nunjucks.Template( {obj: page_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar content_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\n\\t\";\nif(!runtime.contextOrFrameLookup(context, frame, \"forAttachment\")) {\noutput += \"\\n\\t\\t<p>You can change the currently selected groups for this item here. Groups determine which users will see content.</p>\\n\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t<p>You can change the currently assigned groups for this attachment here. Groups determine which users will see the attachment.</p>\\n\\t\";\n;\n}\noutput += \"\\n\\n\\t\";\nif(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"groups\")),\"system\") == {}) {\noutput += \"\\n\\t\\tThe currently chosen item is assigned to everyone; you cannot set group permissions.\\n\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t<select name=\\\"groups\\\" multiple>\\n\\t\\t\\t<optgroup label=\\\"Global Groups\\\">\\n\\t\\t\\t\\t\";\nframe = frame.push();\nvar t_3 = runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"groups\")),\"system\");\nif(t_3) {var t_1;\nif(runtime.isArray(t_3)) {\nvar t_2 = t_3.length;\nfor(t_1=0; t_1 < t_3.length; t_1++) {\nvar t_4 = t_3[t_1][0]\nframe.set(\"key\", t_3[t_1][0]);\nvar t_5 = t_3[t_1][1]\nframe.set(\"grp\", t_3[t_1][1]);\nframe.set(\"loop.index\", t_1 + 1);\nframe.set(\"loop.index0\", t_1);\nframe.set(\"loop.revindex\", t_2 - t_1);\nframe.set(\"loop.revindex0\", t_2 - t_1 - 1);\nframe.set(\"loop.first\", t_1 === 0);\nframe.set(\"loop.last\", t_1 === t_2 - 1);\nframe.set(\"loop.length\", t_2);\noutput += \"\\n\\t\\t\\t\\t<option value=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_5),\"code\"), env.opts.autoescape);\noutput += \"\\\" \";\noutput += runtime.suppressValue(((env.getFilter(\"contains\").call(context, runtime.contextOrFrameLookup(context, frame, \"current\"),runtime.memberLookup((t_5),\"code\")))?\"selected\":\"\"), env.opts.autoescape);\noutput += \">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.memberLookup((t_5),\"name\")), env.opts.autoescape);\noutput += \"</option>\\n\\t\\t\\t\\t\";\n;\n}\n} else {\nt_1 = -1;\nvar t_2 = runtime.keys(t_3).length;\nfor(var t_6 in t_3) {\nt_1++;\nvar t_7 = t_3[t_6];\nframe.set(\"key\", t_6);\nframe.set(\"grp\", t_7);\nframe.set(\"loop.index\", t_1 + 1);\nframe.set(\"loop.index0\", t_1);\nframe.set(\"loop.revindex\", t_2 - t_1);\nframe.set(\"loop.revindex0\", t_2 - t_1 - 1);\nframe.set(\"loop.first\", t_1 === 0);\nframe.set(\"loop.last\", t_1 === t_2 - 1);\nframe.set(\"loop.length\", t_2);\noutput += \"\\n\\t\\t\\t\\t<option value=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_7),\"code\"), env.opts.autoescape);\noutput += \"\\\" \";\noutput += runtime.suppressValue(((env.getFilter(\"contains\").call(context, runtime.contextOrFrameLookup(context, frame, \"current\"),runtime.memberLookup((t_7),\"code\")))?\"selected\":\"\"), env.opts.autoescape);\noutput += \">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.memberLookup((t_7),\"name\")), env.opts.autoescape);\noutput += \"</option>\\n\\t\\t\\t\\t\";\n;\n}\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t\\t</optgroup>\\n\\t\\t\\t<optgroup label=\\\"Custom Groups\\\">\\n\\t\\t\\t\\t\";\nframe = frame.push();\nvar t_10 = runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"groups\")),\"custom\");\nif(t_10) {var t_8;\nif(runtime.isArray(t_10)) {\nvar t_9 = t_10.length;\nfor(t_8=0; t_8 < t_10.length; t_8++) {\nvar t_11 = t_10[t_8][0]\nframe.set(\"key\", t_10[t_8][0]);\nvar t_12 = t_10[t_8][1]\nframe.set(\"grp\", t_10[t_8][1]);\nframe.set(\"loop.index\", t_8 + 1);\nframe.set(\"loop.index0\", t_8);\nframe.set(\"loop.revindex\", t_9 - t_8);\nframe.set(\"loop.revindex0\", t_9 - t_8 - 1);\nframe.set(\"loop.first\", t_8 === 0);\nframe.set(\"loop.last\", t_8 === t_9 - 1);\nframe.set(\"loop.length\", t_9);\noutput += \"\\n\\t\\t\\t\\t<option value=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_12),\"code\"), env.opts.autoescape);\noutput += \"\\\" \";\noutput += runtime.suppressValue(((env.getFilter(\"contains\").call(context, runtime.contextOrFrameLookup(context, frame, \"current\"),runtime.memberLookup((t_12),\"code\")))?\"selected\":\"\"), env.opts.autoescape);\noutput += \">\";\noutput += runtime.suppressValue((!runtime.memberLookup((t_12),\"owner\")?\"(u2605) \":\"\"), env.opts.autoescape);\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.memberLookup((t_12),\"name\")), env.opts.autoescape);\noutput += \"</option>\\n\\t\\t\\t\\t\";\n;\n}\n} else {\nt_8 = -1;\nvar t_9 = runtime.keys(t_10).length;\nfor(var t_13 in t_10) {\nt_8++;\nvar t_14 = t_10[t_13];\nframe.set(\"key\", t_13);\nframe.set(\"grp\", t_14);\nframe.set(\"loop.index\", t_8 + 1);\nframe.set(\"loop.index0\", t_8);\nframe.set(\"loop.revindex\", t_9 - t_8);\nframe.set(\"loop.revindex0\", t_9 - t_8 - 1);\nframe.set(\"loop.first\", t_8 === 0);\nframe.set(\"loop.last\", t_8 === t_9 - 1);\nframe.set(\"loop.length\", t_9);\noutput += \"\\n\\t\\t\\t\\t<option value=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_14),\"code\"), env.opts.autoescape);\noutput += \"\\\" \";\noutput += runtime.suppressValue(((env.getFilter(\"contains\").call(context, runtime.contextOrFrameLookup(context, frame, \"current\"),runtime.memberLookup((t_14),\"code\")))?\"selected\":\"\"), env.opts.autoescape);\noutput += \">\";\noutput += runtime.suppressValue((!runtime.memberLookup((t_14),\"owner\")?\"(u2605) \":\"\"), env.opts.autoescape);\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.memberLookup((t_14),\"name\")), env.opts.autoescape);\noutput += \"</option>\\n\\t\\t\\t\\t\";\n;\n}\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t\\t</optgroup>\\n\\t\\t</select>\\n\\t\";\n;\n}\noutput += \"\\n\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar content_oldRoot = content_obj.root;\ncontent_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcontent_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"content\": new nunjucks.Template( {obj: content_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"top-area\\\">\\n\\t<div class=\\\"left-area\\\">\\n\\t\\t<div class=\\\"heading\\\">\\n\\t\\t\\t<span class=\\\"title\\\"><div></div></span>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"centre-area\\\">\\n\\t\\t<div class=\\\"paging hide\\\">\\n\\t\\t\\t<div class=\\\"ranger\\\">\\n\\t\\t\\t\\t<input type=\\\"range\\\" name=\\\"page-slider\\\" min=\\\"1\\\" value=\\\"1\\\" disabled/>\\n\\t\\t\\t</div>\\n\\t\\t\\t<div>\\n\\t\\t\\t\\t<select class=\\\"page-dropdown\\\" data-placeholder=\\\"Not on a page\\\" disabled></select>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"zoom hide\\\">\\n\\t\\t\\t<div class=\\\"zoom-out\\\"><span class=\\\"fal fa-minus\\\"/></div>\\n\\t\\t\\t<div class=\\\"zoom-level\\\">100%</div>\\n\\t\\t\\t<div class=\\\"zoom-in\\\"><span class=\\\"fal fa-plus\\\"/></div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"share-location hide\\\" title=\\\"Share location\\\"><span class=\\\"fal fa-share-square\\\"/></div>\\n\\t</div>\\n\\n\\t<div class=\\\"right-area\\\">\\n\\t\\t<div class=\\\"lp-flipswitch hide\\\">\\n\\t\\t\\t<span>Edit&nbsp;&nbsp;&nbsp;&nbsp;</span>\\n\\t\\t\\t<div class=\\\"flipswitch\\\">\\n\\t\\t\\t    <input type=\\\"checkbox\\\" name=\\\"flipswitch\\\" class=\\\"flipswitch-cb\\\" id=\\\"fs\\\">\\n\\t\\t\\t    <label class=\\\"flipswitch-label\\\" for=\\\"fs\\\">\\n\\t\\t\\t        <div class=\\\"flipswitch-inner\\\"></div>\\n\\t\\t\\t        <div class=\\\"flipswitch-switch\\\"></div>\\n\\t\\t\\t    </label>\\n\\t\\t\\t</div>\\n\\t\\t\\t<span>&nbsp;&nbsp;&nbsp;&nbsp;View&nbsp;as</span>\\n\\t\\t</div>\\n\\n\\t\\t\";\nif((env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"learningPaths\")),\"canEdit\")))) {\noutput += \"\\n\\t\\t\\t<div class=\\\"multiselect-container hide\\\">\\n\\t\\t\\t\\t<label><input type=\\\"checkbox\\\"/>&nbsp;&nbsp;<span>Select&nbsp;multiple</span></label>\\n\\t\\t\\t</div>\\n\\t\\t\";\n;\n}\noutput += \"\\n\\n\\t\\t<div class=\\\"icons\\\">\\n\\t\\t\\t<span class=\\\"fal fa-trash-alt icon attachment-bin hide\\\"></span>\\n\\t\\t\\t<span class=\\\"fal fa-expand-alt icon fullscreen-toggle\\\"></span>\\n\\t\\t</div>\\n\\t</div>\\n</div>\\n<div class=\\\"bottom-area hide\\\">\\n\\t<div class=\\\"cam-btn-container\\\">\\n\\t</div>\\n\\t<div class=\\\"right-container\\\">\\n\\t\\t<button type=\\\"button\\\" class=\\\"button clone-all-btn hide\\\" title=\\\"Clone all resources used in previous years.\\\"><span class=\\\"fal fa-clone icon\\\"></span>&nbsp;Clone&nbsp;All</button>\\n\\t\\t<button type=\\\"button\\\" class=\\\"button hide-locked-btn hide\\\" title=\\\"Show or hide resources used in previous years.\\\"><span class=\\\"hide-text\\\"><span class=\\\"fal fa-eye-slash icon\\\"></span>&nbsp;Hide</span><span class=\\\"show-text\\\"><span class=\\\"fal fa-eye icon\\\"></span>&nbsp;Show</span>&nbsp;Old</button>\\n\\t</div>\\n</div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar wizard_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<h5 id=\\\"tocError\\\"></h5>\\n\\t<div id=\\\"loading\\\" class=\\\"\";\noutput += runtime.suppressValue((!runtime.contextOrFrameLookup(context, frame, \"loading\")?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t<i class='fas fa-spinner fa-spin'></i>\\n\\t</div>\\n\\t<div id=\\\"bookSelector\\\" class=\\\"hide\\\">\\n\\t\\t\";\nframe = frame.push();\nvar t_3 = runtime.contextOrFrameLookup(context, frame, \"books\");\nif(t_3) {var t_2 = t_3.length;\nfor(var t_1=0; t_1 < t_3.length; t_1++) {\nvar t_4 = t_3[t_1];\nframe.set(\"book\", t_4);\nframe.set(\"loop.index\", t_1 + 1);\nframe.set(\"loop.index0\", t_1);\nframe.set(\"loop.revindex\", t_2 - t_1);\nframe.set(\"loop.revindex0\", t_2 - t_1 - 1);\nframe.set(\"loop.first\", t_1 === 0);\nframe.set(\"loop.last\", t_1 === t_2 - 1);\nframe.set(\"loop.length\", t_2);\noutput += \"\\n\\t\\t\\t<div class=\\\"book-cover\\\" data-uid=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_4),\"universal_id\"), env.opts.autoescape);\noutput += \"\\\"><img src=\\\"/unity/api/1.0/epubs/\";\noutput += runtime.suppressValue(runtime.memberLookup((t_4),\"_id\"), env.opts.autoescape);\noutput += \"/cover\\\" /></div>\\n\\t\\t\";\n;\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t</div>\\n\\n\\t<div id=\\\"tocSelector\\\" class=\\\"hide\\\">\\n\\t\\t<!--<input id=\\\"select-all\\\" type=\\\"checkbox\\\" /> Select All</label>-->\\n\\t\\t<label id=\\\"select-all-container\\\">\\n\\t\\t\\t<button class=\\\"button success smart\\\">Smart Select</button>&nbsp;&nbsp;&nbsp;&nbsp;\\n\\t\\t\\t<button class=\\\"button secondary deselect\\\">Deselect All</button>\\n\\t\\t</label>\\n\\n\\t\\t\";\nvar macro_t_5 = runtime.makeMacro(\n[\"toc\", \"depth\"], \n[], \nfunction (l_toc, l_depth, kwargs) {\nframe = frame.push();\nkwargs = kwargs || {};\nif (kwargs.hasOwnProperty(\"caller\")) {\nframe.set(\"caller\", kwargs.caller); }\nframe.set(\"toc\", l_toc);\nframe.set(\"depth\", l_depth);\nvar t_6 = \"\";t_6 += \"\\n\\t\\t\\t<li>\\n\\t\\t\\t\\t<label class=\\\"toc-selector\\\"\\n\\t\\t\\t\\t\\tdata-path=\\\"\";\nt_6 += runtime.suppressValue(runtime.memberLookup((l_toc),\"path\"), env.opts.autoescape);\nt_6 += \"\\\"\\n\\t\\t\\t\\t\\tdata-depth=\\\"\";\nt_6 += runtime.suppressValue(l_depth, env.opts.autoescape);\nt_6 += \"\\\"\\n\\t\\t\\t\\t\\tdata-pagerange=\\\"\";\nt_6 += runtime.suppressValue(env.getFilter(\"join\").call(context, runtime.memberLookup((l_toc),\"pageRange\"),\",\"), env.opts.autoescape);\nt_6 += \"\\\"\\n\\t\\t\\t\\t\\tdata-pagerangedisplay=\\\"\";\nt_6 += runtime.suppressValue(env.getFilter(\"join\").call(context, runtime.memberLookup((l_toc),\"pageRangeDisplay\"),\",\"), env.opts.autoescape);\nt_6 += \"\\\">\\n\\t\\t\\t\\t\\t<span><span class=\\\"tocTitle\\\">\";\nt_6 += runtime.suppressValue(runtime.memberLookup((l_toc),\"title\"), env.opts.autoescape);\nt_6 += \"</span> \";\nif(runtime.memberLookup((runtime.memberLookup((l_toc),\"pageRangeDisplay\")),0) != \"0\") {\nt_6 += \"(pg. \";\nt_6 += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((l_toc),\"pageRangeDisplay\")),0), env.opts.autoescape);\nt_6 += \" - \";\nt_6 += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((l_toc),\"pageRangeDisplay\")),1), env.opts.autoescape);\nt_6 += \")\";\n;\n}\nt_6 += \"</span><input type=\\\"checkbox\\\" />\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t\";\nif(runtime.memberLookup((runtime.memberLookup((l_toc),\"children\")),\"length\") > 0) {\nt_6 += \"\\n\\t\\t\\t\\t<ul>\\n\\t\\t\\t\\t\\t\";\nframe = frame.push();\nvar t_9 = runtime.memberLookup((l_toc),\"children\");\nif(t_9) {var t_8 = t_9.length;\nfor(var t_7=0; t_7 < t_9.length; t_7++) {\nvar t_10 = t_9[t_7];\nframe.set(\"tocChild\", t_10);\nframe.set(\"loop.index\", t_7 + 1);\nframe.set(\"loop.index0\", t_7);\nframe.set(\"loop.revindex\", t_8 - t_7);\nframe.set(\"loop.revindex0\", t_8 - t_7 - 1);\nframe.set(\"loop.first\", t_7 === 0);\nframe.set(\"loop.last\", t_7 === t_8 - 1);\nframe.set(\"loop.length\", t_8);\nt_6 += \"\\n\\t\\t\\t\\t\\t\\t\";\nt_6 += runtime.suppressValue((lineno = 30, colno = 23, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"tocItemSelection\"), \"tocItemSelection\", context, [t_10,l_depth + 1])), env.opts.autoescape);\nt_6 += \"\\n\\t\\t\\t\\t\\t\";\n;\n}\n}\nframe = frame.pop();\nt_6 += \"\\n\\t\\t\\t\\t</ul>\\n\\t\\t\\t\\t\";\n;\n}\nt_6 += \"\\n\\t\\t\\t</li>\\n\\t\\t\";\n;\nframe = frame.pop();\nreturn new runtime.SafeString(t_6);\n});\ncontext.addExport(\"tocItemSelection\");\ncontext.setVariable(\"tocItemSelection\", macro_t_5);\noutput += \"\\n\\n\\t\\t<ul>\\n\\t\\t\\t\";\nframe = frame.push();\nvar t_13 = runtime.contextOrFrameLookup(context, frame, \"tocItems\");\nif(t_13) {var t_12 = t_13.length;\nfor(var t_11=0; t_11 < t_13.length; t_11++) {\nvar t_14 = t_13[t_11];\nframe.set(\"toc\", t_14);\nframe.set(\"loop.index\", t_11 + 1);\nframe.set(\"loop.index0\", t_11);\nframe.set(\"loop.revindex\", t_12 - t_11);\nframe.set(\"loop.revindex0\", t_12 - t_11 - 1);\nframe.set(\"loop.first\", t_11 === 0);\nframe.set(\"loop.last\", t_11 === t_12 - 1);\nframe.set(\"loop.length\", t_12);\noutput += \"\\n\\t\\t\\t\\t\";\noutput += runtime.suppressValue((lineno = 39, colno = 21, runtime.callWrap(macro_t_5, \"tocItemSelection\", context, [t_14,1])), env.opts.autoescape);\noutput += \"\\n\\t\\t\\t\";\n;\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t</ul>\\n\\t</div>\\n\\n\\t<div id=\\\"verify\\\" class=\\\"hide\\\">\\n\\t\\t\";\nvar macro_t_15 = runtime.makeMacro(\n[\"toc\"], \n[], \nfunction (l_toc, kwargs) {\nframe = frame.push();\nkwargs = kwargs || {};\nif (kwargs.hasOwnProperty(\"caller\")) {\nframe.set(\"caller\", kwargs.caller); }\nframe.set(\"toc\", l_toc);\nvar t_16 = \"\";t_16 += \"\\n\\t\\t\\t<li>\\n\\t\\t\\t\\t<span><span class=\\\"tocTitle\\\">\";\nt_16 += runtime.suppressValue(runtime.memberLookup((l_toc),\"title\"), env.opts.autoescape);\nt_16 += \"</span> \";\nif(runtime.memberLookup((runtime.memberLookup((l_toc),\"pageRangeDisplay\")),0) != \"0\") {\nt_16 += \"(pg. \";\nt_16 += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((l_toc),\"pageRangeDisplay\")),0), env.opts.autoescape);\nt_16 += \" - \";\nt_16 += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((l_toc),\"pageRangeDisplay\")),1), env.opts.autoescape);\nt_16 += \")\";\n;\n}\nelse {\nt_16 += \"<span class='noPages'>*</span>\";\n;\n}\nt_16 += \" </span>\\n\\t\\t\\t\\t\";\nif(runtime.memberLookup((l_toc),\"children\")) {\nt_16 += \"\\n\\t\\t\\t\\t<ul>\\n\\t\\t\\t\\t\\t\";\nframe = frame.push();\nvar t_19 = runtime.memberLookup((l_toc),\"children\");\nif(t_19) {var t_17;\nif(runtime.isArray(t_19)) {\nvar t_18 = t_19.length;\nfor(t_17=0; t_17 < t_19.length; t_17++) {\nvar t_20 = t_19[t_17][0]\nframe.set(\"path\", t_19[t_17][0]);\nvar t_21 = t_19[t_17][1]\nframe.set(\"tocChild\", t_19[t_17][1]);\nframe.set(\"loop.index\", t_17 + 1);\nframe.set(\"loop.index0\", t_17);\nframe.set(\"loop.revindex\", t_18 - t_17);\nframe.set(\"loop.revindex0\", t_18 - t_17 - 1);\nframe.set(\"loop.first\", t_17 === 0);\nframe.set(\"loop.last\", t_17 === t_18 - 1);\nframe.set(\"loop.length\", t_18);\nt_16 += \"\\n\\t\\t\\t\\t\\t\\t\";\nt_16 += runtime.suppressValue((lineno = 51, colno = 26, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"tocItemVerification\"), \"tocItemVerification\", context, [t_21])), env.opts.autoescape);\nt_16 += \"\\n\\t\\t\\t\\t\\t\";\n;\n}\n} else {\nt_17 = -1;\nvar t_18 = runtime.keys(t_19).length;\nfor(var t_22 in t_19) {\nt_17++;\nvar t_23 = t_19[t_22];\nframe.set(\"path\", t_22);\nframe.set(\"tocChild\", t_23);\nframe.set(\"loop.index\", t_17 + 1);\nframe.set(\"loop.index0\", t_17);\nframe.set(\"loop.revindex\", t_18 - t_17);\nframe.set(\"loop.revindex0\", t_18 - t_17 - 1);\nframe.set(\"loop.first\", t_17 === 0);\nframe.set(\"loop.last\", t_17 === t_18 - 1);\nframe.set(\"loop.length\", t_18);\nt_16 += \"\\n\\t\\t\\t\\t\\t\\t\";\nt_16 += runtime.suppressValue((lineno = 51, colno = 26, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"tocItemVerification\"), \"tocItemVerification\", context, [t_23])), env.opts.autoescape);\nt_16 += \"\\n\\t\\t\\t\\t\\t\";\n;\n}\n}\n}\nframe = frame.pop();\nt_16 += \"\\n\\t\\t\\t\\t</ul>\\n\\t\\t\\t\\t\";\n;\n}\nt_16 += \"\\n\\t\\t\\t</li>\\n\\t\\t\";\n;\nframe = frame.pop();\nreturn new runtime.SafeString(t_16);\n});\ncontext.addExport(\"tocItemVerification\");\ncontext.setVariable(\"tocItemVerification\", macro_t_15);\noutput += \"\\n\\t\\t<ul>\\n\\t\\t\\t\";\nframe = frame.push();\nvar t_26 = runtime.contextOrFrameLookup(context, frame, \"selectedTocItems\");\nif(t_26) {var t_24;\nif(runtime.isArray(t_26)) {\nvar t_25 = t_26.length;\nfor(t_24=0; t_24 < t_26.length; t_24++) {\nvar t_27 = t_26[t_24][0]\nframe.set(\"path\", t_26[t_24][0]);\nvar t_28 = t_26[t_24][1]\nframe.set(\"toc\", t_26[t_24][1]);\nframe.set(\"loop.index\", t_24 + 1);\nframe.set(\"loop.index0\", t_24);\nframe.set(\"loop.revindex\", t_25 - t_24);\nframe.set(\"loop.revindex0\", t_25 - t_24 - 1);\nframe.set(\"loop.first\", t_24 === 0);\nframe.set(\"loop.last\", t_24 === t_25 - 1);\nframe.set(\"loop.length\", t_25);\noutput += \"\\n\\t\\t\\t\\t\";\noutput += runtime.suppressValue((lineno = 59, colno = 24, runtime.callWrap(macro_t_15, \"tocItemVerification\", context, [t_28])), env.opts.autoescape);\noutput += \"\\n\\t\\t\\t\";\n;\n}\n} else {\nt_24 = -1;\nvar t_25 = runtime.keys(t_26).length;\nfor(var t_29 in t_26) {\nt_24++;\nvar t_30 = t_26[t_29];\nframe.set(\"path\", t_29);\nframe.set(\"toc\", t_30);\nframe.set(\"loop.index\", t_24 + 1);\nframe.set(\"loop.index0\", t_24);\nframe.set(\"loop.revindex\", t_25 - t_24);\nframe.set(\"loop.revindex0\", t_25 - t_24 - 1);\nframe.set(\"loop.first\", t_24 === 0);\nframe.set(\"loop.last\", t_24 === t_25 - 1);\nframe.set(\"loop.length\", t_25);\noutput += \"\\n\\t\\t\\t\\t\";\noutput += runtime.suppressValue((lineno = 59, colno = 24, runtime.callWrap(macro_t_15, \"tocItemVerification\", context, [t_30])), env.opts.autoescape);\noutput += \"\\n\\t\\t\\t\";\n;\n}\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t</ul>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar wizard_oldRoot = wizard_obj.root;\nwizard_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\twizard_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar container_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div id=\\\"tocContainer\\\">\\n\\t\\t<div id=\\\"tocHeader\\\">\\n\\t\\t\\t<div id=\\\"tocImportControls\\\">\\n\\t\\t\\t\\t<label class=\\\"bookSelector\\\">Select Book</label>\\n\\t\\t\\t\\t<label class=\\\"tocSelector\\\">Choose Sections</label>\\n\\t\\t\\t\\t<label class=\\\"verify\\\">Verify</label>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<h4 id=\\\"selectedBook\\\"></h4>\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar container_oldRoot = container_obj.root;\ncontainer_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcontainer_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"wizard\": new nunjucks.Template( {obj: wizard_obj, type: \"code\"}, env),\t\"container\": new nunjucks.Template( {obj: container_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar console_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"modal-host\\\">\\n\\t\\t<div class=\\\"modal-element modal-background hide\\\"></div>\\n\\t\\t<div class=\\\"modal-element modal-container hide\\\"></div>\\n\\t</div>\\n\\n\\t<div class=\\\"tooltip-host\\\"></div>\\n\\n\\t<div id=\\\"sidebar-region\\\">\\n\\n\\t</div>\\n\\n\\t<div id=\\\"main-region\\\">\\n\\n\\t\\t<div id=\\\"header-region\\\"></div>\\n\\n\\t\\t<div id=\\\"body-container\\\">\\n\\t\\t\\t<div id=\\\"body-container-left-margin\\\"></div>\\n\\n\\t\\t\\t<div id=\\\"content-region\\\">\\n\\t\\t\\t\\t<img src=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"urlRoot\"), env.opts.autoescape);\noutput += \"/images/final-011b-hat.gif\\\">\\n\\t\\t\\t\\t<div>Just a moment, we're setting things up for you...</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar console_oldRoot = console_obj.root;\nconsole_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tconsole_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar error_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<p>Something went wrong while loading the console:</p>\\n\\t<p><strong>Error: \";\noutput += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"error\")),\"detail\") || runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"error\")),\"message\"), env.opts.autoescape);\noutput += \"</strong></p>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar error_oldRoot = error_obj.root;\nerror_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\terror_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"console\": new nunjucks.Template( {obj: console_obj, type: \"code\"}, env),\t\"error\": new nunjucks.Template( {obj: error_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar learningPathNode_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<svg height=\\\"30\\\" width=\\\"30\\\" class=\\\"hide\\\">\\n\\t\\t  <linearGradient id=\\\"lg-\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"_id\"), env.opts.autoescape);\noutput += \"\\\" x1=\\\"0.5\\\" y1=\\\"1\\\" x2=\\\"0.5\\\" y2=\\\"0\\\">\\n\\t\\t      <stop offset=\\\"0%\\\" stop-opacity=\\\"1\\\" stop-color=\\\"#FFB600\\\"/>\\n\\t\\t      <stop offset=\\\"40%\\\" stop-opacity=\\\"1\\\" stop-color=\\\"#FFB600\\\"/>\\n\\t\\t      <stop offset=\\\"40%\\\" stop-opacity=\\\"1\\\" stop-color=\\\"#FFF\\\"/>\\n\\t\\t      <stop offset=\\\"100%\\\" stop-opacity=\\\"1\\\" stop-color=\\\"#FFF\\\"/>\\n\\t\\t  </linearGradient>\\n\\t\\t<circle cx=\\\"15\\\" cy=\\\"15\\\" r=\\\"10\\\"/>\\n\\t</svg>\\n\\t<div class=\\\"fas fa-check hide complete-tick\\\"/>\\n\\t<div class=\\\"overlay hide\\\">\\n\\t\\t<div class=\\\"overlay-message saving\\\">\\n\\t\\t\\t<span class=\\\"spinner-icon\\\"/>&nbsp;&nbsp;Saving...\\n\\t\\t</div>\\n\\t\\t<div class=\\\"overlay-message nodrop\\\">\\n\\t\\t\\t<span class=\\\"fal fa-ban\\\"/>\\n\\t\\t</div>\\n\\t</div>\\n\\t<div class=\\\"connection-line hide \";\noutput += runtime.suppressValue(((lineno = 19, colno = 66, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isLocked\"), \"isLocked\", context, []))?\"locked-connection\":\"\"), env.opts.autoescape);\noutput += \"\\\"/>\\n\\t<div class=\\\"locked-icon \";\noutput += runtime.suppressValue((!(lineno = 20, colno = 48, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isLocked\"), \"isLocked\", context, []))?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t<span class=\\\"fal fa-lock\\\"/>\\n\\t</div>\\n\\t<div class=\\\"lp-node id-\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"_id\"), env.opts.autoescape);\noutput += \"\\\" dropzone>\\n\\t\\t<div class=\\\"edit-node-form row\\\"/>\\n\\t\\t<div class=\\\"node-content\\\"/>\\n\\t\\t<div class=\\\"node-attachments\\\" style=\\\"\";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"isCollapsed\")?\"display: none\":\"\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t<div class=\\\"task-host\\\">\\n\\t\\t\\t\\t<div class=\\\"drop-overlay\\\"><h5 class=\\\"drop-text\\\">Drop files to upload them <span class=\\\"fal fa-cloud-upload\\\"/></h5></div>\\n\\t\\t\\t\\t<div class=\\\"title\\\">Tasks</div>\\n\\t\\t\\t\\t<div class=\\\"fake-content-item hide\\\">Drop here to add a task</div>\\n\\t\\t\\t\\t<div class=\\\"task-placeholder\\\"/>\\n\\t\\t\\t</div>\\n\\t\\t\\t<div class=\\\"resource-host\\\">\\n\\t\\t\\t\\t<div class=\\\"drop-overlay\\\"><h5 class=\\\"drop-text\\\">Drop files to upload them <span class=\\\"fal fa-cloud-upload\\\"/></h5></div>\\n\\t\\t\\t\\t<div class=\\\"title\\\">Additional Resources</div>\\n\\t\\t\\t\\t<div class=\\\"fake-content-item hide\\\">Drop here to add an additional resource</div>\\n\\t\\t\\t\\t<div class=\\\"resource-placeholder\\\"/>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t\\t<span title=\\\"Add section\\\" class=\\\"fal fa-plus add-child-node\\\"/>\\n\\t\\t<div class=\\\"errors\\\"></div>\\n\\t</div>\\n\\t<div class=\\\"droppable\\\">\\n\\t\\t<div class=\\\"indicator sibling\\\">\\n\\t\\t\\t<span class=\\\"fas fa-play\\\"/>\\n\\t\\t</div>\\n\\t</div>\\n\\t<div class=\\\"child-nodes-container\\\" style=\\\"\";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"isCollapsed\")?\"display: none\":\"\"), env.opts.autoescape);\noutput += \"\\\"/>\\n\\t<div class=\\\"side-line\\\"></div>\\n\\t<div class=\\\"lock-line \";\noutput += runtime.suppressValue((!(lineno = 50, colno = 46, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isLocked\"), \"isLocked\", context, []))?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\"></div>\\n\\t<div class=\\\"checkbox\\\">\\n\\t\\t<input type=\\\"checkbox\\\"/>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar learningPathNode_oldRoot = learningPathNode_obj.root;\nlearningPathNode_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlearningPathNode_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar lpNodeContent_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"depth\") == 1) {\noutput += \"\\n\\t\\t<img src=\\\"/unity/images/brain\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"mbe_score\"), env.opts.autoescape);\noutput += \".png\\\" class=\\\"mbe-brain\\\"\\n\\t\\t\\t >\\n\\t\";\n;\n}\noutput += \"\\n\\t<div class=\\\"title-container\\\">\\n\\t\\t<div class=\\\"left-section\\\">\\n\\t\\t\\t<span class=\\\"collapse-control fal \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"isCollapsed\")?\"fa-chevron-down\":\"fa-chevron-up\"), env.opts.autoescape);\noutput += \"  \";\noutput += runtime.suppressValue((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"childNodes\")),\"length\") == 0 && runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"attachments\")),\"length\") == 0 && !runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"description\")),\"length\")?\"disabled\":\"\"), env.opts.autoescape);\noutput += \"\\\"/>\\n\\t\\t\\t<div class=\\\"info-container\\\">\\n\\t\\t\\t\\t<div draggable=\\\"true\\\" class=\\\"title\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"e\").call(context, runtime.contextOrFrameLookup(context, frame, \"title\")), env.opts.autoescape);\noutput += \" <span class=\\\"lock-indicator fal fa-lock \";\noutput += runtime.suppressValue((!(lineno = 9, colno = 115, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isLocked\"), \"isLocked\", context, []))?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\"/> <span class=\\\"visibility-indicator fal fa-eye-slash \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"visible\")?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\"/></div>\\n\\t\\t\\t\\t<div class=\\\"pages hide\\\"><span class=\\\"fal fa-book\\\"></span> Page \";\noutput += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"pageRangeDisplay\")),0), env.opts.autoescape);\noutput += \" &mdash; \";\noutput += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"pageRangeDisplay\")),1), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"controls\\\">\\n\\t\\t\\t\";\nif((env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"learningPaths\")),\"canEdit\")))) {\noutput += \"\\n\\t\\t\\t<span class=\\\"options-btn fal fa-cog \";\noutput += runtime.suppressValue((!runtime.contextOrFrameLookup(context, frame, \"editingAllowed\")?\"hide\":\"\"), env.opts.autoescape);\noutput += \" transparent\\\" data-tippy-content=\\\"Options\\\"/>\\n\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t</div>\\n\\t\\t<div class=\\\"toolbar hide\\\">\\n\\t\\t\\t<a href=\\\"#\\\" data-item=\\\"edit\\\"><i class=\\\"fal fa-pencil\\\" title=\\\"Edit\\\"></i></a>\\n\\t\\t\\t<a href=\\\"#\\\" data-item=\\\"tags\\\"><i class=\\\"fal fa-tag\\\" title=\\\"Tags\\\"></i></a>\\n\\t\\t\\t<a href=\\\"#\\\" data-item=\\\"visibility\\\"><i class=\\\"fal \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"visible\")?\"fa-eye\":\"fa-eye-slash\"), env.opts.autoescape);\noutput += \"\\\" title=\\\"\";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"visible\")?\"Hide\":\"Show\"), env.opts.autoescape);\noutput += \"\\\"></i></a>\\n\\t\\t\\t<a href=\\\"#\\\" data-item=\\\"delete\\\"><i class=\\\"fal fa-trash-alt\\\" title=\\\"Delete\\\"></i></a>\\n\\t\\t</div>\\n\\t</div>\\n\\t<div class=\\\"node-body-container\\\" style=\\\"\";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"isCollapsed\")?\"display: none\":\"\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t<div class=\\\"description-container\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"replace\").call(context, env.getFilter(\"escape\").call(context, (lineno = 26, colno = 49, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"description\"), \"description\", context, []))),\"\\n\",\"<br/>\"), env.opts.autoescape);\noutput += \"<div class=\\\"more-desc \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"descLength\") < runtime.contextOrFrameLookup(context, frame, \"maxDescLength\")?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\"> ...more</div></div>\\n\\t\\t<div class=\\\"activation-container \";\noutput += runtime.suppressValue((!(lineno = 27, colno = 67, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"hasActivationDate\"), \"hasActivationDate\", context, []))?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\"><strong>Locked until: </strong> \";\noutput += runtime.suppressValue((lineno = 27, colno = 125, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"printActivationDate\"), \"printActivationDate\", context, [])), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t<div class=\\\"tags\\\">\\n\\t\\t\\t\";\nframe = frame.push();\nvar t_3 = runtime.contextOrFrameLookup(context, frame, \"tagList\");\nif(t_3) {var t_2 = t_3.length;\nfor(var t_1=0; t_1 < t_3.length; t_1++) {\nvar t_4 = t_3[t_1];\nframe.set(\"tag\", t_4);\nframe.set(\"loop.index\", t_1 + 1);\nframe.set(\"loop.index0\", t_1);\nframe.set(\"loop.revindex\", t_2 - t_1);\nframe.set(\"loop.revindex0\", t_2 - t_1 - 1);\nframe.set(\"loop.first\", t_1 === 0);\nframe.set(\"loop.last\", t_1 === t_2 - 1);\nframe.set(\"loop.length\", t_2);\noutput += \"\\n\\t\\t\\t\\t<div class=\\\"tag\\\" style=\\\"background-color: #\";\noutput += runtime.suppressValue(runtime.memberLookup((t_4),\"colour\"), env.opts.autoescape);\noutput += \"; color: #\";\noutput += runtime.suppressValue((lineno = 30, colno = 81, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"getContrast\"), \"getContrast\", context, [runtime.memberLookup((t_4),\"colour\")])), env.opts.autoescape);\noutput += \"\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.memberLookup((t_4),\"label\")), env.opts.autoescape);\noutput += \"<div class=\\\"fal fa-times remover\\\" data-id=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_4),\"tag_id\"), env.opts.autoescape);\noutput += \"\\\"/></div>\\n\\t\\t\\t\";\n;\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar lpNodeContent_oldRoot = lpNodeContent_obj.root;\nlpNodeContent_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlpNodeContent_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar lpNodeEdit_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"inline-children spread-items\\\">\\n\\t\\t<input type=\\\"text\\\" name=\\\"title\\\" class=\\\"title\\\" placeholder=\\\"Title\\\" value=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"title\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t<div class=\\\"controls\\\">\\n\\t\\t\\t<span class=\\\"options-btn fal fa-cog \";\noutput += runtime.suppressValue((!runtime.contextOrFrameLookup(context, frame, \"editingAllowed\")?\"hide\":\"\"), env.opts.autoescape);\noutput += \" transparent\\\" data-tippy-content=\\\"Options\\\"/>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"toolbar hide\\\">\\n\\t\\t\\t<a href=\\\"#\\\" data-item=\\\"tags\\\"><i class=\\\"fal fa-tag\\\" title=\\\"Tags\\\"></i></a>\\n\\t\\t\\t<a href=\\\"#\\\" data-item=\\\"visibility\\\"><i class=\\\"fal \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"visible\")?\"fa-eye\":\"fa-eye-slash\"), env.opts.autoescape);\noutput += \"\\\" title=\\\"\";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"visible\")?\"Hide\":\"Show\"), env.opts.autoescape);\noutput += \"\\\"></i></a>\\n\\t\\t\\t\";\nif(!(lineno = 9, colno = 16, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isNew\"), \"isNew\", context, []))) {\noutput += \"\\n\\t\\t\\t\\t<a href=\\\"#\\\" data-item=\\\"delete\\\"><i class=\\\"fal fa-trash-alt\\\" title=\\\"Delete\\\"></i></a>\\n\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t</div>\\n\\t</div>\\n\\t<div class=\\\"inline-children\\\">\\n\\t\\t<a href=\\\"#\\\" class=\\\"book-link-btn hide\\\">Link to section in book&nbsp;&nbsp;<span class=\\\"fal fa-link\\\" /></a>\\n\\t\\t<span class=\\\"linked-book hide\\\"><b>Linked to:</b> <span class=\\\"book-title\\\"></span></span>\\n\\t\\t<div class=\\\"linked-book-spinner\\\"><span class=\\\"spinner-icon spinner-small\\\"/>&nbsp;&nbsp;Querying book information...</div>\\n\\t\\t<div class=\\\"linked-book-error hide\\\"><span class=\\\"fal fa-exclamation-triangle\\\"/>&nbsp;&nbsp;<span>There was an error retrieving the existing page information for this book. Click here to try again.</span></div>\\n\\t</div>\\n\\t<div class=\\\"inline-children page-range hide\\\">\\n\\t\\t<span>From page&nbsp;&nbsp;</span>\\n\\t\\t<select name=\\\"pageStart\\\" class=\\\"pages\\\" placeholder=\\\"Start\\\" value=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"pageRange\")),0), env.opts.autoescape);\noutput += \"\\\">\";\noutput += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"pageRangeDisplay\")),0), env.opts.autoescape);\noutput += \"</select>\\n\\t\\t<span>&nbsp;&nbsp;&nbsp;to&nbsp;&nbsp;&nbsp;</span>\\n\\t\\t<select name=\\\"pageEnd\\\" class=\\\"pages\\\" placeholder=\\\"End\\\" value=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"pageRange\")),1), env.opts.autoescape);\noutput += \"\\\">\";\noutput += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"pageRangeDisplay\")),1), env.opts.autoescape);\noutput += \"</select>\\n\\t</div>\\n\\t<div>\\n\\t\\t<textarea rows=\\\"3\\\" name=\\\"description\\\" placeholder=\\\"Add description\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"description\"), env.opts.autoescape);\noutput += \"</textarea>\\n\\t</div>\\n\\t<label><input type=\\\"checkbox\\\" name=\\\"locked\\\" \";\noutput += runtime.suppressValue(((lineno = 29, colno = 67, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isLocked\"), \"isLocked\", context, []))?\"checked\":\"\"), env.opts.autoescape);\noutput += \" \";\noutput += runtime.suppressValue(((lineno = 29, colno = 100, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isParentLocked\"), \"isParentLocked\", context, []))?\"disabled\":\"\"), env.opts.autoescape);\noutput += \"/> Lock</label>\\n\\t<div class=\\\"inline-children datetime \";\noutput += runtime.suppressValue((!(lineno = 30, colno = 61, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isLocked\"), \"isLocked\", context, []))?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t<span>Unlock date:</span>\\n\\t\\t<input type=\\\"text\\\" class=\\\"date\\\" name=\\\"date\\\" placeholder=\\\"Date\\\" \";\noutput += runtime.suppressValue(((lineno = 32, colno = 94, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isParentLocked\"), \"isParentLocked\", context, []))?\"disabled\":\"\"), env.opts.autoescape);\noutput += \">\\n\\t\\t<input type=\\\"text\\\" class=\\\"time\\\" name=\\\"time\\\" placeholder=\\\"Time\\\" \";\noutput += runtime.suppressValue(((lineno = 33, colno = 94, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isParentLocked\"), \"isParentLocked\", context, []))?\"disabled\":\"\"), env.opts.autoescape);\noutput += \">\\n\\t\\t<div class=\\\"clearer clearActivation \";\noutput += runtime.suppressValue(((lineno = 34, colno = 63, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isParentLocked\"), \"isParentLocked\", context, []))?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\">remove</div>\\n\\t</div>\\n\\t<div class=\\\"tags\\\">\\n\\t\\t\";\nframe = frame.push();\nvar t_3 = runtime.contextOrFrameLookup(context, frame, \"tagList\");\nif(t_3) {var t_2 = t_3.length;\nfor(var t_1=0; t_1 < t_3.length; t_1++) {\nvar t_4 = t_3[t_1];\nframe.set(\"tag\", t_4);\nframe.set(\"loop.index\", t_1 + 1);\nframe.set(\"loop.index0\", t_1);\nframe.set(\"loop.revindex\", t_2 - t_1);\nframe.set(\"loop.revindex0\", t_2 - t_1 - 1);\nframe.set(\"loop.first\", t_1 === 0);\nframe.set(\"loop.last\", t_1 === t_2 - 1);\nframe.set(\"loop.length\", t_2);\noutput += \"\\n\\t\\t\\t<div class=\\\"tag\\\" style=\\\"background-color: #\";\noutput += runtime.suppressValue(runtime.memberLookup((t_4),\"colour\"), env.opts.autoescape);\noutput += \"; color: #\";\noutput += runtime.suppressValue((lineno = 38, colno = 80, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"getContrast\"), \"getContrast\", context, [runtime.memberLookup((t_4),\"colour\")])), env.opts.autoescape);\noutput += \"\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.memberLookup((t_4),\"label\")), env.opts.autoescape);\noutput += \"<div class=\\\"fal fa-times remover\\\" data-id=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_4),\"tag_id\"), env.opts.autoescape);\noutput += \"\\\"/></div>\\n\\t\\t\";\n;\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t</div>\\n\\t<div class=\\\"form-footer\\\">\\n\\t\\t<button type=\\\"button\\\" class=\\\"button success save save-node-edit-btn\\\">Save</button>\\n\\t\\t<div/>\\n\\t\\t<button type=\\\"button\\\" class=\\\"button secondary cancel cancel-node-edit-btn\\\">Cancel</button>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar lpNodeEdit_oldRoot = lpNodeEdit_obj.root;\nlpNodeEdit_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlpNodeEdit_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar resourceNode_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"overlay hide\\\">\\n\\t\\t<div class=\\\"saving overlay-message\\\">\\n\\t\\t\\t<span class=\\\"spinner-icon spinner-small\\\"/>&nbsp;&nbsp;<span>Saving...</span>\\n\\t\\t</div>\\n\\t</div>\\n\\t<div class=\\\"checkbox\\\">\\n\\t\\t<input type=\\\"checkbox\\\"/>\\n\\t</div>\\n\\t<div class=\\\"resource-info \";\nif(runtime.contextOrFrameLookup(context, frame, \"_id\")) {\noutput += \"id-\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"_id\"), env.opts.autoescape);\n;\n}\noutput += \"\\\">\\n\\t\\t<div class=\\\"top\\\">\\n\\t\\t\\t<div class=\\\"info \";\noutput += runtime.suppressValue(((lineno = 11, colno = 44, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"hasError\"), \"hasError\", context, []))?\"has-error\":\"\"), env.opts.autoescape);\noutput += \"\\\" draggable=\\\"true\\\">\\n\\t\\t\\t\\t<img src=\\\"/unity/images/content/annotation_\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"resourceType\"), env.opts.autoescape);\noutput += \".png\\\" class=\\\"resource-type\\\">\\n\\t\\t\\t\\t<div class=\\\"resource-title\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"title\")), env.opts.autoescape);\noutput += \"<span class=\\\"progress-indicator fal fa-check \";\noutput += runtime.suppressValue((!(lineno = 13, colno = 117, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"completed\"), \"completed\", context, []))?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\"/> <span class=\\\"lock-indicator fal fa-lock \";\noutput += runtime.suppressValue((!(lineno = 13, colno = 187, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isLocked\"), \"isLocked\", context, []))?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\"/> <span class=\\\"visibility-indicator fal fa-eye-slash \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"visible\")?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\"/></div>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"controls\\\">\\n\\t\\t\\t\\t<span class=\\\"options-btn fal fa-cog \";\noutput += runtime.suppressValue((!(lineno = 17, colno = 66, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"showOptions\"), \"showOptions\", context, []))?\"hide\":\"\"), env.opts.autoescape);\noutput += \" \";\noutput += runtime.suppressValue(((lineno = 17, colno = 89, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"hasError\"), \"hasError\", context, []))?\"hide\":\"\"), env.opts.autoescape);\noutput += \" transparent\\\" data-tippy-content=\\\"Options\\\"/>\\n\\t\\t\\t\\t<span class=\\\"cancel-btn fal fa-times upload-btn hide\\\" data-tippy-content=\\\"Cancel Upload\\\"/>\\n\\t\\t\\t\\t<span class=\\\"error-btn fal fa-exclamation-triangle upload-btn \";\noutput += runtime.suppressValue(((lineno = 19, colno = 81, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"hasError\"), \"hasError\", context, []))?\"\":\"hide\"), env.opts.autoescape);\noutput += \"\\\" data-tippy-content=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"errorMessage\"), env.opts.autoescape);\noutput += \"\\\"/>\\n\\t\\t\\t</div>\\n\\t\\t\\t<div class=\\\"toolbar hide\\\">\\n\\t\\t\\t\\t\";\nif((env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"learningPaths\")),\"canEdit\")))) {\noutput += \"\\n\\t\\t\\t\\t\\t<a href=\\\"#\\\" data-item=\\\"edit\\\"><i class=\\\"fal fa-pencil\\\" title=\\\"Edit\\\"></i></a>\\n\\t\\t\\t\\t\\t<a href=\\\"#\\\" data-item=\\\"tags\\\"><i class=\\\"fal fa-tag\\\" title=\\\"Tags\\\"></i></a>\\n\\t\\t\\t\\t\\t<a href=\\\"#\\\" data-item=\\\"visibility\\\"><i class=\\\"fal \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"visible\")?\"fa-eye\":\"fa-eye-slash\"), env.opts.autoescape);\noutput += \"\\\" title=\\\"\";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"visible\")?\"Hide\":\"Show\"), env.opts.autoescape);\noutput += \"\\\"></i></a>\\n\\t\\t\\t\\t\\t<a href=\\\"#\\\" data-item=\\\"groups\\\"><i class=\\\"fal fa-users-class\\\"></i></a>\\n\\t\\t\\t\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"resourceType\") == \"assessment\") {\noutput += \"\\n\\t\\t\\t\\t\\t\\t<a href=\\\"#\\\" data-item=\\\"code\\\"><i class=\\\"fal fa-key\\\" title=\\\"Show Code\\\"></i></a>\\n\\t\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t<a href=\\\"#\\\" data-item=\\\"chart\\\"><i class=\\\"fal fa-chart-bar\\\" title=\\\"Resource Opened By\\\"></i></a>\\n\\t\\t\\t\\t<a href=\\\"#\\\" data-item=\\\"open\\\"><i class=\\\"fal fa-download\\\" title=\\\"Open Item\\\"></i></a>\\n\\t\\t\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"isTask\")) {\noutput += \"\\n\\t\\t\\t\\t\\t<a href=\\\"#\\\" data-item=\\\"reset\\\"><i class=\\\"fal fa-sync-alt\\\" title=\\\"Reset Progress\\\"></i></a>\\n\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t\";\nif((env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"learningPaths\")),\"canEdit\")))) {\noutput += \"\\n\\t\\t\\t\\t<a href=\\\"#\\\" data-item=\\\"delete\\\"><i class=\\\"fal fa-trash-alt\\\" title=\\\"Delete\\\"></i></a>\\n\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t</div>\\n\\t\\t\\t<div class=\\\"custom-groups hide\\\">\\n\\t\\t\\t\\t<a href=\\\"#\\\" data-item=\\\"custom-groups\\\">\\n\\t\\t\\t\\t\\t\";\nframe = frame.push();\nvar t_3 = runtime.contextOrFrameLookup(context, frame, \"groups\");\nif(t_3) {var t_2 = t_3.length;\nfor(var t_1=0; t_1 < t_3.length; t_1++) {\nvar t_4 = t_3[t_1];\nframe.set(\"groupCode\", t_4);\nframe.set(\"loop.index\", t_1 + 1);\nframe.set(\"loop.index0\", t_1);\nframe.set(\"loop.revindex\", t_2 - t_1);\nframe.set(\"loop.revindex0\", t_2 - t_1 - 1);\nframe.set(\"loop.first\", t_1 === 0);\nframe.set(\"loop.last\", t_1 === t_2 - 1);\nframe.set(\"loop.length\", t_2);\noutput += \"\\n\\t\\t\\t\\t\\t\\t\";\nvar t_5;\nt_5 = runtime.memberLookup((runtime.memberLookup((runtime.memberLookup(((lineno = 43, colno = 27, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"getGroups\"), \"getGroups\", context, []))),\"custom\")),t_4)),\"name\");\nframe.set(\"name\", t_5, true);\nif(frame.topLevel) {\ncontext.setVariable(\"name\", t_5);\n}\nif(frame.topLevel) {\ncontext.addExport(\"name\", t_5);\n}\noutput += \"\\n\\t\\t\\t\\t\\t\\t\";\nif((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"name\")),\"length\") > 0)) {\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t<div class=\\\"custom-group\\\" href=\\\"#\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.memberLookup(((lineno = 45, colno = 51, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"getGroups\"), \"getGroups\", context, []))),\"custom\")),t_4)),\"name\")), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t\\t\";\n;\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t\\t\\t</a>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"activation-container \";\noutput += runtime.suppressValue((!(lineno = 52, colno = 67, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"hasActivationDate\"), \"hasActivationDate\", context, []))?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\"><strong>Locked until: </strong> \";\noutput += runtime.suppressValue((lineno = 52, colno = 124, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"printActivationDate\"), \"printActivationDate\", context, [])), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t<div class=\\\"due-container \";\noutput += runtime.suppressValue((!(lineno = 53, colno = 53, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"hasDueDate\"), \"hasDueDate\", context, []))?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\"><strong>Due on: </strong> \";\noutput += runtime.suppressValue((lineno = 53, colno = 97, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"printDueDate\"), \"printDueDate\", context, [])), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t<div class=\\\"tags \";\noutput += runtime.suppressValue((!runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"tagList\")),\"length\")?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t\";\nframe = frame.push();\nvar t_8 = runtime.contextOrFrameLookup(context, frame, \"tagList\");\nif(t_8) {var t_7 = t_8.length;\nfor(var t_6=0; t_6 < t_8.length; t_6++) {\nvar t_9 = t_8[t_6];\nframe.set(\"tag\", t_9);\nframe.set(\"loop.index\", t_6 + 1);\nframe.set(\"loop.index0\", t_6);\nframe.set(\"loop.revindex\", t_7 - t_6);\nframe.set(\"loop.revindex0\", t_7 - t_6 - 1);\nframe.set(\"loop.first\", t_6 === 0);\nframe.set(\"loop.last\", t_6 === t_7 - 1);\nframe.set(\"loop.length\", t_7);\noutput += \"\\n\\t\\t\\t\\t<div class=\\\"tag\\\" style=\\\"background-color: #\";\noutput += runtime.suppressValue(runtime.memberLookup((t_9),\"colour\"), env.opts.autoescape);\noutput += \"; color: #\";\noutput += runtime.suppressValue((lineno = 56, colno = 81, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"getContrast\"), \"getContrast\", context, [runtime.memberLookup((t_9),\"colour\")])), env.opts.autoescape);\noutput += \"\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.memberLookup((t_9),\"label\")), env.opts.autoescape);\noutput += \"<div class=\\\"fal fa-times remover\\\" data-id=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_9),\"tag_id\"), env.opts.autoescape);\noutput += \"\\\"/></div>\\n\\t\\t\\t\";\n;\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t</div>\\n\\t\\t<div class=\\\"errors\\\"></div>\\n\\t\\t<div class=\\\"upload-progress\\\"><div class=\\\"progress-bar\\\"></div></div>\\n\\t</div>\\n\\t<div class=\\\"edit-resource-form row\\\"/>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar resourceNode_oldRoot = resourceNode_obj.root;\nresourceNode_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tresourceNode_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar resourceNodeEdit_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<label><input type=\\\"checkbox\\\" name=\\\"locked\\\" \";\noutput += runtime.suppressValue(((lineno = 1, colno = 67, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isLocked\"), \"isLocked\", context, []))?\"checked\":\"\"), env.opts.autoescape);\noutput += \" \";\noutput += runtime.suppressValue(((lineno = 1, colno = 100, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isParentLocked\"), \"isParentLocked\", context, []))?\"disabled\":\"\"), env.opts.autoescape);\noutput += \"/> Lock</label>\\n\\t<div class=\\\"inline-children datetime \";\noutput += runtime.suppressValue((!(lineno = 2, colno = 61, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isLocked\"), \"isLocked\", context, []))?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\" \";\noutput += runtime.suppressValue(((lineno = 2, colno = 95, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isParentLocked\"), \"isParentLocked\", context, []))?\"disabled\":\"\"), env.opts.autoescape);\noutput += \">\\n\\t\\t<span>Unlock date: </span>\\n\\t\\t<input type=\\\"text\\\" class=\\\"date\\\" name=\\\"date\\\" placeholder=\\\"Date\\\" \";\noutput += runtime.suppressValue(((lineno = 4, colno = 94, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isParentLocked\"), \"isParentLocked\", context, []))?\"disabled\":\"\"), env.opts.autoescape);\noutput += \">\\n\\t\\t<input type=\\\"text\\\" class=\\\"time\\\" name=\\\"time\\\" placeholder=\\\"Time\\\" \";\noutput += runtime.suppressValue(((lineno = 5, colno = 94, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isParentLocked\"), \"isParentLocked\", context, []))?\"disabled\":\"\"), env.opts.autoescape);\noutput += \">\\n\\t\\t<div class=\\\"clearer clearActivation \";\noutput += runtime.suppressValue(((lineno = 6, colno = 63, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isParentLocked\"), \"isParentLocked\", context, []))?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\">remove</div>\\n\\t</div>\\n\\t<div class=\\\"inline-children due \";\noutput += runtime.suppressValue((!runtime.contextOrFrameLookup(context, frame, \"isTask\")?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t<span>Due date: </span>\\n\\t\\t<input type=\\\"text\\\" class=\\\"date\\\" name=\\\"date\\\" placeholder=\\\"Date\\\">\\n\\t\\t<input type=\\\"text\\\" class=\\\"time\\\" name=\\\"time\\\" placeholder=\\\"Time\\\">\\n\\t\\t<div class=\\\"clearer clearDue\\\">remove</div>\\n\\t</div>\\n\\t<div class=\\\"form-footer\\\">\\n\\t\\t<button type=\\\"button\\\" class=\\\"button success save save-resource-edit-btn\\\">Save</button>\\n\\t\\t<div/>\\n\\t\\t<button type=\\\"button\\\" class=\\\"button secondary cancel cancel-resource-edit-btn\\\">Cancel</button>\\n\\t</div>\\n\\t<div class=\\\"errors\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar resourceNodeEdit_oldRoot = resourceNodeEdit_obj.root;\nresourceNodeEdit_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tresourceNodeEdit_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar tagCreation_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"top\\\">\\n\\t\\t<div class=\\\"title\\\">Create new tag</div>\\n\\t\\t<div class=\\\"close\\\">x</div>\\n\\t</div>\\n\\n\\t<input type=\\\"text\\\" name=\\\"label\\\" placeholder=\\\"Name new tag\\\" maxlength=\\\"40\\\"/>\\n\\n\\t<div class=\\\"colours\\\">\\n\\t\\t\";\nframe = frame.push();\nvar t_3 = runtime.contextOrFrameLookup(context, frame, \"colours\");\nif(t_3) {var t_2 = t_3.length;\nfor(var t_1=0; t_1 < t_3.length; t_1++) {\nvar t_4 = t_3[t_1];\nframe.set(\"col\", t_4);\nframe.set(\"loop.index\", t_1 + 1);\nframe.set(\"loop.index0\", t_1);\nframe.set(\"loop.revindex\", t_2 - t_1);\nframe.set(\"loop.revindex0\", t_2 - t_1 - 1);\nframe.set(\"loop.first\", t_1 === 0);\nframe.set(\"loop.last\", t_1 === t_2 - 1);\nframe.set(\"loop.length\", t_2);\noutput += \"\\n\\t\\t\\t<div style=\\\"background-color: #\";\noutput += runtime.suppressValue(t_4, env.opts.autoescape);\noutput += \"\\\" data-colour=\\\"\";\noutput += runtime.suppressValue(t_4, env.opts.autoescape);\noutput += \"\\\"></div>\\n\\t\\t\";\n;\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t</div>\\n\\n\\t<input type=\\\"color\\\" name=\\\"customColour\\\"/>\\n\\n\\t<div class=\\\"buttons\\\">\\n\\t\\t<button class=\\\"button small success\\\" name=\\\"save\\\">Create</button>\\n\\t\\t<button class=\\\"button small secondary\\\" name=\\\"cancel\\\">Cancel</button>\\n\\t</div>\\n\\t<div class=\\\"errors\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar tagCreation_oldRoot = tagCreation_obj.root;\ntagCreation_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\ttagCreation_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar draggingElement_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"category\") == \"attachment\") {\noutput += \"\\n\\t\\t<img src=\\\"/unity/images/content/annotation_\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"resourceType\"), env.opts.autoescape);\noutput += \".png\\\" class=\\\"dragging-resource-type\\\">\\n\\t\";\n;\n}\noutput += \"\\n\\t<span class=\\\"dragging-title\\\"></span>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"title\"), env.opts.autoescape);\noutput += \"\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar draggingElement_oldRoot = draggingElement_obj.root;\ndraggingElement_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tdraggingElement_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"learningPathNode\": new nunjucks.Template( {obj: learningPathNode_obj, type: \"code\"}, env),\t\"lpNodeContent\": new nunjucks.Template( {obj: lpNodeContent_obj, type: \"code\"}, env),\t\"lpNodeEdit\": new nunjucks.Template( {obj: lpNodeEdit_obj, type: \"code\"}, env),\t\"resourceNode\": new nunjucks.Template( {obj: resourceNode_obj, type: \"code\"}, env),\t\"resourceNodeEdit\": new nunjucks.Template( {obj: resourceNodeEdit_obj, type: \"code\"}, env),\t\"tagCreation\": new nunjucks.Template( {obj: tagCreation_obj, type: \"code\"}, env),\t\"draggingElement\": new nunjucks.Template( {obj: draggingElement_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar content_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\n\\t<div class=\\\"form-container\\\">\\n\\t\\t<div class=\\\"form-label\\\">\\n\\t\\t\\t<span>Choose a template</span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"template-container\\\">\\n\\t\\t\\t<div class=\\\"template template-blank\\\">\\n\\t\\t\\t\\t<span class=\\\"fal fa-file\\\"></span>\\n\\t\\t\\t\\t<span class=\\\"template-label\\\">Blank</span>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"template template-existing\\\">\\n\\t\\t\\t\\t<span class=\\\"fal fa-copy\\\"></span>\\n\\t\\t\\t\\t<span class=\\\"template-label\\\">Clone existing</span>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"template template-book\\\">\\n\\t\\t\\t\\t<span class=\\\"fal fa-align-justify\\\"></span>\\n\\t\\t\\t\\t<span class=\\\"template-label\\\">From book TOC</span>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"template template-calendar\\\">\\n\\t\\t\\t\\t<span class=\\\"fal fa-calendar\\\"></span>\\n\\t\\t\\t\\t<span class=\\\"template-label\\\">Calendar</span>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"blank-container hide\\\">\\n\\t\\t\\t<span>Wipe all existing data and start with a blank canvas on which you can create content from scratch.</span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"lp-chooser-container hide\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"book-chooser-container hide\\\">\\n\\t\\t\\t<span>Choose a book to create content based on the book's table of contents.</span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"calendar-container hide\\\">\\n\\t\\t\\t<p>Wipe all existing data and create a blank calendar for the year.</p>\\n\\n\\t\\t\\t<label>&nbsp;&nbsp;&nbsp;\\n\\t\\t\\t\\t<input type=\\\"radio\\\" name=\\\"calendarType\\\" id=\\\"weeks\\\" value=\\\"weeks\\\" checked> Individual sections for months, with sub-sections for weeks.\\n\\t\\t\\t</label>\\n\\t\\t\\t<label>&nbsp;&nbsp;&nbsp;\\n\\t\\t\\t\\t<input type=\\\"radio\\\" name=\\\"calendarType\\\" id=\\\"threeTerms\\\" value=\\\"threeTerms\\\"> Individual sections for three terms.\\n\\t\\t\\t</label>\\n\\t\\t\\t<label>&nbsp;&nbsp;&nbsp;\\n\\t\\t\\t\\t<input type=\\\"radio\\\" name=\\\"calendarType\\\" id=\\\"fourTerms\\\" value=\\\"fourTerms\\\"> Individual sections for four terms.\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar content_oldRoot = content_obj.root;\ncontent_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcontent_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"content\": new nunjucks.Template( {obj: content_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div id=\\\"tree-controls\\\">\\n\\t<div class=\\\"cam-btn-container\\\"></div>\\n\\t<div id=\\\"left-section\\\" class=\\\"invisible\\\">\\n\\t\\t<div class=\\\"view-mode\\\">\\n\\t\\t\\t<select name=\\\"view-user\\\"></select>\\n\\t\\t</div>\\n\\t</div>\\n\\t<div id=\\\"centre-section\\\">\\n\\t\\t<div class=\\\"setup unknown\\\"><span class=\\\"fal fa-infinity\\\"></span>&nbsp;&nbsp;Initialising realtime connection...</div>\\n\\t\\t<div class=\\\"warn connectionLost hide\\\"><span class=\\\"fal fa-wifi-slash\\\"></span>&nbsp;&nbsp;Connectivity lost. Changes cannot be made while offline.</div>\\n\\t\\t<div class=\\\"warn locked hide\\\"><span class=\\\"fal fa-lock\\\"></span>&nbsp;&nbsp;Learning path is locked for editing by <span class=\\\"ownerNames\\\"></span>. <span class=\\\"accessControllers\\\"><span class=\\\"requestAccess\\\">Request Control</span>\";\nif(env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"learningPaths\")),\"steal\"))) {\noutput += \" or <span class=\\\"stealAccess\\\">Take Control</span>\";\n;\n}\noutput += \"</span><span class=\\\"accessPause hide\\\">Waiting for response...</span></div>\\n\\t\\t<div class=\\\"warn selfLocked hide\\\"><span class=\\\"fal fa-lock\\\"></span>&nbsp;&nbsp;Learning path locked because <strong>you</strong> have this learning path open in another window.</div>\\n\\t</div>\\n\\t<div id=\\\"right-section\\\" class=\\\"invisible\\\">\\n\\t\\t\";\nif((env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"learningPaths\")),\"canEdit\")))) {\noutput += \"\\n\\t\\t<button type=\\\"button\\\" class=\\\"button reset-format-btn\\\"><span class=\\\"fal fa-sync-alt\\\"></span> Reset Format</button>\\n\\t\\t<button type=\\\"button\\\" class=\\\"button import-book-btn\\\"><span class=\\\"fal fa-arrow-alt-to-bottom\\\"></span> Import book topics</button>\\n\\t\\t<button type=\\\"button\\\" class=\\\"button add-section-btn\\\"><span class=\\\"fal fa-plus\\\"></span> Add new section</button>\\n\\t\\t\";\n;\n}\noutput += \"\\n\\t</div>\\n\\n\\t<div class=\\\"multiselect\\\">\\n\\t\\t<div class=\\\"multileft\\\"></div>\\n\\t\\t<div class=\\\"multicentre\\\">\\n\\t\\t\\t<div class=\\\"hider\\\"><span class=\\\"fal fa-eye-slash\\\"/></div>\\n\\t\\t\\t<div class=\\\"show\\\"><span class=\\\"fal fa-eye\\\"/></div>\\n\\t\\t\\t<div class=\\\"tags\\\"><span class=\\\"fal fa-tag\\\"/></div>\\n\\t\\t\\t<div class=\\\"delete\\\"><span class=\\\"fal fa-trash-alt\\\"/></div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"multiright\\\">\\n\\t\\t\\t<div class=\\\"cancel\\\">Cancel</div>\\n\\t\\t</div>\\n\\t</div>\\n</div>\\n<div class=\\\"tree-host\\\">\\n\\t<div class=\\\"view-overlay\\\">\\n\\t\\t<span>Select a user to view their \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"learningPathsCustomName\"), env.opts.autoescape);\noutput += \" progress</span>\\n\\t</div>\\n\\t<div class=\\\"tree\\\"></div>\\n\\t<div class=\\\"cancel-drop hide\\\">\\n\\t\\t<p><span class=\\\"fal fa-trash-alt\\\"></span>Don't&nbspUpload</p>\\n\\t</div>\\n</div>\\n\\n<div id=\\\"lp-overlay\\\">\\n\\t<div class=\\\"notifications\\\">\\n\\t\\t<div class=\\\"red groups hide\\\">\\n\\t\\t\\t<span>\\n\\t\\t\\t\\t<span class=\\\"fal fa-exclamation-circle\\\"/> Not all global groups are currently selected for attachments (click here if you need to change group allocations)\\n\\t\\t\\t</span>\\n\\t\\t</div>\\n\\t</div>\\n</div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar regions_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"nav-header\\\">\\n\\t\\t<label class=\\\"search-box\\\">\\n\\t\\t\\t<div class=\\\"fal fa-search\\\"></div>\\n\\t\\t\\t<input type=\\\"text\\\" placeholder=\\\"Search for topics or text...\\\" required title=\\\" \\\"/>\\n\\t\\t\\t<div class=\\\"input-overlay fal fa-times\\\" title=\\\"Clear field\\\"/>\\n\\t\\t</label>\\n\\t\\t<span class=\\\"fal fa-times hide\\\" title=\\\"Close navigation pane\\\">&nbsp;</span>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar regions_oldRoot = regions_obj.root;\nregions_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tregions_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar body_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t\";\nvar macro_t_1 = runtime.makeMacro(\n[\"main\", \"prefix\"], \n[], \nfunction (l_main, l_prefix, kwargs) {\nframe = frame.push();\nkwargs = kwargs || {};\nif (kwargs.hasOwnProperty(\"caller\")) {\nframe.set(\"caller\", kwargs.caller); }\nframe.set(\"main\", l_main);\nframe.set(\"prefix\", l_prefix);\nvar t_2 = \"\";t_2 += \"\\n\\t\\t<div class=\\\"lpNav \";\nt_2 += runtime.suppressValue((!l_prefix?\"\":\"level-indent\"), env.opts.autoescape);\nt_2 += \"\\\">\\n\\t\\t\";\nframe = frame.push();\nvar t_5 = l_main;\nif(t_5) {var t_4 = t_5.length;\nfor(var t_3=0; t_3 < t_5.length; t_3++) {\nvar t_6 = t_5[t_3];\nframe.set(\"item\", t_6);\nframe.set(\"loop.index\", t_3 + 1);\nframe.set(\"loop.index0\", t_3);\nframe.set(\"loop.revindex\", t_4 - t_3);\nframe.set(\"loop.revindex0\", t_4 - t_3 - 1);\nframe.set(\"loop.first\", t_3 === 0);\nframe.set(\"loop.last\", t_3 === t_4 - 1);\nframe.set(\"loop.length\", t_4);\nt_2 += \"\\n\\t\\t\\t\";\nif(runtime.memberLookup((t_6),\"attributes\")) {\nt_2 += \"\\n\\t\\t\\t\\t\";\nt_6 = runtime.memberLookup((t_6),\"attributes\");\nframe.set(\"item\", t_6, true);\nif(frame.topLevel) {\ncontext.setVariable(\"item\", t_6);\n}\nif(frame.topLevel) {\ncontext.addExport(\"item\", t_6);\n}\nt_2 += \"\\n\\t\\t\\t\";\n;\n}\nt_2 += \"\\n\\t\\t\\t<div data-tag=\\\"\";\nt_2 += runtime.suppressValue(l_prefix + runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"loop\")),\"index0\"), env.opts.autoescape);\nt_2 += \"\\\" data-id=\\\".id-\";\nt_2 += runtime.suppressValue(runtime.memberLookup((t_6),\"_id\"), env.opts.autoescape);\nt_2 += \"\\\" draggable=\\\"true\\\" class=\\\"item lpNav\\\"><span class=\\\"fal fa-circle\\\"/> <a href=\\\"#\\\">\";\nt_2 += runtime.suppressValue(env.getFilter(\"e\").call(context, (runtime.memberLookup((t_6),\"title\") || \"[Title Placeholder]\")), env.opts.autoescape);\nt_2 += \"</a></div>\\n\\t\\t\\t\";\nvar t_7;\nt_7 = (lineno = 8, colno = 25, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"values\"), \"values\", context, [runtime.memberLookup((t_6),\"children\")]));\nframe.set(\"children\", t_7, true);\nif(frame.topLevel) {\ncontext.setVariable(\"children\", t_7);\n}\nif(frame.topLevel) {\ncontext.addExport(\"children\", t_7);\n}\nt_2 += \"\\n\\t\\t\\t\";\nif(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"children\")),\"length\") > 0) {\nt_2 += \"\\n\\t\\t\\t\\t\";\nt_2 += runtime.suppressValue((lineno = 10, colno = 11, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"render\"), \"render\", context, [runtime.contextOrFrameLookup(context, frame, \"children\"),l_prefix + runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"loop\")),\"index0\") + \".\"])), env.opts.autoescape);\nt_2 += \"\\n\\t\\t\\t\";\n;\n}\nt_2 += \"\\n\\t\\t\";\n;\n}\n}\nframe = frame.pop();\nt_2 += \"\\n\\t\\t</div>\\n\\t\";\n;\nframe = frame.pop();\nreturn new runtime.SafeString(t_2);\n});\ncontext.addExport(\"render\");\ncontext.setVariable(\"render\", macro_t_1);\noutput += \"\\n\\n\\t<div class=\\\"title\\\">Learning Path Navigation</div>\\n\\t<div class=\\\"content\\\">\\n\\t\\t\";\noutput += runtime.suppressValue((lineno = 18, colno = 9, runtime.callWrap(macro_t_1, \"render\", context, [runtime.contextOrFrameLookup(context, frame, \"nodes\"),\"\"])), env.opts.autoescape);\noutput += \"\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar body_oldRoot = body_obj.root;\nbody_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tbody_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar page_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\tPage \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"page\"), env.opts.autoescape);\noutput += \"\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar page_oldRoot = page_obj.root;\npage_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tpage_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"regions\": new nunjucks.Template( {obj: regions_obj, type: \"code\"}, env),\t\"body\": new nunjucks.Template( {obj: body_obj, type: \"code\"}, env),\t\"page\": new nunjucks.Template( {obj: page_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar regions_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"nav-header\\\">\\n\\t\\t<label class=\\\"search-box\\\">\\n\\t\\t\\t<div class=\\\"fal fa-search\\\"></div>\\n\\t\\t\\t<input type=\\\"text\\\" placeholder=\\\"Search for page or text...\\\" required title=\\\" \\\"/>\\n\\t\\t\\t<div class=\\\"input-overlay fal fa-times\\\" title=\\\"Clear field\\\"/>\\n\\t\\t</label>\\n\\t\\t<span class=\\\"fal fa-times hide\\\" title=\\\"Close navigation pane\\\">&nbsp;</span>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar regions_oldRoot = regions_obj.root;\nregions_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tregions_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar pages_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"title\\\">Pages</div>\\n\\t<div class=\\\"content\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar pages_oldRoot = pages_obj.root;\npages_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tpages_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar body_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t\";\nvar macro_t_1 = runtime.makeMacro(\n[\"main\", \"prefix\"], \n[], \nfunction (l_main, l_prefix, kwargs) {\nframe = frame.push();\nkwargs = kwargs || {};\nif (kwargs.hasOwnProperty(\"caller\")) {\nframe.set(\"caller\", kwargs.caller); }\nframe.set(\"main\", l_main);\nframe.set(\"prefix\", l_prefix);\nvar t_2 = \"\";t_2 += \"\\n\\t\\t<div class=\\\"pdfNav \";\nt_2 += runtime.suppressValue((!l_prefix?\"\":\"level-indent\"), env.opts.autoescape);\nt_2 += \"\\\">\\n\\t\\t\";\nframe = frame.push();\nvar t_5 = l_main;\nif(t_5) {var t_4 = t_5.length;\nfor(var t_3=0; t_3 < t_5.length; t_3++) {\nvar t_6 = t_5[t_3];\nframe.set(\"item\", t_6);\nframe.set(\"loop.index\", t_3 + 1);\nframe.set(\"loop.index0\", t_3);\nframe.set(\"loop.revindex\", t_4 - t_3);\nframe.set(\"loop.revindex0\", t_4 - t_3 - 1);\nframe.set(\"loop.first\", t_3 === 0);\nframe.set(\"loop.last\", t_3 === t_4 - 1);\nframe.set(\"loop.length\", t_4);\nt_2 += \"\\n\\t\\t\\t<div data-tag=\\\"\";\nt_2 += runtime.suppressValue(l_prefix + runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"loop\")),\"index0\"), env.opts.autoescape);\nt_2 += \"\\\" draggable=\\\"true\\\" class=\\\"item pdfNav\\\"><span class=\\\"fal fa-circle\\\"/> <a href=\\\"#\\\">\";\nt_2 += runtime.suppressValue(env.getFilter(\"replace\").call(context, runtime.memberLookup((t_6),\"title\"),\"&#0;\",\"\"), env.opts.autoescape);\nt_2 += \"</a></div>\\n\\n\\t\\t\\t\";\nif(runtime.memberLookup((runtime.memberLookup((t_6),\"items\")),\"length\") > 0) {\nt_2 += \"\\n\\t\\t\\t\\t\";\nt_2 += runtime.suppressValue((lineno = 7, colno = 11, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"render\"), \"render\", context, [runtime.memberLookup((t_6),\"items\"),l_prefix + runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"loop\")),\"index0\") + \".\"])), env.opts.autoescape);\nt_2 += \"\\n\\t\\t\\t\";\n;\n}\nt_2 += \"\\n\\t\\t\";\n;\n}\n}\nframe = frame.pop();\nt_2 += \"\\n\\t\\t</div>\\n\\t\";\n;\nframe = frame.pop();\nreturn new runtime.SafeString(t_2);\n});\ncontext.addExport(\"render\");\ncontext.setVariable(\"render\", macro_t_1);\noutput += \"\\n\\n\\t<div class=\\\"title\\\">Table of Contents</div>\\n\\t<div class=\\\"content\\\">\\n\\t\\t\";\noutput += runtime.suppressValue((lineno = 15, colno = 9, runtime.callWrap(macro_t_1, \"render\", context, [runtime.contextOrFrameLookup(context, frame, \"pages\"),\"\"])), env.opts.autoescape);\noutput += \"\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar body_oldRoot = body_obj.root;\nbody_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tbody_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar page_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\tPage \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"title\"), env.opts.autoescape);\noutput += \"\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar page_oldRoot = page_obj.root;\npage_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tpage_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"regions\": new nunjucks.Template( {obj: regions_obj, type: \"code\"}, env),\t\"pages\": new nunjucks.Template( {obj: pages_obj, type: \"code\"}, env),\t\"body\": new nunjucks.Template( {obj: body_obj, type: \"code\"}, env),\t\"page\": new nunjucks.Template( {obj: page_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar content_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"modal-title\\\">\\n\\t\\t<span class=\\\"fal fa-chart-bar\\\"/>&nbsp;&nbsp;Resource opened by:</span>\\n\\t\\t<span class=\\\"fal fa-times close-btn\\\" title=\\\"Close\\\"/>\\n\\t\\t<span class=\\\"fal fa-redo refresh-btn\\\" title=\\\"Refresh\\\"/>\\n\\t</div>\\n\\n\\t<div class=\\\"modal-body\\\">\\n\\t\\t<div class=\\\"row form-container\\\">\\n\\t\\t\\t<div class=\\\"status-region\\\"></div>\\n\\t\\t\\t<div class=\\\"list-container hide\\\">\\n\\t\\t\\t\\t<div class=\\\"list-region\\\">\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar content_oldRoot = content_obj.root;\ncontent_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcontent_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar listEmpty_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span></span>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar listEmpty_oldRoot = listEmpty_obj.root;\nlistEmpty_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlistEmpty_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar listItem_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"firstname\"), env.opts.autoescape);\noutput += \" \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"surname\"), env.opts.autoescape);\noutput += \"</span>\\n\\t<span><a class=\\\"fas fa-circle status opened-status \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"opened\")?\"opened\":\"\"), env.opts.autoescape);\noutput += \"\\\" data-username=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"username\"), env.opts.autoescape);\noutput += \"\\\"></a></span>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar listItem_oldRoot = listItem_obj.root;\nlistItem_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlistItem_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"content\": new nunjucks.Template( {obj: content_obj, type: \"code\"}, env),\t\"listEmpty\": new nunjucks.Template( {obj: listEmpty_obj, type: \"code\"}, env),\t\"listItem\": new nunjucks.Template( {obj: listItem_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar loadingStatus_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span class=\\\"spinner-icon spinner-small\\\"/>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar loadingStatus_oldRoot = loadingStatus_obj.root;\nloadingStatus_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tloadingStatus_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar regions_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"status-container\\\">\\n\\t\\t<span class=\\\"spinner-icon\\\"/>\\n\\t\\t<span>Loading resources.</span>\\n\\t\\t<span>This may take a while if there are many resources to load.</span>\\n\\t</div>\\n\\n\\t<div class=\\\"top-region hide\\\">\\n\\t\\t<span class=\\\"fal fa-undo control-button clear-filters\\\" title=\\\"Reset filters\\\"></span>\\n\\t\\t<span class=\\\"fal fa-times control-button close\\\" title=\\\"Close\\\"></span>\\n\\t</div>\\n\\n\\t<div class=\\\"filter-region hide\\\"></div>\\n\\n\\t<div class=\\\"list-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar regions_oldRoot = regions_obj.root;\nregions_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tregions_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar item_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"label-region\\\">\\n\\t\\t<div class=\\\"label-container\\\">\\n\\t\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"contentIcons\") == \"img\") {\noutput += \"\\n\\t\\t\\t\\t<span class=\\\"item-icon\\\"><img draggable=\\\"false\\\" src=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"urlRoot\"), env.opts.autoescape);\noutput += \"/images/content/\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"img\"), env.opts.autoescape);\noutput += \".png\\\"/></span>\\n\\t\\t\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t\\t\\t<span class=\\\"fa \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"icon\"), env.opts.autoescape);\noutput += \" item-icon\\\"></span>\\n\\t\\t\\t\";\n;\n}\noutput += \"\\n\\n\\t\\t\\t<div class=\\\"item-info\\\">\\n\\t\\t\\t\\t<div class=\\\"item-title\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"title\")), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t\\t<!--<div class=\\\"item-type\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"typeName\"), env.opts.autoescape);\noutput += \"</div>-->\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"badge-container\\\">\\n\\t\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"usage\") && runtime.contextOrFrameLookup(context, frame, \"usage\") > 0) {\noutput += \"\\n\\t\\t\\t\\t<span class=\\\"badge\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"usage\"), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t\\t\\t<span class=\\\"badge hide\\\"></span>\\n\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar item_oldRoot = item_obj.root;\nitem_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\titem_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar summary_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"info\\\">\\n\\t\\t<div>\\n\\t\\t\\t<span class=\\\"summary-value\\\"> \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"language\"), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t\\t<span class=\\\"summary-value\\\"> \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"subject_name\"), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t\\t<span class=\\\"summary-value\\\"> \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"contentGrade\"), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"updated\") || runtime.contextOrFrameLookup(context, frame, \"created\")) {\noutput += \"\\n\\t\\t\\t\\t<span class=\\\"changed\\\">\";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"updated\")?\"Changed\":\"Created\"), env.opts.autoescape);\noutput += \" on \";\noutput += runtime.suppressValue(env.getFilter(\"formatDateHuman\").call(context, (runtime.contextOrFrameLookup(context, frame, \"updated\") || runtime.contextOrFrameLookup(context, frame, \"created\"))), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t</div>\\n\\n\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"description\")) {\noutput += \"\\n\\t\\t\\t<div>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"description\"), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\";\n;\n}\noutput += \"\\n\\t</div>\\n\\n\\t<div class=\\\"actions\\\">\\n\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"resourceEditing\") && (env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"api\")),\"resources\")),\"put\"))) && (env.getFilter(\"ownerMatch\").call(context, runtime.contextOrFrameLookup(context, frame, \"owner\")) || env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"resources\")),\"all\")))) {\noutput += \"<span class=\\\"fal fa-edit edit\\\" title=\\\"Edit Item\\\"/>\";\n;\n}\noutput += \"\\n\\t\\t\";\nif((env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"api\")),\"resources\")),\"delete\"))) && (env.getFilter(\"ownerMatch\").call(context, runtime.contextOrFrameLookup(context, frame, \"owner\")) || env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"resources\")),\"all\")))) {\noutput += \"<span class=\\\"fal fa-trash-alt delete\\\" title=\\\"Delete Item\\\"/>\";\n;\n}\noutput += \"\\n\\t\\t\";\nif((env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"api\")),\"resources\")),\"get\"))) && (env.getFilter(\"ownerMatch\").call(context, runtime.contextOrFrameLookup(context, frame, \"owner\")) || env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"resources\")),\"all\")))) {\noutput += \"<span class=\\\"fal fa-eye open\\\" title=\\\"Open Item\\\"/>\";\n;\n}\noutput += \"\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar summary_oldRoot = summary_obj.root;\nsummary_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tsummary_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar finder_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span class=\\\"fal fa-arrow-left prev\\\" title=\\\"Jump To Previous Instance\\\"></span>\\n\\t<span class=\\\"fal fa-arrow-right next\\\" title=\\\"Jump To Next Instance\\\"></span>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar finder_oldRoot = finder_obj.root;\nfinder_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tfinder_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar empty_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\tNo resources to show for that filter combination.\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar empty_oldRoot = empty_obj.root;\nempty_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tempty_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"loadingStatus\": new nunjucks.Template( {obj: loadingStatus_obj, type: \"code\"}, env),\t\"regions\": new nunjucks.Template( {obj: regions_obj, type: \"code\"}, env),\t\"item\": new nunjucks.Template( {obj: item_obj, type: \"code\"}, env),\t\"summary\": new nunjucks.Template( {obj: summary_obj, type: \"code\"}, env),\t\"finder\": new nunjucks.Template( {obj: finder_obj, type: \"code\"}, env),\t\"empty\": new nunjucks.Template( {obj: empty_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"fal fa-university op op-home disabled\\\" data-title=\\\"\\\" data-op=\\\"home\\\"></div>\\n<!--<div class=\\\"fa fa-ellipsis-h op op-options disabled\\\" data-title=\\\"Options\\\" data-op=\\\"options\\\"></div>-->\\n<div class=\\\"fal fa-bars op op-nav disabled\\\" data-title=\\\"Navigation\\\" data-op=\\\"toc\\\"></div>\\n\";\nif(env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"resources\")),\"sidebar\"))) {\noutput += \"\\n<div class=\\\"fal fa-users-class op op-groups disabled\\\" data-title=\\\"Group&nbsp;Settings\\\" data-op=\\\"groups\\\"></div>\\n<div class=\\\"fal fa-cubes op op-resources disabled\\\" data-title=\\\"Content&nbsp;List\\\" data-op=\\\"resources\\\"></div>\\n\";\nif(runtime.contextOrFrameLookup(context, frame, \"debug\") || runtime.contextOrFrameLookup(context, frame, \"inBookFCWidget\")) {\noutput += \"\\n\\t<div class=\\\"fal fa-clone op op-flash-card disabled\\\" data-title=\\\"Create&nbsp;Flashcards\\\" data-op=\\\"flashCard\\\"></div>\\n\";\n;\n}\noutput += \"\\n<div class=\\\"fal fa-plus-square op op-create disabled\\\" data-title=\\\"Create&nbsp;Content\\\" data-op=\\\"create\\\"></div>\\n\";\n;\n}\noutput += \"\\n<div class=\\\"fal fa-chart-bar op op-cam\\\" data-title=\\\"Classroom&nbsp;Activity&nbsp;Monitor\\\" data-op=\\\"cam\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar content_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\n\\t<div class=\\\"containers\\\">\\n\\t\\t<div class=\\\"submission-list-container\\\">\\n\\t\\t\\t<span class=\\\"counter\\\"></span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"evaluation-container\\\">\\n\\t\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"header\\\">\\n\\t\\t\\t\\t\\t\\t<div class=\\\"student-name\\\">\\n\\t\\t\\t\\t\\t\\t\\tStudent Name\\n\\t\\t\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t\\t\\t<div class=\\\"question-title\\\">\\n\\t\\t\\t\\t\\t\\t\\tQuestion Title\\n\\t\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t\\t<div class=\\\"question-response\\\">\\n\\t\\t\\t\\t\\t\\tResponse provided by a student...\\n\\t\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t\\t<div class=\\\"feedback\\\">\\n\\t\\t\\t\\t\\t\\t<textarea id=\\\"feedback-input\\\" placeholder=\\\"Feedback (optional)...\\\"></textarea>\\n\\t\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t\\t<div class=\\\"score\\\">\\n\\t\\t\\t\\t\\t\\t<span class=\\\"left max-score\\\"></span>\\n\\t\\t\\t\\t\\t\\t<input type=\\\"text\\\" id=\\\"score-input\\\" placeholder=\\\"Score\\\">\\n\\t\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t\\t<div class=\\\"control-container\\\">\\n\\t\\t\\t\\t\\t\\t<span class=\\\"message hide\\\"></span>\\n\\n\\t\\t\\t\\t\\t\\t<button class=\\\"button mark\\\">Mark</button>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</div>\\n\\t<div class=\\\"paginator\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar content_oldRoot = content_obj.root;\ncontent_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcontent_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar submissionListItem_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div>\\n\\t\\t<span class=\\\"title\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, (lineno = 2, colno = 37, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"ownerFirstName\"), \"ownerFirstName\", context, []))), env.opts.autoescape);\noutput += \" \";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, (lineno = 2, colno = 63, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"ownerSurname\"), \"ownerSurname\", context, []))), env.opts.autoescape);\noutput += \"</span>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar submissionListItem_oldRoot = submissionListItem_obj.root;\nsubmissionListItem_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tsubmissionListItem_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"content\": new nunjucks.Template( {obj: content_obj, type: \"code\"}, env),\t\"submissionListItem\": new nunjucks.Template( {obj: submissionListItem_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar globalGroupSelector_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<p class=\\\"text-center\\\">Choose a global group to work with</p>\\n\\n\\t<select name=\\\"groups\\\" data-placeholder=\\\"Global groups...\\\">\\n\\t</select>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar globalGroupSelector_oldRoot = globalGroupSelector_obj.root;\nglobalGroupSelector_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tglobalGroupSelector_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar customGroupSelector_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\n\\t<p class=\\\"text-center\\\">View the marks of a custom group</p>\\n\\n\\t<select name=\\\"groups\\\" data-placeholder=\\\"Choose a custom group to work with...\\\">\\n\\t</select>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar customGroupSelector_oldRoot = customGroupSelector_obj.root;\ncustomGroupSelector_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcustomGroupSelector_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar customGroupCreator_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<p class=\\\"text-center\\\">Enter a name for the new custom group</p>\\n\\n\\t<input type=\\\"text\\\" class=\\\"custom-group-name\\\" value=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"name\"), env.opts.autoescape);\noutput += \"\\\">\\n\\n\\t<div class=\\\"custom-group-creator-footer\\\">\\n\\t\\t<div class=\\\"custom-group-creator-options\\\">\\n\\t\\t\\t<label>\\n\\t\\t\\t\\t<input type=\\\"checkbox\\\" id=\\\"input-generate-token\\\">\\n\\t\\t\\t\\tGenerate a token\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"custom-group-creator-message-container\\\">\\n\\t\\t\\t<div class=\\\"validation-error hide\\\">\\n\\t\\t\\t\\t<span class=\\\"validation-error-glyph fal fa-exclamation-triangle\\\" />&nbsp;&nbsp;<span class=\\\"validation-error-message\\\"></span>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"custom-group-creator-controls\\\">\\n\\t\\t\\t<button type=\\\"button\\\" class=\\\"button secondary button-reject-name\\\">Cancel</button>\\n\\t\\t\\t<button type=\\\"button\\\" class=\\\"button button-accept-name\\\">Start editing</button>\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar customGroupCreator_oldRoot = customGroupCreator_obj.root;\ncustomGroupCreator_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcustomGroupCreator_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar userGrid_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"grid-title-container\\\">\\n\\t\\t<span class=\\\"grid-title unselectable hide\\\"></span>\\n\\t</div>\\n\\n\\t<div class=\\\"grid-header\\\">\\n\\t\\t<div class=\\\"filter-region\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"user-counter-container\\\">\\n\\t\\t\\t<span class=\\\"user-counter\\\"></span>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"grid-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar userGrid_oldRoot = userGrid_obj.root;\nuserGrid_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tuserGrid_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar groupMarks_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"ops-bar\\\">\\n\\t\\t<div class=\\\"filters\\\"></div>\\n\\t\\t<div class=\\\"counter\\\"></div>\\n\\t</div>\\n\\n\\t<div class=\\\"grid\\\"></div>\\n\\n\\t<div class=\\\"paging\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar groupMarks_oldRoot = groupMarks_obj.root;\ngroupMarks_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tgroupMarks_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar manager_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"header-region hide\\\">\\n\\t</div>\\n\\t<div class=\\\"header\\\">\\n\\t\\t<h4 class=\\\"title left\\\"><span class=\\\"fal fa-chart-bar\\\"/>&nbsp;Group Marks</h4>\\n\\t\\t<div class=\\\"actions\\\">\\n\\t\\t\\t<div class=\\\"downloadAssessmentReport\\\" title=\\\"Export list of all marks\\\" ><span class=\\\"fal fa-cloud-download\\\"/> Download Assessment Report</div>\\n\\t\\t</div>\\n\\t</div>\\n\\t<div class=\\\"status-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"global-group-selector-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"custom-group-selector-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"custom-group-creator-region hide\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"group-marks-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar manager_oldRoot = manager_obj.root;\nmanager_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmanager_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"globalGroupSelector\": new nunjucks.Template( {obj: globalGroupSelector_obj, type: \"code\"}, env),\t\"customGroupSelector\": new nunjucks.Template( {obj: customGroupSelector_obj, type: \"code\"}, env),\t\"customGroupCreator\": new nunjucks.Template( {obj: customGroupCreator_obj, type: \"code\"}, env),\t\"userGrid\": new nunjucks.Template( {obj: userGrid_obj, type: \"code\"}, env),\t\"groupMarks\": new nunjucks.Template( {obj: groupMarks_obj, type: \"code\"}, env),\t\"manager\": new nunjucks.Template( {obj: manager_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar loading_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"error-container hidden\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"message-container\\\">\\n\\t\\t<span class=\\\"spinner-icon spinner-small\\\" /><span>&nbsp;Loading...</span>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar loading_oldRoot = loading_obj.root;\nloading_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tloading_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar layout_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<ul class=\\\"page-accordion\\\">\\n\\t\\t<li class=\\\"assessments-section\\\">\\n\\t\\t\\t<div class=\\\"tab\\\">\\n\\t\\t\\t\\t<span class=\\\"tab-label\\\">Assessments</span>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"content\\\" id=\\\"assessments-region\\\">\\n\\t\\t\\t</div>\\n\\t\\t</li>\\n\\t\\t<li class=\\\"instances-section\\\">\\n\\t\\t\\t<div class=\\\"tab\\\">\\n\\t\\t\\t\\t<span class=\\\"tab-label\\\">Instances</span>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"content\\\" id=\\\"instances-region\\\">\\n\\t\\t\\t</div>\\n\\t\\t</li>\\n\\t\\t<li class=\\\"marks-section\\\">\\n\\t\\t\\t<div class=\\\"tab\\\">\\n\\t\\t\\t\\t<span class=\\\"tab-label\\\">Marks</span>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"content\\\" id=\\\"marks-region\\\">\\n\\t\\t\\t</div>\\n\\t\\t</li>\\n\\t\\t<li class=\\\"details-section\\\">\\n\\t\\t\\t<div class=\\\"tab\\\">\\n\\t\\t\\t\\t<span class=\\\"tab-label\\\">Details</span>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"content\\\" id=\\\"details-region\\\">\\n\\t\\t\\t</div>\\n\\t\\t</li>\\n\\t</ul>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar layout_oldRoot = layout_obj.root;\nlayout_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlayout_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar assessments_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<!--<div class=\\\"grid-header\\\">\\n\\t\\t<div class=\\\"title\\\">\\n\\t\\t\\t<span>Select an assessment</span>\\n\\t\\t\\t<br><br>\\n\\t\\t\\t<div class=\\\"ops-bar\\\">\\n\\t\\t\\t\\t<div class=\\\"filters\\\"></div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"counter-container\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"button-container\\\">\\n\\t\\t\\t<div class=\\\"fa fa-cloud-upload assessments-button button-import\\\" title=\\\"Import\\\">\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"grid-container\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"grid-paging\\\">\\n\\t</div>-->\\n\\n\\t<div class=\\\"header\\\">\\n\\t\\t<h4 class=\\\"title left\\\"><span class=\\\"fal fa-cubes\\\"/>&nbsp;Assessments</h4>\\n\\t\\t<div class=\\\"actions\\\">\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"ops-bar\\\">\\n\\t\\t<div class=\\\"filters\\\"></div>\\n\\t\\t<div class=\\\"counter\\\"></div>\\n\\t</div>\\n\\n\\t<div class=\\\"grid\\\"></div>\\n\\n\\t<div class=\\\"paging\\\"></div>\\n\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar assessments_oldRoot = assessments_obj.root;\nassessments_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tassessments_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar instances_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<!--<div class=\\\"grid-header\\\">\\n\\t\\t<div class=\\\"title\\\">\\n\\t\\t\\t<span>Select an instance</span>\\n\\t\\t\\t<br><br>\\n\\t\\t\\t<div class=\\\"ops-bar\\\">\\n\\t\\t\\t\\t<div class=\\\"filters\\\"></div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"counter-container\\\">\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"grid-container\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"grid-paging\\\">\\n\\t</div>-->\\n\\n\\t<div class=\\\"header\\\">\\n\\t\\t<h4 class=\\\"title left\\\"><span class=\\\"fal fa-cubes\\\"/> Instances</h4>\\n\\t\\t<div class=\\\"actions\\\">\\n\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"ops-bar\\\">\\n\\t\\t<div class=\\\"filters\\\"></div>\\n\\t\\t<div class=\\\"counter\\\"></div>\\n\\t</div>\\n\\n\\t<div class=\\\"grid\\\"></div>\\n\\n\\t<div class=\\\"paging\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar instances_oldRoot = instances_obj.root;\ninstances_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tinstances_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar marks_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<!--<div class=\\\"grid-header\\\">\\n\\t\\t<div class=\\\"title\\\">\\n\\t\\t\\t<span>Marks</span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"ops-bar\\\">\\n\\t\\t\\t<div class=\\\"filters\\\"></div>\\n\\t\\t\\t<div class=\\\"counter\\\"></div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"counter-container\\\">\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"grid-container\\\">\\n\\t\\t<div class=\\\"marks-grid-header\\\">\\n\\t\\t\\t<div class=\\\"test-total\\\">\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"button-container\\\">\\n\\t\\t\\t\\t<div class=\\\"fa fa-cloud-download marks-button button-download\\\" title=\\\"Download\\\">\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t<div class=\\\"fa fa-refresh marks-button button-refresh\\\" title=\\\"Refresh\\\">\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"grid-paging\\\">\\n\\t</div>-->\\n\\n\\t<div class=\\\"header\\\">\\n\\t\\t<h4 class=\\\"title left\\\"><span class=\\\"fal fa-cubes\\\"/> Marks</h4>\\n\\t\\t<div class=\\\"actions\\\">\\n\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"ops-bar\\\">\\n\\t\\t<div class=\\\"filters\\\"></div>\\n\\t\\t<div class=\\\"counter\\\"></div>\\n\\t</div>\\n\\n\\t<div class=\\\"grid\\\">\\n\\t\\t<div class=\\\"marks-grid-header\\\">\\n\\t\\t\\t<div class=\\\"test-total\\\">\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"button-container\\\">\\n\\t\\t\\t\\t<div class=\\\"fal fa-cloud-download marks-button button-download\\\" title=\\\"Download\\\">\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t<div class=\\\"fal fa-refresh marks-button button-refresh\\\" title=\\\"Refresh\\\">\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"paging\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar marks_oldRoot = marks_obj.root;\nmarks_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmarks_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar details_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"grid-header\\\">\\n\\t\\t<div class=\\\"title\\\">\\n\\t\\t\\t<span>Details</span>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"grid\\\"></div>\\n\\n\\t<div class=\\\"activity-timeline-container\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar details_oldRoot = details_obj.root;\ndetails_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tdetails_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar activityTimeline_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"activity-timeline-title-container\\\">\\n\\t\\t<span class=\\\"activity-timeline-title\\\">Assessment Timeline</span>\\n\\t</div>\\n\\n\\t<div class=\\\"activity-timeline-summary-container\\\">\\n\\t\\t<span class=\\\"activity-summary-label\\\">Time taken to complete assessment:&nbsp;</span>\\n\\t\\t<span class=\\\"activity-summary-value completion-time\\\"></span>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar activityTimeline_oldRoot = activityTimeline_obj.root;\nactivityTimeline_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tactivityTimeline_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar activity_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span class=\\\"activity-name\\\"></span>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar activity_oldRoot = activity_obj.root;\nactivity_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tactivity_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar activityDetails_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<table>\\n\\t\\t<tr>\\n\\t\\t\\t<td><span class=\\\"activity-detail-label\\\">Question:&nbsp;</span></td><td><span class=\\\"activity-detail-value\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"question\")), env.opts.autoescape);\noutput += \"</span></td>\\n\\t\\t</tr>\\n\\t\\t<tr>\\n\\t\\t\\t<td><span class=\\\"activity-detail-label\\\">Started:&nbsp;</span></td><td><span class=\\\"activity-detail-value\\\">\";\noutput += runtime.suppressValue((lineno = 6, colno = 115, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"start\"), \"start\", context, [])), env.opts.autoescape);\noutput += \"</span></td>\\n\\t\\t</tr>\\n\\t\\t<tr>\\n\\t\\t\\t<td><span class=\\\"activity-detail-label\\\">Ended:&nbsp;</span></td><td><span class=\\\"activity-detail-value\\\">\";\noutput += runtime.suppressValue((lineno = 9, colno = 111, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"end\"), \"end\", context, [])), env.opts.autoescape);\noutput += \"</span></td>\\n\\t\\t</tr>\\n\\t</table>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar activityDetails_oldRoot = activityDetails_obj.root;\nactivityDetails_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tactivityDetails_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar studentMarks_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"header\\\">\\n\\t\\t<h4 class=\\\"title left\\\"><span class=\\\"fal fa-book\\\"/>&nbsp;Student Marks</h4>\\n\\t\\t<div class=\\\"actions\\\">\\n\\t\\t\\t<div class=\\\"downloadAll\\\" title=\\\"Export list of all marks\\\" ><span class=\\\"fal fa-cloud-download\\\"/> Download All</div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"ops-bar\\\">\\n\\t\\t<div class=\\\"filters\\\"></div>\\n\\t\\t<div class=\\\"counter\\\"></div>\\n\\t</div>\\n\\n\\t<div class=\\\"grid\\\"></div>\\n\\n\\t<div class=\\\"paging\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar studentMarks_oldRoot = studentMarks_obj.root;\nstudentMarks_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tstudentMarks_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"loading\": new nunjucks.Template( {obj: loading_obj, type: \"code\"}, env),\t\"layout\": new nunjucks.Template( {obj: layout_obj, type: \"code\"}, env),\t\"assessments\": new nunjucks.Template( {obj: assessments_obj, type: \"code\"}, env),\t\"instances\": new nunjucks.Template( {obj: instances_obj, type: \"code\"}, env),\t\"marks\": new nunjucks.Template( {obj: marks_obj, type: \"code\"}, env),\t\"details\": new nunjucks.Template( {obj: details_obj, type: \"code\"}, env),\t\"activityTimeline\": new nunjucks.Template( {obj: activityTimeline_obj, type: \"code\"}, env),\t\"activity\": new nunjucks.Template( {obj: activity_obj, type: \"code\"}, env),\t\"activityDetails\": new nunjucks.Template( {obj: activityDetails_obj, type: \"code\"}, env),\t\"studentMarks\": new nunjucks.Template( {obj: studentMarks_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar content_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"modal-title\\\">\\n\\t\\t<span class=\\\"fal fa-pencil\\\"/>&nbsp;&nbsp;<span class=\\\"action\\\"></span> tag</span>\\n\\t</div>\\n\\n\\t<div class=\\\"modal-body\\\">\\n\\t\\t<div class=\\\"row form-container\\\">\\n\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t<span class=\\\"form-label\\\">Tag name</span>\\n\\t\\t\\t\\t<div class=\\\"tag-modal\\\">\\n\\t\\t\\t\\t\\t<input type=\\\"text\\\" name=\\\"label\\\" placeholder=\\\"Name new tag\\\" maxlength=\\\"40\\\" value=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"label\"), env.opts.autoescape);\noutput += \"\\\" />\\n\\n\\t\\t\\t\\t\\t<div class=\\\"colours\\\">\\n\\t\\t\\t\\t\\t\\t\";\nframe = frame.push();\nvar t_3 = runtime.contextOrFrameLookup(context, frame, \"colours\");\nif(t_3) {var t_2 = t_3.length;\nfor(var t_1=0; t_1 < t_3.length; t_1++) {\nvar t_4 = t_3[t_1];\nframe.set(\"col\", t_4);\nframe.set(\"loop.index\", t_1 + 1);\nframe.set(\"loop.index0\", t_1);\nframe.set(\"loop.revindex\", t_2 - t_1);\nframe.set(\"loop.revindex0\", t_2 - t_1 - 1);\nframe.set(\"loop.first\", t_1 === 0);\nframe.set(\"loop.last\", t_1 === t_2 - 1);\nframe.set(\"loop.length\", t_2);\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t<div style=\\\"background-color: #\";\noutput += runtime.suppressValue(t_4, env.opts.autoescape);\noutput += \" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"colour\") == t_4?(lineno = 14, colno = 59, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"getSelectedCss\"), \"getSelectedCss\", context, [t_4])):\"\"), env.opts.autoescape);\noutput += \"\\\" data-colour=\\\"\";\noutput += runtime.suppressValue(t_4, env.opts.autoescape);\noutput += \"\\\" class=\\\"\";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"colour\") == t_4?\"selected\":\"\"), env.opts.autoescape);\noutput += \"\\\"></div>\\n\\t\\t\\t\\t\\t\\t\";\n;\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t\\t<input type=\\\"color\\\" name=\\\"customColour\\\"/>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"errors\\\"></div>\\n\\t</div>\\n\\n\\t<div class=\\\"modal-footer left\\\">\\n\\t\\t<button type=\\\"button\\\" class=\\\"button success update hide\\\">Update</button>&nbsp;&nbsp;&nbsp;&nbsp;\\n\\t\\t<button type=\\\"button\\\" class=\\\"button success create hide\\\">Create</button>&nbsp;&nbsp;&nbsp;&nbsp;\\n\\t\\t<button type=\\\"button\\\" class=\\\"button secondary cancel\\\">Cancel</button>&nbsp;&nbsp;&nbsp;&nbsp;\\n\\n\\t\\t<span class=\\\"spinner-icon spinner-small spinner-working hide\\\"/>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar content_oldRoot = content_obj.root;\ncontent_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcontent_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"content\": new nunjucks.Template( {obj: content_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"header\\\">\\n\\t<h4 class=\\\"title left\\\"><a href=\\\"#\\\" onclick=\\\"window.history.back()\\\" title=\\\"Back to learning path\\\"><span class=\\\"fal fa-tag\\\"/>&nbsp;<span class=\\\"title-text\\\">Manage tags</span></a></h4>\\n\\t<div class=\\\"actions\\\">\\n\\t\\t\";\nif((env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"api\")),\"tags\")),\"post\")))) {\noutput += \"\\n\\t\\t\\t<div class=\\\"add-tag\\\"><span class=\\\"fal fa-plus\\\"/> Add new tag</div>\\n\\t\\t\";\n;\n}\noutput += \"\\n\\t</div>\\n</div>\\n\\n<div class=\\\"ops-bar\\\">\\n\\t<div class=\\\"filters\\\"></div>\\n\\t<div class=\\\"counter\\\"></div>\\n</div>\\n\\n<div class=\\\"grid\\\"></div>\\n\\n<div class=\\\"paging\\\"></div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "\"use strict\";\n\nvar _regenerator = require(\"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\nvar Promise = require(\"bluebird\");\nvar rester = require(\"rester\");\n\nvar App = require(\"../../../index\");\nvar radio = Backbone.Radio.channel(\"global\");\nvar settings = require(\"app-settings\");\n\nvar AttendanceRegisterCollection = require(\"../../collections/attendance/attendanceRegisterCollection\");\nvar AttendanceRegisterModel = require(\"../../models/attendance/attendanceRegisterModel\");\nvar ErrorView = require(\"../../../lib/errorView\");\nvar GroupModel = require(\"../../../groups/views/groupModel\");\nvar Register = require(\"./register\");\nvar RegisterHeader = require(\"./registerHeader\");\nvar RegisterSelectorHeader = require(\"./registerSelectorHeader\");\nvar RegisterSelector = require(\"./registerSelector\");\nvar SmallModal = require(\"../../../lib/smallModal\");\nvar StatusView = require(\"../../../lib/statusView\");\nvar UserReport = require(\"./userReport\");\nvar UserModel = require(\"../../../users/userModel\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"fixed-content attendance-layout\",\n\n\ttemplate: require(\"../../templates/attendance/layout.nunj\"),\n\n\tregions: {\n\t\tbody: \".body-region\",\n\t\theader: \".header-region\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.attendanceRegisterCollection = new AttendanceRegisterCollection();\n\n\t\tthis.listenTo(Backbone.Radio.channel(\"groupSelector\"), \"Events.ValueChanged\", this.onGroupSelected.bind(this));\n\t\tthis.listenTo(Backbone.Radio.channel(\"userSelector\"), \"Events.ValueChanged\", this.onUserSelected.bind(this));\n\n\t\tBackbone.Radio.channel(\"attendanceRegister\").reply(\"group:fetch:current\", this.fetchCurrentGroupModel.bind(this));\n\t\tBackbone.Radio.channel(\"attendanceRegister\").reply(\"user:fetch:current\", this.fetchCurrentUserModel.bind(this));\n\n\t\tBackbone.Radio.channel(\"attendanceRegisterSelector\").reply(\"calendar:fetch\", this.fetchAttendanceRegisterDates.bind(this));\n\t\tBackbone.Radio.channel(\"attendanceRegisterSelector\").reply(\"calendar:date:default\", this.fetchCalendarDefaultDate.bind(this));\n\t\tBackbone.Radio.channel(\"attendanceRegisterSelector\").reply(\"group:fetch:default\", this.fetchGroupSelectorDefault.bind(this));\n\t\tBackbone.Radio.channel(\"attendanceRegisterSelector\").reply(\"user:fetch:default\", this.fetchUserSelectorDefault.bind(this));\n\n\t\tthis.listenTo(Backbone.Radio.channel(\"attendanceRegister\"), {\n\t\t\t\"register:delete\": this.onAttendanceRegisterDelete.bind(this),\n\t\t\t\"reportSwitch:changed:on\": this.switchToReport.bind(this),\n\t\t\t\"reportSwitch:changed:off\": this.switchToRegisterSelector.bind(this)\n\t\t});\n\n\t\tthis.listenTo(Backbone.Radio.channel(\"attendanceRegisterSelector\"), {\n\t\t\t\"calendar:change\": this.onCalendarChange.bind(this),\n\t\t\t\"calendar:select\": this.onDateSelected.bind(this),\n\t\t\t\"report:download\": this.downloadReport.bind(this)\n\t\t});\n\n\t\tthis.creationQueue = [];\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.mode = \"register\";\n\t\tthis.showRegisterSelectorBlankBody();\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(Backbone.Radio.channel(\"groupSelector\"));\n\t\tthis.stopListening(Backbone.Radio.channel(\"attendanceRegisterSelector\"));\n\t\tthis.stopListening(Backbone.Radio.channel(\"userSelector\"));\n\t},\n\n\tonGroupSelected: function onGroupSelected(groupCode) {\n\t\tif (this.mode === \"register\") {\n\t\t\tradio.trigger(App.Events.Commands.Navigate, settings.urlRoot + \"/console/attendance/register/\" + groupCode, { trigger: false });\n\t\t} else {\n\t\t\tradio.trigger(App.Events.Commands.Navigate, settings.urlRoot + \"/console/attendance/report/user/\" + groupCode, { trigger: false });\n\t\t}\n\n\t\tthis.selectGroup(groupCode);\n\n\t\tif (this.isAdminUser()) {\n\t\t\tthis.selectUser();\n\t\t} else {\n\t\t\tvar currentUser = radio.request(App.Events.Requests.CurrentUser);\n\t\t\tthis.onUserSelected(currentUser.user_id);\n\t\t}\n\t},\n\n\tonUserSelected: function onUserSelected(userId) {\n\t\tif (userId) {\n\t\t\tif (this.mode === \"register\") {\n\t\t\t\tradio.trigger(App.Events.Commands.Navigate, settings.urlRoot + \"/console/attendance/register/\" + this.currentGroupCode + \"/\" + userId, { trigger: false });\n\t\t\t} else {\n\t\t\t\tradio.trigger(App.Events.Commands.Navigate, settings.urlRoot + \"/console/attendance/report/user/\" + this.currentGroupCode + \"/\" + userId, { trigger: false });\n\t\t\t}\n\t\t}\n\n\t\tthis.selectUser(userId);\n\t},\n\n\tonCalendarChange: function onCalendarChange(displayDate) {\n\t\tthis.currentDisplayDate = displayDate.unix();\n\n\t\tradio.trigger(App.Events.Commands.Navigate, settings.urlRoot + \"/console/attendance/register/\" + this.currentGroupCode + \"/\" + this.currentUserId + \"/\" + this.currentDisplayDate, { trigger: false });\n\t},\n\n\tonDateSelected: function onDateSelected(date) {\n\t\tthis.selectDate(date);\n\t},\n\n\tonAttendanceRegisterDelete: function onAttendanceRegisterDelete(attendanceRegisterModel) {\n\t\tvar _this = this;\n\n\t\tthis.deleteConfirmationModal = new SmallModal({\n\t\t\tpersist: true,\n\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Delete Attendance Register\",\n\t\t\tbody: \"<p>Are you sure you want to delete this attendance register?</p>\",\n\t\t\twarning: true\n\t\t});\n\n\t\tthis.deleteConfirmationModal.on(\"button:ok\", function () {\n\t\t\tattendanceRegisterModel.destroy({\n\t\t\t\twait: true,\n\n\t\t\t\tsuccess: function success() {\n\t\t\t\t\t_this.deleteConfirmationModal.destroy();\n\n\t\t\t\t\t_this.showRegisterSelectorBlankBody();\n\t\t\t\t\t_this.showRegisterSelectorHeader();\n\n\t\t\t\t\tif (_this.currentUserId && !_this.isAdminUser()) _this.selectUser(_this.currentUserId);\n\t\t\t\t},\n\n\t\t\t\terror: function error(model, response) {\n\t\t\t\t\tvar answer = App.parseResponse(response);\n\t\t\t\t\t_this.deleteConfirmationModal.showError(\"Deletion failed: \" + (answer.detail || answer.info));\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tthis.deleteConfirmationModal.show();\n\t},\n\n\tshowRegisterSelectorHeader: function showRegisterSelectorHeader(options) {\n\t\tthis.showChildView(\"header\", new RegisterSelectorHeader(options));\n\t},\n\n\tshowRegisterSelectorBlankBody: function showRegisterSelectorBlankBody() {\n\t\tthis.showChildView(\"body\", new RegisterSelector.Blank());\n\t},\n\n\tisAdminUser: function isAdminUser() {\n\t\treturn rester.hasAccess(rester.p.attendance.all, radio.request(App.Events.Requests.CurrentUser));\n\t},\n\n\tshowLoadingStatus: function showLoadingStatus() {\n\t\tthis.showChildView(\"body\", new StatusView());\n\t},\n\n\tshowError: function showError(error) {\n\t\tthis.showChildView(\"body\", new ErrorView(error));\n\t},\n\n\tnavigateToSection: function navigateToSection(identifiers) {\n\t\tthis.currentGroupCode = identifiers.group;\n\t\tthis.currentUserId = parseInt(identifiers.user, 10);\n\t\tthis.currentDisplayDate = identifiers.displayDate;\n\n\t\tif (identifiers.attendanceRegister) {\n\t\t\tthis.selectAttendanceRegister(parseInt(identifiers.attendanceRegister, 10));\n\t\t} else {\n\t\t\tthis.showRegisterSelectorBlankBody();\n\t\t\tthis.showRegisterSelectorHeader({ mode: \"register\" });\n\n\t\t\tif (this.currentUserId && !this.isAdminUser()) this.selectUser(parseInt(identifiers.user, 10));\n\n\t\t\tif (this.currentGroupCode) this.selectGroup(this.currentGroupCode);\n\t\t}\n\t},\n\n\tnavigateToUserReport: function navigateToUserReport(identifiers) {\n\t\tthis.currentGroupCode = identifiers.group;\n\t\tthis.currentUserId = parseInt(identifiers.user, 10);\n\n\t\tthis.showRegisterSelectorHeader({ mode: \"report\" });\n\n\t\tif (this.currentGroupCode) this.selectGroup(this.currentGroupCode);\n\n\t\tthis.switchToReport();\n\t\tthis.mode = \"report\";\n\t},\n\n\tswitchToReport: function switchToReport() {\n\t\tthis.mode = \"report\";\n\t\tthis.showUserReport();\n\t},\n\n\tswitchToRegisterSelector: function switchToRegisterSelector() {\n\t\tthis.mode = \"register\";\n\t\tthis.showRegisterSelector();\n\t},\n\n\tselectGroup: function selectGroup(groupCode) {\n\t\tif (!this.currentUserId) {\n\t\t\tif (this.mode === \"register\") this.showChildView(\"body\", new RegisterSelector.Blank());else this.showChildView(\"body\", new UserReport.Blank());\n\t\t}\n\n\t\tthis.currentGroupCode = groupCode;\n\n\t\tBackbone.Radio.channel(\"attendanceRegisterSelector\").trigger(\"group:select\", this.currentGroupCode);\n\t},\n\n\tselectUser: function selectUser(userId) {\n\t\tthis.currentUserId = userId;\n\n\t\tif (!this.currentUserId) {\n\t\t\tthis.showChildView(\"body\", new RegisterSelector.Blank());\n\t\t} else if (this.currentGroupCode && this.currentUserId) {\n\t\t\tif (this.mode === \"register\") {\n\t\t\t\tif (this.getRegion(\"body\").currentView instanceof RegisterSelector.Calendar) this.getRegion(\"body\").currentView.registerCalendar.render();else this.showChildView(\"body\", new RegisterSelector.Calendar());\n\t\t\t} else {\n\t\t\t\tthis.showChildView(\"body\", new UserReport.Console());\n\t\t\t}\n\t\t} else {\n\t\t\tBackbone.Radio.channel(\"attendanceRegisterSelector\").trigger(\"calendar:refresh\");\n\t\t}\n\n\t\tBackbone.Radio.channel(\"attendanceRegisterSelector\").trigger(\"user:select\", this.currentUserId);\n\t},\n\n\tshowRegister: function showRegister(attendanceRegisterModel) {\n\t\tthis.creationQueue = _.without(this.creationQueue, attendanceRegisterModel.get(\"created\"));\n\t\tthis.attendanceRegisterCollection.add(attendanceRegisterModel);\n\n\t\tradio.trigger(App.Events.Commands.Navigate, settings.urlRoot + \"/console/attendance/register/\" + this.currentGroupCode + \"/\" + this.currentUserId + \"/\" + this.currentDisplayDate + \"/\" + attendanceRegisterModel.get(\"register_id\"), { trigger: false });\n\n\t\tthis.showChildView(\"header\", new RegisterHeader({ model: attendanceRegisterModel }));\n\t\tthis.showChildView(\"body\", new Register({ model: attendanceRegisterModel }));\n\t},\n\n\tshowRegisterSelector: function showRegisterSelector() {\n\t\tvar url = settings.urlRoot + \"/console/attendance/register\";\n\n\t\tif (this.currentUserId) {\n\t\t\turl += \"/\" + this.currentGroupCode + \"/\" + this.currentUserId;\n\t\t\tthis.showChildView(\"body\", new RegisterSelector.Calendar());\n\t\t} else {\n\t\t\tif (this.currentGroupCode) url += \"/\" + this.currentGroupCode;\n\n\t\t\tthis.showChildView(\"body\", new RegisterSelector.Blank());\n\t\t}\n\n\t\tradio.trigger(App.Events.Commands.Navigate, url, { trigger: false });\n\t},\n\n\tshowUserReport: function () {\n\t\tvar _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee() {\n\t\t\tvar url;\n\t\t\treturn _regenerator2.default.wrap(function _callee$(_context) {\n\t\t\t\twhile (1) {\n\t\t\t\t\tswitch (_context.prev = _context.next) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\turl = settings.urlRoot + \"/console/attendance/report/user\";\n\n\n\t\t\t\t\t\t\tif (this.currentUserId) {\n\t\t\t\t\t\t\t\turl += \"/\" + this.currentGroupCode + \"/\" + this.currentUserId;\n\t\t\t\t\t\t\t\tthis.showChildView(\"body\", new UserReport.Console());\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tif (this.currentGroupCode) url += \"/\" + this.currentGroupCode;\n\n\t\t\t\t\t\t\t\tthis.showChildView(\"body\", new UserReport.Blank());\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tradio.trigger(App.Events.Commands.Navigate, url, { trigger: false });\n\n\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\treturn _context.stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, _callee, this);\n\t\t}));\n\n\t\tfunction showUserReport() {\n\t\t\treturn _ref.apply(this, arguments);\n\t\t}\n\n\t\treturn showUserReport;\n\t}(),\n\n\tselectAttendanceRegister: function selectAttendanceRegister(attendanceRegisterId) {\n\t\tvar _this2 = this;\n\n\t\tvar attendanceRegisterModel = new AttendanceRegisterModel({ register_id: attendanceRegisterId });\n\n\t\tattendanceRegisterModel.fetch({\n\t\t\tsuccess: this.showRegister.bind(this),\n\t\t\terror: function error(model, response) {\n\t\t\t\t_this2.showError(response);\n\t\t\t}\n\t\t});\n\t},\n\n\tselectDate: function selectDate(date) {\n\t\tvar _this3 = this;\n\n\t\tif (_.includes(this.creationQueue, date.unix())) return;\n\n\t\tvar attendanceRegisterModel = _.find(this.attendanceRegisterCollection.models, function (register) {\n\t\t\treturn moment.unix(register.get(\"created\")).isSame(date, \"day\");\n\t\t});\n\n\t\tif (attendanceRegisterModel === undefined) {\n\t\t\t// If we don't have the right roles, don't auto-create a register\n\t\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\t\t\tif (!_.includes(user.roles, \"teacher\")) return alert(\"No register for that user on that date\");\n\n\t\t\tthis.creationQueue.push(date.unix());\n\n\t\t\tattendanceRegisterModel = new AttendanceRegisterModel();\n\n\t\t\tattendanceRegisterModel.save({\n\t\t\t\tcreated: date.unix(),\n\t\t\t\tgroup: this.currentGroupCode,\n\t\t\t\towner: this.currentUserId\n\t\t\t}, {\n\t\t\t\twait: true,\n\t\t\t\tsuccess: this.showRegister.bind(this),\n\t\t\t\terror: function error(model, response) {\n\t\t\t\t\t_this3.showError(response);\n\t\t\t\t\t_this3.creationQueue = _.without(_this3.creationQueue, date.unix());\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tthis.showRegister(attendanceRegisterModel);\n\t\t}\n\t},\n\n\tfetchAttendanceRegisterDates: function fetchAttendanceRegisterDates(startDate, endDate, resolve, reject) {\n\t\tthis.attendanceRegisterCollection.fetch({\n\t\t\turl: settings.urlRoot + \"/api/1.0/attendance/registers/byGroup/\" + encodeURIComponent(this.currentGroupCode),\n\t\t\tdata: {\n\t\t\t\towner: this.currentUserId,\n\t\t\t\tstartDate: startDate.unix(),\n\t\t\t\tendDate: endDate.unix()\n\t\t\t},\n\n\t\t\treset: true,\n\n\t\t\tsuccess: function success(collection) {\n\t\t\t\tresolve({\n\t\t\t\t\thighlightedDates: [moment().unix()],\n\t\t\t\t\tmarkedDates: _.invokeMap(collection.models, \"get\", \"created\")\n\t\t\t\t});\n\t\t\t},\n\n\t\t\terror: function error(collection, response) {\n\t\t\t\treject(response);\n\t\t\t}\n\t\t});\n\t},\n\n\tfetchCalendarDefaultDate: function fetchCalendarDefaultDate(resolve) {\n\t\tif (this.currentDisplayDate) resolve(moment.unix(this.currentDisplayDate));else resolve(moment());\n\t},\n\n\tfetchCurrentGroupModel: function () {\n\t\tvar _ref2 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee2() {\n\t\t\tvar _this4 = this;\n\n\t\t\tvar currentGroupModel;\n\t\t\treturn _regenerator2.default.wrap(function _callee2$(_context2) {\n\t\t\t\twhile (1) {\n\t\t\t\t\tswitch (_context2.prev = _context2.next) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tcurrentGroupModel = void 0;\n\n\t\t\t\t\t\t\tif (!this.currentGroupCode) {\n\t\t\t\t\t\t\t\t_context2.next = 16;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!(this.currentGroupModel && this.currentGroupModel.get(\"code\") === this.currentGroupCode)) {\n\t\t\t\t\t\t\t\t_context2.next = 6;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcurrentGroupModel = this.currentGroupModel;\n\t\t\t\t\t\t\t_context2.next = 16;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 6:\n\t\t\t\t\t\t\tthis.currentGroupModel = new GroupModel({ code: this.currentGroupCode });\n\n\t\t\t\t\t\t\t_context2.prev = 7;\n\t\t\t\t\t\t\t_context2.next = 10;\n\t\t\t\t\t\t\treturn new Promise(function (resolve, reject) {\n\t\t\t\t\t\t\t\t_this4.currentGroupModel.fetch({\n\t\t\t\t\t\t\t\t\tsuccess: function success(model) {\n\t\t\t\t\t\t\t\t\t\tresolve(model);\n\t\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t\terror: function error(model, response) {\n\t\t\t\t\t\t\t\t\t\treject(response);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\tcase 10:\n\t\t\t\t\t\t\tcurrentGroupModel = _context2.sent;\n\t\t\t\t\t\t\t_context2.next = 16;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 13:\n\t\t\t\t\t\t\t_context2.prev = 13;\n\t\t\t\t\t\t\t_context2.t0 = _context2[\"catch\"](7);\n\t\t\t\t\t\t\tthrow _context2.t0;\n\n\t\t\t\t\t\tcase 16:\n\t\t\t\t\t\t\treturn _context2.abrupt(\"return\", currentGroupModel);\n\n\t\t\t\t\t\tcase 17:\n\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\treturn _context2.stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, _callee2, this, [[7, 13]]);\n\t\t}));\n\n\t\tfunction fetchCurrentGroupModel() {\n\t\t\treturn _ref2.apply(this, arguments);\n\t\t}\n\n\t\treturn fetchCurrentGroupModel;\n\t}(),\n\n\tfetchCurrentUserModel: function () {\n\t\tvar _ref3 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee3() {\n\t\t\tvar _this5 = this;\n\n\t\t\tvar currentUserModel;\n\t\t\treturn _regenerator2.default.wrap(function _callee3$(_context3) {\n\t\t\t\twhile (1) {\n\t\t\t\t\tswitch (_context3.prev = _context3.next) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tcurrentUserModel = void 0;\n\n\t\t\t\t\t\t\tif (!this.currentUserId) {\n\t\t\t\t\t\t\t\t_context3.next = 16;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!(this.currentUserModel && this.currentUserModel.get(\"_id\") === this.currentUserId)) {\n\t\t\t\t\t\t\t\t_context3.next = 6;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcurrentUserModel = this.currentUserModel;\n\t\t\t\t\t\t\t_context3.next = 16;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 6:\n\t\t\t\t\t\t\tthis.currentUserModel = new UserModel({ _id: this.currentUserId });\n\n\t\t\t\t\t\t\t_context3.prev = 7;\n\t\t\t\t\t\t\t_context3.next = 10;\n\t\t\t\t\t\t\treturn new Promise(function (resolve, reject) {\n\t\t\t\t\t\t\t\t_this5.currentUserModel.fetch({\n\t\t\t\t\t\t\t\t\tsuccess: function success(model) {\n\t\t\t\t\t\t\t\t\t\tresolve(model);\n\t\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t\terror: function error(model, response) {\n\t\t\t\t\t\t\t\t\t\treject(response);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\tcase 10:\n\t\t\t\t\t\t\tcurrentUserModel = _context3.sent;\n\t\t\t\t\t\t\t_context3.next = 16;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 13:\n\t\t\t\t\t\t\t_context3.prev = 13;\n\t\t\t\t\t\t\t_context3.t0 = _context3[\"catch\"](7);\n\t\t\t\t\t\t\tthrow _context3.t0;\n\n\t\t\t\t\t\tcase 16:\n\t\t\t\t\t\t\treturn _context3.abrupt(\"return\", currentUserModel);\n\n\t\t\t\t\t\tcase 17:\n\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\treturn _context3.stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, _callee3, this, [[7, 13]]);\n\t\t}));\n\n\t\tfunction fetchCurrentUserModel() {\n\t\t\treturn _ref3.apply(this, arguments);\n\t\t}\n\n\t\treturn fetchCurrentUserModel;\n\t}(),\n\n\tfetchGroupSelectorDefault: function () {\n\t\tvar _ref4 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee4() {\n\t\t\tvar result, currentGroupModel;\n\t\t\treturn _regenerator2.default.wrap(function _callee4$(_context4) {\n\t\t\t\twhile (1) {\n\t\t\t\t\tswitch (_context4.prev = _context4.next) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tresult = void 0;\n\t\t\t\t\t\t\t_context4.next = 3;\n\t\t\t\t\t\t\treturn this.fetchCurrentGroupModel();\n\n\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\tcurrentGroupModel = _context4.sent;\n\n\n\t\t\t\t\t\t\tif (currentGroupModel) {\n\t\t\t\t\t\t\t\tresult = {\n\t\t\t\t\t\t\t\t\tkey: currentGroupModel.get(\"code\"),\n\t\t\t\t\t\t\t\t\tvalue: currentGroupModel.get(\"name\")\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn _context4.abrupt(\"return\", result);\n\n\t\t\t\t\t\tcase 6:\n\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\treturn _context4.stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, _callee4, this);\n\t\t}));\n\n\t\tfunction fetchGroupSelectorDefault() {\n\t\t\treturn _ref4.apply(this, arguments);\n\t\t}\n\n\t\treturn fetchGroupSelectorDefault;\n\t}(),\n\n\tfetchUserSelectorDefault: function () {\n\t\tvar _ref5 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee5() {\n\t\t\tvar result, currentUserModel;\n\t\t\treturn _regenerator2.default.wrap(function _callee5$(_context5) {\n\t\t\t\twhile (1) {\n\t\t\t\t\tswitch (_context5.prev = _context5.next) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tresult = void 0;\n\t\t\t\t\t\t\t_context5.next = 3;\n\t\t\t\t\t\t\treturn this.fetchCurrentUserModel();\n\n\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\tcurrentUserModel = _context5.sent;\n\n\n\t\t\t\t\t\t\tif (currentUserModel) {\n\t\t\t\t\t\t\t\tresult = {\n\t\t\t\t\t\t\t\t\tkey: currentUserModel.get(\"user_id\"),\n\t\t\t\t\t\t\t\t\tvalue: currentUserModel.get(\"firstname\") + \" \" + currentUserModel.get(\"surname\") + \" (\" + currentUserModel.get(\"username\") + \")\"\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn _context5.abrupt(\"return\", result);\n\n\t\t\t\t\t\tcase 6:\n\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\treturn _context5.stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, _callee5, this);\n\t\t}));\n\n\t\tfunction fetchUserSelectorDefault() {\n\t\t\treturn _ref5.apply(this, arguments);\n\t\t}\n\n\t\treturn fetchUserSelectorDefault;\n\t}(),\n\n\tdownloadReport: function downloadReport() {\n\t\twindow.open(settings.urlRoot + \"/api/1.0/attendance/report/\" + this.currentGroupCode);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxheW91dC5qcyJdLCJuYW1lcyI6WyJfIiwicmVxdWlyZSIsIkJhY2tib25lIiwibW9tZW50IiwiUHJvbWlzZSIsInJlc3RlciIsIkFwcCIsInJhZGlvIiwiUmFkaW8iLCJjaGFubmVsIiwic2V0dGluZ3MiLCJBdHRlbmRhbmNlUmVnaXN0ZXJDb2xsZWN0aW9uIiwiQXR0ZW5kYW5jZVJlZ2lzdGVyTW9kZWwiLCJFcnJvclZpZXciLCJHcm91cE1vZGVsIiwiUmVnaXN0ZXIiLCJSZWdpc3RlckhlYWRlciIsIlJlZ2lzdGVyU2VsZWN0b3JIZWFkZXIiLCJSZWdpc3RlclNlbGVjdG9yIiwiU21hbGxNb2RhbCIsIlN0YXR1c1ZpZXciLCJVc2VyUmVwb3J0IiwiVXNlck1vZGVsIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiZXh0ZW5kIiwiY2xhc3NOYW1lIiwidGVtcGxhdGUiLCJyZWdpb25zIiwiYm9keSIsImhlYWRlciIsImluaXRpYWxpemUiLCJhdHRlbmRhbmNlUmVnaXN0ZXJDb2xsZWN0aW9uIiwibGlzdGVuVG8iLCJvbkdyb3VwU2VsZWN0ZWQiLCJiaW5kIiwib25Vc2VyU2VsZWN0ZWQiLCJyZXBseSIsImZldGNoQ3VycmVudEdyb3VwTW9kZWwiLCJmZXRjaEN1cnJlbnRVc2VyTW9kZWwiLCJmZXRjaEF0dGVuZGFuY2VSZWdpc3RlckRhdGVzIiwiZmV0Y2hDYWxlbmRhckRlZmF1bHREYXRlIiwiZmV0Y2hHcm91cFNlbGVjdG9yRGVmYXVsdCIsImZldGNoVXNlclNlbGVjdG9yRGVmYXVsdCIsIm9uQXR0ZW5kYW5jZVJlZ2lzdGVyRGVsZXRlIiwic3dpdGNoVG9SZXBvcnQiLCJzd2l0Y2hUb1JlZ2lzdGVyU2VsZWN0b3IiLCJvbkNhbGVuZGFyQ2hhbmdlIiwib25EYXRlU2VsZWN0ZWQiLCJkb3dubG9hZFJlcG9ydCIsImNyZWF0aW9uUXVldWUiLCJvblJlbmRlciIsIm1vZGUiLCJzaG93UmVnaXN0ZXJTZWxlY3RvckJsYW5rQm9keSIsIm9uQmVmb3JlRGVzdHJveSIsInN0b3BMaXN0ZW5pbmciLCJncm91cENvZGUiLCJ0cmlnZ2VyIiwiRXZlbnRzIiwiQ29tbWFuZHMiLCJOYXZpZ2F0ZSIsInVybFJvb3QiLCJzZWxlY3RHcm91cCIsImlzQWRtaW5Vc2VyIiwic2VsZWN0VXNlciIsImN1cnJlbnRVc2VyIiwicmVxdWVzdCIsIlJlcXVlc3RzIiwiQ3VycmVudFVzZXIiLCJ1c2VyX2lkIiwidXNlcklkIiwiY3VycmVudEdyb3VwQ29kZSIsImRpc3BsYXlEYXRlIiwiY3VycmVudERpc3BsYXlEYXRlIiwidW5peCIsImN1cnJlbnRVc2VySWQiLCJkYXRlIiwic2VsZWN0RGF0ZSIsImF0dGVuZGFuY2VSZWdpc3Rlck1vZGVsIiwiZGVsZXRlQ29uZmlybWF0aW9uTW9kYWwiLCJwZXJzaXN0IiwidGl0bGUiLCJ3YXJuaW5nIiwib24iLCJkZXN0cm95Iiwid2FpdCIsInN1Y2Nlc3MiLCJzaG93UmVnaXN0ZXJTZWxlY3RvckhlYWRlciIsImVycm9yIiwibW9kZWwiLCJyZXNwb25zZSIsImFuc3dlciIsInBhcnNlUmVzcG9uc2UiLCJzaG93RXJyb3IiLCJkZXRhaWwiLCJpbmZvIiwic2hvdyIsIm9wdGlvbnMiLCJzaG93Q2hpbGRWaWV3IiwiQmxhbmsiLCJoYXNBY2Nlc3MiLCJwIiwiYXR0ZW5kYW5jZSIsImFsbCIsInNob3dMb2FkaW5nU3RhdHVzIiwibmF2aWdhdGVUb1NlY3Rpb24iLCJpZGVudGlmaWVycyIsImdyb3VwIiwicGFyc2VJbnQiLCJ1c2VyIiwiYXR0ZW5kYW5jZVJlZ2lzdGVyIiwic2VsZWN0QXR0ZW5kYW5jZVJlZ2lzdGVyIiwibmF2aWdhdGVUb1VzZXJSZXBvcnQiLCJzaG93VXNlclJlcG9ydCIsInNob3dSZWdpc3RlclNlbGVjdG9yIiwiZ2V0UmVnaW9uIiwiY3VycmVudFZpZXciLCJDYWxlbmRhciIsInJlZ2lzdGVyQ2FsZW5kYXIiLCJyZW5kZXIiLCJDb25zb2xlIiwic2hvd1JlZ2lzdGVyIiwid2l0aG91dCIsImdldCIsImFkZCIsInVybCIsImF0dGVuZGFuY2VSZWdpc3RlcklkIiwicmVnaXN0ZXJfaWQiLCJmZXRjaCIsImluY2x1ZGVzIiwiZmluZCIsIm1vZGVscyIsInJlZ2lzdGVyIiwiaXNTYW1lIiwidW5kZWZpbmVkIiwicm9sZXMiLCJhbGVydCIsInB1c2giLCJzYXZlIiwiY3JlYXRlZCIsIm93bmVyIiwic3RhcnREYXRlIiwiZW5kRGF0ZSIsInJlc29sdmUiLCJyZWplY3QiLCJlbmNvZGVVUklDb21wb25lbnQiLCJkYXRhIiwicmVzZXQiLCJoaWdobGlnaHRlZERhdGVzIiwibWFya2VkRGF0ZXMiLCJpbnZva2VNYXAiLCJjb2xsZWN0aW9uIiwiY3VycmVudEdyb3VwTW9kZWwiLCJjb2RlIiwiY3VycmVudFVzZXJNb2RlbCIsIl9pZCIsInJlc3VsdCIsImtleSIsInZhbHVlIiwid2luZG93Iiwib3BlbiJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLFdBQVdELFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1FLFNBQVNGLFFBQVEsUUFBUixDQUFmO0FBQ0EsSUFBTUcsVUFBVUgsUUFBUSxVQUFSLENBQWhCO0FBQ0EsSUFBTUksU0FBU0osUUFBUSxRQUFSLENBQWY7O0FBRUEsSUFBTUssTUFBTUwsUUFBUSxnQkFBUixDQUFaO0FBQ0EsSUFBTU0sUUFBUUwsU0FBU00sS0FBVCxDQUFlQyxPQUFmLENBQXVCLFFBQXZCLENBQWQ7QUFDQSxJQUFNQyxXQUFXVCxRQUFRLGNBQVIsQ0FBakI7O0FBRUEsSUFBTVUsK0JBQStCVixRQUFRLDJEQUFSLENBQXJDO0FBQ0EsSUFBTVcsMEJBQTBCWCxRQUFRLGlEQUFSLENBQWhDO0FBQ0EsSUFBTVksWUFBWVosUUFBUSx3QkFBUixDQUFsQjtBQUNBLElBQU1hLGFBQWFiLFFBQVEsa0NBQVIsQ0FBbkI7QUFDQSxJQUFNYyxXQUFXZCxRQUFRLFlBQVIsQ0FBakI7QUFDQSxJQUFNZSxpQkFBaUJmLFFBQVEs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QUEsSUF2YWdEOztBQXFiaERqSDtBQUFBLHlFQUEwQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDckJpSCxhQURxQjtBQUFBO0FBQUEsY0FFTSxLQUFLckgscUJBQUwsRUFGTjs7QUFBQTtBQUVuQm1ILHVCQUZtQjs7O0FBSXpCLFdBQUlBLGdCQUFKLEVBQXNCO0FBQ3JCRSxpQkFBUztBQUNSQyxjQUFLSCxpQkFBaUIvQixHQUFqQixDQUFxQixTQUFyQixDQURHO0FBRVJtQyxnQkFBT0osaUJBQWlCL0IsR0FBakIsQ0FBcUIsV0FBckIsSUFBb0MsR0FBcEMsR0FBMEMrQixpQkFBaUIvQixHQUFqQixDQUFxQixTQUFyQixDQUExQyxHQUE0RSxJQUE1RSxHQUFtRitCLGlCQUFpQi9CLEdBQWpCLENBQXFCLFVBQXJCLENBQW5GLEdBQXNIO0FBRnJILFNBQVQ7QUFJQTs7QUFUd0IseUNBV2xCaUMsTUFYa0I7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsR0FBMUI7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEsSUFyYmdEOztBQW1jaEQzRyxpQkFBZ0IsMEJBQVc7QUFDMUI4RyxTQUFPQyxJQUFQLENBQVl4SixTQUFTcUQsT0FBVCxHQUFtQiw2QkFBbkIsR0FBbUQsS0FBS1UsZ0JBQXBFO0FBQ0E7QUFyYytDLENBQWhDLENBQWpCIiwiZmlsZSI6ImxheW91dC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IG1vbWVudCA9IHJlcXVpcmUoXCJtb21lbnRcIik7XG5jb25zdCBQcm9taXNlID0gcmVxdWlyZShcImJsdWViaXJkXCIpO1xuY29uc3QgcmVzdGVyID0gcmVxdWlyZShcInJlc3RlclwiKTtcblxuY29uc3QgQXBwID0gcmVxdWlyZShcIi4uLy4uLy4uL2luZGV4XCIpO1xuY29uc3QgcmFkaW8gPSBCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZ2xvYmFsXCIpO1xuY29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuXG5jb25zdCBBdHRlbmRhbmNlUmVnaXN0ZXJDb2xsZWN0aW9uID0gcmVxdWlyZShcIi4uLy4uL2NvbGxlY3Rpb25zL2F0dGVuZGFuY2UvYXR0ZW5kYW5jZVJlZ2lzdGVyQ29sbGVjdGlvblwiKTtcbmNvbnN0IEF0dGVuZGFuY2VSZWdpc3Rlck1vZGVsID0gcmVxdWlyZShcIi4uLy4uL21vZGVscy9hdHRlbmRhbmNlL2F0dGVuZGFuY2VSZWdpc3Rlck1vZGVsXCIpO1xuY29uc3QgRXJyb3JWaWV3ID0gcmVxdWlyZShcIi4uLy4uLy4uL2xpYi9lcnJvclZpZXdcIik7XG5jb25zdCBHcm91cE1vZGVsID0gcmVxdWlyZShcIi4uLy4uLy4uL2dyb3Vwcy92aWV3cy9ncm91cE1vZGVsXCIpO1xuY29uc3QgUmVnaXN0ZXIgPSByZXF1aXJlKFwiLi9yZWdpc3RlclwiKTtcbmNvbnN0IFJlZ2lzdGVySGVhZGVyID0gcmVxdWlyZShcIi4vcmVnaXN0ZXJIZWFkZXJcIik7XG5jb25zdCBSZWdpc3RlclNlbGVjdG9ySGVhZGVyID0gcmVxdWlyZShcIi4vcmVnaXN0ZXJTZWxlY3RvckhlYWRlclwiKTtcbmNvbnN0IFJlZ2lzdGVyU2VsZWN0b3IgPSByZXF1aXJlKFwiLi9yZWdpc3RlclNlbGVjdG9yXCIpO1xuY29uc3QgU21hbGxNb2RhbCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9saWIvc21hbGxNb2RhbFwiKTtcbmNvbnN0IFN0YXR1c1ZpZXcgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL3N0YXR1c1ZpZXdcIik7XG5jb25zdCBVc2VyUmVwb3J0ID0gcmVxdWlyZShcIi4vdXNlclJlcG9ydFwiKTtcbmNvbnN0IFVzZXJNb2RlbCA9IHJlcXVpcmUoXCIuLi8uLi8uLi91c2Vycy91c2VyTW9kZWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJmaXhlZC1jb250ZW50IGF0dGVuZGFuY2UtbGF5b3V0XCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvYXR0ZW5kYW5jZS9sYXlvdXQubnVualwiKSxcblxuXHRyZWdpb25zOiB7XG5cdFx0Ym9keTogXCIuYm9keS1yZWdpb25cIixcblx0XHRoZWFkZXI6IFwiLmhlYWRlci1yZWdpb25cIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmF0dGVuZGFuY2VSZWdpc3RlckNvbGxlY3Rpb24gPSBuZXcgQXR0ZW5kYW5jZVJlZ2lzdGVyQ29sbGVjdGlvbigpO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZ3JvdXBTZWxlY3RvclwiKSwgXCJFdmVudHMuVmFsdWVDaGFuZ2VkXCIsIHRoaXMub25Hcm91cFNlbGVjdGVkLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8oQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcInVzZXJTZWxlY3RvclwiKSwgXCJFdmVudHMuVmFsdWVDaGFuZ2VkXCIsIHRoaXMub25Vc2VyU2VsZWN0ZWQuYmluZCh0aGlzKSk7XG5cblx0XHRCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiYXR0ZW5kYW5jZVJlZ2lzdGVyXCIpLnJlcGx5KFwiZ3JvdXA6ZmV0Y2g6Y3VycmVudFwiLCB0aGlzLmZldGNoQ3VycmVudEdyb3VwTW9kZWwuYmluZCh0aGlzKSk7XG5cdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImF0dGVuZGFuY2VSZWdpc3RlclwiKS5yZXBseShcInVzZXI6ZmV0Y2g6Y3VycmVudFwiLCB0aGlzLmZldGNoQ3VycmVudFVzZXJNb2RlbC5iaW5kKHRoaXMpKTtcblxuXHRcdEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJhdHRlbmRhbmNlUmVnaXN0ZXJTZWxlY3RvclwiKS5yZXBseShcImNhbGVuZGFyOmZldGNoXCIsIHRoaXMuZmV0Y2hBdHRlbmRhbmNlUmVnaXN0ZXJEYXRlcy5iaW5kKHRoaXMpKTtcblx0XHRCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiYXR0ZW5kYW5jZVJlZ2lzdGVyU2VsZWN0b3JcIikucmVwbHkoXCJjYWxlbmRhcjpkYXRlOmRlZmF1bHRcIiwgdGhpcy5mZXRjaENhbGVuZGFyRGVmYXVsdERhdGUuYmluZCh0aGlzKSk7XG5cdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImF0dGVuZGFuY2VSZWdpc3RlclNlbGVjdG9yXCIpLnJlcGx5KFwiZ3JvdXA6ZmV0Y2g6ZGVmYXVsdFwiLCB0aGlzLmZldGNoR3JvdXBTZWxlY3RvckRlZmF1bHQuYmluZCh0aGlzKSk7XG5cdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImF0dGVuZGFuY2VSZWdpc3RlclNlbGVjdG9yXCIpLnJlcGx5KFwidXNlcjpmZXRjaDpkZWZhdWx0XCIsIHRoaXMuZmV0Y2hVc2VyU2VsZWN0b3JEZWZhdWx0LmJpbmQodGhpcykpO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiYXR0ZW5kYW5jZVJlZ2lzdGVyXCIpLCB7XG5cdFx0XHRcInJlZ2lzdGVyOmRlbGV0ZVwiOiB0aGlzLm9uQXR0ZW5kYW5jZVJlZ2lzdGVyRGVsZXRlLmJpbmQodGhpcyksXG5cdFx0XHRcInJlcG9ydFN3aXRjaDpjaGFuZ2VkOm9uXCI6IHRoaXMuc3dpdGNoVG9SZXBvcnQuYmluZCh0aGlzKSxcblx0XHRcdFwicmVwb3J0U3dpdGNoOmNoYW5nZWQ6b2ZmXCI6IHRoaXMuc3dpdGNoVG9SZWdpc3RlclNlbGVjdG9yLmJpbmQodGhpcyksXG5cdFx0fSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJhdHRlbmRhbmNlUmVnaXN0ZXJTZWxlY3RvclwiKSwge1xuXHRcdFx0XCJjYWxlbmRhcjpjaGFuZ2VcIjogdGhpcy5vbkNhbGVuZGFyQ2hhbmdlLmJpbmQodGhpcyksXG5cdFx0XHRcImNhbGVuZGFyOnNlbGVjdFwiOiB0aGlzLm9uRGF0ZVNlbGVjdGVkLmJpbmQodGhpcyksXG5cdFx0XHRcInJlcG9ydDpkb3dubG9hZFwiOiB0aGlzLmRvd25sb2FkUmVwb3J0LmJpbmQodGhpcyksXG5cdFx0fSk7XG5cblx0XHR0aGlzLmNyZWF0aW9uUXVldWUgPSBbXTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5tb2RlID0gXCJyZWdpc3RlclwiO1xuXHRcdHRoaXMuc2hvd1JlZ2lzdGVyU2VsZWN0b3JCbGFua0JvZHkoKTtcblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc3RvcExpc3RlbmluZyhCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZ3JvdXBTZWxlY3RvclwiKSk7XG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJhdHRlbmRhbmNlUmVnaXN0ZXJTZWxlY3RvclwiKSk7XG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJ1c2VyU2VsZWN0b3JcIikpO1xuXHR9LFxuXG5cdG9uR3JvdXBTZWxlY3RlZDogZnVuY3Rpb24oZ3JvdXBDb2RlKSB7XG5cdFx0aWYgKHRoaXMubW9kZSA9PT0gXCJyZWdpc3RlclwiKSB7XG5cdFx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuTmF2aWdhdGUsXG5cdFx0XHRcdHNldHRpbmdzLnVybFJvb3QgKyBcIi9jb25zb2xlL2F0dGVuZGFuY2UvcmVnaXN0ZXIvXCIgKyBncm91cENvZGUsXG5cdFx0XHRcdHsgdHJpZ2dlcjogZmFsc2UgfSk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLk5hdmlnYXRlLFxuXHRcdFx0XHRzZXR0aW5ncy51cmxSb290ICsgXCIvY29uc29sZS9hdHRlbmRhbmNlL3JlcG9ydC91c2VyL1wiICsgZ3JvdXBDb2RlLFxuXHRcdFx0XHR7IHRyaWdnZXI6IGZhbHNlIH0pO1xuXHRcdH1cblxuXHRcdHRoaXMuc2VsZWN0R3JvdXAoZ3JvdXBDb2RlKTtcblxuXHRcdGlmICh0aGlzLmlzQWRtaW5Vc2VyKCkpIHtcblx0XHRcdHRoaXMuc2VsZWN0VXNlcigpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGNvbnN0IGN1cnJlbnRVc2VyID0gcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblx0XHRcdHRoaXMub25Vc2VyU2VsZWN0ZWQoY3VycmVudFVzZXIudXNlcl9pZCk7XG5cdFx0fVxuXHR9LFxuXG5cdG9uVXNlclNlbGVjdGVkOiBmdW5jdGlvbih1c2VySWQpIHtcblx0XHRpZiAodXNlcklkKSB7XG5cdFx0XHRpZiAodGhpcy5tb2RlID09PSBcInJlZ2lzdGVyXCIpIHtcblx0XHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLk5hdmlnYXRlLFxuXHRcdFx0XHRcdHNldHRpbmdzLnVybFJvb3QgKyBcIi9jb25zb2xlL2F0dGVuZGFuY2UvcmVnaXN0ZXIvXCIgKyB0aGlzLmN1cnJlbnRHcm91cENvZGUgKyBcIi9cIiArIHVzZXJJZCxcblx0XHRcdFx0XHR7IHRyaWdnZXI6IGZhbHNlIH0pO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0ZSxcblx0XHRcdFx0XHRzZXR0aW5ncy51cmxSb290ICsgXCIvY29uc29sZS9hdHRlbmRhbmNlL3JlcG9ydC91c2VyL1wiICsgdGhpcy5jdXJyZW50R3JvdXBDb2RlICsgXCIvXCIgKyB1c2VySWQsXG5cdFx0XHRcdFx0eyB0cmlnZ2VyOiBmYWxzZSB9KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLnNlbGVjdFVzZXIodXNlcklkKTtcblx0fSxcblxuXHRvbkNhbGVuZGFyQ2hhbmdlOiBmdW5jdGlvbihkaXNwbGF5RGF0ZSkge1xuXHRcdHRoaXMuY3VycmVudERpc3BsYXlEYXRlID0gZGlzcGxheURhdGUudW5peCgpO1xuXG5cdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLk5hdmlnYXRlLFxuXHRcdFx0c2V0dGluZ3MudXJsUm9vdCArIFwiL2NvbnNvbGUvYXR0ZW5kYW5jZS9yZWdpc3Rlci9cIiArIHRoaXMuY3VycmVudEdyb3VwQ29kZSArIFwiL1wiICsgdGhpcy5jdXJyZW50VXNlcklkICsgXCIvXCIgK1xuXHRcdFx0dGhpcy5jdXJyZW50RGlzcGxheURhdGUsXG5cdFx0XHR7IHRyaWdnZXI6IGZhbHNlIH0pO1xuXHR9LFxuXG5cdG9uRGF0ZVNlbGVjdGVkOiBmdW5jdGlvbihkYXRlKSB7XG5cdFx0dGhpcy5zZWxlY3REYXRlKGRhdGUpO1xuXHR9LFxuXG5cdG9uQXR0ZW5kYW5jZVJlZ2lzdGVyRGVsZXRlOiBmdW5jdGlvbihhdHRlbmRhbmNlUmVnaXN0ZXJNb2RlbCkge1xuXHRcdHRoaXMuZGVsZXRlQ29uZmlybWF0aW9uTW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHRwZXJzaXN0OiB0cnVlLFxuXHRcdFx0dGl0bGU6IFwiPHNwYW4gY2xhc3M9J2ZhbCBmYS1leGNsYW1hdGlvbi10cmlhbmdsZScvPiBEZWxldGUgQXR0ZW5kYW5jZSBSZWdpc3RlclwiLFxuXHRcdFx0Ym9keTogXCI8cD5BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgYXR0ZW5kYW5jZSByZWdpc3Rlcj88L3A+XCIsXG5cdFx0XHR3YXJuaW5nOiB0cnVlLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5kZWxldGVDb25maXJtYXRpb25Nb2RhbC5vbihcImJ1dHRvbjpva1wiLCAoKSA9PiB7XG5cdFx0XHRhdHRlbmRhbmNlUmVnaXN0ZXJNb2RlbC5kZXN0cm95KHtcblx0XHRcdFx0d2FpdDogdHJ1ZSxcblxuXHRcdFx0XHRzdWNjZXNzOiAoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5kZWxldGVDb25maXJtYXRpb25Nb2RhbC5kZXN0cm95KCk7XG5cblx0XHRcdFx0XHR0aGlzLnNob3dSZWdpc3RlclNlbGVjdG9yQmxhbmtCb2R5KCk7XG5cdFx0XHRcdFx0dGhpcy5zaG93UmVnaXN0ZXJTZWxlY3RvckhlYWRlcigpO1xuXG5cdFx0XHRcdFx0aWYgKHRoaXMuY3VycmVudFVzZXJJZCAmJiAhdGhpcy5pc0FkbWluVXNlcigpKVxuXHRcdFx0XHRcdFx0dGhpcy5zZWxlY3RVc2VyKHRoaXMuY3VycmVudFVzZXJJZCk7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0ZXJyb3I6IChtb2RlbCwgcmVzcG9uc2UpID0+IHtcblx0XHRcdFx0XHRjb25zdCBhbnN3ZXIgPSBBcHAucGFyc2VSZXNwb25zZShyZXNwb25zZSk7XG5cdFx0XHRcdFx0dGhpcy5kZWxldGVDb25maXJtYXRpb25Nb2RhbC5zaG93RXJyb3IoXCJEZWxldGlvbiBmYWlsZWQ6IFwiICsgKGFuc3dlci5kZXRhaWwgfHwgYW5zd2VyLmluZm8pKTtcblx0XHRcdFx0fSxcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5kZWxldGVDb25maXJtYXRpb25Nb2RhbC5zaG93KCk7XG5cdH0sXG5cblx0c2hvd1JlZ2lzdGVyU2VsZWN0b3JIZWFkZXI6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJoZWFkZXJcIiwgbmV3IFJlZ2lzdGVyU2VsZWN0b3JIZWFkZXIob3B0aW9ucykpO1xuXHR9LFxuXG5cdHNob3dSZWdpc3RlclNlbGVjdG9yQmxhbmtCb2R5OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJib2R5XCIsIG5ldyBSZWdpc3RlclNlbGVjdG9yLkJsYW5rKCkpO1xuXHR9LFxuXG5cdGlzQWRtaW5Vc2VyOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gcmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5hdHRlbmRhbmNlLmFsbCwgcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKSk7XG5cdH0sXG5cblx0c2hvd0xvYWRpbmdTdGF0dXM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImJvZHlcIiwgbmV3IFN0YXR1c1ZpZXcoKSk7XG5cdH0sXG5cblx0c2hvd0Vycm9yOiBmdW5jdGlvbihlcnJvcikge1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImJvZHlcIiwgbmV3IEVycm9yVmlldyhlcnJvcikpO1xuXHR9LFxuXG5cdG5hdmlnYXRlVG9TZWN0aW9uOiBmdW5jdGlvbihpZGVudGlmaWVycykge1xuXHRcdHRoaXMuY3VycmVudEdyb3VwQ29kZSA9IGlkZW50aWZpZXJzLmdyb3VwO1xuXHRcdHRoaXMuY3VycmVudFVzZXJJZCA9IHBhcnNlSW50KGlkZW50aWZpZXJzLnVzZXIsIDEwKTtcblx0XHR0aGlzLmN1cnJlbnREaXNwbGF5RGF0ZSA9IGlkZW50aWZpZXJzLmRpc3BsYXlEYXRlO1xuXG5cdFx0aWYgKGlkZW50aWZpZXJzLmF0dGVuZGFuY2VSZWdpc3Rlcikge1xuXHRcdFx0dGhpcy5zZWxlY3RBdHRlbmRhbmNlUmVnaXN0ZXIocGFyc2VJbnQoaWRlbnRpZmllcnMuYXR0ZW5kYW5jZVJlZ2lzdGVyLCAxMCkpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMuc2hvd1JlZ2lzdGVyU2VsZWN0b3JCbGFua0JvZHkoKTtcblx0XHRcdHRoaXMuc2hvd1JlZ2lzdGVyU2VsZWN0b3JIZWFkZXIoeyBtb2RlOiBcInJlZ2lzdGVyXCIgfSk7XG5cblx0XHRcdGlmICh0aGlzLmN1cnJlbnRVc2VySWQgJiYgIXRoaXMuaXNBZG1pblVzZXIoKSlcblx0XHRcdFx0dGhpcy5zZWxlY3RVc2VyKHBhcnNlSW50KGlkZW50aWZpZXJzLnVzZXIsIDEwKSk7XG5cblx0XHRcdGlmICh0aGlzLmN1cnJlbnRHcm91cENvZGUpXG5cdFx0XHRcdHRoaXMuc2VsZWN0R3JvdXAodGhpcy5jdXJyZW50R3JvdXBDb2RlKTtcblx0XHR9XG5cdH0sXG5cblx0bmF2aWdhdGVUb1VzZXJSZXBvcnQ6IGZ1bmN0aW9uKGlkZW50aWZpZXJzKSB7XG5cdFx0dGhpcy5jdXJyZW50R3JvdXBDb2RlID0gaWRlbnRpZmllcnMuZ3JvdXA7XG5cdFx0dGhpcy5jdXJyZW50VXNlcklkID0gcGFyc2VJbnQoaWRlbnRpZmllcnMudXNlciwgMTApO1xuXG5cdFx0dGhpcy5zaG93UmVnaXN0ZXJTZWxlY3RvckhlYWRlcih7IG1vZGU6IFwicmVwb3J0XCIgfSk7XG5cblx0XHRpZiAodGhpcy5jdXJyZW50R3JvdXBDb2RlKVxuXHRcdFx0dGhpcy5zZWxlY3RHcm91cCh0aGlzLmN1cnJlbnRHcm91cENvZGUpO1xuXG5cdFx0dGhpcy5zd2l0Y2hUb1JlcG9ydCgpO1xuXHRcdHRoaXMubW9kZSA9IFwicmVwb3J0XCI7XG5cdH0sXG5cblx0c3dpdGNoVG9SZXBvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMubW9kZSA9IFwicmVwb3J0XCI7XG5cdFx0dGhpcy5zaG93VXNlclJlcG9ydCgpO1xuXHR9LFxuXG5cdHN3aXRjaFRvUmVnaXN0ZXJTZWxlY3RvcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5tb2RlID0gXCJyZWdpc3RlclwiO1xuXHRcdHRoaXMuc2hvd1JlZ2lzdGVyU2VsZWN0b3IoKTtcblx0fSxcblxuXHRzZWxlY3RHcm91cDogZnVuY3Rpb24oZ3JvdXBDb2RlKSB7XG5cdFx0aWYgKCF0aGlzLmN1cnJlbnRVc2VySWQpIHtcblx0XHRcdGlmICh0aGlzLm1vZGUgPT09IFwicmVnaXN0ZXJcIilcblx0XHRcdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiYm9keVwiLCBuZXcgUmVnaXN0ZXJTZWxlY3Rvci5CbGFuaygpKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiYm9keVwiLCBuZXcgVXNlclJlcG9ydC5CbGFuaygpKTtcblx0XHR9XG5cblx0XHR0aGlzLmN1cnJlbnRHcm91cENvZGUgPSBncm91cENvZGU7XG5cblx0XHRCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiYXR0ZW5kYW5jZVJlZ2lzdGVyU2VsZWN0b3JcIikudHJpZ2dlcihcImdyb3VwOnNlbGVjdFwiLCB0aGlzLmN1cnJlbnRHcm91cENvZGUpO1xuXHR9LFxuXG5cdHNlbGVjdFVzZXI6IGZ1bmN0aW9uKHVzZXJJZCkge1xuXHRcdHRoaXMuY3VycmVudFVzZXJJZCA9IHVzZXJJZDtcblxuXHRcdGlmICghdGhpcy5jdXJyZW50VXNlcklkKSB7XG5cdFx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJib2R5XCIsIG5ldyBSZWdpc3RlclNlbGVjdG9yLkJsYW5rKCkpO1xuXHRcdH1cblx0XHRlbHNlIGlmICh0aGlzLmN1cnJlbnRHcm91cENvZGUgJiYgdGhpcy5jdXJyZW50VXNlcklkKSB7XG5cdFx0XHRpZiAodGhpcy5tb2RlID09PSBcInJlZ2lzdGVyXCIpIHtcblx0XHRcdFx0aWYgKHRoaXMuZ2V0UmVnaW9uKFwiYm9keVwiKS5jdXJyZW50VmlldyBpbnN0YW5jZW9mIFJlZ2lzdGVyU2VsZWN0b3IuQ2FsZW5kYXIpXG5cdFx0XHRcdFx0dGhpcy5nZXRSZWdpb24oXCJib2R5XCIpLmN1cnJlbnRWaWV3LnJlZ2lzdGVyQ2FsZW5kYXIucmVuZGVyKCk7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJib2R5XCIsIG5ldyBSZWdpc3RlclNlbGVjdG9yLkNhbGVuZGFyKCkpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImJvZHlcIiwgbmV3IFVzZXJSZXBvcnQuQ29uc29sZSgpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiYXR0ZW5kYW5jZVJlZ2lzdGVyU2VsZWN0b3JcIikudHJpZ2dlcihcImNhbGVuZGFyOnJlZnJlc2hcIik7XG5cdFx0fVxuXG5cdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImF0dGVuZGFuY2VSZWdpc3RlclNlbGVjdG9yXCIpLnRyaWdnZXIoXCJ1c2VyOnNlbGVjdFwiLCB0aGlzLmN1cnJlbnRVc2VySWQpO1xuXHR9LFxuXG5cdHNob3dSZWdpc3RlcjogZnVuY3Rpb24oYXR0ZW5kYW5jZVJlZ2lzdGVyTW9kZWwpIHtcblx0XHR0aGlzLmNyZWF0aW9uUXVldWUgPSBfLndpdGhvdXQodGhpcy5jcmVhdGlvblF1ZXVlLCBhdHRlbmRhbmNlUmVnaXN0ZXJNb2RlbC5nZXQoXCJjcmVhdGVkXCIpKTtcblx0XHR0aGlzLmF0dGVuZGFuY2VSZWdpc3RlckNvbGxlY3Rpb24uYWRkKGF0dGVuZGFuY2VSZWdpc3Rlck1vZGVsKTtcblxuXHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0ZSxcblx0XHRcdHNldHRpbmdzLnVybFJvb3QgKyBcIi9jb25zb2xlL2F0dGVuZGFuY2UvcmVnaXN0ZXIvXCIgKyB0aGlzLmN1cnJlbnRHcm91cENvZGUgKyBcIi9cIiArIHRoaXMuY3VycmVudFVzZXJJZCArIFwiL1wiICtcblx0XHRcdHRoaXMuY3VycmVudERpc3BsYXlEYXRlICsgXCIvXCIgKyBhdHRlbmRhbmNlUmVnaXN0ZXJNb2RlbC5nZXQoXCJyZWdpc3Rlcl9pZFwiKSxcblx0XHRcdHsgdHJpZ2dlcjogZmFsc2UgfSk7XG5cblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJoZWFkZXJcIiwgbmV3IFJlZ2lzdGVySGVhZGVyKHsgbW9kZWw6IGF0dGVuZGFuY2VSZWdpc3Rlck1vZGVsIH0pKTtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJib2R5XCIsIG5ldyBSZWdpc3Rlcih7IG1vZGVsOiBhdHRlbmRhbmNlUmVnaXN0ZXJNb2RlbCB9KSk7XG5cdH0sXG5cblx0c2hvd1JlZ2lzdGVyU2VsZWN0b3I6IGZ1bmN0aW9uKCkge1xuXHRcdGxldCB1cmwgPSBzZXR0aW5ncy51cmxSb290ICsgXCIvY29uc29sZS9hdHRlbmRhbmNlL3JlZ2lzdGVyXCI7XG5cblx0XHRpZiAodGhpcy5jdXJyZW50VXNlcklkKSB7XG5cdFx0XHR1cmwgKz0gXCIvXCIgKyB0aGlzLmN1cnJlbnRHcm91cENvZGUgKyBcIi9cIiArIHRoaXMuY3VycmVudFVzZXJJZDtcblx0XHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImJvZHlcIiwgbmV3IFJlZ2lzdGVyU2VsZWN0b3IuQ2FsZW5kYXIoKSk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0aWYgKHRoaXMuY3VycmVudEdyb3VwQ29kZSlcblx0XHRcdFx0dXJsICs9IFwiL1wiICsgdGhpcy5jdXJyZW50R3JvdXBDb2RlO1xuXG5cdFx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJib2R5XCIsIG5ldyBSZWdpc3RlclNlbGVjdG9yLkJsYW5rKCkpO1xuXHRcdH1cblxuXHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0ZSxcdHVybCwgeyB0cmlnZ2VyOiBmYWxzZSB9KTtcblx0fSxcblxuXHRzaG93VXNlclJlcG9ydDogYXN5bmMgZnVuY3Rpb24oKSB7XG5cdFx0bGV0IHVybCA9IHNldHRpbmdzLnVybFJvb3QgKyBcIi9jb25zb2xlL2F0dGVuZGFuY2UvcmVwb3J0L3VzZXJcIjtcblxuXHRcdGlmICh0aGlzLmN1cnJlbnRVc2VySWQpIHtcblx0XHRcdHVybCArPSBcIi9cIiArIHRoaXMuY3VycmVudEdyb3VwQ29kZSArIFwiL1wiICsgdGhpcy5jdXJyZW50VXNlcklkO1xuXHRcdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiYm9keVwiLCBuZXcgVXNlclJlcG9ydC5Db25zb2xlKCkpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGlmICh0aGlzLmN1cnJlbnRHcm91cENvZGUpXG5cdFx0XHRcdHVybCArPSBcIi9cIiArIHRoaXMuY3VycmVudEdyb3VwQ29kZTtcblxuXHRcdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiYm9keVwiLCBuZXcgVXNlclJlcG9ydC5CbGFuaygpKTtcblx0XHR9XG5cblx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuTmF2aWdhdGUsXHR1cmwsIHsgdHJpZ2dlcjogZmFsc2UgfSk7XG5cdH0sXG5cblx0c2VsZWN0QXR0ZW5kYW5jZVJlZ2lzdGVyOiBmdW5jdGlvbihhdHRlbmRhbmNlUmVnaXN0ZXJJZCkge1xuXHRcdGNvbnN0IGF0dGVuZGFuY2VSZWdpc3Rlck1vZGVsID0gbmV3IEF0dGVuZGFuY2VSZWdpc3Rlck1vZGVsKHsgcmVnaXN0ZXJfaWQ6IGF0dGVuZGFuY2VSZWdpc3RlcklkIH0pO1xuXG5cdFx0YXR0ZW5kYW5jZVJlZ2lzdGVyTW9kZWwuZmV0Y2goe1xuXHRcdFx0c3VjY2VzczogdGhpcy5zaG93UmVnaXN0ZXIuYmluZCh0aGlzKSxcblx0XHRcdGVycm9yOiAobW9kZWwsIHJlc3BvbnNlKSA9PiB7XG5cdFx0XHRcdHRoaXMuc2hvd0Vycm9yKHJlc3BvbnNlKTtcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH0sXG5cblx0c2VsZWN0RGF0ZTogZnVuY3Rpb24oZGF0ZSkge1xuXHRcdGlmIChfLmluY2x1ZGVzKHRoaXMuY3JlYXRpb25RdWV1ZSwgZGF0ZS51bml4KCkpKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0bGV0IGF0dGVuZGFuY2VSZWdpc3Rlck1vZGVsID0gXy5maW5kKHRoaXMuYXR0ZW5kYW5jZVJlZ2lzdGVyQ29sbGVjdGlvbi5tb2RlbHMsIHJlZ2lzdGVyID0+XG5cdFx0XHRtb21lbnQudW5peChyZWdpc3Rlci5nZXQoXCJjcmVhdGVkXCIpKS5pc1NhbWUoZGF0ZSwgXCJkYXlcIikpO1xuXG5cdFx0aWYgKGF0dGVuZGFuY2VSZWdpc3Rlck1vZGVsID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIElmIHdlIGRvbid0IGhhdmUgdGhlIHJpZ2h0IHJvbGVzLCBkb24ndCBhdXRvLWNyZWF0ZSBhIHJlZ2lzdGVyXG5cdFx0XHRjb25zdCB1c2VyID0gcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblx0XHRcdGlmICghXy5pbmNsdWRlcyh1c2VyLnJvbGVzLCBcInRlYWNoZXJcIikpXG5cdFx0XHRcdHJldHVybiBhbGVydChcIk5vIHJlZ2lzdGVyIGZvciB0aGF0IHVzZXIgb24gdGhhdCBkYXRlXCIpO1xuXG5cdFx0XHR0aGlzLmNyZWF0aW9uUXVldWUucHVzaChkYXRlLnVuaXgoKSk7XG5cblx0XHRcdGF0dGVuZGFuY2VSZWdpc3Rlck1vZGVsID0gbmV3IEF0dGVuZGFuY2VSZWdpc3Rlck1vZGVsKCk7XG5cblx0XHRcdGF0dGVuZGFuY2VSZWdpc3Rlck1vZGVsLnNhdmUoe1xuXHRcdFx0XHRjcmVhdGVkOiBkYXRlLnVuaXgoKSxcblx0XHRcdFx0Z3JvdXA6IHRoaXMuY3VycmVudEdyb3VwQ29kZSxcblx0XHRcdFx0b3duZXI6IHRoaXMuY3VycmVudFVzZXJJZCxcblx0XHRcdH0sIHtcblx0XHRcdFx0d2FpdDogdHJ1ZSxcblx0XHRcdFx0c3VjY2VzczogdGhpcy5zaG93UmVnaXN0ZXIuYmluZCh0aGlzKSxcblx0XHRcdFx0ZXJyb3I6IChtb2RlbCwgcmVzcG9uc2UpID0+IHtcblx0XHRcdFx0XHR0aGlzLnNob3dFcnJvcihyZXNwb25zZSk7XG5cdFx0XHRcdFx0dGhpcy5jcmVhdGlvblF1ZXVlID0gXy53aXRob3V0KHRoaXMuY3JlYXRpb25RdWV1ZSwgZGF0ZS51bml4KCkpO1xuXHRcdFx0XHR9LFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5zaG93UmVnaXN0ZXIoYXR0ZW5kYW5jZVJlZ2lzdGVyTW9kZWwpO1xuXHRcdH1cblx0fSxcblxuXHRmZXRjaEF0dGVuZGFuY2VSZWdpc3RlckRhdGVzOiBmdW5jdGlvbihzdGFydERhdGUsIGVuZERhdGUsIHJlc29sdmUsIHJlamVjdCkge1xuXHRcdHRoaXMuYXR0ZW5kYW5jZVJlZ2lzdGVyQ29sbGVjdGlvbi5mZXRjaCh7XG5cdFx0XHR1cmw6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2F0dGVuZGFuY2UvcmVnaXN0ZXJzL2J5R3JvdXAvXCIgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy5jdXJyZW50R3JvdXBDb2RlKSxcblx0XHRcdGRhdGE6IHtcblx0XHRcdFx0b3duZXI6IHRoaXMuY3VycmVudFVzZXJJZCxcblx0XHRcdFx0c3RhcnREYXRlOiBzdGFydERhdGUudW5peCgpLFxuXHRcdFx0XHRlbmREYXRlOiBlbmREYXRlLnVuaXgoKSxcblx0XHRcdH0sXG5cblx0XHRcdHJlc2V0OiB0cnVlLFxuXG5cdFx0XHRzdWNjZXNzOiBjb2xsZWN0aW9uID0+IHtcblx0XHRcdFx0cmVzb2x2ZSh7XG5cdFx0XHRcdFx0aGlnaGxpZ2h0ZWREYXRlczogW21vbWVudCgpLnVuaXgoKV0sXG5cdFx0XHRcdFx0bWFya2VkRGF0ZXM6IF8uaW52b2tlTWFwKGNvbGxlY3Rpb24ubW9kZWxzLCBcImdldFwiLCBcImNyZWF0ZWRcIiksXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblxuXHRcdFx0ZXJyb3I6IChjb2xsZWN0aW9uLCByZXNwb25zZSkgPT4ge1xuXHRcdFx0XHRyZWplY3QocmVzcG9uc2UpO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fSxcblxuXHRmZXRjaENhbGVuZGFyRGVmYXVsdERhdGU6IGZ1bmN0aW9uKHJlc29sdmUpIHtcblx0XHRpZiAodGhpcy5jdXJyZW50RGlzcGxheURhdGUpXG5cdFx0XHRyZXNvbHZlKG1vbWVudC51bml4KHRoaXMuY3VycmVudERpc3BsYXlEYXRlKSk7XG5cdFx0ZWxzZVxuXHRcdFx0cmVzb2x2ZShtb21lbnQoKSk7XG5cdH0sXG5cblx0ZmV0Y2hDdXJyZW50R3JvdXBNb2RlbDogYXN5bmMgZnVuY3Rpb24oKSB7XG5cdFx0bGV0IGN1cnJlbnRHcm91cE1vZGVsO1xuXG5cdFx0aWYgKHRoaXMuY3VycmVudEdyb3VwQ29kZSkge1xuXHRcdFx0aWYgKHRoaXMuY3VycmVudEdyb3VwTW9kZWwgJiYgdGhpcy5jdXJyZW50R3JvdXBNb2RlbC5nZXQoXCJjb2RlXCIpID09PSB0aGlzLmN1cnJlbnRHcm91cENvZGUpIHtcblx0XHRcdFx0Y3VycmVudEdyb3VwTW9kZWwgPSB0aGlzLmN1cnJlbnRHcm91cE1vZGVsO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHRoaXMuY3VycmVudEdyb3VwTW9kZWwgPSBuZXcgR3JvdXBNb2RlbCh7IGNvZGU6IHRoaXMuY3VycmVudEdyb3VwQ29kZSB9KTtcblxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGN1cnJlbnRHcm91cE1vZGVsID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5jdXJyZW50R3JvdXBNb2RlbC5mZXRjaCh7XG5cdFx0XHRcdFx0XHRcdHN1Y2Nlc3M6IG1vZGVsID0+IHtcblx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKG1vZGVsKTtcblx0XHRcdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdFx0XHRlcnJvcjogKG1vZGVsLCByZXNwb25zZSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdHJlamVjdChyZXNwb25zZSk7XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBjdXJyZW50R3JvdXBNb2RlbDtcblx0fSxcblxuXHRmZXRjaEN1cnJlbnRVc2VyTW9kZWw6IGFzeW5jIGZ1bmN0aW9uKCkge1xuXHRcdGxldCBjdXJyZW50VXNlck1vZGVsO1xuXG5cdFx0aWYgKHRoaXMuY3VycmVudFVzZXJJZCkge1xuXHRcdFx0aWYgKHRoaXMuY3VycmVudFVzZXJNb2RlbCAmJiB0aGlzLmN1cnJlbnRVc2VyTW9kZWwuZ2V0KFwiX2lkXCIpID09PSB0aGlzLmN1cnJlbnRVc2VySWQpIHtcblx0XHRcdFx0Y3VycmVudFVzZXJNb2RlbCA9IHRoaXMuY3VycmVudFVzZXJNb2RlbDtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHR0aGlzLmN1cnJlbnRVc2VyTW9kZWwgPSBuZXcgVXNlck1vZGVsKHsgX2lkOiB0aGlzLmN1cnJlbnRVc2VySWQgfSk7XG5cblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRjdXJyZW50VXNlck1vZGVsID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5jdXJyZW50VXNlck1vZGVsLmZldGNoKHtcblx0XHRcdFx0XHRcdFx0c3VjY2VzczogbW9kZWwgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdHJlc29sdmUobW9kZWwpO1xuXHRcdFx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0XHRcdGVycm9yOiAobW9kZWwsIHJlc3BvbnNlKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0cmVqZWN0KHJlc3BvbnNlKTtcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGN1cnJlbnRVc2VyTW9kZWw7XG5cdH0sXG5cblx0ZmV0Y2hHcm91cFNlbGVjdG9yRGVmYXVsdDogYXN5bmMgZnVuY3Rpb24oKSB7XG5cdFx0bGV0IHJlc3VsdDtcblx0XHRjb25zdCBjdXJyZW50R3JvdXBNb2RlbCA9IGF3YWl0IHRoaXMuZmV0Y2hDdXJyZW50R3JvdXBNb2RlbCgpO1xuXG5cdFx0aWYgKGN1cnJlbnRHcm91cE1vZGVsKSB7XG5cdFx0XHRyZXN1bHQgPSB7XG5cdFx0XHRcdGtleTogY3VycmVudEdyb3VwTW9kZWwuZ2V0KFwiY29kZVwiKSxcblx0XHRcdFx0dmFsdWU6IGN1cnJlbnRHcm91cE1vZGVsLmdldChcIm5hbWVcIiksXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG5cblx0ZmV0Y2hVc2VyU2VsZWN0b3JEZWZhdWx0OiBhc3luYyBmdW5jdGlvbigpIHtcblx0XHRsZXQgcmVzdWx0O1xuXHRcdGNvbnN0IGN1cnJlbnRVc2VyTW9kZWwgPSBhd2FpdCB0aGlzLmZldGNoQ3VycmVudFVzZXJNb2RlbCgpO1xuXG5cdFx0aWYgKGN1cnJlbnRVc2VyTW9kZWwpIHtcblx0XHRcdHJlc3VsdCA9IHtcblx0XHRcdFx0a2V5OiBjdXJyZW50VXNlck1vZGVsLmdldChcInVzZXJfaWRcIiksXG5cdFx0XHRcdHZhbHVlOiBjdXJyZW50VXNlck1vZGVsLmdldChcImZpcnN0bmFtZVwiKSArIFwiIFwiICsgY3VycmVudFVzZXJNb2RlbC5nZXQoXCJzdXJuYW1lXCIpICsgXCIgKFwiICsgY3VycmVudFVzZXJNb2RlbC5nZXQoXCJ1c2VybmFtZVwiKSArIFwiKVwiLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9LFxuXG5cdGRvd25sb2FkUmVwb3J0OiBmdW5jdGlvbigpIHtcblx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9hdHRlbmRhbmNlL3JlcG9ydC9cIiArIHRoaXMuY3VycmVudEdyb3VwQ29kZSk7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar Backgrid = require(\"backgrid\");\nvar Promise = require(\"bluebird\");\n\nvar settings = require(\"app-settings\");\n\nvar AttendanceRecordCollection = require(\"../../collections/attendance/attendanceRecordCollection\");\nvar ServerGrid = require(\"../../../lib/serverGrid\");\nvar StatusView = require(\"../../../lib/statusView\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"attendance-register-layout\",\n\n\ttemplate: require(\"../../templates/attendance/register.nunj\").layout,\n\n\tui: {\n\t\tgridFilterContainer: \".grid-filter-container\",\n\t\tgridCounterContainer: \".grid-counter-container\",\n\t\tgridContainer: \".grid-container\",\n\t\tgridNavigatorContainer: \".grid-navigator-container\"\n\t},\n\n\tcollectionEvents: {\n\t\t\"state:changed\": \"onAttendanceStateChanged\",\n\t\t\"remarks:changed\": \"onAttendanceRemarksChanged\",\n\t\tsync: \"onCollectionSynchronized\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.students = options.students;\n\t\tthis.teachers = options.teachers;\n\n\t\tthis.listenTo(Backbone.Radio.channel(\"attendanceRegister\"), {\n\t\t\t\"mark:present\": this.onMarkAllPresent.bind(this),\n\t\t\t\"mark:late\": this.onMarkAllLate.bind(this),\n\t\t\t\"mark:absent\": this.onMarkAllAbsent.bind(this)\n\t\t});\n\t},\n\n\tonRender: function onRender() {\n\t\tvar StateCell = Backgrid.Cell.extend({\n\t\t\ttemplate: _.template(\"<div class='attendance-register-grid-glyph <%=selected%>'><span class='<%=fa%> <%=icon%>'/></div>\"),\n\n\t\t\tevents: {\n\t\t\t\tclick: \"onClick\"\n\t\t\t},\n\n\t\t\trender: function render() {\n\t\t\t\tvar data = {\n\t\t\t\t\ticon: this.state === 0 ? \"fa-circle\" : this.state === 1 ? \"fa-circle\" : this.state === 2 ? \"fa-dot-circle\" : \"\",\n\t\t\t\t\tfa: this.state === 0 ? \"fal\" : this.state === 1 ? \"fas\" : this.state === 2 ? \"fal\" : \"fal\",\n\t\t\t\t\tselected: this.model.get(\"present\") === this.state ? \"\" : \"shy-glyph\"\n\t\t\t\t};\n\n\t\t\t\tthis.el.innerHTML = this.template(data);\n\t\t\t\tthis.el.style.textAlign = \"center\";\n\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\tonClick: function onClick() {\n\t\t\t\tif (this.model.get(\"present\") !== this.state) this.model.trigger(\"state:changed\", this.model, this.state);\n\t\t\t}\n\t\t});\n\n\t\tvar RemarksCell = Backgrid.Cell.extend({\n\t\t\ttemplate: false,\n\n\t\t\tevents: {\n\t\t\t\tclick: \"onClick\"\n\t\t\t},\n\n\t\t\trender: function render() {\n\t\t\t\tthis.$el.empty();\n\t\t\t\tthis.$el.append(\"<span class='attendance-register-grid-remarks-text'></span>\");\n\n\t\t\t\tvar text = $(\"span.attendance-register-grid-remarks-text\", this.$el);\n\n\t\t\t\tif (this.model.get(\"remarks\")) {\n\t\t\t\t\ttext.text(this.model.get(\"remarks\"));\n\t\t\t\t} else {\n\t\t\t\t\ttext.text(\"Click to edit\");\n\t\t\t\t\ttext.addClass(\"empty\");\n\t\t\t\t}\n\n\t\t\t\tthis.displaying = true;\n\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\tonClick: function onClick(event) {\n\t\t\t\tevent.stopPropagation();\n\n\t\t\t\tif (this.displaying) {\n\t\t\t\t\tthis.$el.empty();\n\n\t\t\t\t\tthis.$el.append(\"<input type='text' class='attendance-register-grid-remarks-input'>\");\n\t\t\t\t\tvar input = $(\"input.attendance-register-grid-remarks-input\", this.$el);\n\t\t\t\t\tinput.val(this.model.get(\"remarks\") || \"\");\n\t\t\t\t\tinput.focus();\n\n\t\t\t\t\tinput.on(\"blur\", this.onInputBlur.bind(this));\n\t\t\t\t\tinput.on(\"keydown\", this.onInputKeyDown.bind(this));\n\n\t\t\t\t\tthis.displaying = false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tonInputBlur: function onInputBlur() {\n\t\t\t\tthis.acceptInput();\n\t\t\t},\n\n\t\t\tonInputKeyDown: function onInputKeyDown(event) {\n\t\t\t\tif (event.which === 13) this.acceptInput();else if (event.which === 27) this.render();\n\t\t\t},\n\n\t\t\tacceptInput: function acceptInput() {\n\t\t\t\tthis.model.trigger(\"remarks:changed\", this.model, $(\"input.attendance-register-grid-remarks-input\", this.$el).val());\n\t\t\t}\n\t\t});\n\n\t\tvar columns = [{\n\t\t\tname: \"surname\",\n\t\t\tlabel: \"Surname\",\n\t\t\tcell: \"string\",\n\t\t\teditable: false\n\t\t}, {\n\t\t\tname: \"firstname\",\n\t\t\tlabel: \"First Name\",\n\t\t\tcell: \"string\",\n\t\t\teditable: false\n\t\t}, {\n\t\t\tname: \"username\",\n\t\t\tlabel: \"Username\",\n\t\t\tcell: \"string\",\n\t\t\teditable: false\n\t\t}, {\n\t\t\tname: \"userRole\",\n\t\t\tlabel: \"Role\",\n\t\t\tcell: \"string\",\n\t\t\teditable: false\n\t\t}, {\n\t\t\tname: \"present\",\n\t\t\tlabel: \"Present\",\n\t\t\tcell: StateCell.extend({\n\t\t\t\tstate: 1\n\t\t\t}),\n\t\t\teditable: false\n\t\t}, {\n\t\t\tname: \"present\",\n\t\t\tlabel: \"Late\",\n\t\t\tcell: StateCell.extend({\n\t\t\t\tstate: 2\n\t\t\t}),\n\t\t\teditable: false\n\t\t}, {\n\t\t\tname: \"present\",\n\t\t\tlabel: \"Absent\",\n\t\t\tcell: StateCell.extend({\n\t\t\t\tstate: 0\n\t\t\t}),\n\t\t\teditable: false\n\t\t}, {\n\t\t\tname: \"remarks\",\n\t\t\tlabel: \"Remarks\",\n\t\t\tcell: RemarksCell,\n\t\t\teditable: false\n\t\t}];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.gridContainer,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new AttendanceRecordCollection({ attendanceRegister: this.model.get(\"_id\") }),\n\t\t\tclickable: true,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.gridCounterContainer,\n\t\t\t\ttemplate: \"Users $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.gridNavigatorContainer\n\t\t\t}\n\t\t});\n\n\t\tthis.collection = this.grid.collection;\n\n\t\tthis.bindEvents(this.collection, this.collectionEvents);\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tthis.ui.gridFilterContainer.prepend(this.grid.filter({\n\t\t\tfilterContainer: this.ui.gridFilterContainer,\n\t\t\tfilters: [textFilter],\n\t\t\tdefaultFilters: [\"textFilter\"]\n\t\t}).render().el);\n\t},\n\n\tonCollectionSynchronized: function onCollectionSynchronized() {\n\t\tBackbone.Radio.channel(\"attendanceRegister\").trigger(\"register:loaded\");\n\t},\n\n\tonMarkAllPresent: function onMarkAllPresent() {\n\t\tthis.batchMarkAttendanceRecords(1);\n\t},\n\n\tonMarkAllLate: function onMarkAllLate() {\n\t\tthis.batchMarkAttendanceRecords(2);\n\t},\n\n\tonMarkAllAbsent: function onMarkAllAbsent() {\n\t\tthis.batchMarkAttendanceRecords(0);\n\t},\n\n\tonAttendanceStateChanged: function onAttendanceStateChanged(attendanceRecordModel, newState) {\n\t\tattendanceRecordModel.save({ present: newState }, {\n\t\t\twait: true\n\t\t});\n\t},\n\n\tonAttendanceRemarksChanged: function onAttendanceRemarksChanged(attendanceRecordModel, newRemarks) {\n\t\tattendanceRecordModel.save({ remarks: newRemarks }, {\n\t\t\twait: true\n\t\t});\n\t},\n\n\tbatchMarkAttendanceRecords: function batchMarkAttendanceRecords(newState) {\n\t\tvar _this = this;\n\n\t\tthis.batchMarkStatus = new StatusView({\n\t\t\tmessage: \"Saving...\",\n\t\t\ttype: \"loading\"\n\t\t});\n\n\t\tthis.batchMarkStatus.show();\n\n\t\tPromise.resolve($.ajax({\n\t\t\tmethod: \"PUT\",\n\t\t\tdata: { present: newState },\n\t\t\turl: settings.urlRoot + \"/api/1.0/attendance/registers/batchMark/\" + this.model.get(\"register_id\"),\n\t\t\tjson: true\n\t\t})).then(function () {\n\t\t\t_this.collection.fetch();\n\t\t\t_this.batchMarkStatus.destroy();\n\t\t\treturn;\n\t\t}).catch(function () {\n\t\t\treturn alert(\"Oopsie\");\n\t\t});\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJlZ2lzdGVyLmpzIl0sIm5hbWVzIjpbIiQiLCJyZXF1aXJlIiwiXyIsIkJhY2tib25lIiwiQmFja2dyaWQiLCJQcm9taXNlIiwic2V0dGluZ3MiLCJBdHRlbmRhbmNlUmVjb3JkQ29sbGVjdGlvbiIsIlNlcnZlckdyaWQiLCJTdGF0dXNWaWV3IiwibW9kdWxlIiwiZXhwb3J0cyIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiZXh0ZW5kIiwiY2xhc3NOYW1lIiwidGVtcGxhdGUiLCJsYXlvdXQiLCJ1aSIsImdyaWRGaWx0ZXJDb250YWluZXIiLCJncmlkQ291bnRlckNvbnRhaW5lciIsImdyaWRDb250YWluZXIiLCJncmlkTmF2aWdhdG9yQ29udGFpbmVyIiwiY29sbGVjdGlvbkV2ZW50cyIsInN5bmMiLCJpbml0aWFsaXplIiwib3B0aW9ucyIsInN0dWRlbnRzIiwidGVhY2hlcnMiLCJsaXN0ZW5UbyIsIlJhZGlvIiwiY2hhbm5lbCIsIm9uTWFya0FsbFByZXNlbnQiLCJiaW5kIiwib25NYXJrQWxsTGF0ZSIsIm9uTWFya0FsbEFic2VudCIsIm9uUmVuZGVyIiwiU3RhdGVDZWxsIiwiQ2VsbCIsImV2ZW50cyIsImNsaWNrIiwicmVuZGVyIiwiZGF0YSIsImljb24iLCJzdGF0ZSIsImZhIiwic2VsZWN0ZWQiLCJtb2RlbCIsImdldCIsImVsIiwiaW5uZXJIVE1MIiwic3R5bGUiLCJ0ZXh0QWxpZ24iLCJvbkNsaWNrIiwidHJpZ2dlciIsIlJlbWFya3NDZWxsIiwiJGVsIiwiZW1wdHkiLCJhcHBlbmQiLCJ0ZXh0IiwiYWRkQ2xhc3MiLCJkaXNwbGF5aW5nIiwiZXZlbnQiLCJzdG9wUHJvcGFnYXRpb24iLCJpbnB1dCIsInZhbCIsImZvY3VzIiwib24iLCJvbklucHV0Qmx1ciIsIm9uSW5wdXRLZXlEb3duIiwiYWNjZXB0SW5wdXQiLCJ3aGljaCIsImNvbHVtbnMiLCJuYW1lIiwibGFiZWwiLCJjZWxsIiwiZWRpdGFibGUiLCJncmlkIiwiY29sbGVjdGlvbiIsImF0dGVuZGFuY2VSZWdpc3RlciIsImNsaWNrYWJsZSIsImNvdW50ZXIiLCJlbGVtZW50IiwicGFnaW5nIiwiYmluZEV2ZW50cyIsInRleHRGaWx0ZXIiLCJ0eXBlIiwiZGVib3VuY2UiLCJzZXJ2ZXIiLCJwcmVwZW5kIiwiZmlsdGVyIiwiZmlsdGVyQ29udGFpbmVyIiwiZmlsdGVycyIsImRlZmF1bHRGaWx0ZXJzIiwib25Db2xsZWN0aW9uU3luY2hyb25pemVkIiwiYmF0Y2hNYXJrQXR0ZW5kYW5jZVJlY29yZHMiLCJvbkF0dGVuZGFuY2VTdGF0ZUNoYW5nZWQiLCJhdHRlbmRhbmNlUmVjb3JkTW9kZWwiLCJuZXdTdGF0ZSIsInNhdmUiLCJwcmVzZW50Iiwid2FpdCIsIm9uQXR0ZW5kYW5jZVJlbWFya3NDaGFuZ2VkIiwibmV3UmVtYXJrcyIsInJlbWFya3MiLCJiYXRjaE1hcmtTdGF0dXMiLCJtZXNzYWdlIiwic2hvdyIsInJlc29sdmUiLCJhamF4IiwibWV0aG9kIiwidXJsIiwidXJsUm9vdCIsImpzb24iLCJ0aGVuIiwiZmV0Y2giLCJkZXN0cm95IiwiY2F0Y2giLCJhbGVydCJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsSUFBSUMsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1FLFdBQVdGLFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1HLFdBQVdILFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1JLFVBQVVKLFFBQVEsVUFBUixDQUFoQjs7QUFFQSxJQUFNSyxXQUFXTCxRQUFRLGNBQVIsQ0FBakI7O0FBRUEsSUFBTU0sNkJBQTZCTixRQUFRLHlEQUFSLENBQW5DO0FBQ0EsSUFBTU8sYUFBYVAsUUFBUSx5QkFBUixDQUFuQjtBQUNBLElBQU1RLGFBQWFSLFFBQVEseUJBQVIsQ0FBbkI7O0FBRUFTLE9BQU9DLE9BQVAsR0FBaUJSLFNBQVNTLFVBQVQsQ0FBb0JDLElBQXBCLENBQXlCQyxNQUF6QixDQUFnQztBQUNoREMsWUFBVyw0QkFE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QUFOO0FBQUEsR0FYUjtBQVlBO0FBOVArQyxDQUFoQyxDQUFqQiIsImZpbGUiOiJyZWdpc3Rlci5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgQmFja2dyaWQgPSByZXF1aXJlKFwiYmFja2dyaWRcIik7XG5jb25zdCBQcm9taXNlID0gcmVxdWlyZShcImJsdWViaXJkXCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IEF0dGVuZGFuY2VSZWNvcmRDb2xsZWN0aW9uID0gcmVxdWlyZShcIi4uLy4uL2NvbGxlY3Rpb25zL2F0dGVuZGFuY2UvYXR0ZW5kYW5jZVJlY29yZENvbGxlY3Rpb25cIik7XG5jb25zdCBTZXJ2ZXJHcmlkID0gcmVxdWlyZShcIi4uLy4uLy4uL2xpYi9zZXJ2ZXJHcmlkXCIpO1xuY29uc3QgU3RhdHVzVmlldyA9IHJlcXVpcmUoXCIuLi8uLi8uLi9saWIvc3RhdHVzVmlld1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImF0dGVuZGFuY2UtcmVnaXN0ZXItbGF5b3V0XCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvYXR0ZW5kYW5jZS9yZWdpc3Rlci5udW5qXCIpLmxheW91dCxcblxuXHR1aToge1xuXHRcdGdyaWRGaWx0ZXJDb250YWluZXI6IFwiLmdyaWQtZmlsdGVyLWNvbnRhaW5lclwiLFxuXHRcdGdyaWRDb3VudGVyQ29udGFpbmVyOiBcIi5ncmlkLWNvdW50ZXItY29udGFpbmVyXCIsXG5cdFx0Z3JpZENvbnRhaW5lcjogXCIuZ3JpZC1jb250YWluZXJcIixcblx0XHRncmlkTmF2aWdhdG9yQ29udGFpbmVyOiBcIi5ncmlkLW5hdmlnYXRvci1jb250YWluZXJcIixcblx0fSxcblxuXHRjb2xsZWN0aW9uRXZlbnRzOiB7XG5cdFx0XCJzdGF0ZTpjaGFuZ2VkXCI6IFwib25BdHRlbmRhbmNlU3RhdGVDaGFuZ2VkXCIsXG5cdFx0XCJyZW1hcmtzOmNoYW5nZWRcIjogXCJvbkF0dGVuZGFuY2VSZW1hcmtzQ2hhbmdlZFwiLFxuXHRcdHN5bmM6IFwib25Db2xsZWN0aW9uU3luY2hyb25pemVkXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuc3R1ZGVudHMgPSBvcHRpb25zLnN0dWRlbnRzO1xuXHRcdHRoaXMudGVhY2hlcnMgPSBvcHRpb25zLnRlYWNoZXJzO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiYXR0ZW5kYW5jZVJlZ2lzdGVyXCIpLCB7XG5cdFx0XHRcIm1hcms6cHJlc2VudFwiOiB0aGlzLm9uTWFya0FsbFByZXNlbnQuYmluZCh0aGlzKSxcblx0XHRcdFwibWFyazpsYXRlXCI6IHRoaXMub25NYXJrQWxsTGF0ZS5iaW5kKHRoaXMpLFxuXHRcdFx0XCJtYXJrOmFic2VudFwiOiB0aGlzLm9uTWFya0FsbEFic2VudC5iaW5kKHRoaXMpLFxuXHRcdH0pO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBTdGF0ZUNlbGwgPSBCYWNrZ3JpZC5DZWxsLmV4dGVuZCh7XG5cdFx0XHR0ZW1wbGF0ZTogXy50ZW1wbGF0ZShcIjxkaXYgY2xhc3M9J2F0dGVuZGFuY2UtcmVnaXN0ZXItZ3JpZC1nbHlwaCA8JT1zZWxlY3RlZCU+Jz48c3BhbiBjbGFzcz0nPCU9ZmElPiA8JT1pY29uJT4nLz48L2Rpdj5cIiksXG5cblx0XHRcdGV2ZW50czoge1xuXHRcdFx0XHRjbGljazogXCJvbkNsaWNrXCIsXG5cdFx0XHR9LFxuXG5cdFx0XHRyZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRjb25zdCBkYXRhID0ge1xuXHRcdFx0XHRcdGljb246IHRoaXMuc3RhdGUgPT09IDAgPyBcImZhLWNpcmNsZVwiIDogdGhpcy5zdGF0ZSA9PT0gMSA/IFwiZmEtY2lyY2xlXCIgOiB0aGlzLnN0YXRlID09PSAyID8gXCJmYS1kb3QtY2lyY2xlXCIgOiBcIlwiLFxuXHRcdFx0XHRcdGZhOiB0aGlzLnN0YXRlID09PSAwID8gXCJmYWxcIiA6IHRoaXMuc3RhdGUgPT09IDEgPyBcImZhc1wiIDogdGhpcy5zdGF0ZSA9PT0gMiA/IFwiZmFsXCIgOiBcImZhbFwiLFxuXHRcdFx0XHRcdHNlbGVjdGVkOiB0aGlzLm1vZGVsLmdldChcInByZXNlbnRcIikgPT09IHRoaXMuc3RhdGUgPyBcIlwiIDogXCJzaHktZ2x5cGhcIixcblx0XHRcdFx0fTtcblxuXHRcdFx0XHR0aGlzLmVsLmlubmVySFRNTCA9IHRoaXMudGVtcGxhdGUoZGF0YSk7XG5cdFx0XHRcdHRoaXMuZWwuc3R5bGUudGV4dEFsaWduID0gXCJjZW50ZXJcIjtcblxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdG9uQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJwcmVzZW50XCIpICE9PSB0aGlzLnN0YXRlKVxuXHRcdFx0XHRcdHRoaXMubW9kZWwudHJpZ2dlcihcInN0YXRlOmNoYW5nZWRcIiwgdGhpcy5tb2RlbCwgdGhpcy5zdGF0ZSk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0Y29uc3QgUmVtYXJrc0NlbGwgPSBCYWNrZ3JpZC5DZWxsLmV4dGVuZCh7XG5cdFx0XHR0ZW1wbGF0ZTogZmFsc2UsXG5cblx0XHRcdGV2ZW50czoge1xuXHRcdFx0XHRjbGljazogXCJvbkNsaWNrXCIsXG5cdFx0XHR9LFxuXG5cdFx0XHRyZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR0aGlzLiRlbC5lbXB0eSgpO1xuXHRcdFx0XHR0aGlzLiRlbC5hcHBlbmQoXCI8c3BhbiBjbGFzcz0nYXR0ZW5kYW5jZS1yZWdpc3Rlci1ncmlkLXJlbWFya3MtdGV4dCc+PC9zcGFuPlwiKTtcblxuXHRcdFx0XHRjb25zdCB0ZXh0ID0gJChcInNwYW4uYXR0ZW5kYW5jZS1yZWdpc3Rlci1ncmlkLXJlbWFya3MtdGV4dFwiLCB0aGlzLiRlbCk7XG5cblx0XHRcdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwicmVtYXJrc1wiKSkge1xuXHRcdFx0XHRcdHRleHQudGV4dCh0aGlzLm1vZGVsLmdldChcInJlbWFya3NcIikpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdHRleHQudGV4dChcIkNsaWNrIHRvIGVkaXRcIik7XG5cdFx0XHRcdFx0dGV4dC5hZGRDbGFzcyhcImVtcHR5XCIpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5kaXNwbGF5aW5nID0gdHJ1ZTtcblxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdG9uQ2xpY2s6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0XHRcdGlmICh0aGlzLmRpc3BsYXlpbmcpIHtcblx0XHRcdFx0XHR0aGlzLiRlbC5lbXB0eSgpO1xuXG5cdFx0XHRcdFx0dGhpcy4kZWwuYXBwZW5kKFwiPGlucHV0IHR5cGU9J3RleHQnIGNsYXNzPSdhdHRlbmRhbmNlLXJlZ2lzdGVyLWdyaWQtcmVtYXJrcy1pbnB1dCc+XCIpO1xuXHRcdFx0XHRcdGNvbnN0IGlucHV0ID0gJChcImlucHV0LmF0dGVuZGFuY2UtcmVnaXN0ZXItZ3JpZC1yZW1hcmtzLWlucHV0XCIsIHRoaXMuJGVsKTtcblx0XHRcdFx0XHRpbnB1dC52YWwodGhpcy5tb2RlbC5nZXQoXCJyZW1hcmtzXCIpIHx8IFwiXCIpO1xuXHRcdFx0XHRcdGlucHV0LmZvY3VzKCk7XG5cblx0XHRcdFx0XHRpbnB1dC5vbihcImJsdXJcIiwgdGhpcy5vbklucHV0Qmx1ci5iaW5kKHRoaXMpKTtcblx0XHRcdFx0XHRpbnB1dC5vbihcImtleWRvd25cIiwgdGhpcy5vbklucHV0S2V5RG93bi5iaW5kKHRoaXMpKTtcblxuXHRcdFx0XHRcdHRoaXMuZGlzcGxheWluZyA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHRvbklucHV0Qmx1cjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHRoaXMuYWNjZXB0SW5wdXQoKTtcblx0XHRcdH0sXG5cblx0XHRcdG9uSW5wdXRLZXlEb3duOiBmdW5jdGlvbihldmVudCkge1xuXHRcdFx0XHRpZiAoZXZlbnQud2hpY2ggPT09IDEzKVxuXHRcdFx0XHRcdHRoaXMuYWNjZXB0SW5wdXQoKTtcblx0XHRcdFx0ZWxzZSBpZiAoZXZlbnQud2hpY2ggPT09IDI3KVxuXHRcdFx0XHRcdHRoaXMucmVuZGVyKCk7XG5cdFx0XHR9LFxuXG5cdFx0XHRhY2NlcHRJbnB1dDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHRoaXMubW9kZWwudHJpZ2dlcihcInJlbWFya3M6Y2hhbmdlZFwiLCB0aGlzLm1vZGVsLCAkKFwiaW5wdXQuYXR0ZW5kYW5jZS1yZWdpc3Rlci1ncmlkLXJlbWFya3MtaW5wdXRcIiwgdGhpcy4kZWwpLnZhbCgpKTtcblx0XHRcdH0sXG5cdFx0fSk7XG5cblx0XHRjb25zdCBjb2x1bW5zID0gW1xuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcInN1cm5hbWVcIixcblx0XHRcdFx0bGFiZWw6IFwiU3VybmFtZVwiLFxuXHRcdFx0XHRjZWxsOiBcInN0cmluZ1wiLFxuXHRcdFx0XHRlZGl0YWJsZTogZmFsc2UsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcImZpcnN0bmFtZVwiLFxuXHRcdFx0XHRsYWJlbDogXCJGaXJzdCBOYW1lXCIsXG5cdFx0XHRcdGNlbGw6IFwic3RyaW5nXCIsXG5cdFx0XHRcdGVkaXRhYmxlOiBmYWxzZSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwidXNlcm5hbWVcIixcblx0XHRcdFx0bGFiZWw6IFwiVXNlcm5hbWVcIixcblx0XHRcdFx0Y2VsbDogXCJzdHJpbmdcIixcblx0XHRcdFx0ZWRpdGFibGU6IGZhbHNlLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCJ1c2VyUm9sZVwiLFxuXHRcdFx0XHRsYWJlbDogXCJSb2xlXCIsXG5cdFx0XHRcdGNlbGw6IFwic3RyaW5nXCIsXG5cdFx0XHRcdGVkaXRhYmxlOiBmYWxzZSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwicHJlc2VudFwiLFxuXHRcdFx0XHRsYWJlbDogXCJQcmVzZW50XCIsXG5cdFx0XHRcdGNlbGw6IFN0YXRlQ2VsbC5leHRlbmQoe1xuXHRcdFx0XHRcdHN0YXRlOiAxLFxuXHRcdFx0XHR9KSxcblx0XHRcdFx0ZWRpdGFibGU6IGZhbHNlLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCJwcmVzZW50XCIsXG5cdFx0XHRcdGxhYmVsOiBcIkxhdGVcIixcblx0XHRcdFx0Y2VsbDogU3RhdGVDZWxsLmV4dGVuZCh7XG5cdFx0XHRcdFx0c3RhdGU6IDIsXG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRlZGl0YWJsZTogZmFsc2UsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRuYW1lOiBcInByZXNlbnRcIixcblx0XHRcdFx0bGFiZWw6IFwiQWJzZW50XCIsXG5cdFx0XHRcdGNlbGw6IFN0YXRlQ2VsbC5leHRlbmQoe1xuXHRcdFx0XHRcdHN0YXRlOiAwLFxuXHRcdFx0XHR9KSxcblx0XHRcdFx0ZWRpdGFibGU6IGZhbHNlLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCJyZW1hcmtzXCIsXG5cdFx0XHRcdGxhYmVsOiBcIlJlbWFya3NcIixcblx0XHRcdFx0Y2VsbDogUmVtYXJrc0NlbGwsXG5cdFx0XHRcdGVkaXRhYmxlOiBmYWxzZSxcblx0XHRcdH0sXG5cdFx0XTtcblxuXHRcdHRoaXMuZ3JpZCA9IG5ldyBTZXJ2ZXJHcmlkKHtcblx0XHRcdGVsOiB0aGlzLnVpLmdyaWRDb250YWluZXIsXG5cdFx0XHRjb2x1bW5zOiBjb2x1bW5zLFxuXHRcdFx0Y29sbGVjdGlvbjogbmV3IEF0dGVuZGFuY2VSZWNvcmRDb2xsZWN0aW9uKHsgYXR0ZW5kYW5jZVJlZ2lzdGVyOiB0aGlzLm1vZGVsLmdldChcIl9pZFwiKSB9KSxcblx0XHRcdGNsaWNrYWJsZTogdHJ1ZSxcblx0XHRcdGNvdW50ZXI6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5ncmlkQ291bnRlckNvbnRhaW5lcixcblx0XHRcdFx0dGVtcGxhdGU6IFwiVXNlcnMgJHN0YXJ0IC0gJGVuZCBvZiAkdG90YWxcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5ncmlkTmF2aWdhdG9yQ29udGFpbmVyLFxuXHRcdFx0fSxcblx0XHR9KTtcblxuXHRcdHRoaXMuY29sbGVjdGlvbiA9IHRoaXMuZ3JpZC5jb2xsZWN0aW9uO1xuXG5cdFx0dGhpcy5iaW5kRXZlbnRzKHRoaXMuY29sbGVjdGlvbiwgdGhpcy5jb2xsZWN0aW9uRXZlbnRzKTtcblxuXHRcdGNvbnN0IHRleHRGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcInRleHRcIixcblx0XHRcdG5hbWU6IFwidGV4dEZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiVGV4dCBTZWFyY2hcIixcblx0XHRcdGRlYm91bmNlOiAyMDAsXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdHRoaXMudWkuZ3JpZEZpbHRlckNvbnRhaW5lci5wcmVwZW5kKHRoaXMuZ3JpZC5maWx0ZXIoe1xuXHRcdFx0ZmlsdGVyQ29udGFpbmVyOiB0aGlzLnVpLmdyaWRGaWx0ZXJDb250YWluZXIsXG5cdFx0XHRmaWx0ZXJzOiBbdGV4dEZpbHRlcl0sXG5cdFx0XHRkZWZhdWx0RmlsdGVyczogW1widGV4dEZpbHRlclwiXSxcblx0XHR9KS5yZW5kZXIoKS5lbCk7XG5cdH0sXG5cblx0b25Db2xsZWN0aW9uU3luY2hyb25pemVkOiBmdW5jdGlvbigpIHtcblx0XHRCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiYXR0ZW5kYW5jZVJlZ2lzdGVyXCIpLnRyaWdnZXIoXCJyZWdpc3Rlcjpsb2FkZWRcIik7XG5cdH0sXG5cblx0b25NYXJrQWxsUHJlc2VudDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5iYXRjaE1hcmtBdHRlbmRhbmNlUmVjb3JkcygxKTtcblx0fSxcblxuXHRvbk1hcmtBbGxMYXRlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmJhdGNoTWFya0F0dGVuZGFuY2VSZWNvcmRzKDIpO1xuXHR9LFxuXG5cdG9uTWFya0FsbEFic2VudDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5iYXRjaE1hcmtBdHRlbmRhbmNlUmVjb3JkcygwKTtcblx0fSxcblxuXHRvbkF0dGVuZGFuY2VTdGF0ZUNoYW5nZWQ6IGZ1bmN0aW9uKGF0dGVuZGFuY2VSZWNvcmRNb2RlbCwgbmV3U3RhdGUpIHtcblx0XHRhdHRlbmRhbmNlUmVjb3JkTW9kZWwuc2F2ZSh7IHByZXNlbnQ6IG5ld1N0YXRlIH0sIHtcblx0XHRcdHdhaXQ6IHRydWUsXG5cdFx0fSk7XG5cdH0sXG5cblx0b25BdHRlbmRhbmNlUmVtYXJrc0NoYW5nZWQ6IGZ1bmN0aW9uKGF0dGVuZGFuY2VSZWNvcmRNb2RlbCwgbmV3UmVtYXJrcykge1xuXHRcdGF0dGVuZGFuY2VSZWNvcmRNb2RlbC5zYXZlKHsgcmVtYXJrczogbmV3UmVtYXJrcyB9LCB7XG5cdFx0XHR3YWl0OiB0cnVlLFxuXHRcdH0pO1xuXHR9LFxuXG5cdGJhdGNoTWFya0F0dGVuZGFuY2VSZWNvcmRzOiBmdW5jdGlvbihuZXdTdGF0ZSkge1xuXHRcdHRoaXMuYmF0Y2hNYXJrU3RhdHVzID0gbmV3IFN0YXR1c1ZpZXcoe1xuXHRcdFx0bWVzc2FnZTogXCJTYXZpbmcuLi5cIixcblx0XHRcdHR5cGU6IFwibG9hZGluZ1wiLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5iYXRjaE1hcmtTdGF0dXMuc2hvdygpO1xuXG5cdFx0UHJvbWlzZS5yZXNvbHZlKCQuYWpheCh7XG5cdFx0XHRtZXRob2Q6IFwiUFVUXCIsXG5cdFx0XHRkYXRhOiB7IHByZXNlbnQ6IG5ld1N0YXRlIH0sXG5cdFx0XHR1cmw6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2F0dGVuZGFuY2UvcmVnaXN0ZXJzL2JhdGNoTWFyay9cIiArIHRoaXMubW9kZWwuZ2V0KFwicmVnaXN0ZXJfaWRcIiksXG5cdFx0XHRqc29uOiB0cnVlLFxuXHRcdH0pKVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmNvbGxlY3Rpb24uZmV0Y2goKTtcblx0XHRcdFx0dGhpcy5iYXRjaE1hcmtTdGF0dXMuZGVzdHJveSgpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKCgpID0+IGFsZXJ0KFwiT29wc2llXCIpKTtcblx0fSxcbn0pO1xuIl19",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\nvar tippy = require(\"tippy.js\").default;\n\nvar Navigator = Backbone.Marionette.View.extend({\n\tclassName: \"attendance-registers-header-navigator\",\n\n\ttemplate: require(\"../../templates/attendance/registerHeader.nunj\").navigator,\n\n\tui: {\n\t\tbuttons: \".navigator-button\",\n\t\tbuttonMarkAllPresent: \".button-mark-all-present\",\n\t\tbuttonMarkAllLate: \".button-mark-all-late\",\n\t\tbuttonMarkAllAbsent: \".button-mark-all-absent\",\n\t\tbuttonDeleteRegister: \".button-delete-register\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonMarkAllPresent\": \"onButtonMarkAllPresentClick\",\n\t\t\"click @ui.buttonMarkAllLate\": \"onButtonMarkAllLateClick\",\n\t\t\"click @ui.buttonMarkAllAbsent\": \"onButtonMarkAllAbsentClick\",\n\t\t\"click @ui.buttonDeleteRegister\": \"onButtonDeleteRegisterClick\"\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.disable();\n\n\t\t_.each([{\n\t\t\ttargetEl: this.ui.buttonDeleteRegister.get(0),\n\t\t\tcontent: \"Delete Attendance Register\"\n\t\t}, {\n\t\t\ttargetEl: this.ui.buttonMarkAllPresent.get(0),\n\t\t\tcontent: \"Mark All As Present\"\n\t\t}, {\n\t\t\ttargetEl: this.ui.buttonMarkAllLate.get(0),\n\t\t\tcontent: \"Mark All Late\"\n\t\t}, {\n\t\t\ttargetEl: this.ui.buttonMarkAllAbsent.get(0),\n\t\t\tcontent: \"Mark All Absent\"\n\t\t}], function (spec) {\n\t\t\treturn tippy(spec.targetEl, _.extend(_.omit(spec, [\"targetEl\"]), {\n\t\t\t\ttheme: \"black\",\n\t\t\t\tplacement: \"bottom\"\n\t\t\t}));\n\t\t});\n\n\t\tthis.listenTo(Backbone.Radio.channel(\"attendanceRegister\"), \"register:loaded\", this.onAttendanceRegisterLoaded.bind(this));\n\t},\n\n\tonAttendanceRegisterLoaded: function onAttendanceRegisterLoaded() {\n\t\tthis.enable();\n\t},\n\n\tonButtonMarkAllPresentClick: function onButtonMarkAllPresentClick() {\n\t\tBackbone.Radio.channel(\"attendanceRegister\").trigger(\"mark:present\");\n\t},\n\n\tonButtonMarkAllLateClick: function onButtonMarkAllLateClick() {\n\t\tBackbone.Radio.channel(\"attendanceRegister\").trigger(\"mark:late\");\n\t},\n\n\tonButtonMarkAllAbsentClick: function onButtonMarkAllAbsentClick() {\n\t\tBackbone.Radio.channel(\"attendanceRegister\").trigger(\"mark:absent\");\n\t},\n\n\tonButtonDeleteRegisterClick: function onButtonDeleteRegisterClick() {\n\t\tBackbone.Radio.channel(\"attendanceRegister\").trigger(\"register:delete\", this.model);\n\t},\n\n\tdisable: function disable() {\n\t\tthis.ui.buttons.addClass(\"navigator-button-disabled\");\n\t},\n\n\tenable: function enable() {\n\t\tthis.ui.buttons.removeClass(\"navigator-button-disabled\");\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"sub-header attendance-register-header-layout\",\n\n\ttemplate: require(\"../../templates/attendance/registerHeader.nunj\").layout,\n\n\tregions: {\n\t\tnavigator: \".navigator-region\"\n\t},\n\n\tui: {\n\t\tdate: \".attendance-register-date\"\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.showNavigator();\n\t},\n\n\tgetAttendanceRegisterDate: function getAttendanceRegisterDate() {\n\t\treturn moment.unix(this.model.get(\"created\")).format(\"dddd, D MMMM YYYY\");\n\t},\n\n\tshowNavigator: function showNavigator() {\n\t\tthis.showChildView(\"navigator\", new Navigator({ model: this.model }));\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJlZ2lzdGVySGVhZGVyLmpzIl0sIm5hbWVzIjpbIl8iLCJyZXF1aXJlIiwiQmFja2JvbmUiLCJtb21lbnQiLCJ0aXBweSIsImRlZmF1bHQiLCJOYXZpZ2F0b3IiLCJNYXJpb25ldHRlIiwiVmlldyIsImV4dGVuZCIsImNsYXNzTmFtZSIsInRlbXBsYXRlIiwibmF2aWdhdG9yIiwidWkiLCJidXR0b25zIiwiYnV0dG9uTWFya0FsbFByZXNlbnQiLCJidXR0b25NYXJrQWxsTGF0ZSIsImJ1dHRvbk1hcmtBbGxBYnNlbnQiLCJidXR0b25EZWxldGVSZWdpc3RlciIsImV2ZW50cyIsIm9uUmVuZGVyIiwiZGlzYWJsZSIsImVhY2giLCJ0YXJnZXRFbCIsImdldCIsImNvbnRlbnQiLCJzcGVjIiwib21pdCIsInRoZW1lIiwicGxhY2VtZW50IiwibGlzdGVuVG8iLCJSYWRpbyIsImNoYW5uZWwiLCJvbkF0dGVuZGFuY2VSZWdpc3RlckxvYWRlZCIsImJpbmQiLCJlbmFibGUiLCJvbkJ1dHRvbk1hcmtBbGxQcmVzZW50Q2xpY2siLCJ0cmlnZ2VyIiwib25CdXR0b25NYXJrQWxsTGF0ZUNsaWNrIiwib25CdXR0b25NYXJrQWxsQWJzZW50Q2xpY2siLCJvbkJ1dHRvbkRlbGV0ZVJlZ2lzdGVyQ2xpY2siLCJtb2RlbCIsImFkZENsYXNzIiwicmVtb3ZlQ2xhc3MiLCJtb2R1bGUiLCJleHBvcnRzIiwibGF5b3V0IiwicmVnaW9ucyIsImRhdGUiLCJzaG93TmF2aWdhdG9yIiwiZ2V0QXR0ZW5kYW5jZVJlZ2lzdGVyRGF0ZSIsInVuaXgiLCJmb3JtYXQiLCJzaG93Q2hpbGRWaWV3Il0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLFdBQVdELFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1FLFNBQVNGLFFBQVEsUUFBUixDQUFmO0FBQ0EsSUFBTUcsUUFBUUgsUUFBUSxVQUFSLEVBQW9CSSxPQUFsQzs7QUFFQSxJ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Q0FBZ0M7QUFDaERDLFlBQVcsOENBRHFDOztBQUdoREMsV0FBVVYsUUFBUSxnREFBUixFQUEwRDZDLE1BSHBCOztBQUtoREMsVUFBUztBQUNSbkMsYUFBVztBQURILEVBTHVDOztBQVNoREMsS0FBSTtBQUNIbUMsUUFBTTtBQURILEVBVDRDOztBQWFoRDVCLFdBQVUsb0JBQVc7QUFDcEIsT0FBSzZCLGFBQUw7QUFDQSxFQWYrQzs7QUFpQmhEQyw0QkFBMkIscUNBQVc7QUFDckMsU0FBTy9DLE9BQU9nRCxJQUFQLENBQVksS0FBS1YsS0FBTCxDQUFXakIsR0FBWCxDQUFlLFNBQWYsQ0FBWixFQUF1QzRCLE1BQXZDLENBQThDLG1CQUE5QyxDQUFQO0FBQ0EsRUFuQitDOztBQXFCaERILGdCQUFlLHlCQUFXO0FBQ3pCLE9BQUtJLGFBQUwsQ0FBbUIsV0FBbkIsRUFBZ0MsSUFBSS9DLFNBQUosQ0FBYyxFQUFFbUMsT0FBTyxLQUFLQSxLQUFkLEVBQWQsQ0FBaEM7QUFDQTtBQXZCK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoicmVnaXN0ZXJIZWFkZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCBtb21lbnQgPSByZXF1aXJlKFwibW9tZW50XCIpO1xuY29uc3QgdGlwcHkgPSByZXF1aXJlKFwidGlwcHkuanNcIikuZGVmYXVsdDtcblxuY29uc3QgTmF2aWdhdG9yID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJhdHRlbmRhbmNlLXJlZ2lzdGVycy1oZWFkZXItbmF2aWdhdG9yXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvYXR0ZW5kYW5jZS9yZWdpc3RlckhlYWRlci5udW5qXCIpLm5hdmlnYXRvcixcblxuXHR1aToge1xuXHRcdGJ1dHRvbnM6IFwiLm5hdmlnYXRvci1idXR0b25cIixcblx0XHRidXR0b25NYXJrQWxsUHJlc2VudDogXCIuYnV0dG9uLW1hcmstYWxsLXByZXNlbnRcIixcblx0XHRidXR0b25NYXJrQWxsTGF0ZTogXCIuYnV0dG9uLW1hcmstYWxsLWxhdGVcIixcblx0XHRidXR0b25NYXJrQWxsQWJzZW50OiBcIi5idXR0b24tbWFyay1hbGwtYWJzZW50XCIsXG5cdFx0YnV0dG9uRGVsZXRlUmVnaXN0ZXI6IFwiLmJ1dHRvbi1kZWxldGUtcmVnaXN0ZXJcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5idXR0b25NYXJrQWxsUHJlc2VudFwiOiBcIm9uQnV0dG9uTWFya0FsbFByZXNlbnRDbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmJ1dHRvbk1hcmtBbGxMYXRlXCI6IFwib25CdXR0b25NYXJrQWxsTGF0ZUNsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkuYnV0dG9uTWFya0FsbEFic2VudFwiOiBcIm9uQnV0dG9uTWFya0FsbEFic2VudENsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkuYnV0dG9uRGVsZXRlUmVnaXN0ZXJcIjogXCJvbkJ1dHRvbkRlbGV0ZVJlZ2lzdGVyQ2xpY2tcIixcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5kaXNhYmxlKCk7XG5cblx0XHRfLmVhY2goW1xuXHRcdFx0e1xuXHRcdFx0XHR0YXJnZXRFbDogdGhpcy51aS5idXR0b25EZWxldGVSZWdpc3Rlci5nZXQoMCksXG5cdFx0XHRcdGNvbnRlbnQ6IFwiRGVsZXRlIEF0dGVuZGFuY2UgUmVnaXN0ZXJcIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHRhcmdldEVsOiB0aGlzLnVpLmJ1dHRvbk1hcmtBbGxQcmVzZW50LmdldCgwKSxcblx0XHRcdFx0Y29udGVudDogXCJNYXJrIEFsbCBBcyBQcmVzZW50XCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHR0YXJnZXRFbDogdGhpcy51aS5idXR0b25NYXJrQWxsTGF0ZS5nZXQoMCksXG5cdFx0XHRcdGNvbnRlbnQ6IFwiTWFyayBBbGwgTGF0ZVwiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0dGFyZ2V0RWw6IHRoaXMudWkuYnV0dG9uTWFya0FsbEFic2VudC5nZXQoMCksXG5cdFx0XHRcdGNvbnRlbnQ6IFwiTWFyayBBbGwgQWJzZW50XCIsXG5cdFx0XHR9LFxuXHRcdF0sIHNwZWMgPT4gdGlwcHkoc3BlYy50YXJnZXRFbCwgXy5leHRlbmQoXy5vbWl0KHNwZWMsIFtcInRhcmdldEVsXCJdKSwge1xuXHRcdFx0dGhlbWU6IFwiYmxhY2tcIixcblx0XHRcdHBsYWNlbWVudDogXCJib3R0b21cIixcblx0XHR9KSkpO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiYXR0ZW5kYW5jZVJlZ2lzdGVyXCIpLCBcInJlZ2lzdGVyOmxvYWRlZFwiLCB0aGlzLm9uQXR0ZW5kYW5jZVJlZ2lzdGVyTG9hZGVkLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdG9uQXR0ZW5kYW5jZVJlZ2lzdGVyTG9hZGVkOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmVuYWJsZSgpO1xuXHR9LFxuXG5cdG9uQnV0dG9uTWFya0FsbFByZXNlbnRDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImF0dGVuZGFuY2VSZWdpc3RlclwiKS50cmlnZ2VyKFwibWFyazpwcmVzZW50XCIpO1xuXHR9LFxuXG5cdG9uQnV0dG9uTWFya0FsbExhdGVDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImF0dGVuZGFuY2VSZWdpc3RlclwiKS50cmlnZ2VyKFwibWFyazpsYXRlXCIpO1xuXHR9LFxuXG5cdG9uQnV0dG9uTWFya0FsbEFic2VudENsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiYXR0ZW5kYW5jZVJlZ2lzdGVyXCIpLnRyaWdnZXIoXCJtYXJrOmFic2VudFwiKTtcblx0fSxcblxuXHRvbkJ1dHRvbkRlbGV0ZVJlZ2lzdGVyQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJhdHRlbmRhbmNlUmVnaXN0ZXJcIikudHJpZ2dlcihcInJlZ2lzdGVyOmRlbGV0ZVwiLCB0aGlzLm1vZGVsKTtcblx0fSxcblxuXHRkaXNhYmxlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmJ1dHRvbnMuYWRkQ2xhc3MoXCJuYXZpZ2F0b3ItYnV0dG9uLWRpc2FibGVkXCIpO1xuXHR9LFxuXG5cdGVuYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5idXR0b25zLnJlbW92ZUNsYXNzKFwibmF2aWdhdG9yLWJ1dHRvbi1kaXNhYmxlZFwiKTtcblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwic3ViLWhlYWRlciBhdHRlbmRhbmNlLXJlZ2lzdGVyLWhlYWRlci1sYXlvdXRcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9hdHRlbmRhbmNlL3JlZ2lzdGVySGVhZGVyLm51bmpcIikubGF5b3V0LFxuXG5cdHJlZ2lvbnM6IHtcblx0XHRuYXZpZ2F0b3I6IFwiLm5hdmlnYXRvci1yZWdpb25cIixcblx0fSxcblxuXHR1aToge1xuXHRcdGRhdGU6IFwiLmF0dGVuZGFuY2UtcmVnaXN0ZXItZGF0ZVwiLFxuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNob3dOYXZpZ2F0b3IoKTtcblx0fSxcblxuXHRnZXRBdHRlbmRhbmNlUmVnaXN0ZXJEYXRlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gbW9tZW50LnVuaXgodGhpcy5tb2RlbC5nZXQoXCJjcmVhdGVkXCIpKS5mb3JtYXQoXCJkZGRkLCBEIE1NTU0gWVlZWVwiKTtcblx0fSxcblxuXHRzaG93TmF2aWdhdG9yOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJuYXZpZ2F0b3JcIiwgbmV3IE5hdmlnYXRvcih7IG1vZGVsOiB0aGlzLm1vZGVsIH0pKTtcblx0fSxcbn0pOyJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar radio = Backbone.Radio.channel(\"global\");\nvar rester = require(\"rester\");\n\nvar App = require(\"../../../index\");\n\nvar CalBack = require(\"../../../lib/calBack\");\n\nvar CALENDAR_FIRST_DAY_OF_WEEK = \"Sunday\";\n\nvar Blank = Backbone.Marionette.View.extend({\n\tclassName: \"attendance-register-selector-blank\",\n\n\ttemplate: require(\"../../templates/attendance/registerSelector.nunj\").blank,\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tisAdminUser: this.isAdminUser()\n\t\t};\n\t},\n\n\tisAdminUser: function isAdminUser() {\n\t\treturn rester.hasAccess(rester.p.attendance.all, radio.request(App.Events.Requests.CurrentUser));\n\t}\n});\n\nvar Calendar = Backbone.Marionette.View.extend({\n\tclassName: \"attendance-register-selector-calendar\",\n\n\ttemplate: require(\"../../templates/attendance/registerSelector.nunj\").calendar,\n\n\tregions: {\n\t\tcontent: \".content-region\"\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.registerCalendar.destroy();\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.registerCalendar = new CalBack({\n\t\t\tchannel: \"attendanceRegisterSelector\",\n\t\t\tclassName: \"cal-back-large\",\n\t\t\tfirstDayOfWeek: CALENDAR_FIRST_DAY_OF_WEEK,\n\t\t\texternalRequest: \"calendar:fetch\"\n\t\t});\n\n\t\tthis.showChildView(\"content\", this.registerCalendar);\n\t}\n});\n\nmodule.exports = {\n\tBlank: Blank,\n\tCalendar: Calendar\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJlZ2lzdGVyU2VsZWN0b3IuanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwicmFkaW8iLCJSYWRpbyIsImNoYW5uZWwiLCJyZXN0ZXIiLCJBcHAiLCJDYWxCYWNrIiwiQ0FMRU5EQVJfRklSU1RfREFZX09GX1dFRUsiLCJCbGFuayIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiZXh0ZW5kIiwiY2xhc3NOYW1lIiwidGVtcGxhdGUiLCJibGFuayIsInRlbXBsYXRlQ29udGV4dCIsImlzQWRtaW5Vc2VyIiwiaGFzQWNjZXNzIiwicCIsImF0dGVuZGFuY2UiLCJhbGwiLCJyZXF1ZXN0IiwiRXZlbnRzIiwiUmVxdWVzdHMiLCJDdXJyZW50VXNlciIsIkNhbGVuZGFyIiwiY2FsZW5kYXIiLCJyZWdpb25zIiwiY29udGVudCIsIm9uQmVmb3JlRGVzdHJveSIsInJlZ2lzdGVyQ2FsZW5kYXIiLCJkZXN0cm95Iiwib25SZW5kZXIiLCJmaXJzdERheU9mV2VlayIsImV4dGVybmFsUmVxdWVzdCIsInNob3dDaGlsZFZpZXciLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNQyxRQUFRRixTQUFTRyxLQUFULENBQWVDLE9BQWYsQ0FBdUIsUUFBdkIsQ0FBZDtBQUNBLElBQU1DLFNBQVNKLFFBQVEsUUFBUixDQUFmOztBQUVBLElBQU1LLE1BQU1MLFFBQVEsZ0JBQVIsQ0FBWjs7QUFFQSxJQUFNTSxVQUFVTixRQUFRLHNCQUFSLENBQWhCOztBQUVBLElBQU1PLDZCQUE2QixRQUFuQzs7QUFFQSxJQUFNQyxRQUFRVCxTQUFTVSxVQUFULENBQW9CQyxJQUFwQixDQUF5QkMsTUFBekIsQ0FBZ0M7QUFDN0NDLFlBQVcsb0NBRGtDOztBQUc3Q0MsV0FBVWIsUUFBUSxrREFBUixFQUE0RGMsS0FIekI7O0FBSzdDQyxrQkFBaUIsMkJBQVc7QUFDM0IsU0FBTztBQUNOQyxnQkFBYSxLQUFLQSxXQUFMO0FBRFAsR0FBUDtBQUdBLEVBVDRDOztBQVc3Q0EsY0FBYSx1QkFBVztBQUN2QixTQUFPWixPQUFPYSxTQUFQLENBQWlCYixPQUFPYyxDQUFQLENBQVNDLFVBQVQsQ0FBb0JDLEdBQXJDLEVBQTBDbkIsTUFBTW9CLE9BQU4sQ0FBY2hCLElBQUlpQixNQUFKLENBQVdDLFFBQVgsQ0FBb0JDLFdBQWxDLENBQTFDLENBQVA7QUFDQTtBQWI0QyxDQUFoQyxDQUFkOztBQWdCQSxJQUFNQyxXQUFXMUIsU0FBU1UsVUFBVCxDQUFvQkMsSUFBcEIsQ0FBeUJDLE1BQXpCLENBQWdDO0FBQ2hEQyxZQUFXLHVDQURxQzs7QUFHaERDLFdBQVViLFFBQVEsa0RBQVIsRUFBNEQwQixRQUh0Qjs7QUFLaERDLFVBQVM7QUFDUkMsV0FBUztBQURELEVBTHVDOztBQVNoREMsa0JBQWlCLDJCQUFXO0FBQzNCLE9BQUtDLGdCQUFMLENBQXNCQyxPQUF0QjtBQUNBLEVBWCtDOztBQWFoREMsV0FBVSxvQkFBVztBQUNwQixPQUFLRixnQkFBTCxHQUF3QixJQUFJeEIsT0FBSixDQUFZO0FBQ25DSCxZQUFTLDRCQUQwQjtBQUVuQ1MsY0FBVyxnQkFGd0I7QUFHbkNxQixtQkFBZ0IxQiwwQkFIbUI7QUFJbkMyQixvQkFBaUI7QUFKa0IsR0FBWixDQUF4Qjs7QUFPQSxPQUFLQyxhQUFMLENBQW1CLFNBQW5CLEVBQThCLEtBQUtMLGdCQUFuQztBQUNBO0FBdEIrQyxDQUFoQyxDQUFqQjs7QUF5QkFNLE9BQU9DLE9BQVAsR0FBaUI7QUFDaEI3QixhQURnQjtBQUVoQmlCO0FBRmdCLENBQWpCIiwiZmlsZSI6InJlZ2lzdGVyU2VsZWN0b3IuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgcmFkaW8gPSBCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZ2xvYmFsXCIpO1xuY29uc3QgcmVzdGVyID0gcmVxdWlyZShcInJlc3RlclwiKTtcblxuY29uc3QgQXBwID0gcmVxdWlyZShcIi4uLy4uLy4uL2luZGV4XCIpO1xuXG5jb25zdCBDYWxCYWNrID0gcmVxdWlyZShcIi4uLy4uLy4uL2xpYi9jYWxCYWNrXCIpO1xuXG5jb25zdCBDQUxFTkRBUl9GSVJTVF9EQVlfT0ZfV0VFSyA9IFwiU3VuZGF5XCI7XG5cbmNvbnN0IEJsYW5rID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJhdHRlbmRhbmNlLXJlZ2lzdGVyLXNlbGVjdG9yLWJsYW5rXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvYXR0ZW5kYW5jZS9yZWdpc3RlclNlbGVjdG9yLm51bmpcIikuYmxhbmssXG5cblx0dGVtcGxhdGVDb250ZXh0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aXNBZG1pblVzZXI6IHRoaXMuaXNBZG1pblVzZXIoKSxcblx0XHR9O1xuXHR9LFxuXG5cdGlzQWRtaW5Vc2VyOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gcmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5hdHRlbmRhbmNlLmFsbCwgcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKSk7XG5cdH0sXG59KTtcblxuY29uc3QgQ2FsZW5kYXIgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImF0dGVuZGFuY2UtcmVnaXN0ZXItc2VsZWN0b3ItY2FsZW5kYXJcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9hdHRlbmRhbmNlL3JlZ2lzdGVyU2VsZWN0b3IubnVualwiKS5jYWxlbmRhcixcblxuXHRyZWdpb25zOiB7XG5cdFx0Y29udGVudDogXCIuY29udGVudC1yZWdpb25cIixcblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMucmVnaXN0ZXJDYWxlbmRhci5kZXN0cm95KCk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMucmVnaXN0ZXJDYWxlbmRhciA9IG5ldyBDYWxCYWNrKHtcblx0XHRcdGNoYW5uZWw6IFwiYXR0ZW5kYW5jZVJlZ2lzdGVyU2VsZWN0b3JcIixcblx0XHRcdGNsYXNzTmFtZTogXCJjYWwtYmFjay1sYXJnZVwiLFxuXHRcdFx0Zmlyc3REYXlPZldlZWs6IENBTEVOREFSX0ZJUlNUX0RBWV9PRl9XRUVLLFxuXHRcdFx0ZXh0ZXJuYWxSZXF1ZXN0OiBcImNhbGVuZGFyOmZldGNoXCIsXG5cdFx0fSk7XG5cblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJjb250ZW50XCIsIHRoaXMucmVnaXN0ZXJDYWxlbmRhcik7XG5cdH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdEJsYW5rLFxuXHRDYWxlbmRhcixcbn07Il19",
    "\"use strict\";\n\nvar _regenerator = require(\"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\n// eslint-disable-next-line no-unused-vars\nvar Promise = require(\"bluebird\"); // IE11\nvar radio = Backbone.Radio.channel(\"global\");\nvar rester = require(\"rester\");\nvar $ = require(\"jquery\");\nvar Pikaday = require(\"pikaday\");\nvar moment = require(\"moment\");\nvar qs = require(\"querystring\");\n\nvar App = require(\"../../../index\");\nvar settings = require(\"app-settings\");\n\nvar Selectra = require(\"../../../lib/selectra\");\nvar SmallModal = require(\"../../../lib/smallModal\");\nvar tippy = require(\"tippy.js\").default;\nvar Switch = require(\"../../../lib/switch\");\n\nvar Navigator = Backbone.Marionette.View.extend({\n\tclassName: \"attendance-registers-header-navigator\",\n\n\ttemplate: require(\"../../templates/attendance/registerSelectorHeader.nunj\").navigator,\n\n\tui: {\n\t\tbuttons: \".navigator-button\",\n\t\t//\t\tbuttonReportByDate: \".button-report-by-date\",\n\t\t//\t\tbuttonReportByUser: \".button-report-by-user\",\n\t\tbuttonDownloadReport: \".button-download-report\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonDownloadReport\": \"onButtonDownloadReportClick\",\n\t\t\"click @ui.buttonReportByUser\": \"onButtonReportByUserClick\"\n\t},\n\n\tinitialize: function initialize() {\n\t\treturn;\n\t\t//this.listenTo(Backbone.Radio.channel(\"attendanceRegisterSelector\"), \"group:select\", this.onGroupSelected.bind(this));\n\t\t//this.listenTo(Backbone.Radio.channel(\"attendanceRegisterSelector\"), \"user:select\", this.onUserSelected.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.disable();\n\n\t\t_.each([{\n\t\t\ttargetEl: this.ui.buttonDownloadReport.get(0),\n\t\t\tcontent: \"Download a Report in CSV Format\"\n\t\t}], function (spec) {\n\t\t\treturn tippy(spec.targetEl, _.extend(_.omit(spec, [\"targetEl\"]), {\n\t\t\t\ttheme: \"black\",\n\t\t\t\tplacement: \"bottom\"\n\t\t\t}));\n\t\t});\n\n\t\tthis.enable();\n\t},\n\n\tonGroupSelected: function onGroupSelected() {\n\t\tif (this.isAdminUser()) this.disable();else this.enable();\n\t},\n\n\tonUserSelected: function onUserSelected() {\n\t\tthis.enable();\n\t},\n\n\tonButtonDownloadReportClick: function onButtonDownloadReportClick() {\n\t\t//Backbone.Radio.channel(\"attendanceRegisterSelector\").trigger(\"report:download\");\n\n\t\tthis.downloadReport();\n\t},\n\n\tonButtonReportByUserClick: function onButtonReportByUserClick() {\n\t\t//Backbone.Radio.channel(\"attendanceRegisterSelector\").trigger(\"report:user\");\n\n\t\tthis.downloadReport();\n\t},\n\n\tdownloadReport: function downloadReport() {\n\t\tvar _this = this;\n\n\t\tvar modal = new SmallModal({\n\t\t\ttitle: \"Download Report\",\n\t\t\tbody: \"<p>Choose one or more groups to download a report for, and a date range.</p>\\n\\t\\t\\t\\t<p><select name=\\\"groups\\\"></select></p>\\n\\t\\t\\t\\t<p>Start (inclusive): <input name=\\\"start\\\"/></p>\\n\\t\\t\\t\\t<p>End (inclusive): <input name=\\\"end\\\"/></p>\",\n\t\t\tpersist: true\n\t\t});\n\n\t\tvar currentUser = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tvar groupSelector = new Selectra({\n\t\t\tmultiple: true,\n\t\t\tserver: {\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/users/\" + encodeURIComponent(currentUser.username) + \"/enrolment?withPrivate=true\",\n\t\t\t\tdelayLoad: true,\n\t\t\t\tmap: function map(x) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkey: x.group_id,\n\t\t\t\t\t\tvalue: x.name\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 20,\n\t\t\t\tinfinite: true\n\t\t\t},\n\t\t\tplaceholder: \"Choose one or more groups\"\n\t\t});\n\n\t\tvar startDate = null;\n\t\tvar endDate = null;\n\n\t\tmodal.on(\"button:ok\", function () {\n\t\t\tif (!startDate.val() && !endDate.val()) return modal.showError(\"You must select either a start or end date\");\n\n\t\t\tif (!groupSelector.val() || !groupSelector.val().length) return modal.showError(\"You must choose at least one group\");\n\n\t\t\tvar params = {\n\t\t\t\tstart: startDate.val() ? moment(startDate.val(), \"DD MMM YYYY\").startOf(\"day\").unix() : 0,\n\t\t\t\tend: endDate.val() ? moment(endDate.val(), \"DD MMM YYYY\").endOf(\"day\").unix() : 2147483647,\n\t\t\t\tgroups: groupSelector.val()\n\t\t\t};\n\n\t\t\twindow.open(settings.urlRoot + \"/api/1.0/attendance/report?\" + qs.stringify(params));\n\n\t\t\t_this.startDate.destroy();\n\t\t\t_this.endDate.destroy();\n\n\t\t\t_this.startDate = _this.endDate = null;\n\n\t\t\tmodal.destroy();\n\t\t});\n\n\t\tmodal.show();\n\n\t\tstartDate = $(\"input[name='start']\", modal.el);\n\t\tendDate = $(\"input[name='end']\", modal.el);\n\n\t\tgroupSelector.show({ el: $(\"select[name='groups']\", modal.el) });\n\n\t\tthis.startDate = new Pikaday({\n\t\t\tfield: startDate.get(0),\n\t\t\tformat: \"DD MMM YYYY\",\n\t\t\tdefaultDate: new Date(),\n\t\t\tsetDefaultDate: true,\n\n\t\t\tonSelect: function onSelect() {\n\t\t\t\tvar start = moment(startDate.val(), \"DD MMM YYYY\").hour(0).minute(0).second(0);\n\t\t\t\tvar end = moment(endDate.val(), \"DD MMM YYYY\").hour(0).minute(0).second(0);\n\n\t\t\t\tif (start.isAfter(end)) _this.endDate.setDate(start.toDate());\n\n\t\t\t\t_this.endDate.setMinDate(start.toDate());\n\t\t\t}\n\t\t});\n\n\t\tthis.endDate = new Pikaday({\n\t\t\tfield: endDate.get(0),\n\t\t\tformat: \"DD MMM YYYY\",\n\t\t\tdefaultDate: new Date(),\n\t\t\tsetDefaultDate: true,\n\n\t\t\tonSelect: function onSelect() {\n\t\t\t\tvar start = moment(startDate.val(), \"DD MMM YYYY\").hour(0).minute(0).second(0);\n\t\t\t\tvar end = moment(endDate.val(), \"DD MMM YYYY\").hour(0).minute(0).second(0);\n\n\t\t\t\tif (start.isAfter(end)) _this.startDate.setDate(end.toDate());\n\t\t\t}\n\t\t});\n\t},\n\n\tdisable: function disable() {\n\t\tthis.ui.buttons.addClass(\"navigator-button-disabled\");\n\t},\n\n\tenable: function enable() {\n\t\tthis.ui.buttons.removeClass(\"navigator-button-disabled\");\n\t},\n\n\tisAdminUser: function isAdminUser() {\n\t\treturn rester.hasAccess(rester.p.attendance.all, radio.request(App.Events.Requests.CurrentUser));\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"sub-header attendance-register-selector-header-layout\",\n\n\ttemplate: require(\"../../templates/attendance/registerSelectorHeader.nunj\").layout,\n\n\tregions: {\n\t\tnavigator: \".navigator-region\",\n\t\tgroupSelector: \".group-selector-region\",\n\t\treportSwitch: \".switch-region\",\n\t\tuserSelector: \".user-selector-region\"\n\t},\n\n\tui: {\n\t\tuserSelectorRegion: \".user-selector-region\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tisAdminUser: this.isAdminUser()\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\n\t\tthis.listenTo(Backbone.Radio.channel(\"attendanceRegisterSelector\"), \"group:select\", this.onGroupSelected.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.showChildView(\"reportSwitch\", new Switch({\n\t\t\teventChannel: \"attendanceRegister\",\n\t\t\teventPrefix: \"reportSwitch\",\n\t\t\toffLabel: \"Roll Call\",\n\t\t\tonLabel: \"Report\",\n\t\t\ton: this.options.mode === \"report\"\n\t\t}));\n\n\t\tthis.showGroupSelector();\n\t\t//this.showUserSelector();\n\t\tthis.showNavigator();\n\t},\n\n\tonGroupSelected: function onGroupSelected(group) {\n\t\tthis.showUserSelector(group, true);\n\t},\n\n\tisAdminUser: function isAdminUser() {\n\t\treturn rester.hasAccess(rester.p.attendance.all, radio.request(App.Events.Requests.CurrentUser));\n\t},\n\n\tshowGroupSelector: function () {\n\t\tvar _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee() {\n\t\t\tvar currentUser, selectorDefault;\n\t\t\treturn _regenerator2.default.wrap(function _callee$(_context) {\n\t\t\t\twhile (1) {\n\t\t\t\t\tswitch (_context.prev = _context.next) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tcurrentUser = radio.request(App.Events.Requests.CurrentUser);\n\t\t\t\t\t\t\t_context.next = 3;\n\t\t\t\t\t\t\treturn Backbone.Radio.channel(\"attendanceRegisterSelector\").request(\"group:fetch:default\");\n\n\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\tselectorDefault = _context.sent;\n\n\n\t\t\t\t\t\t\tthis.groupSelector = new Selectra({\n\t\t\t\t\t\t\t\tbusChannel: \"groupSelector\",\n\t\t\t\t\t\t\t\tserver: {\n\t\t\t\t\t\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/users/\" + encodeURIComponent(currentUser.username) + \"/enrolment?withPrivate=true\",\n\t\t\t\t\t\t\t\t\tdelayLoad: true,\n\t\t\t\t\t\t\t\t\tmap: function map(x) {\n\t\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\t\tkey: x.code,\n\t\t\t\t\t\t\t\t\t\t\tvalue: x.name\n\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tdefault: _.extend(selectorDefault, { silent: true })\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tpaging: {\n\t\t\t\t\t\t\t\t\tpageSize: 20,\n\t\t\t\t\t\t\t\t\tinfinite: true\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tplaceholder: \"Choose a group\"\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tthis.showChildView(\"groupSelector\", this.groupSelector);\n\n\t\t\t\t\t\tcase 6:\n\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\treturn _context.stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, _callee, this);\n\t\t}));\n\n\t\tfunction showGroupSelector() {\n\t\t\treturn _ref.apply(this, arguments);\n\t\t}\n\n\t\treturn showGroupSelector;\n\t}(),\n\n\tshowUserSelector: function () {\n\t\tvar _ref2 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee2(group, enabled) {\n\t\t\tvar userSelector;\n\t\t\treturn _regenerator2.default.wrap(function _callee2$(_context2) {\n\t\t\t\twhile (1) {\n\t\t\t\t\tswitch (_context2.prev = _context2.next) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tif (this.isAdminUser()) {\n\t\t\t\t\t\t\t\t//const selectorDefault = await Backbone.Radio.channel(\"attendanceRegisterSelector\").request(\"user:fetch:default\");\n\n\t\t\t\t\t\t\t\tuserSelector = new Selectra({\n\t\t\t\t\t\t\t\t\tbusChannel: \"userSelector\",\n\t\t\t\t\t\t\t\t\tserver: {\n\t\t\t\t\t\t\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/attendance/registers/byGroup/\" + encodeURIComponent(group) + \"/owners\",\n\t\t\t\t\t\t\t\t\t\tdelayLoad: true,\n\t\t\t\t\t\t\t\t\t\tmap: function map(x) {\n\t\t\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\t\t\tkey: x.user_id,\n\t\t\t\t\t\t\t\t\t\t\t\tvalue: x.firstname + \" \" + x.surname + \" (\" + x.username + \")\"\n\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t//default: selectorDefault,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tplaceholder: \"Choose a user\"\n\t\t\t\t\t\t\t\t});\n\n\n\t\t\t\t\t\t\t\tthis.showChildView(\"userSelector\", userSelector);\n\n\t\t\t\t\t\t\t\tif (enabled) this.ui.userSelectorRegion.removeClass(\"region-disabled\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\treturn _context2.stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, _callee2, this);\n\t\t}));\n\n\t\tfunction showUserSelector(_x, _x2) {\n\t\t\treturn _ref2.apply(this, arguments);\n\t\t}\n\n\t\treturn showUserSelector;\n\t}(),\n\n\tshowNavigator: function showNavigator() {\n\t\tthis.showChildView(\"navigator\", new Navigator());\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJlZ2lzdGVyU2VsZWN0b3JIZWFkZXIuanMiXSwibmFtZXMiOlsiXyIsInJlcXVpcmUiLCJCYWNrYm9uZSIsIlByb21pc2UiLCJyYWRpbyIsIlJhZGlvIiwiY2hhbm5lbCIsInJlc3RlciIsIiQiLCJQaWthZGF5IiwibW9tZW50IiwicXMiLCJBcHAiLCJzZXR0aW5ncyIsIlNlbGVjdHJhIiwiU21hbGxNb2RhbCIsInRpcHB5IiwiZGVmYXVsdCIsIlN3aXRjaCIsIk5hdmlnYXRvciIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiZXh0ZW5kIiwiY2xhc3NOYW1lIiwidGVtcGxhdGUiLCJuYXZpZ2F0b3IiLCJ1aSIsImJ1dHRvbnMiLCJidXR0b25Eb3dubG9hZFJlcG9ydCIsImV2ZW50cyIsImluaXRpYWxpemUiLCJvblJlbmRlciIsImRpc2FibGUiLCJlYWNoIiwidGFyZ2V0RWwiLCJnZXQiLCJjb250ZW50Iiwic3BlYyIsIm9taXQiLCJ0aGVtZSIsInBsYWNlbWVudCIsImVuYWJsZSIsIm9uR3JvdXBTZWxlY3RlZCIsImlzQWRtaW5Vc2VyIiwib25Vc2VyU2VsZWN0ZWQiLCJvbkJ1dHRvbkRvd25sb2FkUmVwb3J0Q2xpY2siLCJkb3dubG9hZFJlcG9ydCIsIm9uQnV0dG9uUmVwb3J0QnlVc2VyQ2xpY2siLCJtb2RhbCIsInRpdGxlIiwiYm9keSIsInBlcnNpc3QiLCJjdXJyZW50VXNlciIsInJlcXVlc3QiLCJFdmVudHMiLCJSZXF1ZXN0cyIsIkN1cnJlbnRVc2VyIiwiZ3JvdXBTZWxlY3RvciIsIm11bHRpcGxlIiwic2VydmVyIiwiZmV0Y2giLCJ1cmxSb290IiwiZW5jb2RlVVJJQ29tcG9uZW50IiwidXNlcm5hbWUiLCJkZWxheUxvYWQiLCJtYXAiLCJrZXkiLCJ4IiwiZ3JvdXBfaWQiLCJ2YWx1ZSIsIm5hbWUiLCJwYWdpbmciLCJwYWdlU2l6ZSIsImluZmluaXRlIiwicGxhY2Vob2xkZXIiLCJzdGFydERhdGUiLCJlbmREYXRlIiwib24iLCJ2YWwiLCJzaG93RXJyb3IiLCJsZW5ndGgiLCJwYXJhbXMiLCJzdGFydCIsInN0YXJ0T2YiLCJ1bml4IiwiZW5kIiwiZW5kT2YiLCJncm91cHMiLCJ3aW5kb3ciLCJvcGVuIiwic3RyaW5naWZ5IiwiZGVzdHJveSIsInNob3ciLCJlbCIsImZpZWxkIiwiZm9ybWF0IiwiZGVmYXVsdERhdGUiLCJEYXRlIiwic2V0RGVmYXVsdERhdGUiLCJvblNlbGVjdCIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJpc0FmdGVyIiwic2V0RGF0ZSIsInRvRGF0ZSIsInNldE1pbkRhdGUiLCJhZGRDbGFzcyIsInJlbW92ZUNsYXNzIiwiaGFzQWNjZXNzIiwicCIsImF0dGVuZGFuY2UiLCJhbGwiLCJtb2R1bGUiLCJleHBvcnRzIiwibGF5b3V0IiwicmVnaW9ucyIsInJlcG9ydFN3aXRjaCIsInVzZXJTZWxlY3RvciIsInVzZXJTZWxlY3RvclJlZ2lvbiIsInRlbXBsYXRlQ29udGV4dCIsIm9wdGlvbnMiLCJsaXN0ZW5UbyIsImJpbmQiLCJzaG93Q2hpbGRWaWV3IiwiZXZlbnRDaGFubmVsIiwiZXZlbnRQcmVmaXgiLCJvZmZMYWJlbCIsIm9uTGFiZWwiLCJtb2RlIiwic2hvd0dyb3VwU2VsZWN0b3IiLCJzaG93TmF2aWdhdG9yIiwiZ3JvdXAiLCJzaG93VXNlclNlbGVjdG9yIiwic2VsZWN0b3JEZWZhdWx0IiwiYnVzQ2hhbm5lbCIsImNvZGUiLCJzaWxlbnQiLCJlbmFibGVkIiwidXNlcl9pZCIsImZpcnN0bmFtZSIsInN1cm5hbWUiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0FBQ0EsSUFBTUEsSUFBSUMsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNQyxXQUFXRCxRQUFRLFVBQVIsQ0FBakI7QUFDQTtBQUNBLElBQU1FLFVBQVVGLFFBQVEsVUFBUixDQUFoQixDLENBQXFDO0FBQ3JDLElBQU1HLFFBQVFGLFNBQVNHLEtBQVQsQ0FBZUMsT0FBZixDQUF1QixRQUF2QixDQUFkO0FBQ0EsSUFBTUMsU0FBU04sUUFBUSxRQUFSLENB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O0FBQ3ZCOztBQUVNMkUsb0JBSGlCLEdBR0YsSUFBSXhHLFFBQUosQ0FBYTtBQUNqQ3lILHFCQUFZLGNBRHFCO0FBRWpDNUUsaUJBQVE7QUFDUEMsaUJBQVUvQyxTQUFTZ0QsT0FBbkIsOENBQW1FQyxtQkFBbUJzRSxLQUFuQixDQUFuRSxZQURPO0FBRVBwRSxxQkFBVyxJQUZKO0FBR1BDLGVBQUs7QUFBQSxrQkFBTTtBQUNWQyxpQkFBS0MsRUFBRXdFLE9BREc7QUFFVnRFLG1CQUFPRixFQUFFeUUsU0FBRixHQUFjLEdBQWQsR0FBb0J6RSxFQUFFMEUsT0FBdEIsR0FBZ0MsSUFBaEMsR0FBdUMxRSxFQUFFSixRQUF6QyxHQUFvRDtBQUZqRCxZQUFOO0FBQUE7QUFJTDtBQVBPLFVBRnlCO0FBV2pDVyxzQkFBYTtBQVhvQixTQUFiLENBSEU7OztBQWlCdkIsYUFBS2tELGFBQUwsQ0FBbUIsY0FBbkIsRUFBbUNOLFlBQW5DOztBQUVBLFlBQUlvQixPQUFKLEVBQ0MsS0FBS2hILEVBQUwsQ0FBUTZGLGtCQUFSLENBQTJCWCxXQUEzQixDQUF1QyxpQkFBdkM7QUFDRDs7QUF0QmdCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdBQWxCOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLElBM0VnRDs7QUFvR2hEdUIsZ0JBQWUseUJBQVc7QUFDekIsT0FBS1AsYUFBTCxDQUFtQixXQUFuQixFQUFnQyxJQUFJekcsU0FBSixFQUFoQztBQUNBO0FBdEcrQyxDQUFoQyxDQUFqQiIsImZpbGUiOiJyZWdpc3RlclNlbGVjdG9ySGVhZGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5jb25zdCBQcm9taXNlID0gcmVxdWlyZShcImJsdWViaXJkXCIpOyAvLyBJRTExXG5jb25zdCByYWRpbyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJnbG9iYWxcIik7XG5jb25zdCByZXN0ZXIgPSByZXF1aXJlKFwicmVzdGVyXCIpO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBQaWthZGF5ID0gcmVxdWlyZShcInBpa2FkYXlcIik7XG5jb25zdCBtb21lbnQgPSByZXF1aXJlKFwibW9tZW50XCIpO1xuY29uc3QgcXMgPSByZXF1aXJlKFwicXVlcnlzdHJpbmdcIik7XG5cbmNvbnN0IEFwcCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9pbmRleFwiKTtcbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxuY29uc3QgU2VsZWN0cmEgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL3NlbGVjdHJhXCIpO1xuY29uc3QgU21hbGxNb2RhbCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9saWIvc21hbGxNb2RhbFwiKTtcbmNvbnN0IHRpcHB5ID0gcmVxdWlyZShcInRpcHB5LmpzXCIpLmRlZmF1bHQ7XG5jb25zdCBTd2l0Y2ggPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL3N3aXRjaFwiKTtcblxuY29uc3QgTmF2aWdhdG9yID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJhdHRlbmRhbmNlLXJlZ2lzdGVycy1oZWFkZXItbmF2aWdhdG9yXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvYXR0ZW5kYW5jZS9yZWdpc3RlclNlbGVjdG9ySGVhZGVyLm51bmpcIikubmF2aWdhdG9yLFxuXG5cdHVpOiB7XG5cdFx0YnV0dG9uczogXCIubmF2aWdhdG9yLWJ1dHRvblwiLFxuXHRcdC8vXHRcdGJ1dHRvblJlcG9ydEJ5RGF0ZTogXCIuYnV0dG9uLXJlcG9ydC1ieS1kYXRlXCIsXG5cdFx0Ly9cdFx0YnV0dG9uUmVwb3J0QnlVc2VyOiBcIi5idXR0b24tcmVwb3J0LWJ5LXVzZXJcIixcblx0XHRidXR0b25Eb3dubG9hZFJlcG9ydDogXCIuYnV0dG9uLWRvd25sb2FkLXJlcG9ydFwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmJ1dHRvbkRvd25sb2FkUmVwb3J0XCI6IFwib25CdXR0b25Eb3dubG9hZFJlcG9ydENsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkuYnV0dG9uUmVwb3J0QnlVc2VyXCI6IFwib25CdXR0b25SZXBvcnRCeVVzZXJDbGlja1wiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybjtcblx0XHQvL3RoaXMubGlzdGVuVG8oQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImF0dGVuZGFuY2VSZWdpc3RlclNlbGVjdG9yXCIpLCBcImdyb3VwOnNlbGVjdFwiLCB0aGlzLm9uR3JvdXBTZWxlY3RlZC5iaW5kKHRoaXMpKTtcblx0XHQvL3RoaXMubGlzdGVuVG8oQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImF0dGVuZGFuY2VSZWdpc3RlclNlbGVjdG9yXCIpLCBcInVzZXI6c2VsZWN0XCIsIHRoaXMub25Vc2VyU2VsZWN0ZWQuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZGlzYWJsZSgpO1xuXG5cdFx0Xy5lYWNoKFtcblx0XHRcdHtcblx0XHRcdFx0dGFyZ2V0RWw6IHRoaXMudWkuYnV0dG9uRG93bmxvYWRSZXBvcnQuZ2V0KDApLFxuXHRcdFx0XHRjb250ZW50OiBcIkRvd25sb2FkIGEgUmVwb3J0IGluIENTViBGb3JtYXRcIixcblx0XHRcdH0sXG5cdFx0XSwgc3BlYyA9PiB0aXBweShzcGVjLnRhcmdldEVsLCBfLmV4dGVuZChfLm9taXQoc3BlYywgW1widGFyZ2V0RWxcIl0pLCB7XG5cdFx0XHR0aGVtZTogXCJibGFja1wiLFxuXHRcdFx0cGxhY2VtZW50OiBcImJvdHRvbVwiLFxuXHRcdH0pKSk7XG5cblx0XHR0aGlzLmVuYWJsZSgpO1xuXHR9LFxuXG5cdG9uR3JvdXBTZWxlY3RlZDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuaXNBZG1pblVzZXIoKSlcblx0XHRcdHRoaXMuZGlzYWJsZSgpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuZW5hYmxlKCk7XG5cdH0sXG5cblx0b25Vc2VyU2VsZWN0ZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZW5hYmxlKCk7XG5cdH0sXG5cblx0b25CdXR0b25Eb3dubG9hZFJlcG9ydENsaWNrOiBmdW5jdGlvbigpIHtcblx0XHQvL0JhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJhdHRlbmRhbmNlUmVnaXN0ZXJTZWxlY3RvclwiKS50cmlnZ2VyKFwicmVwb3J0OmRvd25sb2FkXCIpO1xuXG5cdFx0dGhpcy5kb3dubG9hZFJlcG9ydCgpO1xuXHR9LFxuXG5cdG9uQnV0dG9uUmVwb3J0QnlVc2VyQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdC8vQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImF0dGVuZGFuY2VSZWdpc3RlclNlbGVjdG9yXCIpLnRyaWdnZXIoXCJyZXBvcnQ6dXNlclwiKTtcblxuXHRcdHRoaXMuZG93bmxvYWRSZXBvcnQoKTtcblx0fSxcblxuXHRkb3dubG9hZFJlcG9ydDogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgbW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHR0aXRsZTogXCJEb3dubG9hZCBSZXBvcnRcIixcblx0XHRcdGJvZHk6IGA8cD5DaG9vc2Ugb25lIG9yIG1vcmUgZ3JvdXBzIHRvIGRvd25sb2FkIGEgcmVwb3J0IGZvciwgYW5kIGEgZGF0ZSByYW5nZS48L3A+XG5cdFx0XHRcdDxwPjxzZWxlY3QgbmFtZT1cImdyb3Vwc1wiPjwvc2VsZWN0PjwvcD5cblx0XHRcdFx0PHA+U3RhcnQgKGluY2x1c2l2ZSk6IDxpbnB1dCBuYW1lPVwic3RhcnRcIi8+PC9wPlxuXHRcdFx0XHQ8cD5FbmQgKGluY2x1c2l2ZSk6IDxpbnB1dCBuYW1lPVwiZW5kXCIvPjwvcD5gLFxuXHRcdFx0cGVyc2lzdDogdHJ1ZSxcblx0XHR9KTtcblxuXHRcdGNvbnN0IGN1cnJlbnRVc2VyID0gcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblxuXHRcdGNvbnN0IGdyb3VwU2VsZWN0b3IgPSBuZXcgU2VsZWN0cmEoe1xuXHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRzZXJ2ZXI6IHtcblx0XHRcdFx0ZmV0Y2g6IGAke3NldHRpbmdzLnVybFJvb3R9L2FwaS8xLjAvdXNlcnMvJHtlbmNvZGVVUklDb21wb25lbnQoY3VycmVudFVzZXIudXNlcm5hbWUpfS9lbnJvbG1lbnQ/d2l0aFByaXZhdGU9dHJ1ZWAsXG5cdFx0XHRcdGRlbGF5TG9hZDogdHJ1ZSxcblx0XHRcdFx0bWFwOiB4ID0+ICh7XG5cdFx0XHRcdFx0a2V5OiB4Lmdyb3VwX2lkLFxuXHRcdFx0XHRcdHZhbHVlOiB4Lm5hbWUsXG5cdFx0XHRcdH0pLFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRwYWdlU2l6ZTogMjAsXG5cdFx0XHRcdGluZmluaXRlOiB0cnVlLFxuXHRcdFx0fSxcblx0XHRcdHBsYWNlaG9sZGVyOiBcIkNob29zZSBvbmUgb3IgbW9yZSBncm91cHNcIixcblx0XHR9KTtcblxuXHRcdGxldCBzdGFydERhdGUgPSBudWxsO1xuXHRcdGxldCBlbmREYXRlID0gbnVsbDtcblxuXHRcdG1vZGFsLm9uKFwiYnV0dG9uOm9rXCIsICgpID0+IHtcblx0XHRcdGlmICghc3RhcnREYXRlLnZhbCgpICYmICFlbmREYXRlLnZhbCgpKVxuXHRcdFx0XHRyZXR1cm4gbW9kYWwuc2hvd0Vycm9yKFwiWW91IG11c3Qgc2VsZWN0IGVpdGhlciBhIHN0YXJ0IG9yIGVuZCBkYXRlXCIpO1xuXG5cdFx0XHRpZiAoIWdyb3VwU2VsZWN0b3IudmFsKCkgfHwgIWdyb3VwU2VsZWN0b3IudmFsKCkubGVuZ3RoKVxuXHRcdFx0XHRyZXR1cm4gbW9kYWwuc2hvd0Vycm9yKFwiWW91IG11c3QgY2hvb3NlIGF0IGxlYXN0IG9uZSBncm91cFwiKTtcblxuXHRcdFx0Y29uc3QgcGFyYW1zID0ge1xuXHRcdFx0XHRzdGFydDogc3RhcnREYXRlLnZhbCgpID8gbW9tZW50KHN0YXJ0RGF0ZS52YWwoKSwgXCJERCBNTU0gWVlZWVwiKS5zdGFydE9mKFwiZGF5XCIpLnVuaXgoKSA6IDAsXG5cdFx0XHRcdGVuZDogZW5kRGF0ZS52YWwoKSA/IG1vbWVudChlbmREYXRlLnZhbCgpLCBcIkREIE1NTSBZWVlZXCIpLmVuZE9mKFwiZGF5XCIpLnVuaXgoKSA6IDIxNDc0ODM2NDcsXG5cdFx0XHRcdGdyb3VwczogZ3JvdXBTZWxlY3Rvci52YWwoKSxcblx0XHRcdH07XG5cblx0XHRcdHdpbmRvdy5vcGVuKHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2F0dGVuZGFuY2UvcmVwb3J0P1wiICsgcXMuc3RyaW5naWZ5KHBhcmFtcykpO1xuXG5cdFx0XHR0aGlzLnN0YXJ0RGF0ZS5kZXN0cm95KCk7XG5cdFx0XHR0aGlzLmVuZERhdGUuZGVzdHJveSgpO1xuXG5cdFx0XHR0aGlzLnN0YXJ0RGF0ZSA9IHRoaXMuZW5kRGF0ZSA9IG51bGw7XG5cblx0XHRcdG1vZGFsLmRlc3Ryb3koKTtcblx0XHR9KTtcblxuXHRcdG1vZGFsLnNob3coKTtcblxuXHRcdHN0YXJ0RGF0ZSA9ICQoXCJpbnB1dFtuYW1lPSdzdGFydCddXCIsIG1vZGFsLmVsKTtcblx0XHRlbmREYXRlID0gJChcImlucHV0W25hbWU9J2VuZCddXCIsIG1vZGFsLmVsKTtcblxuXHRcdGdyb3VwU2VsZWN0b3Iuc2hvdyh7IGVsOiAkKFwic2VsZWN0W25hbWU9J2dyb3VwcyddXCIsIG1vZGFsLmVsKSB9KTtcblxuXHRcdHRoaXMuc3RhcnREYXRlID0gbmV3IFBpa2FkYXkoe1xuXHRcdFx0ZmllbGQ6IHN0YXJ0RGF0ZS5nZXQoMCksXG5cdFx0XHRmb3JtYXQ6IFwiREQgTU1NIFlZWVlcIixcblx0XHRcdGRlZmF1bHREYXRlOiBuZXcgRGF0ZSgpLFxuXHRcdFx0c2V0RGVmYXVsdERhdGU6IHRydWUsXG5cblx0XHRcdG9uU2VsZWN0OiAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHN0YXJ0ID0gbW9tZW50KHN0YXJ0RGF0ZS52YWwoKSwgXCJERCBNTU0gWVlZWVwiKS5ob3VyKDApLm1pbnV0ZSgwKS5zZWNvbmQoMCk7XG5cdFx0XHRcdGNvbnN0IGVuZCA9IG1vbWVudChlbmREYXRlLnZhbCgpLCBcIkREIE1NTSBZWVlZXCIpLmhvdXIoMCkubWludXRlKDApLnNlY29uZCgwKTtcblxuXHRcdFx0XHRpZiAoc3RhcnQuaXNBZnRlcihlbmQpKVxuXHRcdFx0XHRcdHRoaXMuZW5kRGF0ZS5zZXREYXRlKHN0YXJ0LnRvRGF0ZSgpKTtcblxuXHRcdFx0XHR0aGlzLmVuZERhdGUuc2V0TWluRGF0ZShzdGFydC50b0RhdGUoKSk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5lbmREYXRlID0gbmV3IFBpa2FkYXkoe1xuXHRcdFx0ZmllbGQ6IGVuZERhdGUuZ2V0KDApLFxuXHRcdFx0Zm9ybWF0OiBcIkREIE1NTSBZWVlZXCIsXG5cdFx0XHRkZWZhdWx0RGF0ZTogbmV3IERhdGUoKSxcblx0XHRcdHNldERlZmF1bHREYXRlOiB0cnVlLFxuXG5cdFx0XHRvblNlbGVjdDogKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBzdGFydCA9IG1vbWVudChzdGFydERhdGUudmFsKCksIFwiREQgTU1NIFlZWVlcIikuaG91cigwKS5taW51dGUoMCkuc2Vjb25kKDApO1xuXHRcdFx0XHRjb25zdCBlbmQgPSBtb21lbnQoZW5kRGF0ZS52YWwoKSwgXCJERCBNTU0gWVlZWVwiKS5ob3VyKDApLm1pbnV0ZSgwKS5zZWNvbmQoMCk7XG5cblx0XHRcdFx0aWYgKHN0YXJ0LmlzQWZ0ZXIoZW5kKSlcblx0XHRcdFx0XHR0aGlzLnN0YXJ0RGF0ZS5zZXREYXRlKGVuZC50b0RhdGUoKSk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9LFxuXG5cdGRpc2FibGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkuYnV0dG9ucy5hZGRDbGFzcyhcIm5hdmlnYXRvci1idXR0b24tZGlzYWJsZWRcIik7XG5cdH0sXG5cblx0ZW5hYmxlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmJ1dHRvbnMucmVtb3ZlQ2xhc3MoXCJuYXZpZ2F0b3ItYnV0dG9uLWRpc2FibGVkXCIpO1xuXHR9LFxuXG5cdGlzQWRtaW5Vc2VyOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gcmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5hdHRlbmRhbmNlLmFsbCwgcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKSk7XG5cdH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInN1Yi1oZWFkZXIgYXR0ZW5kYW5jZS1yZWdpc3Rlci1zZWxlY3Rvci1oZWFkZXItbGF5b3V0XCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvYXR0ZW5kYW5jZS9yZWdpc3RlclNlbGVjdG9ySGVhZGVyLm51bmpcIikubGF5b3V0LFxuXG5cdHJlZ2lvbnM6IHtcblx0XHRuYXZpZ2F0b3I6IFwiLm5hdmlnYXRvci1yZWdpb25cIixcblx0XHRncm91cFNlbGVjdG9yOiBcIi5ncm91cC1zZWxlY3Rvci1yZWdpb25cIixcblx0XHRyZXBvcnRTd2l0Y2g6IFwiLnN3aXRjaC1yZWdpb25cIixcblx0XHR1c2VyU2VsZWN0b3I6IFwiLnVzZXItc2VsZWN0b3ItcmVnaW9uXCIsXG5cdH0sXG5cblx0dWk6IHtcblx0XHR1c2VyU2VsZWN0b3JSZWdpb246IFwiLnVzZXItc2VsZWN0b3ItcmVnaW9uXCIsXG5cdH0sXG5cblx0dGVtcGxhdGVDb250ZXh0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aXNBZG1pblVzZXI6IHRoaXMuaXNBZG1pblVzZXIoKSxcblx0XHR9O1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiYXR0ZW5kYW5jZVJlZ2lzdGVyU2VsZWN0b3JcIiksIFwiZ3JvdXA6c2VsZWN0XCIsIHRoaXMub25Hcm91cFNlbGVjdGVkLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJyZXBvcnRTd2l0Y2hcIiwgbmV3IFN3aXRjaCh7XG5cdFx0XHRldmVudENoYW5uZWw6IFwiYXR0ZW5kYW5jZVJlZ2lzdGVyXCIsXG5cdFx0XHRldmVudFByZWZpeDogXCJyZXBvcnRTd2l0Y2hcIixcblx0XHRcdG9mZkxhYmVsOiBcIlJvbGwgQ2FsbFwiLFxuXHRcdFx0b25MYWJlbDogXCJSZXBvcnRcIixcblx0XHRcdG9uOiB0aGlzLm9wdGlvbnMubW9kZSA9PT0gXCJyZXBvcnRcIixcblx0XHR9KSk7XG5cblx0XHR0aGlzLnNob3dHcm91cFNlbGVjdG9yKCk7XG5cdFx0Ly90aGlzLnNob3dVc2VyU2VsZWN0b3IoKTtcblx0XHR0aGlzLnNob3dOYXZpZ2F0b3IoKTtcblx0fSxcblxuXHRvbkdyb3VwU2VsZWN0ZWQ6IGZ1bmN0aW9uKGdyb3VwKSB7XG5cdFx0dGhpcy5zaG93VXNlclNlbGVjdG9yKGdyb3VwLCB0cnVlKTtcblx0fSxcblxuXHRpc0FkbWluVXNlcjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAuYXR0ZW5kYW5jZS5hbGwsIHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcikpO1xuXHR9LFxuXG5cdHNob3dHcm91cFNlbGVjdG9yOiBhc3luYyBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBjdXJyZW50VXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cdFx0Y29uc3Qgc2VsZWN0b3JEZWZhdWx0ID0gYXdhaXQgQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImF0dGVuZGFuY2VSZWdpc3RlclNlbGVjdG9yXCIpLnJlcXVlc3QoXCJncm91cDpmZXRjaDpkZWZhdWx0XCIpO1xuXG5cdFx0dGhpcy5ncm91cFNlbGVjdG9yID0gbmV3IFNlbGVjdHJhKHtcblx0XHRcdGJ1c0NoYW5uZWw6IFwiZ3JvdXBTZWxlY3RvclwiLFxuXHRcdFx0c2VydmVyOiB7XG5cdFx0XHRcdGZldGNoOiBgJHtzZXR0aW5ncy51cmxSb290fS9hcGkvMS4wL3VzZXJzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGN1cnJlbnRVc2VyLnVzZXJuYW1lKX0vZW5yb2xtZW50P3dpdGhQcml2YXRlPXRydWVgLFxuXHRcdFx0XHRkZWxheUxvYWQ6IHRydWUsXG5cdFx0XHRcdG1hcDogeCA9PiAoe1xuXHRcdFx0XHRcdGtleTogeC5jb2RlLFxuXHRcdFx0XHRcdHZhbHVlOiB4Lm5hbWUsXG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRkZWZhdWx0OiBfLmV4dGVuZChzZWxlY3RvckRlZmF1bHQsIHsgc2lsZW50OiB0cnVlIH0pLFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRwYWdlU2l6ZTogMjAsXG5cdFx0XHRcdGluZmluaXRlOiB0cnVlLFxuXHRcdFx0fSxcblx0XHRcdHBsYWNlaG9sZGVyOiBcIkNob29zZSBhIGdyb3VwXCIsXG5cdFx0fSk7XG5cblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJncm91cFNlbGVjdG9yXCIsIHRoaXMuZ3JvdXBTZWxlY3Rvcik7XG5cdH0sXG5cblx0c2hvd1VzZXJTZWxlY3RvcjogYXN5bmMgZnVuY3Rpb24oZ3JvdXAsIGVuYWJsZWQpIHtcblx0XHRpZiAodGhpcy5pc0FkbWluVXNlcigpKSB7XG5cdFx0XHQvL2NvbnN0IHNlbGVjdG9yRGVmYXVsdCA9IGF3YWl0IEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJhdHRlbmRhbmNlUmVnaXN0ZXJTZWxlY3RvclwiKS5yZXF1ZXN0KFwidXNlcjpmZXRjaDpkZWZhdWx0XCIpO1xuXG5cdFx0XHRjb25zdCB1c2VyU2VsZWN0b3IgPSBuZXcgU2VsZWN0cmEoe1xuXHRcdFx0XHRidXNDaGFubmVsOiBcInVzZXJTZWxlY3RvclwiLFxuXHRcdFx0XHRzZXJ2ZXI6IHtcblx0XHRcdFx0XHRmZXRjaDogYCR7c2V0dGluZ3MudXJsUm9vdH0vYXBpLzEuMC9hdHRlbmRhbmNlL3JlZ2lzdGVycy9ieUdyb3VwLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGdyb3VwKX0vb3duZXJzYCxcblx0XHRcdFx0XHRkZWxheUxvYWQ6IHRydWUsXG5cdFx0XHRcdFx0bWFwOiB4ID0+ICh7XG5cdFx0XHRcdFx0XHRrZXk6IHgudXNlcl9pZCxcblx0XHRcdFx0XHRcdHZhbHVlOiB4LmZpcnN0bmFtZSArIFwiIFwiICsgeC5zdXJuYW1lICsgXCIgKFwiICsgeC51c2VybmFtZSArIFwiKVwiLFxuXHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdC8vZGVmYXVsdDogc2VsZWN0b3JEZWZhdWx0LFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRwbGFjZWhvbGRlcjogXCJDaG9vc2UgYSB1c2VyXCIsXG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwidXNlclNlbGVjdG9yXCIsIHVzZXJTZWxlY3Rvcik7XG5cblx0XHRcdGlmIChlbmFibGVkKVxuXHRcdFx0XHR0aGlzLnVpLnVzZXJTZWxlY3RvclJlZ2lvbi5yZW1vdmVDbGFzcyhcInJlZ2lvbi1kaXNhYmxlZFwiKTtcblx0XHR9XG5cdH0sXG5cblx0c2hvd05hdmlnYXRvcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwibmF2aWdhdG9yXCIsIG5ldyBOYXZpZ2F0b3IoKSk7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar _regenerator = require(\"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar Chart = require(\"chart.js\");\nvar moment = require(\"moment\");\n// eslint-disable-next-line no-unused-vars\nvar Promise = require(\"bluebird\"); // IE11\nvar rester = require(\"rester\");\n\nvar App = require(\"../../../index\");\nvar AttendanceCommon = require(\"attendanceCommon\");\nvar radio = Backbone.Radio.channel(\"global\");\nvar settings = require(\"app-settings\");\n\nvar CalBack = require(\"../../../lib/calBack\");\nvar ErrorView = require(\"../../../lib/errorView\");\nvar StatusView = require(\"../../../lib/statusView\");\n\nvar CALENDAR_FIRST_DAY_OF_WEEK = \"Sunday\";\n\nvar Blank = Backbone.Marionette.View.extend({\n\tclassName: \"user-attendance-report-blank\",\n\n\ttemplate: require(\"../../templates/attendance/userReport.nunj\").blank,\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tisAdminUser: this.isAdminUser()\n\t\t};\n\t},\n\n\tisAdminUser: function isAdminUser() {\n\t\treturn rester.hasAccess(rester.p.attendance.all, radio.request(App.Events.Requests.CurrentUser));\n\t}\n});\n\nvar UserSelector = Backbone.Marionette.View.extend({\n\tclassName: \"user-selector\",\n\n\ttemplate: require(\"../../templates/attendance/userReport.nunj\").userSelector,\n\n\tui: {\n\t\tusers: \"select[name=users]\"\n\t},\n\n\tevents: {\n\t\t\"change @ui.users\": \"onUserChanged\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.ui.users.chosen({\n\t\t\twidth: \"100%\"\n\t\t});\n\n\t\tvar users = _.uniqBy(this.options.attendanceRecordCollection.models, function (a) {\n\t\t\treturn a.get(\"uuid\");\n\t\t});\n\n\t\tvar optionList = _.reduce(users, function (accumulator, a) {\n\t\t\taccumulator.push(\"<option value=\\\"\" + a.get(\"uuid\") + \"\\\">\" + a.get(\"surname\").replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t}) + \", \" + a.get(\"firstname\").replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t}) + \" (\" + a.get(\"username\").replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t}) + \")\");\n\t\t\treturn accumulator;\n\t\t}, [\"<option value=''></option>\"]);\n\n\t\tthis.ui.users.html(optionList.join(\"\")).trigger(\"chosen:updated\");\n\t},\n\n\tonUserChanged: function onUserChanged() {\n\t\tBackbone.Radio.channel(\"userAttendanceReport\").trigger(\"select:user\", this.ui.users.val());\n\t}\n});\n\nvar UserAttendance = Backbone.Marionette.View.extend({\n\tclassName: \"user-attendance\",\n\n\ttemplate: require(\"../../templates/attendance/userReport.nunj\").userAttendance,\n\n\tregions: {\n\t\tattendanceCalendar: \".attendance-calendar-region\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.attendanceCalendar = new CalBack({\n\t\t\tmarkedDates: this.computeUserTruantDays(),\n\t\t\tdefaultDate: moment(),\n\t\t\tfirstDayOfWeek: CALENDAR_FIRST_DAY_OF_WEEK\n\t\t});\n\t\tthis.showChildView(\"attendanceCalendar\", this.attendanceCalendar);\n\t},\n\n\tcomputeUserTruantDays: function computeUserTruantDays() {\n\t\treturn _.compact(_.map(this.options.userAttendanceRecords.models, function (rec) {\n\t\t\treturn rec.get(\"present\") === AttendanceCommon.ATTENDANCE_STATUS_PRESENT ? null : rec.get(\"created\");\n\t\t}));\n\t}\n});\n\nvar UserStatistics = Backbone.Marionette.View.extend({\n\tclassName: \"user-statistics\",\n\n\ttemplate: require(\"../../templates/attendance/userReport.nunj\").userStatistics,\n\n\tui: {\n\t\tattendanceChart: \".attendance-chart\",\n\t\tdaysAbsent: \".days-absent\",\n\t\tdaysPresent: \".days-present\",\n\t\tdaysLate: \".days-late\",\n\t\tproportionAbsent: \".proportion-absent\",\n\t\tproportionPresent: \".proportion-present\",\n\t\tproportionLate: \".proportion-late\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\t},\n\n\tonRender: function onRender() {\n\t\tvar userAttendance = this.computeUserAttendance();\n\t\tvar proportionAbsent = userAttendance.absent / userAttendance.total * 100.0;\n\t\tvar proportionPresent = userAttendance.present / userAttendance.total * 100.0;\n\t\tvar proportionLate = userAttendance.late / userAttendance.total * 100.0;\n\n\t\tthis.ui.daysAbsent.text(userAttendance.absent + \" day\" + (userAttendance.absent === 1 ? \"\" : \"s\"));\n\t\tthis.ui.proportionAbsent.text(\"(\" + Math.round(proportionAbsent, 2) + \"%)\");\n\t\tthis.ui.daysPresent.text(userAttendance.present + \" day\" + (userAttendance.present === 1 ? \"\" : \"s\"));\n\t\tthis.ui.proportionPresent.text(\"(\" + Math.round(proportionPresent, 2) + \"%)\");\n\t\tthis.ui.daysLate.text(userAttendance.late + \" day\" + (userAttendance.late === 1 ? \"\" : \"s\"));\n\t\tthis.ui.proportionLate.text(\"(\" + Math.round(proportionLate, 2) + \"%)\");\n\n\t\tChart.defaults.global.maintainAspectRatio = true;\n\n\t\tthis.attendanceChart = new Chart(this.ui.attendanceChart.get(0).getContext(\"2d\"), {\n\t\t\ttype: \"doughnut\",\n\t\t\tdata: {\n\t\t\t\tlabels: [\"Absent\", \"Present\", \"Late\"],\n\t\t\t\tdatasets: [{\n\t\t\t\t\tdata: [proportionAbsent, proportionPresent, proportionLate],\n\t\t\t\t\tbackgroundColor: [\"#5f9ad2\", // Absent\n\t\t\t\t\t\"#BCE1F7\", // Present\n\t\t\t\t\t\"#3274b2\"],\n\t\t\t\t\thoverBackgroundColor: [\"#5f9ad2\", // Absent\n\t\t\t\t\t\"#BCE1F7\", // Present\n\t\t\t\t\t\"#3274b2\"]\n\t\t\t\t}]\n\t\t\t},\n\t\t\toptions: {\n\t\t\t\telements: {\n\t\t\t\t\tarc: {\n\t\t\t\t\t\tborderWidth: 0\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tlegend: {\n\t\t\t\t\tdisplay: false\n\t\t\t\t},\n\t\t\t\ttooltips: {\n\t\t\t\t\tenabled: false\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tcomputeUserAttendance: function computeUserAttendance() {\n\t\treturn _.reduce(this.options.userAttendanceRecords.models, function (acc, a) {\n\t\t\tswitch (a.get(\"present\")) {\n\t\t\t\tcase AttendanceCommon.ATTENDANCE_STATUS_ABSENT:\n\t\t\t\t\tacc.absent++;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase AttendanceCommon.ATTENDANCE_STATUS_PRESENT:\n\t\t\t\t\tacc.present++;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase AttendanceCommon.ATTENDANCE_STATUS_LATE:\n\t\t\t\t\tacc.late++;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\"Invalid attendance status detected in computeUserAttendance.\");\n\t\t\t}\n\n\t\t\tacc.total++;\n\n\t\t\treturn acc;\n\t\t}, {\n\t\t\tabsent: 0,\n\t\t\tpresent: 0,\n\t\t\tlate: 0,\n\t\t\ttotal: 0\n\t\t});\n\t}\n});\n\nvar ReportLayout = Backbone.Marionette.View.extend({\n\tclassName: \"user-attendance-report-layout\",\n\n\ttemplate: require(\"../../templates/attendance/userReport.nunj\").reportLayout,\n\n\tregions: {\n\t\tuserAttendance: \".user-attendance-region\",\n\t\tuserSelector: \".user-selector-region\",\n\t\tuserStatistics: \".user-statistics-region\"\n\t},\n\n\tui: {\n\t\tuserAttendancePanel: \".calendar-panel\",\n\t\tuserStatisticsPanel: \".statistics-panel\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.userSelector = new UserSelector({\n\t\t\tattendanceRecordCollection: this.options.attendanceRecordCollection\n\t\t});\n\t\tthis.showChildView(\"userSelector\", this.userSelector);\n\n\t\tthis.listenTo(Backbone.Radio.channel(\"userAttendanceReport\"), \"select:user\", this.onUserChanged.bind(this));\n\n\t\t// Notify listeners that the user query view has been shown\n\t\tBackbone.Radio.channel(\"userAttendanceReport\").trigger(\"query:user:show\");\n\t},\n\n\tonUserChanged: function onUserChanged(userUUID) {\n\t\t// Extract the attendance records that belong to the selected user\n\t\tvar userAttendanceRecords = new Backbone.Collection(_.filter(this.options.attendanceRecordCollection.models, function (a) {\n\t\t\treturn a.get(\"uuid\") === userUUID;\n\t\t}));\n\n\t\tthis.ui.userAttendancePanel.removeClass(\"hide\");\n\t\tthis.ui.userStatisticsPanel.removeClass(\"hide\");\n\n\t\tthis.showChildView(\"userStatistics\", new UserStatistics({ userAttendanceRecords: userAttendanceRecords }));\n\t\tthis.showChildView(\"userAttendance\", new UserAttendance({ userAttendanceRecords: userAttendanceRecords }));\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(Backbone.Radio.channel(\"userAttendanceReport\"));\n\t}\n});\n\nvar Console = Backbone.Marionette.View.extend({\n\tclassName: \"fixed-content user-attendance-report\",\n\n\ttemplate: require(\"../../templates/attendance/userReport.nunj\").console,\n\n\tregions: {\n\t\tbody: \".body-region\",\n\t\theader: \".header-region\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.attendanceRecordCollection = new Backbone.Collection();\n\t},\n\n\tisAdminUser: function isAdminUser() {\n\t\treturn rester.hasAccess(rester.p.attendance.all, radio.request(App.Events.Requests.CurrentUser));\n\t},\n\n\tonRender: function () {\n\t\tvar _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee() {\n\t\t\tvar _this = this;\n\n\t\t\treturn _regenerator2.default.wrap(function _callee$(_context) {\n\t\t\t\twhile (1) {\n\t\t\t\t\tswitch (_context.prev = _context.next) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tthis.showLoadingStatus();\n\n\t\t\t\t\t\t\t_context.next = 3;\n\t\t\t\t\t\t\treturn Backbone.Radio.channel(\"attendanceRegister\").request(\"group:fetch:current\");\n\n\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\tthis.groupModel = _context.sent;\n\t\t\t\t\t\t\t_context.next = 6;\n\t\t\t\t\t\t\treturn Backbone.Radio.channel(\"attendanceRegister\").request(\"user:fetch:current\");\n\n\t\t\t\t\t\tcase 6:\n\t\t\t\t\t\t\tthis.userModel = _context.sent;\n\n\n\t\t\t\t\t\t\tthis.attendanceRecordCollection.fetch({\n\t\t\t\t\t\t\t\turl: settings.urlRoot + \"/api/1.0/attendance/records/byGroup/\" + encodeURIComponent(this.groupModel.get(\"code\")),\n\t\t\t\t\t\t\t\tdata: { owner: this.userModel.get(\"user_id\") },\n\n\t\t\t\t\t\t\t\treset: true,\n\n\t\t\t\t\t\t\t\tsuccess: function success() {\n\t\t\t\t\t\t\t\t\t_this.showReport();\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\terror: function error(collection, response) {\n\t\t\t\t\t\t\t\t\t_this.showError(response);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\tcase 8:\n\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\treturn _context.stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, _callee, this);\n\t\t}));\n\n\t\tfunction onRender() {\n\t\t\treturn _ref.apply(this, arguments);\n\t\t}\n\n\t\treturn onRender;\n\t}(),\n\n\tshowError: function showError(error) {\n\t\tthis.showChildView(\"body\", new ErrorView(error));\n\t},\n\n\tshowLoadingStatus: function showLoadingStatus() {\n\t\tthis.showChildView(\"body\", new StatusView());\n\t},\n\n\tshowReport: function showReport() {\n\t\tthis.showChildView(\"body\", new ReportLayout({ attendanceRecordCollection: this.attendanceRecordCollection }));\n\t}\n});\n\nmodule.exports = {\n\tBlank: Blank,\n\tConsole: Console\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInVzZXJSZXBvcnQuanMiXSwibmFtZXMiOlsiXyIsInJlcXVpcmUiLCJCYWNrYm9uZSIsIkNoYXJ0IiwibW9tZW50IiwiUHJvbWlzZSIsInJlc3RlciIsIkFwcCIsIkF0dGVuZGFuY2VDb21tb24iLCJyYWRpbyIsIlJhZGlvIiwiY2hhbm5lbCIsInNldHRpbmdzIiwiQ2FsQmFjayIsIkVycm9yVmlldyIsIlN0YXR1c1ZpZXciLCJDQUxFTkRBUl9GSVJTVF9EQVlfT0ZfV0VFSyIsIkJsYW5rIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJleHRlbmQiLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsImJsYW5rIiwidGVtcGxhdGVDb250ZXh0IiwiaXNBZG1pblVzZXIiLCJoYXNBY2Nlc3MiLCJwIiwiYXR0ZW5kYW5jZSIsImFsbCIsInJlcXVlc3QiLCJFdmVudHMiLCJSZXF1ZXN0cyIsIkN1cnJlbnRVc2VyIiwiVXNlclNlbGVjdG9yIiwidXNlclNlbGVjdG9yIiwidWkiLCJ1c2VycyIsImV2ZW50cyIsImluaXRpYWxpemUiLCJvcHRpb25zIiwib25SZW5kZXIiLCJjaG9zZW4iLCJ3aWR0aCIsInVuaXFCeSIsImF0dGVuZGFuY2VSZWNvcmRDb2xsZWN0aW9uIiwibW9kZWxzIiwiYSIsImdldCIsIm9wdGlvbkxpc3QiLCJyZWR1Y2UiLCJhY2N1bXVsYXRvciIsInB1c2giLCJyZXBsYWNlIiwieCIsImNoYXJDb2RlQXQiLCJodG1sIiwiam9pbiIsInRyaWdnZXIiLCJvblVzZXJDaGFuZ2VkIiwidmFsIiwiVXNlckF0dGVuZGFuY2UiLCJ1c2VyQXR0ZW5kYW5jZSIsInJlZ2lvbnMiLCJhdHRlbmRhbmNlQ2FsZW5kYXIiLCJtYXJrZWREYXRlcyIsImNvbXB1dGVVc2VyVHJ1YW50RGF5cyIsImRlZmF1bHREYXRlIiwiZmlyc3REYXlPZldlZWsiLCJzaG93Q2hpbGRWaWV3IiwiY29tcGFjdCIsIm1hcCIsInVzZXJBdHRlbmRhbmNlUmVjb3JkcyIsInJlYyIsIkFUVEVOREFOQ0VfU1RBVFVTX1BSRVNFTlQiLCJVc2VyU3RhdGlzdGljcyIsInVzZXJTdGF0aXN0aWNzIiwiYXR0ZW5kYW5jZUNoYXJ0IiwiZGF5c0Fic2VudCIsImRheXNQcmVzZW50IiwiZGF5c0xhdGUiLCJwcm9wb3J0aW9uQWJzZW50IiwicHJvcG9ydGlvblByZXNlbnQiLCJwcm9wb3J0aW9uTGF0ZSIsImNvbXB1dGVVc2VyQXR0ZW5kYW5jZSIsImFic2VudCIsInRvdGFsIiwicHJlc2VudCIsImxhdGUiLCJ0ZXh0IiwiTWF0aCIsInJvdW5kIiwiZGVmYXVsdHMiLCJnbG9iYWwiLCJtYWludGFpbkFzcGVjdFJhdGlvIiwiZ2V0Q29udGV4dCIsInR5cGUiLCJkYXRhIiwibGFiZWxzIiwiZGF0YXNldHMiLCJiYWNrZ3JvdW5kQ29sb3IiLCJob3ZlckJhY2tncm91bmRDb2xvciIsImVsZW1lbnRzIiwiYXJjIiwiYm9yZGVyV2lkdGgiLCJsZWdlbmQiLCJkaXNwbGF5IiwidG9vbHRpcHMiLCJlbmFibGVkIiwiYWNjIiwiQVRURU5EQU5DRV9TVEFUVVNfQUJTRU5UIiwiQVRURU5EQU5DRV9TVEFUVVNfTEFURSIsIkVycm9yIiwiUmVwb3J0TGF5b3V0IiwicmVwb3J0TGF5b3V0IiwidXNlckF0dGVuZGFuY2VQYW5lbCIsInVzZXJTdGF0aXN0aWNzUGFuZWwiLCJsaXN0ZW5UbyIsImJpbmQiLCJ1c2VyVVVJRCIsIkNvbGxlY3Rpb24iLCJmaWx0ZXIiLCJyZW1vdmVDbGFzcyIsIm9uQmVmb3JlRGVzdHJveSIsInN0b3BMaXN0ZW5pbmciLCJDb25zb2xlIiwiY29uc29sZSIsImJvZHkiLCJoZWFkZXIiLCJzaG93TG9hZGluZ1N0YXR1cyIsImdyb3VwTW9kZWwiLCJ1c2VyTW9kZWwiLCJmZXRjaCIsInVybCIsInVybFJvb3QiLCJlbmNvZGVVUklDb21wb25lbnQiLCJvd25lciIsInJlc2V0Iiwic3VjY2VzcyIsInNob3dSZXBvcnQiLCJlcnJvciIsImNvbGxlY3Rpb24iLCJyZXNwb25zZSIsInNob3dFcnJvciIsIm1vZHVsZSIs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QzdCLE9BQUs1RCxhQUFMLENBQW1CLE1BQW5CLEVBQTJCLElBQUl0RCxVQUFKLEVBQTNCO0FBQ0EsRUE5QzhDOztBQWdEL0M0SCxhQUFZLHNCQUFXO0FBQ3RCLE9BQUt0RSxhQUFMLENBQW1CLE1BQW5CLEVBQTJCLElBQUk0QyxZQUFKLENBQWlCLEVBQUVwRSw0QkFBNEIsS0FBS0EsMEJBQW5DLEVBQWpCLENBQTNCO0FBQ0E7QUFsRDhDLENBQWhDLENBQWhCOztBQXFEQW1HLE9BQU9DLE9BQVAsR0FBaUI7QUFDaEJoSSxRQUFPQSxLQURTO0FBRWhCNEcsVUFBU0E7QUFGTyxDQUFqQiIsImZpbGUiOiJ1c2VyUmVwb3J0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgQ2hhcnQgPSByZXF1aXJlKFwiY2hhcnQuanNcIik7XG5jb25zdCBtb21lbnQgPSByZXF1aXJlKFwibW9tZW50XCIpO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5jb25zdCBQcm9taXNlID0gcmVxdWlyZShcImJsdWViaXJkXCIpOyAvLyBJRTExXG5jb25zdCByZXN0ZXIgPSByZXF1aXJlKFwicmVzdGVyXCIpO1xuXG5jb25zdCBBcHAgPSByZXF1aXJlKFwiLi4vLi4vLi4vaW5kZXhcIik7XG5jb25zdCBBdHRlbmRhbmNlQ29tbW9uID0gcmVxdWlyZShcImF0dGVuZGFuY2VDb21tb25cIik7XG5jb25zdCByYWRpbyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJnbG9iYWxcIik7XG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IENhbEJhY2sgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL2NhbEJhY2tcIik7XG5jb25zdCBFcnJvclZpZXcgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL2Vycm9yVmlld1wiKTtcbmNvbnN0IFN0YXR1c1ZpZXcgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL3N0YXR1c1ZpZXdcIik7XG5cbmNvbnN0IENBTEVOREFSX0ZJUlNUX0RBWV9PRl9XRUVLID0gXCJTdW5kYXlcIjtcblxuY29uc3QgQmxhbmsgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInVzZXItYXR0ZW5kYW5jZS1yZXBvcnQtYmxhbmtcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9hdHRlbmRhbmNlL3VzZXJSZXBvcnQubnVualwiKS5ibGFuayxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRpc0FkbWluVXNlcjogdGhpcy5pc0FkbWluVXNlcigpLFxuXHRcdH07XG5cdH0sXG5cblx0aXNBZG1pblVzZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiByZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmF0dGVuZGFuY2UuYWxsLCByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpKTtcblx0fSxcbn0pO1xuXG5jb25zdCBVc2VyU2VsZWN0b3IgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInVzZXItc2VsZWN0b3JcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9hdHRlbmRhbmNlL3VzZXJSZXBvcnQubnVualwiKS51c2VyU2VsZWN0b3IsXG5cblx0dWk6IHtcblx0XHR1c2VyczogXCJzZWxlY3RbbmFtZT11c2Vyc11cIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNoYW5nZSBAdWkudXNlcnNcIjogXCJvblVzZXJDaGFuZ2VkXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkudXNlcnMuY2hvc2VuKHtcblx0XHRcdHdpZHRoOiBcIjEwMCVcIixcblx0XHR9KTtcblxuXHRcdGNvbnN0IHVzZXJzID0gXy51bmlxQnkodGhpcy5vcHRpb25zLmF0dGVuZGFuY2VSZWNvcmRDb2xsZWN0aW9uLm1vZGVscywgYSA9PiBhLmdldChcInV1aWRcIikpO1xuXG5cdFx0Y29uc3Qgb3B0aW9uTGlzdCA9IF8ucmVkdWNlKHVzZXJzLCAoYWNjdW11bGF0b3IsIGEpID0+IHtcblx0XHRcdGFjY3VtdWxhdG9yLnB1c2goXCI8b3B0aW9uIHZhbHVlPVxcXCJcIiArIGEuZ2V0KFwidXVpZFwiKSArIFwiXFxcIj5cIiArXG5cdFx0XHRcdGEuZ2V0KFwic3VybmFtZVwiKS5yZXBsYWNlKC9bXFwmXFw8XFw+XFwnXFxcIl0vZywgeCA9PiBcIiYjXCIgKyB4LmNoYXJDb2RlQXQoMCkgKyBcIjtcIikgKyBcIiwgXCIgK1xuXHRcdFx0XHRhLmdldChcImZpcnN0bmFtZVwiKS5yZXBsYWNlKC9bXFwmXFw8XFw+XFwnXFxcIl0vZywgeCA9PiBcIiYjXCIgKyB4LmNoYXJDb2RlQXQoMCkgKyBcIjtcIikgKyBcIiAoXCIgK1xuXHRcdFx0XHRhLmdldChcInVzZXJuYW1lXCIpLnJlcGxhY2UoL1tcXCZcXDxcXD5cXCdcXFwiXS9nLCB4ID0+IFwiJiNcIiArIHguY2hhckNvZGVBdCgwKSArIFwiO1wiKSArIFwiKVwiKTtcblx0XHRcdHJldHVybiBhY2N1bXVsYXRvcjtcblx0XHR9LCBbXCI8b3B0aW9uIHZhbHVlPScnPjwvb3B0aW9uPlwiXSk7XG5cblx0XHR0aGlzLnVpLnVzZXJzLmh0bWwob3B0aW9uTGlzdC5qb2luKFwiXCIpKS50cmlnZ2VyKFwiY2hvc2VuOnVwZGF0ZWRcIik7XG5cdH0sXG5cblx0b25Vc2VyQ2hhbmdlZDogZnVuY3Rpb24oKSB7XG5cdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcInVzZXJBdHRlbmRhbmNlUmVwb3J0XCIpLnRyaWdnZXIoXCJzZWxlY3Q6dXNlclwiLCB0aGlzLnVpLnVzZXJzLnZhbCgpKTtcblx0fSxcbn0pO1xuXG5jb25zdCBVc2VyQXR0ZW5kYW5jZSA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwidXNlci1hdHRlbmRhbmNlXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvYXR0ZW5kYW5jZS91c2VyUmVwb3J0Lm51bmpcIikudXNlckF0dGVuZGFuY2UsXG5cblx0cmVnaW9uczoge1xuXHRcdGF0dGVuZGFuY2VDYWxlbmRhcjogXCIuYXR0ZW5kYW5jZS1jYWxlbmRhci1yZWdpb25cIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucztcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5hdHRlbmRhbmNlQ2FsZW5kYXIgPSBuZXcgQ2FsQmFjayh7XG5cdFx0XHRtYXJrZWREYXRlczogdGhpcy5jb21wdXRlVXNlclRydWFudERheXMoKSxcblx0XHRcdGRlZmF1bHREYXRlOiBtb21lbnQoKSxcblx0XHRcdGZpcnN0RGF5T2ZXZWVrOiBDQUxFTkRBUl9GSVJTVF9EQVlfT0ZfV0VFSyxcblx0XHR9KTtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJhdHRlbmRhbmNlQ2FsZW5kYXJcIiwgdGhpcy5hdHRlbmRhbmNlQ2FsZW5kYXIpO1xuXHR9LFxuXG5cdGNvbXB1dGVVc2VyVHJ1YW50RGF5czogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIF8uY29tcGFjdChfLm1hcCh0aGlzLm9wdGlvbnMudXNlckF0dGVuZGFuY2VSZWNvcmRzLm1vZGVscywgcmVjID0+XG5cdFx0XHQocmVjLmdldChcInByZXNlbnRcIikgPT09IEF0dGVuZGFuY2VDb21tb24uQVRURU5EQU5DRV9TVEFUVVNfUFJFU0VOVCA/IG51bGwgOiByZWMuZ2V0KFwiY3JlYXRlZFwiKSkpKTtcblx0fSxcbn0pO1xuXG5jb25zdCBVc2VyU3RhdGlzdGljcyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwidXNlci1zdGF0aXN0aWNzXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvYXR0ZW5kYW5jZS91c2VyUmVwb3J0Lm51bmpcIikudXNlclN0YXRpc3RpY3MsXG5cblx0dWk6IHtcblx0XHRhdHRlbmRhbmNlQ2hhcnQ6IFwiLmF0dGVuZGFuY2UtY2hhcnRcIixcblx0XHRkYXlzQWJzZW50OiBcIi5kYXlzLWFic2VudFwiLFxuXHRcdGRheXNQcmVzZW50OiBcIi5kYXlzLXByZXNlbnRcIixcblx0XHRkYXlzTGF0ZTogXCIuZGF5cy1sYXRlXCIsXG5cdFx0cHJvcG9ydGlvbkFic2VudDogXCIucHJvcG9ydGlvbi1hYnNlbnRcIixcblx0XHRwcm9wb3J0aW9uUHJlc2VudDogXCIucHJvcG9ydGlvbi1wcmVzZW50XCIsXG5cdFx0cHJvcG9ydGlvbkxhdGU6IFwiLnByb3BvcnRpb24tbGF0ZVwiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCB1c2VyQXR0ZW5kYW5jZSA9IHRoaXMuY29tcHV0ZVVzZXJBdHRlbmRhbmNlKCk7XG5cdFx0Y29uc3QgcHJvcG9ydGlvbkFic2VudCA9IHVzZXJBdHRlbmRhbmNlLmFic2VudCAvIHVzZXJBdHRlbmRhbmNlLnRvdGFsICogMTAwLjA7XG5cdFx0Y29uc3QgcHJvcG9ydGlvblByZXNlbnQgPSB1c2VyQXR0ZW5kYW5jZS5wcmVzZW50IC8gdXNlckF0dGVuZGFuY2UudG90YWwgKiAxMDAuMDtcblx0XHRjb25zdCBwcm9wb3J0aW9uTGF0ZSA9IHVzZXJBdHRlbmRhbmNlLmxhdGUgLyB1c2VyQXR0ZW5kYW5jZS50b3RhbCAqIDEwMC4wO1xuXG5cdFx0dGhpcy51aS5kYXlzQWJzZW50LnRleHQodXNlckF0dGVuZGFuY2UuYWJzZW50ICsgXCIgZGF5XCIgKyAodXNlckF0dGVuZGFuY2UuYWJzZW50ID09PSAxID8gXCJcIiA6IFwic1wiKSk7XG5cdFx0dGhpcy51aS5wcm9wb3J0aW9uQWJzZW50LnRleHQoXCIoXCIgKyBNYXRoLnJvdW5kKHByb3BvcnRpb25BYnNlbnQsIDIpICsgXCIlKVwiKTtcblx0XHR0aGlzLnVpLmRheXNQcmVzZW50LnRleHQodXNlckF0dGVuZGFuY2UucHJlc2VudCArIFwiIGRheVwiICsgKHVzZXJBdHRlbmRhbmNlLnByZXNlbnQgPT09IDEgPyBcIlwiIDogXCJzXCIpKTtcblx0XHR0aGlzLnVpLnByb3BvcnRpb25QcmVzZW50LnRleHQoXCIoXCIgKyBNYXRoLnJvdW5kKHByb3BvcnRpb25QcmVzZW50LCAyKSArIFwiJSlcIik7XG5cdFx0dGhpcy51aS5kYXlzTGF0ZS50ZXh0KHVzZXJBdHRlbmRhbmNlLmxhdGUgKyBcIiBkYXlcIiArICh1c2VyQXR0ZW5kYW5jZS5sYXRlID09PSAxID8gXCJcIiA6IFwic1wiKSk7XG5cdFx0dGhpcy51aS5wcm9wb3J0aW9uTGF0ZS50ZXh0KFwiKFwiICsgTWF0aC5yb3VuZChwcm9wb3J0aW9uTGF0ZSwgMikgKyBcIiUpXCIpO1xuXG5cdFx0Q2hhcnQuZGVmYXVsdHMuZ2xvYmFsLm1haW50YWluQXNwZWN0UmF0aW8gPSB0cnVlO1xuXG5cdFx0dGhpcy5hdHRlbmRhbmNlQ2hhcnQgPSBuZXcgQ2hhcnQodGhpcy51aS5hdHRlbmRhbmNlQ2hhcnQuZ2V0KDApLmdldENvbnRleHQoXCIyZFwiKSwge1xuXHRcdFx0dHlwZTogXCJkb3VnaG51dFwiLFxuXHRcdFx0ZGF0YToge1xuXHRcdFx0XHRsYWJlbHM6IFtcblx0XHRcdFx0XHRcIkFic2VudFwiLFxuXHRcdFx0XHRcdFwiUHJlc2VudFwiLFxuXHRcdFx0XHRcdFwiTGF0ZVwiLFxuXHRcdFx0XHRdLFxuXHRcdFx0XHRkYXRhc2V0czogW3tcblx0XHRcdFx0XHRkYXRhOiBbcHJvcG9ydGlvbkFic2VudCwgcHJvcG9ydGlvblByZXNlbnQsIHByb3BvcnRpb25MYXRlXSxcblx0XHRcdFx0XHRiYWNrZ3JvdW5kQ29sb3I6IFtcblx0XHRcdFx0XHRcdFwiIzVmOWFkMlwiLCAvLyBBYnNlbnRcblx0XHRcdFx0XHRcdFwiI0JDRTFGN1wiLCAvLyBQcmVzZW50XG5cdFx0XHRcdFx0XHRcIiMzMjc0YjJcIiwgLy8gTGF0ZVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0aG92ZXJCYWNrZ3JvdW5kQ29sb3I6IFtcblx0XHRcdFx0XHRcdFwiIzVmOWFkMlwiLCAvLyBBYnNlbnRcblx0XHRcdFx0XHRcdFwiI0JDRTFGN1wiLCAvLyBQcmVzZW50XG5cdFx0XHRcdFx0XHRcIiMzMjc0YjJcIiwgLy8gTGF0ZVxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdH1dLFxuXHRcdFx0fSxcblx0XHRcdG9wdGlvbnM6IHtcblx0XHRcdFx0ZWxlbWVudHM6IHtcblx0XHRcdFx0XHRhcmM6IHtcblx0XHRcdFx0XHRcdGJvcmRlcldpZHRoOiAwLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGxlZ2VuZDoge1xuXHRcdFx0XHRcdGRpc3BsYXk6IGZhbHNlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR0b29sdGlwczoge1xuXHRcdFx0XHRcdGVuYWJsZWQ6IGZhbHNlLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHR9KTtcblx0fSxcblxuXHRjb21wdXRlVXNlckF0dGVuZGFuY2U6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBfLnJlZHVjZSh0aGlzLm9wdGlvbnMudXNlckF0dGVuZGFuY2VSZWNvcmRzLm1vZGVscywgKGFjYywgYSkgPT4ge1xuXHRcdFx0c3dpdGNoIChhLmdldChcInByZXNlbnRcIikpIHtcblx0XHRcdFx0Y2FzZSBBdHRlbmRhbmNlQ29tbW9uLkFUVEVOREFOQ0VfU1RBVFVTX0FCU0VOVDpcblx0XHRcdFx0XHRhY2MuYWJzZW50Kys7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBBdHRlbmRhbmNlQ29tbW9uLkFUVEVOREFOQ0VfU1RBVFVTX1BSRVNFTlQ6XG5cdFx0XHRcdFx0YWNjLnByZXNlbnQrKztcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIEF0dGVuZGFuY2VDb21tb24uQVRURU5EQU5DRV9TVEFUVVNfTEFURTpcblx0XHRcdFx0XHRhY2MubGF0ZSsrO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBhdHRlbmRhbmNlIHN0YXR1cyBkZXRlY3RlZCBpbiBjb21wdXRlVXNlckF0dGVuZGFuY2UuXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRhY2MudG90YWwrKztcblxuXHRcdFx0cmV0dXJuIGFjYztcblx0XHR9LCB7XG5cdFx0XHRhYnNlbnQ6IDAsXG5cdFx0XHRwcmVzZW50OiAwLFxuXHRcdFx0bGF0ZTogMCxcblx0XHRcdHRvdGFsOiAwLFxuXHRcdH0pO1xuXHR9LFxufSk7XG5cbmNvbnN0IFJlcG9ydExheW91dCA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwidXNlci1hdHRlbmRhbmNlLXJlcG9ydC1sYXlvdXRcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9hdHRlbmRhbmNlL3VzZXJSZXBvcnQubnVualwiKS5yZXBvcnRMYXlvdXQsXG5cblx0cmVnaW9uczoge1xuXHRcdHVzZXJBdHRlbmRhbmNlOiBcIi51c2VyLWF0dGVuZGFuY2UtcmVnaW9uXCIsXG5cdFx0dXNlclNlbGVjdG9yOiBcIi51c2VyLXNlbGVjdG9yLXJlZ2lvblwiLFxuXHRcdHVzZXJTdGF0aXN0aWNzOiBcIi51c2VyLXN0YXRpc3RpY3MtcmVnaW9uXCIsXG5cdH0sXG5cblx0dWk6IHtcblx0XHR1c2VyQXR0ZW5kYW5jZVBhbmVsOiBcIi5jYWxlbmRhci1wYW5lbFwiLFxuXHRcdHVzZXJTdGF0aXN0aWNzUGFuZWw6IFwiLnN0YXRpc3RpY3MtcGFuZWxcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucztcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51c2VyU2VsZWN0b3IgPSBuZXcgVXNlclNlbGVjdG9yKHtcblx0XHRcdGF0dGVuZGFuY2VSZWNvcmRDb2xsZWN0aW9uOiB0aGlzLm9wdGlvbnMuYXR0ZW5kYW5jZVJlY29yZENvbGxlY3Rpb24sXG5cdFx0fSk7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwidXNlclNlbGVjdG9yXCIsIHRoaXMudXNlclNlbGVjdG9yKTtcblxuXHRcdHRoaXMubGlzdGVuVG8oQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcInVzZXJBdHRlbmRhbmNlUmVwb3J0XCIpLCBcInNlbGVjdDp1c2VyXCIsIHRoaXMub25Vc2VyQ2hhbmdlZC5iaW5kKHRoaXMpKTtcblxuXHRcdC8vIE5vdGlmeSBsaXN0ZW5lcnMgdGhhdCB0aGUgdXNlciBxdWVyeSB2aWV3IGhhcyBiZWVuIHNob3duXG5cdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbChcInVzZXJBdHRlbmRhbmNlUmVwb3J0XCIpLnRyaWdnZXIoXCJxdWVyeTp1c2VyOnNob3dcIik7XG5cdH0sXG5cblx0b25Vc2VyQ2hhbmdlZDogZnVuY3Rpb24odXNlclVVSUQpIHtcblx0XHQvLyBFeHRyYWN0IHRoZSBhdHRlbmRhbmNlIHJlY29yZHMgdGhhdCBiZWxvbmcgdG8gdGhlIHNlbGVjdGVkIHVzZXJcblx0XHRjb25zdCB1c2VyQXR0ZW5kYW5jZVJlY29yZHMgPSBuZXcgQmFja2JvbmUuQ29sbGVjdGlvbihcblx0XHRcdF8uZmlsdGVyKHRoaXMub3B0aW9ucy5hdHRlbmRhbmNlUmVjb3JkQ29sbGVjdGlvbi5tb2RlbHMsIGEgPT4gYS5nZXQoXCJ1dWlkXCIpID09PSB1c2VyVVVJRCkpO1xuXG5cdFx0dGhpcy51aS51c2VyQXR0ZW5kYW5jZVBhbmVsLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLnVzZXJTdGF0aXN0aWNzUGFuZWwucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwidXNlclN0YXRpc3RpY3NcIiwgbmV3IFVzZXJTdGF0aXN0aWNzKHsgdXNlckF0dGVuZGFuY2VSZWNvcmRzOiB1c2VyQXR0ZW5kYW5jZVJlY29yZHMgfSkpO1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcInVzZXJBdHRlbmRhbmNlXCIsIG5ldyBVc2VyQXR0ZW5kYW5jZSh7IHVzZXJBdHRlbmRhbmNlUmVjb3JkczogdXNlckF0dGVuZGFuY2VSZWNvcmRzIH0pKTtcblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc3RvcExpc3RlbmluZyhCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwidXNlckF0dGVuZGFuY2VSZXBvcnRcIikpO1xuXHR9LFxufSk7XG5cbmNvbnN0IENvbnNvbGUgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImZpeGVkLWNvbnRlbnQgdXNlci1hdHRlbmRhbmNlLXJlcG9ydFwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2F0dGVuZGFuY2UvdXNlclJlcG9ydC5udW5qXCIpLmNvbnNvbGUsXG5cblx0cmVnaW9uczoge1xuXHRcdGJvZHk6IFwiLmJvZHktcmVnaW9uXCIsXG5cdFx0aGVhZGVyOiBcIi5oZWFkZXItcmVnaW9uXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5hdHRlbmRhbmNlUmVjb3JkQ29sbGVjdGlvbiA9IG5ldyBCYWNrYm9uZS5Db2xsZWN0aW9uKCk7XG5cdH0sXG5cblx0aXNBZG1pblVzZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiByZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmF0dGVuZGFuY2UuYWxsLCByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpKTtcblx0fSxcblxuXHRvblJlbmRlcjogYXN5bmMgZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zaG93TG9hZGluZ1N0YXR1cygpO1xuXG5cdFx0dGhpcy5ncm91cE1vZGVsID0gYXdhaXQgQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImF0dGVuZGFuY2VSZWdpc3RlclwiKS5yZXF1ZXN0KFwiZ3JvdXA6ZmV0Y2g6Y3VycmVudFwiKTtcblx0XHR0aGlzLnVzZXJNb2RlbCA9IGF3YWl0IEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJhdHRlbmRhbmNlUmVnaXN0ZXJcIikucmVxdWVzdChcInVzZXI6ZmV0Y2g6Y3VycmVudFwiKTtcblxuXHRcdHRoaXMuYXR0ZW5kYW5jZVJlY29yZENvbGxlY3Rpb24uZmV0Y2goe1xuXHRcdFx0dXJsOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9hdHRlbmRhbmNlL3JlY29yZHMvYnlHcm91cC9cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLmdyb3VwTW9kZWwuZ2V0KFwiY29kZVwiKSksXG5cdFx0XHRkYXRhOiB7IG93bmVyOiB0aGlzLnVzZXJNb2RlbC5nZXQoXCJ1c2VyX2lkXCIpIH0sXG5cblx0XHRcdHJlc2V0OiB0cnVlLFxuXG5cdFx0XHRzdWNjZXNzOiAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuc2hvd1JlcG9ydCgpO1xuXHRcdFx0fSxcblxuXHRcdFx0ZXJyb3I6IChjb2xsZWN0aW9uLCByZXNwb25zZSkgPT4ge1xuXHRcdFx0XHR0aGlzLnNob3dFcnJvcihyZXNwb25zZSk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9LFxuXG5cdHNob3dFcnJvcjogZnVuY3Rpb24oZXJyb3IpIHtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJib2R5XCIsIG5ldyBFcnJvclZpZXcoZXJyb3IpKTtcblx0fSxcblxuXHRzaG93TG9hZGluZ1N0YXR1czogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiYm9keVwiLCBuZXcgU3RhdHVzVmlldygpKTtcblx0fSxcblxuXHRzaG93UmVwb3J0OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJib2R5XCIsIG5ldyBSZXBvcnRMYXlvdXQoeyBhdHRlbmRhbmNlUmVjb3JkQ29sbGVjdGlvbjogdGhpcy5hdHRlbmRhbmNlUmVjb3JkQ29sbGVjdGlvbiB9KSk7XG5cdH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdEJsYW5rOiBCbGFuayxcblx0Q29uc29sZTogQ29uc29sZSxcbn07XG4iXX0=",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\n\nvar App = require(\"../../index\");\nvar settings = require(\"app-settings\");\n\nvar ErrorView = require(\"../../lib/errorView\");\nvar EventModal = require(\"../../lib/eventModal\");\nvar EventModel = require(\"../../lib/eventModel\");\nvar FilterBack = require(\"../../lib/filterBack\");\nvar StatusView = require(\"../../lib/statusView\");\n\nvar Page = new Backbone.Marionette.Application();\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar EVENT_CACHE_GRANULARITY = {\n\tMONTH: \"month\",\n\tYEAR: \"year\"\n};\n\nPage.Events = {\n\tFiltersChanged: \"Page.Events.FiltersChanged\",\n\tGetEvents: \"Page.Events.GetEvents\",\n\tHideInfoBlock: \"Page.Events.HideInfoBlock\",\n\tUpdateFilter: \"Page.Events.UpdateFilter\"\n};\n\nvar Events = Backbone.Collection.extend({\n\tmodel: EventModel,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/acacia/calendar/events/\" + this.params.start + \"/\" + this.params.end;\n\t}\n});\n\nvar CalendarHeader = Backbone.Marionette.View.extend({\n\tclassName: \"calendar-header\",\n\n\ttemplate: require(\"../templates/calendar.nunj\").calendarHeader,\n\n\tregions: {\n\t\tfilter: \".calendar-filter-region\"\n\t},\n\n\tui: {\n\t\tbackButton: \"div#back\",\n\t\tforwardButton: \"div#forward\",\n\t\ttodayButton: \"div#today\",\n\t\ttitle: \"div.calendar-title > span\",\n\t\tmonthButton: \"div#month\",\n\t\tweekButton: \"div#week\",\n\t\tdayButton: \"div#day\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.backButton\": \"onBackButtonClick\",\n\t\t\"click @ui.forwardButton\": \"onForwardButtonClick\",\n\t\t\"click @ui.todayButton\": \"onTodayButtonClick\",\n\t\t\"click @ui.monthButton\": \"onMonthButtonClick\",\n\t\t\"click @ui.weekButton\": \"onWeekButtonClick\",\n\t\t\"click @ui.dayButton\": \"onDayButtonClick\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.eventBus = options.eventBus;\n\t\tthis.eventCollection = options.eventCollection;\n\n\t\tthis.listenTo(this.eventBus, \"calendar:updated\", this.onCalendarUpdated.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this = this;\n\n\t\tthis.filter = new FilterBack({\n\t\t\tdescriptors: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\tdebounce: 200,\n\t\t\t\tdefaultText: \"Search for an event...\",\n\t\t\t\tfilterFactory: function filterFactory(key) {\n\t\t\t\t\treturn function (model) {\n\t\t\t\t\t\tvar found = false;\n\n\t\t\t\t\t\tvar original = model.get(\"_original\");\n\n\t\t\t\t\t\tif (original) {\n\t\t\t\t\t\t\tfound = _.some([\"title\", \"desc\", \"location\"], function (a) {\n\t\t\t\t\t\t\t\tvar result = false;\n\n\t\t\t\t\t\t\t\tif (a) {\n\t\t\t\t\t\t\t\t\tvar t = original[a];\n\n\t\t\t\t\t\t\t\t\tif (t) {\n\t\t\t\t\t\t\t\t\t\tt = t.toString().toLowerCase();\n\t\t\t\t\t\t\t\t\t\tresult = _.includes(t, key.toLowerCase());\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn found;\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}]\n\t\t});\n\n\t\tthis.listenTo(this.filter, \"execute\", function (comparator) {\n\t\t\t_this.eventBus.trigger(\"filter:updated\", comparator);\n\t\t});\n\n\t\tthis.showChildView(\"filter\", this.filter);\n\t},\n\n\tonCalendarUpdated: function onCalendarUpdated(newDate) {\n\t\tthis.ui.title.text(newDate.format(\"MMMM YYYY\"));\n\t},\n\n\tonBackButtonClick: function onBackButtonClick() {\n\t\tthis.eventBus.trigger(\"calendar:previous\");\n\t},\n\n\tonForwardButtonClick: function onForwardButtonClick() {\n\t\tthis.eventBus.trigger(\"calendar:next\");\n\t},\n\n\tonTodayButtonClick: function onTodayButtonClick() {\n\t\tthis.eventBus.trigger(\"calendar:today\");\n\t},\n\n\tonMonthButtonClick: function onMonthButtonClick() {\n\t\tthis.eventBus.trigger(\"calendar:monthView\");\n\t},\n\n\tonWeekButtonClick: function onWeekButtonClick() {\n\t\tthis.eventBus.trigger(\"calendar:weekView\");\n\t},\n\n\tonDayButtonClick: function onDayButtonClick() {\n\t\tthis.eventBus.trigger(\"calendar:dayView\");\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(this.filter);\n\t\tthis.stopListening(this.eventBus);\n\t}\n});\n\nvar CalendarBody = Backbone.Marionette.View.extend({\n\tclassName: \"calendar-body\",\n\n\ttemplate: false,\n\n\tinitialize: function initialize(options) {\n\t\tthis.eventBus = options.eventBus;\n\n\t\tthis.listenTo(this.eventBus, \"calendar:previous\", this.onCalendarPrevious.bind(this));\n\t\tthis.listenTo(this.eventBus, \"calendar:next\", this.onCalendarNext.bind(this));\n\t\tthis.listenTo(this.eventBus, \"calendar:today\", this.onCalendarToday.bind(this));\n\t\tthis.listenTo(this.eventBus, \"calendar:monthView\", this.onCalendarMonthView.bind(this));\n\t\tthis.listenTo(this.eventBus, \"calendar:weekView\", this.onCalendarWeekView.bind(this));\n\t\tthis.listenTo(this.eventBus, \"calendar:dayView\", this.onCalendarDayView.bind(this));\n\t\tthis.listenTo(this.eventBus, \"calendar:eventsUpdated\", this.refreshCalendar.bind(this));\n\t},\n\n\tonDomRefresh: function onDomRefresh() {\n\t\tif (!this.$el || !this.$el.fullCalendar) return;\n\n\t\tthis.$el.fullCalendar({\n\t\t\theader: {\n\t\t\t\tleft: \"\",\n\t\t\t\tcenter: \"\",\n\t\t\t\tright: \"\"\n\t\t\t},\n\t\t\teventLimit: 4,\n\t\t\taspectRatio: 2.55,\n\t\t\tnextDayThreshold: \"00:01\",\n\n\t\t\teventSources: [{\n\t\t\t\tevents: this.fetchEvents.bind(this)\n\t\t\t}],\n\n\t\t\ttimezone: \"local\",\n\n\t\t\tdayClick: this.onDayClick.bind(this),\n\t\t\teventClick: this.onEventClick.bind(this)\n\t\t});\n\n\t\tthis.triggerCalendarUpdated();\n\t},\n\n\tfetchEvents: function fetchEvents(start, end, timezone, callback) {\n\t\tthis.eventBus.trigger(\"calendar:fetchEvents\", start, end, callback);\n\t},\n\n\ttriggerCalendarUpdated: function triggerCalendarUpdated() {\n\t\tthis.eventBus.trigger(\"calendar:updated\", this.$el.fullCalendar(\"getDate\"));\n\t},\n\n\tonCalendarPrevious: function onCalendarPrevious() {\n\t\tthis.$el.fullCalendar(\"prev\");\n\t\tthis.triggerCalendarUpdated();\n\t},\n\n\tonCalendarNext: function onCalendarNext() {\n\t\tthis.$el.fullCalendar(\"next\");\n\t\tthis.triggerCalendarUpdated();\n\t},\n\n\tonCalendarToday: function onCalendarToday() {\n\t\tthis.$el.fullCalendar(\"today\");\n\t\tthis.triggerCalendarUpdated();\n\t},\n\n\tonCalendarMonthView: function onCalendarMonthView() {\n\t\tthis.$el.fullCalendar(\"changeView\", \"month\");\n\t\tthis.triggerCalendarUpdated();\n\t},\n\n\tonCalendarWeekView: function onCalendarWeekView() {\n\t\tthis.$el.fullCalendar(\"changeView\", \"agendaWeek\");\n\t\tthis.triggerCalendarUpdated();\n\t},\n\n\tonCalendarDayView: function onCalendarDayView() {\n\t\tthis.$el.fullCalendar(\"changeView\", \"agendaDay\");\n\t\tthis.triggerCalendarUpdated();\n\t},\n\n\tonDayClick: function onDayClick(date) {\n\t\tthis.createEvent(date);\n\t},\n\n\tonEventClick: function onEventClick(calEvent) {\n\t\tthis.editEvent(new EventModel(calEvent._original));\n\t},\n\n\trefreshCalendar: function refreshCalendar() {\n\t\tif (this.$el.fullCalendar) this.$el.fullCalendar(\"refetchEvents\");\n\t},\n\n\tcreateEvent: function createEvent(startDate, model) {\n\t\tvar _this2 = this;\n\n\t\tvar eventModel = null;\n\n\t\tif (model) {\n\t\t\teventModel = model;\n\t\t} else {\n\t\t\teventModel = new EventModel({\n\t\t\t\tstart: startDate.local().unix(),\n\t\t\t\tend: startDate.local().unix()\n\t\t\t});\n\t\t}\n\n\t\tvar eventModal = new EventModal({ model: eventModel });\n\n\t\teventModal.show({\n\t\t\tcreate: function create(result) {\n\t\t\t\t_this2.eventBus.trigger(\"event:add\", result.model);\n\n\t\t\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\t\t\tcontent: \"New event \" + result.model.get(\"title\") + \" successfully created\"\n\t\t\t\t});\n\t\t\t},\n\t\t\tcreateAnother: function createAnother(result) {\n\t\t\t\t_this2.eventBus.trigger(\"event:add\", result.model);\n\t\t\t}\n\t\t});\n\t},\n\n\teditEvent: function editEvent(model) {\n\t\tvar _this3 = this;\n\n\t\tvar eventModal = new EventModal({ model: model });\n\n\t\teventModal.confirmDelete = _.constant(\"Warning! You are about to delete an event.\");\n\n\t\teventModal.show({\n\t\t\tupdate: function update(result) {\n\t\t\t\t_this3.eventBus.trigger(\"event:update\", result.model);\n\n\t\t\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\t\t\tcontent: \"Event \" + result.model.get(\"title\") + \" successfully updated\"\n\t\t\t\t});\n\t\t\t},\n\t\t\tdelete: function _delete(result) {\n\t\t\t\t_this3.eventBus.trigger(\"event:delete\", result.model);\n\n\t\t\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\t\t\tcontent: \"Event \" + result.model.get(\"title\") + \" successfully deleted\"\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(this.eventBus);\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"content calendar-layout\",\n\n\ttemplate: require(\"../templates/calendar.nunj\").layout,\n\n\tregions: {\n\t\tcalendarBody: \".calendar-body-region\",\n\t\tcalendarHeader: \".calendar-header-region\",\n\t\tstatus: \".status-region\"\n\t},\n\n\tui: {\n\t\tcalendarBodyRegion: \".calendar-body-region\",\n\t\tcalendarHeaderRegion: \".calendar-header-region\",\n\t\tstatusRegion: \".status-region\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.eventBus = new Backbone.Marionette.Object();\n\t\tthis.eventCacheGranularity = EVENT_CACHE_GRANULARITY.MONTH;\n\t\tthis.eventCollection = new Events([]);\n\t\tthis.filteredEventCollection = new Backbone.VirtualCollection(this.eventCollection);\n\t\tthis.invalidateCache = false;\n\n\t\tthis.listenTo(this.eventBus, \"calendar:fetchEvents\", this.fetchEvents.bind(this));\n\t\tthis.listenTo(this.eventBus, \"event:add\", this.addEvent.bind(this));\n\t\tthis.listenTo(this.eventBus, \"event:update\", this.updateEvent.bind(this));\n\t\tthis.listenTo(this.eventBus, \"event:delete\", this.deleteEvent.bind(this));\n\t\tthis.listenTo(this.eventBus, \"filter:updated\", this.onFilterUpdated.bind(this));\n\t},\n\n\tfetchEvents: function fetchEvents(start, end, callback) {\n\t\tvar fetchRequired = false;\n\n\t\tif (this.invalidateCache) {\n\t\t\tfetchRequired = true;\n\t\t\tthis.invalidateCache = false;\n\t\t} else {\n\t\t\tvar cacheStart = moment(start);\n\t\t\tvar cacheEnd = moment(end);\n\n\t\t\tcacheStart.startOf(this.eventCacheGranularity);\n\t\t\tcacheEnd.endOf(this.eventCacheGranularity);\n\t\t\tcacheEnd.add(1, \"days\");\n\n\t\t\tif (!this.eventCacheStart || !this.eventCacheStart.isSame(cacheStart)) {\n\t\t\t\tthis.eventCacheStart = cacheStart;\n\t\t\t\tfetchRequired = true;\n\t\t\t}\n\n\t\t\tif (!this.eventCacheEnd || !this.eventCacheEnd.isSame(cacheEnd)) {\n\t\t\t\tthis.eventCacheEnd = cacheEnd;\n\t\t\t\tfetchRequired = true;\n\t\t\t}\n\t\t}\n\n\t\tif (fetchRequired) {\n\t\t\tthis.showLoadingStatus();\n\n\t\t\tthis.eventCollection.params = {\n\t\t\t\tstart: this.eventCacheStart.unix(),\n\t\t\t\tend: this.eventCacheEnd.unix()\n\t\t\t};\n\n\t\t\tthis.eventCollection.fetch({\n\t\t\t\tsuccess: this.onFetchSuccess.bind(this, start, end, callback),\n\t\t\t\terror: this.onFetchError.bind(this),\n\t\t\t\treset: true\n\t\t\t});\n\t\t} else {\n\t\t\tthis.buildEventSource(start, end, callback);\n\t\t}\n\t},\n\n\tonFetchSuccess: function onFetchSuccess(start, end, callback) {\n\t\tthis.showCalendarBody();\n\n\t\tthis.buildEventSource(start, end, callback);\n\t},\n\n\tonFetchError: function onFetchError(model, response) {\n\t\tthis.renderError(response);\n\t},\n\n\tupdateEventFormat: function updateEventFormat(eventModel) {\n\t\teventModel.set(\"_original\", eventModel.toJSON());\n\n\t\teventModel.set(\"start\", moment.unix(eventModel.get(\"start\")).toISOString());\n\t\teventModel.set(\"end\", moment.unix(eventModel.get(\"end\")).toISOString());\n\n\t\treturn eventModel;\n\t},\n\n\taddEvent: function addEvent() {\n\t\t//this.eventCollection.add(this.updateEventFormat(eventModel));\n\n\t\tthis.invalidateCache = true;\n\t\tthis.eventBus.trigger(\"calendar:eventsUpdated\");\n\t},\n\n\tupdateEvent: function updateEvent() {\n\t\t//const oldModel = _.find(this.eventCollection.models, e => e.get(\"_id\") === eventModel.get(\"_id\"));\n\n\t\t//this.eventCollection.remove(oldModel);\n\t\t//this.eventCollection.add(this.updateEventFormat(eventModel));\n\n\t\tthis.invalidateCache = true;\n\t\tthis.eventBus.trigger(\"calendar:eventsUpdated\");\n\t},\n\n\tdeleteEvent: function deleteEvent(eventModel) {\n\t\tvar oldModel = _.find(this.eventCollection.models, function (e) {\n\t\t\treturn e.get(\"_id\") === eventModel.get(\"_id\");\n\t\t});\n\n\t\tthis.eventCollection.remove(oldModel);\n\n\t\tthis.invalidateCache = true;\n\t\tthis.eventBus.trigger(\"calendar:eventsUpdated\");\n\t},\n\n\tonFilterUpdated: function onFilterUpdated(comparator) {\n\t\tthis.filteredEventCollection.updateFilter(comparator);\n\t\tthis.eventBus.trigger(\"calendar:eventsUpdated\");\n\t},\n\n\tbuildEventSource: function buildEventSource(start, end, callback) {\n\t\tvar requestedEvents = _.filter(this.filteredEventCollection.models, function (event) {\n\t\t\tvar eventStart = moment(event.get(\"start\"));\n\t\t\tvar eventEnd = moment(event.get(\"end\"));\n\n\t\t\treturn eventStart.isSameOrAfter(start) && eventStart.isSameOrBefore(end) || eventEnd.isSameOrAfter(start) && eventEnd.isSameOrBefore(end);\n\t\t});\n\n\t\tcallback(_.invokeMap(requestedEvents, Backbone.Model.prototype.toJSON, { computed: true }));\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.showChildView(\"calendarHeader\", new CalendarHeader({\n\t\t\teventBus: this.eventBus,\n\t\t\teventCollection: this.eventCollection\n\t\t}));\n\n\t\tthis.showChildView(\"status\", new StatusView({\n\t\t\tmessage: \"Downloading events. This may take a while...\",\n\t\t\ttype: \"loading\"\n\t\t}));\n\n\t\tthis.showChildView(\"calendarBody\", new CalendarBody({\n\t\t\teventBus: this.eventBus,\n\t\t\teventCollection: this.eventCollection\n\t\t}));\n\t},\n\n\tshowLoadingStatus: function showLoadingStatus() {\n\t\tthis.ui.calendarBodyRegion.addClass(\"hide\");\n\t\tthis.ui.statusRegion.removeClass(\"hide\");\n\t},\n\n\tshowCalendarBody: function showCalendarBody() {\n\t\tthis.ui.statusRegion.addClass(\"hide\");\n\t\tthis.ui.calendarBodyRegion.removeClass(\"hide\");\n\t},\n\n\trenderError: function renderError(error) {\n\t\tthis.showChildView(\"status\", new ErrorView({ fetchError: error }));\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(this.eventBus);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNhbGVuZGFyLmpzIl0sIm5hbWVzIjpbIl8iLCJyZXF1aXJlIiwiQmFja2JvbmUiLCJtb21lbnQiLCJBcHAiLCJzZXR0aW5ncyIsIkVycm9yVmlldyIsIkV2ZW50TW9kYWwiLCJFdmVudE1vZGVsIiwiRmlsdGVyQmFjayIsIlN0YXR1c1ZpZXciLCJQYWdlIiwiTWFyaW9uZXR0ZSIsIkFwcGxpY2F0aW9uIiwicmFkaW8iLCJSYWRpbyIsImNoYW5uZWwiLCJFVkVOVF9DQUNIRV9HUkFOVUxBUklUWSIsIk1PTlRIIiwiWUVBUiIsIkV2ZW50cyIsIkZpbHRlcnNDaGFuZ2VkIiwiR2V0RXZlbnRzIiwiSGlkZUluZm9CbG9jayIsIlVwZGF0ZUZpbHRlciIsIkNvbGxlY3Rpb24iLCJleHRlbmQiLCJtb2RlbCIsInVybCIsInVybFJvb3QiLCJwYXJhbXMiLCJzdGFydCIsImVuZCIsIkNhbGVuZGFySGVhZGVyIiwiVmlldyIsImNsYXNzTmFtZSIsInRlbXBsYXRlIiwiY2FsZW5kYXJIZWFkZXIiLCJyZWdpb25zIiwiZmlsdGVyIiwidWkiLCJiYWNrQnV0dG9uIiwiZm9yd2FyZEJ1dHRvbiIsInRvZGF5QnV0dG9uIiwidGl0bGUiLCJtb250aEJ1dHRvbiIsIndlZWtCdXR0b24iLCJkYXlCdXR0b24iLCJldmVudHMiLCJpbml0aWFsaXplIiwib3B0aW9ucyIsImV2ZW50QnVzIiwiZXZlbnRDb2xsZWN0aW9uIiwibGlzdGVuVG8iLCJvbkNhbGVuZGFyVXBkYXRlZCIsImJpbmQiLCJvblJlbmRlciIsImRlc2NyaXB0b3JzIiwidHlwZSIsImRlYm91bmNlIiwiZGVmYXVsdFRleHQiLCJmaWx0ZXJGYWN0b3J5IiwiZm91bmQiLCJvcmlnaW5hbCIsImdldCIsInNvbWUiLCJyZXN1bHQiLCJhIiwidCIsInRvU3RyaW5nIiwidG9Mb3dlckNhc2UiLCJpbmNsdWRlcyIsImtleSIsInRyaWdnZXIiLCJjb21wYXJhdG9yIiwic2hvd0NoaWxkVmlldyIsIm5ld0RhdGUiLCJ0ZXh0IiwiZm9ybWF0Iiwib25CYWNrQnV0dG9uQ2xpY2siLCJvbkZvcndhcmRCdXR0b25DbGljayIsIm9uVG9kYXlCdXR0b25DbGljayIsIm9uTW9udGhCdXR0b25DbGljayIsIm9uV2Vla0J1dHRvbkNsaWNrIiwib25EYXlCdXR0b25DbGljayIsIm9uQmVmb3JlRGVzdHJveSIsInN0b3BMaXN0ZW5pbmciLCJDYWxlbmRhckJvZHkiLCJvbkNhbGVuZGFyUHJldmlvdXMiLCJvbkNhbGVuZGFyTmV4dCIsIm9uQ2FsZW5kYXJUb2RheSIsIm9uQ2FsZW5kYXJNb250aFZpZXciLCJvbkNhbGVuZGFyV2Vla1ZpZXciLCJvbkNhbGVuZGFyRGF5VmlldyIsInJlZnJlc2hDYWxlbmRhciIsIm9uRG9tUmVmcmVzaCIsIiRlbCIsImZ1bGxDYWxlbmRhciIsImhlYWRlciIsImxlZnQiLCJjZW50ZXIiLCJyaWdodCIsImV2ZW50TGltaXQiLCJhc3BlY3RSYXRpbyIsIm5leHREYXlUaHJlc2hvbGQiLCJldmVudFNvdXJjZXMiLCJmZXRjaEV2ZW50cyIsInRpbWV6b25lIiwiZGF5Q2xpY2siLCJvbkRheUNsaWNrIiwiZXZlbnRDbGljayIsIm9uRXZlbnRDbGljayIsInRyaWdnZXJDYWxlbmRhclVwZGF0ZWQiLCJjYWxsYmFjayIsImRhdGUiLCJjcmVhdGVFdmVudCIsImNhbEV2ZW50IiwiZWRpdEV2ZW50IiwiX29yaWdpbmFsIiwic3RhcnREYXRlIiwiZXZlbnRNb2RlbCIsImxvY2FsIiwidW5peCIsImV2ZW50TW9kYWwiLCJzaG93IiwiY3JlYXRlIiwiQ29tbWFuZHMiLCJUb2FzdCIsImNvbnRlbnQiLCJjcmVhdGVBbm90aGVyIiwiY29uZmlybURlbGV0ZSIsImNvbnN0YW50IiwidXBkYXRlIiwiZGVsZXRlIiwibW9kdWxlIiwiZXhwb3J0cyIsImxheW91dCIsImNhbGVuZGFyQm9keSIsInN0YXR1cyIsImNhbGVuZGFyQm9keVJlZ2lvbiIsImNhbGVuZGFySGVhZGVyUmVnaW9uIiwic3RhdHVzUmVnaW9uIiwiT2JqZWN0IiwiZXZlbnRDYWNoZUdyYW51bGFyaXR5IiwiZmlsdGVyZWRFdmVudENvbGxlY3Rpb24iLCJWaXJ0dWFsQ29sbGVjdGlvbiIsImludmFsaWRhdGVDYWNoZSIsImFkZEV2ZW50IiwidXBkYXRlRXZlbnQiLCJkZWxldGVFdmVudCIsIm9uRmlsdGVyVXBkYXRlZCIsImZldGNoUmVxdWlyZWQiLCJjYWNoZVN0YXJ0IiwiY2FjaGVFbmQiLCJzdGFydE9mIiwiZW5kT2YiLCJhZGQiLCJldmVudENhY2hlU3RhcnQiLCJpc1NhbWUiLCJldmVudENhY2hlRW5kIiwic2hvd0xvYWRpbmdTdGF0dXMiLCJmZXRjaCIsInN1Y2Nlc3MiLCJvbkZldGNoU3VjY2VzcyIsImVycm9yIiwib25GZXRjaEVycm9yIiwicmVzZXQiLCJidWlsZEV2ZW50U291cmNlIiwic2hvd0NhbGVuZGFyQm9keSIsInJlc3BvbnNlIiwicmVuZGVyRXJyb3IiLCJ1cGRhdGVFdmVudEZvcm1hdCIsInNldCIsInRvSlNPTiIsInRvSVNPU3RyaW5nIiwib2xkTW9kZWwiLCJmaW5kIiwibW9kZWxzIiwiZSIsInJlbW92ZSIsInVwZGF0ZUZpbHRlciIsInJlcXVlc3RlZEV2ZW50cyIsImV2ZW50U3RhcnQiLCJldmVudCIsImV2ZW50RW5kIiwiaXNTYW1lT3JBZnRlciIsImlzU2FtZU9yQmVmb3JlIiwiaW52b2tlTWFwIiwiTW9kZWwiLCJwcm90b3R5cGUiLCJjb21wdXRlZCIsIm1lc3NhZ2UiLCJhZGRDbGFzcyIsInJlbW92ZUNsYXNzIiwiZmV0Y2hFcnJvciJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsSUFBSUMsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNQyxXQUFXRCxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNRSxTQUFTRixRQUFRLFFBQVIsQ0FBZjs7QUFFQSxJQUFNRyxNQUFNSCxRQUFRLGFBQVIsQ0FBWjtBQUNBLElBQU1JLFdBQVdKLFFBQVEsY0FBUixDQUFqQjs7QUFFQSxJQUFNSyxZQUFZTCxRQUFRLHFCQUFSLENBQWxCO0FBQ0EsSUFB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QUN2RGtCLGFBQVUsS0FBS0EsUUFEd0M7QUFFdkRDLG9CQUFpQixLQUFLQTtBQUZpQyxHQUFuQixDQUFyQzs7QUFLQSxPQUFLdUIsYUFBTCxDQUFtQixRQUFuQixFQUE2QixJQUFJakUsVUFBSixDQUFlO0FBQzNDcUwsWUFBUyw4Q0FEa0M7QUFFM0NySSxTQUFNO0FBRnFDLEdBQWYsQ0FBN0I7O0FBS0EsT0FBS2lCLGFBQUwsQ0FBbUIsY0FBbkIsRUFBbUMsSUFBSVksWUFBSixDQUFpQjtBQUNuRHBDLGFBQVUsS0FBS0EsUUFEb0M7QUFFbkRDLG9CQUFpQixLQUFLQTtBQUY2QixHQUFqQixDQUFuQztBQUlBLEVBekorQzs7QUEySmhENEcsb0JBQW1CLDZCQUFXO0FBQzdCLE9BQUt4SCxFQUFMLENBQVFtRyxrQkFBUixDQUEyQnFELFFBQTNCLENBQW9DLE1BQXBDO0FBQ0EsT0FBS3hKLEVBQUwsQ0FBUXFHLFlBQVIsQ0FBcUJvRCxXQUFyQixDQUFpQyxNQUFqQztBQUNBLEVBOUorQzs7QUFnS2hEekIsbUJBQWtCLDRCQUFXO0FBQzVCLE9BQUtoSSxFQUFMLENBQVFxRyxZQUFSLENBQXFCbUQsUUFBckIsQ0FBOEIsTUFBOUI7QUFDQSxPQUFLeEosRUFBTCxDQUFRbUcsa0JBQVIsQ0FBMkJzRCxXQUEzQixDQUF1QyxNQUF2QztBQUNBLEVBbksrQzs7QUFxS2hEdkIsY0FBYSxxQkFBU04sS0FBVCxFQUFnQjtBQUM1QixPQUFLekYsYUFBTCxDQUFtQixRQUFuQixFQUE2QixJQUFJckUsU0FBSixDQUFjLEVBQUU0TCxZQUFZOUIsS0FBZCxFQUFkLENBQTdCO0FBQ0EsRUF2SytDOztBQXlLaEQvRSxrQkFBaUIsMkJBQVc7QUFDM0IsT0FBS0MsYUFBTCxDQUFtQixLQUFLbkMsUUFBeEI7QUFDQTtBQTNLK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoiY2FsZW5kYXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCBtb21lbnQgPSByZXF1aXJlKFwibW9tZW50XCIpO1xuXG5jb25zdCBBcHAgPSByZXF1aXJlKFwiLi4vLi4vaW5kZXhcIik7XG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IEVycm9yVmlldyA9IHJlcXVpcmUoXCIuLi8uLi9saWIvZXJyb3JWaWV3XCIpO1xuY29uc3QgRXZlbnRNb2RhbCA9IHJlcXVpcmUoXCIuLi8uLi9saWIvZXZlbnRNb2RhbFwiKTtcbmNvbnN0IEV2ZW50TW9kZWwgPSByZXF1aXJlKFwiLi4vLi4vbGliL2V2ZW50TW9kZWxcIik7XG5jb25zdCBGaWx0ZXJCYWNrID0gcmVxdWlyZShcIi4uLy4uL2xpYi9maWx0ZXJCYWNrXCIpO1xuY29uc3QgU3RhdHVzVmlldyA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc3RhdHVzVmlld1wiKTtcblxuY29uc3QgUGFnZSA9IG5ldyBCYWNrYm9uZS5NYXJpb25ldHRlLkFwcGxpY2F0aW9uKCk7XG5cbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcblxuY29uc3QgRVZFTlRfQ0FDSEVfR1JBTlVMQVJJVFkgPSB7XG5cdE1PTlRIOiBcIm1vbnRoXCIsXG5cdFlFQVI6IFwieWVhclwiLFxufTtcblxuUGFnZS5FdmVudHMgPSB7XG5cdEZpbHRlcnNDaGFuZ2VkOiBcIlBhZ2UuRXZlbnRzLkZpbHRlcnNDaGFuZ2VkXCIsXG5cdEdldEV2ZW50czogXCJQYWdlLkV2ZW50cy5HZXRFdmVudHNcIixcblx0SGlkZUluZm9CbG9jazogXCJQYWdlLkV2ZW50cy5IaWRlSW5mb0Jsb2NrXCIsXG5cdFVwZGF0ZUZpbHRlcjogXCJQYWdlLkV2ZW50cy5VcGRhdGVGaWx0ZXJcIixcbn07XG5cbmNvbnN0IEV2ZW50cyA9IEJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IEV2ZW50TW9kZWwsXG5cblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FjYWNpYS9jYWxlbmRhci9ldmVudHMvXCIgKyB0aGlzLnBhcmFtcy5zdGFydCArIFwiL1wiICsgdGhpcy5wYXJhbXMuZW5kO1xuXHR9LFxufSk7XG5cbmNvbnN0IENhbGVuZGFySGVhZGVyID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJjYWxlbmRhci1oZWFkZXJcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9jYWxlbmRhci5udW5qXCIpLmNhbGVuZGFySGVhZGVyLFxuXG5cdHJlZ2lvbnM6IHtcblx0XHRmaWx0ZXI6IFwiLmNhbGVuZGFyLWZpbHRlci1yZWdpb25cIixcblx0fSxcblxuXHR1aToge1xuXHRcdGJhY2tCdXR0b246IFwiZGl2I2JhY2tcIixcblx0XHRmb3J3YXJkQnV0dG9uOiBcImRpdiNmb3J3YXJkXCIsXG5cdFx0dG9kYXlCdXR0b246IFwiZGl2I3RvZGF5XCIsXG5cdFx0dGl0bGU6IFwiZGl2LmNhbGVuZGFyLXRpdGxlID4gc3BhblwiLFxuXHRcdG1vbnRoQnV0dG9uOiBcImRpdiNtb250aFwiLFxuXHRcdHdlZWtCdXR0b246IFwiZGl2I3dlZWtcIixcblx0XHRkYXlCdXR0b246IFwiZGl2I2RheVwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmJhY2tCdXR0b25cIjogXCJvbkJhY2tCdXR0b25DbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmZvcndhcmRCdXR0b25cIjogXCJvbkZvcndhcmRCdXR0b25DbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLnRvZGF5QnV0dG9uXCI6IFwib25Ub2RheUJ1dHRvbkNsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkubW9udGhCdXR0b25cIjogXCJvbk1vbnRoQnV0dG9uQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS53ZWVrQnV0dG9uXCI6IFwib25XZWVrQnV0dG9uQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5kYXlCdXR0b25cIjogXCJvbkRheUJ1dHRvbkNsaWNrXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuZXZlbnRCdXMgPSBvcHRpb25zLmV2ZW50QnVzO1xuXHRcdHRoaXMuZXZlbnRDb2xsZWN0aW9uID0gb3B0aW9ucy5ldmVudENvbGxlY3Rpb247XG5cblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwiY2FsZW5kYXI6dXBkYXRlZFwiLCB0aGlzLm9uQ2FsZW5kYXJVcGRhdGVkLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmZpbHRlciA9IG5ldyBGaWx0ZXJCYWNrKHtcblx0XHRcdGRlc2NyaXB0b3JzOiBbe1xuXHRcdFx0XHR0eXBlOiBcInRleHRcIixcblx0XHRcdFx0ZGVib3VuY2U6IDIwMCxcblx0XHRcdFx0ZGVmYXVsdFRleHQ6IFwiU2VhcmNoIGZvciBhbiBldmVudC4uLlwiLFxuXHRcdFx0XHRmaWx0ZXJGYWN0b3J5OiBrZXkgPT4gbW9kZWwgPT4ge1xuXHRcdFx0XHRcdGxldCBmb3VuZCA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0Y29uc3Qgb3JpZ2luYWwgPSBtb2RlbC5nZXQoXCJfb3JpZ2luYWxcIik7XG5cblx0XHRcdFx0XHRpZiAob3JpZ2luYWwpIHtcblx0XHRcdFx0XHRcdGZvdW5kID0gXy5zb21lKFtcInRpdGxlXCIsIFwiZGVzY1wiLCBcImxvY2F0aW9uXCJdLCBhID0+IHtcblx0XHRcdFx0XHRcdFx0bGV0IHJlc3VsdCA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChhKSB7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IHQgPSBvcmlnaW5hbFthXTtcblxuXHRcdFx0XHRcdFx0XHRcdGlmICh0KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0ID0gdC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXN1bHQgPSBfLmluY2x1ZGVzKHQsIGtleS50b0xvd2VyQ2FzZSgpKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIGZvdW5kO1xuXHRcdFx0XHR9LFxuXHRcdFx0fV0sXG5cdFx0fSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZmlsdGVyLCBcImV4ZWN1dGVcIiwgY29tcGFyYXRvciA9PiB7XG5cdFx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJmaWx0ZXI6dXBkYXRlZFwiLCBjb21wYXJhdG9yKTtcblx0XHR9KTtcblxuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImZpbHRlclwiLCB0aGlzLmZpbHRlcik7XG5cdH0sXG5cblx0b25DYWxlbmRhclVwZGF0ZWQ6IGZ1bmN0aW9uKG5ld0RhdGUpIHtcblx0XHR0aGlzLnVpLnRpdGxlLnRleHQobmV3RGF0ZS5mb3JtYXQoXCJNTU1NIFlZWVlcIikpO1xuXHR9LFxuXG5cdG9uQmFja0J1dHRvbkNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJjYWxlbmRhcjpwcmV2aW91c1wiKTtcblx0fSxcblxuXHRvbkZvcndhcmRCdXR0b25DbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwiY2FsZW5kYXI6bmV4dFwiKTtcblx0fSxcblxuXHRvblRvZGF5QnV0dG9uQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImNhbGVuZGFyOnRvZGF5XCIpO1xuXHR9LFxuXG5cdG9uTW9udGhCdXR0b25DbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwiY2FsZW5kYXI6bW9udGhWaWV3XCIpO1xuXHR9LFxuXG5cdG9uV2Vla0J1dHRvbkNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJjYWxlbmRhcjp3ZWVrVmlld1wiKTtcblx0fSxcblxuXHRvbkRheUJ1dHRvbkNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJjYWxlbmRhcjpkYXlWaWV3XCIpO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKHRoaXMuZmlsdGVyKTtcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcodGhpcy5ldmVudEJ1cyk7XG5cdH0sXG59KTtcblxuY29uc3QgQ2FsZW5kYXJCb2R5ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJjYWxlbmRhci1ib2R5XCIsXG5cblx0dGVtcGxhdGU6IGZhbHNlLFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLmV2ZW50QnVzID0gb3B0aW9ucy5ldmVudEJ1cztcblxuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJjYWxlbmRhcjpwcmV2aW91c1wiLCB0aGlzLm9uQ2FsZW5kYXJQcmV2aW91cy5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwiY2FsZW5kYXI6bmV4dFwiLCB0aGlzLm9uQ2FsZW5kYXJOZXh0LmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJjYWxlbmRhcjp0b2RheVwiLCB0aGlzLm9uQ2FsZW5kYXJUb2RheS5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwiY2FsZW5kYXI6bW9udGhWaWV3XCIsIHRoaXMub25DYWxlbmRhck1vbnRoVmlldy5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwiY2FsZW5kYXI6d2Vla1ZpZXdcIiwgdGhpcy5vbkNhbGVuZGFyV2Vla1ZpZXcuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmV2ZW50QnVzLCBcImNhbGVuZGFyOmRheVZpZXdcIiwgdGhpcy5vbkNhbGVuZGFyRGF5Vmlldy5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwiY2FsZW5kYXI6ZXZlbnRzVXBkYXRlZFwiLCB0aGlzLnJlZnJlc2hDYWxlbmRhci5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRvbkRvbVJlZnJlc2g6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghdGhpcy4kZWwgfHwgIXRoaXMuJGVsLmZ1bGxDYWxlbmRhcilcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuJGVsLmZ1bGxDYWxlbmRhcih7XG5cdFx0XHRoZWFkZXI6IHtcblx0XHRcdFx0bGVmdDogXCJcIixcblx0XHRcdFx0Y2VudGVyOiBcIlwiLFxuXHRcdFx0XHRyaWdodDogXCJcIixcblx0XHRcdH0sXG5cdFx0XHRldmVudExpbWl0OiA0LFxuXHRcdFx0YXNwZWN0UmF0aW86IDIuNTUsXG5cdFx0XHRuZXh0RGF5VGhyZXNob2xkOiBcIjAwOjAxXCIsXG5cblx0XHRcdGV2ZW50U291cmNlczogW3tcblx0XHRcdFx0ZXZlbnRzOiB0aGlzLmZldGNoRXZlbnRzLmJpbmQodGhpcyksXG5cdFx0XHR9XSxcblxuXHRcdFx0dGltZXpvbmU6IFwibG9jYWxcIixcblxuXHRcdFx0ZGF5Q2xpY2s6IHRoaXMub25EYXlDbGljay5iaW5kKHRoaXMpLFxuXHRcdFx0ZXZlbnRDbGljazogdGhpcy5vbkV2ZW50Q2xpY2suYmluZCh0aGlzKSxcblx0XHR9KTtcblxuXHRcdHRoaXMudHJpZ2dlckNhbGVuZGFyVXBkYXRlZCgpO1xuXHR9LFxuXG5cdGZldGNoRXZlbnRzOiBmdW5jdGlvbihzdGFydCwgZW5kLCB0aW1lem9uZSwgY2FsbGJhY2spIHtcblx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJjYWxlbmRhcjpmZXRjaEV2ZW50c1wiLCBzdGFydCwgZW5kLCBjYWxsYmFjayk7XG5cdH0sXG5cblx0dHJpZ2dlckNhbGVuZGFyVXBkYXRlZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwiY2FsZW5kYXI6dXBkYXRlZFwiLCB0aGlzLiRlbC5mdWxsQ2FsZW5kYXIoXCJnZXREYXRlXCIpKTtcblx0fSxcblxuXHRvbkNhbGVuZGFyUHJldmlvdXM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJGVsLmZ1bGxDYWxlbmRhcihcInByZXZcIik7XG5cdFx0dGhpcy50cmlnZ2VyQ2FsZW5kYXJVcGRhdGVkKCk7XG5cdH0sXG5cblx0b25DYWxlbmRhck5leHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJGVsLmZ1bGxDYWxlbmRhcihcIm5leHRcIik7XG5cdFx0dGhpcy50cmlnZ2VyQ2FsZW5kYXJVcGRhdGVkKCk7XG5cdH0sXG5cblx0b25DYWxlbmRhclRvZGF5OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC5mdWxsQ2FsZW5kYXIoXCJ0b2RheVwiKTtcblx0XHR0aGlzLnRyaWdnZXJDYWxlbmRhclVwZGF0ZWQoKTtcblx0fSxcblxuXHRvbkNhbGVuZGFyTW9udGhWaWV3OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC5mdWxsQ2FsZW5kYXIoXCJjaGFuZ2VWaWV3XCIsIFwibW9udGhcIik7XG5cdFx0dGhpcy50cmlnZ2VyQ2FsZW5kYXJVcGRhdGVkKCk7XG5cdH0sXG5cblx0b25DYWxlbmRhcldlZWtWaWV3OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC5mdWxsQ2FsZW5kYXIoXCJjaGFuZ2VWaWV3XCIsIFwiYWdlbmRhV2Vla1wiKTtcblx0XHR0aGlzLnRyaWdnZXJDYWxlbmRhclVwZGF0ZWQoKTtcblx0fSxcblxuXHRvbkNhbGVuZGFyRGF5VmlldzogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy4kZWwuZnVsbENhbGVuZGFyKFwiY2hhbmdlVmlld1wiLCBcImFnZW5kYURheVwiKTtcblx0XHR0aGlzLnRyaWdnZXJDYWxlbmRhclVwZGF0ZWQoKTtcblx0fSxcblxuXHRvbkRheUNsaWNrOiBmdW5jdGlvbihkYXRlKSB7XG5cdFx0dGhpcy5jcmVhdGVFdmVudChkYXRlKTtcblx0fSxcblxuXHRvbkV2ZW50Q2xpY2s6IGZ1bmN0aW9uKGNhbEV2ZW50KSB7XG5cdFx0dGhpcy5lZGl0RXZlbnQobmV3IEV2ZW50TW9kZWwoY2FsRXZlbnQuX29yaWdpbmFsKSk7XG5cdH0sXG5cblx0cmVmcmVzaENhbGVuZGFyOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy4kZWwuZnVsbENhbGVuZGFyKVxuXHRcdFx0dGhpcy4kZWwuZnVsbENhbGVuZGFyKFwicmVmZXRjaEV2ZW50c1wiKTtcblx0fSxcblxuXHRjcmVhdGVFdmVudDogZnVuY3Rpb24oc3RhcnREYXRlLCBtb2RlbCkge1xuXHRcdGxldCBldmVudE1vZGVsID0gbnVsbDtcblxuXHRcdGlmIChtb2RlbCkge1xuXHRcdFx0ZXZlbnRNb2RlbCA9IG1vZGVsO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGV2ZW50TW9kZWwgPSBuZXcgRXZlbnRNb2RlbCh7XG5cdFx0XHRcdHN0YXJ0OiBzdGFydERhdGUubG9jYWwoKS51bml4KCksXG5cdFx0XHRcdGVuZDogc3RhcnREYXRlLmxvY2FsKCkudW5peCgpLFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZXZlbnRNb2RhbCA9IG5ldyBFdmVudE1vZGFsKHsgbW9kZWw6IGV2ZW50TW9kZWwgfSk7XG5cblx0XHRldmVudE1vZGFsLnNob3coe1xuXHRcdFx0Y3JlYXRlOiByZXN1bHQgPT4ge1xuXHRcdFx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJldmVudDphZGRcIiwgcmVzdWx0Lm1vZGVsKTtcblxuXHRcdFx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuVG9hc3QsIHtcblx0XHRcdFx0XHRjb250ZW50OiBcIk5ldyBldmVudCBcIiArIHJlc3VsdC5tb2RlbC5nZXQoXCJ0aXRsZVwiKSArIFwiIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXCIsXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdGNyZWF0ZUFub3RoZXI6IHJlc3VsdCA9PiB7XG5cdFx0XHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImV2ZW50OmFkZFwiLCByZXN1bHQubW9kZWwpO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fSxcblxuXHRlZGl0RXZlbnQ6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0Y29uc3QgZXZlbnRNb2RhbCA9IG5ldyBFdmVudE1vZGFsKHsgbW9kZWw6IG1vZGVsIH0pO1xuXG5cdFx0ZXZlbnRNb2RhbC5jb25maXJtRGVsZXRlID0gXy5jb25zdGFudChcIldhcm5pbmchIFlvdSBhcmUgYWJvdXQgdG8gZGVsZXRlIGFuIGV2ZW50LlwiKTtcblxuXHRcdGV2ZW50TW9kYWwuc2hvdyh7XG5cdFx0XHR1cGRhdGU6IHJlc3VsdCA9PiB7XG5cdFx0XHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImV2ZW50OnVwZGF0ZVwiLCByZXN1bHQubW9kZWwpO1xuXG5cdFx0XHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5Ub2FzdCwge1xuXHRcdFx0XHRcdGNvbnRlbnQ6IFwiRXZlbnQgXCIgKyByZXN1bHQubW9kZWwuZ2V0KFwidGl0bGVcIikgKyBcIiBzdWNjZXNzZnVsbHkgdXBkYXRlZFwiLFxuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRkZWxldGU6IHJlc3VsdCA9PiB7XG5cdFx0XHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImV2ZW50OmRlbGV0ZVwiLCByZXN1bHQubW9kZWwpO1xuXG5cdFx0XHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5Ub2FzdCwge1xuXHRcdFx0XHRcdGNvbnRlbnQ6IFwiRXZlbnQgXCIgKyByZXN1bHQubW9kZWwuZ2V0KFwidGl0bGVcIikgKyBcIiBzdWNjZXNzZnVsbHkgZGVsZXRlZFwiLFxuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcodGhpcy5ldmVudEJ1cyk7XG5cdH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImNvbnRlbnQgY2FsZW5kYXItbGF5b3V0XCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvY2FsZW5kYXIubnVualwiKS5sYXlvdXQsXG5cblx0cmVnaW9uczoge1xuXHRcdGNhbGVuZGFyQm9keTogXCIuY2FsZW5kYXItYm9keS1yZWdpb25cIixcblx0XHRjYWxlbmRhckhlYWRlcjogXCIuY2FsZW5kYXItaGVhZGVyLXJlZ2lvblwiLFxuXHRcdHN0YXR1czogXCIuc3RhdHVzLXJlZ2lvblwiLFxuXHR9LFxuXG5cdHVpOiB7XG5cdFx0Y2FsZW5kYXJCb2R5UmVnaW9uOiBcIi5jYWxlbmRhci1ib2R5LXJlZ2lvblwiLFxuXHRcdGNhbGVuZGFySGVhZGVyUmVnaW9uOiBcIi5jYWxlbmRhci1oZWFkZXItcmVnaW9uXCIsXG5cdFx0c3RhdHVzUmVnaW9uOiBcIi5zdGF0dXMtcmVnaW9uXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5ldmVudEJ1cyA9IG5ldyBCYWNrYm9uZS5NYXJpb25ldHRlLk9iamVjdCgpO1xuXHRcdHRoaXMuZXZlbnRDYWNoZUdyYW51bGFyaXR5ID0gRVZFTlRfQ0FDSEVfR1JBTlVMQVJJVFkuTU9OVEg7XG5cdFx0dGhpcy5ldmVudENvbGxlY3Rpb24gPSBuZXcgRXZlbnRzKFtdKTtcblx0XHR0aGlzLmZpbHRlcmVkRXZlbnRDb2xsZWN0aW9uID0gbmV3IEJhY2tib25lLlZpcnR1YWxDb2xsZWN0aW9uKHRoaXMuZXZlbnRDb2xsZWN0aW9uKTtcblx0XHR0aGlzLmludmFsaWRhdGVDYWNoZSA9IGZhbHNlO1xuXG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmV2ZW50QnVzLCBcImNhbGVuZGFyOmZldGNoRXZlbnRzXCIsIHRoaXMuZmV0Y2hFdmVudHMuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmV2ZW50QnVzLCBcImV2ZW50OmFkZFwiLCB0aGlzLmFkZEV2ZW50LmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJldmVudDp1cGRhdGVcIiwgdGhpcy51cGRhdGVFdmVudC5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwiZXZlbnQ6ZGVsZXRlXCIsIHRoaXMuZGVsZXRlRXZlbnQuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmV2ZW50QnVzLCBcImZpbHRlcjp1cGRhdGVkXCIsIHRoaXMub25GaWx0ZXJVcGRhdGVkLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdGZldGNoRXZlbnRzOiBmdW5jdGlvbihzdGFydCwgZW5kLCBjYWxsYmFjaykge1xuXHRcdGxldCBmZXRjaFJlcXVpcmVkID0gZmFsc2U7XG5cblx0XHRpZiAodGhpcy5pbnZhbGlkYXRlQ2FjaGUpIHtcblx0XHRcdGZldGNoUmVxdWlyZWQgPSB0cnVlO1xuXHRcdFx0dGhpcy5pbnZhbGlkYXRlQ2FjaGUgPSBmYWxzZTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRjb25zdCBjYWNoZVN0YXJ0ID0gbW9tZW50KHN0YXJ0KTtcblx0XHRcdGNvbnN0IGNhY2hlRW5kID0gbW9tZW50KGVuZCk7XG5cblx0XHRcdGNhY2hlU3RhcnQuc3RhcnRPZih0aGlzLmV2ZW50Q2FjaGVHcmFudWxhcml0eSk7XG5cdFx0XHRjYWNoZUVuZC5lbmRPZih0aGlzLmV2ZW50Q2FjaGVHcmFudWxhcml0eSk7XG5cdFx0XHRjYWNoZUVuZC5hZGQoMSwgXCJkYXlzXCIpO1xuXG5cdFx0XHRpZiAoIXRoaXMuZXZlbnRDYWNoZVN0YXJ0IHx8ICF0aGlzLmV2ZW50Q2FjaGVTdGFydC5pc1NhbWUoY2FjaGVTdGFydCkpIHtcblx0XHRcdFx0dGhpcy5ldmVudENhY2hlU3RhcnQgPSBjYWNoZVN0YXJ0O1xuXHRcdFx0XHRmZXRjaFJlcXVpcmVkID0gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCF0aGlzLmV2ZW50Q2FjaGVFbmQgfHwgIXRoaXMuZXZlbnRDYWNoZUVuZC5pc1NhbWUoY2FjaGVFbmQpKSB7XG5cdFx0XHRcdHRoaXMuZXZlbnRDYWNoZUVuZCA9IGNhY2hlRW5kO1xuXHRcdFx0XHRmZXRjaFJlcXVpcmVkID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZmV0Y2hSZXF1aXJlZCkge1xuXHRcdFx0dGhpcy5zaG93TG9hZGluZ1N0YXR1cygpO1xuXG5cdFx0XHR0aGlzLmV2ZW50Q29sbGVjdGlvbi5wYXJhbXMgPSB7XG5cdFx0XHRcdHN0YXJ0OiB0aGlzLmV2ZW50Q2FjaGVTdGFydC51bml4KCksXG5cdFx0XHRcdGVuZDogdGhpcy5ldmVudENhY2hlRW5kLnVuaXgoKSxcblx0XHRcdH07XG5cblx0XHRcdHRoaXMuZXZlbnRDb2xsZWN0aW9uLmZldGNoKHtcblx0XHRcdFx0c3VjY2VzczogdGhpcy5vbkZldGNoU3VjY2Vzcy5iaW5kKHRoaXMsIHN0YXJ0LCBlbmQsIGNhbGxiYWNrKSxcblx0XHRcdFx0ZXJyb3I6IHRoaXMub25GZXRjaEVycm9yLmJpbmQodGhpcyksXG5cdFx0XHRcdHJlc2V0OiB0cnVlLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5idWlsZEV2ZW50U291cmNlKHN0YXJ0LCBlbmQsIGNhbGxiYWNrKTtcblx0XHR9XG5cdH0sXG5cblx0b25GZXRjaFN1Y2Nlc3M6IGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIGNhbGxiYWNrKSB7XG5cdFx0dGhpcy5zaG93Q2FsZW5kYXJCb2R5KCk7XG5cblx0XHR0aGlzLmJ1aWxkRXZlbnRTb3VyY2Uoc3RhcnQsIGVuZCwgY2FsbGJhY2spO1xuXHR9LFxuXG5cdG9uRmV0Y2hFcnJvcjogZnVuY3Rpb24obW9kZWwsIHJlc3BvbnNlKSB7XG5cdFx0dGhpcy5yZW5kZXJFcnJvcihyZXNwb25zZSk7XG5cdH0sXG5cblx0dXBkYXRlRXZlbnRGb3JtYXQ6IGZ1bmN0aW9uKGV2ZW50TW9kZWwpIHtcblx0XHRldmVudE1vZGVsLnNldChcIl9vcmlnaW5hbFwiLCBldmVudE1vZGVsLnRvSlNPTigpKTtcblxuXHRcdGV2ZW50TW9kZWwuc2V0KFwic3RhcnRcIiwgbW9tZW50LnVuaXgoZXZlbnRNb2RlbC5nZXQoXCJzdGFydFwiKSkudG9JU09TdHJpbmcoKSk7XG5cdFx0ZXZlbnRNb2RlbC5zZXQoXCJlbmRcIiwgbW9tZW50LnVuaXgoZXZlbnRNb2RlbC5nZXQoXCJlbmRcIikpLnRvSVNPU3RyaW5nKCkpO1xuXG5cdFx0cmV0dXJuIGV2ZW50TW9kZWw7XG5cdH0sXG5cblx0YWRkRXZlbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdC8vdGhpcy5ldmVudENvbGxlY3Rpb24uYWRkKHRoaXMudXBkYXRlRXZlbnRGb3JtYXQoZXZlbnRNb2RlbCkpO1xuXG5cdFx0dGhpcy5pbnZhbGlkYXRlQ2FjaGUgPSB0cnVlO1xuXHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImNhbGVuZGFyOmV2ZW50c1VwZGF0ZWRcIik7XG5cdH0sXG5cblx0dXBkYXRlRXZlbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdC8vY29uc3Qgb2xkTW9kZWwgPSBfLmZpbmQodGhpcy5ldmVudENvbGxlY3Rpb24ubW9kZWxzLCBlID0+IGUuZ2V0KFwiX2lkXCIpID09PSBldmVudE1vZGVsLmdldChcIl9pZFwiKSk7XG5cblx0XHQvL3RoaXMuZXZlbnRDb2xsZWN0aW9uLnJlbW92ZShvbGRNb2RlbCk7XG5cdFx0Ly90aGlzLmV2ZW50Q29sbGVjdGlvbi5hZGQodGhpcy51cGRhdGVFdmVudEZvcm1hdChldmVudE1vZGVsKSk7XG5cblx0XHR0aGlzLmludmFsaWRhdGVDYWNoZSA9IHRydWU7XG5cdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwiY2FsZW5kYXI6ZXZlbnRzVXBkYXRlZFwiKTtcblx0fSxcblxuXHRkZWxldGVFdmVudDogZnVuY3Rpb24oZXZlbnRNb2RlbCkge1xuXHRcdGNvbnN0IG9sZE1vZGVsID0gXy5maW5kKHRoaXMuZXZlbnRDb2xsZWN0aW9uLm1vZGVscywgZSA9PiBlLmdldChcIl9pZFwiKSA9PT0gZXZlbnRNb2RlbC5nZXQoXCJfaWRcIikpO1xuXG5cdFx0dGhpcy5ldmVudENvbGxlY3Rpb24ucmVtb3ZlKG9sZE1vZGVsKTtcblxuXHRcdHRoaXMuaW52YWxpZGF0ZUNhY2hlID0gdHJ1ZTtcblx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJjYWxlbmRhcjpldmVudHNVcGRhdGVkXCIpO1xuXHR9LFxuXG5cdG9uRmlsdGVyVXBkYXRlZDogZnVuY3Rpb24oY29tcGFyYXRvcikge1xuXHRcdHRoaXMuZmlsdGVyZWRFdmVudENvbGxlY3Rpb24udXBkYXRlRmlsdGVyKGNvbXBhcmF0b3IpO1xuXHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImNhbGVuZGFyOmV2ZW50c1VwZGF0ZWRcIik7XG5cdH0sXG5cblx0YnVpbGRFdmVudFNvdXJjZTogZnVuY3Rpb24oc3RhcnQsIGVuZCwgY2FsbGJhY2spIHtcblx0XHRjb25zdCByZXF1ZXN0ZWRFdmVudHMgPSBfLmZpbHRlcih0aGlzLmZpbHRlcmVkRXZlbnRDb2xsZWN0aW9uLm1vZGVscywgZXZlbnQgPT4ge1xuXHRcdFx0Y29uc3QgZXZlbnRTdGFydCA9IG1vbWVudChldmVudC5nZXQoXCJzdGFydFwiKSk7XG5cdFx0XHRjb25zdCBldmVudEVuZCA9IG1vbWVudChldmVudC5nZXQoXCJlbmRcIikpO1xuXG5cdFx0XHRyZXR1cm4gZXZlbnRTdGFydC5pc1NhbWVPckFmdGVyKHN0YXJ0KSAmJiBldmVudFN0YXJ0LmlzU2FtZU9yQmVmb3JlKGVuZCkgfHxcblx0XHRcdFx0ZXZlbnRFbmQuaXNTYW1lT3JBZnRlcihzdGFydCkgJiYgZXZlbnRFbmQuaXNTYW1lT3JCZWZvcmUoZW5kKTtcblx0XHR9KTtcblxuXHRcdGNhbGxiYWNrKF8uaW52b2tlTWFwKHJlcXVlc3RlZEV2ZW50cywgQmFja2JvbmUuTW9kZWwucHJvdG90eXBlLnRvSlNPTiwgeyBjb21wdXRlZDogdHJ1ZSB9KSk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImNhbGVuZGFySGVhZGVyXCIsIG5ldyBDYWxlbmRhckhlYWRlcih7XG5cdFx0XHRldmVudEJ1czogdGhpcy5ldmVudEJ1cyxcblx0XHRcdGV2ZW50Q29sbGVjdGlvbjogdGhpcy5ldmVudENvbGxlY3Rpb24sXG5cdFx0fSkpO1xuXG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwic3RhdHVzXCIsIG5ldyBTdGF0dXNWaWV3KHtcblx0XHRcdG1lc3NhZ2U6IFwiRG93bmxvYWRpbmcgZXZlbnRzLiBUaGlzIG1heSB0YWtlIGEgd2hpbGUuLi5cIixcblx0XHRcdHR5cGU6IFwibG9hZGluZ1wiLFxuXHRcdH0pKTtcblxuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImNhbGVuZGFyQm9keVwiLCBuZXcgQ2FsZW5kYXJCb2R5KHtcblx0XHRcdGV2ZW50QnVzOiB0aGlzLmV2ZW50QnVzLFxuXHRcdFx0ZXZlbnRDb2xsZWN0aW9uOiB0aGlzLmV2ZW50Q29sbGVjdGlvbixcblx0XHR9KSk7XG5cdH0sXG5cblx0c2hvd0xvYWRpbmdTdGF0dXM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkuY2FsZW5kYXJCb2R5UmVnaW9uLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLnN0YXR1c1JlZ2lvbi5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0c2hvd0NhbGVuZGFyQm9keTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5zdGF0dXNSZWdpb24uYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkuY2FsZW5kYXJCb2R5UmVnaW9uLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRyZW5kZXJFcnJvcjogZnVuY3Rpb24oZXJyb3IpIHtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJzdGF0dXNcIiwgbmV3IEVycm9yVmlldyh7IGZldGNoRXJyb3I6IGVycm9yIH0pKTtcblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLmV2ZW50QnVzKTtcblx0fSxcbn0pOyJdfQ==",
    "\"use strict\";\n\nvar _radioEvents;\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\n\nvar App = require(\"../../index\");\nvar settings = require(\"app-settings\");\n\nvar Selectra = require(\"../../lib/selectra\");\nvar moment = require(\"moment\");\n\nvar radio = Backbone.Radio.channel(\"global\");\nvar eventBus = require(\"./console/eventBus\");\n\nvar STATUS_RED = 0;\nvar STATUS_ORANGE = 1;\nvar STATUS_GREEN = 2;\n\nvar Model = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"_id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/users\";\n\t},\n\n\tdefaults: {\n\t\thide: false\n\t}\n});\n\nvar UserCollection = Backbone.Collection.extend({\n\tmodel: Model,\n\tmode: \"server\",\n\n\tcomparator: function comparator(user) {\n\t\treturn [user.get(\"status\"), _.toLower(user.get(\"firstname\") + user.get(\"surname\"))];\n\t},\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/acacia/users/assigned/bookOrGroup\";\n\t},\n\n\tbyTextSearch: function byTextSearch(query) {\n\t\tthis.filter(function (user) {\n\t\t\tif (_.includes(_.toLower(user.get(\"firstname\")), _.toLower(query)) || _.includes(_.toLower(user.get(\"surname\")), _.toLower(query))) {\n\t\t\t\tuser.set(\"hide\", false);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tuser.set(\"hide\", true);\n\n\t\t\tif (query.length === 0) user.set(\"hide\", false);\n\n\t\t\treturn false;\n\t\t});\n\t}\n});\n\n// Resources that are linked to the monitored book or group\nvar ResourceCollection = Backbone.Collection.extend({\n\tmodel: Model,\n\tmode: \"server\",\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/acacia/resources/assigned/bookOrGroup\";\n\t}\n});\n\nvar CamUserView = Backbone.Marionette.View.extend({\n\ttemplate: require(\"../templates/cam.nunj\").userView,\n\n\tui: {\n\t\ttype: \".cover-type\",\n\t\tinfo: \".info\",\n\t\tcamUserTooltip: \".camUserTooltip\",\n\t\tuserStatus: \".user-status\"\n\t},\n\n\tmodelEvents: {\n\t\t\"change:hide\": \"onHideChange\"\n\t},\n\n\tevents: {\n\t\tclick: \"viewCamUser\"\n\t},\n\n\tclassName: function className() {\n\t\treturn \"cam-user status-\" + this.model.get(\"status\");\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tuserStatus: function userStatus(status) {\n\t\t\t\tif (status === STATUS_GREEN) return \"smile\";else if (status === STATUS_ORANGE) return \"meh\";\n\n\t\t\t\treturn \"frown\";\n\t\t\t}\n\t\t};\n\t},\n\n\tserializeData: function serializeData() {\n\t\treturn this.model.toJSON();\n\t},\n\n\tviewCamUser: function viewCamUser(event) {\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\t\tthis.trigger(\"select:camUser\", this.model);\n\t},\n\n\tonHideChange: function onHideChange() {\n\t\tif (this.model.get(\"hide\")) this.$el.addClass(\"hide\");else this.$el.removeClass(\"hide\");\n\t}\n});\n\nvar CamUsersView = Backbone.Marionette.CollectionView.extend({\n\tchildView: CamUserView,\n\tchildViewTriggers: {\n\t\t\"select:camUser\": \"child:select:camUser\",\n\t\t\"change:camUser\": \"child:change:camUser\"\n\t},\n\n\tclassName: function className() {\n\t\treturn \"row-container status-\" + this.options.state;\n\t}\n});\n\nvar StatsModel = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"_id\",\n\n\tcomputeds: {\n\t\tfontAwesomeName: function fontAwesomeName() {\n\t\t\tvar event_name = this.get(\"event_name\");\n\t\t\tif (_.includes(event_name, \"Archive\")) return \"archive\";\n\t\t\tif (event_name === \"FocusLost\" || event_name === \"Closed\" || event_name === \"Crashed\") return \"arrow-circle-left\";\n\t\t\tif (event_name === \"FocusGained\" || event_name === \"Started\") return \"arrow-circle-right\";\n\t\t\tif (event_name === \"Library\") return \"book\";\n\t\t\tif (event_name === \"PageOpen\") return \"file\";\n\t\t\tif (event_name === \"Settings\" || event_name === \"Accounts\") return \"users\";\n\t\t\tif (event_name === \"UpcomingEvents\") return \"calendar-day\";\n\t\t\tif (_.includes(event_name, \"Summary\")) return \"list-alt\";\n\t\t\tif (event_name === \"SwitchAccount\") return \"exchange\";\n\t\t\tif (event_name === \"BookDownload\") return \"download\";\n\t\t\tif (_.includes(event_name, \"Search\")) return \"search\";\n\t\t\tif (_.includes(event_name, \"Flashcard\")) return \"file-check\";\n\t\t\tif (_.includes(event_name, \"Freeform\") || _.includes(event_name, \"Folder\")) return \"folder\";\n\t\t\tif (event_name === \"Annotation\") return \"edit\";\n\t\t\tif (_.includes(event_name, \"Resource\") || _.includes(event_name, \"Attachment\")) return \"paperclip\";\n\t\t\tif (event_name === \"NewsLetter\") return \"newspaper\";\n\t\t\tif (_.includes(event_name, \"Stats\")) return \"chart-bar\";\n\t\t\tif (_.includes(event_name, \"File\")) return \"file\";\n\t\t\tif (event_name === \"WhatsNew\") return \"gift\";\n\t\t\tif (event_name === \"Highlight\") return \"highlighter\";\n\t\t\tif (_.includes(event_name, \"URL\") || _.includes(event_name, \"Practice\")) return \"globe\";\n\t\t\treturn \"circle\";\n\t\t},\n\n\t\tstatName: function statName() {\n\t\t\treturn this.get(\"display\") === \"\" ? this.get(\"event_name\") : this.get(\"display\");\n\t\t},\n\n\t\tdisplayTime: function displayTime() {\n\t\t\treturn moment.unix(this.get(\"timestamp\")).format(\"HH:mm:ss\");\n\t\t},\n\n\t\tfromNow: function fromNow() {\n\t\t\treturn moment.unix(this.get(\"timestamp\")).fromNow();\n\t\t}\n\t}\n});\n\nvar StatView = Backbone.Marionette.View.extend({\n\tclassName: \"stat\",\n\ttagName: \"div\",\n\ttemplate: require(\"../templates/cam.nunj\").stat,\n\n\tui: {\n\t\tfromNowDate: \".small-date\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tformatDate: function formatDate(date) {\n\t\t\t\treturn moment(date).format(\"ddd, D MMMM YYYY\");\n\t\t\t},\n\t\t\tfontAwesomeName: function fontAwesomeName(event_name) {\n\t\t\t\tif (_.includes(event_name, \"Archive\")) return \"archive\";\n\t\t\t\tif (event_name === \"FocusLost\" || event_name === \"Closed\" || event_name === \"Crashed\") return \"arrow-circle-left\";\n\t\t\t\tif (event_name === \"FocusGained\" || event_name === \"Started\") return \"arrow-circle-right\";\n\t\t\t\tif (event_name === \"Library\") return \"book\";\n\t\t\t\tif (event_name === \"PageOpen\") return \"file\";\n\t\t\t\tif (event_name === \"Settings\" || event_name === \"Accounts\") return \"users\";\n\t\t\t\tif (event_name === \"UpcomingEvents\") return \"calendar\"; //calendar-day\n\t\t\t\tif (_.includes(event_name, \"Summary\")) return \"list-alt\";\n\t\t\t\tif (event_name === \"SwitchAccount\") return \"exchange\";\n\t\t\t\tif (event_name === \"BookDownload\") return \"download\";\n\t\t\t\tif (_.includes(event_name, \"Search\")) return \"search\";\n\t\t\t\tif (_.includes(event_name, \"Flashcard\")) return \"file-check\";\n\t\t\t\tif (_.includes(event_name, \"Freeform\") || _.includes(event_name, \"Folder\")) return \"folder\";\n\t\t\t\tif (event_name === \"Annotation\") return \"edit\";\n\t\t\t\tif (_.includes(event_name, \"Resource\") || _.includes(event_name, \"Attachment\")) return \"paperclip\";\n\t\t\t\tif (event_name === \"NewsLetter\") return \"newspaper\";\n\t\t\t\tif (_.includes(event_name, \"Stats\")) return \"chart-bar\";\n\t\t\t\tif (_.includes(event_name, \"File\")) return \"file\";\n\t\t\t\tif (event_name === \"WhatsNew\") return \"gift\";\n\t\t\t\tif (event_name === \"Highlight\") return \"highlighter\";\n\t\t\t\tif (_.includes(event_name, \"URL\") || _.includes(event_name, \"Practice\")) return \"globe\";\n\t\t\t\treturn \"circle\";\n\t\t\t},\n\n\t\t\tstatName: function statName(display, event_name) {\n\t\t\t\treturn display === \"\" ? event_name : display;\n\t\t\t},\n\n\t\t\tevent_time: function event_time(timestamp) {\n\t\t\t\treturn moment.unix(timestamp).format(\"HH:mm:ss\");\n\t\t\t},\n\n\t\t\tfromNow: function fromNow(timestamp) {\n\t\t\t\treturn moment.unix(timestamp).fromNow();\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.listenTo(eventBus, eventBus.Events.CAMTimelineChange, this.onTimelineChange.bind(this));\n\t},\n\n\tonTimelineChange: function onTimelineChange() {\n\t\tthis.ui.fromNowDate.html(moment.unix(this.model.get(\"timestamp\")).fromNow());\n\t}\n});\n\nvar DayView = Backbone.Marionette.View.extend({\n\tclassName: \"day\",\n\ttagName: \"div\",\n\ttemplate: require(\"../templates/cam.nunj\").dayStats,\n\n\tui: {\n\t\tfromNowDate: \".small-date\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tformatDate: function formatDate(date) {\n\t\t\t\treturn moment(date).format(\"ddd, D MMMM YYYY\");\n\t\t\t}\n\t\t};\n\t}\n});\n\nvar TimelineEvents = Backbone.Marionette.View.extend({\n\tclassName: \"timeline-rows\",\n\ttagName: \"div\",\n\n\tui: {\n\t\tbackBtn: \".btn-back\"\n\t},\n\n\tcollectionEvents: {\n\t\t\"sync error\": \"fetchEnd\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tformatDate: function formatDate(date) {\n\t\t\t\treturn moment(date).format(\"ddd, D MMMM YYYY\");\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.bindEvents(this.collection, this.collectionEvents);\n\t\tthis.statViews = [];\n\t\tthis.startTime = this.collection.sinceTimestamp;\n\t\tthis.params = this.options.params;\n\t},\n\n\tfetchEnd: function fetchEnd() {\n\t\tvar _this = this;\n\n\t\tthis.collection.fullCollection = this.collection.fullCollection.concat(this.collection.models);\n\n\t\t_.each(_.orderBy(this.collection.models, function (stat) {\n\t\t\treturn stat.get(\"timestamp\");\n\t\t}, \"desc\"), function (model) {\n\t\t\tvar view = _.find(_this.statViews, function (statView) {\n\t\t\t\treturn statView.model.get(\"id\") === model.get(\"id\");\n\t\t\t});\n\n\t\t\t// If the model already has a view, just return\n\t\t\tif (view) return;\n\n\t\t\tif (model.get(\"timestamp\") < _this.startTime) return;\n\n\t\t\tvar statView = new StatView({\n\t\t\t\tmodel: model\n\t\t\t});\n\n\t\t\t_this.statViews.push(statView);\n\n\t\t\t_this.$el.children(\":first\").find(\".date-divider\").after(statView.render().el);\n\t\t\t// Trigger update time listened to by StatView\n\t\t\teventBus.trigger(eventBus.Events.CAMTimelineChange);\n\t\t});\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this2 = this;\n\n\t\t_.each(this.model.get(\"mappedStats\"), function (stats, day) {\n\t\t\t// Render day\n\t\t\tvar dayView = new DayView({ model: new Backbone.Model({ date: day }) });\n\t\t\t_this2.$el.append(dayView.render().el);\n\t\t\t_.each(_.orderBy(stats, function (stat) {\n\t\t\t\treturn stat.timestamp;\n\t\t\t}, \"desc\"), function (stat) {\n\t\t\t\t// Render stat\n\t\t\t\tvar statView = new StatView({ model: stat });\n\t\t\t\tdayView.$el.append(statView.render().el);\n\t\t\t});\n\t\t});\n\t},\n\n\tupdateStats: function updateStats() {\n\t\tthis.collection.sinceTimestamp = this.collection.length > 0 ? this.collection.first().get(\"timestamp\") : this.collection.sinceTimestamp;\n\t\tthis.collection.fetch({ reset: true });\n\t}\n});\n\nvar StatsCollection = Backbone.Collection.extend({\n\tmodel: StatsModel,\n\tinitialize: function initialize(data, opts) {\n\t\tthis.fullCollection = [];\n\t\tif (opts) {\n\t\t\tthis.username = opts.username;\n\t\t\tthis.sinceTimestamp = opts.sinceTimestamp;\n\t\t}\n\t},\n\n\tcomparator: function comparator(item) {\n\t\treturn -item.get(\"timestamp\");\n\t},\n\n\turl: function url() {\n\t\treturn \"/redstone/api/student/timeline?user=\" + encodeURIComponent(this.username) + \"&sinceTimestamp=\" + this.sinceTimestamp;\n\t},\n\n\tmode: \"server\"\n});\n\nvar CAMTimeline = Backbone.Marionette.View.extend({\n\tclassName: \"content cam-user-timeline\",\n\n\ttemplate: require(\"../templates/cam.nunj\").timeline,\n\n\tui: {\n\t\tbackBtn: \".btn-back\",\n\t\tresult: \".result\",\n\t\tliveData: \"input[name='live-data']\",\n\t\toverlay: \".timeline-overlay\"\n\t},\n\tregions: {\n\t\tcontent: \".events-region\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.backBtn\": \"onBackBtnClick\"\n\t},\n\n\tcollectionEvents: {\n\t\trequest: \"fetchStart\",\n\t\t\"sync error\": \"fetchEnd\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.collection = new StatsCollection([], { username: this.model.get(\"username\"), sinceTimestamp: this.model.get(\"sinceTimestamp\") });\n\t\tthis.bindEvents(this.collection, this.collectionEvents);\n\t},\n\n\tfetchStart: function fetchStart() {\n\t\tthis.ui.overlay.addClass(\"shown\").html(\"<span class='spinner'><span class='spinner-icon spinner-red'/>&nbsp;&nbsp;Fetching...</span>\");\n\t},\n\n\tfetchEnd: function fetchEnd() {\n\t\tthis.ui.overlay.html(\"\").removeClass(\"shown\");\n\n\t\tif (this.collection.length === 0) {\n\t\t\tthis.collection.add({\n\t\t\t\tdisplay: \"Session Start\",\n\t\t\t\tid: 0,\n\t\t\t\ttimestamp: moment().unix(),\n\t\t\t\tevent_name: \"SessionStart\"\n\t\t\t});\n\t\t}\n\n\t\tthis.timelineView = new TimelineEvents({\n\t\t\tcollection: this.collection,\n\t\t\tmodel: new Backbone.Model({\n\t\t\t\tmappedStats: _.groupBy(_.orderBy(this.collection.models, function (model) {\n\t\t\t\t\treturn model.get(\"timestamp\");\n\t\t\t\t}, \"desc\"), function (model) {\n\t\t\t\t\treturn moment.unix(model.get(\"timestamp\")).format(\"YYYYMMDD\");\n\t\t\t\t}),\n\t\t\t\tuser: this.model\n\t\t\t}),\n\t\t\tparams: this.options.params\n\t\t});\n\n\t\tthis.showChildView(\"content\", this.timelineView);\n\n\t\tthis.unbindEvents(this.collection, this.collectionEvents);\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.collection.fetch({ reset: true });\n\t},\n\n\tonBackBtnClick: function onBackBtnClick() {\n\t\tthis.trigger(\"back\");\n\t},\n\n\tupdateTimeline: function updateTimeline() {\n\t\tthis.timelineView.updateStats();\n\t}\n});\n\nvar CamUsersSelector = Backbone.Marionette.View.extend({\n\tclassName: \"cam-user-selector\",\n\n\ttemplate: require(\"../templates/cam.nunj\").camUserSelector,\n\n\tregions: {\n\t\tfilter: \".cam-user-filter-region\",\n\t\tgrid: \".cam-user-grid-region\",\n\t\ttimeline: \".cam-user-timeline-region\"\n\t},\n\n\tui: {\n\t\tselector: \"div.cam-body\",\n\t\tresult: \".result\",\n\t\ttimeline: \".cam-user-timeline-region\",\n\n\t\tfilters: \".cam-user-filter-region .filters\",\n\t\tsearchBox: \"input.text-filter-input\",\n\t\tclearSearch: \".clear-search\",\n\t\tsearchOverlay: \"div.input-overlay\",\n\n\t\tcounter: \".counter\",\n\t\tpage: \".page\",\n\t\toverlay: \".overlay\",\n\n\t\tgroups: \"select[name=groups]\",\n\t\tbooks: \"select[name=books]\",\n\t\tbooksContainer: \".books-container\",\n\t\tmonitorBooks: \"input[name='monitor_books']\",\n\t\tmonitorBtn: \".btn-monitor\",\n\t\tmonitorText: \".monitor-text\",\n\t\tconnectionLostStatus: \".connection-lost\",\n\t\titemID: \".item-id\",\n\t\tstatusFilter: \".status.filter-option\",\n\t\tsessionTime: \".session-time\",\n\t\tfilterType: \".filter-type\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.monitorBooks\": \"onMonitorBooks\",\n\t\t\"click @ui.monitorBtn\": \"onMonitorBtnClick\",\n\t\t\"change @ui.groups\": \"onGroupsChange\",\n\t\t\"change @ui.books\": \"onBooksChange\",\n\t\t\"keyup @ui.searchBox\": \"onSearchBoxChange\",\n\t\t\"click @ui.clearSearch\": \"onClearSearchClick\",\n\t\t\"click @ui.statusFilter\": \"onStatusFilterClick\"\n\t},\n\n\tuserCollectionEvents: {\n\t\trequest: \"fetchStart\",\n\t\t\"sync error\": \"userFetchEnd\"\n\t},\n\n\tresourceCollectionEvents: {\n\t\t\"sync error\": \"resourceFetchEnd\"\n\t},\n\n\tchildViewEvents: {\n\t\t\"child:select:camUser\": \"onSelect\"\n\t},\n\n\tmodelEvents: {\n\t\t\"change:wsConnected\": \"wsConnectionChanged\",\n\t\t\"change:sessionTime\": \"onSessionTimeChanged\"\n\t},\n\n\tradioEvents: (_radioEvents = {}, _defineProperty(_radioEvents, App.Events.WebsocketConnected, \"wsConnected\"), _defineProperty(_radioEvents, App.Events.WebsocketDisconnected, \"wsDisconnected\"), _defineProperty(_radioEvents, App.Events.WebsocketMessage, \"wsMessage\"), _radioEvents),\n\n\tinitialize: function initialize() {\n\t\tvar _this3 = this;\n\n\t\tthis.collectCamData = false;\n\t\tthis.params = { groups: [], book: null };\n\n\t\tthis.bindEvents(radio, this.radioEvents);\n\t\tthis.model = new Backbone.Model({ sessionTime: \"00:00:00\" });\n\t\tthis.sinceTimestamp = moment().unix();\n\t\tthis.possibleStates = [STATUS_RED, STATUS_ORANGE, STATUS_GREEN];\n\t\tthis.collections = [];\n\t\tthis.camUsersViews = [];\n\n\t\t_.each(this.possibleStates, function (state) {\n\t\t\t_this3.collections[state] = new UserCollection();\n\t\t});\n\n\t\tthis.resourceCollection = new ResourceCollection();\n\t\tthis.resourceCollectionSet = false;\n\n\t\tthis.bindEvents(this.collections[STATUS_RED], this.userCollectionEvents);\n\t\tthis.bindEvents(this.resourceCollection, this.resourceCollectionEvents);\n\n\t\tthis.statsCollection = new StatsCollection();\n\n\t\t// The websocket might already be connected before we listen for the connection event\n\t\tif (App.ws.isConnected) this.wsConnected();\n\t},\n\n\tfetchStart: function fetchStart() {\n\t\t$(\"div.no-results\", this.ui.result).remove();\n\t\tthis.ui.overlay.addClass(\"shown\").html(\"<span class='spinner'><span class='spinner-icon spinner-red'/>&nbsp;&nbsp;Fetching...</span>\");\n\t},\n\n\tuserFetchEnd: function userFetchEnd(model, err) {\n\t\tif (err && err.status) {\n\t\t\tvar errMsg = App.parseResponse(err);\n\t\t\tconsole.error(errMsg);\n\t\t\treturn;\n\t\t}\n\n\t\t$(\"div.no-results\", this.ui.result).remove();\n\t\tthis.ui.overlay.empty().removeClass(\"shown\");\n\t\tthis.updateCounter();\n\n\t\tif (this.collections[0].length === 0) {\n\t\t\tthis.ui.result.append(\"<div class='no-results'><div>No results found <span class='fal fa-frown'/></div>\\n\\t\\t\\t\\t<div class='subtext'>If you have any filters selected, try changing them, or unchoosing them</div></div>\");\n\t\t} else {\n\t\t\twindow.scrollTo(0, 0);\n\t\t}\n\n\t\tif (this.collectCamData && this.collections[0].length > 0 && this.resourceCollectionSet) {\n\t\t\tthis.getCamData();\n\t\t\tthis.collectCamData = false;\n\t\t}\n\t},\n\n\tresourceFetchEnd: function resourceFetchEnd(model, err) {\n\t\tif (err && err.status) {\n\t\t\tvar errMsg = App.parseResponse(err);\n\t\t\tconsole.error(errMsg);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.resourceCollectionSet = true;\n\n\t\tif (this.collectCamData && this.collections[0].length > 0) {\n\t\t\tthis.getCamData();\n\t\t\tthis.collectCamData = false;\n\t\t}\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this4 = this;\n\n\t\t_.each(this.possibleStates, function (state) {\n\t\t\t_this4.camUsersViews[state] = new CamUsersView({ state: state, collection: _this4.collections[state] });\n\t\t\t_this4.addRegion(\"grid\" + state, \".grid\" + state);\n\t\t\t_this4.showChildView(\"grid\" + state, _this4.camUsersViews[state]);\n\t\t});\n\n\t\tthis.ui.filterType.text(\"miEbooks\");\n\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tthis.groupOps = {\n\t\t\tmultiple: true,\n\t\t\tsort: true,\n\t\t\tserver: {\n\t\t\t\tfetch: settings.urlRoot + \"/acacia/users/\" + encodeURIComponent(user.username) + \"/camGroups\",\n\t\t\t\tkey: \"code\",\n\t\t\t\tvalue: \"name\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t},\n\t\t\tplaceholder: \"Choose a global group\",\n\t\t\twidth: 270\n\t\t};\n\n\t\tthis.bookOps = {\n\t\t\tdelayLoad: false,\n\t\t\tsort: true,\n\t\t\tsingleDeselect: true,\n\t\t\tserver: {\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/users/\" + user.username + \"/books\",\n\t\t\t\tkey: \"universal_id\",\n\t\t\t\tvalue: \"title\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t},\n\t\t\tplaceholder: \"Choose book\",\n\t\t\twidth: 500\n\t\t};\n\n\t\tif (this.options.book) {\n\t\t\tthis.ui.monitorBooks.prop(\"checked\", true);\n\t\t\tthis.ui.booksContainer.removeClass(\"hide\");\n\n\t\t\tthis.bookOps.server.default = {\n\t\t\t\tkey: \"universal_id\",\n\t\t\t\tvalue: \"title\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/epubs?singleSelect=true\",\n\t\t\t\tparams: { id: this.options.book }\n\t\t\t};\n\t\t}\n\n\t\tif (this.options.groups && this.options.groups.length > 0) {\n\t\t\tthis.groupOps.server.default = {\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/groups\",\n\t\t\t\tparams: { id: this.options.groups }\n\t\t\t};\n\t\t}\n\n\t\tthis.bookSelect = new Selectra(this.bookOps);\n\n\t\tthis.bookSelect.show({ el: this.ui.books });\n\n\t\tthis.groupSelect = new Selectra(this.groupOps);\n\n\t\tthis.groupSelect.show({ el: this.ui.groups });\n\t},\n\n\tonMonitorBooks: function onMonitorBooks() {\n\t\tthis.onSettingChange();\n\t\tthis.bookSelect.model.set({ disabled: !this.ui.monitorBooks.prop(\"checked\") });\n\t\tif (this.ui.monitorBooks.prop(\"checked\")) {\n\t\t\tthis.ui.booksContainer.removeClass(\"hide\");\n\t\t\tthis.ui.filterType.text(\"book\");\n\t\t} else {\n\t\t\tthis.ui.booksContainer.addClass(\"hide\");\n\t\t\tthis.ui.filterType.text(\"miEbooks\");\n\t\t\tthis.bookSelect.destroy();\n\t\t\tdelete this.bookOps.server.default;\n\t\t\tthis.bookSelect = new Selectra(this.bookOps);\n\t\t\tthis.bookSelect.show({ el: this.ui.books });\n\t\t\twindow.history.pushState(null, \"\", window.location.href.split(\"?\")[0] + \"?\" + require(\"querystring\").stringify({ groups: this.params.groups }));\n\t\t\tthis.onGroupsChange();\n\t\t\tthis.onBooksChange();\n\t\t}\n\t},\n\n\tonSelect: function onSelect(model) {\n\t\tmodel.set(\"sinceTimestamp\", this.sinceTimestamp);\n\t\tthis.selectedUser = model;\n\t\tthis.timelineView = new CAMTimeline({ model: model, params: this.params });\n\n\t\tthis.showChildView(\"timeline\", this.timelineView);\n\n\t\tthis.listenTo(this.timelineView, \"back\", this.onTimelineBackClick.bind(this));\n\n\t\tthis.ui.selector.addClass(\"hide\");\n\t\tthis.ui.timeline.removeClass(\"hide\");\n\t},\n\n\tonTimelineBackClick: function onTimelineBackClick() {\n\t\tthis.ui.selector.removeClass(\"hide\");\n\t\tthis.ui.timeline.addClass(\"hide\");\n\t\tthis.timelineView.destroy();\n\t},\n\n\tupdateCounter: function updateCounter() {\n\t\tvar _this5 = this;\n\n\t\tvar totalUsers = 0,\n\t\t    users = 0,\n\t\t    label = \"User\";\n\t\tvar visibleStates = [];\n\n\t\t$(\".selected-status\").each(function (item, elem) {\n\t\t\tvisibleStates.push(parseInt($(elem).attr(\"data-status\"), 10));\n\t\t});\n\n\t\t_.each(this.possibleStates, function (state) {\n\t\t\tif (_.includes(visibleStates, state)) {\n\t\t\t\tusers += _this5.collections[state].where({ hide: false }).length;\n\t\t\t\ttotalUsers += _this5.collections[state].length;\n\t\t\t}\n\t\t});\n\n\t\tif (totalUsers !== 1) label = \"Users\";\n\n\t\tvar counterText = \"<span class='counterInfo'>\" + users + \"/\" + totalUsers + \" \" + label + \"</span>\";\n\t\tthis.ui.counter.html(counterText);\n\n\t\tthis.updateStatusPercentage();\n\t},\n\n\tonSettingChange: function onSettingChange() {\n\t\tvar _this6 = this;\n\n\t\tif (this.ui.monitorText.hasClass(\"hide\")) {\n\t\t\tthis.hideStopMonitor();\n\t\t\tthis.resourceCollection.reset();\n\n\t\t\t_.each(this.possibleStates, function (state) {\n\t\t\t\t_this6.collections[state].reset();\n\t\t\t});\n\n\t\t\tthis.collectCamData = false;\n\t\t\tthis.ui.selector.addClass(\"hide\");\n\t\t\tthis.ui.timeline.addClass(\"hide\");\n\t\t\tif (this.timelineView) this.timelineView.destroy();\n\n\t\t\tthis.ui.statusFilter.addClass(\"selected-status\");\n\t\t\tthis.stopTimer();\n\t\t}\n\t},\n\n\thideStopMonitor: function hideStopMonitor() {\n\t\tthis.ui.monitorBtn.find(\".monitor-text\").removeClass(\"hide\");\n\t\tthis.ui.monitorBtn.find(\".restart-text\").addClass(\"hide\");\n\t\tthis.ui.monitorBtn.removeClass(\"alert\");\n\t\tthis.ui.monitorBtn.addClass(\"success\");\n\t},\n\n\tshowStopMonitor: function showStopMonitor() {\n\t\tthis.ui.monitorBtn.find(\".restart-text\").removeClass(\"hide\");\n\t\tthis.ui.monitorBtn.find(\".monitor-text\").addClass(\"hide\");\n\t\tthis.ui.monitorBtn.removeClass(\"success\");\n\t\tthis.ui.monitorBtn.addClass(\"alert\");\n\t},\n\n\tonGroupsChange: function onGroupsChange() {\n\t\tthis.params.groups = _.map(this.groupSelect.collection.where({ selected: true }), function (group) {\n\t\t\treturn group.get(\"code\");\n\t\t});\n\t\tthis.onSettingChange();\n\n\t\tif (!this.initialGroupLoad && this.options.groups) {\n\t\t\tthis.onMonitorBtnClick();\n\t\t\tthis.initialGroupLoad = true;\n\n\t\t\tif (this.params.groups) this.bookSelect.collection.fetch({ reset: true, data: { fetch: true, groups: this.params.groups, page: 1 } });\n\t\t}\n\n\t\tif (this.params.groups) this.bookSelect.collection.setServerFilters({ groups: this.params.groups, paged: true });else this.bookSelect.collection.setServerFilters({});\n\n\t\tvar qParams = {};\n\n\t\tif (this.params.groups.length > 0) qParams.groups = this.params.groups;\n\t\tif (this.params.book !== null) qParams.book = this.params.book;\n\n\t\twindow.history.pushState(null, \"\", window.location.href.split(\"?\")[0] + \"?\" + require(\"querystring\").stringify(qParams));\n\t},\n\n\tonBooksChange: function onBooksChange() {\n\t\tthis.onSettingChange();\n\n\t\tvar selectedBook = this.bookSelect.getSelected();\n\n\t\tthis.params.book = selectedBook && selectedBook.selected ? selectedBook.universal_id : null;\n\n\t\tif (!this.initialBookLoad && this.options.book) {\n\t\t\tthis.onMonitorBtnClick();\n\t\t\tthis.initialBookLoad = true;\n\n\t\t\tif (this.params.book) this.groupSelect.pagedCollection.fetch({ reset: true, data: { book: this.params.book, page: 1 } });\n\t\t}\n\n\t\tif (this.params.book) this.groupSelect.pagedCollection.setServerFilters({ book: this.params.book, withCustom: true });else this.groupSelect.pagedCollection.setServerFilters({});\n\n\t\tvar qParams = {};\n\n\t\tif (this.params.groups.length > 0) qParams.groups = this.params.groups;\n\t\tif (this.params.book !== null) qParams.book = this.params.book;\n\n\t\twindow.history.pushState(null, \"\", window.location.href.split(\"?\")[0] + \"?\" + require(\"querystring\").stringify(qParams));\n\t\tthis.bookSelect.model.set({ disabled: !this.ui.monitorBooks.prop(\"checked\") });\n\t},\n\n\tonMonitorBtnClick: function onMonitorBtnClick() {\n\t\tvar _this7 = this;\n\n\t\t// Show error if nothing selected\n\t\tif (this.groupSelect.collection.length === 0 && (!this.bookSelect.getSelected() || !this.bookSelect.getSelected().selected) && !this.options.groups) {\n\t\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\t\tcontent: \"Please select a group or book\",\n\t\t\t\ticon: \"fa-ban\",\n\t\t\t\ticonColour: \"red\",\n\t\t\t\thost: \"#modals\"\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tthis.ui.selector.removeClass(\"hide\");\n\t\tthis.monitoring = true;\n\t\tthis.collectCamData = true;\n\n\t\tif (this.ui.monitorBtn.find(\".restart-text\").hasClass(\"hide\")) {\n\t\t\tthis.showStopMonitor();\n\t\t\tvar resourceParams = { ids: [] };\n\n\t\t\tif (this.params.groups.length > 0) resourceParams.ids = this.params.groups;\n\n\t\t\tif (!_.isNil(this.params.book)) resourceParams.ids.push(this.params.book);\n\n\t\t\tthis.resourceCollection.fetch({ reset: true, data: $.param(resourceParams) });\n\t\t\tthis.collections[0].fetch({ reset: true, data: $.param(this.params) });\n\t\t\tthis.ui.selector.removeClass(\"hide\");\n\t\t\tthis.startTimer();\n\t\t\tthis.sinceTimestamp = moment().unix();\n\t\t\tthis.ui.statusFilter.addClass(\"selected-status\");\n\t\t\tthis.onStatusFilterClick();\n\t\t} else {\n\t\t\tthis.hideStopMonitor();\n\t\t\tthis.resourceCollection.reset();\n\t\t\t_.each(this.possibleStates, function (state) {\n\t\t\t\t_this7.collections[state].reset();\n\t\t\t});\n\n\t\t\tthis.collectCamData = false;\n\t\t\tthis.ui.selector.addClass(\"hide\");\n\t\t\tthis.ui.timeline.addClass(\"hide\");\n\t\t\tthis.stopTimer();\n\t\t}\n\n\t\t// set filterType to book or group\n\t\tif (this.params.book && this.ui.monitorBooks.prop(\"checked\")) this.ui.filterType.text(\"book\");else this.ui.filterType.text(\"group\");\n\t},\n\n\tonStatusFilterClick: function onStatusFilterClick(event) {\n\t\tif (event) {\n\t\t\tvar el = $(event.currentTarget);\n\t\t\tel.toggleClass(\"selected-status\");\n\t\t}\n\n\t\t$(\".cam-user-grid-region\").addClass(\"hide\");\n\t\t$(\".selected-status\").each(function (item, elem) {\n\t\t\t$(\".grid\" + $(elem).data(\"status\")).removeClass(\"hide\");\n\t\t});\n\n\t\tthis.updateCounter();\n\t},\n\n\tonSearchBoxChange: function onSearchBoxChange() {\n\t\tvar _this8 = this;\n\n\t\tif (this.ui.searchBox.val().length > 0) this.ui.clearSearch.removeClass(\"hide\");else this.ui.clearSearch.addClass(\"hide\");\n\n\t\t_.each(this.possibleStates, function (state) {\n\t\t\t_this8.collections[state].byTextSearch(_this8.ui.searchBox.val());\n\t\t});\n\n\t\tthis.updateCounter();\n\t},\n\n\tonClearSearchClick: function onClearSearchClick() {\n\t\tvar _this9 = this;\n\n\t\tthis.ui.searchBox.val(\"\");\n\t\t_.each(this.possibleStates, function (state) {\n\t\t\t_this9.collections[state].byTextSearch(\"\");\n\t\t});\n\n\t\tthis.updateCounter();\n\t},\n\n\twsConnected: function wsConnected() {\n\t\tvar _this10 = this;\n\n\t\tvar completeConnection = function completeConnection() {\n\t\t\t_this10.model.set({ wsConnected: true });\n\t\t};\n\n\t\treturn App.ws.getID().then(function (id) {\n\t\t\t_this10.model.set({ websocket_id: id });\n\t\t\treturn completeConnection();\n\t\t});\n\t},\n\n\twsDisconnected: function wsDisconnected() {\n\t\tthis.model.set({ wsConnected: false });\n\t},\n\n\twsConnectionChanged: function wsConnectionChanged() {\n\t\tvar _this11 = this;\n\n\t\tvar collectData = false;\n\n\t\t_.each(this.possibleStates, function (state) {\n\t\t\tif (_this11.collections[state].length > 0) collectData = true;\n\t\t});\n\n\t\tif (this.model.get(\"wsConnected\") && collectData) {\n\t\t\tthis.getCamData();\n\t\t} else {\n\t\t\t// User got logged out.\n\t\t\tif (!App.Session.get(\"authenticated\")) return;\n\n\t\t\tthis.model.unset(\"websocket_id\");\n\t\t\tthis.model.unset(\"spark\");\n\n\t\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\t\tcontent: \"Connection lost\",\n\t\t\t\ticon: \"fa-wifi-slash\",\n\t\t\t\ticonColour: \"red\",\n\t\t\t\thost: \".modal-host\"\n\t\t\t});\n\t\t}\n\t},\n\n\twsMessage: function wsMessage(message) {\n\t\t// Check if usersHash.username exists in users selector before addUserStat\n\t\tif (message.camData && message.userHash) this.addUserStat(message.userHash);\n\t\tif (message.camData && message.userHash && this.timelineView && this.timelineView.isRendered() && message.userHash.username === this.timelineView.model.get(\"username\")) this.timelineView.updateTimeline();\n\t\tif (message.camData && message.expire) this.onExpire();\n\t},\n\n\tonExpire: function onExpire() {\n\t\tthis.getCamData();\n\t},\n\n\tgetCamData: function getCamData() {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tApp.ws.websocket.write({\n\t\t\tcam: true,\n\t\t\taction: \"getCamData\",\n\t\t\tuser: user.username,\n\t\t\tparams: this.params,\n\t\t\tusers: this.collections,\n\t\t\troom: (this.params.groups ? this.params.groups.join(\":\") : \"\") + (this.params.book ? \"::\" + this.params.book : \"\")\n\t\t});\n\t},\n\n\taddUserStat: function addUserStat(stat) {\n\t\tvar _this12 = this;\n\n\t\tvar existingStat = _.find(this.statsCollection.models, function (statModel) {\n\t\t\treturn statModel.get(\"username\") === stat.username && statModel.get(\"time\") === stat.time && statModel.get(\"state\") === stat.state;\n\t\t});\n\n\t\tif (existingStat) return;\n\n\t\tif (stat.state === \"in app\" && stat.screen === \"group list\" && (stat.prev_state === \"in book\" || stat[\"prev state\"] === \"in book\")) return;\n\n\t\t// Do not add troubleshooter stat if it was opened from resource or group\n\t\tif (stat.state === \"in app\" && stat.screen === \"troubleshooter\" && (_.includes([\"in resource\", \"in group\"], stat.prev_state) || _.includes([\"in resource\", \"in group\"], stat[\"prev state\"]))) return;\n\n\t\tthis.statsCollection.add(new StatsModel(stat));\n\t\t// Find user current collection\n\t\tvar result = {};\n\t\t_.each(this.possibleStates, function (state) {\n\t\t\tvar model = _this12.collections[state].findWhere({ username: stat.username });\n\n\t\t\tif (model) result.user = model;\n\t\t});\n\n\t\tif (!result.user) return;\n\n\t\tvar userStats = _.filter(this.statsCollection.models, function (statModel) {\n\t\t\treturn statModel.get(\"username\") === result.user.get(\"username\");\n\t\t});\n\n\t\tvar latestUserStat = _.first(_.orderBy(userStats, function (statModel) {\n\t\t\treturn [statModel.get(\"time\"), statModel.get(\"timestamp\")];\n\t\t}, \"desc\"));\n\n\t\tvar prevState = result.user.get(\"status\");\n\n\t\t// user not in group or book or related resource\n\t\tvar status = STATUS_RED;\n\n\t\t// check whether in book\n\t\tif (this.params.book) {\n\t\t\tvar outOfBookStates = [\"focus lost\", \"in app\", \"app closed\", \"library\", \"lastwill\", \"in group\", \"crashed\", \"started\"];\n\n\t\t\tvar selectedBookId = this.bookSelect.getSelected().universal_id;\n\n\t\t\tif (latestUserStat.get(\"state\") === \"in book\" && latestUserStat.get(\"book_id\") === selectedBookId || latestUserStat.get(\"state\") === \"in resource\" && this.resourceCollection.where({ attachment_id: latestUserStat.get(\"attachment_id\") }).length > 0) {\n\t\t\t\tif (_.find(userStats, function (statModel) {\n\t\t\t\t\treturn _.includes(outOfBookStates, statModel.get(\"state\"));\n\t\t\t\t})) status = STATUS_ORANGE;else status = STATUS_GREEN;\n\t\t\t} else {\n\t\t\t\tstatus = STATUS_RED;\n\t\t\t}\n\t\t}\n\t\t// check whether in specific group or group_book\n\t\telse if (latestUserStat.get(\"state\") === \"in group\" || latestUserStat.get(\"state\") === \"in resource\" || latestUserStat.get(\"state\") === \"in book\" && this.bookSelect.collection.where({ universal_id: latestUserStat.get(\"book_id\") }).length > 0) {\n\t\t\t\tvar inGroupStats = _.filter(userStats, function (statModel) {\n\t\t\t\t\treturn (\n\t\t\t\t\t// matching monitored group_id\n\t\t\t\t\tstatModel.get(\"state\") === \"in group\" && _.includes(_this12.params.groups, statModel.get(\"group_id\")) ||\n\t\t\t\t\t// matching monitored resource / book linked to group\n\t\t\t\t\tstatModel.get(\"state\") === \"in resource\" || statModel.get(\"state\") === \"in book\") && (_.includes(_this12.params.groups, statModel.get(\"group_id\")) || _.includes(_this12.params.groups, statModel.get(\"prev group_id\")) || _this12.bookSelect.collection.where({ universal_id: statModel.get(\"book_id\") }).length > 0 || _this12.resourceCollection.where({ _id: statModel.get(\"resource_id\") }).length > 0);\n\t\t\t\t});\n\n\t\t\t\tvar inBookStats = _.filter(userStats, function (statModel) {\n\t\t\t\t\treturn (statModel.get(\"state\") === \"in book\" || statModel.get(\"state\") === \"in resource\") && (statModel.get(\"book_id\") === _this12.params.book || statModel.get(\"prev_book_id\") === _this12.params.book || _this12.resourceCollection.where({ _id: statModel.get(\"resource_id\") }).length > 0);\n\t\t\t\t});\n\n\t\t\t\t// if userStats includes anything else than \"in group\" (for that group) or \"in book\" (for that book), make status ORANGE\n\t\t\t\tif (inGroupStats.length > 0 && inGroupStats.length < userStats.length || inBookStats.length > 0 && inBookStats.length < userStats.length) {\n\t\t\t\t\tif (inGroupStats.length !== 0 && inGroupStats.length === userStats.length || inBookStats.length !== 0 && inBookStats.length === userStats.length) status = STATUS_GREEN;else if (inGroupStats.length !== 0 && _.find(inGroupStats, function (groupStat) {\n\t\t\t\t\t\treturn groupStat.get(\"group_id\") === latestUserStat.get(\"group_id\");\n\t\t\t\t\t})) status = STATUS_ORANGE;else if (inBookStats.length !== 0 && _.find(inBookStats, function (bookStat) {\n\t\t\t\t\t\treturn bookStat.get(\"group_id\") === latestUserStat.get(\"group_id\");\n\t\t\t\t\t})) status = STATUS_ORANGE;else status = STATUS_RED;\n\t\t\t\t} else if (inGroupStats.length !== 0 && _.find(inGroupStats, function (groupStat) {\n\t\t\t\t\treturn groupStat.get(\"group_id\") === latestUserStat.get(\"group_id\");\n\t\t\t\t})) {\n\t\t\t\t\tstatus = STATUS_GREEN;\n\t\t\t\t} else if (inBookStats.length !== 0 && _.find(inBookStats, function (bookStat) {\n\t\t\t\t\treturn bookStat.get(\"group_id\") === latestUserStat.get(\"group_id\");\n\t\t\t\t})) {\n\t\t\t\t\tstatus = STATUS_GREEN;\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Already in the right state\n\t\tif (prevState === status) return;\n\n\t\tresult.user.set({ status: status });\n\t\tthis.collections[status].add(result.user);\n\t\tthis.collections[prevState].remove(result.user);\n\n\t\tthis.updateStatusPercentage();\n\t},\n\n\tupdateStatusPercentage: function updateStatusPercentage() {\n\t\tvar _this13 = this;\n\n\t\tvar percentages = { total: 0 };\n\t\t_.each(this.possibleStates, function (state) {\n\t\t\tpercentages[state] = _this13.collections[state].length;\n\t\t\tpercentages.total += _this13.collections[state].length;\n\t\t});\n\n\t\t_.each(this.possibleStates, function (state) {\n\t\t\tif (percentages.total > 0) $(\".status-filter-\" + state).find(\".status-percentage\").text(\"(\" + Math.round(percentages[state] / percentages.total * 100) + \"%)\");else $(\".status-filter-\" + state).find(\".status-percentage\").text(\"(\" + percentages[state] + \"%)\");\n\t\t});\n\t},\n\n\tstartTimer: function startTimer() {\n\t\tvar _this14 = this;\n\n\t\tvar pad = function pad(val) {\n\t\t\treturn val < 10 ? \"0\" + val : val;\n\t\t};\n\t\tthis.sessionTimer = setInterval(function () {\n\t\t\tvar time_shown = _this14.model.get(\"sessionTime\");\n\t\t\tvar time_chunks = time_shown.split(\":\");\n\t\t\tvar hour = void 0,\n\t\t\t    mins = void 0,\n\t\t\t    secs = void 0;\n\n\t\t\thour = Number(time_chunks[0]);\n\t\t\tmins = Number(time_chunks[1]);\n\t\t\tsecs = Number(time_chunks[2]);\n\t\t\tsecs++;\n\t\t\tif (secs === 60) {\n\t\t\t\tsecs = 0;\n\t\t\t\tmins = mins + 1;\n\t\t\t}\n\t\t\tif (mins === 60) {\n\t\t\t\tmins = 0;\n\t\t\t\thour = hour + 1;\n\t\t\t}\n\t\t\tif (hour === 13) hour = 1;\n\t\t\tif (hour < 10) hour = \"0\" + hour;\n\n\t\t\t_this14.model.set(\"sessionTime\", hour + \":\" + pad(mins) + \":\" + pad(secs));\n\t\t}, 1000);\n\n\t\tthis.sinceTimestamp = moment().unix();\n\t\tthis.statsCollection.reset();\n\t},\n\n\tstopTimer: function stopTimer() {\n\t\tclearInterval(this.sessionTimer);\n\t\tthis.model.set(\"sessionTime\", \"00:00:00\");\n\t},\n\n\tonSessionTimeChanged: function onSessionTimeChanged() {\n\t\tthis.ui.sessionTime.text(this.model.get(\"sessionTime\"));\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tvar _this15 = this;\n\n\t\tthis.stopTimer();\n\t\tthis.stopMoniter(this.params);\n\t\tthis.bookSelect.destroy();\n\t\tthis.groupSelect.destroy();\n\t\t_.each(this.possibleStates, function (state) {\n\t\t\t_this15.camUsersViews[state].destroy();\n\t\t});\n\t},\n\n\tstopMoniter: function stopMoniter(params) {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tif (App.ws.websocket) {\n\t\t\tApp.ws.websocket.write({\n\t\t\t\tcam: true,\n\t\t\t\taction: \"stopMoniter\",\n\t\t\t\tparams: params,\n\t\t\t\tuser: user.username\n\t\t\t});\n\t\t}\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"content cam-user-selector-layout\",\n\n\ttemplate: require(\"../templates/cam.nunj\").layout,\n\n\tregions: {\n\t\tselector: \".cam-user-selector-region\"\n\t},\n\n\tonRender: function onRender() {\n\t\tvar qs = require(\"querystring\").parse((window.location.search || \" \").slice(1));\n\t\tif (!qs.groups) {\n\t\t\tqs.groups = qs[\"groups[]\"];\n\t\t\tdelete qs[\"groups[]\"];\n\t\t}\n\n\t\tthis.selectorView = new CamUsersSelector(qs);\n\t\tthis.showChildView(\"selector\", this.selectorView);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNhbS5qcyJdLCJuYW1lcyI6WyIkIiwicmVxdWlyZSIsIl8iLCJCYWNrYm9uZSIsIkFwcCIsInNldHRpbmdzIiwiU2VsZWN0cmEiLCJtb21lbnQiLCJyYWRpbyIsIlJhZGlvIiwiY2hhbm5lbCIsImV2ZW50QnVzIiwiU1RBVFVTX1JFRCIsIlNUQVRVU19PUkFOR0UiLCJTVEFUVVNfR1JFRU4iLCJNb2RlbCIsIkVwb3h5IiwiZXh0ZW5kIiwiaWRBdHRyaWJ1dGUiLCJ1cmxSb290IiwiZGVmYXVsdHMiLCJoaWRlIiwiVXNlckNvbGxlY3Rpb24iLCJDb2xsZWN0aW9uIiwibW9kZWwiLCJtb2RlIiwiY29tcGFyYXRvciIsInVzZXIiLCJnZXQiLCJ0b0xvd2VyIiwidXJsIiwiYnlUZXh0U2VhcmNoIiwicXVlcnkiLCJmaWx0ZXIiLCJpbmNsdWRlcyIsInNldCIsImxlbmd0aCIsIlJlc291cmNlQ29sbGVjdGlvbiIsIkNhbVVzZXJWaWV3IiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJ0ZW1wbGF0ZSIsInVzZXJWaWV3IiwidWkiLCJ0eXBlIiwiaW5mbyIsImNhbVVzZXJUb29sdGlwIiwidXNlclN0YXR1cyIsIm1vZGVsRXZlbnRzIiwiZXZlbnRzIiwiY2xpY2siLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZUNvbnRleHQiLCJzdGF0dXMiLCJzZXJpYWxpemVEYXRhIiwidG9KU09OIiwidmlld0NhbVVzZXIiLCJldmVudCIsInN0b3BQcm9wYWdhdGlvbiIsInByZXZlbnREZWZhdWx0IiwidHJpZ2dlciIsIm9uSGlkZUNoYW5nZSIsIiRlbCIsImFkZENsYXNzIiwicmVtb3ZlQ2xhc3MiLCJDYW1Vc2Vyc1ZpZXciLCJDb2xsZWN0aW9uVmlldyIsImNoaWxkVmlldyIsImNoaWxkVmlld1RyaWdnZXJzIiwib3B0aW9ucyIsInN0YXRlIiwiU3RhdHNNb2RlbCIsImNvbXB1dGVkcyIsImZvbnRBd2Vzb21lTmFtZSIsImV2ZW50X25hbWUiLCJzdGF0TmFtZSIsImRpc3BsYXlUaW1lIiwidW5peCIsImZvcm1hdCIsImZyb21Ob3ciLCJTdGF0VmlldyIsInRhZ05hbWUiLCJzdGF0IiwiZnJvbU5vd0RhdGUiLCJmb3JtYXREYXRlIiwiZGF0ZSIsImRpc3BsYXkiLCJldmVudF90aW1lIiwidGltZXN0YW1wIiwiaW5pdGlhbGl6ZSIsImxpc3RlblRvIiwiRXZlbnRzIiwiQ0FNVGltZWxpbmVDaGFuZ2UiLCJvblRpbWVsaW5lQ2hhbmdlIiwiYmluZCIsImh0bWwiLCJEYXlWaWV3IiwiZGF5U3RhdHMiLCJUaW1lbGluZUV2ZW50cyIsImJhY2tCdG4iLCJjb2xsZWN0aW9uRXZlbnRzIiwiYmluZEV2ZW50cyIsImNvbGxlY3Rpb24iLCJzdGF0Vmlld3MiLCJzdGFydFRpbWUiLCJzaW5jZVRpbWVzdGFtcCIsInBhcmFtcyIsImZldGNoRW5kIiwiZnVsbENvbGxlY3Rpb24iLCJjb25jYXQiLCJtb2RlbHMiLCJlYWNoIiwib3JkZXJCeSIsInZpZXciLCJmaW5kIiwic3RhdFZpZXciLCJwdXNoIiwiY2hpbGRyZW4iLCJhZnRlciIsInJlbmRlciIsImVsIiwib25SZW5kZXIiLCJzdGF0cyIsImRheSIsImRheVZpZXciLCJhcHBlbmQiLCJ1cGRhdGVTdGF0cyIsImZpcnN0IiwiZmV0Y2giLCJyZXNldCIsIlN0YXRzQ29sbGVjdGlvbiIsImRhdGEiLCJvcHRzIiwidXNlcm5hbWUiLCJpdGVtIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiQ0FNVGltZWxpbmUiLCJ0aW1lbGluZSIsInJlc3VsdCIsImxpdmVEYXRhIiwib3ZlcmxheSIsInJlZ2lvbnMiLCJjb250ZW50IiwicmVxdWVzdCIsImZldGNoU3RhcnQiLCJhZGQiLCJpZCIsInRpbWVsaW5lVmlldyIsIm1hcHBlZFN0YXRzIiwiZ3JvdXBCeSIsInNob3dDaGlsZFZpZXciLCJ1bmJpbmRFdmVudHMiLCJvbkJhY2tCdG5DbGljayIsInVwZGF0ZVRpbWVsaW5lIiwiQ2FtVXNlcnNTZWxlY3RvciIsImNhbVVzZXJTZWxlY3RvciIsImdyaWQiLCJzZWxlY3RvciIsImZpbHRlcnMiLCJzZWFyY2hCb3giLCJjbGVhclNlYXJjaCIsInNlYXJjaE92ZXJsYXkiLCJjb3VudGVyIiwicGFnZSIsImdyb3VwcyIsImJvb2tzIiwiYm9va3NDb250YWluZXIiLCJtb25pdG9yQm9va3MiLCJtb25pdG9yQnRuIiwibW9uaXRvclRleHQiLCJjb25uZWN0aW9uTG9zdFN0YXR1cyIsIml0ZW1JRCIsInN0YXR1c0ZpbHRlciIsInNlc3Npb25UaW1lIiwiZmlsdGVyVHlwZSIsInVzZXJDb2xsZWN0aW9uRXZlbnRzIiwicmVzb3VyY2VDb2xsZWN0aW9uRXZlbnRzIiwiY2hpbGRWaWV3RXZlbnRzIiwicmFkaW9FdmVudHMiLCJXZWJzb2NrZXRDb25uZWN0ZWQiLCJXZWJzb2NrZXREaXNjb25uZWN0ZWQiLCJXZWJzb2NrZXRNZXNzYWdlIiwiY29sbGVjdENhbURhdGEiLCJib29rIiwicG9zc2libGVTdGF0ZXMiLCJjb2xsZWN0aW9ucyIsImNhbVVzZXJzVmlld3MiLCJyZXNvdXJjZUNvbGxlY3Rpb24iLCJyZXNvdXJjZUNvbGxlY3Rpb25TZXQiLCJzdGF0c0NvbGxlY3Rpb24iLCJ3cyIsImlzQ29ubmVjdGVkIiwid3NDb25uZWN0ZWQiLCJyZW1vdmUiLCJ1c2VyRmV0Y2hFbmQiLCJlcnIiLCJlcnJNc2ciLCJwYXJzZVJlc3BvbnNlIiwiY29uc29sZSIsImVycm9yIiwiZW1wdHkiLCJ1cGRhdGVDb3VudGVyIiwid2luZG93Iiwic2Nyb2xsVG8iLCJnZXRDYW1EYXRhIiwicmVzb3VyY2VGZXRjaEVuZCIsImFkZFJlZ2lvbiIsInRleHQiLCJSZXF1ZXN0cyIsIkN1cnJlbnRVc2VyIiwiZ3JvdXBPcHMiLCJtdWx0aXBsZSIsInNvcnQiLCJzZXJ2ZXIiLCJrZXkiLCJ2YWx1ZSIsInBhZ2luZyIsInBhZ2VTaXplIiwiaW5maW5pdGUiLCJwbGFjZWhvbGRlciIsIndpZHRoIiwiYm9va09wcyIsImRlbGF5TG9hZCIsInNpbmdsZURlc2VsZWN0IiwicHJvcCIsImRlZmF1bHQiLCJib29rU2VsZWN0Iiwic2hvdyIsImdyb3VwU2VsZWN0Iiwib25Nb25pdG9yQm9va3MiLCJvblNldHRpbmdDaGFuZ2UiLCJkaXNhYmxlZCIsImRlc3Ryb3kiLCJoaXN0b3J5IiwicHVzaFN0YXRlIiwibG9jYXRpb24iLCJocmVmIiwic3BsaXQiLCJzdHJpbmdpZnkiLCJvbkdyb3Vwc0NoYW5nZSIsIm9uQm9va3NDaGFuZ2UiLCJvblNlbGVjdCIsInNlbGVjdGVkVXNlciIsIm9uVGltZWxpbmVCYWNrQ2xpY2siLCJ0b3RhbFVzZXJzIiwidXNlcnMiLCJsYWJlbCIsInZpc2libGVTdGF0ZXMiLCJlbGVtIiwicGFyc2VJbnQiLCJhdHRyIiwid2hlcmUiLCJjb3VudGVyVGV4dCIsInVwZGF0ZVN0YXR1c1BlcmNlbnRhZ2UiLCJoYXNDbGFzcyIsImhpZGVTdG9wTW9uaXRvciIsInN0b3BUaW1lciIsInNob3dTdG9wTW9uaXRvciIsIm1hcCIsInNlbGVjdGVkIiwiZ3JvdXAiLCJpbml0aWFsR3JvdXBMb2FkIiwib25Nb25pdG9yQnRuQ2xpY2siLCJzZXRTZXJ2ZXJGaWx0ZXJzIiwicGFnZWQiLCJxUGFyYW1zIiwic2VsZWN0ZWRCb29rIiwiZ2V0U2VsZWN0ZWQiLCJ1bml2ZXJzYWxfaWQiLCJpbml0aWFsQm9va0xvYWQiLCJwYWdlZENvbGxlY3Rpb24iLCJ3aXRoQ3VzdG9tIiwiQ29tbWFuZHMiLCJUb2FzdCIsImljb24iLCJpY29uQ29sb3VyIiwiaG9zdCIsIm1vbml0b3JpbmciLCJyZXNvdXJjZVBhcmFtcyIsImlkcyIsImlzTmlsIiwicGFyYW0iLCJzdGFydFRpbWVyIiwib25TdGF0dXNGaWx0ZXJDbGljayIsImN1cnJlbnRUYXJnZXQiLCJ0b2dnbGVDbGFzcyIsIm9uU2VhcmNoQm94Q2hhbmdlIiwidmFsIiwib25DbGVhclNlYXJjaENsaWNrIiwiY29tcGxldGVDb25uZWN0aW9uIiwiZ2V0SUQiLCJ0aGVuIiwid2Vic29ja2V0X2lkIiwid3NEaXNjb25uZWN0ZWQiLCJ3c0Nvbm5lY3Rpb25DaGFuZ2VkIiwiY29sbGVjdERhdGEiLCJTZXNzaW9uIiwidW5zZXQiLCJ3c01lc3NhZ2UiLCJtZXNzYWdlIiwiY2FtRGF0YSIsInVzZXJIYXNoIiwiYWRkVXNlclN0YXQiLCJpc1JlbmRlcmVkIiwiZXhwaXJlIiwib25FeHBpcmUiLCJ3ZWJzb2NrZXQiLCJ3cml0ZSIsImNhbSIsImFjdGlvbiIsInJvb20iLCJqb2luIiwiZXhpc3RpbmdTdGF0Iiwic3RhdE1vZGVsIiwidGltZSIsInNjcmVlbiIsInByZXZfc3RhdGUiLCJmaW5kV2hlcmUiLCJ1c2VyU3RhdHMiLCJsYXRlc3RVc2VyU3RhdCIsInByZXZTdGF0ZSIsIm91dE9mQm9va1N0YXRlcyIsInNlbGVjdGVkQm9va0lkIiwiYXR0YWNobWVudF9pZCIsImluR3JvdXBTdGF0cyIsIl9pZCIsImluQm9va1N0YXRzIiwiZ3JvdXBTdGF0IiwiYm9va1N0YXQiLCJwZXJjZW50YWdlcyIsInRvdGFsIiwiTWF0aCIsInJvdW5kIiwicGFkIiwic2Vzc2lvblRpbWVyIiwic2V0SW50ZXJ2YWwiLCJ0aW1lX3Nob3duIiwidGltZV9jaHVua3MiLCJob3VyIiwibWlucyIsInNlY3MiLCJOdW1iZXIiLCJjbGVhckludGVydmFsIiwib25TZXNzaW9uVGltZUNoYW5nZWQiLCJvbkJlZm9yZURlc3Ryb3kiLCJzdG9wTW9uaXRlciIsIm1vZHVsZSIsImV4cG9ydHMiLCJsYXlvdXQiLCJxcyIsInBhcnNlIiwic2VhcmNoIiwic2xpY2UiLCJzZWxlY3RvclZpZXciXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLElBQUlELFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUUsV0FBV0YsUUFBUSxVQUFSLENBQWpCOztBQUVBLElBQU1HLE1BQU1ILFFBQVEsYUFBUixDQUFaO0FBQ0EsSUFBTUksV0FBV0osUUFBUSxjQUFSLENBQWpCOztBQUVBLElBQU1LLFdBQVdMLFFBQVEsb0JBQVIsQ0FBakI7QUFDQSxJQUFNTSxTQUFTTixRQUFRLFFBQVIsQ0FB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RUFBckIsQ0FBcEI7QUFDQSxPQUFLdk0sYUFBTCxDQUFtQixVQUFuQixFQUErQixLQUFLMk0sWUFBcEM7QUFDQTtBQWxCK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoiY2FtLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5cbmNvbnN0IEFwcCA9IHJlcXVpcmUoXCIuLi8uLi9pbmRleFwiKTtcbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxuY29uc3QgU2VsZWN0cmEgPSByZXF1aXJlKFwiLi4vLi4vbGliL3NlbGVjdHJhXCIpO1xuY29uc3QgbW9tZW50ID0gcmVxdWlyZShcIm1vbWVudFwiKTtcblxuY29uc3QgcmFkaW8gPSBCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZ2xvYmFsXCIpO1xuY29uc3QgZXZlbnRCdXMgPSByZXF1aXJlKFwiLi9jb25zb2xlL2V2ZW50QnVzXCIpO1xuXG5jb25zdCBTVEFUVVNfUkVEID0gMDtcbmNvbnN0IFNUQVRVU19PUkFOR0UgPSAxO1xuY29uc3QgU1RBVFVTX0dSRUVOID0gMjtcblxuY29uc3QgTW9kZWwgPSBCYWNrYm9uZS5FcG94eS5Nb2RlbC5leHRlbmQoe1xuXHRpZEF0dHJpYnV0ZTogXCJfaWRcIixcblxuXHR1cmxSb290OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvdXNlcnNcIjtcblx0fSxcblxuXHRkZWZhdWx0czoge1xuXHRcdGhpZGU6IGZhbHNlLFxuXHR9LFxufSk7XG5cbmNvbnN0IFVzZXJDb2xsZWN0aW9uID0gQmFja2JvbmUuQ29sbGVjdGlvbi5leHRlbmQoe1xuXHRtb2RlbDogTW9kZWwsXG5cdG1vZGU6IFwic2VydmVyXCIsXG5cblx0Y29tcGFyYXRvcjogZnVuY3Rpb24odXNlcikge1xuXHRcdHJldHVybiBbdXNlci5nZXQoXCJzdGF0dXNcIiksIF8udG9Mb3dlcih1c2VyLmdldChcImZpcnN0bmFtZVwiKSArIHVzZXIuZ2V0KFwic3VybmFtZVwiKSldO1xuXHR9LFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hY2FjaWEvdXNlcnMvYXNzaWduZWQvYm9va09yR3JvdXBcIjtcblx0fSxcblxuXHRieVRleHRTZWFyY2g6IGZ1bmN0aW9uKHF1ZXJ5KSB7XG5cdFx0dGhpcy5maWx0ZXIodXNlciA9PiB7XG5cdFx0XHRpZiAoXy5pbmNsdWRlcyhfLnRvTG93ZXIodXNlci5nZXQoXCJmaXJzdG5hbWVcIikpLCBfLnRvTG93ZXIocXVlcnkpKSB8fCBfLmluY2x1ZGVzKF8udG9Mb3dlcih1c2VyLmdldChcInN1cm5hbWVcIikpLCBfLnRvTG93ZXIocXVlcnkpKSkge1xuXHRcdFx0XHR1c2VyLnNldChcImhpZGVcIiwgZmFsc2UpO1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHRcdHVzZXIuc2V0KFwiaGlkZVwiLCB0cnVlKTtcblxuXHRcdFx0aWYgKHF1ZXJ5Lmxlbmd0aCA9PT0gMClcblx0XHRcdFx0dXNlci5zZXQoXCJoaWRlXCIsIGZhbHNlKTtcblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0pO1xuXHR9LFxufSk7XG5cbi8vIFJlc291cmNlcyB0aGF0IGFyZSBsaW5rZWQgdG8gdGhlIG1vbml0b3JlZCBib29rIG9yIGdyb3VwXG5jb25zdCBSZXNvdXJjZUNvbGxlY3Rpb24gPSBCYWNrYm9uZS5Db2xsZWN0aW9uLmV4dGVuZCh7XG5cdG1vZGVsOiBNb2RlbCxcblx0bW9kZTogXCJzZXJ2ZXJcIixcblxuXHR1cmw6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYWNhY2lhL3Jlc291cmNlcy9hc3NpZ25lZC9ib29rT3JHcm91cFwiO1xuXHR9LFxufSk7XG5cbmNvbnN0IENhbVVzZXJWaWV3ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2NhbS5udW5qXCIpLnVzZXJWaWV3LFxuXG5cdHVpOiB7XG5cdFx0dHlwZTogXCIuY292ZXItdHlwZVwiLFxuXHRcdGluZm86IFwiLmluZm9cIixcblx0XHRjYW1Vc2VyVG9vbHRpcDogXCIuY2FtVXNlclRvb2x0aXBcIixcblx0XHR1c2VyU3RhdHVzOiBcIi51c2VyLXN0YXR1c1wiLFxuXHR9LFxuXG5cdG1vZGVsRXZlbnRzOiB7XG5cdFx0XCJjaGFuZ2U6aGlkZVwiOiBcIm9uSGlkZUNoYW5nZVwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdGNsaWNrOiBcInZpZXdDYW1Vc2VyXCIsXG5cdH0sXG5cblx0Y2xhc3NOYW1lOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gXCJjYW0tdXNlciBzdGF0dXMtXCIgKyB0aGlzLm1vZGVsLmdldChcInN0YXR1c1wiKTtcblx0fSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHR1c2VyU3RhdHVzOiBmdW5jdGlvbihzdGF0dXMpIHtcblx0XHRcdFx0aWYgKHN0YXR1cyA9PT0gU1RBVFVTX0dSRUVOKVxuXHRcdFx0XHRcdHJldHVybiBcInNtaWxlXCI7XG5cdFx0XHRcdGVsc2UgaWYgKHN0YXR1cyA9PT0gU1RBVFVTX09SQU5HRSlcblx0XHRcdFx0XHRyZXR1cm4gXCJtZWhcIjtcblxuXHRcdFx0XHRyZXR1cm4gXCJmcm93blwiO1xuXHRcdFx0fSxcblx0XHR9O1xuXHR9LFxuXG5cdHNlcmlhbGl6ZURhdGE6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1vZGVsLnRvSlNPTigpO1xuXHR9LFxuXG5cdHZpZXdDYW1Vc2VyOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0dGhpcy50cmlnZ2VyKFwic2VsZWN0OmNhbVVzZXJcIiwgdGhpcy5tb2RlbCk7XG5cdH0sXG5cblx0b25IaWRlQ2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJoaWRlXCIpKVxuXHRcdFx0dGhpcy4kZWwuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0fSxcbn0pO1xuXG5jb25zdCBDYW1Vc2Vyc1ZpZXcgPSBCYWNrYm9uZS5NYXJpb25ldHRlLkNvbGxlY3Rpb25WaWV3LmV4dGVuZCh7XG5cdGNoaWxkVmlldzogQ2FtVXNlclZpZXcsXG5cdGNoaWxkVmlld1RyaWdnZXJzOiB7XG5cdFx0XCJzZWxlY3Q6Y2FtVXNlclwiOiBcImNoaWxkOnNlbGVjdDpjYW1Vc2VyXCIsXG5cdFx0XCJjaGFuZ2U6Y2FtVXNlclwiOiBcImNoaWxkOmNoYW5nZTpjYW1Vc2VyXCIsXG5cdH0sXG5cblx0Y2xhc3NOYW1lOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gXCJyb3ctY29udGFpbmVyIHN0YXR1cy1cIiArIHRoaXMub3B0aW9ucy5zdGF0ZTtcblx0fSxcbn0pO1xuXG5jb25zdCBTdGF0c01vZGVsID0gQmFja2JvbmUuRXBveHkuTW9kZWwuZXh0ZW5kKHtcblx0aWRBdHRyaWJ1dGU6IFwiX2lkXCIsXG5cblx0Y29tcHV0ZWRzOiB7XG5cdFx0Zm9udEF3ZXNvbWVOYW1lOiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbnN0IGV2ZW50X25hbWUgPSB0aGlzLmdldChcImV2ZW50X25hbWVcIik7XG5cdFx0XHRpZiAoXy5pbmNsdWRlcyhldmVudF9uYW1lLCBcIkFyY2hpdmVcIikpIHJldHVybiBcImFyY2hpdmVcIjtcblx0XHRcdGlmIChldmVudF9uYW1lID09PSBcIkZvY3VzTG9zdFwiIHx8IGV2ZW50X25hbWUgPT09IFwiQ2xvc2VkXCIgfHwgZXZlbnRfbmFtZSA9PT0gXCJDcmFzaGVkXCIpIHJldHVybiBcImFycm93LWNpcmNsZS1sZWZ0XCI7XG5cdFx0XHRpZiAoZXZlbnRfbmFtZSA9PT0gXCJGb2N1c0dhaW5lZFwiIHx8IGV2ZW50X25hbWUgPT09IFwiU3RhcnRlZFwiKSByZXR1cm4gXCJhcnJvdy1jaXJjbGUtcmlnaHRcIjtcblx0XHRcdGlmIChldmVudF9uYW1lID09PSBcIkxpYnJhcnlcIikgcmV0dXJuIFwiYm9va1wiO1xuXHRcdFx0aWYgKGV2ZW50X25hbWUgPT09IFwiUGFnZU9wZW5cIikgcmV0dXJuIFwiZmlsZVwiO1xuXHRcdFx0aWYgKGV2ZW50X25hbWUgPT09IFwiU2V0dGluZ3NcIiB8fCBldmVudF9uYW1lID09PSBcIkFjY291bnRzXCIpIHJldHVybiBcInVzZXJzXCI7XG5cdFx0XHRpZiAoZXZlbnRfbmFtZSA9PT0gXCJVcGNvbWluZ0V2ZW50c1wiKSByZXR1cm4gXCJjYWxlbmRhci1kYXlcIjtcblx0XHRcdGlmIChfLmluY2x1ZGVzKGV2ZW50X25hbWUsIFwiU3VtbWFyeVwiKSkgcmV0dXJuIFwibGlzdC1hbHRcIjtcblx0XHRcdGlmIChldmVudF9uYW1lID09PSBcIlN3aXRjaEFjY291bnRcIikgcmV0dXJuIFwiZXhjaGFuZ2VcIjtcblx0XHRcdGlmIChldmVudF9uYW1lID09PSBcIkJvb2tEb3dubG9hZFwiKSByZXR1cm4gXCJkb3dubG9hZFwiO1xuXHRcdFx0aWYgKF8uaW5jbHVkZXMoZXZlbnRfbmFtZSwgXCJTZWFyY2hcIikpIHJldHVybiBcInNlYXJjaFwiO1xuXHRcdFx0aWYgKF8uaW5jbHVkZXMoZXZlbnRfbmFtZSwgXCJGbGFzaGNhcmRcIikpIHJldHVybiBcImZpbGUtY2hlY2tcIjtcblx0XHRcdGlmIChfLmluY2x1ZGVzKGV2ZW50X25hbWUsIFwiRnJlZWZvcm1cIikgfHwgXy5pbmNsdWRlcyhldmVudF9uYW1lLCBcIkZvbGRlclwiKSkgcmV0dXJuIFwiZm9sZGVyXCI7XG5cdFx0XHRpZiAoZXZlbnRfbmFtZSA9PT0gXCJBbm5vdGF0aW9uXCIpIHJldHVybiBcImVkaXRcIjtcblx0XHRcdGlmIChfLmluY2x1ZGVzKGV2ZW50X25hbWUsIFwiUmVzb3VyY2VcIikgfHwgXy5pbmNsdWRlcyhldmVudF9uYW1lLCBcIkF0dGFjaG1lbnRcIikpIHJldHVybiBcInBhcGVyY2xpcFwiO1xuXHRcdFx0aWYgKGV2ZW50X25hbWUgPT09IFwiTmV3c0xldHRlclwiKSByZXR1cm4gXCJuZXdzcGFwZXJcIjtcblx0XHRcdGlmIChfLmluY2x1ZGVzKGV2ZW50X25hbWUsIFwiU3RhdHNcIikpIHJldHVybiBcImNoYXJ0LWJhclwiO1xuXHRcdFx0aWYgKF8uaW5jbHVkZXMoZXZlbnRfbmFtZSwgXCJGaWxlXCIpKSByZXR1cm4gXCJmaWxlXCI7XG5cdFx0XHRpZiAoZXZlbnRfbmFtZSA9PT0gXCJXaGF0c05ld1wiKSByZXR1cm4gXCJnaWZ0XCI7XG5cdFx0XHRpZiAoZXZlbnRfbmFtZSA9PT0gXCJIaWdobGlnaHRcIikgcmV0dXJuIFwiaGlnaGxpZ2h0ZXJcIjtcblx0XHRcdGlmIChfLmluY2x1ZGVzKGV2ZW50X25hbWUsIFwiVVJMXCIpIHx8IF8uaW5jbHVkZXMoZXZlbnRfbmFtZSwgXCJQcmFjdGljZVwiKSkgcmV0dXJuIFwiZ2xvYmVcIjtcblx0XHRcdHJldHVybiBcImNpcmNsZVwiO1xuXHRcdH0sXG5cblx0XHRzdGF0TmFtZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXQoXCJkaXNwbGF5XCIpID09PSBcIlwiID8gdGhpcy5nZXQoXCJldmVudF9uYW1lXCIpIDogdGhpcy5nZXQoXCJkaXNwbGF5XCIpO1xuXHRcdH0sXG5cblx0XHRkaXNwbGF5VGltZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gbW9tZW50LnVuaXgodGhpcy5nZXQoXCJ0aW1lc3RhbXBcIikpLmZvcm1hdChcIkhIOm1tOnNzXCIpO1xuXHRcdH0sXG5cblx0XHRmcm9tTm93OiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBtb21lbnQudW5peCh0aGlzLmdldChcInRpbWVzdGFtcFwiKSkuZnJvbU5vdygpO1xuXHRcdH0sXG5cdH0sXG59KTtcblxuY29uc3QgU3RhdFZpZXcgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInN0YXRcIixcblx0dGFnTmFtZTogXCJkaXZcIixcblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvY2FtLm51bmpcIikuc3RhdCxcblxuXHR1aToge1xuXHRcdGZyb21Ob3dEYXRlOiBcIi5zbWFsbC1kYXRlXCIsXG5cdH0sXG5cblx0dGVtcGxhdGVDb250ZXh0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0Zm9ybWF0RGF0ZTogZGF0ZSA9PiBtb21lbnQoZGF0ZSkuZm9ybWF0KFwiZGRkLCBEIE1NTU0gWVlZWVwiKSxcblx0XHRcdGZvbnRBd2Vzb21lTmFtZTogZnVuY3Rpb24oZXZlbnRfbmFtZSkge1xuXHRcdFx0XHRpZiAoXy5pbmNsdWRlcyhldmVudF9uYW1lLCBcIkFyY2hpdmVcIikpIHJldHVybiBcImFyY2hpdmVcIjtcblx0XHRcdFx0aWYgKGV2ZW50X25hbWUgPT09IFwiRm9jdXNMb3N0XCIgfHwgZXZlbnRfbmFtZSA9PT0gXCJDbG9zZWRcIiB8fCBldmVudF9uYW1lID09PSBcIkNyYXNoZWRcIikgcmV0dXJuIFwiYXJyb3ctY2lyY2xlLWxlZnRcIjtcblx0XHRcdFx0aWYgKGV2ZW50X25hbWUgPT09IFwiRm9jdXNHYWluZWRcIiB8fCBldmVudF9uYW1lID09PSBcIlN0YXJ0ZWRcIikgcmV0dXJuIFwiYXJyb3ctY2lyY2xlLXJpZ2h0XCI7XG5cdFx0XHRcdGlmIChldmVudF9uYW1lID09PSBcIkxpYnJhcnlcIikgcmV0dXJuIFwiYm9va1wiO1xuXHRcdFx0XHRpZiAoZXZlbnRfbmFtZSA9PT0gXCJQYWdlT3BlblwiKSByZXR1cm4gXCJmaWxlXCI7XG5cdFx0XHRcdGlmIChldmVudF9uYW1lID09PSBcIlNldHRpbmdzXCIgfHwgZXZlbnRfbmFtZSA9PT0gXCJBY2NvdW50c1wiKSByZXR1cm4gXCJ1c2Vyc1wiO1xuXHRcdFx0XHRpZiAoZXZlbnRfbmFtZSA9PT0gXCJVcGNvbWluZ0V2ZW50c1wiKSByZXR1cm4gXCJjYWxlbmRhclwiOyAvL2NhbGVuZGFyLWRheVxuXHRcdFx0XHRpZiAoXy5pbmNsdWRlcyhldmVudF9uYW1lLCBcIlN1bW1hcnlcIikpIHJldHVybiBcImxpc3QtYWx0XCI7XG5cdFx0XHRcdGlmIChldmVudF9uYW1lID09PSBcIlN3aXRjaEFjY291bnRcIikgcmV0dXJuIFwiZXhjaGFuZ2VcIjtcblx0XHRcdFx0aWYgKGV2ZW50X25hbWUgPT09IFwiQm9va0Rvd25sb2FkXCIpIHJldHVybiBcImRvd25sb2FkXCI7XG5cdFx0XHRcdGlmIChfLmluY2x1ZGVzKGV2ZW50X25hbWUsIFwiU2VhcmNoXCIpKSByZXR1cm4gXCJzZWFyY2hcIjtcblx0XHRcdFx0aWYgKF8uaW5jbHVkZXMoZXZlbnRfbmFtZSwgXCJGbGFzaGNhcmRcIikpIHJldHVybiBcImZpbGUtY2hlY2tcIjtcblx0XHRcdFx0aWYgKF8uaW5jbHVkZXMoZXZlbnRfbmFtZSwgXCJGcmVlZm9ybVwiKSB8fCBfLmluY2x1ZGVzKGV2ZW50X25hbWUsIFwiRm9sZGVyXCIpKSByZXR1cm4gXCJmb2xkZXJcIjtcblx0XHRcdFx0aWYgKGV2ZW50X25hbWUgPT09IFwiQW5ub3RhdGlvblwiKSByZXR1cm4gXCJlZGl0XCI7XG5cdFx0XHRcdGlmIChfLmluY2x1ZGVzKGV2ZW50X25hbWUsIFwiUmVzb3VyY2VcIikgfHwgXy5pbmNsdWRlcyhldmVudF9uYW1lLCBcIkF0dGFjaG1lbnRcIikpIHJldHVybiBcInBhcGVyY2xpcFwiO1xuXHRcdFx0XHRpZiAoZXZlbnRfbmFtZSA9PT0gXCJOZXdzTGV0dGVyXCIpIHJldHVybiBcIm5ld3NwYXBlclwiO1xuXHRcdFx0XHRpZiAoXy5pbmNsdWRlcyhldmVudF9uYW1lLCBcIlN0YXRzXCIpKSByZXR1cm4gXCJjaGFydC1iYXJcIjtcblx0XHRcdFx0aWYgKF8uaW5jbHVkZXMoZXZlbnRfbmFtZSwgXCJGaWxlXCIpKSByZXR1cm4gXCJmaWxlXCI7XG5cdFx0XHRcdGlmIChldmVudF9uYW1lID09PSBcIldoYXRzTmV3XCIpIHJldHVybiBcImdpZnRcIjtcblx0XHRcdFx0aWYgKGV2ZW50X25hbWUgPT09IFwiSGlnaGxpZ2h0XCIpIHJldHVybiBcImhpZ2hsaWdodGVyXCI7XG5cdFx0XHRcdGlmIChfLmluY2x1ZGVzKGV2ZW50X25hbWUsIFwiVVJMXCIpIHx8IF8uaW5jbHVkZXMoZXZlbnRfbmFtZSwgXCJQcmFjdGljZVwiKSkgcmV0dXJuIFwiZ2xvYmVcIjtcblx0XHRcdFx0cmV0dXJuIFwiY2lyY2xlXCI7XG5cdFx0XHR9LFxuXG5cdFx0XHRzdGF0TmFtZTogZnVuY3Rpb24oZGlzcGxheSwgZXZlbnRfbmFtZSkge1xuXHRcdFx0XHRyZXR1cm4gZGlzcGxheSA9PT0gXCJcIiA/IGV2ZW50X25hbWUgOiBkaXNwbGF5O1xuXHRcdFx0fSxcblxuXHRcdFx0ZXZlbnRfdGltZTogZnVuY3Rpb24odGltZXN0YW1wKSB7XG5cdFx0XHRcdHJldHVybiBtb21lbnQudW5peCh0aW1lc3RhbXApLmZvcm1hdChcIkhIOm1tOnNzXCIpO1xuXHRcdFx0fSxcblxuXHRcdFx0ZnJvbU5vdzogZnVuY3Rpb24odGltZXN0YW1wKSB7XG5cdFx0XHRcdHJldHVybiBtb21lbnQudW5peCh0aW1lc3RhbXApLmZyb21Ob3coKTtcblx0XHRcdH0sXG5cdFx0fTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmxpc3RlblRvKGV2ZW50QnVzLCBldmVudEJ1cy5FdmVudHMuQ0FNVGltZWxpbmVDaGFuZ2UsIHRoaXMub25UaW1lbGluZUNoYW5nZS5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRvblRpbWVsaW5lQ2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmZyb21Ob3dEYXRlLmh0bWwobW9tZW50LnVuaXgodGhpcy5tb2RlbC5nZXQoXCJ0aW1lc3RhbXBcIikpLmZyb21Ob3coKSk7XG5cdH0sXG59KTtcblxuY29uc3QgRGF5VmlldyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZGF5XCIsXG5cdHRhZ05hbWU6IFwiZGl2XCIsXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2NhbS5udW5qXCIpLmRheVN0YXRzLFxuXG5cdHVpOiB7XG5cdFx0ZnJvbU5vd0RhdGU6IFwiLnNtYWxsLWRhdGVcIixcblx0fSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRmb3JtYXREYXRlOiBkYXRlID0+IG1vbWVudChkYXRlKS5mb3JtYXQoXCJkZGQsIEQgTU1NTSBZWVlZXCIpLFxuXHRcdH07XG5cdH0sXG59KTtcblxuY29uc3QgVGltZWxpbmVFdmVudHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInRpbWVsaW5lLXJvd3NcIixcblx0dGFnTmFtZTogXCJkaXZcIixcblxuXHR1aToge1xuXHRcdGJhY2tCdG46IFwiLmJ0bi1iYWNrXCIsXG5cdH0sXG5cblx0Y29sbGVjdGlvbkV2ZW50czoge1xuXHRcdFwic3luYyBlcnJvclwiOiBcImZldGNoRW5kXCIsXG5cdH0sXG5cblx0dGVtcGxhdGVDb250ZXh0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0Zm9ybWF0RGF0ZTogZGF0ZSA9PiBtb21lbnQoZGF0ZSkuZm9ybWF0KFwiZGRkLCBEIE1NTU0gWVlZWVwiKSxcblx0XHR9O1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuYmluZEV2ZW50cyh0aGlzLmNvbGxlY3Rpb24sIHRoaXMuY29sbGVjdGlvbkV2ZW50cyk7XG5cdFx0dGhpcy5zdGF0Vmlld3MgPSBbXTtcblx0XHR0aGlzLnN0YXJ0VGltZSA9IHRoaXMuY29sbGVjdGlvbi5zaW5jZVRpbWVzdGFtcDtcblx0XHR0aGlzLnBhcmFtcyA9IHRoaXMub3B0aW9ucy5wYXJhbXM7XG5cdH0sXG5cblx0ZmV0Y2hFbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY29sbGVjdGlvbi5mdWxsQ29sbGVjdGlvbiA9IHRoaXMuY29sbGVjdGlvbi5mdWxsQ29sbGVjdGlvbi5jb25jYXQodGhpcy5jb2xsZWN0aW9uLm1vZGVscyk7XG5cblx0XHRfLmVhY2goXy5vcmRlckJ5KHRoaXMuY29sbGVjdGlvbi5tb2RlbHMsIHN0YXQgPT4gc3RhdC5nZXQoXCJ0aW1lc3RhbXBcIiksIFwiZGVzY1wiKSwgbW9kZWwgPT4ge1xuXHRcdFx0Y29uc3QgdmlldyA9IF8uZmluZCh0aGlzLnN0YXRWaWV3cywgc3RhdFZpZXcgPT4gc3RhdFZpZXcubW9kZWwuZ2V0KFwiaWRcIikgPT09IG1vZGVsLmdldChcImlkXCIpKTtcblxuXHRcdFx0Ly8gSWYgdGhlIG1vZGVsIGFscmVhZHkgaGFzIGEgdmlldywganVzdCByZXR1cm5cblx0XHRcdGlmICh2aWV3KVxuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdGlmIChtb2RlbC5nZXQoXCJ0aW1lc3RhbXBcIikgPCB0aGlzLnN0YXJ0VGltZSlcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRjb25zdCBzdGF0VmlldyA9IG5ldyBTdGF0Vmlldyh7XG5cdFx0XHRcdG1vZGVsOiBtb2RlbCxcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLnN0YXRWaWV3cy5wdXNoKHN0YXRWaWV3KTtcblxuXHRcdFx0dGhpcy4kZWwuY2hpbGRyZW4oXCI6Zmlyc3RcIikuZmluZChcIi5kYXRlLWRpdmlkZXJcIikuYWZ0ZXIoc3RhdFZpZXcucmVuZGVyKCkuZWwpO1xuXHRcdFx0Ly8gVHJpZ2dlciB1cGRhdGUgdGltZSBsaXN0ZW5lZCB0byBieSBTdGF0Vmlld1xuXHRcdFx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5FdmVudHMuQ0FNVGltZWxpbmVDaGFuZ2UpO1xuXHRcdH0pO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRfLmVhY2godGhpcy5tb2RlbC5nZXQoXCJtYXBwZWRTdGF0c1wiKSwgKHN0YXRzLCBkYXkpID0+IHtcblx0XHRcdC8vIFJlbmRlciBkYXlcblx0XHRcdGNvbnN0IGRheVZpZXcgPSBuZXcgRGF5Vmlldyh7IG1vZGVsOiBuZXcgQmFja2JvbmUuTW9kZWwoeyBkYXRlOiBkYXkgfSkgfSk7XG5cdFx0XHR0aGlzLiRlbC5hcHBlbmQoZGF5Vmlldy5yZW5kZXIoKS5lbCk7XG5cdFx0XHRfLmVhY2goXy5vcmRlckJ5KHN0YXRzLCBzdGF0ID0+IHN0YXQudGltZXN0YW1wLCBcImRlc2NcIiksIHN0YXQgPT4ge1xuXHRcdFx0XHQvLyBSZW5kZXIgc3RhdFxuXHRcdFx0XHRjb25zdCBzdGF0VmlldyA9IG5ldyBTdGF0Vmlldyh7IG1vZGVsOiBzdGF0IH0pO1xuXHRcdFx0XHRkYXlWaWV3LiRlbC5hcHBlbmQoc3RhdFZpZXcucmVuZGVyKCkuZWwpO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH0sXG5cblx0dXBkYXRlU3RhdHM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY29sbGVjdGlvbi5zaW5jZVRpbWVzdGFtcCA9IHRoaXMuY29sbGVjdGlvbi5sZW5ndGggPiAwID8gdGhpcy5jb2xsZWN0aW9uLmZpcnN0KCkuZ2V0KFwidGltZXN0YW1wXCIpIDogdGhpcy5jb2xsZWN0aW9uLnNpbmNlVGltZXN0YW1wO1xuXHRcdHRoaXMuY29sbGVjdGlvbi5mZXRjaCh7IHJlc2V0OiB0cnVlIH0pO1xuXHR9LFxufSk7XG5cbmNvbnN0IFN0YXRzQ29sbGVjdGlvbiA9IEJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IFN0YXRzTW9kZWwsXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKGRhdGEsIG9wdHMpIHtcblx0XHR0aGlzLmZ1bGxDb2xsZWN0aW9uID0gW107XG5cdFx0aWYgKG9wdHMpIHtcblx0XHRcdHRoaXMudXNlcm5hbWUgPSBvcHRzLnVzZXJuYW1lO1xuXHRcdFx0dGhpcy5zaW5jZVRpbWVzdGFtcCA9IG9wdHMuc2luY2VUaW1lc3RhbXA7XG5cdFx0fVxuXHR9LFxuXG5cdGNvbXBhcmF0b3I6IGZ1bmN0aW9uKGl0ZW0pIHtcblx0XHRyZXR1cm4gLWl0ZW0uZ2V0KFwidGltZXN0YW1wXCIpO1xuXHR9LFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIFwiL3JlZHN0b25lL2FwaS9zdHVkZW50L3RpbWVsaW5lP3VzZXI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy51c2VybmFtZSkgKyBcIiZzaW5jZVRpbWVzdGFtcD1cIiArIHRoaXMuc2luY2VUaW1lc3RhbXA7XG5cdH0sXG5cblx0bW9kZTogXCJzZXJ2ZXJcIixcbn0pO1xuXG5jb25zdCBDQU1UaW1lbGluZSA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiY29udGVudCBjYW0tdXNlci10aW1lbGluZVwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2NhbS5udW5qXCIpLnRpbWVsaW5lLFxuXG5cdHVpOiB7XG5cdFx0YmFja0J0bjogXCIuYnRuLWJhY2tcIixcblx0XHRyZXN1bHQ6IFwiLnJlc3VsdFwiLFxuXHRcdGxpdmVEYXRhOiBcImlucHV0W25hbWU9J2xpdmUtZGF0YSddXCIsXG5cdFx0b3ZlcmxheTogXCIudGltZWxpbmUtb3ZlcmxheVwiLFxuXHR9LFxuXHRyZWdpb25zOiB7XG5cdFx0Y29udGVudDogXCIuZXZlbnRzLXJlZ2lvblwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmJhY2tCdG5cIjogXCJvbkJhY2tCdG5DbGlja1wiLFxuXHR9LFxuXG5cdGNvbGxlY3Rpb25FdmVudHM6IHtcblx0XHRyZXF1ZXN0OiBcImZldGNoU3RhcnRcIixcblx0XHRcInN5bmMgZXJyb3JcIjogXCJmZXRjaEVuZFwiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY29sbGVjdGlvbiA9IG5ldyBTdGF0c0NvbGxlY3Rpb24oW10sIHsgdXNlcm5hbWU6IHRoaXMubW9kZWwuZ2V0KFwidXNlcm5hbWVcIiksIHNpbmNlVGltZXN0YW1wOiB0aGlzLm1vZGVsLmdldChcInNpbmNlVGltZXN0YW1wXCIpIH0pO1xuXHRcdHRoaXMuYmluZEV2ZW50cyh0aGlzLmNvbGxlY3Rpb24sIHRoaXMuY29sbGVjdGlvbkV2ZW50cyk7XG5cdH0sXG5cblx0ZmV0Y2hTdGFydDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5vdmVybGF5LmFkZENsYXNzKFwic2hvd25cIikuaHRtbChcIjxzcGFuIGNsYXNzPSdzcGlubmVyJz48c3BhbiBjbGFzcz0nc3Bpbm5lci1pY29uIHNwaW5uZXItcmVkJy8+Jm5ic3A7Jm5ic3A7RmV0Y2hpbmcuLi48L3NwYW4+XCIpO1xuXHR9LFxuXG5cdGZldGNoRW5kOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLm92ZXJsYXkuaHRtbChcIlwiKS5yZW1vdmVDbGFzcyhcInNob3duXCIpO1xuXG5cdFx0aWYgKHRoaXMuY29sbGVjdGlvbi5sZW5ndGggPT09IDApIHtcblx0XHRcdHRoaXMuY29sbGVjdGlvbi5hZGQoe1xuXHRcdFx0XHRkaXNwbGF5OiBcIlNlc3Npb24gU3RhcnRcIixcblx0XHRcdFx0aWQ6IDAsXG5cdFx0XHRcdHRpbWVzdGFtcDogbW9tZW50KCkudW5peCgpLFxuXHRcdFx0XHRldmVudF9uYW1lOiBcIlNlc3Npb25TdGFydFwiLFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0dGhpcy50aW1lbGluZVZpZXcgPSBuZXcgVGltZWxpbmVFdmVudHMoe1xuXHRcdFx0Y29sbGVjdGlvbjogdGhpcy5jb2xsZWN0aW9uLFxuXHRcdFx0bW9kZWw6IG5ldyBCYWNrYm9uZS5Nb2RlbCh7XG5cdFx0XHRcdG1hcHBlZFN0YXRzOiBfLmdyb3VwQnkoXy5vcmRlckJ5KHRoaXMuY29sbGVjdGlvbi5tb2RlbHMsIG1vZGVsID0+IG1vZGVsLmdldChcInRpbWVzdGFtcFwiKSwgXCJkZXNjXCIpLCBtb2RlbCA9PiBtb21lbnQudW5peChtb2RlbC5nZXQoXCJ0aW1lc3RhbXBcIikpLmZvcm1hdChcIllZWVlNTUREXCIpKSxcblx0XHRcdFx0dXNlcjogdGhpcy5tb2RlbCxcblx0XHRcdH0pLFxuXHRcdFx0cGFyYW1zOiB0aGlzLm9wdGlvbnMucGFyYW1zLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiY29udGVudFwiLCB0aGlzLnRpbWVsaW5lVmlldyk7XG5cblx0XHR0aGlzLnVuYmluZEV2ZW50cyh0aGlzLmNvbGxlY3Rpb24sIHRoaXMuY29sbGVjdGlvbkV2ZW50cyk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY29sbGVjdGlvbi5mZXRjaCh7IHJlc2V0OiB0cnVlIH0pO1xuXHR9LFxuXG5cdG9uQmFja0J0bkNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnRyaWdnZXIoXCJiYWNrXCIpO1xuXHR9LFxuXG5cdHVwZGF0ZVRpbWVsaW5lOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnRpbWVsaW5lVmlldy51cGRhdGVTdGF0cygpO1xuXHR9LFxufSk7XG5cbmNvbnN0IENhbVVzZXJzU2VsZWN0b3IgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImNhbS11c2VyLXNlbGVjdG9yXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvY2FtLm51bmpcIikuY2FtVXNlclNlbGVjdG9yLFxuXG5cdHJlZ2lvbnM6IHtcblx0XHRmaWx0ZXI6IFwiLmNhbS11c2VyLWZpbHRlci1yZWdpb25cIixcblx0XHRncmlkOiBcIi5jYW0tdXNlci1ncmlkLXJlZ2lvblwiLFxuXHRcdHRpbWVsaW5lOiBcIi5jYW0tdXNlci10aW1lbGluZS1yZWdpb25cIixcblx0fSxcblxuXHR1aToge1xuXHRcdHNlbGVjdG9yOiBcImRpdi5jYW0tYm9keVwiLFxuXHRcdHJlc3VsdDogXCIucmVzdWx0XCIsXG5cdFx0dGltZWxpbmU6IFwiLmNhbS11c2VyLXRpbWVsaW5lLXJlZ2lvblwiLFxuXG5cdFx0ZmlsdGVyczogXCIuY2FtLXVzZXItZmlsdGVyLXJlZ2lvbiAuZmlsdGVyc1wiLFxuXHRcdHNlYXJjaEJveDogXCJpbnB1dC50ZXh0LWZpbHRlci1pbnB1dFwiLFxuXHRcdGNsZWFyU2VhcmNoOiBcIi5jbGVhci1zZWFyY2hcIixcblx0XHRzZWFyY2hPdmVybGF5OiBcImRpdi5pbnB1dC1vdmVybGF5XCIsXG5cblx0XHRjb3VudGVyOiBcIi5jb3VudGVyXCIsXG5cdFx0cGFnZTogXCIucGFnZVwiLFxuXHRcdG92ZXJsYXk6IFwiLm92ZXJsYXlcIixcblxuXHRcdGdyb3VwczogXCJzZWxlY3RbbmFtZT1ncm91cHNdXCIsXG5cdFx0Ym9va3M6IFwic2VsZWN0W25hbWU9Ym9va3NdXCIsXG5cdFx0Ym9va3NDb250YWluZXI6IFwiLmJvb2tzLWNvbnRhaW5lclwiLFxuXHRcdG1vbml0b3JCb29rczogXCJpbnB1dFtuYW1lPSdtb25pdG9yX2Jvb2tzJ11cIixcblx0XHRtb25pdG9yQnRuOiBcIi5idG4tbW9uaXRvclwiLFxuXHRcdG1vbml0b3JUZXh0OiBcIi5tb25pdG9yLXRleHRcIixcblx0XHRjb25uZWN0aW9uTG9zdFN0YXR1czogXCIuY29ubmVjdGlvbi1sb3N0XCIsXG5cdFx0aXRlbUlEOiBcIi5pdGVtLWlkXCIsXG5cdFx0c3RhdHVzRmlsdGVyOiBcIi5zdGF0dXMuZmlsdGVyLW9wdGlvblwiLFxuXHRcdHNlc3Npb25UaW1lOiBcIi5zZXNzaW9uLXRpbWVcIixcblx0XHRmaWx0ZXJUeXBlOiBcIi5maWx0ZXItdHlwZVwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLm1vbml0b3JCb29rc1wiOiBcIm9uTW9uaXRvckJvb2tzXCIsXG5cdFx0XCJjbGljayBAdWkubW9uaXRvckJ0blwiOiBcIm9uTW9uaXRvckJ0bkNsaWNrXCIsXG5cdFx0XCJjaGFuZ2UgQHVpLmdyb3Vwc1wiOiBcIm9uR3JvdXBzQ2hhbmdlXCIsXG5cdFx0XCJjaGFuZ2UgQHVpLmJvb2tzXCI6IFwib25Cb29rc0NoYW5nZVwiLFxuXHRcdFwia2V5dXAgQHVpLnNlYXJjaEJveFwiOiBcIm9uU2VhcmNoQm94Q2hhbmdlXCIsXG5cdFx0XCJjbGljayBAdWkuY2xlYXJTZWFyY2hcIjogXCJvbkNsZWFyU2VhcmNoQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5zdGF0dXNGaWx0ZXJcIjogXCJvblN0YXR1c0ZpbHRlckNsaWNrXCIsXG5cdH0sXG5cblx0dXNlckNvbGxlY3Rpb25FdmVudHM6IHtcblx0XHRyZXF1ZXN0OiBcImZldGNoU3RhcnRcIixcblx0XHRcInN5bmMgZXJyb3JcIjogXCJ1c2VyRmV0Y2hFbmRcIixcblx0fSxcblxuXHRyZXNvdXJjZUNvbGxlY3Rpb25FdmVudHM6IHtcblx0XHRcInN5bmMgZXJyb3JcIjogXCJyZXNvdXJjZUZldGNoRW5kXCIsXG5cdH0sXG5cblx0Y2hpbGRWaWV3RXZlbnRzOiB7XG5cdFx0XCJjaGlsZDpzZWxlY3Q6Y2FtVXNlclwiOiBcIm9uU2VsZWN0XCIsXG5cdH0sXG5cblx0bW9kZWxFdmVudHM6IHtcblx0XHRcImNoYW5nZTp3c0Nvbm5lY3RlZFwiOiBcIndzQ29ubmVjdGlvbkNoYW5nZWRcIixcblx0XHRcImNoYW5nZTpzZXNzaW9uVGltZVwiOiBcIm9uU2Vzc2lvblRpbWVDaGFuZ2VkXCIsXG5cdH0sXG5cblx0cmFkaW9FdmVudHM6IHtcblx0XHRbQXBwLkV2ZW50cy5XZWJzb2NrZXRDb25uZWN0ZWRdOiBcIndzQ29ubmVjdGVkXCIsXG5cdFx0W0FwcC5FdmVudHMuV2Vic29ja2V0RGlzY29ubmVjdGVkXTogXCJ3c0Rpc2Nvbm5lY3RlZFwiLFxuXHRcdFtBcHAuRXZlbnRzLldlYnNvY2tldE1lc3NhZ2VdOiBcIndzTWVzc2FnZVwiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY29sbGVjdENhbURhdGEgPSBmYWxzZTtcblx0XHR0aGlzLnBhcmFtcyA9IHsgZ3JvdXBzOiBbXSwgYm9vazogbnVsbCB9O1xuXG5cdFx0dGhpcy5iaW5kRXZlbnRzKHJhZGlvLCB0aGlzLnJhZGlvRXZlbnRzKTtcblx0XHR0aGlzLm1vZGVsID0gbmV3IEJhY2tib25lLk1vZGVsKHsgc2Vzc2lvblRpbWU6IFwiMDA6MDA6MDBcIiB9KTtcblx0XHR0aGlzLnNpbmNlVGltZXN0YW1wID0gbW9tZW50KCkudW5peCgpO1xuXHRcdHRoaXMucG9zc2libGVTdGF0ZXMgPSBbU1RBVFVTX1JFRCwgU1RBVFVTX09SQU5HRSwgU1RBVFVTX0dSRUVOXTtcblx0XHR0aGlzLmNvbGxlY3Rpb25zID0gW107XG5cdFx0dGhpcy5jYW1Vc2Vyc1ZpZXdzID0gW107XG5cblx0XHRfLmVhY2godGhpcy5wb3NzaWJsZVN0YXRlcywgc3RhdGUgPT4ge1xuXHRcdFx0dGhpcy5jb2xsZWN0aW9uc1tzdGF0ZV0gPSBuZXcgVXNlckNvbGxlY3Rpb24oKTtcblx0XHR9KTtcblxuXHRcdHRoaXMucmVzb3VyY2VDb2xsZWN0aW9uID0gbmV3IFJlc291cmNlQ29sbGVjdGlvbigpO1xuXHRcdHRoaXMucmVzb3VyY2VDb2xsZWN0aW9uU2V0ID0gZmFsc2U7XG5cblx0XHR0aGlzLmJpbmRFdmVudHModGhpcy5jb2xsZWN0aW9uc1tTVEFUVVNfUkVEXSwgdGhpcy51c2VyQ29sbGVjdGlvbkV2ZW50cyk7XG5cdFx0dGhpcy5iaW5kRXZlbnRzKHRoaXMucmVzb3VyY2VDb2xsZWN0aW9uLCB0aGlzLnJlc291cmNlQ29sbGVjdGlvbkV2ZW50cyk7XG5cblx0XHR0aGlzLnN0YXRzQ29sbGVjdGlvbiA9IG5ldyBTdGF0c0NvbGxlY3Rpb24oKTtcblxuXHRcdC8vIFRoZSB3ZWJzb2NrZXQgbWlnaHQgYWxyZWFkeSBiZSBjb25uZWN0ZWQgYmVmb3JlIHdlIGxpc3RlbiBmb3IgdGhlIGNvbm5lY3Rpb24gZXZlbnRcblx0XHRpZiAoQXBwLndzLmlzQ29ubmVjdGVkKVxuXHRcdFx0dGhpcy53c0Nvbm5lY3RlZCgpO1xuXHR9LFxuXG5cdGZldGNoU3RhcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdCQoXCJkaXYubm8tcmVzdWx0c1wiLCB0aGlzLnVpLnJlc3VsdCkucmVtb3ZlKCk7XG5cdFx0dGhpcy51aS5vdmVybGF5LmFkZENsYXNzKFwic2hvd25cIikuaHRtbChcIjxzcGFuIGNsYXNzPSdzcGlubmVyJz48c3BhbiBjbGFzcz0nc3Bpbm5lci1pY29uIHNwaW5uZXItcmVkJy8+Jm5ic3A7Jm5ic3A7RmV0Y2hpbmcuLi48L3NwYW4+XCIpO1xuXHR9LFxuXG5cdHVzZXJGZXRjaEVuZDogZnVuY3Rpb24obW9kZWwsIGVycikge1xuXHRcdGlmIChlcnIgJiYgZXJyLnN0YXR1cykge1xuXHRcdFx0Y29uc3QgZXJyTXNnID0gQXBwLnBhcnNlUmVzcG9uc2UoZXJyKTtcblx0XHRcdGNvbnNvbGUuZXJyb3IoZXJyTXNnKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQkKFwiZGl2Lm5vLXJlc3VsdHNcIiwgdGhpcy51aS5yZXN1bHQpLnJlbW92ZSgpO1xuXHRcdHRoaXMudWkub3ZlcmxheS5lbXB0eSgpLnJlbW92ZUNsYXNzKFwic2hvd25cIik7XG5cdFx0dGhpcy51cGRhdGVDb3VudGVyKCk7XG5cblx0XHRpZiAodGhpcy5jb2xsZWN0aW9uc1swXS5sZW5ndGggPT09IDApIHtcblx0XHRcdHRoaXMudWkucmVzdWx0LmFwcGVuZChgPGRpdiBjbGFzcz0nbm8tcmVzdWx0cyc+PGRpdj5ObyByZXN1bHRzIGZvdW5kIDxzcGFuIGNsYXNzPSdmYWwgZmEtZnJvd24nLz48L2Rpdj5cblx0XHRcdFx0PGRpdiBjbGFzcz0nc3VidGV4dCc+SWYgeW91IGhhdmUgYW55IGZpbHRlcnMgc2VsZWN0ZWQsIHRyeSBjaGFuZ2luZyB0aGVtLCBvciB1bmNob29zaW5nIHRoZW08L2Rpdj48L2Rpdj5gKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR3aW5kb3cuc2Nyb2xsVG8oMCwgMCk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY29sbGVjdENhbURhdGEgJiYgdGhpcy5jb2xsZWN0aW9uc1swXS5sZW5ndGggPiAwICYmIHRoaXMucmVzb3VyY2VDb2xsZWN0aW9uU2V0KSB7XG5cdFx0XHR0aGlzLmdldENhbURhdGEoKTtcblx0XHRcdHRoaXMuY29sbGVjdENhbURhdGEgPSBmYWxzZTtcblx0XHR9XG5cdH0sXG5cblx0cmVzb3VyY2VGZXRjaEVuZDogZnVuY3Rpb24obW9kZWwsIGVycikge1xuXHRcdGlmIChlcnIgJiYgZXJyLnN0YXR1cykge1xuXHRcdFx0Y29uc3QgZXJyTXNnID0gQXBwLnBhcnNlUmVzcG9uc2UoZXJyKTtcblx0XHRcdGNvbnNvbGUuZXJyb3IoZXJyTXNnKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLnJlc291cmNlQ29sbGVjdGlvblNldCA9IHRydWU7XG5cblx0XHRpZiAodGhpcy5jb2xsZWN0Q2FtRGF0YSAmJiB0aGlzLmNvbGxlY3Rpb25zWzBdLmxlbmd0aCA+IDApIHtcblx0XHRcdHRoaXMuZ2V0Q2FtRGF0YSgpO1xuXHRcdFx0dGhpcy5jb2xsZWN0Q2FtRGF0YSA9IGZhbHNlO1xuXHRcdH1cblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Xy5lYWNoKHRoaXMucG9zc2libGVTdGF0ZXMsIHN0YXRlID0+IHtcblx0XHRcdHRoaXMuY2FtVXNlcnNWaWV3c1tzdGF0ZV0gPSBuZXcgQ2FtVXNlcnNWaWV3KHsgc3RhdGU6IHN0YXRlLCBjb2xsZWN0aW9uOiB0aGlzLmNvbGxlY3Rpb25zW3N0YXRlXSB9KTtcblx0XHRcdHRoaXMuYWRkUmVnaW9uKFwiZ3JpZFwiICsgc3RhdGUsIFwiLmdyaWRcIiArIHN0YXRlKTtcblx0XHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImdyaWRcIiArIHN0YXRlLCB0aGlzLmNhbVVzZXJzVmlld3Nbc3RhdGVdKTtcblx0XHR9KTtcblxuXHRcdHRoaXMudWkuZmlsdGVyVHlwZS50ZXh0KFwibWlFYm9va3NcIik7XG5cblx0XHRjb25zdCB1c2VyID0gcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblxuXHRcdHRoaXMuZ3JvdXBPcHMgPSB7XG5cdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdHNvcnQ6IHRydWUsXG5cdFx0XHRzZXJ2ZXI6IHtcblx0XHRcdFx0ZmV0Y2g6IGAke3NldHRpbmdzLnVybFJvb3R9L2FjYWNpYS91c2Vycy8ke2VuY29kZVVSSUNvbXBvbmVudCh1c2VyLnVzZXJuYW1lKX0vY2FtR3JvdXBzYCxcblx0XHRcdFx0a2V5OiBcImNvZGVcIixcblx0XHRcdFx0dmFsdWU6IFwibmFtZVwiLFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRwYWdlU2l6ZTogMzAsXG5cdFx0XHRcdGluZmluaXRlOiB0cnVlLFxuXHRcdFx0fSxcblx0XHRcdHBsYWNlaG9sZGVyOiBcIkNob29zZSBhIGdsb2JhbCBncm91cFwiLFxuXHRcdFx0d2lkdGg6IDI3MCxcblx0XHR9O1xuXG5cdFx0dGhpcy5ib29rT3BzID0ge1xuXHRcdFx0ZGVsYXlMb2FkOiBmYWxzZSxcblx0XHRcdHNvcnQ6IHRydWUsXG5cdFx0XHRzaW5nbGVEZXNlbGVjdDogdHJ1ZSxcblx0XHRcdHNlcnZlcjoge1xuXHRcdFx0XHRmZXRjaDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvdXNlcnMvXCIgKyB1c2VyLnVzZXJuYW1lICsgXCIvYm9va3NcIixcblx0XHRcdFx0a2V5OiBcInVuaXZlcnNhbF9pZFwiLFxuXHRcdFx0XHR2YWx1ZTogXCJ0aXRsZVwiLFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRwYWdlU2l6ZTogMzAsXG5cdFx0XHRcdGluZmluaXRlOiB0cnVlLFxuXHRcdFx0fSxcblx0XHRcdHBsYWNlaG9sZGVyOiBcIkNob29zZSBib29rXCIsXG5cdFx0XHR3aWR0aDogNTAwLFxuXHRcdH07XG5cblx0XHRpZiAodGhpcy5vcHRpb25zLmJvb2spIHtcblx0XHRcdHRoaXMudWkubW9uaXRvckJvb2tzLnByb3AoXCJjaGVja2VkXCIsIHRydWUpO1xuXHRcdFx0dGhpcy51aS5ib29rc0NvbnRhaW5lci5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cblx0XHRcdHRoaXMuYm9va09wcy5zZXJ2ZXIuZGVmYXVsdCA9IHtcblx0XHRcdFx0a2V5OiBcInVuaXZlcnNhbF9pZFwiLFxuXHRcdFx0XHR2YWx1ZTogXCJ0aXRsZVwiLFxuXHRcdFx0XHRmZXRjaDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvZXB1YnM/c2luZ2xlU2VsZWN0PXRydWVcIixcblx0XHRcdFx0cGFyYW1zOiB7IGlkOiB0aGlzLm9wdGlvbnMuYm9vayB9LFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5vcHRpb25zLmdyb3VwcyAmJiB0aGlzLm9wdGlvbnMuZ3JvdXBzLmxlbmd0aCA+IDApIHtcblx0XHRcdHRoaXMuZ3JvdXBPcHMuc2VydmVyLmRlZmF1bHQgPSB7XG5cdFx0XHRcdGZldGNoOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9ncm91cHNcIixcblx0XHRcdFx0cGFyYW1zOiB7IGlkOiB0aGlzLm9wdGlvbnMuZ3JvdXBzIH0sXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdHRoaXMuYm9va1NlbGVjdCA9IG5ldyBTZWxlY3RyYSh0aGlzLmJvb2tPcHMpO1xuXG5cdFx0dGhpcy5ib29rU2VsZWN0LnNob3coeyBlbDogdGhpcy51aS5ib29rcyB9KTtcblxuXHRcdHRoaXMuZ3JvdXBTZWxlY3QgPSBuZXcgU2VsZWN0cmEodGhpcy5ncm91cE9wcyk7XG5cblx0XHR0aGlzLmdyb3VwU2VsZWN0LnNob3coeyBlbDogdGhpcy51aS5ncm91cHMgfSk7XG5cdH0sXG5cblx0b25Nb25pdG9yQm9va3M6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMub25TZXR0aW5nQ2hhbmdlKCk7XG5cdFx0dGhpcy5ib29rU2VsZWN0Lm1vZGVsLnNldCh7IGRpc2FibGVkOiAhdGhpcy51aS5tb25pdG9yQm9va3MucHJvcChcImNoZWNrZWRcIikgfSk7XG5cdFx0aWYgKHRoaXMudWkubW9uaXRvckJvb2tzLnByb3AoXCJjaGVja2VkXCIpKSB7XG5cdFx0XHR0aGlzLnVpLmJvb2tzQ29udGFpbmVyLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHRoaXMudWkuZmlsdGVyVHlwZS50ZXh0KFwiYm9va1wiKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLnVpLmJvb2tzQ29udGFpbmVyLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHRoaXMudWkuZmlsdGVyVHlwZS50ZXh0KFwibWlFYm9va3NcIik7XG5cdFx0XHR0aGlzLmJvb2tTZWxlY3QuZGVzdHJveSgpO1xuXHRcdFx0ZGVsZXRlIHRoaXMuYm9va09wcy5zZXJ2ZXIuZGVmYXVsdDtcblx0XHRcdHRoaXMuYm9va1NlbGVjdCA9IG5ldyBTZWxlY3RyYSh0aGlzLmJvb2tPcHMpO1xuXHRcdFx0dGhpcy5ib29rU2VsZWN0LnNob3coeyBlbDogdGhpcy51aS5ib29rcyB9KTtcblx0XHRcdHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZShudWxsLCBcIlwiLCB3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdChcIj9cIilbMF0gKyBcIj9cIiArIHJlcXVpcmUoXCJxdWVyeXN0cmluZ1wiKS5zdHJpbmdpZnkoeyBncm91cHM6IHRoaXMucGFyYW1zLmdyb3VwcyB9KSk7XG5cdFx0XHR0aGlzLm9uR3JvdXBzQ2hhbmdlKCk7XG5cdFx0XHR0aGlzLm9uQm9va3NDaGFuZ2UoKTtcblx0XHR9XG5cdH0sXG5cblx0b25TZWxlY3Q6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0bW9kZWwuc2V0KFwic2luY2VUaW1lc3RhbXBcIiwgdGhpcy5zaW5jZVRpbWVzdGFtcCk7XG5cdFx0dGhpcy5zZWxlY3RlZFVzZXIgPSBtb2RlbDtcblx0XHR0aGlzLnRpbWVsaW5lVmlldyA9IG5ldyBDQU1UaW1lbGluZSh7IG1vZGVsOiBtb2RlbCwgcGFyYW1zOiB0aGlzLnBhcmFtcyB9KTtcblxuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcInRpbWVsaW5lXCIsIHRoaXMudGltZWxpbmVWaWV3KTtcblxuXHRcdHRoaXMubGlzdGVuVG8odGhpcy50aW1lbGluZVZpZXcsIFwiYmFja1wiLCB0aGlzLm9uVGltZWxpbmVCYWNrQ2xpY2suYmluZCh0aGlzKSk7XG5cblx0XHR0aGlzLnVpLnNlbGVjdG9yLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLnRpbWVsaW5lLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRvblRpbWVsaW5lQmFja0NsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLnNlbGVjdG9yLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLnRpbWVsaW5lLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnRpbWVsaW5lVmlldy5kZXN0cm95KCk7XG5cdH0sXG5cblx0dXBkYXRlQ291bnRlcjogZnVuY3Rpb24oKSB7XG5cdFx0bGV0IHRvdGFsVXNlcnMgPSAwLCB1c2VycyA9IDAsIGxhYmVsID0gXCJVc2VyXCI7XG5cdFx0Y29uc3QgdmlzaWJsZVN0YXRlcyA9IFtdO1xuXG5cdFx0JChcIi5zZWxlY3RlZC1zdGF0dXNcIikuZWFjaCgoaXRlbSwgZWxlbSkgPT4ge1xuXHRcdFx0dmlzaWJsZVN0YXRlcy5wdXNoKHBhcnNlSW50KCQoZWxlbSkuYXR0cihcImRhdGEtc3RhdHVzXCIpLCAxMCkpO1xuXHRcdH0pO1xuXG5cdFx0Xy5lYWNoKHRoaXMucG9zc2libGVTdGF0ZXMsIHN0YXRlID0+IHtcblx0XHRcdGlmIChfLmluY2x1ZGVzKHZpc2libGVTdGF0ZXMsIHN0YXRlKSkge1xuXHRcdFx0XHR1c2VycyArPSB0aGlzLmNvbGxlY3Rpb25zW3N0YXRlXS53aGVyZSh7IGhpZGU6IGZhbHNlIH0pLmxlbmd0aDtcblx0XHRcdFx0dG90YWxVc2VycyArPSB0aGlzLmNvbGxlY3Rpb25zW3N0YXRlXS5sZW5ndGg7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRpZiAodG90YWxVc2VycyAhPT0gMSlcblx0XHRcdGxhYmVsID0gXCJVc2Vyc1wiO1xuXG5cdFx0Y29uc3QgY291bnRlclRleHQgPSBcIjxzcGFuIGNsYXNzPSdjb3VudGVySW5mbyc+XCIgKyB1c2VycyArIFwiL1wiICsgdG90YWxVc2VycyArIFwiIFwiICsgbGFiZWwgKyBcIjwvc3Bhbj5cIjtcblx0XHR0aGlzLnVpLmNvdW50ZXIuaHRtbChjb3VudGVyVGV4dCk7XG5cblx0XHR0aGlzLnVwZGF0ZVN0YXR1c1BlcmNlbnRhZ2UoKTtcblx0fSxcblxuXHRvblNldHRpbmdDaGFuZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLnVpLm1vbml0b3JUZXh0Lmhhc0NsYXNzKFwiaGlkZVwiKSkge1xuXHRcdFx0dGhpcy5oaWRlU3RvcE1vbml0b3IoKTtcblx0XHRcdHRoaXMucmVzb3VyY2VDb2xsZWN0aW9uLnJlc2V0KCk7XG5cblx0XHRcdF8uZWFjaCh0aGlzLnBvc3NpYmxlU3RhdGVzLCBzdGF0ZSA9PiB7XG5cdFx0XHRcdHRoaXMuY29sbGVjdGlvbnNbc3RhdGVdLnJlc2V0KCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5jb2xsZWN0Q2FtRGF0YSA9IGZhbHNlO1xuXHRcdFx0dGhpcy51aS5zZWxlY3Rvci5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLnVpLnRpbWVsaW5lLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdGlmICh0aGlzLnRpbWVsaW5lVmlldylcblx0XHRcdFx0dGhpcy50aW1lbGluZVZpZXcuZGVzdHJveSgpO1xuXG5cdFx0XHR0aGlzLnVpLnN0YXR1c0ZpbHRlci5hZGRDbGFzcyhcInNlbGVjdGVkLXN0YXR1c1wiKTtcblx0XHRcdHRoaXMuc3RvcFRpbWVyKCk7XG5cdFx0fVxuXHR9LFxuXG5cdGhpZGVTdG9wTW9uaXRvcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5tb25pdG9yQnRuLmZpbmQoXCIubW9uaXRvci10ZXh0XCIpLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLm1vbml0b3JCdG4uZmluZChcIi5yZXN0YXJ0LXRleHRcIikuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkubW9uaXRvckJ0bi5yZW1vdmVDbGFzcyhcImFsZXJ0XCIpO1xuXHRcdHRoaXMudWkubW9uaXRvckJ0bi5hZGRDbGFzcyhcInN1Y2Nlc3NcIik7XG5cdH0sXG5cblx0c2hvd1N0b3BNb25pdG9yOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLm1vbml0b3JCdG4uZmluZChcIi5yZXN0YXJ0LXRleHRcIikucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkubW9uaXRvckJ0bi5maW5kKFwiLm1vbml0b3ItdGV4dFwiKS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5tb25pdG9yQnRuLnJlbW92ZUNsYXNzKFwic3VjY2Vzc1wiKTtcblx0XHR0aGlzLnVpLm1vbml0b3JCdG4uYWRkQ2xhc3MoXCJhbGVydFwiKTtcblx0fSxcblxuXHRvbkdyb3Vwc0NoYW5nZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5wYXJhbXMuZ3JvdXBzID0gXy5tYXAodGhpcy5ncm91cFNlbGVjdC5jb2xsZWN0aW9uLndoZXJlKHsgc2VsZWN0ZWQ6IHRydWUgfSksIGdyb3VwID0+IGdyb3VwLmdldChcImNvZGVcIikpO1xuXHRcdHRoaXMub25TZXR0aW5nQ2hhbmdlKCk7XG5cblx0XHRpZiAoIXRoaXMuaW5pdGlhbEdyb3VwTG9hZCAmJiB0aGlzLm9wdGlvbnMuZ3JvdXBzKSB7XG5cdFx0XHR0aGlzLm9uTW9uaXRvckJ0bkNsaWNrKCk7XG5cdFx0XHR0aGlzLmluaXRpYWxHcm91cExvYWQgPSB0cnVlO1xuXG5cdFx0XHRpZiAodGhpcy5wYXJhbXMuZ3JvdXBzKVxuXHRcdFx0XHR0aGlzLmJvb2tTZWxlY3QuY29sbGVjdGlvbi5mZXRjaCh7IHJlc2V0OiB0cnVlLCBkYXRhOiB7IGZldGNoOiB0cnVlLCBncm91cHM6IHRoaXMucGFyYW1zLmdyb3VwcywgcGFnZTogMSB9IH0pO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnBhcmFtcy5ncm91cHMpXG5cdFx0XHR0aGlzLmJvb2tTZWxlY3QuY29sbGVjdGlvbi5zZXRTZXJ2ZXJGaWx0ZXJzKHsgZ3JvdXBzOiB0aGlzLnBhcmFtcy5ncm91cHMsIHBhZ2VkOiB0cnVlIH0pO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuYm9va1NlbGVjdC5jb2xsZWN0aW9uLnNldFNlcnZlckZpbHRlcnMoe30pO1xuXG5cdFx0Y29uc3QgcVBhcmFtcyA9IHt9O1xuXG5cdFx0aWYgKHRoaXMucGFyYW1zLmdyb3Vwcy5sZW5ndGggPiAwKVxuXHRcdFx0cVBhcmFtcy5ncm91cHMgPSB0aGlzLnBhcmFtcy5ncm91cHM7XG5cdFx0aWYgKHRoaXMucGFyYW1zLmJvb2sgIT09IG51bGwpXG5cdFx0XHRxUGFyYW1zLmJvb2sgPSB0aGlzLnBhcmFtcy5ib29rO1xuXG5cdFx0d2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKG51bGwsIFwiXCIsIHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KFwiP1wiKVswXSArIFwiP1wiICsgcmVxdWlyZShcInF1ZXJ5c3RyaW5nXCIpLnN0cmluZ2lmeShxUGFyYW1zKSk7XG5cdH0sXG5cblx0b25Cb29rc0NoYW5nZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5vblNldHRpbmdDaGFuZ2UoKTtcblxuXHRcdGNvbnN0IHNlbGVjdGVkQm9vayA9IHRoaXMuYm9va1NlbGVjdC5nZXRTZWxlY3RlZCgpO1xuXG5cdFx0dGhpcy5wYXJhbXMuYm9vayA9IHNlbGVjdGVkQm9vayAmJiBzZWxlY3RlZEJvb2suc2VsZWN0ZWQgPyBzZWxlY3RlZEJvb2sudW5pdmVyc2FsX2lkIDogbnVsbDtcblxuXHRcdGlmICghdGhpcy5pbml0aWFsQm9va0xvYWQgJiYgdGhpcy5vcHRpb25zLmJvb2spIHtcblx0XHRcdHRoaXMub25Nb25pdG9yQnRuQ2xpY2soKTtcblx0XHRcdHRoaXMuaW5pdGlhbEJvb2tMb2FkID0gdHJ1ZTtcblxuXHRcdFx0aWYgKHRoaXMucGFyYW1zLmJvb2spXG5cdFx0XHRcdHRoaXMuZ3JvdXBTZWxlY3QucGFnZWRDb2xsZWN0aW9uLmZldGNoKHsgcmVzZXQ6IHRydWUsIGRhdGE6IHsgYm9vazogdGhpcy5wYXJhbXMuYm9vaywgcGFnZTogMSB9IH0pO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnBhcmFtcy5ib29rKVxuXHRcdFx0dGhpcy5ncm91cFNlbGVjdC5wYWdlZENvbGxlY3Rpb24uc2V0U2VydmVyRmlsdGVycyh7IGJvb2s6IHRoaXMucGFyYW1zLmJvb2ssIHdpdGhDdXN0b206IHRydWUgfSk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5ncm91cFNlbGVjdC5wYWdlZENvbGxlY3Rpb24uc2V0U2VydmVyRmlsdGVycyh7fSk7XG5cblx0XHRjb25zdCBxUGFyYW1zID0ge307XG5cblx0XHRpZiAodGhpcy5wYXJhbXMuZ3JvdXBzLmxlbmd0aCA+IDApXG5cdFx0XHRxUGFyYW1zLmdyb3VwcyA9IHRoaXMucGFyYW1zLmdyb3Vwcztcblx0XHRpZiAodGhpcy5wYXJhbXMuYm9vayAhPT0gbnVsbClcblx0XHRcdHFQYXJhbXMuYm9vayA9IHRoaXMucGFyYW1zLmJvb2s7XG5cblx0XHR3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUobnVsbCwgXCJcIiwgd2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoXCI/XCIpWzBdICsgXCI/XCIgKyByZXF1aXJlKFwicXVlcnlzdHJpbmdcIikuc3RyaW5naWZ5KHFQYXJhbXMpKTtcblx0XHR0aGlzLmJvb2tTZWxlY3QubW9kZWwuc2V0KHsgZGlzYWJsZWQ6ICF0aGlzLnVpLm1vbml0b3JCb29rcy5wcm9wKFwiY2hlY2tlZFwiKSB9KTtcblx0fSxcblxuXHRvbk1vbml0b3JCdG5DbGljazogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gU2hvdyBlcnJvciBpZiBub3RoaW5nIHNlbGVjdGVkXG5cdFx0aWYgKHRoaXMuZ3JvdXBTZWxlY3QuY29sbGVjdGlvbi5sZW5ndGggPT09IDAgJiYgKCF0aGlzLmJvb2tTZWxlY3QuZ2V0U2VsZWN0ZWQoKSB8fCAhdGhpcy5ib29rU2VsZWN0LmdldFNlbGVjdGVkKCkuc2VsZWN0ZWQpICYmICF0aGlzLm9wdGlvbnMuZ3JvdXBzKSB7XG5cdFx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuVG9hc3QsIHtcblx0XHRcdFx0Y29udGVudDogXCJQbGVhc2Ugc2VsZWN0IGEgZ3JvdXAgb3IgYm9va1wiLFxuXHRcdFx0XHRpY29uOiBcImZhLWJhblwiLFxuXHRcdFx0XHRpY29uQ29sb3VyOiBcInJlZFwiLFxuXHRcdFx0XHRob3N0OiBcIiNtb2RhbHNcIixcblx0XHRcdH0pO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMudWkuc2VsZWN0b3IucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMubW9uaXRvcmluZyA9IHRydWU7XG5cdFx0dGhpcy5jb2xsZWN0Q2FtRGF0YSA9IHRydWU7XG5cblx0XHRpZiAodGhpcy51aS5tb25pdG9yQnRuLmZpbmQoXCIucmVzdGFydC10ZXh0XCIpLmhhc0NsYXNzKFwiaGlkZVwiKSkge1xuXHRcdFx0dGhpcy5zaG93U3RvcE1vbml0b3IoKTtcblx0XHRcdGNvbnN0IHJlc291cmNlUGFyYW1zID0geyBpZHM6IFtdIH07XG5cblx0XHRcdGlmICh0aGlzLnBhcmFtcy5ncm91cHMubGVuZ3RoID4gMClcblx0XHRcdFx0cmVzb3VyY2VQYXJhbXMuaWRzID0gdGhpcy5wYXJhbXMuZ3JvdXBzO1xuXG5cdFx0XHRpZiAoIV8uaXNOaWwodGhpcy5wYXJhbXMuYm9vaykpXG5cdFx0XHRcdHJlc291cmNlUGFyYW1zLmlkcy5wdXNoKHRoaXMucGFyYW1zLmJvb2spO1xuXG5cdFx0XHR0aGlzLnJlc291cmNlQ29sbGVjdGlvbi5mZXRjaCh7IHJlc2V0OiB0cnVlLCBkYXRhOiAkLnBhcmFtKHJlc291cmNlUGFyYW1zKSB9KTtcblx0XHRcdHRoaXMuY29sbGVjdGlvbnNbMF0uZmV0Y2goeyByZXNldDogdHJ1ZSwgZGF0YTogJC5wYXJhbSh0aGlzLnBhcmFtcykgfSk7XG5cdFx0XHR0aGlzLnVpLnNlbGVjdG9yLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHRoaXMuc3RhcnRUaW1lcigpO1xuXHRcdFx0dGhpcy5zaW5jZVRpbWVzdGFtcCA9IG1vbWVudCgpLnVuaXgoKTtcblx0XHRcdHRoaXMudWkuc3RhdHVzRmlsdGVyLmFkZENsYXNzKFwic2VsZWN0ZWQtc3RhdHVzXCIpO1xuXHRcdFx0dGhpcy5vblN0YXR1c0ZpbHRlckNsaWNrKCk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5oaWRlU3RvcE1vbml0b3IoKTtcblx0XHRcdHRoaXMucmVzb3VyY2VDb2xsZWN0aW9uLnJlc2V0KCk7XG5cdFx0XHRfLmVhY2godGhpcy5wb3NzaWJsZVN0YXRlcywgc3RhdGUgPT4ge1xuXHRcdFx0XHR0aGlzLmNvbGxlY3Rpb25zW3N0YXRlXS5yZXNldCgpO1xuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMuY29sbGVjdENhbURhdGEgPSBmYWxzZTtcblx0XHRcdHRoaXMudWkuc2VsZWN0b3IuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0dGhpcy51aS50aW1lbGluZS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLnN0b3BUaW1lcigpO1xuXHRcdH1cblxuXHRcdC8vIHNldCBmaWx0ZXJUeXBlIHRvIGJvb2sgb3IgZ3JvdXBcblx0XHRpZiAodGhpcy5wYXJhbXMuYm9vayAmJiB0aGlzLnVpLm1vbml0b3JCb29rcy5wcm9wKFwiY2hlY2tlZFwiKSlcblx0XHRcdHRoaXMudWkuZmlsdGVyVHlwZS50ZXh0KFwiYm9va1wiKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnVpLmZpbHRlclR5cGUudGV4dChcImdyb3VwXCIpO1xuXHR9LFxuXG5cdG9uU3RhdHVzRmlsdGVyQ2xpY2s6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0aWYgKGV2ZW50KSB7XG5cdFx0XHRjb25zdCBlbCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG5cdFx0XHRlbC50b2dnbGVDbGFzcyhcInNlbGVjdGVkLXN0YXR1c1wiKTtcblx0XHR9XG5cblx0XHQkKFwiLmNhbS11c2VyLWdyaWQtcmVnaW9uXCIpLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHQkKFwiLnNlbGVjdGVkLXN0YXR1c1wiKS5lYWNoKChpdGVtLCBlbGVtKSA9PiB7XG5cdFx0XHQkKFwiLmdyaWRcIiArICQoZWxlbSkuZGF0YShcInN0YXR1c1wiKSkucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy51cGRhdGVDb3VudGVyKCk7XG5cdH0sXG5cblx0b25TZWFyY2hCb3hDaGFuZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLnVpLnNlYXJjaEJveC52YWwoKS5sZW5ndGggPiAwKVxuXHRcdFx0dGhpcy51aS5jbGVhclNlYXJjaC5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy51aS5jbGVhclNlYXJjaC5hZGRDbGFzcyhcImhpZGVcIik7XG5cblx0XHRfLmVhY2godGhpcy5wb3NzaWJsZVN0YXRlcywgc3RhdGUgPT4ge1xuXHRcdFx0dGhpcy5jb2xsZWN0aW9uc1tzdGF0ZV0uYnlUZXh0U2VhcmNoKHRoaXMudWkuc2VhcmNoQm94LnZhbCgpKTtcblx0XHR9KTtcblxuXHRcdHRoaXMudXBkYXRlQ291bnRlcigpO1xuXHR9LFxuXG5cdG9uQ2xlYXJTZWFyY2hDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5zZWFyY2hCb3gudmFsKFwiXCIpO1xuXHRcdF8uZWFjaCh0aGlzLnBvc3NpYmxlU3RhdGVzLCBzdGF0ZSA9PiB7XG5cdFx0XHR0aGlzLmNvbGxlY3Rpb25zW3N0YXRlXS5ieVRleHRTZWFyY2goXCJcIik7XG5cdFx0fSk7XG5cblx0XHR0aGlzLnVwZGF0ZUNvdW50ZXIoKTtcblx0fSxcblxuXHR3c0Nvbm5lY3RlZDogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgY29tcGxldGVDb25uZWN0aW9uID0gKCkgPT4ge1xuXHRcdFx0dGhpcy5tb2RlbC5zZXQoeyB3c0Nvbm5lY3RlZDogdHJ1ZSB9KTtcblx0XHR9O1xuXG5cdFx0cmV0dXJuIEFwcC53cy5nZXRJRCgpLnRoZW4oaWQgPT4ge1xuXHRcdFx0dGhpcy5tb2RlbC5zZXQoeyB3ZWJzb2NrZXRfaWQ6IGlkIH0pO1xuXHRcdFx0cmV0dXJuIGNvbXBsZXRlQ29ubmVjdGlvbigpO1xuXHRcdH0pO1xuXHR9LFxuXG5cdHdzRGlzY29ubmVjdGVkOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm1vZGVsLnNldCh7IHdzQ29ubmVjdGVkOiBmYWxzZSB9KTtcblx0fSxcblxuXHR3c0Nvbm5lY3Rpb25DaGFuZ2VkOiBmdW5jdGlvbigpIHtcblx0XHRsZXQgY29sbGVjdERhdGEgPSBmYWxzZTtcblxuXHRcdF8uZWFjaCh0aGlzLnBvc3NpYmxlU3RhdGVzLCBzdGF0ZSA9PiB7XG5cdFx0XHRpZiAodGhpcy5jb2xsZWN0aW9uc1tzdGF0ZV0ubGVuZ3RoID4gMClcblx0XHRcdFx0Y29sbGVjdERhdGEgPSB0cnVlO1xuXHRcdH0pO1xuXG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwid3NDb25uZWN0ZWRcIikgJiYgY29sbGVjdERhdGEpIHtcblx0XHRcdHRoaXMuZ2V0Q2FtRGF0YSgpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdC8vIFVzZXIgZ290IGxvZ2dlZCBvdXQuXG5cdFx0XHRpZiAoIUFwcC5TZXNzaW9uLmdldChcImF1dGhlbnRpY2F0ZWRcIikpXG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0dGhpcy5tb2RlbC51bnNldChcIndlYnNvY2tldF9pZFwiKTtcblx0XHRcdHRoaXMubW9kZWwudW5zZXQoXCJzcGFya1wiKTtcblxuXHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7XG5cdFx0XHRcdGNvbnRlbnQ6IFwiQ29ubmVjdGlvbiBsb3N0XCIsXG5cdFx0XHRcdGljb246IFwiZmEtd2lmaS1zbGFzaFwiLFxuXHRcdFx0XHRpY29uQ29sb3VyOiBcInJlZFwiLFxuXHRcdFx0XHRob3N0OiBcIi5tb2RhbC1ob3N0XCIsXG5cdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0d3NNZXNzYWdlOiBmdW5jdGlvbihtZXNzYWdlKSB7XG5cdFx0Ly8gQ2hlY2sgaWYgdXNlcnNIYXNoLnVzZXJuYW1lIGV4aXN0cyBpbiB1c2VycyBzZWxlY3RvciBiZWZvcmUgYWRkVXNlclN0YXRcblx0XHRpZiAobWVzc2FnZS5jYW1EYXRhICYmIG1lc3NhZ2UudXNlckhhc2gpXG5cdFx0XHR0aGlzLmFkZFVzZXJTdGF0KG1lc3NhZ2UudXNlckhhc2gpO1xuXHRcdGlmIChtZXNzYWdlLmNhbURhdGEgJiYgbWVzc2FnZS51c2VySGFzaCAmJiB0aGlzLnRpbWVsaW5lVmlldyAmJiB0aGlzLnRpbWVsaW5lVmlldy5pc1JlbmRlcmVkKCkgJiYgbWVzc2FnZS51c2VySGFzaC51c2VybmFtZSA9PT0gdGhpcy50aW1lbGluZVZpZXcubW9kZWwuZ2V0KFwidXNlcm5hbWVcIikpXG5cdFx0XHR0aGlzLnRpbWVsaW5lVmlldy51cGRhdGVUaW1lbGluZSgpO1xuXHRcdGlmIChtZXNzYWdlLmNhbURhdGEgJiYgbWVzc2FnZS5leHBpcmUpXG5cdFx0XHR0aGlzLm9uRXhwaXJlKCk7XG5cdH0sXG5cblx0b25FeHBpcmU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZ2V0Q2FtRGF0YSgpO1xuXHR9LFxuXG5cdGdldENhbURhdGE6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHVzZXIgPSByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpO1xuXG5cdFx0QXBwLndzLndlYnNvY2tldC53cml0ZSh7XG5cdFx0XHRjYW06IHRydWUsXG5cdFx0XHRhY3Rpb246IFwiZ2V0Q2FtRGF0YVwiLFxuXHRcdFx0dXNlcjogdXNlci51c2VybmFtZSxcblx0XHRcdHBhcmFtczogdGhpcy5wYXJhbXMsXG5cdFx0XHR1c2VyczogdGhpcy5jb2xsZWN0aW9ucyxcblx0XHRcdHJvb206ICh0aGlzLnBhcmFtcy5ncm91cHMgPyB0aGlzLnBhcmFtcy5ncm91cHMuam9pbihcIjpcIikgOiBcIlwiKSArXG5cdFx0XHRcdCh0aGlzLnBhcmFtcy5ib29rID8gXCI6OlwiICsgdGhpcy5wYXJhbXMuYm9vayA6IFwiXCIpLFxuXHRcdH0pO1xuXHR9LFxuXG5cdGFkZFVzZXJTdGF0OiBmdW5jdGlvbihzdGF0KSB7XG5cdFx0Y29uc3QgZXhpc3RpbmdTdGF0ID0gXy5maW5kKHRoaXMuc3RhdHNDb2xsZWN0aW9uLm1vZGVscywgc3RhdE1vZGVsID0+XG5cdFx0XHRzdGF0TW9kZWwuZ2V0KFwidXNlcm5hbWVcIikgPT09IHN0YXQudXNlcm5hbWUgJiYgc3RhdE1vZGVsLmdldChcInRpbWVcIikgPT09IHN0YXQudGltZSAmJiBzdGF0TW9kZWwuZ2V0KFwic3RhdGVcIikgPT09IHN0YXQuc3RhdGVcblx0XHQpO1xuXG5cdFx0aWYgKGV4aXN0aW5nU3RhdClcblx0XHRcdHJldHVybjtcblxuXHRcdGlmIChzdGF0LnN0YXRlID09PSBcImluIGFwcFwiICYmIHN0YXQuc2NyZWVuID09PSBcImdyb3VwIGxpc3RcIiAmJiAoc3RhdC5wcmV2X3N0YXRlID09PSBcImluIGJvb2tcIiB8fCBzdGF0W1wicHJldiBzdGF0ZVwiXSA9PT0gXCJpbiBib29rXCIpKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0Ly8gRG8gbm90IGFkZCB0cm91Ymxlc2hvb3RlciBzdGF0IGlmIGl0IHdhcyBvcGVuZWQgZnJvbSByZXNvdXJjZSBvciBncm91cFxuXHRcdGlmIChzdGF0LnN0YXRlID09PSBcImluIGFwcFwiICYmIHN0YXQuc2NyZWVuID09PSBcInRyb3VibGVzaG9vdGVyXCIgJiYgKF8uaW5jbHVkZXMoW1wiaW4gcmVzb3VyY2VcIiwgXCJpbiBncm91cFwiXSwgc3RhdC5wcmV2X3N0YXRlKSB8fCBfLmluY2x1ZGVzKFtcImluIHJlc291cmNlXCIsIFwiaW4gZ3JvdXBcIl0sIHN0YXRbXCJwcmV2IHN0YXRlXCJdKSkpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLnN0YXRzQ29sbGVjdGlvbi5hZGQobmV3IFN0YXRzTW9kZWwoc3RhdCkpO1xuXHRcdC8vIEZpbmQgdXNlciBjdXJyZW50IGNvbGxlY3Rpb25cblx0XHRjb25zdCByZXN1bHQgPSB7fTtcblx0XHRfLmVhY2godGhpcy5wb3NzaWJsZVN0YXRlcywgc3RhdGUgPT4ge1xuXHRcdFx0Y29uc3QgbW9kZWwgPSB0aGlzLmNvbGxlY3Rpb25zW3N0YXRlXS5maW5kV2hlcmUoeyB1c2VybmFtZTogc3RhdC51c2VybmFtZSB9KTtcblxuXHRcdFx0aWYgKG1vZGVsKVxuXHRcdFx0XHRyZXN1bHQudXNlciA9IG1vZGVsO1xuXHRcdH0pO1xuXG5cdFx0aWYgKCFyZXN1bHQudXNlcilcblx0XHRcdHJldHVybjtcblxuXHRcdGNvbnN0IHVzZXJTdGF0cyA9IF8uZmlsdGVyKHRoaXMuc3RhdHNDb2xsZWN0aW9uLm1vZGVscywgc3RhdE1vZGVsID0+IHN0YXRNb2RlbC5nZXQoXCJ1c2VybmFtZVwiKSA9PT0gcmVzdWx0LnVzZXIuZ2V0KFwidXNlcm5hbWVcIikpO1xuXG5cdFx0Y29uc3QgbGF0ZXN0VXNlclN0YXQgPSBfLmZpcnN0KF8ub3JkZXJCeSh1c2VyU3RhdHMsIHN0YXRNb2RlbCA9PiBbc3RhdE1vZGVsLmdldChcInRpbWVcIiksIHN0YXRNb2RlbC5nZXQoXCJ0aW1lc3RhbXBcIildLCBcImRlc2NcIikpO1xuXG5cdFx0Y29uc3QgcHJldlN0YXRlID0gcmVzdWx0LnVzZXIuZ2V0KFwic3RhdHVzXCIpO1xuXG5cdFx0Ly8gdXNlciBub3QgaW4gZ3JvdXAgb3IgYm9vayBvciByZWxhdGVkIHJlc291cmNlXG5cdFx0bGV0IHN0YXR1cyA9IFNUQVRVU19SRUQ7XG5cblx0XHQvLyBjaGVjayB3aGV0aGVyIGluIGJvb2tcblx0XHRpZiAodGhpcy5wYXJhbXMuYm9vaykge1xuXHRcdFx0Y29uc3Qgb3V0T2ZCb29rU3RhdGVzID0gW1wiZm9jdXMgbG9zdFwiLCBcImluIGFwcFwiLCBcImFwcCBjbG9zZWRcIiwgXCJsaWJyYXJ5XCIsIFwibGFzdHdpbGxcIiwgXCJpbiBncm91cFwiLCBcImNyYXNoZWRcIiwgXCJzdGFydGVkXCJdO1xuXG5cdFx0XHRjb25zdCBzZWxlY3RlZEJvb2tJZCA9IHRoaXMuYm9va1NlbGVjdC5nZXRTZWxlY3RlZCgpLnVuaXZlcnNhbF9pZDtcblxuXHRcdFx0aWYgKChsYXRlc3RVc2VyU3RhdC5nZXQoXCJzdGF0ZVwiKSA9PT0gXCJpbiBib29rXCIgJiYgbGF0ZXN0VXNlclN0YXQuZ2V0KFwiYm9va19pZFwiKSA9PT0gc2VsZWN0ZWRCb29rSWQpIHx8XG5cdFx0XHRcdChsYXRlc3RVc2VyU3RhdC5nZXQoXCJzdGF0ZVwiKSA9PT0gXCJpbiByZXNvdXJjZVwiICYmIHRoaXMucmVzb3VyY2VDb2xsZWN0aW9uLndoZXJlKHsgYXR0YWNobWVudF9pZDogbGF0ZXN0VXNlclN0YXQuZ2V0KFwiYXR0YWNobWVudF9pZFwiKSB9KS5sZW5ndGggPiAwKSkge1xuXHRcdFx0XHRpZiAoXy5maW5kKHVzZXJTdGF0cywgc3RhdE1vZGVsID0+IF8uaW5jbHVkZXMob3V0T2ZCb29rU3RhdGVzLCBzdGF0TW9kZWwuZ2V0KFwic3RhdGVcIikpKSlcblx0XHRcdFx0XHRzdGF0dXMgPSBTVEFUVVNfT1JBTkdFO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0c3RhdHVzID0gU1RBVFVTX0dSRUVOO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHN0YXR1cyA9IFNUQVRVU19SRUQ7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIGNoZWNrIHdoZXRoZXIgaW4gc3BlY2lmaWMgZ3JvdXAgb3IgZ3JvdXBfYm9va1xuXHRcdGVsc2UgaWYgKGxhdGVzdFVzZXJTdGF0LmdldChcInN0YXRlXCIpID09PSBcImluIGdyb3VwXCIgfHwgbGF0ZXN0VXNlclN0YXQuZ2V0KFwic3RhdGVcIikgPT09IFwiaW4gcmVzb3VyY2VcIiB8fCAobGF0ZXN0VXNlclN0YXQuZ2V0KFwic3RhdGVcIikgPT09IFwiaW4gYm9va1wiICYmXG5cdFx0XHR0aGlzLmJvb2tTZWxlY3QuY29sbGVjdGlvbi53aGVyZSh7IHVuaXZlcnNhbF9pZDogbGF0ZXN0VXNlclN0YXQuZ2V0KFwiYm9va19pZFwiKSB9KS5sZW5ndGggPiAwKSkge1xuXHRcdFx0Y29uc3QgaW5Hcm91cFN0YXRzID0gXy5maWx0ZXIodXNlclN0YXRzLCBzdGF0TW9kZWwgPT4gKFxuXHRcdFx0XHQvLyBtYXRjaGluZyBtb25pdG9yZWQgZ3JvdXBfaWRcblx0XHRcdFx0KHN0YXRNb2RlbC5nZXQoXCJzdGF0ZVwiKSA9PT0gXCJpbiBncm91cFwiICYmIF8uaW5jbHVkZXModGhpcy5wYXJhbXMuZ3JvdXBzLCBzdGF0TW9kZWwuZ2V0KFwiZ3JvdXBfaWRcIikpKSB8fFxuXHRcdFx0XHQvLyBtYXRjaGluZyBtb25pdG9yZWQgcmVzb3VyY2UgLyBib29rIGxpbmtlZCB0byBncm91cFxuXHRcdFx0XHRzdGF0TW9kZWwuZ2V0KFwic3RhdGVcIikgPT09IFwiaW4gcmVzb3VyY2VcIiB8fCBzdGF0TW9kZWwuZ2V0KFwic3RhdGVcIikgPT09IFwiaW4gYm9va1wiKSAmJlxuXHRcdFx0XHQoXG5cdFx0XHRcdFx0Xy5pbmNsdWRlcyh0aGlzLnBhcmFtcy5ncm91cHMsIHN0YXRNb2RlbC5nZXQoXCJncm91cF9pZFwiKSkgfHxcblx0XHRcdFx0XHRfLmluY2x1ZGVzKHRoaXMucGFyYW1zLmdyb3Vwcywgc3RhdE1vZGVsLmdldChcInByZXYgZ3JvdXBfaWRcIikpIHx8XG5cdFx0XHRcdFx0dGhpcy5ib29rU2VsZWN0LmNvbGxlY3Rpb24ud2hlcmUoeyB1bml2ZXJzYWxfaWQ6IHN0YXRNb2RlbC5nZXQoXCJib29rX2lkXCIpIH0pLmxlbmd0aCA+IDAgfHxcblx0XHRcdFx0XHR0aGlzLnJlc291cmNlQ29sbGVjdGlvbi53aGVyZSh7IF9pZDogc3RhdE1vZGVsLmdldChcInJlc291cmNlX2lkXCIpIH0pLmxlbmd0aCA+IDBcblx0XHRcdFx0KVxuXHRcdFx0KTtcblxuXHRcdFx0Y29uc3QgaW5Cb29rU3RhdHMgPSBfLmZpbHRlcih1c2VyU3RhdHMsIHN0YXRNb2RlbCA9PiAoc3RhdE1vZGVsLmdldChcInN0YXRlXCIpID09PSBcImluIGJvb2tcIiB8fCBzdGF0TW9kZWwuZ2V0KFwic3RhdGVcIikgPT09IFwiaW4gcmVzb3VyY2VcIikgJiZcblx0XHRcdFx0KHN0YXRNb2RlbC5nZXQoXCJib29rX2lkXCIpID09PSB0aGlzLnBhcmFtcy5ib29rIHx8IHN0YXRNb2RlbC5nZXQoXCJwcmV2X2Jvb2tfaWRcIikgPT09IHRoaXMucGFyYW1zLmJvb2sgfHxcblx0XHRcdFx0XHR0aGlzLnJlc291cmNlQ29sbGVjdGlvbi53aGVyZSh7IF9pZDogc3RhdE1vZGVsLmdldChcInJlc291cmNlX2lkXCIpIH0pLmxlbmd0aCA+IDApKTtcblxuXHRcdFx0Ly8gaWYgdXNlclN0YXRzIGluY2x1ZGVzIGFueXRoaW5nIGVsc2UgdGhhbiBcImluIGdyb3VwXCIgKGZvciB0aGF0IGdyb3VwKSBvciBcImluIGJvb2tcIiAoZm9yIHRoYXQgYm9vayksIG1ha2Ugc3RhdHVzIE9SQU5HRVxuXHRcdFx0aWYgKChpbkdyb3VwU3RhdHMubGVuZ3RoID4gMCAmJiBpbkdyb3VwU3RhdHMubGVuZ3RoIDwgdXNlclN0YXRzLmxlbmd0aCkgfHwgKGluQm9va1N0YXRzLmxlbmd0aCA+IDAgJiYgaW5Cb29rU3RhdHMubGVuZ3RoIDwgdXNlclN0YXRzLmxlbmd0aCkpIHtcblx0XHRcdFx0aWYgKGluR3JvdXBTdGF0cy5sZW5ndGggIT09IDAgJiYgaW5Hcm91cFN0YXRzLmxlbmd0aCA9PT0gdXNlclN0YXRzLmxlbmd0aCB8fCBpbkJvb2tTdGF0cy5sZW5ndGggIT09IDAgJiYgaW5Cb29rU3RhdHMubGVuZ3RoID09PSB1c2VyU3RhdHMubGVuZ3RoKVxuXHRcdFx0XHRcdHN0YXR1cyA9IFNUQVRVU19HUkVFTjtcblx0XHRcdFx0ZWxzZSBpZiAoaW5Hcm91cFN0YXRzLmxlbmd0aCAhPT0gMCAmJiBfLmZpbmQoaW5Hcm91cFN0YXRzLCBncm91cFN0YXQgPT4gZ3JvdXBTdGF0LmdldChcImdyb3VwX2lkXCIpID09PSBsYXRlc3RVc2VyU3RhdC5nZXQoXCJncm91cF9pZFwiKSkpXG5cdFx0XHRcdFx0c3RhdHVzID0gU1RBVFVTX09SQU5HRTtcblx0XHRcdFx0ZWxzZSBpZiAoaW5Cb29rU3RhdHMubGVuZ3RoICE9PSAwICYmIF8uZmluZChpbkJvb2tTdGF0cywgYm9va1N0YXQgPT4gYm9va1N0YXQuZ2V0KFwiZ3JvdXBfaWRcIikgPT09IGxhdGVzdFVzZXJTdGF0LmdldChcImdyb3VwX2lkXCIpKSlcblx0XHRcdFx0XHRzdGF0dXMgPSBTVEFUVVNfT1JBTkdFO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0c3RhdHVzID0gU1RBVFVTX1JFRDtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKGluR3JvdXBTdGF0cy5sZW5ndGggIT09IDAgJiYgXy5maW5kKGluR3JvdXBTdGF0cywgZ3JvdXBTdGF0ID0+IGdyb3VwU3RhdC5nZXQoXCJncm91cF9pZFwiKSA9PT0gbGF0ZXN0VXNlclN0YXQuZ2V0KFwiZ3JvdXBfaWRcIikpKSB7XG5cdFx0XHRcdHN0YXR1cyA9IFNUQVRVU19HUkVFTjtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKGluQm9va1N0YXRzLmxlbmd0aCAhPT0gMCAmJiBfLmZpbmQoaW5Cb29rU3RhdHMsIGJvb2tTdGF0ID0+IGJvb2tTdGF0LmdldChcImdyb3VwX2lkXCIpID09PSBsYXRlc3RVc2VyU3RhdC5nZXQoXCJncm91cF9pZFwiKSkpIHtcblx0XHRcdFx0c3RhdHVzID0gU1RBVFVTX0dSRUVOO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFscmVhZHkgaW4gdGhlIHJpZ2h0IHN0YXRlXG5cdFx0aWYgKHByZXZTdGF0ZSA9PT0gc3RhdHVzKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0cmVzdWx0LnVzZXIuc2V0KHsgc3RhdHVzOiBzdGF0dXMgfSk7XG5cdFx0dGhpcy5jb2xsZWN0aW9uc1tzdGF0dXNdLmFkZChyZXN1bHQudXNlcik7XG5cdFx0dGhpcy5jb2xsZWN0aW9uc1twcmV2U3RhdGVdLnJlbW92ZShyZXN1bHQudXNlcik7XG5cblx0XHR0aGlzLnVwZGF0ZVN0YXR1c1BlcmNlbnRhZ2UoKTtcblx0fSxcblxuXHR1cGRhdGVTdGF0dXNQZXJjZW50YWdlOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBwZXJjZW50YWdlcyA9IHsgdG90YWw6IDAgfTtcblx0XHRfLmVhY2godGhpcy5wb3NzaWJsZVN0YXRlcywgc3RhdGUgPT4ge1xuXHRcdFx0cGVyY2VudGFnZXNbc3RhdGVdID0gdGhpcy5jb2xsZWN0aW9uc1tzdGF0ZV0ubGVuZ3RoO1xuXHRcdFx0cGVyY2VudGFnZXMudG90YWwgKz0gdGhpcy5jb2xsZWN0aW9uc1tzdGF0ZV0ubGVuZ3RoO1xuXHRcdH0pO1xuXG5cdFx0Xy5lYWNoKHRoaXMucG9zc2libGVTdGF0ZXMsIHN0YXRlID0+IHtcblx0XHRcdGlmIChwZXJjZW50YWdlcy50b3RhbCA+IDApXG5cdFx0XHRcdCQoXCIuc3RhdHVzLWZpbHRlci1cIiArIHN0YXRlKS5maW5kKFwiLnN0YXR1cy1wZXJjZW50YWdlXCIpLnRleHQoXCIoXCIgKyBNYXRoLnJvdW5kKChwZXJjZW50YWdlc1tzdGF0ZV0gLyBwZXJjZW50YWdlcy50b3RhbCkgKiAxMDApICsgXCIlKVwiKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0JChcIi5zdGF0dXMtZmlsdGVyLVwiICsgc3RhdGUpLmZpbmQoXCIuc3RhdHVzLXBlcmNlbnRhZ2VcIikudGV4dChcIihcIiArIHBlcmNlbnRhZ2VzW3N0YXRlXSArIFwiJSlcIik7XG5cdFx0fSk7XG5cdH0sXG5cblx0c3RhcnRUaW1lcjogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgcGFkID0gZnVuY3Rpb24odmFsKSB7IHJldHVybiB2YWwgPCAxMCA/IFwiMFwiICsgdmFsIDogdmFsOyB9O1xuXHRcdHRoaXMuc2Vzc2lvblRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuXHRcdFx0Y29uc3QgdGltZV9zaG93biA9IHRoaXMubW9kZWwuZ2V0KFwic2Vzc2lvblRpbWVcIik7XG5cdFx0XHRjb25zdCB0aW1lX2NodW5rcyA9IHRpbWVfc2hvd24uc3BsaXQoXCI6XCIpO1xuXHRcdFx0bGV0IGhvdXIsIG1pbnMsIHNlY3M7XG5cblx0XHRcdGhvdXIgPSBOdW1iZXIodGltZV9jaHVua3NbMF0pO1xuXHRcdFx0bWlucyA9IE51bWJlcih0aW1lX2NodW5rc1sxXSk7XG5cdFx0XHRzZWNzID0gTnVtYmVyKHRpbWVfY2h1bmtzWzJdKTtcblx0XHRcdHNlY3MrKztcblx0XHRcdGlmIChzZWNzID09PSA2MCkge1xuXHRcdFx0XHRzZWNzID0gMDtcblx0XHRcdFx0bWlucyA9IG1pbnMgKyAxO1xuXHRcdFx0fVxuXHRcdFx0aWYgKG1pbnMgPT09IDYwKSB7XG5cdFx0XHRcdG1pbnMgPSAwO1xuXHRcdFx0XHRob3VyID0gaG91ciArIDE7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaG91ciA9PT0gMTMpXG5cdFx0XHRcdGhvdXIgPSAxO1xuXHRcdFx0aWYgKGhvdXIgPCAxMClcblx0XHRcdFx0aG91ciA9IFwiMFwiICsgaG91cjtcblxuXHRcdFx0dGhpcy5tb2RlbC5zZXQoXCJzZXNzaW9uVGltZVwiLCBob3VyICsgXCI6XCIgKyBwYWQobWlucykgKyBcIjpcIiArIHBhZChzZWNzKSk7XG5cdFx0fSwgMTAwMCk7XG5cblx0XHR0aGlzLnNpbmNlVGltZXN0YW1wID0gbW9tZW50KCkudW5peCgpO1xuXHRcdHRoaXMuc3RhdHNDb2xsZWN0aW9uLnJlc2V0KCk7XG5cdH0sXG5cblx0c3RvcFRpbWVyOiBmdW5jdGlvbigpIHtcblx0XHRjbGVhckludGVydmFsKHRoaXMuc2Vzc2lvblRpbWVyKTtcblx0XHR0aGlzLm1vZGVsLnNldChcInNlc3Npb25UaW1lXCIsIFwiMDA6MDA6MDBcIik7XG5cdH0sXG5cblx0b25TZXNzaW9uVGltZUNoYW5nZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkuc2Vzc2lvblRpbWUudGV4dCh0aGlzLm1vZGVsLmdldChcInNlc3Npb25UaW1lXCIpKTtcblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc3RvcFRpbWVyKCk7XG5cdFx0dGhpcy5zdG9wTW9uaXRlcih0aGlzLnBhcmFtcyk7XG5cdFx0dGhpcy5ib29rU2VsZWN0LmRlc3Ryb3koKTtcblx0XHR0aGlzLmdyb3VwU2VsZWN0LmRlc3Ryb3koKTtcblx0XHRfLmVhY2godGhpcy5wb3NzaWJsZVN0YXRlcywgc3RhdGUgPT4ge1xuXHRcdFx0dGhpcy5jYW1Vc2Vyc1ZpZXdzW3N0YXRlXS5kZXN0cm95KCk7XG5cdFx0fSk7XG5cdH0sXG5cblx0c3RvcE1vbml0ZXI6IGZ1bmN0aW9uKHBhcmFtcykge1xuXHRcdGNvbnN0IHVzZXIgPSByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpO1xuXG5cdFx0aWYgKEFwcC53cy53ZWJzb2NrZXQpIHtcblx0XHRcdEFwcC53cy53ZWJzb2NrZXQud3JpdGUoe1xuXHRcdFx0XHRjYW06IHRydWUsXG5cdFx0XHRcdGFjdGlvbjogXCJzdG9wTW9uaXRlclwiLFxuXHRcdFx0XHRwYXJhbXM6IHBhcmFtcyxcblx0XHRcdFx0dXNlcjogdXNlci51c2VybmFtZSxcblx0XHRcdH0pO1xuXHRcdH1cblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiY29udGVudCBjYW0tdXNlci1zZWxlY3Rvci1sYXlvdXRcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9jYW0ubnVualwiKS5sYXlvdXQsXG5cblx0cmVnaW9uczoge1xuXHRcdHNlbGVjdG9yOiBcIi5jYW0tdXNlci1zZWxlY3Rvci1yZWdpb25cIixcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgcXMgPSByZXF1aXJlKFwicXVlcnlzdHJpbmdcIikucGFyc2UoKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggfHwgXCIgXCIpLnNsaWNlKDEpKTtcblx0XHRpZiAoIXFzLmdyb3Vwcykge1xuXHRcdFx0cXMuZ3JvdXBzID0gcXNbXCJncm91cHNbXVwiXTtcblx0XHRcdGRlbGV0ZSBxc1tcImdyb3Vwc1tdXCJdO1xuXHRcdH1cblxuXHRcdHRoaXMuc2VsZWN0b3JWaWV3ID0gbmV3IENhbVVzZXJzU2VsZWN0b3IocXMpO1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcInNlbGVjdG9yXCIsIHRoaXMuc2VsZWN0b3JWaWV3KTtcblx0fSxcbn0pOyJdfQ==",
    "\"use strict\";\n\nvar _radioEvents;\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\n\nvar App = require(\"../../index\");\nvar settings = require(\"app-settings\");\nvar radio = Backbone.Radio.channel(\"global\");\nvar eventBus = require(\"./console/eventBus\");\n\nvar STATUS_RED = 0;\nvar STATUS_ORANGE = 1;\nvar STATUS_GREEN = 2;\n\nvar Model = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"_id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/users\";\n\t}\n});\n\nvar UserCollection = Backbone.Collection.extend({\n\tmodel: Model,\n\tmode: \"server\",\n\n\tcomparator: function comparator(user) {\n\t\treturn [user.get(\"status\"), _.toLower(user.get(\"firstname\") + user.get(\"surname\"))];\n\t},\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/acacia/users/assigned/bookOrGroup\";\n\t}\n});\n\n// Books that are linked to the monitored group\nvar BookCollection = Backbone.Collection.extend({\n\tmodel: Model,\n\tmode: \"server\",\n\n\tcomparator: function comparator(user) {\n\t\treturn [user.get(\"status\"), _.toLower(user.get(\"firstname\") + user.get(\"surname\"))];\n\t},\n\n\turl: function url() {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\t\treturn settings.urlRoot + \"/api/1.0/users/\" + user.username + \"/books\";\n\t}\n});\n\n// Resources that are linked to the monitored book or group\nvar ResourceCollection = Backbone.Collection.extend({\n\tmodel: Model,\n\tmode: \"server\",\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/acacia/resources/assigned/bookOrGroup\";\n\t}\n});\n\nvar StatsModel = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"_id\",\n\n\tcomputeds: {\n\t\tfontAwesomeName: function fontAwesomeName() {\n\t\t\tvar event_name = this.get(\"event_name\");\n\t\t\tif (_.includes(event_name, \"Archive\")) return \"archive\";\n\t\t\tif (event_name === \"FocusLost\" || event_name === \"Closed\" || event_name === \"Crashed\") return \"arrow-circle-left\";\n\t\t\tif (event_name === \"FocusGained\" || event_name === \"Started\") return \"arrow-circle-right\";\n\t\t\tif (event_name === \"Library\") return \"book\";\n\t\t\tif (event_name === \"PageOpen\") return \"file\";\n\t\t\tif (event_name === \"Settings\" || event_name === \"Accounts\") return \"users\";\n\t\t\tif (event_name === \"UpcomingEvents\") return \"calendar-day\";\n\t\t\tif (_.includes(event_name, \"Summary\")) return \"list-alt\";\n\t\t\tif (event_name === \"SwitchAccount\") return \"exchange\";\n\t\t\tif (event_name === \"BookDownload\") return \"download\";\n\t\t\tif (_.includes(event_name, \"Search\")) return \"search\";\n\t\t\tif (_.includes(event_name, \"Flashcard\")) return \"file-check\";\n\t\t\tif (_.includes(event_name, \"Freeform\") || _.includes(event_name, \"Folder\")) return \"folder\";\n\t\t\tif (event_name === \"Annotation\") return \"edit\";\n\t\t\tif (_.includes(event_name, \"Resource\") || _.includes(event_name, \"Attachment\")) return \"paperclip\";\n\t\t\tif (event_name === \"NewsLetter\") return \"newspaper\";\n\t\t\tif (_.includes(event_name, \"Stats\")) return \"chart-bar\";\n\t\t\tif (_.includes(event_name, \"File\")) return \"file\";\n\t\t\tif (event_name === \"WhatsNew\") return \"gift\";\n\t\t\tif (event_name === \"Highlight\") return \"highlighter\";\n\t\t\tif (_.includes(event_name, \"URL\") || _.includes(event_name, \"Practice\")) return \"globe\";\n\t\t\treturn \"circle\";\n\t\t},\n\n\t\tstatName: function statName() {\n\t\t\treturn this.get(\"display\") === \"\" ? this.get(\"event_name\") : this.get(\"display\");\n\t\t},\n\n\t\tdisplayTime: function displayTime() {\n\t\t\treturn moment.unix(this.get(\"timestamp\") / 1000).format(\"HH:mm:ss\");\n\t\t},\n\n\t\tfromNow: function fromNow() {\n\t\t\treturn moment.unix(this.get(\"timestamp\") / 1000).fromNow();\n\t\t}\n\t}\n});\n\nvar StatsCollection = Backbone.Collection.extend({\n\tmodel: StatsModel,\n\tinitialize: function initialize(data, opts) {\n\t\tthis.fullCollection = [];\n\t\tif (opts) {\n\t\t\tthis.username = opts.username;\n\t\t\tthis.afterTimestamp = opts.afterTimestamp;\n\t\t}\n\t},\n\n\tcomparator: function comparator(item) {\n\t\treturn -item.get(\"timestamp\");\n\t},\n\n\tmode: \"server\"\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"button cam-btn\",\n\ttagName: \"button\",\n\ttemplate: require(\"../templates/cam.nunj\").camBtn,\n\n\tui: {\n\t\tactiveUsers: \".active-users\",\n\t\ttotalUsers: \".total-users\",\n\t\tmonitorType: \".monitor-type\"\n\t},\n\n\tevents: {\n\t\tclick: \"onCamClicked\"\n\t},\n\n\tmodelEvents: {\n\t\t\"change:wsConnected\": \"wsConnectionChanged\"\n\t},\n\n\tbookCollectionEvents: {\n\t\t\"sync error\": \"bookFetchEnd\"\n\t},\n\n\tuserCollectionEvents: {\n\t\t\"sync error\": \"userFetchEnd\"\n\t},\n\n\tresourceCollectionEvents: {\n\t\t\"sync error\": \"resourceFetchEnd\"\n\t},\n\n\tradioEvents: (_radioEvents = {}, _defineProperty(_radioEvents, App.Events.WebsocketConnected, \"wsConnected\"), _defineProperty(_radioEvents, App.Events.WebsocketDisconnected, \"wsDisconnected\"), _defineProperty(_radioEvents, App.Events.WebsocketMessage, \"wsMessage\"), _radioEvents),\n\n\teventBusEvents: _defineProperty({}, eventBus.Events.GroupsChanged, \"groupsChanged\"),\n\n\tinitialize: function initialize(options) {\n\t\tvar _this = this;\n\n\t\tthis.type = options.type;\n\t\tthis.item_id = options.item_id;\n\n\t\tthis.params = {};\n\t\tvar key = this.type === \"group\" ? \"groups\" : this.type;\n\t\tthis.params[key] = this.type === \"group\" ? [this.item_id] : this.item_id;\n\n\t\tthis.bindEvents(radio, this.radioEvents);\n\t\tthis.bindEvents(eventBus, this.eventBusEvents);\n\t\tthis.statsCollection = new StatsCollection();\n\t\tthis.possibleStates = [STATUS_RED, STATUS_ORANGE, STATUS_GREEN];\n\t\tthis.collections = [];\n\t\tthis.users = [];\n\n\t\t_.each(this.possibleStates, function (state) {\n\t\t\t_this.collections[state] = new UserCollection();\n\t\t});\n\n\t\tthis.resourceCollection = new ResourceCollection();\n\t\tthis.resourceCollectionSet = false;\n\n\t\tthis.bookCollection = new BookCollection();\n\n\t\tthis.bindEvents(this.bookCollection, this.bookCollectionEvents);\n\t\tthis.bindEvents(this.collections[STATUS_RED], this.userCollectionEvents);\n\t\tthis.bindEvents(this.resourceCollection, this.resourceCollectionEvents);\n\n\t\tthis.model = new Backbone.Model();\n\n\t\t// The websocket might already be connected before we listen for the connection event\n\t\tif (App.ws.isConnected) this.wsConnected();\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.ui.monitorType.text(_.startCase(_.toLower(this.type)));\n\t},\n\n\tbookFetchEnd: function bookFetchEnd(model, err) {\n\t\tif (err && err.status) {\n\t\t\tvar errMsg = App.parseResponse(err);\n\t\t\tconsole.error(errMsg);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.booksSet = true;\n\n\t\tthis.fieldsSet();\n\t},\n\n\tuserFetchEnd: function userFetchEnd(model, err) {\n\t\tif (err && err.status) {\n\t\t\tvar errMsg = App.parseResponse(err);\n\t\t\tconsole.error(errMsg);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.ui.activeUsers.text(0);\n\t\tthis.ui.totalUsers.text(this.collections[0].length);\n\n\t\tif (this.collections[0].length > 0) this.users = this.collections[0].toJSON();\n\n\t\tthis.usersSet = true;\n\n\t\tthis.fieldsSet();\n\t},\n\n\tresourceFetchEnd: function resourceFetchEnd(model, err) {\n\t\tif (err && err.status) {\n\t\t\tvar errMsg = App.parseResponse(err);\n\t\t\tconsole.error(errMsg);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.resourcesSet = true;\n\t\tthis.fieldsSet();\n\t},\n\n\tfieldsSet: function fieldsSet() {\n\t\tif (this.usersSet && this.booksSet && this.resourcesSet) this.getCamData();\n\t},\n\n\tonCamClicked: function onCamClicked() {\n\t\tvar paramName = this.type === \"book\" ? this.type : this.type + \"s\";\n\t\tvar params = _defineProperty({}, paramName, this.currentGroups);\n\t\tif (this.type === \"book\") params.book = this.item_id;\n\n\t\twindow.open(settings.urlRoot + \"/console/cam?\" + $.param(params), \"_blank\");\n\t},\n\n\twsConnected: function wsConnected() {\n\t\tvar _this2 = this;\n\n\t\tvar completeConnection = function completeConnection() {\n\t\t\t_this2.model.set({ wsConnected: true });\n\t\t};\n\n\t\treturn App.ws.getID().then(function (id) {\n\t\t\t_this2.model.set({ websocket_id: id });\n\t\t\treturn completeConnection();\n\t\t});\n\t},\n\n\twsDisconnected: function wsDisconnected() {\n\t\tthis.model.set({ wsConnected: false });\n\t},\n\n\twsConnectionChanged: function wsConnectionChanged() {\n\t\tif (this.model.get(\"wsConnected\") && this.users.length > 0) {\n\t\t\tthis.getCamData();\n\t\t} else {\n\t\t\tif (this.model.get(\"wsConnected\")) return;\n\n\t\t\t// User got logged out.\n\t\t\tif (!App.Session.get(\"authenticated\")) return;\n\n\t\t\tthis.model.unset(\"websocket_id\");\n\t\t\tthis.model.unset(\"spark\");\n\n\t\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\t\tcontent: \"Connection lost\",\n\t\t\t\ticon: \"fa-wifi-slash\",\n\t\t\t\ticonColour: \"red\",\n\t\t\t\thost: \".modal-host\"\n\t\t\t});\n\t\t}\n\t},\n\n\twsMessage: function wsMessage(message) {\n\t\tif (message.camData && message.userHash) this.addUserStat(message.userHash);\n\t\tif (message.camData && message.expire) this.onExpire(message.data);\n\t},\n\n\tupdateActiveUsers: function updateActiveUsers() {\n\t\tvar _this3 = this;\n\n\t\tvar activeUsers = _.filter(this.collections[STATUS_GREEN].models.concat(this.collections[STATUS_ORANGE].models), function (user) {\n\t\t\treturn _.intersection(user.get(\"groups\"), _this3.currentGroups).length > 0 || _.intersection(user.get(\"customGroups\"), _this3.currentGroups).length > 0;\n\t\t});\n\t\tthis.ui.activeUsers.text(activeUsers.length);\n\t},\n\n\tgetCamData: function getCamData() {\n\t\tif (this.users.length > 0) {\n\t\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\t\tApp.ws.websocket.write({\n\t\t\t\tcam: true,\n\t\t\t\taction: \"getCamData\",\n\t\t\t\tparams: this.params,\n\t\t\t\ttype: this.type,\n\t\t\t\tuser: user.username,\n\t\t\t\tusers: this.users,\n\t\t\t\troom: this.item_id\n\t\t\t});\n\t\t}\n\t},\n\n\tonExpire: function onExpire() {\n\t\tif (this.model.get(\"wsConnected\") && this.users.length > 0) this.getCamData();\n\t},\n\n\tgroupsChanged: function groupsChanged(allowed, current) {\n\t\tthis.currentGroups = current;\n\t\tthis.params = { groups: current };\n\n\t\t// fetch books assigned to group\n\t\tthis.bookCollection.fetch({ reset: true, data: $.param(_.merge(this.params, { filterByGroups: true })) });\n\n\t\tif (this.type === \"book\") this.params.book = this.item_id;\n\n\t\tvar resourceParams = { ids: [] };\n\n\t\tif (!_.isNil(this.params.groups) && this.params.groups.length > 0) resourceParams.ids = this.params.groups;\n\n\t\tif (!_.isNil(this.params.book)) resourceParams.ids.push(this.params.book);\n\n\t\tthis.resourceCollection.fetch({ reset: true, data: $.param(resourceParams) });\n\t\tthis.params.groups = _.filter(this.params.groups, function (group) {\n\t\t\treturn !_.startsWith(group, \"book-\");\n\t\t});\n\n\t\tthis.collections[0].fetch({ reset: true, data: $.param(this.params) });\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tvar params = {};\n\t\tvar key = this.type === \"group\" ? \"groups\" : this.type;\n\t\tparams[key] = this.type === \"group\" ? [this.item_id] : this.item_id;\n\t\tthis.stopMoniter(params);\n\t},\n\n\tstopMoniter: function stopMoniter(params) {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tif (App.ws.websocket) {\n\t\t\tApp.ws.websocket.write({\n\t\t\t\tcam: true,\n\t\t\t\taction: \"stopMoniter\",\n\t\t\t\tparams: params,\n\t\t\t\tuser: user.username,\n\t\t\t\troom: this.item_id\n\t\t\t});\n\t\t}\n\t},\n\n\taddUserStat: function addUserStat(stat) {\n\t\tvar _this4 = this;\n\n\t\tvar existingStat = _.find(this.statsCollection.models, function (statModel) {\n\t\t\treturn statModel.get(\"username\") === stat.username && statModel.get(\"time\") === stat.time && statModel.get(\"state\") === stat.state;\n\t\t});\n\n\t\tif (existingStat) return;\n\n\t\t// Check if stat is valid. // android sometimes sends an impossible stat of navigating from 'in book' to 'group list'\n\t\tif (stat.state === \"in app\" && stat.screen === \"group list\" && stat.prev_state === \"in book\") return;\n\n\t\t// Do not add troubleshooter stat if it was opened from resource or group\n\t\tif (stat.state === \"in app\" && stat.screen === \"troubleshooter\" && (_.includes([\"in resource\", \"in group\"], stat.prev_state) || _.includes([\"in resource\", \"in group\"], stat[\"prev state\"]))) return;\n\n\t\tthis.statsCollection.add(new StatsModel(stat));\n\t\t// Find user current collection\n\t\tvar result = {};\n\t\t_.each(this.possibleStates, function (state) {\n\t\t\tvar model = _this4.collections[state].findWhere({ username: stat.username });\n\n\t\t\tif (model) result.user = model;\n\t\t});\n\n\t\tif (!result.user) return;\n\n\t\tvar userStats = _.filter(this.statsCollection.models, function (statModel) {\n\t\t\treturn statModel.get(\"username\") === result.user.get(\"username\");\n\t\t});\n\n\t\tvar latestUserStat = _.first(_.orderBy(userStats, function (statModel) {\n\t\t\treturn [statModel.get(\"time\"), statModel.get(\"timestamp\")];\n\t\t}, \"desc\")); //userStats[userStats.length - 1]?;\n\n\t\tvar prevState = result.user.get(\"status\");\n\n\t\t// user not in group or book or related resource\n\t\tvar status = STATUS_RED;\n\n\t\t// check whether in book\n\t\tif (this.type === \"book\" && this.params.book) {\n\t\t\tvar outOfBookStates = [\"focus lost\", \"in app\", \"app closed\", \"library\", \"lastwill\", \"in group\", \"crashed\", \"started\"];\n\n\t\t\tif (latestUserStat.get(\"state\") === \"in book\" && latestUserStat.get(\"book_id\") === this.params.book && this.bookCollection.where({ id: latestUserStat.get(\"book_id\") }).length > 0 || latestUserStat.get(\"state\") === \"in resource\" && this.resourceCollection.where({ attachment_id: latestUserStat.get(\"attachment_id\") }).length > 0) {\n\t\t\t\tif (_.find(userStats, function (statModel) {\n\t\t\t\t\treturn _.includes(outOfBookStates, statModel.get(\"state\"));\n\t\t\t\t})) status = STATUS_ORANGE;else status = STATUS_GREEN;\n\t\t\t} else {\n\t\t\t\tstatus = STATUS_RED;\n\t\t\t}\n\t\t}\n\t\t// check whether in specific group or group_book\n\t\telse if (latestUserStat.get(\"state\") === \"in group\" || latestUserStat.get(\"state\") === \"in resource\" || latestUserStat.get(\"state\") === \"in book\" && this.bookCollection.where({ id: latestUserStat.get(\"book_id\") }).length > 0) {\n\t\t\t\tvar inGroupStats = _.filter(userStats, function (statModel) {\n\t\t\t\t\treturn (\n\t\t\t\t\t// matching monitored group_id\n\t\t\t\t\tstatModel.get(\"state\") === \"in group\" && _.includes(_this4.params.groups, statModel.get(\"group_id\")) ||\n\t\t\t\t\t// matching monitored resource / book linked to group\n\t\t\t\t\tstatModel.get(\"state\") === \"in resource\" || statModel.get(\"state\") === \"in book\") && (_.includes(_this4.params.groups, statModel.get(\"group_id\")) || _.includes(_this4.params.groups, statModel.get(\"prev group_id\")) || _this4.bookCollection.where({ id: statModel.get(\"book_id\") }).length > 0 || _this4.resourceCollection.where({ _id: statModel.get(\"resource_id\") }).length > 0);\n\t\t\t\t});\n\n\t\t\t\tvar inBookStats = _.filter(userStats, function (statModel) {\n\t\t\t\t\treturn (statModel.get(\"state\") === \"in book\" || statModel.get(\"state\") === \"in resource\") && (statModel.get(\"book_id\") === _this4.params.book || statModel.get(\"prev_book_id\") === _this4.params.book || _this4.resourceCollection.where({ _id: statModel.get(\"resource_id\") }).length > 0);\n\t\t\t\t});\n\n\t\t\t\t// if userStats includes anything else than \"in group\" (for that group) or \"in book\" (for that book), make status ORANGE\n\t\t\t\tif (inGroupStats.length > 0 && inGroupStats.length < userStats.length || inBookStats.length > 0 && inBookStats.length < userStats.length) {\n\t\t\t\t\tif (inGroupStats.length !== 0 && inGroupStats.length === userStats.length || inBookStats.length !== 0 && inBookStats.length === userStats.length) status = STATUS_GREEN;else if (inGroupStats.length !== 0 && _.find(inGroupStats, function (groupStat) {\n\t\t\t\t\t\treturn groupStat.get(\"group_id\") === latestUserStat.get(\"group_id\");\n\t\t\t\t\t})) status = STATUS_ORANGE;else if (inBookStats.length !== 0 && _.find(inBookStats, function (bookStat) {\n\t\t\t\t\t\treturn bookStat.get(\"group_id\") === latestUserStat.get(\"group_id\");\n\t\t\t\t\t})) status = STATUS_ORANGE;else status = STATUS_RED;\n\t\t\t\t} else if (inGroupStats.length !== 0 && _.find(inGroupStats, function (groupStat) {\n\t\t\t\t\treturn groupStat.get(\"group_id\") === latestUserStat.get(\"group_id\");\n\t\t\t\t})) {\n\t\t\t\t\tstatus = STATUS_GREEN;\n\t\t\t\t} else if (inBookStats.length !== 0 && _.find(inBookStats, function (bookStat) {\n\t\t\t\t\treturn bookStat.get(\"group_id\") === latestUserStat.get(\"group_id\");\n\t\t\t\t})) {\n\t\t\t\t\tstatus = STATUS_GREEN;\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Already in the right state\n\t\tif (prevState === status) return;\n\n\t\tresult.user.set({ status: status });\n\t\tthis.collections[status].add(result.user);\n\t\tthis.collections[prevState].remove(result.user);\n\n\t\tthis.updateActiveUsers();\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNhbUJ0bi5qcyJdLCJuYW1lcyI6WyIkIiwicmVxdWlyZSIsIl8iLCJCYWNrYm9uZSIsIm1vbWVudCIsIkFwcCIsInNldHRpbmdzIiwicmFkaW8iLCJSYWRpbyIsImNoYW5uZWwiLCJldmVudEJ1cyIsIlNUQVRVU19SRUQiLCJTVEFUVVNfT1JBTkdFIiwiU1RBVFVTX0dSRUVOIiwiTW9kZWwiLCJFcG94eSIsImV4dGVuZCIsImlkQXR0cmlidXRlIiwidXJsUm9vdCIsIlVzZXJDb2xsZWN0aW9uIiwiQ29sbGVjdGlvbiIsIm1vZGVsIiwibW9kZSIsImNvbXBhcmF0b3IiLCJ1c2VyIiwiZ2V0IiwidG9Mb3dlciIsInVybCIsIkJvb2tDb2xsZWN0aW9uIiwicmVxdWVzdCIsIkV2ZW50cyIsIlJlcXVlc3RzIiwiQ3VycmVudFVzZXIiLCJ1c2VybmFtZSIsIlJlc291cmNlQ29sbGVjdGlvbiIsIlN0YXRzTW9kZWwiLCJjb21wdXRlZHMiLCJmb250QXdlc29tZU5hbWUiLCJldmVudF9uYW1lIiwiaW5jbHVkZXMiLCJzdGF0TmFtZSIsImRpc3BsYXlUaW1lIiwidW5peCIsImZvcm1hdCIsImZyb21Ob3ciLCJTdGF0c0NvbGxlY3Rpb24iLCJpbml0aWFsaXplIiwiZGF0YSIsIm9wdHMiLCJmdWxsQ29sbGVjdGlvbiIsImFmdGVyVGltZXN0YW1wIiwiaXRlbSIsIm1vZHVsZSIsImV4cG9ydHMiLCJNYXJpb25ldHRlIiwiVmlldyIsImNsYXNzTmFtZSIsInRhZ05hbWUiLCJ0ZW1wbGF0ZSIsImNhbUJ0biIsInVpIiwiYWN0aXZlVXNlcnMiLCJ0b3RhbFVzZXJzIiwibW9uaXRvclR5cGUiLCJldmVudHMiLCJjbGljayIsIm1vZGVsRXZlbnRzIiwiYm9va0NvbGxlY3Rpb25FdmVudHMiLCJ1c2VyQ29sbGVjdGlvbkV2ZW50cyIsInJlc291cmNlQ29sbGVjdGlvbkV2ZW50cyIsInJhZGlvRXZlbnRzIiwiV2Vic29ja2V0Q29ubmVjdGVkIiwiV2Vic29ja2V0RGlzY29ubmVjdGVkIiwiV2Vic29ja2V0TWVzc2FnZSIsImV2ZW50QnVzRXZlbnRzIiwiR3JvdXBzQ2hhbmdlZCIsIm9wdGlvbnMiLCJ0eXBlIiwiaXRlbV9pZCIsInBhcmFtcyIsImtleSIsImJpbmRFdmVudHMiLCJzdGF0c0NvbGxlY3Rpb24iLCJwb3NzaWJsZVN0YXRlcyIsImNvbGxlY3Rpb25zIiwidXNlcnMiLCJlYWNoIiwic3RhdGUiLCJyZXNvdXJjZUNvbGxlY3Rpb24iLCJyZXNvdXJjZUNvbGxlY3Rpb25TZXQiLCJib29rQ29sbGVjdGlvbiIsIndzIiwiaXNDb25uZWN0ZWQiLCJ3c0Nvbm5lY3RlZCIsIm9uUmVuZGVyIiwidGV4dCIsInN0YXJ0Q2FzZSIsImJvb2tGZXRjaEVuZCIsImVyciIsInN0YXR1cyIsImVyck1zZyIsInBhcnNlUmVzcG9uc2UiLCJjb25zb2xlIiwiZXJyb3IiLCJib29rc1NldCIsImZpZWxkc1NldCIsInVzZXJGZXRjaEVuZCIsImxlbmd0aCIsInRvSlNPTiIsInVzZXJzU2V0IiwicmVzb3VyY2VGZXRjaEVuZCIsInJlc291cmNlc1NldCIsImdldENhbURhdGEiLCJvbkNhbUNsaWNrZWQiLCJwYXJhbU5hbWUiLCJjdXJyZW50R3JvdXBzIiwiYm9vayIsIndpbmRvdyIsIm9wZW4iLCJwYXJhbSIsImNvbXBsZXRlQ29ubmVjdGlvbiIsInNldCIsImdldElEIiwidGhlbiIsIndlYnNvY2tldF9pZCIsImlkIiwid3NEaXNjb25uZWN0ZWQiLCJ3c0Nvbm5lY3Rpb25DaGFuZ2VkIiwiU2Vzc2lvbiIsInVuc2V0IiwidHJpZ2dlciIsIkNvbW1hbmRzIiwiVG9hc3QiLCJjb250ZW50IiwiaWNvbiIsImljb25Db2xvdXIiLCJob3N0Iiwid3NNZXNzYWdlIiwibWVzc2FnZSIsImNhbURhdGEiLCJ1c2VySGFzaCIsImFkZFVzZXJTdGF0IiwiZXhwaXJlIiwib25FeHBpcmUiLCJ1cGRhdGVBY3RpdmVVc2VycyIsImZpbHRlciIsIm1vZGVscyIsImNvbmNhdCIsImludGVyc2VjdGlvbiIsIndlYnNvY2tldCIsIndyaXRlIiwiY2FtIiwiYWN0aW9uIiwicm9vbSIsImdyb3Vwc0NoYW5nZWQiLCJhbGxvd2VkIiwiY3VycmVudCIsImdyb3VwcyIsImZldGNoIiwicmVzZXQiLCJtZXJnZSIsImZpbHRlckJ5R3JvdXBzIiwicmVzb3VyY2VQYXJhbXMiLCJpZHMiLCJpc05pbCIsInB1c2giLCJzdGFydHNXaXRoIiwiZ3JvdXAiLCJvbkJlZm9yZURlc3Ryb3kiLCJzdG9wTW9uaXRlciIsInN0YXQiLCJleGlzdGluZ1N0YXQiLCJmaW5kIiwic3RhdE1vZGVsIiwidGltZSIsInNjcmVlbiIsInByZXZfc3RhdGUiLCJhZGQiLCJyZXN1bHQiLCJmaW5kV2hlcmUiLCJ1c2VyU3RhdHMiLCJsYXRlc3RVc2VyU3RhdCIsImZpcnN0Iiwib3JkZXJCeSIsInByZXZTdGF0ZSIsIm91dE9mQm9va1N0YXRlcyIsIndoZXJlIiwiYXR0YWNobWVudF9pZCIsImluR3JvdXBTdGF0cyIsIl9pZCIsImluQm9va1N0YXRzIiwiZ3JvdXBTdGF0IiwiYm9va1N0YXQiLCJyZW1vdmUiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLElBQUlELFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUUsV0FBV0YsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUcsU0FBU0gsUUFBUSxRQUFSLENBQWY7O0FBRUEsSUFBTUksTUFBTUosUUFBUSxhQUFSLENBQVo7QUFDQSxJQUFNSyxXQUFXTCxRQUFRLGNBQVIsQ0FBakI7QUFDQSxJQUFNTSxRQUFRSixTQUFTSyxLQUFULENBQWVDLE9BQWYsQ0FBdUIsUUFBdkIsQ0FBZDtBQUNBLElBQU1DLFdBQVdULFFBQVEsb0JBQVIsQ0FBakI7O0FBRUEsSUFBTVUsYUFBYSxDQUFuQjtBQUNBLElBQU1DLGdCQUFnQixDQUF0QjtBQUNBLElBQU1DLGVBQWUsQ0FBckI7O0FBRUEsSUFBTUMsUUFBUVgsU0FBU1ksS0FBVCxDQUFlRCxLQUFmLENBQXFC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SCxpQkFBTDtBQUNBO0FBblcrQyxDQUFoQyxDQUFqQiIsImZpbGUiOiJjYW1CdG4uanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IG1vbWVudCA9IHJlcXVpcmUoXCJtb21lbnRcIik7XG5cbmNvbnN0IEFwcCA9IHJlcXVpcmUoXCIuLi8uLi9pbmRleFwiKTtcbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcbmNvbnN0IGV2ZW50QnVzID0gcmVxdWlyZShcIi4vY29uc29sZS9ldmVudEJ1c1wiKTtcblxuY29uc3QgU1RBVFVTX1JFRCA9IDA7XG5jb25zdCBTVEFUVVNfT1JBTkdFID0gMTtcbmNvbnN0IFNUQVRVU19HUkVFTiA9IDI7XG5cbmNvbnN0IE1vZGVsID0gQmFja2JvbmUuRXBveHkuTW9kZWwuZXh0ZW5kKHtcblx0aWRBdHRyaWJ1dGU6IFwiX2lkXCIsXG5cblx0dXJsUm9vdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3VzZXJzXCI7XG5cdH0sXG59KTtcblxuY29uc3QgVXNlckNvbGxlY3Rpb24gPSBCYWNrYm9uZS5Db2xsZWN0aW9uLmV4dGVuZCh7XG5cdG1vZGVsOiBNb2RlbCxcblx0bW9kZTogXCJzZXJ2ZXJcIixcblxuXHRjb21wYXJhdG9yOiBmdW5jdGlvbih1c2VyKSB7XG5cdFx0cmV0dXJuIFt1c2VyLmdldChcInN0YXR1c1wiKSwgXy50b0xvd2VyKHVzZXIuZ2V0KFwiZmlyc3RuYW1lXCIpICsgdXNlci5nZXQoXCJzdXJuYW1lXCIpKV07XG5cdH0sXG5cblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FjYWNpYS91c2Vycy9hc3NpZ25lZC9ib29rT3JHcm91cFwiO1xuXHR9LFxufSk7XG5cbi8vIEJvb2tzIHRoYXQgYXJlIGxpbmtlZCB0byB0aGUgbW9uaXRvcmVkIGdyb3VwXG5jb25zdCBCb29rQ29sbGVjdGlvbiA9IEJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IE1vZGVsLFxuXHRtb2RlOiBcInNlcnZlclwiLFxuXG5cdGNvbXBhcmF0b3I6IGZ1bmN0aW9uKHVzZXIpIHtcblx0XHRyZXR1cm4gW3VzZXIuZ2V0KFwic3RhdHVzXCIpLCBfLnRvTG93ZXIodXNlci5nZXQoXCJmaXJzdG5hbWVcIikgKyB1c2VyLmdldChcInN1cm5hbWVcIikpXTtcblx0fSxcblxuXHR1cmw6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHVzZXIgPSByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpO1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC91c2Vycy9cIiArIHVzZXIudXNlcm5hbWUgKyBcIi9ib29rc1wiO1xuXHR9LFxufSk7XG5cbi8vIFJlc291cmNlcyB0aGF0IGFyZSBsaW5rZWQgdG8gdGhlIG1vbml0b3JlZCBib29rIG9yIGdyb3VwXG5jb25zdCBSZXNvdXJjZUNvbGxlY3Rpb24gPSBCYWNrYm9uZS5Db2xsZWN0aW9uLmV4dGVuZCh7XG5cdG1vZGVsOiBNb2RlbCxcblx0bW9kZTogXCJzZXJ2ZXJcIixcblxuXHR1cmw6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYWNhY2lhL3Jlc291cmNlcy9hc3NpZ25lZC9ib29rT3JHcm91cFwiO1xuXHR9LFxufSk7XG5cbmNvbnN0IFN0YXRzTW9kZWwgPSBCYWNrYm9uZS5FcG94eS5Nb2RlbC5leHRlbmQoe1xuXHRpZEF0dHJpYnV0ZTogXCJfaWRcIixcblxuXHRjb21wdXRlZHM6IHtcblx0XHRmb250QXdlc29tZU5hbWU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29uc3QgZXZlbnRfbmFtZSA9IHRoaXMuZ2V0KFwiZXZlbnRfbmFtZVwiKTtcblx0XHRcdGlmIChfLmluY2x1ZGVzKGV2ZW50X25hbWUsIFwiQXJjaGl2ZVwiKSkgcmV0dXJuIFwiYXJjaGl2ZVwiO1xuXHRcdFx0aWYgKGV2ZW50X25hbWUgPT09IFwiRm9jdXNMb3N0XCIgfHwgZXZlbnRfbmFtZSA9PT0gXCJDbG9zZWRcIiB8fCBldmVudF9uYW1lID09PSBcIkNyYXNoZWRcIikgcmV0dXJuIFwiYXJyb3ctY2lyY2xlLWxlZnRcIjtcblx0XHRcdGlmIChldmVudF9uYW1lID09PSBcIkZvY3VzR2FpbmVkXCIgfHwgZXZlbnRfbmFtZSA9PT0gXCJTdGFydGVkXCIpIHJldHVybiBcImFycm93LWNpcmNsZS1yaWdodFwiO1xuXHRcdFx0aWYgKGV2ZW50X25hbWUgPT09IFwiTGlicmFyeVwiKSByZXR1cm4gXCJib29rXCI7XG5cdFx0XHRpZiAoZXZlbnRfbmFtZSA9PT0gXCJQYWdlT3BlblwiKSByZXR1cm4gXCJmaWxlXCI7XG5cdFx0XHRpZiAoZXZlbnRfbmFtZSA9PT0gXCJTZXR0aW5nc1wiIHx8IGV2ZW50X25hbWUgPT09IFwiQWNjb3VudHNcIikgcmV0dXJuIFwidXNlcnNcIjtcblx0XHRcdGlmIChldmVudF9uYW1lID09PSBcIlVwY29taW5nRXZlbnRzXCIpIHJldHVybiBcImNhbGVuZGFyLWRheVwiO1xuXHRcdFx0aWYgKF8uaW5jbHVkZXMoZXZlbnRfbmFtZSwgXCJTdW1tYXJ5XCIpKSByZXR1cm4gXCJsaXN0LWFsdFwiO1xuXHRcdFx0aWYgKGV2ZW50X25hbWUgPT09IFwiU3dpdGNoQWNjb3VudFwiKSByZXR1cm4gXCJleGNoYW5nZVwiO1xuXHRcdFx0aWYgKGV2ZW50X25hbWUgPT09IFwiQm9va0Rvd25sb2FkXCIpIHJldHVybiBcImRvd25sb2FkXCI7XG5cdFx0XHRpZiAoXy5pbmNsdWRlcyhldmVudF9uYW1lLCBcIlNlYXJjaFwiKSkgcmV0dXJuIFwic2VhcmNoXCI7XG5cdFx0XHRpZiAoXy5pbmNsdWRlcyhldmVudF9uYW1lLCBcIkZsYXNoY2FyZFwiKSkgcmV0dXJuIFwiZmlsZS1jaGVja1wiO1xuXHRcdFx0aWYgKF8uaW5jbHVkZXMoZXZlbnRfbmFtZSwgXCJGcmVlZm9ybVwiKSB8fCBfLmluY2x1ZGVzKGV2ZW50X25hbWUsIFwiRm9sZGVyXCIpKSByZXR1cm4gXCJmb2xkZXJcIjtcblx0XHRcdGlmIChldmVudF9uYW1lID09PSBcIkFubm90YXRpb25cIikgcmV0dXJuIFwiZWRpdFwiO1xuXHRcdFx0aWYgKF8uaW5jbHVkZXMoZXZlbnRfbmFtZSwgXCJSZXNvdXJjZVwiKSB8fCBfLmluY2x1ZGVzKGV2ZW50X25hbWUsIFwiQXR0YWNobWVudFwiKSkgcmV0dXJuIFwicGFwZXJjbGlwXCI7XG5cdFx0XHRpZiAoZXZlbnRfbmFtZSA9PT0gXCJOZXdzTGV0dGVyXCIpIHJldHVybiBcIm5ld3NwYXBlclwiO1xuXHRcdFx0aWYgKF8uaW5jbHVkZXMoZXZlbnRfbmFtZSwgXCJTdGF0c1wiKSkgcmV0dXJuIFwiY2hhcnQtYmFyXCI7XG5cdFx0XHRpZiAoXy5pbmNsdWRlcyhldmVudF9uYW1lLCBcIkZpbGVcIikpIHJldHVybiBcImZpbGVcIjtcblx0XHRcdGlmIChldmVudF9uYW1lID09PSBcIldoYXRzTmV3XCIpIHJldHVybiBcImdpZnRcIjtcblx0XHRcdGlmIChldmVudF9uYW1lID09PSBcIkhpZ2hsaWdodFwiKSByZXR1cm4gXCJoaWdobGlnaHRlclwiO1xuXHRcdFx0aWYgKF8uaW5jbHVkZXMoZXZlbnRfbmFtZSwgXCJVUkxcIikgfHwgXy5pbmNsdWRlcyhldmVudF9uYW1lLCBcIlByYWN0aWNlXCIpKSByZXR1cm4gXCJnbG9iZVwiO1xuXHRcdFx0cmV0dXJuIFwiY2lyY2xlXCI7XG5cdFx0fSxcblxuXHRcdHN0YXROYW1lOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLmdldChcImRpc3BsYXlcIikgPT09IFwiXCIgPyB0aGlzLmdldChcImV2ZW50X25hbWVcIikgOiB0aGlzLmdldChcImRpc3BsYXlcIik7XG5cdFx0fSxcblxuXHRcdGRpc3BsYXlUaW1lOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBtb21lbnQudW5peCh0aGlzLmdldChcInRpbWVzdGFtcFwiKSAvIDEwMDApLmZvcm1hdChcIkhIOm1tOnNzXCIpO1xuXHRcdH0sXG5cblx0XHRmcm9tTm93OiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBtb21lbnQudW5peCh0aGlzLmdldChcInRpbWVzdGFtcFwiKSAvIDEwMDApLmZyb21Ob3coKTtcblx0XHR9LFxuXHR9LFxufSk7XG5cbmNvbnN0IFN0YXRzQ29sbGVjdGlvbiA9IEJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IFN0YXRzTW9kZWwsXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKGRhdGEsIG9wdHMpIHtcblx0XHR0aGlzLmZ1bGxDb2xsZWN0aW9uID0gW107XG5cdFx0aWYgKG9wdHMpIHtcblx0XHRcdHRoaXMudXNlcm5hbWUgPSBvcHRzLnVzZXJuYW1lO1xuXHRcdFx0dGhpcy5hZnRlclRpbWVzdGFtcCA9IG9wdHMuYWZ0ZXJUaW1lc3RhbXA7XG5cdFx0fVxuXHR9LFxuXG5cdGNvbXBhcmF0b3I6IGZ1bmN0aW9uKGl0ZW0pIHtcblx0XHRyZXR1cm4gLWl0ZW0uZ2V0KFwidGltZXN0YW1wXCIpO1xuXHR9LFxuXG5cdG1vZGU6IFwic2VydmVyXCIsXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImJ1dHRvbiBjYW0tYnRuXCIsXG5cdHRhZ05hbWU6IFwiYnV0dG9uXCIsXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2NhbS5udW5qXCIpLmNhbUJ0bixcblxuXHR1aToge1xuXHRcdGFjdGl2ZVVzZXJzOiBcIi5hY3RpdmUtdXNlcnNcIixcblx0XHR0b3RhbFVzZXJzOiBcIi50b3RhbC11c2Vyc1wiLFxuXHRcdG1vbml0b3JUeXBlOiBcIi5tb25pdG9yLXR5cGVcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRjbGljazogXCJvbkNhbUNsaWNrZWRcIixcblx0fSxcblxuXHRtb2RlbEV2ZW50czoge1xuXHRcdFwiY2hhbmdlOndzQ29ubmVjdGVkXCI6IFwid3NDb25uZWN0aW9uQ2hhbmdlZFwiLFxuXHR9LFxuXG5cdGJvb2tDb2xsZWN0aW9uRXZlbnRzOiB7XG5cdFx0XCJzeW5jIGVycm9yXCI6IFwiYm9va0ZldGNoRW5kXCIsXG5cdH0sXG5cblx0dXNlckNvbGxlY3Rpb25FdmVudHM6IHtcblx0XHRcInN5bmMgZXJyb3JcIjogXCJ1c2VyRmV0Y2hFbmRcIixcblx0fSxcblxuXHRyZXNvdXJjZUNvbGxlY3Rpb25FdmVudHM6IHtcblx0XHRcInN5bmMgZXJyb3JcIjogXCJyZXNvdXJjZUZldGNoRW5kXCIsXG5cdH0sXG5cblx0cmFkaW9FdmVudHM6IHtcblx0XHRbQXBwLkV2ZW50cy5XZWJzb2NrZXRDb25uZWN0ZWRdOiBcIndzQ29ubmVjdGVkXCIsXG5cdFx0W0FwcC5FdmVudHMuV2Vic29ja2V0RGlzY29ubmVjdGVkXTogXCJ3c0Rpc2Nvbm5lY3RlZFwiLFxuXHRcdFtBcHAuRXZlbnRzLldlYnNvY2tldE1lc3NhZ2VdOiBcIndzTWVzc2FnZVwiLFxuXHR9LFxuXG5cdGV2ZW50QnVzRXZlbnRzOiB7XG5cdFx0W2V2ZW50QnVzLkV2ZW50cy5Hcm91cHNDaGFuZ2VkXTogXCJncm91cHNDaGFuZ2VkXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMudHlwZSA9IG9wdGlvbnMudHlwZTtcblx0XHR0aGlzLml0ZW1faWQgPSBvcHRpb25zLml0ZW1faWQ7XG5cblx0XHR0aGlzLnBhcmFtcyA9IHt9O1xuXHRcdGNvbnN0IGtleSA9IHRoaXMudHlwZSA9PT0gXCJncm91cFwiID8gXCJncm91cHNcIiA6IHRoaXMudHlwZTtcblx0XHR0aGlzLnBhcmFtc1trZXldID0gdGhpcy50eXBlID09PSBcImdyb3VwXCIgPyBbdGhpcy5pdGVtX2lkXSA6IHRoaXMuaXRlbV9pZDtcblxuXHRcdHRoaXMuYmluZEV2ZW50cyhyYWRpbywgdGhpcy5yYWRpb0V2ZW50cyk7XG5cdFx0dGhpcy5iaW5kRXZlbnRzKGV2ZW50QnVzLCB0aGlzLmV2ZW50QnVzRXZlbnRzKTtcblx0XHR0aGlzLnN0YXRzQ29sbGVjdGlvbiA9IG5ldyBTdGF0c0NvbGxlY3Rpb24oKTtcblx0XHR0aGlzLnBvc3NpYmxlU3RhdGVzID0gW1NUQVRVU19SRUQsIFNUQVRVU19PUkFOR0UsIFNUQVRVU19HUkVFTl07XG5cdFx0dGhpcy5jb2xsZWN0aW9ucyA9IFtdO1xuXHRcdHRoaXMudXNlcnMgPSBbXTtcblxuXHRcdF8uZWFjaCh0aGlzLnBvc3NpYmxlU3RhdGVzLCBzdGF0ZSA9PiB7XG5cdFx0XHR0aGlzLmNvbGxlY3Rpb25zW3N0YXRlXSA9IG5ldyBVc2VyQ29sbGVjdGlvbigpO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5yZXNvdXJjZUNvbGxlY3Rpb24gPSBuZXcgUmVzb3VyY2VDb2xsZWN0aW9uKCk7XG5cdFx0dGhpcy5yZXNvdXJjZUNvbGxlY3Rpb25TZXQgPSBmYWxzZTtcblxuXHRcdHRoaXMuYm9va0NvbGxlY3Rpb24gPSBuZXcgQm9va0NvbGxlY3Rpb24oKTtcblxuXHRcdHRoaXMuYmluZEV2ZW50cyh0aGlzLmJvb2tDb2xsZWN0aW9uLCB0aGlzLmJvb2tDb2xsZWN0aW9uRXZlbnRzKTtcblx0XHR0aGlzLmJpbmRFdmVudHModGhpcy5jb2xsZWN0aW9uc1tTVEFUVVNfUkVEXSwgdGhpcy51c2VyQ29sbGVjdGlvbkV2ZW50cyk7XG5cdFx0dGhpcy5iaW5kRXZlbnRzKHRoaXMucmVzb3VyY2VDb2xsZWN0aW9uLCB0aGlzLnJlc291cmNlQ29sbGVjdGlvbkV2ZW50cyk7XG5cblx0XHR0aGlzLm1vZGVsID0gbmV3IEJhY2tib25lLk1vZGVsKCk7XG5cblx0XHQvLyBUaGUgd2Vic29ja2V0IG1pZ2h0IGFscmVhZHkgYmUgY29ubmVjdGVkIGJlZm9yZSB3ZSBsaXN0ZW4gZm9yIHRoZSBjb25uZWN0aW9uIGV2ZW50XG5cdFx0aWYgKEFwcC53cy5pc0Nvbm5lY3RlZClcblx0XHRcdHRoaXMud3NDb25uZWN0ZWQoKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5tb25pdG9yVHlwZS50ZXh0KF8uc3RhcnRDYXNlKF8udG9Mb3dlcih0aGlzLnR5cGUpKSk7XG5cdH0sXG5cblx0Ym9va0ZldGNoRW5kOiBmdW5jdGlvbihtb2RlbCwgZXJyKSB7XG5cdFx0aWYgKGVyciAmJiBlcnIuc3RhdHVzKSB7XG5cdFx0XHRjb25zdCBlcnJNc2cgPSBBcHAucGFyc2VSZXNwb25zZShlcnIpO1xuXHRcdFx0Y29uc29sZS5lcnJvcihlcnJNc2cpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuYm9va3NTZXQgPSB0cnVlO1xuXG5cdFx0dGhpcy5maWVsZHNTZXQoKTtcblx0fSxcblxuXHR1c2VyRmV0Y2hFbmQ6IGZ1bmN0aW9uKG1vZGVsLCBlcnIpIHtcblx0XHRpZiAoZXJyICYmIGVyci5zdGF0dXMpIHtcblx0XHRcdGNvbnN0IGVyck1zZyA9IEFwcC5wYXJzZVJlc3BvbnNlKGVycik7XG5cdFx0XHRjb25zb2xlLmVycm9yKGVyck1zZyk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy51aS5hY3RpdmVVc2Vycy50ZXh0KDApO1xuXHRcdHRoaXMudWkudG90YWxVc2Vycy50ZXh0KHRoaXMuY29sbGVjdGlvbnNbMF0ubGVuZ3RoKTtcblxuXHRcdGlmICh0aGlzLmNvbGxlY3Rpb25zWzBdLmxlbmd0aCA+IDApXG5cdFx0XHR0aGlzLnVzZXJzID0gdGhpcy5jb2xsZWN0aW9uc1swXS50b0pTT04oKTtcblxuXHRcdHRoaXMudXNlcnNTZXQgPSB0cnVlO1xuXG5cdFx0dGhpcy5maWVsZHNTZXQoKTtcblx0fSxcblxuXHRyZXNvdXJjZUZldGNoRW5kOiBmdW5jdGlvbihtb2RlbCwgZXJyKSB7XG5cdFx0aWYgKGVyciAmJiBlcnIuc3RhdHVzKSB7XG5cdFx0XHRjb25zdCBlcnJNc2cgPSBBcHAucGFyc2VSZXNwb25zZShlcnIpO1xuXHRcdFx0Y29uc29sZS5lcnJvcihlcnJNc2cpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMucmVzb3VyY2VzU2V0ID0gdHJ1ZTtcblx0XHR0aGlzLmZpZWxkc1NldCgpO1xuXHR9LFxuXG5cdGZpZWxkc1NldDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMudXNlcnNTZXQgJiYgdGhpcy5ib29rc1NldCAmJiB0aGlzLnJlc291cmNlc1NldClcblx0XHRcdHRoaXMuZ2V0Q2FtRGF0YSgpO1xuXHR9LFxuXG5cdG9uQ2FtQ2xpY2tlZDogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgcGFyYW1OYW1lID0gdGhpcy50eXBlID09PSBcImJvb2tcIiA/IHRoaXMudHlwZSA6IHRoaXMudHlwZSArIFwic1wiO1xuXHRcdGNvbnN0IHBhcmFtcyA9IHtcblx0XHRcdFtwYXJhbU5hbWVdOiB0aGlzLmN1cnJlbnRHcm91cHMsXG5cdFx0fTtcblx0XHRpZiAodGhpcy50eXBlID09PSBcImJvb2tcIilcblx0XHRcdHBhcmFtcy5ib29rID0gdGhpcy5pdGVtX2lkO1xuXG5cdFx0d2luZG93Lm9wZW4oc2V0dGluZ3MudXJsUm9vdCArIFwiL2NvbnNvbGUvY2FtP1wiICsgJC5wYXJhbShwYXJhbXMpLCBcIl9ibGFua1wiKTtcblx0fSxcblxuXHR3c0Nvbm5lY3RlZDogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgY29tcGxldGVDb25uZWN0aW9uID0gKCkgPT4ge1xuXHRcdFx0dGhpcy5tb2RlbC5zZXQoeyB3c0Nvbm5lY3RlZDogdHJ1ZSB9KTtcblx0XHR9O1xuXG5cdFx0cmV0dXJuIEFwcC53cy5nZXRJRCgpLnRoZW4oaWQgPT4ge1xuXHRcdFx0dGhpcy5tb2RlbC5zZXQoeyB3ZWJzb2NrZXRfaWQ6IGlkIH0pO1xuXHRcdFx0cmV0dXJuIGNvbXBsZXRlQ29ubmVjdGlvbigpO1xuXHRcdH0pO1xuXHR9LFxuXG5cdHdzRGlzY29ubmVjdGVkOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm1vZGVsLnNldCh7IHdzQ29ubmVjdGVkOiBmYWxzZSB9KTtcblx0fSxcblxuXHR3c0Nvbm5lY3Rpb25DaGFuZ2VkOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJ3c0Nvbm5lY3RlZFwiKSAmJiB0aGlzLnVzZXJzLmxlbmd0aCA+IDApIHtcblx0XHRcdHRoaXMuZ2V0Q2FtRGF0YSgpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGlmICh0aGlzLm1vZGVsLmdldChcIndzQ29ubmVjdGVkXCIpKVxuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdC8vIFVzZXIgZ290IGxvZ2dlZCBvdXQuXG5cdFx0XHRpZiAoIUFwcC5TZXNzaW9uLmdldChcImF1dGhlbnRpY2F0ZWRcIikpXG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0dGhpcy5tb2RlbC51bnNldChcIndlYnNvY2tldF9pZFwiKTtcblx0XHRcdHRoaXMubW9kZWwudW5zZXQoXCJzcGFya1wiKTtcblxuXHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7XG5cdFx0XHRcdGNvbnRlbnQ6IFwiQ29ubmVjdGlvbiBsb3N0XCIsXG5cdFx0XHRcdGljb246IFwiZmEtd2lmaS1zbGFzaFwiLFxuXHRcdFx0XHRpY29uQ29sb3VyOiBcInJlZFwiLFxuXHRcdFx0XHRob3N0OiBcIi5tb2RhbC1ob3N0XCIsXG5cdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0d3NNZXNzYWdlOiBmdW5jdGlvbihtZXNzYWdlKSB7XG5cdFx0aWYgKG1lc3NhZ2UuY2FtRGF0YSAmJiBtZXNzYWdlLnVzZXJIYXNoKVxuXHRcdFx0dGhpcy5hZGRVc2VyU3RhdChtZXNzYWdlLnVzZXJIYXNoKTtcblx0XHRpZiAobWVzc2FnZS5jYW1EYXRhICYmIG1lc3NhZ2UuZXhwaXJlKVxuXHRcdFx0dGhpcy5vbkV4cGlyZShtZXNzYWdlLmRhdGEpO1xuXHR9LFxuXG5cdHVwZGF0ZUFjdGl2ZVVzZXJzOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBhY3RpdmVVc2VycyA9IF8uZmlsdGVyKHRoaXMuY29sbGVjdGlvbnNbU1RBVFVTX0dSRUVOXS5tb2RlbHMuY29uY2F0KHRoaXMuY29sbGVjdGlvbnNbU1RBVFVTX09SQU5HRV0ubW9kZWxzKSxcblx0XHRcdHVzZXIgPT4gXy5pbnRlcnNlY3Rpb24odXNlci5nZXQoXCJncm91cHNcIiksIHRoaXMuY3VycmVudEdyb3VwcykubGVuZ3RoID4gMCB8fCBfLmludGVyc2VjdGlvbih1c2VyLmdldChcImN1c3RvbUdyb3Vwc1wiKSwgdGhpcy5jdXJyZW50R3JvdXBzKS5sZW5ndGggPiAwXG5cdFx0KTtcblx0XHR0aGlzLnVpLmFjdGl2ZVVzZXJzLnRleHQoYWN0aXZlVXNlcnMubGVuZ3RoKTtcblx0fSxcblxuXHRnZXRDYW1EYXRhOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy51c2Vycy5sZW5ndGggPiAwKSB7XG5cdFx0XHRjb25zdCB1c2VyID0gcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblxuXHRcdFx0QXBwLndzLndlYnNvY2tldC53cml0ZSh7XG5cdFx0XHRcdGNhbTogdHJ1ZSxcblx0XHRcdFx0YWN0aW9uOiBcImdldENhbURhdGFcIixcblx0XHRcdFx0cGFyYW1zOiB0aGlzLnBhcmFtcyxcblx0XHRcdFx0dHlwZTogdGhpcy50eXBlLFxuXHRcdFx0XHR1c2VyOiB1c2VyLnVzZXJuYW1lLFxuXHRcdFx0XHR1c2VyczogdGhpcy51c2Vycyxcblx0XHRcdFx0cm9vbTogdGhpcy5pdGVtX2lkLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdG9uRXhwaXJlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJ3c0Nvbm5lY3RlZFwiKSAmJiB0aGlzLnVzZXJzLmxlbmd0aCA+IDApXG5cdFx0XHR0aGlzLmdldENhbURhdGEoKTtcblx0fSxcblxuXHRncm91cHNDaGFuZ2VkOiBmdW5jdGlvbihhbGxvd2VkLCBjdXJyZW50KSB7XG5cdFx0dGhpcy5jdXJyZW50R3JvdXBzID0gY3VycmVudDtcblx0XHR0aGlzLnBhcmFtcyA9IHsgZ3JvdXBzOiBjdXJyZW50IH07XG5cblx0XHQvLyBmZXRjaCBib29rcyBhc3NpZ25lZCB0byBncm91cFxuXHRcdHRoaXMuYm9va0NvbGxlY3Rpb24uZmV0Y2goeyByZXNldDogdHJ1ZSwgZGF0YTogJC5wYXJhbShfLm1lcmdlKHRoaXMucGFyYW1zLCB7IGZpbHRlckJ5R3JvdXBzOiB0cnVlIH0pKSB9KTtcblxuXHRcdGlmICh0aGlzLnR5cGUgPT09IFwiYm9va1wiKVxuXHRcdFx0dGhpcy5wYXJhbXMuYm9vayA9IHRoaXMuaXRlbV9pZDtcblxuXHRcdGNvbnN0IHJlc291cmNlUGFyYW1zID0geyBpZHM6IFtdIH07XG5cblx0XHRpZiAoIV8uaXNOaWwodGhpcy5wYXJhbXMuZ3JvdXBzKSAmJiB0aGlzLnBhcmFtcy5ncm91cHMubGVuZ3RoID4gMClcblx0XHRcdHJlc291cmNlUGFyYW1zLmlkcyA9IHRoaXMucGFyYW1zLmdyb3VwcztcblxuXHRcdGlmICghXy5pc05pbCh0aGlzLnBhcmFtcy5ib29rKSlcblx0XHRcdHJlc291cmNlUGFyYW1zLmlkcy5wdXNoKHRoaXMucGFyYW1zLmJvb2spO1xuXG5cdFx0dGhpcy5yZXNvdXJjZUNvbGxlY3Rpb24uZmV0Y2goeyByZXNldDogdHJ1ZSwgZGF0YTogJC5wYXJhbShyZXNvdXJjZVBhcmFtcykgfSk7XG5cdFx0dGhpcy5wYXJhbXMuZ3JvdXBzID0gXy5maWx0ZXIodGhpcy5wYXJhbXMuZ3JvdXBzLCBncm91cCA9PiAhXy5zdGFydHNXaXRoKGdyb3VwLCBcImJvb2stXCIpKTtcblxuXHRcdHRoaXMuY29sbGVjdGlvbnNbMF0uZmV0Y2goeyByZXNldDogdHJ1ZSwgZGF0YTogJC5wYXJhbSh0aGlzLnBhcmFtcykgfSk7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBwYXJhbXMgPSB7fTtcblx0XHRjb25zdCBrZXkgPSB0aGlzLnR5cGUgPT09IFwiZ3JvdXBcIiA/IFwiZ3JvdXBzXCIgOiB0aGlzLnR5cGU7XG5cdFx0cGFyYW1zW2tleV0gPSB0aGlzLnR5cGUgPT09IFwiZ3JvdXBcIiA/IFt0aGlzLml0ZW1faWRdIDogdGhpcy5pdGVtX2lkO1xuXHRcdHRoaXMuc3RvcE1vbml0ZXIocGFyYW1zKTtcblx0fSxcblxuXHRzdG9wTW9uaXRlcjogZnVuY3Rpb24ocGFyYW1zKSB7XG5cdFx0Y29uc3QgdXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cblx0XHRpZiAoQXBwLndzLndlYnNvY2tldCkge1xuXHRcdFx0QXBwLndzLndlYnNvY2tldC53cml0ZSh7XG5cdFx0XHRcdGNhbTogdHJ1ZSxcblx0XHRcdFx0YWN0aW9uOiBcInN0b3BNb25pdGVyXCIsXG5cdFx0XHRcdHBhcmFtczogcGFyYW1zLFxuXHRcdFx0XHR1c2VyOiB1c2VyLnVzZXJuYW1lLFxuXHRcdFx0XHRyb29tOiB0aGlzLml0ZW1faWQsXG5cdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0YWRkVXNlclN0YXQ6IGZ1bmN0aW9uKHN0YXQpIHtcblx0XHRjb25zdCBleGlzdGluZ1N0YXQgPSBfLmZpbmQodGhpcy5zdGF0c0NvbGxlY3Rpb24ubW9kZWxzLCBzdGF0TW9kZWwgPT5cblx0XHRcdHN0YXRNb2RlbC5nZXQoXCJ1c2VybmFtZVwiKSA9PT0gc3RhdC51c2VybmFtZSAmJiBzdGF0TW9kZWwuZ2V0KFwidGltZVwiKSA9PT0gc3RhdC50aW1lICYmIHN0YXRNb2RlbC5nZXQoXCJzdGF0ZVwiKSA9PT0gc3RhdC5zdGF0ZVxuXHRcdCk7XG5cblx0XHRpZiAoZXhpc3RpbmdTdGF0KVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgc3RhdCBpcyB2YWxpZC4gLy8gYW5kcm9pZCBzb21ldGltZXMgc2VuZHMgYW4gaW1wb3NzaWJsZSBzdGF0IG9mIG5hdmlnYXRpbmcgZnJvbSAnaW4gYm9vaycgdG8gJ2dyb3VwIGxpc3QnXG5cdFx0aWYgKHN0YXQuc3RhdGUgPT09IFwiaW4gYXBwXCIgJiYgc3RhdC5zY3JlZW4gPT09IFwiZ3JvdXAgbGlzdFwiICYmIHN0YXQucHJldl9zdGF0ZSA9PT0gXCJpbiBib29rXCIpXG5cdFx0XHRyZXR1cm47XG5cblx0XHQvLyBEbyBub3QgYWRkIHRyb3VibGVzaG9vdGVyIHN0YXQgaWYgaXQgd2FzIG9wZW5lZCBmcm9tIHJlc291cmNlIG9yIGdyb3VwXG5cdFx0aWYgKHN0YXQuc3RhdGUgPT09IFwiaW4gYXBwXCIgJiYgc3RhdC5zY3JlZW4gPT09IFwidHJvdWJsZXNob290ZXJcIiAmJiAoXy5pbmNsdWRlcyhbXCJpbiByZXNvdXJjZVwiLCBcImluIGdyb3VwXCJdLCBzdGF0LnByZXZfc3RhdGUpIHx8IF8uaW5jbHVkZXMoW1wiaW4gcmVzb3VyY2VcIiwgXCJpbiBncm91cFwiXSwgc3RhdFtcInByZXYgc3RhdGVcIl0pKSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuc3RhdHNDb2xsZWN0aW9uLmFkZChuZXcgU3RhdHNNb2RlbChzdGF0KSk7XG5cdFx0Ly8gRmluZCB1c2VyIGN1cnJlbnQgY29sbGVjdGlvblxuXHRcdGNvbnN0IHJlc3VsdCA9IHt9O1xuXHRcdF8uZWFjaCh0aGlzLnBvc3NpYmxlU3RhdGVzLCBzdGF0ZSA9PiB7XG5cdFx0XHRjb25zdCBtb2RlbCA9IHRoaXMuY29sbGVjdGlvbnNbc3RhdGVdLmZpbmRXaGVyZSh7IHVzZXJuYW1lOiBzdGF0LnVzZXJuYW1lIH0pO1xuXG5cdFx0XHRpZiAobW9kZWwpXG5cdFx0XHRcdHJlc3VsdC51c2VyID0gbW9kZWw7XG5cdFx0fSk7XG5cblx0XHRpZiAoIXJlc3VsdC51c2VyKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0Y29uc3QgdXNlclN0YXRzID0gXy5maWx0ZXIodGhpcy5zdGF0c0NvbGxlY3Rpb24ubW9kZWxzLCBzdGF0TW9kZWwgPT4gc3RhdE1vZGVsLmdldChcInVzZXJuYW1lXCIpID09PSByZXN1bHQudXNlci5nZXQoXCJ1c2VybmFtZVwiKSk7XG5cblx0XHRjb25zdCBsYXRlc3RVc2VyU3RhdCA9IF8uZmlyc3QoXy5vcmRlckJ5KHVzZXJTdGF0cywgc3RhdE1vZGVsID0+IFtzdGF0TW9kZWwuZ2V0KFwidGltZVwiKSwgc3RhdE1vZGVsLmdldChcInRpbWVzdGFtcFwiKV0sIFwiZGVzY1wiKSk7IC8vdXNlclN0YXRzW3VzZXJTdGF0cy5sZW5ndGggLSAxXT87XG5cblx0XHRjb25zdCBwcmV2U3RhdGUgPSByZXN1bHQudXNlci5nZXQoXCJzdGF0dXNcIik7XG5cblx0XHQvLyB1c2VyIG5vdCBpbiBncm91cCBvciBib29rIG9yIHJlbGF0ZWQgcmVzb3VyY2Vcblx0XHRsZXQgc3RhdHVzID0gU1RBVFVTX1JFRDtcblxuXHRcdC8vIGNoZWNrIHdoZXRoZXIgaW4gYm9va1xuXHRcdGlmICh0aGlzLnR5cGUgPT09IFwiYm9va1wiICYmIHRoaXMucGFyYW1zLmJvb2spIHtcblx0XHRcdGNvbnN0IG91dE9mQm9va1N0YXRlcyA9IFtcImZvY3VzIGxvc3RcIiwgXCJpbiBhcHBcIiwgXCJhcHAgY2xvc2VkXCIsIFwibGlicmFyeVwiLCBcImxhc3R3aWxsXCIsIFwiaW4gZ3JvdXBcIiwgXCJjcmFzaGVkXCIsIFwic3RhcnRlZFwiXTtcblxuXHRcdFx0aWYgKChsYXRlc3RVc2VyU3RhdC5nZXQoXCJzdGF0ZVwiKSA9PT0gXCJpbiBib29rXCIgJiYgbGF0ZXN0VXNlclN0YXQuZ2V0KFwiYm9va19pZFwiKSA9PT0gdGhpcy5wYXJhbXMuYm9vayAmJiB0aGlzLmJvb2tDb2xsZWN0aW9uLndoZXJlKHsgaWQ6IGxhdGVzdFVzZXJTdGF0LmdldChcImJvb2tfaWRcIikgfSkubGVuZ3RoID4gMCkgfHxcblx0XHRcdFx0KGxhdGVzdFVzZXJTdGF0LmdldChcInN0YXRlXCIpID09PSBcImluIHJlc291cmNlXCIgJiYgdGhpcy5yZXNvdXJjZUNvbGxlY3Rpb24ud2hlcmUoeyBhdHRhY2htZW50X2lkOiBsYXRlc3RVc2VyU3RhdC5nZXQoXCJhdHRhY2htZW50X2lkXCIpIH0pLmxlbmd0aCA+IDApKSB7XG5cdFx0XHRcdGlmIChfLmZpbmQodXNlclN0YXRzLCBzdGF0TW9kZWwgPT4gXy5pbmNsdWRlcyhvdXRPZkJvb2tTdGF0ZXMsIHN0YXRNb2RlbC5nZXQoXCJzdGF0ZVwiKSkpKVxuXHRcdFx0XHRcdHN0YXR1cyA9IFNUQVRVU19PUkFOR0U7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRzdGF0dXMgPSBTVEFUVVNfR1JFRU47XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHsgc3RhdHVzID0gU1RBVFVTX1JFRDsgfVxuXHRcdH1cblx0XHQvLyBjaGVjayB3aGV0aGVyIGluIHNwZWNpZmljIGdyb3VwIG9yIGdyb3VwX2Jvb2tcblx0XHRlbHNlIGlmIChsYXRlc3RVc2VyU3RhdC5nZXQoXCJzdGF0ZVwiKSA9PT0gXCJpbiBncm91cFwiIHx8IGxhdGVzdFVzZXJTdGF0LmdldChcInN0YXRlXCIpID09PSBcImluIHJlc291cmNlXCIgfHxcblx0XHRcdChsYXRlc3RVc2VyU3RhdC5nZXQoXCJzdGF0ZVwiKSA9PT0gXCJpbiBib29rXCIgJiYgdGhpcy5ib29rQ29sbGVjdGlvbi53aGVyZSh7IGlkOiBsYXRlc3RVc2VyU3RhdC5nZXQoXCJib29rX2lkXCIpIH0pLmxlbmd0aCA+IDApKSB7XG5cdFx0XHRjb25zdCBpbkdyb3VwU3RhdHMgPSBfLmZpbHRlcih1c2VyU3RhdHMsIHN0YXRNb2RlbCA9PiAoXG5cdFx0XHRcdC8vIG1hdGNoaW5nIG1vbml0b3JlZCBncm91cF9pZFxuXHRcdFx0XHQoc3RhdE1vZGVsLmdldChcInN0YXRlXCIpID09PSBcImluIGdyb3VwXCIgJiYgXy5pbmNsdWRlcyh0aGlzLnBhcmFtcy5ncm91cHMsIHN0YXRNb2RlbC5nZXQoXCJncm91cF9pZFwiKSkpIHx8XG5cdFx0XHRcdC8vIG1hdGNoaW5nIG1vbml0b3JlZCByZXNvdXJjZSAvIGJvb2sgbGlua2VkIHRvIGdyb3VwXG5cdFx0XHRcdHN0YXRNb2RlbC5nZXQoXCJzdGF0ZVwiKSA9PT0gXCJpbiByZXNvdXJjZVwiIHx8IHN0YXRNb2RlbC5nZXQoXCJzdGF0ZVwiKSA9PT0gXCJpbiBib29rXCIpICYmXG5cdFx0XHRcdChcblx0XHRcdFx0XHRfLmluY2x1ZGVzKHRoaXMucGFyYW1zLmdyb3Vwcywgc3RhdE1vZGVsLmdldChcImdyb3VwX2lkXCIpKSB8fFxuXHRcdFx0XHRcdF8uaW5jbHVkZXModGhpcy5wYXJhbXMuZ3JvdXBzLCBzdGF0TW9kZWwuZ2V0KFwicHJldiBncm91cF9pZFwiKSkgfHxcblx0XHRcdFx0XHR0aGlzLmJvb2tDb2xsZWN0aW9uLndoZXJlKHsgaWQ6IHN0YXRNb2RlbC5nZXQoXCJib29rX2lkXCIpIH0pLmxlbmd0aCA+IDAgfHxcblx0XHRcdFx0XHR0aGlzLnJlc291cmNlQ29sbGVjdGlvbi53aGVyZSh7IF9pZDogc3RhdE1vZGVsLmdldChcInJlc291cmNlX2lkXCIpIH0pLmxlbmd0aCA+IDBcblx0XHRcdFx0KVxuXHRcdFx0KTtcblxuXHRcdFx0Y29uc3QgaW5Cb29rU3RhdHMgPSBfLmZpbHRlcih1c2VyU3RhdHMsIHN0YXRNb2RlbCA9PiAoc3RhdE1vZGVsLmdldChcInN0YXRlXCIpID09PSBcImluIGJvb2tcIiB8fCBzdGF0TW9kZWwuZ2V0KFwic3RhdGVcIikgPT09IFwiaW4gcmVzb3VyY2VcIikgJiZcblx0XHRcdFx0KHN0YXRNb2RlbC5nZXQoXCJib29rX2lkXCIpID09PSB0aGlzLnBhcmFtcy5ib29rIHx8IHN0YXRNb2RlbC5nZXQoXCJwcmV2X2Jvb2tfaWRcIikgPT09IHRoaXMucGFyYW1zLmJvb2sgfHxcblx0XHRcdFx0XHR0aGlzLnJlc291cmNlQ29sbGVjdGlvbi53aGVyZSh7IF9pZDogc3RhdE1vZGVsLmdldChcInJlc291cmNlX2lkXCIpIH0pLmxlbmd0aCA+IDApKTtcblxuXHRcdFx0Ly8gaWYgdXNlclN0YXRzIGluY2x1ZGVzIGFueXRoaW5nIGVsc2UgdGhhbiBcImluIGdyb3VwXCIgKGZvciB0aGF0IGdyb3VwKSBvciBcImluIGJvb2tcIiAoZm9yIHRoYXQgYm9vayksIG1ha2Ugc3RhdHVzIE9SQU5HRVxuXHRcdFx0aWYgKChpbkdyb3VwU3RhdHMubGVuZ3RoID4gMCAmJiBpbkdyb3VwU3RhdHMubGVuZ3RoIDwgdXNlclN0YXRzLmxlbmd0aCkgfHwgKGluQm9va1N0YXRzLmxlbmd0aCA+IDAgJiYgaW5Cb29rU3RhdHMubGVuZ3RoIDwgdXNlclN0YXRzLmxlbmd0aCkpIHtcblx0XHRcdFx0aWYgKGluR3JvdXBTdGF0cy5sZW5ndGggIT09IDAgJiYgaW5Hcm91cFN0YXRzLmxlbmd0aCA9PT0gdXNlclN0YXRzLmxlbmd0aCB8fCBpbkJvb2tTdGF0cy5sZW5ndGggIT09IDAgJiYgaW5Cb29rU3RhdHMubGVuZ3RoID09PSB1c2VyU3RhdHMubGVuZ3RoKVxuXHRcdFx0XHRcdHN0YXR1cyA9IFNUQVRVU19HUkVFTjtcblx0XHRcdFx0ZWxzZSBpZiAoaW5Hcm91cFN0YXRzLmxlbmd0aCAhPT0gMCAmJiBfLmZpbmQoaW5Hcm91cFN0YXRzLCBncm91cFN0YXQgPT4gZ3JvdXBTdGF0LmdldChcImdyb3VwX2lkXCIpID09PSBsYXRlc3RVc2VyU3RhdC5nZXQoXCJncm91cF9pZFwiKSkpXG5cdFx0XHRcdFx0c3RhdHVzID0gU1RBVFVTX09SQU5HRTtcblx0XHRcdFx0ZWxzZSBpZiAoaW5Cb29rU3RhdHMubGVuZ3RoICE9PSAwICYmIF8uZmluZChpbkJvb2tTdGF0cywgYm9va1N0YXQgPT4gYm9va1N0YXQuZ2V0KFwiZ3JvdXBfaWRcIikgPT09IGxhdGVzdFVzZXJTdGF0LmdldChcImdyb3VwX2lkXCIpKSlcblx0XHRcdFx0XHRzdGF0dXMgPSBTVEFUVVNfT1JBTkdFO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0c3RhdHVzID0gU1RBVFVTX1JFRDtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKGluR3JvdXBTdGF0cy5sZW5ndGggIT09IDAgJiYgXy5maW5kKGluR3JvdXBTdGF0cywgZ3JvdXBTdGF0ID0+IGdyb3VwU3RhdC5nZXQoXCJncm91cF9pZFwiKSA9PT0gbGF0ZXN0VXNlclN0YXQuZ2V0KFwiZ3JvdXBfaWRcIikpKSB7XG5cdFx0XHRcdHN0YXR1cyA9IFNUQVRVU19HUkVFTjtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKGluQm9va1N0YXRzLmxlbmd0aCAhPT0gMCAmJiBfLmZpbmQoaW5Cb29rU3RhdHMsIGJvb2tTdGF0ID0+IGJvb2tTdGF0LmdldChcImdyb3VwX2lkXCIpID09PSBsYXRlc3RVc2VyU3RhdC5nZXQoXCJncm91cF9pZFwiKSkpIHtcblx0XHRcdFx0c3RhdHVzID0gU1RBVFVTX0dSRUVOO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFscmVhZHkgaW4gdGhlIHJpZ2h0IHN0YXRlXG5cdFx0aWYgKHByZXZTdGF0ZSA9PT0gc3RhdHVzKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0cmVzdWx0LnVzZXIuc2V0KHsgc3RhdHVzOiBzdGF0dXMgfSk7XG5cdFx0dGhpcy5jb2xsZWN0aW9uc1tzdGF0dXNdLmFkZChyZXN1bHQudXNlcik7XG5cdFx0dGhpcy5jb2xsZWN0aW9uc1twcmV2U3RhdGVdLnJlbW92ZShyZXN1bHQudXNlcik7XG5cblx0XHR0aGlzLnVwZGF0ZUFjdGl2ZVVzZXJzKCk7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\n\nvar BigModal = require(\"../../../lib/bigModal\");\nvar Errors = require(\"../../../lib/errors\");\nvar App = require(\"../../../index\");\n\nvar DeletedAttachment = Backbone.Model.extend({\n\tdefaults: {},\n\tidAttribute: \"_id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/attachments/recover\";\n\t}\n});\n\nvar DeletedAttachmentCollection = Backbone.Collection.extend({\n\tmodel: DeletedAttachment\n});\n\nvar DeletedAttachmentItem = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"deleted-attachment-item\",\n\n\ttemplate: require(\"../../templates/console/attachmentRecoveryModal.nunj\").deletedAttachmentItem,\n\n\tevents: {\n\t\tclick: \"onClick\"\n\t},\n\n\tonClick: function onClick() {\n\t\tthis.model.trigger(\"recover\", this.model);\n\t}\n});\n\nvar DeletedAttachmentList = Backbone.Marionette.CollectionView.extend({\n\ttagName: \"div\",\n\tclassName: \"deleted-attachment-list\",\n\n\ttemplate: false,\n\n\tchildView: DeletedAttachmentItem\n});\n\nmodule.exports = BigModal.extend({\n\tui: {\n\t\tattachmentList: \".attachment-list\",\n\t\temptyMessage: \"div.empty-message\"\n\t},\n\n\tevents: {},\n\n\tinitialize: function initialize(options) {\n\t\tthis.Options = {\n\t\t\tclasses: [\"attachment-recovery-modal\"],\n\t\t\ttemplate: require(\"../../templates/console/attachmentRecoveryModal.nunj\").content,\n\t\t\tbuttons: {\n\t\t\t\tclose: {\n\t\t\t\t\ttype: \"cancel\",\n\t\t\t\t\tlabel: \"Close\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tdataNoun: \"deleted attachment\",\n\t\t\tcreateIcon: \"fa-trash-alt\",\n\t\t\tcreateVerb: \"recover\",\n\t\t\tsizeConstraints: {\n\t\t\t\tmaxHeight: \"70vh\",\n\t\t\t\tminWidth: \"50vw\",\n\t\t\t\tmaxWidth: \"50vw\"\n\t\t\t}\n\t\t};\n\n\t\tthis.DeletedAttachments = new DeletedAttachmentCollection(_.map(options.deletedAttachments.models, function (model) {\n\t\t\tvar icon = App.mapResourceToIcon(model.get(\"resourceType\"));\n\t\t\tvar prefix = \"img-\";\n\n\t\t\ticon = prefix + icon;\n\n\t\t\tvar data = {\n\t\t\t\t_id: model.get(\"_id\"),\n\t\t\t\tbook: model.get(\"book\"),\n\t\t\t\tgroups: model.get(\"groups\"),\n\t\t\t\tgrade: model.resourceModel ? model.resourceModel.get(\"grade\") : model.get(\"grade\") || \"\",\n\t\t\t\ticon: icon,\n\t\t\t\tlanguage: model.resourceModel ? model.resourceModel.get(\"language\") : model.get(\"language\") || \"\",\n\t\t\t\tresourceType: model.resourceModel ? model.resourceModel.get(\"type\") : \"\",\n\t\t\t\tsubject: model.resourceModel ? model.resourceModel.get(\"subject\") : model.get(\"subject_name\") || \"\",\n\t\t\t\ttitle: model.resourceModel ? model.resourceModel.get(\"title\") : \"\"\n\t\t\t};\n\n\t\t\treturn new DeletedAttachment(data);\n\t\t}));\n\n\t\tthis.listenTo(this.DeletedAttachments, \"recover\", this.recoverAttachment.bind(this));\n\t\tthis.DeletedAttachments.on(\"remove\", this.onDeletedAttachmentRemoved.bind(this));\n\n\t\tthis.ui = _.extend(this.ui, BigModal.prototype.ui);\n\t\tthis.events = _.extend(this.events, BigModal.prototype.events);\n\n\t\tBigModal.prototype.initialize.call(this);\n\t},\n\n\trenderForm: function renderForm() {\n\t\tthis.DeletedAttachmentList = new DeletedAttachmentList({ collection: this.DeletedAttachments });\n\t\tthis.ui.attachmentList.append(this.DeletedAttachmentList.render().el);\n\t},\n\n\trecoverAttachment: function recoverAttachment(model) {\n\t\tif (!this.ui.attachmentList.hasClass(\"disabled\")) {\n\t\t\tthis.setUIBusy();\n\n\t\t\tmodel.save(model.toJSON(), {\n\t\t\t\tsuccess: this.recoverAttachmentSuccess.bind(this),\n\t\t\t\terror: this.recoverAttachmentError.bind(this)\n\t\t\t});\n\t\t}\n\t},\n\n\trecoverAttachmentSuccess: function recoverAttachmentSuccess(model) {\n\t\tthis.trigger(\"recover\", model);\n\t\tthis.DeletedAttachments.remove(model);\n\t\tthis.setUIReady();\n\t},\n\n\trecoverAttachmentError: function recoverAttachmentError(model, response) {\n\t\tthis.showError(new Errors.Model({\n\t\t\ttitle: \"Attachment Recovery Error\",\n\t\t\tmessage: \"An error occurred while recovering an attachment.\",\n\t\t\tresponse: response\n\t\t}));\n\t},\n\n\tonDeletedAttachmentRemoved: function onDeletedAttachmentRemoved() {\n\t\tif (this.DeletedAttachments.length === 0 && this.ui.attachmentList.addClass) {\n\t\t\tthis.DeletedAttachmentList.$el.addClass(\"hide\");\n\t\t\tthis.ui.attachmentList.addClass(\"empty\");\n\t\t\tthis.ui.emptyMessage.removeClass(\"hide\");\n\t\t}\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImF0dGFjaG1lbnRSZWNvdmVyeU1vZGFsLmpzIl0sIm5hbWVzIjpbIl8iLCJyZXF1aXJlIiwiQmFja2JvbmUiLCJzZXR0aW5ncyIsIkJpZ01vZGFsIiwiRXJyb3JzIiwiQXBwIiwiRGVsZXRlZEF0dGFjaG1lbnQiLCJNb2RlbCIsImV4dGVuZCIsImRlZmF1bHRzIiwiaWRBdHRyaWJ1dGUiLCJ1cmxSb290IiwiRGVsZXRlZEF0dGFjaG1lbnRDb2xsZWN0aW9uIiwiQ29sbGVjdGlvbiIsIm1vZGVsIiwiRGVsZXRlZEF0dGFjaG1lbnRJdGVtIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJ0YWdOYW1lIiwiY2xhc3NOYW1lIiwidGVtcGxhdGUiLCJkZWxldGVkQXR0YWNobWVudEl0ZW0iLCJldmVudHMiLCJjbGljayIsIm9uQ2xpY2siLCJ0cmlnZ2VyIiwiRGVsZXRlZEF0dGFjaG1lbnRMaXN0IiwiQ29sbGVjdGlvblZpZXciLCJjaGlsZFZpZXciLCJtb2R1bGUiLCJleHBvcnRzIiwidWkiLCJhdHRhY2htZW50TGlzdCIsImVtcHR5TWVzc2FnZSIsImluaXRpYWxpemUiLCJvcHRpb25zIiwiT3B0aW9ucyIsImNsYXNzZXMiLCJjb250ZW50IiwiYnV0dG9ucyIsImNsb3NlIiwidHlwZSIsImxhYmVsIiwiZGF0YU5vdW4iLCJjcmVhdGVJY29uIiwiY3JlYXRlVmVyYiIsInNpemVDb25zdHJhaW50cyIsIm1heEhlaWdodCIsIm1pbldpZHRoIiwibWF4V2lkdGgiLCJEZWxldGVkQXR0YWNobWVudHMiLCJtYXAiLCJkZWxldGVkQXR0YWNobWVudHMiLCJtb2RlbHMiLCJpY29uIiwibWFwUmVzb3VyY2VUb0ljb24iLCJnZXQiLCJwcmVmaXgiLCJkYXRhIiwiX2lkIiwiYm9vayIsImdyb3VwcyIsImdyYWRlIiwicmVzb3VyY2VNb2RlbCIsImxhbmd1YWdlIiwicmVzb3VyY2VUeXBlIiwic3ViamVjdCIsInRpdGxlIiwibGlzdGVuVG8iLCJyZWNvdmVyQXR0YWNobWVudCIsImJpbmQiLCJvbiIsIm9uRGVsZXRlZEF0dGFjaG1lbnRSZW1vdmVkIiwicHJvdG90eXBlIiwiY2FsbCIsInJlbmRlckZvcm0iLCJjb2xsZWN0aW9uIiwiYXBwZW5kIiwicmVuZGVyIiwiZWwiLCJoYXNDbGFzcyIsInNldFVJQnVzeSIsInNhdmUiLCJ0b0pTT04iLCJzdWNjZXNzIiwicmVjb3ZlckF0dGFjaG1lbnRTdWNjZXNzIiwiZXJyb3IiLCJyZWNvdmVyQXR0YWNobWVudEVycm9yIiwicmVtb3ZlIiwic2V0VUlSZWFkeSIsInJlc3BvbnNlIiwic2hvd0Vycm9yIiwibWVzc2FnZSIsImxlbmd0aCIsImFkZENsYXNzIiwiJGVsIiwicmVtb3ZlQ2xhc3MiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsV0FBV0QsUUFBUSxVQUFSLENBQWpCOztBQUVBLElBQU1FLFdBQVdGLFFBQVEsY0FBUixDQUFqQjs7QUFFQSxJQUFNRyxXQUFXSCxRQUFRLHVCQUFSLENBQWpCO0FBQ0EsSUFBTUksU0FBU0osUUFBUSxxQkFBUixDQUFmO0FBQ0EsSUFBTUssTUFBTUwsUUFBUSxnQkFBUixDQUFaOztBQUVBLElBQU1NLG9CQUFvQkwsU0FBU00sS0FBVCxDQUFlQyxNQUFmLENBQXNCO0FBQy9DQyxXQUFVLEVBRHFDO0FBRS9DQyxjQUFhLEtBRmtDOztBQUkvQ0MsVUFBUyxtQkFBVztBQUNuQixTQUFPVCxTQUFTUyxPQUFULEdBQW1CLDhCQUExQjtBQUNBO0FBTjhDLENBQXRCLENBQTFCOztBQVNBLElBQU1DLDhCQUE4QlgsU0FBU1ksVUFBVCxDQUFvQkwsTUFBcEIsQ0FBMkI7QUFDOURNLFFBQU9SO0FBRHVELENBQTNCLENBQXBDOztBQUlBLElBQU1TLHdCQUF3QmQsU0FBU2UsVUFBVCxDQUFvQkMsSUFBcEIsQ0FBeUJULE1BQXpCLENBQWdDO0FBQzdEVSxVQUFTLEtBRG9EO0FBRTdEQyxZQUFXLHlCQUZrRDs7QUFJN0RDLFdBQVVwQixRQUFRLHNEQUFSLEVBQWdFcUIscUJBSmI7O0FBTTdEQyxTQUFRO0FBQ1BDLFNBQU87QUFEQSxFQU5xRDs7QUFVN0RDLFVBQVMsbUJBQVc7QUFDbkIsT0FBS1YsS0FBTCxDQUFXVyxPQUFYLENBQW1CLFNBQW5CLEVBQThCLEtBQUtYLEtBQW5DO0FBQ0E7QUFaNEQsQ0FBaEMsQ0FBOUI7O0FBZUEsSUFBTVksd0JBQXdCekIsU0FBU2UsVUFBVCxDQUFvQlcsY0FBcEIsQ0FBbUNuQixNQUFuQyxDQUEwQztBQUN2RVUsVUFBUyxLQUQ4RDtBQUV2RUMsWUFBVyx5QkFGNEQ7O0FBSXZFQyxXQUFVLEtBSjZEOztBQU12RVEsWUFBV2I7QUFONEQsQ0FBMUMsQ0FBOUI7O0FBU0FjLE9BQU9DLE9BQVAsR0FBaUIzQixTQUFTSyxNQUFULENBQWdCO0FBQ2hDdUIsS0FBSTtBQUNIQyxrQkFBZ0Isa0JBRGI7QUFFSEMsZ0JBQWM7QUFGWCxFQUQ0Qjs7QUFNaENYLFNBQVEsRUFOd0I7O0FBUWhDWSxhQUFZLG9CQUFTQyxPQUFULEVBQWtCO0FBQzdCLE9BQUtDLE9BQUwsR0FBZTtBQUNkQyxZQUFTLENBQUMsMkJBQUQsQ0FESztBQUVkakIsYUFBVXBCLFFBQVEsc0RBQVIsRUFBZ0VzQyxPQUY1RDtBQUdkQyxZQUFTO0FBQ1JDLFdBQU87QUFDTkMsV0FBTSxRQURBO0FBRU5DLFlBQU87QUFGRDtBQURDLElBSEs7QUFTZEMsYUFBVSxvQkFUSTtBQVVkQyxlQUFZLGNBVkU7QUFXZEMsZUFBWSxTQVhFO0FBWWRDLG9CQUFpQjtBQUNoQkMsZUFBVyxNQURLO0FBRWhCQyxjQUFVLE1BRk07QUFHaEJDLGNBQVU7QUFITTtBQVpILEdBQWY7O0FBbUJBLE9BQUtDLGtCQUFMLEdBQTBCLElBQUl0QywyQkFBSixDQUFnQ2IsRUFBRW9ELEdBQUYsQ0FBTWhCLFFBQVFpQixrQkFBUixDQUEyQkMsTUFBakMsRUFBeUMsaUJBQVM7QUFDM0csT0FBSUMsT0FBT2pELElBQUlrRCxpQkFBSixDQUFzQnpDLE1BQU0wQyxHQUFOLENBQVUsY0FBVixDQUF0QixDQUFYO0FBQ0EsT0FBTUMsU0FBUyxNQUFmOztBQUVBSCxVQUFPRyxTQUFTSCxJQUFoQjs7QUFFQSxPQUFNSSxPQUFPO0FBQ1pDLFNBQUs3QyxNQUFNMEMsR0FBTixDQUFVLEtBQVYsQ0FETztBQUVaSSxVQUFNOUMsTUFBTTBDLEdBQU4sQ0FBVSxNQUFWLENBRk07QUFHWkssWUFBUS9DLE1BQU0wQyxHQUFOLENBQVUsUUFBVixDQUhJO0FBSVpNLFdBQU9oRCxNQUFNaUQsYUFBTixHQUFzQmpELE1BQU1pRCxhQUFOLENBQW9CUCxHQUFwQixDQUF3QixPQUF4QixDQUF0QixHQUEwRDFDLE1BQU0wQyxHQUFOLENBQVUsT0FBVixLQUFzQixFQUozRTtBQUtaRixVQUFNQSxJQUxNO0FBTVpVLGNBQVVsRCxNQUFNaUQsYUFBTixHQUFzQmpELE1BQU1pRCxhQUFOLENBQW9CUCxHQUFwQixDQUF3QixVQUF4QixDQUF0QixHQUE2RDFDLE1BQU0wQyxHQUFOLENBQVUsVUFBVixLQUF5QixFQU5wRjtBQU9aUyxrQkFBY25ELE1BQU1pRCxhQUFOLEdBQXNCakQsTUFBTWlELGFBQU4sQ0FBb0JQLEdBQXBCLENBQXdCLE1BQXhCLENBQXRCLEdBQXdELEVBUDFEO0FBUVpVLGFBQVNwRCxNQUFNaUQsYUFBTixHQUFzQmpELE1BQU1pRCxhQUFOLENBQW9CUCxHQUFwQixDQUF3QixTQUF4QixDQUF0QixHQUE0RDFDLE1BQU0wQyxHQUFOLENBQVUsY0FBVixLQUE2QixFQVJ0RjtBQVNaVyxXQUFPckQsTUFBTWlELGFBQU4sR0FBc0JqRCxNQUFNaUQsYUFBTixDQUFvQlAsR0FBcEIsQ0FBd0IsT0FBeEIsQ0FBdEIsR0FBeUQ7QUFUcEQsSUFBYjs7QUFZQSxVQUFPLElBQUlsRCxpQkFBSixDQUFzQm9ELElBQXRCLENBQVA7QUFDQSxHQW5CeUQsQ0FBaEMsQ0FBMUI7O0FBcUJBLE9BQUtVLFFBQUwsQ0FBYyxLQUFLbEIsa0JBQW5CLEVBQXVDLFNBQXZDLEVBQWtELEtBQUttQixpQkFBTCxDQUF1QkMsSUFBdkIsQ0FBNEIsSUFBNUIsQ0FBbEQ7QUFDQSxPQUFLcEIsa0JBQUwsQ0FBd0JxQixFQUF4QixDQUEyQixRQUEzQixFQUFxQyxLQUFLQywwQkFBTCxDQUFnQ0YsSUFBaEMsQ0FBcUMsSUFBckMsQ0FBckM7O0FBRUEsT0FBS3ZDLEVBQUwsR0FBVWhDLEVBQUVTLE1BQUYsQ0FBUyxLQUFLdUIsRUFBZCxFQUFrQjVCLFNBQVNzRSxTQUFULENBQW1CMUMsRUFBckMsQ0FBVjtBQUNBLE9BQUtULE1BQUwsR0FBY3ZCLEVBQUVTLE1BQUYsQ0FBUyxLQUFLYyxNQUFkLEVBQXNCbkIsU0FBU3NFLFNBQVQsQ0FBbUJuRCxNQUF6QyxDQUFkOztBQUVBbkIsV0FBU3NFLFNBQVQsQ0FBbUJ2QyxVQUFuQixDQUE4QndDLElBQTlCLENBQW1DLElBQW5DO0FBQ0EsRUF4RCtCOztBQTBEaENDLGFBQVksc0JBQVc7QUFDdEIsT0FBS2pELHFCQUFMLEdBQTZCLElBQUlBLHFCQUFKLENBQTBCLEVBQUVrRCxZQUFZLEtBQUsxQixrQkFBbkIsRUFBMUIsQ0FBN0I7QUFDQSxPQUFLbkIsRUFBTCxDQUFRQyxjQUFSLENBQXVCNkMsTUFBdkIsQ0FBOEIsS0FBS25ELHFCQUFMLENBQTJCb0QsTUFBM0IsR0FBb0NDLEVBQWxFO0FBQ0EsRUE3RCtCOztBQStEaENWLG9CQUFtQiwyQkFBU3ZELEtBQVQsRUFBZ0I7QUFDbEMsTUFBSSxDQUFDLEtBQUtpQixFQUFMLENBQVFDLGNBQVIsQ0FBdUJnRCxRQUF2QixDQUFnQyxVQUFoQyxDQUFMLEVBQWtEO0FBQ2pELFFBQUtDLFNBQUw7O0FBRUFuRSxTQUFNb0UsSUFBTixDQUFXcEUsTUFBTXFFLE1BQU4sRUFBWCxFQUEyQjtBQUMxQkMsYUFBUyxLQUFLQyx3QkFBTCxDQUE4QmYsSUFBOUIsQ0FBbUMsSUFBbkMsQ0FEaUI7QUFFMUJnQixXQUFPLEtBQUtDLHNCQUFMLENBQTRCakIsSUFBNUIsQ0FBaUMsSUFBakM7QUFGbUIsSUFBM0I7QUFJQTtBQUNELEVBeEUrQjs7QUEwRWhDZSwyQkFBMEIsa0NBQVN2RSxLQUFULEVBQWdCO0FBQ3pDLE9BQUtXLE9BQUwsQ0FBYSxTQUFiLEVBQXdCWCxLQUF4QjtBQUNBLE9BQUtvQyxrQkFBTCxDQUF3QnNDLE1BQXhCLENBQStCMUUsS0FBL0I7QUFDQSxPQUFLMkUsVUFBTDtBQUNBLEVBOUUrQjs7QUFnRmhDRix5QkFBd0IsZ0NBQVN6RSxLQUFULEVBQWdCNEUsUUFBaEIsRUFBMEI7QUFDakQsT0FBS0MsU0FBTCxDQUFlLElBQUl2RixPQUFPRyxLQUFYLENBQWlCO0FBQy9CNEQsVUFBTywyQkFEd0I7QUFFL0J5QixZQUFTLG1EQUZzQjtBQUcvQkYsYUFBVUE7QUFIcUIsR0FBakIsQ0FBZjtBQUtBLEVBdEYrQjs7QUF3RmhDbEIsNkJBQTRCLHNDQUFXO0FBQ3RDLE1BQUksS0FBS3RCLGtCQUFMLENBQXdCMkMsTUFBeEIsS0FBbUMsQ0FBbkMsSUFBd0MsS0FBSzlELEVBQUwsQ0FBUUMsY0FBUixDQUF1QjhELFFBQW5FLEVBQTZFO0FBQzVFLFFBQUtwRSxxQkFBTCxDQUEyQnFFLEdBQTNCLENBQStCRCxRQUEvQixDQUF3QyxNQUF4QztBQUNBLFFBQUsvRCxFQUFMLENBQVFDLGNBQVIsQ0FBdUI4RCxRQUF2QixDQUFnQyxPQUFoQztBQUNBLFFBQUsvRCxFQUFMLENBQVFFLFlBQVIsQ0FBcUIrRCxXQUFyQixDQUFpQyxNQUFqQztBQUNBO0FBQ0Q7QUE5RitCLENBQWhCLENBQWpCIiwiZmlsZSI6ImF0dGFjaG1lbnRSZWNvdmVyeU1vZGFsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IEJpZ01vZGFsID0gcmVxdWlyZShcIi4uLy4uLy4uL2xpYi9iaWdNb2RhbFwiKTtcbmNvbnN0IEVycm9ycyA9IHJlcXVpcmUoXCIuLi8uLi8uLi9saWIvZXJyb3JzXCIpO1xuY29uc3QgQXBwID0gcmVxdWlyZShcIi4uLy4uLy4uL2luZGV4XCIpO1xuXG5jb25zdCBEZWxldGVkQXR0YWNobWVudCA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7fSxcblx0aWRBdHRyaWJ1dGU6IFwiX2lkXCIsXG5cblx0dXJsUm9vdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2F0dGFjaG1lbnRzL3JlY292ZXJcIjtcblx0fSxcbn0pO1xuXG5jb25zdCBEZWxldGVkQXR0YWNobWVudENvbGxlY3Rpb24gPSBCYWNrYm9uZS5Db2xsZWN0aW9uLmV4dGVuZCh7XG5cdG1vZGVsOiBEZWxldGVkQXR0YWNobWVudCxcbn0pO1xuXG5jb25zdCBEZWxldGVkQXR0YWNobWVudEl0ZW0gPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogXCJkaXZcIixcblx0Y2xhc3NOYW1lOiBcImRlbGV0ZWQtYXR0YWNobWVudC1pdGVtXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvY29uc29sZS9hdHRhY2htZW50UmVjb3ZlcnlNb2RhbC5udW5qXCIpLmRlbGV0ZWRBdHRhY2htZW50SXRlbSxcblxuXHRldmVudHM6IHtcblx0XHRjbGljazogXCJvbkNsaWNrXCIsXG5cdH0sXG5cblx0b25DbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5tb2RlbC50cmlnZ2VyKFwicmVjb3ZlclwiLCB0aGlzLm1vZGVsKTtcblx0fSxcbn0pO1xuXG5jb25zdCBEZWxldGVkQXR0YWNobWVudExpc3QgPSBCYWNrYm9uZS5NYXJpb25ldHRlLkNvbGxlY3Rpb25WaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6IFwiZGl2XCIsXG5cdGNsYXNzTmFtZTogXCJkZWxldGVkLWF0dGFjaG1lbnQtbGlzdFwiLFxuXG5cdHRlbXBsYXRlOiBmYWxzZSxcblxuXHRjaGlsZFZpZXc6IERlbGV0ZWRBdHRhY2htZW50SXRlbSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJpZ01vZGFsLmV4dGVuZCh7XG5cdHVpOiB7XG5cdFx0YXR0YWNobWVudExpc3Q6IFwiLmF0dGFjaG1lbnQtbGlzdFwiLFxuXHRcdGVtcHR5TWVzc2FnZTogXCJkaXYuZW1wdHktbWVzc2FnZVwiLFxuXHR9LFxuXG5cdGV2ZW50czoge30sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuT3B0aW9ucyA9IHtcblx0XHRcdGNsYXNzZXM6IFtcImF0dGFjaG1lbnQtcmVjb3ZlcnktbW9kYWxcIl0sXG5cdFx0XHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9jb25zb2xlL2F0dGFjaG1lbnRSZWNvdmVyeU1vZGFsLm51bmpcIikuY29udGVudCxcblx0XHRcdGJ1dHRvbnM6IHtcblx0XHRcdFx0Y2xvc2U6IHtcblx0XHRcdFx0XHR0eXBlOiBcImNhbmNlbFwiLFxuXHRcdFx0XHRcdGxhYmVsOiBcIkNsb3NlXCIsXG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdFx0ZGF0YU5vdW46IFwiZGVsZXRlZCBhdHRhY2htZW50XCIsXG5cdFx0XHRjcmVhdGVJY29uOiBcImZhLXRyYXNoLWFsdFwiLFxuXHRcdFx0Y3JlYXRlVmVyYjogXCJyZWNvdmVyXCIsXG5cdFx0XHRzaXplQ29uc3RyYWludHM6IHtcblx0XHRcdFx0bWF4SGVpZ2h0OiBcIjcwdmhcIixcblx0XHRcdFx0bWluV2lkdGg6IFwiNTB2d1wiLFxuXHRcdFx0XHRtYXhXaWR0aDogXCI1MHZ3XCIsXG5cdFx0XHR9LFxuXHRcdH07XG5cblx0XHR0aGlzLkRlbGV0ZWRBdHRhY2htZW50cyA9IG5ldyBEZWxldGVkQXR0YWNobWVudENvbGxlY3Rpb24oXy5tYXAob3B0aW9ucy5kZWxldGVkQXR0YWNobWVudHMubW9kZWxzLCBtb2RlbCA9PiB7XG5cdFx0XHRsZXQgaWNvbiA9IEFwcC5tYXBSZXNvdXJjZVRvSWNvbihtb2RlbC5nZXQoXCJyZXNvdXJjZVR5cGVcIikpO1xuXHRcdFx0Y29uc3QgcHJlZml4ID0gXCJpbWctXCI7XG5cblx0XHRcdGljb24gPSBwcmVmaXggKyBpY29uO1xuXG5cdFx0XHRjb25zdCBkYXRhID0ge1xuXHRcdFx0XHRfaWQ6IG1vZGVsLmdldChcIl9pZFwiKSxcblx0XHRcdFx0Ym9vazogbW9kZWwuZ2V0KFwiYm9va1wiKSxcblx0XHRcdFx0Z3JvdXBzOiBtb2RlbC5nZXQoXCJncm91cHNcIiksXG5cdFx0XHRcdGdyYWRlOiBtb2RlbC5yZXNvdXJjZU1vZGVsID8gbW9kZWwucmVzb3VyY2VNb2RlbC5nZXQoXCJncmFkZVwiKSA6IChtb2RlbC5nZXQoXCJncmFkZVwiKSB8fCBcIlwiKSxcblx0XHRcdFx0aWNvbjogaWNvbixcblx0XHRcdFx0bGFuZ3VhZ2U6IG1vZGVsLnJlc291cmNlTW9kZWwgPyBtb2RlbC5yZXNvdXJjZU1vZGVsLmdldChcImxhbmd1YWdlXCIpIDogKG1vZGVsLmdldChcImxhbmd1YWdlXCIpIHx8IFwiXCIpLFxuXHRcdFx0XHRyZXNvdXJjZVR5cGU6IG1vZGVsLnJlc291cmNlTW9kZWwgPyBtb2RlbC5yZXNvdXJjZU1vZGVsLmdldChcInR5cGVcIikgOiBcIlwiLFxuXHRcdFx0XHRzdWJqZWN0OiBtb2RlbC5yZXNvdXJjZU1vZGVsID8gbW9kZWwucmVzb3VyY2VNb2RlbC5nZXQoXCJzdWJqZWN0XCIpIDogKG1vZGVsLmdldChcInN1YmplY3RfbmFtZVwiKSB8fCBcIlwiKSxcblx0XHRcdFx0dGl0bGU6IG1vZGVsLnJlc291cmNlTW9kZWwgPyBtb2RlbC5yZXNvdXJjZU1vZGVsLmdldChcInRpdGxlXCIpIDogXCJcIixcblx0XHRcdH07XG5cblx0XHRcdHJldHVybiBuZXcgRGVsZXRlZEF0dGFjaG1lbnQoZGF0YSk7XG5cdFx0fSkpO1xuXG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLkRlbGV0ZWRBdHRhY2htZW50cywgXCJyZWNvdmVyXCIsIHRoaXMucmVjb3ZlckF0dGFjaG1lbnQuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5EZWxldGVkQXR0YWNobWVudHMub24oXCJyZW1vdmVcIiwgdGhpcy5vbkRlbGV0ZWRBdHRhY2htZW50UmVtb3ZlZC5iaW5kKHRoaXMpKTtcblxuXHRcdHRoaXMudWkgPSBfLmV4dGVuZCh0aGlzLnVpLCBCaWdNb2RhbC5wcm90b3R5cGUudWkpO1xuXHRcdHRoaXMuZXZlbnRzID0gXy5leHRlbmQodGhpcy5ldmVudHMsIEJpZ01vZGFsLnByb3RvdHlwZS5ldmVudHMpO1xuXG5cdFx0QmlnTW9kYWwucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzKTtcblx0fSxcblxuXHRyZW5kZXJGb3JtOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLkRlbGV0ZWRBdHRhY2htZW50TGlzdCA9IG5ldyBEZWxldGVkQXR0YWNobWVudExpc3QoeyBjb2xsZWN0aW9uOiB0aGlzLkRlbGV0ZWRBdHRhY2htZW50cyB9KTtcblx0XHR0aGlzLnVpLmF0dGFjaG1lbnRMaXN0LmFwcGVuZCh0aGlzLkRlbGV0ZWRBdHRhY2htZW50TGlzdC5yZW5kZXIoKS5lbCk7XG5cdH0sXG5cblx0cmVjb3ZlckF0dGFjaG1lbnQ6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0aWYgKCF0aGlzLnVpLmF0dGFjaG1lbnRMaXN0Lmhhc0NsYXNzKFwiZGlzYWJsZWRcIikpIHtcblx0XHRcdHRoaXMuc2V0VUlCdXN5KCk7XG5cblx0XHRcdG1vZGVsLnNhdmUobW9kZWwudG9KU09OKCksIHtcblx0XHRcdFx0c3VjY2VzczogdGhpcy5yZWNvdmVyQXR0YWNobWVudFN1Y2Nlc3MuYmluZCh0aGlzKSxcblx0XHRcdFx0ZXJyb3I6IHRoaXMucmVjb3ZlckF0dGFjaG1lbnRFcnJvci5iaW5kKHRoaXMpLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdHJlY292ZXJBdHRhY2htZW50U3VjY2VzczogZnVuY3Rpb24obW9kZWwpIHtcblx0XHR0aGlzLnRyaWdnZXIoXCJyZWNvdmVyXCIsIG1vZGVsKTtcblx0XHR0aGlzLkRlbGV0ZWRBdHRhY2htZW50cy5yZW1vdmUobW9kZWwpO1xuXHRcdHRoaXMuc2V0VUlSZWFkeSgpO1xuXHR9LFxuXG5cdHJlY292ZXJBdHRhY2htZW50RXJyb3I6IGZ1bmN0aW9uKG1vZGVsLCByZXNwb25zZSkge1xuXHRcdHRoaXMuc2hvd0Vycm9yKG5ldyBFcnJvcnMuTW9kZWwoe1xuXHRcdFx0dGl0bGU6IFwiQXR0YWNobWVudCBSZWNvdmVyeSBFcnJvclwiLFxuXHRcdFx0bWVzc2FnZTogXCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSByZWNvdmVyaW5nIGFuIGF0dGFjaG1lbnQuXCIsXG5cdFx0XHRyZXNwb25zZTogcmVzcG9uc2UsXG5cdFx0fSkpO1xuXHR9LFxuXG5cdG9uRGVsZXRlZEF0dGFjaG1lbnRSZW1vdmVkOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5EZWxldGVkQXR0YWNobWVudHMubGVuZ3RoID09PSAwICYmIHRoaXMudWkuYXR0YWNobWVudExpc3QuYWRkQ2xhc3MpIHtcblx0XHRcdHRoaXMuRGVsZXRlZEF0dGFjaG1lbnRMaXN0LiRlbC5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLnVpLmF0dGFjaG1lbnRMaXN0LmFkZENsYXNzKFwiZW1wdHlcIik7XG5cdFx0XHR0aGlzLnVpLmVtcHR5TWVzc2FnZS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0fVxuXHR9LFxufSk7Il19",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\n\nvar BigModal = require(\"../../../lib/bigModal\");\n\nmodule.exports = BigModal.extend({\n\tui: {\n\t\tlinkBtn: \".create\",\n\t\tselectedBook: \"#selectedBook\",\n\t\tbook: \"#bookSelector .book-cover\",\n\t\terror: \"#error\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.linkBtn\": \"onLinkBtnClick\",\n\t\t\"click @ui.book\": \"onBookClick\"\n\t},\n\n\tonLinkBtnClick: function onLinkBtnClick() {\n\t\tif (!this.model.get(\"selectedBookId\")) return this.showError(\"You must choose a book to link\");\n\n\t\tthis.close(\"create\", this.model.get(\"selectedBookId\"));\n\t\treturn this.model.get(\"selectedBookId\");\n\t},\n\n\tinitialize: function initialize(options) {\n\t\t_.bindAll(this);\n\n\t\tthis.model.set(\"books\", options.books);\n\n\t\tthis.Options = {\n\t\t\tclasses: [\"book-chooser-modal\"],\n\t\t\ttemplate: require(\"../../templates/console/bookChooserModal.nunj\").container,\n\t\t\tcreateIcon: \"fa-link\",\n\t\t\tbuttons: {\n\t\t\t\tcreate: {\n\t\t\t\t\ttype: \"accept\",\n\t\t\t\t\tlabel: \"Link\",\n\t\t\t\t\tmode: \"create\",\n\t\t\t\t\tvalidate: false,\n\t\t\t\t\tsave: false\n\t\t\t\t},\n\t\t\t\tcancel: {\n\t\t\t\t\ttype: \"cancel\",\n\t\t\t\t\tlabel: \"Cancel\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tcreateVerb: \"Link to section in book\",\n\t\t\tsizeConstraints: {\n\t\t\t\tminHeight: \"50vh\",\n\t\t\t\tminWidth: \"50vw\"\n\t\t\t}\n\t\t};\n\n\t\tthis.ui = _.extend(this.ui, BigModal.prototype.ui);\n\t\tthis.events = _.extend(this.events, BigModal.prototype.events);\n\n\t\tBigModal.prototype.initialize.call(this);\n\t},\n\n\tonBookClick: function onBookClick(e) {\n\t\tvar bookId = $(e.currentTarget).data(\"uid\");\n\t\tthis.model.set(\"selectedBookId\", bookId);\n\n\t\tthis.ui.book.removeClass(\"selected\");\n\t\t$(e.currentTarget).addClass(\"selected\");\n\t},\n\n\tshowError: function showError(error) {\n\t\tthis.ui.error.text(error);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJvb2tDaG9vc2VyTW9kYWwuanMiXSwibmFtZXMiOlsiJCIsInJlcXVpcmUiLCJfIiwiQmlnTW9kYWwiLCJtb2R1bGUiLCJleHBvcnRzIiwiZXh0ZW5kIiwidWkiLCJsaW5rQnRuIiwic2VsZWN0ZWRCb29rIiwiYm9vayIsImVycm9yIiwiZXZlbnRzIiwib25MaW5rQnRuQ2xpY2siLCJtb2RlbCIsImdldCIsInNob3dFcnJvciIsImNsb3NlIiwiaW5pdGlhbGl6ZSIsIm9wdGlvbnMiLCJiaW5kQWxsIiwic2V0IiwiYm9va3MiLCJPcHRpb25zIiwiY2xhc3NlcyIsInRlbXBsYXRlIiwiY29udGFpbmVyIiwiY3JlYXRlSWNvbiIsImJ1dHRvbnMiLCJjcmVhdGUiLCJ0eXBlIiwibGFiZWwiLCJtb2RlIiwidmFsaWRhdGUiLCJzYXZlIiwiY2FuY2VsIiwiY3JlYXRlVmVyYiIsInNpemVDb25zdHJhaW50cyIsIm1pbkhlaWdodCIsIm1pbldpZHRoIiwicHJvdG90eXBlIiwiY2FsbCIsIm9uQm9va0NsaWNrIiwiZSIsImJvb2tJZCIsImN1cnJlbnRUYXJnZXQiLCJkYXRhIiwicmVtb3ZlQ2xhc3MiLCJhZGRDbGFzcyIsInRleHQiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsSUFBSUQsUUFBUSxRQUFSLENBQVY7O0FBRUEsSUFBTUUsV0FBV0YsUUFBUSx1QkFBUixDQUFqQjs7QUFFQUcsT0FBT0MsT0FBUCxHQUFpQkYsU0FBU0csTUFBVCxDQUFnQjtBQUNoQ0MsS0FBSTtBQUNIQyxXQUFTLFNBRE47QUFFSEMsZ0JBQWMsZUFGWDtBQUdIQyxRQUFNLDJCQUhIO0FBSUhDLFNBQU87QUFKSixFQUQ0Qjs7QUFRaENDLFNBQVE7QUFDUCx1QkFBcUIsZ0JBRGQ7QUFFUCxvQkFBa0I7QUFGWCxFQVJ3Qjs7QUFhaENDLGlCQUFnQiwwQkFBVztBQUMxQixNQUFJLENBQUMsS0FBS0MsS0FBTCxDQUFXQyxHQUFYLENBQWUsZ0JBQWYsQ0FBTCxFQUNDLE9BQU8sS0FBS0MsU0FBTCxDQUFlLGdDQUFmLENBQVA7O0FBRUQsT0FBS0MsS0FBTCxDQUFXLFFBQVgsRUFBcUIsS0FBS0gsS0FBTCxDQUFXQyxHQUFYLENBQWUsZ0JBQWYsQ0FBckI7QUFDQSxTQUFPLEtBQUtELEtBQUwsQ0FBV0MsR0FBWCxDQUFlLGdCQUFmLENBQVA7QUFDQSxFQW5CK0I7O0FBcUJoQ0csYUFBWSxvQkFBU0MsT0FBVCxFQUFrQjtBQUM3QmpCLElBQUVrQixPQUFGLENBQVUsSUFBVjs7QUFFQSxPQUFLTixLQUFMLENBQVdPLEdBQVgsQ0FBZSxPQUFmLEVBQXdCRixRQUFRRyxLQUFoQzs7QUFFQSxPQUFLQyxPQUFMLEdBQWU7QUFDZEMsWUFBUyxDQUFDLG9CQUFELENBREs7QUFFZEMsYUFBVXhCLFFBQVEsK0NBQVIsRUFBeUR5QixTQUZyRDtBQUdkQyxlQUFZLFNBSEU7QUFJZEMsWUFBUztBQUNSQyxZQUFRO0FBQ1BDLFdBQU0sUUFEQztBQUVQQyxZQUFPLE1BRkE7QUFHUEMsV0FBTSxRQUhDO0FBSVBDLGVBQVUsS0FKSDtBQUtQQyxXQUFNO0FBTEMsS0FEQTtBQVFSQyxZQUFRO0FBQ1BMLFdBQU0sUUFEQztBQUVQQyxZQUFPO0FBRkE7QUFSQSxJQUpLO0FBaUJkSyxlQUFZLHlCQWpCRTtBQWtCZEMsb0JBQWlCO0FBQ2hCQyxlQUFXLE1BREs7QUFFaEJDLGNBQVU7QUFGTTtBQWxCSCxHQUFmOztBQXdCQSxPQUFLaEMsRUFBTCxHQUFVTCxFQUFFSSxNQUFGLENBQVMsS0FBS0MsRUFBZCxFQUFrQkosU0FBU3FDLFNBQVQsQ0FBbUJqQyxFQUFyQyxDQUFWO0FBQ0EsT0FBS0ssTUFBTCxHQUFjVixFQUFFSSxNQUFGLENBQVMsS0FBS00sTUFBZCxFQUFzQlQsU0FBU3FDLFNBQVQsQ0FBbUI1QixNQUF6QyxDQUFkOztBQUVBVCxXQUFTcUMsU0FBVCxDQUFtQnRCLFVBQW5CLENBQThCdUIsSUFBOUIsQ0FBbUMsSUFBbkM7QUFDQSxFQXREK0I7O0FBd0RoQ0MsY0FBYSxxQkFBU0MsQ0FBVCxFQUFZO0FBQ3hCLE1BQU1DLFNBQVM1QyxFQUFFMkMsRUFBRUUsYUFBSixFQUFtQkMsSUFBbkIsQ0FBd0IsS0FBeEIsQ0FBZjtBQUNBLE9BQUtoQyxLQUFMLENBQVdPLEdBQVgsQ0FBZSxnQkFBZixFQUFpQ3VCLE1BQWpDOztBQUVBLE9BQUtyQyxFQUFMLENBQVFHLElBQVIsQ0FBYXFDLFdBQWIsQ0FBeUIsVUFBekI7QUFDQS9DLElBQUUyQyxFQUFFRSxhQUFKLEVBQW1CRyxRQUFuQixDQUE0QixVQUE1QjtBQUNBLEVBOUQrQjs7QUFnRWhDaEMsWUFBVyxtQkFBU0wsS0FBVCxFQUFnQjtBQUMxQixPQUFLSixFQUFMLENBQVFJLEtBQVIsQ0FBY3NDLElBQWQsQ0FBbUJ0QyxLQUFuQjtBQUNBO0FBbEUrQixDQUFoQixDQUFqQiIsImZpbGUiOiJib29rQ2hvb3Nlck1vZGFsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuXG5jb25zdCBCaWdNb2RhbCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9saWIvYmlnTW9kYWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmlnTW9kYWwuZXh0ZW5kKHtcblx0dWk6IHtcblx0XHRsaW5rQnRuOiBcIi5jcmVhdGVcIixcblx0XHRzZWxlY3RlZEJvb2s6IFwiI3NlbGVjdGVkQm9va1wiLFxuXHRcdGJvb2s6IFwiI2Jvb2tTZWxlY3RvciAuYm9vay1jb3ZlclwiLFxuXHRcdGVycm9yOiBcIiNlcnJvclwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmxpbmtCdG5cIjogXCJvbkxpbmtCdG5DbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmJvb2tcIjogXCJvbkJvb2tDbGlja1wiLFxuXHR9LFxuXG5cdG9uTGlua0J0bkNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIXRoaXMubW9kZWwuZ2V0KFwic2VsZWN0ZWRCb29rSWRcIikpXG5cdFx0XHRyZXR1cm4gdGhpcy5zaG93RXJyb3IoXCJZb3UgbXVzdCBjaG9vc2UgYSBib29rIHRvIGxpbmtcIik7XG5cblx0XHR0aGlzLmNsb3NlKFwiY3JlYXRlXCIsIHRoaXMubW9kZWwuZ2V0KFwic2VsZWN0ZWRCb29rSWRcIikpO1xuXHRcdHJldHVybiB0aGlzLm1vZGVsLmdldChcInNlbGVjdGVkQm9va0lkXCIpO1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHRfLmJpbmRBbGwodGhpcyk7XG5cblx0XHR0aGlzLm1vZGVsLnNldChcImJvb2tzXCIsIG9wdGlvbnMuYm9va3MpO1xuXG5cdFx0dGhpcy5PcHRpb25zID0ge1xuXHRcdFx0Y2xhc3NlczogW1wiYm9vay1jaG9vc2VyLW1vZGFsXCJdLFxuXHRcdFx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvY29uc29sZS9ib29rQ2hvb3Nlck1vZGFsLm51bmpcIikuY29udGFpbmVyLFxuXHRcdFx0Y3JlYXRlSWNvbjogXCJmYS1saW5rXCIsXG5cdFx0XHRidXR0b25zOiB7XG5cdFx0XHRcdGNyZWF0ZToge1xuXHRcdFx0XHRcdHR5cGU6IFwiYWNjZXB0XCIsXG5cdFx0XHRcdFx0bGFiZWw6IFwiTGlua1wiLFxuXHRcdFx0XHRcdG1vZGU6IFwiY3JlYXRlXCIsXG5cdFx0XHRcdFx0dmFsaWRhdGU6IGZhbHNlLFxuXHRcdFx0XHRcdHNhdmU6IGZhbHNlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRjYW5jZWw6IHtcblx0XHRcdFx0XHR0eXBlOiBcImNhbmNlbFwiLFxuXHRcdFx0XHRcdGxhYmVsOiBcIkNhbmNlbFwiLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHRcdGNyZWF0ZVZlcmI6IFwiTGluayB0byBzZWN0aW9uIGluIGJvb2tcIixcblx0XHRcdHNpemVDb25zdHJhaW50czoge1xuXHRcdFx0XHRtaW5IZWlnaHQ6IFwiNTB2aFwiLFxuXHRcdFx0XHRtaW5XaWR0aDogXCI1MHZ3XCIsXG5cdFx0XHR9LFxuXHRcdH07XG5cblx0XHR0aGlzLnVpID0gXy5leHRlbmQodGhpcy51aSwgQmlnTW9kYWwucHJvdG90eXBlLnVpKTtcblx0XHR0aGlzLmV2ZW50cyA9IF8uZXh0ZW5kKHRoaXMuZXZlbnRzLCBCaWdNb2RhbC5wcm90b3R5cGUuZXZlbnRzKTtcblxuXHRcdEJpZ01vZGFsLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyk7XG5cdH0sXG5cblx0b25Cb29rQ2xpY2s6IGZ1bmN0aW9uKGUpIHtcblx0XHRjb25zdCBib29rSWQgPSAkKGUuY3VycmVudFRhcmdldCkuZGF0YShcInVpZFwiKTtcblx0XHR0aGlzLm1vZGVsLnNldChcInNlbGVjdGVkQm9va0lkXCIsIGJvb2tJZCk7XG5cblx0XHR0aGlzLnVpLmJvb2sucmVtb3ZlQ2xhc3MoXCJzZWxlY3RlZFwiKTtcblx0XHQkKGUuY3VycmVudFRhcmdldCkuYWRkQ2xhc3MoXCJzZWxlY3RlZFwiKTtcblx0fSxcblxuXHRzaG93RXJyb3I6IGZ1bmN0aW9uKGVycm9yKSB7XG5cdFx0dGhpcy51aS5lcnJvci50ZXh0KGVycm9yKTtcblx0fSxcbn0pOyJdfQ==",
    "\"use strict\";\n\nvar _regenerator = require(\"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _radioEvents;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\nvar Promise = require(\"bluebird\");\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\nvar raygun = require(\"raygun\");\nvar rester = require(\"rester\");\nvar Slideout = require(\"slideout\");\nvar tippy = require(\"tippy.js\").default;\nvar linkService = require(\"linkService\");\n\nvar App = require(\"../../../index\");\nvar settings = require(\"app-settings\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar AttachmentRecoveryModal = require(\"./attachmentRecoveryModal\");\nvar EpubNavigationSidebar = require(\"./epubNavigation\");\nvar FlashCardWidget = require(\"../../../content/views/flashCards/cardWidget\");\nvar LightBox = require(\"../../../lib/lightBox\");\nvar GroupModal = require(\"./groupModal\");\nvar PdfNavigationSidebar = require(\"./pdfNavigation\");\nvar Resource = require(\"../../../content/models/manager/resourceModel\");\nvar SmallModal = require(\"../../../lib/smallModal\");\nvar BulkDragDropHelper = require(\"../../../lib/bulkDragDropHelper\");\nvar BulkResourceUploadModal = require(\"../../../lib/bulkResourceUploadModal\");\nvar AssessmentPrompt = require(\"../../../lib/assessmentPrompt\");\nvar ResourceOpenedModal = require(\"./resourceOpenedModal\");\nvar Assessment = require(\"../../../lib/assessmentModel\");\nvar AssessmentModal = require(\"../../../lib/assessmentModal\");\nvar FlashcardPreview = require(\"../../../lib/flashcardPreview\");\n\nvar eventBus = require(\"./eventBus\");\n\nvar attachmentsSaving = 0;\n\n// ----------------------------------------------------------------------------\n// Mixins\n// ----------------------------------------------------------------------------\nvar SlideoutMixin = {\n\tconfigureUI: function configureUI() {\n\t\tif (!this.ui.close.removeClass || !$(\"#content-region\").get(0)) return;\n\n\t\tthis.ui.close.removeClass(\"hide\");\n\n\t\tthis.Slideout = new Slideout({\n\t\t\tpanel: $(\"#content-region\").get(0),\n\t\t\tmenu: this.$el.get(0),\n\t\t\tpadding: 510,\n\t\t\ttolerance: 20\n\t\t});\n\n\t\tthis.Slideout.close();\n\t},\n\n\tshow: function show() {\n\t\tthis.Slideout.open();\n\t},\n\n\thide: function hide() {\n\t\tthis.Slideout.close();\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.Slideout.close();\n\t},\n\n\tclose: function close() {\n\t\tthis.Slideout.close();\n\t}\n};\n\nvar EpubMixin = {\n\tonBookLoad: function onBookLoad() {\n\t\tthis.contentWindow = $(\"#book-display\").get(0).contentWindow;\n\n\t\t//$(window).on(\"click\", this.onWindowClick.bind(this));\n\t\t//$(this.contentWindow).on(\"click\", this.onWindowClick.bind(this));\n\t\t$(this.contentWindow).on(\"mousedown\", this.onMouseDown.bind(this));\n\t\t$(this.contentWindow).on(\"mousemove\", this.onMouseMove.bind(this));\n\t\t//$(this.contentWindow).on(\"mouseup\", this.onMouseUp.bind(this));\n\t},\n\n\tonMouseDown: function onMouseDown() {\n\t\tthis.highlightReplay = [];\n\t\tthis.highlighting = true;\n\t},\n\n\tonMouseMove: function onMouseMove(event) {\n\t\tif (this.highlighting) {\n\t\t\tthis.highlightReplay.push({\n\t\t\t\tx: event.clientX,\n\t\t\t\ty: event.clientY\n\t\t\t});\n\t\t}\n\t},\n\n\tonMouseUp: function onMouseUp() {\n\t\tthis.highlighting = false;\n\n\t\tvar selection = this.contentWindow.getSelection();\n\n\t\tif (selection.toString().length > 0) this.showHighlightToolbar(selection);\n\t},\n\n\tonWindowClick: function onWindowClick() {\n\t\tvar selection = this.contentWindow.getSelection();\n\n\t\tif (selection.toString().length === 0) this.highlightToolbar.hide();\n\t},\n\n\tonBookBeforeDestroy: function onBookBeforeDestroy() {\n\t\t$(this.contentWindow).off(\"click\");\n\t\t$(this.contentWindow).off(\"mouseup\");\n\t\tthis.stopListening(this.highlightToolbar);\n\t\t$(window).off(\"click\");\n\t},\n\n\tloadSection: function loadSection() {\n\t\tif (!this.ui.book.get) return;\n\n\t\t// Ignore offset changes while we load a new page\n\t\tthis.stopListening(this.navigator, \"change:offset\");\n\n\t\teventBus.trigger(eventBus.Events.LoadStart, \"mpub\");\n\t\tthis.loaded = false;\n\n\t\tvar url = this.navigator.get(\"url\");\n\t\turl = url.replace(/\\[up\\]/g, \"../\").replace(/\\[current\\]/g, \"./\");\n\n\t\tif (_.includes(window.location.search, \"mimeoverride=1\")) url += \"?mimeoverride=1\";\n\t\tthis.ui.book.get(0).src = url;\n\t},\n\n\tloadSectionOffset: function loadSectionOffset() {\n\t\tif (!this.ui.book.get(0).contentWindow) return;\n\n\t\tvar offset = this.navigator.get(\"offset\") || 0;\n\t\tif (offset) this.ui.book.get(0).contentWindow.scrollTo(0, offset);\n\t},\n\n\tmapSelector: function mapSelector(selector) {\n\t\treturn selector;\n\t},\n\n\tgetAttachmentAtSelector: function getAttachmentAtSelector(selector) {\n\t\treturn this.AttachmentViews[selector];\n\t},\n\n\tjumpToAttachment: function jumpToAttachment(attachment) {\n\t\tvar _this = this;\n\n\t\tvar scrollToAttachment = function scrollToAttachment() {\n\t\t\tvar element = $(_this.resolveDOMSelector(attachment.get(\"selector\")));\n\t\t\tif (element.length === 0) return;\n\n\t\t\tif ((_this.ui.book.get(0).contentWindow.scrollY || _this.ui.book.get(0).contentWindow.pageYOffset) === ~~element.offset().top) {\n\t\t\t\tattachment.trigger(\"focus\");\n\t\t\t} else {\n\t\t\t\tvar jumpListener = function jumpListener() {\n\t\t\t\t\t_this.scrollAttachmentContainer();\n\t\t\t\t\tattachment.trigger(\"focus\");\n\t\t\t\t\t_this.ui.book.get(0).contentWindow.removeEventListener(\"scroll\", jumpListener);\n\t\t\t\t\t_this.ui.book.get(0).contentWindow.addEventListener(\"scroll\", _.throttle(_this.onScroll.bind(_this), 10));\n\t\t\t\t};\n\n\t\t\t\t_this.ui.book.get(0).contentWindow.addEventListener(\"scroll\", jumpListener);\n\n\t\t\t\t// Scroll the book iframe and the attachment container\n\t\t\t\t_this.ui.book.get(0).contentWindow.scrollTo(0, element.offset().top);\n\t\t\t}\n\t\t};\n\n\t\tif (this.getCurrentSection().toString() === attachment.get(\"section\").toString()) {\n\t\t\tscrollToAttachment();\n\t\t} else {\n\t\t\t// Load the attachment's section\n\t\t\tthis.ui.book.load(function () {\n\t\t\t\tif (!_this.ui.book.load) return;\n\n\t\t\t\t// Invoke the original event handler\n\t\t\t\t_this.onLoad();\n\n\t\t\t\tscrollToAttachment();\n\n\t\t\t\t// Replace this event handler with the original\n\t\t\t\t_this.ui.book.load(_this.onLoad.bind(_this));\n\t\t\t});\n\n\t\t\tthis.navigator.navigateToSection(attachment.get(\"section\"));\n\t\t}\n\t},\n\n\tscrollAttachmentContainer: function scrollAttachmentContainer() {\n\t\tif ((this.ui.book.get(0).contentWindow.scrollY || this.ui.book.get(0).contentWindow.pageYOffset) === parseInt(this.ui.attachmentContainer.get(0).top, 10) * -1) return;\n\n\t\tthis.ui.attachmentContainer.css({\n\t\t\ttop: (this.ui.book.get(0).contentWindow.scrollY || this.ui.book.get(0).contentWindow.pageYOffset) * -1 + \"px\"\n\t\t});\n\n\t\teventBus.trigger(\"attachments:scroll\");\n\t},\n\n\tonScroll: function onScroll() {\n\t\tif (!this.navigator) return;\n\n\t\tif (this.getCurrentSection(true, true)) this.navigator.synchronize(this.getCurrentSection(true, true), this.ui.book.get(0).contentWindow.scrollY || this.ui.book.get(0).contentWindow.pageYOffset);\n\n\t\tthis.scrollAttachmentContainer();\n\t\tthis.pollNavigatePrevious();\n\t\tthis.pollNavigateNext();\n\t},\n\n\tpollNavigatePrevious: function pollNavigatePrevious() {\n\t\tif (this.navigator.pollNavigatePrevious() && (this.ui.book.get(0).contentWindow.scrollY || this.ui.book.get(0).contentWindow.pageYOffset) <= this.height * 2) this.ui.navPrevious.removeClass(\"hide\");else this.ui.navPrevious.addClass(\"hide\");\n\t},\n\n\tpollNavigateNext: function pollNavigateNext() {\n\t\tif (this.navigator.pollNavigateNext() && (this.ui.book.get(0).contentWindow.scrollY || this.ui.book.get(0).contentWindow.pageYOffset) >= this.contentHeight - this.height * 2) this.ui.navNext.removeClass(\"hide\");else this.ui.navNext.addClass(\"hide\");\n\t},\n\n\tresizeAttachmentContainer: function resizeAttachmentContainer() {\n\t\tif (!this.ui.book.get(0).contentWindow.document.body) return;\n\n\t\t// Set the height of the attachment container to that of the currently loaded book section in the iframe\n\t\tthis.ui.attachmentContainer.css({\n\t\t\theight: this.ui.book.get(0).contentWindow.document.body.offsetHeight + \"px\"\n\t\t});\n\t},\n\n\tgetCurrentSection: function getCurrentSection(withAnchor) {\n\t\t//\t\tlet components = this.ui.book.get(0).contentWindow.location.href;\n\t\tvar components = /*queryEmbedded ? this.ui.book.get(0).contentWindow.location.href : */this.navigator.get(\"url\");\n\n\t\tif (_.startsWith(components, \"about:\")) return false;\n\n\t\tif (!withAnchor) components = components.split(\"#\")[0];\n\n\t\tcomponents = components.split(\"acacia/epub/files/\")[1];\n\n\t\tif (!components) throw new Error(\"Error parsing page path: \" + this.navigator.get(\"url\"));\n\n\t\tcomponents = components.split(\"/\");\n\n\t\treturn _.drop(components, 3).join(\"/\").replace(this.metadata.get(\"basePath\") + \"/\", \"\");\n\t},\n\n\tgetBookElementAt: function getBookElementAt(x, y) {\n\t\tvar ret = this.ui.book.get(0).contentWindow.document.elementFromPoint(Math.round(x - this.OverlayBase.left), Math.floor(y - this.OverlayBase.top));\n\t\treturn ret;\n\t},\n\n\tbuildDOMSelector: function buildDOMSelector(el) {\n\t\tif (!el) return \"\";\n\n\t\tvar element = el;\n\n\t\tvar selector = [];\n\n\t\twhile (element.parentNode && element.parentNode.nodeName.toLowerCase() !== \"html\") {\n\t\t\tselector.unshift(element.nodeName.toLowerCase().replace(/:/g, \"\\\\:\") + \":nth-child(\" + ($(element).index() + 1) + \")\");\n\n\t\t\telement = element.parentNode;\n\t\t}\n\n\t\tselector.unshift(\"body\");\n\n\t\treturn selector.join(\" > \");\n\t},\n\n\tresolveDOMSelector: function resolveDOMSelector(selector) {\n\t\tif (!this.ui.book.get) return \"\";\n\n\t\ttry {\n\t\t\treturn $(selector, this.ui.book.get(0).contentWindow.document);\n\t\t} catch (e) {\n\t\t\tif (!settings.debug || settings.reportErrors) raygun(\"send\", e);\n\t\t\treturn \"\";\n\t\t}\n\t},\n\n\trestorePreviousElementBorder: function restorePreviousElementBorder() {\n\t\tif (this.previousElement) {\n\t\t\t$(this.previousElement).css({\n\t\t\t\tborder: this.previousElementBorder.style\n\t\t\t});\n\n\t\t\tthis.previousElement = undefined;\n\t\t}\n\t},\n\n\trecordElementBorder: function recordElementBorder(element) {\n\t\tthis.previousElementBorder = {\n\t\t\tstyle: $(element).css(\"border\")\n\t\t};\n\n\t\tthis.previousElement = element;\n\t},\n\n\tsetElementBorder: function setElementBorder(element) {\n\t\t$(element).css({\n\t\t\tborder: \"2px dotted #000\"\n\t\t});\n\t}\n};\n\nvar PdfMixin = {\n\tonBookShow: function onBookShow() {\n\t\t$(\"div#canvas-display\").append(\"<div class=\\\"pdf-links-layer\\\"></div>\");\n\t\tthis.ui.pdfLinksLayer = $(\"div.pdf-links-layer\", \"div#canvas-display\");\n\t\tthis.ui.pdfLinksLayer.css({\n\t\t\t//top: this.ui.canvas.position().top + \"px\",\n\t\t\t//left: this.ui.canvas.position().left + \"px\",\n\t\t});\n\t},\n\n\tonBookBeforeDestroy: function onBookBeforeDestroy() {\n\t\t$(window).off(\"click\");\n\t},\n\n\tloadSection: function loadSection() {\n\t\tvar _this2 = this;\n\n\t\tvar loadCurrentPage = function loadCurrentPage() {\n\t\t\t// Destroy the PDF document if the book container element was destroyed\n\t\t\tif (!$(_this2.ui.book).length) return _this2.pdfDocument.destroy();\n\n\t\t\tvar pageNumber = _this2.navigator.get(\"url\");\n\n\t\t\tif (pageNumber < 1 || pageNumber > _this2.pdfDocument.numPages) {\n\t\t\t\tpageNumber = 1;\n\t\t\t\t_this2.navigator.synchronize(1, 0);\n\t\t\t}\n\n\t\t\t_this2.currentPage = pageNumber;\n\n\t\t\treturn _this2.pdfDocument.getPage(pageNumber).then(function () {\n\t\t\t\tvar _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee(pdfPage) {\n\t\t\t\t\tvar zoom, desiredWidth, scale, scaledViewport, canvas, ratio, renderContext, canvasElement, annotationsData;\n\t\t\t\t\treturn _regenerator2.default.wrap(function _callee$(_context) {\n\t\t\t\t\t\twhile (1) {\n\t\t\t\t\t\t\tswitch (_context.prev = _context.next) {\n\t\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\t\tif (_this2.ui.canvas.width) {\n\t\t\t\t\t\t\t\t\t\t_context.next = 2;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturn _context.abrupt(\"return\");\n\n\t\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\t\tzoom = _this2.zoom || 1;\n\n\n\t\t\t\t\t\t\t\t\tif (!_this2.cachedCanvasWidth) _this2.cachedCanvasWidth = _this2.ui.canvas.width();\n\n\t\t\t\t\t\t\t\t\tdesiredWidth = _this2.cachedCanvasWidth * zoom;\n\t\t\t\t\t\t\t\t\tscale = desiredWidth / pdfPage.getViewport(1).width;\n\t\t\t\t\t\t\t\t\tscaledViewport = pdfPage.getViewport(scale);\n\t\t\t\t\t\t\t\t\tcanvas = _this2.ui.canvas.get(0);\n\t\t\t\t\t\t\t\t\tratio = scaledViewport.height / scaledViewport.width;\n\t\t\t\t\t\t\t\t\trenderContext = {\n\t\t\t\t\t\t\t\t\t\tcanvasContext: canvas.getContext(\"2d\"),\n\t\t\t\t\t\t\t\t\t\tviewport: scaledViewport\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\t\t// Scale the canvas that will display the PDF page\n\n\t\t\t\t\t\t\t\t\t_this2.ui.canvas.css({ height: scaledViewport.width * ratio });\n\t\t\t\t\t\t\t\t\t$(\"#canvas-display\").css({ height: scaledViewport.width * ratio });\n\n\t\t\t\t\t\t\t\t\tcanvasElement = _this2.ui.canvas.get(0);\n\n\t\t\t\t\t\t\t\t\tcanvasElement.height = scaledViewport.width * ratio;\n\t\t\t\t\t\t\t\t\tcanvasElement.width = scaledViewport.width;\n\n\t\t\t\t\t\t\t\t\t_this2.canvasWidth = scaledViewport.width;\n\t\t\t\t\t\t\t\t\t_this2.canvasHeight = scaledViewport.width * ratio;\n\n\t\t\t\t\t\t\t\t\t_this2.ui.canvas.css(\"width\", _this2.cachedCanvasWidth * zoom);\n\n\t\t\t\t\t\t\t\t\t_context.next = 20;\n\t\t\t\t\t\t\t\t\treturn pdfPage.render(renderContext);\n\n\t\t\t\t\t\t\t\tcase 20:\n\n\t\t\t\t\t\t\t\t\t_this2.pdfScale = scaledViewport.scale;\n\n\t\t\t\t\t\t\t\t\t$(_this2.ui.pdfLinksLayer).css({\n\t\t\t\t\t\t\t\t\t\theight: _this2.canvasHeight + \"px\",\n\t\t\t\t\t\t\t\t\t\twidth: _this2.canvasWidth + \"px\"\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\twindow.pdfjsLib.externalLinkTarget = window.pdfjsLib.LinkTarget.BLANK;\n\n\t\t\t\t\t\t\t\t\t_context.next = 25;\n\t\t\t\t\t\t\t\t\treturn pdfPage.getAnnotations();\n\n\t\t\t\t\t\t\t\tcase 25:\n\t\t\t\t\t\t\t\t\tannotationsData = _context.sent;\n\t\t\t\t\t\t\t\t\t_context.next = 28;\n\t\t\t\t\t\t\t\t\treturn window.pdfjsLib.AnnotationLayer.render({\n\t\t\t\t\t\t\t\t\t\tdiv: _this2.ui.pdfLinksLayer.get(0),\n\t\t\t\t\t\t\t\t\t\tannotations: annotationsData,\n\t\t\t\t\t\t\t\t\t\tpage: pdfPage,\n\t\t\t\t\t\t\t\t\t\tviewport: scaledViewport.clone({ dontFlip: true }),\n\t\t\t\t\t\t\t\t\t\tlinkService: new linkService.SimpleLinkService()\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tcase 28:\n\t\t\t\t\t\t\t\t\treturn _context.abrupt(\"return\", _this2.trigger(\"pdf:load\"));\n\n\t\t\t\t\t\t\t\tcase 29:\n\t\t\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\t\t\treturn _context.stop();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}, _callee, _this2);\n\t\t\t\t}));\n\n\t\t\t\treturn function (_x) {\n\t\t\t\t\treturn _ref.apply(this, arguments);\n\t\t\t\t};\n\t\t\t}());\n\t\t};\n\n\t\t// Signal that the PDF is loading\n\t\teventBus.trigger(eventBus.Events.LoadStart, \"mpdf\");\n\t\tthis.loaded = false;\n\n\t\t// Obtain the currently selected book\n\t\tvar book = eventBus.request(eventBus.Events.GetCurrentBook);\n\n\t\tif (!book || !book.get(\"id\")) return;\n\n\t\tif (this.pdfDocument) return loadCurrentPage();\n\n\t\t// Load the PDF document\n\t\tvar prom = window.pdfjsLib.getDocument({\n\t\t\turl: settings.urlRoot + \"/acacia/pdf/\" + book.get(\"id\"),\n\t\t\tdisableAutoFetch: true,\n\t\t\tdisableStream: true\n\t\t});\n\n\t\tprom.onPassword = function (cb) {\n\t\t\tvar ret = \"\";\n\t\t\tvar id = book.get(\"metadata\").bookID.replace(/\\-/g, \"\").slice(-32);\n\t\t\tvar token = _this2.metadata.get(\"token\");\n\n\t\t\tfor (var i = 0; i < token.length; i++) {\n\t\t\t\tret += (parseInt(id[i], 16) ^ parseInt(token[i], 16)).toString(\"16\");\n\t\t\t}cb(ret);\n\t\t};\n\n\t\tprom.then(function (pdfDocument) {\n\t\t\t// Destroy the PDF document if the book container element was destroyed while the PDF document was loading\n\t\t\tif (!$(_this2.ui.book).length) {\n\t\t\t\tif (pdfDocument) pdfDocument.destroy();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Verify that the PDF document's token matches the token for this book\n\t\t\treturn Promise.all([Promise.resolve(pdfDocument), pdfDocument.getMetadata()]);\n\t\t}).then(function (arr) {\n\t\t\tif (!arr || !arr[1] || !arr[0]) return;\n\n\t\t\tif (arr[1].info.Producer !== _this2.metadata.get(\"token\")) throw new Error(\"Cannot open PDF\");\n\n\t\t\t_this2.pdfDocument = arr[0];\n\n\t\t\treturn loadCurrentPage();\n\t\t}).catch(function (err) {\n\t\t\tif (_.includes(err.message, \"Rendering cancelled\")) return;\n\n\t\t\tif (!settings.debug || settings.reportErrors) raygun(\"send\", err);\n\t\t});\n\t},\n\n\tloadSectionOffset: function loadSectionOffset() {\n\t\tvar offset = this.navigator.get(\"offset\") || 0;\n\t\t//if(offset)\n\t\tthis.ui.book.get(0).scrollTop = offset;\n\t},\n\n\tmapSelector: function mapSelector(selector) {\n\t\tvar newSelector = (parseFloat(selector) * this.contentHeight * 0.01).toFixed(2);\n\t\treturn this.getRealSelectorOffset(newSelector);\n\t},\n\n\tgetRealSelectorOffset: function getRealSelectorOffset(selector) {\n\t\tvar offset = this.invisibleGridOffset;\n\t\tif (!offset) return null;\n\n\t\t// Find the deviance from the base grid offset\n\t\tvar diff = selector - offset;\n\t\t// Work out how many steps away it is\n\t\tvar steps = Math.floor(Math.abs(diff / 32));\n\n\t\t// Add that many steps to the base offset, in the correct direction, and bob's your legal guardian\n\t\treturn (parseInt(offset, 10) + (diff < 0 ? steps * -32 : steps * 32)).toString();\n\t},\n\n\tgetAttachmentAtSelector: function getAttachmentAtSelector(selector) {\n\t\tif (!this.invisibleGridOffset) return null;\n\t\t// PDFs have an invisible grid, established by the very first attachment to be placed.\n\t\t// All subsequent attachment positions need to be normalised to this grid to find overlaps.\n\t\t// If an attachment is within 32px of another (above or below), it is considered an overlap.\n\n\t\t// Convert the selector to pixels\n\t\tvar newSelector = (parseFloat(selector) * this.contentHeight * 0.01).toFixed(2);\n\n\t\t// How far from an origin is it?\n\t\tvar mod = (newSelector - this.invisibleGridOffset) % 32;\n\n\t\t// If we're right on top, will never need to test for another\n\t\tif (mod === 0) {\n\t\t\tvar _closer = this.AttachmentViews[this.getRealSelectorOffset(newSelector)];\n\t\t\tvar below = this.AttachmentViews[this.getRealSelectorOffset(newSelector - 32)];\n\t\t\tvar above = this.AttachmentViews[this.getRealSelectorOffset(newSelector + 32)];\n\n\t\t\treturn _closer || below || above;\n\t\t}\n\n\t\t// So we need to test for two possible overlaps, and return either the one that's closer, or the other (one that exists)\n\t\tvar closer = void 0,\n\t\t    other = void 0;\n\t\tif (mod < 0) {\n\t\t\tif (Math.abs(mod) < 16) {\n\t\t\t\tcloser = this.AttachmentViews[this.getRealSelectorOffset(newSelector - 32)];\n\t\t\t\tother = this.AttachmentViews[this.getRealSelectorOffset(newSelector)];\n\t\t\t} else {\n\t\t\t\tcloser = this.AttachmentViews[this.getRealSelectorOffset(newSelector)];\n\t\t\t\tother = this.AttachmentViews[this.getRealSelectorOffset(newSelector - 32)];\n\t\t\t}\n\t\t} else if (Math.abs(mod) < 16) {\n\t\t\tcloser = this.AttachmentViews[this.getRealSelectorOffset(newSelector)];\n\t\t\tother = this.AttachmentViews[this.getRealSelectorOffset(newSelector + 32)];\n\t\t} else {\n\t\t\tcloser = this.AttachmentViews[this.getRealSelectorOffset(newSelector + 32)];\n\t\t\tother = this.AttachmentViews[this.getRealSelectorOffset(newSelector)];\n\t\t}\n\n\t\treturn closer || other;\n\t},\n\n\tjumpToAttachment: function jumpToAttachment(attachment) {\n\t\tvar _this3 = this;\n\n\t\tvar scrollToAttachment = function scrollToAttachment() {\n\t\t\tvar element = attachment.get(\"selector\");\n\n\t\t\tif (_this3.ui.book.get(0).scrollTop === Math.ceil(_this3.contentHeight * parseFloat(element) * 0.01)) {\n\t\t\t\tattachment.trigger(\"focus\");\n\t\t\t} else {\n\t\t\t\t_this3.ui.book.get(0).addEventListener(\"scroll\", function () {\n\t\t\t\t\t_this3.scrollAttachmentContainer();\n\t\t\t\t\tattachment.trigger(\"focus\");\n\t\t\t\t\t_this3.ui.book.get(0).addEventListener(\"scroll\", _.throttle(_this3.onScroll.bind(_this3), 10));\n\t\t\t\t});\n\n\t\t\t\t// Scroll the book iframe and the attachment container\n\t\t\t\tif (_this3.ui.book.get(0) && _this3.ui.book.get(0).scrollTo) _this3.ui.book.get(0).scrollTo(0, Math.ceil(_this3.contentHeight * parseFloat(element) * 0.01));else console.warn(\"Book object does not exist, aborting scroll\");\n\t\t\t}\n\t\t};\n\n\t\tif (this.getCurrentSection().toString() === attachment.get(\"section\").toString()) {\n\t\t\tscrollToAttachment();\n\t\t} else {\n\t\t\t// Load the attachment's section\n\t\t\tthis.stopListening(this, \"pdf:load\");\n\t\t\tthis.listenTo(this, \"pdf:load\", function () {\n\t\t\t\t_this3.onLoad();\n\n\t\t\t\tscrollToAttachment();\n\n\t\t\t\t// Replace this event handler with the original\n\t\t\t\t_this3.listenTo(_this3, \"pdf:load\", _this3.onLoad.bind(_this3));\n\t\t\t});\n\n\t\t\tthis.navigator.navigateToSection(attachment.get(\"section\"));\n\t\t}\n\t},\n\n\tscrollAttachmentContainer: function scrollAttachmentContainer() {\n\t\t// If we didn't really scroll, do nothing\n\t\tif (this.ui.book.get(0).scrollTop === parseInt(this.ui.attachmentContainer.get(0).style.top, 10) * -1) return;\n\n\t\tthis.ui.attachmentContainer.css({\n\t\t\ttop: this.ui.book.get(0).scrollTop * -1 + \"px\"\n\t\t});\n\n\t\teventBus.trigger(\"attachments:scroll\");\n\t},\n\n\tonScroll: function onScroll() {\n\t\tif (!this.navigator) return;\n\n\t\tthis.navigator.synchronize(this.getCurrentSection(true), this.ui.book.get(0).scrollTop);\n\n\t\tthis.scrollAttachmentContainer();\n\t\tthis.pollNavigatePrevious();\n\t\tthis.pollNavigateNext();\n\t},\n\n\tpollNavigatePrevious: function pollNavigatePrevious() {\n\t\tif (this.navigator.pollNavigatePrevious() && this.ui.book.get(0).scrollTop <= this.height * 2) this.ui.navPrevious.removeClass(\"hide\");else this.ui.navPrevious.addClass(\"hide\");\n\t},\n\n\tpollNavigateNext: function pollNavigateNext() {\n\t\tif (this.navigator.pollNavigateNext() && this.ui.book.get(0).scrollTop >= this.contentHeight - this.height * 2) this.ui.navNext.removeClass(\"hide\");else this.ui.navNext.addClass(\"hide\");\n\t},\n\n\tresizeAttachmentContainer: function resizeAttachmentContainer() {\n\t\t// Set the height of the attachment container to that of the currently loaded book section in the iframe\n\t\tthis.ui.attachmentContainer.css({\n\t\t\theight: this.ui.book.get(0).scrollHeight + \"px\"\n\t\t});\n\t},\n\n\tgetCurrentSection: function getCurrentSection() {\n\t\treturn this.navigator.get(\"url\");\n\t}\n};\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"book-view\",\n\n\tgetTemplate: function getTemplate() {\n\t\tvar book = eventBus.request(eventBus.Events.GetCurrentBook);\n\n\t\treturn require(\"../../templates/console/book-view.nunj\")[book.get(\"format\")];\n\t},\n\n\tui: {\n\t\tbook: \"#book-display, #canvas-display\",\n\t\tbookDisplay: \".book-display-container\",\n\t\tcanvas: \"canvas\",\n\t\toverlay: \"#book-overlay\",\n\t\tdropOverlay: \".drop-overlay\",\n\t\tgroupNotify: \"#book-overlay .notifications .groups\",\n\t\tspinner: \"div.infoBlock\",\n\t\tnavPrevious: \"div.paging-button.up\",\n\t\tnavNext: \"div.paging-button.down\",\n\t\tattachmentContainer: \"#attachment-container\",\n\t\tattachmentDeleter: \"div.attachment-bin\",\n\t\thint: \"div.hint\",\n\t\thighlightBar: \"div.highlight-bar\",\n\t\tcancelDrop: \"div.cancel-drop\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.navPrevious\": \"onNavPreviousClick\",\n\t\t\"click @ui.navNext\": \"onNavNextClick\",\n\t\t\"click @ui.groupNotify\": \"onGroupNotifyClick\",\n\n\t\t\"mouseenter @ui.attachmentDeleter\": \"onAttachmentDeleterMouseEnter\",\n\t\t\"mouseover @ui.attachmentDeleter\": \"onAttachmentDeleterMouseOver\",\n\t\t\"mouseleave @ui.attachmentDeleter\": \"onAttachmentDeleterMouseLeave\",\n\n\t\t\"drop @ui.book\": \"onFileDrop\",\n\t\t\"dragover @ui.book\": \"onFileDragOver\",\n\t\t\"dragenter @ui.book\": \"onFileDragEnter\",\n\t\t\"dragleave @ui.book\": \"onFileDragLeave\",\n\t\t\"drop @ui.bookDisplay\": \"onFileDrop\",\n\t\t\"dragover @ui.bookDisplay\": \"onFileDragOver\",\n\t\t\"dragenter @ui.bookDisplay\": \"onFileDragEnter\",\n\t\t\"dragleave @ui.bookDisplay\": \"onFileDragLeave\",\n\t\t\"mouseenter @ui.bookDisplay\": \"onMouseEnter\",\n\t\t\"mouseleave @ui.bookDisplay\": \"onMouseLeave\",\n\t\t\"drop @ui.cancelDrop\": \"onCancelFileDrop\"\n\t},\n\n\tattachmentEvents: {\n\t\t\"attachment:first\": \"findFirstAttachment\",\n\t\t\"attachment:next\": \"findNextAttachment\",\n\t\t\"attachment:previous\": \"findPreviousAttachment\",\n\t\t\"attachment:clear\": \"clearAttachmentFocus\",\n\t\t\"attachment:rejuvenate\": \"queryRejuvenateAttachment\",\n\t\t\"attachment:tooltip\": \"recordCurrentTooltip\",\n\t\t\"attachment:mouseover\": \"highlightAttachmentElement\",\n\t\t\"attachment:mouseout\": \"lowlightAttachmentElement\",\n\t\t\"attachment:deleted\": \"onAttachmentDeleted\"\n\t},\n\n\tradioEvents: (_radioEvents = {}, _defineProperty(_radioEvents, App.Events.WebsocketConnected, \"wsConnected\"), _defineProperty(_radioEvents, App.Events.WebsocketDisconnected, \"wsDisconnected\"), _radioEvents),\n\n\ttemplateContext: function templateContext() {\n\t\tvar hints = [\"You can create a bookmark directly to any page in a book. Just navigate to it and add a new bookmark in your browser.\", \"As long as you use the same computer, the Educator Console will remember where you last were in a book, and will take you back there when you next open it.\", \"You can filter content by more than just name. Click the <span class='fal fa-tasks'/> Filter button in the content pane and choose from many other options.\", \"You can put the Educator Console into full-screen mode - great for presenting on a projector.\\n\\t\\t\\t\\tJust click the <span class='fal fa-expand-alt'/> fullscreen mode icon in the top right corner.\", \"If you used this book in the previous year, you can reuse the content you attached then.\\n\\t\\t\\t\\tJust look for an attachment with a <span class='fal fa-bolt'/> icon, open it, and click on the message at the top.\", \"Can't remember what an attachment was for? Just click on it to see a preview of the resource and a list of the main information.\", \"You can change the groups for a single attachment by clicking on it and choosing the <span class='fal fa-users-class'/> Groups icon\"];\n\t\treturn {\n\t\t\thint: function hint() {\n\t\t\t\treturn hints[_.random(hints.length - 1)];\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.startLocation = options.location;\n\t\tthis.startHash = options.hash;\n\t\tthis.attachmentsFetched = false;\n\t\tthis.loaded = false;\n\t\tthis.uploadAllowed = true;\n\n\t\tthis.listenTo(eventBus, eventBus.Events.GroupsChanged, this.groupsChanged.bind(this));\n\t\tthis.listenTo(eventBus, eventBus.Events.AttachmentRemoved, this.onAttachmentDeleted.bind(this));\n\n\t\tvar book = eventBus.request(eventBus.Events.GetCurrentBook);\n\n\t\tthis.format = book.get(\"format\");\n\n\t\tthis.zoom = 1.0;\n\n\t\tif (this.format === \"mpub\") _.extend(this, EpubMixin);else _.extend(this, PdfMixin);\n\n\t\tthis.listenTo(eventBus, eventBus.Events.StartFullscreen, this.toggleFullscreen.bind(this, true));\n\t\tthis.listenTo(eventBus, eventBus.Events.EndFullscreen, this.toggleFullscreen.bind(this, false));\n\n\t\tthis.listenTo(eventBus, eventBus.Events.HideFlashCardWidget, this.hideFlashCardWidget.bind(this));\n\t\tthis.listenTo(eventBus, eventBus.Events.ShowFlashCardWidget, this.showFlashCardWidget.bind(this));\n\t\tthis.listenTo(eventBus, eventBus.Events.QueryRejuvenateAttachments, this.queryRejuvenateAttachments.bind(this));\n\n\t\tthis.listenTo(eventBus, eventBus.Events.DisableResourceDragging, this.disableResourceButton.bind(this));\n\t\tthis.listenTo(eventBus, eventBus.Events.EnableResourceDragging, this.enableResourceButton.bind(this));\n\n\t\tthis.bindEvents(radio, this.radioEvents);\n\n\t\tthis.sectionLoader = _.debounce(this.loadSection.bind(this), 50);\n\n\t\tthis.xhr = {};\n\t\tattachmentsSaving = 0;\n\t\tthis.saveQueue = [];\n\t},\n\n\ttoggleFullscreen: function toggleFullscreen(on) {\n\t\tthis.fullscreened = on;\n\t},\n\n\tgetBookMetadata: function getBookMetadata() {\n\t\t// eslint-disable-next-line no-use-before-define\n\t\treturn Promise.resolve(new BookMetadata().lazyFetch());\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tif (this.DeletedAttachments) this.DeletedAttachments.reset();\n\t\teventBus.trigger(eventBus.Events.UnloadBook);\n\t\tradio.trigger(App.Events.UnloadBook);\n\t\t// Stop listening for page change events and such\n\t\tif (this.navigator) this.navigator.stopListening();\n\t\tthis.navigator = null;\n\n\t\tif (this.pdfDocument) {\n\t\t\tthis.pdfDocument.destroy();\n\t\t\tthis.pdfDocument = null;\n\t\t}\n\n\t\t// Execute the book mixin's handler for onBeforeDestroy\n\t\tif (this.onBookBeforeDestroy) this.onBookBeforeDestroy();\n\n\t\t$(window).off(\"resize\", this.sectionLoader);\n\t\t$(\"body\").off(\"click.bodyClicker\");\n\t},\n\n\tshowError: function showError(err) {\n\t\tif (!settings.debug || settings.reportErrors) raygun(\"send\", err);\n\t\tvar e = App.parseResponse(err);\n\t\t$(\".spinner-icon\", this.ui.spinner.el).addClass(\"hide\");\n\t\t$(\".warn\", this.ui.spinner.el).text(e.detail || e.info).addClass(\"fault\");\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this4 = this;\n\n\t\t// Clear old pages\n\t\t$(\".page-number\", this.el).remove();\n\n\t\tthis.dragCount = 0;\n\n\t\t// Disable right-clicking to avoid the perception that the book is saveable\n\t\t//this.$el.bind(\"contextmenu\", _.constant(false));\n\n\t\tPromise.all([this.getBookMetadata()]).spread(function (metadata) {\n\t\t\tif (!_this4.ui.book.load || !_this4.ui.book.get) return;\n\n\t\t\t_this4.metadata = metadata;\n\n\t\t\teventBus.trigger(eventBus.Events.PageCount, metadata.get(\"totalPages\"), metadata.get(\"pages\"));\n\n\t\t\t_this4.showSpinner();\n\n\t\t\t// Tell the navigation to load\n\t\t\tif (_this4.format === \"mpub\") {\n\t\t\t\tvar nav = new EpubNavigationSidebar({ metadata: metadata });\n\t\t\t\t_.extend(nav, SlideoutMixin);\n\n\t\t\t\teventBus.trigger(eventBus.Events.LoadNavigation, nav, metadata.get(\"format\"));\n\n\t\t\t\t// eslint-disable-next-line no-use-before-define\n\t\t\t\t_this4.navigator = new EpubNavigator({ book: metadata, startLocation: _this4.startLocation, startHash: _this4.startHash, resolver: _this4.resolveDOMSelector.bind(_this4) });\n\t\t\t} else {\n\t\t\t\tvar _nav = new PdfNavigationSidebar({ metadata: metadata });\n\t\t\t\t_.extend(_nav, SlideoutMixin);\n\n\t\t\t\teventBus.trigger(eventBus.Events.LoadNavigation, _nav, metadata.get(\"format\"));\n\n\t\t\t\t// eslint-disable-next-line no-use-before-define\n\t\t\t\t_this4.navigator = new PdfNavigator({ book: metadata, startLocation: _this4.startLocation, startHash: _this4.startHash });\n\t\t\t}\n\n\t\t\t// eslint-disable-next-line no-use-before-define\n\t\t\t_this4.Attachments = new AttachmentCollection();\n\t\t\t_this4.Attachments.on(\"add\", _this4.onAttachmentAdded.bind(_this4));\n\t\t\t_this4.Attachments.on(\"destroy\", _this4.onAttachmentDestroyed.bind(_this4));\n\n\t\t\t// eslint-disable-next-line no-use-before-define\n\t\t\t_this4.DeletedAttachments = new DeletedAttachmentCollection();\n\t\t\t_this4.DeletedAttachments.on(\"add\", _this4.onDeletedAttachmentAdded.bind(_this4));\n\t\t\t_this4.DeletedAttachments.on(\"remove\", _this4.onDeletedAttachmentRemoved.bind(_this4));\n\t\t\t_this4.DeletedAttachments.on(\"reset\", _this4.onDeletedAttachmentsReset.bind(_this4));\n\n\t\t\t_this4.listenTo(eventBus, eventBus.Events.ShowAttachmentBinContents, _this4.showAttachmentBinContents.bind(_this4));\n\n\t\t\t_this4.AttachmentViews = {};\n\n\t\t\t_this4.initializeFinderStatus();\n\n\t\t\tBackbone.Marionette.bindEvents(_this4, eventBus, _this4.attachmentEvents);\n\n\t\t\t_this4.configureOverlay();\n\n\t\t\t_this4.navigator.on(\"change:url\", _this4.sectionLoader);\n\n\t\t\tif (_this4.format === \"mpub\") {\n\t\t\t\t_this4.ui.book.load(_this4.onLoad.bind(_this4));\n\t\t\t} else {\n\t\t\t\t// Set up the scroll event handler. We bind this here because we won't need to rebind it after each page \"load\".\n\t\t\t\t_this4.ui.book.get(0).addEventListener(\"scroll\", _.throttle(_this4.onScroll.bind(_this4), 10));\n\t\t\t\t_this4.listenTo(_this4, \"pdf:load\", _this4.onLoad.bind(_this4));\n\t\t\t\t// We need to redraw the PDF if the window size changes\n\t\t\t\t// $(window).on(\"resize\", this.sectionLoader);\n\t\t\t}\n\n\t\t\t// Load the first section of the book into the iframe\n\t\t\t_this4.navigator.navigateStart();\n\n\t\t\t// Execute the book mixin's handler for when the book is shown\n\t\t\tif (_this4.onBookShow) _this4.onBookShow();\n\n\t\t\t_this4.fetchAttachments();\n\t\t}).catch(this.showError.bind(this));\n\t},\n\n\tonLoad: function onLoad() {\n\t\tvar _this5 = this;\n\n\t\tif (this.format === \"mpub\") {\n\t\t\t// Trigger high-level events that should be fired when a user clicks inside a book\n\t\t\t$(\"body\", this.ui.book.contents()).click(function () {\n\t\t\t\teventBus.trigger(eventBus.Events.CloseResources);\n\t\t\t\teventBus.trigger(eventBus.Events.CloseSimpleMenus);\n\t\t\t\t$(window).trigger(\"click\");\n\t\t\t});\n\n\t\t\tthis.bodyClicker = function () {\n\t\t\t\teventBus.trigger(eventBus.Events.CloseResources);\n\t\t\t\teventBus.trigger(eventBus.Events.CloseSimpleMenus);\n\t\t\t};\n\n\t\t\t$(\"body\").on(\"click.bodyClicker\", this.bodyClicker);\n\n\t\t\t// Measure the document\n\t\t\tthis.height = this.ui.book.get(0).contentWindow.innerHeight;\n\t\t\tthis.contentHeight = this.ui.book.contents().find(\"body\").height();\n\n\t\t\t// Trigger a click in the window whenever the user clicks within the book\n\t\t\tthis.ui.book.get(0).contentWindow.addEventListener(\"click\", function () {\n\t\t\t\t$(window).trigger(\"click\");\n\t\t\t});\n\n\t\t\t// Set up the scroll event handler for the newly loaded document\n\t\t\tthis.ui.book.get(0).contentWindow.addEventListener(\"scroll\", _.throttle(this.onScroll.bind(this), 10));\n\n\t\t\t//this.ui.book.get(0).contentWindow.oncontextmenu = _.constant(false);\n\n\t\t\t// All external links in the book should open in new tabs\n\t\t\t$(\"a[href]\", this.ui.book.get(0).contentWindow.document).on(\"click\", function () {\n\t\t\t\t// eslint-disable-next-line no-invalid-this\n\t\t\t\tvar href = $(this).prop(\"href\");\n\t\t\t\tif (_.includes(href, settings.urlRoot + \"/acacia/\")) return;\n\t\t\t\t//if(href.indexOf(\"www.\") === 0 || href.indexOf(\"http://\") === 0 || href.indexOf(\"https://\"))\n\t\t\t\twindow.open(href, \"_new\");\n\t\t\t\treturn false;\n\t\t\t});\n\n\t\t\t// Scroll the book to where it's maybe needed\n\t\t\tthis.loadSectionOffset();\n\n\t\t\t// Synchronise any navigator in case a link inside the book was clicked\n\t\t\t// and also to update the localStorage of where we are in this book\n\t\t\tif (this.getCurrentSection(true, true)) {\n\t\t\t\tthis.navigator.setURL(this.getCurrentSection(true, true), undefined, undefined, true);\n\t\t\t\tthis.navigator.synchronize(this.getCurrentSection(true, true), this.ui.book.get(0).contentWindow.scrollY || this.ui.book.get(0).contentWindow.pageYOffset);\n\t\t\t}\n\n\t\t\t// Carry on listening for offset changes\n\t\t\tthis.listenTo(this.navigator, \"change:offset\", this.loadSectionOffset.bind(this));\n\n\t\t\t// Synchronise the page URL\n\t\t\tif (this.getCurrentSection(true)) radio.trigger(App.Events.Commands.Navigate, \"/console/books/\" + this.metadata.get(\"bookID\") + \"/\" + this.getCurrentSection(true), { trigger: false, replace: true });\n\n\t\t\t// Generate some page breaks if needed\n\t\t\tvar section = this.getCurrentSection();\n\t\t\tvar pages = _.filter(this.metadata.get(\"pages\"), function (item) {\n\t\t\t\treturn item.file === section;\n\t\t\t});\n\n\t\t\tvar pageSet = [];\n\n\t\t\tvar run = function run() {\n\t\t\t\tvar go = function go(x) {\n\t\t\t\t\tvar el = _this5.resolveDOMSelector(x.selector);\n\t\t\t\t\tif (el && el.offset()) {\n\t\t\t\t\t\tpageSet.push($(\"<div class='page-number' style='top: \" + (el.offset().top + 10) + \"px'>\" + x.page + \"</div>\"));\n\t\t\t\t\t\trun();\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tif (pages.length) setTimeout(function () {\n\t\t\t\t\t$(\".page-number\", _this5.el).remove();go(pages.pop());\n\t\t\t\t}, 10);else if (pageSet.length) _this5.ui.attachmentContainer.append(pageSet);\n\t\t\t};\n\n\t\t\trun();\n\t\t} else {\n\t\t\t// Signal the resource selector to close when a user clicks within the book and trigger a click event in the window\n\t\t\tthis.ui.book.click(function () {\n\t\t\t\teventBus.trigger(eventBus.Events.CloseResources);\n\t\t\t\teventBus.trigger(eventBus.Events.CloseSimpleMenus);\n\t\t\t\t$(window).trigger(\"click\");\n\t\t\t});\n\n\t\t\tthis.bodyClicker = function () {\n\t\t\t\teventBus.trigger(eventBus.Events.CloseResources);\n\t\t\t\teventBus.trigger(eventBus.Events.CloseSimpleMenus);\n\t\t\t};\n\n\t\t\t$(\"body\").on(\"click.bodyClicker\", this.bodyClicker);\n\n\t\t\tthis.listenTo(eventBus, eventBus.Events.ZoomChange, function (zoom) {\n\t\t\t\t_this5.zoom = zoom;\n\t\t\t\t_this5.sectionLoader();\n\t\t\t});\n\n\t\t\t// Measure the document\n\t\t\tthis.height = this.ui.book.height();\n\t\t\tthis.contentHeight = this.ui.book.get(0).scrollHeight;\n\n\t\t\t// No need to bind scroll handler here\n\n\t\t\t// Scroll the book to where it's maybe needed\n\t\t\tthis.loadSectionOffset();\n\n\t\t\t// Synchronise any navigator in case a link inside the book was clicked\n\t\t\t// and also to update the localStorage of where we are in this book\n\t\t\tthis.navigator.synchronize(this.getCurrentSection(true), this.ui.book.get(0).scrollTop);\n\n\t\t\t// Carry on listening for offset changes\n\t\t\tthis.listenTo(this.navigator, \"change:offset\", this.loadSectionOffset.bind(this));\n\n\t\t\t// Synchronise the page URL\n\t\t\tradio.trigger(App.Events.Commands.Navigate, \"/console/books/\" + this.metadata.get(\"bookID\") + \"/\" + this.getCurrentSection(true), { trigger: false, replace: true });\n\t\t}\n\n\t\t// Execute the book mixin's handler for when loading is complete\n\t\tif (this.onBookLoad) this.onBookLoad();\n\n\t\t//this.fetchHighlights();\n\n\t\t// Show/hide the prev/next stuff\n\t\tthis.pollNavigatePrevious();\n\t\tthis.pollNavigateNext();\n\n\t\t// Update the attachment container\n\t\tthis.resizeAttachmentContainer();\n\t\tthis.scrollAttachmentContainer();\n\t\tif (this.attachmentsFetched) this.populateAttachmentContainer();\n\n\t\teventBus.trigger(eventBus.Events.LoadEnd, this.format);\n\t\teventBus.trigger(eventBus.Events.ViewLoaded);\n\t\tthis.loaded = true;\n\n\t\t// Reveal the new document\n\t\tthis.hideSpinner();\n\t},\n\n\thideFlashCardWidget: function hideFlashCardWidget() {\n\t\tif (this.flashCardWidget) this.flashCardWidget.destroy();\n\t},\n\n\tshowFlashCardWidget: function showFlashCardWidget() {\n\t\tthis.flashCardWidget = new FlashCardWidget();\n\t\tthis.$el.append(this.flashCardWidget.render().$el);\n\t},\n\n\tgroupsChanged: function groupsChanged(allowed, current) {\n\t\tif (!this.ui.groupNotify.removeClass) return;\n\n\t\tif (!this.groupNotification && _.intersection(_.map(allowed.system, function (x) {\n\t\t\treturn x.code;\n\t\t}), current).length !== _.map(allowed.system, function (x) {\n\t\t\treturn x.code;\n\t\t}).length) this.ui.groupNotify.removeClass(\"hide\");else this.ui.groupNotify.addClass(\"hide\");\n\t},\n\n\tonGroupNotifyClick: function onGroupNotifyClick() {\n\t\teventBus.trigger(eventBus.Events.ShowGroupModal);\n\t},\n\n\tonNavPreviousClick: function onNavPreviousClick() {\n\t\tthis.ui.navNext.addClass(\"hide\");\n\t\tthis.ui.navPrevious.addClass(\"hide\");\n\n\t\tthis.navigator.navigatePrevious();\n\n\t\t//if (this.getCurrentSection(true))\n\t\t//\tthis.navigator.synchronize(this.getCurrentSection(true), this.ui.book.get(0).contentWindow.scrollY || this.ui.book.get(0).contentWindow.pageYOffset);\n\t},\n\n\tonNavNextClick: function onNavNextClick() {\n\t\tthis.ui.navNext.addClass(\"hide\");\n\t\tthis.ui.navPrevious.addClass(\"hide\");\n\n\t\tthis.navigator.navigateNext();\n\n\t\t//if (this.getCurrentSection(true))\n\t\t//\tthis.navigator.synchronize(this.getCurrentSection(true), this.ui.book.get(0).contentWindow.scrollY || this.ui.book.get(0).contentWindow.pageYOffset);\n\t},\n\n\tconfigureOverlay: function configureOverlay() {\n\t\tvar _this6 = this;\n\n\t\tif (!this.ui.overlay.offset) return;\n\n\t\tthis.OverlayBase = this.ui.overlay.offset();\n\n\t\t// Reconfigure the UI in response to resource drag operations\n\t\tthis.listenTo(eventBus, eventBus.Events.ResourceDragStart, function () {\n\t\t\t$(\"body\").off(\"click.bodyClicker\");\n\t\t\t_this6.ui.overlay.on(\"mousemove.draggingResource\", _this6.dragOver.bind(_this6, _this6.format));\n\t\t\t_this6.ui.overlay.css({ \"pointer-events\": \"all\" });\n\t\t});\n\n\t\tthis.listenTo(eventBus, eventBus.Events.ResourceDragEnd, function () {\n\t\t\t_this6.ui.overlay.off(\"mousemove.draggingResource\");\n\t\t\t_this6.ui.overlay.css({ \"pointer-events\": \"none\" });\n\t\t\t_this6.ui.highlightBar.addClass(\"hide\");\n\t\t\t_.delay(function () {\n\t\t\t\t$(\"body\").on(\"click.bodyClicker\", _this6.bodyClicker);\n\t\t\t}, 500);\n\t\t});\n\n\t\t// Reconfigure the UI in response to attachment drag operations\n\t\tthis.listenTo(eventBus, eventBus.Events.AttachmentDragStart, function () {\n\t\t\t_this6.ui.overlay.css({ \"pointer-events\": \"all\" });\n\t\t\t_this6.ui.attachmentDeleter.css({ top: Math.max(10, 100 - window.pageYOffset) }).removeClass(\"attachment-bin-hidden\");\n\t\t});\n\n\t\tthis.listenTo(eventBus, eventBus.Events.AttachmentDragEnd, function () {\n\t\t\t_this6.ui.overlay.css({ \"pointer-events\": \"none\" });\n\t\t\t_this6.ui.attachmentDeleter.addClass(\"attachment-bin-hidden\");\n\t\t\t_this6.ui.highlightBar.addClass(\"hide\");\n\t\t});\n\n\t\t// Listen for drag events\n\t\tthis.listenTo(eventBus, eventBus.Events.ResourceDragDrop, function (event, resourceData) {\n\t\t\t_this6.onDrop(event, resourceData);\n\t\t});\n\t},\n\n\tpopulateAttachmentContainer: function populateAttachmentContainer() {\n\t\tvar _this7 = this;\n\n\t\t//if(!this.ui.attachmentContainer.empty)\n\t\t//\treturn;\n\n\t\tthis.removeAllAttachmentViews();\n\n\t\t// Also wipe page numbers\n\t\tthis.ui.attachmentContainer.empty();\n\n\t\t// Filter attachments to the current page\n\t\tvar section = this.getCurrentSection();\n\t\tvar attaches = this.Attachments.filter(function (x) {\n\t\t\treturn (settings.assessments || x.get(\"resourceType\") !== \"assessment\") && x.get(\"section\").toString() === section.toString();\n\t\t});\n\n\t\t// Sort them by creation date to ensure a consistent ordering\n\t\tattaches = _.sortBy(attaches, \"created\");\n\n\t\t_.each(attaches, function (attachmentModel) {\n\t\t\t// Create a new view for this attachment\n\t\t\t_this7.createAttachmentView(attachmentModel);\n\t\t});\n\t},\n\n\tcreateAttachmentView: function createAttachmentView(_attachmentModel) {\n\t\tif (!_attachmentModel) return;\n\n\t\tvar attachmentModel = _attachmentModel;\n\n\t\t// If the current user is the owner of the rejuvenate, do not remove it\n\t\tvar rejuvenateModel = void 0;\n\n\t\t// If the new attachment rejuvenates an older attachment...\n\t\tif (attachmentModel.has(\"rejuvenates\")) {\n\t\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\t\t\trejuvenateModel = _.find(attachmentModel.collection.models, function (model) {\n\t\t\t\treturn model.get(\"_id\") === attachmentModel.get(\"rejuvenates\") && model.get(\"owner\") === user.user_id;\n\t\t\t});\n\n\t\t\tif (settings.annualContent) {\n\t\t\t\tif (rejuvenateModel && !rejuvenateModel.isOld()) {\n\t\t\t\t\t// ...then remove the new attachment view so that the owner does not see duplicates\n\t\t\t\t\tthis.removeAttachmentView(attachmentModel, attachmentModel.get(\"selector\"));\n\t\t\t\t\tattachmentModel = rejuvenateModel;\n\t\t\t\t} else {\n\t\t\t\t\t// ...then remove the old attachment view\n\t\t\t\t\tthis.removeOldAttachmentView(attachmentModel);\n\t\t\t\t}\n\t\t\t} else if (!settings.annualContent && rejuvenateModel && rejuvenateModel.isForeign()) {\n\t\t\t\t// ...then remove the foreign attachment view\n\t\t\t\tthis.removeOldAttachmentView(attachmentModel);\n\t\t\t}\n\t\t}\n\n\t\t// If the attachment is old and a newer version of the attachment exists...\n\t\tif (attachmentModel.isOld() && this.rejuvenatorExistsFor(attachmentModel)) {\n\t\t\t// ...then prevent the creation of a view for the attachment\n\t\t\tattachmentModel = null;\n\t\t}\n\t\t// If the attachment is foreign and a native version of the attachment exists...\n\t\telse if (attachmentModel.isForeign() && this.rejuvenatorExistsFor(attachmentModel) && !rejuvenateModel) {\n\t\t\t\t// ...then prevent the creation of a view for the attachment\n\t\t\t\tattachmentModel = null;\n\t\t\t}\n\n\t\tif (attachmentModel) {\n\t\t\t// Obtain the new attachment's selector\n\t\t\tvar selector = attachmentModel.get(\"selector\");\n\n\t\t\t// If no other attachment is present at the new attachment's selector...\n\t\t\tvar existing = this.getAttachmentAtSelector(selector);\n\t\t\tif (existing) {\n\t\t\t\t// add the attachment model to the existing attachment view's collection\n\t\t\t\texisting.attachmentCollection.add(attachmentModel);\n\t\t\t} else {\n\t\t\t\t// ...then create a new attachment collection and add the attachment model to it\n\t\t\t\t// eslint-disable-next-line no-use-before-define\n\t\t\t\tvar attachmentCollection = new AttachmentCollection();\n\t\t\t\tattachmentCollection.add(attachmentModel);\n\n\t\t\t\t// Create a compound attachment view to contain the attachment\n\t\t\t\t// eslint-disable-next-line no-use-before-define\n\t\t\t\tvar view = new CompoundAttachmentView({ attachmentCollection: attachmentCollection });\n\t\t\t\tthis.ui.attachmentContainer.append(view.render().el);\n\t\t\t\tview.onRender();\n\n\t\t\t\tif (this.format === \"mpub\") {\n\t\t\t\t\t// Position the attachment view within the attachment container\n\t\t\t\t\tvar el = $(this.resolveDOMSelector(selector));\n\t\t\t\t\tif (!el.length) return;\n\t\t\t\t\tview.$el.css({\n\t\t\t\t\t\ttop: el.offset().top + el.height() / 2 - 12 + \"px\"\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tview.$el.css({\n\t\t\t\t\t\ttop: (parseFloat(selector) * this.contentHeight * 0.01).toFixed(0) + \"px\"\n\t\t\t\t\t});\n\n\t\t\t\t\t// If this is the first attachment we're adding, the centre of this is the basis of the invisible grid\n\t\t\t\t\tif (!this.invisibleGridOffset) this.invisibleGridOffset = (parseFloat(selector) * this.contentHeight * 0.01).toFixed(2);\n\t\t\t\t}\n\n\t\t\t\t// Add the attachment view to the hash\n\t\t\t\tthis.AttachmentViews[this.mapSelector(selector)] = { view: view, attachmentCollection: attachmentCollection };\n\t\t\t}\n\t\t}\n\t},\n\n\tmoveAttachment: function moveAttachment(attachmentModelIdentifiers, newSelector) {\n\t\tvar _this8 = this;\n\n\t\tvar multi = attachmentModelIdentifiers.length > 1;\n\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\t_.forEach(attachmentModelIdentifiers, function (id) {\n\t\t\t// Retrieve the complete attachment model (including the associated resource model)\n\t\t\tvar attachmentModel = _this8.Attachments.get(id);\n\t\t\tif (!attachmentModel) return;\n\n\t\t\t// Move only new attachments and leave the old attachments behind\n\t\t\tif (rester.hasAccess(rester.p.groups.all, user) || !attachmentModel.isOld() && !attachmentModel.isForeign() && !attachmentModel.isShared()) {\n\t\t\t\t// Determine the current location of the attachment\n\t\t\t\tvar oldSelector = attachmentModel.get(\"selector\");\n\n\t\t\t\t// Same location? Ignore this\n\t\t\t\tif (_this8.format === \"mpub\" && _this8.mapSelector(oldSelector) === _this8.mapSelector(newSelector)) return;\n\n\t\t\t\tattachmentModel.set({ selector: newSelector });\n\n\t\t\t\t// Remove the attachment model from its old location.\n\t\t\t\t// NOTE: must remove before adding, because we need the selector unchanged to do virtual selector lookups for PDFs\n\t\t\t\t_this8.removeAttachmentView(attachmentModel, oldSelector);\n\n\t\t\t\t_this8.createAttachmentView(attachmentModel);\n\n\t\t\t\t// Update the attachment model\n\t\t\t\tattachmentModel.save(null, {\n\t\t\t\t\terror: function error() {\n\t\t\t\t\t\tattachmentModel.set({ selector: oldSelector });\n\n\t\t\t\t\t\t_this8.createAttachmentView(attachmentModel);\n\n\t\t\t\t\t\t// Remove the attachment model from its old location\n\t\t\t\t\t\t_this8.removeAttachmentView(attachmentModel, newSelector);\n\n\t\t\t\t\t\tconsole.error(\"Error saving attachment model during attachment move operation.\");\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else if (!multi) {\n\t\t\t\tvar txt = attachmentModel.isOld() ? \"This attachment is from a previous year\" : attachmentModel.isForeign() ? \"This attachment is from another group\" : \"This attachment is shared with other groups\";\n\n\t\t\t\tvar modal = new SmallModal({\n\t\t\t\t\ttitle: \"<span class='fal fa-ban'/> Move Not Allowed\",\n\t\t\t\t\tbody: txt + \". You are not allowed to move it.\",\n\t\t\t\t\thost: \"#link-resources\",\n\t\t\t\t\thideButtons: [\"cancel\"]\n\t\t\t\t});\n\t\t\t\tmodal.show();\n\t\t\t}\n\t\t});\n\t},\n\n\tremoveAttachmentView: function removeAttachmentView(attachmentModel, selector) {\n\t\t// Remove the attachment model from the specified location\n\t\tif (this.AttachmentViews[this.mapSelector(selector)]) {\n\t\t\tthis.AttachmentViews[this.mapSelector(selector)].attachmentCollection.remove(attachmentModel);\n\n\t\t\t// If the attachment collection at the old location is now empty...\n\t\t\tif (this.AttachmentViews[this.mapSelector(selector)].attachmentCollection.length === 0) {\n\t\t\t\t// ...then remove the view at the old location and remove the attachment from the hash\n\t\t\t\tthis.AttachmentViews[this.mapSelector(selector)].view.destroy();\n\t\t\t\tdelete this.AttachmentViews[this.mapSelector(selector)];\n\t\t\t}\n\t\t}\n\t},\n\n\tdestroyAttachmentView: function destroyAttachmentView(attachmentModel) {\n\t\tvar selector = attachmentModel.get(\"selector\");\n\n\t\tif (this.AttachmentViews[this.mapSelector(selector)] && this.AttachmentViews[this.mapSelector(selector)].attachmentCollection.length <= 1) {\n\t\t\tthis.AttachmentViews[this.mapSelector(selector)].view.destroy();\n\t\t\tdelete this.AttachmentViews[this.mapSelector(selector)];\n\t\t} else if (!this.AttachmentViews[this.mapSelector(selector)]) {\n\t\t\tconsole.warn(\"Attachment to delete did not exist @ selector \" + selector);\n\t\t}\n\t},\n\n\tremoveOldAttachmentView: function removeOldAttachmentView(newAttachmentModel) {\n\t\tvar oldAttachmentModel = this.Attachments.find(function (model) {\n\t\t\treturn model.get(\"_id\") === newAttachmentModel.get(\"rejuvenates\");\n\t\t});\n\n\t\tif (oldAttachmentModel) this.removeAttachmentView(oldAttachmentModel, oldAttachmentModel.get(\"selector\"));\n\t},\n\n\tremoveAllAttachmentViews: function removeAllAttachmentViews() {\n\t\t_.forEach(this.AttachmentViews, function (view) {\n\t\t\treturn view.view.remove();\n\t\t});\n\n\t\tthis.AttachmentViews = {};\n\t},\n\n\tupdateAttachmentViews: function updateAttachmentViews(attachmentModel, newSelector) {\n\t\tvar oldSelector = attachmentModel.previous(\"selector\");\n\t\tvar attachment = this.AttachmentViews[this.mapSelector(oldSelector)];\n\n\t\tdelete this.AttachmentViews[this.mapSelector(oldSelector)];\n\n\t\tthis.AttachmentViews[this.mapSelector(newSelector)] = attachment;\n\t},\n\n\trejuvenatorExistsFor: function rejuvenatorExistsFor(attachmentModel) {\n\t\treturn _.find(this.Attachments.models, function (model) {\n\t\t\treturn model.has(\"rejuvenates\") && model.get(\"rejuvenates\") === attachmentModel.get(\"_id\");\n\t\t});\n\t},\n\n\tqueryRejuvenateAttachment: function queryRejuvenateAttachment(attachmentModel) {\n\t\tvar states = [];\n\t\tif (attachmentModel.isOld()) states.push(\"from a previous year\");\n\t\tif (attachmentModel.isForeign()) states.push(\"from a group you don't have access to\");\n\n\t\tvar groups = eventBus.request(eventBus.Events.GetCurrentGroups);\n\n\t\tif (groups.length > 0) {\n\t\t\tif (!this.RejuvenateDialog) {\n\t\t\t\t// Ask the user if the attachment should be rejuvenated\n\t\t\t\tthis.RejuvenateDialog = new SmallModal({\n\t\t\t\t\tpersist: false,\n\t\t\t\t\ttitle: \"<span class='fal fa-clone'/> Clone \" + (attachmentModel.isOld() ? \"Old\" : \"Foreign\") + \" Attachment:\\n\\t\\t\\t\\t\\t\\t\" + attachmentModel.get(\"title\").replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t\t\t}),\n\t\t\t\t\tbody: \"<p>This attachment is \" + states.join(\" and \") + \"; in order to use it, you must clone it into the current year and group.</p>\\n\\t\\t\\t\\t\\t\\t<p>Do you wish to clone this attachment?</p><p><i>Cloning will not affect the original attachment in any way.</i></p>\",\n\t\t\t\t\thost: \"#link-resources\"\n\t\t\t\t});\n\n\t\t\t\tthis.RejuvenateDialog.on(\"button:ok\", this.rejuvenateAttachment.bind(this, attachmentModel));\n\n\t\t\t\tthis.RejuvenateDialog.show();\n\t\t\t}\n\t\t} else {\n\t\t\tthis.SaveErrorDialog = new SmallModal({\n\t\t\t\tpersist: false,\n\t\t\t\ttitle: \"<span class='fal fa-times-circle'/> Error\",\n\t\t\t\tbody: \"<p>The book currently has no new/current groups. Please assign a new global group before cloning the resource.</p>\",\n\t\t\t\thost: \"#link-resources\",\n\t\t\t\thideButtons: [\"cancel\"],\n\t\t\t\twarning: true\n\t\t\t});\n\n\t\t\tthis.SaveErrorDialog.show();\n\t\t}\n\t},\n\n\tqueryRejuvenateAttachments: function queryRejuvenateAttachments() {\n\t\tvar groups = eventBus.request(eventBus.Events.GetCurrentGroups);\n\n\t\tif (groups.length > 0) {\n\t\t\tif (!this.RejuvenateDialog) {\n\t\t\t\t// Ask the user if the attachments should be rejuvenated\n\t\t\t\tthis.RejuvenateDialog = new SmallModal({\n\t\t\t\t\tpersist: false,\n\t\t\t\t\ttitle: \"<span class='fal fa-clone'/> Clone all old and foreign attachments\",\n\t\t\t\t\tbody: \"<p>There are attachments from previous years and different groups. In order to use them, you must clone them into the current year and group.</p>\\n\\t\\t\\t\\t\\t\\t<p>Do you wish to clone all attachments?</p><p><i>Cloning will not affect the original attachments in any way.</i></p>\",\n\t\t\t\t\thost: \"#link-resources\"\n\t\t\t\t});\n\n\t\t\t\tthis.RejuvenateDialog.on(\"button:ok\", this.rejuvenateAttachments.bind(this));\n\n\t\t\t\tthis.RejuvenateDialog.show();\n\t\t\t}\n\t\t} else {\n\t\t\tthis.SaveErrorDialog = new SmallModal({\n\t\t\t\tpersist: false,\n\t\t\t\ttitle: \"<span class='fal fa-times-circle'/> Error\",\n\t\t\t\tbody: \"<p>The book currently has no new/current groups. Please assign a new global group before cloning the resources.</p>\",\n\t\t\t\thost: \"#link-resources\",\n\t\t\t\thideButtons: [\"cancel\"],\n\t\t\t\twarning: true\n\t\t\t});\n\n\t\t\tthis.SaveErrorDialog.show();\n\t\t}\n\t},\n\n\trejuvenateAttachment: function () {\n\t\tvar _ref2 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee2(attachmentModel, reloadAttachments) {\n\t\t\tvar _this9 = this;\n\n\t\t\tvar newModel;\n\t\t\treturn _regenerator2.default.wrap(function _callee2$(_context2) {\n\t\t\t\twhile (1) {\n\t\t\t\t\tswitch (_context2.prev = _context2.next) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tif (this.RejuvenateDialog) {\n\t\t\t\t\t\t\t\tthis.RejuvenateDialog.destroy();\n\t\t\t\t\t\t\t\tthis.RejuvenateDialog = false;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Create a new attachment model that duplicates the salient attributes of the old attachment model\n\t\t\t\t\t\t\t// and indicates that it is a rejuvenation of the older model\n\t\t\t\t\t\t\tnewModel = this.Attachments.add({\n\t\t\t\t\t\t\t\trejuvenating: true,\n\t\t\t\t\t\t\t\tbook: attachmentModel.get(\"book\"),\n\t\t\t\t\t\t\t\tgroups: eventBus.request(eventBus.Events.GetCurrentGroups),\n\t\t\t\t\t\t\t\tresource: attachmentModel.get(\"resource\"),\n\t\t\t\t\t\t\t\tresourceType: attachmentModel.get(\"resourceType\"),\n\t\t\t\t\t\t\t\tsection: attachmentModel.get(\"section\"),\n\t\t\t\t\t\t\t\tselector: attachmentModel.get(\"selector\"),\n\t\t\t\t\t\t\t\trejuvenates: attachmentModel.get(\"_id\"),\n\t\t\t\t\t\t\t\tsettings: attachmentModel.get(\"settings\"),\n\t\t\t\t\t\t\t\tpageNumber: attachmentModel.get(\"pageNumber\")\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t// Save the attachment\n\n\t\t\t\t\t\t\treturn _context2.abrupt(\"return\", new Promise(function (resolve, reject) {\n\t\t\t\t\t\t\t\t_this9.saveAttachment(newModel, false, reloadAttachments).done(function () {\n\t\t\t\t\t\t\t\t\tnewModel.unset(\"rejuvenating\");\n\n\t\t\t\t\t\t\t\t\tif (_this9.containsOldAttachments()) eventBus.trigger(eventBus.Events.OldAttachmentsExists);else eventBus.trigger(eventBus.Events.NoOldAttachments);\n\n\t\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t\t}).fail(reject);\n\t\t\t\t\t\t\t}));\n\n\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\treturn _context2.stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, _callee2, this);\n\t\t}));\n\n\t\tfunction rejuvenateAttachment(_x2, _x3) {\n\t\t\treturn _ref2.apply(this, arguments);\n\t\t}\n\n\t\treturn rejuvenateAttachment;\n\t}(),\n\n\trejuvenateAttachments: function () {\n\t\tvar _ref3 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee3() {\n\t\t\tvar _this10 = this;\n\n\t\t\tvar reloadAttachments;\n\t\t\treturn _regenerator2.default.wrap(function _callee3$(_context3) {\n\t\t\t\twhile (1) {\n\t\t\t\t\tswitch (_context3.prev = _context3.next) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tif (this.RejuvenateDialog) {\n\t\t\t\t\t\t\t\tthis.RejuvenateDialog.destroy();\n\t\t\t\t\t\t\t\tthis.RejuvenateDialog = false;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treloadAttachments = true;\n\t\t\t\t\t\t\t_context3.next = 4;\n\t\t\t\t\t\t\treturn Promise.each(this.Attachments.models, function (attachment) {\n\t\t\t\t\t\t\t\tif (attachment.isOld() && !_this10.rejuvenatorExistsFor(attachment)) return _this10.rejuvenateAttachment(attachment, reloadAttachments);\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\treturn _context3.stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, _callee3, this);\n\t\t}));\n\n\t\tfunction rejuvenateAttachments() {\n\t\t\treturn _ref3.apply(this, arguments);\n\t\t}\n\n\t\treturn rejuvenateAttachments;\n\t}(),\n\n\tinitializeFinderStatus: function initializeFinderStatus() {\n\t\tthis.clearAttachmentFocus();\n\n\t\tthis.FinderStatus = {\n\t\t\tresource: null,\n\t\t\tattachments: null,\n\t\t\tcurrentIndex: null\n\t\t};\n\t},\n\n\tresetFinderStatus: function resetFinderStatus(resourceIdentifier, reverse) {\n\t\tthis.clearAttachmentFocus();\n\n\t\tif (this.FinderStatus.resource !== resourceIdentifier) {\n\t\t\tvar attachments = this.getAttachmentsForResource(resourceIdentifier);\n\n\t\t\tthis.FinderStatus = {\n\t\t\t\tresource: resourceIdentifier,\n\t\t\t\tattachments: attachments,\n\t\t\t\tcurrentIndex: reverse ? attachments.length - 1 : 0\n\t\t\t};\n\t\t}\n\t},\n\n\tclearAttachmentFocus: function clearAttachmentFocus() {\n\t\tif (this.FinderStatus && this.FinderStatus.currentIndex !== null && this.FinderStatus.attachments[this.FinderStatus.currentIndex]) {\n\t\t\tthis.FinderStatus.attachments[this.FinderStatus.currentIndex].focused = false;\n\t\t\tthis.FinderStatus.attachments[this.FinderStatus.currentIndex].trigger(\"focus\");\n\t\t}\n\t},\n\n\tgetAttachmentsForResource: function getAttachmentsForResource(resourceIdentifier) {\n\t\treturn this.Attachments.where({ resource: resourceIdentifier });\n\t},\n\n\tfindFirstAttachment: function findFirstAttachment(resourceIdentifier) {\n\t\tthis.initializeFinderStatus();\n\t\tthis.findNextAttachment(resourceIdentifier);\n\t},\n\n\tfindNextAttachment: function findNextAttachment(resourceIdentifier) {\n\t\tthis.resetFinderStatus(resourceIdentifier, true);\n\n\t\tthis.FinderStatus.currentIndex = (this.FinderStatus.currentIndex + 1) % this.FinderStatus.attachments.length;\n\t\tif (!this.FinderStatus.attachments[this.FinderStatus.currentIndex]) return;\n\n\t\tthis.FinderStatus.attachments[this.FinderStatus.currentIndex].focused = true;\n\n\t\tthis.jumpToAttachment(this.FinderStatus.attachments[this.FinderStatus.currentIndex]);\n\t},\n\n\tfindPreviousAttachment: function findPreviousAttachment(resourceIdentifier) {\n\t\tthis.resetFinderStatus(resourceIdentifier, false);\n\n\t\tif (this.FinderStatus.attachments.length === 0) return;\n\n\t\tthis.FinderStatus.currentIndex = Math.max(0, (this.FinderStatus.currentIndex + (this.FinderStatus.attachments.length - 1)) % this.FinderStatus.attachments.length);\n\t\tif (this.FinderStatus.currentIndex >= this.FinderStatus.attachments.length) this.FinderStatus.currentIndex = 0;\n\t\tthis.FinderStatus.attachments[this.FinderStatus.currentIndex].focused = true;\n\n\t\tthis.jumpToAttachment(this.FinderStatus.attachments[this.FinderStatus.currentIndex]);\n\t},\n\n\trecordCurrentTooltip: function recordCurrentTooltip(attachmentView) {\n\t\tthis.CurrentTooltip = attachmentView;\n\t},\n\n\tshowSpinner: function showSpinner() {\n\t\tif (!this.ui.spinner.removeClass) return;\n\n\t\tthis.ui.spinner.removeClass(\"hide\");\n\t\tthis.ui.overlay.addClass(\"blocking\");\n\n\t\t// If it takes that long, it'll probably take longer\n\t\tthis.hintTimer = setTimeout(this.showHint.bind(this), 1500);\n\t},\n\n\thideSpinner: function hideSpinner() {\n\t\tclearTimeout(this.hintTimer);\n\n\t\tthis.ui.spinner.addClass(\"hide\");\n\t\tthis.ui.overlay.removeClass(\"blocking\");\n\t},\n\n\tshowHint: function showHint() {\n\t\tif (this.ui.hint && this.ui.hint.removeClass) this.ui.hint.removeClass(\"invisible\");\n\t},\n\n\tsaveAttachment: function saveAttachment(attachmentModel, dontCreateView, reloadAttachments) {\n\t\tvar _this11 = this;\n\n\t\t// Add the model to the attachment model collection\n\t\tthis.Attachments.add(attachmentModel);\n\n\t\tif (!dontCreateView) {\n\t\t\t// Create a new view for this attachment\n\t\t\tthis.createAttachmentView(attachmentModel);\n\t\t}\n\n\t\tattachmentsSaving++;\n\t\tradio.trigger(App.Events.Commands.NavigationPrompt, \"Some attachments are still saving. If you leave, they will be lost. Are you sure?\");\n\n\t\treturn attachmentModel.save(null, {\n\t\t\tsuccess: function success() {\n\t\t\t\t// Update the attachment model's identifier, as created by the server\n\t\t\t\tattachmentsSaving--;\n\t\t\t\tattachmentModel.set(\"saved\", true);\n\t\t\t\t_this11.currentlySaving = false;\n\n\t\t\t\tif (dontCreateView) {\n\t\t\t\t\tattachmentModel.trigger(\"save:success\");\n\t\t\t\t\t_this11.saveFiles();\n\t\t\t\t}\n\n\t\t\t\tif (attachmentsSaving === 0) {\n\t\t\t\t\tradio.trigger(App.Events.Commands.NavigationPrompt, null);\n\t\t\t\t\tif (reloadAttachments) _this11.render();\n\t\t\t\t}\n\t\t\t},\n\n\t\t\terror: function error(model, response) {\n\t\t\t\t_this11.currentlySaving = false;\n\t\t\t\tvar error = \"<p style=\\\"border-bottom: 1px solid; padding-bottom: 1rem;\\\">\" + JSON.stringify(response).replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t\t}) + \"</p>\";\n\n\t\t\t\tif (_this11.SaveErrorDialog) {\n\t\t\t\t\t_this11.SaveErrorDialog.ui.body.find(\"#error-list\").append(error);\n\t\t\t\t} else {\n\t\t\t\t\t_this11.SaveErrorDialog = new SmallModal({\n\t\t\t\t\t\tpersist: false,\n\t\t\t\t\t\ttitle: \"<span class='fal fa-times-circle'/> Error\",\n\t\t\t\t\t\tbody: \"<p>An error occurred while saving the attachment. Please try again. Details about the error follow.</p>\\n\\t\\t\\t\\t\\t\\t\\t<div id=\\\"error-list\\\">\" + error + \"</div>\",\n\t\t\t\t\t\thost: \"#link-resources\",\n\t\t\t\t\t\thideButtons: [\"cancel\"],\n\t\t\t\t\t\twarning: true\n\t\t\t\t\t});\n\n\t\t\t\t\t_this11.SaveErrorDialog.show();\n\t\t\t\t}\n\n\t\t\t\tattachmentsSaving--;\n\t\t\t\tif (attachmentsSaving === 0) radio.trigger(App.Events.Commands.NavigationPrompt, null);\n\n\t\t\t\t_this11.removeAttachmentView(attachmentModel, attachmentModel.get(\"selector\"));\n\t\t\t\t_this11.Attachments.remove(attachmentModel);\n\t\t\t}\n\t\t});\n\t},\n\n\tfetchAttachments: function fetchAttachments() {\n\t\tthis.attachmentsFetched = false;\n\t\tthis.Attachments.fetch({\n\t\t\tsuccess: this.fetchAttachmentsSuccess.bind(this),\n\t\t\terror: this.fetchAttachmentsError.bind(this)\n\t\t});\n\t},\n\n\tfetchAttachmentsSuccess: function fetchAttachmentsSuccess() {\n\t\tthis.Attachments.on(\"remove\", this.destroyAttachmentView.bind(this));\n\t\tthis.attachmentsFetched = true;\n\t\tif (this.loaded) this.populateAttachmentContainer();\n\n\t\tif (this.containsOldAttachments()) eventBus.trigger(eventBus.Events.OldAttachmentsExists);\n\t},\n\n\tcontainsOldAttachments: function containsOldAttachments() {\n\t\tvar _this12 = this;\n\n\t\treturn _.find(this.Attachments.models, function (model) {\n\t\t\treturn model.isOld() && !_this12.rejuvenatorExistsFor(model);\n\t\t});\n\t},\n\n\tfetchAttachmentsError: _.noop,\n\n\tonAttachmentAdded: function onAttachmentAdded(model) {\n\t\tif (!model.isOld()) {\n\t\t\t// Signal the usage of the associated resource as an attachment\n\t\t\teventBus.trigger(\"attachmentAdded:\" + model.get(\"resource\"));\n\t\t\tradio.trigger(\"attachmentAdded:\" + model.get(\"resource\"));\n\t\t}\n\t},\n\n\tonAttachmentDestroyed: function onAttachmentDestroyed(model) {\n\t\tif (!model.isOld()) {\n\t\t\t// If the destroyed attachment rejuvenates an older attachment...\n\t\t\tif (model.has(\"rejuvenates\")) {\n\t\t\t\t// ...then recreate the view for the older attachment\n\t\t\t\tvar oldAttachmentModel = this.Attachments.get(model.get(\"rejuvenates\"));\n\n\t\t\t\tif (oldAttachmentModel) this.createAttachmentView(oldAttachmentModel);\n\t\t\t}\n\n\t\t\t// Signal the removal of an attachment from use\n\t\t\teventBus.trigger(\"attachmentRemoved:\" + model.get(\"resource\"));\n\t\t\tradio.trigger(\"attachmentRemoved:\" + model.get(\"resource\"));\n\t\t}\n\t},\n\n\tcreateAttachmentModel: function createAttachmentModel(resourceData, s, opts, dontSave) {\n\t\tvar groups = eventBus.request(eventBus.Events.GetCurrentGroups);\n\n\t\tvar data = {\n\t\t\tbook: opts.book.get(\"metadata\").bookID,\n\t\t\tgroups: groups,\n\t\t\tresource: resourceData._id,\n\t\t\tresourceType: resourceData.category,\n\t\t\tsection: this.getCurrentSection(),\n\t\t\tselector: opts.selector,\n\t\t\tvisible: true\n\t\t};\n\n\t\tif (s) {\n\t\t\tdata.settings = {\n\t\t\t\tserverSave: s.save,\n\t\t\t\ttitle: s.instanceName,\n\t\t\t\trequireCode: s.requireCode,\n\t\t\t\tcode: s.requireCode ? s.code : undefined,\n\t\t\t\tdisableRandomization: s.disableRandomization,\n\t\t\t\thideCompleteButtons: s.hideCompleteButtons,\n\t\t\t\tdisableResult: s.disableResult\n\t\t\t};\n\n\t\t\tif (s.activationType === \"specific\") {\n\t\t\t\tvar activationTime = moment(s.startDate, \"DD MMM YYYY\").hour(0).minute(0).second(0);\n\t\t\t\tvar time = moment(s.startTime, \"h:mma\");\n\t\t\t\tactivationTime.hour(time.hour()).minute(time.minute()).second(0);\n\n\t\t\t\tdata.activationTime = activationTime.unix();\n\t\t\t}\n\t\t}\n\n\t\tvar attachmentModel = this.Attachments.add(data);\n\t\t//set the missing resource fields\n\t\tattachmentModel.set(\"title\", resourceData.title);\n\t\tattachmentModel.set(\"subject_name\", resourceData.subject_name);\n\t\tattachmentModel.set(\"grade\", resourceData.contentGrade || resourceData.grade);\n\t\tattachmentModel.set(\"language\", resourceData.language);\n\t\tattachmentModel.set(\"category\", resourceData.category);\n\t\tattachmentModel.set(\"baseCode\", resourceData.baseCode);\n\n\t\tif (!dontSave) {\n\t\t\t// Save the attachment\n\t\t\tthis.saveAttachment(attachmentModel);\n\t\t}\n\t\treturn attachmentModel;\n\t},\n\n\tgetSelector: function getSelector(event) {\n\t\tvar selector = \"\";\n\t\tif (this.format === \"mpub\") {\n\t\t\t// Obtain the book element underneath the cursor\n\t\t\tvar element = this.getBookElementAt(event.originalEvent.clientX, event.originalEvent.clientY - (this.fullscreened ? -45 : 0) + this.ui.book.get(0).scrollTop + window.pageYOffset);\n\n\t\t\t// Build the DOM selector for this element\n\t\t\tselector = this.buildDOMSelector(element);\n\t\t} else {\n\t\t\t// Page offset as a percentage\n\t\t\tselector = (event.originalEvent.clientY - (this.fullscreened ? 45 : this.OverlayBase.top) + this.ui.book.get(0).scrollTop - 16 + window.pageYOffset) / this.contentHeight * 100;\n\t\t\tif (!_.isFinite(parseFloat(selector))) return;\n\t\t\tselector = parseFloat(selector).toFixed(2);\n\t\t}\n\n\t\treturn selector;\n\t},\n\n\tfinalizeDrop: function finalizeDrop(event) {\n\t\tif (!this.ui.highlightBar || !this.ui.highlightBar.addClass) return;\n\n\t\t// Remove the highlight from the element upon which the drop completed\n\t\tif (this.format === \"mpub\") this.restorePreviousElementBorder();\n\n\t\t// Potentially hide the highlight bar for PDFs\n\t\tthis.ui.highlightBar.addClass(\"hide\");\n\n\t\t// Accept the drop\n\t\tevent.preventDefault();\n\t},\n\n\tonDrop: function onDrop(event, dropData) {\n\t\tvar _this13 = this;\n\n\t\teventBus.trigger(eventBus.Events.AttachmentDragEnd);\n\n\t\tevent.preventDefault();\n\n\t\tvar book = eventBus.request(eventBus.Events.GetCurrentBook);\n\n\t\tvar selector = this.getSelector(event);\n\n\t\t// If the user drags too fast and drops outside of the book, the resulting selector can end up invalid\n\t\tif (!selector) return;\n\n\t\tvar determineDropEffect = function determineDropEffect(data) {\n\t\t\tvar result = null;\n\n\t\t\tswitch (data.type) {\n\t\t\t\tcase \"attachment\":\n\t\t\t\t\tresult = \"link\";\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"resource\":\n\t\t\t\t\tresult = \"copy\";\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\"Cannot determine drop type\");\n\t\t\t}\n\n\t\t\treturn result;\n\t\t};\n\n\t\tvar rest = function rest() {\n\t\t\tvar dropEffect = determineDropEffect(dropData);\n\n\t\t\tif (dropEffect === \"copy\") {\n\t\t\t\tif (dropData !== null && dropData.resourceModel.category === \"assessment\") {\n\t\t\t\t\t// ...then query the user for additional settings\n\t\t\t\t\tvar modal = new AssessmentPrompt({\n\t\t\t\t\t\tinlineMessage: \"\",\n\t\t\t\t\t\thost: \"#link-resources\",\n\t\t\t\t\t\tresource: new Resource(dropData.resourceModel)\n\t\t\t\t\t});\n\n\t\t\t\t\tmodal.once(\"action\", function (action, settingsModel) {\n\t\t\t\t\t\tif (action === \"ok\") {\n\t\t\t\t\t\t\t_this13.createAttachmentModel(dropData.resourceModel, settingsModel, { book: book, selector: selector });\n\t\t\t\t\t\t\t_this13.finalizeDrop(event);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t_this13.finalizeDrop(event);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tmodal.show();\n\t\t\t\t} else {\n\t\t\t\t\t_this13.createAttachmentModel(dropData.resourceModel, null, { book: book, selector: selector });\n\t\t\t\t\t_this13.finalizeDrop(event);\n\t\t\t\t}\n\t\t\t} else if (dropEffect === \"link\") {\n\t\t\t\t// Move the specified attachment models to the specified selector\n\t\t\t\t_this13.moveAttachment(dropData.attachmentIdentifiers, selector);\n\t\t\t\t_this13.finalizeDrop(event);\n\t\t\t}\n\t\t};\n\n\t\t// Check if this resource is already being used\n\t\tif (dropData.type !== \"attachment\" && _.some(this.Attachments.models, function (x) {\n\t\t\treturn x.get(\"resource\") === dropData.resourceModel._id;\n\t\t})) {\n\t\t\tvar useWarn = new SmallModal({\n\t\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Duplicate Warning\",\n\t\t\t\tbody: \"You are already using that resource in this book. Do you want to add it again?\",\n\t\t\t\thost: \"#link-resources\"\n\t\t\t});\n\n\t\t\tuseWarn.on(\"button:ok\", function () {\n\t\t\t\trest();\n\t\t\t});\n\n\t\t\tuseWarn.on(\"button:cancel\", function () {\n\t\t\t\t_this13.finalizeDrop(event);\n\t\t\t});\n\n\t\t\tuseWarn.show();\n\t\t} else {\n\t\t\trest();\n\t\t}\n\t},\n\n\tdragOver: function dragOver(format, event) {\n\t\t// Obtain the book element underneath the cursor\n\t\tif (format === \"mpub\") {\n\t\t\tvar element = this.getBookElementAt(event.originalEvent.clientX, event.originalEvent.clientY - (this.fullscreened ? -45 : 0) + this.ui.book.get(0).scrollTop + window.pageYOffset);\n\n\t\t\t// Update the highlight border for the element\n\t\t\tthis.restorePreviousElementBorder();\n\n\t\t\tvar permissibleTags = [\"address\", \"article\", \"aside\", \"audio\", \"blockquote\", \"canvas\", \"dd\", \"div\", \"dl\", \"fieldset\", \"figcaption\", \"figure\", \"footer\", \"form\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"header\", \"hgroup\", \"hr\", \"ol\", \"output\", \"p\", \"pre\", \"section\", \"table\", \"td\", \"tfoot\", \"ul\", \"video\", \"li\"];\n\n\t\t\tif (element && _.includes(permissibleTags, element.nodeName.toLowerCase())) {\n\t\t\t\tthis.recordElementBorder(element);\n\t\t\t\tthis.setElementBorder(element);\n\t\t\t}\n\t\t}\n\n\t\tthis.ui.highlightBar.css({ top: event.originalEvent.clientY - (this.fullscreened ? 45 : this.OverlayBase.top) - 16 + window.pageYOffset }).removeClass(\"hide\");\n\t},\n\n\tonMouseEnter: function onMouseEnter() {\n\t\tthis.ui.dropOverlay.addClass(\"hide\");\n\t},\n\n\tonMouseLeave: function onMouseLeave() {\n\t\tthis.ui.dropOverlay.removeClass(\"hide\");\n\t},\n\n\tonFileDragOver: function onFileDragOver(event) {\n\t\tevent.preventDefault();\n\t\tif (!this.uploadAllowed) return false;\n\n\t\tevent.originalEvent.dataTransfer.dropEffect = \"copy\";\n\t\tthis.dragOver(this.format, event);\n\t},\n\n\tonFileDragEnter: function onFileDragEnter() {\n\t\tif (!this.uploadAllowed) return false;\n\n\t\tthis.dragCount++;\n\t\tthis.ui.cancelDrop.removeClass(\"hide\");\n\t},\n\n\tonFileDragLeave: function onFileDragLeave() {\n\t\tif (!this.uploadAllowed) return false;\n\n\t\tthis.dragCount--;\n\t\tif (this.dragCount === 0) this.ui.cancelDrop.addClass(\"hide\");\n\t},\n\n\tonFileDrop: function onFileDrop(event) {\n\t\tvar _this14 = this;\n\n\t\tevent.preventDefault();\n\t\tif (!this.uploadAllowed) return false;\n\n\t\tvar book = eventBus.request(eventBus.Events.GetCurrentBook);\n\t\t$(\".highlight-bar\").addClass(\"hide\");\n\t\tthis.ui.cancelDrop.addClass(\"hide\");\n\n\t\tif (!this.bulkDragDropHelper) this.bulkDragDropHelper = new BulkDragDropHelper();\n\n\t\tvar files = _.map(_.filter(this.bulkDragDropHelper.extractFilesFromEvent(event), function (f) {\n\t\t\treturn f !== null;\n\t\t}), function (file) {\n\t\t\tfile.file = file;\n\t\t\tfile.subject = book.get(\"subject\");\n\t\t\tfile.grade = book.get(\"grade\");\n\t\t\tfile.language = book.get(\"language\");\n\t\t\treturn new Backbone.Model(file);\n\t\t});\n\n\t\tif (files.length > 0) {\n\t\t\tvar fileModel = void 0,\n\t\t\t    errorCount = 0;\n\t\t\tvar selector = this.getSelector(event);\n\t\t\tradio.trigger(App.Events.Commands.NavigationPrompt, \"Some attachments are still saving. If you leave, they will be lost. Are you sure?\");\n\n\t\t\tvar fileModels = _.map(files, function (file) {\n\t\t\t\tfileModel = _this14.bulkDragDropHelper.getResourceModel(file);\n\t\t\t\tif (_.values(fileModel.get(\"errors\")).length > 0) errorCount++;\n\t\t\t\tfileModel.set(\"fileModel\", file);\n\t\t\t\treturn fileModel;\n\t\t\t});\n\n\t\t\t// if the savequeue has invalid files, show confirm modal, else, start upload\n\t\t\tif (errorCount > 0 && errorCount !== this.saveQueue.length) {\n\t\t\t\tvar modal = new BulkResourceUploadModal({ model: new Backbone.Model({ files: fileModels, dontSave: true }) });\n\n\t\t\t\tmodal.once(\"action\", function (action, saveQueue, canceledFiles) {\n\t\t\t\t\tif (action === \"save\") {\n\t\t\t\t\t\t_this14.saveQueue = saveQueue;\n\n\t\t\t\t\t\t_.each(canceledFiles, function (file) {\n\t\t\t\t\t\t\treturn _this14.onUploadCancel(file.get(\"attachmentModel\"));\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (!_this14.currentlySaving) {\n\t\t\t\t\t\t\t_this14.setSaveQueue(saveQueue, selector);\n\t\t\t\t\t\t\t_this14.saveFiles();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tmodal.show();\n\t\t\t} else {\n\t\t\t\tthis.setSaveQueue(files, selector);\n\t\t\t\tthis.saveQueue = _.filter(this.saveQueue, function (file) {\n\t\t\t\t\treturn !file.get(\"errors\") || _.values(file.get(\"errors\")).length === 0;\n\t\t\t\t});\n\t\t\t\tthis.saveFiles();\n\t\t\t}\n\t\t}\n\n\t\tthis.finalizeDrop(event);\n\t\tthis.dragCount = 0;\n\t},\n\n\tonCancelFileDrop: function onCancelFileDrop(event) {\n\t\tevent.stopPropagation();\n\t\tthis.ui.cancelDrop.addClass(\"hide\");\n\t\tthis.dragCount = 0;\n\t\tthis.finalizeDrop(event);\n\t},\n\n\tsetSaveQueue: function setSaveQueue(files, selector) {\n\t\tvar _this15 = this;\n\n\t\tvar book = eventBus.request(eventBus.Events.GetCurrentBook);\n\t\tvar dontSave = true;\n\t\tvar fileModel = void 0,\n\t\t    attachmentModel = void 0;\n\t\tthis.saveQueue = _.merge(this.saveQueue, _.map(_.filter(files, function (file) {\n\t\t\treturn !file.get(\"saved\");\n\t\t}), function (file) {\n\t\t\tattachmentsSaving++;\n\t\t\tfileModel = file.get(\"fileModel\") ? file : _this15.bulkDragDropHelper.getResourceModel(file);\n\t\t\t// Create attachment without saving\n\t\t\tattachmentModel = _this15.createAttachmentModel(fileModel.toJSON(), null, { book: book, selector: selector }, dontSave);\n\t\t\tattachmentModel = _this15.Attachments.add(attachmentModel.toJSON());\n\n\t\t\t_this15.listenTo(fileModel, \"upload:progress\", _this15.onUploadProgress.bind(_this15, attachmentModel));\n\t\t\t_this15.listenTo(attachmentModel, \"upload:cancel\", _this15.onUploadCancel.bind(_this15, attachmentModel));\n\n\t\t\tif (_.values(fileModel.get(\"errors\")).length > 0) attachmentModel.set(\"errors\", fileModel.get(\"errors\"));\n\n\t\t\tfileModel.set(\"attachmentModel\", attachmentModel);\n\t\t\t// Show the attachment in attachment in attachment view\n\t\t\t_this15.createAttachmentView(attachmentModel);\n\n\t\t\treturn fileModel;\n\t\t}));\n\t},\n\n\tsaveFiles: function saveFiles() {\n\t\tif (this.saveQueue.length === 0) {\n\t\t\tradio.trigger(App.Events.Commands.NavigationPrompt, null);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.currentlySaving) this.currentlySaving = this.saveQueue.shift();\n\n\t\tif (_.values(this.currentlySaving.get(\"errors\")).length > 0) {\n\t\t\tthis.currentlySaving = false;\n\t\t\tattachmentsSaving--;\n\t\t\tthis.saveFiles();\n\t\t\treturn;\n\t\t}\n\n\t\tradio.trigger(App.Events.Commands.NavigationPrompt, \"Some attachments are still saving. If you leave, they will be lost. Are you sure?\");\n\t\tthis.currentlySaving.get(\"attachmentModel\").unset(\"errors\");\n\t\tthis.currentlySaving.get(\"attachmentModel\").set(\"saving\", true);\n\t\t// Save the model, uploading the file\n\t\tthis.xhr[this.currentlySaving.get(\"fileModel\").cid] = this.currentlySaving.binarySave(null, {\n\t\t\tvalidate: false,\n\t\t\twait: true,\n\t\t\tdata: this.currentlySaving.attributes,\n\t\t\tsuccess: this.saveResourceSuccess.bind(this, this.currentlySaving.get(\"attachmentModel\")),\n\t\t\terror: this.saveResourceError.bind(this, this.currentlySaving.get(\"attachmentModel\"))\n\t\t});\n\t},\n\n\tsaveResourceSuccess: function saveResourceSuccess(attachmentModel, model) {\n\t\tattachmentModel.set(\"resource\", model.get(\"_id\"));\n\t\tattachmentModel.unset(\"fileModel\");\n\t\tattachmentModel.unset(\"saving\");\n\t\tattachmentModel.unset(\"percentage\");\n\t\tattachmentsSaving--;\n\t\tthis.saveAttachment(attachmentModel, true);\n\t},\n\n\tsaveResourceError: function saveResourceError(attachmentModel, model, xhr) {\n\t\tthis.xhr[attachmentModel.cid] = null;\n\t\tattachmentModel.unset(\"saving\");\n\t\tattachmentsSaving--;\n\n\t\tif (xhr.statusText === \"abort\") {\n\t\t\tattachmentModel.set(\"errors\", { error: \"Upload suspended. Once the connection is reestablished, the upload will continue.\" });\n\t\t\tattachmentModel.trigger(\"save:error\", { retry: true, responseJSON: { info: \"Upload suspended. Once the connection is reestablished, the upload will continue.\" } });\n\t\t} else {\n\t\t\tattachmentModel.set(\"errors\", { error: xhr.responseJSON && xhr.responseJSON.info ? xhr.responseJSON.info : xhr.statusText });\n\t\t\tattachmentModel.trigger(\"save:error\", xhr);\n\t\t}\n\n\t\tif (this.wsConnected) {\n\t\t\tthis.currentlySaving = false;\n\t\t\tthis.saveFiles();\n\t\t}\n\t},\n\n\tonUploadProgress: function onUploadProgress(model, percentage) {\n\t\tmodel.trigger(\"upload:progress\", percentage, model);\n\t},\n\n\tonUploadCancel: function onUploadCancel(model) {\n\t\tvar _this16 = this;\n\n\t\tif (!model) return;\n\n\t\t//Remove the canceled attachment\n\t\tthis.removeAttachmentView(model, model.get(\"selector\"));\n\t\t//this.Attachments.remove(model);\n\t\tattachmentsSaving--;\n\n\t\t// remove currentlySaving from this.saveQueue\n\t\tif (this.currentlySaving) this.saveQueue = _.reject(this.saveQueue, function (file) {\n\t\t\treturn file.cid === _this16.currentlySaving.cid;\n\t\t});\n\n\t\tif (this.saveQueue.length === 0) {\n\t\t\t$(\".attachment-icon.busy .spinner-icon\").addClass(\"hide\");\n\t\t\t$(\".attachment-icon.busy\").removeClass(\"busy\");\n\t\t\tradio.trigger(App.Events.Commands.NavigationPrompt, null);\n\t\t}\n\n\t\t// Abort communication with the server if item is in progress\n\t\tif (this.currentlySaving && this.xhr[this.currentlySaving.get(\"fileModel\").cid]) {\n\t\t\tthis.xhr[this.currentlySaving.get(\"fileModel\").cid].abort();\n\t\t\tthis.currentlySaving = false;\n\n\t\t\t// Revert any changes made to the model\n\t\t\tif (this.oldAttributes) this.model.set(this.oldAttributes, { validate: false });\n\t\t}\n\n\t\tif (!this.currentlySaving) {\n\t\t\tthis.currentlySaving = false;\n\t\t\tthis.saveFiles();\n\t\t}\n\t},\n\n\tonAttachmentDeleterMouseEnter: function onAttachmentDeleterMouseEnter(event) {\n\t\tthis.onAttachmentDeleterMouseOver(event);\n\t},\n\n\tonAttachmentDeleterMouseOver: function onAttachmentDeleterMouseOver(event) {\n\t\tthis.ui.highlightBar.addClass(\"hide\");\n\t\tthis.ui.attachmentDeleter.addClass(\"attachment-bin-highlighted\");\n\n\t\tevent.preventDefault();\n\t},\n\n\tonAttachmentDeleterMouseLeave: function onAttachmentDeleterMouseLeave() {\n\t\tthis.ui.attachmentDeleter.removeClass(\"attachment-bin-highlighted\");\n\t\tthis.ui.highlightBar.removeClass(\"hide\");\n\t},\n\n\tonAttachmentDeleted: function onAttachmentDeleted(model) {\n\t\tthis.lowlightAttachmentElement();\n\n\t\tthis.DeletedAttachments.add(model);\n\t\tthis.Attachments.remove(model);\n\t},\n\n\tonDeletedAttachmentAdded: function onDeletedAttachmentAdded() {\n\t\teventBus.trigger(eventBus.Events.ShowAttachmentBin);\n\t},\n\n\tonDeletedAttachmentRemoved: function onDeletedAttachmentRemoved() {\n\t\tif (this.DeletedAttachments.length === 0) eventBus.trigger(eventBus.Events.HideAttachmentBin);\n\t},\n\n\tonDeletedAttachmentsReset: function onDeletedAttachmentsReset() {\n\t\teventBus.trigger(eventBus.Events.HideAttachmentBin);\n\t},\n\n\tshowAttachmentBinContents: function showAttachmentBinContents() {\n\t\tvar _this17 = this;\n\n\t\tvar modal = new AttachmentRecoveryModal({ deletedAttachments: this.DeletedAttachments });\n\n\t\tmodal.on(\"recover\", function (model) {\n\t\t\tvar originalAttachment = _this17.DeletedAttachments.get(model.get(\"_id\"));\n\t\t\t_this17.createAttachmentView(originalAttachment);\n\t\t\t_this17.DeletedAttachments.remove(originalAttachment);\n\t\t\t_this17.Attachments.add(originalAttachment);\n\t\t});\n\n\t\tmodal.show({});\n\t},\n\n\thighlightAttachmentElement: function highlightAttachmentElement(selector) {\n\t\tif (!this.ui.book.get) return;\n\n\t\tif (this.format === \"mpub\") {\n\t\t\tvar element = this.resolveDOMSelector(selector);\n\n\t\t\tthis.recordElementBorder(element);\n\t\t\tthis.setElementBorder(element);\n\t\t} else {\n\t\t\tthis.ui.highlightBar.css({ top: (parseFloat(selector) * this.contentHeight * 0.01).toFixed(2) - this.ui.book.get(0).scrollTop }).removeClass(\"hide\");\n\t\t}\n\t},\n\n\tlowlightAttachmentElement: function lowlightAttachmentElement() {\n\t\tif (!this.ui.highlightBar.addClass) return;\n\n\t\tif (this.format === \"mpub\") this.restorePreviousElementBorder();else this.ui.highlightBar.addClass(\"hide\");\n\t},\n\n\twsConnected: function wsConnected() {\n\t\tthis.wsConnected = true;\n\n\t\tif (this.saveQueue && (this.saveQueue.length > 0 || this.currentlySaving)) {\n\t\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\t\tcontent: \"The connection has been reestablished.\",\n\t\t\t\ticon: \"fa-wifi\",\n\t\t\t\ticonColour: \"green\",\n\t\t\t\thost: \"#modals\"\n\t\t\t});\n\n\t\t\t// Continue uploads if any\n\t\t\tthis.ConnectionErrorDialog.destroy();\n\n\t\t\tthis.saveFiles();\n\t\t}\n\t},\n\n\twsDisconnected: function wsDisconnected() {\n\t\tthis.wsConnected = false;\n\n\t\tif (this.saveQueue && (this.saveQueue.length > 0 || this.currentlySaving)) {\n\t\t\tif (this.currentlySaving && this.xhr[this.currentlySaving.get(\"fileModel\").cid]) {\n\t\t\t\tthis.xhr[this.currentlySaving.get(\"fileModel\").cid].abort();\n\n\t\t\t\t// re-add this.currentlySaving to saveQueue\n\t\t\t\tthis.saveQueue.unshift(this.currentlySaving);\n\t\t\t\tthis.currentlySaving = false;\n\t\t\t}\n\n\t\t\tthis.ConnectionErrorDialog = new SmallModal({\n\t\t\t\ttitle: \"<span class='fal fa-times-circle'/> Error\",\n\t\t\t\tbody: \"<p>Connectivity lost. The upload has been suspended.</p>\\n\\t\\t\\t\\t\\t<p>Unfinished uploads will continue once the connection has been reestablished.</p>\",\n\t\t\t\thost: \"#modals\",\n\t\t\t\thideButtons: [\"close\"],\n\t\t\t\twarning: true\n\t\t\t});\n\n\t\t\tthis.ConnectionErrorDialog.show();\n\t\t}\n\t},\n\n\tdisableResourceButton: function disableResourceButton() {\n\t\tthis.uploadAllowed = false;\n\t},\n\n\tenableResourceButton: function enableResourceButton() {\n\t\tthis.uploadAllowed = true;\n\t}\n});\n\nvar BookMetadata = Backbone.Model.extend({\n\tdefaults: {},\n\turl: function url() {\n\t\tvar book = eventBus.request(eventBus.Events.GetCurrentBook);\n\t\treturn settings.urlRoot + \"/acacia/epub/create/\" + book.id;\n\t}\n});\n\nvar EpubNavigator = Backbone.Model.extend({\n\tdefaults: {},\n\tinitialize: function initialize(options) {\n\t\tthis.pages = {};\n\n\t\tthis.book = options.book;\n\t\tthis.resolver = options.resolver;\n\n\t\tthis.links = options.book.get(\"documents\");\n\n\t\tvar navVersion = eventBus.request(eventBus.Events.GetNavVersion);\n\n\t\tthis.BaseURL = settings.urlRoot + \"/acacia/epub/files/\" + navVersion + \"/\" + (options.book.get(\"overrideMime\") ? \"1\" : \"0\") + \"/\" + options.book.get(\"id\") + \"/\" + options.book.get(\"basePath\") + \"/\";\n\n\t\tthis.LinkIndex = 0;\n\t\tthis.startLocation = options.startLocation;\n\t\tthis.startHash = options.startHash;\n\n\t\tthis.hasLocalStorage = _.includes(document.getElementsByTagName(\"html\")[0].className.split(\" \"), \"localstorage\");\n\n\t\tthis.listenTo(eventBus, eventBus.Events.PageChange, this.pageChange.bind(this));\n\t},\n\n\tpageChange: function pageChange(p) {\n\t\t// Figure out where this page is and go there\n\t\tif (!this.book.get(\"pages\")) return;\n\n\t\tvar page = _.find(this.book.get(\"pages\"), function (item) {\n\t\t\treturn item.page.toString() === p.toString();\n\t\t});\n\t\tif (!page || !this.get(\"url\")) return console.warn(\"Unable to find matching page:\", p);\n\n\t\t// If we are on this page, we need to find the appropriate element and jump to it.\n\t\tvar url = this.get(\"url\");\n\t\turl = url.replace(/\\[up\\]/g, \"../\").replace(/\\[current\\]/g, \"./\");\n\n\t\tif (_.includes(url.split(\"#\")[0], page.file)) {\n\t\t\tdelete this.pendingPage;\n\t\t\tvar pData = _.find(this.pages[page.file], function (item) {\n\t\t\t\treturn item.page === page.page;\n\t\t\t});\n\t\t\tif (pData && pData.offset) this.set(\"offset\", pData.offset.top + 10);\n\t\t} else {\n\t\t\t// Else we need to first navigate to the file, then repeat this operation once we've navigated\n\t\t\tthis.pendingPage = p;\n\t\t\tthis.setURL(page.file);\n\t\t}\n\t},\n\n\tsetURL: function setURL(page, offset, force, silent) {\n\t\tvar url = page.replace(/\\.\\.\\//, \"[up]\").replace(/\\.\\//, \"[current]\");\n\n\t\tthis.set(\"url\", this.BaseURL + url, { silent: silent });\n\t\t// We only set the offset if there is no hash and the offset > 0\n\t\t// Else we break anchors\n\t\tif ((offset || force) && !page.split(\"#\")[1]) this.set(\"offset\", offset);\n\n\t\tthis.LinkIndex = _.indexOf(this.links, page.split(\"#\")[0]);\n\t},\n\n\tnavigateStart: function navigateStart() {\n\t\tvar page = null,\n\t\t    offset = 0,\n\t\t    payload = void 0;\n\n\t\tif (this.hasLocalStorage) {\n\t\t\tpayload = window.localStorage.getItem(\"bookPosition:\" + this.book.get(\"id\"));\n\t\t\tif (payload) payload = JSON.parse(payload);\n\t\t}\n\n\t\t// If an explicit start location was provided, we use that.\n\t\tif (this.startLocation && this.startLocation !== \"null\") page = this.startLocation + (this.startHash ? \"#\" + this.startHash.replace(/\\#/gi, \"\") : \"\");\n\n\t\t// If we have a stored payload for this book, use that as well\n\t\tif (payload) {\n\t\t\tif ((!this.startLocation || this.startLocation === \"null\") && payload.page) page = payload.page + (payload.hash ? \"#\" + payload.hash.replace(/\\#/gi, \"\") : \"\");\n\t\t\toffset = payload.offset;\n\t\t}\n\n\t\t// Finally check for invalid pages\n\t\tif (!page) page = this.links[0];\n\n\t\tthis.setURL(page, offset);\n\t},\n\n\tpollNavigatePrevious: function pollNavigatePrevious() {\n\t\treturn this.LinkIndex > 0;\n\t},\n\n\tpollNavigateNext: function pollNavigateNext() {\n\t\treturn this.LinkIndex < this.links.length - 1;\n\t},\n\n\tnavigatePrevious: function navigatePrevious() {\n\t\tif (this.pollNavigatePrevious()) this.setURL(this.links[this.LinkIndex - 1], 999999999);\n\t},\n\n\tnavigateNext: function navigateNext() {\n\t\tif (this.pollNavigateNext()) this.setURL(this.links[this.LinkIndex + 1], 0, true);\n\t},\n\n\tnavigateToSection: function navigateToSection(section) {\n\t\tthis.setURL(section, 0);\n\t},\n\n\tsynchronize: function synchronize(_section, _offset) {\n\t\tvar _this18 = this;\n\n\t\t// Figure out what page we are on, and calculate the position of the page breaks in it\n\t\tvar thisPage = _section.split(\"#\")[0].replace(/\\[up\\]/g, \"../\").replace(/\\[current\\]/g, \"./\");\n\n\t\tif (!this.pages[thisPage]) {\n\t\t\tthis.pages[thisPage] = _.reduce(_.filter(this.book.get(\"pages\"), function (item) {\n\t\t\t\treturn item.file === thisPage;\n\t\t\t}), function (sum, num) {\n\t\t\t\tvar el = _this18.resolver(num.selector);\n\t\t\t\tif (el) sum[num.page] = { page: num.page, el: el, offset: el.offset() };\n\t\t\t\treturn sum;\n\t\t\t}, {});\n\t\t}\n\n\t\t// If we jumped to the current page as part of a page change, move to the exact offset now\n\t\tif (this.pendingPage) return this.pageChange(this.pendingPage);\n\n\t\tvar offset = _offset || 0;\n\n\t\tvar section = _section.split(\"#\");\n\t\tvar hash = section[1] || \"\";\n\t\tsection = section[0];\n\n\t\tthis.LinkIndex = _.indexOf(this.links, thisPage);\n\n\t\tif (!section) section = \"\";\n\n\t\tvar payload = {\n\t\t\tpage: section,\n\t\t\toffset: offset,\n\t\t\thash: hash\n\t\t};\n\n\t\tif (this.hasLocalStorage) window.localStorage.setItem(\"bookPosition:\" + this.book.get(\"id\"), JSON.stringify(payload));\n\n\t\t// Sync the current page value\n\t\tvar page = _.findLast(this.pages[thisPage], function (item) {\n\t\t\treturn item.offset && item.offset.top < offset;\n\t\t});\n\n\t\tif (!page) {\n\t\t\t// Roman numeral to integer converter blatantly snatched from: http://blog.stevenlevithan.com/archives/javascript-roman-numeral-converter\n\t\t\tvar romanToInt = function romanToInt(romanString) {\n\t\t\t\tvar str = romanString.toUpperCase();\n\t\t\t\tvar validator = /^M*(?:D?C{0,3}|C[MD])(?:L?X{0,3}|X[CL])(?:V?I{0,3}|I[XV])$/;\n\t\t\t\tvar token = /[MDLV]|C[MD]?|X[CL]?|I[XV]?/g;\n\t\t\t\tvar key = { M: 1000, CM: 900, D: 500, CD: 400, C: 100, XC: 90, L: 50, XL: 40, X: 10, IX: 9, V: 5, IV: 4, I: 1 };\n\t\t\t\tvar num = 0;\n\t\t\t\tvar m = void 0;\n\n\t\t\t\tif (!(str && validator.test(str))) return NaN;\n\n\t\t\t\tm = token.exec(str);\n\t\t\t\twhile (m) {\n\t\t\t\t\tnum += key[m[0]];\n\t\t\t\t\tm = token.exec(str);\n\t\t\t\t}\n\n\t\t\t\treturn num;\n\t\t\t};\n\n\t\t\tvar minPageNumber = void 0;\n\n\t\t\tif (_.keys(this.pages[thisPage]).length === 0) {\n\t\t\t\tminPageNumber = { pageNumber: null };\n\t\t\t} else {\n\t\t\t\tminPageNumber = _.minBy(_.map(this.pages[thisPage], function (v, k) {\n\t\t\t\t\tvar pageNumber = parseInt(k, 10);\n\n\t\t\t\t\tif (_.isNaN(pageNumber)) pageNumber = romanToInt(k);\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tpageNumber: _.isNaN(pageNumber) ? k : pageNumber,\n\t\t\t\t\t\toriginalPageNumber: k\n\t\t\t\t\t};\n\t\t\t\t}), function (p) {\n\t\t\t\t\treturn p.pageNumber || p.originalPageNumber;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tpage = minPageNumber && minPageNumber.pageNumber ? this.pages[thisPage][minPageNumber.originalPageNumber] : undefined;\n\t\t}\n\n\t\tif (page) eventBus.trigger(eventBus.Events.SetPage, page.page);\n\t}\n});\n\nvar PdfNavigator = Backbone.Model.extend({\n\tdefaults: {},\n\tinitialize: function initialize(options) {\n\t\tthis.book = options.book;\n\n\t\tthis.page = 1;\n\t\tthis.startLocation = options.startLocation;\n\t\tthis.startHash = options.startHash;\n\n\t\tthis.hasLocalStorage = _.includes(document.getElementsByTagName(\"html\")[0].className.split(\" \"), \"localstorage\");\n\n\t\tthis.listenTo(eventBus, eventBus.Events.PageChange, this.setURL.bind(this));\n\t},\n\n\tsetURL: function setURL(page, offset, force) {\n\t\tthis.set(\"url\", parseInt(page, 10));\n\t\tif (offset || force) this.set(\"offset\", offset);\n\n\t\teventBus.trigger(eventBus.Events.SetPage, parseInt(page, 10));\n\t},\n\n\tnavigateStart: function navigateStart() {\n\t\tvar page = null,\n\t\t    offset = 0,\n\t\t    payload = void 0;\n\n\t\tif (this.hasLocalStorage) {\n\t\t\tpayload = window.localStorage.getItem(\"bookPosition:\" + this.book.get(\"id\"));\n\t\t\tif (payload) payload = JSON.parse(payload);\n\t\t}\n\n\t\t// If an explicit start location was provided, we use that.\n\t\tif (this.startLocation && this.startLocation !== \"null\") page = this.startLocation;\n\n\t\t// If we have a stored payload for this book, use that as well\n\t\tif (payload) {\n\t\t\tif ((!this.startLocation || this.startLocation === \"null\") && payload.page) page = payload.page;\n\t\t\toffset = payload.offset;\n\t\t}\n\n\t\t// Finally check for invalid pages\n\t\tif (!page) page = 1;\n\n\t\tthis.setURL(page, offset);\n\t\tthis.synchronize(page, offset);\n\t},\n\n\tpollNavigatePrevious: function pollNavigatePrevious() {\n\t\treturn this.page > 1;\n\t},\n\n\tpollNavigateNext: function pollNavigateNext() {\n\t\treturn this.page < this.book.get(\"totalPages\");\n\t},\n\n\tnavigatePrevious: function navigatePrevious() {\n\t\tif (this.pollNavigatePrevious()) this.setURL(this.page - 1, 999999999);\n\t},\n\n\tnavigateNext: function navigateNext() {\n\t\tif (this.pollNavigateNext()) this.setURL(this.page + 1, 0, true);\n\t},\n\n\tnavigateToSection: function navigateToSection(section) {\n\t\tthis.setURL(section, 0);\n\t},\n\n\tsynchronize: function synchronize(_section, _offset) {\n\t\tvar offset = _offset || 0;\n\t\tvar section = _section;\n\n\t\tif (!section) section = 1;\n\n\t\tthis.page = parseInt(section, 10);\n\t\tthis.set(\"url\", this.page);\n\n\t\tvar payload = {\n\t\t\tpage: section,\n\t\t\toffset: offset\n\t\t};\n\n\t\tif (this.hasLocalStorage) window.localStorage.setItem(\"bookPosition:\" + this.book.get(\"id\"), JSON.stringify(payload));\n\t}\n});\n\n// ----------------------------------------------------------------------------\n\nvar Attachment = Backbone.Model.extend({\n\tdefaults: {},\n\tidAttribute: \"_id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/attachments\";\n\t},\n\n\tisOld: function isOld() {\n\t\treturn settings.annualContent && moment.unix(this.get(\"created\")).isBefore(moment.unix(App.currentYear({ unix: true })));\n\t},\n\n\tisForeign: function isForeign() {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\t\tif (rester.hasAccess(rester.p.groups.all, user)) return false;\n\n\t\tvar allowed = eventBus.request(eventBus.Events.GetAllowedGroups);\n\n\t\tif (_.keys(allowed.system).length === 0) return this.get(\"groups\") !== null && this.get(\"groups\").length !== 0;\n\n\t\treturn _.intersection(_.keys(allowed.system).concat(_.keys(allowed.custom)), this.get(\"groups\") || []).length === 0;\n\t},\n\n\tisShared: function isShared() {\n\t\tvar allowed = eventBus.request(eventBus.Events.GetAllowedGroups);\n\n\t\tif (_.keys(allowed.system).length === 0 && _.keys(allowed.custom).length === 0) return false;\n\n\t\t// To be shared, the attachment must have at least one group that is still assigned to this book, and not owned by the viewer\n\t\treturn _.some(this.get(\"groups\") || [], function (item) {\n\t\t\tif (!(item in allowed.all)) return false;\n\n\t\t\treturn !(item in allowed.system) && !(item in allowed.custom);\n\t\t});\n\t}\n});\n\nvar AttachmentCollection = Backbone.Collection.extend({\n\tmodel: Attachment,\n\n\turl: function url() {\n\t\tvar book = eventBus.request(eventBus.Events.GetCurrentBook);\n\t\treturn settings.urlRoot + \"/api/1.0/attachments/books/\" + book.get(\"_id\");\n\t}\n});\n\nvar DeletedAttachmentCollection = Backbone.Collection.extend({\n\tmodel: Attachment\n});\n\nvar AttachmentDetailView = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"attachment-details\",\n\n\ttemplate: require(\"../../templates/console/book-view.nunj\").description,\n\n\tui: {\n\t\tpreview: \".preview\",\n\t\tactionFindResource: \"#action-find-resource\",\n\t\tactionSelectGroups: \"#action-select-groups\",\n\t\tactionOpenResource: \"#action-open-resource\",\n\t\tactionClone: \"#action-clone\",\n\t\tactionResourceOpenedBy: \"#action-resource-opened-by\",\n\t\tcloneable: \".status.clone\",\n\t\tshared: \".status.share\",\n\t\tshowCode: \".show-code\",\n\t\tshowTippy: \".show-tippy\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.preview\": \"onActionOpenResource\",\n\t\t\"click @ui.actionFindResource\": \"onActionFindResource\",\n\t\t\"click @ui.actionSelectGroups\": \"onActionSelectGroups\",\n\t\t\"click @ui.actionOpenResource\": \"onActionOpenResource\",\n\t\t\"click @ui.actionResourceOpenedBy\": \"onActionResourceOpenedBy\",\n\t\t\"click @ui.cloneable\": \"onActionClone\",\n\t\t\"click @ui.shared\": \"onActionShared\",\n\n\t\t\"click @ui.showCode\": \"showCode\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tisOld: this.AttachmentModel.isOld(),\n\t\t\tisForeign: this.AttachmentModel.isForeign(),\n\t\t\tisShared: this.AttachmentModel.isShared()\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tif (options.attachmentModel.get(\"title\") === null) {\n\t\t\tthis.model = new Resource({\n\t\t\t\ttitle: \"[Content Deleted]\"\n\t\t\t});\n\t\t} else {\n\t\t\tthis.model = new Resource({\n\t\t\t\ttitle: options.attachmentModel.get(\"title\"),\n\t\t\t\tsubject_name: options.attachmentModel.get(\"subject_name\"),\n\t\t\t\tgrade: options.attachmentModel.get(\"grade\"),\n\t\t\t\tlanguage: options.attachmentModel.get(\"language\"),\n\t\t\t\t_id: options.attachmentModel.get(\"resource\"),\n\t\t\t\tcategory: options.attachmentModel.get(\"category\"),\n\t\t\t\tbaseCode: options.attachmentModel.get(\"baseCode\"),\n\t\t\t\ttext: options.attachmentModel.get(\"text\"),\n\t\t\t\turl: options.attachmentModel.get(\"url\")\n\t\t\t});\n\t\t}\n\n\t\tthis.AttachmentModel = options.attachmentModel;\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.enableAction(this.ui.actionFindResource);\n\n\t\tif (!this.AttachmentModel.isOld() && !this.AttachmentModel.isForeign()) {\n\t\t\tif ((this.AttachmentModel.get(\"groups\") || []).length) this.enableAction(this.ui.actionSelectGroups);else this.disableAction(this.ui.actionSelectGroups);\n\t\t}\n\n\t\tthis.loadPreview();\n\n\t\tif (this.model.get(\"category\") === \"assessment\" && this.model.has(\"baseCode\") && (this.AttachmentModel.get(\"settings\") || { code: \"\" }).code) this.ui.showCode.removeClass(\"hide\");\n\n\t\tthis.ui.showTippy.each(function (i, el) {\n\t\t\ttippy(el, {\n\t\t\t\ttheme: \"black\",\n\t\t\t\tplacement: \"left\",\n\t\t\t\tarrow: true,\n\t\t\t\tcontent: $(el).attr(\"data-title\")\n\t\t\t});\n\t\t});\n\t},\n\n\tenableAction: function enableAction(element) {\n\t\telement.removeClass(\"hide\");\n\t},\n\n\tdisableAction: function disableAction(element) {\n\t\telement.addClass(\"hide\");\n\t},\n\n\tonActionFindResource: function onActionFindResource(event) {\n\t\tevent.stopPropagation();\n\n\t\teventBus.trigger(eventBus.Events.OpenResources);\n\t\teventBus.trigger(eventBus.Events.FindResource, this.model);\n\t},\n\n\tonActionSelectGroups: function onActionSelectGroups() {\n\t\tvar _this19 = this;\n\n\t\tvar gm = new GroupModal({\n\t\t\tcurrentGroups: this.AttachmentModel.get(\"groups\"),\n\t\t\tforAttachment: true\n\t\t});\n\n\t\tgm.show({\n\t\t\tok: function ok(result) {\n\t\t\t\t_this19.AttachmentModel.save({\n\t\t\t\t\tgroups: result.values,\n\t\t\t\t\tbook: _this19.AttachmentModel.get(\"book\")\n\t\t\t\t}, { patch: true });\n\t\t\t}\n\t\t});\n\t},\n\n\tonActionOpenResource: function onActionOpenResource() {\n\t\tswitch (this.model.get(\"category\")) {\n\t\t\tcase \"text\":\n\t\t\tcase \"onenote\":\n\t\t\tcase \"googledrive\":\n\t\t\tcase \"url\":\n\t\t\t\t{\n\t\t\t\t\tvar text = \"\";\n\t\t\t\t\tif (this.model.has(\"text\")) text = this.model.get(\"text\").replace(/\\n/g, \"<br/>\");else text = \"<a target='_blank' href=\\\"\" + this.model.get(\"url\") + \"\\\">\" + this.model.get(\"url\") + \"</a>\";\n\n\t\t\t\t\tvar confirm = new SmallModal({\n\t\t\t\t\t\tcustomOK: \"Close\",\n\t\t\t\t\t\thideButtons: [\"cancel\"],\n\t\t\t\t\t\tbody: text,\n\t\t\t\t\t\ttitle: \"Viewing Resource: \" + this.model.get(\"title\").replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t\t\t\t})\n\t\t\t\t\t});\n\t\t\t\t\tconfirm.show();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\tcase \"image\":\n\t\t\t\tnew LightBox({\n\t\t\t\t\thost: $(\"#link-resources\"),\n\t\t\t\t\timage: settings.urlRoot + \"/api/1.0/resources/\" + this.model.id + \"/data\"\n\t\t\t\t}).show();\n\t\t\t\tbreak;\n\n\t\t\tcase \"assessment\":\n\t\t\t\tnew AssessmentModal({\n\t\t\t\t\tmodel: new Assessment(this.model.toJSON()),\n\t\t\t\t\tpreviewMode: true,\n\t\t\t\t\trestart: true\n\t\t\t\t}).show({});\n\n\t\t\t\tbreak;\n\n\t\t\tcase \"flashcarddeck\":\n\t\t\t\tnew FlashcardPreview({\n\t\t\t\t\tmodel: this.model\n\t\t\t\t}).show();\n\t\t\t\tbreak;\n\n\t\t\tcase \"video\":\n\t\t\tcase \"audio\":\n\t\t\tcase \"pdf\":\n\t\t\tcase \"excel\":\n\t\t\tcase \"word\":\n\t\t\tcase \"powerpoint\":\n\t\t\t\twindow.open(settings.urlRoot + \"/api/1.0/resources/\" + this.model.id + \"/data\");\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"Unknown resource type to open: \" + this.model.get(\"category\"));\n\t\t}\n\t},\n\n\tonActionClone: function onActionClone(e) {\n\t\te.stopPropagation();\n\t\teventBus.trigger(\"attachment:rejuvenate\", this.AttachmentModel);\n\t},\n\n\tonActionShared: function onActionShared() {\n\t\tvar modal = new SmallModal({\n\t\t\ttitle: \"<span class='fal fa-share-alt'/> Shared Attachment\",\n\t\t\tbody: \"<p>This attachment is shared, which means that it is also used in groups that you do not have access to. You cannot alter shared attachments.</p>\",\n\t\t\thost: \"#link-resources\",\n\t\t\thideButtons: [\"cancel\"]\n\t\t});\n\t\tmodal.show();\n\t},\n\n\t// TOUCHPOINT: RESOURCE TYPE\n\tloadPreview: function loadPreview() {\n\t\tswitch (this.AttachmentModel.get(\"resourceType\")) {\n\t\t\tcase \"onenote\":\n\t\t\tcase \"googledrive\":\n\t\t\tcase \"url\":\n\t\t\t\tthis.ui.preview.text(this.model.get(\"url\"));\n\t\t\t\tbreak;\n\t\t\tcase \"image\":\n\t\t\tcase \"pdf\":\n\t\t\tcase \"video\":\n\t\t\t\treturn this.ui.preview.css({\n\t\t\t\t\t\"background-image\": \"url('\" + settings.urlRoot + \"/api/1.0/resources/\" + this.AttachmentModel.get(\"resource\") + \"/preview')\"\n\t\t\t\t});\n\n\t\t\tcase \"text\":\n\t\t\t\tthis.ui.preview.text(this.model.get(\"text\"));\n\t\t\t\tbreak;\n\n\t\t\tcase \"assessment\":\n\t\t\t\tthis.ui.preview.text(this.AttachmentModel.has(\"settings\") ? this.AttachmentModel.get(\"settings\").title : \"\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"flashcarddeck\":\n\t\t\t\tthis.ui.preview.text(this.model.get(\"title\"));\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\treturn; //throw new Error(\"Unknown resource type to preview\");\n\t\t}\n\t},\n\n\tshowCode: function showCode() {\n\t\tvar code = this.model.get(\"baseCode\").toLowerCase();\n\t\tcode = parseInt(code, 16);\n\n\t\tvar xor = parseInt(this.AttachmentModel.get(\"settings\").code, 16);\n\n\t\tvar realCode = (code ^ xor).toString(16).toLowerCase();\n\t\twhile (realCode.length < 6) {\n\t\t\trealCode = \"0\" + realCode;\n\t\t}var modal = new SmallModal({\n\t\t\ttitle: \"<span class='fal fa-key'/> Assessment Activation Code\",\n\t\t\tbody: \"<p>This is the code to activate this specific assessment instance:</p>\\n\\t\\t\\t\\t<p style='letter-spacing: 1.5em; font-size: 1.7em; text-transform: uppercase; text-align: center; background-color: #EEE; border-radius: 3px; color: #000'>\" + realCode + \"</p>\",\n\t\t\thideButtons: [\"cancel\"],\n\t\t\thost: \"#link-resources\"\n\t\t});\n\n\t\tmodal.show();\n\t},\n\n\tonActionResourceOpenedBy: function onActionResourceOpenedBy() {\n\t\tvar resourceOpenedModal = new ResourceOpenedModal({ resource: this.model.get(\"_id\"), attachment: this.AttachmentModel.get(\"_id\"), type: \"book\" });\n\n\t\tresourceOpenedModal.show();\n\t}\n});\n\nvar AttachmentProgressView = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"uploading-row\",\n\n\ttemplate: require(\"../../templates/console/book-view.nunj\").attachmentProgress,\n\n\tui: {\n\t\terrorButton: \".error-btn\",\n\t\tcancelButton: \".cancel-btn\",\n\t\tcompletedButton: \".completed-btn\",\n\t\tprogressBar: \".upload-progress .progress-bar\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.cancelButton\": \"onCancelClick\",\n\t\t\"click @ui.completedButton\": \"onCompletedClick\"\n\t},\n\n\tmodelEvents: {\n\t\t\"upload:progress\": \"onUploadProgress\",\n\t\t\"save:success\": \"uploadSuccess\",\n\t\t\"save:error\": \"uploadError\",\n\t\t\"change:errors\": \"onErrorsChange\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tcontentIcons: settings.contentIcons,\n\t\t\tsingleIcon: App.mapResourceToIcon(this.model.get(\"category\"))\n\t\t};\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.bindEvents(this.model, this.modelEvents);\n\t\tthis.percentage = 0;\n\t},\n\n\tonRender: function onRender() {\n\t\tif (this.model.get(\"saved\")) {\n\t\t\tthis.ui.progressBar.css({ width: \"100%\" });\n\t\t\tthis.uploadSuccess();\n\t\t}\n\n\t\tif (this.model.has(\"percentage\")) this.ui.progressBar.css({ width: this.model.get(\"percentage\") + \"%\" });\n\n\t\tthis.onErrorsChange();\n\t},\n\n\tonCompletedClick: function onCompletedClick(event) {\n\t\tevent.stopPropagation();\n\t},\n\n\tonCancelClick: function onCancelClick(event) {\n\t\tevent.stopPropagation();\n\t\tthis.model.trigger(\"upload:cancel\", this.model);\n\t\tthis.destroy();\n\t},\n\n\tonUploadProgress: function onUploadProgress(percentage) {\n\t\tif (this.percentage <= percentage) {\n\t\t\tthis.ui.progressBar.animate({ width: percentage + \"%\" });\n\t\t\tthis.percentage = percentage;\n\t\t\tthis.model.set(\"percentage\", percentage);\n\t\t}\n\t},\n\n\tuploadSuccess: function uploadSuccess() {\n\t\tthis.ui.progressBar.animate({ width: \"100%\" });\n\t\tthis.ui.progressBar.addClass(\"hide\");\n\t\tthis.ui.cancelButton.addClass(\"hide\");\n\t\tthis.ui.completedButton.removeClass(\"hide\");\n\t},\n\n\tuploadError: function uploadError() {\n\t\tthis.ui.progressBar.css({ width: \"0%\" });\n\t},\n\n\tonErrorsChange: function onErrorsChange() {\n\t\tif (this.model.get(\"errors\") && _.values(this.model.get(\"errors\")).length > 0) {\n\t\t\tthis.ui.cancelButton.addClass(\"hide\");\n\t\t\tthis.ui.completedButton.addClass(\"hide\");\n\t\t\tthis.ui.errorButton.removeClass(\"hide\").attr(\"title\", _.values(this.model.get(\"errors\")).join(\". \"));\n\t\t}\n\t}\n});\n\nvar AttachmentsUploadView = Backbone.Marionette.CollectionView.extend({\n\ttagName: \"div\",\n\tclassName: \"attachment-list\",\n\n\tchildView: AttachmentProgressView,\n\n\ttemplate: false\n});\n\nvar CompoundAttachmentView = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"attachment\",\n\n\ttemplate: require(\"../../templates/console/book-view.nunj\").attachment,\n\n\tui: {\n\t\ticon: \".attachment-icon\",\n\t\tspinner: \".spinner-icon\",\n\t\tageIcon: \".age\",\n\t\tnationalityIcon: \".nationality\",\n\t\tsharedIcon: \".shared\",\n\t\tvisibleIcon: \".visible\",\n\t\tlockedIcon: \".locked\",\n\t\thighlightOverlay: \"div.highlight-overlay\",\n\t\terrorIcon: \".error\"\n\t},\n\n\tevents: {\n\t\tmouseover: \"onMouseOver\",\n\t\tmouseout: \"onMouseOut\",\n\t\tmousedown: \"onMouseDown\",\n\t\t\"animationend @ui.highlightOverlay\": \"onHighlightOverlayAnimationEnd\",\n\t\t\"click @ui.errorIcon\": \"onErrorClick\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tvar _this20 = this;\n\n\t\tthis.listenTo(eventBus, \"attachments:delete:\" + this.cid, this.deleteSelf.bind(this));\n\t\tif (this.isPartOf()) {\n\t\t\t// A part-of attachment view keeps its attachment collection private; its underlying model is already\n\t\t\t// exposed through the compound attachment to which the part-of attachment belongs\n\t\t\tthis.AttachmentCollection = new AttachmentCollection();\n\t\t\tthis.AttachmentCollection.add(this.model);\n\n\t\t\t// Listen for events to control when a part-of attachment view should be highlighted while its details\n\t\t\t// tooltip is displayed by the compound attachment to which it belongs\n\t\t\tthis.listenTo(this.model, \"highlight\", this.highlight);\n\t\t\tthis.listenTo(this.model, \"lowlight\", this.lowlight);\n\t\t} else {\n\t\t\t// A single (or compound) attachment view receives its attachment collection from the attachment\n\t\t\t// container view\n\t\t\tthis.AttachmentCollection = options.attachmentCollection;\n\n\t\t\t// Listen for changes to the collection caused by a user dragging attachments into the compound attachment\n\t\t\t// or removing attachments from the compound attachment\n\t\t\tthis.AttachmentCollection.on(\"add\", this.onAttachmentAdded, this);\n\t\t\tthis.AttachmentCollection.on(\"remove\", this.onAttachmentRemoved, this);\n\t\t\tthis.AttachmentCollection.on(\"reset\", this.onAttachmentsReset, this);\n\n\t\t\t// Listen for upload events\n\t\t\tthis.AttachmentCollection.on(\"save:error\", this.uploadError, this);\n\t\t\tthis.AttachmentCollection.on(\"change:errors\", this.onErrorsChange, this);\n\n\t\t\t// Listen for tooltip requests by the attachments that are part of this compound attachment\n\t\t\tthis.AttachmentCollection.on(\"tooltip:show\", this.showTooltip, this);\n\n\t\t\t// Hide open tooltips when the attachment container view is scrolled\n\t\t\tthis.listenTo(eventBus, \"attachments:scroll\", this.hideTooltips);\n\t\t}\n\n\t\t// Listen for sync as well as jump-focus events\n\t\tthis.AttachmentCollection.each(function (model) {\n\t\t\t_this20.addSyncListeners(model);\n\t\t\t_this20.addFocusListener(model);\n\t\t});\n\n\t\t// Hide open tooltips\n\t\t$(window).click(function (event) {\n\t\t\tvar eventTarget = $(event.target);\n\n\t\t\tif (!$(_this20.ui.icon).is(eventTarget)) {\n\t\t\t\tif (_this20.isCompound() && _this20.AttachmentTooltip) {\n\t\t\t\t\tif (!_this20.AttachmentTooltip.view.children.find(function (view) {\n\t\t\t\t\t\treturn $(view.ui.icon).is(eventTarget);\n\t\t\t\t\t})) _this20.hideTooltips();\n\t\t\t\t} else {\n\t\t\t\t\t_this20.hideTooltips();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis.listenTo(eventBus, eventBus.Events.ToggleLockedAttachments, this.toggleLockedAttachments.bind(this));\n\t},\n\n\tisEmpty: function isEmpty() {\n\t\treturn this.AttachmentCollection.length === 0;\n\t},\n\n\tisSaved: function isSaved() {\n\t\t// Determine if the underlying model has been saved to the server; useful only for single and part-of\n\t\t// attachment views but will succeed for compound views\n\t\treturn !this.AttachmentCollection.at(0).isNew();\n\t},\n\n\tisPartOf: function isPartOf() {\n\t\t// An attachment that is part of a compound attachment will receive its model from a collection view\n\t\treturn Boolean(this.model);\n\t},\n\n\tisCompound: function isCompound() {\n\t\t// Compound attachment views contain multiple attachments\n\t\treturn this.AttachmentCollection.length > 1;\n\t},\n\n\tisOld: function isOld() {\n\t\t// The attachment view is old if its underlying model refers to a previous year's attachment; useful\n\t\t// only for single and part-of attachment views but will succeed for compound views\n\t\treturn this.AttachmentCollection.at(0).isOld();\n\t},\n\n\tisForeign: function isForeign() {\n\t\t// The attachment view is foreign if its underlying model is not a member of any of the allowed groups\n\t\t// for the current user; useful only for single and part-of attachment views but will succeed for compound views\n\t\treturn this.AttachmentCollection.at(0).isForeign();\n\t},\n\n\tisShared: function isShared() {\n\t\t// The attachment view is shared if its underlying model is a member of some groups that the current user is not.\n\t\treturn this.AttachmentCollection.at(0).isShared();\n\t},\n\n\tcontainsOldAttachment: function containsOldAttachment() {\n\t\t// Determine if an attachment view contains any old attachments; useful for all attachment views\n\t\treturn _.find(this.AttachmentCollection.models, function (model) {\n\t\t\treturn model.isOld();\n\t\t});\n\t},\n\n\tcontainsSharedAttachment: function containsSharedAttachment() {\n\t\t// Determine if an attachment view contains any old attachments; useful for all attachment views\n\t\treturn _.find(this.AttachmentCollection.models, function (model) {\n\t\t\treturn model.isShared();\n\t\t});\n\t},\n\n\tcontainsNewAttachment: function containsNewAttachment() {\n\t\t// Determine if an attachment view contains any new (not old) attachments; useful for all attachment views\n\t\treturn _.find(this.AttachmentCollection.models, function (model) {\n\t\t\treturn !model.isOld();\n\t\t});\n\t},\n\n\tcontainsForeignAttachment: function containsForeignAttachment() {\n\t\t// Determine if an attachment view contains any foreign attachments; useful for all attachment views\n\t\treturn _.find(this.AttachmentCollection.models, function (model) {\n\t\t\treturn model.isForeign();\n\t\t});\n\t},\n\n\tcontainsNativeAttachment: function containsNativeAttachment() {\n\t\t// Determine if an attachment view contains any native (not foreign) attachments; useful for all attachment views\n\t\treturn _.find(this.AttachmentCollection.models, function (model) {\n\t\t\treturn !model.isForeign();\n\t\t});\n\t},\n\n\tgetResourceType: function getResourceType() {\n\t\t// Return the type of resource represented by the underlying model; useful only for single and part-of attachment\n\t\t// views but will succeed for compound views\n\t\treturn this.AttachmentCollection.at(0) ? this.AttachmentCollection.at(0).get(\"resourceType\") : undefined;\n\t},\n\n\tgetSelector: function getSelector() {\n\t\t// A valid attachment view always has at least one, underlying attachment model. The selector remains the same\n\t\t// whether this is a single, compound, or part-of attachment view\n\t\treturn this.AttachmentCollection.at(0) ? this.AttachmentCollection.at(0).get(\"selector\") : undefined;\n\t},\n\n\tsaving: function saving() {\n\t\tif (!this.Destroyed) {\n\t\t\tthis.ui.icon.addClass(\"busy\");\n\t\t\tthis.ui.spinner.removeClass(\"hide\");\n\t\t}\n\n\t\tthis.draggable = false;\n\t},\n\n\tsaved: function saved() {\n\t\tif (!this.Destroyed) {\n\t\t\tthis.ui.icon.removeClass(\"busy\");\n\t\t\tthis.ui.spinner.addClass(\"hide\");\n\n\t\t\tthis.draggable = this.AttachmentCollection.at(0);\n\t\t}\n\t},\n\n\taddFocusListener: function addFocusListener(model) {\n\t\tvar _this21 = this;\n\n\t\tmodel.on(\"focus\", function () {\n\t\t\t_this21.updateFocus();\n\n\t\t\tif (_this21.isCompound()) _this21.showTooltip();\n\t\t}, this);\n\t},\n\n\tremoveFocusListener: function removeFocusListener(model) {\n\t\tmodel.off(\"focus\");\n\t},\n\n\taddSyncListeners: function addSyncListeners(model) {\n\t\tmodel.on(\"request\", this.saving, this);\n\t\tmodel.on(\"sync\", this.saved, this);\n\t},\n\n\tremoveSyncListeners: function removeSyncListeners(model) {\n\t\tmodel.off(\"request\", this.saving.bind(this));\n\t\tmodel.off(\"sync\", this.saved.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.update();\n\n\t\tif (this.model && this.model.get(\"errors\") && _.values(this.model.get(\"errors\")).length > 0) this.ui.errorIcon.removeClass(\"hide\");\n\n\t\tif (this.isOld() && window.localStorage.getItem(\"attachmentHideState\") === \"true\") this.$el.addClass(\"hide\");else this.$el.removeClass(\"hide\");\n\t},\n\n\tonMouseOver: function onMouseOver(event) {\n\t\tevent.stopPropagation();\n\n\t\tif (!this.isEmpty() && !this.isCompound()) eventBus.trigger(\"attachment:mouseover\", this.getSelector());\n\t},\n\n\tonMouseOut: function onMouseOut(event) {\n\t\tevent.stopPropagation();\n\n\t\tif (!this.isEmpty()) eventBus.trigger(\"attachment:mouseout\", this.getSelector());\n\t},\n\n\tupdate: function update() {\n\t\tthis.updateIcon();\n\t\tthis.updateFocus();\n\t\tthis.updateDraggable();\n\t\tthis.updateTooltips();\n\n\t\tif (this.model && this.model.get(\"errors\") && _.values(this.model.get(\"errors\")).length > 0) {\n\t\t\tthis.saved();\n\t\t\tthis.ui.errorIcon.removeClass(\"hide\");\n\t\t}\n\t},\n\n\t// TOUCHPOINT: RESOURCE TYPE\n\tupdateIcon: function updateIcon() {\n\t\tif (!this.ui.icon.addClass) return;\n\n\t\t// Initialise the icon classes; leave the prefix empty if you wish to employ Font Awesome glyphs\n\t\tvar singleIconPrefix = \"\";\n\t\tvar multiIconPrefix = \"\";\n\n\t\tif (settings.contentIcons === \"img\") {\n\t\t\tsingleIconPrefix = \"img-\";\n\t\t\tmultiIconPrefix = \"img-\";\n\t\t}\n\n\t\tvar multiIcon = \"fa-star\";\n\n\t\tvar resourceType = this.getResourceType();\n\n\t\tif (!resourceType) return;\n\n\t\tvar singleIcon = App.mapResourceToIcon(resourceType);\n\n\t\t// If this is a compound attachment view...\n\t\tif (this.isCompound()) {\n\t\t\t// ...then set the multi-icon\n\t\t\tthis.ui.icon.removeClass(singleIconPrefix + singleIcon);\n\t\t\tthis.ui.icon.addClass(multiIconPrefix + multiIcon);\n\t\t} else {\n\t\t\t// ...otherwise set the single icon\n\t\t\tthis.ui.icon.removeClass(multiIconPrefix + multiIcon);\n\t\t\tthis.ui.icon.addClass(singleIconPrefix + singleIcon);\n\n\t\t\t// Determine whether or not to hide the 'busy' spinner\n\t\t\tif (this.isSaved()) {\n\t\t\t\tthis.ui.icon.removeClass(\"busy\");\n\t\t\t\tthis.ui.spinner.addClass(\"hide\");\n\t\t\t}\n\n\t\t\tif (!this.AttachmentCollection.at(0).get(\"visible\")) this.ui.visibleIcon.removeClass(\"hide\");\n\n\t\t\tif (this.AttachmentCollection.at(0).get(\"locked\")) this.ui.lockedIcon.removeClass(\"hide\");\n\t\t}\n\n\t\t// Polish the icon\n\t\tthis.ui.icon.addClass(\"polished\");\n\t\tthis.ui.icon.removeClass(\"faded\");\n\n\t\t// Hide the age and nationality icons\n\t\tthis.ui.ageIcon.addClass(\"hide\");\n\t\tthis.ui.nationalityIcon.addClass(\"hide\");\n\n\t\tif (this.containsOldAttachment()) {\n\t\t\t// Fade the icon\n\t\t\tthis.ui.icon.addClass(\"faded\");\n\t\t\tthis.ui.icon.removeClass(\"polished\");\n\n\t\t\t// Show the age glyph\n\t\t\tthis.ui.ageIcon.removeClass(\"hide\");\n\t\t}\n\n\t\tif (this.containsForeignAttachment()) {\n\t\t\t// Fade the icon\n\t\t\tthis.ui.icon.addClass(\"faded\");\n\t\t\tthis.ui.icon.removeClass(\"polished\");\n\n\t\t\t// Show the nationality glyph\n\t\t\tthis.ui.nationalityIcon.removeClass(\"hide\");\n\t\t}\n\n\t\tif (!this.containsOldAttachment() && !this.containsForeignAttachment() && this.containsSharedAttachment()) this.ui.sharedIcon.removeClass(\"hide\");\n\t},\n\n\tupdateFocus: function updateFocus() {\n\t\tif (!this.isCompound() && this.AttachmentCollection.at(0) && this.AttachmentCollection.at(0).focused) {\n\t\t\tif (this.ui.icon.addClass) this.ui.icon.addClass(\"attachment-icon-focused\");\n\t\t\tif (this.ui.highlightOverlay.addClass) this.ui.highlightOverlay.addClass(\"animate\");\n\t\t} else if (this.ui.icon.removeClass) {\n\t\t\tthis.ui.icon.removeClass(\"attachment-icon-focused\");\n\t\t}\n\t},\n\n\tupdateDraggable: function updateDraggable() {\n\t\tthis.draggable = this.containsNewAttachment();\n\t},\n\n\tupdateTooltips: function updateTooltips() {\n\t\tvar _this22 = this;\n\n\t\tif (this.AttachmentTooltip) {\n\t\t\tif (this.isCompound()) this.AttachmentTooltip.tooltip.setContent(this.AttachmentTooltip.view.$el.get(0));else this.AttachmentTooltip = this.destroyTooltip(this.AttachmentTooltip);\n\t\t}\n\n\t\tif (this.UploadTooltip) {\n\t\t\tif (this.isCompound()) this.UploadTooltip.tooltip.setContent(this.UploadTooltip.view.$el.get(0));else this.UploadTooltip = this.destroyTooltip(this.UploadTooltip);\n\t\t}\n\n\t\tif (this.DetailTooltip && !_.find(this.AttachmentCollection.models, function (model) {\n\t\t\treturn model.get(\"_id\") === _this22.DetailTooltip.model.get(\"_id\");\n\t\t})) this.DetailTooltip = this.destroyTooltip(this.DetailTooltip);\n\t},\n\n\tshowTooltip: function showTooltip(model) {\n\t\tvar _this23 = this;\n\n\t\tif (attachmentsSaving > 0) {\n\t\t\tif (!this.UploadTooltip) this.UploadTooltip = {};\n\n\t\t\t// Show the upload progress modal\n\t\t\tthis.UploadTooltip.view = new AttachmentsUploadView({ collection: this.AttachmentCollection });\n\t\t\tthis.UploadTooltip.view.render();\n\n\t\t\ttippy(this.$el.get(0), {\n\t\t\t\ttheme: \"light-grey\",\n\t\t\t\tplacement: \"left\",\n\t\t\t\tinteractive: true,\n\t\t\t\tcontent: this.UploadTooltip.view.$el.get(0),\n\t\t\t\ttrigger: \"manual\",\n\t\t\t\tarrow: true,\n\t\t\t\tdelay: 1,\n\t\t\t\tdistance: 20,\n\t\t\t\tonShow: function onShow(tooltip) {\n\t\t\t\t\t$(tooltip.popper).addClass(\"tippy-attachment\");\n\t\t\t\t},\n\t\t\t\tonShown: function onShown() {\n\t\t\t\t\teventBus.trigger(\"attachment:tooltip\", _this23);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.UploadTooltip.tooltip = this.$el.get(0)._tippy;\n\n\t\t\ttry {\n\t\t\t\t// show() did not work, calling it async makes it work\n\t\t\t\tsetTimeout(function () {\n\t\t\t\t\tif (_this23.UploadTooltip.tooltip) _this23.UploadTooltip.tooltip.show();\n\t\t\t\t}, 0);\n\t\t\t} catch (e) {\n\t\t\t\t// Don't care?\n\t\t\t\tthis.UploadTooltip = null;\n\t\t\t}\n\t\t} else if (model) {\n\t\t\tif (!this.DetailTooltip) {\n\t\t\t\tthis.DetailTooltip = {};\n\n\t\t\t\tthis.DetailTooltip.model = model;\n\t\t\t\tthis.DetailTooltip.view = new AttachmentDetailView({ attachmentModel: model });\n\t\t\t\tthis.DetailTooltip.view.render();\n\n\t\t\t\ttippy(this.$el.get(0), {\n\t\t\t\t\ttheme: \"light-grey\",\n\t\t\t\t\tplacement: \"left\",\n\t\t\t\t\tarrow: true,\n\t\t\t\t\tinteractive: true,\n\t\t\t\t\tcontent: this.DetailTooltip.view.$el.get(0),\n\t\t\t\t\ttrigger: \"manual\",\n\t\t\t\t\tdelay: 1,\n\t\t\t\t\tdistance: 20,\n\t\t\t\t\tmultiple: true,\n\t\t\t\t\tonShown: function onShown() {\n\t\t\t\t\t\teventBus.trigger(\"attachment:tooltip\", _this23);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tthis.DetailTooltip.tooltip = this.$el.get(0)._tippy;\n\t\t\t} else if (this.DetailTooltip.model.get(\"_id\") !== model.get(\"_id\")) {\n\t\t\t\tthis.DetailTooltip.model.trigger(\"lowlight\");\n\n\t\t\t\tthis.DetailTooltip.tooltip.hide();\n\t\t\t\tthis.DetailTooltip.view = new AttachmentDetailView({ attachmentModel: model });\n\t\t\t\tthis.DetailTooltip.tooltip.setContent(this.DetailTooltip.view.render().$el.get(0));\n\t\t\t\tthis.DetailTooltip.model = model;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\t// show() did not work, calling it async makes it work\n\t\t\t\tsetTimeout(function () {\n\t\t\t\t\tif (_this23.DetailTooltip.tooltip) _this23.DetailTooltip.tooltip.show();\n\t\t\t\t}, 0);\n\t\t\t} catch (e) {\n\t\t\t\t// Don't care?\n\t\t\t\tthis.DetailTooltip = null;\n\t\t\t}\n\t\t} else if (this.isCompound()) {\n\t\t\tif (!this.AttachmentTooltip) {\n\t\t\t\tthis.AttachmentTooltip = {};\n\n\t\t\t\tvar AttachmentListView = Backbone.Marionette.CollectionView.extend({\n\t\t\t\t\ttagName: \"div\",\n\t\t\t\t\tclassName: \"attachment-list\",\n\n\t\t\t\t\tchildView: CompoundAttachmentView,\n\n\t\t\t\t\ttemplate: false,\n\n\t\t\t\t\tbuildChildView: function buildChildView(child, ChildViewClass, childViewOptions) {\n\t\t\t\t\t\tvar options = _.extend({ model: child, parent: this }, childViewOptions);\n\n\t\t\t\t\t\tvar view = new ChildViewClass(options);\n\n\t\t\t\t\t\treturn view;\n\t\t\t\t\t},\n\n\t\t\t\t\tonAddChild: function onAddChild(collectionView, childView) {\n\t\t\t\t\t\tchildView.onRender();\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif (attachmentsSaving > 0) {\n\t\t\t\t\t// Show the upload progress modal\n\t\t\t\t\tthis.AttachmentTooltip.view = new AttachmentsUploadView({ collection: this.AttachmentCollection });\n\t\t\t\t} else {\n\t\t\t\t\t// show AttachmentListView\n\t\t\t\t\tthis.AttachmentTooltip.view = new AttachmentListView({ collection: this.AttachmentCollection });\n\t\t\t\t}\n\n\t\t\t\tthis.AttachmentTooltip.view.render();\n\t\t\t\ttippy(this.$el.get(0), {\n\t\t\t\t\ttheme: \"light-grey\",\n\t\t\t\t\tplacement: \"right\",\n\t\t\t\t\tflip: false,\n\t\t\t\t\tarrow: true,\n\t\t\t\t\tinteractive: true,\n\t\t\t\t\tcontent: this.AttachmentTooltip.view.$el.get(0),\n\t\t\t\t\ttrigger: \"manual\",\n\t\t\t\t\tdelay: 1,\n\t\t\t\t\tmultiple: true,\n\t\t\t\t\tonShow: function onShow(tooltip) {\n\t\t\t\t\t\t$(tooltip.popper).addClass(\"tippy-attachment\");\n\t\t\t\t\t},\n\t\t\t\t\tonShown: function onShown() {\n\t\t\t\t\t\teventBus.trigger(\"attachment:tooltip\", _this23);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tthis.AttachmentTooltip.tooltip = this.$el.get(0)._tippy;\n\t\t\t}\n\n\t\t\tif (this.AttachmentTooltip) setTimeout(function () {\n\t\t\t\t_this23.AttachmentTooltip.tooltip.show();\n\t\t\t}, 0);\n\t\t} else if (this.isPartOf()) {\n\t\t\tthis.AttachmentCollection.at(0).trigger(\"tooltip:show\", this.AttachmentCollection.at(0));\n\t\t\tthis.AttachmentCollection.at(0).trigger(\"highlight\");\n\t\t} else {\n\t\t\tthis.showTooltip(this.AttachmentCollection.at(0));\n\t\t}\n\t},\n\n\thideTooltips: function hideTooltips() {\n\t\tif (this.DetailTooltip) {\n\t\t\tthis.DetailTooltip.model.trigger(\"lowlight\");\n\t\t\tthis.DetailTooltip = this.destroyTooltip(this.DetailTooltip);\n\t\t}\n\n\t\tif (this.AttachmentTooltip) this.AttachmentTooltip = this.destroyTooltip(this.AttachmentTooltip);\n\t},\n\n\tdestroyTooltip: function destroyTooltip(context) {\n\t\ttry {\n\t\t\tif (context.tooltip && !context.tooltip.destroyed && !context.tooltip.destroying) context.tooltip.destroy();\n\t\t} catch (e) {\n\t\t\t// Don't care\n\t\t}\n\n\t\tcontext.tooltip = null;\n\n\t\tif (context.view && !context.view.isDestroyed()) context.view.destroy();\n\n\t\tcontext.view = null;\n\n\t\treturn null;\n\t},\n\n\tonHighlightOverlayAnimationEnd: function onHighlightOverlayAnimationEnd() {\n\t\tthis.ui.highlightOverlay.removeClass(\"animate\");\n\t},\n\n\ttoggleTooltip: function toggleTooltip(model, index) {\n\t\tthis.hideTooltip();\n\t\tthis.showTooltip(model, index);\n\t},\n\n\thighlight: function highlight() {\n\t\tthis.ui.highlightOverlay.addClass(\"highlight\");\n\t},\n\n\tlowlight: function lowlight() {\n\t\tthis.ui.highlightOverlay.removeClass(\"highlight\");\n\t},\n\n\tonMouseDown: function onMouseDown() {\n\t\tvar _this24 = this;\n\n\t\tvar mouseDownStart = moment();\n\t\tvar dragStarted = false;\n\t\tvar draggingElement = void 0,\n\t\t    data = void 0;\n\n\t\tif (this.draggable) {\n\t\t\t$(\"body\").on(\"selectstart.draggingResource\", function (e) {\n\t\t\t\treturn e.preventDefault();\n\t\t\t});\n\n\t\t\t// if still uploading, ignore dragStarted\n\t\t\tvar savingAttachments = _.filter(this.AttachmentCollection.models, function (attachment) {\n\t\t\t\treturn attachment.get(\"saving\");\n\t\t\t});\n\n\t\t\tif (savingAttachments.length === 0) {\n\t\t\t\t$(\"body\").on(\"mousemove.dragStarted\", function () {\n\t\t\t\t\tif (moment().diff(mouseDownStart, \"ms\") <= 130) return;\n\n\t\t\t\t\t$(\"body\").off(\"mousemove.dragStarted\");\n\t\t\t\t\tdragStarted = true;\n\n\t\t\t\t\t// Transfer all of the attachment model IDs to the drop target\n\t\t\t\t\tdata = {\n\t\t\t\t\t\ttype: \"attachment\",\n\t\t\t\t\t\tattachmentIdentifiers: [],\n\t\t\t\t\t\tcid: _this24.cid\n\t\t\t\t\t};\n\n\t\t\t\t\t_.each(_this24.AttachmentCollection.models, function (model) {\n\t\t\t\t\t\tdata.attachmentIdentifiers.push(model.get(\"_id\"));\n\t\t\t\t\t});\n\n\t\t\t\t\tvar DraggingElement = Backbone.Marionette.View.extend({\n\t\t\t\t\t\tclassName: \"lp-dragging-element\",\n\t\t\t\t\t\ttemplate: require(\"../../templates/console/learningPathNode.nunj\").draggingElement\n\t\t\t\t\t});\n\n\t\t\t\t\tvar resourceData = {\n\t\t\t\t\t\ttitle: \"\",\n\t\t\t\t\t\tcategory: \"attachment\",\n\t\t\t\t\t\tresourceType: \"\"\n\t\t\t\t\t};\n\n\t\t\t\t\tif (_this24.AttachmentCollection.models.length > 1) {\n\t\t\t\t\t\tresourceData.title = _this24.AttachmentCollection.models.length + \" attachments\";\n\t\t\t\t\t\tresourceData.resourceType = \"expanded\";\n\t\t\t\t\t} else if (_this24.AttachmentCollection.models.length === 1) {\n\t\t\t\t\t\tvar attachment = _this24.AttachmentCollection.models[0];\n\t\t\t\t\t\tresourceData.title = attachment.get(\"title\");\n\t\t\t\t\t\tresourceData.resourceType = attachment.get(\"resourceType\");\n\t\t\t\t\t}\n\n\t\t\t\t\tvar draggingNode = new DraggingElement({\n\t\t\t\t\t\tmodel: new Backbone.Model(resourceData)\n\t\t\t\t\t}).render();\n\n\t\t\t\t\tdraggingElement = draggingNode.$el[0];\n\t\t\t\t\tdraggingElement.style.position = \"absolute\";\n\t\t\t\t\tdraggingElement.style.zIndex = 1000;\n\n\t\t\t\t\teventBus.trigger(eventBus.Events.ResourceDragStart);\n\t\t\t\t\teventBus.trigger(eventBus.Events.AttachmentDragStart, data);\n\n\t\t\t\t\tvar moveAt = function moveAt(e) {\n\t\t\t\t\t\tdraggingElement.style.left = e.originalEvent.pageX + \"px\";\n\t\t\t\t\t\tdraggingElement.style.top = e.originalEvent.pageY + \"px\";\n\t\t\t\t\t};\n\n\t\t\t\t\t$(\"body\").append(draggingElement);\n\t\t\t\t\t$(\"body\").on(\"mousemove.moveDraggingElement\", moveAt);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t// Handle the drop\n\t\t$(\"body\").on(\"mouseup.resourceDragEnded\", function (e) {\n\t\t\t$(\"body\").off(\"selectstart.draggingResource\");\n\t\t\t$(\"body\").off(\"mousemove.moveDraggingElement\");\n\t\t\t$(\"body\").off(\"mouseup.resourceDragEnded\");\n\n\t\t\t// Show tooltip if mouse was released shortly after being pressed\n\t\t\tif (!dragStarted) {\n\t\t\t\t$(\"body\").off(\"mousemove.dragStarted\");\n\t\t\t\treturn _this24.showTooltip();\n\t\t\t}\n\n\t\t\tdraggingElement.parentNode.removeChild(draggingElement);\n\t\t\teventBus.trigger(eventBus.Events.AttachmentDragEnd);\n\t\t\teventBus.trigger(eventBus.Events.ResourceDragEnd);\n\n\t\t\t// Check if mouseup was on the bin icon.\n\t\t\tvar binIconX = $(\"div.attachment-bin\").position().left;\n\t\t\tvar binIconY = $(\"div.attachment-bin\").position().top;\n\t\t\tvar binIconHeight = $(\"div.attachment-bin\").height();\n\t\t\tvar binIconWidth = $(\"div.attachment-bin\").width();\n\t\t\tvar deleteResource = e.pageX >= binIconX && e.pageX <= binIconX + binIconWidth && e.pageY >= binIconY && e.pageY <= binIconY + binIconHeight;\n\n\t\t\tif (deleteResource) eventBus.trigger(\"attachments:delete:\" + data.cid);else eventBus.trigger(eventBus.Events.ResourceDragDrop, e, data);\n\t\t});\n\t},\n\n\tdeleteSelf: function deleteSelf() {\n\t\tvar _this25 = this;\n\n\t\t$(\"#ie-pip\").removeClass(\"img-\" + $(\"#ie-pip\").data(\"icon\")).addClass(\"hide\");\n\n\t\t// If the attachment was moved (to the dustbin)...\n\t\t//if (event.originalEvent.dataTransfer.dropEffect === \"move\")\n\t\t//{\n\t\t// ...then automatically remove the attachment\n\t\tvar multi = this.AttachmentCollection.length > 1;\n\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tthis.AttachmentCollection.each(function (model) {\n\t\t\t// Check for some special cases first\n\t\t\tif (!rester.hasAccess(rester.p.groups.all, user) && (model.isOld() || model.isForeign() || model.isShared())) {\n\t\t\t\tif (!multi) {\n\t\t\t\t\tvar modal = new SmallModal({\n\t\t\t\t\t\ttitle: \"<span class='fal fa-ban'/> Cannot Delete Attachment\",\n\t\t\t\t\t\tbody: \"<p>This attachment \" + (model.isOld() ? \"is from a different year\" : model.isForeign() ? \"is from different groups\" : \"does not share all its groups with you\") + \". You cannot delete it.</p>\",\n\t\t\t\t\t\thost: \"#link-resources\",\n\t\t\t\t\t\thideButtons: [\"cancel\"]\n\t\t\t\t\t});\n\t\t\t\t\tmodal.show();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tmodel.destroy({\n\t\t\t\tsuccess: _this25.destroySuccess.bind(_this25),\n\t\t\t\terror: _this25.destroyError.bind(_this25),\n\t\t\t\twait: true\n\t\t\t});\n\t\t});\n\t\t//}\n\t},\n\n\tdestroySuccess: function destroySuccess(model) {\n\t\teventBus.trigger(\"attachment:deleted\", model);\n\t\tif (this.AttachmentCollection.length === 1) this.destroy();\n\t},\n\n\tdestroyError: function destroyError(model, xhr) {\n\t\tthis.Destroyed = false;\n\t\tvar answer = App.parseResponse(xhr);\n\n\t\tthis.DestroyErrorDialog = new SmallModal({\n\t\t\tpersist: false,\n\t\t\ttitle: \"<span class='fal fa-times-circle'/> Error\",\n\t\t\tbody: \"<p>An error occurred while removing the attachment and the attachment was not removed. Please try again. Details about the error follow.</p>\\n\\t\\t\\t\\t<p>\" + (answer.detail || answer.info).replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t}) + \"</p>\",\n\t\t\thost: \"#link-resources\",\n\t\t\thideButtons: [\"cancel\"]\n\t\t});\n\n\t\tthis.DestroyErrorDialog.show();\n\t},\n\n\tonAttachmentAdded: function onAttachmentAdded(model) {\n\t\tthis.addSyncListeners(model);\n\t\tthis.addFocusListener(model);\n\n\t\tthis.update();\n\t},\n\n\tonAttachmentRemoved: function onAttachmentRemoved(model) {\n\t\tthis.removeSyncListeners(model);\n\t\tthis.removeFocusListener(model);\n\n\t\tif (!this.isEmpty()) this.render();\n\n\t\tif (!_.isNil(this.AttachmentTooltip) && !_.isNil(this.AttachmentTooltip.view)) this.AttachmentTooltip.view.render();\n\n\t\tthis.saved();\n\t},\n\n\tonAttachmentsReset: function onAttachmentsReset(collection, options) {\n\t\tvar _this26 = this;\n\n\t\t_.each(options.previousModels, function (model) {\n\t\t\t_this26.stopListening(model);\n\t\t});\n\n\t\tcollection.each(function (model) {\n\t\t\t_this26.addFocusListener(model);\n\t\t});\n\t},\n\n\ttoggleLockedAttachments: function toggleLockedAttachments(hideState) {\n\t\tif (this.isOld() && hideState) this.$el.addClass(\"hide\");else this.$el.removeClass(\"hide\");\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.Destroyed = true;\n\t},\n\n\tgetErrorMessage: function getErrorMessage(errors) {\n\t\tif (_.values(errors).length > 0) {\n\t\t\treturn _.values(errors).join(\". \") + (_.values(errors).length > 1 ? \". \" : \"\") + (this.model && this.model.get(\"retry\") ? \"\" : \" Invalid files will be skipped during the upload. Click the error icon to remove the invalid file(s).\");\n\t\t}\n\n\t\treturn \"\";\n\t},\n\n\tuploadError: function uploadError(xhr) {\n\t\tthis.saved();\n\n\t\tvar errors = { error: xhr.responseJSON && xhr.responseJSON.info ? xhr.responseJSON.info : xhr.statusText };\n\n\t\tif (this.model) this.model.set(\"errors\", errors);\n\n\t\tif (this.ui.errorIcon.removeClass) {\n\t\t\tthis.ui.errorIcon.removeClass(\"hide\");\n\t\t\tthis.ui.errorIcon.attr(\"title\", this.getErrorMessage(errors));\n\t\t}\n\n\t\tif (this.ui.icon.attr) this.ui.icon.attr(\"title\", this.getErrorMessage(errors));\n\t},\n\n\tonErrorClick: function onErrorClick(e) {\n\t\te.preventDefault();\n\t\tthis.draggable = this.AttachmentCollection.at(0);\n\n\t\tif (this.model) {\n\t\t\tthis.AttachmentCollection.remove(this.model);\n\t\t\teventBus.trigger(eventBus.Events.AttachmentRemoved, this.model);\n\t\t\teventBus.trigger(\"attachment:deleted\", this.model);\n\t\t\teventBus.trigger(\"attachmentRemoved:\" + this.model.get(\"resource\"));\n\t\t\tradio.trigger(\"attachmentRemoved:\" + this.model.get(\"resource\"));\n\t\t\tthis.model.destroy();\n\t\t} else {\n\t\t\teventBus.trigger(eventBus.Events.AttachmentRemoved, this.AttachmentCollection.at(0));\n\t\t\tthis.AttachmentCollection.models = _.filter(this.AttachmentCollection.models, function (attachment) {\n\t\t\t\treturn !attachment.get(\"errors\") || attachment.get(\"errors\") && _.values(attachment.get(\"errors\")).length === 0;\n\t\t\t});\n\t\t}\n\n\t\t$(\".highlight-bar\").addClass(\"hide\");\n\n\t\tif (this.ui.errorIcon.addClass) this.ui.errorIcon.addClass(\"hide\");\n\n\t\tif (this.AttachmentCollection.models.length === 0) this.destroy();\n\t},\n\n\tonErrorsChange: function onErrorsChange() {\n\t\tif (this.ui.errorIcon.addClass) this.ui.errorIcon.addClass(\"hide\");\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJvb2tWaWV3LmpzIl0sIm5hbWVzIjpbIlByb21pc2UiLCJyZXF1aXJlIiwiJCIsIl8iLCJCYWNrYm9uZSIsIm1vbWVudCIsInJheWd1biIsInJlc3RlciIsIlNsaWRlb3V0IiwidGlwcHkiLCJkZWZhdWx0IiwibGlua1NlcnZpY2UiLCJBcHAiLCJzZXR0aW5ncyIsInJhZGlvIiwiUmFkaW8iLCJjaGFubmVsIiwiQXR0YWNobWVudFJlY292ZXJ5TW9kYWwiLCJFcHViTmF2aWdhdGlvblNpZGViYXIiLCJGbGFzaENhcmRXaWRnZXQiLCJMaWdodEJveCIsIkdyb3VwTW9kYWwiLCJQZGZOYXZpZ2F0aW9uU2lkZWJhciIsIlJlc291cmNlIiwiU21hbGxNb2RhbCIsIkJ1bGtEcmFnRHJvcEhlbHBlciIsIkJ1bGtSZXNvdXJjZVVwbG9hZE1vZGFsIiwiQXNzZXNzbWVudFByb21wdCIsIlJlc291cmNlT3BlbmVkTW9kYWwiLCJBc3Nlc3NtZW50IiwiQXNzZXNzbWVudE1vZGFsIiwiRmxhc2hjYXJkUHJldmlldyIsImV2ZW50QnVzIiwiYXR0YWNobWVudHNTYXZpbmciLCJTbGlkZW91dE1peGluIiwiY29uZmlndXJlVUkiLCJ1aSIsImNsb3NlIiwicmVtb3ZlQ2xhc3MiLCJnZXQiLCJwYW5lbCIsIm1lbnUiLCIkZWwiLCJwYWRkaW5nIiwidG9sZXJhbmNlIiwic2hvdyIsIm9wZW4iLCJoaWRlIiwib25CZWZvcmVEZXN0cm95IiwiRXB1Yk1peGluIiwib25Cb29rTG9hZCIsImNvbnRlbnRXaW5kb3ciLCJvbiIsIm9uTW91c2VEb3duIiwiYmluZCIsIm9uTW91c2VNb3ZlIiwiaGlnaGxpZ2h0UmVwbGF5IiwiaGlnaGxpZ2h0aW5nIiwiZXZlbnQiLCJwdXNoIiwieCIsImNsaWVudFgiLCJ5IiwiY2xpZW50WSIsIm9uTW91c2VVcCIsInNlbGVjdGlvbiIsImdldFNlbGVjdGlvbiIsInRvU3RyaW5nIiwibGVuZ3RoIiwic2hvd0hpZ2hsaWdodFRvb2xiYXIiLCJvbldpbmRvd0NsaWNrIiwiaGlnaGxpZ2h0VG9vbGJhciIsIm9uQm9va0JlZm9yZURlc3Ryb3kiLCJvZmYiLCJzdG9wTGlzdGVuaW5nIiwid2luZG93IiwibG9hZFNlY3Rpb24iLCJib29rIiwibmF2aWdhdG9yIiwidHJpZ2dlciIsIkV2ZW50cyIsIkxvYWRTdGFydCIsImxvYWRlZCIsInVybCIsInJlcGxhY2UiLCJpbmNsdWRlcyIsImxvY2F0aW9uIiwic2VhcmNoIiwic3JjIiwibG9hZFNlY3Rpb25PZmZzZXQiLCJvZmZzZXQiLCJzY3JvbGxUbyIsIm1hcFNlbGVjdG9yIiwic2VsZWN0b3IiLCJnZXRBdHRhY2htZW50QXRTZWxlY3RvciIsIkF0dGFjaG1lbnRWaWV3cyIsImp1bXBUb0F0dGFjaG1lbnQiLCJhdHRhY2htZW50Iiwic2Nyb2xsVG9BdHRhY2htZW50IiwiZWxlbWVudCIsInJlc29sdmVET01TZWxlY3RvciIsInNjcm9sbFkiLCJwYWdlWU9mZnNldCIsInRvcCIsImp1bXBMaXN0ZW5lciIsInNjcm9sbEF0dGFjaG1lbnRDb250YWluZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiYWRkRXZlbnRMaXN0ZW5lciIsInRocm90dGxlIiwib25TY3JvbGwiLCJnZXRDdXJyZW50U2VjdGlvbiIsImxvYWQiLCJvbkxvYWQiLCJuYXZpZ2F0ZVRvU2VjdGlvbiIsInBhcnNlSW50IiwiYXR0YWNobWVudENvbnRhaW5lciIsImNzcyIsInN5bmNocm9uaXplIiwicG9sbE5hdmlnYXRlUHJldmlvdXMiLCJwb2xsTmF2aWdhdGVOZXh0IiwiaGVpZ2h0IiwibmF2UHJldmlvdXMiLCJhZGRDbGFzcyIsImNvbnRlbnRIZWlnaHQiLCJuYXZOZXh0IiwicmVzaXplQXR0YWNobWVudENvbnRhaW5lciIsImRvY3VtZW50IiwiYm9keSIsIm9mZnNldEhlaWdodCIsIndpdGhBbmNob3IiLCJjb21wb25lbnRzIiwic3RhcnRzV2l0aCIsInNwbGl0IiwiRXJyb3IiLCJkcm9wIiwiam9pbiIsIm1ldGFkYXRhIiwiZ2V0Qm9va0VsZW1lbnRBdCIsInJldCIsImVsZW1lbnRGcm9tUG9pbnQiLCJNYXRoIiwicm91bmQiLCJPdmVybGF5QmFzZSIsImxlZnQiLCJmbG9vciIsImJ1aWxkRE9NU2VsZWN0b3IiLCJlbCIsInBhcmVudE5vZGUiLCJub2RlTmFtZSIsInRvTG93ZXJDYXNlIiwidW5zaGlmdCIsImluZGV4IiwiZSIsImRlYnVnIiwicmVwb3J0RXJyb3JzIiwicmVzdG9yZVByZXZpb3VzRWxlbWVudEJvcmRlciIsInByZXZpb3VzRWxlbWVudCIsImJvcmRlciIsInByZXZpb3VzRWxlbWVudEJvcmRlciIsInN0eWxlIiwidW5kZWZpbmVkIiwicmVjb3JkRWxlbWVudEJvcmRlciIsInNldEVsZW1lbnRCb3JkZXIiLCJQZGZNaXhpbiIsIm9uQm9va1Nob3ciLCJhcHBlbmQiLCJwZGZMaW5rc0xheWVyIiwibG9hZEN1cnJlbnRQYWdlIiwicGRmRG9jdW1lbnQiLCJkZXN0cm95IiwicGFnZU51bWJlciIsIm51bVBhZ2VzIiwiY3VycmVudFBhZ2UiLCJnZXRQYWdlIiwidGhlbiIsInBkZlBhZ2UiLCJjYW52YXMiLCJ3aWR0aCIsInpvb20iLCJjYWNoZWRDYW52YXNXaWR0aCIsImRlc2lyZWRXaWR0aCIsInNjYWxlIiwiZ2V0Vmlld3BvcnQiLCJzY2FsZWRWaWV3cG9ydCIsInJhdGlvIiwicmVuZGVyQ29udGV4dCIsImNhbnZhc0NvbnRleHQiLCJnZXRDb250ZXh0Iiwidmlld3BvcnQiLCJjYW52YXNFbGVtZW50IiwiY2FudmFzV2lkdGgiLCJjYW52YXNIZWlnaHQiLCJyZW5kZXIiLCJwZGZTY2FsZSIsInBkZmpzTGliIiwiZXh0ZXJuYWxMaW5rVGFyZ2V0IiwiTGlua1RhcmdldCIsIkJMQU5LIiwiZ2V0QW5ub3RhdGlvbnMiLCJhbm5vdGF0aW9uc0RhdGEiLCJBbm5vdGF0aW9uTGF5ZXIiLCJkaXYiLCJhbm5vdGF0aW9ucyIsInBhZ2UiLCJjbG9uZSIsImRvbnRGbGlwIiwiU2ltcGxlTGlua1NlcnZpY2UiLCJyZXF1ZXN0IiwiR2V0Q3VycmVudEJvb2siLCJwcm9tIiwiZ2V0RG9jdW1lbnQiLCJ1cmxSb290IiwiZGlzYWJsZUF1dG9GZXRjaCIsImRpc2FibGVTdHJlYW0iLCJvblBhc3N3b3JkIiwiaWQiLCJib29rSUQiLCJzbGljZSIsInRva2VuIiwiaSIsImNiIiwiYWxsIiwicmVzb2x2ZSIsImdldE1ldGFkYXRhIiwiYXJyIiwiaW5mbyIsIlByb2R1Y2VyIiwiY2F0Y2giLCJlcnIiLCJtZXNzYWdlIiwic2Nyb2xsVG9wIiwibmV3U2VsZWN0b3IiLCJwYXJzZUZsb2F0IiwidG9GaXhlZCIsImdldFJlYWxTZWxlY3Rvck9mZnNldCIsImludmlzaWJsZUdyaWRPZmZzZXQiLCJkaWZmIiwic3RlcHMiLCJhYnMiLCJtb2QiLCJjbG9zZXIiLCJiZWxvdyIsImFib3ZlIiwib3RoZXIiLCJjZWlsIiwiY29uc29sZSIsIndhcm4iLCJsaXN0ZW5UbyIsInNjcm9sbEhlaWdodCIsIm1vZHVsZSIsImV4cG9ydHMiLCJNYXJpb25ldHRlIiwiVmlldyIsImV4dGVuZCIsInRhZ05hbWUiLCJjbGFzc05hbWUiLCJnZXRUZW1wbGF0ZSIsImJvb2tEaXNwbGF5Iiwib3ZlcmxheSIsImRyb3BPdmVybGF5IiwiZ3JvdXBOb3RpZnkiLCJzcGlubmVyIiwiYXR0YWNobWVudERlbGV0ZXIiLCJoaW50IiwiaGlnaGxpZ2h0QmFyIiwiY2FuY2VsRHJvcCIsImV2ZW50cyIsImF0dGFjaG1lbnRFdmVudHMiLCJyYWRpb0V2ZW50cyIsIldlYnNvY2tldENvbm5lY3RlZCIsIldlYnNvY2tldERpc2Nvbm5lY3RlZCIsInRlbXBsYXRlQ29udGV4dCIsImhpbnRzIiwicmFuZG9tIiwiaW5pdGlhbGl6ZSIsIm9wdGlvbnMiLCJzdGFydExvY2F0aW9uIiwic3RhcnRIYXNoIiwiaGFzaCIsImF0dGFjaG1lbnRzRmV0Y2hlZCIsInVwbG9hZEFsbG93ZWQiLCJHcm91cHNDaGFuZ2VkIiwiZ3JvdXBzQ2hhbmdlZCIsIkF0dGFjaG1lbnRSZW1vdmVkIiwib25BdHRhY2htZW50RGVsZXRlZCIsImZvcm1hdCIsIlN0YXJ0RnVsbHNjcmVlbiIsInRvZ2dsZUZ1bGxzY3JlZW4iLCJFbmRGdWxsc2NyZWVuIiwiSGlkZUZsYXNoQ2FyZFdpZGdldCIsImhpZGVGbGFzaENhcmRXaWRnZXQiLCJTaG93Rmxhc2hDYXJkV2lkZ2V0Iiwic2hvd0ZsYXNoQ2FyZFdpZGdldCIsIlF1ZXJ5UmVqdXZlbmF0ZUF0dGFjaG1lbnRzIiwicXVlcnlSZWp1dmVuYXRlQXR0YWNobWVudHMiLCJEaXNhYmxlUmVzb3VyY2VEcmFnZ2luZyIsImRpc2FibGVSZXNvdXJjZUJ1dHRvbiIsIkVuYWJsZVJlc291cmNlRHJhZ2dpbmciLCJlbmFibGVSZXNvdXJjZUJ1dHRvbiIsImJpbmRFdmVudHMiLCJzZWN0aW9uTG9hZGVyIiwiZGVib3VuY2UiLCJ4aHIiLCJzYXZlUXVldWUiLCJmdWxsc2NyZWVuZWQiLCJnZXRCb29rTWV0YWRhdGEiLCJCb29rTWV0YWRhdGEiLCJsYXp5RmV0Y2giLCJEZWxldGVkQXR0YWNobWVudHMiLCJyZXNldCIsIlVubG9hZEJvb2siLCJzaG93RXJyb3IiLCJwYXJzZVJlc3BvbnNlIiwidGV4dCIsImRldGFpbCIsIm9uUmVuZGVyIiwicmVtb3ZlIiwiZHJhZ0NvdW50Iiwic3ByZWFkIiwiUGFnZUNvdW50Iiwic2hvd1NwaW5uZXIiLCJuYXYiLCJMb2FkTmF2aWdhdGlvbiIsIkVwdWJOYXZpZ2F0b3IiLCJyZXNvbHZlciIsIlBkZk5hdmlnYXRvciIsIkF0dGFjaG1lbnRzIiwiQXR0YWNobWVudENvbGxlY3Rpb24iLCJvbkF0dGFjaG1lbnRBZGRlZCIsIm9uQXR0YWNobWVudERlc3Ryb3llZCIsIkRlbGV0ZWRBdHRhY2htZW50Q29sbGVjdGlvbiIsIm9uRGVsZXRlZEF0dGFjaG1lbnRBZGRlZCIsIm9uRGVsZXRlZEF0dGFjaG1lbnRSZW1vdmVkIiwib25EZWxldGVkQXR0YWNobWVudHNSZXNldCIsIlNob3dBdHRhY2htZW50QmluQ29udGVudHMiLCJzaG93QXR0YWNobWVudEJpbkNvbnRlbnRzIiwiaW5pdGlhbGl6ZUZpbmRlclN0YXR1cyIsImNvbmZpZ3VyZU92ZXJsYXkiLCJuYXZpZ2F0ZVN0YXJ0IiwiZmV0Y2hBdHRhY2htZW50cyIsImNvbnRlbnRzIiwiY2xpY2siLCJDbG9zZVJlc291cmNlcyIsIkNsb3NlU2ltcGxlTWVudXMiLCJib2R5Q2xpY2tlciIsImlubmVySGVpZ2h0IiwiZmluZCIsImhyZWYiLCJwcm9wIiwic2V0VVJMIiwiQ29tbWFuZHMiLCJOYXZpZ2F0ZSIsInNlY3Rpb24iLCJwYWdlcyIsImZpbHRlciIsIml0ZW0iLCJmaWxlIiwicGFnZVNldCIsInJ1biIsImdvIiwic2V0VGltZW91dCIsInBvcCIsIlpvb21DaGFuZ2UiLCJwb3B1bGF0ZUF0dGFjaG1lbnRDb250YWluZXIiLCJMb2FkRW5kIiwiVmlld0xvYWRlZCIsImhpZGVTcGlubmVyIiwiZmxhc2hDYXJkV2lkZ2V0IiwiYWxsb3dlZCIsImN1cnJlbnQiLCJncm91cE5vdGlmaWNhdGlvbiIsImludGVyc2VjdGlvbiIsIm1hcCIsInN5c3RlbSIsImNvZGUiLCJvbkdyb3VwTm90aWZ5Q2xpY2siLCJTaG93R3JvdXBNb2RhbCIsIm9uTmF2UHJldmlvdXNDbGljayIsIm5hdmlnYXRlUHJldmlvdXMiLCJvbk5hdk5leHRDbGljayIsIm5hdmlnYXRlTmV4dCIsIlJlc291cmNlRHJhZ1N0YXJ0IiwiZHJhZ092ZXIiLCJSZXNvdXJjZURyYWdFbmQiLCJkZWxheSIsIkF0dGFjaG1lbnREcmFnU3RhcnQiLCJtYXgiLCJBdHRhY2htZW50RHJhZ0VuZCIsIlJlc291cmNlRHJhZ0Ryb3AiLCJyZXNvdXJjZURhdGEiLCJvbkRyb3AiLCJyZW1vdmVBbGxBdHRhY2htZW50Vmlld3MiLCJlbXB0eSIsImF0dGFjaGVzIiwiYXNzZXNzbWVudHMiLCJzb3J0QnkiLCJlYWNoIiwiY3JlYXRlQXR0YWNobWVudFZpZXciLCJhdHRhY2htZW50TW9kZWwiLCJfYXR0YWNobWVudE1vZGVsIiwicmVqdXZlbmF0ZU1vZGVsIiwiaGFzIiwidXNlciIsIlJlcXVlc3RzIiwiQ3VycmVudFVzZXIiLCJjb2xsZWN0aW9uIiwibW9kZWxzIiwibW9kZWwiLCJ1c2VyX2lkIiwiYW5udWFsQ29udGVudCIsImlzT2xkIiwicmVtb3ZlQXR0YWNobWVudFZpZXciLCJyZW1vdmVPbGRBdHRhY2htZW50VmlldyIsImlzRm9yZWlnbiIsInJlanV2ZW5hdG9yRXhpc3RzRm9yIiwiZXhpc3RpbmciLCJhdHRhY2htZW50Q29sbGVjdGlvbiIsImFkZCIsInZpZXciLCJDb21wb3VuZEF0dGFjaG1lbnRWaWV3IiwibW92ZUF0dGFjaG1lbnQiLCJhdHRhY2htZW50TW9kZWxJZGVudGlmaWVycyIsIm11bHRpIiwiZm9yRWFjaCIsImhhc0FjY2VzcyIsInAiLCJncm91cHMiLCJpc1NoYXJlZCIsIm9sZFNlbGVjdG9yIiwic2V0Iiwic2F2ZSIsImVycm9yIiwidHh0IiwibW9kYWwiLCJ0aXRsZSIsImhvc3QiLCJoaWRlQnV0dG9ucyIsImRlc3Ryb3lBdHRhY2htZW50VmlldyIsIm5ld0F0dGFjaG1lbnRNb2RlbCIsIm9sZEF0dGFjaG1lbnRNb2RlbCIsInVwZGF0ZUF0dGFjaG1lbnRWaWV3cyIsInByZXZpb3VzIiwicXVlcnlSZWp1dmVuYXRlQXR0YWNobWVudCIsInN0YXRlcyIsIkdldEN1cnJlbnRHcm91cHMiLCJSZWp1dmVuYXRlRGlhbG9nIiwicGVyc2lzdCIsImNoYXJDb2RlQXQiLCJyZWp1dmVuYXRlQXR0YWNobWVudCIsIlNhdmVFcnJvckRpYWxvZyIsIndhcm5pbmciLCJyZWp1dmVuYXRlQXR0YWNobWVudHMiLCJyZWxvYWRBdHRhY2htZW50cyIsIm5ld01vZGVsIiwicmVqdXZlbmF0aW5nIiwicmVzb3VyY2UiLCJyZXNvdXJjZVR5cGUiLCJyZWp1dmVuYXRlcyIsInJlamVjdCIsInNhdmVBdHRhY2htZW50IiwiZG9uZSIsInVuc2V0IiwiY29udGFpbnNPbGRBdHRhY2htZW50cyIsIk9sZEF0dGFjaG1lbnRzRXhpc3RzIiwiTm9PbGRBdHRhY2htZW50cyIsImZhaWwiLCJjbGVhckF0dGFjaG1lbnRGb2N1cyIsIkZpbmRlclN0YXR1cyIsImF0dGFjaG1lbnRzIiwiY3VycmVudEluZGV4IiwicmVzZXRGaW5kZXJTdGF0dXMiLCJyZXNvdXJjZUlkZW50aWZpZXIiLCJyZXZlcnNlIiwiZ2V0QXR0YWNobWVudHNGb3JSZXNvdXJjZSIsImZvY3VzZWQiLCJ3aGVyZSIsImZpbmRGaXJzdEF0dGFjaG1lbnQiLCJmaW5kTmV4dEF0dGFjaG1lbnQiLCJmaW5kUHJldmlvdXNBdHRhY2htZW50IiwicmVjb3JkQ3VycmVudFRvb2x0aXAiLCJhdHRhY2htZW50VmlldyIsIkN1cnJlbnRUb29sdGlwIiwiaGludFRpbWVyIiwic2hvd0hpbnQiLCJjbGVhclRpbWVvdXQiLCJkb250Q3JlYXRlVmlldyIsIk5hdmlnYXRpb25Qcm9tcHQiLCJzdWNjZXNzIiwiY3VycmVudGx5U2F2aW5nIiwic2F2ZUZpbGVzIiwicmVzcG9uc2UiLCJKU09OIiwic3RyaW5naWZ5IiwiZmV0Y2giLCJmZXRjaEF0dGFjaG1lbnRzU3VjY2VzcyIsImZldGNoQXR0YWNobWVudHNFcnJvciIsIm5vb3AiLCJjcmVhdGVBdHRhY2htZW50TW9kZWwiLCJzIiwib3B0cyIsImRvbnRTYXZlIiwiZGF0YSIsIl9pZCIsImNhdGVnb3J5IiwidmlzaWJsZSIsInNlcnZlclNhdmUiLCJpbnN0YW5jZU5hbWUiLCJyZXF1aXJlQ29kZSIsImRpc2FibGVSYW5kb21pemF0aW9uIiwiaGlkZUNvbXBsZXRlQnV0dG9ucyIsImRpc2FibGVSZXN1bHQiLCJhY3RpdmF0aW9uVHlwZSIsImFjdGl2YXRpb25UaW1lIiwic3RhcnREYXRlIiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsInRpbWUiLCJzdGFydFRpbWUiLCJ1bml4Iiwic3ViamVjdF9uYW1lIiwiY29udGVudEdyYWRlIiwiZ3JhZGUiLCJsYW5ndWFnZSIsImJhc2VDb2RlIiwiZ2V0U2VsZWN0b3IiLCJvcmlnaW5hbEV2ZW50IiwiaXNGaW5pdGUiLCJmaW5hbGl6ZURyb3AiLCJwcmV2ZW50RGVmYXVsdCIsImRyb3BEYXRhIiwiZGV0ZXJtaW5lRHJvcEVmZmVjdCIsInJlc3VsdCIsInR5cGUiLCJyZXN0IiwiZHJvcEVmZmVjdCIsInJlc291cmNlTW9kZWwiLCJpbmxpbmVNZXNzYWdlIiwib25jZSIsImFjdGlvbiIsInNldHRpbmdzTW9kZWwiLCJhdHRhY2htZW50SWRlbnRpZmllcnMiLCJzb21lIiwidXNlV2FybiIsInBlcm1pc3NpYmxlVGFncyIsIm9uTW91c2VFbnRlciIsIm9uTW91c2VMZWF2ZSIsIm9uRmlsZURyYWdPdmVyIiwiZGF0YVRyYW5zZmVyIiwib25GaWxlRHJhZ0VudGVyIiwib25GaWxlRHJhZ0xlYXZlIiwib25GaWxlRHJvcCIsImJ1bGtEcmFnRHJvcEhlbHBlciIsImZpbGVzIiwiZXh0cmFjdEZpbGVzRnJvbUV2ZW50IiwiZiIsInN1YmplY3QiLCJNb2RlbCIsImZpbGVNb2RlbCIsImVycm9yQ291bnQiLCJmaWxlTW9kZWxzIiwiZ2V0UmVzb3VyY2VNb2RlbCIsInZhbHVlcyIsImNhbmNlbGVkRmlsZXMiLCJvblVwbG9hZENhbmNlbCIsInNldFNhdmVRdWV1ZSIsIm9uQ2FuY2VsRmlsZURyb3AiLCJzdG9wUHJvcGFnYXRpb24iLCJtZXJnZSIsInRvSlNPTiIsIm9uVXBsb2FkUHJvZ3Jlc3MiLCJzaGlmdCIsImNpZCIsImJpbmFyeVNhdmUiLCJ2YWxpZGF0ZSIsIndhaXQiLCJhdHRyaWJ1dGVzIiwic2F2ZVJlc291cmNlU3VjY2VzcyIsInNhdmVSZXNvdXJjZUVycm9yIiwic3RhdHVzVGV4dCIsInJldHJ5IiwicmVzcG9uc2VKU09OIiwid3NDb25uZWN0ZWQiLCJwZXJjZW50YWdlIiwiYWJvcnQiLCJvbGRBdHRyaWJ1dGVzIiwib25BdHRhY2htZW50RGVsZXRlck1vdXNlRW50ZXIiLCJvbkF0dGFjaG1lbnREZWxldGVyTW91c2VPdmVyIiwib25BdHRhY2htZW50RGVsZXRlck1vdXNlTGVhdmUiLCJsb3dsaWdodEF0dGFjaG1lbnRFbGVtZW50IiwiU2hvd0F0dGFjaG1lbnRCaW4iLCJIaWRlQXR0YWNobWVudEJpbiIsImRlbGV0ZWRBdHRhY2htZW50cyIsIm9yaWdpbmFsQXR0YWNobWVudCIsImhpZ2hsaWdodEF0dGFjaG1lbnRFbGVtZW50IiwiVG9hc3QiLCJjb250ZW50IiwiaWNvbiIsImljb25Db2xvdXIiLCJDb25uZWN0aW9uRXJyb3JEaWFsb2ciLCJ3c0Rpc2Nvbm5lY3RlZCIsImRlZmF1bHRzIiwibGlua3MiLCJuYXZWZXJzaW9uIiwiR2V0TmF2VmVyc2lvbiIsIkJhc2VVUkwiLCJMaW5rSW5kZXgiLCJoYXNMb2NhbFN0b3JhZ2UiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsIlBhZ2VDaGFuZ2UiLCJwYWdlQ2hhbmdlIiwicGVuZGluZ1BhZ2UiLCJwRGF0YSIsImZvcmNlIiwic2lsZW50IiwiaW5kZXhPZiIsInBheWxvYWQiLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwicGFyc2UiLCJfc2VjdGlvbiIsIl9vZmZzZXQiLCJ0aGlzUGFnZSIsInJlZHVjZSIsInN1bSIsIm51bSIsInNldEl0ZW0iLCJmaW5kTGFzdCIsInJvbWFuVG9JbnQiLCJzdHIiLCJyb21hblN0cmluZyIsInRvVXBwZXJDYXNlIiwidmFsaWRhdG9yIiwia2V5IiwiTSIsIkNNIiwiRCIsIkNEIiwiQyIsIlhDIiwiTCIsIlhMIiwiWCIsIklYIiwiViIsIklWIiwiSSIsIm0iLCJ0ZXN0IiwiTmFOIiwiZXhlYyIsIm1pblBhZ2VOdW1iZXIiLCJrZXlzIiwibWluQnkiLCJ2IiwiayIsImlzTmFOIiwib3JpZ2luYWxQYWdlTnVtYmVyIiwiU2V0UGFnZSIsIkF0dGFjaG1lbnQiLCJpZEF0dHJpYnV0ZSIsImlzQmVmb3JlIiwiY3VycmVudFllYXIiLCJHZXRBbGxvd2VkR3JvdXBzIiwiY29uY2F0IiwiY3VzdG9tIiwiQ29sbGVjdGlvbiIsIkF0dGFjaG1lbnREZXRhaWxWaWV3IiwidGVtcGxhdGUiLCJkZXNjcmlwdGlvbiIsInByZXZpZXciLCJhY3Rpb25GaW5kUmVzb3VyY2UiLCJhY3Rpb25TZWxlY3RHcm91cHMiLCJhY3Rpb25PcGVuUmVzb3VyY2UiLCJhY3Rpb25DbG9uZSIsImFjdGlvblJlc291cmNlT3BlbmVkQnkiLCJjbG9uZWFibGUiLCJzaGFyZWQiLCJzaG93Q29kZSIsInNob3dUaXBweSIsIkF0dGFjaG1lbnRNb2RlbCIsImVuYWJsZUFjdGlvbiIsImRpc2FibGVBY3Rpb24iLCJsb2FkUHJldmlldyIsInRoZW1lIiwicGxhY2VtZW50IiwiYXJyb3ciLCJhdHRyIiwib25BY3Rpb25GaW5kUmVzb3VyY2UiLCJPcGVuUmVzb3VyY2VzIiwiRmluZFJlc291cmNlIiwib25BY3Rpb25TZWxlY3RHcm91cHMiLCJnbSIsImN1cnJlbnRHcm91cHMiLCJmb3JBdHRhY2htZW50Iiwib2siLCJwYXRjaCIsIm9uQWN0aW9uT3BlblJlc291cmNlIiwiY29uZmlybSIsImN1c3RvbU9LIiwiaW1hZ2UiLCJwcmV2aWV3TW9kZSIsInJlc3RhcnQiLCJvbkFjdGlvbkNsb25lIiwib25BY3Rpb25TaGFyZWQiLCJ4b3IiLCJyZWFsQ29kZSIsIm9uQWN0aW9uUmVzb3VyY2VPcGVuZWRCeSIsInJlc291cmNlT3BlbmVkTW9kYWwiLCJBdHRhY2htZW50UHJvZ3Jlc3NWaWV3IiwiYXR0YWNobWVudFByb2dyZXNzIiwiZXJyb3JCdXR0b24iLCJjYW5jZWxCdXR0b24iLCJjb21wbGV0ZWRCdXR0b24iLCJwcm9ncmVzc0JhciIsIm1vZGVsRXZlbnRzIiwiY29udGVudEljb25zIiwic2luZ2xlSWNvbiIsIm1hcFJlc291cmNlVG9JY29uIiwidXBsb2FkU3VjY2VzcyIsIm9uRXJyb3JzQ2hhbmdlIiwib25Db21wbGV0ZWRDbGljayIsIm9uQ2FuY2VsQ2xpY2siLCJhbmltYXRlIiwidXBsb2FkRXJyb3IiLCJBdHRhY2htZW50c1VwbG9hZFZpZXciLCJDb2xsZWN0aW9uVmlldyIsImNoaWxkVmlldyIsImFnZUljb24iLCJuYXRpb25hbGl0eUljb24iLCJzaGFyZWRJY29uIiwidmlzaWJsZUljb24iLCJsb2NrZWRJY29uIiwiaGlnaGxpZ2h0T3ZlcmxheSIsImVycm9ySWNvbiIsIm1vdXNlb3ZlciIsIm1vdXNlb3V0IiwibW91c2Vkb3duIiwiZGVsZXRlU2VsZiIsImlzUGFydE9mIiwiaGlnaGxpZ2h0IiwibG93bGlnaHQiLCJvbkF0dGFjaG1lbnRSZW1vdmVkIiwib25BdHRhY2htZW50c1Jlc2V0Iiwic2hvd1Rvb2x0aXAiLCJoaWRlVG9vbHRpcHMiLCJhZGRTeW5jTGlzdGVuZXJzIiwiYWRkRm9jdXNMaXN0ZW5lciIsImV2ZW50VGFyZ2V0IiwidGFyZ2V0IiwiaXMiLCJpc0NvbXBvdW5kIiwiQXR0YWNobWVudFRvb2x0aXAiLCJjaGlsZHJlbiIsIlRvZ2dsZUxvY2tlZEF0dGFjaG1lbnRzIiwidG9nZ2xlTG9ja2VkQXR0YWNobWVudHMiLCJpc0VtcHR5IiwiaXNTYXZlZCIsImF0IiwiaXNOZXciLCJCb29sZWFuIiwiY29udGFpbnNPbGRBdHRhY2htZW50IiwiY29udGFpbnNTaGFyZWRBdHRhY2htZW50IiwiY29udGFpbnNOZXdBdHRhY2htZW50IiwiY29udGFpbnNGb3JlaWduQXR0YWNobWVudCIsImNvbnRhaW5zTmF0aXZlQXR0YWNobWVudCIsImdldFJlc291cmNlVHlwZSIsInNhdmluZyIsIkRlc3Ryb3llZCIsImRyYWdnYWJsZSIsInNhdmVkIiwidXBkYXRlRm9jdXMiLCJyZW1vdmVGb2N1c0xpc3RlbmVyIiwicmVtb3ZlU3luY0xpc3RlbmVycyIsInVwZGF0ZSIsIm9uTW91c2VPdmVyIiwib25Nb3VzZU91dCIsInVwZGF0ZUljb24iLCJ1cGRhdGVEcmFnZ2FibGUiLCJ1cGRhdGVUb29sdGlwcyIsInNpbmdsZUljb25QcmVmaXgiLCJtdWx0aUljb25QcmVmaXgiLCJtdWx0aUljb24iLCJ0b29sdGlwIiwic2V0Q29udGVudCIsImRlc3Ryb3lUb29sdGlwIiwiVXBsb2FkVG9vbHRpcCIsIkRldGFpbFRvb2x0aXAiLCJpbnRlcmFjdGl2ZSIsImRpc3RhbmNlIiwib25TaG93IiwicG9wcGVyIiwib25TaG93biIsIl90aXBweSIsIm11bHRpcGxlIiwiQXR0YWNobWVudExpc3RWaWV3IiwiYnVpbGRDaGlsZFZpZXciLCJjaGlsZCIsIkNoaWxkVmlld0NsYXNzIiwiY2hpbGRWaWV3T3B0aW9ucyIsInBhcmVudCIsIm9uQWRkQ2hpbGQiLCJjb2xsZWN0aW9uVmlldyIsImZsaXAiLCJjb250ZXh0IiwiZGVzdHJveWVkIiwiZGVzdHJveWluZyIsImlzRGVzdHJveWVkIiwib25IaWdobGlnaHRPdmVybGF5QW5pbWF0aW9uRW5kIiwidG9nZ2xlVG9vbHRpcCIsImhpZGVUb29sdGlwIiwibW91c2VEb3duU3RhcnQiLCJkcmFnU3RhcnRlZCIsImRyYWdnaW5nRWxlbWVudCIsInNhdmluZ0F0dGFjaG1lbnRzIiwiRHJhZ2dpbmdFbGVtZW50IiwiZHJhZ2dpbmdOb2RlIiwicG9zaXRpb24iLCJ6SW5kZXgiLCJtb3ZlQXQiLCJwYWdlWCIsInBhZ2VZIiwicmVtb3ZlQ2hpbGQiLCJiaW5JY29uWCIsImJpbkljb25ZIiwiYmluSWNvbkhlaWdodCIsImJpbkljb25XaWR0aCIsImRlbGV0ZVJlc291cmNlIiwiZGVzdHJveVN1Y2Nlc3MiLCJkZXN0cm95RXJyb3IiLCJhbnN3ZXIiLCJEZXN0cm95RXJyb3JEaWFsb2ciLCJpc05pbCIsInByZXZpb3VzTW9kZWxzIiwiaGlkZVN0YXRlIiwiZ2V0RXJyb3JNZXNzYWdlIiwiZXJyb3JzIiwib25FcnJvckNsaWNrIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7QUFDQSxJQUFNQSxVQUFVQyxRQUFRLFVBQVIsQ0FBaEI7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1FLElBQUlGLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUcsV0FBV0gsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUksU0FBU0osUUFBUSxRQUFSLENBQWY7QUFDQSxJQUFNSyxTQUFTTCxRQUFRLFFBQVIsQ0FBZjtBQUNBLElBQU1NLFNBQVNOLFFBQVEsUUFBUixDQUFmO0FBQ0EsSUFBTU8sV0FBV1AsUUFBUSxVQUFSLENBQWpCO0FBQ0Es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SSxZQUFTK0MsT0FBVCxDQUFpQi9DLFNBQVNnRCxNQUFULENBQWdCMk0saUJBQWpDLEVBQW9ELEtBQUs0QyxvQkFBTCxDQUEwQithLEVBQTFCLENBQTZCLENBQTdCLENBQXBEO0FBQ0EsUUFBSy9hLG9CQUFMLENBQTBCK0UsTUFBMUIsR0FBbUNuWixFQUFFK1YsTUFBRixDQUFTLEtBQUszQixvQkFBTCxDQUEwQitFLE1BQW5DLEVBQ2xDO0FBQUEsV0FBYyxDQUFDclQsV0FBVzFELEdBQVgsQ0FBZSxRQUFmLENBQUQsSUFBOEIwRCxXQUFXMUQsR0FBWCxDQUFlLFFBQWYsS0FBNEJwQyxFQUFFK2lCLE1BQUYsQ0FBU2pkLFdBQVcxRCxHQUFYLENBQWUsUUFBZixDQUFULEVBQW1DNkIsTUFBbkMsS0FBOEMsQ0FBdEg7QUFBQSxJQURrQyxDQUFuQztBQUVBOztBQUVEbEUsSUFBRSxnQkFBRixFQUFvQndILFFBQXBCLENBQTZCLE1BQTdCOztBQUVBLE1BQUksS0FBS3RGLEVBQUwsQ0FBUTByQixTQUFSLENBQWtCcG1CLFFBQXRCLEVBQ0MsS0FBS3RGLEVBQUwsQ0FBUTByQixTQUFSLENBQWtCcG1CLFFBQWxCLENBQTJCLE1BQTNCOztBQUVELE1BQUksS0FBSzZNLG9CQUFMLENBQTBCK0UsTUFBMUIsQ0FBaUNsVixNQUFqQyxLQUE0QyxDQUFoRCxFQUNDLEtBQUtxRyxPQUFMO0FBQ0QsRUF4eEI2RDs7QUEweEI5RHVpQixpQkFBZ0IsMEJBQVc7QUFDMUIsTUFBSSxLQUFLNXFCLEVBQUwsQ0FBUTByQixTQUFSLENBQWtCcG1CLFFBQXRCLEVBQ0MsS0FBS3RGLEVBQUwsQ0FBUTByQixTQUFSLENBQWtCcG1CLFFBQWxCLENBQTJCLE1BQTNCO0FBQ0Q7QUE3eEI2RCxDQUFoQyxDQUEvQiIsImZpbGUiOiJib29rVmlldy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgUHJvbWlzZSA9IHJlcXVpcmUoXCJibHVlYmlyZFwiKTtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IG1vbWVudCA9IHJlcXVpcmUoXCJtb21lbnRcIik7XG5jb25zdCByYXlndW4gPSByZXF1aXJlKFwicmF5Z3VuXCIpO1xuY29uc3QgcmVzdGVyID0gcmVxdWlyZShcInJlc3RlclwiKTtcbmNvbnN0IFNsaWRlb3V0ID0gcmVxdWlyZShcInNsaWRlb3V0XCIpO1xuY29uc3QgdGlwcHkgPSByZXF1aXJlKFwidGlwcHkuanNcIikuZGVmYXVsdDtcbmNvbnN0IGxpbmtTZXJ2aWNlID0gcmVxdWlyZShcImxpbmtTZXJ2aWNlXCIpO1xuXG5jb25zdCBBcHAgPSByZXF1aXJlKFwiLi4vLi4vLi4vaW5kZXhcIik7XG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcblxuY29uc3QgQXR0YWNobWVudFJlY292ZXJ5TW9kYWwgPSByZXF1aXJlKFwiLi9hdHRhY2htZW50UmVjb3ZlcnlNb2RhbFwiKTtcbmNvbnN0IEVwdWJOYXZpZ2F0aW9uU2lkZWJhciA9IHJlcXVpcmUoXCIuL2VwdWJOYXZpZ2F0aW9uXCIpO1xuY29uc3QgRmxhc2hDYXJkV2lkZ2V0ID0gcmVxdWlyZShcIi4uLy4uLy4uL2NvbnRlbnQvdmlld3MvZmxhc2hDYXJkcy9jYXJkV2lkZ2V0XCIpO1xuY29uc3QgTGlnaHRCb3ggPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL2xpZ2h0Qm94XCIpO1xuY29uc3QgR3JvdXBNb2RhbCA9IHJlcXVpcmUoXCIuL2dyb3VwTW9kYWxcIik7XG5jb25zdCBQZGZOYXZpZ2F0aW9uU2lkZWJhciA9IHJlcXVpcmUoXCIuL3BkZk5hdmlnYXRpb25cIik7XG5jb25zdCBSZXNvdXJjZSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb250ZW50L21vZGVscy9tYW5hZ2VyL3Jlc291cmNlTW9kZWxcIik7XG5jb25zdCBTbWFsbE1vZGFsID0gcmVxdWlyZShcIi4uLy4uLy4uL2xpYi9zbWFsbE1vZGFsXCIpO1xuY29uc3QgQnVsa0RyYWdEcm9wSGVscGVyID0gcmVxdWlyZShcIi4uLy4uLy4uL2xpYi9idWxrRHJhZ0Ryb3BIZWxwZXJcIik7XG5jb25zdCBCdWxrUmVzb3VyY2VVcGxvYWRNb2RhbCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9saWIvYnVsa1Jlc291cmNlVXBsb2FkTW9kYWxcIik7XG5jb25zdCBBc3Nlc3NtZW50UHJvbXB0ID0gcmVxdWlyZShcIi4uLy4uLy4uL2xpYi9hc3Nlc3NtZW50UHJvbXB0XCIpO1xuY29uc3QgUmVzb3VyY2VPcGVuZWRNb2RhbCA9IHJlcXVpcmUoXCIuL3Jlc291cmNlT3BlbmVkTW9kYWxcIik7XG5jb25zdCBBc3Nlc3NtZW50ID0gcmVxdWlyZShcIi4uLy4uLy4uL2xpYi9hc3Nlc3NtZW50TW9kZWxcIik7XG5jb25zdCBBc3Nlc3NtZW50TW9kYWwgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL2Fzc2Vzc21lbnRNb2RhbFwiKTtcbmNvbnN0IEZsYXNoY2FyZFByZXZpZXcgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL2ZsYXNoY2FyZFByZXZpZXdcIik7XG5cbmNvbnN0IGV2ZW50QnVzID0gcmVxdWlyZShcIi4vZXZlbnRCdXNcIik7XG5cbmxldCBhdHRhY2htZW50c1NhdmluZyA9IDA7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE1peGluc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuY29uc3QgU2xpZGVvdXRNaXhpbiA9IHtcblx0Y29uZmlndXJlVUk6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghdGhpcy51aS5jbG9zZS5yZW1vdmVDbGFzcyB8fCAhJChcIiNjb250ZW50LXJlZ2lvblwiKS5nZXQoMCkpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLnVpLmNsb3NlLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblxuXHRcdHRoaXMuU2xpZGVvdXQgPSBuZXcgU2xpZGVvdXQoe1xuXHRcdFx0cGFuZWw6ICQoXCIjY29udGVudC1yZWdpb25cIikuZ2V0KDApLFxuXHRcdFx0bWVudTogdGhpcy4kZWwuZ2V0KDApLFxuXHRcdFx0cGFkZGluZzogNTEwLFxuXHRcdFx0dG9sZXJhbmNlOiAyMCxcblx0XHR9KTtcblxuXHRcdHRoaXMuU2xpZGVvdXQuY2xvc2UoKTtcblx0fSxcblxuXHRzaG93OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLlNsaWRlb3V0Lm9wZW4oKTtcblx0fSxcblxuXHRoaWRlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLlNsaWRlb3V0LmNsb3NlKCk7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLlNsaWRlb3V0LmNsb3NlKCk7XG5cdH0sXG5cblx0Y2xvc2U6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuU2xpZGVvdXQuY2xvc2UoKTtcblx0fSxcbn07XG5cbmNvbnN0IEVwdWJNaXhpbiA9IHtcblx0b25Cb29rTG9hZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jb250ZW50V2luZG93ID0gJChcIiNib29rLWRpc3BsYXlcIikuZ2V0KDApLmNvbnRlbnRXaW5kb3c7XG5cblx0XHQvLyQod2luZG93KS5vbihcImNsaWNrXCIsIHRoaXMub25XaW5kb3dDbGljay5iaW5kKHRoaXMpKTtcblx0XHQvLyQodGhpcy5jb250ZW50V2luZG93KS5vbihcImNsaWNrXCIsIHRoaXMub25XaW5kb3dDbGljay5iaW5kKHRoaXMpKTtcblx0XHQkKHRoaXMuY29udGVudFdpbmRvdykub24oXCJtb3VzZWRvd25cIiwgdGhpcy5vbk1vdXNlRG93bi5iaW5kKHRoaXMpKTtcblx0XHQkKHRoaXMuY29udGVudFdpbmRvdykub24oXCJtb3VzZW1vdmVcIiwgdGhpcy5vbk1vdXNlTW92ZS5iaW5kKHRoaXMpKTtcblx0XHQvLyQodGhpcy5jb250ZW50V2luZG93KS5vbihcIm1vdXNldXBcIiwgdGhpcy5vbk1vdXNlVXAuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0b25Nb3VzZURvd246IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuaGlnaGxpZ2h0UmVwbGF5ID0gW107XG5cdFx0dGhpcy5oaWdobGlnaHRpbmcgPSB0cnVlO1xuXHR9LFxuXG5cdG9uTW91c2VNb3ZlOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGlmICh0aGlzLmhpZ2hsaWdodGluZykge1xuXHRcdFx0dGhpcy5oaWdobGlnaHRSZXBsYXkucHVzaCh7XG5cdFx0XHRcdHg6IGV2ZW50LmNsaWVudFgsXG5cdFx0XHRcdHk6IGV2ZW50LmNsaWVudFksXG5cdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0b25Nb3VzZVVwOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmhpZ2hsaWdodGluZyA9IGZhbHNlO1xuXG5cdFx0Y29uc3Qgc2VsZWN0aW9uID0gdGhpcy5jb250ZW50V2luZG93LmdldFNlbGVjdGlvbigpO1xuXG5cdFx0aWYgKHNlbGVjdGlvbi50b1N0cmluZygpLmxlbmd0aCA+IDApXG5cdFx0XHR0aGlzLnNob3dIaWdobGlnaHRUb29sYmFyKHNlbGVjdGlvbik7XG5cdH0sXG5cblx0b25XaW5kb3dDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3Qgc2VsZWN0aW9uID0gdGhpcy5jb250ZW50V2luZG93LmdldFNlbGVjdGlvbigpO1xuXG5cdFx0aWYgKHNlbGVjdGlvbi50b1N0cmluZygpLmxlbmd0aCA9PT0gMClcblx0XHRcdHRoaXMuaGlnaGxpZ2h0VG9vbGJhci5oaWRlKCk7XG5cdH0sXG5cblx0b25Cb29rQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0JCh0aGlzLmNvbnRlbnRXaW5kb3cpLm9mZihcImNsaWNrXCIpO1xuXHRcdCQodGhpcy5jb250ZW50V2luZG93KS5vZmYoXCJtb3VzZXVwXCIpO1xuXHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLmhpZ2hsaWdodFRvb2xiYXIpO1xuXHRcdCQod2luZG93KS5vZmYoXCJjbGlja1wiKTtcblx0fSxcblxuXHRsb2FkU2VjdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLnVpLmJvb2suZ2V0KVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0Ly8gSWdub3JlIG9mZnNldCBjaGFuZ2VzIHdoaWxlIHdlIGxvYWQgYSBuZXcgcGFnZVxuXHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLm5hdmlnYXRvciwgXCJjaGFuZ2U6b2Zmc2V0XCIpO1xuXG5cdFx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5FdmVudHMuTG9hZFN0YXJ0LCBcIm1wdWJcIik7XG5cdFx0dGhpcy5sb2FkZWQgPSBmYWxzZTtcblxuXHRcdGxldCB1cmwgPSB0aGlzLm5hdmlnYXRvci5nZXQoXCJ1cmxcIik7XG5cdFx0dXJsID0gdXJsLnJlcGxhY2UoL1xcW3VwXFxdL2csIFwiLi4vXCIpLnJlcGxhY2UoL1xcW2N1cnJlbnRcXF0vZywgXCIuL1wiKTtcblxuXHRcdGlmIChfLmluY2x1ZGVzKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gsIFwibWltZW92ZXJyaWRlPTFcIikpXG5cdFx0XHR1cmwgKz0gXCI/bWltZW92ZXJyaWRlPTFcIjtcblx0XHR0aGlzLnVpLmJvb2suZ2V0KDApLnNyYyA9IHVybDtcblx0fSxcblxuXHRsb2FkU2VjdGlvbk9mZnNldDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLnVpLmJvb2suZ2V0KDApLmNvbnRlbnRXaW5kb3cpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRjb25zdCBvZmZzZXQgPSB0aGlzLm5hdmlnYXRvci5nZXQoXCJvZmZzZXRcIikgfHwgMDtcblx0XHRpZiAob2Zmc2V0KVxuXHRcdFx0dGhpcy51aS5ib29rLmdldCgwKS5jb250ZW50V2luZG93LnNjcm9sbFRvKDAsIG9mZnNldCk7XG5cdH0sXG5cblx0bWFwU2VsZWN0b3I6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG5cdFx0cmV0dXJuIHNlbGVjdG9yO1xuXHR9LFxuXG5cdGdldEF0dGFjaG1lbnRBdFNlbGVjdG9yOiBmdW5jdGlvbihzZWxlY3Rvcikge1xuXHRcdHJldHVybiB0aGlzLkF0dGFjaG1lbnRWaWV3c1tzZWxlY3Rvcl07XG5cdH0sXG5cblx0anVtcFRvQXR0YWNobWVudDogZnVuY3Rpb24oYXR0YWNobWVudCkge1xuXHRcdGNvbnN0IHNjcm9sbFRvQXR0YWNobWVudCA9ICgpID0+IHtcblx0XHRcdGNvbnN0IGVsZW1lbnQgPSAkKHRoaXMucmVzb2x2ZURPTVNlbGVjdG9yKGF0dGFjaG1lbnQuZ2V0KFwic2VsZWN0b3JcIikpKTtcblx0XHRcdGlmIChlbGVtZW50Lmxlbmd0aCA9PT0gMClcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRpZiAoKHRoaXMudWkuYm9vay5nZXQoMCkuY29udGVudFdpbmRvdy5zY3JvbGxZIHx8IHRoaXMudWkuYm9vay5nZXQoMCkuY29udGVudFdpbmRvdy5wYWdlWU9mZnNldCkgPT09IH5+KGVsZW1lbnQub2Zmc2V0KCkudG9wKSkge1xuXHRcdFx0XHRhdHRhY2htZW50LnRyaWdnZXIoXCJmb2N1c1wiKTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRjb25zdCBqdW1wTGlzdGVuZXIgPSAoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5zY3JvbGxBdHRhY2htZW50Q29udGFpbmVyKCk7XG5cdFx0XHRcdFx0YXR0YWNobWVudC50cmlnZ2VyKFwiZm9jdXNcIik7XG5cdFx0XHRcdFx0dGhpcy51aS5ib29rLmdldCgwKS5jb250ZW50V2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwganVtcExpc3RlbmVyKTtcblx0XHRcdFx0XHR0aGlzLnVpLmJvb2suZ2V0KDApLmNvbnRlbnRXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCBfLnRocm90dGxlKHRoaXMub25TY3JvbGwuYmluZCh0aGlzKSwgMTApKTtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHR0aGlzLnVpLmJvb2suZ2V0KDApLmNvbnRlbnRXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCBqdW1wTGlzdGVuZXIpO1xuXG5cdFx0XHRcdC8vIFNjcm9sbCB0aGUgYm9vayBpZnJhbWUgYW5kIHRoZSBhdHRhY2htZW50IGNvbnRhaW5lclxuXHRcdFx0XHR0aGlzLnVpLmJvb2suZ2V0KDApLmNvbnRlbnRXaW5kb3cuc2Nyb2xsVG8oMCwgZWxlbWVudC5vZmZzZXQoKS50b3ApO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRpZiAodGhpcy5nZXRDdXJyZW50U2VjdGlvbigpLnRvU3RyaW5nKCkgPT09IGF0dGFjaG1lbnQuZ2V0KFwic2VjdGlvblwiKS50b1N0cmluZygpKSB7XG5cdFx0XHRzY3JvbGxUb0F0dGFjaG1lbnQoKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHQvLyBMb2FkIHRoZSBhdHRhY2htZW50J3Mgc2VjdGlvblxuXHRcdFx0dGhpcy51aS5ib29rLmxvYWQoKCkgPT4ge1xuXHRcdFx0XHRpZiAoIXRoaXMudWkuYm9vay5sb2FkKVxuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHQvLyBJbnZva2UgdGhlIG9yaWdpbmFsIGV2ZW50IGhhbmRsZXJcblx0XHRcdFx0dGhpcy5vbkxvYWQoKTtcblxuXHRcdFx0XHRzY3JvbGxUb0F0dGFjaG1lbnQoKTtcblxuXHRcdFx0XHQvLyBSZXBsYWNlIHRoaXMgZXZlbnQgaGFuZGxlciB3aXRoIHRoZSBvcmlnaW5hbFxuXHRcdFx0XHR0aGlzLnVpLmJvb2subG9hZCh0aGlzLm9uTG9hZC5iaW5kKHRoaXMpKTtcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLm5hdmlnYXRvci5uYXZpZ2F0ZVRvU2VjdGlvbihhdHRhY2htZW50LmdldChcInNlY3Rpb25cIikpO1xuXHRcdH1cblx0fSxcblxuXHRzY3JvbGxBdHRhY2htZW50Q29udGFpbmVyOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoKHRoaXMudWkuYm9vay5nZXQoMCkuY29udGVudFdpbmRvdy5zY3JvbGxZIHx8IHRoaXMudWkuYm9vay5nZXQoMCkuY29udGVudFdpbmRvdy5wYWdlWU9mZnNldCkgPT09IHBhcnNlSW50KHRoaXMudWkuYXR0YWNobWVudENvbnRhaW5lci5nZXQoMCkudG9wLCAxMCkgKiAtMSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMudWkuYXR0YWNobWVudENvbnRhaW5lci5jc3Moe1xuXHRcdFx0dG9wOiAoKHRoaXMudWkuYm9vay5nZXQoMCkuY29udGVudFdpbmRvdy5zY3JvbGxZIHx8IHRoaXMudWkuYm9vay5nZXQoMCkuY29udGVudFdpbmRvdy5wYWdlWU9mZnNldCkgKiAtMSkgKyBcInB4XCIsXG5cdFx0fSk7XG5cblx0XHRldmVudEJ1cy50cmlnZ2VyKFwiYXR0YWNobWVudHM6c2Nyb2xsXCIpO1xuXHR9LFxuXG5cdG9uU2Nyb2xsOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIXRoaXMubmF2aWdhdG9yKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0aWYgKHRoaXMuZ2V0Q3VycmVudFNlY3Rpb24odHJ1ZSwgdHJ1ZSkpXG5cdFx0XHR0aGlzLm5hdmlnYXRvci5zeW5jaHJvbml6ZSh0aGlzLmdldEN1cnJlbnRTZWN0aW9uKHRydWUsIHRydWUpLCB0aGlzLnVpLmJvb2suZ2V0KDApLmNvbnRlbnRXaW5kb3cuc2Nyb2xsWSB8fCB0aGlzLnVpLmJvb2suZ2V0KDApLmNvbnRlbnRXaW5kb3cucGFnZVlPZmZzZXQpO1xuXG5cdFx0dGhpcy5zY3JvbGxBdHRhY2htZW50Q29udGFpbmVyKCk7XG5cdFx0dGhpcy5wb2xsTmF2aWdhdGVQcmV2aW91cygpO1xuXHRcdHRoaXMucG9sbE5hdmlnYXRlTmV4dCgpO1xuXHR9LFxuXG5cdHBvbGxOYXZpZ2F0ZVByZXZpb3VzOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5uYXZpZ2F0b3IucG9sbE5hdmlnYXRlUHJldmlvdXMoKSAmJiAoKHRoaXMudWkuYm9vay5nZXQoMCkuY29udGVudFdpbmRvdy5zY3JvbGxZIHx8IHRoaXMudWkuYm9vay5nZXQoMCkuY29udGVudFdpbmRvdy5wYWdlWU9mZnNldCkgPD0gdGhpcy5oZWlnaHQgKiAyKSlcblx0XHRcdHRoaXMudWkubmF2UHJldmlvdXMucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMudWkubmF2UHJldmlvdXMuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdHBvbGxOYXZpZ2F0ZU5leHQ6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLm5hdmlnYXRvci5wb2xsTmF2aWdhdGVOZXh0KCkgJiYgKCh0aGlzLnVpLmJvb2suZ2V0KDApLmNvbnRlbnRXaW5kb3cuc2Nyb2xsWSB8fCB0aGlzLnVpLmJvb2suZ2V0KDApLmNvbnRlbnRXaW5kb3cucGFnZVlPZmZzZXQpID49ICh0aGlzLmNvbnRlbnRIZWlnaHQgLSAodGhpcy5oZWlnaHQgKiAyKSkpKVxuXHRcdFx0dGhpcy51aS5uYXZOZXh0LnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnVpLm5hdk5leHQuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdHJlc2l6ZUF0dGFjaG1lbnRDb250YWluZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghdGhpcy51aS5ib29rLmdldCgwKS5jb250ZW50V2luZG93LmRvY3VtZW50LmJvZHkpXG5cdFx0XHRyZXR1cm47XG5cblx0XHQvLyBTZXQgdGhlIGhlaWdodCBvZiB0aGUgYXR0YWNobWVudCBjb250YWluZXIgdG8gdGhhdCBvZiB0aGUgY3VycmVudGx5IGxvYWRlZCBib29rIHNlY3Rpb24gaW4gdGhlIGlmcmFtZVxuXHRcdHRoaXMudWkuYXR0YWNobWVudENvbnRhaW5lci5jc3Moe1xuXHRcdFx0aGVpZ2h0OiB0aGlzLnVpLmJvb2suZ2V0KDApLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQgKyBcInB4XCIsXG5cdFx0fSk7XG5cdH0sXG5cblx0Z2V0Q3VycmVudFNlY3Rpb246IGZ1bmN0aW9uKHdpdGhBbmNob3IpIHtcblx0XHQvL1x0XHRsZXQgY29tcG9uZW50cyA9IHRoaXMudWkuYm9vay5nZXQoMCkuY29udGVudFdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuXHRcdGxldCBjb21wb25lbnRzID0gLypxdWVyeUVtYmVkZGVkID8gdGhpcy51aS5ib29rLmdldCgwKS5jb250ZW50V2luZG93LmxvY2F0aW9uLmhyZWYgOiAqL3RoaXMubmF2aWdhdG9yLmdldChcInVybFwiKTtcblxuXHRcdGlmIChfLnN0YXJ0c1dpdGgoY29tcG9uZW50cywgXCJhYm91dDpcIikpXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRpZiAoIXdpdGhBbmNob3IpXG5cdFx0XHRjb21wb25lbnRzID0gY29tcG9uZW50cy5zcGxpdChcIiNcIilbMF07XG5cblx0XHRjb21wb25lbnRzID0gY29tcG9uZW50cy5zcGxpdChcImFjYWNpYS9lcHViL2ZpbGVzL1wiKVsxXTtcblxuXHRcdGlmICghY29tcG9uZW50cylcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkVycm9yIHBhcnNpbmcgcGFnZSBwYXRoOiBcIiArIHRoaXMubmF2aWdhdG9yLmdldChcInVybFwiKSk7XG5cblx0XHRjb21wb25lbnRzID0gY29tcG9uZW50cy5zcGxpdChcIi9cIik7XG5cblx0XHRyZXR1cm4gXy5kcm9wKGNvbXBvbmVudHMsIDMpLmpvaW4oXCIvXCIpLnJlcGxhY2UodGhpcy5tZXRhZGF0YS5nZXQoXCJiYXNlUGF0aFwiKSArIFwiL1wiLCBcIlwiKTtcblx0fSxcblxuXHRnZXRCb29rRWxlbWVudEF0OiBmdW5jdGlvbih4LCB5KSB7XG5cdFx0Y29uc3QgcmV0ID0gdGhpcy51aS5ib29rLmdldCgwKS5jb250ZW50V2luZG93LmRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoTWF0aC5yb3VuZCh4IC0gdGhpcy5PdmVybGF5QmFzZS5sZWZ0KSwgTWF0aC5mbG9vcih5IC0gdGhpcy5PdmVybGF5QmFzZS50b3ApKTtcblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXG5cdGJ1aWxkRE9NU2VsZWN0b3I6IGZ1bmN0aW9uKGVsKSB7XG5cdFx0aWYgKCFlbClcblx0XHRcdHJldHVybiBcIlwiO1xuXG5cdFx0bGV0IGVsZW1lbnQgPSBlbDtcblxuXHRcdGNvbnN0IHNlbGVjdG9yID0gW107XG5cblx0XHR3aGlsZShlbGVtZW50LnBhcmVudE5vZGUgJiYgZWxlbWVudC5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09IFwiaHRtbFwiKSB7XG5cdFx0XHRzZWxlY3Rvci51bnNoaWZ0KGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC86L2csIFwiXFxcXDpcIikgKyBcIjpudGgtY2hpbGQoXCIgKyAoJChlbGVtZW50KS5pbmRleCgpICsgMSkgKyBcIilcIik7XG5cblx0XHRcdGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG5cdFx0fVxuXG5cdFx0c2VsZWN0b3IudW5zaGlmdChcImJvZHlcIik7XG5cblx0XHRyZXR1cm4gc2VsZWN0b3Iuam9pbihcIiA+IFwiKTtcblx0fSxcblxuXHRyZXNvbHZlRE9NU2VsZWN0b3I6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG5cdFx0aWYgKCF0aGlzLnVpLmJvb2suZ2V0KVxuXHRcdFx0cmV0dXJuIFwiXCI7XG5cblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuICQoc2VsZWN0b3IsIHRoaXMudWkuYm9vay5nZXQoMCkuY29udGVudFdpbmRvdy5kb2N1bWVudCk7XG5cdFx0fVxuXHRcdGNhdGNoIChlKSB7XG5cdFx0XHRpZiAoIXNldHRpbmdzLmRlYnVnIHx8IHNldHRpbmdzLnJlcG9ydEVycm9ycylcblx0XHRcdFx0cmF5Z3VuKFwic2VuZFwiLCBlKTtcblx0XHRcdHJldHVybiBcIlwiO1xuXHRcdH1cblx0fSxcblxuXHRyZXN0b3JlUHJldmlvdXNFbGVtZW50Qm9yZGVyOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5wcmV2aW91c0VsZW1lbnQpIHtcblx0XHRcdCQodGhpcy5wcmV2aW91c0VsZW1lbnQpLmNzcyh7XG5cdFx0XHRcdGJvcmRlcjogdGhpcy5wcmV2aW91c0VsZW1lbnRCb3JkZXIuc3R5bGUsXG5cdFx0XHR9KTtcblxuXG5cdFx0XHR0aGlzLnByZXZpb3VzRWxlbWVudCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH0sXG5cblx0cmVjb3JkRWxlbWVudEJvcmRlcjogZnVuY3Rpb24oZWxlbWVudCkge1xuXHRcdHRoaXMucHJldmlvdXNFbGVtZW50Qm9yZGVyID0ge1xuXHRcdFx0c3R5bGU6ICQoZWxlbWVudCkuY3NzKFwiYm9yZGVyXCIpLFxuXHRcdH07XG5cblx0XHR0aGlzLnByZXZpb3VzRWxlbWVudCA9IGVsZW1lbnQ7XG5cdH0sXG5cblx0c2V0RWxlbWVudEJvcmRlcjogZnVuY3Rpb24oZWxlbWVudCkge1xuXHRcdCQoZWxlbWVudCkuY3NzKHtcblx0XHRcdGJvcmRlcjogXCIycHggZG90dGVkICMwMDBcIixcblx0XHR9KTtcblx0fSxcbn07XG5cbmNvbnN0IFBkZk1peGluID0ge1xuXHRvbkJvb2tTaG93OiBmdW5jdGlvbigpIHtcblx0XHQkKFwiZGl2I2NhbnZhcy1kaXNwbGF5XCIpLmFwcGVuZChcIjxkaXYgY2xhc3M9XFxcInBkZi1saW5rcy1sYXllclxcXCI+PC9kaXY+XCIpO1xuXHRcdHRoaXMudWkucGRmTGlua3NMYXllciA9ICQoXCJkaXYucGRmLWxpbmtzLWxheWVyXCIsIFwiZGl2I2NhbnZhcy1kaXNwbGF5XCIpO1xuXHRcdHRoaXMudWkucGRmTGlua3NMYXllci5jc3Moe1xuXHRcdFx0Ly90b3A6IHRoaXMudWkuY2FudmFzLnBvc2l0aW9uKCkudG9wICsgXCJweFwiLFxuXHRcdFx0Ly9sZWZ0OiB0aGlzLnVpLmNhbnZhcy5wb3NpdGlvbigpLmxlZnQgKyBcInB4XCIsXG5cdFx0fSk7XG5cdH0sXG5cblx0b25Cb29rQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0JCh3aW5kb3cpLm9mZihcImNsaWNrXCIpO1xuXHR9LFxuXG5cdGxvYWRTZWN0aW9uOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBsb2FkQ3VycmVudFBhZ2UgPSAoKSA9PiB7XG5cdFx0XHQvLyBEZXN0cm95IHRoZSBQREYgZG9jdW1lbnQgaWYgdGhlIGJvb2sgY29udGFpbmVyIGVsZW1lbnQgd2FzIGRlc3Ryb3llZFxuXHRcdFx0aWYgKCEkKHRoaXMudWkuYm9vaykubGVuZ3RoKVxuXHRcdFx0XHRyZXR1cm4gdGhpcy5wZGZEb2N1bWVudC5kZXN0cm95KCk7XG5cblx0XHRcdGxldCBwYWdlTnVtYmVyID0gdGhpcy5uYXZpZ2F0b3IuZ2V0KFwidXJsXCIpO1xuXG5cdFx0XHRpZiAocGFnZU51bWJlciA8IDEgfHwgcGFnZU51bWJlciA+IHRoaXMucGRmRG9jdW1lbnQubnVtUGFnZXMpIHtcblx0XHRcdFx0cGFnZU51bWJlciA9IDE7XG5cdFx0XHRcdHRoaXMubmF2aWdhdG9yLnN5bmNocm9uaXplKDEsIDApO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmN1cnJlbnRQYWdlID0gcGFnZU51bWJlcjtcblxuXHRcdFx0cmV0dXJuIHRoaXMucGRmRG9jdW1lbnQuZ2V0UGFnZShwYWdlTnVtYmVyKS50aGVuKGFzeW5jIHBkZlBhZ2UgPT4ge1xuXHRcdFx0XHRpZiAoIXRoaXMudWkuY2FudmFzLndpZHRoKVxuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRjb25zdCB6b29tID0gdGhpcy56b29tIHx8IDE7XG5cblx0XHRcdFx0aWYgKCF0aGlzLmNhY2hlZENhbnZhc1dpZHRoKVxuXHRcdFx0XHRcdHRoaXMuY2FjaGVkQ2FudmFzV2lkdGggPSB0aGlzLnVpLmNhbnZhcy53aWR0aCgpO1xuXG5cdFx0XHRcdGNvbnN0IGRlc2lyZWRXaWR0aCA9IHRoaXMuY2FjaGVkQ2FudmFzV2lkdGggKiB6b29tO1xuXHRcdFx0XHRjb25zdCBzY2FsZSA9IGRlc2lyZWRXaWR0aCAvIHBkZlBhZ2UuZ2V0Vmlld3BvcnQoMSkud2lkdGg7XG5cdFx0XHRcdGNvbnN0IHNjYWxlZFZpZXdwb3J0ID0gcGRmUGFnZS5nZXRWaWV3cG9ydChzY2FsZSk7XG5cdFx0XHRcdGNvbnN0IGNhbnZhcyA9IHRoaXMudWkuY2FudmFzLmdldCgwKTtcblx0XHRcdFx0Y29uc3QgcmF0aW8gPSBzY2FsZWRWaWV3cG9ydC5oZWlnaHQgLyBzY2FsZWRWaWV3cG9ydC53aWR0aDtcblx0XHRcdFx0Y29uc3QgcmVuZGVyQ29udGV4dCA9IHtcblx0XHRcdFx0XHRjYW52YXNDb250ZXh0OiBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpLFxuXHRcdFx0XHRcdHZpZXdwb3J0OiBzY2FsZWRWaWV3cG9ydCxcblx0XHRcdFx0fTtcblxuXHRcdFx0XHQvLyBTY2FsZSB0aGUgY2FudmFzIHRoYXQgd2lsbCBkaXNwbGF5IHRoZSBQREYgcGFnZVxuXHRcdFx0XHR0aGlzLnVpLmNhbnZhcy5jc3MoeyBoZWlnaHQ6IHNjYWxlZFZpZXdwb3J0LndpZHRoICogcmF0aW8gfSk7XG5cdFx0XHRcdCQoXCIjY2FudmFzLWRpc3BsYXlcIikuY3NzKHsgaGVpZ2h0OiBzY2FsZWRWaWV3cG9ydC53aWR0aCAqIHJhdGlvIH0pO1xuXG5cdFx0XHRcdGNvbnN0IGNhbnZhc0VsZW1lbnQgPSB0aGlzLnVpLmNhbnZhcy5nZXQoMCk7XG5cdFx0XHRcdGNhbnZhc0VsZW1lbnQuaGVpZ2h0ID0gc2NhbGVkVmlld3BvcnQud2lkdGggKiByYXRpbztcblx0XHRcdFx0Y2FudmFzRWxlbWVudC53aWR0aCA9IHNjYWxlZFZpZXdwb3J0LndpZHRoO1xuXG5cdFx0XHRcdHRoaXMuY2FudmFzV2lkdGggPSBzY2FsZWRWaWV3cG9ydC53aWR0aDtcblx0XHRcdFx0dGhpcy5jYW52YXNIZWlnaHQgPSBzY2FsZWRWaWV3cG9ydC53aWR0aCAqIHJhdGlvO1xuXG5cdFx0XHRcdHRoaXMudWkuY2FudmFzLmNzcyhcIndpZHRoXCIsIHRoaXMuY2FjaGVkQ2FudmFzV2lkdGggKiB6b29tKTtcblxuXHRcdFx0XHRhd2FpdCBwZGZQYWdlLnJlbmRlcihyZW5kZXJDb250ZXh0KTtcblxuXHRcdFx0XHR0aGlzLnBkZlNjYWxlID0gc2NhbGVkVmlld3BvcnQuc2NhbGU7XG5cblx0XHRcdFx0JCh0aGlzLnVpLnBkZkxpbmtzTGF5ZXIpLmNzcyh7XG5cdFx0XHRcdFx0aGVpZ2h0OiB0aGlzLmNhbnZhc0hlaWdodCArIFwicHhcIixcblx0XHRcdFx0XHR3aWR0aDogdGhpcy5jYW52YXNXaWR0aCArIFwicHhcIixcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0d2luZG93LnBkZmpzTGliLmV4dGVybmFsTGlua1RhcmdldCA9IHdpbmRvdy5wZGZqc0xpYi5MaW5rVGFyZ2V0LkJMQU5LO1xuXG5cdFx0XHRcdGNvbnN0IGFubm90YXRpb25zRGF0YSA9IGF3YWl0IHBkZlBhZ2UuZ2V0QW5ub3RhdGlvbnMoKTtcblxuXHRcdFx0XHRhd2FpdCB3aW5kb3cucGRmanNMaWIuQW5ub3RhdGlvbkxheWVyLnJlbmRlcih7XG5cdFx0XHRcdFx0ZGl2OiB0aGlzLnVpLnBkZkxpbmtzTGF5ZXIuZ2V0KDApLFxuXHRcdFx0XHRcdGFubm90YXRpb25zOiBhbm5vdGF0aW9uc0RhdGEsXG5cdFx0XHRcdFx0cGFnZTogcGRmUGFnZSxcblx0XHRcdFx0XHR2aWV3cG9ydDogc2NhbGVkVmlld3BvcnQuY2xvbmUoeyBkb250RmxpcDogdHJ1ZSB9KSxcblx0XHRcdFx0XHRsaW5rU2VydmljZTogbmV3IGxpbmtTZXJ2aWNlLlNpbXBsZUxpbmtTZXJ2aWNlKCksXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHJldHVybiB0aGlzLnRyaWdnZXIoXCJwZGY6bG9hZFwiKTtcblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHQvLyBTaWduYWwgdGhhdCB0aGUgUERGIGlzIGxvYWRpbmdcblx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5Mb2FkU3RhcnQsIFwibXBkZlwiKTtcblx0XHR0aGlzLmxvYWRlZCA9IGZhbHNlO1xuXG5cdFx0Ly8gT2J0YWluIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgYm9va1xuXHRcdGNvbnN0IGJvb2sgPSBldmVudEJ1cy5yZXF1ZXN0KGV2ZW50QnVzLkV2ZW50cy5HZXRDdXJyZW50Qm9vayk7XG5cblx0XHRpZiAoIWJvb2sgfHwgIWJvb2suZ2V0KFwiaWRcIikpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRpZiAodGhpcy5wZGZEb2N1bWVudClcblx0XHRcdHJldHVybiBsb2FkQ3VycmVudFBhZ2UoKTtcblxuXHRcdC8vIExvYWQgdGhlIFBERiBkb2N1bWVudFxuXHRcdGNvbnN0IHByb20gPSB3aW5kb3cucGRmanNMaWIuZ2V0RG9jdW1lbnQoe1xuXHRcdFx0dXJsOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYWNhY2lhL3BkZi9cIiArIGJvb2suZ2V0KFwiaWRcIiksXG5cdFx0XHRkaXNhYmxlQXV0b0ZldGNoOiB0cnVlLFxuXHRcdFx0ZGlzYWJsZVN0cmVhbTogdHJ1ZSxcblx0XHR9KTtcblxuXHRcdHByb20ub25QYXNzd29yZCA9IGNiID0+IHtcblx0XHRcdGxldCByZXQgPSBcIlwiO1xuXHRcdFx0Y29uc3QgaWQgPSBib29rLmdldChcIm1ldGFkYXRhXCIpLmJvb2tJRC5yZXBsYWNlKC9cXC0vZywgXCJcIikuc2xpY2UoLTMyKTtcblx0XHRcdGNvbnN0IHRva2VuID0gdGhpcy5tZXRhZGF0YS5nZXQoXCJ0b2tlblwiKTtcblxuXHRcdFx0Zm9yKGxldCBpID0gMDsgaSA8IHRva2VuLmxlbmd0aDsgaSsrKVxuXHRcdFx0XHRyZXQgKz0gKHBhcnNlSW50KGlkW2ldLCAxNikgXiBwYXJzZUludCh0b2tlbltpXSwgMTYpKS50b1N0cmluZyhcIjE2XCIpO1xuXG5cdFx0XHRjYihyZXQpO1xuXHRcdH07XG5cblx0XHRwcm9tLnRoZW4ocGRmRG9jdW1lbnQgPT4ge1xuXHRcdFx0Ly8gRGVzdHJveSB0aGUgUERGIGRvY3VtZW50IGlmIHRoZSBib29rIGNvbnRhaW5lciBlbGVtZW50IHdhcyBkZXN0cm95ZWQgd2hpbGUgdGhlIFBERiBkb2N1bWVudCB3YXMgbG9hZGluZ1xuXHRcdFx0aWYgKCEkKHRoaXMudWkuYm9vaykubGVuZ3RoKSB7XG5cdFx0XHRcdGlmIChwZGZEb2N1bWVudClcblx0XHRcdFx0XHRwZGZEb2N1bWVudC5kZXN0cm95KCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVmVyaWZ5IHRoYXQgdGhlIFBERiBkb2N1bWVudCdzIHRva2VuIG1hdGNoZXMgdGhlIHRva2VuIGZvciB0aGlzIGJvb2tcblx0XHRcdHJldHVybiBQcm9taXNlLmFsbChbUHJvbWlzZS5yZXNvbHZlKHBkZkRvY3VtZW50KSwgcGRmRG9jdW1lbnQuZ2V0TWV0YWRhdGEoKV0pO1xuXHRcdH0pXG5cdFx0XHQudGhlbihhcnIgPT4ge1xuXHRcdFx0XHRpZiAoIWFyciB8fCAhYXJyWzFdIHx8ICFhcnJbMF0pXG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdGlmIChhcnJbMV0uaW5mby5Qcm9kdWNlciAhPT0gdGhpcy5tZXRhZGF0YS5nZXQoXCJ0b2tlblwiKSlcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3Qgb3BlbiBQREZcIik7XG5cblx0XHRcdFx0dGhpcy5wZGZEb2N1bWVudCA9IGFyclswXTtcblxuXHRcdFx0XHRyZXR1cm4gbG9hZEN1cnJlbnRQYWdlKCk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGVyciA9PiB7XG5cdFx0XHRcdGlmIChfLmluY2x1ZGVzKGVyci5tZXNzYWdlLCBcIlJlbmRlcmluZyBjYW5jZWxsZWRcIikpXG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdGlmICghc2V0dGluZ3MuZGVidWcgfHwgc2V0dGluZ3MucmVwb3J0RXJyb3JzKVxuXHRcdFx0XHRcdHJheWd1bihcInNlbmRcIiwgZXJyKTtcblx0XHRcdH0pO1xuXHR9LFxuXG5cdGxvYWRTZWN0aW9uT2Zmc2V0OiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBvZmZzZXQgPSB0aGlzLm5hdmlnYXRvci5nZXQoXCJvZmZzZXRcIikgfHwgMDtcblx0XHQvL2lmKG9mZnNldClcblx0XHR0aGlzLnVpLmJvb2suZ2V0KDApLnNjcm9sbFRvcCA9IG9mZnNldDtcblx0fSxcblxuXHRtYXBTZWxlY3RvcjogZnVuY3Rpb24oc2VsZWN0b3IpIHtcblx0XHRjb25zdCBuZXdTZWxlY3RvciA9IChwYXJzZUZsb2F0KHNlbGVjdG9yKSAqIHRoaXMuY29udGVudEhlaWdodCAqIDAuMDEpLnRvRml4ZWQoMik7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0UmVhbFNlbGVjdG9yT2Zmc2V0KG5ld1NlbGVjdG9yKTtcblx0fSxcblxuXHRnZXRSZWFsU2VsZWN0b3JPZmZzZXQ6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG5cdFx0Y29uc3Qgb2Zmc2V0ID0gdGhpcy5pbnZpc2libGVHcmlkT2Zmc2V0O1xuXHRcdGlmICghb2Zmc2V0KVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHQvLyBGaW5kIHRoZSBkZXZpYW5jZSBmcm9tIHRoZSBiYXNlIGdyaWQgb2Zmc2V0XG5cdFx0Y29uc3QgZGlmZiA9IHNlbGVjdG9yIC0gb2Zmc2V0O1xuXHRcdC8vIFdvcmsgb3V0IGhvdyBtYW55IHN0ZXBzIGF3YXkgaXQgaXNcblx0XHRjb25zdCBzdGVwcyA9IE1hdGguZmxvb3IoTWF0aC5hYnMoZGlmZiAvIDMyKSk7XG5cblx0XHQvLyBBZGQgdGhhdCBtYW55IHN0ZXBzIHRvIHRoZSBiYXNlIG9mZnNldCwgaW4gdGhlIGNvcnJlY3QgZGlyZWN0aW9uLCBhbmQgYm9iJ3MgeW91ciBsZWdhbCBndWFyZGlhblxuXHRcdHJldHVybiAocGFyc2VJbnQob2Zmc2V0LCAxMCkgKyAoZGlmZiA8IDAgPyBzdGVwcyAqIC0zMiA6IHN0ZXBzICogMzIpKS50b1N0cmluZygpO1xuXHR9LFxuXG5cdGdldEF0dGFjaG1lbnRBdFNlbGVjdG9yOiBmdW5jdGlvbihzZWxlY3Rvcikge1xuXHRcdGlmICghdGhpcy5pbnZpc2libGVHcmlkT2Zmc2V0KVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0Ly8gUERGcyBoYXZlIGFuIGludmlzaWJsZSBncmlkLCBlc3RhYmxpc2hlZCBieSB0aGUgdmVyeSBmaXJzdCBhdHRhY2htZW50IHRvIGJlIHBsYWNlZC5cblx0XHQvLyBBbGwgc3Vic2VxdWVudCBhdHRhY2htZW50IHBvc2l0aW9ucyBuZWVkIHRvIGJlIG5vcm1hbGlzZWQgdG8gdGhpcyBncmlkIHRvIGZpbmQgb3ZlcmxhcHMuXG5cdFx0Ly8gSWYgYW4gYXR0YWNobWVudCBpcyB3aXRoaW4gMzJweCBvZiBhbm90aGVyIChhYm92ZSBvciBiZWxvdyksIGl0IGlzIGNvbnNpZGVyZWQgYW4gb3ZlcmxhcC5cblxuXHRcdC8vIENvbnZlcnQgdGhlIHNlbGVjdG9yIHRvIHBpeGVsc1xuXHRcdGNvbnN0IG5ld1NlbGVjdG9yID0gKHBhcnNlRmxvYXQoc2VsZWN0b3IpICogdGhpcy5jb250ZW50SGVpZ2h0ICogMC4wMSkudG9GaXhlZCgyKTtcblxuXHRcdC8vIEhvdyBmYXIgZnJvbSBhbiBvcmlnaW4gaXMgaXQ/XG5cdFx0Y29uc3QgbW9kID0gKG5ld1NlbGVjdG9yIC0gdGhpcy5pbnZpc2libGVHcmlkT2Zmc2V0KSAlIDMyO1xuXG5cdFx0Ly8gSWYgd2UncmUgcmlnaHQgb24gdG9wLCB3aWxsIG5ldmVyIG5lZWQgdG8gdGVzdCBmb3IgYW5vdGhlclxuXHRcdGlmIChtb2QgPT09IDApIHtcblx0XHRcdGNvbnN0IGNsb3NlciA9IHRoaXMuQXR0YWNobWVudFZpZXdzW3RoaXMuZ2V0UmVhbFNlbGVjdG9yT2Zmc2V0KG5ld1NlbGVjdG9yKV07XG5cdFx0XHRjb25zdCBiZWxvdyA9IHRoaXMuQXR0YWNobWVudFZpZXdzW3RoaXMuZ2V0UmVhbFNlbGVjdG9yT2Zmc2V0KG5ld1NlbGVjdG9yIC0gMzIpXTtcblx0XHRcdGNvbnN0IGFib3ZlID0gdGhpcy5BdHRhY2htZW50Vmlld3NbdGhpcy5nZXRSZWFsU2VsZWN0b3JPZmZzZXQobmV3U2VsZWN0b3IgKyAzMildO1xuXG5cdFx0XHRyZXR1cm4gY2xvc2VyIHx8IGJlbG93IHx8IGFib3ZlO1xuXHRcdH1cblxuXHRcdC8vIFNvIHdlIG5lZWQgdG8gdGVzdCBmb3IgdHdvIHBvc3NpYmxlIG92ZXJsYXBzLCBhbmQgcmV0dXJuIGVpdGhlciB0aGUgb25lIHRoYXQncyBjbG9zZXIsIG9yIHRoZSBvdGhlciAob25lIHRoYXQgZXhpc3RzKVxuXHRcdGxldCBjbG9zZXIsIG90aGVyO1xuXHRcdGlmIChtb2QgPCAwKSB7XG5cdFx0XHRpZiAoTWF0aC5hYnMobW9kKSA8IDE2KSB7XG5cdFx0XHRcdGNsb3NlciA9IHRoaXMuQXR0YWNobWVudFZpZXdzW3RoaXMuZ2V0UmVhbFNlbGVjdG9yT2Zmc2V0KG5ld1NlbGVjdG9yIC0gMzIpXTtcblx0XHRcdFx0b3RoZXIgPSB0aGlzLkF0dGFjaG1lbnRWaWV3c1t0aGlzLmdldFJlYWxTZWxlY3Rvck9mZnNldChuZXdTZWxlY3RvcildO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdGNsb3NlciA9IHRoaXMuQXR0YWNobWVudFZpZXdzW3RoaXMuZ2V0UmVhbFNlbGVjdG9yT2Zmc2V0KG5ld1NlbGVjdG9yKV07XG5cdFx0XHRcdG90aGVyID0gdGhpcy5BdHRhY2htZW50Vmlld3NbdGhpcy5nZXRSZWFsU2VsZWN0b3JPZmZzZXQobmV3U2VsZWN0b3IgLSAzMildO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRlbHNlIGlmIChNYXRoLmFicyhtb2QpIDwgMTYpIHtcblx0XHRcdGNsb3NlciA9IHRoaXMuQXR0YWNobWVudFZpZXdzW3RoaXMuZ2V0UmVhbFNlbGVjdG9yT2Zmc2V0KG5ld1NlbGVjdG9yKV07XG5cdFx0XHRvdGhlciA9IHRoaXMuQXR0YWNobWVudFZpZXdzW3RoaXMuZ2V0UmVhbFNlbGVjdG9yT2Zmc2V0KG5ld1NlbGVjdG9yICsgMzIpXTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRjbG9zZXIgPSB0aGlzLkF0dGFjaG1lbnRWaWV3c1t0aGlzLmdldFJlYWxTZWxlY3Rvck9mZnNldChuZXdTZWxlY3RvciArIDMyKV07XG5cdFx0XHRvdGhlciA9IHRoaXMuQXR0YWNobWVudFZpZXdzW3RoaXMuZ2V0UmVhbFNlbGVjdG9yT2Zmc2V0KG5ld1NlbGVjdG9yKV07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNsb3NlciB8fCBvdGhlcjtcblx0fSxcblxuXHRqdW1wVG9BdHRhY2htZW50OiBmdW5jdGlvbihhdHRhY2htZW50KSB7XG5cdFx0Y29uc3Qgc2Nyb2xsVG9BdHRhY2htZW50ID0gKCkgPT4ge1xuXHRcdFx0Y29uc3QgZWxlbWVudCA9IGF0dGFjaG1lbnQuZ2V0KFwic2VsZWN0b3JcIik7XG5cblx0XHRcdGlmICh0aGlzLnVpLmJvb2suZ2V0KDApLnNjcm9sbFRvcCA9PT0gTWF0aC5jZWlsKHRoaXMuY29udGVudEhlaWdodCAqIHBhcnNlRmxvYXQoZWxlbWVudCkgKiAwLjAxKSkge1xuXHRcdFx0XHRhdHRhY2htZW50LnRyaWdnZXIoXCJmb2N1c1wiKTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHR0aGlzLnVpLmJvb2suZ2V0KDApLmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuc2Nyb2xsQXR0YWNobWVudENvbnRhaW5lcigpO1xuXHRcdFx0XHRcdGF0dGFjaG1lbnQudHJpZ2dlcihcImZvY3VzXCIpO1xuXHRcdFx0XHRcdHRoaXMudWkuYm9vay5nZXQoMCkuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCBfLnRocm90dGxlKHRoaXMub25TY3JvbGwuYmluZCh0aGlzKSwgMTApKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gU2Nyb2xsIHRoZSBib29rIGlmcmFtZSBhbmQgdGhlIGF0dGFjaG1lbnQgY29udGFpbmVyXG5cdFx0XHRcdGlmICh0aGlzLnVpLmJvb2suZ2V0KDApICYmIHRoaXMudWkuYm9vay5nZXQoMCkuc2Nyb2xsVG8pXG5cdFx0XHRcdFx0dGhpcy51aS5ib29rLmdldCgwKS5zY3JvbGxUbygwLCBNYXRoLmNlaWwodGhpcy5jb250ZW50SGVpZ2h0ICogcGFyc2VGbG9hdChlbGVtZW50KSAqIDAuMDEpKTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdGNvbnNvbGUud2FybihcIkJvb2sgb2JqZWN0IGRvZXMgbm90IGV4aXN0LCBhYm9ydGluZyBzY3JvbGxcIik7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGlmICh0aGlzLmdldEN1cnJlbnRTZWN0aW9uKCkudG9TdHJpbmcoKSA9PT0gYXR0YWNobWVudC5nZXQoXCJzZWN0aW9uXCIpLnRvU3RyaW5nKCkpIHtcblx0XHRcdHNjcm9sbFRvQXR0YWNobWVudCgpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdC8vIExvYWQgdGhlIGF0dGFjaG1lbnQncyBzZWN0aW9uXG5cdFx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcodGhpcywgXCJwZGY6bG9hZFwiKTtcblx0XHRcdHRoaXMubGlzdGVuVG8odGhpcywgXCJwZGY6bG9hZFwiLCAoKSA9PiB7XG5cdFx0XHRcdHRoaXMub25Mb2FkKCk7XG5cblx0XHRcdFx0c2Nyb2xsVG9BdHRhY2htZW50KCk7XG5cblx0XHRcdFx0Ly8gUmVwbGFjZSB0aGlzIGV2ZW50IGhhbmRsZXIgd2l0aCB0aGUgb3JpZ2luYWxcblx0XHRcdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLCBcInBkZjpsb2FkXCIsIHRoaXMub25Mb2FkLmJpbmQodGhpcykpO1xuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMubmF2aWdhdG9yLm5hdmlnYXRlVG9TZWN0aW9uKGF0dGFjaG1lbnQuZ2V0KFwic2VjdGlvblwiKSk7XG5cdFx0fVxuXHR9LFxuXG5cdHNjcm9sbEF0dGFjaG1lbnRDb250YWluZXI6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIElmIHdlIGRpZG4ndCByZWFsbHkgc2Nyb2xsLCBkbyBub3RoaW5nXG5cdFx0aWYgKHRoaXMudWkuYm9vay5nZXQoMCkuc2Nyb2xsVG9wID09PSBwYXJzZUludCh0aGlzLnVpLmF0dGFjaG1lbnRDb250YWluZXIuZ2V0KDApLnN0eWxlLnRvcCwgMTApICogLTEpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLnVpLmF0dGFjaG1lbnRDb250YWluZXIuY3NzKHtcblx0XHRcdHRvcDogKHRoaXMudWkuYm9vay5nZXQoMCkuc2Nyb2xsVG9wICogLTEpICsgXCJweFwiLFxuXHRcdH0pO1xuXG5cdFx0ZXZlbnRCdXMudHJpZ2dlcihcImF0dGFjaG1lbnRzOnNjcm9sbFwiKTtcblx0fSxcblxuXHRvblNjcm9sbDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLm5hdmlnYXRvcilcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMubmF2aWdhdG9yLnN5bmNocm9uaXplKHRoaXMuZ2V0Q3VycmVudFNlY3Rpb24odHJ1ZSksIHRoaXMudWkuYm9vay5nZXQoMCkuc2Nyb2xsVG9wKTtcblxuXHRcdHRoaXMuc2Nyb2xsQXR0YWNobWVudENvbnRhaW5lcigpO1xuXHRcdHRoaXMucG9sbE5hdmlnYXRlUHJldmlvdXMoKTtcblx0XHR0aGlzLnBvbGxOYXZpZ2F0ZU5leHQoKTtcblx0fSxcblxuXHRwb2xsTmF2aWdhdGVQcmV2aW91czogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMubmF2aWdhdG9yLnBvbGxOYXZpZ2F0ZVByZXZpb3VzKCkgJiYgKHRoaXMudWkuYm9vay5nZXQoMCkuc2Nyb2xsVG9wIDw9IHRoaXMuaGVpZ2h0ICogMikpXG5cdFx0XHR0aGlzLnVpLm5hdlByZXZpb3VzLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnVpLm5hdlByZXZpb3VzLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRwb2xsTmF2aWdhdGVOZXh0OiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5uYXZpZ2F0b3IucG9sbE5hdmlnYXRlTmV4dCgpICYmICh0aGlzLnVpLmJvb2suZ2V0KDApLnNjcm9sbFRvcCA+PSAodGhpcy5jb250ZW50SGVpZ2h0IC0gKHRoaXMuaGVpZ2h0ICogMikpKSlcblx0XHRcdHRoaXMudWkubmF2TmV4dC5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy51aS5uYXZOZXh0LmFkZENsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRyZXNpemVBdHRhY2htZW50Q29udGFpbmVyOiBmdW5jdGlvbigpIHtcblx0XHQvLyBTZXQgdGhlIGhlaWdodCBvZiB0aGUgYXR0YWNobWVudCBjb250YWluZXIgdG8gdGhhdCBvZiB0aGUgY3VycmVudGx5IGxvYWRlZCBib29rIHNlY3Rpb24gaW4gdGhlIGlmcmFtZVxuXHRcdHRoaXMudWkuYXR0YWNobWVudENvbnRhaW5lci5jc3Moe1xuXHRcdFx0aGVpZ2h0OiB0aGlzLnVpLmJvb2suZ2V0KDApLnNjcm9sbEhlaWdodCArIFwicHhcIixcblx0XHR9KTtcblx0fSxcblxuXHRnZXRDdXJyZW50U2VjdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubmF2aWdhdG9yLmdldChcInVybFwiKTtcblx0fSxcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6IFwiZGl2XCIsXG5cdGNsYXNzTmFtZTogXCJib29rLXZpZXdcIixcblxuXHRnZXRUZW1wbGF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgYm9vayA9IGV2ZW50QnVzLnJlcXVlc3QoZXZlbnRCdXMuRXZlbnRzLkdldEN1cnJlbnRCb29rKTtcblxuXHRcdHJldHVybiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2NvbnNvbGUvYm9vay12aWV3Lm51bmpcIilbYm9vay5nZXQoXCJmb3JtYXRcIildO1xuXHR9LFxuXG5cdHVpOiB7XG5cdFx0Ym9vazogXCIjYm9vay1kaXNwbGF5LCAjY2FudmFzLWRpc3BsYXlcIixcblx0XHRib29rRGlzcGxheTogXCIuYm9vay1kaXNwbGF5LWNvbnRhaW5lclwiLFxuXHRcdGNhbnZhczogXCJjYW52YXNcIixcblx0XHRvdmVybGF5OiBcIiNib29rLW92ZXJsYXlcIixcblx0XHRkcm9wT3ZlcmxheTogXCIuZHJvcC1vdmVybGF5XCIsXG5cdFx0Z3JvdXBOb3RpZnk6IFwiI2Jvb2stb3ZlcmxheSAubm90aWZpY2F0aW9ucyAuZ3JvdXBzXCIsXG5cdFx0c3Bpbm5lcjogXCJkaXYuaW5mb0Jsb2NrXCIsXG5cdFx0bmF2UHJldmlvdXM6IFwiZGl2LnBhZ2luZy1idXR0b24udXBcIixcblx0XHRuYXZOZXh0OiBcImRpdi5wYWdpbmctYnV0dG9uLmRvd25cIixcblx0XHRhdHRhY2htZW50Q29udGFpbmVyOiBcIiNhdHRhY2htZW50LWNvbnRhaW5lclwiLFxuXHRcdGF0dGFjaG1lbnREZWxldGVyOiBcImRpdi5hdHRhY2htZW50LWJpblwiLFxuXHRcdGhpbnQ6IFwiZGl2LmhpbnRcIixcblx0XHRoaWdobGlnaHRCYXI6IFwiZGl2LmhpZ2hsaWdodC1iYXJcIixcblx0XHRjYW5jZWxEcm9wOiBcImRpdi5jYW5jZWwtZHJvcFwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLm5hdlByZXZpb3VzXCI6IFwib25OYXZQcmV2aW91c0NsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkubmF2TmV4dFwiOiBcIm9uTmF2TmV4dENsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkuZ3JvdXBOb3RpZnlcIjogXCJvbkdyb3VwTm90aWZ5Q2xpY2tcIixcblxuXHRcdFwibW91c2VlbnRlciBAdWkuYXR0YWNobWVudERlbGV0ZXJcIjogXCJvbkF0dGFjaG1lbnREZWxldGVyTW91c2VFbnRlclwiLFxuXHRcdFwibW91c2VvdmVyIEB1aS5hdHRhY2htZW50RGVsZXRlclwiOiBcIm9uQXR0YWNobWVudERlbGV0ZXJNb3VzZU92ZXJcIixcblx0XHRcIm1vdXNlbGVhdmUgQHVpLmF0dGFjaG1lbnREZWxldGVyXCI6IFwib25BdHRhY2htZW50RGVsZXRlck1vdXNlTGVhdmVcIixcblxuXHRcdFwiZHJvcCBAdWkuYm9va1wiOiBcIm9uRmlsZURyb3BcIixcblx0XHRcImRyYWdvdmVyIEB1aS5ib29rXCI6IFwib25GaWxlRHJhZ092ZXJcIixcblx0XHRcImRyYWdlbnRlciBAdWkuYm9va1wiOiBcIm9uRmlsZURyYWdFbnRlclwiLFxuXHRcdFwiZHJhZ2xlYXZlIEB1aS5ib29rXCI6IFwib25GaWxlRHJhZ0xlYXZlXCIsXG5cdFx0XCJkcm9wIEB1aS5ib29rRGlzcGxheVwiOiBcIm9uRmlsZURyb3BcIixcblx0XHRcImRyYWdvdmVyIEB1aS5ib29rRGlzcGxheVwiOiBcIm9uRmlsZURyYWdPdmVyXCIsXG5cdFx0XCJkcmFnZW50ZXIgQHVpLmJvb2tEaXNwbGF5XCI6IFwib25GaWxlRHJhZ0VudGVyXCIsXG5cdFx0XCJkcmFnbGVhdmUgQHVpLmJvb2tEaXNwbGF5XCI6IFwib25GaWxlRHJhZ0xlYXZlXCIsXG5cdFx0XCJtb3VzZWVudGVyIEB1aS5ib29rRGlzcGxheVwiOiBcIm9uTW91c2VFbnRlclwiLFxuXHRcdFwibW91c2VsZWF2ZSBAdWkuYm9va0Rpc3BsYXlcIjogXCJvbk1vdXNlTGVhdmVcIixcblx0XHRcImRyb3AgQHVpLmNhbmNlbERyb3BcIjogXCJvbkNhbmNlbEZpbGVEcm9wXCIsXG5cdH0sXG5cblx0YXR0YWNobWVudEV2ZW50czoge1xuXHRcdFwiYXR0YWNobWVudDpmaXJzdFwiOiBcImZpbmRGaXJzdEF0dGFjaG1lbnRcIixcblx0XHRcImF0dGFjaG1lbnQ6bmV4dFwiOiBcImZpbmROZXh0QXR0YWNobWVudFwiLFxuXHRcdFwiYXR0YWNobWVudDpwcmV2aW91c1wiOiBcImZpbmRQcmV2aW91c0F0dGFjaG1lbnRcIixcblx0XHRcImF0dGFjaG1lbnQ6Y2xlYXJcIjogXCJjbGVhckF0dGFjaG1lbnRGb2N1c1wiLFxuXHRcdFwiYXR0YWNobWVudDpyZWp1dmVuYXRlXCI6IFwicXVlcnlSZWp1dmVuYXRlQXR0YWNobWVudFwiLFxuXHRcdFwiYXR0YWNobWVudDp0b29sdGlwXCI6IFwicmVjb3JkQ3VycmVudFRvb2x0aXBcIixcblx0XHRcImF0dGFjaG1lbnQ6bW91c2VvdmVyXCI6IFwiaGlnaGxpZ2h0QXR0YWNobWVudEVsZW1lbnRcIixcblx0XHRcImF0dGFjaG1lbnQ6bW91c2VvdXRcIjogXCJsb3dsaWdodEF0dGFjaG1lbnRFbGVtZW50XCIsXG5cdFx0XCJhdHRhY2htZW50OmRlbGV0ZWRcIjogXCJvbkF0dGFjaG1lbnREZWxldGVkXCIsXG5cdH0sXG5cblx0cmFkaW9FdmVudHM6IHtcblx0XHRbQXBwLkV2ZW50cy5XZWJzb2NrZXRDb25uZWN0ZWRdOiBcIndzQ29ubmVjdGVkXCIsXG5cdFx0W0FwcC5FdmVudHMuV2Vic29ja2V0RGlzY29ubmVjdGVkXTogXCJ3c0Rpc2Nvbm5lY3RlZFwiLFxuXHR9LFxuXG5cdHRlbXBsYXRlQ29udGV4dDogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgaGludHMgPSBbXG5cdFx0XHRcIllvdSBjYW4gY3JlYXRlIGEgYm9va21hcmsgZGlyZWN0bHkgdG8gYW55IHBhZ2UgaW4gYSBib29rLiBKdXN0IG5hdmlnYXRlIHRvIGl0IGFuZCBhZGQgYSBuZXcgYm9va21hcmsgaW4geW91ciBicm93c2VyLlwiLFxuXHRcdFx0XCJBcyBsb25nIGFzIHlvdSB1c2UgdGhlIHNhbWUgY29tcHV0ZXIsIHRoZSBFZHVjYXRvciBDb25zb2xlIHdpbGwgcmVtZW1iZXIgd2hlcmUgeW91IGxhc3Qgd2VyZSBpbiBhIGJvb2ssIGFuZCB3aWxsIHRha2UgeW91IGJhY2sgdGhlcmUgd2hlbiB5b3UgbmV4dCBvcGVuIGl0LlwiLFxuXHRcdFx0XCJZb3UgY2FuIGZpbHRlciBjb250ZW50IGJ5IG1vcmUgdGhhbiBqdXN0IG5hbWUuIENsaWNrIHRoZSA8c3BhbiBjbGFzcz0nZmFsIGZhLXRhc2tzJy8+IEZpbHRlciBidXR0b24gaW4gdGhlIGNvbnRlbnQgcGFuZSBhbmQgY2hvb3NlIGZyb20gbWFueSBvdGhlciBvcHRpb25zLlwiLFxuXHRcdFx0YFlvdSBjYW4gcHV0IHRoZSBFZHVjYXRvciBDb25zb2xlIGludG8gZnVsbC1zY3JlZW4gbW9kZSAtIGdyZWF0IGZvciBwcmVzZW50aW5nIG9uIGEgcHJvamVjdG9yLlxuXHRcdFx0XHRKdXN0IGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0nZmFsIGZhLWV4cGFuZC1hbHQnLz4gZnVsbHNjcmVlbiBtb2RlIGljb24gaW4gdGhlIHRvcCByaWdodCBjb3JuZXIuYCxcblx0XHRcdGBJZiB5b3UgdXNlZCB0aGlzIGJvb2sgaW4gdGhlIHByZXZpb3VzIHllYXIsIHlvdSBjYW4gcmV1c2UgdGhlIGNvbnRlbnQgeW91IGF0dGFjaGVkIHRoZW4uXG5cdFx0XHRcdEp1c3QgbG9vayBmb3IgYW4gYXR0YWNobWVudCB3aXRoIGEgPHNwYW4gY2xhc3M9J2ZhbCBmYS1ib2x0Jy8+IGljb24sIG9wZW4gaXQsIGFuZCBjbGljayBvbiB0aGUgbWVzc2FnZSBhdCB0aGUgdG9wLmAsXG5cdFx0XHRcIkNhbid0IHJlbWVtYmVyIHdoYXQgYW4gYXR0YWNobWVudCB3YXMgZm9yPyBKdXN0IGNsaWNrIG9uIGl0IHRvIHNlZSBhIHByZXZpZXcgb2YgdGhlIHJlc291cmNlIGFuZCBhIGxpc3Qgb2YgdGhlIG1haW4gaW5mb3JtYXRpb24uXCIsXG5cdFx0XHRcIllvdSBjYW4gY2hhbmdlIHRoZSBncm91cHMgZm9yIGEgc2luZ2xlIGF0dGFjaG1lbnQgYnkgY2xpY2tpbmcgb24gaXQgYW5kIGNob29zaW5nIHRoZSA8c3BhbiBjbGFzcz0nZmFsIGZhLXVzZXJzLWNsYXNzJy8+IEdyb3VwcyBpY29uXCIsXG5cdFx0XTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aGludDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBoaW50c1tfLnJhbmRvbShoaW50cy5sZW5ndGggLSAxKV07XG5cdFx0XHR9LFxuXHRcdH07XG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuc3RhcnRMb2NhdGlvbiA9IG9wdGlvbnMubG9jYXRpb247XG5cdFx0dGhpcy5zdGFydEhhc2ggPSBvcHRpb25zLmhhc2g7XG5cdFx0dGhpcy5hdHRhY2htZW50c0ZldGNoZWQgPSBmYWxzZTtcblx0XHR0aGlzLmxvYWRlZCA9IGZhbHNlO1xuXHRcdHRoaXMudXBsb2FkQWxsb3dlZCA9IHRydWU7XG5cblx0XHR0aGlzLmxpc3RlblRvKGV2ZW50QnVzLCBldmVudEJ1cy5FdmVudHMuR3JvdXBzQ2hhbmdlZCwgdGhpcy5ncm91cHNDaGFuZ2VkLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8oZXZlbnRCdXMsIGV2ZW50QnVzLkV2ZW50cy5BdHRhY2htZW50UmVtb3ZlZCwgdGhpcy5vbkF0dGFjaG1lbnREZWxldGVkLmJpbmQodGhpcykpO1xuXG5cdFx0Y29uc3QgYm9vayA9IGV2ZW50QnVzLnJlcXVlc3QoZXZlbnRCdXMuRXZlbnRzLkdldEN1cnJlbnRCb29rKTtcblxuXHRcdHRoaXMuZm9ybWF0ID0gYm9vay5nZXQoXCJmb3JtYXRcIik7XG5cblx0XHR0aGlzLnpvb20gPSAxLjA7XG5cblx0XHRpZiAodGhpcy5mb3JtYXQgPT09IFwibXB1YlwiKVxuXHRcdFx0Xy5leHRlbmQodGhpcywgRXB1Yk1peGluKTtcblx0XHRlbHNlXG5cdFx0XHRfLmV4dGVuZCh0aGlzLCBQZGZNaXhpbik7XG5cblx0XHR0aGlzLmxpc3RlblRvKGV2ZW50QnVzLCBldmVudEJ1cy5FdmVudHMuU3RhcnRGdWxsc2NyZWVuLCB0aGlzLnRvZ2dsZUZ1bGxzY3JlZW4uYmluZCh0aGlzLCB0cnVlKSk7XG5cdFx0dGhpcy5saXN0ZW5UbyhldmVudEJ1cywgZXZlbnRCdXMuRXZlbnRzLkVuZEZ1bGxzY3JlZW4sIHRoaXMudG9nZ2xlRnVsbHNjcmVlbi5iaW5kKHRoaXMsIGZhbHNlKSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKGV2ZW50QnVzLCBldmVudEJ1cy5FdmVudHMuSGlkZUZsYXNoQ2FyZFdpZGdldCwgdGhpcy5oaWRlRmxhc2hDYXJkV2lkZ2V0LmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8oZXZlbnRCdXMsIGV2ZW50QnVzLkV2ZW50cy5TaG93Rmxhc2hDYXJkV2lkZ2V0LCB0aGlzLnNob3dGbGFzaENhcmRXaWRnZXQuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5UbyhldmVudEJ1cywgZXZlbnRCdXMuRXZlbnRzLlF1ZXJ5UmVqdXZlbmF0ZUF0dGFjaG1lbnRzLCB0aGlzLnF1ZXJ5UmVqdXZlbmF0ZUF0dGFjaG1lbnRzLmJpbmQodGhpcykpO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhldmVudEJ1cywgZXZlbnRCdXMuRXZlbnRzLkRpc2FibGVSZXNvdXJjZURyYWdnaW5nLCB0aGlzLmRpc2FibGVSZXNvdXJjZUJ1dHRvbi5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKGV2ZW50QnVzLCBldmVudEJ1cy5FdmVudHMuRW5hYmxlUmVzb3VyY2VEcmFnZ2luZywgdGhpcy5lbmFibGVSZXNvdXJjZUJ1dHRvbi5iaW5kKHRoaXMpKTtcblxuXHRcdHRoaXMuYmluZEV2ZW50cyhyYWRpbywgdGhpcy5yYWRpb0V2ZW50cyk7XG5cblx0XHR0aGlzLnNlY3Rpb25Mb2FkZXIgPSBfLmRlYm91bmNlKHRoaXMubG9hZFNlY3Rpb24uYmluZCh0aGlzKSwgNTApO1xuXG5cdFx0dGhpcy54aHIgPSB7fTtcblx0XHRhdHRhY2htZW50c1NhdmluZyA9IDA7XG5cdFx0dGhpcy5zYXZlUXVldWUgPSBbXTtcblx0fSxcblxuXHR0b2dnbGVGdWxsc2NyZWVuOiBmdW5jdGlvbihvbikge1xuXHRcdHRoaXMuZnVsbHNjcmVlbmVkID0gb247XG5cdH0sXG5cblx0Z2V0Qm9va01ldGFkYXRhOiBmdW5jdGlvbigpIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBCb29rTWV0YWRhdGEoKS5sYXp5RmV0Y2goKSk7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5EZWxldGVkQXR0YWNobWVudHMpXG5cdFx0XHR0aGlzLkRlbGV0ZWRBdHRhY2htZW50cy5yZXNldCgpO1xuXHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLlVubG9hZEJvb2spO1xuXHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5VbmxvYWRCb29rKTtcblx0XHQvLyBTdG9wIGxpc3RlbmluZyBmb3IgcGFnZSBjaGFuZ2UgZXZlbnRzIGFuZCBzdWNoXG5cdFx0aWYgKHRoaXMubmF2aWdhdG9yKVxuXHRcdFx0dGhpcy5uYXZpZ2F0b3Iuc3RvcExpc3RlbmluZygpO1xuXHRcdHRoaXMubmF2aWdhdG9yID0gbnVsbDtcblxuXHRcdGlmICh0aGlzLnBkZkRvY3VtZW50KSB7XG5cdFx0XHR0aGlzLnBkZkRvY3VtZW50LmRlc3Ryb3koKTtcblx0XHRcdHRoaXMucGRmRG9jdW1lbnQgPSBudWxsO1xuXHRcdH1cblxuXHRcdC8vIEV4ZWN1dGUgdGhlIGJvb2sgbWl4aW4ncyBoYW5kbGVyIGZvciBvbkJlZm9yZURlc3Ryb3lcblx0XHRpZiAodGhpcy5vbkJvb2tCZWZvcmVEZXN0cm95KVxuXHRcdFx0dGhpcy5vbkJvb2tCZWZvcmVEZXN0cm95KCk7XG5cblx0XHQkKHdpbmRvdykub2ZmKFwicmVzaXplXCIsIHRoaXMuc2VjdGlvbkxvYWRlcik7XG5cdFx0JChcImJvZHlcIikub2ZmKFwiY2xpY2suYm9keUNsaWNrZXJcIik7XG5cdH0sXG5cblx0c2hvd0Vycm9yOiBmdW5jdGlvbihlcnIpIHtcblx0XHRpZiAoIXNldHRpbmdzLmRlYnVnIHx8IHNldHRpbmdzLnJlcG9ydEVycm9ycylcblx0XHRcdHJheWd1bihcInNlbmRcIiwgZXJyKTtcblx0XHRjb25zdCBlID0gQXBwLnBhcnNlUmVzcG9uc2UoZXJyKTtcblx0XHQkKFwiLnNwaW5uZXItaWNvblwiLCB0aGlzLnVpLnNwaW5uZXIuZWwpLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHQkKFwiLndhcm5cIiwgdGhpcy51aS5zcGlubmVyLmVsKS50ZXh0KGUuZGV0YWlsIHx8IGUuaW5mbykuYWRkQ2xhc3MoXCJmYXVsdFwiKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gQ2xlYXIgb2xkIHBhZ2VzXG5cdFx0JChcIi5wYWdlLW51bWJlclwiLCB0aGlzLmVsKS5yZW1vdmUoKTtcblxuXHRcdHRoaXMuZHJhZ0NvdW50ID0gMDtcblxuXHRcdC8vIERpc2FibGUgcmlnaHQtY2xpY2tpbmcgdG8gYXZvaWQgdGhlIHBlcmNlcHRpb24gdGhhdCB0aGUgYm9vayBpcyBzYXZlYWJsZVxuXHRcdC8vdGhpcy4kZWwuYmluZChcImNvbnRleHRtZW51XCIsIF8uY29uc3RhbnQoZmFsc2UpKTtcblxuXHRcdFByb21pc2UuYWxsKFt0aGlzLmdldEJvb2tNZXRhZGF0YSgpXSkuc3ByZWFkKG1ldGFkYXRhID0+IHtcblx0XHRcdGlmICghdGhpcy51aS5ib29rLmxvYWQgfHwgIXRoaXMudWkuYm9vay5nZXQpXG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0dGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhO1xuXG5cdFx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5QYWdlQ291bnQsIG1ldGFkYXRhLmdldChcInRvdGFsUGFnZXNcIiksIG1ldGFkYXRhLmdldChcInBhZ2VzXCIpKTtcblxuXHRcdFx0dGhpcy5zaG93U3Bpbm5lcigpO1xuXG5cdFx0XHQvLyBUZWxsIHRoZSBuYXZpZ2F0aW9uIHRvIGxvYWRcblx0XHRcdGlmICh0aGlzLmZvcm1hdCA9PT0gXCJtcHViXCIpIHtcblx0XHRcdFx0Y29uc3QgbmF2ID0gbmV3IEVwdWJOYXZpZ2F0aW9uU2lkZWJhcih7IG1ldGFkYXRhOiBtZXRhZGF0YSB9KTtcblx0XHRcdFx0Xy5leHRlbmQobmF2LCBTbGlkZW91dE1peGluKTtcblxuXHRcdFx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5Mb2FkTmF2aWdhdGlvbiwgbmF2LCBtZXRhZGF0YS5nZXQoXCJmb3JtYXRcIikpO1xuXG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuXHRcdFx0XHR0aGlzLm5hdmlnYXRvciA9IG5ldyBFcHViTmF2aWdhdG9yKHsgYm9vazogbWV0YWRhdGEsIHN0YXJ0TG9jYXRpb246IHRoaXMuc3RhcnRMb2NhdGlvbiwgc3RhcnRIYXNoOiB0aGlzLnN0YXJ0SGFzaCwgcmVzb2x2ZXI6IHRoaXMucmVzb2x2ZURPTVNlbGVjdG9yLmJpbmQodGhpcykgfSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0Y29uc3QgbmF2ID0gbmV3IFBkZk5hdmlnYXRpb25TaWRlYmFyKHsgbWV0YWRhdGE6IG1ldGFkYXRhIH0pO1xuXHRcdFx0XHRfLmV4dGVuZChuYXYsIFNsaWRlb3V0TWl4aW4pO1xuXG5cdFx0XHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLkxvYWROYXZpZ2F0aW9uLCBuYXYsIG1ldGFkYXRhLmdldChcImZvcm1hdFwiKSk7XG5cblx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG5cdFx0XHRcdHRoaXMubmF2aWdhdG9yID0gbmV3IFBkZk5hdmlnYXRvcih7IGJvb2s6IG1ldGFkYXRhLCBzdGFydExvY2F0aW9uOiB0aGlzLnN0YXJ0TG9jYXRpb24sIHN0YXJ0SGFzaDogdGhpcy5zdGFydEhhc2ggfSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuXHRcdFx0dGhpcy5BdHRhY2htZW50cyA9IG5ldyBBdHRhY2htZW50Q29sbGVjdGlvbigpO1xuXHRcdFx0dGhpcy5BdHRhY2htZW50cy5vbihcImFkZFwiLCB0aGlzLm9uQXR0YWNobWVudEFkZGVkLmJpbmQodGhpcykpO1xuXHRcdFx0dGhpcy5BdHRhY2htZW50cy5vbihcImRlc3Ryb3lcIiwgdGhpcy5vbkF0dGFjaG1lbnREZXN0cm95ZWQuYmluZCh0aGlzKSk7XG5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuXHRcdFx0dGhpcy5EZWxldGVkQXR0YWNobWVudHMgPSBuZXcgRGVsZXRlZEF0dGFjaG1lbnRDb2xsZWN0aW9uKCk7XG5cdFx0XHR0aGlzLkRlbGV0ZWRBdHRhY2htZW50cy5vbihcImFkZFwiLCB0aGlzLm9uRGVsZXRlZEF0dGFjaG1lbnRBZGRlZC5iaW5kKHRoaXMpKTtcblx0XHRcdHRoaXMuRGVsZXRlZEF0dGFjaG1lbnRzLm9uKFwicmVtb3ZlXCIsIHRoaXMub25EZWxldGVkQXR0YWNobWVudFJlbW92ZWQuYmluZCh0aGlzKSk7XG5cdFx0XHR0aGlzLkRlbGV0ZWRBdHRhY2htZW50cy5vbihcInJlc2V0XCIsIHRoaXMub25EZWxldGVkQXR0YWNobWVudHNSZXNldC5iaW5kKHRoaXMpKTtcblxuXHRcdFx0dGhpcy5saXN0ZW5UbyhldmVudEJ1cywgZXZlbnRCdXMuRXZlbnRzLlNob3dBdHRhY2htZW50QmluQ29udGVudHMsIHRoaXMuc2hvd0F0dGFjaG1lbnRCaW5Db250ZW50cy5iaW5kKHRoaXMpKTtcblxuXHRcdFx0dGhpcy5BdHRhY2htZW50Vmlld3MgPSB7fTtcblxuXHRcdFx0dGhpcy5pbml0aWFsaXplRmluZGVyU3RhdHVzKCk7XG5cblx0XHRcdEJhY2tib25lLk1hcmlvbmV0dGUuYmluZEV2ZW50cyh0aGlzLCBldmVudEJ1cywgdGhpcy5hdHRhY2htZW50RXZlbnRzKTtcblxuXHRcdFx0dGhpcy5jb25maWd1cmVPdmVybGF5KCk7XG5cblx0XHRcdHRoaXMubmF2aWdhdG9yLm9uKFwiY2hhbmdlOnVybFwiLCB0aGlzLnNlY3Rpb25Mb2FkZXIpO1xuXG5cdFx0XHRpZiAodGhpcy5mb3JtYXQgPT09IFwibXB1YlwiKSB7IHRoaXMudWkuYm9vay5sb2FkKHRoaXMub25Mb2FkLmJpbmQodGhpcykpOyB9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0Ly8gU2V0IHVwIHRoZSBzY3JvbGwgZXZlbnQgaGFuZGxlci4gV2UgYmluZCB0aGlzIGhlcmUgYmVjYXVzZSB3ZSB3b24ndCBuZWVkIHRvIHJlYmluZCBpdCBhZnRlciBlYWNoIHBhZ2UgXCJsb2FkXCIuXG5cdFx0XHRcdHRoaXMudWkuYm9vay5nZXQoMCkuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCBfLnRocm90dGxlKHRoaXMub25TY3JvbGwuYmluZCh0aGlzKSwgMTApKTtcblx0XHRcdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLCBcInBkZjpsb2FkXCIsIHRoaXMub25Mb2FkLmJpbmQodGhpcykpO1xuXHRcdFx0XHQvLyBXZSBuZWVkIHRvIHJlZHJhdyB0aGUgUERGIGlmIHRoZSB3aW5kb3cgc2l6ZSBjaGFuZ2VzXG5cdFx0XHRcdC8vICQod2luZG93KS5vbihcInJlc2l6ZVwiLCB0aGlzLnNlY3Rpb25Mb2FkZXIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBMb2FkIHRoZSBmaXJzdCBzZWN0aW9uIG9mIHRoZSBib29rIGludG8gdGhlIGlmcmFtZVxuXHRcdFx0dGhpcy5uYXZpZ2F0b3IubmF2aWdhdGVTdGFydCgpO1xuXG5cdFx0XHQvLyBFeGVjdXRlIHRoZSBib29rIG1peGluJ3MgaGFuZGxlciBmb3Igd2hlbiB0aGUgYm9vayBpcyBzaG93blxuXHRcdFx0aWYgKHRoaXMub25Cb29rU2hvdylcblx0XHRcdFx0dGhpcy5vbkJvb2tTaG93KCk7XG5cblx0XHRcdHRoaXMuZmV0Y2hBdHRhY2htZW50cygpO1xuXHRcdH0pLmNhdGNoKHRoaXMuc2hvd0Vycm9yLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdG9uTG9hZDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuZm9ybWF0ID09PSBcIm1wdWJcIikge1xuXHRcdFx0Ly8gVHJpZ2dlciBoaWdoLWxldmVsIGV2ZW50cyB0aGF0IHNob3VsZCBiZSBmaXJlZCB3aGVuIGEgdXNlciBjbGlja3MgaW5zaWRlIGEgYm9va1xuXHRcdFx0JChcImJvZHlcIiwgdGhpcy51aS5ib29rLmNvbnRlbnRzKCkpLmNsaWNrKCgpID0+IHtcblx0XHRcdFx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5FdmVudHMuQ2xvc2VSZXNvdXJjZXMpO1xuXHRcdFx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5DbG9zZVNpbXBsZU1lbnVzKTtcblx0XHRcdFx0JCh3aW5kb3cpLnRyaWdnZXIoXCJjbGlja1wiKTtcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLmJvZHlDbGlja2VyID0gKCkgPT4ge1xuXHRcdFx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5DbG9zZVJlc291cmNlcyk7XG5cdFx0XHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLkNsb3NlU2ltcGxlTWVudXMpO1xuXHRcdFx0fTtcblxuXHRcdFx0JChcImJvZHlcIikub24oXCJjbGljay5ib2R5Q2xpY2tlclwiLCB0aGlzLmJvZHlDbGlja2VyKTtcblxuXHRcdFx0Ly8gTWVhc3VyZSB0aGUgZG9jdW1lbnRcblx0XHRcdHRoaXMuaGVpZ2h0ID0gdGhpcy51aS5ib29rLmdldCgwKS5jb250ZW50V2luZG93LmlubmVySGVpZ2h0O1xuXHRcdFx0dGhpcy5jb250ZW50SGVpZ2h0ID0gdGhpcy51aS5ib29rLmNvbnRlbnRzKCkuZmluZChcImJvZHlcIikuaGVpZ2h0KCk7XG5cblx0XHRcdC8vIFRyaWdnZXIgYSBjbGljayBpbiB0aGUgd2luZG93IHdoZW5ldmVyIHRoZSB1c2VyIGNsaWNrcyB3aXRoaW4gdGhlIGJvb2tcblx0XHRcdHRoaXMudWkuYm9vay5nZXQoMCkuY29udGVudFdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4geyAkKHdpbmRvdykudHJpZ2dlcihcImNsaWNrXCIpOyB9KTtcblxuXHRcdFx0Ly8gU2V0IHVwIHRoZSBzY3JvbGwgZXZlbnQgaGFuZGxlciBmb3IgdGhlIG5ld2x5IGxvYWRlZCBkb2N1bWVudFxuXHRcdFx0dGhpcy51aS5ib29rLmdldCgwKS5jb250ZW50V2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgXy50aHJvdHRsZSh0aGlzLm9uU2Nyb2xsLmJpbmQodGhpcyksIDEwKSk7XG5cblx0XHRcdC8vdGhpcy51aS5ib29rLmdldCgwKS5jb250ZW50V2luZG93Lm9uY29udGV4dG1lbnUgPSBfLmNvbnN0YW50KGZhbHNlKTtcblxuXHRcdFx0Ly8gQWxsIGV4dGVybmFsIGxpbmtzIGluIHRoZSBib29rIHNob3VsZCBvcGVuIGluIG5ldyB0YWJzXG5cdFx0XHQkKFwiYVtocmVmXVwiLCB0aGlzLnVpLmJvb2suZ2V0KDApLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQpLm9uKFwiY2xpY2tcIiwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1pbnZhbGlkLXRoaXNcblx0XHRcdFx0Y29uc3QgaHJlZiA9ICQodGhpcykucHJvcChcImhyZWZcIik7XG5cdFx0XHRcdGlmIChfLmluY2x1ZGVzKGhyZWYsIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hY2FjaWEvXCIpKVxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0Ly9pZihocmVmLmluZGV4T2YoXCJ3d3cuXCIpID09PSAwIHx8IGhyZWYuaW5kZXhPZihcImh0dHA6Ly9cIikgPT09IDAgfHwgaHJlZi5pbmRleE9mKFwiaHR0cHM6Ly9cIikpXG5cdFx0XHRcdHdpbmRvdy5vcGVuKGhyZWYsIFwiX25ld1wiKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIFNjcm9sbCB0aGUgYm9vayB0byB3aGVyZSBpdCdzIG1heWJlIG5lZWRlZFxuXHRcdFx0dGhpcy5sb2FkU2VjdGlvbk9mZnNldCgpO1xuXG5cdFx0XHQvLyBTeW5jaHJvbmlzZSBhbnkgbmF2aWdhdG9yIGluIGNhc2UgYSBsaW5rIGluc2lkZSB0aGUgYm9vayB3YXMgY2xpY2tlZFxuXHRcdFx0Ly8gYW5kIGFsc28gdG8gdXBkYXRlIHRoZSBsb2NhbFN0b3JhZ2Ugb2Ygd2hlcmUgd2UgYXJlIGluIHRoaXMgYm9va1xuXHRcdFx0aWYgKHRoaXMuZ2V0Q3VycmVudFNlY3Rpb24odHJ1ZSwgdHJ1ZSkpIHtcblx0XHRcdFx0dGhpcy5uYXZpZ2F0b3Iuc2V0VVJMKHRoaXMuZ2V0Q3VycmVudFNlY3Rpb24odHJ1ZSwgdHJ1ZSksIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB0cnVlKTtcblx0XHRcdFx0dGhpcy5uYXZpZ2F0b3Iuc3luY2hyb25pemUodGhpcy5nZXRDdXJyZW50U2VjdGlvbih0cnVlLCB0cnVlKSwgdGhpcy51aS5ib29rLmdldCgwKS5jb250ZW50V2luZG93LnNjcm9sbFkgfHwgdGhpcy51aS5ib29rLmdldCgwKS5jb250ZW50V2luZG93LnBhZ2VZT2Zmc2V0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2Fycnkgb24gbGlzdGVuaW5nIGZvciBvZmZzZXQgY2hhbmdlc1xuXHRcdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLm5hdmlnYXRvciwgXCJjaGFuZ2U6b2Zmc2V0XCIsIHRoaXMubG9hZFNlY3Rpb25PZmZzZXQuYmluZCh0aGlzKSk7XG5cblx0XHRcdC8vIFN5bmNocm9uaXNlIHRoZSBwYWdlIFVSTFxuXHRcdFx0aWYgKHRoaXMuZ2V0Q3VycmVudFNlY3Rpb24odHJ1ZSkpXG5cdFx0XHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0ZSwgXCIvY29uc29sZS9ib29rcy9cIiArIHRoaXMubWV0YWRhdGEuZ2V0KFwiYm9va0lEXCIpICsgXCIvXCIgKyB0aGlzLmdldEN1cnJlbnRTZWN0aW9uKHRydWUpLCB7IHRyaWdnZXI6IGZhbHNlLCByZXBsYWNlOiB0cnVlIH0pO1xuXG5cdFx0XHQvLyBHZW5lcmF0ZSBzb21lIHBhZ2UgYnJlYWtzIGlmIG5lZWRlZFxuXHRcdFx0Y29uc3Qgc2VjdGlvbiA9IHRoaXMuZ2V0Q3VycmVudFNlY3Rpb24oKTtcblx0XHRcdGNvbnN0IHBhZ2VzID0gXy5maWx0ZXIodGhpcy5tZXRhZGF0YS5nZXQoXCJwYWdlc1wiKSwgaXRlbSA9PiBpdGVtLmZpbGUgPT09IHNlY3Rpb24pO1xuXG5cdFx0XHRjb25zdCBwYWdlU2V0ID0gW107XG5cblx0XHRcdGNvbnN0IHJ1biA9ICgpID0+IHtcblx0XHRcdFx0Y29uc3QgZ28gPSB4ID0+IHtcblx0XHRcdFx0XHRjb25zdCBlbCA9IHRoaXMucmVzb2x2ZURPTVNlbGVjdG9yKHguc2VsZWN0b3IpO1xuXHRcdFx0XHRcdGlmIChlbCAmJiBlbC5vZmZzZXQoKSkge1xuXHRcdFx0XHRcdFx0cGFnZVNldC5wdXNoKCQoXCI8ZGl2IGNsYXNzPSdwYWdlLW51bWJlcicgc3R5bGU9J3RvcDogXCIgKyAoZWwub2Zmc2V0KCkudG9wICsgMTApICsgXCJweCc+XCIgKyB4LnBhZ2UgKyBcIjwvZGl2PlwiKSk7XG5cdFx0XHRcdFx0XHRydW4oKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0aWYgKHBhZ2VzLmxlbmd0aClcblx0XHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHsgJChcIi5wYWdlLW51bWJlclwiLCB0aGlzLmVsKS5yZW1vdmUoKTsgZ28ocGFnZXMucG9wKCkpOyB9LCAxMCk7XG5cdFx0XHRcdGVsc2UgaWYgKHBhZ2VTZXQubGVuZ3RoKVxuXHRcdFx0XHRcdHRoaXMudWkuYXR0YWNobWVudENvbnRhaW5lci5hcHBlbmQocGFnZVNldCk7XG5cdFx0XHR9O1xuXG5cdFx0XHRydW4oKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHQvLyBTaWduYWwgdGhlIHJlc291cmNlIHNlbGVjdG9yIHRvIGNsb3NlIHdoZW4gYSB1c2VyIGNsaWNrcyB3aXRoaW4gdGhlIGJvb2sgYW5kIHRyaWdnZXIgYSBjbGljayBldmVudCBpbiB0aGUgd2luZG93XG5cdFx0XHR0aGlzLnVpLmJvb2suY2xpY2soKCkgPT4ge1xuXHRcdFx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5DbG9zZVJlc291cmNlcyk7XG5cdFx0XHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLkNsb3NlU2ltcGxlTWVudXMpO1xuXHRcdFx0XHQkKHdpbmRvdykudHJpZ2dlcihcImNsaWNrXCIpO1xuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMuYm9keUNsaWNrZXIgPSAoKSA9PiB7XG5cdFx0XHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLkNsb3NlUmVzb3VyY2VzKTtcblx0XHRcdFx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5FdmVudHMuQ2xvc2VTaW1wbGVNZW51cyk7XG5cdFx0XHR9O1xuXG5cdFx0XHQkKFwiYm9keVwiKS5vbihcImNsaWNrLmJvZHlDbGlja2VyXCIsIHRoaXMuYm9keUNsaWNrZXIpO1xuXG5cdFx0XHR0aGlzLmxpc3RlblRvKGV2ZW50QnVzLCBldmVudEJ1cy5FdmVudHMuWm9vbUNoYW5nZSwgem9vbSA9PiB7XG5cdFx0XHRcdHRoaXMuem9vbSA9IHpvb207XG5cdFx0XHRcdHRoaXMuc2VjdGlvbkxvYWRlcigpO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIE1lYXN1cmUgdGhlIGRvY3VtZW50XG5cdFx0XHR0aGlzLmhlaWdodCA9IHRoaXMudWkuYm9vay5oZWlnaHQoKTtcblx0XHRcdHRoaXMuY29udGVudEhlaWdodCA9IHRoaXMudWkuYm9vay5nZXQoMCkuc2Nyb2xsSGVpZ2h0O1xuXG5cdFx0XHQvLyBObyBuZWVkIHRvIGJpbmQgc2Nyb2xsIGhhbmRsZXIgaGVyZVxuXG5cdFx0XHQvLyBTY3JvbGwgdGhlIGJvb2sgdG8gd2hlcmUgaXQncyBtYXliZSBuZWVkZWRcblx0XHRcdHRoaXMubG9hZFNlY3Rpb25PZmZzZXQoKTtcblxuXHRcdFx0Ly8gU3luY2hyb25pc2UgYW55IG5hdmlnYXRvciBpbiBjYXNlIGEgbGluayBpbnNpZGUgdGhlIGJvb2sgd2FzIGNsaWNrZWRcblx0XHRcdC8vIGFuZCBhbHNvIHRvIHVwZGF0ZSB0aGUgbG9jYWxTdG9yYWdlIG9mIHdoZXJlIHdlIGFyZSBpbiB0aGlzIGJvb2tcblx0XHRcdHRoaXMubmF2aWdhdG9yLnN5bmNocm9uaXplKHRoaXMuZ2V0Q3VycmVudFNlY3Rpb24odHJ1ZSksIHRoaXMudWkuYm9vay5nZXQoMCkuc2Nyb2xsVG9wKTtcblxuXHRcdFx0Ly8gQ2Fycnkgb24gbGlzdGVuaW5nIGZvciBvZmZzZXQgY2hhbmdlc1xuXHRcdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLm5hdmlnYXRvciwgXCJjaGFuZ2U6b2Zmc2V0XCIsIHRoaXMubG9hZFNlY3Rpb25PZmZzZXQuYmluZCh0aGlzKSk7XG5cblx0XHRcdC8vIFN5bmNocm9uaXNlIHRoZSBwYWdlIFVSTFxuXHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLk5hdmlnYXRlLCBcIi9jb25zb2xlL2Jvb2tzL1wiICsgdGhpcy5tZXRhZGF0YS5nZXQoXCJib29rSURcIikgKyBcIi9cIiArIHRoaXMuZ2V0Q3VycmVudFNlY3Rpb24odHJ1ZSksIHsgdHJpZ2dlcjogZmFsc2UsIHJlcGxhY2U6IHRydWUgfSk7XG5cdFx0fVxuXG5cdFx0Ly8gRXhlY3V0ZSB0aGUgYm9vayBtaXhpbidzIGhhbmRsZXIgZm9yIHdoZW4gbG9hZGluZyBpcyBjb21wbGV0ZVxuXHRcdGlmICh0aGlzLm9uQm9va0xvYWQpXG5cdFx0XHR0aGlzLm9uQm9va0xvYWQoKTtcblxuXHRcdC8vdGhpcy5mZXRjaEhpZ2hsaWdodHMoKTtcblxuXHRcdC8vIFNob3cvaGlkZSB0aGUgcHJldi9uZXh0IHN0dWZmXG5cdFx0dGhpcy5wb2xsTmF2aWdhdGVQcmV2aW91cygpO1xuXHRcdHRoaXMucG9sbE5hdmlnYXRlTmV4dCgpO1xuXG5cdFx0Ly8gVXBkYXRlIHRoZSBhdHRhY2htZW50IGNvbnRhaW5lclxuXHRcdHRoaXMucmVzaXplQXR0YWNobWVudENvbnRhaW5lcigpO1xuXHRcdHRoaXMuc2Nyb2xsQXR0YWNobWVudENvbnRhaW5lcigpO1xuXHRcdGlmICh0aGlzLmF0dGFjaG1lbnRzRmV0Y2hlZClcblx0XHRcdHRoaXMucG9wdWxhdGVBdHRhY2htZW50Q29udGFpbmVyKCk7XG5cblx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5Mb2FkRW5kLCB0aGlzLmZvcm1hdCk7XG5cdFx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5FdmVudHMuVmlld0xvYWRlZCk7XG5cdFx0dGhpcy5sb2FkZWQgPSB0cnVlO1xuXG5cdFx0Ly8gUmV2ZWFsIHRoZSBuZXcgZG9jdW1lbnRcblx0XHR0aGlzLmhpZGVTcGlubmVyKCk7XG5cdH0sXG5cblx0aGlkZUZsYXNoQ2FyZFdpZGdldDogZnVuY3Rpb24oKVx0e1xuXHRcdGlmICh0aGlzLmZsYXNoQ2FyZFdpZGdldClcblx0XHRcdHRoaXMuZmxhc2hDYXJkV2lkZ2V0LmRlc3Ryb3koKTtcblx0fSxcblxuXHRzaG93Rmxhc2hDYXJkV2lkZ2V0OiBmdW5jdGlvbigpXHR7XG5cdFx0dGhpcy5mbGFzaENhcmRXaWRnZXQgPSBuZXcgRmxhc2hDYXJkV2lkZ2V0KCk7XG5cdFx0dGhpcy4kZWwuYXBwZW5kKHRoaXMuZmxhc2hDYXJkV2lkZ2V0LnJlbmRlcigpLiRlbCk7XG5cdH0sXG5cblx0Z3JvdXBzQ2hhbmdlZDogZnVuY3Rpb24oYWxsb3dlZCwgY3VycmVudCkge1xuXHRcdGlmICghdGhpcy51aS5ncm91cE5vdGlmeS5yZW1vdmVDbGFzcylcblx0XHRcdHJldHVybjtcblxuXHRcdGlmICghdGhpcy5ncm91cE5vdGlmaWNhdGlvbiAmJiBfLmludGVyc2VjdGlvbihfLm1hcChhbGxvd2VkLnN5c3RlbSwgeCA9PiB4LmNvZGUpLCBjdXJyZW50KS5sZW5ndGggIT09IF8ubWFwKGFsbG93ZWQuc3lzdGVtLCB4ID0+IHguY29kZSkubGVuZ3RoKVxuXHRcdFx0dGhpcy51aS5ncm91cE5vdGlmeS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy51aS5ncm91cE5vdGlmeS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0b25Hcm91cE5vdGlmeUNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5TaG93R3JvdXBNb2RhbCk7XG5cdH0sXG5cblx0b25OYXZQcmV2aW91c0NsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLm5hdk5leHQuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkubmF2UHJldmlvdXMuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0dGhpcy5uYXZpZ2F0b3IubmF2aWdhdGVQcmV2aW91cygpO1xuXG5cdFx0Ly9pZiAodGhpcy5nZXRDdXJyZW50U2VjdGlvbih0cnVlKSlcblx0XHQvL1x0dGhpcy5uYXZpZ2F0b3Iuc3luY2hyb25pemUodGhpcy5nZXRDdXJyZW50U2VjdGlvbih0cnVlKSwgdGhpcy51aS5ib29rLmdldCgwKS5jb250ZW50V2luZG93LnNjcm9sbFkgfHwgdGhpcy51aS5ib29rLmdldCgwKS5jb250ZW50V2luZG93LnBhZ2VZT2Zmc2V0KTtcblx0fSxcblxuXHRvbk5hdk5leHRDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5uYXZOZXh0LmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLm5hdlByZXZpb3VzLmFkZENsYXNzKFwiaGlkZVwiKTtcblxuXHRcdHRoaXMubmF2aWdhdG9yLm5hdmlnYXRlTmV4dCgpO1xuXG5cdFx0Ly9pZiAodGhpcy5nZXRDdXJyZW50U2VjdGlvbih0cnVlKSlcblx0XHQvL1x0dGhpcy5uYXZpZ2F0b3Iuc3luY2hyb25pemUodGhpcy5nZXRDdXJyZW50U2VjdGlvbih0cnVlKSwgdGhpcy51aS5ib29rLmdldCgwKS5jb250ZW50V2luZG93LnNjcm9sbFkgfHwgdGhpcy51aS5ib29rLmdldCgwKS5jb250ZW50V2luZG93LnBhZ2VZT2Zmc2V0KTtcblx0fSxcblxuXHRjb25maWd1cmVPdmVybGF5OiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIXRoaXMudWkub3ZlcmxheS5vZmZzZXQpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLk92ZXJsYXlCYXNlID0gdGhpcy51aS5vdmVybGF5Lm9mZnNldCgpO1xuXG5cdFx0Ly8gUmVjb25maWd1cmUgdGhlIFVJIGluIHJlc3BvbnNlIHRvIHJlc291cmNlIGRyYWcgb3BlcmF0aW9uc1xuXHRcdHRoaXMubGlzdGVuVG8oZXZlbnRCdXMsIGV2ZW50QnVzLkV2ZW50cy5SZXNvdXJjZURyYWdTdGFydCwgKCkgPT4ge1xuXHRcdFx0JChcImJvZHlcIikub2ZmKFwiY2xpY2suYm9keUNsaWNrZXJcIik7XG5cdFx0XHR0aGlzLnVpLm92ZXJsYXkub24oXCJtb3VzZW1vdmUuZHJhZ2dpbmdSZXNvdXJjZVwiLCB0aGlzLmRyYWdPdmVyLmJpbmQodGhpcywgdGhpcy5mb3JtYXQpKTtcblx0XHRcdHRoaXMudWkub3ZlcmxheS5jc3MoeyBcInBvaW50ZXItZXZlbnRzXCI6IFwiYWxsXCIgfSk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKGV2ZW50QnVzLCBldmVudEJ1cy5FdmVudHMuUmVzb3VyY2VEcmFnRW5kLCAoKSA9PiB7XG5cdFx0XHR0aGlzLnVpLm92ZXJsYXkub2ZmKFwibW91c2Vtb3ZlLmRyYWdnaW5nUmVzb3VyY2VcIik7XG5cdFx0XHR0aGlzLnVpLm92ZXJsYXkuY3NzKHsgXCJwb2ludGVyLWV2ZW50c1wiOiBcIm5vbmVcIiB9KTtcblx0XHRcdHRoaXMudWkuaGlnaGxpZ2h0QmFyLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdF8uZGVsYXkoKCkgPT4ge1xuXHRcdFx0XHQkKFwiYm9keVwiKS5vbihcImNsaWNrLmJvZHlDbGlja2VyXCIsIHRoaXMuYm9keUNsaWNrZXIpO1xuXHRcdFx0fSwgNTAwKTtcblx0XHR9KTtcblxuXHRcdC8vIFJlY29uZmlndXJlIHRoZSBVSSBpbiByZXNwb25zZSB0byBhdHRhY2htZW50IGRyYWcgb3BlcmF0aW9uc1xuXHRcdHRoaXMubGlzdGVuVG8oZXZlbnRCdXMsIGV2ZW50QnVzLkV2ZW50cy5BdHRhY2htZW50RHJhZ1N0YXJ0LCAoKSA9PiB7XG5cdFx0XHR0aGlzLnVpLm92ZXJsYXkuY3NzKHsgXCJwb2ludGVyLWV2ZW50c1wiOiBcImFsbFwiIH0pO1xuXHRcdFx0dGhpcy51aS5hdHRhY2htZW50RGVsZXRlci5jc3MoeyB0b3A6IE1hdGgubWF4KDEwLCAxMDAgLSB3aW5kb3cucGFnZVlPZmZzZXQpIH0pLnJlbW92ZUNsYXNzKFwiYXR0YWNobWVudC1iaW4taGlkZGVuXCIpO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhldmVudEJ1cywgZXZlbnRCdXMuRXZlbnRzLkF0dGFjaG1lbnREcmFnRW5kLCAoKSA9PiB7XG5cdFx0XHR0aGlzLnVpLm92ZXJsYXkuY3NzKHsgXCJwb2ludGVyLWV2ZW50c1wiOiBcIm5vbmVcIiB9KTtcblx0XHRcdHRoaXMudWkuYXR0YWNobWVudERlbGV0ZXIuYWRkQ2xhc3MoXCJhdHRhY2htZW50LWJpbi1oaWRkZW5cIik7XG5cdFx0XHR0aGlzLnVpLmhpZ2hsaWdodEJhci5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0fSk7XG5cblx0XHQvLyBMaXN0ZW4gZm9yIGRyYWcgZXZlbnRzXG5cdFx0dGhpcy5saXN0ZW5UbyhldmVudEJ1cywgZXZlbnRCdXMuRXZlbnRzLlJlc291cmNlRHJhZ0Ryb3AsIChldmVudCwgcmVzb3VyY2VEYXRhKSA9PiB7XG5cdFx0XHR0aGlzLm9uRHJvcChldmVudCwgcmVzb3VyY2VEYXRhKTtcblx0XHR9KTtcblx0fSxcblxuXHRwb3B1bGF0ZUF0dGFjaG1lbnRDb250YWluZXI6IGZ1bmN0aW9uKCkge1xuXHRcdC8vaWYoIXRoaXMudWkuYXR0YWNobWVudENvbnRhaW5lci5lbXB0eSlcblx0XHQvL1x0cmV0dXJuO1xuXG5cdFx0dGhpcy5yZW1vdmVBbGxBdHRhY2htZW50Vmlld3MoKTtcblxuXHRcdC8vIEFsc28gd2lwZSBwYWdlIG51bWJlcnNcblx0XHR0aGlzLnVpLmF0dGFjaG1lbnRDb250YWluZXIuZW1wdHkoKTtcblxuXHRcdC8vIEZpbHRlciBhdHRhY2htZW50cyB0byB0aGUgY3VycmVudCBwYWdlXG5cdFx0Y29uc3Qgc2VjdGlvbiA9IHRoaXMuZ2V0Q3VycmVudFNlY3Rpb24oKTtcblx0XHRsZXQgYXR0YWNoZXMgPSB0aGlzLkF0dGFjaG1lbnRzLmZpbHRlcih4ID0+IChzZXR0aW5ncy5hc3Nlc3NtZW50cyB8fCB4LmdldChcInJlc291cmNlVHlwZVwiKSAhPT0gXCJhc3Nlc3NtZW50XCIpICYmIHguZ2V0KFwic2VjdGlvblwiKS50b1N0cmluZygpID09PSBzZWN0aW9uLnRvU3RyaW5nKCkpO1xuXG5cdFx0Ly8gU29ydCB0aGVtIGJ5IGNyZWF0aW9uIGRhdGUgdG8gZW5zdXJlIGEgY29uc2lzdGVudCBvcmRlcmluZ1xuXHRcdGF0dGFjaGVzID0gXy5zb3J0QnkoYXR0YWNoZXMsIFwiY3JlYXRlZFwiKTtcblxuXHRcdF8uZWFjaChhdHRhY2hlcywgYXR0YWNobWVudE1vZGVsID0+IHtcblx0XHRcdC8vIENyZWF0ZSBhIG5ldyB2aWV3IGZvciB0aGlzIGF0dGFjaG1lbnRcblx0XHRcdHRoaXMuY3JlYXRlQXR0YWNobWVudFZpZXcoYXR0YWNobWVudE1vZGVsKTtcblx0XHR9KTtcblx0fSxcblxuXHRjcmVhdGVBdHRhY2htZW50VmlldzogZnVuY3Rpb24oX2F0dGFjaG1lbnRNb2RlbCkge1xuXHRcdGlmICghX2F0dGFjaG1lbnRNb2RlbClcblx0XHRcdHJldHVybjtcblxuXHRcdGxldCBhdHRhY2htZW50TW9kZWwgPSBfYXR0YWNobWVudE1vZGVsO1xuXG5cdFx0Ly8gSWYgdGhlIGN1cnJlbnQgdXNlciBpcyB0aGUgb3duZXIgb2YgdGhlIHJlanV2ZW5hdGUsIGRvIG5vdCByZW1vdmUgaXRcblx0XHRsZXQgcmVqdXZlbmF0ZU1vZGVsO1xuXG5cdFx0Ly8gSWYgdGhlIG5ldyBhdHRhY2htZW50IHJlanV2ZW5hdGVzIGFuIG9sZGVyIGF0dGFjaG1lbnQuLi5cblx0XHRpZiAoYXR0YWNobWVudE1vZGVsLmhhcyhcInJlanV2ZW5hdGVzXCIpKSB7XG5cdFx0XHRjb25zdCB1c2VyID0gcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblx0XHRcdHJlanV2ZW5hdGVNb2RlbCA9IF8uZmluZChhdHRhY2htZW50TW9kZWwuY29sbGVjdGlvbi5tb2RlbHMsIG1vZGVsID0+IG1vZGVsLmdldChcIl9pZFwiKSA9PT0gYXR0YWNobWVudE1vZGVsLmdldChcInJlanV2ZW5hdGVzXCIpICYmIG1vZGVsLmdldChcIm93bmVyXCIpID09PSB1c2VyLnVzZXJfaWQpO1xuXG5cdFx0XHRpZiAoc2V0dGluZ3MuYW5udWFsQ29udGVudCkge1xuXHRcdFx0XHRpZiAocmVqdXZlbmF0ZU1vZGVsICYmICFyZWp1dmVuYXRlTW9kZWwuaXNPbGQoKSkge1xuXHRcdFx0XHRcdC8vIC4uLnRoZW4gcmVtb3ZlIHRoZSBuZXcgYXR0YWNobWVudCB2aWV3IHNvIHRoYXQgdGhlIG93bmVyIGRvZXMgbm90IHNlZSBkdXBsaWNhdGVzXG5cdFx0XHRcdFx0dGhpcy5yZW1vdmVBdHRhY2htZW50VmlldyhhdHRhY2htZW50TW9kZWwsIGF0dGFjaG1lbnRNb2RlbC5nZXQoXCJzZWxlY3RvclwiKSk7XG5cdFx0XHRcdFx0YXR0YWNobWVudE1vZGVsID0gcmVqdXZlbmF0ZU1vZGVsO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdC8vIC4uLnRoZW4gcmVtb3ZlIHRoZSBvbGQgYXR0YWNobWVudCB2aWV3XG5cdFx0XHRcdFx0dGhpcy5yZW1vdmVPbGRBdHRhY2htZW50VmlldyhhdHRhY2htZW50TW9kZWwpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmICghc2V0dGluZ3MuYW5udWFsQ29udGVudCAmJiByZWp1dmVuYXRlTW9kZWwgJiYgcmVqdXZlbmF0ZU1vZGVsLmlzRm9yZWlnbigpKSB7XG5cdFx0XHRcdC8vIC4uLnRoZW4gcmVtb3ZlIHRoZSBmb3JlaWduIGF0dGFjaG1lbnQgdmlld1xuXHRcdFx0XHR0aGlzLnJlbW92ZU9sZEF0dGFjaG1lbnRWaWV3KGF0dGFjaG1lbnRNb2RlbCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlIGF0dGFjaG1lbnQgaXMgb2xkIGFuZCBhIG5ld2VyIHZlcnNpb24gb2YgdGhlIGF0dGFjaG1lbnQgZXhpc3RzLi4uXG5cdFx0aWYgKGF0dGFjaG1lbnRNb2RlbC5pc09sZCgpICYmIHRoaXMucmVqdXZlbmF0b3JFeGlzdHNGb3IoYXR0YWNobWVudE1vZGVsKSkge1xuXHRcdFx0Ly8gLi4udGhlbiBwcmV2ZW50IHRoZSBjcmVhdGlvbiBvZiBhIHZpZXcgZm9yIHRoZSBhdHRhY2htZW50XG5cdFx0XHRhdHRhY2htZW50TW9kZWwgPSBudWxsO1xuXHRcdH1cblx0XHQvLyBJZiB0aGUgYXR0YWNobWVudCBpcyBmb3JlaWduIGFuZCBhIG5hdGl2ZSB2ZXJzaW9uIG9mIHRoZSBhdHRhY2htZW50IGV4aXN0cy4uLlxuXHRcdGVsc2UgaWYgKGF0dGFjaG1lbnRNb2RlbC5pc0ZvcmVpZ24oKSAmJiB0aGlzLnJlanV2ZW5hdG9yRXhpc3RzRm9yKGF0dGFjaG1lbnRNb2RlbCkgJiYgIXJlanV2ZW5hdGVNb2RlbCkge1xuXHRcdFx0Ly8gLi4udGhlbiBwcmV2ZW50IHRoZSBjcmVhdGlvbiBvZiBhIHZpZXcgZm9yIHRoZSBhdHRhY2htZW50XG5cdFx0XHRhdHRhY2htZW50TW9kZWwgPSBudWxsO1xuXHRcdH1cblxuXHRcdGlmIChhdHRhY2htZW50TW9kZWwpIHtcblx0XHRcdC8vIE9idGFpbiB0aGUgbmV3IGF0dGFjaG1lbnQncyBzZWxlY3RvclxuXHRcdFx0Y29uc3Qgc2VsZWN0b3IgPSBhdHRhY2htZW50TW9kZWwuZ2V0KFwic2VsZWN0b3JcIik7XG5cblx0XHRcdC8vIElmIG5vIG90aGVyIGF0dGFjaG1lbnQgaXMgcHJlc2VudCBhdCB0aGUgbmV3IGF0dGFjaG1lbnQncyBzZWxlY3Rvci4uLlxuXHRcdFx0Y29uc3QgZXhpc3RpbmcgPSB0aGlzLmdldEF0dGFjaG1lbnRBdFNlbGVjdG9yKHNlbGVjdG9yKTtcblx0XHRcdGlmIChleGlzdGluZykge1xuXHRcdFx0XHQvLyBhZGQgdGhlIGF0dGFjaG1lbnQgbW9kZWwgdG8gdGhlIGV4aXN0aW5nIGF0dGFjaG1lbnQgdmlldydzIGNvbGxlY3Rpb25cblx0XHRcdFx0ZXhpc3RpbmcuYXR0YWNobWVudENvbGxlY3Rpb24uYWRkKGF0dGFjaG1lbnRNb2RlbCk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0Ly8gLi4udGhlbiBjcmVhdGUgYSBuZXcgYXR0YWNobWVudCBjb2xsZWN0aW9uIGFuZCBhZGQgdGhlIGF0dGFjaG1lbnQgbW9kZWwgdG8gaXRcblx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG5cdFx0XHRcdGNvbnN0IGF0dGFjaG1lbnRDb2xsZWN0aW9uID0gbmV3IEF0dGFjaG1lbnRDb2xsZWN0aW9uKCk7XG5cdFx0XHRcdGF0dGFjaG1lbnRDb2xsZWN0aW9uLmFkZChhdHRhY2htZW50TW9kZWwpO1xuXG5cdFx0XHRcdC8vIENyZWF0ZSBhIGNvbXBvdW5kIGF0dGFjaG1lbnQgdmlldyB0byBjb250YWluIHRoZSBhdHRhY2htZW50XG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuXHRcdFx0XHRjb25zdCB2aWV3ID0gbmV3IENvbXBvdW5kQXR0YWNobWVudFZpZXcoeyBhdHRhY2htZW50Q29sbGVjdGlvbjogYXR0YWNobWVudENvbGxlY3Rpb24gfSk7XG5cdFx0XHRcdHRoaXMudWkuYXR0YWNobWVudENvbnRhaW5lci5hcHBlbmQodmlldy5yZW5kZXIoKS5lbCk7XG5cdFx0XHRcdHZpZXcub25SZW5kZXIoKTtcblxuXHRcdFx0XHRpZiAodGhpcy5mb3JtYXQgPT09IFwibXB1YlwiKSB7XG5cdFx0XHRcdFx0Ly8gUG9zaXRpb24gdGhlIGF0dGFjaG1lbnQgdmlldyB3aXRoaW4gdGhlIGF0dGFjaG1lbnQgY29udGFpbmVyXG5cdFx0XHRcdFx0Y29uc3QgZWwgPSAkKHRoaXMucmVzb2x2ZURPTVNlbGVjdG9yKHNlbGVjdG9yKSk7XG5cdFx0XHRcdFx0aWYgKCFlbC5sZW5ndGgpXG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0dmlldy4kZWwuY3NzKHtcblx0XHRcdFx0XHRcdHRvcDogKGVsLm9mZnNldCgpLnRvcCArIGVsLmhlaWdodCgpIC8gMiAtIDEyKSArIFwicHhcIixcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHR2aWV3LiRlbC5jc3Moe1xuXHRcdFx0XHRcdFx0dG9wOiAoKHBhcnNlRmxvYXQoc2VsZWN0b3IpICogdGhpcy5jb250ZW50SGVpZ2h0ICogMC4wMSkudG9GaXhlZCgwKSkgKyBcInB4XCIsXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHQvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCBhdHRhY2htZW50IHdlJ3JlIGFkZGluZywgdGhlIGNlbnRyZSBvZiB0aGlzIGlzIHRoZSBiYXNpcyBvZiB0aGUgaW52aXNpYmxlIGdyaWRcblx0XHRcdFx0XHRpZiAoIXRoaXMuaW52aXNpYmxlR3JpZE9mZnNldClcblx0XHRcdFx0XHRcdHRoaXMuaW52aXNpYmxlR3JpZE9mZnNldCA9IChwYXJzZUZsb2F0KHNlbGVjdG9yKSAqIHRoaXMuY29udGVudEhlaWdodCAqIDAuMDEpLnRvRml4ZWQoMik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBZGQgdGhlIGF0dGFjaG1lbnQgdmlldyB0byB0aGUgaGFzaFxuXHRcdFx0XHR0aGlzLkF0dGFjaG1lbnRWaWV3c1t0aGlzLm1hcFNlbGVjdG9yKHNlbGVjdG9yKV0gPSB7IHZpZXc6IHZpZXcsIGF0dGFjaG1lbnRDb2xsZWN0aW9uOiBhdHRhY2htZW50Q29sbGVjdGlvbiB9O1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRtb3ZlQXR0YWNobWVudDogZnVuY3Rpb24oYXR0YWNobWVudE1vZGVsSWRlbnRpZmllcnMsIG5ld1NlbGVjdG9yKSB7XG5cdFx0Y29uc3QgbXVsdGkgPSBhdHRhY2htZW50TW9kZWxJZGVudGlmaWVycy5sZW5ndGggPiAxO1xuXG5cdFx0Y29uc3QgdXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cblx0XHRfLmZvckVhY2goYXR0YWNobWVudE1vZGVsSWRlbnRpZmllcnMsIGlkID0+IHtcblx0XHRcdC8vIFJldHJpZXZlIHRoZSBjb21wbGV0ZSBhdHRhY2htZW50IG1vZGVsIChpbmNsdWRpbmcgdGhlIGFzc29jaWF0ZWQgcmVzb3VyY2UgbW9kZWwpXG5cdFx0XHRjb25zdCBhdHRhY2htZW50TW9kZWwgPSB0aGlzLkF0dGFjaG1lbnRzLmdldChpZCk7XG5cdFx0XHRpZiAoIWF0dGFjaG1lbnRNb2RlbClcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHQvLyBNb3ZlIG9ubHkgbmV3IGF0dGFjaG1lbnRzIGFuZCBsZWF2ZSB0aGUgb2xkIGF0dGFjaG1lbnRzIGJlaGluZFxuXHRcdFx0aWYgKHJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAuZ3JvdXBzLmFsbCwgdXNlcikgfHwgKCFhdHRhY2htZW50TW9kZWwuaXNPbGQoKSAmJiAhYXR0YWNobWVudE1vZGVsLmlzRm9yZWlnbigpICYmICFhdHRhY2htZW50TW9kZWwuaXNTaGFyZWQoKSkpIHtcblx0XHRcdFx0Ly8gRGV0ZXJtaW5lIHRoZSBjdXJyZW50IGxvY2F0aW9uIG9mIHRoZSBhdHRhY2htZW50XG5cdFx0XHRcdGNvbnN0IG9sZFNlbGVjdG9yID0gYXR0YWNobWVudE1vZGVsLmdldChcInNlbGVjdG9yXCIpO1xuXG5cdFx0XHRcdC8vIFNhbWUgbG9jYXRpb24/IElnbm9yZSB0aGlzXG5cdFx0XHRcdGlmICh0aGlzLmZvcm1hdCA9PT0gXCJtcHViXCIgJiYgdGhpcy5tYXBTZWxlY3RvcihvbGRTZWxlY3RvcikgPT09IHRoaXMubWFwU2VsZWN0b3IobmV3U2VsZWN0b3IpKVxuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRhdHRhY2htZW50TW9kZWwuc2V0KHsgc2VsZWN0b3I6IG5ld1NlbGVjdG9yIH0pO1xuXG5cdFx0XHRcdC8vIFJlbW92ZSB0aGUgYXR0YWNobWVudCBtb2RlbCBmcm9tIGl0cyBvbGQgbG9jYXRpb24uXG5cdFx0XHRcdC8vIE5PVEU6IG11c3QgcmVtb3ZlIGJlZm9yZSBhZGRpbmcsIGJlY2F1c2Ugd2UgbmVlZCB0aGUgc2VsZWN0b3IgdW5jaGFuZ2VkIHRvIGRvIHZpcnR1YWwgc2VsZWN0b3IgbG9va3VwcyBmb3IgUERGc1xuXHRcdFx0XHR0aGlzLnJlbW92ZUF0dGFjaG1lbnRWaWV3KGF0dGFjaG1lbnRNb2RlbCwgb2xkU2VsZWN0b3IpO1xuXG5cdFx0XHRcdHRoaXMuY3JlYXRlQXR0YWNobWVudFZpZXcoYXR0YWNobWVudE1vZGVsKTtcblxuXHRcdFx0XHQvLyBVcGRhdGUgdGhlIGF0dGFjaG1lbnQgbW9kZWxcblx0XHRcdFx0YXR0YWNobWVudE1vZGVsLnNhdmUobnVsbCwge1xuXHRcdFx0XHRcdGVycm9yOiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRhdHRhY2htZW50TW9kZWwuc2V0KHsgc2VsZWN0b3I6IG9sZFNlbGVjdG9yIH0pO1xuXG5cdFx0XHRcdFx0XHR0aGlzLmNyZWF0ZUF0dGFjaG1lbnRWaWV3KGF0dGFjaG1lbnRNb2RlbCk7XG5cblx0XHRcdFx0XHRcdC8vIFJlbW92ZSB0aGUgYXR0YWNobWVudCBtb2RlbCBmcm9tIGl0cyBvbGQgbG9jYXRpb25cblx0XHRcdFx0XHRcdHRoaXMucmVtb3ZlQXR0YWNobWVudFZpZXcoYXR0YWNobWVudE1vZGVsLCBuZXdTZWxlY3Rvcik7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoXCJFcnJvciBzYXZpbmcgYXR0YWNobWVudCBtb2RlbCBkdXJpbmcgYXR0YWNobWVudCBtb3ZlIG9wZXJhdGlvbi5cIik7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmICghbXVsdGkpIHtcblx0XHRcdFx0Y29uc3QgdHh0ID0gYXR0YWNobWVudE1vZGVsLmlzT2xkKCkgPyBcIlRoaXMgYXR0YWNobWVudCBpcyBmcm9tIGEgcHJldmlvdXMgeWVhclwiIDpcblx0XHRcdFx0XHRhdHRhY2htZW50TW9kZWwuaXNGb3JlaWduKCkgPyBcIlRoaXMgYXR0YWNobWVudCBpcyBmcm9tIGFub3RoZXIgZ3JvdXBcIiA6IFwiVGhpcyBhdHRhY2htZW50IGlzIHNoYXJlZCB3aXRoIG90aGVyIGdyb3Vwc1wiO1xuXG5cdFx0XHRcdGNvbnN0IG1vZGFsID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0XHRcdHRpdGxlOiBcIjxzcGFuIGNsYXNzPSdmYWwgZmEtYmFuJy8+IE1vdmUgTm90IEFsbG93ZWRcIixcblx0XHRcdFx0XHRib2R5OiB0eHQgKyBcIi4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBtb3ZlIGl0LlwiLFxuXHRcdFx0XHRcdGhvc3Q6IFwiI2xpbmstcmVzb3VyY2VzXCIsXG5cdFx0XHRcdFx0aGlkZUJ1dHRvbnM6IFtcImNhbmNlbFwiXSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdG1vZGFsLnNob3coKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHRyZW1vdmVBdHRhY2htZW50VmlldzogZnVuY3Rpb24oYXR0YWNobWVudE1vZGVsLCBzZWxlY3Rvcikge1xuXHRcdC8vIFJlbW92ZSB0aGUgYXR0YWNobWVudCBtb2RlbCBmcm9tIHRoZSBzcGVjaWZpZWQgbG9jYXRpb25cblx0XHRpZiAodGhpcy5BdHRhY2htZW50Vmlld3NbdGhpcy5tYXBTZWxlY3RvcihzZWxlY3RvcildKSB7XG5cdFx0XHR0aGlzLkF0dGFjaG1lbnRWaWV3c1t0aGlzLm1hcFNlbGVjdG9yKHNlbGVjdG9yKV0uYXR0YWNobWVudENvbGxlY3Rpb24ucmVtb3ZlKGF0dGFjaG1lbnRNb2RlbCk7XG5cblx0XHRcdC8vIElmIHRoZSBhdHRhY2htZW50IGNvbGxlY3Rpb24gYXQgdGhlIG9sZCBsb2NhdGlvbiBpcyBub3cgZW1wdHkuLi5cblx0XHRcdGlmICh0aGlzLkF0dGFjaG1lbnRWaWV3c1t0aGlzLm1hcFNlbGVjdG9yKHNlbGVjdG9yKV0uYXR0YWNobWVudENvbGxlY3Rpb24ubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdC8vIC4uLnRoZW4gcmVtb3ZlIHRoZSB2aWV3IGF0IHRoZSBvbGQgbG9jYXRpb24gYW5kIHJlbW92ZSB0aGUgYXR0YWNobWVudCBmcm9tIHRoZSBoYXNoXG5cdFx0XHRcdHRoaXMuQXR0YWNobWVudFZpZXdzW3RoaXMubWFwU2VsZWN0b3Ioc2VsZWN0b3IpXS52aWV3LmRlc3Ryb3koKTtcblx0XHRcdFx0ZGVsZXRlIHRoaXMuQXR0YWNobWVudFZpZXdzW3RoaXMubWFwU2VsZWN0b3Ioc2VsZWN0b3IpXTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0ZGVzdHJveUF0dGFjaG1lbnRWaWV3OiBmdW5jdGlvbihhdHRhY2htZW50TW9kZWwpIHtcblx0XHRjb25zdCBzZWxlY3RvciA9IGF0dGFjaG1lbnRNb2RlbC5nZXQoXCJzZWxlY3RvclwiKTtcblxuXHRcdGlmICh0aGlzLkF0dGFjaG1lbnRWaWV3c1t0aGlzLm1hcFNlbGVjdG9yKHNlbGVjdG9yKV0gJiYgdGhpcy5BdHRhY2htZW50Vmlld3NbdGhpcy5tYXBTZWxlY3RvcihzZWxlY3RvcildLmF0dGFjaG1lbnRDb2xsZWN0aW9uLmxlbmd0aCA8PSAxKSB7XG5cdFx0XHR0aGlzLkF0dGFjaG1lbnRWaWV3c1t0aGlzLm1hcFNlbGVjdG9yKHNlbGVjdG9yKV0udmlldy5kZXN0cm95KCk7XG5cdFx0XHRkZWxldGUgdGhpcy5BdHRhY2htZW50Vmlld3NbdGhpcy5tYXBTZWxlY3RvcihzZWxlY3RvcildO1xuXHRcdH1cblx0XHRlbHNlIGlmICghdGhpcy5BdHRhY2htZW50Vmlld3NbdGhpcy5tYXBTZWxlY3RvcihzZWxlY3RvcildKSB7IGNvbnNvbGUud2FybihcIkF0dGFjaG1lbnQgdG8gZGVsZXRlIGRpZCBub3QgZXhpc3QgQCBzZWxlY3RvciBcIiArIHNlbGVjdG9yKTsgfVxuXHR9LFxuXG5cdHJlbW92ZU9sZEF0dGFjaG1lbnRWaWV3OiBmdW5jdGlvbihuZXdBdHRhY2htZW50TW9kZWwpIHtcblx0XHRjb25zdCBvbGRBdHRhY2htZW50TW9kZWwgPSB0aGlzLkF0dGFjaG1lbnRzLmZpbmQobW9kZWwgPT4gbW9kZWwuZ2V0KFwiX2lkXCIpID09PSBuZXdBdHRhY2htZW50TW9kZWwuZ2V0KFwicmVqdXZlbmF0ZXNcIikpO1xuXG5cdFx0aWYgKG9sZEF0dGFjaG1lbnRNb2RlbClcblx0XHRcdHRoaXMucmVtb3ZlQXR0YWNobWVudFZpZXcob2xkQXR0YWNobWVudE1vZGVsLCBvbGRBdHRhY2htZW50TW9kZWwuZ2V0KFwic2VsZWN0b3JcIikpO1xuXHR9LFxuXG5cdHJlbW92ZUFsbEF0dGFjaG1lbnRWaWV3czogZnVuY3Rpb24oKSB7XG5cdFx0Xy5mb3JFYWNoKHRoaXMuQXR0YWNobWVudFZpZXdzLCB2aWV3ID0+IHZpZXcudmlldy5yZW1vdmUoKSk7XG5cblx0XHR0aGlzLkF0dGFjaG1lbnRWaWV3cyA9IHt9O1xuXHR9LFxuXG5cdHVwZGF0ZUF0dGFjaG1lbnRWaWV3czogZnVuY3Rpb24oYXR0YWNobWVudE1vZGVsLCBuZXdTZWxlY3Rvcikge1xuXHRcdGNvbnN0IG9sZFNlbGVjdG9yID0gYXR0YWNobWVudE1vZGVsLnByZXZpb3VzKFwic2VsZWN0b3JcIik7XG5cdFx0Y29uc3QgYXR0YWNobWVudCA9IHRoaXMuQXR0YWNobWVudFZpZXdzW3RoaXMubWFwU2VsZWN0b3Iob2xkU2VsZWN0b3IpXTtcblxuXHRcdGRlbGV0ZSB0aGlzLkF0dGFjaG1lbnRWaWV3c1t0aGlzLm1hcFNlbGVjdG9yKG9sZFNlbGVjdG9yKV07XG5cblx0XHR0aGlzLkF0dGFjaG1lbnRWaWV3c1t0aGlzLm1hcFNlbGVjdG9yKG5ld1NlbGVjdG9yKV0gPSBhdHRhY2htZW50O1xuXHR9LFxuXG5cdHJlanV2ZW5hdG9yRXhpc3RzRm9yOiBmdW5jdGlvbihhdHRhY2htZW50TW9kZWwpIHtcblx0XHRyZXR1cm4gXy5maW5kKHRoaXMuQXR0YWNobWVudHMubW9kZWxzLCBtb2RlbCA9PiAobW9kZWwuaGFzKFwicmVqdXZlbmF0ZXNcIikgJiYgKG1vZGVsLmdldChcInJlanV2ZW5hdGVzXCIpID09PSBhdHRhY2htZW50TW9kZWwuZ2V0KFwiX2lkXCIpKSkpO1xuXHR9LFxuXG5cdHF1ZXJ5UmVqdXZlbmF0ZUF0dGFjaG1lbnQ6IGZ1bmN0aW9uKGF0dGFjaG1lbnRNb2RlbCkge1xuXHRcdGNvbnN0IHN0YXRlcyA9IFtdO1xuXHRcdGlmIChhdHRhY2htZW50TW9kZWwuaXNPbGQoKSlcblx0XHRcdHN0YXRlcy5wdXNoKFwiZnJvbSBhIHByZXZpb3VzIHllYXJcIik7XG5cdFx0aWYgKGF0dGFjaG1lbnRNb2RlbC5pc0ZvcmVpZ24oKSlcblx0XHRcdHN0YXRlcy5wdXNoKFwiZnJvbSBhIGdyb3VwIHlvdSBkb24ndCBoYXZlIGFjY2VzcyB0b1wiKTtcblxuXHRcdGNvbnN0IGdyb3VwcyA9IGV2ZW50QnVzLnJlcXVlc3QoZXZlbnRCdXMuRXZlbnRzLkdldEN1cnJlbnRHcm91cHMpO1xuXG5cdFx0aWYgKGdyb3Vwcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRpZiAoIXRoaXMuUmVqdXZlbmF0ZURpYWxvZykge1xuXHRcdFx0XHQvLyBBc2sgdGhlIHVzZXIgaWYgdGhlIGF0dGFjaG1lbnQgc2hvdWxkIGJlIHJlanV2ZW5hdGVkXG5cdFx0XHRcdHRoaXMuUmVqdXZlbmF0ZURpYWxvZyA9IG5ldyBTbWFsbE1vZGFsKHtcblx0XHRcdFx0XHRwZXJzaXN0OiBmYWxzZSxcblx0XHRcdFx0XHR0aXRsZTogYDxzcGFuIGNsYXNzPSdmYWwgZmEtY2xvbmUnLz4gQ2xvbmUgJHsoYXR0YWNobWVudE1vZGVsLmlzT2xkKCkgPyBcIk9sZFwiIDogXCJGb3JlaWduXCIpfSBBdHRhY2htZW50OlxuXHRcdFx0XHRcdFx0JHthdHRhY2htZW50TW9kZWwuZ2V0KFwidGl0bGVcIikucmVwbGFjZSgvW1xcJlxcPFxcPlxcJ1xcXCJdL2csIHggPT4gXCImI1wiICsgeC5jaGFyQ29kZUF0KDApICsgXCI7XCIpfWAsXG5cdFx0XHRcdFx0Ym9keTogYDxwPlRoaXMgYXR0YWNobWVudCBpcyAke3N0YXRlcy5qb2luKFwiIGFuZCBcIil9OyBpbiBvcmRlciB0byB1c2UgaXQsIHlvdSBtdXN0IGNsb25lIGl0IGludG8gdGhlIGN1cnJlbnQgeWVhciBhbmQgZ3JvdXAuPC9wPlxuXHRcdFx0XHRcdFx0PHA+RG8geW91IHdpc2ggdG8gY2xvbmUgdGhpcyBhdHRhY2htZW50PzwvcD48cD48aT5DbG9uaW5nIHdpbGwgbm90IGFmZmVjdCB0aGUgb3JpZ2luYWwgYXR0YWNobWVudCBpbiBhbnkgd2F5LjwvaT48L3A+YCxcblx0XHRcdFx0XHRob3N0OiBcIiNsaW5rLXJlc291cmNlc1wiLFxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR0aGlzLlJlanV2ZW5hdGVEaWFsb2cub24oXCJidXR0b246b2tcIiwgdGhpcy5yZWp1dmVuYXRlQXR0YWNobWVudC5iaW5kKHRoaXMsIGF0dGFjaG1lbnRNb2RlbCkpO1xuXG5cdFx0XHRcdHRoaXMuUmVqdXZlbmF0ZURpYWxvZy5zaG93KCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5TYXZlRXJyb3JEaWFsb2cgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHRcdHBlcnNpc3Q6IGZhbHNlLFxuXHRcdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmFsIGZhLXRpbWVzLWNpcmNsZScvPiBFcnJvclwiLFxuXHRcdFx0XHRib2R5OiBcIjxwPlRoZSBib29rIGN1cnJlbnRseSBoYXMgbm8gbmV3L2N1cnJlbnQgZ3JvdXBzLiBQbGVhc2UgYXNzaWduIGEgbmV3IGdsb2JhbCBncm91cCBiZWZvcmUgY2xvbmluZyB0aGUgcmVzb3VyY2UuPC9wPlwiLFxuXHRcdFx0XHRob3N0OiBcIiNsaW5rLXJlc291cmNlc1wiLFxuXHRcdFx0XHRoaWRlQnV0dG9uczogW1wiY2FuY2VsXCJdLFxuXHRcdFx0XHR3YXJuaW5nOiB0cnVlLFxuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMuU2F2ZUVycm9yRGlhbG9nLnNob3coKTtcblx0XHR9XG5cdH0sXG5cblx0cXVlcnlSZWp1dmVuYXRlQXR0YWNobWVudHM6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGdyb3VwcyA9IGV2ZW50QnVzLnJlcXVlc3QoZXZlbnRCdXMuRXZlbnRzLkdldEN1cnJlbnRHcm91cHMpO1xuXG5cdFx0aWYgKGdyb3Vwcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRpZiAoIXRoaXMuUmVqdXZlbmF0ZURpYWxvZykge1xuXHRcdFx0XHQvLyBBc2sgdGhlIHVzZXIgaWYgdGhlIGF0dGFjaG1lbnRzIHNob3VsZCBiZSByZWp1dmVuYXRlZFxuXHRcdFx0XHR0aGlzLlJlanV2ZW5hdGVEaWFsb2cgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHRcdFx0cGVyc2lzdDogZmFsc2UsXG5cdFx0XHRcdFx0dGl0bGU6IFwiPHNwYW4gY2xhc3M9J2ZhbCBmYS1jbG9uZScvPiBDbG9uZSBhbGwgb2xkIGFuZCBmb3JlaWduIGF0dGFjaG1lbnRzXCIsXG5cdFx0XHRcdFx0Ym9keTogYDxwPlRoZXJlIGFyZSBhdHRhY2htZW50cyBmcm9tIHByZXZpb3VzIHllYXJzIGFuZCBkaWZmZXJlbnQgZ3JvdXBzLiBJbiBvcmRlciB0byB1c2UgdGhlbSwgeW91IG11c3QgY2xvbmUgdGhlbSBpbnRvIHRoZSBjdXJyZW50IHllYXIgYW5kIGdyb3VwLjwvcD5cblx0XHRcdFx0XHRcdDxwPkRvIHlvdSB3aXNoIHRvIGNsb25lIGFsbCBhdHRhY2htZW50cz88L3A+PHA+PGk+Q2xvbmluZyB3aWxsIG5vdCBhZmZlY3QgdGhlIG9yaWdpbmFsIGF0dGFjaG1lbnRzIGluIGFueSB3YXkuPC9pPjwvcD5gLFxuXHRcdFx0XHRcdGhvc3Q6IFwiI2xpbmstcmVzb3VyY2VzXCIsXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHRoaXMuUmVqdXZlbmF0ZURpYWxvZy5vbihcImJ1dHRvbjpva1wiLCB0aGlzLnJlanV2ZW5hdGVBdHRhY2htZW50cy5iaW5kKHRoaXMpKTtcblxuXHRcdFx0XHR0aGlzLlJlanV2ZW5hdGVEaWFsb2cuc2hvdygpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMuU2F2ZUVycm9yRGlhbG9nID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0XHRwZXJzaXN0OiBmYWxzZSxcblx0XHRcdFx0dGl0bGU6IFwiPHNwYW4gY2xhc3M9J2ZhbCBmYS10aW1lcy1jaXJjbGUnLz4gRXJyb3JcIixcblx0XHRcdFx0Ym9keTogXCI8cD5UaGUgYm9vayBjdXJyZW50bHkgaGFzIG5vIG5ldy9jdXJyZW50IGdyb3Vwcy4gUGxlYXNlIGFzc2lnbiBhIG5ldyBnbG9iYWwgZ3JvdXAgYmVmb3JlIGNsb25pbmcgdGhlIHJlc291cmNlcy48L3A+XCIsXG5cdFx0XHRcdGhvc3Q6IFwiI2xpbmstcmVzb3VyY2VzXCIsXG5cdFx0XHRcdGhpZGVCdXR0b25zOiBbXCJjYW5jZWxcIl0sXG5cdFx0XHRcdHdhcm5pbmc6IHRydWUsXG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5TYXZlRXJyb3JEaWFsb2cuc2hvdygpO1xuXHRcdH1cblx0fSxcblxuXHRyZWp1dmVuYXRlQXR0YWNobWVudDogYXN5bmMgZnVuY3Rpb24oYXR0YWNobWVudE1vZGVsLCByZWxvYWRBdHRhY2htZW50cykge1xuXHRcdGlmICh0aGlzLlJlanV2ZW5hdGVEaWFsb2cpIHtcblx0XHRcdHRoaXMuUmVqdXZlbmF0ZURpYWxvZy5kZXN0cm95KCk7XG5cdFx0XHR0aGlzLlJlanV2ZW5hdGVEaWFsb2cgPSBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBDcmVhdGUgYSBuZXcgYXR0YWNobWVudCBtb2RlbCB0aGF0IGR1cGxpY2F0ZXMgdGhlIHNhbGllbnQgYXR0cmlidXRlcyBvZiB0aGUgb2xkIGF0dGFjaG1lbnQgbW9kZWxcblx0XHQvLyBhbmQgaW5kaWNhdGVzIHRoYXQgaXQgaXMgYSByZWp1dmVuYXRpb24gb2YgdGhlIG9sZGVyIG1vZGVsXG5cdFx0Y29uc3QgbmV3TW9kZWwgPSB0aGlzLkF0dGFjaG1lbnRzLmFkZCh7XG5cdFx0XHRyZWp1dmVuYXRpbmc6IHRydWUsXG5cdFx0XHRib29rOiBhdHRhY2htZW50TW9kZWwuZ2V0KFwiYm9va1wiKSxcblx0XHRcdGdyb3VwczogZXZlbnRCdXMucmVxdWVzdChldmVudEJ1cy5FdmVudHMuR2V0Q3VycmVudEdyb3VwcyksXG5cdFx0XHRyZXNvdXJjZTogYXR0YWNobWVudE1vZGVsLmdldChcInJlc291cmNlXCIpLFxuXHRcdFx0cmVzb3VyY2VUeXBlOiBhdHRhY2htZW50TW9kZWwuZ2V0KFwicmVzb3VyY2VUeXBlXCIpLFxuXHRcdFx0c2VjdGlvbjogYXR0YWNobWVudE1vZGVsLmdldChcInNlY3Rpb25cIiksXG5cdFx0XHRzZWxlY3RvcjogYXR0YWNobWVudE1vZGVsLmdldChcInNlbGVjdG9yXCIpLFxuXHRcdFx0cmVqdXZlbmF0ZXM6IGF0dGFjaG1lbnRNb2RlbC5nZXQoXCJfaWRcIiksXG5cdFx0XHRzZXR0aW5nczogYXR0YWNobWVudE1vZGVsLmdldChcInNldHRpbmdzXCIpLFxuXHRcdFx0cGFnZU51bWJlcjogYXR0YWNobWVudE1vZGVsLmdldChcInBhZ2VOdW1iZXJcIiksXG5cdFx0fSk7XG5cblx0XHQvLyBTYXZlIHRoZSBhdHRhY2htZW50XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdHRoaXMuc2F2ZUF0dGFjaG1lbnQobmV3TW9kZWwsIGZhbHNlLCByZWxvYWRBdHRhY2htZW50cylcblx0XHRcdFx0LmRvbmUoKCkgPT4ge1xuXHRcdFx0XHRcdG5ld01vZGVsLnVuc2V0KFwicmVqdXZlbmF0aW5nXCIpO1xuXG5cdFx0XHRcdFx0aWYgKHRoaXMuY29udGFpbnNPbGRBdHRhY2htZW50cygpKVxuXHRcdFx0XHRcdFx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5FdmVudHMuT2xkQXR0YWNobWVudHNFeGlzdHMpO1xuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLk5vT2xkQXR0YWNobWVudHMpO1xuXG5cdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuZmFpbChyZWplY3QpO1xuXHRcdH0pO1xuXHR9LFxuXG5cdHJlanV2ZW5hdGVBdHRhY2htZW50czogYXN5bmMgZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuUmVqdXZlbmF0ZURpYWxvZykge1xuXHRcdFx0dGhpcy5SZWp1dmVuYXRlRGlhbG9nLmRlc3Ryb3koKTtcblx0XHRcdHRoaXMuUmVqdXZlbmF0ZURpYWxvZyA9IGZhbHNlO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlbG9hZEF0dGFjaG1lbnRzID0gdHJ1ZTtcblx0XHRhd2FpdCBQcm9taXNlLmVhY2godGhpcy5BdHRhY2htZW50cy5tb2RlbHMsIGF0dGFjaG1lbnQgPT4ge1xuXHRcdFx0aWYgKGF0dGFjaG1lbnQuaXNPbGQoKSAmJiAhdGhpcy5yZWp1dmVuYXRvckV4aXN0c0ZvcihhdHRhY2htZW50KSlcblx0XHRcdFx0cmV0dXJuIHRoaXMucmVqdXZlbmF0ZUF0dGFjaG1lbnQoYXR0YWNobWVudCwgcmVsb2FkQXR0YWNobWVudHMpO1xuXHRcdH0pO1xuXHR9LFxuXG5cdGluaXRpYWxpemVGaW5kZXJTdGF0dXM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY2xlYXJBdHRhY2htZW50Rm9jdXMoKTtcblxuXHRcdHRoaXMuRmluZGVyU3RhdHVzID0ge1xuXHRcdFx0cmVzb3VyY2U6IG51bGwsXG5cdFx0XHRhdHRhY2htZW50czogbnVsbCxcblx0XHRcdGN1cnJlbnRJbmRleDogbnVsbCxcblx0XHR9O1xuXHR9LFxuXG5cdHJlc2V0RmluZGVyU3RhdHVzOiBmdW5jdGlvbihyZXNvdXJjZUlkZW50aWZpZXIsIHJldmVyc2UpIHtcblx0XHR0aGlzLmNsZWFyQXR0YWNobWVudEZvY3VzKCk7XG5cblx0XHRpZiAodGhpcy5GaW5kZXJTdGF0dXMucmVzb3VyY2UgIT09IHJlc291cmNlSWRlbnRpZmllcikge1xuXHRcdFx0Y29uc3QgYXR0YWNobWVudHMgPSB0aGlzLmdldEF0dGFjaG1lbnRzRm9yUmVzb3VyY2UocmVzb3VyY2VJZGVudGlmaWVyKTtcblxuXHRcdFx0dGhpcy5GaW5kZXJTdGF0dXMgPSB7XG5cdFx0XHRcdHJlc291cmNlOiByZXNvdXJjZUlkZW50aWZpZXIsXG5cdFx0XHRcdGF0dGFjaG1lbnRzOiBhdHRhY2htZW50cyxcblx0XHRcdFx0Y3VycmVudEluZGV4OiByZXZlcnNlID8gKGF0dGFjaG1lbnRzLmxlbmd0aCAtIDEpIDogMCxcblx0XHRcdH07XG5cdFx0fVxuXHR9LFxuXG5cdGNsZWFyQXR0YWNobWVudEZvY3VzOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5GaW5kZXJTdGF0dXMgJiYgdGhpcy5GaW5kZXJTdGF0dXMuY3VycmVudEluZGV4ICE9PSBudWxsICYmIHRoaXMuRmluZGVyU3RhdHVzLmF0dGFjaG1lbnRzW3RoaXMuRmluZGVyU3RhdHVzLmN1cnJlbnRJbmRleF0pIHtcblx0XHRcdHRoaXMuRmluZGVyU3RhdHVzLmF0dGFjaG1lbnRzW3RoaXMuRmluZGVyU3RhdHVzLmN1cnJlbnRJbmRleF0uZm9jdXNlZCA9IGZhbHNlO1xuXHRcdFx0dGhpcy5GaW5kZXJTdGF0dXMuYXR0YWNobWVudHNbdGhpcy5GaW5kZXJTdGF0dXMuY3VycmVudEluZGV4XS50cmlnZ2VyKFwiZm9jdXNcIik7XG5cdFx0fVxuXHR9LFxuXG5cdGdldEF0dGFjaG1lbnRzRm9yUmVzb3VyY2U6IGZ1bmN0aW9uKHJlc291cmNlSWRlbnRpZmllcikge1xuXHRcdHJldHVybiB0aGlzLkF0dGFjaG1lbnRzLndoZXJlKHsgcmVzb3VyY2U6IHJlc291cmNlSWRlbnRpZmllciB9KTtcblx0fSxcblxuXHRmaW5kRmlyc3RBdHRhY2htZW50OiBmdW5jdGlvbihyZXNvdXJjZUlkZW50aWZpZXIpIHtcblx0XHR0aGlzLmluaXRpYWxpemVGaW5kZXJTdGF0dXMoKTtcblx0XHR0aGlzLmZpbmROZXh0QXR0YWNobWVudChyZXNvdXJjZUlkZW50aWZpZXIpO1xuXHR9LFxuXG5cdGZpbmROZXh0QXR0YWNobWVudDogZnVuY3Rpb24ocmVzb3VyY2VJZGVudGlmaWVyKSB7XG5cdFx0dGhpcy5yZXNldEZpbmRlclN0YXR1cyhyZXNvdXJjZUlkZW50aWZpZXIsIHRydWUpO1xuXG5cdFx0dGhpcy5GaW5kZXJTdGF0dXMuY3VycmVudEluZGV4ID0gKHRoaXMuRmluZGVyU3RhdHVzLmN1cnJlbnRJbmRleCArIDEpICUgdGhpcy5GaW5kZXJTdGF0dXMuYXR0YWNobWVudHMubGVuZ3RoO1xuXHRcdGlmICghdGhpcy5GaW5kZXJTdGF0dXMuYXR0YWNobWVudHNbdGhpcy5GaW5kZXJTdGF0dXMuY3VycmVudEluZGV4XSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuRmluZGVyU3RhdHVzLmF0dGFjaG1lbnRzW3RoaXMuRmluZGVyU3RhdHVzLmN1cnJlbnRJbmRleF0uZm9jdXNlZCA9IHRydWU7XG5cblx0XHR0aGlzLmp1bXBUb0F0dGFjaG1lbnQodGhpcy5GaW5kZXJTdGF0dXMuYXR0YWNobWVudHNbdGhpcy5GaW5kZXJTdGF0dXMuY3VycmVudEluZGV4XSk7XG5cdH0sXG5cblx0ZmluZFByZXZpb3VzQXR0YWNobWVudDogZnVuY3Rpb24ocmVzb3VyY2VJZGVudGlmaWVyKSB7XG5cdFx0dGhpcy5yZXNldEZpbmRlclN0YXR1cyhyZXNvdXJjZUlkZW50aWZpZXIsIGZhbHNlKTtcblxuXHRcdGlmICh0aGlzLkZpbmRlclN0YXR1cy5hdHRhY2htZW50cy5sZW5ndGggPT09IDApXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLkZpbmRlclN0YXR1cy5jdXJyZW50SW5kZXggPSBNYXRoLm1heCgwLCAodGhpcy5GaW5kZXJTdGF0dXMuY3VycmVudEluZGV4ICsgKHRoaXMuRmluZGVyU3RhdHVzLmF0dGFjaG1lbnRzLmxlbmd0aCAtIDEpKSAlIHRoaXMuRmluZGVyU3RhdHVzLmF0dGFjaG1lbnRzLmxlbmd0aCk7XG5cdFx0aWYgKHRoaXMuRmluZGVyU3RhdHVzLmN1cnJlbnRJbmRleCA+PSB0aGlzLkZpbmRlclN0YXR1cy5hdHRhY2htZW50cy5sZW5ndGgpXG5cdFx0XHR0aGlzLkZpbmRlclN0YXR1cy5jdXJyZW50SW5kZXggPSAwO1xuXHRcdHRoaXMuRmluZGVyU3RhdHVzLmF0dGFjaG1lbnRzW3RoaXMuRmluZGVyU3RhdHVzLmN1cnJlbnRJbmRleF0uZm9jdXNlZCA9IHRydWU7XG5cblx0XHR0aGlzLmp1bXBUb0F0dGFjaG1lbnQodGhpcy5GaW5kZXJTdGF0dXMuYXR0YWNobWVudHNbdGhpcy5GaW5kZXJTdGF0dXMuY3VycmVudEluZGV4XSk7XG5cdH0sXG5cblx0cmVjb3JkQ3VycmVudFRvb2x0aXA6IGZ1bmN0aW9uKGF0dGFjaG1lbnRWaWV3KSB7XG5cdFx0dGhpcy5DdXJyZW50VG9vbHRpcCA9IGF0dGFjaG1lbnRWaWV3O1xuXHR9LFxuXG5cdHNob3dTcGlubmVyOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIXRoaXMudWkuc3Bpbm5lci5yZW1vdmVDbGFzcylcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMudWkuc3Bpbm5lci5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5vdmVybGF5LmFkZENsYXNzKFwiYmxvY2tpbmdcIik7XG5cblx0XHQvLyBJZiBpdCB0YWtlcyB0aGF0IGxvbmcsIGl0J2xsIHByb2JhYmx5IHRha2UgbG9uZ2VyXG5cdFx0dGhpcy5oaW50VGltZXIgPSBzZXRUaW1lb3V0KHRoaXMuc2hvd0hpbnQuYmluZCh0aGlzKSwgMTUwMCk7XG5cdH0sXG5cblx0aGlkZVNwaW5uZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGNsZWFyVGltZW91dCh0aGlzLmhpbnRUaW1lcik7XG5cblx0XHR0aGlzLnVpLnNwaW5uZXIuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkub3ZlcmxheS5yZW1vdmVDbGFzcyhcImJsb2NraW5nXCIpO1xuXHR9LFxuXG5cdHNob3dIaW50OiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy51aS5oaW50ICYmIHRoaXMudWkuaGludC5yZW1vdmVDbGFzcylcblx0XHRcdHRoaXMudWkuaGludC5yZW1vdmVDbGFzcyhcImludmlzaWJsZVwiKTtcblx0fSxcblxuXHRzYXZlQXR0YWNobWVudDogZnVuY3Rpb24oYXR0YWNobWVudE1vZGVsLCBkb250Q3JlYXRlVmlldywgcmVsb2FkQXR0YWNobWVudHMpIHtcblx0XHQvLyBBZGQgdGhlIG1vZGVsIHRvIHRoZSBhdHRhY2htZW50IG1vZGVsIGNvbGxlY3Rpb25cblx0XHR0aGlzLkF0dGFjaG1lbnRzLmFkZChhdHRhY2htZW50TW9kZWwpO1xuXG5cdFx0aWYgKCFkb250Q3JlYXRlVmlldykge1xuXHRcdFx0Ly8gQ3JlYXRlIGEgbmV3IHZpZXcgZm9yIHRoaXMgYXR0YWNobWVudFxuXHRcdFx0dGhpcy5jcmVhdGVBdHRhY2htZW50VmlldyhhdHRhY2htZW50TW9kZWwpO1xuXHRcdH1cblxuXHRcdGF0dGFjaG1lbnRzU2F2aW5nKys7XG5cdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLk5hdmlnYXRpb25Qcm9tcHQsIFwiU29tZSBhdHRhY2htZW50cyBhcmUgc3RpbGwgc2F2aW5nLiBJZiB5b3UgbGVhdmUsIHRoZXkgd2lsbCBiZSBsb3N0LiBBcmUgeW91IHN1cmU/XCIpO1xuXG5cdFx0cmV0dXJuIGF0dGFjaG1lbnRNb2RlbC5zYXZlKG51bGwsIHtcblx0XHRcdHN1Y2Nlc3M6ICgpID0+IHtcblx0XHRcdFx0Ly8gVXBkYXRlIHRoZSBhdHRhY2htZW50IG1vZGVsJ3MgaWRlbnRpZmllciwgYXMgY3JlYXRlZCBieSB0aGUgc2VydmVyXG5cdFx0XHRcdGF0dGFjaG1lbnRzU2F2aW5nLS07XG5cdFx0XHRcdGF0dGFjaG1lbnRNb2RlbC5zZXQoXCJzYXZlZFwiLCB0cnVlKTtcblx0XHRcdFx0dGhpcy5jdXJyZW50bHlTYXZpbmcgPSBmYWxzZTtcblxuXHRcdFx0XHRpZiAoZG9udENyZWF0ZVZpZXcpIHtcblx0XHRcdFx0XHRhdHRhY2htZW50TW9kZWwudHJpZ2dlcihcInNhdmU6c3VjY2Vzc1wiKTtcblx0XHRcdFx0XHR0aGlzLnNhdmVGaWxlcygpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGF0dGFjaG1lbnRzU2F2aW5nID09PSAwKSB7XG5cdFx0XHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLk5hdmlnYXRpb25Qcm9tcHQsIG51bGwpO1xuXHRcdFx0XHRcdGlmIChyZWxvYWRBdHRhY2htZW50cylcblx0XHRcdFx0XHRcdHRoaXMucmVuZGVyKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdGVycm9yOiAobW9kZWwsIHJlc3BvbnNlKSA9PiB7XG5cdFx0XHRcdHRoaXMuY3VycmVudGx5U2F2aW5nID0gZmFsc2U7XG5cdFx0XHRcdGNvbnN0IGVycm9yID0gYDxwIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkOyBwYWRkaW5nLWJvdHRvbTogMXJlbTtcIj4ke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlKS5yZXBsYWNlKC9bXFwmXFw8XFw+XFwnXFxcIl0vZywgeCA9PiBcIiYjXCIgKyB4LmNoYXJDb2RlQXQoMCkgKyBcIjtcIil9PC9wPmA7XG5cblx0XHRcdFx0aWYgKHRoaXMuU2F2ZUVycm9yRGlhbG9nKSB7XG5cdFx0XHRcdFx0dGhpcy5TYXZlRXJyb3JEaWFsb2cudWkuYm9keS5maW5kKFwiI2Vycm9yLWxpc3RcIikuYXBwZW5kKGVycm9yKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHR0aGlzLlNhdmVFcnJvckRpYWxvZyA9IG5ldyBTbWFsbE1vZGFsKHtcblx0XHRcdFx0XHRcdHBlcnNpc3Q6IGZhbHNlLFxuXHRcdFx0XHRcdFx0dGl0bGU6IFwiPHNwYW4gY2xhc3M9J2ZhbCBmYS10aW1lcy1jaXJjbGUnLz4gRXJyb3JcIixcblx0XHRcdFx0XHRcdGJvZHk6IGA8cD5BbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBzYXZpbmcgdGhlIGF0dGFjaG1lbnQuIFBsZWFzZSB0cnkgYWdhaW4uIERldGFpbHMgYWJvdXQgdGhlIGVycm9yIGZvbGxvdy48L3A+XG5cdFx0XHRcdFx0XHRcdDxkaXYgaWQ9XCJlcnJvci1saXN0XCI+YCArIGVycm9yICsgXCI8L2Rpdj5cIixcblx0XHRcdFx0XHRcdGhvc3Q6IFwiI2xpbmstcmVzb3VyY2VzXCIsXG5cdFx0XHRcdFx0XHRoaWRlQnV0dG9uczogW1wiY2FuY2VsXCJdLFxuXHRcdFx0XHRcdFx0d2FybmluZzogdHJ1ZSxcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdHRoaXMuU2F2ZUVycm9yRGlhbG9nLnNob3coKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGF0dGFjaG1lbnRzU2F2aW5nLS07XG5cdFx0XHRcdGlmIChhdHRhY2htZW50c1NhdmluZyA9PT0gMClcblx0XHRcdFx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuTmF2aWdhdGlvblByb21wdCwgbnVsbCk7XG5cblx0XHRcdFx0dGhpcy5yZW1vdmVBdHRhY2htZW50VmlldyhhdHRhY2htZW50TW9kZWwsIGF0dGFjaG1lbnRNb2RlbC5nZXQoXCJzZWxlY3RvclwiKSk7XG5cdFx0XHRcdHRoaXMuQXR0YWNobWVudHMucmVtb3ZlKGF0dGFjaG1lbnRNb2RlbCk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9LFxuXG5cdGZldGNoQXR0YWNobWVudHM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuYXR0YWNobWVudHNGZXRjaGVkID0gZmFsc2U7XG5cdFx0dGhpcy5BdHRhY2htZW50cy5mZXRjaCh7XG5cdFx0XHRzdWNjZXNzOiB0aGlzLmZldGNoQXR0YWNobWVudHNTdWNjZXNzLmJpbmQodGhpcyksXG5cdFx0XHRlcnJvcjogdGhpcy5mZXRjaEF0dGFjaG1lbnRzRXJyb3IuYmluZCh0aGlzKSxcblx0XHR9KTtcblx0fSxcblxuXHRmZXRjaEF0dGFjaG1lbnRzU3VjY2VzczogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5BdHRhY2htZW50cy5vbihcInJlbW92ZVwiLCB0aGlzLmRlc3Ryb3lBdHRhY2htZW50Vmlldy5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmF0dGFjaG1lbnRzRmV0Y2hlZCA9IHRydWU7XG5cdFx0aWYgKHRoaXMubG9hZGVkKVxuXHRcdFx0dGhpcy5wb3B1bGF0ZUF0dGFjaG1lbnRDb250YWluZXIoKTtcblxuXHRcdGlmICh0aGlzLmNvbnRhaW5zT2xkQXR0YWNobWVudHMoKSlcblx0XHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLk9sZEF0dGFjaG1lbnRzRXhpc3RzKTtcblx0fSxcblxuXHRjb250YWluc09sZEF0dGFjaG1lbnRzOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gXy5maW5kKHRoaXMuQXR0YWNobWVudHMubW9kZWxzLCBtb2RlbCA9PiBtb2RlbC5pc09sZCgpICYmICF0aGlzLnJlanV2ZW5hdG9yRXhpc3RzRm9yKG1vZGVsKSk7XG5cdH0sXG5cblx0ZmV0Y2hBdHRhY2htZW50c0Vycm9yOiBfLm5vb3AsXG5cblx0b25BdHRhY2htZW50QWRkZWQ6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0aWYgKCFtb2RlbC5pc09sZCgpKSB7XG5cdFx0XHQvLyBTaWduYWwgdGhlIHVzYWdlIG9mIHRoZSBhc3NvY2lhdGVkIHJlc291cmNlIGFzIGFuIGF0dGFjaG1lbnRcblx0XHRcdGV2ZW50QnVzLnRyaWdnZXIoXCJhdHRhY2htZW50QWRkZWQ6XCIgKyBtb2RlbC5nZXQoXCJyZXNvdXJjZVwiKSk7XG5cdFx0XHRyYWRpby50cmlnZ2VyKFwiYXR0YWNobWVudEFkZGVkOlwiICsgbW9kZWwuZ2V0KFwicmVzb3VyY2VcIikpO1xuXHRcdH1cblx0fSxcblxuXHRvbkF0dGFjaG1lbnREZXN0cm95ZWQ6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0aWYgKCFtb2RlbC5pc09sZCgpKSB7XG5cdFx0XHQvLyBJZiB0aGUgZGVzdHJveWVkIGF0dGFjaG1lbnQgcmVqdXZlbmF0ZXMgYW4gb2xkZXIgYXR0YWNobWVudC4uLlxuXHRcdFx0aWYgKG1vZGVsLmhhcyhcInJlanV2ZW5hdGVzXCIpKSB7XG5cdFx0XHRcdC8vIC4uLnRoZW4gcmVjcmVhdGUgdGhlIHZpZXcgZm9yIHRoZSBvbGRlciBhdHRhY2htZW50XG5cdFx0XHRcdGNvbnN0IG9sZEF0dGFjaG1lbnRNb2RlbCA9IHRoaXMuQXR0YWNobWVudHMuZ2V0KG1vZGVsLmdldChcInJlanV2ZW5hdGVzXCIpKTtcblxuXHRcdFx0XHRpZiAob2xkQXR0YWNobWVudE1vZGVsKVxuXHRcdFx0XHRcdHRoaXMuY3JlYXRlQXR0YWNobWVudFZpZXcob2xkQXR0YWNobWVudE1vZGVsKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2lnbmFsIHRoZSByZW1vdmFsIG9mIGFuIGF0dGFjaG1lbnQgZnJvbSB1c2Vcblx0XHRcdGV2ZW50QnVzLnRyaWdnZXIoXCJhdHRhY2htZW50UmVtb3ZlZDpcIiArIG1vZGVsLmdldChcInJlc291cmNlXCIpKTtcblx0XHRcdHJhZGlvLnRyaWdnZXIoXCJhdHRhY2htZW50UmVtb3ZlZDpcIiArIG1vZGVsLmdldChcInJlc291cmNlXCIpKTtcblx0XHR9XG5cdH0sXG5cblx0Y3JlYXRlQXR0YWNobWVudE1vZGVsOiBmdW5jdGlvbihyZXNvdXJjZURhdGEsIHMsIG9wdHMsIGRvbnRTYXZlKSB7XG5cdFx0Y29uc3QgZ3JvdXBzID0gZXZlbnRCdXMucmVxdWVzdChldmVudEJ1cy5FdmVudHMuR2V0Q3VycmVudEdyb3Vwcyk7XG5cblx0XHRjb25zdCBkYXRhID0ge1xuXHRcdFx0Ym9vazogb3B0cy5ib29rLmdldChcIm1ldGFkYXRhXCIpLmJvb2tJRCxcblx0XHRcdGdyb3VwczogZ3JvdXBzLFxuXHRcdFx0cmVzb3VyY2U6IHJlc291cmNlRGF0YS5faWQsXG5cdFx0XHRyZXNvdXJjZVR5cGU6IHJlc291cmNlRGF0YS5jYXRlZ29yeSxcblx0XHRcdHNlY3Rpb246IHRoaXMuZ2V0Q3VycmVudFNlY3Rpb24oKSxcblx0XHRcdHNlbGVjdG9yOiBvcHRzLnNlbGVjdG9yLFxuXHRcdFx0dmlzaWJsZTogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0aWYgKHMpIHtcblx0XHRcdGRhdGEuc2V0dGluZ3MgPSB7XG5cdFx0XHRcdHNlcnZlclNhdmU6IHMuc2F2ZSxcblx0XHRcdFx0dGl0bGU6IHMuaW5zdGFuY2VOYW1lLFxuXHRcdFx0XHRyZXF1aXJlQ29kZTogcy5yZXF1aXJlQ29kZSxcblx0XHRcdFx0Y29kZTogcy5yZXF1aXJlQ29kZSA/IHMuY29kZSA6IHVuZGVmaW5lZCxcblx0XHRcdFx0ZGlzYWJsZVJhbmRvbWl6YXRpb246IHMuZGlzYWJsZVJhbmRvbWl6YXRpb24sXG5cdFx0XHRcdGhpZGVDb21wbGV0ZUJ1dHRvbnM6IHMuaGlkZUNvbXBsZXRlQnV0dG9ucyxcblx0XHRcdFx0ZGlzYWJsZVJlc3VsdDogcy5kaXNhYmxlUmVzdWx0LFxuXHRcdFx0fTtcblxuXHRcdFx0aWYgKHMuYWN0aXZhdGlvblR5cGUgPT09IFwic3BlY2lmaWNcIikge1xuXHRcdFx0XHRjb25zdCBhY3RpdmF0aW9uVGltZSA9IG1vbWVudChzLnN0YXJ0RGF0ZSwgXCJERCBNTU0gWVlZWVwiKS5ob3VyKDApLm1pbnV0ZSgwKS5zZWNvbmQoMCk7XG5cdFx0XHRcdGNvbnN0IHRpbWUgPSBtb21lbnQocy5zdGFydFRpbWUsIFwiaDptbWFcIik7XG5cdFx0XHRcdGFjdGl2YXRpb25UaW1lLmhvdXIodGltZS5ob3VyKCkpLm1pbnV0ZSh0aW1lLm1pbnV0ZSgpKS5zZWNvbmQoMCk7XG5cblx0XHRcdFx0ZGF0YS5hY3RpdmF0aW9uVGltZSA9IGFjdGl2YXRpb25UaW1lLnVuaXgoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBhdHRhY2htZW50TW9kZWwgPSB0aGlzLkF0dGFjaG1lbnRzLmFkZChkYXRhKTtcblx0XHQvL3NldCB0aGUgbWlzc2luZyByZXNvdXJjZSBmaWVsZHNcblx0XHRhdHRhY2htZW50TW9kZWwuc2V0KFwidGl0bGVcIiwgcmVzb3VyY2VEYXRhLnRpdGxlKTtcblx0XHRhdHRhY2htZW50TW9kZWwuc2V0KFwic3ViamVjdF9uYW1lXCIsIHJlc291cmNlRGF0YS5zdWJqZWN0X25hbWUpO1xuXHRcdGF0dGFjaG1lbnRNb2RlbC5zZXQoXCJncmFkZVwiLCByZXNvdXJjZURhdGEuY29udGVudEdyYWRlIHx8IHJlc291cmNlRGF0YS5ncmFkZSk7XG5cdFx0YXR0YWNobWVudE1vZGVsLnNldChcImxhbmd1YWdlXCIsIHJlc291cmNlRGF0YS5sYW5ndWFnZSk7XG5cdFx0YXR0YWNobWVudE1vZGVsLnNldChcImNhdGVnb3J5XCIsIHJlc291cmNlRGF0YS5jYXRlZ29yeSk7XG5cdFx0YXR0YWNobWVudE1vZGVsLnNldChcImJhc2VDb2RlXCIsIHJlc291cmNlRGF0YS5iYXNlQ29kZSk7XG5cblx0XHRpZiAoIWRvbnRTYXZlKSB7XG5cdFx0XHQvLyBTYXZlIHRoZSBhdHRhY2htZW50XG5cdFx0XHR0aGlzLnNhdmVBdHRhY2htZW50KGF0dGFjaG1lbnRNb2RlbCk7XG5cdFx0fVxuXHRcdHJldHVybiBhdHRhY2htZW50TW9kZWw7XG5cdH0sXG5cblx0Z2V0U2VsZWN0b3I6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0bGV0IHNlbGVjdG9yID0gXCJcIjtcblx0XHRpZiAodGhpcy5mb3JtYXQgPT09IFwibXB1YlwiKSB7XG5cdFx0XHQvLyBPYnRhaW4gdGhlIGJvb2sgZWxlbWVudCB1bmRlcm5lYXRoIHRoZSBjdXJzb3Jcblx0XHRcdGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldEJvb2tFbGVtZW50QXQoZXZlbnQub3JpZ2luYWxFdmVudC5jbGllbnRYLCBldmVudC5vcmlnaW5hbEV2ZW50LmNsaWVudFkgLSAodGhpcy5mdWxsc2NyZWVuZWQgPyAtNDUgOiAwKSArIHRoaXMudWkuYm9vay5nZXQoMCkuc2Nyb2xsVG9wICsgd2luZG93LnBhZ2VZT2Zmc2V0KTtcblxuXHRcdFx0Ly8gQnVpbGQgdGhlIERPTSBzZWxlY3RvciBmb3IgdGhpcyBlbGVtZW50XG5cdFx0XHRzZWxlY3RvciA9IHRoaXMuYnVpbGRET01TZWxlY3RvcihlbGVtZW50KTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHQvLyBQYWdlIG9mZnNldCBhcyBhIHBlcmNlbnRhZ2Vcblx0XHRcdHNlbGVjdG9yID0gKGV2ZW50Lm9yaWdpbmFsRXZlbnQuY2xpZW50WSAtICh0aGlzLmZ1bGxzY3JlZW5lZCA/IDQ1IDogdGhpcy5PdmVybGF5QmFzZS50b3ApICsgdGhpcy51aS5ib29rLmdldCgwKS5zY3JvbGxUb3AgLSAxNiArIHdpbmRvdy5wYWdlWU9mZnNldCkgLyB0aGlzLmNvbnRlbnRIZWlnaHQgKiAxMDA7XG5cdFx0XHRpZiAoIV8uaXNGaW5pdGUocGFyc2VGbG9hdChzZWxlY3RvcikpKVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHRzZWxlY3RvciA9IHBhcnNlRmxvYXQoc2VsZWN0b3IpLnRvRml4ZWQoMik7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNlbGVjdG9yO1xuXHR9LFxuXG5cdGZpbmFsaXplRHJvcDogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRpZiAoIXRoaXMudWkuaGlnaGxpZ2h0QmFyIHx8ICF0aGlzLnVpLmhpZ2hsaWdodEJhci5hZGRDbGFzcylcblx0XHRcdHJldHVybjtcblxuXHRcdC8vIFJlbW92ZSB0aGUgaGlnaGxpZ2h0IGZyb20gdGhlIGVsZW1lbnQgdXBvbiB3aGljaCB0aGUgZHJvcCBjb21wbGV0ZWRcblx0XHRpZiAodGhpcy5mb3JtYXQgPT09IFwibXB1YlwiKVxuXHRcdFx0dGhpcy5yZXN0b3JlUHJldmlvdXNFbGVtZW50Qm9yZGVyKCk7XG5cblx0XHQvLyBQb3RlbnRpYWxseSBoaWRlIHRoZSBoaWdobGlnaHQgYmFyIGZvciBQREZzXG5cdFx0dGhpcy51aS5oaWdobGlnaHRCYXIuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0Ly8gQWNjZXB0IHRoZSBkcm9wXG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0fSxcblxuXHRvbkRyb3A6IGZ1bmN0aW9uKGV2ZW50LCBkcm9wRGF0YSkge1xuXHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLkF0dGFjaG1lbnREcmFnRW5kKTtcblxuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRjb25zdCBib29rID0gZXZlbnRCdXMucmVxdWVzdChldmVudEJ1cy5FdmVudHMuR2V0Q3VycmVudEJvb2spO1xuXG5cdFx0Y29uc3Qgc2VsZWN0b3IgPSB0aGlzLmdldFNlbGVjdG9yKGV2ZW50KTtcblxuXHRcdC8vIElmIHRoZSB1c2VyIGRyYWdzIHRvbyBmYXN0IGFuZCBkcm9wcyBvdXRzaWRlIG9mIHRoZSBib29rLCB0aGUgcmVzdWx0aW5nIHNlbGVjdG9yIGNhbiBlbmQgdXAgaW52YWxpZFxuXHRcdGlmICghc2VsZWN0b3IpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRjb25zdCBkZXRlcm1pbmVEcm9wRWZmZWN0ID0gZGF0YSA9PiB7XG5cdFx0XHRsZXQgcmVzdWx0ID0gbnVsbDtcblxuXHRcdFx0c3dpdGNoIChkYXRhLnR5cGUpIHtcblx0XHRcdFx0Y2FzZSBcImF0dGFjaG1lbnRcIjpcblx0XHRcdFx0XHRyZXN1bHQgPSBcImxpbmtcIjtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwicmVzb3VyY2VcIjpcblx0XHRcdFx0XHRyZXN1bHQgPSBcImNvcHlcIjtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBkZXRlcm1pbmUgZHJvcCB0eXBlXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH07XG5cblx0XHRjb25zdCByZXN0ID0gKCkgPT4ge1xuXHRcdFx0Y29uc3QgZHJvcEVmZmVjdCA9IGRldGVybWluZURyb3BFZmZlY3QoZHJvcERhdGEpO1xuXG5cdFx0XHRpZiAoZHJvcEVmZmVjdCA9PT0gXCJjb3B5XCIpIHtcblx0XHRcdFx0aWYgKGRyb3BEYXRhICE9PSBudWxsICYmIGRyb3BEYXRhLnJlc291cmNlTW9kZWwuY2F0ZWdvcnkgPT09IFwiYXNzZXNzbWVudFwiKSB7XG5cdFx0XHRcdFx0Ly8gLi4udGhlbiBxdWVyeSB0aGUgdXNlciBmb3IgYWRkaXRpb25hbCBzZXR0aW5nc1xuXHRcdFx0XHRcdGNvbnN0IG1vZGFsID0gbmV3IEFzc2Vzc21lbnRQcm9tcHQoe1xuXHRcdFx0XHRcdFx0aW5saW5lTWVzc2FnZTogXCJcIixcblx0XHRcdFx0XHRcdGhvc3Q6IFwiI2xpbmstcmVzb3VyY2VzXCIsXG5cdFx0XHRcdFx0XHRyZXNvdXJjZTogbmV3IFJlc291cmNlKGRyb3BEYXRhLnJlc291cmNlTW9kZWwpLFxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0bW9kYWwub25jZShcImFjdGlvblwiLCAoYWN0aW9uLCBzZXR0aW5nc01vZGVsKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoYWN0aW9uID09PSBcIm9rXCIpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5jcmVhdGVBdHRhY2htZW50TW9kZWwoZHJvcERhdGEucmVzb3VyY2VNb2RlbCwgc2V0dGluZ3NNb2RlbCwgeyBib29rLCBzZWxlY3RvciB9KTtcblx0XHRcdFx0XHRcdFx0dGhpcy5maW5hbGl6ZURyb3AoZXZlbnQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuZmluYWxpemVEcm9wKGV2ZW50KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdG1vZGFsLnNob3coKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHR0aGlzLmNyZWF0ZUF0dGFjaG1lbnRNb2RlbChkcm9wRGF0YS5yZXNvdXJjZU1vZGVsLCBudWxsLCB7IGJvb2ssIHNlbGVjdG9yIH0pO1xuXHRcdFx0XHRcdHRoaXMuZmluYWxpemVEcm9wKGV2ZW50KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZiAoZHJvcEVmZmVjdCA9PT0gXCJsaW5rXCIpIHtcblx0XHRcdFx0Ly8gTW92ZSB0aGUgc3BlY2lmaWVkIGF0dGFjaG1lbnQgbW9kZWxzIHRvIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3Jcblx0XHRcdFx0dGhpcy5tb3ZlQXR0YWNobWVudChkcm9wRGF0YS5hdHRhY2htZW50SWRlbnRpZmllcnMsIHNlbGVjdG9yKTtcblx0XHRcdFx0dGhpcy5maW5hbGl6ZURyb3AoZXZlbnQpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBDaGVjayBpZiB0aGlzIHJlc291cmNlIGlzIGFscmVhZHkgYmVpbmcgdXNlZFxuXHRcdGlmIChkcm9wRGF0YS50eXBlICE9PSBcImF0dGFjaG1lbnRcIiAmJiBfLnNvbWUodGhpcy5BdHRhY2htZW50cy5tb2RlbHMsIHggPT4geC5nZXQoXCJyZXNvdXJjZVwiKSA9PT0gZHJvcERhdGEucmVzb3VyY2VNb2RlbC5faWQpKSB7XG5cdFx0XHRjb25zdCB1c2VXYXJuID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmFsIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJy8+IER1cGxpY2F0ZSBXYXJuaW5nXCIsXG5cdFx0XHRcdGJvZHk6IFwiWW91IGFyZSBhbHJlYWR5IHVzaW5nIHRoYXQgcmVzb3VyY2UgaW4gdGhpcyBib29rLiBEbyB5b3Ugd2FudCB0byBhZGQgaXQgYWdhaW4/XCIsXG5cdFx0XHRcdGhvc3Q6IFwiI2xpbmstcmVzb3VyY2VzXCIsXG5cdFx0XHR9KTtcblxuXHRcdFx0dXNlV2Fybi5vbihcImJ1dHRvbjpva1wiLCAoKSA9PiB7XG5cdFx0XHRcdHJlc3QoKTtcblx0XHRcdH0pO1xuXG5cdFx0XHR1c2VXYXJuLm9uKFwiYnV0dG9uOmNhbmNlbFwiLCAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuZmluYWxpemVEcm9wKGV2ZW50KTtcblx0XHRcdH0pO1xuXG5cdFx0XHR1c2VXYXJuLnNob3coKTtcblx0XHR9XG5cdFx0ZWxzZSB7IHJlc3QoKTsgfVxuXHR9LFxuXG5cdGRyYWdPdmVyOiBmdW5jdGlvbihmb3JtYXQsIGV2ZW50KSB7XG5cdFx0Ly8gT2J0YWluIHRoZSBib29rIGVsZW1lbnQgdW5kZXJuZWF0aCB0aGUgY3Vyc29yXG5cdFx0aWYgKGZvcm1hdCA9PT0gXCJtcHViXCIpIHtcblx0XHRcdGNvbnN0IGVsZW1lbnQgPSB0aGlzLmdldEJvb2tFbGVtZW50QXQoZXZlbnQub3JpZ2luYWxFdmVudC5jbGllbnRYLCBldmVudC5vcmlnaW5hbEV2ZW50LmNsaWVudFkgLSAodGhpcy5mdWxsc2NyZWVuZWQgPyAtNDUgOiAwKSArIHRoaXMudWkuYm9vay5nZXQoMCkuc2Nyb2xsVG9wICsgd2luZG93LnBhZ2VZT2Zmc2V0KTtcblxuXHRcdFx0Ly8gVXBkYXRlIHRoZSBoaWdobGlnaHQgYm9yZGVyIGZvciB0aGUgZWxlbWVudFxuXHRcdFx0dGhpcy5yZXN0b3JlUHJldmlvdXNFbGVtZW50Qm9yZGVyKCk7XG5cblx0XHRcdGNvbnN0IHBlcm1pc3NpYmxlVGFncyA9IFtcImFkZHJlc3NcIiwgXCJhcnRpY2xlXCIsIFwiYXNpZGVcIiwgXCJhdWRpb1wiLCBcImJsb2NrcXVvdGVcIiwgXCJjYW52YXNcIiwgXCJkZFwiLCBcImRpdlwiLCBcImRsXCIsIFwiZmllbGRzZXRcIiwgXCJmaWdjYXB0aW9uXCIsXG5cdFx0XHRcdFwiZmlndXJlXCIsIFwiZm9vdGVyXCIsIFwiZm9ybVwiLCBcImgxXCIsIFwiaDJcIiwgXCJoM1wiLCBcImg0XCIsIFwiaDVcIiwgXCJoNlwiLCBcImhlYWRlclwiLCBcImhncm91cFwiLCBcImhyXCIsIFwib2xcIiwgXCJvdXRwdXRcIiwgXCJwXCIsXG5cdFx0XHRcdFwicHJlXCIsIFwic2VjdGlvblwiLCBcInRhYmxlXCIsIFwidGRcIiwgXCJ0Zm9vdFwiLCBcInVsXCIsIFwidmlkZW9cIiwgXCJsaVwiXTtcblxuXHRcdFx0aWYgKGVsZW1lbnQgJiYgKF8uaW5jbHVkZXMocGVybWlzc2libGVUYWdzLCBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKSkge1xuXHRcdFx0XHR0aGlzLnJlY29yZEVsZW1lbnRCb3JkZXIoZWxlbWVudCk7XG5cdFx0XHRcdHRoaXMuc2V0RWxlbWVudEJvcmRlcihlbGVtZW50KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLnVpLmhpZ2hsaWdodEJhci5jc3MoeyB0b3A6IGV2ZW50Lm9yaWdpbmFsRXZlbnQuY2xpZW50WSAtICh0aGlzLmZ1bGxzY3JlZW5lZCA/IDQ1IDogdGhpcy5PdmVybGF5QmFzZS50b3ApIC0gMTYgKyB3aW5kb3cucGFnZVlPZmZzZXQgfSkucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdG9uTW91c2VFbnRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5kcm9wT3ZlcmxheS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0b25Nb3VzZUxlYXZlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmRyb3BPdmVybGF5LnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRvbkZpbGVEcmFnT3ZlcjogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdGlmICghdGhpcy51cGxvYWRBbGxvd2VkKVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0ZXZlbnQub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9IFwiY29weVwiO1xuXHRcdHRoaXMuZHJhZ092ZXIodGhpcy5mb3JtYXQsIGV2ZW50KTtcblx0fSxcblxuXHRvbkZpbGVEcmFnRW50ZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghdGhpcy51cGxvYWRBbGxvd2VkKVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0dGhpcy5kcmFnQ291bnQrKztcblx0XHR0aGlzLnVpLmNhbmNlbERyb3AucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdG9uRmlsZURyYWdMZWF2ZTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLnVwbG9hZEFsbG93ZWQpXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHR0aGlzLmRyYWdDb3VudC0tO1xuXHRcdGlmICh0aGlzLmRyYWdDb3VudCA9PT0gMClcblx0XHRcdHRoaXMudWkuY2FuY2VsRHJvcC5hZGRDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0b25GaWxlRHJvcDogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdGlmICghdGhpcy51cGxvYWRBbGxvd2VkKVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0Y29uc3QgYm9vayA9IGV2ZW50QnVzLnJlcXVlc3QoZXZlbnRCdXMuRXZlbnRzLkdldEN1cnJlbnRCb29rKTtcblx0XHQkKFwiLmhpZ2hsaWdodC1iYXJcIikuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkuY2FuY2VsRHJvcC5hZGRDbGFzcyhcImhpZGVcIik7XG5cblx0XHRpZiAoIXRoaXMuYnVsa0RyYWdEcm9wSGVscGVyKVxuXHRcdFx0dGhpcy5idWxrRHJhZ0Ryb3BIZWxwZXIgPSBuZXcgQnVsa0RyYWdEcm9wSGVscGVyKCk7XG5cblx0XHRjb25zdCBmaWxlcyA9IF8ubWFwKF8uZmlsdGVyKHRoaXMuYnVsa0RyYWdEcm9wSGVscGVyLmV4dHJhY3RGaWxlc0Zyb21FdmVudChldmVudCksIGYgPT4gZiAhPT0gbnVsbCksIGZpbGUgPT4ge1xuXHRcdFx0ZmlsZS5maWxlID0gZmlsZTtcblx0XHRcdGZpbGUuc3ViamVjdCA9IGJvb2suZ2V0KFwic3ViamVjdFwiKTtcblx0XHRcdGZpbGUuZ3JhZGUgPSBib29rLmdldChcImdyYWRlXCIpO1xuXHRcdFx0ZmlsZS5sYW5ndWFnZSA9IGJvb2suZ2V0KFwibGFuZ3VhZ2VcIik7XG5cdFx0XHRyZXR1cm4gbmV3IEJhY2tib25lLk1vZGVsKGZpbGUpO1xuXHRcdH0pO1xuXG5cdFx0aWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcblx0XHRcdGxldCBmaWxlTW9kZWwsIGVycm9yQ291bnQgPSAwO1xuXHRcdFx0Y29uc3Qgc2VsZWN0b3IgPSB0aGlzLmdldFNlbGVjdG9yKGV2ZW50KTtcblx0XHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0aW9uUHJvbXB0LCBcIlNvbWUgYXR0YWNobWVudHMgYXJlIHN0aWxsIHNhdmluZy4gSWYgeW91IGxlYXZlLCB0aGV5IHdpbGwgYmUgbG9zdC4gQXJlIHlvdSBzdXJlP1wiKTtcblxuXHRcdFx0Y29uc3QgZmlsZU1vZGVscyA9IF8ubWFwKGZpbGVzLCBmaWxlID0+IHtcblx0XHRcdFx0ZmlsZU1vZGVsID0gdGhpcy5idWxrRHJhZ0Ryb3BIZWxwZXIuZ2V0UmVzb3VyY2VNb2RlbChmaWxlKTtcblx0XHRcdFx0aWYgKF8udmFsdWVzKGZpbGVNb2RlbC5nZXQoXCJlcnJvcnNcIikpLmxlbmd0aCA+IDApXG5cdFx0XHRcdFx0ZXJyb3JDb3VudCsrO1xuXHRcdFx0XHRmaWxlTW9kZWwuc2V0KFwiZmlsZU1vZGVsXCIsIGZpbGUpO1xuXHRcdFx0XHRyZXR1cm4gZmlsZU1vZGVsO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIGlmIHRoZSBzYXZlcXVldWUgaGFzIGludmFsaWQgZmlsZXMsIHNob3cgY29uZmlybSBtb2RhbCwgZWxzZSwgc3RhcnQgdXBsb2FkXG5cdFx0XHRpZiAoZXJyb3JDb3VudCA+IDAgJiYgZXJyb3JDb3VudCAhPT0gdGhpcy5zYXZlUXVldWUubGVuZ3RoKSB7XG5cdFx0XHRcdGNvbnN0IG1vZGFsID0gbmV3IEJ1bGtSZXNvdXJjZVVwbG9hZE1vZGFsKHsgbW9kZWw6IG5ldyBCYWNrYm9uZS5Nb2RlbCh7IGZpbGVzOiBmaWxlTW9kZWxzLCBkb250U2F2ZTogdHJ1ZSB9KSB9KTtcblxuXHRcdFx0XHRtb2RhbC5vbmNlKFwiYWN0aW9uXCIsIChhY3Rpb24sIHNhdmVRdWV1ZSwgY2FuY2VsZWRGaWxlcykgPT4ge1xuXHRcdFx0XHRcdGlmIChhY3Rpb24gPT09IFwic2F2ZVwiKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnNhdmVRdWV1ZSA9IHNhdmVRdWV1ZTtcblxuXHRcdFx0XHRcdFx0Xy5lYWNoKGNhbmNlbGVkRmlsZXMsIGZpbGUgPT4gdGhpcy5vblVwbG9hZENhbmNlbChmaWxlLmdldChcImF0dGFjaG1lbnRNb2RlbFwiKSkpO1xuXHRcdFx0XHRcdFx0aWYgKCF0aGlzLmN1cnJlbnRseVNhdmluZykge1xuXHRcdFx0XHRcdFx0XHR0aGlzLnNldFNhdmVRdWV1ZShzYXZlUXVldWUsIHNlbGVjdG9yKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5zYXZlRmlsZXMoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdG1vZGFsLnNob3coKTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHR0aGlzLnNldFNhdmVRdWV1ZShmaWxlcywgc2VsZWN0b3IpO1xuXHRcdFx0XHR0aGlzLnNhdmVRdWV1ZSA9IF8uZmlsdGVyKHRoaXMuc2F2ZVF1ZXVlLCBmaWxlID0+ICFmaWxlLmdldChcImVycm9yc1wiKSB8fCBfLnZhbHVlcyhmaWxlLmdldChcImVycm9yc1wiKSkubGVuZ3RoID09PSAwKTtcblx0XHRcdFx0dGhpcy5zYXZlRmlsZXMoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLmZpbmFsaXplRHJvcChldmVudCk7XG5cdFx0dGhpcy5kcmFnQ291bnQgPSAwO1xuXHR9LFxuXG5cdG9uQ2FuY2VsRmlsZURyb3A6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0dGhpcy51aS5jYW5jZWxEcm9wLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLmRyYWdDb3VudCA9IDA7XG5cdFx0dGhpcy5maW5hbGl6ZURyb3AoZXZlbnQpO1xuXHR9LFxuXG5cdHNldFNhdmVRdWV1ZTogZnVuY3Rpb24oZmlsZXMsIHNlbGVjdG9yKSB7XG5cdFx0Y29uc3QgYm9vayA9IGV2ZW50QnVzLnJlcXVlc3QoZXZlbnRCdXMuRXZlbnRzLkdldEN1cnJlbnRCb29rKTtcblx0XHRjb25zdCBkb250U2F2ZSA9IHRydWU7XG5cdFx0bGV0IGZpbGVNb2RlbCwgYXR0YWNobWVudE1vZGVsO1xuXHRcdHRoaXMuc2F2ZVF1ZXVlID0gXy5tZXJnZSh0aGlzLnNhdmVRdWV1ZSwgXy5tYXAoXy5maWx0ZXIoZmlsZXMsIGZpbGUgPT4gIWZpbGUuZ2V0KFwic2F2ZWRcIikpLCBmaWxlID0+IHtcblx0XHRcdGF0dGFjaG1lbnRzU2F2aW5nKys7XG5cdFx0XHRmaWxlTW9kZWwgPSBmaWxlLmdldChcImZpbGVNb2RlbFwiKSA/IGZpbGUgOiB0aGlzLmJ1bGtEcmFnRHJvcEhlbHBlci5nZXRSZXNvdXJjZU1vZGVsKGZpbGUpO1xuXHRcdFx0Ly8gQ3JlYXRlIGF0dGFjaG1lbnQgd2l0aG91dCBzYXZpbmdcblx0XHRcdGF0dGFjaG1lbnRNb2RlbCA9IHRoaXMuY3JlYXRlQXR0YWNobWVudE1vZGVsKGZpbGVNb2RlbC50b0pTT04oKSwgbnVsbCwgeyBib29rLCBzZWxlY3RvciB9LCBkb250U2F2ZSk7XG5cdFx0XHRhdHRhY2htZW50TW9kZWwgPSB0aGlzLkF0dGFjaG1lbnRzLmFkZChhdHRhY2htZW50TW9kZWwudG9KU09OKCkpO1xuXG5cdFx0XHR0aGlzLmxpc3RlblRvKGZpbGVNb2RlbCwgXCJ1cGxvYWQ6cHJvZ3Jlc3NcIiwgdGhpcy5vblVwbG9hZFByb2dyZXNzLmJpbmQodGhpcywgYXR0YWNobWVudE1vZGVsKSk7XG5cdFx0XHR0aGlzLmxpc3RlblRvKGF0dGFjaG1lbnRNb2RlbCwgXCJ1cGxvYWQ6Y2FuY2VsXCIsIHRoaXMub25VcGxvYWRDYW5jZWwuYmluZCh0aGlzLCBhdHRhY2htZW50TW9kZWwpKTtcblxuXHRcdFx0aWYgKF8udmFsdWVzKGZpbGVNb2RlbC5nZXQoXCJlcnJvcnNcIikpLmxlbmd0aCA+IDApXG5cdFx0XHRcdGF0dGFjaG1lbnRNb2RlbC5zZXQoXCJlcnJvcnNcIiwgZmlsZU1vZGVsLmdldChcImVycm9yc1wiKSk7XG5cblx0XHRcdGZpbGVNb2RlbC5zZXQoXCJhdHRhY2htZW50TW9kZWxcIiwgYXR0YWNobWVudE1vZGVsKTtcblx0XHRcdC8vIFNob3cgdGhlIGF0dGFjaG1lbnQgaW4gYXR0YWNobWVudCBpbiBhdHRhY2htZW50IHZpZXdcblx0XHRcdHRoaXMuY3JlYXRlQXR0YWNobWVudFZpZXcoYXR0YWNobWVudE1vZGVsKTtcblxuXHRcdFx0cmV0dXJuIGZpbGVNb2RlbDtcblx0XHR9KSk7XG5cdH0sXG5cblx0c2F2ZUZpbGVzOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5zYXZlUXVldWUubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuTmF2aWdhdGlvblByb21wdCwgbnVsbCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLmN1cnJlbnRseVNhdmluZylcblx0XHRcdHRoaXMuY3VycmVudGx5U2F2aW5nID0gdGhpcy5zYXZlUXVldWUuc2hpZnQoKTtcblxuXHRcdGlmIChfLnZhbHVlcyh0aGlzLmN1cnJlbnRseVNhdmluZy5nZXQoXCJlcnJvcnNcIikpLmxlbmd0aCA+IDApIHtcblx0XHRcdHRoaXMuY3VycmVudGx5U2F2aW5nID0gZmFsc2U7XG5cdFx0XHRhdHRhY2htZW50c1NhdmluZy0tO1xuXHRcdFx0dGhpcy5zYXZlRmlsZXMoKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuTmF2aWdhdGlvblByb21wdCwgXCJTb21lIGF0dGFjaG1lbnRzIGFyZSBzdGlsbCBzYXZpbmcuIElmIHlvdSBsZWF2ZSwgdGhleSB3aWxsIGJlIGxvc3QuIEFyZSB5b3Ugc3VyZT9cIik7XG5cdFx0dGhpcy5jdXJyZW50bHlTYXZpbmcuZ2V0KFwiYXR0YWNobWVudE1vZGVsXCIpLnVuc2V0KFwiZXJyb3JzXCIpO1xuXHRcdHRoaXMuY3VycmVudGx5U2F2aW5nLmdldChcImF0dGFjaG1lbnRNb2RlbFwiKS5zZXQoXCJzYXZpbmdcIiwgdHJ1ZSk7XG5cdFx0Ly8gU2F2ZSB0aGUgbW9kZWwsIHVwbG9hZGluZyB0aGUgZmlsZVxuXHRcdHRoaXMueGhyW3RoaXMuY3VycmVudGx5U2F2aW5nLmdldChcImZpbGVNb2RlbFwiKS5jaWRdID0gdGhpcy5jdXJyZW50bHlTYXZpbmcuYmluYXJ5U2F2ZShudWxsLCB7XG5cdFx0XHR2YWxpZGF0ZTogZmFsc2UsXG5cdFx0XHR3YWl0OiB0cnVlLFxuXHRcdFx0ZGF0YTogdGhpcy5jdXJyZW50bHlTYXZpbmcuYXR0cmlidXRlcyxcblx0XHRcdHN1Y2Nlc3M6IHRoaXMuc2F2ZVJlc291cmNlU3VjY2Vzcy5iaW5kKHRoaXMsIHRoaXMuY3VycmVudGx5U2F2aW5nLmdldChcImF0dGFjaG1lbnRNb2RlbFwiKSksXG5cdFx0XHRlcnJvcjogdGhpcy5zYXZlUmVzb3VyY2VFcnJvci5iaW5kKHRoaXMsIHRoaXMuY3VycmVudGx5U2F2aW5nLmdldChcImF0dGFjaG1lbnRNb2RlbFwiKSksXG5cdFx0fSk7XG5cdH0sXG5cblx0c2F2ZVJlc291cmNlU3VjY2VzczogZnVuY3Rpb24oYXR0YWNobWVudE1vZGVsLCBtb2RlbCkge1xuXHRcdGF0dGFjaG1lbnRNb2RlbC5zZXQoXCJyZXNvdXJjZVwiLCBtb2RlbC5nZXQoXCJfaWRcIikpO1xuXHRcdGF0dGFjaG1lbnRNb2RlbC51bnNldChcImZpbGVNb2RlbFwiKTtcblx0XHRhdHRhY2htZW50TW9kZWwudW5zZXQoXCJzYXZpbmdcIik7XG5cdFx0YXR0YWNobWVudE1vZGVsLnVuc2V0KFwicGVyY2VudGFnZVwiKTtcblx0XHRhdHRhY2htZW50c1NhdmluZy0tO1xuXHRcdHRoaXMuc2F2ZUF0dGFjaG1lbnQoYXR0YWNobWVudE1vZGVsLCB0cnVlKTtcblx0fSxcblxuXHRzYXZlUmVzb3VyY2VFcnJvcjogZnVuY3Rpb24oYXR0YWNobWVudE1vZGVsLCBtb2RlbCwgeGhyKSB7XG5cdFx0dGhpcy54aHJbYXR0YWNobWVudE1vZGVsLmNpZF0gPSBudWxsO1xuXHRcdGF0dGFjaG1lbnRNb2RlbC51bnNldChcInNhdmluZ1wiKTtcblx0XHRhdHRhY2htZW50c1NhdmluZy0tO1xuXG5cdFx0aWYgKHhoci5zdGF0dXNUZXh0ID09PSBcImFib3J0XCIpIHtcblx0XHRcdGF0dGFjaG1lbnRNb2RlbC5zZXQoXCJlcnJvcnNcIiwgeyBlcnJvcjogXCJVcGxvYWQgc3VzcGVuZGVkLiBPbmNlIHRoZSBjb25uZWN0aW9uIGlzIHJlZXN0YWJsaXNoZWQsIHRoZSB1cGxvYWQgd2lsbCBjb250aW51ZS5cIiB9KTtcblx0XHRcdGF0dGFjaG1lbnRNb2RlbC50cmlnZ2VyKFwic2F2ZTplcnJvclwiLCB7IHJldHJ5OiB0cnVlLCByZXNwb25zZUpTT046IHsgaW5mbzogXCJVcGxvYWQgc3VzcGVuZGVkLiBPbmNlIHRoZSBjb25uZWN0aW9uIGlzIHJlZXN0YWJsaXNoZWQsIHRoZSB1cGxvYWQgd2lsbCBjb250aW51ZS5cIiB9IH0pO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGF0dGFjaG1lbnRNb2RlbC5zZXQoXCJlcnJvcnNcIiwgeyBlcnJvcjogeGhyLnJlc3BvbnNlSlNPTiAmJiB4aHIucmVzcG9uc2VKU09OLmluZm8gPyB4aHIucmVzcG9uc2VKU09OLmluZm8gOiB4aHIuc3RhdHVzVGV4dCB9KTtcblx0XHRcdGF0dGFjaG1lbnRNb2RlbC50cmlnZ2VyKFwic2F2ZTplcnJvclwiLCB4aHIpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLndzQ29ubmVjdGVkKSB7XG5cdFx0XHR0aGlzLmN1cnJlbnRseVNhdmluZyA9IGZhbHNlO1xuXHRcdFx0dGhpcy5zYXZlRmlsZXMoKTtcblx0XHR9XG5cdH0sXG5cblx0b25VcGxvYWRQcm9ncmVzczogZnVuY3Rpb24obW9kZWwsIHBlcmNlbnRhZ2UpIHtcblx0XHRtb2RlbC50cmlnZ2VyKFwidXBsb2FkOnByb2dyZXNzXCIsIHBlcmNlbnRhZ2UsIG1vZGVsKTtcblx0fSxcblxuXHRvblVwbG9hZENhbmNlbDogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRpZiAoIW1vZGVsKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0Ly9SZW1vdmUgdGhlIGNhbmNlbGVkIGF0dGFjaG1lbnRcblx0XHR0aGlzLnJlbW92ZUF0dGFjaG1lbnRWaWV3KG1vZGVsLCBtb2RlbC5nZXQoXCJzZWxlY3RvclwiKSk7XG5cdFx0Ly90aGlzLkF0dGFjaG1lbnRzLnJlbW92ZShtb2RlbCk7XG5cdFx0YXR0YWNobWVudHNTYXZpbmctLTtcblxuXHRcdC8vIHJlbW92ZSBjdXJyZW50bHlTYXZpbmcgZnJvbSB0aGlzLnNhdmVRdWV1ZVxuXHRcdGlmICh0aGlzLmN1cnJlbnRseVNhdmluZylcblx0XHRcdHRoaXMuc2F2ZVF1ZXVlID0gXy5yZWplY3QodGhpcy5zYXZlUXVldWUsIGZpbGUgPT4gZmlsZS5jaWQgPT09IHRoaXMuY3VycmVudGx5U2F2aW5nLmNpZCk7XG5cblx0XHRpZiAodGhpcy5zYXZlUXVldWUubGVuZ3RoID09PSAwKSB7XG5cdFx0XHQkKFwiLmF0dGFjaG1lbnQtaWNvbi5idXN5IC5zcGlubmVyLWljb25cIikuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0JChcIi5hdHRhY2htZW50LWljb24uYnVzeVwiKS5yZW1vdmVDbGFzcyhcImJ1c3lcIik7XG5cdFx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuTmF2aWdhdGlvblByb21wdCwgbnVsbCk7XG5cdFx0fVxuXG5cdFx0Ly8gQWJvcnQgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBzZXJ2ZXIgaWYgaXRlbSBpcyBpbiBwcm9ncmVzc1xuXHRcdGlmICh0aGlzLmN1cnJlbnRseVNhdmluZyAmJiB0aGlzLnhoclt0aGlzLmN1cnJlbnRseVNhdmluZy5nZXQoXCJmaWxlTW9kZWxcIikuY2lkXSkge1xuXHRcdFx0dGhpcy54aHJbdGhpcy5jdXJyZW50bHlTYXZpbmcuZ2V0KFwiZmlsZU1vZGVsXCIpLmNpZF0uYWJvcnQoKTtcblx0XHRcdHRoaXMuY3VycmVudGx5U2F2aW5nID0gZmFsc2U7XG5cblx0XHRcdC8vIFJldmVydCBhbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2RlbFxuXHRcdFx0aWYgKHRoaXMub2xkQXR0cmlidXRlcylcblx0XHRcdFx0dGhpcy5tb2RlbC5zZXQodGhpcy5vbGRBdHRyaWJ1dGVzLCB7IHZhbGlkYXRlOiBmYWxzZSB9KTtcblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuY3VycmVudGx5U2F2aW5nKSB7XG5cdFx0XHR0aGlzLmN1cnJlbnRseVNhdmluZyA9IGZhbHNlO1xuXHRcdFx0dGhpcy5zYXZlRmlsZXMoKTtcblx0XHR9XG5cdH0sXG5cblx0b25BdHRhY2htZW50RGVsZXRlck1vdXNlRW50ZXI6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0dGhpcy5vbkF0dGFjaG1lbnREZWxldGVyTW91c2VPdmVyKGV2ZW50KTtcblx0fSxcblxuXHRvbkF0dGFjaG1lbnREZWxldGVyTW91c2VPdmVyOiBmdW5jdGlvbihldmVudCkge1xuXHRcdHRoaXMudWkuaGlnaGxpZ2h0QmFyLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLmF0dGFjaG1lbnREZWxldGVyLmFkZENsYXNzKFwiYXR0YWNobWVudC1iaW4taGlnaGxpZ2h0ZWRcIik7XG5cblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHR9LFxuXG5cdG9uQXR0YWNobWVudERlbGV0ZXJNb3VzZUxlYXZlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmF0dGFjaG1lbnREZWxldGVyLnJlbW92ZUNsYXNzKFwiYXR0YWNobWVudC1iaW4taGlnaGxpZ2h0ZWRcIik7XG5cdFx0dGhpcy51aS5oaWdobGlnaHRCYXIucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdG9uQXR0YWNobWVudERlbGV0ZWQ6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0dGhpcy5sb3dsaWdodEF0dGFjaG1lbnRFbGVtZW50KCk7XG5cblx0XHR0aGlzLkRlbGV0ZWRBdHRhY2htZW50cy5hZGQobW9kZWwpO1xuXHRcdHRoaXMuQXR0YWNobWVudHMucmVtb3ZlKG1vZGVsKTtcblx0fSxcblxuXHRvbkRlbGV0ZWRBdHRhY2htZW50QWRkZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLlNob3dBdHRhY2htZW50QmluKTtcblx0fSxcblxuXHRvbkRlbGV0ZWRBdHRhY2htZW50UmVtb3ZlZDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuRGVsZXRlZEF0dGFjaG1lbnRzLmxlbmd0aCA9PT0gMClcblx0XHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLkhpZGVBdHRhY2htZW50QmluKTtcblx0fSxcblxuXHRvbkRlbGV0ZWRBdHRhY2htZW50c1Jlc2V0OiBmdW5jdGlvbigpIHtcblx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5IaWRlQXR0YWNobWVudEJpbik7XG5cdH0sXG5cblx0c2hvd0F0dGFjaG1lbnRCaW5Db250ZW50czogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgbW9kYWwgPSBuZXcgQXR0YWNobWVudFJlY292ZXJ5TW9kYWwoeyBkZWxldGVkQXR0YWNobWVudHM6IHRoaXMuRGVsZXRlZEF0dGFjaG1lbnRzIH0pO1xuXG5cdFx0bW9kYWwub24oXCJyZWNvdmVyXCIsIG1vZGVsID0+IHtcblx0XHRcdGNvbnN0IG9yaWdpbmFsQXR0YWNobWVudCA9IHRoaXMuRGVsZXRlZEF0dGFjaG1lbnRzLmdldChtb2RlbC5nZXQoXCJfaWRcIikpO1xuXHRcdFx0dGhpcy5jcmVhdGVBdHRhY2htZW50VmlldyhvcmlnaW5hbEF0dGFjaG1lbnQpO1xuXHRcdFx0dGhpcy5EZWxldGVkQXR0YWNobWVudHMucmVtb3ZlKG9yaWdpbmFsQXR0YWNobWVudCk7XG5cdFx0XHR0aGlzLkF0dGFjaG1lbnRzLmFkZChvcmlnaW5hbEF0dGFjaG1lbnQpO1xuXHRcdH0pO1xuXG5cdFx0bW9kYWwuc2hvdyh7fSk7XG5cdH0sXG5cblx0aGlnaGxpZ2h0QXR0YWNobWVudEVsZW1lbnQ6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG5cdFx0aWYgKCF0aGlzLnVpLmJvb2suZ2V0KVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0aWYgKHRoaXMuZm9ybWF0ID09PSBcIm1wdWJcIikge1xuXHRcdFx0Y29uc3QgZWxlbWVudCA9IHRoaXMucmVzb2x2ZURPTVNlbGVjdG9yKHNlbGVjdG9yKTtcblxuXHRcdFx0dGhpcy5yZWNvcmRFbGVtZW50Qm9yZGVyKGVsZW1lbnQpO1xuXHRcdFx0dGhpcy5zZXRFbGVtZW50Qm9yZGVyKGVsZW1lbnQpO1xuXHRcdH1cblx0XHRlbHNlIHsgdGhpcy51aS5oaWdobGlnaHRCYXIuY3NzKHsgdG9wOiAocGFyc2VGbG9hdChzZWxlY3RvcikgKiB0aGlzLmNvbnRlbnRIZWlnaHQgKiAwLjAxKS50b0ZpeGVkKDIpIC0gdGhpcy51aS5ib29rLmdldCgwKS5zY3JvbGxUb3AgfSkucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpOyB9XG5cdH0sXG5cblx0bG93bGlnaHRBdHRhY2htZW50RWxlbWVudDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLnVpLmhpZ2hsaWdodEJhci5hZGRDbGFzcylcblx0XHRcdHJldHVybjtcblxuXHRcdGlmICh0aGlzLmZvcm1hdCA9PT0gXCJtcHViXCIpXG5cdFx0XHR0aGlzLnJlc3RvcmVQcmV2aW91c0VsZW1lbnRCb3JkZXIoKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnVpLmhpZ2hsaWdodEJhci5hZGRDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0d3NDb25uZWN0ZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMud3NDb25uZWN0ZWQgPSB0cnVlO1xuXG5cdFx0aWYgKHRoaXMuc2F2ZVF1ZXVlICYmICh0aGlzLnNhdmVRdWV1ZS5sZW5ndGggPiAwIHx8IHRoaXMuY3VycmVudGx5U2F2aW5nKSkge1xuXHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7XG5cdFx0XHRcdGNvbnRlbnQ6IFwiVGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gcmVlc3RhYmxpc2hlZC5cIixcblx0XHRcdFx0aWNvbjogXCJmYS13aWZpXCIsXG5cdFx0XHRcdGljb25Db2xvdXI6IFwiZ3JlZW5cIixcblx0XHRcdFx0aG9zdDogXCIjbW9kYWxzXCIsXG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQ29udGludWUgdXBsb2FkcyBpZiBhbnlcblx0XHRcdHRoaXMuQ29ubmVjdGlvbkVycm9yRGlhbG9nLmRlc3Ryb3koKTtcblxuXHRcdFx0dGhpcy5zYXZlRmlsZXMoKTtcblx0XHR9XG5cdH0sXG5cblx0d3NEaXNjb25uZWN0ZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMud3NDb25uZWN0ZWQgPSBmYWxzZTtcblxuXHRcdGlmICh0aGlzLnNhdmVRdWV1ZSAmJiAodGhpcy5zYXZlUXVldWUubGVuZ3RoID4gMCB8fCB0aGlzLmN1cnJlbnRseVNhdmluZykpIHtcblx0XHRcdGlmICh0aGlzLmN1cnJlbnRseVNhdmluZyAmJiB0aGlzLnhoclt0aGlzLmN1cnJlbnRseVNhdmluZy5nZXQoXCJmaWxlTW9kZWxcIikuY2lkXSkge1xuXHRcdFx0XHR0aGlzLnhoclt0aGlzLmN1cnJlbnRseVNhdmluZy5nZXQoXCJmaWxlTW9kZWxcIikuY2lkXS5hYm9ydCgpO1xuXG5cdFx0XHRcdC8vIHJlLWFkZCB0aGlzLmN1cnJlbnRseVNhdmluZyB0byBzYXZlUXVldWVcblx0XHRcdFx0dGhpcy5zYXZlUXVldWUudW5zaGlmdCh0aGlzLmN1cnJlbnRseVNhdmluZyk7XG5cdFx0XHRcdHRoaXMuY3VycmVudGx5U2F2aW5nID0gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuQ29ubmVjdGlvbkVycm9yRGlhbG9nID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmFsIGZhLXRpbWVzLWNpcmNsZScvPiBFcnJvclwiLFxuXHRcdFx0XHRib2R5OiBgPHA+Q29ubmVjdGl2aXR5IGxvc3QuIFRoZSB1cGxvYWQgaGFzIGJlZW4gc3VzcGVuZGVkLjwvcD5cblx0XHRcdFx0XHQ8cD5VbmZpbmlzaGVkIHVwbG9hZHMgd2lsbCBjb250aW51ZSBvbmNlIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIHJlZXN0YWJsaXNoZWQuPC9wPmAsXG5cdFx0XHRcdGhvc3Q6IFwiI21vZGFsc1wiLFxuXHRcdFx0XHRoaWRlQnV0dG9uczogW1wiY2xvc2VcIl0sXG5cdFx0XHRcdHdhcm5pbmc6IHRydWUsXG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5Db25uZWN0aW9uRXJyb3JEaWFsb2cuc2hvdygpO1xuXHRcdH1cblx0fSxcblxuXHRkaXNhYmxlUmVzb3VyY2VCdXR0b246IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudXBsb2FkQWxsb3dlZCA9IGZhbHNlO1xuXHR9LFxuXG5cdGVuYWJsZVJlc291cmNlQnV0dG9uOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVwbG9hZEFsbG93ZWQgPSB0cnVlO1xuXHR9LFxufSk7XG5cbmNvbnN0IEJvb2tNZXRhZGF0YSA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7fSxcblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBib29rID0gZXZlbnRCdXMucmVxdWVzdChldmVudEJ1cy5FdmVudHMuR2V0Q3VycmVudEJvb2spO1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYWNhY2lhL2VwdWIvY3JlYXRlL1wiICsgYm9vay5pZDtcblx0fSxcbn0pO1xuXG5jb25zdCBFcHViTmF2aWdhdG9yID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHt9LFxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5wYWdlcyA9IHt9O1xuXG5cdFx0dGhpcy5ib29rID0gb3B0aW9ucy5ib29rO1xuXHRcdHRoaXMucmVzb2x2ZXIgPSBvcHRpb25zLnJlc29sdmVyO1xuXG5cdFx0dGhpcy5saW5rcyA9IG9wdGlvbnMuYm9vay5nZXQoXCJkb2N1bWVudHNcIik7XG5cblx0XHRjb25zdCBuYXZWZXJzaW9uID0gZXZlbnRCdXMucmVxdWVzdChldmVudEJ1cy5FdmVudHMuR2V0TmF2VmVyc2lvbik7XG5cblx0XHR0aGlzLkJhc2VVUkwgPSBzZXR0aW5ncy51cmxSb290ICsgXCIvYWNhY2lhL2VwdWIvZmlsZXMvXCIgKyBuYXZWZXJzaW9uICsgXCIvXCIgK1xuXHRcdFx0KG9wdGlvbnMuYm9vay5nZXQoXCJvdmVycmlkZU1pbWVcIikgPyBcIjFcIiA6IFwiMFwiKSArIFwiL1wiICsgb3B0aW9ucy5ib29rLmdldChcImlkXCIpICsgXCIvXCIgK1xuXHRcdFx0b3B0aW9ucy5ib29rLmdldChcImJhc2VQYXRoXCIpICsgXCIvXCI7XG5cblx0XHR0aGlzLkxpbmtJbmRleCA9IDA7XG5cdFx0dGhpcy5zdGFydExvY2F0aW9uID0gb3B0aW9ucy5zdGFydExvY2F0aW9uO1xuXHRcdHRoaXMuc3RhcnRIYXNoID0gb3B0aW9ucy5zdGFydEhhc2g7XG5cblx0XHR0aGlzLmhhc0xvY2FsU3RvcmFnZSA9IF8uaW5jbHVkZXMoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJodG1sXCIpWzBdLmNsYXNzTmFtZS5zcGxpdChcIiBcIiksIFwibG9jYWxzdG9yYWdlXCIpO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhldmVudEJ1cywgZXZlbnRCdXMuRXZlbnRzLlBhZ2VDaGFuZ2UsIHRoaXMucGFnZUNoYW5nZS5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRwYWdlQ2hhbmdlOiBmdW5jdGlvbihwKSB7XG5cdFx0Ly8gRmlndXJlIG91dCB3aGVyZSB0aGlzIHBhZ2UgaXMgYW5kIGdvIHRoZXJlXG5cdFx0aWYgKCF0aGlzLmJvb2suZ2V0KFwicGFnZXNcIikpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRjb25zdCBwYWdlID0gXy5maW5kKHRoaXMuYm9vay5nZXQoXCJwYWdlc1wiKSwgaXRlbSA9PiBpdGVtLnBhZ2UudG9TdHJpbmcoKSA9PT0gcC50b1N0cmluZygpKTtcblx0XHRpZiAoIXBhZ2UgfHwgIXRoaXMuZ2V0KFwidXJsXCIpKVxuXHRcdFx0cmV0dXJuIGNvbnNvbGUud2FybihcIlVuYWJsZSB0byBmaW5kIG1hdGNoaW5nIHBhZ2U6XCIsIHApO1xuXG5cdFx0Ly8gSWYgd2UgYXJlIG9uIHRoaXMgcGFnZSwgd2UgbmVlZCB0byBmaW5kIHRoZSBhcHByb3ByaWF0ZSBlbGVtZW50IGFuZCBqdW1wIHRvIGl0LlxuXHRcdGxldCB1cmwgPSB0aGlzLmdldChcInVybFwiKTtcblx0XHR1cmwgPSB1cmwucmVwbGFjZSgvXFxbdXBcXF0vZywgXCIuLi9cIikucmVwbGFjZSgvXFxbY3VycmVudFxcXS9nLCBcIi4vXCIpO1xuXG5cdFx0aWYgKF8uaW5jbHVkZXModXJsLnNwbGl0KFwiI1wiKVswXSwgcGFnZS5maWxlKSkge1xuXHRcdFx0ZGVsZXRlIHRoaXMucGVuZGluZ1BhZ2U7XG5cdFx0XHRjb25zdCBwRGF0YSA9IF8uZmluZCh0aGlzLnBhZ2VzW3BhZ2UuZmlsZV0sIGl0ZW0gPT4gaXRlbS5wYWdlID09PSBwYWdlLnBhZ2UpO1xuXHRcdFx0aWYgKHBEYXRhICYmIHBEYXRhLm9mZnNldClcblx0XHRcdFx0dGhpcy5zZXQoXCJvZmZzZXRcIiwgcERhdGEub2Zmc2V0LnRvcCArIDEwKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHQvLyBFbHNlIHdlIG5lZWQgdG8gZmlyc3QgbmF2aWdhdGUgdG8gdGhlIGZpbGUsIHRoZW4gcmVwZWF0IHRoaXMgb3BlcmF0aW9uIG9uY2Ugd2UndmUgbmF2aWdhdGVkXG5cdFx0XHR0aGlzLnBlbmRpbmdQYWdlID0gcDtcblx0XHRcdHRoaXMuc2V0VVJMKHBhZ2UuZmlsZSk7XG5cdFx0fVxuXHR9LFxuXG5cdHNldFVSTDogZnVuY3Rpb24ocGFnZSwgb2Zmc2V0LCBmb3JjZSwgc2lsZW50KSB7XG5cdFx0Y29uc3QgdXJsID0gcGFnZS5yZXBsYWNlKC9cXC5cXC5cXC8vLCBcIlt1cF1cIikucmVwbGFjZSgvXFwuXFwvLywgXCJbY3VycmVudF1cIik7XG5cblx0XHR0aGlzLnNldChcInVybFwiLCB0aGlzLkJhc2VVUkwgKyB1cmwsIHsgc2lsZW50IH0pO1xuXHRcdC8vIFdlIG9ubHkgc2V0IHRoZSBvZmZzZXQgaWYgdGhlcmUgaXMgbm8gaGFzaCBhbmQgdGhlIG9mZnNldCA+IDBcblx0XHQvLyBFbHNlIHdlIGJyZWFrIGFuY2hvcnNcblx0XHRpZiAoKG9mZnNldCB8fCBmb3JjZSkgJiYgIXBhZ2Uuc3BsaXQoXCIjXCIpWzFdKVxuXHRcdFx0dGhpcy5zZXQoXCJvZmZzZXRcIiwgb2Zmc2V0KTtcblxuXHRcdHRoaXMuTGlua0luZGV4ID0gXy5pbmRleE9mKHRoaXMubGlua3MsIHBhZ2Uuc3BsaXQoXCIjXCIpWzBdKTtcblx0fSxcblxuXHRuYXZpZ2F0ZVN0YXJ0OiBmdW5jdGlvbigpIHtcblx0XHRsZXQgcGFnZSA9IG51bGwsIG9mZnNldCA9IDAsIHBheWxvYWQ7XG5cblx0XHRpZiAodGhpcy5oYXNMb2NhbFN0b3JhZ2UpIHtcblx0XHRcdHBheWxvYWQgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJib29rUG9zaXRpb246XCIgKyB0aGlzLmJvb2suZ2V0KFwiaWRcIikpO1xuXHRcdFx0aWYgKHBheWxvYWQpXG5cdFx0XHRcdHBheWxvYWQgPSBKU09OLnBhcnNlKHBheWxvYWQpO1xuXHRcdH1cblxuXHRcdC8vIElmIGFuIGV4cGxpY2l0IHN0YXJ0IGxvY2F0aW9uIHdhcyBwcm92aWRlZCwgd2UgdXNlIHRoYXQuXG5cdFx0aWYgKHRoaXMuc3RhcnRMb2NhdGlvbiAmJiB0aGlzLnN0YXJ0TG9jYXRpb24gIT09IFwibnVsbFwiKVxuXHRcdFx0cGFnZSA9IHRoaXMuc3RhcnRMb2NhdGlvbiArICh0aGlzLnN0YXJ0SGFzaCA/IFwiI1wiICsgdGhpcy5zdGFydEhhc2gucmVwbGFjZSgvXFwjL2dpLCBcIlwiKSA6IFwiXCIpO1xuXG5cdFx0Ly8gSWYgd2UgaGF2ZSBhIHN0b3JlZCBwYXlsb2FkIGZvciB0aGlzIGJvb2ssIHVzZSB0aGF0IGFzIHdlbGxcblx0XHRpZiAocGF5bG9hZCkge1xuXHRcdFx0aWYgKCghdGhpcy5zdGFydExvY2F0aW9uIHx8IHRoaXMuc3RhcnRMb2NhdGlvbiA9PT0gXCJudWxsXCIpICYmIHBheWxvYWQucGFnZSlcblx0XHRcdFx0cGFnZSA9IHBheWxvYWQucGFnZSArIChwYXlsb2FkLmhhc2ggPyBcIiNcIiArIHBheWxvYWQuaGFzaC5yZXBsYWNlKC9cXCMvZ2ksIFwiXCIpIDogXCJcIik7XG5cdFx0XHRvZmZzZXQgPSBwYXlsb2FkLm9mZnNldDtcblx0XHR9XG5cblx0XHQvLyBGaW5hbGx5IGNoZWNrIGZvciBpbnZhbGlkIHBhZ2VzXG5cdFx0aWYgKCFwYWdlKVxuXHRcdFx0cGFnZSA9IHRoaXMubGlua3NbMF07XG5cblx0XHR0aGlzLnNldFVSTChwYWdlLCBvZmZzZXQpO1xuXHR9LFxuXG5cdHBvbGxOYXZpZ2F0ZVByZXZpb3VzOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gKHRoaXMuTGlua0luZGV4ID4gMCk7XG5cdH0sXG5cblx0cG9sbE5hdmlnYXRlTmV4dDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuICh0aGlzLkxpbmtJbmRleCA8ICh0aGlzLmxpbmtzLmxlbmd0aCAtIDEpKTtcblx0fSxcblxuXHRuYXZpZ2F0ZVByZXZpb3VzOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5wb2xsTmF2aWdhdGVQcmV2aW91cygpKVxuXHRcdFx0dGhpcy5zZXRVUkwodGhpcy5saW5rc1t0aGlzLkxpbmtJbmRleCAtIDFdLCA5OTk5OTk5OTkpO1xuXHR9LFxuXG5cdG5hdmlnYXRlTmV4dDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMucG9sbE5hdmlnYXRlTmV4dCgpKVxuXHRcdFx0dGhpcy5zZXRVUkwodGhpcy5saW5rc1t0aGlzLkxpbmtJbmRleCArIDFdLCAwLCB0cnVlKTtcblx0fSxcblxuXHRuYXZpZ2F0ZVRvU2VjdGlvbjogZnVuY3Rpb24oc2VjdGlvbikge1xuXHRcdHRoaXMuc2V0VVJMKHNlY3Rpb24sIDApO1xuXHR9LFxuXG5cdHN5bmNocm9uaXplOiBmdW5jdGlvbihfc2VjdGlvbiwgX29mZnNldCkge1xuXHRcdC8vIEZpZ3VyZSBvdXQgd2hhdCBwYWdlIHdlIGFyZSBvbiwgYW5kIGNhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIHBhZ2UgYnJlYWtzIGluIGl0XG5cdFx0Y29uc3QgdGhpc1BhZ2UgPSBfc2VjdGlvbi5zcGxpdChcIiNcIilbMF0ucmVwbGFjZSgvXFxbdXBcXF0vZywgXCIuLi9cIikucmVwbGFjZSgvXFxbY3VycmVudFxcXS9nLCBcIi4vXCIpO1xuXG5cdFx0aWYgKCF0aGlzLnBhZ2VzW3RoaXNQYWdlXSkge1xuXHRcdFx0dGhpcy5wYWdlc1t0aGlzUGFnZV0gPSBfLnJlZHVjZShfLmZpbHRlcih0aGlzLmJvb2suZ2V0KFwicGFnZXNcIiksIGl0ZW0gPT4gaXRlbS5maWxlID09PSB0aGlzUGFnZSksIChzdW0sIG51bSkgPT4ge1xuXHRcdFx0XHRjb25zdCBlbCA9IHRoaXMucmVzb2x2ZXIobnVtLnNlbGVjdG9yKTtcblx0XHRcdFx0aWYgKGVsKVxuXHRcdFx0XHRcdHN1bVtudW0ucGFnZV0gPSB7IHBhZ2U6IG51bS5wYWdlLCBlbDogZWwsIG9mZnNldDogZWwub2Zmc2V0KCkgfTtcblx0XHRcdFx0cmV0dXJuIHN1bTtcblx0XHRcdH0sIHt9KTtcblx0XHR9XG5cblx0XHQvLyBJZiB3ZSBqdW1wZWQgdG8gdGhlIGN1cnJlbnQgcGFnZSBhcyBwYXJ0IG9mIGEgcGFnZSBjaGFuZ2UsIG1vdmUgdG8gdGhlIGV4YWN0IG9mZnNldCBub3dcblx0XHRpZiAodGhpcy5wZW5kaW5nUGFnZSlcblx0XHRcdHJldHVybiB0aGlzLnBhZ2VDaGFuZ2UodGhpcy5wZW5kaW5nUGFnZSk7XG5cblx0XHRjb25zdCBvZmZzZXQgPSBfb2Zmc2V0IHx8IDA7XG5cblx0XHRsZXQgc2VjdGlvbiA9IF9zZWN0aW9uLnNwbGl0KFwiI1wiKTtcblx0XHRjb25zdCBoYXNoID0gc2VjdGlvblsxXSB8fCBcIlwiO1xuXHRcdHNlY3Rpb24gPSBzZWN0aW9uWzBdO1xuXG5cdFx0dGhpcy5MaW5rSW5kZXggPSBfLmluZGV4T2YodGhpcy5saW5rcywgdGhpc1BhZ2UpO1xuXG5cdFx0aWYgKCFzZWN0aW9uKVxuXHRcdFx0c2VjdGlvbiA9IFwiXCI7XG5cblx0XHRjb25zdCBwYXlsb2FkID0ge1xuXHRcdFx0cGFnZTogc2VjdGlvbixcblx0XHRcdG9mZnNldDogb2Zmc2V0LFxuXHRcdFx0aGFzaDogaGFzaCxcblx0XHR9O1xuXG5cdFx0aWYgKHRoaXMuaGFzTG9jYWxTdG9yYWdlKVxuXHRcdFx0d2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiYm9va1Bvc2l0aW9uOlwiICsgdGhpcy5ib29rLmdldChcImlkXCIpLCBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSk7XG5cblx0XHQvLyBTeW5jIHRoZSBjdXJyZW50IHBhZ2UgdmFsdWVcblx0XHRsZXQgcGFnZSA9IF8uZmluZExhc3QodGhpcy5wYWdlc1t0aGlzUGFnZV0sIGl0ZW0gPT4gaXRlbS5vZmZzZXQgJiYgaXRlbS5vZmZzZXQudG9wIDwgb2Zmc2V0KTtcblxuXHRcdGlmICghcGFnZSkge1xuXHRcdFx0Ly8gUm9tYW4gbnVtZXJhbCB0byBpbnRlZ2VyIGNvbnZlcnRlciBibGF0YW50bHkgc25hdGNoZWQgZnJvbTogaHR0cDovL2Jsb2cuc3RldmVubGV2aXRoYW4uY29tL2FyY2hpdmVzL2phdmFzY3JpcHQtcm9tYW4tbnVtZXJhbC1jb252ZXJ0ZXJcblx0XHRcdGNvbnN0IHJvbWFuVG9JbnQgPSByb21hblN0cmluZyA9PiB7XG5cdFx0XHRcdGNvbnN0XHRzdHIgPSByb21hblN0cmluZy50b1VwcGVyQ2FzZSgpO1xuXHRcdFx0XHRjb25zdCB2YWxpZGF0b3IgPSAvXk0qKD86RD9DezAsM318Q1tNRF0pKD86TD9YezAsM318WFtDTF0pKD86Vj9JezAsM318SVtYVl0pJC87XG5cdFx0XHRcdGNvbnN0IHRva2VuID0gL1tNRExWXXxDW01EXT98WFtDTF0/fElbWFZdPy9nO1xuXHRcdFx0XHRjb25zdCBrZXkgPSB7IE06IDEwMDAsIENNOiA5MDAsIEQ6IDUwMCwgQ0Q6IDQwMCwgQzogMTAwLCBYQzogOTAsIEw6IDUwLCBYTDogNDAsIFg6IDEwLCBJWDogOSwgVjogNSwgSVY6IDQsIEk6IDEgfTtcblx0XHRcdFx0bGV0IG51bSA9IDA7XG5cdFx0XHRcdGxldCBtO1xuXG5cdFx0XHRcdGlmICghKHN0ciAmJiB2YWxpZGF0b3IudGVzdChzdHIpKSlcblx0XHRcdFx0XHRyZXR1cm4gTmFOO1xuXG5cdFx0XHRcdG0gPSB0b2tlbi5leGVjKHN0cik7XG5cdFx0XHRcdHdoaWxlKG0pIHtcblx0XHRcdFx0XHRudW0gKz0ga2V5W21bMF1dO1xuXHRcdFx0XHRcdG0gPSB0b2tlbi5leGVjKHN0cik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbnVtO1xuXHRcdFx0fTtcblxuXHRcdFx0bGV0IG1pblBhZ2VOdW1iZXI7XG5cblx0XHRcdGlmIChfLmtleXModGhpcy5wYWdlc1t0aGlzUGFnZV0pLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRtaW5QYWdlTnVtYmVyID0geyBwYWdlTnVtYmVyOiBudWxsIH07XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0bWluUGFnZU51bWJlciA9IF8ubWluQnkoXy5tYXAodGhpcy5wYWdlc1t0aGlzUGFnZV0sICh2LCBrKSA9PiB7XG5cdFx0XHRcdFx0bGV0IHBhZ2VOdW1iZXIgPSBwYXJzZUludChrLCAxMCk7XG5cblx0XHRcdFx0XHRpZiAoXy5pc05hTihwYWdlTnVtYmVyKSlcblx0XHRcdFx0XHRcdHBhZ2VOdW1iZXIgPSByb21hblRvSW50KGspO1xuXG5cdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdHBhZ2VOdW1iZXI6IF8uaXNOYU4ocGFnZU51bWJlcikgPyBrIDogcGFnZU51bWJlcixcblx0XHRcdFx0XHRcdG9yaWdpbmFsUGFnZU51bWJlcjogayxcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9KSwgcCA9PiBwLnBhZ2VOdW1iZXIgfHwgcC5vcmlnaW5hbFBhZ2VOdW1iZXIpO1xuXHRcdFx0fVxuXG5cdFx0XHRwYWdlID0gbWluUGFnZU51bWJlciAmJiBtaW5QYWdlTnVtYmVyLnBhZ2VOdW1iZXIgPyB0aGlzLnBhZ2VzW3RoaXNQYWdlXVttaW5QYWdlTnVtYmVyLm9yaWdpbmFsUGFnZU51bWJlcl0gOiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0aWYgKHBhZ2UpXG5cdFx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5TZXRQYWdlLCBwYWdlLnBhZ2UpO1xuXHR9LFxufSk7XG5cbmNvbnN0IFBkZk5hdmlnYXRvciA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7fSxcblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuYm9vayA9IG9wdGlvbnMuYm9vaztcblxuXHRcdHRoaXMucGFnZSA9IDE7XG5cdFx0dGhpcy5zdGFydExvY2F0aW9uID0gb3B0aW9ucy5zdGFydExvY2F0aW9uO1xuXHRcdHRoaXMuc3RhcnRIYXNoID0gb3B0aW9ucy5zdGFydEhhc2g7XG5cblx0XHR0aGlzLmhhc0xvY2FsU3RvcmFnZSA9IF8uaW5jbHVkZXMoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJodG1sXCIpWzBdLmNsYXNzTmFtZS5zcGxpdChcIiBcIiksIFwibG9jYWxzdG9yYWdlXCIpO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhldmVudEJ1cywgZXZlbnRCdXMuRXZlbnRzLlBhZ2VDaGFuZ2UsIHRoaXMuc2V0VVJMLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdHNldFVSTDogZnVuY3Rpb24ocGFnZSwgb2Zmc2V0LCBmb3JjZSkge1xuXHRcdHRoaXMuc2V0KFwidXJsXCIsIHBhcnNlSW50KHBhZ2UsIDEwKSk7XG5cdFx0aWYgKG9mZnNldCB8fCBmb3JjZSlcblx0XHRcdHRoaXMuc2V0KFwib2Zmc2V0XCIsIG9mZnNldCk7XG5cblx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5TZXRQYWdlLCBwYXJzZUludChwYWdlLCAxMCkpO1xuXHR9LFxuXG5cdG5hdmlnYXRlU3RhcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdGxldCBwYWdlID0gbnVsbCwgb2Zmc2V0ID0gMCwgcGF5bG9hZDtcblxuXHRcdGlmICh0aGlzLmhhc0xvY2FsU3RvcmFnZSkge1xuXHRcdFx0cGF5bG9hZCA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImJvb2tQb3NpdGlvbjpcIiArIHRoaXMuYm9vay5nZXQoXCJpZFwiKSk7XG5cdFx0XHRpZiAocGF5bG9hZClcblx0XHRcdFx0cGF5bG9hZCA9IEpTT04ucGFyc2UocGF5bG9hZCk7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgYW4gZXhwbGljaXQgc3RhcnQgbG9jYXRpb24gd2FzIHByb3ZpZGVkLCB3ZSB1c2UgdGhhdC5cblx0XHRpZiAodGhpcy5zdGFydExvY2F0aW9uICYmIHRoaXMuc3RhcnRMb2NhdGlvbiAhPT0gXCJudWxsXCIpXG5cdFx0XHRwYWdlID0gdGhpcy5zdGFydExvY2F0aW9uO1xuXG5cdFx0Ly8gSWYgd2UgaGF2ZSBhIHN0b3JlZCBwYXlsb2FkIGZvciB0aGlzIGJvb2ssIHVzZSB0aGF0IGFzIHdlbGxcblx0XHRpZiAocGF5bG9hZCkge1xuXHRcdFx0aWYgKCghdGhpcy5zdGFydExvY2F0aW9uIHx8IHRoaXMuc3RhcnRMb2NhdGlvbiA9PT0gXCJudWxsXCIpICYmIHBheWxvYWQucGFnZSlcblx0XHRcdFx0cGFnZSA9IHBheWxvYWQucGFnZTtcblx0XHRcdG9mZnNldCA9IHBheWxvYWQub2Zmc2V0O1xuXHRcdH1cblxuXHRcdC8vIEZpbmFsbHkgY2hlY2sgZm9yIGludmFsaWQgcGFnZXNcblx0XHRpZiAoIXBhZ2UpXG5cdFx0XHRwYWdlID0gMTtcblxuXHRcdHRoaXMuc2V0VVJMKHBhZ2UsIG9mZnNldCk7XG5cdFx0dGhpcy5zeW5jaHJvbml6ZShwYWdlLCBvZmZzZXQpO1xuXHR9LFxuXG5cdHBvbGxOYXZpZ2F0ZVByZXZpb3VzOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gKHRoaXMucGFnZSA+IDEpO1xuXHR9LFxuXG5cdHBvbGxOYXZpZ2F0ZU5leHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiAodGhpcy5wYWdlIDwgdGhpcy5ib29rLmdldChcInRvdGFsUGFnZXNcIikpO1xuXHR9LFxuXG5cdG5hdmlnYXRlUHJldmlvdXM6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLnBvbGxOYXZpZ2F0ZVByZXZpb3VzKCkpXG5cdFx0XHR0aGlzLnNldFVSTCh0aGlzLnBhZ2UgLSAxLCA5OTk5OTk5OTkpO1xuXHR9LFxuXG5cdG5hdmlnYXRlTmV4dDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMucG9sbE5hdmlnYXRlTmV4dCgpKVxuXHRcdFx0dGhpcy5zZXRVUkwodGhpcy5wYWdlICsgMSwgMCwgdHJ1ZSk7XG5cdH0sXG5cblx0bmF2aWdhdGVUb1NlY3Rpb246IGZ1bmN0aW9uKHNlY3Rpb24pIHtcblx0XHR0aGlzLnNldFVSTChzZWN0aW9uLCAwKTtcblx0fSxcblxuXHRzeW5jaHJvbml6ZTogZnVuY3Rpb24oX3NlY3Rpb24sIF9vZmZzZXQpIHtcblx0XHRjb25zdCBvZmZzZXQgPSBfb2Zmc2V0IHx8IDA7XG5cdFx0bGV0IHNlY3Rpb24gPSBfc2VjdGlvbjtcblxuXHRcdGlmICghc2VjdGlvbilcblx0XHRcdHNlY3Rpb24gPSAxO1xuXG5cdFx0dGhpcy5wYWdlID0gcGFyc2VJbnQoc2VjdGlvbiwgMTApO1xuXHRcdHRoaXMuc2V0KFwidXJsXCIsIHRoaXMucGFnZSk7XG5cblx0XHRjb25zdCBwYXlsb2FkID0ge1xuXHRcdFx0cGFnZTogc2VjdGlvbixcblx0XHRcdG9mZnNldDogb2Zmc2V0LFxuXHRcdH07XG5cblx0XHRpZiAodGhpcy5oYXNMb2NhbFN0b3JhZ2UpXG5cdFx0XHR3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJib29rUG9zaXRpb246XCIgKyB0aGlzLmJvb2suZ2V0KFwiaWRcIiksIEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKTtcblx0fSxcbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IEF0dGFjaG1lbnQgPSBCYWNrYm9uZS5Nb2RlbC5leHRlbmQoe1xuXHRkZWZhdWx0czoge30sXG5cdGlkQXR0cmlidXRlOiBcIl9pZFwiLFxuXG5cdHVybFJvb3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9hdHRhY2htZW50c1wiO1xuXHR9LFxuXG5cdGlzT2xkOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MuYW5udWFsQ29udGVudCAmJiBtb21lbnQudW5peCh0aGlzLmdldChcImNyZWF0ZWRcIikpLmlzQmVmb3JlKG1vbWVudC51bml4KEFwcC5jdXJyZW50WWVhcih7IHVuaXg6IHRydWUgfSkpKTtcblx0fSxcblxuXHRpc0ZvcmVpZ246IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHVzZXIgPSByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpO1xuXHRcdGlmIChyZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmdyb3Vwcy5hbGwsIHVzZXIpKVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0Y29uc3QgYWxsb3dlZCA9IGV2ZW50QnVzLnJlcXVlc3QoZXZlbnRCdXMuRXZlbnRzLkdldEFsbG93ZWRHcm91cHMpO1xuXG5cdFx0aWYgKF8ua2V5cyhhbGxvd2VkLnN5c3RlbSkubGVuZ3RoID09PSAwKVxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0KFwiZ3JvdXBzXCIpICE9PSBudWxsICYmIHRoaXMuZ2V0KFwiZ3JvdXBzXCIpLmxlbmd0aCAhPT0gMDtcblxuXHRcdHJldHVybiBfLmludGVyc2VjdGlvbihfLmtleXMoYWxsb3dlZC5zeXN0ZW0pLmNvbmNhdChfLmtleXMoYWxsb3dlZC5jdXN0b20pKSwgdGhpcy5nZXQoXCJncm91cHNcIikgfHwgW10pLmxlbmd0aCA9PT0gMDtcblx0fSxcblxuXHRpc1NoYXJlZDogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgYWxsb3dlZCA9IGV2ZW50QnVzLnJlcXVlc3QoZXZlbnRCdXMuRXZlbnRzLkdldEFsbG93ZWRHcm91cHMpO1xuXG5cdFx0aWYgKF8ua2V5cyhhbGxvd2VkLnN5c3RlbSkubGVuZ3RoID09PSAwICYmIF8ua2V5cyhhbGxvd2VkLmN1c3RvbSkubGVuZ3RoID09PSAwKVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0Ly8gVG8gYmUgc2hhcmVkLCB0aGUgYXR0YWNobWVudCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGdyb3VwIHRoYXQgaXMgc3RpbGwgYXNzaWduZWQgdG8gdGhpcyBib29rLCBhbmQgbm90IG93bmVkIGJ5IHRoZSB2aWV3ZXJcblx0XHRyZXR1cm4gXy5zb21lKHRoaXMuZ2V0KFwiZ3JvdXBzXCIpIHx8IFtdLCBpdGVtID0+IHtcblx0XHRcdGlmICghKGl0ZW0gaW4gYWxsb3dlZC5hbGwpKVxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdHJldHVybiAhKGl0ZW0gaW4gYWxsb3dlZC5zeXN0ZW0pICYmICEoaXRlbSBpbiBhbGxvd2VkLmN1c3RvbSk7XG5cdFx0fSk7XG5cdH0sXG59KTtcblxuY29uc3QgQXR0YWNobWVudENvbGxlY3Rpb24gPSBCYWNrYm9uZS5Db2xsZWN0aW9uLmV4dGVuZCh7XG5cdG1vZGVsOiBBdHRhY2htZW50LFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgYm9vayA9IGV2ZW50QnVzLnJlcXVlc3QoZXZlbnRCdXMuRXZlbnRzLkdldEN1cnJlbnRCb29rKTtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvYXR0YWNobWVudHMvYm9va3MvXCIgKyBib29rLmdldChcIl9pZFwiKTtcblx0fSxcbn0pO1xuXG5jb25zdCBEZWxldGVkQXR0YWNobWVudENvbGxlY3Rpb24gPSBCYWNrYm9uZS5Db2xsZWN0aW9uLmV4dGVuZCh7XG5cdG1vZGVsOiBBdHRhY2htZW50LFxufSk7XG5cbmNvbnN0IEF0dGFjaG1lbnREZXRhaWxWaWV3ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6IFwiZGl2XCIsXG5cdGNsYXNzTmFtZTogXCJhdHRhY2htZW50LWRldGFpbHNcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9jb25zb2xlL2Jvb2stdmlldy5udW5qXCIpLmRlc2NyaXB0aW9uLFxuXG5cdHVpOiB7XG5cdFx0cHJldmlldzogXCIucHJldmlld1wiLFxuXHRcdGFjdGlvbkZpbmRSZXNvdXJjZTogXCIjYWN0aW9uLWZpbmQtcmVzb3VyY2VcIixcblx0XHRhY3Rpb25TZWxlY3RHcm91cHM6IFwiI2FjdGlvbi1zZWxlY3QtZ3JvdXBzXCIsXG5cdFx0YWN0aW9uT3BlblJlc291cmNlOiBcIiNhY3Rpb24tb3Blbi1yZXNvdXJjZVwiLFxuXHRcdGFjdGlvbkNsb25lOiBcIiNhY3Rpb24tY2xvbmVcIixcblx0XHRhY3Rpb25SZXNvdXJjZU9wZW5lZEJ5OiBcIiNhY3Rpb24tcmVzb3VyY2Utb3BlbmVkLWJ5XCIsXG5cdFx0Y2xvbmVhYmxlOiBcIi5zdGF0dXMuY2xvbmVcIixcblx0XHRzaGFyZWQ6IFwiLnN0YXR1cy5zaGFyZVwiLFxuXHRcdHNob3dDb2RlOiBcIi5zaG93LWNvZGVcIixcblx0XHRzaG93VGlwcHk6IFwiLnNob3ctdGlwcHlcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5wcmV2aWV3XCI6IFwib25BY3Rpb25PcGVuUmVzb3VyY2VcIixcblx0XHRcImNsaWNrIEB1aS5hY3Rpb25GaW5kUmVzb3VyY2VcIjogXCJvbkFjdGlvbkZpbmRSZXNvdXJjZVwiLFxuXHRcdFwiY2xpY2sgQHVpLmFjdGlvblNlbGVjdEdyb3Vwc1wiOiBcIm9uQWN0aW9uU2VsZWN0R3JvdXBzXCIsXG5cdFx0XCJjbGljayBAdWkuYWN0aW9uT3BlblJlc291cmNlXCI6IFwib25BY3Rpb25PcGVuUmVzb3VyY2VcIixcblx0XHRcImNsaWNrIEB1aS5hY3Rpb25SZXNvdXJjZU9wZW5lZEJ5XCI6IFwib25BY3Rpb25SZXNvdXJjZU9wZW5lZEJ5XCIsXG5cdFx0XCJjbGljayBAdWkuY2xvbmVhYmxlXCI6IFwib25BY3Rpb25DbG9uZVwiLFxuXHRcdFwiY2xpY2sgQHVpLnNoYXJlZFwiOiBcIm9uQWN0aW9uU2hhcmVkXCIsXG5cblx0XHRcImNsaWNrIEB1aS5zaG93Q29kZVwiOiBcInNob3dDb2RlXCIsXG5cdH0sXG5cblx0dGVtcGxhdGVDb250ZXh0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aXNPbGQ6IHRoaXMuQXR0YWNobWVudE1vZGVsLmlzT2xkKCksXG5cdFx0XHRpc0ZvcmVpZ246IHRoaXMuQXR0YWNobWVudE1vZGVsLmlzRm9yZWlnbigpLFxuXHRcdFx0aXNTaGFyZWQ6IHRoaXMuQXR0YWNobWVudE1vZGVsLmlzU2hhcmVkKCksXG5cdFx0fTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0aWYgKG9wdGlvbnMuYXR0YWNobWVudE1vZGVsLmdldChcInRpdGxlXCIpID09PSBudWxsKSB7XG5cdFx0XHR0aGlzLm1vZGVsID0gbmV3IFJlc291cmNlKHtcblx0XHRcdFx0dGl0bGU6IFwiW0NvbnRlbnQgRGVsZXRlZF1cIixcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMubW9kZWwgPSBuZXcgUmVzb3VyY2Uoe1xuXHRcdFx0XHR0aXRsZTogb3B0aW9ucy5hdHRhY2htZW50TW9kZWwuZ2V0KFwidGl0bGVcIiksXG5cdFx0XHRcdHN1YmplY3RfbmFtZTogb3B0aW9ucy5hdHRhY2htZW50TW9kZWwuZ2V0KFwic3ViamVjdF9uYW1lXCIpLFxuXHRcdFx0XHRncmFkZTogb3B0aW9ucy5hdHRhY2htZW50TW9kZWwuZ2V0KFwiZ3JhZGVcIiksXG5cdFx0XHRcdGxhbmd1YWdlOiBvcHRpb25zLmF0dGFjaG1lbnRNb2RlbC5nZXQoXCJsYW5ndWFnZVwiKSxcblx0XHRcdFx0X2lkOiBvcHRpb25zLmF0dGFjaG1lbnRNb2RlbC5nZXQoXCJyZXNvdXJjZVwiKSxcblx0XHRcdFx0Y2F0ZWdvcnk6IG9wdGlvbnMuYXR0YWNobWVudE1vZGVsLmdldChcImNhdGVnb3J5XCIpLFxuXHRcdFx0XHRiYXNlQ29kZTogb3B0aW9ucy5hdHRhY2htZW50TW9kZWwuZ2V0KFwiYmFzZUNvZGVcIiksXG5cdFx0XHRcdHRleHQ6IG9wdGlvbnMuYXR0YWNobWVudE1vZGVsLmdldChcInRleHRcIiksXG5cdFx0XHRcdHVybDogb3B0aW9ucy5hdHRhY2htZW50TW9kZWwuZ2V0KFwidXJsXCIpLFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5BdHRhY2htZW50TW9kZWwgPSBvcHRpb25zLmF0dGFjaG1lbnRNb2RlbDtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5lbmFibGVBY3Rpb24odGhpcy51aS5hY3Rpb25GaW5kUmVzb3VyY2UpO1xuXG5cdFx0aWYgKCF0aGlzLkF0dGFjaG1lbnRNb2RlbC5pc09sZCgpICYmICF0aGlzLkF0dGFjaG1lbnRNb2RlbC5pc0ZvcmVpZ24oKSkge1xuXHRcdFx0aWYgKCh0aGlzLkF0dGFjaG1lbnRNb2RlbC5nZXQoXCJncm91cHNcIikgfHwgW10pLmxlbmd0aClcblx0XHRcdFx0dGhpcy5lbmFibGVBY3Rpb24odGhpcy51aS5hY3Rpb25TZWxlY3RHcm91cHMpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLmRpc2FibGVBY3Rpb24odGhpcy51aS5hY3Rpb25TZWxlY3RHcm91cHMpO1xuXHRcdH1cblxuXHRcdHRoaXMubG9hZFByZXZpZXcoKTtcblxuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcImNhdGVnb3J5XCIpID09PSBcImFzc2Vzc21lbnRcIiAmJiB0aGlzLm1vZGVsLmhhcyhcImJhc2VDb2RlXCIpICYmICh0aGlzLkF0dGFjaG1lbnRNb2RlbC5nZXQoXCJzZXR0aW5nc1wiKSB8fCB7IGNvZGU6IFwiXCIgfSkuY29kZSlcblx0XHRcdHRoaXMudWkuc2hvd0NvZGUucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0dGhpcy51aS5zaG93VGlwcHkuZWFjaCgoaSwgZWwpID0+IHtcblx0XHRcdHRpcHB5KGVsLCB7XG5cdFx0XHRcdHRoZW1lOiBcImJsYWNrXCIsXG5cdFx0XHRcdHBsYWNlbWVudDogXCJsZWZ0XCIsXG5cdFx0XHRcdGFycm93OiB0cnVlLFxuXHRcdFx0XHRjb250ZW50OiAkKGVsKS5hdHRyKFwiZGF0YS10aXRsZVwiKSxcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9LFxuXG5cdGVuYWJsZUFjdGlvbjogZnVuY3Rpb24oZWxlbWVudCkge1xuXHRcdGVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdGRpc2FibGVBY3Rpb246IGZ1bmN0aW9uKGVsZW1lbnQpIHtcblx0XHRlbGVtZW50LmFkZENsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRvbkFjdGlvbkZpbmRSZXNvdXJjZTogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLk9wZW5SZXNvdXJjZXMpO1xuXHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLkZpbmRSZXNvdXJjZSwgdGhpcy5tb2RlbCk7XG5cdH0sXG5cblx0b25BY3Rpb25TZWxlY3RHcm91cHM6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGdtID0gbmV3IEdyb3VwTW9kYWwoe1xuXHRcdFx0Y3VycmVudEdyb3VwczogdGhpcy5BdHRhY2htZW50TW9kZWwuZ2V0KFwiZ3JvdXBzXCIpLFxuXHRcdFx0Zm9yQXR0YWNobWVudDogdHJ1ZSxcblx0XHR9KTtcblxuXHRcdGdtLnNob3coe1xuXHRcdFx0b2s6IHJlc3VsdCA9PiB7XG5cdFx0XHRcdHRoaXMuQXR0YWNobWVudE1vZGVsLnNhdmUoe1xuXHRcdFx0XHRcdGdyb3VwczogcmVzdWx0LnZhbHVlcyxcblx0XHRcdFx0XHRib29rOiB0aGlzLkF0dGFjaG1lbnRNb2RlbC5nZXQoXCJib29rXCIpLFxuXHRcdFx0XHR9LCB7IHBhdGNoOiB0cnVlIH0pO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fSxcblxuXHRvbkFjdGlvbk9wZW5SZXNvdXJjZTogZnVuY3Rpb24oKSB7XG5cdFx0c3dpdGNoICh0aGlzLm1vZGVsLmdldChcImNhdGVnb3J5XCIpKSB7XG5cdFx0XHRjYXNlIFwidGV4dFwiOlxuXHRcdFx0Y2FzZSBcIm9uZW5vdGVcIjpcblx0XHRcdGNhc2UgXCJnb29nbGVkcml2ZVwiOlxuXHRcdFx0Y2FzZSBcInVybFwiOiB7XG5cdFx0XHRcdGxldCB0ZXh0ID0gXCJcIjtcblx0XHRcdFx0aWYgKHRoaXMubW9kZWwuaGFzKFwidGV4dFwiKSlcblx0XHRcdFx0XHR0ZXh0ID0gdGhpcy5tb2RlbC5nZXQoXCJ0ZXh0XCIpLnJlcGxhY2UoL1xcbi9nLCBcIjxici8+XCIpO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dGV4dCA9IFwiPGEgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9XFxcIlwiICsgdGhpcy5tb2RlbC5nZXQoXCJ1cmxcIikgKyBcIlxcXCI+XCIgKyB0aGlzLm1vZGVsLmdldChcInVybFwiKSArIFwiPC9hPlwiO1xuXG5cdFx0XHRcdGNvbnN0IGNvbmZpcm0gPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHRcdFx0Y3VzdG9tT0s6IFwiQ2xvc2VcIixcblx0XHRcdFx0XHRoaWRlQnV0dG9uczogW1wiY2FuY2VsXCJdLFxuXHRcdFx0XHRcdGJvZHk6IHRleHQsXG5cdFx0XHRcdFx0dGl0bGU6IFwiVmlld2luZyBSZXNvdXJjZTogXCIgKyB0aGlzLm1vZGVsLmdldChcInRpdGxlXCIpLnJlcGxhY2UoL1tcXCZcXDxcXD5cXCdcXFwiXS9nLCB4ID0+IFwiJiNcIiArIHguY2hhckNvZGVBdCgwKSArIFwiO1wiKSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGNvbmZpcm0uc2hvdygpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0Y2FzZSBcImltYWdlXCI6XG5cdFx0XHRcdG5ldyBMaWdodEJveCh7XG5cdFx0XHRcdFx0aG9zdDogJChcIiNsaW5rLXJlc291cmNlc1wiKSxcblx0XHRcdFx0XHRpbWFnZTogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvcmVzb3VyY2VzL1wiICsgdGhpcy5tb2RlbC5pZCArIFwiL2RhdGFcIixcblx0XHRcdFx0fSkuc2hvdygpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcImFzc2Vzc21lbnRcIjpcblx0XHRcdFx0bmV3IEFzc2Vzc21lbnRNb2RhbCh7XG5cdFx0XHRcdFx0bW9kZWw6IG5ldyBBc3Nlc3NtZW50KHRoaXMubW9kZWwudG9KU09OKCkpLFxuXHRcdFx0XHRcdHByZXZpZXdNb2RlOiB0cnVlLFxuXHRcdFx0XHRcdHJlc3RhcnQ6IHRydWUsXG5cdFx0XHRcdH0pLnNob3coe30pO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwiZmxhc2hjYXJkZGVja1wiOlxuXHRcdFx0XHRuZXcgRmxhc2hjYXJkUHJldmlldyh7XG5cdFx0XHRcdFx0bW9kZWw6IHRoaXMubW9kZWwsXG5cdFx0XHRcdH0pLnNob3coKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJ2aWRlb1wiOlxuXHRcdFx0Y2FzZSBcImF1ZGlvXCI6XG5cdFx0XHRjYXNlIFwicGRmXCI6XG5cdFx0XHRjYXNlIFwiZXhjZWxcIjpcblx0XHRcdGNhc2UgXCJ3b3JkXCI6XG5cdFx0XHRjYXNlIFwicG93ZXJwb2ludFwiOlxuXHRcdFx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9yZXNvdXJjZXMvXCIgKyB0aGlzLm1vZGVsLmlkICsgXCIvZGF0YVwiKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIlVua25vd24gcmVzb3VyY2UgdHlwZSB0byBvcGVuOiBcIiArIHRoaXMubW9kZWwuZ2V0KFwiY2F0ZWdvcnlcIikpO1xuXHRcdH1cblx0fSxcblxuXHRvbkFjdGlvbkNsb25lOiBmdW5jdGlvbihlKSB7XG5cdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRldmVudEJ1cy50cmlnZ2VyKFwiYXR0YWNobWVudDpyZWp1dmVuYXRlXCIsIHRoaXMuQXR0YWNobWVudE1vZGVsKTtcblx0fSxcblxuXHRvbkFjdGlvblNoYXJlZDogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgbW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmFsIGZhLXNoYXJlLWFsdCcvPiBTaGFyZWQgQXR0YWNobWVudFwiLFxuXHRcdFx0Ym9keTogXCI8cD5UaGlzIGF0dGFjaG1lbnQgaXMgc2hhcmVkLCB3aGljaCBtZWFucyB0aGF0IGl0IGlzIGFsc28gdXNlZCBpbiBncm91cHMgdGhhdCB5b3UgZG8gbm90IGhhdmUgYWNjZXNzIHRvLiBZb3UgY2Fubm90IGFsdGVyIHNoYXJlZCBhdHRhY2htZW50cy48L3A+XCIsXG5cdFx0XHRob3N0OiBcIiNsaW5rLXJlc291cmNlc1wiLFxuXHRcdFx0aGlkZUJ1dHRvbnM6IFtcImNhbmNlbFwiXSxcblx0XHR9KTtcblx0XHRtb2RhbC5zaG93KCk7XG5cdH0sXG5cblx0Ly8gVE9VQ0hQT0lOVDogUkVTT1VSQ0UgVFlQRVxuXHRsb2FkUHJldmlldzogZnVuY3Rpb24oKSB7XG5cdFx0c3dpdGNoICh0aGlzLkF0dGFjaG1lbnRNb2RlbC5nZXQoXCJyZXNvdXJjZVR5cGVcIikpIHtcblx0XHRcdGNhc2UgXCJvbmVub3RlXCI6XG5cdFx0XHRjYXNlIFwiZ29vZ2xlZHJpdmVcIjpcblx0XHRcdGNhc2UgXCJ1cmxcIjpcblx0XHRcdFx0dGhpcy51aS5wcmV2aWV3LnRleHQodGhpcy5tb2RlbC5nZXQoXCJ1cmxcIikpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgXCJpbWFnZVwiOlxuXHRcdFx0Y2FzZSBcInBkZlwiOlxuXHRcdFx0Y2FzZSBcInZpZGVvXCI6XG5cdFx0XHRcdHJldHVybiB0aGlzLnVpLnByZXZpZXcuY3NzKHtcblx0XHRcdFx0XHRcImJhY2tncm91bmQtaW1hZ2VcIjogXCJ1cmwoJ1wiICsgc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvcmVzb3VyY2VzL1wiICsgdGhpcy5BdHRhY2htZW50TW9kZWwuZ2V0KFwicmVzb3VyY2VcIikgKyBcIi9wcmV2aWV3JylcIixcblx0XHRcdFx0fSk7XG5cblx0XHRcdGNhc2UgXCJ0ZXh0XCI6XG5cdFx0XHRcdHRoaXMudWkucHJldmlldy50ZXh0KHRoaXMubW9kZWwuZ2V0KFwidGV4dFwiKSk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwiYXNzZXNzbWVudFwiOlxuXHRcdFx0XHR0aGlzLnVpLnByZXZpZXcudGV4dCh0aGlzLkF0dGFjaG1lbnRNb2RlbC5oYXMoXCJzZXR0aW5nc1wiKSA/IHRoaXMuQXR0YWNobWVudE1vZGVsLmdldChcInNldHRpbmdzXCIpLnRpdGxlIDogXCJcIik7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwiZmxhc2hjYXJkZGVja1wiOlxuXHRcdFx0XHR0aGlzLnVpLnByZXZpZXcudGV4dCh0aGlzLm1vZGVsLmdldChcInRpdGxlXCIpKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybjsvL3Rocm93IG5ldyBFcnJvcihcIlVua25vd24gcmVzb3VyY2UgdHlwZSB0byBwcmV2aWV3XCIpO1xuXHRcdH1cblx0fSxcblxuXHRzaG93Q29kZTogZnVuY3Rpb24oKSB7XG5cdFx0bGV0IGNvZGUgPSB0aGlzLm1vZGVsLmdldChcImJhc2VDb2RlXCIpLnRvTG93ZXJDYXNlKCk7XG5cdFx0Y29kZSA9IHBhcnNlSW50KGNvZGUsIDE2KTtcblxuXHRcdGNvbnN0IHhvciA9IHBhcnNlSW50KHRoaXMuQXR0YWNobWVudE1vZGVsLmdldChcInNldHRpbmdzXCIpLmNvZGUsIDE2KTtcblxuXHRcdGxldCByZWFsQ29kZSA9IChjb2RlIF4geG9yKS50b1N0cmluZygxNikudG9Mb3dlckNhc2UoKTtcblx0XHR3aGlsZShyZWFsQ29kZS5sZW5ndGggPCA2KVxuXHRcdFx0cmVhbENvZGUgPSBcIjBcIiArIHJlYWxDb2RlO1xuXG5cdFx0Y29uc3QgbW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmFsIGZhLWtleScvPiBBc3Nlc3NtZW50IEFjdGl2YXRpb24gQ29kZVwiLFxuXHRcdFx0Ym9keTogYDxwPlRoaXMgaXMgdGhlIGNvZGUgdG8gYWN0aXZhdGUgdGhpcyBzcGVjaWZpYyBhc3Nlc3NtZW50IGluc3RhbmNlOjwvcD5cblx0XHRcdFx0PHAgc3R5bGU9J2xldHRlci1zcGFjaW5nOiAxLjVlbTsgZm9udC1zaXplOiAxLjdlbTsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgdGV4dC1hbGlnbjogY2VudGVyOyBiYWNrZ3JvdW5kLWNvbG9yOiAjRUVFOyBib3JkZXItcmFkaXVzOiAzcHg7IGNvbG9yOiAjMDAwJz4ke3JlYWxDb2RlfTwvcD5gLFxuXHRcdFx0aGlkZUJ1dHRvbnM6IFtcImNhbmNlbFwiXSxcblx0XHRcdGhvc3Q6IFwiI2xpbmstcmVzb3VyY2VzXCIsXG5cdFx0fSk7XG5cblx0XHRtb2RhbC5zaG93KCk7XG5cdH0sXG5cblx0b25BY3Rpb25SZXNvdXJjZU9wZW5lZEJ5OiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCByZXNvdXJjZU9wZW5lZE1vZGFsID0gbmV3IFJlc291cmNlT3BlbmVkTW9kYWwoeyByZXNvdXJjZTogdGhpcy5tb2RlbC5nZXQoXCJfaWRcIiksIGF0dGFjaG1lbnQ6IHRoaXMuQXR0YWNobWVudE1vZGVsLmdldChcIl9pZFwiKSwgdHlwZTogXCJib29rXCIgfSk7XG5cblx0XHRyZXNvdXJjZU9wZW5lZE1vZGFsLnNob3coKTtcblx0fSxcbn0pO1xuXG5jb25zdCBBdHRhY2htZW50UHJvZ3Jlc3NWaWV3ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6IFwiZGl2XCIsXG5cdGNsYXNzTmFtZTogXCJ1cGxvYWRpbmctcm93XCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvY29uc29sZS9ib29rLXZpZXcubnVualwiKS5hdHRhY2htZW50UHJvZ3Jlc3MsXG5cblx0dWk6IHtcblx0XHRlcnJvckJ1dHRvbjogXCIuZXJyb3ItYnRuXCIsXG5cdFx0Y2FuY2VsQnV0dG9uOiBcIi5jYW5jZWwtYnRuXCIsXG5cdFx0Y29tcGxldGVkQnV0dG9uOiBcIi5jb21wbGV0ZWQtYnRuXCIsXG5cdFx0cHJvZ3Jlc3NCYXI6IFwiLnVwbG9hZC1wcm9ncmVzcyAucHJvZ3Jlc3MtYmFyXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkuY2FuY2VsQnV0dG9uXCI6IFwib25DYW5jZWxDbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmNvbXBsZXRlZEJ1dHRvblwiOiBcIm9uQ29tcGxldGVkQ2xpY2tcIixcblx0fSxcblxuXHRtb2RlbEV2ZW50czoge1xuXHRcdFwidXBsb2FkOnByb2dyZXNzXCI6IFwib25VcGxvYWRQcm9ncmVzc1wiLFxuXHRcdFwic2F2ZTpzdWNjZXNzXCI6IFwidXBsb2FkU3VjY2Vzc1wiLFxuXHRcdFwic2F2ZTplcnJvclwiOiBcInVwbG9hZEVycm9yXCIsXG5cdFx0XCJjaGFuZ2U6ZXJyb3JzXCI6IFwib25FcnJvcnNDaGFuZ2VcIixcblx0fSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRjb250ZW50SWNvbnM6IHNldHRpbmdzLmNvbnRlbnRJY29ucyxcblx0XHRcdHNpbmdsZUljb246IEFwcC5tYXBSZXNvdXJjZVRvSWNvbih0aGlzLm1vZGVsLmdldChcImNhdGVnb3J5XCIpKSxcblx0XHR9O1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuYmluZEV2ZW50cyh0aGlzLm1vZGVsLCB0aGlzLm1vZGVsRXZlbnRzKTtcblx0XHR0aGlzLnBlcmNlbnRhZ2UgPSAwO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJzYXZlZFwiKSkge1xuXHRcdFx0dGhpcy51aS5wcm9ncmVzc0Jhci5jc3MoeyB3aWR0aDogXCIxMDAlXCIgfSk7XG5cdFx0XHR0aGlzLnVwbG9hZFN1Y2Nlc3MoKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5tb2RlbC5oYXMoXCJwZXJjZW50YWdlXCIpKVxuXHRcdFx0dGhpcy51aS5wcm9ncmVzc0Jhci5jc3MoeyB3aWR0aDogdGhpcy5tb2RlbC5nZXQoXCJwZXJjZW50YWdlXCIpICsgXCIlXCIgfSk7XG5cblx0XHR0aGlzLm9uRXJyb3JzQ2hhbmdlKCk7XG5cdH0sXG5cblx0b25Db21wbGV0ZWRDbGljazogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0fSxcblxuXHRvbkNhbmNlbENsaWNrOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdHRoaXMubW9kZWwudHJpZ2dlcihcInVwbG9hZDpjYW5jZWxcIiwgdGhpcy5tb2RlbCk7XG5cdFx0dGhpcy5kZXN0cm95KCk7XG5cdH0sXG5cblx0b25VcGxvYWRQcm9ncmVzczogZnVuY3Rpb24ocGVyY2VudGFnZSkge1xuXHRcdGlmICh0aGlzLnBlcmNlbnRhZ2UgPD0gcGVyY2VudGFnZSkge1xuXHRcdFx0dGhpcy51aS5wcm9ncmVzc0Jhci5hbmltYXRlKHsgd2lkdGg6IHBlcmNlbnRhZ2UgKyBcIiVcIiB9KTtcblx0XHRcdHRoaXMucGVyY2VudGFnZSA9IHBlcmNlbnRhZ2U7XG5cdFx0XHR0aGlzLm1vZGVsLnNldChcInBlcmNlbnRhZ2VcIiwgcGVyY2VudGFnZSk7XG5cdFx0fVxuXHR9LFxuXG5cdHVwbG9hZFN1Y2Nlc3M6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkucHJvZ3Jlc3NCYXIuYW5pbWF0ZSh7IHdpZHRoOiBcIjEwMCVcIiB9KTtcblx0XHR0aGlzLnVpLnByb2dyZXNzQmFyLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLmNhbmNlbEJ1dHRvbi5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5jb21wbGV0ZWRCdXR0b24ucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdHVwbG9hZEVycm9yOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLnByb2dyZXNzQmFyLmNzcyh7IHdpZHRoOiBcIjAlXCIgfSk7XG5cdH0sXG5cblx0b25FcnJvcnNDaGFuZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcImVycm9yc1wiKSAmJiBfLnZhbHVlcyh0aGlzLm1vZGVsLmdldChcImVycm9yc1wiKSkubGVuZ3RoID4gMCkge1xuXHRcdFx0dGhpcy51aS5jYW5jZWxCdXR0b24uYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0dGhpcy51aS5jb21wbGV0ZWRCdXR0b24uYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0dGhpcy51aS5lcnJvckJ1dHRvbi5yZW1vdmVDbGFzcyhcImhpZGVcIikuYXR0cihcInRpdGxlXCIsIF8udmFsdWVzKHRoaXMubW9kZWwuZ2V0KFwiZXJyb3JzXCIpKS5qb2luKFwiLiBcIikpO1xuXHRcdH1cblx0fSxcbn0pO1xuXG5jb25zdCBBdHRhY2htZW50c1VwbG9hZFZpZXcgPSBCYWNrYm9uZS5NYXJpb25ldHRlLkNvbGxlY3Rpb25WaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6IFwiZGl2XCIsXG5cdGNsYXNzTmFtZTogXCJhdHRhY2htZW50LWxpc3RcIixcblxuXHRjaGlsZFZpZXc6IEF0dGFjaG1lbnRQcm9ncmVzc1ZpZXcsXG5cblx0dGVtcGxhdGU6IGZhbHNlLFxufSk7XG5cbmNvbnN0IENvbXBvdW5kQXR0YWNobWVudFZpZXcgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogXCJkaXZcIixcblx0Y2xhc3NOYW1lOiBcImF0dGFjaG1lbnRcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9jb25zb2xlL2Jvb2stdmlldy5udW5qXCIpLmF0dGFjaG1lbnQsXG5cblx0dWk6IHtcblx0XHRpY29uOiBcIi5hdHRhY2htZW50LWljb25cIixcblx0XHRzcGlubmVyOiBcIi5zcGlubmVyLWljb25cIixcblx0XHRhZ2VJY29uOiBcIi5hZ2VcIixcblx0XHRuYXRpb25hbGl0eUljb246IFwiLm5hdGlvbmFsaXR5XCIsXG5cdFx0c2hhcmVkSWNvbjogXCIuc2hhcmVkXCIsXG5cdFx0dmlzaWJsZUljb246IFwiLnZpc2libGVcIixcblx0XHRsb2NrZWRJY29uOiBcIi5sb2NrZWRcIixcblx0XHRoaWdobGlnaHRPdmVybGF5OiBcImRpdi5oaWdobGlnaHQtb3ZlcmxheVwiLFxuXHRcdGVycm9ySWNvbjogXCIuZXJyb3JcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRtb3VzZW92ZXI6IFwib25Nb3VzZU92ZXJcIixcblx0XHRtb3VzZW91dDogXCJvbk1vdXNlT3V0XCIsXG5cdFx0bW91c2Vkb3duOiBcIm9uTW91c2VEb3duXCIsXG5cdFx0XCJhbmltYXRpb25lbmQgQHVpLmhpZ2hsaWdodE92ZXJsYXlcIjogXCJvbkhpZ2hsaWdodE92ZXJsYXlBbmltYXRpb25FbmRcIixcblx0XHRcImNsaWNrIEB1aS5lcnJvckljb25cIjogXCJvbkVycm9yQ2xpY2tcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5saXN0ZW5UbyhldmVudEJ1cywgXCJhdHRhY2htZW50czpkZWxldGU6XCIgKyB0aGlzLmNpZCwgdGhpcy5kZWxldGVTZWxmLmJpbmQodGhpcykpO1xuXHRcdGlmICh0aGlzLmlzUGFydE9mKCkpIHtcblx0XHRcdC8vIEEgcGFydC1vZiBhdHRhY2htZW50IHZpZXcga2VlcHMgaXRzIGF0dGFjaG1lbnQgY29sbGVjdGlvbiBwcml2YXRlOyBpdHMgdW5kZXJseWluZyBtb2RlbCBpcyBhbHJlYWR5XG5cdFx0XHQvLyBleHBvc2VkIHRocm91Z2ggdGhlIGNvbXBvdW5kIGF0dGFjaG1lbnQgdG8gd2hpY2ggdGhlIHBhcnQtb2YgYXR0YWNobWVudCBiZWxvbmdzXG5cdFx0XHR0aGlzLkF0dGFjaG1lbnRDb2xsZWN0aW9uID0gbmV3IEF0dGFjaG1lbnRDb2xsZWN0aW9uKCk7XG5cdFx0XHR0aGlzLkF0dGFjaG1lbnRDb2xsZWN0aW9uLmFkZCh0aGlzLm1vZGVsKTtcblxuXHRcdFx0Ly8gTGlzdGVuIGZvciBldmVudHMgdG8gY29udHJvbCB3aGVuIGEgcGFydC1vZiBhdHRhY2htZW50IHZpZXcgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIHdoaWxlIGl0cyBkZXRhaWxzXG5cdFx0XHQvLyB0b29sdGlwIGlzIGRpc3BsYXllZCBieSB0aGUgY29tcG91bmQgYXR0YWNobWVudCB0byB3aGljaCBpdCBiZWxvbmdzXG5cdFx0XHR0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsIFwiaGlnaGxpZ2h0XCIsIHRoaXMuaGlnaGxpZ2h0KTtcblx0XHRcdHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwgXCJsb3dsaWdodFwiLCB0aGlzLmxvd2xpZ2h0KTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHQvLyBBIHNpbmdsZSAob3IgY29tcG91bmQpIGF0dGFjaG1lbnQgdmlldyByZWNlaXZlcyBpdHMgYXR0YWNobWVudCBjb2xsZWN0aW9uIGZyb20gdGhlIGF0dGFjaG1lbnRcblx0XHRcdC8vIGNvbnRhaW5lciB2aWV3XG5cdFx0XHR0aGlzLkF0dGFjaG1lbnRDb2xsZWN0aW9uID0gb3B0aW9ucy5hdHRhY2htZW50Q29sbGVjdGlvbjtcblxuXHRcdFx0Ly8gTGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZSBjb2xsZWN0aW9uIGNhdXNlZCBieSBhIHVzZXIgZHJhZ2dpbmcgYXR0YWNobWVudHMgaW50byB0aGUgY29tcG91bmQgYXR0YWNobWVudFxuXHRcdFx0Ly8gb3IgcmVtb3ZpbmcgYXR0YWNobWVudHMgZnJvbSB0aGUgY29tcG91bmQgYXR0YWNobWVudFxuXHRcdFx0dGhpcy5BdHRhY2htZW50Q29sbGVjdGlvbi5vbihcImFkZFwiLCB0aGlzLm9uQXR0YWNobWVudEFkZGVkLCB0aGlzKTtcblx0XHRcdHRoaXMuQXR0YWNobWVudENvbGxlY3Rpb24ub24oXCJyZW1vdmVcIiwgdGhpcy5vbkF0dGFjaG1lbnRSZW1vdmVkLCB0aGlzKTtcblx0XHRcdHRoaXMuQXR0YWNobWVudENvbGxlY3Rpb24ub24oXCJyZXNldFwiLCB0aGlzLm9uQXR0YWNobWVudHNSZXNldCwgdGhpcyk7XG5cblx0XHRcdC8vIExpc3RlbiBmb3IgdXBsb2FkIGV2ZW50c1xuXHRcdFx0dGhpcy5BdHRhY2htZW50Q29sbGVjdGlvbi5vbihcInNhdmU6ZXJyb3JcIiwgdGhpcy51cGxvYWRFcnJvciwgdGhpcyk7XG5cdFx0XHR0aGlzLkF0dGFjaG1lbnRDb2xsZWN0aW9uLm9uKFwiY2hhbmdlOmVycm9yc1wiLCB0aGlzLm9uRXJyb3JzQ2hhbmdlLCB0aGlzKTtcblxuXHRcdFx0Ly8gTGlzdGVuIGZvciB0b29sdGlwIHJlcXVlc3RzIGJ5IHRoZSBhdHRhY2htZW50cyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgY29tcG91bmQgYXR0YWNobWVudFxuXHRcdFx0dGhpcy5BdHRhY2htZW50Q29sbGVjdGlvbi5vbihcInRvb2x0aXA6c2hvd1wiLCB0aGlzLnNob3dUb29sdGlwLCB0aGlzKTtcblxuXHRcdFx0Ly8gSGlkZSBvcGVuIHRvb2x0aXBzIHdoZW4gdGhlIGF0dGFjaG1lbnQgY29udGFpbmVyIHZpZXcgaXMgc2Nyb2xsZWRcblx0XHRcdHRoaXMubGlzdGVuVG8oZXZlbnRCdXMsIFwiYXR0YWNobWVudHM6c2Nyb2xsXCIsIHRoaXMuaGlkZVRvb2x0aXBzKTtcblx0XHR9XG5cblx0XHQvLyBMaXN0ZW4gZm9yIHN5bmMgYXMgd2VsbCBhcyBqdW1wLWZvY3VzIGV2ZW50c1xuXHRcdHRoaXMuQXR0YWNobWVudENvbGxlY3Rpb24uZWFjaChtb2RlbCA9PiB7XG5cdFx0XHR0aGlzLmFkZFN5bmNMaXN0ZW5lcnMobW9kZWwpO1xuXHRcdFx0dGhpcy5hZGRGb2N1c0xpc3RlbmVyKG1vZGVsKTtcblx0XHR9KTtcblxuXHRcdC8vIEhpZGUgb3BlbiB0b29sdGlwc1xuXHRcdCQod2luZG93KS5jbGljayhldmVudCA9PiB7XG5cdFx0XHRjb25zdCBldmVudFRhcmdldCA9ICQoZXZlbnQudGFyZ2V0KTtcblxuXHRcdFx0aWYgKCEkKHRoaXMudWkuaWNvbikuaXMoZXZlbnRUYXJnZXQpKSB7XG5cdFx0XHRcdGlmICh0aGlzLmlzQ29tcG91bmQoKSAmJiB0aGlzLkF0dGFjaG1lbnRUb29sdGlwKSB7XG5cdFx0XHRcdFx0aWYgKCF0aGlzLkF0dGFjaG1lbnRUb29sdGlwLnZpZXcuY2hpbGRyZW4uZmluZCh2aWV3ID0+ICgkKHZpZXcudWkuaWNvbikuaXMoZXZlbnRUYXJnZXQpKSkpXG5cdFx0XHRcdFx0XHR0aGlzLmhpZGVUb29sdGlwcygpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2UgeyB0aGlzLmhpZGVUb29sdGlwcygpOyB9XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKGV2ZW50QnVzLCBldmVudEJ1cy5FdmVudHMuVG9nZ2xlTG9ja2VkQXR0YWNobWVudHMsIHRoaXMudG9nZ2xlTG9ja2VkQXR0YWNobWVudHMuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0aXNFbXB0eTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuICh0aGlzLkF0dGFjaG1lbnRDb2xsZWN0aW9uLmxlbmd0aCA9PT0gMCk7XG5cdH0sXG5cblx0aXNTYXZlZDogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gRGV0ZXJtaW5lIGlmIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGhhcyBiZWVuIHNhdmVkIHRvIHRoZSBzZXJ2ZXI7IHVzZWZ1bCBvbmx5IGZvciBzaW5nbGUgYW5kIHBhcnQtb2Zcblx0XHQvLyBhdHRhY2htZW50IHZpZXdzIGJ1dCB3aWxsIHN1Y2NlZWQgZm9yIGNvbXBvdW5kIHZpZXdzXG5cdFx0cmV0dXJuICghdGhpcy5BdHRhY2htZW50Q29sbGVjdGlvbi5hdCgwKS5pc05ldygpKTtcblx0fSxcblxuXHRpc1BhcnRPZjogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gQW4gYXR0YWNobWVudCB0aGF0IGlzIHBhcnQgb2YgYSBjb21wb3VuZCBhdHRhY2htZW50IHdpbGwgcmVjZWl2ZSBpdHMgbW9kZWwgZnJvbSBhIGNvbGxlY3Rpb24gdmlld1xuXHRcdHJldHVybiAoQm9vbGVhbih0aGlzLm1vZGVsKSk7XG5cdH0sXG5cblx0aXNDb21wb3VuZDogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gQ29tcG91bmQgYXR0YWNobWVudCB2aWV3cyBjb250YWluIG11bHRpcGxlIGF0dGFjaG1lbnRzXG5cdFx0cmV0dXJuICh0aGlzLkF0dGFjaG1lbnRDb2xsZWN0aW9uLmxlbmd0aCA+IDEpO1xuXHR9LFxuXG5cdGlzT2xkOiBmdW5jdGlvbigpIHtcblx0XHQvLyBUaGUgYXR0YWNobWVudCB2aWV3IGlzIG9sZCBpZiBpdHMgdW5kZXJseWluZyBtb2RlbCByZWZlcnMgdG8gYSBwcmV2aW91cyB5ZWFyJ3MgYXR0YWNobWVudDsgdXNlZnVsXG5cdFx0Ly8gb25seSBmb3Igc2luZ2xlIGFuZCBwYXJ0LW9mIGF0dGFjaG1lbnQgdmlld3MgYnV0IHdpbGwgc3VjY2VlZCBmb3IgY29tcG91bmQgdmlld3Ncblx0XHRyZXR1cm4gdGhpcy5BdHRhY2htZW50Q29sbGVjdGlvbi5hdCgwKS5pc09sZCgpO1xuXHR9LFxuXG5cdGlzRm9yZWlnbjogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gVGhlIGF0dGFjaG1lbnQgdmlldyBpcyBmb3JlaWduIGlmIGl0cyB1bmRlcmx5aW5nIG1vZGVsIGlzIG5vdCBhIG1lbWJlciBvZiBhbnkgb2YgdGhlIGFsbG93ZWQgZ3JvdXBzXG5cdFx0Ly8gZm9yIHRoZSBjdXJyZW50IHVzZXI7IHVzZWZ1bCBvbmx5IGZvciBzaW5nbGUgYW5kIHBhcnQtb2YgYXR0YWNobWVudCB2aWV3cyBidXQgd2lsbCBzdWNjZWVkIGZvciBjb21wb3VuZCB2aWV3c1xuXHRcdHJldHVybiB0aGlzLkF0dGFjaG1lbnRDb2xsZWN0aW9uLmF0KDApLmlzRm9yZWlnbigpO1xuXHR9LFxuXG5cdGlzU2hhcmVkOiBmdW5jdGlvbigpIHtcblx0XHQvLyBUaGUgYXR0YWNobWVudCB2aWV3IGlzIHNoYXJlZCBpZiBpdHMgdW5kZXJseWluZyBtb2RlbCBpcyBhIG1lbWJlciBvZiBzb21lIGdyb3VwcyB0aGF0IHRoZSBjdXJyZW50IHVzZXIgaXMgbm90LlxuXHRcdHJldHVybiB0aGlzLkF0dGFjaG1lbnRDb2xsZWN0aW9uLmF0KDApLmlzU2hhcmVkKCk7XG5cdH0sXG5cblx0Y29udGFpbnNPbGRBdHRhY2htZW50OiBmdW5jdGlvbigpIHtcblx0XHQvLyBEZXRlcm1pbmUgaWYgYW4gYXR0YWNobWVudCB2aWV3IGNvbnRhaW5zIGFueSBvbGQgYXR0YWNobWVudHM7IHVzZWZ1bCBmb3IgYWxsIGF0dGFjaG1lbnQgdmlld3Ncblx0XHRyZXR1cm4gXy5maW5kKHRoaXMuQXR0YWNobWVudENvbGxlY3Rpb24ubW9kZWxzLCBtb2RlbCA9PiBtb2RlbC5pc09sZCgpKTtcblx0fSxcblxuXHRjb250YWluc1NoYXJlZEF0dGFjaG1lbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIERldGVybWluZSBpZiBhbiBhdHRhY2htZW50IHZpZXcgY29udGFpbnMgYW55IG9sZCBhdHRhY2htZW50czsgdXNlZnVsIGZvciBhbGwgYXR0YWNobWVudCB2aWV3c1xuXHRcdHJldHVybiBfLmZpbmQodGhpcy5BdHRhY2htZW50Q29sbGVjdGlvbi5tb2RlbHMsIG1vZGVsID0+IG1vZGVsLmlzU2hhcmVkKCkpO1xuXHR9LFxuXG5cdGNvbnRhaW5zTmV3QXR0YWNobWVudDogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gRGV0ZXJtaW5lIGlmIGFuIGF0dGFjaG1lbnQgdmlldyBjb250YWlucyBhbnkgbmV3IChub3Qgb2xkKSBhdHRhY2htZW50czsgdXNlZnVsIGZvciBhbGwgYXR0YWNobWVudCB2aWV3c1xuXHRcdHJldHVybiBfLmZpbmQodGhpcy5BdHRhY2htZW50Q29sbGVjdGlvbi5tb2RlbHMsIG1vZGVsID0+ICFtb2RlbC5pc09sZCgpKTtcblx0fSxcblxuXHRjb250YWluc0ZvcmVpZ25BdHRhY2htZW50OiBmdW5jdGlvbigpIHtcblx0XHQvLyBEZXRlcm1pbmUgaWYgYW4gYXR0YWNobWVudCB2aWV3IGNvbnRhaW5zIGFueSBmb3JlaWduIGF0dGFjaG1lbnRzOyB1c2VmdWwgZm9yIGFsbCBhdHRhY2htZW50IHZpZXdzXG5cdFx0cmV0dXJuIF8uZmluZCh0aGlzLkF0dGFjaG1lbnRDb2xsZWN0aW9uLm1vZGVscywgbW9kZWwgPT4gbW9kZWwuaXNGb3JlaWduKCkpO1xuXHR9LFxuXG5cdGNvbnRhaW5zTmF0aXZlQXR0YWNobWVudDogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gRGV0ZXJtaW5lIGlmIGFuIGF0dGFjaG1lbnQgdmlldyBjb250YWlucyBhbnkgbmF0aXZlIChub3QgZm9yZWlnbikgYXR0YWNobWVudHM7IHVzZWZ1bCBmb3IgYWxsIGF0dGFjaG1lbnQgdmlld3Ncblx0XHRyZXR1cm4gXy5maW5kKHRoaXMuQXR0YWNobWVudENvbGxlY3Rpb24ubW9kZWxzLCBtb2RlbCA9PiAhbW9kZWwuaXNGb3JlaWduKCkpO1xuXHR9LFxuXG5cdGdldFJlc291cmNlVHlwZTogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gUmV0dXJuIHRoZSB0eXBlIG9mIHJlc291cmNlIHJlcHJlc2VudGVkIGJ5IHRoZSB1bmRlcmx5aW5nIG1vZGVsOyB1c2VmdWwgb25seSBmb3Igc2luZ2xlIGFuZCBwYXJ0LW9mIGF0dGFjaG1lbnRcblx0XHQvLyB2aWV3cyBidXQgd2lsbCBzdWNjZWVkIGZvciBjb21wb3VuZCB2aWV3c1xuXHRcdHJldHVybiB0aGlzLkF0dGFjaG1lbnRDb2xsZWN0aW9uLmF0KDApID8gdGhpcy5BdHRhY2htZW50Q29sbGVjdGlvbi5hdCgwKS5nZXQoXCJyZXNvdXJjZVR5cGVcIikgOiB1bmRlZmluZWQ7XG5cdH0sXG5cblx0Z2V0U2VsZWN0b3I6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIEEgdmFsaWQgYXR0YWNobWVudCB2aWV3IGFsd2F5cyBoYXMgYXQgbGVhc3Qgb25lLCB1bmRlcmx5aW5nIGF0dGFjaG1lbnQgbW9kZWwuIFRoZSBzZWxlY3RvciByZW1haW5zIHRoZSBzYW1lXG5cdFx0Ly8gd2hldGhlciB0aGlzIGlzIGEgc2luZ2xlLCBjb21wb3VuZCwgb3IgcGFydC1vZiBhdHRhY2htZW50IHZpZXdcblx0XHRyZXR1cm4gdGhpcy5BdHRhY2htZW50Q29sbGVjdGlvbi5hdCgwKSA/IHRoaXMuQXR0YWNobWVudENvbGxlY3Rpb24uYXQoMCkuZ2V0KFwic2VsZWN0b3JcIikgOiB1bmRlZmluZWQ7XG5cdH0sXG5cblx0c2F2aW5nOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIXRoaXMuRGVzdHJveWVkKSB7XG5cdFx0XHR0aGlzLnVpLmljb24uYWRkQ2xhc3MoXCJidXN5XCIpO1xuXHRcdFx0dGhpcy51aS5zcGlubmVyLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR9XG5cblx0XHR0aGlzLmRyYWdnYWJsZSA9IGZhbHNlO1xuXHR9LFxuXG5cdHNhdmVkOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIXRoaXMuRGVzdHJveWVkKSB7XG5cdFx0XHR0aGlzLnVpLmljb24ucmVtb3ZlQ2xhc3MoXCJidXN5XCIpO1xuXHRcdFx0dGhpcy51aS5zcGlubmVyLmFkZENsYXNzKFwiaGlkZVwiKTtcblxuXHRcdFx0dGhpcy5kcmFnZ2FibGUgPSB0aGlzLkF0dGFjaG1lbnRDb2xsZWN0aW9uLmF0KDApO1xuXHRcdH1cblx0fSxcblxuXHRhZGRGb2N1c0xpc3RlbmVyOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdG1vZGVsLm9uKFwiZm9jdXNcIiwgKCkgPT4ge1xuXHRcdFx0dGhpcy51cGRhdGVGb2N1cygpO1xuXG5cdFx0XHRpZiAodGhpcy5pc0NvbXBvdW5kKCkpXG5cdFx0XHRcdHRoaXMuc2hvd1Rvb2x0aXAoKTtcblx0XHR9LCB0aGlzKTtcblx0fSxcblxuXHRyZW1vdmVGb2N1c0xpc3RlbmVyOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdG1vZGVsLm9mZihcImZvY3VzXCIpO1xuXHR9LFxuXG5cdGFkZFN5bmNMaXN0ZW5lcnM6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0bW9kZWwub24oXCJyZXF1ZXN0XCIsIHRoaXMuc2F2aW5nLCB0aGlzKTtcblx0XHRtb2RlbC5vbihcInN5bmNcIiwgdGhpcy5zYXZlZCwgdGhpcyk7XG5cdH0sXG5cblx0cmVtb3ZlU3luY0xpc3RlbmVyczogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRtb2RlbC5vZmYoXCJyZXF1ZXN0XCIsIHRoaXMuc2F2aW5nLmJpbmQodGhpcykpO1xuXHRcdG1vZGVsLm9mZihcInN5bmNcIiwgdGhpcy5zYXZlZC5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51cGRhdGUoKTtcblxuXHRcdGlmICh0aGlzLm1vZGVsICYmIHRoaXMubW9kZWwuZ2V0KFwiZXJyb3JzXCIpICYmIF8udmFsdWVzKHRoaXMubW9kZWwuZ2V0KFwiZXJyb3JzXCIpKS5sZW5ndGggPiAwKVxuXHRcdFx0dGhpcy51aS5lcnJvckljb24ucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0aWYgKHRoaXMuaXNPbGQoKSAmJiB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhdHRhY2htZW50SGlkZVN0YXRlXCIpID09PSBcInRydWVcIilcblx0XHRcdHRoaXMuJGVsLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0b25Nb3VzZU92ZXI6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRpZiAoIXRoaXMuaXNFbXB0eSgpICYmICF0aGlzLmlzQ29tcG91bmQoKSlcblx0XHRcdGV2ZW50QnVzLnRyaWdnZXIoXCJhdHRhY2htZW50Om1vdXNlb3ZlclwiLCB0aGlzLmdldFNlbGVjdG9yKCkpO1xuXHR9LFxuXG5cdG9uTW91c2VPdXQ6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRpZiAoIXRoaXMuaXNFbXB0eSgpKVxuXHRcdFx0ZXZlbnRCdXMudHJpZ2dlcihcImF0dGFjaG1lbnQ6bW91c2VvdXRcIiwgdGhpcy5nZXRTZWxlY3RvcigpKTtcblx0fSxcblxuXHR1cGRhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudXBkYXRlSWNvbigpO1xuXHRcdHRoaXMudXBkYXRlRm9jdXMoKTtcblx0XHR0aGlzLnVwZGF0ZURyYWdnYWJsZSgpO1xuXHRcdHRoaXMudXBkYXRlVG9vbHRpcHMoKTtcblxuXHRcdGlmICh0aGlzLm1vZGVsICYmIHRoaXMubW9kZWwuZ2V0KFwiZXJyb3JzXCIpICYmIF8udmFsdWVzKHRoaXMubW9kZWwuZ2V0KFwiZXJyb3JzXCIpKS5sZW5ndGggPiAwKSB7XG5cdFx0XHR0aGlzLnNhdmVkKCk7XG5cdFx0XHR0aGlzLnVpLmVycm9ySWNvbi5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIFRPVUNIUE9JTlQ6IFJFU09VUkNFIFRZUEVcblx0dXBkYXRlSWNvbjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLnVpLmljb24uYWRkQ2xhc3MpXG5cdFx0XHRyZXR1cm47XG5cblx0XHQvLyBJbml0aWFsaXNlIHRoZSBpY29uIGNsYXNzZXM7IGxlYXZlIHRoZSBwcmVmaXggZW1wdHkgaWYgeW91IHdpc2ggdG8gZW1wbG95IEZvbnQgQXdlc29tZSBnbHlwaHNcblx0XHRsZXQgc2luZ2xlSWNvblByZWZpeCA9IFwiXCI7XG5cdFx0bGV0IG11bHRpSWNvblByZWZpeCA9IFwiXCI7XG5cblx0XHRpZiAoc2V0dGluZ3MuY29udGVudEljb25zID09PSBcImltZ1wiKSB7XG5cdFx0XHRzaW5nbGVJY29uUHJlZml4ID0gXCJpbWctXCI7XG5cdFx0XHRtdWx0aUljb25QcmVmaXggPSBcImltZy1cIjtcblx0XHR9XG5cblx0XHRjb25zdCBtdWx0aUljb24gPSBcImZhLXN0YXJcIjtcblxuXHRcdGNvbnN0IHJlc291cmNlVHlwZSA9IHRoaXMuZ2V0UmVzb3VyY2VUeXBlKCk7XG5cblx0XHRpZiAoIXJlc291cmNlVHlwZSlcblx0XHRcdHJldHVybjtcblxuXHRcdGNvbnN0IHNpbmdsZUljb24gPSBBcHAubWFwUmVzb3VyY2VUb0ljb24ocmVzb3VyY2VUeXBlKTtcblxuXHRcdC8vIElmIHRoaXMgaXMgYSBjb21wb3VuZCBhdHRhY2htZW50IHZpZXcuLi5cblx0XHRpZiAodGhpcy5pc0NvbXBvdW5kKCkpIHtcblx0XHRcdC8vIC4uLnRoZW4gc2V0IHRoZSBtdWx0aS1pY29uXG5cdFx0XHR0aGlzLnVpLmljb24ucmVtb3ZlQ2xhc3Moc2luZ2xlSWNvblByZWZpeCArIHNpbmdsZUljb24pO1xuXHRcdFx0dGhpcy51aS5pY29uLmFkZENsYXNzKG11bHRpSWNvblByZWZpeCArIG11bHRpSWNvbik7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0Ly8gLi4ub3RoZXJ3aXNlIHNldCB0aGUgc2luZ2xlIGljb25cblx0XHRcdHRoaXMudWkuaWNvbi5yZW1vdmVDbGFzcyhtdWx0aUljb25QcmVmaXggKyBtdWx0aUljb24pO1xuXHRcdFx0dGhpcy51aS5pY29uLmFkZENsYXNzKHNpbmdsZUljb25QcmVmaXggKyBzaW5nbGVJY29uKTtcblxuXHRcdFx0Ly8gRGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRvIGhpZGUgdGhlICdidXN5JyBzcGlubmVyXG5cdFx0XHRpZiAodGhpcy5pc1NhdmVkKCkpIHtcblx0XHRcdFx0dGhpcy51aS5pY29uLnJlbW92ZUNsYXNzKFwiYnVzeVwiKTtcblx0XHRcdFx0dGhpcy51aS5zcGlubmVyLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCF0aGlzLkF0dGFjaG1lbnRDb2xsZWN0aW9uLmF0KDApLmdldChcInZpc2libGVcIikpXG5cdFx0XHRcdHRoaXMudWkudmlzaWJsZUljb24ucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0XHRpZiAodGhpcy5BdHRhY2htZW50Q29sbGVjdGlvbi5hdCgwKS5nZXQoXCJsb2NrZWRcIikpXG5cdFx0XHRcdHRoaXMudWkubG9ja2VkSWNvbi5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0fVxuXG5cdFx0Ly8gUG9saXNoIHRoZSBpY29uXG5cdFx0dGhpcy51aS5pY29uLmFkZENsYXNzKFwicG9saXNoZWRcIik7XG5cdFx0dGhpcy51aS5pY29uLnJlbW92ZUNsYXNzKFwiZmFkZWRcIik7XG5cblx0XHQvLyBIaWRlIHRoZSBhZ2UgYW5kIG5hdGlvbmFsaXR5IGljb25zXG5cdFx0dGhpcy51aS5hZ2VJY29uLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLm5hdGlvbmFsaXR5SWNvbi5hZGRDbGFzcyhcImhpZGVcIik7XG5cblx0XHRpZiAodGhpcy5jb250YWluc09sZEF0dGFjaG1lbnQoKSkge1xuXHRcdFx0Ly8gRmFkZSB0aGUgaWNvblxuXHRcdFx0dGhpcy51aS5pY29uLmFkZENsYXNzKFwiZmFkZWRcIik7XG5cdFx0XHR0aGlzLnVpLmljb24ucmVtb3ZlQ2xhc3MoXCJwb2xpc2hlZFwiKTtcblxuXHRcdFx0Ly8gU2hvdyB0aGUgYWdlIGdseXBoXG5cdFx0XHR0aGlzLnVpLmFnZUljb24ucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNvbnRhaW5zRm9yZWlnbkF0dGFjaG1lbnQoKSkge1xuXHRcdFx0Ly8gRmFkZSB0aGUgaWNvblxuXHRcdFx0dGhpcy51aS5pY29uLmFkZENsYXNzKFwiZmFkZWRcIik7XG5cdFx0XHR0aGlzLnVpLmljb24ucmVtb3ZlQ2xhc3MoXCJwb2xpc2hlZFwiKTtcblxuXHRcdFx0Ly8gU2hvdyB0aGUgbmF0aW9uYWxpdHkgZ2x5cGhcblx0XHRcdHRoaXMudWkubmF0aW9uYWxpdHlJY29uLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuY29udGFpbnNPbGRBdHRhY2htZW50KCkgJiYgIXRoaXMuY29udGFpbnNGb3JlaWduQXR0YWNobWVudCgpICYmIHRoaXMuY29udGFpbnNTaGFyZWRBdHRhY2htZW50KCkpXG5cdFx0XHR0aGlzLnVpLnNoYXJlZEljb24ucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdHVwZGF0ZUZvY3VzOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIXRoaXMuaXNDb21wb3VuZCgpICYmICh0aGlzLkF0dGFjaG1lbnRDb2xsZWN0aW9uLmF0KDApICYmIHRoaXMuQXR0YWNobWVudENvbGxlY3Rpb24uYXQoMCkuZm9jdXNlZCkpIHtcblx0XHRcdGlmICh0aGlzLnVpLmljb24uYWRkQ2xhc3MpXG5cdFx0XHRcdHRoaXMudWkuaWNvbi5hZGRDbGFzcyhcImF0dGFjaG1lbnQtaWNvbi1mb2N1c2VkXCIpO1xuXHRcdFx0aWYgKHRoaXMudWkuaGlnaGxpZ2h0T3ZlcmxheS5hZGRDbGFzcylcblx0XHRcdFx0dGhpcy51aS5oaWdobGlnaHRPdmVybGF5LmFkZENsYXNzKFwiYW5pbWF0ZVwiKTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAodGhpcy51aS5pY29uLnJlbW92ZUNsYXNzKSB7IHRoaXMudWkuaWNvbi5yZW1vdmVDbGFzcyhcImF0dGFjaG1lbnQtaWNvbi1mb2N1c2VkXCIpOyB9XG5cdH0sXG5cblx0dXBkYXRlRHJhZ2dhYmxlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmRyYWdnYWJsZSA9IHRoaXMuY29udGFpbnNOZXdBdHRhY2htZW50KCk7XG5cdH0sXG5cblx0dXBkYXRlVG9vbHRpcHM6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLkF0dGFjaG1lbnRUb29sdGlwKSB7XG5cdFx0XHRpZiAodGhpcy5pc0NvbXBvdW5kKCkpXG5cdFx0XHRcdHRoaXMuQXR0YWNobWVudFRvb2x0aXAudG9vbHRpcC5zZXRDb250ZW50KHRoaXMuQXR0YWNobWVudFRvb2x0aXAudmlldy4kZWwuZ2V0KDApKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5BdHRhY2htZW50VG9vbHRpcCA9IHRoaXMuZGVzdHJveVRvb2x0aXAodGhpcy5BdHRhY2htZW50VG9vbHRpcCk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuVXBsb2FkVG9vbHRpcCkge1xuXHRcdFx0aWYgKHRoaXMuaXNDb21wb3VuZCgpKVxuXHRcdFx0XHR0aGlzLlVwbG9hZFRvb2x0aXAudG9vbHRpcC5zZXRDb250ZW50KHRoaXMuVXBsb2FkVG9vbHRpcC52aWV3LiRlbC5nZXQoMCkpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLlVwbG9hZFRvb2x0aXAgPSB0aGlzLmRlc3Ryb3lUb29sdGlwKHRoaXMuVXBsb2FkVG9vbHRpcCk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuRGV0YWlsVG9vbHRpcCAmJiAhXy5maW5kKHRoaXMuQXR0YWNobWVudENvbGxlY3Rpb24ubW9kZWxzLCBtb2RlbCA9PiAobW9kZWwuZ2V0KFwiX2lkXCIpID09PSB0aGlzLkRldGFpbFRvb2x0aXAubW9kZWwuZ2V0KFwiX2lkXCIpKSkpXG5cdFx0XHR0aGlzLkRldGFpbFRvb2x0aXAgPSB0aGlzLmRlc3Ryb3lUb29sdGlwKHRoaXMuRGV0YWlsVG9vbHRpcCk7XG5cdH0sXG5cblx0c2hvd1Rvb2x0aXA6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0aWYgKGF0dGFjaG1lbnRzU2F2aW5nID4gMCkge1xuXHRcdFx0aWYgKCF0aGlzLlVwbG9hZFRvb2x0aXApXG5cdFx0XHRcdHRoaXMuVXBsb2FkVG9vbHRpcCA9IHt9O1xuXG5cdFx0XHQvLyBTaG93IHRoZSB1cGxvYWQgcHJvZ3Jlc3MgbW9kYWxcblx0XHRcdHRoaXMuVXBsb2FkVG9vbHRpcC52aWV3ID0gbmV3IEF0dGFjaG1lbnRzVXBsb2FkVmlldyh7IGNvbGxlY3Rpb246IHRoaXMuQXR0YWNobWVudENvbGxlY3Rpb24gfSk7XG5cdFx0XHR0aGlzLlVwbG9hZFRvb2x0aXAudmlldy5yZW5kZXIoKTtcblxuXHRcdFx0dGlwcHkodGhpcy4kZWwuZ2V0KDApLCB7XG5cdFx0XHRcdHRoZW1lOiBcImxpZ2h0LWdyZXlcIixcblx0XHRcdFx0cGxhY2VtZW50OiBcImxlZnRcIixcblx0XHRcdFx0aW50ZXJhY3RpdmU6IHRydWUsXG5cdFx0XHRcdGNvbnRlbnQ6IHRoaXMuVXBsb2FkVG9vbHRpcC52aWV3LiRlbC5nZXQoMCksXG5cdFx0XHRcdHRyaWdnZXI6IFwibWFudWFsXCIsXG5cdFx0XHRcdGFycm93OiB0cnVlLFxuXHRcdFx0XHRkZWxheTogMSxcblx0XHRcdFx0ZGlzdGFuY2U6IDIwLFxuXHRcdFx0XHRvblNob3c6IHRvb2x0aXAgPT4geyAkKHRvb2x0aXAucG9wcGVyKS5hZGRDbGFzcyhcInRpcHB5LWF0dGFjaG1lbnRcIik7IH0sXG5cdFx0XHRcdG9uU2hvd246ICgpID0+IHsgZXZlbnRCdXMudHJpZ2dlcihcImF0dGFjaG1lbnQ6dG9vbHRpcFwiLCB0aGlzKTsgfSxcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLlVwbG9hZFRvb2x0aXAudG9vbHRpcCA9IHRoaXMuJGVsLmdldCgwKS5fdGlwcHk7XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdC8vIHNob3coKSBkaWQgbm90IHdvcmssIGNhbGxpbmcgaXQgYXN5bmMgbWFrZXMgaXQgd29ya1xuXHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRpZiAodGhpcy5VcGxvYWRUb29sdGlwLnRvb2x0aXApXG5cdFx0XHRcdFx0XHR0aGlzLlVwbG9hZFRvb2x0aXAudG9vbHRpcC5zaG93KCk7XG5cdFx0XHRcdH0sIDApO1xuXHRcdFx0fVxuXHRcdFx0Y2F0Y2ggKGUpIHtcblx0XHRcdFx0Ly8gRG9uJ3QgY2FyZT9cblx0XHRcdFx0dGhpcy5VcGxvYWRUb29sdGlwID0gbnVsbDtcblx0XHRcdH1cblx0XHR9XG5cdFx0ZWxzZVxuXHRcdGlmIChtb2RlbCkge1xuXHRcdFx0aWYgKCF0aGlzLkRldGFpbFRvb2x0aXApIHtcblx0XHRcdFx0dGhpcy5EZXRhaWxUb29sdGlwID0ge307XG5cblx0XHRcdFx0dGhpcy5EZXRhaWxUb29sdGlwLm1vZGVsID0gbW9kZWw7XG5cdFx0XHRcdHRoaXMuRGV0YWlsVG9vbHRpcC52aWV3ID0gbmV3IEF0dGFjaG1lbnREZXRhaWxWaWV3KHsgYXR0YWNobWVudE1vZGVsOiBtb2RlbCB9KTtcblx0XHRcdFx0dGhpcy5EZXRhaWxUb29sdGlwLnZpZXcucmVuZGVyKCk7XG5cblx0XHRcdFx0dGlwcHkodGhpcy4kZWwuZ2V0KDApLCB7XG5cdFx0XHRcdFx0dGhlbWU6IFwibGlnaHQtZ3JleVwiLFxuXHRcdFx0XHRcdHBsYWNlbWVudDogXCJsZWZ0XCIsXG5cdFx0XHRcdFx0YXJyb3c6IHRydWUsXG5cdFx0XHRcdFx0aW50ZXJhY3RpdmU6IHRydWUsXG5cdFx0XHRcdFx0Y29udGVudDogdGhpcy5EZXRhaWxUb29sdGlwLnZpZXcuJGVsLmdldCgwKSxcblx0XHRcdFx0XHR0cmlnZ2VyOiBcIm1hbnVhbFwiLFxuXHRcdFx0XHRcdGRlbGF5OiAxLFxuXHRcdFx0XHRcdGRpc3RhbmNlOiAyMCxcblx0XHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0XHRvblNob3duOiAoKSA9PiB7IGV2ZW50QnVzLnRyaWdnZXIoXCJhdHRhY2htZW50OnRvb2x0aXBcIiwgdGhpcyk7IH0sXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHRoaXMuRGV0YWlsVG9vbHRpcC50b29sdGlwID0gdGhpcy4kZWwuZ2V0KDApLl90aXBweTtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdGlmICh0aGlzLkRldGFpbFRvb2x0aXAubW9kZWwuZ2V0KFwiX2lkXCIpICE9PSBtb2RlbC5nZXQoXCJfaWRcIikpIHtcblx0XHRcdFx0dGhpcy5EZXRhaWxUb29sdGlwLm1vZGVsLnRyaWdnZXIoXCJsb3dsaWdodFwiKTtcblxuXHRcdFx0XHR0aGlzLkRldGFpbFRvb2x0aXAudG9vbHRpcC5oaWRlKCk7XG5cdFx0XHRcdHRoaXMuRGV0YWlsVG9vbHRpcC52aWV3ID0gbmV3IEF0dGFjaG1lbnREZXRhaWxWaWV3KHsgYXR0YWNobWVudE1vZGVsOiBtb2RlbCB9KTtcblx0XHRcdFx0dGhpcy5EZXRhaWxUb29sdGlwLnRvb2x0aXAuc2V0Q29udGVudCh0aGlzLkRldGFpbFRvb2x0aXAudmlldy5yZW5kZXIoKS4kZWwuZ2V0KDApKTtcblx0XHRcdFx0dGhpcy5EZXRhaWxUb29sdGlwLm1vZGVsID0gbW9kZWw7XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdC8vIHNob3coKSBkaWQgbm90IHdvcmssIGNhbGxpbmcgaXQgYXN5bmMgbWFrZXMgaXQgd29ya1xuXHRcdFx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRpZiAodGhpcy5EZXRhaWxUb29sdGlwLnRvb2x0aXApXG5cdFx0XHRcdFx0XHR0aGlzLkRldGFpbFRvb2x0aXAudG9vbHRpcC5zaG93KCk7XG5cdFx0XHRcdH0sIDApO1xuXHRcdFx0fVxuXHRcdFx0Y2F0Y2ggKGUpIHtcblx0XHRcdFx0Ly8gRG9uJ3QgY2FyZT9cblx0XHRcdFx0dGhpcy5EZXRhaWxUb29sdGlwID0gbnVsbDtcblx0XHRcdH1cblx0XHR9XG5cdFx0ZWxzZVxuXHRcdGlmICh0aGlzLmlzQ29tcG91bmQoKSkge1xuXHRcdFx0aWYgKCF0aGlzLkF0dGFjaG1lbnRUb29sdGlwKSB7XG5cdFx0XHRcdHRoaXMuQXR0YWNobWVudFRvb2x0aXAgPSB7fTtcblxuXHRcdFx0XHRjb25zdCBBdHRhY2htZW50TGlzdFZpZXcgPSBCYWNrYm9uZS5NYXJpb25ldHRlLkNvbGxlY3Rpb25WaWV3LmV4dGVuZCh7XG5cdFx0XHRcdFx0dGFnTmFtZTogXCJkaXZcIixcblx0XHRcdFx0XHRjbGFzc05hbWU6IFwiYXR0YWNobWVudC1saXN0XCIsXG5cblx0XHRcdFx0XHRjaGlsZFZpZXc6IENvbXBvdW5kQXR0YWNobWVudFZpZXcsXG5cblx0XHRcdFx0XHR0ZW1wbGF0ZTogZmFsc2UsXG5cblx0XHRcdFx0XHRidWlsZENoaWxkVmlldzogZnVuY3Rpb24oY2hpbGQsIENoaWxkVmlld0NsYXNzLCBjaGlsZFZpZXdPcHRpb25zKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBvcHRpb25zID0gXy5leHRlbmQoeyBtb2RlbDogY2hpbGQsIHBhcmVudDogdGhpcyB9LCBjaGlsZFZpZXdPcHRpb25zKTtcblxuXHRcdFx0XHRcdFx0Y29uc3QgdmlldyA9IG5ldyBDaGlsZFZpZXdDbGFzcyhvcHRpb25zKTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIHZpZXc7XG5cdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdG9uQWRkQ2hpbGQ6IGZ1bmN0aW9uKGNvbGxlY3Rpb25WaWV3LCBjaGlsZFZpZXcpIHtcblx0XHRcdFx0XHRcdGNoaWxkVmlldy5vblJlbmRlcigpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGlmIChhdHRhY2htZW50c1NhdmluZyA+IDApIHtcblx0XHRcdFx0XHQvLyBTaG93IHRoZSB1cGxvYWQgcHJvZ3Jlc3MgbW9kYWxcblx0XHRcdFx0XHR0aGlzLkF0dGFjaG1lbnRUb29sdGlwLnZpZXcgPSBuZXcgQXR0YWNobWVudHNVcGxvYWRWaWV3KHsgY29sbGVjdGlvbjogdGhpcy5BdHRhY2htZW50Q29sbGVjdGlvbiB9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHQvLyBzaG93IEF0dGFjaG1lbnRMaXN0Vmlld1xuXHRcdFx0XHRcdHRoaXMuQXR0YWNobWVudFRvb2x0aXAudmlldyA9IG5ldyBBdHRhY2htZW50TGlzdFZpZXcoeyBjb2xsZWN0aW9uOiB0aGlzLkF0dGFjaG1lbnRDb2xsZWN0aW9uIH0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5BdHRhY2htZW50VG9vbHRpcC52aWV3LnJlbmRlcigpO1xuXHRcdFx0XHR0aXBweSh0aGlzLiRlbC5nZXQoMCksIHtcblx0XHRcdFx0XHR0aGVtZTogXCJsaWdodC1ncmV5XCIsXG5cdFx0XHRcdFx0cGxhY2VtZW50OiBcInJpZ2h0XCIsXG5cdFx0XHRcdFx0ZmxpcDogZmFsc2UsXG5cdFx0XHRcdFx0YXJyb3c6IHRydWUsXG5cdFx0XHRcdFx0aW50ZXJhY3RpdmU6IHRydWUsXG5cdFx0XHRcdFx0Y29udGVudDogdGhpcy5BdHRhY2htZW50VG9vbHRpcC52aWV3LiRlbC5nZXQoMCksXG5cdFx0XHRcdFx0dHJpZ2dlcjogXCJtYW51YWxcIixcblx0XHRcdFx0XHRkZWxheTogMSxcblx0XHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0XHRvblNob3c6IHRvb2x0aXAgPT4geyAkKHRvb2x0aXAucG9wcGVyKS5hZGRDbGFzcyhcInRpcHB5LWF0dGFjaG1lbnRcIik7IH0sXG5cdFx0XHRcdFx0b25TaG93bjogKCkgPT4geyBldmVudEJ1cy50cmlnZ2VyKFwiYXR0YWNobWVudDp0b29sdGlwXCIsIHRoaXMpOyB9LFxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR0aGlzLkF0dGFjaG1lbnRUb29sdGlwLnRvb2x0aXAgPSB0aGlzLiRlbC5nZXQoMCkuX3RpcHB5O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5BdHRhY2htZW50VG9vbHRpcClcblx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7IHRoaXMuQXR0YWNobWVudFRvb2x0aXAudG9vbHRpcC5zaG93KCk7IH0sIDApO1xuXHRcdH1cblx0XHRlbHNlIGlmICh0aGlzLmlzUGFydE9mKCkpIHtcblx0XHRcdHRoaXMuQXR0YWNobWVudENvbGxlY3Rpb24uYXQoMCkudHJpZ2dlcihcInRvb2x0aXA6c2hvd1wiLCB0aGlzLkF0dGFjaG1lbnRDb2xsZWN0aW9uLmF0KDApKTtcblx0XHRcdHRoaXMuQXR0YWNobWVudENvbGxlY3Rpb24uYXQoMCkudHJpZ2dlcihcImhpZ2hsaWdodFwiKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLnNob3dUb29sdGlwKHRoaXMuQXR0YWNobWVudENvbGxlY3Rpb24uYXQoMCkpO1xuXHRcdH1cblx0fSxcblxuXHRoaWRlVG9vbHRpcHM6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLkRldGFpbFRvb2x0aXApIHtcblx0XHRcdHRoaXMuRGV0YWlsVG9vbHRpcC5tb2RlbC50cmlnZ2VyKFwibG93bGlnaHRcIik7XG5cdFx0XHR0aGlzLkRldGFpbFRvb2x0aXAgPSB0aGlzLmRlc3Ryb3lUb29sdGlwKHRoaXMuRGV0YWlsVG9vbHRpcCk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuQXR0YWNobWVudFRvb2x0aXApXG5cdFx0XHR0aGlzLkF0dGFjaG1lbnRUb29sdGlwID0gdGhpcy5kZXN0cm95VG9vbHRpcCh0aGlzLkF0dGFjaG1lbnRUb29sdGlwKTtcblx0fSxcblxuXHRkZXN0cm95VG9vbHRpcDogZnVuY3Rpb24oY29udGV4dCkge1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAoY29udGV4dC50b29sdGlwICYmICFjb250ZXh0LnRvb2x0aXAuZGVzdHJveWVkICYmICFjb250ZXh0LnRvb2x0aXAuZGVzdHJveWluZylcblx0XHRcdFx0Y29udGV4dC50b29sdGlwLmRlc3Ryb3koKTtcblx0XHR9XG5cdFx0Y2F0Y2ggKGUpIHtcblx0XHRcdC8vIERvbid0IGNhcmVcblx0XHR9XG5cblx0XHRjb250ZXh0LnRvb2x0aXAgPSBudWxsO1xuXG5cdFx0aWYgKGNvbnRleHQudmlldyAmJiAhY29udGV4dC52aWV3LmlzRGVzdHJveWVkKCkpXG5cdFx0XHRjb250ZXh0LnZpZXcuZGVzdHJveSgpO1xuXG5cdFx0Y29udGV4dC52aWV3ID0gbnVsbDtcblxuXHRcdHJldHVybiBudWxsO1xuXHR9LFxuXG5cdG9uSGlnaGxpZ2h0T3ZlcmxheUFuaW1hdGlvbkVuZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5oaWdobGlnaHRPdmVybGF5LnJlbW92ZUNsYXNzKFwiYW5pbWF0ZVwiKTtcblx0fSxcblxuXHR0b2dnbGVUb29sdGlwOiBmdW5jdGlvbihtb2RlbCwgaW5kZXgpIHtcblx0XHR0aGlzLmhpZGVUb29sdGlwKCk7XG5cdFx0dGhpcy5zaG93VG9vbHRpcChtb2RlbCwgaW5kZXgpO1xuXHR9LFxuXG5cdGhpZ2hsaWdodDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5oaWdobGlnaHRPdmVybGF5LmFkZENsYXNzKFwiaGlnaGxpZ2h0XCIpO1xuXHR9LFxuXG5cdGxvd2xpZ2h0OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmhpZ2hsaWdodE92ZXJsYXkucmVtb3ZlQ2xhc3MoXCJoaWdobGlnaHRcIik7XG5cdH0sXG5cblx0b25Nb3VzZURvd246IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IG1vdXNlRG93blN0YXJ0ID0gbW9tZW50KCk7XG5cdFx0bGV0IGRyYWdTdGFydGVkID0gZmFsc2U7XG5cdFx0bGV0IGRyYWdnaW5nRWxlbWVudCwgZGF0YTtcblxuXHRcdGlmICh0aGlzLmRyYWdnYWJsZSkge1xuXHRcdFx0JChcImJvZHlcIikub24oXCJzZWxlY3RzdGFydC5kcmFnZ2luZ1Jlc291cmNlXCIsIGUgPT4gZS5wcmV2ZW50RGVmYXVsdCgpKTtcblxuXHRcdFx0Ly8gaWYgc3RpbGwgdXBsb2FkaW5nLCBpZ25vcmUgZHJhZ1N0YXJ0ZWRcblx0XHRcdGNvbnN0IHNhdmluZ0F0dGFjaG1lbnRzID0gXy5maWx0ZXIodGhpcy5BdHRhY2htZW50Q29sbGVjdGlvbi5tb2RlbHMsIGF0dGFjaG1lbnQgPT4gYXR0YWNobWVudC5nZXQoXCJzYXZpbmdcIikpO1xuXG5cdFx0XHRpZiAoc2F2aW5nQXR0YWNobWVudHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdCQoXCJib2R5XCIpLm9uKFwibW91c2Vtb3ZlLmRyYWdTdGFydGVkXCIsICgpID0+IHtcblx0XHRcdFx0XHRpZiAobW9tZW50KCkuZGlmZihtb3VzZURvd25TdGFydCwgXCJtc1wiKSA8PSAxMzApXG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHQkKFwiYm9keVwiKS5vZmYoXCJtb3VzZW1vdmUuZHJhZ1N0YXJ0ZWRcIik7XG5cdFx0XHRcdFx0ZHJhZ1N0YXJ0ZWQgPSB0cnVlO1xuXG5cdFx0XHRcdFx0Ly8gVHJhbnNmZXIgYWxsIG9mIHRoZSBhdHRhY2htZW50IG1vZGVsIElEcyB0byB0aGUgZHJvcCB0YXJnZXRcblx0XHRcdFx0XHRkYXRhID0ge1xuXHRcdFx0XHRcdFx0dHlwZTogXCJhdHRhY2htZW50XCIsXG5cdFx0XHRcdFx0XHRhdHRhY2htZW50SWRlbnRpZmllcnM6IFtdLFxuXHRcdFx0XHRcdFx0Y2lkOiB0aGlzLmNpZCxcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0Xy5lYWNoKHRoaXMuQXR0YWNobWVudENvbGxlY3Rpb24ubW9kZWxzLCBtb2RlbCA9PiB7XG5cdFx0XHRcdFx0XHRkYXRhLmF0dGFjaG1lbnRJZGVudGlmaWVycy5wdXNoKG1vZGVsLmdldChcIl9pZFwiKSk7XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRjb25zdCBEcmFnZ2luZ0VsZW1lbnQgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0XHRcdFx0XHRcdGNsYXNzTmFtZTogXCJscC1kcmFnZ2luZy1lbGVtZW50XCIsXG5cdFx0XHRcdFx0XHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9jb25zb2xlL2xlYXJuaW5nUGF0aE5vZGUubnVualwiKS5kcmFnZ2luZ0VsZW1lbnQsXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRjb25zdCByZXNvdXJjZURhdGEgPSB7XG5cdFx0XHRcdFx0XHR0aXRsZTogXCJcIixcblx0XHRcdFx0XHRcdGNhdGVnb3J5OiBcImF0dGFjaG1lbnRcIixcblx0XHRcdFx0XHRcdHJlc291cmNlVHlwZTogXCJcIixcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0aWYgKHRoaXMuQXR0YWNobWVudENvbGxlY3Rpb24ubW9kZWxzLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHRcdHJlc291cmNlRGF0YS50aXRsZSA9IHRoaXMuQXR0YWNobWVudENvbGxlY3Rpb24ubW9kZWxzLmxlbmd0aCArIFwiIGF0dGFjaG1lbnRzXCI7XG5cdFx0XHRcdFx0XHRyZXNvdXJjZURhdGEucmVzb3VyY2VUeXBlID0gXCJleHBhbmRlZFwiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlIGlmICh0aGlzLkF0dGFjaG1lbnRDb2xsZWN0aW9uLm1vZGVscy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGF0dGFjaG1lbnQgPSB0aGlzLkF0dGFjaG1lbnRDb2xsZWN0aW9uLm1vZGVsc1swXTtcblx0XHRcdFx0XHRcdHJlc291cmNlRGF0YS50aXRsZSA9IGF0dGFjaG1lbnQuZ2V0KFwidGl0bGVcIik7XG5cdFx0XHRcdFx0XHRyZXNvdXJjZURhdGEucmVzb3VyY2VUeXBlID0gYXR0YWNobWVudC5nZXQoXCJyZXNvdXJjZVR5cGVcIik7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgZHJhZ2dpbmdOb2RlID0gbmV3IERyYWdnaW5nRWxlbWVudCh7XG5cdFx0XHRcdFx0XHRtb2RlbDogbmV3IEJhY2tib25lLk1vZGVsKHJlc291cmNlRGF0YSksXG5cdFx0XHRcdFx0fSkucmVuZGVyKCk7XG5cblx0XHRcdFx0XHRkcmFnZ2luZ0VsZW1lbnQgPSBkcmFnZ2luZ05vZGUuJGVsWzBdO1xuXHRcdFx0XHRcdGRyYWdnaW5nRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcblx0XHRcdFx0XHRkcmFnZ2luZ0VsZW1lbnQuc3R5bGUuekluZGV4ID0gMTAwMDtcblxuXHRcdFx0XHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLlJlc291cmNlRHJhZ1N0YXJ0KTtcblx0XHRcdFx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5BdHRhY2htZW50RHJhZ1N0YXJ0LCBkYXRhKTtcblxuXHRcdFx0XHRcdGNvbnN0IG1vdmVBdCA9IGUgPT4ge1xuXHRcdFx0XHRcdFx0ZHJhZ2dpbmdFbGVtZW50LnN0eWxlLmxlZnQgPSAoZS5vcmlnaW5hbEV2ZW50LnBhZ2VYKSArIFwicHhcIjtcblx0XHRcdFx0XHRcdGRyYWdnaW5nRWxlbWVudC5zdHlsZS50b3AgPSAoZS5vcmlnaW5hbEV2ZW50LnBhZ2VZKSArIFwicHhcIjtcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0JChcImJvZHlcIikuYXBwZW5kKGRyYWdnaW5nRWxlbWVudCk7XG5cdFx0XHRcdFx0JChcImJvZHlcIikub24oXCJtb3VzZW1vdmUubW92ZURyYWdnaW5nRWxlbWVudFwiLCBtb3ZlQXQpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBIYW5kbGUgdGhlIGRyb3Bcblx0XHQkKFwiYm9keVwiKS5vbihcIm1vdXNldXAucmVzb3VyY2VEcmFnRW5kZWRcIiwgZSA9PiB7XG5cdFx0XHQkKFwiYm9keVwiKS5vZmYoXCJzZWxlY3RzdGFydC5kcmFnZ2luZ1Jlc291cmNlXCIpO1xuXHRcdFx0JChcImJvZHlcIikub2ZmKFwibW91c2Vtb3ZlLm1vdmVEcmFnZ2luZ0VsZW1lbnRcIik7XG5cdFx0XHQkKFwiYm9keVwiKS5vZmYoXCJtb3VzZXVwLnJlc291cmNlRHJhZ0VuZGVkXCIpO1xuXG5cdFx0XHQvLyBTaG93IHRvb2x0aXAgaWYgbW91c2Ugd2FzIHJlbGVhc2VkIHNob3J0bHkgYWZ0ZXIgYmVpbmcgcHJlc3NlZFxuXHRcdFx0aWYgKCFkcmFnU3RhcnRlZCkge1xuXHRcdFx0XHQkKFwiYm9keVwiKS5vZmYoXCJtb3VzZW1vdmUuZHJhZ1N0YXJ0ZWRcIik7XG5cdFx0XHRcdHJldHVybiB0aGlzLnNob3dUb29sdGlwKCk7XG5cdFx0XHR9XG5cblx0XHRcdGRyYWdnaW5nRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRyYWdnaW5nRWxlbWVudCk7XG5cdFx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5BdHRhY2htZW50RHJhZ0VuZCk7XG5cdFx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5SZXNvdXJjZURyYWdFbmQpO1xuXG5cdFx0XHQvLyBDaGVjayBpZiBtb3VzZXVwIHdhcyBvbiB0aGUgYmluIGljb24uXG5cdFx0XHRjb25zdCBiaW5JY29uWCA9ICQoXCJkaXYuYXR0YWNobWVudC1iaW5cIikucG9zaXRpb24oKS5sZWZ0O1xuXHRcdFx0Y29uc3QgYmluSWNvblkgPSAkKFwiZGl2LmF0dGFjaG1lbnQtYmluXCIpLnBvc2l0aW9uKCkudG9wO1xuXHRcdFx0Y29uc3QgYmluSWNvbkhlaWdodCA9ICQoXCJkaXYuYXR0YWNobWVudC1iaW5cIikuaGVpZ2h0KCk7XG5cdFx0XHRjb25zdCBiaW5JY29uV2lkdGggPSAkKFwiZGl2LmF0dGFjaG1lbnQtYmluXCIpLndpZHRoKCk7XG5cdFx0XHRjb25zdCBkZWxldGVSZXNvdXJjZSA9IChlLnBhZ2VYID49IGJpbkljb25YICYmIGUucGFnZVggPD0gKGJpbkljb25YICsgYmluSWNvbldpZHRoKSkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdChlLnBhZ2VZID49IGJpbkljb25ZICYmIGUucGFnZVkgPD0gKGJpbkljb25ZICsgYmluSWNvbkhlaWdodCkpO1xuXG5cdFx0XHRpZiAoZGVsZXRlUmVzb3VyY2UpXG5cdFx0XHRcdGV2ZW50QnVzLnRyaWdnZXIoXCJhdHRhY2htZW50czpkZWxldGU6XCIgKyBkYXRhLmNpZCk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLlJlc291cmNlRHJhZ0Ryb3AsIGUsIGRhdGEpO1xuXHRcdH0pO1xuXHR9LFxuXG5cdGRlbGV0ZVNlbGY6IGZ1bmN0aW9uKCkge1xuXHRcdCQoXCIjaWUtcGlwXCIpLnJlbW92ZUNsYXNzKFwiaW1nLVwiICsgJChcIiNpZS1waXBcIikuZGF0YShcImljb25cIikpLmFkZENsYXNzKFwiaGlkZVwiKTtcblxuXHRcdC8vIElmIHRoZSBhdHRhY2htZW50IHdhcyBtb3ZlZCAodG8gdGhlIGR1c3RiaW4pLi4uXG5cdFx0Ly9pZiAoZXZlbnQub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9PT0gXCJtb3ZlXCIpXG5cdFx0Ly97XG5cdFx0Ly8gLi4udGhlbiBhdXRvbWF0aWNhbGx5IHJlbW92ZSB0aGUgYXR0YWNobWVudFxuXHRcdGNvbnN0IG11bHRpID0gdGhpcy5BdHRhY2htZW50Q29sbGVjdGlvbi5sZW5ndGggPiAxO1xuXG5cdFx0Y29uc3QgdXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cblx0XHR0aGlzLkF0dGFjaG1lbnRDb2xsZWN0aW9uLmVhY2gobW9kZWwgPT4ge1xuXHRcdFx0Ly8gQ2hlY2sgZm9yIHNvbWUgc3BlY2lhbCBjYXNlcyBmaXJzdFxuXHRcdFx0aWYgKCFyZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmdyb3Vwcy5hbGwsIHVzZXIpICYmIChtb2RlbC5pc09sZCgpIHx8IG1vZGVsLmlzRm9yZWlnbigpIHx8IG1vZGVsLmlzU2hhcmVkKCkpKSB7XG5cdFx0XHRcdGlmICghbXVsdGkpIHtcblx0XHRcdFx0XHRjb25zdCBtb2RhbCA9IG5ldyBTbWFsbE1vZGFsKHtcblx0XHRcdFx0XHRcdHRpdGxlOiBcIjxzcGFuIGNsYXNzPSdmYWwgZmEtYmFuJy8+IENhbm5vdCBEZWxldGUgQXR0YWNobWVudFwiLFxuXHRcdFx0XHRcdFx0Ym9keTogYDxwPlRoaXMgYXR0YWNobWVudCAkeyhtb2RlbC5pc09sZCgpID8gXCJpcyBmcm9tIGEgZGlmZmVyZW50IHllYXJcIiA6XG5cdFx0XHRcdFx0XHRcdG1vZGVsLmlzRm9yZWlnbigpID8gXCJpcyBmcm9tIGRpZmZlcmVudCBncm91cHNcIiA6IFwiZG9lcyBub3Qgc2hhcmUgYWxsIGl0cyBncm91cHMgd2l0aCB5b3VcIil9LiBZb3UgY2Fubm90IGRlbGV0ZSBpdC48L3A+YCxcblx0XHRcdFx0XHRcdGhvc3Q6IFwiI2xpbmstcmVzb3VyY2VzXCIsXG5cdFx0XHRcdFx0XHRoaWRlQnV0dG9uczogW1wiY2FuY2VsXCJdLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdG1vZGFsLnNob3coKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRtb2RlbC5kZXN0cm95KHtcblx0XHRcdFx0c3VjY2VzczogdGhpcy5kZXN0cm95U3VjY2Vzcy5iaW5kKHRoaXMpLFxuXHRcdFx0XHRlcnJvcjogdGhpcy5kZXN0cm95RXJyb3IuYmluZCh0aGlzKSxcblx0XHRcdFx0d2FpdDogdHJ1ZSxcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHRcdC8vfVxuXHR9LFxuXG5cdGRlc3Ryb3lTdWNjZXNzOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdGV2ZW50QnVzLnRyaWdnZXIoXCJhdHRhY2htZW50OmRlbGV0ZWRcIiwgbW9kZWwpO1xuXHRcdGlmICh0aGlzLkF0dGFjaG1lbnRDb2xsZWN0aW9uLmxlbmd0aCA9PT0gMSlcblx0XHRcdHRoaXMuZGVzdHJveSgpO1xuXHR9LFxuXG5cdGRlc3Ryb3lFcnJvcjogZnVuY3Rpb24obW9kZWwsIHhocikge1xuXHRcdHRoaXMuRGVzdHJveWVkID0gZmFsc2U7XG5cdFx0Y29uc3QgYW5zd2VyID0gQXBwLnBhcnNlUmVzcG9uc2UoeGhyKTtcblxuXHRcdHRoaXMuRGVzdHJveUVycm9yRGlhbG9nID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0cGVyc2lzdDogZmFsc2UsXG5cdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmFsIGZhLXRpbWVzLWNpcmNsZScvPiBFcnJvclwiLFxuXHRcdFx0Ym9keTogYDxwPkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHJlbW92aW5nIHRoZSBhdHRhY2htZW50IGFuZCB0aGUgYXR0YWNobWVudCB3YXMgbm90IHJlbW92ZWQuIFBsZWFzZSB0cnkgYWdhaW4uIERldGFpbHMgYWJvdXQgdGhlIGVycm9yIGZvbGxvdy48L3A+XG5cdFx0XHRcdDxwPiR7KGFuc3dlci5kZXRhaWwgfHwgYW5zd2VyLmluZm8pLnJlcGxhY2UoL1tcXCZcXDxcXD5cXCdcXFwiXS9nLCB4ID0+IFwiJiNcIiArIHguY2hhckNvZGVBdCgwKSArIFwiO1wiKX08L3A+YCxcblx0XHRcdGhvc3Q6IFwiI2xpbmstcmVzb3VyY2VzXCIsXG5cdFx0XHRoaWRlQnV0dG9uczogW1wiY2FuY2VsXCJdLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5EZXN0cm95RXJyb3JEaWFsb2cuc2hvdygpO1xuXHR9LFxuXG5cdG9uQXR0YWNobWVudEFkZGVkOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdHRoaXMuYWRkU3luY0xpc3RlbmVycyhtb2RlbCk7XG5cdFx0dGhpcy5hZGRGb2N1c0xpc3RlbmVyKG1vZGVsKTtcblxuXHRcdHRoaXMudXBkYXRlKCk7XG5cdH0sXG5cblx0b25BdHRhY2htZW50UmVtb3ZlZDogZnVuY3Rpb24obW9kZWwpIHtcblx0XHR0aGlzLnJlbW92ZVN5bmNMaXN0ZW5lcnMobW9kZWwpO1xuXHRcdHRoaXMucmVtb3ZlRm9jdXNMaXN0ZW5lcihtb2RlbCk7XG5cblx0XHRpZiAoIXRoaXMuaXNFbXB0eSgpKVxuXHRcdFx0dGhpcy5yZW5kZXIoKTtcblxuXHRcdGlmICghXy5pc05pbCh0aGlzLkF0dGFjaG1lbnRUb29sdGlwKSAmJiAhXy5pc05pbCh0aGlzLkF0dGFjaG1lbnRUb29sdGlwLnZpZXcpKVxuXHRcdFx0dGhpcy5BdHRhY2htZW50VG9vbHRpcC52aWV3LnJlbmRlcigpO1xuXG5cdFx0dGhpcy5zYXZlZCgpO1xuXHR9LFxuXG5cdG9uQXR0YWNobWVudHNSZXNldDogZnVuY3Rpb24oY29sbGVjdGlvbiwgb3B0aW9ucykge1xuXHRcdF8uZWFjaChvcHRpb25zLnByZXZpb3VzTW9kZWxzLCBtb2RlbCA9PiB7XG5cdFx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcobW9kZWwpO1xuXHRcdH0pO1xuXG5cdFx0Y29sbGVjdGlvbi5lYWNoKG1vZGVsID0+IHtcblx0XHRcdHRoaXMuYWRkRm9jdXNMaXN0ZW5lcihtb2RlbCk7XG5cdFx0fSk7XG5cdH0sXG5cblx0dG9nZ2xlTG9ja2VkQXR0YWNobWVudHM6IGZ1bmN0aW9uKGhpZGVTdGF0ZSkge1xuXHRcdGlmICh0aGlzLmlzT2xkKCkgJiYgaGlkZVN0YXRlKVxuXHRcdFx0dGhpcy4kZWwuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuRGVzdHJveWVkID0gdHJ1ZTtcblx0fSxcblxuXHRnZXRFcnJvck1lc3NhZ2U6IGZ1bmN0aW9uKGVycm9ycykge1xuXHRcdGlmIChfLnZhbHVlcyhlcnJvcnMpLmxlbmd0aCA+IDApIHtcblx0XHRcdHJldHVybiBfLnZhbHVlcyhlcnJvcnMpLmpvaW4oXCIuIFwiKSArIChfLnZhbHVlcyhlcnJvcnMpLmxlbmd0aCA+IDEgPyBcIi4gXCIgOiBcIlwiKSArXG5cdFx0XHRcdCh0aGlzLm1vZGVsICYmIHRoaXMubW9kZWwuZ2V0KFwicmV0cnlcIikgPyBcIlwiIDogXCIgSW52YWxpZCBmaWxlcyB3aWxsIGJlIHNraXBwZWQgZHVyaW5nIHRoZSB1cGxvYWQuIENsaWNrIHRoZSBlcnJvciBpY29uIHRvIHJlbW92ZSB0aGUgaW52YWxpZCBmaWxlKHMpLlwiKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gXCJcIjtcblx0fSxcblxuXHR1cGxvYWRFcnJvcjogZnVuY3Rpb24oeGhyKSB7XG5cdFx0dGhpcy5zYXZlZCgpO1xuXG5cdFx0Y29uc3QgZXJyb3JzID0geyBlcnJvcjogeGhyLnJlc3BvbnNlSlNPTiAmJiB4aHIucmVzcG9uc2VKU09OLmluZm8gPyB4aHIucmVzcG9uc2VKU09OLmluZm8gOiB4aHIuc3RhdHVzVGV4dCB9O1xuXG5cdFx0aWYgKHRoaXMubW9kZWwpXG5cdFx0XHR0aGlzLm1vZGVsLnNldChcImVycm9yc1wiLCBlcnJvcnMpO1xuXG5cdFx0aWYgKHRoaXMudWkuZXJyb3JJY29uLnJlbW92ZUNsYXNzKSB7XG5cdFx0XHR0aGlzLnVpLmVycm9ySWNvbi5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLnVpLmVycm9ySWNvbi5hdHRyKFwidGl0bGVcIiwgdGhpcy5nZXRFcnJvck1lc3NhZ2UoZXJyb3JzKSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMudWkuaWNvbi5hdHRyKVxuXHRcdFx0dGhpcy51aS5pY29uLmF0dHIoXCJ0aXRsZVwiLCB0aGlzLmdldEVycm9yTWVzc2FnZShlcnJvcnMpKTtcblx0fSxcblxuXHRvbkVycm9yQ2xpY2s6IGZ1bmN0aW9uKGUpIHtcblx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0dGhpcy5kcmFnZ2FibGUgPSB0aGlzLkF0dGFjaG1lbnRDb2xsZWN0aW9uLmF0KDApO1xuXG5cdFx0aWYgKHRoaXMubW9kZWwpIHtcblx0XHRcdHRoaXMuQXR0YWNobWVudENvbGxlY3Rpb24ucmVtb3ZlKHRoaXMubW9kZWwpO1xuXHRcdFx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5FdmVudHMuQXR0YWNobWVudFJlbW92ZWQsIHRoaXMubW9kZWwpO1xuXHRcdFx0ZXZlbnRCdXMudHJpZ2dlcihcImF0dGFjaG1lbnQ6ZGVsZXRlZFwiLCB0aGlzLm1vZGVsKTtcblx0XHRcdGV2ZW50QnVzLnRyaWdnZXIoXCJhdHRhY2htZW50UmVtb3ZlZDpcIiArIHRoaXMubW9kZWwuZ2V0KFwicmVzb3VyY2VcIikpO1xuXHRcdFx0cmFkaW8udHJpZ2dlcihcImF0dGFjaG1lbnRSZW1vdmVkOlwiICsgdGhpcy5tb2RlbC5nZXQoXCJyZXNvdXJjZVwiKSk7XG5cdFx0XHR0aGlzLm1vZGVsLmRlc3Ryb3koKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5BdHRhY2htZW50UmVtb3ZlZCwgdGhpcy5BdHRhY2htZW50Q29sbGVjdGlvbi5hdCgwKSk7XG5cdFx0XHR0aGlzLkF0dGFjaG1lbnRDb2xsZWN0aW9uLm1vZGVscyA9IF8uZmlsdGVyKHRoaXMuQXR0YWNobWVudENvbGxlY3Rpb24ubW9kZWxzLFxuXHRcdFx0XHRhdHRhY2htZW50ID0+ICFhdHRhY2htZW50LmdldChcImVycm9yc1wiKSB8fCAoYXR0YWNobWVudC5nZXQoXCJlcnJvcnNcIikgJiYgXy52YWx1ZXMoYXR0YWNobWVudC5nZXQoXCJlcnJvcnNcIikpLmxlbmd0aCA9PT0gMCkpO1xuXHRcdH1cblxuXHRcdCQoXCIuaGlnaGxpZ2h0LWJhclwiKS5hZGRDbGFzcyhcImhpZGVcIik7XG5cblx0XHRpZiAodGhpcy51aS5lcnJvckljb24uYWRkQ2xhc3MpXG5cdFx0XHR0aGlzLnVpLmVycm9ySWNvbi5hZGRDbGFzcyhcImhpZGVcIik7XG5cblx0XHRpZiAodGhpcy5BdHRhY2htZW50Q29sbGVjdGlvbi5tb2RlbHMubGVuZ3RoID09PSAwKVxuXHRcdFx0dGhpcy5kZXN0cm95KCk7XG5cdH0sXG5cblx0b25FcnJvcnNDaGFuZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLnVpLmVycm9ySWNvbi5hZGRDbGFzcylcblx0XHRcdHRoaXMudWkuZXJyb3JJY29uLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0fSxcbn0pOyJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar raygun = require(\"raygun\");\n\nvar App = require(\"../../../index\");\nvar eventBus = require(\"./eventBus\");\nvar settings = require(\"app-settings\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar BookChooser = require(\"../../../lib/bookChooser\");\nvar LearningPathChooser = require(\"../../../lib/learningPathChooser\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"chooser-view\",\n\n\ttemplate: require(\"../../templates/console/chooserView.nunj\").consoleSelector,\n\n\tregions: {\n\t\tconsoleBooks: \".console-books\",\n\t\tconsoleLearningPaths: \".console-learning-paths\"\n\t},\n\n\tui: {\n\t\tconsoleBlank: \".console-blank\",\n\t\tconsoleBooks: \".console-books\",\n\t\tconsoleLearningPaths: \".console-learning-paths\"\n\t},\n\n\tevents: {\n\t\tclick: \"onClick\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.ActiveButton = null;\n\t\tthis.ActiveConsole = null;\n\t},\n\n\tonClick: function onClick() {\n\t\teventBus.trigger(eventBus.Events.CloseResources);\n\t},\n\n\tonRender: function onRender() {\n\t\ttry {\n\t\t\tthis.$el.foundation();\n\t\t} catch (e) {\n\t\t\tif (!settings.debug || settings.reportErrors) raygun(\"send\", e);\n\t\t}\n\t},\n\n\tshowConsole: function showConsole(id) {\n\t\tvar newActiveConsole = null;\n\n\t\tswitch (id) {\n\t\t\tcase \"books\":\n\t\t\t\tif (!this.ui.consoleBooks.append) return;\n\n\t\t\t\tthis.bookViewBookChooser = new BookChooser();\n\n\t\t\t\tthis.listenTo(this.bookViewBookChooser, \"selected\", function (_id) {\n\t\t\t\t\tradio.trigger(App.Events.Commands.Navigate, settings.urlRoot + \"/console/books/\" + _id);\n\t\t\t\t});\n\n\t\t\t\tthis.showChildView(\"consoleBooks\", this.bookViewBookChooser);\n\t\t\t\tnewActiveConsole = this.ui.consoleBooks;\n\t\t\t\tbreak;\n\n\t\t\tcase \"learning-paths\":\n\t\t\t\tif (!this.ui.consoleLearningPaths.append) return;\n\n\t\t\t\tthis.learningPathChooser = new LearningPathChooser({\n\t\t\t\t\tlarge: true\n\t\t\t\t});\n\n\t\t\t\tthis.listenTo(this.learningPathChooser, \"selected\", function (details) {\n\t\t\t\t\tradio.trigger(App.Events.Commands.Navigate, settings.urlRoot + \"/console/learningPaths/\" + details.learningPathOptionModel.get(\"code\"));\n\t\t\t\t});\n\n\t\t\t\tthis.showChildView(\"consoleLearningPaths\", this.learningPathChooser);\n\t\t\t\tnewActiveConsole = this.ui.consoleLearningPaths;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tradio.trigger(App.Events.Commands.Navigate, settings.urlRoot);\n\t\t\t\t//newActiveConsole = this.ui.consoleBlank;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (newActiveConsole && newActiveConsole !== this.ActiveConsole) {\n\t\t\tif (this.ActiveConsole) this.ActiveConsole.addClass(\"hide\");\n\n\t\t\tthis.ActiveConsole = newActiveConsole;\n\t\t\tthis.ActiveConsole.removeClass(\"hide\");\n\t\t}\n\t\treturn true;\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNob29zZXJWaWV3LmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsInJheWd1biIsIkFwcCIsImV2ZW50QnVzIiwic2V0dGluZ3MiLCJyYWRpbyIsIlJhZGlvIiwiY2hhbm5lbCIsIkJvb2tDaG9vc2VyIiwiTGVhcm5pbmdQYXRoQ2hvb3NlciIsIm1vZHVsZSIsImV4cG9ydHMiLCJNYXJpb25ldHRlIiwiVmlldyIsImV4dGVuZCIsInRhZ05hbWUiLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsImNvbnNvbGVTZWxlY3RvciIsInJlZ2lvbnMiLCJjb25zb2xlQm9va3MiLCJjb25zb2xlTGVhcm5pbmdQYXRocyIsInVpIiwiY29uc29sZUJsYW5rIiwiZXZlbnRzIiwiY2xpY2siLCJpbml0aWFsaXplIiwiQWN0aXZlQnV0dG9uIiwiQWN0aXZlQ29uc29sZSIsIm9uQ2xpY2siLCJ0cmlnZ2VyIiwiRXZlbnRzIiwiQ2xvc2VSZXNvdXJjZXMiLCJvblJlbmRlciIsIiRlbCIsImZvdW5kYXRpb24iLCJlIiwiZGVidWciLCJyZXBvcnRFcnJvcnMiLCJzaG93Q29uc29sZSIsImlkIiwibmV3QWN0aXZlQ29uc29sZSIsImFwcGVuZCIsImJvb2tWaWV3Qm9va0Nob29zZXIiLCJsaXN0ZW5UbyIsIkNvbW1hbmRzIiwiTmF2aWdhdGUiLCJ1cmxSb290IiwiX2lkIiwic2hvd0NoaWxkVmlldyIsImxlYXJuaW5nUGF0aENob29zZXIiLCJsYXJnZSIsImRldGFpbHMiLCJsZWFybmluZ1BhdGhPcHRpb25Nb2RlbCIsImdldCIsImFkZENsYXNzIiwicmVtb3ZlQ2xhc3MiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1DLFNBQVNELFFBQVEsUUFBUixDQUFmOztBQUVBLElBQU1FLE1BQU1GLFFBQVEsZ0JBQVIsQ0FBWjtBQUNBLElBQU1HLFdBQVdILFFBQVEsWUFBUixDQUFqQjtBQUNBLElBQU1JLFdBQVdKLFFBQVEsY0FBUixDQUFqQjs7QUFFQSxJQUFNSyxRQUFRTixTQUFTTyxLQUFULENBQWVDLE9BQWYsQ0FBdUIsUUFBdkIsQ0FBZDs7QUFFQSxJQUFNQyxjQUFjUixRQUFRLDBCQUFSLENBQXBCO0FBQ0EsSUFBTVMsc0JBQXNCVCxRQUFRLGtDQUFSLENBQTVCOztBQUVBVSxPQUFPQyxPQUFQLEdBQWlCWixTQUFTYSxVQUFULENBQW9CQyxJQUFwQixDQUF5QkMsTUFBekIsQ0FBZ0M7QUFDaERDLFVBQVMsS0FEdUM7QUFFaERDLFlBQVcsY0FGcUM7O0FBSWhEQyxXQUFVakIsUUFBUSwwQ0FBUixFQUFvRGtCLGVBSmQ7O0FBTWhEQyxVQUFTO0FBQ1JDLGdCQUFjLGdCQUROO0FBRVJDLHdCQUFzQjtBQUZkLEVBTnVDOztBQVdoREMsS0FBSTtBQUNIQyxnQkFBYyxnQkFEWDtBQUVISCxnQkFBYyxnQkFGWDtBQUdIQyx3QkFBc0I7QUFIbkIsRUFYNEM7O0FBaUJoREcsU0FBUTtBQUNQQyxTQUFPO0FBREEsRUFqQndDOztBQXFCaERDLGFBQVksc0JBQVc7QUFDdEIsT0FBS0MsWUFBTCxHQUFvQixJQUFwQjtBQUNBLE9BQUtDLGFBQUwsR0FBcUIsSUFBckI7QUFDQSxFQXhCK0M7O0FBMEJoREMsVUFBUyxtQkFBVztBQUNuQjFCLFdBQVMyQixPQUFULENBQWlCM0IsU0FBUzRCLE1BQVQsQ0FBZ0JDLGNBQWpDO0FBQ0EsRUE1QitDOztBQThCaERDLFdBQVUsb0JBQVc7QUFDcEIsTUFBSTtBQUNILFFBQUtDLEdBQUwsQ0FBU0MsVUFBVDtBQUNBLEdBRkQsQ0FHQSxPQUFPQyxDQUFQLEVBQVU7QUFDVCxPQUFJLENBQUNoQyxTQUFTaUMsS0FBVixJQUFtQmpDLFNBQVNrQyxZQUFoQyxFQUNDckMsT0FBTyxNQUFQLEVBQWVtQyxDQUFmO0FBQ0Q7QUFDRCxFQXRDK0M7O0FBd0NoREcsY0FBYSxxQkFBU0MsRUFBVCxFQUFhO0FBQ3pCLE1BQUlDLG1CQUFtQixJQUF2Qjs7QUFFQSxVQUFRRCxFQUFSO0FBQ0MsUUFBSyxPQUFMO0FBQ0MsUUFBSSxDQUFDLEtBQUtsQixFQUFMLENBQVFGLFlBQVIsQ0FBcUJzQixNQUExQixFQUNDOztBQUVELFNBQUtDLG1CQUFMLEdBQTJCLElBQUluQyxXQUFKLEVBQTNCOztBQUVBLFNBQUtvQyxRQUFMLENBQWMsS0FBS0QsbUJBQW5CLEVBQXdDLFVBQXhDLEVBQW9ELGVBQU87QUFDMUR0QyxXQUFNeUIsT0FBTixDQUFjNUIsSUFBSTZCLE1BQUosQ0FBV2MsUUFBWCxDQUFvQkMsUUFBbEMsRUFBNEMxQyxTQUFTMkMsT0FBVCxHQUFtQixpQkFBbkIsR0FBdUNDLEdBQW5GO0FBQ0EsS0FGRDs7QUFJQSxTQUFLQyxhQUFMLENBQW1CLGNBQW5CLEVBQW1DLEtBQUtOLG1CQUF4QztBQUNBRix1QkFBbUIsS0FBS25CLEVBQUwsQ0FBUUYsWUFBM0I7QUFDQTs7QUFFRCxRQUFLLGdCQUFMO0FBQ0MsUUFBSSxDQUFDLEtBQUtFLEVBQUwsQ0FBUUQsb0JBQVIsQ0FBNkJxQixNQUFsQyxFQUNDOztBQUVELFNBQUtRLG1CQUFMLEdBQTJCLElBQUl6QyxtQkFBSixDQUF3QjtBQUNsRDBDLFlBQU87QUFEMkMsS0FBeEIsQ0FBM0I7O0FBSUEsU0FBS1AsUUFBTCxDQUFjLEtBQUtNLG1CQUFuQixFQUF3QyxVQUF4QyxFQUFvRCxtQkFBVztBQUM5RDdDLFdBQU15QixPQUFOLENBQWM1QixJQUFJNkIsTUFBSixDQUFXYyxRQUFYLENBQW9CQyxRQUFsQyxFQUE0QzFDLFNBQVMyQyxPQUFULEdBQW1CLHlCQUFuQixHQUErQ0ssUUFBUUMsdUJBQVIsQ0FBZ0NDLEdBQWhDLENBQW9DLE1BQXBDLENBQTNGO0FBQ0EsS0FGRDs7QUFJQSxTQUFLTCxhQUFMLENBQW1CLHNCQUFuQixFQUEyQyxLQUFLQyxtQkFBaEQ7QUFDQVQsdUJBQW1CLEtBQUtuQixFQUFMLENBQVFELG9CQUEzQjtBQUNBOztBQUVEO0FBQ0NoQixVQUFNeUIsT0FBTixDQUFjNUIsSUFBSTZCLE1BQUosQ0FBV2MsUUFBWCxDQUFvQkMsUUFBbEMsRUFBNEMxQyxTQUFTMkMsT0FBckQ7QUFDQTtBQUNBO0FBbENGOztBQXFDQSxNQUFJTixvQkFBb0JBLHFCQUFxQixLQUFLYixhQUFsRCxFQUFpRTtBQUNoRSxPQUFJLEtBQUtBLGFBQVQsRUFDQyxLQUFLQSxhQUFMLENBQW1CMkIsUUFBbkIsQ0FBNEIsTUFBNUI7O0FBRUQsUUFBSzNCLGFBQUwsR0FBcUJhLGdCQUFyQjtBQUNBLFFBQUtiLGFBQUwsQ0FBbUI0QixXQUFuQixDQUErQixNQUEvQjtBQUNBO0FBQ0QsU0FBTyxJQUFQO0FBQ0E7QUF4RitDLENBQWhDLENBQWpCIiwiZmlsZSI6ImNob29zZXJWaWV3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IHJheWd1biA9IHJlcXVpcmUoXCJyYXlndW5cIik7XG5cbmNvbnN0IEFwcCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9pbmRleFwiKTtcbmNvbnN0IGV2ZW50QnVzID0gcmVxdWlyZShcIi4vZXZlbnRCdXNcIik7XG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcblxuY29uc3QgQm9va0Nob29zZXIgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL2Jvb2tDaG9vc2VyXCIpO1xuY29uc3QgTGVhcm5pbmdQYXRoQ2hvb3NlciA9IHJlcXVpcmUoXCIuLi8uLi8uLi9saWIvbGVhcm5pbmdQYXRoQ2hvb3NlclwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogXCJkaXZcIixcblx0Y2xhc3NOYW1lOiBcImNob29zZXItdmlld1wiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2NvbnNvbGUvY2hvb3NlclZpZXcubnVualwiKS5jb25zb2xlU2VsZWN0b3IsXG5cblx0cmVnaW9uczoge1xuXHRcdGNvbnNvbGVCb29rczogXCIuY29uc29sZS1ib29rc1wiLFxuXHRcdGNvbnNvbGVMZWFybmluZ1BhdGhzOiBcIi5jb25zb2xlLWxlYXJuaW5nLXBhdGhzXCIsXG5cdH0sXG5cblx0dWk6IHtcblx0XHRjb25zb2xlQmxhbms6IFwiLmNvbnNvbGUtYmxhbmtcIixcblx0XHRjb25zb2xlQm9va3M6IFwiLmNvbnNvbGUtYm9va3NcIixcblx0XHRjb25zb2xlTGVhcm5pbmdQYXRoczogXCIuY29uc29sZS1sZWFybmluZy1wYXRoc1wiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdGNsaWNrOiBcIm9uQ2xpY2tcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLkFjdGl2ZUJ1dHRvbiA9IG51bGw7XG5cdFx0dGhpcy5BY3RpdmVDb25zb2xlID0gbnVsbDtcblx0fSxcblxuXHRvbkNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5DbG9zZVJlc291cmNlcyk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRyeSB7XG5cdFx0XHR0aGlzLiRlbC5mb3VuZGF0aW9uKCk7XG5cdFx0fVxuXHRcdGNhdGNoIChlKSB7XG5cdFx0XHRpZiAoIXNldHRpbmdzLmRlYnVnIHx8IHNldHRpbmdzLnJlcG9ydEVycm9ycylcblx0XHRcdFx0cmF5Z3VuKFwic2VuZFwiLCBlKTtcblx0XHR9XG5cdH0sXG5cblx0c2hvd0NvbnNvbGU6IGZ1bmN0aW9uKGlkKSB7XG5cdFx0bGV0IG5ld0FjdGl2ZUNvbnNvbGUgPSBudWxsO1xuXG5cdFx0c3dpdGNoIChpZCkge1xuXHRcdFx0Y2FzZSBcImJvb2tzXCI6XG5cdFx0XHRcdGlmICghdGhpcy51aS5jb25zb2xlQm9va3MuYXBwZW5kKVxuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHR0aGlzLmJvb2tWaWV3Qm9va0Nob29zZXIgPSBuZXcgQm9va0Nob29zZXIoKTtcblxuXHRcdFx0XHR0aGlzLmxpc3RlblRvKHRoaXMuYm9va1ZpZXdCb29rQ2hvb3NlciwgXCJzZWxlY3RlZFwiLCBfaWQgPT4ge1xuXHRcdFx0XHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0ZSwgc2V0dGluZ3MudXJsUm9vdCArIFwiL2NvbnNvbGUvYm9va3MvXCIgKyBfaWQpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJjb25zb2xlQm9va3NcIiwgdGhpcy5ib29rVmlld0Jvb2tDaG9vc2VyKTtcblx0XHRcdFx0bmV3QWN0aXZlQ29uc29sZSA9IHRoaXMudWkuY29uc29sZUJvb2tzO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcImxlYXJuaW5nLXBhdGhzXCI6XG5cdFx0XHRcdGlmICghdGhpcy51aS5jb25zb2xlTGVhcm5pbmdQYXRocy5hcHBlbmQpXG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdHRoaXMubGVhcm5pbmdQYXRoQ2hvb3NlciA9IG5ldyBMZWFybmluZ1BhdGhDaG9vc2VyKHtcblx0XHRcdFx0XHRsYXJnZTogdHJ1ZSxcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmxlYXJuaW5nUGF0aENob29zZXIsIFwic2VsZWN0ZWRcIiwgZGV0YWlscyA9PiB7XG5cdFx0XHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLk5hdmlnYXRlLCBzZXR0aW5ncy51cmxSb290ICsgXCIvY29uc29sZS9sZWFybmluZ1BhdGhzL1wiICsgZGV0YWlscy5sZWFybmluZ1BhdGhPcHRpb25Nb2RlbC5nZXQoXCJjb2RlXCIpKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiY29uc29sZUxlYXJuaW5nUGF0aHNcIiwgdGhpcy5sZWFybmluZ1BhdGhDaG9vc2VyKTtcblx0XHRcdFx0bmV3QWN0aXZlQ29uc29sZSA9IHRoaXMudWkuY29uc29sZUxlYXJuaW5nUGF0aHM7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuTmF2aWdhdGUsIHNldHRpbmdzLnVybFJvb3QpO1xuXHRcdFx0XHQvL25ld0FjdGl2ZUNvbnNvbGUgPSB0aGlzLnVpLmNvbnNvbGVCbGFuaztcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXG5cdFx0aWYgKG5ld0FjdGl2ZUNvbnNvbGUgJiYgbmV3QWN0aXZlQ29uc29sZSAhPT0gdGhpcy5BY3RpdmVDb25zb2xlKSB7XG5cdFx0XHRpZiAodGhpcy5BY3RpdmVDb25zb2xlKVxuXHRcdFx0XHR0aGlzLkFjdGl2ZUNvbnNvbGUuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0XHR0aGlzLkFjdGl2ZUNvbnNvbGUgPSBuZXdBY3RpdmVDb25zb2xlO1xuXHRcdFx0dGhpcy5BY3RpdmVDb25zb2xlLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG59KTtcbiJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar path = require(\"path\");\n\nvar settings = require(\"app-settings\");\n\nvar eventBus = require(\"./eventBus\");\n\nvar PageView = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"page\",\n\n\tattributes: {\n\t\tdraggable: \"true\"\n\t},\n\n\tmodelEvents: {\n\t\tshow: \"shower\",\n\t\thide: \"hide\"\n\t},\n\n\tevents: {\n\t\tclick: \"clicked\",\n\t\tdragstart: \"onDragStart\",\n\t\tdragend: \"onDragEnd\"\n\t},\n\n\ttemplate: require(\"../../templates/console/epubNavigation.nunj\").page,\n\n\tclicked: function clicked(evt) {\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\n\t\tthis.model.trigger(\"clicked\", this.model);\n\t},\n\n\tshower: function shower() {\n\t\tthis.$el.removeClass(\"hide\");\n\t},\n\n\thide: function hide() {\n\t\tthis.$el.addClass(\"hide\");\n\t},\n\n\tonDragStart: function onDragStart(event) {\n\t\tevent.originalEvent.dataTransfer.setData(\"text\", \"Page \" + this.model.get(\"page\"));\n\t\tevent.originalEvent.dataTransfer.effectAllowed = \"move\";\n\t},\n\n\tonDragEnd: _.noop\n});\n\nvar BookNavigatorPagesView = Backbone.Marionette.View.extend({\n\tclassName: \"nav-pages\",\n\n\ttemplate: require(\"../../templates/console/epubNavigation.nunj\").pages,\n\n\tui: {\n\t\ttitle: \"div.title\",\n\t\tcontent: \"div.content\",\n\t\tpage: \"div.page\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.page\": \"pageClick\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.metadata = options.metadata;\n\n\t\tif (options.metadata.get(\"totalPages\") === 0) this.$el.addClass(\"hide\");else this.listenTo(eventBus, \"epubNav:search\", this.search.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this = this;\n\n\t\tif (this.metadata.get(\"totalPages\") === 0) return;\n\n\t\tthis.pages = new Backbone.Collection();\n\n\t\tthis.listenTo(this.pages, \"clicked\", this.pageClick.bind(this));\n\n\t\t_.each(this.metadata.get(\"pages\"), function (x) {\n\t\t\t_this.pages.add(new Backbone.Model({ page: x.page }));\n\t\t});\n\n\t\tthis.pages.each(function (item) {\n\t\t\tvar view = new PageView({ model: item });\n\t\t\t_this.ui.content.append(view.render().el);\n\t\t});\n\t},\n\n\tsearch: function search(text) {\n\t\tthis.pages.each(function (item) {\n\t\t\tif (_.includes(item.get(\"page\").toString(), text)) item.trigger(\"show\");else item.trigger(\"hide\");\n\t\t});\n\t},\n\n\tpageClick: function pageClick(model) {\n\t\teventBus.trigger(eventBus.Events.PageChange, model.get(\"page\"));\n\t}\n});\n\nvar BookNavigatorBodyView = Backbone.Marionette.View.extend({\n\tclassName: \"nav-body\",\n\n\ttemplate: require(\"../../templates/console/epubNavigation.nunj\").body,\n\n\tui: {\n\t\tiframe: \"iframe\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.metadata = options.metadata;\n\t\tthis.Draggable = options.draggable;\n\n\t\tthis.listenTo(eventBus, \"epubNav:search\", this.search.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\tvar book = eventBus.request(eventBus.Events.GetCurrentBook);\n\n\t\tvar navVersion = eventBus.request(eventBus.Events.GetNavVersion);\n\n\t\tvar section_source = settings.urlRoot + \"/acacia/epub/toc/\" + navVersion + \"/\" + book.get(\"_id\") + \"/toc/\" + this.metadata.get(\"basePath\") + \"/acaciaEnd/?_=\" + new Date().getTime();\n\t\tthis.ui.iframe.get(0).src = section_source;\n\n\t\tthis.ui.iframe.load(this.onLoad.bind(this));\n\t},\n\n\tonLoad: function onLoad() {\n\t\tvar _this2 = this;\n\n\t\tvar navVersion = eventBus.request(eventBus.Events.GetNavVersion);\n\n\t\tvar book = eventBus.request(eventBus.Events.GetCurrentBook);\n\t\tvar p = \"<base href=\\\"\" + settings.urlRoot + \"/acacia/epub/files/\" + navVersion + \"/0/\" + book.get(\"_id\") + \"/\";\n\t\tp += this.metadata.get(\"basePath\").trim() + \"/\" + path.dirname(this.metadata.get(\"toc\").path).trim() + \"/\\\" target=\\\"book-display\\\"></base>\";\n\t\t$(\"head\", this.ui.iframe.get(0).contentWindow.document).append(p);\n\n\t\tvar anchors = $(\"a\", this.ui.iframe.get(0).contentWindow.document);\n\n\t\tif (this.Draggable) {\n\t\t\t// When an anchor is dragged, the HREF of the anchor is transferred by default. The following handler\n\t\t\t// replaces the URL with the anchor's text whenever a drag is started.\n\t\t\tanchors.on(\"dragstart\", function (event) {\n\t\t\t\t// eslint-disable-next-line no-invalid-this\n\t\t\t\tevent.originalEvent.dataTransfer.setData(\"text\", $(this).text());\n\t\t\t\tevent.originalEvent.dataTransfer.effectAllowed = \"move\";\n\t\t\t});\n\n\t\t\tanchors.on(\"click\", function (event) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\treturn false;\n\t\t\t});\n\t\t}\n\n\t\tanchors.off(\"click.navigate\").on(\"click.navigate\", function (event) {\n\t\t\tevent.preventDefault();\n\n\t\t\tvar href = $(event.target).attr(\"href\") === undefined ? $(event.target).closest(\"a\").attr(\"href\") : $(event.target).attr(\"href\");\n\t\t\tvar link = _.split(href, \"#\");\n\n\t\t\t//Get the first page that matches on file.\n\t\t\tvar pages = _this2.metadata.get(\"pages\");\n\t\t\tvar page = _.find(pages, function (item) {\n\t\t\t\treturn _.includes(item.file, link[0]);\n\t\t\t});\n\n\t\t\tif (!page) {\n\t\t\t\t// If we haven't found a page, it's most likely because the TOC link references a file that doesn't contain a page start.\n\t\t\t\t// Try and get the last page of the file previous to the that is referenced by the TOC link.\n\t\t\t\tvar documents = _this2.metadata.get(\"documents\");\n\t\t\t\tvar currentFile = _.find(documents, function (item) {\n\t\t\t\t\treturn _.includes(item, link[0]);\n\t\t\t\t});\n\t\t\t\tvar previousFile = documents[documents.indexOf(currentFile) - 1];\n\n\t\t\t\tpage = _.findLast(pages, function (item) {\n\t\t\t\t\treturn _.includes(item.file, previousFile);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (page) eventBus.trigger(eventBus.Events.PageChange, page.page);\n\n\t\t\treturn false;\n\t\t});\n\t},\n\n\tsearch: function search(text) {\n\t\tif (!this.ui.iframe.get(0).contentWindow || !this.ui.iframe.get(0).contentWindow.document) return;\n\n\t\t$(\"li\", this.ui.iframe.get(0).contentWindow.document).each(function (idx, el) {\n\t\t\tif (_.includes($(el).text().toLowerCase(), text)) {\n\t\t\t\t$(el).show();\n\t\t\t\t// Also show the parents\n\t\t\t\t$(el).parents(\"li\").add($(el).parents(\"ol\")).show();\n\t\t\t} else {\n\t\t\t\t$(el).hide();\n\t\t\t}\n\t\t});\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tid: \"book-navigator\",\n\n\ttemplate: require(\"../../templates/console/epubNavigation.nunj\").regions,\n\n\tui: {\n\t\ttextBox: \"input\",\n\t\tclose: \"span.fal\",\n\t\tclear: \".input-overlay\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.textBox\": \"searchClick\",\n\t\t\"keyup @ui.textBox\": \"search\",\n\t\t\"click @ui.close\": \"onClose\",\n\t\t\"click @ui.clear\": \"clear\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.metadata = options.metadata;\n\t\tthis.Draggable = options.draggable;\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.pages = new BookNavigatorPagesView({ metadata: this.metadata });\n\t\tthis.body = new BookNavigatorBodyView({ metadata: this.metadata, draggable: this.Draggable });\n\n\t\tthis.$el.append(this.pages.render().el);\n\t\tthis.$el.append(this.body.render().el);\n\n\t\tif (this.configureUI) this.configureUI();\n\t},\n\n\tonDestroy: function onDestroy() {\n\t\tthis.pages.destroy();\n\t\tthis.body.destroy();\n\t},\n\n\tsearchClick: function searchClick(evt) {\n\t\tevt.stopPropagation();\n\t},\n\n\tsearch: _.debounce(function () {\n\t\t/* eslint-disable no-invalid-this */\n\n\t\tif (!this.ui.textBox.val) return;\n\t\teventBus.trigger(\"epubNav:search\", this.ui.textBox.val());\n\n\t\t/* eslint-enabled no-invalid-this */\n\t}, 300),\n\n\tclear: function clear(evt) {\n\t\t$(evt.currentTarget).siblings(\"input\").val(\"\").trigger(\"keyup\");\n\t\tevt.stopPropagation();\n\t},\n\n\tonClose: function onClose() {\n\t\tif (this.close) this.close();\n\n\t\teventBus.trigger(eventBus.Events.CloseNavigation);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVwdWJOYXZpZ2F0aW9uLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIiQiLCJfIiwicGF0aCIsInNldHRpbmdzIiwiZXZlbnRCdXMiLCJQYWdlVmlldyIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiZXh0ZW5kIiwidGFnTmFtZSIsImNsYXNzTmFtZSIsImF0dHJpYnV0ZXMiLCJkcmFnZ2FibGUiLCJtb2RlbEV2ZW50cyIsInNob3ciLCJoaWRlIiwiZXZlbnRzIiwiY2xpY2siLCJkcmFnc3RhcnQiLCJkcmFnZW5kIiwidGVtcGxhdGUiLCJwYWdlIiwiY2xpY2tlZCIsImV2dCIsInN0b3BQcm9wYWdhdGlvbiIsInByZXZlbnREZWZhdWx0IiwibW9kZWwiLCJ0cmlnZ2VyIiwic2hvd2VyIiwiJGVsIiwicmVtb3ZlQ2xhc3MiLCJhZGRDbGFzcyIsIm9uRHJhZ1N0YXJ0IiwiZXZlbnQiLCJvcmlnaW5hbEV2ZW50IiwiZGF0YVRyYW5zZmVyIiwic2V0RGF0YSIsImdldCIsImVmZmVjdEFsbG93ZWQiLCJvbkRyYWdFbmQiLCJub29wIiwiQm9va05hdmlnYXRvclBhZ2VzVmlldyIsInBhZ2VzIiwidWkiLCJ0aXRsZSIsImNvbnRlbnQiLCJpbml0aWFsaXplIiwib3B0aW9ucyIsIm1ldGFkYXRhIiwibGlzdGVuVG8iLCJzZWFyY2giLCJiaW5kIiwib25SZW5kZXIiLCJDb2xsZWN0aW9uIiwicGFnZUNsaWNrIiwiZWFjaCIsImFkZCIsIk1vZGVsIiwieCIsInZpZXciLCJpdGVtIiwiYXBwZW5kIiwicmVuZGVyIiwiZWwiLCJ0ZXh0IiwiaW5jbHVkZXMiLCJ0b1N0cmluZyIsIkV2ZW50cyIsIlBhZ2VDaGFuZ2UiLCJCb29rTmF2aWdhdG9yQm9keVZpZXciLCJib2R5IiwiaWZyYW1lIiwiRHJhZ2dhYmxlIiwiYm9vayIsInJlcXVlc3QiLCJHZXRDdXJyZW50Qm9vayIsIm5hdlZlcnNpb24iLCJHZXROYXZWZXJzaW9uIiwic2VjdGlvbl9zb3VyY2UiLCJ1cmxSb290IiwiRGF0ZSIsImdldFRpbWUiLCJzcmMiLCJsb2FkIiwib25Mb2FkIiwicCIsInRyaW0iLCJkaXJuYW1lIiwiY29udGVudFdpbmRvdyIsImRvY3VtZW50IiwiYW5jaG9ycyIsIm9uIiwib2ZmIiwiaHJlZiIsInRhcmdldCIsImF0dHIiLCJ1bmRlZmluZWQiLCJjbG9zZXN0IiwibGluayIsInNwbGl0IiwiZmluZCIsImZpbGUiLCJkb2N1bWVudHMiLCJjdXJyZW50RmlsZSIsInByZXZpb3VzRmlsZSIsImluZGV4T2YiLCJmaW5kTGFzdCIsImlkeCIsInRvTG93ZXJDYXNlIiwicGFyZW50cyIsIm1vZHVsZSIsImV4cG9ydHMiLCJpZCIsInJlZ2lvbnMiLCJ0ZXh0Qm94IiwiY2xvc2UiLCJjbGVhciIsImNvbmZpZ3VyZVVJIiwib25EZXN0cm95IiwiZGVzdHJveSIsInNlYXJjaENsaWNrIiwiZGVib3VuY2UiLCJ2YWwiLCJjdXJyZW50VGFyZ2V0Iiwic2libGluZ3MiLCJvbkNsb3NlIiwiQ2xvc2VOYXZpZ2F0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1FLElBQUlGLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUcsT0FBT0gsUUFBUSxNQUFSLENBQWI7O0FBRUEsSUFBTUksV0FBV0osUUFBUSxjQUFSLENBQWpCOztBQUVBLElBQU1LLFdBQVdMLFFBQVEsWUFBUixDQUFqQjs7QUFFQSxJQUFNTSxXQUFXUCxTQUFTUSxVQUFULENBQW9CQyxJQUFwQixDQUF5QkMsTUFBekIsQ0FBZ0M7QUFDaERDLFVBQVMsS0FEdUM7QUFFaERDLFlBQVcsTUFGcUM7O0FBSWhEQyxhQUFZO0FBQ1hDLGFBQVc7QUFEQSxFQUpvQzs7QUFRaERDLGNBQWE7QUFDWkMsUUFBTSxRQURNO0FBRVpDLFFBQU07QUFGTSxFQVJtQzs7QUFhaERDLFNBQVE7QUFDUEMsU0FBTyxTQURBO0FBRVBDLGFBQVcsYUFGSjtBQUdQQyxXQUFTO0FBSEYsRUFid0M7O0FBbUJoREMsV0FBVXJCLFFBQVEsNkNBQVIsRUFBdURzQixJQW5CakI7O0FBcUJoREMsVUFBUyxpQkFBU0MsR0FBVCxFQUFjO0FBQ3RCQSxNQUFJQyxlQUFKO0FBQ0FELE1BQUlFLGNBQUo7O0FBRUEsT0FBS0MsS0FBTCxDQUFXQyxPQUFYLENBQW1CLFNBQW5CLEVBQThCLEtBQUtELEtBQW5DO0FBQ0EsRUExQitDOztBQTRCaERFLFNBQVEsa0JBQVc7QUFDbEIsT0FBS0MsR0FBTCxDQUFTQyxXQUFULENBQXFCLE1BQXJCO0FBQ0EsRUE5QitDOztBQWdDaERmLE9BQU0sZ0JBQVc7QUFDaEIsT0FBS2MsR0FBTCxDQUFTRSxRQUFULENBQWtCLE1BQWxCO0FBQ0EsRUFsQytDOztBQW9DaERDLGNBQWEscUJBQVNDLEtBQVQsRUFBZ0I7QUFDNUJBLFFBQU1DLGFBQU4sQ0FBb0JDLFlBQXBCLENBQWlDQyxPQUFqQyxDQUF5QyxNQUF6QyxFQUFpRCxVQUFVLEtBQUtWLEtBQUwsQ0FBV1csR0FBWCxDQUFlLE1BQWYsQ0FBM0Q7QUFDQUosUUFBTUMsYUFBTixDQUFvQkMsWUFBcEIsQ0FBaUNHLGFBQWpDLEdBQWlELE1BQWpEO0FBQ0EsRUF2QytDOztBQXlDaERDLFlBQVd0QyxFQUFFdUM7QUF6Q21DLENBQWhDLENBQWpCOztBQTRDQSxJQUFNQyx5QkFBeUIzQyxTQUFTUSxVQUFULENBQW9CQyxJQUFwQixDQUF5QkMsTUFBekIsQ0FBZ0M7QUFDOURFLFlBQVcsV0FEbUQ7O0FBRzlEVSxXQUFVckIsUUFBUSw2Q0FBUixFQUF1RDJDLEtBSEg7O0FBSzlEQyxLQUFJO0FBQ0hDLFNBQU8sV0FESjtBQUVIQyxXQUFTLGFBRk47QUFHSHhCLFFBQU07QUFISCxFQUwwRDs7QUFXOURMLFNBQVE7QUFDUCxvQkFBa0I7QUFEWCxFQVhzRDs7QUFlOUQ4QixhQUFZLG9CQUFTQyxPQUFULEVBQWtCO0FBQzdCLE9BQUtDLFFBQUwsR0FBZ0JELFFBQVFDLFFBQXhCOztBQUVBLE1BQUlELFFBQVFDLFFBQVIsQ0FBaUJYLEdBQWpCLENBQXFCLFlBQXJCLE1BQXVDLENBQTNDLEVBQ0MsS0FBS1IsR0FBTCxDQUFTRSxRQUFULENBQWtCLE1BQWxCLEVBREQsS0FHQyxLQUFLa0IsUUFBTCxDQUFjN0MsUUFBZCxFQUF3QixnQkFBeEIsRUFBMEMsS0FBSzhDLE1BQUwsQ0FBWUMsSUFBWixDQUFpQixJQUFqQixDQUExQztBQUNELEVBdEI2RDs7QUF3QjlEQyxXQUFVLG9CQUFXO0FBQUE7O0FBQ3BCLE1BQUksS0FBS0osUUFBTCxDQUFjWCxHQUFkLENBQWtCLFlBQWxCLE1BQW9DLENBQXhDLEVBQ0M7O0FBRUQsT0FBS0ssS0FBTCxHQUFhLElBQUk1QyxTQUFTdUQsVUFBYixFQUFiOztBQUVBLE9BQUtKLFFBQUwsQ0FBYyxLQUFLUCxLQUFuQixFQUEwQixTQUExQixFQUFxQyxLQUFLWSxTQUFMLENBQWVILElBQWYsQ0FBb0IsSUFBcEIsQ0FBckM7O0FBRUFsRCxJQUFFc0QsSUFBRixDQUFPLEtBQUtQLFFBQUwsQ0FBY1gsR0FBZCxDQUFrQixPQUFsQixDQUFQLEVBQW1DLGFBQUs7QUFDdkMsU0FBS0ssS0FBTCxDQUFXYyxHQUFYLENBQWUsSUFBSTFELFNBQVMyRCxLQUFiLENBQW1CLEVBQUVwQyxNQUFNcUMsRUFBRXJDLElBQVYsRUFBbkIsQ0FBZjtBQUNBLEdBRkQ7O0FBSUEsT0FBS3FCLEtBQUwsQ0FBV2EsSUFBWCxDQUFnQixnQkFBUTtBQUN2QixPQUFNSSxPQUFPLElBQUl0RCxRQUFKLENBQWEsRUFBRXFCLE9BQU9rQyxJQUFULEVBQWIsQ0FBYjtBQUNBLFNBQUtqQixFQUFMLENBQVFFLE9BQVIsQ0FBZ0JnQixNQUFoQixDQUF1QkYsS0FBS0csTUFBTCxHQUFjQyxFQUFyQztBQUNBLEdBSEQ7QUFJQSxFQXhDNkQ7O0FBMEM5RGIsU0FBUSxnQkFBU2MsSUFBVCxFQUFlO0FBQ3RCLE9BQUt0QixLQUFMLENBQVdhLElBQVgsQ0FBZ0IsZ0JBQVE7QUFDdkIsT0FBSXRELEVBQUVnRSxRQUFGLENBQVdMLEtBQUt2QixHQUFMLENBQVMsTUFBVCxFQUFpQjZCLFFBQWpCLEVBQVgsRUFBd0NGLElBQXhDLENBQUosRUFDQ0osS0FBS2pDLE9BQUwsQ0FBYSxNQUFiLEVBREQsS0FHQ2lDLEtBQUtqQyxPQUFMLENBQWEsTUFBYjtBQUNELEdBTEQ7QUFNQSxFQWpENkQ7O0FBbUQ5RDJCLFlBQVcsbUJBQVM1QixLQUFULEVBQWdCO0FBQzFCdEIsV0FBU3VCLE9BQVQsQ0FBaUJ2QixTQUFTK0QsTUFBVCxDQUFnQkMsVUFBakMsRUFBNkMxQyxNQUFNVyxHQUFOLENBQVUsTUFBVixDQUE3QztBQUNBO0FBckQ2RCxDQUFoQyxDQUEvQjs7QUF3REEsSUFBTWdDLHdCQUF3QnZFLFNBQVNRLFVBQVQsQ0FBb0JDLElBQXBCLENBQXlCQyxNQUF6QixDQUFnQztBQUM3REUsWUFBVyxVQURrRDs7QUFHN0RVLFdBQVVyQixRQUFRLDZDQUFSLEVBQXVEdUUsSUFISjs7QUFLN0QzQixLQUFJO0FBQ0g0QixVQUFRO0FBREwsRUFMeUQ7O0FBUzdEekIsYUFBWSxvQkFBU0MsT0FBVCxFQUFrQjtBQUM3QixPQUFLQyxRQUFMLEdBQWdCRCxRQUFRQyxRQUF4QjtBQUNBLE9BQUt3QixTQUFMLEdBQWlCekIsUUFBUW5DLFNBQXpCOztBQUVBLE9BQUtxQyxRQUFMLENBQWM3QyxRQUFkLEVBQXdCLGdCQUF4QixFQUEwQyxLQUFLOEMsTUFBTCxDQUFZQyxJQUFaLENBQWlCLElBQWpCLENBQTFDO0FBQ0EsRUFkNEQ7O0FBZ0I3REMsV0FBVSxvQkFBVztBQUNwQixNQUFNcUIsT0FBT3JFLFNBQVNzRSxPQUFULENBQWlCdEUsU0FBUytELE1BQVQsQ0FBZ0JRLGNBQWpDLENBQWI7O0FBRUEsTUFBTUMsYUFBYXhFLFNBQVNzRSxPQUFULENBQWlCdEUsU0FBUytELE1BQVQsQ0FBZ0JVLGFBQWpDLENBQW5COztBQUVBLE1BQU1DLGlCQUFpQjNFLFNBQVM0RSxPQUFULEdBQW1CLG1CQUFuQixHQUF5Q0gsVUFBekMsR0FBc0QsR0FBdEQsR0FBNERILEtBQUtwQyxHQUFMLENBQVMsS0FBVCxDQUE1RCxHQUE4RSxPQUE5RSxHQUF3RixLQUFLVyxRQUFMLENBQWNYLEdBQWQsQ0FBa0IsVUFBbEIsQ0FBeEYsR0FBd0gsZ0JBQXhILEdBQTJJLElBQUkyQyxJQUFKLEdBQVdDLE9BQVgsRUFBbEs7QUFDQSxPQUFLdEMsRUFBTCxDQUFRNEIsTUFBUixDQUFlbEMsR0FBZixDQUFtQixDQUFuQixFQUFzQjZDLEdBQXRCLEdBQTRCSixjQUE1Qjs7QUFFQSxPQUFLbkMsRUFBTCxDQUFRNEIsTUFBUixDQUFlWSxJQUFmLENBQW9CLEtBQUtDLE1BQUwsQ0FBWWpDLElBQVosQ0FBaUIsSUFBakIsQ0FBcEI7QUFDQSxFQXpCNEQ7O0FBMkI3RGlDLFNBQVEsa0JBQVc7QUFBQTs7QUFDbEIsTUFBTVIsYUFBYXhFLFNBQVNzRSxPQUFULENBQWlCdEUsU0FBUytELE1BQVQsQ0FBZ0JVLGFBQWpDLENBQW5COztBQUVBLE1BQU1KLE9BQU9yRSxTQUFTc0UsT0FBVCxDQUFpQnRFLFNBQVMrRCxNQUFULENBQWdCUSxjQUFqQyxDQUFiO0FBQ0EsTUFBSVUsc0JBQW1CbEYsU0FBUzRFLE9BQTVCLDJCQUF5REgsVUFBekQsV0FBeUVILEtBQUtwQyxHQUFMLENBQVMsS0FBVCxDQUF6RSxNQUFKO0FBQ0FnRCxPQUFRLEtBQUtyQyxRQUFMLENBQWNYLEdBQWQsQ0FBa0IsVUFBbEIsRUFBOEJpRCxJQUE5QixFQUFSLFNBQWdEcEYsS0FBS3FGLE9BQUwsQ0FBYSxLQUFLdkMsUUFBTCxDQUFjWCxHQUFkLENBQWtCLEtBQWxCLEVBQXlCbkMsSUFBdEMsRUFBNENvRixJQUE1QyxFQUFoRDtBQUNBdEYsSUFBRSxNQUFGLEVBQVUsS0FBSzJDLEVBQUwsQ0FBUTRCLE1BQVIsQ0FBZWxDLEdBQWYsQ0FBbUIsQ0FBbkIsRUFBc0JtRCxhQUF0QixDQUFvQ0MsUUFBOUMsRUFBd0Q1QixNQUF4RCxDQUErRHdCLENBQS9EOztBQUVBLE1BQU1LLFVBQVUxRixFQUFFLEdBQUYsRUFBTyxLQUFLMkMsRUFBTCxDQUFRNEIsTUFBUixDQUFlbEMsR0FBZixDQUFtQixDQUFuQixFQUFzQm1ELGFBQXRCLENBQW9DQyxRQUEzQyxDQUFoQjs7QUFFQSxNQUFJLEtBQUtqQixTQUFULEVBQW9CO0FBQ25CO0FBQ0E7QUFDQWtCLFdBQVFDLEVBQVIsQ0FBVyxXQUFYLEVBQXdCLFVBQVMxRCxLQUFULEVBQWdCO0FBQ3ZDO0FBQ0FBLFVBQU1DLGFBQU4sQ0FBb0JDLFlBQXBCLENBQWlDQyxPQUFqQyxDQUF5QyxNQUF6QyxFQUFpRHBDLEVBQUUsSUFBRixFQUFRZ0UsSUFBUixFQUFqRDtBQUNBL0IsVUFBTUMsYUFBTixDQUFvQkMsWUFBcEIsQ0FBaUNHLGFBQWpDLEdBQWlELE1BQWpEO0FBQ0EsSUFKRDs7QUFNQW9ELFdBQVFDLEVBQVIsQ0FBVyxPQUFYLEVBQW9CLGlCQUFTO0FBQzVCMUQsVUFBTVIsY0FBTjtBQUNBLFdBQU8sS0FBUDtBQUNBLElBSEQ7QUFJQTs7QUFFRGlFLFVBQVFFLEdBQVIsQ0FBWSxnQkFBWixFQUE4QkQsRUFBOUIsQ0FBaUMsZ0JBQWpDLEVBQW1ELGlCQUFTO0FBQzNEMUQsU0FBTVIsY0FBTjs7QUFFQSxPQUFNb0UsT0FBTzdGLEVBQUVpQyxNQUFNNkQsTUFBUixFQUFnQkMsSUFBaEIsQ0FBcUIsTUFBckIsTUFBaUNDLFNBQWpDLEdBQTZDaEcsRUFBRWlDLE1BQU02RCxNQUFSLEVBQWdCRyxPQUFoQixDQUF3QixHQUF4QixFQUE2QkYsSUFBN0IsQ0FBa0MsTUFBbEMsQ0FBN0MsR0FBeUYvRixFQUFFaUMsTUFBTTZELE1BQVIsRUFBZ0JDLElBQWhCLENBQXFCLE1BQXJCLENBQXRHO0FBQ0EsT0FBTUcsT0FBT2pHLEVBQUVrRyxLQUFGLENBQVFOLElBQVIsRUFBYyxHQUFkLENBQWI7O0FBRUE7QUFDQSxPQUFNbkQsUUFBUSxPQUFLTSxRQUFMLENBQWNYLEdBQWQsQ0FBa0IsT0FBbEIsQ0FBZDtBQUNBLE9BQUloQixPQUFPcEIsRUFBRW1HLElBQUYsQ0FBTzFELEtBQVAsRUFBYztBQUFBLFdBQVF6QyxFQUFFZ0UsUUFBRixDQUFXTCxLQUFLeUMsSUFBaEIsRUFBc0JILEtBQUssQ0FBTCxDQUF0QixDQUFSO0FBQUEsSUFBZCxDQUFYOztBQUVBLE9BQUksQ0FBQzdFLElBQUwsRUFBVztBQUNWO0FBQ0E7QUFDQSxRQUFNaUYsWUFBWSxPQUFLdEQsUUFBTCxDQUFjWCxHQUFkLENBQWtCLFdBQWxCLENBQWxCO0FBQ0EsUUFBTWtFLGNBQWN0RyxFQUFFbUcsSUFBRixDQUFPRSxTQUFQLEVBQWtCO0FBQUEsWUFBUXJHLEVBQUVnRSxRQUFGLENBQVdMLElBQVgsRUFBaUJzQyxLQUFLLENBQUwsQ0FBakIsQ0FBUjtBQUFBLEtBQWxCLENBQXBCO0FBQ0EsUUFBTU0sZUFBZUYsVUFBVUEsVUFBVUcsT0FBVixDQUFrQkYsV0FBbEIsSUFBaUMsQ0FBM0MsQ0FBckI7O0FBRUFsRixXQUFPcEIsRUFBRXlHLFFBQUYsQ0FBV2hFLEtBQVgsRUFBa0I7QUFBQSxZQUFRekMsRUFBRWdFLFFBQUYsQ0FBV0wsS0FBS3lDLElBQWhCLEVBQXNCRyxZQUF0QixDQUFSO0FBQUEsS0FBbEIsQ0FBUDtBQUNBOztBQUVELE9BQUluRixJQUFKLEVBQ0NqQixTQUFTdUIsT0FBVCxDQUFpQnZCLFNBQVMrRCxNQUFULENBQWdCQyxVQUFqQyxFQUE2Qy9DLEtBQUtBLElBQWxEOztBQUVELFVBQU8sS0FBUDtBQUNBLEdBeEJEO0FBeUJBLEVBN0U0RDs7QUErRTdENkIsU0FBUSxnQkFBU2MsSUFBVCxFQUFlO0FBQ3RCLE1BQUksQ0FBQyxLQUFLckIsRUFBTCxDQUFRNEIsTUFBUixDQUFlbEMsR0FBZixDQUFtQixDQUFuQixFQUFzQm1ELGFBQXZCLElBQXdDLENBQUMsS0FBSzdDLEVBQUwsQ0FBUTRCLE1BQVIsQ0FBZWxDLEdBQWYsQ0FBbUIsQ0FBbkIsRUFBc0JtRCxhQUF0QixDQUFvQ0MsUUFBakYsRUFDQzs7QUFFRHpGLElBQUUsSUFBRixFQUFRLEtBQUsyQyxFQUFMLENBQVE0QixNQUFSLENBQWVsQyxHQUFmLENBQW1CLENBQW5CLEVBQXNCbUQsYUFBdEIsQ0FBb0NDLFFBQTVDLEVBQXNEbEMsSUFBdEQsQ0FBMkQsVUFBQ29ELEdBQUQsRUFBTTVDLEVBQU4sRUFBYTtBQUN2RSxPQUFJOUQsRUFBRWdFLFFBQUYsQ0FBV2pFLEVBQUUrRCxFQUFGLEVBQU1DLElBQU4sR0FBYTRDLFdBQWIsRUFBWCxFQUF1QzVDLElBQXZDLENBQUosRUFBa0Q7QUFDakRoRSxNQUFFK0QsRUFBRixFQUFNakQsSUFBTjtBQUNBO0FBQ0FkLE1BQUUrRCxFQUFGLEVBQU04QyxPQUFOLENBQWMsSUFBZCxFQUFvQnJELEdBQXBCLENBQXdCeEQsRUFBRStELEVBQUYsRUFBTThDLE9BQU4sQ0FBYyxJQUFkLENBQXhCLEVBQTZDL0YsSUFBN0M7QUFDQSxJQUpELE1BS0s7QUFDSmQsTUFBRStELEVBQUYsRUFBTWhELElBQU47QUFDQTtBQUNELEdBVEQ7QUFVQTtBQTdGNEQsQ0FBaEMsQ0FBOUI7O0FBZ0dBK0YsT0FBT0MsT0FBUCxHQUFpQmpILFNBQVNRLFVBQVQsQ0FBb0JDLElBQXBCLENBQXlCQyxNQUF6QixDQUFnQztBQUNoREMsVUFBUyxLQUR1QztBQUVoRHVHLEtBQUksZ0JBRjRDOztBQUloRDVGLFdBQVVyQixRQUFRLDZDQUFSLEVBQXVEa0gsT0FKakI7O0FBTWhEdEUsS0FBSTtBQUNIdUUsV0FBUyxPQUROO0FBRUhDLFNBQU8sVUFGSjtBQUdIQyxTQUFPO0FBSEosRUFONEM7O0FBWWhEcEcsU0FBUTtBQUNQLHVCQUFxQixhQURkO0FBRVAsdUJBQXFCLFFBRmQ7QUFHUCxxQkFBbUIsU0FIWjtBQUlQLHFCQUFtQjtBQUpaLEVBWndDOztBQW1CaEQ4QixhQUFZLG9CQUFTQyxPQUFULEVBQWtCO0FBQzdCLE9BQUtDLFFBQUwsR0FBZ0JELFFBQVFDLFFBQXhCO0FBQ0EsT0FBS3dCLFNBQUwsR0FBaUJ6QixRQUFRbkMsU0FBekI7QUFDQSxFQXRCK0M7O0FBd0JoRHdDLFdBQVUsb0JBQVc7QUFDcEIsT0FBS1YsS0FBTCxHQUFhLElBQUlELHNCQUFKLENBQTJCLEVBQUVPLFVBQVUsS0FBS0EsUUFBakIsRUFBM0IsQ0FBYjtBQUNBLE9BQUtzQixJQUFMLEdBQVksSUFBSUQscUJBQUosQ0FBMEIsRUFBRXJCLFVBQVUsS0FBS0EsUUFBakIsRUFBMkJwQyxXQUFXLEtBQUs0RCxTQUEzQyxFQUExQixDQUFaOztBQUVBLE9BQUszQyxHQUFMLENBQVNnQyxNQUFULENBQWdCLEtBQUtuQixLQUFMLENBQVdvQixNQUFYLEdBQW9CQyxFQUFwQztBQUNBLE9BQUtsQyxHQUFMLENBQVNnQyxNQUFULENBQWdCLEtBQUtTLElBQUwsQ0FBVVIsTUFBVixHQUFtQkMsRUFBbkM7O0FBRUEsTUFBSSxLQUFLc0QsV0FBVCxFQUNDLEtBQUtBLFdBQUw7QUFDRCxFQWpDK0M7O0FBbUNoREMsWUFBVyxxQkFBVztBQUNyQixPQUFLNUUsS0FBTCxDQUFXNkUsT0FBWDtBQUNBLE9BQUtqRCxJQUFMLENBQVVpRCxPQUFWO0FBQ0EsRUF0QytDOztBQXdDaERDLGNBQWEscUJBQVNqRyxHQUFULEVBQWM7QUFDMUJBLE1BQUlDLGVBQUo7QUFDQSxFQTFDK0M7O0FBNENoRDBCLFNBQVFqRCxFQUFFd0gsUUFBRixDQUFXLFlBQVc7QUFDN0I7O0FBRUEsTUFBSSxDQUFDLEtBQUs5RSxFQUFMLENBQVF1RSxPQUFSLENBQWdCUSxHQUFyQixFQUNDO0FBQ0R0SCxXQUFTdUIsT0FBVCxDQUFpQixnQkFBakIsRUFBbUMsS0FBS2dCLEVBQUwsQ0FBUXVFLE9BQVIsQ0FBZ0JRLEdBQWhCLEVBQW5DOztBQUVBO0FBQ0EsRUFSTyxFQVFMLEdBUkssQ0E1Q3dDOztBQXNEaEROLFFBQU8sZUFBUzdGLEdBQVQsRUFBYztBQUNwQnZCLElBQUV1QixJQUFJb0csYUFBTixFQUFxQkMsUUFBckIsQ0FBOEIsT0FBOUIsRUFBdUNGLEdBQXZDLENBQTJDLEVBQTNDLEVBQStDL0YsT0FBL0MsQ0FBdUQsT0FBdkQ7QUFDQUosTUFBSUMsZUFBSjtBQUNBLEVBekQrQzs7QUEyRGhEcUcsVUFBUyxtQkFBVztBQUNuQixNQUFJLEtBQUtWLEtBQVQsRUFDQyxLQUFLQSxLQUFMOztBQUVEL0csV0FBU3VCLE9BQVQsQ0FBaUJ2QixTQUFTK0QsTUFBVCxDQUFnQjJELGVBQWpDO0FBQ0E7QUFoRStDLENBQWhDLENBQWpCIiwiZmlsZSI6ImVwdWJOYXZpZ2F0aW9uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5cbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxuY29uc3QgZXZlbnRCdXMgPSByZXF1aXJlKFwiLi9ldmVudEJ1c1wiKTtcblxuY29uc3QgUGFnZVZpZXcgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogXCJkaXZcIixcblx0Y2xhc3NOYW1lOiBcInBhZ2VcIixcblxuXHRhdHRyaWJ1dGVzOiB7XG5cdFx0ZHJhZ2dhYmxlOiBcInRydWVcIixcblx0fSxcblxuXHRtb2RlbEV2ZW50czoge1xuXHRcdHNob3c6IFwic2hvd2VyXCIsXG5cdFx0aGlkZTogXCJoaWRlXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0Y2xpY2s6IFwiY2xpY2tlZFwiLFxuXHRcdGRyYWdzdGFydDogXCJvbkRyYWdTdGFydFwiLFxuXHRcdGRyYWdlbmQ6IFwib25EcmFnRW5kXCIsXG5cdH0sXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvY29uc29sZS9lcHViTmF2aWdhdGlvbi5udW5qXCIpLnBhZ2UsXG5cblx0Y2xpY2tlZDogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0dGhpcy5tb2RlbC50cmlnZ2VyKFwiY2xpY2tlZFwiLCB0aGlzLm1vZGVsKTtcblx0fSxcblxuXHRzaG93ZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRoaWRlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0b25EcmFnU3RhcnQ6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0ZXZlbnQub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXIuc2V0RGF0YShcInRleHRcIiwgXCJQYWdlIFwiICsgdGhpcy5tb2RlbC5nZXQoXCJwYWdlXCIpKTtcblx0XHRldmVudC5vcmlnaW5hbEV2ZW50LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gXCJtb3ZlXCI7XG5cdH0sXG5cblx0b25EcmFnRW5kOiBfLm5vb3AsXG59KTtcblxuY29uc3QgQm9va05hdmlnYXRvclBhZ2VzVmlldyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwibmF2LXBhZ2VzXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvY29uc29sZS9lcHViTmF2aWdhdGlvbi5udW5qXCIpLnBhZ2VzLFxuXG5cdHVpOiB7XG5cdFx0dGl0bGU6IFwiZGl2LnRpdGxlXCIsXG5cdFx0Y29udGVudDogXCJkaXYuY29udGVudFwiLFxuXHRcdHBhZ2U6IFwiZGl2LnBhZ2VcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5wYWdlXCI6IFwicGFnZUNsaWNrXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMubWV0YWRhdGEgPSBvcHRpb25zLm1ldGFkYXRhO1xuXG5cdFx0aWYgKG9wdGlvbnMubWV0YWRhdGEuZ2V0KFwidG90YWxQYWdlc1wiKSA9PT0gMClcblx0XHRcdHRoaXMuJGVsLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLmxpc3RlblRvKGV2ZW50QnVzLCBcImVwdWJOYXY6c2VhcmNoXCIsIHRoaXMuc2VhcmNoLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tZXRhZGF0YS5nZXQoXCJ0b3RhbFBhZ2VzXCIpID09PSAwKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5wYWdlcyA9IG5ldyBCYWNrYm9uZS5Db2xsZWN0aW9uKCk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHRoaXMucGFnZXMsIFwiY2xpY2tlZFwiLCB0aGlzLnBhZ2VDbGljay5iaW5kKHRoaXMpKTtcblxuXHRcdF8uZWFjaCh0aGlzLm1ldGFkYXRhLmdldChcInBhZ2VzXCIpLCB4ID0+IHtcblx0XHRcdHRoaXMucGFnZXMuYWRkKG5ldyBCYWNrYm9uZS5Nb2RlbCh7IHBhZ2U6IHgucGFnZSB9KSk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLnBhZ2VzLmVhY2goaXRlbSA9PiB7XG5cdFx0XHRjb25zdCB2aWV3ID0gbmV3IFBhZ2VWaWV3KHsgbW9kZWw6IGl0ZW0gfSk7XG5cdFx0XHR0aGlzLnVpLmNvbnRlbnQuYXBwZW5kKHZpZXcucmVuZGVyKCkuZWwpO1xuXHRcdH0pO1xuXHR9LFxuXG5cdHNlYXJjaDogZnVuY3Rpb24odGV4dCkge1xuXHRcdHRoaXMucGFnZXMuZWFjaChpdGVtID0+IHtcblx0XHRcdGlmIChfLmluY2x1ZGVzKGl0ZW0uZ2V0KFwicGFnZVwiKS50b1N0cmluZygpLCB0ZXh0KSlcblx0XHRcdFx0aXRlbS50cmlnZ2VyKFwic2hvd1wiKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0aXRlbS50cmlnZ2VyKFwiaGlkZVwiKTtcblx0XHR9KTtcblx0fSxcblxuXHRwYWdlQ2xpY2s6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5FdmVudHMuUGFnZUNoYW5nZSwgbW9kZWwuZ2V0KFwicGFnZVwiKSk7XG5cdH0sXG59KTtcblxuY29uc3QgQm9va05hdmlnYXRvckJvZHlWaWV3ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJuYXYtYm9keVwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2NvbnNvbGUvZXB1Yk5hdmlnYXRpb24ubnVualwiKS5ib2R5LFxuXG5cdHVpOiB7XG5cdFx0aWZyYW1lOiBcImlmcmFtZVwiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLm1ldGFkYXRhID0gb3B0aW9ucy5tZXRhZGF0YTtcblx0XHR0aGlzLkRyYWdnYWJsZSA9IG9wdGlvbnMuZHJhZ2dhYmxlO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhldmVudEJ1cywgXCJlcHViTmF2OnNlYXJjaFwiLCB0aGlzLnNlYXJjaC5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgYm9vayA9IGV2ZW50QnVzLnJlcXVlc3QoZXZlbnRCdXMuRXZlbnRzLkdldEN1cnJlbnRCb29rKTtcblxuXHRcdGNvbnN0IG5hdlZlcnNpb24gPSBldmVudEJ1cy5yZXF1ZXN0KGV2ZW50QnVzLkV2ZW50cy5HZXROYXZWZXJzaW9uKTtcblxuXHRcdGNvbnN0IHNlY3Rpb25fc291cmNlID0gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FjYWNpYS9lcHViL3RvYy9cIiArIG5hdlZlcnNpb24gKyBcIi9cIiArIGJvb2suZ2V0KFwiX2lkXCIpICsgXCIvdG9jL1wiICsgdGhpcy5tZXRhZGF0YS5nZXQoXCJiYXNlUGF0aFwiKSArIFwiL2FjYWNpYUVuZC8/Xz1cIiArIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuXHRcdHRoaXMudWkuaWZyYW1lLmdldCgwKS5zcmMgPSBzZWN0aW9uX3NvdXJjZTtcblxuXHRcdHRoaXMudWkuaWZyYW1lLmxvYWQodGhpcy5vbkxvYWQuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0b25Mb2FkOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBuYXZWZXJzaW9uID0gZXZlbnRCdXMucmVxdWVzdChldmVudEJ1cy5FdmVudHMuR2V0TmF2VmVyc2lvbik7XG5cblx0XHRjb25zdCBib29rID0gZXZlbnRCdXMucmVxdWVzdChldmVudEJ1cy5FdmVudHMuR2V0Q3VycmVudEJvb2spO1xuXHRcdGxldCBwID0gYDxiYXNlIGhyZWY9XCIke3NldHRpbmdzLnVybFJvb3R9L2FjYWNpYS9lcHViL2ZpbGVzLyR7bmF2VmVyc2lvbn0vMC8ke2Jvb2suZ2V0KFwiX2lkXCIpfS9gO1xuXHRcdHAgKz0gYCR7dGhpcy5tZXRhZGF0YS5nZXQoXCJiYXNlUGF0aFwiKS50cmltKCl9LyR7cGF0aC5kaXJuYW1lKHRoaXMubWV0YWRhdGEuZ2V0KFwidG9jXCIpLnBhdGgpLnRyaW0oKX0vXCIgdGFyZ2V0PVwiYm9vay1kaXNwbGF5XCI+PC9iYXNlPmA7XG5cdFx0JChcImhlYWRcIiwgdGhpcy51aS5pZnJhbWUuZ2V0KDApLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQpLmFwcGVuZChwKTtcblxuXHRcdGNvbnN0IGFuY2hvcnMgPSAkKFwiYVwiLCB0aGlzLnVpLmlmcmFtZS5nZXQoMCkuY29udGVudFdpbmRvdy5kb2N1bWVudCk7XG5cblx0XHRpZiAodGhpcy5EcmFnZ2FibGUpIHtcblx0XHRcdC8vIFdoZW4gYW4gYW5jaG9yIGlzIGRyYWdnZWQsIHRoZSBIUkVGIG9mIHRoZSBhbmNob3IgaXMgdHJhbnNmZXJyZWQgYnkgZGVmYXVsdC4gVGhlIGZvbGxvd2luZyBoYW5kbGVyXG5cdFx0XHQvLyByZXBsYWNlcyB0aGUgVVJMIHdpdGggdGhlIGFuY2hvcidzIHRleHQgd2hlbmV2ZXIgYSBkcmFnIGlzIHN0YXJ0ZWQuXG5cdFx0XHRhbmNob3JzLm9uKFwiZHJhZ3N0YXJ0XCIsIGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1pbnZhbGlkLXRoaXNcblx0XHRcdFx0ZXZlbnQub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXIuc2V0RGF0YShcInRleHRcIiwgJCh0aGlzKS50ZXh0KCkpO1xuXHRcdFx0XHRldmVudC5vcmlnaW5hbEV2ZW50LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gXCJtb3ZlXCI7XG5cdFx0XHR9KTtcblxuXHRcdFx0YW5jaG9ycy5vbihcImNsaWNrXCIsIGV2ZW50ID0+IHtcblx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0YW5jaG9ycy5vZmYoXCJjbGljay5uYXZpZ2F0ZVwiKS5vbihcImNsaWNrLm5hdmlnYXRlXCIsIGV2ZW50ID0+IHtcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRcdGNvbnN0IGhyZWYgPSAkKGV2ZW50LnRhcmdldCkuYXR0cihcImhyZWZcIikgPT09IHVuZGVmaW5lZCA/ICQoZXZlbnQudGFyZ2V0KS5jbG9zZXN0KFwiYVwiKS5hdHRyKFwiaHJlZlwiKSA6ICQoZXZlbnQudGFyZ2V0KS5hdHRyKFwiaHJlZlwiKTtcblx0XHRcdGNvbnN0IGxpbmsgPSBfLnNwbGl0KGhyZWYsIFwiI1wiKTtcblxuXHRcdFx0Ly9HZXQgdGhlIGZpcnN0IHBhZ2UgdGhhdCBtYXRjaGVzIG9uIGZpbGUuXG5cdFx0XHRjb25zdCBwYWdlcyA9IHRoaXMubWV0YWRhdGEuZ2V0KFwicGFnZXNcIik7XG5cdFx0XHRsZXQgcGFnZSA9IF8uZmluZChwYWdlcywgaXRlbSA9PiBfLmluY2x1ZGVzKGl0ZW0uZmlsZSwgbGlua1swXSkpO1xuXG5cdFx0XHRpZiAoIXBhZ2UpIHtcblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZW4ndCBmb3VuZCBhIHBhZ2UsIGl0J3MgbW9zdCBsaWtlbHkgYmVjYXVzZSB0aGUgVE9DIGxpbmsgcmVmZXJlbmNlcyBhIGZpbGUgdGhhdCBkb2Vzbid0IGNvbnRhaW4gYSBwYWdlIHN0YXJ0LlxuXHRcdFx0XHQvLyBUcnkgYW5kIGdldCB0aGUgbGFzdCBwYWdlIG9mIHRoZSBmaWxlIHByZXZpb3VzIHRvIHRoZSB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgdGhlIFRPQyBsaW5rLlxuXHRcdFx0XHRjb25zdCBkb2N1bWVudHMgPSB0aGlzLm1ldGFkYXRhLmdldChcImRvY3VtZW50c1wiKTtcblx0XHRcdFx0Y29uc3QgY3VycmVudEZpbGUgPSBfLmZpbmQoZG9jdW1lbnRzLCBpdGVtID0+IF8uaW5jbHVkZXMoaXRlbSwgbGlua1swXSkpO1xuXHRcdFx0XHRjb25zdCBwcmV2aW91c0ZpbGUgPSBkb2N1bWVudHNbZG9jdW1lbnRzLmluZGV4T2YoY3VycmVudEZpbGUpIC0gMV07XG5cblx0XHRcdFx0cGFnZSA9IF8uZmluZExhc3QocGFnZXMsIGl0ZW0gPT4gXy5pbmNsdWRlcyhpdGVtLmZpbGUsIHByZXZpb3VzRmlsZSkpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocGFnZSlcblx0XHRcdFx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5FdmVudHMuUGFnZUNoYW5nZSwgcGFnZS5wYWdlKTtcblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0pO1xuXHR9LFxuXG5cdHNlYXJjaDogZnVuY3Rpb24odGV4dCkge1xuXHRcdGlmICghdGhpcy51aS5pZnJhbWUuZ2V0KDApLmNvbnRlbnRXaW5kb3cgfHwgIXRoaXMudWkuaWZyYW1lLmdldCgwKS5jb250ZW50V2luZG93LmRvY3VtZW50KVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0JChcImxpXCIsIHRoaXMudWkuaWZyYW1lLmdldCgwKS5jb250ZW50V2luZG93LmRvY3VtZW50KS5lYWNoKChpZHgsIGVsKSA9PiB7XG5cdFx0XHRpZiAoXy5pbmNsdWRlcygkKGVsKS50ZXh0KCkudG9Mb3dlckNhc2UoKSwgdGV4dCkpIHtcblx0XHRcdFx0JChlbCkuc2hvdygpO1xuXHRcdFx0XHQvLyBBbHNvIHNob3cgdGhlIHBhcmVudHNcblx0XHRcdFx0JChlbCkucGFyZW50cyhcImxpXCIpLmFkZCgkKGVsKS5wYXJlbnRzKFwib2xcIikpLnNob3coKTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHQkKGVsKS5oaWRlKCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogXCJkaXZcIixcblx0aWQ6IFwiYm9vay1uYXZpZ2F0b3JcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9jb25zb2xlL2VwdWJOYXZpZ2F0aW9uLm51bmpcIikucmVnaW9ucyxcblxuXHR1aToge1xuXHRcdHRleHRCb3g6IFwiaW5wdXRcIixcblx0XHRjbG9zZTogXCJzcGFuLmZhbFwiLFxuXHRcdGNsZWFyOiBcIi5pbnB1dC1vdmVybGF5XCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkudGV4dEJveFwiOiBcInNlYXJjaENsaWNrXCIsXG5cdFx0XCJrZXl1cCBAdWkudGV4dEJveFwiOiBcInNlYXJjaFwiLFxuXHRcdFwiY2xpY2sgQHVpLmNsb3NlXCI6IFwib25DbG9zZVwiLFxuXHRcdFwiY2xpY2sgQHVpLmNsZWFyXCI6IFwiY2xlYXJcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5tZXRhZGF0YSA9IG9wdGlvbnMubWV0YWRhdGE7XG5cdFx0dGhpcy5EcmFnZ2FibGUgPSBvcHRpb25zLmRyYWdnYWJsZTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5wYWdlcyA9IG5ldyBCb29rTmF2aWdhdG9yUGFnZXNWaWV3KHsgbWV0YWRhdGE6IHRoaXMubWV0YWRhdGEgfSk7XG5cdFx0dGhpcy5ib2R5ID0gbmV3IEJvb2tOYXZpZ2F0b3JCb2R5Vmlldyh7IG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhLCBkcmFnZ2FibGU6IHRoaXMuRHJhZ2dhYmxlIH0pO1xuXG5cdFx0dGhpcy4kZWwuYXBwZW5kKHRoaXMucGFnZXMucmVuZGVyKCkuZWwpO1xuXHRcdHRoaXMuJGVsLmFwcGVuZCh0aGlzLmJvZHkucmVuZGVyKCkuZWwpO1xuXG5cdFx0aWYgKHRoaXMuY29uZmlndXJlVUkpXG5cdFx0XHR0aGlzLmNvbmZpZ3VyZVVJKCk7XG5cdH0sXG5cblx0b25EZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnBhZ2VzLmRlc3Ryb3koKTtcblx0XHR0aGlzLmJvZHkuZGVzdHJveSgpO1xuXHR9LFxuXG5cdHNlYXJjaENsaWNrOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH0sXG5cblx0c2VhcmNoOiBfLmRlYm91bmNlKGZ1bmN0aW9uKCkge1xuXHRcdC8qIGVzbGludC1kaXNhYmxlIG5vLWludmFsaWQtdGhpcyAqL1xuXG5cdFx0aWYgKCF0aGlzLnVpLnRleHRCb3gudmFsKVxuXHRcdFx0cmV0dXJuO1xuXHRcdGV2ZW50QnVzLnRyaWdnZXIoXCJlcHViTmF2OnNlYXJjaFwiLCB0aGlzLnVpLnRleHRCb3gudmFsKCkpO1xuXG5cdFx0LyogZXNsaW50LWVuYWJsZWQgbm8taW52YWxpZC10aGlzICovXG5cdH0sIDMwMCksXG5cblx0Y2xlYXI6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdCQoZXZ0LmN1cnJlbnRUYXJnZXQpLnNpYmxpbmdzKFwiaW5wdXRcIikudmFsKFwiXCIpLnRyaWdnZXIoXCJrZXl1cFwiKTtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH0sXG5cblx0b25DbG9zZTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuY2xvc2UpXG5cdFx0XHR0aGlzLmNsb3NlKCk7XG5cblx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5DbG9zZU5hdmlnYXRpb24pO1xuXHR9LFxufSk7Il19",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\n\nvar Bus = Backbone.Radio.channel(\"educator-console\");\n_.extend(Bus, {\n\tCache: {},\n\tEvents: {}\n});\n\nBus.Events = {\n\tViewChanged: \"Page.Events.ViewChanged\", // Triggered when the chooser console's view changes\n\tViewLoaded: \"Page.Events.ViewLoaded\", // Triggered after either the book view or the educator folder view loads\n\tStartFullscreen: \"Page.Events.StartFullscreen\",\n\tEndFullscreen: \"Page.Events.endFullscreen\",\n\tOperation: \"Page.Events.Operation\",\n\n\tGetBooks: \"Page.Events.GetBooks\",\n\tGetGroups: \"Page.Events.GetGroups\",\n\tGetLearningPaths: \"Page.Events.GetLearningPaths\",\n\tGetResources: \"Page.Events.GetResources\",\n\tGetCurrentBook: \"Page.Events.GetCurrentBook\",\n\n\tGetAllowedGroups: \"Page.Events.GetAllowedGroups\",\n\tGetCurrentGroups: \"Page.Events.GetCurrentGroups\",\n\tGroupsChanged: \"Page.Events.GroupsChanged\",\n\tShowGroupModal: \"Page.Events.ShowGroupModal\",\n\n\tLoadNavigation: \"Page.Events.LoadNavigation\",\n\tGetNavVersion: \"Page.Events.GetNavVersion\",\n\n\tUnloadBook: \"Page.Events.UnloadNavigation\",\n\n\tCheckResourcesLoaded: \"Page.Events.CheckResourcesLoaded\",\n\tResourcesLoaded: \"Page.Events.ResourcesLoaded\",\n\tResourcesLoadError: \"Page.Events.ResourcesLoadError\",\n\n\tCloseResources: \"Page.Events.CloseResources\",\n\tOpenResources: \"Page.Events.OpenResources\",\n\tDisableResourceDragging: \"Page.Events.DisableResourceDragging\",\n\tEnableResourceDragging: \"Page.Events.EnableResourceDragging\",\n\tUpdateDraggingStatus: \"Page.Events.UpdateDraggingStatus\",\n\n\tCloseNavigation: \"Page.Events.CloseNavigation\",\n\tOpenNavigation: \"Page.Events.OpenNavigation\",\n\n\tFindResource: \"Page.Events.FindResource\",\n\n\tResourceDragStart: \"Page.Events.ResourceDragStart\",\n\tResourceDragEnd: \"Page.Events.ResourceDragEnd\",\n\tResourceDragDrop: \"Page.Events.ResourceDragDrop\",\n\n\tResourceCreated: \"Page.Events.ResourceCreated\",\n\n\tAttachmentDragStart: \"Page.Events.AttachmentDragStart\",\n\tAttachmentDragEnd: \"Page.Events.AttachmentDragEnd\",\n\tAttachmentAdded: \"Page.Events.AttachmentAdded\",\n\tAttachmentRemoved: \"Page.Events.AttachmentRemoved\",\n\n\tTagAdded: \"Page.Events.TagAdded\",\n\n\tPageCount: \"Page.Events.PageCount\",\n\tPageChange: \"Page.Events.PageChange\",\n\tSetPage: \"Page.Events.SetPage\",\n\n\tZoomChange: \"Page.Events.ZoomChange\",\n\n\tLoadStart: \"Page.Events.LoadStart\",\n\tLoadEnd: \"Page.Events.LoadEnd\",\n\n\tLPViewChanged: \"Page.Events.LPViewChanged\",\n\tChangeLPView: \"Page.Events.ChangeLPView\",\n\n\tMultiselectChanged: \"Page.Events.MultiselectChange\",\n\tChangeMultiselect: \"Page.Events.ChangeMultiselect\",\n\n\tShowAttachmentBin: \"Page.Events.ShowAttachmentBin\",\n\tHideAttachmentBin: \"Page.Events.HideAttachmentBin\",\n\tShowAttachmentBinContents: \"Page.Events.ShowAttachmentBinContents\",\n\tQueryRejuvenateAttachments: \"Page.Events.QueryRejuvenateAttachments\",\n\n\tShowFlashCardWidget: \"Page.Events.ShowFlashCardWidget\",\n\tHideFlashCardWidget: \"Page.Events.HideFlashCardWidget\",\n\tNoOldAttachments: \"Page.Events.NoOldAttachments\",\n\tOldAttachmentsExists: \"Page.Events.OldAttachmentsExists\",\n\n\tCAMTimelineChange: \"Page.Events.CAMTimelineChange\",\n\n\tToggleLockedAttachments: \"Page.Events.ToggleLockedAttachments\",\n\t// This event is triggered by a click inside a book. Each SimpleMenu should listen for this event\n\t// individually. The event was created because propagation of a DOM event from a book's iframe through\n\t// its containing DOM might lead to problems with event handling and propagation stops implemented\n\t// by other views in the containing DOM.\n\tCloseSimpleMenus: \"Page.Events.CloseSimpleMenus\"\n};\n\nmodule.exports = Bus;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV2ZW50QnVzLmpzIl0sIm5hbWVzIjpbIl8iLCJyZXF1aXJlIiwiQmFja2JvbmUiLCJCdXMiLCJSYWRpbyIsImNoYW5uZWwiLCJleHRlbmQiLCJDYWNoZSIsIkV2ZW50cyIsIlZpZXdDaGFuZ2VkIiwiVmlld0xvYWRlZCIsIlN0YXJ0RnVsbHNjcmVlbiIsIkVuZEZ1bGxzY3JlZW4iLCJPcGVyYXRpb24iLCJHZXRCb29rcyIsIkdldEdyb3VwcyIsIkdldExlYXJuaW5nUGF0aHMiLCJHZXRSZXNvdXJjZXMiLCJHZXRDdXJyZW50Qm9vayIsIkdldEFsbG93ZWRHcm91cHMiLCJHZXRDdXJyZW50R3JvdXBzIiwiR3JvdXBzQ2hhbmdlZCIsIlNob3dHcm91cE1vZGFsIiwiTG9hZE5hdmlnYXRpb24iLCJHZXROYXZWZXJzaW9uIiwiVW5sb2FkQm9vayIsIkNoZWNrUmVzb3VyY2VzTG9hZGVkIiwiUmVzb3VyY2VzTG9hZGVkIiwiUmVzb3VyY2VzTG9hZEVycm9yIiwiQ2xvc2VSZXNvdXJjZXMiLCJPcGVuUmVzb3VyY2VzIiwiRGlzYWJsZVJlc291cmNlRHJhZ2dpbmciLCJFbmFibGVSZXNvdXJjZURyYWdnaW5nIiwiVXBkYXRlRHJhZ2dpbmdTdGF0dXMiLCJDbG9zZU5hdmlnYXRpb24iLCJPcGVuTmF2aWdhdGlvbiIsIkZpbmRSZXNvdXJjZSIsIlJlc291cmNlRHJhZ1N0YXJ0IiwiUmVzb3VyY2VEcmFnRW5kIiwiUmVzb3VyY2VEcmFnRHJvcCIsIlJlc291cmNlQ3JlYXRlZCIsIkF0dGFjaG1lbnREcmFnU3RhcnQiLCJBdHRhY2htZW50RHJhZ0VuZCIsIkF0dGFjaG1lbnRBZGRlZCIsIkF0dGFjaG1lbnRSZW1vdmVkIiwiVGFnQWRkZWQiLCJQYWdlQ291bnQiLCJQYWdlQ2hhbmdlIiwiU2V0UGFnZSIsIlpvb21DaGFuZ2UiLCJMb2FkU3RhcnQiLCJMb2FkRW5kIiwiTFBWaWV3Q2hhbmdlZCIsIkNoYW5nZUxQVmlldyIsIk11bHRpc2VsZWN0Q2hhbmdlZCIsIkNoYW5nZU11bHRpc2VsZWN0IiwiU2hvd0F0dGFjaG1lbnRCaW4iLCJIaWRlQXR0YWNobWVudEJpbiIsIlNob3dBdHRhY2htZW50QmluQ29udGVudHMiLCJRdWVyeVJlanV2ZW5hdGVBdHRhY2htZW50cyIsIlNob3dGbGFzaENhcmRXaWRnZXQiLCJIaWRlRmxhc2hDYXJkV2lkZ2V0IiwiTm9PbGRBdHRhY2htZW50cyIsIk9sZEF0dGFjaG1lbnRzRXhpc3RzIiwiQ0FNVGltZWxpbmVDaGFuZ2UiLCJUb2dnbGVMb2NrZWRBdHRhY2htZW50cyIsIkNsb3NlU2ltcGxlTWVudXMiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLFdBQVdELFFBQVEsVUFBUixDQUFqQjs7QUFFQSxJQUFNRSxNQUFNRCxTQUFTRSxLQUFULENBQWVDLE9BQWYsQ0FBdUIsa0JBQXZCLENBQVo7QUFDQUwsRUFBRU0sTUFBRixDQUFTSCxHQUFULEVBQWM7QUFDYkksUUFBTyxFQURNO0FBRWJDLFNBQVE7QUFGSyxDQUFkOztBQUtBTCxJQUFJSyxNQUFKLEdBQWE7QUFDWkMsY0FBYSx5QkFERCxFQUM0QjtBQUN4Q0MsYUFBWSx3QkFGQSxFQUUwQjtBQUN0Q0Msa0JBQWlCLDZCQUhMO0FBSVpDLGdCQUFlLDJCQUpIO0FBS1pDLFlBQVcsdUJBTEM7O0FBT1pDLFdBQVUsc0JBUEU7QUFRWkMsWUFBVyx1QkFSQztBQVNaQyxtQkFBa0IsOEJBVE47QUFVWkMsZUFBYywwQkFWRjtBQVdaQyxpQkFBZ0IsNEJBWEo7O0FBYVpDLG1CQUFrQiw4QkFiTjtBQWNaQyxtQkFBa0IsOEJBZE47QUFlWkMsZ0JBQWUsMkJBZkg7QUFnQlpDLGlCQUFnQiw0QkFoQko7O0FBa0JaQyxpQkFBZ0IsNEJBbEJKO0FBbUJaQyxnQkFBZSwyQkFuQkg7O0FBcUJaQyxhQUFZLDhCQXJCQTs7QUF1QlpDLHVCQUFzQixrQ0F2QlY7QUF3QlpDLGtCQUFpQiw2QkF4Qkw7QUF5QlpDLHFCQUFvQixnQ0F6QlI7O0FBMkJaQyxpQkFBZ0IsNEJBM0JKO0FBNEJaQyxnQkFBZSwyQkE1Qkg7QUE2QlpDLDBCQUF5QixxQ0E3QmI7QUE4QlpDLHlCQUF3QixvQ0E5Qlo7QUErQlpDLHVCQUFzQixrQ0EvQlY7O0FBaUNaQyxrQkFBaUIsNkJBakNMO0FBa0NaQyxpQkFBZ0IsNEJBbENKOztBQW9DWkMsZUFBYywwQkFwQ0Y7O0FBc0NaQyxvQkFBbUIsK0JBdENQO0FBdUNaQyxrQkFBaUIsNkJBdkNMO0FBd0NaQyxtQkFBa0IsOEJBeENOOztBQTBDWkMsa0JBQWlCLDZCQTFDTDs7QUE0Q1pDLHNCQUFxQixpQ0E1Q1Q7QUE2Q1pDLG9CQUFtQiwrQkE3Q1A7QUE4Q1pDLGtCQUFpQiw2QkE5Q0w7QUErQ1pDLG9CQUFtQiwrQkEvQ1A7O0FBaURaQyxXQUFVLHNCQWpERTs7QUFtRFpDLFlBQVcsdUJBbkRDO0FBb0RaQyxhQUFZLHdCQXBEQTtBQXFEWkMsVUFBUyxxQkFyREc7O0FBdURaQyxhQUFZLHdCQXZEQTs7QUF5RFpDLFlBQVcsdUJBekRDO0FBMERaQyxVQUFTLHFCQTFERzs7QUE0RFpDLGdCQUFlLDJCQTVESDtBQTZEWkMsZUFBYywwQkE3REY7O0FBK0RaQyxxQkFBb0IsK0JBL0RSO0FBZ0VaQyxvQkFBbUIsK0JBaEVQOztBQWtFWkMsb0JBQW1CLCtCQWxFUDtBQW1FWkMsb0JBQW1CLCtCQW5FUDtBQW9FWkMsNEJBQTJCLHVDQXBFZjtBQXFFWkMsNkJBQTRCLHdDQXJFaEI7O0FBdUVaQyxzQkFBcUIsaUNBdkVUO0FBd0VaQyxzQkFBcUIsaUNBeEVUO0FBeUVaQyxtQkFBa0IsOEJBekVOO0FBMEVaQyx1QkFBc0Isa0NBMUVWOztBQTRFWkMsb0JBQW1CLCtCQTVFUDs7QUE4RVpDLDBCQUF5QixxQ0E5RWI7QUErRVo7QUFDQTtBQUNBO0FBQ0E7QUFDQUMsbUJBQWtCO0FBbkZOLENBQWI7O0FBc0ZBQyxPQUFPQyxPQUFQLEdBQWlCakUsR0FBakIiLCJmaWxlIjoiZXZlbnRCdXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5cbmNvbnN0IEJ1cyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJlZHVjYXRvci1jb25zb2xlXCIpO1xuXy5leHRlbmQoQnVzLCB7XG5cdENhY2hlOiB7fSxcblx0RXZlbnRzOiB7fSxcbn0pO1xuXG5CdXMuRXZlbnRzID0ge1xuXHRWaWV3Q2hhbmdlZDogXCJQYWdlLkV2ZW50cy5WaWV3Q2hhbmdlZFwiLCAvLyBUcmlnZ2VyZWQgd2hlbiB0aGUgY2hvb3NlciBjb25zb2xlJ3MgdmlldyBjaGFuZ2VzXG5cdFZpZXdMb2FkZWQ6IFwiUGFnZS5FdmVudHMuVmlld0xvYWRlZFwiLCAvLyBUcmlnZ2VyZWQgYWZ0ZXIgZWl0aGVyIHRoZSBib29rIHZpZXcgb3IgdGhlIGVkdWNhdG9yIGZvbGRlciB2aWV3IGxvYWRzXG5cdFN0YXJ0RnVsbHNjcmVlbjogXCJQYWdlLkV2ZW50cy5TdGFydEZ1bGxzY3JlZW5cIixcblx0RW5kRnVsbHNjcmVlbjogXCJQYWdlLkV2ZW50cy5lbmRGdWxsc2NyZWVuXCIsXG5cdE9wZXJhdGlvbjogXCJQYWdlLkV2ZW50cy5PcGVyYXRpb25cIixcblxuXHRHZXRCb29rczogXCJQYWdlLkV2ZW50cy5HZXRCb29rc1wiLFxuXHRHZXRHcm91cHM6IFwiUGFnZS5FdmVudHMuR2V0R3JvdXBzXCIsXG5cdEdldExlYXJuaW5nUGF0aHM6IFwiUGFnZS5FdmVudHMuR2V0TGVhcm5pbmdQYXRoc1wiLFxuXHRHZXRSZXNvdXJjZXM6IFwiUGFnZS5FdmVudHMuR2V0UmVzb3VyY2VzXCIsXG5cdEdldEN1cnJlbnRCb29rOiBcIlBhZ2UuRXZlbnRzLkdldEN1cnJlbnRCb29rXCIsXG5cblx0R2V0QWxsb3dlZEdyb3VwczogXCJQYWdlLkV2ZW50cy5HZXRBbGxvd2VkR3JvdXBzXCIsXG5cdEdldEN1cnJlbnRHcm91cHM6IFwiUGFnZS5FdmVudHMuR2V0Q3VycmVudEdyb3Vwc1wiLFxuXHRHcm91cHNDaGFuZ2VkOiBcIlBhZ2UuRXZlbnRzLkdyb3Vwc0NoYW5nZWRcIixcblx0U2hvd0dyb3VwTW9kYWw6IFwiUGFnZS5FdmVudHMuU2hvd0dyb3VwTW9kYWxcIixcblxuXHRMb2FkTmF2aWdhdGlvbjogXCJQYWdlLkV2ZW50cy5Mb2FkTmF2aWdhdGlvblwiLFxuXHRHZXROYXZWZXJzaW9uOiBcIlBhZ2UuRXZlbnRzLkdldE5hdlZlcnNpb25cIixcblxuXHRVbmxvYWRCb29rOiBcIlBhZ2UuRXZlbnRzLlVubG9hZE5hdmlnYXRpb25cIixcblxuXHRDaGVja1Jlc291cmNlc0xvYWRlZDogXCJQYWdlLkV2ZW50cy5DaGVja1Jlc291cmNlc0xvYWRlZFwiLFxuXHRSZXNvdXJjZXNMb2FkZWQ6IFwiUGFnZS5FdmVudHMuUmVzb3VyY2VzTG9hZGVkXCIsXG5cdFJlc291cmNlc0xvYWRFcnJvcjogXCJQYWdlLkV2ZW50cy5SZXNvdXJjZXNMb2FkRXJyb3JcIixcblxuXHRDbG9zZVJlc291cmNlczogXCJQYWdlLkV2ZW50cy5DbG9zZVJlc291cmNlc1wiLFxuXHRPcGVuUmVzb3VyY2VzOiBcIlBhZ2UuRXZlbnRzLk9wZW5SZXNvdXJjZXNcIixcblx0RGlzYWJsZVJlc291cmNlRHJhZ2dpbmc6IFwiUGFnZS5FdmVudHMuRGlzYWJsZVJlc291cmNlRHJhZ2dpbmdcIixcblx0RW5hYmxlUmVzb3VyY2VEcmFnZ2luZzogXCJQYWdlLkV2ZW50cy5FbmFibGVSZXNvdXJjZURyYWdnaW5nXCIsXG5cdFVwZGF0ZURyYWdnaW5nU3RhdHVzOiBcIlBhZ2UuRXZlbnRzLlVwZGF0ZURyYWdnaW5nU3RhdHVzXCIsXG5cblx0Q2xvc2VOYXZpZ2F0aW9uOiBcIlBhZ2UuRXZlbnRzLkNsb3NlTmF2aWdhdGlvblwiLFxuXHRPcGVuTmF2aWdhdGlvbjogXCJQYWdlLkV2ZW50cy5PcGVuTmF2aWdhdGlvblwiLFxuXG5cdEZpbmRSZXNvdXJjZTogXCJQYWdlLkV2ZW50cy5GaW5kUmVzb3VyY2VcIixcblxuXHRSZXNvdXJjZURyYWdTdGFydDogXCJQYWdlLkV2ZW50cy5SZXNvdXJjZURyYWdTdGFydFwiLFxuXHRSZXNvdXJjZURyYWdFbmQ6IFwiUGFnZS5FdmVudHMuUmVzb3VyY2VEcmFnRW5kXCIsXG5cdFJlc291cmNlRHJhZ0Ryb3A6IFwiUGFnZS5FdmVudHMuUmVzb3VyY2VEcmFnRHJvcFwiLFxuXG5cdFJlc291cmNlQ3JlYXRlZDogXCJQYWdlLkV2ZW50cy5SZXNvdXJjZUNyZWF0ZWRcIixcblxuXHRBdHRhY2htZW50RHJhZ1N0YXJ0OiBcIlBhZ2UuRXZlbnRzLkF0dGFjaG1lbnREcmFnU3RhcnRcIixcblx0QXR0YWNobWVudERyYWdFbmQ6IFwiUGFnZS5FdmVudHMuQXR0YWNobWVudERyYWdFbmRcIixcblx0QXR0YWNobWVudEFkZGVkOiBcIlBhZ2UuRXZlbnRzLkF0dGFjaG1lbnRBZGRlZFwiLFxuXHRBdHRhY2htZW50UmVtb3ZlZDogXCJQYWdlLkV2ZW50cy5BdHRhY2htZW50UmVtb3ZlZFwiLFxuXG5cdFRhZ0FkZGVkOiBcIlBhZ2UuRXZlbnRzLlRhZ0FkZGVkXCIsXG5cblx0UGFnZUNvdW50OiBcIlBhZ2UuRXZlbnRzLlBhZ2VDb3VudFwiLFxuXHRQYWdlQ2hhbmdlOiBcIlBhZ2UuRXZlbnRzLlBhZ2VDaGFuZ2VcIixcblx0U2V0UGFnZTogXCJQYWdlLkV2ZW50cy5TZXRQYWdlXCIsXG5cblx0Wm9vbUNoYW5nZTogXCJQYWdlLkV2ZW50cy5ab29tQ2hhbmdlXCIsXG5cblx0TG9hZFN0YXJ0OiBcIlBhZ2UuRXZlbnRzLkxvYWRTdGFydFwiLFxuXHRMb2FkRW5kOiBcIlBhZ2UuRXZlbnRzLkxvYWRFbmRcIixcblxuXHRMUFZpZXdDaGFuZ2VkOiBcIlBhZ2UuRXZlbnRzLkxQVmlld0NoYW5nZWRcIixcblx0Q2hhbmdlTFBWaWV3OiBcIlBhZ2UuRXZlbnRzLkNoYW5nZUxQVmlld1wiLFxuXG5cdE11bHRpc2VsZWN0Q2hhbmdlZDogXCJQYWdlLkV2ZW50cy5NdWx0aXNlbGVjdENoYW5nZVwiLFxuXHRDaGFuZ2VNdWx0aXNlbGVjdDogXCJQYWdlLkV2ZW50cy5DaGFuZ2VNdWx0aXNlbGVjdFwiLFxuXG5cdFNob3dBdHRhY2htZW50QmluOiBcIlBhZ2UuRXZlbnRzLlNob3dBdHRhY2htZW50QmluXCIsXG5cdEhpZGVBdHRhY2htZW50QmluOiBcIlBhZ2UuRXZlbnRzLkhpZGVBdHRhY2htZW50QmluXCIsXG5cdFNob3dBdHRhY2htZW50QmluQ29udGVudHM6IFwiUGFnZS5FdmVudHMuU2hvd0F0dGFjaG1lbnRCaW5Db250ZW50c1wiLFxuXHRRdWVyeVJlanV2ZW5hdGVBdHRhY2htZW50czogXCJQYWdlLkV2ZW50cy5RdWVyeVJlanV2ZW5hdGVBdHRhY2htZW50c1wiLFxuXG5cdFNob3dGbGFzaENhcmRXaWRnZXQ6IFwiUGFnZS5FdmVudHMuU2hvd0ZsYXNoQ2FyZFdpZGdldFwiLFxuXHRIaWRlRmxhc2hDYXJkV2lkZ2V0OiBcIlBhZ2UuRXZlbnRzLkhpZGVGbGFzaENhcmRXaWRnZXRcIixcblx0Tm9PbGRBdHRhY2htZW50czogXCJQYWdlLkV2ZW50cy5Ob09sZEF0dGFjaG1lbnRzXCIsXG5cdE9sZEF0dGFjaG1lbnRzRXhpc3RzOiBcIlBhZ2UuRXZlbnRzLk9sZEF0dGFjaG1lbnRzRXhpc3RzXCIsXG5cblx0Q0FNVGltZWxpbmVDaGFuZ2U6IFwiUGFnZS5FdmVudHMuQ0FNVGltZWxpbmVDaGFuZ2VcIixcblxuXHRUb2dnbGVMb2NrZWRBdHRhY2htZW50czogXCJQYWdlLkV2ZW50cy5Ub2dnbGVMb2NrZWRBdHRhY2htZW50c1wiLFxuXHQvLyBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCBieSBhIGNsaWNrIGluc2lkZSBhIGJvb2suIEVhY2ggU2ltcGxlTWVudSBzaG91bGQgbGlzdGVuIGZvciB0aGlzIGV2ZW50XG5cdC8vIGluZGl2aWR1YWxseS4gVGhlIGV2ZW50IHdhcyBjcmVhdGVkIGJlY2F1c2UgcHJvcGFnYXRpb24gb2YgYSBET00gZXZlbnQgZnJvbSBhIGJvb2sncyBpZnJhbWUgdGhyb3VnaFxuXHQvLyBpdHMgY29udGFpbmluZyBET00gbWlnaHQgbGVhZCB0byBwcm9ibGVtcyB3aXRoIGV2ZW50IGhhbmRsaW5nIGFuZCBwcm9wYWdhdGlvbiBzdG9wcyBpbXBsZW1lbnRlZFxuXHQvLyBieSBvdGhlciB2aWV3cyBpbiB0aGUgY29udGFpbmluZyBET00uXG5cdENsb3NlU2ltcGxlTWVudXM6IFwiUGFnZS5FdmVudHMuQ2xvc2VTaW1wbGVNZW51c1wiLFxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBCdXM7Il19",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\n\nvar eventBus = require(\"./eventBus\");\n\nvar BigModal = require(\"../../../lib/bigModal\");\n\nmodule.exports = BigModal.extend({\n\tui: {\n\t\tbox: \"select\",\n\t\tclearSearch: \".input-overlay\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.clearSearch\": \"clearSearch\"\n\t},\n\n\terrorMap: {\n\t\tvalues: {\n\t\t\tattractionElement: \"box\",\n\t\t\tposition: \"bottom\",\n\t\t\tchangeElement: \"box\"\n\t\t}\n\t},\n\n\tinitialize: function initialize(options) {\n\t\t_.bindAll(this);\n\n\t\tthis.currentGroups = options.currentGroups || eventBus.request(eventBus.Events.GetCurrentGroups);\n\n\t\tthis.forAttachment = Boolean(options.forAttachment);\n\n\t\tthis.Options = _.extend({\n\t\t\tclasses: [\"console-group-modal\"],\n\t\t\ttemplate: require(\"../../templates/console/groupModal.nunj\").content,\n\t\t\tbuttons: {\n\t\t\t\tok: {\n\t\t\t\t\ttype: \"accept\",\n\t\t\t\t\tlabel: \"OK\",\n\t\t\t\t\tmode: \"create\",\n\t\t\t\t\tvalidate: true\n\t\t\t\t},\n\t\t\t\tcancel: {\n\t\t\t\t\ttype: \"cancel\",\n\t\t\t\t\tlabel: \"Cancel\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tdataNoun: \"group settings\",\n\t\t\tcreateIcon: \"fa-users-class\",\n\t\t\tcreateVerb: \"change\"\n\t\t}, options);\n\n\t\tthis.ui = _.extend(this.ui, BigModal.prototype.ui);\n\t\tthis.events = _.extend(this.events, BigModal.prototype.events);\n\n\t\tBigModal.prototype.initialize.call(this);\n\t},\n\n\tserializeData: function serializeData() {\n\t\t// Get the groups permissible for the current item (book or group)\n\t\tvar groups = eventBus.request(eventBus.Events.GetAllowedGroups);\n\n\t\tvar ret = {\n\t\t\tgroups: groups,\n\t\t\tcurrent: this.currentGroups,\n\t\t\tforAttachment: this.forAttachment\n\t\t};\n\n\t\treturn ret;\n\t},\n\n\trenderForm: function renderForm() {\n\t\tthis.ui.box.multiSelect({\n\t\t\tselectableHeader: \"<div>Available</div><label class='search-box'><span class='fal fa-search'/>\\n\\t\\t\\t\\t<input type='text' class='search-input' autocomplete='off' required title='' placeholder='Search for groups...'><div class='input-overlay fal fa-times'/></label>\",\n\t\t\tselectionHeader: \"<div>Chosen</div><label class='search-box'><span class='fal fa-search'/>\\n\\t\\t\\t\\t<input type='text' class='search-input' autocomplete='off' required title='' placeholder='Search for groups...'><div class='input-overlay fal fa-times'/></label>\",\n\t\t\tcssClass: \"group-multi\",\n\t\t\tafterInit: function afterInit() {\n\t\t\t\tvar _this = this;\n\n\t\t\t\tvar $selectableSearch = this.$selectableUl.prev().children(\"input\"),\n\t\t\t\t    $selectionSearch = this.$selectionUl.prev().children(\"input\"),\n\t\t\t\t    selectableSearchString = \"#\" + this.$container.attr(\"id\") + \" .ms-elem-selectable:not(.ms-selected)\",\n\t\t\t\t    selectionSearchString = \"#\" + this.$container.attr(\"id\") + \" .ms-elem-selection.ms-selected\";\n\n\t\t\t\tthis.qs1 = $selectableSearch.quicksearch(selectableSearchString).on(\"keydown\", function (e) {\n\t\t\t\t\tif (e.which === 40) {\n\t\t\t\t\t\t_this.$selectableUl.focus();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tsetTimeout(function () {\n\t\t\t\t\t_this.qs1.cache();\n\t\t\t\t}, 100);\n\n\t\t\t\tthis.qs2 = $selectionSearch.quicksearch(selectionSearchString).on(\"keydown\", function (e) {\n\t\t\t\t\tif (!e.originalEvent) {\n\t\t\t\t\t\t_this.qs2.cache();\n\t\t\t\t\t} else if (e.which === 40) {\n\t\t\t\t\t\t_this.$selectionUl.focus();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tsetTimeout(function () {\n\t\t\t\t\t_this.qs2.cache();\n\t\t\t\t}, 100);\n\t\t\t},\n\t\t\tafterSelect: function afterSelect() {\n\t\t\t\tthis.qs1.cache();\n\t\t\t\tthis.qs2.cache();\n\t\t\t},\n\t\t\tafterDeselect: function afterDeselect() {\n\t\t\t\tthis.qs1.cache();\n\t\t\t\tthis.qs2.cache();\n\t\t\t}\n\t\t});\n\t},\n\n\tclearSearch: function clearSearch(evt) {\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\n\t\tvar el = $(evt.currentTarget).parent(\"label\").children(\"input\");\n\n\t\tel.val(\"\").keyup();\n\t},\n\n\tbeforeSave: function beforeSave() {\n\t\tvar vals = this.ui.box.val() || [];\n\t\tif (!vals.length) {\n\t\t\tthis.showValidationErrorMessage($(\".ms-selection\", this.el), $(\"select[name='groups']\", this.el), \"You must choose at least one group\", \"right\");\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t},\n\n\tassembleResult: function assembleResult() {\n\t\tvar vals = this.ui.box.val() || [];\n\n\t\treturn {\n\t\t\tvalues: vals\n\t\t};\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImdyb3VwTW9kYWwuanMiXSwibmFtZXMiOlsiJCIsInJlcXVpcmUiLCJfIiwiZXZlbnRCdXMiLCJCaWdNb2RhbCIsIm1vZHVsZSIsImV4cG9ydHMiLCJleHRlbmQiLCJ1aSIsImJveCIsImNsZWFyU2VhcmNoIiwiZXZlbnRzIiwiZXJyb3JNYXAiLCJ2YWx1ZXMiLCJhdHRyYWN0aW9uRWxlbWVudCIsInBvc2l0aW9uIiwiY2hhbmdlRWxlbWVudCIsImluaXRpYWxpemUiLCJvcHRpb25zIiwiYmluZEFsbCIsImN1cnJlbnRHcm91cHMiLCJyZXF1ZXN0IiwiRXZlbnRzIiwiR2V0Q3VycmVudEdyb3VwcyIsImZvckF0dGFjaG1lbnQiLCJCb29sZWFuIiwiT3B0aW9ucyIsImNsYXNzZXMiLCJ0ZW1wbGF0ZSIsImNvbnRlbnQiLCJidXR0b25zIiwib2siLCJ0eXBlIiwibGFiZWwiLCJtb2RlIiwidmFsaWRhdGUiLCJjYW5jZWwiLCJkYXRhTm91biIsImNyZWF0ZUljb24iLCJjcmVhdGVWZXJiIiwicHJvdG90eXBlIiwiY2FsbCIsInNlcmlhbGl6ZURhdGEiLCJncm91cHMiLCJHZXRBbGxvd2VkR3JvdXBzIiwicmV0IiwiY3VycmVudCIsInJlbmRlckZvcm0iLCJtdWx0aVNlbGVjdCIsInNlbGVjdGFibGVIZWFkZXIiLCJzZWxlY3Rpb25IZWFkZXIiLCJjc3NDbGFzcyIsImFmdGVySW5pdCIsIiRzZWxlY3RhYmxlU2VhcmNoIiwiJHNlbGVjdGFibGVVbCIsInByZXYiLCJjaGlsZHJlbiIsIiRzZWxlY3Rpb25TZWFyY2giLCIkc2VsZWN0aW9uVWwiLCJzZWxlY3RhYmxlU2VhcmNoU3RyaW5nIiwiJGNvbnRhaW5lciIsImF0dHIiLCJzZWxlY3Rpb25TZWFyY2hTdHJpbmciLCJxczEiLCJxdWlja3NlYXJjaCIsIm9uIiwiZSIsIndoaWNoIiwiZm9jdXMiLCJzZXRUaW1lb3V0IiwiY2FjaGUiLCJxczIiLCJvcmlnaW5hbEV2ZW50IiwiYWZ0ZXJTZWxlY3QiLCJhZnRlckRlc2VsZWN0IiwiZXZ0Iiwic3RvcFByb3BhZ2F0aW9uIiwicHJldmVudERlZmF1bHQiLCJlbCIsImN1cnJlbnRUYXJnZXQiLCJwYXJlbnQiLCJ2YWwiLCJrZXl1cCIsImJlZm9yZVNhdmUiLCJ2YWxzIiwibGVuZ3RoIiwic2hvd1ZhbGlkYXRpb25FcnJvck1lc3NhZ2UiLCJhc3NlbWJsZVJlc3VsdCJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsSUFBSUMsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjs7QUFFQSxJQUFNRSxXQUFXRixRQUFRLFlBQVIsQ0FBakI7O0FBRUEsSUFBTUcsV0FBV0gsUUFBUSx1QkFBUixDQUFqQjs7QUFFQUksT0FBT0MsT0FBUCxHQUFpQkYsU0FBU0csTUFBVCxDQUFnQjtBQUNoQ0MsS0FBSTtBQUNIQyxPQUFLLFFBREY7QUFFSEMsZUFBYTtBQUZWLEVBRDRCOztBQU1oQ0MsU0FBUTtBQUNQLDJCQUF5QjtBQURsQixFQU53Qjs7QUFVaENDLFdBQVU7QUFDVEMsVUFBUTtBQUNQQyxzQkFBbUIsS0FEWjtBQUVQQyxhQUFVLFFBRkg7QUFHUEMsa0JBQWU7QUFIUjtBQURDLEVBVnNCOztBQWtCaENDLGFBQVksb0JBQVNDLE9BQVQsRUFBa0I7QUFDN0JoQixJQUFFaUIsT0FBRixDQUFVLElBQVY7O0FBRUEsT0FBS0MsYUFBTCxHQUFxQkYsUUFBUUUsYUFBUixJQUF5QmpCLFNBQVNrQixPQUFULENBQWlCbEIsU0FBU21CLE1BQVQsQ0FBZ0JDLGdCQUFqQyxDQUE5Qzs7QUFFQSxPQUFLQyxhQUFMLEdBQXFCQyxRQUFRUCxRQUFRTSxhQUFoQixDQUFyQjs7QUFFQSxPQUFLRSxPQUFMLEdBQWV4QixFQUFFSyxNQUFGLENBQVM7QUFDdkJvQixZQUFTLENBQUMscUJBQUQsQ0FEYztBQUV2QkMsYUFBVTNCLFFBQVEseUNBQVIsRUFBbUQ0QixPQUZ0QztBQUd2QkMsWUFBUztBQUNSQyxRQUFJO0FBQ0hDLFdBQU0sUUFESDtBQUVIQyxZQUFPLElB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LEtBQVQ7QUFDQSxTQUFLQyxHQUFMLENBQVNELEtBQVQ7QUFDQTtBQXRDc0IsR0FBeEI7QUF3Q0EsRUF6RytCOztBQTJHaEM1RCxjQUFhLHFCQUFTaUUsR0FBVCxFQUFjO0FBQzFCQSxNQUFJQyxlQUFKO0FBQ0FELE1BQUlFLGNBQUo7O0FBRUEsTUFBTUMsS0FBSzlFLEVBQUUyRSxJQUFJSSxhQUFOLEVBQXFCQyxNQUFyQixDQUE0QixPQUE1QixFQUFxQ3hCLFFBQXJDLENBQThDLE9BQTlDLENBQVg7O0FBRUFzQixLQUFHRyxHQUFILENBQU8sRUFBUCxFQUFXQyxLQUFYO0FBQ0EsRUFsSCtCOztBQW9IaENDLGFBQVksc0JBQVc7QUFDdEIsTUFBTUMsT0FBTyxLQUFLNUUsRUFBTCxDQUFRQyxHQUFSLENBQVl3RSxHQUFaLE1BQXFCLEVBQWxDO0FBQ0EsTUFBSSxDQUFDRyxLQUFLQyxNQUFWLEVBQWtCO0FBQ2pCLFFBQUtDLDBCQUFMLENBQWdDdEYsRUFBRSxlQUFGLEVBQW1CLEtBQUs4RSxFQUF4QixDQUFoQyxFQUE2RDlFLEVBQUUsdUJBQUYsRUFBMkIsS0FBSzhFLEVBQWhDLENBQTdELEVBQWtHLG9DQUFsRyxFQUF3SSxPQUF4STtBQUNBLFVBQU8sS0FBUDtBQUNBOztBQUVELFNBQU8sSUFBUDtBQUNBLEVBNUgrQjs7QUE4SGhDUyxpQkFBZ0IsMEJBQVc7QUFDMUIsTUFBTUgsT0FBTyxLQUFLNUUsRUFBTCxDQUFRQyxHQUFSLENBQVl3RSxHQUFaLE1BQXFCLEVBQWxDOztBQUVBLFNBQU87QUFDTnBFLFdBQVF1RTtBQURGLEdBQVA7QUFHQTtBQXBJK0IsQ0FBaEIsQ0FBakIiLCJmaWxlIjoiZ3JvdXBNb2RhbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcblxuY29uc3QgZXZlbnRCdXMgPSByZXF1aXJlKFwiLi9ldmVudEJ1c1wiKTtcblxuY29uc3QgQmlnTW9kYWwgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL2JpZ01vZGFsXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJpZ01vZGFsLmV4dGVuZCh7XG5cdHVpOiB7XG5cdFx0Ym94OiBcInNlbGVjdFwiLFxuXHRcdGNsZWFyU2VhcmNoOiBcIi5pbnB1dC1vdmVybGF5XCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkuY2xlYXJTZWFyY2hcIjogXCJjbGVhclNlYXJjaFwiLFxuXHR9LFxuXG5cdGVycm9yTWFwOiB7XG5cdFx0dmFsdWVzOiB7XG5cdFx0XHRhdHRyYWN0aW9uRWxlbWVudDogXCJib3hcIixcblx0XHRcdHBvc2l0aW9uOiBcImJvdHRvbVwiLFxuXHRcdFx0Y2hhbmdlRWxlbWVudDogXCJib3hcIixcblx0XHR9LFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHRfLmJpbmRBbGwodGhpcyk7XG5cblx0XHR0aGlzLmN1cnJlbnRHcm91cHMgPSBvcHRpb25zLmN1cnJlbnRHcm91cHMgfHwgZXZlbnRCdXMucmVxdWVzdChldmVudEJ1cy5FdmVudHMuR2V0Q3VycmVudEdyb3Vwcyk7XG5cblx0XHR0aGlzLmZvckF0dGFjaG1lbnQgPSBCb29sZWFuKG9wdGlvbnMuZm9yQXR0YWNobWVudCk7XG5cblx0XHR0aGlzLk9wdGlvbnMgPSBfLmV4dGVuZCh7XG5cdFx0XHRjbGFzc2VzOiBbXCJjb25zb2xlLWdyb3VwLW1vZGFsXCJdLFxuXHRcdFx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvY29uc29sZS9ncm91cE1vZGFsLm51bmpcIikuY29udGVudCxcblx0XHRcdGJ1dHRvbnM6IHtcblx0XHRcdFx0b2s6IHtcblx0XHRcdFx0XHR0eXBlOiBcImFjY2VwdFwiLFxuXHRcdFx0XHRcdGxhYmVsOiBcIk9LXCIsXG5cdFx0XHRcdFx0bW9kZTogXCJjcmVhdGVcIixcblx0XHRcdFx0XHR2YWxpZGF0ZTogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0Y2FuY2VsOiB7XG5cdFx0XHRcdFx0dHlwZTogXCJjYW5jZWxcIixcblx0XHRcdFx0XHRsYWJlbDogXCJDYW5jZWxcIixcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XHRkYXRhTm91bjogXCJncm91cCBzZXR0aW5nc1wiLFxuXHRcdFx0Y3JlYXRlSWNvbjogXCJmYS11c2Vycy1jbGFzc1wiLFxuXHRcdFx0Y3JlYXRlVmVyYjogXCJjaGFuZ2VcIixcblx0XHR9LCBvcHRpb25zKTtcblxuXHRcdHRoaXMudWkgPSBfLmV4dGVuZCh0aGlzLnVpLCBCaWdNb2RhbC5wcm90b3R5cGUudWkpO1xuXHRcdHRoaXMuZXZlbnRzID0gXy5leHRlbmQodGhpcy5ldmVudHMsIEJpZ01vZGFsLnByb3RvdHlwZS5ldmVudHMpO1xuXG5cdFx0QmlnTW9kYWwucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzKTtcblx0fSxcblxuXHRzZXJpYWxpemVEYXRhOiBmdW5jdGlvbigpIHtcblx0XHQvLyBHZXQgdGhlIGdyb3VwcyBwZXJtaXNzaWJsZSBmb3IgdGhlIGN1cnJlbnQgaXRlbSAoYm9vayBvciBncm91cClcblx0XHRjb25zdCBncm91cHMgPSBldmVudEJ1cy5yZXF1ZXN0KGV2ZW50QnVzLkV2ZW50cy5HZXRBbGxvd2VkR3JvdXBzKTtcblxuXHRcdGNvbnN0IHJldCA9IHtcblx0XHRcdGdyb3VwczogZ3JvdXBzLFxuXHRcdFx0Y3VycmVudDogdGhpcy5jdXJyZW50R3JvdXBzLFxuXHRcdFx0Zm9yQXR0YWNobWVudDogdGhpcy5mb3JBdHRhY2htZW50LFxuXHRcdH07XG5cblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXG5cdHJlbmRlckZvcm06IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkuYm94Lm11bHRpU2VsZWN0KHtcblx0XHRcdHNlbGVjdGFibGVIZWFkZXI6IGA8ZGl2PkF2YWlsYWJsZTwvZGl2PjxsYWJlbCBjbGFzcz0nc2VhcmNoLWJveCc+PHNwYW4gY2xhc3M9J2ZhbCBmYS1zZWFyY2gnLz5cblx0XHRcdFx0PGlucHV0IHR5cGU9J3RleHQnIGNsYXNzPSdzZWFyY2gtaW5wdXQnIGF1dG9jb21wbGV0ZT0nb2ZmJyByZXF1aXJlZCB0aXRsZT0nJyBwbGFjZWhvbGRlcj0nU2VhcmNoIGZvciBncm91cHMuLi4nPjxkaXYgY2xhc3M9J2lucHV0LW92ZXJsYXkgZmFsIGZhLXRpbWVzJy8+PC9sYWJlbD5gLFxuXHRcdFx0c2VsZWN0aW9uSGVhZGVyOiBgPGRpdj5DaG9zZW48L2Rpdj48bGFiZWwgY2xhc3M9J3NlYXJjaC1ib3gnPjxzcGFuIGNsYXNzPSdmYWwgZmEtc2VhcmNoJy8+XG5cdFx0XHRcdDxpbnB1dCB0eXBlPSd0ZXh0JyBjbGFzcz0nc2VhcmNoLWlucHV0JyBhdXRvY29tcGxldGU9J29mZicgcmVxdWlyZWQgdGl0bGU9JycgcGxhY2Vob2xkZXI9J1NlYXJjaCBmb3IgZ3JvdXBzLi4uJz48ZGl2IGNsYXNzPSdpbnB1dC1vdmVybGF5IGZhbCBmYS10aW1lcycvPjwvbGFiZWw+YCxcblx0XHRcdGNzc0NsYXNzOiBcImdyb3VwLW11bHRpXCIsXG5cdFx0XHRhZnRlckluaXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRjb25zdCAkc2VsZWN0YWJsZVNlYXJjaCA9IHRoaXMuJHNlbGVjdGFibGVVbC5wcmV2KCkuY2hpbGRyZW4oXCJpbnB1dFwiKSxcblx0XHRcdFx0XHQkc2VsZWN0aW9uU2VhcmNoID0gdGhpcy4kc2VsZWN0aW9uVWwucHJldigpLmNoaWxkcmVuKFwiaW5wdXRcIiksXG5cdFx0XHRcdFx0c2VsZWN0YWJsZVNlYXJjaFN0cmluZyA9IFwiI1wiICsgdGhpcy4kY29udGFpbmVyLmF0dHIoXCJpZFwiKSArIFwiIC5tcy1lbGVtLXNlbGVjdGFibGU6bm90KC5tcy1zZWxlY3RlZClcIixcblx0XHRcdFx0XHRzZWxlY3Rpb25TZWFyY2hTdHJpbmcgPSBcIiNcIiArIHRoaXMuJGNvbnRhaW5lci5hdHRyKFwiaWRcIikgKyBcIiAubXMtZWxlbS1zZWxlY3Rpb24ubXMtc2VsZWN0ZWRcIjtcblxuXHRcdFx0XHR0aGlzLnFzMSA9ICRzZWxlY3RhYmxlU2VhcmNoLnF1aWNrc2VhcmNoKHNlbGVjdGFibGVTZWFyY2hTdHJpbmcpLm9uKFwia2V5ZG93blwiLCBlID0+IHtcblx0XHRcdFx0XHRpZiAoZS53aGljaCA9PT0gNDApIHtcblx0XHRcdFx0XHRcdHRoaXMuJHNlbGVjdGFibGVVbC5mb2N1cygpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLnFzMS5jYWNoZSgpOyB9LCAxMDApO1xuXG5cdFx0XHRcdHRoaXMucXMyID0gJHNlbGVjdGlvblNlYXJjaC5xdWlja3NlYXJjaChzZWxlY3Rpb25TZWFyY2hTdHJpbmcpLm9uKFwia2V5ZG93blwiLCBlID0+IHtcblx0XHRcdFx0XHRpZiAoIWUub3JpZ2luYWxFdmVudCkge1xuXHRcdFx0XHRcdFx0dGhpcy5xczIuY2FjaGUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZSBpZiAoZS53aGljaCA9PT0gNDApIHtcblx0XHRcdFx0XHRcdHRoaXMuJHNlbGVjdGlvblVsLmZvY3VzKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdFx0c2V0VGltZW91dCgoKSA9PiB7IHRoaXMucXMyLmNhY2hlKCk7IH0sIDEwMCk7XG5cdFx0XHR9LFxuXHRcdFx0YWZ0ZXJTZWxlY3Q6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR0aGlzLnFzMS5jYWNoZSgpO1xuXHRcdFx0XHR0aGlzLnFzMi5jYWNoZSgpO1xuXHRcdFx0fSxcblx0XHRcdGFmdGVyRGVzZWxlY3Q6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR0aGlzLnFzMS5jYWNoZSgpO1xuXHRcdFx0XHR0aGlzLnFzMi5jYWNoZSgpO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fSxcblxuXHRjbGVhclNlYXJjaDogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0Y29uc3QgZWwgPSAkKGV2dC5jdXJyZW50VGFyZ2V0KS5wYXJlbnQoXCJsYWJlbFwiKS5jaGlsZHJlbihcImlucHV0XCIpO1xuXG5cdFx0ZWwudmFsKFwiXCIpLmtleXVwKCk7XG5cdH0sXG5cblx0YmVmb3JlU2F2ZTogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgdmFscyA9IHRoaXMudWkuYm94LnZhbCgpIHx8IFtdO1xuXHRcdGlmICghdmFscy5sZW5ndGgpIHtcblx0XHRcdHRoaXMuc2hvd1ZhbGlkYXRpb25FcnJvck1lc3NhZ2UoJChcIi5tcy1zZWxlY3Rpb25cIiwgdGhpcy5lbCksICQoXCJzZWxlY3RbbmFtZT0nZ3JvdXBzJ11cIiwgdGhpcy5lbCksIFwiWW91IG11c3QgY2hvb3NlIGF0IGxlYXN0IG9uZSBncm91cFwiLCBcInJpZ2h0XCIpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdGFzc2VtYmxlUmVzdWx0OiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCB2YWxzID0gdGhpcy51aS5ib3gudmFsKCkgfHwgW107XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0dmFsdWVzOiB2YWxzLFxuXHRcdH07XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar tippy = require(\"tippy.js\").default;\nrequire(\"rangeslider\");\n\nvar eventBus = require(\"./eventBus\");\nvar settings = require(\"app-settings\");\nvar CamBtn = require(\"../camBtn\");\nvar App = require(\"../../../index\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"header-region\",\n\ttemplate: require(\"../../templates/console/header.nunj\"),\n\n\tui: {\n\t\tattachmentBin: \".attachment-bin\",\n\t\tfullscreen: \".fullscreen-toggle\",\n\t\tlocation: \".heading .location\",\n\t\tlocationText: \".heading .location .text\",\n\t\ttitle: \".heading .title div\",\n\t\tpaging: \".paging\",\n\t\tzoom: \".zoom\",\n\t\tzoomIn: \".zoom-in\",\n\t\tzoomOut: \".zoom-out\",\n\t\tshareLocation: \".share-location\",\n\t\tzoomLevel: \".zoom-level\",\n\t\tflipContainer: \".lp-flipswitch\",\n\t\tflipswitch: \"input[type='checkbox'].flipswitch-cb\",\n\t\tmultiselectContainer: \".multiselect-container\",\n\t\tmultiselector: \".multiselect-container input\",\n\t\tcamBtnContainer: \".cam-btn-container\",\n\t\thideLockedBtn: \".hide-locked-btn\",\n\t\tcloneAllBtn: \".clone-all-btn\",\n\t\tbottomArea: \".bottom-area\",\n\n\t\tpageName: \"span.total\",\n\t\tpageSlider: \"input[name='page-slider']\",\n\t\tpageDropdown: \".page-dropdown\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.attachmentBin\": \"onAttachmentBinClick\",\n\t\t\"click @ui.fullscreen\": \"toggleFullscreen\",\n\t\t\"click @ui.settings\": \"settings\",\n\n\t\t\"mouseover @ui.location\": \"locationOver\",\n\t\t\"mouseout @ui.location\": \"locationOut\",\n\t\t\"change @ui.pageSlider\": \"pageSliderChanged\",\n\t\t\"input @ui.pageSlider\": \"pageSliderChanged\",\n\t\t\"change @ui.pageDropdown\": \"pageDropdownChanged\",\n\t\t\"click @ui.flipswitch\": \"lpViewChange\",\n\t\t\"click @ui.multiselector\": \"multiselectionChange\",\n\n\t\t\"click @ui.zoomIn\": \"zoomIn\",\n\t\t\"click @ui.zoomOut\": \"zoomOut\",\n\t\t\"click @ui.cloneAllBtn\": \"onCloneAllClick\",\n\t\t\"click @ui.hideLockedBtn\": \"hideLockedAttachments\"\n\t},\n\n\tinitialize: function initialize() {\n\t\t$(document).on(\"webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange\", this.fullScreenChange.bind(this));\n\n\t\tthis.listenTo(eventBus, eventBus.Events.ViewChanged, this.viewChanged.bind(this));\n\t\tthis.listenTo(eventBus, eventBus.Events.PageCount, this.paging.bind(this));\n\n\t\tthis.listenTo(eventBus, eventBus.Events.LoadStart, this.loadStart.bind(this));\n\t\tthis.listenTo(eventBus, eventBus.Events.LoadEnd, this.loadEnd.bind(this));\n\t\tthis.listenTo(eventBus, eventBus.Events.SetPage, this.setPage.bind(this));\n\n\t\tthis.listenTo(eventBus, eventBus.Events.UnloadBook, this.paging.bind(this, 0));\n\n\t\tthis.listenTo(eventBus, eventBus.Events.ShowAttachmentBin, this.showAttachmentBin.bind(this));\n\t\tthis.listenTo(eventBus, eventBus.Events.HideAttachmentBin, this.hideAttachmentBin.bind(this));\n\t\tthis.listenTo(eventBus, eventBus.Events.NoOldAttachments, this.hideShowLockedAndCloneBtn.bind(this));\n\t\tthis.listenTo(eventBus, eventBus.Events.OldAttachmentsExists, this.showShowLockedAndCloneBtn.bind(this));\n\n\t\tthis.listenTo(eventBus, eventBus.Events.ChangeLPView, this.changeLPView.bind(this));\n\t\tthis.listenTo(eventBus, eventBus.Events.ChangeMultiselect, this.changeMultiselection.bind(this));\n\n\t\tthis.loading = false;\n\n\t\tthis.pageSliderChanged = _.debounce(this.pageSliderChanged.bind(this), 100);\n\t\tthis.pageChanged = _.debounce(this.pageChanged.bind(this), 100);\n\t},\n\n\tviewChanged: function viewChanged(view, params) {\n\t\tif (this.slider) this.slider.val(0).rangeslider(\"update\", true);\n\t\tthis.ui.pageSlider.addClass(\"hide\");\n\t\tthis.ui.pageDropdown.val(\"\").trigger(\"chosen:updated\");\n\t\tthis.ui.zoom.addClass(\"hide\");\n\t\tthis.page = null;\n\t\tthis.initialPage = false;\n\n\t\tswitch (view) {\n\t\t\tcase \"books\":\n\t\t\t\t{\n\t\t\t\t\tvar book = params.book;\n\t\t\t\t\tif (!book) return;\n\t\t\t\t\tthis.format = book.get(\"format\");\n\t\t\t\t\tthis.slider = this.ui.pageSlider;\n\t\t\t\t\tthis.slider.rangeslider({ polyfill: false });\n\t\t\t\t\tthis.ui.locationText.text(\"Book View\");\n\t\t\t\t\tthis.ui.title.text(book.get(\"metadata\").title);\n\t\t\t\t\tthis.ui.multiselectContainer.addClass(\"hide\");\n\t\t\t\t\tthis.ui.flipContainer.addClass(\"hide\");\n\t\t\t\t\tthis.ui.shareLocation.data(\"isbn\", book.get(\"metadata\").isbn);\n\t\t\t\t\tthis.ui.bottomArea.removeClass(\"hide\");\n\n\t\t\t\t\tthis.addCamBtn(book);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\tcase \"learningPath\":\n\t\t\t\t{\n\t\t\t\t\tvar learningPath = params.learningPath;\n\t\t\t\t\tthis.ui.locationText.text(\"Learning Path\");\n\t\t\t\t\tthis.ui.title.text(learningPath.get(\"name\"));\n\t\t\t\t\tthis.ui.flipContainer.removeClass(\"hide\");\n\t\t\t\t\tthis.ui.flipswitch.attr(\"checked\", false);\n\t\t\t\t\tthis.ui.multiselectContainer.removeClass(\"hide invisible\");\n\t\t\t\t\tthis.ui.bottomArea.addClass(\"hide\");\n\t\t\t\t\tthis.ui.camBtnContainer.addClass(\"hide\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\tthis.ui.locationText.text(\"Educator Console\");\n\t\t\t\tthis.ui.title.text(\"\");\n\t\t\t\tthis.ui.zoom.addClass(\"hide\");\n\t\t\t\tthis.ui.flipContainer.addClass(\"hide\");\n\t\t\t\tthis.ui.multiselectContainer.addClass(\"hide\");\n\t\t\t\tthis.ui.camBtnContainer.addClass(\"hide\");\n\t\t\t\tthis.ui.bottomArea.addClass(\"hide\");\n\n\t\t\t\tif (params === \"books\") this.ui.title.html(\"<span class=\\\"fal fa-book\\\"/>&nbsp;My Books\");else if (params === \"learning-paths\") this.ui.title.html(\"<span class=\\\"fal fa-brain\\\"/>&nbsp;My \" + settings.learningPathsPluralCustomName);\n\t\t\t\tbreak;\n\t\t}\n\t},\n\n\tlocationOver: _.noop,\n\n\tlocationOut: _.noop,\n\n\tsettings: _.noop,\n\n\tonAttach: function onAttach() {\n\t\ttippy(this.ui.attachmentBin.get(0), {\n\t\t\tplacement: \"left\",\n\t\t\tarrow: true,\n\t\t\ttheme: \"black\",\n\t\t\tcontent: \"Recover deleted attachments\",\n\t\t\tappendTo: $(\".tooltip-host\").get(0)\n\t\t});\n\n\t\ttippy(this.ui.fullscreen.get(0), {\n\t\t\tplacement: \"left\",\n\t\t\tarrow: true,\n\t\t\ttheme: \"black\",\n\t\t\tcontent: \"Toggle fullscreen mode\",\n\t\t\tappendTo: $(\".tooltip-host\").get(0)\n\t\t});\n\n\t\tif (window.localStorage.getItem(\"attachmentHideState\") === \"true\") this.ui.hideLockedBtn.addClass(\"hide-state\");else this.ui.hideLockedBtn.removeClass(\"hide-state\");\n\t},\n\n\tshowAttachmentBin: function showAttachmentBin() {\n\t\tthis.ui.attachmentBin.removeClass(\"hide\");\n\t},\n\n\thideAttachmentBin: function hideAttachmentBin() {\n\t\tthis.ui.attachmentBin.addClass(\"hide\");\n\t},\n\n\tonAttachmentBinClick: function onAttachmentBinClick() {\n\t\teventBus.trigger(eventBus.Events.ShowAttachmentBinContents);\n\t},\n\n\ttoggleFullscreen: function toggleFullscreen() {\n\t\tvar element = $(\"#link-resources\").get(0);\n\n\t\tif (document.fullscreenElement || document.mozFullScreenElement || document.msFullscreenElement || document.webkitFullscreenElement) {\n\t\t\tvar method = document.exitFullscreen || document.mozCancelFullScreen || document.webkitExitFullscreen || document.msExitFullscreen;\n\t\t\tif (method) method.call(document);\n\t\t\tthis.ui.fullscreen.toggleClass(\"fa-expand-alt fa-compress-alt\");\n\t\t} else {\n\t\t\tvar method2 = element.requestFullscreen || element.msRequestFullscreen || element.mozRequestFullScreen || element.webkitRequestFullscreen;\n\t\t\tif (method2) method2.call(element);\n\t\t}\n\t},\n\n\tfullScreenChange: function fullScreenChange() {\n\t\tif (!this.ui.fullscreen) return;\n\n\t\tif (document.fullScreenElement || document.mozFullScreenElement || document.msFullScreenElement || document.webkitFullScreenElement) {\n\t\t\tif (this.ui.fullscreen.removeClass) this.ui.fullscreen.removeClass(\"fa-expand-alt\").addClass(\"fa-compress-alt\");\n\t\t\teventBus.trigger(eventBus.Events.StartFullscreen);\n\t\t} else {\n\t\t\tif (this.ui.fullscreen.addClass) this.ui.fullscreen.addClass(\"fa-expand-alt\").removeClass(\"fa-compress-alt\");\n\n\t\t\teventBus.trigger(eventBus.Events.EndFullscreen);\n\t\t}\n\t},\n\n\tpaging: function paging(pageCount, pages) {\n\t\tvar _this = this;\n\n\t\tif (this.format === \"mpdf\") {\n\t\t\tthis.pdfZoom = 1.0;\n\t\t\tthis.ui.zoom.removeClass(\"hide\");\n\t\t\tthis.ui.zoomLevel.text(\"100%\");\n\t\t}\n\n\t\tif (pageCount === 0) {\n\t\t\tthis.ui.paging.addClass(\"hide\");\n\t\t\tthis.ui.zoom.addClass(\"hide\");\n\t\t\treturn;\n\t\t}\n\n\t\tthis.pages = pages;\n\t\tvar options = _.map(pages, function (x) {\n\t\t\treturn \"<option value=\\\"\" + x.page + \"\\\" data-val=\\\"\" + encodeURIComponent(x.page) + \"\\\">\" + (_this.format === \"mpdf\" ? x.title : x.page) + \"</option>\";\n\t\t});\n\t\toptions.unshift(\"<option value=''></option>\");\n\t\tthis.ui.pageDropdown.html(options.join(\"\")).chosen({ width: \"200px\" });\n\t\tthis.slider.attr(\"max\", pageCount).rangeslider(\"update\", true);\n\n\t\tthis.ui.paging.removeClass(\"hide\");\n\t},\n\n\tpageDropdownChanged: function pageDropdownChanged() {\n\t\tif (this.ui.pageDropdown && this.ui.pageDropdown.val) {\n\t\t\tif (this.ui.pageDropdown.val() === this.page) return;\n\n\t\t\tthis.page = this.ui.pageDropdown.val().toString();\n\t\t\tthis.setPage(this.page, true);\n\t\t}\n\t},\n\n\tpageSliderChanged: _.debounce(function () {\n\t\t/* eslint-disable no-invalid-this */\n\n\t\tif (this.slider && this.slider.val) {\n\t\t\tvar val = this.slider.val();\n\n\t\t\t// Map the slider value to a dropdown\n\t\t\tif (this.format === \"mpub\") val = this.pages[parseInt(val, 10) - 1].page;\n\n\t\t\tif (val.toString() === this.page) return;\n\n\t\t\tthis.page = val.toString();\n\t\t\tthis.setPage(this.page, true);\n\t\t}\n\n\t\t/* eslint-enable no-invalid-this */\n\t}, 100),\n\n\tpageChanged: _.debounce(function () {\n\t\t/* eslint-disable no-invalid-this */\n\n\t\teventBus.trigger(eventBus.Events.PageChange, this.page);\n\n\t\t/* eslint-enable no-invalid-this */\n\t}, 100),\n\n\tsetPage: function setPage(page, force) {\n\t\tvar _this2 = this;\n\n\t\tif (!page || !this.slider || !this.slider.val) return;\n\n\t\tthis.page = page;\n\n\t\tvar change = false;\n\n\t\tvar val = this.slider.val();\n\t\tif (this.format === \"mpub\") {\n\t\t\tval = this.pages[parseInt(this.slider.val(), 10) - 1];\n\t\t\tif (val) val = val.page;\n\t\t}\n\n\t\tif (val && val.toString() !== this.page) {\n\t\t\tif (this.format === \"mpub\") this.slider.val((_.findIndex(this.pages, function (x) {\n\t\t\t\treturn x.page === _this2.page;\n\t\t\t}) + 1).toString()).rangeslider(\"update\", true);else this.slider.val(this.page).rangeslider(\"update\", true);\n\n\t\t\tchange = true;\n\t\t}\n\n\t\t// Dropdown\n\t\tvar selected = $(\"option:selected\", this.ui.pageDropdown).first();\n\t\tif (!selected || selected.data(\"val\") !== page.toString()) {\n\t\t\tif (selected) selected.attr(\"selected\", false);\n\t\t\tvar el = $(\"option[data-val='\" + encodeURIComponent(page) + \"']\", this.ui.pageDropdown);\n\n\t\t\tthis.ui.pageDropdown.val(el.length ? page : \"\").trigger(\"chosen:updated\");\n\t\t}\n\n\t\t// Share Location\n\t\tthis.ui.shareLocation.data(\"page\", page);\n\t\tthis.ui.shareLocation.removeClass(\"hide\");\n\n\t\tif (force || !this.initialPage && change) {\n\t\t\tthis.initialPage = true;\n\t\t\tthis.pageChanged();\n\t\t}\n\n\t\tthis.setShareLocationTippy();\n\t},\n\n\tloadStart: function loadStart() {\n\t\tif (!this.slider) return;\n\t\tthis.loading = true;\n\t\tthis.ui.zoomIn.addClass(\"disabled\");\n\t\tthis.ui.zoomOut.addClass(\"disabled\");\n\t\tthis.ui.shareLocation.addClass(\"disabled\");\n\t\tthis.ui.pageDropdown.attr(\"disabled\", true).trigger(\"chosen:updated\");\n\t\tthis.ui.pageSlider.attr(\"disabled\", true);\n\t\tthis.slider.rangeslider(\"update\", true);\n\t},\n\n\tloadEnd: function loadEnd() {\n\t\tif (!this.slider) return;\n\t\tthis.ui.zoomIn.removeClass(\"disabled\");\n\t\tthis.ui.zoomOut.removeClass(\"disabled\");\n\t\tthis.ui.shareLocation.removeClass(\"disabled\");\n\t\tthis.ui.pageDropdown.attr(\"disabled\", false).trigger(\"chosen:updated\");\n\t\tthis.ui.pageSlider.attr(\"disabled\", false);\n\t\tthis.slider.rangeslider(\"update\", true);\n\t\tthis.loading = false;\n\t},\n\n\tzoomIn: function zoomIn() {\n\t\tif (this.loading || this.pdfZoom >= 2.49) return;\n\n\t\tthis.pdfZoom += 0.1;\n\n\t\tthis.ui.zoomLevel.text(Math.floor(100 * this.pdfZoom) + \"%\");\n\n\t\teventBus.trigger(eventBus.Events.ZoomChange, this.pdfZoom);\n\t},\n\n\tzoomOut: function zoomOut() {\n\t\tif (this.loading || this.pdfZoom <= 0.31) return;\n\n\t\tthis.pdfZoom -= 0.1;\n\n\t\tthis.ui.zoomLevel.text(Math.floor(100 * this.pdfZoom) + \"%\");\n\n\t\teventBus.trigger(eventBus.Events.ZoomChange, this.pdfZoom);\n\t},\n\n\tsetShareLocationTippy: function setShareLocationTippy() {\n\t\tvar data = App.Session.toJSON();\n\n\t\tvar isbn = this.ui.shareLocation.data(\"isbn\");\n\t\tvar page = this.ui.shareLocation.data(\"page\");\n\t\tvar url = window.location.protocol + \"//\" + window.location.hostname + \"/ec-book-redirect?isbn=\" + isbn + \"&page=\" + page;\n\n\t\tvar whatsappURL = \"https://api.whatsapp.com/send?text=\" + data.user.firstname + \" \" + data.user.surname + \" has shared a location in miEbooks with you: \" + encodeURIComponent(url);\n\t\tvar mailURL = \"mailto:?subject=\" + data.user.firstname + \" \" + data.user.surname + \" has shared a location in miEbooks with you&body=Please click on the link to navigate to the location in miEbooks: \" + encodeURIComponent(url);\n\n\t\tvar popoverContent = \"<div class='copy-link-popover'>\" + \"<input id='share-location-url' type='text' value='\" + url + \"'/>\" + \"<label class='copied'>Copied to clipboard!</label>\" + \"<div class='share-buttons'>\" + \"<a href='\" + whatsappURL + \"' target='_blank' class='fab fa-whatsapp' title='Share to Whatsapp'></a>\" + \"<a href='\" + mailURL + \"' target='_blank' class='fal fa-envelope' title='Share to email'></a>\" + \"</div>\" + \"</div>\";\n\n\t\ttippy(this.ui.shareLocation.get(0), {\n\t\t\ttheme: \"light-grey\",\n\t\t\ttrigger: \"click\",\n\t\t\tduration: 0,\n\t\t\tanimation: \"fade\",\n\t\t\tplacement: \"bottom\",\n\t\t\tflip: false,\n\t\t\tarrow: true,\n\t\t\tdistance: 25,\n\t\t\tcontent: popoverContent,\n\t\t\tinteractive: true,\n\t\t\tonShow: function onShow() {\n\t\t\t\t// copy to clipboard\n\t\t\t\tvar copyText = document.getElementById(\"share-location-url\");\n\n\t\t\t\tif (copyText) {\n\t\t\t\t\tcopyText.select();\n\t\t\t\t\tcopyText.setSelectionRange(0, 99999); /*For mobile devices*/\n\t\t\t\t\tdocument.execCommand(\"copy\");\n\t\t\t\t}\n\t\t\t},\n\t\t\tonShown: function onShown() {\n\t\t\t\t$(\".copy-link-popover\").parent().parent().css(\"display\", \"inline-table\");\n\t\t\t}\n\t\t});\n\t},\n\n\tlpViewChange: function lpViewChange() {\n\t\tif (this.ui.flipswitch.is(\":checked\")) this.ui.multiselectContainer.addClass(\"invisible\");else this.ui.multiselectContainer.removeClass(\"invisible\");\n\n\t\teventBus.trigger(eventBus.Events.LPViewChanged, this.ui.flipswitch.is(\":checked\"));\n\t},\n\n\tchangeLPView: function changeLPView(mode) {\n\t\tthis.ui.flipswitch.prop(\"checked\", mode === \"view\");\n\n\t\tif (mode === \"view\") this.ui.multiselectContainer.addClass(\"invisible\");else this.ui.multiselectContainer.removeClass(\"invisible\");\n\n\t\teventBus.trigger(eventBus.Events.LPViewChanged, this.ui.flipswitch.is(\":checked\"));\n\t},\n\n\tmultiselectionChange: function multiselectionChange() {\n\t\teventBus.trigger(eventBus.Events.MultiselectChanged, this.ui.multiselector.is(\":checked\"));\n\t},\n\n\tchangeMultiselection: function changeMultiselection(toggle) {\n\t\tthis.ui.multiselector.prop(\"checked\", toggle);\n\t\t//eventBus.trigger(eventBus.Events.MultiselectChanged, this.ui.multiselector.is(\":checked\"));\n\t},\n\n\taddCamBtn: function addCamBtn(book) {\n\t\tvar camBtn = new CamBtn({ type: \"book\", item_id: book.get(\"universal_id\") });\n\t\tthis.ui.camBtnContainer.html(camBtn.render().el);\n\t\tthis.ui.camBtnContainer.removeClass(\"hide\");\n\t},\n\n\thideLockedAttachments: function hideLockedAttachments() {\n\t\tthis.ui.hideLockedBtn.toggleClass(\"hide-state\");\n\t\twindow.localStorage.setItem(\"attachmentHideState\", this.ui.hideLockedBtn.hasClass(\"hide-state\"));\n\t\teventBus.trigger(eventBus.Events.ToggleLockedAttachments, this.ui.hideLockedBtn.hasClass(\"hide-state\"));\n\t},\n\n\tonCloneAllClick: function onCloneAllClick() {\n\t\teventBus.trigger(eventBus.Events.QueryRejuvenateAttachments);\n\t},\n\n\thideShowLockedAndCloneBtn: function hideShowLockedAndCloneBtn() {\n\t\tthis.ui.hideLockedBtn.addClass(\"hide\");\n\t\tthis.ui.cloneAllBtn.addClass(\"hide\");\n\t},\n\n\tshowShowLockedAndCloneBtn: function showShowLockedAndCloneBtn() {\n\t\tthis.ui.hideLockedBtn.removeClass(\"hide\");\n\t\tthis.ui.cloneAllBtn.removeClass(\"hide\");\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImhlYWRlci5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCIkIiwiXyIsInRpcHB5IiwiZGVmYXVsdCIsImV2ZW50QnVzIiwic2V0dGluZ3MiLCJDYW1CdG4iLCJBcHAiLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJleHRlbmQiLCJ0YWdOYW1lIiwiY2xhc3NOYW1lIiwidGVtcGxhdGUiLCJ1aSIsImF0dGFjaG1lbnRCaW4iLCJmdWxsc2NyZWVuIiwibG9jYXRpb24iLCJsb2NhdGlvblRleHQiLCJ0aXRsZSIsInBhZ2luZyIsInpvb20iLCJ6b29tSW4iLCJ6b29tT3V0Iiwic2hhcmVMb2NhdGlvbiIsInpvb21MZXZlbCIsImZsaXBDb250YWluZXIiLCJmbGlwc3dpdGNoIiwibXVsdGlzZWxlY3RDb250YWluZXIiLCJtdWx0aXNlbGVjdG9yIiwiY2FtQnRuQ29udGFpbmVyIiwiaGlkZUxvY2tlZEJ0biIsImNsb25lQWxsQnRuIiwiYm90dG9tQXJlYSIsInBhZ2VOYW1lIiwicGFnZVNsaWRlciIsInBhZ2VEcm9wZG93biIsImV2ZW50cyIsImluaXRpYWxpemUiLCJkb2N1bWVudCIsIm9uIiwiZnVsbFNjcmVlbkNoYW5nZSIsImJpbmQiLCJsaXN0ZW5UbyIsIkV2ZW50cyIsIlZpZXdDaGFuZ2VkIiwidmlld0NoYW5nZWQiLCJQYWdlQ291bnQiLCJMb2FkU3RhcnQiLCJsb2FkU3RhcnQiLCJMb2FkRW5kIiwibG9hZEVuZCIsIlNldFBhZ2UiLCJzZXRQYWdlIiwiVW5sb2FkQm9vayIsIlNob3dBdHRhY2htZW50QmluIiwic2hvd0F0dGFjaG1lbnRCaW4iLCJIaWRlQXR0YWNobWVudEJpbiIsImhpZGVBdHRhY2htZW50QmluIiwiTm9PbGRBdHRhY2htZW50cyIsImhpZGVTaG93TG9ja2VkQW5kQ2xvbmVCdG4iLCJPbGRBdHRhY2htZW50c0V4aXN0cyIsInNob3dTaG93TG9ja2VkQW5kQ2xvbmVCdG4iLCJDaGFuZ2VMUFZpZXciLCJjaGFuZ2VMUFZpZXciLCJDaGFuZ2VNdWx0aXNlbGVjdCIsImNoYW5nZU11bHRpc2VsZWN0aW9uIiwibG9hZGluZyIsInBhZ2VTbGlkZXJDaGFuZ2VkIiwiZGVib3VuY2UiLCJwYWdlQ2hhbmdlZCIsInZpZXciLCJwYXJhbXMiLCJzbGlkZXIiLCJ2YWwiLCJyYW5nZXNsaWRlciIsImFkZENsYXNzIiwidHJpZ2dlciIsInBhZ2UiLCJpbml0aWFsUGFnZSIsImJvb2siLCJmb3JtYXQiLCJnZXQiLCJwb2x5ZmlsbCIsInRleHQiLCJkYXRhIiwiaXNibiIsInJlbW92ZUNsYXNzIiwiYWRkQ2FtQnRuIiwibGVhcm5pbmdQYXRoIiwiYXR0ciIsImh0bWwiLCJsZWFybmluZ1BhdGhzUGx1cmFsQ3VzdG9tTmFtZSIsImxvY2F0aW9uT3ZlciIsIm5vb3AiLCJsb2NhdGlvbk91dCIsIm9uQXR0YWNoIiwicGxhY2VtZW50IiwiYXJyb3ciLCJ0aGVtZSIsImNvbnRlbnQiLCJhcHBlbmRUbyIsIndpbmRvdyIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJvbkF0dGFjaG1lbnRCaW5DbGljayIsIlNob3dBdHRhY2htZW50QmluQ29udGVudHMiLCJ0b2dnbGVGdWxsc2NyZWVuIiwiZWxlbWVudCIsImZ1bGxzY3JlZW5FbGVtZW50IiwibW96RnVsbFNjcmVlbkVsZW1lbnQiLCJtc0Z1bGxzY3JlZW5FbGVtZW50Iiwid2Via2l0RnVsbHNjcmVlbkVsZW1lbnQiLCJtZXRob2QiLCJleGl0RnVsbHNjcmVlbiIsIm1vekNhbmNlbEZ1bGxTY3JlZW4iLCJ3ZWJraXRFeGl0RnVsbHNjcmVlbiIsIm1zRXhpdEZ1bGxzY3JlZW4iLCJjYWxsIiwidG9nZ2xlQ2xhc3MiLCJtZXRob2QyIiwicmVxdWVzdEZ1bGxzY3JlZW4iLCJtc1JlcXVlc3RGdWxsc2NyZWVuIiwibW96UmVxdWVzdEZ1bGxTY3JlZW4iLCJ3ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbiIsImZ1bGxTY3JlZW5FbGVtZW50IiwibXNGdWxsU2NyZWVuRWxlbWVudCIsIndlYmtpdEZ1bGxTY3JlZW5FbGVtZW50IiwiU3RhcnRGdWxsc2NyZWVuIiwiRW5kRnVsbHNjcmVlbiIsInBhZ2VDb3VudCIsInBhZ2VzIiwicGRmWm9vbSIsIm9wdGlvbnMiLCJtYXAiLCJ4IiwiZW5jb2RlVVJJQ29tcG9uZW50IiwidW5zaGlmdCIsImpvaW4iLCJjaG9zZW4iLCJ3aWR0aCIsInBhZ2VEcm9wZG93bkNoYW5nZWQiLCJ0b1N0cmluZyIsInBhcnNlSW50IiwiUGFnZUNoYW5nZSIsImZvcmNlIiwiY2hhbmdlIiwiZmluZEluZGV4Iiwic2VsZWN0ZWQiLCJmaXJzdCIsImVsIiwibGVuZ3RoIiwic2V0U2hhcmVMb2NhdGlvblRpcHB5IiwiTWF0aCIsImZsb29yIiwiWm9vbUNoYW5nZSIsIlNlc3Npb24iLCJ0b0pTT04iLCJ1cmwiLCJwcm90b2NvbCIsImhvc3RuYW1lIiwid2hhdHNhcHBVUkwiLCJ1c2VyIiwiZmlyc3RuYW1lIiwic3VybmFtZSIsIm1haWxVUkwiLCJwb3BvdmVyQ29udGVudCIsImR1cmF0aW9uIiwiYW5pbWF0aW9uIiwiZmxpcCIsImRpc3RhbmNlIiwiaW50ZXJhY3RpdmUiLCJvblNob3ciLCJjb3B5VGV4dCIsImdldEVsZW1lbnRCeUlkIiwic2VsZWN0Iiwic2V0U2VsZWN0aW9uUmFuZ2UiLCJleGVjQ29tbWFuZCIsIm9uU2hvd24iLCJwYXJlbnQiLCJjc3MiLCJscFZpZXdDaGFuZ2UiLCJpcyIsIkxQVmlld0NoYW5nZWQiLCJtb2RlIiwicHJvcCIsIm11bHRpc2VsZWN0aW9uQ2hhbmdlIiwiTXVsdGlzZWxlY3RDaGFuZ2VkIiwidG9nZ2xlIiwiY2FtQnRuIiwidHlwZSIsIml0ZW1faWQiLCJyZW5kZXIiLCJoaWRlTG9ja2VkQXR0YWNobWVudHMiLCJzZXRJdGVtIiwiaGFzQ2xhc3MiLCJUb2dnbGVMb2NrZWRBdHRhY2htZW50cyIsIm9uQ2xvbmVBbGxDbGljayIsIlF1ZXJ5UmVqdXZlbmF0ZUF0dGFjaG1lbnRzIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxX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QXdCNkQsSUFBeEIsQ0FBNkJrRyxPQUFPRyxNQUFQLEdBQWdCMUMsRUFBN0M7QUFDQSxPQUFLeEksRUFBTCxDQUFRZ0IsZUFBUixDQUF3QnlELFdBQXhCLENBQW9DLE1BQXBDO0FBQ0EsRUF4YitDOztBQTBiaEQwRyx3QkFBdUIsaUNBQVc7QUFDakMsT0FBS25MLEVBQUwsQ0FBUWlCLGFBQVIsQ0FBc0J3RixXQUF0QixDQUFrQyxZQUFsQztBQUNBakIsU0FBT0MsWUFBUCxDQUFvQjJGLE9BQXBCLENBQTRCLHFCQUE1QixFQUFtRCxLQUFLcEwsRUFBTCxDQUFRaUIsYUFBUixDQUFzQm9LLFFBQXRCLENBQStCLFlBQS9CLENBQW5EO0FBQ0FqTSxXQUFTMkUsT0FBVCxDQUFpQjNFLFNBQVMwQyxNQUFULENBQWdCd0osdUJBQWpDLEVBQTBELEtBQUt0TCxFQUFMLENBQVFpQixhQUFSLENBQXNCb0ssUUFBdEIsQ0FBK0IsWUFBL0IsQ0FBMUQ7QUFDQSxFQTliK0M7O0FBZ2NoREUsa0JBQWlCLDJCQUFXO0FBQzNCbk0sV0FBUzJFLE9BQVQsQ0FBaUIzRSxTQUFTMEMsTUFBVCxDQUFnQjBKLDBCQUFqQztBQUNBLEVBbGMrQzs7QUFvY2hEMUksNEJBQTJCLHFDQUFXO0FBQ3JDLE9BQUs5QyxFQUFMLENBQVFpQixhQUFSLENBQXNCNkMsUUFBdEIsQ0FBK0IsTUFBL0I7QUFDQSxPQUFLOUQsRUFBTCxDQUFRa0IsV0FBUixDQUFvQjRDLFFBQXBCLENBQTZCLE1BQTdCO0FBQ0EsRUF2YytDOztBQXljaERkLDRCQUEyQixxQ0FBVztBQUNyQyxPQUFLaEQsRUFBTCxDQUFRaUIsYUFBUixDQUFzQndELFdBQXRCLENBQWtDLE1BQWxDO0FBQ0EsT0FBS3pFLEVBQUwsQ0FBUWtCLFdBQVIsQ0FBb0J1RCxXQUFwQixDQUFnQyxNQUFoQztBQUNBO0FBNWMrQyxDQUFoQyxDQUFqQiIsImZpbGUiOiJoZWFkZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IHRpcHB5ID0gcmVxdWlyZShcInRpcHB5LmpzXCIpLmRlZmF1bHQ7XG5yZXF1aXJlKFwicmFuZ2VzbGlkZXJcIik7XG5cbmNvbnN0IGV2ZW50QnVzID0gcmVxdWlyZShcIi4vZXZlbnRCdXNcIik7XG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5jb25zdCBDYW1CdG4gPSByZXF1aXJlKFwiLi4vY2FtQnRuXCIpO1xuY29uc3QgQXBwID0gcmVxdWlyZShcIi4uLy4uLy4uL2luZGV4XCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwiaGVhZGVyLXJlZ2lvblwiLFxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9jb25zb2xlL2hlYWRlci5udW5qXCIpLFxuXG5cdHVpOiB7XG5cdFx0YXR0YWNobWVudEJpbjogXCIuYXR0YWNobWVudC1iaW5cIixcblx0XHRmdWxsc2NyZWVuOiBcIi5mdWxsc2NyZWVuLXRvZ2dsZVwiLFxuXHRcdGxvY2F0aW9uOiBcIi5oZWFkaW5nIC5sb2NhdGlvblwiLFxuXHRcdGxvY2F0aW9uVGV4dDogXCIuaGVhZGluZyAubG9jYXRpb24gLnRleHRcIixcblx0XHR0aXRsZTogXCIuaGVhZGluZyAudGl0bGUgZGl2XCIsXG5cdFx0cGFnaW5nOiBcIi5wYWdpbmdcIixcblx0XHR6b29tOiBcIi56b29tXCIsXG5cdFx0em9vbUluOiBcIi56b29tLWluXCIsXG5cdFx0em9vbU91dDogXCIuem9vbS1vdXRcIixcblx0XHRzaGFyZUxvY2F0aW9uOiBcIi5zaGFyZS1sb2NhdGlvblwiLFxuXHRcdHpvb21MZXZlbDogXCIuem9vbS1sZXZlbFwiLFxuXHRcdGZsaXBDb250YWluZXI6IFwiLmxwLWZsaXBzd2l0Y2hcIixcblx0XHRmbGlwc3dpdGNoOiBcImlucHV0W3R5cGU9J2NoZWNrYm94J10uZmxpcHN3aXRjaC1jYlwiLFxuXHRcdG11bHRpc2VsZWN0Q29udGFpbmVyOiBcIi5tdWx0aXNlbGVjdC1jb250YWluZXJcIixcblx0XHRtdWx0aXNlbGVjdG9yOiBcIi5tdWx0aXNlbGVjdC1jb250YWluZXIgaW5wdXRcIixcblx0XHRjYW1CdG5Db250YWluZXI6IFwiLmNhbS1idG4tY29udGFpbmVyXCIsXG5cdFx0aGlkZUxvY2tlZEJ0bjogXCIuaGlkZS1sb2NrZWQtYnRuXCIsXG5cdFx0Y2xvbmVBbGxCdG46IFwiLmNsb25lLWFsbC1idG5cIixcblx0XHRib3R0b21BcmVhOiBcIi5ib3R0b20tYXJlYVwiLFxuXG5cdFx0cGFnZU5hbWU6IFwic3Bhbi50b3RhbFwiLFxuXHRcdHBhZ2VTbGlkZXI6IFwiaW5wdXRbbmFtZT0ncGFnZS1zbGlkZXInXVwiLFxuXHRcdHBhZ2VEcm9wZG93bjogXCIucGFnZS1kcm9wZG93blwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmF0dGFjaG1lbnRCaW5cIjogXCJvbkF0dGFjaG1lbnRCaW5DbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmZ1bGxzY3JlZW5cIjogXCJ0b2dnbGVGdWxsc2NyZWVuXCIsXG5cdFx0XCJjbGljayBAdWkuc2V0dGluZ3NcIjogXCJzZXR0aW5nc1wiLFxuXG5cdFx0XCJtb3VzZW92ZXIgQHVpLmxvY2F0aW9uXCI6IFwibG9jYXRpb25PdmVyXCIsXG5cdFx0XCJtb3VzZW91dCBAdWkubG9jYXRpb25cIjogXCJsb2NhdGlvbk91dFwiLFxuXHRcdFwiY2hhbmdlIEB1aS5wYWdlU2xpZGVyXCI6IFwicGFnZVNsaWRlckNoYW5nZWRcIixcblx0XHRcImlucHV0IEB1aS5wYWdlU2xpZGVyXCI6IFwicGFnZVNsaWRlckNoYW5nZWRcIixcblx0XHRcImNoYW5nZSBAdWkucGFnZURyb3Bkb3duXCI6IFwicGFnZURyb3Bkb3duQ2hhbmdlZFwiLFxuXHRcdFwiY2xpY2sgQHVpLmZsaXBzd2l0Y2hcIjogXCJscFZpZXdDaGFuZ2VcIixcblx0XHRcImNsaWNrIEB1aS5tdWx0aXNlbGVjdG9yXCI6IFwibXVsdGlzZWxlY3Rpb25DaGFuZ2VcIixcblxuXHRcdFwiY2xpY2sgQHVpLnpvb21JblwiOiBcInpvb21JblwiLFxuXHRcdFwiY2xpY2sgQHVpLnpvb21PdXRcIjogXCJ6b29tT3V0XCIsXG5cdFx0XCJjbGljayBAdWkuY2xvbmVBbGxCdG5cIjogXCJvbkNsb25lQWxsQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5oaWRlTG9ja2VkQnRuXCI6IFwiaGlkZUxvY2tlZEF0dGFjaG1lbnRzXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0JChkb2N1bWVudCkub24oXCJ3ZWJraXRmdWxsc2NyZWVuY2hhbmdlIG1vemZ1bGxzY3JlZW5jaGFuZ2UgZnVsbHNjcmVlbmNoYW5nZSBNU0Z1bGxzY3JlZW5DaGFuZ2VcIiwgdGhpcy5mdWxsU2NyZWVuQ2hhbmdlLmJpbmQodGhpcykpO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhldmVudEJ1cywgZXZlbnRCdXMuRXZlbnRzLlZpZXdDaGFuZ2VkLCB0aGlzLnZpZXdDaGFuZ2VkLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8oZXZlbnRCdXMsIGV2ZW50QnVzLkV2ZW50cy5QYWdlQ291bnQsIHRoaXMucGFnaW5nLmJpbmQodGhpcykpO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhldmVudEJ1cywgZXZlbnRCdXMuRXZlbnRzLkxvYWRTdGFydCwgdGhpcy5sb2FkU3RhcnQuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5UbyhldmVudEJ1cywgZXZlbnRCdXMuRXZlbnRzLkxvYWRFbmQsIHRoaXMubG9hZEVuZC5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKGV2ZW50QnVzLCBldmVudEJ1cy5FdmVudHMuU2V0UGFnZSwgdGhpcy5zZXRQYWdlLmJpbmQodGhpcykpO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhldmVudEJ1cywgZXZlbnRCdXMuRXZlbnRzLlVubG9hZEJvb2ssIHRoaXMucGFnaW5nLmJpbmQodGhpcywgMCkpO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhldmVudEJ1cywgZXZlbnRCdXMuRXZlbnRzLlNob3dBdHRhY2htZW50QmluLCB0aGlzLnNob3dBdHRhY2htZW50QmluLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8oZXZlbnRCdXMsIGV2ZW50QnVzLkV2ZW50cy5IaWRlQXR0YWNobWVudEJpbiwgdGhpcy5oaWRlQXR0YWNobWVudEJpbi5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKGV2ZW50QnVzLCBldmVudEJ1cy5FdmVudHMuTm9PbGRBdHRhY2htZW50cywgdGhpcy5oaWRlU2hvd0xvY2tlZEFuZENsb25lQnRuLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8oZXZlbnRCdXMsIGV2ZW50QnVzLkV2ZW50cy5PbGRBdHRhY2htZW50c0V4aXN0cywgdGhpcy5zaG93U2hvd0xvY2tlZEFuZENsb25lQnRuLmJpbmQodGhpcykpO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhldmVudEJ1cywgZXZlbnRCdXMuRXZlbnRzLkNoYW5nZUxQVmlldywgdGhpcy5jaGFuZ2VMUFZpZXcuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5UbyhldmVudEJ1cywgZXZlbnRCdXMuRXZlbnRzLkNoYW5nZU11bHRpc2VsZWN0LCB0aGlzLmNoYW5nZU11bHRpc2VsZWN0aW9uLmJpbmQodGhpcykpO1xuXG5cdFx0dGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cblx0XHR0aGlzLnBhZ2VTbGlkZXJDaGFuZ2VkID0gXy5kZWJvdW5jZSh0aGlzLnBhZ2VTbGlkZXJDaGFuZ2VkLmJpbmQodGhpcyksIDEwMCk7XG5cdFx0dGhpcy5wYWdlQ2hhbmdlZCA9IF8uZGVib3VuY2UodGhpcy5wYWdlQ2hhbmdlZC5iaW5kKHRoaXMpLCAxMDApO1xuXHR9LFxuXG5cdHZpZXdDaGFuZ2VkOiBmdW5jdGlvbih2aWV3LCBwYXJhbXMpIHtcblx0XHRpZiAodGhpcy5zbGlkZXIpXG5cdFx0XHR0aGlzLnNsaWRlci52YWwoMCkucmFuZ2VzbGlkZXIoXCJ1cGRhdGVcIiwgdHJ1ZSk7XG5cdFx0dGhpcy51aS5wYWdlU2xpZGVyLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLnBhZ2VEcm9wZG93bi52YWwoXCJcIikudHJpZ2dlcihcImNob3Nlbjp1cGRhdGVkXCIpO1xuXHRcdHRoaXMudWkuem9vbS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy5wYWdlID0gbnVsbDtcblx0XHR0aGlzLmluaXRpYWxQYWdlID0gZmFsc2U7XG5cblx0XHRzd2l0Y2ggKHZpZXcpIHtcblx0XHRcdGNhc2UgXCJib29rc1wiOiB7XG5cdFx0XHRcdGNvbnN0IGJvb2sgPSBwYXJhbXMuYm9vaztcblx0XHRcdFx0aWYgKCFib29rKVxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0dGhpcy5mb3JtYXQgPSBib29rLmdldChcImZvcm1hdFwiKTtcblx0XHRcdFx0dGhpcy5zbGlkZXIgPSB0aGlzLnVpLnBhZ2VTbGlkZXI7XG5cdFx0XHRcdHRoaXMuc2xpZGVyLnJhbmdlc2xpZGVyKHsgcG9seWZpbGw6IGZhbHNlIH0pO1xuXHRcdFx0XHR0aGlzLnVpLmxvY2F0aW9uVGV4dC50ZXh0KFwiQm9vayBWaWV3XCIpO1xuXHRcdFx0XHR0aGlzLnVpLnRpdGxlLnRleHQoYm9vay5nZXQoXCJtZXRhZGF0YVwiKS50aXRsZSk7XG5cdFx0XHRcdHRoaXMudWkubXVsdGlzZWxlY3RDb250YWluZXIuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0XHR0aGlzLnVpLmZsaXBDb250YWluZXIuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0XHR0aGlzLnVpLnNoYXJlTG9jYXRpb24uZGF0YShcImlzYm5cIiwgYm9vay5nZXQoXCJtZXRhZGF0YVwiKS5pc2JuKTtcblx0XHRcdFx0dGhpcy51aS5ib3R0b21BcmVhLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblxuXHRcdFx0XHR0aGlzLmFkZENhbUJ0bihib29rKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdGNhc2UgXCJsZWFybmluZ1BhdGhcIjoge1xuXHRcdFx0XHRjb25zdCBsZWFybmluZ1BhdGggPSBwYXJhbXMubGVhcm5pbmdQYXRoO1xuXHRcdFx0XHR0aGlzLnVpLmxvY2F0aW9uVGV4dC50ZXh0KFwiTGVhcm5pbmcgUGF0aFwiKTtcblx0XHRcdFx0dGhpcy51aS50aXRsZS50ZXh0KGxlYXJuaW5nUGF0aC5nZXQoXCJuYW1lXCIpKTtcblx0XHRcdFx0dGhpcy51aS5mbGlwQ29udGFpbmVyLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRcdFx0dGhpcy51aS5mbGlwc3dpdGNoLmF0dHIoXCJjaGVja2VkXCIsIGZhbHNlKTtcblx0XHRcdFx0dGhpcy51aS5tdWx0aXNlbGVjdENvbnRhaW5lci5yZW1vdmVDbGFzcyhcImhpZGUgaW52aXNpYmxlXCIpO1xuXHRcdFx0XHR0aGlzLnVpLmJvdHRvbUFyZWEuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0XHR0aGlzLnVpLmNhbUJ0bkNvbnRhaW5lci5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aGlzLnVpLmxvY2F0aW9uVGV4dC50ZXh0KFwiRWR1Y2F0b3IgQ29uc29sZVwiKTtcblx0XHRcdFx0dGhpcy51aS50aXRsZS50ZXh0KFwiXCIpO1xuXHRcdFx0XHR0aGlzLnVpLnpvb20uYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0XHR0aGlzLnVpLmZsaXBDb250YWluZXIuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0XHR0aGlzLnVpLm11bHRpc2VsZWN0Q29udGFpbmVyLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdFx0dGhpcy51aS5jYW1CdG5Db250YWluZXIuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0XHR0aGlzLnVpLmJvdHRvbUFyZWEuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0XHRcdGlmIChwYXJhbXMgPT09IFwiYm9va3NcIilcblx0XHRcdFx0XHR0aGlzLnVpLnRpdGxlLmh0bWwoXCI8c3BhbiBjbGFzcz1cXFwiZmFsIGZhLWJvb2tcXFwiLz4mbmJzcDtNeSBCb29rc1wiKTtcblx0XHRcdFx0ZWxzZSBpZiAocGFyYW1zID09PSBcImxlYXJuaW5nLXBhdGhzXCIpXG5cdFx0XHRcdFx0dGhpcy51aS50aXRsZS5odG1sKFwiPHNwYW4gY2xhc3M9XFxcImZhbCBmYS1icmFpblxcXCIvPiZuYnNwO015IFwiICsgc2V0dGluZ3MubGVhcm5pbmdQYXRoc1BsdXJhbEN1c3RvbU5hbWUpO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH0sXG5cblx0bG9jYXRpb25PdmVyOiBfLm5vb3AsXG5cblx0bG9jYXRpb25PdXQ6IF8ubm9vcCxcblxuXHRzZXR0aW5nczogXy5ub29wLFxuXG5cdG9uQXR0YWNoOiBmdW5jdGlvbigpIHtcblx0XHR0aXBweSh0aGlzLnVpLmF0dGFjaG1lbnRCaW4uZ2V0KDApLCB7XG5cdFx0XHRwbGFjZW1lbnQ6IFwibGVmdFwiLFxuXHRcdFx0YXJyb3c6IHRydWUsXG5cdFx0XHR0aGVtZTogXCJibGFja1wiLFxuXHRcdFx0Y29udGVudDogXCJSZWNvdmVyIGRlbGV0ZWQgYXR0YWNobWVudHNcIixcblx0XHRcdGFwcGVuZFRvOiAkKFwiLnRvb2x0aXAtaG9zdFwiKS5nZXQoMCksXG5cdFx0fSk7XG5cblx0XHR0aXBweSh0aGlzLnVpLmZ1bGxzY3JlZW4uZ2V0KDApLCB7XG5cdFx0XHRwbGFjZW1lbnQ6IFwibGVmdFwiLFxuXHRcdFx0YXJyb3c6IHRydWUsXG5cdFx0XHR0aGVtZTogXCJibGFja1wiLFxuXHRcdFx0Y29udGVudDogXCJUb2dnbGUgZnVsbHNjcmVlbiBtb2RlXCIsXG5cdFx0XHRhcHBlbmRUbzogJChcIi50b29sdGlwLWhvc3RcIikuZ2V0KDApLFxuXHRcdH0pO1xuXG5cdFx0aWYgKHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImF0dGFjaG1lbnRIaWRlU3RhdGVcIikgPT09IFwidHJ1ZVwiKVxuXHRcdFx0dGhpcy51aS5oaWRlTG9ja2VkQnRuLmFkZENsYXNzKFwiaGlkZS1zdGF0ZVwiKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnVpLmhpZGVMb2NrZWRCdG4ucmVtb3ZlQ2xhc3MoXCJoaWRlLXN0YXRlXCIpO1xuXHR9LFxuXG5cdHNob3dBdHRhY2htZW50QmluOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmF0dGFjaG1lbnRCaW4ucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdGhpZGVBdHRhY2htZW50QmluOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmF0dGFjaG1lbnRCaW4uYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdG9uQXR0YWNobWVudEJpbkNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5TaG93QXR0YWNobWVudEJpbkNvbnRlbnRzKTtcblx0fSxcblxuXHR0b2dnbGVGdWxsc2NyZWVuOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBlbGVtZW50ID0gJChcIiNsaW5rLXJlc291cmNlc1wiKS5nZXQoMCk7XG5cblx0XHRpZiAoZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgfHwgZG9jdW1lbnQubW96RnVsbFNjcmVlbkVsZW1lbnQgfHwgZG9jdW1lbnQubXNGdWxsc2NyZWVuRWxlbWVudCB8fCBkb2N1bWVudC53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCkge1xuXHRcdFx0Y29uc3QgbWV0aG9kID0gZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4gfHwgZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbiB8fCBkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbiB8fCBkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuO1xuXHRcdFx0aWYgKG1ldGhvZClcblx0XHRcdFx0bWV0aG9kLmNhbGwoZG9jdW1lbnQpO1xuXHRcdFx0dGhpcy51aS5mdWxsc2NyZWVuLnRvZ2dsZUNsYXNzKFwiZmEtZXhwYW5kLWFsdCBmYS1jb21wcmVzcy1hbHRcIik7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0Y29uc3QgbWV0aG9kMiA9IGVsZW1lbnQucmVxdWVzdEZ1bGxzY3JlZW4gfHwgZWxlbWVudC5tc1JlcXVlc3RGdWxsc2NyZWVuIHx8IGVsZW1lbnQubW96UmVxdWVzdEZ1bGxTY3JlZW4gfHwgZWxlbWVudC53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbjtcblx0XHRcdGlmIChtZXRob2QyKVxuXHRcdFx0XHRtZXRob2QyLmNhbGwoZWxlbWVudCk7XG5cdFx0fVxuXHR9LFxuXG5cdGZ1bGxTY3JlZW5DaGFuZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghdGhpcy51aS5mdWxsc2NyZWVuKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0aWYgKGRvY3VtZW50LmZ1bGxTY3JlZW5FbGVtZW50IHx8IGRvY3VtZW50Lm1vekZ1bGxTY3JlZW5FbGVtZW50IHx8IGRvY3VtZW50Lm1zRnVsbFNjcmVlbkVsZW1lbnQgfHwgZG9jdW1lbnQud2Via2l0RnVsbFNjcmVlbkVsZW1lbnQpIHtcblx0XHRcdGlmICh0aGlzLnVpLmZ1bGxzY3JlZW4ucmVtb3ZlQ2xhc3MpXG5cdFx0XHRcdHRoaXMudWkuZnVsbHNjcmVlbi5yZW1vdmVDbGFzcyhcImZhLWV4cGFuZC1hbHRcIikuYWRkQ2xhc3MoXCJmYS1jb21wcmVzcy1hbHRcIik7XG5cdFx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5TdGFydEZ1bGxzY3JlZW4pO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGlmICh0aGlzLnVpLmZ1bGxzY3JlZW4uYWRkQ2xhc3MpXG5cdFx0XHRcdHRoaXMudWkuZnVsbHNjcmVlbi5hZGRDbGFzcyhcImZhLWV4cGFuZC1hbHRcIikucmVtb3ZlQ2xhc3MoXCJmYS1jb21wcmVzcy1hbHRcIik7XG5cblx0XHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLkVuZEZ1bGxzY3JlZW4pO1xuXHRcdH1cblx0fSxcblxuXHRwYWdpbmc6IGZ1bmN0aW9uKHBhZ2VDb3VudCwgcGFnZXMpIHtcblx0XHRpZiAodGhpcy5mb3JtYXQgPT09IFwibXBkZlwiKSB7XG5cdFx0XHR0aGlzLnBkZlpvb20gPSAxLjA7XG5cdFx0XHR0aGlzLnVpLnpvb20ucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0dGhpcy51aS56b29tTGV2ZWwudGV4dChcIjEwMCVcIik7XG5cdFx0fVxuXG5cdFx0aWYgKHBhZ2VDb3VudCA9PT0gMCkge1xuXHRcdFx0dGhpcy51aS5wYWdpbmcuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0dGhpcy51aS56b29tLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLnBhZ2VzID0gcGFnZXM7XG5cdFx0Y29uc3Qgb3B0aW9ucyA9IF8ubWFwKHBhZ2VzLCB4ID0+IFwiPG9wdGlvbiB2YWx1ZT1cXFwiXCIgKyB4LnBhZ2UgKyBcIlxcXCIgZGF0YS12YWw9XFxcIlwiICsgKGVuY29kZVVSSUNvbXBvbmVudCh4LnBhZ2UpKSArIFwiXFxcIj5cIiArICh0aGlzLmZvcm1hdCA9PT0gXCJtcGRmXCIgPyB4LnRpdGxlIDogeC5wYWdlKSArIFwiPC9vcHRpb24+XCIpO1xuXHRcdG9wdGlvbnMudW5zaGlmdChcIjxvcHRpb24gdmFsdWU9Jyc+PC9vcHRpb24+XCIpO1xuXHRcdHRoaXMudWkucGFnZURyb3Bkb3duLmh0bWwob3B0aW9ucy5qb2luKFwiXCIpKS5jaG9zZW4oeyB3aWR0aDogXCIyMDBweFwiIH0pO1xuXHRcdHRoaXMuc2xpZGVyLmF0dHIoXCJtYXhcIiwgcGFnZUNvdW50KS5yYW5nZXNsaWRlcihcInVwZGF0ZVwiLCB0cnVlKTtcblxuXHRcdHRoaXMudWkucGFnaW5nLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRwYWdlRHJvcGRvd25DaGFuZ2VkOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy51aS5wYWdlRHJvcGRvd24gJiYgdGhpcy51aS5wYWdlRHJvcGRvd24udmFsKSB7XG5cdFx0XHRpZiAodGhpcy51aS5wYWdlRHJvcGRvd24udmFsKCkgPT09IHRoaXMucGFnZSlcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR0aGlzLnBhZ2UgPSB0aGlzLnVpLnBhZ2VEcm9wZG93bi52YWwoKS50b1N0cmluZygpO1xuXHRcdFx0dGhpcy5zZXRQYWdlKHRoaXMucGFnZSwgdHJ1ZSk7XG5cdFx0fVxuXHR9LFxuXG5cdHBhZ2VTbGlkZXJDaGFuZ2VkOiBfLmRlYm91bmNlKGZ1bmN0aW9uKCkge1xuXHRcdC8qIGVzbGludC1kaXNhYmxlIG5vLWludmFsaWQtdGhpcyAqL1xuXG5cdFx0aWYgKHRoaXMuc2xpZGVyICYmIHRoaXMuc2xpZGVyLnZhbCkge1xuXHRcdFx0bGV0IHZhbCA9IHRoaXMuc2xpZGVyLnZhbCgpO1xuXG5cdFx0XHQvLyBNYXAgdGhlIHNsaWRlciB2YWx1ZSB0byBhIGRyb3Bkb3duXG5cdFx0XHRpZiAodGhpcy5mb3JtYXQgPT09IFwibXB1YlwiKVxuXHRcdFx0XHR2YWwgPSB0aGlzLnBhZ2VzW3BhcnNlSW50KHZhbCwgMTApIC0gMV0ucGFnZTtcblxuXHRcdFx0aWYgKHZhbC50b1N0cmluZygpID09PSB0aGlzLnBhZ2UpXG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0dGhpcy5wYWdlID0gdmFsLnRvU3RyaW5nKCk7XG5cdFx0XHR0aGlzLnNldFBhZ2UodGhpcy5wYWdlLCB0cnVlKTtcblx0XHR9XG5cblx0XHQvKiBlc2xpbnQtZW5hYmxlIG5vLWludmFsaWQtdGhpcyAqL1xuXHR9LCAxMDApLFxuXG5cdHBhZ2VDaGFuZ2VkOiBfLmRlYm91bmNlKGZ1bmN0aW9uKCkge1xuXHRcdC8qIGVzbGludC1kaXNhYmxlIG5vLWludmFsaWQtdGhpcyAqL1xuXG5cdFx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5FdmVudHMuUGFnZUNoYW5nZSwgdGhpcy5wYWdlKTtcblxuXHRcdC8qIGVzbGludC1lbmFibGUgbm8taW52YWxpZC10aGlzICovXG5cdH0sIDEwMCksXG5cblx0c2V0UGFnZTogZnVuY3Rpb24ocGFnZSwgZm9yY2UpIHtcblx0XHRpZiAoIXBhZ2UgfHwgIXRoaXMuc2xpZGVyIHx8ICF0aGlzLnNsaWRlci52YWwpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLnBhZ2UgPSBwYWdlO1xuXG5cdFx0bGV0IGNoYW5nZSA9IGZhbHNlO1xuXG5cdFx0bGV0IHZhbCA9IHRoaXMuc2xpZGVyLnZhbCgpO1xuXHRcdGlmICh0aGlzLmZvcm1hdCA9PT0gXCJtcHViXCIpIHtcblx0XHRcdHZhbCA9IHRoaXMucGFnZXNbcGFyc2VJbnQodGhpcy5zbGlkZXIudmFsKCksIDEwKSAtIDFdO1xuXHRcdFx0aWYgKHZhbClcblx0XHRcdFx0dmFsID0gdmFsLnBhZ2U7XG5cdFx0fVxuXG5cdFx0aWYgKHZhbCAmJiB2YWwudG9TdHJpbmcoKSAhPT0gdGhpcy5wYWdlKSB7XG5cdFx0XHRpZiAodGhpcy5mb3JtYXQgPT09IFwibXB1YlwiKVxuXHRcdFx0XHR0aGlzLnNsaWRlci52YWwoKF8uZmluZEluZGV4KHRoaXMucGFnZXMsIHggPT4geC5wYWdlID09PSB0aGlzLnBhZ2UpICsgMSkudG9TdHJpbmcoKSkucmFuZ2VzbGlkZXIoXCJ1cGRhdGVcIiwgdHJ1ZSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMuc2xpZGVyLnZhbCh0aGlzLnBhZ2UpLnJhbmdlc2xpZGVyKFwidXBkYXRlXCIsIHRydWUpO1xuXG5cdFx0XHRjaGFuZ2UgPSB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIERyb3Bkb3duXG5cdFx0Y29uc3Qgc2VsZWN0ZWQgPSAkKFwib3B0aW9uOnNlbGVjdGVkXCIsIHRoaXMudWkucGFnZURyb3Bkb3duKS5maXJzdCgpO1xuXHRcdGlmICghc2VsZWN0ZWQgfHwgc2VsZWN0ZWQuZGF0YShcInZhbFwiKSAhPT0gcGFnZS50b1N0cmluZygpKSB7XG5cdFx0XHRpZiAoc2VsZWN0ZWQpXG5cdFx0XHRcdHNlbGVjdGVkLmF0dHIoXCJzZWxlY3RlZFwiLCBmYWxzZSk7XG5cdFx0XHRjb25zdCBlbCA9ICQoXCJvcHRpb25bZGF0YS12YWw9J1wiICsgZW5jb2RlVVJJQ29tcG9uZW50KHBhZ2UpICsgXCInXVwiLCB0aGlzLnVpLnBhZ2VEcm9wZG93bik7XG5cblx0XHRcdHRoaXMudWkucGFnZURyb3Bkb3duLnZhbChlbC5sZW5ndGggPyBwYWdlIDogXCJcIikudHJpZ2dlcihcImNob3Nlbjp1cGRhdGVkXCIpO1xuXHRcdH1cblxuXHRcdC8vIFNoYXJlIExvY2F0aW9uXG5cdFx0dGhpcy51aS5zaGFyZUxvY2F0aW9uLmRhdGEoXCJwYWdlXCIsIHBhZ2UpO1xuXHRcdHRoaXMudWkuc2hhcmVMb2NhdGlvbi5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cblx0XHRpZiAoZm9yY2UgfHwgKCF0aGlzLmluaXRpYWxQYWdlICYmIGNoYW5nZSkpIHtcblx0XHRcdHRoaXMuaW5pdGlhbFBhZ2UgPSB0cnVlO1xuXHRcdFx0dGhpcy5wYWdlQ2hhbmdlZCgpO1xuXHRcdH1cblxuXHRcdHRoaXMuc2V0U2hhcmVMb2NhdGlvblRpcHB5KCk7XG5cdH0sXG5cblx0bG9hZFN0YXJ0OiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIXRoaXMuc2xpZGVyKVxuXHRcdFx0cmV0dXJuO1xuXHRcdHRoaXMubG9hZGluZyA9IHRydWU7XG5cdFx0dGhpcy51aS56b29tSW4uYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblx0XHR0aGlzLnVpLnpvb21PdXQuYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblx0XHR0aGlzLnVpLnNoYXJlTG9jYXRpb24uYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblx0XHR0aGlzLnVpLnBhZ2VEcm9wZG93bi5hdHRyKFwiZGlzYWJsZWRcIiwgdHJ1ZSkudHJpZ2dlcihcImNob3Nlbjp1cGRhdGVkXCIpO1xuXHRcdHRoaXMudWkucGFnZVNsaWRlci5hdHRyKFwiZGlzYWJsZWRcIiwgdHJ1ZSk7XG5cdFx0dGhpcy5zbGlkZXIucmFuZ2VzbGlkZXIoXCJ1cGRhdGVcIiwgdHJ1ZSk7XG5cdH0sXG5cblx0bG9hZEVuZDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLnNsaWRlcilcblx0XHRcdHJldHVybjtcblx0XHR0aGlzLnVpLnpvb21Jbi5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xuXHRcdHRoaXMudWkuem9vbU91dC5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xuXHRcdHRoaXMudWkuc2hhcmVMb2NhdGlvbi5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xuXHRcdHRoaXMudWkucGFnZURyb3Bkb3duLmF0dHIoXCJkaXNhYmxlZFwiLCBmYWxzZSkudHJpZ2dlcihcImNob3Nlbjp1cGRhdGVkXCIpO1xuXHRcdHRoaXMudWkucGFnZVNsaWRlci5hdHRyKFwiZGlzYWJsZWRcIiwgZmFsc2UpO1xuXHRcdHRoaXMuc2xpZGVyLnJhbmdlc2xpZGVyKFwidXBkYXRlXCIsIHRydWUpO1xuXHRcdHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXHR9LFxuXG5cdHpvb21JbjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMubG9hZGluZyB8fCB0aGlzLnBkZlpvb20gPj0gMi40OSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMucGRmWm9vbSArPSAwLjE7XG5cblx0XHR0aGlzLnVpLnpvb21MZXZlbC50ZXh0KE1hdGguZmxvb3IoMTAwICogdGhpcy5wZGZab29tKSArIFwiJVwiKTtcblxuXHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLlpvb21DaGFuZ2UsIHRoaXMucGRmWm9vbSk7XG5cdH0sXG5cblx0em9vbU91dDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMubG9hZGluZyB8fCB0aGlzLnBkZlpvb20gPD0gMC4zMSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMucGRmWm9vbSAtPSAwLjE7XG5cblx0XHR0aGlzLnVpLnpvb21MZXZlbC50ZXh0KE1hdGguZmxvb3IoMTAwICogdGhpcy5wZGZab29tKSArIFwiJVwiKTtcblxuXHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLlpvb21DaGFuZ2UsIHRoaXMucGRmWm9vbSk7XG5cdH0sXG5cblx0c2V0U2hhcmVMb2NhdGlvblRpcHB5OiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBkYXRhID0gQXBwLlNlc3Npb24udG9KU09OKCk7XG5cblx0XHRjb25zdCBpc2JuID0gdGhpcy51aS5zaGFyZUxvY2F0aW9uLmRhdGEoXCJpc2JuXCIpO1xuXHRcdGNvbnN0IHBhZ2UgPSB0aGlzLnVpLnNoYXJlTG9jYXRpb24uZGF0YShcInBhZ2VcIik7XG5cdFx0Y29uc3QgdXJsID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sICsgXCIvL1wiICsgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lICsgXCIvZWMtYm9vay1yZWRpcmVjdD9pc2JuPVwiICsgaXNibiArIFwiJnBhZ2U9XCIgKyBwYWdlO1xuXG5cdFx0Y29uc3Qgd2hhdHNhcHBVUkwgPSBcImh0dHBzOi8vYXBpLndoYXRzYXBwLmNvbS9zZW5kP3RleHQ9XCIgKyBkYXRhLnVzZXIuZmlyc3RuYW1lICsgXCIgXCIgKyBkYXRhLnVzZXIuc3VybmFtZSArXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIiBoYXMgc2hhcmVkIGEgbG9jYXRpb24gaW4gbWlFYm9va3Mgd2l0aCB5b3U6IFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHVybCk7XG5cdFx0Y29uc3QgbWFpbFVSTCA9IFwibWFpbHRvOj9zdWJqZWN0PVwiICsgZGF0YS51c2VyLmZpcnN0bmFtZSArIFwiIFwiICsgZGF0YS51c2VyLnN1cm5hbWUgK1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcIiBoYXMgc2hhcmVkIGEgbG9jYXRpb24gaW4gbWlFYm9va3Mgd2l0aCB5b3UmYm9keT1QbGVhc2UgY2xpY2sgb24gdGhlIGxpbmsgdG8gbmF2aWdhdGUgdG8gdGhlIGxvY2F0aW9uIGluIG1pRWJvb2tzOiBcIiArIGVuY29kZVVSSUNvbXBvbmVudCh1cmwpO1xuXG5cdFx0Y29uc3QgcG9wb3ZlckNvbnRlbnQgPSBcIjxkaXYgY2xhc3M9J2NvcHktbGluay1wb3BvdmVyJz5cIiArXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIjxpbnB1dCBpZD0nc2hhcmUtbG9jYXRpb24tdXJsJyB0eXBlPSd0ZXh0JyB2YWx1ZT0nXCIgKyB1cmwgKyBcIicvPlwiICtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiPGxhYmVsIGNsYXNzPSdjb3BpZWQnPkNvcGllZCB0byBjbGlwYm9hcmQhPC9sYWJlbD5cIiArXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIjxkaXYgY2xhc3M9J3NoYXJlLWJ1dHRvbnMnPlwiICtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XCI8YSBocmVmPSdcIiArIHdoYXRzYXBwVVJMICsgXCInIHRhcmdldD0nX2JsYW5rJyBjbGFzcz0nZmFiIGZhLXdoYXRzYXBwJyB0aXRsZT0nU2hhcmUgdG8gV2hhdHNhcHAnPjwvYT5cIiArXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFwiPGEgaHJlZj0nXCIgKyBtYWlsVVJMICsgXCInIHRhcmdldD0nX2JsYW5rJyBjbGFzcz0nZmFsIGZhLWVudmVsb3BlJyB0aXRsZT0nU2hhcmUgdG8gZW1haWwnPjwvYT5cIiArXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIjwvZGl2PlwiICtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcIjwvZGl2PlwiO1xuXG5cdFx0dGlwcHkodGhpcy51aS5zaGFyZUxvY2F0aW9uLmdldCgwKSwge1xuXHRcdFx0dGhlbWU6IFwibGlnaHQtZ3JleVwiLFxuXHRcdFx0dHJpZ2dlcjogXCJjbGlja1wiLFxuXHRcdFx0ZHVyYXRpb246IDAsXG5cdFx0XHRhbmltYXRpb246IFwiZmFkZVwiLFxuXHRcdFx0cGxhY2VtZW50OiBcImJvdHRvbVwiLFxuXHRcdFx0ZmxpcDogZmFsc2UsXG5cdFx0XHRhcnJvdzogdHJ1ZSxcblx0XHRcdGRpc3RhbmNlOiAyNSxcblx0XHRcdGNvbnRlbnQ6IHBvcG92ZXJDb250ZW50LFxuXHRcdFx0aW50ZXJhY3RpdmU6IHRydWUsXG5cdFx0XHRvblNob3c6ICgpID0+IHtcblx0XHRcdFx0Ly8gY29weSB0byBjbGlwYm9hcmRcblx0XHRcdFx0Y29uc3QgY29weVRleHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNoYXJlLWxvY2F0aW9uLXVybFwiKTtcblxuXHRcdFx0XHRpZiAoY29weVRleHQpIHtcblx0XHRcdFx0XHRjb3B5VGV4dC5zZWxlY3QoKTtcblx0XHRcdFx0XHRjb3B5VGV4dC5zZXRTZWxlY3Rpb25SYW5nZSgwLCA5OTk5OSk7IC8qRm9yIG1vYmlsZSBkZXZpY2VzKi9cblx0XHRcdFx0XHRkb2N1bWVudC5leGVjQ29tbWFuZChcImNvcHlcIik7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRvblNob3duOiAoKSA9PiB7XG5cdFx0XHRcdCQoXCIuY29weS1saW5rLXBvcG92ZXJcIikucGFyZW50KCkucGFyZW50KCkuY3NzKFwiZGlzcGxheVwiLCBcImlubGluZS10YWJsZVwiKTtcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH0sXG5cblx0bHBWaWV3Q2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy51aS5mbGlwc3dpdGNoLmlzKFwiOmNoZWNrZWRcIikpXG5cdFx0XHR0aGlzLnVpLm11bHRpc2VsZWN0Q29udGFpbmVyLmFkZENsYXNzKFwiaW52aXNpYmxlXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMudWkubXVsdGlzZWxlY3RDb250YWluZXIucmVtb3ZlQ2xhc3MoXCJpbnZpc2libGVcIik7XG5cblx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5MUFZpZXdDaGFuZ2VkLCB0aGlzLnVpLmZsaXBzd2l0Y2guaXMoXCI6Y2hlY2tlZFwiKSk7XG5cdH0sXG5cblx0Y2hhbmdlTFBWaWV3OiBmdW5jdGlvbihtb2RlKSB7XG5cdFx0dGhpcy51aS5mbGlwc3dpdGNoLnByb3AoXCJjaGVja2VkXCIsIG1vZGUgPT09IFwidmlld1wiKTtcblxuXHRcdGlmIChtb2RlID09PSBcInZpZXdcIilcblx0XHRcdHRoaXMudWkubXVsdGlzZWxlY3RDb250YWluZXIuYWRkQ2xhc3MoXCJpbnZpc2libGVcIik7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy51aS5tdWx0aXNlbGVjdENvbnRhaW5lci5yZW1vdmVDbGFzcyhcImludmlzaWJsZVwiKTtcblxuXHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLkxQVmlld0NoYW5nZWQsIHRoaXMudWkuZmxpcHN3aXRjaC5pcyhcIjpjaGVja2VkXCIpKTtcblx0fSxcblxuXHRtdWx0aXNlbGVjdGlvbkNoYW5nZTogZnVuY3Rpb24oKSB7XG5cdFx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5FdmVudHMuTXVsdGlzZWxlY3RDaGFuZ2VkLCB0aGlzLnVpLm11bHRpc2VsZWN0b3IuaXMoXCI6Y2hlY2tlZFwiKSk7XG5cdH0sXG5cblx0Y2hhbmdlTXVsdGlzZWxlY3Rpb246IGZ1bmN0aW9uKHRvZ2dsZSkge1xuXHRcdHRoaXMudWkubXVsdGlzZWxlY3Rvci5wcm9wKFwiY2hlY2tlZFwiLCB0b2dnbGUpO1xuXHRcdC8vZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5FdmVudHMuTXVsdGlzZWxlY3RDaGFuZ2VkLCB0aGlzLnVpLm11bHRpc2VsZWN0b3IuaXMoXCI6Y2hlY2tlZFwiKSk7XG5cdH0sXG5cblx0YWRkQ2FtQnRuOiBmdW5jdGlvbihib29rKSB7XG5cdFx0Y29uc3QgY2FtQnRuID0gbmV3IENhbUJ0bih7IHR5cGU6IFwiYm9va1wiLCBpdGVtX2lkOiBib29rLmdldChcInVuaXZlcnNhbF9pZFwiKSB9KTtcblx0XHR0aGlzLnVpLmNhbUJ0bkNvbnRhaW5lci5odG1sKGNhbUJ0bi5yZW5kZXIoKS5lbCk7XG5cdFx0dGhpcy51aS5jYW1CdG5Db250YWluZXIucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdGhpZGVMb2NrZWRBdHRhY2htZW50czogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5oaWRlTG9ja2VkQnRuLnRvZ2dsZUNsYXNzKFwiaGlkZS1zdGF0ZVwiKTtcblx0XHR3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJhdHRhY2htZW50SGlkZVN0YXRlXCIsIHRoaXMudWkuaGlkZUxvY2tlZEJ0bi5oYXNDbGFzcyhcImhpZGUtc3RhdGVcIikpO1xuXHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLlRvZ2dsZUxvY2tlZEF0dGFjaG1lbnRzLCB0aGlzLnVpLmhpZGVMb2NrZWRCdG4uaGFzQ2xhc3MoXCJoaWRlLXN0YXRlXCIpKTtcblx0fSxcblxuXHRvbkNsb25lQWxsQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLlF1ZXJ5UmVqdXZlbmF0ZUF0dGFjaG1lbnRzKTtcblx0fSxcblxuXHRoaWRlU2hvd0xvY2tlZEFuZENsb25lQnRuOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmhpZGVMb2NrZWRCdG4uYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkuY2xvbmVBbGxCdG4uYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdHNob3dTaG93TG9ja2VkQW5kQ2xvbmVCdG46IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkuaGlkZUxvY2tlZEJ0bi5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5jbG9uZUFsbEJ0bi5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\n\nvar localMethods = {};\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"tocImportWizard-container\",\n\n\ttemplate: require(\"../../templates/console/importTocModal.nunj\").wizard,\n\n\tui: {\n\t\tbook: \"#bookSelector .book-cover\",\n\t\tbookSelector: \"#bookSelector\",\n\t\ttocSelector: \"#tocSelector\",\n\t\tverify: \"#verify\",\n\t\tselectAll: \"#select-all\",\n\t\ttocError: \"#tocError\",\n\t\tsmartSelect: \"button.smart\",\n\t\tdeselect: \"button.deselect\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.book\": \"onBookClick\",\n\t\t\"click @ui.selectAll\": \"onSelectAllClick\",\n\t\t\"click @ui.smartSelect\": \"onSmartSelectClick\",\n\t\t\"click @ui.deselect\": \"onDeselectClick\"\n\t},\n\n\tmodelEvents: {\n\t\t\"change:loading\": \"render\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tvar _this = this;\n\n\t\tthis.wizardMap = {\n\t\t\t1: \"bookSelector\",\n\t\t\t2: \"tocSelector\",\n\t\t\t3: \"verify\"\n\t\t};\n\n\t\t$.ajax({\n\t\t\turl: settings.urlRoot + \"/acacia/books/getGroupBooks?group=\" + this.model.get(\"group\"),\n\t\t\tsuccess: function success(books) {\n\t\t\t\t_this.model.set(\"books\", books);\n\t\t\t\t_this.render();\n\n\t\t\t\tif (!books || !books.length) {\n\t\t\t\t\t_this.showError(\"No books linked to group \" + _this.model.get(\"group\"));\n\t\t\t\t\t$(\".create\", $(\".import-toc-modal\")).attr(\"disabled\", true);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t});\n\t},\n\n\tonRender: function onRender() {\n\t\tif (this.model.get(\"loading\")) return;\n\n\t\tvar step = this.model.get(\"step\");\n\t\tif (!step) {\n\t\t\tstep = 1;\n\t\t\tthis.model.set(\"step\", step);\n\t\t}\n\n\t\tthis.ui[this.wizardMap[step]].removeClass(\"hide\");\n\t},\n\n\tshowError: function showError(error) {\n\t\tthis.ui.tocError.html(error);\n\t},\n\n\tonBookClick: function onBookClick(e) {\n\t\tvar bookId = $(e.currentTarget).data(\"uid\");\n\t\tthis.model.set(\"selectedBookId\", bookId);\n\n\t\tvar title = _.find(this.model.get(\"books\"), function (b) {\n\t\t\treturn b.universal_id === bookId;\n\t\t}).title;\n\t\tthis.model.set(\"selectedBookTitle\", title);\n\n\t\tthis.ui.book.removeClass(\"selected\");\n\t\t$(e.currentTarget).addClass(\"selected\");\n\t},\n\n\tonSelectAllClick: function onSelectAllClick() {\n\t\t$(\".toc-selector input[type='checkbox']\").prop(\"checked\", this.ui.selectAll.is(\":checked\"));\n\t},\n\n\tonSmartSelectClick: function onSmartSelectClick() {\n\t\tvar items = this.model.get(\"tocItems\");\n\t\tvar depthBackoff = 2;\n\t\tvar maxDepth = 0;\n\n\t\tvar counter = function counter(el) {\n\t\t\treturn _.reduce(el, function (sum, num) {\n\t\t\t\tvar ret = sum;\n\t\t\t\tmaxDepth = Math.max(maxDepth, num.path.split(\".\").length);\n\t\t\t\tif (num.children) counter(num.children);\n\t\t\t\treturn ret;\n\t\t\t}, 0);\n\t\t};\n\n\t\tcounter(items);\n\n\t\t$(\".toc-selector input[type='checkbox']\").prop(\"checked\", false);\n\n\t\tvar level = Math.max(depthBackoff, maxDepth - depthBackoff);\n\n\t\t// Select all the items above the detected level\n\t\tfor (var i = 1; i <= level; i++) {\n\t\t\t$(\"label[data-depth=\" + i + \"] input[type='checkbox']\").prop(\"checked\", true);\n\t\t}\n\t},\n\n\tonDeselectClick: function onDeselectClick() {\n\t\t$(\".toc-selector input[type='checkbox']\").prop(\"checked\", false);\n\t},\n\n\tverifyTocSelection: function verifyTocSelection() {\n\t\tvar selectedTocItems = $(\"label.toc-selector:has(input:checked)\");\n\n\t\tif (!selectedTocItems || !selectedTocItems.length) return this.showError(\"No items selected\");\n\n\t\tvar rawItems = _.map(selectedTocItems, function (i) {\n\t\t\treturn {\n\t\t\t\ttitle: $(\"span.tocTitle\", i).text(),\n\t\t\t\tpath: $(i).data(\"path\"),\n\t\t\t\tpageRange: _.split($(i).data(\"pagerange\"), \",\"),\n\t\t\t\tpageRangeDisplay: _.split($(i).data(\"pagerangedisplay\"), \",\")\n\t\t\t};\n\t\t});\n\t\trawItems = _.orderBy(rawItems, function (i) {\n\t\t\treturn i.path;\n\t\t});\n\n\t\tvar finalItems = {};\n\t\tvar unassignedItems = [];\n\t\t_.each(rawItems, function (i) {\n\t\t\t//Check if the parent item exists. If not, the item must be created as a root level node.\n\t\t\tif (i.path.length === 3 || i.path.length > 3 && _.get(finalItems, _.replace(i.path.substring(0, i.path.length - 4), /\\./g, \".children.\"))) _.set(finalItems, _.replace(i.path, /\\./g, \".children.\"), i);else unassignedItems.push(i);\n\t\t});\n\n\t\tvar lastRootPath = _.keys(finalItems).length ? localMethods.getNextPath(_.last(_.keys(finalItems))) : \"AAA\";\n\t\t_.each(unassignedItems, function (u) {\n\t\t\t//Assign anything that didn't have a selected parent as root nodes.\n\t\t\tu.path = lastRootPath;\n\t\t\t_.set(finalItems, lastRootPath, u);\n\t\t\tlastRootPath = localMethods.getNextPath(lastRootPath);\n\t\t});\n\n\t\tthis.model.set(\"selectedTocItems\", finalItems);\n\t\tthis.model.set(\"step\", 3);\n\t\tthis.render();\n\n\t\tvar noPages = _.find(rawItems, function (i) {\n\t\t\treturn !i.pageRange || !i.pageRange.length || !parseInt(i.pageRange[0], 10);\n\t\t});\n\t\tif (noPages) {\n\t\t\tthis.showError(\"* Please take note: Some of the selected TOC topics could not be linked to page numbers for this book.<br />\\n\\t\\t\\t\\tWhen adding resources to a Learning Path topic, remember that only topics with page numbers will show these resources in the book.\");\n\t\t}\n\t}\n});\n\nlocalMethods.getNextPath = function (fullPath) {\n\t//We only working with the last sequence in the full path.\n\tvar paths = _.split(fullPath, \".\");\n\tvar letters = _.split(_.last(paths), \"\");\n\n\tfor (var i = letters.length - 1; letters.length >= i; i--) {\n\t\tvar charCode = letters[i].charCodeAt(0);\n\t\tif (charCode < 90) {\n\t\t\t//Letter < Z, so we can do a straight forward increment.\n\t\t\tletters[i] = String.fromCharCode(charCode + 1);\n\t\t\tbreak;\n\t\t}\n\n\t\t//If we got here, letter must be \"Z\", or worse, an invalid character. Replace it with \"A\".\n\t\tletters[i] = \"A\";\n\n\t\tif (i <= 0) {\n\t\t\t//If we reached the first letter without finding anything less than Z, then it must be an all Z path.\n\t\t\tletters.push(\"A\");\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tpaths[paths.length - 1] = letters.join(\"\");\n\treturn paths.join(\".\");\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImltcG9ydFRvYy5qcyJdLCJuYW1lcyI6WyIkIiwicmVxdWlyZSIsIl8iLCJCYWNrYm9uZSIsInNldHRpbmdzIiwibG9jYWxNZXRob2RzIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiZXh0ZW5kIiwiY2xhc3NOYW1lIiwidGVtcGxhdGUiLCJ3aXphcmQiLCJ1aSIsImJvb2siLCJib29rU2VsZWN0b3IiLCJ0b2NTZWxlY3RvciIsInZlcmlmeSIsInNlbGVjdEFsbCIsInRvY0Vycm9yIiwic21hcnRTZWxlY3QiLCJkZXNlbGVjdCIsImV2ZW50cyIsIm1vZGVsRXZlbnRzIiwiaW5pdGlhbGl6ZSIsIndpemFyZE1hcCIsImFqYXgiLCJ1cmwiLCJ1cmxSb290IiwibW9kZWwiLCJnZXQiLCJzdWNjZXNzIiwic2V0IiwiYm9va3MiLCJyZW5kZXIiLCJsZW5ndGgiLCJzaG93RXJyb3IiLCJhdHRyIiwib25SZW5kZXIiLCJzdGVwIiwicmVtb3ZlQ2xhc3MiLCJlcnJvciIsImh0bWwiLCJvbkJvb2tDbGljayIsImUiLCJib29rSWQiLCJjdXJyZW50VGFyZ2V0IiwiZGF0YSIsInRpdGxlIiwiZmluZCIsImIiLCJ1bml2ZXJzYWxfaWQiLCJhZGRDbGFzcyIsIm9uU2VsZWN0QWxsQ2xpY2siLCJwcm9wIiwiaXMiLCJvblNtYXJ0U2VsZWN0Q2xpY2siLCJpdGVtcyIsImRlcHRoQmFja29mZiIsIm1heERlcHRoIiwiY291bnRlciIsInJlZHVjZSIsImVsIiwic3VtIiwibnVtIiwicmV0IiwiTWF0aCIsIm1heCIsInBhdGgiLCJzcGxpdCIsImNoaWxkcmVuIiwibGV2ZWwiLCJpIiwib25EZXNlbGVjdENsaWNrIiwidmVyaWZ5VG9jU2VsZWN0aW9uIiwic2VsZWN0ZWRUb2NJdGVtcyIsInJhd0l0ZW1zIiwibWFwIiwidGV4dCIsInBhZ2VSYW5nZSIsInBhZ2VSYW5nZURpc3BsYXkiLCJvcmRlckJ5IiwiZmluYWxJdGVtcyIsInVuYXNzaWduZWRJdGVtcyIsImVhY2giLCJyZXBsYWNlIiwic3Vic3RyaW5nIiwicHVzaCIsImxhc3RSb290UGF0aCIsImtleXMiLCJnZXROZXh0UGF0aCIsImxhc3QiLCJ1Iiwibm9QYWdlcyIsInBhcnNlSW50IiwiZnVsbFBhdGgiLCJwYXRocyIsImxldHRlcnMiLCJjaGFyQ29kZSIsImNoYXJDb2RlQXQiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJqb2luIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLElBQUlELFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUUsV0FBV0YsUUFBUSxVQUFSLENBQWpCOztBQUVBLElBQU1HLFdBQVdILFFBQVEsY0FBUixDQUFqQjs7QUFFQSxJQUFNSSxlQUFlLEVBQXJCOztBQUVBQyxPQUFPQyxPQUFQLEdBQWlCSixTQUFTSyxVQUFULENBQW9CQyxJQUFwQixDQUF5QkMsTUFBekIsQ0FBZ0M7QUFDaERDLFlBQVcsMkJBRHFDOztBQUdoREMsV0FBVVgsUUFBUSw2Q0FBUixFQUF1RFksTUFIakI7O0FBS2hEQyxLQUFJO0FBQ0hDLFFBQU0sMkJBREg7QUFFSEMsZ0JBQWMsZUFGWDtBQUdIQyxlQUFhLGNBSFY7QUFJSEMsVUFBUSxTQUpMO0FBS0hDLGFBQVcsYUFMUjtBQU1IQyxZQUFVLFdBTlA7QUFPSEMsZUFBYSxjQVBWO0FBUUhDLFlBQVU7QUFSUCxFQUw0Qzs7QUFnQmhEQyxTQUFRO0FBQ1Asb0JBQWtCLGFBRFg7QUFFUCx5QkFBdUIsa0JBRmhCO0FBR1AsMkJBQXlCLG9CQUhsQjtBQUlQLHdCQUFzQjtBQUpmLEVBaEJ3Qzs7QUF1QmhEQyxjQUFhO0FBQ1osb0JBQWtCO0FBRE4sRUF2Qm1DOztBQTJCaERDLGFBQVksc0JBQVc7QUFBQTs7QUFDdEIsT0FBS0MsU0FBTCxHQUFpQjtBQUNoQixNQUFHLGNBRGE7QUFFaEIsTUFBRyxhQUZhO0FBR2hCLE1BQUc7QUFIYSxHQUFqQjs7QUFNQTFCLElBQUUyQixJQUFGLENBQU87QUFD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L0IsQ0FBYjtBQUNBO0FBQ0E7O0FBRUQ7QUFDQUQsVUFBUXpCLENBQVIsSUFBYSxHQUFiOztBQUVBLE1BQUlBLEtBQUssQ0FBVCxFQUFZO0FBQ1g7QUFDQXlCLFdBQVFWLElBQVIsQ0FBYSxHQUFiO0FBQ0E7QUFDQTtBQUNEOztBQUVEUyxPQUFNQSxNQUFNN0QsTUFBTixHQUFlLENBQXJCLElBQTBCOEQsUUFBUUssSUFBUixDQUFhLEVBQWIsQ0FBMUI7QUFDQSxRQUFPTixNQUFNTSxJQUFOLENBQVcsR0FBWCxDQUFQO0FBQ0EsQ0F6QkQiLCJmaWxlIjoiaW1wb3J0VG9jLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5cbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxuY29uc3QgbG9jYWxNZXRob2RzID0ge307XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJ0b2NJbXBvcnRXaXphcmQtY29udGFpbmVyXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvY29uc29sZS9pbXBvcnRUb2NNb2RhbC5udW5qXCIpLndpemFyZCxcblxuXHR1aToge1xuXHRcdGJvb2s6IFwiI2Jvb2tTZWxlY3RvciAuYm9vay1jb3ZlclwiLFxuXHRcdGJvb2tTZWxlY3RvcjogXCIjYm9va1NlbGVjdG9yXCIsXG5cdFx0dG9jU2VsZWN0b3I6IFwiI3RvY1NlbGVjdG9yXCIsXG5cdFx0dmVyaWZ5OiBcIiN2ZXJpZnlcIixcblx0XHRzZWxlY3RBbGw6IFwiI3NlbGVjdC1hbGxcIixcblx0XHR0b2NFcnJvcjogXCIjdG9jRXJyb3JcIixcblx0XHRzbWFydFNlbGVjdDogXCJidXR0b24uc21hcnRcIixcblx0XHRkZXNlbGVjdDogXCJidXR0b24uZGVzZWxlY3RcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5ib29rXCI6IFwib25Cb29rQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5zZWxlY3RBbGxcIjogXCJvblNlbGVjdEFsbENsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkuc21hcnRTZWxlY3RcIjogXCJvblNtYXJ0U2VsZWN0Q2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5kZXNlbGVjdFwiOiBcIm9uRGVzZWxlY3RDbGlja1wiLFxuXHR9LFxuXG5cdG1vZGVsRXZlbnRzOiB7XG5cdFx0XCJjaGFuZ2U6bG9hZGluZ1wiOiBcInJlbmRlclwiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMud2l6YXJkTWFwID0ge1xuXHRcdFx0MTogXCJib29rU2VsZWN0b3JcIixcblx0XHRcdDI6IFwidG9jU2VsZWN0b3JcIixcblx0XHRcdDM6IFwidmVyaWZ5XCIsXG5cdFx0fTtcblxuXHRcdCQuYWpheCh7XG5cdFx0XHR1cmw6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hY2FjaWEvYm9va3MvZ2V0R3JvdXBCb29rcz9ncm91cD1cIiArIHRoaXMubW9kZWwuZ2V0KFwiZ3JvdXBcIiksXG5cdFx0XHRzdWNjZXNzOiBib29rcyA9PiB7XG5cdFx0XHRcdHRoaXMubW9kZWwuc2V0KFwiYm9va3NcIiwgYm9va3MpO1xuXHRcdFx0XHR0aGlzLnJlbmRlcigpO1xuXG5cdFx0XHRcdGlmICghYm9va3MgfHwgIWJvb2tzLmxlbmd0aCkge1xuXHRcdFx0XHRcdHRoaXMuc2hvd0Vycm9yKFwiTm8gYm9va3MgbGlua2VkIHRvIGdyb3VwIFwiICsgdGhpcy5tb2RlbC5nZXQoXCJncm91cFwiKSk7XG5cdFx0XHRcdFx0JChcIi5jcmVhdGVcIiwgJChcIi5pbXBvcnQtdG9jLW1vZGFsXCIpKS5hdHRyKFwiZGlzYWJsZWRcIiwgdHJ1ZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJsb2FkaW5nXCIpKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0bGV0IHN0ZXAgPSB0aGlzLm1vZGVsLmdldChcInN0ZXBcIik7XG5cdFx0aWYgKCFzdGVwKSB7XG5cdFx0XHRzdGVwID0gMTtcblx0XHRcdHRoaXMubW9kZWwuc2V0KFwic3RlcFwiLCBzdGVwKTtcblx0XHR9XG5cblx0XHR0aGlzLnVpW3RoaXMud2l6YXJkTWFwW3N0ZXBdXS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0c2hvd0Vycm9yOiBmdW5jdGlvbihlcnJvcikge1xuXHRcdHRoaXMudWkudG9jRXJyb3IuaHRtbChlcnJvcik7XG5cdH0sXG5cblx0b25Cb29rQ2xpY2s6IGZ1bmN0aW9uKGUpIHtcblx0XHRjb25zdCBib29rSWQgPSAkKGUuY3VycmVudFRhcmdldCkuZGF0YShcInVpZFwiKTtcblx0XHR0aGlzLm1vZGVsLnNldChcInNlbGVjdGVkQm9va0lkXCIsIGJvb2tJZCk7XG5cblx0XHRjb25zdCB0aXRsZSA9IF8uZmluZCh0aGlzLm1vZGVsLmdldChcImJvb2tzXCIpLCBiID0+IGIudW5pdmVyc2FsX2lkID09PSBib29rSWQpLnRpdGxlO1xuXHRcdHRoaXMubW9kZWwuc2V0KFwic2VsZWN0ZWRCb29rVGl0bGVcIiwgdGl0bGUpO1xuXG5cdFx0dGhpcy51aS5ib29rLnJlbW92ZUNsYXNzKFwic2VsZWN0ZWRcIik7XG5cdFx0JChlLmN1cnJlbnRUYXJnZXQpLmFkZENsYXNzKFwic2VsZWN0ZWRcIik7XG5cdH0sXG5cblx0b25TZWxlY3RBbGxDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0JChcIi50b2Mtc2VsZWN0b3IgaW5wdXRbdHlwZT0nY2hlY2tib3gnXVwiKS5wcm9wKFwiY2hlY2tlZFwiLCB0aGlzLnVpLnNlbGVjdEFsbC5pcyhcIjpjaGVja2VkXCIpKTtcblx0fSxcblxuXHRvblNtYXJ0U2VsZWN0Q2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGl0ZW1zID0gdGhpcy5tb2RlbC5nZXQoXCJ0b2NJdGVtc1wiKTtcblx0XHRjb25zdCBkZXB0aEJhY2tvZmYgPSAyO1xuXHRcdGxldCBtYXhEZXB0aCA9IDA7XG5cblx0XHRjb25zdCBjb3VudGVyID0gZWwgPT4gXy5yZWR1Y2UoZWwsIChzdW0sIG51bSkgPT4ge1xuXHRcdFx0Y29uc3QgcmV0ID0gc3VtO1xuXHRcdFx0bWF4RGVwdGggPSBNYXRoLm1heChtYXhEZXB0aCwgbnVtLnBhdGguc3BsaXQoXCIuXCIpLmxlbmd0aCk7XG5cdFx0XHRpZiAobnVtLmNoaWxkcmVuKVxuXHRcdFx0XHRjb3VudGVyKG51bS5jaGlsZHJlbik7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH0sIDApO1xuXG5cdFx0Y291bnRlcihpdGVtcyk7XG5cblx0XHQkKFwiLnRvYy1zZWxlY3RvciBpbnB1dFt0eXBlPSdjaGVja2JveCddXCIpLnByb3AoXCJjaGVja2VkXCIsIGZhbHNlKTtcblxuXHRcdGNvbnN0IGxldmVsID0gTWF0aC5tYXgoZGVwdGhCYWNrb2ZmLCBtYXhEZXB0aCAtIGRlcHRoQmFja29mZik7XG5cblx0XHQvLyBTZWxlY3QgYWxsIHRoZSBpdGVtcyBhYm92ZSB0aGUgZGV0ZWN0ZWQgbGV2ZWxcblx0XHRmb3IobGV0IGkgPSAxOyBpIDw9IGxldmVsOyBpKyspXG5cdFx0XHQkKGBsYWJlbFtkYXRhLWRlcHRoPSR7aX1dIGlucHV0W3R5cGU9J2NoZWNrYm94J11gKS5wcm9wKFwiY2hlY2tlZFwiLCB0cnVlKTtcblx0fSxcblxuXHRvbkRlc2VsZWN0Q2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdCQoXCIudG9jLXNlbGVjdG9yIGlucHV0W3R5cGU9J2NoZWNrYm94J11cIikucHJvcChcImNoZWNrZWRcIiwgZmFsc2UpO1xuXHR9LFxuXG5cdHZlcmlmeVRvY1NlbGVjdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3Qgc2VsZWN0ZWRUb2NJdGVtcyA9ICQoXCJsYWJlbC50b2Mtc2VsZWN0b3I6aGFzKGlucHV0OmNoZWNrZWQpXCIpO1xuXG5cdFx0aWYgKCFzZWxlY3RlZFRvY0l0ZW1zIHx8ICFzZWxlY3RlZFRvY0l0ZW1zLmxlbmd0aClcblx0XHRcdHJldHVybiB0aGlzLnNob3dFcnJvcihcIk5vIGl0ZW1zIHNlbGVjdGVkXCIpO1xuXG5cdFx0bGV0IHJhd0l0ZW1zID0gXy5tYXAoc2VsZWN0ZWRUb2NJdGVtcywgaSA9PiAoe1xuXHRcdFx0dGl0bGU6ICQoXCJzcGFuLnRvY1RpdGxlXCIsIGkpLnRleHQoKSxcblx0XHRcdHBhdGg6ICQoaSkuZGF0YShcInBhdGhcIiksXG5cdFx0XHRwYWdlUmFuZ2U6IF8uc3BsaXQoJChpKS5kYXRhKFwicGFnZXJhbmdlXCIpLCBcIixcIiksXG5cdFx0XHRwYWdlUmFuZ2VEaXNwbGF5OiBfLnNwbGl0KCQoaSkuZGF0YShcInBhZ2VyYW5nZWRpc3BsYXlcIiksIFwiLFwiKSxcblx0XHR9KSk7XG5cdFx0cmF3SXRlbXMgPSBfLm9yZGVyQnkocmF3SXRlbXMsIGkgPT4gaS5wYXRoKTtcblxuXHRcdGNvbnN0IGZpbmFsSXRlbXMgPSB7fTtcblx0XHRjb25zdCB1bmFzc2lnbmVkSXRlbXMgPSBbXTtcblx0XHRfLmVhY2gocmF3SXRlbXMsIGkgPT4ge1xuXHRcdFx0Ly9DaGVjayBpZiB0aGUgcGFyZW50IGl0ZW0gZXhpc3RzLiBJZiBub3QsIHRoZSBpdGVtIG11c3QgYmUgY3JlYXRlZCBhcyBhIHJvb3QgbGV2ZWwgbm9kZS5cblx0XHRcdGlmIChpLnBhdGgubGVuZ3RoID09PSAzIHx8IChpLnBhdGgubGVuZ3RoID4gMyAmJiBfLmdldChmaW5hbEl0ZW1zLCBfLnJlcGxhY2UoaS5wYXRoLnN1YnN0cmluZygwLCBpLnBhdGgubGVuZ3RoIC0gNCksIC9cXC4vZywgXCIuY2hpbGRyZW4uXCIpKSkpXG5cdFx0XHRcdF8uc2V0KGZpbmFsSXRlbXMsIF8ucmVwbGFjZShpLnBhdGgsIC9cXC4vZywgXCIuY2hpbGRyZW4uXCIpLCBpKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dW5hc3NpZ25lZEl0ZW1zLnB1c2goaSk7XG5cdFx0fSk7XG5cblx0XHRsZXQgbGFzdFJvb3RQYXRoID0gXy5rZXlzKGZpbmFsSXRlbXMpLmxlbmd0aCA/IGxvY2FsTWV0aG9kcy5nZXROZXh0UGF0aChfLmxhc3QoXy5rZXlzKGZpbmFsSXRlbXMpKSkgOiBcIkFBQVwiO1xuXHRcdF8uZWFjaCh1bmFzc2lnbmVkSXRlbXMsIHUgPT4ge1xuXHRcdFx0Ly9Bc3NpZ24gYW55dGhpbmcgdGhhdCBkaWRuJ3QgaGF2ZSBhIHNlbGVjdGVkIHBhcmVudCBhcyByb290IG5vZGVzLlxuXHRcdFx0dS5wYXRoID0gbGFzdFJvb3RQYXRoO1xuXHRcdFx0Xy5zZXQoZmluYWxJdGVtcywgbGFzdFJvb3RQYXRoLCB1KTtcblx0XHRcdGxhc3RSb290UGF0aCA9IGxvY2FsTWV0aG9kcy5nZXROZXh0UGF0aChsYXN0Um9vdFBhdGgpO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5tb2RlbC5zZXQoXCJzZWxlY3RlZFRvY0l0ZW1zXCIsIGZpbmFsSXRlbXMpO1xuXHRcdHRoaXMubW9kZWwuc2V0KFwic3RlcFwiLCAzKTtcblx0XHR0aGlzLnJlbmRlcigpO1xuXG5cdFx0Y29uc3Qgbm9QYWdlcyA9IF8uZmluZChyYXdJdGVtcywgaSA9PiAhaS5wYWdlUmFuZ2UgfHwgIWkucGFnZVJhbmdlLmxlbmd0aCB8fCAhcGFyc2VJbnQoaS5wYWdlUmFuZ2VbMF0sIDEwKSk7XG5cdFx0aWYgKG5vUGFnZXMpIHtcblx0XHRcdHRoaXMuc2hvd0Vycm9yKGAqIFBsZWFzZSB0YWtlIG5vdGU6IFNvbWUgb2YgdGhlIHNlbGVjdGVkIFRPQyB0b3BpY3MgY291bGQgbm90IGJlIGxpbmtlZCB0byBwYWdlIG51bWJlcnMgZm9yIHRoaXMgYm9vay48YnIgLz5cblx0XHRcdFx0V2hlbiBhZGRpbmcgcmVzb3VyY2VzIHRvIGEgTGVhcm5pbmcgUGF0aCB0b3BpYywgcmVtZW1iZXIgdGhhdCBvbmx5IHRvcGljcyB3aXRoIHBhZ2UgbnVtYmVycyB3aWxsIHNob3cgdGhlc2UgcmVzb3VyY2VzIGluIHRoZSBib29rLmApO1xuXHRcdH1cblx0fSxcbn0pO1xuXG5sb2NhbE1ldGhvZHMuZ2V0TmV4dFBhdGggPSBmdW5jdGlvbihmdWxsUGF0aCkge1xuXHQvL1dlIG9ubHkgd29ya2luZyB3aXRoIHRoZSBsYXN0IHNlcXVlbmNlIGluIHRoZSBmdWxsIHBhdGguXG5cdGNvbnN0IHBhdGhzID0gXy5zcGxpdChmdWxsUGF0aCwgXCIuXCIpO1xuXHRjb25zdCBsZXR0ZXJzID0gXy5zcGxpdChfLmxhc3QocGF0aHMpLCBcIlwiKTtcblxuXHRmb3IobGV0IGkgPSBsZXR0ZXJzLmxlbmd0aCAtIDE7IGxldHRlcnMubGVuZ3RoID49IGk7IGktLSkge1xuXHRcdGNvbnN0IGNoYXJDb2RlID0gbGV0dGVyc1tpXS5jaGFyQ29kZUF0KDApO1xuXHRcdGlmIChjaGFyQ29kZSA8IDkwKSB7XG5cdFx0XHQvL0xldHRlciA8IFosIHNvIHdlIGNhbiBkbyBhIHN0cmFpZ2h0IGZvcndhcmQgaW5jcmVtZW50LlxuXHRcdFx0bGV0dGVyc1tpXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGUgKyAxKTtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblxuXHRcdC8vSWYgd2UgZ290IGhlcmUsIGxldHRlciBtdXN0IGJlIFwiWlwiLCBvciB3b3JzZSwgYW4gaW52YWxpZCBjaGFyYWN0ZXIuIFJlcGxhY2UgaXQgd2l0aCBcIkFcIi5cblx0XHRsZXR0ZXJzW2ldID0gXCJBXCI7XG5cblx0XHRpZiAoaSA8PSAwKSB7XG5cdFx0XHQvL0lmIHdlIHJlYWNoZWQgdGhlIGZpcnN0IGxldHRlciB3aXRob3V0IGZpbmRpbmcgYW55dGhpbmcgbGVzcyB0aGFuIFosIHRoZW4gaXQgbXVzdCBiZSBhbiBhbGwgWiBwYXRoLlxuXHRcdFx0bGV0dGVycy5wdXNoKFwiQVwiKTtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdHBhdGhzW3BhdGhzLmxlbmd0aCAtIDFdID0gbGV0dGVycy5qb2luKFwiXCIpO1xuXHRyZXR1cm4gcGF0aHMuam9pbihcIi5cIik7XG59OyJdfQ==",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar settings = require(\"app-settings\");\n\nvar BigModal = require(\"../../../lib/bigModal\");\nvar ImportTocWizard = require(\"./importToc\");\n\nmodule.exports = BigModal.extend({\n\tui: {\n\t\ttocContainer: \"div#tocContainer\",\n\t\tcontinueBtn: \".create\",\n\t\tselectedBook: \"#selectedBook\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.continueBtn\": \"onContinueBtnClick\"\n\t},\n\n\tonContinueBtnClick: function onContinueBtnClick() {\n\t\tvar _this = this;\n\n\t\tthis.importTocWizard.showError(\"\");\n\t\tvar currentStep = this.importTocWizard.model.get(\"step\");\n\t\tvar bookId = this.importTocWizard.model.get(\"selectedBookId\");\n\t\tif (currentStep === 1) {\n\t\t\tif (!bookId || !bookId.length) return this.importTocWizard.showError(\"No book selected\");\n\n\t\t\tthis.importTocWizard.model.set(\"loading\", true);\n\n\t\t\t$.ajax({\n\t\t\t\turl: settings.urlRoot + \"/acacia/learningPaths/structure/build/fromToc?book=\" + bookId,\n\t\t\t\tsuccess: function success(tocItems) {\n\t\t\t\t\tif (!tocItems || !tocItems.length) {\n\t\t\t\t\t\t_this.importTocWizard.model.set(\"loading\", false);\n\t\t\t\t\t\treturn _this.importTocWizard.showError(\"Failed to import table of contents from book.\");\n\t\t\t\t\t}\n\n\t\t\t\t\t_this.importTocWizard.model.set(\"tocItems\", tocItems);\n\t\t\t\t\t_this.importTocWizard.model.set(\"step\", 2);\n\t\t\t\t\t_this.importTocWizard.model.set(\"loading\", false);\n\t\t\t\t\t_this.ui.selectedBook.text(_this.importTocWizard.model.get(\"selectedBookTitle\"));\n\t\t\t\t},\n\t\t\t\terror: function error() {\n\t\t\t\t\t_this.importTocWizard.model.set(\"loading\", false);\n\t\t\t\t\treturn _this.importTocWizard.showError(\"Failed to import table of contents from book.\");\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (currentStep === 2) {\n\t\t\tthis.importTocWizard.verifyTocSelection();\n\t\t} else if (currentStep === 3) {\n\t\t\tvar finish = function finish(items) {\n\t\t\t\t_this.importTocWizard.model.set(\"loading\", true);\n\t\t\t\t$.ajax({\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\turl: settings.urlRoot + \"/acacia/learningPaths/items/bulk/\" + _this.model.get(\"learningPath\"),\n\t\t\t\t\tdata: { book: bookId, items: items, groups: [_this.model.get(\"group\")], resetFormat: _this.model.get(\"resetFormat\"), keepBookAttachments: _this.model.get(\"keepBookAttachments\") },\n\t\t\t\t\tsuccess: function success() {\n\t\t\t\t\t\t_this.close(\"create\", items);\n\t\t\t\t\t},\n\t\t\t\t\terror: function error() {\n\t\t\t\t\t\t_this.importTocWizard.model.set(\"loading\", false);\n\t\t\t\t\t\treturn _this.importTocWizard.showError(\"Failed to create learning path items from table of content data.\");\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tvar selectedTocItems = this.importTocWizard.model.get(\"selectedTocItems\");\n\n\t\t\tfinish(selectedTocItems);\n\t\t}\n\t},\n\n\tinitialize: function initialize(options) {\n\t\t_.bindAll(this);\n\n\t\tthis.model.set(\"group\", options.group);\n\t\tthis.model.set(\"learningPath\", options.learning_path);\n\t\tthis.model.set(\"resetFormat\", options.resetFormat);\n\t\tthis.model.set(\"keepBookAttachments\", options.keepBookAttachments);\n\n\t\tthis.Options = {\n\t\t\tclasses: [\"import-toc-modal\"],\n\t\t\ttemplate: require(\"../../templates/console/importTocModal.nunj\").container,\n\t\t\tcreateIcon: \"fa-arrow-alt-to-bottom\",\n\t\t\tbuttons: {\n\t\t\t\tcreate: {\n\t\t\t\t\ttype: \"accept\",\n\t\t\t\t\tlabel: \"Continue\",\n\t\t\t\t\tmode: \"create\",\n\t\t\t\t\tvalidate: false,\n\t\t\t\t\tsave: false\n\t\t\t\t},\n\t\t\t\tcancel: {\n\t\t\t\t\ttype: \"cancel\",\n\t\t\t\t\tlabel: \"Cancel\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tcreateVerb: \"Import from book Table of Contents\",\n\t\t\tdataNoun: null,\n\t\t\tsizeConstraints: {\n\t\t\t\tminHeight: \"50vh\",\n\t\t\t\tminWidth: \"50vw\"\n\t\t\t},\n\t\t\thost: options.host\n\t\t};\n\n\t\tthis.ui = _.extend(this.ui, BigModal.prototype.ui);\n\t\tthis.events = _.extend(this.events, BigModal.prototype.events);\n\n\t\tBigModal.prototype.initialize.call(this);\n\t},\n\n\trenderForm: function renderForm() {\n\t\tvar _this2 = this;\n\n\t\tthis.importTocWizard = new ImportTocWizard({\n\t\t\tmodel: new Backbone.Model({ group: this.model.get(\"group\") })\n\t\t});\n\n\t\tthis.ui.tocContainer.append(this.importTocWizard.render().el);\n\t\tthis.listenTo(this.importTocWizard, \"render\", function (view) {\n\t\t\tvar step = view.model.get(\"step\");\n\t\t\t$(\"#tocHeader label\").removeClass(\"active\");\n\t\t\t$(\"#tocHeader .\" + view.wizardMap[step]).addClass(\"active\");\n\t\t\t_this2.ui.continueBtn.prop(\"disabled\", _this2.importTocWizard.model.get(\"loading\"));\n\t\t});\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImltcG9ydFRvY01vZGFsLmpzIl0sIm5hbWVzIjpbIiQiLCJyZXF1aXJlIiwiXyIsIkJhY2tib25lIiwic2V0dGluZ3MiLCJCaWdNb2RhbCIsIkltcG9ydFRvY1dpemFyZCIsIm1vZHVsZSIsImV4cG9ydHMiLCJleHRlbmQiLCJ1aSIsInRvY0NvbnRhaW5lciIsImNvbnRpbnVlQnRuIiwic2VsZWN0ZWRCb29rIiwiZXZlbnRzIiwib25Db250aW51ZUJ0bkNsaWNrIiwiaW1wb3J0VG9jV2l6YXJkIiwic2hvd0Vycm9yIiwiY3VycmVudFN0ZXAiLCJtb2RlbCIsImdldCIsImJvb2tJZCIsImxlbmd0aCIsInNldCIsImFqYXgiLCJ1cmwiLCJ1cmxSb290Iiwic3VjY2VzcyIsInRvY0l0ZW1zIiwidGV4dCIsImVycm9yIiwidmVyaWZ5VG9jU2VsZWN0aW9uIiwiZmluaXNoIiwibWV0aG9kIiwiZGF0YSIsImJvb2siLCJpdGVtcyIsImdyb3VwcyIsInJlc2V0Rm9ybWF0Iiwia2VlcEJvb2tBdHRhY2htZW50cyIsImNsb3NlIiwic2VsZWN0ZWRUb2NJdGVtcyIsImluaXRpYWxpemUiLCJvcHRpb25zIiwiYmluZEFsbCIsImdyb3VwIiwibGVhcm5pbmdfcGF0aCIsIk9wdGlvbnMiLCJjbGFzc2VzIiwidGVtcGxhdGUiLCJjb250YWluZXIiLCJjcmVhdGVJY29uIiwiYnV0dG9ucyIsImNyZWF0ZSIsInR5cGUiLCJsYWJlbCIsIm1vZGUiLCJ2YWxpZGF0ZSIsInNhdmUiLCJjYW5jZWwiLCJjcmVhdGVWZXJiIiwiZGF0YU5vdW4iLCJzaXplQ29uc3RyYWludHMiLCJtaW5IZWlnaHQiLCJtaW5XaWR0aCIsImhvc3QiLCJwcm90b3R5cGUiLCJjYWxsIiwicmVuZGVyRm9ybSIsIk1vZGVsIiwiYXBwZW5kIiwicmVuZGVyIiwiZWwiLCJsaXN0ZW5UbyIsInN0ZXAiLCJ2aWV3IiwicmVtb3ZlQ2xhc3MiLCJ3aXphcmRNYXAiLCJhZGRDbGFzcyIsInByb3AiXSwibWFwcGluZ3Mi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YyxLQUFLekQsZUFBbkIsRUFBb0MsUUFBcEMsRUFBOEMsZ0JBQVE7QUFDckQsT0FBTTBELE9BQU9DLEtBQUt4RCxLQUFMLENBQVdDLEdBQVgsQ0FBZSxNQUFmLENBQWI7QUFDQXBCLEtBQUUsa0JBQUYsRUFBc0I0RSxXQUF0QixDQUFrQyxRQUFsQztBQUNBNUUsS0FBRSxpQkFBaUIyRSxLQUFLRSxTQUFMLENBQWVILElBQWYsQ0FBbkIsRUFBeUNJLFFBQXpDLENBQWtELFFBQWxEO0FBQ0EsVUFBS3BFLEVBQUwsQ0FBUUUsV0FBUixDQUFvQm1FLElBQXBCLENBQXlCLFVBQXpCLEVBQXFDLE9BQUsvRCxlQUFMLENBQXFCRyxLQUFyQixDQUEyQkMsR0FBM0IsQ0FBK0IsU0FBL0IsQ0FBckM7QUFDQSxHQUxEO0FBTUE7QUF0SCtCLENBQWhCLENBQWpCIiwiZmlsZSI6ImltcG9ydFRvY01vZGFsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IEJpZ01vZGFsID0gcmVxdWlyZShcIi4uLy4uLy4uL2xpYi9iaWdNb2RhbFwiKTtcbmNvbnN0IEltcG9ydFRvY1dpemFyZCA9IHJlcXVpcmUoXCIuL2ltcG9ydFRvY1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCaWdNb2RhbC5leHRlbmQoe1xuXHR1aToge1xuXHRcdHRvY0NvbnRhaW5lcjogXCJkaXYjdG9jQ29udGFpbmVyXCIsXG5cdFx0Y29udGludWVCdG46IFwiLmNyZWF0ZVwiLFxuXHRcdHNlbGVjdGVkQm9vazogXCIjc2VsZWN0ZWRCb29rXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkuY29udGludWVCdG5cIjogXCJvbkNvbnRpbnVlQnRuQ2xpY2tcIixcblx0fSxcblxuXHRvbkNvbnRpbnVlQnRuQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuaW1wb3J0VG9jV2l6YXJkLnNob3dFcnJvcihcIlwiKTtcblx0XHRjb25zdCBjdXJyZW50U3RlcCA9IHRoaXMuaW1wb3J0VG9jV2l6YXJkLm1vZGVsLmdldChcInN0ZXBcIik7XG5cdFx0Y29uc3QgYm9va0lkID0gdGhpcy5pbXBvcnRUb2NXaXphcmQubW9kZWwuZ2V0KFwic2VsZWN0ZWRCb29rSWRcIik7XG5cdFx0aWYgKGN1cnJlbnRTdGVwID09PSAxKSB7XG5cdFx0XHRpZiAoIWJvb2tJZCB8fCAhYm9va0lkLmxlbmd0aClcblx0XHRcdFx0cmV0dXJuIHRoaXMuaW1wb3J0VG9jV2l6YXJkLnNob3dFcnJvcihcIk5vIGJvb2sgc2VsZWN0ZWRcIik7XG5cblx0XHRcdHRoaXMuaW1wb3J0VG9jV2l6YXJkLm1vZGVsLnNldChcImxvYWRpbmdcIiwgdHJ1ZSk7XG5cblx0XHRcdCQuYWpheCh7XG5cdFx0XHRcdHVybDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FjYWNpYS9sZWFybmluZ1BhdGhzL3N0cnVjdHVyZS9idWlsZC9mcm9tVG9jP2Jvb2s9XCIgKyBib29rSWQsXG5cdFx0XHRcdHN1Y2Nlc3M6IHRvY0l0ZW1zID0+IHtcblx0XHRcdFx0XHRpZiAoIXRvY0l0ZW1zIHx8ICF0b2NJdGVtcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdHRoaXMuaW1wb3J0VG9jV2l6YXJkLm1vZGVsLnNldChcImxvYWRpbmdcIiwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuaW1wb3J0VG9jV2l6YXJkLnNob3dFcnJvcihcIkZhaWxlZCB0byBpbXBvcnQgdGFibGUgb2YgY29udGVudHMgZnJvbSBib29rLlwiKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0aGlzLmltcG9ydFRvY1dpemFyZC5tb2RlbC5zZXQoXCJ0b2NJdGVtc1wiLCB0b2NJdGVtcyk7XG5cdFx0XHRcdFx0dGhpcy5pbXBvcnRUb2NXaXphcmQubW9kZWwuc2V0KFwic3RlcFwiLCAyKTtcblx0XHRcdFx0XHR0aGlzLmltcG9ydFRvY1dpemFyZC5tb2RlbC5zZXQoXCJsb2FkaW5nXCIsIGZhbHNlKTtcblx0XHRcdFx0XHR0aGlzLnVpLnNlbGVjdGVkQm9vay50ZXh0KHRoaXMuaW1wb3J0VG9jV2l6YXJkLm1vZGVsLmdldChcInNlbGVjdGVkQm9va1RpdGxlXCIpKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0ZXJyb3I6ICgpID0+IHtcblx0XHRcdFx0XHR0aGlzLmltcG9ydFRvY1dpemFyZC5tb2RlbC5zZXQoXCJsb2FkaW5nXCIsIGZhbHNlKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5pbXBvcnRUb2NXaXphcmQuc2hvd0Vycm9yKFwiRmFpbGVkIHRvIGltcG9ydCB0YWJsZSBvZiBjb250ZW50cyBmcm9tIGJvb2suXCIpO1xuXHRcdFx0XHR9LFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKGN1cnJlbnRTdGVwID09PSAyKSB7XG5cdFx0XHR0aGlzLmltcG9ydFRvY1dpemFyZC52ZXJpZnlUb2NTZWxlY3Rpb24oKTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoY3VycmVudFN0ZXAgPT09IDMpIHtcblx0XHRcdGNvbnN0IGZpbmlzaCA9IGl0ZW1zID0+IHtcblx0XHRcdFx0dGhpcy5pbXBvcnRUb2NXaXphcmQubW9kZWwuc2V0KFwibG9hZGluZ1wiLCB0cnVlKTtcblx0XHRcdFx0JC5hamF4KHtcblx0XHRcdFx0XHRtZXRob2Q6IFwiUE9TVFwiLFxuXHRcdFx0XHRcdHVybDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FjYWNpYS9sZWFybmluZ1BhdGhzL2l0ZW1zL2J1bGsvXCIgKyB0aGlzLm1vZGVsLmdldChcImxlYXJuaW5nUGF0aFwiKSxcblx0XHRcdFx0XHRkYXRhOiB7IGJvb2s6IGJvb2tJZCwgaXRlbXMsIGdyb3VwczogW3RoaXMubW9kZWwuZ2V0KFwiZ3JvdXBcIildLCByZXNldEZvcm1hdDogdGhpcy5tb2RlbC5nZXQoXCJyZXNldEZvcm1hdFwiKSwga2VlcEJvb2tBdHRhY2htZW50czogdGhpcy5tb2RlbC5nZXQoXCJrZWVwQm9va0F0dGFjaG1lbnRzXCIpIH0sXG5cdFx0XHRcdFx0c3VjY2VzczogKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5jbG9zZShcImNyZWF0ZVwiLCBpdGVtcyk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRlcnJvcjogKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5pbXBvcnRUb2NXaXphcmQubW9kZWwuc2V0KFwibG9hZGluZ1wiLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5pbXBvcnRUb2NXaXphcmQuc2hvd0Vycm9yKFwiRmFpbGVkIHRvIGNyZWF0ZSBsZWFybmluZyBwYXRoIGl0ZW1zIGZyb20gdGFibGUgb2YgY29udGVudCBkYXRhLlwiKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9KTtcblx0XHRcdH07XG5cblx0XHRcdGNvbnN0IHNlbGVjdGVkVG9jSXRlbXMgPSB0aGlzLmltcG9ydFRvY1dpemFyZC5tb2RlbC5nZXQoXCJzZWxlY3RlZFRvY0l0ZW1zXCIpO1xuXG5cdFx0XHRmaW5pc2goc2VsZWN0ZWRUb2NJdGVtcyk7XG5cdFx0fVxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHRfLmJpbmRBbGwodGhpcyk7XG5cblx0XHR0aGlzLm1vZGVsLnNldChcImdyb3VwXCIsIG9wdGlvbnMuZ3JvdXApO1xuXHRcdHRoaXMubW9kZWwuc2V0KFwibGVhcm5pbmdQYXRoXCIsIG9wdGlvbnMubGVhcm5pbmdfcGF0aCk7XG5cdFx0dGhpcy5tb2RlbC5zZXQoXCJyZXNldEZvcm1hdFwiLCBvcHRpb25zLnJlc2V0Rm9ybWF0KTtcblx0XHR0aGlzLm1vZGVsLnNldChcImtlZXBCb29rQXR0YWNobWVudHNcIiwgb3B0aW9ucy5rZWVwQm9va0F0dGFjaG1lbnRzKTtcblxuXHRcdHRoaXMuT3B0aW9ucyA9IHtcblx0XHRcdGNsYXNzZXM6IFtcImltcG9ydC10b2MtbW9kYWxcIl0sXG5cdFx0XHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9jb25zb2xlL2ltcG9ydFRvY01vZGFsLm51bmpcIikuY29udGFpbmVyLFxuXHRcdFx0Y3JlYXRlSWNvbjogXCJmYS1hcnJvdy1hbHQtdG8tYm90dG9tXCIsXG5cdFx0XHRidXR0b25zOiB7XG5cdFx0XHRcdGNyZWF0ZToge1xuXHRcdFx0XHRcdHR5cGU6IFwiYWNjZXB0XCIsXG5cdFx0XHRcdFx0bGFiZWw6IFwiQ29udGludWVcIixcblx0XHRcdFx0XHRtb2RlOiBcImNyZWF0ZVwiLFxuXHRcdFx0XHRcdHZhbGlkYXRlOiBmYWxzZSxcblx0XHRcdFx0XHRzYXZlOiBmYWxzZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0Y2FuY2VsOiB7XG5cdFx0XHRcdFx0dHlwZTogXCJjYW5jZWxcIixcblx0XHRcdFx0XHRsYWJlbDogXCJDYW5jZWxcIixcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XHRjcmVhdGVWZXJiOiBcIkltcG9ydCBmcm9tIGJvb2sgVGFibGUgb2YgQ29udGVudHNcIixcblx0XHRcdGRhdGFOb3VuOiBudWxsLFxuXHRcdFx0c2l6ZUNvbnN0cmFpbnRzOiB7XG5cdFx0XHRcdG1pbkhlaWdodDogXCI1MHZoXCIsXG5cdFx0XHRcdG1pbldpZHRoOiBcIjUwdndcIixcblx0XHRcdH0sXG5cdFx0XHRob3N0OiBvcHRpb25zLmhvc3QsXG5cdFx0fTtcblxuXHRcdHRoaXMudWkgPSBfLmV4dGVuZCh0aGlzLnVpLCBCaWdNb2RhbC5wcm90b3R5cGUudWkpO1xuXHRcdHRoaXMuZXZlbnRzID0gXy5leHRlbmQodGhpcy5ldmVudHMsIEJpZ01vZGFsLnByb3RvdHlwZS5ldmVudHMpO1xuXG5cdFx0QmlnTW9kYWwucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzKTtcblx0fSxcblxuXHRyZW5kZXJGb3JtOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmltcG9ydFRvY1dpemFyZCA9IG5ldyBJbXBvcnRUb2NXaXphcmQoe1xuXHRcdFx0bW9kZWw6IG5ldyBCYWNrYm9uZS5Nb2RlbCh7IGdyb3VwOiB0aGlzLm1vZGVsLmdldChcImdyb3VwXCIpIH0pLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy51aS50b2NDb250YWluZXIuYXBwZW5kKHRoaXMuaW1wb3J0VG9jV2l6YXJkLnJlbmRlcigpLmVsKTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuaW1wb3J0VG9jV2l6YXJkLCBcInJlbmRlclwiLCB2aWV3ID0+IHtcblx0XHRcdGNvbnN0IHN0ZXAgPSB2aWV3Lm1vZGVsLmdldChcInN0ZXBcIik7XG5cdFx0XHQkKFwiI3RvY0hlYWRlciBsYWJlbFwiKS5yZW1vdmVDbGFzcyhcImFjdGl2ZVwiKTtcblx0XHRcdCQoXCIjdG9jSGVhZGVyIC5cIiArIHZpZXcud2l6YXJkTWFwW3N0ZXBdKS5hZGRDbGFzcyhcImFjdGl2ZVwiKTtcblx0XHRcdHRoaXMudWkuY29udGludWVCdG4ucHJvcChcImRpc2FibGVkXCIsIHRoaXMuaW1wb3J0VG9jV2l6YXJkLm1vZGVsLmdldChcImxvYWRpbmdcIikpO1xuXHRcdH0pO1xuXHR9LFxufSk7Il19",
    "\"use strict\";\n// ----------------------------------------------------------------------------\n// Dependencies\n// ----------------------------------------------------------------------------\n\nvar Backbone = require(\"backbone\");\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar App = require(\"../../../index\");\nvar settings = require(\"app-settings\");\n\nvar ChooserView = require(\"./chooserView\");\nvar BookView = require(\"./bookView\");\nvar Sidebar = require(\"./sidebar\");\nvar Header = require(\"./header\");\nvar LearningPathView = require(\"./learningPathView\");\n\n// ----------------------------------------------------------------------------\n// Events\n// ----------------------------------------------------------------------------\n\nvar eventBus = require(\"./eventBus\");\n\n// ----------------------------------------------------------------------------\n// Models\n// ----------------------------------------------------------------------------\nvar Book = Backbone.Model.extend({\n\tdefaults: {},\n\tidAttribute: \"_id\",\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/epubs/\" + this.get(\"id\");\n\t},\n\n\ttitle: function title() {\n\t\treturn this.get(\"metadata\").title;\n\t}\n});\n\nvar Group = Backbone.Model.extend({\n\tdefaults: {},\n\tidAttribute: \"code\"\n});\n\nvar LearningPath = Backbone.Model.extend({\n\tdefaults: {\n\t\teditingAllowed: false,\n\t\twsConnected: false\n\t},\n\tidAttribute: \"group\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/acacia/learningPaths\";\n\t}\n});\n\nvar ErrorView = Backbone.Marionette.View.extend({\n\ttemplate: require(\"../../templates/console/index.nunj\").error,\n\n\tinitialize: function initialize(options) {\n\t\tthis.error = options.error;\n\t},\n\n\tserializeData: function serializeData() {\n\t\tvar e = App.parseResponse(this.error);\n\t\treturn { error: this.error && this.error.toJSON ? this.error.toJSON() : { detail: e.detail || e.info } };\n\t}\n});\n\n// ----------------------------------------------------------------------------\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"full-content\",\n\tid: \"link-resources\",\n\n\ttemplate: require(\"../../templates/console/index.nunj\").console,\n\n\tregions: {\n\t\tsidebar: \"#sidebar-region\",\n\t\theader: \"#header-region\",\n\t\tcontent: \"#content-region\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tvar _this = this;\n\n\t\tthis.loaded = false;\n\n\t\teventBus.reply(eventBus.Events.GetCurrentBook, function () {\n\t\t\tif (_.isNil(_this.bookModel)) _this.bookModel = new Book();\n\t\t\t_this.bookModel.set(\"id\", _this.bookModel.get(\"_id\"));\n\t\t\treturn _this.bookModel;\n\t\t});\n\n\t\teventBus.reply(eventBus.Events.GetCurrentGroup, function () {\n\t\t\tif (_.isNil(_this.groupModel)) _this.groupModel = new Group();\n\t\t\t_this.groupModel.set(\"id\", _this.groupModel.get(\"_id\"));\n\t\t\treturn _this.groupModel;\n\t\t});\n\n\t\teventBus.reply(eventBus.Events.GetNavVersion, _.constant(4));\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.showChildView(\"sidebar\", new Sidebar());\n\t\tthis.showChildView(\"header\", new Header());\n\t},\n\n\tloadConsole: function loadConsole(id) {\n\t\tdelete this.bookModel;\n\n\t\tif (this.error) return this.showChildView(\"content\", new ErrorView({ error: this.error }));\n\n\t\teventBus.trigger(eventBus.Events.ViewChanged, \"console\", id);\n\n\t\tthis.chooserView = new ChooserView();\n\t\tthis.showChildView(\"content\", this.chooserView);\n\t\tthis.chooserView.showConsole(id);\n\t},\n\n\tloadBook: function loadBook(book, location, hash) {\n\t\tvar _this2 = this;\n\n\t\tvar finish = function finish(books) {\n\t\t\tif (_this2.error) return _this2.showChildView(\"content\", new ErrorView({ error: _this2.error }));\n\n\t\t\t_this2.bookModel = _.find(books, function (item) {\n\t\t\t\treturn item.id === book || item.get(\"metadata\").bookID === book;\n\t\t\t});\n\t\t\tif (!_this2.bookModel) return _this2.showChildView(\"content\", new ErrorView({ error: new Error(\"That book cannot be found\") }));\n\n\t\t\tvar show = function show() {\n\t\t\t\teventBus.trigger(eventBus.Events.ViewChanged, \"books\", { book: _this2.bookModel });\n\t\t\t\t_this2.showChildView(\"content\", new BookView({ location: location, hash: hash }));\n\t\t\t};\n\n\t\t\tif (window.pdfjsLib) return show();\n\n\t\t\t// Missing modules, load dynamically\n\t\t\t$.dynamicScript(settings.urlRoot + \"/vendor/js/pdfjs.js\", function () {\n\t\t\t\tif (!window.pdfjsLib) return;\n\n\t\t\t\twindow.pdfjsLib.GlobalWorkerOptions.workerSrc = settings.urlRoot + \"/vendor/js/pdfjs.worker.js\";\n\t\t\t\tshow();\n\t\t\t});\n\t\t};\n\n\t\tif (_.has(this.chooserView, \"bookViewBookChooser\") && this.chooserView.bookViewBookChooser.collection) {\n\t\t\tfinish(this.chooserView.bookViewBookChooser.collection.models);\n\t\t} else {\n\t\t\t// Fetch the specified book\n\t\t\tvar model = new Book({ id: book, _id: book });\n\n\t\t\tmodel.fetch({\n\t\t\t\tsuccess: function success() {\n\t\t\t\t\tfinish([model]);\n\t\t\t\t},\n\n\t\t\t\terror: function error(modelData, xhr) {\n\t\t\t\t\t_this2.showChildView(\"content\", new ErrorView({ error: new Error(\"Error fetching book model: \" + book, xhr) }));\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n\n\tloadLearningPath: function loadLearningPath(learningPath, location) {\n\t\tvar _this3 = this;\n\n\t\tvar finish = function finish(learning_paths) {\n\t\t\tif (_this3.error) return _this3.showChildView(\"content\", new ErrorView({ error: _this3.error }));\n\t\t\tvar learningPathModel = _.find(learning_paths, function (item) {\n\t\t\t\treturn (item.get(\"id\") || item.id) === learningPath;\n\t\t\t});\n\t\t\tif (!learningPathModel) return _this3.showChildView(\"content\", new ErrorView({ error: new Error(\"That learningPath cannot be found\") }));\n\t\t\teventBus.trigger(eventBus.Events.ViewChanged, \"learningPath\", { learningPath: learningPathModel });\n\t\t\t_this3.learningPathModel = learningPathModel;\n\t\t\t_this3.groupModel = learningPathModel;\n\t\t\t_this3.showChildView(\"content\", new LearningPathView({ model: learningPathModel, location: location }));\n\t\t};\n\n\t\tif (this.chooserView && this.chooserView.learningPathChooser.collection) {\n\t\t\tfinish(this.chooserView.learningPathChooser.collection.models);\n\t\t} else {\n\t\t\t// Fetch the specified learningPath\n\t\t\tvar model = new LearningPath({ group: learningPath });\n\n\t\t\tmodel.fetch({\n\t\t\t\tsuccess: function success() {\n\t\t\t\t\tfinish([model]);\n\t\t\t\t},\n\n\t\t\t\terror: function error(modelData, xhr) {\n\t\t\t\t\t_this3.showChildView(\"content\", new ErrorView({ error: new Error(\"Error fetching learning path model: \" + learningPath, xhr) }));\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.bookModel = null;\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIiQiLCJfIiwiQXBwIiwic2V0dGluZ3MiLCJDaG9vc2VyVmlldyIsIkJvb2tWaWV3IiwiU2lkZWJhciIsIkhlYWRlciIsIkxlYXJuaW5nUGF0aFZpZXciLCJldmVudEJ1cyIsIkJvb2siLCJNb2RlbCIsImV4dGVuZCIsImRlZmF1bHRzIiwiaWRBdHRyaWJ1dGUiLCJ1cmwiLCJ1cmxSb290IiwiZ2V0IiwidGl0bGUiLCJHcm91cCIsIkxlYXJuaW5nUGF0aCIsImVkaXRpbmdBbGxvd2VkIiwid3NDb25uZWN0ZWQiLCJFcnJvclZpZXciLCJNYXJpb25ldHRlIiwiVmlldyIsInRlbXBsYXRlIiwiZXJyb3IiLCJpbml0aWFsaXplIiwib3B0aW9ucyIsInNlcmlhbGl6ZURhdGEiLCJlIiwicGFyc2VSZXNwb25zZSIsInRvSlNPTiIsImRldGFpbCIsImluZm8iLCJtb2R1bGUiLCJleHBvcnRzIiwidGFnTmFtZSIsImNsYXNzTmFtZSIsImlkIiwiY29uc29sZSIsInJlZ2lvbnMiLCJzaWRlYmFyIiwiaGVhZGVyIiwiY29udGVudCIsImxvYWRlZCIsInJlcGx5IiwiRXZlbnRzIiwiR2V0Q3VycmVudEJvb2siLCJpc05pbCIsImJvb2tNb2RlbCIsInNldCIsIkdldEN1cnJlbnRHcm91cCIsImdyb3VwTW9kZWwiLCJHZXROYXZWZXJzaW9uIiwiY29uc3RhbnQiLCJvblJlbmRlciIsInNob3dDaGlsZFZpZXciLCJsb2FkQ29uc29sZSIsInRyaWdnZXIiLCJWaWV3Q2hhbmdlZCIsImNob29zZXJWaWV3Iiwic2hvd0NvbnNvbGUiLCJsb2FkQm9vayIsImJvb2siLCJsb2NhdGlvbiIsImhhc2giLCJmaW5pc2giLCJmaW5kIiwiYm9va3MiLCJpdGVtIiwiYm9va0lEIiwiRXJyb3IiLCJzaG93Iiwid2luZG93IiwicGRmanNMaWIiLCJkeW5hbWljU2NyaXB0IiwiR2xvYmFsV29ya2VyT3B0aW9ucyIsIndvcmtlclNyYyIsImhhcyIsImJvb2tWaWV3Qm9va0Nob29zZXIiLCJjb2xsZWN0aW9uIiwibW9kZWxzIiwibW9kZWwiLCJfaWQiLCJmZXRjaCIsInN1Y2Nlc3MiLCJtb2RlbERhdGEiLCJ4aHIiLCJsb2FkTGVhcm5pbmdQYXRoIiwibGVhcm5pbmdQYXRoIiwibGVhcm5pbmdQYXRoTW9kZWwiLCJsZWFybmluZ19wYXRocyIsImxlYXJuaW5nUGF0aENob29zZXIiLCJncm91cCIsIm9uQmVmb3JlRGVzdHJveSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUMsSUFBSUQsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNRSxJQUFJRixRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1HLE1BQU1ILFFBQVEsZ0JBQVIsQ0FBWjtBQUNBLElBQU1JLFdBQVdKLFFBQVEsY0FBUixDQUFqQjs7QUFFQSxJQUFNSyxjQUFjTCxRQUFRLGVBQVIsQ0FBcEI7QUFDQSxJQUFNTSxXQUFXTixRQUFRLFlBQVIsQ0FBakI7QUFDQSxJQUFNTyxVQUFVUCxRQUFRLFdBQVIsQ0FBaEI7QUFDQSxJQUFNUSxTQUFTUixRQUFRLFVBQVIsQ0FBZjtBQUNBLElBQU1TLG1CQUFtQlQsUUFBUSxvQkFBUixDQUF6Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsSUFBTVUsV0FBV1YsUUFBUSxZQUFSLENBQWpCOztBQUdBO0FBQ0E7QUFDQTtBQUNBLElBQU1XLE9BQU9aLFNBQVNhLEtBQVQsQ0FBZUMsTUFBZixDQUFzQjtBQUNsQ0MsV0FBVSxFQUR3QjtBQUVsQ0MsY0FBYSxLQUZxQjs7QUFJbENDLE1BQUssZUFBVztBQUNmLFNBQU9aLFNBQVNhLE9BQVQsR0FBbUIsaUJBQW5CLEdBQXVDLEtBQUtDLEdBQUwsQ0FBUyxJQUFULENBQTlDO0FBQ0EsRUFOaUM7O0FBUWxDQyxRQUFPLGlCQUFXO0FBQ2pCLFNBQU8sS0FBS0QsR0FBTCxDQUFTLFVBQVQsRUFBcUJDLEtBQTVC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O0FBQ0EsR0FaRDs7QUFjQSxNQUFJLEtBQUtKLFdBQUwsSUFBb0IsS0FBS0EsV0FBTCxDQUFpQmdDLG1CQUFqQixDQUFxQ1osVUFBN0QsRUFBeUU7QUFDeEVkLFVBQU8sS0FBS04sV0FBTCxDQUFpQmdDLG1CQUFqQixDQUFxQ1osVUFBckMsQ0FBZ0RDLE1BQXZEO0FBQ0EsR0FGRCxNQUdLO0FBQ0o7QUFDQSxPQUFNQyxRQUFRLElBQUloRSxZQUFKLENBQWlCLEVBQUUyRSxPQUFPSixZQUFULEVBQWpCLENBQWQ7O0FBRUFQLFNBQU1FLEtBQU4sQ0FBWTtBQUNYQyxhQUFTLG1CQUFNO0FBQ2RuQixZQUFPLENBQUNnQixLQUFELENBQVA7QUFDQSxLQUhVOztBQUtYekQsV0FBTyxlQUFDNkQsU0FBRCxFQUFZQyxHQUFaLEVBQW9CO0FBQzFCLFlBQUsvQixhQUFMLENBQW1CLFNBQW5CLEVBQThCLElBQUluQyxTQUFKLENBQWMsRUFBRUksT0FBTyxJQUFJOEMsS0FBSixDQUFVLHlDQUF5Q2tCLFlBQW5ELEVBQWlFRixHQUFqRSxDQUFULEVBQWQsQ0FBOUI7QUFDQTtBQVBVLElBQVo7QUFTQTtBQUNELEVBakkrQzs7QUFtSWhETyxrQkFBaUIsMkJBQVc7QUFDM0IsT0FBSzdDLFNBQUwsR0FBaUIsSUFBakI7QUFDQTtBQXJJK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERlcGVuZGVuY2llc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgQXBwID0gcmVxdWlyZShcIi4uLy4uLy4uL2luZGV4XCIpO1xuY29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuXG5jb25zdCBDaG9vc2VyVmlldyA9IHJlcXVpcmUoXCIuL2Nob29zZXJWaWV3XCIpO1xuY29uc3QgQm9va1ZpZXcgPSByZXF1aXJlKFwiLi9ib29rVmlld1wiKTtcbmNvbnN0IFNpZGViYXIgPSByZXF1aXJlKFwiLi9zaWRlYmFyXCIpO1xuY29uc3QgSGVhZGVyID0gcmVxdWlyZShcIi4vaGVhZGVyXCIpO1xuY29uc3QgTGVhcm5pbmdQYXRoVmlldyA9IHJlcXVpcmUoXCIuL2xlYXJuaW5nUGF0aFZpZXdcIik7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEV2ZW50c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBldmVudEJ1cyA9IHJlcXVpcmUoXCIuL2V2ZW50QnVzXCIpO1xuXG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE1vZGVsc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuY29uc3QgQm9vayA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7fSxcblx0aWRBdHRyaWJ1dGU6IFwiX2lkXCIsXG5cblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvZXB1YnMvXCIgKyB0aGlzLmdldChcImlkXCIpO1xuXHR9LFxuXG5cdHRpdGxlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXQoXCJtZXRhZGF0YVwiKS50aXRsZTtcblx0fSxcbn0pO1xuXG5jb25zdCBHcm91cCA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7fSxcblx0aWRBdHRyaWJ1dGU6IFwiY29kZVwiLFxufSk7XG5cbmNvbnN0IExlYXJuaW5nUGF0aCA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7XG5cdFx0ZWRpdGluZ0FsbG93ZWQ6IGZhbHNlLFxuXHRcdHdzQ29ubmVjdGVkOiBmYWxzZSxcblx0fSxcblx0aWRBdHRyaWJ1dGU6IFwiZ3JvdXBcIixcblxuXHR1cmxSb290OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FjYWNpYS9sZWFybmluZ1BhdGhzXCI7XG5cdH0sXG59KTtcblxuY29uc3QgRXJyb3JWaWV3ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2NvbnNvbGUvaW5kZXgubnVualwiKS5lcnJvcixcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5lcnJvciA9IG9wdGlvbnMuZXJyb3I7XG5cdH0sXG5cblx0c2VyaWFsaXplRGF0YTogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgZSA9IEFwcC5wYXJzZVJlc3BvbnNlKHRoaXMuZXJyb3IpO1xuXHRcdHJldHVybiB7IGVycm9yOiB0aGlzLmVycm9yICYmIHRoaXMuZXJyb3IudG9KU09OID8gdGhpcy5lcnJvci50b0pTT04oKSA6IHsgZGV0YWlsOiBlLmRldGFpbCB8fCBlLmluZm8gfSB9O1xuXHR9LFxufSk7XG5cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwiZnVsbC1jb250ZW50XCIsXG5cdGlkOiBcImxpbmstcmVzb3VyY2VzXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvY29uc29sZS9pbmRleC5udW5qXCIpLmNvbnNvbGUsXG5cblx0cmVnaW9uczoge1xuXHRcdHNpZGViYXI6IFwiI3NpZGViYXItcmVnaW9uXCIsXG5cdFx0aGVhZGVyOiBcIiNoZWFkZXItcmVnaW9uXCIsXG5cdFx0Y29udGVudDogXCIjY29udGVudC1yZWdpb25cIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmxvYWRlZCA9IGZhbHNlO1xuXG5cdFx0ZXZlbnRCdXMucmVwbHkoZXZlbnRCdXMuRXZlbnRzLkdldEN1cnJlbnRCb29rLCAoKSA9PiB7XG5cdFx0XHRpZiAoXy5pc05pbCh0aGlzLmJvb2tNb2RlbCkpXG5cdFx0XHRcdHRoaXMuYm9va01vZGVsID0gbmV3IEJvb2soKTtcblx0XHRcdHRoaXMuYm9va01vZGVsLnNldChcImlkXCIsIHRoaXMuYm9va01vZGVsLmdldChcIl9pZFwiKSk7XG5cdFx0XHRyZXR1cm4gdGhpcy5ib29rTW9kZWw7XG5cdFx0fSk7XG5cblx0XHRldmVudEJ1cy5yZXBseShldmVudEJ1cy5FdmVudHMuR2V0Q3VycmVudEdyb3VwLCAoKSA9PiB7XG5cdFx0XHRpZiAoXy5pc05pbCh0aGlzLmdyb3VwTW9kZWwpKVxuXHRcdFx0XHR0aGlzLmdyb3VwTW9kZWwgPSBuZXcgR3JvdXAoKTtcblx0XHRcdHRoaXMuZ3JvdXBNb2RlbC5zZXQoXCJpZFwiLCB0aGlzLmdyb3VwTW9kZWwuZ2V0KFwiX2lkXCIpKTtcblx0XHRcdHJldHVybiB0aGlzLmdyb3VwTW9kZWw7XG5cdFx0fSk7XG5cblx0XHRldmVudEJ1cy5yZXBseShldmVudEJ1cy5FdmVudHMuR2V0TmF2VmVyc2lvbiwgXy5jb25zdGFudCg0KSk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcInNpZGViYXJcIiwgbmV3IFNpZGViYXIoKSk7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiaGVhZGVyXCIsIG5ldyBIZWFkZXIoKSk7XG5cdH0sXG5cblx0bG9hZENvbnNvbGU6IGZ1bmN0aW9uKGlkKSB7XG5cdFx0ZGVsZXRlIHRoaXMuYm9va01vZGVsO1xuXG5cdFx0aWYgKHRoaXMuZXJyb3IpXG5cdFx0XHRyZXR1cm4gdGhpcy5zaG93Q2hpbGRWaWV3KFwiY29udGVudFwiLCBuZXcgRXJyb3JWaWV3KHsgZXJyb3I6IHRoaXMuZXJyb3IgfSkpO1xuXG5cdFx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5FdmVudHMuVmlld0NoYW5nZWQsIFwiY29uc29sZVwiLCBpZCk7XG5cblx0XHR0aGlzLmNob29zZXJWaWV3ID0gbmV3IENob29zZXJWaWV3KCk7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiY29udGVudFwiLCB0aGlzLmNob29zZXJWaWV3KTtcblx0XHR0aGlzLmNob29zZXJWaWV3LnNob3dDb25zb2xlKGlkKTtcblx0fSxcblxuXHRsb2FkQm9vazogZnVuY3Rpb24oYm9vaywgbG9jYXRpb24sIGhhc2gpIHtcblx0XHRjb25zdCBmaW5pc2ggPSBib29rcyA9PiB7XG5cdFx0XHRpZiAodGhpcy5lcnJvcilcblx0XHRcdFx0cmV0dXJuIHRoaXMuc2hvd0NoaWxkVmlldyhcImNvbnRlbnRcIiwgbmV3IEVycm9yVmlldyh7IGVycm9yOiB0aGlzLmVycm9yIH0pKTtcblxuXHRcdFx0dGhpcy5ib29rTW9kZWwgPSBfLmZpbmQoYm9va3MsIGl0ZW0gPT4gaXRlbS5pZCA9PT0gYm9vayB8fCBpdGVtLmdldChcIm1ldGFkYXRhXCIpLmJvb2tJRCA9PT0gYm9vayk7XG5cdFx0XHRpZiAoIXRoaXMuYm9va01vZGVsKVxuXHRcdFx0XHRyZXR1cm4gdGhpcy5zaG93Q2hpbGRWaWV3KFwiY29udGVudFwiLCBuZXcgRXJyb3JWaWV3KHsgZXJyb3I6IG5ldyBFcnJvcihcIlRoYXQgYm9vayBjYW5ub3QgYmUgZm91bmRcIikgfSkpO1xuXG5cdFx0XHRjb25zdCBzaG93ID0gKCkgPT4ge1xuXHRcdFx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5WaWV3Q2hhbmdlZCwgXCJib29rc1wiLCB7IGJvb2s6IHRoaXMuYm9va01vZGVsIH0pO1xuXHRcdFx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJjb250ZW50XCIsIG5ldyBCb29rVmlldyh7IGxvY2F0aW9uOiBsb2NhdGlvbiwgaGFzaDogaGFzaCB9KSk7XG5cdFx0XHR9O1xuXG5cdFx0XHRpZiAod2luZG93LnBkZmpzTGliKVxuXHRcdFx0XHRyZXR1cm4gc2hvdygpO1xuXG5cdFx0XHQvLyBNaXNzaW5nIG1vZHVsZXMsIGxvYWQgZHluYW1pY2FsbHlcblx0XHRcdCQuZHluYW1pY1NjcmlwdChzZXR0aW5ncy51cmxSb290ICsgXCIvdmVuZG9yL2pzL3BkZmpzLmpzXCIsICgpID0+IHtcblx0XHRcdFx0aWYgKCF3aW5kb3cucGRmanNMaWIpXG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdHdpbmRvdy5wZGZqc0xpYi5HbG9iYWxXb3JrZXJPcHRpb25zLndvcmtlclNyYyA9IHNldHRpbmdzLnVybFJvb3QgKyBcIi92ZW5kb3IvanMvcGRmanMud29ya2VyLmpzXCI7XG5cdFx0XHRcdHNob3coKTtcblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHRpZiAoXy5oYXModGhpcy5jaG9vc2VyVmlldywgXCJib29rVmlld0Jvb2tDaG9vc2VyXCIpICYmIHRoaXMuY2hvb3NlclZpZXcuYm9va1ZpZXdCb29rQ2hvb3Nlci5jb2xsZWN0aW9uKSB7XG5cdFx0XHRmaW5pc2godGhpcy5jaG9vc2VyVmlldy5ib29rVmlld0Jvb2tDaG9vc2VyLmNvbGxlY3Rpb24ubW9kZWxzKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHQvLyBGZXRjaCB0aGUgc3BlY2lmaWVkIGJvb2tcblx0XHRcdGNvbnN0IG1vZGVsID0gbmV3IEJvb2soeyBpZDogYm9vaywgX2lkOiBib29rIH0pO1xuXG5cdFx0XHRtb2RlbC5mZXRjaCh7XG5cdFx0XHRcdHN1Y2Nlc3M6ICgpID0+IHtcblx0XHRcdFx0XHRmaW5pc2goW21vZGVsXSk7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0ZXJyb3I6IChtb2RlbERhdGEsIHhocikgPT4ge1xuXHRcdFx0XHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImNvbnRlbnRcIiwgbmV3IEVycm9yVmlldyh7IGVycm9yOiBuZXcgRXJyb3IoXCJFcnJvciBmZXRjaGluZyBib29rIG1vZGVsOiBcIiArIGJvb2ssIHhocikgfSkpO1xuXHRcdFx0XHR9LFxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdGxvYWRMZWFybmluZ1BhdGg6IGZ1bmN0aW9uKGxlYXJuaW5nUGF0aCwgbG9jYXRpb24pIHtcblx0XHRjb25zdCBmaW5pc2ggPSBsZWFybmluZ19wYXRocyA9PiB7XG5cdFx0XHRpZiAodGhpcy5lcnJvcilcblx0XHRcdFx0cmV0dXJuIHRoaXMuc2hvd0NoaWxkVmlldyhcImNvbnRlbnRcIiwgbmV3IEVycm9yVmlldyh7IGVycm9yOiB0aGlzLmVycm9yIH0pKTtcblx0XHRcdGNvbnN0IGxlYXJuaW5nUGF0aE1vZGVsID0gXy5maW5kKGxlYXJuaW5nX3BhdGhzLCBpdGVtID0+XG5cdFx0XHRcdChpdGVtLmdldChcImlkXCIpIHx8IGl0ZW0uaWQpID09PSBsZWFybmluZ1BhdGhcblx0XHRcdCk7XG5cdFx0XHRpZiAoIWxlYXJuaW5nUGF0aE1vZGVsKVxuXHRcdFx0XHRyZXR1cm4gdGhpcy5zaG93Q2hpbGRWaWV3KFwiY29udGVudFwiLCBuZXcgRXJyb3JWaWV3KHsgZXJyb3I6IG5ldyBFcnJvcihcIlRoYXQgbGVhcm5pbmdQYXRoIGNhbm5vdCBiZSBmb3VuZFwiKSB9KSk7XG5cdFx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5WaWV3Q2hhbmdlZCwgXCJsZWFybmluZ1BhdGhcIiwgeyBsZWFybmluZ1BhdGg6IGxlYXJuaW5nUGF0aE1vZGVsIH0pO1xuXHRcdFx0dGhpcy5sZWFybmluZ1BhdGhNb2RlbCA9IGxlYXJuaW5nUGF0aE1vZGVsO1xuXHRcdFx0dGhpcy5ncm91cE1vZGVsID0gbGVhcm5pbmdQYXRoTW9kZWw7XG5cdFx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJjb250ZW50XCIsIG5ldyBMZWFybmluZ1BhdGhWaWV3KHsgbW9kZWw6IGxlYXJuaW5nUGF0aE1vZGVsLCBsb2NhdGlvbiB9KSk7XG5cdFx0fTtcblxuXHRcdGlmICh0aGlzLmNob29zZXJWaWV3ICYmIHRoaXMuY2hvb3NlclZpZXcubGVhcm5pbmdQYXRoQ2hvb3Nlci5jb2xsZWN0aW9uKSB7XG5cdFx0XHRmaW5pc2godGhpcy5jaG9vc2VyVmlldy5sZWFybmluZ1BhdGhDaG9vc2VyLmNvbGxlY3Rpb24ubW9kZWxzKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHQvLyBGZXRjaCB0aGUgc3BlY2lmaWVkIGxlYXJuaW5nUGF0aFxuXHRcdFx0Y29uc3QgbW9kZWwgPSBuZXcgTGVhcm5pbmdQYXRoKHsgZ3JvdXA6IGxlYXJuaW5nUGF0aCB9KTtcblxuXHRcdFx0bW9kZWwuZmV0Y2goe1xuXHRcdFx0XHRzdWNjZXNzOiAoKSA9PiB7XG5cdFx0XHRcdFx0ZmluaXNoKFttb2RlbF0pO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdGVycm9yOiAobW9kZWxEYXRhLCB4aHIpID0+IHtcblx0XHRcdFx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJjb250ZW50XCIsIG5ldyBFcnJvclZpZXcoeyBlcnJvcjogbmV3IEVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgbGVhcm5pbmcgcGF0aCBtb2RlbDogXCIgKyBsZWFybmluZ1BhdGgsIHhocikgfSkpO1xuXHRcdFx0XHR9LFxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5ib29rTW9kZWwgPSBudWxsO1xuXHR9LFxufSk7Il19",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\n\nvar BigModal = require(\"../../../lib/bigModal\");\nvar LPChooser = require(\"../../../lib/learningPathChooser\");\n\nmodule.exports = BigModal.extend({\n\tui: {\n\t\tblankTemplateButton: \"div.template-blank\",\n\t\texistingTemplateButton: \"div.template-existing\",\n\t\tbookTemplateButton: \"div.template-book\",\n\t\tcalendarTemplateButton: \"div.template-calendar\",\n\n\t\tblankContainer: \"div.blank-container\",\n\t\tlpChooserContainer: \"div.lp-chooser-container\",\n\t\tbookChooserContainer: \"div.book-chooser-container\",\n\t\tcalendarContainer: \"div.calendar-container\",\n\n\t\tcalendarType: \"input[name='calendarType']\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.blankTemplateButton\": \"onBlankTemplateButtonClick\",\n\t\t\"click @ui.existingTemplateButton\": \"onExistingTemplateButtonClick\",\n\t\t\"click @ui.bookTemplateButton\": \"onBookTemplateButtonClick\",\n\t\t\"click @ui.calendarTemplateButton\": \"onCalendarTemplateButtonClick\",\n\n\t\t\"change @ui.calendarType\": \"onCalendarTypeChange\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\t_.bindAll(this);\n\n\t\tthis.group = options.group;\n\n\t\tthis.Options = {\n\t\t\tclasses: [\"lp-template-modal\"],\n\t\t\ttemplate: require(\"../../templates/console/learningPathTemplateModal.nunj\").content,\n\t\t\tbuttons: {\n\t\t\t\tcreate: {\n\t\t\t\t\ttype: \"accept\",\n\t\t\t\t\tlabel: \"Create\",\n\t\t\t\t\tmode: \"create\",\n\t\t\t\t\tvalidate: true\n\t\t\t\t},\n\t\t\t\tcancel: {\n\t\t\t\t\ttype: \"cancel\",\n\t\t\t\t\tlabel: \"Cancel\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tdataNoun: \"learning path\",\n\t\t\tsizeConstraints: {\n\t\t\t\tminHeight: \"50vh\",\n\t\t\t\tminWidth: \"50vw\"\n\t\t\t}\n\t\t};\n\n\t\tthis.ui = _.extend(this.ui, BigModal.prototype.ui);\n\t\tthis.events = _.extend(this.events, BigModal.prototype.events);\n\n\t\tBigModal.prototype.initialize.call(this);\n\t},\n\n\trenderForm: function renderForm() {\n\t\tvar _this = this;\n\n\t\tthis.lpChooser = new LPChooser({\n\t\t\tlabel: \"Choose a group from which to clone the learning path, and choose whether or not you also want to clone the content. Existing data will be wiped.\",\n\t\t\tmaxHeight: \"350px\",\n\t\t\tfor: \"learning path\",\n\t\t\texludeGroup: this.group\n\t\t});\n\n\t\tthis.listenTo(this.lpChooser, \"selected\", function (details) {\n\t\t\t_this.SelectedGroup = details.groupCode;\n\t\t\t_this.withResources = details.withResources;\n\t\t\t_this.withTags = details.withTags;\n\t\t\t_this.validateSelection();\n\t\t});\n\n\t\tthis.ui.lpChooserContainer.append(this.lpChooser.render().el);\n\t\tthis.lpChooser.onRender();\n\t},\n\n\tonBlankTemplateButtonClick: function onBlankTemplateButtonClick() {\n\t\tthis.SelectedTemplate = \"blank\";\n\n\t\tthis.toggleTemplateButton(this.ui.blankTemplateButton);\n\t\tthis.toggleContainer(this.ui.blankContainer);\n\t},\n\n\tonExistingTemplateButtonClick: function onExistingTemplateButtonClick() {\n\t\tthis.SelectedTemplate = \"existing\";\n\n\t\tthis.toggleTemplateButton(this.ui.existingTemplateButton);\n\t\tthis.toggleContainer(this.ui.lpChooserContainer);\n\t},\n\n\tonBookTemplateButtonClick: function onBookTemplateButtonClick() {\n\t\tthis.SelectedTemplate = \"book\";\n\n\t\tthis.toggleTemplateButton(this.ui.bookTemplateButton);\n\t\tthis.toggleContainer(this.ui.bookChooserContainer);\n\t},\n\n\tonCalendarTemplateButtonClick: function onCalendarTemplateButtonClick() {\n\t\tthis.SelectedTemplate = \"calendar\";\n\n\t\tthis.toggleTemplateButton(this.ui.calendarTemplateButton);\n\t\tthis.toggleContainer(this.ui.calendarContainer);\n\t},\n\n\ttoggleTemplateButton: function toggleTemplateButton(button) {\n\t\t// Toggle off all buttons in the toggle group\n\t\tthis.ui.blankTemplateButton.removeClass(\"active\");\n\t\tthis.ui.existingTemplateButton.removeClass(\"active\");\n\t\tthis.ui.bookTemplateButton.removeClass(\"active\");\n\t\tthis.ui.calendarTemplateButton.removeClass(\"active\");\n\n\t\t// Toggle on the specified button\n\t\tbutton.addClass(\"active\");\n\t},\n\n\ttoggleContainer: function toggleContainer(container) {\n\t\t// Hide all containers\n\t\tthis.ui.blankContainer.addClass(\"hide\");\n\t\tthis.ui.lpChooserContainer.addClass(\"hide\");\n\t\tthis.ui.bookChooserContainer.addClass(\"hide\");\n\t\tthis.ui.calendarContainer.addClass(\"hide\");\n\n\t\t// Show the specified container\n\t\tcontainer.removeClass(\"hide\");\n\n\t\tthis.validateSelection();\n\t},\n\n\tvalidateSelection: function validateSelection() {\n\t\tvar invalid = void 0;\n\n\t\tswitch (this.SelectedTemplate) {\n\t\t\tcase \"blank\":\n\t\t\t\tinvalid = false;\n\t\t\t\tbreak;\n\n\t\t\tcase \"existing\":\n\t\t\t\tif (this.SelectedGroup) invalid = false;\n\t\t\t\tbreak;\n\n\t\t\tcase \"book\":\n\t\t\t\tinvalid = false;\n\t\t\t\tbreak;\n\n\t\t\tcase \"calendar\":\n\t\t\t\tinvalid = !$(\"input[name='calendarType']:checked\").val();\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tinvalid = true;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (invalid) this.setUIBusy();else this.setUIReady();\n\t},\n\n\tonCalendarTypeChange: function onCalendarTypeChange() {\n\t\tthis.validateSelection();\n\t},\n\n\tassembleData: function assembleData() {\n\t\tvar data = {};\n\n\t\tvar calendarTypeValue = $(\"input[name='calendarType']:checked\").val();\n\t\tvar type = calendarTypeValue ? calendarTypeValue : null;\n\t\tvar sourceID = null;\n\n\t\tif (this.SelectedTemplate === \"existing\") sourceID = this.SelectedGroup;\n\n\t\tthis.withResources = $(\"input[name='content']\", this.lpChooser.el).prop(\"checked\");\n\t\tthis.withTags = $(\"input[name='tags']\", this.lpChooser.el).prop(\"checked\");\n\n\t\tdata.attributes = {\n\t\t\ttemplate: this.SelectedTemplate,\n\t\t\tsourceID: sourceID,\n\t\t\twithResources: this.withResources,\n\t\t\twithTags: this.withTags,\n\t\t\ttype: type\n\t\t};\n\n\t\treturn data;\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxlYXJuaW5nUGF0aFRlbXBsYXRlTW9kYWwuanMiXSwibmFtZXMiOlsiJCIsInJlcXVpcmUiLCJfIiwiQmlnTW9kYWwiLCJMUENob29zZXIiLCJtb2R1bGUiLCJleHBvcnRzIiwiZXh0ZW5kIiwidWkiLCJibGFua1RlbXBsYXRlQnV0dG9uIiwiZXhpc3RpbmdUZW1wbGF0ZUJ1dHRvbiIsImJvb2tUZW1wbGF0ZUJ1dHRvbiIsImNhbGVuZGFyVGVtcGxhdGVCdXR0b24iLCJibGFua0NvbnRhaW5lciIsImxwQ2hvb3NlckNvbnRhaW5lciIsImJvb2tDaG9vc2VyQ29udGFpbmVyIiwiY2FsZW5kYXJDb250YWluZXIiLCJjYWxlbmRhclR5cGUiLCJldmVudHMiLCJpbml0aWFsaXplIiwib3B0aW9ucyIsImJpbmRBbGwiLCJncm91cCIsIk9wdGlvbnMiLCJjbGFzc2VzIiwidGVtcGxhdGUiLCJjb250ZW50IiwiYnV0dG9ucyIsImNyZWF0ZSIsInR5cGUiLCJsYWJlbCIsIm1vZGUiLCJ2YWxpZGF0ZSIsImNhbmNlbCIsImRhdGFOb3VuIiwic2l6ZUNvbnN0cmFpbnRzIiwibWluSGVpZ2h0IiwibWluV2lkdGgiLCJwcm90b3R5cGUiLCJjYWxsIiwicmVuZGVyRm9ybSIsImxwQ2hvb3NlciIsIm1heEhlaWdodCIsImZvciIsImV4bHVkZUdyb3VwIiwibGlzdGVuVG8iLCJTZWxlY3RlZEdyb3VwIiwiZGV0YWlscyIsImdyb3VwQ29kZSIsIndpdGhSZXNvdXJjZXMiLCJ3aXRoVGFncyIsInZhbGlkYXRlU2VsZWN0aW9uIiwiYXBwZW5kIiwicmVuZGVyIiwiZWwiLCJvblJlbmRlciIsIm9uQmxhbmtUZW1wbGF0ZUJ1dHRvbkNsaWNrIiwiU2VsZWN0ZWRUZW1wbGF0ZSIsInRvZ2dsZVRlbXBsYXRlQnV0dG9uIiwidG9nZ2xlQ29udGFpbmVyIiwib25FeGlzdGluZ1RlbXBsYXRlQnV0dG9uQ2xpY2siLCJvbkJvb2tUZW1wbGF0ZUJ1dHRvbkNsaWNrIiwib25DYWxlbmRhclRlbXBsYXRlQnV0dG9uQ2xpY2siLCJidXR0b24iLCJyZW1vdmVDbGFzcyIsImFkZENsYXNzIiwiY29udGFpbmVyIiwiaW52YWxpZCIsInZhbCIsInNldFVJQnVzeSIsInNldFVJUmVhZHkiLCJvbkNhbGVuZGFyVHlwZUNoYW5nZSIsImFzc2VtYmxlRGF0YSIsImRhdGEiLCJjYWxlbmRhclR5cGVWYWx1ZSIsInNvdXJjZUlEIiwicHJvcCIsImF0dHJpYnV0ZXMiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsSUFBSUQsUUFBUSxRQUFSLENBQVY7O0FBRUEsSUFBTUUsV0FBV0YsUUFBUSx1QkFBUixDQUFqQjtBQUNBLElBQU1HLFlBQVlILFFBQVEsa0NBQVIsQ0FBbEI7O0FBRUFJLE9BQU9DLE9BQVAsR0FBaUJILFNBQVNJLE1BQVQsQ0FBZ0I7QUFDaENDLEtBQUk7QUFDSEMsdUJBQXFCLG9CQURsQjtBQUVIQywwQkFBd0IsdUJBRnJCO0FBR0hDLHNCQUFvQixtQkFIakI7QUFJSEMsMEJBQXdCLHVCQUpyQjs7QUFNSEMsa0JBQWdCLHFCQU5iO0FBT0hDLHNCQUFvQiwwQkFQakI7QUFRSEMsd0JBQXNCLDRCQVJuQjtBQVNIQyxxQkFBbUIsd0JBVGhCOztBQVdIQyxnQkFBYztBQVhYLEVBRDRCOztBQWVoQ0MsU0FBUTtBQUNQLG1DQUFpQyw0QkFEMUI7QUFFUCxzQ0FBb0MsK0JBRjdCO0FBR1Asa0NBQWdDLDJCQUh6QjtBQUlQLHNDQUFvQywrQkFKN0I7O0FBTVAsNkJBQTJCO0FBTnBCLEVBZndCOztBQXdCaENDLGFBQVksb0JBQVNDLE9BQVQsRUFBa0I7QUFDN0JsQixJQUFFbUIsT0FBRixDQUFVLElBQVY7O0FBRUEsT0FBS0MsS0FBTCxHQUFhRixRQUFRRSxLQUFyQjs7QUFFQSxPQUFLQyxPQUFMLEdBQWU7QUFDZEMsWUFBUyxDQUFDLG1CQUFELENBREs7QUFFZEMsYUFBVXhCLFFBQVEsd0RBQVIsRUFBa0V5QixPQUY5RDtBQUdkQyxZQUFT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QUFGLEVBQXdDb0UsR0FBeEMsRUFBMUI7QUFDQSxNQUFNdkMsT0FBTzZDLG9CQUFvQkEsaUJBQXBCLEdBQXdDLElBQXJEO0FBQ0EsTUFBSUMsV0FBVyxJQUFmOztBQUVBLE1BQUksS0FBS2xCLGdCQUFMLEtBQTBCLFVBQTlCLEVBQ0NrQixXQUFXLEtBQUs3QixhQUFoQjs7QUFFRCxPQUFLRyxhQUFMLEdBQXFCakQsRUFBRSx1QkFBRixFQUEyQixLQUFLeUMsU0FBTCxDQUFlYSxFQUExQyxFQUE4Q3NCLElBQTlDLENBQW1ELFNBQW5ELENBQXJCO0FBQ0EsT0FBSzFCLFFBQUwsR0FBZ0JsRCxFQUFFLG9CQUFGLEVBQXdCLEtBQUt5QyxTQUFMLENBQWVhLEVBQXZDLEVBQTJDc0IsSUFBM0MsQ0FBZ0QsU0FBaEQsQ0FBaEI7O0FBRUFILE9BQUtJLFVBQUwsR0FBa0I7QUFDakJwRCxhQUFVLEtBQUtnQyxnQkFERTtBQUVqQmtCLGFBQVVBLFFBRk87QUFHakIxQixrQkFBZSxLQUFLQSxhQUhIO0FBSWpCQyxhQUFVLEtBQUtBLFFBSkU7QUFLakJyQixTQUFNQTtBQUxXLEdBQWxCOztBQVFBLFNBQU80QyxJQUFQO0FBQ0E7QUExTCtCLENBQWhCLENBQWpCIiwiZmlsZSI6ImxlYXJuaW5nUGF0aFRlbXBsYXRlTW9kYWwuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5cbmNvbnN0IEJpZ01vZGFsID0gcmVxdWlyZShcIi4uLy4uLy4uL2xpYi9iaWdNb2RhbFwiKTtcbmNvbnN0IExQQ2hvb3NlciA9IHJlcXVpcmUoXCIuLi8uLi8uLi9saWIvbGVhcm5pbmdQYXRoQ2hvb3NlclwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCaWdNb2RhbC5leHRlbmQoe1xuXHR1aToge1xuXHRcdGJsYW5rVGVtcGxhdGVCdXR0b246IFwiZGl2LnRlbXBsYXRlLWJsYW5rXCIsXG5cdFx0ZXhpc3RpbmdUZW1wbGF0ZUJ1dHRvbjogXCJkaXYudGVtcGxhdGUtZXhpc3RpbmdcIixcblx0XHRib29rVGVtcGxhdGVCdXR0b246IFwiZGl2LnRlbXBsYXRlLWJvb2tcIixcblx0XHRjYWxlbmRhclRlbXBsYXRlQnV0dG9uOiBcImRpdi50ZW1wbGF0ZS1jYWxlbmRhclwiLFxuXG5cdFx0YmxhbmtDb250YWluZXI6IFwiZGl2LmJsYW5rLWNvbnRhaW5lclwiLFxuXHRcdGxwQ2hvb3NlckNvbnRhaW5lcjogXCJkaXYubHAtY2hvb3Nlci1jb250YWluZXJcIixcblx0XHRib29rQ2hvb3NlckNvbnRhaW5lcjogXCJkaXYuYm9vay1jaG9vc2VyLWNvbnRhaW5lclwiLFxuXHRcdGNhbGVuZGFyQ29udGFpbmVyOiBcImRpdi5jYWxlbmRhci1jb250YWluZXJcIixcblxuXHRcdGNhbGVuZGFyVHlwZTogXCJpbnB1dFtuYW1lPSdjYWxlbmRhclR5cGUnXVwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmJsYW5rVGVtcGxhdGVCdXR0b25cIjogXCJvbkJsYW5rVGVtcGxhdGVCdXR0b25DbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmV4aXN0aW5nVGVtcGxhdGVCdXR0b25cIjogXCJvbkV4aXN0aW5nVGVtcGxhdGVCdXR0b25DbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmJvb2tUZW1wbGF0ZUJ1dHRvblwiOiBcIm9uQm9va1RlbXBsYXRlQnV0dG9uQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5jYWxlbmRhclRlbXBsYXRlQnV0dG9uXCI6IFwib25DYWxlbmRhclRlbXBsYXRlQnV0dG9uQ2xpY2tcIixcblxuXHRcdFwiY2hhbmdlIEB1aS5jYWxlbmRhclR5cGVcIjogXCJvbkNhbGVuZGFyVHlwZUNoYW5nZVwiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHRfLmJpbmRBbGwodGhpcyk7XG5cblx0XHR0aGlzLmdyb3VwID0gb3B0aW9ucy5ncm91cDtcblxuXHRcdHRoaXMuT3B0aW9ucyA9IHtcblx0XHRcdGNsYXNzZXM6IFtcImxwLXRlbXBsYXRlLW1vZGFsXCJdLFxuXHRcdFx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvY29uc29sZS9sZWFybmluZ1BhdGhUZW1wbGF0ZU1vZGFsLm51bmpcIikuY29udGVudCxcblx0XHRcdGJ1dHRvbnM6IHtcblx0XHRcdFx0Y3JlYXRlOiB7XG5cdFx0XHRcdFx0dHlwZTogXCJhY2NlcHRcIixcblx0XHRcdFx0XHRsYWJlbDogXCJDcmVhdGVcIixcblx0XHRcdFx0XHRtb2RlOiBcImNyZWF0ZVwiLFxuXHRcdFx0XHRcdHZhbGlkYXRlOiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRjYW5jZWw6IHtcblx0XHRcdFx0XHR0eXBlOiBcImNhbmNlbFwiLFxuXHRcdFx0XHRcdGxhYmVsOiBcIkNhbmNlbFwiLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHRcdGRhdGFOb3VuOiBcImxlYXJuaW5nIHBhdGhcIixcblx0XHRcdHNpemVDb25zdHJhaW50czoge1xuXHRcdFx0XHRtaW5IZWlnaHQ6IFwiNTB2aFwiLFxuXHRcdFx0XHRtaW5XaWR0aDogXCI1MHZ3XCIsXG5cdFx0XHR9LFxuXHRcdH07XG5cblx0XHR0aGlzLnVpID0gXy5leHRlbmQodGhpcy51aSwgQmlnTW9kYWwucHJvdG90eXBlLnVpKTtcblx0XHR0aGlzLmV2ZW50cyA9IF8uZXh0ZW5kKHRoaXMuZXZlbnRzLCBCaWdNb2RhbC5wcm90b3R5cGUuZXZlbnRzKTtcblxuXHRcdEJpZ01vZGFsLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyk7XG5cdH0sXG5cblx0cmVuZGVyRm9ybTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5scENob29zZXIgPSBuZXcgTFBDaG9vc2VyKHtcblx0XHRcdGxhYmVsOiBcIkNob29zZSBhIGdyb3VwIGZyb20gd2hpY2ggdG8gY2xvbmUgdGhlIGxlYXJuaW5nIHBhdGgsIGFuZCBjaG9vc2Ugd2hldGhlciBvciBub3QgeW91IGFsc28gd2FudCB0byBjbG9uZSB0aGUgY29udGVudC4gRXhpc3RpbmcgZGF0YSB3aWxsIGJlIHdpcGVkLlwiLFxuXHRcdFx0bWF4SGVpZ2h0OiBcIjM1MHB4XCIsXG5cdFx0XHRmb3I6IFwibGVhcm5pbmcgcGF0aFwiLFxuXHRcdFx0ZXhsdWRlR3JvdXA6IHRoaXMuZ3JvdXAsXG5cdFx0fSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHRoaXMubHBDaG9vc2VyLCBcInNlbGVjdGVkXCIsIGRldGFpbHMgPT4ge1xuXHRcdFx0dGhpcy5TZWxlY3RlZEdyb3VwID0gZGV0YWlscy5ncm91cENvZGU7XG5cdFx0XHR0aGlzLndpdGhSZXNvdXJjZXMgPSBkZXRhaWxzLndpdGhSZXNvdXJjZXM7XG5cdFx0XHR0aGlzLndpdGhUYWdzID0gZGV0YWlscy53aXRoVGFncztcblx0XHRcdHRoaXMudmFsaWRhdGVTZWxlY3Rpb24oKTtcblx0XHR9KTtcblxuXHRcdHRoaXMudWkubHBDaG9vc2VyQ29udGFpbmVyLmFwcGVuZCh0aGlzLmxwQ2hvb3Nlci5yZW5kZXIoKS5lbCk7XG5cdFx0dGhpcy5scENob29zZXIub25SZW5kZXIoKTtcblx0fSxcblxuXHRvbkJsYW5rVGVtcGxhdGVCdXR0b25DbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5TZWxlY3RlZFRlbXBsYXRlID0gXCJibGFua1wiO1xuXG5cdFx0dGhpcy50b2dnbGVUZW1wbGF0ZUJ1dHRvbih0aGlzLnVpLmJsYW5rVGVtcGxhdGVCdXR0b24pO1xuXHRcdHRoaXMudG9nZ2xlQ29udGFpbmVyKHRoaXMudWkuYmxhbmtDb250YWluZXIpO1xuXHR9LFxuXG5cdG9uRXhpc3RpbmdUZW1wbGF0ZUJ1dHRvbkNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLlNlbGVjdGVkVGVtcGxhdGUgPSBcImV4aXN0aW5nXCI7XG5cblx0XHR0aGlzLnRvZ2dsZVRlbXBsYXRlQnV0dG9uKHRoaXMudWkuZXhpc3RpbmdUZW1wbGF0ZUJ1dHRvbik7XG5cdFx0dGhpcy50b2dnbGVDb250YWluZXIodGhpcy51aS5scENob29zZXJDb250YWluZXIpO1xuXHR9LFxuXG5cdG9uQm9va1RlbXBsYXRlQnV0dG9uQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuU2VsZWN0ZWRUZW1wbGF0ZSA9IFwiYm9va1wiO1xuXG5cdFx0dGhpcy50b2dnbGVUZW1wbGF0ZUJ1dHRvbih0aGlzLnVpLmJvb2tUZW1wbGF0ZUJ1dHRvbik7XG5cdFx0dGhpcy50b2dnbGVDb250YWluZXIodGhpcy51aS5ib29rQ2hvb3NlckNvbnRhaW5lcik7XG5cdH0sXG5cblx0b25DYWxlbmRhclRlbXBsYXRlQnV0dG9uQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuU2VsZWN0ZWRUZW1wbGF0ZSA9IFwiY2FsZW5kYXJcIjtcblxuXHRcdHRoaXMudG9nZ2xlVGVtcGxhdGVCdXR0b24odGhpcy51aS5jYWxlbmRhclRlbXBsYXRlQnV0dG9uKTtcblx0XHR0aGlzLnRvZ2dsZUNvbnRhaW5lcih0aGlzLnVpLmNhbGVuZGFyQ29udGFpbmVyKTtcblx0fSxcblxuXHR0b2dnbGVUZW1wbGF0ZUJ1dHRvbjogZnVuY3Rpb24oYnV0dG9uKSB7XG5cdFx0Ly8gVG9nZ2xlIG9mZiBhbGwgYnV0dG9ucyBpbiB0aGUgdG9nZ2xlIGdyb3VwXG5cdFx0dGhpcy51aS5ibGFua1RlbXBsYXRlQnV0dG9uLnJlbW92ZUNsYXNzKFwiYWN0aXZlXCIpO1xuXHRcdHRoaXMudWkuZXhpc3RpbmdUZW1wbGF0ZUJ1dHRvbi5yZW1vdmVDbGFzcyhcImFjdGl2ZVwiKTtcblx0XHR0aGlzLnVpLmJvb2tUZW1wbGF0ZUJ1dHRvbi5yZW1vdmVDbGFzcyhcImFjdGl2ZVwiKTtcblx0XHR0aGlzLnVpLmNhbGVuZGFyVGVtcGxhdGVCdXR0b24ucmVtb3ZlQ2xhc3MoXCJhY3RpdmVcIik7XG5cblx0XHQvLyBUb2dnbGUgb24gdGhlIHNwZWNpZmllZCBidXR0b25cblx0XHRidXR0b24uYWRkQ2xhc3MoXCJhY3RpdmVcIik7XG5cdH0sXG5cblx0dG9nZ2xlQ29udGFpbmVyOiBmdW5jdGlvbihjb250YWluZXIpIHtcblx0XHQvLyBIaWRlIGFsbCBjb250YWluZXJzXG5cdFx0dGhpcy51aS5ibGFua0NvbnRhaW5lci5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5scENob29zZXJDb250YWluZXIuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkuYm9va0Nob29zZXJDb250YWluZXIuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkuY2FsZW5kYXJDb250YWluZXIuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0Ly8gU2hvdyB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lclxuXHRcdGNvbnRhaW5lci5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cblx0XHR0aGlzLnZhbGlkYXRlU2VsZWN0aW9uKCk7XG5cdH0sXG5cblx0dmFsaWRhdGVTZWxlY3Rpb246IGZ1bmN0aW9uKCkge1xuXHRcdGxldCBpbnZhbGlkO1xuXG5cdFx0c3dpdGNoICh0aGlzLlNlbGVjdGVkVGVtcGxhdGUpIHtcblx0XHRcdGNhc2UgXCJibGFua1wiOlxuXHRcdFx0XHRpbnZhbGlkID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwiZXhpc3RpbmdcIjpcblx0XHRcdFx0aWYgKHRoaXMuU2VsZWN0ZWRHcm91cClcblx0XHRcdFx0XHRpbnZhbGlkID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwiYm9va1wiOlxuXHRcdFx0XHRpbnZhbGlkID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwiY2FsZW5kYXJcIjpcblx0XHRcdFx0aW52YWxpZCA9ICEkKFwiaW5wdXRbbmFtZT0nY2FsZW5kYXJUeXBlJ106Y2hlY2tlZFwiKS52YWwoKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGludmFsaWQgPSB0cnVlO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHRpZiAoaW52YWxpZClcblx0XHRcdHRoaXMuc2V0VUlCdXN5KCk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5zZXRVSVJlYWR5KCk7XG5cdH0sXG5cblx0b25DYWxlbmRhclR5cGVDaGFuZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudmFsaWRhdGVTZWxlY3Rpb24oKTtcblx0fSxcblxuXHRhc3NlbWJsZURhdGE6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGRhdGEgPSB7fTtcblxuXHRcdGNvbnN0IGNhbGVuZGFyVHlwZVZhbHVlID0gJChcImlucHV0W25hbWU9J2NhbGVuZGFyVHlwZSddOmNoZWNrZWRcIikudmFsKCk7XG5cdFx0Y29uc3QgdHlwZSA9IGNhbGVuZGFyVHlwZVZhbHVlID8gY2FsZW5kYXJUeXBlVmFsdWUgOiBudWxsO1xuXHRcdGxldCBzb3VyY2VJRCA9IG51bGw7XG5cblx0XHRpZiAodGhpcy5TZWxlY3RlZFRlbXBsYXRlID09PSBcImV4aXN0aW5nXCIpXG5cdFx0XHRzb3VyY2VJRCA9IHRoaXMuU2VsZWN0ZWRHcm91cDtcblxuXHRcdHRoaXMud2l0aFJlc291cmNlcyA9ICQoXCJpbnB1dFtuYW1lPSdjb250ZW50J11cIiwgdGhpcy5scENob29zZXIuZWwpLnByb3AoXCJjaGVja2VkXCIpO1xuXHRcdHRoaXMud2l0aFRhZ3MgPSAkKFwiaW5wdXRbbmFtZT0ndGFncyddXCIsIHRoaXMubHBDaG9vc2VyLmVsKS5wcm9wKFwiY2hlY2tlZFwiKTtcblxuXHRcdGRhdGEuYXR0cmlidXRlcyA9IHtcblx0XHRcdHRlbXBsYXRlOiB0aGlzLlNlbGVjdGVkVGVtcGxhdGUsXG5cdFx0XHRzb3VyY2VJRDogc291cmNlSUQsXG5cdFx0XHR3aXRoUmVzb3VyY2VzOiB0aGlzLndpdGhSZXNvdXJjZXMsXG5cdFx0XHR3aXRoVGFnczogdGhpcy53aXRoVGFncyxcblx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0fTtcblxuXHRcdHJldHVybiBkYXRhO1xuXHR9LFxufSk7Il19",
    "\"use strict\";\n\nvar _regenerator = require(\"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _childViewEvents, _lpRadioEvents, _lpRadioEvents2, _lpRadioEvents3, _childViewEvents2, _lpRadioEvents4, _childViewEvents3, _childViewEvents4, _childViewEvents5, _lpRadioEvents6, _radioEvents, _eventBusEvents;\n\nvar _tippy = require(\"tippy.js\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar Backbone = require(\"backbone\");\nvar _ = require(\"lodash\");\nvar $ = require(\"jquery\");\nvar moment = require(\"moment\");\nvar tippy = require(\"tippy.js\").default;\n\nvar flatpickr = require(\"flatpickr\");\nvar Promise = require(\"bluebird\");\nvar rester = require(\"rester\");\n\n// eslint-disable-next-line node/no-extraneous-require\nvar Slideout = require(\"slideout\");\nvar eventBus = require(\"./eventBus\");\n\nvar App = require(\"../../../index\");\nvar Selectra = require(\"../../../lib/selectra\");\n\nvar LpTemplateModal = require(\"./learningPathTemplateModal\");\nvar LpNavigationSidebar = require(\"./lpNavigation\");\nvar ImportTocModal = require(\"./importTocModal\");\nvar BookChooserModal = require(\"./bookChooserModal\");\nvar AssessmentPrompt = require(\"../../../lib/assessmentPrompt\");\nvar settings = require(\"app-settings\");\nvar globalRadio = Backbone.Radio.channel(\"global\");\nvar lpRadio = Backbone.Radio.channel(\"lp\");\nvar SmallModal = require(\"../../../lib/smallModal\");\nvar LightBox = require(\"../../../lib/lightBox\");\nvar AssessmentModal = require(\"../../../lib/assessmentModal\");\nvar Assessment = require(\"../../../lib/assessmentModel\");\nvar GroupModal = require(\"./groupModal\");\nvar ResourceOpenedModal = require(\"./resourceOpenedModal\");\nvar FlashCardWidget = require(\"../../../content/views/flashCards/cardWidget\");\nvar CamBtn = require(\"../camBtn\");\nvar BulkDragDropHelper = require(\"../../../lib/bulkDragDropHelper\");\nvar BulkResourceUploadModal = require(\"../../../lib/bulkResourceUploadModal\");\nvar FlashcardPreview = require(\"../../../lib/flashcardPreview\");\n\nvar Events = {\n\tBodyClick: \"Events.BodyClick\",\n\tNodeSelected: \"Events.NodeSelected\",\n\tEnableEditing: \"Events.EnableEditing\",\n\tDisableEditing: \"Events.DisableEditing\",\n\tEditingChange: \"Events.EditingChange\",\n\tConnectionLost: \"Events.ConnectionLost\",\n\tConnected: \"Events.Connected\",\n\tNodeChange: \"Events.NodeChange\",\n\tCollapse: \"Events.Collapse\",\n\n\tEditingStarted: \"Events.EditingStarted\",\n\tEditingEnded: \"Events.EditingEnded\",\n\n\tAddResource: \"Events.AddResource\",\n\tMoveResoure: \"Events.MoveResource\",\n\n\tReloadNode: \"Events.ReloadNode\",\n\tAddSiblingNode: \"Events.AddSiblingNode\",\n\tRemoveNodeFromParent: \"Events.RemoveNodeFromParent\",\n\tPromoteSiblingNode: \"Events.PromoteSiblingNode\",\n\tRemoveContentFromParent: \"Events.RemoveContentFromParent\",\n\tAddContentNode: \"Events.AddContentNode\",\n\tCheckAttachmentContainers: \"Events.CheckAttachmentContainers\",\n\n\tStartNodeEdit: \"Events.StartNodeEdit\",\n\tCancelNodeEdit: \"Events.CancelNodeEdit\",\n\tCompleteNodeEdit: \"Events.CompleteNodeEdit\",\n\n\tNodeDragStart: \"Events.NodeDragStart\",\n\tNodeDragListen: \"Events.NodeDragListen\",\n\tNodeDragOver: \"Events.NodeDragOver\",\n\tNodeDragEnd: \"Events.NodeDragEnd\",\n\tNodeDragMove: \"Events.NodeDragMove\",\n\tNodeDropAbove: \"Events.NodeDropAbove\",\n\tNodeSelectListen: \"Events.NodeSelectListen\",\n\tNodeSelectOver: \"Events.NodeSelectOver\",\n\tNodeSelectEnd: \"Events.NodeSelectEnd\",\n\tSiblingDrop: \"Events.SiblingDrop\",\n\tChildDrop: \"Events.ChildDrop\",\n\tViewUserChange: \"Events.ViewUserChange\",\n\n\tResourceDragStart: \"Events.ResourceDragStart\",\n\tResourceDragListen: \"Events.ResourceDragListen\",\n\tResourceDragOver: \"Events.ResourceDragOver\",\n\tResourceDragEnd: \"Events.ResourceDragEnd\",\n\tFocusAttachment: \"Events.FocusAttachment\",\n\tResourceDragMove: \"Events.ResourceDragMove\",\n\n\tMultiselectStart: \"Events.MultiselectStart\",\n\n\tGetPrimaryGroup: \"Events.GetPrimaryGroup\",\n\n\tRemoveLPItems: \"Events.RemoveLPItems\"\n};\n\nvar localMethods = {};\n\n// eslint-disable-next-line prefer-const\nvar TreeView = void 0,\n    ResourcesView = void 0,\n    TreeEdit = void 0,\n    TreeContent = void 0,\n    ResourceEdit = void 0,\n    draggingResource = void 0,\n    currentEditModelId = void 0,\n    bookPages = void 0;\nvar viewingUser = void 0,\n    requestedAccess = void 0,\n    pageUnloading = false,\n    multiselect = false,\n    msState = 0,\n    itemDragHit = false;\n// Some constants\nvar childDropCrossover = 0.3,\n    maxDescLength = 250,\n    dateFormat = \"DD MMM YYYY HH:mm a\",\n    requestAccessTimeout = 90;\nvar multiselectItems = [];\n\nvar editStates = {\n\t// Are we allowed to edit? Toggled by loss of connection etc.\n\teditingAllowed: false,\n\t// What view are we in? false = editmode, true = view mode.\n\tviewMode: false\n};\n\nvar modelMap = {},\n    taskMap = {},\n    groupMap = {};\n\nvar canEdit = function canEdit() {\n\treturn editStates.editingAllowed && !editStates.viewMode && !currentEditModelId && !multiselect;\n};\n\nvar _getContrast = function _getContrast(colour) {\n\t// Calculate the perceptive luminance (aka luma) - human eye favors green color...\n\tvar luma = (0.299 * parseInt(colour.slice(0, 2), 16) + 0.587 * parseInt(colour.slice(2, 4), 16) + 0.114 * parseInt(colour.slice(4), 16)) / 255;\n\n\t// Return black for bright colors, white for dark colors\n\treturn luma > 0.5 ? \"000\" : \"FFF\";\n};\n\nvar NodeModel = Backbone.Model.extend({\n\tdefaults: {\n\t\tvisible: true,\n\t\tlocked: false,\n\t\tisTask: false,\n\t\ttags: [],\n\t\tdescription: \"\",\n\t\tactivationDate: null,\n\t\tdueDate: null,\n\t\tmbe_score: 1\n\t},\n\n\tidAttribute: \"_id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/acacia/learningPaths/items\";\n\t},\n\n\tvalidate: function validate(attrs) {\n\t\tvar ret = {};\n\t\tif (!attrs.title) ret.title = \"You must provide a title\";\n\n\t\t// If locking isn't set, the date might kick in\n\t\tif (!attrs.locked && attrs.activationDate && attrs.activationDate < moment().unix()) ret.activationDate = \"You cannot set an unlock date that is before the current date\";\n\n\t\t// If locking isn't set, the date might kick in\n\t\tif (!attrs.locked && attrs.activationDate && attrs.activationDate <= 86400) ret.activationDate = \"You must choose a date for this item to unlock on\";\n\n\t\tif (attrs.pageRange && attrs.pageRange.length > 1 && attrs.pageRange[0] > attrs.pageRange[1]) ret.pageEnd = \"The end page must be greater or equal to the start page\";\n\n\t\tif (Object.keys(ret).length > 0) return ret;\n\t},\n\n\thasLockDate: function hasLockDate() {\n\t\treturn this.get(\"locked\") || Boolean(this.get(\"activationDate\")) || this._children.some(function (x) {\n\t\t\treturn x.hasLockDate();\n\t\t}) || this._tasks.some(function (x) {\n\t\t\treturn x.hasLockDate();\n\t\t}) || this._resources.some(function (x) {\n\t\t\treturn x.hasLockDate();\n\t\t});\n\t},\n\n\thasVisibility: function hasVisibility() {\n\t\treturn this.get(\"visible\") || this._children.some(function (x) {\n\t\t\treturn x.hasVisibility();\n\t\t}) || this._tasks.some(function (x) {\n\t\t\treturn x.hasVisibility();\n\t\t}) || this._resources.some(function (x) {\n\t\t\treturn x.hasVisibility();\n\t\t});\n\t}\n});\n\nvar ChildrenCollection = Backbone.Collection.extend({\n\tmodel: NodeModel,\n\n\tcomparator: \"path\"\n});\n\nvar ResourceModel = Backbone.Model.extend({\n\tdefaults: {\n\t\tvisible: true,\n\t\tlocked: false,\n\t\tisTask: false,\n\t\ttags: [],\n\t\tactivationDate: null,\n\t\tdueDate: null,\n\t\tmbe_score: 1\n\t},\n\n\tidAttribute: \"_id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/acacia/learningPaths/resources\";\n\t},\n\n\tvalidate: function validate(attrs) {\n\t\tvar ret = {};\n\n\t\tif (!attrs.locked && attrs.activationDate && attrs.dueDate && attrs.activationDate > attrs.dueDate) ret.dueDate = \"Due Dates must be after or equal to Unlock Date\";\n\n\t\tif (!attrs.locked && attrs.activationDate && attrs.activationDate < moment().unix()) ret.activationDate = \"You cannot set an unlock date that is before the current date\";\n\n\t\t// If locking isn't set, the date might kick in\n\t\tif (!attrs.locked && attrs.activationDate && attrs.activationDate <= 86400) ret.activationDate = \"You must choose a date for this item to unlock on\";\n\n\t\tif (attrs.dueDate && attrs.dueDate < moment().unix()) ret.dueDate = \"You cannot set due date that is before the current date\";\n\n\t\tif (Object.keys(ret).length > 0) return ret;\n\t},\n\n\thasLockDate: function hasLockDate() {\n\t\treturn this.get(\"locked\") || Boolean(this.get(\"activationDate\"));\n\t},\n\n\thasVisibility: function hasVisibility() {\n\t\treturn this.get(\"visible\");\n\t}\n});\n\nvar AttachmentModel = Backbone.Model.extend({\n\tdefaults: {},\n\tidAttribute: \"_id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/attachments\";\n\t}\n});\n\nvar TagModal = Backbone.Marionette.View.extend({\n\tclassName: \"tag-creation\",\n\ttemplate: require(\"../../templates/console/learningPathNode.nunj\").tagCreation,\n\n\tui: {\n\t\tcolourBlock: \".colours div\",\n\t\tselectedColour: \".colours div.selected\",\n\t\tsave: \"button[name='save']\",\n\t\tcancel: \"button[name='cancel']\",\n\t\tcloser: \"div.close\",\n\t\terrors: \"div.errors\",\n\n\t\tlabel: \"input[type='text']\",\n\t\tcustomColour: \"input[name='customColour']\"\n\t},\n\n\tevents: {\n\t\tclick: \"onClick\",\n\t\tmouseup: \"onClick\",\n\t\t\"click @ui.colourBlock\": \"chooseColour\",\n\t\t\"change @ui.customColour\": \"changeCustomColour\",\n\t\t\"keyup @ui.label\": \"clearError\",\n\n\t\t\"click @ui.save\": \"save\",\n\t\t\"click @ui.cancel\": \"cancel\",\n\t\t\"click @ui.closer\": \"cancel\"\n\t},\n\n\tcolours: [\"92de69\", \"469c92\", \"fc5439\", \"50788e\", \"853a4c\", \"97b3c5\", \"d2362d\", \"2e5c5b\", \"eab22e\", \"452959\", \"0033cc\", \"418bca\", \"007437\", \"a8d695\", \"69d100\", \"34495e\", \"a195d5\", \"7e8c8d\", \"ff946a\", \"5843ac\", \"ac4362\", \"fe7f0e\", \"d9544f\", \"d1d100\", \"ad8d44\", \"78f4f4\", \"dacb25\", \"ff4057\", \"fff200\", \"ead3e3\", \"000000\", \"00008b\"],\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tcolours: this.colours\n\t\t};\n\t},\n\n\tinitialize: function initialize() {\n\t\tvar _this = this;\n\n\t\tthis.prom = new Promise(function (resolve, reject) {\n\t\t\t_this.resolve = resolve;\n\t\t\t_this.reject = function (e) {\n\t\t\t\t_this.destroy();\n\t\t\t\treject(e);\n\t\t\t};\n\t\t});\n\n\t\tthis.model = new Backbone.Model();\n\t},\n\n\tonClick: function onClick(evt) {\n\t\tevt.stopPropagation();\n\t},\n\n\tshow: function show(view) {\n\t\tvar _this2 = this;\n\n\t\t//  Position to the right of this element\n\t\tvar elOffset = view.$el.offset();\n\t\t//const clickOffset = clicker.offset();\n\n\t\t$(\".modal-host\").append(this.render().el);\n\n\t\tthis.$el.css({ left: elOffset.left, width: view.$el.width() });\n\n\t\tif (view.model.get(\"drawPosition\") === \"reverse\") {\n\t\t\tvar h = this.$el.outerHeight(true);\n\t\t\tvar elh = view.$el.outerHeight(true);\n\n\t\t\tif (elh > h) this.$el.css({ top: elOffset.top });else this.$el.css({ top: elOffset.top - (h - elh) });\n\t\t} else {\n\t\t\tthis.$el.css({ top: elOffset.top });\n\t\t}\n\n\t\t$(document).on(\"mouseup\", function () {\n\t\t\t_this2.destroy();\n\t\t\t_this2.resolve();\n\t\t});\n\n\t\treturn this.prom;\n\t},\n\n\tchooseColour: function chooseColour(evt) {\n\t\tevt.stopPropagation();\n\n\t\tthis.model.set({ colour: $(evt.currentTarget).data(\"colour\") });\n\n\t\t$(\"div.selected\", this.el).removeClass(\"selected\").css({\n\t\t\t\"border-color\": \"#FFF\",\n\t\t\t\"box-shadow\": \"0 0 0\"\n\t\t});\n\n\t\t$(evt.currentTarget).addClass(\"selected\").css({\n\t\t\t\"border-color\": \"#\" + this.model.get(\"colour\"),\n\t\t\t\"box-shadow\": \"0 0 8px #\" + this.model.get(\"colour\")\n\t\t});\n\n\t\tthis.ui.customColour.val(\"#\" + this.model.get(\"colour\")).css({\n\t\t\t\"box-shadow\": \"0 0 0\"\n\t\t}).removeClass(\"selected\");\n\n\t\tthis.clearError();\n\t},\n\n\tchangeCustomColour: function changeCustomColour(evt) {\n\t\tevt.stopPropagation();\n\n\t\tthis.model.set({ colour: evt.currentTarget.value.slice(1) });\n\n\t\t$(\"div.selected\", this.el).removeClass(\"selected\").css({\n\t\t\t\"border-color\": \"#FFF\",\n\t\t\t\"box-shadow\": \"0 0 0\"\n\t\t});\n\n\t\tthis.ui.customColour.addClass(\"selected\").css({\n\t\t\t\"box-shadow\": \"0 0 8px #\" + this.model.get(\"colour\")\n\t\t});\n\t},\n\n\tsave: function save(evt) {\n\t\tevt.stopPropagation();\n\n\t\tif (!_.trim(this.ui.label.val())) return this.ui.errors.html(\"<span class=\\\"error\\\">You must enter a label</span>\");\n\n\t\tif (!this.model.get(\"colour\")) return this.ui.errors.html(\"<span class=\\\"error\\\">You must choose a colour</span>\");\n\n\t\tthis.resolve({ label: _.trim(this.ui.label.val()), colour: this.model.get(\"colour\") });\n\n\t\tthis.destroy();\n\t},\n\n\tcancel: function cancel(evt) {\n\t\tevt.stopPropagation();\n\n\t\tthis.resolve();\n\t\tthis.destroy();\n\t},\n\n\tclearError: function clearError() {\n\t\tthis.ui.errors.find(\".error\").remove();\n\t}\n});\n\nvar ResourceCollection = Backbone.Collection.extend({\n\tinitialize: function initialize(col, options) {\n\t\tthis.tasks = options.tasks;\n\t},\n\n\tmodel: ResourceModel,\n\n\tcomparator: \"path\"\n});\n\nvar Tags = Backbone.Marionette.Behavior.extend({\n\tui: {\n\t\ttags: \".tags\",\n\t\ttag: \".tag\",\n\t\ttagBtn: \".tag-btn\",\n\t\ttagRemover: \".tag .remover\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.tag\": \"onTagClick\",\n\t\t\"click @ui.tagRemover\": \"onTagRemove\",\n\t\t\"click @ui.tagBtn\": \"onTagBtnClick\"\n\t},\n\n\tmodelEvents: {\n\t\t\"change:tagList\": \"onTagsChange\"\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this3 = this;\n\n\t\tif (this.ui.options) {\n\t\t\tthis.ui.options.on(\"toolbarItemClick.tags\", function (evt, item) {\n\t\t\t\tvar data = $(item).data(\"item\");\n\n\t\t\t\tswitch (data) {\n\t\t\t\t\tcase \"tags\":\n\t\t\t\t\t\treturn _this3.onTagBtnClick(evt);\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tif (this.ui.options) this.ui.options.off(\"toolbarItemClick.tags\");\n\t},\n\n\tonTagClick: function onTagClick(evt) {\n\t\tevt.stopPropagation();\n\t},\n\n\tonTagBtnClick: function onTagBtnClick(evt) {\n\t\tvar _this4 = this;\n\n\t\tevt.stopPropagation();\n\n\t\tvar url = this.view.model.isNew() ? settings.urlRoot + \"/acacia/learningPaths/\" + this.view.model.get(\"learning_path\") + \"/tags\" : settings.urlRoot + \"/acacia/learningPaths/items/\" + this.view.model.id + \"/tags\";\n\n\t\tvar tagging = new Selectra({\n\t\t\tsearch: false,\n\t\t\tmultiple: true,\n\t\t\tsort: true,\n\t\t\tvirtualBase: true,\n\t\t\tautoOpenDropdown: true,\n\t\t\ticons: true,\n\t\t\tcheckboxes: true,\n\t\t\tddWidth: 250,\n\t\t\tddHost: \"#link-resources\",\n\t\t\tserver: {\n\t\t\t\tkey: \"tag_id\",\n\t\t\t\tvalue: \"label\",\n\t\t\t\tfetch: url,\n\t\t\t\tdefault: {\n\t\t\t\t\titems: this.view.model.get(\"tagList\") || []\n\t\t\t\t}\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t},\n\t\t\tallowCreation: {\n\t\t\t\tmode: \"always\",\n\t\t\t\ttext: \"Create new tag\",\n\t\t\t\tcallback: this.createNewTag,\n\t\t\t\tserver: {\n\t\t\t\t\tsaveFirst: true,\n\t\t\t\t\tsave: url\n\t\t\t\t},\n\t\t\t\thideOnClick: true\n\t\t\t},\n\t\t\tinteractives: {\n\t\t\t\tmanage: {\n\t\t\t\t\ttext: \"Manage tags\",\n\t\t\t\t\tcallback: this.manageTags\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\ttagging.show({ el: evt.currentTarget });\n\n\t\tthis.listenTo(tagging, Selectra.Events.ValueChanged, function (selection) {\n\t\t\tvar changes = { tagList: _.map(selection, function (x) {\n\t\t\t\t\treturn x.toJSON();\n\t\t\t\t}), tags: _.map(selection, function (x) {\n\t\t\t\t\treturn x.get(\"tag_id\");\n\t\t\t\t}) };\n\n\t\t\tif (_this4.view.model.isNew()) return _this4.view.model.set(changes);\n\n\t\t\tif (_this4.view.model.get(\"locked\") || !_this4.view.model.get(\"locked\") && _this4.view.model.get(\"activationDate\") && _this4.view.model.get(\"activationDate\") < moment().unix()) changes.activationDate = null;\n\n\t\t\t_this4.view.model.save(changes, {\n\t\t\t\tpatch: true,\n\t\t\t\twait: true\n\t\t\t});\n\t\t});\n\n\t\tthis.listenTo(this, \"before:destroy\", function () {\n\t\t\ttagging.close();\n\t\t});\n\t},\n\n\tcreateNewTag: function createNewTag(el, clicker) {\n\t\tthis.tagModal = new TagModal();\n\n\t\treturn this.tagModal.show(el, clicker);\n\t},\n\n\tmanageTags: function manageTags() {\n\t\tglobalRadio.trigger(App.Events.Commands.Navigate, settings.urlRoot + \"/console/tags/\" + lpRadio.request(Events.GetPrimaryGroup));\n\t},\n\n\tgetContrast: _getContrast,\n\n\tonTagRemove: function onTagRemove(evt) {\n\t\tif (!canEdit()) return;\n\n\t\tevt.stopPropagation();\n\n\t\tvar tag = $(evt.currentTarget).data(\"id\");\n\n\t\tvar change = {\n\t\t\ttags: _.reject(this.view.model.get(\"tags\"), function (x) {\n\t\t\t\treturn x === tag;\n\t\t\t}),\n\t\t\ttagList: _.reject(this.view.model.get(\"tagList\"), function (x) {\n\t\t\t\treturn x.tag_id === tag;\n\t\t\t})\n\t\t};\n\n\t\tif (this.view.model.isNew()) return this.view.model.set(change);\n\n\t\tif (this.view.model.get(\"locked\") || !this.view.model.get(\"locked\") && this.view.model.get(\"activationDate\") && this.view.model.get(\"activationDate\") < moment().unix()) change.activationDate = null;\n\n\t\tthis.view.model.save(change, {\n\t\t\tpatch: true,\n\t\t\twait: true\n\t\t});\n\t},\n\n\tonTagsChange: function onTagsChange() {\n\t\tvar _this5 = this;\n\n\t\tvar tags = this.view.model.get(\"tagList\") || [];\n\n\t\tvar markups = _.map(tags, function (x) {\n\t\t\treturn \"<div class=\\\"tag\\\" style=\\\"background-color:#\" + x.colour + \"; color: #\" + _this5.getContrast(x.colour) + \"\\\">\" + x.label.replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\") + \"\\n\\t\\t\\t<div class=\\\"fal fa-times remover\\\" data-id=\\\"\" + x.tag_id + \"\\\"/></div>\";\n\t\t});\n\n\t\tthis.ui.tags.html(markups.join(\"\"));\n\n\t\tif (!this.ui.tags) return;\n\n\t\tif (tags.length) this.ui.tags.removeClass(\"hide\");else this.ui.tags.addClass(\"hide\");\n\t}\n});\n\n// ** Tree views **\n\nvar DraggingElement = Backbone.Marionette.View.extend({\n\tclassName: \"lp-dragging-element\",\n\ttemplate: require(\"../../templates/console/learningPathNode.nunj\").draggingElement\n});\n\nvar TreeNode = Backbone.Marionette.View.extend({\n\ttagName: \"li\",\n\ttemplate: require(\"../../templates/console/learningPathNode.nunj\").learningPathNode,\n\n\tclassName: function className() {\n\t\tvar classes = [];\n\n\t\tif (this.model.get(\"lastNode\")) classes.push(\"last-node\");\n\n\t\treturn classes.join(\" \");\n\t},\n\n\tregions: {\n\t\tedit: \".edit-node-form\",\n\t\tcontent: \".node-content\",\n\t\tchildren: \".child-nodes-container\",\n\t\tresources: {\n\t\t\tel: \".resource-placeholder\",\n\t\t\treplaceElement: true\n\t\t},\n\t\ttasks: {\n\t\t\tel: \".task-placeholder\",\n\t\t\treplaceElement: true\n\t\t}\n\t},\n\n\tui: {\n\t\ticons: \".fal:not(.fa-trash-alt)\",\n\n\t\tnode: \".lp-node:first\",\n\n\t\teditArea: \".edit-node-form\",\n\t\tcontentArea: \".node-content\",\n\t\tdroppable: \".droppable\",\n\t\tdropIndicator: \".droppable .indicator\",\n\n\t\tdot: \"svg\",\n\t\tcompletionTick: \"div.complete-tick\",\n\t\tsvgGradient: \"linearGradient\",\n\t\tconnector: \".connection-line\",\n\t\tlockedIcon: \".locked-icon\",\n\t\tlockedLine: \".lock-line\",\n\t\tsideLine: \".side-line\",\n\t\tcheckboxContainer: \".checkbox\",\n\t\tcheckbox: \".checkbox input\",\n\n\t\tnodeAttachments: \".node-attachments\",\n\t\ttasksContainer: \".task-host\",\n\t\ttasksTitle: \".task-host .title\",\n\t\tresourcesContainer: \".resource-host\",\n\t\tresourcesTitle: \".resource-host .title\",\n\t\tchildNodesContainer: \".child-nodes-container\",\n\t\taddChildNodeBtn: \".add-child-node\",\n\t\tdropOverlay: \".drop-overlay\",\n\t\ttaskOverlay: \".task-host .drop-overlay\",\n\t\tresourceOverlay: \".resource-host .drop-overlay\",\n\n\t\tfakeTask: \".task-host .fake-content-item\",\n\t\tfakeResource: \".resource-host .fake-content-item\",\n\t\toverlay: \".overlay\",\n\t\toverlaySaving: \".overlay .saving\",\n\t\toverlayNodrop: \".overlay .nodrop\",\n\t\terrors: \".errors\"\n\t},\n\n\tevents: {\n\t\tclick: \"onNodeClick\",\n\t\t\"click @ui.addChildNodeBtn\": \"onAddChildNodeBtn\",\n\t\t\"mousedown div.title[draggable='true']:first\": \"startNodeDrag\",\n\t\t\"mousedown @ui.node\": \"startMultiselect\",\n\t\t\"dropnode @ui.node\": \"nodeDropped\",\n\t\t\"dragstart @ui.node\": \"onNodeDragStart\",\n\t\t\"dropresource @ui.tasksContainer\": \"onTaskDragDrop\",\n\t\t\"dropresource @ui.resourcesContainer\": \"onResourceDragDrop\",\n\t\t\"checkAttachments @ui.node\": \"checkAttachmentContainers\",\n\t\t\"click @ui.dot\": \"onDotClick\",\n\t\t\"click @ui.checkbox\": \"onCheckboxClick\",\n\n\t\tdragenter: \"onNodeDragEnter\",\n\t\tdragleave: \"onNodeDragLeave\",\n\n\t\t\"dragenter @ui.tasksContainer\": \"onTaskDragEnter\",\n\t\t\"dragleave @ui.tasksContainer\": \"onTaskDragLeave\",\n\t\t\"dragenter @ui.resourcesContainer\": \"onResourceDragEnter\",\n\t\t\"dragleave @ui.resourcesContainer\": \"onResourceDragLeave\",\n\n\t\t\"dragover @ui.dropOverlay\": \"onFileDragOver\",\n\t\t\"drop @ui.dropOverlay\": \"onFileDrop\",\n\t\t\"click @ui.cancelBtn\": \"onCancelBtnClick\"\n\t},\n\n\tchildViewEvents: (_childViewEvents = {}, _defineProperty(_childViewEvents, Events.ReloadNode, \"reloadNode\"), _defineProperty(_childViewEvents, Events.StartNodeEdit, \"startNodeEdit\"), _defineProperty(_childViewEvents, Events.CancelNodeEdit, \"cancelNodeEdit\"), _defineProperty(_childViewEvents, Events.CompleteNodeEdit, \"completeNodeEdit\"), _defineProperty(_childViewEvents, Events.Collapse, \"collapseNode\"), _defineProperty(_childViewEvents, Events.AddResource, \"addResource\"), _defineProperty(_childViewEvents, Events.MoveResource, \"moveResource\"), _defineProperty(_childViewEvents, Events.AddSiblingNode, \"addSiblingNode\"), _defineProperty(_childViewEvents, Events.RemoveNodeFromParent, \"removeChildNode\"), _defineProperty(_childViewEvents, Events.PromoteSiblingNode, \"promoteSiblingNode\"), _defineProperty(_childViewEvents, Events.RemoveContentFromParent, \"removeChildContent\"), _defineProperty(_childViewEvents, Events.CheckAttachmentContainers, \"checkAttachmentContainers\"), _defineProperty(_childViewEvents, Events.NodeDropAbove, \"nodeDroppedAbove\"), _childViewEvents),\n\n\tmodelEvents: {\n\t\t\"change:selected\": \"onSelectedStatusChange\",\n\t\t\"change:editMode\": \"onEditModeChange\",\n\t\t\"change:showDropIndicator\": \"onShowDropIndicatorChange\",\n\t\t\"change:dropChild\": \"onDropChildChange\",\n\t\t\"change:dropPosition\": \"onDropPositionChange\",\n\t\trequest: \"onSaveBegin\",\n\t\tsync: \"onSaveEnd\",\n\t\terror: \"onSaveError\",\n\t\t\"change:depth\": \"onDepthChange\",\n\t\t\"change:locked\": \"onLockedChange\",\n\t\t\"change:activationDate\": \"onLockedChange\",\n\t\t\"change:parentLocked\": \"onParentLockChange\",\n\t\t\"change:parentActivation\": \"onParentLockChange\",\n\t\t\"change:parentVisible\": \"onParentVisibleChange\",\n\t\t\"change:visible\": \"onVisibleChange\",\n\t\t\"change:lastNode\": \"onLastNodeChange\",\n\t\t\"change:children\": \"onChildrenChange\",\n\t\t\"change:progress\": \"onProgressChange\",\n\t\t\"change:multiselecting\": \"onMultiSelectingChange\"\n\t},\n\n\tlpRadioEvents: (_lpRadioEvents = {}, _defineProperty(_lpRadioEvents, Events.BodyClick, \"bodyClickEvent\"), _defineProperty(_lpRadioEvents, Events.NodeSelected, \"nodeSelectedEvent\"), _defineProperty(_lpRadioEvents, Events.EditingChange, \"onEditingChange\"), _defineProperty(_lpRadioEvents, Events.EditingStarted, \"editingStart\"), _defineProperty(_lpRadioEvents, Events.EditingEnded, \"editingEnd\"), _defineProperty(_lpRadioEvents, Events.NodeDragListen, \"nodeDragListen\"), _defineProperty(_lpRadioEvents, Events.NodeSelectListen, \"nodeSelectListen\"), _defineProperty(_lpRadioEvents, Events.NodeSelectEnd, \"nodeSelectEnd\"), _defineProperty(_lpRadioEvents, Events.NodeDragEnd, \"nodeDragEnded\"), _defineProperty(_lpRadioEvents, Events.ResourceDragListen, \"resourceDragListen\"), _defineProperty(_lpRadioEvents, Events.ResourceDragEnd, \"resourceDragEnd\"), _defineProperty(_lpRadioEvents, Events.RemoveLPItems, \"onRemoveLPItems\"), _lpRadioEvents),\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this6 = this;\n\n\t\treturn {\n\t\t\tisLocked: function isLocked() {\n\t\t\t\treturn _this6.model.get(\"locked\") || !_this6.model.get(\"locked\") && _this6.model.get(\"activationDate\") && _this6.model.get(\"activationDate\") > moment().unix();\n\t\t\t},\n\t\t\tisParentLocked: function isParentLocked() {\n\t\t\t\treturn _this6.model.get(\"parentLocked\") || !_this6.model.get(\"parentLocked\") && _this6.model.get(\"parentActivation\") && _this6.model.get(\"parentActivation\") > moment().unix();\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.bindEvents(lpRadio, this.lpRadioEvents);\n\n\t\tthis.model.set({\n\t\t\tparentLocked: options.parentLocked || false,\n\t\t\tparentActivation: options.parentActivation || null,\n\t\t\tparentVisible: options.parentVisible !== false\n\t\t});\n\n\t\tif (this.model.get(\"depth\") === 1) {\n\t\t\tthis.listenTo(eventBus, eventBus.Events.AttachmentAdded, this.onAttachmentAdded.bind(this));\n\t\t\tthis.listenTo(eventBus, eventBus.Events.AttachmentRemoved, this.onAttachmentRemoved.bind(this));\n\t\t}\n\n\t\tthis.dragCount = { task: 0, resource: 0, node: 0 };\n\t\tthis.xhr = {};\n\t\tthis.saveQueue = [];\n\t},\n\n\tonNodeDragEnter: function onNodeDragEnter(event) {\n\t\tif (!canEdit()) return;\n\n\t\tif (_.split(this.model.get(\"path\"), \".\").length > 1) event.stopPropagation();\n\n\t\tthis.dragCount.node++;\n\n\t\tif (!this.tasks.length) {\n\t\t\tthis.ui.tasksContainer.removeClass(\"hide\");\n\t\t\tthis.ui.fakeTask.removeClass(\"hide\");\n\t\t}\n\n\t\tif (!this.resources.length) {\n\t\t\tthis.ui.resourcesContainer.removeClass(\"hide\");\n\t\t\tthis.ui.fakeResource.removeClass(\"hide\");\n\t\t}\n\t},\n\n\tonNodeDragLeave: function onNodeDragLeave(event) {\n\t\tif (!canEdit()) return;\n\n\t\tif (_.split(this.model.get(\"path\"), \".\").length > 1) event.stopPropagation();\n\n\t\tthis.dragCount.node--;\n\n\t\tif (this.dragCount.node === 0) {\n\t\t\tif (!this.tasks.length) {\n\t\t\t\tthis.ui.tasksContainer.addClass(\"hide\");\n\t\t\t\tthis.ui.fakeTask.addClass(\"hide\");\n\t\t\t}\n\n\t\t\tif (!this.resources.length) {\n\t\t\t\tthis.ui.resourcesContainer.addClass(\"hide\");\n\t\t\t\tthis.ui.fakeResource.addClass(\"hide\");\n\t\t\t}\n\t\t}\n\t},\n\n\tonTaskDragEnter: function onTaskDragEnter(event) {\n\t\tif (!canEdit()) return;\n\t\tthis.dragCount.task++;\n\t\t$(event.currentTarget).find(\".drop-overlay\").addClass(\"dragging\");\n\t},\n\n\tonTaskDragLeave: function onTaskDragLeave(event) {\n\t\tif (!canEdit()) return;\n\t\tthis.dragCount.task--;\n\t\tif (this.dragCount.task === 0) $(event.currentTarget).find(\".drop-overlay\").removeClass(\"dragging\");\n\t},\n\n\tonResourceDragEnter: function onResourceDragEnter(event) {\n\t\tif (!canEdit()) return;\n\t\tthis.dragCount.resource++;\n\t\t$(event.currentTarget).find(\".drop-overlay\").addClass(\"dragging\");\n\t},\n\n\tonResourceDragLeave: function onResourceDragLeave(event) {\n\t\tif (!canEdit()) return;\n\t\tthis.dragCount.resource--;\n\t\tif (this.dragCount.resource === 0) $(event.currentTarget).find(\".drop-overlay\").removeClass(\"dragging\");\n\t},\n\n\tonFileDragOver: function onFileDragOver(event) {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tevent.originalEvent.dataTransfer.dropEffect = \"copy\";\n\t},\n\n\tonFileDrop: function onFileDrop(event) {\n\t\tvar _this7 = this;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tif (!this.bulkDragDropHelper) this.bulkDragDropHelper = new BulkDragDropHelper();\n\n\t\tvar group = eventBus.request(eventBus.Events.GetCurrentGroup);\n\t\t// Check overlay parent if dropping in task\n\t\tvar isTasks = $(event.currentTarget).parent().hasClass(\"task-host\");\n\t\tvar files = _.map(_.filter(this.bulkDragDropHelper.extractFilesFromEvent(event), function (f) {\n\t\t\treturn f !== null;\n\t\t}), function (file) {\n\t\t\tfile.file = file;\n\t\t\tfile.subject = group.get(\"subject\");\n\t\t\tfile.grade = group.get(\"grade\");\n\t\t\tfile.language = group.get(\"language\");\n\t\t\treturn new Backbone.Model(file);\n\t\t});\n\n\t\tthis.dragCount = { task: 0, resource: 0, node: 0 };\n\t\tthis.ui.dropOverlay.removeClass(\"dragging\");\n\t\t$(\".cancel-drop\").addClass(\"hide\");\n\n\t\tif (files.length > 0) {\n\t\t\tvar fileModel = void 0,\n\t\t\t    errorCount = 0;\n\t\t\tvar fileModels = _.map(files, function (file) {\n\t\t\t\tfileModel = _this7.bulkDragDropHelper.getResourceModel(file);\n\t\t\t\tif (_.values(fileModel.get(\"errors\")).length > 0) errorCount++;\n\t\t\t\tfileModel.set(\"fileModel\", file);\n\t\t\t\treturn fileModel;\n\t\t\t});\n\n\t\t\t// if the save queue has invalid files, show confirm modal, else, start upload\n\t\t\tif (errorCount > 0) {\n\t\t\t\tvar modal = new BulkResourceUploadModal({ model: new Backbone.Model({ files: fileModels, dontSave: true }) });\n\n\t\t\t\tmodal.once(\"action\", function (action, saveQueue, canceledFiles) {\n\t\t\t\t\tif (action === \"save\") {\n\t\t\t\t\t\t// Remove canceled files\n\t\t\t\t\t\t_.each(canceledFiles, function (file) {\n\t\t\t\t\t\t\treturn _this7.onUploadCancel(file.get(\"resourceModel\"));\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (!_this7.currentlySaving) {\n\t\t\t\t\t\t\t_this7.setSaveQueue(saveQueue, isTasks);\n\t\t\t\t\t\t\t_this7.saveFiles();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tthis.listenTo(modal, \"cancel\", this.onUploadCancelAll.bind(this));\n\n\t\t\t\tmodal.show();\n\t\t\t} else {\n\t\t\t\tthis.setSaveQueue(files, isTasks);\n\t\t\t\tthis.saveQueue = _.filter(this.saveQueue, function (file) {\n\t\t\t\t\treturn !file.get(\"errors\") || _.values(file.get(\"errors\")).length === 0;\n\t\t\t\t});\n\t\t\t\tif (!this.currentlySaving) this.saveFiles();\n\t\t\t}\n\t\t}\n\t},\n\n\tsetSaveQueue: function setSaveQueue(files, isTasks) {\n\t\tvar _this8 = this;\n\n\t\tvar resource = void 0,\n\t\t    fileModel = void 0;\n\t\tthis.saveQueue = _.merge(this.saveQueue, _.map(_.filter(files, function (file) {\n\t\t\treturn !file.get(\"saved\");\n\t\t}), function (file) {\n\t\t\tfileModel = file.get(\"fileModel\") ? file : _this8.bulkDragDropHelper.getResourceModel(file);\n\t\t\tif (_.values(fileModel.get(\"errors\")).length === 0) {\n\t\t\t\tfileModel.set(\"isTask\", isTasks);\n\t\t\t\tresource = fileModel.toJSON();\n\n\t\t\t\t// Create lp_item without saving\n\t\t\t\tresource.groups = eventBus.request(eventBus.Events.GetCurrentGroups);\n\t\t\t\t_.extend(resource, {\n\t\t\t\t\tlearning_path: _this8.model.get(\"learning_path\"),\n\t\t\t\t\tisTask: isTasks,\n\t\t\t\t\tdueDate: null,\n\t\t\t\t\tvisible: _this8.model.get(\"visible\"),\n\t\t\t\t\tlocked: _this8.model.get(\"locked\") || resource.locked,\n\t\t\t\t\tactivationDate: _this8.model.get(\"activationDate\") || resource.activationDate || null,\n\t\t\t\t\tparentLocked: _this8.model.get(\"parentLocked\"),\n\t\t\t\t\tparentActivation: _this8.model.get(\"parentActivation\"),\n\t\t\t\t\tparentVisible: _this8.model.get(\"parentVisible\")\n\t\t\t\t});\n\n\t\t\t\tif (resource.locked || !resource.locked && resource.activationDate && resource.activationDate < moment().unix()) resource.activationDate = null;\n\n\t\t\t\tif (!resource.path || !_this8.tasks.get(resource.resource) && !_this8.resources.get(resource.resources) || !localMethods.isSibling(_this8.model.get(\"path\"), resource.path)) {\n\t\t\t\t\tvar maxTask = _this8.tasks.last();\n\t\t\t\t\tvar maxResource = _this8.resources.last();\n\n\t\t\t\t\tif (!maxTask && !maxResource) resource.path = _this8.model.get(\"path\") + \".AAA\";else if (!maxResource) resource.path = localMethods.getNextPath(maxTask.get(\"path\"));else if (!maxTask) resource.path = localMethods.getNextPath(maxResource.get(\"path\"));else if (localMethods.isAfter(maxTask.get(\"path\"), maxResource.get(\"path\"))) resource.path = localMethods.getNextPath(maxResource.get(\"path\"));else resource.path = localMethods.getNextPath(maxTask.get(\"path\"));\n\t\t\t\t}\n\n\t\t\t\tvar resourceModel = new ResourceModel(resource);\n\n\t\t\t\t// Update the cache of pre-saved items\n\t\t\t\tif (!_this8.contentSaveMap) _this8.contentSaveMap = {};\n\n\t\t\t\t_this8.contentSaveMap[resourceModel.cid] = true;\n\n\t\t\t\tif (resource.isTask) _this8.tasks.add(resourceModel);else _this8.resources.add(resourceModel);\n\n\t\t\t\t_this8.listenTo(fileModel, \"upload:progress\", _this8.onUploadProgress.bind(_this8, resourceModel));\n\t\t\t\t_this8.listenTo(resourceModel, \"upload:cancel\", _this8.onUploadCancel.bind(_this8, resourceModel));\n\t\t\t\tfileModel.set(\"resourceModel\", resourceModel);\n\t\t\t\tfileModel.set(\"fileModel\", file);\n\t\t\t}\n\n\t\t\treturn fileModel;\n\t\t}));\n\t},\n\n\tonUploadCancelAll: function onUploadCancelAll() {\n\t\t_.each(this.saveQueue, function (file) {\n\t\t\tif (_.values(file.get(\"errors\")).length === 0) file.get(\"resourceModel\").trigger(\"view:destroy\");\n\t\t});\n\n\t\tthis.ui.fakeResource.addClass(\"hide\");\n\t\tthis.ui.fakeTask.addClass(\"hide\");\n\t\tthis.ui.dropOverlay.removeClass(\"dragging\");\n\n\t\tif (this.tasks.length === 0) this.ui.tasksContainer.addClass(\"hide\");\n\n\t\tif (this.resources.length === 0) this.ui.resourcesContainer.removeClass(\"hide\");\n\t},\n\n\tsaveFiles: function saveFiles() {\n\t\tif (this.saveQueue.length === 0) {\n\t\t\tglobalRadio.trigger(App.Events.Commands.NavigationPrompt, null);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.currentlySaving) this.currentlySaving = this.saveQueue.shift();\n\n\t\tglobalRadio.trigger(App.Events.Commands.NavigationPrompt, \"Some attachments are still saving. If you leave, they will be lost. Are you sure?\");\n\n\t\t// Save the model, uploading the file\n\t\tthis.xhr[this.currentlySaving.get(\"resourceModel\").cid] = this.currentlySaving.binarySave(null, {\n\t\t\tvalidate: false,\n\t\t\twait: true,\n\t\t\tdata: this.currentlySaving.attributes,\n\t\t\tsuccess: this.saveResourceSuccess.bind(this, this.currentlySaving.get(\"resourceModel\")),\n\t\t\terror: this.saveResourceError.bind(this, this.currentlySaving.get(\"resourceModel\"))\n\t\t});\n\t},\n\n\tsaveResourceSuccess: function saveResourceSuccess(resourceModel, model) {\n\t\tvar _this9 = this;\n\n\t\tresourceModel.set(\"resource\", model.get(\"_id\"));\n\t\tresourceModel.unset(\"fileModel\");\n\t\tresourceModel.unset(\"resourceModel\");\n\t\tmodel.set(\"saved\", true);\n\n\t\tresourceModel.save(null, {\n\t\t\tsuccess: function success() {\n\t\t\t\t_this9.currentlySaving = false;\n\t\t\t\t_this9.saveFiles();\n\n\t\t\t\tdelete _this9.contentSaveMap[resourceModel.cid];\n\n\t\t\t\t_this9.reorderContent(resourceModel);\n\n\t\t\t\teventBus.trigger(eventBus.Events.AttachmentAdded, resourceModel);\n\t\t\t},\n\t\t\terror: function error(lpiModel, xhr) {\n\t\t\t\tvar answer = App.parseResponse(xhr);\n\t\t\t\tif (xhr.responseJSON && xhr.responseJSON.delete && _this9.currentlySaving) _this9.currentlySaving.destroy();\n\n\t\t\t\tresourceModel.set(\"errors\", { error: answer.detail || answer.info });\n\n\t\t\t\tif (resourceModel.get(\"isTask\")) _this9.tasks.remove(resourceModel);else _this9.resources.remove(resourceModel);\n\n\t\t\t\tif (_this9.saveQueue.length === 0) {\n\t\t\t\t\t_this9.tasks.models = _.filter(_this9.tasks.models, function (lpItem) {\n\t\t\t\t\t\treturn lpItem.has(\"created\");\n\t\t\t\t\t});\n\t\t\t\t\t_this9.resources.models = _.filter(_this9.resources.models, function (lpItem) {\n\t\t\t\t\t\treturn lpItem.has(\"created\");\n\t\t\t\t\t});\n\t\t\t\t\t_this9.render();\n\t\t\t\t}\n\n\t\t\t\t_this9.currentlySaving = false;\n\t\t\t\t_this9.saveFiles();\n\n\t\t\t\tdelete _this9.contentSaveMap[resourceModel.cid];\n\n\t\t\t\tvar errorMessage = \"<p>An error occurred while saving the attachment for \" + lpiModel.get(\"title\") + \":<br>\" + (answer.detail || answer.info).replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t\t}) + \"</p>\";\n\n\t\t\t\tvar modal = new SmallModal({\n\t\t\t\t\ttitle: \"<span class='fal fa-times-circle'/> Error\",\n\t\t\t\t\tbody: errorMessage,\n\t\t\t\t\thost: \"#link-resources\",\n\t\t\t\t\twarning: true,\n\t\t\t\t\thideButtons: [\"cancel\"]\n\t\t\t\t});\n\n\t\t\t\tmodal.show();\n\t\t\t}\n\t\t});\n\t\tthis.xhr[resourceModel.cid] = null;\n\t\tresourceModel.trigger(\"save:success\", model);\n\t},\n\n\tsaveResourceError: function saveResourceError(resourceModel, model, xhr) {\n\t\tthis.xhr[resourceModel.cid] = null;\n\t\tdelete this.contentSaveMap[resourceModel.cid];\n\t\tthis.currentlySaving = false;\n\n\t\tif (xhr.statusText !== \"abort\") resourceModel.trigger(\"save:error\", xhr);\n\n\t\tif (this.saveQueue.length > 0) this.saveFiles();\n\t},\n\n\tonUploadProgress: function onUploadProgress(resourceModel, percentage) {\n\t\tresourceModel.trigger(\"upload:progress\", percentage, resourceModel);\n\t},\n\n\tonUploadCancel: function onUploadCancel(model) {\n\t\tvar _this10 = this;\n\n\t\tif (!model) return;\n\n\t\tif (model.get(\"isTask\")) this.tasks.remove(model);else this.resources.remove(model);\n\n\t\tif (this.currentlySaving) this.saveQueue = _.reject(this.saveQueue, function (file) {\n\t\t\treturn file.cid === _this10.currentlySaving.cid;\n\t\t});\n\n\t\t// Abort communication with the server if item is in progress\n\t\tif (this.xhr[model.cid]) {\n\t\t\tthis.xhr[model.cid].abort();\n\t\t\tthis.currentlySaving = false;\n\n\t\t\t// Revert any changes made to the model\n\t\t\tif (this.oldAttributes) this.model.set(this.oldAttributes, { validate: false });\n\t\t}\n\n\t\tif (!this.currentlySaving) {\n\t\t\tthis.currentlySaving = false;\n\t\t\tthis.saveFiles();\n\t\t}\n\t},\n\n\tonCancelBtnClick: function onCancelBtnClick() {\n\t\t_.forOwn(this.xhr, function (value) {\n\t\t\tif (value) value.abort();\n\t\t});\n\t\tthis.destroy();\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tclearTimeout(this.lockInterval);\n\t},\n\n\tonProgressChange: function onProgressChange() {\n\t\tvar p = this.model.get(\"progress\");\n\n\t\tthis.ui.completionTick.addClass(\"hide\");\n\n\t\t// Set the new SVG values\n\t\tif (p === null) {\n\t\t\t// No tasks at all; no progress possible\n\t\t\tthis.ui.dot.get(0).style.fill = \"#DDD\";\n\t\t\tthis.ui.dot.get(0).style.stroke = \"#DDD\";\n\t\t} else if (p === 0) {\n\t\t\tthis.ui.dot.get(0).style.fill = \"#FFF\";\n\t\t\tthis.ui.dot.get(0).style.stroke = \"#000\";\n\t\t} else if (p === 100) {\n\t\t\tthis.ui.dot.get(0).style.fill = \"rgb(96, 170, 86)\";\n\t\t\tthis.ui.dot.get(0).style.stroke = \"rgb(96, 170, 86)\";\n\n\t\t\tthis.ui.completionTick.removeClass(\"hide\");\n\t\t} else {\n\t\t\t$(\"stop:nth-child(2)\", this.ui.svgGradient).get(0).setAttribute(\"offset\", p + \"%\");\n\t\t\t$(\"stop:nth-child(3)\", this.ui.svgGradient).get(0).setAttribute(\"offset\", p + \"%\");\n\n\t\t\tthis.ui.dot.get(0).style.fill = \"url(#lg-\" + this.model.id + \")\";\n\t\t\tthis.ui.dot.get(0).style.stroke = \"#FFB600\";\n\t\t}\n\t},\n\n\tonNodeClick: function onNodeClick(e) {\n\t\te.stopPropagation();\n\t\tvar user = globalRadio.request(App.Events.Requests.CurrentUser);\n\n\t\tif (this.model.get(\"editMode\") || !rester.hasAccess(rester.p.learningPaths.canEdit, user)) return;\n\n\t\tif (itemDragHit) {\n\t\t\titemDragHit = false;\n\t\t\treturn;\n\t\t}\n\n\t\tif (multiselect || msState) return lpRadio.trigger(Events.NodeSelectOver, this.model, !this.model.get(\"multiselecting\"));\n\n\t\tif (this.model.get(\"selected\") || draggingResource || this.model.get(\"showDropIndicator\")) return;\n\n\t\tif (!this.model.get(\"selected\")) {\n\t\t\tthis.model.set({ selected: true });\n\t\t\tlpRadio.trigger(Events.NodeSelected, this.model.id, this);\n\t\t}\n\t},\n\n\tonLastNodeChange: function onLastNodeChange() {\n\t\tif (this.model.get(\"lastNode\")) {\n\t\t\tif (this.children.length) {\n\t\t\t\tthis.children.each(function (x) {\n\t\t\t\t\treturn x.set({ lastNode: false });\n\t\t\t\t});\n\t\t\t\tthis.children.last().set({ lastNode: true });\n\t\t\t\tthis.$el.removeClass(\"last-node\");\n\t\t\t} else {\n\t\t\t\tthis.$el.addClass(\"last-node\");\n\t\t\t}\n\t\t} else {\n\t\t\tthis.$el.removeClass(\"last-node\");\n\t\t\tthis.children.each(function (x) {\n\t\t\t\treturn x.set({ lastNode: false });\n\t\t\t});\n\t\t}\n\t},\n\n\tstartMultiselect: function startMultiselect(e) {\n\t\tif (e.which !== 1) return;\n\n\t\tvar user = globalRadio.request(App.Events.Requests.CurrentUser);\n\t\tif (!rester.hasAccess(rester.p.learningPaths.canEdit, user)) return;\n\n\t\titemDragHit = false;\n\n\t\tvar whitelist = [\"left-section\", \"tags\", \"description-container\", \"tree-content\"];\n\t\tif (e.currentTarget !== e.target && !_.some(whitelist, function (x) {\n\t\t\treturn e.target.classList.contains(x);\n\t\t})) return;\n\n\t\te.stopPropagation();\n\n\t\tlpRadio.trigger(Events.MultiselectStart, this.model);\n\t},\n\n\tonMultiSelectingChange: function onMultiSelectingChange() {\n\t\tif (this.model.get(\"multiselecting\")) {\n\t\t\tthis.ui.node.addClass(\"multiselecting\");\n\t\t\tthis.ui.checkbox.prop(\"checked\", true);\n\t\t} else {\n\t\t\tthis.ui.node.removeClass(\"multiselecting\");\n\t\t\tthis.ui.checkbox.prop(\"checked\", false);\n\t\t}\n\t},\n\n\tnodeSelectListen: function nodeSelectListen() {\n\t\tvar _this11 = this;\n\n\t\tthis.ui.node.off(\"mousemove.multiselect\");\n\t\tthis.ui.node.on(\"mousemove.multiselect\", function (e) {\n\t\t\te.stopPropagation();\n\n\t\t\tif (msState === 3) return;\n\n\t\t\titemDragHit = _this11.model.id;\n\n\t\t\tlpRadio.trigger(Events.NodeSelectOver, _this11.model);\n\t\t});\n\t},\n\n\tnodeSelectEnd: function nodeSelectEnd() {\n\t\tthis.ui.node.off(\"mousemove.multiselect\");\n\t},\n\n\tonCheckboxClick: function onCheckboxClick(e) {\n\t\te.stopPropagation();\n\n\t\tlpRadio.trigger(Events.NodeSelectOver, this.model, this.ui.checkbox.prop(\"checked\"));\n\t},\n\n\tonChildrenChange: function onChildrenChange() {\n\t\t// This will typically happen when the parent node is reloaded, and updates the child elements\n\t\t// We want to propagate this downwards.\n\t\tif (!this.model.get(\"children\")) return;\n\n\t\tvar datas = _.groupBy(_.values(this.model.get(\"children\") || []), function (x) {\n\t\t\tif (x.category === \"node\") return \"children\";\n\n\t\t\tif (x.isTask) return \"tasks\";\n\n\t\t\treturn \"resources\";\n\t\t});\n\n\t\t// So we know it's been processed\n\t\tthis.model.set({ children: null });\n\n\t\tthis.model._children.set(datas.children || []);\n\t\tthis.model._children.sort();\n\t\tthis.model._resources.set(datas.resources || []);\n\t\tthis.model._resources.sort();\n\t\tthis.model._tasks.set(datas.tasks || []);\n\t\tthis.model._tasks.sort();\n\n\t\t// If we have at least one child, add a class to fix the connector line\n\t\tif (this.model._children.length) this.$el.addClass(\"has-children\");else this.$el.removeClass(\"has-children\");\n\n\t\tthis.onLastNodeChange();\n\t},\n\n\tonParentLockChange: function onParentLockChange() {\n\t\tthis.model.set({\n\t\t\tlocked: this.model.get(\"parentLocked\"),\n\t\t\tactivationDate: this.model.get(\"parentActivation\")\n\t\t});\n\t},\n\n\tonParentVisibleChange: function onParentVisibleChange() {\n\t\tthis.model.set({\n\t\t\tvisible: this.model.get(\"parentVisible\")\n\t\t});\n\t},\n\n\teditingStart: function editingStart(id) {\n\t\tif (id !== this.model.id) this.ui.addChildNodeBtn.addClass(\"hide\");\n\t},\n\n\teditingEnd: function editingEnd() {\n\t\tthis.ui.addChildNodeBtn.removeClass(\"hide\");\n\t},\n\n\tbodyClickEvent: function bodyClickEvent(e) {\n\t\tif (e) e.stopPropagation();\n\n\t\tthis.model.set({ selected: false });\n\t},\n\n\tnodeSelectedEvent: function nodeSelectedEvent(id) {\n\t\tif (id !== this.model.id) this.model.set({ selected: false });\n\t},\n\n\tonEditingChange: function onEditingChange(toggle) {\n\t\tif (toggle) {\n\t\t\tthis.ui.addChildNodeBtn.removeClass(\"hide\");\n\t\t\tthis.ui.dot.get(0).classList.add(\"hide\");\n\t\t\tthis.ui.completionTick.addClass(\"hide\");\n\t\t} else {\n\t\t\tthis.ui.addChildNodeBtn.addClass(\"hide\");\n\t\t\tif (editStates.viewMode) this.ui.dot.get(0).classList.remove(\"hide\");\n\t\t}\n\t},\n\n\tonSelectedStatusChange: function onSelectedStatusChange() {\n\t\tif (this.model.get(\"selected\")) this.ui.node.addClass(\"selected\");else this.ui.node.removeClass(\"selected\");\n\t},\n\n\tonEditModeChange: function onEditModeChange() {\n\t\tif (!this.model.isNew()) this.ui.connector.removeClass(\"hide\");\n\n\t\tif (this.model.get(\"editMode\")) this.ui.node.addClass(\"lp-node-edit\");else this.ui.node.removeClass(\"lp-node-edit\");\n\t},\n\n\tonShowDropIndicatorChange: function onShowDropIndicatorChange() {\n\t\tif (this.model.get(\"showDropIndicator\")) this.ui.droppable.addClass(\"show\");else this.ui.droppable.removeClass(\"show\");\n\t},\n\n\tonDropChildChange: function onDropChildChange() {\n\t\tif (this.model.get(\"dropChild\")) this.ui.dropIndicator.addClass(\"child\").removeClass(\"sibling\");else this.ui.dropIndicator.addClass(\"sibling\").removeClass(\"child\");\n\t},\n\n\tonDropPositionChange: function onDropPositionChange() {\n\t\tif (this.model.get(\"dropPosition\") === \"above\") return this.ui.dropIndicator.parent().css({ top: \"0\" }).insertBefore(this.ui.node);\n\n\t\tvar height = this.ui.node.outerHeight(true);\n\t\tthis.ui.dropIndicator.parent().css({ top: height + 20 + \"px\" }).insertAfter(this.ui.node);\n\t},\n\n\tonDotClick: function onDotClick(e) {\n\t\tvar _this12 = this;\n\n\t\te.stopPropagation();\n\n\t\tif (this.model.get(\"progress\") === null || this.model.get(\"progress\") === 0) return;\n\n\t\tvar modal = new SmallModal({\n\t\t\twarning: true,\n\t\t\ttitle: \"<span class='fal fa-sync-alt'/> Reset User Progress\",\n\t\t\tbody: \"Progress on this item and any sub-items will be reset for the chosen learner.<br/><br/>\\n\\t\\t\\t\\tProvide a comment that will tell the learner why progress was reset.<input type='text' placeholder='Comment'>\",\n\t\t\thost: \"#link-resources\"\n\t\t});\n\n\t\tmodal.on(\"button:ok\", function () {\n\t\t\t// Reset the state for the given item and all children\n\t\t\t$.ajax({\n\t\t\t\tmethod: \"PUT\",\n\t\t\t\tdata: {\n\t\t\t\t\tcomment: $(\"input\", modal.el).val()\n\t\t\t\t},\n\t\t\t\turl: settings.urlRoot + \"/acacia/learningPaths/items/\" + _this12.model.id + \"/state/\" + viewingUser,\n\t\t\t\terror: function error(err) {\n\t\t\t\t\treturn console.error(err);\n\t\t\t\t},\n\t\t\t\tsuccess: function success(data) {\n\t\t\t\t\t_.each(data, function (x) {\n\t\t\t\t\t\treturn taskMap[x._id].set({ progress: 0 });\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tmodal.show();\n\t},\n\n\tonSaveBegin: function onSaveBegin() {\n\t\tthis.showOverlay(\"saving\");\n\t},\n\n\tonSaveEnd: function onSaveEnd() {\n\t\tthis.hideOverlay();\n\t},\n\n\tonSaveError: function onSaveError() {\n\t\tthis.hideOverlay();\n\t},\n\n\tonLockedChange: function onLockedChange() {\n\t\tvar _this13 = this;\n\n\t\tif (!this.model.get(\"locked\") && (!this.model.get(\"activationDate\") || this.model.get(\"activationDate\") < moment().unix())) {\n\t\t\tthis.ui.lockedIcon.addClass(\"hide\");\n\t\t\tthis.ui.connector.removeClass(\"locked-connection\");\n\t\t\tthis.ui.lockedLine.addClass(\"hide\");\n\t\t} else {\n\t\t\tthis.ui.lockedIcon.removeClass(\"hide\");\n\t\t\tthis.ui.connector.addClass(\"locked-connection\");\n\t\t\tthis.ui.lockedLine.removeClass(\"hide\");\n\t\t}\n\n\t\t// Lock or unlock children as well\n\t\tthis.children.each(function (x) {\n\t\t\tx.set({\n\t\t\t\tparentLocked: _this13.model.get(\"locked\") || false,\n\t\t\t\tparentActivation: _this13.model.get(\"activationDate\") || null\n\t\t\t});\n\t\t});\n\n\t\tthis.resources.each(function (x) {\n\t\t\tx.set({\n\t\t\t\tparentLocked: _this13.model.get(\"locked\") || false,\n\t\t\t\tparentActivation: _this13.model.get(\"activationDate\") || null\n\t\t\t});\n\t\t});\n\n\t\tthis.tasks.each(function (x) {\n\t\t\tx.set({\n\t\t\t\tparentLocked: _this13.model.get(\"locked\") || false,\n\t\t\t\tparentActivation: _this13.model.get(\"activationDate\") || null\n\t\t\t});\n\t\t});\n\n\t\tthis.setLockExpiry();\n\t},\n\n\tonVisibleChange: function onVisibleChange() {\n\t\tvar _this14 = this;\n\n\t\t// Show or hide children as well\n\t\tthis.children.each(function (x) {\n\t\t\tx.set({\n\t\t\t\tparentVisible: Boolean(_this14.model.get(\"visible\"))\n\t\t\t});\n\t\t});\n\n\t\tthis.resources.each(function (x) {\n\t\t\tx.set({\n\t\t\t\tparentVisible: Boolean(_this14.model.get(\"visible\"))\n\t\t\t});\n\t\t});\n\n\t\tthis.tasks.each(function (x) {\n\t\t\tx.set({\n\t\t\t\tparentVisible: Boolean(_this14.model.get(\"visible\"))\n\t\t\t});\n\t\t});\n\t},\n\n\tsetLockExpiry: function setLockExpiry() {\n\t\tvar _this15 = this;\n\n\t\tclearTimeout(this.lockInterval);\n\n\t\tif (this.model.get(\"activationDate\") > moment().unix()) {\n\t\t\tvar wait = this.model.get(\"activationDate\") - moment().unix() + 2;\n\n\t\t\tthis.lockInterval = setTimeout(function () {\n\t\t\t\t_this15.onLockedChange();\n\t\t\t}, wait * 1000);\n\t\t}\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this16 = this;\n\n\t\tif (this.model.get(\"children\") !== null) {\n\t\t\tvar datas = _.groupBy(_.values(this.model.get(\"children\") || []), function (x) {\n\t\t\t\tif (x.category === \"node\") return \"children\";\n\n\t\t\t\tif (x.isTask) return \"tasks\";\n\n\t\t\t\treturn \"resources\";\n\t\t\t});\n\n\t\t\t// So we know it's been processed\n\t\t\tthis.model.set({ children: null });\n\n\t\t\tthis.model._children = new ChildrenCollection(datas.children || []);\n\n\t\t\tthis.model._resources = new ResourceCollection(datas.resources || [], { tasks: false });\n\t\t\tthis.model._tasks = new ResourceCollection(datas.tasks || [], { tasks: true });\n\t\t}\n\n\t\tthis.children = this.model._children;\n\t\tthis.resources = this.model._resources;\n\t\tthis.tasks = this.model._tasks;\n\n\t\tthis.children.each(function (x) {\n\t\t\tmodelMap[x.id] = x;\n\n\t\t\t_.each(x.get(\"groups\"), function (y) {\n\t\t\t\tif (!(y in groupMap)) groupMap[y] = [];\n\t\t\t\tgroupMap[y].splice(_.sortedIndexBy(groupMap[y], x, function (z) {\n\t\t\t\t\treturn z.id;\n\t\t\t\t}), 0, x);\n\t\t\t});\n\t\t});\n\n\t\tthis.tasks.each(function (x) {\n\t\t\ttaskMap[x.id] = x;\n\n\t\t\t_.each(x.get(\"groups\"), function (y) {\n\t\t\t\tif (!(y in groupMap)) groupMap[y] = [];\n\t\t\t\tgroupMap[y].splice(_.sortedIndexBy(groupMap[y], x, function (z) {\n\t\t\t\t\treturn z.id;\n\t\t\t\t}), 0, x);\n\t\t\t});\n\t\t});\n\n\t\tthis.resources.each(function (x) {\n\t\t\tmodelMap[x.id] = x;\n\n\t\t\t_.each(x.get(\"groups\"), function (y) {\n\t\t\t\tif (!(y in groupMap)) groupMap[y] = [];\n\t\t\t\tgroupMap[y].splice(_.sortedIndexBy(groupMap[y], x, function (z) {\n\t\t\t\t\treturn z.id;\n\t\t\t\t}), 0, x);\n\t\t\t});\n\t\t});\n\n\t\tthis.children.on(\"add remove\", function (node) {\n\t\t\tif (node.id in modelMap) {\n\t\t\t\tdelete modelMap[node.id];\n\n\t\t\t\t_.each(node.get(\"groups\"), function (x) {\n\t\t\t\t\tif (!(x in groupMap)) return;\n\n\t\t\t\t\tvar i = _.sortedIndexBy(groupMap[x], node, function (z) {\n\t\t\t\t\t\treturn z.id;\n\t\t\t\t\t});\n\t\t\t\t\tif (i > 0 || groupMap[x][0].id === node.id) groupMap[x].splice(Math.max(0, i), 1);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tmodelMap[node.id] = node;\n\n\t\t\t\t_.each(node.get(\"groups\"), function (y) {\n\t\t\t\t\tif (!(y in groupMap)) groupMap[y] = [];\n\t\t\t\t\tgroupMap[y].splice(_.sortedIndexBy(groupMap[y], node, function (z) {\n\t\t\t\t\t\treturn z.id;\n\t\t\t\t\t}), 0, node);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (_this16.children.length) _this16.$el.addClass(\"has-children\");else _this16.$el.removeClass(\"has-children\");\n\n\t\t\tif (_this16.children.length) {\n\t\t\t\tif (_this16.model.get(\"depth\") === 1 || _this16.model.get(\"lastNode\") || _this16.children.some(function (x) {\n\t\t\t\t\treturn x.get(\"lastNode\");\n\t\t\t\t})) {\n\t\t\t\t\t_this16.children.each(function (x) {\n\t\t\t\t\t\treturn x.set({ lastNode: false });\n\t\t\t\t\t});\n\t\t\t\t\t_this16.children.last().set({ lastNode: true });\n\t\t\t\t}\n\t\t\t} else if (node && node.get(\"lastNode\")) {\n\t\t\t\t// We removed the only child, so we're now the last node\n\t\t\t\t_this16.model.set({ lastNode: true });\n\t\t\t}\n\t\t});\n\n\t\tthis.resources.on(\"add remove\", function (node) {\n\t\t\tif (node.id in modelMap) {\n\t\t\t\tdelete modelMap[node.id];\n\n\t\t\t\t_.each(node.get(\"groups\"), function (x) {\n\t\t\t\t\tif (!(x in groupMap)) return;\n\n\t\t\t\t\tvar i = _.sortedIndexBy(groupMap[x], node, function (z) {\n\t\t\t\t\t\treturn z.id;\n\t\t\t\t\t});\n\t\t\t\t\tif (i > 0 || groupMap[x][0].id === node.id) groupMap[x].splice(Math.max(0, i), 1);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tmodelMap[node.id] = node;\n\n\t\t\t\t_.each(node.get(\"groups\"), function (y) {\n\t\t\t\t\tif (!(y in groupMap)) groupMap[y] = [];\n\t\t\t\t\tgroupMap[y].splice(_.sortedIndexBy(groupMap[y], node, function (z) {\n\t\t\t\t\t\treturn z.id;\n\t\t\t\t\t}), 0, node);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tthis.tasks.on(\"add remove\", function (node) {\n\t\t\tif (node.id in taskMap) {\n\t\t\t\tdelete taskMap[node.id];\n\n\t\t\t\t_.each(node.get(\"groups\"), function (x) {\n\t\t\t\t\tif (!(x in groupMap)) return;\n\n\t\t\t\t\tvar i = _.sortedIndexBy(groupMap[x], node, function (z) {\n\t\t\t\t\t\treturn z.id;\n\t\t\t\t\t});\n\t\t\t\t\tif (i > 0 || groupMap[x][0].id === node.id) groupMap[x].splice(Math.max(0, i), 1);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\ttaskMap[node.id] = node;\n\n\t\t\t\t_.each(node.get(\"groups\"), function (y) {\n\t\t\t\t\tif (!(y in groupMap)) groupMap[y] = [];\n\t\t\t\t\tgroupMap[y].splice(_.sortedIndexBy(groupMap[y], node, function (z) {\n\t\t\t\t\t\treturn z.id;\n\t\t\t\t\t}), 0, node);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tvar progressChange = function progressChange(x) {\n\t\t\t// Child progress changed; update local progress\n\t\t\tif (!_this16.progressCache) _this16.progressCache = {};\n\n\t\t\t_this16.progressCache[x.id] = x.get(\"progress\");\n\n\t\t\t// Recalculate local progress\n\t\t\tvar p = _.reduce(_this16.progressCache, function (sum, num) {\n\t\t\t\tif (sum === null && num === null) return null;\n\t\t\t\treturn (sum || 0) + (num || 0);\n\t\t\t}, null);\n\n\t\t\t_this16.model.set({ progress: p === null ? null : Math.ceil(p / _.keys(_this16.progressCache).length) });\n\t\t};\n\n\t\tthis.children.on(\"change:progress\", progressChange);\n\t\tthis.tasks.on(\"change:progress\", progressChange);\n\n\t\tif (this.tasks.length === 0 && editStates.viewMode) this.model.set({ progress: null });\n\n\t\t// If we have at least one child, add a class to fix the connector line\n\t\tif (this.children.length) this.$el.addClass(\"has-children\");else this.$el.removeClass(\"has-children\");\n\n\t\tthis.showChildView(\"content\", new TreeContent({ model: this.model }));\n\t\tthis.showChildView(\"tasks\", new ResourcesView({ collection: this.tasks, model: this.model }));\n\t\tthis.showChildView(\"resources\", new ResourcesView({ collection: this.resources, model: this.model }));\n\t\tthis.showChildView(\"children\", new TreeView({ collection: this.children, model: this.model }));\n\n\t\tif (this.children.length && this.model.get(\"depth\") === 1) this.children.last().set({ lastNode: true });\n\n\t\tthis.listenTo(this.resources, \"update\", this.checkAttachmentContainers);\n\t\tthis.listenTo(this.tasks, \"update\", this.checkAttachmentContainers);\n\n\t\tif (!this.model.isNew() && this.children.length) {\n\t\t\t// Update all children\n\t\t\tvar _d = this.model.get(\"depth\");\n\t\t\t_.each(this.children.models, function (x) {\n\t\t\t\tx.set({ depth: _d + 1 });\n\t\t\t});\n\t\t}\n\n\t\tthis.onEditingChange(canEdit());\n\n\t\tif (this.model.get(\"editMode\")) {\n\t\t\tthis.ui.node.addClass(\"lp-node-edit\");\n\t\t\tthis.ui.nodeAttachments.addClass(\"hide\");\n\t\t} else if (!this.model.isNew()) {\n\t\t\t//this.ui.dot.get(0).classList.remove(\"hide\");\n\t\t\tthis.ui.connector.removeClass(\"hide\");\n\t\t}\n\n\t\t// Reposition some items based on the depth\n\t\tvar d = this.model.get(\"depth\");\n\t\tthis.ui.connector.css({ left: \"-\" + (30 + (d - 1) * 30) + \"px\" });\n\t\tthis.ui.lockedIcon.css({ left: \"-\" + (33 + (d - 1) * 30) + \"px\" });\n\t\tthis.ui.lockedLine.css({ left: \"-\" + (22 + (d - 1) * 30) + \"px\" });\n\t\tthis.ui.sideLine.css({ left: \"-\" + (22 + (d - 1) * 30) + \"px\" });\n\t\tthis.ui.dot.css({ left: \"-\" + (35 + (d - 1) * 30) + \"px\" });\n\t\tthis.ui.completionTick.css({ left: \"-\" + (27 + (d - 1) * 30) + \"px\" });\n\t\tthis.ui.checkboxContainer.css({ left: \"-\" + (27 + (d - 1) * 30) + \"px\" });\n\n\t\tthis.checkAttachmentContainers();\n\t\tthis.setLockExpiry();\n\t},\n\n\tonAttach: function onAttach() {\n\t\tif (this.model.isNew()) this.$el.get(0).scrollIntoView();\n\n\t\tif (this.model.get(\"editMode\")) {\n\t\t\tthis.showChildView(\"edit\", new TreeEdit({ model: this.model }));\n\t\t\tthis.startNodeEdit();\n\t\t} else {\n\t\t\tlpRadio.trigger(Events.ViewUserChange);\n\t\t}\n\t},\n\n\tonDomRefresh: function onDomRefresh() {\n\t\tthis.setBrainTippy();\n\t},\n\n\tstartNodeEdit: function startNodeEdit(e) {\n\t\tif (e) e.stopPropagation();\n\n\t\tthis.showChildView(\"edit\", new TreeEdit({ model: this.model }));\n\n\t\tthis.ui.contentArea.slideUp();\n\t\tthis.ui.editArea.slideDown(400);\n\n\t\tthis.model.set({ selected: false, editMode: true });\n\t\t// Unselect any selected nodes\n\t\tlpRadio.trigger(Events.NodeSelected, 0);\n\t\tcurrentEditModelId = this.model.id;\n\t\tlpRadio.trigger(Events.EditingStarted, this.model.id);\n\t},\n\n\tcheckAttachmentContainers: function checkAttachmentContainers() {\n\t\tif (!this.ui.fakeTask.addClass) return;\n\n\t\tthis.ui.fakeTask.addClass(\"hide\");\n\t\tthis.ui.fakeResource.addClass(\"hide\");\n\n\t\tif (this.tasks.length) {\n\t\t\tthis.ui.tasksContainer.removeClass(\"hide\");\n\t\t\tthis.ui.tasksTitle.removeClass(\"hide\");\n\t\t} else {\n\t\t\tthis.ui.tasksContainer.addClass(\"hide\");\n\t\t\tthis.ui.tasksTitle.addClass(\"hide\");\n\t\t}\n\n\t\tif (this.resources.length) {\n\t\t\tthis.ui.resourcesContainer.removeClass(\"hide\");\n\t\t\tthis.ui.resourcesTitle.removeClass(\"hide\");\n\t\t} else {\n\t\t\tthis.ui.resourcesContainer.addClass(\"hide\");\n\t\t\tthis.ui.resourcesTitle.addClass(\"hide\");\n\t\t}\n\t},\n\n\tcancelNodeEdit: function cancelNodeEdit() {\n\t\tthis.model.set({ editMode: false });\n\t\tthis.ui.editArea.slideUp(400);\n\t\tthis.ui.contentArea.slideDown();\n\t\tthis.ui.nodeAttachments.removeClass(\"hide\");\n\t},\n\n\tcompleteNodeEdit: function completeNodeEdit() {\n\t\tthis.model.set({ editMode: false });\n\n\t\tthis.showChildView(\"content\", new TreeContent({ model: this.model }));\n\n\t\tthis.ui.editArea.slideUp(400);\n\t\tthis.ui.contentArea.slideDown();\n\n\t\tthis.ui.nodeAttachments.removeClass(\"hide\");\n\n\t\tthis.setBrainTippy();\n\t},\n\n\tcollapseNode: function collapseNode(collapse) {\n\t\tvar _this17 = this;\n\n\t\treturn new Promise(function (resolve) {\n\t\t\tif (!canEdit() && !editStates.viewMode) return resolve();\n\n\t\t\tvar opts = {};\n\n\t\t\t// If locked is set\n\t\t\tif (_this17.model.get(\"locked\") || !_this17.model.get(\"locked\") && _this17.model.get(\"activationDate\") && _this17.model.get(\"activationDate\") < moment().unix()) opts.activationDate = null;\n\n\t\t\tif (collapse && !_this17.model.get(\"isCollapsed\")) {\n\t\t\t\topts.isCollapsed = true;\n\n\t\t\t\treturn _this17.model.save(opts, {\n\t\t\t\t\tpatch: true,\n\t\t\t\t\twait: true,\n\t\t\t\t\tsuccess: function success() {\n\t\t\t\t\t\t_this17.ui.nodeAttachments.slideUp(400);\n\t\t\t\t\t\t$(\".node-body-container\", _this17.el).slideUp(400);\n\t\t\t\t\t\t_this17.ui.childNodesContainer.slideUp(400);\n\n\t\t\t\t\t\treturn Promise.delay(450).then(function () {\n\t\t\t\t\t\t\treturn resolve();\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else if (!collapse && _this17.model.get(\"isCollapsed\")) {\n\t\t\t\topts.isCollapsed = false;\n\n\t\t\t\treturn _this17.model.save(opts, {\n\t\t\t\t\tpatch: true,\n\t\t\t\t\twait: true,\n\t\t\t\t\tsuccess: function success() {\n\t\t\t\t\t\t_this17.ui.nodeAttachments.slideDown(400);\n\t\t\t\t\t\t$(\".node-body-container\", _this17.el).slideDown(400);\n\t\t\t\t\t\t_this17.ui.childNodesContainer.slideDown(400);\n\n\t\t\t\t\t\treturn Promise.delay(450).then(function () {\n\t\t\t\t\t\t\treturn resolve();\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tresolve();\n\t\t});\n\t},\n\n\treloadNode: function reloadNode() {\n\t\tvar _this18 = this;\n\n\t\tthis.model.fetch({\n\t\t\tsuccess: function success() {\n\t\t\t\tvar datas = _.groupBy(_.values(_this18.model.get(\"items\") || []), function (x) {\n\t\t\t\t\tif (x.category === \"node\") return \"children\";\n\n\t\t\t\t\tif (x.isTask) return \"tasks\";\n\n\t\t\t\t\treturn \"resources\";\n\t\t\t\t});\n\n\t\t\t\t// So we know it's been processed\n\t\t\t\t_this18.model.set({ children: null });\n\n\t\t\t\t_this18.model._children.set(datas.children || []);\n\t\t\t\t_this18.model._children.sort();\n\t\t\t\t_this18.model._resources.set(datas.resources || []);\n\t\t\t\t_this18.model._resources.sort();\n\t\t\t\t_this18.model._tasks.set(datas.tasks || []);\n\t\t\t\t_this18.model._tasks.sort();\n\n\t\t\t\t// If we have at least one child, add a class to fix the connector line\n\t\t\t\tif (_this18.model._children.length) _this18.$el.addClass(\"has-children\");else _this18.$el.removeClass(\"has-children\");\n\n\t\t\t\t_this18.onLastNodeChange();\n\n\t\t\t\tlpRadio.trigger(Events.NodeChange);\n\t\t\t},\n\t\t\terror: function error(model, response) {\n\t\t\t\t_this18.showError(response);\n\t\t\t}\n\t\t});\n\t},\n\n\tremoveChildNode: function removeChildNode(model) {\n\t\teventBus.trigger(eventBus.Events.AttachmentRemoved, this.model);\n\t\tthis.children.remove(model);\n\t},\n\n\tremoveChildContent: function removeChildContent(model) {\n\t\tthis.tasks.remove(model);\n\t\tthis.resources.remove(model);\n\t},\n\n\tonDepthChange: function onDepthChange() {\n\t\t// Reposition some items based on the depth\n\t\tvar d = this.model.get(\"depth\");\n\t\tthis.ui.connector.css({ left: \"-\" + (30 + (d - 1) * 30) + \"px\" });\n\t\tthis.ui.lockedIcon.css({ left: \"-\" + (33 + (d - 1) * 30) + \"px\" });\n\t\tthis.ui.lockedLine.css({ left: \"-\" + (22 + (d - 1) * 30) + \"px\" });\n\t\tthis.ui.sideLine.css({ left: \"-\" + (22 + (d - 1) * 30) + \"px\" });\n\t\tthis.ui.checkboxContainer.css({ left: \"-\" + (27 + (d - 1) * 30) + \"px\" });\n\n\t\t// Update all children\n\t\t_.each(this.children.models, function (x) {\n\t\t\tx.set({ depth: d + 1 });\n\t\t});\n\t},\n\n\tonTaskDragDrop: function onTaskDragDrop(evt) {\n\t\tif (draggingResource) this.onContentDrop(evt, true);\n\t},\n\n\tonResourceDragDrop: function onResourceDragDrop(evt) {\n\t\tif (draggingResource) this.onContentDrop(evt, false);\n\t},\n\n\tonContentDrop: function onContentDrop(evt, task) {\n\t\tvar _this19 = this;\n\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\n\t\tif (this.model.isNew()) return;\n\n\t\t$(\"div.resource\").removeClass(\"drop-above drop-below\");\n\n\t\tvar finalizeDrop = function finalizeDrop() {\n\t\t\tvar move = \"path\" in draggingResource;\n\n\t\t\tvar res = draggingResource;\n\t\t\tif (!move) {\n\t\t\t\tres = {\n\t\t\t\t\tresource: draggingResource._id,\n\t\t\t\t\tlearning_path: _this19.model.get(\"learning_path\"),\n\t\t\t\t\tresourceType: draggingResource.category,\n\t\t\t\t\ttitle: draggingResource.title\n\t\t\t\t};\n\t\t\t\tif (draggingResource.settings) res.settings = draggingResource.settings;\n\t\t\t}\n\n\t\t\t_.extend(res, {\n\t\t\t\tlocked: draggingResource.locked,\n\t\t\t\tactivationDate: draggingResource.activationDate\n\t\t\t});\n\n\t\t\tif (!res.path || !_this19.tasks.get(res.resource) && !_this19.resources.get(res.resources) || !localMethods.isSibling(_this19.model.get(\"path\"), res.path)) {\n\t\t\t\tvar maxTask = _this19.tasks.last();\n\t\t\t\tvar maxResource = _this19.resources.last();\n\n\t\t\t\tif (!maxTask && !maxResource) res.path = _this19.model.get(\"path\") + \".AAA\";else if (!maxResource) res.path = localMethods.getNextPath(maxTask.get(\"path\"));else if (!maxTask) res.path = localMethods.getNextPath(maxResource.get(\"path\"));else if (localMethods.isAfter(maxTask.get(\"path\"), maxResource.get(\"path\"))) res.path = localMethods.getNextPath(maxResource.get(\"path\"));else res.path = localMethods.getNextPath(maxTask.get(\"path\"));\n\t\t\t}\n\n\t\t\tres.isTask = task;\n\n\t\t\tif (move) _this19.moveResource(res);else _this19.addResource(res);\n\t\t};\n\n\t\t//if (data && data.type === \"resource\" && data.resourceModel) {\n\t\t// Check tasks and resources\n\t\tvar resources = task ? this.tasks.models : this.resources.models;\n\n\t\tvar resource = draggingResource.resource ? draggingResource.resource : draggingResource._id;\n\t\tvar id = draggingResource.path ? draggingResource._id : null;\n\n\t\t// Are we already in the process of saving the same item?\n\t\tif (!this.contentSaveMap) this.contentSaveMap = {};\n\n\t\tif (resource in this.contentSaveMap) this.ui.errors.html(\"<span class=\\\"error\\\">That resource has already been attached and is still saving</span>\");\n\n\t\tvar duplicates = _.find(resources, function (model) {\n\t\t\tif (model.get(\"resource\") === resource && (!id || id !== model.id)) return true;\n\t\t});\n\n\t\tif (duplicates) {\n\t\t\tif (!draggingResource._id) return;\n\n\t\t\tvar modal = new SmallModal({\n\t\t\t\twarning: true,\n\t\t\t\tcustomOK: \"Close\",\n\t\t\t\thideButtons: [\"cancel\"],\n\t\t\t\tbody: \"The resource already exists in \" + (task ? \"tasks\" : \"additional resources\") + \".\",\n\t\t\t\ttitle: \"Duplicate resource: \" + draggingResource.title.replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t\t}),\n\t\t\t\thost: \"#link-resources\"\n\t\t\t});\n\t\t\tmodal.show();\n\t\t\treturn true;\n\t\t}\n\n\t\tif (draggingResource.category === \"assessment\") {\n\t\t\tvar _modal = new AssessmentPrompt({\n\t\t\t\tinlineMessage: \"\",\n\t\t\t\thost: \"#link-resources\",\n\t\t\t\tresource: new ResourceModel(draggingResource)\n\t\t\t});\n\n\t\t\t_modal.once(\"action\", function (action, settingsModel) {\n\t\t\t\tif (action === \"ok\") {\n\t\t\t\t\tdraggingResource.settings = {\n\t\t\t\t\t\tserverSave: settingsModel.save,\n\t\t\t\t\t\ttitle: settingsModel.instanceName,\n\t\t\t\t\t\trequireCode: settingsModel.requireCode,\n\t\t\t\t\t\tcode: settingsModel.requireCode ? settingsModel.code : undefined,\n\t\t\t\t\t\tdisableRandomization: settingsModel.disableRandomization,\n\t\t\t\t\t\thideCompleteButtons: settingsModel.hideCompleteButtons,\n\t\t\t\t\t\tdisableResult: settingsModel.disableResult\n\t\t\t\t\t};\n\n\t\t\t\t\tif (settingsModel.activationType === \"specific\") draggingResource.activationDate = moment(settingsModel.startDate + \" \" + settingsModel.startTime, dateFormat).unix();else draggingResource.activationDate = null;\n\n\t\t\t\t\t// No perpetual locking for assessments at all\n\t\t\t\t\tdraggingResource.locked = false;\n\n\t\t\t\t\tfinalizeDrop();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t_modal.show();\n\t\t} else {\n\t\t\tfinalizeDrop();\n\t\t}\n\t},\n\n\taddResource: function addResource(resource) {\n\t\tvar _this20 = this;\n\n\t\tresource.groups = eventBus.request(eventBus.Events.GetCurrentGroups);\n\t\t_.extend(resource, {\n\t\t\tdueDate: resource.isTask ? resource.dueDate : null,\n\t\t\tvisible: this.model.get(\"visible\"),\n\t\t\tlocked: this.model.get(\"locked\") || resource.locked,\n\t\t\tactivationDate: this.model.get(\"activationDate\") || resource.activationDate || null,\n\t\t\tparentLocked: this.model.get(\"parentLocked\"),\n\t\t\tparentActivation: this.model.get(\"parentActivation\"),\n\t\t\tparentVisible: this.model.get(\"parentVisible\")\n\t\t});\n\n\t\tif (resource.locked || !resource.locked && resource.activationDate && resource.activationDate < moment().unix()) resource.activationDate = null;\n\n\t\tvar resourceModel = new ResourceModel(resource);\n\n\t\t// Update the cache of pre-saved items\n\t\tif (!this.contentSaveMap) this.contentSaveMap = {};\n\n\t\tthis.contentSaveMap[resource._id] = true;\n\n\t\tif (resource.isTask) this.tasks.add(resourceModel);else this.resources.add(resourceModel);\n\n\t\tdraggingResource = null;\n\n\t\tresourceModel.save(null, {\n\t\t\tsuccess: function success() {\n\t\t\t\tdelete _this20.contentSaveMap[resource._id];\n\n\t\t\t\t_this20.reorderContent(resourceModel);\n\n\t\t\t\teventBus.trigger(eventBus.Events.AttachmentAdded, resourceModel);\n\t\t\t},\n\t\t\terror: function error(e) {\n\t\t\t\tif (resource.isTask) _this20.tasks.remove(resourceModel);else _this20.resources.remove(resourceModel);\n\n\t\t\t\tdelete _this20.contentSaveMap[resource._id];\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t});\n\t},\n\n\tmoveResource: function moveResource(resource) {\n\t\tvar _this21 = this;\n\n\t\tvar resourceModel = draggingResource.view.model;\n\n\t\tvar oldPath = resourceModel.get(\"path\");\n\t\tvar newPath = resource.path;\n\n\t\tvar isSibling = localMethods.isSibling(oldPath, newPath);\n\n\t\tvar opts = {\n\t\t\tpath: resource.path,\n\t\t\tisTask: resource.isTask,\n\t\t\tdueDate: resource.isTask ? resourceModel.get(\"dueDate\") : null,\n\t\t\tvisible: resource.visible,\n\t\t\tlocked: resource.locked,\n\t\t\tactivationDate: resource.activationDate,\n\t\t\tparentLocked: resource.parentLocked,\n\t\t\tparentActivation: resource.parentActivation,\n\t\t\tparentVisible: resource.parentVisible\n\t\t};\n\n\t\tif (!isSibling) {\n\t\t\t// If we're moving this resource to a new topic, we override the following values differently\n\t\t\t// The parent node for a resource is this node\n\t\t\t_.extend(opts, {\n\t\t\t\tvisible: this.model.get(\"visible\"),\n\t\t\t\tlocked: this.model.get(\"locked\"),\n\t\t\t\tactivationDate: this.model.get(\"activationDate\"),\n\t\t\t\tparentLocked: this.model.get(\"locked\"),\n\t\t\t\tparentActivation: this.model.get(\"activationDate\"),\n\t\t\t\tparentVisible: this.model.get(\"visible\")\n\t\t\t});\n\t\t}\n\n\t\tif (opts.locked || !opts.locked && opts.activationDate && opts.activationDate < moment().unix()) opts.activationDate = null;\n\n\t\t// Update the cache of pre-saved items\n\t\tif (!this.contentSaveMap) this.contentSaveMap = {};\n\n\t\tthis.contentSaveMap[resource._id] = true;\n\n\t\tvar localMove = void 0;\n\n\t\tif (!isSibling) draggingResource.view.model.set({ moving: true });\n\n\t\tif (resource.isTask) {\n\t\t\tlocalMove = this.resources.remove(resourceModel);\n\t\t\tthis.tasks.add(resourceModel);\n\t\t} else {\n\t\t\tlocalMove = this.tasks.remove(resourceModel);\n\t\t\tthis.resources.add(resourceModel);\n\t\t}\n\n\t\tvar oldDR = draggingResource;\n\t\tdraggingResource = null;\n\n\t\tresourceModel.save(opts, {\n\t\t\tpatch: true,\n\t\t\tsuccess: function success() {\n\t\t\t\tdelete _this21.contentSaveMap[resource._id];\n\n\t\t\t\tif (!isSibling) {\n\t\t\t\t\t// If not siblings, remove it from the old parent\n\t\t\t\t\toldDR.view.trigger(Events.RemoveContentFromParent, resourceModel);\n\t\t\t\t}\n\n\t\t\t\t_this21.reorderContent(resourceModel);\n\n\t\t\t\teventBus.trigger(eventBus.Events.AttachmentAdded, resourceModel, { oldPath: oldPath, newPath: newPath });\n\t\t\t},\n\t\t\terror: function error(e) {\n\t\t\t\tif (!isSibling) oldDR.view.model.set({ moving: false });\n\n\t\t\t\tif (resource.isTask) {\n\t\t\t\t\tif (localMove) _this21.resources.add(resourceModel);\n\t\t\t\t\t_this21.tasks.remove(resourceModel);\n\t\t\t\t} else {\n\t\t\t\t\tif (localMove) _this21.tasks.add(resourceModel);\n\t\t\t\t\t_this21.resources.remove(resourceModel);\n\t\t\t\t}\n\n\t\t\t\tdelete _this21.contentSaveMap[resource._id];\n\n\t\t\t\tconsole.error(e);\n\t\t\t}\n\t\t});\n\t},\n\n\treorderContent: function reorderContent(model) {\n\t\tvar _this22 = this;\n\n\t\tvar ucp = model.get(\"updatedChildPaths\") || [];\n\t\tif (ucp.length === 0) return;\n\n\t\tif (this.children.length) return this.reloadNode();\n\n\t\t_.each(ucp, function (x) {\n\t\t\tvar item = _this22.resources.get(x._id) || _this22.tasks.get(x._id);\n\t\t\tif (item) item.set({ path: x.path });\n\t\t});\n\n\t\tthis.tasks.sort();\n\t\tthis.resources.sort();\n\n\t\tthis.model.unset(\"updatedChildPaths\");\n\t},\n\n\taddSiblingNode: function addSiblingNode(m) {\n\t\tthis.onAddChildNodeBtn(null, true, m);\n\t},\n\n\tonAddChildNodeBtn: function () {\n\t\tvar _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee(e, sibling, sourceModel) {\n\t\t\tvar nextChildPath, newChildData, opts;\n\t\t\treturn _regenerator2.default.wrap(function _callee$(_context) {\n\t\t\t\twhile (1) {\n\t\t\t\t\tswitch (_context.prev = _context.next) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tif (e) e.stopPropagation();\n\n\t\t\t\t\t\t\tif (!(!this.children.length && !sibling)) {\n\t\t\t\t\t\t\t\t_context.next = 3;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn _context.abrupt(\"return\", this.trigger(Events.AddSiblingNode, this.model));\n\n\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\tnextChildPath = this.children.length ? sourceModel ? localMethods.getNextPath(sourceModel.get(\"path\")) : this.children.first().get(\"path\") : this.model.get(\"path\") + \".AAA\";\n\n\t\t\t\t\t\t\tif (nextChildPath) {\n\t\t\t\t\t\t\t\t_context.next = 6;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthrow new Error(\"Unable to generate path for new child node\");\n\n\t\t\t\t\t\tcase 6:\n\t\t\t\t\t\t\tnewChildData = new NodeModel({\n\t\t\t\t\t\t\t\tpath: nextChildPath,\n\t\t\t\t\t\t\t\tcategory: \"node\",\n\t\t\t\t\t\t\t\teditMode: true,\n\t\t\t\t\t\t\t\tlearning_path: this.model.get(\"learning_path\"),\n\t\t\t\t\t\t\t\tdepth: this.model.get(\"depth\") + 1,\n\t\t\t\t\t\t\t\tgroups: [lpRadio.request(Events.GetPrimaryGroup)],\n\t\t\t\t\t\t\t\tvisible: this.model.get(\"visible\"),\n\t\t\t\t\t\t\t\tlocked: this.model.get(\"locked\"),\n\t\t\t\t\t\t\t\tactivationDate: this.model.get(\"activationDate\")\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (!this.model.get(\"isCollapsed\")) {\n\t\t\t\t\t\t\t\t_context.next = 10;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_context.next = 10;\n\t\t\t\t\t\t\treturn this.collapseNode(false);\n\n\t\t\t\t\t\tcase 10:\n\t\t\t\t\t\t\topts = { at: 0 };\n\n\t\t\t\t\t\t\tif (sourceModel) opts.at = this.children.indexOf(sourceModel) + 1;\n\n\t\t\t\t\t\t\tthis.children.add(newChildData, opts);\n\n\t\t\t\t\t\tcase 13:\n\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\treturn _context.stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, _callee, this);\n\t\t}));\n\n\t\tfunction onAddChildNodeBtn(_x, _x2, _x3) {\n\t\t\treturn _ref.apply(this, arguments);\n\t\t}\n\n\t\treturn onAddChildNodeBtn;\n\t}(),\n\n\tpromoteSiblingNode: function () {\n\t\tvar _ref2 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee2(node, position) {\n\t\t\treturn _regenerator2.default.wrap(function _callee2$(_context2) {\n\t\t\t\twhile (1) {\n\t\t\t\t\tswitch (_context2.prev = _context2.next) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tif (!this.model.get(\"isCollapsed\")) {\n\t\t\t\t\t\t\t\t_context2.next = 3;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_context2.next = 3;\n\t\t\t\t\t\t\treturn this.collapseNode(false);\n\n\t\t\t\t\t\tcase 3:\n\n\t\t\t\t\t\t\t// Add it after the node we dropped onto\n\t\t\t\t\t\t\tthis.children.add(node, { at: this.children.indexOf(position) + 1 });\n\n\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\treturn _context2.stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, _callee2, this);\n\t\t}));\n\n\t\tfunction promoteSiblingNode(_x4, _x5) {\n\t\t\treturn _ref2.apply(this, arguments);\n\t\t}\n\n\t\treturn promoteSiblingNode;\n\t}(),\n\n\tshowOverlay: function showOverlay(type) {\n\t\t//Accepts \"saving\", \"nodrop\"\n\t\t//Add more if required\n\t\t$(\".overlay-message\", this.ui.overlay).addClass(\"hide\");\n\t\tthis.ui.overlay.removeClass(\"hide\");\n\n\t\tif (type) this.ui[\"overlay\" + _.upperFirst(type)].removeClass(\"hide\");\n\t},\n\n\thideOverlay: function hideOverlay() {\n\t\tthis.ui.overlay.addClass(\"hide\");\n\t},\n\n\tstartNodeDrag: function startNodeDrag(e) {\n\t\tvar _this23 = this;\n\n\t\te.stopPropagation();\n\n\t\tif (this.model.isNew() || !canEdit() || this.model.get(\"editMode\")) return;\n\n\t\tif (window.getSelection) {\n\t\t\tif (window.getSelection().empty) window.getSelection().empty(); //Chrome\n\t\t\telse if (window.getSelection().removeAllRanges) window.getSelection().removeAllRanges(); //Firefox\n\t\t\t\telse if (document.selection) document.selection.empty(); //IE\n\t\t}\n\n\t\tvar draggingNode = new DraggingElement({ model: this.model }).render();\n\t\tvar draggingElement = draggingNode.$el[0];\n\n\t\tdraggingElement.style.position = \"absolute\";\n\t\tdraggingElement.style.zIndex = 1000;\n\n\t\tthis.showOverlay(\"nodrop\");\n\n\t\tlpRadio.trigger(Events.NodeDragStart, this);\n\n\t\t$(\"body\").append(draggingElement);\n\n\t\tvar moveAt = function moveAt(event) {\n\t\t\tlpRadio.trigger(Events.NodeDragMove, event);\n\t\t\tdraggingElement.style.left = event.pageX + \"px\";\n\t\t\tdraggingElement.style.top = event.pageY + \"px\";\n\t\t};\n\n\t\tmoveAt(e);\n\n\t\t$(\"body\").on(\"mousemove.draggingNode\", moveAt);\n\n\t\t$(\"body\").one(\"mouseup.endDrag\", function (event) {\n\t\t\tevent.stopPropagation();\n\n\t\t\t$(\"body\").off(\"mousemove.draggingNode\");\n\t\t\tdraggingElement.parentNode.removeChild(draggingElement);\n\n\t\t\tvar elems = $(\"div.overlay-message.nodrop, div.lp-node:visible, div.droppable.show\").get();\n\n\t\t\tvar x = event.originalEvent.clientX;\n\t\t\tvar y = event.originalEvent.clientY - (_this23.fullscreened ? -45 : 0) + $(\".learning_path-manager .tree:first\").get(0).scrollTop + window.pageYOffset;\n\n\t\t\tvar actual = _.find(elems, function (item) {\n\t\t\t\tvar element = $(item);\n\n\t\t\t\tif (!element.isInViewport()) return;\n\n\t\t\t\tvar offset = element.offset();\n\n\t\t\t\treturn y >= offset.top && y <= offset.top + element.outerHeight(true) && x >= offset.left && x <= offset.left + element.outerWidth(true);\n\t\t\t});\n\n\t\t\tif (actual && !$(actual).hasClass(\"nodrop\")) {\n\t\t\t\tif ($(actual).hasClass(\"droppable\")) actual = $(actual).next(\"div.lp-node\")[0] || $(actual).prev(\"div.lp-node\")[0];\n\n\t\t\t\t$(actual).trigger(\"dropnode\");\n\t\t\t}\n\n\t\t\tlpRadio.trigger(Events.NodeDragEnd, _this23);\n\t\t\t_this23.model.set({ selected: false });\n\t\t});\n\t},\n\n\tonNodeDragStart: _.constant(false),\n\n\tnodeDragListen: function nodeDragListen() {\n\t\tvar _this24 = this;\n\n\t\tthis.ui.node.on(\"mousemove.dragOver\", function (e) {\n\t\t\tlpRadio.trigger(Events.NodeDragOver, e, _this24);\n\t\t});\n\t},\n\n\tresourceDragListen: function resourceDragListen() {\n\t\tvar _this25 = this;\n\n\t\tthis.ui.node.on(\"mousemove.dragOver\", function (e) {\n\t\t\tlpRadio.trigger(Events.NodeDragOver, e, _this25);\n\n\t\t\tif (draggingResource && !_this25.tasks.length) {\n\t\t\t\t_this25.ui.tasksContainer.removeClass(\"hide\");\n\t\t\t\t_this25.ui.fakeTask.removeClass(\"hide\");\n\t\t\t}\n\n\t\t\tif (draggingResource && !_this25.resources.length) {\n\t\t\t\t_this25.ui.resourcesContainer.removeClass(\"hide\");\n\t\t\t\t_this25.ui.fakeResource.removeClass(\"hide\");\n\t\t\t}\n\t\t});\n\t},\n\n\tresourceDragEnd: function resourceDragEnd() {\n\t\tthis.checkAttachmentContainers();\n\t},\n\n\tnodeDropped: function nodeDropped() {\n\t\tif (this.model.isNew() || draggingResource) return;\n\n\t\tvar dropChild = this.model.get(\"dropChild\");\n\t\tvar dropPosition = this.model.get(\"dropPosition\");\n\t\tthis.model.set({ showDropIndicator: false, dropChild: false, dropPosition: \"\" });\n\n\t\tif (dropPosition === \"above\") return this.trigger(Events.NodeDropAbove, dropChild, this.model);\n\n\t\tif (dropChild) return lpRadio.trigger(Events.ChildDrop, this);\n\n\t\treturn lpRadio.trigger(Events.SiblingDrop, this);\n\t},\n\n\tnodeDroppedAbove: function nodeDroppedAbove(dropChild, srcModel) {\n\t\tvar index = this.model._children.indexOf(srcModel);\n\t\tvar childrenView = this.getChildView(\"children\");\n\t\tif (index > 0) {\n\t\t\tvar previousModel = this.model._children.at(index - 1);\n\t\t\tvar previousView = childrenView.children.findByModel(previousModel);\n\n\t\t\tpreviousView.model.set({ dropChild: dropChild });\n\t\t\tpreviousView.ui.node.trigger(\"dropnode\");\n\t\t} else if (index === 0) {\n\t\t\tif (dropChild) {\n\t\t\t\tthis.model.set({ dropChild: dropChild });\n\t\t\t\tthis.model.set({ dropFirstChild: true });\n\t\t\t\tthis.ui.node.trigger(\"dropnode\");\n\t\t\t} else {\n\t\t\t\tvar _previousModel = this.model._children.at(index);\n\t\t\t\tvar _previousView = childrenView.children.findByModel(_previousModel);\n\n\t\t\t\t_previousView.model.set({ dropFirstChild: true });\n\t\t\t\t_previousView.ui.node.trigger(\"dropnode\");\n\t\t\t}\n\t\t}\n\t},\n\n\tnodeDragEnded: function nodeDragEnded() {\n\t\tthis.ui.node.off(\"mousemove.dragOver\");\n\n\t\tif (!draggingResource) {\n\t\t\tthis.model.set({ showDropIndicator: false, dropChild: false });\n\t\t\tthis.hideOverlay();\n\t\t}\n\t},\n\n\tonAttachmentAdded: function onAttachmentAdded(model, paths) {\n\t\tvar path = this.model.get(\"path\");\n\t\tif (paths && paths.oldPath && (path === paths.oldPath.split(\".\")[0] || path === paths.oldPath.split(\".\")[0]) || path === model.get(\"path\").split(\".\")[0]) this.updateBrainScore();\n\t},\n\n\tonAttachmentRemoved: function onAttachmentRemoved(model) {\n\t\tif (model.get(\"path\") && this.model.get(\"path\") === model.get(\"path\").split(\".\")[0]) this.updateBrainScore();\n\t},\n\n\tupdateBrainScore: function updateBrainScore() {\n\t\t$.ajax({\n\t\t\turl: settings.urlRoot + \"/acacia/learningPaths/item/mbeScore/\" + this.model.get(\"_id\"),\n\t\t\tsuccess: this.fetchBrainScoreSuccess.bind(this),\n\t\t\terror: function error(response) {\n\t\t\t\tconsole.error(response);\n\t\t\t}\n\t\t});\n\t},\n\n\tfetchBrainScoreSuccess: function fetchBrainScoreSuccess(response) {\n\t\tthis.model.set(\"mbe_score\", response.mbe_score);\n\t\tthis.showChildView(\"content\", new TreeContent({ model: this.model }));\n\t\tthis.setBrainTippy();\n\t},\n\n\tsetBrainTippy: function setBrainTippy() {\n\t\ttippy(this.$el.get(0).querySelectorAll(\".mbe-brain\"), {\n\t\t\ttheme: \"light-grey\",\n\t\t\ttrigger: \"click\",\n\t\t\tduration: 0,\n\t\t\tanimation: \"fade\",\n\t\t\tplacement: \"right\",\n\t\t\tflip: false,\n\t\t\tarrow: true,\n\t\t\tdistance: 25,\n\t\t\tcontent: \"<div class=\\\"brain-explanation\\\">This indicates how well you make use of the Mind, Brain, and Education Power Strategies for students to get the most out of your learning path.\\n\\t\\t\\t\\tMore colours and a fuller brain = a better learning experience for your students.</div>\",\n\t\t\tonShow: function onShow(instance) {\n\t\t\t\tdocument.querySelectorAll(\".mbe-brain\").forEach(function (popper) {\n\t\t\t\t\tif (popper !== instance.popper && popper._tippy) popper._tippy.hide();\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t},\n\n\tonRemoveLPItems: function onRemoveLPItems() {\n\t\tif (!this.tasks.length) {\n\t\t\tthis.ui.tasksContainer.addClass(\"hide\");\n\t\t\tthis.ui.fakeTask.addClass(\"hide\");\n\t\t}\n\n\t\tif (!this.resources.length) {\n\t\t\tthis.ui.resourcesContainer.addClass(\"hide\");\n\t\t\tthis.ui.fakeResource.addClass(\"hide\");\n\t\t}\n\t}\n});\n\nTreeContent = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"tree-content\",\n\ttemplate: require(\"../../templates/console/learningPathNode.nunj\").lpNodeContent,\n\n\tbehaviors: [Tags],\n\n\tui: {\n\t\toptions: \".options-btn\",\n\t\tcollapseBtn: \".collapse-control:not(.disabled)\",\n\t\tbrain: \".mbe-brain\",\n\t\tdescription: \".description-container\",\n\t\tmoreDesc: \".more-desc\",\n\t\tpageRange: \".pages\",\n\t\ttitle: \"div.title\",\n\n\t\tactivationContainer: \".activation-container\",\n\n\t\tlockIndicator: \".lock-indicator\",\n\t\tvisibilityIndicator: \".visibility-indicator\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.options\": \"onOptionsClick\",\n\t\t\"click @ui.collapseBtn\": \"onCollapseBtnClick\",\n\t\t\"click @ui.brain\": \"onBrainClick\",\n\t\t\"click @ui.moreDesc\": \"onToggleDesc\",\n\t\t\"click @ui.pageRange\": \"onPageRangeClick\"\n\t},\n\n\tmodelEvents: {\n\t\t\"change:visible\": \"onVisibleStatusChange\",\n\t\t\"change:locked\": \"onLockedStatusChange\",\n\t\t\"change:activationDate\": \"onLockedStatusChange\",\n\t\t\"change:isCollapsed\": \"onCollapseChange\",\n\t\tinvalid: \"validationFailed\"\n\t},\n\n\tlpRadioEvents: (_lpRadioEvents2 = {}, _defineProperty(_lpRadioEvents2, Events.EditingChange, \"onEditChange\"), _defineProperty(_lpRadioEvents2, Events.EditingStarted, \"editingStart\"), _defineProperty(_lpRadioEvents2, Events.EditingEnded, \"editingEnd\"), _lpRadioEvents2),\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this26 = this;\n\n\t\treturn {\n\t\t\tmaxDescLength: maxDescLength,\n\t\t\tdescLength: this.model.get(\"description\") ? this.model.get(\"description\").length : 0,\n\t\t\tprintActivationDate: function printActivationDate() {\n\t\t\t\treturn moment.unix(_this26.model.get(\"activationDate\")).format(dateFormat);\n\t\t\t},\n\t\t\tgetContrast: function getContrast(c) {\n\t\t\t\treturn _getContrast(c);\n\t\t\t},\n\t\t\tdescription: function description() {\n\t\t\t\treturn _this26.model.get(\"description\") ? _this26.model.get(\"description\").slice(0, maxDescLength) : \"\";\n\t\t\t},\n\t\t\teditingAllowed: canEdit(),\n\t\t\tisLocked: function isLocked() {\n\t\t\t\treturn _this26.model.get(\"locked\") || !_this26.model.get(\"locked\") && _this26.model.get(\"activationDate\") && _this26.model.get(\"activationDate\") > moment().unix();\n\t\t\t},\n\t\t\tisParentLocked: function isParentLocked() {\n\t\t\t\treturn _this26.model.get(\"parentLocked\") || !_this26.model.get(\"parentLocked\") && _this26.model.get(\"parentActivation\") && _this26.model.get(\"parentActivation\") > moment().unix();\n\t\t\t},\n\t\t\thasActivationDate: function hasActivationDate() {\n\t\t\t\treturn _this26.model.get(\"activationDate\") > moment().unix();\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.bindEvents(lpRadio, this.lpRadioEvents);\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tclearTimeout(this.lockInterval);\n\t},\n\n\tonCollapseChange: function onCollapseChange() {\n\t\tif (this.ui.collapseBtn.toggleClass) this.ui.collapseBtn.toggleClass(\"fa-chevron-down fa-chevron-up\");\n\t},\n\n\tonEditChange: function onEditChange(toggle) {\n\t\tif (toggle) this.ui.options.removeClass(\"hide\");else this.ui.options.addClass(\"hide\");\n\t},\n\n\teditingStart: function editingStart(item) {\n\t\tif (item !== this.model.id) this.ui.options.addClass(\"hide\");\n\t},\n\n\teditingEnd: function editingEnd() {\n\t\tif (this.ui.options.removeClass) this.ui.options.removeClass(\"hide\");\n\t},\n\n\tonDomRefresh: function onDomRefresh() {\n\t\tif (currentEditModelId && this.model.id !== currentEditModelId) this.ui.options.addClass(\"hide\");\n\n\t\ttippy(this.$el.get(0).querySelectorAll(\".fa-cog\"), {\n\t\t\tduration: 0,\n\t\t\tanimation: \"fade\",\n\t\t\tplacement: \"top\",\n\t\t\tflip: false,\n\t\t\tarrow: true,\n\t\t\tdistance: 25\n\t\t});\n\n\t\tvar pageRange = this.model.get(\"pageRangeDisplay\") || this.model.get(\"pageRange\");\n\t\tif (pageRange && pageRange[0] && pageRange[1]) {\n\t\t\tthis.ui.pageRange.html(\"<span class=\\\"fal fa-book\\\"></span> Page \" + pageRange[0] + \" - \" + pageRange[1]);\n\t\t\tthis.ui.pageRange.removeClass(\"hide\");\n\t\t}\n\t\tthis.setLockExpiry();\n\t},\n\n\tsetLockExpiry: function setLockExpiry() {\n\t\tvar _this27 = this;\n\n\t\tclearTimeout(this.lockInterval);\n\n\t\tif (this.model.get(\"activationDate\") > moment().unix()) {\n\t\t\tvar wait = this.model.get(\"activationDate\") - moment().unix() + 2;\n\n\t\t\tthis.lockInterval = setTimeout(function () {\n\t\t\t\t_this27.onLockedStatusChange();\n\t\t\t}, wait * 1000);\n\t\t}\n\t},\n\n\tonToggleDesc: function onToggleDesc(evt) {\n\t\tevt.stopPropagation();\n\n\t\tthis.ui.description.html((this.model.get(\"description\") || \"\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(/\\n/g, \"<br/>\"));\n\t},\n\n\tonBrainClick: function onBrainClick(evt) {\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\t},\n\n\tonPageRangeClick: function onPageRangeClick() {\n\t\t$.ajax({\n\t\t\ttype: \"GET\",\n\t\t\turl: settings.urlRoot + \"/acacia/learningPaths/items/\" + this.model.id + \"/getBookPageLink\",\n\t\t\tsuccess: function success(url) {\n\t\t\t\tglobalRadio.trigger(App.Events.Commands.Navigate, settings.urlRoot + \"/console/books/\" + url);\n\t\t\t},\n\t\t\terror: function error() {\n\t\t\t\tglobalRadio.trigger(App.Events.Commands.Toast, {\n\t\t\t\t\tcontent: \"Unable to get URL for page\",\n\t\t\t\t\ticon: \"fa-trash-alt\",\n\t\t\t\t\ticonColour: \"red\",\n\t\t\t\t\thost: \"#link-resources\"\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t},\n\n\tonOptionsClick: function onOptionsClick(e) {\n\t\tvar _this28 = this;\n\n\t\te.stopPropagation();\n\n\t\t// Set the options\n\t\tif (this.model.get(\"visible\")) $(\"a:nth-child(3) i\", this.ui.toolbar).addClass(\"fa-eye-slash\").removeClass(\"fa-eye\").attr(\"title\", \"Hide\");else $(\"a:nth-child(3) i\", this.ui.toolbar).removeClass(\"fa-eye-slash\").addClass(\"fa-eye\").attr(\"title\", \"Show\");\n\n\t\t$(\"body\").trigger(\"click\");\n\n\t\t// Generate the toolbar for the current state\n\t\tthis.ui.options.toolbar({\n\t\t\tcontent: $(\".toolbar\", this.el),\n\t\t\tautoShow: true,\n\t\t\tposition: \"bottom\",\n\t\t\thideOnClick: true,\n\t\t\tcloseOnItemClick: true,\n\t\t\tevent: \"click\",\n\t\t\thost: \"#link-resources\",\n\t\t\tstyle: \"dark\",\n\t\t\tdestroyOnClose: true\n\t\t});\n\n\t\t$(\".learning_path-manager\").one(\"scroll\", function () {\n\t\t\t$(\"body\").trigger(\"click\");\n\t\t});\n\n\t\tthis.ui.options.off(\"toolbarItemClick.main\");\n\t\tthis.ui.options.one(\"toolbarItemClick.main\", function (evt, item) {\n\t\t\tvar data = $(item).data(\"item\");\n\n\t\t\tswitch (data) {\n\t\t\t\tcase \"edit\":\n\t\t\t\t\treturn _this28.onEditClick(evt);\n\t\t\t\tcase \"visibility\":\n\t\t\t\t\treturn _this28.onHideClick(evt);\n\t\t\t\tcase \"delete\":\n\t\t\t\t\treturn _this28.onDeleteClick(evt);\n\t\t\t\tdefault:\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t});\n\t},\n\n\tonEditClick: function onEditClick(e) {\n\t\te.stopPropagation();\n\n\t\tthis.trigger(Events.StartNodeEdit);\n\t},\n\n\tonHideClick: function onHideClick(e) {\n\t\tvar _this29 = this;\n\n\t\te.stopPropagation();\n\n\t\tvar opts = {\n\t\t\tvisible: !this.model.get(\"visible\")\n\t\t};\n\n\t\tif (this.model.get(\"locked\") || !this.model.get(\"locked\") && this.model.get(\"activationDate\") && this.model.get(\"activationDate\") < moment().unix()) opts.activationDate = null;\n\n\t\tvar finaliseSave = function finaliseSave() {\n\t\t\t_this29.model.save(opts, {\n\t\t\t\turl: settings.urlRoot + \"/acacia/learningPaths/items/toggleVisibility/\" + _this29.model.id,\n\t\t\t\twait: true,\n\t\t\t\tpatch: true\n\t\t\t});\n\t\t};\n\n\t\t// Check if there are any children with states that will be overridden\n\t\tif (this.model._children.length || this.model._tasks.length || this.model._resources.length) {\n\t\t\tvar childVisibility = this.model._children.some(function (x) {\n\t\t\t\treturn x.hasVisibility();\n\t\t\t}) || this.model._tasks.some(function (x) {\n\t\t\t\treturn x.hasVisibility();\n\t\t\t}) || this.model._resources.some(function (x) {\n\t\t\t\treturn x.hasVisibility();\n\t\t\t});\n\n\t\t\tif (childVisibility !== opts.visible) {\n\t\t\t\tvar modal = new SmallModal({\n\t\t\t\t\twarning: true,\n\t\t\t\t\tbody: (opts.visible ? \"Showing\" : \"Hiding\") + \" this item will apply the same setting to all resource, task and child items as well. Continue?\",\n\t\t\t\t\ttitle: \"Visibility Override Warning\",\n\t\t\t\t\thost: \"#link-resources\"\n\t\t\t\t});\n\t\t\t\tmodal.show();\n\n\t\t\t\tmodal.on(\"button:ok\", function () {\n\t\t\t\t\treturn finaliseSave();\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tfinaliseSave();\n\t},\n\n\tonVisibleStatusChange: function onVisibleStatusChange() {\n\t\tif (this.model.get(\"visible\")) {\n\t\t\t//this.ui.hideBtn.addClass(\"fa-eye\").removeClass(\"fa-eye-slash\");\n\t\t\t//const node = this.$el.get(0).querySelector(`.title-container ${this.ui.hideBtn.selector}`);\n\t\t\t//node._tippy.setContent(\"Hide\");\n\t\t\tthis.ui.visibilityIndicator.addClass(\"hide\");\n\t\t} else {\n\t\t\t//this.ui.hideBtn.addClass(\"fa-eye-slash\").removeClass(\"fa-eye\");\n\t\t\t//const node = this.$el.get(0).querySelector(`.title-container ${this.ui.hideBtn.selector}`);\n\t\t\t//node._tippy.setContent(\"Show\");\n\t\t\tthis.ui.visibilityIndicator.removeClass(\"hide\");\n\t\t}\n\t},\n\n\tonLockedStatusChange: function onLockedStatusChange() {\n\t\tif (!this.model.get(\"locked\") && (!this.model.get(\"activationDate\") || this.model.get(\"activationDate\") < moment().unix())) this.ui.lockIndicator.addClass(\"hide\");else this.ui.lockIndicator.removeClass(\"hide\");\n\n\t\tif (this.model.get(\"activationDate\") > moment().unix()) {\n\t\t\tthis.ui.activationContainer.removeClass(\"hide\").html(\"<strong>Locked until: </strong> \" + moment.unix(this.model.get(\"activationDate\")).format(dateFormat));\n\t\t} else {\n\t\t\tthis.ui.activationContainer.addClass(\"hide\");\n\t\t}\n\n\t\tthis.setLockExpiry();\n\t},\n\n\tonCollapseBtnClick: function onCollapseBtnClick(e) {\n\t\tif (!canEdit() && !editStates.viewMode) return;\n\n\t\te.stopPropagation();\n\n\t\tthis.trigger(Events.Collapse, this.ui.collapseBtn.hasClass(\"fa-chevron-up\"));\n\t},\n\n\tonDeleteClick: function onDeleteClick(e) {\n\t\tvar _this30 = this;\n\n\t\te.stopPropagation();\n\n\t\tvar modal = new SmallModal({\n\t\t\twarning: true,\n\t\t\ttitle: \"Delete Item\",\n\t\t\tbody: \"This will permanently delete \\\"\" + this.model.get(\"title\") + \"\\\" from this \" + settings.learningPathsCustomName + \".<br/><br/>Are you sure?\"\n\t\t});\n\n\t\tmodal.on(\"button:ok\", function () {\n\t\t\t_this30.model.destroy({\n\t\t\t\twait: true,\n\t\t\t\tsuccess: function success() {\n\t\t\t\t\teventBus.trigger(eventBus.Events.AttachmentRemoved, _this30.model);\n\t\t\t\t\t_this30.destroy();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tmodal.show();\n\t},\n\n\tvalidationFailed: function validationFailed() {\n\t\tvar msg = \"3 There were one or more errors:\\n\";\n\n\t\t_.each(this.model.validationError, function (item) {\n\t\t\tmsg += \"\\n* \" + item;\n\t\t});\n\n\t\tconsole.error(msg);\n\t}\n});\n\nTreeEdit = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"large-12 columns\",\n\ttemplate: require(\"../../templates/console/learningPathNode.nunj\").lpNodeEdit,\n\n\tbehaviors: [Tags],\n\n\tui: {\n\t\tcontrols: \".controls\",\n\t\toptions: \".options-btn\",\n\n\t\tlock: \"input[name='locked']\",\n\t\tlockTime: \".datetime\",\n\t\tactivationDate: \"input[name='date']\",\n\t\tactivationTime: \"input[name='time']\",\n\t\tpageStart: \"select[name='pageStart']\",\n\t\tpageEnd: \"select[name='pageEnd']\",\n\t\ttitleInput: \"input[name='title']\",\n\t\tdescriptionInput: \"textarea[name='description']\",\n\t\tclearActivation: \".clearActivation\",\n\t\tpageRange: \".page-range\",\n\t\tbookLinkBtn: \".book-link-btn\",\n\t\tlinkedBook: \".linked-book\",\n\t\tlinkedBookSpinner: \".linked-book-spinner\",\n\t\tlinkedBookError: \".linked-book-error\",\n\t\tbookTitle: \".linked-book .book-title\",\n\n\t\tcancelNodeEditBtn: \".cancel-node-edit-btn\",\n\t\tsaveNodeEditBtn: \".save-node-edit-btn\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.options\": \"onOptionsClick\",\n\t\t\"change @ui.lock\": \"onLockBtnClick\",\n\n\t\t\"click @ui.clearActivation\": \"onClearActivation\",\n\n\t\t\"click @ui.cancelNodeEditBtn\": \"onCancelNodeEditBtnClick\",\n\t\t\"click @ui.saveNodeEditBtn\": \"onSaveNodeEditBtnClick\",\n\t\t\"click @ui.bookLinkBtn\": \"onBookLinkBtnClick\",\n\t\t\"click @ui.linkedBookError\": \"onLinkedBookErrorClick\"\n\t},\n\n\tmodelEvents: {\n\t\tinvalid: \"validationFailed\"\n\t},\n\n\tlpRadioEvents: (_lpRadioEvents3 = {}, _defineProperty(_lpRadioEvents3, Events.EditingChange, \"onEditChange\"), _defineProperty(_lpRadioEvents3, Events.EditingStarted, \"editingStart\"), _defineProperty(_lpRadioEvents3, Events.EditingEnded, \"editingEnd\"), _lpRadioEvents3),\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this31 = this;\n\n\t\treturn {\n\t\t\tisNew: function isNew() {\n\t\t\t\treturn _this31.model.isNew();\n\t\t\t},\n\t\t\tgetContrast: function getContrast(c) {\n\t\t\t\treturn _getContrast(c);\n\t\t\t},\n\t\t\tisLocked: function isLocked() {\n\t\t\t\treturn _this31.model.get(\"locked\") || !_this31.model.get(\"locked\") && _this31.model.get(\"activationDate\") && _this31.model.get(\"activationDate\") > moment().unix();\n\t\t\t},\n\t\t\tisParentLocked: function isParentLocked() {\n\t\t\t\treturn _this31.model.get(\"parentLocked\") || !_this31.model.get(\"parentLocked\") && _this31.model.get(\"parentActivation\") && _this31.model.get(\"parentActivation\") > moment().unix();\n\t\t\t},\n\t\t\teditingAllowed: canEdit()\n\t\t};\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.bindEvents(lpRadio, this.lpRadioEvents);\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tif (this.pageFetchXHR) this.pageFetchXHR.abort();\n\t\tthis.pageFetchXHR = null;\n\t},\n\n\teditingStart: function editingStart(item) {\n\t\tif (item !== this.model.id) this.ui.options.addClass(\"hide\");\n\t},\n\n\teditingEnd: function editingEnd() {\n\t\tcurrentEditModelId = null;\n\t\tthis.ui.options.removeClass(\"hide\");\n\t},\n\n\tonOptionsClick: function onOptionsClick(e) {\n\t\tvar _this32 = this;\n\n\t\te.stopPropagation();\n\n\t\t// Set the options\n\t\tif (this.model.get(\"visible\")) $(\"a:nth-child(2) i\", this.ui.toolbar).addClass(\"fa-eye-slash\").removeClass(\"fa-eye\").attr(\"title\", \"Hide\");else $(\"a:nth-child(2) i\", this.ui.toolbar).removeClass(\"fa-eye-slash\").addClass(\"fa-eye\").attr(\"title\", \"Show\");\n\n\t\t$(\"body\").trigger(\"click\");\n\n\t\t// Generate the toolbar for the current state\n\t\tthis.ui.options.toolbar({\n\t\t\tcontent: $(\".toolbar\", this.el),\n\t\t\tautoShow: true,\n\t\t\tposition: \"bottom\",\n\t\t\thideOnClick: true,\n\t\t\tcloseOnItemClick: true,\n\t\t\tevent: \"click\",\n\t\t\thost: \"#link-resources\",\n\t\t\tstyle: \"dark\",\n\t\t\tdestroyOnClose: true\n\t\t});\n\n\t\t$(\".learning_path-manager\").one(\"scroll\", function () {\n\t\t\t$(\"body\").trigger(\"click\");\n\t\t});\n\n\t\tthis.ui.options.off(\"toolbarItemClick.main\");\n\t\tthis.ui.options.one(\"toolbarItemClick.main\", function (evt, item) {\n\t\t\tvar data = $(item).data(\"item\");\n\n\t\t\tswitch (data) {\n\t\t\t\tcase \"visibility\":\n\t\t\t\t\treturn _this32.onHideClick(evt);\n\t\t\t\tcase \"delete\":\n\t\t\t\t\treturn _this32.onDeleteClick(evt);\n\t\t\t\tdefault:\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t});\n\t},\n\n\tonEditChange: function onEditChange(toggle) {\n\t\tif (toggle) {\n\t\t\tthis.ui.options.removeClass(\"hide\");\n\t\t\tthis.ui.saveNodeEditBtn.attr(\"disabled\", false);\n\t\t} else {\n\t\t\tthis.ui.options.addClass(\"hide\");\n\t\t\tthis.ui.saveNodeEditBtn.attr(\"disabled\", true);\n\t\t}\n\t},\n\n\tvalidationFailed: function validationFailed() {\n\t\tvar _this33 = this;\n\n\t\t$(\".error\", this.el).remove();\n\t\t_.each(this.model.validationError, function (item, key) {\n\t\t\tvar index = key === \"activationDate\" || key === \"pageEnd\" ? key : key + \"Input\";\n\t\t\t_this33.ui[index].parent().after(\"<span class='error'>\" + item + \"</span>\");\n\t\t\t_this33.ui[index].on(\"change keyup\", _this33.clearError);\n\t\t});\n\t},\n\n\tclearError: function clearError(event) {\n\t\tvar el = $(event.currentTarget);\n\t\tel.parent().parent().find(\".error\").remove();\n\t},\n\n\tonClearActivation: function onClearActivation() {\n\t\tthis.ui.activationDate.val(\"\");\n\t\tthis.ui.activationDate.next(\"input\").val(\"\");\n\t\tthis.ui.activationTime.val(\"\");\n\t\tthis.ui.activationTime.next(\"input\").val(\"\");\n\t},\n\n\tonHideClick: function onHideClick(e) {\n\t\tvar _this34 = this;\n\n\t\te.stopPropagation();\n\n\t\tif (this.model.isNew()) return this.model.set({ visible: !this.model.get(\"visible\") });\n\n\t\tvar opts = { visible: !this.model.get(\"visible\") };\n\n\t\tif (this.model.get(\"locked\") || !this.model.get(\"locked\") && this.model.get(\"activationDate\") && this.model.get(\"activationDate\") < moment().unix()) opts.activationDate = null;\n\n\t\tvar finaliseSave = function finaliseSave() {\n\t\t\t_this34.model.save(opts, {\n\t\t\t\turl: settings.urlRoot + \"/acacia/learningPaths/items/toggleVisibility/\" + _this34.model.id,\n\t\t\t\twait: true,\n\t\t\t\tpatch: true\n\t\t\t});\n\t\t};\n\n\t\t// Check if there are any children with states that will be overridden\n\t\tif (this.model._children.length || this.model._tasks.length || this.model._resources.length) {\n\t\t\tvar childVisibility = this.model._children.some(function (x) {\n\t\t\t\treturn x.hasVisibility();\n\t\t\t}) || this.model._tasks.some(function (x) {\n\t\t\t\treturn x.hasVisibility();\n\t\t\t}) || this.model._resources.some(function (x) {\n\t\t\t\treturn x.hasVisibility();\n\t\t\t});\n\n\t\t\tif (childVisibility !== opts.visible) {\n\t\t\t\tvar modal = new SmallModal({\n\t\t\t\t\twarning: true,\n\t\t\t\t\tbody: (opts.visible ? \"Showing\" : \"Hiding\") + \" this item will apply the same setting to all resource, task and child items as well. Continue?\",\n\t\t\t\t\ttitle: \"Visibility Override Warning\",\n\t\t\t\t\thost: \"#link-resources\"\n\t\t\t\t});\n\t\t\t\tmodal.show();\n\n\t\t\t\tmodal.on(\"button:ok\", function () {\n\t\t\t\t\treturn finaliseSave();\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tfinaliseSave();\n\t},\n\n\tonLockBtnClick: function onLockBtnClick(e) {\n\t\te.stopPropagation();\n\n\t\tif (this.ui.lock.prop(\"checked\")) this.ui.lockTime.removeClass(\"hide\");else this.ui.lockTime.addClass(\"hide\");\n\t},\n\n\tonCancelNodeEditBtnClick: function onCancelNodeEditBtnClick(e) {\n\t\te.stopPropagation();\n\n\t\tthis.trigger(Events.CancelNodeEdit);\n\t\tlpRadio.trigger(Events.EditingEnded);\n\t\tbookPages = null;\n\n\t\tif (this.pageFetchXHR) this.pageFetchXHR.abort();\n\t\tthis.pageFetchXHR = null;\n\n\t\t// If this isn't saved yet, destroy it entirely\n\t\tif (this.model.isNew()) return this.model.destroy();\n\t},\n\n\tonSaveNodeEditBtnClick: function onSaveNodeEditBtnClick(evt) {\n\t\tvar _this35 = this;\n\n\t\tevt.stopPropagation();\n\n\t\tvar _split = (this.ui.activationTime.val() || \"0 0\").split(\" \"),\n\t\t    _split2 = _slicedToArray(_split, 2),\n\t\t    aTimeHr = _split2[0],\n\t\t    aTimeMin = _split2[1];\n\n\t\tvar t = this.ui.activationDate.val() || 0;\n\n\t\tvar aTime = moment(t).local().unix() + parseInt(aTimeHr, 10) * 3600 + parseInt(aTimeMin, 10) * 60;\n\n\t\tvar data = {\n\t\t\ttitle: this.ui.titleInput.val(),\n\t\t\tdescription: this.ui.descriptionInput.val() || \"\",\n\t\t\tactivationDate: this.ui.lock.prop(\"checked\") ? aTime : null,\n\t\t\tpageRange: _.compact([parseInt(this.ui.pageStart.val(), 10), parseInt(this.ui.pageEnd.val(), 10)]),\n\t\t\tlocked: aTime ? false : this.ui.lock.prop(\"checked\")\n\t\t};\n\n\t\tif (data.locked || !data.locked && data.activationDate === this.model.get(\"activationDate\") && data.activationDate && data.activationDate < moment().unix()) data.activationDate = null;\n\n\t\tif (!_.isEmpty(data.pageRange) && !_.isEmpty(bookPages)) {\n\t\t\tvar startBookPage = bookPages[data.pageRange[0] - 1];\n\t\t\tvar endBookPage = bookPages[data.pageRange[1] - 1];\n\t\t\tdata.pageRangeDisplay = [startBookPage.title || startBookPage.page, endBookPage.title || endBookPage.page];\n\t\t\tdata.book = this.model.get(\"book\");\n\t\t} else if (data.pageRange && data.pageRange.length) {\n\t\t\tdata.pageRangeDisplay = _.map(data.pageRange, String);\n\t\t\tdata.book = this.model.get(\"book\");\n\t\t} else {\n\t\t\tdata.pageRangeDisplay = null;\n\t\t\tdata.pageRange = null;\n\t\t\tdata.book = null;\n\t\t}\n\n\t\tvar finaliseSave = function finaliseSave() {\n\t\t\t_this35.model.save(data, {\n\t\t\t\twait: true,\n\t\t\t\tpatch: !_this35.model.isNew(),\n\t\t\t\tsuccess: function success() {\n\t\t\t\t\tbookPages = null;\n\t\t\t\t\t_this35.model.set(\"editMode\", false);\n\t\t\t\t\t_this35.trigger(Events.CompleteNodeEdit);\n\t\t\t\t\tlpRadio.trigger(Events.NodeChange);\n\t\t\t\t\tlpRadio.trigger(Events.EditingEnded);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tif (data.locked || data.activationDate > moment().unix()) {\n\t\t\t// Check if there are any children with lock states that will be overridden\n\t\t\tvar willChange = this.model._children.some(function (x) {\n\t\t\t\treturn x.hasLockDate();\n\t\t\t}) || this.model._tasks.some(function (x) {\n\t\t\t\treturn x.hasLockDate();\n\t\t\t}) || this.model._resources.some(function (x) {\n\t\t\t\treturn x.hasLockDate();\n\t\t\t});\n\n\t\t\tif (willChange) {\n\t\t\t\tvar modal = new SmallModal({\n\t\t\t\t\twarning: true,\n\t\t\t\t\tbody: \"Locking this item will lock all resources, tasks and child items as well. Existing locks will be overridden. Continue?\",\n\t\t\t\t\ttitle: \"Lock Override Warning\",\n\t\t\t\t\thost: \"#link-resources\"\n\t\t\t\t});\n\t\t\t\tmodal.show();\n\n\t\t\t\tmodal.on(\"button:ok\", function () {\n\t\t\t\t\treturn finaliseSave();\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tfinaliseSave();\n\t},\n\n\tonDomRefresh: function onDomRefresh() {\n\t\ttippy(this.$el.get(0).querySelectorAll(\".fa-cog\"), {\n\t\t\tduration: 0,\n\t\t\tanimation: \"fade\",\n\t\t\tplacement: \"top\",\n\t\t\tflip: false,\n\t\t\tarrow: true,\n\t\t\tdistance: 25\n\t\t});\n\n\t\t// Strip the time from the date\n\t\tvar d = this.model.has(\"activationDate\") ? moment.unix(this.model.get(\"activationDate\")).local().hour(0).minute(0).second(0).valueOf() : 0;\n\n\t\tflatpickr(this.ui.activationDate.get(0), {\n\t\t\tdefaultDate: d,\n\t\t\tdateFormat: \"Z\",\n\t\t\taltInput: true,\n\t\t\taltFormat: \"l, J of F, Y\"\n\t\t});\n\n\t\tflatpickr(this.ui.activationTime.get(0), {\n\t\t\tenableTime: true,\n\t\t\tnoCalendar: true,\n\t\t\tdefaultDate: this.model.has(\"activationDate\") ? this.model.get(\"activationDate\") * 1000 : 0,\n\t\t\taltInput: true,\n\t\t\tdateFormat: \"H i\",\n\t\t\taltFormat: \"H:i K\"\n\t\t});\n\t},\n\n\tonRender: function onRender() {\n\t\tif (this.model.get(\"book\")) {\n\t\t\tthis.refreshPageSelectors();\n\t\t\tthis.ui.saveNodeEditBtn.attr(\"disabled\", true);\n\t\t} else {\n\t\t\tthis.ui.bookLinkBtn.removeClass(\"hide\");\n\t\t\tthis.ui.linkedBookSpinner.addClass(\"hide\");\n\t\t}\n\t},\n\n\trefreshPageSelectors: function refreshPageSelectors() {\n\t\tvar _this36 = this;\n\n\t\tif (this.pageFetchXHR) this.pageFetchXHR.abort();\n\n\t\tthis.ui.linkedBookError.addClass(\"hide\");\n\t\tthis.ui.linkedBookSpinner.removeClass(\"hide\");\n\n\t\tthis.pageFetchXHR = $.ajax({\n\t\t\turl: settings.urlRoot + \"/acacia/books/\" + this.model.get(\"book\") + \"/pages\",\n\t\t\tsuccess: function success(response) {\n\t\t\t\t_this36.ui.linkedBookSpinner.addClass(\"hide\");\n\t\t\t\t_this36.ui.saveNodeEditBtn.attr(\"disabled\", false);\n\n\t\t\t\t_this36.pageFetchXHR = null;\n\t\t\t\tbookPages = response.pages;\n\n\t\t\t\tvar pageStart = new Selectra({\n\t\t\t\t\titems: _.sortBy(_.compact(_.map(bookPages, function (page, index) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tkey: index + 1,\n\t\t\t\t\t\t\tvalue: page.title || page.page,\n\t\t\t\t\t\t\tselected: index + 1 === (_this36.model.has(\"pageRange\") && _this36.model.get(\"pageRange\").length > 0 ? _this36.model.get(\"pageRange\")[0] : null)\n\t\t\t\t\t\t};\n\t\t\t\t\t})), \"key\"),\n\t\t\t\t\tplaceholder: \"Start\",\n\t\t\t\t\tsearch: true,\n\t\t\t\t\twidth: \"70px\",\n\t\t\t\t\tddHost: \"#link-resources\"\n\t\t\t\t});\n\n\t\t\t\tvar pageEnd = new Selectra({\n\t\t\t\t\titems: _.sortBy(_.compact(_.map(bookPages, function (page, index) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tkey: index + 1,\n\t\t\t\t\t\t\tvalue: page.title || page.page,\n\t\t\t\t\t\t\tselected: index + 1 === (_this36.model.has(\"pageRange\") && _this36.model.get(\"pageRange\").length > 0 ? _this36.model.get(\"pageRange\")[1] : null)\n\t\t\t\t\t\t};\n\t\t\t\t\t})), \"key\"),\n\t\t\t\t\tplaceholder: \"End\",\n\t\t\t\t\tsearch: true,\n\t\t\t\t\twidth: \"70px\",\n\t\t\t\t\tddHost: \"#link-resources\"\n\t\t\t\t});\n\n\t\t\t\tpageStart.show({ el: _this36.ui.pageStart });\n\t\t\t\tpageEnd.show({ el: _this36.ui.pageEnd });\n\n\t\t\t\t_this36.ui.pageRange.removeClass(\"hide\");\n\t\t\t\t_this36.ui.bookTitle.text(response.title);\n\t\t\t\t_this36.ui.linkedBook.removeClass(\"hide\");\n\t\t\t\t_this36.ui.bookLinkBtn.addClass(\"hide\");\n\t\t\t},\n\t\t\terror: function error(response) {\n\t\t\t\t_this36.ui.linkedBookSpinner.addClass(\"hide\");\n\t\t\t\t_this36.ui.linkedBookError.removeClass(\"hide\");\n\n\t\t\t\t_this36.pageFetchXHR = null;\n\t\t\t\tconsole.error(response);\n\t\t\t}\n\t\t});\n\t},\n\n\tonLinkedBookErrorClick: function onLinkedBookErrorClick(evt) {\n\t\tevt.stopPropagation();\n\t\tthis.refreshPageSelectors();\n\t},\n\n\tonBookLinkBtnClick: function onBookLinkBtnClick() {\n\t\tvar _this37 = this;\n\n\t\tif (this.model.get(\"book\")) {\n\t\t\tthis.ui.pageRange.removeClass(\"hide\");\n\t\t} else {\n\t\t\tvar group = eventBus.request(eventBus.Events.GetCurrentGroup);\n\n\t\t\t$.ajax({\n\t\t\t\turl: settings.urlRoot + \"/acacia/books/getGroupBooks?group=\" + group.get(\"code\"),\n\t\t\t\tsuccess: function success(books) {\n\t\t\t\t\tvar modal = new BookChooserModal({\n\t\t\t\t\t\tbooks: books,\n\t\t\t\t\t\tmodel: new Backbone.Model({\n\t\t\t\t\t\t\t_id: _this37.model.get(\"_id\")\n\t\t\t\t\t\t}),\n\t\t\t\t\t\thost: \"#link-resources\"\n\t\t\t\t\t});\n\n\t\t\t\t\tmodal.show({\n\t\t\t\t\t\tcreate: function create(bookID) {\n\t\t\t\t\t\t\tif (!bookID) return;\n\n\t\t\t\t\t\t\t_this37.model.set(\"book\", bookID);\n\t\t\t\t\t\t\t_this37.refreshPageSelectors();\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcancel: function cancel() {\n\t\t\t\t\t\t\tmodal.destroy();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n\n\tonDeleteClick: function onDeleteClick(e) {\n\t\tvar _this38 = this;\n\n\t\te.stopPropagation();\n\n\t\tvar modal = new SmallModal({\n\t\t\twarning: true,\n\t\t\ttitle: \"Delete Item\",\n\t\t\tbody: \"This will permanently delete \\\"\" + this.model.get(\"title\") + \"\\\" from this \" + settings.learningPathsCustomName + \".<br/><br/>Are you sure?\"\n\t\t});\n\n\t\tmodal.on(\"button:ok\", function () {\n\t\t\t_this38.model.destroy({\n\t\t\t\twait: true,\n\t\t\t\tsuccess: function success() {\n\t\t\t\t\t_this38.deleteResourceNode();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tmodal.show();\n\t}\n});\n\n// ** Resource views **\n\n\nvar ResourceNode = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"resource\",\n\ttemplate: require(\"../../templates/console/learningPathNode.nunj\").resourceNode,\n\n\tbehaviors: [Tags],\n\n\tregions: {\n\t\tedit: \".edit-resource-form\"\n\t},\n\n\tui: {\n\t\tresourceInfo: \".resource-info\",\n\n\t\tcontrols: \".controls\",\n\t\toptions: \".options-btn\",\n\n\t\tactivationDate: \"input[name='date']\",\n\t\tactivationTime: \"input[name='time']\",\n\n\t\teditArea: \".edit-resource-form\",\n\t\tactivationContainer: \".activation-container\",\n\t\tdueContainer: \".due-container\",\n\n\t\toverlay: \".overlay\",\n\t\toverlaySaving: \".overlay .saving\",\n\n\t\tlockIndicator: \".lock-indicator\",\n\t\tvisibilityIndicator: \".visibility-indicator\",\n\t\terrors: \".errors\",\n\t\tprogressIndicator: \".progress-indicator\",\n\n\t\tcheckboxContainer: \".checkbox\",\n\t\tcheckbox: \".checkbox input\",\n\t\tprogressBar: \".upload-progress .progress-bar\",\n\n\t\tcancelButton: \".cancel-btn\",\n\t\terrorButton: \".error-btn\",\n\t\tcustomGroups: \".custom-groups\"\n\t},\n\n\tevents: {\n\t\tclick: \"onResourceClick\",\n\t\t\"click @ui.options\": \"onOptionsClick\",\n\t\t\"mousedown div.info[draggable='true']:first\": \"startResourceDrag\",\n\t\tmousedown: \"startMultiselect\",\n\t\t\"dragstart @ui.resourceInfo\": \"onResourceDragStart\",\n\t\tdropresource: \"onResourceDragDrop\",\n\t\t\"click @ui.checkbox\": \"onCheckboxClick\",\n\t\t\"click @ui.cancelButton\": \"onCancelClick\",\n\t\t\"click @ui.errorButton\": \"onCancelClick\"\n\t},\n\n\tchildViewEvents: (_childViewEvents2 = {}, _defineProperty(_childViewEvents2, Events.CancelNodeEdit, \"cancelNodeEdit\"), _defineProperty(_childViewEvents2, Events.CompleteNodeEdit, \"completeNodeEdit\"), _childViewEvents2),\n\n\tmodelEvents: {\n\t\t\"change:locked\": \"onLockedStatusChange\",\n\t\t\"change:activationDate\": \"onLockedStatusChange\",\n\t\t\"change:dueDate\": \"onDueChange\",\n\t\t\"change:editMode\": \"onEditModeChange\",\n\t\t\"change:visible\": \"onVisibleStatusChange\",\n\t\trequest: \"onSaveBegin\",\n\t\tsync: \"onSaveEnd\",\n\t\terror: \"onSaveError\",\n\t\tinvalid: \"validationFailed\",\n\t\t\"change:parentLocked\": \"onParentLockChange\",\n\t\t\"change:parentActivation\": \"onParentLockChange\",\n\t\t\"change:parentVisible\": \"onParentVisibleChange\",\n\t\t\"change:moving\": \"onMovingChange\",\n\t\t\"change:progress\": \"onProgressChange\",\n\t\t\"change:invisible\": \"onInvisibilityCloak\",\n\t\t\"change:multiselecting\": \"onMultiSelectingChange\",\n\t\t\"change:depth\": \"onDepthChange\",\n\t\t\"upload:progress\": \"onUploadProgress\",\n\t\t\"view:destroy\": \"onViewDestroy\",\n\t\t\"save:success\": \"uploadSuccess\",\n\t\t\"save:error\": \"uploadError\"\n\t},\n\n\tlpRadioEvents: (_lpRadioEvents4 = {}, _defineProperty(_lpRadioEvents4, Events.FocusAttachment, \"focusOnAttachment\"), _defineProperty(_lpRadioEvents4, Events.EditingChange, \"onEditChange\"), _defineProperty(_lpRadioEvents4, Events.EditingStarted, \"editingStart\"), _defineProperty(_lpRadioEvents4, Events.EditingEnded, \"editingEnd\"), _defineProperty(_lpRadioEvents4, Events.ResourceDragListen, \"resourceDragListen\"), _defineProperty(_lpRadioEvents4, Events.ResourceDragEnd, \"resourceDragEnd\"), _defineProperty(_lpRadioEvents4, Events.NodeSelectListen, \"nodeSelectListen\"), _defineProperty(_lpRadioEvents4, Events.NodeSelectEnd, \"nodeSelectEnd\"), _defineProperty(_lpRadioEvents4, Events.RemoveLPItems, \"onRemoveLPItems\"), _lpRadioEvents4),\n\n\tresourceEvents: {\n\t\t\"resource:deleted\": \"onResourceDeleted\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this39 = this;\n\n\t\treturn {\n\t\t\tprintActivationDate: function printActivationDate() {\n\t\t\t\treturn moment.unix(_this39.model.get(\"activationDate\")).format(dateFormat);\n\t\t\t},\n\t\t\tprintDueDate: function printDueDate() {\n\t\t\t\treturn moment.unix(_this39.model.get(\"dueDate\")).format(dateFormat);\n\t\t\t},\n\t\t\tgetContrast: function getContrast(c) {\n\t\t\t\treturn _getContrast(c);\n\t\t\t},\n\t\t\tshowOptions: function showOptions() {\n\t\t\t\treturn canEdit() && !editStates.viewMode || editStates.viewMode && _this39.model.get(\"isTask\") && _this39.model.get(\"progress\") > 0;\n\t\t\t},\n\t\t\tisLocked: function isLocked() {\n\t\t\t\treturn _this39.model.get(\"locked\") || !_this39.model.get(\"locked\") && _this39.model.get(\"activationDate\") && _this39.model.get(\"activationDate\") > moment().unix();\n\t\t\t},\n\t\t\tisParentLocked: function isParentLocked() {\n\t\t\t\treturn _this39.model.get(\"parentLocked\") || !_this39.model.get(\"parentLocked\") && _this39.model.get(\"parentActivation\") && _this39.model.get(\"parentActivation\") > moment().unix();\n\t\t\t},\n\t\t\thasActivationDate: function hasActivationDate() {\n\t\t\t\treturn _this39.model.get(\"activationDate\") > moment().unix();\n\t\t\t},\n\t\t\thasDueDate: function hasDueDate() {\n\t\t\t\treturn _this39.model.get(\"isTask\") && _this39.model.get(\"dueDate\") > moment().unix();\n\t\t\t},\n\t\t\tcompleted: function completed() {\n\t\t\t\treturn _this39.model.get(\"progress\") === 100;\n\t\t\t},\n\t\t\thasError: function hasError() {\n\t\t\t\treturn !_.isNil(_this39.model.get(\"errors\")) && _.values(_this39.model.get(\"errors\")).length > 0;\n\t\t\t},\n\t\t\terrorMessage: this.getErrorMessage(),\n\t\t\tgetGroups: function getGroups() {\n\t\t\t\treturn eventBus.request(eventBus.Events.GetAllowedGroups);\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.bindEvents(lpRadio, this.lpRadioEvents);\n\n\t\tthis.model.set({\n\t\t\tparentLocked: options.parentLocked || false,\n\t\t\tparentActivation: options.parentActivation || null,\n\t\t\tparentVisible: options.parentVisible !== false\n\t\t});\n\n\t\tif (this.model.get(\"resourceType\") === \"assessment\" && this.model.get(\"attachment\")) {\n\t\t\tthis.attachment = new AttachmentModel();\n\t\t\tthis.attachment.url = settings.urlRoot + \"/api/1.0/attachments/resource/\" + this.model.get(\"attachment\");\n\t\t\tthis.attachment.fetch({\n\t\t\t\t//success: this.attachmentFetchSuccess.bind(this),\n\t\t\t\terror: function error(model, xhr) {\n\t\t\t\t\tthis.ui.errors.html(\"<span class=\\\"error\\\"\" + App.parseResponse(xhr).detail + \"</span>\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.percentage = 0;\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tclearTimeout(this.lockInterval);\n\t\tclearTimeout(this.dueInterval);\n\t},\n\n\tonResourceClick: function onResourceClick(e) {\n\t\tif (multiselect || msState) {\n\t\t\te.stopPropagation();\n\n\t\t\tlpRadio.trigger(Events.NodeSelectOver, this.model, !this.model.get(\"multiselecting\"));\n\t\t}\n\t},\n\n\tgetErrorMessage: function getErrorMessage() {\n\t\tif (_.values(this.model.get(\"errors\")).length > 0) {\n\t\t\treturn _.values(this.model.get(\"errors\")).join(\". \") + \" This file will be skipped during the upload. Click error button to remove it from the list.\" + (this.model.get(\"category\") === \"unknown\" ? \" The supported file types are excel, powerpoint, word, video, pdf, audio, image, text, csv flashcard deck.\" : \"\");\n\t\t}\n\n\t\treturn \"\";\n\t},\n\n\tonCheckboxClick: function onCheckboxClick(e) {\n\t\te.stopPropagation();\n\n\t\tlpRadio.trigger(Events.NodeSelectOver, this.model, this.ui.checkbox.prop(\"checked\"));\n\t},\n\n\tonParentLockChange: function onParentLockChange() {\n\t\tthis.model.set({\n\t\t\tlocked: this.model.get(\"parentLocked\"),\n\t\t\tactivationDate: this.model.get(\"parentActivation\")\n\t\t});\n\t},\n\n\tonParentVisibleChange: function onParentVisibleChange() {\n\t\tthis.model.set({\n\t\t\tvisible: this.model.get(\"parentVisible\")\n\t\t});\n\t},\n\n\tonProgressChange: function onProgressChange() {\n\t\tif (canEdit() || editStates.viewMode && this.model.get(\"isTask\") && this.model.get(\"progress\") > 0) {\n\t\t\tthis.ui.options.removeClass(\"hide\");\n\t\t\tthis.ui.progressIndicator.removeClass(\"hide\");\n\t\t} else {\n\t\t\tthis.ui.options.addClass(\"hide\");\n\t\t\tthis.ui.progressIndicator.addClass(\"hide\");\n\t\t}\n\t},\n\n\tonInvisibilityCloak: function onInvisibilityCloak() {\n\t\tif (this.model.get(\"invisible\")) this.$el.addClass(\"hide\");else this.$el.removeClass(\"hide\");\n\t},\n\n\tstartMultiselect: function startMultiselect(e) {\n\t\tvar whitelist = [];\n\t\tif (!multiselect && e.currentTarget !== e.target && !_.some(whitelist, function (x) {\n\t\t\treturn e.target.classList.contains(x);\n\t\t})) return;\n\n\t\te.stopPropagation();\n\n\t\tlpRadio.trigger(Events.MultiselectStart, this.model);\n\t},\n\n\tonMultiSelectingChange: function onMultiSelectingChange() {\n\t\tif (this.model.get(\"multiselecting\")) {\n\t\t\tthis.ui.resourceInfo.addClass(\"multiselecting\");\n\t\t\tthis.ui.checkbox.prop(\"checked\", true);\n\t\t} else {\n\t\t\tthis.ui.resourceInfo.removeClass(\"multiselecting\");\n\t\t\tthis.ui.checkbox.prop(\"checked\", false);\n\t\t}\n\t},\n\n\tnodeSelectListen: function nodeSelectListen() {\n\t\tvar _this40 = this;\n\n\t\tthis.$el.off(\"mousemove.multiselect\");\n\t\tthis.$el.on(\"mousemove.multiselect\", function (e) {\n\t\t\te.stopPropagation();\n\n\t\t\tif (msState === 3) return;\n\n\t\t\titemDragHit = _this40.model.id;\n\n\t\t\tlpRadio.trigger(Events.NodeSelectOver, _this40.model);\n\t\t});\n\t},\n\n\tnodeSelectEnd: function nodeSelectEnd() {\n\t\tthis.$el.off(\"mousemove.multiselect\");\n\t},\n\n\tonOptionsClick: function onOptionsClick(e) {\n\t\tvar _this41 = this;\n\n\t\te.stopPropagation();\n\n\t\tif (this.model.get(\"editMode\")) $(\"a[data-item='edit']\", this.ui.toolbar).addClass(\"hide\");else $(\"a[data-item='edit']\", this.ui.toolbar).removeClass(\"hide\");\n\n\t\t// Set the options\n\t\tif (this.model.get(\"visible\")) $(\"a:nth-child(3) i\", this.ui.toolbar).addClass(\"fa-eye-slash\").removeClass(\"fa-eye\").attr(\"title\", \"Hide\");else $(\"a:nth-child(3) i\", this.ui.toolbar).removeClass(\"fa-eye-slash\").addClass(\"fa-eye\").attr(\"title\", \"Show\");\n\n\t\tif (editStates.viewMode && this.model.get(\"isTask\") && this.model.get(\"progress\") > 0) {\n\t\t\t$(\"a\", this.ui.toolbar).addClass(\"hide\");\n\t\t\t$(\"a[data-item='reset']\", this.ui.toolbar).removeClass(\"hide\");\n\t\t} else if (!editStates.viewMode) {\n\t\t\t$(\"a\", this.ui.toolbar).removeClass(\"hide\");\n\t\t\t$(\"a[data-item='reset']\", this.ui.toolbar).addClass(\"hide\");\n\t\t}\n\n\t\tif (!this.attachment || !(this.attachment.has(\"baseCode\") && (this.attachment.get(\"settings\") || { code: \"\" }).code)) $(\"a[data-item='code']\", this.ui.toolbar).addClass(\"hide\");\n\n\t\t$(\"body\").trigger(\"click\");\n\n\t\t// Generate the toolbar for the current state\n\t\tthis.ui.options.toolbar({\n\t\t\tcontent: $(\".toolbar\", this.el),\n\t\t\tautoShow: true,\n\t\t\tposition: \"bottom\",\n\t\t\thideOnClick: true,\n\t\t\tcloseOnItemClick: true,\n\t\t\tevent: \"click\",\n\t\t\thost: \"#link-resources\",\n\t\t\tstyle: \"dark\",\n\t\t\tdestroyOnClose: true\n\t\t});\n\n\t\t$(\".learning_path-manager\").one(\"scroll\", function () {\n\t\t\t$(\"body\").trigger(\"click\");\n\t\t});\n\n\t\tthis.ui.options.off(\"toolbarItemClick.main\");\n\t\tthis.ui.options.one(\"toolbarItemClick.main\", function (evt, item) {\n\t\t\tevt.stopPropagation();\n\n\t\t\tvar data = $(item).data(\"item\");\n\n\t\t\tswitch (data) {\n\t\t\t\tcase \"edit\":\n\t\t\t\t\treturn _this41.onEditClick(evt);\n\t\t\t\tcase \"visibility\":\n\t\t\t\t\treturn _this41.onHideClick(evt);\n\t\t\t\tcase \"groups\":\n\t\t\t\t\treturn _this41.onGroupClick(evt);\n\t\t\t\tcase \"code\":\n\t\t\t\t\treturn _this41.onShowCodeClick(evt);\n\t\t\t\tcase \"open\":\n\t\t\t\t\treturn _this41.onOpenItemClick(evt);\n\t\t\t\tcase \"delete\":\n\t\t\t\t\treturn _this41.onDeleteClick(evt);\n\t\t\t\tcase \"reset\":\n\t\t\t\t\treturn _this41.onResetClick(evt);\n\t\t\t\tcase \"chart\":\n\t\t\t\t\treturn _this41.onResourceOpenedClick(evt);\n\t\t\t\tdefault:\n\t\t\t\t\treturn;\n\t\t\t}\n\t\t});\n\n\t\t$(\".tool-item[data-item=groups]\").on(\"mouseover\", function () {\n\t\t\t_this41.ui.customGroups.removeClass(\"hide\");\n\t\t});\n\n\t\t$(\".tool-item[data-item=groups]\").on(\"mouseout\", function () {\n\t\t\tsetTimeout(function () {\n\t\t\t\tif (!_this41.showList) _this41.ui.customGroups.addClass(\"hide\");\n\t\t\t}, 5000);\n\t\t});\n\n\t\tthis.ui.customGroups.on(\"mouseover\", function () {\n\t\t\t_this41.showList = true;\n\t\t\t_this41.ui.customGroups.removeClass(\"hide\");\n\t\t});\n\n\t\tthis.ui.customGroups.on(\"mouseout\", function () {\n\t\t\t_this41.showList = false;\n\t\t\t_this41.ui.customGroups.addClass(\"hide\");\n\t\t});\n\t},\n\n\tonResetClick: function onResetClick(e) {\n\t\tvar _this42 = this;\n\n\t\te.stopPropagation();\n\n\t\tif (this.model.get(\"progress\") === null || this.model.get(\"progress\") === 0) return;\n\n\t\tvar modal = new SmallModal({\n\t\t\twarning: true,\n\t\t\ttitle: \"<span class='fal fa-sync-alt'/> Reset User Progress\",\n\t\t\tbody: \"Progress on this item and any sub-items will be reset for the chosen learner.<br/><br/>\\n\\t\\t\\t\\tProvide a comment that will tell the learner why progress was reset.<input type='text' placeholder='Comment'>\",\n\t\t\thost: \"#link-resources\"\n\t\t});\n\n\t\tmodal.on(\"button:ok\", function () {\n\t\t\t// Reset the state for the given item and all children\n\t\t\t$.ajax({\n\t\t\t\tmethod: \"PUT\",\n\t\t\t\tdata: {\n\t\t\t\t\tcomment: $(\"input\", modal.el).val()\n\t\t\t\t},\n\t\t\t\turl: settings.urlRoot + \"/acacia/learningPaths/items/\" + _this42.model.id + \"/state/\" + viewingUser,\n\t\t\t\terror: function error(err) {\n\t\t\t\t\treturn console.error(err);\n\t\t\t\t},\n\t\t\t\tsuccess: function success(data) {\n\t\t\t\t\t_.each(data, function (x) {\n\t\t\t\t\t\treturn taskMap[x._id].set({ progress: 0 });\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tmodal.show();\n\t},\n\n\tonMovingChange: function onMovingChange() {\n\t\tif (this.model.get(\"moving\")) this.showOverlay(\"saving\");else this.hideOverlay();\n\t},\n\n\tvalidationFailed: function validationFailed() {\n\t\tvar msg = \"1 There were one or more errors:\\n\";\n\n\t\t_.each(this.model.validationError, function (item) {\n\t\t\tmsg += \"\\n* \" + item;\n\t\t});\n\n\t\tconsole.error(msg);\n\t},\n\n\tonSaveBegin: function onSaveBegin() {\n\t\tthis.showOverlay(\"saving\");\n\t},\n\n\tonSaveEnd: function onSaveEnd() {\n\t\tthis.hideOverlay();\n\n\t\tthis.ui.resourceInfo.addClass(\"id-\" + this.model.get(\"_id\"));\n\n\t\t// Create a fake attachment so that the UI shows the right option\n\t\tif (!this.attachment && (this.model.get(\"settings\") || {}).code) this.attachment = new Backbone.Model({ baseCode: this.model.get(\"baseCode\"), settings: this.model.get(\"settings\") });\n\t},\n\n\tonSaveError: function onSaveError(model, xhr) {\n\t\tthis.hideOverlay();\n\n\t\tvar message = xhr.responseJSON && (xhr.responseJSON.detail || xhr.responseJSON.info) ? xhr.responseJSON.detail || xhr.responseJSON.info : \"There was an error saving\";\n\n\t\tvar modal = new SmallModal({\n\t\t\twarning: true,\n\t\t\tcustomOK: \"Close\",\n\t\t\thideButtons: [\"cancel\"],\n\t\t\tbody: message,\n\t\t\ttitle: \"Error\",\n\t\t\thost: \"#link-resources\"\n\t\t});\n\n\t\tmodal.show();\n\t},\n\n\tshowOverlay: function showOverlay(type) {\n\t\t//Accepts \"saving\"\n\t\t//Add more if required\n\t\t$(\".overlay-message\", this.ui.overlay).addClass(\"hide\");\n\t\tthis.ui.overlay.removeClass(\"hide\");\n\n\t\tif (type) this.ui[\"overlay\" + _.upperFirst(type)].removeClass(\"hide\");\n\t},\n\n\thideOverlay: function hideOverlay() {\n\t\tthis.ui.overlay.addClass(\"hide\");\n\t},\n\n\tonAttach: function onAttach() {\n\t\tif (this.model.isNew()) this.$el.get(0).scrollIntoView();\n\n\t\tif (this.model.get(\"editMode\")) {\n\t\t\tthis.showChildView(\"edit\", new ResourceEdit({ model: this.model }));\n\t\t\tif (this.startNodeEdit) this.startNodeEdit();\n\t\t}\n\t},\n\n\tonEditChange: function onEditChange(toggle) {\n\t\tif (toggle) {\n\t\t\tif (!currentEditModelId && this.ui.options.removeClass) this.ui.options.removeClass(\"hide\");\n\n\t\t\tthis.model.set({ invisible: false });\n\t\t\tthis.ui.progressIndicator.addClass(\"hide\");\n\n\t\t\treturn;\n\t\t}\n\n\t\tthis.cancelNodeEdit();\n\n\t\tif (!(this.model.get(\"progress\") > 0) || !editStates.viewMode || !this.model.get(\"isTask\")) this.ui.options.addClass(\"hide\");\n\t},\n\n\teditingStart: function editingStart(item) {\n\t\tif (item !== this.model.id) this.ui.options.addClass(\"hide\");\n\t},\n\n\teditingEnd: function editingEnd() {\n\t\tthis.ui.options.removeClass(\"hide\");\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this43 = this;\n\n\t\tthis.onEditChange(canEdit());\n\n\t\tif (this.model.get(\"editMode\") && this.ui.editBtn) _.delay(function () {\n\t\t\treturn _this43.ui.editBtn.click();\n\t\t}, 50);\n\n\t\tBackbone.Marionette.bindEvents(this, eventBus, this.resourceEvents);\n\n\t\tif (this.model.isNew()) this.showOverlay();\n\n\t\tvar d = this.model.get(\"depth\");\n\t\tthis.ui.checkboxContainer.css({ left: \"-\" + (20 + (d - 1) * 30) + \"px\" });\n\n\t\tif (_.values(this.model.get(\"errors\")).length > 0) this.ui.options.remove();\n\t},\n\n\tonDomRefresh: function onDomRefresh() {\n\t\ttippy(this.$el.get(0).querySelectorAll(\".fa-cog\"), {\n\t\t\tduration: 0,\n\t\t\tanimation: \"fade\",\n\t\t\tplacement: \"top\",\n\t\t\tflip: false,\n\t\t\tarrow: true,\n\t\t\tdistance: 25\n\t\t});\n\n\t\ttippy(this.$el.get(0).querySelectorAll(\".upload-btn\"), {\n\t\t\tduration: 0,\n\t\t\tanimation: \"fade\",\n\t\t\tplacement: \"top\",\n\t\t\tflip: false,\n\t\t\tarrow: true,\n\t\t\tdistance: 25\n\t\t});\n\n\t\tthis.setLockExpiry();\n\t\tthis.setDueExpiry();\n\t},\n\n\tsetLockExpiry: function setLockExpiry() {\n\t\tvar _this44 = this;\n\n\t\tclearTimeout(this.lockInterval);\n\n\t\tif (this.model.get(\"activationDate\") > moment().unix()) {\n\t\t\tvar wait = this.model.get(\"activationDate\") - moment().unix() + 2;\n\n\t\t\tthis.lockInterval = setTimeout(function () {\n\t\t\t\t_this44.onLockedStatusChange();\n\t\t\t\t_this44.onLockedChange();\n\t\t\t}, wait * 1000);\n\t\t}\n\t},\n\n\tsetDueExpiry: function setDueExpiry() {\n\t\tvar _this45 = this;\n\n\t\tclearTimeout(this.dueInterval);\n\n\t\tif (this.model.get(\"isTask\") && this.model.get(\"dueDate\") > moment().unix()) {\n\t\t\tvar wait = this.model.get(\"dueDate\") - moment().unix() + 2;\n\t\t\tthis.dueInterval = setTimeout(function () {\n\t\t\t\t_this45.onDueChange();\n\t\t\t}, wait * 1000);\n\t\t}\n\t},\n\n\tonDepthChange: function onDepthChange() {\n\t\t// Reposition some items based on the depth\n\t\tvar d = this.model.get(\"depth\");\n\t\tthis.ui.checkboxContainer.css({ left: \"-\" + (27 + (d - 1) * 30) + \"px\" });\n\t},\n\n\tonEditModeChange: function onEditModeChange() {\n\t\tif (this.model && this.model.get(\"editMode\")) this.ui.resourceInfo.removeAttr(\"draggable\");else this.ui.resourceInfo.attr(\"draggable\", true);\n\t},\n\n\tonDueChange: function onDueChange() {\n\t\tif (this.model.get(\"isTask\") && this.model.get(\"dueDate\") > moment().unix()) {\n\t\t\tthis.ui.dueContainer.removeClass(\"hide\").html(\"<strong>Due on: </strong> \" + moment.unix(this.model.get(\"dueDate\")).format(dateFormat));\n\t\t} else {\n\t\t\tthis.ui.dueContainer.addClass(\"hide\");\n\t\t}\n\n\t\tthis.setDueExpiry();\n\t},\n\n\tonLockedChange: function onLockedChange() {\n\t\tif (!this.model.get(\"locked\") && (!this.model.get(\"activationDate\") || this.model.get(\"activationDate\") < moment().unix())) {\n\t\t\tthis.ui.connector.removeClass(\"locked-connection\");\n\t\t\tthis.ui.lockedLine.addClass(\"hide\");\n\t\t} else {\n\t\t\tthis.ui.connector.addClass(\"locked-connection\");\n\t\t\tthis.ui.lockedLine.removeClass(\"hide\");\n\t\t}\n\n\t\tthis.setLockExpiry();\n\t},\n\n\tonLockedStatusChange: function onLockedStatusChange() {\n\t\tif (!this.model.get(\"locked\") && (!this.model.get(\"activationDate\") || this.model.get(\"activationDate\") < moment().unix())) this.ui.lockIndicator.addClass(\"hide\");else this.ui.lockIndicator.removeClass(\"hide\");\n\n\t\tif (this.model.get(\"activationDate\") > moment().unix()) {\n\t\t\tthis.ui.activationContainer.removeClass(\"hide\").html(\"<strong>Locked until: </strong> \" + moment.unix(this.model.get(\"activationDate\")).format(dateFormat));\n\t\t} else {\n\t\t\tthis.ui.activationContainer.addClass(\"hide\");\n\t\t}\n\n\t\tthis.setLockExpiry();\n\t},\n\n\tonVisibleStatusChange: function onVisibleStatusChange() {\n\t\tif (this.model.get(\"visible\")) {\n\t\t\t//this.ui.hideBtn.addClass(\"fa-eye\").removeClass(\"fa-eye-slash\");\n\t\t\t//const node = this.$el.get(0).querySelector(`${this.ui.hideBtn.selector}`);\n\t\t\t//node._tippy.setContent(\"Hide\");\n\t\t\tthis.ui.visibilityIndicator.addClass(\"hide\");\n\t\t} else {\n\t\t\t//this.ui.hideBtn.addClass(\"fa-eye-slash\").removeClass(\"fa-eye\");\n\t\t\t//const node = this.$el.get(0).querySelector(`${this.ui.hideBtn.selector}`);\n\t\t\t//node._tippy.setContent(\"Show\");\n\t\t\tthis.ui.visibilityIndicator.removeClass(\"hide\");\n\t\t}\n\t},\n\n\tonHideClick: function onHideClick(e) {\n\t\te.stopPropagation();\n\n\t\tif (this.model.isNew()) return this.model.set({ visible: !this.model.get(\"visible\") });\n\n\t\tvar opts = { visible: !this.model.get(\"visible\") };\n\n\t\tif (this.model.get(\"locked\") || !this.model.get(\"locked\") && this.model.get(\"activationDate\") && this.model.get(\"activationDate\") < moment().unix()) opts.activationDate = null;\n\n\t\tthis.model.save(opts, {\n\t\t\turl: settings.urlRoot + \"/acacia/learningPaths/items/toggleVisibility/\" + this.model.id,\n\t\t\twait: true,\n\t\t\tpatch: true\n\t\t});\n\t},\n\n\tdeleteResourceNode: function deleteResourceNode() {\n\t\tthis.destroy();\n\t\tlpRadio.trigger(Events.NodeChange);\n\t\teventBus.trigger(eventBus.Events.AttachmentRemoved, this.model);\n\t},\n\n\tonDeleteClick: function onDeleteClick(e) {\n\t\tvar _this46 = this;\n\n\t\te.stopPropagation();\n\n\t\tvar modal = new SmallModal({\n\t\t\twarning: true,\n\t\t\ttitle: \"Delete Item\",\n\t\t\tbody: \"This will permanently delete \\\"\" + this.model.get(\"title\") + \"\\\" from this \" + settings.learningPathsCustomName + \".<br/><br/>Are you sure?\"\n\t\t});\n\n\t\tmodal.on(\"button:ok\", function () {\n\t\t\t_this46.model.destroy({\n\t\t\t\twait: true,\n\t\t\t\tsuccess: function success() {\n\t\t\t\t\t_this46.deleteResourceNode();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tmodal.show();\n\t},\n\n\tonEditClick: function onEditClick(e) {\n\t\tif (e) e.stopPropagation();\n\n\t\tthis.showChildView(\"edit\", new ResourceEdit({ model: this.model }));\n\n\t\tcurrentEditModelId = this.model.id;\n\t\tif (this.ui.editArea.slideDown) this.ui.editArea.slideDown(400);\n\t\tthis.$el.addClass(\"edit-mode\");\n\t\tthis.model.set({ editMode: true });\n\t\tlpRadio.trigger(Events.EditingStarted, this.model.id);\n\t},\n\n\tcancelNodeEdit: function cancelNodeEdit() {\n\t\tthis.model.set({ editMode: false });\n\t\tcurrentEditModelId = null;\n\t\tif (this.ui.editArea.slideUp) this.ui.editArea.slideUp(400);\n\t\tthis.$el.removeClass(\"edit-mode\");\n\t},\n\n\tcompleteNodeEdit: function completeNodeEdit() {\n\t\tthis.model.set({ editMode: false });\n\t\tthis.ui.editArea.slideUp(400);\n\t\tcurrentEditModelId = null;\n\t\tthis.$el.removeClass(\"edit-mode\");\n\t},\n\n\tstartResourceDrag: function startResourceDrag(e) {\n\t\tvar _this47 = this;\n\n\t\tif (this.model.isNew() || !canEdit() || this.model.get(\"editMode\")) return;\n\n\t\te.stopPropagation();\n\n\t\tif (window.getSelection) {\n\t\t\tif (window.getSelection().empty) window.getSelection().empty(); //Chrome\n\t\t\telse if (window.getSelection().removeAllRanges) window.getSelection().removeAllRanges(); //Firefox\n\t\t\t\telse if (document.selection) document.selection.empty(); //IE\n\t\t}\n\n\t\tvar resourceData = this.model.toJSON();\n\t\tresourceData.view = this;\n\n\t\tvar draggingNode = new DraggingElement({ model: this.model }).render();\n\t\tvar draggingElement = draggingNode.$el[0];\n\n\t\tdraggingElement.style.position = \"absolute\";\n\t\tdraggingElement.style.zIndex = 1000;\n\n\t\tlpRadio.trigger(Events.ResourceDragStart, resourceData);\n\n\t\t$(\"body\").append(draggingElement);\n\n\t\tvar moveAt = function moveAt(event) {\n\t\t\tlpRadio.trigger(Events.NodeDragMove, event);\n\t\t\tdraggingElement.style.left = event.pageX + \"px\";\n\t\t\tdraggingElement.style.top = event.pageY + \"px\";\n\t\t};\n\n\t\tmoveAt(e);\n\t\t$(\"body\").on(\"mousemove.draggingNode\", moveAt);\n\n\t\t//Handle the resource drop\n\t\t$(\"body\").one(\"mouseup.endDrag\", function (event) {\n\t\t\tevent.stopPropagation();\n\t\t\t$(\"body\").off(\"mousemove.draggingNode\");\n\t\t\tdraggingElement.parentNode.removeChild(draggingElement);\n\n\t\t\tvar items = _.concat($(\"div.resource:visible\").get(), $(\"div.task-host:visible\").get(), $(\"div.resource-host:visible\").get());\n\n\t\t\tvar x = event.originalEvent.clientX;\n\t\t\tvar y = event.originalEvent.clientY - (_this47.fullscreened ? -45 : 0) + $(\".learning_path-manager .tree:first\").get(0).scrollTop + window.pageYOffset;\n\n\t\t\tvar actual = _.find(items, function (item) {\n\t\t\t\tvar element = $(item);\n\n\t\t\t\tif (!element.isInViewport()) return;\n\n\t\t\t\tvar offset = element.offset();\n\n\t\t\t\treturn y >= offset.top && y <= offset.top + element.outerHeight(true) && x >= offset.left && x <= offset.left + element.outerWidth(true);\n\t\t\t});\n\n\t\t\tif (actual) $(actual).trigger(\"dropresource\");\n\n\t\t\tlpRadio.trigger(Events.NodeDragEnd, _this47);\n\t\t\tlpRadio.trigger(Events.ResourceDragEnd);\n\t\t});\n\t},\n\n\tresourceDragListen: function resourceDragListen() {\n\t\tvar _this48 = this;\n\n\t\tthis.$el.on(\"mousemove\", function (e) {\n\t\t\tif (draggingResource) {\n\t\t\t\tvar dragY = e.originalEvent.pageY;\n\n\t\t\t\tvar elOffset = _this48.$el.offset();\n\t\t\t\tvar elTop = elOffset.top;\n\t\t\t\tvar height = _this48.$el.outerHeight();\n\n\t\t\t\t$(\"div.resource\").removeClass(\"drop-above drop-below\");\n\n\t\t\t\tif (dragY < elTop + height / 2) {\n\t\t\t\t\t_this48.model.set({ drop: \"above\" });\n\t\t\t\t\t_this48.$el.addClass(\"drop-above\");\n\t\t\t\t} else if (dragY >= elTop + height / 2) {\n\t\t\t\t\t_this48.$el.addClass(\"drop-below\");\n\t\t\t\t\t_this48.model.set({ drop: \"below\" });\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tresourceDragEnd: function resourceDragEnd() {\n\t\tthis.$el.off(\"mousemove\");\n\t\t$(\"div.resource\").removeClass(\"drop-above drop-below\");\n\t},\n\n\tonResourceDragStart: _.constant(false),\n\n\tonResourceDragDrop: function onResourceDragDrop(evt) {\n\t\tvar _this49 = this;\n\n\t\tif (!draggingResource) return;\n\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\t\tthis.trigger(Events.CheckAttachmentContainers);\n\n\t\tif (draggingResource._id === this.model.id) {\n\t\t\tdraggingResource = null;\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle content drop\n\t\tvar finalizeDrop = function finalizeDrop() {\n\t\t\tvar move = draggingResource.path;\n\n\t\t\tvar res = draggingResource;\n\t\t\tif (!move) {\n\t\t\t\tres = {\n\t\t\t\t\tresource: draggingResource._id,\n\t\t\t\t\tlearning_path: _this49.model.get(\"learning_path\"),\n\t\t\t\t\tresourceType: draggingResource.category,\n\t\t\t\t\ttitle: draggingResource.title\n\t\t\t\t};\n\t\t\t\tif (draggingResource.settings) res.settings = draggingResource.settings;\n\t\t\t}\n\n\t\t\t_.extend(res, {\n\t\t\t\tpath: _this49.model.get(\"drop\") === \"above\" ? _this49.model.get(\"path\") : localMethods.getNextPath(_this49.model.get(\"path\")),\n\t\t\t\tisTask: _this49.model.collection && _this49.model.collection.tasks,\n\t\t\t\tvisible: _this49.model.get(\"parentVisible\") ? draggingResource.visible : true,\n\t\t\t\tlocked: _this49.model.get(\"parentLocked\") ? true : draggingResource.locked,\n\t\t\t\tactivationDate: _this49.model.get(\"parentActivation\") || draggingResource.activationDate || null,\n\t\t\t\tparentLocked: _this49.model.get(\"parentLocked\"),\n\t\t\t\tparentActivation: _this49.model.get(\"parentActivation\"),\n\t\t\t\tparentVisible: _this49.model.get(\"parentVisible\")\n\t\t\t});\n\n\t\t\tif (move) _this49.trigger(Events.MoveResource, res);else _this49.trigger(Events.AddResource, res);\n\t\t};\n\n\t\tvar resource = draggingResource.resource ? draggingResource.resource : draggingResource._id;\n\t\tvar id = draggingResource.path ? draggingResource._id : null;\n\n\t\t// Are we already in the process of saving the same item?\n\t\tif (!this.contentSaveMap) this.contentSaveMap = {};\n\n\t\tif (resource in this.contentSaveMap) this.ui.errors.html(\"<span class=\\\"error\\\">That resource has already been attached and is still saving</span>\");\n\n\t\tvar duplicateModal = new SmallModal({\n\t\t\twarning: true,\n\t\t\tcustomOK: \"Close\",\n\t\t\thideButtons: [\"cancel\"],\n\t\t\tbody: \"The resource already exists in \" + (this.model.get(\"isTask\") ? \"tasks\" : \"additional resources\") + \".\",\n\t\t\ttitle: \"Duplicate resource: \" + draggingResource.title.replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t}),\n\t\t\thost: \"#link-resources\"\n\t\t});\n\n\t\tvar resourceType = draggingResource.resourceType || draggingResource.category;\n\t\tif (!_.includes([\"text\", \"url\"], resourceType) && draggingResource.checkSum === this.model.get(\"checkSum\")) {\n\t\t\tduplicateModal.show();\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.model.collection) {\n\t\t\tthis.ui.errors.html(\"<span class=\\\"error\\\">Error: the operation cannot be performed. Please refresh and try again.</span>\");\n\t\t\treturn;\n\t\t}\n\n\t\tvar duplicates = _.filter(this.model.collection.models, function (model) {\n\t\t\tif ((model.get(\"resource\") === resource || !_.includes([\"text\", \"url\"], resourceType) && model.get(\"checkSum\") === draggingResource.checkSum) && (!id || id !== model.id)) return true;\n\t\t\tif (draggingResource.path && localMethods.isSibling(draggingResource.path, _this49.model.get(\"path\"))) return false;\n\n\t\t\treturn false;\n\t\t});\n\n\t\tif (duplicates.length > 0) {\n\t\t\tif (!draggingResource._id) return;\n\n\t\t\tduplicateModal.show();\n\t\t\treturn;\n\t\t}\n\n\t\tif (draggingResource.category === \"assessment\") {\n\t\t\tvar modal = new AssessmentPrompt({\n\t\t\t\tinlineMessage: \"\",\n\t\t\t\thost: \"#link-resources\",\n\t\t\t\tresource: new ResourceModel(draggingResource)\n\t\t\t});\n\n\t\t\tmodal.once(\"action\", function (action, settingsModel) {\n\t\t\t\tif (action === \"ok\") {\n\t\t\t\t\tvar s = {\n\t\t\t\t\t\tserverSave: settingsModel.save,\n\t\t\t\t\t\ttitle: settingsModel.instanceName,\n\t\t\t\t\t\trequireCode: settingsModel.requireCode,\n\t\t\t\t\t\tcode: settingsModel.requireCode ? settingsModel.code : undefined,\n\t\t\t\t\t\tdisableRandomization: settingsModel.disableRandomization,\n\t\t\t\t\t\thideCompleteButtons: settingsModel.hideCompleteButtons,\n\t\t\t\t\t\tdisableResult: settingsModel.disableResult\n\t\t\t\t\t};\n\n\t\t\t\t\tif (settingsModel.activationType === \"specific\") {\n\t\t\t\t\t\tvar activationTime = moment(settingsModel.startDate, \"DD MMM YYYY\").hour(0).minute(0).second(0);\n\t\t\t\t\t\tvar time = moment(settingsModel.startTime, \"h:mma\");\n\t\t\t\t\t\tactivationTime.hour(time.hour()).minute(time.minute()).second(0);\n\n\t\t\t\t\t\ts.activationTime = activationTime.unix();\n\t\t\t\t\t\tdraggingResource.activationDate = s.activationTime;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdraggingResource.activationDate = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Assessments cannot be perma-locked\n\t\t\t\t\tdraggingResource.locked = false;\n\n\t\t\t\t\tdraggingResource.settings = s;\n\n\t\t\t\t\tfinalizeDrop();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tmodal.show();\n\t\t} else {\n\t\t\tfinalizeDrop();\n\t\t}\n\t},\n\n\tfocusOnAttachment: function focusOnAttachment(model) {\n\t\tif ((model._id || model.get(\"_id\")) === this.model.get(\"_id\")) this.$el.get(0).scrollIntoView();\n\t},\n\n\tonResourceDeleted: function onResourceDeleted(model) {\n\t\tif (_.includes(model.attachment_ids, this.model.get(\"attachment\"))) this.deleteResourceNode();\n\t},\n\n\tonGroupClick: function onGroupClick(evt) {\n\t\tvar _this50 = this;\n\n\t\tevt.stopPropagation();\n\n\t\tvar gm = new GroupModal({\n\t\t\tcurrentGroups: this.model.get(\"groups\")\n\t\t});\n\n\t\tgm.show({\n\t\t\tok: function ok(result) {\n\t\t\t\tvar opts = { groups: result.values };\n\n\t\t\t\tif (_this50.model.get(\"locked\") || !_this50.model.get(\"locked\") && _this50.model.get(\"activationDate\") && _this50.model.get(\"activationDate\") < moment().unix()) opts.activationDate = null;\n\n\t\t\t\t_this50.model.save(opts, {\n\t\t\t\t\turl: settings.urlRoot + \"/acacia/learningPaths/items/groups/\" + _this50.model.id,\n\t\t\t\t\twait: true,\n\t\t\t\t\tpatch: true,\n\t\t\t\t\tsuccess: function success() {\n\t\t\t\t\t\t_this50.render();\n\t\t\t\t\t},\n\t\t\t\t\terror: function error(e) {\n\t\t\t\t\t\tconsole.error(e);\n\t\t\t\t\t\t_this50.ui.errors.html(\"<span class=\\\"error\\\">\" + e.message + \"</span>\").delay(15000).fadeOut();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t},\n\n\tonShowCodeClick: function onShowCodeClick(evt) {\n\t\tevt.stopPropagation();\n\n\t\tvar code = this.attachment.get(\"baseCode\").toLowerCase();\n\t\tcode = parseInt(code, 16);\n\n\t\tvar xor = parseInt(this.attachment.get(\"settings\").code, 16);\n\n\t\tvar realCode = (code ^ xor).toString(16).toLowerCase();\n\t\twhile (realCode.length < 6) {\n\t\t\trealCode = \"0\" + realCode;\n\t\t}var modal = new SmallModal({\n\t\t\ttitle: \"<span class='fal fa-key'/> Assessment Activation Code\",\n\t\t\tbody: \"<p>This is the code to activate this specific assessment instance:</p>\\n\\t\\t\\t\\t<p style='letter-spacing: 1.5em; font-size: 1.7em; text-transform: uppercase; text-align: center; background-color: #EEE; border-radius: 3px; color: #000'>\" + realCode + \"</p>\",\n\t\t\thideButtons: [\"cancel\"],\n\t\t\thost: \"#link-resources\"\n\t\t});\n\n\t\tmodal.show();\n\t},\n\n\tonOpenItemClick: function onOpenItemClick(evt) {\n\t\tevt.stopPropagation();\n\n\t\tvar FlashcardModel = Backbone.Model.extend({\n\t\t\tdefaults: {},\n\t\t\tidAttribute: \"_id\",\n\t\t\turlRoot: settings.urlRoot + \"/api/1.0/resources\"\n\t\t});\n\n\t\tswitch (this.model.get(\"resourceType\")) {\n\t\t\tcase \"text\":\n\t\t\tcase \"onenote\":\n\t\t\tcase \"googledrive\":\n\t\t\tcase \"url\":\n\t\t\t\t{\n\t\t\t\t\tvar resource = new ResourceModel({ _id: this.model.get(\"resource\") });\n\t\t\t\t\tresource.fetch({\n\t\t\t\t\t\tsuccess: function success(model) {\n\t\t\t\t\t\t\tvar text = \"\";\n\t\t\t\t\t\t\tif (model.has(\"text\")) text = model.get(\"text\").replace(/\\n/g, \"<br/>\");else text = \"<a target='_blank' href=\\\"\" + model.get(\"url\") + \"\\\">\" + model.get(\"url\") + \"</a>\";\n\n\t\t\t\t\t\t\tvar confirm = new SmallModal({\n\t\t\t\t\t\t\t\tcustomOK: \"Close\",\n\t\t\t\t\t\t\t\thideButtons: [\"cancel\"],\n\t\t\t\t\t\t\t\tbody: text,\n\t\t\t\t\t\t\t\ttitle: \"Viewing Resource: \" + model.get(\"title\").replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\t\t\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\thost: \"#link-resources\"\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tconfirm.show();\n\t\t\t\t\t\t},\n\t\t\t\t\t\terror: function error(model, xhr) {\n\t\t\t\t\t\t\tthis.ui.errors.html(\"<span class=\\\"error\\\">\" + App.parseResponse(xhr).detail + \"</span>\");\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\tcase \"image\":\n\t\t\t\tnew LightBox({\n\t\t\t\t\thost: $(\"#link-resources\"),\n\t\t\t\t\timage: settings.urlRoot + \"/api/1.0/resources/\" + this.model.get(\"resource\") + \"/data\"\n\t\t\t\t}).show();\n\t\t\t\tbreak;\n\n\t\t\tcase \"assessment\":\n\t\t\t\tnew AssessmentModal({\n\t\t\t\t\tmodel: new Assessment({ _id: this.model.get(\"resource\"), questionData: [] }),\n\t\t\t\t\tpreviewMode: true,\n\t\t\t\t\trestart: true\n\t\t\t\t}).show({});\n\t\t\t\tbreak;\n\n\t\t\tcase \"flashcarddeck\":\n\t\t\t\tnew FlashcardPreview({\n\t\t\t\t\tmodel: new FlashcardModel({\n\t\t\t\t\t\t_id: this.model.get(\"resource\")\n\t\t\t\t\t})\n\t\t\t\t}).show();\n\t\t\t\tbreak;\n\n\t\t\tcase \"video\":\n\t\t\tcase \"audio\":\n\t\t\tcase \"pdf\":\n\t\t\tcase \"excel\":\n\t\t\tcase \"word\":\n\t\t\tcase \"powerpoint\":\n\t\t\t\twindow.open(settings.urlRoot + \"/api/1.0/resources/\" + this.model.get(\"resource\") + \"/data\");\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"Unknown resource type to open: \" + this.model.get(\"resourceType\"));\n\t\t}\n\t},\n\n\tonResourceOpenedClick: function onResourceOpenedClick(evt) {\n\t\tevt.stopPropagation();\n\n\t\tvar resourceOpenedModal = new ResourceOpenedModal({ resource: this.model.get(\"resource\"), attachment: this.model.get(\"attachment\"), type: \"learning_path\" });\n\n\t\tresourceOpenedModal.show();\n\t},\n\n\tonUploadProgress: function onUploadProgress(percentage) {\n\t\tif (this.ui.cancelButton.hasClass(\"hide\") && percentage < 90) this.ui.cancelButton.removeClass(\"hide\");\n\n\t\tif (this.percentage <= percentage) {\n\t\t\tthis.ui.progressBar.animate({ width: percentage + \"%\" });\n\t\t\tthis.percentage = percentage;\n\t\t}\n\n\t\tif (percentage === 100) this.ui.progressBar.addClass(\"hide\");\n\t},\n\n\tuploadSuccess: function uploadSuccess() {\n\t\tthis.ui.progressBar.animate({ width: \"100%\" });\n\t\tthis.ui.progressBar.addClass(\"hide\");\n\t\tthis.ui.cancelButton.addClass(\"hide\");\n\t},\n\n\tuploadError: function uploadError(xhr) {\n\t\tthis.ui.progressBar.animate({ width: \"0%\" });\n\t\tthis.ui.errorButton.removeClass(\"hide\");\n\n\t\tvar errors = { error: xhr.responseJSON.info };\n\n\t\tthis.model.set(\"errors\", errors);\n\t\tthis.render();\n\t},\n\n\tonCancelClick: function onCancelClick() {\n\t\tthis.model.trigger(\"upload:cancel\", this.model);\n\t\tthis.destroy();\n\t},\n\n\tonViewDestroy: function onViewDestroy() {\n\t\tthis.destroy();\n\t},\n\n\tonRemoveLPItems: function onRemoveLPItems() {\n\t\tif (this.model.collection) this.model.collection.remove(this.model);\n\t\tthis.deleteResourceNode();\n\t}\n});\n\nResourceEdit = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"large-12 columns\",\n\ttemplate: require(\"../../templates/console/learningPathNode.nunj\").resourceNodeEdit,\n\n\tbehaviors: [Tags],\n\n\tui: {\n\t\tlock: \"input[name='locked']\",\n\t\tlockTime: \".datetime\",\n\t\tactivationDate: \".datetime input[name='date']\",\n\t\tactivationTime: \".datetime input[name='time']\",\n\t\tdueDate: \".due input[name='date']\",\n\t\tdueTime: \".due input[name='time']\",\n\t\tclearActivation: \".clearActivation\",\n\t\tclearDue: \".clearDue\",\n\n\t\tcancelResourceEditBtn: \".cancel-resource-edit-btn\",\n\t\tsaveResourceEditBtn: \".save-resource-edit-btn\",\n\t\terrors: \".errors\"\n\t},\n\n\tevents: {\n\t\t\"change @ui.lock\": \"onLockBtnClick\",\n\n\t\t\"click @ui.clearActivation\": \"onClearActivation\",\n\t\t\"click @ui.clearDue\": \"onClearDue\",\n\n\t\t\"click @ui.cancelResourceEditBtn\": \"onCancelResourceEditBtnClick\",\n\t\t\"click @ui.saveResourceEditBtn\": \"onSaveResourceEditBtnClick\"\n\t},\n\n\tmodelEvents: {\n\t\tinvalid: \"validationFailed\"\n\t},\n\n\tlpRadioEvents: _defineProperty({}, Events.EditingChange, \"onEditChange\"),\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this51 = this;\n\n\t\treturn {\n\t\t\tisLocked: function isLocked() {\n\t\t\t\treturn _this51.model.get(\"locked\") || !_this51.model.get(\"locked\") && _this51.model.get(\"activationDate\") && _this51.model.get(\"activationDate\") > moment().unix();\n\t\t\t},\n\t\t\tisParentLocked: function isParentLocked() {\n\t\t\t\treturn _this51.model.get(\"parentLocked\") || !_this51.model.get(\"parentLocked\") && _this51.model.get(\"parentActivation\") && _this51.model.get(\"parentActivation\") > moment().unix();\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.bindEvents(lpRadio, this.lpRadioEvents);\n\t},\n\n\tonEditChange: function onEditChange(toggle) {\n\t\tif (toggle) this.ui.saveResourceEditBtn.attr(\"disabled\", false);else this.ui.saveResourceEditBtn.attr(\"disabled\", true);\n\t},\n\n\tonLockBtnClick: function onLockBtnClick(e) {\n\t\te.stopPropagation();\n\n\t\tif (this.ui.lock.prop(\"checked\")) this.ui.lockTime.removeClass(\"hide\");else this.ui.lockTime.addClass(\"hide\");\n\t},\n\n\tvalidationFailed: function validationFailed() {\n\t\tvar _this52 = this;\n\n\t\t$(\".error\", this.el).remove();\n\t\t_.each(this.model.validationError, function (item, key) {\n\t\t\t_this52.ui[key].parent().after(\"<span class='error'>\" + item + \"</span>\");\n\t\t\t_this52.ui[key].on(\"change keyup\", _this52.clearError);\n\t\t});\n\t},\n\n\tclearError: function clearError(event) {\n\t\tvar el = $(event.currentTarget);\n\t\tel.parent().parent().find(\".error\").remove();\n\t},\n\n\tonClearActivation: function onClearActivation() {\n\t\tif (this.model.get(\"resourceType\") === \"assessment\") {\n\t\t\tthis.onActivationClick();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.ui.activationDate.val(\"\");\n\t\tthis.ui.activationDate.next(\"input\").val(\"\");\n\t\tthis.ui.activationTime.val(\"\");\n\t\tthis.ui.activationTime.next(\"input\").val(\"\");\n\t},\n\n\tonClearDue: function onClearDue() {\n\t\tthis.ui.dueDate.val(\"\");\n\t\tthis.ui.dueDate.next(\"input\").val(\"\");\n\t\tthis.ui.dueTime.val(\"\");\n\t\tthis.ui.dueTime.next(\"input\").val(\"\");\n\t},\n\n\tonCancelResourceEditBtnClick: function onCancelResourceEditBtnClick(e) {\n\t\te.stopPropagation();\n\n\t\tthis.trigger(Events.CancelNodeEdit);\n\t\tlpRadio.trigger(Events.EditingEnded);\n\n\t\t// If this isn't saved yet, destroy it entirely\n\t\tif (this.model.isNew()) return this.model.destroy();\n\t},\n\n\tonSaveResourceEditBtnClick: function onSaveResourceEditBtnClick(evt) {\n\t\tvar _this53 = this;\n\n\t\tevt.stopPropagation();\n\n\t\tvar _split3 = (this.ui.activationTime.val() || \"0 0\").split(\" \"),\n\t\t    _split4 = _slicedToArray(_split3, 2),\n\t\t    aTimeHr = _split4[0],\n\t\t    aTimeMin = _split4[1];\n\n\t\tvar _split5 = (this.ui.dueTime.val() || \"0 0\").split(\" \"),\n\t\t    _split6 = _slicedToArray(_split5, 2),\n\t\t    dTimeHr = _split6[0],\n\t\t    dTimeMin = _split6[1];\n\n\t\tvar t = this.ui.activationDate.val() || 0;\n\n\t\tvar aTime = this.model.get(\"resourceType\") === \"assessment\" ? this.model.get(\"activationDate\") : moment(t).local().unix() + parseInt(aTimeHr, 10) * 3600 + parseInt(aTimeMin, 10) * 60;\n\n\t\tvar data = {\n\t\t\tactivationDate: this.ui.lock.prop(\"checked\") ? aTime : null,\n\t\t\tdueDate: this.model.get(\"isTask\") ? moment(this.ui.dueDate.val()).local().unix() + parseInt(dTimeHr, 10) * 3600 + parseInt(dTimeMin, 10) * 60 || null : null,\n\t\t\tgroups: this.model.get(\"groups\"),\n\t\t\tlocked: aTime ? false : this.ui.lock.prop(\"checked\"),\n\t\t\tvisible: this.model.get(\"visible\")\n\t\t};\n\n\t\tif (this.model.isNew()) data.groups = eventBus.request(eventBus.Events.GetCurrentGroups);\n\n\t\tif (data.locked || !data.locked && data.activationDate === this.model.get(\"activationDate\") && data.activationDate && data.activationDate < moment().unix()) data.activationDate = null;\n\n\t\tthis.model.save(data, {\n\t\t\twait: true,\n\t\t\tpatch: !this.model.isNew(),\n\t\t\tsuccess: function success() {\n\t\t\t\t_this53.model.set(\"editMode\", false);\n\t\t\t\t_this53.trigger(Events.CompleteNodeEdit);\n\t\t\t\tlpRadio.trigger(Events.EditingEnded);\n\t\t\t}\n\t\t});\n\t},\n\n\tonDomRefresh: function onDomRefresh() {\n\t\ttippy(this.$el.get(0).querySelectorAll(\".fa-cog\"), {\n\t\t\tduration: 0,\n\t\t\tanimation: \"fade\",\n\t\t\tplacement: \"top\",\n\t\t\tflip: false,\n\t\t\tarrow: true,\n\t\t\tdistance: 25\n\t\t});\n\n\t\t// Strip the time from the date\n\t\tvar d = this.model.has(\"activationDate\") ? moment.unix(this.model.get(\"activationDate\")).local().hour(0).minute(0).second(0).valueOf() : 0;\n\n\t\tflatpickr(this.ui.activationDate.get(0), {\n\t\t\tdefaultDate: d,\n\t\t\tdateFormat: \"Z\",\n\t\t\taltInput: true,\n\t\t\taltFormat: \"l, J of F, Y\",\n\t\t\tclickOpens: !(this.model.get(\"resourceType\") === \"assessment\")\n\t\t});\n\n\t\tflatpickr(this.ui.activationTime.get(0), {\n\t\t\tenableTime: true,\n\t\t\tnoCalendar: true,\n\t\t\tdefaultDate: this.model.has(\"activationDate\") ? this.model.get(\"activationDate\") * 1000 : 0,\n\t\t\taltInput: true,\n\t\t\tdateFormat: \"H i\",\n\t\t\taltFormat: \"H:i K\",\n\t\t\tclickOpens: !(this.model.get(\"resourceType\") === \"assessment\")\n\t\t});\n\n\t\tif (this.model.get(\"resourceType\") === \"assessment\") this.ui.lockTime.find(\"input\").on(\"click\", this.onActivationClick.bind(this));\n\n\t\t// Strip the time from the date\n\t\tvar dd = this.model.has(\"dueDate\") ? moment.unix(this.model.get(\"dueDate\")).local().hour(0).minute(0).second(0).valueOf() : 0;\n\n\t\tflatpickr(this.ui.dueDate.get(0), {\n\t\t\tdefaultDate: dd,\n\t\t\tdateFormat: \"Z\",\n\t\t\taltInput: true,\n\t\t\taltFormat: \"l, J of F, Y\"\n\t\t});\n\n\t\tflatpickr(this.ui.dueTime.get(0), {\n\t\t\tenableTime: true,\n\t\t\tnoCalendar: true,\n\t\t\tdefaultDate: this.model.has(\"dueDate\") ? this.model.get(\"dueDate\") * 1000 : 0,\n\t\t\taltInput: true,\n\t\t\tdateFormat: \"H i\",\n\t\t\taltFormat: \"H:i K\"\n\t\t});\n\t},\n\n\tattachmentFetchSuccess: function attachmentFetchSuccess(model) {\n\t\tvar _this54 = this;\n\n\t\tvar modal = new AssessmentPrompt({\n\t\t\tinlineMessage: \"\",\n\t\t\thost: \"#link-resources\",\n\t\t\tresource: new ResourceModel({ _id: model.get(\"resource\") }),\n\t\t\tsettings: _.merge(model.get(\"settings\"), { activationTime: model.get(\"activationTime\") })\n\t\t});\n\n\t\tmodal.once(\"action\", function (action, settingsModel) {\n\t\t\tif (action === \"ok\") {\n\t\t\t\tvar s = {\n\t\t\t\t\tserverSave: settingsModel.save,\n\t\t\t\t\ttitle: settingsModel.instanceName,\n\t\t\t\t\trequireCode: settingsModel.requireCode,\n\t\t\t\t\tcode: settingsModel.requireCode ? settingsModel.code : undefined,\n\t\t\t\t\tdisableRandomization: settingsModel.disableRandomization,\n\t\t\t\t\thideCompleteButtons: settingsModel.hideCompleteButtons,\n\t\t\t\t\tdisableResult: settingsModel.disableResult\n\t\t\t\t};\n\n\t\t\t\tif (!_this54.model.get(\"parentLocked\")) {\n\t\t\t\t\tif (settingsModel.activationType === \"specific\") {\n\t\t\t\t\t\tvar activationTime = moment(settingsModel.startDate, \"DD MMM YYYY\").hour(0).minute(0).second(0);\n\t\t\t\t\t\tvar time = moment(settingsModel.startTime, \"h mm\");\n\t\t\t\t\t\tactivationTime.hour(time.hour()).minute(time.minute()).second(0);\n\n\t\t\t\t\t\ts.activationTime = activationTime.unix();\n\n\t\t\t\t\t\t_this54.model.set({\n\t\t\t\t\t\t\tactivationDate: s.activationTime,\n\t\t\t\t\t\t\tlocked: false\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// Strip the time from the date\n\t\t\t\t\t\tvar d = moment.unix(_this54.model.get(\"activationDate\")).local().hour(0).minute(0).second(0).valueOf();\n\n\t\t\t\t\t\tflatpickr(_this54.ui.activationDate.get(0), {\n\t\t\t\t\t\t\tdefaultDate: d,\n\t\t\t\t\t\t\tdateFormat: \"Z\",\n\t\t\t\t\t\t\taltInput: true,\n\t\t\t\t\t\t\taltFormat: \"l, J of F, Y\"\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tflatpickr(_this54.ui.activationTime.get(0), {\n\t\t\t\t\t\t\tenableTime: true,\n\t\t\t\t\t\t\tnoCalendar: true,\n\t\t\t\t\t\t\tdefaultDate: _this54.model.get(\"activationDate\") * 1000,\n\t\t\t\t\t\t\taltInput: true,\n\t\t\t\t\t\t\tdateFormat: \"H i\",\n\t\t\t\t\t\t\taltFormat: \"H:i K\"\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t_this54.model.set({ activationDate: null, locked: false });\n\t\t\t\t\t\t_this54.ui.lock.prop(\"checked\", false);\n\t\t\t\t\t\t_this54.ui.activationDate.val(\"\");\n\t\t\t\t\t\t_this54.ui.activationDate.next(\"input\").val(\"\");\n\t\t\t\t\t\t_this54.ui.activationTime.val(\"\");\n\t\t\t\t\t\t_this54.ui.activationTime.next(\"input\").val(\"\");\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t_this54.attachment.save({\n\t\t\t\t\tsettingsUpdate: true,\n\t\t\t\t\tsettings: s\n\t\t\t\t}, {\n\t\t\t\t\terror: function error(model2, xhr) {\n\t\t\t\t\t\t_this54.ui.errors.html(\"<span class=\\\"error\\\">\" + App.parseResponse(xhr).detail + \"</span>\");\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tmodal.show();\n\t},\n\n\tonActivationClick: function onActivationClick() {\n\t\tif (this.model.get(\"resourceType\") === \"assessment\") {\n\t\t\tthis.attachment = new AttachmentModel({\n\t\t\t\t_id: this.model.get(\"attachment\")\n\t\t\t});\n\n\t\t\tthis.attachment.fetch({\n\t\t\t\tsuccess: this.attachmentFetchSuccess.bind(this),\n\t\t\t\terror: function error(model, xhr) {\n\t\t\t\t\tthis.ui.errors.html(\"<span class=\\\"error\\\">\" + App.parseResponse(xhr).detail + \"</span>\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n});\n\n// ** Collection Views **\n\n\nTreeView = Backbone.Marionette.CollectionView.extend({\n\tclassName: \"tree-view\",\n\ttagName: \"ul\",\n\tchildView: TreeNode,\n\n\tchildViewEvents: (_childViewEvents3 = {}, _defineProperty(_childViewEvents3, Events.ReloadNode, \"reloadNode\"), _defineProperty(_childViewEvents3, Events.AddSiblingNode, \"addSiblingNode\"), _defineProperty(_childViewEvents3, Events.PromoteSiblingNode, \"promoteSiblingNode\"), _defineProperty(_childViewEvents3, Events.RemoveNodeFromParent, \"removeNodeFromParent\"), _defineProperty(_childViewEvents3, Events.NodeDropAbove, \"nodeDroppedAbove\"), _childViewEvents3),\n\n\tchildViewOptions: function childViewOptions() {\n\t\treturn {\n\t\t\tparentLocked: this.model.get(\"locked\"),\n\t\t\tparentActivation: this.model.get(\"activationDate\"),\n\t\t\tparentVisible: this.model.get(\"visible\")\n\t\t};\n\t},\n\n\treloadNode: function reloadNode() {\n\t\tthis.trigger(Events.ReloadNode);\n\t},\n\n\taddSiblingNode: function addSiblingNode(m) {\n\t\tthis.trigger(Events.AddSiblingNode, m);\n\t},\n\n\tpromoteSiblingNode: function promoteSiblingNode(n, p) {\n\t\tthis.trigger(Events.PromoteSiblingNode, n, p);\n\t},\n\n\tremoveNodeFromParent: function removeNodeFromParent(m) {\n\t\tthis.trigger(Events.RemoveNodeFromParent, m);\n\t},\n\n\tnodeDroppedAbove: function nodeDroppedAbove(dropChild, srcModel) {\n\t\tthis.trigger(Events.NodeDropAbove, dropChild, srcModel);\n\t}\n});\n\nResourcesView = Backbone.Marionette.CollectionView.extend({\n\ttagName: \"div\",\n\tchildView: ResourceNode,\n\n\tchildViewEvents: (_childViewEvents4 = {}, _defineProperty(_childViewEvents4, Events.AddResource, \"addResource\"), _defineProperty(_childViewEvents4, Events.MoveResource, \"moveResource\"), _defineProperty(_childViewEvents4, Events.RemoveContentFromParent, \"removeContentFromParent\"), _defineProperty(_childViewEvents4, Events.CheckAttachmentContainers, \"checkAttachmentContainers\"), _childViewEvents4),\n\n\tchildViewOptions: function childViewOptions() {\n\t\treturn {\n\t\t\tparentLocked: this.model.get(\"locked\"),\n\t\t\tparentActivation: this.model.get(\"activationDate\"),\n\t\t\tparentVisible: this.model.get(\"visible\")\n\t\t};\n\t},\n\n\tonRender: function onRender() {\n\t\tif (this.collection.tasks) this.$el.addClass(\"tasks\");else this.$el.addClass(\"resources\");\n\t},\n\n\taddResource: function addResource(d) {\n\t\tthis.trigger(Events.AddResource, d);\n\t},\n\n\tmoveResource: function moveResource(d) {\n\t\tthis.trigger(Events.MoveResource, d);\n\t},\n\n\tremoveContentFromParent: function removeContentFromParent(m) {\n\t\tthis.trigger(Events.RemoveContentFromParent, m);\n\t},\n\n\tcheckAttachmentContainers: function checkAttachmentContainers() {\n\t\tthis.trigger(Events.CheckAttachmentContainers);\n\t}\n});\n\n// ----------------------------------------------------------------------------\n// Mixins\n// ----------------------------------------------------------------------------\nvar SlideoutMixin = {\n\tconfigureUI: function configureUI() {\n\t\tif (!this.ui.close.removeClass || !$(\"#content-region\").get(0)) return;\n\n\t\tthis.ui.close.removeClass(\"hide\");\n\n\t\tthis.Slideout = new Slideout({\n\t\t\tpanel: $(\"#content-region\").get(0),\n\t\t\tmenu: this.$el.get(0),\n\t\t\tpadding: 510,\n\t\t\ttolerance: 20\n\t\t});\n\n\t\tthis.Slideout.close();\n\t},\n\n\tshow: function show() {\n\t\tthis.Slideout.open();\n\t},\n\n\thide: function hide() {\n\t\tthis.Slideout.close();\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.Slideout.close();\n\t},\n\n\tclose: function close() {\n\t\tthis.Slideout.close();\n\t}\n};\n\nvar LearningPath = Backbone.Model.extend({\n\tdefaults: {},\n\tidAttribute: \"group\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/learningPath\";\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"learning_path-manager\",\n\tdraggingNodeView: null,\n\n\ttemplate: require(\"../../templates/console/learningPathView.nunj\"),\n\n\tregions: {\n\t\ttree: \".tree\"\n\t},\n\n\tui: {\n\t\ttree: \".tree\",\n\t\taddSectionBtn: \".add-section-btn\",\n\t\timportBookBtn: \".import-book-btn\",\n\t\tresetFormatBtn: \".reset-format-btn\",\n\t\tleftSection: \"#left-section\",\n\t\trightSection: \"#right-section\",\n\t\tcentreSection: \"#centre-section\",\n\t\tmultiselectBar: \".multiselect\",\n\t\tcamBtnContainer: \".cam-btn-container\",\n\n\t\tmultiSelectCancel: \".multiselect .cancel\",\n\t\tmultiSelectHide: \".multiselect .hider\",\n\t\tmultiSelectShow: \".multiselect .show\",\n\t\tmultiSelectTags: \".multiselect .tags\",\n\t\tmultiSelectDelete: \".multiselect .delete\",\n\n\t\tconnectionLostStatus: \"#centre-section .connectionLost\",\n\t\tlockedStatus: \"#centre-section .locked\",\n\t\tunknownStatus: \"#centre-section .unknown\",\n\t\tselfLockedStatus: \"#centre-section .selfLocked\",\n\t\tstealAccess: \".stealAccess\",\n\t\trequestAccess: \".requestAccess\",\n\t\taccessControllers: \".accessControllers\",\n\t\taccessPause: \".accessPause\",\n\n\t\tviewUser: \"select[name='view-user']\",\n\t\tviewOverlay: \".view-overlay\",\n\t\tviewOverlayMessage: \".view-overlay span\",\n\n\t\tbody: \"body\",\n\t\toverlay: \"#lp-overlay\",\n\t\townerNames: \".ownerNames\",\n\t\tgroupNotify: \"#lp-overlay .notifications .groups\",\n\t\ttreeHost: \".tree-host\",\n\t\tcancelDrop: \".tree-host .cancel-drop\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.addSectionBtn\": \"onAddSectionClicked\",\n\t\t\"click @ui.importBookBtn\": \"onImportBookClick\",\n\t\t\"click @ui.resetFormatBtn\": \"onResetFormatClick\",\n\t\t\"click @ui.groupNotify\": \"onGroupNotifyClick\",\n\t\t\"click @ui.stealAccess\": \"onStealAccess\",\n\t\t\"click @ui.requestAccess\": \"onRequestAccess\",\n\t\t\"change @ui.viewUser\": \"onViewUserChange\",\n\t\t\"click @ui.multiSelectCancel\": \"onMultiCancel\",\n\t\t\"click @ui.multiSelectShow\": \"onMultiShow\",\n\t\t\"click @ui.multiSelectHide\": \"onMultiHide\",\n\t\t\"click @ui.multiSelectTags\": \"onMultiTags\",\n\t\t\"click @ui.multiSelectDelete\": \"onMultiDelete\",\n\n\t\tdragenter: \"onDragEnter\",\n\t\tdragover: \"onDragOver\",\n\t\tdragleave: \"onDragLeave\",\n\t\t\"dragenter @ui.cancelDrop\": \"onCancelDragEnter\",\n\t\t\"drop @ui.cancelDrop\": \"onCancelFileDrop\",\n\t\t\"drop @ui.treeHost\": \"onCancelFileDrop\",\n\t\t\"drop @ui.overlay\": \"onCancelFileDrop\",\n\t\tdrop: \"onCancelFileDrop\"\n\t},\n\n\tchildViewEvents: (_childViewEvents5 = {}, _defineProperty(_childViewEvents5, Events.ReloadNode, \"reloadTree\"), _defineProperty(_childViewEvents5, Events.AddSiblingNode, \"onAddSectionClick\"), _defineProperty(_childViewEvents5, Events.RemoveNodeFromParent, \"removeChildNode\"), _defineProperty(_childViewEvents5, Events.NodeDropAbove, \"nodeDroppedAbove\"), _childViewEvents5),\n\n\tlpRadioEvents: (_lpRadioEvents6 = {}, _defineProperty(_lpRadioEvents6, Events.EnableEditing, \"enableEditing\"), _defineProperty(_lpRadioEvents6, Events.DisableEditing, \"disableEditing\"), _defineProperty(_lpRadioEvents6, Events.NodeChange, \"nodeChanged\"), _defineProperty(_lpRadioEvents6, Events.SiblingDrop, \"siblingDrop\"), _defineProperty(_lpRadioEvents6, Events.ChildDrop, \"childDrop\"), _defineProperty(_lpRadioEvents6, Events.NodeDragOver, \"nodeDragOver\"), _defineProperty(_lpRadioEvents6, Events.NodeSelected, \"onNodeSelected\"), _defineProperty(_lpRadioEvents6, Events.NodeDragMove, \"bodyMousemove\"), _defineProperty(_lpRadioEvents6, Events.ResourceDragMove, \"bodyMousemove\"), _defineProperty(_lpRadioEvents6, Events.NodeDragStart, \"onGlobalNodeDragStart\"), _defineProperty(_lpRadioEvents6, Events.ResourceDragStart, \"onGlobalResourceDragStart\"), _defineProperty(_lpRadioEvents6, Events.MultiselectStart, \"onMultiselectStart\"), _defineProperty(_lpRadioEvents6, Events.NodeSelectOver, \"onMultiNodeSelect\"), _defineProperty(_lpRadioEvents6, Events.EditingChange, \"onEditChange\"), _defineProperty(_lpRadioEvents6, Events.ViewUserChange, \"onViewUserChange\"), _lpRadioEvents6),\n\n\tradioEvents: (_radioEvents = {}, _defineProperty(_radioEvents, App.Events.WebsocketConnected, \"wsConnected\"), _defineProperty(_radioEvents, App.Events.WebsocketDisconnected, \"wsDisconnected\"), _defineProperty(_radioEvents, App.Events.WebsocketMessage, \"wsMessage\"), _radioEvents),\n\n\teventBusEvents: (_eventBusEvents = {}, _defineProperty(_eventBusEvents, eventBus.Events.AttachmentAdded, \"onAttachmentAdded\"), _defineProperty(_eventBusEvents, eventBus.Events.AttachmentRemoved, \"onAttachmentRemoved\"), _defineProperty(_eventBusEvents, eventBus.Events.GroupsChanged, \"groupsChanged\"), _defineProperty(_eventBusEvents, eventBus.Events.ResourceDragStart, \"onResourceDragStart\"), _defineProperty(_eventBusEvents, eventBus.Events.LPViewChanged, \"onLPViewChanged\"), _defineProperty(_eventBusEvents, eventBus.Events.HideFlashCardWidget, \"hideFlashCardWidget\"), _defineProperty(_eventBusEvents, eventBus.Events.ShowFlashCardWidget, \"showFlashCardWidget\"), _defineProperty(_eventBusEvents, eventBus.Events.MultiselectChanged, \"onChangeMultiselect\"), _eventBusEvents),\n\n\tmodelEvents: {\n\t\t\"change:wsConnected\": \"wsConnectionChanged\"\n\t},\n\n\tattachmentEvents: {\n\t\t\"attachment:next\": \"findNextAttachment\",\n\t\t\"attachment:previous\": \"findPreviousAttachment\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tvar _this55 = this;\n\n\t\tmodelMap = {};\n\t\ttaskMap = {};\n\t\tgroupMap = {};\n\t\teditStates.viewMode = false;\n\t\teditStates.editingAllowed = false;\n\t\tthis.dragCount = { content: 0 };\n\t\tpageUnloading = false;\n\n\t\tthis.collection = new ChildrenCollection(_.values(this.model.get(\"items\")));\n\n\t\tthis.collection.each(function (x) {\n\t\t\tmodelMap[x.id] = x;\n\n\t\t\t_.each(x.get(\"groups\"), function (y) {\n\t\t\t\tif (!(y in groupMap)) groupMap[y] = [];\n\t\t\t\tgroupMap[y].splice(_.sortedIndexBy(groupMap[y], x, function (z) {\n\t\t\t\t\treturn z.id;\n\t\t\t\t}), 0, x);\n\t\t\t});\n\t\t});\n\n\t\tthis.collection.on(\"add remove\", function (model) {\n\t\t\tif (model.id in modelMap) {\n\t\t\t\tdelete modelMap[model.id];\n\n\t\t\t\t_.each(model.get(\"groups\"), function (x) {\n\t\t\t\t\tif (!(x in groupMap)) return;\n\n\t\t\t\t\tvar i = _.sortedIndexBy(groupMap[x], model, function (z) {\n\t\t\t\t\t\treturn z.id;\n\t\t\t\t\t});\n\t\t\t\t\tif (i > 0 || groupMap[x][0].id === model.id) groupMap[x].splice(Math.max(0, i), 1);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tmodelMap[model.id] = model;\n\n\t\t\t\t_.each(model.get(\"groups\"), function (y) {\n\t\t\t\t\tif (!(y in groupMap)) groupMap[y] = [];\n\t\t\t\t\tgroupMap[y].splice(_.sortedIndexBy(groupMap[y], model, function (z) {\n\t\t\t\t\t\treturn z.id;\n\t\t\t\t\t}), 0, model);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (!_this55.collection.length) return;\n\n\t\t\t_this55.collection.each(function (x) {\n\t\t\t\treturn x.set({ lastNode: false });\n\t\t\t});\n\t\t\t_this55.collection.last().set({ lastNode: true });\n\t\t});\n\n\t\t// The websocket might already be connected before we listen for the connection event\n\t\tif (App.ws.isConnected) this.wsConnected();\n\n\t\tthis.bindEvents(lpRadio, this.lpRadioEvents);\n\t\tthis.bindEvents(globalRadio, this.radioEvents);\n\t\tthis.bindEvents(eventBus, this.eventBusEvents);\n\n\t\tlpRadio.reply(Events.GetPrimaryGroup, function () {\n\t\t\treturn _this55.model.get(\"group\");\n\t\t});\n\n\t\t$(\"body\").on(\"click.clearSelections\", this.bodyClicker.bind(this));\n\n\t\twindow.addEventListener(\"beforeunload\", function () {\n\t\t\tpageUnloading = true;\n\t\t});\n\n\t\tthis.attachments = { added: [], removed: [], last_removed_length: 0, last_added_length: 0 };\n\n\t\tif (options.location) this._location = options.location;\n\t},\n\n\tonGlobalNodeDragStart: function onGlobalNodeDragStart(view) {\n\t\tthis.draggingNodeView = view;\n\t\tlpRadio.trigger(Events.NodeDragListen);\n\t},\n\n\tonGlobalResourceDragStart: function onGlobalResourceDragStart(data) {\n\t\tdraggingResource = data;\n\t\tlpRadio.trigger(Events.ResourceDragListen);\n\t},\n\n\tonEditChange: function onEditChange(toggle) {\n\t\tif (!toggle) this.onMultiCancel();\n\t},\n\n\tonResourceDragStart: function onResourceDragStart(data) {\n\t\tvar _this56 = this;\n\n\t\tif (!canEdit()) return;\n\n\t\tif (data.type === \"resource\") {\n\t\t\tdraggingResource = data.resourceModel;\n\t\t\tlpRadio.trigger(Events.ResourceDragListen);\n\t\t}\n\n\t\t$(\"body\").off(\"click.clearSelections\");\n\n\t\tvar moveAt = function moveAt(event) {\n\t\t\tlpRadio.trigger(Events.NodeDragMove, event);\n\t\t};\n\n\t\tthis.ui.overlay.on(\"mousemove.nodeDragged\", moveAt);\n\n\t\tthis.ui.overlay.on(\"mouseup.endResourceDrag\", function (event) {\n\t\t\t_this56.ui.overlay.off(\"mousemove.nodeDragged\");\n\t\t\tvar nodes = _.concat($(\"div.resource:visible\").get(), $(\"div.task-host:visible\").get(), $(\"div.resource-host:visible\").get());\n\n\t\t\tvar x = event.originalEvent.clientX;\n\t\t\tvar y = event.originalEvent.clientY - (_this56.fullscreened ? -45 : 0) + $(\".learning_path-manager .tree:first\").get(0).scrollTop + window.pageYOffset;\n\n\t\t\tvar actual = _.find(nodes, function (item) {\n\t\t\t\tvar element = $(item);\n\n\t\t\t\tif (!element.isInViewport()) return;\n\n\t\t\t\tvar offset = element.offset();\n\n\t\t\t\treturn y >= offset.top && y <= offset.top + element.outerHeight(true) && x >= offset.left && x <= offset.left + element.outerWidth(true);\n\t\t\t});\n\n\t\t\tif (actual) $(actual).trigger(\"dropresource\");\n\t\t});\n\n\t\tthis.listenToOnce(eventBus, eventBus.Events.ResourceDragEnd, function () {\n\t\t\t_this56.ui.overlay.off(\"mousemove.draggingNode\");\n\t\t\tlpRadio.trigger(Events.NodeDragEnd, _this56);\n\t\t\t_this56.ui.overlay.off(\"mouseup.endResourceDrag\");\n\n\t\t\t_.delay(function () {\n\t\t\t\treturn $(\"body\").on(\"click.clearSelections\", _this56.bodyClicker.bind(_this56));\n\t\t\t}, 500);\n\t\t});\n\t},\n\n\tonMultiselectStart: function onMultiselectStart(model) {\n\t\tif (currentEditModelId) return;\n\n\t\tif (!model && !canEdit()) return;\n\n\t\tif (model && model.get(\"multiselecting\")) {\n\t\t\t// If this item is already selected, we go into removal mode\n\t\t\tmsState = 2;\n\t\t} else if (model) {\n\t\t\t// Else we go into add mode\n\t\t\tmsState = 1;\n\t\t} else if (!model) {\n\t\t\t// If this was a generic initiation, we go into \"wait for mousedown\" mode\n\t\t\tmsState = 3;\n\t\t}\n\n\t\tthis.multiChanges = false;\n\n\t\t$(\"body\").off(\"mouseup.multiselect\");\n\t\t$(\"body\").one(\"mouseup.multiselect\", function (event) {\n\t\t\t// We need to turn this off here to ensure it's false by the time the click handler runs\n\t\t\t// We only turn it off if the state isn't 3; because 3 means generic initiation which means the mouseup\n\t\t\t// might be the precursor to a click that should select the item\n\t\t\tif (msState < 3) msState = 0;\n\n\t\t\tevent.stopPropagation();\n\n\t\t\tlpRadio.trigger(Events.NodeSelectEnd);\n\t\t});\n\n\t\tlpRadio.trigger(Events.NodeSelectListen);\n\n\t\t// Only enable if this was a generic initiation. Else we wait for motion.\n\t\tif (!model) this.enableMultiselect();\n\t},\n\n\tenableMultiselect: function enableMultiselect() {\n\t\tif (!multiselect) {\n\t\t\tthis.ui.tree.addClass(\"multiselection\");\n\t\t\tthis.ui.multiselectBar.css({\n\t\t\t\topacity: 1,\n\t\t\t\t\"pointer-events\": \"all\"\n\t\t\t});\n\n\t\t\tmultiselect = true;\n\t\t\teventBus.trigger(eventBus.Events.ChangeMultiselect, true);\n\t\t}\n\t},\n\n\tonChangeMultiselect: function onChangeMultiselect(toggle) {\n\t\tif (toggle) this.onMultiselectStart();else this.onMultiCancel();\n\t},\n\n\tonMultiNodeSelect: function onMultiNodeSelect(model, state) {\n\t\tif (_.isUndefined(state)) {\n\t\t\tif (model.get(\"multiselecting\") && msState === 1) return;\n\t\t\tif (!model.get(\"multiselecting\") && msState === 2) return;\n\t\t}\n\n\t\tif (state === false || model.get(\"multiselecting\") && msState === 2) {\n\t\t\tmodel.set({ multiselecting: false });\n\t\t\tmultiselectItems.splice(_.sortedIndexBy(multiselectItems, model, function (x) {\n\t\t\t\treturn x.id;\n\t\t\t}), 1);\n\t\t\tif (multiselectItems.length === 0) return this.onMultiCancel();\n\t\t} else if (state === true || !model.get(\"multiselecting\") && msState === 1) {\n\t\t\tmodel.set({ multiselecting: true });\n\t\t\tmultiselectItems.splice(_.sortedIndexBy(multiselectItems, model, function (x) {\n\t\t\t\treturn x.id;\n\t\t\t}), 0, model);\n\t\t\tthis.enableMultiselect();\n\t\t}\n\t},\n\n\tonMultiCancel: function onMultiCancel(e) {\n\t\tvar _this57 = this;\n\n\t\tif (e) e.stopPropagation();\n\n\t\tthis.ui.viewOverlay.css({ opacity: 0, \"pointer-events\": \"none\" });\n\n\t\tif (this.multiXHR) {\n\t\t\tthis.multiXHR.abort();\n\t\t\tthis.multiXHR = null;\n\t\t}\n\n\t\t_.each(multiselectItems, function (x) {\n\t\t\treturn x.set({ multiselecting: false });\n\t\t});\n\n\t\tmultiselect = false;\n\t\tmsState = 0;\n\t\tmultiselectItems = [];\n\n\t\tthis.ui.multiselectBar.css({\n\t\t\topacity: 0,\n\t\t\t\"pointer-events\": \"none\"\n\t\t});\n\n\t\tthis.ui.tree.removeClass(\"multiselection\");\n\n\t\teventBus.trigger(eventBus.Events.ChangeMultiselect, false);\n\n\t\tif (this.multiChanges) {\n\t\t\tthis.model.fetch({\n\t\t\t\tsuccess: function success() {\n\t\t\t\t\t_this57.collection.reset(_.values(_this57.model.get(\"items\")));\n\n\t\t\t\t\tlpRadio.trigger(Events.EnableEditing);\n\t\t\t\t},\n\t\t\t\terror: function error(err) {\n\t\t\t\t\tconsole.error(\"Error refetching LP after bulk delete\", err);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n\n\tonMultiShow: function onMultiShow(evt) {\n\t\tvar _this58 = this;\n\n\t\tevt.stopPropagation();\n\n\t\tif (multiselectItems.length === 0) {\n\t\t\tvar _modal2 = new SmallModal({\n\t\t\t\ttitle: \"<span class='fa fa-exclamation-triangle'/> No Valid Items\",\n\t\t\t\twarning: true,\n\t\t\t\tbody: \"You did not select any items to show.\",\n\t\t\t\thideButtons: [\"cancel\"]\n\t\t\t});\n\n\t\t\t_modal2.show();\n\n\t\t\treturn;\n\t\t}\n\n\t\t// Items hidden by a parent are not eligible to be made visible\n\t\tvar items = _.reject(multiselectItems, function (x) {\n\t\t\treturn !x.get(\"parentVisible\");\n\t\t});\n\n\t\tif (items.length === 0) {\n\t\t\tvar _modal3 = new SmallModal({\n\t\t\t\ttitle: \"<span class='fa fa-eye'/> No Valid Items\",\n\t\t\t\twarning: true,\n\t\t\t\tbody: \"None of the items you selected can be made visible because they are visibility-locked by their parents.\",\n\t\t\t\thideButtons: [\"cancel\"]\n\t\t\t});\n\n\t\t\t_modal3.show();\n\n\t\t\treturn;\n\t\t}\n\n\t\tvar modal = new SmallModal({\n\t\t\ttitle: \"<span class='fa fa-eye'/> Make Items Visible\",\n\t\t\tbody: \"You are about to make \" + items.length + \" items visible. If any of the selected items have unselected child items, those children will also be made visible.\\n\\t\\t\\t\\t\" + (items.length < multiselectItems.length ? \"<br/><br/>\" + (multiselectItems.length - items.length) + \" items have been omitted because they are visibility-locked by their parent.\" : \"\") + \"\\n\\t\\t\\t\\t<br/><br/>Continue?\"\n\t\t});\n\n\t\tmodal.on(\"button:ok\", function () {\n\t\t\t_this58.ui.viewOverlayMessage.html(\"<span class='spinner-icon'/> Saving...</span>\");\n\t\t\t_this58.ui.viewOverlay.css({ opacity: 0.9, \"pointer-events\": \"all\" });\n\n\t\t\t_this58.multiXHR = $.ajax({\n\t\t\t\tmethod: \"POST\",\n\t\t\t\turl: settings.urlRoot + \"/acacia/learningPaths/items/bulk/\" + _this58.model.get(\"learning_path\") + \"/visibility\",\n\t\t\t\tjson: true,\n\t\t\t\tdata: {\n\t\t\t\t\titems: _.map(items, function (x) {\n\t\t\t\t\t\treturn x.id;\n\t\t\t\t\t}),\n\t\t\t\t\tvisible: true\n\t\t\t\t},\n\t\t\t\tsuccess: function success() {\n\t\t\t\t\t// Delete all selected items\n\t\t\t\t\t_.each(items, function (x) {\n\t\t\t\t\t\treturn x.set({ visible: true });\n\t\t\t\t\t});\n\n\t\t\t\t\t// Hide overlay\n\t\t\t\t\t_this58.ui.viewOverlay.css({ opacity: 0, \"pointer-events\": \"none\" });\n\t\t\t\t},\n\t\t\t\terror: function error(e) {\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tmodal.show();\n\t},\n\n\tonMultiHide: function onMultiHide(evt) {\n\t\tvar _this59 = this;\n\n\t\tevt.stopPropagation();\n\n\t\tif (multiselectItems.length === 0) {\n\t\t\tvar _modal4 = new SmallModal({\n\t\t\t\ttitle: \"<span class='fa fa-exclamation-triangle'/> No Valid Items\",\n\t\t\t\twarning: true,\n\t\t\t\tbody: \"You did not select any items to hide.\",\n\t\t\t\thideButtons: [\"cancel\"]\n\t\t\t});\n\n\t\t\t_modal4.show();\n\n\t\t\treturn;\n\t\t}\n\n\t\tvar modal = new SmallModal({\n\t\t\ttitle: \"<span class='fa fa-eye-slash'/> Make Items Hidden\",\n\t\t\tbody: \"You are about to make \" + multiselectItems.length + \" items hidden.\\n\\t\\t\\t\\tIf any of the selected items have unselected child items, those children will also be made hidden.<br/><br/>Continue?\"\n\t\t});\n\n\t\tmodal.on(\"button:ok\", function () {\n\t\t\t_this59.ui.viewOverlayMessage.html(\"<span class='spinner-icon'/> Saving...</span>\");\n\t\t\t_this59.ui.viewOverlay.css({ opacity: 0.9, \"pointer-events\": \"all\" });\n\n\t\t\t_this59.multiXHR = $.ajax({\n\t\t\t\tmethod: \"POST\",\n\t\t\t\turl: settings.urlRoot + \"/acacia/learningPaths/items/bulk/\" + _this59.model.get(\"learning_path\") + \"/visibility\",\n\t\t\t\tjson: true,\n\t\t\t\tdata: {\n\t\t\t\t\titems: _.map(multiselectItems, function (x) {\n\t\t\t\t\t\treturn x.id;\n\t\t\t\t\t}),\n\t\t\t\t\tvisible: false\n\t\t\t\t},\n\t\t\t\tsuccess: function success() {\n\t\t\t\t\t// Delete all selected items\n\t\t\t\t\t_.each(multiselectItems, function (x) {\n\t\t\t\t\t\treturn x.set({ visible: false });\n\t\t\t\t\t});\n\n\t\t\t\t\t// Hide overlay\n\t\t\t\t\t_this59.ui.viewOverlay.css({ opacity: 0, \"pointer-events\": \"none\" });\n\t\t\t\t},\n\t\t\t\terror: function error(e) {\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tmodal.show();\n\t},\n\n\tonMultiTags: function onMultiTags(evt) {\n\t\tvar _this60 = this;\n\n\t\tevt.stopPropagation();\n\n\t\tif (multiselectItems.length === 0) {\n\t\t\tvar modal = new SmallModal({\n\t\t\t\ttitle: \"<span class='fa fa-exclamation-triangle'/> No Valid Items\",\n\t\t\t\twarning: true,\n\t\t\t\tbody: \"You did not select any items to tag.\",\n\t\t\t\thideButtons: [\"cancel\"]\n\t\t\t});\n\n\t\t\tmodal.show();\n\n\t\t\treturn;\n\t\t}\n\n\t\tvar url = settings.urlRoot + \"/acacia/learningPaths/\" + this.model.get(\"learning_path\") + \"/tags\";\n\n\t\t// Find out all the tags that are selected\n\t\tvar existingTags = _.uniqBy(_.flatMap(multiselectItems, function (x) {\n\t\t\tvar m = modelMap[x.id] || taskMap[x.id];\n\t\t\tif (!m) return [];\n\t\t\treturn m.get(\"tagList\") || [];\n\t\t}), function (x) {\n\t\t\treturn x.tag_id;\n\t\t});\n\n\t\tvar tagging = new Selectra({\n\t\t\tsearch: false,\n\t\t\tmultiple: true,\n\t\t\tsort: true,\n\t\t\tvirtualBase: true,\n\t\t\tautoOpenDropdown: true,\n\t\t\ticons: true,\n\t\t\tcheckboxes: true,\n\t\t\tddWidth: 250,\n\t\t\tddHost: \"#link-resources\",\n\t\t\tserver: {\n\t\t\t\tkey: \"tag_id\",\n\t\t\t\tvalue: \"label\",\n\t\t\t\tfetch: url,\n\t\t\t\tdefault: {\n\t\t\t\t\titems: existingTags\n\t\t\t\t}\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t},\n\t\t\tallowCreation: {\n\t\t\t\tmode: \"always\",\n\t\t\t\ttext: \"Create new tag\",\n\t\t\t\tcallback: this.createNewTag,\n\t\t\t\tserver: {\n\t\t\t\t\tsaveFirst: true,\n\t\t\t\t\tsave: settings.urlRoot + \"/acacia/learningPaths/items/\" + this.model.get(\"learning_path\") + \"/tags\"\n\t\t\t\t},\n\t\t\t\thideOnClick: true\n\t\t\t},\n\t\t\tinteractives: {\n\t\t\t\tmanage: {\n\t\t\t\t\ttext: \"Manage tags\",\n\t\t\t\t\tcallback: this.manageTags\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\ttagging.show({ el: evt.currentTarget });\n\n\t\tvar tags = [],\n\t\t    tagList = [];\n\n\t\tthis.listenTo(tagging, Selectra.Events.ValueChanged, function (selection) {\n\t\t\ttags = _.flatMap(selection, function (x) {\n\t\t\t\treturn x.get(\"tag_id\") || [];\n\t\t\t});\n\t\t\ttagList = _.map(selection, function (x) {\n\t\t\t\treturn x.toJSON();\n\t\t\t});\n\t\t});\n\n\t\tthis.listenTo(this, \"before:destroy\", function () {\n\t\t\ttagging.close();\n\t\t});\n\n\t\tthis.listenTo(tagging, \"dropdown:closed\", function () {\n\t\t\tif (!_this60.ui.viewOverlay) return;\n\n\t\t\t_this60.ui.viewOverlayMessage.html(\"<span class='spinner-icon'/> Saving...</span>\");\n\t\t\t_this60.ui.viewOverlay.css({ opacity: 0.9, \"pointer-events\": \"all\" });\n\n\t\t\t_this60.multiXHR = $.ajax({\n\t\t\t\tmethod: \"POST\",\n\t\t\t\turl: settings.urlRoot + \"/acacia/learningPaths/items/bulk/\" + _this60.model.get(\"learning_path\") + \"/tags\",\n\t\t\t\tjson: true,\n\t\t\t\tdata: {\n\t\t\t\t\titems: _.map(multiselectItems, function (x) {\n\t\t\t\t\t\treturn x.id;\n\t\t\t\t\t}),\n\t\t\t\t\ttags: tags\n\t\t\t\t},\n\t\t\t\tsuccess: function success() {\n\t\t\t\t\t// Delete all selected items\n\t\t\t\t\t_.each(multiselectItems, function (x) {\n\t\t\t\t\t\treturn x.set({ tags: tags, tagList: tagList });\n\t\t\t\t\t});\n\n\t\t\t\t\t// Hide overlay\n\t\t\t\t\t_this60.ui.viewOverlay.css({ opacity: 0, \"pointer-events\": \"none\" });\n\t\t\t\t},\n\t\t\t\terror: function error(e) {\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t},\n\n\tcreateNewTag: function createNewTag(el, clicker) {\n\t\tthis.tagModal = new TagModal();\n\n\t\treturn this.tagModal.show(el, clicker);\n\t},\n\n\tmanageTags: function manageTags() {\n\t\tglobalRadio.trigger(App.Events.Commands.Navigate, settings.urlRoot + \"/console/tags/\" + lpRadio.request(Events.GetPrimaryGroup));\n\t},\n\n\tonMultiDelete: function onMultiDelete(evt) {\n\t\tvar _this61 = this;\n\n\t\tevt.stopPropagation();\n\n\t\tif (multiselectItems.length === 0) {\n\t\t\tvar _modal5 = new SmallModal({\n\t\t\t\ttitle: \"<span class='fa fa-exclamation-triangle'/> No Valid Items\",\n\t\t\t\twarning: true,\n\t\t\t\tbody: \"You did not select any items to delete.\",\n\t\t\t\thideButtons: [\"cancel\"]\n\t\t\t});\n\n\t\t\t_modal5.show();\n\n\t\t\treturn;\n\t\t}\n\n\t\tvar modal = new SmallModal({\n\t\t\ttitle: \"<span class='fa fa-trash-alt'/> Multiple Item Deletion\",\n\t\t\twarning: true,\n\t\t\tbody: \"You are about to delete \" + multiselectItems.length + \" items. If any of the selected items have unselected child items, those children will also be deleted.<br/><br/>Continue?\"\n\t\t});\n\n\t\tmodal.on(\"button:ok\", function () {\n\t\t\t_this61.ui.viewOverlayMessage.html(\"<span class='spinner-icon'/> Saving...</span>\");\n\t\t\t_this61.ui.viewOverlay.css({ opacity: 0.9, \"pointer-events\": \"all\" });\n\n\t\t\t_this61.multiXHR = $.ajax({\n\t\t\t\tmethod: \"DELETE\",\n\t\t\t\turl: settings.urlRoot + \"/acacia/learningPaths/items/bulk/\" + _this61.model.get(\"learning_path\") + \"/delete\",\n\t\t\t\tjson: true,\n\t\t\t\tdata: {\n\t\t\t\t\titems: _.map(multiselectItems, function (x) {\n\t\t\t\t\t\treturn x.id;\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tsuccess: function success() {\n\t\t\t\t\t// Delete all selected items\n\t\t\t\t\t_.each(multiselectItems, function (x) {\n\t\t\t\t\t\tif (x.collection) x.collection.remove(x);\n\t\t\t\t\t});\n\n\t\t\t\t\tmultiselectItems = [];\n\n\t\t\t\t\t// Hide overlay\n\t\t\t\t\t_this61.ui.viewOverlay.css({ opacity: 0, \"pointer-events\": \"none\" });\n\n\t\t\t\t\t_this61.multiChanges = true;\n\t\t\t\t},\n\t\t\t\terror: function error(e) {\n\t\t\t\t\tconsole.error(e);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tmodal.show();\n\t},\n\n\tonNodeSelected: function onNodeSelected(id, view) {\n\t\tthis.selectedView = view;\n\t},\n\n\tsiblingDrop: function siblingDrop(view) {\n\t\tvar _this62 = this;\n\n\t\tif (!this.draggingNodeView) return;\n\n\t\tvar newPath = view.model.get(\"dropFirstChild\") ? view.model.get(\"path\") : localMethods.getNextPath(view.model.get(\"path\"));\n\t\tvar oldPath = this.draggingNodeView.model.get(\"path\");\n\n\t\tvar opts = {\n\t\t\tpath: newPath,\n\t\t\tvisible: view.model.get(\"visible\") ? this.draggingNodeView.model.get(\"visible\") : true,\n\t\t\tlocked: view.model.get(\"locked\") ? true : this.draggingNodeView.model.get(\"locked\"),\n\t\t\tactivationDate: view.model.get(\"activationDate\") || this.draggingNodeView.model.get(\"activationDate\")\n\t\t};\n\n\t\tif (opts.locked || !opts.locked && opts.activationDate && opts.activationDate < moment().unix()) opts.activationDate = null;\n\n\t\tthis.draggingNodeView.model.save(opts, {\n\t\t\tpatch: true,\n\t\t\twait: true,\n\t\t\tsuccess: function success() {\n\t\t\t\tview.model.set({ dropFirstChild: false });\n\n\t\t\t\tif (localMethods.isSibling(oldPath, newPath)) {\n\t\t\t\t\t// If we repositioned something within the same parent, the reload will fix the position.\n\t\t\t\t} else {\n\t\t\t\t\t// If not siblings, remove it from the old parent...\n\t\t\t\t\t_this62.draggingNodeView.trigger(Events.RemoveNodeFromParent, _this62.draggingNodeView.model);\n\n\t\t\t\t\t// ...and promote it in the new location\n\t\t\t\t\tvar m = _this62.draggingNodeView.model;\n\t\t\t\t\tm.set({ depth: view.model.get(\"depth\") });\n\t\t\t\t\tview.trigger(Events.PromoteSiblingNode, m, view.model);\n\t\t\t\t}\n\t\t\t\teventBus.trigger(eventBus.Events.AttachmentAdded, _this62.draggingNodeView.model, { oldPath: oldPath, newPath: newPath });\n\t\t\t\tview.trigger(Events.ReloadNode);\n\t\t\t\t_this62.draggingNodeView = null;\n\t\t\t}\n\t\t});\n\t},\n\n\tchildDrop: function childDrop(view) {\n\t\tvar _this63 = this;\n\n\t\tif (!this.draggingNodeView || view.model.id === this.draggingNodeView.model.id) {\n\t\t\t//Exit if trying to drop as a child of itself\n\t\t\tthis.draggingNodeView = null;\n\t\t\tview.model.set({ dropFirstChild: false });\n\t\t\treturn;\n\t\t}\n\n\t\tvar path = view.model.get(\"path\") + \".AAA\";\n\n\t\tvar oldPath = this.draggingNodeView.model.get(\"path\");\n\n\t\tvar opts = {\n\t\t\tpath: path,\n\t\t\tvisible: view.model.get(\"visible\"),\n\t\t\tlocked: view.model.get(\"locked\"),\n\t\t\tactivationDate: view.model.get(\"activationDate\"),\n\t\t\tparentLocked: view.model.get(\"parentLocked\"),\n\t\t\tparentVisible: view.model.get(\"parentVisible\"),\n\t\t\tparentActivation: view.model.get(\"parentActivation\")\n\t\t};\n\n\t\tif (opts.locked || !opts.locked && opts.activationDate && opts.activationDate < moment().unix()) opts.activationDate = null;\n\n\t\tthis.draggingNodeView.model.save(opts, {\n\t\t\tpatch: true,\n\t\t\twait: true,\n\t\t\tsuccess: function () {\n\t\t\t\tvar _ref3 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee3() {\n\t\t\t\t\tvar m;\n\t\t\t\t\treturn _regenerator2.default.wrap(function _callee3$(_context3) {\n\t\t\t\t\t\twhile (1) {\n\t\t\t\t\t\t\tswitch (_context3.prev = _context3.next) {\n\t\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\t\t_this63.draggingNodeView.trigger(Events.RemoveNodeFromParent, _this63.draggingNodeView.model);\n\n\t\t\t\t\t\t\t\t\tm = _this63.draggingNodeView.model;\n\n\t\t\t\t\t\t\t\t\tm.set({ depth: view.model.get(\"depth\") + 1 });\n\n\t\t\t\t\t\t\t\t\tif (!view.model.get(\"isCollapsed\")) {\n\t\t\t\t\t\t\t\t\t\t_context3.next = 6;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t_context3.next = 6;\n\t\t\t\t\t\t\t\t\treturn view.collapseNode(false);\n\n\t\t\t\t\t\t\t\tcase 6:\n\n\t\t\t\t\t\t\t\t\tview.children.add(m, { at: 0 });\n\t\t\t\t\t\t\t\t\tview.model.set({ dropFirstChild: false });\n\n\t\t\t\t\t\t\t\t\teventBus.trigger(eventBus.Events.AttachmentAdded, m, { oldPath: oldPath, newPath: path });\n\t\t\t\t\t\t\t\t\tview.trigger(Events.ReloadNode);\n\t\t\t\t\t\t\t\t\t_this63.draggingNodeView = null;\n\n\t\t\t\t\t\t\t\tcase 11:\n\t\t\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\t\t\treturn _context3.stop();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}, _callee3, _this63);\n\t\t\t\t}));\n\n\t\t\t\tfunction success() {\n\t\t\t\t\treturn _ref3.apply(this, arguments);\n\t\t\t\t}\n\n\t\t\t\treturn success;\n\t\t\t}()\n\t\t});\n\t},\n\n\tnodeDroppedAbove: function nodeDroppedAbove(dropChild, srcModel) {\n\t\tvar index = this.collection.indexOf(srcModel);\n\t\tvar treeView = this.getChildView(\"tree\");\n\n\t\tif (index > 0) {\n\t\t\tvar previousModel = this.collection.at(index - 1);\n\t\t\tvar previousView = treeView.children.findByModel(previousModel);\n\n\t\t\tpreviousView.model.set({ dropChild: dropChild });\n\t\t\tpreviousView.ui.node.trigger(\"dropnode\");\n\t\t} else if (index === 0) {\n\t\t\tvar currentModel = this.collection.at(index);\n\t\t\tvar currentView = treeView.children.findByModel(currentModel);\n\n\t\t\tcurrentView.model.set({ dropFirstChild: true });\n\t\t\tcurrentView.model.set({ dropChild: dropChild });\n\t\t\tcurrentView.ui.node.trigger(\"dropnode\");\n\t\t}\n\t},\n\n\tonLPViewChanged: function onLPViewChanged(mode) {\n\t\teditStates.viewMode = mode;\n\n\t\tvar url = \"/console/learningPaths/\" + this.model.id;\n\t\tif (mode) {\n\t\t\turl = \"/console/learningPaths/\" + this.model.id + \"/view\";\n\t\t\tif (this.model.has(\"defaultViewUser\")) {\n\t\t\t\tviewingUser = this.model.get(\"defaultViewUser\");\n\t\t\t\turl += \"/\" + this.model.get(\"defaultViewUser\");\n\t\t\t}\n\t\t}\n\n\t\tglobalRadio.trigger(App.Events.Commands.Navigate, url, { trigger: false });\n\n\t\tif (mode) {\n\t\t\tthis.ui.leftSection.removeClass(\"invisible\");\n\t\t\tthis.ui.viewOverlay.css({ opacity: 0.9, \"pointer-events\": \"all\" });\n\t\t\tthis.ui.viewOverlayMessage.text(\"Select a user to view their \" + settings.learningPathsCustomName + \" progress\");\n\n\t\t\tvar o = {};\n\t\t\tif (this.model.get(\"defaultViewUser\")) {\n\t\t\t\to.default = {\n\t\t\t\t\tfetch: settings.urlRoot + \"/acacia/learningPaths/\" + this.model.get(\"learning_path\") + \"/users/\" + this.model.get(\"defaultViewUser\")\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tthis.userViewSelectra = new Selectra({\n\t\t\t\twidth: \"330px\",\n\t\t\t\tserver: _.extend({\n\t\t\t\t\tfetch: settings.urlRoot + \"/acacia/learningPaths/\" + this.model.get(\"learning_path\") + \"/users\",\n\t\t\t\t\tdelayLoad: !this.model.has(\"defaultViewUser\"),\n\t\t\t\t\tkey: \"user_id\",\n\t\t\t\t\tvalue: \"name\"\n\t\t\t\t}, o),\n\t\t\t\tpaging: {\n\t\t\t\t\tpageSize: 30,\n\t\t\t\t\tinfinite: true\n\t\t\t\t},\n\t\t\t\tplaceholder: \"Select user\",\n\t\t\t\tddHost: \"#link-resources\"\n\t\t\t});\n\n\t\t\tthis.userViewSelectra.show({ el: this.ui.viewUser });\n\n\t\t\tvar el = $(\".learning_path-manager\").get(0);\n\t\t\tif (el) el.scrollTop = 0;\n\t\t} else {\n\t\t\tthis.ui.leftSection.addClass(\"invisible\");\n\t\t\tthis.ui.viewOverlay.css({ opacity: 0, \"pointer-events\": \"none\" });\n\t\t\tif (this.userViewSelectra) {\n\t\t\t\tthis.userViewSelectra.destroy();\n\t\t\t\tthis.userViewSelectra = null;\n\t\t\t}\n\t\t}\n\n\t\tthis.editingToggle();\n\t},\n\n\tenableEditing: function enableEditing() {\n\t\teditStates.editingAllowed = true;\n\t\tthis.editingToggle();\n\t},\n\n\tdisableEditing: function disableEditing() {\n\t\teditStates.editingAllowed = false;\n\t\tthis.editingToggle();\n\t},\n\n\tonViewUserChange: function onViewUserChange() {\n\t\tvar _this64 = this;\n\n\t\tvar user = this.ui.viewUser.val();\n\t\tif (!user) return;\n\n\t\tviewingUser = user;\n\n\t\tvar url = \"/console/learningPaths/\" + this.model.id + \"/view/\" + user;\n\t\tglobalRadio.trigger(App.Events.Commands.Navigate, url, { trigger: false });\n\n\t\tthis.ui.viewOverlay.css({ opacity: 0, \"pointer-events\": \"none\" });\n\n\t\t// Fetch the state for this user, and start listening for realtime state changes\n\t\t$.ajax({\n\t\t\tmethod: \"GET\",\n\t\t\turl: settings.urlRoot + \"/acacia/learningPaths/\" + this.model.get(\"learning_path\") + \"/users/\" + user + \"/pathState\",\n\t\t\tsuccess: this.showAndUpdateUserState.bind(this),\n\t\t\terror: function error(e) {\n\t\t\t\treturn console.error(e);\n\t\t\t}\n\t\t});\n\n\t\t// Meanwhile, hide the items this user cannot see\n\n\t\tif (this.previousUserGroups) {\n\t\t\t_.each(groupMap, function (val, x) {\n\t\t\t\tif (!_.includes(_this64.previousUserGroups, x)) _.each(groupMap[x], function (y) {\n\t\t\t\t\treturn y.set({ invisible: false });\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tvar groups = this.userViewSelectra.getSelected().groups;\n\n\t\t_.each(groupMap, function (val, x) {\n\t\t\tif (!_.includes(groups, x)) _.each(groupMap[x], function (y) {\n\t\t\t\treturn y.set({ invisible: true });\n\t\t\t});\n\t\t});\n\n\t\tthis.previousUserGroups = groups;\n\t},\n\n\tshowAndUpdateUserState: function showAndUpdateUserState(data) {\n\t\tthis.userState = data;\n\n\t\t// Assume all tasks - including unfetched ones, crucially - are progress 0\n\t\t_.each(taskMap, function (x) {\n\t\t\treturn x.set({ progress: 0 });\n\t\t});\n\n\t\t// Set the real progress states\n\t\t_.each(data, function (x) {\n\t\t\tif (x._id in taskMap) taskMap[x._id].set({ progress: x.lp_item_progress });\n\t\t});\n\t},\n\n\twsConnected: function wsConnected() {\n\t\tvar _this65 = this;\n\n\t\tvar completeConnection = function completeConnection() {\n\t\t\t_this65.joinLPRoom();\n\n\t\t\t_this65.model.set({ wsConnected: true });\n\t\t};\n\n\t\treturn App.ws.getID().then(function (id) {\n\t\t\t_this65.model.set({ websocket_id: id });\n\t\t\treturn completeConnection();\n\t\t});\n\t},\n\n\twsDisconnected: function wsDisconnected() {\n\t\tthis.model.set({ wsConnected: false });\n\t},\n\n\twsConnectionChanged: function wsConnectionChanged() {\n\t\tthis.ui.unknownStatus.addClass(\"hide\");\n\n\t\t//console.debug(\"wsConnectionChanged\", this.model.get(\"wsConnected\"));\n\t\tif (this.model.get(\"wsConnected\")) {\n\t\t\tthis.ui.connectionLostStatus.addClass(\"hide\");\n\t\t} else {\n\t\t\t// User got logged out.\n\t\t\tif (!App.Session.get(\"authenticated\")) return;\n\n\t\t\tif (!pageUnloading) this.ui.connectionLostStatus.removeClass(\"hide\");\n\n\t\t\tthis.model.unset(\"websocket_id\");\n\t\t\tthis.model.unset(\"spark\");\n\t\t\tlpRadio.trigger(Events.DisableEditing);\n\n\t\t\tthis.onMultiCancel();\n\t\t}\n\n\t\tthis.editingToggle();\n\t},\n\n\twsMessage: function wsMessage(message) {\n\t\tvar _this66 = this;\n\n\t\tif (message.learning_paths) {\n\t\t\tif (message.access_requested) {\n\t\t\t\t// Show a modal asking for access\n\t\t\t\tvar modal = new SmallModal({\n\t\t\t\t\ttitle: \"Access Requested\",\n\t\t\t\t\tbody: \"The user \" + message.sourceName.replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\") + \" has asked for access to this\\n\\t\\t\\t\\t\\t\\t\" + settings.learningPathsCustomName.replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\") + \".<br/><br/>\\n\\t\\t\\t\\t\\t\\tAccess will be granted automatically in \" + requestAccessTimeout + \" seconds if you do not respond.\",\n\t\t\t\t\tcustomOK: \"Give Access\",\n\t\t\t\t\tcustomCancel: \"Deny\",\n\t\t\t\t\thost: \"#link-resources\"\n\t\t\t\t});\n\n\t\t\t\tmodal.on(\"button:ok\", function () {\n\t\t\t\t\tApp.ws.websocket.write({\n\t\t\t\t\t\tlearning_paths: true,\n\t\t\t\t\t\taction: \"grantAccess\",\n\t\t\t\t\t\troom: _this66.model.get(\"_id\"),\n\t\t\t\t\t\tsource: message.source,\n\t\t\t\t\t\tsourceSpark: message.sourceSpark,\n\t\t\t\t\t\tspark: message.spark\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\tmodal.on(\"button:cancel\", function () {\n\t\t\t\t\tclearTimeout(_this66.accessRequestTimer);\n\t\t\t\t\tApp.ws.websocket.write({\n\t\t\t\t\t\tlearning_paths: true,\n\t\t\t\t\t\taction: \"denyAccess\",\n\t\t\t\t\t\troom: _this66.model.get(\"_id\"),\n\t\t\t\t\t\tsource: message.source,\n\t\t\t\t\t\tspark: message.spark,\n\t\t\t\t\t\tsourceSpark: message.sourceSpark\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\t// Wait up to X seconds, then automatically hand over control\n\t\t\t\tthis.accessRequestTimer = setTimeout(function () {\n\t\t\t\t\tmodal.destroy();\n\n\t\t\t\t\tApp.ws.websocket.write({\n\t\t\t\t\t\tlearning_paths: true,\n\t\t\t\t\t\taction: \"grantAccess\",\n\t\t\t\t\t\troom: _this66.model.get(\"_id\"),\n\t\t\t\t\t\tsource: message.source,\n\t\t\t\t\t\tsourceSpark: message.sourceSpark,\n\t\t\t\t\t\tspark: message.spark\n\t\t\t\t\t});\n\t\t\t\t}, requestAccessTimeout * 1000);\n\n\t\t\t\tmodal.show();\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (message.access_denied) {\n\t\t\t\tclearTimeout(this.requestedAccessTimer);\n\n\t\t\t\trequestedAccess = false;\n\n\t\t\t\tglobalRadio.trigger(App.Events.Commands.Toast, {\n\t\t\t\t\tcontent: \"Your request for access was denied.\",\n\t\t\t\t\ticon: \"fa-ban\",\n\t\t\t\t\ticonColour: \"red\",\n\t\t\t\t\thost: \"#link-resources\"\n\t\t\t\t});\n\n\t\t\t\tthis.ui.accessControllers.removeClass(\"hide\");\n\t\t\t\tthis.ui.accessPause.addClass(\"hide\");\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (message.owner) this.updateOwner(message);\n\n\t\t\t// This means we successfully contacted the owner to ask for request\n\t\t\t// and we should not immediately take control\n\t\t\tif (message.access_request_received) clearTimeout(this.automaticStealTimer);\n\t\t}\n\t},\n\n\tjoinLPRoom: function joinLPRoom() {\n\t\tvar user = globalRadio.request(App.Events.Requests.CurrentUser);\n\n\t\tApp.ws.websocket.write({\n\t\t\tlearning_paths: true,\n\t\t\taction: \"join\",\n\t\t\troom: this.model.get(\"_id\"),\n\t\t\tuser: user.user_id\n\t\t});\n\t},\n\n\teditingToggle: function editingToggle() {\n\t\tif (canEdit()) {\n\t\t\tthis.ui.centreSection.addClass(\"invisible\");\n\t\t\tthis.ui.rightSection.removeClass(\"invisible\");\n\n\t\t\t$(\"body\").removeAttr(\"ondragstart\");\n\t\t\t$(\"body\").removeAttr(\"ondrop\");\n\n\t\t\teventBus.trigger(eventBus.Events.UpdateDraggingStatus, canEdit());\n\t\t\tlpRadio.trigger(Events.EditingChange, canEdit());\n\t\t\t// Reset to false\n\t\t\teventBus.trigger(eventBus.Events.ChangeMultiselect, false);\n\t\t} else {\n\t\t\tthis.ui.rightSection.addClass(\"invisible\");\n\n\t\t\tthis.ui.lockedStatus.addClass(\"hide\");\n\t\t\tthis.ui.selfLockedStatus.addClass(\"hide\");\n\t\t\tthis.ui.unknownStatus.addClass(\"hide\");\n\n\t\t\tthis.ui.centreSection.removeClass(\"invisible\");\n\n\t\t\t$(\"body\").attr(\"ondragstart\", \"return false;\");\n\t\t\t$(\"body\").attr(\"ondrop\", \"return false;\");\n\n\t\t\teventBus.trigger(eventBus.Events.UpdateDraggingStatus, canEdit());\n\t\t\tlpRadio.trigger(Events.EditingChange, canEdit());\n\n\t\t\tif (pageUnloading) return;\n\n\t\t\tvar user = globalRadio.request(App.Events.Requests.CurrentUser);\n\n\t\t\tif (user && this.model.get(\"lockOwner\")) {\n\t\t\t\tif (this.model.get(\"lockOwner\") === user.user_id) {\n\t\t\t\t\tthis.ui.lockedStatus.addClass(\"hide\");\n\n\t\t\t\t\tif (this.model.get(\"lockSpark\") !== this.model.get(\"websocket_id\") && this.model.get(\"wsConnected\")) this.ui.selfLockedStatus.removeClass(\"hide\");\n\t\t\t\t} else {\n\t\t\t\t\tthis.ui.ownerNames.text(this.model.get(\"lockOwnerName\"));\n\t\t\t\t\tthis.ui.lockedStatus.removeClass(\"hide\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tupdateOwner: function updateOwner(message) {\n\t\tvar _this67 = this;\n\n\t\tvar user = globalRadio.request(App.Events.Requests.CurrentUser);\n\t\tthis.model.set({ lockSpark: message.spark, lockOwner: message.owner, lockOwnerName: message.ownerName });\n\n\t\trequestedAccess = false;\n\n\t\tthis.ui.accessControllers.removeClass(\"hide\");\n\t\tthis.ui.accessPause.addClass(\"hide\");\n\n\t\tif (message.owner === user.user_id) {\n\t\t\tif (message.spark === this.model.get(\"websocket_id\")) {\n\t\t\t\tclearTimeout(this.requestedAccessTimer);\n\t\t\t\treturn this.model.fetch({\n\t\t\t\t\tsuccess: function success() {\n\t\t\t\t\t\t_this67.collection.reset(_.values(_this67.model.get(\"items\")));\n\n\t\t\t\t\t\tlpRadio.trigger(Events.EnableEditing);\n\t\t\t\t\t},\n\t\t\t\t\terror: function error(e) {\n\t\t\t\t\t\tconsole.error(\"Error refetching LP after ownership change\", e);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\t//console.debug(\"Disable editing\", message.owner, user.user_id, message.spark, this.model.get(\"websocket_id\"));\n\t\tlpRadio.trigger(Events.DisableEditing);\n\t},\n\n\tbodyClicker: function bodyClicker() {\n\t\tlpRadio.trigger(Events.BodyClick);\n\t\teventBus.trigger(eventBus.Events.CloseResources);\n\t\teventBus.trigger(eventBus.Events.CloseSimpleMenus);\n\t},\n\n\tbodyMousemove: function bodyMousemove(e) {\n\t\tvar _this68 = this;\n\n\t\tif (!draggingResource && !this.draggingNodeView) return;\n\n\t\t//Slow the trigger rate down.\n\t\tif (this.scrolledRecently) return;\n\n\t\tthis.scrolledRecently = true;\n\t\t_.delay(function () {\n\t\t\treturn _this68.scrolledRecently = false;\n\t\t}, 200);\n\n\t\tvar scrollOffset = Math.ceil(window.innerHeight / 7),\n\t\t    el = this.$el[0];\n\n\t\t// If the dragged item is close to the top or bottom of the screen, scroll the screen\n\t\tif (e.originalEvent.clientY < window.screenY + Math.ceil(window.innerHeight / 7) + this.$el.offset().top) {\n\t\t\tif (el.scrollBy) {\n\t\t\t\tel.scrollBy({\n\t\t\t\t\tleft: 0,\n\t\t\t\t\ttop: -scrollOffset,\n\t\t\t\t\tbehavior: \"smooth\"\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tel.scrollTop = el.scrollTop - scrollOffset;\n\t\t\t}\n\t\t} else if (e.originalEvent.clientY > window.screenY + window.innerHeight - scrollOffset) {\n\t\t\tif (el.scrollBy) {\n\t\t\t\tel.scrollBy({\n\t\t\t\t\tleft: 0,\n\t\t\t\t\ttop: scrollOffset,\n\t\t\t\t\tbehavior: \"smooth\"\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tel.scrollTop = el.scrollTop + scrollOffset;\n\t\t\t}\n\t\t}\n\t},\n\n\tonAddSectionClicked: function onAddSectionClicked() {\n\t\tthis.onAddSectionClick();\n\t},\n\n\tonAddSectionClick: function () {\n\t\tvar _ref4 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee4(sourceModel) {\n\t\t\tvar newSection, lastModel, opts;\n\t\t\treturn _regenerator2.default.wrap(function _callee4$(_context4) {\n\t\t\t\twhile (1) {\n\t\t\t\t\tswitch (_context4.prev = _context4.next) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tif (!(this.selectedView && this.selectedView.children.length)) {\n\t\t\t\t\t\t\t\t_context4.next = 5;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!this.selectedView.model.get(\"isCollapsed\")) {\n\t\t\t\t\t\t\t\t_context4.next = 4;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_context4.next = 4;\n\t\t\t\t\t\t\treturn this.selectedView.collapseNode(false);\n\n\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\treturn _context4.abrupt(\"return\", this.selectedView.onAddChildNodeBtn());\n\n\t\t\t\t\t\tcase 5:\n\t\t\t\t\t\t\tnewSection = new NodeModel({\n\t\t\t\t\t\t\t\tcategory: \"node\",\n\t\t\t\t\t\t\t\teditMode: true,\n\t\t\t\t\t\t\t\tlearning_path: this.model.get(\"learning_path\"),\n\t\t\t\t\t\t\t\tdepth: 1,\n\t\t\t\t\t\t\t\tpath: \"AAA\",\n\t\t\t\t\t\t\t\tgroups: [this.model.get(\"group\")]\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tlastModel = sourceModel || _.last(this.collection.models);\n\n\t\t\t\t\t\t\tif (lastModel) newSection.set(\"path\", localMethods.getNextPath(lastModel.path || lastModel.get(\"path\")));\n\n\t\t\t\t\t\t\topts = {};\n\n\t\t\t\t\t\t\tif (sourceModel) opts.at = this.collection.indexOf(sourceModel) + 1;\n\n\t\t\t\t\t\t\tthis.collection.add(newSection, opts);\n\n\t\t\t\t\t\tcase 11:\n\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\treturn _context4.stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, _callee4, this);\n\t\t}));\n\n\t\tfunction onAddSectionClick(_x6) {\n\t\t\treturn _ref4.apply(this, arguments);\n\t\t}\n\n\t\treturn onAddSectionClick;\n\t}(),\n\n\tonImportBookClick: function onImportBookClick(event, options) {\n\t\tvar _this69 = this;\n\n\t\tvar modal = new ImportTocModal({\n\t\t\tgroup: this.model.get(\"group\"),\n\t\t\tgroups: [this.model.get(\"group\")],\n\t\t\tlearning_path: this.model.get(\"learning_path\"),\n\t\t\tmodel: new Backbone.Model(),\n\t\t\thost: \"#link-resources\",\n\t\t\tresetFormat: options ? options.resetFormat : false,\n\t\t\tkeepBookAttachments: options ? options.keepBookAttachments : false\n\t\t});\n\n\t\tmodal.show({\n\t\t\tcreate: function create(items) {\n\t\t\t\t_this69.reloadTree();\n\n\t\t\t\tvar flattenItems = function flattenItems(obj, flatItems) {\n\t\t\t\t\t_.forOwn(obj, function (row) {\n\t\t\t\t\t\tflatItems.push(row);\n\t\t\t\t\t\tif (row.children) flattenItems(row.children, flatItems);\n\t\t\t\t\t});\n\t\t\t\t};\n\n\t\t\t\tvar flatItems = [];\n\t\t\t\tflattenItems(items, flatItems);\n\t\t\t\t_this69.importedItemsLength = flatItems.length;\n\t\t\t},\n\t\t\tcancel: function cancel() {\n\t\t\t\tmodal.destroy();\n\t\t\t}\n\t\t});\n\t},\n\n\tonResetFormatClick: function onResetFormatClick() {\n\t\tvar _this70 = this;\n\n\t\tvar modal = new SmallModal({\n\t\t\twarning: true,\n\t\t\ttitle: \"<span class='fal fa-sync-alt'/> Reset Format Warning\",\n\t\t\tbody: \"<p>All the content from the \" + settings.learningPathsCustomName + \" will be removed.</p><p>This operation makes irrevocable changes; they cannot be undone. Are you sure?</p>\\n\\t\\t\\t<p><label><input type=\\\"checkbox\\\" name=\\\"keepBookAttachments\\\" /> Keep all linked attachments in books.</label></p>\",\n\t\t\thost: \"#link-resources\"\n\t\t});\n\n\t\tmodal.on(\"button:ok\", function () {\n\t\t\tvar keepBookAttachments = $(\"input[name='keepBookAttachments']\", modal.el).prop(\"checked\");\n\n\t\t\tvar templateModal = new LpTemplateModal({\n\t\t\t\tgroup: _this70.model.get(\"group\"),\n\t\t\t\tmodel: new Backbone.Model()\n\t\t\t});\n\n\t\t\ttemplateModal.show({\n\t\t\t\tcreate: function create(result) {\n\t\t\t\t\tvar resetFormat = true;\n\n\t\t\t\t\tif (result.model.get(\"template\") === \"existing\") {\n\t\t\t\t\t\t// Clone the structure of the specified existing learning path\n\t\t\t\t\t\t_this70.sourceLPModel = new LearningPath({ group: result.model.get(\"sourceID\") });\n\t\t\t\t\t\t_this70.sourceLPModel.fetch({\n\t\t\t\t\t\t\turl: settings.urlRoot + \"/acacia/learningPaths/\" + result.model.get(\"sourceID\") + \"?clone=\" + _this70.model.get(\"group\") + \"&withResources=\" + result.model.get(\"withResources\") + \"&withTags=\" + result.model.get(\"withTags\") + \"&resetFormat=true&keepBookAttachments=\" + keepBookAttachments,\n\t\t\t\t\t\t\tsuccess: _this70.reloadTree.bind(_this70),\n\t\t\t\t\t\t\terror: _this70.loadSourceLPModelError.bind(_this70)\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (result.model.get(\"template\") === \"book\") {\n\t\t\t\t\t\t_.delay(_.bind(_this70.onImportBookClick, _this70, null, { resetFormat: resetFormat, keepBookAttachments: keepBookAttachments }), 100);\n\t\t\t\t\t} else if (result.model.get(\"template\") === \"blank\") {\n\t\t\t\t\t\t_this70.sourceLPModel = new LearningPath({ group: result.model.get(\"sourceID\") });\n\t\t\t\t\t\t_this70.sourceLPModel.fetch({\n\t\t\t\t\t\t\turl: settings.urlRoot + \"/acacia/learningPaths/?blank=true&resetFormat=true&group=\" + _this70.model.get(\"group\") + \"&keepBookAttachments=\" + keepBookAttachments,\n\t\t\t\t\t\t\tsuccess: _this70.reloadTree.bind(_this70),\n\t\t\t\t\t\t\terror: _this70.loadSourceLPModelError.bind(_this70)\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (result.model.get(\"template\") === \"calendar\") {\n\t\t\t\t\t\t_this70.sourceLPModel = new LearningPath({ group: result.model.get(\"sourceID\") });\n\t\t\t\t\t\t_this70.sourceLPModel.fetch({\n\t\t\t\t\t\t\turl: settings.urlRoot + \"/acacia/learningPaths/\" + _this70.model.get(\"group\") + \"?calendar=\" + result.model.get(\"type\") + \"&resetFormat=true&group=\" + _this70.model.get(\"group\") + \"&keepBookAttachments=\" + keepBookAttachments,\n\t\t\t\t\t\t\tsuccess: _this70.calendarImport.bind(_this70),\n\t\t\t\t\t\t\terror: _this70.loadSourceLPModelError.bind(_this70)\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tmodal.show();\n\t},\n\n\tnodeChanged: function nodeChanged() {\n\t\tthis.collection.trigger(\"node:change\");\n\t\tthis.loadLPNavigation();\n\n\t\tif (this.importedItemsLength) this.onImportScroll();\n\t},\n\n\tonImportScroll: function onImportScroll() {\n\t\t$(\".lp-node\")[$(\".lp-node\").length - this.importedItemsLength].scrollIntoView();\n\t\tthis.importedItemsLength = null;\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this71 = this;\n\n\t\tif (this._location) {\n\t\t\tvar _location$split = this._location.split(\"/\"),\n\t\t\t    _location$split2 = _slicedToArray(_location$split, 2),\n\t\t\t    view = _location$split2[0],\n\t\t\t    user = _location$split2[1];\n\n\t\t\tif (view === \"view\") {\n\t\t\t\tif (user && _.isFinite(parseInt(user, 10))) this.model.set({ defaultViewUser: user });\n\n\t\t\t\teventBus.trigger(eventBus.Events.ChangeLPView, view);\n\t\t\t}\n\t\t}\n\n\t\tvar treeView = new TreeView({\n\t\t\tcollection: this.collection,\n\t\t\tmodel: this.model\n\t\t});\n\n\t\tthis.showChildView(\"tree\", treeView);\n\n\t\tif (this.model.get(\"isNew\") || this.collection.length === 0) {\n\t\t\tvar modal = new LpTemplateModal({\n\t\t\t\tgroup: this.model.get(\"group\"),\n\t\t\t\tmodel: new Backbone.Model()\n\t\t\t});\n\n\t\t\tmodal.show({\n\t\t\t\tcreate: function create(result) {\n\t\t\t\t\tif (result.model.get(\"template\") === \"existing\") {\n\t\t\t\t\t\t// Clone the structure of the specified existing learning path\n\t\t\t\t\t\t_this71.sourceLPModel = new LearningPath({ group: result.model.get(\"sourceID\") });\n\t\t\t\t\t\t_this71.sourceLPModel.fetch({\n\t\t\t\t\t\t\turl: settings.urlRoot + \"/acacia/learningPaths/\" + result.model.get(\"sourceID\") + \"?clone=\" + _this71.model.get(\"group\") + \"&withResources=\" + result.model.get(\"withResources\") + \"&withTags=\" + result.model.get(\"withTags\"),\n\t\t\t\t\t\t\tsuccess: _this71.reloadTree.bind(_this71),\n\t\t\t\t\t\t\terror: _this71.loadSourceLPModelError.bind(_this71)\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (result.model.get(\"template\") === \"book\") {\n\t\t\t\t\t\t_.delay(_.bind(_this71.onImportBookClick, _this71), 100);\n\t\t\t\t\t} else if (result.model.get(\"template\") === \"calendar\") {\n\t\t\t\t\t\t_this71.sourceLPModel = new LearningPath({ group: result.model.get(\"sourceID\") });\n\t\t\t\t\t\t_this71.sourceLPModel.fetch({\n\t\t\t\t\t\t\turl: settings.urlRoot + \"/acacia/learningPaths/\" + _this71.model.get(\"group\") + \"?calendar=\" + result.model.get(\"type\"),\n\t\t\t\t\t\t\tsuccess: _this71.calendarImport.bind(_this71),\n\t\t\t\t\t\t\terror: _this71.loadSourceLPModelError.bind(_this71)\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tcancel: function cancel() {\n\t\t\t\t\tglobalRadio.trigger(App.Events.Commands.Navigate, settings.urlRoot + \"/console/learningPaths\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.loadLPNavigation();\n\t\tthis.configureOverlay();\n\t\tthis.addCamBtn();\n\n\t\tthis.initializeFinderStatus();\n\t\tBackbone.Marionette.bindEvents(this, eventBus, this.attachmentEvents);\n\n\t\twindow.addEventListener(\"scroll\", function () {\n\t\t\treturn (0, _tippy.hideAll)();\n\t\t});\n\t\tthis.$el.on(\"scroll\", function () {\n\t\t\treturn (0, _tippy.hideAll)();\n\t\t});\n\n\t\teventBus.trigger(eventBus.Events.ViewLoaded);\n\t},\n\tonAttach: function onAttach() {\n\t\tif (this.userState) this.showAndUpdateUserState(this.userState);\n\n\t\tif (editStates.viewMode) $(\".learning_path-manager\").get(0).scrollTop = 0;\n\t},\n\n\tcalendarImport: function calendarImport(response) {\n\t\tdelete response.attributes.group;\n\n\t\t$.ajax({\n\t\t\tmethod: \"POST\",\n\t\t\turl: settings.urlRoot + \"/acacia/learningPaths/items/bulk/\" + this.model.get(\"learning_path\"),\n\t\t\tdata: { book: null, items: response.attributes, groups: [this.model.get(\"group\")] },\n\t\t\tsuccess: this.reloadTree.bind(this),\n\t\t\terror: function error() {\n\t\t\t\treturn alert(\"Failed to create learning path items from calendar.\");\n\t\t\t}\n\t\t});\n\t},\n\n\tloadLPNavigation: function loadLPNavigation() {\n\t\tif (this.nav) {\n\t\t\tthis.nav.reloadCollection();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.nav = new LpNavigationSidebar({ group: this.model.get(\"group\") });\n\t\t_.extend(this.nav, SlideoutMixin);\n\n\t\teventBus.trigger(eventBus.Events.LoadNavigation, this.nav);\n\t},\n\n\tconfigureOverlay: function configureOverlay() {\n\t\tvar _this72 = this;\n\n\t\ttry {\n\t\t\t// Reconfigure the UI in response to resource drag operations\n\t\t\tthis.listenTo(eventBus, eventBus.Events.ResourceDragStart, function () {\n\t\t\t\t_this72.ui.overlay.css({ \"pointer-events\": \"all\" });\n\n\t\t\t\t_this72.ui.overlay.off(\"mousemove.forwardDragEvent\").on(\"mousemove.forwardDragEvent\", _.bind(_this72.forwardDragEvent, _this72));\n\t\t\t});\n\n\t\t\tthis.listenTo(eventBus, eventBus.Events.ResourceDragEnd, function () {\n\t\t\t\tlpRadio.trigger(Events.NodeDragEnd);\n\t\t\t\tlpRadio.trigger(Events.ResourceDragEnd);\n\t\t\t\t_this72.ui.overlay.css({ \"pointer-events\": \"none\" });\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tconsole.error(e);\n\t\t}\n\t},\n\n\taddCamBtn: function addCamBtn() {\n\t\tthis.camBtn = new CamBtn({ type: \"group\", item_id: window.location.pathname.split(\"/\").pop() });\n\t\tthis.ui.camBtnContainer.html(this.camBtn.render().el);\n\t},\n\n\tforwardDragEvent: function forwardDragEvent(event) {\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\n\t\tvar items = _.concat($(\"div.resource:visible\").get(), $(\"div.lp-node:visible\").get());\n\n\t\tvar x = event.originalEvent.clientX;\n\t\tvar y = event.originalEvent.clientY - (this.fullscreened ? -45 : 0) + this.ui.tree.get(0).scrollTop + window.pageYOffset;\n\n\t\tvar actual = _.find(items, function (item) {\n\t\t\tvar element = $(item);\n\n\t\t\tif (!element.isInViewport()) return;\n\n\t\t\tvar offset = element.offset();\n\n\t\t\treturn y >= offset.top && y <= offset.top + element.outerHeight(true) && x >= offset.left && x <= offset.left + element.outerWidth(true);\n\t\t});\n\n\t\tif (actual) $(actual).trigger(new $.Event(event.originalEvent));\n\n\t\tif (event.type === \"dragover\") this.bodyMousemove(event);\n\n\t\tif (event.type === \"drop\") draggingResource = null;\n\t},\n\n\treloadTree: function reloadTree() {\n\t\tvar _this73 = this;\n\n\t\tthis.model.fetch({\n\t\t\tsuccess: function success(model) {\n\t\t\t\t_this73.collection.set(_.values(model.get(\"items\")));\n\t\t\t\t_this73.collection.sort();\n\t\t\t\tif (canEdit() && !currentEditModelId) lpRadio.trigger(Events.EnableEditing);\n\t\t\t\tlpRadio.trigger(Events.NodeChange);\n\t\t\t},\n\t\t\terror: function error(model, response) {\n\t\t\t\t_this73.showError(response);\n\t\t\t}\n\t\t});\n\t},\n\n\tremoveChildNode: function removeChildNode(model) {\n\t\tthis.collection.remove(model);\n\t},\n\n\tnodeDragStart: function nodeDragStart(childView) {\n\t\tthis.draggingNodeView = childView;\n\t},\n\n\tnodeDragOver: function nodeDragOver(e, view) {\n\t\tif (!this.currentDragOverView) {\n\t\t\tthis.currentDragOverView = view;\n\t\t} else if (draggingResource && this.currentDragOverView && this.currentDragOverView.cid !== view.cid) {\n\t\t\tthis.currentDragOverView.checkAttachmentContainers();\n\t\t\tthis.currentDragOverView = view;\n\t\t} else if (!draggingResource && this.currentDragOverView.cid !== view.cid) {\n\t\t\tthis.currentDragOverView.model.set({ showDropIndicator: false });\n\t\t\tthis.currentDragOverView = view;\n\t\t}\n\n\t\tif (!draggingResource && this.draggingNodeView) {\n\t\t\tvar dragX = e.originalEvent.pageX,\n\t\t\t    dragY = e.originalEvent.pageY;\n\t\t\tvar node = view.ui.node;\n\t\t\tvar dropChild = false,\n\t\t\t    dropPosition = \"\";\n\t\t\tif (node && node.offset()) {\n\t\t\t\tvar offset = node.offset();\n\t\t\t\tvar height = node.outerHeight(true);\n\t\t\t\tvar width = node.outerWidth(true);\n\t\t\t\t//If we are dragging in the right half of the node, update the drop indicator to show a child drop.\n\t\t\t\tdropChild = dragX >= offset.top && dragY <= offset.top + height && dragX >= offset.left && dragX >= offset.left + width / (1 / childDropCrossover);\n\n\t\t\t\tif (dragY < offset.top + height / 2) dropPosition = \"above\";else if (dragY >= offset.top + height / 2) dropPosition = \"below\";\n\t\t\t}\n\n\t\t\tvar originalNodeId = this.draggingNodeView.model.get(\"lp_item_id\");\n\t\t\tvar originalNodePath = this.draggingNodeView.model.get(\"path\");\n\n\t\t\tif (view.model.get(\"dropChild\") !== dropChild) view.model.set({ dropChild: dropChild });\n\n\t\t\tif (_.startsWith(view.model.get(\"path\"), originalNodePath)) view.model.set({ showDropIndicator: false });else if (view.model.get(\"lp_item_id\") !== originalNodeId && !view.model.get(\"showDropIndicator\")) view.model.set({ showDropIndicator: true });\n\n\t\t\tif (dropPosition.length) view.model.set({ dropPosition: dropPosition });\n\t\t}\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\t// Leave LP room here\n\t\tvar user = globalRadio.request(App.Events.Requests.CurrentUser);\n\t\tif (App.ws.websocket) {\n\t\t\tApp.ws.websocket.write({\n\t\t\t\tlearning_paths: true,\n\t\t\t\taction: \"leave\",\n\t\t\t\troom: this.model.get(\"_id\"),\n\t\t\t\tuser: user.user_id\n\t\t\t});\n\t\t}\n\n\t\teventBus.trigger(App.Events.UnloadLearningPath);\n\n\t\teventBus.trigger(eventBus.Events.ChangeMultiselect, false);\n\t\tmultiselect = false;\n\t\tmsState = 0;\n\t\tthis.camBtn.destroy();\n\t},\n\n\tloadSourceLPModelError: function loadSourceLPModelError(error) {\n\t\tconsole.error(error);\n\t},\n\n\tinitializeFinderStatus: function initializeFinderStatus() {\n\t\tthis.FinderStatus = {\n\t\t\tresource: null,\n\t\t\tattachments: null,\n\t\t\tcurrentIndex: null\n\t\t};\n\t},\n\n\tresetFinderStatus: function resetFinderStatus(resourceIdentifier, reverse) {\n\t\tvar _this74 = this;\n\n\t\tif (this.FinderStatus.resource !== resourceIdentifier || this.attachments.removed.length > this.attachments.last_removed_length || this.attachments.added.length > this.attachments.last_added_length) {\n\t\t\tthis.attachments.last_removed_length = this.attachments.removed.length;\n\t\t\tthis.attachments.last_added_length = this.attachments.added.length;\n\t\t\tvar collectAttachments = function collectAttachments(array, attachments) {\n\t\t\t\t_.each(array, function (model) {\n\t\t\t\t\tvar row = model.attributes ? model.attributes : model;\n\n\t\t\t\t\tif (row.children) collectAttachments(row.children, attachments);else if (row.resource === resourceIdentifier) attachments.push(row);\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tvar attachments = [];\n\t\t\tcollectAttachments(this.collection.models, attachments);\n\t\t\tattachments = _.merge(attachments, this.attachments.added);\n\t\t\tattachments = _.filter(attachments, function (att) {\n\t\t\t\tvar removed_att = _.find(_this74.attachments.removed, function (removed) {\n\t\t\t\t\tif (removed.get(\"_id\") === att._id) return true;\n\t\t\t\t});\n\t\t\t\tif (!removed_att) return true;\n\t\t\t});\n\n\t\t\tthis.FinderStatus = {\n\t\t\t\tresource: resourceIdentifier,\n\t\t\t\tattachments: attachments,\n\t\t\t\tcurrentIndex: reverse ? attachments.length - 1 : 0\n\t\t\t};\n\t\t}\n\t},\n\n\tfindNextAttachment: function findNextAttachment(resourceIdentifier) {\n\t\tthis.resetFinderStatus(resourceIdentifier, true);\n\n\t\tthis.FinderStatus.currentIndex = (this.FinderStatus.currentIndex + 1) % this.FinderStatus.attachments.length;\n\t\tif (!this.FinderStatus.attachments[this.FinderStatus.currentIndex]) return;\n\t\tlpRadio.trigger(Events.FocusAttachment, this.FinderStatus.attachments[this.FinderStatus.currentIndex]);\n\t},\n\n\tfindPreviousAttachment: function findPreviousAttachment(resourceIdentifier) {\n\t\tthis.resetFinderStatus(resourceIdentifier, false);\n\n\t\tif (this.FinderStatus.attachments.length === 0) return;\n\n\t\tthis.FinderStatus.currentIndex = Math.max(0, (this.FinderStatus.currentIndex + (this.FinderStatus.attachments.length - 1)) % this.FinderStatus.attachments.length);\n\t\tif (this.FinderStatus.currentIndex >= this.FinderStatus.attachments.length) this.FinderStatus.currentIndex = 0;\n\t\tlpRadio.trigger(Events.FocusAttachment, this.FinderStatus.attachments[this.FinderStatus.currentIndex]);\n\t},\n\n\tonAttachmentAdded: function onAttachmentAdded(model) {\n\t\tthis.attachments.added.push(model);\n\t},\n\n\tonAttachmentRemoved: function onAttachmentRemoved(model) {\n\t\tthis.attachments.removed.push(model);\n\t},\n\n\tonGroupNotifyClick: function onGroupNotifyClick() {\n\t\teventBus.trigger(eventBus.Events.ShowGroupModal);\n\t},\n\n\tgroupsChanged: function groupsChanged(allowed, current) {\n\t\tif (_.intersection(_.map(allowed.system, function (x) {\n\t\t\treturn x.code;\n\t\t}), current).length === _.map(allowed.system, function (x) {\n\t\t\treturn x.code;\n\t\t}).length) this.ui.groupNotify.addClass(\"hide\");else this.ui.groupNotify.removeClass(\"hide\");\n\t},\n\n\tonStealAccess: function onStealAccess(override) {\n\t\tvar user = globalRadio.request(App.Events.Requests.CurrentUser);\n\t\tif (!override && !rester.hasAccess(rester.p.learningPaths.steal, user)) return;\n\n\t\tif (App.ws.websocket) {\n\t\t\tApp.ws.websocket.write({\n\t\t\t\tlearning_paths: true,\n\t\t\t\taction: \"steal\",\n\t\t\t\troom: this.model.get(\"_id\"),\n\t\t\t\tuser: user.user_id\n\t\t\t});\n\t\t}\n\t},\n\n\tonRequestAccess: function onRequestAccess() {\n\t\tvar _this75 = this;\n\n\t\tif (requestedAccess) {\n\t\t\treturn globalRadio.trigger(App.Events.Commands.Toast, {\n\t\t\t\tcontent: \"You already requested access in the last 90 seconds. Please wait.\",\n\t\t\t\ticon: \"fa-ban\",\n\t\t\t\ticonColour: \"red\",\n\t\t\t\thost: \"#link-resources\"\n\t\t\t});\n\t\t}\n\n\t\tvar user = globalRadio.request(App.Events.Requests.CurrentUser);\n\n\t\tif (App.ws.websocket) {\n\t\t\tApp.ws.websocket.write({\n\t\t\t\tlearning_paths: true,\n\t\t\t\taction: \"requestAccess\",\n\t\t\t\troom: this.model.get(\"_id\"),\n\t\t\t\tuser: user.user_id\n\t\t\t});\n\n\t\t\t// Make a note that we've requested access\n\t\t\trequestedAccess = true;\n\n\t\t\tthis.ui.accessControllers.addClass(\"hide\");\n\t\t\tthis.ui.accessPause.removeClass(\"hide\");\n\n\t\t\t// And time it\n\t\t\tthis.requestedAccessTimer = setTimeout(function () {\n\t\t\t\trequestedAccess = false;\n\t\t\t\t_this75.ui.accessControllers.removeClass(\"hide\");\n\t\t\t\t_this75.ui.accessPause.addClass(\"hide\");\n\t\t\t}, requestAccessTimeout * 1000);\n\n\t\t\t// If we don't get a response within 10 seconds, take control instantly\n\t\t\tthis.automaticStealTimer = setTimeout(function () {\n\t\t\t\trequestedAccess = false;\n\t\t\t\t_this75.onStealAccess(true);\n\t\t\t}, 10 * 1000);\n\t\t}\n\t},\n\n\thideFlashCardWidget: function hideFlashCardWidget() {\n\t\tif (this.flashCardWidget) this.flashCardWidget.destroy();\n\t},\n\n\tshowFlashCardWidget: function showFlashCardWidget() {\n\t\tthis.flashCardWidget = new FlashCardWidget();\n\t\tthis.$el.append(this.flashCardWidget.render().$el);\n\t},\n\n\tonDragEnter: function onDragEnter(event) {\n\t\tevent.preventDefault();\n\t\tthis.dragCount.content++;\n\t\tthis.ui.cancelDrop.removeClass(\"hide\");\n\t},\n\n\tonDragOver: function onDragOver(event) {\n\t\tevent.preventDefault();\n\t},\n\n\tonDragLeave: function onDragLeave() {\n\t\tthis.dragCount.content--;\n\t\tif (this.dragCount.content === 0) this.ui.cancelDrop.addClass(\"hide\");\n\t},\n\n\tonCancelDragEnter: function onCancelDragEnter(event) {\n\t\tevent.preventDefault();\n\t},\n\n\tonCancelDragOver: function onCancelDragOver(event) {\n\t\tevent.preventDefault();\n\t},\n\n\tonCancelFileDrop: function onCancelFileDrop(event) {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\tthis.dragCount = { content: 0 };\n\t\tthis.ui.cancelDrop.addClass(\"hide\");\n\t}\n});\n\nlocalMethods.getNextPath = function (fullPath) {\n\t//We only working with the last sequence in the full path.\n\tvar paths = _.split(fullPath, \".\");\n\tvar letters = _.split(_.last(paths), \"\");\n\n\tfor (var i = letters.length - 1; letters.length >= i; i--) {\n\t\tvar charCode = letters[i].charCodeAt(0);\n\t\tif (charCode < 90) {\n\t\t\t//Letter < Z, so we can do a straight forward increment.\n\t\t\tletters[i] = String.fromCharCode(charCode + 1);\n\t\t\tbreak;\n\t\t}\n\n\t\t//If we got here, letter must be \"Z\", or worse, an invalid character. Replace it with \"A\".\n\t\tletters[i] = \"A\";\n\n\t\tif (i <= 0) {\n\t\t\t//If we reached the first letter without finding anything less than Z, then it must be an all Z path.\n\t\t\tletters.push(\"A\");\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tpaths[paths.length - 1] = letters.join(\"\");\n\treturn paths.join(\".\");\n};\n\nlocalMethods.isSibling = function (pathA, pathB) {\n\t//Check for empty paths\n\tif (_.isEmpty(pathA) || _.isEmpty(pathB)) return false;\n\n\t//Can't be siblings if the paths are the same\n\tif (pathA === pathB) return false;\n\n\tvar pathA_Paths = _.split(pathA, \".\");\n\tvar pathB_Paths = _.split(pathB, \".\");\n\n\t//Can't be siblings if the lengths of the paths aren't the same\n\tif (pathA_Paths.length !== pathB_Paths.length) return false;\n\n\t//Both paths are on the top level, so must be siblings\n\tif (pathA_Paths.length === 1 && pathB_Paths.length === 1) return true;\n\n\t//If the intial paths before the last position aren't the same, then they don't belong to the same parent.\n\tvar isSibling = true;\n\t_.each(_.initial(pathA_Paths), function (path, index) {\n\t\tif (pathB_Paths[index] !== path) {\n\t\t\tisSibling = false;\n\t\t\treturn false;\n\t\t}\n\t});\n\n\treturn isSibling;\n};\n\nlocalMethods.isChild = function (parent, child) {\n\treturn _.startsWith(child, parent) && _.split(child, \".\").length === _.split(parent, \".\").length + 1;\n};\n\nlocalMethods.isAfter = function (first, second) {\n\tvar ret = false;\n\t_.each(first, function (char, index) {\n\t\tvar cc = char.charCodeAt(0);\n\t\tif (cc !== 0x2E && cc > second.charCodeAt(index)) {\n\t\t\tret = true;\n\t\t\treturn false;\n\t\t}\n\t});\n\n\treturn ret;\n};\n\n$.fn.isInViewport = function () {\n\tvar scroll = window.scrollY || window.pageYOffset;\n\tvar boundsTop = this[0].getBoundingClientRect().top + scroll;\n\n\tvar viewport = {\n\t\ttop: scroll,\n\t\tbottom: scroll + window.innerHeight\n\t};\n\n\tvar bounds = {\n\t\ttop: boundsTop,\n\t\tbottom: boundsTop + this[0].clientHeight\n\t};\n\n\treturn bounds.bottom >= viewport.top && bounds.bottom <= viewport.bottom || bounds.top <= viewport.bottom && bounds.top >= viewport.top;\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxlYXJuaW5nUGF0aFZpZXcuanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwiXyIsIiQiLCJtb21lbnQiLCJ0aXBweSIsImRlZmF1bHQiLCJmbGF0cGlja3IiLCJQcm9taXNlIiwicmVzdGVyIiwiU2xpZGVvdXQiLCJldmVudEJ1cyIsIkFwcCIsIlNlbGVjdHJhIiwiTHBUZW1wbGF0ZU1vZGFsIiwiTHBOYXZpZ2F0aW9uU2lkZWJhciIsIkltcG9ydFRvY01vZGFsIiwiQm9va0Nob29zZXJNb2RhbCIsIkFzc2Vzc21lbnRQcm9tcHQiLCJzZXR0aW5ncyIsImdsb2JhbFJhZGlvIiwiUmFkaW8iLCJjaGFubmVsIiwibHBSYWRpbyIsIlNtYWxsTW9kYWwiLCJMaWdodEJveCIsIkFzc2Vzc21lbnRNb2RhbCIsIkFzc2Vzc21lbnQiLCJHcm91cE1vZGFsIiwiUmVzb3VyY2VPcGVuZWRNb2RhbCIsIkZsYXNoQ2FyZFdpZGdldCIsIkNhbUJ0biIsIkJ1bGtEcmFnRHJvcEhlbHBlciIsIkJ1bGtSZXNvdXJjZVVwbG9hZE1vZGFsIiwiRmxhc2hjYXJkUHJldmlldyIsIkV2ZW50cyIsIkJvZHlDbGljayIsIk5vZGVTZWxlY3RlZCIsIkVuYWJsZUVkaXRpbmciLCJEaXNhYmxlRWRpdGluZyIsIkVkaXRpbmdDaGFuZ2UiLCJDb25uZWN0aW9uTG9zdCIsIkNvbm5lY3RlZCIsIk5vZGVDaGFuZ2UiLCJDb2xsYXBzZSIsIkVkaXRpbmdTdGFydGVkIiwiRWRpdGluZ0VuZGVkIiwiQWRkUmVzb3VyY2UiLCJNb3ZlUmVzb3VyZSIsIlJlbG9hZE5vZGUiLCJBZGRTaWJsaW5nTm9kZSIsIlJlbW92ZU5vZGVGcm9tUGFyZW50IiwiUHJvbW90ZVNpYmxpbmdOb2RlIiwiUmVtb3ZlQ29udGVudEZyb21QYXJlbnQiLCJBZGRDb250ZW50Tm9kZSIsIkNoZWNrQXR0YWNobWVudENvbnRhaW5lcnMiLCJTdGFydE5vZGVFZGl0IiwiQ2FuY2VsTm9kZUVkaXQiLCJDb21wbGV0ZU5vZGVFZGl0IiwiTm9kZURyYWdTdGFydCIsIk5vZGVEcmFnTGlzdGVuIiwiTm9kZURyYWdPdmVyIiwiTm9kZURyYWdFbmQiLCJOb2RlRHJhZ01vdmUiLCJOb2RlRHJvcEFib3ZlIiwiTm9kZVNlbGVjdExpc3RlbiIsIk5vZGVTZWxlY3RPdmVyIiwiTm9kZVNlbGVjdEVuZCIsIlNpYmxpbmdEcm9wIiwiQ2hpbGREcm9wIiwiVmlld1VzZXJDaGFuZ2UiLCJSZXNvdXJjZURyYWdTdGFydCIsIlJlc291cmNlRHJhZ0xpc3RlbiIsIlJlc291cmNlRHJhZ092ZXIiLCJSZXNvdXJjZURyYWdFbmQiLCJGb2N1c0F0dGFjaG1lbnQiLCJSZXNvdXJjZURyYWdNb3ZlIiwiTXVsdGlzZWxlY3RTdGFydCIsIkdldFByaW1hcnlHcm91cCIsIlJlbW92ZUxQSXRlbXMiLCJsb2NhbE1ldGhvZHMiLCJUcmVlVmlldyIsIlJlc291cmNlc1ZpZXciLCJUcmVlRWRpdCIsIlRyZWVDb250ZW50IiwiUmVzb3VyY2VFZGl0IiwiZHJhZ2dpbmdSZXNvdXJjZSIsImN1cnJlbnRFZGl0TW9kZWxJZCIsImJvb2tQYWdlcyIsInZpZXdpbmdVc2VyIiwicmVxdWVzdGVkQWNjZXNzIiwicGFnZVVubG9hZGluZyIsIm11bHRpc2VsZWN0IiwibXNTdGF0ZSIsIml0ZW1EcmFnSGl0IiwiY2hpbGREcm9wQ3Jvc3NvdmVyIiwibWF4RGVzY0xlbmd0aCIsImRhdGVGb3JtYXQiLCJyZXF1ZXN0QWNjZXNzVGltZW91dCIsIm11bHRpc2VsZWN0SXRlbXMiLCJlZGl0U3RhdGVzIiwiZWRpdGluZ0FsbG93ZWQiLCJ2aWV3TW9kZSIsIm1vZGVsTWFwIiwidGFza01hcCIsImdyb3VwTWFwIiwiY2FuRWRpdCIsImdldENvbnRyYXN0IiwiY29sb3VyIiwibHVtYSIsInBhcnNlSW50Iiwic2xpY2UiLCJOb2RlTW9kZWwiLCJNb2RlbCIsImV4dGVuZCIsImRlZmF1bHRzIiwidmlzaWJsZSIsImxvY2tlZCIsImlzVGFzayIsInRhZ3MiLCJkZXNjcmlwdGlvbiIsImFjdGl2YXRpb25EYXRlIiwiZHVlRGF0ZSIsIm1iZV9zY29yZSIsImlkQXR0cmlidXRlIiwidXJsUm9vdCIsInZhbGlkYXRlIiwiYXR0cnMiLCJyZXQiLCJ0aXRsZSIsInVuaXgiLCJwYWdlUmFuZ2UiLCJsZW5ndGgiLCJwYWdlRW5kIiwiT2JqZWN0Iiwia2V5cyIsImhhc0xvY2tEYXRlIiwiZ2V0IiwiQm9vbGVhbiIsIl9jaGlsZHJlbiIsInNvbWUiLCJ4IiwiX3Rhc2tzIiwiX3Jlc291cmNlcyIsImhhc1Zpc2liaWxpdHkiLCJDaGlsZHJlbkNvbGxlY3Rpb24iLCJDb2xsZWN0aW9uIiwibW9kZWwiLCJjb21wYXJhdG9yIiwiUmVzb3VyY2VNb2RlbCIsIkF0dGFjaG1lbnRNb2RlbCIsIlRhZ01vZGFsIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsInRhZ0NyZWF0aW9uIiwidWkiLCJjb2xvdXJCbG9jayIsInNlbGVjdGVkQ29sb3VyIiwic2F2ZSIsImNhbmNlbCIsImNsb3NlciIsImVycm9ycyIsImxhYmVsIiwiY3VzdG9tQ29sb3VyIiwiZXZlbnRzIiwiY2xpY2siLCJtb3VzZXVwIiwiY29sb3VycyIsInRlbXBsYXRlQ29udGV4dCIsImluaXRpYWxpemUiLCJwcm9tIiwicmVzb2x2ZSIsInJlamVjdCIsImRlc3Ryb3kiLCJlIiwib25DbGljayIsImV2dCIsInN0b3BQcm9wYWdhdGlvbiIsInNob3ciLCJ2aWV3IiwiZWxPZmZzZXQiLCIkZWwiLCJvZmZzZXQiLCJhcHBlbmQiLCJyZW5kZXIiLCJlbCIsImNzcyIsImxlZnQiLCJ3aWR0aCIsImgiLCJvdXRlckhlaWdodCIsImVsaCIsInRvcCIsImRvY3VtZW50Iiwib24iLCJjaG9vc2VDb2xvdXIiLCJzZXQiLCJjdXJyZW50VGFyZ2V0IiwiZGF0YSIsInJlbW92ZUNsYXNzIiwiYWRkQ2xhc3MiLCJ2YWwiLCJjbGVhckVycm9yIiwiY2hhbmdlQ3VzdG9tQ29sb3VyIiwidmFsdWUiLCJ0cmltIiwiaHRtbCIsImZpbmQiLCJyZW1vdmUiLCJSZXNvdXJjZUNvbGxlY3Rpb24iLCJjb2wiLCJvcHRpb25zIiwidGFza3MiLCJUYWdzIiwiQmVoYXZpb3IiLCJ0YWciLCJ0YWdCdG4iLCJ0YWdSZW1vdmVyIiwibW9kZWxFdmVudHMiLCJvblJlbmRlciIsIml0ZW0iLCJvblRhZ0J0bkNsaWNrIiwib25CZWZvcmVEZXN0cm95Iiwib2ZmIiwib25UYWdDbGljayIsInVybCIsImlzTmV3IiwiaWQiLCJ0YWdnaW5nIiwic2VhcmNoIiwibXVsdGlwbGUiLCJzb3J0IiwidmlydHVhbEJhc2UiLCJhdXRvT3BlbkRyb3Bkb3duIiwiaWNvbnMiLCJjaGVja2JveGVzIiwiZGRXaWR0aCIsImRkSG9zdCIsInNlcnZlciIsImtleSIsImZldGNoIiwiaXRlbXMiLCJwYWdpbmciLCJwYWdlU2l6ZSIsImluZmluaXRlIiwiYWxsb3dDcmVhdGlvbiIsIm1vZGUiLCJ0ZXh0IiwiY2FsbGJhY2siLCJjcmVhdGVOZXdUYWciLCJzYXZlRmlyc3QiLCJoaWRlT25DbGljayIsImludGVyYWN0aXZlcyIsIm1hbmFnZSIsIm1hbmFnZVRhZ3MiLCJsaXN0ZW5UbyIsIlZhbHVlQ2hhbmdlZCIsImNoYW5nZXMiLCJ0YWdMaXN0IiwibWFwIiwic2VsZWN0aW9uIiwidG9KU09OIiwicGF0Y2giLCJ3YWl0IiwiY2xvc2UiLCJjbGlja2VyIiwidGFnTW9kYWwiLCJ0cmlnZ2VyIiwiQ29tbWFuZHMiLCJOYXZpZ2F0ZSIsInJlcXVlc3QiLCJvblRhZ1JlbW92ZSIsImNoYW5nZSIsInRhZ19pZCIsIm9uVGFnc0NoYW5nZSIsIm1hcmt1cHMiLCJyZXBsYWNlIiwiam9pbiIsIkRyYWdnaW5nRWxlbWVudCIsImRyYWdnaW5nRWxlbWVudCIsIlRyZWVOb2RlIiwidGFnTmFtZSIsImxlYXJuaW5nUGF0aE5vZGUiLCJjbGFzc2VzIiwicHVzaCIsInJlZ2lvbnMiLCJlZGl0IiwiY29udGVudCIsImNoaWxkcmVuIiwicmVzb3VyY2VzIiwicmVwbGFjZUVsZW1lbnQiLCJub2RlIiwiZWRpdEFyZWEiLCJjb250ZW50QXJlYSIsImRyb3BwYWJsZSIsImRyb3BJbmRpY2F0b3IiLCJkb3QiLCJjb21wbGV0aW9uVGljayIsInN2Z0dyYWRpZW50IiwiY29ubmVjdG9yIiwibG9ja2VkSWNvbiIsImxvY2tlZExpbmUiLCJzaWRlTGluZSIsImNoZWNrYm94Q29udGFpbmVyIiwiY2hlY2tib3giLCJub2RlQXR0YWNobWVudHMiLCJ0YXNrc0NvbnRhaW5lciIsInRhc2tzVGl0bGUiLCJyZXNvdXJjZXNDb250YWluZXIiLCJyZXNvdXJjZXNUaXRsZSIsImNoaWxkTm9kZXNDb250YWluZXIiLCJhZGRDaGlsZE5vZGVCdG4iLCJkcm9wT3ZlcmxheSIsInRhc2tPdmVybGF5IiwicmVzb3VyY2VPdmVybGF5IiwiZmFrZVRhc2siLCJmYWtlUmVzb3VyY2UiLCJvdmVybGF5Iiwib3ZlcmxheVNhdmluZyIsIm92ZXJsYXlOb2Ryb3AiLCJkcmFnZW50ZXIiLCJkcmFnbGVhdmUiLCJjaGlsZFZpZXdFdmVudHMiLCJNb3ZlUmVzb3VyY2UiLCJzeW5jIiwiZXJyb3IiLCJscFJhZGlvRXZlbnRzIiwiaXNMb2NrZWQiLCJpc1BhcmVudExvY2tlZCIsImJpbmRFdmVudHMiLCJwYXJlbnRMb2NrZWQiLCJwYXJlbnRBY3RpdmF0aW9uIiwicGFyZW50VmlzaWJsZSIsIkF0dGFjaG1lbnRBZGRlZCIsIm9uQXR0YWNobWVudEFkZGVkIiwiYmluZCIsIkF0dGFjaG1lbnRSZW1vdmVkIiwib25BdHRhY2htZW50UmVtb3ZlZCIsImRyYWdDb3VudCIsInRhc2siLCJyZXNvdXJjZSIsInhociIsInNhdmVRdWV1ZSIsIm9uTm9kZURyYWdFbnRlciIsImV2ZW50Iiwic3BsaXQiLCJvbk5vZGVEcmFnTGVhdmUiLCJvblRhc2tEcmFnRW50ZXIiLCJvblRhc2tEcmFnTGVhdmUiLCJvblJlc291cmNlRHJhZ0VudGVyIiwib25SZXNvdXJjZURyYWdMZWF2ZSIsIm9uRmlsZURyYWdPdmVyIiwicHJldmVudERlZmF1bHQiLCJvcmlnaW5hbEV2ZW50IiwiZGF0YVRyYW5zZmVyIiwiZHJvcEVmZmVjdCIsIm9uRmlsZURyb3AiLCJidWxrRHJhZ0Ryb3BIZWxwZXIiLCJncm91cCIsIkdldEN1cnJlbnRHcm91cCIsImlzVGFza3MiLCJwYXJlbnQiLCJoYXNDbGFzcyIsImZpbGVzIiwiZmlsdGVyIiwiZXh0cmFjdEZpbGVzRnJvbUV2ZW50IiwiZiIsImZpbGUiLCJzdWJqZWN0IiwiZ3JhZGUiLCJsYW5ndWFnZSIsImZpbGVNb2RlbCIsImVycm9yQ291bnQiLCJmaWxlTW9kZWxzIiwiZ2V0UmVzb3VyY2VNb2RlbCIsInZhbHVlcyIsIm1vZGFsIiwiZG9udFNhdmUiLCJvbmNlIiwiYWN0aW9uIiwiY2FuY2VsZWRGaWxlcyIsImVhY2giLCJvblVwbG9hZENhbmNlbCIsImN1cnJlbnRseVNhdmluZyIsInNldFNhdmVRdWV1ZSIsInNhdmVGaWxlcyIsIm9uVXBsb2FkQ2FuY2VsQWxsIiwibWVyZ2UiLCJncm91cHMiLCJHZXRDdXJyZW50R3JvdXBzIiwibGVhcm5pbmdfcGF0aCIsInBhdGgiLCJpc1NpYmxpbmciLCJtYXhUYXNrIiwibGFzdCIsIm1heFJlc291cmNlIiwiZ2V0TmV4dFBhdGgiLCJpc0FmdGVyIiwicmVzb3VyY2VNb2RlbCIsImNvbnRlbnRTYXZlTWFwIiwiY2lkIiwiYWRkIiwib25VcGxvYWRQcm9ncmVzcyIsIk5hdmlnYXRpb25Qcm9tcHQiLCJzaGlmdCIsImJpbmFyeVNhdmUiLCJhdHRyaWJ1dGVzIiwic3VjY2VzcyIsInNhdmVSZXNvdXJjZVN1Y2Nlc3MiLCJzYXZlUmVzb3VyY2VFcnJvciIsInVuc2V0IiwicmVvcmRlckNvbnRlbnQiLCJscGlNb2RlbCIsImFuc3dlciIsInBhcnNlUmVzcG9uc2UiLCJyZXNwb25zZUpTT04iLCJkZWxldGUiLCJkZXRhaWwiLCJpbmZvIiwibW9kZWxzIiwibHBJdGVtIiwiaGFzIiwiZXJyb3JNZXNzYWdlIiwiY2hhckNvZGVBdCIsImJvZHkiLCJob3N0Iiwid2FybmluZyIsImhpZGVCdXR0b25zIiwic3RhdHVzVGV4dCIsInBlcmNlbnRhZ2UiLCJhYm9ydCIsIm9sZEF0dHJpYnV0ZXMiLCJvbkNhbmNlbEJ0bkNsaWNrIiwiZm9yT3duIiwiY2xlYXJUaW1lb3V0IiwibG9ja0ludGVydmFsIiwib25Qcm9ncmVzc0NoYW5nZSIsInAiLCJzdHlsZSIsImZpbGwiLCJzdHJva2UiLCJzZXRBdHRyaWJ1dGUiLCJvbk5vZGVDbGljayIsInVzZXIiLCJSZXF1ZXN0cyIsIkN1cnJlbnRVc2VyIiwiaGFzQWNjZXNzIiwibGVhcm5pbmdQYXRocyIsInNlbGVjdGVkIiwib25MYXN0Tm9kZUNoYW5nZSIsImxhc3ROb2RlIiwic3RhcnRNdWx0aXNlbGVjdCIsIndoaWNoIiwid2hpdGVsaXN0IiwidGFyZ2V0IiwiY2xhc3NMaXN0IiwiY29udGFpbnMiLCJvbk11bHRpU2VsZWN0aW5nQ2hhbmdlIiwicHJvcCIsIm5vZGVTZWxlY3RMaXN0ZW4iLCJub2RlU2VsZWN0RW5kIiwib25DaGVja2JveENsaWNrIiwib25DaGlsZHJlbkNoYW5nZSIsImRhdGFzIiwiZ3JvdXBCeSIsImNhdGVnb3J5Iiwib25QYXJlbnRMb2NrQ2hhbmdlIiwib25QYXJlbnRWaXNpYmxlQ2hhbmdlIiwiZWRpdGluZ1N0YXJ0IiwiZWRpdGluZ0VuZCIsImJvZHlDbGlja0V2ZW50Iiwibm9kZVNlbGVjdGVkRXZlbnQiLCJvbkVkaXRpbmdDaGFuZ2UiLCJ0b2dnbGUiLCJvblNlbGVjdGVkU3RhdHVzQ2hhbmdlIiwib25FZGl0TW9kZUNoYW5nZSIsIm9uU2hvd0Ryb3BJbmRpY2F0b3JDaGFuZ2UiLCJvbkRyb3BDaGlsZENoYW5nZSIsIm9uRHJvcFBvc2l0aW9uQ2hhbmdlIiwiaW5zZXJ0QmVmb3JlIiwiaGVpZ2h0IiwiaW5zZXJ0QWZ0ZXIiLCJvbkRvdENsaWNrIiwiYWpheCIsIm1ldGhvZCIsImNvbW1lbnQiLCJjb25zb2xlIiwiZXJyIiwiX2lkIiwicHJvZ3Jlc3MiLCJvblNhdmVCZWdpbiIsInNob3dPdmVybGF5Iiwib25TYXZlRW5kIiwiaGlkZU92ZXJsYXkiLCJvblNhdmVFcnJvciIsIm9uTG9ja2VkQ2hhbmdlIiwic2V0TG9ja0V4cGlyeSIsIm9uVmlzaWJsZUNoYW5nZSIsInNldFRpbWVvdXQiLCJ5Iiwic3BsaWNlIiwic29ydGVkSW5kZXhCeSIsInoiLCJpIiwiTWF0aCIsIm1heCIsInByb2dyZXNzQ2hhbmdlIiwicHJvZ3Jlc3NDYWNoZSIsInJlZHVjZSIsInN1bSIsIm51bSIsImNlaWwiLCJzaG93Q2hpbGRWaWV3IiwiY29sbGVjdGlvbiIsImNoZWNrQXR0YWNobWVudENvbnRhaW5lcnMiLCJkIiwiZGVwdGgiLCJvbkF0dGFjaCIsInNjcm9sbEludG9WaWV3Iiwic3RhcnROb2RlRWRpdCIsIm9uRG9tUmVmcmVzaCIsInNldEJyYWluVGlwcHkiLCJzbGlkZVVwIiwic2xpZGVEb3duIiwiZWRpdE1vZGUiLCJjYW5jZWxOb2RlRWRpdCIsImNvbXBsZXRlTm9kZUVkaXQiLCJjb2xsYXBzZU5vZGUiLCJjb2xsYXBzZSIsIm9wdHMiLCJpc0NvbGxhcHNlZCIsImRlbGF5IiwidGhlbiIsInJlbG9hZE5vZGUiLCJyZXNwb25zZSIsInNob3dFcnJvciIsInJlbW92ZUNoaWxkTm9kZSIsInJlbW92ZUNoaWxkQ29udGVudCIsIm9uRGVwdGhDaGFuZ2UiLCJvblRhc2tEcmFnRHJvcCIsIm9uQ29udGVudERyb3AiLCJvblJlc291cmNlRHJhZ0Ryb3AiLCJmaW5hbGl6ZURyb3AiLCJtb3ZlIiwicmVzIiwicmVzb3VyY2VUeXBlIiwibW92ZVJlc291cmNlIiwiYWRkUmVzb3VyY2UiLCJkdXBsaWNhdGVzIiwiY3VzdG9tT0siLCJpbmxpbmVNZXNzYWdlIiwic2V0dGluZ3NNb2RlbCIsInNlcnZlclNhdmUiLCJpbnN0YW5jZU5hbWUiLCJyZXF1aXJlQ29kZSIsImNvZGUiLCJ1bmRlZmluZWQiLCJkaXNhYmxlUmFuZG9taXphdGlvbiIsImhpZGVDb21wbGV0ZUJ1dHRvbnMiLCJkaXNhYmxlUmVzdWx0IiwiYWN0aXZhdGlvblR5cGUiLCJzdGFydERhdGUiLCJzdGFydFRpbWUiLCJvbGRQYXRoIiwibmV3UGF0aCIsImxvY2FsTW92ZSIsIm1vdmluZyIsIm9sZERSIiwidWNwIiwiYWRkU2libGluZ05vZGUiLCJtIiwib25BZGRDaGlsZE5vZGVCdG4iLCJzaWJsaW5nIiwic291cmNlTW9kZWwiLCJuZXh0Q2hpbGRQYXRoIiwiZmlyc3QiLCJFcnJvciIsIm5ld0NoaWxkRGF0YSIsImF0IiwiaW5kZXhPZiIsInByb21vdGVTaWJsaW5nTm9kZSIsInBvc2l0aW9uIiwidHlwZSIsInVwcGVyRmlyc3QiLCJzdGFydE5vZGVEcmFnIiwid2luZG93IiwiZ2V0U2VsZWN0aW9uIiwiZW1wdHkiLCJyZW1vdmVBbGxSYW5nZXMiLCJkcmFnZ2luZ05vZGUiLCJ6SW5kZXgiLCJtb3ZlQXQiLCJwYWdlWCIsInBhZ2VZIiwib25lIiwicGFyZW50Tm9kZSIsInJlbW92ZUNoaWxkIiwiZWxlbXMiLCJjbGllbnRYIiwiY2xpZW50WSIsImZ1bGxzY3JlZW5lZCIsInNjcm9sbFRvcCIsInBhZ2VZT2Zmc2V0IiwiYWN0dWFsIiwiZWxlbWVudCIsImlzSW5WaWV3cG9ydCIsIm91dGVyV2lkdGgiLCJuZXh0IiwicHJldiIsIm9uTm9kZURyYWdTdGFydCIsImNvbnN0YW50Iiwibm9kZURyYWdMaXN0ZW4iLCJyZXNvdXJjZURyYWdMaXN0ZW4iLCJyZXNvdXJjZURyYWdFbmQiLCJub2RlRHJvcHBlZCIsImRyb3BDaGlsZCIsImRyb3BQb3NpdGlvbiIsInNob3dEcm9wSW5kaWNhdG9yIiwibm9kZURyb3BwZWRBYm92ZSIsInNyY01vZGVsIiwiaW5kZXgiLCJjaGlsZHJlblZpZXciLCJnZXRDaGlsZFZpZXciLCJwcmV2aW91c01vZGVsIiwicHJldmlvdXNWaWV3IiwiZmluZEJ5TW9kZWwiLCJkcm9wRmlyc3RDaGlsZCIsIm5vZGVEcmFnRW5kZWQiLCJwYXRocyIsInVwZGF0ZUJyYWluU2NvcmUiLCJmZXRjaEJyYWluU2NvcmVTdWNjZXNzIiwicXVlcnlTZWxlY3RvckFsbCIsInRoZW1lIiwiZHVyYXRpb24iLCJhbmltYXRpb24iLCJwbGFjZW1lbnQiLCJmbGlwIiwiYXJyb3ciLCJkaXN0YW5jZSIsIm9uU2hvdyIsImZvckVhY2giLCJwb3BwZXIiLCJpbnN0YW5jZSIsIl90aXBweSIsImhpZGUiLCJvblJlbW92ZUxQSXRlbXMiLCJscE5vZGVDb250ZW50IiwiYmVoYXZpb3JzIiwiY29sbGFwc2VCdG4iLCJicmFpbiIsIm1vcmVEZXNjIiwiYWN0aXZhdGlvbkNvbnRhaW5lciIsImxvY2tJbmRpY2F0b3IiLCJ2aXNpYmlsaXR5SW5kaWNhdG9yIiwiaW52YWxpZCIsImRlc2NMZW5ndGgiLCJwcmludEFjdGl2YXRpb25EYXRlIiwiZm9ybWF0IiwiYyIsImhhc0FjdGl2YXRpb25EYXRlIiwib25Db2xsYXBzZUNoYW5nZSIsInRvZ2dsZUNsYXNzIiwib25FZGl0Q2hhbmdlIiwib25Mb2NrZWRTdGF0dXNDaGFuZ2UiLCJvblRvZ2dsZURlc2MiLCJvbkJyYWluQ2xpY2siLCJvblBhZ2VSYW5nZUNsaWNrIiwiVG9hc3QiLCJpY29uIiwiaWNvbkNvbG91ciIsIm9uT3B0aW9uc0NsaWNrIiwidG9vbGJhciIsImF0dHIiLCJhdXRvU2hvdyIsImNsb3NlT25JdGVtQ2xpY2siLCJkZXN0cm95T25DbG9zZSIsIm9uRWRpdENsaWNrIiwib25IaWRlQ2xpY2siLCJvbkRlbGV0ZUNsaWNrIiwiZmluYWxpc2VTYXZlIiwiY2hpbGRWaXNpYmlsaXR5Iiwib25WaXNpYmxlU3RhdHVzQ2hhbmdlIiwib25Db2xsYXBzZUJ0bkNsaWNrIiwibGVhcm5pbmdQYXRoc0N1c3RvbU5hbWUiLCJ2YWxpZGF0aW9uRmFpbGVkIiwibXNnIiwidmFsaWRhdGlvbkVycm9yIiwibHBOb2RlRWRpdCIsImNvbnRyb2xzIiwibG9jayIsImxvY2tUaW1lIiwiYWN0aXZhdGlvblRpbWUiLCJwYWdlU3RhcnQiLCJ0aXRsZUlucHV0IiwiZGVzY3JpcHRpb25JbnB1dCIsImNsZWFyQWN0aXZhdGlvbiIsImJvb2tMaW5rQnRuIiwibGlua2VkQm9vayIsImxpbmtlZEJvb2tTcGlubmVyIiwibGlua2VkQm9va0Vycm9yIiwiYm9va1RpdGxlIiwiY2FuY2VsTm9kZUVkaXRCdG4iLCJzYXZlTm9kZUVkaXRCdG4iLCJwYWdlRmV0Y2hYSFIiLCJhZnRlciIsIm9uQ2xlYXJBY3RpdmF0aW9uIiwib25Mb2NrQnRuQ2xpY2siLCJvbkNhbmNlbE5vZGVFZGl0QnRuQ2xpY2siLCJvblNhdmVOb2RlRWRpdEJ0bkNsaWNrIiwiYVRpbWVIciIsImFUaW1lTWluIiwidCIsImFUaW1lIiwibG9jYWwiLCJjb21wYWN0IiwiaXNFbXB0eSIsInN0YXJ0Qm9va1BhZ2UiLCJlbmRCb29rUGFnZSIsInBhZ2VSYW5nZURpc3BsYXkiLCJwYWdlIiwiYm9vayIsIlN0cmluZyIsIndpbGxDaGFuZ2UiLCJob3VyIiwibWludXRlIiwic2Vjb25kIiwidmFsdWVPZiIsImRlZmF1bHREYXRlIiwiYWx0SW5wdXQiLCJhbHRGb3JtYXQiLCJlbmFibGVUaW1lIiwibm9DYWxlbmRhciIsInJlZnJlc2hQYWdlU2VsZWN0b3JzIiwicGFnZXMiLCJzb3J0QnkiLCJwbGFjZWhvbGRlciIsIm9uTGlua2VkQm9va0Vycm9yQ2xpY2siLCJvbkJvb2tMaW5rQnRuQ2xpY2siLCJib29rcyIsImNyZWF0ZSIsImJvb2tJRCIsImRlbGV0ZVJlc291cmNlTm9kZSIsIlJlc291cmNlTm9kZSIsInJlc291cmNlTm9kZSIsInJlc291cmNlSW5mbyIsImR1ZUNvbnRhaW5lciIsInByb2dyZXNzSW5kaWNhdG9yIiwicHJvZ3Jlc3NCYXIiLCJjYW5jZWxCdXR0b24iLCJlcnJvckJ1dHRvbiIsImN1c3RvbUdyb3VwcyIsIm1vdXNlZG93biIsImRyb3ByZXNvdXJjZSIsInJlc291cmNlRXZlbnRzIiwicHJpbnREdWVEYXRlIiwic2hvd09wdGlvbnMiLCJoYXNEdWVEYXRlIiwiY29tcGxldGVkIiwiaGFzRXJyb3IiLCJpc05pbCIsImdldEVycm9yTWVzc2FnZSIsImdldEdyb3VwcyIsIkdldEFsbG93ZWRHcm91cHMiLCJhdHRhY2htZW50IiwiZHVlSW50ZXJ2YWwiLCJvblJlc291cmNlQ2xpY2siLCJvbkludmlzaWJpbGl0eUNsb2FrIiwib25Hcm91cENsaWNrIiwib25TaG93Q29kZUNsaWNrIiwib25PcGVuSXRlbUNsaWNrIiwib25SZXNldENsaWNrIiwib25SZXNvdXJjZU9wZW5lZENsaWNrIiwic2hvd0xpc3QiLCJvbk1vdmluZ0NoYW5nZSIsImJhc2VDb2RlIiwibWVzc2FnZSIsImludmlzaWJsZSIsImVkaXRCdG4iLCJzZXREdWVFeHBpcnkiLCJvbkR1ZUNoYW5nZSIsInJlbW92ZUF0dHIiLCJzdGFydFJlc291cmNlRHJhZyIsInJlc291cmNlRGF0YSIsImNvbmNhdCIsImRyYWdZIiwiZWxUb3AiLCJkcm9wIiwib25SZXNvdXJjZURyYWdTdGFydCIsImR1cGxpY2F0ZU1vZGFsIiwiaW5jbHVkZXMiLCJjaGVja1N1bSIsInMiLCJ0aW1lIiwiZm9jdXNPbkF0dGFjaG1lbnQiLCJvblJlc291cmNlRGVsZXRlZCIsImF0dGFjaG1lbnRfaWRzIiwiZ20iLCJjdXJyZW50R3JvdXBzIiwib2siLCJyZXN1bHQiLCJmYWRlT3V0IiwidG9Mb3dlckNhc2UiLCJ4b3IiLCJyZWFsQ29kZSIsInRvU3RyaW5nIiwiRmxhc2hjYXJkTW9kZWwiLCJjb25maXJtIiwiaW1hZ2UiLCJxdWVzdGlvbkRhdGEiLCJwcmV2aWV3TW9kZSIsInJlc3RhcnQiLCJvcGVuIiwicmVzb3VyY2VPcGVuZWRNb2RhbCIsImFuaW1hdGUiLCJ1cGxvYWRTdWNjZXNzIiwidXBsb2FkRXJyb3IiLCJvbkNhbmNlbENsaWNrIiwib25WaWV3RGVzdHJveSIsInJlc291cmNlTm9kZUVkaXQiLCJkdWVUaW1lIiwiY2xlYXJEdWUiLCJjYW5jZWxSZXNvdXJjZUVkaXRCdG4iLCJzYXZlUmVzb3VyY2VFZGl0QnRuIiwib25BY3RpdmF0aW9uQ2xpY2siLCJvbkNsZWFyRHVlIiwib25DYW5jZWxSZXNvdXJjZUVkaXRCdG5DbGljayIsIm9uU2F2ZVJlc291cmNlRWRpdEJ0bkNsaWNrIiwiZFRpbWVIciIsImRUaW1lTWluIiwiY2xpY2tPcGVucyIsImRkIiwiYXR0YWNobWVudEZldGNoU3VjY2VzcyIsInNldHRpbmdzVXBkYXRlIiwibW9kZWwyIiwiQ29sbGVjdGlvblZpZXciLCJjaGlsZFZpZXciLCJjaGlsZFZpZXdPcHRpb25zIiwibiIsInJlbW92ZU5vZGVGcm9tUGFyZW50IiwicmVtb3ZlQ29udGVudEZyb21QYXJlbnQiLCJTbGlkZW91dE1peGluIiwiY29uZmlndXJlVUkiLCJwYW5lbCIsIm1lbnUiLCJwYWRkaW5nIiwidG9sZXJhbmNlIiwiTGVhcm5pbmdQYXRoIiwibW9kdWxlIiwiZXhwb3J0cyIsImRyYWdnaW5nTm9kZVZpZXciLCJ0cmVlIiwiYWRkU2VjdGlvbkJ0biIsImltcG9ydEJvb2tCdG4iLCJyZXNldEZvcm1hdEJ0biIsImxlZnRTZWN0aW9uIiwicmlnaHRTZWN0aW9uIiwiY2VudHJlU2VjdGlvbiIsIm11bHRpc2VsZWN0QmFyIiwiY2FtQnRuQ29udGFpbmVyIiwibXVsdGlTZWxlY3RDYW5jZWwiLCJtdWx0aVNlbGVjdEhpZGUiLCJtdWx0aVNlbGVjdFNob3ciLCJtdWx0aVNlbGVjdFRhZ3MiLCJtdWx0aVNlbGVjdERlbGV0ZSIsImNvbm5lY3Rpb25Mb3N0U3RhdHVzIiwibG9ja2VkU3RhdHVzIiwidW5rbm93blN0YXR1cyIsInNlbGZMb2NrZWRTdGF0dXMiLCJzdGVhbEFjY2VzcyIsInJlcXVlc3RBY2Nlc3MiLCJhY2Nlc3NDb250cm9sbGVycyIsImFjY2Vzc1BhdXNlIiwidmlld1VzZXIiLCJ2aWV3T3ZlcmxheSIsInZpZXdPdmVybGF5TWVzc2FnZSIsIm93bmVyTmFtZXMiLCJncm91cE5vdGlmeSIsInRyZWVIb3N0IiwiY2FuY2VsRHJvcCIsImRyYWdvdmVyIiwicmFkaW9FdmVudHMiLCJXZWJzb2NrZXRDb25uZWN0ZWQiLCJXZWJzb2NrZXREaXNjb25uZWN0ZWQiLCJXZWJzb2NrZXRNZXNzYWdlIiwiZXZlbnRCdXNFdmVudHMiLCJHcm91cHNDaGFuZ2VkIiwiTFBWaWV3Q2hhbmdlZCIsIkhpZGVGbGFzaENhcmRXaWRnZXQiLCJTaG93Rmxhc2hDYXJkV2lkZ2V0IiwiTXVsdGlzZWxlY3RDaGFuZ2VkIiwiYXR0YWNobWVudEV2ZW50cyIsIndzIiwiaXNDb25uZWN0ZWQiLCJ3c0Nvbm5lY3RlZCIsInJlcGx5IiwiYm9keUNsaWNrZXIiLCJhZGRFdmVudExpc3RlbmVyIiwiYXR0YWNobWVudHMiLCJhZGRlZCIsInJlbW92ZWQiLCJsYXN0X3JlbW92ZWRfbGVuZ3RoIiwibGFzdF9hZGRlZF9sZW5ndGgiLCJsb2NhdGlvbiIsIl9sb2NhdGlvbiIsIm9uR2xvYmFsTm9kZURyYWdTdGFydCIsIm9uR2xvYmFsUmVzb3VyY2VEcmFnU3RhcnQiLCJvbk11bHRpQ2FuY2VsIiwibm9kZXMiLCJsaXN0ZW5Ub09uY2UiLCJvbk11bHRpc2VsZWN0U3RhcnQiLCJtdWx0aUNoYW5nZXMiLCJlbmFibGVNdWx0aXNlbGVjdCIsIm9wYWNpdHkiLCJDaGFuZ2VNdWx0aXNlbGVjdCIsIm9uQ2hhbmdlTXVsdGlzZWxlY3QiLCJvbk11bHRpTm9kZVNlbGVjdCIsInN0YXRlIiwiaXNVbmRlZmluZWQiLCJtdWx0aXNlbGVjdGluZyIsIm11bHRpWEhSIiwicmVzZXQiLCJvbk11bHRpU2hvdyIsImpzb24iLCJvbk11bHRpSGlkZSIsIm9uTXVsdGlUYWdzIiwiZXhpc3RpbmdUYWdzIiwidW5pcUJ5IiwiZmxhdE1hcCIsIm9uTXVsdGlEZWxldGUiLCJvbk5vZGVTZWxlY3RlZCIsInNlbGVjdGVkVmlldyIsInNpYmxpbmdEcm9wIiwiY2hpbGREcm9wIiwidHJlZVZpZXciLCJjdXJyZW50TW9kZWwiLCJjdXJyZW50VmlldyIsIm9uTFBWaWV3Q2hhbmdlZCIsIm8iLCJ1c2VyVmlld1NlbGVjdHJhIiwiZGVsYXlMb2FkIiwiZWRpdGluZ1RvZ2dsZSIsImVuYWJsZUVkaXRpbmciLCJkaXNhYmxlRWRpdGluZyIsIm9uVmlld1VzZXJDaGFuZ2UiLCJzaG93QW5kVXBkYXRlVXNlclN0YXRlIiwicHJldmlvdXNVc2VyR3JvdXBzIiwiZ2V0U2VsZWN0ZWQiLCJ1c2VyU3RhdGUiLCJscF9pdGVtX3Byb2dyZXNzIiwiY29tcGxldGVDb25uZWN0aW9uIiwiam9pbkxQUm9vbSIsImdldElEIiwid2Vic29ja2V0X2lkIiwid3NEaXNjb25uZWN0ZWQiLCJ3c0Nvbm5lY3Rpb25DaGFuZ2VkIiwiU2Vzc2lvbiIsIndzTWVzc2FnZSIsImxlYXJuaW5nX3BhdGhzIiwiYWNjZXNzX3JlcXVlc3RlZCIsInNvdXJjZU5hbWUiLCJjdXN0b21DYW5jZWwiLCJ3ZWJzb2NrZXQiLCJ3cml0ZSIsInJvb20iLCJzb3VyY2UiLCJzb3VyY2VTcGFyayIsInNwYXJrIiwiYWNjZXNzUmVxdWVzdFRpbWVyIiwiYWNjZXNzX2RlbmllZCIsInJlcXVlc3RlZEFjY2Vzc1RpbWVyIiwib3duZXIiLCJ1cGRhdGVPd25lciIsImFjY2Vzc19yZXF1ZXN0X3JlY2VpdmVkIiwiYXV0b21hdGljU3RlYWxUaW1lciIsInVzZXJfaWQiLCJVcGRhdGVEcmFnZ2luZ1N0YXR1cyIsImxvY2tTcGFyayIsImxvY2tPd25lciIsImxvY2tPd25lck5hbWUiLCJvd25lck5hbWUiLCJDbG9zZVJlc291cmNlcyIsIkNsb3NlU2ltcGxlTWVudXMiLCJib2R5TW91c2Vtb3ZlIiwic2Nyb2xsZWRSZWNlbnRseSIsInNjcm9sbE9mZnNldCIsImlubmVySGVpZ2h0Iiwic2NyZWVuWSIsInNjcm9sbEJ5IiwiYmVoYXZpb3IiLCJvbkFkZFNlY3Rpb25DbGlja2VkIiwib25BZGRTZWN0aW9uQ2xpY2siLCJuZXdTZWN0aW9uIiwibGFzdE1vZGVsIiwib25JbXBvcnRCb29rQ2xpY2siLCJyZXNldEZvcm1hdCIsImtlZXBCb29rQXR0YWNobWVudHMiLCJyZWxvYWRUcmVlIiwiZmxhdHRlbkl0ZW1zIiwib2JqIiwiZmxhdEl0ZW1zIiwicm93IiwiaW1wb3J0ZWRJdGVtc0xlbmd0aCIsIm9uUmVzZXRGb3JtYXRDbGljayIsInRlbXBsYXRlTW9kYWwiLCJzb3VyY2VMUE1vZGVsIiwibG9hZFNvdXJjZUxQTW9kZWxFcnJvciIsImNhbGVuZGFySW1wb3J0Iiwibm9kZUNoYW5nZWQiLCJsb2FkTFBOYXZpZ2F0aW9uIiwib25JbXBvcnRTY3JvbGwiLCJpc0Zpbml0ZSIsImRlZmF1bHRWaWV3VXNlciIsIkNoYW5nZUxQVmlldyIsImNvbmZpZ3VyZU92ZXJsYXkiLCJhZGRDYW1CdG4iLCJpbml0aWFsaXplRmluZGVyU3RhdHVzIiwiVmlld0xvYWRlZCIsImFsZXJ0IiwibmF2IiwicmVsb2FkQ29sbGVjdGlvbiIsIkxvYWROYXZpZ2F0aW9uIiwiZm9yd2FyZERyYWdFdmVudCIsImNhbUJ0biIsIml0ZW1faWQiLCJwYXRobmFtZSIsInBvcCIsIkV2ZW50Iiwibm9kZURyYWdTdGFydCIsIm5vZGVEcmFnT3ZlciIsImN1cnJlbnREcmFnT3ZlclZpZXciLCJkcmFnWCIsIm9yaWdpbmFsTm9kZUlkIiwib3JpZ2luYWxOb2RlUGF0aCIsInN0YXJ0c1dpdGgiLCJVbmxvYWRMZWFybmluZ1BhdGgiLCJGaW5kZXJTdGF0dXMiLCJjdXJyZW50SW5kZXgiLCJyZXNldEZpbmRlclN0YXR1cyIsInJlc291cmNlSWRlbnRpZmllciIsInJldmVyc2UiLCJjb2xsZWN0QXR0YWNobWVudHMiLCJhcnJheSIsInJlbW92ZWRfYXR0IiwiYXR0IiwiZmluZE5leHRBdHRhY2htZW50IiwiZmluZFByZXZpb3VzQXR0YWNobWVudCIsIm9uR3JvdXBOb3RpZnlDbGljayIsIlNob3dHcm91cE1vZGFsIiwiZ3JvdXBzQ2hhbmdlZCIsImFsbG93ZWQiLCJjdXJyZW50IiwiaW50ZXJzZWN0aW9uIiwic3lzdGVtIiwib25TdGVhbEFjY2VzcyIsIm92ZXJyaWRlIiwic3RlYWwiLCJvblJlcXVlc3RBY2Nlc3MiLCJoaWRlRmxhc2hDYXJkV2lkZ2V0IiwiZmxhc2hDYXJkV2lkZ2V0Iiwic2hvd0ZsYXNoQ2FyZFdpZGdldCIsIm9uRHJhZ0VudGVyIiwib25EcmFnT3ZlciIsIm9uRHJhZ0xlYXZlIiwib25DYW5jZWxEcmFnRW50ZXIiLCJvbkNhbmNlbERyYWdPdmVyIiwib25DYW5jZWxGaWxlRHJvcCIsImZ1bGxQYXRoIiwibGV0dGVycyIsImNoYXJDb2RlIiwiZnJvbUNoYXJDb2RlIiwicGF0aEEiLCJwYXRoQiIsInBhdGhBX1BhdGhzIiwicGF0aEJfUGF0aHMiLCJpbml0aWFsIiwiaXNDaGlsZCIsImNoaWxkIiwiY2hhciIsImNjIiwiZm4iLCJzY3JvbGwiLCJzY3JvbGxZIiwiYm91bmRzVG9wIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0Iiwidmlld3BvcnQiLCJib3R0b20iLCJib3VuZHMiLCJjbGllbnRIZWlnaHQiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0FBTUE7Ozs7Ozs7O0FBTEEsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUMsSUFBSUQsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNRSxJQUFJRixRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1HLFNBQVNILFFBQVEsUUFBUixDQUFmO0FBQ0EsSUFBTUksUUFBUUosUUFBUSxVQUFSLEVBQW9CSyxPQUFsQzs7QUFFQSxJQUFNQyxZQUFZTixRQUFRLFdBQVIsQ0FBbEI7QUFDQSxJQUFNTyxVQUFVUCxRQUFRLFVBQVIsQ0FBaEI7QUFDQSxJQUFNUSxTQUFTUixRQUFRLFFBQVIsQ0FBZjs7QUFFQTtBQUNBLElBQU1TLFdBQVdULFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1VLFdBQVdWLFFBQVEsWUFBUixDQUFqQjs7QUFFQSxJQUFNVyxNQUFNWCxRQUFRLGdCQUFSLENBQVo7QUFDQSxJQUFNWSxXQUFXWixRQUFRLHVCQUFSLENBQWpCOztBQUVBLElBQU1hLGtCQUFrQmIsUUFBUSw2QkFBUixDQUF4QjtBQUNBLElBQU1jLHNCQUFzQmQsUUFBUSxnQkFBUixDQUE1QjtBQUNBLElBQU1lLGlCQUFpQmYsUUFBUSxrQkFBUixDQUF2QjtBQUNBLElBQU1nQixtQkFBbUJoQixRQUFRLG9CQUFSLENBQXpCO0FBQ0EsSUFBTWlCLG1CQUFtQmpCLFFBQVEsK0JBQVIsQ0FBekI7QUFDQSxJQUFNa0IsV0FBV2xCLFFBQVEs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LFNBRFM7QUFFZEcsVUFBUUgsWUFBWSxLQUFLLENBQUwsRUFBUUs7QUFGZCxFQUFmOztBQUtBLFFBQVFELE9BQU9ELE1BQVAsSUFBaUJELFNBQVM1M0IsR0FBMUIsSUFBaUM4M0IsT0FBT0QsTUFBUCxJQUFpQkQsU0FBU0MsTUFBNUQsSUFBd0VDLE9BQU85M0IsR0FBUCxJQUFjNDNCLFNBQVNDLE1BQXZCLElBQWlDQyxPQUFPOTNCLEdBQVAsSUFBYzQzQixTQUFTNTNCLEdBQXZJO0FBQ0EsQ0FmRCIsImZpbGUiOiJsZWFybmluZ1BhdGhWaWV3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBtb21lbnQgPSByZXF1aXJlKFwibW9tZW50XCIpO1xuY29uc3QgdGlwcHkgPSByZXF1aXJlKFwidGlwcHkuanNcIikuZGVmYXVsdDtcbmltcG9ydCB7IGhpZGVBbGwgfSBmcm9tIFwidGlwcHkuanNcIjtcbmNvbnN0IGZsYXRwaWNrciA9IHJlcXVpcmUoXCJmbGF0cGlja3JcIik7XG5jb25zdCBQcm9taXNlID0gcmVxdWlyZShcImJsdWViaXJkXCIpO1xuY29uc3QgcmVzdGVyID0gcmVxdWlyZShcInJlc3RlclwiKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vZGUvbm8tZXh0cmFuZW91cy1yZXF1aXJlXG5jb25zdCBTbGlkZW91dCA9IHJlcXVpcmUoXCJzbGlkZW91dFwiKTtcbmNvbnN0IGV2ZW50QnVzID0gcmVxdWlyZShcIi4vZXZlbnRCdXNcIik7XG5cbmNvbnN0IEFwcCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9pbmRleFwiKTtcbmNvbnN0IFNlbGVjdHJhID0gcmVxdWlyZShcIi4uLy4uLy4uL2xpYi9zZWxlY3RyYVwiKTtcblxuY29uc3QgTHBUZW1wbGF0ZU1vZGFsID0gcmVxdWlyZShcIi4vbGVhcm5pbmdQYXRoVGVtcGxhdGVNb2RhbFwiKTtcbmNvbnN0IExwTmF2aWdhdGlvblNpZGViYXIgPSByZXF1aXJlKFwiLi9scE5hdmlnYXRpb25cIik7XG5jb25zdCBJbXBvcnRUb2NNb2RhbCA9IHJlcXVpcmUoXCIuL2ltcG9ydFRvY01vZGFsXCIpO1xuY29uc3QgQm9va0Nob29zZXJNb2RhbCA9IHJlcXVpcmUoXCIuL2Jvb2tDaG9vc2VyTW9kYWxcIik7XG5jb25zdCBBc3Nlc3NtZW50UHJvbXB0ID0gcmVxdWlyZShcIi4uLy4uLy4uL2xpYi9hc3Nlc3NtZW50UHJvbXB0XCIpO1xuY29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuY29uc3QgZ2xvYmFsUmFkaW8gPSBCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZ2xvYmFsXCIpO1xuY29uc3QgbHBSYWRpbyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJscFwiKTtcbmNvbnN0IFNtYWxsTW9kYWwgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL3NtYWxsTW9kYWxcIik7XG5jb25zdCBMaWdodEJveCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9saWIvbGlnaHRCb3hcIik7XG5jb25zdCBBc3Nlc3NtZW50TW9kYWwgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL2Fzc2Vzc21lbnRNb2RhbFwiKTtcbmNvbnN0IEFzc2Vzc21lbnQgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL2Fzc2Vzc21lbnRNb2RlbFwiKTtcbmNvbnN0IEdyb3VwTW9kYWwgPSByZXF1aXJlKFwiLi9ncm91cE1vZGFsXCIpO1xuY29uc3QgUmVzb3VyY2VPcGVuZWRNb2RhbCA9IHJlcXVpcmUoXCIuL3Jlc291cmNlT3BlbmVkTW9kYWxcIik7XG5jb25zdCBGbGFzaENhcmRXaWRnZXQgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29udGVudC92aWV3cy9mbGFzaENhcmRzL2NhcmRXaWRnZXRcIik7XG5jb25zdCBDYW1CdG4gPSByZXF1aXJlKFwiLi4vY2FtQnRuXCIpO1xuY29uc3QgQnVsa0RyYWdEcm9wSGVscGVyID0gcmVxdWlyZShcIi4uLy4uLy4uL2xpYi9idWxrRHJhZ0Ryb3BIZWxwZXJcIik7XG5jb25zdCBCdWxrUmVzb3VyY2VVcGxvYWRNb2RhbCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9saWIvYnVsa1Jlc291cmNlVXBsb2FkTW9kYWxcIik7XG5jb25zdCBGbGFzaGNhcmRQcmV2aWV3ID0gcmVxdWlyZShcIi4uLy4uLy4uL2xpYi9mbGFzaGNhcmRQcmV2aWV3XCIpO1xuXG5jb25zdCBFdmVudHMgPSB7XG5cdEJvZHlDbGljazogXCJFdmVudHMuQm9keUNsaWNrXCIsXG5cdE5vZGVTZWxlY3RlZDogXCJFdmVudHMuTm9kZVNlbGVjdGVkXCIsXG5cdEVuYWJsZUVkaXRpbmc6IFwiRXZlbnRzLkVuYWJsZUVkaXRpbmdcIixcblx0RGlzYWJsZUVkaXRpbmc6IFwiRXZlbnRzLkRpc2FibGVFZGl0aW5nXCIsXG5cdEVkaXRpbmdDaGFuZ2U6IFwiRXZlbnRzLkVkaXRpbmdDaGFuZ2VcIixcblx0Q29ubmVjdGlvbkxvc3Q6IFwiRXZlbnRzLkNvbm5lY3Rpb25Mb3N0XCIsXG5cdENvbm5lY3RlZDogXCJFdmVudHMuQ29ubmVjdGVkXCIsXG5cdE5vZGVDaGFuZ2U6IFwiRXZlbnRzLk5vZGVDaGFuZ2VcIixcblx0Q29sbGFwc2U6IFwiRXZlbnRzLkNvbGxhcHNlXCIsXG5cblx0RWRpdGluZ1N0YXJ0ZWQ6IFwiRXZlbnRzLkVkaXRpbmdTdGFydGVkXCIsXG5cdEVkaXRpbmdFbmRlZDogXCJFdmVudHMuRWRpdGluZ0VuZGVkXCIsXG5cblx0QWRkUmVzb3VyY2U6IFwiRXZlbnRzLkFkZFJlc291cmNlXCIsXG5cdE1vdmVSZXNvdXJlOiBcIkV2ZW50cy5Nb3ZlUmVzb3VyY2VcIixcblxuXHRSZWxvYWROb2RlOiBcIkV2ZW50cy5SZWxvYWROb2RlXCIsXG5cdEFkZFNpYmxpbmdOb2RlOiBcIkV2ZW50cy5BZGRTaWJsaW5nTm9kZVwiLFxuXHRSZW1vdmVOb2RlRnJvbVBhcmVudDogXCJFdmVudHMuUmVtb3ZlTm9kZUZyb21QYXJlbnRcIixcblx0UHJvbW90ZVNpYmxpbmdOb2RlOiBcIkV2ZW50cy5Qcm9tb3RlU2libGluZ05vZGVcIixcblx0UmVtb3ZlQ29udGVudEZyb21QYXJlbnQ6IFwiRXZlbnRzLlJlbW92ZUNvbnRlbnRGcm9tUGFyZW50XCIsXG5cdEFkZENvbnRlbnROb2RlOiBcIkV2ZW50cy5BZGRDb250ZW50Tm9kZVwiLFxuXHRDaGVja0F0dGFjaG1lbnRDb250YWluZXJzOiBcIkV2ZW50cy5DaGVja0F0dGFjaG1lbnRDb250YWluZXJzXCIsXG5cblx0U3RhcnROb2RlRWRpdDogXCJFdmVudHMuU3RhcnROb2RlRWRpdFwiLFxuXHRDYW5jZWxOb2RlRWRpdDogXCJFdmVudHMuQ2FuY2VsTm9kZUVkaXRcIixcblx0Q29tcGxldGVOb2RlRWRpdDogXCJFdmVudHMuQ29tcGxldGVOb2RlRWRpdFwiLFxuXG5cdE5vZGVEcmFnU3RhcnQ6IFwiRXZlbnRzLk5vZGVEcmFnU3RhcnRcIixcblx0Tm9kZURyYWdMaXN0ZW46IFwiRXZlbnRzLk5vZGVEcmFnTGlzdGVuXCIsXG5cdE5vZGVEcmFnT3ZlcjogXCJFdmVudHMuTm9kZURyYWdPdmVyXCIsXG5cdE5vZGVEcmFnRW5kOiBcIkV2ZW50cy5Ob2RlRHJhZ0VuZFwiLFxuXHROb2RlRHJhZ01vdmU6IFwiRXZlbnRzLk5vZGVEcmFnTW92ZVwiLFxuXHROb2RlRHJvcEFib3ZlOiBcIkV2ZW50cy5Ob2RlRHJvcEFib3ZlXCIsXG5cdE5vZGVTZWxlY3RMaXN0ZW46IFwiRXZlbnRzLk5vZGVTZWxlY3RMaXN0ZW5cIixcblx0Tm9kZVNlbGVjdE92ZXI6IFwiRXZlbnRzLk5vZGVTZWxlY3RPdmVyXCIsXG5cdE5vZGVTZWxlY3RFbmQ6IFwiRXZlbnRzLk5vZGVTZWxlY3RFbmRcIixcblx0U2libGluZ0Ryb3A6IFwiRXZlbnRzLlNpYmxpbmdEcm9wXCIsXG5cdENoaWxkRHJvcDogXCJFdmVudHMuQ2hpbGREcm9wXCIsXG5cdFZpZXdVc2VyQ2hhbmdlOiBcIkV2ZW50cy5WaWV3VXNlckNoYW5nZVwiLFxuXG5cdFJlc291cmNlRHJhZ1N0YXJ0OiBcIkV2ZW50cy5SZXNvdXJjZURyYWdTdGFydFwiLFxuXHRSZXNvdXJjZURyYWdMaXN0ZW46IFwiRXZlbnRzLlJlc291cmNlRHJhZ0xpc3RlblwiLFxuXHRSZXNvdXJjZURyYWdPdmVyOiBcIkV2ZW50cy5SZXNvdXJjZURyYWdPdmVyXCIsXG5cdFJlc291cmNlRHJhZ0VuZDogXCJFdmVudHMuUmVzb3VyY2VEcmFnRW5kXCIsXG5cdEZvY3VzQXR0YWNobWVudDogXCJFdmVudHMuRm9jdXNBdHRhY2htZW50XCIsXG5cdFJlc291cmNlRHJhZ01vdmU6IFwiRXZlbnRzLlJlc291cmNlRHJhZ01vdmVcIixcblxuXHRNdWx0aXNlbGVjdFN0YXJ0OiBcIkV2ZW50cy5NdWx0aXNlbGVjdFN0YXJ0XCIsXG5cblx0R2V0UHJpbWFyeUdyb3VwOiBcIkV2ZW50cy5HZXRQcmltYXJ5R3JvdXBcIixcblxuXHRSZW1vdmVMUEl0ZW1zOiBcIkV2ZW50cy5SZW1vdmVMUEl0ZW1zXCIsXG59O1xuXG5jb25zdCBsb2NhbE1ldGhvZHMgPSB7fTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxubGV0IFRyZWVWaWV3LCBSZXNvdXJjZXNWaWV3LCBUcmVlRWRpdCwgVHJlZUNvbnRlbnQsIFJlc291cmNlRWRpdCwgZHJhZ2dpbmdSZXNvdXJjZSwgY3VycmVudEVkaXRNb2RlbElkLCBib29rUGFnZXM7XG5sZXQgdmlld2luZ1VzZXIsIHJlcXVlc3RlZEFjY2VzcywgcGFnZVVubG9hZGluZyA9IGZhbHNlLCBtdWx0aXNlbGVjdCA9IGZhbHNlLCBtc1N0YXRlID0gMCwgaXRlbURyYWdIaXQgPSBmYWxzZTtcbi8vIFNvbWUgY29uc3RhbnRzXG5jb25zdCBjaGlsZERyb3BDcm9zc292ZXIgPSAwLjMsIG1heERlc2NMZW5ndGggPSAyNTAsIGRhdGVGb3JtYXQgPSBcIkREIE1NTSBZWVlZIEhIOm1tIGFcIiwgcmVxdWVzdEFjY2Vzc1RpbWVvdXQgPSA5MDtcbmxldCBtdWx0aXNlbGVjdEl0ZW1zID0gW107XG5cbmNvbnN0IGVkaXRTdGF0ZXMgPSB7XG5cdC8vIEFyZSB3ZSBhbGxvd2VkIHRvIGVkaXQ/IFRvZ2dsZWQgYnkgbG9zcyBvZiBjb25uZWN0aW9uIGV0Yy5cblx0ZWRpdGluZ0FsbG93ZWQ6IGZhbHNlLFxuXHQvLyBXaGF0IHZpZXcgYXJlIHdlIGluPyBmYWxzZSA9IGVkaXRtb2RlLCB0cnVlID0gdmlldyBtb2RlLlxuXHR2aWV3TW9kZTogZmFsc2UsXG59O1xuXG5sZXQgbW9kZWxNYXAgPSB7fSwgdGFza01hcCA9IHt9LCBncm91cE1hcCA9IHt9O1xuXG5jb25zdCBjYW5FZGl0ID0gKCkgPT4gZWRpdFN0YXRlcy5lZGl0aW5nQWxsb3dlZCAmJiAhZWRpdFN0YXRlcy52aWV3TW9kZSAmJiAhY3VycmVudEVkaXRNb2RlbElkICYmICFtdWx0aXNlbGVjdDtcblxuY29uc3QgZ2V0Q29udHJhc3QgPSBmdW5jdGlvbihjb2xvdXIpIHtcblx0Ly8gQ2FsY3VsYXRlIHRoZSBwZXJjZXB0aXZlIGx1bWluYW5jZSAoYWthIGx1bWEpIC0gaHVtYW4gZXllIGZhdm9ycyBncmVlbiBjb2xvci4uLlxuXHRjb25zdCBsdW1hID0gKCgwLjI5OSAqIHBhcnNlSW50KGNvbG91ci5zbGljZSgwLCAyKSwgMTYpKSArICgwLjU4NyAqIHBhcnNlSW50KGNvbG91ci5zbGljZSgyLCA0KSwgMTYpKSArICgwLjExNCAqIHBhcnNlSW50KGNvbG91ci5zbGljZSg0KSwgMTYpKSkgLyAyNTU7XG5cblx0Ly8gUmV0dXJuIGJsYWNrIGZvciBicmlnaHQgY29sb3JzLCB3aGl0ZSBmb3IgZGFyayBjb2xvcnNcblx0cmV0dXJuIGx1bWEgPiAwLjUgPyBcIjAwMFwiIDogXCJGRkZcIjtcbn07XG5cbmNvbnN0IE5vZGVNb2RlbCA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7XG5cdFx0dmlzaWJsZTogdHJ1ZSxcblx0XHRsb2NrZWQ6IGZhbHNlLFxuXHRcdGlzVGFzazogZmFsc2UsXG5cdFx0dGFnczogW10sXG5cdFx0ZGVzY3JpcHRpb246IFwiXCIsXG5cdFx0YWN0aXZhdGlvbkRhdGU6IG51bGwsXG5cdFx0ZHVlRGF0ZTogbnVsbCxcblx0XHRtYmVfc2NvcmU6IDEsXG5cdH0sXG5cblx0aWRBdHRyaWJ1dGU6IFwiX2lkXCIsXG5cblx0dXJsUm9vdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hY2FjaWEvbGVhcm5pbmdQYXRocy9pdGVtc1wiO1xuXHR9LFxuXG5cdHZhbGlkYXRlOiBmdW5jdGlvbihhdHRycykge1xuXHRcdGNvbnN0IHJldCA9IHt9O1xuXHRcdGlmICghYXR0cnMudGl0bGUpXG5cdFx0XHRyZXQudGl0bGUgPSBcIllvdSBtdXN0IHByb3ZpZGUgYSB0aXRsZVwiO1xuXG5cdFx0Ly8gSWYgbG9ja2luZyBpc24ndCBzZXQsIHRoZSBkYXRlIG1pZ2h0IGtpY2sgaW5cblx0XHRpZiAoIWF0dHJzLmxvY2tlZCAmJiBhdHRycy5hY3RpdmF0aW9uRGF0ZSAmJiBhdHRycy5hY3RpdmF0aW9uRGF0ZSA8IG1vbWVudCgpLnVuaXgoKSlcblx0XHRcdHJldC5hY3RpdmF0aW9uRGF0ZSA9IFwiWW91IGNhbm5vdCBzZXQgYW4gdW5sb2NrIGRhdGUgdGhhdCBpcyBiZWZvcmUgdGhlIGN1cnJlbnQgZGF0ZVwiO1xuXG5cdFx0Ly8gSWYgbG9ja2luZyBpc24ndCBzZXQsIHRoZSBkYXRlIG1pZ2h0IGtpY2sgaW5cblx0XHRpZiAoIWF0dHJzLmxvY2tlZCAmJiBhdHRycy5hY3RpdmF0aW9uRGF0ZSAmJiBhdHRycy5hY3RpdmF0aW9uRGF0ZSA8PSA4NjQwMClcblx0XHRcdHJldC5hY3RpdmF0aW9uRGF0ZSA9IFwiWW91IG11c3QgY2hvb3NlIGEgZGF0ZSBmb3IgdGhpcyBpdGVtIHRvIHVubG9jayBvblwiO1xuXG5cdFx0aWYgKGF0dHJzLnBhZ2VSYW5nZSAmJiBhdHRycy5wYWdlUmFuZ2UubGVuZ3RoID4gMSAmJiBhdHRycy5wYWdlUmFuZ2VbMF0gPiBhdHRycy5wYWdlUmFuZ2VbMV0pXG5cdFx0XHRyZXQucGFnZUVuZCA9IFwiVGhlIGVuZCBwYWdlIG11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0byB0aGUgc3RhcnQgcGFnZVwiO1xuXG5cdFx0aWYgKE9iamVjdC5rZXlzKHJldCkubGVuZ3RoID4gMClcblx0XHRcdHJldHVybiByZXQ7XG5cdH0sXG5cblx0aGFzTG9ja0RhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmdldChcImxvY2tlZFwiKSB8fCBCb29sZWFuKHRoaXMuZ2V0KFwiYWN0aXZhdGlvbkRhdGVcIikpIHx8IHRoaXMuX2NoaWxkcmVuLnNvbWUoeCA9PiB4Lmhhc0xvY2tEYXRlKCkpIHx8XG5cdFx0XHR0aGlzLl90YXNrcy5zb21lKHggPT4geC5oYXNMb2NrRGF0ZSgpKSB8fCB0aGlzLl9yZXNvdXJjZXMuc29tZSh4ID0+IHguaGFzTG9ja0RhdGUoKSk7XG5cdH0sXG5cblx0aGFzVmlzaWJpbGl0eTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0KFwidmlzaWJsZVwiKSB8fCB0aGlzLl9jaGlsZHJlbi5zb21lKHggPT4geC5oYXNWaXNpYmlsaXR5KCkpIHx8XG5cdFx0XHR0aGlzLl90YXNrcy5zb21lKHggPT4geC5oYXNWaXNpYmlsaXR5KCkpIHx8IHRoaXMuX3Jlc291cmNlcy5zb21lKHggPT4geC5oYXNWaXNpYmlsaXR5KCkpO1xuXHR9LFxufSk7XG5cbmNvbnN0IENoaWxkcmVuQ29sbGVjdGlvbiA9IEJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IE5vZGVNb2RlbCxcblxuXHRjb21wYXJhdG9yOiBcInBhdGhcIixcbn0pO1xuXG5jb25zdCBSZXNvdXJjZU1vZGVsID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHtcblx0XHR2aXNpYmxlOiB0cnVlLFxuXHRcdGxvY2tlZDogZmFsc2UsXG5cdFx0aXNUYXNrOiBmYWxzZSxcblx0XHR0YWdzOiBbXSxcblx0XHRhY3RpdmF0aW9uRGF0ZTogbnVsbCxcblx0XHRkdWVEYXRlOiBudWxsLFxuXHRcdG1iZV9zY29yZTogMSxcblx0fSxcblxuXHRpZEF0dHJpYnV0ZTogXCJfaWRcIixcblxuXHR1cmxSb290OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FjYWNpYS9sZWFybmluZ1BhdGhzL3Jlc291cmNlc1wiO1xuXHR9LFxuXG5cdHZhbGlkYXRlOiBmdW5jdGlvbihhdHRycykge1xuXHRcdGNvbnN0IHJldCA9IHt9O1xuXG5cdFx0aWYgKCFhdHRycy5sb2NrZWQgJiYgYXR0cnMuYWN0aXZhdGlvbkRhdGUgJiYgYXR0cnMuZHVlRGF0ZSAmJiBhdHRycy5hY3RpdmF0aW9uRGF0ZSA+IGF0dHJzLmR1ZURhdGUpXG5cdFx0XHRyZXQuZHVlRGF0ZSA9IFwiRHVlIERhdGVzIG11c3QgYmUgYWZ0ZXIgb3IgZXF1YWwgdG8gVW5sb2NrIERhdGVcIjtcblxuXHRcdGlmICghYXR0cnMubG9ja2VkICYmIGF0dHJzLmFjdGl2YXRpb25EYXRlICYmIGF0dHJzLmFjdGl2YXRpb25EYXRlIDwgbW9tZW50KCkudW5peCgpKVxuXHRcdFx0cmV0LmFjdGl2YXRpb25EYXRlID0gXCJZb3UgY2Fubm90IHNldCBhbiB1bmxvY2sgZGF0ZSB0aGF0IGlzIGJlZm9yZSB0aGUgY3VycmVudCBkYXRlXCI7XG5cblx0XHQvLyBJZiBsb2NraW5nIGlzbid0IHNldCwgdGhlIGRhdGUgbWlnaHQga2ljayBpblxuXHRcdGlmICghYXR0cnMubG9ja2VkICYmIGF0dHJzLmFjdGl2YXRpb25EYXRlICYmIGF0dHJzLmFjdGl2YXRpb25EYXRlIDw9IDg2NDAwKVxuXHRcdFx0cmV0LmFjdGl2YXRpb25EYXRlID0gXCJZb3UgbXVzdCBjaG9vc2UgYSBkYXRlIGZvciB0aGlzIGl0ZW0gdG8gdW5sb2NrIG9uXCI7XG5cblx0XHRpZiAoYXR0cnMuZHVlRGF0ZSAmJiBhdHRycy5kdWVEYXRlIDwgbW9tZW50KCkudW5peCgpKVxuXHRcdFx0cmV0LmR1ZURhdGUgPSBcIllvdSBjYW5ub3Qgc2V0IGR1ZSBkYXRlIHRoYXQgaXMgYmVmb3JlIHRoZSBjdXJyZW50IGRhdGVcIjtcblxuXHRcdGlmIChPYmplY3Qua2V5cyhyZXQpLmxlbmd0aCA+IDApXG5cdFx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXG5cdGhhc0xvY2tEYXRlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXQoXCJsb2NrZWRcIikgfHwgQm9vbGVhbih0aGlzLmdldChcImFjdGl2YXRpb25EYXRlXCIpKTtcblx0fSxcblxuXHRoYXNWaXNpYmlsaXR5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5nZXQoXCJ2aXNpYmxlXCIpO1xuXHR9LFxufSk7XG5cbmNvbnN0IEF0dGFjaG1lbnRNb2RlbCA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7fSxcblx0aWRBdHRyaWJ1dGU6IFwiX2lkXCIsXG5cblx0dXJsUm9vdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2F0dGFjaG1lbnRzXCI7XG5cdH0sXG59KTtcblxuY29uc3QgVGFnTW9kYWwgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInRhZy1jcmVhdGlvblwiLFxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9jb25zb2xlL2xlYXJuaW5nUGF0aE5vZGUubnVualwiKS50YWdDcmVhdGlvbixcblxuXHR1aToge1xuXHRcdGNvbG91ckJsb2NrOiBcIi5jb2xvdXJzIGRpdlwiLFxuXHRcdHNlbGVjdGVkQ29sb3VyOiBcIi5jb2xvdXJzIGRpdi5zZWxlY3RlZFwiLFxuXHRcdHNhdmU6IFwiYnV0dG9uW25hbWU9J3NhdmUnXVwiLFxuXHRcdGNhbmNlbDogXCJidXR0b25bbmFtZT0nY2FuY2VsJ11cIixcblx0XHRjbG9zZXI6IFwiZGl2LmNsb3NlXCIsXG5cdFx0ZXJyb3JzOiBcImRpdi5lcnJvcnNcIixcblxuXHRcdGxhYmVsOiBcImlucHV0W3R5cGU9J3RleHQnXVwiLFxuXHRcdGN1c3RvbUNvbG91cjogXCJpbnB1dFtuYW1lPSdjdXN0b21Db2xvdXInXVwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdGNsaWNrOiBcIm9uQ2xpY2tcIixcblx0XHRtb3VzZXVwOiBcIm9uQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5jb2xvdXJCbG9ja1wiOiBcImNob29zZUNvbG91clwiLFxuXHRcdFwiY2hhbmdlIEB1aS5jdXN0b21Db2xvdXJcIjogXCJjaGFuZ2VDdXN0b21Db2xvdXJcIixcblx0XHRcImtleXVwIEB1aS5sYWJlbFwiOiBcImNsZWFyRXJyb3JcIixcblxuXHRcdFwiY2xpY2sgQHVpLnNhdmVcIjogXCJzYXZlXCIsXG5cdFx0XCJjbGljayBAdWkuY2FuY2VsXCI6IFwiY2FuY2VsXCIsXG5cdFx0XCJjbGljayBAdWkuY2xvc2VyXCI6IFwiY2FuY2VsXCIsXG5cdH0sXG5cblx0Y29sb3VyczogW1xuXHRcdFwiOTJkZTY5XCIsIFwiNDY5YzkyXCIsIFwiZmM1NDM5XCIsXG5cdFx0XCI1MDc4OGVcIiwgXCI4NTNhNGNcIiwgXCI5N2IzYzVcIixcblx0XHRcImQyMzYyZFwiLCBcIjJlNWM1YlwiLCBcImVhYjIyZVwiLFxuXHRcdFwiNDUyOTU5XCIsIFwiMDAzM2NjXCIsIFwiNDE4YmNhXCIsXG5cdFx0XCIwMDc0MzdcIiwgXCJhOGQ2OTVcIiwgXCI2OWQxMDBcIixcblx0XHRcIjM0NDk1ZVwiLCBcImExOTVkNVwiLCBcIjdlOGM4ZFwiLFxuXHRcdFwiZmY5NDZhXCIsIFwiNTg0M2FjXCIsIFwiYWM0MzYyXCIsXG5cdFx0XCJmZTdmMGVcIiwgXCJkOTU0NGZcIiwgXCJkMWQxMDBcIixcblx0XHRcImFkOGQ0NFwiLCBcIjc4ZjRmNFwiLCBcImRhY2IyNVwiLFxuXHRcdFwiZmY0MDU3XCIsIFwiZmZmMjAwXCIsIFwiZWFkM2UzXCIsXG5cdFx0XCIwMDAwMDBcIiwgXCIwMDAwOGJcIixcblx0XSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRjb2xvdXJzOiB0aGlzLmNvbG91cnMsXG5cdFx0fTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnByb20gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHR0aGlzLnJlc29sdmUgPSByZXNvbHZlO1xuXHRcdFx0dGhpcy5yZWplY3QgPSBlID0+IHtcblx0XHRcdFx0dGhpcy5kZXN0cm95KCk7XG5cdFx0XHRcdHJlamVjdChlKTtcblx0XHRcdH07XG5cdFx0fSk7XG5cblx0XHR0aGlzLm1vZGVsID0gbmV3IEJhY2tib25lLk1vZGVsKCk7XG5cdH0sXG5cblx0b25DbGljazogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9LFxuXG5cdHNob3c6IGZ1bmN0aW9uKHZpZXcpIHtcblx0XHQvLyAgUG9zaXRpb24gdG8gdGhlIHJpZ2h0IG9mIHRoaXMgZWxlbWVudFxuXHRcdGNvbnN0IGVsT2Zmc2V0ID0gdmlldy4kZWwub2Zmc2V0KCk7XG5cdFx0Ly9jb25zdCBjbGlja09mZnNldCA9IGNsaWNrZXIub2Zmc2V0KCk7XG5cblx0XHQkKFwiLm1vZGFsLWhvc3RcIikuYXBwZW5kKHRoaXMucmVuZGVyKCkuZWwpO1xuXG5cdFx0dGhpcy4kZWwuY3NzKHsgbGVmdDogZWxPZmZzZXQubGVmdCwgd2lkdGg6IHZpZXcuJGVsLndpZHRoKCkgfSk7XG5cblx0XHRpZiAodmlldy5tb2RlbC5nZXQoXCJkcmF3UG9zaXRpb25cIikgPT09IFwicmV2ZXJzZVwiKSB7XG5cdFx0XHRjb25zdCBoID0gdGhpcy4kZWwub3V0ZXJIZWlnaHQodHJ1ZSk7XG5cdFx0XHRjb25zdCBlbGggPSB2aWV3LiRlbC5vdXRlckhlaWdodCh0cnVlKTtcblxuXHRcdFx0aWYgKGVsaCA+IGgpXG5cdFx0XHRcdHRoaXMuJGVsLmNzcyh7IHRvcDogZWxPZmZzZXQudG9wIH0pO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLiRlbC5jc3MoeyB0b3A6IGVsT2Zmc2V0LnRvcCAtIChoIC0gZWxoKSB9KTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLiRlbC5jc3MoeyB0b3A6IGVsT2Zmc2V0LnRvcCB9KTtcblx0XHR9XG5cblx0XHQkKGRvY3VtZW50KS5vbihcIm1vdXNldXBcIiwgKCkgPT4ge1xuXHRcdFx0dGhpcy5kZXN0cm95KCk7XG5cdFx0XHR0aGlzLnJlc29sdmUoKTtcblx0XHR9KTtcblxuXHRcdHJldHVybiB0aGlzLnByb207XG5cdH0sXG5cblx0Y2hvb3NlQ29sb3VyOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHR0aGlzLm1vZGVsLnNldCh7IGNvbG91cjogJChldnQuY3VycmVudFRhcmdldCkuZGF0YShcImNvbG91clwiKSB9KTtcblxuXHRcdCQoXCJkaXYuc2VsZWN0ZWRcIiwgdGhpcy5lbCkucmVtb3ZlQ2xhc3MoXCJzZWxlY3RlZFwiKS5jc3Moe1xuXHRcdFx0XCJib3JkZXItY29sb3JcIjogXCIjRkZGXCIsXG5cdFx0XHRcImJveC1zaGFkb3dcIjogXCIwIDAgMFwiLFxuXHRcdH0pO1xuXG5cdFx0JChldnQuY3VycmVudFRhcmdldCkuYWRkQ2xhc3MoXCJzZWxlY3RlZFwiKS5jc3Moe1xuXHRcdFx0XCJib3JkZXItY29sb3JcIjogYCMke3RoaXMubW9kZWwuZ2V0KFwiY29sb3VyXCIpfWAsXG5cdFx0XHRcImJveC1zaGFkb3dcIjogYDAgMCA4cHggIyR7dGhpcy5tb2RlbC5nZXQoXCJjb2xvdXJcIil9YCxcblx0XHR9KTtcblxuXHRcdHRoaXMudWkuY3VzdG9tQ29sb3VyLnZhbChcIiNcIiArIHRoaXMubW9kZWwuZ2V0KFwiY29sb3VyXCIpKS5jc3Moe1xuXHRcdFx0XCJib3gtc2hhZG93XCI6IFwiMCAwIDBcIixcblx0XHR9KS5yZW1vdmVDbGFzcyhcInNlbGVjdGVkXCIpO1xuXG5cdFx0dGhpcy5jbGVhckVycm9yKCk7XG5cdH0sXG5cblx0Y2hhbmdlQ3VzdG9tQ29sb3VyOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHR0aGlzLm1vZGVsLnNldCh7IGNvbG91cjogZXZ0LmN1cnJlbnRUYXJnZXQudmFsdWUuc2xpY2UoMSkgfSk7XG5cblx0XHQkKFwiZGl2LnNlbGVjdGVkXCIsIHRoaXMuZWwpLnJlbW92ZUNsYXNzKFwic2VsZWN0ZWRcIikuY3NzKHtcblx0XHRcdFwiYm9yZGVyLWNvbG9yXCI6IFwiI0ZGRlwiLFxuXHRcdFx0XCJib3gtc2hhZG93XCI6IFwiMCAwIDBcIixcblx0XHR9KTtcblxuXHRcdHRoaXMudWkuY3VzdG9tQ29sb3VyLmFkZENsYXNzKFwic2VsZWN0ZWRcIikuY3NzKHtcblx0XHRcdFwiYm94LXNoYWRvd1wiOiBgMCAwIDhweCAjJHt0aGlzLm1vZGVsLmdldChcImNvbG91clwiKX1gLFxuXHRcdH0pO1xuXHR9LFxuXG5cdHNhdmU6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGlmICghXy50cmltKHRoaXMudWkubGFiZWwudmFsKCkpKVxuXHRcdFx0cmV0dXJuIHRoaXMudWkuZXJyb3JzLmh0bWwoXCI8c3BhbiBjbGFzcz1cXFwiZXJyb3JcXFwiPllvdSBtdXN0IGVudGVyIGEgbGFiZWw8L3NwYW4+XCIpO1xuXG5cdFx0aWYgKCF0aGlzLm1vZGVsLmdldChcImNvbG91clwiKSlcblx0XHRcdHJldHVybiB0aGlzLnVpLmVycm9ycy5odG1sKFwiPHNwYW4gY2xhc3M9XFxcImVycm9yXFxcIj5Zb3UgbXVzdCBjaG9vc2UgYSBjb2xvdXI8L3NwYW4+XCIpO1xuXG5cdFx0dGhpcy5yZXNvbHZlKHsgbGFiZWw6IF8udHJpbSh0aGlzLnVpLmxhYmVsLnZhbCgpKSwgY29sb3VyOiB0aGlzLm1vZGVsLmdldChcImNvbG91clwiKSB9KTtcblxuXHRcdHRoaXMuZGVzdHJveSgpO1xuXHR9LFxuXG5cdGNhbmNlbDogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0dGhpcy5yZXNvbHZlKCk7XG5cdFx0dGhpcy5kZXN0cm95KCk7XG5cdH0sXG5cblx0Y2xlYXJFcnJvcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5lcnJvcnMuZmluZChcIi5lcnJvclwiKS5yZW1vdmUoKTtcblx0fSxcbn0pO1xuXG5jb25zdCBSZXNvdXJjZUNvbGxlY3Rpb24gPSBCYWNrYm9uZS5Db2xsZWN0aW9uLmV4dGVuZCh7XG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKGNvbCwgb3B0aW9ucykge1xuXHRcdHRoaXMudGFza3MgPSBvcHRpb25zLnRhc2tzO1xuXHR9LFxuXG5cdG1vZGVsOiBSZXNvdXJjZU1vZGVsLFxuXG5cdGNvbXBhcmF0b3I6IFwicGF0aFwiLFxufSk7XG5cbmNvbnN0IFRhZ3MgPSBCYWNrYm9uZS5NYXJpb25ldHRlLkJlaGF2aW9yLmV4dGVuZCh7XG5cdHVpOiB7XG5cdFx0dGFnczogXCIudGFnc1wiLFxuXHRcdHRhZzogXCIudGFnXCIsXG5cdFx0dGFnQnRuOiBcIi50YWctYnRuXCIsXG5cdFx0dGFnUmVtb3ZlcjogXCIudGFnIC5yZW1vdmVyXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkudGFnXCI6IFwib25UYWdDbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLnRhZ1JlbW92ZXJcIjogXCJvblRhZ1JlbW92ZVwiLFxuXHRcdFwiY2xpY2sgQHVpLnRhZ0J0blwiOiBcIm9uVGFnQnRuQ2xpY2tcIixcblx0fSxcblxuXHRtb2RlbEV2ZW50czoge1xuXHRcdFwiY2hhbmdlOnRhZ0xpc3RcIjogXCJvblRhZ3NDaGFuZ2VcIixcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMudWkub3B0aW9ucykge1xuXHRcdFx0dGhpcy51aS5vcHRpb25zLm9uKFwidG9vbGJhckl0ZW1DbGljay50YWdzXCIsIChldnQsIGl0ZW0pID0+IHtcblx0XHRcdFx0Y29uc3QgZGF0YSA9ICQoaXRlbSkuZGF0YShcIml0ZW1cIik7XG5cblx0XHRcdFx0c3dpdGNoIChkYXRhKSB7XG5cdFx0XHRcdFx0Y2FzZSBcInRhZ3NcIjogcmV0dXJuIHRoaXMub25UYWdCdG5DbGljayhldnQpO1xuXHRcdFx0XHRcdGRlZmF1bHQ6IHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMudWkub3B0aW9ucylcblx0XHRcdHRoaXMudWkub3B0aW9ucy5vZmYoXCJ0b29sYmFySXRlbUNsaWNrLnRhZ3NcIik7XG5cdH0sXG5cblx0b25UYWdDbGljazogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9LFxuXG5cdG9uVGFnQnRuQ2xpY2s6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGNvbnN0IHVybCA9IHRoaXMudmlldy5tb2RlbC5pc05ldygpID8gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FjYWNpYS9sZWFybmluZ1BhdGhzL1wiICsgdGhpcy52aWV3Lm1vZGVsLmdldChcImxlYXJuaW5nX3BhdGhcIikgKyBcIi90YWdzXCIgOlxuXHRcdFx0c2V0dGluZ3MudXJsUm9vdCArIFwiL2FjYWNpYS9sZWFybmluZ1BhdGhzL2l0ZW1zL1wiICsgdGhpcy52aWV3Lm1vZGVsLmlkICsgXCIvdGFnc1wiO1xuXG5cdFx0Y29uc3QgdGFnZ2luZyA9IG5ldyBTZWxlY3RyYSh7XG5cdFx0XHRzZWFyY2g6IGZhbHNlLFxuXHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRzb3J0OiB0cnVlLFxuXHRcdFx0dmlydHVhbEJhc2U6IHRydWUsXG5cdFx0XHRhdXRvT3BlbkRyb3Bkb3duOiB0cnVlLFxuXHRcdFx0aWNvbnM6IHRydWUsXG5cdFx0XHRjaGVja2JveGVzOiB0cnVlLFxuXHRcdFx0ZGRXaWR0aDogMjUwLFxuXHRcdFx0ZGRIb3N0OiBcIiNsaW5rLXJlc291cmNlc1wiLFxuXHRcdFx0c2VydmVyOiB7XG5cdFx0XHRcdGtleTogXCJ0YWdfaWRcIixcblx0XHRcdFx0dmFsdWU6IFwibGFiZWxcIixcblx0XHRcdFx0ZmV0Y2g6IHVybCxcblx0XHRcdFx0ZGVmYXVsdDoge1xuXHRcdFx0XHRcdGl0ZW1zOiB0aGlzLnZpZXcubW9kZWwuZ2V0KFwidGFnTGlzdFwiKSB8fCBbXSxcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0cGFnZVNpemU6IDMwLFxuXHRcdFx0XHRpbmZpbml0ZTogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0XHRhbGxvd0NyZWF0aW9uOiB7XG5cdFx0XHRcdG1vZGU6IFwiYWx3YXlzXCIsXG5cdFx0XHRcdHRleHQ6IFwiQ3JlYXRlIG5ldyB0YWdcIixcblx0XHRcdFx0Y2FsbGJhY2s6IHRoaXMuY3JlYXRlTmV3VGFnLFxuXHRcdFx0XHRzZXJ2ZXI6IHtcblx0XHRcdFx0XHRzYXZlRmlyc3Q6IHRydWUsXG5cdFx0XHRcdFx0c2F2ZTogdXJsLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRoaWRlT25DbGljazogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0XHRpbnRlcmFjdGl2ZXM6IHtcblx0XHRcdFx0bWFuYWdlOiB7XG5cdFx0XHRcdFx0dGV4dDogXCJNYW5hZ2UgdGFnc1wiLFxuXHRcdFx0XHRcdGNhbGxiYWNrOiB0aGlzLm1hbmFnZVRhZ3MsXG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0dGFnZ2luZy5zaG93KHsgZWw6IGV2dC5jdXJyZW50VGFyZ2V0IH0pO1xuXG5cdFx0dGhpcy5saXN0ZW5Ubyh0YWdnaW5nLCBTZWxlY3RyYS5FdmVudHMuVmFsdWVDaGFuZ2VkLCBzZWxlY3Rpb24gPT4ge1xuXHRcdFx0Y29uc3QgY2hhbmdlcyA9IHsgdGFnTGlzdDogXy5tYXAoc2VsZWN0aW9uLCB4ID0+IHgudG9KU09OKCkpLCB0YWdzOiBfLm1hcChzZWxlY3Rpb24sIHggPT4geC5nZXQoXCJ0YWdfaWRcIikpIH07XG5cblx0XHRcdGlmICh0aGlzLnZpZXcubW9kZWwuaXNOZXcoKSlcblx0XHRcdFx0cmV0dXJuIHRoaXMudmlldy5tb2RlbC5zZXQoY2hhbmdlcyk7XG5cblx0XHRcdGlmICh0aGlzLnZpZXcubW9kZWwuZ2V0KFwibG9ja2VkXCIpIHx8ICghdGhpcy52aWV3Lm1vZGVsLmdldChcImxvY2tlZFwiKSAmJiB0aGlzLnZpZXcubW9kZWwuZ2V0KFwiYWN0aXZhdGlvbkRhdGVcIikgJiYgdGhpcy52aWV3Lm1vZGVsLmdldChcImFjdGl2YXRpb25EYXRlXCIpIDwgbW9tZW50KCkudW5peCgpKSlcblx0XHRcdFx0Y2hhbmdlcy5hY3RpdmF0aW9uRGF0ZSA9IG51bGw7XG5cblx0XHRcdHRoaXMudmlldy5tb2RlbC5zYXZlKGNoYW5nZXMsIHtcblx0XHRcdFx0cGF0Y2g6IHRydWUsXG5cdFx0XHRcdHdhaXQ6IHRydWUsXG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdHRoaXMubGlzdGVuVG8odGhpcywgXCJiZWZvcmU6ZGVzdHJveVwiLCAoKSA9PiB7XG5cdFx0XHR0YWdnaW5nLmNsb3NlKCk7XG5cdFx0fSk7XG5cdH0sXG5cblx0Y3JlYXRlTmV3VGFnOiBmdW5jdGlvbihlbCwgY2xpY2tlcikge1xuXHRcdHRoaXMudGFnTW9kYWwgPSBuZXcgVGFnTW9kYWwoKTtcblxuXHRcdHJldHVybiB0aGlzLnRhZ01vZGFsLnNob3coZWwsIGNsaWNrZXIpO1xuXHR9LFxuXG5cdG1hbmFnZVRhZ3M6IGZ1bmN0aW9uKCkge1xuXHRcdGdsb2JhbFJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0ZSwgc2V0dGluZ3MudXJsUm9vdCArIFwiL2NvbnNvbGUvdGFncy9cIiArIGxwUmFkaW8ucmVxdWVzdChFdmVudHMuR2V0UHJpbWFyeUdyb3VwKSk7XG5cdH0sXG5cblx0Z2V0Q29udHJhc3Q6IGdldENvbnRyYXN0LFxuXG5cdG9uVGFnUmVtb3ZlOiBmdW5jdGlvbihldnQpIHtcblx0XHRpZiAoIWNhbkVkaXQoKSlcblx0XHRcdHJldHVybjtcblxuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGNvbnN0IHRhZyA9ICQoZXZ0LmN1cnJlbnRUYXJnZXQpLmRhdGEoXCJpZFwiKTtcblxuXHRcdGNvbnN0IGNoYW5nZSA9IHtcblx0XHRcdHRhZ3M6IF8ucmVqZWN0KHRoaXMudmlldy5tb2RlbC5nZXQoXCJ0YWdzXCIpLCB4ID0+IHggPT09IHRhZyksXG5cdFx0XHR0YWdMaXN0OiBfLnJlamVjdCh0aGlzLnZpZXcubW9kZWwuZ2V0KFwidGFnTGlzdFwiKSwgeCA9PiB4LnRhZ19pZCA9PT0gdGFnKSxcblx0XHR9O1xuXG5cdFx0aWYgKHRoaXMudmlldy5tb2RlbC5pc05ldygpKVxuXHRcdFx0cmV0dXJuIHRoaXMudmlldy5tb2RlbC5zZXQoY2hhbmdlKTtcblxuXHRcdGlmICh0aGlzLnZpZXcubW9kZWwuZ2V0KFwibG9ja2VkXCIpIHx8ICghdGhpcy52aWV3Lm1vZGVsLmdldChcImxvY2tlZFwiKSAmJiB0aGlzLnZpZXcubW9kZWwuZ2V0KFwiYWN0aXZhdGlvbkRhdGVcIikgJiYgdGhpcy52aWV3Lm1vZGVsLmdldChcImFjdGl2YXRpb25EYXRlXCIpIDwgbW9tZW50KCkudW5peCgpKSlcblx0XHRcdGNoYW5nZS5hY3RpdmF0aW9uRGF0ZSA9IG51bGw7XG5cblx0XHR0aGlzLnZpZXcubW9kZWwuc2F2ZShjaGFuZ2UsIHtcblx0XHRcdHBhdGNoOiB0cnVlLFxuXHRcdFx0d2FpdDogdHJ1ZSxcblx0XHR9KTtcblx0fSxcblxuXHRvblRhZ3NDaGFuZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHRhZ3MgPSB0aGlzLnZpZXcubW9kZWwuZ2V0KFwidGFnTGlzdFwiKSB8fCBbXTtcblxuXHRcdGNvbnN0IG1hcmt1cHMgPSBfLm1hcCh0YWdzLCB4ID0+IGA8ZGl2IGNsYXNzPVwidGFnXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiMke3guY29sb3VyfTsgY29sb3I6ICMke3RoaXMuZ2V0Q29udHJhc3QoeC5jb2xvdXIpfVwiPiR7eC5sYWJlbC5yZXBsYWNlKC88L2csIFwiJmx0O1wiKS5yZXBsYWNlKC8+L2csIFwiJmd0O1wiKX1cblx0XHRcdDxkaXYgY2xhc3M9XCJmYWwgZmEtdGltZXMgcmVtb3ZlclwiIGRhdGEtaWQ9XCIke3gudGFnX2lkfVwiLz48L2Rpdj5gKTtcblxuXHRcdHRoaXMudWkudGFncy5odG1sKG1hcmt1cHMuam9pbihcIlwiKSk7XG5cblx0XHRpZiAoIXRoaXMudWkudGFncylcblx0XHRcdHJldHVybjtcblxuXHRcdGlmICh0YWdzLmxlbmd0aClcblx0XHRcdHRoaXMudWkudGFncy5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy51aS50YWdzLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0fSxcbn0pO1xuXG4vLyAqKiBUcmVlIHZpZXdzICoqXG5cbmNvbnN0IERyYWdnaW5nRWxlbWVudCA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwibHAtZHJhZ2dpbmctZWxlbWVudFwiLFxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9jb25zb2xlL2xlYXJuaW5nUGF0aE5vZGUubnVualwiKS5kcmFnZ2luZ0VsZW1lbnQsXG59KTtcblxuY29uc3QgVHJlZU5vZGUgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogXCJsaVwiLFxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9jb25zb2xlL2xlYXJuaW5nUGF0aE5vZGUubnVualwiKS5sZWFybmluZ1BhdGhOb2RlLFxuXG5cdGNsYXNzTmFtZTogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgY2xhc3NlcyA9IFtdO1xuXG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwibGFzdE5vZGVcIikpXG5cdFx0XHRjbGFzc2VzLnB1c2goXCJsYXN0LW5vZGVcIik7XG5cblx0XHRyZXR1cm4gY2xhc3Nlcy5qb2luKFwiIFwiKTtcblx0fSxcblxuXHRyZWdpb25zOiB7XG5cdFx0ZWRpdDogXCIuZWRpdC1ub2RlLWZvcm1cIixcblx0XHRjb250ZW50OiBcIi5ub2RlLWNvbnRlbnRcIixcblx0XHRjaGlsZHJlbjogXCIuY2hpbGQtbm9kZXMtY29udGFpbmVyXCIsXG5cdFx0cmVzb3VyY2VzOiB7XG5cdFx0XHRlbDogXCIucmVzb3VyY2UtcGxhY2Vob2xkZXJcIixcblx0XHRcdHJlcGxhY2VFbGVtZW50OiB0cnVlLFxuXHRcdH0sXG5cdFx0dGFza3M6IHtcblx0XHRcdGVsOiBcIi50YXNrLXBsYWNlaG9sZGVyXCIsXG5cdFx0XHRyZXBsYWNlRWxlbWVudDogdHJ1ZSxcblx0XHR9LFxuXHR9LFxuXG5cdHVpOiB7XG5cdFx0aWNvbnM6IFwiLmZhbDpub3QoLmZhLXRyYXNoLWFsdClcIixcblxuXHRcdG5vZGU6IFwiLmxwLW5vZGU6Zmlyc3RcIixcblxuXHRcdGVkaXRBcmVhOiBcIi5lZGl0LW5vZGUtZm9ybVwiLFxuXHRcdGNvbnRlbnRBcmVhOiBcIi5ub2RlLWNvbnRlbnRcIixcblx0XHRkcm9wcGFibGU6IFwiLmRyb3BwYWJsZVwiLFxuXHRcdGRyb3BJbmRpY2F0b3I6IFwiLmRyb3BwYWJsZSAuaW5kaWNhdG9yXCIsXG5cblx0XHRkb3Q6IFwic3ZnXCIsXG5cdFx0Y29tcGxldGlvblRpY2s6IFwiZGl2LmNvbXBsZXRlLXRpY2tcIixcblx0XHRzdmdHcmFkaWVudDogXCJsaW5lYXJHcmFkaWVudFwiLFxuXHRcdGNvbm5lY3RvcjogXCIuY29ubmVjdGlvbi1saW5lXCIsXG5cdFx0bG9ja2VkSWNvbjogXCIubG9ja2VkLWljb25cIixcblx0XHRsb2NrZWRMaW5lOiBcIi5sb2NrLWxpbmVcIixcblx0XHRzaWRlTGluZTogXCIuc2lkZS1saW5lXCIsXG5cdFx0Y2hlY2tib3hDb250YWluZXI6IFwiLmNoZWNrYm94XCIsXG5cdFx0Y2hlY2tib3g6IFwiLmNoZWNrYm94IGlucHV0XCIsXG5cblx0XHRub2RlQXR0YWNobWVudHM6IFwiLm5vZGUtYXR0YWNobWVudHNcIixcblx0XHR0YXNrc0NvbnRhaW5lcjogXCIudGFzay1ob3N0XCIsXG5cdFx0dGFza3NUaXRsZTogXCIudGFzay1ob3N0IC50aXRsZVwiLFxuXHRcdHJlc291cmNlc0NvbnRhaW5lcjogXCIucmVzb3VyY2UtaG9zdFwiLFxuXHRcdHJlc291cmNlc1RpdGxlOiBcIi5yZXNvdXJjZS1ob3N0IC50aXRsZVwiLFxuXHRcdGNoaWxkTm9kZXNDb250YWluZXI6IFwiLmNoaWxkLW5vZGVzLWNvbnRhaW5lclwiLFxuXHRcdGFkZENoaWxkTm9kZUJ0bjogXCIuYWRkLWNoaWxkLW5vZGVcIixcblx0XHRkcm9wT3ZlcmxheTogXCIuZHJvcC1vdmVybGF5XCIsXG5cdFx0dGFza092ZXJsYXk6IFwiLnRhc2staG9zdCAuZHJvcC1vdmVybGF5XCIsXG5cdFx0cmVzb3VyY2VPdmVybGF5OiBcIi5yZXNvdXJjZS1ob3N0IC5kcm9wLW92ZXJsYXlcIixcblxuXHRcdGZha2VUYXNrOiBcIi50YXNrLWhvc3QgLmZha2UtY29udGVudC1pdGVtXCIsXG5cdFx0ZmFrZVJlc291cmNlOiBcIi5yZXNvdXJjZS1ob3N0IC5mYWtlLWNvbnRlbnQtaXRlbVwiLFxuXHRcdG92ZXJsYXk6IFwiLm92ZXJsYXlcIixcblx0XHRvdmVybGF5U2F2aW5nOiBcIi5vdmVybGF5IC5zYXZpbmdcIixcblx0XHRvdmVybGF5Tm9kcm9wOiBcIi5vdmVybGF5IC5ub2Ryb3BcIixcblx0XHRlcnJvcnM6IFwiLmVycm9yc1wiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdGNsaWNrOiBcIm9uTm9kZUNsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkuYWRkQ2hpbGROb2RlQnRuXCI6IFwib25BZGRDaGlsZE5vZGVCdG5cIixcblx0XHRcIm1vdXNlZG93biBkaXYudGl0bGVbZHJhZ2dhYmxlPSd0cnVlJ106Zmlyc3RcIjogXCJzdGFydE5vZGVEcmFnXCIsXG5cdFx0XCJtb3VzZWRvd24gQHVpLm5vZGVcIjogXCJzdGFydE11bHRpc2VsZWN0XCIsXG5cdFx0XCJkcm9wbm9kZSBAdWkubm9kZVwiOiBcIm5vZGVEcm9wcGVkXCIsXG5cdFx0XCJkcmFnc3RhcnQgQHVpLm5vZGVcIjogXCJvbk5vZGVEcmFnU3RhcnRcIixcblx0XHRcImRyb3ByZXNvdXJjZSBAdWkudGFza3NDb250YWluZXJcIjogXCJvblRhc2tEcmFnRHJvcFwiLFxuXHRcdFwiZHJvcHJlc291cmNlIEB1aS5yZXNvdXJjZXNDb250YWluZXJcIjogXCJvblJlc291cmNlRHJhZ0Ryb3BcIixcblx0XHRcImNoZWNrQXR0YWNobWVudHMgQHVpLm5vZGVcIjogXCJjaGVja0F0dGFjaG1lbnRDb250YWluZXJzXCIsXG5cdFx0XCJjbGljayBAdWkuZG90XCI6IFwib25Eb3RDbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmNoZWNrYm94XCI6IFwib25DaGVja2JveENsaWNrXCIsXG5cblx0XHRkcmFnZW50ZXI6IFwib25Ob2RlRHJhZ0VudGVyXCIsXG5cdFx0ZHJhZ2xlYXZlOiBcIm9uTm9kZURyYWdMZWF2ZVwiLFxuXG5cdFx0XCJkcmFnZW50ZXIgQHVpLnRhc2tzQ29udGFpbmVyXCI6IFwib25UYXNrRHJhZ0VudGVyXCIsXG5cdFx0XCJkcmFnbGVhdmUgQHVpLnRhc2tzQ29udGFpbmVyXCI6IFwib25UYXNrRHJhZ0xlYXZlXCIsXG5cdFx0XCJkcmFnZW50ZXIgQHVpLnJlc291cmNlc0NvbnRhaW5lclwiOiBcIm9uUmVzb3VyY2VEcmFnRW50ZXJcIixcblx0XHRcImRyYWdsZWF2ZSBAdWkucmVzb3VyY2VzQ29udGFpbmVyXCI6IFwib25SZXNvdXJjZURyYWdMZWF2ZVwiLFxuXG5cdFx0XCJkcmFnb3ZlciBAdWkuZHJvcE92ZXJsYXlcIjogXCJvbkZpbGVEcmFnT3ZlclwiLFxuXHRcdFwiZHJvcCBAdWkuZHJvcE92ZXJsYXlcIjogXCJvbkZpbGVEcm9wXCIsXG5cdFx0XCJjbGljayBAdWkuY2FuY2VsQnRuXCI6IFwib25DYW5jZWxCdG5DbGlja1wiLFxuXHR9LFxuXG5cdGNoaWxkVmlld0V2ZW50czoge1xuXHRcdFtFdmVudHMuUmVsb2FkTm9kZV06IFwicmVsb2FkTm9kZVwiLFxuXHRcdFtFdmVudHMuU3RhcnROb2RlRWRpdF06IFwic3RhcnROb2RlRWRpdFwiLFxuXHRcdFtFdmVudHMuQ2FuY2VsTm9kZUVkaXRdOiBcImNhbmNlbE5vZGVFZGl0XCIsXG5cdFx0W0V2ZW50cy5Db21wbGV0ZU5vZGVFZGl0XTogXCJjb21wbGV0ZU5vZGVFZGl0XCIsXG5cdFx0W0V2ZW50cy5Db2xsYXBzZV06IFwiY29sbGFwc2VOb2RlXCIsXG5cdFx0W0V2ZW50cy5BZGRSZXNvdXJjZV06IFwiYWRkUmVzb3VyY2VcIixcblx0XHRbRXZlbnRzLk1vdmVSZXNvdXJjZV06IFwibW92ZVJlc291cmNlXCIsXG5cdFx0W0V2ZW50cy5BZGRTaWJsaW5nTm9kZV06IFwiYWRkU2libGluZ05vZGVcIixcblx0XHRbRXZlbnRzLlJlbW92ZU5vZGVGcm9tUGFyZW50XTogXCJyZW1vdmVDaGlsZE5vZGVcIixcblx0XHRbRXZlbnRzLlByb21vdGVTaWJsaW5nTm9kZV06IFwicHJvbW90ZVNpYmxpbmdOb2RlXCIsXG5cdFx0W0V2ZW50cy5SZW1vdmVDb250ZW50RnJvbVBhcmVudF06IFwicmVtb3ZlQ2hpbGRDb250ZW50XCIsXG5cdFx0W0V2ZW50cy5DaGVja0F0dGFjaG1lbnRDb250YWluZXJzXTogXCJjaGVja0F0dGFjaG1lbnRDb250YWluZXJzXCIsXG5cdFx0W0V2ZW50cy5Ob2RlRHJvcEFib3ZlXTogXCJub2RlRHJvcHBlZEFib3ZlXCIsXG5cdH0sXG5cblx0bW9kZWxFdmVudHM6IHtcblx0XHRcImNoYW5nZTpzZWxlY3RlZFwiOiBcIm9uU2VsZWN0ZWRTdGF0dXNDaGFuZ2VcIixcblx0XHRcImNoYW5nZTplZGl0TW9kZVwiOiBcIm9uRWRpdE1vZGVDaGFuZ2VcIixcblx0XHRcImNoYW5nZTpzaG93RHJvcEluZGljYXRvclwiOiBcIm9uU2hvd0Ryb3BJbmRpY2F0b3JDaGFuZ2VcIixcblx0XHRcImNoYW5nZTpkcm9wQ2hpbGRcIjogXCJvbkRyb3BDaGlsZENoYW5nZVwiLFxuXHRcdFwiY2hhbmdlOmRyb3BQb3NpdGlvblwiOiBcIm9uRHJvcFBvc2l0aW9uQ2hhbmdlXCIsXG5cdFx0cmVxdWVzdDogXCJvblNhdmVCZWdpblwiLFxuXHRcdHN5bmM6IFwib25TYXZlRW5kXCIsXG5cdFx0ZXJyb3I6IFwib25TYXZlRXJyb3JcIixcblx0XHRcImNoYW5nZTpkZXB0aFwiOiBcIm9uRGVwdGhDaGFuZ2VcIixcblx0XHRcImNoYW5nZTpsb2NrZWRcIjogXCJvbkxvY2tlZENoYW5nZVwiLFxuXHRcdFwiY2hhbmdlOmFjdGl2YXRpb25EYXRlXCI6IFwib25Mb2NrZWRDaGFuZ2VcIixcblx0XHRcImNoYW5nZTpwYXJlbnRMb2NrZWRcIjogXCJvblBhcmVudExvY2tDaGFuZ2VcIixcblx0XHRcImNoYW5nZTpwYXJlbnRBY3RpdmF0aW9uXCI6IFwib25QYXJlbnRMb2NrQ2hhbmdlXCIsXG5cdFx0XCJjaGFuZ2U6cGFyZW50VmlzaWJsZVwiOiBcIm9uUGFyZW50VmlzaWJsZUNoYW5nZVwiLFxuXHRcdFwiY2hhbmdlOnZpc2libGVcIjogXCJvblZpc2libGVDaGFuZ2VcIixcblx0XHRcImNoYW5nZTpsYXN0Tm9kZVwiOiBcIm9uTGFzdE5vZGVDaGFuZ2VcIixcblx0XHRcImNoYW5nZTpjaGlsZHJlblwiOiBcIm9uQ2hpbGRyZW5DaGFuZ2VcIixcblx0XHRcImNoYW5nZTpwcm9ncmVzc1wiOiBcIm9uUHJvZ3Jlc3NDaGFuZ2VcIixcblx0XHRcImNoYW5nZTptdWx0aXNlbGVjdGluZ1wiOiBcIm9uTXVsdGlTZWxlY3RpbmdDaGFuZ2VcIixcblx0fSxcblxuXHRscFJhZGlvRXZlbnRzOiB7XG5cdFx0W0V2ZW50cy5Cb2R5Q2xpY2tdOiBcImJvZHlDbGlja0V2ZW50XCIsXG5cdFx0W0V2ZW50cy5Ob2RlU2VsZWN0ZWRdOiBcIm5vZGVTZWxlY3RlZEV2ZW50XCIsXG5cdFx0W0V2ZW50cy5FZGl0aW5nQ2hhbmdlXTogXCJvbkVkaXRpbmdDaGFuZ2VcIixcblx0XHRbRXZlbnRzLkVkaXRpbmdTdGFydGVkXTogXCJlZGl0aW5nU3RhcnRcIixcblx0XHRbRXZlbnRzLkVkaXRpbmdFbmRlZF06IFwiZWRpdGluZ0VuZFwiLFxuXHRcdFtFdmVudHMuTm9kZURyYWdMaXN0ZW5dOiBcIm5vZGVEcmFnTGlzdGVuXCIsXG5cdFx0W0V2ZW50cy5Ob2RlU2VsZWN0TGlzdGVuXTogXCJub2RlU2VsZWN0TGlzdGVuXCIsXG5cdFx0W0V2ZW50cy5Ob2RlU2VsZWN0RW5kXTogXCJub2RlU2VsZWN0RW5kXCIsXG5cdFx0W0V2ZW50cy5Ob2RlRHJhZ0VuZF06IFwibm9kZURyYWdFbmRlZFwiLFxuXHRcdFtFdmVudHMuUmVzb3VyY2VEcmFnTGlzdGVuXTogXCJyZXNvdXJjZURyYWdMaXN0ZW5cIixcblx0XHRbRXZlbnRzLlJlc291cmNlRHJhZ0VuZF06IFwicmVzb3VyY2VEcmFnRW5kXCIsXG5cdFx0W0V2ZW50cy5SZW1vdmVMUEl0ZW1zXTogXCJvblJlbW92ZUxQSXRlbXNcIixcblx0fSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRpc0xvY2tlZDogKCkgPT4gdGhpcy5tb2RlbC5nZXQoXCJsb2NrZWRcIikgfHwgKCF0aGlzLm1vZGVsLmdldChcImxvY2tlZFwiKSAmJiB0aGlzLm1vZGVsLmdldChcImFjdGl2YXRpb25EYXRlXCIpICYmIHRoaXMubW9kZWwuZ2V0KFwiYWN0aXZhdGlvbkRhdGVcIikgPiBtb21lbnQoKS51bml4KCkpLFxuXHRcdFx0aXNQYXJlbnRMb2NrZWQ6ICgpID0+IHRoaXMubW9kZWwuZ2V0KFwicGFyZW50TG9ja2VkXCIpIHx8ICghdGhpcy5tb2RlbC5nZXQoXCJwYXJlbnRMb2NrZWRcIikgJiYgdGhpcy5tb2RlbC5nZXQoXCJwYXJlbnRBY3RpdmF0aW9uXCIpICYmIHRoaXMubW9kZWwuZ2V0KFwicGFyZW50QWN0aXZhdGlvblwiKSA+IG1vbWVudCgpLnVuaXgoKSksXG5cdFx0fTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5iaW5kRXZlbnRzKGxwUmFkaW8sIHRoaXMubHBSYWRpb0V2ZW50cyk7XG5cblx0XHR0aGlzLm1vZGVsLnNldCh7XG5cdFx0XHRwYXJlbnRMb2NrZWQ6IG9wdGlvbnMucGFyZW50TG9ja2VkIHx8IGZhbHNlLFxuXHRcdFx0cGFyZW50QWN0aXZhdGlvbjogb3B0aW9ucy5wYXJlbnRBY3RpdmF0aW9uIHx8IG51bGwsXG5cdFx0XHRwYXJlbnRWaXNpYmxlOiBvcHRpb25zLnBhcmVudFZpc2libGUgIT09IGZhbHNlLFxuXHRcdH0pO1xuXG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwiZGVwdGhcIikgPT09IDEpIHtcblx0XHRcdHRoaXMubGlzdGVuVG8oZXZlbnRCdXMsIGV2ZW50QnVzLkV2ZW50cy5BdHRhY2htZW50QWRkZWQsIHRoaXMub25BdHRhY2htZW50QWRkZWQuYmluZCh0aGlzKSk7XG5cdFx0XHR0aGlzLmxpc3RlblRvKGV2ZW50QnVzLCBldmVudEJ1cy5FdmVudHMuQXR0YWNobWVudFJlbW92ZWQsIHRoaXMub25BdHRhY2htZW50UmVtb3ZlZC5iaW5kKHRoaXMpKTtcblx0XHR9XG5cblx0XHR0aGlzLmRyYWdDb3VudCA9IHsgdGFzazogMCwgcmVzb3VyY2U6IDAsIG5vZGU6IDAgfTtcblx0XHR0aGlzLnhociA9IHt9O1xuXHRcdHRoaXMuc2F2ZVF1ZXVlID0gW107XG5cdH0sXG5cblx0b25Ob2RlRHJhZ0VudGVyOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGlmICghY2FuRWRpdCgpKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0aWYgKF8uc3BsaXQodGhpcy5tb2RlbC5nZXQoXCJwYXRoXCIpLCBcIi5cIikubGVuZ3RoID4gMSlcblx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0dGhpcy5kcmFnQ291bnQubm9kZSsrO1xuXG5cdFx0aWYgKCF0aGlzLnRhc2tzLmxlbmd0aCkge1xuXHRcdFx0dGhpcy51aS50YXNrc0NvbnRhaW5lci5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLnVpLmZha2VUYXNrLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR9XG5cblx0XHRpZiAoIXRoaXMucmVzb3VyY2VzLmxlbmd0aCkge1xuXHRcdFx0dGhpcy51aS5yZXNvdXJjZXNDb250YWluZXIucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0dGhpcy51aS5mYWtlUmVzb3VyY2UucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblx0fSxcblxuXHRvbk5vZGVEcmFnTGVhdmU6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0aWYgKCFjYW5FZGl0KCkpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRpZiAoXy5zcGxpdCh0aGlzLm1vZGVsLmdldChcInBhdGhcIiksIFwiLlwiKS5sZW5ndGggPiAxKVxuXHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHR0aGlzLmRyYWdDb3VudC5ub2RlLS07XG5cblx0XHRpZiAodGhpcy5kcmFnQ291bnQubm9kZSA9PT0gMCkge1xuXHRcdFx0aWYgKCF0aGlzLnRhc2tzLmxlbmd0aCkge1xuXHRcdFx0XHR0aGlzLnVpLnRhc2tzQ29udGFpbmVyLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdFx0dGhpcy51aS5mYWtlVGFzay5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghdGhpcy5yZXNvdXJjZXMubGVuZ3RoKSB7XG5cdFx0XHRcdHRoaXMudWkucmVzb3VyY2VzQ29udGFpbmVyLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdFx0dGhpcy51aS5mYWtlUmVzb3VyY2UuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRvblRhc2tEcmFnRW50ZXI6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0aWYgKCFjYW5FZGl0KCkpXG5cdFx0XHRyZXR1cm47XG5cdFx0dGhpcy5kcmFnQ291bnQudGFzaysrO1xuXHRcdCQoZXZlbnQuY3VycmVudFRhcmdldCkuZmluZChcIi5kcm9wLW92ZXJsYXlcIikuYWRkQ2xhc3MoXCJkcmFnZ2luZ1wiKTtcblx0fSxcblxuXHRvblRhc2tEcmFnTGVhdmU6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0aWYgKCFjYW5FZGl0KCkpXG5cdFx0XHRyZXR1cm47XG5cdFx0dGhpcy5kcmFnQ291bnQudGFzay0tO1xuXHRcdGlmICh0aGlzLmRyYWdDb3VudC50YXNrID09PSAwKVxuXHRcdFx0JChldmVudC5jdXJyZW50VGFyZ2V0KS5maW5kKFwiLmRyb3Atb3ZlcmxheVwiKS5yZW1vdmVDbGFzcyhcImRyYWdnaW5nXCIpO1xuXHR9LFxuXG5cdG9uUmVzb3VyY2VEcmFnRW50ZXI6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0aWYgKCFjYW5FZGl0KCkpXG5cdFx0XHRyZXR1cm47XG5cdFx0dGhpcy5kcmFnQ291bnQucmVzb3VyY2UrKztcblx0XHQkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLmZpbmQoXCIuZHJvcC1vdmVybGF5XCIpLmFkZENsYXNzKFwiZHJhZ2dpbmdcIik7XG5cdH0sXG5cblx0b25SZXNvdXJjZURyYWdMZWF2ZTogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRpZiAoIWNhbkVkaXQoKSlcblx0XHRcdHJldHVybjtcblx0XHR0aGlzLmRyYWdDb3VudC5yZXNvdXJjZS0tO1xuXHRcdGlmICh0aGlzLmRyYWdDb3VudC5yZXNvdXJjZSA9PT0gMClcblx0XHRcdCQoZXZlbnQuY3VycmVudFRhcmdldCkuZmluZChcIi5kcm9wLW92ZXJsYXlcIikucmVtb3ZlQ2xhc3MoXCJkcmFnZ2luZ1wiKTtcblx0fSxcblxuXHRvbkZpbGVEcmFnT3ZlcjogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdGV2ZW50Lm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSBcImNvcHlcIjtcblx0fSxcblxuXHRvbkZpbGVEcm9wOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRpZiAoIXRoaXMuYnVsa0RyYWdEcm9wSGVscGVyKVxuXHRcdFx0dGhpcy5idWxrRHJhZ0Ryb3BIZWxwZXIgPSBuZXcgQnVsa0RyYWdEcm9wSGVscGVyKCk7XG5cblx0XHRjb25zdCBncm91cCA9IGV2ZW50QnVzLnJlcXVlc3QoZXZlbnRCdXMuRXZlbnRzLkdldEN1cnJlbnRHcm91cCk7XG5cdFx0Ly8gQ2hlY2sgb3ZlcmxheSBwYXJlbnQgaWYgZHJvcHBpbmcgaW4gdGFza1xuXHRcdGNvbnN0IGlzVGFza3MgPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLnBhcmVudCgpLmhhc0NsYXNzKFwidGFzay1ob3N0XCIpO1xuXHRcdGNvbnN0IGZpbGVzID0gXy5tYXAoXy5maWx0ZXIodGhpcy5idWxrRHJhZ0Ryb3BIZWxwZXIuZXh0cmFjdEZpbGVzRnJvbUV2ZW50KGV2ZW50KSwgZiA9PiBmICE9PSBudWxsKSwgZmlsZSA9PiB7XG5cdFx0XHRmaWxlLmZpbGUgPSBmaWxlO1xuXHRcdFx0ZmlsZS5zdWJqZWN0ID0gZ3JvdXAuZ2V0KFwic3ViamVjdFwiKTtcblx0XHRcdGZpbGUuZ3JhZGUgPSBncm91cC5nZXQoXCJncmFkZVwiKTtcblx0XHRcdGZpbGUubGFuZ3VhZ2UgPSBncm91cC5nZXQoXCJsYW5ndWFnZVwiKTtcblx0XHRcdHJldHVybiBuZXcgQmFja2JvbmUuTW9kZWwoZmlsZSk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLmRyYWdDb3VudCA9IHsgdGFzazogMCwgcmVzb3VyY2U6IDAsIG5vZGU6IDAgfTtcblx0XHR0aGlzLnVpLmRyb3BPdmVybGF5LnJlbW92ZUNsYXNzKFwiZHJhZ2dpbmdcIik7XG5cdFx0JChcIi5jYW5jZWwtZHJvcFwiKS5hZGRDbGFzcyhcImhpZGVcIik7XG5cblx0XHRpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0bGV0IGZpbGVNb2RlbCwgZXJyb3JDb3VudCA9IDA7XG5cdFx0XHRjb25zdCBmaWxlTW9kZWxzID0gXy5tYXAoZmlsZXMsIGZpbGUgPT4ge1xuXHRcdFx0XHRmaWxlTW9kZWwgPSB0aGlzLmJ1bGtEcmFnRHJvcEhlbHBlci5nZXRSZXNvdXJjZU1vZGVsKGZpbGUpO1xuXHRcdFx0XHRpZiAoXy52YWx1ZXMoZmlsZU1vZGVsLmdldChcImVycm9yc1wiKSkubGVuZ3RoID4gMClcblx0XHRcdFx0XHRlcnJvckNvdW50Kys7XG5cdFx0XHRcdGZpbGVNb2RlbC5zZXQoXCJmaWxlTW9kZWxcIiwgZmlsZSk7XG5cdFx0XHRcdHJldHVybiBmaWxlTW9kZWw7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gaWYgdGhlIHNhdmUgcXVldWUgaGFzIGludmFsaWQgZmlsZXMsIHNob3cgY29uZmlybSBtb2RhbCwgZWxzZSwgc3RhcnQgdXBsb2FkXG5cdFx0XHRpZiAoZXJyb3JDb3VudCA+IDApIHtcblx0XHRcdFx0Y29uc3QgbW9kYWwgPSBuZXcgQnVsa1Jlc291cmNlVXBsb2FkTW9kYWwoeyBtb2RlbDogbmV3IEJhY2tib25lLk1vZGVsKHsgZmlsZXM6IGZpbGVNb2RlbHMsIGRvbnRTYXZlOiB0cnVlIH0pIH0pO1xuXG5cdFx0XHRcdG1vZGFsLm9uY2UoXCJhY3Rpb25cIiwgKGFjdGlvbiwgc2F2ZVF1ZXVlLCBjYW5jZWxlZEZpbGVzKSA9PiB7XG5cdFx0XHRcdFx0aWYgKGFjdGlvbiA9PT0gXCJzYXZlXCIpIHtcblx0XHRcdFx0XHRcdC8vIFJlbW92ZSBjYW5jZWxlZCBmaWxlc1xuXHRcdFx0XHRcdFx0Xy5lYWNoKGNhbmNlbGVkRmlsZXMsIGZpbGUgPT4gdGhpcy5vblVwbG9hZENhbmNlbChmaWxlLmdldChcInJlc291cmNlTW9kZWxcIikpKTtcblx0XHRcdFx0XHRcdGlmICghdGhpcy5jdXJyZW50bHlTYXZpbmcpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5zZXRTYXZlUXVldWUoc2F2ZVF1ZXVlLCBpc1Rhc2tzKTtcblx0XHRcdFx0XHRcdFx0dGhpcy5zYXZlRmlsZXMoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHRoaXMubGlzdGVuVG8obW9kYWwsIFwiY2FuY2VsXCIsIHRoaXMub25VcGxvYWRDYW5jZWxBbGwuYmluZCh0aGlzKSk7XG5cblx0XHRcdFx0bW9kYWwuc2hvdygpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHRoaXMuc2V0U2F2ZVF1ZXVlKGZpbGVzLCBpc1Rhc2tzKTtcblx0XHRcdFx0dGhpcy5zYXZlUXVldWUgPSBfLmZpbHRlcih0aGlzLnNhdmVRdWV1ZSwgZmlsZSA9PiAhZmlsZS5nZXQoXCJlcnJvcnNcIikgfHwgXy52YWx1ZXMoZmlsZS5nZXQoXCJlcnJvcnNcIikpLmxlbmd0aCA9PT0gMCk7XG5cdFx0XHRcdGlmICghdGhpcy5jdXJyZW50bHlTYXZpbmcpXG5cdFx0XHRcdFx0dGhpcy5zYXZlRmlsZXMoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0c2V0U2F2ZVF1ZXVlOiBmdW5jdGlvbihmaWxlcywgaXNUYXNrcykge1xuXHRcdGxldCByZXNvdXJjZSwgZmlsZU1vZGVsO1xuXHRcdHRoaXMuc2F2ZVF1ZXVlID0gXy5tZXJnZSh0aGlzLnNhdmVRdWV1ZSwgXy5tYXAoXy5maWx0ZXIoZmlsZXMsIGZpbGUgPT4gIWZpbGUuZ2V0KFwic2F2ZWRcIikpLCBmaWxlID0+IHtcblx0XHRcdGZpbGVNb2RlbCA9IGZpbGUuZ2V0KFwiZmlsZU1vZGVsXCIpID8gZmlsZSA6IHRoaXMuYnVsa0RyYWdEcm9wSGVscGVyLmdldFJlc291cmNlTW9kZWwoZmlsZSk7XG5cdFx0XHRpZiAoXy52YWx1ZXMoZmlsZU1vZGVsLmdldChcImVycm9yc1wiKSkubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdGZpbGVNb2RlbC5zZXQoXCJpc1Rhc2tcIiwgaXNUYXNrcyk7XG5cdFx0XHRcdHJlc291cmNlID0gZmlsZU1vZGVsLnRvSlNPTigpO1xuXG5cdFx0XHRcdC8vIENyZWF0ZSBscF9pdGVtIHdpdGhvdXQgc2F2aW5nXG5cdFx0XHRcdHJlc291cmNlLmdyb3VwcyA9IGV2ZW50QnVzLnJlcXVlc3QoZXZlbnRCdXMuRXZlbnRzLkdldEN1cnJlbnRHcm91cHMpO1xuXHRcdFx0XHRfLmV4dGVuZChyZXNvdXJjZSwge1xuXHRcdFx0XHRcdGxlYXJuaW5nX3BhdGg6IHRoaXMubW9kZWwuZ2V0KFwibGVhcm5pbmdfcGF0aFwiKSxcblx0XHRcdFx0XHRpc1Rhc2s6IGlzVGFza3MsXG5cdFx0XHRcdFx0ZHVlRGF0ZTogbnVsbCxcblx0XHRcdFx0XHR2aXNpYmxlOiB0aGlzLm1vZGVsLmdldChcInZpc2libGVcIiksXG5cdFx0XHRcdFx0bG9ja2VkOiB0aGlzLm1vZGVsLmdldChcImxvY2tlZFwiKSB8fCByZXNvdXJjZS5sb2NrZWQsXG5cdFx0XHRcdFx0YWN0aXZhdGlvbkRhdGU6IHRoaXMubW9kZWwuZ2V0KFwiYWN0aXZhdGlvbkRhdGVcIikgfHwgcmVzb3VyY2UuYWN0aXZhdGlvbkRhdGUgfHwgbnVsbCxcblx0XHRcdFx0XHRwYXJlbnRMb2NrZWQ6IHRoaXMubW9kZWwuZ2V0KFwicGFyZW50TG9ja2VkXCIpLFxuXHRcdFx0XHRcdHBhcmVudEFjdGl2YXRpb246IHRoaXMubW9kZWwuZ2V0KFwicGFyZW50QWN0aXZhdGlvblwiKSxcblx0XHRcdFx0XHRwYXJlbnRWaXNpYmxlOiB0aGlzLm1vZGVsLmdldChcInBhcmVudFZpc2libGVcIiksXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGlmIChyZXNvdXJjZS5sb2NrZWQgfHwgKCFyZXNvdXJjZS5sb2NrZWQgJiYgcmVzb3VyY2UuYWN0aXZhdGlvbkRhdGUgJiYgcmVzb3VyY2UuYWN0aXZhdGlvbkRhdGUgPCBtb21lbnQoKS51bml4KCkpKVxuXHRcdFx0XHRcdHJlc291cmNlLmFjdGl2YXRpb25EYXRlID0gbnVsbDtcblxuXHRcdFx0XHRpZiAoIXJlc291cmNlLnBhdGggfHwgKCF0aGlzLnRhc2tzLmdldChyZXNvdXJjZS5yZXNvdXJjZSkgJiYgIXRoaXMucmVzb3VyY2VzLmdldChyZXNvdXJjZS5yZXNvdXJjZXMpKSB8fCAhbG9jYWxNZXRob2RzLmlzU2libGluZyh0aGlzLm1vZGVsLmdldChcInBhdGhcIiksIHJlc291cmNlLnBhdGgpKSB7XG5cdFx0XHRcdFx0Y29uc3QgbWF4VGFzayA9IHRoaXMudGFza3MubGFzdCgpO1xuXHRcdFx0XHRcdGNvbnN0IG1heFJlc291cmNlID0gdGhpcy5yZXNvdXJjZXMubGFzdCgpO1xuXG5cdFx0XHRcdFx0aWYgKCFtYXhUYXNrICYmICFtYXhSZXNvdXJjZSlcblx0XHRcdFx0XHRcdHJlc291cmNlLnBhdGggPSB0aGlzLm1vZGVsLmdldChcInBhdGhcIikgKyBcIi5BQUFcIjtcblx0XHRcdFx0XHRlbHNlIGlmICghbWF4UmVzb3VyY2UpXG5cdFx0XHRcdFx0XHRyZXNvdXJjZS5wYXRoID0gbG9jYWxNZXRob2RzLmdldE5leHRQYXRoKG1heFRhc2suZ2V0KFwicGF0aFwiKSk7XG5cdFx0XHRcdFx0ZWxzZSBpZiAoIW1heFRhc2spXG5cdFx0XHRcdFx0XHRyZXNvdXJjZS5wYXRoID0gbG9jYWxNZXRob2RzLmdldE5leHRQYXRoKG1heFJlc291cmNlLmdldChcInBhdGhcIikpO1xuXHRcdFx0XHRcdGVsc2UgaWYgKGxvY2FsTWV0aG9kcy5pc0FmdGVyKG1heFRhc2suZ2V0KFwicGF0aFwiKSwgbWF4UmVzb3VyY2UuZ2V0KFwicGF0aFwiKSkpXG5cdFx0XHRcdFx0XHRyZXNvdXJjZS5wYXRoID0gbG9jYWxNZXRob2RzLmdldE5leHRQYXRoKG1heFJlc291cmNlLmdldChcInBhdGhcIikpO1xuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdHJlc291cmNlLnBhdGggPSBsb2NhbE1ldGhvZHMuZ2V0TmV4dFBhdGgobWF4VGFzay5nZXQoXCJwYXRoXCIpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSBuZXcgUmVzb3VyY2VNb2RlbChyZXNvdXJjZSk7XG5cblx0XHRcdFx0Ly8gVXBkYXRlIHRoZSBjYWNoZSBvZiBwcmUtc2F2ZWQgaXRlbXNcblx0XHRcdFx0aWYgKCF0aGlzLmNvbnRlbnRTYXZlTWFwKVxuXHRcdFx0XHRcdHRoaXMuY29udGVudFNhdmVNYXAgPSB7fTtcblxuXHRcdFx0XHR0aGlzLmNvbnRlbnRTYXZlTWFwW3Jlc291cmNlTW9kZWwuY2lkXSA9IHRydWU7XG5cblx0XHRcdFx0aWYgKHJlc291cmNlLmlzVGFzaylcblx0XHRcdFx0XHR0aGlzLnRhc2tzLmFkZChyZXNvdXJjZU1vZGVsKTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHRoaXMucmVzb3VyY2VzLmFkZChyZXNvdXJjZU1vZGVsKTtcblxuXHRcdFx0XHR0aGlzLmxpc3RlblRvKGZpbGVNb2RlbCwgXCJ1cGxvYWQ6cHJvZ3Jlc3NcIiwgdGhpcy5vblVwbG9hZFByb2dyZXNzLmJpbmQodGhpcywgcmVzb3VyY2VNb2RlbCkpO1xuXHRcdFx0XHR0aGlzLmxpc3RlblRvKHJlc291cmNlTW9kZWwsIFwidXBsb2FkOmNhbmNlbFwiLCB0aGlzLm9uVXBsb2FkQ2FuY2VsLmJpbmQodGhpcywgcmVzb3VyY2VNb2RlbCkpO1xuXHRcdFx0XHRmaWxlTW9kZWwuc2V0KFwicmVzb3VyY2VNb2RlbFwiLCByZXNvdXJjZU1vZGVsKTtcblx0XHRcdFx0ZmlsZU1vZGVsLnNldChcImZpbGVNb2RlbFwiLCBmaWxlKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZpbGVNb2RlbDtcblx0XHR9KSk7XG5cdH0sXG5cblx0b25VcGxvYWRDYW5jZWxBbGw6IGZ1bmN0aW9uKCkge1xuXHRcdF8uZWFjaCh0aGlzLnNhdmVRdWV1ZSwgZmlsZSA9PiB7XG5cdFx0XHRpZiAoXy52YWx1ZXMoZmlsZS5nZXQoXCJlcnJvcnNcIikpLmxlbmd0aCA9PT0gMClcblx0XHRcdFx0ZmlsZS5nZXQoXCJyZXNvdXJjZU1vZGVsXCIpLnRyaWdnZXIoXCJ2aWV3OmRlc3Ryb3lcIik7XG5cdFx0fSk7XG5cblx0XHR0aGlzLnVpLmZha2VSZXNvdXJjZS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5mYWtlVGFzay5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5kcm9wT3ZlcmxheS5yZW1vdmVDbGFzcyhcImRyYWdnaW5nXCIpO1xuXG5cdFx0aWYgKHRoaXMudGFza3MubGVuZ3RoID09PSAwKVxuXHRcdFx0dGhpcy51aS50YXNrc0NvbnRhaW5lci5hZGRDbGFzcyhcImhpZGVcIik7XG5cblx0XHRpZiAodGhpcy5yZXNvdXJjZXMubGVuZ3RoID09PSAwKVxuXHRcdFx0dGhpcy51aS5yZXNvdXJjZXNDb250YWluZXIucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdHNhdmVGaWxlczogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuc2F2ZVF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Z2xvYmFsUmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLk5hdmlnYXRpb25Qcm9tcHQsIG51bGwpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5jdXJyZW50bHlTYXZpbmcpXG5cdFx0XHR0aGlzLmN1cnJlbnRseVNhdmluZyA9IHRoaXMuc2F2ZVF1ZXVlLnNoaWZ0KCk7XG5cblx0XHRnbG9iYWxSYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuTmF2aWdhdGlvblByb21wdCwgXCJTb21lIGF0dGFjaG1lbnRzIGFyZSBzdGlsbCBzYXZpbmcuIElmIHlvdSBsZWF2ZSwgdGhleSB3aWxsIGJlIGxvc3QuIEFyZSB5b3Ugc3VyZT9cIik7XG5cblx0XHQvLyBTYXZlIHRoZSBtb2RlbCwgdXBsb2FkaW5nIHRoZSBmaWxlXG5cdFx0dGhpcy54aHJbdGhpcy5jdXJyZW50bHlTYXZpbmcuZ2V0KFwicmVzb3VyY2VNb2RlbFwiKS5jaWRdID0gdGhpcy5jdXJyZW50bHlTYXZpbmcuYmluYXJ5U2F2ZShudWxsLCB7XG5cdFx0XHR2YWxpZGF0ZTogZmFsc2UsXG5cdFx0XHR3YWl0OiB0cnVlLFxuXHRcdFx0ZGF0YTogdGhpcy5jdXJyZW50bHlTYXZpbmcuYXR0cmlidXRlcyxcblx0XHRcdHN1Y2Nlc3M6IHRoaXMuc2F2ZVJlc291cmNlU3VjY2Vzcy5iaW5kKHRoaXMsIHRoaXMuY3VycmVudGx5U2F2aW5nLmdldChcInJlc291cmNlTW9kZWxcIikpLFxuXHRcdFx0ZXJyb3I6IHRoaXMuc2F2ZVJlc291cmNlRXJyb3IuYmluZCh0aGlzLCB0aGlzLmN1cnJlbnRseVNhdmluZy5nZXQoXCJyZXNvdXJjZU1vZGVsXCIpKSxcblx0XHR9KTtcblx0fSxcblxuXHRzYXZlUmVzb3VyY2VTdWNjZXNzOiBmdW5jdGlvbihyZXNvdXJjZU1vZGVsLCBtb2RlbCkge1xuXHRcdHJlc291cmNlTW9kZWwuc2V0KFwicmVzb3VyY2VcIiwgbW9kZWwuZ2V0KFwiX2lkXCIpKTtcblx0XHRyZXNvdXJjZU1vZGVsLnVuc2V0KFwiZmlsZU1vZGVsXCIpO1xuXHRcdHJlc291cmNlTW9kZWwudW5zZXQoXCJyZXNvdXJjZU1vZGVsXCIpO1xuXHRcdG1vZGVsLnNldChcInNhdmVkXCIsIHRydWUpO1xuXG5cdFx0cmVzb3VyY2VNb2RlbC5zYXZlKG51bGwsIHtcblx0XHRcdHN1Y2Nlc3M6ICgpID0+IHtcblx0XHRcdFx0dGhpcy5jdXJyZW50bHlTYXZpbmcgPSBmYWxzZTtcblx0XHRcdFx0dGhpcy5zYXZlRmlsZXMoKTtcblxuXHRcdFx0XHRkZWxldGUgdGhpcy5jb250ZW50U2F2ZU1hcFtyZXNvdXJjZU1vZGVsLmNpZF07XG5cblx0XHRcdFx0dGhpcy5yZW9yZGVyQ29udGVudChyZXNvdXJjZU1vZGVsKTtcblxuXHRcdFx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5BdHRhY2htZW50QWRkZWQsIHJlc291cmNlTW9kZWwpO1xuXHRcdFx0fSxcblx0XHRcdGVycm9yOiAobHBpTW9kZWwsIHhocikgPT4ge1xuXHRcdFx0XHRjb25zdCBhbnN3ZXIgPSBBcHAucGFyc2VSZXNwb25zZSh4aHIpO1xuXHRcdFx0XHRpZiAoeGhyLnJlc3BvbnNlSlNPTiAmJiB4aHIucmVzcG9uc2VKU09OLmRlbGV0ZSAmJiB0aGlzLmN1cnJlbnRseVNhdmluZylcblx0XHRcdFx0XHR0aGlzLmN1cnJlbnRseVNhdmluZy5kZXN0cm95KCk7XG5cblx0XHRcdFx0cmVzb3VyY2VNb2RlbC5zZXQoXCJlcnJvcnNcIiwgeyBlcnJvcjogYW5zd2VyLmRldGFpbCB8fCBhbnN3ZXIuaW5mbyB9KTtcblxuXHRcdFx0XHRpZiAocmVzb3VyY2VNb2RlbC5nZXQoXCJpc1Rhc2tcIikpXG5cdFx0XHRcdFx0dGhpcy50YXNrcy5yZW1vdmUocmVzb3VyY2VNb2RlbCk7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR0aGlzLnJlc291cmNlcy5yZW1vdmUocmVzb3VyY2VNb2RlbCk7XG5cblx0XHRcdFx0aWYgKHRoaXMuc2F2ZVF1ZXVlLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdHRoaXMudGFza3MubW9kZWxzID0gXy5maWx0ZXIodGhpcy50YXNrcy5tb2RlbHMsIGxwSXRlbSA9PiBscEl0ZW0uaGFzKFwiY3JlYXRlZFwiKSk7XG5cdFx0XHRcdFx0dGhpcy5yZXNvdXJjZXMubW9kZWxzID0gXy5maWx0ZXIodGhpcy5yZXNvdXJjZXMubW9kZWxzLCBscEl0ZW0gPT4gbHBJdGVtLmhhcyhcImNyZWF0ZWRcIikpO1xuXHRcdFx0XHRcdHRoaXMucmVuZGVyKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLmN1cnJlbnRseVNhdmluZyA9IGZhbHNlO1xuXHRcdFx0XHR0aGlzLnNhdmVGaWxlcygpO1xuXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLmNvbnRlbnRTYXZlTWFwW3Jlc291cmNlTW9kZWwuY2lkXTtcblxuXHRcdFx0XHRjb25zdCBlcnJvck1lc3NhZ2UgPSBcIjxwPkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHNhdmluZyB0aGUgYXR0YWNobWVudCBmb3IgXCIgKyBscGlNb2RlbC5nZXQoXCJ0aXRsZVwiKSArIFwiOjxicj5cIiArXG5cdFx0XHRcdFx0XHQoYW5zd2VyLmRldGFpbCB8fCBhbnN3ZXIuaW5mbykucmVwbGFjZSgvW1xcJlxcPFxcPlxcJ1xcXCJdL2csIHggPT4gXCImI1wiICsgeC5jaGFyQ29kZUF0KDApICsgXCI7XCIpICsgXCI8L3A+XCI7XG5cblx0XHRcdFx0Y29uc3QgbW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHRcdFx0dGl0bGU6IFwiPHNwYW4gY2xhc3M9J2ZhbCBmYS10aW1lcy1jaXJjbGUnLz4gRXJyb3JcIixcblx0XHRcdFx0XHRib2R5OiBlcnJvck1lc3NhZ2UsXG5cdFx0XHRcdFx0aG9zdDogXCIjbGluay1yZXNvdXJjZXNcIixcblx0XHRcdFx0XHR3YXJuaW5nOiB0cnVlLFxuXHRcdFx0XHRcdGhpZGVCdXR0b25zOiBbXCJjYW5jZWxcIl0sXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdG1vZGFsLnNob3coKTtcblx0XHRcdH0sXG5cdFx0fSk7XG5cdFx0dGhpcy54aHJbcmVzb3VyY2VNb2RlbC5jaWRdID0gbnVsbDtcblx0XHRyZXNvdXJjZU1vZGVsLnRyaWdnZXIoXCJzYXZlOnN1Y2Nlc3NcIiwgbW9kZWwpO1xuXHR9LFxuXG5cdHNhdmVSZXNvdXJjZUVycm9yOiBmdW5jdGlvbihyZXNvdXJjZU1vZGVsLCBtb2RlbCwgeGhyKSB7XG5cdFx0dGhpcy54aHJbcmVzb3VyY2VNb2RlbC5jaWRdID0gbnVsbDtcblx0XHRkZWxldGUgdGhpcy5jb250ZW50U2F2ZU1hcFtyZXNvdXJjZU1vZGVsLmNpZF07XG5cdFx0dGhpcy5jdXJyZW50bHlTYXZpbmcgPSBmYWxzZTtcblxuXHRcdGlmICh4aHIuc3RhdHVzVGV4dCAhPT0gXCJhYm9ydFwiKVxuXHRcdFx0cmVzb3VyY2VNb2RlbC50cmlnZ2VyKFwic2F2ZTplcnJvclwiLCB4aHIpO1xuXG5cdFx0aWYgKHRoaXMuc2F2ZVF1ZXVlLmxlbmd0aCA+IDApXG5cdFx0XHR0aGlzLnNhdmVGaWxlcygpO1xuXHR9LFxuXG5cdG9uVXBsb2FkUHJvZ3Jlc3M6IGZ1bmN0aW9uKHJlc291cmNlTW9kZWwsIHBlcmNlbnRhZ2UpIHtcblx0XHRyZXNvdXJjZU1vZGVsLnRyaWdnZXIoXCJ1cGxvYWQ6cHJvZ3Jlc3NcIiwgcGVyY2VudGFnZSwgcmVzb3VyY2VNb2RlbCk7XG5cdH0sXG5cblx0b25VcGxvYWRDYW5jZWw6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0aWYgKCFtb2RlbClcblx0XHRcdHJldHVybjtcblxuXHRcdGlmIChtb2RlbC5nZXQoXCJpc1Rhc2tcIikpXG5cdFx0XHR0aGlzLnRhc2tzLnJlbW92ZShtb2RlbCk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5yZXNvdXJjZXMucmVtb3ZlKG1vZGVsKTtcblxuXHRcdGlmICh0aGlzLmN1cnJlbnRseVNhdmluZylcblx0XHRcdHRoaXMuc2F2ZVF1ZXVlID0gXy5yZWplY3QodGhpcy5zYXZlUXVldWUsIGZpbGUgPT4gZmlsZS5jaWQgPT09IHRoaXMuY3VycmVudGx5U2F2aW5nLmNpZCk7XG5cblx0XHQvLyBBYm9ydCBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHNlcnZlciBpZiBpdGVtIGlzIGluIHByb2dyZXNzXG5cdFx0aWYgKHRoaXMueGhyW21vZGVsLmNpZF0pIHtcblx0XHRcdHRoaXMueGhyW21vZGVsLmNpZF0uYWJvcnQoKTtcblx0XHRcdHRoaXMuY3VycmVudGx5U2F2aW5nID0gZmFsc2U7XG5cblx0XHRcdC8vIFJldmVydCBhbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2RlbFxuXHRcdFx0aWYgKHRoaXMub2xkQXR0cmlidXRlcylcblx0XHRcdFx0dGhpcy5tb2RlbC5zZXQodGhpcy5vbGRBdHRyaWJ1dGVzLCB7IHZhbGlkYXRlOiBmYWxzZSB9KTtcblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuY3VycmVudGx5U2F2aW5nKSB7XG5cdFx0XHR0aGlzLmN1cnJlbnRseVNhdmluZyA9IGZhbHNlO1xuXHRcdFx0dGhpcy5zYXZlRmlsZXMoKTtcblx0XHR9XG5cdH0sXG5cblx0b25DYW5jZWxCdG5DbGljazogZnVuY3Rpb24oKSB7XG5cdFx0Xy5mb3JPd24odGhpcy54aHIsIHZhbHVlID0+IHtcblx0XHRcdGlmICh2YWx1ZSlcblx0XHRcdFx0dmFsdWUuYWJvcnQoKTtcblx0XHR9KTtcblx0XHR0aGlzLmRlc3Ryb3koKTtcblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdGNsZWFyVGltZW91dCh0aGlzLmxvY2tJbnRlcnZhbCk7XG5cdH0sXG5cblx0b25Qcm9ncmVzc0NoYW5nZTogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgcCA9IHRoaXMubW9kZWwuZ2V0KFwicHJvZ3Jlc3NcIik7XG5cblx0XHR0aGlzLnVpLmNvbXBsZXRpb25UaWNrLmFkZENsYXNzKFwiaGlkZVwiKTtcblxuXHRcdC8vIFNldCB0aGUgbmV3IFNWRyB2YWx1ZXNcblx0XHRpZiAocCA9PT0gbnVsbCkge1xuXHRcdFx0Ly8gTm8gdGFza3MgYXQgYWxsOyBubyBwcm9ncmVzcyBwb3NzaWJsZVxuXHRcdFx0dGhpcy51aS5kb3QuZ2V0KDApLnN0eWxlLmZpbGwgPSBcIiNERERcIjtcblx0XHRcdHRoaXMudWkuZG90LmdldCgwKS5zdHlsZS5zdHJva2UgPSBcIiNERERcIjtcblx0XHR9XG5cdFx0ZWxzZSBpZiAocCA9PT0gMCkge1xuXHRcdFx0dGhpcy51aS5kb3QuZ2V0KDApLnN0eWxlLmZpbGwgPSBcIiNGRkZcIjtcblx0XHRcdHRoaXMudWkuZG90LmdldCgwKS5zdHlsZS5zdHJva2UgPSBcIiMwMDBcIjtcblx0XHR9XG5cdFx0ZWxzZSBpZiAocCA9PT0gMTAwKSB7XG5cdFx0XHR0aGlzLnVpLmRvdC5nZXQoMCkuc3R5bGUuZmlsbCA9IFwicmdiKDk2LCAxNzAsIDg2KVwiO1xuXHRcdFx0dGhpcy51aS5kb3QuZ2V0KDApLnN0eWxlLnN0cm9rZSA9IFwicmdiKDk2LCAxNzAsIDg2KVwiO1xuXG5cdFx0XHR0aGlzLnVpLmNvbXBsZXRpb25UaWNrLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHQkKFwic3RvcDpudGgtY2hpbGQoMilcIiwgdGhpcy51aS5zdmdHcmFkaWVudCkuZ2V0KDApLnNldEF0dHJpYnV0ZShcIm9mZnNldFwiLCBwICsgXCIlXCIpO1xuXHRcdFx0JChcInN0b3A6bnRoLWNoaWxkKDMpXCIsIHRoaXMudWkuc3ZnR3JhZGllbnQpLmdldCgwKS5zZXRBdHRyaWJ1dGUoXCJvZmZzZXRcIiwgcCArIFwiJVwiKTtcblxuXHRcdFx0dGhpcy51aS5kb3QuZ2V0KDApLnN0eWxlLmZpbGwgPSBgdXJsKCNsZy0ke3RoaXMubW9kZWwuaWR9KWA7XG5cdFx0XHR0aGlzLnVpLmRvdC5nZXQoMCkuc3R5bGUuc3Ryb2tlID0gXCIjRkZCNjAwXCI7XG5cdFx0fVxuXHR9LFxuXG5cdG9uTm9kZUNsaWNrOiBmdW5jdGlvbihlKSB7XG5cdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRjb25zdCB1c2VyID0gZ2xvYmFsUmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblxuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcImVkaXRNb2RlXCIpIHx8ICFyZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmxlYXJuaW5nUGF0aHMuY2FuRWRpdCwgdXNlcikpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRpZiAoaXRlbURyYWdIaXQpIHtcblx0XHRcdGl0ZW1EcmFnSGl0ID0gZmFsc2U7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKG11bHRpc2VsZWN0IHx8IG1zU3RhdGUpXG5cdFx0XHRyZXR1cm4gbHBSYWRpby50cmlnZ2VyKEV2ZW50cy5Ob2RlU2VsZWN0T3ZlciwgdGhpcy5tb2RlbCwgIXRoaXMubW9kZWwuZ2V0KFwibXVsdGlzZWxlY3RpbmdcIikpO1xuXG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwic2VsZWN0ZWRcIikgfHwgZHJhZ2dpbmdSZXNvdXJjZSB8fCB0aGlzLm1vZGVsLmdldChcInNob3dEcm9wSW5kaWNhdG9yXCIpKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0aWYgKCF0aGlzLm1vZGVsLmdldChcInNlbGVjdGVkXCIpKSB7XG5cdFx0XHR0aGlzLm1vZGVsLnNldCh7IHNlbGVjdGVkOiB0cnVlIH0pO1xuXHRcdFx0bHBSYWRpby50cmlnZ2VyKEV2ZW50cy5Ob2RlU2VsZWN0ZWQsIHRoaXMubW9kZWwuaWQsIHRoaXMpO1xuXHRcdH1cblx0fSxcblxuXHRvbkxhc3ROb2RlQ2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJsYXN0Tm9kZVwiKSkge1xuXHRcdFx0aWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoKSB7XG5cdFx0XHRcdHRoaXMuY2hpbGRyZW4uZWFjaCh4ID0+IHguc2V0KHsgbGFzdE5vZGU6IGZhbHNlIH0pKTtcblx0XHRcdFx0dGhpcy5jaGlsZHJlbi5sYXN0KCkuc2V0KHsgbGFzdE5vZGU6IHRydWUgfSk7XG5cdFx0XHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKFwibGFzdC1ub2RlXCIpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHRoaXMuJGVsLmFkZENsYXNzKFwibGFzdC1ub2RlXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKFwibGFzdC1ub2RlXCIpO1xuXHRcdFx0dGhpcy5jaGlsZHJlbi5lYWNoKHggPT4geC5zZXQoeyBsYXN0Tm9kZTogZmFsc2UgfSkpO1xuXHRcdH1cblx0fSxcblxuXHRzdGFydE11bHRpc2VsZWN0OiBmdW5jdGlvbihlKSB7XG5cdFx0aWYgKGUud2hpY2ggIT09IDEpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRjb25zdCB1c2VyID0gZ2xvYmFsUmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblx0XHRpZiAoIXJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAubGVhcm5pbmdQYXRocy5jYW5FZGl0LCB1c2VyKSlcblx0XHRcdHJldHVybjtcblxuXHRcdGl0ZW1EcmFnSGl0ID0gZmFsc2U7XG5cblx0XHRjb25zdCB3aGl0ZWxpc3QgPSBbXCJsZWZ0LXNlY3Rpb25cIiwgXCJ0YWdzXCIsIFwiZGVzY3JpcHRpb24tY29udGFpbmVyXCIsIFwidHJlZS1jb250ZW50XCJdO1xuXHRcdGlmIChlLmN1cnJlbnRUYXJnZXQgIT09IGUudGFyZ2V0ICYmICFfLnNvbWUod2hpdGVsaXN0LCB4ID0+IGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyh4KSkpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0bHBSYWRpby50cmlnZ2VyKEV2ZW50cy5NdWx0aXNlbGVjdFN0YXJ0LCB0aGlzLm1vZGVsKTtcblx0fSxcblxuXHRvbk11bHRpU2VsZWN0aW5nQ2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJtdWx0aXNlbGVjdGluZ1wiKSkge1xuXHRcdFx0dGhpcy51aS5ub2RlLmFkZENsYXNzKFwibXVsdGlzZWxlY3RpbmdcIik7XG5cdFx0XHR0aGlzLnVpLmNoZWNrYm94LnByb3AoXCJjaGVja2VkXCIsIHRydWUpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMudWkubm9kZS5yZW1vdmVDbGFzcyhcIm11bHRpc2VsZWN0aW5nXCIpO1xuXHRcdFx0dGhpcy51aS5jaGVja2JveC5wcm9wKFwiY2hlY2tlZFwiLCBmYWxzZSk7XG5cdFx0fVxuXHR9LFxuXG5cdG5vZGVTZWxlY3RMaXN0ZW46IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkubm9kZS5vZmYoXCJtb3VzZW1vdmUubXVsdGlzZWxlY3RcIik7XG5cdFx0dGhpcy51aS5ub2RlLm9uKFwibW91c2Vtb3ZlLm11bHRpc2VsZWN0XCIsIGUgPT4ge1xuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdFx0aWYgKG1zU3RhdGUgPT09IDMpXG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0aXRlbURyYWdIaXQgPSB0aGlzLm1vZGVsLmlkO1xuXG5cdFx0XHRscFJhZGlvLnRyaWdnZXIoRXZlbnRzLk5vZGVTZWxlY3RPdmVyLCB0aGlzLm1vZGVsKTtcblx0XHR9KTtcblx0fSxcblxuXHRub2RlU2VsZWN0RW5kOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLm5vZGUub2ZmKFwibW91c2Vtb3ZlLm11bHRpc2VsZWN0XCIpO1xuXHR9LFxuXG5cdG9uQ2hlY2tib3hDbGljazogZnVuY3Rpb24oZSkge1xuXHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRscFJhZGlvLnRyaWdnZXIoRXZlbnRzLk5vZGVTZWxlY3RPdmVyLCB0aGlzLm1vZGVsLCB0aGlzLnVpLmNoZWNrYm94LnByb3AoXCJjaGVja2VkXCIpKTtcblx0fSxcblxuXHRvbkNoaWxkcmVuQ2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHQvLyBUaGlzIHdpbGwgdHlwaWNhbGx5IGhhcHBlbiB3aGVuIHRoZSBwYXJlbnQgbm9kZSBpcyByZWxvYWRlZCwgYW5kIHVwZGF0ZXMgdGhlIGNoaWxkIGVsZW1lbnRzXG5cdFx0Ly8gV2Ugd2FudCB0byBwcm9wYWdhdGUgdGhpcyBkb3dud2FyZHMuXG5cdFx0aWYgKCF0aGlzLm1vZGVsLmdldChcImNoaWxkcmVuXCIpKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0Y29uc3QgZGF0YXMgPSBfLmdyb3VwQnkoXy52YWx1ZXModGhpcy5tb2RlbC5nZXQoXCJjaGlsZHJlblwiKSB8fCBbXSksIHggPT4ge1xuXHRcdFx0aWYgKHguY2F0ZWdvcnkgPT09IFwibm9kZVwiKVxuXHRcdFx0XHRyZXR1cm4gXCJjaGlsZHJlblwiO1xuXG5cdFx0XHRpZiAoeC5pc1Rhc2spXG5cdFx0XHRcdHJldHVybiBcInRhc2tzXCI7XG5cblx0XHRcdHJldHVybiBcInJlc291cmNlc1wiO1xuXHRcdH0pO1xuXG5cdFx0Ly8gU28gd2Uga25vdyBpdCdzIGJlZW4gcHJvY2Vzc2VkXG5cdFx0dGhpcy5tb2RlbC5zZXQoeyBjaGlsZHJlbjogbnVsbCB9KTtcblxuXHRcdHRoaXMubW9kZWwuX2NoaWxkcmVuLnNldChkYXRhcy5jaGlsZHJlbiB8fCBbXSk7XG5cdFx0dGhpcy5tb2RlbC5fY2hpbGRyZW4uc29ydCgpO1xuXHRcdHRoaXMubW9kZWwuX3Jlc291cmNlcy5zZXQoZGF0YXMucmVzb3VyY2VzIHx8IFtdKTtcblx0XHR0aGlzLm1vZGVsLl9yZXNvdXJjZXMuc29ydCgpO1xuXHRcdHRoaXMubW9kZWwuX3Rhc2tzLnNldChkYXRhcy50YXNrcyB8fCBbXSk7XG5cdFx0dGhpcy5tb2RlbC5fdGFza3Muc29ydCgpO1xuXG5cdFx0Ly8gSWYgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgY2hpbGQsIGFkZCBhIGNsYXNzIHRvIGZpeCB0aGUgY29ubmVjdG9yIGxpbmVcblx0XHRpZiAodGhpcy5tb2RlbC5fY2hpbGRyZW4ubGVuZ3RoKVxuXHRcdFx0dGhpcy4kZWwuYWRkQ2xhc3MoXCJoYXMtY2hpbGRyZW5cIik7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy4kZWwucmVtb3ZlQ2xhc3MoXCJoYXMtY2hpbGRyZW5cIik7XG5cblx0XHR0aGlzLm9uTGFzdE5vZGVDaGFuZ2UoKTtcblx0fSxcblxuXHRvblBhcmVudExvY2tDaGFuZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMubW9kZWwuc2V0KHtcblx0XHRcdGxvY2tlZDogdGhpcy5tb2RlbC5nZXQoXCJwYXJlbnRMb2NrZWRcIiksXG5cdFx0XHRhY3RpdmF0aW9uRGF0ZTogdGhpcy5tb2RlbC5nZXQoXCJwYXJlbnRBY3RpdmF0aW9uXCIpLFxuXHRcdH0pO1xuXHR9LFxuXG5cdG9uUGFyZW50VmlzaWJsZUNoYW5nZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5tb2RlbC5zZXQoe1xuXHRcdFx0dmlzaWJsZTogdGhpcy5tb2RlbC5nZXQoXCJwYXJlbnRWaXNpYmxlXCIpLFxuXHRcdH0pO1xuXHR9LFxuXG5cdGVkaXRpbmdTdGFydDogZnVuY3Rpb24oaWQpIHtcblx0XHRpZiAoaWQgIT09IHRoaXMubW9kZWwuaWQpXG5cdFx0XHR0aGlzLnVpLmFkZENoaWxkTm9kZUJ0bi5hZGRDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0ZWRpdGluZ0VuZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5hZGRDaGlsZE5vZGVCdG4ucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdGJvZHlDbGlja0V2ZW50OiBmdW5jdGlvbihlKSB7XG5cdFx0aWYgKGUpXG5cdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0dGhpcy5tb2RlbC5zZXQoeyBzZWxlY3RlZDogZmFsc2UgfSk7XG5cdH0sXG5cblx0bm9kZVNlbGVjdGVkRXZlbnQ6IGZ1bmN0aW9uKGlkKSB7XG5cdFx0aWYgKGlkICE9PSB0aGlzLm1vZGVsLmlkKVxuXHRcdFx0dGhpcy5tb2RlbC5zZXQoeyBzZWxlY3RlZDogZmFsc2UgfSk7XG5cdH0sXG5cblx0b25FZGl0aW5nQ2hhbmdlOiBmdW5jdGlvbih0b2dnbGUpIHtcblx0XHRpZiAodG9nZ2xlKSB7XG5cdFx0XHR0aGlzLnVpLmFkZENoaWxkTm9kZUJ0bi5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLnVpLmRvdC5nZXQoMCkuY2xhc3NMaXN0LmFkZChcImhpZGVcIik7XG5cdFx0XHR0aGlzLnVpLmNvbXBsZXRpb25UaWNrLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLnVpLmFkZENoaWxkTm9kZUJ0bi5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHRpZiAoZWRpdFN0YXRlcy52aWV3TW9kZSlcblx0XHRcdFx0dGhpcy51aS5kb3QuZ2V0KDApLmNsYXNzTGlzdC5yZW1vdmUoXCJoaWRlXCIpO1xuXHRcdH1cblx0fSxcblxuXHRvblNlbGVjdGVkU3RhdHVzQ2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJzZWxlY3RlZFwiKSlcblx0XHRcdHRoaXMudWkubm9kZS5hZGRDbGFzcyhcInNlbGVjdGVkXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMudWkubm9kZS5yZW1vdmVDbGFzcyhcInNlbGVjdGVkXCIpO1xuXHR9LFxuXG5cdG9uRWRpdE1vZGVDaGFuZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghdGhpcy5tb2RlbC5pc05ldygpKVxuXHRcdFx0dGhpcy51aS5jb25uZWN0b3IucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwiZWRpdE1vZGVcIikpXG5cdFx0XHR0aGlzLnVpLm5vZGUuYWRkQ2xhc3MoXCJscC1ub2RlLWVkaXRcIik7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy51aS5ub2RlLnJlbW92ZUNsYXNzKFwibHAtbm9kZS1lZGl0XCIpO1xuXHR9LFxuXG5cdG9uU2hvd0Ryb3BJbmRpY2F0b3JDaGFuZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcInNob3dEcm9wSW5kaWNhdG9yXCIpKVxuXHRcdFx0dGhpcy51aS5kcm9wcGFibGUuYWRkQ2xhc3MoXCJzaG93XCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMudWkuZHJvcHBhYmxlLnJlbW92ZUNsYXNzKFwic2hvd1wiKTtcblx0fSxcblxuXHRvbkRyb3BDaGlsZENoYW5nZTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwiZHJvcENoaWxkXCIpKVxuXHRcdFx0dGhpcy51aS5kcm9wSW5kaWNhdG9yLmFkZENsYXNzKFwiY2hpbGRcIikucmVtb3ZlQ2xhc3MoXCJzaWJsaW5nXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMudWkuZHJvcEluZGljYXRvci5hZGRDbGFzcyhcInNpYmxpbmdcIikucmVtb3ZlQ2xhc3MoXCJjaGlsZFwiKTtcblx0fSxcblxuXHRvbkRyb3BQb3NpdGlvbkNoYW5nZTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwiZHJvcFBvc2l0aW9uXCIpID09PSBcImFib3ZlXCIpXG5cdFx0XHRyZXR1cm4gdGhpcy51aS5kcm9wSW5kaWNhdG9yLnBhcmVudCgpLmNzcyh7IHRvcDogXCIwXCIgfSkuaW5zZXJ0QmVmb3JlKHRoaXMudWkubm9kZSk7XG5cblx0XHRjb25zdCBoZWlnaHQgPSB0aGlzLnVpLm5vZGUub3V0ZXJIZWlnaHQodHJ1ZSk7XG5cdFx0dGhpcy51aS5kcm9wSW5kaWNhdG9yLnBhcmVudCgpLmNzcyh7IHRvcDogKGhlaWdodCArIDIwKSArIFwicHhcIiB9KS5pbnNlcnRBZnRlcih0aGlzLnVpLm5vZGUpO1xuXHR9LFxuXG5cdG9uRG90Q2xpY2s6IGZ1bmN0aW9uKGUpIHtcblx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwicHJvZ3Jlc3NcIikgPT09IG51bGwgfHwgdGhpcy5tb2RlbC5nZXQoXCJwcm9ncmVzc1wiKSA9PT0gMClcblx0XHRcdHJldHVybjtcblxuXHRcdGNvbnN0IG1vZGFsID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0d2FybmluZzogdHJ1ZSxcblx0XHRcdHRpdGxlOiBcIjxzcGFuIGNsYXNzPSdmYWwgZmEtc3luYy1hbHQnLz4gUmVzZXQgVXNlciBQcm9ncmVzc1wiLFxuXHRcdFx0Ym9keTogYFByb2dyZXNzIG9uIHRoaXMgaXRlbSBhbmQgYW55IHN1Yi1pdGVtcyB3aWxsIGJlIHJlc2V0IGZvciB0aGUgY2hvc2VuIGxlYXJuZXIuPGJyLz48YnIvPlxuXHRcdFx0XHRQcm92aWRlIGEgY29tbWVudCB0aGF0IHdpbGwgdGVsbCB0aGUgbGVhcm5lciB3aHkgcHJvZ3Jlc3Mgd2FzIHJlc2V0LjxpbnB1dCB0eXBlPSd0ZXh0JyBwbGFjZWhvbGRlcj0nQ29tbWVudCc+YCxcblx0XHRcdGhvc3Q6IFwiI2xpbmstcmVzb3VyY2VzXCIsXG5cdFx0fSk7XG5cblx0XHRtb2RhbC5vbihcImJ1dHRvbjpva1wiLCAoKSA9PiB7XG5cdFx0XHQvLyBSZXNldCB0aGUgc3RhdGUgZm9yIHRoZSBnaXZlbiBpdGVtIGFuZCBhbGwgY2hpbGRyZW5cblx0XHRcdCQuYWpheCh7XG5cdFx0XHRcdG1ldGhvZDogXCJQVVRcIixcblx0XHRcdFx0ZGF0YToge1xuXHRcdFx0XHRcdGNvbW1lbnQ6ICQoXCJpbnB1dFwiLCBtb2RhbC5lbCkudmFsKCksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHVybDogYCR7c2V0dGluZ3MudXJsUm9vdH0vYWNhY2lhL2xlYXJuaW5nUGF0aHMvaXRlbXMvJHt0aGlzLm1vZGVsLmlkfS9zdGF0ZS8ke3ZpZXdpbmdVc2VyfWAsXG5cdFx0XHRcdGVycm9yOiBlcnIgPT4gY29uc29sZS5lcnJvcihlcnIpLFxuXHRcdFx0XHRzdWNjZXNzOiBkYXRhID0+IHtcblx0XHRcdFx0XHRfLmVhY2goZGF0YSwgeCA9PiB0YXNrTWFwW3guX2lkXS5zZXQoeyBwcm9ncmVzczogMCB9KSk7XG5cdFx0XHRcdH0sXG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdG1vZGFsLnNob3coKTtcblx0fSxcblxuXHRvblNhdmVCZWdpbjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zaG93T3ZlcmxheShcInNhdmluZ1wiKTtcblx0fSxcblxuXHRvblNhdmVFbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuaGlkZU92ZXJsYXkoKTtcblx0fSxcblxuXHRvblNhdmVFcnJvcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5oaWRlT3ZlcmxheSgpO1xuXHR9LFxuXG5cdG9uTG9ja2VkQ2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIXRoaXMubW9kZWwuZ2V0KFwibG9ja2VkXCIpICYmICghdGhpcy5tb2RlbC5nZXQoXCJhY3RpdmF0aW9uRGF0ZVwiKSB8fCB0aGlzLm1vZGVsLmdldChcImFjdGl2YXRpb25EYXRlXCIpIDwgbW9tZW50KCkudW5peCgpKSkge1xuXHRcdFx0dGhpcy51aS5sb2NrZWRJY29uLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHRoaXMudWkuY29ubmVjdG9yLnJlbW92ZUNsYXNzKFwibG9ja2VkLWNvbm5lY3Rpb25cIik7XG5cdFx0XHR0aGlzLnVpLmxvY2tlZExpbmUuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMudWkubG9ja2VkSWNvbi5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLnVpLmNvbm5lY3Rvci5hZGRDbGFzcyhcImxvY2tlZC1jb25uZWN0aW9uXCIpO1xuXHRcdFx0dGhpcy51aS5sb2NrZWRMaW5lLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR9XG5cblx0XHQvLyBMb2NrIG9yIHVubG9jayBjaGlsZHJlbiBhcyB3ZWxsXG5cdFx0dGhpcy5jaGlsZHJlbi5lYWNoKHggPT4ge1xuXHRcdFx0eC5zZXQoe1xuXHRcdFx0XHRwYXJlbnRMb2NrZWQ6IHRoaXMubW9kZWwuZ2V0KFwibG9ja2VkXCIpIHx8IGZhbHNlLFxuXHRcdFx0XHRwYXJlbnRBY3RpdmF0aW9uOiB0aGlzLm1vZGVsLmdldChcImFjdGl2YXRpb25EYXRlXCIpIHx8IG51bGwsXG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdHRoaXMucmVzb3VyY2VzLmVhY2goeCA9PiB7XG5cdFx0XHR4LnNldCh7XG5cdFx0XHRcdHBhcmVudExvY2tlZDogdGhpcy5tb2RlbC5nZXQoXCJsb2NrZWRcIikgfHwgZmFsc2UsXG5cdFx0XHRcdHBhcmVudEFjdGl2YXRpb246IHRoaXMubW9kZWwuZ2V0KFwiYWN0aXZhdGlvbkRhdGVcIikgfHwgbnVsbCxcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy50YXNrcy5lYWNoKHggPT4ge1xuXHRcdFx0eC5zZXQoe1xuXHRcdFx0XHRwYXJlbnRMb2NrZWQ6IHRoaXMubW9kZWwuZ2V0KFwibG9ja2VkXCIpIHx8IGZhbHNlLFxuXHRcdFx0XHRwYXJlbnRBY3RpdmF0aW9uOiB0aGlzLm1vZGVsLmdldChcImFjdGl2YXRpb25EYXRlXCIpIHx8IG51bGwsXG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdHRoaXMuc2V0TG9ja0V4cGlyeSgpO1xuXHR9LFxuXG5cdG9uVmlzaWJsZUNoYW5nZTogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gU2hvdyBvciBoaWRlIGNoaWxkcmVuIGFzIHdlbGxcblx0XHR0aGlzLmNoaWxkcmVuLmVhY2goeCA9PiB7XG5cdFx0XHR4LnNldCh7XG5cdFx0XHRcdHBhcmVudFZpc2libGU6IEJvb2xlYW4odGhpcy5tb2RlbC5nZXQoXCJ2aXNpYmxlXCIpKSxcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5yZXNvdXJjZXMuZWFjaCh4ID0+IHtcblx0XHRcdHguc2V0KHtcblx0XHRcdFx0cGFyZW50VmlzaWJsZTogQm9vbGVhbih0aGlzLm1vZGVsLmdldChcInZpc2libGVcIikpLFxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLnRhc2tzLmVhY2goeCA9PiB7XG5cdFx0XHR4LnNldCh7XG5cdFx0XHRcdHBhcmVudFZpc2libGU6IEJvb2xlYW4odGhpcy5tb2RlbC5nZXQoXCJ2aXNpYmxlXCIpKSxcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9LFxuXG5cdHNldExvY2tFeHBpcnk6IGZ1bmN0aW9uKCkge1xuXHRcdGNsZWFyVGltZW91dCh0aGlzLmxvY2tJbnRlcnZhbCk7XG5cblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJhY3RpdmF0aW9uRGF0ZVwiKSA+IG1vbWVudCgpLnVuaXgoKSkge1xuXHRcdFx0Y29uc3Qgd2FpdCA9IHRoaXMubW9kZWwuZ2V0KFwiYWN0aXZhdGlvbkRhdGVcIikgLSBtb21lbnQoKS51bml4KCkgKyAyO1xuXG5cdFx0XHR0aGlzLmxvY2tJbnRlcnZhbCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLm9uTG9ja2VkQ2hhbmdlKCk7XG5cdFx0XHR9LCB3YWl0ICogMTAwMCk7XG5cdFx0fVxuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJjaGlsZHJlblwiKSAhPT0gbnVsbCkge1xuXHRcdFx0Y29uc3QgZGF0YXMgPSBfLmdyb3VwQnkoXy52YWx1ZXModGhpcy5tb2RlbC5nZXQoXCJjaGlsZHJlblwiKSB8fCBbXSksIHggPT4ge1xuXHRcdFx0XHRpZiAoeC5jYXRlZ29yeSA9PT0gXCJub2RlXCIpXG5cdFx0XHRcdFx0cmV0dXJuIFwiY2hpbGRyZW5cIjtcblxuXHRcdFx0XHRpZiAoeC5pc1Rhc2spXG5cdFx0XHRcdFx0cmV0dXJuIFwidGFza3NcIjtcblxuXHRcdFx0XHRyZXR1cm4gXCJyZXNvdXJjZXNcIjtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBTbyB3ZSBrbm93IGl0J3MgYmVlbiBwcm9jZXNzZWRcblx0XHRcdHRoaXMubW9kZWwuc2V0KHsgY2hpbGRyZW46IG51bGwgfSk7XG5cblx0XHRcdHRoaXMubW9kZWwuX2NoaWxkcmVuID0gbmV3IENoaWxkcmVuQ29sbGVjdGlvbihkYXRhcy5jaGlsZHJlbiB8fCBbXSk7XG5cblx0XHRcdHRoaXMubW9kZWwuX3Jlc291cmNlcyA9IG5ldyBSZXNvdXJjZUNvbGxlY3Rpb24oZGF0YXMucmVzb3VyY2VzIHx8IFtdLCB7IHRhc2tzOiBmYWxzZSB9KTtcblx0XHRcdHRoaXMubW9kZWwuX3Rhc2tzID0gbmV3IFJlc291cmNlQ29sbGVjdGlvbihkYXRhcy50YXNrcyB8fCBbXSwgeyB0YXNrczogdHJ1ZSB9KTtcblx0XHR9XG5cblx0XHR0aGlzLmNoaWxkcmVuID0gdGhpcy5tb2RlbC5fY2hpbGRyZW47XG5cdFx0dGhpcy5yZXNvdXJjZXMgPSB0aGlzLm1vZGVsLl9yZXNvdXJjZXM7XG5cdFx0dGhpcy50YXNrcyA9IHRoaXMubW9kZWwuX3Rhc2tzO1xuXG5cdFx0dGhpcy5jaGlsZHJlbi5lYWNoKHggPT4ge1xuXHRcdFx0bW9kZWxNYXBbeC5pZF0gPSB4O1xuXG5cdFx0XHRfLmVhY2goeC5nZXQoXCJncm91cHNcIiksIHkgPT4ge1xuXHRcdFx0XHRpZiAoISh5IGluIGdyb3VwTWFwKSlcblx0XHRcdFx0XHRncm91cE1hcFt5XSA9IFtdO1xuXHRcdFx0XHRncm91cE1hcFt5XS5zcGxpY2UoXy5zb3J0ZWRJbmRleEJ5KGdyb3VwTWFwW3ldLCB4LCB6ID0+IHouaWQpLCAwLCB4KTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy50YXNrcy5lYWNoKHggPT4ge1xuXHRcdFx0dGFza01hcFt4LmlkXSA9IHg7XG5cblx0XHRcdF8uZWFjaCh4LmdldChcImdyb3Vwc1wiKSwgeSA9PiB7XG5cdFx0XHRcdGlmICghKHkgaW4gZ3JvdXBNYXApKVxuXHRcdFx0XHRcdGdyb3VwTWFwW3ldID0gW107XG5cdFx0XHRcdGdyb3VwTWFwW3ldLnNwbGljZShfLnNvcnRlZEluZGV4QnkoZ3JvdXBNYXBbeV0sIHgsIHogPT4gei5pZCksIDAsIHgpO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLnJlc291cmNlcy5lYWNoKHggPT4ge1xuXHRcdFx0bW9kZWxNYXBbeC5pZF0gPSB4O1xuXG5cdFx0XHRfLmVhY2goeC5nZXQoXCJncm91cHNcIiksIHkgPT4ge1xuXHRcdFx0XHRpZiAoISh5IGluIGdyb3VwTWFwKSlcblx0XHRcdFx0XHRncm91cE1hcFt5XSA9IFtdO1xuXHRcdFx0XHRncm91cE1hcFt5XS5zcGxpY2UoXy5zb3J0ZWRJbmRleEJ5KGdyb3VwTWFwW3ldLCB4LCB6ID0+IHouaWQpLCAwLCB4KTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5jaGlsZHJlbi5vbihcImFkZCByZW1vdmVcIiwgbm9kZSA9PiB7XG5cdFx0XHRpZiAobm9kZS5pZCBpbiBtb2RlbE1hcCkge1xuXHRcdFx0XHRkZWxldGUgbW9kZWxNYXBbbm9kZS5pZF07XG5cblx0XHRcdFx0Xy5lYWNoKG5vZGUuZ2V0KFwiZ3JvdXBzXCIpLCB4ID0+IHtcblx0XHRcdFx0XHRpZiAoISh4IGluIGdyb3VwTWFwKSlcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdGNvbnN0IGkgPSBfLnNvcnRlZEluZGV4QnkoZ3JvdXBNYXBbeF0sIG5vZGUsIHogPT4gei5pZCk7XG5cdFx0XHRcdFx0aWYgKGkgPiAwIHx8IGdyb3VwTWFwW3hdWzBdLmlkID09PSBub2RlLmlkKVxuXHRcdFx0XHRcdFx0Z3JvdXBNYXBbeF0uc3BsaWNlKE1hdGgubWF4KDAsIGkpLCAxKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0bW9kZWxNYXBbbm9kZS5pZF0gPSBub2RlO1xuXG5cdFx0XHRcdF8uZWFjaChub2RlLmdldChcImdyb3Vwc1wiKSwgeSA9PiB7XG5cdFx0XHRcdFx0aWYgKCEoeSBpbiBncm91cE1hcCkpXG5cdFx0XHRcdFx0XHRncm91cE1hcFt5XSA9IFtdO1xuXHRcdFx0XHRcdGdyb3VwTWFwW3ldLnNwbGljZShfLnNvcnRlZEluZGV4QnkoZ3JvdXBNYXBbeV0sIG5vZGUsIHogPT4gei5pZCksIDAsIG5vZGUpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoKVxuXHRcdFx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcImhhcy1jaGlsZHJlblwiKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy4kZWwucmVtb3ZlQ2xhc3MoXCJoYXMtY2hpbGRyZW5cIik7XG5cblx0XHRcdGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCkge1xuXHRcdFx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJkZXB0aFwiKSA9PT0gMSB8fCB0aGlzLm1vZGVsLmdldChcImxhc3ROb2RlXCIpIHx8IHRoaXMuY2hpbGRyZW4uc29tZSh4ID0+IHguZ2V0KFwibGFzdE5vZGVcIikpKSB7XG5cdFx0XHRcdFx0dGhpcy5jaGlsZHJlbi5lYWNoKHggPT4geC5zZXQoeyBsYXN0Tm9kZTogZmFsc2UgfSkpO1xuXHRcdFx0XHRcdHRoaXMuY2hpbGRyZW4ubGFzdCgpLnNldCh7IGxhc3ROb2RlOiB0cnVlIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmIChub2RlICYmIG5vZGUuZ2V0KFwibGFzdE5vZGVcIikpIHtcblx0XHRcdFx0Ly8gV2UgcmVtb3ZlZCB0aGUgb25seSBjaGlsZCwgc28gd2UncmUgbm93IHRoZSBsYXN0IG5vZGVcblx0XHRcdFx0dGhpcy5tb2RlbC5zZXQoeyBsYXN0Tm9kZTogdHJ1ZSB9KTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHRoaXMucmVzb3VyY2VzLm9uKFwiYWRkIHJlbW92ZVwiLCBub2RlID0+IHtcblx0XHRcdGlmIChub2RlLmlkIGluIG1vZGVsTWFwKSB7XG5cdFx0XHRcdGRlbGV0ZSBtb2RlbE1hcFtub2RlLmlkXTtcblxuXHRcdFx0XHRfLmVhY2gobm9kZS5nZXQoXCJncm91cHNcIiksIHggPT4ge1xuXHRcdFx0XHRcdGlmICghKHggaW4gZ3JvdXBNYXApKVxuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0Y29uc3QgaSA9IF8uc29ydGVkSW5kZXhCeShncm91cE1hcFt4XSwgbm9kZSwgeiA9PiB6LmlkKTtcblx0XHRcdFx0XHRpZiAoaSA+IDAgfHwgZ3JvdXBNYXBbeF1bMF0uaWQgPT09IG5vZGUuaWQpXG5cdFx0XHRcdFx0XHRncm91cE1hcFt4XS5zcGxpY2UoTWF0aC5tYXgoMCwgaSksIDEpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRtb2RlbE1hcFtub2RlLmlkXSA9IG5vZGU7XG5cblx0XHRcdFx0Xy5lYWNoKG5vZGUuZ2V0KFwiZ3JvdXBzXCIpLCB5ID0+IHtcblx0XHRcdFx0XHRpZiAoISh5IGluIGdyb3VwTWFwKSlcblx0XHRcdFx0XHRcdGdyb3VwTWFwW3ldID0gW107XG5cdFx0XHRcdFx0Z3JvdXBNYXBbeV0uc3BsaWNlKF8uc29ydGVkSW5kZXhCeShncm91cE1hcFt5XSwgbm9kZSwgeiA9PiB6LmlkKSwgMCwgbm9kZSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0dGhpcy50YXNrcy5vbihcImFkZCByZW1vdmVcIiwgbm9kZSA9PiB7XG5cdFx0XHRpZiAobm9kZS5pZCBpbiB0YXNrTWFwKSB7XG5cdFx0XHRcdGRlbGV0ZSB0YXNrTWFwW25vZGUuaWRdO1xuXG5cdFx0XHRcdF8uZWFjaChub2RlLmdldChcImdyb3Vwc1wiKSwgeCA9PiB7XG5cdFx0XHRcdFx0aWYgKCEoeCBpbiBncm91cE1hcCkpXG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHRjb25zdCBpID0gXy5zb3J0ZWRJbmRleEJ5KGdyb3VwTWFwW3hdLCBub2RlLCB6ID0+IHouaWQpO1xuXHRcdFx0XHRcdGlmIChpID4gMCB8fCBncm91cE1hcFt4XVswXS5pZCA9PT0gbm9kZS5pZClcblx0XHRcdFx0XHRcdGdyb3VwTWFwW3hdLnNwbGljZShNYXRoLm1heCgwLCBpKSwgMSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHRhc2tNYXBbbm9kZS5pZF0gPSBub2RlO1xuXG5cdFx0XHRcdF8uZWFjaChub2RlLmdldChcImdyb3Vwc1wiKSwgeSA9PiB7XG5cdFx0XHRcdFx0aWYgKCEoeSBpbiBncm91cE1hcCkpXG5cdFx0XHRcdFx0XHRncm91cE1hcFt5XSA9IFtdO1xuXHRcdFx0XHRcdGdyb3VwTWFwW3ldLnNwbGljZShfLnNvcnRlZEluZGV4QnkoZ3JvdXBNYXBbeV0sIG5vZGUsIHogPT4gei5pZCksIDAsIG5vZGUpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGNvbnN0IHByb2dyZXNzQ2hhbmdlID0geCA9PiB7XG5cdFx0XHQvLyBDaGlsZCBwcm9ncmVzcyBjaGFuZ2VkOyB1cGRhdGUgbG9jYWwgcHJvZ3Jlc3Ncblx0XHRcdGlmICghdGhpcy5wcm9ncmVzc0NhY2hlKVxuXHRcdFx0XHR0aGlzLnByb2dyZXNzQ2FjaGUgPSB7fTtcblxuXHRcdFx0dGhpcy5wcm9ncmVzc0NhY2hlW3guaWRdID0geC5nZXQoXCJwcm9ncmVzc1wiKTtcblxuXHRcdFx0Ly8gUmVjYWxjdWxhdGUgbG9jYWwgcHJvZ3Jlc3Ncblx0XHRcdGNvbnN0IHAgPSBfLnJlZHVjZSh0aGlzLnByb2dyZXNzQ2FjaGUsIChzdW0sIG51bSkgPT4ge1xuXHRcdFx0XHRpZiAoc3VtID09PSBudWxsICYmIG51bSA9PT0gbnVsbClcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0cmV0dXJuIChzdW0gfHwgMCkgKyAobnVtIHx8IDApO1xuXHRcdFx0fSwgbnVsbCk7XG5cblx0XHRcdHRoaXMubW9kZWwuc2V0KHsgcHJvZ3Jlc3M6IHAgPT09IG51bGwgPyBudWxsIDogTWF0aC5jZWlsKHAgLyBfLmtleXModGhpcy5wcm9ncmVzc0NhY2hlKS5sZW5ndGgpIH0pO1xuXHRcdH07XG5cblx0XHR0aGlzLmNoaWxkcmVuLm9uKFwiY2hhbmdlOnByb2dyZXNzXCIsIHByb2dyZXNzQ2hhbmdlKTtcblx0XHR0aGlzLnRhc2tzLm9uKFwiY2hhbmdlOnByb2dyZXNzXCIsIHByb2dyZXNzQ2hhbmdlKTtcblxuXHRcdGlmICh0aGlzLnRhc2tzLmxlbmd0aCA9PT0gMCAmJiBlZGl0U3RhdGVzLnZpZXdNb2RlKVxuXHRcdFx0dGhpcy5tb2RlbC5zZXQoeyBwcm9ncmVzczogbnVsbCB9KTtcblxuXHRcdC8vIElmIHdlIGhhdmUgYXQgbGVhc3Qgb25lIGNoaWxkLCBhZGQgYSBjbGFzcyB0byBmaXggdGhlIGNvbm5lY3RvciBsaW5lXG5cdFx0aWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoKVxuXHRcdFx0dGhpcy4kZWwuYWRkQ2xhc3MoXCJoYXMtY2hpbGRyZW5cIik7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy4kZWwucmVtb3ZlQ2xhc3MoXCJoYXMtY2hpbGRyZW5cIik7XG5cblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJjb250ZW50XCIsIG5ldyBUcmVlQ29udGVudCh7IG1vZGVsOiB0aGlzLm1vZGVsIH0pKTtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJ0YXNrc1wiLCBuZXcgUmVzb3VyY2VzVmlldyh7IGNvbGxlY3Rpb246IHRoaXMudGFza3MsIG1vZGVsOiB0aGlzLm1vZGVsIH0pKTtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJyZXNvdXJjZXNcIiwgbmV3IFJlc291cmNlc1ZpZXcoeyBjb2xsZWN0aW9uOiB0aGlzLnJlc291cmNlcywgbW9kZWw6IHRoaXMubW9kZWwgfSkpO1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImNoaWxkcmVuXCIsIG5ldyBUcmVlVmlldyh7IGNvbGxlY3Rpb246IHRoaXMuY2hpbGRyZW4sIG1vZGVsOiB0aGlzLm1vZGVsIH0pKTtcblxuXHRcdGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCAmJiB0aGlzLm1vZGVsLmdldChcImRlcHRoXCIpID09PSAxKVxuXHRcdFx0dGhpcy5jaGlsZHJlbi5sYXN0KCkuc2V0KHsgbGFzdE5vZGU6IHRydWUgfSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHRoaXMucmVzb3VyY2VzLCBcInVwZGF0ZVwiLCB0aGlzLmNoZWNrQXR0YWNobWVudENvbnRhaW5lcnMpO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy50YXNrcywgXCJ1cGRhdGVcIiwgdGhpcy5jaGVja0F0dGFjaG1lbnRDb250YWluZXJzKTtcblxuXHRcdGlmICghdGhpcy5tb2RlbC5pc05ldygpICYmIHRoaXMuY2hpbGRyZW4ubGVuZ3RoKSB7XG5cdFx0XHQvLyBVcGRhdGUgYWxsIGNoaWxkcmVuXG5cdFx0XHRjb25zdCBkID0gdGhpcy5tb2RlbC5nZXQoXCJkZXB0aFwiKTtcblx0XHRcdF8uZWFjaCh0aGlzLmNoaWxkcmVuLm1vZGVscywgeCA9PiB7XG5cdFx0XHRcdHguc2V0KHsgZGVwdGg6IGQgKyAxIH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5vbkVkaXRpbmdDaGFuZ2UoY2FuRWRpdCgpKTtcblxuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcImVkaXRNb2RlXCIpKSB7XG5cdFx0XHR0aGlzLnVpLm5vZGUuYWRkQ2xhc3MoXCJscC1ub2RlLWVkaXRcIik7XG5cdFx0XHR0aGlzLnVpLm5vZGVBdHRhY2htZW50cy5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKCF0aGlzLm1vZGVsLmlzTmV3KCkpIHtcblx0XHRcdC8vdGhpcy51aS5kb3QuZ2V0KDApLmNsYXNzTGlzdC5yZW1vdmUoXCJoaWRlXCIpO1xuXHRcdFx0dGhpcy51aS5jb25uZWN0b3IucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblxuXHRcdC8vIFJlcG9zaXRpb24gc29tZSBpdGVtcyBiYXNlZCBvbiB0aGUgZGVwdGhcblx0XHRjb25zdCBkID0gdGhpcy5tb2RlbC5nZXQoXCJkZXB0aFwiKTtcblx0XHR0aGlzLnVpLmNvbm5lY3Rvci5jc3MoeyBsZWZ0OiBgLSR7MzAgKyAoKGQgLSAxKSAqIDMwKX1weGAgfSk7XG5cdFx0dGhpcy51aS5sb2NrZWRJY29uLmNzcyh7IGxlZnQ6IGAtJHszMyArICgoZCAtIDEpICogMzApfXB4YCB9KTtcblx0XHR0aGlzLnVpLmxvY2tlZExpbmUuY3NzKHsgbGVmdDogYC0kezIyICsgKChkIC0gMSkgKiAzMCl9cHhgIH0pO1xuXHRcdHRoaXMudWkuc2lkZUxpbmUuY3NzKHsgbGVmdDogYC0kezIyICsgKChkIC0gMSkgKiAzMCl9cHhgIH0pO1xuXHRcdHRoaXMudWkuZG90LmNzcyh7IGxlZnQ6IGAtJHszNSArICgoZCAtIDEpICogMzApfXB4YCB9KTtcblx0XHR0aGlzLnVpLmNvbXBsZXRpb25UaWNrLmNzcyh7IGxlZnQ6IGAtJHsyNyArICgoZCAtIDEpICogMzApfXB4YCB9KTtcblx0XHR0aGlzLnVpLmNoZWNrYm94Q29udGFpbmVyLmNzcyh7IGxlZnQ6IGAtJHsyNyArICgoZCAtIDEpICogMzApfXB4YCB9KTtcblxuXHRcdHRoaXMuY2hlY2tBdHRhY2htZW50Q29udGFpbmVycygpO1xuXHRcdHRoaXMuc2V0TG9ja0V4cGlyeSgpO1xuXHR9LFxuXG5cdG9uQXR0YWNoOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5pc05ldygpKVxuXHRcdFx0dGhpcy4kZWwuZ2V0KDApLnNjcm9sbEludG9WaWV3KCk7XG5cblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJlZGl0TW9kZVwiKSkge1xuXHRcdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiZWRpdFwiLCBuZXcgVHJlZUVkaXQoeyBtb2RlbDogdGhpcy5tb2RlbCB9KSk7XG5cdFx0XHR0aGlzLnN0YXJ0Tm9kZUVkaXQoKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRscFJhZGlvLnRyaWdnZXIoRXZlbnRzLlZpZXdVc2VyQ2hhbmdlKTtcblx0XHR9XG5cdH0sXG5cblx0b25Eb21SZWZyZXNoOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNldEJyYWluVGlwcHkoKTtcblx0fSxcblxuXHRzdGFydE5vZGVFZGl0OiBmdW5jdGlvbihlKSB7XG5cdFx0aWYgKGUpXG5cdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiZWRpdFwiLCBuZXcgVHJlZUVkaXQoeyBtb2RlbDogdGhpcy5tb2RlbCB9KSk7XG5cblx0XHR0aGlzLnVpLmNvbnRlbnRBcmVhLnNsaWRlVXAoKTtcblx0XHR0aGlzLnVpLmVkaXRBcmVhLnNsaWRlRG93big0MDApO1xuXG5cdFx0dGhpcy5tb2RlbC5zZXQoeyBzZWxlY3RlZDogZmFsc2UsIGVkaXRNb2RlOiB0cnVlIH0pO1xuXHRcdC8vIFVuc2VsZWN0IGFueSBzZWxlY3RlZCBub2Rlc1xuXHRcdGxwUmFkaW8udHJpZ2dlcihFdmVudHMuTm9kZVNlbGVjdGVkLCAwKTtcblx0XHRjdXJyZW50RWRpdE1vZGVsSWQgPSB0aGlzLm1vZGVsLmlkO1xuXHRcdGxwUmFkaW8udHJpZ2dlcihFdmVudHMuRWRpdGluZ1N0YXJ0ZWQsIHRoaXMubW9kZWwuaWQpO1xuXHR9LFxuXG5cdGNoZWNrQXR0YWNobWVudENvbnRhaW5lcnM6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghdGhpcy51aS5mYWtlVGFzay5hZGRDbGFzcylcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMudWkuZmFrZVRhc2suYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkuZmFrZVJlc291cmNlLmFkZENsYXNzKFwiaGlkZVwiKTtcblxuXHRcdGlmICh0aGlzLnRhc2tzLmxlbmd0aCkge1xuXHRcdFx0dGhpcy51aS50YXNrc0NvbnRhaW5lci5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLnVpLnRhc2tzVGl0bGUucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMudWkudGFza3NDb250YWluZXIuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0dGhpcy51aS50YXNrc1RpdGxlLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5yZXNvdXJjZXMubGVuZ3RoKSB7XG5cdFx0XHR0aGlzLnVpLnJlc291cmNlc0NvbnRhaW5lci5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLnVpLnJlc291cmNlc1RpdGxlLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLnVpLnJlc291cmNlc0NvbnRhaW5lci5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLnVpLnJlc291cmNlc1RpdGxlLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR9XG5cdH0sXG5cblx0Y2FuY2VsTm9kZUVkaXQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMubW9kZWwuc2V0KHsgZWRpdE1vZGU6IGZhbHNlIH0pO1xuXHRcdHRoaXMudWkuZWRpdEFyZWEuc2xpZGVVcCg0MDApO1xuXHRcdHRoaXMudWkuY29udGVudEFyZWEuc2xpZGVEb3duKCk7XG5cdFx0dGhpcy51aS5ub2RlQXR0YWNobWVudHMucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdGNvbXBsZXRlTm9kZUVkaXQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMubW9kZWwuc2V0KHsgZWRpdE1vZGU6IGZhbHNlIH0pO1xuXG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiY29udGVudFwiLCBuZXcgVHJlZUNvbnRlbnQoeyBtb2RlbDogdGhpcy5tb2RlbCB9KSk7XG5cblx0XHR0aGlzLnVpLmVkaXRBcmVhLnNsaWRlVXAoNDAwKTtcblx0XHR0aGlzLnVpLmNvbnRlbnRBcmVhLnNsaWRlRG93bigpO1xuXG5cdFx0dGhpcy51aS5ub2RlQXR0YWNobWVudHMucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0dGhpcy5zZXRCcmFpblRpcHB5KCk7XG5cdH0sXG5cblx0Y29sbGFwc2VOb2RlOiBmdW5jdGlvbihjb2xsYXBzZSkge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcblx0XHRcdGlmICghY2FuRWRpdCgpICYmICFlZGl0U3RhdGVzLnZpZXdNb2RlKVxuXHRcdFx0XHRyZXR1cm4gcmVzb2x2ZSgpO1xuXG5cdFx0XHRjb25zdCBvcHRzID0ge307XG5cblx0XHRcdC8vIElmIGxvY2tlZCBpcyBzZXRcblx0XHRcdGlmICh0aGlzLm1vZGVsLmdldChcImxvY2tlZFwiKSB8fCAoIXRoaXMubW9kZWwuZ2V0KFwibG9ja2VkXCIpICYmIHRoaXMubW9kZWwuZ2V0KFwiYWN0aXZhdGlvbkRhdGVcIikgJiYgdGhpcy5tb2RlbC5nZXQoXCJhY3RpdmF0aW9uRGF0ZVwiKSA8IG1vbWVudCgpLnVuaXgoKSkpXG5cdFx0XHRcdG9wdHMuYWN0aXZhdGlvbkRhdGUgPSBudWxsO1xuXG5cdFx0XHRpZiAoY29sbGFwc2UgJiYgIXRoaXMubW9kZWwuZ2V0KFwiaXNDb2xsYXBzZWRcIikpIHtcblx0XHRcdFx0b3B0cy5pc0NvbGxhcHNlZCA9IHRydWU7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXMubW9kZWwuc2F2ZShvcHRzLCB7XG5cdFx0XHRcdFx0cGF0Y2g6IHRydWUsXG5cdFx0XHRcdFx0d2FpdDogdHJ1ZSxcblx0XHRcdFx0XHRzdWNjZXNzOiAoKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnVpLm5vZGVBdHRhY2htZW50cy5zbGlkZVVwKDQwMCk7XG5cdFx0XHRcdFx0XHQkKFwiLm5vZGUtYm9keS1jb250YWluZXJcIiwgdGhpcy5lbCkuc2xpZGVVcCg0MDApO1xuXHRcdFx0XHRcdFx0dGhpcy51aS5jaGlsZE5vZGVzQ29udGFpbmVyLnNsaWRlVXAoNDAwKTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UuZGVsYXkoNDUwKS50aGVuKCgpID0+IHJlc29sdmUoKSk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmICghY29sbGFwc2UgJiYgdGhpcy5tb2RlbC5nZXQoXCJpc0NvbGxhcHNlZFwiKSkge1xuXHRcdFx0XHRvcHRzLmlzQ29sbGFwc2VkID0gZmFsc2U7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXMubW9kZWwuc2F2ZShvcHRzLCB7XG5cdFx0XHRcdFx0cGF0Y2g6IHRydWUsXG5cdFx0XHRcdFx0d2FpdDogdHJ1ZSxcblx0XHRcdFx0XHRzdWNjZXNzOiAoKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnVpLm5vZGVBdHRhY2htZW50cy5zbGlkZURvd24oNDAwKTtcblx0XHRcdFx0XHRcdCQoXCIubm9kZS1ib2R5LWNvbnRhaW5lclwiLCB0aGlzLmVsKS5zbGlkZURvd24oNDAwKTtcblx0XHRcdFx0XHRcdHRoaXMudWkuY2hpbGROb2Rlc0NvbnRhaW5lci5zbGlkZURvd24oNDAwKTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIFByb21pc2UuZGVsYXkoNDUwKS50aGVuKCgpID0+IHJlc29sdmUoKSk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdHJlc29sdmUoKTtcblx0XHR9KTtcblx0fSxcblxuXHRyZWxvYWROb2RlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm1vZGVsLmZldGNoKHtcblx0XHRcdHN1Y2Nlc3M6ICgpID0+IHtcblx0XHRcdFx0Y29uc3QgZGF0YXMgPSBfLmdyb3VwQnkoXy52YWx1ZXModGhpcy5tb2RlbC5nZXQoXCJpdGVtc1wiKSB8fCBbXSksIHggPT4ge1xuXHRcdFx0XHRcdGlmICh4LmNhdGVnb3J5ID09PSBcIm5vZGVcIilcblx0XHRcdFx0XHRcdHJldHVybiBcImNoaWxkcmVuXCI7XG5cblx0XHRcdFx0XHRpZiAoeC5pc1Rhc2spXG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJ0YXNrc1wiO1xuXG5cdFx0XHRcdFx0cmV0dXJuIFwicmVzb3VyY2VzXCI7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdC8vIFNvIHdlIGtub3cgaXQncyBiZWVuIHByb2Nlc3NlZFxuXHRcdFx0XHR0aGlzLm1vZGVsLnNldCh7IGNoaWxkcmVuOiBudWxsIH0pO1xuXG5cdFx0XHRcdHRoaXMubW9kZWwuX2NoaWxkcmVuLnNldChkYXRhcy5jaGlsZHJlbiB8fCBbXSk7XG5cdFx0XHRcdHRoaXMubW9kZWwuX2NoaWxkcmVuLnNvcnQoKTtcblx0XHRcdFx0dGhpcy5tb2RlbC5fcmVzb3VyY2VzLnNldChkYXRhcy5yZXNvdXJjZXMgfHwgW10pO1xuXHRcdFx0XHR0aGlzLm1vZGVsLl9yZXNvdXJjZXMuc29ydCgpO1xuXHRcdFx0XHR0aGlzLm1vZGVsLl90YXNrcy5zZXQoZGF0YXMudGFza3MgfHwgW10pO1xuXHRcdFx0XHR0aGlzLm1vZGVsLl90YXNrcy5zb3J0KCk7XG5cblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgY2hpbGQsIGFkZCBhIGNsYXNzIHRvIGZpeCB0aGUgY29ubmVjdG9yIGxpbmVcblx0XHRcdFx0aWYgKHRoaXMubW9kZWwuX2NoaWxkcmVuLmxlbmd0aClcblx0XHRcdFx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcImhhcy1jaGlsZHJlblwiKTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKFwiaGFzLWNoaWxkcmVuXCIpO1xuXG5cdFx0XHRcdHRoaXMub25MYXN0Tm9kZUNoYW5nZSgpO1xuXG5cdFx0XHRcdGxwUmFkaW8udHJpZ2dlcihFdmVudHMuTm9kZUNoYW5nZSk7XG5cdFx0XHR9LFxuXHRcdFx0ZXJyb3I6IChtb2RlbCwgcmVzcG9uc2UpID0+IHtcblx0XHRcdFx0dGhpcy5zaG93RXJyb3IocmVzcG9uc2UpO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fSxcblxuXHRyZW1vdmVDaGlsZE5vZGU6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5FdmVudHMuQXR0YWNobWVudFJlbW92ZWQsIHRoaXMubW9kZWwpO1xuXHRcdHRoaXMuY2hpbGRyZW4ucmVtb3ZlKG1vZGVsKTtcblx0fSxcblxuXHRyZW1vdmVDaGlsZENvbnRlbnQ6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0dGhpcy50YXNrcy5yZW1vdmUobW9kZWwpO1xuXHRcdHRoaXMucmVzb3VyY2VzLnJlbW92ZShtb2RlbCk7XG5cdH0sXG5cblx0b25EZXB0aENoYW5nZTogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gUmVwb3NpdGlvbiBzb21lIGl0ZW1zIGJhc2VkIG9uIHRoZSBkZXB0aFxuXHRcdGNvbnN0IGQgPSB0aGlzLm1vZGVsLmdldChcImRlcHRoXCIpO1xuXHRcdHRoaXMudWkuY29ubmVjdG9yLmNzcyh7IGxlZnQ6IGAtJHszMCArICgoZCAtIDEpICogMzApfXB4YCB9KTtcblx0XHR0aGlzLnVpLmxvY2tlZEljb24uY3NzKHsgbGVmdDogYC0kezMzICsgKChkIC0gMSkgKiAzMCl9cHhgIH0pO1xuXHRcdHRoaXMudWkubG9ja2VkTGluZS5jc3MoeyBsZWZ0OiBgLSR7MjIgKyAoKGQgLSAxKSAqIDMwKX1weGAgfSk7XG5cdFx0dGhpcy51aS5zaWRlTGluZS5jc3MoeyBsZWZ0OiBgLSR7MjIgKyAoKGQgLSAxKSAqIDMwKX1weGAgfSk7XG5cdFx0dGhpcy51aS5jaGVja2JveENvbnRhaW5lci5jc3MoeyBsZWZ0OiBgLSR7MjcgKyAoKGQgLSAxKSAqIDMwKX1weGAgfSk7XG5cblx0XHQvLyBVcGRhdGUgYWxsIGNoaWxkcmVuXG5cdFx0Xy5lYWNoKHRoaXMuY2hpbGRyZW4ubW9kZWxzLCB4ID0+IHtcblx0XHRcdHguc2V0KHsgZGVwdGg6IGQgKyAxIH0pO1xuXHRcdH0pO1xuXHR9LFxuXG5cdG9uVGFza0RyYWdEcm9wOiBmdW5jdGlvbihldnQpIHtcblx0XHRpZiAoZHJhZ2dpbmdSZXNvdXJjZSlcblx0XHRcdHRoaXMub25Db250ZW50RHJvcChldnQsIHRydWUpO1xuXHR9LFxuXG5cdG9uUmVzb3VyY2VEcmFnRHJvcDogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0aWYgKGRyYWdnaW5nUmVzb3VyY2UpXG5cdFx0XHR0aGlzLm9uQ29udGVudERyb3AoZXZ0LCBmYWxzZSk7XG5cdH0sXG5cblx0b25Db250ZW50RHJvcDogZnVuY3Rpb24oZXZ0LCB0YXNrKSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0aWYgKHRoaXMubW9kZWwuaXNOZXcoKSlcblx0XHRcdHJldHVybjtcblxuXHRcdCQoXCJkaXYucmVzb3VyY2VcIikucmVtb3ZlQ2xhc3MoXCJkcm9wLWFib3ZlIGRyb3AtYmVsb3dcIik7XG5cblx0XHRjb25zdCBmaW5hbGl6ZURyb3AgPSAoKSA9PiB7XG5cdFx0XHRjb25zdCBtb3ZlID0gXCJwYXRoXCIgaW4gZHJhZ2dpbmdSZXNvdXJjZTtcblxuXHRcdFx0bGV0IHJlcyA9IGRyYWdnaW5nUmVzb3VyY2U7XG5cdFx0XHRpZiAoIW1vdmUpIHtcblx0XHRcdFx0cmVzID0ge1xuXHRcdFx0XHRcdHJlc291cmNlOiBkcmFnZ2luZ1Jlc291cmNlLl9pZCxcblx0XHRcdFx0XHRsZWFybmluZ19wYXRoOiB0aGlzLm1vZGVsLmdldChcImxlYXJuaW5nX3BhdGhcIiksXG5cdFx0XHRcdFx0cmVzb3VyY2VUeXBlOiBkcmFnZ2luZ1Jlc291cmNlLmNhdGVnb3J5LFxuXHRcdFx0XHRcdHRpdGxlOiBkcmFnZ2luZ1Jlc291cmNlLnRpdGxlLFxuXHRcdFx0XHR9O1xuXHRcdFx0XHRpZiAoZHJhZ2dpbmdSZXNvdXJjZS5zZXR0aW5ncylcblx0XHRcdFx0XHRyZXMuc2V0dGluZ3MgPSBkcmFnZ2luZ1Jlc291cmNlLnNldHRpbmdzO1xuXHRcdFx0fVxuXG5cdFx0XHRfLmV4dGVuZChyZXMsIHtcblx0XHRcdFx0bG9ja2VkOiBkcmFnZ2luZ1Jlc291cmNlLmxvY2tlZCxcblx0XHRcdFx0YWN0aXZhdGlvbkRhdGU6IGRyYWdnaW5nUmVzb3VyY2UuYWN0aXZhdGlvbkRhdGUsXG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKCFyZXMucGF0aCB8fCAoIXRoaXMudGFza3MuZ2V0KHJlcy5yZXNvdXJjZSkgJiYgIXRoaXMucmVzb3VyY2VzLmdldChyZXMucmVzb3VyY2VzKSkgfHwgIWxvY2FsTWV0aG9kcy5pc1NpYmxpbmcodGhpcy5tb2RlbC5nZXQoXCJwYXRoXCIpLCByZXMucGF0aCkpIHtcblx0XHRcdFx0Y29uc3QgbWF4VGFzayA9IHRoaXMudGFza3MubGFzdCgpO1xuXHRcdFx0XHRjb25zdCBtYXhSZXNvdXJjZSA9IHRoaXMucmVzb3VyY2VzLmxhc3QoKTtcblxuXHRcdFx0XHRpZiAoIW1heFRhc2sgJiYgIW1heFJlc291cmNlKVxuXHRcdFx0XHRcdHJlcy5wYXRoID0gdGhpcy5tb2RlbC5nZXQoXCJwYXRoXCIpICsgXCIuQUFBXCI7XG5cdFx0XHRcdGVsc2UgaWYgKCFtYXhSZXNvdXJjZSlcblx0XHRcdFx0XHRyZXMucGF0aCA9IGxvY2FsTWV0aG9kcy5nZXROZXh0UGF0aChtYXhUYXNrLmdldChcInBhdGhcIikpO1xuXHRcdFx0XHRlbHNlIGlmICghbWF4VGFzaylcblx0XHRcdFx0XHRyZXMucGF0aCA9IGxvY2FsTWV0aG9kcy5nZXROZXh0UGF0aChtYXhSZXNvdXJjZS5nZXQoXCJwYXRoXCIpKTtcblx0XHRcdFx0ZWxzZSBpZiAobG9jYWxNZXRob2RzLmlzQWZ0ZXIobWF4VGFzay5nZXQoXCJwYXRoXCIpLCBtYXhSZXNvdXJjZS5nZXQoXCJwYXRoXCIpKSlcblx0XHRcdFx0XHRyZXMucGF0aCA9IGxvY2FsTWV0aG9kcy5nZXROZXh0UGF0aChtYXhSZXNvdXJjZS5nZXQoXCJwYXRoXCIpKTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHJlcy5wYXRoID0gbG9jYWxNZXRob2RzLmdldE5leHRQYXRoKG1heFRhc2suZ2V0KFwicGF0aFwiKSk7XG5cdFx0XHR9XG5cblx0XHRcdHJlcy5pc1Rhc2sgPSB0YXNrO1xuXG5cdFx0XHRpZiAobW92ZSlcblx0XHRcdFx0dGhpcy5tb3ZlUmVzb3VyY2UocmVzKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5hZGRSZXNvdXJjZShyZXMpO1xuXHRcdH07XG5cblx0XHQvL2lmIChkYXRhICYmIGRhdGEudHlwZSA9PT0gXCJyZXNvdXJjZVwiICYmIGRhdGEucmVzb3VyY2VNb2RlbCkge1xuXHRcdFx0Ly8gQ2hlY2sgdGFza3MgYW5kIHJlc291cmNlc1xuXHRcdGNvbnN0IHJlc291cmNlcyA9IHRhc2sgPyB0aGlzLnRhc2tzLm1vZGVscyA6IHRoaXMucmVzb3VyY2VzLm1vZGVscztcblxuXHRcdGNvbnN0IHJlc291cmNlID0gZHJhZ2dpbmdSZXNvdXJjZS5yZXNvdXJjZSA/IGRyYWdnaW5nUmVzb3VyY2UucmVzb3VyY2UgOiBkcmFnZ2luZ1Jlc291cmNlLl9pZDtcblx0XHRjb25zdCBpZCA9IGRyYWdnaW5nUmVzb3VyY2UucGF0aCA/IGRyYWdnaW5nUmVzb3VyY2UuX2lkIDogbnVsbDtcblxuXHRcdC8vIEFyZSB3ZSBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIHNhdmluZyB0aGUgc2FtZSBpdGVtP1xuXHRcdGlmICghdGhpcy5jb250ZW50U2F2ZU1hcClcblx0XHRcdHRoaXMuY29udGVudFNhdmVNYXAgPSB7fTtcblxuXHRcdGlmIChyZXNvdXJjZSBpbiB0aGlzLmNvbnRlbnRTYXZlTWFwKVxuXHRcdFx0dGhpcy51aS5lcnJvcnMuaHRtbChcIjxzcGFuIGNsYXNzPVxcXCJlcnJvclxcXCI+VGhhdCByZXNvdXJjZSBoYXMgYWxyZWFkeSBiZWVuIGF0dGFjaGVkIGFuZCBpcyBzdGlsbCBzYXZpbmc8L3NwYW4+XCIpO1xuXG5cdFx0Y29uc3QgZHVwbGljYXRlcyA9IF8uZmluZChyZXNvdXJjZXMsIG1vZGVsID0+IHtcblx0XHRcdGlmIChtb2RlbC5nZXQoXCJyZXNvdXJjZVwiKSA9PT0gcmVzb3VyY2UgJiYgKCFpZCB8fCBpZCAhPT0gbW9kZWwuaWQpKVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9KTtcblxuXHRcdGlmIChkdXBsaWNhdGVzKSB7XG5cdFx0XHRpZiAoIWRyYWdnaW5nUmVzb3VyY2UuX2lkKVxuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdGNvbnN0IG1vZGFsID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0XHR3YXJuaW5nOiB0cnVlLFxuXHRcdFx0XHRjdXN0b21PSzogXCJDbG9zZVwiLFxuXHRcdFx0XHRoaWRlQnV0dG9uczogW1wiY2FuY2VsXCJdLFxuXHRcdFx0XHRib2R5OiBcIlRoZSByZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyBpbiBcIiArICh0YXNrID8gXCJ0YXNrc1wiIDogXCJhZGRpdGlvbmFsIHJlc291cmNlc1wiKSArIFwiLlwiLFxuXHRcdFx0XHR0aXRsZTogXCJEdXBsaWNhdGUgcmVzb3VyY2U6IFwiICsgZHJhZ2dpbmdSZXNvdXJjZS50aXRsZS5yZXBsYWNlKC9bXFwmXFw8XFw+XFwnXFxcIl0vZywgeCA9PiBcIiYjXCIgKyB4LmNoYXJDb2RlQXQoMCkgKyBcIjtcIiksXG5cdFx0XHRcdGhvc3Q6IFwiI2xpbmstcmVzb3VyY2VzXCIsXG5cdFx0XHR9KTtcblx0XHRcdG1vZGFsLnNob3coKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGlmIChkcmFnZ2luZ1Jlc291cmNlLmNhdGVnb3J5ID09PSBcImFzc2Vzc21lbnRcIikge1xuXHRcdFx0Y29uc3QgbW9kYWwgPSBuZXcgQXNzZXNzbWVudFByb21wdCh7XG5cdFx0XHRcdGlubGluZU1lc3NhZ2U6IFwiXCIsXG5cdFx0XHRcdGhvc3Q6IFwiI2xpbmstcmVzb3VyY2VzXCIsXG5cdFx0XHRcdHJlc291cmNlOiBuZXcgUmVzb3VyY2VNb2RlbChkcmFnZ2luZ1Jlc291cmNlKSxcblx0XHRcdH0pO1xuXG5cdFx0XHRtb2RhbC5vbmNlKFwiYWN0aW9uXCIsIChhY3Rpb24sIHNldHRpbmdzTW9kZWwpID0+IHtcblx0XHRcdFx0aWYgKGFjdGlvbiA9PT0gXCJva1wiKSB7XG5cdFx0XHRcdFx0ZHJhZ2dpbmdSZXNvdXJjZS5zZXR0aW5ncyA9IHtcblx0XHRcdFx0XHRcdHNlcnZlclNhdmU6IHNldHRpbmdzTW9kZWwuc2F2ZSxcblx0XHRcdFx0XHRcdHRpdGxlOiBzZXR0aW5nc01vZGVsLmluc3RhbmNlTmFtZSxcblx0XHRcdFx0XHRcdHJlcXVpcmVDb2RlOiBzZXR0aW5nc01vZGVsLnJlcXVpcmVDb2RlLFxuXHRcdFx0XHRcdFx0Y29kZTogc2V0dGluZ3NNb2RlbC5yZXF1aXJlQ29kZSA/IHNldHRpbmdzTW9kZWwuY29kZSA6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdGRpc2FibGVSYW5kb21pemF0aW9uOiBzZXR0aW5nc01vZGVsLmRpc2FibGVSYW5kb21pemF0aW9uLFxuXHRcdFx0XHRcdFx0aGlkZUNvbXBsZXRlQnV0dG9uczogc2V0dGluZ3NNb2RlbC5oaWRlQ29tcGxldGVCdXR0b25zLFxuXHRcdFx0XHRcdFx0ZGlzYWJsZVJlc3VsdDogc2V0dGluZ3NNb2RlbC5kaXNhYmxlUmVzdWx0LFxuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRpZiAoc2V0dGluZ3NNb2RlbC5hY3RpdmF0aW9uVHlwZSA9PT0gXCJzcGVjaWZpY1wiKVxuXHRcdFx0XHRcdFx0ZHJhZ2dpbmdSZXNvdXJjZS5hY3RpdmF0aW9uRGF0ZSA9IG1vbWVudChzZXR0aW5nc01vZGVsLnN0YXJ0RGF0ZSArIFwiIFwiICsgc2V0dGluZ3NNb2RlbC5zdGFydFRpbWUsIGRhdGVGb3JtYXQpLnVuaXgoKTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRkcmFnZ2luZ1Jlc291cmNlLmFjdGl2YXRpb25EYXRlID0gbnVsbDtcblxuXHRcdFx0XHRcdC8vIE5vIHBlcnBldHVhbCBsb2NraW5nIGZvciBhc3Nlc3NtZW50cyBhdCBhbGxcblx0XHRcdFx0XHRkcmFnZ2luZ1Jlc291cmNlLmxvY2tlZCA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0ZmluYWxpemVEcm9wKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRtb2RhbC5zaG93KCk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0ZmluYWxpemVEcm9wKCk7XG5cdFx0fVxuXHR9LFxuXG5cdGFkZFJlc291cmNlOiBmdW5jdGlvbihyZXNvdXJjZSkge1xuXHRcdHJlc291cmNlLmdyb3VwcyA9IGV2ZW50QnVzLnJlcXVlc3QoZXZlbnRCdXMuRXZlbnRzLkdldEN1cnJlbnRHcm91cHMpO1xuXHRcdF8uZXh0ZW5kKHJlc291cmNlLCB7XG5cdFx0XHRkdWVEYXRlOiByZXNvdXJjZS5pc1Rhc2sgPyByZXNvdXJjZS5kdWVEYXRlIDogbnVsbCxcblx0XHRcdHZpc2libGU6IHRoaXMubW9kZWwuZ2V0KFwidmlzaWJsZVwiKSxcblx0XHRcdGxvY2tlZDogdGhpcy5tb2RlbC5nZXQoXCJsb2NrZWRcIikgfHwgcmVzb3VyY2UubG9ja2VkLFxuXHRcdFx0YWN0aXZhdGlvbkRhdGU6IHRoaXMubW9kZWwuZ2V0KFwiYWN0aXZhdGlvbkRhdGVcIikgfHwgcmVzb3VyY2UuYWN0aXZhdGlvbkRhdGUgfHwgbnVsbCxcblx0XHRcdHBhcmVudExvY2tlZDogdGhpcy5tb2RlbC5nZXQoXCJwYXJlbnRMb2NrZWRcIiksXG5cdFx0XHRwYXJlbnRBY3RpdmF0aW9uOiB0aGlzLm1vZGVsLmdldChcInBhcmVudEFjdGl2YXRpb25cIiksXG5cdFx0XHRwYXJlbnRWaXNpYmxlOiB0aGlzLm1vZGVsLmdldChcInBhcmVudFZpc2libGVcIiksXG5cdFx0fSk7XG5cblx0XHRpZiAocmVzb3VyY2UubG9ja2VkIHx8ICghcmVzb3VyY2UubG9ja2VkICYmIHJlc291cmNlLmFjdGl2YXRpb25EYXRlICYmIHJlc291cmNlLmFjdGl2YXRpb25EYXRlIDwgbW9tZW50KCkudW5peCgpKSlcblx0XHRcdHJlc291cmNlLmFjdGl2YXRpb25EYXRlID0gbnVsbDtcblxuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSBuZXcgUmVzb3VyY2VNb2RlbChyZXNvdXJjZSk7XG5cblx0XHQvLyBVcGRhdGUgdGhlIGNhY2hlIG9mIHByZS1zYXZlZCBpdGVtc1xuXHRcdGlmICghdGhpcy5jb250ZW50U2F2ZU1hcClcblx0XHRcdHRoaXMuY29udGVudFNhdmVNYXAgPSB7fTtcblxuXHRcdHRoaXMuY29udGVudFNhdmVNYXBbcmVzb3VyY2UuX2lkXSA9IHRydWU7XG5cblx0XHRpZiAocmVzb3VyY2UuaXNUYXNrKVxuXHRcdFx0dGhpcy50YXNrcy5hZGQocmVzb3VyY2VNb2RlbCk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5yZXNvdXJjZXMuYWRkKHJlc291cmNlTW9kZWwpO1xuXG5cdFx0ZHJhZ2dpbmdSZXNvdXJjZSA9IG51bGw7XG5cblx0XHRyZXNvdXJjZU1vZGVsLnNhdmUobnVsbCwge1xuXHRcdFx0c3VjY2VzczogKCkgPT4ge1xuXHRcdFx0XHRkZWxldGUgdGhpcy5jb250ZW50U2F2ZU1hcFtyZXNvdXJjZS5faWRdO1xuXG5cdFx0XHRcdHRoaXMucmVvcmRlckNvbnRlbnQocmVzb3VyY2VNb2RlbCk7XG5cblx0XHRcdFx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5FdmVudHMuQXR0YWNobWVudEFkZGVkLCByZXNvdXJjZU1vZGVsKTtcblx0XHRcdH0sXG5cdFx0XHRlcnJvcjogZSA9PiB7XG5cdFx0XHRcdGlmIChyZXNvdXJjZS5pc1Rhc2spXG5cdFx0XHRcdFx0dGhpcy50YXNrcy5yZW1vdmUocmVzb3VyY2VNb2RlbCk7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR0aGlzLnJlc291cmNlcy5yZW1vdmUocmVzb3VyY2VNb2RlbCk7XG5cblx0XHRcdFx0ZGVsZXRlIHRoaXMuY29udGVudFNhdmVNYXBbcmVzb3VyY2UuX2lkXTtcblx0XHRcdFx0Y29uc29sZS5lcnJvcihlKTtcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH0sXG5cblx0bW92ZVJlc291cmNlOiBmdW5jdGlvbihyZXNvdXJjZSkge1xuXHRcdGNvbnN0IHJlc291cmNlTW9kZWwgPSBkcmFnZ2luZ1Jlc291cmNlLnZpZXcubW9kZWw7XG5cblx0XHRjb25zdCBvbGRQYXRoID0gcmVzb3VyY2VNb2RlbC5nZXQoXCJwYXRoXCIpO1xuXHRcdGNvbnN0IG5ld1BhdGggPSByZXNvdXJjZS5wYXRoO1xuXG5cdFx0Y29uc3QgaXNTaWJsaW5nID0gbG9jYWxNZXRob2RzLmlzU2libGluZyhvbGRQYXRoLCBuZXdQYXRoKTtcblxuXHRcdGNvbnN0IG9wdHMgPSB7XG5cdFx0XHRwYXRoOiByZXNvdXJjZS5wYXRoLFxuXHRcdFx0aXNUYXNrOiByZXNvdXJjZS5pc1Rhc2ssXG5cdFx0XHRkdWVEYXRlOiByZXNvdXJjZS5pc1Rhc2sgPyByZXNvdXJjZU1vZGVsLmdldChcImR1ZURhdGVcIikgOiBudWxsLFxuXHRcdFx0dmlzaWJsZTogcmVzb3VyY2UudmlzaWJsZSxcblx0XHRcdGxvY2tlZDogcmVzb3VyY2UubG9ja2VkLFxuXHRcdFx0YWN0aXZhdGlvbkRhdGU6IHJlc291cmNlLmFjdGl2YXRpb25EYXRlLFxuXHRcdFx0cGFyZW50TG9ja2VkOiByZXNvdXJjZS5wYXJlbnRMb2NrZWQsXG5cdFx0XHRwYXJlbnRBY3RpdmF0aW9uOiByZXNvdXJjZS5wYXJlbnRBY3RpdmF0aW9uLFxuXHRcdFx0cGFyZW50VmlzaWJsZTogcmVzb3VyY2UucGFyZW50VmlzaWJsZSxcblx0XHR9O1xuXG5cdFx0aWYgKCFpc1NpYmxpbmcpIHtcblx0XHRcdC8vIElmIHdlJ3JlIG1vdmluZyB0aGlzIHJlc291cmNlIHRvIGEgbmV3IHRvcGljLCB3ZSBvdmVycmlkZSB0aGUgZm9sbG93aW5nIHZhbHVlcyBkaWZmZXJlbnRseVxuXHRcdFx0Ly8gVGhlIHBhcmVudCBub2RlIGZvciBhIHJlc291cmNlIGlzIHRoaXMgbm9kZVxuXHRcdFx0Xy5leHRlbmQob3B0cywge1xuXHRcdFx0XHR2aXNpYmxlOiB0aGlzLm1vZGVsLmdldChcInZpc2libGVcIiksXG5cdFx0XHRcdGxvY2tlZDogdGhpcy5tb2RlbC5nZXQoXCJsb2NrZWRcIiksXG5cdFx0XHRcdGFjdGl2YXRpb25EYXRlOiB0aGlzLm1vZGVsLmdldChcImFjdGl2YXRpb25EYXRlXCIpLFxuXHRcdFx0XHRwYXJlbnRMb2NrZWQ6IHRoaXMubW9kZWwuZ2V0KFwibG9ja2VkXCIpLFxuXHRcdFx0XHRwYXJlbnRBY3RpdmF0aW9uOiB0aGlzLm1vZGVsLmdldChcImFjdGl2YXRpb25EYXRlXCIpLFxuXHRcdFx0XHRwYXJlbnRWaXNpYmxlOiB0aGlzLm1vZGVsLmdldChcInZpc2libGVcIiksXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAob3B0cy5sb2NrZWQgfHwgKCFvcHRzLmxvY2tlZCAmJiBvcHRzLmFjdGl2YXRpb25EYXRlICYmIG9wdHMuYWN0aXZhdGlvbkRhdGUgPCBtb21lbnQoKS51bml4KCkpKVxuXHRcdFx0b3B0cy5hY3RpdmF0aW9uRGF0ZSA9IG51bGw7XG5cblx0XHQvLyBVcGRhdGUgdGhlIGNhY2hlIG9mIHByZS1zYXZlZCBpdGVtc1xuXHRcdGlmICghdGhpcy5jb250ZW50U2F2ZU1hcClcblx0XHRcdHRoaXMuY29udGVudFNhdmVNYXAgPSB7fTtcblxuXHRcdHRoaXMuY29udGVudFNhdmVNYXBbcmVzb3VyY2UuX2lkXSA9IHRydWU7XG5cblx0XHRsZXQgbG9jYWxNb3ZlO1xuXG5cdFx0aWYgKCFpc1NpYmxpbmcpXG5cdFx0XHRkcmFnZ2luZ1Jlc291cmNlLnZpZXcubW9kZWwuc2V0KHsgbW92aW5nOiB0cnVlIH0pO1xuXG5cdFx0aWYgKHJlc291cmNlLmlzVGFzaykge1xuXHRcdFx0bG9jYWxNb3ZlID0gdGhpcy5yZXNvdXJjZXMucmVtb3ZlKHJlc291cmNlTW9kZWwpO1xuXHRcdFx0dGhpcy50YXNrcy5hZGQocmVzb3VyY2VNb2RlbCk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0bG9jYWxNb3ZlID0gdGhpcy50YXNrcy5yZW1vdmUocmVzb3VyY2VNb2RlbCk7XG5cdFx0XHR0aGlzLnJlc291cmNlcy5hZGQocmVzb3VyY2VNb2RlbCk7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgb2xkRFIgPSBkcmFnZ2luZ1Jlc291cmNlO1xuXHRcdGRyYWdnaW5nUmVzb3VyY2UgPSBudWxsO1xuXG5cdFx0cmVzb3VyY2VNb2RlbC5zYXZlKG9wdHMsIHtcblx0XHRcdHBhdGNoOiB0cnVlLFxuXHRcdFx0c3VjY2VzczogKCkgPT4ge1xuXHRcdFx0XHRkZWxldGUgdGhpcy5jb250ZW50U2F2ZU1hcFtyZXNvdXJjZS5faWRdO1xuXG5cdFx0XHRcdGlmICghaXNTaWJsaW5nKSB7XG5cdFx0XHRcdFx0Ly8gSWYgbm90IHNpYmxpbmdzLCByZW1vdmUgaXQgZnJvbSB0aGUgb2xkIHBhcmVudFxuXHRcdFx0XHRcdG9sZERSLnZpZXcudHJpZ2dlcihFdmVudHMuUmVtb3ZlQ29udGVudEZyb21QYXJlbnQsIHJlc291cmNlTW9kZWwpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5yZW9yZGVyQ29udGVudChyZXNvdXJjZU1vZGVsKTtcblxuXHRcdFx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5BdHRhY2htZW50QWRkZWQsIHJlc291cmNlTW9kZWwsIHsgb2xkUGF0aCwgbmV3UGF0aCB9KTtcblx0XHRcdH0sXG5cdFx0XHRlcnJvcjogZSA9PiB7XG5cdFx0XHRcdGlmICghaXNTaWJsaW5nKVxuXHRcdFx0XHRcdG9sZERSLnZpZXcubW9kZWwuc2V0KHsgbW92aW5nOiBmYWxzZSB9KTtcblxuXHRcdFx0XHRpZiAocmVzb3VyY2UuaXNUYXNrKSB7XG5cdFx0XHRcdFx0aWYgKGxvY2FsTW92ZSlcblx0XHRcdFx0XHRcdHRoaXMucmVzb3VyY2VzLmFkZChyZXNvdXJjZU1vZGVsKTtcblx0XHRcdFx0XHR0aGlzLnRhc2tzLnJlbW92ZShyZXNvdXJjZU1vZGVsKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRpZiAobG9jYWxNb3ZlKVxuXHRcdFx0XHRcdFx0dGhpcy50YXNrcy5hZGQocmVzb3VyY2VNb2RlbCk7XG5cdFx0XHRcdFx0dGhpcy5yZXNvdXJjZXMucmVtb3ZlKHJlc291cmNlTW9kZWwpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGVsZXRlIHRoaXMuY29udGVudFNhdmVNYXBbcmVzb3VyY2UuX2lkXTtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKGUpO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fSxcblxuXHRyZW9yZGVyQ29udGVudDogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRjb25zdCB1Y3AgPSBtb2RlbC5nZXQoXCJ1cGRhdGVkQ2hpbGRQYXRoc1wiKSB8fCBbXTtcblx0XHRpZiAodWNwLmxlbmd0aCA9PT0gMClcblx0XHRcdHJldHVybjtcblxuXHRcdGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aClcblx0XHRcdHJldHVybiB0aGlzLnJlbG9hZE5vZGUoKTtcblxuXHRcdF8uZWFjaCh1Y3AsIHggPT4ge1xuXHRcdFx0Y29uc3QgaXRlbSA9IHRoaXMucmVzb3VyY2VzLmdldCh4Ll9pZCkgfHwgdGhpcy50YXNrcy5nZXQoeC5faWQpO1xuXHRcdFx0aWYgKGl0ZW0pXG5cdFx0XHRcdGl0ZW0uc2V0KHsgcGF0aDogeC5wYXRoIH0pO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy50YXNrcy5zb3J0KCk7XG5cdFx0dGhpcy5yZXNvdXJjZXMuc29ydCgpO1xuXG5cdFx0dGhpcy5tb2RlbC51bnNldChcInVwZGF0ZWRDaGlsZFBhdGhzXCIpO1xuXHR9LFxuXG5cdGFkZFNpYmxpbmdOb2RlOiBmdW5jdGlvbihtKSB7XG5cdFx0dGhpcy5vbkFkZENoaWxkTm9kZUJ0bihudWxsLCB0cnVlLCBtKTtcblx0fSxcblxuXHRvbkFkZENoaWxkTm9kZUJ0bjogYXN5bmMgZnVuY3Rpb24oZSwgc2libGluZywgc291cmNlTW9kZWwpIHtcblx0XHRpZiAoZSlcblx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRpZiAoIXRoaXMuY2hpbGRyZW4ubGVuZ3RoICYmICFzaWJsaW5nKVxuXHRcdFx0cmV0dXJuIHRoaXMudHJpZ2dlcihFdmVudHMuQWRkU2libGluZ05vZGUsIHRoaXMubW9kZWwpO1xuXG5cdFx0Y29uc3QgbmV4dENoaWxkUGF0aCA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoID8gKHNvdXJjZU1vZGVsID8gbG9jYWxNZXRob2RzLmdldE5leHRQYXRoKHNvdXJjZU1vZGVsLmdldChcInBhdGhcIikpIDogdGhpcy5jaGlsZHJlbi5maXJzdCgpLmdldChcInBhdGhcIikpIDpcblx0XHRcdHRoaXMubW9kZWwuZ2V0KFwicGF0aFwiKSArIFwiLkFBQVwiO1xuXG5cdFx0aWYgKCFuZXh0Q2hpbGRQYXRoKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIGdlbmVyYXRlIHBhdGggZm9yIG5ldyBjaGlsZCBub2RlXCIpO1xuXG5cdFx0Y29uc3QgbmV3Q2hpbGREYXRhID0gbmV3IE5vZGVNb2RlbCh7XG5cdFx0XHRwYXRoOiBuZXh0Q2hpbGRQYXRoLFxuXHRcdFx0Y2F0ZWdvcnk6IFwibm9kZVwiLFxuXHRcdFx0ZWRpdE1vZGU6IHRydWUsXG5cdFx0XHRsZWFybmluZ19wYXRoOiB0aGlzLm1vZGVsLmdldChcImxlYXJuaW5nX3BhdGhcIiksXG5cdFx0XHRkZXB0aDogdGhpcy5tb2RlbC5nZXQoXCJkZXB0aFwiKSArIDEsXG5cdFx0XHRncm91cHM6IFtscFJhZGlvLnJlcXVlc3QoRXZlbnRzLkdldFByaW1hcnlHcm91cCldLFxuXHRcdFx0dmlzaWJsZTogdGhpcy5tb2RlbC5nZXQoXCJ2aXNpYmxlXCIpLFxuXHRcdFx0bG9ja2VkOiB0aGlzLm1vZGVsLmdldChcImxvY2tlZFwiKSxcblx0XHRcdGFjdGl2YXRpb25EYXRlOiB0aGlzLm1vZGVsLmdldChcImFjdGl2YXRpb25EYXRlXCIpLFxuXHRcdH0pO1xuXG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwiaXNDb2xsYXBzZWRcIikpXG5cdFx0XHRhd2FpdCB0aGlzLmNvbGxhcHNlTm9kZShmYWxzZSk7XG5cblx0XHRjb25zdCBvcHRzID0geyBhdDogMCB9O1xuXHRcdGlmIChzb3VyY2VNb2RlbClcblx0XHRcdG9wdHMuYXQgPSB0aGlzLmNoaWxkcmVuLmluZGV4T2Yoc291cmNlTW9kZWwpICsgMTtcblxuXHRcdHRoaXMuY2hpbGRyZW4uYWRkKG5ld0NoaWxkRGF0YSwgb3B0cyk7XG5cdH0sXG5cblx0cHJvbW90ZVNpYmxpbmdOb2RlOiBhc3luYyBmdW5jdGlvbihub2RlLCBwb3NpdGlvbikge1xuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcImlzQ29sbGFwc2VkXCIpKVxuXHRcdFx0YXdhaXQgdGhpcy5jb2xsYXBzZU5vZGUoZmFsc2UpO1xuXG5cdFx0Ly8gQWRkIGl0IGFmdGVyIHRoZSBub2RlIHdlIGRyb3BwZWQgb250b1xuXHRcdHRoaXMuY2hpbGRyZW4uYWRkKG5vZGUsIHsgYXQ6IHRoaXMuY2hpbGRyZW4uaW5kZXhPZihwb3NpdGlvbikgKyAxIH0pO1xuXHR9LFxuXG5cdHNob3dPdmVybGF5OiBmdW5jdGlvbih0eXBlKSB7XG5cdFx0Ly9BY2NlcHRzIFwic2F2aW5nXCIsIFwibm9kcm9wXCJcblx0XHQvL0FkZCBtb3JlIGlmIHJlcXVpcmVkXG5cdFx0JChcIi5vdmVybGF5LW1lc3NhZ2VcIiwgdGhpcy51aS5vdmVybGF5KS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5vdmVybGF5LnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblxuXHRcdGlmICh0eXBlKVxuXHRcdFx0dGhpcy51aVtcIm92ZXJsYXlcIiArIF8udXBwZXJGaXJzdCh0eXBlKV0ucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdGhpZGVPdmVybGF5OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLm92ZXJsYXkuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdHN0YXJ0Tm9kZURyYWc6IGZ1bmN0aW9uKGUpIHtcblx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0aWYgKHRoaXMubW9kZWwuaXNOZXcoKSB8fCAhY2FuRWRpdCgpIHx8IHRoaXMubW9kZWwuZ2V0KFwiZWRpdE1vZGVcIikpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRpZiAod2luZG93LmdldFNlbGVjdGlvbikge1xuXHRcdFx0aWYgKHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5lbXB0eSlcblx0XHRcdFx0d2luZG93LmdldFNlbGVjdGlvbigpLmVtcHR5KCk7IC8vQ2hyb21lXG5cdFx0XHRlbHNlIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKVxuXHRcdFx0XHR3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7Ly9GaXJlZm94XG5cdFx0XHRlbHNlIGlmIChkb2N1bWVudC5zZWxlY3Rpb24pXG5cdFx0XHRcdGRvY3VtZW50LnNlbGVjdGlvbi5lbXB0eSgpOy8vSUVcblx0XHR9XG5cblx0XHRjb25zdCBkcmFnZ2luZ05vZGUgPSBuZXcgRHJhZ2dpbmdFbGVtZW50KHsgbW9kZWw6IHRoaXMubW9kZWwgfSkucmVuZGVyKCk7XG5cdFx0Y29uc3QgZHJhZ2dpbmdFbGVtZW50ID0gZHJhZ2dpbmdOb2RlLiRlbFswXTtcblxuXHRcdGRyYWdnaW5nRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcblx0XHRkcmFnZ2luZ0VsZW1lbnQuc3R5bGUuekluZGV4ID0gMTAwMDtcblxuXHRcdHRoaXMuc2hvd092ZXJsYXkoXCJub2Ryb3BcIik7XG5cblx0XHRscFJhZGlvLnRyaWdnZXIoRXZlbnRzLk5vZGVEcmFnU3RhcnQsIHRoaXMpO1xuXG5cdFx0JChcImJvZHlcIikuYXBwZW5kKGRyYWdnaW5nRWxlbWVudCk7XG5cblx0XHRjb25zdCBtb3ZlQXQgPSBldmVudCA9PiB7XG5cdFx0XHRscFJhZGlvLnRyaWdnZXIoRXZlbnRzLk5vZGVEcmFnTW92ZSwgZXZlbnQpO1xuXHRcdFx0ZHJhZ2dpbmdFbGVtZW50LnN0eWxlLmxlZnQgPSAoZXZlbnQucGFnZVgpICsgXCJweFwiO1xuXHRcdFx0ZHJhZ2dpbmdFbGVtZW50LnN0eWxlLnRvcCA9IChldmVudC5wYWdlWSkgKyBcInB4XCI7XG5cdFx0fTtcblxuXHRcdG1vdmVBdChlKTtcblxuXHRcdCQoXCJib2R5XCIpLm9uKFwibW91c2Vtb3ZlLmRyYWdnaW5nTm9kZVwiLCBtb3ZlQXQpO1xuXG5cdFx0JChcImJvZHlcIikub25lKFwibW91c2V1cC5lbmREcmFnXCIsIGV2ZW50ID0+IHtcblx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0XHQkKFwiYm9keVwiKS5vZmYoXCJtb3VzZW1vdmUuZHJhZ2dpbmdOb2RlXCIpO1xuXHRcdFx0ZHJhZ2dpbmdFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZHJhZ2dpbmdFbGVtZW50KTtcblxuXHRcdFx0Y29uc3QgZWxlbXMgPSAkKFwiZGl2Lm92ZXJsYXktbWVzc2FnZS5ub2Ryb3AsIGRpdi5scC1ub2RlOnZpc2libGUsIGRpdi5kcm9wcGFibGUuc2hvd1wiKS5nZXQoKTtcblxuXHRcdFx0Y29uc3QgeCA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQuY2xpZW50WDtcblx0XHRcdGNvbnN0IHkgPSBldmVudC5vcmlnaW5hbEV2ZW50LmNsaWVudFkgLSAodGhpcy5mdWxsc2NyZWVuZWQgPyAtNDUgOiAwKSArICQoXCIubGVhcm5pbmdfcGF0aC1tYW5hZ2VyIC50cmVlOmZpcnN0XCIpLmdldCgwKS5zY3JvbGxUb3AgKyB3aW5kb3cucGFnZVlPZmZzZXQ7XG5cblx0XHRcdGxldCBhY3R1YWwgPSBfLmZpbmQoZWxlbXMsIGl0ZW0gPT4ge1xuXHRcdFx0XHRjb25zdCBlbGVtZW50ID0gJChpdGVtKTtcblxuXHRcdFx0XHRpZiAoIWVsZW1lbnQuaXNJblZpZXdwb3J0KCkpXG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdGNvbnN0IG9mZnNldCA9IGVsZW1lbnQub2Zmc2V0KCk7XG5cblx0XHRcdFx0cmV0dXJuIHkgPj0gb2Zmc2V0LnRvcCAmJiB5IDw9IG9mZnNldC50b3AgKyBlbGVtZW50Lm91dGVySGVpZ2h0KHRydWUpICYmXG5cdFx0XHRcdFx0eCA+PSBvZmZzZXQubGVmdCAmJiB4IDw9IG9mZnNldC5sZWZ0ICsgZWxlbWVudC5vdXRlcldpZHRoKHRydWUpO1xuXHRcdFx0fSk7XG5cblx0XHRcdGlmIChhY3R1YWwgJiYgISQoYWN0dWFsKS5oYXNDbGFzcyhcIm5vZHJvcFwiKSkge1xuXHRcdFx0XHRpZiAoJChhY3R1YWwpLmhhc0NsYXNzKFwiZHJvcHBhYmxlXCIpKVxuXHRcdFx0XHRcdGFjdHVhbCA9ICQoYWN0dWFsKS5uZXh0KFwiZGl2LmxwLW5vZGVcIilbMF0gfHwgJChhY3R1YWwpLnByZXYoXCJkaXYubHAtbm9kZVwiKVswXTtcblxuXHRcdFx0XHQkKGFjdHVhbCkudHJpZ2dlcihcImRyb3Bub2RlXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRscFJhZGlvLnRyaWdnZXIoRXZlbnRzLk5vZGVEcmFnRW5kLCB0aGlzKTtcblx0XHRcdHRoaXMubW9kZWwuc2V0KHsgc2VsZWN0ZWQ6IGZhbHNlIH0pO1xuXHRcdH0pO1xuXHR9LFxuXG5cdG9uTm9kZURyYWdTdGFydDogXy5jb25zdGFudChmYWxzZSksXG5cblx0bm9kZURyYWdMaXN0ZW46IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkubm9kZS5vbihcIm1vdXNlbW92ZS5kcmFnT3ZlclwiLCBlID0+IHtcblx0XHRcdGxwUmFkaW8udHJpZ2dlcihFdmVudHMuTm9kZURyYWdPdmVyLCBlLCB0aGlzKTtcblx0XHR9KTtcblx0fSxcblxuXHRyZXNvdXJjZURyYWdMaXN0ZW46IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkubm9kZS5vbihcIm1vdXNlbW92ZS5kcmFnT3ZlclwiLCBlID0+IHtcblx0XHRcdGxwUmFkaW8udHJpZ2dlcihFdmVudHMuTm9kZURyYWdPdmVyLCBlLCB0aGlzKTtcblxuXHRcdFx0aWYgKGRyYWdnaW5nUmVzb3VyY2UgJiYgIXRoaXMudGFza3MubGVuZ3RoKSB7XG5cdFx0XHRcdHRoaXMudWkudGFza3NDb250YWluZXIucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0XHR0aGlzLnVpLmZha2VUYXNrLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGRyYWdnaW5nUmVzb3VyY2UgJiYgIXRoaXMucmVzb3VyY2VzLmxlbmd0aCkge1xuXHRcdFx0XHR0aGlzLnVpLnJlc291cmNlc0NvbnRhaW5lci5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHRcdHRoaXMudWkuZmFrZVJlc291cmNlLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fSxcblxuXHRyZXNvdXJjZURyYWdFbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY2hlY2tBdHRhY2htZW50Q29udGFpbmVycygpO1xuXHR9LFxuXG5cdG5vZGVEcm9wcGVkOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5pc05ldygpIHx8IGRyYWdnaW5nUmVzb3VyY2UpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRjb25zdCBkcm9wQ2hpbGQgPSB0aGlzLm1vZGVsLmdldChcImRyb3BDaGlsZFwiKTtcblx0XHRjb25zdCBkcm9wUG9zaXRpb24gPSB0aGlzLm1vZGVsLmdldChcImRyb3BQb3NpdGlvblwiKTtcblx0XHR0aGlzLm1vZGVsLnNldCh7IHNob3dEcm9wSW5kaWNhdG9yOiBmYWxzZSwgZHJvcENoaWxkOiBmYWxzZSwgZHJvcFBvc2l0aW9uOiBcIlwiIH0pO1xuXG5cdFx0aWYgKGRyb3BQb3NpdGlvbiA9PT0gXCJhYm92ZVwiKVxuXHRcdFx0cmV0dXJuIHRoaXMudHJpZ2dlcihFdmVudHMuTm9kZURyb3BBYm92ZSwgZHJvcENoaWxkLCB0aGlzLm1vZGVsKTtcblxuXHRcdGlmIChkcm9wQ2hpbGQpXG5cdFx0XHRyZXR1cm4gbHBSYWRpby50cmlnZ2VyKEV2ZW50cy5DaGlsZERyb3AsIHRoaXMpO1xuXG5cdFx0cmV0dXJuIGxwUmFkaW8udHJpZ2dlcihFdmVudHMuU2libGluZ0Ryb3AsIHRoaXMpO1xuXHR9LFxuXG5cdG5vZGVEcm9wcGVkQWJvdmU6IGZ1bmN0aW9uKGRyb3BDaGlsZCwgc3JjTW9kZWwpIHtcblx0XHRjb25zdCBpbmRleCA9IHRoaXMubW9kZWwuX2NoaWxkcmVuLmluZGV4T2Yoc3JjTW9kZWwpO1xuXHRcdGNvbnN0IGNoaWxkcmVuVmlldyA9IHRoaXMuZ2V0Q2hpbGRWaWV3KFwiY2hpbGRyZW5cIik7XG5cdFx0aWYgKGluZGV4ID4gMCkge1xuXHRcdFx0Y29uc3QgcHJldmlvdXNNb2RlbCA9IHRoaXMubW9kZWwuX2NoaWxkcmVuLmF0KGluZGV4IC0gMSk7XG5cdFx0XHRjb25zdCBwcmV2aW91c1ZpZXcgPSBjaGlsZHJlblZpZXcuY2hpbGRyZW4uZmluZEJ5TW9kZWwocHJldmlvdXNNb2RlbCk7XG5cblx0XHRcdHByZXZpb3VzVmlldy5tb2RlbC5zZXQoeyBkcm9wQ2hpbGQ6IGRyb3BDaGlsZCB9KTtcblx0XHRcdHByZXZpb3VzVmlldy51aS5ub2RlLnRyaWdnZXIoXCJkcm9wbm9kZVwiKTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoaW5kZXggPT09IDApIHtcblx0XHRcdGlmIChkcm9wQ2hpbGQpIHtcblx0XHRcdFx0dGhpcy5tb2RlbC5zZXQoeyBkcm9wQ2hpbGQ6IGRyb3BDaGlsZCB9KTtcblx0XHRcdFx0dGhpcy5tb2RlbC5zZXQoeyBkcm9wRmlyc3RDaGlsZDogdHJ1ZSB9KTtcblx0XHRcdFx0dGhpcy51aS5ub2RlLnRyaWdnZXIoXCJkcm9wbm9kZVwiKTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRjb25zdCBwcmV2aW91c01vZGVsID0gdGhpcy5tb2RlbC5fY2hpbGRyZW4uYXQoaW5kZXgpO1xuXHRcdFx0XHRjb25zdCBwcmV2aW91c1ZpZXcgPSBjaGlsZHJlblZpZXcuY2hpbGRyZW4uZmluZEJ5TW9kZWwocHJldmlvdXNNb2RlbCk7XG5cblx0XHRcdFx0cHJldmlvdXNWaWV3Lm1vZGVsLnNldCh7IGRyb3BGaXJzdENoaWxkOiB0cnVlIH0pO1xuXHRcdFx0XHRwcmV2aW91c1ZpZXcudWkubm9kZS50cmlnZ2VyKFwiZHJvcG5vZGVcIik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdG5vZGVEcmFnRW5kZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkubm9kZS5vZmYoXCJtb3VzZW1vdmUuZHJhZ092ZXJcIik7XG5cblx0XHRpZiAoIWRyYWdnaW5nUmVzb3VyY2UpIHtcblx0XHRcdHRoaXMubW9kZWwuc2V0KHsgc2hvd0Ryb3BJbmRpY2F0b3I6IGZhbHNlLCBkcm9wQ2hpbGQ6IGZhbHNlIH0pO1xuXHRcdFx0dGhpcy5oaWRlT3ZlcmxheSgpO1xuXHRcdH1cblx0fSxcblxuXHRvbkF0dGFjaG1lbnRBZGRlZDogZnVuY3Rpb24obW9kZWwsIHBhdGhzKSB7XG5cdFx0Y29uc3QgcGF0aCA9IHRoaXMubW9kZWwuZ2V0KFwicGF0aFwiKTtcblx0XHRpZiAoKHBhdGhzICYmIHBhdGhzLm9sZFBhdGggJiYgKHBhdGggPT09IHBhdGhzLm9sZFBhdGguc3BsaXQoXCIuXCIpWzBdIHx8IHBhdGggPT09IHBhdGhzLm9sZFBhdGguc3BsaXQoXCIuXCIpWzBdKSkgfHwgcGF0aCA9PT0gbW9kZWwuZ2V0KFwicGF0aFwiKS5zcGxpdChcIi5cIilbMF0pXG5cdFx0XHR0aGlzLnVwZGF0ZUJyYWluU2NvcmUoKTtcblx0fSxcblxuXHRvbkF0dGFjaG1lbnRSZW1vdmVkOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdGlmIChtb2RlbC5nZXQoXCJwYXRoXCIpICYmIHRoaXMubW9kZWwuZ2V0KFwicGF0aFwiKSA9PT0gbW9kZWwuZ2V0KFwicGF0aFwiKS5zcGxpdChcIi5cIilbMF0pXG5cdFx0XHR0aGlzLnVwZGF0ZUJyYWluU2NvcmUoKTtcblx0fSxcblxuXHR1cGRhdGVCcmFpblNjb3JlOiBmdW5jdGlvbigpIHtcblx0XHQkLmFqYXgoe1xuXHRcdFx0dXJsOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYWNhY2lhL2xlYXJuaW5nUGF0aHMvaXRlbS9tYmVTY29yZS9cIiArIHRoaXMubW9kZWwuZ2V0KFwiX2lkXCIpLFxuXHRcdFx0c3VjY2VzczogdGhpcy5mZXRjaEJyYWluU2NvcmVTdWNjZXNzLmJpbmQodGhpcyksXG5cdFx0XHRlcnJvcjogcmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKHJlc3BvbnNlKTtcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH0sXG5cblx0ZmV0Y2hCcmFpblNjb3JlU3VjY2VzczogZnVuY3Rpb24ocmVzcG9uc2UpIHtcblx0XHR0aGlzLm1vZGVsLnNldChcIm1iZV9zY29yZVwiLCByZXNwb25zZS5tYmVfc2NvcmUpO1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImNvbnRlbnRcIiwgbmV3IFRyZWVDb250ZW50KHsgbW9kZWw6IHRoaXMubW9kZWwgfSkpO1xuXHRcdHRoaXMuc2V0QnJhaW5UaXBweSgpO1xuXHR9LFxuXG5cdHNldEJyYWluVGlwcHk6IGZ1bmN0aW9uKCkge1xuXHRcdHRpcHB5KHRoaXMuJGVsLmdldCgwKS5xdWVyeVNlbGVjdG9yQWxsKFwiLm1iZS1icmFpblwiKSwge1xuXHRcdFx0dGhlbWU6IFwibGlnaHQtZ3JleVwiLFxuXHRcdFx0dHJpZ2dlcjogXCJjbGlja1wiLFxuXHRcdFx0ZHVyYXRpb246IDAsXG5cdFx0XHRhbmltYXRpb246IFwiZmFkZVwiLFxuXHRcdFx0cGxhY2VtZW50OiBcInJpZ2h0XCIsXG5cdFx0XHRmbGlwOiBmYWxzZSxcblx0XHRcdGFycm93OiB0cnVlLFxuXHRcdFx0ZGlzdGFuY2U6IDI1LFxuXHRcdFx0Y29udGVudDogYDxkaXYgY2xhc3M9XCJicmFpbi1leHBsYW5hdGlvblwiPlRoaXMgaW5kaWNhdGVzIGhvdyB3ZWxsIHlvdSBtYWtlIHVzZSBvZiB0aGUgTWluZCwgQnJhaW4sIGFuZCBFZHVjYXRpb24gUG93ZXIgU3RyYXRlZ2llcyBmb3Igc3R1ZGVudHMgdG8gZ2V0IHRoZSBtb3N0IG91dCBvZiB5b3VyIGxlYXJuaW5nIHBhdGguXG5cdFx0XHRcdE1vcmUgY29sb3VycyBhbmQgYSBmdWxsZXIgYnJhaW4gPSBhIGJldHRlciBsZWFybmluZyBleHBlcmllbmNlIGZvciB5b3VyIHN0dWRlbnRzLjwvZGl2PmAsXG5cdFx0XHRvblNob3c6IGluc3RhbmNlID0+IHtcblx0XHRcdFx0ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi5tYmUtYnJhaW5cIikuZm9yRWFjaChwb3BwZXIgPT4ge1xuXHRcdFx0XHRcdGlmIChwb3BwZXIgIT09IGluc3RhbmNlLnBvcHBlciAmJiBwb3BwZXIuX3RpcHB5KVxuXHRcdFx0XHRcdFx0cG9wcGVyLl90aXBweS5oaWRlKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fSxcblxuXHRvblJlbW92ZUxQSXRlbXM6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghdGhpcy50YXNrcy5sZW5ndGgpIHtcblx0XHRcdHRoaXMudWkudGFza3NDb250YWluZXIuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0dGhpcy51aS5mYWtlVGFzay5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLnJlc291cmNlcy5sZW5ndGgpIHtcblx0XHRcdHRoaXMudWkucmVzb3VyY2VzQ29udGFpbmVyLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHRoaXMudWkuZmFrZVJlc291cmNlLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR9XG5cdH0sXG59KTtcblxuVHJlZUNvbnRlbnQgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogXCJkaXZcIixcblx0Y2xhc3NOYW1lOiBcInRyZWUtY29udGVudFwiLFxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9jb25zb2xlL2xlYXJuaW5nUGF0aE5vZGUubnVualwiKS5scE5vZGVDb250ZW50LFxuXG5cdGJlaGF2aW9yczogW1RhZ3NdLFxuXG5cdHVpOiB7XG5cdFx0b3B0aW9uczogXCIub3B0aW9ucy1idG5cIixcblx0XHRjb2xsYXBzZUJ0bjogXCIuY29sbGFwc2UtY29udHJvbDpub3QoLmRpc2FibGVkKVwiLFxuXHRcdGJyYWluOiBcIi5tYmUtYnJhaW5cIixcblx0XHRkZXNjcmlwdGlvbjogXCIuZGVzY3JpcHRpb24tY29udGFpbmVyXCIsXG5cdFx0bW9yZURlc2M6IFwiLm1vcmUtZGVzY1wiLFxuXHRcdHBhZ2VSYW5nZTogXCIucGFnZXNcIixcblx0XHR0aXRsZTogXCJkaXYudGl0bGVcIixcblxuXHRcdGFjdGl2YXRpb25Db250YWluZXI6IFwiLmFjdGl2YXRpb24tY29udGFpbmVyXCIsXG5cblx0XHRsb2NrSW5kaWNhdG9yOiBcIi5sb2NrLWluZGljYXRvclwiLFxuXHRcdHZpc2liaWxpdHlJbmRpY2F0b3I6IFwiLnZpc2liaWxpdHktaW5kaWNhdG9yXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkub3B0aW9uc1wiOiBcIm9uT3B0aW9uc0NsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkuY29sbGFwc2VCdG5cIjogXCJvbkNvbGxhcHNlQnRuQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5icmFpblwiOiBcIm9uQnJhaW5DbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLm1vcmVEZXNjXCI6IFwib25Ub2dnbGVEZXNjXCIsXG5cdFx0XCJjbGljayBAdWkucGFnZVJhbmdlXCI6IFwib25QYWdlUmFuZ2VDbGlja1wiLFxuXHR9LFxuXG5cdG1vZGVsRXZlbnRzOiB7XG5cdFx0XCJjaGFuZ2U6dmlzaWJsZVwiOiBcIm9uVmlzaWJsZVN0YXR1c0NoYW5nZVwiLFxuXHRcdFwiY2hhbmdlOmxvY2tlZFwiOiBcIm9uTG9ja2VkU3RhdHVzQ2hhbmdlXCIsXG5cdFx0XCJjaGFuZ2U6YWN0aXZhdGlvbkRhdGVcIjogXCJvbkxvY2tlZFN0YXR1c0NoYW5nZVwiLFxuXHRcdFwiY2hhbmdlOmlzQ29sbGFwc2VkXCI6IFwib25Db2xsYXBzZUNoYW5nZVwiLFxuXHRcdGludmFsaWQ6IFwidmFsaWRhdGlvbkZhaWxlZFwiLFxuXHR9LFxuXG5cdGxwUmFkaW9FdmVudHM6IHtcblx0XHRbRXZlbnRzLkVkaXRpbmdDaGFuZ2VdOiBcIm9uRWRpdENoYW5nZVwiLFxuXHRcdFtFdmVudHMuRWRpdGluZ1N0YXJ0ZWRdOiBcImVkaXRpbmdTdGFydFwiLFxuXHRcdFtFdmVudHMuRWRpdGluZ0VuZGVkXTogXCJlZGl0aW5nRW5kXCIsXG5cdH0sXG5cblx0dGVtcGxhdGVDb250ZXh0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bWF4RGVzY0xlbmd0aCxcblx0XHRcdGRlc2NMZW5ndGg6IHRoaXMubW9kZWwuZ2V0KFwiZGVzY3JpcHRpb25cIikgPyB0aGlzLm1vZGVsLmdldChcImRlc2NyaXB0aW9uXCIpLmxlbmd0aCA6IDAsXG5cdFx0XHRwcmludEFjdGl2YXRpb25EYXRlOiAoKSA9PiBtb21lbnQudW5peCh0aGlzLm1vZGVsLmdldChcImFjdGl2YXRpb25EYXRlXCIpKS5mb3JtYXQoZGF0ZUZvcm1hdCksXG5cdFx0XHRnZXRDb250cmFzdDogYyA9PiBnZXRDb250cmFzdChjKSxcblx0XHRcdGRlc2NyaXB0aW9uOiAoKSA9PiAodGhpcy5tb2RlbC5nZXQoXCJkZXNjcmlwdGlvblwiKSA/IHRoaXMubW9kZWwuZ2V0KFwiZGVzY3JpcHRpb25cIikuc2xpY2UoMCwgbWF4RGVzY0xlbmd0aCkgOiBcIlwiKSxcblx0XHRcdGVkaXRpbmdBbGxvd2VkOiBjYW5FZGl0KCksXG5cdFx0XHRpc0xvY2tlZDogKCkgPT4gdGhpcy5tb2RlbC5nZXQoXCJsb2NrZWRcIikgfHwgKCF0aGlzLm1vZGVsLmdldChcImxvY2tlZFwiKSAmJiB0aGlzLm1vZGVsLmdldChcImFjdGl2YXRpb25EYXRlXCIpICYmIHRoaXMubW9kZWwuZ2V0KFwiYWN0aXZhdGlvbkRhdGVcIikgPiBtb21lbnQoKS51bml4KCkpLFxuXHRcdFx0aXNQYXJlbnRMb2NrZWQ6ICgpID0+IHRoaXMubW9kZWwuZ2V0KFwicGFyZW50TG9ja2VkXCIpIHx8ICghdGhpcy5tb2RlbC5nZXQoXCJwYXJlbnRMb2NrZWRcIikgJiYgdGhpcy5tb2RlbC5nZXQoXCJwYXJlbnRBY3RpdmF0aW9uXCIpICYmIHRoaXMubW9kZWwuZ2V0KFwicGFyZW50QWN0aXZhdGlvblwiKSA+IG1vbWVudCgpLnVuaXgoKSksXG5cdFx0XHRoYXNBY3RpdmF0aW9uRGF0ZTogKCkgPT4gdGhpcy5tb2RlbC5nZXQoXCJhY3RpdmF0aW9uRGF0ZVwiKSA+IG1vbWVudCgpLnVuaXgoKSxcblx0XHR9O1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuYmluZEV2ZW50cyhscFJhZGlvLCB0aGlzLmxwUmFkaW9FdmVudHMpO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0Y2xlYXJUaW1lb3V0KHRoaXMubG9ja0ludGVydmFsKTtcblx0fSxcblxuXHRvbkNvbGxhcHNlQ2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy51aS5jb2xsYXBzZUJ0bi50b2dnbGVDbGFzcylcblx0XHRcdHRoaXMudWkuY29sbGFwc2VCdG4udG9nZ2xlQ2xhc3MoXCJmYS1jaGV2cm9uLWRvd24gZmEtY2hldnJvbi11cFwiKTtcblx0fSxcblxuXHRvbkVkaXRDaGFuZ2U6IGZ1bmN0aW9uKHRvZ2dsZSkge1xuXHRcdGlmICh0b2dnbGUpXG5cdFx0XHR0aGlzLnVpLm9wdGlvbnMucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMudWkub3B0aW9ucy5hZGRDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0ZWRpdGluZ1N0YXJ0OiBmdW5jdGlvbihpdGVtKSB7XG5cdFx0aWYgKGl0ZW0gIT09IHRoaXMubW9kZWwuaWQpXG5cdFx0XHR0aGlzLnVpLm9wdGlvbnMuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdGVkaXRpbmdFbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLnVpLm9wdGlvbnMucmVtb3ZlQ2xhc3MpXG5cdFx0XHR0aGlzLnVpLm9wdGlvbnMucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdG9uRG9tUmVmcmVzaDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKGN1cnJlbnRFZGl0TW9kZWxJZCAmJiB0aGlzLm1vZGVsLmlkICE9PSBjdXJyZW50RWRpdE1vZGVsSWQpXG5cdFx0XHR0aGlzLnVpLm9wdGlvbnMuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0dGlwcHkodGhpcy4kZWwuZ2V0KDApLnF1ZXJ5U2VsZWN0b3JBbGwoXCIuZmEtY29nXCIpLCB7XG5cdFx0XHRkdXJhdGlvbjogMCxcblx0XHRcdGFuaW1hdGlvbjogXCJmYWRlXCIsXG5cdFx0XHRwbGFjZW1lbnQ6IFwidG9wXCIsXG5cdFx0XHRmbGlwOiBmYWxzZSxcblx0XHRcdGFycm93OiB0cnVlLFxuXHRcdFx0ZGlzdGFuY2U6IDI1LFxuXHRcdH0pO1xuXG5cdFx0Y29uc3QgcGFnZVJhbmdlID0gdGhpcy5tb2RlbC5nZXQoXCJwYWdlUmFuZ2VEaXNwbGF5XCIpIHx8IHRoaXMubW9kZWwuZ2V0KFwicGFnZVJhbmdlXCIpO1xuXHRcdGlmIChwYWdlUmFuZ2UgJiYgcGFnZVJhbmdlWzBdICYmIHBhZ2VSYW5nZVsxXSkge1xuXHRcdFx0dGhpcy51aS5wYWdlUmFuZ2UuaHRtbChcIjxzcGFuIGNsYXNzPVxcXCJmYWwgZmEtYm9va1xcXCI+PC9zcGFuPiBQYWdlIFwiICsgcGFnZVJhbmdlWzBdICsgXCIgLSBcIiArIHBhZ2VSYW5nZVsxXSk7XG5cdFx0XHR0aGlzLnVpLnBhZ2VSYW5nZS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0fVxuXHRcdHRoaXMuc2V0TG9ja0V4cGlyeSgpO1xuXHR9LFxuXG5cdHNldExvY2tFeHBpcnk6IGZ1bmN0aW9uKCkge1xuXHRcdGNsZWFyVGltZW91dCh0aGlzLmxvY2tJbnRlcnZhbCk7XG5cblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJhY3RpdmF0aW9uRGF0ZVwiKSA+IG1vbWVudCgpLnVuaXgoKSkge1xuXHRcdFx0Y29uc3Qgd2FpdCA9IHRoaXMubW9kZWwuZ2V0KFwiYWN0aXZhdGlvbkRhdGVcIikgLSBtb21lbnQoKS51bml4KCkgKyAyO1xuXG5cdFx0XHR0aGlzLmxvY2tJbnRlcnZhbCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLm9uTG9ja2VkU3RhdHVzQ2hhbmdlKCk7XG5cdFx0XHR9LCB3YWl0ICogMTAwMCk7XG5cdFx0fVxuXHR9LFxuXG5cdG9uVG9nZ2xlRGVzYzogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0dGhpcy51aS5kZXNjcmlwdGlvbi5odG1sKCh0aGlzLm1vZGVsLmdldChcImRlc2NyaXB0aW9uXCIpIHx8IFwiXCIpLnJlcGxhY2UoLzwvZywgXCImbHQ7XCIpLnJlcGxhY2UoLz4vZywgXCImZ3Q7XCIpLnJlcGxhY2UoL1xcbi9nLCBcIjxici8+XCIpKTtcblx0fSxcblxuXHRvbkJyYWluQ2xpY2s6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRldnQucHJldmVudERlZmF1bHQoKTtcblx0fSxcblxuXHRvblBhZ2VSYW5nZUNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHQkLmFqYXgoe1xuXHRcdFx0dHlwZTogXCJHRVRcIixcblx0XHRcdHVybDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FjYWNpYS9sZWFybmluZ1BhdGhzL2l0ZW1zL1wiICsgdGhpcy5tb2RlbC5pZCArIFwiL2dldEJvb2tQYWdlTGlua1wiLFxuXHRcdFx0c3VjY2VzczogdXJsID0+IHtcblx0XHRcdFx0Z2xvYmFsUmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLk5hdmlnYXRlLCBzZXR0aW5ncy51cmxSb290ICsgXCIvY29uc29sZS9ib29rcy9cIiArIHVybCk7XG5cdFx0XHR9LFxuXHRcdFx0ZXJyb3I6ICgpID0+IHtcblx0XHRcdFx0Z2xvYmFsUmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7XG5cdFx0XHRcdFx0Y29udGVudDogXCJVbmFibGUgdG8gZ2V0IFVSTCBmb3IgcGFnZVwiLFxuXHRcdFx0XHRcdGljb246IFwiZmEtdHJhc2gtYWx0XCIsXG5cdFx0XHRcdFx0aWNvbkNvbG91cjogXCJyZWRcIixcblx0XHRcdFx0XHRob3N0OiBcIiNsaW5rLXJlc291cmNlc1wiLFxuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH0sXG5cblx0b25PcHRpb25zQ2xpY2s6IGZ1bmN0aW9uKGUpIHtcblx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0Ly8gU2V0IHRoZSBvcHRpb25zXG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwidmlzaWJsZVwiKSlcblx0XHRcdCQoXCJhOm50aC1jaGlsZCgzKSBpXCIsIHRoaXMudWkudG9vbGJhcikuYWRkQ2xhc3MoXCJmYS1leWUtc2xhc2hcIikucmVtb3ZlQ2xhc3MoXCJmYS1leWVcIikuYXR0cihcInRpdGxlXCIsIFwiSGlkZVwiKTtcblx0XHRlbHNlXG5cdFx0XHQkKFwiYTpudGgtY2hpbGQoMykgaVwiLCB0aGlzLnVpLnRvb2xiYXIpLnJlbW92ZUNsYXNzKFwiZmEtZXllLXNsYXNoXCIpLmFkZENsYXNzKFwiZmEtZXllXCIpLmF0dHIoXCJ0aXRsZVwiLCBcIlNob3dcIik7XG5cblx0XHQkKFwiYm9keVwiKS50cmlnZ2VyKFwiY2xpY2tcIik7XG5cblx0XHQvLyBHZW5lcmF0ZSB0aGUgdG9vbGJhciBmb3IgdGhlIGN1cnJlbnQgc3RhdGVcblx0XHR0aGlzLnVpLm9wdGlvbnMudG9vbGJhcih7XG5cdFx0XHRjb250ZW50OiAkKFwiLnRvb2xiYXJcIiwgdGhpcy5lbCksXG5cdFx0XHRhdXRvU2hvdzogdHJ1ZSxcblx0XHRcdHBvc2l0aW9uOiBcImJvdHRvbVwiLFxuXHRcdFx0aGlkZU9uQ2xpY2s6IHRydWUsXG5cdFx0XHRjbG9zZU9uSXRlbUNsaWNrOiB0cnVlLFxuXHRcdFx0ZXZlbnQ6IFwiY2xpY2tcIixcblx0XHRcdGhvc3Q6IFwiI2xpbmstcmVzb3VyY2VzXCIsXG5cdFx0XHRzdHlsZTogXCJkYXJrXCIsXG5cdFx0XHRkZXN0cm95T25DbG9zZTogdHJ1ZSxcblx0XHR9KTtcblxuXHRcdCQoXCIubGVhcm5pbmdfcGF0aC1tYW5hZ2VyXCIpLm9uZShcInNjcm9sbFwiLCAoKSA9PiB7XG5cdFx0XHQkKFwiYm9keVwiKS50cmlnZ2VyKFwiY2xpY2tcIik7XG5cdFx0fSk7XG5cblx0XHR0aGlzLnVpLm9wdGlvbnMub2ZmKFwidG9vbGJhckl0ZW1DbGljay5tYWluXCIpO1xuXHRcdHRoaXMudWkub3B0aW9ucy5vbmUoXCJ0b29sYmFySXRlbUNsaWNrLm1haW5cIiwgKGV2dCwgaXRlbSkgPT4ge1xuXHRcdFx0Y29uc3QgZGF0YSA9ICQoaXRlbSkuZGF0YShcIml0ZW1cIik7XG5cblx0XHRcdHN3aXRjaCAoZGF0YSkge1xuXHRcdFx0XHRjYXNlIFwiZWRpdFwiOiByZXR1cm4gdGhpcy5vbkVkaXRDbGljayhldnQpO1xuXHRcdFx0XHRjYXNlIFwidmlzaWJpbGl0eVwiOiByZXR1cm4gdGhpcy5vbkhpZGVDbGljayhldnQpO1xuXHRcdFx0XHRjYXNlIFwiZGVsZXRlXCI6IHJldHVybiB0aGlzLm9uRGVsZXRlQ2xpY2soZXZ0KTtcblx0XHRcdFx0ZGVmYXVsdDogcmV0dXJuO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9LFxuXG5cdG9uRWRpdENsaWNrOiBmdW5jdGlvbihlKSB7XG5cdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdHRoaXMudHJpZ2dlcihFdmVudHMuU3RhcnROb2RlRWRpdCk7XG5cdH0sXG5cblx0b25IaWRlQ2xpY2s6IGZ1bmN0aW9uKGUpIHtcblx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0Y29uc3Qgb3B0cyA9IHtcblx0XHRcdHZpc2libGU6ICF0aGlzLm1vZGVsLmdldChcInZpc2libGVcIiksXG5cdFx0fTtcblxuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcImxvY2tlZFwiKSB8fCAoIXRoaXMubW9kZWwuZ2V0KFwibG9ja2VkXCIpICYmIHRoaXMubW9kZWwuZ2V0KFwiYWN0aXZhdGlvbkRhdGVcIikgJiYgdGhpcy5tb2RlbC5nZXQoXCJhY3RpdmF0aW9uRGF0ZVwiKSA8IG1vbWVudCgpLnVuaXgoKSkpXG5cdFx0XHRvcHRzLmFjdGl2YXRpb25EYXRlID0gbnVsbDtcblxuXHRcdGNvbnN0IGZpbmFsaXNlU2F2ZSA9ICgpID0+IHtcblx0XHRcdHRoaXMubW9kZWwuc2F2ZShvcHRzLCB7XG5cdFx0XHRcdHVybDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FjYWNpYS9sZWFybmluZ1BhdGhzL2l0ZW1zL3RvZ2dsZVZpc2liaWxpdHkvXCIgKyB0aGlzLm1vZGVsLmlkLFxuXHRcdFx0XHR3YWl0OiB0cnVlLFxuXHRcdFx0XHRwYXRjaDogdHJ1ZSxcblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHQvLyBDaGVjayBpZiB0aGVyZSBhcmUgYW55IGNoaWxkcmVuIHdpdGggc3RhdGVzIHRoYXQgd2lsbCBiZSBvdmVycmlkZGVuXG5cdFx0aWYgKHRoaXMubW9kZWwuX2NoaWxkcmVuLmxlbmd0aCB8fCB0aGlzLm1vZGVsLl90YXNrcy5sZW5ndGggfHwgdGhpcy5tb2RlbC5fcmVzb3VyY2VzLmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgY2hpbGRWaXNpYmlsaXR5ID0gdGhpcy5tb2RlbC5fY2hpbGRyZW4uc29tZSh4ID0+IHguaGFzVmlzaWJpbGl0eSgpKSB8fFxuXHRcdFx0XHR0aGlzLm1vZGVsLl90YXNrcy5zb21lKHggPT4geC5oYXNWaXNpYmlsaXR5KCkpIHx8IHRoaXMubW9kZWwuX3Jlc291cmNlcy5zb21lKHggPT4geC5oYXNWaXNpYmlsaXR5KCkpO1xuXG5cdFx0XHRpZiAoY2hpbGRWaXNpYmlsaXR5ICE9PSBvcHRzLnZpc2libGUpIHtcblx0XHRcdFx0Y29uc3QgbW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHRcdFx0d2FybmluZzogdHJ1ZSxcblx0XHRcdFx0XHRib2R5OiBgJHtvcHRzLnZpc2libGUgPyBcIlNob3dpbmdcIiA6IFwiSGlkaW5nXCJ9IHRoaXMgaXRlbSB3aWxsIGFwcGx5IHRoZSBzYW1lIHNldHRpbmcgdG8gYWxsIHJlc291cmNlLCB0YXNrIGFuZCBjaGlsZCBpdGVtcyBhcyB3ZWxsLiBDb250aW51ZT9gLFxuXHRcdFx0XHRcdHRpdGxlOiBcIlZpc2liaWxpdHkgT3ZlcnJpZGUgV2FybmluZ1wiLFxuXHRcdFx0XHRcdGhvc3Q6IFwiI2xpbmstcmVzb3VyY2VzXCIsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRtb2RhbC5zaG93KCk7XG5cblx0XHRcdFx0bW9kYWwub24oXCJidXR0b246b2tcIiwgKCkgPT4gZmluYWxpc2VTYXZlKCkpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZmluYWxpc2VTYXZlKCk7XG5cdH0sXG5cblx0b25WaXNpYmxlU3RhdHVzQ2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJ2aXNpYmxlXCIpKSB7XG5cdFx0XHQvL3RoaXMudWkuaGlkZUJ0bi5hZGRDbGFzcyhcImZhLWV5ZVwiKS5yZW1vdmVDbGFzcyhcImZhLWV5ZS1zbGFzaFwiKTtcblx0XHRcdC8vY29uc3Qgbm9kZSA9IHRoaXMuJGVsLmdldCgwKS5xdWVyeVNlbGVjdG9yKGAudGl0bGUtY29udGFpbmVyICR7dGhpcy51aS5oaWRlQnRuLnNlbGVjdG9yfWApO1xuXHRcdFx0Ly9ub2RlLl90aXBweS5zZXRDb250ZW50KFwiSGlkZVwiKTtcblx0XHRcdHRoaXMudWkudmlzaWJpbGl0eUluZGljYXRvci5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0Ly90aGlzLnVpLmhpZGVCdG4uYWRkQ2xhc3MoXCJmYS1leWUtc2xhc2hcIikucmVtb3ZlQ2xhc3MoXCJmYS1leWVcIik7XG5cdFx0XHQvL2NvbnN0IG5vZGUgPSB0aGlzLiRlbC5nZXQoMCkucXVlcnlTZWxlY3RvcihgLnRpdGxlLWNvbnRhaW5lciAke3RoaXMudWkuaGlkZUJ0bi5zZWxlY3Rvcn1gKTtcblx0XHRcdC8vbm9kZS5fdGlwcHkuc2V0Q29udGVudChcIlNob3dcIik7XG5cdFx0XHR0aGlzLnVpLnZpc2liaWxpdHlJbmRpY2F0b3IucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblx0fSxcblxuXHRvbkxvY2tlZFN0YXR1c0NoYW5nZTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLm1vZGVsLmdldChcImxvY2tlZFwiKSAmJiAoIXRoaXMubW9kZWwuZ2V0KFwiYWN0aXZhdGlvbkRhdGVcIikgfHwgdGhpcy5tb2RlbC5nZXQoXCJhY3RpdmF0aW9uRGF0ZVwiKSA8IG1vbWVudCgpLnVuaXgoKSkpXG5cdFx0XHR0aGlzLnVpLmxvY2tJbmRpY2F0b3IuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMudWkubG9ja0luZGljYXRvci5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJhY3RpdmF0aW9uRGF0ZVwiKSA+IG1vbWVudCgpLnVuaXgoKSkge1xuXHRcdFx0dGhpcy51aS5hY3RpdmF0aW9uQ29udGFpbmVyXG5cdFx0XHRcdC5yZW1vdmVDbGFzcyhcImhpZGVcIilcblx0XHRcdFx0Lmh0bWwoYDxzdHJvbmc+TG9ja2VkIHVudGlsOiA8L3N0cm9uZz4gJHttb21lbnQudW5peCh0aGlzLm1vZGVsLmdldChcImFjdGl2YXRpb25EYXRlXCIpKS5mb3JtYXQoZGF0ZUZvcm1hdCl9YCk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy51aS5hY3RpdmF0aW9uQ29udGFpbmVyLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR9XG5cblx0XHR0aGlzLnNldExvY2tFeHBpcnkoKTtcblx0fSxcblxuXHRvbkNvbGxhcHNlQnRuQ2xpY2s6IGZ1bmN0aW9uKGUpIHtcblx0XHRpZiAoIWNhbkVkaXQoKSAmJiAhZWRpdFN0YXRlcy52aWV3TW9kZSlcblx0XHRcdHJldHVybjtcblxuXHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHR0aGlzLnRyaWdnZXIoRXZlbnRzLkNvbGxhcHNlLCB0aGlzLnVpLmNvbGxhcHNlQnRuLmhhc0NsYXNzKFwiZmEtY2hldnJvbi11cFwiKSk7XG5cdH0sXG5cblx0b25EZWxldGVDbGljazogZnVuY3Rpb24oZSkge1xuXHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRjb25zdCBtb2RhbCA9IG5ldyBTbWFsbE1vZGFsKHtcblx0XHRcdHdhcm5pbmc6IHRydWUsXG5cdFx0XHR0aXRsZTogXCJEZWxldGUgSXRlbVwiLFxuXHRcdFx0Ym9keTogYFRoaXMgd2lsbCBwZXJtYW5lbnRseSBkZWxldGUgXCIke3RoaXMubW9kZWwuZ2V0KFwidGl0bGVcIil9XCIgZnJvbSB0aGlzICR7c2V0dGluZ3MubGVhcm5pbmdQYXRoc0N1c3RvbU5hbWV9Ljxici8+PGJyLz5BcmUgeW91IHN1cmU/YCxcblx0XHR9KTtcblxuXHRcdG1vZGFsLm9uKFwiYnV0dG9uOm9rXCIsICgpID0+IHtcblx0XHRcdHRoaXMubW9kZWwuZGVzdHJveSh7XG5cdFx0XHRcdHdhaXQ6IHRydWUsXG5cdFx0XHRcdHN1Y2Nlc3M6ICgpID0+IHtcblx0XHRcdFx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5BdHRhY2htZW50UmVtb3ZlZCwgdGhpcy5tb2RlbCk7XG5cdFx0XHRcdFx0dGhpcy5kZXN0cm95KCk7XG5cdFx0XHRcdH0sXG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdG1vZGFsLnNob3coKTtcblx0fSxcblxuXHR2YWxpZGF0aW9uRmFpbGVkOiBmdW5jdGlvbigpIHtcblx0XHRsZXQgbXNnID0gXCIzIFRoZXJlIHdlcmUgb25lIG9yIG1vcmUgZXJyb3JzOlxcblwiO1xuXG5cdFx0Xy5lYWNoKHRoaXMubW9kZWwudmFsaWRhdGlvbkVycm9yLCBpdGVtID0+IHtcblx0XHRcdG1zZyArPSBcIlxcbiogXCIgKyBpdGVtO1xuXHRcdH0pO1xuXG5cdFx0Y29uc29sZS5lcnJvcihtc2cpO1xuXHR9LFxufSk7XG5cblRyZWVFZGl0ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6IFwiZGl2XCIsXG5cdGNsYXNzTmFtZTogXCJsYXJnZS0xMiBjb2x1bW5zXCIsXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2NvbnNvbGUvbGVhcm5pbmdQYXRoTm9kZS5udW5qXCIpLmxwTm9kZUVkaXQsXG5cblx0YmVoYXZpb3JzOiBbVGFnc10sXG5cblx0dWk6IHtcblx0XHRjb250cm9sczogXCIuY29udHJvbHNcIixcblx0XHRvcHRpb25zOiBcIi5vcHRpb25zLWJ0blwiLFxuXG5cdFx0bG9jazogXCJpbnB1dFtuYW1lPSdsb2NrZWQnXVwiLFxuXHRcdGxvY2tUaW1lOiBcIi5kYXRldGltZVwiLFxuXHRcdGFjdGl2YXRpb25EYXRlOiBcImlucHV0W25hbWU9J2RhdGUnXVwiLFxuXHRcdGFjdGl2YXRpb25UaW1lOiBcImlucHV0W25hbWU9J3RpbWUnXVwiLFxuXHRcdHBhZ2VTdGFydDogXCJzZWxlY3RbbmFtZT0ncGFnZVN0YXJ0J11cIixcblx0XHRwYWdlRW5kOiBcInNlbGVjdFtuYW1lPSdwYWdlRW5kJ11cIixcblx0XHR0aXRsZUlucHV0OiBcImlucHV0W25hbWU9J3RpdGxlJ11cIixcblx0XHRkZXNjcmlwdGlvbklucHV0OiBcInRleHRhcmVhW25hbWU9J2Rlc2NyaXB0aW9uJ11cIixcblx0XHRjbGVhckFjdGl2YXRpb246IFwiLmNsZWFyQWN0aXZhdGlvblwiLFxuXHRcdHBhZ2VSYW5nZTogXCIucGFnZS1yYW5nZVwiLFxuXHRcdGJvb2tMaW5rQnRuOiBcIi5ib29rLWxpbmstYnRuXCIsXG5cdFx0bGlua2VkQm9vazogXCIubGlua2VkLWJvb2tcIixcblx0XHRsaW5rZWRCb29rU3Bpbm5lcjogXCIubGlua2VkLWJvb2stc3Bpbm5lclwiLFxuXHRcdGxpbmtlZEJvb2tFcnJvcjogXCIubGlua2VkLWJvb2stZXJyb3JcIixcblx0XHRib29rVGl0bGU6IFwiLmxpbmtlZC1ib29rIC5ib29rLXRpdGxlXCIsXG5cblx0XHRjYW5jZWxOb2RlRWRpdEJ0bjogXCIuY2FuY2VsLW5vZGUtZWRpdC1idG5cIixcblx0XHRzYXZlTm9kZUVkaXRCdG46IFwiLnNhdmUtbm9kZS1lZGl0LWJ0blwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLm9wdGlvbnNcIjogXCJvbk9wdGlvbnNDbGlja1wiLFxuXHRcdFwiY2hhbmdlIEB1aS5sb2NrXCI6IFwib25Mb2NrQnRuQ2xpY2tcIixcblxuXHRcdFwiY2xpY2sgQHVpLmNsZWFyQWN0aXZhdGlvblwiOiBcIm9uQ2xlYXJBY3RpdmF0aW9uXCIsXG5cblx0XHRcImNsaWNrIEB1aS5jYW5jZWxOb2RlRWRpdEJ0blwiOiBcIm9uQ2FuY2VsTm9kZUVkaXRCdG5DbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLnNhdmVOb2RlRWRpdEJ0blwiOiBcIm9uU2F2ZU5vZGVFZGl0QnRuQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5ib29rTGlua0J0blwiOiBcIm9uQm9va0xpbmtCdG5DbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmxpbmtlZEJvb2tFcnJvclwiOiBcIm9uTGlua2VkQm9va0Vycm9yQ2xpY2tcIixcblx0fSxcblxuXHRtb2RlbEV2ZW50czoge1xuXHRcdGludmFsaWQ6IFwidmFsaWRhdGlvbkZhaWxlZFwiLFxuXHR9LFxuXG5cdGxwUmFkaW9FdmVudHM6IHtcblx0XHRbRXZlbnRzLkVkaXRpbmdDaGFuZ2VdOiBcIm9uRWRpdENoYW5nZVwiLFxuXHRcdFtFdmVudHMuRWRpdGluZ1N0YXJ0ZWRdOiBcImVkaXRpbmdTdGFydFwiLFxuXHRcdFtFdmVudHMuRWRpdGluZ0VuZGVkXTogXCJlZGl0aW5nRW5kXCIsXG5cdH0sXG5cblx0dGVtcGxhdGVDb250ZXh0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aXNOZXc6ICgpID0+IHRoaXMubW9kZWwuaXNOZXcoKSxcblx0XHRcdGdldENvbnRyYXN0OiBjID0+IGdldENvbnRyYXN0KGMpLFxuXHRcdFx0aXNMb2NrZWQ6ICgpID0+IHRoaXMubW9kZWwuZ2V0KFwibG9ja2VkXCIpIHx8ICghdGhpcy5tb2RlbC5nZXQoXCJsb2NrZWRcIikgJiYgdGhpcy5tb2RlbC5nZXQoXCJhY3RpdmF0aW9uRGF0ZVwiKSAmJiB0aGlzLm1vZGVsLmdldChcImFjdGl2YXRpb25EYXRlXCIpID4gbW9tZW50KCkudW5peCgpKSxcblx0XHRcdGlzUGFyZW50TG9ja2VkOiAoKSA9PiB0aGlzLm1vZGVsLmdldChcInBhcmVudExvY2tlZFwiKSB8fCAoIXRoaXMubW9kZWwuZ2V0KFwicGFyZW50TG9ja2VkXCIpICYmIHRoaXMubW9kZWwuZ2V0KFwicGFyZW50QWN0aXZhdGlvblwiKSAmJiB0aGlzLm1vZGVsLmdldChcInBhcmVudEFjdGl2YXRpb25cIikgPiBtb21lbnQoKS51bml4KCkpLFxuXHRcdFx0ZWRpdGluZ0FsbG93ZWQ6IGNhbkVkaXQoKSxcblx0XHR9O1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuYmluZEV2ZW50cyhscFJhZGlvLCB0aGlzLmxwUmFkaW9FdmVudHMpO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMucGFnZUZldGNoWEhSKVxuXHRcdFx0dGhpcy5wYWdlRmV0Y2hYSFIuYWJvcnQoKTtcblx0XHR0aGlzLnBhZ2VGZXRjaFhIUiA9IG51bGw7XG5cdH0sXG5cblx0ZWRpdGluZ1N0YXJ0OiBmdW5jdGlvbihpdGVtKSB7XG5cdFx0aWYgKGl0ZW0gIT09IHRoaXMubW9kZWwuaWQpXG5cdFx0XHR0aGlzLnVpLm9wdGlvbnMuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdGVkaXRpbmdFbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdGN1cnJlbnRFZGl0TW9kZWxJZCA9IG51bGw7XG5cdFx0dGhpcy51aS5vcHRpb25zLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRvbk9wdGlvbnNDbGljazogZnVuY3Rpb24oZSkge1xuXHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHQvLyBTZXQgdGhlIG9wdGlvbnNcblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJ2aXNpYmxlXCIpKVxuXHRcdFx0JChcImE6bnRoLWNoaWxkKDIpIGlcIiwgdGhpcy51aS50b29sYmFyKS5hZGRDbGFzcyhcImZhLWV5ZS1zbGFzaFwiKS5yZW1vdmVDbGFzcyhcImZhLWV5ZVwiKS5hdHRyKFwidGl0bGVcIiwgXCJIaWRlXCIpO1xuXHRcdGVsc2Vcblx0XHRcdCQoXCJhOm50aC1jaGlsZCgyKSBpXCIsIHRoaXMudWkudG9vbGJhcikucmVtb3ZlQ2xhc3MoXCJmYS1leWUtc2xhc2hcIikuYWRkQ2xhc3MoXCJmYS1leWVcIikuYXR0cihcInRpdGxlXCIsIFwiU2hvd1wiKTtcblxuXHRcdCQoXCJib2R5XCIpLnRyaWdnZXIoXCJjbGlja1wiKTtcblxuXHRcdC8vIEdlbmVyYXRlIHRoZSB0b29sYmFyIGZvciB0aGUgY3VycmVudCBzdGF0ZVxuXHRcdHRoaXMudWkub3B0aW9ucy50b29sYmFyKHtcblx0XHRcdGNvbnRlbnQ6ICQoXCIudG9vbGJhclwiLCB0aGlzLmVsKSxcblx0XHRcdGF1dG9TaG93OiB0cnVlLFxuXHRcdFx0cG9zaXRpb246IFwiYm90dG9tXCIsXG5cdFx0XHRoaWRlT25DbGljazogdHJ1ZSxcblx0XHRcdGNsb3NlT25JdGVtQ2xpY2s6IHRydWUsXG5cdFx0XHRldmVudDogXCJjbGlja1wiLFxuXHRcdFx0aG9zdDogXCIjbGluay1yZXNvdXJjZXNcIixcblx0XHRcdHN0eWxlOiBcImRhcmtcIixcblx0XHRcdGRlc3Ryb3lPbkNsb3NlOiB0cnVlLFxuXHRcdH0pO1xuXG5cdFx0JChcIi5sZWFybmluZ19wYXRoLW1hbmFnZXJcIikub25lKFwic2Nyb2xsXCIsICgpID0+IHtcblx0XHRcdCQoXCJib2R5XCIpLnRyaWdnZXIoXCJjbGlja1wiKTtcblx0XHR9KTtcblxuXHRcdHRoaXMudWkub3B0aW9ucy5vZmYoXCJ0b29sYmFySXRlbUNsaWNrLm1haW5cIik7XG5cdFx0dGhpcy51aS5vcHRpb25zLm9uZShcInRvb2xiYXJJdGVtQ2xpY2subWFpblwiLCAoZXZ0LCBpdGVtKSA9PiB7XG5cdFx0XHRjb25zdCBkYXRhID0gJChpdGVtKS5kYXRhKFwiaXRlbVwiKTtcblxuXHRcdFx0c3dpdGNoIChkYXRhKSB7XG5cdFx0XHRcdGNhc2UgXCJ2aXNpYmlsaXR5XCI6IHJldHVybiB0aGlzLm9uSGlkZUNsaWNrKGV2dCk7XG5cdFx0XHRcdGNhc2UgXCJkZWxldGVcIjogcmV0dXJuIHRoaXMub25EZWxldGVDbGljayhldnQpO1xuXHRcdFx0XHRkZWZhdWx0OiByZXR1cm47XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0b25FZGl0Q2hhbmdlOiBmdW5jdGlvbih0b2dnbGUpIHtcblx0XHRpZiAodG9nZ2xlKSB7XG5cdFx0XHR0aGlzLnVpLm9wdGlvbnMucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0dGhpcy51aS5zYXZlTm9kZUVkaXRCdG4uYXR0cihcImRpc2FibGVkXCIsIGZhbHNlKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLnVpLm9wdGlvbnMuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0dGhpcy51aS5zYXZlTm9kZUVkaXRCdG4uYXR0cihcImRpc2FibGVkXCIsIHRydWUpO1xuXHRcdH1cblx0fSxcblxuXHR2YWxpZGF0aW9uRmFpbGVkOiBmdW5jdGlvbigpIHtcblx0XHQkKFwiLmVycm9yXCIsIHRoaXMuZWwpLnJlbW92ZSgpO1xuXHRcdF8uZWFjaCh0aGlzLm1vZGVsLnZhbGlkYXRpb25FcnJvciwgKGl0ZW0sIGtleSkgPT4ge1xuXHRcdFx0Y29uc3QgaW5kZXggPSBrZXkgPT09IFwiYWN0aXZhdGlvbkRhdGVcIiB8fCBrZXkgPT09IFwicGFnZUVuZFwiID8ga2V5IDoga2V5ICsgXCJJbnB1dFwiO1xuXHRcdFx0dGhpcy51aVtpbmRleF0ucGFyZW50KCkuYWZ0ZXIoXCI8c3BhbiBjbGFzcz0nZXJyb3InPlwiICsgaXRlbSArIFwiPC9zcGFuPlwiKTtcblx0XHRcdHRoaXMudWlbaW5kZXhdLm9uKFwiY2hhbmdlIGtleXVwXCIsIHRoaXMuY2xlYXJFcnJvcik7XG5cdFx0fSk7XG5cdH0sXG5cblx0Y2xlYXJFcnJvcjogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRjb25zdCBlbCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG5cdFx0ZWwucGFyZW50KCkucGFyZW50KCkuZmluZChcIi5lcnJvclwiKS5yZW1vdmUoKTtcblx0fSxcblxuXHRvbkNsZWFyQWN0aXZhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5hY3RpdmF0aW9uRGF0ZS52YWwoXCJcIik7XG5cdFx0dGhpcy51aS5hY3RpdmF0aW9uRGF0ZS5uZXh0KFwiaW5wdXRcIikudmFsKFwiXCIpO1xuXHRcdHRoaXMudWkuYWN0aXZhdGlvblRpbWUudmFsKFwiXCIpO1xuXHRcdHRoaXMudWkuYWN0aXZhdGlvblRpbWUubmV4dChcImlucHV0XCIpLnZhbChcIlwiKTtcblx0fSxcblxuXHRvbkhpZGVDbGljazogZnVuY3Rpb24oZSkge1xuXHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRpZiAodGhpcy5tb2RlbC5pc05ldygpKVxuXHRcdFx0cmV0dXJuIHRoaXMubW9kZWwuc2V0KHsgdmlzaWJsZTogIXRoaXMubW9kZWwuZ2V0KFwidmlzaWJsZVwiKSB9KTtcblxuXHRcdGNvbnN0IG9wdHMgPSB7IHZpc2libGU6ICF0aGlzLm1vZGVsLmdldChcInZpc2libGVcIikgfTtcblxuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcImxvY2tlZFwiKSB8fCAoIXRoaXMubW9kZWwuZ2V0KFwibG9ja2VkXCIpICYmIHRoaXMubW9kZWwuZ2V0KFwiYWN0aXZhdGlvbkRhdGVcIikgJiYgdGhpcy5tb2RlbC5nZXQoXCJhY3RpdmF0aW9uRGF0ZVwiKSA8IG1vbWVudCgpLnVuaXgoKSkpXG5cdFx0XHRvcHRzLmFjdGl2YXRpb25EYXRlID0gbnVsbDtcblxuXHRcdGNvbnN0IGZpbmFsaXNlU2F2ZSA9ICgpID0+IHtcblx0XHRcdHRoaXMubW9kZWwuc2F2ZShvcHRzLCB7XG5cdFx0XHRcdHVybDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FjYWNpYS9sZWFybmluZ1BhdGhzL2l0ZW1zL3RvZ2dsZVZpc2liaWxpdHkvXCIgKyB0aGlzLm1vZGVsLmlkLFxuXHRcdFx0XHR3YWl0OiB0cnVlLFxuXHRcdFx0XHRwYXRjaDogdHJ1ZSxcblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHQvLyBDaGVjayBpZiB0aGVyZSBhcmUgYW55IGNoaWxkcmVuIHdpdGggc3RhdGVzIHRoYXQgd2lsbCBiZSBvdmVycmlkZGVuXG5cdFx0aWYgKHRoaXMubW9kZWwuX2NoaWxkcmVuLmxlbmd0aCB8fCB0aGlzLm1vZGVsLl90YXNrcy5sZW5ndGggfHwgdGhpcy5tb2RlbC5fcmVzb3VyY2VzLmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgY2hpbGRWaXNpYmlsaXR5ID0gdGhpcy5tb2RlbC5fY2hpbGRyZW4uc29tZSh4ID0+IHguaGFzVmlzaWJpbGl0eSgpKSB8fFxuXHRcdFx0XHR0aGlzLm1vZGVsLl90YXNrcy5zb21lKHggPT4geC5oYXNWaXNpYmlsaXR5KCkpIHx8IHRoaXMubW9kZWwuX3Jlc291cmNlcy5zb21lKHggPT4geC5oYXNWaXNpYmlsaXR5KCkpO1xuXG5cdFx0XHRpZiAoY2hpbGRWaXNpYmlsaXR5ICE9PSBvcHRzLnZpc2libGUpIHtcblx0XHRcdFx0Y29uc3QgbW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHRcdFx0d2FybmluZzogdHJ1ZSxcblx0XHRcdFx0XHRib2R5OiBgJHtvcHRzLnZpc2libGUgPyBcIlNob3dpbmdcIiA6IFwiSGlkaW5nXCJ9IHRoaXMgaXRlbSB3aWxsIGFwcGx5IHRoZSBzYW1lIHNldHRpbmcgdG8gYWxsIHJlc291cmNlLCB0YXNrIGFuZCBjaGlsZCBpdGVtcyBhcyB3ZWxsLiBDb250aW51ZT9gLFxuXHRcdFx0XHRcdHRpdGxlOiBcIlZpc2liaWxpdHkgT3ZlcnJpZGUgV2FybmluZ1wiLFxuXHRcdFx0XHRcdGhvc3Q6IFwiI2xpbmstcmVzb3VyY2VzXCIsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRtb2RhbC5zaG93KCk7XG5cblx0XHRcdFx0bW9kYWwub24oXCJidXR0b246b2tcIiwgKCkgPT4gZmluYWxpc2VTYXZlKCkpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZmluYWxpc2VTYXZlKCk7XG5cdH0sXG5cblx0b25Mb2NrQnRuQ2xpY2s6IGZ1bmN0aW9uKGUpIHtcblx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0aWYgKHRoaXMudWkubG9jay5wcm9wKFwiY2hlY2tlZFwiKSlcblx0XHRcdHRoaXMudWkubG9ja1RpbWUucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMudWkubG9ja1RpbWUuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdG9uQ2FuY2VsTm9kZUVkaXRCdG5DbGljazogZnVuY3Rpb24oZSkge1xuXHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHR0aGlzLnRyaWdnZXIoRXZlbnRzLkNhbmNlbE5vZGVFZGl0KTtcblx0XHRscFJhZGlvLnRyaWdnZXIoRXZlbnRzLkVkaXRpbmdFbmRlZCk7XG5cdFx0Ym9va1BhZ2VzID0gbnVsbDtcblxuXHRcdGlmICh0aGlzLnBhZ2VGZXRjaFhIUilcblx0XHRcdHRoaXMucGFnZUZldGNoWEhSLmFib3J0KCk7XG5cdFx0dGhpcy5wYWdlRmV0Y2hYSFIgPSBudWxsO1xuXG5cdFx0Ly8gSWYgdGhpcyBpc24ndCBzYXZlZCB5ZXQsIGRlc3Ryb3kgaXQgZW50aXJlbHlcblx0XHRpZiAodGhpcy5tb2RlbC5pc05ldygpKVxuXHRcdFx0cmV0dXJuIHRoaXMubW9kZWwuZGVzdHJveSgpO1xuXHR9LFxuXG5cdG9uU2F2ZU5vZGVFZGl0QnRuQ2xpY2s6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGNvbnN0IFthVGltZUhyLCBhVGltZU1pbl0gPSAodGhpcy51aS5hY3RpdmF0aW9uVGltZS52YWwoKSB8fCBcIjAgMFwiKS5zcGxpdChcIiBcIik7XG5cblx0XHRjb25zdCB0ID0gdGhpcy51aS5hY3RpdmF0aW9uRGF0ZS52YWwoKSB8fCAwO1xuXG5cdFx0Y29uc3QgYVRpbWUgPSBtb21lbnQodCkubG9jYWwoKS51bml4KCkgKyBwYXJzZUludChhVGltZUhyLCAxMCkgKiAzNjAwICsgcGFyc2VJbnQoYVRpbWVNaW4sIDEwKSAqIDYwO1xuXG5cdFx0Y29uc3QgZGF0YSA9IHtcblx0XHRcdHRpdGxlOiB0aGlzLnVpLnRpdGxlSW5wdXQudmFsKCksXG5cdFx0XHRkZXNjcmlwdGlvbjogdGhpcy51aS5kZXNjcmlwdGlvbklucHV0LnZhbCgpIHx8IFwiXCIsXG5cdFx0XHRhY3RpdmF0aW9uRGF0ZTogdGhpcy51aS5sb2NrLnByb3AoXCJjaGVja2VkXCIpID8gYVRpbWUgOiBudWxsLFxuXHRcdFx0cGFnZVJhbmdlOiBfLmNvbXBhY3QoW3BhcnNlSW50KHRoaXMudWkucGFnZVN0YXJ0LnZhbCgpLCAxMCksIHBhcnNlSW50KHRoaXMudWkucGFnZUVuZC52YWwoKSwgMTApXSksXG5cdFx0XHRsb2NrZWQ6IGFUaW1lID8gZmFsc2UgOiB0aGlzLnVpLmxvY2sucHJvcChcImNoZWNrZWRcIiksXG5cdFx0fTtcblxuXHRcdGlmIChkYXRhLmxvY2tlZCB8fCAoIWRhdGEubG9ja2VkICYmIGRhdGEuYWN0aXZhdGlvbkRhdGUgPT09IHRoaXMubW9kZWwuZ2V0KFwiYWN0aXZhdGlvbkRhdGVcIikgJiYgZGF0YS5hY3RpdmF0aW9uRGF0ZSAmJiBkYXRhLmFjdGl2YXRpb25EYXRlIDwgbW9tZW50KCkudW5peCgpKSlcblx0XHRcdGRhdGEuYWN0aXZhdGlvbkRhdGUgPSBudWxsO1xuXG5cdFx0aWYgKCFfLmlzRW1wdHkoZGF0YS5wYWdlUmFuZ2UpICYmICFfLmlzRW1wdHkoYm9va1BhZ2VzKSkge1xuXHRcdFx0Y29uc3Qgc3RhcnRCb29rUGFnZSA9IGJvb2tQYWdlc1tkYXRhLnBhZ2VSYW5nZVswXSAtIDFdO1xuXHRcdFx0Y29uc3QgZW5kQm9va1BhZ2UgPSBib29rUGFnZXNbZGF0YS5wYWdlUmFuZ2VbMV0gLSAxXTtcblx0XHRcdGRhdGEucGFnZVJhbmdlRGlzcGxheSA9IFtzdGFydEJvb2tQYWdlLnRpdGxlIHx8IHN0YXJ0Qm9va1BhZ2UucGFnZSwgZW5kQm9va1BhZ2UudGl0bGUgfHwgZW5kQm9va1BhZ2UucGFnZV07XG5cdFx0XHRkYXRhLmJvb2sgPSB0aGlzLm1vZGVsLmdldChcImJvb2tcIik7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKGRhdGEucGFnZVJhbmdlICYmIGRhdGEucGFnZVJhbmdlLmxlbmd0aCkge1xuXHRcdFx0ZGF0YS5wYWdlUmFuZ2VEaXNwbGF5ID0gXy5tYXAoZGF0YS5wYWdlUmFuZ2UsIFN0cmluZyk7XG5cdFx0XHRkYXRhLmJvb2sgPSB0aGlzLm1vZGVsLmdldChcImJvb2tcIik7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0ZGF0YS5wYWdlUmFuZ2VEaXNwbGF5ID0gbnVsbDtcblx0XHRcdGRhdGEucGFnZVJhbmdlID0gbnVsbDtcblx0XHRcdGRhdGEuYm9vayA9IG51bGw7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZmluYWxpc2VTYXZlID0gKCkgPT4ge1xuXHRcdFx0dGhpcy5tb2RlbC5zYXZlKGRhdGEsIHtcblx0XHRcdFx0d2FpdDogdHJ1ZSxcblx0XHRcdFx0cGF0Y2g6ICF0aGlzLm1vZGVsLmlzTmV3KCksXG5cdFx0XHRcdHN1Y2Nlc3M6ICgpID0+IHtcblx0XHRcdFx0XHRib29rUGFnZXMgPSBudWxsO1xuXHRcdFx0XHRcdHRoaXMubW9kZWwuc2V0KFwiZWRpdE1vZGVcIiwgZmFsc2UpO1xuXHRcdFx0XHRcdHRoaXMudHJpZ2dlcihFdmVudHMuQ29tcGxldGVOb2RlRWRpdCk7XG5cdFx0XHRcdFx0bHBSYWRpby50cmlnZ2VyKEV2ZW50cy5Ob2RlQ2hhbmdlKTtcblx0XHRcdFx0XHRscFJhZGlvLnRyaWdnZXIoRXZlbnRzLkVkaXRpbmdFbmRlZCk7XG5cdFx0XHRcdH0sXG5cdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0aWYgKGRhdGEubG9ja2VkIHx8IGRhdGEuYWN0aXZhdGlvbkRhdGUgPiBtb21lbnQoKS51bml4KCkpIHtcblx0XHRcdC8vIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgY2hpbGRyZW4gd2l0aCBsb2NrIHN0YXRlcyB0aGF0IHdpbGwgYmUgb3ZlcnJpZGRlblxuXHRcdFx0Y29uc3Qgd2lsbENoYW5nZSA9IHRoaXMubW9kZWwuX2NoaWxkcmVuLnNvbWUoeCA9PiB4Lmhhc0xvY2tEYXRlKCkpIHx8XG5cdFx0XHRcdHRoaXMubW9kZWwuX3Rhc2tzLnNvbWUoeCA9PiB4Lmhhc0xvY2tEYXRlKCkpIHx8IHRoaXMubW9kZWwuX3Jlc291cmNlcy5zb21lKHggPT4geC5oYXNMb2NrRGF0ZSgpKTtcblxuXHRcdFx0aWYgKHdpbGxDaGFuZ2UpIHtcblx0XHRcdFx0Y29uc3QgbW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHRcdFx0d2FybmluZzogdHJ1ZSxcblx0XHRcdFx0XHRib2R5OiBcIkxvY2tpbmcgdGhpcyBpdGVtIHdpbGwgbG9jayBhbGwgcmVzb3VyY2VzLCB0YXNrcyBhbmQgY2hpbGQgaXRlbXMgYXMgd2VsbC4gRXhpc3RpbmcgbG9ja3Mgd2lsbCBiZSBvdmVycmlkZGVuLiBDb250aW51ZT9cIixcblx0XHRcdFx0XHR0aXRsZTogXCJMb2NrIE92ZXJyaWRlIFdhcm5pbmdcIixcblx0XHRcdFx0XHRob3N0OiBcIiNsaW5rLXJlc291cmNlc1wiLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0bW9kYWwuc2hvdygpO1xuXG5cdFx0XHRcdG1vZGFsLm9uKFwiYnV0dG9uOm9rXCIsICgpID0+IGZpbmFsaXNlU2F2ZSgpKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZpbmFsaXNlU2F2ZSgpO1xuXHR9LFxuXG5cdG9uRG9tUmVmcmVzaDogZnVuY3Rpb24oKSB7XG5cdFx0dGlwcHkodGhpcy4kZWwuZ2V0KDApLnF1ZXJ5U2VsZWN0b3JBbGwoXCIuZmEtY29nXCIpLCB7XG5cdFx0XHRkdXJhdGlvbjogMCxcblx0XHRcdGFuaW1hdGlvbjogXCJmYWRlXCIsXG5cdFx0XHRwbGFjZW1lbnQ6IFwidG9wXCIsXG5cdFx0XHRmbGlwOiBmYWxzZSxcblx0XHRcdGFycm93OiB0cnVlLFxuXHRcdFx0ZGlzdGFuY2U6IDI1LFxuXHRcdH0pO1xuXG5cdFx0Ly8gU3RyaXAgdGhlIHRpbWUgZnJvbSB0aGUgZGF0ZVxuXHRcdGNvbnN0IGQgPSB0aGlzLm1vZGVsLmhhcyhcImFjdGl2YXRpb25EYXRlXCIpID8gbW9tZW50LnVuaXgodGhpcy5tb2RlbC5nZXQoXCJhY3RpdmF0aW9uRGF0ZVwiKSkubG9jYWwoKS5ob3VyKDApLm1pbnV0ZSgwKS5zZWNvbmQoMCkudmFsdWVPZigpIDogMDtcblxuXHRcdGZsYXRwaWNrcih0aGlzLnVpLmFjdGl2YXRpb25EYXRlLmdldCgwKSwge1xuXHRcdFx0ZGVmYXVsdERhdGU6IGQsXG5cdFx0XHRkYXRlRm9ybWF0OiBcIlpcIixcblx0XHRcdGFsdElucHV0OiB0cnVlLFxuXHRcdFx0YWx0Rm9ybWF0OiBcImwsIEogb2YgRiwgWVwiLFxuXHRcdH0pO1xuXG5cdFx0ZmxhdHBpY2tyKHRoaXMudWkuYWN0aXZhdGlvblRpbWUuZ2V0KDApLCB7XG5cdFx0XHRlbmFibGVUaW1lOiB0cnVlLFxuXHRcdFx0bm9DYWxlbmRhcjogdHJ1ZSxcblx0XHRcdGRlZmF1bHREYXRlOiB0aGlzLm1vZGVsLmhhcyhcImFjdGl2YXRpb25EYXRlXCIpID8gdGhpcy5tb2RlbC5nZXQoXCJhY3RpdmF0aW9uRGF0ZVwiKSAqIDEwMDAgOiAwLFxuXHRcdFx0YWx0SW5wdXQ6IHRydWUsXG5cdFx0XHRkYXRlRm9ybWF0OiBcIkggaVwiLFxuXHRcdFx0YWx0Rm9ybWF0OiBcIkg6aSBLXCIsXG5cdFx0fSk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcImJvb2tcIikpIHtcblx0XHRcdHRoaXMucmVmcmVzaFBhZ2VTZWxlY3RvcnMoKTtcblx0XHRcdHRoaXMudWkuc2F2ZU5vZGVFZGl0QnRuLmF0dHIoXCJkaXNhYmxlZFwiLCB0cnVlKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLnVpLmJvb2tMaW5rQnRuLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHRoaXMudWkubGlua2VkQm9va1NwaW5uZXIuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblx0fSxcblxuXHRyZWZyZXNoUGFnZVNlbGVjdG9yczogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMucGFnZUZldGNoWEhSKVxuXHRcdFx0dGhpcy5wYWdlRmV0Y2hYSFIuYWJvcnQoKTtcblxuXHRcdHRoaXMudWkubGlua2VkQm9va0Vycm9yLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLmxpbmtlZEJvb2tTcGlubmVyLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblxuXHRcdHRoaXMucGFnZUZldGNoWEhSID0gJC5hamF4KHtcblx0XHRcdHVybDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FjYWNpYS9ib29rcy9cIiArIHRoaXMubW9kZWwuZ2V0KFwiYm9va1wiKSArIFwiL3BhZ2VzXCIsXG5cdFx0XHRzdWNjZXNzOiByZXNwb25zZSA9PiB7XG5cdFx0XHRcdHRoaXMudWkubGlua2VkQm9va1NwaW5uZXIuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0XHR0aGlzLnVpLnNhdmVOb2RlRWRpdEJ0bi5hdHRyKFwiZGlzYWJsZWRcIiwgZmFsc2UpO1xuXG5cdFx0XHRcdHRoaXMucGFnZUZldGNoWEhSID0gbnVsbDtcblx0XHRcdFx0Ym9va1BhZ2VzID0gcmVzcG9uc2UucGFnZXM7XG5cblx0XHRcdFx0Y29uc3QgcGFnZVN0YXJ0ID0gbmV3IFNlbGVjdHJhKHtcblx0XHRcdFx0XHRpdGVtczogXy5zb3J0QnkoXy5jb21wYWN0KF8ubWFwKGJvb2tQYWdlcywgKHBhZ2UsIGluZGV4KSA9PiAoe1xuXHRcdFx0XHRcdFx0a2V5OiBpbmRleCArIDEsXG5cdFx0XHRcdFx0XHR2YWx1ZTogcGFnZS50aXRsZSB8fCBwYWdlLnBhZ2UsXG5cdFx0XHRcdFx0XHRzZWxlY3RlZDogKGluZGV4ICsgMSkgPT09ICh0aGlzLm1vZGVsLmhhcyhcInBhZ2VSYW5nZVwiKSAmJiB0aGlzLm1vZGVsLmdldChcInBhZ2VSYW5nZVwiKS5sZW5ndGggPiAwID8gdGhpcy5tb2RlbC5nZXQoXCJwYWdlUmFuZ2VcIilbMF0gOiBudWxsKSxcblx0XHRcdFx0XHR9KSkpLCBcImtleVwiKSxcblx0XHRcdFx0XHRwbGFjZWhvbGRlcjogXCJTdGFydFwiLFxuXHRcdFx0XHRcdHNlYXJjaDogdHJ1ZSxcblx0XHRcdFx0XHR3aWR0aDogXCI3MHB4XCIsXG5cdFx0XHRcdFx0ZGRIb3N0OiBcIiNsaW5rLXJlc291cmNlc1wiLFxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRjb25zdCBwYWdlRW5kID0gbmV3IFNlbGVjdHJhKHtcblx0XHRcdFx0XHRpdGVtczogXy5zb3J0QnkoXy5jb21wYWN0KF8ubWFwKGJvb2tQYWdlcywgKHBhZ2UsIGluZGV4KSA9PiAoe1xuXHRcdFx0XHRcdFx0a2V5OiBpbmRleCArIDEsXG5cdFx0XHRcdFx0XHR2YWx1ZTogcGFnZS50aXRsZSB8fCBwYWdlLnBhZ2UsXG5cdFx0XHRcdFx0XHRzZWxlY3RlZDogKGluZGV4ICsgMSkgPT09ICh0aGlzLm1vZGVsLmhhcyhcInBhZ2VSYW5nZVwiKSAmJiB0aGlzLm1vZGVsLmdldChcInBhZ2VSYW5nZVwiKS5sZW5ndGggPiAwID8gdGhpcy5tb2RlbC5nZXQoXCJwYWdlUmFuZ2VcIilbMV0gOiBudWxsKSxcblx0XHRcdFx0XHR9KSkpLCBcImtleVwiKSxcblx0XHRcdFx0XHRwbGFjZWhvbGRlcjogXCJFbmRcIixcblx0XHRcdFx0XHRzZWFyY2g6IHRydWUsXG5cdFx0XHRcdFx0d2lkdGg6IFwiNzBweFwiLFxuXHRcdFx0XHRcdGRkSG9zdDogXCIjbGluay1yZXNvdXJjZXNcIixcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0cGFnZVN0YXJ0LnNob3coeyBlbDogdGhpcy51aS5wYWdlU3RhcnQgfSk7XG5cdFx0XHRcdHBhZ2VFbmQuc2hvdyh7IGVsOiB0aGlzLnVpLnBhZ2VFbmQgfSk7XG5cblx0XHRcdFx0dGhpcy51aS5wYWdlUmFuZ2UucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0XHR0aGlzLnVpLmJvb2tUaXRsZS50ZXh0KHJlc3BvbnNlLnRpdGxlKTtcblx0XHRcdFx0dGhpcy51aS5saW5rZWRCb29rLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRcdFx0dGhpcy51aS5ib29rTGlua0J0bi5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR9LFxuXHRcdFx0ZXJyb3I6IHJlc3BvbnNlID0+IHtcblx0XHRcdFx0dGhpcy51aS5saW5rZWRCb29rU3Bpbm5lci5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHRcdHRoaXMudWkubGlua2VkQm9va0Vycm9yLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblxuXHRcdFx0XHR0aGlzLnBhZ2VGZXRjaFhIUiA9IG51bGw7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IocmVzcG9uc2UpO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fSxcblxuXHRvbkxpbmtlZEJvb2tFcnJvckNsaWNrOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0dGhpcy5yZWZyZXNoUGFnZVNlbGVjdG9ycygpO1xuXHR9LFxuXG5cdG9uQm9va0xpbmtCdG5DbGljazogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwiYm9va1wiKSkge1xuXHRcdFx0dGhpcy51aS5wYWdlUmFuZ2UucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGNvbnN0IGdyb3VwID0gZXZlbnRCdXMucmVxdWVzdChldmVudEJ1cy5FdmVudHMuR2V0Q3VycmVudEdyb3VwKTtcblxuXHRcdFx0JC5hamF4KHtcblx0XHRcdFx0dXJsOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYWNhY2lhL2Jvb2tzL2dldEdyb3VwQm9va3M/Z3JvdXA9XCIgKyBncm91cC5nZXQoXCJjb2RlXCIpLFxuXHRcdFx0XHRzdWNjZXNzOiBib29rcyA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgbW9kYWwgPSBuZXcgQm9va0Nob29zZXJNb2RhbCh7XG5cdFx0XHRcdFx0XHRib29rczogYm9va3MsXG5cdFx0XHRcdFx0XHRtb2RlbDogbmV3IEJhY2tib25lLk1vZGVsKHtcblx0XHRcdFx0XHRcdFx0X2lkOiB0aGlzLm1vZGVsLmdldChcIl9pZFwiKSxcblx0XHRcdFx0XHRcdH0pLFxuXHRcdFx0XHRcdFx0aG9zdDogXCIjbGluay1yZXNvdXJjZXNcIixcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdG1vZGFsLnNob3coe1xuXHRcdFx0XHRcdFx0Y3JlYXRlOiBib29rSUQgPT4ge1xuXHRcdFx0XHRcdFx0XHRpZiAoIWJvb2tJRClcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHRcdFx0dGhpcy5tb2RlbC5zZXQoXCJib29rXCIsIGJvb2tJRCk7XG5cdFx0XHRcdFx0XHRcdHRoaXMucmVmcmVzaFBhZ2VTZWxlY3RvcnMoKTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRjYW5jZWw6ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0bW9kYWwuZGVzdHJveSgpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSxcblx0XHRcdH0pO1xuXHRcdH1cblx0fSxcblxuXHRvbkRlbGV0ZUNsaWNrOiBmdW5jdGlvbihlKSB7XG5cdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGNvbnN0IG1vZGFsID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0d2FybmluZzogdHJ1ZSxcblx0XHRcdHRpdGxlOiBcIkRlbGV0ZSBJdGVtXCIsXG5cdFx0XHRib2R5OiBgVGhpcyB3aWxsIHBlcm1hbmVudGx5IGRlbGV0ZSBcIiR7dGhpcy5tb2RlbC5nZXQoXCJ0aXRsZVwiKX1cIiBmcm9tIHRoaXMgJHtzZXR0aW5ncy5sZWFybmluZ1BhdGhzQ3VzdG9tTmFtZX0uPGJyLz48YnIvPkFyZSB5b3Ugc3VyZT9gLFxuXHRcdH0pO1xuXG5cdFx0bW9kYWwub24oXCJidXR0b246b2tcIiwgKCkgPT4ge1xuXHRcdFx0dGhpcy5tb2RlbC5kZXN0cm95KHtcblx0XHRcdFx0d2FpdDogdHJ1ZSxcblx0XHRcdFx0c3VjY2VzczogKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuZGVsZXRlUmVzb3VyY2VOb2RlKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdG1vZGFsLnNob3coKTtcblx0fSxcbn0pO1xuXG4vLyAqKiBSZXNvdXJjZSB2aWV3cyAqKlxuXG5cbmNvbnN0IFJlc291cmNlTm9kZSA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwicmVzb3VyY2VcIixcblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvY29uc29sZS9sZWFybmluZ1BhdGhOb2RlLm51bmpcIikucmVzb3VyY2VOb2RlLFxuXG5cdGJlaGF2aW9yczogW1RhZ3NdLFxuXG5cdHJlZ2lvbnM6IHtcblx0XHRlZGl0OiBcIi5lZGl0LXJlc291cmNlLWZvcm1cIixcblx0fSxcblxuXHR1aToge1xuXHRcdHJlc291cmNlSW5mbzogXCIucmVzb3VyY2UtaW5mb1wiLFxuXG5cdFx0Y29udHJvbHM6IFwiLmNvbnRyb2xzXCIsXG5cdFx0b3B0aW9uczogXCIub3B0aW9ucy1idG5cIixcblxuXHRcdGFjdGl2YXRpb25EYXRlOiBcImlucHV0W25hbWU9J2RhdGUnXVwiLFxuXHRcdGFjdGl2YXRpb25UaW1lOiBcImlucHV0W25hbWU9J3RpbWUnXVwiLFxuXG5cdFx0ZWRpdEFyZWE6IFwiLmVkaXQtcmVzb3VyY2UtZm9ybVwiLFxuXHRcdGFjdGl2YXRpb25Db250YWluZXI6IFwiLmFjdGl2YXRpb24tY29udGFpbmVyXCIsXG5cdFx0ZHVlQ29udGFpbmVyOiBcIi5kdWUtY29udGFpbmVyXCIsXG5cblx0XHRvdmVybGF5OiBcIi5vdmVybGF5XCIsXG5cdFx0b3ZlcmxheVNhdmluZzogXCIub3ZlcmxheSAuc2F2aW5nXCIsXG5cblx0XHRsb2NrSW5kaWNhdG9yOiBcIi5sb2NrLWluZGljYXRvclwiLFxuXHRcdHZpc2liaWxpdHlJbmRpY2F0b3I6IFwiLnZpc2liaWxpdHktaW5kaWNhdG9yXCIsXG5cdFx0ZXJyb3JzOiBcIi5lcnJvcnNcIixcblx0XHRwcm9ncmVzc0luZGljYXRvcjogXCIucHJvZ3Jlc3MtaW5kaWNhdG9yXCIsXG5cblx0XHRjaGVja2JveENvbnRhaW5lcjogXCIuY2hlY2tib3hcIixcblx0XHRjaGVja2JveDogXCIuY2hlY2tib3ggaW5wdXRcIixcblx0XHRwcm9ncmVzc0JhcjogXCIudXBsb2FkLXByb2dyZXNzIC5wcm9ncmVzcy1iYXJcIixcblxuXHRcdGNhbmNlbEJ1dHRvbjogXCIuY2FuY2VsLWJ0blwiLFxuXHRcdGVycm9yQnV0dG9uOiBcIi5lcnJvci1idG5cIixcblx0XHRjdXN0b21Hcm91cHM6IFwiLmN1c3RvbS1ncm91cHNcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRjbGljazogXCJvblJlc291cmNlQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5vcHRpb25zXCI6IFwib25PcHRpb25zQ2xpY2tcIixcblx0XHRcIm1vdXNlZG93biBkaXYuaW5mb1tkcmFnZ2FibGU9J3RydWUnXTpmaXJzdFwiOiBcInN0YXJ0UmVzb3VyY2VEcmFnXCIsXG5cdFx0bW91c2Vkb3duOiBcInN0YXJ0TXVsdGlzZWxlY3RcIixcblx0XHRcImRyYWdzdGFydCBAdWkucmVzb3VyY2VJbmZvXCI6IFwib25SZXNvdXJjZURyYWdTdGFydFwiLFxuXHRcdGRyb3ByZXNvdXJjZTogXCJvblJlc291cmNlRHJhZ0Ryb3BcIixcblx0XHRcImNsaWNrIEB1aS5jaGVja2JveFwiOiBcIm9uQ2hlY2tib3hDbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmNhbmNlbEJ1dHRvblwiOiBcIm9uQ2FuY2VsQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5lcnJvckJ1dHRvblwiOiBcIm9uQ2FuY2VsQ2xpY2tcIixcblx0fSxcblxuXHRjaGlsZFZpZXdFdmVudHM6IHtcblx0XHRbRXZlbnRzLkNhbmNlbE5vZGVFZGl0XTogXCJjYW5jZWxOb2RlRWRpdFwiLFxuXHRcdFtFdmVudHMuQ29tcGxldGVOb2RlRWRpdF06IFwiY29tcGxldGVOb2RlRWRpdFwiLFxuXHR9LFxuXG5cdG1vZGVsRXZlbnRzOiB7XG5cdFx0XCJjaGFuZ2U6bG9ja2VkXCI6IFwib25Mb2NrZWRTdGF0dXNDaGFuZ2VcIixcblx0XHRcImNoYW5nZTphY3RpdmF0aW9uRGF0ZVwiOiBcIm9uTG9ja2VkU3RhdHVzQ2hhbmdlXCIsXG5cdFx0XCJjaGFuZ2U6ZHVlRGF0ZVwiOiBcIm9uRHVlQ2hhbmdlXCIsXG5cdFx0XCJjaGFuZ2U6ZWRpdE1vZGVcIjogXCJvbkVkaXRNb2RlQ2hhbmdlXCIsXG5cdFx0XCJjaGFuZ2U6dmlzaWJsZVwiOiBcIm9uVmlzaWJsZVN0YXR1c0NoYW5nZVwiLFxuXHRcdHJlcXVlc3Q6IFwib25TYXZlQmVnaW5cIixcblx0XHRzeW5jOiBcIm9uU2F2ZUVuZFwiLFxuXHRcdGVycm9yOiBcIm9uU2F2ZUVycm9yXCIsXG5cdFx0aW52YWxpZDogXCJ2YWxpZGF0aW9uRmFpbGVkXCIsXG5cdFx0XCJjaGFuZ2U6cGFyZW50TG9ja2VkXCI6IFwib25QYXJlbnRMb2NrQ2hhbmdlXCIsXG5cdFx0XCJjaGFuZ2U6cGFyZW50QWN0aXZhdGlvblwiOiBcIm9uUGFyZW50TG9ja0NoYW5nZVwiLFxuXHRcdFwiY2hhbmdlOnBhcmVudFZpc2libGVcIjogXCJvblBhcmVudFZpc2libGVDaGFuZ2VcIixcblx0XHRcImNoYW5nZTptb3ZpbmdcIjogXCJvbk1vdmluZ0NoYW5nZVwiLFxuXHRcdFwiY2hhbmdlOnByb2dyZXNzXCI6IFwib25Qcm9ncmVzc0NoYW5nZVwiLFxuXHRcdFwiY2hhbmdlOmludmlzaWJsZVwiOiBcIm9uSW52aXNpYmlsaXR5Q2xvYWtcIixcblx0XHRcImNoYW5nZTptdWx0aXNlbGVjdGluZ1wiOiBcIm9uTXVsdGlTZWxlY3RpbmdDaGFuZ2VcIixcblx0XHRcImNoYW5nZTpkZXB0aFwiOiBcIm9uRGVwdGhDaGFuZ2VcIixcblx0XHRcInVwbG9hZDpwcm9ncmVzc1wiOiBcIm9uVXBsb2FkUHJvZ3Jlc3NcIixcblx0XHRcInZpZXc6ZGVzdHJveVwiOiBcIm9uVmlld0Rlc3Ryb3lcIixcblx0XHRcInNhdmU6c3VjY2Vzc1wiOiBcInVwbG9hZFN1Y2Nlc3NcIixcblx0XHRcInNhdmU6ZXJyb3JcIjogXCJ1cGxvYWRFcnJvclwiLFxuXHR9LFxuXG5cdGxwUmFkaW9FdmVudHM6IHtcblx0XHRbRXZlbnRzLkZvY3VzQXR0YWNobWVudF06IFwiZm9jdXNPbkF0dGFjaG1lbnRcIixcblx0XHRbRXZlbnRzLkVkaXRpbmdDaGFuZ2VdOiBcIm9uRWRpdENoYW5nZVwiLFxuXHRcdFtFdmVudHMuRWRpdGluZ1N0YXJ0ZWRdOiBcImVkaXRpbmdTdGFydFwiLFxuXHRcdFtFdmVudHMuRWRpdGluZ0VuZGVkXTogXCJlZGl0aW5nRW5kXCIsXG5cdFx0W0V2ZW50cy5SZXNvdXJjZURyYWdMaXN0ZW5dOiBcInJlc291cmNlRHJhZ0xpc3RlblwiLFxuXHRcdFtFdmVudHMuUmVzb3VyY2VEcmFnRW5kXTogXCJyZXNvdXJjZURyYWdFbmRcIixcblx0XHRbRXZlbnRzLk5vZGVTZWxlY3RMaXN0ZW5dOiBcIm5vZGVTZWxlY3RMaXN0ZW5cIixcblx0XHRbRXZlbnRzLk5vZGVTZWxlY3RFbmRdOiBcIm5vZGVTZWxlY3RFbmRcIixcblx0XHRbRXZlbnRzLlJlbW92ZUxQSXRlbXNdOiBcIm9uUmVtb3ZlTFBJdGVtc1wiLFxuXHR9LFxuXG5cdHJlc291cmNlRXZlbnRzOiB7XG5cdFx0XCJyZXNvdXJjZTpkZWxldGVkXCI6IFwib25SZXNvdXJjZURlbGV0ZWRcIixcblx0fSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRwcmludEFjdGl2YXRpb25EYXRlOiAoKSA9PiBtb21lbnQudW5peCh0aGlzLm1vZGVsLmdldChcImFjdGl2YXRpb25EYXRlXCIpKS5mb3JtYXQoZGF0ZUZvcm1hdCksXG5cdFx0XHRwcmludER1ZURhdGU6ICgpID0+IG1vbWVudC51bml4KHRoaXMubW9kZWwuZ2V0KFwiZHVlRGF0ZVwiKSkuZm9ybWF0KGRhdGVGb3JtYXQpLFxuXHRcdFx0Z2V0Q29udHJhc3Q6IGMgPT4gZ2V0Q29udHJhc3QoYyksXG5cdFx0XHRzaG93T3B0aW9uczogKCkgPT4gKGNhbkVkaXQoKSAmJiAhZWRpdFN0YXRlcy52aWV3TW9kZSkgfHwgKGVkaXRTdGF0ZXMudmlld01vZGUgJiYgdGhpcy5tb2RlbC5nZXQoXCJpc1Rhc2tcIikgJiYgdGhpcy5tb2RlbC5nZXQoXCJwcm9ncmVzc1wiKSA+IDApLFxuXHRcdFx0aXNMb2NrZWQ6ICgpID0+IHRoaXMubW9kZWwuZ2V0KFwibG9ja2VkXCIpIHx8ICghdGhpcy5tb2RlbC5nZXQoXCJsb2NrZWRcIikgJiYgdGhpcy5tb2RlbC5nZXQoXCJhY3RpdmF0aW9uRGF0ZVwiKSAmJiB0aGlzLm1vZGVsLmdldChcImFjdGl2YXRpb25EYXRlXCIpID4gbW9tZW50KCkudW5peCgpKSxcblx0XHRcdGlzUGFyZW50TG9ja2VkOiAoKSA9PiB0aGlzLm1vZGVsLmdldChcInBhcmVudExvY2tlZFwiKSB8fCAoIXRoaXMubW9kZWwuZ2V0KFwicGFyZW50TG9ja2VkXCIpICYmIHRoaXMubW9kZWwuZ2V0KFwicGFyZW50QWN0aXZhdGlvblwiKSAmJiB0aGlzLm1vZGVsLmdldChcInBhcmVudEFjdGl2YXRpb25cIikgPiBtb21lbnQoKS51bml4KCkpLFxuXHRcdFx0aGFzQWN0aXZhdGlvbkRhdGU6ICgpID0+IHRoaXMubW9kZWwuZ2V0KFwiYWN0aXZhdGlvbkRhdGVcIikgPiBtb21lbnQoKS51bml4KCksXG5cdFx0XHRoYXNEdWVEYXRlOiAoKSA9PiB0aGlzLm1vZGVsLmdldChcImlzVGFza1wiKSAmJiB0aGlzLm1vZGVsLmdldChcImR1ZURhdGVcIikgPiBtb21lbnQoKS51bml4KCksXG5cdFx0XHRjb21wbGV0ZWQ6ICgpID0+IHRoaXMubW9kZWwuZ2V0KFwicHJvZ3Jlc3NcIikgPT09IDEwMCxcblx0XHRcdGhhc0Vycm9yOiAoKSA9PiAhXy5pc05pbCh0aGlzLm1vZGVsLmdldChcImVycm9yc1wiKSkgJiYgXy52YWx1ZXModGhpcy5tb2RlbC5nZXQoXCJlcnJvcnNcIikpLmxlbmd0aCA+IDAsXG5cdFx0XHRlcnJvck1lc3NhZ2U6IHRoaXMuZ2V0RXJyb3JNZXNzYWdlKCksXG5cdFx0XHRnZXRHcm91cHM6ICgpID0+IGV2ZW50QnVzLnJlcXVlc3QoZXZlbnRCdXMuRXZlbnRzLkdldEFsbG93ZWRHcm91cHMpLFxuXHRcdH07XG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuYmluZEV2ZW50cyhscFJhZGlvLCB0aGlzLmxwUmFkaW9FdmVudHMpO1xuXG5cdFx0dGhpcy5tb2RlbC5zZXQoe1xuXHRcdFx0cGFyZW50TG9ja2VkOiBvcHRpb25zLnBhcmVudExvY2tlZCB8fCBmYWxzZSxcblx0XHRcdHBhcmVudEFjdGl2YXRpb246IG9wdGlvbnMucGFyZW50QWN0aXZhdGlvbiB8fCBudWxsLFxuXHRcdFx0cGFyZW50VmlzaWJsZTogb3B0aW9ucy5wYXJlbnRWaXNpYmxlICE9PSBmYWxzZSxcblx0XHR9KTtcblxuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcInJlc291cmNlVHlwZVwiKSA9PT0gXCJhc3Nlc3NtZW50XCIgJiYgdGhpcy5tb2RlbC5nZXQoXCJhdHRhY2htZW50XCIpKSB7XG5cdFx0XHR0aGlzLmF0dGFjaG1lbnQgPSBuZXcgQXR0YWNobWVudE1vZGVsKCk7XG5cdFx0XHR0aGlzLmF0dGFjaG1lbnQudXJsID0gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvYXR0YWNobWVudHMvcmVzb3VyY2UvXCIgKyB0aGlzLm1vZGVsLmdldChcImF0dGFjaG1lbnRcIik7XG5cdFx0XHR0aGlzLmF0dGFjaG1lbnQuZmV0Y2goe1xuXHRcdFx0XHQvL3N1Y2Nlc3M6IHRoaXMuYXR0YWNobWVudEZldGNoU3VjY2Vzcy5iaW5kKHRoaXMpLFxuXHRcdFx0XHRlcnJvcjogZnVuY3Rpb24obW9kZWwsIHhocikge1xuXHRcdFx0XHRcdHRoaXMudWkuZXJyb3JzLmh0bWwoXCI8c3BhbiBjbGFzcz1cXFwiZXJyb3JcXFwiXCIgKyBBcHAucGFyc2VSZXNwb25zZSh4aHIpLmRldGFpbCArIFwiPC9zcGFuPlwiKTtcblx0XHRcdFx0fSxcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHRoaXMucGVyY2VudGFnZSA9IDA7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHRjbGVhclRpbWVvdXQodGhpcy5sb2NrSW50ZXJ2YWwpO1xuXHRcdGNsZWFyVGltZW91dCh0aGlzLmR1ZUludGVydmFsKTtcblx0fSxcblxuXHRvblJlc291cmNlQ2xpY2s6IGZ1bmN0aW9uKGUpIHtcblx0XHRpZiAobXVsdGlzZWxlY3QgfHwgbXNTdGF0ZSkge1xuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdFx0bHBSYWRpby50cmlnZ2VyKEV2ZW50cy5Ob2RlU2VsZWN0T3ZlciwgdGhpcy5tb2RlbCwgIXRoaXMubW9kZWwuZ2V0KFwibXVsdGlzZWxlY3RpbmdcIikpO1xuXHRcdH1cblx0fSxcblxuXHRnZXRFcnJvck1lc3NhZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdGlmIChfLnZhbHVlcyh0aGlzLm1vZGVsLmdldChcImVycm9yc1wiKSkubGVuZ3RoID4gMCkge1xuXHRcdFx0cmV0dXJuIF8udmFsdWVzKHRoaXMubW9kZWwuZ2V0KFwiZXJyb3JzXCIpKS5qb2luKFwiLiBcIikgKyBcIiBUaGlzIGZpbGUgd2lsbCBiZSBza2lwcGVkIGR1cmluZyB0aGUgdXBsb2FkLiBDbGljayBlcnJvciBidXR0b24gdG8gcmVtb3ZlIGl0IGZyb20gdGhlIGxpc3QuXCIgK1xuXHRcdFx0XHQodGhpcy5tb2RlbC5nZXQoXCJjYXRlZ29yeVwiKSA9PT0gXCJ1bmtub3duXCIgPyBcIiBUaGUgc3VwcG9ydGVkIGZpbGUgdHlwZXMgYXJlIGV4Y2VsLCBwb3dlcnBvaW50LCB3b3JkLCB2aWRlbywgcGRmLCBhdWRpbywgaW1hZ2UsIHRleHQsIGNzdiBmbGFzaGNhcmQgZGVjay5cIiA6IFwiXCIpO1xuXHRcdH1cblxuXHRcdHJldHVybiBcIlwiO1xuXHR9LFxuXG5cdG9uQ2hlY2tib3hDbGljazogZnVuY3Rpb24oZSkge1xuXHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRscFJhZGlvLnRyaWdnZXIoRXZlbnRzLk5vZGVTZWxlY3RPdmVyLCB0aGlzLm1vZGVsLCB0aGlzLnVpLmNoZWNrYm94LnByb3AoXCJjaGVja2VkXCIpKTtcblx0fSxcblxuXHRvblBhcmVudExvY2tDaGFuZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMubW9kZWwuc2V0KHtcblx0XHRcdGxvY2tlZDogdGhpcy5tb2RlbC5nZXQoXCJwYXJlbnRMb2NrZWRcIiksXG5cdFx0XHRhY3RpdmF0aW9uRGF0ZTogdGhpcy5tb2RlbC5nZXQoXCJwYXJlbnRBY3RpdmF0aW9uXCIpLFxuXHRcdH0pO1xuXHR9LFxuXG5cdG9uUGFyZW50VmlzaWJsZUNoYW5nZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5tb2RlbC5zZXQoe1xuXHRcdFx0dmlzaWJsZTogdGhpcy5tb2RlbC5nZXQoXCJwYXJlbnRWaXNpYmxlXCIpLFxuXHRcdH0pO1xuXHR9LFxuXG5cdG9uUHJvZ3Jlc3NDaGFuZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdGlmIChjYW5FZGl0KCkgfHwgKGVkaXRTdGF0ZXMudmlld01vZGUgJiYgdGhpcy5tb2RlbC5nZXQoXCJpc1Rhc2tcIikgJiYgdGhpcy5tb2RlbC5nZXQoXCJwcm9ncmVzc1wiKSA+IDApKSB7XG5cdFx0XHR0aGlzLnVpLm9wdGlvbnMucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0dGhpcy51aS5wcm9ncmVzc0luZGljYXRvci5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy51aS5vcHRpb25zLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHRoaXMudWkucHJvZ3Jlc3NJbmRpY2F0b3IuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblx0fSxcblxuXHRvbkludmlzaWJpbGl0eUNsb2FrOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJpbnZpc2libGVcIikpXG5cdFx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy4kZWwucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdHN0YXJ0TXVsdGlzZWxlY3Q6IGZ1bmN0aW9uKGUpIHtcblx0XHRjb25zdCB3aGl0ZWxpc3QgPSBbXTtcblx0XHRpZiAoIW11bHRpc2VsZWN0ICYmIGUuY3VycmVudFRhcmdldCAhPT0gZS50YXJnZXQgJiYgIV8uc29tZSh3aGl0ZWxpc3QsIHggPT4gZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKHgpKSlcblx0XHRcdHJldHVybjtcblxuXHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRscFJhZGlvLnRyaWdnZXIoRXZlbnRzLk11bHRpc2VsZWN0U3RhcnQsIHRoaXMubW9kZWwpO1xuXHR9LFxuXG5cdG9uTXVsdGlTZWxlY3RpbmdDaGFuZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcIm11bHRpc2VsZWN0aW5nXCIpKSB7XG5cdFx0XHR0aGlzLnVpLnJlc291cmNlSW5mby5hZGRDbGFzcyhcIm11bHRpc2VsZWN0aW5nXCIpO1xuXHRcdFx0dGhpcy51aS5jaGVja2JveC5wcm9wKFwiY2hlY2tlZFwiLCB0cnVlKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLnVpLnJlc291cmNlSW5mby5yZW1vdmVDbGFzcyhcIm11bHRpc2VsZWN0aW5nXCIpO1xuXHRcdFx0dGhpcy51aS5jaGVja2JveC5wcm9wKFwiY2hlY2tlZFwiLCBmYWxzZSk7XG5cdFx0fVxuXHR9LFxuXG5cdG5vZGVTZWxlY3RMaXN0ZW46IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJGVsLm9mZihcIm1vdXNlbW92ZS5tdWx0aXNlbGVjdFwiKTtcblx0XHR0aGlzLiRlbC5vbihcIm1vdXNlbW92ZS5tdWx0aXNlbGVjdFwiLCBlID0+IHtcblx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRcdGlmIChtc1N0YXRlID09PSAzKVxuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdGl0ZW1EcmFnSGl0ID0gdGhpcy5tb2RlbC5pZDtcblxuXHRcdFx0bHBSYWRpby50cmlnZ2VyKEV2ZW50cy5Ob2RlU2VsZWN0T3ZlciwgdGhpcy5tb2RlbCk7XG5cdFx0fSk7XG5cdH0sXG5cblx0bm9kZVNlbGVjdEVuZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy4kZWwub2ZmKFwibW91c2Vtb3ZlLm11bHRpc2VsZWN0XCIpO1xuXHR9LFxuXG5cdG9uT3B0aW9uc0NsaWNrOiBmdW5jdGlvbihlKSB7XG5cdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcImVkaXRNb2RlXCIpKVxuXHRcdFx0JChcImFbZGF0YS1pdGVtPSdlZGl0J11cIiwgdGhpcy51aS50b29sYmFyKS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0ZWxzZVxuXHRcdFx0JChcImFbZGF0YS1pdGVtPSdlZGl0J11cIiwgdGhpcy51aS50b29sYmFyKS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cblx0XHQvLyBTZXQgdGhlIG9wdGlvbnNcblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJ2aXNpYmxlXCIpKVxuXHRcdFx0JChcImE6bnRoLWNoaWxkKDMpIGlcIiwgdGhpcy51aS50b29sYmFyKS5hZGRDbGFzcyhcImZhLWV5ZS1zbGFzaFwiKS5yZW1vdmVDbGFzcyhcImZhLWV5ZVwiKS5hdHRyKFwidGl0bGVcIiwgXCJIaWRlXCIpO1xuXHRcdGVsc2Vcblx0XHRcdCQoXCJhOm50aC1jaGlsZCgzKSBpXCIsIHRoaXMudWkudG9vbGJhcikucmVtb3ZlQ2xhc3MoXCJmYS1leWUtc2xhc2hcIikuYWRkQ2xhc3MoXCJmYS1leWVcIikuYXR0cihcInRpdGxlXCIsIFwiU2hvd1wiKTtcblxuXHRcdGlmIChlZGl0U3RhdGVzLnZpZXdNb2RlICYmIHRoaXMubW9kZWwuZ2V0KFwiaXNUYXNrXCIpICYmIHRoaXMubW9kZWwuZ2V0KFwicHJvZ3Jlc3NcIikgPiAwKSB7XG5cdFx0XHQkKFwiYVwiLCB0aGlzLnVpLnRvb2xiYXIpLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdCQoXCJhW2RhdGEtaXRlbT0ncmVzZXQnXVwiLCB0aGlzLnVpLnRvb2xiYXIpLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoIWVkaXRTdGF0ZXMudmlld01vZGUpIHtcblx0XHRcdCQoXCJhXCIsIHRoaXMudWkudG9vbGJhcikucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0JChcImFbZGF0YS1pdGVtPSdyZXNldCddXCIsIHRoaXMudWkudG9vbGJhcikuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5hdHRhY2htZW50IHx8ICEodGhpcy5hdHRhY2htZW50LmhhcyhcImJhc2VDb2RlXCIpICYmICh0aGlzLmF0dGFjaG1lbnQuZ2V0KFwic2V0dGluZ3NcIikgfHwgeyBjb2RlOiBcIlwiIH0pLmNvZGUpKVxuXHRcdFx0JChcImFbZGF0YS1pdGVtPSdjb2RlJ11cIiwgdGhpcy51aS50b29sYmFyKS5hZGRDbGFzcyhcImhpZGVcIik7XG5cblx0XHQkKFwiYm9keVwiKS50cmlnZ2VyKFwiY2xpY2tcIik7XG5cblx0XHQvLyBHZW5lcmF0ZSB0aGUgdG9vbGJhciBmb3IgdGhlIGN1cnJlbnQgc3RhdGVcblx0XHR0aGlzLnVpLm9wdGlvbnMudG9vbGJhcih7XG5cdFx0XHRjb250ZW50OiAkKFwiLnRvb2xiYXJcIiwgdGhpcy5lbCksXG5cdFx0XHRhdXRvU2hvdzogdHJ1ZSxcblx0XHRcdHBvc2l0aW9uOiBcImJvdHRvbVwiLFxuXHRcdFx0aGlkZU9uQ2xpY2s6IHRydWUsXG5cdFx0XHRjbG9zZU9uSXRlbUNsaWNrOiB0cnVlLFxuXHRcdFx0ZXZlbnQ6IFwiY2xpY2tcIixcblx0XHRcdGhvc3Q6IFwiI2xpbmstcmVzb3VyY2VzXCIsXG5cdFx0XHRzdHlsZTogXCJkYXJrXCIsXG5cdFx0XHRkZXN0cm95T25DbG9zZTogdHJ1ZSxcblx0XHR9KTtcblxuXHRcdCQoXCIubGVhcm5pbmdfcGF0aC1tYW5hZ2VyXCIpLm9uZShcInNjcm9sbFwiLCAoKSA9PiB7XG5cdFx0XHQkKFwiYm9keVwiKS50cmlnZ2VyKFwiY2xpY2tcIik7XG5cdFx0fSk7XG5cblx0XHR0aGlzLnVpLm9wdGlvbnMub2ZmKFwidG9vbGJhckl0ZW1DbGljay5tYWluXCIpO1xuXHRcdHRoaXMudWkub3B0aW9ucy5vbmUoXCJ0b29sYmFySXRlbUNsaWNrLm1haW5cIiwgKGV2dCwgaXRlbSkgPT4ge1xuXHRcdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0XHRjb25zdCBkYXRhID0gJChpdGVtKS5kYXRhKFwiaXRlbVwiKTtcblxuXHRcdFx0c3dpdGNoIChkYXRhKSB7XG5cdFx0XHRcdGNhc2UgXCJlZGl0XCI6IHJldHVybiB0aGlzLm9uRWRpdENsaWNrKGV2dCk7XG5cdFx0XHRcdGNhc2UgXCJ2aXNpYmlsaXR5XCI6IHJldHVybiB0aGlzLm9uSGlkZUNsaWNrKGV2dCk7XG5cdFx0XHRcdGNhc2UgXCJncm91cHNcIjogcmV0dXJuIHRoaXMub25Hcm91cENsaWNrKGV2dCk7XG5cdFx0XHRcdGNhc2UgXCJjb2RlXCI6IHJldHVybiB0aGlzLm9uU2hvd0NvZGVDbGljayhldnQpO1xuXHRcdFx0XHRjYXNlIFwib3BlblwiOiByZXR1cm4gdGhpcy5vbk9wZW5JdGVtQ2xpY2soZXZ0KTtcblx0XHRcdFx0Y2FzZSBcImRlbGV0ZVwiOiByZXR1cm4gdGhpcy5vbkRlbGV0ZUNsaWNrKGV2dCk7XG5cdFx0XHRcdGNhc2UgXCJyZXNldFwiOiByZXR1cm4gdGhpcy5vblJlc2V0Q2xpY2soZXZ0KTtcblx0XHRcdFx0Y2FzZSBcImNoYXJ0XCI6IHJldHVybiB0aGlzLm9uUmVzb3VyY2VPcGVuZWRDbGljayhldnQpO1xuXHRcdFx0XHRkZWZhdWx0OiByZXR1cm47XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQkKFwiLnRvb2wtaXRlbVtkYXRhLWl0ZW09Z3JvdXBzXVwiKS5vbihcIm1vdXNlb3ZlclwiLCAoKSA9PiB7XG5cdFx0XHR0aGlzLnVpLmN1c3RvbUdyb3Vwcy5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0fSk7XG5cblx0XHQkKFwiLnRvb2wtaXRlbVtkYXRhLWl0ZW09Z3JvdXBzXVwiKS5vbihcIm1vdXNlb3V0XCIsICgpID0+IHtcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRpZiAoIXRoaXMuc2hvd0xpc3QpXG5cdFx0XHRcdFx0dGhpcy51aS5jdXN0b21Hcm91cHMuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0fSwgNTAwMCk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLnVpLmN1c3RvbUdyb3Vwcy5vbihcIm1vdXNlb3ZlclwiLCAoKSA9PiB7XG5cdFx0XHR0aGlzLnNob3dMaXN0ID0gdHJ1ZTtcblx0XHRcdHRoaXMudWkuY3VzdG9tR3JvdXBzLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR9KTtcblxuXHRcdHRoaXMudWkuY3VzdG9tR3JvdXBzLm9uKFwibW91c2VvdXRcIiwgKCkgPT4ge1xuXHRcdFx0dGhpcy5zaG93TGlzdCA9IGZhbHNlO1xuXHRcdFx0dGhpcy51aS5jdXN0b21Hcm91cHMuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH0pO1xuXHR9LFxuXG5cdG9uUmVzZXRDbGljazogZnVuY3Rpb24oZSkge1xuXHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJwcm9ncmVzc1wiKSA9PT0gbnVsbCB8fCB0aGlzLm1vZGVsLmdldChcInByb2dyZXNzXCIpID09PSAwKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0Y29uc3QgbW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHR3YXJuaW5nOiB0cnVlLFxuXHRcdFx0dGl0bGU6IFwiPHNwYW4gY2xhc3M9J2ZhbCBmYS1zeW5jLWFsdCcvPiBSZXNldCBVc2VyIFByb2dyZXNzXCIsXG5cdFx0XHRib2R5OiBgUHJvZ3Jlc3Mgb24gdGhpcyBpdGVtIGFuZCBhbnkgc3ViLWl0ZW1zIHdpbGwgYmUgcmVzZXQgZm9yIHRoZSBjaG9zZW4gbGVhcm5lci48YnIvPjxici8+XG5cdFx0XHRcdFByb3ZpZGUgYSBjb21tZW50IHRoYXQgd2lsbCB0ZWxsIHRoZSBsZWFybmVyIHdoeSBwcm9ncmVzcyB3YXMgcmVzZXQuPGlucHV0IHR5cGU9J3RleHQnIHBsYWNlaG9sZGVyPSdDb21tZW50Jz5gLFxuXHRcdFx0aG9zdDogXCIjbGluay1yZXNvdXJjZXNcIixcblx0XHR9KTtcblxuXHRcdG1vZGFsLm9uKFwiYnV0dG9uOm9rXCIsICgpID0+IHtcblx0XHRcdC8vIFJlc2V0IHRoZSBzdGF0ZSBmb3IgdGhlIGdpdmVuIGl0ZW0gYW5kIGFsbCBjaGlsZHJlblxuXHRcdFx0JC5hamF4KHtcblx0XHRcdFx0bWV0aG9kOiBcIlBVVFwiLFxuXHRcdFx0XHRkYXRhOiB7XG5cdFx0XHRcdFx0Y29tbWVudDogJChcImlucHV0XCIsIG1vZGFsLmVsKS52YWwoKSxcblx0XHRcdFx0fSxcblx0XHRcdFx0dXJsOiBgJHtzZXR0aW5ncy51cmxSb290fS9hY2FjaWEvbGVhcm5pbmdQYXRocy9pdGVtcy8ke3RoaXMubW9kZWwuaWR9L3N0YXRlLyR7dmlld2luZ1VzZXJ9YCxcblx0XHRcdFx0ZXJyb3I6IGVyciA9PiBjb25zb2xlLmVycm9yKGVyciksXG5cdFx0XHRcdHN1Y2Nlc3M6IGRhdGEgPT4ge1xuXHRcdFx0XHRcdF8uZWFjaChkYXRhLCB4ID0+IHRhc2tNYXBbeC5faWRdLnNldCh7IHByb2dyZXNzOiAwIH0pKTtcblx0XHRcdFx0fSxcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0bW9kYWwuc2hvdygpO1xuXHR9LFxuXG5cdG9uTW92aW5nQ2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJtb3ZpbmdcIikpXG5cdFx0XHR0aGlzLnNob3dPdmVybGF5KFwic2F2aW5nXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuaGlkZU92ZXJsYXkoKTtcblx0fSxcblxuXHR2YWxpZGF0aW9uRmFpbGVkOiBmdW5jdGlvbigpIHtcblx0XHRsZXQgbXNnID0gXCIxIFRoZXJlIHdlcmUgb25lIG9yIG1vcmUgZXJyb3JzOlxcblwiO1xuXG5cdFx0Xy5lYWNoKHRoaXMubW9kZWwudmFsaWRhdGlvbkVycm9yLCBpdGVtID0+IHtcblx0XHRcdG1zZyArPSBcIlxcbiogXCIgKyBpdGVtO1xuXHRcdH0pO1xuXG5cdFx0Y29uc29sZS5lcnJvcihtc2cpO1xuXHR9LFxuXG5cdG9uU2F2ZUJlZ2luOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNob3dPdmVybGF5KFwic2F2aW5nXCIpO1xuXHR9LFxuXG5cdG9uU2F2ZUVuZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5oaWRlT3ZlcmxheSgpO1xuXG5cdFx0dGhpcy51aS5yZXNvdXJjZUluZm8uYWRkQ2xhc3MoYGlkLSR7dGhpcy5tb2RlbC5nZXQoXCJfaWRcIil9YCk7XG5cblx0XHQvLyBDcmVhdGUgYSBmYWtlIGF0dGFjaG1lbnQgc28gdGhhdCB0aGUgVUkgc2hvd3MgdGhlIHJpZ2h0IG9wdGlvblxuXHRcdGlmICghdGhpcy5hdHRhY2htZW50ICYmICh0aGlzLm1vZGVsLmdldChcInNldHRpbmdzXCIpIHx8IHt9KS5jb2RlKVxuXHRcdFx0dGhpcy5hdHRhY2htZW50ID0gbmV3IEJhY2tib25lLk1vZGVsKHsgYmFzZUNvZGU6IHRoaXMubW9kZWwuZ2V0KFwiYmFzZUNvZGVcIiksIHNldHRpbmdzOiB0aGlzLm1vZGVsLmdldChcInNldHRpbmdzXCIpIH0pO1xuXHR9LFxuXG5cdG9uU2F2ZUVycm9yOiBmdW5jdGlvbihtb2RlbCwgeGhyKSB7XG5cdFx0dGhpcy5oaWRlT3ZlcmxheSgpO1xuXG5cdFx0Y29uc3QgbWVzc2FnZSA9IHhoci5yZXNwb25zZUpTT04gJiYgKHhoci5yZXNwb25zZUpTT04uZGV0YWlsIHx8IHhoci5yZXNwb25zZUpTT04uaW5mbykgPyAoeGhyLnJlc3BvbnNlSlNPTi5kZXRhaWwgfHwgeGhyLnJlc3BvbnNlSlNPTi5pbmZvKSA6IFwiVGhlcmUgd2FzIGFuIGVycm9yIHNhdmluZ1wiO1xuXG5cdFx0Y29uc3QgbW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHR3YXJuaW5nOiB0cnVlLFxuXHRcdFx0Y3VzdG9tT0s6IFwiQ2xvc2VcIixcblx0XHRcdGhpZGVCdXR0b25zOiBbXCJjYW5jZWxcIl0sXG5cdFx0XHRib2R5OiBtZXNzYWdlLFxuXHRcdFx0dGl0bGU6IFwiRXJyb3JcIixcblx0XHRcdGhvc3Q6IFwiI2xpbmstcmVzb3VyY2VzXCIsXG5cdFx0fSk7XG5cblx0XHRtb2RhbC5zaG93KCk7XG5cdH0sXG5cblx0c2hvd092ZXJsYXk6IGZ1bmN0aW9uKHR5cGUpIHtcblx0XHQvL0FjY2VwdHMgXCJzYXZpbmdcIlxuXHRcdC8vQWRkIG1vcmUgaWYgcmVxdWlyZWRcblx0XHQkKFwiLm92ZXJsYXktbWVzc2FnZVwiLCB0aGlzLnVpLm92ZXJsYXkpLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLm92ZXJsYXkucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0aWYgKHR5cGUpXG5cdFx0XHR0aGlzLnVpW1wib3ZlcmxheVwiICsgXy51cHBlckZpcnN0KHR5cGUpXS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0aGlkZU92ZXJsYXk6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkub3ZlcmxheS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0b25BdHRhY2g6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLm1vZGVsLmlzTmV3KCkpXG5cdFx0XHR0aGlzLiRlbC5nZXQoMCkuc2Nyb2xsSW50b1ZpZXcoKTtcblxuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcImVkaXRNb2RlXCIpKSB7XG5cdFx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJlZGl0XCIsIG5ldyBSZXNvdXJjZUVkaXQoeyBtb2RlbDogdGhpcy5tb2RlbCB9KSk7XG5cdFx0XHRpZiAodGhpcy5zdGFydE5vZGVFZGl0KVxuXHRcdFx0XHR0aGlzLnN0YXJ0Tm9kZUVkaXQoKTtcblx0XHR9XG5cdH0sXG5cblx0b25FZGl0Q2hhbmdlOiBmdW5jdGlvbih0b2dnbGUpIHtcblx0XHRpZiAodG9nZ2xlKSB7XG5cdFx0XHRpZiAoIWN1cnJlbnRFZGl0TW9kZWxJZCAmJiB0aGlzLnVpLm9wdGlvbnMucmVtb3ZlQ2xhc3MpXG5cdFx0XHRcdHRoaXMudWkub3B0aW9ucy5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cblx0XHRcdHRoaXMubW9kZWwuc2V0KHsgaW52aXNpYmxlOiBmYWxzZSB9KTtcblx0XHRcdHRoaXMudWkucHJvZ3Jlc3NJbmRpY2F0b3IuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5jYW5jZWxOb2RlRWRpdCgpO1xuXG5cdFx0aWYgKCEodGhpcy5tb2RlbC5nZXQoXCJwcm9ncmVzc1wiKSA+IDApIHx8ICFlZGl0U3RhdGVzLnZpZXdNb2RlIHx8ICF0aGlzLm1vZGVsLmdldChcImlzVGFza1wiKSlcblx0XHRcdHRoaXMudWkub3B0aW9ucy5hZGRDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0ZWRpdGluZ1N0YXJ0OiBmdW5jdGlvbihpdGVtKSB7XG5cdFx0aWYgKGl0ZW0gIT09IHRoaXMubW9kZWwuaWQpXG5cdFx0XHR0aGlzLnVpLm9wdGlvbnMuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdGVkaXRpbmdFbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkub3B0aW9ucy5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMub25FZGl0Q2hhbmdlKGNhbkVkaXQoKSk7XG5cblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJlZGl0TW9kZVwiKSAmJiB0aGlzLnVpLmVkaXRCdG4pXG5cdFx0XHRfLmRlbGF5KCgpID0+IHRoaXMudWkuZWRpdEJ0bi5jbGljaygpLCA1MCk7XG5cblx0XHRCYWNrYm9uZS5NYXJpb25ldHRlLmJpbmRFdmVudHModGhpcywgZXZlbnRCdXMsIHRoaXMucmVzb3VyY2VFdmVudHMpO1xuXG5cdFx0aWYgKHRoaXMubW9kZWwuaXNOZXcoKSlcblx0XHRcdHRoaXMuc2hvd092ZXJsYXkoKTtcblxuXHRcdGNvbnN0IGQgPSB0aGlzLm1vZGVsLmdldChcImRlcHRoXCIpO1xuXHRcdHRoaXMudWkuY2hlY2tib3hDb250YWluZXIuY3NzKHsgbGVmdDogYC0kezIwICsgKChkIC0gMSkgKiAzMCl9cHhgIH0pO1xuXG5cdFx0aWYgKF8udmFsdWVzKHRoaXMubW9kZWwuZ2V0KFwiZXJyb3JzXCIpKS5sZW5ndGggPiAwKVxuXHRcdFx0dGhpcy51aS5vcHRpb25zLnJlbW92ZSgpO1xuXHR9LFxuXG5cdG9uRG9tUmVmcmVzaDogZnVuY3Rpb24oKSB7XG5cdFx0dGlwcHkodGhpcy4kZWwuZ2V0KDApLnF1ZXJ5U2VsZWN0b3JBbGwoXCIuZmEtY29nXCIpLCB7XG5cdFx0XHRkdXJhdGlvbjogMCxcblx0XHRcdGFuaW1hdGlvbjogXCJmYWRlXCIsXG5cdFx0XHRwbGFjZW1lbnQ6IFwidG9wXCIsXG5cdFx0XHRmbGlwOiBmYWxzZSxcblx0XHRcdGFycm93OiB0cnVlLFxuXHRcdFx0ZGlzdGFuY2U6IDI1LFxuXHRcdH0pO1xuXG5cdFx0dGlwcHkodGhpcy4kZWwuZ2V0KDApLnF1ZXJ5U2VsZWN0b3JBbGwoXCIudXBsb2FkLWJ0blwiKSwge1xuXHRcdFx0ZHVyYXRpb246IDAsXG5cdFx0XHRhbmltYXRpb246IFwiZmFkZVwiLFxuXHRcdFx0cGxhY2VtZW50OiBcInRvcFwiLFxuXHRcdFx0ZmxpcDogZmFsc2UsXG5cdFx0XHRhcnJvdzogdHJ1ZSxcblx0XHRcdGRpc3RhbmNlOiAyNSxcblx0XHR9KTtcblxuXHRcdHRoaXMuc2V0TG9ja0V4cGlyeSgpO1xuXHRcdHRoaXMuc2V0RHVlRXhwaXJ5KCk7XG5cdH0sXG5cblx0c2V0TG9ja0V4cGlyeTogZnVuY3Rpb24oKSB7XG5cdFx0Y2xlYXJUaW1lb3V0KHRoaXMubG9ja0ludGVydmFsKTtcblxuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcImFjdGl2YXRpb25EYXRlXCIpID4gbW9tZW50KCkudW5peCgpKSB7XG5cdFx0XHRjb25zdCB3YWl0ID0gdGhpcy5tb2RlbC5nZXQoXCJhY3RpdmF0aW9uRGF0ZVwiKSAtIG1vbWVudCgpLnVuaXgoKSArIDI7XG5cblx0XHRcdHRoaXMubG9ja0ludGVydmFsID0gc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRcdHRoaXMub25Mb2NrZWRTdGF0dXNDaGFuZ2UoKTtcblx0XHRcdFx0dGhpcy5vbkxvY2tlZENoYW5nZSgpO1xuXHRcdFx0fSwgd2FpdCAqIDEwMDApO1xuXHRcdH1cblx0fSxcblxuXHRzZXREdWVFeHBpcnk6IGZ1bmN0aW9uKCkge1xuXHRcdGNsZWFyVGltZW91dCh0aGlzLmR1ZUludGVydmFsKTtcblxuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcImlzVGFza1wiKSAmJiB0aGlzLm1vZGVsLmdldChcImR1ZURhdGVcIikgPiBtb21lbnQoKS51bml4KCkpIHtcblx0XHRcdGNvbnN0IHdhaXQgPSB0aGlzLm1vZGVsLmdldChcImR1ZURhdGVcIikgLSBtb21lbnQoKS51bml4KCkgKyAyO1xuXHRcdFx0dGhpcy5kdWVJbnRlcnZhbCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLm9uRHVlQ2hhbmdlKCk7XG5cdFx0XHR9LCB3YWl0ICogMTAwMCk7XG5cdFx0fVxuXHR9LFxuXG5cdG9uRGVwdGhDaGFuZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIFJlcG9zaXRpb24gc29tZSBpdGVtcyBiYXNlZCBvbiB0aGUgZGVwdGhcblx0XHRjb25zdCBkID0gdGhpcy5tb2RlbC5nZXQoXCJkZXB0aFwiKTtcblx0XHR0aGlzLnVpLmNoZWNrYm94Q29udGFpbmVyLmNzcyh7IGxlZnQ6IGAtJHsyNyArICgoZCAtIDEpICogMzApfXB4YCB9KTtcblx0fSxcblxuXHRvbkVkaXRNb2RlQ2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbCAmJiB0aGlzLm1vZGVsLmdldChcImVkaXRNb2RlXCIpKVxuXHRcdFx0dGhpcy51aS5yZXNvdXJjZUluZm8ucmVtb3ZlQXR0cihcImRyYWdnYWJsZVwiKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnVpLnJlc291cmNlSW5mby5hdHRyKFwiZHJhZ2dhYmxlXCIsIHRydWUpO1xuXHR9LFxuXG5cdG9uRHVlQ2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJpc1Rhc2tcIikgJiYgdGhpcy5tb2RlbC5nZXQoXCJkdWVEYXRlXCIpID4gbW9tZW50KCkudW5peCgpKSB7XG5cdFx0XHR0aGlzLnVpLmR1ZUNvbnRhaW5lclxuXHRcdFx0XHQucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpXG5cdFx0XHRcdC5odG1sKGA8c3Ryb25nPkR1ZSBvbjogPC9zdHJvbmc+ICR7bW9tZW50LnVuaXgodGhpcy5tb2RlbC5nZXQoXCJkdWVEYXRlXCIpKS5mb3JtYXQoZGF0ZUZvcm1hdCl9YCk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy51aS5kdWVDb250YWluZXIuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblxuXHRcdHRoaXMuc2V0RHVlRXhwaXJ5KCk7XG5cdH0sXG5cblx0b25Mb2NrZWRDaGFuZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghdGhpcy5tb2RlbC5nZXQoXCJsb2NrZWRcIikgJiYgKCF0aGlzLm1vZGVsLmdldChcImFjdGl2YXRpb25EYXRlXCIpIHx8IHRoaXMubW9kZWwuZ2V0KFwiYWN0aXZhdGlvbkRhdGVcIikgPCBtb21lbnQoKS51bml4KCkpKSB7XG5cdFx0XHR0aGlzLnVpLmNvbm5lY3Rvci5yZW1vdmVDbGFzcyhcImxvY2tlZC1jb25uZWN0aW9uXCIpO1xuXHRcdFx0dGhpcy51aS5sb2NrZWRMaW5lLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLnVpLmNvbm5lY3Rvci5hZGRDbGFzcyhcImxvY2tlZC1jb25uZWN0aW9uXCIpO1xuXHRcdFx0dGhpcy51aS5sb2NrZWRMaW5lLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR9XG5cblx0XHR0aGlzLnNldExvY2tFeHBpcnkoKTtcblx0fSxcblxuXHRvbkxvY2tlZFN0YXR1c0NoYW5nZTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLm1vZGVsLmdldChcImxvY2tlZFwiKSAmJiAoIXRoaXMubW9kZWwuZ2V0KFwiYWN0aXZhdGlvbkRhdGVcIikgfHwgdGhpcy5tb2RlbC5nZXQoXCJhY3RpdmF0aW9uRGF0ZVwiKSA8IG1vbWVudCgpLnVuaXgoKSkpXG5cdFx0XHR0aGlzLnVpLmxvY2tJbmRpY2F0b3IuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMudWkubG9ja0luZGljYXRvci5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJhY3RpdmF0aW9uRGF0ZVwiKSA+IG1vbWVudCgpLnVuaXgoKSkge1xuXHRcdFx0dGhpcy51aS5hY3RpdmF0aW9uQ29udGFpbmVyXG5cdFx0XHRcdC5yZW1vdmVDbGFzcyhcImhpZGVcIilcblx0XHRcdFx0Lmh0bWwoYDxzdHJvbmc+TG9ja2VkIHVudGlsOiA8L3N0cm9uZz4gJHttb21lbnQudW5peCh0aGlzLm1vZGVsLmdldChcImFjdGl2YXRpb25EYXRlXCIpKS5mb3JtYXQoZGF0ZUZvcm1hdCl9YCk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy51aS5hY3RpdmF0aW9uQ29udGFpbmVyLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR9XG5cblx0XHR0aGlzLnNldExvY2tFeHBpcnkoKTtcblx0fSxcblxuXHRvblZpc2libGVTdGF0dXNDaGFuZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcInZpc2libGVcIikpIHtcblx0XHRcdC8vdGhpcy51aS5oaWRlQnRuLmFkZENsYXNzKFwiZmEtZXllXCIpLnJlbW92ZUNsYXNzKFwiZmEtZXllLXNsYXNoXCIpO1xuXHRcdFx0Ly9jb25zdCBub2RlID0gdGhpcy4kZWwuZ2V0KDApLnF1ZXJ5U2VsZWN0b3IoYCR7dGhpcy51aS5oaWRlQnRuLnNlbGVjdG9yfWApO1xuXHRcdFx0Ly9ub2RlLl90aXBweS5zZXRDb250ZW50KFwiSGlkZVwiKTtcblx0XHRcdHRoaXMudWkudmlzaWJpbGl0eUluZGljYXRvci5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0Ly90aGlzLnVpLmhpZGVCdG4uYWRkQ2xhc3MoXCJmYS1leWUtc2xhc2hcIikucmVtb3ZlQ2xhc3MoXCJmYS1leWVcIik7XG5cdFx0XHQvL2NvbnN0IG5vZGUgPSB0aGlzLiRlbC5nZXQoMCkucXVlcnlTZWxlY3RvcihgJHt0aGlzLnVpLmhpZGVCdG4uc2VsZWN0b3J9YCk7XG5cdFx0XHQvL25vZGUuX3RpcHB5LnNldENvbnRlbnQoXCJTaG93XCIpO1xuXHRcdFx0dGhpcy51aS52aXNpYmlsaXR5SW5kaWNhdG9yLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR9XG5cdH0sXG5cblx0b25IaWRlQ2xpY2s6IGZ1bmN0aW9uKGUpIHtcblx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0aWYgKHRoaXMubW9kZWwuaXNOZXcoKSlcblx0XHRcdHJldHVybiB0aGlzLm1vZGVsLnNldCh7IHZpc2libGU6ICF0aGlzLm1vZGVsLmdldChcInZpc2libGVcIikgfSk7XG5cblx0XHRjb25zdCBvcHRzID0geyB2aXNpYmxlOiAhdGhpcy5tb2RlbC5nZXQoXCJ2aXNpYmxlXCIpIH07XG5cblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJsb2NrZWRcIikgfHwgKCF0aGlzLm1vZGVsLmdldChcImxvY2tlZFwiKSAmJiB0aGlzLm1vZGVsLmdldChcImFjdGl2YXRpb25EYXRlXCIpICYmIHRoaXMubW9kZWwuZ2V0KFwiYWN0aXZhdGlvbkRhdGVcIikgPCBtb21lbnQoKS51bml4KCkpKVxuXHRcdFx0b3B0cy5hY3RpdmF0aW9uRGF0ZSA9IG51bGw7XG5cblx0XHR0aGlzLm1vZGVsLnNhdmUob3B0cywge1xuXHRcdFx0dXJsOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYWNhY2lhL2xlYXJuaW5nUGF0aHMvaXRlbXMvdG9nZ2xlVmlzaWJpbGl0eS9cIiArIHRoaXMubW9kZWwuaWQsXG5cdFx0XHR3YWl0OiB0cnVlLFxuXHRcdFx0cGF0Y2g6IHRydWUsXG5cdFx0fSk7XG5cdH0sXG5cblx0ZGVsZXRlUmVzb3VyY2VOb2RlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmRlc3Ryb3koKTtcblx0XHRscFJhZGlvLnRyaWdnZXIoRXZlbnRzLk5vZGVDaGFuZ2UpO1xuXHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLkF0dGFjaG1lbnRSZW1vdmVkLCB0aGlzLm1vZGVsKTtcblx0fSxcblxuXHRvbkRlbGV0ZUNsaWNrOiBmdW5jdGlvbihlKSB7XG5cdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGNvbnN0IG1vZGFsID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0d2FybmluZzogdHJ1ZSxcblx0XHRcdHRpdGxlOiBcIkRlbGV0ZSBJdGVtXCIsXG5cdFx0XHRib2R5OiBgVGhpcyB3aWxsIHBlcm1hbmVudGx5IGRlbGV0ZSBcIiR7dGhpcy5tb2RlbC5nZXQoXCJ0aXRsZVwiKX1cIiBmcm9tIHRoaXMgJHtzZXR0aW5ncy5sZWFybmluZ1BhdGhzQ3VzdG9tTmFtZX0uPGJyLz48YnIvPkFyZSB5b3Ugc3VyZT9gLFxuXHRcdH0pO1xuXG5cdFx0bW9kYWwub24oXCJidXR0b246b2tcIiwgKCkgPT4ge1xuXHRcdFx0dGhpcy5tb2RlbC5kZXN0cm95KHtcblx0XHRcdFx0d2FpdDogdHJ1ZSxcblx0XHRcdFx0c3VjY2VzczogKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuZGVsZXRlUmVzb3VyY2VOb2RlKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdG1vZGFsLnNob3coKTtcblx0fSxcblxuXHRvbkVkaXRDbGljazogZnVuY3Rpb24oZSkge1xuXHRcdGlmIChlKVxuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImVkaXRcIiwgbmV3IFJlc291cmNlRWRpdCh7IG1vZGVsOiB0aGlzLm1vZGVsIH0pKTtcblxuXHRcdGN1cnJlbnRFZGl0TW9kZWxJZCA9IHRoaXMubW9kZWwuaWQ7XG5cdFx0aWYgKHRoaXMudWkuZWRpdEFyZWEuc2xpZGVEb3duKVxuXHRcdFx0dGhpcy51aS5lZGl0QXJlYS5zbGlkZURvd24oNDAwKTtcblx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcImVkaXQtbW9kZVwiKTtcblx0XHR0aGlzLm1vZGVsLnNldCh7IGVkaXRNb2RlOiB0cnVlIH0pO1xuXHRcdGxwUmFkaW8udHJpZ2dlcihFdmVudHMuRWRpdGluZ1N0YXJ0ZWQsIHRoaXMubW9kZWwuaWQpO1xuXHR9LFxuXG5cdGNhbmNlbE5vZGVFZGl0OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm1vZGVsLnNldCh7IGVkaXRNb2RlOiBmYWxzZSB9KTtcblx0XHRjdXJyZW50RWRpdE1vZGVsSWQgPSBudWxsO1xuXHRcdGlmICh0aGlzLnVpLmVkaXRBcmVhLnNsaWRlVXApXG5cdFx0XHR0aGlzLnVpLmVkaXRBcmVhLnNsaWRlVXAoNDAwKTtcblx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyhcImVkaXQtbW9kZVwiKTtcblx0fSxcblxuXHRjb21wbGV0ZU5vZGVFZGl0OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm1vZGVsLnNldCh7IGVkaXRNb2RlOiBmYWxzZSB9KTtcblx0XHR0aGlzLnVpLmVkaXRBcmVhLnNsaWRlVXAoNDAwKTtcblx0XHRjdXJyZW50RWRpdE1vZGVsSWQgPSBudWxsO1xuXHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKFwiZWRpdC1tb2RlXCIpO1xuXHR9LFxuXG5cdHN0YXJ0UmVzb3VyY2VEcmFnOiBmdW5jdGlvbihlKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwuaXNOZXcoKSB8fCAhY2FuRWRpdCgpIHx8IHRoaXMubW9kZWwuZ2V0KFwiZWRpdE1vZGVcIikpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0aWYgKHdpbmRvdy5nZXRTZWxlY3Rpb24pIHtcblx0XHRcdGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKCkuZW1wdHkpXG5cdFx0XHRcdHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5lbXB0eSgpOyAvL0Nocm9tZVxuXHRcdFx0ZWxzZSBpZiAod2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcylcblx0XHRcdFx0d2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpOy8vRmlyZWZveFxuXHRcdFx0ZWxzZSBpZiAoZG9jdW1lbnQuc2VsZWN0aW9uKVxuXHRcdFx0XHRkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTsvL0lFXG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVzb3VyY2VEYXRhID0gdGhpcy5tb2RlbC50b0pTT04oKTtcblx0XHRyZXNvdXJjZURhdGEudmlldyA9IHRoaXM7XG5cblx0XHRjb25zdCBkcmFnZ2luZ05vZGUgPSBuZXcgRHJhZ2dpbmdFbGVtZW50KHsgbW9kZWw6IHRoaXMubW9kZWwgfSkucmVuZGVyKCk7XG5cdFx0Y29uc3QgZHJhZ2dpbmdFbGVtZW50ID0gZHJhZ2dpbmdOb2RlLiRlbFswXTtcblxuXHRcdGRyYWdnaW5nRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcblx0XHRkcmFnZ2luZ0VsZW1lbnQuc3R5bGUuekluZGV4ID0gMTAwMDtcblxuXHRcdGxwUmFkaW8udHJpZ2dlcihFdmVudHMuUmVzb3VyY2VEcmFnU3RhcnQsIHJlc291cmNlRGF0YSk7XG5cblx0XHQkKFwiYm9keVwiKS5hcHBlbmQoZHJhZ2dpbmdFbGVtZW50KTtcblxuXHRcdGNvbnN0IG1vdmVBdCA9IGV2ZW50ID0+IHtcblx0XHRcdGxwUmFkaW8udHJpZ2dlcihFdmVudHMuTm9kZURyYWdNb3ZlLCBldmVudCk7XG5cdFx0XHRkcmFnZ2luZ0VsZW1lbnQuc3R5bGUubGVmdCA9IChldmVudC5wYWdlWCkgKyBcInB4XCI7XG5cdFx0XHRkcmFnZ2luZ0VsZW1lbnQuc3R5bGUudG9wID0gKGV2ZW50LnBhZ2VZKSArIFwicHhcIjtcblx0XHR9O1xuXG5cdFx0bW92ZUF0KGUpO1xuXHRcdCQoXCJib2R5XCIpLm9uKFwibW91c2Vtb3ZlLmRyYWdnaW5nTm9kZVwiLCBtb3ZlQXQpO1xuXG5cdFx0Ly9IYW5kbGUgdGhlIHJlc291cmNlIGRyb3Bcblx0XHQkKFwiYm9keVwiKS5vbmUoXCJtb3VzZXVwLmVuZERyYWdcIiwgZXZlbnQgPT4ge1xuXHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHQkKFwiYm9keVwiKS5vZmYoXCJtb3VzZW1vdmUuZHJhZ2dpbmdOb2RlXCIpO1xuXHRcdFx0ZHJhZ2dpbmdFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZHJhZ2dpbmdFbGVtZW50KTtcblxuXHRcdFx0Y29uc3QgaXRlbXMgPSBfLmNvbmNhdCgkKFwiZGl2LnJlc291cmNlOnZpc2libGVcIikuZ2V0KCksICQoXCJkaXYudGFzay1ob3N0OnZpc2libGVcIikuZ2V0KCksICQoXCJkaXYucmVzb3VyY2UtaG9zdDp2aXNpYmxlXCIpLmdldCgpKTtcblxuXHRcdFx0Y29uc3QgeCA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQuY2xpZW50WDtcblx0XHRcdGNvbnN0IHkgPSBldmVudC5vcmlnaW5hbEV2ZW50LmNsaWVudFkgLSAodGhpcy5mdWxsc2NyZWVuZWQgPyAtNDUgOiAwKSArICQoXCIubGVhcm5pbmdfcGF0aC1tYW5hZ2VyIC50cmVlOmZpcnN0XCIpLmdldCgwKS5zY3JvbGxUb3AgKyB3aW5kb3cucGFnZVlPZmZzZXQ7XG5cblx0XHRcdGNvbnN0IGFjdHVhbCA9IF8uZmluZChpdGVtcywgaXRlbSA9PiB7XG5cdFx0XHRcdGNvbnN0IGVsZW1lbnQgPSAkKGl0ZW0pO1xuXG5cdFx0XHRcdGlmICghZWxlbWVudC5pc0luVmlld3BvcnQoKSlcblx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0Y29uc3Qgb2Zmc2V0ID0gZWxlbWVudC5vZmZzZXQoKTtcblxuXHRcdFx0XHRyZXR1cm4geSA+PSBvZmZzZXQudG9wICYmIHkgPD0gb2Zmc2V0LnRvcCArIGVsZW1lbnQub3V0ZXJIZWlnaHQodHJ1ZSkgJiZcblx0XHRcdFx0XHR4ID49IG9mZnNldC5sZWZ0ICYmIHggPD0gb2Zmc2V0LmxlZnQgKyBlbGVtZW50Lm91dGVyV2lkdGgodHJ1ZSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKGFjdHVhbClcblx0XHRcdFx0JChhY3R1YWwpLnRyaWdnZXIoXCJkcm9wcmVzb3VyY2VcIik7XG5cblx0XHRcdGxwUmFkaW8udHJpZ2dlcihFdmVudHMuTm9kZURyYWdFbmQsIHRoaXMpO1xuXHRcdFx0bHBSYWRpby50cmlnZ2VyKEV2ZW50cy5SZXNvdXJjZURyYWdFbmQpO1xuXHRcdH0pO1xuXHR9LFxuXG5cdHJlc291cmNlRHJhZ0xpc3RlbjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy4kZWwub24oXCJtb3VzZW1vdmVcIiwgZSA9PiB7XG5cdFx0XHRpZiAoZHJhZ2dpbmdSZXNvdXJjZSkge1xuXHRcdFx0XHRjb25zdCBkcmFnWSA9IGUub3JpZ2luYWxFdmVudC5wYWdlWTtcblxuXHRcdFx0XHRjb25zdCBlbE9mZnNldCA9IHRoaXMuJGVsLm9mZnNldCgpO1xuXHRcdFx0XHRjb25zdCBlbFRvcCA9IGVsT2Zmc2V0LnRvcDtcblx0XHRcdFx0Y29uc3QgaGVpZ2h0ID0gdGhpcy4kZWwub3V0ZXJIZWlnaHQoKTtcblxuXHRcdFx0XHQkKFwiZGl2LnJlc291cmNlXCIpLnJlbW92ZUNsYXNzKFwiZHJvcC1hYm92ZSBkcm9wLWJlbG93XCIpO1xuXG5cdFx0XHRcdGlmIChkcmFnWSA8IChlbFRvcCArIChoZWlnaHQgLyAyKSkpIHtcblx0XHRcdFx0XHR0aGlzLm1vZGVsLnNldCh7IGRyb3A6IFwiYWJvdmVcIiB9KTtcblx0XHRcdFx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcImRyb3AtYWJvdmVcIik7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSBpZiAoZHJhZ1kgPj0gKGVsVG9wICsgKGhlaWdodCAvIDIpKSkge1xuXHRcdFx0XHRcdHRoaXMuJGVsLmFkZENsYXNzKFwiZHJvcC1iZWxvd1wiKTtcblx0XHRcdFx0XHR0aGlzLm1vZGVsLnNldCh7IGRyb3A6IFwiYmVsb3dcIiB9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9LFxuXG5cdHJlc291cmNlRHJhZ0VuZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy4kZWwub2ZmKFwibW91c2Vtb3ZlXCIpO1xuXHRcdCQoXCJkaXYucmVzb3VyY2VcIikucmVtb3ZlQ2xhc3MoXCJkcm9wLWFib3ZlIGRyb3AtYmVsb3dcIik7XG5cdH0sXG5cblx0b25SZXNvdXJjZURyYWdTdGFydDogXy5jb25zdGFudChmYWxzZSksXG5cblx0b25SZXNvdXJjZURyYWdEcm9wOiBmdW5jdGlvbihldnQpIHtcblx0XHRpZiAoIWRyYWdnaW5nUmVzb3VyY2UpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0ZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0dGhpcy50cmlnZ2VyKEV2ZW50cy5DaGVja0F0dGFjaG1lbnRDb250YWluZXJzKTtcblxuXHRcdGlmIChkcmFnZ2luZ1Jlc291cmNlLl9pZCA9PT0gdGhpcy5tb2RlbC5pZCkge1xuXHRcdFx0ZHJhZ2dpbmdSZXNvdXJjZSA9IG51bGw7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gSGFuZGxlIGNvbnRlbnQgZHJvcFxuXHRcdGNvbnN0IGZpbmFsaXplRHJvcCA9ICgpID0+IHtcblx0XHRcdGNvbnN0IG1vdmUgPSBkcmFnZ2luZ1Jlc291cmNlLnBhdGg7XG5cblx0XHRcdGxldCByZXMgPSBkcmFnZ2luZ1Jlc291cmNlO1xuXHRcdFx0aWYgKCFtb3ZlKSB7XG5cdFx0XHRcdHJlcyA9IHtcblx0XHRcdFx0XHRyZXNvdXJjZTogZHJhZ2dpbmdSZXNvdXJjZS5faWQsXG5cdFx0XHRcdFx0bGVhcm5pbmdfcGF0aDogdGhpcy5tb2RlbC5nZXQoXCJsZWFybmluZ19wYXRoXCIpLFxuXHRcdFx0XHRcdHJlc291cmNlVHlwZTogZHJhZ2dpbmdSZXNvdXJjZS5jYXRlZ29yeSxcblx0XHRcdFx0XHR0aXRsZTogZHJhZ2dpbmdSZXNvdXJjZS50aXRsZSxcblx0XHRcdFx0fTtcblx0XHRcdFx0aWYgKGRyYWdnaW5nUmVzb3VyY2Uuc2V0dGluZ3MpXG5cdFx0XHRcdFx0cmVzLnNldHRpbmdzID0gZHJhZ2dpbmdSZXNvdXJjZS5zZXR0aW5ncztcblx0XHRcdH1cblxuXHRcdFx0Xy5leHRlbmQocmVzLCB7XG5cdFx0XHRcdHBhdGg6IHRoaXMubW9kZWwuZ2V0KFwiZHJvcFwiKSA9PT0gXCJhYm92ZVwiID8gdGhpcy5tb2RlbC5nZXQoXCJwYXRoXCIpIDogbG9jYWxNZXRob2RzLmdldE5leHRQYXRoKHRoaXMubW9kZWwuZ2V0KFwicGF0aFwiKSksXG5cdFx0XHRcdGlzVGFzazogdGhpcy5tb2RlbC5jb2xsZWN0aW9uICYmIHRoaXMubW9kZWwuY29sbGVjdGlvbi50YXNrcyxcblx0XHRcdFx0dmlzaWJsZTogdGhpcy5tb2RlbC5nZXQoXCJwYXJlbnRWaXNpYmxlXCIpID8gZHJhZ2dpbmdSZXNvdXJjZS52aXNpYmxlIDogdHJ1ZSxcblx0XHRcdFx0bG9ja2VkOiB0aGlzLm1vZGVsLmdldChcInBhcmVudExvY2tlZFwiKSA/IHRydWUgOiBkcmFnZ2luZ1Jlc291cmNlLmxvY2tlZCxcblx0XHRcdFx0YWN0aXZhdGlvbkRhdGU6IHRoaXMubW9kZWwuZ2V0KFwicGFyZW50QWN0aXZhdGlvblwiKSB8fCBkcmFnZ2luZ1Jlc291cmNlLmFjdGl2YXRpb25EYXRlIHx8IG51bGwsXG5cdFx0XHRcdHBhcmVudExvY2tlZDogdGhpcy5tb2RlbC5nZXQoXCJwYXJlbnRMb2NrZWRcIiksXG5cdFx0XHRcdHBhcmVudEFjdGl2YXRpb246IHRoaXMubW9kZWwuZ2V0KFwicGFyZW50QWN0aXZhdGlvblwiKSxcblx0XHRcdFx0cGFyZW50VmlzaWJsZTogdGhpcy5tb2RlbC5nZXQoXCJwYXJlbnRWaXNpYmxlXCIpLFxuXHRcdFx0fSk7XG5cblx0XHRcdGlmIChtb3ZlKVxuXHRcdFx0XHR0aGlzLnRyaWdnZXIoRXZlbnRzLk1vdmVSZXNvdXJjZSwgcmVzKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy50cmlnZ2VyKEV2ZW50cy5BZGRSZXNvdXJjZSwgcmVzKTtcblx0XHR9O1xuXG5cdFx0Y29uc3QgcmVzb3VyY2UgPSBkcmFnZ2luZ1Jlc291cmNlLnJlc291cmNlID8gZHJhZ2dpbmdSZXNvdXJjZS5yZXNvdXJjZSA6IGRyYWdnaW5nUmVzb3VyY2UuX2lkO1xuXHRcdGNvbnN0IGlkID0gZHJhZ2dpbmdSZXNvdXJjZS5wYXRoID8gZHJhZ2dpbmdSZXNvdXJjZS5faWQgOiBudWxsO1xuXG5cdFx0Ly8gQXJlIHdlIGFscmVhZHkgaW4gdGhlIHByb2Nlc3Mgb2Ygc2F2aW5nIHRoZSBzYW1lIGl0ZW0/XG5cdFx0aWYgKCF0aGlzLmNvbnRlbnRTYXZlTWFwKVxuXHRcdFx0dGhpcy5jb250ZW50U2F2ZU1hcCA9IHt9O1xuXG5cdFx0aWYgKHJlc291cmNlIGluIHRoaXMuY29udGVudFNhdmVNYXApXG5cdFx0XHR0aGlzLnVpLmVycm9ycy5odG1sKFwiPHNwYW4gY2xhc3M9XFxcImVycm9yXFxcIj5UaGF0IHJlc291cmNlIGhhcyBhbHJlYWR5IGJlZW4gYXR0YWNoZWQgYW5kIGlzIHN0aWxsIHNhdmluZzwvc3Bhbj5cIik7XG5cblx0XHRjb25zdCBkdXBsaWNhdGVNb2RhbCA9IG5ldyBTbWFsbE1vZGFsKHtcblx0XHRcdHdhcm5pbmc6IHRydWUsXG5cdFx0XHRjdXN0b21PSzogXCJDbG9zZVwiLFxuXHRcdFx0aGlkZUJ1dHRvbnM6IFtcImNhbmNlbFwiXSxcblx0XHRcdGJvZHk6IFwiVGhlIHJlc291cmNlIGFscmVhZHkgZXhpc3RzIGluIFwiICsgKHRoaXMubW9kZWwuZ2V0KFwiaXNUYXNrXCIpID8gXCJ0YXNrc1wiIDogXCJhZGRpdGlvbmFsIHJlc291cmNlc1wiKSArIFwiLlwiLFxuXHRcdFx0dGl0bGU6IFwiRHVwbGljYXRlIHJlc291cmNlOiBcIiArIGRyYWdnaW5nUmVzb3VyY2UudGl0bGUucmVwbGFjZSgvW1xcJlxcPFxcPlxcJ1xcXCJdL2csIHggPT4gXCImI1wiICsgeC5jaGFyQ29kZUF0KDApICsgXCI7XCIpLFxuXHRcdFx0aG9zdDogXCIjbGluay1yZXNvdXJjZXNcIixcblx0XHR9KTtcblxuXHRcdGNvbnN0IHJlc291cmNlVHlwZSA9IGRyYWdnaW5nUmVzb3VyY2UucmVzb3VyY2VUeXBlIHx8IGRyYWdnaW5nUmVzb3VyY2UuY2F0ZWdvcnk7XG5cdFx0aWYgKCFfLmluY2x1ZGVzKFtcInRleHRcIiwgXCJ1cmxcIl0sIHJlc291cmNlVHlwZSkgJiYgZHJhZ2dpbmdSZXNvdXJjZS5jaGVja1N1bSA9PT0gdGhpcy5tb2RlbC5nZXQoXCJjaGVja1N1bVwiKSkge1xuXHRcdFx0ZHVwbGljYXRlTW9kYWwuc2hvdygpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5tb2RlbC5jb2xsZWN0aW9uKSB7XG5cdFx0XHR0aGlzLnVpLmVycm9ycy5odG1sKFwiPHNwYW4gY2xhc3M9XFxcImVycm9yXFxcIj5FcnJvcjogdGhlIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkLiBQbGVhc2UgcmVmcmVzaCBhbmQgdHJ5IGFnYWluLjwvc3Bhbj5cIik7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgZHVwbGljYXRlcyA9IF8uZmlsdGVyKHRoaXMubW9kZWwuY29sbGVjdGlvbi5tb2RlbHMsIG1vZGVsID0+IHtcblx0XHRcdGlmICgobW9kZWwuZ2V0KFwicmVzb3VyY2VcIikgPT09IHJlc291cmNlIHx8ICghXy5pbmNsdWRlcyhbXCJ0ZXh0XCIsIFwidXJsXCJdLCByZXNvdXJjZVR5cGUpICYmIG1vZGVsLmdldChcImNoZWNrU3VtXCIpID09PSBkcmFnZ2luZ1Jlc291cmNlLmNoZWNrU3VtKSkgJiZcblx0XHRcdFx0KCFpZCB8fCBpZCAhPT0gbW9kZWwuaWQpKVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGlmIChkcmFnZ2luZ1Jlc291cmNlLnBhdGggJiYgbG9jYWxNZXRob2RzLmlzU2libGluZyhkcmFnZ2luZ1Jlc291cmNlLnBhdGgsIHRoaXMubW9kZWwuZ2V0KFwicGF0aFwiKSkpXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0pO1xuXG5cdFx0aWYgKGR1cGxpY2F0ZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0aWYgKCFkcmFnZ2luZ1Jlc291cmNlLl9pZClcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRkdXBsaWNhdGVNb2RhbC5zaG93KCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKGRyYWdnaW5nUmVzb3VyY2UuY2F0ZWdvcnkgPT09IFwiYXNzZXNzbWVudFwiKSB7XG5cdFx0XHRjb25zdCBtb2RhbCA9IG5ldyBBc3Nlc3NtZW50UHJvbXB0KHtcblx0XHRcdFx0aW5saW5lTWVzc2FnZTogXCJcIixcblx0XHRcdFx0aG9zdDogXCIjbGluay1yZXNvdXJjZXNcIixcblx0XHRcdFx0cmVzb3VyY2U6IG5ldyBSZXNvdXJjZU1vZGVsKGRyYWdnaW5nUmVzb3VyY2UpLFxuXHRcdFx0fSk7XG5cblx0XHRcdG1vZGFsLm9uY2UoXCJhY3Rpb25cIiwgKGFjdGlvbiwgc2V0dGluZ3NNb2RlbCkgPT4ge1xuXHRcdFx0XHRpZiAoYWN0aW9uID09PSBcIm9rXCIpIHtcblx0XHRcdFx0XHRjb25zdCBzID0ge1xuXHRcdFx0XHRcdFx0c2VydmVyU2F2ZTogc2V0dGluZ3NNb2RlbC5zYXZlLFxuXHRcdFx0XHRcdFx0dGl0bGU6IHNldHRpbmdzTW9kZWwuaW5zdGFuY2VOYW1lLFxuXHRcdFx0XHRcdFx0cmVxdWlyZUNvZGU6IHNldHRpbmdzTW9kZWwucmVxdWlyZUNvZGUsXG5cdFx0XHRcdFx0XHRjb2RlOiBzZXR0aW5nc01vZGVsLnJlcXVpcmVDb2RlID8gc2V0dGluZ3NNb2RlbC5jb2RlIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0ZGlzYWJsZVJhbmRvbWl6YXRpb246IHNldHRpbmdzTW9kZWwuZGlzYWJsZVJhbmRvbWl6YXRpb24sXG5cdFx0XHRcdFx0XHRoaWRlQ29tcGxldGVCdXR0b25zOiBzZXR0aW5nc01vZGVsLmhpZGVDb21wbGV0ZUJ1dHRvbnMsXG5cdFx0XHRcdFx0XHRkaXNhYmxlUmVzdWx0OiBzZXR0aW5nc01vZGVsLmRpc2FibGVSZXN1bHQsXG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdGlmIChzZXR0aW5nc01vZGVsLmFjdGl2YXRpb25UeXBlID09PSBcInNwZWNpZmljXCIpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGFjdGl2YXRpb25UaW1lID0gbW9tZW50KHNldHRpbmdzTW9kZWwuc3RhcnREYXRlLCBcIkREIE1NTSBZWVlZXCIpLmhvdXIoMCkubWludXRlKDApLnNlY29uZCgwKTtcblx0XHRcdFx0XHRcdGNvbnN0IHRpbWUgPSBtb21lbnQoc2V0dGluZ3NNb2RlbC5zdGFydFRpbWUsIFwiaDptbWFcIik7XG5cdFx0XHRcdFx0XHRhY3RpdmF0aW9uVGltZS5ob3VyKHRpbWUuaG91cigpKS5taW51dGUodGltZS5taW51dGUoKSkuc2Vjb25kKDApO1xuXG5cdFx0XHRcdFx0XHRzLmFjdGl2YXRpb25UaW1lID0gYWN0aXZhdGlvblRpbWUudW5peCgpO1xuXHRcdFx0XHRcdFx0ZHJhZ2dpbmdSZXNvdXJjZS5hY3RpdmF0aW9uRGF0ZSA9IHMuYWN0aXZhdGlvblRpbWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0ZHJhZ2dpbmdSZXNvdXJjZS5hY3RpdmF0aW9uRGF0ZSA9IG51bGw7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gQXNzZXNzbWVudHMgY2Fubm90IGJlIHBlcm1hLWxvY2tlZFxuXHRcdFx0XHRcdGRyYWdnaW5nUmVzb3VyY2UubG9ja2VkID0gZmFsc2U7XG5cblx0XHRcdFx0XHRkcmFnZ2luZ1Jlc291cmNlLnNldHRpbmdzID0gcztcblxuXHRcdFx0XHRcdGZpbmFsaXplRHJvcCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0bW9kYWwuc2hvdygpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGZpbmFsaXplRHJvcCgpO1xuXHRcdH1cblx0fSxcblxuXHRmb2N1c09uQXR0YWNobWVudDogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRpZiAoKG1vZGVsLl9pZCB8fCBtb2RlbC5nZXQoXCJfaWRcIikpID09PSB0aGlzLm1vZGVsLmdldChcIl9pZFwiKSlcblx0XHRcdHRoaXMuJGVsLmdldCgwKS5zY3JvbGxJbnRvVmlldygpO1xuXHR9LFxuXG5cdG9uUmVzb3VyY2VEZWxldGVkOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdGlmIChfLmluY2x1ZGVzKG1vZGVsLmF0dGFjaG1lbnRfaWRzLCB0aGlzLm1vZGVsLmdldChcImF0dGFjaG1lbnRcIikpKVxuXHRcdFx0dGhpcy5kZWxldGVSZXNvdXJjZU5vZGUoKTtcblx0fSxcblxuXHRvbkdyb3VwQ2xpY2s6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGNvbnN0IGdtID0gbmV3IEdyb3VwTW9kYWwoe1xuXHRcdFx0Y3VycmVudEdyb3VwczogdGhpcy5tb2RlbC5nZXQoXCJncm91cHNcIiksXG5cdFx0fSk7XG5cblx0XHRnbS5zaG93KHtcblx0XHRcdG9rOiByZXN1bHQgPT4ge1xuXHRcdFx0XHRjb25zdCBvcHRzID0geyBncm91cHM6IHJlc3VsdC52YWx1ZXMgfTtcblxuXHRcdFx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJsb2NrZWRcIikgfHwgKCF0aGlzLm1vZGVsLmdldChcImxvY2tlZFwiKSAmJiB0aGlzLm1vZGVsLmdldChcImFjdGl2YXRpb25EYXRlXCIpICYmIHRoaXMubW9kZWwuZ2V0KFwiYWN0aXZhdGlvbkRhdGVcIikgPCBtb21lbnQoKS51bml4KCkpKVxuXHRcdFx0XHRcdG9wdHMuYWN0aXZhdGlvbkRhdGUgPSBudWxsO1xuXG5cdFx0XHRcdHRoaXMubW9kZWwuc2F2ZShvcHRzLCB7XG5cdFx0XHRcdFx0dXJsOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYWNhY2lhL2xlYXJuaW5nUGF0aHMvaXRlbXMvZ3JvdXBzL1wiICsgdGhpcy5tb2RlbC5pZCxcblx0XHRcdFx0XHR3YWl0OiB0cnVlLFxuXHRcdFx0XHRcdHBhdGNoOiB0cnVlLFxuXHRcdFx0XHRcdHN1Y2Nlc3M6ICgpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMucmVuZGVyKCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRlcnJvcjogZSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKGUpO1xuXHRcdFx0XHRcdFx0dGhpcy51aS5lcnJvcnMuaHRtbChcIjxzcGFuIGNsYXNzPVxcXCJlcnJvclxcXCI+XCIgKyBlLm1lc3NhZ2UgKyBcIjwvc3Bhbj5cIikuZGVsYXkoMTUwMDApLmZhZGVPdXQoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH0sXG5cblx0b25TaG93Q29kZUNsaWNrOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRsZXQgY29kZSA9IHRoaXMuYXR0YWNobWVudC5nZXQoXCJiYXNlQ29kZVwiKS50b0xvd2VyQ2FzZSgpO1xuXHRcdGNvZGUgPSBwYXJzZUludChjb2RlLCAxNik7XG5cblx0XHRjb25zdCB4b3IgPSBwYXJzZUludCh0aGlzLmF0dGFjaG1lbnQuZ2V0KFwic2V0dGluZ3NcIikuY29kZSwgMTYpO1xuXG5cdFx0bGV0IHJlYWxDb2RlID0gKGNvZGUgXiB4b3IpLnRvU3RyaW5nKDE2KS50b0xvd2VyQ2FzZSgpO1xuXHRcdHdoaWxlKHJlYWxDb2RlLmxlbmd0aCA8IDYpXG5cdFx0XHRyZWFsQ29kZSA9IFwiMFwiICsgcmVhbENvZGU7XG5cblx0XHRjb25zdCBtb2RhbCA9IG5ldyBTbWFsbE1vZGFsKHtcblx0XHRcdHRpdGxlOiBcIjxzcGFuIGNsYXNzPSdmYWwgZmEta2V5Jy8+IEFzc2Vzc21lbnQgQWN0aXZhdGlvbiBDb2RlXCIsXG5cdFx0XHRib2R5OiBgPHA+VGhpcyBpcyB0aGUgY29kZSB0byBhY3RpdmF0ZSB0aGlzIHNwZWNpZmljIGFzc2Vzc21lbnQgaW5zdGFuY2U6PC9wPlxuXHRcdFx0XHQ8cCBzdHlsZT0nbGV0dGVyLXNwYWNpbmc6IDEuNWVtOyBmb250LXNpemU6IDEuN2VtOyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGJhY2tncm91bmQtY29sb3I6ICNFRUU7IGJvcmRlci1yYWRpdXM6IDNweDsgY29sb3I6ICMwMDAnPiR7cmVhbENvZGV9PC9wPmAsXG5cdFx0XHRoaWRlQnV0dG9uczogW1wiY2FuY2VsXCJdLFxuXHRcdFx0aG9zdDogXCIjbGluay1yZXNvdXJjZXNcIixcblx0XHR9KTtcblxuXHRcdG1vZGFsLnNob3coKTtcblx0fSxcblxuXHRvbk9wZW5JdGVtQ2xpY2s6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGNvbnN0IEZsYXNoY2FyZE1vZGVsID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtcblx0XHRcdGRlZmF1bHRzOiB7fSxcblx0XHRcdGlkQXR0cmlidXRlOiBcIl9pZFwiLFxuXHRcdFx0dXJsUm9vdDogYCR7c2V0dGluZ3MudXJsUm9vdH0vYXBpLzEuMC9yZXNvdXJjZXNgLFxuXHRcdH0pO1xuXG5cdFx0c3dpdGNoICh0aGlzLm1vZGVsLmdldChcInJlc291cmNlVHlwZVwiKSkge1xuXHRcdFx0Y2FzZSBcInRleHRcIjpcblx0XHRcdGNhc2UgXCJvbmVub3RlXCI6XG5cdFx0XHRjYXNlIFwiZ29vZ2xlZHJpdmVcIjpcblx0XHRcdGNhc2UgXCJ1cmxcIjoge1xuXHRcdFx0XHRjb25zdCByZXNvdXJjZSA9IG5ldyBSZXNvdXJjZU1vZGVsKHsgX2lkOiB0aGlzLm1vZGVsLmdldChcInJlc291cmNlXCIpIH0pO1xuXHRcdFx0XHRyZXNvdXJjZS5mZXRjaCh7XG5cdFx0XHRcdFx0c3VjY2VzczogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRcdFx0XHRcdGxldCB0ZXh0ID0gXCJcIjtcblx0XHRcdFx0XHRcdGlmIChtb2RlbC5oYXMoXCJ0ZXh0XCIpKVxuXHRcdFx0XHRcdFx0XHR0ZXh0ID0gbW9kZWwuZ2V0KFwidGV4dFwiKS5yZXBsYWNlKC9cXG4vZywgXCI8YnIvPlwiKTtcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0dGV4dCA9IFwiPGEgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9XFxcIlwiICsgbW9kZWwuZ2V0KFwidXJsXCIpICsgXCJcXFwiPlwiICsgbW9kZWwuZ2V0KFwidXJsXCIpICsgXCI8L2E+XCI7XG5cblx0XHRcdFx0XHRcdGNvbnN0IGNvbmZpcm0gPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHRcdFx0XHRcdGN1c3RvbU9LOiBcIkNsb3NlXCIsXG5cdFx0XHRcdFx0XHRcdGhpZGVCdXR0b25zOiBbXCJjYW5jZWxcIl0sXG5cdFx0XHRcdFx0XHRcdGJvZHk6IHRleHQsXG5cdFx0XHRcdFx0XHRcdHRpdGxlOiBcIlZpZXdpbmcgUmVzb3VyY2U6IFwiICsgbW9kZWwuZ2V0KFwidGl0bGVcIikucmVwbGFjZSgvW1xcJlxcPFxcPlxcJ1xcXCJdL2csIHggPT4gXCImI1wiICsgeC5jaGFyQ29kZUF0KDApICsgXCI7XCIpLFxuXHRcdFx0XHRcdFx0XHRob3N0OiBcIiNsaW5rLXJlc291cmNlc1wiLFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRjb25maXJtLnNob3coKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGVycm9yOiBmdW5jdGlvbihtb2RlbCwgeGhyKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnVpLmVycm9ycy5odG1sKFwiPHNwYW4gY2xhc3M9XFxcImVycm9yXFxcIj5cIiArIEFwcC5wYXJzZVJlc3BvbnNlKHhocikuZGV0YWlsICsgXCI8L3NwYW4+XCIpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXG5cdFx0XHRjYXNlIFwiaW1hZ2VcIjpcblx0XHRcdFx0bmV3IExpZ2h0Qm94KHtcblx0XHRcdFx0XHRob3N0OiAkKFwiI2xpbmstcmVzb3VyY2VzXCIpLFxuXHRcdFx0XHRcdGltYWdlOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9yZXNvdXJjZXMvXCIgKyB0aGlzLm1vZGVsLmdldChcInJlc291cmNlXCIpICsgXCIvZGF0YVwiLFxuXHRcdFx0XHR9KS5zaG93KCk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwiYXNzZXNzbWVudFwiOlxuXHRcdFx0XHRuZXcgQXNzZXNzbWVudE1vZGFsKHtcblx0XHRcdFx0XHRtb2RlbDogbmV3IEFzc2Vzc21lbnQoeyBfaWQ6IHRoaXMubW9kZWwuZ2V0KFwicmVzb3VyY2VcIiksIHF1ZXN0aW9uRGF0YTogW10gfSksXG5cdFx0XHRcdFx0cHJldmlld01vZGU6IHRydWUsXG5cdFx0XHRcdFx0cmVzdGFydDogdHJ1ZSxcblx0XHRcdFx0fSkuc2hvdyh7fSk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwiZmxhc2hjYXJkZGVja1wiOlxuXHRcdFx0XHRuZXcgRmxhc2hjYXJkUHJldmlldyh7XG5cdFx0XHRcdFx0bW9kZWw6IG5ldyBGbGFzaGNhcmRNb2RlbCh7XG5cdFx0XHRcdFx0XHRfaWQ6IHRoaXMubW9kZWwuZ2V0KFwicmVzb3VyY2VcIiksXG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdH0pLnNob3coKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJ2aWRlb1wiOlxuXHRcdFx0Y2FzZSBcImF1ZGlvXCI6XG5cdFx0XHRjYXNlIFwicGRmXCI6XG5cdFx0XHRjYXNlIFwiZXhjZWxcIjpcblx0XHRcdGNhc2UgXCJ3b3JkXCI6XG5cdFx0XHRjYXNlIFwicG93ZXJwb2ludFwiOlxuXHRcdFx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9yZXNvdXJjZXMvXCIgKyB0aGlzLm1vZGVsLmdldChcInJlc291cmNlXCIpICsgXCIvZGF0YVwiKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIlVua25vd24gcmVzb3VyY2UgdHlwZSB0byBvcGVuOiBcIiArIHRoaXMubW9kZWwuZ2V0KFwicmVzb3VyY2VUeXBlXCIpKTtcblx0XHR9XG5cdH0sXG5cblx0b25SZXNvdXJjZU9wZW5lZENsaWNrOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRjb25zdCByZXNvdXJjZU9wZW5lZE1vZGFsID0gbmV3IFJlc291cmNlT3BlbmVkTW9kYWwoeyByZXNvdXJjZTogdGhpcy5tb2RlbC5nZXQoXCJyZXNvdXJjZVwiKSwgYXR0YWNobWVudDogdGhpcy5tb2RlbC5nZXQoXCJhdHRhY2htZW50XCIpLCB0eXBlOiBcImxlYXJuaW5nX3BhdGhcIiB9KTtcblxuXHRcdHJlc291cmNlT3BlbmVkTW9kYWwuc2hvdygpO1xuXHR9LFxuXG5cdG9uVXBsb2FkUHJvZ3Jlc3M6IGZ1bmN0aW9uKHBlcmNlbnRhZ2UpIHtcblx0XHRpZiAodGhpcy51aS5jYW5jZWxCdXR0b24uaGFzQ2xhc3MoXCJoaWRlXCIpICYmIHBlcmNlbnRhZ2UgPCA5MClcblx0XHRcdHRoaXMudWkuY2FuY2VsQnV0dG9uLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblxuXHRcdGlmICh0aGlzLnBlcmNlbnRhZ2UgPD0gcGVyY2VudGFnZSkge1xuXHRcdFx0dGhpcy51aS5wcm9ncmVzc0Jhci5hbmltYXRlKHsgd2lkdGg6IHBlcmNlbnRhZ2UgKyBcIiVcIiB9KTtcblx0XHRcdHRoaXMucGVyY2VudGFnZSA9IHBlcmNlbnRhZ2U7XG5cdFx0fVxuXG5cdFx0aWYgKHBlcmNlbnRhZ2UgPT09IDEwMClcblx0XHRcdHRoaXMudWkucHJvZ3Jlc3NCYXIuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdHVwbG9hZFN1Y2Nlc3M6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkucHJvZ3Jlc3NCYXIuYW5pbWF0ZSh7IHdpZHRoOiBcIjEwMCVcIiB9KTtcblx0XHR0aGlzLnVpLnByb2dyZXNzQmFyLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLmNhbmNlbEJ1dHRvbi5hZGRDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0dXBsb2FkRXJyb3I6IGZ1bmN0aW9uKHhocikge1xuXHRcdHRoaXMudWkucHJvZ3Jlc3NCYXIuYW5pbWF0ZSh7IHdpZHRoOiBcIjAlXCIgfSk7XG5cdFx0dGhpcy51aS5lcnJvckJ1dHRvbi5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cblx0XHRjb25zdCBlcnJvcnMgPSB7IGVycm9yOiB4aHIucmVzcG9uc2VKU09OLmluZm8gfTtcblxuXHRcdHRoaXMubW9kZWwuc2V0KFwiZXJyb3JzXCIsIGVycm9ycyk7XG5cdFx0dGhpcy5yZW5kZXIoKTtcblx0fSxcblxuXHRvbkNhbmNlbENsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm1vZGVsLnRyaWdnZXIoXCJ1cGxvYWQ6Y2FuY2VsXCIsIHRoaXMubW9kZWwpO1xuXHRcdHRoaXMuZGVzdHJveSgpO1xuXHR9LFxuXG5cdG9uVmlld0Rlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZGVzdHJveSgpO1xuXHR9LFxuXG5cdG9uUmVtb3ZlTFBJdGVtczogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwuY29sbGVjdGlvbilcblx0XHRcdHRoaXMubW9kZWwuY29sbGVjdGlvbi5yZW1vdmUodGhpcy5tb2RlbCk7XG5cdFx0dGhpcy5kZWxldGVSZXNvdXJjZU5vZGUoKTtcblx0fSxcbn0pO1xuXG5SZXNvdXJjZUVkaXQgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogXCJkaXZcIixcblx0Y2xhc3NOYW1lOiBcImxhcmdlLTEyIGNvbHVtbnNcIixcblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvY29uc29sZS9sZWFybmluZ1BhdGhOb2RlLm51bmpcIikucmVzb3VyY2VOb2RlRWRpdCxcblxuXHRiZWhhdmlvcnM6IFtUYWdzXSxcblxuXHR1aToge1xuXHRcdGxvY2s6IFwiaW5wdXRbbmFtZT0nbG9ja2VkJ11cIixcblx0XHRsb2NrVGltZTogXCIuZGF0ZXRpbWVcIixcblx0XHRhY3RpdmF0aW9uRGF0ZTogXCIuZGF0ZXRpbWUgaW5wdXRbbmFtZT0nZGF0ZSddXCIsXG5cdFx0YWN0aXZhdGlvblRpbWU6IFwiLmRhdGV0aW1lIGlucHV0W25hbWU9J3RpbWUnXVwiLFxuXHRcdGR1ZURhdGU6IFwiLmR1ZSBpbnB1dFtuYW1lPSdkYXRlJ11cIixcblx0XHRkdWVUaW1lOiBcIi5kdWUgaW5wdXRbbmFtZT0ndGltZSddXCIsXG5cdFx0Y2xlYXJBY3RpdmF0aW9uOiBcIi5jbGVhckFjdGl2YXRpb25cIixcblx0XHRjbGVhckR1ZTogXCIuY2xlYXJEdWVcIixcblxuXHRcdGNhbmNlbFJlc291cmNlRWRpdEJ0bjogXCIuY2FuY2VsLXJlc291cmNlLWVkaXQtYnRuXCIsXG5cdFx0c2F2ZVJlc291cmNlRWRpdEJ0bjogXCIuc2F2ZS1yZXNvdXJjZS1lZGl0LWJ0blwiLFxuXHRcdGVycm9yczogXCIuZXJyb3JzXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjaGFuZ2UgQHVpLmxvY2tcIjogXCJvbkxvY2tCdG5DbGlja1wiLFxuXG5cdFx0XCJjbGljayBAdWkuY2xlYXJBY3RpdmF0aW9uXCI6IFwib25DbGVhckFjdGl2YXRpb25cIixcblx0XHRcImNsaWNrIEB1aS5jbGVhckR1ZVwiOiBcIm9uQ2xlYXJEdWVcIixcblxuXHRcdFwiY2xpY2sgQHVpLmNhbmNlbFJlc291cmNlRWRpdEJ0blwiOiBcIm9uQ2FuY2VsUmVzb3VyY2VFZGl0QnRuQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5zYXZlUmVzb3VyY2VFZGl0QnRuXCI6IFwib25TYXZlUmVzb3VyY2VFZGl0QnRuQ2xpY2tcIixcblx0fSxcblxuXHRtb2RlbEV2ZW50czoge1xuXHRcdGludmFsaWQ6IFwidmFsaWRhdGlvbkZhaWxlZFwiLFxuXHR9LFxuXG5cdGxwUmFkaW9FdmVudHM6IHtcblx0XHRbRXZlbnRzLkVkaXRpbmdDaGFuZ2VdOiBcIm9uRWRpdENoYW5nZVwiLFxuXHR9LFxuXG5cdHRlbXBsYXRlQ29udGV4dDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGlzTG9ja2VkOiAoKSA9PiB0aGlzLm1vZGVsLmdldChcImxvY2tlZFwiKSB8fCAoIXRoaXMubW9kZWwuZ2V0KFwibG9ja2VkXCIpICYmIHRoaXMubW9kZWwuZ2V0KFwiYWN0aXZhdGlvbkRhdGVcIikgJiYgdGhpcy5tb2RlbC5nZXQoXCJhY3RpdmF0aW9uRGF0ZVwiKSA+IG1vbWVudCgpLnVuaXgoKSksXG5cdFx0XHRpc1BhcmVudExvY2tlZDogKCkgPT4gdGhpcy5tb2RlbC5nZXQoXCJwYXJlbnRMb2NrZWRcIikgfHwgKCF0aGlzLm1vZGVsLmdldChcInBhcmVudExvY2tlZFwiKSAmJiB0aGlzLm1vZGVsLmdldChcInBhcmVudEFjdGl2YXRpb25cIikgJiYgdGhpcy5tb2RlbC5nZXQoXCJwYXJlbnRBY3RpdmF0aW9uXCIpID4gbW9tZW50KCkudW5peCgpKSxcblx0XHR9O1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuYmluZEV2ZW50cyhscFJhZGlvLCB0aGlzLmxwUmFkaW9FdmVudHMpO1xuXHR9LFxuXG5cdG9uRWRpdENoYW5nZTogZnVuY3Rpb24odG9nZ2xlKSB7XG5cdFx0aWYgKHRvZ2dsZSlcblx0XHRcdHRoaXMudWkuc2F2ZVJlc291cmNlRWRpdEJ0bi5hdHRyKFwiZGlzYWJsZWRcIiwgZmFsc2UpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMudWkuc2F2ZVJlc291cmNlRWRpdEJ0bi5hdHRyKFwiZGlzYWJsZWRcIiwgdHJ1ZSk7XG5cdH0sXG5cblx0b25Mb2NrQnRuQ2xpY2s6IGZ1bmN0aW9uKGUpIHtcblx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0aWYgKHRoaXMudWkubG9jay5wcm9wKFwiY2hlY2tlZFwiKSlcblx0XHRcdHRoaXMudWkubG9ja1RpbWUucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMudWkubG9ja1RpbWUuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdHZhbGlkYXRpb25GYWlsZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdCQoXCIuZXJyb3JcIiwgdGhpcy5lbCkucmVtb3ZlKCk7XG5cdFx0Xy5lYWNoKHRoaXMubW9kZWwudmFsaWRhdGlvbkVycm9yLCAoaXRlbSwga2V5KSA9PiB7XG5cdFx0XHR0aGlzLnVpW2tleV0ucGFyZW50KCkuYWZ0ZXIoXCI8c3BhbiBjbGFzcz0nZXJyb3InPlwiICsgaXRlbSArIFwiPC9zcGFuPlwiKTtcblx0XHRcdHRoaXMudWlba2V5XS5vbihcImNoYW5nZSBrZXl1cFwiLCB0aGlzLmNsZWFyRXJyb3IpO1xuXHRcdH0pO1xuXHR9LFxuXG5cdGNsZWFyRXJyb3I6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0Y29uc3QgZWwgPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuXHRcdGVsLnBhcmVudCgpLnBhcmVudCgpLmZpbmQoXCIuZXJyb3JcIikucmVtb3ZlKCk7XG5cdH0sXG5cblx0b25DbGVhckFjdGl2YXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcInJlc291cmNlVHlwZVwiKSA9PT0gXCJhc3Nlc3NtZW50XCIpIHtcblx0XHRcdHRoaXMub25BY3RpdmF0aW9uQ2xpY2soKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLnVpLmFjdGl2YXRpb25EYXRlLnZhbChcIlwiKTtcblx0XHR0aGlzLnVpLmFjdGl2YXRpb25EYXRlLm5leHQoXCJpbnB1dFwiKS52YWwoXCJcIik7XG5cdFx0dGhpcy51aS5hY3RpdmF0aW9uVGltZS52YWwoXCJcIik7XG5cdFx0dGhpcy51aS5hY3RpdmF0aW9uVGltZS5uZXh0KFwiaW5wdXRcIikudmFsKFwiXCIpO1xuXHR9LFxuXG5cdG9uQ2xlYXJEdWU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkuZHVlRGF0ZS52YWwoXCJcIik7XG5cdFx0dGhpcy51aS5kdWVEYXRlLm5leHQoXCJpbnB1dFwiKS52YWwoXCJcIik7XG5cdFx0dGhpcy51aS5kdWVUaW1lLnZhbChcIlwiKTtcblx0XHR0aGlzLnVpLmR1ZVRpbWUubmV4dChcImlucHV0XCIpLnZhbChcIlwiKTtcblx0fSxcblxuXHRvbkNhbmNlbFJlc291cmNlRWRpdEJ0bkNsaWNrOiBmdW5jdGlvbihlKSB7XG5cdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdHRoaXMudHJpZ2dlcihFdmVudHMuQ2FuY2VsTm9kZUVkaXQpO1xuXHRcdGxwUmFkaW8udHJpZ2dlcihFdmVudHMuRWRpdGluZ0VuZGVkKTtcblxuXHRcdC8vIElmIHRoaXMgaXNuJ3Qgc2F2ZWQgeWV0LCBkZXN0cm95IGl0IGVudGlyZWx5XG5cdFx0aWYgKHRoaXMubW9kZWwuaXNOZXcoKSlcblx0XHRcdHJldHVybiB0aGlzLm1vZGVsLmRlc3Ryb3koKTtcblx0fSxcblxuXHRvblNhdmVSZXNvdXJjZUVkaXRCdG5DbGljazogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0Y29uc3QgW2FUaW1lSHIsIGFUaW1lTWluXSA9ICh0aGlzLnVpLmFjdGl2YXRpb25UaW1lLnZhbCgpIHx8IFwiMCAwXCIpLnNwbGl0KFwiIFwiKTtcblx0XHRjb25zdCBbZFRpbWVIciwgZFRpbWVNaW5dID0gKHRoaXMudWkuZHVlVGltZS52YWwoKSB8fCBcIjAgMFwiKS5zcGxpdChcIiBcIik7XG5cblx0XHRjb25zdCB0ID0gdGhpcy51aS5hY3RpdmF0aW9uRGF0ZS52YWwoKSB8fCAwO1xuXG5cdFx0Y29uc3QgYVRpbWUgPSB0aGlzLm1vZGVsLmdldChcInJlc291cmNlVHlwZVwiKSA9PT0gXCJhc3Nlc3NtZW50XCIgPyB0aGlzLm1vZGVsLmdldChcImFjdGl2YXRpb25EYXRlXCIpIDpcblx0XHRcdG1vbWVudCh0KS5sb2NhbCgpLnVuaXgoKSArIHBhcnNlSW50KGFUaW1lSHIsIDEwKSAqIDM2MDAgKyBwYXJzZUludChhVGltZU1pbiwgMTApICogNjA7XG5cblx0XHRjb25zdCBkYXRhID0ge1xuXHRcdFx0YWN0aXZhdGlvbkRhdGU6IHRoaXMudWkubG9jay5wcm9wKFwiY2hlY2tlZFwiKSA/IGFUaW1lIDogbnVsbCxcblx0XHRcdGR1ZURhdGU6IHRoaXMubW9kZWwuZ2V0KFwiaXNUYXNrXCIpID8gKChtb21lbnQodGhpcy51aS5kdWVEYXRlLnZhbCgpKS5sb2NhbCgpLnVuaXgoKSArIHBhcnNlSW50KGRUaW1lSHIsIDEwKSAqIDM2MDAgKyBwYXJzZUludChkVGltZU1pbiwgMTApICogNjApIHx8IG51bGwpIDogbnVsbCxcblx0XHRcdGdyb3VwczogdGhpcy5tb2RlbC5nZXQoXCJncm91cHNcIiksXG5cdFx0XHRsb2NrZWQ6IGFUaW1lID8gZmFsc2UgOiB0aGlzLnVpLmxvY2sucHJvcChcImNoZWNrZWRcIiksXG5cdFx0XHR2aXNpYmxlOiB0aGlzLm1vZGVsLmdldChcInZpc2libGVcIiksXG5cdFx0fTtcblxuXHRcdGlmICh0aGlzLm1vZGVsLmlzTmV3KCkpXG5cdFx0XHRkYXRhLmdyb3VwcyA9IGV2ZW50QnVzLnJlcXVlc3QoZXZlbnRCdXMuRXZlbnRzLkdldEN1cnJlbnRHcm91cHMpO1xuXG5cdFx0aWYgKGRhdGEubG9ja2VkIHx8ICghZGF0YS5sb2NrZWQgJiYgZGF0YS5hY3RpdmF0aW9uRGF0ZSA9PT0gdGhpcy5tb2RlbC5nZXQoXCJhY3RpdmF0aW9uRGF0ZVwiKSAmJiAoZGF0YS5hY3RpdmF0aW9uRGF0ZSAmJiBkYXRhLmFjdGl2YXRpb25EYXRlIDwgbW9tZW50KCkudW5peCgpKSkpXG5cdFx0XHRkYXRhLmFjdGl2YXRpb25EYXRlID0gbnVsbDtcblxuXHRcdHRoaXMubW9kZWwuc2F2ZShkYXRhLCB7XG5cdFx0XHR3YWl0OiB0cnVlLFxuXHRcdFx0cGF0Y2g6ICF0aGlzLm1vZGVsLmlzTmV3KCksXG5cdFx0XHRzdWNjZXNzOiAoKSA9PiB7XG5cdFx0XHRcdHRoaXMubW9kZWwuc2V0KFwiZWRpdE1vZGVcIiwgZmFsc2UpO1xuXHRcdFx0XHR0aGlzLnRyaWdnZXIoRXZlbnRzLkNvbXBsZXRlTm9kZUVkaXQpO1xuXHRcdFx0XHRscFJhZGlvLnRyaWdnZXIoRXZlbnRzLkVkaXRpbmdFbmRlZCk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9LFxuXG5cdG9uRG9tUmVmcmVzaDogZnVuY3Rpb24oKSB7XG5cdFx0dGlwcHkodGhpcy4kZWwuZ2V0KDApLnF1ZXJ5U2VsZWN0b3JBbGwoXCIuZmEtY29nXCIpLCB7XG5cdFx0XHRkdXJhdGlvbjogMCxcblx0XHRcdGFuaW1hdGlvbjogXCJmYWRlXCIsXG5cdFx0XHRwbGFjZW1lbnQ6IFwidG9wXCIsXG5cdFx0XHRmbGlwOiBmYWxzZSxcblx0XHRcdGFycm93OiB0cnVlLFxuXHRcdFx0ZGlzdGFuY2U6IDI1LFxuXHRcdH0pO1xuXG5cdFx0Ly8gU3RyaXAgdGhlIHRpbWUgZnJvbSB0aGUgZGF0ZVxuXHRcdGNvbnN0IGQgPSB0aGlzLm1vZGVsLmhhcyhcImFjdGl2YXRpb25EYXRlXCIpID8gbW9tZW50LnVuaXgodGhpcy5tb2RlbC5nZXQoXCJhY3RpdmF0aW9uRGF0ZVwiKSkubG9jYWwoKS5ob3VyKDApLm1pbnV0ZSgwKS5zZWNvbmQoMCkudmFsdWVPZigpIDogMDtcblxuXHRcdGZsYXRwaWNrcih0aGlzLnVpLmFjdGl2YXRpb25EYXRlLmdldCgwKSwge1xuXHRcdFx0ZGVmYXVsdERhdGU6IGQsXG5cdFx0XHRkYXRlRm9ybWF0OiBcIlpcIixcblx0XHRcdGFsdElucHV0OiB0cnVlLFxuXHRcdFx0YWx0Rm9ybWF0OiBcImwsIEogb2YgRiwgWVwiLFxuXHRcdFx0Y2xpY2tPcGVuczogISh0aGlzLm1vZGVsLmdldChcInJlc291cmNlVHlwZVwiKSA9PT0gXCJhc3Nlc3NtZW50XCIpLFxuXHRcdH0pO1xuXG5cdFx0ZmxhdHBpY2tyKHRoaXMudWkuYWN0aXZhdGlvblRpbWUuZ2V0KDApLCB7XG5cdFx0XHRlbmFibGVUaW1lOiB0cnVlLFxuXHRcdFx0bm9DYWxlbmRhcjogdHJ1ZSxcblx0XHRcdGRlZmF1bHREYXRlOiB0aGlzLm1vZGVsLmhhcyhcImFjdGl2YXRpb25EYXRlXCIpID8gdGhpcy5tb2RlbC5nZXQoXCJhY3RpdmF0aW9uRGF0ZVwiKSAqIDEwMDAgOiAwLFxuXHRcdFx0YWx0SW5wdXQ6IHRydWUsXG5cdFx0XHRkYXRlRm9ybWF0OiBcIkggaVwiLFxuXHRcdFx0YWx0Rm9ybWF0OiBcIkg6aSBLXCIsXG5cdFx0XHRjbGlja09wZW5zOiAhKHRoaXMubW9kZWwuZ2V0KFwicmVzb3VyY2VUeXBlXCIpID09PSBcImFzc2Vzc21lbnRcIiksXG5cdFx0fSk7XG5cblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJyZXNvdXJjZVR5cGVcIikgPT09IFwiYXNzZXNzbWVudFwiKVxuXHRcdFx0dGhpcy51aS5sb2NrVGltZS5maW5kKFwiaW5wdXRcIikub24oXCJjbGlja1wiLCB0aGlzLm9uQWN0aXZhdGlvbkNsaWNrLmJpbmQodGhpcykpO1xuXG5cdFx0Ly8gU3RyaXAgdGhlIHRpbWUgZnJvbSB0aGUgZGF0ZVxuXHRcdGNvbnN0IGRkID0gdGhpcy5tb2RlbC5oYXMoXCJkdWVEYXRlXCIpID8gbW9tZW50LnVuaXgodGhpcy5tb2RlbC5nZXQoXCJkdWVEYXRlXCIpKS5sb2NhbCgpLmhvdXIoMCkubWludXRlKDApLnNlY29uZCgwKS52YWx1ZU9mKCkgOiAwO1xuXG5cdFx0ZmxhdHBpY2tyKHRoaXMudWkuZHVlRGF0ZS5nZXQoMCksIHtcblx0XHRcdGRlZmF1bHREYXRlOiBkZCxcblx0XHRcdGRhdGVGb3JtYXQ6IFwiWlwiLFxuXHRcdFx0YWx0SW5wdXQ6IHRydWUsXG5cdFx0XHRhbHRGb3JtYXQ6IFwibCwgSiBvZiBGLCBZXCIsXG5cdFx0fSk7XG5cblx0XHRmbGF0cGlja3IodGhpcy51aS5kdWVUaW1lLmdldCgwKSwge1xuXHRcdFx0ZW5hYmxlVGltZTogdHJ1ZSxcblx0XHRcdG5vQ2FsZW5kYXI6IHRydWUsXG5cdFx0XHRkZWZhdWx0RGF0ZTogdGhpcy5tb2RlbC5oYXMoXCJkdWVEYXRlXCIpID8gdGhpcy5tb2RlbC5nZXQoXCJkdWVEYXRlXCIpICogMTAwMCA6IDAsXG5cdFx0XHRhbHRJbnB1dDogdHJ1ZSxcblx0XHRcdGRhdGVGb3JtYXQ6IFwiSCBpXCIsXG5cdFx0XHRhbHRGb3JtYXQ6IFwiSDppIEtcIixcblx0XHR9KTtcblx0fSxcblxuXHRhdHRhY2htZW50RmV0Y2hTdWNjZXNzOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdGNvbnN0IG1vZGFsID0gbmV3IEFzc2Vzc21lbnRQcm9tcHQoe1xuXHRcdFx0aW5saW5lTWVzc2FnZTogXCJcIixcblx0XHRcdGhvc3Q6IFwiI2xpbmstcmVzb3VyY2VzXCIsXG5cdFx0XHRyZXNvdXJjZTogbmV3IFJlc291cmNlTW9kZWwoeyBfaWQ6IG1vZGVsLmdldChcInJlc291cmNlXCIpIH0pLFxuXHRcdFx0c2V0dGluZ3M6IF8ubWVyZ2UobW9kZWwuZ2V0KFwic2V0dGluZ3NcIiksIHsgYWN0aXZhdGlvblRpbWU6IG1vZGVsLmdldChcImFjdGl2YXRpb25UaW1lXCIpIH0pLFxuXHRcdH0pO1xuXG5cdFx0bW9kYWwub25jZShcImFjdGlvblwiLCAoYWN0aW9uLCBzZXR0aW5nc01vZGVsKSA9PiB7XG5cdFx0XHRpZiAoYWN0aW9uID09PSBcIm9rXCIpIHtcblx0XHRcdFx0Y29uc3QgcyA9IHtcblx0XHRcdFx0XHRzZXJ2ZXJTYXZlOiBzZXR0aW5nc01vZGVsLnNhdmUsXG5cdFx0XHRcdFx0dGl0bGU6IHNldHRpbmdzTW9kZWwuaW5zdGFuY2VOYW1lLFxuXHRcdFx0XHRcdHJlcXVpcmVDb2RlOiBzZXR0aW5nc01vZGVsLnJlcXVpcmVDb2RlLFxuXHRcdFx0XHRcdGNvZGU6IHNldHRpbmdzTW9kZWwucmVxdWlyZUNvZGUgPyBzZXR0aW5nc01vZGVsLmNvZGUgOiB1bmRlZmluZWQsXG5cdFx0XHRcdFx0ZGlzYWJsZVJhbmRvbWl6YXRpb246IHNldHRpbmdzTW9kZWwuZGlzYWJsZVJhbmRvbWl6YXRpb24sXG5cdFx0XHRcdFx0aGlkZUNvbXBsZXRlQnV0dG9uczogc2V0dGluZ3NNb2RlbC5oaWRlQ29tcGxldGVCdXR0b25zLFxuXHRcdFx0XHRcdGRpc2FibGVSZXN1bHQ6IHNldHRpbmdzTW9kZWwuZGlzYWJsZVJlc3VsdCxcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRpZiAoIXRoaXMubW9kZWwuZ2V0KFwicGFyZW50TG9ja2VkXCIpKSB7XG5cdFx0XHRcdFx0aWYgKHNldHRpbmdzTW9kZWwuYWN0aXZhdGlvblR5cGUgPT09IFwic3BlY2lmaWNcIikge1xuXHRcdFx0XHRcdFx0Y29uc3QgYWN0aXZhdGlvblRpbWUgPSBtb21lbnQoc2V0dGluZ3NNb2RlbC5zdGFydERhdGUsIFwiREQgTU1NIFlZWVlcIikuaG91cigwKS5taW51dGUoMCkuc2Vjb25kKDApO1xuXHRcdFx0XHRcdFx0Y29uc3QgdGltZSA9IG1vbWVudChzZXR0aW5nc01vZGVsLnN0YXJ0VGltZSwgXCJoIG1tXCIpO1xuXHRcdFx0XHRcdFx0YWN0aXZhdGlvblRpbWUuaG91cih0aW1lLmhvdXIoKSkubWludXRlKHRpbWUubWludXRlKCkpLnNlY29uZCgwKTtcblxuXHRcdFx0XHRcdFx0cy5hY3RpdmF0aW9uVGltZSA9IGFjdGl2YXRpb25UaW1lLnVuaXgoKTtcblxuXHRcdFx0XHRcdFx0dGhpcy5tb2RlbC5zZXQoe1xuXHRcdFx0XHRcdFx0XHRhY3RpdmF0aW9uRGF0ZTogcy5hY3RpdmF0aW9uVGltZSxcblx0XHRcdFx0XHRcdFx0bG9ja2VkOiBmYWxzZSxcblx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHQvLyBTdHJpcCB0aGUgdGltZSBmcm9tIHRoZSBkYXRlXG5cdFx0XHRcdFx0XHRjb25zdCBkID0gbW9tZW50LnVuaXgodGhpcy5tb2RlbC5nZXQoXCJhY3RpdmF0aW9uRGF0ZVwiKSkubG9jYWwoKS5ob3VyKDApLm1pbnV0ZSgwKS5zZWNvbmQoMCkudmFsdWVPZigpO1xuXG5cdFx0XHRcdFx0XHRmbGF0cGlja3IodGhpcy51aS5hY3RpdmF0aW9uRGF0ZS5nZXQoMCksIHtcblx0XHRcdFx0XHRcdFx0ZGVmYXVsdERhdGU6IGQsXG5cdFx0XHRcdFx0XHRcdGRhdGVGb3JtYXQ6IFwiWlwiLFxuXHRcdFx0XHRcdFx0XHRhbHRJbnB1dDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0YWx0Rm9ybWF0OiBcImwsIEogb2YgRiwgWVwiLFxuXHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdGZsYXRwaWNrcih0aGlzLnVpLmFjdGl2YXRpb25UaW1lLmdldCgwKSwge1xuXHRcdFx0XHRcdFx0XHRlbmFibGVUaW1lOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRub0NhbGVuZGFyOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0RGF0ZTogdGhpcy5tb2RlbC5nZXQoXCJhY3RpdmF0aW9uRGF0ZVwiKSAqIDEwMDAsXG5cdFx0XHRcdFx0XHRcdGFsdElucHV0OiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRkYXRlRm9ybWF0OiBcIkggaVwiLFxuXHRcdFx0XHRcdFx0XHRhbHRGb3JtYXQ6IFwiSDppIEtcIixcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdHRoaXMubW9kZWwuc2V0KHsgYWN0aXZhdGlvbkRhdGU6IG51bGwsIGxvY2tlZDogZmFsc2UgfSk7XG5cdFx0XHRcdFx0XHR0aGlzLnVpLmxvY2sucHJvcChcImNoZWNrZWRcIiwgZmFsc2UpO1xuXHRcdFx0XHRcdFx0dGhpcy51aS5hY3RpdmF0aW9uRGF0ZS52YWwoXCJcIik7XG5cdFx0XHRcdFx0XHR0aGlzLnVpLmFjdGl2YXRpb25EYXRlLm5leHQoXCJpbnB1dFwiKS52YWwoXCJcIik7XG5cdFx0XHRcdFx0XHR0aGlzLnVpLmFjdGl2YXRpb25UaW1lLnZhbChcIlwiKTtcblx0XHRcdFx0XHRcdHRoaXMudWkuYWN0aXZhdGlvblRpbWUubmV4dChcImlucHV0XCIpLnZhbChcIlwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLmF0dGFjaG1lbnQuc2F2ZSh7XG5cdFx0XHRcdFx0c2V0dGluZ3NVcGRhdGU6IHRydWUsXG5cdFx0XHRcdFx0c2V0dGluZ3M6IHMsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRlcnJvcjogKG1vZGVsMiwgeGhyKSA9PiB7IHRoaXMudWkuZXJyb3JzLmh0bWwoXCI8c3BhbiBjbGFzcz1cXFwiZXJyb3JcXFwiPlwiICsgQXBwLnBhcnNlUmVzcG9uc2UoeGhyKS5kZXRhaWwgKyBcIjwvc3Bhbj5cIik7IH0sXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0bW9kYWwuc2hvdygpO1xuXHR9LFxuXG5cdG9uQWN0aXZhdGlvbkNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJyZXNvdXJjZVR5cGVcIikgPT09IFwiYXNzZXNzbWVudFwiKSB7XG5cdFx0XHR0aGlzLmF0dGFjaG1lbnQgPSBuZXcgQXR0YWNobWVudE1vZGVsKHtcblx0XHRcdFx0X2lkOiB0aGlzLm1vZGVsLmdldChcImF0dGFjaG1lbnRcIiksXG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5hdHRhY2htZW50LmZldGNoKHtcblx0XHRcdFx0c3VjY2VzczogdGhpcy5hdHRhY2htZW50RmV0Y2hTdWNjZXNzLmJpbmQodGhpcyksXG5cdFx0XHRcdGVycm9yOiBmdW5jdGlvbihtb2RlbCwgeGhyKSB7XG5cdFx0XHRcdFx0dGhpcy51aS5lcnJvcnMuaHRtbChcIjxzcGFuIGNsYXNzPVxcXCJlcnJvclxcXCI+XCIgKyBBcHAucGFyc2VSZXNwb25zZSh4aHIpLmRldGFpbCArIFwiPC9zcGFuPlwiKTtcblx0XHRcdFx0fSxcblx0XHRcdH0pO1xuXHRcdH1cblx0fSxcbn0pO1xuXG5cbi8vICoqIENvbGxlY3Rpb24gVmlld3MgKipcblxuXG5UcmVlVmlldyA9IEJhY2tib25lLk1hcmlvbmV0dGUuQ29sbGVjdGlvblZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInRyZWUtdmlld1wiLFxuXHR0YWdOYW1lOiBcInVsXCIsXG5cdGNoaWxkVmlldzogVHJlZU5vZGUsXG5cblx0Y2hpbGRWaWV3RXZlbnRzOiB7XG5cdFx0W0V2ZW50cy5SZWxvYWROb2RlXTogXCJyZWxvYWROb2RlXCIsXG5cdFx0W0V2ZW50cy5BZGRTaWJsaW5nTm9kZV06IFwiYWRkU2libGluZ05vZGVcIixcblx0XHRbRXZlbnRzLlByb21vdGVTaWJsaW5nTm9kZV06IFwicHJvbW90ZVNpYmxpbmdOb2RlXCIsXG5cdFx0W0V2ZW50cy5SZW1vdmVOb2RlRnJvbVBhcmVudF06IFwicmVtb3ZlTm9kZUZyb21QYXJlbnRcIixcblx0XHRbRXZlbnRzLk5vZGVEcm9wQWJvdmVdOiBcIm5vZGVEcm9wcGVkQWJvdmVcIixcblx0fSxcblxuXHRjaGlsZFZpZXdPcHRpb25zOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0cGFyZW50TG9ja2VkOiB0aGlzLm1vZGVsLmdldChcImxvY2tlZFwiKSxcblx0XHRcdHBhcmVudEFjdGl2YXRpb246IHRoaXMubW9kZWwuZ2V0KFwiYWN0aXZhdGlvbkRhdGVcIiksXG5cdFx0XHRwYXJlbnRWaXNpYmxlOiB0aGlzLm1vZGVsLmdldChcInZpc2libGVcIiksXG5cdFx0fTtcblx0fSxcblxuXHRyZWxvYWROb2RlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnRyaWdnZXIoRXZlbnRzLlJlbG9hZE5vZGUpO1xuXHR9LFxuXG5cdGFkZFNpYmxpbmdOb2RlOiBmdW5jdGlvbihtKSB7XG5cdFx0dGhpcy50cmlnZ2VyKEV2ZW50cy5BZGRTaWJsaW5nTm9kZSwgbSk7XG5cdH0sXG5cblx0cHJvbW90ZVNpYmxpbmdOb2RlOiBmdW5jdGlvbihuLCBwKSB7XG5cdFx0dGhpcy50cmlnZ2VyKEV2ZW50cy5Qcm9tb3RlU2libGluZ05vZGUsIG4sIHApO1xuXHR9LFxuXG5cdHJlbW92ZU5vZGVGcm9tUGFyZW50OiBmdW5jdGlvbihtKSB7XG5cdFx0dGhpcy50cmlnZ2VyKEV2ZW50cy5SZW1vdmVOb2RlRnJvbVBhcmVudCwgbSk7XG5cdH0sXG5cblx0bm9kZURyb3BwZWRBYm92ZTogZnVuY3Rpb24oZHJvcENoaWxkLCBzcmNNb2RlbCkge1xuXHRcdHRoaXMudHJpZ2dlcihFdmVudHMuTm9kZURyb3BBYm92ZSwgZHJvcENoaWxkLCBzcmNNb2RlbCk7XG5cdH0sXG59KTtcblxuUmVzb3VyY2VzVmlldyA9IEJhY2tib25lLk1hcmlvbmV0dGUuQ29sbGVjdGlvblZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogXCJkaXZcIixcblx0Y2hpbGRWaWV3OiBSZXNvdXJjZU5vZGUsXG5cblx0Y2hpbGRWaWV3RXZlbnRzOiB7XG5cdFx0W0V2ZW50cy5BZGRSZXNvdXJjZV06IFwiYWRkUmVzb3VyY2VcIixcblx0XHRbRXZlbnRzLk1vdmVSZXNvdXJjZV06IFwibW92ZVJlc291cmNlXCIsXG5cdFx0W0V2ZW50cy5SZW1vdmVDb250ZW50RnJvbVBhcmVudF06IFwicmVtb3ZlQ29udGVudEZyb21QYXJlbnRcIixcblx0XHRbRXZlbnRzLkNoZWNrQXR0YWNobWVudENvbnRhaW5lcnNdOiBcImNoZWNrQXR0YWNobWVudENvbnRhaW5lcnNcIixcblx0fSxcblxuXHRjaGlsZFZpZXdPcHRpb25zOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0cGFyZW50TG9ja2VkOiB0aGlzLm1vZGVsLmdldChcImxvY2tlZFwiKSxcblx0XHRcdHBhcmVudEFjdGl2YXRpb246IHRoaXMubW9kZWwuZ2V0KFwiYWN0aXZhdGlvbkRhdGVcIiksXG5cdFx0XHRwYXJlbnRWaXNpYmxlOiB0aGlzLm1vZGVsLmdldChcInZpc2libGVcIiksXG5cdFx0fTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuY29sbGVjdGlvbi50YXNrcylcblx0XHRcdHRoaXMuJGVsLmFkZENsYXNzKFwidGFza3NcIik7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy4kZWwuYWRkQ2xhc3MoXCJyZXNvdXJjZXNcIik7XG5cdH0sXG5cblx0YWRkUmVzb3VyY2U6IGZ1bmN0aW9uKGQpIHtcblx0XHR0aGlzLnRyaWdnZXIoRXZlbnRzLkFkZFJlc291cmNlLCBkKTtcblx0fSxcblxuXHRtb3ZlUmVzb3VyY2U6IGZ1bmN0aW9uKGQpIHtcblx0XHR0aGlzLnRyaWdnZXIoRXZlbnRzLk1vdmVSZXNvdXJjZSwgZCk7XG5cdH0sXG5cblx0cmVtb3ZlQ29udGVudEZyb21QYXJlbnQ6IGZ1bmN0aW9uKG0pIHtcblx0XHR0aGlzLnRyaWdnZXIoRXZlbnRzLlJlbW92ZUNvbnRlbnRGcm9tUGFyZW50LCBtKTtcblx0fSxcblxuXHRjaGVja0F0dGFjaG1lbnRDb250YWluZXJzOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnRyaWdnZXIoRXZlbnRzLkNoZWNrQXR0YWNobWVudENvbnRhaW5lcnMpO1xuXHR9LFxufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE1peGluc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuY29uc3QgU2xpZGVvdXRNaXhpbiA9IHtcblx0Y29uZmlndXJlVUk6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghdGhpcy51aS5jbG9zZS5yZW1vdmVDbGFzcyB8fCAhJChcIiNjb250ZW50LXJlZ2lvblwiKS5nZXQoMCkpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLnVpLmNsb3NlLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblxuXHRcdHRoaXMuU2xpZGVvdXQgPSBuZXcgU2xpZGVvdXQoe1xuXHRcdFx0cGFuZWw6ICQoXCIjY29udGVudC1yZWdpb25cIikuZ2V0KDApLFxuXHRcdFx0bWVudTogdGhpcy4kZWwuZ2V0KDApLFxuXHRcdFx0cGFkZGluZzogNTEwLFxuXHRcdFx0dG9sZXJhbmNlOiAyMCxcblx0XHR9KTtcblxuXHRcdHRoaXMuU2xpZGVvdXQuY2xvc2UoKTtcblx0fSxcblxuXHRzaG93OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLlNsaWRlb3V0Lm9wZW4oKTtcblx0fSxcblxuXHRoaWRlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLlNsaWRlb3V0LmNsb3NlKCk7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLlNsaWRlb3V0LmNsb3NlKCk7XG5cdH0sXG5cblx0Y2xvc2U6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuU2xpZGVvdXQuY2xvc2UoKTtcblx0fSxcbn07XG5cbmNvbnN0IExlYXJuaW5nUGF0aCA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7fSxcblx0aWRBdHRyaWJ1dGU6IFwiZ3JvdXBcIixcblxuXHR1cmxSb290OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvbGVhcm5pbmdQYXRoXCI7XG5cdH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogXCJkaXZcIixcblx0Y2xhc3NOYW1lOiBcImxlYXJuaW5nX3BhdGgtbWFuYWdlclwiLFxuXHRkcmFnZ2luZ05vZGVWaWV3OiBudWxsLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2NvbnNvbGUvbGVhcm5pbmdQYXRoVmlldy5udW5qXCIpLFxuXG5cdHJlZ2lvbnM6IHtcblx0XHR0cmVlOiBcIi50cmVlXCIsXG5cdH0sXG5cblx0dWk6IHtcblx0XHR0cmVlOiBcIi50cmVlXCIsXG5cdFx0YWRkU2VjdGlvbkJ0bjogXCIuYWRkLXNlY3Rpb24tYnRuXCIsXG5cdFx0aW1wb3J0Qm9va0J0bjogXCIuaW1wb3J0LWJvb2stYnRuXCIsXG5cdFx0cmVzZXRGb3JtYXRCdG46IFwiLnJlc2V0LWZvcm1hdC1idG5cIixcblx0XHRsZWZ0U2VjdGlvbjogXCIjbGVmdC1zZWN0aW9uXCIsXG5cdFx0cmlnaHRTZWN0aW9uOiBcIiNyaWdodC1zZWN0aW9uXCIsXG5cdFx0Y2VudHJlU2VjdGlvbjogXCIjY2VudHJlLXNlY3Rpb25cIixcblx0XHRtdWx0aXNlbGVjdEJhcjogXCIubXVsdGlzZWxlY3RcIixcblx0XHRjYW1CdG5Db250YWluZXI6IFwiLmNhbS1idG4tY29udGFpbmVyXCIsXG5cblx0XHRtdWx0aVNlbGVjdENhbmNlbDogXCIubXVsdGlzZWxlY3QgLmNhbmNlbFwiLFxuXHRcdG11bHRpU2VsZWN0SGlkZTogXCIubXVsdGlzZWxlY3QgLmhpZGVyXCIsXG5cdFx0bXVsdGlTZWxlY3RTaG93OiBcIi5tdWx0aXNlbGVjdCAuc2hvd1wiLFxuXHRcdG11bHRpU2VsZWN0VGFnczogXCIubXVsdGlzZWxlY3QgLnRhZ3NcIixcblx0XHRtdWx0aVNlbGVjdERlbGV0ZTogXCIubXVsdGlzZWxlY3QgLmRlbGV0ZVwiLFxuXG5cdFx0Y29ubmVjdGlvbkxvc3RTdGF0dXM6IFwiI2NlbnRyZS1zZWN0aW9uIC5jb25uZWN0aW9uTG9zdFwiLFxuXHRcdGxvY2tlZFN0YXR1czogXCIjY2VudHJlLXNlY3Rpb24gLmxvY2tlZFwiLFxuXHRcdHVua25vd25TdGF0dXM6IFwiI2NlbnRyZS1zZWN0aW9uIC51bmtub3duXCIsXG5cdFx0c2VsZkxvY2tlZFN0YXR1czogXCIjY2VudHJlLXNlY3Rpb24gLnNlbGZMb2NrZWRcIixcblx0XHRzdGVhbEFjY2VzczogXCIuc3RlYWxBY2Nlc3NcIixcblx0XHRyZXF1ZXN0QWNjZXNzOiBcIi5yZXF1ZXN0QWNjZXNzXCIsXG5cdFx0YWNjZXNzQ29udHJvbGxlcnM6IFwiLmFjY2Vzc0NvbnRyb2xsZXJzXCIsXG5cdFx0YWNjZXNzUGF1c2U6IFwiLmFjY2Vzc1BhdXNlXCIsXG5cblx0XHR2aWV3VXNlcjogXCJzZWxlY3RbbmFtZT0ndmlldy11c2VyJ11cIixcblx0XHR2aWV3T3ZlcmxheTogXCIudmlldy1vdmVybGF5XCIsXG5cdFx0dmlld092ZXJsYXlNZXNzYWdlOiBcIi52aWV3LW92ZXJsYXkgc3BhblwiLFxuXG5cdFx0Ym9keTogXCJib2R5XCIsXG5cdFx0b3ZlcmxheTogXCIjbHAtb3ZlcmxheVwiLFxuXHRcdG93bmVyTmFtZXM6IFwiLm93bmVyTmFtZXNcIixcblx0XHRncm91cE5vdGlmeTogXCIjbHAtb3ZlcmxheSAubm90aWZpY2F0aW9ucyAuZ3JvdXBzXCIsXG5cdFx0dHJlZUhvc3Q6IFwiLnRyZWUtaG9zdFwiLFxuXHRcdGNhbmNlbERyb3A6IFwiLnRyZWUtaG9zdCAuY2FuY2VsLWRyb3BcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5hZGRTZWN0aW9uQnRuXCI6IFwib25BZGRTZWN0aW9uQ2xpY2tlZFwiLFxuXHRcdFwiY2xpY2sgQHVpLmltcG9ydEJvb2tCdG5cIjogXCJvbkltcG9ydEJvb2tDbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLnJlc2V0Rm9ybWF0QnRuXCI6IFwib25SZXNldEZvcm1hdENsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkuZ3JvdXBOb3RpZnlcIjogXCJvbkdyb3VwTm90aWZ5Q2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5zdGVhbEFjY2Vzc1wiOiBcIm9uU3RlYWxBY2Nlc3NcIixcblx0XHRcImNsaWNrIEB1aS5yZXF1ZXN0QWNjZXNzXCI6IFwib25SZXF1ZXN0QWNjZXNzXCIsXG5cdFx0XCJjaGFuZ2UgQHVpLnZpZXdVc2VyXCI6IFwib25WaWV3VXNlckNoYW5nZVwiLFxuXHRcdFwiY2xpY2sgQHVpLm11bHRpU2VsZWN0Q2FuY2VsXCI6IFwib25NdWx0aUNhbmNlbFwiLFxuXHRcdFwiY2xpY2sgQHVpLm11bHRpU2VsZWN0U2hvd1wiOiBcIm9uTXVsdGlTaG93XCIsXG5cdFx0XCJjbGljayBAdWkubXVsdGlTZWxlY3RIaWRlXCI6IFwib25NdWx0aUhpZGVcIixcblx0XHRcImNsaWNrIEB1aS5tdWx0aVNlbGVjdFRhZ3NcIjogXCJvbk11bHRpVGFnc1wiLFxuXHRcdFwiY2xpY2sgQHVpLm11bHRpU2VsZWN0RGVsZXRlXCI6IFwib25NdWx0aURlbGV0ZVwiLFxuXG5cdFx0ZHJhZ2VudGVyOiBcIm9uRHJhZ0VudGVyXCIsXG5cdFx0ZHJhZ292ZXI6IFwib25EcmFnT3ZlclwiLFxuXHRcdGRyYWdsZWF2ZTogXCJvbkRyYWdMZWF2ZVwiLFxuXHRcdFwiZHJhZ2VudGVyIEB1aS5jYW5jZWxEcm9wXCI6IFwib25DYW5jZWxEcmFnRW50ZXJcIixcblx0XHRcImRyb3AgQHVpLmNhbmNlbERyb3BcIjogXCJvbkNhbmNlbEZpbGVEcm9wXCIsXG5cdFx0XCJkcm9wIEB1aS50cmVlSG9zdFwiOiBcIm9uQ2FuY2VsRmlsZURyb3BcIixcblx0XHRcImRyb3AgQHVpLm92ZXJsYXlcIjogXCJvbkNhbmNlbEZpbGVEcm9wXCIsXG5cdFx0ZHJvcDogXCJvbkNhbmNlbEZpbGVEcm9wXCIsXG5cdH0sXG5cblx0Y2hpbGRWaWV3RXZlbnRzOiB7XG5cdFx0W0V2ZW50cy5SZWxvYWROb2RlXTogXCJyZWxvYWRUcmVlXCIsXG5cdFx0W0V2ZW50cy5BZGRTaWJsaW5nTm9kZV06IFwib25BZGRTZWN0aW9uQ2xpY2tcIixcblx0XHRbRXZlbnRzLlJlbW92ZU5vZGVGcm9tUGFyZW50XTogXCJyZW1vdmVDaGlsZE5vZGVcIixcblx0XHRbRXZlbnRzLk5vZGVEcm9wQWJvdmVdOiBcIm5vZGVEcm9wcGVkQWJvdmVcIixcblx0fSxcblxuXHRscFJhZGlvRXZlbnRzOiB7XG5cdFx0W0V2ZW50cy5FbmFibGVFZGl0aW5nXTogXCJlbmFibGVFZGl0aW5nXCIsXG5cdFx0W0V2ZW50cy5EaXNhYmxlRWRpdGluZ106IFwiZGlzYWJsZUVkaXRpbmdcIixcblx0XHRbRXZlbnRzLk5vZGVDaGFuZ2VdOiBcIm5vZGVDaGFuZ2VkXCIsXG5cdFx0W0V2ZW50cy5TaWJsaW5nRHJvcF06IFwic2libGluZ0Ryb3BcIixcblx0XHRbRXZlbnRzLkNoaWxkRHJvcF06IFwiY2hpbGREcm9wXCIsXG5cdFx0W0V2ZW50cy5Ob2RlRHJhZ092ZXJdOiBcIm5vZGVEcmFnT3ZlclwiLFxuXHRcdFtFdmVudHMuTm9kZVNlbGVjdGVkXTogXCJvbk5vZGVTZWxlY3RlZFwiLFxuXHRcdFtFdmVudHMuTm9kZURyYWdNb3ZlXTogXCJib2R5TW91c2Vtb3ZlXCIsXG5cdFx0W0V2ZW50cy5SZXNvdXJjZURyYWdNb3ZlXTogXCJib2R5TW91c2Vtb3ZlXCIsXG5cdFx0W0V2ZW50cy5Ob2RlRHJhZ1N0YXJ0XTogXCJvbkdsb2JhbE5vZGVEcmFnU3RhcnRcIixcblx0XHRbRXZlbnRzLlJlc291cmNlRHJhZ1N0YXJ0XTogXCJvbkdsb2JhbFJlc291cmNlRHJhZ1N0YXJ0XCIsXG5cdFx0W0V2ZW50cy5NdWx0aXNlbGVjdFN0YXJ0XTogXCJvbk11bHRpc2VsZWN0U3RhcnRcIixcblx0XHRbRXZlbnRzLk5vZGVTZWxlY3RPdmVyXTogXCJvbk11bHRpTm9kZVNlbGVjdFwiLFxuXHRcdFtFdmVudHMuRWRpdGluZ0NoYW5nZV06IFwib25FZGl0Q2hhbmdlXCIsXG5cdFx0W0V2ZW50cy5WaWV3VXNlckNoYW5nZV06IFwib25WaWV3VXNlckNoYW5nZVwiLFxuXHR9LFxuXG5cdHJhZGlvRXZlbnRzOiB7XG5cdFx0W0FwcC5FdmVudHMuV2Vic29ja2V0Q29ubmVjdGVkXTogXCJ3c0Nvbm5lY3RlZFwiLFxuXHRcdFtBcHAuRXZlbnRzLldlYnNvY2tldERpc2Nvbm5lY3RlZF06IFwid3NEaXNjb25uZWN0ZWRcIixcblx0XHRbQXBwLkV2ZW50cy5XZWJzb2NrZXRNZXNzYWdlXTogXCJ3c01lc3NhZ2VcIixcblx0fSxcblxuXHRldmVudEJ1c0V2ZW50czoge1xuXHRcdFtldmVudEJ1cy5FdmVudHMuQXR0YWNobWVudEFkZGVkXTogXCJvbkF0dGFjaG1lbnRBZGRlZFwiLFxuXHRcdFtldmVudEJ1cy5FdmVudHMuQXR0YWNobWVudFJlbW92ZWRdOiBcIm9uQXR0YWNobWVudFJlbW92ZWRcIixcblx0XHRbZXZlbnRCdXMuRXZlbnRzLkdyb3Vwc0NoYW5nZWRdOiBcImdyb3Vwc0NoYW5nZWRcIixcblx0XHRbZXZlbnRCdXMuRXZlbnRzLlJlc291cmNlRHJhZ1N0YXJ0XTogXCJvblJlc291cmNlRHJhZ1N0YXJ0XCIsXG5cdFx0W2V2ZW50QnVzLkV2ZW50cy5MUFZpZXdDaGFuZ2VkXTogXCJvbkxQVmlld0NoYW5nZWRcIixcblx0XHRbZXZlbnRCdXMuRXZlbnRzLkhpZGVGbGFzaENhcmRXaWRnZXRdOiBcImhpZGVGbGFzaENhcmRXaWRnZXRcIixcblx0XHRbZXZlbnRCdXMuRXZlbnRzLlNob3dGbGFzaENhcmRXaWRnZXRdOiBcInNob3dGbGFzaENhcmRXaWRnZXRcIixcblx0XHRbZXZlbnRCdXMuRXZlbnRzLk11bHRpc2VsZWN0Q2hhbmdlZF06IFwib25DaGFuZ2VNdWx0aXNlbGVjdFwiLFxuXHR9LFxuXG5cdG1vZGVsRXZlbnRzOiB7XG5cdFx0XCJjaGFuZ2U6d3NDb25uZWN0ZWRcIjogXCJ3c0Nvbm5lY3Rpb25DaGFuZ2VkXCIsXG5cdH0sXG5cblx0YXR0YWNobWVudEV2ZW50czoge1xuXHRcdFwiYXR0YWNobWVudDpuZXh0XCI6IFwiZmluZE5leHRBdHRhY2htZW50XCIsXG5cdFx0XCJhdHRhY2htZW50OnByZXZpb3VzXCI6IFwiZmluZFByZXZpb3VzQXR0YWNobWVudFwiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHRtb2RlbE1hcCA9IHt9O1xuXHRcdHRhc2tNYXAgPSB7fTtcblx0XHRncm91cE1hcCA9IHt9O1xuXHRcdGVkaXRTdGF0ZXMudmlld01vZGUgPSBmYWxzZTtcblx0XHRlZGl0U3RhdGVzLmVkaXRpbmdBbGxvd2VkID0gZmFsc2U7XG5cdFx0dGhpcy5kcmFnQ291bnQgPSB7IGNvbnRlbnQ6IDAgfTtcblx0XHRwYWdlVW5sb2FkaW5nID0gZmFsc2U7XG5cblx0XHR0aGlzLmNvbGxlY3Rpb24gPSBuZXcgQ2hpbGRyZW5Db2xsZWN0aW9uKF8udmFsdWVzKHRoaXMubW9kZWwuZ2V0KFwiaXRlbXNcIikpKTtcblxuXHRcdHRoaXMuY29sbGVjdGlvbi5lYWNoKHggPT4ge1xuXHRcdFx0bW9kZWxNYXBbeC5pZF0gPSB4O1xuXG5cdFx0XHRfLmVhY2goeC5nZXQoXCJncm91cHNcIiksIHkgPT4ge1xuXHRcdFx0XHRpZiAoISh5IGluIGdyb3VwTWFwKSlcblx0XHRcdFx0XHRncm91cE1hcFt5XSA9IFtdO1xuXHRcdFx0XHRncm91cE1hcFt5XS5zcGxpY2UoXy5zb3J0ZWRJbmRleEJ5KGdyb3VwTWFwW3ldLCB4LCB6ID0+IHouaWQpLCAwLCB4KTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5jb2xsZWN0aW9uLm9uKFwiYWRkIHJlbW92ZVwiLCBtb2RlbCA9PiB7XG5cdFx0XHRpZiAobW9kZWwuaWQgaW4gbW9kZWxNYXApIHtcblx0XHRcdFx0ZGVsZXRlIG1vZGVsTWFwW21vZGVsLmlkXTtcblxuXHRcdFx0XHRfLmVhY2gobW9kZWwuZ2V0KFwiZ3JvdXBzXCIpLCB4ID0+IHtcblx0XHRcdFx0XHRpZiAoISh4IGluIGdyb3VwTWFwKSlcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdGNvbnN0IGkgPSBfLnNvcnRlZEluZGV4QnkoZ3JvdXBNYXBbeF0sIG1vZGVsLCB6ID0+IHouaWQpO1xuXHRcdFx0XHRcdGlmIChpID4gMCB8fCBncm91cE1hcFt4XVswXS5pZCA9PT0gbW9kZWwuaWQpXG5cdFx0XHRcdFx0XHRncm91cE1hcFt4XS5zcGxpY2UoTWF0aC5tYXgoMCwgaSksIDEpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRtb2RlbE1hcFttb2RlbC5pZF0gPSBtb2RlbDtcblxuXHRcdFx0XHRfLmVhY2gobW9kZWwuZ2V0KFwiZ3JvdXBzXCIpLCB5ID0+IHtcblx0XHRcdFx0XHRpZiAoISh5IGluIGdyb3VwTWFwKSlcblx0XHRcdFx0XHRcdGdyb3VwTWFwW3ldID0gW107XG5cdFx0XHRcdFx0Z3JvdXBNYXBbeV0uc3BsaWNlKF8uc29ydGVkSW5kZXhCeShncm91cE1hcFt5XSwgbW9kZWwsIHogPT4gei5pZCksIDAsIG1vZGVsKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghdGhpcy5jb2xsZWN0aW9uLmxlbmd0aClcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR0aGlzLmNvbGxlY3Rpb24uZWFjaCh4ID0+IHguc2V0KHsgbGFzdE5vZGU6IGZhbHNlIH0pKTtcblx0XHRcdHRoaXMuY29sbGVjdGlvbi5sYXN0KCkuc2V0KHsgbGFzdE5vZGU6IHRydWUgfSk7XG5cdFx0fSk7XG5cblx0XHQvLyBUaGUgd2Vic29ja2V0IG1pZ2h0IGFscmVhZHkgYmUgY29ubmVjdGVkIGJlZm9yZSB3ZSBsaXN0ZW4gZm9yIHRoZSBjb25uZWN0aW9uIGV2ZW50XG5cdFx0aWYgKEFwcC53cy5pc0Nvbm5lY3RlZClcblx0XHRcdHRoaXMud3NDb25uZWN0ZWQoKTtcblxuXHRcdHRoaXMuYmluZEV2ZW50cyhscFJhZGlvLCB0aGlzLmxwUmFkaW9FdmVudHMpO1xuXHRcdHRoaXMuYmluZEV2ZW50cyhnbG9iYWxSYWRpbywgdGhpcy5yYWRpb0V2ZW50cyk7XG5cdFx0dGhpcy5iaW5kRXZlbnRzKGV2ZW50QnVzLCB0aGlzLmV2ZW50QnVzRXZlbnRzKTtcblxuXHRcdGxwUmFkaW8ucmVwbHkoRXZlbnRzLkdldFByaW1hcnlHcm91cCwgKCkgPT4gdGhpcy5tb2RlbC5nZXQoXCJncm91cFwiKSk7XG5cblx0XHQkKFwiYm9keVwiKS5vbihcImNsaWNrLmNsZWFyU2VsZWN0aW9uc1wiLCB0aGlzLmJvZHlDbGlja2VyLmJpbmQodGhpcykpO1xuXG5cdFx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIiwgKCkgPT4geyBwYWdlVW5sb2FkaW5nID0gdHJ1ZTsgfSk7XG5cblx0XHR0aGlzLmF0dGFjaG1lbnRzID0geyBhZGRlZDogW10sIHJlbW92ZWQ6IFtdLCBsYXN0X3JlbW92ZWRfbGVuZ3RoOiAwLCBsYXN0X2FkZGVkX2xlbmd0aDogMCB9O1xuXG5cdFx0aWYgKG9wdGlvbnMubG9jYXRpb24pXG5cdFx0XHR0aGlzLl9sb2NhdGlvbiA9IG9wdGlvbnMubG9jYXRpb247XG5cdH0sXG5cblx0b25HbG9iYWxOb2RlRHJhZ1N0YXJ0OiBmdW5jdGlvbih2aWV3KSB7XG5cdFx0dGhpcy5kcmFnZ2luZ05vZGVWaWV3ID0gdmlldztcblx0XHRscFJhZGlvLnRyaWdnZXIoRXZlbnRzLk5vZGVEcmFnTGlzdGVuKTtcblx0fSxcblxuXHRvbkdsb2JhbFJlc291cmNlRHJhZ1N0YXJ0OiBmdW5jdGlvbihkYXRhKSB7XG5cdFx0ZHJhZ2dpbmdSZXNvdXJjZSA9IGRhdGE7XG5cdFx0bHBSYWRpby50cmlnZ2VyKEV2ZW50cy5SZXNvdXJjZURyYWdMaXN0ZW4pO1xuXHR9LFxuXG5cdG9uRWRpdENoYW5nZTogZnVuY3Rpb24odG9nZ2xlKSB7XG5cdFx0aWYgKCF0b2dnbGUpXG5cdFx0XHR0aGlzLm9uTXVsdGlDYW5jZWwoKTtcblx0fSxcblxuXHRvblJlc291cmNlRHJhZ1N0YXJ0OiBmdW5jdGlvbihkYXRhKSB7XG5cdFx0aWYgKCFjYW5FZGl0KCkpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRpZiAoZGF0YS50eXBlID09PSBcInJlc291cmNlXCIpIHtcblx0XHRcdGRyYWdnaW5nUmVzb3VyY2UgPSBkYXRhLnJlc291cmNlTW9kZWw7XG5cdFx0XHRscFJhZGlvLnRyaWdnZXIoRXZlbnRzLlJlc291cmNlRHJhZ0xpc3Rlbik7XG5cdFx0fVxuXG5cdFx0JChcImJvZHlcIikub2ZmKFwiY2xpY2suY2xlYXJTZWxlY3Rpb25zXCIpO1xuXG5cdFx0Y29uc3QgbW92ZUF0ID0gZXZlbnQgPT4ge1xuXHRcdFx0bHBSYWRpby50cmlnZ2VyKEV2ZW50cy5Ob2RlRHJhZ01vdmUsIGV2ZW50KTtcblx0XHR9O1xuXG5cdFx0dGhpcy51aS5vdmVybGF5Lm9uKFwibW91c2Vtb3ZlLm5vZGVEcmFnZ2VkXCIsIG1vdmVBdCk7XG5cblx0XHR0aGlzLnVpLm92ZXJsYXkub24oXCJtb3VzZXVwLmVuZFJlc291cmNlRHJhZ1wiLCBldmVudCA9PiB7XG5cdFx0XHR0aGlzLnVpLm92ZXJsYXkub2ZmKFwibW91c2Vtb3ZlLm5vZGVEcmFnZ2VkXCIpO1xuXHRcdFx0Y29uc3Qgbm9kZXMgPSBfLmNvbmNhdCgkKFwiZGl2LnJlc291cmNlOnZpc2libGVcIikuZ2V0KCksICQoXCJkaXYudGFzay1ob3N0OnZpc2libGVcIikuZ2V0KCksICQoXCJkaXYucmVzb3VyY2UtaG9zdDp2aXNpYmxlXCIpLmdldCgpKTtcblxuXHRcdFx0Y29uc3QgeCA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQuY2xpZW50WDtcblx0XHRcdGNvbnN0IHkgPSBldmVudC5vcmlnaW5hbEV2ZW50LmNsaWVudFkgLSAodGhpcy5mdWxsc2NyZWVuZWQgPyAtNDUgOiAwKSArICQoXCIubGVhcm5pbmdfcGF0aC1tYW5hZ2VyIC50cmVlOmZpcnN0XCIpLmdldCgwKS5zY3JvbGxUb3AgKyB3aW5kb3cucGFnZVlPZmZzZXQ7XG5cblx0XHRcdGNvbnN0IGFjdHVhbCA9IF8uZmluZChub2RlcywgaXRlbSA9PiB7XG5cdFx0XHRcdGNvbnN0IGVsZW1lbnQgPSAkKGl0ZW0pO1xuXG5cdFx0XHRcdGlmICghZWxlbWVudC5pc0luVmlld3BvcnQoKSlcblx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0Y29uc3Qgb2Zmc2V0ID0gZWxlbWVudC5vZmZzZXQoKTtcblxuXHRcdFx0XHRyZXR1cm4geSA+PSBvZmZzZXQudG9wICYmIHkgPD0gb2Zmc2V0LnRvcCArIGVsZW1lbnQub3V0ZXJIZWlnaHQodHJ1ZSkgJiZcblx0XHRcdFx0XHR4ID49IG9mZnNldC5sZWZ0ICYmIHggPD0gb2Zmc2V0LmxlZnQgKyBlbGVtZW50Lm91dGVyV2lkdGgodHJ1ZSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKGFjdHVhbClcblx0XHRcdFx0JChhY3R1YWwpLnRyaWdnZXIoXCJkcm9wcmVzb3VyY2VcIik7XG5cdFx0fSk7XG5cblx0XHR0aGlzLmxpc3RlblRvT25jZShldmVudEJ1cywgZXZlbnRCdXMuRXZlbnRzLlJlc291cmNlRHJhZ0VuZCwgKCkgPT4ge1xuXHRcdFx0dGhpcy51aS5vdmVybGF5Lm9mZihcIm1vdXNlbW92ZS5kcmFnZ2luZ05vZGVcIik7XG5cdFx0XHRscFJhZGlvLnRyaWdnZXIoRXZlbnRzLk5vZGVEcmFnRW5kLCB0aGlzKTtcblx0XHRcdHRoaXMudWkub3ZlcmxheS5vZmYoXCJtb3VzZXVwLmVuZFJlc291cmNlRHJhZ1wiKTtcblxuXHRcdFx0Xy5kZWxheSgoKSA9PiAkKFwiYm9keVwiKS5vbihcImNsaWNrLmNsZWFyU2VsZWN0aW9uc1wiLCB0aGlzLmJvZHlDbGlja2VyLmJpbmQodGhpcykpLCA1MDApO1xuXHRcdH0pO1xuXHR9LFxuXG5cdG9uTXVsdGlzZWxlY3RTdGFydDogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRpZiAoY3VycmVudEVkaXRNb2RlbElkKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0aWYgKCFtb2RlbCAmJiAhY2FuRWRpdCgpKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0aWYgKG1vZGVsICYmIG1vZGVsLmdldChcIm11bHRpc2VsZWN0aW5nXCIpKSB7XG5cdFx0XHQvLyBJZiB0aGlzIGl0ZW0gaXMgYWxyZWFkeSBzZWxlY3RlZCwgd2UgZ28gaW50byByZW1vdmFsIG1vZGVcblx0XHRcdG1zU3RhdGUgPSAyO1xuXHRcdH1cblx0XHRlbHNlIGlmIChtb2RlbCkge1xuXHRcdFx0Ly8gRWxzZSB3ZSBnbyBpbnRvIGFkZCBtb2RlXG5cdFx0XHRtc1N0YXRlID0gMTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoIW1vZGVsKSB7XG5cdFx0XHQvLyBJZiB0aGlzIHdhcyBhIGdlbmVyaWMgaW5pdGlhdGlvbiwgd2UgZ28gaW50byBcIndhaXQgZm9yIG1vdXNlZG93blwiIG1vZGVcblx0XHRcdG1zU3RhdGUgPSAzO1xuXHRcdH1cblxuXHRcdHRoaXMubXVsdGlDaGFuZ2VzID0gZmFsc2U7XG5cblx0XHQkKFwiYm9keVwiKS5vZmYoXCJtb3VzZXVwLm11bHRpc2VsZWN0XCIpO1xuXHRcdCQoXCJib2R5XCIpLm9uZShcIm1vdXNldXAubXVsdGlzZWxlY3RcIiwgZXZlbnQgPT4ge1xuXHRcdFx0Ly8gV2UgbmVlZCB0byB0dXJuIHRoaXMgb2ZmIGhlcmUgdG8gZW5zdXJlIGl0J3MgZmFsc2UgYnkgdGhlIHRpbWUgdGhlIGNsaWNrIGhhbmRsZXIgcnVuc1xuXHRcdFx0Ly8gV2Ugb25seSB0dXJuIGl0IG9mZiBpZiB0aGUgc3RhdGUgaXNuJ3QgMzsgYmVjYXVzZSAzIG1lYW5zIGdlbmVyaWMgaW5pdGlhdGlvbiB3aGljaCBtZWFucyB0aGUgbW91c2V1cFxuXHRcdFx0Ly8gbWlnaHQgYmUgdGhlIHByZWN1cnNvciB0byBhIGNsaWNrIHRoYXQgc2hvdWxkIHNlbGVjdCB0aGUgaXRlbVxuXHRcdFx0aWYgKG1zU3RhdGUgPCAzKVxuXHRcdFx0XHRtc1N0YXRlID0gMDtcblxuXHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRcdGxwUmFkaW8udHJpZ2dlcihFdmVudHMuTm9kZVNlbGVjdEVuZCk7XG5cdFx0fSk7XG5cblx0XHRscFJhZGlvLnRyaWdnZXIoRXZlbnRzLk5vZGVTZWxlY3RMaXN0ZW4pO1xuXG5cdFx0Ly8gT25seSBlbmFibGUgaWYgdGhpcyB3YXMgYSBnZW5lcmljIGluaXRpYXRpb24uIEVsc2Ugd2Ugd2FpdCBmb3IgbW90aW9uLlxuXHRcdGlmICghbW9kZWwpXG5cdFx0XHR0aGlzLmVuYWJsZU11bHRpc2VsZWN0KCk7XG5cdH0sXG5cblx0ZW5hYmxlTXVsdGlzZWxlY3Q6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghbXVsdGlzZWxlY3QpIHtcblx0XHRcdHRoaXMudWkudHJlZS5hZGRDbGFzcyhcIm11bHRpc2VsZWN0aW9uXCIpO1xuXHRcdFx0dGhpcy51aS5tdWx0aXNlbGVjdEJhci5jc3Moe1xuXHRcdFx0XHRvcGFjaXR5OiAxLFxuXHRcdFx0XHRcInBvaW50ZXItZXZlbnRzXCI6IFwiYWxsXCIsXG5cdFx0XHR9KTtcblxuXHRcdFx0bXVsdGlzZWxlY3QgPSB0cnVlO1xuXHRcdFx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5FdmVudHMuQ2hhbmdlTXVsdGlzZWxlY3QsIHRydWUpO1xuXHRcdH1cblx0fSxcblxuXHRvbkNoYW5nZU11bHRpc2VsZWN0OiBmdW5jdGlvbih0b2dnbGUpIHtcblx0XHRpZiAodG9nZ2xlKVxuXHRcdFx0dGhpcy5vbk11bHRpc2VsZWN0U3RhcnQoKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLm9uTXVsdGlDYW5jZWwoKTtcblx0fSxcblxuXHRvbk11bHRpTm9kZVNlbGVjdDogZnVuY3Rpb24obW9kZWwsIHN0YXRlKSB7XG5cdFx0aWYgKF8uaXNVbmRlZmluZWQoc3RhdGUpKSB7XG5cdFx0XHRpZiAobW9kZWwuZ2V0KFwibXVsdGlzZWxlY3RpbmdcIikgJiYgbXNTdGF0ZSA9PT0gMSlcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0aWYgKCFtb2RlbC5nZXQoXCJtdWx0aXNlbGVjdGluZ1wiKSAmJiBtc1N0YXRlID09PSAyKVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHN0YXRlID09PSBmYWxzZSB8fCAobW9kZWwuZ2V0KFwibXVsdGlzZWxlY3RpbmdcIikgJiYgbXNTdGF0ZSA9PT0gMikpIHtcblx0XHRcdG1vZGVsLnNldCh7IG11bHRpc2VsZWN0aW5nOiBmYWxzZSB9KTtcblx0XHRcdG11bHRpc2VsZWN0SXRlbXMuc3BsaWNlKF8uc29ydGVkSW5kZXhCeShtdWx0aXNlbGVjdEl0ZW1zLCBtb2RlbCwgeCA9PiB4LmlkKSwgMSk7XG5cdFx0XHRpZiAobXVsdGlzZWxlY3RJdGVtcy5sZW5ndGggPT09IDApXG5cdFx0XHRcdHJldHVybiB0aGlzLm9uTXVsdGlDYW5jZWwoKTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoc3RhdGUgPT09IHRydWUgfHwgKCFtb2RlbC5nZXQoXCJtdWx0aXNlbGVjdGluZ1wiKSAmJiBtc1N0YXRlID09PSAxKSkge1xuXHRcdFx0bW9kZWwuc2V0KHsgbXVsdGlzZWxlY3Rpbmc6IHRydWUgfSk7XG5cdFx0XHRtdWx0aXNlbGVjdEl0ZW1zLnNwbGljZShfLnNvcnRlZEluZGV4QnkobXVsdGlzZWxlY3RJdGVtcywgbW9kZWwsIHggPT4geC5pZCksIDAsIG1vZGVsKTtcblx0XHRcdHRoaXMuZW5hYmxlTXVsdGlzZWxlY3QoKTtcblx0XHR9XG5cdH0sXG5cblx0b25NdWx0aUNhbmNlbDogZnVuY3Rpb24oZSkge1xuXHRcdGlmIChlKVxuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdHRoaXMudWkudmlld092ZXJsYXkuY3NzKHsgb3BhY2l0eTogMCwgXCJwb2ludGVyLWV2ZW50c1wiOiBcIm5vbmVcIiB9KTtcblxuXHRcdGlmICh0aGlzLm11bHRpWEhSKSB7XG5cdFx0XHR0aGlzLm11bHRpWEhSLmFib3J0KCk7XG5cdFx0XHR0aGlzLm11bHRpWEhSID0gbnVsbDtcblx0XHR9XG5cblx0XHRfLmVhY2gobXVsdGlzZWxlY3RJdGVtcywgeCA9PiB4LnNldCh7IG11bHRpc2VsZWN0aW5nOiBmYWxzZSB9KSk7XG5cblx0XHRtdWx0aXNlbGVjdCA9IGZhbHNlO1xuXHRcdG1zU3RhdGUgPSAwO1xuXHRcdG11bHRpc2VsZWN0SXRlbXMgPSBbXTtcblxuXHRcdHRoaXMudWkubXVsdGlzZWxlY3RCYXIuY3NzKHtcblx0XHRcdG9wYWNpdHk6IDAsXG5cdFx0XHRcInBvaW50ZXItZXZlbnRzXCI6IFwibm9uZVwiLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy51aS50cmVlLnJlbW92ZUNsYXNzKFwibXVsdGlzZWxlY3Rpb25cIik7XG5cblx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5DaGFuZ2VNdWx0aXNlbGVjdCwgZmFsc2UpO1xuXG5cdFx0aWYgKHRoaXMubXVsdGlDaGFuZ2VzKSB7XG5cdFx0XHR0aGlzLm1vZGVsLmZldGNoKHtcblx0XHRcdFx0c3VjY2VzczogKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuY29sbGVjdGlvbi5yZXNldChfLnZhbHVlcyh0aGlzLm1vZGVsLmdldChcIml0ZW1zXCIpKSk7XG5cblx0XHRcdFx0XHRscFJhZGlvLnRyaWdnZXIoRXZlbnRzLkVuYWJsZUVkaXRpbmcpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRlcnJvcjogZXJyID0+IHtcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKFwiRXJyb3IgcmVmZXRjaGluZyBMUCBhZnRlciBidWxrIGRlbGV0ZVwiLCBlcnIpO1xuXHRcdFx0XHR9LFxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdG9uTXVsdGlTaG93OiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRpZiAobXVsdGlzZWxlY3RJdGVtcy5sZW5ndGggPT09IDApIHtcblx0XHRcdGNvbnN0IG1vZGFsID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmEgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUnLz4gTm8gVmFsaWQgSXRlbXNcIixcblx0XHRcdFx0d2FybmluZzogdHJ1ZSxcblx0XHRcdFx0Ym9keTogXCJZb3UgZGlkIG5vdCBzZWxlY3QgYW55IGl0ZW1zIHRvIHNob3cuXCIsXG5cdFx0XHRcdGhpZGVCdXR0b25zOiBbXCJjYW5jZWxcIl0sXG5cdFx0XHR9KTtcblxuXHRcdFx0bW9kYWwuc2hvdygpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gSXRlbXMgaGlkZGVuIGJ5IGEgcGFyZW50IGFyZSBub3QgZWxpZ2libGUgdG8gYmUgbWFkZSB2aXNpYmxlXG5cdFx0Y29uc3QgaXRlbXMgPSBfLnJlamVjdChtdWx0aXNlbGVjdEl0ZW1zLCB4ID0+ICF4LmdldChcInBhcmVudFZpc2libGVcIikpO1xuXG5cdFx0aWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Y29uc3QgbW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHRcdHRpdGxlOiBcIjxzcGFuIGNsYXNzPSdmYSBmYS1leWUnLz4gTm8gVmFsaWQgSXRlbXNcIixcblx0XHRcdFx0d2FybmluZzogdHJ1ZSxcblx0XHRcdFx0Ym9keTogXCJOb25lIG9mIHRoZSBpdGVtcyB5b3Ugc2VsZWN0ZWQgY2FuIGJlIG1hZGUgdmlzaWJsZSBiZWNhdXNlIHRoZXkgYXJlIHZpc2liaWxpdHktbG9ja2VkIGJ5IHRoZWlyIHBhcmVudHMuXCIsXG5cdFx0XHRcdGhpZGVCdXR0b25zOiBbXCJjYW5jZWxcIl0sXG5cdFx0XHR9KTtcblxuXHRcdFx0bW9kYWwuc2hvdygpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgbW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmEgZmEtZXllJy8+IE1ha2UgSXRlbXMgVmlzaWJsZVwiLFxuXHRcdFx0Ym9keTogYFlvdSBhcmUgYWJvdXQgdG8gbWFrZSAke2l0ZW1zLmxlbmd0aH0gaXRlbXMgdmlzaWJsZS4gSWYgYW55IG9mIHRoZSBzZWxlY3RlZCBpdGVtcyBoYXZlIHVuc2VsZWN0ZWQgY2hpbGQgaXRlbXMsIHRob3NlIGNoaWxkcmVuIHdpbGwgYWxzbyBiZSBtYWRlIHZpc2libGUuXG5cdFx0XHRcdCR7aXRlbXMubGVuZ3RoIDwgbXVsdGlzZWxlY3RJdGVtcy5sZW5ndGggPyBgPGJyLz48YnIvPiR7bXVsdGlzZWxlY3RJdGVtcy5sZW5ndGggLSBpdGVtcy5sZW5ndGh9IGl0ZW1zIGhhdmUgYmVlbiBvbWl0dGVkIGJlY2F1c2UgdGhleSBhcmUgdmlzaWJpbGl0eS1sb2NrZWQgYnkgdGhlaXIgcGFyZW50LmAgOiBcIlwifVxuXHRcdFx0XHQ8YnIvPjxici8+Q29udGludWU/YCxcblx0XHR9KTtcblxuXHRcdG1vZGFsLm9uKFwiYnV0dG9uOm9rXCIsICgpID0+IHtcblx0XHRcdHRoaXMudWkudmlld092ZXJsYXlNZXNzYWdlLmh0bWwoXCI8c3BhbiBjbGFzcz0nc3Bpbm5lci1pY29uJy8+IFNhdmluZy4uLjwvc3Bhbj5cIik7XG5cdFx0XHR0aGlzLnVpLnZpZXdPdmVybGF5LmNzcyh7IG9wYWNpdHk6IDAuOSwgXCJwb2ludGVyLWV2ZW50c1wiOiBcImFsbFwiIH0pO1xuXG5cdFx0XHR0aGlzLm11bHRpWEhSID0gJC5hamF4KHtcblx0XHRcdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRcdFx0dXJsOiBgJHtzZXR0aW5ncy51cmxSb290fS9hY2FjaWEvbGVhcm5pbmdQYXRocy9pdGVtcy9idWxrLyR7dGhpcy5tb2RlbC5nZXQoXCJsZWFybmluZ19wYXRoXCIpfS92aXNpYmlsaXR5YCxcblx0XHRcdFx0anNvbjogdHJ1ZSxcblx0XHRcdFx0ZGF0YToge1xuXHRcdFx0XHRcdGl0ZW1zOiBfLm1hcChpdGVtcywgeCA9PiB4LmlkKSxcblx0XHRcdFx0XHR2aXNpYmxlOiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRzdWNjZXNzOiAoKSA9PiB7XG5cdFx0XHRcdFx0Ly8gRGVsZXRlIGFsbCBzZWxlY3RlZCBpdGVtc1xuXHRcdFx0XHRcdF8uZWFjaChpdGVtcywgeCA9PiB4LnNldCh7IHZpc2libGU6IHRydWUgfSkpO1xuXG5cdFx0XHRcdFx0Ly8gSGlkZSBvdmVybGF5XG5cdFx0XHRcdFx0dGhpcy51aS52aWV3T3ZlcmxheS5jc3MoeyBvcGFjaXR5OiAwLCBcInBvaW50ZXItZXZlbnRzXCI6IFwibm9uZVwiIH0pO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRlcnJvcjogZSA9PiB7XG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvcihlKTtcblx0XHRcdFx0fSxcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0bW9kYWwuc2hvdygpO1xuXHR9LFxuXG5cdG9uTXVsdGlIaWRlOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRpZiAobXVsdGlzZWxlY3RJdGVtcy5sZW5ndGggPT09IDApIHtcblx0XHRcdGNvbnN0IG1vZGFsID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmEgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUnLz4gTm8gVmFsaWQgSXRlbXNcIixcblx0XHRcdFx0d2FybmluZzogdHJ1ZSxcblx0XHRcdFx0Ym9keTogXCJZb3UgZGlkIG5vdCBzZWxlY3QgYW55IGl0ZW1zIHRvIGhpZGUuXCIsXG5cdFx0XHRcdGhpZGVCdXR0b25zOiBbXCJjYW5jZWxcIl0sXG5cdFx0XHR9KTtcblxuXHRcdFx0bW9kYWwuc2hvdygpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgbW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmEgZmEtZXllLXNsYXNoJy8+IE1ha2UgSXRlbXMgSGlkZGVuXCIsXG5cdFx0XHRib2R5OiBgWW91IGFyZSBhYm91dCB0byBtYWtlICR7bXVsdGlzZWxlY3RJdGVtcy5sZW5ndGh9IGl0ZW1zIGhpZGRlbi5cblx0XHRcdFx0SWYgYW55IG9mIHRoZSBzZWxlY3RlZCBpdGVtcyBoYXZlIHVuc2VsZWN0ZWQgY2hpbGQgaXRlbXMsIHRob3NlIGNoaWxkcmVuIHdpbGwgYWxzbyBiZSBtYWRlIGhpZGRlbi48YnIvPjxici8+Q29udGludWU/YCxcblx0XHR9KTtcblxuXHRcdG1vZGFsLm9uKFwiYnV0dG9uOm9rXCIsICgpID0+IHtcblx0XHRcdHRoaXMudWkudmlld092ZXJsYXlNZXNzYWdlLmh0bWwoXCI8c3BhbiBjbGFzcz0nc3Bpbm5lci1pY29uJy8+IFNhdmluZy4uLjwvc3Bhbj5cIik7XG5cdFx0XHR0aGlzLnVpLnZpZXdPdmVybGF5LmNzcyh7IG9wYWNpdHk6IDAuOSwgXCJwb2ludGVyLWV2ZW50c1wiOiBcImFsbFwiIH0pO1xuXG5cdFx0XHR0aGlzLm11bHRpWEhSID0gJC5hamF4KHtcblx0XHRcdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRcdFx0dXJsOiBgJHtzZXR0aW5ncy51cmxSb290fS9hY2FjaWEvbGVhcm5pbmdQYXRocy9pdGVtcy9idWxrLyR7dGhpcy5tb2RlbC5nZXQoXCJsZWFybmluZ19wYXRoXCIpfS92aXNpYmlsaXR5YCxcblx0XHRcdFx0anNvbjogdHJ1ZSxcblx0XHRcdFx0ZGF0YToge1xuXHRcdFx0XHRcdGl0ZW1zOiBfLm1hcChtdWx0aXNlbGVjdEl0ZW1zLCB4ID0+IHguaWQpLFxuXHRcdFx0XHRcdHZpc2libGU6IGZhbHNlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRzdWNjZXNzOiAoKSA9PiB7XG5cdFx0XHRcdFx0Ly8gRGVsZXRlIGFsbCBzZWxlY3RlZCBpdGVtc1xuXHRcdFx0XHRcdF8uZWFjaChtdWx0aXNlbGVjdEl0ZW1zLCB4ID0+IHguc2V0KHsgdmlzaWJsZTogZmFsc2UgfSkpO1xuXG5cdFx0XHRcdFx0Ly8gSGlkZSBvdmVybGF5XG5cdFx0XHRcdFx0dGhpcy51aS52aWV3T3ZlcmxheS5jc3MoeyBvcGFjaXR5OiAwLCBcInBvaW50ZXItZXZlbnRzXCI6IFwibm9uZVwiIH0pO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRlcnJvcjogZSA9PiB7XG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvcihlKTtcblx0XHRcdFx0fSxcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0bW9kYWwuc2hvdygpO1xuXHR9LFxuXG5cdG9uTXVsdGlUYWdzOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRpZiAobXVsdGlzZWxlY3RJdGVtcy5sZW5ndGggPT09IDApIHtcblx0XHRcdGNvbnN0IG1vZGFsID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmEgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUnLz4gTm8gVmFsaWQgSXRlbXNcIixcblx0XHRcdFx0d2FybmluZzogdHJ1ZSxcblx0XHRcdFx0Ym9keTogXCJZb3UgZGlkIG5vdCBzZWxlY3QgYW55IGl0ZW1zIHRvIHRhZy5cIixcblx0XHRcdFx0aGlkZUJ1dHRvbnM6IFtcImNhbmNlbFwiXSxcblx0XHRcdH0pO1xuXG5cdFx0XHRtb2RhbC5zaG93KCk7XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCB1cmwgPSBzZXR0aW5ncy51cmxSb290ICsgXCIvYWNhY2lhL2xlYXJuaW5nUGF0aHMvXCIgKyB0aGlzLm1vZGVsLmdldChcImxlYXJuaW5nX3BhdGhcIikgKyBcIi90YWdzXCI7XG5cblx0XHQvLyBGaW5kIG91dCBhbGwgdGhlIHRhZ3MgdGhhdCBhcmUgc2VsZWN0ZWRcblx0XHRjb25zdCBleGlzdGluZ1RhZ3MgPSBfLnVuaXFCeShfLmZsYXRNYXAobXVsdGlzZWxlY3RJdGVtcywgeCA9PiB7XG5cdFx0XHRjb25zdCBtID0gbW9kZWxNYXBbeC5pZF0gfHwgdGFza01hcFt4LmlkXTtcblx0XHRcdGlmICghbSlcblx0XHRcdFx0cmV0dXJuIFtdO1xuXHRcdFx0cmV0dXJuIG0uZ2V0KFwidGFnTGlzdFwiKSB8fCBbXTtcblx0XHR9KSwgeCA9PiB4LnRhZ19pZCk7XG5cblx0XHRjb25zdCB0YWdnaW5nID0gbmV3IFNlbGVjdHJhKHtcblx0XHRcdHNlYXJjaDogZmFsc2UsXG5cdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdHNvcnQ6IHRydWUsXG5cdFx0XHR2aXJ0dWFsQmFzZTogdHJ1ZSxcblx0XHRcdGF1dG9PcGVuRHJvcGRvd246IHRydWUsXG5cdFx0XHRpY29uczogdHJ1ZSxcblx0XHRcdGNoZWNrYm94ZXM6IHRydWUsXG5cdFx0XHRkZFdpZHRoOiAyNTAsXG5cdFx0XHRkZEhvc3Q6IFwiI2xpbmstcmVzb3VyY2VzXCIsXG5cdFx0XHRzZXJ2ZXI6IHtcblx0XHRcdFx0a2V5OiBcInRhZ19pZFwiLFxuXHRcdFx0XHR2YWx1ZTogXCJsYWJlbFwiLFxuXHRcdFx0XHRmZXRjaDogdXJsLFxuXHRcdFx0XHRkZWZhdWx0OiB7XG5cdFx0XHRcdFx0aXRlbXM6IGV4aXN0aW5nVGFncyxcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0cGFnZVNpemU6IDMwLFxuXHRcdFx0XHRpbmZpbml0ZTogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0XHRhbGxvd0NyZWF0aW9uOiB7XG5cdFx0XHRcdG1vZGU6IFwiYWx3YXlzXCIsXG5cdFx0XHRcdHRleHQ6IFwiQ3JlYXRlIG5ldyB0YWdcIixcblx0XHRcdFx0Y2FsbGJhY2s6IHRoaXMuY3JlYXRlTmV3VGFnLFxuXHRcdFx0XHRzZXJ2ZXI6IHtcblx0XHRcdFx0XHRzYXZlRmlyc3Q6IHRydWUsXG5cdFx0XHRcdFx0c2F2ZTogYCR7c2V0dGluZ3MudXJsUm9vdH0vYWNhY2lhL2xlYXJuaW5nUGF0aHMvaXRlbXMvJHt0aGlzLm1vZGVsLmdldChcImxlYXJuaW5nX3BhdGhcIil9L3RhZ3NgLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRoaWRlT25DbGljazogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0XHRpbnRlcmFjdGl2ZXM6IHtcblx0XHRcdFx0bWFuYWdlOiB7XG5cdFx0XHRcdFx0dGV4dDogXCJNYW5hZ2UgdGFnc1wiLFxuXHRcdFx0XHRcdGNhbGxiYWNrOiB0aGlzLm1hbmFnZVRhZ3MsXG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0dGFnZ2luZy5zaG93KHsgZWw6IGV2dC5jdXJyZW50VGFyZ2V0IH0pO1xuXG5cdFx0bGV0IHRhZ3MgPSBbXSwgdGFnTGlzdCA9IFtdO1xuXG5cdFx0dGhpcy5saXN0ZW5Ubyh0YWdnaW5nLCBTZWxlY3RyYS5FdmVudHMuVmFsdWVDaGFuZ2VkLCBzZWxlY3Rpb24gPT4ge1xuXHRcdFx0dGFncyA9IF8uZmxhdE1hcChzZWxlY3Rpb24sIHggPT4geC5nZXQoXCJ0YWdfaWRcIikgfHwgW10pO1xuXHRcdFx0dGFnTGlzdCA9IF8ubWFwKHNlbGVjdGlvbiwgeCA9PiB4LnRvSlNPTigpKTtcblx0XHR9KTtcblxuXHRcdHRoaXMubGlzdGVuVG8odGhpcywgXCJiZWZvcmU6ZGVzdHJveVwiLCAoKSA9PiB7XG5cdFx0XHR0YWdnaW5nLmNsb3NlKCk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHRhZ2dpbmcsIFwiZHJvcGRvd246Y2xvc2VkXCIsICgpID0+IHtcblx0XHRcdGlmICghdGhpcy51aS52aWV3T3ZlcmxheSlcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR0aGlzLnVpLnZpZXdPdmVybGF5TWVzc2FnZS5odG1sKFwiPHNwYW4gY2xhc3M9J3NwaW5uZXItaWNvbicvPiBTYXZpbmcuLi48L3NwYW4+XCIpO1xuXHRcdFx0dGhpcy51aS52aWV3T3ZlcmxheS5jc3MoeyBvcGFjaXR5OiAwLjksIFwicG9pbnRlci1ldmVudHNcIjogXCJhbGxcIiB9KTtcblxuXHRcdFx0dGhpcy5tdWx0aVhIUiA9ICQuYWpheCh7XG5cdFx0XHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0XHRcdHVybDogYCR7c2V0dGluZ3MudXJsUm9vdH0vYWNhY2lhL2xlYXJuaW5nUGF0aHMvaXRlbXMvYnVsay8ke3RoaXMubW9kZWwuZ2V0KFwibGVhcm5pbmdfcGF0aFwiKX0vdGFnc2AsXG5cdFx0XHRcdGpzb246IHRydWUsXG5cdFx0XHRcdGRhdGE6IHtcblx0XHRcdFx0XHRpdGVtczogXy5tYXAobXVsdGlzZWxlY3RJdGVtcywgeCA9PiB4LmlkKSxcblx0XHRcdFx0XHR0YWdzLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRzdWNjZXNzOiAoKSA9PiB7XG5cdFx0XHRcdFx0Ly8gRGVsZXRlIGFsbCBzZWxlY3RlZCBpdGVtc1xuXHRcdFx0XHRcdF8uZWFjaChtdWx0aXNlbGVjdEl0ZW1zLCB4ID0+IHguc2V0KHsgdGFncywgdGFnTGlzdCB9KSk7XG5cblx0XHRcdFx0XHQvLyBIaWRlIG92ZXJsYXlcblx0XHRcdFx0XHR0aGlzLnVpLnZpZXdPdmVybGF5LmNzcyh7IG9wYWNpdHk6IDAsIFwicG9pbnRlci1ldmVudHNcIjogXCJub25lXCIgfSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGVycm9yOiBlID0+IHtcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKGUpO1xuXHRcdFx0XHR9LFxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH0sXG5cblx0Y3JlYXRlTmV3VGFnOiBmdW5jdGlvbihlbCwgY2xpY2tlcikge1xuXHRcdHRoaXMudGFnTW9kYWwgPSBuZXcgVGFnTW9kYWwoKTtcblxuXHRcdHJldHVybiB0aGlzLnRhZ01vZGFsLnNob3coZWwsIGNsaWNrZXIpO1xuXHR9LFxuXG5cdG1hbmFnZVRhZ3M6IGZ1bmN0aW9uKCkge1xuXHRcdGdsb2JhbFJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0ZSwgc2V0dGluZ3MudXJsUm9vdCArIFwiL2NvbnNvbGUvdGFncy9cIiArIGxwUmFkaW8ucmVxdWVzdChFdmVudHMuR2V0UHJpbWFyeUdyb3VwKSk7XG5cdH0sXG5cblx0b25NdWx0aURlbGV0ZTogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0aWYgKG11bHRpc2VsZWN0SXRlbXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRjb25zdCBtb2RhbCA9IG5ldyBTbWFsbE1vZGFsKHtcblx0XHRcdFx0dGl0bGU6IFwiPHNwYW4gY2xhc3M9J2ZhIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJy8+IE5vIFZhbGlkIEl0ZW1zXCIsXG5cdFx0XHRcdHdhcm5pbmc6IHRydWUsXG5cdFx0XHRcdGJvZHk6IFwiWW91IGRpZCBub3Qgc2VsZWN0IGFueSBpdGVtcyB0byBkZWxldGUuXCIsXG5cdFx0XHRcdGhpZGVCdXR0b25zOiBbXCJjYW5jZWxcIl0sXG5cdFx0XHR9KTtcblxuXHRcdFx0bW9kYWwuc2hvdygpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgbW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmEgZmEtdHJhc2gtYWx0Jy8+IE11bHRpcGxlIEl0ZW0gRGVsZXRpb25cIixcblx0XHRcdHdhcm5pbmc6IHRydWUsXG5cdFx0XHRib2R5OiBgWW91IGFyZSBhYm91dCB0byBkZWxldGUgJHttdWx0aXNlbGVjdEl0ZW1zLmxlbmd0aH0gaXRlbXMuIElmIGFueSBvZiB0aGUgc2VsZWN0ZWQgaXRlbXMgaGF2ZSB1bnNlbGVjdGVkIGNoaWxkIGl0ZW1zLCB0aG9zZSBjaGlsZHJlbiB3aWxsIGFsc28gYmUgZGVsZXRlZC48YnIvPjxici8+Q29udGludWU/YCxcblx0XHR9KTtcblxuXHRcdG1vZGFsLm9uKFwiYnV0dG9uOm9rXCIsICgpID0+IHtcblx0XHRcdHRoaXMudWkudmlld092ZXJsYXlNZXNzYWdlLmh0bWwoXCI8c3BhbiBjbGFzcz0nc3Bpbm5lci1pY29uJy8+IFNhdmluZy4uLjwvc3Bhbj5cIik7XG5cdFx0XHR0aGlzLnVpLnZpZXdPdmVybGF5LmNzcyh7IG9wYWNpdHk6IDAuOSwgXCJwb2ludGVyLWV2ZW50c1wiOiBcImFsbFwiIH0pO1xuXG5cdFx0XHR0aGlzLm11bHRpWEhSID0gJC5hamF4KHtcblx0XHRcdFx0bWV0aG9kOiBcIkRFTEVURVwiLFxuXHRcdFx0XHR1cmw6IGAke3NldHRpbmdzLnVybFJvb3R9L2FjYWNpYS9sZWFybmluZ1BhdGhzL2l0ZW1zL2J1bGsvJHt0aGlzLm1vZGVsLmdldChcImxlYXJuaW5nX3BhdGhcIil9L2RlbGV0ZWAsXG5cdFx0XHRcdGpzb246IHRydWUsXG5cdFx0XHRcdGRhdGE6IHtcblx0XHRcdFx0XHRpdGVtczogXy5tYXAobXVsdGlzZWxlY3RJdGVtcywgeCA9PiB4LmlkKSxcblx0XHRcdFx0fSxcblx0XHRcdFx0c3VjY2VzczogKCkgPT4ge1xuXHRcdFx0XHRcdC8vIERlbGV0ZSBhbGwgc2VsZWN0ZWQgaXRlbXNcblx0XHRcdFx0XHRfLmVhY2gobXVsdGlzZWxlY3RJdGVtcywgeCA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoeC5jb2xsZWN0aW9uKVxuXHRcdFx0XHRcdFx0XHR4LmNvbGxlY3Rpb24ucmVtb3ZlKHgpO1xuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0bXVsdGlzZWxlY3RJdGVtcyA9IFtdO1xuXG5cdFx0XHRcdFx0Ly8gSGlkZSBvdmVybGF5XG5cdFx0XHRcdFx0dGhpcy51aS52aWV3T3ZlcmxheS5jc3MoeyBvcGFjaXR5OiAwLCBcInBvaW50ZXItZXZlbnRzXCI6IFwibm9uZVwiIH0pO1xuXG5cdFx0XHRcdFx0dGhpcy5tdWx0aUNoYW5nZXMgPSB0cnVlO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRlcnJvcjogZSA9PiB7XG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvcihlKTtcblx0XHRcdFx0fSxcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0bW9kYWwuc2hvdygpO1xuXHR9LFxuXG5cdG9uTm9kZVNlbGVjdGVkOiBmdW5jdGlvbihpZCwgdmlldykge1xuXHRcdHRoaXMuc2VsZWN0ZWRWaWV3ID0gdmlldztcblx0fSxcblxuXHRzaWJsaW5nRHJvcDogZnVuY3Rpb24odmlldykge1xuXHRcdGlmICghdGhpcy5kcmFnZ2luZ05vZGVWaWV3KVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0Y29uc3QgbmV3UGF0aCA9IHZpZXcubW9kZWwuZ2V0KFwiZHJvcEZpcnN0Q2hpbGRcIikgPyB2aWV3Lm1vZGVsLmdldChcInBhdGhcIikgOiBsb2NhbE1ldGhvZHMuZ2V0TmV4dFBhdGgodmlldy5tb2RlbC5nZXQoXCJwYXRoXCIpKTtcblx0XHRjb25zdCBvbGRQYXRoID0gdGhpcy5kcmFnZ2luZ05vZGVWaWV3Lm1vZGVsLmdldChcInBhdGhcIik7XG5cblx0XHRjb25zdCBvcHRzID0ge1xuXHRcdFx0cGF0aDogbmV3UGF0aCxcblx0XHRcdHZpc2libGU6IHZpZXcubW9kZWwuZ2V0KFwidmlzaWJsZVwiKSA/IHRoaXMuZHJhZ2dpbmdOb2RlVmlldy5tb2RlbC5nZXQoXCJ2aXNpYmxlXCIpIDogdHJ1ZSxcblx0XHRcdGxvY2tlZDogdmlldy5tb2RlbC5nZXQoXCJsb2NrZWRcIikgPyB0cnVlIDogdGhpcy5kcmFnZ2luZ05vZGVWaWV3Lm1vZGVsLmdldChcImxvY2tlZFwiKSxcblx0XHRcdGFjdGl2YXRpb25EYXRlOiB2aWV3Lm1vZGVsLmdldChcImFjdGl2YXRpb25EYXRlXCIpIHx8IHRoaXMuZHJhZ2dpbmdOb2RlVmlldy5tb2RlbC5nZXQoXCJhY3RpdmF0aW9uRGF0ZVwiKSxcblx0XHR9O1xuXG5cdFx0aWYgKG9wdHMubG9ja2VkIHx8ICghb3B0cy5sb2NrZWQgJiYgb3B0cy5hY3RpdmF0aW9uRGF0ZSAmJiBvcHRzLmFjdGl2YXRpb25EYXRlIDwgbW9tZW50KCkudW5peCgpKSlcblx0XHRcdG9wdHMuYWN0aXZhdGlvbkRhdGUgPSBudWxsO1xuXG5cdFx0dGhpcy5kcmFnZ2luZ05vZGVWaWV3Lm1vZGVsLnNhdmUob3B0cywge1xuXHRcdFx0cGF0Y2g6IHRydWUsXG5cdFx0XHR3YWl0OiB0cnVlLFxuXHRcdFx0c3VjY2VzczogKCkgPT4ge1xuXHRcdFx0XHR2aWV3Lm1vZGVsLnNldCh7IGRyb3BGaXJzdENoaWxkOiBmYWxzZSB9KTtcblxuXHRcdFx0XHRpZiAobG9jYWxNZXRob2RzLmlzU2libGluZyhvbGRQYXRoLCBuZXdQYXRoKSkge1xuXHRcdFx0XHRcdC8vIElmIHdlIHJlcG9zaXRpb25lZCBzb21ldGhpbmcgd2l0aGluIHRoZSBzYW1lIHBhcmVudCwgdGhlIHJlbG9hZCB3aWxsIGZpeCB0aGUgcG9zaXRpb24uXG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0Ly8gSWYgbm90IHNpYmxpbmdzLCByZW1vdmUgaXQgZnJvbSB0aGUgb2xkIHBhcmVudC4uLlxuXHRcdFx0XHRcdHRoaXMuZHJhZ2dpbmdOb2RlVmlldy50cmlnZ2VyKEV2ZW50cy5SZW1vdmVOb2RlRnJvbVBhcmVudCwgdGhpcy5kcmFnZ2luZ05vZGVWaWV3Lm1vZGVsKTtcblxuXHRcdFx0XHRcdC8vIC4uLmFuZCBwcm9tb3RlIGl0IGluIHRoZSBuZXcgbG9jYXRpb25cblx0XHRcdFx0XHRjb25zdCBtID0gdGhpcy5kcmFnZ2luZ05vZGVWaWV3Lm1vZGVsO1xuXHRcdFx0XHRcdG0uc2V0KHsgZGVwdGg6IHZpZXcubW9kZWwuZ2V0KFwiZGVwdGhcIikgfSk7XG5cdFx0XHRcdFx0dmlldy50cmlnZ2VyKEV2ZW50cy5Qcm9tb3RlU2libGluZ05vZGUsIG0sIHZpZXcubW9kZWwpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLkF0dGFjaG1lbnRBZGRlZCwgdGhpcy5kcmFnZ2luZ05vZGVWaWV3Lm1vZGVsLCB7IG9sZFBhdGgsIG5ld1BhdGggfSk7XG5cdFx0XHRcdHZpZXcudHJpZ2dlcihFdmVudHMuUmVsb2FkTm9kZSk7XG5cdFx0XHRcdHRoaXMuZHJhZ2dpbmdOb2RlVmlldyA9IG51bGw7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9LFxuXG5cdGNoaWxkRHJvcDogZnVuY3Rpb24odmlldykge1xuXHRcdGlmICghdGhpcy5kcmFnZ2luZ05vZGVWaWV3IHx8IHZpZXcubW9kZWwuaWQgPT09IHRoaXMuZHJhZ2dpbmdOb2RlVmlldy5tb2RlbC5pZCkge1xuXHRcdFx0Ly9FeGl0IGlmIHRyeWluZyB0byBkcm9wIGFzIGEgY2hpbGQgb2YgaXRzZWxmXG5cdFx0XHR0aGlzLmRyYWdnaW5nTm9kZVZpZXcgPSBudWxsO1xuXHRcdFx0dmlldy5tb2RlbC5zZXQoeyBkcm9wRmlyc3RDaGlsZDogZmFsc2UgfSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgcGF0aCA9IHZpZXcubW9kZWwuZ2V0KFwicGF0aFwiKSArIFwiLkFBQVwiO1xuXG5cdFx0Y29uc3Qgb2xkUGF0aCA9IHRoaXMuZHJhZ2dpbmdOb2RlVmlldy5tb2RlbC5nZXQoXCJwYXRoXCIpO1xuXG5cdFx0Y29uc3Qgb3B0cyA9IHtcblx0XHRcdHBhdGgsXG5cdFx0XHR2aXNpYmxlOiB2aWV3Lm1vZGVsLmdldChcInZpc2libGVcIiksXG5cdFx0XHRsb2NrZWQ6IHZpZXcubW9kZWwuZ2V0KFwibG9ja2VkXCIpLFxuXHRcdFx0YWN0aXZhdGlvbkRhdGU6IHZpZXcubW9kZWwuZ2V0KFwiYWN0aXZhdGlvbkRhdGVcIiksXG5cdFx0XHRwYXJlbnRMb2NrZWQ6IHZpZXcubW9kZWwuZ2V0KFwicGFyZW50TG9ja2VkXCIpLFxuXHRcdFx0cGFyZW50VmlzaWJsZTogdmlldy5tb2RlbC5nZXQoXCJwYXJlbnRWaXNpYmxlXCIpLFxuXHRcdFx0cGFyZW50QWN0aXZhdGlvbjogdmlldy5tb2RlbC5nZXQoXCJwYXJlbnRBY3RpdmF0aW9uXCIpLFxuXHRcdH07XG5cblx0XHRpZiAob3B0cy5sb2NrZWQgfHwgKCFvcHRzLmxvY2tlZCAmJiBvcHRzLmFjdGl2YXRpb25EYXRlICYmIG9wdHMuYWN0aXZhdGlvbkRhdGUgPCBtb21lbnQoKS51bml4KCkpKVxuXHRcdFx0b3B0cy5hY3RpdmF0aW9uRGF0ZSA9IG51bGw7XG5cblx0XHR0aGlzLmRyYWdnaW5nTm9kZVZpZXcubW9kZWwuc2F2ZShvcHRzLCB7XG5cdFx0XHRwYXRjaDogdHJ1ZSxcblx0XHRcdHdhaXQ6IHRydWUsXG5cdFx0XHRzdWNjZXNzOiBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuZHJhZ2dpbmdOb2RlVmlldy50cmlnZ2VyKEV2ZW50cy5SZW1vdmVOb2RlRnJvbVBhcmVudCwgdGhpcy5kcmFnZ2luZ05vZGVWaWV3Lm1vZGVsKTtcblxuXHRcdFx0XHRjb25zdCBtID0gdGhpcy5kcmFnZ2luZ05vZGVWaWV3Lm1vZGVsO1xuXHRcdFx0XHRtLnNldCh7IGRlcHRoOiB2aWV3Lm1vZGVsLmdldChcImRlcHRoXCIpICsgMSB9KTtcblxuXHRcdFx0XHRpZiAodmlldy5tb2RlbC5nZXQoXCJpc0NvbGxhcHNlZFwiKSlcblx0XHRcdFx0XHRhd2FpdCB2aWV3LmNvbGxhcHNlTm9kZShmYWxzZSk7XG5cblx0XHRcdFx0dmlldy5jaGlsZHJlbi5hZGQobSwgeyBhdDogMCB9KTtcblx0XHRcdFx0dmlldy5tb2RlbC5zZXQoeyBkcm9wRmlyc3RDaGlsZDogZmFsc2UgfSk7XG5cblx0XHRcdFx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5FdmVudHMuQXR0YWNobWVudEFkZGVkLCBtLCB7IG9sZFBhdGg6IG9sZFBhdGgsIG5ld1BhdGg6IHBhdGggfSk7XG5cdFx0XHRcdHZpZXcudHJpZ2dlcihFdmVudHMuUmVsb2FkTm9kZSk7XG5cdFx0XHRcdHRoaXMuZHJhZ2dpbmdOb2RlVmlldyA9IG51bGw7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9LFxuXG5cdG5vZGVEcm9wcGVkQWJvdmU6IGZ1bmN0aW9uKGRyb3BDaGlsZCwgc3JjTW9kZWwpIHtcblx0XHRjb25zdCBpbmRleCA9IHRoaXMuY29sbGVjdGlvbi5pbmRleE9mKHNyY01vZGVsKTtcblx0XHRjb25zdCB0cmVlVmlldyA9IHRoaXMuZ2V0Q2hpbGRWaWV3KFwidHJlZVwiKTtcblxuXHRcdGlmIChpbmRleCA+IDApIHtcblx0XHRcdGNvbnN0IHByZXZpb3VzTW9kZWwgPSB0aGlzLmNvbGxlY3Rpb24uYXQoaW5kZXggLSAxKTtcblx0XHRcdGNvbnN0IHByZXZpb3VzVmlldyA9IHRyZWVWaWV3LmNoaWxkcmVuLmZpbmRCeU1vZGVsKHByZXZpb3VzTW9kZWwpO1xuXG5cdFx0XHRwcmV2aW91c1ZpZXcubW9kZWwuc2V0KHsgZHJvcENoaWxkOiBkcm9wQ2hpbGQgfSk7XG5cdFx0XHRwcmV2aW91c1ZpZXcudWkubm9kZS50cmlnZ2VyKFwiZHJvcG5vZGVcIik7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKGluZGV4ID09PSAwKSB7XG5cdFx0XHRjb25zdCBjdXJyZW50TW9kZWwgPSB0aGlzLmNvbGxlY3Rpb24uYXQoaW5kZXgpO1xuXHRcdFx0Y29uc3QgY3VycmVudFZpZXcgPSB0cmVlVmlldy5jaGlsZHJlbi5maW5kQnlNb2RlbChjdXJyZW50TW9kZWwpO1xuXG5cdFx0XHRjdXJyZW50Vmlldy5tb2RlbC5zZXQoeyBkcm9wRmlyc3RDaGlsZDogdHJ1ZSB9KTtcblx0XHRcdGN1cnJlbnRWaWV3Lm1vZGVsLnNldCh7IGRyb3BDaGlsZDogZHJvcENoaWxkIH0pO1xuXHRcdFx0Y3VycmVudFZpZXcudWkubm9kZS50cmlnZ2VyKFwiZHJvcG5vZGVcIik7XG5cdFx0fVxuXHR9LFxuXG5cdG9uTFBWaWV3Q2hhbmdlZDogZnVuY3Rpb24obW9kZSkge1xuXHRcdGVkaXRTdGF0ZXMudmlld01vZGUgPSBtb2RlO1xuXG5cdFx0bGV0IHVybCA9IGAvY29uc29sZS9sZWFybmluZ1BhdGhzLyR7dGhpcy5tb2RlbC5pZH1gO1xuXHRcdGlmIChtb2RlKSB7XG5cdFx0XHR1cmwgPSBgL2NvbnNvbGUvbGVhcm5pbmdQYXRocy8ke3RoaXMubW9kZWwuaWR9L3ZpZXdgO1xuXHRcdFx0aWYgKHRoaXMubW9kZWwuaGFzKFwiZGVmYXVsdFZpZXdVc2VyXCIpKSB7XG5cdFx0XHRcdHZpZXdpbmdVc2VyID0gdGhpcy5tb2RlbC5nZXQoXCJkZWZhdWx0Vmlld1VzZXJcIik7XG5cdFx0XHRcdHVybCArPSBgLyR7dGhpcy5tb2RlbC5nZXQoXCJkZWZhdWx0Vmlld1VzZXJcIil9YDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRnbG9iYWxSYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuTmF2aWdhdGUsIHVybCwgeyB0cmlnZ2VyOiBmYWxzZSB9KTtcblxuXHRcdGlmIChtb2RlKSB7XG5cdFx0XHR0aGlzLnVpLmxlZnRTZWN0aW9uLnJlbW92ZUNsYXNzKFwiaW52aXNpYmxlXCIpO1xuXHRcdFx0dGhpcy51aS52aWV3T3ZlcmxheS5jc3MoeyBvcGFjaXR5OiAwLjksIFwicG9pbnRlci1ldmVudHNcIjogXCJhbGxcIiB9KTtcblx0XHRcdHRoaXMudWkudmlld092ZXJsYXlNZXNzYWdlLnRleHQoYFNlbGVjdCBhIHVzZXIgdG8gdmlldyB0aGVpciAke3NldHRpbmdzLmxlYXJuaW5nUGF0aHNDdXN0b21OYW1lfSBwcm9ncmVzc2ApO1xuXG5cdFx0XHRjb25zdCBvID0ge307XG5cdFx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJkZWZhdWx0Vmlld1VzZXJcIikpIHtcblx0XHRcdFx0by5kZWZhdWx0ID0ge1xuXHRcdFx0XHRcdGZldGNoOiBgJHtzZXR0aW5ncy51cmxSb290fS9hY2FjaWEvbGVhcm5pbmdQYXRocy8ke3RoaXMubW9kZWwuZ2V0KFwibGVhcm5pbmdfcGF0aFwiKX0vdXNlcnMvJHt0aGlzLm1vZGVsLmdldChcImRlZmF1bHRWaWV3VXNlclwiKX1gLFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnVzZXJWaWV3U2VsZWN0cmEgPSBuZXcgU2VsZWN0cmEoe1xuXHRcdFx0XHR3aWR0aDogXCIzMzBweFwiLFxuXHRcdFx0XHRzZXJ2ZXI6IF8uZXh0ZW5kKHtcblx0XHRcdFx0XHRmZXRjaDogYCR7c2V0dGluZ3MudXJsUm9vdH0vYWNhY2lhL2xlYXJuaW5nUGF0aHMvJHt0aGlzLm1vZGVsLmdldChcImxlYXJuaW5nX3BhdGhcIil9L3VzZXJzYCxcblx0XHRcdFx0XHRkZWxheUxvYWQ6ICF0aGlzLm1vZGVsLmhhcyhcImRlZmF1bHRWaWV3VXNlclwiKSxcblx0XHRcdFx0XHRrZXk6IFwidXNlcl9pZFwiLFxuXHRcdFx0XHRcdHZhbHVlOiBcIm5hbWVcIixcblx0XHRcdFx0fSwgbyksXG5cdFx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRcdHBhZ2VTaXplOiAzMCxcblx0XHRcdFx0XHRpbmZpbml0ZTogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0cGxhY2Vob2xkZXI6IFwiU2VsZWN0IHVzZXJcIixcblx0XHRcdFx0ZGRIb3N0OiBcIiNsaW5rLXJlc291cmNlc1wiLFxuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMudXNlclZpZXdTZWxlY3RyYS5zaG93KHsgZWw6IHRoaXMudWkudmlld1VzZXIgfSk7XG5cblx0XHRcdGNvbnN0IGVsID0gJChcIi5sZWFybmluZ19wYXRoLW1hbmFnZXJcIikuZ2V0KDApO1xuXHRcdFx0aWYgKGVsKVxuXHRcdFx0XHRlbC5zY3JvbGxUb3AgPSAwO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMudWkubGVmdFNlY3Rpb24uYWRkQ2xhc3MoXCJpbnZpc2libGVcIik7XG5cdFx0XHR0aGlzLnVpLnZpZXdPdmVybGF5LmNzcyh7IG9wYWNpdHk6IDAsIFwicG9pbnRlci1ldmVudHNcIjogXCJub25lXCIgfSk7XG5cdFx0XHRpZiAodGhpcy51c2VyVmlld1NlbGVjdHJhKSB7XG5cdFx0XHRcdHRoaXMudXNlclZpZXdTZWxlY3RyYS5kZXN0cm95KCk7XG5cdFx0XHRcdHRoaXMudXNlclZpZXdTZWxlY3RyYSA9IG51bGw7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5lZGl0aW5nVG9nZ2xlKCk7XG5cdH0sXG5cblx0ZW5hYmxlRWRpdGluZzogZnVuY3Rpb24oKSB7XG5cdFx0ZWRpdFN0YXRlcy5lZGl0aW5nQWxsb3dlZCA9IHRydWU7XG5cdFx0dGhpcy5lZGl0aW5nVG9nZ2xlKCk7XG5cdH0sXG5cblx0ZGlzYWJsZUVkaXRpbmc6IGZ1bmN0aW9uKCkge1xuXHRcdGVkaXRTdGF0ZXMuZWRpdGluZ0FsbG93ZWQgPSBmYWxzZTtcblx0XHR0aGlzLmVkaXRpbmdUb2dnbGUoKTtcblx0fSxcblxuXHRvblZpZXdVc2VyQ2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCB1c2VyID0gdGhpcy51aS52aWV3VXNlci52YWwoKTtcblx0XHRpZiAoIXVzZXIpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR2aWV3aW5nVXNlciA9IHVzZXI7XG5cblx0XHRjb25zdCB1cmwgPSBgL2NvbnNvbGUvbGVhcm5pbmdQYXRocy8ke3RoaXMubW9kZWwuaWR9L3ZpZXcvJHt1c2VyfWA7XG5cdFx0Z2xvYmFsUmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLk5hdmlnYXRlLCB1cmwsIHsgdHJpZ2dlcjogZmFsc2UgfSk7XG5cblx0XHR0aGlzLnVpLnZpZXdPdmVybGF5LmNzcyh7IG9wYWNpdHk6IDAsIFwicG9pbnRlci1ldmVudHNcIjogXCJub25lXCIgfSk7XG5cblx0XHQvLyBGZXRjaCB0aGUgc3RhdGUgZm9yIHRoaXMgdXNlciwgYW5kIHN0YXJ0IGxpc3RlbmluZyBmb3IgcmVhbHRpbWUgc3RhdGUgY2hhbmdlc1xuXHRcdCQuYWpheCh7XG5cdFx0XHRtZXRob2Q6IFwiR0VUXCIsXG5cdFx0XHR1cmw6IGAke3NldHRpbmdzLnVybFJvb3R9L2FjYWNpYS9sZWFybmluZ1BhdGhzLyR7dGhpcy5tb2RlbC5nZXQoXCJsZWFybmluZ19wYXRoXCIpfS91c2Vycy8ke3VzZXJ9L3BhdGhTdGF0ZWAsXG5cdFx0XHRzdWNjZXNzOiB0aGlzLnNob3dBbmRVcGRhdGVVc2VyU3RhdGUuYmluZCh0aGlzKSxcblx0XHRcdGVycm9yOiBlID0+IGNvbnNvbGUuZXJyb3IoZSksXG5cdFx0fSk7XG5cblx0XHQvLyBNZWFud2hpbGUsIGhpZGUgdGhlIGl0ZW1zIHRoaXMgdXNlciBjYW5ub3Qgc2VlXG5cblx0XHRpZiAodGhpcy5wcmV2aW91c1VzZXJHcm91cHMpIHtcblx0XHRcdF8uZWFjaChncm91cE1hcCwgKHZhbCwgeCkgPT4ge1xuXHRcdFx0XHRpZiAoIV8uaW5jbHVkZXModGhpcy5wcmV2aW91c1VzZXJHcm91cHMsIHgpKVxuXHRcdFx0XHRcdF8uZWFjaChncm91cE1hcFt4XSwgeSA9PiB5LnNldCh7IGludmlzaWJsZTogZmFsc2UgfSkpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZ3JvdXBzID0gdGhpcy51c2VyVmlld1NlbGVjdHJhLmdldFNlbGVjdGVkKCkuZ3JvdXBzO1xuXG5cdFx0Xy5lYWNoKGdyb3VwTWFwLCAodmFsLCB4KSA9PiB7XG5cdFx0XHRpZiAoIV8uaW5jbHVkZXMoZ3JvdXBzLCB4KSlcblx0XHRcdFx0Xy5lYWNoKGdyb3VwTWFwW3hdLCB5ID0+IHkuc2V0KHsgaW52aXNpYmxlOiB0cnVlIH0pKTtcblx0XHR9KTtcblxuXHRcdHRoaXMucHJldmlvdXNVc2VyR3JvdXBzID0gZ3JvdXBzO1xuXHR9LFxuXG5cdHNob3dBbmRVcGRhdGVVc2VyU3RhdGU6IGZ1bmN0aW9uKGRhdGEpIHtcblx0XHR0aGlzLnVzZXJTdGF0ZSA9IGRhdGE7XG5cblx0XHQvLyBBc3N1bWUgYWxsIHRhc2tzIC0gaW5jbHVkaW5nIHVuZmV0Y2hlZCBvbmVzLCBjcnVjaWFsbHkgLSBhcmUgcHJvZ3Jlc3MgMFxuXHRcdF8uZWFjaCh0YXNrTWFwLCB4ID0+IHguc2V0KHsgcHJvZ3Jlc3M6IDAgfSkpO1xuXG5cdFx0Ly8gU2V0IHRoZSByZWFsIHByb2dyZXNzIHN0YXRlc1xuXHRcdF8uZWFjaChkYXRhLCB4ID0+IHtcblx0XHRcdGlmICh4Ll9pZCBpbiB0YXNrTWFwKVxuXHRcdFx0XHR0YXNrTWFwW3guX2lkXS5zZXQoeyBwcm9ncmVzczogeC5scF9pdGVtX3Byb2dyZXNzIH0pO1xuXHRcdH0pO1xuXHR9LFxuXG5cdHdzQ29ubmVjdGVkOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBjb21wbGV0ZUNvbm5lY3Rpb24gPSAoKSA9PiB7XG5cdFx0XHR0aGlzLmpvaW5MUFJvb20oKTtcblxuXHRcdFx0dGhpcy5tb2RlbC5zZXQoeyB3c0Nvbm5lY3RlZDogdHJ1ZSB9KTtcblx0XHR9O1xuXG5cdFx0cmV0dXJuIEFwcC53cy5nZXRJRCgpLnRoZW4oaWQgPT4ge1xuXHRcdFx0dGhpcy5tb2RlbC5zZXQoeyB3ZWJzb2NrZXRfaWQ6IGlkIH0pO1xuXHRcdFx0cmV0dXJuIGNvbXBsZXRlQ29ubmVjdGlvbigpO1xuXHRcdH0pO1xuXHR9LFxuXG5cdHdzRGlzY29ubmVjdGVkOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm1vZGVsLnNldCh7IHdzQ29ubmVjdGVkOiBmYWxzZSB9KTtcblx0fSxcblxuXHR3c0Nvbm5lY3Rpb25DaGFuZ2VkOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLnVua25vd25TdGF0dXMuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0Ly9jb25zb2xlLmRlYnVnKFwid3NDb25uZWN0aW9uQ2hhbmdlZFwiLCB0aGlzLm1vZGVsLmdldChcIndzQ29ubmVjdGVkXCIpKTtcblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJ3c0Nvbm5lY3RlZFwiKSkge1xuXHRcdFx0dGhpcy51aS5jb25uZWN0aW9uTG9zdFN0YXR1cy5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0Ly8gVXNlciBnb3QgbG9nZ2VkIG91dC5cblx0XHRcdGlmICghQXBwLlNlc3Npb24uZ2V0KFwiYXV0aGVudGljYXRlZFwiKSlcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRpZiAoIXBhZ2VVbmxvYWRpbmcpXG5cdFx0XHRcdHRoaXMudWkuY29ubmVjdGlvbkxvc3RTdGF0dXMucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0XHR0aGlzLm1vZGVsLnVuc2V0KFwid2Vic29ja2V0X2lkXCIpO1xuXHRcdFx0dGhpcy5tb2RlbC51bnNldChcInNwYXJrXCIpO1xuXHRcdFx0bHBSYWRpby50cmlnZ2VyKEV2ZW50cy5EaXNhYmxlRWRpdGluZyk7XG5cblx0XHRcdHRoaXMub25NdWx0aUNhbmNlbCgpO1xuXHRcdH1cblxuXHRcdHRoaXMuZWRpdGluZ1RvZ2dsZSgpO1xuXHR9LFxuXG5cdHdzTWVzc2FnZTogZnVuY3Rpb24obWVzc2FnZSkge1xuXHRcdGlmIChtZXNzYWdlLmxlYXJuaW5nX3BhdGhzKSB7XG5cdFx0XHRpZiAobWVzc2FnZS5hY2Nlc3NfcmVxdWVzdGVkKSB7XG5cdFx0XHRcdC8vIFNob3cgYSBtb2RhbCBhc2tpbmcgZm9yIGFjY2Vzc1xuXHRcdFx0XHRjb25zdCBtb2RhbCA9IG5ldyBTbWFsbE1vZGFsKHtcblx0XHRcdFx0XHR0aXRsZTogXCJBY2Nlc3MgUmVxdWVzdGVkXCIsXG5cdFx0XHRcdFx0Ym9keTogYFRoZSB1c2VyICR7bWVzc2FnZS5zb3VyY2VOYW1lLnJlcGxhY2UoLzwvZywgXCImbHQ7XCIpLnJlcGxhY2UoLz4vZywgXCImZ3Q7XCIpfSBoYXMgYXNrZWQgZm9yIGFjY2VzcyB0byB0aGlzXG5cdFx0XHRcdFx0XHQke3NldHRpbmdzLmxlYXJuaW5nUGF0aHNDdXN0b21OYW1lLnJlcGxhY2UoLzwvZywgXCImbHQ7XCIpLnJlcGxhY2UoLz4vZywgXCImZ3Q7XCIpfS48YnIvPjxici8+XG5cdFx0XHRcdFx0XHRBY2Nlc3Mgd2lsbCBiZSBncmFudGVkIGF1dG9tYXRpY2FsbHkgaW4gJHtyZXF1ZXN0QWNjZXNzVGltZW91dH0gc2Vjb25kcyBpZiB5b3UgZG8gbm90IHJlc3BvbmQuYCxcblx0XHRcdFx0XHRjdXN0b21PSzogXCJHaXZlIEFjY2Vzc1wiLFxuXHRcdFx0XHRcdGN1c3RvbUNhbmNlbDogXCJEZW55XCIsXG5cdFx0XHRcdFx0aG9zdDogXCIjbGluay1yZXNvdXJjZXNcIixcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0bW9kYWwub24oXCJidXR0b246b2tcIiwgKCkgPT4ge1xuXHRcdFx0XHRcdEFwcC53cy53ZWJzb2NrZXQud3JpdGUoe1xuXHRcdFx0XHRcdFx0bGVhcm5pbmdfcGF0aHM6IHRydWUsXG5cdFx0XHRcdFx0XHRhY3Rpb246IFwiZ3JhbnRBY2Nlc3NcIixcblx0XHRcdFx0XHRcdHJvb206IHRoaXMubW9kZWwuZ2V0KFwiX2lkXCIpLFxuXHRcdFx0XHRcdFx0c291cmNlOiBtZXNzYWdlLnNvdXJjZSxcblx0XHRcdFx0XHRcdHNvdXJjZVNwYXJrOiBtZXNzYWdlLnNvdXJjZVNwYXJrLFxuXHRcdFx0XHRcdFx0c3Bhcms6IG1lc3NhZ2Uuc3BhcmssXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdG1vZGFsLm9uKFwiYnV0dG9uOmNhbmNlbFwiLCAoKSA9PiB7XG5cdFx0XHRcdFx0Y2xlYXJUaW1lb3V0KHRoaXMuYWNjZXNzUmVxdWVzdFRpbWVyKTtcblx0XHRcdFx0XHRBcHAud3Mud2Vic29ja2V0LndyaXRlKHtcblx0XHRcdFx0XHRcdGxlYXJuaW5nX3BhdGhzOiB0cnVlLFxuXHRcdFx0XHRcdFx0YWN0aW9uOiBcImRlbnlBY2Nlc3NcIixcblx0XHRcdFx0XHRcdHJvb206IHRoaXMubW9kZWwuZ2V0KFwiX2lkXCIpLFxuXHRcdFx0XHRcdFx0c291cmNlOiBtZXNzYWdlLnNvdXJjZSxcblx0XHRcdFx0XHRcdHNwYXJrOiBtZXNzYWdlLnNwYXJrLFxuXHRcdFx0XHRcdFx0c291cmNlU3Bhcms6IG1lc3NhZ2Uuc291cmNlU3BhcmssXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdC8vIFdhaXQgdXAgdG8gWCBzZWNvbmRzLCB0aGVuIGF1dG9tYXRpY2FsbHkgaGFuZCBvdmVyIGNvbnRyb2xcblx0XHRcdFx0dGhpcy5hY2Nlc3NSZXF1ZXN0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHRtb2RhbC5kZXN0cm95KCk7XG5cblx0XHRcdFx0XHRBcHAud3Mud2Vic29ja2V0LndyaXRlKHtcblx0XHRcdFx0XHRcdGxlYXJuaW5nX3BhdGhzOiB0cnVlLFxuXHRcdFx0XHRcdFx0YWN0aW9uOiBcImdyYW50QWNjZXNzXCIsXG5cdFx0XHRcdFx0XHRyb29tOiB0aGlzLm1vZGVsLmdldChcIl9pZFwiKSxcblx0XHRcdFx0XHRcdHNvdXJjZTogbWVzc2FnZS5zb3VyY2UsXG5cdFx0XHRcdFx0XHRzb3VyY2VTcGFyazogbWVzc2FnZS5zb3VyY2VTcGFyayxcblx0XHRcdFx0XHRcdHNwYXJrOiBtZXNzYWdlLnNwYXJrLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9LCByZXF1ZXN0QWNjZXNzVGltZW91dCAqIDEwMDApO1xuXG5cdFx0XHRcdG1vZGFsLnNob3coKTtcblxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmIChtZXNzYWdlLmFjY2Vzc19kZW5pZWQpIHtcblx0XHRcdFx0Y2xlYXJUaW1lb3V0KHRoaXMucmVxdWVzdGVkQWNjZXNzVGltZXIpO1xuXG5cdFx0XHRcdHJlcXVlc3RlZEFjY2VzcyA9IGZhbHNlO1xuXG5cdFx0XHRcdGdsb2JhbFJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5Ub2FzdCwge1xuXHRcdFx0XHRcdGNvbnRlbnQ6IFwiWW91ciByZXF1ZXN0IGZvciBhY2Nlc3Mgd2FzIGRlbmllZC5cIixcblx0XHRcdFx0XHRpY29uOiBcImZhLWJhblwiLFxuXHRcdFx0XHRcdGljb25Db2xvdXI6IFwicmVkXCIsXG5cdFx0XHRcdFx0aG9zdDogXCIjbGluay1yZXNvdXJjZXNcIixcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dGhpcy51aS5hY2Nlc3NDb250cm9sbGVycy5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHRcdHRoaXMudWkuYWNjZXNzUGF1c2UuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG1lc3NhZ2Uub3duZXIpXG5cdFx0XHRcdHRoaXMudXBkYXRlT3duZXIobWVzc2FnZSk7XG5cblx0XHRcdC8vIFRoaXMgbWVhbnMgd2Ugc3VjY2Vzc2Z1bGx5IGNvbnRhY3RlZCB0aGUgb3duZXIgdG8gYXNrIGZvciByZXF1ZXN0XG5cdFx0XHQvLyBhbmQgd2Ugc2hvdWxkIG5vdCBpbW1lZGlhdGVseSB0YWtlIGNvbnRyb2xcblx0XHRcdGlmIChtZXNzYWdlLmFjY2Vzc19yZXF1ZXN0X3JlY2VpdmVkKVxuXHRcdFx0XHRjbGVhclRpbWVvdXQodGhpcy5hdXRvbWF0aWNTdGVhbFRpbWVyKTtcblx0XHR9XG5cdH0sXG5cblx0am9pbkxQUm9vbTogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgdXNlciA9IGdsb2JhbFJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cblx0XHRBcHAud3Mud2Vic29ja2V0LndyaXRlKHtcblx0XHRcdGxlYXJuaW5nX3BhdGhzOiB0cnVlLFxuXHRcdFx0YWN0aW9uOiBcImpvaW5cIixcblx0XHRcdHJvb206IHRoaXMubW9kZWwuZ2V0KFwiX2lkXCIpLFxuXHRcdFx0dXNlcjogdXNlci51c2VyX2lkLFxuXHRcdH0pO1xuXHR9LFxuXG5cdGVkaXRpbmdUb2dnbGU6IGZ1bmN0aW9uKCkge1xuXHRcdGlmIChjYW5FZGl0KCkpIHtcblx0XHRcdHRoaXMudWkuY2VudHJlU2VjdGlvbi5hZGRDbGFzcyhcImludmlzaWJsZVwiKTtcblx0XHRcdHRoaXMudWkucmlnaHRTZWN0aW9uLnJlbW92ZUNsYXNzKFwiaW52aXNpYmxlXCIpO1xuXG5cdFx0XHQkKFwiYm9keVwiKS5yZW1vdmVBdHRyKFwib25kcmFnc3RhcnRcIik7XG5cdFx0XHQkKFwiYm9keVwiKS5yZW1vdmVBdHRyKFwib25kcm9wXCIpO1xuXG5cdFx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5VcGRhdGVEcmFnZ2luZ1N0YXR1cywgY2FuRWRpdCgpKTtcblx0XHRcdGxwUmFkaW8udHJpZ2dlcihFdmVudHMuRWRpdGluZ0NoYW5nZSwgY2FuRWRpdCgpKTtcblx0XHRcdC8vIFJlc2V0IHRvIGZhbHNlXG5cdFx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5DaGFuZ2VNdWx0aXNlbGVjdCwgZmFsc2UpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMudWkucmlnaHRTZWN0aW9uLmFkZENsYXNzKFwiaW52aXNpYmxlXCIpO1xuXG5cdFx0XHR0aGlzLnVpLmxvY2tlZFN0YXR1cy5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLnVpLnNlbGZMb2NrZWRTdGF0dXMuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0dGhpcy51aS51bmtub3duU3RhdHVzLmFkZENsYXNzKFwiaGlkZVwiKTtcblxuXHRcdFx0dGhpcy51aS5jZW50cmVTZWN0aW9uLnJlbW92ZUNsYXNzKFwiaW52aXNpYmxlXCIpO1xuXG5cdFx0XHQkKFwiYm9keVwiKS5hdHRyKFwib25kcmFnc3RhcnRcIiwgXCJyZXR1cm4gZmFsc2U7XCIpO1xuXHRcdFx0JChcImJvZHlcIikuYXR0cihcIm9uZHJvcFwiLCBcInJldHVybiBmYWxzZTtcIik7XG5cblx0XHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLlVwZGF0ZURyYWdnaW5nU3RhdHVzLCBjYW5FZGl0KCkpO1xuXHRcdFx0bHBSYWRpby50cmlnZ2VyKEV2ZW50cy5FZGl0aW5nQ2hhbmdlLCBjYW5FZGl0KCkpO1xuXG5cdFx0XHRpZiAocGFnZVVubG9hZGluZylcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRjb25zdCB1c2VyID0gZ2xvYmFsUmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblxuXHRcdFx0aWYgKHVzZXIgJiYgdGhpcy5tb2RlbC5nZXQoXCJsb2NrT3duZXJcIikpIHtcblx0XHRcdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwibG9ja093bmVyXCIpID09PSB1c2VyLnVzZXJfaWQpIHtcblx0XHRcdFx0XHR0aGlzLnVpLmxvY2tlZFN0YXR1cy5hZGRDbGFzcyhcImhpZGVcIik7XG5cblx0XHRcdFx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJsb2NrU3BhcmtcIikgIT09IHRoaXMubW9kZWwuZ2V0KFwid2Vic29ja2V0X2lkXCIpICYmIHRoaXMubW9kZWwuZ2V0KFwid3NDb25uZWN0ZWRcIikpXG5cdFx0XHRcdFx0XHR0aGlzLnVpLnNlbGZMb2NrZWRTdGF0dXMucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMudWkub3duZXJOYW1lcy50ZXh0KHRoaXMubW9kZWwuZ2V0KFwibG9ja093bmVyTmFtZVwiKSk7XG5cdFx0XHRcdFx0dGhpcy51aS5sb2NrZWRTdGF0dXMucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdHVwZGF0ZU93bmVyOiBmdW5jdGlvbihtZXNzYWdlKSB7XG5cdFx0Y29uc3QgdXNlciA9IGdsb2JhbFJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cdFx0dGhpcy5tb2RlbC5zZXQoeyBsb2NrU3Bhcms6IG1lc3NhZ2Uuc3BhcmssIGxvY2tPd25lcjogbWVzc2FnZS5vd25lciwgbG9ja093bmVyTmFtZTogbWVzc2FnZS5vd25lck5hbWUgfSk7XG5cblx0XHRyZXF1ZXN0ZWRBY2Nlc3MgPSBmYWxzZTtcblxuXHRcdHRoaXMudWkuYWNjZXNzQ29udHJvbGxlcnMucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkuYWNjZXNzUGF1c2UuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0aWYgKG1lc3NhZ2Uub3duZXIgPT09IHVzZXIudXNlcl9pZCkge1xuXHRcdFx0aWYgKG1lc3NhZ2Uuc3BhcmsgPT09IHRoaXMubW9kZWwuZ2V0KFwid2Vic29ja2V0X2lkXCIpKSB7XG5cdFx0XHRcdGNsZWFyVGltZW91dCh0aGlzLnJlcXVlc3RlZEFjY2Vzc1RpbWVyKTtcblx0XHRcdFx0cmV0dXJuIHRoaXMubW9kZWwuZmV0Y2goe1xuXHRcdFx0XHRcdHN1Y2Nlc3M6ICgpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMuY29sbGVjdGlvbi5yZXNldChfLnZhbHVlcyh0aGlzLm1vZGVsLmdldChcIml0ZW1zXCIpKSk7XG5cblx0XHRcdFx0XHRcdGxwUmFkaW8udHJpZ2dlcihFdmVudHMuRW5hYmxlRWRpdGluZyk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRlcnJvcjogZSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKFwiRXJyb3IgcmVmZXRjaGluZyBMUCBhZnRlciBvd25lcnNoaXAgY2hhbmdlXCIsIGUpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vY29uc29sZS5kZWJ1ZyhcIkRpc2FibGUgZWRpdGluZ1wiLCBtZXNzYWdlLm93bmVyLCB1c2VyLnVzZXJfaWQsIG1lc3NhZ2Uuc3BhcmssIHRoaXMubW9kZWwuZ2V0KFwid2Vic29ja2V0X2lkXCIpKTtcblx0XHRscFJhZGlvLnRyaWdnZXIoRXZlbnRzLkRpc2FibGVFZGl0aW5nKTtcblx0fSxcblxuXHRib2R5Q2xpY2tlcjogZnVuY3Rpb24oKSB7XG5cdFx0bHBSYWRpby50cmlnZ2VyKEV2ZW50cy5Cb2R5Q2xpY2spO1xuXHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLkNsb3NlUmVzb3VyY2VzKTtcblx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5DbG9zZVNpbXBsZU1lbnVzKTtcblx0fSxcblxuXHRib2R5TW91c2Vtb3ZlOiBmdW5jdGlvbihlKSB7XG5cdFx0aWYgKCFkcmFnZ2luZ1Jlc291cmNlICYmICF0aGlzLmRyYWdnaW5nTm9kZVZpZXcpXG5cdFx0XHRyZXR1cm47XG5cblx0XHQvL1Nsb3cgdGhlIHRyaWdnZXIgcmF0ZSBkb3duLlxuXHRcdGlmICh0aGlzLnNjcm9sbGVkUmVjZW50bHkpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLnNjcm9sbGVkUmVjZW50bHkgPSB0cnVlO1xuXHRcdF8uZGVsYXkoKCkgPT4gKHRoaXMuc2Nyb2xsZWRSZWNlbnRseSA9IGZhbHNlKSwgMjAwKTtcblxuXHRcdGNvbnN0IHNjcm9sbE9mZnNldCA9IE1hdGguY2VpbCh3aW5kb3cuaW5uZXJIZWlnaHQgLyA3KSwgZWwgPSB0aGlzLiRlbFswXTtcblxuXHRcdC8vIElmIHRoZSBkcmFnZ2VkIGl0ZW0gaXMgY2xvc2UgdG8gdGhlIHRvcCBvciBib3R0b20gb2YgdGhlIHNjcmVlbiwgc2Nyb2xsIHRoZSBzY3JlZW5cblx0XHRpZiAoZS5vcmlnaW5hbEV2ZW50LmNsaWVudFkgPCAod2luZG93LnNjcmVlblkgKyBNYXRoLmNlaWwod2luZG93LmlubmVySGVpZ2h0IC8gNykgKyB0aGlzLiRlbC5vZmZzZXQoKS50b3ApKSB7XG5cdFx0XHRpZiAoZWwuc2Nyb2xsQnkpIHtcblx0XHRcdFx0ZWwuc2Nyb2xsQnkoe1xuXHRcdFx0XHRcdGxlZnQ6IDAsXG5cdFx0XHRcdFx0dG9wOiAtc2Nyb2xsT2Zmc2V0LFxuXHRcdFx0XHRcdGJlaGF2aW9yOiBcInNtb290aFwiLFxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRlbC5zY3JvbGxUb3AgPSBlbC5zY3JvbGxUb3AgLSBzY3JvbGxPZmZzZXQ7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGVsc2UgaWYgKGUub3JpZ2luYWxFdmVudC5jbGllbnRZID4gKHdpbmRvdy5zY3JlZW5ZICsgd2luZG93LmlubmVySGVpZ2h0IC0gc2Nyb2xsT2Zmc2V0KSkge1xuXHRcdFx0aWYgKGVsLnNjcm9sbEJ5KSB7XG5cdFx0XHRcdGVsLnNjcm9sbEJ5KHtcblx0XHRcdFx0XHRsZWZ0OiAwLFxuXHRcdFx0XHRcdHRvcDogc2Nyb2xsT2Zmc2V0LFxuXHRcdFx0XHRcdGJlaGF2aW9yOiBcInNtb290aFwiLFxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRlbC5zY3JvbGxUb3AgPSBlbC5zY3JvbGxUb3AgKyBzY3JvbGxPZmZzZXQ7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdG9uQWRkU2VjdGlvbkNsaWNrZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMub25BZGRTZWN0aW9uQ2xpY2soKTtcblx0fSxcblxuXHRvbkFkZFNlY3Rpb25DbGljazogYXN5bmMgZnVuY3Rpb24oc291cmNlTW9kZWwpIHtcblx0XHRpZiAodGhpcy5zZWxlY3RlZFZpZXcgJiYgdGhpcy5zZWxlY3RlZFZpZXcuY2hpbGRyZW4ubGVuZ3RoKSB7XG5cdFx0XHRpZiAodGhpcy5zZWxlY3RlZFZpZXcubW9kZWwuZ2V0KFwiaXNDb2xsYXBzZWRcIikpXG5cdFx0XHRcdGF3YWl0IHRoaXMuc2VsZWN0ZWRWaWV3LmNvbGxhcHNlTm9kZShmYWxzZSk7XG5cblx0XHRcdHJldHVybiB0aGlzLnNlbGVjdGVkVmlldy5vbkFkZENoaWxkTm9kZUJ0bigpO1xuXHRcdH1cblxuXHRcdGNvbnN0IG5ld1NlY3Rpb24gPSBuZXcgTm9kZU1vZGVsKHtcblx0XHRcdGNhdGVnb3J5OiBcIm5vZGVcIixcblx0XHRcdGVkaXRNb2RlOiB0cnVlLFxuXHRcdFx0bGVhcm5pbmdfcGF0aDogdGhpcy5tb2RlbC5nZXQoXCJsZWFybmluZ19wYXRoXCIpLFxuXHRcdFx0ZGVwdGg6IDEsXG5cdFx0XHRwYXRoOiBcIkFBQVwiLFxuXHRcdFx0Z3JvdXBzOiBbdGhpcy5tb2RlbC5nZXQoXCJncm91cFwiKV0sXG5cdFx0fSk7XG5cblx0XHRjb25zdCBsYXN0TW9kZWwgPSBzb3VyY2VNb2RlbCB8fCBfLmxhc3QodGhpcy5jb2xsZWN0aW9uLm1vZGVscyk7XG5cdFx0aWYgKGxhc3RNb2RlbClcblx0XHRcdG5ld1NlY3Rpb24uc2V0KFwicGF0aFwiLCBsb2NhbE1ldGhvZHMuZ2V0TmV4dFBhdGgobGFzdE1vZGVsLnBhdGggfHwgbGFzdE1vZGVsLmdldChcInBhdGhcIikpKTtcblxuXHRcdGNvbnN0IG9wdHMgPSB7fTtcblx0XHRpZiAoc291cmNlTW9kZWwpXG5cdFx0XHRvcHRzLmF0ID0gdGhpcy5jb2xsZWN0aW9uLmluZGV4T2Yoc291cmNlTW9kZWwpICsgMTtcblxuXHRcdHRoaXMuY29sbGVjdGlvbi5hZGQobmV3U2VjdGlvbiwgb3B0cyk7XG5cdH0sXG5cblx0b25JbXBvcnRCb29rQ2xpY2s6IGZ1bmN0aW9uKGV2ZW50LCBvcHRpb25zKSB7XG5cdFx0Y29uc3QgbW9kYWwgPSBuZXcgSW1wb3J0VG9jTW9kYWwoe1xuXHRcdFx0Z3JvdXA6IHRoaXMubW9kZWwuZ2V0KFwiZ3JvdXBcIiksXG5cdFx0XHRncm91cHM6IFt0aGlzLm1vZGVsLmdldChcImdyb3VwXCIpXSxcblx0XHRcdGxlYXJuaW5nX3BhdGg6IHRoaXMubW9kZWwuZ2V0KFwibGVhcm5pbmdfcGF0aFwiKSxcblx0XHRcdG1vZGVsOiBuZXcgQmFja2JvbmUuTW9kZWwoKSxcblx0XHRcdGhvc3Q6IFwiI2xpbmstcmVzb3VyY2VzXCIsXG5cdFx0XHRyZXNldEZvcm1hdDogb3B0aW9ucyA/IG9wdGlvbnMucmVzZXRGb3JtYXQgOiBmYWxzZSxcblx0XHRcdGtlZXBCb29rQXR0YWNobWVudHM6IG9wdGlvbnMgPyBvcHRpb25zLmtlZXBCb29rQXR0YWNobWVudHMgOiBmYWxzZSxcblx0XHR9KTtcblxuXHRcdG1vZGFsLnNob3coe1xuXHRcdFx0Y3JlYXRlOiBpdGVtcyA9PiB7XG5cdFx0XHRcdHRoaXMucmVsb2FkVHJlZSgpO1xuXG5cdFx0XHRcdGNvbnN0IGZsYXR0ZW5JdGVtcyA9IChvYmosIGZsYXRJdGVtcykgPT4ge1xuXHRcdFx0XHRcdF8uZm9yT3duKG9iaiwgcm93ID0+IHtcblx0XHRcdFx0XHRcdGZsYXRJdGVtcy5wdXNoKHJvdyk7XG5cdFx0XHRcdFx0XHRpZiAocm93LmNoaWxkcmVuKVxuXHRcdFx0XHRcdFx0XHRmbGF0dGVuSXRlbXMocm93LmNoaWxkcmVuLCBmbGF0SXRlbXMpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdGNvbnN0IGZsYXRJdGVtcyA9IFtdO1xuXHRcdFx0XHRmbGF0dGVuSXRlbXMoaXRlbXMsIGZsYXRJdGVtcyk7XG5cdFx0XHRcdHRoaXMuaW1wb3J0ZWRJdGVtc0xlbmd0aCA9IGZsYXRJdGVtcy5sZW5ndGg7XG5cdFx0XHR9LFxuXHRcdFx0Y2FuY2VsOiAoKSA9PiB7XG5cdFx0XHRcdG1vZGFsLmRlc3Ryb3koKTtcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH0sXG5cblx0b25SZXNldEZvcm1hdENsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBtb2RhbCA9IG5ldyBTbWFsbE1vZGFsKHtcblx0XHRcdHdhcm5pbmc6IHRydWUsXG5cdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmFsIGZhLXN5bmMtYWx0Jy8+IFJlc2V0IEZvcm1hdCBXYXJuaW5nXCIsXG5cdFx0XHRib2R5OiBgPHA+QWxsIHRoZSBjb250ZW50IGZyb20gdGhlICR7c2V0dGluZ3MubGVhcm5pbmdQYXRoc0N1c3RvbU5hbWV9IHdpbGwgYmUgcmVtb3ZlZC48L3A+PHA+VGhpcyBvcGVyYXRpb24gbWFrZXMgaXJyZXZvY2FibGUgY2hhbmdlczsgdGhleSBjYW5ub3QgYmUgdW5kb25lLiBBcmUgeW91IHN1cmU/PC9wPlxuXHRcdFx0PHA+PGxhYmVsPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwia2VlcEJvb2tBdHRhY2htZW50c1wiIC8+IEtlZXAgYWxsIGxpbmtlZCBhdHRhY2htZW50cyBpbiBib29rcy48L2xhYmVsPjwvcD5gLFxuXHRcdFx0aG9zdDogXCIjbGluay1yZXNvdXJjZXNcIixcblx0XHR9KTtcblxuXHRcdG1vZGFsLm9uKFwiYnV0dG9uOm9rXCIsICgpID0+IHtcblx0XHRcdGNvbnN0IGtlZXBCb29rQXR0YWNobWVudHMgPSAkKFwiaW5wdXRbbmFtZT0na2VlcEJvb2tBdHRhY2htZW50cyddXCIsIG1vZGFsLmVsKS5wcm9wKFwiY2hlY2tlZFwiKTtcblxuXHRcdFx0Y29uc3QgdGVtcGxhdGVNb2RhbCA9IG5ldyBMcFRlbXBsYXRlTW9kYWwoe1xuXHRcdFx0XHRncm91cDogdGhpcy5tb2RlbC5nZXQoXCJncm91cFwiKSxcblx0XHRcdFx0bW9kZWw6IG5ldyBCYWNrYm9uZS5Nb2RlbCgpLFxuXHRcdFx0fSk7XG5cblx0XHRcdHRlbXBsYXRlTW9kYWwuc2hvdyh7XG5cdFx0XHRcdGNyZWF0ZTogcmVzdWx0ID0+IHtcblx0XHRcdFx0XHRjb25zdCByZXNldEZvcm1hdCA9IHRydWU7XG5cblx0XHRcdFx0XHRpZiAocmVzdWx0Lm1vZGVsLmdldChcInRlbXBsYXRlXCIpID09PSBcImV4aXN0aW5nXCIpIHtcblx0XHRcdFx0XHRcdC8vIENsb25lIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHNwZWNpZmllZCBleGlzdGluZyBsZWFybmluZyBwYXRoXG5cdFx0XHRcdFx0XHR0aGlzLnNvdXJjZUxQTW9kZWwgPSBuZXcgTGVhcm5pbmdQYXRoKHsgZ3JvdXA6IHJlc3VsdC5tb2RlbC5nZXQoXCJzb3VyY2VJRFwiKSB9KTtcblx0XHRcdFx0XHRcdHRoaXMuc291cmNlTFBNb2RlbC5mZXRjaCh7XG5cdFx0XHRcdFx0XHRcdHVybDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FjYWNpYS9sZWFybmluZ1BhdGhzL1wiICsgcmVzdWx0Lm1vZGVsLmdldChcInNvdXJjZUlEXCIpICsgXCI/Y2xvbmU9XCIgKyB0aGlzLm1vZGVsLmdldChcImdyb3VwXCIpICtcblx0XHRcdFx0XHRcdFx0XHRcIiZ3aXRoUmVzb3VyY2VzPVwiICsgcmVzdWx0Lm1vZGVsLmdldChcIndpdGhSZXNvdXJjZXNcIikgKyBcIiZ3aXRoVGFncz1cIiArIHJlc3VsdC5tb2RlbC5nZXQoXCJ3aXRoVGFnc1wiKSArIFwiJnJlc2V0Rm9ybWF0PXRydWUma2VlcEJvb2tBdHRhY2htZW50cz1cIiArIGtlZXBCb29rQXR0YWNobWVudHMsXG5cdFx0XHRcdFx0XHRcdHN1Y2Nlc3M6IHRoaXMucmVsb2FkVHJlZS5iaW5kKHRoaXMpLFxuXHRcdFx0XHRcdFx0XHRlcnJvcjogdGhpcy5sb2FkU291cmNlTFBNb2RlbEVycm9yLmJpbmQodGhpcyksXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZSBpZiAocmVzdWx0Lm1vZGVsLmdldChcInRlbXBsYXRlXCIpID09PSBcImJvb2tcIikge1xuXHRcdFx0XHRcdFx0Xy5kZWxheShfLmJpbmQodGhpcy5vbkltcG9ydEJvb2tDbGljaywgdGhpcywgbnVsbCwgeyByZXNldEZvcm1hdCwga2VlcEJvb2tBdHRhY2htZW50cyB9KSwgMTAwKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZSBpZiAocmVzdWx0Lm1vZGVsLmdldChcInRlbXBsYXRlXCIpID09PSBcImJsYW5rXCIpIHtcblx0XHRcdFx0XHRcdHRoaXMuc291cmNlTFBNb2RlbCA9IG5ldyBMZWFybmluZ1BhdGgoeyBncm91cDogcmVzdWx0Lm1vZGVsLmdldChcInNvdXJjZUlEXCIpIH0pO1xuXHRcdFx0XHRcdFx0dGhpcy5zb3VyY2VMUE1vZGVsLmZldGNoKHtcblx0XHRcdFx0XHRcdFx0dXJsOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYWNhY2lhL2xlYXJuaW5nUGF0aHMvP2JsYW5rPXRydWUmcmVzZXRGb3JtYXQ9dHJ1ZSZncm91cD1cIiArIHRoaXMubW9kZWwuZ2V0KFwiZ3JvdXBcIikgKyBcIiZrZWVwQm9va0F0dGFjaG1lbnRzPVwiICsga2VlcEJvb2tBdHRhY2htZW50cyxcblx0XHRcdFx0XHRcdFx0c3VjY2VzczogdGhpcy5yZWxvYWRUcmVlLmJpbmQodGhpcyksXG5cdFx0XHRcdFx0XHRcdGVycm9yOiB0aGlzLmxvYWRTb3VyY2VMUE1vZGVsRXJyb3IuYmluZCh0aGlzKSxcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlIGlmIChyZXN1bHQubW9kZWwuZ2V0KFwidGVtcGxhdGVcIikgPT09IFwiY2FsZW5kYXJcIikge1xuXHRcdFx0XHRcdFx0dGhpcy5zb3VyY2VMUE1vZGVsID0gbmV3IExlYXJuaW5nUGF0aCh7IGdyb3VwOiByZXN1bHQubW9kZWwuZ2V0KFwic291cmNlSURcIikgfSk7XG5cdFx0XHRcdFx0XHR0aGlzLnNvdXJjZUxQTW9kZWwuZmV0Y2goe1xuXHRcdFx0XHRcdFx0XHR1cmw6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hY2FjaWEvbGVhcm5pbmdQYXRocy9cIiArIHRoaXMubW9kZWwuZ2V0KFwiZ3JvdXBcIikgKyBcIj9jYWxlbmRhcj1cIiArIHJlc3VsdC5tb2RlbC5nZXQoXCJ0eXBlXCIpICsgXCImcmVzZXRGb3JtYXQ9dHJ1ZSZncm91cD1cIiArXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5tb2RlbC5nZXQoXCJncm91cFwiKSArIFwiJmtlZXBCb29rQXR0YWNobWVudHM9XCIgKyBrZWVwQm9va0F0dGFjaG1lbnRzLFxuXHRcdFx0XHRcdFx0XHRzdWNjZXNzOiB0aGlzLmNhbGVuZGFySW1wb3J0LmJpbmQodGhpcyksXG5cdFx0XHRcdFx0XHRcdGVycm9yOiB0aGlzLmxvYWRTb3VyY2VMUE1vZGVsRXJyb3IuYmluZCh0aGlzKSxcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0bW9kYWwuc2hvdygpO1xuXHR9LFxuXG5cdG5vZGVDaGFuZ2VkOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmNvbGxlY3Rpb24udHJpZ2dlcihcIm5vZGU6Y2hhbmdlXCIpO1xuXHRcdHRoaXMubG9hZExQTmF2aWdhdGlvbigpO1xuXG5cdFx0aWYgKHRoaXMuaW1wb3J0ZWRJdGVtc0xlbmd0aClcblx0XHRcdHRoaXMub25JbXBvcnRTY3JvbGwoKTtcblx0fSxcblxuXHRvbkltcG9ydFNjcm9sbDogZnVuY3Rpb24oKSB7XG5cdFx0JChcIi5scC1ub2RlXCIpWyQoXCIubHAtbm9kZVwiKS5sZW5ndGggLSB0aGlzLmltcG9ydGVkSXRlbXNMZW5ndGhdLnNjcm9sbEludG9WaWV3KCk7XG5cdFx0dGhpcy5pbXBvcnRlZEl0ZW1zTGVuZ3RoID0gbnVsbDtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuX2xvY2F0aW9uKSB7XG5cdFx0XHRjb25zdCBbdmlldywgdXNlcl0gPSB0aGlzLl9sb2NhdGlvbi5zcGxpdChcIi9cIik7XG5cblx0XHRcdGlmICh2aWV3ID09PSBcInZpZXdcIikge1xuXHRcdFx0XHRpZiAodXNlciAmJiBfLmlzRmluaXRlKHBhcnNlSW50KHVzZXIsIDEwKSkpXG5cdFx0XHRcdFx0dGhpcy5tb2RlbC5zZXQoeyBkZWZhdWx0Vmlld1VzZXI6IHVzZXIgfSk7XG5cblx0XHRcdFx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5FdmVudHMuQ2hhbmdlTFBWaWV3LCB2aWV3KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCB0cmVlVmlldyA9IG5ldyBUcmVlVmlldyh7XG5cdFx0XHRjb2xsZWN0aW9uOiB0aGlzLmNvbGxlY3Rpb24sXG5cdFx0XHRtb2RlbDogdGhpcy5tb2RlbCxcblx0XHR9KTtcblxuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcInRyZWVcIiwgdHJlZVZpZXcpO1xuXG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwiaXNOZXdcIikgfHwgdGhpcy5jb2xsZWN0aW9uLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Y29uc3QgbW9kYWwgPSBuZXcgTHBUZW1wbGF0ZU1vZGFsKHtcblx0XHRcdFx0Z3JvdXA6IHRoaXMubW9kZWwuZ2V0KFwiZ3JvdXBcIiksXG5cdFx0XHRcdG1vZGVsOiBuZXcgQmFja2JvbmUuTW9kZWwoKSxcblx0XHRcdH0pO1xuXG5cdFx0XHRtb2RhbC5zaG93KHtcblx0XHRcdFx0Y3JlYXRlOiByZXN1bHQgPT4ge1xuXHRcdFx0XHRcdGlmIChyZXN1bHQubW9kZWwuZ2V0KFwidGVtcGxhdGVcIikgPT09IFwiZXhpc3RpbmdcIikge1xuXHRcdFx0XHRcdFx0Ly8gQ2xvbmUgdGhlIHN0cnVjdHVyZSBvZiB0aGUgc3BlY2lmaWVkIGV4aXN0aW5nIGxlYXJuaW5nIHBhdGhcblx0XHRcdFx0XHRcdHRoaXMuc291cmNlTFBNb2RlbCA9IG5ldyBMZWFybmluZ1BhdGgoeyBncm91cDogcmVzdWx0Lm1vZGVsLmdldChcInNvdXJjZUlEXCIpIH0pO1xuXHRcdFx0XHRcdFx0dGhpcy5zb3VyY2VMUE1vZGVsLmZldGNoKHtcblx0XHRcdFx0XHRcdFx0dXJsOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYWNhY2lhL2xlYXJuaW5nUGF0aHMvXCIgKyByZXN1bHQubW9kZWwuZ2V0KFwic291cmNlSURcIikgKyBcIj9jbG9uZT1cIiArIHRoaXMubW9kZWwuZ2V0KFwiZ3JvdXBcIikgK1xuXHRcdFx0XHRcdFx0XHRcdFwiJndpdGhSZXNvdXJjZXM9XCIgKyByZXN1bHQubW9kZWwuZ2V0KFwid2l0aFJlc291cmNlc1wiKSArIFwiJndpdGhUYWdzPVwiICsgcmVzdWx0Lm1vZGVsLmdldChcIndpdGhUYWdzXCIpLFxuXHRcdFx0XHRcdFx0XHRzdWNjZXNzOiB0aGlzLnJlbG9hZFRyZWUuYmluZCh0aGlzKSxcblx0XHRcdFx0XHRcdFx0ZXJyb3I6IHRoaXMubG9hZFNvdXJjZUxQTW9kZWxFcnJvci5iaW5kKHRoaXMpLFxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsc2UgaWYgKHJlc3VsdC5tb2RlbC5nZXQoXCJ0ZW1wbGF0ZVwiKSA9PT0gXCJib29rXCIpIHtcblx0XHRcdFx0XHRcdF8uZGVsYXkoXy5iaW5kKHRoaXMub25JbXBvcnRCb29rQ2xpY2ssIHRoaXMpLCAxMDApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlIGlmIChyZXN1bHQubW9kZWwuZ2V0KFwidGVtcGxhdGVcIikgPT09IFwiY2FsZW5kYXJcIikge1xuXHRcdFx0XHRcdFx0dGhpcy5zb3VyY2VMUE1vZGVsID0gbmV3IExlYXJuaW5nUGF0aCh7IGdyb3VwOiByZXN1bHQubW9kZWwuZ2V0KFwic291cmNlSURcIikgfSk7XG5cdFx0XHRcdFx0XHR0aGlzLnNvdXJjZUxQTW9kZWwuZmV0Y2goe1xuXHRcdFx0XHRcdFx0XHR1cmw6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hY2FjaWEvbGVhcm5pbmdQYXRocy9cIiArIHRoaXMubW9kZWwuZ2V0KFwiZ3JvdXBcIikgKyBcIj9jYWxlbmRhcj1cIiArIHJlc3VsdC5tb2RlbC5nZXQoXCJ0eXBlXCIpLFxuXHRcdFx0XHRcdFx0XHRzdWNjZXNzOiB0aGlzLmNhbGVuZGFySW1wb3J0LmJpbmQodGhpcyksXG5cdFx0XHRcdFx0XHRcdGVycm9yOiB0aGlzLmxvYWRTb3VyY2VMUE1vZGVsRXJyb3IuYmluZCh0aGlzKSxcblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0Y2FuY2VsOiAoKSA9PiB7XG5cdFx0XHRcdFx0Z2xvYmFsUmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLk5hdmlnYXRlLCBzZXR0aW5ncy51cmxSb290ICsgXCIvY29uc29sZS9sZWFybmluZ1BhdGhzXCIpO1xuXHRcdFx0XHR9LFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5sb2FkTFBOYXZpZ2F0aW9uKCk7XG5cdFx0dGhpcy5jb25maWd1cmVPdmVybGF5KCk7XG5cdFx0dGhpcy5hZGRDYW1CdG4oKTtcblxuXHRcdHRoaXMuaW5pdGlhbGl6ZUZpbmRlclN0YXR1cygpO1xuXHRcdEJhY2tib25lLk1hcmlvbmV0dGUuYmluZEV2ZW50cyh0aGlzLCBldmVudEJ1cywgdGhpcy5hdHRhY2htZW50RXZlbnRzKTtcblxuXHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsICgpID0+IGhpZGVBbGwoKSk7XG5cdFx0dGhpcy4kZWwub24oXCJzY3JvbGxcIiwgKCkgPT4gaGlkZUFsbCgpKTtcblxuXHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLlZpZXdMb2FkZWQpO1xuXHR9LFxuXHRvbkF0dGFjaDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMudXNlclN0YXRlKVxuXHRcdFx0dGhpcy5zaG93QW5kVXBkYXRlVXNlclN0YXRlKHRoaXMudXNlclN0YXRlKTtcblxuXHRcdGlmIChlZGl0U3RhdGVzLnZpZXdNb2RlKVxuXHRcdFx0JChcIi5sZWFybmluZ19wYXRoLW1hbmFnZXJcIikuZ2V0KDApLnNjcm9sbFRvcCA9IDA7XG5cdH0sXG5cblx0Y2FsZW5kYXJJbXBvcnQ6IGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG5cdFx0ZGVsZXRlIHJlc3BvbnNlLmF0dHJpYnV0ZXMuZ3JvdXA7XG5cblx0XHQkLmFqYXgoe1xuXHRcdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRcdHVybDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FjYWNpYS9sZWFybmluZ1BhdGhzL2l0ZW1zL2J1bGsvXCIgKyB0aGlzLm1vZGVsLmdldChcImxlYXJuaW5nX3BhdGhcIiksXG5cdFx0XHRkYXRhOiB7IGJvb2s6IG51bGwsIGl0ZW1zOiByZXNwb25zZS5hdHRyaWJ1dGVzLCBncm91cHM6IFt0aGlzLm1vZGVsLmdldChcImdyb3VwXCIpXSB9LFxuXHRcdFx0c3VjY2VzczogdGhpcy5yZWxvYWRUcmVlLmJpbmQodGhpcyksXG5cdFx0XHRlcnJvcjogKCkgPT4gYWxlcnQoXCJGYWlsZWQgdG8gY3JlYXRlIGxlYXJuaW5nIHBhdGggaXRlbXMgZnJvbSBjYWxlbmRhci5cIiksXG5cdFx0fSk7XG5cdH0sXG5cblx0bG9hZExQTmF2aWdhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMubmF2KSB7XG5cdFx0XHR0aGlzLm5hdi5yZWxvYWRDb2xsZWN0aW9uKCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5uYXYgPSBuZXcgTHBOYXZpZ2F0aW9uU2lkZWJhcih7IGdyb3VwOiB0aGlzLm1vZGVsLmdldChcImdyb3VwXCIpIH0pO1xuXHRcdF8uZXh0ZW5kKHRoaXMubmF2LCBTbGlkZW91dE1peGluKTtcblxuXHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLkxvYWROYXZpZ2F0aW9uLCB0aGlzLm5hdik7XG5cdH0sXG5cblx0Y29uZmlndXJlT3ZlcmxheTogZnVuY3Rpb24oKSB7XG5cdFx0dHJ5IHtcblx0XHRcdC8vIFJlY29uZmlndXJlIHRoZSBVSSBpbiByZXNwb25zZSB0byByZXNvdXJjZSBkcmFnIG9wZXJhdGlvbnNcblx0XHRcdHRoaXMubGlzdGVuVG8oZXZlbnRCdXMsIGV2ZW50QnVzLkV2ZW50cy5SZXNvdXJjZURyYWdTdGFydCwgKCkgPT4ge1xuXHRcdFx0XHR0aGlzLnVpLm92ZXJsYXkuY3NzKHsgXCJwb2ludGVyLWV2ZW50c1wiOiBcImFsbFwiIH0pO1xuXG5cdFx0XHRcdHRoaXMudWkub3ZlcmxheS5vZmYoXCJtb3VzZW1vdmUuZm9yd2FyZERyYWdFdmVudFwiKS5vbihcIm1vdXNlbW92ZS5mb3J3YXJkRHJhZ0V2ZW50XCIsIF8uYmluZCh0aGlzLmZvcndhcmREcmFnRXZlbnQsIHRoaXMpKTtcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLmxpc3RlblRvKGV2ZW50QnVzLCBldmVudEJ1cy5FdmVudHMuUmVzb3VyY2VEcmFnRW5kLCAoKSA9PiB7XG5cdFx0XHRcdGxwUmFkaW8udHJpZ2dlcihFdmVudHMuTm9kZURyYWdFbmQpO1xuXHRcdFx0XHRscFJhZGlvLnRyaWdnZXIoRXZlbnRzLlJlc291cmNlRHJhZ0VuZCk7XG5cdFx0XHRcdHRoaXMudWkub3ZlcmxheS5jc3MoeyBcInBvaW50ZXItZXZlbnRzXCI6IFwibm9uZVwiIH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGNhdGNoIChlKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKGUpO1xuXHRcdH1cblx0fSxcblxuXHRhZGRDYW1CdG46IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY2FtQnRuID0gbmV3IENhbUJ0bih7IHR5cGU6IFwiZ3JvdXBcIiwgaXRlbV9pZDogd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnNwbGl0KFwiL1wiKS5wb3AoKSB9KTtcblx0XHR0aGlzLnVpLmNhbUJ0bkNvbnRhaW5lci5odG1sKHRoaXMuY2FtQnRuLnJlbmRlcigpLmVsKTtcblx0fSxcblxuXHRmb3J3YXJkRHJhZ0V2ZW50OiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRjb25zdCBpdGVtcyA9IF8uY29uY2F0KCQoXCJkaXYucmVzb3VyY2U6dmlzaWJsZVwiKS5nZXQoKSwgJChcImRpdi5scC1ub2RlOnZpc2libGVcIikuZ2V0KCkpO1xuXG5cdFx0Y29uc3QgeCA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQuY2xpZW50WDtcblx0XHRjb25zdCB5ID0gZXZlbnQub3JpZ2luYWxFdmVudC5jbGllbnRZIC0gKHRoaXMuZnVsbHNjcmVlbmVkID8gLTQ1IDogMCkgKyB0aGlzLnVpLnRyZWUuZ2V0KDApLnNjcm9sbFRvcCArIHdpbmRvdy5wYWdlWU9mZnNldDtcblxuXHRcdGNvbnN0IGFjdHVhbCA9IF8uZmluZChpdGVtcywgaXRlbSA9PiB7XG5cdFx0XHRjb25zdCBlbGVtZW50ID0gJChpdGVtKTtcblxuXHRcdFx0aWYgKCFlbGVtZW50LmlzSW5WaWV3cG9ydCgpKVxuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdGNvbnN0IG9mZnNldCA9IGVsZW1lbnQub2Zmc2V0KCk7XG5cblx0XHRcdHJldHVybiB5ID49IG9mZnNldC50b3AgJiYgeSA8PSBvZmZzZXQudG9wICsgZWxlbWVudC5vdXRlckhlaWdodCh0cnVlKSAmJlxuXHRcdFx0XHR4ID49IG9mZnNldC5sZWZ0ICYmIHggPD0gb2Zmc2V0LmxlZnQgKyBlbGVtZW50Lm91dGVyV2lkdGgodHJ1ZSk7XG5cdFx0fSk7XG5cblx0XHRpZiAoYWN0dWFsKVxuXHRcdFx0JChhY3R1YWwpLnRyaWdnZXIobmV3ICQuRXZlbnQoZXZlbnQub3JpZ2luYWxFdmVudCkpO1xuXG5cdFx0aWYgKGV2ZW50LnR5cGUgPT09IFwiZHJhZ292ZXJcIilcblx0XHRcdHRoaXMuYm9keU1vdXNlbW92ZShldmVudCk7XG5cblx0XHRpZiAoZXZlbnQudHlwZSA9PT0gXCJkcm9wXCIpXG5cdFx0XHRkcmFnZ2luZ1Jlc291cmNlID0gbnVsbDtcblx0fSxcblxuXHRyZWxvYWRUcmVlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm1vZGVsLmZldGNoKHtcblx0XHRcdHN1Y2Nlc3M6IG1vZGVsID0+IHtcblx0XHRcdFx0dGhpcy5jb2xsZWN0aW9uLnNldChfLnZhbHVlcyhtb2RlbC5nZXQoXCJpdGVtc1wiKSkpO1xuXHRcdFx0XHR0aGlzLmNvbGxlY3Rpb24uc29ydCgpO1xuXHRcdFx0XHRpZiAoY2FuRWRpdCgpICYmICFjdXJyZW50RWRpdE1vZGVsSWQpXG5cdFx0XHRcdFx0bHBSYWRpby50cmlnZ2VyKEV2ZW50cy5FbmFibGVFZGl0aW5nKTtcblx0XHRcdFx0bHBSYWRpby50cmlnZ2VyKEV2ZW50cy5Ob2RlQ2hhbmdlKTtcblx0XHRcdH0sXG5cdFx0XHRlcnJvcjogKG1vZGVsLCByZXNwb25zZSkgPT4ge1xuXHRcdFx0XHR0aGlzLnNob3dFcnJvcihyZXNwb25zZSk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9LFxuXG5cdHJlbW92ZUNoaWxkTm9kZTogZnVuY3Rpb24obW9kZWwpIHtcblx0XHR0aGlzLmNvbGxlY3Rpb24ucmVtb3ZlKG1vZGVsKTtcblx0fSxcblxuXHRub2RlRHJhZ1N0YXJ0OiBmdW5jdGlvbihjaGlsZFZpZXcpIHtcblx0XHR0aGlzLmRyYWdnaW5nTm9kZVZpZXcgPSBjaGlsZFZpZXc7XG5cdH0sXG5cblx0bm9kZURyYWdPdmVyOiBmdW5jdGlvbihlLCB2aWV3KSB7XG5cdFx0aWYgKCF0aGlzLmN1cnJlbnREcmFnT3ZlclZpZXcpIHtcblx0XHRcdHRoaXMuY3VycmVudERyYWdPdmVyVmlldyA9IHZpZXc7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKGRyYWdnaW5nUmVzb3VyY2UgJiYgdGhpcy5jdXJyZW50RHJhZ092ZXJWaWV3ICYmIHRoaXMuY3VycmVudERyYWdPdmVyVmlldy5jaWQgIT09IHZpZXcuY2lkKSB7XG5cdFx0XHR0aGlzLmN1cnJlbnREcmFnT3ZlclZpZXcuY2hlY2tBdHRhY2htZW50Q29udGFpbmVycygpO1xuXHRcdFx0dGhpcy5jdXJyZW50RHJhZ092ZXJWaWV3ID0gdmlldztcblx0XHR9XG5cdFx0ZWxzZSBpZiAoIWRyYWdnaW5nUmVzb3VyY2UgJiYgdGhpcy5jdXJyZW50RHJhZ092ZXJWaWV3LmNpZCAhPT0gdmlldy5jaWQpIHtcblx0XHRcdHRoaXMuY3VycmVudERyYWdPdmVyVmlldy5tb2RlbC5zZXQoeyBzaG93RHJvcEluZGljYXRvcjogZmFsc2UgfSk7XG5cdFx0XHR0aGlzLmN1cnJlbnREcmFnT3ZlclZpZXcgPSB2aWV3O1xuXHRcdH1cblxuXHRcdGlmICghZHJhZ2dpbmdSZXNvdXJjZSAmJiB0aGlzLmRyYWdnaW5nTm9kZVZpZXcpIHtcblx0XHRcdGNvbnN0IGRyYWdYID0gZS5vcmlnaW5hbEV2ZW50LnBhZ2VYLCBkcmFnWSA9IGUub3JpZ2luYWxFdmVudC5wYWdlWTtcblx0XHRcdGNvbnN0IG5vZGUgPSB2aWV3LnVpLm5vZGU7XG5cdFx0XHRsZXQgZHJvcENoaWxkID0gZmFsc2UsIGRyb3BQb3NpdGlvbiA9IFwiXCI7XG5cdFx0XHRpZiAobm9kZSAmJiBub2RlLm9mZnNldCgpKSB7XG5cdFx0XHRcdGNvbnN0IG9mZnNldCA9IG5vZGUub2Zmc2V0KCk7XG5cdFx0XHRcdGNvbnN0IGhlaWdodCA9IG5vZGUub3V0ZXJIZWlnaHQodHJ1ZSk7XG5cdFx0XHRcdGNvbnN0IHdpZHRoID0gbm9kZS5vdXRlcldpZHRoKHRydWUpO1xuXHRcdFx0XHQvL0lmIHdlIGFyZSBkcmFnZ2luZyBpbiB0aGUgcmlnaHQgaGFsZiBvZiB0aGUgbm9kZSwgdXBkYXRlIHRoZSBkcm9wIGluZGljYXRvciB0byBzaG93IGEgY2hpbGQgZHJvcC5cblx0XHRcdFx0ZHJvcENoaWxkID0gZHJhZ1ggPj0gb2Zmc2V0LnRvcCAmJlxuXHRcdFx0XHRcdGRyYWdZIDw9IG9mZnNldC50b3AgKyBoZWlnaHQgJiZcblx0XHRcdFx0XHRkcmFnWCA+PSBvZmZzZXQubGVmdCAmJlxuXHRcdFx0XHRcdGRyYWdYID49IG9mZnNldC5sZWZ0ICsgKHdpZHRoIC8gKDEgLyBjaGlsZERyb3BDcm9zc292ZXIpKTtcblxuXHRcdFx0XHRpZiAoZHJhZ1kgPCAob2Zmc2V0LnRvcCArIChoZWlnaHQgLyAyKSkpXG5cdFx0XHRcdFx0ZHJvcFBvc2l0aW9uID0gXCJhYm92ZVwiO1xuXHRcdFx0XHRlbHNlIGlmIChkcmFnWSA+PSAob2Zmc2V0LnRvcCArIChoZWlnaHQgLyAyKSkpXG5cdFx0XHRcdFx0ZHJvcFBvc2l0aW9uID0gXCJiZWxvd1wiO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBvcmlnaW5hbE5vZGVJZCA9IHRoaXMuZHJhZ2dpbmdOb2RlVmlldy5tb2RlbC5nZXQoXCJscF9pdGVtX2lkXCIpO1xuXHRcdFx0Y29uc3Qgb3JpZ2luYWxOb2RlUGF0aCA9IHRoaXMuZHJhZ2dpbmdOb2RlVmlldy5tb2RlbC5nZXQoXCJwYXRoXCIpO1xuXG5cdFx0XHRpZiAodmlldy5tb2RlbC5nZXQoXCJkcm9wQ2hpbGRcIikgIT09IGRyb3BDaGlsZClcblx0XHRcdFx0dmlldy5tb2RlbC5zZXQoeyBkcm9wQ2hpbGQ6IGRyb3BDaGlsZCB9KTtcblxuXHRcdFx0aWYgKF8uc3RhcnRzV2l0aCh2aWV3Lm1vZGVsLmdldChcInBhdGhcIiksIG9yaWdpbmFsTm9kZVBhdGgpKVxuXHRcdFx0XHR2aWV3Lm1vZGVsLnNldCh7IHNob3dEcm9wSW5kaWNhdG9yOiBmYWxzZSB9KTtcblx0XHRcdGVsc2UgaWYgKHZpZXcubW9kZWwuZ2V0KFwibHBfaXRlbV9pZFwiKSAhPT0gb3JpZ2luYWxOb2RlSWQgJiYgIXZpZXcubW9kZWwuZ2V0KFwic2hvd0Ryb3BJbmRpY2F0b3JcIikpXG5cdFx0XHRcdHZpZXcubW9kZWwuc2V0KHsgc2hvd0Ryb3BJbmRpY2F0b3I6IHRydWUgfSk7XG5cblx0XHRcdGlmIChkcm9wUG9zaXRpb24ubGVuZ3RoKVxuXHRcdFx0XHR2aWV3Lm1vZGVsLnNldCh7IGRyb3BQb3NpdGlvbjogZHJvcFBvc2l0aW9uIH0pO1xuXHRcdH1cblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIExlYXZlIExQIHJvb20gaGVyZVxuXHRcdGNvbnN0IHVzZXIgPSBnbG9iYWxSYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpO1xuXHRcdGlmIChBcHAud3Mud2Vic29ja2V0KSB7XG5cdFx0XHRBcHAud3Mud2Vic29ja2V0LndyaXRlKHtcblx0XHRcdFx0bGVhcm5pbmdfcGF0aHM6IHRydWUsXG5cdFx0XHRcdGFjdGlvbjogXCJsZWF2ZVwiLFxuXHRcdFx0XHRyb29tOiB0aGlzLm1vZGVsLmdldChcIl9pZFwiKSxcblx0XHRcdFx0dXNlcjogdXNlci51c2VyX2lkLFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0ZXZlbnRCdXMudHJpZ2dlcihBcHAuRXZlbnRzLlVubG9hZExlYXJuaW5nUGF0aCk7XG5cblx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5DaGFuZ2VNdWx0aXNlbGVjdCwgZmFsc2UpO1xuXHRcdG11bHRpc2VsZWN0ID0gZmFsc2U7XG5cdFx0bXNTdGF0ZSA9IDA7XG5cdFx0dGhpcy5jYW1CdG4uZGVzdHJveSgpO1xuXHR9LFxuXG5cdGxvYWRTb3VyY2VMUE1vZGVsRXJyb3I6IGZ1bmN0aW9uKGVycm9yKSB7XG5cdFx0Y29uc29sZS5lcnJvcihlcnJvcik7XG5cdH0sXG5cblx0aW5pdGlhbGl6ZUZpbmRlclN0YXR1czogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5GaW5kZXJTdGF0dXMgPSB7XG5cdFx0XHRyZXNvdXJjZTogbnVsbCxcblx0XHRcdGF0dGFjaG1lbnRzOiBudWxsLFxuXHRcdFx0Y3VycmVudEluZGV4OiBudWxsLFxuXHRcdH07XG5cdH0sXG5cblx0cmVzZXRGaW5kZXJTdGF0dXM6IGZ1bmN0aW9uKHJlc291cmNlSWRlbnRpZmllciwgcmV2ZXJzZSkge1xuXHRcdGlmICh0aGlzLkZpbmRlclN0YXR1cy5yZXNvdXJjZSAhPT0gcmVzb3VyY2VJZGVudGlmaWVyIHx8IHRoaXMuYXR0YWNobWVudHMucmVtb3ZlZC5sZW5ndGggPiB0aGlzLmF0dGFjaG1lbnRzLmxhc3RfcmVtb3ZlZF9sZW5ndGggfHxcblx0XHRcdHRoaXMuYXR0YWNobWVudHMuYWRkZWQubGVuZ3RoID4gdGhpcy5hdHRhY2htZW50cy5sYXN0X2FkZGVkX2xlbmd0aCkge1xuXHRcdFx0dGhpcy5hdHRhY2htZW50cy5sYXN0X3JlbW92ZWRfbGVuZ3RoID0gdGhpcy5hdHRhY2htZW50cy5yZW1vdmVkLmxlbmd0aDtcblx0XHRcdHRoaXMuYXR0YWNobWVudHMubGFzdF9hZGRlZF9sZW5ndGggPSB0aGlzLmF0dGFjaG1lbnRzLmFkZGVkLmxlbmd0aDtcblx0XHRcdGNvbnN0IGNvbGxlY3RBdHRhY2htZW50cyA9IChhcnJheSwgYXR0YWNobWVudHMpID0+IHtcblx0XHRcdFx0Xy5lYWNoKGFycmF5LCBtb2RlbCA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qgcm93ID0gbW9kZWwuYXR0cmlidXRlcyA/IG1vZGVsLmF0dHJpYnV0ZXMgOiBtb2RlbDtcblxuXHRcdFx0XHRcdGlmIChyb3cuY2hpbGRyZW4pXG5cdFx0XHRcdFx0XHRjb2xsZWN0QXR0YWNobWVudHMocm93LmNoaWxkcmVuLCBhdHRhY2htZW50cyk7XG5cdFx0XHRcdFx0ZWxzZSBpZiAocm93LnJlc291cmNlID09PSByZXNvdXJjZUlkZW50aWZpZXIpXG5cdFx0XHRcdFx0XHRhdHRhY2htZW50cy5wdXNoKHJvdyk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fTtcblxuXHRcdFx0bGV0IGF0dGFjaG1lbnRzID0gW107XG5cdFx0XHRjb2xsZWN0QXR0YWNobWVudHModGhpcy5jb2xsZWN0aW9uLm1vZGVscywgYXR0YWNobWVudHMpO1xuXHRcdFx0YXR0YWNobWVudHMgPSBfLm1lcmdlKGF0dGFjaG1lbnRzLCB0aGlzLmF0dGFjaG1lbnRzLmFkZGVkKTtcblx0XHRcdGF0dGFjaG1lbnRzID0gXy5maWx0ZXIoYXR0YWNobWVudHMsIGF0dCA9PiB7XG5cdFx0XHRcdGNvbnN0IHJlbW92ZWRfYXR0ID0gXy5maW5kKHRoaXMuYXR0YWNobWVudHMucmVtb3ZlZCwgcmVtb3ZlZCA9PiB7XG5cdFx0XHRcdFx0aWYgKHJlbW92ZWQuZ2V0KFwiX2lkXCIpID09PSBhdHQuX2lkKVxuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoIXJlbW92ZWRfYXR0KVxuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMuRmluZGVyU3RhdHVzID0ge1xuXHRcdFx0XHRyZXNvdXJjZTogcmVzb3VyY2VJZGVudGlmaWVyLFxuXHRcdFx0XHRhdHRhY2htZW50czogYXR0YWNobWVudHMsXG5cdFx0XHRcdGN1cnJlbnRJbmRleDogcmV2ZXJzZSA/IChhdHRhY2htZW50cy5sZW5ndGggLSAxKSA6IDAsXG5cdFx0XHR9O1xuXHRcdH1cblx0fSxcblxuXHRmaW5kTmV4dEF0dGFjaG1lbnQ6IGZ1bmN0aW9uKHJlc291cmNlSWRlbnRpZmllcikge1xuXHRcdHRoaXMucmVzZXRGaW5kZXJTdGF0dXMocmVzb3VyY2VJZGVudGlmaWVyLCB0cnVlKTtcblxuXHRcdHRoaXMuRmluZGVyU3RhdHVzLmN1cnJlbnRJbmRleCA9ICh0aGlzLkZpbmRlclN0YXR1cy5jdXJyZW50SW5kZXggKyAxKSAlIHRoaXMuRmluZGVyU3RhdHVzLmF0dGFjaG1lbnRzLmxlbmd0aDtcblx0XHRpZiAoIXRoaXMuRmluZGVyU3RhdHVzLmF0dGFjaG1lbnRzW3RoaXMuRmluZGVyU3RhdHVzLmN1cnJlbnRJbmRleF0pXG5cdFx0XHRyZXR1cm47XG5cdFx0bHBSYWRpby50cmlnZ2VyKEV2ZW50cy5Gb2N1c0F0dGFjaG1lbnQsIHRoaXMuRmluZGVyU3RhdHVzLmF0dGFjaG1lbnRzW3RoaXMuRmluZGVyU3RhdHVzLmN1cnJlbnRJbmRleF0pO1xuXHR9LFxuXG5cdGZpbmRQcmV2aW91c0F0dGFjaG1lbnQ6IGZ1bmN0aW9uKHJlc291cmNlSWRlbnRpZmllcikge1xuXHRcdHRoaXMucmVzZXRGaW5kZXJTdGF0dXMocmVzb3VyY2VJZGVudGlmaWVyLCBmYWxzZSk7XG5cblx0XHRpZiAodGhpcy5GaW5kZXJTdGF0dXMuYXR0YWNobWVudHMubGVuZ3RoID09PSAwKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5GaW5kZXJTdGF0dXMuY3VycmVudEluZGV4ID0gTWF0aC5tYXgoMCwgKHRoaXMuRmluZGVyU3RhdHVzLmN1cnJlbnRJbmRleCArICh0aGlzLkZpbmRlclN0YXR1cy5hdHRhY2htZW50cy5sZW5ndGggLSAxKSkgJSB0aGlzLkZpbmRlclN0YXR1cy5hdHRhY2htZW50cy5sZW5ndGgpO1xuXHRcdGlmICh0aGlzLkZpbmRlclN0YXR1cy5jdXJyZW50SW5kZXggPj0gdGhpcy5GaW5kZXJTdGF0dXMuYXR0YWNobWVudHMubGVuZ3RoKVxuXHRcdFx0dGhpcy5GaW5kZXJTdGF0dXMuY3VycmVudEluZGV4ID0gMDtcblx0XHRscFJhZGlvLnRyaWdnZXIoRXZlbnRzLkZvY3VzQXR0YWNobWVudCwgdGhpcy5GaW5kZXJTdGF0dXMuYXR0YWNobWVudHNbdGhpcy5GaW5kZXJTdGF0dXMuY3VycmVudEluZGV4XSk7XG5cdH0sXG5cblx0b25BdHRhY2htZW50QWRkZWQ6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0dGhpcy5hdHRhY2htZW50cy5hZGRlZC5wdXNoKG1vZGVsKTtcblx0fSxcblxuXHRvbkF0dGFjaG1lbnRSZW1vdmVkOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdHRoaXMuYXR0YWNobWVudHMucmVtb3ZlZC5wdXNoKG1vZGVsKTtcblx0fSxcblxuXHRvbkdyb3VwTm90aWZ5Q2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLlNob3dHcm91cE1vZGFsKTtcblx0fSxcblxuXHRncm91cHNDaGFuZ2VkOiBmdW5jdGlvbihhbGxvd2VkLCBjdXJyZW50KSB7XG5cdFx0aWYgKF8uaW50ZXJzZWN0aW9uKF8ubWFwKGFsbG93ZWQuc3lzdGVtLCB4ID0+IHguY29kZSksIGN1cnJlbnQpLmxlbmd0aCA9PT0gXy5tYXAoYWxsb3dlZC5zeXN0ZW0sIHggPT4geC5jb2RlKS5sZW5ndGgpXG5cdFx0XHR0aGlzLnVpLmdyb3VwTm90aWZ5LmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnVpLmdyb3VwTm90aWZ5LnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRvblN0ZWFsQWNjZXNzOiBmdW5jdGlvbihvdmVycmlkZSkge1xuXHRcdGNvbnN0IHVzZXIgPSBnbG9iYWxSYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpO1xuXHRcdGlmICghb3ZlcnJpZGUgJiYgIXJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAubGVhcm5pbmdQYXRocy5zdGVhbCwgdXNlcikpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRpZiAoQXBwLndzLndlYnNvY2tldCkge1xuXHRcdFx0QXBwLndzLndlYnNvY2tldC53cml0ZSh7XG5cdFx0XHRcdGxlYXJuaW5nX3BhdGhzOiB0cnVlLFxuXHRcdFx0XHRhY3Rpb246IFwic3RlYWxcIixcblx0XHRcdFx0cm9vbTogdGhpcy5tb2RlbC5nZXQoXCJfaWRcIiksXG5cdFx0XHRcdHVzZXI6IHVzZXIudXNlcl9pZCxcblx0XHRcdH0pO1xuXHRcdH1cblx0fSxcblxuXHRvblJlcXVlc3RBY2Nlc3M6IGZ1bmN0aW9uKCkge1xuXHRcdGlmIChyZXF1ZXN0ZWRBY2Nlc3MpIHtcblx0XHRcdHJldHVybiBnbG9iYWxSYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuVG9hc3QsIHtcblx0XHRcdFx0Y29udGVudDogXCJZb3UgYWxyZWFkeSByZXF1ZXN0ZWQgYWNjZXNzIGluIHRoZSBsYXN0IDkwIHNlY29uZHMuIFBsZWFzZSB3YWl0LlwiLFxuXHRcdFx0XHRpY29uOiBcImZhLWJhblwiLFxuXHRcdFx0XHRpY29uQ29sb3VyOiBcInJlZFwiLFxuXHRcdFx0XHRob3N0OiBcIiNsaW5rLXJlc291cmNlc1wiLFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgdXNlciA9IGdsb2JhbFJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cblx0XHRpZiAoQXBwLndzLndlYnNvY2tldCkge1xuXHRcdFx0QXBwLndzLndlYnNvY2tldC53cml0ZSh7XG5cdFx0XHRcdGxlYXJuaW5nX3BhdGhzOiB0cnVlLFxuXHRcdFx0XHRhY3Rpb246IFwicmVxdWVzdEFjY2Vzc1wiLFxuXHRcdFx0XHRyb29tOiB0aGlzLm1vZGVsLmdldChcIl9pZFwiKSxcblx0XHRcdFx0dXNlcjogdXNlci51c2VyX2lkLFxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIE1ha2UgYSBub3RlIHRoYXQgd2UndmUgcmVxdWVzdGVkIGFjY2Vzc1xuXHRcdFx0cmVxdWVzdGVkQWNjZXNzID0gdHJ1ZTtcblxuXHRcdFx0dGhpcy51aS5hY2Nlc3NDb250cm9sbGVycy5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLnVpLmFjY2Vzc1BhdXNlLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblxuXHRcdFx0Ly8gQW5kIHRpbWUgaXRcblx0XHRcdHRoaXMucmVxdWVzdGVkQWNjZXNzVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0cmVxdWVzdGVkQWNjZXNzID0gZmFsc2U7XG5cdFx0XHRcdHRoaXMudWkuYWNjZXNzQ29udHJvbGxlcnMucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0XHR0aGlzLnVpLmFjY2Vzc1BhdXNlLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdH0sIHJlcXVlc3RBY2Nlc3NUaW1lb3V0ICogMTAwMCk7XG5cblx0XHRcdC8vIElmIHdlIGRvbid0IGdldCBhIHJlc3BvbnNlIHdpdGhpbiAxMCBzZWNvbmRzLCB0YWtlIGNvbnRyb2wgaW5zdGFudGx5XG5cdFx0XHR0aGlzLmF1dG9tYXRpY1N0ZWFsVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0cmVxdWVzdGVkQWNjZXNzID0gZmFsc2U7XG5cdFx0XHRcdHRoaXMub25TdGVhbEFjY2Vzcyh0cnVlKTtcblx0XHRcdH0sIDEwICogMTAwMCk7XG5cdFx0fVxuXHR9LFxuXG5cdGhpZGVGbGFzaENhcmRXaWRnZXQ6IGZ1bmN0aW9uKClcdHtcblx0XHRpZiAodGhpcy5mbGFzaENhcmRXaWRnZXQpXG5cdFx0XHR0aGlzLmZsYXNoQ2FyZFdpZGdldC5kZXN0cm95KCk7XG5cdH0sXG5cblx0c2hvd0ZsYXNoQ2FyZFdpZGdldDogZnVuY3Rpb24oKVx0e1xuXHRcdHRoaXMuZmxhc2hDYXJkV2lkZ2V0ID0gbmV3IEZsYXNoQ2FyZFdpZGdldCgpO1xuXHRcdHRoaXMuJGVsLmFwcGVuZCh0aGlzLmZsYXNoQ2FyZFdpZGdldC5yZW5kZXIoKS4kZWwpO1xuXHR9LFxuXG5cdG9uRHJhZ0VudGVyOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0dGhpcy5kcmFnQ291bnQuY29udGVudCsrO1xuXHRcdHRoaXMudWkuY2FuY2VsRHJvcC5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0b25EcmFnT3ZlcjogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHR9LFxuXG5cdG9uRHJhZ0xlYXZlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmRyYWdDb3VudC5jb250ZW50LS07XG5cdFx0aWYgKHRoaXMuZHJhZ0NvdW50LmNvbnRlbnQgPT09IDApXG5cdFx0XHR0aGlzLnVpLmNhbmNlbERyb3AuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdG9uQ2FuY2VsRHJhZ0VudGVyOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdH0sXG5cblx0b25DYW5jZWxEcmFnT3ZlcjogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHR9LFxuXG5cdG9uQ2FuY2VsRmlsZURyb3A6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHR0aGlzLmRyYWdDb3VudCA9IHsgY29udGVudDogMCB9O1xuXHRcdHRoaXMudWkuY2FuY2VsRHJvcC5hZGRDbGFzcyhcImhpZGVcIik7XG5cdH0sXG59KTtcblxubG9jYWxNZXRob2RzLmdldE5leHRQYXRoID0gZnVuY3Rpb24oZnVsbFBhdGgpIHtcblx0Ly9XZSBvbmx5IHdvcmtpbmcgd2l0aCB0aGUgbGFzdCBzZXF1ZW5jZSBpbiB0aGUgZnVsbCBwYXRoLlxuXHRjb25zdCBwYXRocyA9IF8uc3BsaXQoZnVsbFBhdGgsIFwiLlwiKTtcblx0Y29uc3QgbGV0dGVycyA9IF8uc3BsaXQoXy5sYXN0KHBhdGhzKSwgXCJcIik7XG5cblx0Zm9yKGxldCBpID0gbGV0dGVycy5sZW5ndGggLSAxOyBsZXR0ZXJzLmxlbmd0aCA+PSBpOyBpLS0pIHtcblx0XHRjb25zdCBjaGFyQ29kZSA9IGxldHRlcnNbaV0uY2hhckNvZGVBdCgwKTtcblx0XHRpZiAoY2hhckNvZGUgPCA5MCkge1xuXHRcdFx0Ly9MZXR0ZXIgPCBaLCBzbyB3ZSBjYW4gZG8gYSBzdHJhaWdodCBmb3J3YXJkIGluY3JlbWVudC5cblx0XHRcdGxldHRlcnNbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlICsgMSk7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHQvL0lmIHdlIGdvdCBoZXJlLCBsZXR0ZXIgbXVzdCBiZSBcIlpcIiwgb3Igd29yc2UsIGFuIGludmFsaWQgY2hhcmFjdGVyLiBSZXBsYWNlIGl0IHdpdGggXCJBXCIuXG5cdFx0bGV0dGVyc1tpXSA9IFwiQVwiO1xuXG5cdFx0aWYgKGkgPD0gMCkge1xuXHRcdFx0Ly9JZiB3ZSByZWFjaGVkIHRoZSBmaXJzdCBsZXR0ZXIgd2l0aG91dCBmaW5kaW5nIGFueXRoaW5nIGxlc3MgdGhhbiBaLCB0aGVuIGl0IG11c3QgYmUgYW4gYWxsIFogcGF0aC5cblx0XHRcdGxldHRlcnMucHVzaChcIkFcIik7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHRwYXRoc1twYXRocy5sZW5ndGggLSAxXSA9IGxldHRlcnMuam9pbihcIlwiKTtcblx0cmV0dXJuIHBhdGhzLmpvaW4oXCIuXCIpO1xufTtcblxubG9jYWxNZXRob2RzLmlzU2libGluZyA9IGZ1bmN0aW9uKHBhdGhBLCBwYXRoQikge1xuXHQvL0NoZWNrIGZvciBlbXB0eSBwYXRoc1xuXHRpZiAoXy5pc0VtcHR5KHBhdGhBKSB8fCBfLmlzRW1wdHkocGF0aEIpKVxuXHRcdHJldHVybiBmYWxzZTtcblxuXHQvL0Nhbid0IGJlIHNpYmxpbmdzIGlmIHRoZSBwYXRocyBhcmUgdGhlIHNhbWVcblx0aWYgKHBhdGhBID09PSBwYXRoQilcblx0XHRyZXR1cm4gZmFsc2U7XG5cblx0Y29uc3QgcGF0aEFfUGF0aHMgPSBfLnNwbGl0KHBhdGhBLCBcIi5cIik7XG5cdGNvbnN0IHBhdGhCX1BhdGhzID0gXy5zcGxpdChwYXRoQiwgXCIuXCIpO1xuXG5cdC8vQ2FuJ3QgYmUgc2libGluZ3MgaWYgdGhlIGxlbmd0aHMgb2YgdGhlIHBhdGhzIGFyZW4ndCB0aGUgc2FtZVxuXHRpZiAocGF0aEFfUGF0aHMubGVuZ3RoICE9PSBwYXRoQl9QYXRocy5sZW5ndGgpXG5cdFx0cmV0dXJuIGZhbHNlO1xuXG5cdC8vQm90aCBwYXRocyBhcmUgb24gdGhlIHRvcCBsZXZlbCwgc28gbXVzdCBiZSBzaWJsaW5nc1xuXHRpZiAocGF0aEFfUGF0aHMubGVuZ3RoID09PSAxICYmIHBhdGhCX1BhdGhzLmxlbmd0aCA9PT0gMSlcblx0XHRyZXR1cm4gdHJ1ZTtcblxuXHQvL0lmIHRoZSBpbnRpYWwgcGF0aHMgYmVmb3JlIHRoZSBsYXN0IHBvc2l0aW9uIGFyZW4ndCB0aGUgc2FtZSwgdGhlbiB0aGV5IGRvbid0IGJlbG9uZyB0byB0aGUgc2FtZSBwYXJlbnQuXG5cdGxldCBpc1NpYmxpbmcgPSB0cnVlO1xuXHRfLmVhY2goXy5pbml0aWFsKHBhdGhBX1BhdGhzKSwgKHBhdGgsIGluZGV4KSA9PiB7XG5cdFx0aWYgKHBhdGhCX1BhdGhzW2luZGV4XSAhPT0gcGF0aCkge1xuXHRcdFx0aXNTaWJsaW5nID0gZmFsc2U7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9KTtcblxuXHRyZXR1cm4gaXNTaWJsaW5nO1xufTtcblxubG9jYWxNZXRob2RzLmlzQ2hpbGQgPSBmdW5jdGlvbihwYXJlbnQsIGNoaWxkKSB7XG5cdHJldHVybiBfLnN0YXJ0c1dpdGgoY2hpbGQsIHBhcmVudCkgJiZcbiAgICAgICAgXy5zcGxpdChjaGlsZCwgXCIuXCIpLmxlbmd0aCA9PT0gKF8uc3BsaXQocGFyZW50LCBcIi5cIikubGVuZ3RoICsgMSk7XG59O1xuXG5sb2NhbE1ldGhvZHMuaXNBZnRlciA9IGZ1bmN0aW9uKGZpcnN0LCBzZWNvbmQpIHtcblx0bGV0IHJldCA9IGZhbHNlO1xuXHRfLmVhY2goZmlyc3QsIChjaGFyLCBpbmRleCkgPT4ge1xuXHRcdGNvbnN0IGNjID0gY2hhci5jaGFyQ29kZUF0KDApO1xuXHRcdGlmIChjYyAhPT0gMHgyRSAmJiBjYyA+IHNlY29uZC5jaGFyQ29kZUF0KGluZGV4KSkge1xuXHRcdFx0cmV0ID0gdHJ1ZTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH0pO1xuXG5cdHJldHVybiByZXQ7XG59O1xuXG4kLmZuLmlzSW5WaWV3cG9ydCA9IGZ1bmN0aW9uKCkge1xuXHRjb25zdCBzY3JvbGwgPSB3aW5kb3cuc2Nyb2xsWSB8fCB3aW5kb3cucGFnZVlPZmZzZXQ7XG5cdGNvbnN0IGJvdW5kc1RvcCA9IHRoaXNbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgc2Nyb2xsO1xuXG5cdGNvbnN0IHZpZXdwb3J0ID0ge1xuXHRcdHRvcDogc2Nyb2xsLFxuXHRcdGJvdHRvbTogc2Nyb2xsICsgd2luZG93LmlubmVySGVpZ2h0LFxuXHR9O1xuXG5cdGNvbnN0IGJvdW5kcyA9IHtcblx0XHR0b3A6IGJvdW5kc1RvcCxcblx0XHRib3R0b206IGJvdW5kc1RvcCArIHRoaXNbMF0uY2xpZW50SGVpZ2h0LFxuXHR9O1xuXG5cdHJldHVybiAoYm91bmRzLmJvdHRvbSA+PSB2aWV3cG9ydC50b3AgJiYgYm91bmRzLmJvdHRvbSA8PSB2aWV3cG9ydC5ib3R0b20pIHx8IChib3VuZHMudG9wIDw9IHZpZXdwb3J0LmJvdHRvbSAmJiBib3VuZHMudG9wID49IHZpZXdwb3J0LnRvcCk7XG59OyJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar settings = require(\"app-settings\");\nvar App = require(\"../../../index\");\n\nvar eventBus = require(\"./eventBus\");\n\nvar LearningPathModel = Backbone.Model.extend({\n\tdefaults: {},\n\n\tidAttribute: \"group\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/acacia/learningPaths/structure\";\n\t}\n});\n\nvar LPNavigatorBodyView = Backbone.Marionette.View.extend({\n\tclassName: \"nav-body\",\n\n\ttemplate: require(\"../../templates/console/lpNavigation.nunj\").body,\n\n\tui: {\n\t\tlink: \"div.item\",\n\t\tcontent: \".content\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.link\": \"clicked\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.data = options.data;\n\n\t\tthis.listenTo(eventBus, \"lpNav:search\", this.search.bind(this));\n\t},\n\n\tserializeData: function serializeData() {\n\t\treturn {\n\t\t\tnodes: this.data,\n\t\t\tvalues: function values(object) {\n\t\t\t\treturn _.values(object);\n\t\t\t}\n\t\t};\n\t},\n\n\tsearch: function search(text) {\n\t\t$(\"div.item\", this.ui.content).each(function (idx, el) {\n\t\t\tif (_.includes($(el).text().toLowerCase().trim(), text.toLowerCase().trim())) {\n\t\t\t\t$(el).show();\n\t\t\t\t// Also show the parents\n\t\t\t\t$(el).parents(\"div.lpNav\").prev(\"div.item\").show();\n\t\t\t} else {\n\t\t\t\t$(el).hide();\n\t\t\t}\n\t\t});\n\t},\n\n\tclicked: function clicked(evt) {\n\t\tevt.stopPropagation();\n\t\tvar targetSelector = $(evt.currentTarget).data(\"id\");\n\t\t$(\".learning_path-manager\").animate({\n\t\t\tscrollTop: $(\".learning_path-manager\").scrollTop() + ($(targetSelector).offset().top - $(\".learning_path-manager\").offset().top)\n\t\t});\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tid: \"lp-navigator\",\n\n\ttemplate: require(\"../../templates/console/lpNavigation.nunj\").regions,\n\n\tui: {\n\t\ttextBox: \"input\",\n\t\tclose: \"span.fal\",\n\t\tclear: \".input-overlay\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.textBox\": \"searchClick\",\n\t\t\"keyup @ui.textBox\": \"search\",\n\t\t\"click @ui.close\": \"onClose\",\n\t\t\"click @ui.clear\": \"clear\"\n\t},\n\n\tonRender: function onRender() {\n\t\tif (this.model) {\n\t\t\tthis.body = new LPNavigatorBodyView({ data: _.values(this.model.get(\"items\")) });\n\n\t\t\tthis.$el.append(this.body.render().el);\n\t\t}\n\n\t\tif (this.configureUI) this.configureUI();\n\t},\n\n\treloadCollection: function reloadCollection() {\n\t\tthis.model.fetch({ success: this.fetchSuccess.bind(this), error: this.fetchError.bind(this) });\n\t},\n\n\tfetchSuccess: function fetchSuccess() {\n\t\tthis.body.destroy();\n\t\tthis.body = new LPNavigatorBodyView({ data: _.values(this.model.get(\"items\")) });\n\n\t\tthis.$el.append(this.body.render().el);\n\t},\n\n\tfetchError: function fetchError(model, xhr) {\n\t\tvar answer = App.parseResponse(xhr);\n\t\talert(answer.detail || answer.info);\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.model = new LearningPathModel({ group: options.group });\n\t\tthis.reloadCollection();\n\t},\n\n\tupdate: _.debounce(function () {\n\t\t/* eslint-disable no-invalid-this */\n\n\t\tthis.body.destroy();\n\t\tthis.body = new LPNavigatorBodyView({ data: this.collection.models });\n\n\t\tthis.$el.append(this.body.render().el);\n\n\t\t/* eslint-enable no-invalid-this */\n\t}, 100),\n\n\tonDestroy: function onDestroy() {\n\t\tthis.body.destroy();\n\t},\n\n\tonClose: function onClose() {\n\t\tif (this.close) this.close();\n\n\t\teventBus.trigger(eventBus.Events.CloseNavigation);\n\t},\n\n\tsearchClick: function searchClick(evt) {\n\t\tevt.stopPropagation();\n\t},\n\n\tsearch: _.debounce(function () {\n\t\t/* eslint-disable no-invalid-this */\n\n\t\teventBus.trigger(\"lpNav:search\", this.ui.textBox.val());\n\n\t\t/* eslint-enable no-invalid-this */\n\t}, 300),\n\n\tclear: function clear(evt) {\n\t\t$(evt.currentTarget).siblings(\"input\").val(\"\").trigger(\"keyup\");\n\t\tevt.stopPropagation();\n\t}\n});\n\n// ----------------------------------------------------------------------------\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxwTmF2aWdhdGlvbi5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCIkIiwiXyIsInNldHRpbmdzIiwiQXBwIiwiZXZlbnRCdXMiLCJMZWFybmluZ1BhdGhNb2RlbCIsIk1vZGVsIiwiZXh0ZW5kIiwiZGVmYXVsdHMiLCJpZEF0dHJpYnV0ZSIsInVybFJvb3QiLCJMUE5hdmlnYXRvckJvZHlWaWV3IiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsImJvZHkiLCJ1aSIsImxpbmsiLCJjb250ZW50IiwiZXZlbnRzIiwiaW5pdGlhbGl6ZSIsIm9wdGlvbnMiLCJkYXRhIiwibGlzdGVuVG8iLCJzZWFyY2giLCJiaW5kIiwic2VyaWFsaXplRGF0YSIsIm5vZGVzIiwidmFsdWVzIiwib2JqZWN0IiwidGV4dCIsImVhY2giLCJpZHgiLCJlbCIsImluY2x1ZGVzIiwidG9Mb3dlckNhc2UiLCJ0cmltIiwic2hvdyIsInBhcmVudHMiLCJwcmV2IiwiaGlkZSIsImNsaWNrZWQiLCJldnQiLCJzdG9wUHJvcGFnYXRpb24iLCJ0YXJnZXRTZWxlY3RvciIsImN1cnJlbnRUYXJnZXQiLCJhbmltYXRlIiwic2Nyb2xsVG9wIiwib2Zmc2V0IiwidG9wIiwibW9kdWxlIiwiZXhwb3J0cyIsInRhZ05hbWUiLCJpZCIsInJlZ2lvbnMiLCJ0ZXh0Qm94IiwiY2xvc2UiLCJjbGVhciIsIm9uUmVuZGVyIiwibW9kZWwiLCJnZXQiLCIkZWwiLCJhcHBlbmQiLCJyZW5kZXIiLCJjb25maWd1cmVVSSIsInJlbG9hZENvbGxlY3Rpb24iLCJmZXRjaCIsInN1Y2Nlc3MiLCJmZXRjaFN1Y2Nlc3MiLCJlcnJvciIsImZldGNoRXJyb3IiLCJkZXN0cm95IiwieGhyIiwiYW5zd2VyIiwicGFyc2VSZXNwb25zZSIsImFsZXJ0IiwiZGV0YWlsIiwiaW5mbyIsImdyb3VwIiwidXBkYXRlIiwiZGVib3VuY2UiLCJjb2xsZWN0aW9uIiwibW9kZWxzIiwib25EZXN0cm95Iiwib25DbG9zZSIsInRyaWdnZXIiLCJFdmVudHMiLCJDbG9zZU5hdmlnYXRpb24iLCJzZWFyY2hDbGljayIsInZhbCIsInNpYmxpbmdzIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1FLElBQUlGLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUcsV0FBV0gsUUFBUSxjQUFSLENBQWpCO0FBQ0EsSUFBTUksTUFBTUosUUFBUSxnQkFBUixDQUFaOztBQUVBLElBQU1LLFdBQVdMLFFBQVEsWUFBUixDQUFqQjs7QUFFQSxJQUFNTSxvQkFBb0JQLFNBQVNRLEtBQVQsQ0FBZUMsTUFBZixDQUFzQjtBQUMvQ0MsV0FBVSxFQURxQzs7QUFJL0NDLGNBQWEsT0FKa0M7O0FBTS9DQyxVQUFTLG1CQUFXO0FBQ25CLFNBQU9SLFNBQVNRLE9BQVQsR0FBbUIsaUNBQTFCO0FBQ0E7QUFSOEMsQ0FBdEIsQ0FBMUI7O0FBV0EsSUFBTUMsc0JBQXNCYixTQUFTYyxVQUFULENBQW9CQyxJQUFwQixDQUF5Qk4sTUFBekIsQ0FBZ0M7QUFDM0RPLFlBQVcsVUFEZ0Q7O0FBRzNEQyxXQUFVaEIsUUFBUSwyQ0FBUixFQUFxRGlCLElBSEo7O0FBSzNEQyxLQUFJO0FBQ0hDLFFBQU0sVUFESDtBQUVIQyxXQUFTO0FBRk4sRUFMdUQ7O0FBVTNEQyxTQUFRO0FBQ1Asb0JBQWtCO0FBRFgsRUFWbUQ7O0FBYzNEQyxhQUFZLG9CQUFTQyxPQUFULEVBQWtCO0FBQzdCLE9BQUtDLElBQUwsR0FBWUQsUUFBUUMsSUFBcEI7O0FBRUEsT0FBS0MsUUFBTCxDQUFjcEIsUUFBZCxFQUF3QixjQUF4QixFQUF3QyxLQUFLcUIsTUFBTCxDQUFZQyxJQUFaLENBQWlCLElBQWpCLENBQXhDO0FBQ0EsRUFsQjBEOztBQW9CM0RDLGdCQUFlLHlCQUFXO0FBQ3pCLFNBQU87QUFDTkMsVUFBTyxLQUFLTCxJQUROO0FBRU5NLFdB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QSxFQTNFK0M7O0FBNkVoRG5CLFNBQVF4QixFQUFFZ0YsUUFBRixDQUFXLFlBQVc7QUFDN0I7O0FBRUE3RSxXQUFTa0YsT0FBVCxDQUFpQixjQUFqQixFQUFpQyxLQUFLckUsRUFBTCxDQUFRdUMsT0FBUixDQUFnQmtDLEdBQWhCLEVBQWpDOztBQUVBO0FBQ0EsRUFOTyxFQU1MLEdBTkssQ0E3RXdDOztBQXFGaERoQyxRQUFPLGVBQVNmLEdBQVQsRUFBYztBQUNwQjNDLElBQUUyQyxJQUFJRyxhQUFOLEVBQXFCNkMsUUFBckIsQ0FBOEIsT0FBOUIsRUFBdUNELEdBQXZDLENBQTJDLEVBQTNDLEVBQStDSixPQUEvQyxDQUF1RCxPQUF2RDtBQUNBM0MsTUFBSUMsZUFBSjtBQUNBO0FBeEYrQyxDQUFoQyxDQUFqQjs7QUEyRkEiLCJmaWxlIjoibHBOYXZpZ2F0aW9uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5jb25zdCBBcHAgPSByZXF1aXJlKFwiLi4vLi4vLi4vaW5kZXhcIik7XG5cbmNvbnN0IGV2ZW50QnVzID0gcmVxdWlyZShcIi4vZXZlbnRCdXNcIik7XG5cbmNvbnN0IExlYXJuaW5nUGF0aE1vZGVsID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHtcblx0fSxcblxuXHRpZEF0dHJpYnV0ZTogXCJncm91cFwiLFxuXG5cdHVybFJvb3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYWNhY2lhL2xlYXJuaW5nUGF0aHMvc3RydWN0dXJlXCI7XG5cdH0sXG59KTtcblxuY29uc3QgTFBOYXZpZ2F0b3JCb2R5VmlldyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwibmF2LWJvZHlcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9jb25zb2xlL2xwTmF2aWdhdGlvbi5udW5qXCIpLmJvZHksXG5cblx0dWk6IHtcblx0XHRsaW5rOiBcImRpdi5pdGVtXCIsXG5cdFx0Y29udGVudDogXCIuY29udGVudFwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmxpbmtcIjogXCJjbGlja2VkXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuZGF0YSA9IG9wdGlvbnMuZGF0YTtcblxuXHRcdHRoaXMubGlzdGVuVG8oZXZlbnRCdXMsIFwibHBOYXY6c2VhcmNoXCIsIHRoaXMuc2VhcmNoLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdHNlcmlhbGl6ZURhdGE6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRub2RlczogdGhpcy5kYXRhLFxuXHRcdFx0dmFsdWVzOiBmdW5jdGlvbihvYmplY3QpIHtcblx0XHRcdFx0cmV0dXJuIF8udmFsdWVzKG9iamVjdCk7XG5cdFx0XHR9LFxuXHRcdH07XG5cdH0sXG5cblx0c2VhcmNoOiBmdW5jdGlvbih0ZXh0KSB7XG5cdFx0JChcImRpdi5pdGVtXCIsIHRoaXMudWkuY29udGVudCkuZWFjaCgoaWR4LCBlbCkgPT4ge1xuXHRcdFx0aWYgKF8uaW5jbHVkZXMoJChlbCkudGV4dCgpLnRvTG93ZXJDYXNlKCkudHJpbSgpLCB0ZXh0LnRvTG93ZXJDYXNlKCkudHJpbSgpKSkge1xuXHRcdFx0XHQkKGVsKS5zaG93KCk7XG5cdFx0XHRcdC8vIEFsc28gc2hvdyB0aGUgcGFyZW50c1xuXHRcdFx0XHQkKGVsKS5wYXJlbnRzKFwiZGl2LmxwTmF2XCIpLnByZXYoXCJkaXYuaXRlbVwiKS5zaG93KCk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0JChlbCkuaGlkZSgpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9LFxuXG5cdGNsaWNrZWQ6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRjb25zdCB0YXJnZXRTZWxlY3RvciA9ICQoZXZ0LmN1cnJlbnRUYXJnZXQpLmRhdGEoXCJpZFwiKTtcblx0XHQkKFwiLmxlYXJuaW5nX3BhdGgtbWFuYWdlclwiKS5hbmltYXRlKHtcblx0XHRcdHNjcm9sbFRvcDogJChcIi5sZWFybmluZ19wYXRoLW1hbmFnZXJcIikuc2Nyb2xsVG9wKCkgKyAoJCh0YXJnZXRTZWxlY3Rvcikub2Zmc2V0KCkudG9wIC0gJChcIi5sZWFybmluZ19wYXRoLW1hbmFnZXJcIikub2Zmc2V0KCkudG9wKSxcblx0XHR9KTtcblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRpZDogXCJscC1uYXZpZ2F0b3JcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9jb25zb2xlL2xwTmF2aWdhdGlvbi5udW5qXCIpLnJlZ2lvbnMsXG5cblx0dWk6IHtcblx0XHR0ZXh0Qm94OiBcImlucHV0XCIsXG5cdFx0Y2xvc2U6IFwic3Bhbi5mYWxcIixcblx0XHRjbGVhcjogXCIuaW5wdXQtb3ZlcmxheVwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLnRleHRCb3hcIjogXCJzZWFyY2hDbGlja1wiLFxuXHRcdFwia2V5dXAgQHVpLnRleHRCb3hcIjogXCJzZWFyY2hcIixcblx0XHRcImNsaWNrIEB1aS5jbG9zZVwiOiBcIm9uQ2xvc2VcIixcblx0XHRcImNsaWNrIEB1aS5jbGVhclwiOiBcImNsZWFyXCIsXG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLm1vZGVsKSB7XG5cdFx0XHR0aGlzLmJvZHkgPSBuZXcgTFBOYXZpZ2F0b3JCb2R5Vmlldyh7IGRhdGE6IF8udmFsdWVzKHRoaXMubW9kZWwuZ2V0KFwiaXRlbXNcIikpIH0pO1xuXG5cdFx0XHR0aGlzLiRlbC5hcHBlbmQodGhpcy5ib2R5LnJlbmRlcigpLmVsKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5jb25maWd1cmVVSSlcblx0XHRcdHRoaXMuY29uZmlndXJlVUkoKTtcblx0fSxcblxuXHRyZWxvYWRDb2xsZWN0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm1vZGVsLmZldGNoKHsgc3VjY2VzczogdGhpcy5mZXRjaFN1Y2Nlc3MuYmluZCh0aGlzKSwgZXJyb3I6IHRoaXMuZmV0Y2hFcnJvci5iaW5kKHRoaXMpIH0pO1xuXHR9LFxuXG5cdGZldGNoU3VjY2VzczogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5ib2R5LmRlc3Ryb3koKTtcblx0XHR0aGlzLmJvZHkgPSBuZXcgTFBOYXZpZ2F0b3JCb2R5Vmlldyh7IGRhdGE6IF8udmFsdWVzKHRoaXMubW9kZWwuZ2V0KFwiaXRlbXNcIikpIH0pO1xuXG5cdFx0dGhpcy4kZWwuYXBwZW5kKHRoaXMuYm9keS5yZW5kZXIoKS5lbCk7XG5cdH0sXG5cblx0ZmV0Y2hFcnJvcjogZnVuY3Rpb24obW9kZWwsIHhocikge1xuXHRcdGNvbnN0IGFuc3dlciA9IEFwcC5wYXJzZVJlc3BvbnNlKHhocik7XG5cdFx0YWxlcnQoYW5zd2VyLmRldGFpbCB8fCBhbnN3ZXIuaW5mbyk7XG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMubW9kZWwgPSBuZXcgTGVhcm5pbmdQYXRoTW9kZWwoeyBncm91cDogb3B0aW9ucy5ncm91cCB9KTtcblx0XHR0aGlzLnJlbG9hZENvbGxlY3Rpb24oKTtcblx0fSxcblxuXHR1cGRhdGU6IF8uZGVib3VuY2UoZnVuY3Rpb24oKSB7XG5cdFx0LyogZXNsaW50LWRpc2FibGUgbm8taW52YWxpZC10aGlzICovXG5cblx0XHR0aGlzLmJvZHkuZGVzdHJveSgpO1xuXHRcdHRoaXMuYm9keSA9IG5ldyBMUE5hdmlnYXRvckJvZHlWaWV3KHsgZGF0YTogdGhpcy5jb2xsZWN0aW9uLm1vZGVscyB9KTtcblxuXHRcdHRoaXMuJGVsLmFwcGVuZCh0aGlzLmJvZHkucmVuZGVyKCkuZWwpO1xuXG5cdFx0LyogZXNsaW50LWVuYWJsZSBuby1pbnZhbGlkLXRoaXMgKi9cblx0fSwgMTAwKSxcblxuXHRvbkRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuYm9keS5kZXN0cm95KCk7XG5cdH0sXG5cblx0b25DbG9zZTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuY2xvc2UpXG5cdFx0XHR0aGlzLmNsb3NlKCk7XG5cblx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5DbG9zZU5hdmlnYXRpb24pO1xuXHR9LFxuXG5cdHNlYXJjaENsaWNrOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH0sXG5cblx0c2VhcmNoOiBfLmRlYm91bmNlKGZ1bmN0aW9uKCkge1xuXHRcdC8qIGVzbGludC1kaXNhYmxlIG5vLWludmFsaWQtdGhpcyAqL1xuXG5cdFx0ZXZlbnRCdXMudHJpZ2dlcihcImxwTmF2OnNlYXJjaFwiLCB0aGlzLnVpLnRleHRCb3gudmFsKCkpO1xuXG5cdFx0LyogZXNsaW50LWVuYWJsZSBuby1pbnZhbGlkLXRoaXMgKi9cblx0fSwgMzAwKSxcblxuXHRjbGVhcjogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0JChldnQuY3VycmVudFRhcmdldCkuc2libGluZ3MoXCJpbnB1dFwiKS52YWwoXCJcIikudHJpZ2dlcihcImtleXVwXCIpO1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblx0fSxcbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\n\nvar eventBus = require(\"./eventBus\");\n\nvar PageView = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"page\",\n\n\tattributes: {\n\t\tdraggable: \"true\"\n\t},\n\n\tmodelEvents: {\n\t\tshow: \"shower\",\n\t\thide: \"hide\"\n\t},\n\n\tevents: {\n\t\tclick: \"clicked\",\n\t\tdragstart: \"onDragStart\",\n\t\tdragend: \"onDragEnd\"\n\t},\n\n\ttemplate: require(\"../../templates/console/pdfNavigation.nunj\").page,\n\n\tclicked: function clicked(evt) {\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\n\t\tthis.model.trigger(\"clicked\", this.model);\n\t},\n\n\tshower: function shower() {\n\t\tthis.$el.removeClass(\"hide\");\n\t},\n\n\thide: function hide() {\n\t\tthis.$el.addClass(\"hide\");\n\t},\n\n\tonDragStart: function onDragStart(event) {\n\t\tevent.originalEvent.dataTransfer.setData(\"text\", \"Page \" + this.model.get(\"page\"));\n\t\tevent.originalEvent.dataTransfer.effectAllowed = \"move\";\n\t},\n\n\tonDragEnd: _.noop\n});\n\nvar BookNavigatorPagesView = Backbone.Marionette.View.extend({\n\tclassName: \"nav-pages\",\n\n\ttemplate: require(\"../../templates/console/pdfNavigation.nunj\").pages,\n\n\tui: {\n\t\ttitle: \"div.title\",\n\t\tcontent: \"div.content\",\n\t\tpage: \"div.page\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.metadata = options.metadata;\n\n\t\tif (options.metadata.get(\"totalPages\") === 0) this.$el.addClass(\"hide\");else this.listenTo(eventBus, \"pdfNav:search\", this.search.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this = this;\n\n\t\tif (this.metadata.get(\"totalPages\") === 0) return;\n\n\t\t// Generate pages\n\t\tthis.pages = new Backbone.Collection();\n\n\t\tthis.listenTo(this.pages, \"clicked\", this.pageClick.bind(this));\n\n\t\t_.each(this.metadata.get(\"pages\"), function (p) {\n\t\t\t_this.pages.add(new Backbone.Model({ page: p.page, title: p.title }));\n\t\t});\n\n\t\tthis.pages.each(function (item) {\n\t\t\tvar view = new PageView({ model: item });\n\t\t\t_this.ui.content.append(view.render().el);\n\t\t});\n\t},\n\n\tsearch: function search(text) {\n\t\tthis.pages.each(function (item) {\n\t\t\tif (_.includes(item.get(\"page\").toString(), text)) item.trigger(\"show\");else item.trigger(\"hide\");\n\t\t});\n\t},\n\n\tpageClick: function pageClick(model) {\n\t\teventBus.trigger(eventBus.Events.PageChange, model.get(\"page\"), true);\n\t}\n});\n\nvar BookNavigatorBodyView = Backbone.Marionette.View.extend({\n\tclassName: \"nav-body\",\n\n\ttemplate: require(\"../../templates/console/pdfNavigation.nunj\").body,\n\n\tui: {\n\t\tlink: \"div.item\",\n\t\tcontent: \".content\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.link\": \"clicked\",\n\t\t\"dragstart @ui.link\": \"onDragStart\",\n\t\t\"dragend @ui.link\": \"onDragEnd\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.metadata = options.metadata;\n\n\t\tthis.listenTo(eventBus, \"pdfNav:search\", this.search.bind(this));\n\t},\n\n\tserializeData: function serializeData() {\n\t\treturn {\n\t\t\tpages: this.metadata.get(\"bookmarks\")\n\t\t};\n\t},\n\n\tsearch: function search(text) {\n\t\t$(\"div.item\", this.ui.content).each(function (idx, el) {\n\t\t\tif (_.includes($(el).text().toLowerCase(), text)) {\n\t\t\t\t$(el).show();\n\t\t\t\t// Also show the parents\n\t\t\t\t$(el).parents(\"div.pdfNav\").prev(\"div.item\").show();\n\t\t\t} else {\n\t\t\t\t$(el).hide();\n\t\t\t}\n\t\t});\n\t},\n\n\tclicked: function clicked(evt) {\n\t\tevt.stopPropagation();\n\n\t\tvar tag = $(evt.currentTarget).data(\"tag\");\n\n\t\t// Find the matching element\n\t\ttag = tag.toString().split(\".\");\n\n\t\ttag = _.reduce(tag, function (sum, num) {\n\t\t\treturn sum.items[parseInt(num, 10)];\n\t\t}, { items: this.metadata.get(\"bookmarks\") });\n\n\t\teventBus.trigger(eventBus.Events.SetPage, tag.page, true);\n\t},\n\n\tonDragStart: function onDragStart(event) {\n\t\tevent.originalEvent.dataTransfer.setData(\"text\", $(event.originalEvent.target).text());\n\t\tevent.originalEvent.dataTransfer.effectAllowed = \"move\";\n\t},\n\n\tonDragEnd: _.noop\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tid: \"pdf-navigator\",\n\n\ttemplate: require(\"../../templates/console/pdfNavigation.nunj\").regions,\n\n\tui: {\n\t\ttextBox: \"input\",\n\t\tclose: \"span.fal\",\n\t\tclear: \".input-overlay\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.textBox\": \"searchClick\",\n\t\t\"keyup @ui.textBox\": \"search\",\n\t\t\"click @ui.close\": \"onClose\",\n\t\t\"click @ui.clear\": \"clear\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.metadata = options.metadata;\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.pages = new BookNavigatorPagesView({ metadata: this.metadata });\n\t\tthis.body = new BookNavigatorBodyView({ metadata: this.metadata, draggable: this.Draggable });\n\n\t\tthis.$el.append(this.pages.render().el);\n\t\tthis.$el.append(this.body.render().el);\n\n\t\tif (this.configureUI) this.configureUI();\n\t},\n\n\tonDestroy: function onDestroy() {\n\t\tthis.pages.destroy();\n\t\tthis.body.destroy();\n\t},\n\n\tonClose: function onClose() {\n\t\tif (this.close) this.close();\n\n\t\teventBus.trigger(eventBus.Events.CloseNavigation);\n\t},\n\n\tsearchClick: function searchClick(evt) {\n\t\tevt.stopPropagation();\n\t},\n\n\tsearch: _.debounce(function () {\n\t\t/* eslint-disable no-invalid-this */\n\n\t\teventBus.trigger(\"pdfNav:search\", this.ui.textBox.val());\n\n\t\t/* eslint-enable no-invalid-this */\n\t}, 300),\n\n\tclear: function clear(evt) {\n\t\t$(evt.currentTarget).siblings(\"input\").val(\"\").trigger(\"keyup\");\n\t\tevt.stopPropagation();\n\t}\n});\n\n// ----------------------------------------------------------------------------\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBkZk5hdmlnYXRpb24uanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwiJCIsIl8iLCJldmVudEJ1cyIsIlBhZ2VWaWV3IiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJleHRlbmQiLCJ0YWdOYW1lIiwiY2xhc3NOYW1lIiwiYXR0cmlidXRlcyIsImRyYWdnYWJsZSIsIm1vZGVsRXZlbnRzIiwic2hvdyIsImhpZGUiLCJldmVudHMiLCJjbGljayIsImRyYWdzdGFydCIsImRyYWdlbmQiLCJ0ZW1wbGF0ZSIsInBhZ2UiLCJjbGlja2VkIiwiZXZ0Iiwic3RvcFByb3BhZ2F0aW9uIiwicHJldmVudERlZmF1bHQiLCJtb2RlbCIsInRyaWdnZXIiLCJzaG93ZXIiLCIkZWwiLCJyZW1vdmVDbGFzcyIsImFkZENsYXNzIiwib25EcmFnU3RhcnQiLCJldmVudCIsIm9yaWdpbmFsRXZlbnQiLCJkYXRhVHJhbnNmZXIiLCJzZXREYXRhIiwiZ2V0IiwiZWZmZWN0QWxsb3dlZCIsIm9uRHJhZ0VuZCIsIm5vb3AiLCJCb29rTmF2aWdhdG9yUGFnZXNWaWV3IiwicGFnZXMiLCJ1aSIsInRpdGxlIiwiY29udGVudCIsImluaXRpYWxpemUiLCJvcHRpb25zIiwibWV0YWRhdGEiLCJsaXN0ZW5UbyIsInNlYXJjaCIsImJpbmQiLCJvblJlbmRlciIsIkNvbGxlY3Rpb24iLCJwYWdlQ2xpY2siLCJlYWNoIiwiYWRkIiwiTW9kZWwiLCJwIiwidmlldyIsIml0ZW0iLCJhcHBlbmQiLCJyZW5kZXIiLCJlbCIsInRleHQiLCJpbmNsdWRlcyIsInRvU3RyaW5nIiwiRXZlbnRzIiwiUGFnZUNoYW5nZSIsIkJvb2tOYXZpZ2F0b3JCb2R5VmlldyIsImJvZHkiLCJsaW5rIiwic2VyaWFsaXplRGF0YSIsImlkeCIsInRvTG93ZXJDYXNlIiwicGFyZW50cyIsInByZXYiLCJ0YWciLCJjdXJyZW50VGFyZ2V0IiwiZGF0YSIsInNwbGl0IiwicmVkdWNlIiwic3VtIiwibnVtIiwiaXRlbXMiLCJwYXJzZUludCIsIlNldFBhZ2UiLCJ0YXJnZXQiLCJtb2R1bGUiLCJleHBvcnRzIiwiaWQiLCJyZWdpb25zIiwidGV4dEJveCIsImNsb3NlIiwiY2xlYXIiLCJEcmFnZ2FibGUiLCJjb25maWd1cmVVSSIsIm9uRGVzdHJveSIsImRlc3Ryb3kiLCJvbkNsb3NlIiwiQ2xvc2VOYXZpZ2F0aW9uIiwic2VhcmNoQ2xpY2siLCJkZWJvdW5jZSIsInZhbCIsInNpYmxpbmdzIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1FLElBQUlGLFFBQVEsUUFBUixDQUFWOztBQUVBLElBQU1HLFdBQVdILFFBQVEsWUFBUixDQUFqQjs7QUFFQSxJQUFNSSxXQUFXTCxTQUFTTSxVQUFULENBQW9CQyxJQUFwQixDQUF5QkMsTUFBekIsQ0FBZ0M7QUFDaERDLFVBQVMsS0FEdUM7QUFFaERDLFlBQVcsTUFGcUM7O0FBSWhEQyxhQUFZO0FBQ1hDLGFBQVc7QUFEQSxFQUpvQzs7QUFRaERDLGNBQWE7QUFDWkMsUUFBTSxRQURNO0FBRVpDLFFBQU07QUFGTSxFQVJtQzs7QUFhaERDLFNBQVE7QUFDUEMsU0FBTyxTQURBO0FBRVBDLGFBQVcsYUFGSjtBQUdQQyxXQUFTO0FBSEYsRUFid0M7O0FBbUJoREMsV0FBVW5CLFFBQVEsNENBQVIsRUFBc0RvQixJQW5CaEI7O0FBcUJoREMsVUFBUyxpQkFBU0MsR0FBVCxFQUFjO0FBQ3RCQSxNQUFJQyxlQUFKO0FBQ0FELE1BQUlFLGNBQUo7O0FBRUEsT0FBS0MsS0FBTCxDQUFXQyxPQUFYLENBQW1CLFNBQW5CLEVBQThCLEtBQUtELEtBQW5DO0FBQ0EsRUExQitDOztBQTRCaERFLFNBQVEsa0JBQVc7QUFDbEIsT0FBS0MsR0FBTCxDQUFTQyxXQUFULENBQXFCLE1BQXJCO0FBQ0EsRUE5QitDOztBQWdDaERmLE9BQU0sZ0JBQVc7QUFDaEIsT0FBS2MsR0FBTCxDQUFTRSxRQUFULENBQWtCLE1BQWxCO0FBQ0EsRUFsQytDOztBQW9DaERDLGNBQWEscUJBQVNDLEtBQVQsRUFBZ0I7QUFDNUJBLFFBQU1DLGFBQU4sQ0FBb0JDLFlBQXBCLENBQWlDQyxPQUFqQyxDQUF5QyxNQUF6QyxFQUFpRCxVQUFVLEtBQUtWLEtBQUwsQ0FBV1csR0FBWCxDQUFlLE1BQWYsQ0FBM0Q7QUFDQUosUUFBTUMsYUFBTixDQUFvQkMsWUFBcEIsQ0FBaUNHLGFBQWpDLEdBQWlELE1BQWpEO0FBQ0EsRUF2QytDOztBQXlDaERDLFlBQVdwQyxFQUFFcUM7QUF6Q21DLENBQWhDLENBQWpCOztBQTRDQSxJQUFNQyx5QkFBeUJ6QyxTQUFTTSxVQUFULENBQW9CQyxJQUFwQixDQUF5QkMsTUFBekIsQ0FBZ0M7QUFDOURFLFlBQVcsV0FEbUQ7O0FBRzlEVSxXQUFVbkIsUUFBUSw0Q0FBUixFQUFzRHlDLEtBSEY7O0FBSzlEQyxLQUFJO0FBQ0hDLFNBQU8sV0FESjtBQUVIQyxXQUFTLGFBRk47QUFHSHhCLFFBQU07QUFISCxFQUwwRDs7QUFXOUR5QixhQUFZLG9CQUFTQyxPQUFULEVBQWtCO0FBQzdCLE9BQUtDLFFBQUwsR0FBZ0JELFFBQVFDLFFBQXhCOztBQUVBLE1BQUlELFFBQVFDLFFBQVIsQ0FBaUJYLEdBQWpCLENBQXFCLFlBQXJCLE1BQXVDLENBQTNDLEVBQ0MsS0FBS1IsR0FBTCxDQUFTRSxRQUFULENBQWtCLE1BQWxCLEVBREQsS0FHQyxLQUFLa0IsUUFBTCxDQUFjN0MsUUFBZCxFQUF3QixlQUF4QixFQUF5QyxLQUFLOEMsTUFBTCxDQUFZQyxJQUFaLENBQWlCLElBQWpCLENBQXpDO0FBQ0QsRUFsQjZEOztBQW9COURDLFdBQVUsb0JBQVc7QUFBQTs7QUFDcEIsTUFBSSxLQUFLSixRQUFMLENBQWNYLEdBQWQsQ0FBa0IsWUFBbEIsTUFBb0MsQ0FBeEMsRUFDQzs7QUFFRDtBQUNBLE9BQUtLLEtBQUwsR0FBYSxJQUFJMUMsU0FBU3FELFVBQWIsRUFBYjs7QUFFQSxPQUFLSixRQUFMLENBQWMsS0FBS1AsS0FBbkIsRUFBMEIsU0FBMUIsRUFBcUMsS0FBS1ksU0FBTCxDQUFlSCxJQUFmLENBQW9CLElBQXBCLENBQXJDOztBQUVBaEQsSUFBRW9ELElBQUYsQ0FBTyxLQUFLUCxRQUFMLENBQWNYLEdBQWQsQ0FBa0IsT0FBbEIsQ0FBUCxFQUFtQyxhQUFLO0FBQ3ZDLFNBQUtLLEtBQUwsQ0FBV2MsR0FBWCxDQUFlLElBQUl4RCxTQUFTeUQsS0FBYixDQUFtQixFQUFFcEMsTUFBTXFDLEVBQUVyQyxJQUFWLEVBQWdCdUIsT0FBT2MsRUFBRWQsS0FBekIsRUFBbkIsQ0FBZjtBQUNBLEdBRkQ7O0FBS0EsT0FBS0YsS0FBTCxDQUFXYSxJQUFYLENBQWdCLGdCQUFRO0FBQ3ZCLE9BQU1JLE9BQU8sSUFBSXRELFFBQUosQ0FBYSxFQUFFcUIsT0FBT2tDLElBQVQsRUFBYixDQUFiO0FBQ0EsU0FBS2pCLEVBQUwsQ0FBUUUsT0FBUixDQUFnQmdCLE1BQWhCLENBQXVCRixLQUFLRyxNQUFMLEdBQWNDLEVBQXJDO0FBQ0EsR0FIRDtBQUlBLEVBdEM2RDs7QUF3QzlEYixTQUFRLGdCQUFTYyxJQUFULEVBQWU7QUFDdEIsT0FBS3RCLEtBQUwsQ0FBV2EsSUFBWCxDQUFnQixnQkFBUTtBQUN2QixPQUFJcEQsRUFBRThELFFBQUYsQ0FBV0wsS0FBS3ZCLEdBQUwsQ0FBUyxNQUFULEVBQWlCNkIsUUFBakIsRUFBWCxFQUF3Q0YsSUFBeEMsQ0FBSixFQUNDSixLQUFLakMsT0FBTCxDQUFhLE1BQWIsRUFERCxLQUdDaUMsS0FBS2pDLE9BQUwsQ0FBYSxNQUFiO0FBQ0QsR0FMRDtBQU1BLEVBL0M2RDs7QUFpRDlEMkIsWUFBVyxtQkFBUzVCLEtBQVQsRUFBZ0I7QUFDMUJ0QixXQUFTdUIsT0FBVCxDQUFpQnZCLFNBQVMrRCxNQUFULENBQWdCQyxVQUFqQyxFQUE2QzFDLE1BQU1XLEdBQU4sQ0FBVSxNQUFWLENBQTdDLEVBQWdFLElBQWhFO0FBQ0E7QUFuRDZELENBQWhDLENBQS9COztBQXNEQSxJQUFNZ0Msd0JBQXdCckUsU0FBU00sVUFBVCxDQUFvQkMsSUFBcEIsQ0FBeUJDLE1BQXpCLENBQWdDO0FBQzdERSxZQUFXLFVBRGtEOztBQUc3RFUsV0FBVW5CLFFBQVEsNENBQVIsRUFBc0RxRSxJQUhIOztBQUs3RDNCLEtBQUk7QUFDSDRCLFFBQU0sVUFESDtBQUVIMUIsV0FBUztBQUZOLEVBTHlEOztBQVU3RDdCLFNBQVE7QUFDUCxvQkFBa0IsU0FEWDtBQUVQLHdCQUFzQixhQUZmO0FBR1Asc0JBQW9CO0FBSGIsRUFWcUQ7O0FBZ0I3RDhCLGFBQVksb0JBQVNDLE9BQVQsRUFBa0I7QUFDN0IsT0FBS0MsUUFBTCxHQUFnQkQsUUFBUUMsUUFBeEI7O0FBRUEsT0FBS0MsUUFBTCxDQUFjN0MsUUFBZCxFQUF3QixlQUF4QixFQUF5QyxLQUFLOEMsTUFBTCxDQUFZQyxJQUFaLENBQWlCLElBQWpCLENBQXpDO0FBQ0EsRUFwQjREOztBQXNCN0RxQixnQkFBZSx5QkFBVztBQUN6QixTQUFPO0FBQ045QixVQUFPLEtBQUtNLFFBQUwsQ0FBY1gsR0FBZCxDQUFrQixXQUFsQjtBQURELEdBQVA7QUFHQSxFQTFCNEQ7O0FBNEI3RGEsU0FBUSxnQkFBU2MsSUFBVCxFQUFlO0FBQ3RCOUQsSUFBRSxVQUFGLEVBQWMsS0FBS3lDLEVBQUwsQ0FBUUUsT0FBdEIsRUFBK0JVLElBQS9CLENBQW9DLFVBQUNrQixHQUFELEVBQU1WLEVBQU4sRUFBYTtBQUNoRCxPQUFJNUQsRUFBRThELFFBQUYsQ0FBVy9ELEVBQUU2RCxFQUFGLEVBQU1DLElBQU4sR0FBYVUsV0FBYixFQUFYLEVBQXVDVixJQUF2QyxDQUFKLEVBQWtEO0FBQ2pEOUQsTUFBRTZELEVBQUYsRUFBTWpELElBQU47QUFDQTtBQUNBWixNQUFFNkQsRUFBRixFQUFNWSxPQUFOLENBQWMsWUFBZCxFQUE0QkMsSUFBNUIsQ0FBaUMsVUFBakMsRUFBNkM5RCxJQUE3QztBQUNBLElBSkQsTUFLSztBQUNKWixNQUFFNkQsRUFBRixFQUFNaEQsSUFBTjtBQUNBO0FBQ0QsR0FURDtBQVVBLEVBdkM0RDs7QUF5QzdETyxVQUFTLGlCQUFTQyxHQUFULEVBQWM7QUFDdEJBLE1BQUlDLGVBQUo7O0FBRUEsTUFBSXFELE1BQU0zRSxFQUFFcUIsSUFBSXVELGFBQU4sRUFBcUJDLElBQXJCLENBQTBCLEtBQTFCLENBQVY7O0FBRUE7QUFDQUYsUUFBTUEsSUFBSVgsUUFBSixHQUFlYyxLQUFmLENBQXFCLEdBQXJCLENBQU47O0FBRUFILFFBQU0xRSxFQUFFOEUsTUFBRixDQUFTSixHQUFULEVBQWMsVUFBQ0ssR0FBRCxFQUFNQyxHQUFOO0FBQUEsVUFBY0QsSUFBSUUsS0FBSixDQUFVQyxTQUFTRixHQUFULEVBQWMsRUFBZCxDQUFWLENBQWQ7QUFBQSxHQUFkLEVBQTBELEVBQUVDLE9BQU8sS0FBS3BDLFFBQUwsQ0FBY1gsR0FBZCxDQUFrQixXQUFsQixDQUFULEVBQTFELENBQU47O0FBRUFqQyxXQUFTdUIsT0FBVCxDQUFpQnZCLFNBQVMrRCxNQUFULENBQWdCbUIsT0FBakMsRUFBMENULElBQUl4RCxJQUE5QyxFQUFvRCxJQUFwRDtBQUNBLEVBcEQ0RDs7QUFzRDdEVyxjQUFhLHFCQUFTQyxLQUFULEVBQWdCO0FBQzVCQSxRQUFNQyxhQUFOLENBQW9CQyxZQUFwQixDQUFpQ0MsT0FBakMsQ0FBeUMsTUFBekMsRUFBaURsQyxFQUFFK0IsTUFBTUMsYUFBTixDQUFvQnFELE1BQXRCLEVBQThCdkIsSUFBOUIsRUFBakQ7QUFDQS9CLFFBQU1DLGFBQU4sQ0FBb0JDLFlBQXBCLENBQWlDRyxhQUFqQyxHQUFpRCxNQUFqRDtBQUNBLEVBekQ0RDs7QUEyRDdEQyxZQUFXcEMsRUFBRXFDO0FBM0RnRCxDQUFoQyxDQUE5Qjs7QUE4REFnRCxPQUFPQyxPQUFQLEdBQWlCekYsU0FBU00sVUFBVCxDQUFvQkMsSUFBcEIsQ0FBeUJDLE1BQXpCLENBQWdDO0FBQ2hEQyxVQUFTLEtBRHVDO0FBRWhEaUYsS0FBSSxlQUY0Qzs7QUFJaER0RSxXQUFVbkIsUUFBUSw0Q0FBUixFQUFzRDBGLE9BSmhCOztBQU1oRGhELEtBQUk7QUFDSGlELFdBQVMsT0FETjtBQUVIQyxTQUFPLFVBRko7QUFHSEMsU0FBTztBQUhKLEVBTjRDOztBQVloRDlFLFNBQVE7QUFDUCx1QkFBcUIsYUFEZDtBQUVQLHVCQUFxQixRQUZkO0FBR1AscUJBQW1CLFNBSFo7QUFJUCxxQkFBbUI7QUFKWixFQVp3Qzs7QUFtQmhEOEIsYUFBWSxvQkFBU0MsT0FBVCxFQUFrQjtBQUM3QixPQUFLQyxRQUFMLEdBQWdCRCxRQUFRQyxRQUF4QjtBQUNBLEVBckIrQzs7QUF1QmhESSxXQUFVLG9CQUFXO0FBQ3BCLE9BQUtWLEtBQUwsR0FBYSxJQUFJRCxzQkFBSixDQUEyQixFQUFFTyxVQUFVLEtBQUtBLFFBQWpCLEVBQTNCLENBQWI7QUFDQSxPQUFLc0IsSUFBTCxHQUFZLElBQUlELHFCQUFKLENBQTBCLEVBQUVyQixVQUFVLEtBQUtBLFFBQWpCLEVBQTJCcEMsV0FBVyxLQUFLbUYsU0FBM0MsRUFBMUIsQ0FBWjs7QUFFQSxPQUFLbEUsR0FBTCxDQUFTZ0MsTUFBVCxDQUFnQixLQUFLbkIsS0FBTCxDQUFXb0IsTUFBWCxHQUFvQkMsRUFBcEM7QUFDQSxPQUFLbEMsR0FBTCxDQUFTZ0MsTUFBVCxDQUFnQixLQUFLUyxJQUFMLENBQVVSLE1BQVYsR0FBbUJDLEVBQW5DOztBQUVBLE1BQUksS0FBS2lDLFdBQVQsRUFDQyxLQUFLQSxXQUFMO0FBQ0QsRUFoQytDOztBQWtDaERDLFlBQVcscUJBQVc7QUFDckIsT0FBS3ZELEtBQUwsQ0FBV3dELE9BQVg7QUFDQSxPQUFLNUIsSUFBTCxDQUFVNEIsT0FBVjtBQUNBLEVBckMrQzs7QUF1Q2hEQyxVQUFTLG1CQUFXO0FBQ25CLE1BQUksS0FBS04sS0FBVCxFQUNDLEtBQUtBLEtBQUw7O0FBRUR6RixXQUFTdUIsT0FBVCxDQUFpQnZCLFNBQVMrRCxNQUFULENBQWdCaUMsZUFBakM7QUFDQSxFQTVDK0M7O0FBOENoREMsY0FBYSxxQkFBUzlFLEdBQVQsRUFBYztBQUMxQkEsTUFBSUMsZUFBSjtBQUNBLEVBaEQrQzs7QUFrRGhEMEIsU0FBUS9DLEVBQUVtRyxRQUFGLENBQVcsWUFBVztBQUM3Qjs7QUFFQWxHLFdBQVN1QixPQUFULENBQWlCLGVBQWpCLEVBQWtDLEtBQUtnQixFQUFMLENBQVFpRCxPQUFSLENBQWdCVyxHQUFoQixFQUFsQzs7QUFFQTtBQUNBLEVBTk8sRUFNTCxHQU5LLENBbER3Qzs7QUEwRGhEVCxRQUFPLGVBQVN2RSxHQUFULEVBQWM7QUFDcEJyQixJQUFFcUIsSUFBSXVELGFBQU4sRUFBcUIwQixRQUFyQixDQUE4QixPQUE5QixFQUF1Q0QsR0FBdkMsQ0FBMkMsRUFBM0MsRUFBK0M1RSxPQUEvQyxDQUF1RCxPQUF2RDtBQUNBSixNQUFJQyxlQUFKO0FBQ0E7QUE3RCtDLENBQWhDLENBQWpCOztBQWdFQSIsImZpbGUiOiJwZGZOYXZpZ2F0aW9uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5cbmNvbnN0IGV2ZW50QnVzID0gcmVxdWlyZShcIi4vZXZlbnRCdXNcIik7XG5cbmNvbnN0IFBhZ2VWaWV3ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6IFwiZGl2XCIsXG5cdGNsYXNzTmFtZTogXCJwYWdlXCIsXG5cblx0YXR0cmlidXRlczoge1xuXHRcdGRyYWdnYWJsZTogXCJ0cnVlXCIsXG5cdH0sXG5cblx0bW9kZWxFdmVudHM6IHtcblx0XHRzaG93OiBcInNob3dlclwiLFxuXHRcdGhpZGU6IFwiaGlkZVwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdGNsaWNrOiBcImNsaWNrZWRcIixcblx0XHRkcmFnc3RhcnQ6IFwib25EcmFnU3RhcnRcIixcblx0XHRkcmFnZW5kOiBcIm9uRHJhZ0VuZFwiLFxuXHR9LFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2NvbnNvbGUvcGRmTmF2aWdhdGlvbi5udW5qXCIpLnBhZ2UsXG5cblx0Y2xpY2tlZDogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0dGhpcy5tb2RlbC50cmlnZ2VyKFwiY2xpY2tlZFwiLCB0aGlzLm1vZGVsKTtcblx0fSxcblxuXHRzaG93ZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRoaWRlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0b25EcmFnU3RhcnQ6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0ZXZlbnQub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXIuc2V0RGF0YShcInRleHRcIiwgXCJQYWdlIFwiICsgdGhpcy5tb2RlbC5nZXQoXCJwYWdlXCIpKTtcblx0XHRldmVudC5vcmlnaW5hbEV2ZW50LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gXCJtb3ZlXCI7XG5cdH0sXG5cblx0b25EcmFnRW5kOiBfLm5vb3AsXG59KTtcblxuY29uc3QgQm9va05hdmlnYXRvclBhZ2VzVmlldyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwibmF2LXBhZ2VzXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvY29uc29sZS9wZGZOYXZpZ2F0aW9uLm51bmpcIikucGFnZXMsXG5cblx0dWk6IHtcblx0XHR0aXRsZTogXCJkaXYudGl0bGVcIixcblx0XHRjb250ZW50OiBcImRpdi5jb250ZW50XCIsXG5cdFx0cGFnZTogXCJkaXYucGFnZVwiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLm1ldGFkYXRhID0gb3B0aW9ucy5tZXRhZGF0YTtcblxuXHRcdGlmIChvcHRpb25zLm1ldGFkYXRhLmdldChcInRvdGFsUGFnZXNcIikgPT09IDApXG5cdFx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5saXN0ZW5UbyhldmVudEJ1cywgXCJwZGZOYXY6c2VhcmNoXCIsIHRoaXMuc2VhcmNoLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tZXRhZGF0YS5nZXQoXCJ0b3RhbFBhZ2VzXCIpID09PSAwKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0Ly8gR2VuZXJhdGUgcGFnZXNcblx0XHR0aGlzLnBhZ2VzID0gbmV3IEJhY2tib25lLkNvbGxlY3Rpb24oKTtcblxuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5wYWdlcywgXCJjbGlja2VkXCIsIHRoaXMucGFnZUNsaWNrLmJpbmQodGhpcykpO1xuXG5cdFx0Xy5lYWNoKHRoaXMubWV0YWRhdGEuZ2V0KFwicGFnZXNcIiksIHAgPT4ge1xuXHRcdFx0dGhpcy5wYWdlcy5hZGQobmV3IEJhY2tib25lLk1vZGVsKHsgcGFnZTogcC5wYWdlLCB0aXRsZTogcC50aXRsZSB9KSk7XG5cdFx0fSk7XG5cblxuXHRcdHRoaXMucGFnZXMuZWFjaChpdGVtID0+IHtcblx0XHRcdGNvbnN0IHZpZXcgPSBuZXcgUGFnZVZpZXcoeyBtb2RlbDogaXRlbSB9KTtcblx0XHRcdHRoaXMudWkuY29udGVudC5hcHBlbmQodmlldy5yZW5kZXIoKS5lbCk7XG5cdFx0fSk7XG5cdH0sXG5cblx0c2VhcmNoOiBmdW5jdGlvbih0ZXh0KSB7XG5cdFx0dGhpcy5wYWdlcy5lYWNoKGl0ZW0gPT4ge1xuXHRcdFx0aWYgKF8uaW5jbHVkZXMoaXRlbS5nZXQoXCJwYWdlXCIpLnRvU3RyaW5nKCksIHRleHQpKVxuXHRcdFx0XHRpdGVtLnRyaWdnZXIoXCJzaG93XCIpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRpdGVtLnRyaWdnZXIoXCJoaWRlXCIpO1xuXHRcdH0pO1xuXHR9LFxuXG5cdHBhZ2VDbGljazogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5QYWdlQ2hhbmdlLCBtb2RlbC5nZXQoXCJwYWdlXCIpLCB0cnVlKTtcblx0fSxcbn0pO1xuXG5jb25zdCBCb29rTmF2aWdhdG9yQm9keVZpZXcgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcIm5hdi1ib2R5XCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvY29uc29sZS9wZGZOYXZpZ2F0aW9uLm51bmpcIikuYm9keSxcblxuXHR1aToge1xuXHRcdGxpbms6IFwiZGl2Lml0ZW1cIixcblx0XHRjb250ZW50OiBcIi5jb250ZW50XCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkubGlua1wiOiBcImNsaWNrZWRcIixcblx0XHRcImRyYWdzdGFydCBAdWkubGlua1wiOiBcIm9uRHJhZ1N0YXJ0XCIsXG5cdFx0XCJkcmFnZW5kIEB1aS5saW5rXCI6IFwib25EcmFnRW5kXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMubWV0YWRhdGEgPSBvcHRpb25zLm1ldGFkYXRhO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhldmVudEJ1cywgXCJwZGZOYXY6c2VhcmNoXCIsIHRoaXMuc2VhcmNoLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdHNlcmlhbGl6ZURhdGE6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRwYWdlczogdGhpcy5tZXRhZGF0YS5nZXQoXCJib29rbWFya3NcIiksXG5cdFx0fTtcblx0fSxcblxuXHRzZWFyY2g6IGZ1bmN0aW9uKHRleHQpIHtcblx0XHQkKFwiZGl2Lml0ZW1cIiwgdGhpcy51aS5jb250ZW50KS5lYWNoKChpZHgsIGVsKSA9PiB7XG5cdFx0XHRpZiAoXy5pbmNsdWRlcygkKGVsKS50ZXh0KCkudG9Mb3dlckNhc2UoKSwgdGV4dCkpIHtcblx0XHRcdFx0JChlbCkuc2hvdygpO1xuXHRcdFx0XHQvLyBBbHNvIHNob3cgdGhlIHBhcmVudHNcblx0XHRcdFx0JChlbCkucGFyZW50cyhcImRpdi5wZGZOYXZcIikucHJldihcImRpdi5pdGVtXCIpLnNob3coKTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHQkKGVsKS5oaWRlKCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0Y2xpY2tlZDogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0bGV0IHRhZyA9ICQoZXZ0LmN1cnJlbnRUYXJnZXQpLmRhdGEoXCJ0YWdcIik7XG5cblx0XHQvLyBGaW5kIHRoZSBtYXRjaGluZyBlbGVtZW50XG5cdFx0dGFnID0gdGFnLnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpO1xuXG5cdFx0dGFnID0gXy5yZWR1Y2UodGFnLCAoc3VtLCBudW0pID0+IHN1bS5pdGVtc1twYXJzZUludChudW0sIDEwKV0sIHsgaXRlbXM6IHRoaXMubWV0YWRhdGEuZ2V0KFwiYm9va21hcmtzXCIpIH0pO1xuXG5cdFx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5FdmVudHMuU2V0UGFnZSwgdGFnLnBhZ2UsIHRydWUpO1xuXHR9LFxuXG5cdG9uRHJhZ1N0YXJ0OiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50Lm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoXCJ0ZXh0XCIsICQoZXZlbnQub3JpZ2luYWxFdmVudC50YXJnZXQpLnRleHQoKSk7XG5cdFx0ZXZlbnQub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9IFwibW92ZVwiO1xuXHR9LFxuXG5cdG9uRHJhZ0VuZDogXy5ub29wLFxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6IFwiZGl2XCIsXG5cdGlkOiBcInBkZi1uYXZpZ2F0b3JcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9jb25zb2xlL3BkZk5hdmlnYXRpb24ubnVualwiKS5yZWdpb25zLFxuXG5cdHVpOiB7XG5cdFx0dGV4dEJveDogXCJpbnB1dFwiLFxuXHRcdGNsb3NlOiBcInNwYW4uZmFsXCIsXG5cdFx0Y2xlYXI6IFwiLmlucHV0LW92ZXJsYXlcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS50ZXh0Qm94XCI6IFwic2VhcmNoQ2xpY2tcIixcblx0XHRcImtleXVwIEB1aS50ZXh0Qm94XCI6IFwic2VhcmNoXCIsXG5cdFx0XCJjbGljayBAdWkuY2xvc2VcIjogXCJvbkNsb3NlXCIsXG5cdFx0XCJjbGljayBAdWkuY2xlYXJcIjogXCJjbGVhclwiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLm1ldGFkYXRhID0gb3B0aW9ucy5tZXRhZGF0YTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5wYWdlcyA9IG5ldyBCb29rTmF2aWdhdG9yUGFnZXNWaWV3KHsgbWV0YWRhdGE6IHRoaXMubWV0YWRhdGEgfSk7XG5cdFx0dGhpcy5ib2R5ID0gbmV3IEJvb2tOYXZpZ2F0b3JCb2R5Vmlldyh7IG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhLCBkcmFnZ2FibGU6IHRoaXMuRHJhZ2dhYmxlIH0pO1xuXG5cdFx0dGhpcy4kZWwuYXBwZW5kKHRoaXMucGFnZXMucmVuZGVyKCkuZWwpO1xuXHRcdHRoaXMuJGVsLmFwcGVuZCh0aGlzLmJvZHkucmVuZGVyKCkuZWwpO1xuXG5cdFx0aWYgKHRoaXMuY29uZmlndXJlVUkpXG5cdFx0XHR0aGlzLmNvbmZpZ3VyZVVJKCk7XG5cdH0sXG5cblx0b25EZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnBhZ2VzLmRlc3Ryb3koKTtcblx0XHR0aGlzLmJvZHkuZGVzdHJveSgpO1xuXHR9LFxuXG5cdG9uQ2xvc2U6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLmNsb3NlKVxuXHRcdFx0dGhpcy5jbG9zZSgpO1xuXG5cdFx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5FdmVudHMuQ2xvc2VOYXZpZ2F0aW9uKTtcblx0fSxcblxuXHRzZWFyY2hDbGljazogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9LFxuXG5cdHNlYXJjaDogXy5kZWJvdW5jZShmdW5jdGlvbigpIHtcblx0XHQvKiBlc2xpbnQtZGlzYWJsZSBuby1pbnZhbGlkLXRoaXMgKi9cblxuXHRcdGV2ZW50QnVzLnRyaWdnZXIoXCJwZGZOYXY6c2VhcmNoXCIsIHRoaXMudWkudGV4dEJveC52YWwoKSk7XG5cblx0XHQvKiBlc2xpbnQtZW5hYmxlIG5vLWludmFsaWQtdGhpcyAqL1xuXHR9LCAzMDApLFxuXG5cdGNsZWFyOiBmdW5jdGlvbihldnQpIHtcblx0XHQkKGV2dC5jdXJyZW50VGFyZ2V0KS5zaWJsaW5ncyhcImlucHV0XCIpLnZhbChcIlwiKS50cmlnZ2VyKFwia2V5dXBcIik7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9LFxufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiJdfQ==",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\n\nvar settings = require(\"app-settings\");\n\nvar _exports = {};\n\nvar cache = {};\n\nvar createImage = function createImage(source) {\n\tvar img = document.createElement(\"img\");\n\timg.style.width = \"32px\";\n\timg.style.height = \"32px\";\n\n\timg.src = settings.urlRoot + source;\n\n\treturn img;\n};\n\n// TOUCHPOINT: RESOURCE TYPE\n_exports.preloadImages = function () {\n\tcache.assessment = createImage(\"/images/content/annotation_interactive.png\");\n\tcache.audio = createImage(\"/images/content/annotation_mp3.png\");\n\tcache.compound = createImage(\"/images/content/annotation_expanded.png\");\n\tcache.excel = createImage(\"/images/content/annotation_excel.png\");\n\tcache.flashcarddeck = createImage(\"/images/content/annotation_flashcards.png\");\n\tcache.googledrive = createImage(\"/images/content/annotation_googledrive.png\");\n\tcache.image = createImage(\"/images/content/annotation_graphic.png\");\n\tcache.onenote = createImage(\"/images/content/annotation_onenote.png\");\n\tcache.pdf = createImage(\"/images/content/annotation_pdf.png\");\n\tcache.powerpoint = createImage(\"/images/content/annotation_powerpoint.png\");\n\tcache.text = createImage(\"/images/content/annotation_text.png\");\n\tcache.url = createImage(\"/images/content/annotation_url.png\");\n\tcache.video = createImage(\"/images/content/annotation_video.png\");\n\tcache.word = createImage(\"/images/content/annotation_word.png\");\n};\n\n// TOUCHPOINT: RESOURCE TYPE\nvar getCharacterCode = function getCharacterCode(resourceModel) {\n\tvar character = \"\\uF005\"; // fa-star\n\n\tif (resourceModel) {\n\t\tswitch (resourceModel.get(\"category\")) {\n\t\t\tcase \"assessment\":\n\t\t\t\tcharacter = \"\\uF0CA\"; // fa-list-ul\n\t\t\t\tbreak;\n\n\t\t\tcase \"googledrive\":\n\t\t\t\tcharacter = \"\\uF08E\"; // fa-external-link\n\t\t\t\tbreak;\n\n\t\t\tcase \"flashcarddeck\":\n\t\t\t\tcharacter = \"\\uF2F3\"; // fa-star-exclamation\n\t\t\t\tbreak;\n\n\t\t\tcase \"image\":\n\t\t\t\tcharacter = \"\\uF03E\"; // fa-picture-o\n\t\t\t\tbreak;\n\n\t\t\tcase \"onenote\":\n\t\t\t\tcharacter = \"\\uF08E\"; // fa-external-link\n\t\t\t\tbreak;\n\n\t\t\tcase \"pdf\":\n\t\t\t\tcharacter = \"\\uF1C1\"; // fa-file-pdf\n\t\t\t\tbreak;\n\n\t\t\tcase \"text\":\n\t\t\t\tcharacter = \"\\uF15C\"; // fa-file-alt\n\t\t\t\tbreak;\n\n\t\t\tcase \"url\":\n\t\t\t\tcharacter = \"\\uF08E\"; // fa-external-link\n\t\t\t\tbreak;\n\n\t\t\tcase \"video\":\n\t\t\t\tcharacter = \"\\uF03D\"; // fa-video-camera\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"Unknown resource type: \" + resourceModel.get(\"category\"));\n\t\t}\n\t}\n\n\treturn character;\n};\n\n// TOUCHPOINT: RESOURCE TYPE\nvar getImage = function getImage(resourceModel) {\n\tvar img = cache.compound;\n\n\tif (resourceModel) {\n\t\tvar category = resourceModel.get(\"category\");\n\t\tif (category === \"url\") {\n\t\t\tif (_.includes(resourceModel.get(\"url\"), \"1drv.ms\") || _.includes(resourceModel.get(\"url\"), \"onedrive.live.com\")) category = \"onenote\";else if (_.includes(resourceModel.get(\"url\"), \"drive.google.com\")) category = \"googledrive\";\n\t\t}\n\t\timg = cache[category];\n\t}\n\n\treturn img;\n};\n\n// The alignment of the drag image is inconsistent across Chrome and Firefox is the source of the image\n// is an element. Therefore, the resource icon is drawn to a canvas and the canvas is used as the source\n// image.\n\n_exports.createDragImage = function (event, resourceModel, type, hidingPlace) {\n\tvar container = $(hidingPlace);\n\n\tvar CANVAS_WIDTH = 32;\n\tvar CANVAS_HEIGHT = 32;\n\n\tvar canvas = $(\"<canvas width='32px' height='32px'></canvas>\");\n\tvar context = canvas.get(0).getContext(\"2d\");\n\n\tvar pixel_ratio = (window.devicePixelRatio || 1) / (context.webkitBackingStorePixelRatio || context.mozBackingStorePixelRatio || context.msBackingStorePixelRatio || context.oBackingStorePixelRatio || context.backingStorePixelRatio || 1);\n\n\tcanvas.prop(\"width\", CANVAS_WIDTH * pixel_ratio);\n\tcanvas.prop(\"height\", CANVAS_HEIGHT * pixel_ratio);\n\n\tvar canvasTop = void 0;\n\tvar canvasLeft = void 0;\n\n\tif (type === \"attachment\") {\n\t\tcanvasTop = event.originalEvent.pageX;\n\t\tcanvasLeft = event.originalEvent.pageY;\n\t}\n\n\tcanvas.css({\n\t\tposition: \"absolute\",\n\t\ttop: canvasTop,\n\t\tleft: canvasLeft,\n\t\t\"pointer-events\": \"none\",\n\t\twidth: \"32px\",\n\t\theight: \"32px\"\n\t}).appendTo(container);\n\n\tcontext.setTransform(pixel_ratio, 0, 0, pixel_ratio, 0, 0);\n\tif (settings.contentIcons === \"img\") {\n\t\tcontext.drawImage(getImage(resourceModel), 0, 0);\n\t} else {\n\t\tcontext.font = \"25px FontAwesome\";\n\t\tcontext.fillText(getCharacterCode(resourceModel), 0, 24);\n\t}\n\n\t// Remove the element on the next tick to bypass the need to hide it behind another element\n\tsetTimeout(function () {\n\t\tcanvas.remove();\n\t});\n\n\treturn canvas;\n};\n\n/*exports.destroyDragImage = function(prefix, hidingPlace)\n{\n\tvar container = $(hidingPlace);\n\tvar identifiers = createIdentifiers(prefix);\n\n\t$(\"canvas#\" + identifiers.canvas, container).remove();\n\t$(\"div#\" + identifiers.cover, container).remove();\n}*/\n\nmodule.exports = _exports;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJlc291cmNlSWNvbnMuanMiXSwibmFtZXMiOlsiJCIsInJlcXVpcmUiLCJfIiwic2V0dGluZ3MiLCJleHBvcnRzIiwiY2FjaGUiLCJjcmVhdGVJbWFnZSIsInNvdXJjZSIsImltZyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInN0eWxlIiwid2lkdGgiLCJoZWlnaHQiLCJzcmMiLCJ1cmxSb290IiwicHJlbG9hZEltYWdlcyIsImFzc2Vzc21lbnQiLCJhdWRpbyIsImNvbXBvdW5kIiwiZXhjZWwiLCJmbGFzaGNhcmRkZWNrIiwiZ29vZ2xlZHJpdmUiLCJpbWFnZSIsIm9uZW5vdGUiLCJwZGYiLCJwb3dlcnBvaW50IiwidGV4dCIsInVybCIsInZpZGVvIiwid29yZCIsImdldENoYXJhY3RlckNvZGUiLCJyZXNvdXJjZU1vZGVsIiwiY2hhcmFjdGVyIiwiZ2V0IiwiRXJyb3IiLCJnZXRJbWFnZSIsImNhdGVnb3J5IiwiaW5jbHVkZXMiLCJjcmVhdGVEcmFnSW1hZ2UiLCJldmVudCIsInR5cGUiLCJoaWRpbmdQbGFjZSIsImNvbnRhaW5lciIsIkNBTlZBU19XSURUSCIsIkNBTlZBU19IRUlHSFQiLCJjYW52YXMiLCJjb250ZXh0IiwiZ2V0Q29udGV4dCIsInBpeGVsX3JhdGlvIiwid2luZG93IiwiZGV2aWNlUGl4ZWxSYXRpbyIsIndlYmtpdEJhY2tpbmdTdG9yZVBpeGVsUmF0aW8iLCJtb3pCYWNraW5nU3RvcmVQaXhlbFJhdGlvIiwibXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvIiwib0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8iLCJiYWNraW5nU3RvcmVQaXhlbFJhdGlvIiwicHJvcCIsImNhbnZhc1RvcCIsImNhbnZhc0xlZnQiLCJvcmlnaW5hbEV2ZW50IiwicGFnZVgiLCJwYWdlWSIsImNzcyIsInBvc2l0aW9uIiwidG9wIiwibGVmdCIsImFwcGVuZFRvIiwic2V0VHJhbnNmb3JtIiwiY29udGVudEljb25zIiwiZHJhd0ltYWdlIiwiZm9udCIsImZp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ZXNvdXJjZUljb25zLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IGV4cG9ydHMgPSB7fTtcblxuY29uc3QgY2FjaGUgPSB7fTtcblxuY29uc3QgY3JlYXRlSW1hZ2UgPSBmdW5jdGlvbihzb3VyY2UpIHtcblx0Y29uc3QgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcblx0aW1nLnN0eWxlLndpZHRoID0gXCIzMnB4XCI7XG5cdGltZy5zdHlsZS5oZWlnaHQgPSBcIjMycHhcIjtcblxuXHRpbWcuc3JjID0gc2V0dGluZ3MudXJsUm9vdCArIHNvdXJjZTtcblxuXHRyZXR1cm4gaW1nO1xufTtcblxuLy8gVE9VQ0hQT0lOVDogUkVTT1VSQ0UgVFlQRVxuZXhwb3J0cy5wcmVsb2FkSW1hZ2VzID0gZnVuY3Rpb24oKSB7XG5cdGNhY2hlLmFzc2Vzc21lbnQgPSBjcmVhdGVJbWFnZShcIi9pbWFnZXMvY29udGVudC9hbm5vdGF0aW9uX2ludGVyYWN0aXZlLnBuZ1wiKTtcblx0Y2FjaGUuYXVkaW8gPSBjcmVhdGVJbWFnZShcIi9pbWFnZXMvY29udGVudC9hbm5vdGF0aW9uX21wMy5wbmdcIik7XG5cdGNhY2hlLmNvbXBvdW5kID0gY3JlYXRlSW1hZ2UoXCIvaW1hZ2VzL2NvbnRlbnQvYW5ub3RhdGlvbl9leHBhbmRlZC5wbmdcIik7XG5cdGNhY2hlLmV4Y2VsID0gY3JlYXRlSW1hZ2UoXCIvaW1hZ2VzL2NvbnRlbnQvYW5ub3RhdGlvbl9leGNlbC5wbmdcIik7XG5cdGNhY2hlLmZsYXNoY2FyZGRlY2sgPSBjcmVhdGVJbWFnZShcIi9pbWFnZXMvY29udGVudC9hbm5vdGF0aW9uX2ZsYXNoY2FyZHMucG5nXCIpO1xuXHRjYWNoZS5nb29nbGVkcml2ZSA9IGNyZWF0ZUltYWdlKFwiL2ltYWdlcy9jb250ZW50L2Fubm90YXRpb25fZ29vZ2xlZHJpdmUucG5nXCIpO1xuXHRjYWNoZS5pbWFnZSA9IGNyZWF0ZUltYWdlKFwiL2ltYWdlcy9jb250ZW50L2Fubm90YXRpb25fZ3JhcGhpYy5wbmdcIik7XG5cdGNhY2hlLm9uZW5vdGUgPSBjcmVhdGVJbWFnZShcIi9pbWFnZXMvY29udGVudC9hbm5vdGF0aW9uX29uZW5vdGUucG5nXCIpO1xuXHRjYWNoZS5wZGYgPSBjcmVhdGVJbWFnZShcIi9pbWFnZXMvY29udGVudC9hbm5vdGF0aW9uX3BkZi5wbmdcIik7XG5cdGNhY2hlLnBvd2VycG9pbnQgPSBjcmVhdGVJbWFnZShcIi9pbWFnZXMvY29udGVudC9hbm5vdGF0aW9uX3Bvd2VycG9pbnQucG5nXCIpO1xuXHRjYWNoZS50ZXh0ID0gY3JlYXRlSW1hZ2UoXCIvaW1hZ2VzL2NvbnRlbnQvYW5ub3RhdGlvbl90ZXh0LnBuZ1wiKTtcblx0Y2FjaGUudXJsID0gY3JlYXRlSW1hZ2UoXCIvaW1hZ2VzL2NvbnRlbnQvYW5ub3RhdGlvbl91cmwucG5nXCIpO1xuXHRjYWNoZS52aWRlbyA9IGNyZWF0ZUltYWdlKFwiL2ltYWdlcy9jb250ZW50L2Fubm90YXRpb25fdmlkZW8ucG5nXCIpO1xuXHRjYWNoZS53b3JkID0gY3JlYXRlSW1hZ2UoXCIvaW1hZ2VzL2NvbnRlbnQvYW5ub3RhdGlvbl93b3JkLnBuZ1wiKTtcbn07XG5cbi8vIFRPVUNIUE9JTlQ6IFJFU09VUkNFIFRZUEVcbmNvbnN0IGdldENoYXJhY3RlckNvZGUgPSBmdW5jdGlvbihyZXNvdXJjZU1vZGVsKSB7XG5cdGxldCBjaGFyYWN0ZXIgPSBcIlxcdUYwMDVcIjsgLy8gZmEtc3RhclxuXG5cdGlmIChyZXNvdXJjZU1vZGVsKSB7XG5cdFx0c3dpdGNoIChyZXNvdXJjZU1vZGVsLmdldChcImNhdGVnb3J5XCIpKSB7XG5cdFx0XHRjYXNlIFwiYXNzZXNzbWVudFwiOiBjaGFyYWN0ZXIgPSBcIlxcdUYwQ0FcIjsgLy8gZmEtbGlzdC11bFxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcImdvb2dsZWRyaXZlXCI6IGNoYXJhY3RlciA9IFwiXFx1RjA4RVwiOyAvLyBmYS1leHRlcm5hbC1saW5rXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwiZmxhc2hjYXJkZGVja1wiOiBjaGFyYWN0ZXIgPSBcIlxcdUYyRjNcIjsgLy8gZmEtc3Rhci1leGNsYW1hdGlvblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcImltYWdlXCI6IGNoYXJhY3RlciA9IFwiXFx1RjAzRVwiOyAvLyBmYS1waWN0dXJlLW9cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJvbmVub3RlXCI6IGNoYXJhY3RlciA9IFwiXFx1RjA4RVwiOyAvLyBmYS1leHRlcm5hbC1saW5rXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwicGRmXCI6IGNoYXJhY3RlciA9IFwiXFx1RjFDMVwiOyAvLyBmYS1maWxlLXBkZlxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcInRleHRcIjogY2hhcmFjdGVyID0gXCJcXHVGMTVDXCI7IC8vIGZhLWZpbGUtYWx0XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwidXJsXCI6IGNoYXJhY3RlciA9IFwiXFx1RjA4RVwiOyAvLyBmYS1leHRlcm5hbC1saW5rXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwidmlkZW9cIjogY2hhcmFjdGVyID0gXCJcXHVGMDNEXCI7IC8vIGZhLXZpZGVvLWNhbWVyYVxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biByZXNvdXJjZSB0eXBlOiBcIiArIHJlc291cmNlTW9kZWwuZ2V0KFwiY2F0ZWdvcnlcIikpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBjaGFyYWN0ZXI7XG59O1xuXG4vLyBUT1VDSFBPSU5UOiBSRVNPVVJDRSBUWVBFXG5jb25zdCBnZXRJbWFnZSA9IGZ1bmN0aW9uKHJlc291cmNlTW9kZWwpIHtcblx0bGV0IGltZyA9IGNhY2hlLmNvbXBvdW5kO1xuXG5cdGlmIChyZXNvdXJjZU1vZGVsKSB7XG5cdFx0bGV0IGNhdGVnb3J5ID0gcmVzb3VyY2VNb2RlbC5nZXQoXCJjYXRlZ29yeVwiKTtcblx0XHRpZiAoY2F0ZWdvcnkgPT09IFwidXJsXCIpIHtcblx0XHRcdGlmIChfLmluY2x1ZGVzKHJlc291cmNlTW9kZWwuZ2V0KFwidXJsXCIpLCBcIjFkcnYubXNcIikgfHwgXy5pbmNsdWRlcyhyZXNvdXJjZU1vZGVsLmdldChcInVybFwiKSwgXCJvbmVkcml2ZS5saXZlLmNvbVwiKSlcblx0XHRcdFx0Y2F0ZWdvcnkgPSBcIm9uZW5vdGVcIjtcblx0XHRcdGVsc2UgaWYgKF8uaW5jbHVkZXMocmVzb3VyY2VNb2RlbC5nZXQoXCJ1cmxcIiksIFwiZHJpdmUuZ29vZ2xlLmNvbVwiKSlcblx0XHRcdFx0Y2F0ZWdvcnkgPSBcImdvb2dsZWRyaXZlXCI7XG5cdFx0fVxuXHRcdGltZyA9IGNhY2hlW2NhdGVnb3J5XTtcblx0fVxuXG5cdHJldHVybiBpbWc7XG59O1xuXG4vLyBUaGUgYWxpZ25tZW50IG9mIHRoZSBkcmFnIGltYWdlIGlzIGluY29uc2lzdGVudCBhY3Jvc3MgQ2hyb21lIGFuZCBGaXJlZm94IGlzIHRoZSBzb3VyY2Ugb2YgdGhlIGltYWdlXG4vLyBpcyBhbiBlbGVtZW50LiBUaGVyZWZvcmUsIHRoZSByZXNvdXJjZSBpY29uIGlzIGRyYXduIHRvIGEgY2FudmFzIGFuZCB0aGUgY2FudmFzIGlzIHVzZWQgYXMgdGhlIHNvdXJjZVxuLy8gaW1hZ2UuXG5cbmV4cG9ydHMuY3JlYXRlRHJhZ0ltYWdlID0gZnVuY3Rpb24oZXZlbnQsIHJlc291cmNlTW9kZWwsIHR5cGUsIGhpZGluZ1BsYWNlKSB7XG5cdGNvbnN0IGNvbnRhaW5lciA9ICQoaGlkaW5nUGxhY2UpO1xuXG5cdGNvbnN0IENBTlZBU19XSURUSCA9IDMyO1xuXHRjb25zdCBDQU5WQVNfSEVJR0hUID0gMzI7XG5cblx0Y29uc3QgY2FudmFzID0gJChcIjxjYW52YXMgd2lkdGg9JzMycHgnIGhlaWdodD0nMzJweCc+PC9jYW52YXM+XCIpO1xuXHRjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldCgwKS5nZXRDb250ZXh0KFwiMmRcIik7XG5cblx0Y29uc3QgcGl4ZWxfcmF0aW8gPSAod2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSkgLyAoXG5cdFx0Y29udGV4dC53ZWJraXRCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8XG5cdFx0Y29udGV4dC5tb3pCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8XG5cdFx0Y29udGV4dC5tc0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcblx0XHRjb250ZXh0Lm9CYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8XG5cdFx0Y29udGV4dC5iYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8IDEpO1xuXG5cdGNhbnZhcy5wcm9wKFwid2lkdGhcIiwgQ0FOVkFTX1dJRFRIICogcGl4ZWxfcmF0aW8pO1xuXHRjYW52YXMucHJvcChcImhlaWdodFwiLCBDQU5WQVNfSEVJR0hUICogcGl4ZWxfcmF0aW8pO1xuXG5cdGxldCBjYW52YXNUb3A7XG5cdGxldCBjYW52YXNMZWZ0O1xuXG5cdGlmICh0eXBlID09PSBcImF0dGFjaG1lbnRcIikge1xuXHRcdGNhbnZhc1RvcCA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQucGFnZVg7XG5cdFx0Y2FudmFzTGVmdCA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQucGFnZVk7XG5cdH1cblxuXHRjYW52YXMuY3NzKHtcblx0XHRwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuXHRcdHRvcDogY2FudmFzVG9wLFxuXHRcdGxlZnQ6IGNhbnZhc0xlZnQsXG5cdFx0XCJwb2ludGVyLWV2ZW50c1wiOiBcIm5vbmVcIixcblx0XHR3aWR0aDogXCIzMnB4XCIsXG5cdFx0aGVpZ2h0OiBcIjMycHhcIixcblx0fSkuYXBwZW5kVG8oY29udGFpbmVyKTtcblxuXHRjb250ZXh0LnNldFRyYW5zZm9ybShwaXhlbF9yYXRpbywgMCwgMCwgcGl4ZWxfcmF0aW8sIDAsIDApO1xuXHRpZiAoc2V0dGluZ3MuY29udGVudEljb25zID09PSBcImltZ1wiKSB7XG5cdFx0Y29udGV4dC5kcmF3SW1hZ2UoZ2V0SW1hZ2UocmVzb3VyY2VNb2RlbCksIDAsIDApO1xuXHR9XG5cdGVsc2Uge1xuXHRcdGNvbnRleHQuZm9udCA9IFwiMjVweCBGb250QXdlc29tZVwiO1xuXHRcdGNvbnRleHQuZmlsbFRleHQoZ2V0Q2hhcmFjdGVyQ29kZShyZXNvdXJjZU1vZGVsKSwgMCwgMjQpO1xuXHR9XG5cblx0Ly8gUmVtb3ZlIHRoZSBlbGVtZW50IG9uIHRoZSBuZXh0IHRpY2sgdG8gYnlwYXNzIHRoZSBuZWVkIHRvIGhpZGUgaXQgYmVoaW5kIGFub3RoZXIgZWxlbWVudFxuXHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRjYW52YXMucmVtb3ZlKCk7XG5cdH0pO1xuXG5cdHJldHVybiBjYW52YXM7XG59O1xuXG4vKmV4cG9ydHMuZGVzdHJveURyYWdJbWFnZSA9IGZ1bmN0aW9uKHByZWZpeCwgaGlkaW5nUGxhY2UpXG57XG5cdHZhciBjb250YWluZXIgPSAkKGhpZGluZ1BsYWNlKTtcblx0dmFyIGlkZW50aWZpZXJzID0gY3JlYXRlSWRlbnRpZmllcnMocHJlZml4KTtcblxuXHQkKFwiY2FudmFzI1wiICsgaWRlbnRpZmllcnMuY2FudmFzLCBjb250YWluZXIpLnJlbW92ZSgpO1xuXHQkKFwiZGl2I1wiICsgaWRlbnRpZmllcnMuY292ZXIsIGNvbnRhaW5lcikucmVtb3ZlKCk7XG59Ki9cblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzOyJdfQ==",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar settings = require(\"app-settings\");\n\nvar InfiniteCollection = require(\"../../../lib/infiniteCollection\");\n\nvar ResourceOpenedByListEmpty = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"list-empty\",\n\n\ttemplate: require(\"../../templates/console/resourceOpenedModal.nunj\").listEmpty\n});\n\nvar resourceOpenedByCollection = new InfiniteCollection([], {\n\tstate: {\n\t\tpageSize: 100\n\t},\n\turl: settings.urlRoot + \"/api/1.0/resources/openedBy/users\"\n});\n\nvar ResourceOpenedByListItem = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"list-item resource-opened-list-item\",\n\n\ttemplate: require(\"../../templates/console/resourceOpenedModal.nunj\").listItem\n});\n\nvar ResourceOpenedByList = Backbone.Marionette.CollectionView.extend({\n\ttagName: \"div\",\n\tclassName: \"resource-opened-list\",\n\tcollection: resourceOpenedByCollection.fullCollection,\n\tchildView: ResourceOpenedByListItem,\n\temptyView: ResourceOpenedByListEmpty\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"resource-opened-by-modal\",\n\n\ttemplate: require(\"../../templates/console/resourceOpenedModal.nunj\").content,\n\n\tui: {\n\t\tbox: \"select\",\n\t\tclearSearch: \".input-overlay\",\n\t\tstatusRegion: \".status-region\",\n\t\tlistContainer: \".list-container\",\n\t\tcloseBtn: \".close-btn\",\n\t\trefreshBtn: \".refresh-btn\",\n\t\tlist: \".resource-opened-list\"\n\t},\n\n\tregions: {\n\t\tstatus: \".status-region\",\n\t\tlist: {\n\t\t\tel: \".list-region\",\n\t\t\treplaceElement: true\n\t\t}\n\t},\n\n\tevents: {\n\t\t\"click @ui.closeBtn\": \"onClose\",\n\t\t\"click @ui.refreshBtn\": \"refreshList\",\n\t\t\"scroll @ui.list\": \"onScroll\"\n\t},\n\n\tcollectionEvents: {\n\t\tsync: \"fetchedData\",\n\t\trequest: \"requestedData\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\t_.bindAll(this);\n\t\tthis.host = options.host || \"#modals\";\n\t\tthis.resource = options.resource;\n\t\tthis.attachment = options.attachment;\n\n\t\tresourceOpenedByCollection.fullCollection.reset([]);\n\t\tresourceOpenedByCollection.queryParams.resource = options.resource;\n\t\tresourceOpenedByCollection.queryParams.attachment = options.attachment;\n\t\tresourceOpenedByCollection.queryParams.type = options.type;\n\t\tthis.openedUsernames = [];\n\n\t\tthis.bindEvents(resourceOpenedByCollection, this.collectionEvents);\n\n\t\tthis.onScroll = this.onScroll.bind(this);\n\t},\n\n\tonRender: function onRender() {\n\t\t// Render a background\n\t\t$(\".modal-element\", $(this.host)).removeClass(\"hide\");\n\t\t$(\"body\").addClass(\"hide-overflow\");\n\n\t\tthis.ui.listContainer.removeClass(\"hide\");\n\n\t\tthis.getRegion(\"list\").show(new ResourceOpenedByList());\n\n\t\tthis.ui.listContainer.parent().append($(\"<div class=\\\"fetch-overlay hide\\\">\\n\\t\\t\\t<span class=\\\"spinner-icon spinner-red\\\"/> Fetching data...</div>\"));\n\n\t\tresourceOpenedByCollection.getFirstPage();\n\t},\n\n\tshow: function show() {\n\t\t$(\".modal-container\", $(this.host)).append(this.render().el);\n\t},\n\n\trefreshList: function refreshList() {\n\t\tthis.fetchedOpenedUsernames = false;\n\t\tresourceOpenedByCollection.fullCollection.reset([]);\n\t\tresourceOpenedByCollection.getFirstPage();\n\t},\n\n\trequestedData: function requestedData() {\n\t\t$(\".eol\").remove();\n\t\t//$(\".resource-opened-overlay\").removeClass(\"hide\");\n\t\tthis.ui.listContainer.parent().find(\".fetch-overlay\").removeClass(\"hide\");\n\t},\n\n\tfetchedData: function fetchedData() {\n\t\t$(\".resource-opened-list\").on(\"scroll\", this.onScroll);\n\t\tthis.ui.statusRegion.addClass(\"hide\");\n\t\tif (this.fetchedOpenedUsernames) $(\".fetch-overlay\").addClass(\"hide\");\n\n\t\tvar hasNextPage = resourceOpenedByCollection.hasNextPage();\n\t\tif (this.ui.listContainer.height() > $(\".resource-opened-list\")[0].scrollHeight && !resourceOpenedByCollection.get(\"fetching\") && hasNextPage) {\n\t\t\t// If we can't scroll then fill up the list\n\t\t\tresourceOpenedByCollection.getNextPage();\n\t\t}\n\n\t\tif (!hasNextPage) {\n\t\t\t// Add an element to indicate we're at the end of the content\n\t\t\t$(\".resource-opened-list\").append($(\"<div class='eol'>No further content to show</div>\"));\n\t\t}\n\n\t\tthis.fetchOpenedUsernames();\n\t},\n\n\tonScroll: _.throttle(function (evt) {\n\t\t/* eslint-disable no-invalid-this */\n\n\t\tvar scrollPos = evt.currentTarget.scrollTop + $(\".resource-opened-list\").height();\n\t\tvar height = evt.currentTarget.scrollHeight;\n\n\t\tif (scrollPos / height > 0.9 && !resourceOpenedByCollection.get(\"fetching\") && resourceOpenedByCollection.hasNextPage()) {\n\t\t\t// Show a little message so the user understands what's happening if we've hit max items\n\t\t\tresourceOpenedByCollection.getNextPage();\n\t\t}\n\n\t\t/* eslint-enable no-invalid-this */\n\t}, 25),\n\n\tfetchOpenedUsernames: function fetchOpenedUsernames() {\n\t\tif (!this.fetchedOpenedUsernames) {\n\t\t\t$.ajax({\n\t\t\t\turl: settings.urlRoot + \"/api/1.0/resources/openedBy?resource=\" + this.resource + \"&attachment=\" + this.attachment,\n\t\t\t\tsuccess: this.fetchOpenedUsernameSuccess.bind(this),\n\t\t\t\terror: function error(response) {\n\t\t\t\t\tconsole.error(response);\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.fetchedOpenedUsernames = true;\n\t\t}\n\n\t\tthis.updateOpenedStatus();\n\t},\n\n\tfetchOpenedUsernameSuccess: function fetchOpenedUsernameSuccess(response) {\n\t\t$(\".fetch-overlay\").addClass(\"hide\");\n\t\tthis.openedUsernames = response;\n\t\tthis.updateOpenedStatus();\n\t},\n\n\tupdateOpenedStatus: function updateOpenedStatus() {\n\t\t$(\".opened-status\").removeClass(\"opened\");\n\t\t_.each(this.openedUsernames, function (username) {\n\t\t\t$(\"[data-username=\\\"\" + username + \"\\\"]\").addClass(\"opened\");\n\t\t});\n\t},\n\n\tonClose: function onClose(evt) {\n\t\tevt.stopPropagation();\n\t\tthis.destroy();\n\t\tthis.trigger(\"action\", \"close\");\n\t},\n\n\tonDestroy: function onDestroy() {\n\t\t// Clean up the background\n\t\t$(\".modal-element\", $(this.host)).addClass(\"hide\");\n\t\t$(\"body\").removeClass(\"hide-overflow\");\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJlc291cmNlT3BlbmVkTW9kYWwuanMiXSwibmFtZXMiOlsiJCIsInJlcXVpcmUiLCJfIiwiQmFja2JvbmUiLCJzZXR0aW5ncyIsIkluZmluaXRlQ29sbGVjdGlvbiIsIlJlc291cmNlT3BlbmVkQnlMaXN0RW1wdHkiLCJNYXJpb25ldHRlIiwiVmlldyIsImV4dGVuZCIsInRhZ05hbWUiLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsImxpc3RFbXB0eSIsInJlc291cmNlT3BlbmVkQnlDb2xsZWN0aW9uIiwic3RhdGUiLCJwYWdlU2l6ZSIsInVybCIsInVybFJvb3QiLCJSZXNvdXJjZU9wZW5lZEJ5TGlzdEl0ZW0iLCJsaXN0SXRlbSIsIlJlc291cmNlT3BlbmVkQnlMaXN0IiwiQ29sbGVjdGlvblZpZXciLCJjb2xsZWN0aW9uIiwiZnVsbENvbGxlY3Rpb24iLCJjaGlsZFZpZXciLCJlbXB0eVZpZXciLCJtb2R1bGUiLCJleHBvcnRzIiwiY29udGVudCIsInVpIiwiYm94IiwiY2xlYXJTZWFyY2giLCJzdGF0dXNSZWdpb24iLCJsaXN0Q29udGFpbmVyIiwiY2xvc2VCdG4iLCJyZWZyZXNoQnRuIiwibGlzdCIsInJlZ2lvbnMiLCJzdGF0dXMiLCJlbCIsInJlcGxhY2VFbGVtZW50IiwiZXZlbnRzIiwiY29sbGVjdGlvbkV2ZW50cyIsInN5bmMiLCJyZXF1ZXN0IiwiaW5pdGlhbGl6ZSIsIm9wdGlvbnMiLCJiaW5kQWxsIiwiaG9zdCIsInJlc291cmNlIiwiYXR0YWNobWVudCIsInJlc2V0IiwicXVlcnlQYXJhbXMiLCJ0eXBlIiwib3BlbmVkVXNlcm5hbWVzIiwiYmluZEV2ZW50cyIsIm9uU2Nyb2xsIiwiYmluZCIsIm9uUmVuZGVyIiwicmVtb3ZlQ2xhc3MiLCJhZGRDbGFzcyIsImdldFJlZ2lvbiIsInNob3ciLCJwYXJlbnQiLCJhcHBlbmQiLCJnZXRGaXJzdFBhZ2UiLCJyZW5kZXIiLCJyZWZyZXNoTGlzdCIsImZldGNoZWRPcGVuZWRVc2VybmFtZXMiLCJyZXF1ZXN0ZWREYXRhIiwicmVtb3ZlIiwiZmluZCIsImZldGNoZWREYXRhIiwib24iLCJoYXNOZXh0UGFnZSIsImhlaWdodCIsInNjcm9sbEhlaWdodCIsImdldCIsImdldE5leHRQYWdlIiwiZmV0Y2hPcGVuZWRVc2VybmFtZXMiLCJ0aHJvdHRsZSIsInNjcm9sbFBvcyIsImV2dCIsImN1cnJlbnRUYXJnZXQiLCJzY3JvbGxUb3AiLCJhamF4Iiwic3VjY2VzcyIsImZldGNoT3BlbmVkVXNlcm5hbWVTdWNjZXNzIiwiZXJyb3IiLCJjb25zb2xlIiwicmVzcG9uc2UiLCJ1cGRhdGVPcGVuZWRTdGF0dXMiLCJlYWNoIiwidXNlcm5hbWUiLCJvbkNsb3NlIiwic3RvcFByb3BhZ2F0aW9uIiwiZGVzdHJveSIsInRyaWdnZXIiLCJvbkRlc3Ryb3kiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsSUFBSUQsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNRSxXQUFXRixRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNRyxXQUFXSCxRQUFRLGNBQVIsQ0FBakI7O0FBRUEsSUFBTUkscUJBQXFCSixRQUFRLGlDQUFSLENBQTNCOztBQUVBLElBQU1LLDRCQUE0QkgsU0FBU0ksVUFBVCxDQUFvQkMsSUFBcEIsQ0FBeUJDLE1BQXpCLENBQWdDO0FBQ2pFQyxVQUFTLEtBRHdEO0FBRWpFQyxZQUFXLFlBRnNEOztBQUlqRUMsV0FBVVgsUUFBUSxrREFBUixFQUE0RFk7QUFKTCxDQUFoQyxDQUFsQzs7QUFPQSxJQUFNQyw2QkFBNkIsSUFBSVQsa0JBQUosQ0FBdUIsRUFBdkIsRUFBMkI7QUFDN0RVLFFBQU87QUFDTkMsWUFBVTtBQURKLEVBRHNEO0FBSTdEQyxNQUFLYixTQUFTYyxPQUFULEdBQW1CO0FBSnFDLENBQTNCLENBQW5DOztBQU9BLElBQU1DLDJCQUEyQmhCLFNBQVNJLFVBQVQsQ0FBb0JDLElBQXBCLENBQXlCQyxNQUF6QixDQUFnQztBQUNoRUMsVUFB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QixHQUFpQyxLQUFuQyxFQUEwQ2pDLFFBQTFDLENBQW1ELFFBQW5EO0FBQ0EsR0FGRDtBQUdBLEVBOUkrQzs7QUFnSmhEa0MsVUFBUyxpQkFBU1osR0FBVCxFQUFjO0FBQ3RCQSxNQUFJYSxlQUFKO0FBQ0EsT0FBS0MsT0FBTDtBQUNBLE9BQUtDLE9BQUwsQ0FBYSxRQUFiLEVBQXVCLE9BQXZCO0FBQ0EsRUFwSitDOztBQXNKaERDLFlBQVcscUJBQVc7QUFDckI7QUFDQW5HLElBQUUsZ0JBQUYsRUFBb0JBLEVBQUUsS0FBS2lELElBQVAsQ0FBcEIsRUFBa0NZLFFBQWxDLENBQTJDLE1BQTNDO0FBQ0E3RCxJQUFFLE1BQUYsRUFBVTRELFdBQVYsQ0FBc0IsZUFBdEI7QUFDQTtBQTFKK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoicmVzb3VyY2VPcGVuZWRNb2RhbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuXG5jb25zdCBJbmZpbml0ZUNvbGxlY3Rpb24gPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL2luZmluaXRlQ29sbGVjdGlvblwiKTtcblxuY29uc3QgUmVzb3VyY2VPcGVuZWRCeUxpc3RFbXB0eSA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwibGlzdC1lbXB0eVwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2NvbnNvbGUvcmVzb3VyY2VPcGVuZWRNb2RhbC5udW5qXCIpLmxpc3RFbXB0eSxcbn0pO1xuXG5jb25zdCByZXNvdXJjZU9wZW5lZEJ5Q29sbGVjdGlvbiA9IG5ldyBJbmZpbml0ZUNvbGxlY3Rpb24oW10sIHtcblx0c3RhdGU6IHtcblx0XHRwYWdlU2l6ZTogMTAwLFxuXHR9LFxuXHR1cmw6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3Jlc291cmNlcy9vcGVuZWRCeS91c2Vyc1wiLFxufSk7XG5cbmNvbnN0IFJlc291cmNlT3BlbmVkQnlMaXN0SXRlbSA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwibGlzdC1pdGVtIHJlc291cmNlLW9wZW5lZC1saXN0LWl0ZW1cIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9jb25zb2xlL3Jlc291cmNlT3BlbmVkTW9kYWwubnVualwiKS5saXN0SXRlbSxcbn0pO1xuXG5jb25zdCBSZXNvdXJjZU9wZW5lZEJ5TGlzdCA9IEJhY2tib25lLk1hcmlvbmV0dGUuQ29sbGVjdGlvblZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogXCJkaXZcIixcblx0Y2xhc3NOYW1lOiBcInJlc291cmNlLW9wZW5lZC1saXN0XCIsXG5cdGNvbGxlY3Rpb246IHJlc291cmNlT3BlbmVkQnlDb2xsZWN0aW9uLmZ1bGxDb2xsZWN0aW9uLFxuXHRjaGlsZFZpZXc6IFJlc291cmNlT3BlbmVkQnlMaXN0SXRlbSxcblx0ZW1wdHlWaWV3OiBSZXNvdXJjZU9wZW5lZEJ5TGlzdEVtcHR5LFxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJyZXNvdXJjZS1vcGVuZWQtYnktbW9kYWxcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9jb25zb2xlL3Jlc291cmNlT3BlbmVkTW9kYWwubnVualwiKS5jb250ZW50LFxuXG5cdHVpOiB7XG5cdFx0Ym94OiBcInNlbGVjdFwiLFxuXHRcdGNsZWFyU2VhcmNoOiBcIi5pbnB1dC1vdmVybGF5XCIsXG5cdFx0c3RhdHVzUmVnaW9uOiBcIi5zdGF0dXMtcmVnaW9uXCIsXG5cdFx0bGlzdENvbnRhaW5lcjogXCIubGlzdC1jb250YWluZXJcIixcblx0XHRjbG9zZUJ0bjogXCIuY2xvc2UtYnRuXCIsXG5cdFx0cmVmcmVzaEJ0bjogXCIucmVmcmVzaC1idG5cIixcblx0XHRsaXN0OiBcIi5yZXNvdXJjZS1vcGVuZWQtbGlzdFwiLFxuXHR9LFxuXG5cdHJlZ2lvbnM6IHtcblx0XHRzdGF0dXM6IFwiLnN0YXR1cy1yZWdpb25cIixcblx0XHRsaXN0OiB7XG5cdFx0XHRlbDogXCIubGlzdC1yZWdpb25cIixcblx0XHRcdHJlcGxhY2VFbGVtZW50OiB0cnVlLFxuXHRcdH0sXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkuY2xvc2VCdG5cIjogXCJvbkNsb3NlXCIsXG5cdFx0XCJjbGljayBAdWkucmVmcmVzaEJ0blwiOiBcInJlZnJlc2hMaXN0XCIsXG5cdFx0XCJzY3JvbGwgQHVpLmxpc3RcIjogXCJvblNjcm9sbFwiLFxuXHR9LFxuXG5cdGNvbGxlY3Rpb25FdmVudHM6IHtcblx0XHRzeW5jOiBcImZldGNoZWREYXRhXCIsXG5cdFx0cmVxdWVzdDogXCJyZXF1ZXN0ZWREYXRhXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdF8uYmluZEFsbCh0aGlzKTtcblx0XHR0aGlzLmhvc3QgPSBvcHRpb25zLmhvc3QgfHwgXCIjbW9kYWxzXCI7XG5cdFx0dGhpcy5yZXNvdXJjZSA9IG9wdGlvbnMucmVzb3VyY2U7XG5cdFx0dGhpcy5hdHRhY2htZW50ID0gb3B0aW9ucy5hdHRhY2htZW50O1xuXG5cdFx0cmVzb3VyY2VPcGVuZWRCeUNvbGxlY3Rpb24uZnVsbENvbGxlY3Rpb24ucmVzZXQoW10pO1xuXHRcdHJlc291cmNlT3BlbmVkQnlDb2xsZWN0aW9uLnF1ZXJ5UGFyYW1zLnJlc291cmNlID0gb3B0aW9ucy5yZXNvdXJjZTtcblx0XHRyZXNvdXJjZU9wZW5lZEJ5Q29sbGVjdGlvbi5xdWVyeVBhcmFtcy5hdHRhY2htZW50ID0gb3B0aW9ucy5hdHRhY2htZW50O1xuXHRcdHJlc291cmNlT3BlbmVkQnlDb2xsZWN0aW9uLnF1ZXJ5UGFyYW1zLnR5cGUgPSBvcHRpb25zLnR5cGU7XG5cdFx0dGhpcy5vcGVuZWRVc2VybmFtZXMgPSBbXTtcblxuXHRcdHRoaXMuYmluZEV2ZW50cyhyZXNvdXJjZU9wZW5lZEJ5Q29sbGVjdGlvbiwgdGhpcy5jb2xsZWN0aW9uRXZlbnRzKTtcblxuXHRcdHRoaXMub25TY3JvbGwgPSB0aGlzLm9uU2Nyb2xsLmJpbmQodGhpcyk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIFJlbmRlciBhIGJhY2tncm91bmRcblx0XHQkKFwiLm1vZGFsLWVsZW1lbnRcIiwgJCh0aGlzLmhvc3QpKS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0JChcImJvZHlcIikuYWRkQ2xhc3MoXCJoaWRlLW92ZXJmbG93XCIpO1xuXG5cdFx0dGhpcy51aS5saXN0Q29udGFpbmVyLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblxuXHRcdHRoaXMuZ2V0UmVnaW9uKFwibGlzdFwiKS5zaG93KG5ldyBSZXNvdXJjZU9wZW5lZEJ5TGlzdCgpKTtcblxuXHRcdHRoaXMudWkubGlzdENvbnRhaW5lci5wYXJlbnQoKS5hcHBlbmQoJChgPGRpdiBjbGFzcz1cImZldGNoLW92ZXJsYXkgaGlkZVwiPlxuXHRcdFx0PHNwYW4gY2xhc3M9XCJzcGlubmVyLWljb24gc3Bpbm5lci1yZWRcIi8+IEZldGNoaW5nIGRhdGEuLi48L2Rpdj5gKSk7XG5cblx0XHRyZXNvdXJjZU9wZW5lZEJ5Q29sbGVjdGlvbi5nZXRGaXJzdFBhZ2UoKTtcblx0fSxcblxuXHRzaG93OiBmdW5jdGlvbigpIHtcblx0XHQkKFwiLm1vZGFsLWNvbnRhaW5lclwiLCAkKHRoaXMuaG9zdCkpLmFwcGVuZCh0aGlzLnJlbmRlcigpLmVsKTtcblx0fSxcblxuXHRyZWZyZXNoTGlzdDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5mZXRjaGVkT3BlbmVkVXNlcm5hbWVzID0gZmFsc2U7XG5cdFx0cmVzb3VyY2VPcGVuZWRCeUNvbGxlY3Rpb24uZnVsbENvbGxlY3Rpb24ucmVzZXQoW10pO1xuXHRcdHJlc291cmNlT3BlbmVkQnlDb2xsZWN0aW9uLmdldEZpcnN0UGFnZSgpO1xuXHR9LFxuXG5cdHJlcXVlc3RlZERhdGE6IGZ1bmN0aW9uKCkge1xuXHRcdCQoXCIuZW9sXCIpLnJlbW92ZSgpO1xuXHRcdC8vJChcIi5yZXNvdXJjZS1vcGVuZWQtb3ZlcmxheVwiKS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5saXN0Q29udGFpbmVyLnBhcmVudCgpLmZpbmQoXCIuZmV0Y2gtb3ZlcmxheVwiKS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0ZmV0Y2hlZERhdGE6IGZ1bmN0aW9uKCkge1xuXHRcdCQoXCIucmVzb3VyY2Utb3BlbmVkLWxpc3RcIikub24oXCJzY3JvbGxcIiwgdGhpcy5vblNjcm9sbCk7XG5cdFx0dGhpcy51aS5zdGF0dXNSZWdpb24uYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdGlmICh0aGlzLmZldGNoZWRPcGVuZWRVc2VybmFtZXMpXG5cdFx0XHQkKFwiLmZldGNoLW92ZXJsYXlcIikuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0Y29uc3QgaGFzTmV4dFBhZ2UgPSByZXNvdXJjZU9wZW5lZEJ5Q29sbGVjdGlvbi5oYXNOZXh0UGFnZSgpO1xuXHRcdGlmICh0aGlzLnVpLmxpc3RDb250YWluZXIuaGVpZ2h0KCkgPiAkKFwiLnJlc291cmNlLW9wZW5lZC1saXN0XCIpWzBdLnNjcm9sbEhlaWdodCAmJiAhcmVzb3VyY2VPcGVuZWRCeUNvbGxlY3Rpb24uZ2V0KFwiZmV0Y2hpbmdcIikgJiYgaGFzTmV4dFBhZ2UpIHtcblx0XHRcdC8vIElmIHdlIGNhbid0IHNjcm9sbCB0aGVuIGZpbGwgdXAgdGhlIGxpc3Rcblx0XHRcdHJlc291cmNlT3BlbmVkQnlDb2xsZWN0aW9uLmdldE5leHRQYWdlKCk7XG5cdFx0fVxuXG5cdFx0aWYgKCFoYXNOZXh0UGFnZSkge1xuXHRcdFx0Ly8gQWRkIGFuIGVsZW1lbnQgdG8gaW5kaWNhdGUgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgY29udGVudFxuXHRcdFx0JChcIi5yZXNvdXJjZS1vcGVuZWQtbGlzdFwiKS5hcHBlbmQoJChcIjxkaXYgY2xhc3M9J2VvbCc+Tm8gZnVydGhlciBjb250ZW50IHRvIHNob3c8L2Rpdj5cIikpO1xuXHRcdH1cblxuXHRcdHRoaXMuZmV0Y2hPcGVuZWRVc2VybmFtZXMoKTtcblx0fSxcblxuXHRvblNjcm9sbDogXy50aHJvdHRsZShldnQgPT4ge1xuXHRcdC8qIGVzbGludC1kaXNhYmxlIG5vLWludmFsaWQtdGhpcyAqL1xuXG5cdFx0Y29uc3Qgc2Nyb2xsUG9zID0gZXZ0LmN1cnJlbnRUYXJnZXQuc2Nyb2xsVG9wICsgJChcIi5yZXNvdXJjZS1vcGVuZWQtbGlzdFwiKS5oZWlnaHQoKTtcblx0XHRjb25zdCBoZWlnaHQgPSBldnQuY3VycmVudFRhcmdldC5zY3JvbGxIZWlnaHQ7XG5cblx0XHRpZiAoc2Nyb2xsUG9zIC8gaGVpZ2h0ID4gMC45ICYmICFyZXNvdXJjZU9wZW5lZEJ5Q29sbGVjdGlvbi5nZXQoXCJmZXRjaGluZ1wiKSAmJiByZXNvdXJjZU9wZW5lZEJ5Q29sbGVjdGlvbi5oYXNOZXh0UGFnZSgpKSB7XG5cdFx0XHQvLyBTaG93IGEgbGl0dGxlIG1lc3NhZ2Ugc28gdGhlIHVzZXIgdW5kZXJzdGFuZHMgd2hhdCdzIGhhcHBlbmluZyBpZiB3ZSd2ZSBoaXQgbWF4IGl0ZW1zXG5cdFx0XHRyZXNvdXJjZU9wZW5lZEJ5Q29sbGVjdGlvbi5nZXROZXh0UGFnZSgpO1xuXHRcdH1cblxuXHRcdC8qIGVzbGludC1lbmFibGUgbm8taW52YWxpZC10aGlzICovXG5cdH0sIDI1KSxcblxuXHRmZXRjaE9wZW5lZFVzZXJuYW1lczogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLmZldGNoZWRPcGVuZWRVc2VybmFtZXMpIHtcblx0XHRcdCQuYWpheCh7XG5cdFx0XHRcdHVybDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvcmVzb3VyY2VzL29wZW5lZEJ5P3Jlc291cmNlPVwiICsgdGhpcy5yZXNvdXJjZSArIFwiJmF0dGFjaG1lbnQ9XCIgKyB0aGlzLmF0dGFjaG1lbnQsXG5cdFx0XHRcdHN1Y2Nlc3M6IHRoaXMuZmV0Y2hPcGVuZWRVc2VybmFtZVN1Y2Nlc3MuYmluZCh0aGlzKSxcblx0XHRcdFx0ZXJyb3I6IHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKHJlc3BvbnNlKTtcblx0XHRcdFx0fSxcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy5mZXRjaGVkT3BlbmVkVXNlcm5hbWVzID0gdHJ1ZTtcblx0XHR9XG5cblx0XHR0aGlzLnVwZGF0ZU9wZW5lZFN0YXR1cygpO1xuXHR9LFxuXG5cdGZldGNoT3BlbmVkVXNlcm5hbWVTdWNjZXNzOiBmdW5jdGlvbihyZXNwb25zZSkge1xuXHRcdCQoXCIuZmV0Y2gtb3ZlcmxheVwiKS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy5vcGVuZWRVc2VybmFtZXMgPSByZXNwb25zZTtcblx0XHR0aGlzLnVwZGF0ZU9wZW5lZFN0YXR1cygpO1xuXHR9LFxuXG5cdHVwZGF0ZU9wZW5lZFN0YXR1czogZnVuY3Rpb24oKSB7XG5cdFx0JChcIi5vcGVuZWQtc3RhdHVzXCIpLnJlbW92ZUNsYXNzKFwib3BlbmVkXCIpO1xuXHRcdF8uZWFjaCh0aGlzLm9wZW5lZFVzZXJuYW1lcywgdXNlcm5hbWUgPT4ge1xuXHRcdFx0JChcIltkYXRhLXVzZXJuYW1lPVxcXCJcIiArIHVzZXJuYW1lICsgXCJcXFwiXVwiKS5hZGRDbGFzcyhcIm9wZW5lZFwiKTtcblx0XHR9KTtcblx0fSxcblxuXHRvbkNsb3NlOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0dGhpcy5kZXN0cm95KCk7XG5cdFx0dGhpcy50cmlnZ2VyKFwiYWN0aW9uXCIsIFwiY2xvc2VcIik7XG5cdH0sXG5cblx0b25EZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHQvLyBDbGVhbiB1cCB0aGUgYmFja2dyb3VuZFxuXHRcdCQoXCIubW9kYWwtZWxlbWVudFwiLCAkKHRoaXMuaG9zdCkpLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHQkKFwiYm9keVwiKS5yZW1vdmVDbGFzcyhcImhpZGUtb3ZlcmZsb3dcIik7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar _ = require(\"lodash\");\nvar $ = require(\"jquery\");\nvar moment = require(\"moment\");\n\nvar settings = require(\"app-settings\");\nvar App = require(\"../../../index\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar ServerFilterManager = require(\"../../../lib/serverFilterManager\");\nvar SmallModal = require(\"../../../lib/smallModal\");\nvar ResourceIcons = require(\"./resourceIcons\");\nvar ResourceModal = require(\"../../../lib/resourceModal\");\nvar Resource = require(\"../../../content/models/manager/resourceModel\");\nvar AssessmentModal = require(\"../../../lib/assessmentModal\");\nvar Assessment = require(\"../../../lib/assessmentModel\");\nvar InfiniteCollection = require(\"../../../lib/infiniteCollection\");\nvar eventBus = require(\"./eventBus\");\nvar LightBox = require(\"../../../lib/lightBox\");\nvar FlashcardPreview = require(\"../../../lib/flashcardPreview\");\n\nvar PageSize = 30;\nvar draggingAllowed = false;\n\nvar EmptyView = Backbone.Marionette.View.extend({\n\ttemplate: require(\"../../templates/console/resourceSidebar.nunj\").empty\n});\n\nvar iCollection = new InfiniteCollection([], {\n\tstate: {\n\t\tpageSize: PageSize\n\t},\n\tqueryParams: {\n\t\tpaged: true\n\t},\n\n\turl: settings.urlRoot + \"/acacia/resources\",\n\temptyView: EmptyView,\n\n\tmodel: function model(attributes, options) {\n\t\tvar model = null;\n\n\t\tif (attributes.category && attributes.category === \"assessment\") model = new Assessment(attributes, options);else model = new Resource(attributes, options);\n\n\t\treturn model;\n\t},\n\n\tmodelId: function modelId(attributes) {\n\t\treturn attributes[this.model.prototype.idAttribute || \"_id\"];\n\t}\n});\n\nvar ResourceUsageFinderView = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"finder hide\",\n\n\ttemplate: require(\"../../templates/console/resourceSidebar.nunj\").finder,\n\n\tui: {\n\t\tprevious: \".prev\",\n\t\tnext: \".next\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.previous\": \"onClickPrevious\",\n\t\t\"click @ui.next\": \"onClickNext\"\n\t},\n\n\tonClickPrevious: function onClickPrevious(event) {\n\t\tevent.stopPropagation();\n\n\t\teventBus.trigger(\"attachment:previous\", this.model.get(\"_id\"));\n\t},\n\n\tonClickNext: function onClickNext(event) {\n\t\tevent.stopPropagation();\n\n\t\teventBus.trigger(\"attachment:next\", this.model.get(\"_id\"));\n\t},\n\n\tshow: function show() {\n\t\tthis.$el.removeClass(\"hide\");\n\t},\n\n\thide: function hide() {\n\t\tthis.$el.addClass(\"hide\");\n\t}\n});\n\nvar ResourceSummary = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"summary\",\n\n\ttemplate: require(\"../../templates/console/resourceSidebar.nunj\").summary,\n\n\tui: {\n\t\tedit: \"span.edit\",\n\t\tdelete: \"span.delete\",\n\t\topen: \"span.open\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.edit\": \"edit\",\n\t\t\"click @ui.delete\": \"delete\",\n\t\t\"click @ui.open\": \"open\"\n\t},\n\n\tserializeData: function serializeData() {\n\t\treturn this.model.toJSON({ computed: true });\n\t},\n\n\tedit: function edit(evt) {\n\t\tevt.stopPropagation();\n\n\t\tvar modal = void 0;\n\n\t\tif (this.model.get(\"category\") === \"assessment\") modal = new AssessmentModal({ model: this.model });else modal = new ResourceModal({ model: this.model });\n\n\t\tmodal.show({\n\t\t\tupdate: function update(result) {\n\t\t\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\t\t\tcontent: \"Item \" + result.model.get(\"title\") + \" successfully updated\"\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t},\n\n\tdelete: function _delete(evt) {\n\t\tvar _this = this;\n\n\t\tevt.stopPropagation();\n\n\t\tthis.delModal = new SmallModal({\n\t\t\tpersist: true,\n\t\t\twarning: true,\n\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Delete Item: \" + this.model.get(\"title\").replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t}),\n\t\t\tbody: \"<p>Are you sure you want to delete this item?</p><p>It will not be removed from books and \" + _.toLower(settings.learningPathsPluralCustomName) + \"; it will just become unusable going forward.</p><p>You can choose to remove it from your books and \" + _.toLower(settings.learningPathsPluralCustomName) + \" by clicking the option below.<p><p><label><input type='checkbox' value='1'>\\n\\t\\t\\t\\tYes, also remove all instances of this item from my books and \" + _.toLower(settings.learningPathsPluralCustomName) + \"</label></p>\"\n\t\t});\n\t\tthis.delModal.on(\"button:ok\", function () {\n\t\t\t_this.model.andAttachments = $(\"input\", _this.delModal.el).prop(\"checked\");\n\t\t\t_this.model.destroy({\n\t\t\t\twait: true,\n\t\t\t\tdata: {\n\t\t\t\t\tandAttachments: $(\"input\", _this.delModal.el).prop(\"checked\")\n\t\t\t\t},\n\t\t\t\tsuccess: _this.deletionSuccess.bind(_this),\n\t\t\t\terror: _this.deletionError.bind(_this)\n\t\t\t});\n\t\t});\n\n\t\tthis.delModal.show();\n\t},\n\n\topen: function open(evt) {\n\t\tevt.stopPropagation();\n\n\t\tswitch (this.model.get(\"category\")) {\n\t\t\tcase \"text\":\n\t\t\tcase \"onenote\":\n\t\t\tcase \"googledrive\":\n\t\t\tcase \"url\":\n\t\t\t\t{\n\t\t\t\t\tvar text = \"\";\n\t\t\t\t\tif (this.model.has(\"text\")) text = this.model.get(\"text\").replace(/\\n/g, \"<br/>\");else text = \"<a target='_blank' href=\\\"\" + this.model.get(\"url\") + \"\\\">\" + this.model.get(\"url\") + \"</a>\";\n\n\t\t\t\t\tvar confirm = new SmallModal({\n\t\t\t\t\t\tcustomOK: \"Close\",\n\t\t\t\t\t\thideButtons: [\"cancel\"],\n\t\t\t\t\t\tbody: text,\n\t\t\t\t\t\ttitle: \"Viewing Resource: \" + this.model.get(\"title\").replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t\t\t\t})\n\t\t\t\t\t});\n\t\t\t\t\tconfirm.show();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\tcase \"image\":\n\t\t\t\tnew LightBox({\n\t\t\t\t\thost: $(\"#link-resources\"),\n\t\t\t\t\timage: settings.urlRoot + \"/api/1.0/resources/\" + this.model.id + \"/data\"\n\t\t\t\t}).show();\n\t\t\t\tbreak;\n\n\t\t\tcase \"assessment\":\n\t\t\t\tnew AssessmentModal({\n\t\t\t\t\tmodel: new Assessment(this.model.toJSON()),\n\t\t\t\t\tpreviewMode: true,\n\t\t\t\t\trestart: true\n\t\t\t\t}).show({});\n\t\t\t\tbreak;\n\n\t\t\tcase \"flashcarddeck\":\n\t\t\t\tnew FlashcardPreview({\n\t\t\t\t\tmodel: this.model\n\t\t\t\t}).show();\n\t\t\t\tbreak;\n\n\t\t\tcase \"video\":\n\t\t\tcase \"pdf\":\n\t\t\tcase \"excel\":\n\t\t\tcase \"word\":\n\t\t\tcase \"powerpoint\":\n\t\t\t\twindow.open(settings.urlRoot + \"/api/1.0/resources/\" + this.model.id + \"/data\");\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"Unknown category\");\n\t\t}\n\t},\n\n\tdeletionSuccess: function deletionSuccess(model, response) {\n\t\tthis.delModal.destroy();\n\t\tradio.trigger(App.Events.Commands.Toast, { content: \"Item '\" + model.get(\"title\") + \"' successfully deleted\", icon: \"fa-trash-alt\", iconColour: \"red\" });\n\t\teventBus.trigger(\"resource:deleted\", response);\n\t},\n\n\tdeletionError: function deletionError(model, xhr) {\n\t\tvar answer = App.parseResponse(xhr);\n\t\tthis.delModal.showError(\"Deletion failed: \" + (answer.detail || answer.info));\n\t}\n});\n\nvar ResourceItem = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"list-item\",\n\n\ttemplate: require(\"../../templates/console/resourceSidebar.nunj\").item,\n\n\t//attributes: {\n\t//\tdraggable: \"true\",\n\t//},\n\n\tmodelEvents: {\n\t\t\"change:usage\": \"changeUsage\",\n\t\t\"change:title\": \"render\"\n\t},\n\n\tregions: {\n\t\tlabel: \"div.label-region\"\n\t},\n\n\tui: {\n\t\tlabelContainer: \"div.label-container\",\n\t\tbadgeContainer: \"div.badge-container\",\n\t\tbadge: \"span.badge\",\n\t\tsummary: \"div.summary-region\"\n\t},\n\n\tevents: {\n\t\tclick: \"onClick\",\n\t\t\"click @ui.badge\": \"badgeClick\",\n\t\t\"click @ui.summary\": \"toggleSummary\",\n\t\t\"mousedown @ui.labelContainer\": \"onMouseDown\"\n\t},\n\n\tattachmentEvents: {\n\t\t\"attachment:first\": \"attachmentNavigate\",\n\t\t\"attachment:next\": \"attachmentNavigate\",\n\t\t\"attachment:previous\": \"attachmentNavigate\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tvar _this2 = this;\n\n\t\tthis.summaryVisible = false;\n\t\tthis.changeUsageStatus = true;\n\t\tthis.isIE = _.isFunction(document.createElement(\"span\").dragDrop);\n\n\t\t// Listen for click events from the resource label and toggle the summary display accordingly\n\t\tthis.listenTo(eventBus, \"summary:toggle\", function (id) {\n\t\t\tif (_this2.model.get(\"_id\") === id) _this2.toggleSummary();else _this2.hideSummary();\n\t\t});\n\n\t\tthis.listenTo(eventBus, \"summary:show\", function (id) {\n\t\t\tif (_this2.model.get(\"_id\") === id) _this2.showSummary();else _this2.hideSummary();\n\t\t});\n\n\t\tthis.listenTo(eventBus, eventBus.Events.AttachmentAdded, this.onAttachmentAdded.bind(this));\n\t\tthis.listenTo(eventBus, eventBus.Events.AttachmentRemoved, this.onAttachmentRemoved.bind(this));\n\n\t\tBackbone.Marionette.bindEvents(this, eventBus, this.attachmentEvents);\n\t},\n\n\tserializeData: function serializeData() {\n\t\treturn this.model.toJSON({ computed: true });\n\t},\n\n\tonClick: function onClick() {\n\t\t// Signal the container to expand itself\n\t\teventBus.trigger(\"summary:toggle\", this.model.get(\"_id\"));\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.UsageFinderView = new ResourceUsageFinderView({ model: this.model });\n\t\tthis.ui.badgeContainer.append(this.UsageFinderView.render().el);\n\t},\n\n\tonMouseDown: function onMouseDown(event) {\n\t\tvar _this3 = this;\n\n\t\t//Only start the drag process if the mouse moves after a certain duration,\n\t\t//this is to cater for small mouse movements during a regular click\n\t\tvar mouseDownStart = moment();\n\t\tvar dragStarted = false;\n\t\tvar draggingElement = void 0,\n\t\t    data = void 0;\n\n\t\t// Prevent text selection while dragging;\n\t\t$(\"body\").on(\"selectstart.draggingResource\", function (e) {\n\t\t\treturn e.preventDefault();\n\t\t});\n\n\t\t$(\"body\").on(\"mousemove.dragStarted\", function () {\n\t\t\tif (moment().diff(mouseDownStart, \"ms\") <= 130) return;\n\n\t\t\t$(\"body\").off(\"mousemove.dragStarted\");\n\t\t\tdragStarted = true;\n\t\t\tif (!draggingAllowed) {\n\t\t\t\tif (iCollection.queryParams.type !== \"lp\") {\n\t\t\t\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\t\t\t\tcontent: \"Dragging into this book is disabled because there are no groups allowed for \" + App.currentYear(),\n\t\t\t\t\t\ticon: \"fa-times\",\n\t\t\t\t\t\ticonColour: \"red\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tevent.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data to be transferred by the drag operation\n\t\t\tdata = {\n\t\t\t\ttype: \"resource\",\n\t\t\t\tresourceModel: _this3.model.toJSON({ computed: true })\n\t\t\t};\n\n\t\t\tvar DraggingElement = Backbone.Marionette.View.extend({\n\t\t\t\tclassName: \"lp-dragging-element\",\n\t\t\t\ttemplate: require(\"../../templates/console/learningPathNode.nunj\").draggingElement\n\t\t\t});\n\n\t\t\tvar resourceData = {\n\t\t\t\ttitle: data.resourceModel.title,\n\t\t\t\tcategory: \"attachment\",\n\t\t\t\tresourceType: _.replace(data.resourceModel.img, \"annotation_\", \"\")\n\t\t\t};\n\n\t\t\tvar draggingNode = new DraggingElement({\n\t\t\t\tmodel: new Backbone.Model(resourceData)\n\t\t\t}).render();\n\t\t\tdraggingElement = draggingNode.$el[0];\n\n\t\t\tdraggingElement.style.position = \"absolute\";\n\t\t\tdraggingElement.style.zIndex = 1000;\n\n\t\t\t$(\"body\").append(draggingElement);\n\n\t\t\tvar moveAt = function moveAt(e) {\n\t\t\t\tdraggingElement.style.left = e.originalEvent.pageX + \"px\";\n\t\t\t\tdraggingElement.style.top = e.originalEvent.pageY + \"px\";\n\t\t\t};\n\n\t\t\tmoveAt(event);\n\n\t\t\t$(\"#book-overlay, #lp-overlay\").on(\"mousemove.moveDraggingElement\", moveAt);\n\n\t\t\t// Fade the resource selector\n\t\t\teventBus.trigger(eventBus.Events.ResourceDragStart, data);\n\t\t});\n\n\t\t// Handle the drop\n\t\t$(\"body\").on(\"mouseup.resourceDragEnded\", function (e) {\n\t\t\t$(\"body\").off(\"selectstart.draggingResource\");\n\n\t\t\tif (dragStarted) {\n\t\t\t\t$(\"#book-overlay, #lp-overlay\").off(\"mousemove.moveDraggingElement\");\n\t\t\t\t$(\"span.item-icon\", _this3.el).removeClass(\"item-drag-icon\");\n\t\t\t\tif (draggingElement) draggingElement.parentNode.removeChild(draggingElement);\n\t\t\t\teventBus.trigger(eventBus.Events.ResourceDragEnd);\n\t\t\t\teventBus.trigger(eventBus.Events.ResourceDragDrop, e, data);\n\t\t\t\t$(\"body\").off(\"mouseup.resourceDragEnded\");\n\t\t\t} else {\n\t\t\t\t$(\"body\").off(\"mousemove.dragStarted\");\n\t\t\t}\n\t\t});\n\t},\n\n\tchangeUsage: function changeUsage() {\n\t\tif (!this.changeUsageStatus) {\n\t\t\tthis.changeUsageStatus = true;\n\t\t\treturn;\n\t\t}\n\n\t\tif (parseInt(this.model.get(\"usage\"), 10) > 0) {\n\t\t\tthis.ui.badge.text(this.model.get(\"usage\")).removeClass(\"hide\");\n\t\t\tif (this.model.get(\"usage\") === 1) this.hideAttachmentFinder();\n\t\t} else {\n\t\t\tthis.ui.badge.text(\"\").addClass(\"hide\");\n\t\t\tthis.hideAttachmentFinder();\n\t\t}\n\t},\n\n\tbadgeClick: function badgeClick(event) {\n\t\tevent.stopPropagation();\n\n\t\tif (parseInt(this.ui.badge.text(), 10) === 1) eventBus.trigger(\"attachment:first\", this.model.get(\"_id\"));else this.toggleAttachmentFinder();\n\t},\n\n\ttoggleSummary: function toggleSummary() {\n\t\t// Display the description panel\n\t\tif (this.summaryVisible) this.hideSummary();else this.showSummary();\n\t},\n\n\tshowSummary: function showSummary() {\n\t\tthis.summary = new ResourceSummary({ model: this.model });\n\n\t\tthis.$el.append(this.summary.render().el);\n\n\t\tthis.summaryVisible = true;\n\t},\n\n\thideSummary: function hideSummary() {\n\t\tif (this.summary) {\n\t\t\tthis.summary.destroy();\n\t\t\tthis.summary = null;\n\t\t}\n\t\tthis.summaryVisible = false;\n\t},\n\n\ttoggleAttachmentFinder: function toggleAttachmentFinder() {\n\t\tif (this.AttachmentFinderVisible) {\n\t\t\tthis.hideAttachmentFinder();\n\t\t\teventBus.trigger(\"attachment:clear\");\n\t\t} else {\n\t\t\tthis.showAttachmentFinder();\n\t\t}\n\t},\n\n\tshowAttachmentFinder: function showAttachmentFinder() {\n\t\tif (iCollection.queryParams.type !== \"lp\") {\n\t\t\tthis.UsageFinderView.show();\n\t\t\tthis.AttachmentFinderVisible = true;\n\t\t}\n\t},\n\n\thideAttachmentFinder: function hideAttachmentFinder() {\n\t\tthis.UsageFinderView.hide();\n\t\tthis.AttachmentFinderVisible = false;\n\t},\n\n\tattachmentNavigate: function attachmentNavigate() {\n\t\tthis.changeUsageStatus = false;\n\t},\n\n\tonAttachmentAdded: function onAttachmentAdded(model) {\n\t\tif (model.get(\"resource\") === this.model.get(\"_id\")) {\n\t\t\tif (this.model.has(\"usage\")) this.model.set(\"usage\", (parseInt(this.model.get(\"usage\"), 0) || 0) + 1);else this.model.set(\"usage\", 1);\n\t\t}\n\t},\n\n\tonAttachmentRemoved: function onAttachmentRemoved(model) {\n\t\tif (model.get(\"resource\") === this.model.get(\"_id\")) this.model.set(\"usage\", Math.max(0, (parseInt(this.model.get(\"usage\"), 0) || 0) - 1));\n\t}\n});\n\n// ----------------------------------------------------------------------------\n// ----------------------------------------------------------------------------\n\nvar ResourceList = Backbone.Marionette.CollectionView.extend({\n\ttagName: \"div\",\n\tclassName: \"list-container\",\n\tcollection: iCollection.fullCollection,\n\tchildView: ResourceItem\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"container hide\",\n\tid: \"resource-selector\",\n\n\ttemplate: require(\"../../templates/console/resourceSidebar.nunj\").regions,\n\n\tregions: {\n\t\tlistRegion: {\n\t\t\tel: \".list-region\"\n\t\t\t// /replaceElement: true,\n\t\t}\n\t},\n\n\tui: {\n\t\t//\t\tresourceContainer: \".resource-container\",\n\t\tstatusContainer: \".status-container\",\n\t\ttopRegion: \".top-region\",\n\t\tfilterArea: \".filter-region\",\n\t\tclearFiltersButton: \".clear-filters\",\n\t\tcloseButton: \".close\",\n\t\tlistRegion: \".list-region\",\n\t\tlistContainer: \".list-container\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.clearFiltersButton\": \"onClearFiltersButtonClick\",\n\t\t\"click @ui.closeButton\": \"close\",\n\t\tclick: \"onClick\"\n\t},\n\n\tcollectionEvents: {\n\t\tsync: \"fetchedResources\",\n\t\trequest: \"requestedResources\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tResourceIcons.preloadImages();\n\n\t\tiCollection.fullCollection.reset([]);\n\n\t\tthis.bindEvents(iCollection, this.collectionEvents);\n\n\t\tthis.onScrollList = this.onScrollList.bind(this);\n\n\t\t// Fade and increase the resource selector when resource dragging starts and ends, respectively\n\t\tthis.listenTo(eventBus, eventBus.Events.ResourceDragStart, this.fade.bind(this));\n\t\tthis.listenTo(eventBus, eventBus.Events.ResourceDragEnd, this.increase.bind(this));\n\n\t\tthis.listenTo(eventBus, eventBus.Events.DisableResourceDragging, this.disableDrag.bind(this));\n\t\tthis.listenTo(eventBus, eventBus.Events.EnableResourceDragging, this.enableDrag.bind(this));\n\t\tthis.listenTo(eventBus, eventBus.Events.UpdateDraggingStatus, this.updateDrag.bind(this));\n\n\t\tthis.listenTo(App, App.Events.ResourceCreated, this.addResource.bind(this));\n\t\tthis.listenTo(eventBus, eventBus.Events.FindResource, this.onFindResource.bind(this));\n\n\t\tthis.listenTo(eventBus, eventBus.Events.ViewChanged, this.viewChanged.bind(this));\n\n\t\tthis.initialFetch = true;\n\t},\n\n\trequestedResources: function requestedResources() {\n\t\t$(\".eol\").remove();\n\t\t$(\".resources-overlay\").removeClass(\"hide\");\n\t},\n\n\tfetchedResources: function fetchedResources() {\n\t\tif (this.specificResource) {\n\t\t\tthis.fetchSpecificResource();\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.initialFetch) {\n\t\t\tthis.filter.updateServerFilters();\n\t\t\tthis.initialFetch = false;\n\t\t\treturn;\n\t\t}\n\n\t\t$(\".resources-overlay\").addClass(\"hide\");\n\n\t\tif (this.ui.listRegion.height() > $(\".list-container\").height() && !iCollection.get(\"fetching\") && iCollection.hasNextPage()) {\n\t\t\t// If we can't scroll then fill up the list\n\t\t\tiCollection.getNextPage();\n\t\t} else if (!iCollection.hasNextPage()) {\n\t\t\t// Add an element to indicate we're at the end of the content\n\t\t\t$(\".eol\").remove();\n\t\t\t$(\".list-container\").append($(\"<div class='eol'>No further content to show matching those filters</div>\"));\n\t\t}\n\t},\n\n\taddResource: function addResource(model) {\n\t\t// Add it at the top for convenient immediate access\n\t\tiCollection.add(model, { at: 0 });\n\t},\n\n\tonRender: function onRender() {\n\t\tvar resources = new ResourceList();\n\n\t\tthis.showChildView(\"listRegion\", resources);\n\n\t\t$(\".list-container\").append($(\"<div class=\\\"resources-overlay hide\\\">\\n\\t\\t\\t<span class=\\\"spinner-icon spinner-red\\\"/> Fetching data...</div>\"));\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar languageFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"languageFilter\",\n\t\t\tlabel: \"Language\",\n\t\t\tcategories: [{ items: settings.languageList }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar subjectFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"subjectFilter\",\n\t\t\tlabel: \"Subject\",\n\t\t\tserver: {\n\t\t\t\tkey: \"subject_id\",\n\t\t\t\tvalue: \"subject\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/subjects\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\n\t\tvar gradeFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"gradeFilter\",\n\t\t\tlabel: \"Year of Study\",\n\t\t\tserver: true,\n\t\t\tcategories: _.map(settings.gradeList, function (val, key) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: key,\n\t\t\t\t\titems: _.reduce(val.sort(function (a, b) {\n\t\t\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t\t\t}), function (sum, num) {\n\t\t\t\t\t\tsum.push({ name: num.value, label: num.name });\n\t\t\t\t\t\treturn sum;\n\t\t\t\t\t}, [])\n\t\t\t\t};\n\t\t\t})\n\t\t};\n\n\t\tvar categories = [{ name: \"assessment\", label: \"Assessment\", image: settings.urlRoot + \"/images/content/annotation_interactive.png\" }, { name: \"audio\", label: \"Audio\", image: settings.urlRoot + \"/images/content/annotation_mp3.png\" }, { name: \"flashcarddeck\", label: \"Flashcard Deck\", image: settings.urlRoot + \"/images/content/annotation_flashcards.png\" }, { name: \"image\", label: \"Image\", image: settings.urlRoot + \"/images/content/annotation_graphic.png\" }, { name: \"pdf\", label: \"PDF\", image: settings.urlRoot + \"/images/content/annotation_pdf.png\" }, { name: \"text\", label: \"Text\", image: settings.urlRoot + \"/images/content/annotation_text.png\" }, { name: \"url\", label: \"URL\", image: settings.urlRoot + \"/images/content/annotation_url.png\" }, { name: \"video\", label: \"Video\", image: settings.urlRoot + \"/images/content/annotation_video.png\" }];\n\n\t\tif (settings.officeContent) {\n\t\t\tcategories.push({ name: \"excel\", label: \"MS Excel\", image: settings.urlRoot + \"/images/content/annotation_excel.png\" }, { name: \"powerpoint\", label: \"MS PowerPoint\", image: settings.urlRoot + \"/images/content/annotation_powerpoint.png\" }, { name: \"word\", label: \"MS Word\", image: settings.urlRoot + \"/images/content/annotation_word.png\" });\n\t\t}\n\n\t\tcategories = _.sortBy(categories, function (c) {\n\t\t\treturn c.label;\n\t\t});\n\n\t\tvar typeFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"typeFilter\",\n\t\t\tlabel: \"Type\",\n\t\t\tcategories: [{ items: categories }],\n\t\t\tserver: true,\n\t\t\ticons: true\n\t\t};\n\n\t\tvar currentlyUsed = {\n\t\t\ttype: \"toggle\",\n\t\t\tname: \"currentUse\",\n\t\t\tlabel: \"Currently Used\",\n\t\t\tinitialValue: function initialValue() {\n\t\t\t\treturn [true];\n\t\t\t},\n\t\t\tserver: true\n\t\t};\n\n\t\tvar ownContent = {\n\t\t\ttype: \"toggle\",\n\t\t\tname: \"ownContent\",\n\t\t\tlabel: \"Only my content\",\n\t\t\tinitialValue: function initialValue() {\n\t\t\t\treturn [true];\n\t\t\t},\n\t\t\tserver: true\n\t\t};\n\n\t\tvar currentYear = {\n\t\t\ttype: \"toggle\",\n\t\t\tname: \"currentYear\",\n\t\t\tlabel: \"Current year's content\",\n\t\t\tinitialValue: function initialValue() {\n\t\t\t\treturn [true];\n\t\t\t},\n\t\t\tserver: true\n\t\t};\n\n\t\tvar filterList = [textFilter, languageFilter, subjectFilter, gradeFilter, typeFilter, ownContent, currentYear, currentlyUsed];\n\n\t\tthis.filter = new ServerFilterManager({\n\t\t\traw: iCollection,\n\t\t\tfilterContainer: this.ui.filterArea,\n\t\t\tfilters: filterList,\n\t\t\tdefaultFilters: [\"textFilter\", \"ownContent\", \"currentYear\"]\n\t\t});\n\n\t\tthis.ui.filterArea.prepend(this.filter.render().el);\n\n\t\tthis.ui.statusContainer.addClass(\"hide\");\n\t\tthis.ui.topRegion.removeClass(\"hide\");\n\t\tthis.ui.filterArea.removeClass(\"hide\");\n\t},\n\n\tclose: function close() {\n\t\tiCollection.queryParams.resourceFilter = null;\n\t\teventBus.trigger(eventBus.Events.CloseResources);\n\n\t\tif (this.FilterManager) this.FilterManager.hideAllFilterLists();\n\t},\n\n\tonClick: function onClick(event) {\n\t\t// Prevent click events from propagating out of the resource selector and closing the\n\t\t// resource selector\n\t\tevent.stopPropagation();\n\n\t\t// Close any open filters\n\t\tif (this.FilterManager) this.FilterManager.hideAllFilterLists();\n\t},\n\n\tshow: function show() {\n\t\tvar book = eventBus.request(eventBus.Events.GetCurrentBook);\n\t\tvar lp = eventBus.request(eventBus.Events.GetCurrentGroup);\n\n\t\tiCollection.queryParams.id = book.get(\"universal_id\") || lp.get(\"_id\");\n\t\tiCollection.queryParams.type = _.startsWith(iCollection.queryParams.id, \"book-\") ? \"book\" : \"lp\";\n\n\t\tiCollection.fullCollection.reset([]);\n\t\tthis.filter.updateServerFilters();\n\t\tthis.initialFetch = false;\n\n\t\tthis.$el.removeClass(\"hide\");\n\t\t$(\".list-region\").on(\"scroll\", this.onScrollList);\n\t},\n\n\thide: function hide() {\n\t\tthis.$el.addClass(\"hide\");\n\n\t\tif (this.FilterManager) this.FilterManager.hideAllFilterLists();\n\t},\n\n\tdisableDrag: function disableDrag() {\n\t\tdraggingAllowed = false;\n\t},\n\n\tenableDrag: function enableDrag() {\n\t\tdraggingAllowed = true;\n\t},\n\n\tviewChanged: function viewChanged(view) {\n\t\tif (view === \"books\" || view === \"learningPath\") this.filter.resetFilters();\n\t},\n\n\tupdateDrag: function updateDrag(status) {\n\t\tdraggingAllowed = status;\n\t},\n\n\t// The resource sidebar is shrunken to compensate for Chrome's need to have the source of\n\t// a drag operation present in the view port.\n\tfade: function fade() {\n\t\tthis.$el.css({ opacity: \"0\" });\n\n\t\t// Redirect all mouse events to the book overlay\n\t\t// so that they can actually do something\n\t\tthis.$el.on(\"mousemove.draggingResource mouseup.droppedResource\", function (evt) {\n\t\t\tif ($(\"#book-overlay\").length) $(\"#book-overlay\").trigger(evt);\n\n\t\t\tif ($(\"#lp-overlay\").length) $(\"#lp-overlay\").trigger(evt);\n\t\t});\n\n\t\tif (this.FilterManager) this.FilterManager.hideAllFilterLists();\n\t},\n\n\tincrease: function increase() {\n\t\tvar _this4 = this;\n\n\t\tsetTimeout(function () {\n\t\t\t_this4.$el.css({ opacity: \"1\" });\n\t\t}, 500);\n\t\tthis.$el.off(\"mousemove.draggingResource mouseup.droppedResource\");\n\t},\n\n\tonScrollList: _.throttle(function (evt) {\n\t\t/* eslint-disable no-invalid-this */\n\t\tvar scrollPos = evt.currentTarget.scrollTop + $(\".list-region\").height();\n\t\tvar height = evt.currentTarget.scrollHeight;\n\n\t\tif (scrollPos / height > 0.9 && !iCollection.get(\"fetching\") && iCollection.hasNextPage()) iCollection.getNextPage();\n\n\t\t/* eslint-enable no-invalid-this */\n\t}, 25),\n\n\tonClearFiltersButtonClick: function onClearFiltersButtonClick() {\n\t\tiCollection.queryParams.resourceFilter = null;\n\t\tthis.filter.resetFilters();\n\t\tthis.filter.updateServerFilters();\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(eventBus);\n\t\tthis.filter.destroy();\n\t},\n\n\tonFindResource: function onFindResource(resource) {\n\t\tthis.specificResource = resource.get(\"_id\");\n\t},\n\n\tfetchSpecificResource: function fetchSpecificResource() {\n\t\tiCollection.queryParams.resourceFilter = this.specificResource;\n\t\tiCollection.fullCollection.reset([]);\n\t\tthis.initialFetch = false;\n\t\tiCollection.getFirstPage();\n\t\tdelete this.specificResource;\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJlc291cmNlU2lkZWJhci5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCJfIiwiJCIsIm1vbWVudCIsInNldHRpbmdzIiwiQXBwIiwicmFkaW8iLCJSYWRpbyIsImNoYW5uZWwiLCJTZXJ2ZXJGaWx0ZXJNYW5hZ2VyIiwiU21hbGxNb2RhbCIsIlJlc291cmNlSWNvbnMiLCJSZXNvdXJjZU1vZGFsIiwiUmVzb3VyY2UiLCJBc3Nlc3NtZW50TW9kYWwiLCJBc3Nlc3NtZW50IiwiSW5maW5pdGVDb2xsZWN0aW9uIiwiZXZlbnRCdXMiLCJMaWdodEJveCIsIkZsYXNoY2FyZFByZXZpZXciLCJQYWdlU2l6ZSIsImRyYWdnaW5nQWxsb3dlZCIsIkVtcHR5VmlldyIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiZXh0ZW5kIiwidGVtcGxhdGUiLCJlbXB0eSIsImlDb2xsZWN0aW9uIiwic3RhdGUiLCJwYWdlU2l6ZSIsInF1ZXJ5UGFyYW1zIiwicGFnZWQiLCJ1cmwiLCJ1cmxSb290IiwiZW1wdHlWaWV3IiwibW9kZWwiLCJhdHRyaWJ1dGVzIiwib3B0aW9ucyIsImNhdGVnb3J5IiwibW9kZWxJZCIsInByb3RvdHlwZSIsImlkQXR0cmlidXRlIiwiUmVzb3VyY2VVc2FnZUZpbmRlclZpZXciLCJ0YWdOYW1lIiwiY2xhc3NOYW1lIiwiZmluZGVyIiwidWkiLCJwcmV2aW91cyIsIm5leHQiLCJldmVudHMiLCJvbkNsaWNrUHJldmlvdXMiLCJldmVudCIsInN0b3BQcm9wYWdhdGlvbiIsInRyaWdnZXIiLCJnZXQiLCJvbkNsaWNrTmV4dCIsInNob3ciLCIkZWwiLCJyZW1vdmVDbGFzcyIsImhpZGUiLCJhZGRDbGFzcyIsIlJlc291cmNlU3VtbWFyeSIsInN1bW1hcnkiLCJlZGl0IiwiZGVsZXRlIiwib3BlbiIsInNlcmlhbGl6ZURhdGEiLCJ0b0pTT04iLCJjb21wdXRlZCIsImV2dCIsIm1vZGFsIiwidXBkYXRlIiwiRXZlbnRzIiwiQ29tbWFuZHMiLCJUb2FzdCIsImNvbnRlbnQiLCJyZXN1bHQiLCJkZWxNb2RhbCIsInBlcnNpc3QiLCJ3YXJuaW5nIiwidGl0bGUiLCJyZXBsYWNlIiwieCIsImNoYXJDb2RlQXQiLCJib2R5IiwidG9Mb3dlciIsImxlYXJuaW5nUGF0aHNQbHVyYWxDdXN0b21OYW1lIiwib24iLCJhbmRBdHRhY2htZW50cyIsImVsIiwicHJvcCIsImRlc3Ryb3kiLCJ3YWl0IiwiZGF0YSIsInN1Y2Nlc3MiLCJkZWxldGlvblN1Y2Nlc3MiLCJiaW5kIiwiZXJyb3IiLCJkZWxldGlvbkVycm9yIiwidGV4dCIsImhhcyIsImNvbmZpcm0iLCJjdXN0b21PSyIsImhpZGVCdXR0b25zIiwiaG9zdCIsImltYWdlIiwiaWQiLCJwcmV2aWV3TW9kZSIsInJlc3RhcnQiLCJ3aW5kb3ciLCJFcnJvciIsInJlc3BvbnNlIiwiaWNvbiIsImljb25Db2xvdXIiLCJ4aHIiLCJhbnN3ZXIiLCJwYXJzZVJlc3BvbnNlIiwic2hvd0Vycm9yIiwiZGV0YWlsIiwiaW5mbyIsIlJlc291cmNlSXRlbSIsIml0ZW0iLCJtb2RlbEV2ZW50cyIsInJlZ2lvbnMiLCJsYWJlbCIsImxhYmVsQ29udGFpbmVyIiwiYmFkZ2VDb250YWluZXIiLCJiYWRnZSIsImNsaWNrIiwiYXR0YWNobWVudEV2ZW50cyIsImluaXRpYWxpemUiLCJzdW1tYXJ5VmlzaWJsZSIsImNoYW5nZVVzYWdlU3RhdHVzIiwiaXNJRSIsImlzRnVuY3Rpb24iLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJkcmFnRHJvcCIsImxpc3RlblRvIiwidG9nZ2xlU3VtbWFyeSIsImhpZGVTdW1tYXJ5Iiwic2hvd1N1bW1hcnkiLCJBdHRhY2htZW50QWRkZWQiLCJvbkF0dGFjaG1lbnRBZGRlZCIsIkF0dGFjaG1lbnRSZW1vdmVkIiwib25BdHRhY2htZW50UmVtb3ZlZCIsImJpbmRFdmVudHMiLCJvbkNsaWNrIiwib25SZW5kZXIiLCJVc2FnZUZpbmRlclZpZXciLCJhcHBlbmQiLCJyZW5kZXIiLCJvbk1vdXNlRG93biIsIm1vdXNlRG93blN0YXJ0IiwiZHJhZ1N0YXJ0ZWQiLCJkcmFnZ2luZ0VsZW1lbnQiLCJlIiwicHJldmVudERlZmF1bHQiLCJkaWZmIiwib2ZmIiwidHlwZSIsImN1cnJlbnRZZWFyIiwicmVzb3VyY2VNb2RlbCIsIkRyYWdnaW5nRWxlbWVudCIsInJlc291cmNlRGF0YSIsInJlc291cmNlVHlwZSIsImltZyIsImRyYWdnaW5nTm9kZSIsIk1vZGVsIiwic3R5bGUiLCJwb3NpdGlvbiIsInpJbmRleCIsIm1vdmVBdCIsImxlZnQiLCJvcmlnaW5hbEV2ZW50IiwicGFnZVgiLCJ0b3AiLCJwYWdlWSIsIlJlc291cmNlRHJhZ1N0YXJ0IiwicGFyZW50Tm9kZSIsInJlbW92ZUNoaWxkIiwiUmVzb3VyY2VEcmFnRW5kIiwiUmVzb3VyY2VEcmFnRHJvcCIsImNoYW5nZVVzYWdlIiwicGFyc2VJbnQiLCJoaWRlQXR0YWNobWVudEZpbmRlciIsImJhZGdlQ2xpY2siLCJ0b2dnbGVBdHRhY2htZW50RmluZGVyIiwiQXR0YWNobWVudEZpbmRlclZpc2libGUiLCJzaG93QXR0YWNobWVudEZpbmRlciIsImF0dGFjaG1lbnROYXZpZ2F0ZSIsInNldCIsIk1hdGgiLCJtYXgiLCJSZXNvdXJjZUxpc3QiLCJDb2xsZWN0aW9uVmlldyIsImNvbGxlY3Rpb24iLCJmdWxsQ29sbGVjdGlvbiIsImNoaWxkVmlldyIsIm1vZHVsZSIsImV4cG9ydHMiLCJsaXN0UmVnaW9uIiwic3RhdHVzQ29udGFpbmVyIiwidG9wUmVnaW9uIiwiZmlsdGVyQXJlYSIsImNsZWFyRmlsdGVyc0J1dHRvbiIsImNsb3NlQnV0dG9uIiwibGlzdENvbnRhaW5lciIsImNvbGxlY3Rpb25FdmVudHMiLCJzeW5jIiwicmVxdWVzdCIsInByZWxvYWRJbWFnZXMiLCJyZXNldCIsIm9uU2Nyb2xsTGlzdCIsImZhZGUiLCJpbmNyZWFzZSIsIkRpc2FibGVSZXNvdXJjZURyYWdnaW5nIiwiZGlzYWJsZURyYWciLCJFbmFibGVSZXNvdXJjZURyYWdnaW5nIiwiZW5hYmxlRHJhZyIsIlVwZGF0ZURyYWdnaW5nU3RhdHVzIiwidXBkYXRlRHJhZyIsIlJlc291cmNlQ3JlYXRlZCIsImFkZFJlc291cmNlIiwiRmluZFJlc291cmNlIiwib25GaW5kUmVzb3VyY2UiLCJWaWV3Q2hhbmdlZCIsInZpZXdDaGFuZ2VkIiwiaW5pdGlhbEZldGNoIiwicmVxdWVzdGVkUmVzb3VyY2VzIiwicmVtb3ZlIiwiZmV0Y2hlZFJlc291cmNlcyIsInNwZWNpZmljUmVzb3VyY2UiLCJmZXRjaFNwZWNpZmljUmVzb3VyY2UiLCJmaWx0ZXIiLCJ1cGRhdGVTZXJ2ZXJGaWx0ZXJzIiwiaGVpZ2h0IiwiaGFzTmV4dFBhZ2UiLCJnZXROZXh0UGFnZSIsImFkZCIsImF0IiwicmVzb3VyY2VzIiwic2hvd0NoaWxkVmlldyIsInRleHRGaWx0ZXIiLCJuYW1lIiwiZGVib3VuY2UiLCJzZXJ2ZXIiLCJsYW5ndWFnZUZpbHRlciIsImNhdGVnb3JpZXMiLCJpdGVtcyIsImxhbmd1YWdlTGlzdCIsInN1YmplY3RGaWx0ZXIiLCJrZXkiLCJ2YWx1ZSIsImZldGNoIiwicGFnaW5nIiwiaW5maW5pdGUiLCJncmFkZUZpbHRlciIsIm1hcCIsImdyYWRlTGlzdCIsInZhbCIsInJlZHVjZSIsInNvcnQiLCJhIiwiYiIsImxleGljYWwiLCJ0b1VwcGVyQ2FzZSIsImxvY2FsZUNvbXBhcmUiLCJzdW0iLCJudW0iLCJwdXNoIiwib2ZmaWNlQ29udGVudCIsInNvcnRCeSIsImMiLCJ0eXBlRmlsdGVyIiwiaWNvbnMiLCJjdXJyZW50bHlVc2VkIiwiaW5pdGlhbFZhbHVlIiwib3duQ29udGVudCIsImZpbHRlckxpc3QiLCJyYXciLCJmaWx0ZXJDb250YWluZXIiLCJmaWx0ZXJzIiwiZGVmYXVsdEZpbHRlcnMiLCJwcmVwZW5kIiwiY2xvc2UiLCJyZXNvdXJjZUZpbHRlciIsIkNsb3NlUmVzb3VyY2VzIiwiRmlsdGVyTWFuYWdlciIsImhpZGVBbGxGaWx0ZXJMaXN0cyIsImJvb2siLCJHZXRDdXJyZW50Qm9vayIsImxwIiwiR2V0Q3VycmVudEdyb3VwIiwic3RhcnRzV2l0aCIsInZpZXciLCJyZXNldEZpbHRlcnMiLCJzdGF0dXMiLCJjc3MiLCJvcGFjaXR5IiwibGVuZ3RoIiwic2V0VGltZW91dCIsInRocm90dGxlIiwic2Nyb2xsUG9zIiwiY3VycmVudFRhcmdldCIsInNjcm9sbFRvcCIsInNjcm9sbEhlaWdodCIsIm9uQ2xlYXJGaWx0ZXJzQnV0dG9uQ2xpY2siLCJvbkJlZm9yZURlc3Ryb3kiLCJzdG9wTGlzdGVuaW5nIiwicmVzb3VyY2UiLCJnZXRGaXJzdFBhZ2UiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1DLElBQUlELFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUUsSUFBSUYsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNRyxTQUFTSCxRQUFRLFFBQVIsQ0FBZjs7QUFFQSxJQUFNSSxXQUFXSixRQUFRLGNBQVIsQ0FBakI7QUFDQSxJQUFNSyxNQUFNTCxRQUFRLGdCQUFSLENBQVo7O0FBRUEsSUFBTU0sUUFBUVAsU0FBU1EsS0FBVCxDQUFlQyxPQUFmLENBQXVCLFFBQXZCLENBQWQ7O0FBRUEsSUFBTUMsc0JBQXNCVCxRQUFRLGtDQUFSLENBQTVCO0FBQ0EsSUFBTVUsYUFBYVYsUUFBUSx5QkFBUixDQUFuQjtBQUNBLElBQU1XLGdCQUFnQlgsUUFBUSxpQkFBUixDQUF0QjtBQUNBLElBQU1ZLGdCQUFnQlosUUFBUSw0QkFBUixDQUF0QjtBQUNBLElBQU1hLFdBQVdiLFFBQVEsK0NBQVIsQ0FBakI7QUFDQSxJQUFNYyxrQkFBa0JkLFFBQVEsOEJBQVIsQ0FBeEI7QUFDQSxJQUFNZSxhQUFhZixRQUFRLDhCQUFSLENBQW5CO0FBQ0EsSUFBTWdCLHFCQUFxQmhCLFFBQVEsaUNBQVIsQ0FBM0I7QUFDQSxJQUFNaUIsV0FBV2pCLFFBQVEsWUFBUixDQUFqQjtBQUNBLElBQU1rQixXQUFXbEIsUUFBUSx1QkFBUixDQUFqQjtBQUNBLElBQU1tQixtQkFB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O0FBRUEsTUFBSUgsWUFBWW5FLE1BQVosR0FBcUIsR0FBckIsSUFBNEIsQ0FBQ2pOLFlBQVkyQixHQUFaLENBQWdCLFVBQWhCLENBQTdCLElBQTREM0IsWUFBWWtOLFdBQVosRUFBaEUsRUFDQ2xOLFlBQVltTixXQUFaOztBQUVEO0FBQ0EsRUFUYSxFQVNYLEVBVFcsQ0FoVGtDOztBQTJUaERxRSw0QkFBMkIscUNBQVc7QUFDckN4UixjQUFZRyxXQUFaLENBQXdCZ1EsY0FBeEIsR0FBeUMsSUFBekM7QUFDQSxPQUFLcEQsTUFBTCxDQUFZOEQsWUFBWjtBQUNBLE9BQUs5RCxNQUFMLENBQVlDLG1CQUFaO0FBQ0EsRUEvVCtDOztBQWlVaER5RSxrQkFBaUIsMkJBQVc7QUFDM0IsT0FBS0MsYUFBTCxDQUFtQnJTLFFBQW5CO0FBQ0EsT0FBSzBOLE1BQUwsQ0FBWS9JLE9BQVo7QUFDQSxFQXBVK0M7O0FBc1VoRHNJLGlCQUFnQix3QkFBU3FGLFFBQVQsRUFBbUI7QUFDbEMsT0FBSzlFLGdCQUFMLEdBQXdCOEUsU0FBU2hRLEdBQVQsQ0FBYSxLQUFiLENBQXhCO0FBQ0EsRUF4VStDOztBQTBVaERtTCx3QkFBdUIsaUNBQVc7QUFDakM5TSxjQUFZRyxXQUFaLENBQXdCZ1EsY0FBeEIsR0FBeUMsS0FBS3RELGdCQUE5QztBQUNBN00sY0FBWTBLLGNBQVosQ0FBMkJlLEtBQTNCLENBQWlDLEVBQWpDO0FBQ0EsT0FBS2dCLFlBQUwsR0FBb0IsS0FBcEI7QUFDQXpNLGNBQVk0UixZQUFaO0FBQ0EsU0FBTyxLQUFLL0UsZ0JBQVo7QUFDQTtBQWhWK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoicmVzb3VyY2VTaWRlYmFyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBtb21lbnQgPSByZXF1aXJlKFwibW9tZW50XCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5jb25zdCBBcHAgPSByZXF1aXJlKFwiLi4vLi4vLi4vaW5kZXhcIik7XG5cbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcblxuY29uc3QgU2VydmVyRmlsdGVyTWFuYWdlciA9IHJlcXVpcmUoXCIuLi8uLi8uLi9saWIvc2VydmVyRmlsdGVyTWFuYWdlclwiKTtcbmNvbnN0IFNtYWxsTW9kYWwgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL3NtYWxsTW9kYWxcIik7XG5jb25zdCBSZXNvdXJjZUljb25zID0gcmVxdWlyZShcIi4vcmVzb3VyY2VJY29uc1wiKTtcbmNvbnN0IFJlc291cmNlTW9kYWwgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL3Jlc291cmNlTW9kYWxcIik7XG5jb25zdCBSZXNvdXJjZSA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb250ZW50L21vZGVscy9tYW5hZ2VyL3Jlc291cmNlTW9kZWxcIik7XG5jb25zdCBBc3Nlc3NtZW50TW9kYWwgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL2Fzc2Vzc21lbnRNb2RhbFwiKTtcbmNvbnN0IEFzc2Vzc21lbnQgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL2Fzc2Vzc21lbnRNb2RlbFwiKTtcbmNvbnN0IEluZmluaXRlQ29sbGVjdGlvbiA9IHJlcXVpcmUoXCIuLi8uLi8uLi9saWIvaW5maW5pdGVDb2xsZWN0aW9uXCIpO1xuY29uc3QgZXZlbnRCdXMgPSByZXF1aXJlKFwiLi9ldmVudEJ1c1wiKTtcbmNvbnN0IExpZ2h0Qm94ID0gcmVxdWlyZShcIi4uLy4uLy4uL2xpYi9saWdodEJveFwiKTtcbmNvbnN0IEZsYXNoY2FyZFByZXZpZXcgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL2ZsYXNoY2FyZFByZXZpZXdcIik7XG5cbmNvbnN0IFBhZ2VTaXplID0gMzA7XG5sZXQgZHJhZ2dpbmdBbGxvd2VkID0gZmFsc2U7XG5cbmNvbnN0IEVtcHR5VmlldyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9jb25zb2xlL3Jlc291cmNlU2lkZWJhci5udW5qXCIpLmVtcHR5LFxufSk7XG5cbmNvbnN0IGlDb2xsZWN0aW9uID0gbmV3IEluZmluaXRlQ29sbGVjdGlvbihbXSwge1xuXHRzdGF0ZToge1xuXHRcdHBhZ2VTaXplOiBQYWdlU2l6ZSxcblx0fSxcblx0cXVlcnlQYXJhbXM6IHtcblx0XHRwYWdlZDogdHJ1ZSxcblx0fSxcblxuXHR1cmw6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hY2FjaWEvcmVzb3VyY2VzXCIsXG5cdGVtcHR5VmlldzogRW1wdHlWaWV3LFxuXG5cdG1vZGVsOiBmdW5jdGlvbihhdHRyaWJ1dGVzLCBvcHRpb25zKSB7XG5cdFx0bGV0IG1vZGVsID0gbnVsbDtcblxuXHRcdGlmIChhdHRyaWJ1dGVzLmNhdGVnb3J5ICYmIGF0dHJpYnV0ZXMuY2F0ZWdvcnkgPT09IFwiYXNzZXNzbWVudFwiKVxuXHRcdFx0bW9kZWwgPSBuZXcgQXNzZXNzbWVudChhdHRyaWJ1dGVzLCBvcHRpb25zKTtcblx0XHRlbHNlXG5cdFx0XHRtb2RlbCA9IG5ldyBSZXNvdXJjZShhdHRyaWJ1dGVzLCBvcHRpb25zKTtcblxuXHRcdHJldHVybiBtb2RlbDtcblx0fSxcblxuXHRtb2RlbElkOiBmdW5jdGlvbihhdHRyaWJ1dGVzKSB7XG5cdFx0cmV0dXJuIGF0dHJpYnV0ZXNbdGhpcy5tb2RlbC5wcm90b3R5cGUuaWRBdHRyaWJ1dGUgfHwgXCJfaWRcIl07XG5cdH0sXG59KTtcblxuY29uc3QgUmVzb3VyY2VVc2FnZUZpbmRlclZpZXcgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogXCJkaXZcIixcblx0Y2xhc3NOYW1lOiBcImZpbmRlciBoaWRlXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvY29uc29sZS9yZXNvdXJjZVNpZGViYXIubnVualwiKS5maW5kZXIsXG5cblx0dWk6IHtcblx0XHRwcmV2aW91czogXCIucHJldlwiLFxuXHRcdG5leHQ6IFwiLm5leHRcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5wcmV2aW91c1wiOiBcIm9uQ2xpY2tQcmV2aW91c1wiLFxuXHRcdFwiY2xpY2sgQHVpLm5leHRcIjogXCJvbkNsaWNrTmV4dFwiLFxuXHR9LFxuXG5cdG9uQ2xpY2tQcmV2aW91czogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGV2ZW50QnVzLnRyaWdnZXIoXCJhdHRhY2htZW50OnByZXZpb3VzXCIsIHRoaXMubW9kZWwuZ2V0KFwiX2lkXCIpKTtcblx0fSxcblxuXHRvbkNsaWNrTmV4dDogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGV2ZW50QnVzLnRyaWdnZXIoXCJhdHRhY2htZW50Om5leHRcIiwgdGhpcy5tb2RlbC5nZXQoXCJfaWRcIikpO1xuXHR9LFxuXG5cdHNob3c6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRoaWRlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcImhpZGVcIik7XG5cdH0sXG59KTtcblxuY29uc3QgUmVzb3VyY2VTdW1tYXJ5ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6IFwiZGl2XCIsXG5cdGNsYXNzTmFtZTogXCJzdW1tYXJ5XCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvY29uc29sZS9yZXNvdXJjZVNpZGViYXIubnVualwiKS5zdW1tYXJ5LFxuXG5cdHVpOiB7XG5cdFx0ZWRpdDogXCJzcGFuLmVkaXRcIixcblx0XHRkZWxldGU6IFwic3Bhbi5kZWxldGVcIixcblx0XHRvcGVuOiBcInNwYW4ub3BlblwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmVkaXRcIjogXCJlZGl0XCIsXG5cdFx0XCJjbGljayBAdWkuZGVsZXRlXCI6IFwiZGVsZXRlXCIsXG5cdFx0XCJjbGljayBAdWkub3BlblwiOiBcIm9wZW5cIixcblx0fSxcblxuXHRzZXJpYWxpemVEYXRhOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tb2RlbC50b0pTT04oeyBjb21wdXRlZDogdHJ1ZSB9KTtcblx0fSxcblxuXHRlZGl0OiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRsZXQgbW9kYWw7XG5cblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJjYXRlZ29yeVwiKSA9PT0gXCJhc3Nlc3NtZW50XCIpXG5cdFx0XHRtb2RhbCA9IG5ldyBBc3Nlc3NtZW50TW9kYWwoeyBtb2RlbDogdGhpcy5tb2RlbCB9KTtcblx0XHRlbHNlXG5cdFx0XHRtb2RhbCA9IG5ldyBSZXNvdXJjZU1vZGFsKHsgbW9kZWw6IHRoaXMubW9kZWwgfSk7XG5cblx0XHRtb2RhbC5zaG93KHtcblx0XHRcdHVwZGF0ZTogcmVzdWx0ID0+IHtcblx0XHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7XG5cdFx0XHRcdFx0Y29udGVudDogXCJJdGVtIFwiICsgcmVzdWx0Lm1vZGVsLmdldChcInRpdGxlXCIpICsgXCIgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWRcIixcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9LFxuXG5cdGRlbGV0ZTogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0dGhpcy5kZWxNb2RhbCA9IG5ldyBTbWFsbE1vZGFsKHtcblx0XHRcdHBlcnNpc3Q6IHRydWUsXG5cdFx0XHR3YXJuaW5nOiB0cnVlLFxuXHRcdFx0dGl0bGU6IFwiPHNwYW4gY2xhc3M9J2ZhbCBmYS1leGNsYW1hdGlvbi10cmlhbmdsZScvPiBEZWxldGUgSXRlbTogXCIgKyB0aGlzLm1vZGVsLmdldChcInRpdGxlXCIpLnJlcGxhY2UoL1tcXCZcXDxcXD5cXCdcXFwiXS9nLCB4ID0+IFwiJiNcIiArIHguY2hhckNvZGVBdCgwKSArIFwiO1wiKSxcblx0XHRcdGJvZHk6IFwiPHA+QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGl0ZW0/PC9wPjxwPkl0IHdpbGwgbm90IGJlIHJlbW92ZWQgZnJvbSBib29rcyBhbmQgXCIgKyBfLnRvTG93ZXIoc2V0dGluZ3MubGVhcm5pbmdQYXRoc1BsdXJhbEN1c3RvbU5hbWUpICtcblx0XHRcdFx0XCI7IGl0IHdpbGwganVzdCBiZWNvbWUgdW51c2FibGUgZ29pbmcgZm9yd2FyZC48L3A+PHA+WW91IGNhbiBjaG9vc2UgdG8gcmVtb3ZlIGl0IGZyb20geW91ciBib29rcyBhbmQgXCIgKyBfLnRvTG93ZXIoc2V0dGluZ3MubGVhcm5pbmdQYXRoc1BsdXJhbEN1c3RvbU5hbWUpICtcblx0XHRcdFx0YCBieSBjbGlja2luZyB0aGUgb3B0aW9uIGJlbG93LjxwPjxwPjxsYWJlbD48aW5wdXQgdHlwZT0nY2hlY2tib3gnIHZhbHVlPScxJz5cblx0XHRcdFx0WWVzLCBhbHNvIHJlbW92ZSBhbGwgaW5zdGFuY2VzIG9mIHRoaXMgaXRlbSBmcm9tIG15IGJvb2tzIGFuZCBgICsgXy50b0xvd2VyKHNldHRpbmdzLmxlYXJuaW5nUGF0aHNQbHVyYWxDdXN0b21OYW1lKSArIFwiPC9sYWJlbD48L3A+XCIsXG5cdFx0fSk7XG5cdFx0dGhpcy5kZWxNb2RhbC5vbihcImJ1dHRvbjpva1wiLCAoKSA9PiB7XG5cdFx0XHR0aGlzLm1vZGVsLmFuZEF0dGFjaG1lbnRzID0gJChcImlucHV0XCIsIHRoaXMuZGVsTW9kYWwuZWwpLnByb3AoXCJjaGVja2VkXCIpO1xuXHRcdFx0dGhpcy5tb2RlbC5kZXN0cm95KHtcblx0XHRcdFx0d2FpdDogdHJ1ZSxcblx0XHRcdFx0ZGF0YToge1xuXHRcdFx0XHRcdGFuZEF0dGFjaG1lbnRzOiAkKFwiaW5wdXRcIiwgdGhpcy5kZWxNb2RhbC5lbCkucHJvcChcImNoZWNrZWRcIiksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHN1Y2Nlc3M6IHRoaXMuZGVsZXRpb25TdWNjZXNzLmJpbmQodGhpcyksXG5cdFx0XHRcdGVycm9yOiB0aGlzLmRlbGV0aW9uRXJyb3IuYmluZCh0aGlzKSxcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5kZWxNb2RhbC5zaG93KCk7XG5cdH0sXG5cblx0b3BlbjogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0c3dpdGNoICh0aGlzLm1vZGVsLmdldChcImNhdGVnb3J5XCIpKSB7XG5cdFx0XHRjYXNlIFwidGV4dFwiOlxuXHRcdFx0Y2FzZSBcIm9uZW5vdGVcIjpcblx0XHRcdGNhc2UgXCJnb29nbGVkcml2ZVwiOlxuXHRcdFx0Y2FzZSBcInVybFwiOiB7XG5cdFx0XHRcdGxldCB0ZXh0ID0gXCJcIjtcblx0XHRcdFx0aWYgKHRoaXMubW9kZWwuaGFzKFwidGV4dFwiKSlcblx0XHRcdFx0XHR0ZXh0ID0gdGhpcy5tb2RlbC5nZXQoXCJ0ZXh0XCIpLnJlcGxhY2UoL1xcbi9nLCBcIjxici8+XCIpO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dGV4dCA9IFwiPGEgdGFyZ2V0PSdfYmxhbmsnIGhyZWY9XFxcIlwiICsgdGhpcy5tb2RlbC5nZXQoXCJ1cmxcIikgKyBcIlxcXCI+XCIgKyB0aGlzLm1vZGVsLmdldChcInVybFwiKSArIFwiPC9hPlwiO1xuXG5cdFx0XHRcdGNvbnN0IGNvbmZpcm0gPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHRcdFx0Y3VzdG9tT0s6IFwiQ2xvc2VcIixcblx0XHRcdFx0XHRoaWRlQnV0dG9uczogW1wiY2FuY2VsXCJdLFxuXHRcdFx0XHRcdGJvZHk6IHRleHQsXG5cdFx0XHRcdFx0dGl0bGU6IFwiVmlld2luZyBSZXNvdXJjZTogXCIgKyB0aGlzLm1vZGVsLmdldChcInRpdGxlXCIpLnJlcGxhY2UoL1tcXCZcXDxcXD5cXCdcXFwiXS9nLCB4ID0+IFwiJiNcIiArIHguY2hhckNvZGVBdCgwKSArIFwiO1wiKSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGNvbmZpcm0uc2hvdygpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0Y2FzZSBcImltYWdlXCI6XG5cdFx0XHRcdG5ldyBMaWdodEJveCh7XG5cdFx0XHRcdFx0aG9zdDogJChcIiNsaW5rLXJlc291cmNlc1wiKSxcblx0XHRcdFx0XHRpbWFnZTogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvcmVzb3VyY2VzL1wiICsgdGhpcy5tb2RlbC5pZCArIFwiL2RhdGFcIixcblx0XHRcdFx0fSkuc2hvdygpO1xuXHRcdFx0XHRicmVhaztcblxuXG5cdFx0XHRjYXNlIFwiYXNzZXNzbWVudFwiOlxuXHRcdFx0XHRuZXcgQXNzZXNzbWVudE1vZGFsKHtcblx0XHRcdFx0XHRtb2RlbDogbmV3IEFzc2Vzc21lbnQodGhpcy5tb2RlbC50b0pTT04oKSksXG5cdFx0XHRcdFx0cHJldmlld01vZGU6IHRydWUsXG5cdFx0XHRcdFx0cmVzdGFydDogdHJ1ZSxcblx0XHRcdFx0fSkuc2hvdyh7fSk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwiZmxhc2hjYXJkZGVja1wiOlxuXHRcdFx0XHRuZXcgRmxhc2hjYXJkUHJldmlldyh7XG5cdFx0XHRcdFx0bW9kZWw6IHRoaXMubW9kZWwsXG5cdFx0XHRcdH0pLnNob3coKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJ2aWRlb1wiOlxuXHRcdFx0Y2FzZSBcInBkZlwiOlxuXHRcdFx0Y2FzZSBcImV4Y2VsXCI6XG5cdFx0XHRjYXNlIFwid29yZFwiOlxuXHRcdFx0Y2FzZSBcInBvd2VycG9pbnRcIjpcblx0XHRcdFx0d2luZG93Lm9wZW4oc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvcmVzb3VyY2VzL1wiICsgdGhpcy5tb2RlbC5pZCArIFwiL2RhdGFcIik7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGNhdGVnb3J5XCIpO1xuXHRcdH1cblx0fSxcblxuXHRkZWxldGlvblN1Y2Nlc3M6IGZ1bmN0aW9uKG1vZGVsLCByZXNwb25zZSkge1xuXHRcdHRoaXMuZGVsTW9kYWwuZGVzdHJveSgpO1xuXHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5Ub2FzdCwgeyBjb250ZW50OiBcIkl0ZW0gJ1wiICsgbW9kZWwuZ2V0KFwidGl0bGVcIikgKyBcIicgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWRcIiwgaWNvbjogXCJmYS10cmFzaC1hbHRcIiwgaWNvbkNvbG91cjogXCJyZWRcIiB9KTtcblx0XHRldmVudEJ1cy50cmlnZ2VyKFwicmVzb3VyY2U6ZGVsZXRlZFwiLCByZXNwb25zZSk7XG5cdH0sXG5cblx0ZGVsZXRpb25FcnJvcjogZnVuY3Rpb24obW9kZWwsIHhocikge1xuXHRcdGNvbnN0IGFuc3dlciA9IEFwcC5wYXJzZVJlc3BvbnNlKHhocik7XG5cdFx0dGhpcy5kZWxNb2RhbC5zaG93RXJyb3IoXCJEZWxldGlvbiBmYWlsZWQ6IFwiICsgKGFuc3dlci5kZXRhaWwgfHwgYW5zd2VyLmluZm8pKTtcblx0fSxcbn0pO1xuXG5jb25zdCBSZXNvdXJjZUl0ZW0gPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogXCJkaXZcIixcblx0Y2xhc3NOYW1lOiBcImxpc3QtaXRlbVwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2NvbnNvbGUvcmVzb3VyY2VTaWRlYmFyLm51bmpcIikuaXRlbSxcblxuXHQvL2F0dHJpYnV0ZXM6IHtcblx0Ly9cdGRyYWdnYWJsZTogXCJ0cnVlXCIsXG5cdC8vfSxcblxuXHRtb2RlbEV2ZW50czoge1xuXHRcdFwiY2hhbmdlOnVzYWdlXCI6IFwiY2hhbmdlVXNhZ2VcIixcblx0XHRcImNoYW5nZTp0aXRsZVwiOiBcInJlbmRlclwiLFxuXHR9LFxuXG5cdHJlZ2lvbnM6IHtcblx0XHRsYWJlbDogXCJkaXYubGFiZWwtcmVnaW9uXCIsXG5cdH0sXG5cblx0dWk6IHtcblx0XHRsYWJlbENvbnRhaW5lcjogXCJkaXYubGFiZWwtY29udGFpbmVyXCIsXG5cdFx0YmFkZ2VDb250YWluZXI6IFwiZGl2LmJhZGdlLWNvbnRhaW5lclwiLFxuXHRcdGJhZGdlOiBcInNwYW4uYmFkZ2VcIixcblx0XHRzdW1tYXJ5OiBcImRpdi5zdW1tYXJ5LXJlZ2lvblwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdGNsaWNrOiBcIm9uQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5iYWRnZVwiOiBcImJhZGdlQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5zdW1tYXJ5XCI6IFwidG9nZ2xlU3VtbWFyeVwiLFxuXHRcdFwibW91c2Vkb3duIEB1aS5sYWJlbENvbnRhaW5lclwiOiBcIm9uTW91c2VEb3duXCIsXG5cdH0sXG5cblx0YXR0YWNobWVudEV2ZW50czoge1xuXHRcdFwiYXR0YWNobWVudDpmaXJzdFwiOiBcImF0dGFjaG1lbnROYXZpZ2F0ZVwiLFxuXHRcdFwiYXR0YWNobWVudDpuZXh0XCI6IFwiYXR0YWNobWVudE5hdmlnYXRlXCIsXG5cdFx0XCJhdHRhY2htZW50OnByZXZpb3VzXCI6IFwiYXR0YWNobWVudE5hdmlnYXRlXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zdW1tYXJ5VmlzaWJsZSA9IGZhbHNlO1xuXHRcdHRoaXMuY2hhbmdlVXNhZ2VTdGF0dXMgPSB0cnVlO1xuXHRcdHRoaXMuaXNJRSA9IF8uaXNGdW5jdGlvbihkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKS5kcmFnRHJvcCk7XG5cblx0XHQvLyBMaXN0ZW4gZm9yIGNsaWNrIGV2ZW50cyBmcm9tIHRoZSByZXNvdXJjZSBsYWJlbCBhbmQgdG9nZ2xlIHRoZSBzdW1tYXJ5IGRpc3BsYXkgYWNjb3JkaW5nbHlcblx0XHR0aGlzLmxpc3RlblRvKGV2ZW50QnVzLCBcInN1bW1hcnk6dG9nZ2xlXCIsIGlkID0+IHtcblx0XHRcdGlmICh0aGlzLm1vZGVsLmdldChcIl9pZFwiKSA9PT0gaWQpXG5cdFx0XHRcdHRoaXMudG9nZ2xlU3VtbWFyeSgpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLmhpZGVTdW1tYXJ5KCk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKGV2ZW50QnVzLCBcInN1bW1hcnk6c2hvd1wiLCBpZCA9PiB7XG5cdFx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJfaWRcIikgPT09IGlkKVxuXHRcdFx0XHR0aGlzLnNob3dTdW1tYXJ5KCk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMuaGlkZVN1bW1hcnkoKTtcblx0XHR9KTtcblxuXHRcdHRoaXMubGlzdGVuVG8oZXZlbnRCdXMsIGV2ZW50QnVzLkV2ZW50cy5BdHRhY2htZW50QWRkZWQsIHRoaXMub25BdHRhY2htZW50QWRkZWQuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5UbyhldmVudEJ1cywgZXZlbnRCdXMuRXZlbnRzLkF0dGFjaG1lbnRSZW1vdmVkLCB0aGlzLm9uQXR0YWNobWVudFJlbW92ZWQuYmluZCh0aGlzKSk7XG5cblx0XHRCYWNrYm9uZS5NYXJpb25ldHRlLmJpbmRFdmVudHModGhpcywgZXZlbnRCdXMsIHRoaXMuYXR0YWNobWVudEV2ZW50cyk7XG5cdH0sXG5cblx0c2VyaWFsaXplRGF0YTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubW9kZWwudG9KU09OKHsgY29tcHV0ZWQ6IHRydWUgfSk7XG5cdH0sXG5cblx0b25DbGljazogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gU2lnbmFsIHRoZSBjb250YWluZXIgdG8gZXhwYW5kIGl0c2VsZlxuXHRcdGV2ZW50QnVzLnRyaWdnZXIoXCJzdW1tYXJ5OnRvZ2dsZVwiLCB0aGlzLm1vZGVsLmdldChcIl9pZFwiKSk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuVXNhZ2VGaW5kZXJWaWV3ID0gbmV3IFJlc291cmNlVXNhZ2VGaW5kZXJWaWV3KHsgbW9kZWw6IHRoaXMubW9kZWwgfSk7XG5cdFx0dGhpcy51aS5iYWRnZUNvbnRhaW5lci5hcHBlbmQodGhpcy5Vc2FnZUZpbmRlclZpZXcucmVuZGVyKCkuZWwpO1xuXHR9LFxuXG5cdG9uTW91c2VEb3duOiBmdW5jdGlvbihldmVudCkge1xuXHRcdC8vT25seSBzdGFydCB0aGUgZHJhZyBwcm9jZXNzIGlmIHRoZSBtb3VzZSBtb3ZlcyBhZnRlciBhIGNlcnRhaW4gZHVyYXRpb24sXG5cdFx0Ly90aGlzIGlzIHRvIGNhdGVyIGZvciBzbWFsbCBtb3VzZSBtb3ZlbWVudHMgZHVyaW5nIGEgcmVndWxhciBjbGlja1xuXHRcdGNvbnN0IG1vdXNlRG93blN0YXJ0ID0gbW9tZW50KCk7XG5cdFx0bGV0IGRyYWdTdGFydGVkID0gZmFsc2U7XG5cdFx0bGV0IGRyYWdnaW5nRWxlbWVudCwgZGF0YTtcblxuXHRcdC8vIFByZXZlbnQgdGV4dCBzZWxlY3Rpb24gd2hpbGUgZHJhZ2dpbmc7XG5cdFx0JChcImJvZHlcIikub24oXCJzZWxlY3RzdGFydC5kcmFnZ2luZ1Jlc291cmNlXCIsIGUgPT4gZS5wcmV2ZW50RGVmYXVsdCgpKTtcblxuXHRcdCQoXCJib2R5XCIpLm9uKFwibW91c2Vtb3ZlLmRyYWdTdGFydGVkXCIsICgpID0+IHtcblx0XHRcdGlmIChtb21lbnQoKS5kaWZmKG1vdXNlRG93blN0YXJ0LCBcIm1zXCIpIDw9IDEzMClcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHQkKFwiYm9keVwiKS5vZmYoXCJtb3VzZW1vdmUuZHJhZ1N0YXJ0ZWRcIik7XG5cdFx0XHRkcmFnU3RhcnRlZCA9IHRydWU7XG5cdFx0XHRpZiAoIWRyYWdnaW5nQWxsb3dlZCkge1xuXHRcdFx0XHRpZiAoaUNvbGxlY3Rpb24ucXVlcnlQYXJhbXMudHlwZSAhPT0gXCJscFwiKSB7XG5cdFx0XHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7XG5cdFx0XHRcdFx0XHRjb250ZW50OiBcIkRyYWdnaW5nIGludG8gdGhpcyBib29rIGlzIGRpc2FibGVkIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGdyb3VwcyBhbGxvd2VkIGZvciBcIiArIEFwcC5jdXJyZW50WWVhcigpLFxuXHRcdFx0XHRcdFx0aWNvbjogXCJmYS10aW1lc1wiLFxuXHRcdFx0XHRcdFx0aWNvbkNvbG91cjogXCJyZWRcIixcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCB0aGUgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZCBieSB0aGUgZHJhZyBvcGVyYXRpb25cblx0XHRcdGRhdGEgPSB7XG5cdFx0XHRcdHR5cGU6IFwicmVzb3VyY2VcIixcblx0XHRcdFx0cmVzb3VyY2VNb2RlbDogdGhpcy5tb2RlbC50b0pTT04oeyBjb21wdXRlZDogdHJ1ZSB9KSxcblx0XHRcdH07XG5cblx0XHRcdGNvbnN0IERyYWdnaW5nRWxlbWVudCA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRcdFx0XHRjbGFzc05hbWU6IFwibHAtZHJhZ2dpbmctZWxlbWVudFwiLFxuXHRcdFx0XHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9jb25zb2xlL2xlYXJuaW5nUGF0aE5vZGUubnVualwiKS5kcmFnZ2luZ0VsZW1lbnQsXG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uc3QgcmVzb3VyY2VEYXRhID0ge1xuXHRcdFx0XHR0aXRsZTogZGF0YS5yZXNvdXJjZU1vZGVsLnRpdGxlLFxuXHRcdFx0XHRjYXRlZ29yeTogXCJhdHRhY2htZW50XCIsXG5cdFx0XHRcdHJlc291cmNlVHlwZTogXy5yZXBsYWNlKGRhdGEucmVzb3VyY2VNb2RlbC5pbWcsIFwiYW5ub3RhdGlvbl9cIiwgXCJcIiksXG5cdFx0XHR9O1xuXG5cdFx0XHRjb25zdCBkcmFnZ2luZ05vZGUgPSBuZXcgRHJhZ2dpbmdFbGVtZW50KHtcblx0XHRcdFx0bW9kZWw6IG5ldyBCYWNrYm9uZS5Nb2RlbChyZXNvdXJjZURhdGEpLFxuXHRcdFx0fSkucmVuZGVyKCk7XG5cdFx0XHRkcmFnZ2luZ0VsZW1lbnQgPSBkcmFnZ2luZ05vZGUuJGVsWzBdO1xuXG5cdFx0XHRkcmFnZ2luZ0VsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG5cdFx0XHRkcmFnZ2luZ0VsZW1lbnQuc3R5bGUuekluZGV4ID0gMTAwMDtcblxuXHRcdFx0JChcImJvZHlcIikuYXBwZW5kKGRyYWdnaW5nRWxlbWVudCk7XG5cblx0XHRcdGNvbnN0IG1vdmVBdCA9IGUgPT4ge1xuXHRcdFx0XHRkcmFnZ2luZ0VsZW1lbnQuc3R5bGUubGVmdCA9IChlLm9yaWdpbmFsRXZlbnQucGFnZVgpICsgXCJweFwiO1xuXHRcdFx0XHRkcmFnZ2luZ0VsZW1lbnQuc3R5bGUudG9wID0gKGUub3JpZ2luYWxFdmVudC5wYWdlWSkgKyBcInB4XCI7XG5cdFx0XHR9O1xuXG5cdFx0XHRtb3ZlQXQoZXZlbnQpO1xuXG5cdFx0XHQkKFwiI2Jvb2stb3ZlcmxheSwgI2xwLW92ZXJsYXlcIikub24oXCJtb3VzZW1vdmUubW92ZURyYWdnaW5nRWxlbWVudFwiLCBtb3ZlQXQpO1xuXG5cdFx0XHQvLyBGYWRlIHRoZSByZXNvdXJjZSBzZWxlY3RvclxuXHRcdFx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5FdmVudHMuUmVzb3VyY2VEcmFnU3RhcnQsIGRhdGEpO1xuXHRcdH0pO1xuXG5cdFx0Ly8gSGFuZGxlIHRoZSBkcm9wXG5cdFx0JChcImJvZHlcIikub24oXCJtb3VzZXVwLnJlc291cmNlRHJhZ0VuZGVkXCIsIGUgPT4ge1xuXHRcdFx0JChcImJvZHlcIikub2ZmKFwic2VsZWN0c3RhcnQuZHJhZ2dpbmdSZXNvdXJjZVwiKTtcblxuXHRcdFx0aWYgKGRyYWdTdGFydGVkKSB7XG5cdFx0XHRcdCQoXCIjYm9vay1vdmVybGF5LCAjbHAtb3ZlcmxheVwiKS5vZmYoXCJtb3VzZW1vdmUubW92ZURyYWdnaW5nRWxlbWVudFwiKTtcblx0XHRcdFx0JChcInNwYW4uaXRlbS1pY29uXCIsIHRoaXMuZWwpLnJlbW92ZUNsYXNzKFwiaXRlbS1kcmFnLWljb25cIik7XG5cdFx0XHRcdGlmIChkcmFnZ2luZ0VsZW1lbnQpXG5cdFx0XHRcdFx0ZHJhZ2dpbmdFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZHJhZ2dpbmdFbGVtZW50KTtcblx0XHRcdFx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5FdmVudHMuUmVzb3VyY2VEcmFnRW5kKTtcblx0XHRcdFx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5FdmVudHMuUmVzb3VyY2VEcmFnRHJvcCwgZSwgZGF0YSk7XG5cdFx0XHRcdCQoXCJib2R5XCIpLm9mZihcIm1vdXNldXAucmVzb3VyY2VEcmFnRW5kZWRcIik7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0JChcImJvZHlcIikub2ZmKFwibW91c2Vtb3ZlLmRyYWdTdGFydGVkXCIpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9LFxuXG5cdGNoYW5nZVVzYWdlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIXRoaXMuY2hhbmdlVXNhZ2VTdGF0dXMpIHtcblx0XHRcdHRoaXMuY2hhbmdlVXNhZ2VTdGF0dXMgPSB0cnVlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChwYXJzZUludCh0aGlzLm1vZGVsLmdldChcInVzYWdlXCIpLCAxMCkgPiAwKSB7XG5cdFx0XHR0aGlzLnVpLmJhZGdlLnRleHQodGhpcy5tb2RlbC5nZXQoXCJ1c2FnZVwiKSkucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwidXNhZ2VcIikgPT09IDEpXG5cdFx0XHRcdHRoaXMuaGlkZUF0dGFjaG1lbnRGaW5kZXIoKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLnVpLmJhZGdlLnRleHQoXCJcIikuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0dGhpcy5oaWRlQXR0YWNobWVudEZpbmRlcigpO1xuXHRcdH1cblx0fSxcblxuXHRiYWRnZUNsaWNrOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0aWYgKHBhcnNlSW50KHRoaXMudWkuYmFkZ2UudGV4dCgpLCAxMCkgPT09IDEpXG5cdFx0XHRldmVudEJ1cy50cmlnZ2VyKFwiYXR0YWNobWVudDpmaXJzdFwiLCB0aGlzLm1vZGVsLmdldChcIl9pZFwiKSk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy50b2dnbGVBdHRhY2htZW50RmluZGVyKCk7XG5cdH0sXG5cblx0dG9nZ2xlU3VtbWFyeTogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gRGlzcGxheSB0aGUgZGVzY3JpcHRpb24gcGFuZWxcblx0XHRpZiAodGhpcy5zdW1tYXJ5VmlzaWJsZSlcblx0XHRcdHRoaXMuaGlkZVN1bW1hcnkoKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnNob3dTdW1tYXJ5KCk7XG5cdH0sXG5cblx0c2hvd1N1bW1hcnk6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc3VtbWFyeSA9IG5ldyBSZXNvdXJjZVN1bW1hcnkoeyBtb2RlbDogdGhpcy5tb2RlbCB9KTtcblxuXHRcdHRoaXMuJGVsLmFwcGVuZCh0aGlzLnN1bW1hcnkucmVuZGVyKCkuZWwpO1xuXG5cdFx0dGhpcy5zdW1tYXJ5VmlzaWJsZSA9IHRydWU7XG5cdH0sXG5cblx0aGlkZVN1bW1hcnk6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLnN1bW1hcnkpIHtcblx0XHRcdHRoaXMuc3VtbWFyeS5kZXN0cm95KCk7XG5cdFx0XHR0aGlzLnN1bW1hcnkgPSBudWxsO1xuXHRcdH1cblx0XHR0aGlzLnN1bW1hcnlWaXNpYmxlID0gZmFsc2U7XG5cdH0sXG5cblx0dG9nZ2xlQXR0YWNobWVudEZpbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuQXR0YWNobWVudEZpbmRlclZpc2libGUpIHtcblx0XHRcdHRoaXMuaGlkZUF0dGFjaG1lbnRGaW5kZXIoKTtcblx0XHRcdGV2ZW50QnVzLnRyaWdnZXIoXCJhdHRhY2htZW50OmNsZWFyXCIpO1xuXHRcdH1cblx0XHRlbHNlIHsgdGhpcy5zaG93QXR0YWNobWVudEZpbmRlcigpOyB9XG5cdH0sXG5cblx0c2hvd0F0dGFjaG1lbnRGaW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGlmIChpQ29sbGVjdGlvbi5xdWVyeVBhcmFtcy50eXBlICE9PSBcImxwXCIpIHtcblx0XHRcdHRoaXMuVXNhZ2VGaW5kZXJWaWV3LnNob3coKTtcblx0XHRcdHRoaXMuQXR0YWNobWVudEZpbmRlclZpc2libGUgPSB0cnVlO1xuXHRcdH1cblx0fSxcblxuXHRoaWRlQXR0YWNobWVudEZpbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5Vc2FnZUZpbmRlclZpZXcuaGlkZSgpO1xuXHRcdHRoaXMuQXR0YWNobWVudEZpbmRlclZpc2libGUgPSBmYWxzZTtcblx0fSxcblxuXHRhdHRhY2htZW50TmF2aWdhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY2hhbmdlVXNhZ2VTdGF0dXMgPSBmYWxzZTtcblx0fSxcblxuXHRvbkF0dGFjaG1lbnRBZGRlZDogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRpZiAobW9kZWwuZ2V0KFwicmVzb3VyY2VcIikgPT09IHRoaXMubW9kZWwuZ2V0KFwiX2lkXCIpKSB7XG5cdFx0XHRpZiAodGhpcy5tb2RlbC5oYXMoXCJ1c2FnZVwiKSlcblx0XHRcdFx0dGhpcy5tb2RlbC5zZXQoXCJ1c2FnZVwiLCAocGFyc2VJbnQodGhpcy5tb2RlbC5nZXQoXCJ1c2FnZVwiKSwgMCkgfHwgMCkgKyAxKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5tb2RlbC5zZXQoXCJ1c2FnZVwiLCAxKTtcblx0XHR9XG5cdH0sXG5cblx0b25BdHRhY2htZW50UmVtb3ZlZDogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRpZiAobW9kZWwuZ2V0KFwicmVzb3VyY2VcIikgPT09IHRoaXMubW9kZWwuZ2V0KFwiX2lkXCIpKVxuXHRcdFx0dGhpcy5tb2RlbC5zZXQoXCJ1c2FnZVwiLCBNYXRoLm1heCgwLCAocGFyc2VJbnQodGhpcy5tb2RlbC5nZXQoXCJ1c2FnZVwiKSwgMCkgfHwgMCkgLSAxKSk7XG5cdH0sXG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBSZXNvdXJjZUxpc3QgPSBCYWNrYm9uZS5NYXJpb25ldHRlLkNvbGxlY3Rpb25WaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6IFwiZGl2XCIsXG5cdGNsYXNzTmFtZTogXCJsaXN0LWNvbnRhaW5lclwiLFxuXHRjb2xsZWN0aW9uOiBpQ29sbGVjdGlvbi5mdWxsQ29sbGVjdGlvbixcblx0Y2hpbGRWaWV3OiBSZXNvdXJjZUl0ZW0sXG59KTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwiY29udGFpbmVyIGhpZGVcIixcblx0aWQ6IFwicmVzb3VyY2Utc2VsZWN0b3JcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9jb25zb2xlL3Jlc291cmNlU2lkZWJhci5udW5qXCIpLnJlZ2lvbnMsXG5cblx0cmVnaW9uczoge1xuXHRcdGxpc3RSZWdpb246IHtcblx0XHRcdGVsOiBcIi5saXN0LXJlZ2lvblwiLFxuXHRcdFx0Ly8gL3JlcGxhY2VFbGVtZW50OiB0cnVlLFxuXHRcdH0sXG5cdH0sXG5cblx0dWk6IHtcblx0XHQvL1x0XHRyZXNvdXJjZUNvbnRhaW5lcjogXCIucmVzb3VyY2UtY29udGFpbmVyXCIsXG5cdFx0c3RhdHVzQ29udGFpbmVyOiBcIi5zdGF0dXMtY29udGFpbmVyXCIsXG5cdFx0dG9wUmVnaW9uOiBcIi50b3AtcmVnaW9uXCIsXG5cdFx0ZmlsdGVyQXJlYTogXCIuZmlsdGVyLXJlZ2lvblwiLFxuXHRcdGNsZWFyRmlsdGVyc0J1dHRvbjogXCIuY2xlYXItZmlsdGVyc1wiLFxuXHRcdGNsb3NlQnV0dG9uOiBcIi5jbG9zZVwiLFxuXHRcdGxpc3RSZWdpb246IFwiLmxpc3QtcmVnaW9uXCIsXG5cdFx0bGlzdENvbnRhaW5lcjogXCIubGlzdC1jb250YWluZXJcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5jbGVhckZpbHRlcnNCdXR0b25cIjogXCJvbkNsZWFyRmlsdGVyc0J1dHRvbkNsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkuY2xvc2VCdXR0b25cIjogXCJjbG9zZVwiLFxuXHRcdGNsaWNrOiBcIm9uQ2xpY2tcIixcblx0fSxcblxuXHRjb2xsZWN0aW9uRXZlbnRzOiB7XG5cdFx0c3luYzogXCJmZXRjaGVkUmVzb3VyY2VzXCIsXG5cdFx0cmVxdWVzdDogXCJyZXF1ZXN0ZWRSZXNvdXJjZXNcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRSZXNvdXJjZUljb25zLnByZWxvYWRJbWFnZXMoKTtcblxuXHRcdGlDb2xsZWN0aW9uLmZ1bGxDb2xsZWN0aW9uLnJlc2V0KFtdKTtcblxuXHRcdHRoaXMuYmluZEV2ZW50cyhpQ29sbGVjdGlvbiwgdGhpcy5jb2xsZWN0aW9uRXZlbnRzKTtcblxuXHRcdHRoaXMub25TY3JvbGxMaXN0ID0gdGhpcy5vblNjcm9sbExpc3QuYmluZCh0aGlzKTtcblxuXHRcdC8vIEZhZGUgYW5kIGluY3JlYXNlIHRoZSByZXNvdXJjZSBzZWxlY3RvciB3aGVuIHJlc291cmNlIGRyYWdnaW5nIHN0YXJ0cyBhbmQgZW5kcywgcmVzcGVjdGl2ZWx5XG5cdFx0dGhpcy5saXN0ZW5UbyhldmVudEJ1cywgZXZlbnRCdXMuRXZlbnRzLlJlc291cmNlRHJhZ1N0YXJ0LCB0aGlzLmZhZGUuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5UbyhldmVudEJ1cywgZXZlbnRCdXMuRXZlbnRzLlJlc291cmNlRHJhZ0VuZCwgdGhpcy5pbmNyZWFzZS5iaW5kKHRoaXMpKTtcblxuXHRcdHRoaXMubGlzdGVuVG8oZXZlbnRCdXMsIGV2ZW50QnVzLkV2ZW50cy5EaXNhYmxlUmVzb3VyY2VEcmFnZ2luZywgdGhpcy5kaXNhYmxlRHJhZy5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKGV2ZW50QnVzLCBldmVudEJ1cy5FdmVudHMuRW5hYmxlUmVzb3VyY2VEcmFnZ2luZywgdGhpcy5lbmFibGVEcmFnLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8oZXZlbnRCdXMsIGV2ZW50QnVzLkV2ZW50cy5VcGRhdGVEcmFnZ2luZ1N0YXR1cywgdGhpcy51cGRhdGVEcmFnLmJpbmQodGhpcykpO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhBcHAsIEFwcC5FdmVudHMuUmVzb3VyY2VDcmVhdGVkLCB0aGlzLmFkZFJlc291cmNlLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8oZXZlbnRCdXMsIGV2ZW50QnVzLkV2ZW50cy5GaW5kUmVzb3VyY2UsIHRoaXMub25GaW5kUmVzb3VyY2UuYmluZCh0aGlzKSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKGV2ZW50QnVzLCBldmVudEJ1cy5FdmVudHMuVmlld0NoYW5nZWQsIHRoaXMudmlld0NoYW5nZWQuYmluZCh0aGlzKSk7XG5cblx0XHR0aGlzLmluaXRpYWxGZXRjaCA9IHRydWU7XG5cdH0sXG5cblx0cmVxdWVzdGVkUmVzb3VyY2VzOiBmdW5jdGlvbigpIHtcblx0XHQkKFwiLmVvbFwiKS5yZW1vdmUoKTtcblx0XHQkKFwiLnJlc291cmNlcy1vdmVybGF5XCIpLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRmZXRjaGVkUmVzb3VyY2VzOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5zcGVjaWZpY1Jlc291cmNlKSB7XG5cdFx0XHR0aGlzLmZldGNoU3BlY2lmaWNSZXNvdXJjZSgpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmluaXRpYWxGZXRjaCkge1xuXHRcdFx0dGhpcy5maWx0ZXIudXBkYXRlU2VydmVyRmlsdGVycygpO1xuXHRcdFx0dGhpcy5pbml0aWFsRmV0Y2ggPSBmYWxzZTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQkKFwiLnJlc291cmNlcy1vdmVybGF5XCIpLmFkZENsYXNzKFwiaGlkZVwiKTtcblxuXHRcdGlmICh0aGlzLnVpLmxpc3RSZWdpb24uaGVpZ2h0KCkgPiAkKFwiLmxpc3QtY29udGFpbmVyXCIpLmhlaWdodCgpICYmICFpQ29sbGVjdGlvbi5nZXQoXCJmZXRjaGluZ1wiKSAmJiBpQ29sbGVjdGlvbi5oYXNOZXh0UGFnZSgpKSB7XG5cdFx0XHQvLyBJZiB3ZSBjYW4ndCBzY3JvbGwgdGhlbiBmaWxsIHVwIHRoZSBsaXN0XG5cdFx0XHRpQ29sbGVjdGlvbi5nZXROZXh0UGFnZSgpO1xuXHRcdH1cblx0XHRlbHNlIGlmICghaUNvbGxlY3Rpb24uaGFzTmV4dFBhZ2UoKSkge1xuXHRcdFx0Ly8gQWRkIGFuIGVsZW1lbnQgdG8gaW5kaWNhdGUgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgY29udGVudFxuXHRcdFx0JChcIi5lb2xcIikucmVtb3ZlKCk7XG5cdFx0XHQkKFwiLmxpc3QtY29udGFpbmVyXCIpLmFwcGVuZCgkKFwiPGRpdiBjbGFzcz0nZW9sJz5ObyBmdXJ0aGVyIGNvbnRlbnQgdG8gc2hvdyBtYXRjaGluZyB0aG9zZSBmaWx0ZXJzPC9kaXY+XCIpKTtcblx0XHR9XG5cdH0sXG5cblx0YWRkUmVzb3VyY2U6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0Ly8gQWRkIGl0IGF0IHRoZSB0b3AgZm9yIGNvbnZlbmllbnQgaW1tZWRpYXRlIGFjY2Vzc1xuXHRcdGlDb2xsZWN0aW9uLmFkZChtb2RlbCwgeyBhdDogMCB9KTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgcmVzb3VyY2VzID0gbmV3IFJlc291cmNlTGlzdCgpO1xuXG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwibGlzdFJlZ2lvblwiLCByZXNvdXJjZXMpO1xuXG5cdFx0JChcIi5saXN0LWNvbnRhaW5lclwiKS5hcHBlbmQoJChgPGRpdiBjbGFzcz1cInJlc291cmNlcy1vdmVybGF5IGhpZGVcIj5cblx0XHRcdDxzcGFuIGNsYXNzPVwic3Bpbm5lci1pY29uIHNwaW5uZXItcmVkXCIvPiBGZXRjaGluZyBkYXRhLi4uPC9kaXY+YCkpO1xuXG5cdFx0Y29uc3QgdGV4dEZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwidGV4dFwiLFxuXHRcdFx0bmFtZTogXCJ0ZXh0RmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJUZXh0IFNlYXJjaFwiLFxuXHRcdFx0ZGVib3VuY2U6IDIwMCxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgbGFuZ3VhZ2VGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcImxhbmd1YWdlRmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJMYW5ndWFnZVwiLFxuXHRcdFx0Y2F0ZWdvcmllczogW1xuXHRcdFx0XHR7IGl0ZW1zOiBzZXR0aW5ncy5sYW5ndWFnZUxpc3QgfSxcblx0XHRcdF0sXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdGNvbnN0IHN1YmplY3RGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcInN1YmplY3RGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlN1YmplY3RcIixcblx0XHRcdHNlcnZlcjoge1xuXHRcdFx0XHRrZXk6IFwic3ViamVjdF9pZFwiLFxuXHRcdFx0XHR2YWx1ZTogXCJzdWJqZWN0XCIsXG5cdFx0XHRcdGZldGNoOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9kYXRhL3N1YmplY3RzXCIsXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdHBhZ2VTaXplOiAzMCxcblx0XHRcdFx0aW5maW5pdGU6IHRydWUsXG5cdFx0XHR9LFxuXHRcdH07XG5cblx0XHRjb25zdCBncmFkZUZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiaXRlbWl6ZWRcIixcblx0XHRcdG5hbWU6IFwiZ3JhZGVGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlllYXIgb2YgU3R1ZHlcIixcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHRcdGNhdGVnb3JpZXM6IF8ubWFwKHNldHRpbmdzLmdyYWRlTGlzdCwgKHZhbCwga2V5KSA9PiAoe1xuXHRcdFx0XHRsYWJlbDoga2V5LFxuXHRcdFx0XHRpdGVtczogXy5yZWR1Y2UodmFsLnNvcnQoKGEsIGIpID0+XG5cdFx0XHRcdFx0KFwibGV4aWNhbFwiIGluIGEgPyBhLmxleGljYWwgOiBhLm5hbWUpLnRvVXBwZXJDYXNlKCkubG9jYWxlQ29tcGFyZSgoXCJsZXhpY2FsXCIgaW4gYiA/IGIubGV4aWNhbCA6IGIubmFtZSkudG9VcHBlckNhc2UoKSlcblx0XHRcdFx0KSwgKHN1bSwgbnVtKSA9PiB7XG5cdFx0XHRcdFx0c3VtLnB1c2goeyBuYW1lOiBudW0udmFsdWUsIGxhYmVsOiBudW0ubmFtZSB9KTtcblx0XHRcdFx0XHRyZXR1cm4gc3VtO1xuXHRcdFx0XHR9LCBbXSksXG5cdFx0XHR9KSksXG5cdFx0fTtcblxuXHRcdGxldCBjYXRlZ29yaWVzID0gW1xuXHRcdFx0eyBuYW1lOiBcImFzc2Vzc21lbnRcIiwgbGFiZWw6IFwiQXNzZXNzbWVudFwiLCBpbWFnZTogc2V0dGluZ3MudXJsUm9vdCArIFwiL2ltYWdlcy9jb250ZW50L2Fubm90YXRpb25faW50ZXJhY3RpdmUucG5nXCIgfSxcblx0XHRcdHsgbmFtZTogXCJhdWRpb1wiLCBsYWJlbDogXCJBdWRpb1wiLCBpbWFnZTogc2V0dGluZ3MudXJsUm9vdCArIFwiL2ltYWdlcy9jb250ZW50L2Fubm90YXRpb25fbXAzLnBuZ1wiIH0sXG5cdFx0XHR7IG5hbWU6IFwiZmxhc2hjYXJkZGVja1wiLCBsYWJlbDogXCJGbGFzaGNhcmQgRGVja1wiLCBpbWFnZTogc2V0dGluZ3MudXJsUm9vdCArIFwiL2ltYWdlcy9jb250ZW50L2Fubm90YXRpb25fZmxhc2hjYXJkcy5wbmdcIiB9LFxuXHRcdFx0eyBuYW1lOiBcImltYWdlXCIsIGxhYmVsOiBcIkltYWdlXCIsIGltYWdlOiBzZXR0aW5ncy51cmxSb290ICsgXCIvaW1hZ2VzL2NvbnRlbnQvYW5ub3RhdGlvbl9ncmFwaGljLnBuZ1wiIH0sXG5cdFx0XHR7IG5hbWU6IFwicGRmXCIsIGxhYmVsOiBcIlBERlwiLCBpbWFnZTogc2V0dGluZ3MudXJsUm9vdCArIFwiL2ltYWdlcy9jb250ZW50L2Fubm90YXRpb25fcGRmLnBuZ1wiIH0sXG5cdFx0XHR7IG5hbWU6IFwidGV4dFwiLCBsYWJlbDogXCJUZXh0XCIsIGltYWdlOiBzZXR0aW5ncy51cmxSb290ICsgXCIvaW1hZ2VzL2NvbnRlbnQvYW5ub3RhdGlvbl90ZXh0LnBuZ1wiIH0sXG5cdFx0XHR7IG5hbWU6IFwidXJsXCIsIGxhYmVsOiBcIlVSTFwiLCBpbWFnZTogc2V0dGluZ3MudXJsUm9vdCArIFwiL2ltYWdlcy9jb250ZW50L2Fubm90YXRpb25fdXJsLnBuZ1wiIH0sXG5cdFx0XHR7IG5hbWU6IFwidmlkZW9cIiwgbGFiZWw6IFwiVmlkZW9cIiwgaW1hZ2U6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9pbWFnZXMvY29udGVudC9hbm5vdGF0aW9uX3ZpZGVvLnBuZ1wiIH0sXG5cdFx0XTtcblxuXHRcdGlmIChzZXR0aW5ncy5vZmZpY2VDb250ZW50KSB7XG5cdFx0XHRjYXRlZ29yaWVzLnB1c2goeyBuYW1lOiBcImV4Y2VsXCIsIGxhYmVsOiBcIk1TIEV4Y2VsXCIsIGltYWdlOiBzZXR0aW5ncy51cmxSb290ICsgXCIvaW1hZ2VzL2NvbnRlbnQvYW5ub3RhdGlvbl9leGNlbC5wbmdcIiB9LFxuXHRcdFx0XHR7IG5hbWU6IFwicG93ZXJwb2ludFwiLCBsYWJlbDogXCJNUyBQb3dlclBvaW50XCIsIGltYWdlOiBzZXR0aW5ncy51cmxSb290ICsgXCIvaW1hZ2VzL2NvbnRlbnQvYW5ub3RhdGlvbl9wb3dlcnBvaW50LnBuZ1wiIH0sXG5cdFx0XHRcdHsgbmFtZTogXCJ3b3JkXCIsIGxhYmVsOiBcIk1TIFdvcmRcIiwgaW1hZ2U6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9pbWFnZXMvY29udGVudC9hbm5vdGF0aW9uX3dvcmQucG5nXCIgfSk7XG5cdFx0fVxuXG5cdFx0Y2F0ZWdvcmllcyA9IF8uc29ydEJ5KGNhdGVnb3JpZXMsIGMgPT4gYy5sYWJlbCk7XG5cblx0XHRjb25zdCB0eXBlRmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJ0eXBlRmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJUeXBlXCIsXG5cdFx0XHRjYXRlZ29yaWVzOiBbXG5cdFx0XHRcdHsgaXRlbXM6IGNhdGVnb3JpZXMgfSxcblx0XHRcdF0sXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0XHRpY29uczogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgY3VycmVudGx5VXNlZCA9IHtcblx0XHRcdHR5cGU6IFwidG9nZ2xlXCIsXG5cdFx0XHRuYW1lOiBcImN1cnJlbnRVc2VcIixcblx0XHRcdGxhYmVsOiBcIkN1cnJlbnRseSBVc2VkXCIsXG5cdFx0XHRpbml0aWFsVmFsdWU6ICgpID0+IFt0cnVlXSxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3Qgb3duQ29udGVudCA9IHtcblx0XHRcdHR5cGU6IFwidG9nZ2xlXCIsXG5cdFx0XHRuYW1lOiBcIm93bkNvbnRlbnRcIixcblx0XHRcdGxhYmVsOiBcIk9ubHkgbXkgY29udGVudFwiLFxuXHRcdFx0aW5pdGlhbFZhbHVlOiAoKSA9PiBbdHJ1ZV0sXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdGNvbnN0IGN1cnJlbnRZZWFyID0ge1xuXHRcdFx0dHlwZTogXCJ0b2dnbGVcIixcblx0XHRcdG5hbWU6IFwiY3VycmVudFllYXJcIixcblx0XHRcdGxhYmVsOiBcIkN1cnJlbnQgeWVhcidzIGNvbnRlbnRcIixcblx0XHRcdGluaXRpYWxWYWx1ZTogKCkgPT4gW3RydWVdLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdH07XG5cblx0XHRjb25zdCBmaWx0ZXJMaXN0ID0gW3RleHRGaWx0ZXIsIGxhbmd1YWdlRmlsdGVyLCBzdWJqZWN0RmlsdGVyLCBncmFkZUZpbHRlciwgdHlwZUZpbHRlciwgb3duQ29udGVudCwgY3VycmVudFllYXIsIGN1cnJlbnRseVVzZWRdO1xuXG5cdFx0dGhpcy5maWx0ZXIgPSBuZXcgU2VydmVyRmlsdGVyTWFuYWdlcih7XG5cdFx0XHRyYXc6IGlDb2xsZWN0aW9uLFxuXHRcdFx0ZmlsdGVyQ29udGFpbmVyOiB0aGlzLnVpLmZpbHRlckFyZWEsXG5cdFx0XHRmaWx0ZXJzOiBmaWx0ZXJMaXN0LFxuXHRcdFx0ZGVmYXVsdEZpbHRlcnM6IFtcInRleHRGaWx0ZXJcIiwgXCJvd25Db250ZW50XCIsIFwiY3VycmVudFllYXJcIl0sXG5cdFx0fSk7XG5cblx0XHR0aGlzLnVpLmZpbHRlckFyZWEucHJlcGVuZCh0aGlzLmZpbHRlci5yZW5kZXIoKS5lbCk7XG5cblx0XHR0aGlzLnVpLnN0YXR1c0NvbnRhaW5lci5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS50b3BSZWdpb24ucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkuZmlsdGVyQXJlYS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0Y2xvc2U6IGZ1bmN0aW9uKCkge1xuXHRcdGlDb2xsZWN0aW9uLnF1ZXJ5UGFyYW1zLnJlc291cmNlRmlsdGVyID0gbnVsbDtcblx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5DbG9zZVJlc291cmNlcyk7XG5cblx0XHRpZiAodGhpcy5GaWx0ZXJNYW5hZ2VyKVxuXHRcdFx0dGhpcy5GaWx0ZXJNYW5hZ2VyLmhpZGVBbGxGaWx0ZXJMaXN0cygpO1xuXHR9LFxuXG5cdG9uQ2xpY2s6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0Ly8gUHJldmVudCBjbGljayBldmVudHMgZnJvbSBwcm9wYWdhdGluZyBvdXQgb2YgdGhlIHJlc291cmNlIHNlbGVjdG9yIGFuZCBjbG9zaW5nIHRoZVxuXHRcdC8vIHJlc291cmNlIHNlbGVjdG9yXG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHQvLyBDbG9zZSBhbnkgb3BlbiBmaWx0ZXJzXG5cdFx0aWYgKHRoaXMuRmlsdGVyTWFuYWdlcilcblx0XHRcdHRoaXMuRmlsdGVyTWFuYWdlci5oaWRlQWxsRmlsdGVyTGlzdHMoKTtcblx0fSxcblxuXHRzaG93OiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBib29rID0gZXZlbnRCdXMucmVxdWVzdChldmVudEJ1cy5FdmVudHMuR2V0Q3VycmVudEJvb2spO1xuXHRcdGNvbnN0IGxwID0gZXZlbnRCdXMucmVxdWVzdChldmVudEJ1cy5FdmVudHMuR2V0Q3VycmVudEdyb3VwKTtcblxuXHRcdGlDb2xsZWN0aW9uLnF1ZXJ5UGFyYW1zLmlkID0gYm9vay5nZXQoXCJ1bml2ZXJzYWxfaWRcIikgfHwgbHAuZ2V0KFwiX2lkXCIpO1xuXHRcdGlDb2xsZWN0aW9uLnF1ZXJ5UGFyYW1zLnR5cGUgPSBfLnN0YXJ0c1dpdGgoaUNvbGxlY3Rpb24ucXVlcnlQYXJhbXMuaWQsIFwiYm9vay1cIikgPyBcImJvb2tcIiA6IFwibHBcIjtcblxuXHRcdGlDb2xsZWN0aW9uLmZ1bGxDb2xsZWN0aW9uLnJlc2V0KFtdKTtcblx0XHR0aGlzLmZpbHRlci51cGRhdGVTZXJ2ZXJGaWx0ZXJzKCk7XG5cdFx0dGhpcy5pbml0aWFsRmV0Y2ggPSBmYWxzZTtcblxuXHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHQkKFwiLmxpc3QtcmVnaW9uXCIpLm9uKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGxMaXN0KTtcblx0fSxcblxuXHRoaWRlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcImhpZGVcIik7XG5cblx0XHRpZiAodGhpcy5GaWx0ZXJNYW5hZ2VyKVxuXHRcdFx0dGhpcy5GaWx0ZXJNYW5hZ2VyLmhpZGVBbGxGaWx0ZXJMaXN0cygpO1xuXHR9LFxuXG5cdGRpc2FibGVEcmFnOiBmdW5jdGlvbigpIHtcblx0XHRkcmFnZ2luZ0FsbG93ZWQgPSBmYWxzZTtcblx0fSxcblxuXHRlbmFibGVEcmFnOiBmdW5jdGlvbigpIHtcblx0XHRkcmFnZ2luZ0FsbG93ZWQgPSB0cnVlO1xuXHR9LFxuXG5cdHZpZXdDaGFuZ2VkOiBmdW5jdGlvbih2aWV3KSB7XG5cdFx0aWYgKHZpZXcgPT09IFwiYm9va3NcIiB8fCB2aWV3ID09PSBcImxlYXJuaW5nUGF0aFwiKVxuXHRcdFx0dGhpcy5maWx0ZXIucmVzZXRGaWx0ZXJzKCk7XG5cdH0sXG5cblx0dXBkYXRlRHJhZzogZnVuY3Rpb24oc3RhdHVzKSB7XG5cdFx0ZHJhZ2dpbmdBbGxvd2VkID0gc3RhdHVzO1xuXHR9LFxuXG5cdC8vIFRoZSByZXNvdXJjZSBzaWRlYmFyIGlzIHNocnVua2VuIHRvIGNvbXBlbnNhdGUgZm9yIENocm9tZSdzIG5lZWQgdG8gaGF2ZSB0aGUgc291cmNlIG9mXG5cdC8vIGEgZHJhZyBvcGVyYXRpb24gcHJlc2VudCBpbiB0aGUgdmlldyBwb3J0LlxuXHRmYWRlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC5jc3MoeyBvcGFjaXR5OiBcIjBcIiB9KTtcblxuXHRcdC8vIFJlZGlyZWN0IGFsbCBtb3VzZSBldmVudHMgdG8gdGhlIGJvb2sgb3ZlcmxheVxuXHRcdC8vIHNvIHRoYXQgdGhleSBjYW4gYWN0dWFsbHkgZG8gc29tZXRoaW5nXG5cdFx0dGhpcy4kZWwub24oXCJtb3VzZW1vdmUuZHJhZ2dpbmdSZXNvdXJjZSBtb3VzZXVwLmRyb3BwZWRSZXNvdXJjZVwiLCBldnQgPT4ge1xuXHRcdFx0aWYgKCQoXCIjYm9vay1vdmVybGF5XCIpLmxlbmd0aClcblx0XHRcdFx0JChcIiNib29rLW92ZXJsYXlcIikudHJpZ2dlcihldnQpO1xuXG5cdFx0XHRpZiAoJChcIiNscC1vdmVybGF5XCIpLmxlbmd0aClcblx0XHRcdFx0JChcIiNscC1vdmVybGF5XCIpLnRyaWdnZXIoZXZ0KTtcblx0XHR9KTtcblxuXHRcdGlmICh0aGlzLkZpbHRlck1hbmFnZXIpXG5cdFx0XHR0aGlzLkZpbHRlck1hbmFnZXIuaGlkZUFsbEZpbHRlckxpc3RzKCk7XG5cdH0sXG5cblx0aW5jcmVhc2U6IGZ1bmN0aW9uKCkge1xuXHRcdHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLiRlbC5jc3MoeyBvcGFjaXR5OiBcIjFcIiB9KTsgfSwgNTAwKTtcblx0XHR0aGlzLiRlbC5vZmYoXCJtb3VzZW1vdmUuZHJhZ2dpbmdSZXNvdXJjZSBtb3VzZXVwLmRyb3BwZWRSZXNvdXJjZVwiKTtcblx0fSxcblxuXHRvblNjcm9sbExpc3Q6IF8udGhyb3R0bGUoZXZ0ID0+IHtcblx0XHQvKiBlc2xpbnQtZGlzYWJsZSBuby1pbnZhbGlkLXRoaXMgKi9cblx0XHRjb25zdCBzY3JvbGxQb3MgPSBldnQuY3VycmVudFRhcmdldC5zY3JvbGxUb3AgKyAkKFwiLmxpc3QtcmVnaW9uXCIpLmhlaWdodCgpO1xuXHRcdGNvbnN0IGhlaWdodCA9IGV2dC5jdXJyZW50VGFyZ2V0LnNjcm9sbEhlaWdodDtcblxuXHRcdGlmIChzY3JvbGxQb3MgLyBoZWlnaHQgPiAwLjkgJiYgIWlDb2xsZWN0aW9uLmdldChcImZldGNoaW5nXCIpICYmIGlDb2xsZWN0aW9uLmhhc05leHRQYWdlKCkpXG5cdFx0XHRpQ29sbGVjdGlvbi5nZXROZXh0UGFnZSgpO1xuXG5cdFx0LyogZXNsaW50LWVuYWJsZSBuby1pbnZhbGlkLXRoaXMgKi9cblx0fSwgMjUpLFxuXG5cdG9uQ2xlYXJGaWx0ZXJzQnV0dG9uQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdGlDb2xsZWN0aW9uLnF1ZXJ5UGFyYW1zLnJlc291cmNlRmlsdGVyID0gbnVsbDtcblx0XHR0aGlzLmZpbHRlci5yZXNldEZpbHRlcnMoKTtcblx0XHR0aGlzLmZpbHRlci51cGRhdGVTZXJ2ZXJGaWx0ZXJzKCk7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcoZXZlbnRCdXMpO1xuXHRcdHRoaXMuZmlsdGVyLmRlc3Ryb3koKTtcblx0fSxcblxuXHRvbkZpbmRSZXNvdXJjZTogZnVuY3Rpb24ocmVzb3VyY2UpIHtcblx0XHR0aGlzLnNwZWNpZmljUmVzb3VyY2UgPSByZXNvdXJjZS5nZXQoXCJfaWRcIik7XG5cdH0sXG5cblx0ZmV0Y2hTcGVjaWZpY1Jlc291cmNlOiBmdW5jdGlvbigpIHtcblx0XHRpQ29sbGVjdGlvbi5xdWVyeVBhcmFtcy5yZXNvdXJjZUZpbHRlciA9IHRoaXMuc3BlY2lmaWNSZXNvdXJjZTtcblx0XHRpQ29sbGVjdGlvbi5mdWxsQ29sbGVjdGlvbi5yZXNldChbXSk7XG5cdFx0dGhpcy5pbml0aWFsRmV0Y2ggPSBmYWxzZTtcblx0XHRpQ29sbGVjdGlvbi5nZXRGaXJzdFBhZ2UoKTtcblx0XHRkZWxldGUgdGhpcy5zcGVjaWZpY1Jlc291cmNlO1xuXHR9LFxufSk7Il19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar $ = require(\"jquery\");\nvar rester = require(\"rester\");\nvar _ = require(\"lodash\");\nvar raygun = require(\"raygun\");\nvar Promise = require(\"bluebird\");\nvar moment = require(\"moment\");\nvar tippy = require(\"tippy.js\").default;\n\nvar settings = require(\"app-settings\");\nvar App = require(\"../../../index\");\nvar SimpleMenu = require(\"../../../lib/simpleMenu\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar eventBus = require(\"./eventBus\");\nvar ResourceSidebar = require(\"./resourceSidebar\");\nvar GroupModal = require(\"./groupModal\");\nvar ResourceModal = require(\"../../../lib/resourceModal\");\nvar EventModal = require(\"../../../lib/eventModal\");\nvar Resource = require(\"../../../content/models/manager/resourceModel\");\nvar Event = require(\"../../../lib/eventModel\");\nvar AssessmentModal = require(\"../../../lib/assessmentModal\");\nvar Assessment = require(\"../../../lib/assessmentModel\");\n\nvar Group = Backbone.Model.extend({\n\tdefaults: {},\n\tidAttribute: \"code\"\n});\n\nvar GroupCollection = Backbone.Collection.extend({\n\tmodel: Group,\n\n\tinitialize: function initialize(models, options) {\n\t\tthis.item_id = options.item_id;\n\t},\n\n\turl: function url() {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\t\treturn settings.urlRoot + \"/acacia/users/\" + encodeURIComponent(user.username) + \"/enrolment?withPrivate=true&item_id=\" + this.item_id;\n\t},\n\n\tcomparator: function comparator(model) {\n\t\treturn model.get(\"name\");\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"sidebar-region\",\n\ttemplate: require(\"../../templates/console/sidebar.nunj\"),\n\n\tui: {\n\t\top: \".op\",\n\t\thome: \".op-home\",\n\t\toptions: \".op-options\",\n\t\tnavigation: \".op-nav\",\n\t\tresources: \".op-resources\",\n\t\tcreate: \".op-create\",\n\t\tflashCard: \".op-flash-card\",\n\t\tgroups: \".op-groups\",\n\t\thelp: \".op-help\",\n\t\tcam: \".op-cam\"\n\t},\n\n\tevents: {\n\t\tclick: \"onClick\",\n\t\t\"click @ui.navigation\": \"onNavigationClick\",\n\t\t\"click @ui.resources\": \"onResourcesClick\",\n\t\t\"click @ui.groups\": \"onGroupsClick\",\n\t\t\"click @ui.home\": \"onHomeClick\",\n\t\t\"click @ui.create\": \"onCreateClick\",\n\t\t\"click @ui.flashCard\": \"onFlashCardClick\",\n\t\t\"click @ui.cam\": \"onCamClick\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.views = {};\n\t\tthis.state = {};\n\n\t\tthis.listenTo(eventBus, eventBus.Events.LoadNavigation, this.loadNav.bind(this));\n\t\tthis.listenTo(eventBus, eventBus.Events.UnloadBook, this.unloadNav.bind(this));\n\t\tthis.listenTo(eventBus, eventBus.Events.UnloadLearningPath, this.unloadNav.bind(this));\n\n\t\tthis.listenTo(eventBus, eventBus.Events.CloseNavigation, this.toggle.bind(this, \"navigation\", false));\n\t\tthis.listenTo(eventBus, eventBus.Events.OpenNavigation, this.toggle.bind(this, \"navigation\", true));\n\n\t\tthis.listenTo(eventBus, eventBus.Events.CloseResources, this.toggle.bind(this, \"resources\", false));\n\t\tthis.listenTo(eventBus, eventBus.Events.OpenResources, this.toggle.bind(this, \"resources\", true));\n\n\t\tthis.listenTo(eventBus, eventBus.Events.DisableResourceDragging, this.disableResourceButton.bind(this));\n\t\tthis.listenTo(eventBus, eventBus.Events.EnableResourceDragging, this.enableResourceButton.bind(this));\n\n\t\tthis.listenTo(eventBus, eventBus.Events.ViewChanged, this.viewChanged.bind(this));\n\t\tthis.listenTo(eventBus, eventBus.Events.ViewLoaded, this.onViewLoaded.bind(this));\n\t\tthis.listenTo(eventBus, eventBus.Events.GroupsChanged, this.handleGroupChange.bind(this));\n\n\t\tthis.listenTo(eventBus, eventBus.Events.LPViewChanged, this.changeLPView.bind(this));\n\n\t\tthis.listenTo(eventBus, eventBus.Events.HideFlashCardWidget, this.onFlashCardWidgetHide.bind(this));\n\n\t\teventBus.reply(eventBus.Events.GetAllowedGroups, this.getAllowedGroups.bind(this));\n\t\teventBus.reply(eventBus.Events.GetCurrentGroups, this.getCurrentGroups.bind(this));\n\t\teventBus.on(eventBus.Events.ShowGroupModal, this.chooseGroups.bind(this));\n\t},\n\n\tviewChanged: function viewChanged(view, params) {\n\t\tthis.unloadGroups();\n\n\t\tthis.LastView = view;\n\t\tswitch (view) {\n\t\t\tcase \"books\":\n\t\t\t\tthis.loadGroups(params);\n\t\t\t\tthis.currentPage = params.book && params.book.collection ? params.book.collection.state.currentPage : null;\n\t\t\t\tbreak;\n\n\t\t\tcase \"learningPath\":\n\t\t\t\tthis.loadGroups(params);\n\t\t\t\teventBus.trigger(eventBus.Events.EnableResourceDragging);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthis.ui.flashCard.addClass(\"disabled\");\n\t\t\t\tthis.toggle(\"resources\", false);\n\t\t\t\teventBus.trigger(eventBus.Events.DisableResourceDragging);\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.ui.home.addClass(\"disabled\");\n\t\tvar instance = this.ui.home.get(0)._tippy;\n\t\tinstance.disable();\n\t},\n\n\tonViewLoaded: function onViewLoaded() {\n\t\tvar homeButtonTitle = void 0;\n\n\t\tswitch (this.LastView) {\n\t\t\tcase \"books\":\n\t\t\t\tthis.lpMode = null;\n\t\t\t\thomeButtonTitle = \"Back to book selector\";\n\t\t\t\tthis.ui.flashCard.removeClass(\"disabled\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"learningPath\":\n\t\t\t\thomeButtonTitle = \"Back to learning paths\";\n\t\t\t\tif (!this.lpMode) this.ui.flashCard.removeClass(\"disabled\");\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthis.lpMode = null;\n\t\t\t\thomeButtonTitle = \"Back\";\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.ui.home.attr(\"data-title\", homeButtonTitle);\n\t\tthis.ui.home.removeClass(\"disabled\");\n\n\t\tvar instance = this.ui.home.get(0)._tippy;\n\t\tinstance.setContent(homeButtonTitle);\n\t\tinstance.enable();\n\t},\n\n\tchangeLPView: function changeLPView(mode) {\n\t\tthis.lpMode = mode;\n\n\t\tif (mode) {\n\t\t\tthis.ui.resources.addClass(\"disabled\");\n\t\t\tthis.ui.groups.addClass(\"disabled\");\n\t\t\tthis.ui.create.addClass(\"disabled\");\n\t\t\tthis.ui.flashCard.addClass(\"disabled\");\n\t\t} else {\n\t\t\tthis.ui.resources.removeClass(\"disabled\");\n\t\t\tthis.ui.groups.removeClass(\"disabled\");\n\t\t\tthis.ui.create.removeClass(\"disabled\");\n\t\t\tthis.ui.flashCard.removeClass(\"disabled\");\n\t\t}\n\t},\n\n\tonFlashCardWidgetHide: function onFlashCardWidgetHide() {\n\t\tif (!this.lpMode) this.ui.flashCard.removeClass(\"disabled\");\n\t},\n\n\tgoHome: function goHome() {\n\t\tswitch (this.LastView) {\n\t\t\tcase \"books\":\n\t\t\t\tthis.ui.flashCard.addClass(\"disabled\");\n\t\t\t\tradio.trigger(App.Events.Commands.Navigate, settings.urlRoot + \"/console/books\" + (this.currentPage ? \"?page=\" + this.currentPage : \"\"));\n\t\t\t\tbreak;\n\n\t\t\tcase \"learningPath\":\n\t\t\t\tthis.ui.flashCard.addClass(\"disabled\");\n\t\t\t\tradio.trigger(App.Events.Commands.Navigate, settings.urlRoot + \"/console/learningPaths\");\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\t},\n\n\tonRender: _.noop(),\n\n\tonAttach: function onAttach() {\n\t\tthis.resources = new ResourceSidebar();\n\t\tthis.loadResources();\n\n\t\tthis.addTooltip(\"navigation\");\n\t\tthis.addTooltip(\"groups\");\n\t\tthis.addTooltip(\"flashCard\");\n\t\tthis.addTooltip(\"cam\");\n\t\tthis.addTooltip(\"home\");\n\t},\n\n\tonBeforeDetach: function onBeforeDetach() {\n\t\tthis.resources.destroy();\n\t},\n\n\taddTooltip: function addTooltip(op) {\n\t\tif (this.ui[op].get(0)) {\n\t\t\ttippy(this.ui[op].get(0), {\n\t\t\t\ttheme: \"black\",\n\t\t\t\tplacement: \"right\",\n\t\t\t\tarrow: true,\n\t\t\t\tcontent: this.ui[op].attr(\"data-title\")\n\t\t\t});\n\t\t}\n\t},\n\n\tloadResources: function loadResources() {\n\t\t$(\"#body-container-left-margin\").append(this.resources.render().el);\n\t\tif (!this.ui.resources.removeClass) return;\n\n\t\tif (!this.lpMode) {\n\t\t\tthis.ui.resources.removeClass(\"disabled\");\n\t\t\tthis.ui.create.removeClass(\"disabled\");\n\t\t}\n\n\t\tthis.addTooltip(\"resources\");\n\t\tthis.addTooltip(\"create\");\n\t},\n\n\tcreateItems: function createItems(evt) {\n\t\tvar _this = this;\n\n\t\tevt.stopPropagation();\n\n\t\tif (this.createMenu) {\n\t\t\tthis.createMenu.destroy();\n\t\t\tthis.createMenu = null;\n\t\t\treturn;\n\t\t}\n\n\t\tvar els = [{ text: \"Add new resource\", id: \"addResource\" }];\n\t\tif (settings.assessments) els.push({ text: \"Add new assessment / survey\", id: \"addAssessment\" });\n\t\t//els.push({ text: \"Add new event\", id: \"addEvent\" });\n\n\t\tvar Menu = new SimpleMenu({\n\t\t\tanchor: this.ui.create,\n\t\t\tside: \"right\",\n\t\t\tnextTo: true,\n\t\t\thost: $(\"#link-resources\"),\n\t\t\tstructure: [{\n\t\t\t\tcloseOnClick: true,\n\t\t\t\telements: els\n\t\t\t}]\n\t\t});\n\n\t\tMenu.on(\"clicked:addResource\", this.onAddResourceClicked.bind(this));\n\t\tMenu.on(\"clicked:addAssessment\", this.onAddAssessmentClicked.bind(this));\n\t\tMenu.on(\"clicked:addEvent\", this.onAddEventClicked.bind(this));\n\n\t\tMenu.listenTo(eventBus, eventBus.Events.CloseSimpleMenus, function () {\n\t\t\t_this.createMenu = null;Menu.destroy();\n\t\t});\n\n\t\tthis.listenTo(Menu, \"closing\", function () {\n\t\t\t_this.createMenu = null;\n\t\t});\n\n\t\tMenu.show();\n\t\tthis.createMenu = Menu;\n\t},\n\n\tfetchSuccess: function fetchSuccess(param, groups) {\n\t\tthis.groups = groups;\n\n\t\tif (this.groups) {\n\t\t\tif (param.book) return this.loadBookGroups(param);\n\t\t\tif (param.learningPath) return this.loadLpGroups(param);\n\t\t}\n\t},\n\n\tfetchError: function fetchError(param, err) {\n\t\tif (!settings.debug || settings.reportErrors) raygun(\"send\", err);\n\t\tconsole.error(err);\n\t},\n\n\tloadGroups: function loadGroups(param) {\n\t\t// Start fetching all the JSON we need\n\t\t// We ignore errors for the following items because the user might not have permission for them\n\t\teventBus.Cache.Groups = Promise.resolve(new GroupCollection([], {\n\t\t\titem_id: param.book ? param.book.get(\"_id\") : param.learningPath.get(\"_id\")\n\t\t}).lazyFetch()).catch(function () {\n\t\t\treturn [];\n\t\t});\n\n\t\treturn eventBus.Cache.Groups.then(this.fetchSuccess.bind(this, param)).catch(this.fetchError.bind(this, param));\n\t},\n\n\tisOld: function isOld(groupModel) {\n\t\tif (groupModel.get(\"start\") === 0 && groupModel.get(\"end\") === 2147483647) return false;\n\n\t\treturn groupModel.get(\"end\") < moment().unix();\n\t},\n\n\tloadBookGroups: function loadBookGroups(param) {\n\t\tvar _this2 = this;\n\n\t\t// Figure out the groups for this book\n\t\tvar c = param.book.get(\"groups\") || [];\n\t\tvar hc = param.book.get(\"customGroups\") || [];\n\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\t\tvar allForBook = this.groups.reduce(function (sum, item) {\n\t\t\tif (_.includes(c, item.get(\"code\")) && !item.get(\"systemGroup\")) sum[item.get(\"code\")] = item.toJSON();\n\t\t\treturn sum;\n\t\t}, {});\n\n\t\tif (param.book.get(\"groups\") === null) {\n\t\t\t// Book is assigned to everyone\n\n\t\t\tthis.allowedGroups = {\n\t\t\t\tsystem: {},\n\t\t\t\tcustom: {},\n\t\t\t\tall: {},\n\t\t\t\tchangeAllowed: false,\n\t\t\t\tattachAllowed: true\n\t\t\t};\n\t\t} else if (rester.hasAccess(rester.p.groups.all, user)) {\n\t\t\tc = this.groups.filter(function (item) {\n\t\t\t\treturn !_this2.isOld(item) && _.includes(c, item.get(\"code\"));\n\t\t\t});\n\t\t\thc = this.groups.filter(function (item) {\n\t\t\t\treturn !_this2.isOld(item) && _.includes(hc, item.get(\"code\"));\n\t\t\t});\n\n\t\t\tthis.allowedGroups = {\n\t\t\t\tsystem: _.reduce(c, function (sum, num) {\n\t\t\t\t\tsum[num.get(\"code\")] = num.toJSON();return sum;\n\t\t\t\t}, {}),\n\t\t\t\tcustom: _.reduce(hc, function (sum, num) {\n\t\t\t\t\tsum[num.get(\"code\")] = num.toJSON();return sum;\n\t\t\t\t}, {}),\n\t\t\t\tall: allForBook,\n\t\t\t\tchangeAllowed: c.length > 0\n\t\t\t};\n\t\t} else {\n\t\t\tvar myGroups = (user.groups || []).concat(user.customGroups || []);\n\n\t\t\tvar normal = _.intersection(myGroups, c || []);\n\t\t\tvar custom = _.intersection(myGroups, hc);\n\n\t\t\tnormal = this.groups.filter(function (item) {\n\t\t\t\treturn !_this2.isOld(item) && _.includes(normal, item.get(\"code\"));\n\t\t\t});\n\t\t\tcustom = this.groups.filter(function (item) {\n\t\t\t\treturn !_this2.isOld(item) && _.includes(custom, item.get(\"code\"));\n\t\t\t});\n\n\t\t\tthis.allowedGroups = {\n\t\t\t\tsystem: _.reduce(normal, function (sum, num) {\n\t\t\t\t\tsum[num.get(\"code\")] = num.toJSON();return sum;\n\t\t\t\t}, {}),\n\t\t\t\tcustom: _.reduce(custom, function (sum, num) {\n\t\t\t\t\tsum[num.get(\"code\")] = num.toJSON();return sum;\n\t\t\t\t}, {}),\n\t\t\t\tall: allForBook,\n\t\t\t\tchangeAllowed: normal.length > 0\n\t\t\t};\n\t\t}\n\n\t\tif (param.book.get(\"groups\") === null) this.currentGroups = null;else this.currentGroups = _.map(this.allowedGroups.system, function (x) {\n\t\t\treturn x.code;\n\t\t});\n\n\t\tif (this.allowedGroups.changeAllowed) this.ui.groups.removeClass(\"disabled\");\n\n\t\teventBus.trigger(eventBus.Events.GroupsChanged, _.clone(this.allowedGroups), _.clone(this.currentGroups));\n\t},\n\n\tloadLpGroups: function loadLpGroups(param) {\n\t\tvar c = [param.learningPath.get(\"group\")];\n\t\tvar hc = param.learningPath.get(\"customGroups\") || [];\n\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\t\tvar allForGroup = this.groups.reduce(function (sum, item) {\n\t\t\tif (_.includes(c, item.get(\"code\")) && !item.get(\"systemGroup\")) sum[item.get(\"code\")] = item.toJSON();\n\t\t\treturn sum;\n\t\t}, {});\n\n\t\tif (rester.hasAccess(rester.p.groups.all, user)) {\n\t\t\tc = this.groups.filter(function (item) {\n\t\t\t\treturn _.includes(c, item.get(\"code\"));\n\t\t\t});\n\t\t\thc = this.groups.filter(function (item) {\n\t\t\t\treturn _.includes(hc, item.get(\"code\"));\n\t\t\t});\n\n\t\t\tthis.allowedGroups = {\n\t\t\t\tsystem: _.reduce(c, function (sum, num) {\n\t\t\t\t\tsum[num.get(\"code\")] = num.toJSON();return sum;\n\t\t\t\t}, {}),\n\t\t\t\tcustom: _.reduce(hc, function (sum, num) {\n\t\t\t\t\tsum[num.get(\"code\")] = num.toJSON();return sum;\n\t\t\t\t}, {}),\n\t\t\t\tall: allForGroup,\n\t\t\t\tchangeAllowed: c.length > 0\n\t\t\t};\n\t\t} else {\n\t\t\tvar myGroups = (user.groups || []).concat(user.customGroups || []);\n\n\t\t\tvar normal = _.intersection(myGroups, c || []);\n\t\t\tvar custom = _.intersection(myGroups, hc);\n\n\t\t\tnormal = this.groups.filter(function (item) {\n\t\t\t\treturn _.includes(normal, item.get(\"code\"));\n\t\t\t});\n\t\t\tcustom = this.groups.filter(function (item) {\n\t\t\t\treturn _.includes(custom, item.get(\"code\"));\n\t\t\t});\n\n\t\t\tthis.allowedGroups = {\n\t\t\t\tsystem: _.reduce(normal, function (sum, num) {\n\t\t\t\t\tsum[num.get(\"code\")] = num.toJSON();return sum;\n\t\t\t\t}, {}),\n\t\t\t\tcustom: _.reduce(custom, function (sum, num) {\n\t\t\t\t\tsum[num.get(\"code\")] = num.toJSON();return sum;\n\t\t\t\t}, {}),\n\t\t\t\tall: allForGroup,\n\t\t\t\tchangeAllowed: normal.length > 0\n\t\t\t};\n\t\t}\n\n\t\tthis.currentGroups = _.map(this.allowedGroups.system, function (x) {\n\t\t\treturn x.code;\n\t\t});\n\n\t\tif (this.allowedGroups.changeAllowed && !this.lpMode) this.ui.groups.removeClass(\"disabled\");\n\n\t\teventBus.trigger(eventBus.Events.GroupsChanged, _.clone(this.allowedGroups), _.clone(this.currentGroups));\n\t},\n\n\tgetAllowedGroups: function getAllowedGroups() {\n\t\treturn this.allowedGroups;\n\t},\n\n\tgetCurrentGroups: function getCurrentGroups() {\n\t\treturn this.currentGroups;\n\t},\n\n\tunloadGroups: function unloadGroups() {\n\t\tthis.ui.groups.addClass(\"disabled\");\n\t},\n\n\thandleGroupChange: function handleGroupChange(allowed, current) {\n\t\t// If not all system groups are selected\n\t\tif (_.intersection(_.keys(allowed.system), current).length === _.keys(allowed.system).length) this.ui.groups.removeClass(\"partial-group\");else this.ui.groups.addClass(\"partial-group\");\n\n\t\t// Allow resource dragging if the book has enough groups\n\t\tif (allowed.attachAllowed || allowed.changeAllowed) eventBus.trigger(eventBus.Events.EnableResourceDragging);else eventBus.trigger(eventBus.Events.DisableResourceDragging);\n\t},\n\n\tchooseGroups: function chooseGroups() {\n\t\tvar _this3 = this;\n\n\t\tvar modal = new GroupModal({ host: \"#link-resources\" });\n\n\t\tmodal.show({\n\t\t\tok: function ok(result) {\n\t\t\t\t_this3.currentGroups = result.values;\n\t\t\t\teventBus.trigger(eventBus.Events.GroupsChanged, _.clone(_this3.allowedGroups), _.clone(_this3.currentGroups));\n\t\t\t}\n\t\t});\n\t},\n\n\tloadNav: function loadNav(navObj) {\n\t\tthis.navigation = navObj;\n\t\t$(\"#body-container-left-margin\").append(this.navigation.render().el);\n\n\t\tthis.ui.navigation.removeClass(\"disabled\");\n\t},\n\n\tunloadNav: function unloadNav() {\n\t\tif (this.navigation) this.navigation.destroy();\n\t\tdelete this.navigation;\n\t\tthis.ui.navigation.addClass(\"disabled\").removeClass(\"active\");\n\t},\n\n\tonClick: function onClick() {\n\t\teventBus.trigger(eventBus.Events.CloseResources);\n\t},\n\n\tonNavigationClick: function onNavigationClick(event) {\n\t\tevent.stopPropagation();\n\n\t\tif (!this.ui.navigation.hasClass(\"disabled\")) this.toggleNavigation();\n\t},\n\n\tonResourcesClick: function onResourcesClick(event) {\n\t\tevent.stopPropagation();\n\n\t\tif (!this.ui.resources.hasClass(\"disabled\")) this.toggleResources();\n\t},\n\n\tonGroupsClick: function onGroupsClick(event) {\n\t\tevent.stopPropagation();\n\n\t\tif (!this.ui.groups.hasClass(\"disabled\")) this.chooseGroups();\n\t},\n\n\tonHomeClick: function onHomeClick(event) {\n\t\tevent.stopPropagation();\n\n\t\tif (!this.ui.home.hasClass(\"disabled\")) this.goHome();\n\t},\n\n\tonCreateClick: function onCreateClick(event) {\n\t\tevent.stopPropagation();\n\n\t\tif (!this.ui.create.hasClass(\"disabled\")) this.createItems(event);\n\t},\n\n\tonFlashCardClick: function onFlashCardClick(event) {\n\t\tevent.stopPropagation();\n\n\t\tif (!this.ui.flashCard.hasClass(\"disabled\")) {\n\t\t\tthis.ui.flashCard.addClass(\"disabled\");\n\t\t\teventBus.trigger(eventBus.Events.ShowFlashCardWidget);\n\t\t}\n\t},\n\n\tonCamClick: function onCamClick() {\n\t\tvar book = eventBus.request(eventBus.Events.GetCurrentBook);\n\n\t\tif (book && book.has(\"universal_id\")) {\n\t\t\twindow.open(settings.urlRoot + \"/console/cam?book=\" + book.get(\"universal_id\"), \"_blank\");\n\t\t\treturn;\n\t\t}\n\n\t\tvar group = eventBus.request(eventBus.Events.GetCurrentGroup);\n\n\t\tif (group && group.has(\"code\")) window.open(settings.urlRoot + \"/console/cam?groups=\" + group.get(\"code\"), \"_blank\");else window.open(settings.urlRoot + \"/console/cam\", \"_blank\");\n\t},\n\n\ttoggleNavigation: function toggleNavigation() {\n\t\tthis.toggle(\"navigation\");\n\t},\n\n\ttoggleResources: function toggleResources() {\n\t\tthis.toggle(\"resources\");\n\t},\n\n\ttoggle: function toggle(menu, _state) {\n\t\tvar _this4 = this;\n\n\t\tif (!this[menu]) return;\n\n\t\tvar state = _state;\n\n\t\tif (_.isUndefined(state)) state = !this.state[menu];\n\n\t\tvar hide = function hide(m) {\n\t\t\tif (!_this4.state[m] || !_this4[m]) return;\n\t\t\t_this4[m].hide();\n\t\t\t_this4.ui[m].removeClass(\"active\");\n\t\t\tdelete _this4.state[m];\n\t\t};\n\n\t\tif (state) {\n\t\t\tthis[menu].show();\n\t\t\tthis.ui[menu].addClass(\"active\");\n\t\t\tthis.state[menu] = true;\n\t\t} else {\n\t\t\thide(menu);\n\t\t}\n\n\t\tfor (var key in this.state) {\n\t\t\tif (key !== menu) hide(key);\n\t\t}\n\t},\n\n\tdisableResourceButton: function disableResourceButton() {\n\t\tthis.ui.resources.addClass(\"disabled\");\n\t},\n\n\tenableResourceButton: function enableResourceButton() {\n\t\tif (!this.lpMode) this.ui.resources.removeClass(\"disabled\");\n\t},\n\n\tonAddResourceClicked: function onAddResourceClicked() {\n\t\tthis.assembleResource();\n\t},\n\n\tassembleResource: function assembleResource() {\n\t\tvar model = new Resource();\n\n\t\tvar book = eventBus.request(eventBus.Events.GetCurrentBook);\n\t\tvar group = eventBus.request(eventBus.Events.GetCurrentGroup);\n\n\t\tif (book && book.id) {\n\t\t\tmodel.set({\n\t\t\t\tlanguage: book.get(\"metadata\") ? book.get(\"metadata\").language : null,\n\t\t\t\tstudyYear: book.get(\"metadata\") ? book.get(\"metadata\").grade : null,\n\t\t\t\tsubject: book.get(\"subject\") ? book.get(\"subject\") : null,\n\t\t\t\tsubject_name: book.get(\"metadata\") ? book.get(\"metadata\").subject : null\n\t\t\t});\n\t\t} else if (group && group.id) {\n\t\t\tmodel.set({\n\t\t\t\tlanguage: group.get(\"language\"),\n\t\t\t\tstudyYear: group.get(\"grade\"),\n\t\t\t\tsubject: group.get(\"subject_id\") || group.get(\"subject\"),\n\t\t\t\tsubject_name: group.get(\"subject_name\") || group.get(\"subject\")\n\t\t\t});\n\t\t}\n\n\t\tvar modal = new ResourceModal({\n\t\t\tmodel: model,\n\t\t\thost: \".modal-host\"\n\t\t});\n\n\t\tmodal.show();\n\t},\n\n\tonAddAssessmentClicked: function onAddAssessmentClicked() {\n\t\tthis.assembleAssessment();\n\t},\n\n\tassembleAssessment: function assembleAssessment(model) {\n\t\tvar book = eventBus.request(eventBus.Events.GetCurrentBook);\n\t\tvar group = eventBus.request(eventBus.Events.GetCurrentGroup);\n\n\t\tvar assessment = model || new Assessment();\n\n\t\tif (book && book.id) {\n\t\t\tassessment.set({\n\t\t\t\tlanguage: book.get(\"metadata\") ? book.get(\"metadata\").language : null,\n\t\t\t\tstudyYear: book.get(\"metadata\") ? book.get(\"metadata\").grade : null,\n\t\t\t\tsubject: book.get(\"subject\") ? book.get(\"subject\") : null,\n\t\t\t\tsubject_name: book.get(\"metadata\") ? book.get(\"metadata\").subject : null\n\t\t\t});\n\t\t} else if (group && group.id) {\n\t\t\tassessment.set({\n\t\t\t\tlanguage: group.get(\"language\"),\n\t\t\t\tstudyYear: group.get(\"grade\"),\n\t\t\t\tsubject: group.get(\"subject_id\") || group.get(\"subject\"),\n\t\t\t\tsubject_name: group.get(\"subject_name\") || group.get(\"subject\")\n\t\t\t});\n\t\t}\n\n\t\tvar modal = new AssessmentModal({ model: assessment, host: \"#modals\" });\n\n\t\tmodal.show({\n\t\t\tcreate: function create(result) {\n\t\t\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\t\t\tcontent: \"New item \" + result.model.get(\"title\") + \" successfully created\"\n\t\t\t\t});\n\t\t\t},\n\t\t\tupdate: function update(result) {\n\t\t\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\t\t\tcontent: \"Item \" + result.model.get(\"title\") + \" successfully updated\"\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t},\n\n\tonAddEventClicked: function onAddEventClicked() {\n\t\tthis.assembleEvent();\n\t},\n\n\tassembleEvent: function assembleEvent(model, inlineSuccessMessage, inlineErrorMessage) {\n\t\tvar _this5 = this;\n\n\t\tthis.EventModal = new EventModal({\n\t\t\tmodel: model ? model : new Event(),\n\t\t\tmetadata: this.EventMetadataModel,\n\t\t\tinlineSuccessMessage: inlineSuccessMessage || \"\",\n\t\t\tinlineErrorMessage: inlineErrorMessage || \"\",\n\t\t\thost: $(\"#link-resources\")\n\t\t});\n\n\t\tthis.EventModal.once(\"action\", function (action, data) {\n\t\t\tswitch (action) {\n\t\t\t\tcase \"added\":\n\t\t\t\t\t_this5.trigger(\"event:created\", data.model);\n\n\t\t\t\t\tif (data.addAnother) _this5.assembleEvent(new Event({}), \"New event \\\"\" + data.model.get(\"title\") + \"\\\" successfully added\");else radio.trigger(App.Events.Commands.Toast, { content: \"New event \" + data.model.get(\"title\") + \" successfully created\" });\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"updated\":\n\t\t\t\t\tradio.trigger(App.Events.Commands.Toast, { content: \"Event \" + data.model.get(\"title\") + \" successfully updated\" });\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"skip\":\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\"Unknown action\");\n\t\t\t}\n\t\t});\n\n\t\tthis.EventModal.show();\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.resources.destroy();\n\t\teventBus.trigger(eventBus.Events.HideFlashCardWidget);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNpZGViYXIuanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwiJCIsInJlc3RlciIsIl8iLCJyYXlndW4iLCJQcm9taXNlIiwibW9tZW50IiwidGlwcHkiLCJkZWZhdWx0Iiwic2V0dGluZ3MiLCJBcHAiLCJTaW1wbGVNZW51IiwicmFkaW8iLCJSYWRpbyIsImNoYW5uZWwiLCJldmVudEJ1cyIsIlJlc291cmNlU2lkZWJhciIsIkdyb3VwTW9kYWwiLCJSZXNvdXJjZU1vZGFsIiwiRXZlbnRNb2RhbCIsIlJlc291cmNlIiwiRXZlbnQiLCJBc3Nlc3NtZW50TW9kYWwiLCJBc3Nlc3NtZW50IiwiR3JvdXAiLCJNb2RlbCIsImV4dGVuZCIsImRlZmF1bHRzIiwiaWRBdHRyaWJ1dGUiLCJHcm91cENvbGxlY3Rpb24iLCJDb2xsZWN0aW9uIiwibW9kZWwiLCJpbml0aWFsaXplIiwibW9kZWxzIiwib3B0aW9ucyIsIml0ZW1faWQiLCJ1cmwiLCJ1c2VyIiwicmVxdWVzdCIsIkV2ZW50cyIsIlJlcXVlc3RzIiwiQ3VycmVudFVzZXIiLCJ1cmxSb290IiwiZW5jb2RlVVJJQ29tcG9uZW50IiwidXNlcm5hbWUiLCJjb21wYXJhdG9yIiwiZ2V0IiwibW9kdWxlIiwiZXhwb3J0cyIsIk1hcmlvbmV0dGUiLCJWaWV3IiwidGFnTmFtZSIsImNsYXNzTmFtZSIsInRlbXBsYXRlIiwidWkiLCJvcCIsImhvbWUiLCJuYXZpZ2F0aW9uIiwicmVzb3VyY2VzIiwiY3JlYXRlIiwiZmxhc2hDYXJkIiwiZ3JvdXBzIiwiaGVscCIsImNhbSIsImV2ZW50cyIsImNsaWNrIiwidmlld3MiLCJzdGF0ZSIsImxpc3RlblRvIiwiTG9hZE5hdmlnYXRpb24iLCJsb2FkTmF2IiwiYmluZCIsIlVubG9hZEJvb2siLCJ1bmxvYWROYXYiLCJVbmxvYWRMZWFybmluZ1BhdGgiLCJDbG9zZU5hdmlnYXRpb24iLCJ0b2dnbGUiLCJPcGVuTmF2aWdhdGlvbiIsIkNsb3NlUmVzb3VyY2VzIiwiT3BlblJlc291cmNlcyIsIkRpc2FibGVSZXNvdXJjZURyYWdnaW5nIiwiZGlzYWJsZVJlc291cmNlQnV0dG9uIiwiRW5hYmxlUmVzb3VyY2VEcmFnZ2luZyIsImVuYWJsZVJlc291cmNlQnV0dG9uIiwiVmlld0NoYW5nZWQiLCJ2aWV3Q2hhbmdlZCIsIlZpZXdMb2FkZWQiLCJvblZpZXdMb2FkZWQiLCJHcm91cHNDaGFuZ2VkIiwiaGFuZGxlR3JvdXBDaGFuZ2UiLCJMUFZpZXdDaGFuZ2VkIiwiY2hhbmdlTFBWaWV3IiwiSGlkZUZsYXNoQ2FyZFdpZGdldCIsIm9uRmxhc2hDYXJkV2lkZ2V0SGlkZSIsInJlcGx5IiwiR2V0QWxsb3dlZEdyb3VwcyIsImdldEFsbG93ZWRHcm91cHMiLCJHZXRDdXJyZW50R3JvdXBzIiwiZ2V0Q3VycmVudEdyb3VwcyIsIm9uIiwiU2hvd0dyb3VwTW9kYWwiLCJjaG9vc2VHcm91cHMiLCJ2aWV3IiwicGFyYW1zIiwidW5sb2FkR3JvdXBzIiwiTGFzdFZpZXciLCJsb2FkR3JvdXBzIiwiY3VycmVudFBhZ2UiLCJib29rIiwiY29sbGVjdGlvbiIsInRyaWdnZXIiLCJhZGRDbGFzcyIsImluc3RhbmNlIiwiX3RpcHB5IiwiZGlzYWJsZSIsImhvbWVCdXR0b25UaXRsZSIsImxwTW9kZSIsInJlbW92ZUNsYXNzIiwiYXR0ciIsInNldENvbnRlbnQiLCJlbmFibGUiLCJtb2RlIiwiZ29Ib21lIiwiQ29tbWFuZHMiLCJOYXZpZ2F0ZSIsIm9uUmVuZGVyIiwibm9vcCIsIm9uQXR0YWNoIiwibG9hZFJlc291cmNlcyIsImFkZFRvb2x0aXAiLCJvbkJlZm9yZURldGFjaCIsImRlc3Ryb3kiLCJ0aGVtZSIsInBsYWNlbWVudCIsImFycm93IiwiY29udGVudCIsImFwcGVuZCIsInJlbmRlciIsImVsIiwiY3JlYXRlSXRlbXMiLCJldnQiLCJzdG9wUHJvcGFnYXRpb24iLCJjcmVhdGVNZW51IiwiZWxzIiwidGV4dCIsImlkIiwiYXNzZXNzbWVudHMiLCJwdXNoIiwiTWVudSIsImFuY2hvciIsInNpZGUiLCJuZXh0VG8iLCJob3N0Iiwic3RydWN0dXJlIiwiY2xvc2VPbkNsaWNrIiwiZWxlbWVudHMiLCJvbkFkZFJlc291cmNlQ2xpY2tlZCIsIm9uQWRkQXNzZXNzbWVudENsaWNrZWQiLCJvbkFkZEV2ZW50Q2xpY2tlZCIsIkNsb3NlU2ltcGxlTWVudXMiLCJzaG93IiwiZmV0Y2hTdWNjZXNzIiwicGFyYW0iLCJsb2FkQm9va0dyb3VwcyIsImxlYXJuaW5nUGF0aCIsImxvYWRMcEdyb3VwcyIsImZldGNoRXJyb3IiLCJlcnIiLCJkZWJ1ZyIsInJlcG9ydEVycm9ycyIsImNvbnNvbGUiLCJlcnJvciIsIkNhY2hlIiwiR3JvdXBzIiwicmVzb2x2ZSIsImxhenlGZXRjaCIsImNhdGNoIiwidGhlbiIsImlzT2xkIiwiZ3JvdXBNb2RlbCIsInVuaXgiLCJjIiwiaGMiLCJhbGxGb3JCb29rIiwicmVkdWNlIiwic3VtIiwiaXRlbSIsImluY2x1ZGVzIiwidG9KU09OIiwiYWxsb3dlZEdyb3VwcyIsInN5c3RlbSIsImN1c3RvbSIsImFsbCIsImNoYW5nZUFsbG93ZWQiLCJhdHRhY2hBbGxvd2VkIiwiaGFzQWNjZXNzIiwicCIsImZpbHRlciIsIm51bSIsImxlbmd0aCIsIm15R3JvdXBzIiwiY29uY2F0IiwiY3VzdG9tR3JvdXBzIiwibm9ybWFsIiwiaW50ZXJzZWN0aW9uIiwiY3VycmVudEdyb3VwcyIsIm1hcCIsIngiLCJjb2RlIiwiY2xvbmUiLCJhbGxGb3JHcm91cCIsImFsbG93ZWQiLCJjdXJyZW50Iiwia2V5cyIsIm1vZGFsIiwib2siLCJyZXN1bHQiLCJ2YWx1ZXMiLCJuYXZPYmoiLCJvbkNsaWNrIiwib25OYXZpZ2F0aW9uQ2xpY2siLCJldmVudCIsImhhc0NsYXNzIiwidG9nZ2xlTmF2aWdhdGlvbiIsIm9uUmVzb3VyY2VzQ2xpY2siLCJ0b2dnbGVSZXNvdXJjZXMiLCJvbkdyb3Vwc0NsaWNrIiwib25Ib21lQ2xpY2siLCJvbkNyZWF0ZUNsaWNrIiwib25GbGFzaENhcmRDbGljayIsIlNob3dGbGFzaENhcmRXaWRnZXQiLCJvbkNhbUNsaWNrIiwiR2V0Q3VycmVudEJvb2siLCJoYXMiLCJ3aW5kb3ciLCJvcGVuIiwiZ3JvdXAiLCJHZXRDdXJyZW50R3JvdXAiLCJtZW51IiwiX3N0YXRlIiwiaXNVbmRlZmluZWQiLCJoaWRlIiwibSIsImtleSIsImFzc2VtYmxlUmVzb3VyY2UiLCJzZXQiLCJsYW5ndWFnZSIsInN0dWR5WWVhciIsImdyYWRlIiwic3ViamVjdCIsInN1YmplY3RfbmFtZSIsImFzc2VtYmxlQXNzZXNzbWVudCIsImFzc2Vzc21lbnQiLCJUb2FzdCIsInVwZGF0ZSIsImFzc2VtYmxlRXZlbnQiLCJpbmxpbmVTdWNjZXNzTWVzc2FnZSIsImlubGluZUVycm9yTWVzc2FnZSIsIm1ldGFkYXRhIiwiRXZlbnRNZXRhZGF0YU1vZGVsIiwib25jZSIsImFjdGlvbiIsImRhdGEiLCJhZGRBbm90aGVyIiwiRXJyb3IiLCJvbkJlZm9yZURlc3Ryb3kiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1DLElBQUlELFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUUsU0FBU0YsUUFBUSxRQUFSLENBQWY7QUFDQSxJQUFNRyxJQUFJSCxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1JLFNBQVNKLFFBQVEsUUFBUixDQUFmO0FBQ0EsSUFBTUssVUFBVUwsUUFBUSxVQUFSLENBQWhCO0FBQ0EsSUFBTU0sU0FBU04sUUFBUSxRQUFSLENBQWY7QUFDQSxJQUFNTyxRQUFRUCxRQUFRLFVBQVIsRUFBb0JRLE9BQWxDOztBQUVBLElBQU1DLFdBQVdULFFBQVEsY0FBUixDQUFqQjtBQUNBLElBQU1VLE1BQU1WLFFBQVEsZ0JBQVIsQ0FBWjtBQUNBLElBQU1XLGFBQWFYLFFBQVEseUJBQVIsQ0FBbkI7O0FBRUEsSUFBTVksUUFBUWIsU0FBU2MsS0FBVCxDQUFlQyxPQUFmLENBQXVCLFFBQXZCLENBQWQ7O0FBRUEsSUFBTUMsV0FBV2YsUUFBUSxZQUFS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SyxNQUFMO0FBQ0M7O0FBRUQ7QUFDQyxXQUFNLElBQUkwTixLQUFKLENBQVUsZ0JBQVYsQ0FBTjtBQWxCRjtBQW9CQSxHQXJCRDs7QUF1QkEsT0FBS3JQLFVBQUwsQ0FBZ0I2SSxJQUFoQjtBQUNBLEVBaHBCK0M7O0FBa3BCaER5RyxrQkFBaUIsMkJBQVc7QUFDM0IsT0FBSy9NLFNBQUwsQ0FBZXlFLE9BQWY7QUFDQXBILFdBQVMrRixPQUFULENBQWlCL0YsU0FBU3dCLE1BQVQsQ0FBZ0JxRCxtQkFBakM7QUFDQTtBQXJwQitDLENBQWhDLENBQWpCIiwiZmlsZSI6InNpZGViYXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCByZXN0ZXIgPSByZXF1aXJlKFwicmVzdGVyXCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCByYXlndW4gPSByZXF1aXJlKFwicmF5Z3VuXCIpO1xuY29uc3QgUHJvbWlzZSA9IHJlcXVpcmUoXCJibHVlYmlyZFwiKTtcbmNvbnN0IG1vbWVudCA9IHJlcXVpcmUoXCJtb21lbnRcIik7XG5jb25zdCB0aXBweSA9IHJlcXVpcmUoXCJ0aXBweS5qc1wiKS5kZWZhdWx0O1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5jb25zdCBBcHAgPSByZXF1aXJlKFwiLi4vLi4vLi4vaW5kZXhcIik7XG5jb25zdCBTaW1wbGVNZW51ID0gcmVxdWlyZShcIi4uLy4uLy4uL2xpYi9zaW1wbGVNZW51XCIpO1xuXG5jb25zdCByYWRpbyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJnbG9iYWxcIik7XG5cbmNvbnN0IGV2ZW50QnVzID0gcmVxdWlyZShcIi4vZXZlbnRCdXNcIik7XG5jb25zdCBSZXNvdXJjZVNpZGViYXIgPSByZXF1aXJlKFwiLi9yZXNvdXJjZVNpZGViYXJcIik7XG5jb25zdCBHcm91cE1vZGFsID0gcmVxdWlyZShcIi4vZ3JvdXBNb2RhbFwiKTtcbmNvbnN0IFJlc291cmNlTW9kYWwgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL3Jlc291cmNlTW9kYWxcIik7XG5jb25zdCBFdmVudE1vZGFsID0gcmVxdWlyZShcIi4uLy4uLy4uL2xpYi9ldmVudE1vZGFsXCIpO1xuY29uc3QgUmVzb3VyY2UgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29udGVudC9tb2RlbHMvbWFuYWdlci9yZXNvdXJjZU1vZGVsXCIpO1xuY29uc3QgRXZlbnQgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL2V2ZW50TW9kZWxcIik7XG5jb25zdCBBc3Nlc3NtZW50TW9kYWwgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL2Fzc2Vzc21lbnRNb2RhbFwiKTtcbmNvbnN0IEFzc2Vzc21lbnQgPSByZXF1aXJlKFwiLi4vLi4vLi4vbGliL2Fzc2Vzc21lbnRNb2RlbFwiKTtcblxuY29uc3QgR3JvdXAgPSBCYWNrYm9uZS5Nb2RlbC5leHRlbmQoe1xuXHRkZWZhdWx0czoge30sXG5cdGlkQXR0cmlidXRlOiBcImNvZGVcIixcbn0pO1xuXG5jb25zdCBHcm91cENvbGxlY3Rpb24gPSBCYWNrYm9uZS5Db2xsZWN0aW9uLmV4dGVuZCh7XG5cdG1vZGVsOiBHcm91cCxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihtb2RlbHMsIG9wdGlvbnMpIHtcblx0XHR0aGlzLml0ZW1faWQgPSBvcHRpb25zLml0ZW1faWQ7XG5cdH0sXG5cblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCB1c2VyID0gcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FjYWNpYS91c2Vycy9cIiArIGVuY29kZVVSSUNvbXBvbmVudCh1c2VyLnVzZXJuYW1lKSArIFwiL2Vucm9sbWVudD93aXRoUHJpdmF0ZT10cnVlJml0ZW1faWQ9XCIgKyB0aGlzLml0ZW1faWQ7XG5cdH0sXG5cblx0Y29tcGFyYXRvcjogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRyZXR1cm4gbW9kZWwuZ2V0KFwibmFtZVwiKTtcblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwic2lkZWJhci1yZWdpb25cIixcblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvY29uc29sZS9zaWRlYmFyLm51bmpcIiksXG5cblx0dWk6IHtcblx0XHRvcDogXCIub3BcIixcblx0XHRob21lOiBcIi5vcC1ob21lXCIsXG5cdFx0b3B0aW9uczogXCIub3Atb3B0aW9uc1wiLFxuXHRcdG5hdmlnYXRpb246IFwiLm9wLW5hdlwiLFxuXHRcdHJlc291cmNlczogXCIub3AtcmVzb3VyY2VzXCIsXG5cdFx0Y3JlYXRlOiBcIi5vcC1jcmVhdGVcIixcblx0XHRmbGFzaENhcmQ6IFwiLm9wLWZsYXNoLWNhcmRcIixcblx0XHRncm91cHM6IFwiLm9wLWdyb3Vwc1wiLFxuXHRcdGhlbHA6IFwiLm9wLWhlbHBcIixcblx0XHRjYW06IFwiLm9wLWNhbVwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdGNsaWNrOiBcIm9uQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5uYXZpZ2F0aW9uXCI6IFwib25OYXZpZ2F0aW9uQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5yZXNvdXJjZXNcIjogXCJvblJlc291cmNlc0NsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkuZ3JvdXBzXCI6IFwib25Hcm91cHNDbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmhvbWVcIjogXCJvbkhvbWVDbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmNyZWF0ZVwiOiBcIm9uQ3JlYXRlQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5mbGFzaENhcmRcIjogXCJvbkZsYXNoQ2FyZENsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkuY2FtXCI6IFwib25DYW1DbGlja1wiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudmlld3MgPSB7fTtcblx0XHR0aGlzLnN0YXRlID0ge307XG5cblx0XHR0aGlzLmxpc3RlblRvKGV2ZW50QnVzLCBldmVudEJ1cy5FdmVudHMuTG9hZE5hdmlnYXRpb24sIHRoaXMubG9hZE5hdi5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKGV2ZW50QnVzLCBldmVudEJ1cy5FdmVudHMuVW5sb2FkQm9vaywgdGhpcy51bmxvYWROYXYuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5UbyhldmVudEJ1cywgZXZlbnRCdXMuRXZlbnRzLlVubG9hZExlYXJuaW5nUGF0aCwgdGhpcy51bmxvYWROYXYuYmluZCh0aGlzKSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKGV2ZW50QnVzLCBldmVudEJ1cy5FdmVudHMuQ2xvc2VOYXZpZ2F0aW9uLCB0aGlzLnRvZ2dsZS5iaW5kKHRoaXMsIFwibmF2aWdhdGlvblwiLCBmYWxzZSkpO1xuXHRcdHRoaXMubGlzdGVuVG8oZXZlbnRCdXMsIGV2ZW50QnVzLkV2ZW50cy5PcGVuTmF2aWdhdGlvbiwgdGhpcy50b2dnbGUuYmluZCh0aGlzLCBcIm5hdmlnYXRpb25cIiwgdHJ1ZSkpO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhldmVudEJ1cywgZXZlbnRCdXMuRXZlbnRzLkNsb3NlUmVzb3VyY2VzLCB0aGlzLnRvZ2dsZS5iaW5kKHRoaXMsIFwicmVzb3VyY2VzXCIsIGZhbHNlKSk7XG5cdFx0dGhpcy5saXN0ZW5UbyhldmVudEJ1cywgZXZlbnRCdXMuRXZlbnRzLk9wZW5SZXNvdXJjZXMsIHRoaXMudG9nZ2xlLmJpbmQodGhpcywgXCJyZXNvdXJjZXNcIiwgdHJ1ZSkpO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhldmVudEJ1cywgZXZlbnRCdXMuRXZlbnRzLkRpc2FibGVSZXNvdXJjZURyYWdnaW5nLCB0aGlzLmRpc2FibGVSZXNvdXJjZUJ1dHRvbi5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKGV2ZW50QnVzLCBldmVudEJ1cy5FdmVudHMuRW5hYmxlUmVzb3VyY2VEcmFnZ2luZywgdGhpcy5lbmFibGVSZXNvdXJjZUJ1dHRvbi5iaW5kKHRoaXMpKTtcblxuXHRcdHRoaXMubGlzdGVuVG8oZXZlbnRCdXMsIGV2ZW50QnVzLkV2ZW50cy5WaWV3Q2hhbmdlZCwgdGhpcy52aWV3Q2hhbmdlZC5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKGV2ZW50QnVzLCBldmVudEJ1cy5FdmVudHMuVmlld0xvYWRlZCwgdGhpcy5vblZpZXdMb2FkZWQuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5UbyhldmVudEJ1cywgZXZlbnRCdXMuRXZlbnRzLkdyb3Vwc0NoYW5nZWQsIHRoaXMuaGFuZGxlR3JvdXBDaGFuZ2UuYmluZCh0aGlzKSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKGV2ZW50QnVzLCBldmVudEJ1cy5FdmVudHMuTFBWaWV3Q2hhbmdlZCwgdGhpcy5jaGFuZ2VMUFZpZXcuYmluZCh0aGlzKSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKGV2ZW50QnVzLCBldmVudEJ1cy5FdmVudHMuSGlkZUZsYXNoQ2FyZFdpZGdldCwgdGhpcy5vbkZsYXNoQ2FyZFdpZGdldEhpZGUuYmluZCh0aGlzKSk7XG5cblx0XHRldmVudEJ1cy5yZXBseShldmVudEJ1cy5FdmVudHMuR2V0QWxsb3dlZEdyb3VwcywgdGhpcy5nZXRBbGxvd2VkR3JvdXBzLmJpbmQodGhpcykpO1xuXHRcdGV2ZW50QnVzLnJlcGx5KGV2ZW50QnVzLkV2ZW50cy5HZXRDdXJyZW50R3JvdXBzLCB0aGlzLmdldEN1cnJlbnRHcm91cHMuYmluZCh0aGlzKSk7XG5cdFx0ZXZlbnRCdXMub24oZXZlbnRCdXMuRXZlbnRzLlNob3dHcm91cE1vZGFsLCB0aGlzLmNob29zZUdyb3Vwcy5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHR2aWV3Q2hhbmdlZDogZnVuY3Rpb24odmlldywgcGFyYW1zKSB7XG5cdFx0dGhpcy51bmxvYWRHcm91cHMoKTtcblxuXHRcdHRoaXMuTGFzdFZpZXcgPSB2aWV3O1xuXHRcdHN3aXRjaCAodmlldykge1xuXHRcdFx0Y2FzZSBcImJvb2tzXCI6XG5cdFx0XHRcdHRoaXMubG9hZEdyb3VwcyhwYXJhbXMpO1xuXHRcdFx0XHR0aGlzLmN1cnJlbnRQYWdlID0gcGFyYW1zLmJvb2sgJiYgcGFyYW1zLmJvb2suY29sbGVjdGlvbiA/IHBhcmFtcy5ib29rLmNvbGxlY3Rpb24uc3RhdGUuY3VycmVudFBhZ2UgOiBudWxsO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcImxlYXJuaW5nUGF0aFwiOlxuXHRcdFx0XHR0aGlzLmxvYWRHcm91cHMocGFyYW1zKTtcblx0XHRcdFx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5FdmVudHMuRW5hYmxlUmVzb3VyY2VEcmFnZ2luZyk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aGlzLnVpLmZsYXNoQ2FyZC5hZGRDbGFzcyhcImRpc2FibGVkXCIpO1xuXHRcdFx0XHR0aGlzLnRvZ2dsZShcInJlc291cmNlc1wiLCBmYWxzZSk7XG5cdFx0XHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLkRpc2FibGVSZXNvdXJjZURyYWdnaW5nKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXG5cdFx0dGhpcy51aS5ob21lLmFkZENsYXNzKFwiZGlzYWJsZWRcIik7XG5cdFx0Y29uc3QgaW5zdGFuY2UgPSB0aGlzLnVpLmhvbWUuZ2V0KDApLl90aXBweTtcblx0XHRpbnN0YW5jZS5kaXNhYmxlKCk7XG5cdH0sXG5cblx0b25WaWV3TG9hZGVkOiBmdW5jdGlvbigpIHtcblx0XHRsZXQgaG9tZUJ1dHRvblRpdGxlO1xuXG5cdFx0c3dpdGNoICh0aGlzLkxhc3RWaWV3KSB7XG5cdFx0XHRjYXNlIFwiYm9va3NcIjpcblx0XHRcdFx0dGhpcy5scE1vZGUgPSBudWxsO1xuXHRcdFx0XHRob21lQnV0dG9uVGl0bGUgPSBcIkJhY2sgdG8gYm9vayBzZWxlY3RvclwiO1xuXHRcdFx0XHR0aGlzLnVpLmZsYXNoQ2FyZC5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcImxlYXJuaW5nUGF0aFwiOlxuXHRcdFx0XHRob21lQnV0dG9uVGl0bGUgPSBcIkJhY2sgdG8gbGVhcm5pbmcgcGF0aHNcIjtcblx0XHRcdFx0aWYgKCF0aGlzLmxwTW9kZSlcblx0XHRcdFx0XHR0aGlzLnVpLmZsYXNoQ2FyZC5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhpcy5scE1vZGUgPSBudWxsO1xuXHRcdFx0XHRob21lQnV0dG9uVGl0bGUgPSBcIkJhY2tcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXG5cdFx0dGhpcy51aS5ob21lLmF0dHIoXCJkYXRhLXRpdGxlXCIsIGhvbWVCdXR0b25UaXRsZSk7XG5cdFx0dGhpcy51aS5ob21lLnJlbW92ZUNsYXNzKFwiZGlzYWJsZWRcIik7XG5cblx0XHRjb25zdCBpbnN0YW5jZSA9IHRoaXMudWkuaG9tZS5nZXQoMCkuX3RpcHB5O1xuXHRcdGluc3RhbmNlLnNldENvbnRlbnQoaG9tZUJ1dHRvblRpdGxlKTtcblx0XHRpbnN0YW5jZS5lbmFibGUoKTtcblx0fSxcblxuXHRjaGFuZ2VMUFZpZXc6IGZ1bmN0aW9uKG1vZGUpIHtcblx0XHR0aGlzLmxwTW9kZSA9IG1vZGU7XG5cblx0XHRpZiAobW9kZSkge1xuXHRcdFx0dGhpcy51aS5yZXNvdXJjZXMuYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblx0XHRcdHRoaXMudWkuZ3JvdXBzLmFkZENsYXNzKFwiZGlzYWJsZWRcIik7XG5cdFx0XHR0aGlzLnVpLmNyZWF0ZS5hZGRDbGFzcyhcImRpc2FibGVkXCIpO1xuXHRcdFx0dGhpcy51aS5mbGFzaENhcmQuYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLnVpLnJlc291cmNlcy5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xuXHRcdFx0dGhpcy51aS5ncm91cHMucmVtb3ZlQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblx0XHRcdHRoaXMudWkuY3JlYXRlLnJlbW92ZUNsYXNzKFwiZGlzYWJsZWRcIik7XG5cdFx0XHR0aGlzLnVpLmZsYXNoQ2FyZC5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xuXHRcdH1cblx0fSxcblxuXHRvbkZsYXNoQ2FyZFdpZGdldEhpZGU6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghdGhpcy5scE1vZGUpXG5cdFx0XHR0aGlzLnVpLmZsYXNoQ2FyZC5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xuXHR9LFxuXG5cdGdvSG9tZTogZnVuY3Rpb24oKSB7XG5cdFx0c3dpdGNoICh0aGlzLkxhc3RWaWV3KSB7XG5cdFx0XHRjYXNlIFwiYm9va3NcIjpcblx0XHRcdFx0dGhpcy51aS5mbGFzaENhcmQuYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblx0XHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLk5hdmlnYXRlLCBzZXR0aW5ncy51cmxSb290ICsgXCIvY29uc29sZS9ib29rc1wiICsgKHRoaXMuY3VycmVudFBhZ2UgPyBcIj9wYWdlPVwiICsgdGhpcy5jdXJyZW50UGFnZSA6IFwiXCIpKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJsZWFybmluZ1BhdGhcIjpcblx0XHRcdFx0dGhpcy51aS5mbGFzaENhcmQuYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblx0XHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLk5hdmlnYXRlLCBzZXR0aW5ncy51cmxSb290ICsgXCIvY29uc29sZS9sZWFybmluZ1BhdGhzXCIpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9LFxuXG5cdG9uUmVuZGVyOiBfLm5vb3AoKSxcblxuXHRvbkF0dGFjaDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5yZXNvdXJjZXMgPSBuZXcgUmVzb3VyY2VTaWRlYmFyKCk7XG5cdFx0dGhpcy5sb2FkUmVzb3VyY2VzKCk7XG5cblx0XHR0aGlzLmFkZFRvb2x0aXAoXCJuYXZpZ2F0aW9uXCIpO1xuXHRcdHRoaXMuYWRkVG9vbHRpcChcImdyb3Vwc1wiKTtcblx0XHR0aGlzLmFkZFRvb2x0aXAoXCJmbGFzaENhcmRcIik7XG5cdFx0dGhpcy5hZGRUb29sdGlwKFwiY2FtXCIpO1xuXHRcdHRoaXMuYWRkVG9vbHRpcChcImhvbWVcIik7XG5cdH0sXG5cblx0b25CZWZvcmVEZXRhY2g6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMucmVzb3VyY2VzLmRlc3Ryb3koKTtcblx0fSxcblxuXHRhZGRUb29sdGlwOiBmdW5jdGlvbihvcCkge1xuXHRcdGlmICh0aGlzLnVpW29wXS5nZXQoMCkpIHtcblx0XHRcdHRpcHB5KHRoaXMudWlbb3BdLmdldCgwKSwge1xuXHRcdFx0XHR0aGVtZTogXCJibGFja1wiLFxuXHRcdFx0XHRwbGFjZW1lbnQ6IFwicmlnaHRcIixcblx0XHRcdFx0YXJyb3c6IHRydWUsXG5cdFx0XHRcdGNvbnRlbnQ6IHRoaXMudWlbb3BdLmF0dHIoXCJkYXRhLXRpdGxlXCIpLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdGxvYWRSZXNvdXJjZXM6IGZ1bmN0aW9uKCkge1xuXHRcdCQoXCIjYm9keS1jb250YWluZXItbGVmdC1tYXJnaW5cIikuYXBwZW5kKHRoaXMucmVzb3VyY2VzLnJlbmRlcigpLmVsKTtcblx0XHRpZiAoIXRoaXMudWkucmVzb3VyY2VzLnJlbW92ZUNsYXNzKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0aWYgKCF0aGlzLmxwTW9kZSkge1xuXHRcdFx0dGhpcy51aS5yZXNvdXJjZXMucmVtb3ZlQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblx0XHRcdHRoaXMudWkuY3JlYXRlLnJlbW92ZUNsYXNzKFwiZGlzYWJsZWRcIik7XG5cdFx0fVxuXG5cdFx0dGhpcy5hZGRUb29sdGlwKFwicmVzb3VyY2VzXCIpO1xuXHRcdHRoaXMuYWRkVG9vbHRpcChcImNyZWF0ZVwiKTtcblx0fSxcblxuXHRjcmVhdGVJdGVtczogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0aWYgKHRoaXMuY3JlYXRlTWVudSkge1xuXHRcdFx0dGhpcy5jcmVhdGVNZW51LmRlc3Ryb3koKTtcblx0XHRcdHRoaXMuY3JlYXRlTWVudSA9IG51bGw7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgZWxzID0gW3sgdGV4dDogXCJBZGQgbmV3IHJlc291cmNlXCIsIGlkOiBcImFkZFJlc291cmNlXCIgfV07XG5cdFx0aWYgKHNldHRpbmdzLmFzc2Vzc21lbnRzKVxuXHRcdFx0ZWxzLnB1c2goeyB0ZXh0OiBcIkFkZCBuZXcgYXNzZXNzbWVudCAvIHN1cnZleVwiLCBpZDogXCJhZGRBc3Nlc3NtZW50XCIgfSk7XG5cdFx0Ly9lbHMucHVzaCh7IHRleHQ6IFwiQWRkIG5ldyBldmVudFwiLCBpZDogXCJhZGRFdmVudFwiIH0pO1xuXG5cdFx0Y29uc3QgTWVudSA9IG5ldyBTaW1wbGVNZW51KHtcblx0XHRcdGFuY2hvcjogdGhpcy51aS5jcmVhdGUsXG5cdFx0XHRzaWRlOiBcInJpZ2h0XCIsXG5cdFx0XHRuZXh0VG86IHRydWUsXG5cdFx0XHRob3N0OiAkKFwiI2xpbmstcmVzb3VyY2VzXCIpLFxuXHRcdFx0c3RydWN0dXJlOiBbe1xuXHRcdFx0XHRjbG9zZU9uQ2xpY2s6IHRydWUsXG5cdFx0XHRcdGVsZW1lbnRzOiBlbHMsXG5cdFx0XHR9XSxcblx0XHR9KTtcblxuXHRcdE1lbnUub24oXCJjbGlja2VkOmFkZFJlc291cmNlXCIsIHRoaXMub25BZGRSZXNvdXJjZUNsaWNrZWQuYmluZCh0aGlzKSk7XG5cdFx0TWVudS5vbihcImNsaWNrZWQ6YWRkQXNzZXNzbWVudFwiLCB0aGlzLm9uQWRkQXNzZXNzbWVudENsaWNrZWQuYmluZCh0aGlzKSk7XG5cdFx0TWVudS5vbihcImNsaWNrZWQ6YWRkRXZlbnRcIiwgdGhpcy5vbkFkZEV2ZW50Q2xpY2tlZC5iaW5kKHRoaXMpKTtcblxuXHRcdE1lbnUubGlzdGVuVG8oZXZlbnRCdXMsIGV2ZW50QnVzLkV2ZW50cy5DbG9zZVNpbXBsZU1lbnVzLCAoKSA9PiB7IHRoaXMuY3JlYXRlTWVudSA9IG51bGw7IE1lbnUuZGVzdHJveSgpOyB9KTtcblxuXHRcdHRoaXMubGlzdGVuVG8oTWVudSwgXCJjbG9zaW5nXCIsICgpID0+IHsgdGhpcy5jcmVhdGVNZW51ID0gbnVsbDsgfSk7XG5cblx0XHRNZW51LnNob3coKTtcblx0XHR0aGlzLmNyZWF0ZU1lbnUgPSBNZW51O1xuXHR9LFxuXG5cdGZldGNoU3VjY2VzczogZnVuY3Rpb24ocGFyYW0sIGdyb3Vwcykge1xuXHRcdHRoaXMuZ3JvdXBzID0gZ3JvdXBzO1xuXG5cdFx0aWYgKHRoaXMuZ3JvdXBzKSB7XG5cdFx0XHRpZiAocGFyYW0uYm9vaylcblx0XHRcdFx0cmV0dXJuIHRoaXMubG9hZEJvb2tHcm91cHMocGFyYW0pO1xuXHRcdFx0aWYgKHBhcmFtLmxlYXJuaW5nUGF0aClcblx0XHRcdFx0cmV0dXJuIHRoaXMubG9hZExwR3JvdXBzKHBhcmFtKTtcblx0XHR9XG5cdH0sXG5cblx0ZmV0Y2hFcnJvcjogZnVuY3Rpb24ocGFyYW0sIGVycikge1xuXHRcdGlmICghc2V0dGluZ3MuZGVidWcgfHwgc2V0dGluZ3MucmVwb3J0RXJyb3JzKVxuXHRcdFx0cmF5Z3VuKFwic2VuZFwiLCBlcnIpO1xuXHRcdGNvbnNvbGUuZXJyb3IoZXJyKTtcblx0fSxcblxuXHRsb2FkR3JvdXBzOiBmdW5jdGlvbihwYXJhbSkge1xuXHRcdC8vIFN0YXJ0IGZldGNoaW5nIGFsbCB0aGUgSlNPTiB3ZSBuZWVkXG5cdFx0Ly8gV2UgaWdub3JlIGVycm9ycyBmb3IgdGhlIGZvbGxvd2luZyBpdGVtcyBiZWNhdXNlIHRoZSB1c2VyIG1pZ2h0IG5vdCBoYXZlIHBlcm1pc3Npb24gZm9yIHRoZW1cblx0XHRldmVudEJ1cy5DYWNoZS5Hcm91cHMgPSBQcm9taXNlLnJlc29sdmUobmV3IEdyb3VwQ29sbGVjdGlvbihbXSwge1xuXHRcdFx0aXRlbV9pZDogcGFyYW0uYm9vayA/IHBhcmFtLmJvb2suZ2V0KFwiX2lkXCIpIDogcGFyYW0ubGVhcm5pbmdQYXRoLmdldChcIl9pZFwiKSxcblx0XHR9KS5sYXp5RmV0Y2goKSkuY2F0Y2goKCkgPT4gW10pO1xuXG5cdFx0cmV0dXJuIGV2ZW50QnVzLkNhY2hlLkdyb3Vwcy50aGVuKHRoaXMuZmV0Y2hTdWNjZXNzLmJpbmQodGhpcywgcGFyYW0pKS5jYXRjaCh0aGlzLmZldGNoRXJyb3IuYmluZCh0aGlzLCBwYXJhbSkpO1xuXHR9LFxuXG5cdGlzT2xkOiBmdW5jdGlvbihncm91cE1vZGVsKSB7XG5cdFx0aWYgKGdyb3VwTW9kZWwuZ2V0KFwic3RhcnRcIikgPT09IDAgJiYgZ3JvdXBNb2RlbC5nZXQoXCJlbmRcIikgPT09IDIxNDc0ODM2NDcpXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRyZXR1cm4gZ3JvdXBNb2RlbC5nZXQoXCJlbmRcIikgPCBtb21lbnQoKS51bml4KCk7XG5cdH0sXG5cblx0bG9hZEJvb2tHcm91cHM6IGZ1bmN0aW9uKHBhcmFtKSB7XG5cdFx0Ly8gRmlndXJlIG91dCB0aGUgZ3JvdXBzIGZvciB0aGlzIGJvb2tcblx0XHRsZXQgYyA9IHBhcmFtLmJvb2suZ2V0KFwiZ3JvdXBzXCIpIHx8IFtdO1xuXHRcdGxldCBoYyA9IHBhcmFtLmJvb2suZ2V0KFwiY3VzdG9tR3JvdXBzXCIpIHx8IFtdO1xuXG5cdFx0Y29uc3QgdXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cdFx0Y29uc3QgYWxsRm9yQm9vayA9IHRoaXMuZ3JvdXBzLnJlZHVjZSgoc3VtLCBpdGVtKSA9PiB7XG5cdFx0XHRpZiAoXy5pbmNsdWRlcyhjLCBpdGVtLmdldChcImNvZGVcIikpICYmICFpdGVtLmdldChcInN5c3RlbUdyb3VwXCIpKVxuXHRcdFx0XHRzdW1baXRlbS5nZXQoXCJjb2RlXCIpXSA9IGl0ZW0udG9KU09OKCk7XG5cdFx0XHRyZXR1cm4gc3VtO1xuXHRcdH0sIHt9KTtcblxuXHRcdGlmIChwYXJhbS5ib29rLmdldChcImdyb3Vwc1wiKSA9PT0gbnVsbCkge1xuXHRcdFx0Ly8gQm9vayBpcyBhc3NpZ25lZCB0byBldmVyeW9uZVxuXG5cdFx0XHR0aGlzLmFsbG93ZWRHcm91cHMgPSB7XG5cdFx0XHRcdHN5c3RlbToge30sXG5cdFx0XHRcdGN1c3RvbToge30sXG5cdFx0XHRcdGFsbDoge30sXG5cdFx0XHRcdGNoYW5nZUFsbG93ZWQ6IGZhbHNlLFxuXHRcdFx0XHRhdHRhY2hBbGxvd2VkOiB0cnVlLFxuXHRcdFx0fTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAocmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5ncm91cHMuYWxsLCB1c2VyKSkge1xuXHRcdFx0YyA9IHRoaXMuZ3JvdXBzLmZpbHRlcihpdGVtID0+ICF0aGlzLmlzT2xkKGl0ZW0pICYmIF8uaW5jbHVkZXMoYywgaXRlbS5nZXQoXCJjb2RlXCIpKSk7XG5cdFx0XHRoYyA9IHRoaXMuZ3JvdXBzLmZpbHRlcihpdGVtID0+ICF0aGlzLmlzT2xkKGl0ZW0pICYmIF8uaW5jbHVkZXMoaGMsIGl0ZW0uZ2V0KFwiY29kZVwiKSkpO1xuXG5cdFx0XHR0aGlzLmFsbG93ZWRHcm91cHMgPSB7XG5cdFx0XHRcdHN5c3RlbTogXy5yZWR1Y2UoYywgKHN1bSwgbnVtKSA9PiB7IHN1bVtudW0uZ2V0KFwiY29kZVwiKV0gPSBudW0udG9KU09OKCk7IHJldHVybiBzdW07IH0sIHt9KSxcblx0XHRcdFx0Y3VzdG9tOiBfLnJlZHVjZShoYywgKHN1bSwgbnVtKSA9PiB7IHN1bVtudW0uZ2V0KFwiY29kZVwiKV0gPSBudW0udG9KU09OKCk7IHJldHVybiBzdW07IH0sIHt9KSxcblx0XHRcdFx0YWxsOiBhbGxGb3JCb29rLFxuXHRcdFx0XHRjaGFuZ2VBbGxvd2VkOiBjLmxlbmd0aCA+IDAsXG5cdFx0XHR9O1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGNvbnN0IG15R3JvdXBzID0gKHVzZXIuZ3JvdXBzIHx8IFtdKS5jb25jYXQodXNlci5jdXN0b21Hcm91cHMgfHwgW10pO1xuXG5cdFx0XHRsZXQgbm9ybWFsID0gXy5pbnRlcnNlY3Rpb24obXlHcm91cHMsIGMgfHwgW10pO1xuXHRcdFx0bGV0IGN1c3RvbSA9IF8uaW50ZXJzZWN0aW9uKG15R3JvdXBzLCBoYyk7XG5cblx0XHRcdG5vcm1hbCA9IHRoaXMuZ3JvdXBzLmZpbHRlcihpdGVtID0+ICF0aGlzLmlzT2xkKGl0ZW0pICYmIF8uaW5jbHVkZXMobm9ybWFsLCBpdGVtLmdldChcImNvZGVcIikpKTtcblx0XHRcdGN1c3RvbSA9IHRoaXMuZ3JvdXBzLmZpbHRlcihpdGVtID0+ICF0aGlzLmlzT2xkKGl0ZW0pICYmIF8uaW5jbHVkZXMoY3VzdG9tLCBpdGVtLmdldChcImNvZGVcIikpKTtcblxuXHRcdFx0dGhpcy5hbGxvd2VkR3JvdXBzID0ge1xuXHRcdFx0XHRzeXN0ZW06IF8ucmVkdWNlKG5vcm1hbCwgKHN1bSwgbnVtKSA9PiB7IHN1bVtudW0uZ2V0KFwiY29kZVwiKV0gPSBudW0udG9KU09OKCk7IHJldHVybiBzdW07IH0sIHt9KSxcblx0XHRcdFx0Y3VzdG9tOiBfLnJlZHVjZShjdXN0b20sIChzdW0sIG51bSkgPT4geyBzdW1bbnVtLmdldChcImNvZGVcIildID0gbnVtLnRvSlNPTigpOyByZXR1cm4gc3VtOyB9LCB7fSksXG5cdFx0XHRcdGFsbDogYWxsRm9yQm9vayxcblx0XHRcdFx0Y2hhbmdlQWxsb3dlZDogbm9ybWFsLmxlbmd0aCA+IDAsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChwYXJhbS5ib29rLmdldChcImdyb3Vwc1wiKSA9PT0gbnVsbClcblx0XHRcdHRoaXMuY3VycmVudEdyb3VwcyA9IG51bGw7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5jdXJyZW50R3JvdXBzID0gXy5tYXAodGhpcy5hbGxvd2VkR3JvdXBzLnN5c3RlbSwgeCA9PiB4LmNvZGUpO1xuXG5cdFx0aWYgKHRoaXMuYWxsb3dlZEdyb3Vwcy5jaGFuZ2VBbGxvd2VkKVxuXHRcdFx0dGhpcy51aS5ncm91cHMucmVtb3ZlQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblxuXHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLkdyb3Vwc0NoYW5nZWQsIF8uY2xvbmUodGhpcy5hbGxvd2VkR3JvdXBzKSwgXy5jbG9uZSh0aGlzLmN1cnJlbnRHcm91cHMpKTtcblx0fSxcblxuXHRsb2FkTHBHcm91cHM6IGZ1bmN0aW9uKHBhcmFtKSB7XG5cdFx0bGV0IGMgPSBbcGFyYW0ubGVhcm5pbmdQYXRoLmdldChcImdyb3VwXCIpXTtcblx0XHRsZXQgaGMgPSBwYXJhbS5sZWFybmluZ1BhdGguZ2V0KFwiY3VzdG9tR3JvdXBzXCIpIHx8IFtdO1xuXG5cdFx0Y29uc3QgdXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cdFx0Y29uc3QgYWxsRm9yR3JvdXAgPSB0aGlzLmdyb3Vwcy5yZWR1Y2UoKHN1bSwgaXRlbSkgPT4ge1xuXHRcdFx0aWYgKF8uaW5jbHVkZXMoYywgaXRlbS5nZXQoXCJjb2RlXCIpKSAmJiAhaXRlbS5nZXQoXCJzeXN0ZW1Hcm91cFwiKSlcblx0XHRcdFx0c3VtW2l0ZW0uZ2V0KFwiY29kZVwiKV0gPSBpdGVtLnRvSlNPTigpO1xuXHRcdFx0cmV0dXJuIHN1bTtcblx0XHR9LCB7fSk7XG5cblx0XHRpZiAocmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5ncm91cHMuYWxsLCB1c2VyKSkge1xuXHRcdFx0YyA9IHRoaXMuZ3JvdXBzLmZpbHRlcihpdGVtID0+IF8uaW5jbHVkZXMoYywgaXRlbS5nZXQoXCJjb2RlXCIpKSk7XG5cdFx0XHRoYyA9IHRoaXMuZ3JvdXBzLmZpbHRlcihpdGVtID0+IF8uaW5jbHVkZXMoaGMsIGl0ZW0uZ2V0KFwiY29kZVwiKSkpO1xuXG5cdFx0XHR0aGlzLmFsbG93ZWRHcm91cHMgPSB7XG5cdFx0XHRcdHN5c3RlbTogXy5yZWR1Y2UoYywgKHN1bSwgbnVtKSA9PiB7IHN1bVtudW0uZ2V0KFwiY29kZVwiKV0gPSBudW0udG9KU09OKCk7IHJldHVybiBzdW07IH0sIHt9KSxcblx0XHRcdFx0Y3VzdG9tOiBfLnJlZHVjZShoYywgKHN1bSwgbnVtKSA9PiB7IHN1bVtudW0uZ2V0KFwiY29kZVwiKV0gPSBudW0udG9KU09OKCk7IHJldHVybiBzdW07IH0sIHt9KSxcblx0XHRcdFx0YWxsOiBhbGxGb3JHcm91cCxcblx0XHRcdFx0Y2hhbmdlQWxsb3dlZDogYy5sZW5ndGggPiAwLFxuXHRcdFx0fTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRjb25zdCBteUdyb3VwcyA9ICh1c2VyLmdyb3VwcyB8fCBbXSkuY29uY2F0KHVzZXIuY3VzdG9tR3JvdXBzIHx8IFtdKTtcblxuXHRcdFx0bGV0IG5vcm1hbCA9IF8uaW50ZXJzZWN0aW9uKG15R3JvdXBzLCBjIHx8IFtdKTtcblx0XHRcdGxldCBjdXN0b20gPSBfLmludGVyc2VjdGlvbihteUdyb3VwcywgaGMpO1xuXG5cdFx0XHRub3JtYWwgPSB0aGlzLmdyb3Vwcy5maWx0ZXIoaXRlbSA9PiBfLmluY2x1ZGVzKG5vcm1hbCwgaXRlbS5nZXQoXCJjb2RlXCIpKSk7XG5cdFx0XHRjdXN0b20gPSB0aGlzLmdyb3Vwcy5maWx0ZXIoaXRlbSA9PiBfLmluY2x1ZGVzKGN1c3RvbSwgaXRlbS5nZXQoXCJjb2RlXCIpKSk7XG5cblx0XHRcdHRoaXMuYWxsb3dlZEdyb3VwcyA9IHtcblx0XHRcdFx0c3lzdGVtOiBfLnJlZHVjZShub3JtYWwsIChzdW0sIG51bSkgPT4geyBzdW1bbnVtLmdldChcImNvZGVcIildID0gbnVtLnRvSlNPTigpOyByZXR1cm4gc3VtOyB9LCB7fSksXG5cdFx0XHRcdGN1c3RvbTogXy5yZWR1Y2UoY3VzdG9tLCAoc3VtLCBudW0pID0+IHsgc3VtW251bS5nZXQoXCJjb2RlXCIpXSA9IG51bS50b0pTT04oKTsgcmV0dXJuIHN1bTsgfSwge30pLFxuXHRcdFx0XHRhbGw6IGFsbEZvckdyb3VwLFxuXHRcdFx0XHRjaGFuZ2VBbGxvd2VkOiBub3JtYWwubGVuZ3RoID4gMCxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0dGhpcy5jdXJyZW50R3JvdXBzID0gXy5tYXAodGhpcy5hbGxvd2VkR3JvdXBzLnN5c3RlbSwgeCA9PiB4LmNvZGUpO1xuXG5cdFx0aWYgKHRoaXMuYWxsb3dlZEdyb3Vwcy5jaGFuZ2VBbGxvd2VkICYmICF0aGlzLmxwTW9kZSlcblx0XHRcdHRoaXMudWkuZ3JvdXBzLnJlbW92ZUNsYXNzKFwiZGlzYWJsZWRcIik7XG5cblx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5Hcm91cHNDaGFuZ2VkLCBfLmNsb25lKHRoaXMuYWxsb3dlZEdyb3VwcyksIF8uY2xvbmUodGhpcy5jdXJyZW50R3JvdXBzKSk7XG5cdH0sXG5cblx0Z2V0QWxsb3dlZEdyb3VwczogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuYWxsb3dlZEdyb3Vwcztcblx0fSxcblxuXHRnZXRDdXJyZW50R3JvdXBzOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5jdXJyZW50R3JvdXBzO1xuXHR9LFxuXG5cdHVubG9hZEdyb3VwczogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5ncm91cHMuYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblx0fSxcblxuXHRoYW5kbGVHcm91cENoYW5nZTogZnVuY3Rpb24oYWxsb3dlZCwgY3VycmVudCkge1xuXHRcdC8vIElmIG5vdCBhbGwgc3lzdGVtIGdyb3VwcyBhcmUgc2VsZWN0ZWRcblx0XHRpZiAoXy5pbnRlcnNlY3Rpb24oXy5rZXlzKGFsbG93ZWQuc3lzdGVtKSwgY3VycmVudCkubGVuZ3RoID09PSBfLmtleXMoYWxsb3dlZC5zeXN0ZW0pLmxlbmd0aClcblx0XHRcdHRoaXMudWkuZ3JvdXBzLnJlbW92ZUNsYXNzKFwicGFydGlhbC1ncm91cFwiKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnVpLmdyb3Vwcy5hZGRDbGFzcyhcInBhcnRpYWwtZ3JvdXBcIik7XG5cblx0XHQvLyBBbGxvdyByZXNvdXJjZSBkcmFnZ2luZyBpZiB0aGUgYm9vayBoYXMgZW5vdWdoIGdyb3Vwc1xuXHRcdGlmIChhbGxvd2VkLmF0dGFjaEFsbG93ZWQgfHwgYWxsb3dlZC5jaGFuZ2VBbGxvd2VkKVxuXHRcdFx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5FdmVudHMuRW5hYmxlUmVzb3VyY2VEcmFnZ2luZyk7XG5cdFx0ZWxzZVxuXHRcdFx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5FdmVudHMuRGlzYWJsZVJlc291cmNlRHJhZ2dpbmcpO1xuXHR9LFxuXG5cdGNob29zZUdyb3VwczogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgbW9kYWwgPSBuZXcgR3JvdXBNb2RhbCh7IGhvc3Q6IFwiI2xpbmstcmVzb3VyY2VzXCIgfSk7XG5cblx0XHRtb2RhbC5zaG93KHtcblx0XHRcdG9rOiByZXN1bHQgPT4ge1xuXHRcdFx0XHR0aGlzLmN1cnJlbnRHcm91cHMgPSByZXN1bHQudmFsdWVzO1xuXHRcdFx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5Hcm91cHNDaGFuZ2VkLCBfLmNsb25lKHRoaXMuYWxsb3dlZEdyb3VwcyksIF8uY2xvbmUodGhpcy5jdXJyZW50R3JvdXBzKSk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9LFxuXG5cdGxvYWROYXY6IGZ1bmN0aW9uKG5hdk9iaikge1xuXHRcdHRoaXMubmF2aWdhdGlvbiA9IG5hdk9iajtcblx0XHQkKFwiI2JvZHktY29udGFpbmVyLWxlZnQtbWFyZ2luXCIpLmFwcGVuZCh0aGlzLm5hdmlnYXRpb24ucmVuZGVyKCkuZWwpO1xuXG5cdFx0dGhpcy51aS5uYXZpZ2F0aW9uLnJlbW92ZUNsYXNzKFwiZGlzYWJsZWRcIik7XG5cdH0sXG5cblx0dW5sb2FkTmF2OiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5uYXZpZ2F0aW9uKVxuXHRcdFx0dGhpcy5uYXZpZ2F0aW9uLmRlc3Ryb3koKTtcblx0XHRkZWxldGUgdGhpcy5uYXZpZ2F0aW9uO1xuXHRcdHRoaXMudWkubmF2aWdhdGlvbi5hZGRDbGFzcyhcImRpc2FibGVkXCIpLnJlbW92ZUNsYXNzKFwiYWN0aXZlXCIpO1xuXHR9LFxuXG5cdG9uQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdGV2ZW50QnVzLnRyaWdnZXIoZXZlbnRCdXMuRXZlbnRzLkNsb3NlUmVzb3VyY2VzKTtcblx0fSxcblxuXHRvbk5hdmlnYXRpb25DbGljazogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGlmICghdGhpcy51aS5uYXZpZ2F0aW9uLmhhc0NsYXNzKFwiZGlzYWJsZWRcIikpXG5cdFx0XHR0aGlzLnRvZ2dsZU5hdmlnYXRpb24oKTtcblx0fSxcblxuXHRvblJlc291cmNlc0NsaWNrOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0aWYgKCF0aGlzLnVpLnJlc291cmNlcy5oYXNDbGFzcyhcImRpc2FibGVkXCIpKVxuXHRcdFx0dGhpcy50b2dnbGVSZXNvdXJjZXMoKTtcblx0fSxcblxuXHRvbkdyb3Vwc0NsaWNrOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0aWYgKCF0aGlzLnVpLmdyb3Vwcy5oYXNDbGFzcyhcImRpc2FibGVkXCIpKVxuXHRcdFx0dGhpcy5jaG9vc2VHcm91cHMoKTtcblx0fSxcblxuXHRvbkhvbWVDbGljazogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGlmICghdGhpcy51aS5ob21lLmhhc0NsYXNzKFwiZGlzYWJsZWRcIikpXG5cdFx0XHR0aGlzLmdvSG9tZSgpO1xuXHR9LFxuXG5cdG9uQ3JlYXRlQ2xpY2s6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRpZiAoIXRoaXMudWkuY3JlYXRlLmhhc0NsYXNzKFwiZGlzYWJsZWRcIikpXG5cdFx0XHR0aGlzLmNyZWF0ZUl0ZW1zKGV2ZW50KTtcblx0fSxcblxuXHRvbkZsYXNoQ2FyZENsaWNrOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0aWYgKCF0aGlzLnVpLmZsYXNoQ2FyZC5oYXNDbGFzcyhcImRpc2FibGVkXCIpKSB7XG5cdFx0XHR0aGlzLnVpLmZsYXNoQ2FyZC5hZGRDbGFzcyhcImRpc2FibGVkXCIpO1xuXHRcdFx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5FdmVudHMuU2hvd0ZsYXNoQ2FyZFdpZGdldCk7XG5cdFx0fVxuXHR9LFxuXG5cdG9uQ2FtQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGJvb2sgPSBldmVudEJ1cy5yZXF1ZXN0KGV2ZW50QnVzLkV2ZW50cy5HZXRDdXJyZW50Qm9vayk7XG5cblx0XHRpZiAoYm9vayAmJiBib29rLmhhcyhcInVuaXZlcnNhbF9pZFwiKSkge1xuXHRcdFx0d2luZG93Lm9wZW4oc2V0dGluZ3MudXJsUm9vdCArIFwiL2NvbnNvbGUvY2FtP2Jvb2s9XCIgKyBib29rLmdldChcInVuaXZlcnNhbF9pZFwiKSwgXCJfYmxhbmtcIik7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgZ3JvdXAgPSBldmVudEJ1cy5yZXF1ZXN0KGV2ZW50QnVzLkV2ZW50cy5HZXRDdXJyZW50R3JvdXApO1xuXG5cdFx0aWYgKGdyb3VwICYmIGdyb3VwLmhhcyhcImNvZGVcIikpXG5cdFx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvY29uc29sZS9jYW0/Z3JvdXBzPVwiICsgZ3JvdXAuZ2V0KFwiY29kZVwiKSwgXCJfYmxhbmtcIik7XG5cdFx0ZWxzZVxuXHRcdFx0d2luZG93Lm9wZW4oc2V0dGluZ3MudXJsUm9vdCArIFwiL2NvbnNvbGUvY2FtXCIsIFwiX2JsYW5rXCIpO1xuXHR9LFxuXG5cdHRvZ2dsZU5hdmlnYXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudG9nZ2xlKFwibmF2aWdhdGlvblwiKTtcblx0fSxcblxuXHR0b2dnbGVSZXNvdXJjZXM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudG9nZ2xlKFwicmVzb3VyY2VzXCIpO1xuXHR9LFxuXG5cdHRvZ2dsZTogZnVuY3Rpb24obWVudSwgX3N0YXRlKSB7XG5cdFx0aWYgKCF0aGlzW21lbnVdKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0bGV0IHN0YXRlID0gX3N0YXRlO1xuXG5cdFx0aWYgKF8uaXNVbmRlZmluZWQoc3RhdGUpKVxuXHRcdFx0c3RhdGUgPSAhdGhpcy5zdGF0ZVttZW51XTtcblxuXHRcdGNvbnN0IGhpZGUgPSBtID0+IHtcblx0XHRcdGlmICghdGhpcy5zdGF0ZVttXSB8fCAhdGhpc1ttXSlcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0dGhpc1ttXS5oaWRlKCk7XG5cdFx0XHR0aGlzLnVpW21dLnJlbW92ZUNsYXNzKFwiYWN0aXZlXCIpO1xuXHRcdFx0ZGVsZXRlIHRoaXMuc3RhdGVbbV07XG5cdFx0fTtcblxuXHRcdGlmIChzdGF0ZSkge1xuXHRcdFx0dGhpc1ttZW51XS5zaG93KCk7XG5cdFx0XHR0aGlzLnVpW21lbnVdLmFkZENsYXNzKFwiYWN0aXZlXCIpO1xuXHRcdFx0dGhpcy5zdGF0ZVttZW51XSA9IHRydWU7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0aGlkZShtZW51KTtcblx0XHR9XG5cblx0XHRmb3IoY29uc3Qga2V5IGluIHRoaXMuc3RhdGUpIHtcblx0XHRcdGlmIChrZXkgIT09IG1lbnUpXG5cdFx0XHRcdGhpZGUoa2V5KTtcblx0XHR9XG5cdH0sXG5cblx0ZGlzYWJsZVJlc291cmNlQnV0dG9uOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLnJlc291cmNlcy5hZGRDbGFzcyhcImRpc2FibGVkXCIpO1xuXHR9LFxuXG5cdGVuYWJsZVJlc291cmNlQnV0dG9uOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIXRoaXMubHBNb2RlKVxuXHRcdFx0dGhpcy51aS5yZXNvdXJjZXMucmVtb3ZlQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblx0fSxcblxuXHRvbkFkZFJlc291cmNlQ2xpY2tlZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5hc3NlbWJsZVJlc291cmNlKCk7XG5cdH0sXG5cblx0YXNzZW1ibGVSZXNvdXJjZTogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgbW9kZWwgPSBuZXcgUmVzb3VyY2UoKTtcblxuXHRcdGNvbnN0IGJvb2sgPSBldmVudEJ1cy5yZXF1ZXN0KGV2ZW50QnVzLkV2ZW50cy5HZXRDdXJyZW50Qm9vayk7XG5cdFx0Y29uc3QgZ3JvdXAgPSBldmVudEJ1cy5yZXF1ZXN0KGV2ZW50QnVzLkV2ZW50cy5HZXRDdXJyZW50R3JvdXApO1xuXG5cdFx0aWYgKGJvb2sgJiYgYm9vay5pZCkge1xuXHRcdFx0bW9kZWwuc2V0KHtcblx0XHRcdFx0bGFuZ3VhZ2U6IGJvb2suZ2V0KFwibWV0YWRhdGFcIikgPyBib29rLmdldChcIm1ldGFkYXRhXCIpLmxhbmd1YWdlIDogbnVsbCxcblx0XHRcdFx0c3R1ZHlZZWFyOiBib29rLmdldChcIm1ldGFkYXRhXCIpID8gYm9vay5nZXQoXCJtZXRhZGF0YVwiKS5ncmFkZSA6IG51bGwsXG5cdFx0XHRcdHN1YmplY3Q6IGJvb2suZ2V0KFwic3ViamVjdFwiKSA/IGJvb2suZ2V0KFwic3ViamVjdFwiKSA6IG51bGwsXG5cdFx0XHRcdHN1YmplY3RfbmFtZTogYm9vay5nZXQoXCJtZXRhZGF0YVwiKSA/IGJvb2suZ2V0KFwibWV0YWRhdGFcIikuc3ViamVjdCA6IG51bGwsXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoZ3JvdXAgJiYgZ3JvdXAuaWQpIHtcblx0XHRcdG1vZGVsLnNldCh7XG5cdFx0XHRcdGxhbmd1YWdlOiBncm91cC5nZXQoXCJsYW5ndWFnZVwiKSxcblx0XHRcdFx0c3R1ZHlZZWFyOiBncm91cC5nZXQoXCJncmFkZVwiKSxcblx0XHRcdFx0c3ViamVjdDogZ3JvdXAuZ2V0KFwic3ViamVjdF9pZFwiKSB8fCBncm91cC5nZXQoXCJzdWJqZWN0XCIpLFxuXHRcdFx0XHRzdWJqZWN0X25hbWU6IGdyb3VwLmdldChcInN1YmplY3RfbmFtZVwiKSB8fCBncm91cC5nZXQoXCJzdWJqZWN0XCIpLFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgbW9kYWwgPSBuZXcgUmVzb3VyY2VNb2RhbCh7XG5cdFx0XHRtb2RlbDogbW9kZWwsXG5cdFx0XHRob3N0OiBcIi5tb2RhbC1ob3N0XCIsXG5cdFx0fSk7XG5cblx0XHRtb2RhbC5zaG93KCk7XG5cdH0sXG5cblx0b25BZGRBc3Nlc3NtZW50Q2xpY2tlZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5hc3NlbWJsZUFzc2Vzc21lbnQoKTtcblx0fSxcblxuXHRhc3NlbWJsZUFzc2Vzc21lbnQ6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0Y29uc3QgYm9vayA9IGV2ZW50QnVzLnJlcXVlc3QoZXZlbnRCdXMuRXZlbnRzLkdldEN1cnJlbnRCb29rKTtcblx0XHRjb25zdCBncm91cCA9IGV2ZW50QnVzLnJlcXVlc3QoZXZlbnRCdXMuRXZlbnRzLkdldEN1cnJlbnRHcm91cCk7XG5cblx0XHRjb25zdCBhc3Nlc3NtZW50ID0gbW9kZWwgfHwgbmV3IEFzc2Vzc21lbnQoKTtcblxuXHRcdGlmIChib29rICYmIGJvb2suaWQpIHtcblx0XHRcdGFzc2Vzc21lbnQuc2V0KHtcblx0XHRcdFx0bGFuZ3VhZ2U6IGJvb2suZ2V0KFwibWV0YWRhdGFcIikgPyBib29rLmdldChcIm1ldGFkYXRhXCIpLmxhbmd1YWdlIDogbnVsbCxcblx0XHRcdFx0c3R1ZHlZZWFyOiBib29rLmdldChcIm1ldGFkYXRhXCIpID8gYm9vay5nZXQoXCJtZXRhZGF0YVwiKS5ncmFkZSA6IG51bGwsXG5cdFx0XHRcdHN1YmplY3Q6IGJvb2suZ2V0KFwic3ViamVjdFwiKSA/IGJvb2suZ2V0KFwic3ViamVjdFwiKSA6IG51bGwsXG5cdFx0XHRcdHN1YmplY3RfbmFtZTogYm9vay5nZXQoXCJtZXRhZGF0YVwiKSA/IGJvb2suZ2V0KFwibWV0YWRhdGFcIikuc3ViamVjdCA6IG51bGwsXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoZ3JvdXAgJiYgZ3JvdXAuaWQpIHtcblx0XHRcdGFzc2Vzc21lbnQuc2V0KHtcblx0XHRcdFx0bGFuZ3VhZ2U6IGdyb3VwLmdldChcImxhbmd1YWdlXCIpLFxuXHRcdFx0XHRzdHVkeVllYXI6IGdyb3VwLmdldChcImdyYWRlXCIpLFxuXHRcdFx0XHRzdWJqZWN0OiBncm91cC5nZXQoXCJzdWJqZWN0X2lkXCIpIHx8IGdyb3VwLmdldChcInN1YmplY3RcIiksXG5cdFx0XHRcdHN1YmplY3RfbmFtZTogZ3JvdXAuZ2V0KFwic3ViamVjdF9uYW1lXCIpIHx8IGdyb3VwLmdldChcInN1YmplY3RcIiksXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRjb25zdCBtb2RhbCA9IG5ldyBBc3Nlc3NtZW50TW9kYWwoeyBtb2RlbDogYXNzZXNzbWVudCwgaG9zdDogXCIjbW9kYWxzXCIgfSk7XG5cblx0XHRtb2RhbC5zaG93KHtcblx0XHRcdGNyZWF0ZTogcmVzdWx0ID0+IHtcblx0XHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7XG5cdFx0XHRcdFx0Y29udGVudDogXCJOZXcgaXRlbSBcIiArIHJlc3VsdC5tb2RlbC5nZXQoXCJ0aXRsZVwiKSArIFwiIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXCIsXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdHVwZGF0ZTogcmVzdWx0ID0+IHtcblx0XHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7XG5cdFx0XHRcdFx0Y29udGVudDogXCJJdGVtIFwiICsgcmVzdWx0Lm1vZGVsLmdldChcInRpdGxlXCIpICsgXCIgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWRcIixcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9LFxuXG5cdG9uQWRkRXZlbnRDbGlja2VkOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmFzc2VtYmxlRXZlbnQoKTtcblx0fSxcblxuXHRhc3NlbWJsZUV2ZW50OiBmdW5jdGlvbihtb2RlbCwgaW5saW5lU3VjY2Vzc01lc3NhZ2UsIGlubGluZUVycm9yTWVzc2FnZSkge1xuXHRcdHRoaXMuRXZlbnRNb2RhbCA9IG5ldyBFdmVudE1vZGFsKHtcblx0XHRcdG1vZGVsOiBtb2RlbCA/IG1vZGVsIDogbmV3IEV2ZW50KCksXG5cdFx0XHRtZXRhZGF0YTogdGhpcy5FdmVudE1ldGFkYXRhTW9kZWwsXG5cdFx0XHRpbmxpbmVTdWNjZXNzTWVzc2FnZTogaW5saW5lU3VjY2Vzc01lc3NhZ2UgfHwgXCJcIixcblx0XHRcdGlubGluZUVycm9yTWVzc2FnZTogaW5saW5lRXJyb3JNZXNzYWdlIHx8IFwiXCIsXG5cdFx0XHRob3N0OiAkKFwiI2xpbmstcmVzb3VyY2VzXCIpLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5FdmVudE1vZGFsLm9uY2UoXCJhY3Rpb25cIiwgKGFjdGlvbiwgZGF0YSkgPT4ge1xuXHRcdFx0c3dpdGNoIChhY3Rpb24pIHtcblx0XHRcdFx0Y2FzZSBcImFkZGVkXCI6XG5cdFx0XHRcdFx0dGhpcy50cmlnZ2VyKFwiZXZlbnQ6Y3JlYXRlZFwiLCBkYXRhLm1vZGVsKTtcblxuXHRcdFx0XHRcdGlmIChkYXRhLmFkZEFub3RoZXIpXG5cdFx0XHRcdFx0XHR0aGlzLmFzc2VtYmxlRXZlbnQobmV3IEV2ZW50KHt9KSwgXCJOZXcgZXZlbnQgXFxcIlwiICsgZGF0YS5tb2RlbC5nZXQoXCJ0aXRsZVwiKSArIFwiXFxcIiBzdWNjZXNzZnVsbHkgYWRkZWRcIik7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7IGNvbnRlbnQ6IFwiTmV3IGV2ZW50IFwiICsgZGF0YS5tb2RlbC5nZXQoXCJ0aXRsZVwiKSArIFwiIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXCIgfSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcInVwZGF0ZWRcIjpcblx0XHRcdFx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuVG9hc3QsIHsgY29udGVudDogXCJFdmVudCBcIiArIGRhdGEubW9kZWwuZ2V0KFwidGl0bGVcIikgKyBcIiBzdWNjZXNzZnVsbHkgdXBkYXRlZFwiIH0pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJza2lwXCI6XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGFjdGlvblwiKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHRoaXMuRXZlbnRNb2RhbC5zaG93KCk7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnJlc291cmNlcy5kZXN0cm95KCk7XG5cdFx0ZXZlbnRCdXMudHJpZ2dlcihldmVudEJ1cy5FdmVudHMuSGlkZUZsYXNoQ2FyZFdpZGdldCk7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar settings = require(\"app-settings\");\n\nvar BigModal = require(\"../../lib/bigModal\");\n\nvar SubmissionListItem = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"submission-list-item\",\n\n\ttemplate: require(\"../templates/evaluationModal.nunj\").submissionListItem,\n\n\tui: {\n\t\ttitle: \"span.title\"\n\t},\n\n\tevents: {\n\t\tclick: \"onClick\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this = this;\n\n\t\treturn {\n\t\t\townerFirstName: function ownerFirstName() {\n\t\t\t\treturn _this.model.get(\"ownerFirstName\");\n\t\t\t},\n\t\t\townerSurname: function ownerSurname() {\n\t\t\t\treturn _this.model.get(\"ownerSurname\");\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.listenTo(this.model, \"submission:selected\", this.onSelected.bind(this));\n\t\tthis.listenTo(this.model, \"submission:unselected\", this.onUnselected.bind(this));\n\t},\n\n\tonClick: function onClick() {\n\t\tthis.model.trigger(\"submission:selected\", this.model);\n\t},\n\n\tonSelected: function onSelected() {\n\t\tthis.$el.addClass(\"selected\");\n\t},\n\n\tonUnselected: function onUnselected() {\n\t\tthis.$el.removeClass(\"selected\");\n\t}\n});\n\nvar SubmissionList = Backbone.Marionette.CollectionView.extend({\n\ttagName: \"div\",\n\n\ttemplate: false,\n\n\tchildView: SubmissionListItem,\n\n\tinitialize: function initialize() {\n\t\tthis.listenTo(this.collection, \"submission:selected\", this.onSubmissionSelected.bind(this));\n\t},\n\n\tonSubmissionSelected: function onSubmissionSelected(model) {\n\t\tif (this.SelectedSubmission && this.SelectedSubmission.get(\"_id\") !== model.get(\"_id\")) this.SelectedSubmission.trigger(\"submission:unselected\");\n\n\t\tif (this.SelectedSubmission && this.SelectedSubmission.get(\"_id\") === null && model.get(\"_id\") === null) {\n\t\t\tif (this.SelectedSubmission.cid !== model.cid) this.SelectedSubmission.trigger(\"submission:unselected\");\n\t\t}\n\n\t\tthis.SelectedSubmission = model;\n\t}\n});\n\nmodule.exports = BigModal.extend({\n\tui: {\n\t\tsubmissionListContainer: \".submission-list-container\",\n\t\tevaluationContainer: \".evaluation-container\",\n\t\tcounter: \".counter\",\n\t\tpaginator: \".paginator\",\n\t\tstudentName: \".student-name\",\n\t\tquestionTitle: \".question-title\",\n\t\tquestionResponse: \".question-response\",\n\t\tmaxScore: \".max-score\",\n\t\tfeedbackInput: \"#feedback-input\",\n\t\tscoreInput: \"#score-input\",\n\t\tmessage: \".message\",\n\t\tbuttonMark: \"button.mark\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonMark\": \"onMark\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\t_.bindAll(this);\n\n\t\tthis.Options = {\n\t\t\tclasses: [\"evaluation-modal\"],\n\t\t\ttemplate: require(\"../templates/evaluationModal.nunj\").content,\n\t\t\tbuttons: {\n\t\t\t\tclose: {\n\t\t\t\t\ttype: \"cancel\",\n\t\t\t\t\tlabel: \"Close\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tdataNoun: \"answer\",\n\t\t\teditVerb: \"evaluate\",\n\t\t\thost: options.host\n\t\t\t/*sizeConstraints: {\n   \tminHeight: \"60vh\",\n   \tminWidth: \"75vw\",\n   \tmaxWidth: \"75vw\",\n   },*/\n\t\t};\n\n\t\tthis.Question = options.question;\n\t\tthis.Answers = options.answers;\n\t\tthis.Grid = options.grid;\n\n\t\tthis.listenTo(this.Answers, \"submission:selected\", this.onSubmissionSelected.bind(this));\n\n\t\tthis.ui = _.extend(this.ui, BigModal.prototype.ui);\n\t\tthis.events = _.extend(this.events, BigModal.prototype.events);\n\n\t\tBigModal.prototype.initialize.call(this);\n\t},\n\n\trenderForm: function renderForm() {\n\t\t// Render the submission list\n\t\tthis.SubmissionList = new SubmissionList({ collection: this.Answers });\n\t\tthis.ui.submissionListContainer.append(this.SubmissionList.render().el);\n\n\t\tthis.ui.paginator.append(this.Grid.paginator.render().el);\n\n\t\t// Select a submission\n\t\tif (this.Answers.length > 0) {\n\t\t\tif (!this.selectNextUnmarkedSubmission()) this.selectSubmission(this.Answers.at(0));\n\n\t\t\tthis.updateCounter();\n\t\t} else {\n\t\t\tthis.ui.evaluationContainer.addClass(\"hide\");\n\t\t}\n\t},\n\n\tonSubmissionSelected: function onSubmissionSelected(model) {\n\t\tthis.ui.studentName.text(model.get(\"ownerFirstName\") + \" \" + model.get(\"ownerSurname\"));\n\t\tthis.ui.questionTitle.text(this.Question.question);\n\n\t\tif (model.has(\"payload\") && model.get(\"payload\").results.scores[this.Question.id]) {\n\t\t\tthis.ui.questionResponse.text(model.get(\"payload\").results.scores[this.Question.id].answers[0]);\n\t\t\tthis.ui.feedbackInput.val(model.get(\"payload\").results.scores[this.Question.id].feedback ? model.get(\"payload\").results.scores[this.Question.id].feedback : \"\");\n\t\t\tthis.ui.scoreInput.val(_.isNil(model.get(\"payload\").results.scores[this.Question.id].score) ? \"\" : model.get(\"payload\").results.scores[this.Question.id].score.toString());\n\t\t\tthis.ui.scoreInput.focus();\n\t\t\tthis.enableInput();\n\t\t} else {\n\t\t\tthis.ui.questionResponse.text(\"[Not attempted]\");\n\t\t\tthis.ui.feedbackInput.val(\"\");\n\t\t\tthis.ui.scoreInput.val(\"\");\n\t\t\tthis.disableInput();\n\t\t}\n\n\t\tthis.SelectedSubmission = model;\n\n\t\tthis.updateMaxScore();\n\t},\n\n\tdisableInput: function disableInput() {\n\t\tthis.ui.feedbackInput.prop(\"disabled\", true);\n\t\tthis.ui.scoreInput.prop(\"disabled\", true);\n\n\t\tthis.ui.buttonMark.prop(\"disabled\", true);\n\t\tthis.ui.buttonMark.addClass(\"disabled\");\n\t},\n\n\tenableInput: function enableInput() {\n\t\tthis.ui.feedbackInput.prop(\"disabled\", false);\n\t\tthis.ui.scoreInput.prop(\"disabled\", false);\n\n\t\tthis.ui.buttonMark.prop(\"disabled\", false);\n\t\tthis.ui.buttonMark.removeClass(\"disabled\");\n\t},\n\n\tupdateCounter: function updateCounter() {\n\t\tvar _this2 = this;\n\n\t\t$.ajax({\n\t\t\turl: settings.urlRoot + \"/api/1.0/assessments/\" + this.Answers.AssessmentID + \"/marks/\" + this.Answers.InstanceID + \"/unmarkedCount?question_id=\" + this.Question.id,\n\t\t\tsuccess: function success(response) {\n\t\t\t\tif (response.count === 0) _this2.ui.counter.text(\"All submissions marked.\");else _this2.ui.counter.text(response.count + \" unmarked answer\" + (response.count === 1 ? \"\" : \"s\") + \" remaining\");\n\t\t\t},\n\t\t\terror: function error() {\n\t\t\t\t_this2.showMessage(\"Error fetching number of marked answers\");\n\t\t\t}\n\t\t});\n\t},\n\n\tupdateMaxScore: function updateMaxScore() {\n\t\tthis.ui.maxScore.text(\"Full mark: \" + this.Question.potentialScore);\n\t},\n\n\tonMark: function onMark(event) {\n\t\tvar _this3 = this;\n\n\t\tevent.stopPropagation();\n\n\t\tvar payload = this.SelectedSubmission.get(\"payload\");\n\n\t\tvar score = parseInt(this.ui.scoreInput.val(), 10);\n\t\tvar potentialScore = payload.results.scores[this.Question.id].potentialScore || payload.results.scores[this.Question.id].maxScore || 0;\n\n\t\tif (isNaN(score)) {\n\t\t\tthis.showValidationErrorMessage(this.ui.scoreInput, this.ui.scoreInput, \"You must enter a valid (whole number) mark.\", \"left\");\n\t\t} else if (score > potentialScore) {\n\t\t\tthis.showValidationErrorMessage(this.ui.scoreInput, this.ui.scoreInput, \"You cannot enter a higher mark than the maximum for this question.\", \"left\");\n\t\t} else {\n\t\t\t// Save the feedback and mark\n\t\t\tif (this.ui.feedbackInput.val()) payload.results.scores[this.Question.id].feedback = this.ui.feedbackInput.val();\n\n\t\t\tvar oldScore = payload.results.scores[this.Question.id].score ? payload.results.scores[this.Question.id].score : 0;\n\t\t\tpayload.results.mark -= oldScore;\n\n\t\t\tpayload.results.scores[this.Question.id].score = score;\n\t\t\tpayload.results.mark += score;\n\n\t\t\tthis.disableInput();\n\n\t\t\tthis.xhr = this.SelectedSubmission.save({ payload: payload }, {\n\t\t\t\twait: true,\n\t\t\t\tsuccess: function success() {\n\t\t\t\t\t_this3.xhr = null;\n\t\t\t\t\t_this3.DataChanged = true;\n\n\t\t\t\t\t_this3.SelectedSubmission.initComputeds();\n\n\t\t\t\t\tif (!_this3.selectNextUnmarkedSubmission()) _this3.selectSubmission(_this3.SelectedSubmission);\n\n\t\t\t\t\t_this3.updateCounter();\n\n\t\t\t\t\t_this3.showMessage(\"Evaluation saved.\");\n\n\t\t\t\t\t_this3.enableInput();\n\t\t\t\t},\n\t\t\t\terror: this.onSaveError.bind(this)\n\t\t\t});\n\t\t}\n\t},\n\n\tselectNextUnmarkedSubmission: function selectNextUnmarkedSubmission() {\n\t\tvar _this4 = this;\n\n\t\tvar submission = this.Answers.find(function (answer) {\n\t\t\treturn answer.has(\"payload\") && _this4.Question.id in answer.get(\"payload\").results.scores && answer.get(\"payload\").results.scores[_this4.Question.id].score === undefined;\n\t\t});\n\n\t\tif (submission) this.selectSubmission(submission);\n\n\t\treturn submission;\n\t},\n\n\tselectSubmission: function selectSubmission(submission) {\n\t\tsubmission.trigger(\"submission:selected\", submission);\n\n\t\tif (submission.get(\"marked\")) this.ui.buttonMark.text(\"Update\");else this.ui.buttonMark.text(\"Mark\");\n\t},\n\n\tonSaveError: function onSaveError(model, response) {\n\t\tthis.xhr = null;\n\n\t\tthis.setUIReady();\n\n\t\tvar answer = {};\n\n\t\ttry {\n\t\t\tanswer = JSON.parse(response.responseText);\n\t\t} catch (error) {\n\t\t\tanswer.detail = (response.status === 0 ? \"Connection error\" : response.statusText) + \" (code \" + response.status + \")\";\n\t\t}\n\n\t\tthis.showMessage(\"Error saving mark: \" + answer.detail || answer.info);\n\t},\n\n\tshowMessage: function showMessage(message) {\n\t\tvar _this5 = this;\n\n\t\tthis.ui.message.text(message).removeClass(\"hide\");\n\n\t\tsetTimeout(function () {\n\t\t\tif (_this5.ui.message && _this5.ui.message.addClass) _this5.ui.message.addClass(\"hide\");\n\t\t}, 3000);\n\t},\n\n\tassembleResult: function assembleResult() {\n\t\treturn { dataChanged: this.DataChanged };\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV2YWx1YXRpb25Nb2RhbC5qcyJdLCJuYW1lcyI6WyIkIiwicmVxdWlyZSIsIl8iLCJCYWNrYm9uZSIsInNldHRpbmdzIiwiQmlnTW9kYWwiLCJTdWJtaXNzaW9uTGlzdEl0ZW0iLCJNYXJpb25ldHRlIiwiVmlldyIsImV4dGVuZCIsInRhZ05hbWUiLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsInN1Ym1pc3Npb25MaXN0SXRlbSIsInVpIiwidGl0bGUiLCJldmVudHMiLCJjbGljayIsInRlbXBsYXRlQ29udGV4dCIsIm93bmVyRmlyc3ROYW1lIiwibW9kZWwiLCJnZXQiLCJvd25lclN1cm5hbWUiLCJpbml0aWFsaXplIiwibGlzdGVuVG8iLCJvblNlbGVjdGVkIiwiYmluZCIsIm9uVW5zZWxlY3RlZCIsIm9uQ2xpY2siLCJ0cmlnZ2VyIiwiJGVsIiwiYWRkQ2xhc3MiLCJyZW1vdmVDbGFzcyIsIlN1Ym1pc3Npb25MaXN0IiwiQ29sbGVjdGlvblZpZXciLCJjaGlsZFZpZXciLCJjb2xsZWN0aW9uIiwib25TdWJtaXNzaW9uU2VsZWN0ZWQiLCJTZWxlY3RlZFN1Ym1pc3Npb24iLCJjaWQiLCJtb2R1bGUiLCJleHBvcnRzIiwic3VibWlzc2lvbkxpc3RDb250YWluZXIiLCJldmFsdWF0aW9uQ29udGFpbmVyIiwiY291bnRlciIsInBhZ2luYXRvciIsInN0dWRlbnROYW1lIiwicXVlc3Rpb25UaXRsZSIsInF1ZXN0aW9uUmVzcG9uc2UiLCJtYXhTY29yZSIsImZlZWRiYWNrSW5wdXQiLCJzY29yZUlucHV0IiwibWVzc2FnZSIsImJ1dHRvbk1hcmsiLCJvcHRpb25zIiwiYmluZEFsbCIsIk9wdGlvbnMiLCJjbGFzc2VzIiwiY29udGVudCIsImJ1dHRvbnMiLCJjbG9zZSIsInR5cGUiLCJsYWJlbCIsImRhdGFOb3VuIiwiZWRpdFZlcmIiLCJob3N0IiwiUXVlc3Rpb24iLCJxdWVzdGlvbiIsIkFuc3dlcnMiLCJhbnN3ZXJzIiwiR3JpZCIsImdyaWQiLCJwcm90b3R5cGUiLCJjYWxsIiwicmVuZGVyRm9ybSIsImFwcGVuZCIsInJlbmRlciIsImVsIiwibGVuZ3RoIiwic2VsZWN0TmV4dFVubWFya2VkU3VibWlzc2lvbiIsInNlbGVjdFN1Ym1pc3Npb24iLCJhdCIsInVwZGF0ZUNvdW50ZXIiLCJ0ZXh0IiwiaGFzIiwicmVzdWx0cyIsInNjb3JlcyIsImlkIiwidmFsIiwiZmVlZGJhY2siLCJpc05pbCIsInNjb3JlIiwidG9TdHJpbmciLCJmb2N1cyIsImVuYWJsZUlucHV0IiwiZGlzYWJsZUlucHV0IiwidXBkYXRlTWF4U2NvcmUiLCJwcm9wIiwiYWpheCIsInVybCIsInVybFJvb3QiLCJBc3Nlc3NtZW50SUQiLCJJbnN0YW5jZUlEIiwic3VjY2VzcyIsInJlc3BvbnNlIiwiY291bnQiLCJlcnJvciIsInNob3dNZXNzYWdlIiwicG90ZW50aWFsU2NvcmUiLCJvbk1hcmsiLCJldmVudCIsInN0b3BQcm9wYWdhdGlvbiIsInBheWxvYWQiLCJwYXJzZUludCIsImlzTmFOIiwic2hvd1ZhbGlkYXRpb25FcnJvck1lc3NhZ2UiLCJvbGRTY29yZSIsIm1hcmsiLCJ4aHIiLCJzYXZlIiwid2FpdCIsIkRhdGFDaGFuZ2VkIiwiaW5pdENvbXB1dGVkcyIsIm9uU2F2ZUVycm9yIiwic3VibWlzc2lvbiIsImZpbmQiLCJhbnN3ZXIiLCJ1bmRlZmluZWQiLCJzZXRVSVJlYWR5IiwiSlNPTiIsInBhcnNlIiwicmVzcG9uc2VUZXh0IiwiZGV0YWlsIiwic3RhdHVzIiwic3RhdHVzVGV4dCIsImluZm8iLCJzZXRUaW1lb3V0IiwiYXNzZW1ibGVSZXN1bHQiLCJkYXRhQ2hhbmdlZCJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsSUFBSUMsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1FLFdBQVdGLFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1HLFdBQVdILFFBQVEsY0FBUixDQUFqQjs7QUFFQSxJQUFNSSxXQUFXSixRQUFR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OiJldmFsdWF0aW9uTW9kYWwuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxuY29uc3QgQmlnTW9kYWwgPSByZXF1aXJlKFwiLi4vLi4vbGliL2JpZ01vZGFsXCIpO1xuXG5jb25zdCBTdWJtaXNzaW9uTGlzdEl0ZW0gPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogXCJkaXZcIixcblx0Y2xhc3NOYW1lOiBcInN1Ym1pc3Npb24tbGlzdC1pdGVtXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvZXZhbHVhdGlvbk1vZGFsLm51bmpcIikuc3VibWlzc2lvbkxpc3RJdGVtLFxuXG5cdHVpOiB7XG5cdFx0dGl0bGU6IFwic3Bhbi50aXRsZVwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdGNsaWNrOiBcIm9uQ2xpY2tcIixcblx0fSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRvd25lckZpcnN0TmFtZTogKCkgPT4gdGhpcy5tb2RlbC5nZXQoXCJvd25lckZpcnN0TmFtZVwiKSxcblx0XHRcdG93bmVyU3VybmFtZTogKCkgPT4gdGhpcy5tb2RlbC5nZXQoXCJvd25lclN1cm5hbWVcIiksXG5cdFx0fTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsIFwic3VibWlzc2lvbjpzZWxlY3RlZFwiLCB0aGlzLm9uU2VsZWN0ZWQuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCBcInN1Ym1pc3Npb246dW5zZWxlY3RlZFwiLCB0aGlzLm9uVW5zZWxlY3RlZC5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRvbkNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm1vZGVsLnRyaWdnZXIoXCJzdWJtaXNzaW9uOnNlbGVjdGVkXCIsIHRoaXMubW9kZWwpO1xuXHR9LFxuXG5cdG9uU2VsZWN0ZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJGVsLmFkZENsYXNzKFwic2VsZWN0ZWRcIik7XG5cdH0sXG5cblx0b25VbnNlbGVjdGVkOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyhcInNlbGVjdGVkXCIpO1xuXHR9LFxufSk7XG5cbmNvbnN0IFN1Ym1pc3Npb25MaXN0ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5Db2xsZWN0aW9uVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXG5cdHRlbXBsYXRlOiBmYWxzZSxcblxuXHRjaGlsZFZpZXc6IFN1Ym1pc3Npb25MaXN0SXRlbSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuY29sbGVjdGlvbiwgXCJzdWJtaXNzaW9uOnNlbGVjdGVkXCIsIHRoaXMub25TdWJtaXNzaW9uU2VsZWN0ZWQuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0b25TdWJtaXNzaW9uU2VsZWN0ZWQ6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0aWYgKHRoaXMuU2VsZWN0ZWRTdWJtaXNzaW9uICYmIHRoaXMuU2VsZWN0ZWRTdWJtaXNzaW9uLmdldChcIl9pZFwiKSAhPT0gbW9kZWwuZ2V0KFwiX2lkXCIpKVxuXHRcdFx0dGhpcy5TZWxlY3RlZFN1Ym1pc3Npb24udHJpZ2dlcihcInN1Ym1pc3Npb246dW5zZWxlY3RlZFwiKTtcblxuXHRcdGlmICh0aGlzLlNlbGVjdGVkU3VibWlzc2lvbiAmJiB0aGlzLlNlbGVjdGVkU3VibWlzc2lvbi5nZXQoXCJfaWRcIikgPT09IG51bGwgJiYgbW9kZWwuZ2V0KFwiX2lkXCIpID09PSBudWxsKSB7XG5cdFx0XHRpZiAodGhpcy5TZWxlY3RlZFN1Ym1pc3Npb24uY2lkICE9PSBtb2RlbC5jaWQpXG5cdFx0XHRcdHRoaXMuU2VsZWN0ZWRTdWJtaXNzaW9uLnRyaWdnZXIoXCJzdWJtaXNzaW9uOnVuc2VsZWN0ZWRcIik7XG5cdFx0fVxuXG5cdFx0dGhpcy5TZWxlY3RlZFN1Ym1pc3Npb24gPSBtb2RlbDtcblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJpZ01vZGFsLmV4dGVuZCh7XG5cdHVpOiB7XG5cdFx0c3VibWlzc2lvbkxpc3RDb250YWluZXI6IFwiLnN1Ym1pc3Npb24tbGlzdC1jb250YWluZXJcIixcblx0XHRldmFsdWF0aW9uQ29udGFpbmVyOiBcIi5ldmFsdWF0aW9uLWNvbnRhaW5lclwiLFxuXHRcdGNvdW50ZXI6IFwiLmNvdW50ZXJcIixcblx0XHRwYWdpbmF0b3I6IFwiLnBhZ2luYXRvclwiLFxuXHRcdHN0dWRlbnROYW1lOiBcIi5zdHVkZW50LW5hbWVcIixcblx0XHRxdWVzdGlvblRpdGxlOiBcIi5xdWVzdGlvbi10aXRsZVwiLFxuXHRcdHF1ZXN0aW9uUmVzcG9uc2U6IFwiLnF1ZXN0aW9uLXJlc3BvbnNlXCIsXG5cdFx0bWF4U2NvcmU6IFwiLm1heC1zY29yZVwiLFxuXHRcdGZlZWRiYWNrSW5wdXQ6IFwiI2ZlZWRiYWNrLWlucHV0XCIsXG5cdFx0c2NvcmVJbnB1dDogXCIjc2NvcmUtaW5wdXRcIixcblx0XHRtZXNzYWdlOiBcIi5tZXNzYWdlXCIsXG5cdFx0YnV0dG9uTWFyazogXCJidXR0b24ubWFya1wiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmJ1dHRvbk1hcmtcIjogXCJvbk1hcmtcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0Xy5iaW5kQWxsKHRoaXMpO1xuXG5cdFx0dGhpcy5PcHRpb25zID0ge1xuXHRcdFx0Y2xhc3NlczogW1wiZXZhbHVhdGlvbi1tb2RhbFwiXSxcblx0XHRcdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2V2YWx1YXRpb25Nb2RhbC5udW5qXCIpLmNvbnRlbnQsXG5cdFx0XHRidXR0b25zOiB7XG5cdFx0XHRcdGNsb3NlOiB7XG5cdFx0XHRcdFx0dHlwZTogXCJjYW5jZWxcIixcblx0XHRcdFx0XHRsYWJlbDogXCJDbG9zZVwiLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHRcdGRhdGFOb3VuOiBcImFuc3dlclwiLFxuXHRcdFx0ZWRpdFZlcmI6IFwiZXZhbHVhdGVcIixcblx0XHRcdGhvc3Q6IG9wdGlvbnMuaG9zdCxcblx0XHRcdC8qc2l6ZUNvbnN0cmFpbnRzOiB7XG5cdFx0XHRcdG1pbkhlaWdodDogXCI2MHZoXCIsXG5cdFx0XHRcdG1pbldpZHRoOiBcIjc1dndcIixcblx0XHRcdFx0bWF4V2lkdGg6IFwiNzV2d1wiLFxuXHRcdFx0fSwqL1xuXHRcdH07XG5cblx0XHR0aGlzLlF1ZXN0aW9uID0gb3B0aW9ucy5xdWVzdGlvbjtcblx0XHR0aGlzLkFuc3dlcnMgPSBvcHRpb25zLmFuc3dlcnM7XG5cdFx0dGhpcy5HcmlkID0gb3B0aW9ucy5ncmlkO1xuXG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLkFuc3dlcnMsIFwic3VibWlzc2lvbjpzZWxlY3RlZFwiLCB0aGlzLm9uU3VibWlzc2lvblNlbGVjdGVkLmJpbmQodGhpcykpO1xuXG5cdFx0dGhpcy51aSA9IF8uZXh0ZW5kKHRoaXMudWksIEJpZ01vZGFsLnByb3RvdHlwZS51aSk7XG5cdFx0dGhpcy5ldmVudHMgPSBfLmV4dGVuZCh0aGlzLmV2ZW50cywgQmlnTW9kYWwucHJvdG90eXBlLmV2ZW50cyk7XG5cblx0XHRCaWdNb2RhbC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMpO1xuXHR9LFxuXG5cdHJlbmRlckZvcm06IGZ1bmN0aW9uKCkge1xuXHRcdC8vIFJlbmRlciB0aGUgc3VibWlzc2lvbiBsaXN0XG5cdFx0dGhpcy5TdWJtaXNzaW9uTGlzdCA9IG5ldyBTdWJtaXNzaW9uTGlzdCh7IGNvbGxlY3Rpb246IHRoaXMuQW5zd2VycyB9KTtcblx0XHR0aGlzLnVpLnN1Ym1pc3Npb25MaXN0Q29udGFpbmVyLmFwcGVuZCh0aGlzLlN1Ym1pc3Npb25MaXN0LnJlbmRlcigpLmVsKTtcblxuXHRcdHRoaXMudWkucGFnaW5hdG9yLmFwcGVuZCh0aGlzLkdyaWQucGFnaW5hdG9yLnJlbmRlcigpLmVsKTtcblxuXHRcdC8vIFNlbGVjdCBhIHN1Ym1pc3Npb25cblx0XHRpZiAodGhpcy5BbnN3ZXJzLmxlbmd0aCA+IDApIHtcblx0XHRcdGlmICghdGhpcy5zZWxlY3ROZXh0VW5tYXJrZWRTdWJtaXNzaW9uKCkpXG5cdFx0XHRcdHRoaXMuc2VsZWN0U3VibWlzc2lvbih0aGlzLkFuc3dlcnMuYXQoMCkpO1xuXG5cdFx0XHR0aGlzLnVwZGF0ZUNvdW50ZXIoKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLnVpLmV2YWx1YXRpb25Db250YWluZXIuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblx0fSxcblxuXHRvblN1Ym1pc3Npb25TZWxlY3RlZDogZnVuY3Rpb24obW9kZWwpIHtcblx0XHR0aGlzLnVpLnN0dWRlbnROYW1lLnRleHQobW9kZWwuZ2V0KFwib3duZXJGaXJzdE5hbWVcIikgKyBcIiBcIiArIG1vZGVsLmdldChcIm93bmVyU3VybmFtZVwiKSk7XG5cdFx0dGhpcy51aS5xdWVzdGlvblRpdGxlLnRleHQodGhpcy5RdWVzdGlvbi5xdWVzdGlvbik7XG5cblx0XHRpZiAobW9kZWwuaGFzKFwicGF5bG9hZFwiKSAmJiBtb2RlbC5nZXQoXCJwYXlsb2FkXCIpLnJlc3VsdHMuc2NvcmVzW3RoaXMuUXVlc3Rpb24uaWRdKSB7XG5cdFx0XHR0aGlzLnVpLnF1ZXN0aW9uUmVzcG9uc2UudGV4dChtb2RlbC5nZXQoXCJwYXlsb2FkXCIpLnJlc3VsdHMuc2NvcmVzW3RoaXMuUXVlc3Rpb24uaWRdLmFuc3dlcnNbMF0pO1xuXHRcdFx0dGhpcy51aS5mZWVkYmFja0lucHV0LnZhbChtb2RlbC5nZXQoXCJwYXlsb2FkXCIpLnJlc3VsdHMuc2NvcmVzW3RoaXMuUXVlc3Rpb24uaWRdLmZlZWRiYWNrID8gbW9kZWwuZ2V0KFwicGF5bG9hZFwiKS5yZXN1bHRzLnNjb3Jlc1t0aGlzLlF1ZXN0aW9uLmlkXS5mZWVkYmFjayA6IFwiXCIpO1xuXHRcdFx0dGhpcy51aS5zY29yZUlucHV0LnZhbChfLmlzTmlsKG1vZGVsLmdldChcInBheWxvYWRcIikucmVzdWx0cy5zY29yZXNbdGhpcy5RdWVzdGlvbi5pZF0uc2NvcmUpID8gXCJcIiA6IG1vZGVsLmdldChcInBheWxvYWRcIikucmVzdWx0cy5zY29yZXNbdGhpcy5RdWVzdGlvbi5pZF0uc2NvcmUudG9TdHJpbmcoKSk7XG5cdFx0XHR0aGlzLnVpLnNjb3JlSW5wdXQuZm9jdXMoKTtcblx0XHRcdHRoaXMuZW5hYmxlSW5wdXQoKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLnVpLnF1ZXN0aW9uUmVzcG9uc2UudGV4dChcIltOb3QgYXR0ZW1wdGVkXVwiKTtcblx0XHRcdHRoaXMudWkuZmVlZGJhY2tJbnB1dC52YWwoXCJcIik7XG5cdFx0XHR0aGlzLnVpLnNjb3JlSW5wdXQudmFsKFwiXCIpO1xuXHRcdFx0dGhpcy5kaXNhYmxlSW5wdXQoKTtcblx0XHR9XG5cblx0XHR0aGlzLlNlbGVjdGVkU3VibWlzc2lvbiA9IG1vZGVsO1xuXG5cdFx0dGhpcy51cGRhdGVNYXhTY29yZSgpO1xuXHR9LFxuXG5cdGRpc2FibGVJbnB1dDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5mZWVkYmFja0lucHV0LnByb3AoXCJkaXNhYmxlZFwiLCB0cnVlKTtcblx0XHR0aGlzLnVpLnNjb3JlSW5wdXQucHJvcChcImRpc2FibGVkXCIsIHRydWUpO1xuXG5cdFx0dGhpcy51aS5idXR0b25NYXJrLnByb3AoXCJkaXNhYmxlZFwiLCB0cnVlKTtcblx0XHR0aGlzLnVpLmJ1dHRvbk1hcmsuYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblx0fSxcblxuXHRlbmFibGVJbnB1dDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5mZWVkYmFja0lucHV0LnByb3AoXCJkaXNhYmxlZFwiLCBmYWxzZSk7XG5cdFx0dGhpcy51aS5zY29yZUlucHV0LnByb3AoXCJkaXNhYmxlZFwiLCBmYWxzZSk7XG5cblx0XHR0aGlzLnVpLmJ1dHRvbk1hcmsucHJvcChcImRpc2FibGVkXCIsIGZhbHNlKTtcblx0XHR0aGlzLnVpLmJ1dHRvbk1hcmsucmVtb3ZlQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblx0fSxcblxuXHR1cGRhdGVDb3VudGVyOiBmdW5jdGlvbigpIHtcblx0XHQkLmFqYXgoe1xuXHRcdFx0dXJsOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9hc3Nlc3NtZW50cy9cIiArIHRoaXMuQW5zd2Vycy5Bc3Nlc3NtZW50SUQgKyBcIi9tYXJrcy9cIiArIHRoaXMuQW5zd2Vycy5JbnN0YW5jZUlEICsgXCIvdW5tYXJrZWRDb3VudD9xdWVzdGlvbl9pZD1cIiArIHRoaXMuUXVlc3Rpb24uaWQsXG5cdFx0XHRzdWNjZXNzOiByZXNwb25zZSA9PiB7XG5cdFx0XHRcdGlmIChyZXNwb25zZS5jb3VudCA9PT0gMClcblx0XHRcdFx0XHR0aGlzLnVpLmNvdW50ZXIudGV4dChcIkFsbCBzdWJtaXNzaW9ucyBtYXJrZWQuXCIpO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dGhpcy51aS5jb3VudGVyLnRleHQocmVzcG9uc2UuY291bnQgKyBcIiB1bm1hcmtlZCBhbnN3ZXJcIiArIChyZXNwb25zZS5jb3VudCA9PT0gMSA/IFwiXCIgOiBcInNcIikgKyBcIiByZW1haW5pbmdcIik7XG5cdFx0XHR9LFxuXHRcdFx0ZXJyb3I6ICgpID0+IHtcblx0XHRcdFx0dGhpcy5zaG93TWVzc2FnZShcIkVycm9yIGZldGNoaW5nIG51bWJlciBvZiBtYXJrZWQgYW5zd2Vyc1wiKTtcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH0sXG5cblx0dXBkYXRlTWF4U2NvcmU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkubWF4U2NvcmUudGV4dChcIkZ1bGwgbWFyazogXCIgKyB0aGlzLlF1ZXN0aW9uLnBvdGVudGlhbFNjb3JlKTtcblx0fSxcblxuXHRvbk1hcms6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRjb25zdCBwYXlsb2FkID0gdGhpcy5TZWxlY3RlZFN1Ym1pc3Npb24uZ2V0KFwicGF5bG9hZFwiKTtcblxuXHRcdGNvbnN0IHNjb3JlID0gcGFyc2VJbnQodGhpcy51aS5zY29yZUlucHV0LnZhbCgpLCAxMCk7XG5cdFx0Y29uc3QgcG90ZW50aWFsU2NvcmUgPSBwYXlsb2FkLnJlc3VsdHMuc2NvcmVzW3RoaXMuUXVlc3Rpb24uaWRdLnBvdGVudGlhbFNjb3JlIHx8IHBheWxvYWQucmVzdWx0cy5zY29yZXNbdGhpcy5RdWVzdGlvbi5pZF0ubWF4U2NvcmUgfHwgMDtcblxuXHRcdGlmIChpc05hTihzY29yZSkpIHtcblx0XHRcdHRoaXMuc2hvd1ZhbGlkYXRpb25FcnJvck1lc3NhZ2UodGhpcy51aS5zY29yZUlucHV0LCB0aGlzLnVpLnNjb3JlSW5wdXQsXG5cdFx0XHRcdFwiWW91IG11c3QgZW50ZXIgYSB2YWxpZCAod2hvbGUgbnVtYmVyKSBtYXJrLlwiLCBcImxlZnRcIik7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKHNjb3JlID4gcG90ZW50aWFsU2NvcmUpIHtcblx0XHRcdHRoaXMuc2hvd1ZhbGlkYXRpb25FcnJvck1lc3NhZ2UodGhpcy51aS5zY29yZUlucHV0LCB0aGlzLnVpLnNjb3JlSW5wdXQsXG5cdFx0XHRcdFwiWW91IGNhbm5vdCBlbnRlciBhIGhpZ2hlciBtYXJrIHRoYW4gdGhlIG1heGltdW0gZm9yIHRoaXMgcXVlc3Rpb24uXCIsIFwibGVmdFwiKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHQvLyBTYXZlIHRoZSBmZWVkYmFjayBhbmQgbWFya1xuXHRcdFx0aWYgKHRoaXMudWkuZmVlZGJhY2tJbnB1dC52YWwoKSlcblx0XHRcdFx0cGF5bG9hZC5yZXN1bHRzLnNjb3Jlc1t0aGlzLlF1ZXN0aW9uLmlkXS5mZWVkYmFjayA9IHRoaXMudWkuZmVlZGJhY2tJbnB1dC52YWwoKTtcblxuXHRcdFx0Y29uc3Qgb2xkU2NvcmUgPSBwYXlsb2FkLnJlc3VsdHMuc2NvcmVzW3RoaXMuUXVlc3Rpb24uaWRdLnNjb3JlID8gcGF5bG9hZC5yZXN1bHRzLnNjb3Jlc1t0aGlzLlF1ZXN0aW9uLmlkXS5zY29yZSA6IDA7XG5cdFx0XHRwYXlsb2FkLnJlc3VsdHMubWFyayAtPSBvbGRTY29yZTtcblxuXHRcdFx0cGF5bG9hZC5yZXN1bHRzLnNjb3Jlc1t0aGlzLlF1ZXN0aW9uLmlkXS5zY29yZSA9IHNjb3JlO1xuXHRcdFx0cGF5bG9hZC5yZXN1bHRzLm1hcmsgKz0gc2NvcmU7XG5cblx0XHRcdHRoaXMuZGlzYWJsZUlucHV0KCk7XG5cblx0XHRcdHRoaXMueGhyID0gdGhpcy5TZWxlY3RlZFN1Ym1pc3Npb24uc2F2ZSh7IHBheWxvYWQ6IHBheWxvYWQgfSwge1xuXHRcdFx0XHR3YWl0OiB0cnVlLFxuXHRcdFx0XHRzdWNjZXNzOiAoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy54aHIgPSBudWxsO1xuXHRcdFx0XHRcdHRoaXMuRGF0YUNoYW5nZWQgPSB0cnVlO1xuXG5cdFx0XHRcdFx0dGhpcy5TZWxlY3RlZFN1Ym1pc3Npb24uaW5pdENvbXB1dGVkcygpO1xuXG5cdFx0XHRcdFx0aWYgKCF0aGlzLnNlbGVjdE5leHRVbm1hcmtlZFN1Ym1pc3Npb24oKSlcblx0XHRcdFx0XHRcdHRoaXMuc2VsZWN0U3VibWlzc2lvbih0aGlzLlNlbGVjdGVkU3VibWlzc2lvbik7XG5cblx0XHRcdFx0XHR0aGlzLnVwZGF0ZUNvdW50ZXIoKTtcblxuXHRcdFx0XHRcdHRoaXMuc2hvd01lc3NhZ2UoXCJFdmFsdWF0aW9uIHNhdmVkLlwiKTtcblxuXHRcdFx0XHRcdHRoaXMuZW5hYmxlSW5wdXQoKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0ZXJyb3I6IHRoaXMub25TYXZlRXJyb3IuYmluZCh0aGlzKSxcblx0XHRcdH0pO1xuXHRcdH1cblx0fSxcblxuXHRzZWxlY3ROZXh0VW5tYXJrZWRTdWJtaXNzaW9uOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBzdWJtaXNzaW9uID0gdGhpcy5BbnN3ZXJzLmZpbmQoYW5zd2VyID0+IGFuc3dlci5oYXMoXCJwYXlsb2FkXCIpICYmIHRoaXMuUXVlc3Rpb24uaWQgaW4gYW5zd2VyLmdldChcInBheWxvYWRcIikucmVzdWx0cy5zY29yZXMgJiZcblx0XHRcdGFuc3dlci5nZXQoXCJwYXlsb2FkXCIpLnJlc3VsdHMuc2NvcmVzW3RoaXMuUXVlc3Rpb24uaWRdLnNjb3JlID09PSB1bmRlZmluZWQpO1xuXG5cdFx0aWYgKHN1Ym1pc3Npb24pXG5cdFx0XHR0aGlzLnNlbGVjdFN1Ym1pc3Npb24oc3VibWlzc2lvbik7XG5cblx0XHRyZXR1cm4gc3VibWlzc2lvbjtcblx0fSxcblxuXHRzZWxlY3RTdWJtaXNzaW9uOiBmdW5jdGlvbihzdWJtaXNzaW9uKSB7XG5cdFx0c3VibWlzc2lvbi50cmlnZ2VyKFwic3VibWlzc2lvbjpzZWxlY3RlZFwiLCBzdWJtaXNzaW9uKTtcblxuXHRcdGlmIChzdWJtaXNzaW9uLmdldChcIm1hcmtlZFwiKSlcblx0XHRcdHRoaXMudWkuYnV0dG9uTWFyay50ZXh0KFwiVXBkYXRlXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMudWkuYnV0dG9uTWFyay50ZXh0KFwiTWFya1wiKTtcblx0fSxcblxuXHRvblNhdmVFcnJvcjogZnVuY3Rpb24obW9kZWwsIHJlc3BvbnNlKSB7XG5cdFx0dGhpcy54aHIgPSBudWxsO1xuXG5cdFx0dGhpcy5zZXRVSVJlYWR5KCk7XG5cblx0XHRsZXQgYW5zd2VyID0ge307XG5cblx0XHR0cnkge1xuXHRcdFx0YW5zd2VyID0gSlNPTi5wYXJzZShyZXNwb25zZS5yZXNwb25zZVRleHQpO1xuXHRcdH1cblx0XHRjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGFuc3dlci5kZXRhaWwgPSAocmVzcG9uc2Uuc3RhdHVzID09PSAwID8gXCJDb25uZWN0aW9uIGVycm9yXCIgOiByZXNwb25zZS5zdGF0dXNUZXh0KSArIFwiIChjb2RlIFwiICsgcmVzcG9uc2Uuc3RhdHVzICsgXCIpXCI7XG5cdFx0fVxuXG5cdFx0dGhpcy5zaG93TWVzc2FnZShcIkVycm9yIHNhdmluZyBtYXJrOiBcIiArIGFuc3dlci5kZXRhaWwgfHwgYW5zd2VyLmluZm8pO1xuXHR9LFxuXG5cdHNob3dNZXNzYWdlOiBmdW5jdGlvbihtZXNzYWdlKSB7XG5cdFx0dGhpcy51aS5tZXNzYWdlLnRleHQobWVzc2FnZSkucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRpZiAodGhpcy51aS5tZXNzYWdlICYmIHRoaXMudWkubWVzc2FnZS5hZGRDbGFzcylcblx0XHRcdFx0dGhpcy51aS5tZXNzYWdlLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR9LCAzMDAwKTtcblx0fSxcblxuXHRhc3NlbWJsZVJlc3VsdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHsgZGF0YUNoYW5nZWQ6IHRoaXMuRGF0YUNoYW5nZWQgfTtcblx0fSxcbn0pOyJdfQ==",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar Promise = require(\"bluebird\");\n\nvar App = require(\"../../index\");\nvar settings = require(\"app-settings\");\n\nvar ErrorView = require(\"../../lib/errorView\");\nvar ServerGrid = require(\"../../lib/serverGrid\");\nvar StatusView = require(\"../../lib/statusView\");\nvar $ = require(\"jquery\");\nvar gradeMap = require(\"../../lib/gradeMap\");\nvar SimpleMenu = require(\"../../lib/simpleMenu\");\nvar Selectra = require(\"../../lib/selectra\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\n// ----------------------------------------------------------------------------\n// Models & Collection\n// ----------------------------------------------------------------------------\nvar GroupModel = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"code\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/groups/custom\";\n\t},\n\n\tvalidate: function validate(attributes) {\n\t\t// A collection of groups is required to validate a custom group's name. The Groups collection\n\t\t// augments every model added to it with a reference to itself.\n\n\t\tvar errors = {};\n\t\t//const user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tif (!attributes.name) errors.name = \"A name is required.\";\n\n\t\tif (_.keys(errors).length > 0) return errors;\n\t}\n});\n\nvar Mark = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"_id\",\n\n\tcomputeds: {\n\t\townerNames: function ownerNames() {\n\t\t\treturn this.has(\"firstname\") && this.has(\"surname\") ? this.get(\"firstname\") + \" \" + this.get(\"surname\") : \"[User Missing]\";\n\t\t},\n\n\t\tassessmentTitle: function assessmentTitle() {\n\t\t\treturn this.has(\"title\") ? this.get(\"title\") : \"-\";\n\t\t},\n\n\t\tassessmentSubject: function assessmentSubject() {\n\t\t\treturn this.has(\"subject_name\") ? this.get(\"subject_name\") : \"-\";\n\t\t},\n\n\t\tassessmentGrade: function assessmentGrade() {\n\t\t\treturn this.has(\"studyYear\") ? gradeMap.codeToHumanValue(this.get(\"studyYear\"), { lexical: true }) : \"\";\n\t\t},\n\n\t\tinstanceTitle: function instanceTitle() {\n\t\t\treturn this.has(\"settings\") ? this.get(\"settings\").title : \"-\";\n\t\t},\n\n\t\tcompleted: function completed() {\n\t\t\tif (this.has(\"payload\")) {\n\t\t\t\tvar completed = Boolean(_.find(this.get(\"payload\").activity, function (activity) {\n\t\t\t\t\treturn activity.name === \"assessment-completed\";\n\t\t\t\t}));\n\t\t\t\treturn \"<span class='fal\" + (completed ? \" fa-check assessment-status-complete'>\" : \"assessment-status-incomplete'>\") + \"</span>\";\n\t\t\t}\n\t\t},\n\n\t\tmarked: function marked() {\n\t\t\tvar marked = true;\n\n\t\t\tif (!this.has(\"payload\") || !this.get(\"payload\").results || !this.get(\"payload\").results.scores) marked = false;else if (_.find(this.get(\"payload\").results.scores, function (scoreData) {\n\t\t\t\treturn scoreData.score === undefined;\n\t\t\t})) marked = false;\n\n\t\t\treturn \"<span class='fal\" + (marked ? \" fa-check assessment-status-complete'>\" : \"assessment-status-incomplete'>\") + \"</span>\";\n\t\t},\n\n\t\ttotalMark: function totalMark() {\n\t\t\tvar total = 0;\n\n\t\t\tif (this.has(\"payload\") && this.get(\"payload\").results && this.get(\"payload\").results.scores) _.each(this.get(\"payload\").results.scores, function (scoreData) {\n\t\t\t\ttotal += scoreData.score ? scoreData.score : 0;\n\t\t\t});\n\n\t\t\treturn total;\n\t\t},\n\n\t\tmaxScore: function maxScore() {\n\t\t\tif (this.has(\"payload\") && this.get(\"payload\").results && this.get(\"payload\").results.maxScore) return this.get(\"payload\").results.maxScore;\n\t\t\treturn \"-\";\n\t\t}\n\t}\n});\n\nvar MarkCollection = Backbone.PageableCollection.extend({\n\tmodel: Mark,\n\n\tinitialize: function initialize(group) {\n\t\tthis.group = group;\n\t},\n\n\turl: function url() {\n\t\tvar group = this.group ? this.group : this.options.raw.group;\n\t\treturn settings.urlRoot + \"/api/1.0/assessments/student?paged=true&groupFilter=\" + group.get(\"code\");\n\t},\n\n\tstate: {\n\t\tpageSize: 15\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nvar GlobalGroupSelector = Backbone.Marionette.View.extend({\n\tclassName: \"group-selector global-group-selector\",\n\tid: \"global-group-selector\",\n\n\ttemplate: require(\"../templates/groupMarks.nunj\").globalGroupSelector,\n\n\tui: {\n\t\tgroups: \"select[name=groups]\"\n\t},\n\n\tevents: {\n\t\t\"change @ui.groups\": \"onGroupChange\"\n\t},\n\n\tonRender: function onRender() {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tthis.select = new Selectra({\n\t\t\tserver: {\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/users/\" + encodeURIComponent(user.username) + \"/enrolment\",\n\t\t\t\tdelayLoad: true,\n\t\t\t\tkey: \"code\",\n\t\t\t\tvalue: \"name\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 20,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t});\n\t\tthis.select.show({ el: this.ui.groups });\n\t},\n\n\tonGroupChange: function onGroupChange(evt, data) {\n\t\tthis.trigger(\"select\", data);\n\t},\n\n\t// templateContext: function()\n\t// {\n\t// \treturn {\n\t// \t\tgroups: this.groups.toJSON(),\n\t// \t};\n\t// },\n\n\t// initialize: function(options)\n\t// {\n\t// \tthis.groups = options.groups;\n\t// },\n\n\t// onRender: function()\n\t// {\n\t// \tthis.ui.groups.chosen();\n\n\t// \tthis.updateGroupList();\n\n\t// \tthis.on(\"refresh\", this.updateGroupList, this);\n\t// },\n\n\tdeselect: function deselect() {\n\t\tthis.select.clear();\n\t\t//this.ui.groups.val(\"\");\n\n\t\tthis.updateGroupList();\n\t},\n\n\tupdateGroupList: function updateGroupList() {\n\t\tvar selectedGroupCode = this.ui.groups.val();\n\n\t\tvar groups = _.filter(this.groups, function (group) {\n\t\t\treturn !group.get(\"private\");\n\t\t});\n\n\t\tvar optionList = _.reduce(groups, function (accumulator, group) {\n\t\t\tvar groupName = group.get(\"name\") ? group.get(\"name\") : \"\";\n\t\t\taccumulator.push(\"<option value=\\\"\" + group.id + \"\\\"\" + (group.id === selectedGroupCode ? \"selected\" : \"\") + \">\" + groupName.replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t}) + \"</option>\");\n\t\t\treturn accumulator;\n\t\t}, [\"<option value=''></option>\"]);\n\n\t\tthis.ui.groups.html(optionList.join(\"\")).trigger(\"chosen:updated\");\n\t}\n\n\t// onBeforeDestroy: function()\n\t// {\n\t// \tthis.off(\"refresh\");\n\t// },\n});\n\nvar CustomGroupSelector = Backbone.Marionette.View.extend({\n\tclassName: \"group-selector custom-group-selector\",\n\tid: \"custom-group-selector\",\n\n\ttemplate: require(\"../templates/groupMarks.nunj\").customGroupSelector,\n\n\tui: {\n\t\tbuttonCreateGroup: \"button.create-group\",\n\t\tgroups: \"select[name=groups]\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonCreateGroup\": \"onButtonCreateGroupClick\",\n\t\t\"change @ui.groups\": \"onGroupChange\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.groups = options.groups;\n\t\tthis.globalGroup = options.globalGroupCode;\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this = this;\n\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tthis.select = new Selectra({\n\t\t\tserver: {\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/users/\" + encodeURIComponent(user.username) + \"/groups/\" + encodeURIComponent(this.globalGroup.get(\"code\")) + \"/custom\",\n\t\t\t\tdelayLoad: true,\n\t\t\t\tkey: \"code\",\n\t\t\t\tvalue: \"name\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 20,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t});\n\t\tthis.select.show({ el: this.ui.groups });\n\n\t\tthis.listenTo(this, \"refresh\", function (code) {\n\t\t\t_this.globalGroup = code;\n\t\t\t_this.select.clear();\n\t\t}, this);\n\n\t\tthis.listenTo(this, \"reset\", function () {\n\t\t\t_this.select.clear();\n\t\t}, this);\n\t},\n\n\tonButtonCreateGroupClick: function onButtonCreateGroupClick() {\n\t\tthis.trigger(\"create\", this.globalGroup);\n\t},\n\n\tonGroupChange: function onGroupChange(evt, data) {\n\t\tthis.trigger(\"select\", new GroupModel(data.toJSON()), this.globalGroup);\n\t},\n\n\tupdateGroupList: function updateGroupList() {\n\t\tvar _this2 = this;\n\n\t\tvar groups = _.filter(this.groups, function (group) {\n\t\t\treturn group.get(\"private\") && group.get(\"root\") === _this2.globalGroupCode;\n\t\t});\n\n\t\tvar optionList = _.reduce(groups, function (accumulator, group) {\n\t\t\taccumulator.push(\"<option value=\\\"\" + group.id + \"\\\">\" + (group.get(\"owner\") ? \"\" : \"(*) \") + group.get(\"name\").replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t}) + \"</option>\");\n\t\t\treturn accumulator;\n\t\t}, [\"<option value=''></option>\"]);\n\n\t\tthis.ui.groups.html(optionList.join(\"\")).trigger(\"chosen:updated\");\n\t},\n\n\tdeselect: function deselect() {\n\t\tthis.select.clear();\n\n\t\tthis.updateGroupList();\n\t}\n\n});\n\nvar MarksGrid = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"content user-manager student-marks\",\n\n\ttemplate: require(\"../templates/groupMarks.nunj\").groupMarks,\n\n\tui: {\n\t\tfilterBar: \".ops-bar .filters\",\n\t\tcounterBar: \".ops-bar .counter\",\n\t\taddIcon: \".add-item\",\n\t\timportIcon: \".import-item\",\n\t\tdownload: \"button.download\",\n\t\tgrid: \"div.grid\"\n\t},\n\n\tcollectionEvents: {\n\t\t\"buttoncell:clicked\": \"downloadItem\",\n\t\t\"sync reset add remove\": \"updateCounter\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.addIcon\": \"showAdd\",\n\t\t\"click @ui.importIcon\": \"showImport\",\n\t\t\"click @ui.download\": \"showDownloads\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\t\tthis.raw = new MarkCollection(options.customGroupCode);\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tif (this.grid) this.grid.destroy();\n\t},\n\n\tupdateCounter: function updateCounter() {\n\t\tvar pageStart = (this.collection.state.currentPage - 1) * this.collection.state.pageSize + 1;\n\t\tvar pageEnd = this.collection.state.currentPage * this.collection.state.pageSize;\n\t\tif (pageEnd > this.collection.state.totalRecords) pageEnd = this.collection.state.totalRecords;\n\n\t\tvar text = \"Content items \" + pageStart + \" - \" + pageEnd + \" of \" + this.collection.state.totalRecords;\n\t\tif (this.collection.state.totalRecords === null) text = \"No content to show\";\n\n\t\tthis.ui.counterBar.text(text);\n\t},\n\n\tdownloadList: function downloadList() {\n\t\twindow.open(settings.urlRoot + \"/api/1.0/resources/lists/content\");\n\t},\n\n\tfilterClone: function filterClone(model) {\n\t\treturn model.get(\"category\") === \"assessment\";\n\t},\n\n\tdownloadItem: function downloadItem(id, model) {\n\t\twindow.open(settings.urlRoot + \"/api/1.0/assessments/\" + model.get(\"assessment\") + \"/marks/\" + model.get(\"attachment\") + \"/report?studentAnswers=true&assessmark=\" + model.get(\"_id\"));\n\t},\n\n\tonRender: function onRender() {\n\t\tvar btnOptions = {\n\t\t\tclass: \"download\",\n\t\t\tid: \"btnDownloadReport\",\n\t\t\ttext: \"<span class='fal fa-cloud-download' title='Download PDF Report' />\"\n\t\t};\n\n\t\tvar columns = [{ name: \"ownerNames\", label: \"Person\", cell: \"string\", editable: false, sortValue: ServerGrid.stringSort }, { name: \"assessmentTitle\", label: \"Assessment\", cell: \"string\", editable: false, sortValue: ServerGrid.stringSort }, { name: \"instanceTitle\", label: \"Instance\", cell: \"string\", editable: false, sortValue: ServerGrid.stringSort }, { name: \"assessmentSubject\", label: \"Subject\", cell: \"string\", editable: false, sortValue: ServerGrid.stringSort }, { name: \"assessmentGrade\", label: \"Grade\", cell: \"string\", editable: false, sortValue: ServerGrid.stringSort }, { name: \"completed\", class: \"completeds\", label: \"Completed\", cell: ServerGrid.HTMLCell.extend({}), editable: false, sortValue: ServerGrid.stringSort }, { name: \"marked\", label: \"Marked\", cell: ServerGrid.HTMLCell.extend({}), editable: false }, { name: \"totalMark\", label: \"Mark\", cell: \"string\", editable: false }, { name: \"maxScore\", label: \"Total\", cell: \"string\", editable: false }, { label: \"Download\", cell: new ServerGrid.ButtonCell(btnOptions), editable: false, sortable: false }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: this.raw,\n\t\t\tclickable: false\n\t\t});\n\n\t\tthis.collection = this.grid.collection;\n\n\t\tthis.bindEvents(this.collection, this.collectionEvents);\n\n\t\tvar searchFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tthis.ui.filterBar.prepend(this.grid.filter({ filterContainer: this.ui.filterBar, filters: [searchFilter], defaultFilters: [\"textFilter\"] }).render().el);\n\n\t\t$(\".paging\", this.el).append(this.grid.paging().render().el);\n\n\t\tif (!settings.assessments) this.ui.importIcon.addClass(\"hide\");\n\t},\n\n\treproduceItem: function reproduceItem(model) {\n\t\twindow.open(settings.urlRoot + \"/api/1.0/assessments/\" + model.get(\"_id\") + \"/report\");\n\t},\n\n\tdownloadCSVMarks: function downloadCSVMarks() {\n\t\twindow.open(settings.urlRoot + \"/api/1.0/assessments/student/export\");\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"content custom-group-manager\",\n\n\ttemplate: require(\"../templates/groupMarks.nunj\").manager,\n\n\tregions: {\n\t\tcustomGroupCreator: \".custom-group-creator-region\",\n\t\tcustomGroupSelector: \".custom-group-selector-region\",\n\t\tgroupMarks: \".group-marks-region\",\n\t\tglobalGroupSelector: \".global-group-selector-region\",\n\t\theader: \".header-region\",\n\t\tstatus: \".status-region\"\n\t},\n\n\tui: {\n\t\tcustomGroupSelectorRegion: \".custom-group-selector-region\",\n\t\tcustomGroupCreatorRegion: \".custom-group-creator-region\",\n\t\tglobalGroupSelectorRegion: \".global-group-selector-region\",\n\t\theaderRegion: \".header-region\",\n\t\tstatusRegion: \".status-region\",\n\t\tdownloadAssessmentReport: \"div.downloadAssessmentReport\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.downloadAssessmentReport\": \"showAssessments\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.startCode = options.code;\n\t\tthis.eventBus = Backbone.Radio.channel(\"customGroupManager\");\n\n\t\tthis.listenTo(this.eventBus, \"editor:back\", this.onMarksGridBack.bind(this));\n\t\tthis.listenTo(this.eventBus, \"editor:group-upgraded\", this.onMarksGridGroupUpgraded.bind(this));\n\t\tthis.listenTo(this.eventBus, \"editor:begin-save\", this.onMarksGridBeginSave.bind(this));\n\t\tthis.listenTo(this.eventBus, \"editor:end-save\", this.onMarksGridEndSave.bind(this));\n\t\tthis.listenTo(this.eventBus, \"editor:clone\", this.onMarksGridClone.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this3 = this;\n\n\t\tthis.ui.statusRegion.addClass(\"hide\");\n\t\tthis.ui.headerRegion.removeClass(\"hide\");\n\n\t\t//this.header = new Header({ eventBus: this.eventBus });\n\t\t//this.showChildView(\"header\", this.header);\n\n\t\tif (this.startCode) {\n\t\t\tthis.showChildView(\"status\", new StatusView({ type: \"loading\" }));\n\n\t\t\t// We're trying to edit a custom group, so fetch it from the server\n\t\t\tvar customModel = new GroupModel({\n\t\t\t\tcode: this.startCode\n\t\t\t});\n\n\t\t\t// Don't rerun this code\n\t\t\tdelete this.startCode;\n\n\t\t\tvar xhr = customModel.fetch();\n\t\t\tPromise.resolve(xhr).then(function () {\n\t\t\t\tif (!customModel.get(\"private\")) throw new Error(\"Unable to find matching group\");\n\n\t\t\t\treturn Promise.resolve($.ajax({\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\turl: settings.urlRoot + \"/api/1.0/groups/\" + customModel.get(\"root\"),\n\t\t\t\t\tjson: true\n\t\t\t\t}));\n\t\t\t}).then(function (data) {\n\t\t\t\tvar globalGroup = new GroupModel(data);\n\t\t\t\t_this3.showEditor(customModel, globalGroup);\n\n\t\t\t\treturn _this3.ui.statusRegion.addClass(\"hide\");\n\t\t\t}).catch(function (e) {\n\t\t\t\t_this3.showChildView(\"status\", new ErrorView({ fetchError: e }));\n\t\t\t});\n\t\t} else {\n\t\t\tthis.globalGroupSelector = new GlobalGroupSelector();\n\t\t\tthis.listenTo(this.globalGroupSelector, \"select\", this.onGlobalGroupChange.bind(this));\n\t\t\tthis.showChildView(\"globalGroupSelector\", this.globalGroupSelector);\n\t\t}\n\t},\n\n\tshowAssessments: function showAssessments(evt) {\n\t\tevt.stopPropagation();\n\t\tvar els = [];\n\t\tif (this.marksGrid !== undefined && this.marksGrid.collection !== undefined) {\n\t\t\t//Loop through collection models and print the unique assessment\n\t\t\tvar assessments = _.uniqBy(this.marksGrid.collection.models, function (row) {\n\t\t\t\treturn row.attributes.assessment._id;\n\t\t\t});\n\t\t\tfor (var i = assessments.length - 1; i >= 0; i--) {\n\t\t\t\tels.push({ text: assessments[i].get(\"assessment\").title, id: assessments[i].get(\"assessment\")._id });\n\t\t\t}\n\t\t} else {\n\t\t\tels.push({ text: \"Select a Global and Custom Group first\", id: \"defaultID\" });\n\t\t}\n\n\t\tvar Menu = new SimpleMenu({\n\t\t\tanchor: this.ui.downloadAssessmentReport,\n\t\t\tside: \"right\",\n\t\t\tstructure: [{\n\t\t\t\tcloseOnClick: true,\n\t\t\t\telements: els\n\t\t\t}]\n\t\t});\n\n\t\tthis.listenTo(Menu, \"clicked\", this.downloadPDFGroupMarks.bind(this));\n\n\t\tMenu.show();\n\t},\n\n\tdownloadPDFGroupMarks: function downloadPDFGroupMarks(el) {\n\t\tif (el.id !== \"defaultID\") window.open(settings.urlRoot + \"/api/1.0/assessments/\" + el.id + \"/marks/none/report?includeMarks=true&group=\" + this.customGroupCode + \"&globalGroup=\" + this.globalGroupCode);\n\t},\n\n\trenderLoadingStatus: function renderLoadingStatus() {\n\t\tthis.showChildView(\"status\", new StatusView({ type: \"loading\" }));\n\t},\n\n\trenderError: function renderError(error) {\n\t\tthis.showChildView(\"status\", new ErrorView({ fetchError: error }));\n\t},\n\n\trenderPage: function renderPage() {\n\t\tthis.ui.statusRegion.addClass(\"hide\");\n\t\tthis.ui.headerRegion.removeClass(\"hide\");\n\n\t\t//this.header = new Header({ eventBus: this.eventBus });\n\t\t//this.showChildView(\"header\", this.header);\n\n\t\tthis.globalGroupSelector = new GlobalGroupSelector({ groups: this.groups });\n\t\tthis.listenTo(this.globalGroupSelector, \"select\", this.onGlobalGroupChange.bind(this));\n\t\tthis.showChildView(\"globalGroupSelector\", this.globalGroupSelector);\n\t},\n\n\tonGlobalGroupChange: function onGlobalGroupChange(groupCode) {\n\t\tif (this.getRegion(\"customGroupSelector\").hasView()) {\n\t\t\tthis.customGroupSelector.trigger(\"refresh\", groupCode);\n\t\t} else {\n\t\t\tthis.customGroupSelector = new CustomGroupSelector({\n\t\t\t\tglobalGroupCode: groupCode,\n\t\t\t\tgroups: this.groups\n\t\t\t});\n\n\t\t\tthis.listenTo(this.customGroupSelector, \"select\", this.onCustomGroupChange.bind(this));\n\t\t\tthis.showChildView(\"customGroupSelector\", this.customGroupSelector);\n\t\t}\n\t\tthis.group = groupCode;\n\t\tthis.showMarksGrid(groupCode, groupCode);\n\t},\n\n\tonCustomGroupChange: function onCustomGroupChange(customGroupCode, globalGroupCode) {\n\t\tthis.group = customGroupCode;\n\t\tthis.showMarksGrid(customGroupCode, globalGroupCode);\n\t\tthis.globalGroupSelector.deselect();\n\t},\n\n\tshowMarksGrid: function showMarksGrid(customGroupCode, globalGroupCode) {\n\t\tif (this.marksGrid) this.getRegion(\"groupMarks\").reset();\n\n\t\tthis.marksGrid = new MarksGrid({\n\t\t\tcustomGroupCode: customGroupCode,\n\t\t\teventBus: this.eventBus,\n\t\t\tglobalGroupCode: globalGroupCode,\n\t\t\tgroups: this.groups\n\t\t});\n\n\t\tthis.customGroupCode = customGroupCode;\n\t\tthis.globalGroupCode = globalGroupCode;\n\n\t\tthis.showChildView(\"groupMarks\", this.marksGrid);\n\t},\n\n\tonMarksGridBack: function onMarksGridBack() {\n\t\tthis.close();\n\t},\n\n\tonMarksGridGroupUpgraded: function onMarksGridGroupUpgraded() {\n\t\tthis.globalGroupSelector.trigger(\"refresh\");\n\t\tthis.customGroupSelector.trigger(\"refresh\", this.globalGroupCode);\n\n\t\tthis.close();\n\t},\n\n\tonMarksGridBeginSave: function onMarksGridBeginSave() {\n\t\tthis.$el.addClass(\"busy\");\n\t},\n\n\tonMarksGridEndSave: function onMarksGridEndSave() {\n\t\tthis.$el.removeClass(\"busy\");\n\t},\n\n\tonMarksGridClone: function onMarksGridClone(customGroupModelClone) {\n\t\tvar _this4 = this;\n\n\t\t// Record the code of the source of the cloned custom group\n\t\tvar oldCustomGroupCode = this.customGroupCode;\n\n\t\t// Add the cloned custom group model to the local collection of groups\n\t\tthis.groups.add(customGroupModelClone);\n\n\t\t// Show a new editor for the cloned custom group\n\t\tthis.showMarksGrid(customGroupModelClone.id, customGroupModelClone.get(\"root\"));\n\n\t\t// Add the users that belong to the source custom group\n\t\tthis.students.each(function (student) {\n\t\t\tif (_.includes(student.get(\"customGroups\"), oldCustomGroupCode)) _this4.eventBus.trigger(\"editor:add-user\", student.cid);\n\t\t});\n\n\t\tif (this.teachers) {\n\t\t\tthis.teachers.each(function (teacher) {\n\t\t\t\tif (_.includes(teacher.get(\"customGroups\"), oldCustomGroupCode)) _this4.eventBus.trigger(\"editor:add-user\", teacher.cid);\n\t\t\t});\n\t\t}\n\t},\n\n\tclose: function close() {\n\t\tthis.getRegion(\"editor\").reset();\n\n\t\tthis.customGroupSelector.deselect();\n\n\t\tthis.ui.customGroupSelectorRegion.removeClass(\"hide\");\n\t\tthis.ui.globalGroupSelectorRegion.removeClass(\"hide\");\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\t//this.stopListening(this.header);\n\t\tthis.stopListening(this.globalGroupSelector);\n\t\tthis.stopListening(this.customGroupSelector);\n\n\t\tthis.stopListening(this.eventBus);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImdyb3VwTWFya3MuanMiXSwibmFtZXMiOlsiXyIsInJlcXVpcmUiLCJCYWNrYm9uZSIsIlByb21pc2UiLCJBcHAiLCJzZXR0aW5ncyIsIkVycm9yVmlldyIsIlNlcnZlckdyaWQiLCJTdGF0dXNWaWV3IiwiJCIsImdyYWRlTWFwIiwiU2ltcGxlTWVudSIsIlNlbGVjdHJhIiwicmFkaW8iLCJSYWRpbyIsImNoYW5uZWwiLCJHcm91cE1vZGVsIiwiRXBveHkiLCJNb2RlbCIsImV4dGVuZCIsImlkQXR0cmlidXRlIiwidXJsUm9vdCIsInZhbGlkYXRlIiwiYXR0cmlidXRlcyIsImVycm9ycyIsIm5hbWUiLCJrZXlzIiwibGVuZ3RoIiwiTWFyayIsImNvbXB1dGVkcyIsIm93bmVyTmFtZXMiLCJoYXMiLCJnZXQiLCJhc3Nlc3NtZW50VGl0bGUiLCJhc3Nlc3NtZW50U3ViamVjdCIsImFzc2Vzc21lbnRHcmFkZSIsImNvZGVUb0h1bWFuVmFsdWUiLCJsZXhpY2FsIiwiaW5zdGFuY2VUaXRsZSIsInRpdGxlIiwiY29tcGxldGVkIiwiQm9vbGVhbiIsImZpbmQiLCJhY3Rpdml0eSIsIm1hcmtlZCIsInJlc3VsdHMiLCJzY29yZXMiLCJzY29yZURhdGEiLCJzY29yZSIsInVuZGVmaW5lZCIsInRvdGFsTWFyayIsInRvdGFsIiwiZWFjaCIsIm1heFNjb3JlIiwiTWFya0NvbGxlY3Rpb24iLCJQYWdlYWJsZUNvbGxlY3Rpb24iLCJtb2RlbCIsImluaXRpYWxpemUiLCJncm91cCIsInVybCIsIm9wdGlvbnMiLCJyYXciLCJzdGF0ZSIsInBhZ2VTaXplIiwibW9kZSIsInF1ZXJ5UGFyYW1zIiwic29ydEtleSIsInBhcnNlU3RhdGUiLCJyZXNwIiwidG90YWxSZWNvcmRzIiwicGFyc2VSZWNvcmRzIiwicm93cyIsIkdsb2JhbEdyb3VwU2VsZWN0b3IiLCJNYXJpb25ldHRlIiwiVmlldyIsImNsYXNzTmFtZSIsImlkIiwidGVtcGxhdGUiLCJnbG9iYWxHcm91cFNlbGVjdG9yIiwidWkiLCJncm91cHMiLCJldmVudHMiLCJvblJlbmRlciIsInVzZXIiLCJyZXF1ZXN0IiwiRXZlbnRzIiwiUmVxdWVzdHMiLCJDdXJyZW50VXNlciIsInNlbGVjdCIsInNlcnZlciIsImZldGNoIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwidXNlcm5hbWUiLCJkZWxheUxvYWQiLCJrZXkiLCJ2YWx1ZSIsInBhZ2luZyIsImluZmluaXRlIiwic2hvdyIsImVsIiwib25Hcm91cENoYW5nZSIsImV2dCIsImRhdGEiLCJ0cmlnZ2VyIiwiZGVzZWxlY3QiLCJjbGVhciIsInVwZGF0ZUdyb3VwTGlzdCIsInNlbGVjdGVkR3JvdXBDb2RlIiwidmFsIiwiZmlsdGVyIiwib3B0aW9uTGlzdCIsInJlZHVjZSIsImFjY3VtdWxhdG9yIiwiZ3JvdXBOYW1lIiwicHVzaCIsInJlcGxhY2UiLCJ4IiwiY2hhckNvZGVBdCIsImh0bWwiLCJqb2luIiwiQ3VzdG9tR3JvdXBTZWxlY3RvciIsImN1c3RvbUdyb3VwU2VsZWN0b3IiLCJidXR0b25DcmVhdGVHcm91cCIsImdsb2JhbEdyb3VwIiwiZ2xvYmFsR3JvdXBDb2RlIiwibGlzdGVuVG8iLCJjb2RlIiwib25CdXR0b25DcmVhdGVHcm91cENsaWNrIiwidG9KU09OIiwiTWFya3NHcmlkIiwidGFnTmFtZSIsImdyb3VwTWFya3MiLCJmaWx0ZXJCYXIiLCJjb3VudGVyQmFyIiwiYWRkSWNvbiIsImltcG9ydEljb24iLCJkb3dubG9hZCIsImdyaWQiLCJjb2xsZWN0aW9uRXZlbnRzIiwiY3VzdG9tR3JvdXBDb2RlIiwib25CZWZvcmVEZXN0cm95IiwiZGVzdHJveSIsInVwZGF0ZUNvdW50ZXIiLCJwYWdlU3RhcnQiLCJjb2xsZWN0aW9uIiwiY3VycmVudFBhZ2UiLCJwYWdlRW5kIiwidGV4dCIsImRvd25sb2FkTGlzdCIsIndpbmRvdyIsIm9wZW4iLCJmaWx0ZXJDbG9uZSIsImRvd25sb2FkSXRlbSIsImJ0bk9wdGlvbnMiLCJjbGFzcyIsImNvbHVtbnMiLCJsYWJlbCIsImNlbGwiLCJlZGl0YWJsZSIsInNvcnRWYWx1ZSIsInN0cmluZ1NvcnQiLCJIVE1MQ2VsbCIsIkJ1dHRvbkNlbGwiLCJzb3J0YWJsZSIsImNsaWNrYWJsZSIsImJpbmRFdmVudHMiLCJzZWFyY2hGaWx0ZXIiLCJ0eXBlIiwiZGVib3VuY2UiLCJwcmVwZW5kIiwiZmlsdGVyQ29udGFpbmVyIiwiZmlsdGVycyIsImRlZmF1bHRGaWx0ZXJzIiwicmVuZGVyIiwiYXBwZW5kIiwiYXNzZXNzbWVudHMiLCJhZGRDbGFzcyIsInJlcHJvZHVjZUl0ZW0iLCJkb3dubG9hZENTVk1hcmtzIiwibW9kdWxlIiwiZXhwb3J0cyIsIm1hbmFnZXIiLCJyZWdpb25zIiwiY3VzdG9tR3JvdXBDcmVhdG9yIiwiaGVhZGVyIiwic3RhdHVzIiwiY3VzdG9tR3JvdXBTZWxlY3RvclJlZ2lvbiIsImN1c3RvbUdyb3VwQ3JlYXRvclJlZ2lvbiIsImdsb2JhbEdyb3VwU2VsZWN0b3JSZWdpb24iLCJoZWFkZXJSZWdpb24iLCJzdGF0dXNSZWdpb24iLCJkb3dubG9hZEFzc2Vzc21lbnRSZXBvcnQiLCJzdGFydENvZGUiLCJldmVudEJ1cyIsIm9uTWFya3NHcmlkQmFjayIsImJpbmQiLCJvbk1hcmtzR3JpZEdyb3VwVXBncmFkZWQiLCJvbk1hcmtzR3JpZEJlZ2luU2F2ZSIsIm9uTWFya3NHcmlkRW5kU2F2ZSIsIm9uTWFya3NHcmlkQ2xvbmUiLCJyZW1vdmVDbGFzcyIsInNob3dDaGlsZFZpZXciLCJjdXN0b21Nb2RlbCIsInhociIsInJlc29sdmUiLCJ0aGVuIiwiRXJyb3IiLCJhamF4IiwibWV0aG9kIiwianNvbiIsInNob3dFZGl0b3IiLCJjYXRjaCIsImZldGNoRXJyb3IiLCJlIiwib25HbG9iYWxHcm91cENoYW5nZSIsInNob3dBc3Nlc3NtZW50cyIsInN0b3BQcm9wYWdhdGlvbiIsImVscyIsIm1hcmtzR3JpZCIsInVuaXFCeSIsIm1vZGVscyIsInJvdyIsImFzc2Vzc21lbnQiLCJfaWQiLCJpIiwiTWVudSIsImFuY2hvciIsInNpZGUiLCJzdHJ1Y3R1cmUiLCJjbG9zZU9uQ2xpY2siLCJlbGVtZW50cyIsImRvd25sb2FkUERGR3JvdXBNYXJrcyIsInJlbmRlckxvYWRpbmdTdGF0dXMiLCJyZW5kZXJFcnJvciIsImVycm9yIiwicmVuZGVyUGFnZSIsImdyb3VwQ29kZSIsImdldFJlZ2lvbiIsImhhc1ZpZXciLCJvbkN1c3RvbUdyb3VwQ2hhbmdlIiwic2hvd01hcmtzR3JpZCIsInJlc2V0IiwiY2xvc2UiLCIkZWwiLCJjdXN0b21Hcm91cE1vZGVsQ2xvbmUiLCJvbGRDdXN0b21Hcm91cENvZGUiLCJhZGQiLCJzdHVkZW50cyIsImluY2x1ZGVzIiwic3R1ZGVudCIsImNpZCIsInRlYWNoZXJzIiwidGVhY2hlciIsInN0b3BMaXN0ZW5pbmciXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsV0FBV0QsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUUsVUFBVUYsUUFBUSxVQUFSLENBQWhCOztBQUVBLElBQU1HLE1BQU1ILFFBQVEsYUFBUixDQUFaO0FBQ0EsSUFBTUksV0FBV0osUUFBUSxjQUFSLENBQWpCOztBQUVBLElBQU1LLFlBQVlMLFFBQVEscUJBQVIsQ0FBbEI7QUFDQSxJQUFNTSxhQUFhTixRQUFRLHNCQUFSLENBQW5CO0FBQ0EsSUFBTU8sYUFBYVAsUUFBUSxzQkFBUixDQUFuQjtBQUNBLElBQU1RLElBQUlSLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTVMsV0FBV1QsUUFBUSxvQkFBUixDQUFqQjtBQUNBLElBQU1VLGFBQWFWLFFBQVEsc0JBQVIsQ0FBbkI7QUFDQSxJQUFNVyxXQUFXWCxRQUFRLG9CQUFSLENBQWpCOztBQUVBLElBQU1ZLFFBQVFYLFNBQVNZLEtBQVQsQ0FBZUMsT0FBZixDQUF1QixRQUF2QixDQUFkOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQU1DLGFBQWFkLFNBQVNlLEtBQVQsQ0FBZUMsS0FBZixDQUFxQkMsTUFBckIsQ0FBNEI7QUFDOUND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bUJBQXhCO0FBQ0EsT0FBSytLLGFBQUwsQ0FBbUIsS0FBS3BJLG1CQUF4Qjs7QUFFQSxPQUFLb0ksYUFBTCxDQUFtQixLQUFLNUQsUUFBeEI7QUFDQTtBQTNPK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoiZ3JvdXBNYXJrcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IFByb21pc2UgPSByZXF1aXJlKFwiYmx1ZWJpcmRcIik7XG5cbmNvbnN0IEFwcCA9IHJlcXVpcmUoXCIuLi8uLi9pbmRleFwiKTtcbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxuY29uc3QgRXJyb3JWaWV3ID0gcmVxdWlyZShcIi4uLy4uL2xpYi9lcnJvclZpZXdcIik7XG5jb25zdCBTZXJ2ZXJHcmlkID0gcmVxdWlyZShcIi4uLy4uL2xpYi9zZXJ2ZXJHcmlkXCIpO1xuY29uc3QgU3RhdHVzVmlldyA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc3RhdHVzVmlld1wiKTtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgZ3JhZGVNYXAgPSByZXF1aXJlKFwiLi4vLi4vbGliL2dyYWRlTWFwXCIpO1xuY29uc3QgU2ltcGxlTWVudSA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc2ltcGxlTWVudVwiKTtcbmNvbnN0IFNlbGVjdHJhID0gcmVxdWlyZShcIi4uLy4uL2xpYi9zZWxlY3RyYVwiKTtcblxuY29uc3QgcmFkaW8gPSBCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZ2xvYmFsXCIpO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNb2RlbHMgJiBDb2xsZWN0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5jb25zdCBHcm91cE1vZGVsID0gQmFja2JvbmUuRXBveHkuTW9kZWwuZXh0ZW5kKHtcblx0aWRBdHRyaWJ1dGU6IFwiY29kZVwiLFxuXG5cdHVybFJvb3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9ncm91cHMvY3VzdG9tXCI7XG5cdH0sXG5cblx0dmFsaWRhdGU6IGZ1bmN0aW9uKGF0dHJpYnV0ZXMpIHtcblx0XHQvLyBBIGNvbGxlY3Rpb24gb2YgZ3JvdXBzIGlzIHJlcXVpcmVkIHRvIHZhbGlkYXRlIGEgY3VzdG9tIGdyb3VwJ3MgbmFtZS4gVGhlIEdyb3VwcyBjb2xsZWN0aW9uXG5cdFx0Ly8gYXVnbWVudHMgZXZlcnkgbW9kZWwgYWRkZWQgdG8gaXQgd2l0aCBhIHJlZmVyZW5jZSB0byBpdHNlbGYuXG5cblx0XHRjb25zdCBlcnJvcnMgPSB7fTtcblx0XHQvL2NvbnN0IHVzZXIgPSByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpO1xuXG5cdFx0aWYgKCFhdHRyaWJ1dGVzLm5hbWUpXG5cdFx0XHRlcnJvcnMubmFtZSA9IFwiQSBuYW1lIGlzIHJlcXVpcmVkLlwiO1xuXG5cdFx0aWYgKF8ua2V5cyhlcnJvcnMpLmxlbmd0aCA+IDApXG5cdFx0XHRyZXR1cm4gZXJyb3JzO1xuXHR9LFxufSk7XG5cbmNvbnN0IE1hcmsgPSBCYWNrYm9uZS5FcG94eS5Nb2RlbC5leHRlbmQoe1xuXHRpZEF0dHJpYnV0ZTogXCJfaWRcIixcblxuXHRjb21wdXRlZHM6IHtcblx0XHRvd25lck5hbWVzOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiAodGhpcy5oYXMoXCJmaXJzdG5hbWVcIikgJiYgdGhpcy5oYXMoXCJzdXJuYW1lXCIpID8gdGhpcy5nZXQoXCJmaXJzdG5hbWVcIikgKyBcIiBcIiArIHRoaXMuZ2V0KFwic3VybmFtZVwiKSA6IFwiW1VzZXIgTWlzc2luZ11cIik7XG5cdFx0fSxcblxuXHRcdGFzc2Vzc21lbnRUaXRsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5oYXMoXCJ0aXRsZVwiKSA/IHRoaXMuZ2V0KFwidGl0bGVcIikgOiBcIi1cIjtcblx0XHR9LFxuXG5cdFx0YXNzZXNzbWVudFN1YmplY3Q6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuaGFzKFwic3ViamVjdF9uYW1lXCIpID8gdGhpcy5nZXQoXCJzdWJqZWN0X25hbWVcIikgOiBcIi1cIjtcblx0XHR9LFxuXG5cdFx0YXNzZXNzbWVudEdyYWRlOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLmhhcyhcInN0dWR5WWVhclwiKSA/IGdyYWRlTWFwLmNvZGVUb0h1bWFuVmFsdWUodGhpcy5nZXQoXCJzdHVkeVllYXJcIiksIHsgbGV4aWNhbDogdHJ1ZSB9KSA6IFwiXCI7XG5cdFx0fSxcblxuXHRcdGluc3RhbmNlVGl0bGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuaGFzKFwic2V0dGluZ3NcIikgPyB0aGlzLmdldChcInNldHRpbmdzXCIpLnRpdGxlIDogXCItXCI7XG5cdFx0fSxcblxuXHRcdGNvbXBsZXRlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAodGhpcy5oYXMoXCJwYXlsb2FkXCIpKSB7XG5cdFx0XHRcdGNvbnN0IGNvbXBsZXRlZCA9IEJvb2xlYW4oXy5maW5kKHRoaXMuZ2V0KFwicGF5bG9hZFwiKS5hY3Rpdml0eSwgYWN0aXZpdHkgPT4gYWN0aXZpdHkubmFtZSA9PT0gXCJhc3Nlc3NtZW50LWNvbXBsZXRlZFwiKSk7XG5cdFx0XHRcdHJldHVybiBcIjxzcGFuIGNsYXNzPSdmYWxcIiArIChjb21wbGV0ZWQgPyBcIiBmYS1jaGVjayBhc3Nlc3NtZW50LXN0YXR1cy1jb21wbGV0ZSc+XCIgOiBcImFzc2Vzc21lbnQtc3RhdHVzLWluY29tcGxldGUnPlwiKSArIFwiPC9zcGFuPlwiO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRtYXJrZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0bGV0IG1hcmtlZCA9IHRydWU7XG5cblx0XHRcdGlmICghdGhpcy5oYXMoXCJwYXlsb2FkXCIpIHx8ICF0aGlzLmdldChcInBheWxvYWRcIikucmVzdWx0cyB8fCAhdGhpcy5nZXQoXCJwYXlsb2FkXCIpLnJlc3VsdHMuc2NvcmVzKVxuXHRcdFx0XHRtYXJrZWQgPSBmYWxzZTtcblx0XHRcdGVsc2UgaWYgKF8uZmluZCh0aGlzLmdldChcInBheWxvYWRcIikucmVzdWx0cy5zY29yZXMsIHNjb3JlRGF0YSA9PiBzY29yZURhdGEuc2NvcmUgPT09IHVuZGVmaW5lZCkpXG5cdFx0XHRcdG1hcmtlZCA9IGZhbHNlO1xuXG5cdFx0XHRyZXR1cm4gXCI8c3BhbiBjbGFzcz0nZmFsXCIgKyAobWFya2VkID8gXCIgZmEtY2hlY2sgYXNzZXNzbWVudC1zdGF0dXMtY29tcGxldGUnPlwiIDogXCJhc3Nlc3NtZW50LXN0YXR1cy1pbmNvbXBsZXRlJz5cIikgKyBcIjwvc3Bhbj5cIjtcblx0XHR9LFxuXG5cdFx0dG90YWxNYXJrOiBmdW5jdGlvbigpIHtcblx0XHRcdGxldCB0b3RhbCA9IDA7XG5cblx0XHRcdGlmICh0aGlzLmhhcyhcInBheWxvYWRcIikgJiYgdGhpcy5nZXQoXCJwYXlsb2FkXCIpLnJlc3VsdHMgJiYgdGhpcy5nZXQoXCJwYXlsb2FkXCIpLnJlc3VsdHMuc2NvcmVzKVxuXHRcdFx0XHRfLmVhY2godGhpcy5nZXQoXCJwYXlsb2FkXCIpLnJlc3VsdHMuc2NvcmVzLCBzY29yZURhdGEgPT4geyB0b3RhbCArPSBzY29yZURhdGEuc2NvcmUgPyBzY29yZURhdGEuc2NvcmUgOiAwOyB9KTtcblxuXHRcdFx0cmV0dXJuIHRvdGFsO1xuXHRcdH0sXG5cblx0XHRtYXhTY29yZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAodGhpcy5oYXMoXCJwYXlsb2FkXCIpICYmIHRoaXMuZ2V0KFwicGF5bG9hZFwiKS5yZXN1bHRzICYmIHRoaXMuZ2V0KFwicGF5bG9hZFwiKS5yZXN1bHRzLm1heFNjb3JlKVxuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXQoXCJwYXlsb2FkXCIpLnJlc3VsdHMubWF4U2NvcmU7XG5cdFx0XHRyZXR1cm4gXCItXCI7XG5cdFx0fSxcblx0fSxcbn0pO1xuXG5jb25zdCBNYXJrQ29sbGVjdGlvbiA9IEJhY2tib25lLlBhZ2VhYmxlQ29sbGVjdGlvbi5leHRlbmQoe1xuXHRtb2RlbDogTWFyayxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihncm91cCkge1xuXHRcdHRoaXMuZ3JvdXAgPSBncm91cDtcblx0fSxcblxuXHR1cmw6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cCA/IHRoaXMuZ3JvdXAgOiB0aGlzLm9wdGlvbnMucmF3Lmdyb3VwO1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9hc3Nlc3NtZW50cy9zdHVkZW50P3BhZ2VkPXRydWUmZ3JvdXBGaWx0ZXI9XCIgKyBncm91cC5nZXQoXCJjb2RlXCIpO1xuXHR9LFxuXG5cdHN0YXRlOiB7XG5cdFx0cGFnZVNpemU6IDE1LFxuXHR9LFxuXHRtb2RlOiBcInNlcnZlclwiLFxuXG5cdHF1ZXJ5UGFyYW1zOiB7XG5cdFx0cGFnZVNpemU6IFwicGFnZVNpemVcIixcblx0XHRzb3J0S2V5OiBcInNvcnRCeVwiLFxuXHR9LFxuXG5cdHBhcnNlU3RhdGU6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRyZXR1cm4geyB0b3RhbFJlY29yZHM6IHJlc3AudG90YWwgfTtcblx0fSxcblxuXHRwYXJzZVJlY29yZHM6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRyZXR1cm4gcmVzcC5yb3dzO1xuXHR9LFxufSk7XG5cbmNvbnN0IEdsb2JhbEdyb3VwU2VsZWN0b3IgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImdyb3VwLXNlbGVjdG9yIGdsb2JhbC1ncm91cC1zZWxlY3RvclwiLFxuXHRpZDogXCJnbG9iYWwtZ3JvdXAtc2VsZWN0b3JcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9ncm91cE1hcmtzLm51bmpcIikuZ2xvYmFsR3JvdXBTZWxlY3RvcixcblxuXHR1aToge1xuXHRcdGdyb3VwczogXCJzZWxlY3RbbmFtZT1ncm91cHNdXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjaGFuZ2UgQHVpLmdyb3Vwc1wiOiBcIm9uR3JvdXBDaGFuZ2VcIixcblx0fSxcblxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCB1c2VyID0gcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblxuXHRcdHRoaXMuc2VsZWN0ID0gbmV3IFNlbGVjdHJhKHtcblx0XHRcdHNlcnZlcjoge1xuXHRcdFx0XHRmZXRjaDogYCR7c2V0dGluZ3MudXJsUm9vdH0vYXBpLzEuMC91c2Vycy8ke2VuY29kZVVSSUNvbXBvbmVudCh1c2VyLnVzZXJuYW1lKX0vZW5yb2xtZW50YCxcblx0XHRcdFx0ZGVsYXlMb2FkOiB0cnVlLFxuXHRcdFx0XHRrZXk6IFwiY29kZVwiLFxuXHRcdFx0XHR2YWx1ZTogXCJuYW1lXCIsXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdHBhZ2VTaXplOiAyMCxcblx0XHRcdFx0aW5maW5pdGU6IHRydWUsXG5cdFx0XHR9LFxuXHRcdH0pO1xuXHRcdHRoaXMuc2VsZWN0LnNob3coeyBlbDogdGhpcy51aS5ncm91cHMgfSk7XG5cdH0sXG5cblx0b25Hcm91cENoYW5nZTogZnVuY3Rpb24oZXZ0LCBkYXRhKSB7XG5cdFx0dGhpcy50cmlnZ2VyKFwic2VsZWN0XCIsIGRhdGEpO1xuXHR9LFxuXG5cdC8vIHRlbXBsYXRlQ29udGV4dDogZnVuY3Rpb24oKVxuXHQvLyB7XG5cdC8vIFx0cmV0dXJuIHtcblx0Ly8gXHRcdGdyb3VwczogdGhpcy5ncm91cHMudG9KU09OKCksXG5cdC8vIFx0fTtcblx0Ly8gfSxcblxuXHQvLyBpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKVxuXHQvLyB7XG5cdC8vIFx0dGhpcy5ncm91cHMgPSBvcHRpb25zLmdyb3Vwcztcblx0Ly8gfSxcblxuXHQvLyBvblJlbmRlcjogZnVuY3Rpb24oKVxuXHQvLyB7XG5cdC8vIFx0dGhpcy51aS5ncm91cHMuY2hvc2VuKCk7XG5cblx0Ly8gXHR0aGlzLnVwZGF0ZUdyb3VwTGlzdCgpO1xuXG5cdC8vIFx0dGhpcy5vbihcInJlZnJlc2hcIiwgdGhpcy51cGRhdGVHcm91cExpc3QsIHRoaXMpO1xuXHQvLyB9LFxuXG5cdGRlc2VsZWN0OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNlbGVjdC5jbGVhcigpO1xuXHRcdC8vdGhpcy51aS5ncm91cHMudmFsKFwiXCIpO1xuXG5cdFx0dGhpcy51cGRhdGVHcm91cExpc3QoKTtcblx0fSxcblxuXHR1cGRhdGVHcm91cExpc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHNlbGVjdGVkR3JvdXBDb2RlID0gdGhpcy51aS5ncm91cHMudmFsKCk7XG5cblx0XHRjb25zdCBncm91cHMgPSBfLmZpbHRlcih0aGlzLmdyb3VwcywgZ3JvdXAgPT4gIWdyb3VwLmdldChcInByaXZhdGVcIikpO1xuXG5cdFx0Y29uc3Qgb3B0aW9uTGlzdCA9IF8ucmVkdWNlKGdyb3VwcywgKGFjY3VtdWxhdG9yLCBncm91cCkgPT4ge1xuXHRcdFx0Y29uc3QgZ3JvdXBOYW1lID0gZ3JvdXAuZ2V0KFwibmFtZVwiKSA/IGdyb3VwLmdldChcIm5hbWVcIikgOiBcIlwiO1xuXHRcdFx0YWNjdW11bGF0b3IucHVzaChcIjxvcHRpb24gdmFsdWU9XFxcIlwiICsgZ3JvdXAuaWQgKyBcIlxcXCJcIiArIChncm91cC5pZCA9PT0gc2VsZWN0ZWRHcm91cENvZGUgPyBcInNlbGVjdGVkXCIgOiBcIlwiKSArIFwiPlwiICtcblx0XHRcdFx0Z3JvdXBOYW1lLnJlcGxhY2UoL1tcXCZcXDxcXD5cXCdcXFwiXS9nLCB4ID0+IFwiJiNcIiArIHguY2hhckNvZGVBdCgwKSArIFwiO1wiKSArIFwiPC9vcHRpb24+XCIpO1xuXHRcdFx0cmV0dXJuIGFjY3VtdWxhdG9yO1xuXHRcdH0sIFtcIjxvcHRpb24gdmFsdWU9Jyc+PC9vcHRpb24+XCJdKTtcblxuXHRcdHRoaXMudWkuZ3JvdXBzLmh0bWwob3B0aW9uTGlzdC5qb2luKFwiXCIpKS50cmlnZ2VyKFwiY2hvc2VuOnVwZGF0ZWRcIik7XG5cdH0sXG5cblx0Ly8gb25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpXG5cdC8vIHtcblx0Ly8gXHR0aGlzLm9mZihcInJlZnJlc2hcIik7XG5cdC8vIH0sXG59KTtcblxuY29uc3QgQ3VzdG9tR3JvdXBTZWxlY3RvciA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZ3JvdXAtc2VsZWN0b3IgY3VzdG9tLWdyb3VwLXNlbGVjdG9yXCIsXG5cdGlkOiBcImN1c3RvbS1ncm91cC1zZWxlY3RvclwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2dyb3VwTWFya3MubnVualwiKS5jdXN0b21Hcm91cFNlbGVjdG9yLFxuXG5cdHVpOiB7XG5cdFx0YnV0dG9uQ3JlYXRlR3JvdXA6IFwiYnV0dG9uLmNyZWF0ZS1ncm91cFwiLFxuXHRcdGdyb3VwczogXCJzZWxlY3RbbmFtZT1ncm91cHNdXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkuYnV0dG9uQ3JlYXRlR3JvdXBcIjogXCJvbkJ1dHRvbkNyZWF0ZUdyb3VwQ2xpY2tcIixcblx0XHRcImNoYW5nZSBAdWkuZ3JvdXBzXCI6IFwib25Hcm91cENoYW5nZVwiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLmdyb3VwcyA9IG9wdGlvbnMuZ3JvdXBzO1xuXHRcdHRoaXMuZ2xvYmFsR3JvdXAgPSBvcHRpb25zLmdsb2JhbEdyb3VwQ29kZTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgdXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cblx0XHR0aGlzLnNlbGVjdCA9IG5ldyBTZWxlY3RyYSh7XG5cdFx0XHRzZXJ2ZXI6IHtcblx0XHRcdFx0ZmV0Y2g6IGAke3NldHRpbmdzLnVybFJvb3R9L2FwaS8xLjAvdXNlcnMvJHtlbmNvZGVVUklDb21wb25lbnQodXNlci51c2VybmFtZSl9L2dyb3Vwcy8ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLmdsb2JhbEdyb3VwLmdldChcImNvZGVcIikpfS9jdXN0b21gLFxuXHRcdFx0XHRkZWxheUxvYWQ6IHRydWUsXG5cdFx0XHRcdGtleTogXCJjb2RlXCIsXG5cdFx0XHRcdHZhbHVlOiBcIm5hbWVcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0cGFnZVNpemU6IDIwLFxuXHRcdFx0XHRpbmZpbml0ZTogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0fSk7XG5cdFx0dGhpcy5zZWxlY3Quc2hvdyh7IGVsOiB0aGlzLnVpLmdyb3VwcyB9KTtcblxuXHRcdHRoaXMubGlzdGVuVG8odGhpcywgXCJyZWZyZXNoXCIsIGNvZGUgPT4ge1xuXHRcdFx0dGhpcy5nbG9iYWxHcm91cCA9IGNvZGU7XG5cdFx0XHR0aGlzLnNlbGVjdC5jbGVhcigpO1xuXHRcdH0sIHRoaXMpO1xuXG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLCBcInJlc2V0XCIsICgpID0+IHtcblx0XHRcdHRoaXMuc2VsZWN0LmNsZWFyKCk7XG5cdFx0fSwgdGhpcyk7XG5cdH0sXG5cblx0b25CdXR0b25DcmVhdGVHcm91cENsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnRyaWdnZXIoXCJjcmVhdGVcIiwgdGhpcy5nbG9iYWxHcm91cCk7XG5cdH0sXG5cblx0b25Hcm91cENoYW5nZTogZnVuY3Rpb24oZXZ0LCBkYXRhKSB7XG5cdFx0dGhpcy50cmlnZ2VyKFwic2VsZWN0XCIsIG5ldyBHcm91cE1vZGVsKGRhdGEudG9KU09OKCkpLCB0aGlzLmdsb2JhbEdyb3VwKTtcblx0fSxcblxuXHR1cGRhdGVHcm91cExpc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGdyb3VwcyA9IF8uZmlsdGVyKHRoaXMuZ3JvdXBzLCBncm91cCA9PiBncm91cC5nZXQoXCJwcml2YXRlXCIpICYmIGdyb3VwLmdldChcInJvb3RcIikgPT09IHRoaXMuZ2xvYmFsR3JvdXBDb2RlKTtcblxuXHRcdGNvbnN0IG9wdGlvbkxpc3QgPSBfLnJlZHVjZShncm91cHMsIChhY2N1bXVsYXRvciwgZ3JvdXApID0+IHtcblx0XHRcdGFjY3VtdWxhdG9yLnB1c2goXCI8b3B0aW9uIHZhbHVlPVxcXCJcIiArIGdyb3VwLmlkICsgXCJcXFwiPlwiICsgKGdyb3VwLmdldChcIm93bmVyXCIpID8gXCJcIiA6IFwiKCopIFwiKSArIGdyb3VwLmdldChcIm5hbWVcIikucmVwbGFjZSgvW1xcJlxcPFxcPlxcJ1xcXCJdL2csIHggPT4gXCImI1wiICsgeC5jaGFyQ29kZUF0KDApICsgXCI7XCIpICsgXCI8L29wdGlvbj5cIik7XG5cdFx0XHRyZXR1cm4gYWNjdW11bGF0b3I7XG5cdFx0fSwgW1wiPG9wdGlvbiB2YWx1ZT0nJz48L29wdGlvbj5cIl0pO1xuXG5cdFx0dGhpcy51aS5ncm91cHMuaHRtbChvcHRpb25MaXN0LmpvaW4oXCJcIikpLnRyaWdnZXIoXCJjaG9zZW46dXBkYXRlZFwiKTtcblx0fSxcblxuXHRkZXNlbGVjdDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zZWxlY3QuY2xlYXIoKTtcblxuXHRcdHRoaXMudXBkYXRlR3JvdXBMaXN0KCk7XG5cdH0sXG5cbn0pO1xuXG5jb25zdCBNYXJrc0dyaWQgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogXCJkaXZcIixcblx0Y2xhc3NOYW1lOiBcImNvbnRlbnQgdXNlci1tYW5hZ2VyIHN0dWRlbnQtbWFya3NcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9ncm91cE1hcmtzLm51bmpcIikuZ3JvdXBNYXJrcyxcblxuXHR1aToge1xuXHRcdGZpbHRlckJhcjogXCIub3BzLWJhciAuZmlsdGVyc1wiLFxuXHRcdGNvdW50ZXJCYXI6IFwiLm9wcy1iYXIgLmNvdW50ZXJcIixcblx0XHRhZGRJY29uOiBcIi5hZGQtaXRlbVwiLFxuXHRcdGltcG9ydEljb246IFwiLmltcG9ydC1pdGVtXCIsXG5cdFx0ZG93bmxvYWQ6IFwiYnV0dG9uLmRvd25sb2FkXCIsXG5cdFx0Z3JpZDogXCJkaXYuZ3JpZFwiLFxuXHR9LFxuXG5cdGNvbGxlY3Rpb25FdmVudHM6IHtcblx0XHRcImJ1dHRvbmNlbGw6Y2xpY2tlZFwiOiBcImRvd25sb2FkSXRlbVwiLFxuXHRcdFwic3luYyByZXNldCBhZGQgcmVtb3ZlXCI6IFwidXBkYXRlQ291bnRlclwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmFkZEljb25cIjogXCJzaG93QWRkXCIsXG5cdFx0XCJjbGljayBAdWkuaW1wb3J0SWNvblwiOiBcInNob3dJbXBvcnRcIixcblx0XHRcImNsaWNrIEB1aS5kb3dubG9hZFwiOiBcInNob3dEb3dubG9hZHNcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucztcblx0XHR0aGlzLnJhdyA9IG5ldyBNYXJrQ29sbGVjdGlvbihvcHRpb25zLmN1c3RvbUdyb3VwQ29kZSk7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5ncmlkKVxuXHRcdFx0dGhpcy5ncmlkLmRlc3Ryb3koKTtcblx0fSxcblxuXHR1cGRhdGVDb3VudGVyOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBwYWdlU3RhcnQgPSAoKCh0aGlzLmNvbGxlY3Rpb24uc3RhdGUuY3VycmVudFBhZ2UgLSAxKSAqIHRoaXMuY29sbGVjdGlvbi5zdGF0ZS5wYWdlU2l6ZSkgKyAxKTtcblx0XHRsZXQgcGFnZUVuZCA9ICgodGhpcy5jb2xsZWN0aW9uLnN0YXRlLmN1cnJlbnRQYWdlKSAqIHRoaXMuY29sbGVjdGlvbi5zdGF0ZS5wYWdlU2l6ZSk7XG5cdFx0aWYgKHBhZ2VFbmQgPiB0aGlzLmNvbGxlY3Rpb24uc3RhdGUudG90YWxSZWNvcmRzKVxuXHRcdFx0cGFnZUVuZCA9IHRoaXMuY29sbGVjdGlvbi5zdGF0ZS50b3RhbFJlY29yZHM7XG5cblx0XHRsZXQgdGV4dCA9IFwiQ29udGVudCBpdGVtcyBcIiArIHBhZ2VTdGFydCArIFwiIC0gXCIgKyBwYWdlRW5kICsgXCIgb2YgXCIgKyAodGhpcy5jb2xsZWN0aW9uLnN0YXRlLnRvdGFsUmVjb3Jkcyk7XG5cdFx0aWYgKHRoaXMuY29sbGVjdGlvbi5zdGF0ZS50b3RhbFJlY29yZHMgPT09IG51bGwpXG5cdFx0XHR0ZXh0ID0gXCJObyBjb250ZW50IHRvIHNob3dcIjtcblxuXHRcdHRoaXMudWkuY291bnRlckJhci50ZXh0KHRleHQpO1xuXHR9LFxuXG5cblx0ZG93bmxvYWRMaXN0OiBmdW5jdGlvbigpIHtcblx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9yZXNvdXJjZXMvbGlzdHMvY29udGVudFwiKTtcblx0fSxcblxuXHRmaWx0ZXJDbG9uZTogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRyZXR1cm4gbW9kZWwuZ2V0KFwiY2F0ZWdvcnlcIikgPT09IFwiYXNzZXNzbWVudFwiO1xuXHR9LFxuXG5cdGRvd25sb2FkSXRlbTogZnVuY3Rpb24oaWQsIG1vZGVsKSB7XG5cdFx0d2luZG93Lm9wZW4oc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvYXNzZXNzbWVudHMvXCIgKyBtb2RlbC5nZXQoXCJhc3Nlc3NtZW50XCIpICsgXCIvbWFya3MvXCIgKyBtb2RlbC5nZXQoXCJhdHRhY2htZW50XCIpICtcblx0XHRcdFwiL3JlcG9ydD9zdHVkZW50QW5zd2Vycz10cnVlJmFzc2Vzc21hcms9XCIgKyBtb2RlbC5nZXQoXCJfaWRcIikpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBidG5PcHRpb25zID0ge1xuXHRcdFx0Y2xhc3M6IFwiZG93bmxvYWRcIixcblx0XHRcdGlkOiBcImJ0bkRvd25sb2FkUmVwb3J0XCIsXG5cdFx0XHR0ZXh0OiBcIjxzcGFuIGNsYXNzPSdmYWwgZmEtY2xvdWQtZG93bmxvYWQnIHRpdGxlPSdEb3dubG9hZCBQREYgUmVwb3J0JyAvPlwiLFxuXHRcdH07XG5cblx0XHRjb25zdCBjb2x1bW5zID0gW1xuXHRcdFx0eyBuYW1lOiBcIm93bmVyTmFtZXNcIiwgbGFiZWw6IFwiUGVyc29uXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSwgc29ydFZhbHVlOiBTZXJ2ZXJHcmlkLnN0cmluZ1NvcnQgfSxcblx0XHRcdHsgbmFtZTogXCJhc3Nlc3NtZW50VGl0bGVcIiwgbGFiZWw6IFwiQXNzZXNzbWVudFwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UsIHNvcnRWYWx1ZTogU2VydmVyR3JpZC5zdHJpbmdTb3J0IH0sXG5cdFx0XHR7IG5hbWU6IFwiaW5zdGFuY2VUaXRsZVwiLCBsYWJlbDogXCJJbnN0YW5jZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UsIHNvcnRWYWx1ZTogU2VydmVyR3JpZC5zdHJpbmdTb3J0IH0sXG5cdFx0XHR7IG5hbWU6IFwiYXNzZXNzbWVudFN1YmplY3RcIiwgbGFiZWw6IFwiU3ViamVjdFwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UsIHNvcnRWYWx1ZTogU2VydmVyR3JpZC5zdHJpbmdTb3J0IH0sXG5cdFx0XHR7IG5hbWU6IFwiYXNzZXNzbWVudEdyYWRlXCIsIGxhYmVsOiBcIkdyYWRlXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSwgc29ydFZhbHVlOiBTZXJ2ZXJHcmlkLnN0cmluZ1NvcnQgfSxcblx0XHRcdHsgbmFtZTogXCJjb21wbGV0ZWRcIiwgY2xhc3M6IFwiY29tcGxldGVkc1wiLCBsYWJlbDogXCJDb21wbGV0ZWRcIiwgY2VsbDogU2VydmVyR3JpZC5IVE1MQ2VsbC5leHRlbmQoe30pLCBlZGl0YWJsZTogZmFsc2UsIHNvcnRWYWx1ZTogU2VydmVyR3JpZC5zdHJpbmdTb3J0IH0sXG5cdFx0XHR7IG5hbWU6IFwibWFya2VkXCIsIGxhYmVsOiBcIk1hcmtlZFwiLCBjZWxsOiBTZXJ2ZXJHcmlkLkhUTUxDZWxsLmV4dGVuZCh7fSksIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcInRvdGFsTWFya1wiLCBsYWJlbDogXCJNYXJrXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcIm1heFNjb3JlXCIsIGxhYmVsOiBcIlRvdGFsXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBsYWJlbDogXCJEb3dubG9hZFwiLCBjZWxsOiBuZXcgU2VydmVyR3JpZC5CdXR0b25DZWxsKGJ0bk9wdGlvbnMpLCBlZGl0YWJsZTogZmFsc2UsIHNvcnRhYmxlOiBmYWxzZSB9LFxuXHRcdF07XG5cblx0XHR0aGlzLmdyaWQgPSBuZXcgU2VydmVyR3JpZCh7XG5cdFx0XHRlbDogdGhpcy51aS5ncmlkLFxuXHRcdFx0Y29sdW1uczogY29sdW1ucyxcblx0XHRcdGNvbGxlY3Rpb246IHRoaXMucmF3LFxuXHRcdFx0Y2xpY2thYmxlOiBmYWxzZSxcblx0XHR9KTtcblxuXHRcdHRoaXMuY29sbGVjdGlvbiA9IHRoaXMuZ3JpZC5jb2xsZWN0aW9uO1xuXG5cdFx0dGhpcy5iaW5kRXZlbnRzKHRoaXMuY29sbGVjdGlvbiwgdGhpcy5jb2xsZWN0aW9uRXZlbnRzKTtcblxuXHRcdGNvbnN0IHNlYXJjaEZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwidGV4dFwiLFxuXHRcdFx0bmFtZTogXCJ0ZXh0RmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJUZXh0IFNlYXJjaFwiLFxuXHRcdFx0ZGVib3VuY2U6IDIwMCxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0dGhpcy51aS5maWx0ZXJCYXIucHJlcGVuZCh0aGlzLmdyaWQuZmlsdGVyKHsgZmlsdGVyQ29udGFpbmVyOiB0aGlzLnVpLmZpbHRlckJhciwgZmlsdGVyczogW3NlYXJjaEZpbHRlcl0sIGRlZmF1bHRGaWx0ZXJzOiBbXCJ0ZXh0RmlsdGVyXCJdIH0pLnJlbmRlcigpLmVsKTtcblxuXHRcdCQoXCIucGFnaW5nXCIsIHRoaXMuZWwpLmFwcGVuZCh0aGlzLmdyaWQucGFnaW5nKCkucmVuZGVyKCkuZWwpO1xuXG5cdFx0aWYgKCFzZXR0aW5ncy5hc3Nlc3NtZW50cylcblx0XHRcdHRoaXMudWkuaW1wb3J0SWNvbi5hZGRDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0cmVwcm9kdWNlSXRlbTogZnVuY3Rpb24obW9kZWwpIHtcblx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9hc3Nlc3NtZW50cy9cIiArIG1vZGVsLmdldChcIl9pZFwiKSArIFwiL3JlcG9ydFwiKTtcblx0fSxcblxuXHRkb3dubG9hZENTVk1hcmtzOiBmdW5jdGlvbigpIHtcblx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9hc3Nlc3NtZW50cy9zdHVkZW50L2V4cG9ydFwiKTtcblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiY29udGVudCBjdXN0b20tZ3JvdXAtbWFuYWdlclwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2dyb3VwTWFya3MubnVualwiKS5tYW5hZ2VyLFxuXG5cdHJlZ2lvbnM6IHtcblx0XHRjdXN0b21Hcm91cENyZWF0b3I6IFwiLmN1c3RvbS1ncm91cC1jcmVhdG9yLXJlZ2lvblwiLFxuXHRcdGN1c3RvbUdyb3VwU2VsZWN0b3I6IFwiLmN1c3RvbS1ncm91cC1zZWxlY3Rvci1yZWdpb25cIixcblx0XHRncm91cE1hcmtzOiBcIi5ncm91cC1tYXJrcy1yZWdpb25cIixcblx0XHRnbG9iYWxHcm91cFNlbGVjdG9yOiBcIi5nbG9iYWwtZ3JvdXAtc2VsZWN0b3ItcmVnaW9uXCIsXG5cdFx0aGVhZGVyOiBcIi5oZWFkZXItcmVnaW9uXCIsXG5cdFx0c3RhdHVzOiBcIi5zdGF0dXMtcmVnaW9uXCIsXG5cdH0sXG5cblx0dWk6IHtcblx0XHRjdXN0b21Hcm91cFNlbGVjdG9yUmVnaW9uOiBcIi5jdXN0b20tZ3JvdXAtc2VsZWN0b3ItcmVnaW9uXCIsXG5cdFx0Y3VzdG9tR3JvdXBDcmVhdG9yUmVnaW9uOiBcIi5jdXN0b20tZ3JvdXAtY3JlYXRvci1yZWdpb25cIixcblx0XHRnbG9iYWxHcm91cFNlbGVjdG9yUmVnaW9uOiBcIi5nbG9iYWwtZ3JvdXAtc2VsZWN0b3ItcmVnaW9uXCIsXG5cdFx0aGVhZGVyUmVnaW9uOiBcIi5oZWFkZXItcmVnaW9uXCIsXG5cdFx0c3RhdHVzUmVnaW9uOiBcIi5zdGF0dXMtcmVnaW9uXCIsXG5cdFx0ZG93bmxvYWRBc3Nlc3NtZW50UmVwb3J0OiBcImRpdi5kb3dubG9hZEFzc2Vzc21lbnRSZXBvcnRcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5kb3dubG9hZEFzc2Vzc21lbnRSZXBvcnRcIjogXCJzaG93QXNzZXNzbWVudHNcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5zdGFydENvZGUgPSBvcHRpb25zLmNvZGU7XG5cdFx0dGhpcy5ldmVudEJ1cyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJjdXN0b21Hcm91cE1hbmFnZXJcIik7XG5cblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwiZWRpdG9yOmJhY2tcIiwgdGhpcy5vbk1hcmtzR3JpZEJhY2suYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmV2ZW50QnVzLCBcImVkaXRvcjpncm91cC11cGdyYWRlZFwiLCB0aGlzLm9uTWFya3NHcmlkR3JvdXBVcGdyYWRlZC5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwiZWRpdG9yOmJlZ2luLXNhdmVcIiwgdGhpcy5vbk1hcmtzR3JpZEJlZ2luU2F2ZS5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwiZWRpdG9yOmVuZC1zYXZlXCIsIHRoaXMub25NYXJrc0dyaWRFbmRTYXZlLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJlZGl0b3I6Y2xvbmVcIiwgdGhpcy5vbk1hcmtzR3JpZENsb25lLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLnN0YXR1c1JlZ2lvbi5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5oZWFkZXJSZWdpb24ucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0Ly90aGlzLmhlYWRlciA9IG5ldyBIZWFkZXIoeyBldmVudEJ1czogdGhpcy5ldmVudEJ1cyB9KTtcblx0XHQvL3RoaXMuc2hvd0NoaWxkVmlldyhcImhlYWRlclwiLCB0aGlzLmhlYWRlcik7XG5cblx0XHRpZiAodGhpcy5zdGFydENvZGUpIHtcblx0XHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcInN0YXR1c1wiLCBuZXcgU3RhdHVzVmlldyh7IHR5cGU6IFwibG9hZGluZ1wiIH0pKTtcblxuXHRcdFx0Ly8gV2UncmUgdHJ5aW5nIHRvIGVkaXQgYSBjdXN0b20gZ3JvdXAsIHNvIGZldGNoIGl0IGZyb20gdGhlIHNlcnZlclxuXHRcdFx0Y29uc3QgY3VzdG9tTW9kZWwgPSBuZXcgR3JvdXBNb2RlbCh7XG5cdFx0XHRcdGNvZGU6IHRoaXMuc3RhcnRDb2RlLFxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIERvbid0IHJlcnVuIHRoaXMgY29kZVxuXHRcdFx0ZGVsZXRlIHRoaXMuc3RhcnRDb2RlO1xuXG5cdFx0XHRjb25zdCB4aHIgPSBjdXN0b21Nb2RlbC5mZXRjaCgpO1xuXHRcdFx0UHJvbWlzZS5yZXNvbHZlKHhocilcblx0XHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRcdGlmICghY3VzdG9tTW9kZWwuZ2V0KFwicHJpdmF0ZVwiKSlcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBmaW5kIG1hdGNoaW5nIGdyb3VwXCIpO1xuXG5cdFx0XHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgkLmFqYXgoe1xuXHRcdFx0XHRcdFx0bWV0aG9kOiBcIkdFVFwiLFxuXHRcdFx0XHRcdFx0dXJsOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9ncm91cHMvXCIgKyBjdXN0b21Nb2RlbC5nZXQoXCJyb290XCIpLFxuXHRcdFx0XHRcdFx0anNvbjogdHJ1ZSxcblx0XHRcdFx0XHR9KSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKGRhdGEgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGdsb2JhbEdyb3VwID0gbmV3IEdyb3VwTW9kZWwoZGF0YSk7XG5cdFx0XHRcdFx0dGhpcy5zaG93RWRpdG9yKGN1c3RvbU1vZGVsLCBnbG9iYWxHcm91cCk7XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy51aS5zdGF0dXNSZWdpb24uYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwic3RhdHVzXCIsIG5ldyBFcnJvclZpZXcoeyBmZXRjaEVycm9yOiBlIH0pKTtcblx0XHRcdFx0fSk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5nbG9iYWxHcm91cFNlbGVjdG9yID0gbmV3IEdsb2JhbEdyb3VwU2VsZWN0b3IoKTtcblx0XHRcdHRoaXMubGlzdGVuVG8odGhpcy5nbG9iYWxHcm91cFNlbGVjdG9yLCBcInNlbGVjdFwiLCB0aGlzLm9uR2xvYmFsR3JvdXBDaGFuZ2UuYmluZCh0aGlzKSk7XG5cdFx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJnbG9iYWxHcm91cFNlbGVjdG9yXCIsIHRoaXMuZ2xvYmFsR3JvdXBTZWxlY3Rvcik7XG5cdFx0fVxuXHR9LFxuXG5cdHNob3dBc3Nlc3NtZW50czogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdGNvbnN0IGVscyA9IFtdO1xuXHRcdGlmICh0aGlzLm1hcmtzR3JpZCAhPT0gdW5kZWZpbmVkICYmIHRoaXMubWFya3NHcmlkLmNvbGxlY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly9Mb29wIHRocm91Z2ggY29sbGVjdGlvbiBtb2RlbHMgYW5kIHByaW50IHRoZSB1bmlxdWUgYXNzZXNzbWVudFxuXHRcdFx0Y29uc3QgYXNzZXNzbWVudHMgPSBfLnVuaXFCeSh0aGlzLm1hcmtzR3JpZC5jb2xsZWN0aW9uLm1vZGVscywgcm93ID0+IHJvdy5hdHRyaWJ1dGVzLmFzc2Vzc21lbnQuX2lkKTtcblx0XHRcdGZvcihsZXQgaSA9IGFzc2Vzc21lbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuXHRcdFx0XHRlbHMucHVzaCh7IHRleHQ6IGFzc2Vzc21lbnRzW2ldLmdldChcImFzc2Vzc21lbnRcIikudGl0bGUsIGlkOiBhc3Nlc3NtZW50c1tpXS5nZXQoXCJhc3Nlc3NtZW50XCIpLl9pZCB9KTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRlbHMucHVzaCh7IHRleHQ6IFwiU2VsZWN0IGEgR2xvYmFsIGFuZCBDdXN0b20gR3JvdXAgZmlyc3RcIiwgaWQ6IFwiZGVmYXVsdElEXCIgfSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgTWVudSA9IG5ldyBTaW1wbGVNZW51KHtcblx0XHRcdGFuY2hvcjogdGhpcy51aS5kb3dubG9hZEFzc2Vzc21lbnRSZXBvcnQsXG5cdFx0XHRzaWRlOiBcInJpZ2h0XCIsXG5cdFx0XHRzdHJ1Y3R1cmU6IFt7XG5cdFx0XHRcdGNsb3NlT25DbGljazogdHJ1ZSxcblx0XHRcdFx0ZWxlbWVudHM6IGVscyxcblx0XHRcdH1dLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhNZW51LCBcImNsaWNrZWRcIiwgdGhpcy5kb3dubG9hZFBERkdyb3VwTWFya3MuYmluZCh0aGlzKSk7XG5cblx0XHRNZW51LnNob3coKTtcblx0fSxcblxuXHRkb3dubG9hZFBERkdyb3VwTWFya3M6IGZ1bmN0aW9uKGVsKSB7XG5cdFx0aWYgKGVsLmlkICE9PSBcImRlZmF1bHRJRFwiKVxuXHRcdFx0d2luZG93Lm9wZW4oc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvYXNzZXNzbWVudHMvXCIgKyBlbC5pZCArIFwiL21hcmtzL25vbmUvcmVwb3J0P2luY2x1ZGVNYXJrcz10cnVlJmdyb3VwPVwiICsgdGhpcy5jdXN0b21Hcm91cENvZGUgKyBcIiZnbG9iYWxHcm91cD1cIiArIHRoaXMuZ2xvYmFsR3JvdXBDb2RlKTtcblx0fSxcblxuXHRyZW5kZXJMb2FkaW5nU3RhdHVzOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJzdGF0dXNcIiwgbmV3IFN0YXR1c1ZpZXcoeyB0eXBlOiBcImxvYWRpbmdcIiB9KSk7XG5cdH0sXG5cblx0cmVuZGVyRXJyb3I6IGZ1bmN0aW9uKGVycm9yKSB7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwic3RhdHVzXCIsIG5ldyBFcnJvclZpZXcoeyBmZXRjaEVycm9yOiBlcnJvciB9KSk7XG5cdH0sXG5cblx0cmVuZGVyUGFnZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5zdGF0dXNSZWdpb24uYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkuaGVhZGVyUmVnaW9uLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblxuXHRcdC8vdGhpcy5oZWFkZXIgPSBuZXcgSGVhZGVyKHsgZXZlbnRCdXM6IHRoaXMuZXZlbnRCdXMgfSk7XG5cdFx0Ly90aGlzLnNob3dDaGlsZFZpZXcoXCJoZWFkZXJcIiwgdGhpcy5oZWFkZXIpO1xuXG5cdFx0dGhpcy5nbG9iYWxHcm91cFNlbGVjdG9yID0gbmV3IEdsb2JhbEdyb3VwU2VsZWN0b3IoeyBncm91cHM6IHRoaXMuZ3JvdXBzIH0pO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5nbG9iYWxHcm91cFNlbGVjdG9yLCBcInNlbGVjdFwiLCB0aGlzLm9uR2xvYmFsR3JvdXBDaGFuZ2UuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiZ2xvYmFsR3JvdXBTZWxlY3RvclwiLCB0aGlzLmdsb2JhbEdyb3VwU2VsZWN0b3IpO1xuXHR9LFxuXG5cdG9uR2xvYmFsR3JvdXBDaGFuZ2U6IGZ1bmN0aW9uKGdyb3VwQ29kZSkge1xuXHRcdGlmICh0aGlzLmdldFJlZ2lvbihcImN1c3RvbUdyb3VwU2VsZWN0b3JcIikuaGFzVmlldygpKSB7XG5cdFx0XHR0aGlzLmN1c3RvbUdyb3VwU2VsZWN0b3IudHJpZ2dlcihcInJlZnJlc2hcIiwgZ3JvdXBDb2RlKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLmN1c3RvbUdyb3VwU2VsZWN0b3IgPSBuZXcgQ3VzdG9tR3JvdXBTZWxlY3Rvcih7XG5cdFx0XHRcdGdsb2JhbEdyb3VwQ29kZTogZ3JvdXBDb2RlLFxuXHRcdFx0XHRncm91cHM6IHRoaXMuZ3JvdXBzLFxuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMubGlzdGVuVG8odGhpcy5jdXN0b21Hcm91cFNlbGVjdG9yLCBcInNlbGVjdFwiLCB0aGlzLm9uQ3VzdG9tR3JvdXBDaGFuZ2UuYmluZCh0aGlzKSk7XG5cdFx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJjdXN0b21Hcm91cFNlbGVjdG9yXCIsIHRoaXMuY3VzdG9tR3JvdXBTZWxlY3Rvcik7XG5cdFx0fVxuXHRcdHRoaXMuZ3JvdXAgPSBncm91cENvZGU7XG5cdFx0dGhpcy5zaG93TWFya3NHcmlkKGdyb3VwQ29kZSwgZ3JvdXBDb2RlKTtcblx0fSxcblxuXHRvbkN1c3RvbUdyb3VwQ2hhbmdlOiBmdW5jdGlvbihjdXN0b21Hcm91cENvZGUsIGdsb2JhbEdyb3VwQ29kZSkge1xuXHRcdHRoaXMuZ3JvdXAgPSBjdXN0b21Hcm91cENvZGU7XG5cdFx0dGhpcy5zaG93TWFya3NHcmlkKGN1c3RvbUdyb3VwQ29kZSwgZ2xvYmFsR3JvdXBDb2RlKTtcblx0XHR0aGlzLmdsb2JhbEdyb3VwU2VsZWN0b3IuZGVzZWxlY3QoKTtcblx0fSxcblxuXHRzaG93TWFya3NHcmlkOiBmdW5jdGlvbihjdXN0b21Hcm91cENvZGUsIGdsb2JhbEdyb3VwQ29kZSkge1xuXHRcdGlmICh0aGlzLm1hcmtzR3JpZClcblx0XHRcdHRoaXMuZ2V0UmVnaW9uKFwiZ3JvdXBNYXJrc1wiKS5yZXNldCgpO1xuXG5cdFx0dGhpcy5tYXJrc0dyaWQgPSBuZXcgTWFya3NHcmlkKHtcblx0XHRcdGN1c3RvbUdyb3VwQ29kZTogY3VzdG9tR3JvdXBDb2RlLFxuXHRcdFx0ZXZlbnRCdXM6IHRoaXMuZXZlbnRCdXMsXG5cdFx0XHRnbG9iYWxHcm91cENvZGU6IGdsb2JhbEdyb3VwQ29kZSxcblx0XHRcdGdyb3VwczogdGhpcy5ncm91cHMsXG5cdFx0fSk7XG5cblx0XHR0aGlzLmN1c3RvbUdyb3VwQ29kZSA9IGN1c3RvbUdyb3VwQ29kZTtcblx0XHR0aGlzLmdsb2JhbEdyb3VwQ29kZSA9IGdsb2JhbEdyb3VwQ29kZTtcblxuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImdyb3VwTWFya3NcIiwgdGhpcy5tYXJrc0dyaWQpO1xuXHR9LFxuXG5cdG9uTWFya3NHcmlkQmFjazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jbG9zZSgpO1xuXHR9LFxuXG5cdG9uTWFya3NHcmlkR3JvdXBVcGdyYWRlZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5nbG9iYWxHcm91cFNlbGVjdG9yLnRyaWdnZXIoXCJyZWZyZXNoXCIpO1xuXHRcdHRoaXMuY3VzdG9tR3JvdXBTZWxlY3Rvci50cmlnZ2VyKFwicmVmcmVzaFwiLCB0aGlzLmdsb2JhbEdyb3VwQ29kZSk7XG5cblx0XHR0aGlzLmNsb3NlKCk7XG5cdH0sXG5cblx0b25NYXJrc0dyaWRCZWdpblNhdmU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJGVsLmFkZENsYXNzKFwiYnVzeVwiKTtcblx0fSxcblxuXHRvbk1hcmtzR3JpZEVuZFNhdmU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKFwiYnVzeVwiKTtcblx0fSxcblxuXHRvbk1hcmtzR3JpZENsb25lOiBmdW5jdGlvbihjdXN0b21Hcm91cE1vZGVsQ2xvbmUpIHtcblx0XHQvLyBSZWNvcmQgdGhlIGNvZGUgb2YgdGhlIHNvdXJjZSBvZiB0aGUgY2xvbmVkIGN1c3RvbSBncm91cFxuXHRcdGNvbnN0IG9sZEN1c3RvbUdyb3VwQ29kZSA9IHRoaXMuY3VzdG9tR3JvdXBDb2RlO1xuXG5cdFx0Ly8gQWRkIHRoZSBjbG9uZWQgY3VzdG9tIGdyb3VwIG1vZGVsIHRvIHRoZSBsb2NhbCBjb2xsZWN0aW9uIG9mIGdyb3Vwc1xuXHRcdHRoaXMuZ3JvdXBzLmFkZChjdXN0b21Hcm91cE1vZGVsQ2xvbmUpO1xuXG5cdFx0Ly8gU2hvdyBhIG5ldyBlZGl0b3IgZm9yIHRoZSBjbG9uZWQgY3VzdG9tIGdyb3VwXG5cdFx0dGhpcy5zaG93TWFya3NHcmlkKGN1c3RvbUdyb3VwTW9kZWxDbG9uZS5pZCwgY3VzdG9tR3JvdXBNb2RlbENsb25lLmdldChcInJvb3RcIikpO1xuXG5cdFx0Ly8gQWRkIHRoZSB1c2VycyB0aGF0IGJlbG9uZyB0byB0aGUgc291cmNlIGN1c3RvbSBncm91cFxuXHRcdHRoaXMuc3R1ZGVudHMuZWFjaChzdHVkZW50ID0+IHtcblx0XHRcdGlmIChfLmluY2x1ZGVzKHN0dWRlbnQuZ2V0KFwiY3VzdG9tR3JvdXBzXCIpLCBvbGRDdXN0b21Hcm91cENvZGUpKVxuXHRcdFx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJlZGl0b3I6YWRkLXVzZXJcIiwgc3R1ZGVudC5jaWQpO1xuXHRcdH0pO1xuXG5cdFx0aWYgKHRoaXMudGVhY2hlcnMpIHtcblx0XHRcdHRoaXMudGVhY2hlcnMuZWFjaCh0ZWFjaGVyID0+IHtcblx0XHRcdFx0aWYgKF8uaW5jbHVkZXModGVhY2hlci5nZXQoXCJjdXN0b21Hcm91cHNcIiksIG9sZEN1c3RvbUdyb3VwQ29kZSkpXG5cdFx0XHRcdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwiZWRpdG9yOmFkZC11c2VyXCIsIHRlYWNoZXIuY2lkKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fSxcblxuXHRjbG9zZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5nZXRSZWdpb24oXCJlZGl0b3JcIikucmVzZXQoKTtcblxuXHRcdHRoaXMuY3VzdG9tR3JvdXBTZWxlY3Rvci5kZXNlbGVjdCgpO1xuXG5cdFx0dGhpcy51aS5jdXN0b21Hcm91cFNlbGVjdG9yUmVnaW9uLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLmdsb2JhbEdyb3VwU2VsZWN0b3JSZWdpb24ucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0Ly90aGlzLnN0b3BMaXN0ZW5pbmcodGhpcy5oZWFkZXIpO1xuXHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLmdsb2JhbEdyb3VwU2VsZWN0b3IpO1xuXHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLmN1c3RvbUdyb3VwU2VsZWN0b3IpO1xuXG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKHRoaXMuZXZlbnRCdXMpO1xuXHR9LFxufSk7Il19",
    "\"use strict\";\n// ----------------------------------------------------------------------------\n// Dependencies\n// ----------------------------------------------------------------------------\n\nvar _regenerator = require(\"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\nvar Promise = require(\"bluebird\");\nvar raygun = require(\"raygun\");\nvar tippy = require(\"tippy.js\").default;\n\nvar App = require(\"../../index\");\nvar settings = require(\"app-settings\");\n\nvar radio = Backbone.Radio.channel(\"global\");\nvar Page = Backbone.Radio.channel(\"educator-marks\");\n\nvar ErrorView = require(\"../../lib/errorView\");\nvar EvaluationModal = require(\"./evaluationModal\");\nvar Grid = require(\"../../lib/grid\");\nvar Backgrid = require(\"backgrid\");\nvar SimpleMenu = require(\"../../lib/simpleMenu\");\nvar SmallModal = require(\"../../lib/smallModal\");\nvar ServerGrid = require(\"../../lib/serverGrid\");\nvar gradeMap = require(\"../../lib/gradeMap\");\n\n_.extend(Page, {\n\tCache: {},\n\tEvents: {}\n});\n\n// ----------------------------------------------------------------------------\n// Events\n// ----------------------------------------------------------------------------\nPage.Events = {\n\tAssessmentSelected: \"Page.Events.AssessmentSelected\",\n\tInstanceSelected: \"Page.Events.InstanceSelected\",\n\tSubmissionSelected: \"Page.Events.SubmissionSelected\",\n\n\tGetAssessments: \"Page.Events.GetAssessments\",\n\tGetInstances: \"Page.Events.GetInstances\",\n\tGetMarks: \"Page.Events.GetMarks\",\n\tGetAssessment: \"Page.Events.GetAssessment\"\n};\n\n// ----------------------------------------------------------------------------\n// Models\n// ----------------------------------------------------------------------------\nvar Assessment = Backbone.Epoxy.Model.extend({\n\tinitialize: function initialize(attributes, options) {\n\t\tthis.AssessmentResourceID = options.assessmentResourceID;\n\t},\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/resources/assessments/\" + this.AssessmentResourceID;\n\t}\n});\n\nvar Resource = require(\"../../content/models/manager/resourceModel\");\n\nvar AssessmentCollection = Backbone.PageableCollection.extend({\n\tmodel: Resource,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/assessments?paged=true\";\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nvar Instance = Backbone.Epoxy.Model.extend({\n\tcomputeds: {}\n});\n\nvar InstanceCollection = Backbone.PageableCollection.extend({\n\tmodel: Instance,\n\n\tinitialize: function initialize(models, options) {\n\t\tthis.AssessmentID = options.assessmentID;\n\t},\n\n\turl: function url() {\n\t\tvar assessmentID = this.AssessmentID ? this.AssessmentID : this.options.raw.AssessmentID;\n\t\treturn settings.urlRoot + \"/api/1.0/assessments/\" + assessmentID + \"?paged=true\";\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nvar Mark = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"_id\",\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/assessments/\" + this.get(\"assessment\") + \"/marks/\" + this.get(\"attachment\") + \"/\" + this.get(\"_id\");\n\t},\n\tcomputeds: {\n\t\townerFirstName: function ownerFirstName() {\n\t\t\treturn this.get(\"firstname\") === null ? \"[Not Found]\" : this.get(\"firstname\");\n\t\t},\n\n\t\townerSurname: function ownerSurname() {\n\t\t\treturn this.get(\"surname\") === null ? \"[Not Found]\" : this.get(\"surname\");\n\t\t},\n\n\t\tstatus: function status() {\n\t\t\tvar status = this.has(\"payload\") ? _.find(this.get(\"payload\").activity, function (activity) {\n\t\t\t\treturn activity.name === \"assessment-completed\";\n\t\t\t}) ? \"Completed\" : \"Abandoned\" : \"Not Attempted\";\n\t\t\treturn status;\n\t\t},\n\n\t\tuserGrade: function userGrade() {\n\t\t\treturn this.has(\"grade\") ? gradeMap.codeToHumanValue(this.get(\"grade\"), { lexical: true }) : \"\";\n\t\t},\n\n\t\tmarked: function marked() {\n\t\t\tvar marked = true;\n\n\t\t\tif (!this.has(\"payload\") || !this.get(\"payload\").results || !this.get(\"payload\").results.scores) marked = false;else if (_.find(this.get(\"payload\").results.scores, function (scoreData) {\n\t\t\t\treturn scoreData.score === undefined;\n\t\t\t})) marked = false;\n\n\t\t\treturn marked;\n\t\t},\n\n\t\ttotal: function total() {\n\t\t\tvar total = 0;\n\n\t\t\tif (this.has(\"payload\") && this.get(\"payload\").results && this.get(\"payload\").results.scores) _.each(this.get(\"payload\").results.scores, function (scoreData) {\n\t\t\t\ttotal += scoreData.score ? scoreData.score : 0;\n\t\t\t});\n\n\t\t\treturn total;\n\t\t}\n\t}\n});\n\nvar MarkCollection = Backbone.PageableCollection.extend({\n\tmodel: Mark,\n\n\tinitialize: function initialize(models, options) {\n\t\tthis.AssessmentID = options.assessmentID;\n\t\tthis.InstanceID = options.instanceID;\n\t\tthis.includeEducators = options.includeEducators;\n\t\tthis.includeLeavers = options.includeLeavers;\n\t},\n\n\turl: function url() {\n\t\tvar assessmentID = this.AssessmentID ? this.AssessmentID : this.options.raw.AssessmentID;\n\t\tvar instanceID = this.InstanceID ? this.InstanceID : this.options.raw.InstanceID;\n\t\tvar includeEducators = this.includeEducators ? \"&includeEducatorFilter=\" + this.includeEducators : \"\";\n\t\tvar includeLeavers = this.includeLeavers ? \"&includeLeaverFilter=\" + this.includeLeavers : \"\";\n\t\treturn settings.urlRoot + \"/api/1.0/assessments/\" + assessmentID + \"/marks/\" + instanceID + \"?paged=true\" + includeEducators + includeLeavers;\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nvar ActivityDuration = Backbone.Epoxy.Model.extend({\n\tcomputeds: {\n\t\tstart: function start() {\n\t\t\treturn moment(this.get(\"startTime\")).format(\"HH:mm:ss (D MMM YYYY)\");\n\t\t},\n\n\t\tend: function end() {\n\t\t\treturn moment(this.get(\"endTime\")).format(\"HH:mm:ss (D MMM YYYY)\");\n\t\t},\n\n\t\tduration: function duration() {\n\t\t\treturn moment.duration(moment(this.get(\"endTime\")).diff(moment(this.get(\"startTime\")))).asMilliseconds();\n\t\t}\n\t}\n});\n\nvar ActivityDurationCollection = Backbone.Collection.extend({\n\tmodel: ActivityDuration,\n\n\tcomparator: function comparator(model) {\n\t\treturn model.get(\"startTime\");\n\t}\n});\n\nvar SectionView = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\n\tgetTemplate: function getTemplate() {\n\t\tvar template = require(\"../templates/marks.nunj\").loading;\n\n\t\t//if (this.Ready)\n\t\ttemplate = this.Options.template;\n\n\t\treturn template;\n\t},\n\n\tinitialize: function initialize(options) {\n\t\t// Flags\n\t\t// Error: set this to a hash to display an error\n\t\t//        {\n\t\t//            message: (The error message),\n\t\t//            context: (The model/collection that caused the error),\n\t\t//            response: (The response from the server)\n\t\t//        }\n\t\t//\n\t\t// Ready: set this to true to signal that data was successfully fetched\n\t\t//        and can be displayed\n\n\t\t// Options\n\t\t// template: the custom template for the specific view\n\t\tthis.Options = options;\n\t}\n});\n\nvar GridMixin = {\n\tcollectionFetchError: function collectionFetchError(collection, response) {\n\t\tvar errorContainer = $(\".error-container\", this.$el);\n\t\tvar messageContainer = $(\".message-container\", this.$el);\n\n\t\tmessageContainer.addClass(\"hidden\");\n\t\terrorContainer.removeClass(\"hidden\");\n\t\terrorContainer.append(new ErrorView({ fetchError: response }).render().$el);\n\n\t\t//Raven.captureException(response);\n\t\tif (!settings.debug || settings.reportErrors) raygun(\"send\", response);\n\t}\n};\n\nvar AssessmentsView = SectionView.extend({\n\tclassName: \"assessments-view\",\n\n\tui: {\n\t\tcounterContainer: \".grid-header .counter-container\",\n\t\tgridNavigatorContainer: \".grid-paging\",\n\t\tcounterBar: \".ops-bar .counter\",\n\t\tpaging: \".paging\",\n\t\tfilterBar: \".ops-bar .filters\",\n\t\tgrid: \".grid\"\n\t},\n\n\tevents: {},\n\n\tcollectionEvents: {\n\t\t\"toolbar:click:downloadpdfreport\": \"reproduceAssessment\",\n\t\t\"toolbar:click:export\": \"exportAssessment\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\t_.extend(this, GridMixin);\n\n\t\tthis.Options = options ? options : {};\n\n\t\t_.extend(this.Options, {\n\t\t\t// Section View\n\t\t\ttemplate: require(\"../templates/marks.nunj\").assessments\n\t\t});\n\t},\n\n\treproduceAssessment: function reproduceAssessment(model) {\n\t\twindow.open(settings.urlRoot + \"/api/1.0/assessments/\" + model.get(\"_id\") + \"/report?memoOnly=true\");\n\t},\n\n\texportAssessment: function exportAssessment(model) {\n\t\twindow.open(settings.urlRoot + \"/api/1.0/assessments/\" + model.get(\"_id\") + \"/export\");\n\t},\n\n\tonRender: function onRender() {\n\t\tvar tooltips = [{ title: \"Download PDF Report\", icon: \"fa-file-pdf\" }, { title: \"Export\", icon: \"fa-cloud-download\" }];\n\n\t\tvar columns = [{ name: \"title\", label: \"Title\", cell: \"string\", editable: false, sortValue: ServerGrid.stringSort }, { name: \"subject\", label: \"Subject\", cell: \"string\", editable: false }, { name: \"contentGrade\", label: \"Year of Study\", cell: \"string\", editable: false }, { name: \"language\", label: \"Language\", cell: \"string\", editable: false }, { label: \"Actions\", cell: new ServerGrid.ToolbarCell({ tooltips: tooltips }), editable: false, sortable: false }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new AssessmentCollection(),\n\t\t\tclickable: true,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counterBar,\n\t\t\t\ttemplate: \"Assessments $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tthis.Collection = this.grid.collection;\n\n\t\tthis.bindEvents(this.Collection, this.collectionEvents);\n\n\t\tthis.listenTo(this.grid, \"row:clicked\", this.onGridRowClicked.bind(this));\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar languageFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"languageFilter\",\n\t\t\tlabel: \"Language\",\n\t\t\tcategories: [{ items: settings.languageList }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar subjectFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"subjectFilter\",\n\t\t\tlabel: \"Subject\",\n\t\t\tserver: {\n\t\t\t\tkey: \"subject_id\",\n\t\t\t\tvalue: \"subject\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/subjects\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\n\t\tvar gradeFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"gradeFilter\",\n\t\t\tlabel: \"Year of Study\",\n\t\t\tserver: true,\n\t\t\tcategories: _.map(settings.gradeList, function (val, key) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: key,\n\t\t\t\t\titems: _.reduce(val.sort(function (a, b) {\n\t\t\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t\t\t}), function (sum, num) {\n\t\t\t\t\t\tsum.push({ name: num.value, label: num.name });return sum;\n\t\t\t\t\t}, [])\n\t\t\t\t};\n\t\t\t})\n\t\t};\n\n\t\tvar cats = [{ name: \"assessment\", label: \"Assessment\" }, { name: \"audio\", label: \"Audio\" }, { name: \"flashcarddeck\", label: \"Flashcard Deck\" }, { name: \"image\", label: \"Image\" }, { name: \"pdf\", label: \"PDF\" }, { name: \"text\", label: \"Text\" }, { name: \"url\", label: \"URL\" }, { name: \"video\", label: \"Video\" }];\n\n\t\tif (settings.officeContent) {\n\t\t\tcats.push({ name: \"excel\", label: \"MS Excel\" }, { name: \"powerpoint\", label: \"MS PowerPoint\" }, { name: \"word\", label: \"MS Word\" });\n\t\t}\n\n\t\tthis.ui.filterBar.prepend(this.grid.filter({\n\t\t\tfilterContainer: this.ui.filterBar,\n\t\t\tfilters: [textFilter, languageFilter, subjectFilter, gradeFilter],\n\t\t\tdefaultFilters: [\"textFilter\"]\n\t\t}).render().el);\n\t},\n\n\tonGridRowClicked: function onGridRowClicked(model) {\n\t\tthis.trigger(Page.Events.AssessmentSelected, model.get(\"_id\"));\n\t}\n});\n\n// ----------------------------------------------------------------------------\n\nvar InstancesView = SectionView.extend({\n\tclassName: \"instances-view\",\n\n\tui: {\n\t\tcounterBar: \".ops-bar .counter\",\n\t\tpaging: \".paging\",\n\t\tfilterBar: \".ops-bar .filters\",\n\t\tgrid: \".grid\"\n\t},\n\n\tevents: {},\n\n\tinitialize: function initialize(options) {\n\t\t_.extend(this, GridMixin);\n\n\t\tthis.Options = options ? options : {};\n\n\t\t_.extend(this.Options, {\n\t\t\t// Section View\n\t\t\ttemplate: require(\"../templates/marks.nunj\").instances\n\t\t});\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"title\", label: \"Title\", cell: \"string\", editable: false }, { name: \"itemTitle\", label: \"Book / Group\", cell: \"string\", editable: false, sortable: false }, { name: \"created\", label: \"Created\", editable: false, cell: ServerGrid.MomentCell.extend({\n\t\t\t\tmodelInUnixTimestamp: true,\n\t\t\t\tdisplayFormat: \"DD MMM YYYY, HH:mm a\",\n\t\t\t\tdisplayInUTC: false\n\t\t\t}) }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new InstanceCollection([], { assessmentID: this.Options.assessmentID }),\n\t\t\tclickable: true,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counterBar,\n\t\t\t\ttemplate: \"Instances $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tthis.Collection = this.grid.collection;\n\t\tthis.bindEvents(this.Collection, this.collectionEvents);\n\n\t\tthis.listenTo(this.grid, \"row:clicked\", this.onGridRowClicked.bind(this));\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tthis.ui.filterBar.prepend(this.grid.filter({\n\t\t\tfilterContainer: this.ui.filterBar,\n\t\t\tfilters: [textFilter],\n\t\t\tdefaultFilters: [\"textFilter\"]\n\t\t}).render().el);\n\t},\n\n\tonGridRowClicked: function onGridRowClicked(instanceModel) {\n\t\tthis.trigger(Page.Events.InstanceSelected, this.Options.assessmentID, instanceModel.get(\"_id\"));\n\t}\n});\n\n// ----------------------------------------------------------------------------\n\nvar MarksView = SectionView.extend({\n\tclassName: \"marks-view\",\n\n\tui: {\n\t\tfilterBar: \".ops-bar .filters\",\n\t\tcounterBar: \".ops-bar .counter\",\n\t\ttestTotal: \".test-total\",\n\t\tdownloadButton: \".button-download\",\n\t\trefreshButton: \".button-refresh\",\n\t\tpaging: \".paging\",\n\t\tgrid: \".grid\",\n\t\tdownloadIndividual: \".download-individual\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.downloadButton\": \"onDownloadButtonClick\",\n\t\t\"click @ui.refreshButton\": \"onRefreshButtonClick\"\n\t},\n\n\tcollectionEvents: {\n\t\t\"buttoncell:clicked\": \"pdfReport\",\n\t\t\"cell:clicked\": \"onGridCellClicked\",\n\t\t\"row:clicked\": \"onNameClicked\",\n\t\t\"header:clicked\": \"onGridColumnClicked\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.Options = options ? options : {};\n\n\t\t_.extend(this.Options, {\n\t\t\t// Section View\n\t\t\ttemplate: require(\"../templates/marks.nunj\").marks\n\t\t});\n\t},\n\n\tassessmentFetchError: function assessmentFetchError(model, response) {\n\t\tvar errorContainer = $(\".error-container\", this.$el);\n\t\tvar messageContainer = $(\".message-container\", this.$el);\n\n\t\tmessageContainer.addClass(\"hidden\");\n\t\terrorContainer.removeClass(\"hidden\");\n\t\terrorContainer.append(new ErrorView({ fetchError: response }).render().$el);\n\n\t\tif (!settings.debug || settings.reportErrors) raygun(\"send\", response);\n\t\t//Raven.captureException(response);\n\t},\n\n\taddTooltip: function addTooltip(element) {\n\t\ttippy(element.get(0), {\n\t\t\ttheme: \"black\",\n\t\t\tplacement: \"bottom\",\n\t\t\tarrow: true\n\t\t});\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this = this;\n\n\t\tvar columns = [{\n\t\t\tname: \"attempt\",\n\t\t\tlabel: \"Attempt #\",\n\t\t\tcell: Backgrid.Cell.extend({\n\t\t\t\tclassName: \"clickable\",\n\t\t\t\tevents: {\n\t\t\t\t\tclick: \"onClick\"\n\t\t\t\t},\n\t\t\t\tonClick: function onClick() {\n\t\t\t\t\tthis.model.collection.trigger(\"row:clicked\", this.model);\n\t\t\t\t}\n\t\t\t}),\n\t\t\teditable: false,\n\t\t\tsortValue: ServerGrid.stringSort\n\t\t}, {\n\t\t\tname: \"ownerSurname\",\n\t\t\tlabel: \"Surname\",\n\t\t\tcell: Backgrid.Cell.extend({\n\t\t\t\tclassName: \"clickable\",\n\t\t\t\tevents: {\n\t\t\t\t\tclick: \"onClick\"\n\t\t\t\t},\n\t\t\t\tonClick: function onClick() {\n\t\t\t\t\tthis.model.collection.trigger(\"row:clicked\", this.model);\n\t\t\t\t}\n\t\t\t}),\n\t\t\teditable: false,\n\t\t\tsortValue: ServerGrid.stringSort\n\t\t}, {\n\t\t\tname: \"ownerFirstName\",\n\t\t\tlabel: \"First Name\",\n\t\t\tcell: Backgrid.Cell.extend({\n\t\t\t\tclassName: \"clickable\",\n\t\t\t\tevents: {\n\t\t\t\t\tclick: \"onClick\"\n\t\t\t\t},\n\t\t\t\tonClick: function onClick() {\n\t\t\t\t\tthis.model.collection.trigger(\"row:clicked\", this.model);\n\t\t\t\t}\n\t\t\t}),\n\t\t\teditable: false,\n\t\t\tsortValue: ServerGrid.stringSort\n\t\t}, { name: \"userGrade\", label: \"Grade\", cell: \"string\", editable: false, sortValue: ServerGrid.stringSort }, { name: \"status\", label: \"Status\", cell: \"string\", editable: false, sortable: false }, { name: \"marked\", label: \"Marked\", cell: ServerGrid.BooleanIconCell.extend({}), editable: false, sortable: false }, { name: \"total\", label: \"Total Mark\", cell: \"string\", editable: false }];\n\n\t\tPage.request(Page.Events.GetAssessment, this.Options.assessmentID).then(function (assessment) {\n\t\t\t_this.Assessment = assessment;\n\t\t\tvar questionData = _this.Assessment.get(\"questionData\");\n\t\t\tvar questionCounter = 1;\n\n\t\t\tvar getScore = function getScore(question, submissionModel) {\n\t\t\t\tvar score = 0;\n\n\t\t\t\tif (submissionModel.has(\"payload\") && submissionModel.get(\"payload\").results) {\n\t\t\t\t\tvar scoreData = submissionModel.get(\"payload\").results;\n\n\t\t\t\t\tif (\"scores\" in scoreData) {\n\t\t\t\t\t\tscoreData = scoreData.scores;\n\n\t\t\t\t\t\tvar scoreDatum = scoreData[question.id];\n\n\t\t\t\t\t\tif (!scoreDatum) score = \"NA\";else if (scoreDatum.score === undefined) score = \"-\";else score = scoreDatum.score;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tscore = \"-\";\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tscore = \"NA\";\n\t\t\t\t}\n\n\t\t\t\treturn score;\n\t\t\t};\n\n\t\t\t_.each(questionData, function (question) {\n\t\t\t\tvar headerCell = null;\n\t\t\t\tif (question.type === 2) {\n\t\t\t\t\theaderCell = Backgrid.HeaderCell.extend({\n\t\t\t\t\t\tclassName: \"clickable\",\n\t\t\t\t\t\tevents: {\n\t\t\t\t\t\t\tclick: \"onClick\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonClick: function onClick() {\n\t\t\t\t\t\t\tthis.collection.trigger(\"header:clicked\", this.column.get(\"name\"), this.collection);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcolumns.push({\n\t\t\t\t\tname: question.id,\n\t\t\t\t\tlabel: \"Q\" + questionCounter++ + (question.type === 2 ? \" (par.)\" : \"\") + (_this.Assessment.get(\"version\") >= 5 ? \"(\" + question.potentialScore + \")\" : \"\"),\n\t\t\t\t\tcell: Backgrid.Cell.extend({\n\t\t\t\t\t\tclassName: \"clickable\",\n\t\t\t\t\t\tevents: {\n\t\t\t\t\t\t\tclick: \"onClick\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonClick: function onClick() {\n\t\t\t\t\t\t\tthis.model.collection.trigger(\"cell:clicked\", this.column.get(\"name\"), this.model);\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t\theaderCell: headerCell,\n\t\t\t\t\teditable: false,\n\t\t\t\t\tsortable: false,\n\t\t\t\t\tformatter: {\n\t\t\t\t\t\tfromRaw: function fromRaw(value, model) {\n\t\t\t\t\t\t\treturn getScore(question, model);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tvar btnOptions = {\n\t\t\t\tclass: \"download-individual\",\n\t\t\t\tid: \"btnDownloadReport\",\n\t\t\t\ttext: \"<span class='fal fa-cloud-download' title='Download PDF Report' />\"\n\t\t\t};\n\n\t\t\tcolumns.push({ label: \"Download\", cell: new ServerGrid.ButtonCell(btnOptions), editable: false, sortable: false });\n\n\t\t\t// Update the test total\n\t\t\tif (_this.Assessment.has(\"maxScore\")) _this.ui.testTotal.text(\"Test total: \" + _this.Assessment.get(\"maxScore\"));else _this.ui.testTotal.text(\"\");\n\n\t\t\t_this.grid = new ServerGrid({\n\t\t\t\tel: _this.ui.grid,\n\t\t\t\tcolumns: columns,\n\t\t\t\tcollection: new MarkCollection([], { assessmentID: _this.Options.assessmentID, instanceID: _this.Options.instanceID }),\n\t\t\t\tclickable: true,\n\t\t\t\tcounter: {\n\t\t\t\t\telement: _this.ui.counterBar,\n\t\t\t\t\ttemplate: \"Marks $start - $end of $total\"\n\t\t\t\t},\n\t\t\t\tpaging: {\n\t\t\t\t\telement: _this.ui.paging\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t_this.Collection = _this.grid.collection;\n\n\t\t\t_this.bindEvents(_this.Collection, _this.collectionEvents);\n\n\t\t\tvar textFilter = {\n\t\t\t\ttype: \"text\",\n\t\t\t\tname: \"textFilter\",\n\t\t\t\tlabel: \"Text Search\",\n\t\t\t\tdebounce: 200,\n\t\t\t\tserver: true\n\t\t\t};\n\n\t\t\tvar firstAttemptFilter = {\n\t\t\t\ttype: \"toggle\",\n\t\t\t\tname: \"firstAttemptFilter\",\n\t\t\t\tlabel: \"Only show first attempt\",\n\t\t\t\tserver: true,\n\t\t\t\tinitialValue: function initialValue() {\n\t\t\t\t\treturn [true];\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvar includeEducatorFilter = {\n\t\t\t\ttype: \"toggle\",\n\t\t\t\tname: \"includeEducatorFilter\",\n\t\t\t\tlabel: \"Include educator marks\",\n\t\t\t\tserver: true,\n\t\t\t\tinitialValue: function initialValue() {\n\t\t\t\t\treturn [false];\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvar includeLeaverFilter = {\n\t\t\t\ttype: \"toggle\",\n\t\t\t\tname: \"includeLeaverFilter\",\n\t\t\t\tlabel: \"Include leaver marks\",\n\t\t\t\tserver: true,\n\t\t\t\tinitialValue: function initialValue() {\n\t\t\t\t\treturn [true];\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvar gradeFilter = {\n\t\t\t\ttype: \"itemized\",\n\t\t\t\tname: \"gradeFilter\",\n\t\t\t\tlabel: \"Year of Study\",\n\t\t\t\tcategories: _.map(settings.gradeList, function (val, key) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tlabel: key,\n\t\t\t\t\t\titems: _.reduce(val.sort(function (a, b) {\n\t\t\t\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t\t\t\t}), function (sum, num) {\n\t\t\t\t\t\t\tsum.push({ name: num.value, label: num.name });return sum;\n\t\t\t\t\t\t}, [])\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t\tserver: true\n\t\t\t};\n\n\t\t\t_this.ui.filterBar.prepend(_this.grid.filter({\n\t\t\t\tfilterContainer: _this.ui.filterBar,\n\t\t\t\tfilters: [textFilter, firstAttemptFilter, includeEducatorFilter, includeLeaverFilter, gradeFilter],\n\t\t\t\tdefaultFilters: [\"textFilter\", \"firstAttemptFilter\", \"includeEducatorFilter\"]\n\t\t\t}).render().el);\n\n\t\t\treturn;\n\t\t}).bind(this).catch(this.assessmentFetchError.bind(this));\n\t},\n\n\trefresh: function refresh(type) {\n\t\tif (type && type === \"local\") {\n\t\t\tthis.Collection.trigger(\"reset\", this.Collection, { silent: false });\n\t\t} else {\n\t\t\tthis.Ready = false;\n\t\t\tthis.render();\n\t\t}\n\t},\n\n\tonDownloadButtonClick: function onDownloadButtonClick(event) {\n\t\tvar _this2 = this;\n\n\t\tevent.stopPropagation();\n\n\t\tif (this.DownloadMenu) {\n\t\t\tthis.DownloadMenu.destroy();\n\t\t\tthis.DownloadMenu = null;\n\t\t} else {\n\t\t\tthis.DownloadMenu = new SimpleMenu({\n\t\t\t\tanchor: this.ui.downloadButton,\n\t\t\t\tside: \"left\",\n\t\t\t\tstructure: [{\n\t\t\t\t\tcloseOnClick: true,\n\t\t\t\t\telements: [{ text: \"Marks in a CSV file (for assessment results)\", id: \"csvMarks\" }, { text: \"Answers in a CSV file (for questionnaires)\", id: \"csvAnswers\" }, { text: \"Marks, questions, and statistics in a PDF file (for reports)\", id: \"pdf\" }] }] });\n\n\t\t\tthis.DownloadMenu.show();\n\n\t\t\tthis.listenTo(this.DownloadMenu, \"clicked:csvMarks\", function () {\n\t\t\t\twindow.open(settings.urlRoot + \"/api/1.0/assessments/\" + _this2.Options.assessmentID + \"/marks/\" + _this2.Options.instanceID + \"/raw?includeEducators=\" + _this2.grid.filter.serverParams.includeEducatorFilter[0]);\n\t\t\t});\n\n\t\t\tthis.listenTo(this.DownloadMenu, \"clicked:csvAnswers\", function () {\n\t\t\t\twindow.open(settings.urlRoot + \"/api/1.0/assessments/\" + _this2.Options.assessmentID + \"/answers/\" + _this2.Options.instanceID + \"/raw?includeEducators=\" + _this2.grid.filter.serverParams.includeEducatorFilter[0]);\n\t\t\t});\n\n\t\t\tthis.listenTo(this.DownloadMenu, \"clicked:pdf\", function () {\n\t\t\t\twindow.open(settings.urlRoot + \"/api/1.0/assessments/\" + _this2.Options.assessmentID + \"/marks/\" + _this2.Options.instanceID + \"/report?allMarks=true&includeEducators=\" + _this2.grid.filter.serverParams.includeEducatorFilter[0]);\n\t\t\t});\n\n\t\t\tthis.listenTo(this.DownloadMenu, \"closing\", function () {\n\t\t\t\t_this2.DownloadMenu = null;\n\t\t\t});\n\t\t}\n\t},\n\n\tonRefreshButtonClick: function onRefreshButtonClick() {\n\t\tthis.refresh();\n\t},\n\n\tonNameClicked: function onNameClicked(submissionModel) {\n\t\tthis.trigger(Page.Events.SubmissionSelected, this.Options.assessmentID, this.Options.instanceID, submissionModel.get(\"_id\"));\n\t},\n\n\tonGridColumnClicked: function onGridColumnClicked(name, collection) {\n\t\tvar _this3 = this;\n\n\t\t// Retrieve all questions from the encrypted assessment\n\t\tvar questionData = this.Assessment.get(\"questionData\");\n\n\t\t// Find the question referenced by this column\n\t\tvar question = _.find(questionData, function (q) {\n\t\t\treturn q.id === name;\n\t\t});\n\n\t\t// If this is a paragraph question and there are submissions...\n\t\tif (question.type === 2 && collection.length > 0) {\n\t\t\t// ...then display the evaluation modal\n\t\t\tvar modal = new EvaluationModal({\n\t\t\t\tquestion: question,\n\t\t\t\tanswers: collection,\n\t\t\t\tgrid: this.grid\n\t\t\t});\n\n\t\t\tmodal.show({\n\t\t\t\tclose: function close(result) {\n\t\t\t\t\t_this3.ui.paging.append(_this3.grid.paginator.render().el);\n\t\t\t\t\tif (result.dataChanged) _this3.refresh(\"local\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n\n\tonGridCellClicked: function onGridCellClicked(column, model) {\n\t\t// Retrieve all questions from the encrypted assessment\n\t\tvar questionData = this.Assessment.get(\"questionData\");\n\n\t\t// Find the question referenced by this column\n\t\tvar question = _.find(questionData, function (q) {\n\t\t\treturn q.id === column;\n\t\t});\n\n\t\t// Compile all possible answers for this question\n\t\tvar answers = null;\n\n\t\tswitch (question.type) {\n\t\t\tcase 1:\n\t\t\t\tanswers = _.flatten([question.correctAnswers, question.otherAnswers]);\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tanswers = {\n\t\t\t\t\tleft: question.left,\n\t\t\t\t\tright: question.right\n\t\t\t\t};\n\t\t\t\tbreak;\n\n\t\t\tcase 4:\n\t\t\t\tanswers = [question.answer];\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// Write out the question text\n\t\tvar text = \"<strong>Text: </strong>\" + question.question + \"<br/><br/>\";\n\n\t\t// Write out the correct answers\n\t\ttext += \"<strong>Correct Answer(s): </strong>\";\n\n\t\tvar typesetContent = function typesetContent(content) {\n\t\t\tvar result = null;\n\n\t\t\tif (_.startsWith(content, \"data:image\")) result = \"<img width='64' height='64' src='\" + content + \"' style='display: inline' />&nbsp;\";else result = content.replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t});\n\n\t\t\treturn result;\n\t\t};\n\n\t\tswitch (question.type) {\n\t\t\tcase 1:\n\t\t\t\t_.each(question.correctAnswers, function (answer) {\n\t\t\t\t\ttext += typesetContent(answer.content) + \" \";\n\t\t\t\t});\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\ttext += \"No answers available for this question type.\";\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\t_.each(answers.left, function (left) {\n\t\t\t\t\ttext += typesetContent(left.content) + \" [+] \" + typesetContent(_.find(answers.right, function (right) {\n\t\t\t\t\t\treturn right.id === left.id;\n\t\t\t\t\t}).content) + \"; \";\n\t\t\t\t});\n\t\t\t\tbreak;\n\n\t\t\tcase 4:\n\t\t\t\ttext += typesetContent(question.answer.content);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\ttext += \"<br/><br/>\";\n\n\t\t// Write out the student's answers\n\t\ttext += \"<strong>Student Answer(s): </strong>\";\n\n\t\tif (!model.get(\"payload\") || !model.get(\"payload\").results || !model.get(\"payload\").results.scores || !model.get(\"payload\").results.scores[column]) {\n\t\t\ttext += \"[Not attempted]\";\n\t\t} else {\n\t\t\tvar studentAnswers = model.get(\"payload\").results.scores[column].answers;\n\n\t\t\tswitch (question.type) {\n\t\t\t\tcase 1:\n\t\t\t\t\t_.each(studentAnswers, function (studentAnswer) {\n\t\t\t\t\t\ttext += typesetContent(_.find(answers, function (answer) {\n\t\t\t\t\t\t\treturn answer.id === studentAnswer;\n\t\t\t\t\t\t}).content) + \" \";\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2:\n\t\t\t\t\ttext += \"No answers available for this question type.\";\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3:\n\t\t\t\t\t_.each(studentAnswers, function (studentAnswer) {\n\t\t\t\t\t\ttext += typesetContent(_.find(answers.left, function (left) {\n\t\t\t\t\t\t\treturn left.id === studentAnswer.left;\n\t\t\t\t\t\t}).content);\n\t\t\t\t\t\ttext += \" [+] \";\n\t\t\t\t\t\ttext += typesetContent(_.find(answers.right, function (right) {\n\t\t\t\t\t\t\treturn right.id === studentAnswer.right;\n\t\t\t\t\t\t}).content);\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 4:\n\t\t\t\t\t_.each(studentAnswers, function (studentAnswer) {\n\t\t\t\t\t\ttext += \"[\" + typesetContent(studentAnswer) + \"] \";\n\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tvar modal = new SmallModal({\n\t\t\ttitle: \"Question \" + column,\n\t\t\tbody: text,\n\t\t\thost: \"body\",\n\t\t\thideButtons: [\"cancel\"]\n\t\t});\n\n\t\tmodal.show();\n\t},\n\n\tpdfReport: function pdfReport(column, model) {\n\t\tif (model.get(\"attempt\") === 0) {\n\t\t\tvar modal = new SmallModal({\n\t\t\t\ttitle: \"PDF Report\",\n\t\t\t\twarning: true,\n\t\t\t\tbody: \"There is no report available for this user because the user has not attempted the assessment at least once.\",\n\t\t\t\thost: \"body\",\n\t\t\t\thideButtons: [\"cancel\"]\n\t\t\t});\n\n\t\t\tmodal.show();\n\t\t} else {\n\t\t\twindow.open(settings.urlRoot + \"/api/1.0/assessments/\" + model.get(\"assessment\") + \"/marks/\" + model.get(\"attachment\") + \"/report?studentAnswers=true&assessmark=\" + model.get(\"_id\"));\n\t\t}\n\t}\n});\n\nvar ActivityDetailsView = Backbone.Marionette.View.extend({\n\ttag: \"div\",\n\tclassName: \"activity-details\",\n\n\ttemplate: require(\"../templates/marks.nunj\").activityDetails,\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this4 = this;\n\n\t\treturn {\n\t\t\tstart: function start() {\n\t\t\t\treturn _this4.model.get(\"start\");\n\t\t\t},\n\t\t\tend: function end() {\n\t\t\t\treturn _this4.model.get(\"end\");\n\t\t\t}\n\t\t};\n\t}\n});\n\n// ----------------------------------------------------------------------------\n\nvar ActivityView = Backbone.Marionette.View.extend({\n\ttag: \"div\",\n\tclassName: \"activity\",\n\n\ttemplate: require(\"../templates/marks.nunj\").activity,\n\n\tevents: {\n\t\tmouseover: \"onHighlight\",\n\t\tmouseout: \"onLowlight\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.TotalDuration = options.totalDuration;\n\n\t\tthis.listenTo(this.model, \"activity-duration:highlight\", this.onHighlight.bind(this));\n\t\tthis.listenTo(this.model, \"activity-duration:lowlight\", this.onLowlight.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.$el.css({\n\t\t\twidth: Math.round(this.model.get(\"duration\") / this.TotalDuration * 100) + \"%\"\n\t\t});\n\n\t\tthis.DetailTooltip = new ActivityDetailsView({ model: this.model });\n\t\tthis.DetailTooltip.render();\n\n\t\ttippy(this.$el.get(0), {\n\t\t\ttheme: \"black\",\n\t\t\tplacement: \"top\",\n\t\t\tarrow: true,\n\t\t\tcontent: this.DetailTooltip.$el.get(0)\n\t\t});\n\t},\n\n\tonHighlight: function onHighlight() {\n\t\tif (!this.Highlighted) {\n\t\t\tthis.$el.addClass(\"activity-highlighted\");\n\t\t\tvar tip = this.$el.get(0)._tippy;\n\t\t\ttip.show();\n\n\t\t\tthis.Highlighted = true;\n\t\t}\n\t},\n\n\tonLowlight: function onLowlight() {\n\t\tif (this.Highlighted) {\n\t\t\tthis.$el.removeClass(\"activity-highlighted\");\n\t\t\tvar tip = this.$el.get(0)._tippy;\n\t\t\ttip.hide();\n\n\t\t\tthis.Highlighted = false;\n\t\t}\n\t}\n});\n\n// ----------------------------------------------------------------------------\n\nvar ActivityTimelineBodyView = Backbone.Marionette.CollectionView.extend({\n\ttag: \"div\",\n\tclassName: \"activity-timeline-body\",\n\n\ttemplate: false,\n\n\tchildView: ActivityView,\n\n\tchildViewOptions: function childViewOptions() {\n\t\treturn {\n\t\t\ttotalDuration: this.TotalDuration\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.TotalDuration = options.totalDuration;\n\t}\n});\n\n// ----------------------------------------------------------------------------\n\nvar ActivityTimelineView = Backbone.Marionette.View.extend({\n\ttag: \"div\",\n\tclassName: \"activity-timeline\",\n\n\ttemplate: require(\"../templates/marks.nunj\").activityTimeline,\n\n\tui: {\n\t\tvalueCompletionTime: \".completion-time\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.Collection = options.collection;\n\n\t\tthis.computeTotalDuration();\n\t},\n\n\tcomputeTotalDuration: function computeTotalDuration() {\n\t\tthis.TotalDuration = this.Collection.length > 0 ? this.Collection.reduce(function (memo, activityDuration) {\n\t\t\treturn memo + activityDuration.get(\"duration\");\n\t\t}, 0) : 0;\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.TimelineBody = new ActivityTimelineBodyView({ collection: this.Collection, totalDuration: this.TotalDuration });\n\t\tthis.$el.prepend(this.TimelineBody.render().$el);\n\n\t\tvar completionTime = Math.round(moment.duration(this.TotalDuration).asMinutes());\n\t\tvar completionTimeUnit = \"minute\";\n\n\t\tif (completionTime < 1.0) {\n\t\t\tcompletionTime = Math.round(moment.duration(this.TotalDuration).asSeconds());\n\t\t\tcompletionTimeUnit = \"second\";\n\t\t}\n\n\t\tif (completionTime !== 1) completionTimeUnit += \"s\";\n\n\t\tthis.ui.valueCompletionTime.text(completionTime + \" \" + completionTimeUnit);\n\t}\n});\n\n// ----------------------------------------------------------------------------\n\nvar DetailsView = SectionView.extend({\n\tclassName: \"details-view\",\n\n\tui: {\n\t\tactivityTimelineContainer: \".activity-timeline-container\",\n\t\tgrid: \"div.grid\"\n\t},\n\n\tevents: {\n\t\t\"cell:mouseover\": \"onGridCellMouseOver\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.Options = options ? options : {};\n\n\t\t_.extend(this.Options, {\n\t\t\t// Section View\n\t\t\ttemplate: require(\"../templates/marks.nunj\").details\n\t\t});\n\t},\n\n\tfetchError: function fetchError(model, response) {\n\t\tvar errorContainer = $(\".error-container\", this.$el);\n\t\tvar messageContainer = $(\".message-container\", this.$el);\n\n\t\tmessageContainer.addClass(\"hidden\");\n\t\terrorContainer.removeClass(\"hidden\");\n\t\terrorContainer.append(new ErrorView({ fetchError: response }).render().$el);\n\n\t\tif (!settings.debug || settings.reportErrors) raygun(\"send\", response);\n\t\t//Raven.captureException(response);\n\t},\n\n\tonRender: function () {\n\t\tvar _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee() {\n\t\t\tvar _this5 = this;\n\n\t\t\tvar columns, questionData, questionCounter, questionStart, includeEducators, includeLeavers, collection;\n\t\t\treturn _regenerator2.default.wrap(function _callee$(_context) {\n\t\t\t\twhile (1) {\n\t\t\t\t\tswitch (_context.prev = _context.next) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tif (!this.Ready) {\n\t\t\t\t\t\t\t\t_context.next = 14;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcolumns = [{ name: \"surname\", label: \"Surname\", editable: false, cell: \"string\" }, { name: \"firstname\", label: \"First Name\", cell: \"string\", editable: false }];\n\t\t\t\t\t\t\tquestionData = this.Assessment.get(\"questionData\");\n\t\t\t\t\t\t\tquestionCounter = 1;\n\n\n\t\t\t\t\t\t\t_.each(questionData, function (question) {\n\t\t\t\t\t\t\t\tvar label = \"Q\" + questionCounter++ + (question.type === 2 ? \" (par.)\" : \"\");\n\t\t\t\t\t\t\t\tcolumns.push({\n\t\t\t\t\t\t\t\t\tname: question.id,\n\t\t\t\t\t\t\t\t\tlabel: label,\n\t\t\t\t\t\t\t\t\teditable: false,\n\t\t\t\t\t\t\t\t\tformatter: {\n\t\t\t\t\t\t\t\t\t\tfromRaw: function fromRaw(value, model) {\n\t\t\t\t\t\t\t\t\t\t\tvar score = 0;\n\n\t\t\t\t\t\t\t\t\t\t\tif (model.get(\"payload\").results) {\n\t\t\t\t\t\t\t\t\t\t\t\tvar scoreData = model.get(\"payload\").results;\n\n\t\t\t\t\t\t\t\t\t\t\t\tif (\"scores\" in scoreData) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tscoreData = scoreData.scores;\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tvar scoreDatum = scoreData[question.id];\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (!scoreDatum) score = \"NA\";else if (_.isUndefined(scoreDatum.score)) score = \"-\";else score = scoreDatum.score;\n\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\tscore = \"-\";\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\tscore = \"NA\";\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\treturn score;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tcell: Backgrid.Cell.extend({\n\t\t\t\t\t\t\t\t\t\tclassName: \"hoverable\",\n\t\t\t\t\t\t\t\t\t\tevents: {\n\t\t\t\t\t\t\t\t\t\t\tmouseover: \"onMouseOver\",\n\t\t\t\t\t\t\t\t\t\t\tmouseout: \"onMouseOut\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tonMouseOver: _this5.onGridCellMouseOver.bind(_this5, question.id),\n\t\t\t\t\t\t\t\t\t\tonMouseOut: _this5.onGridCellMouseOut.bind(_this5, question.id)\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tthis.Collection = new Backbone.Collection([this.Submission]);\n\n\t\t\t\t\t\t\tthis.MarksGrid = new Grid({\n\t\t\t\t\t\t\t\tel: this.ui.grid,\n\t\t\t\t\t\t\t\tcolumns: columns,\n\t\t\t\t\t\t\t\tcollection: this.Collection,\n\t\t\t\t\t\t\t\tclickable: false,\n\t\t\t\t\t\t\t\tnoLoad: true\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tthis.ActivityDurationCollection = new ActivityDurationCollection();\n\n\t\t\t\t\t\t\tquestionStart = null;\n\n\n\t\t\t\t\t\t\t_.each(this.Submission.get(\"payload\").activity, function (activity) {\n\t\t\t\t\t\t\t\tif (activity.name === \"assessment-completed\" || activity.name === \"assessment-incomplete\" || activity.name === \"app-force-closed\" || activity.name === \"app-crashed\" || activity.name === \"question-start\") {\n\t\t\t\t\t\t\t\t\t// Save the previous question\n\t\t\t\t\t\t\t\t\tif (questionStart) {\n\t\t\t\t\t\t\t\t\t\t_this5.ActivityDurationCollection.add({\n\t\t\t\t\t\t\t\t\t\t\tquestion: questionStart.data.question,\n\t\t\t\t\t\t\t\t\t\t\tstartTime: questionStart.time,\n\t\t\t\t\t\t\t\t\t\t\tendTime: activity.time || activity.unixTimestamp\n\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\tquestionStart = null;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (activity.name === \"question-start\") questionStart = activity;\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tthis.ActivityTimeline = new ActivityTimelineView({ collection: this.ActivityDurationCollection });\n\t\t\t\t\t\t\tthis.ui.activityTimelineContainer.prepend(this.ActivityTimeline.render().$el);\n\t\t\t\t\t\t\t_context.next = 25;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 14:\n\t\t\t\t\t\t\t_context.next = 16;\n\t\t\t\t\t\t\treturn Page.request(Page.Events.GetAssessment, this.Options.assessmentID);\n\n\t\t\t\t\t\tcase 16:\n\t\t\t\t\t\t\tthis.Assessment = _context.sent;\n\t\t\t\t\t\t\tincludeEducators = true;\n\t\t\t\t\t\t\tincludeLeavers = true;\n\t\t\t\t\t\t\t_context.next = 21;\n\t\t\t\t\t\t\treturn Page.request(Page.Events.GetMarks, this.Options.assessmentID, this.Options.instanceID, includeEducators, includeLeavers);\n\n\t\t\t\t\t\tcase 21:\n\t\t\t\t\t\t\tcollection = _context.sent;\n\n\t\t\t\t\t\t\tthis.Submission = collection.get(this.Options.submissionID);\n\n\t\t\t\t\t\t\tthis.Ready = true;\n\t\t\t\t\t\t\tthis.render();\n\n\t\t\t\t\t\tcase 25:\n\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\treturn _context.stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, _callee, this);\n\t\t}));\n\n\t\tfunction onRender() {\n\t\t\treturn _ref.apply(this, arguments);\n\t\t}\n\n\t\treturn onRender;\n\t}(),\n\n\tonGridCellMouseOver: function onGridCellMouseOver(column) {\n\t\tthis.ActivityDurationCollection.each(function (activityDuration) {\n\t\t\tif (activityDuration.get(\"question\") === column) activityDuration.trigger(\"activity-duration:highlight\");else activityDuration.trigger(\"activity-duration:lowlight\");\n\t\t});\n\t},\n\n\tonGridCellMouseOut: function onGridCellMouseOut(column) {\n\t\tthis.ActivityDurationCollection.each(function (activityDuration) {\n\t\t\tif (activityDuration.get(\"question\") === column) activityDuration.trigger(\"activity-duration:lowlight\");\n\t\t});\n\t}\n});\n\n// ----------------------------------------------------------------------------\n\n\n// ----------------------------------------------------------------------------\n\n\n// ----------------------------------------------------------------------------\n// Views\n// ----------------------------------------------------------------------------\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"assessment-layout-view\",\n\n\ttemplate: require(\"../templates/marks.nunj\").layout,\n\n\tregions: {\n\t\tassessments: \"#assessments-region\",\n\t\tinstances: \"#instances-region\",\n\t\tmarks: \"#marks-region\",\n\t\tdetails: \"#details-region\"\n\t},\n\n\tui: {\n\t\tsection: \".page-accordion > li\",\n\t\tassessmentsSection: \".assessments-section\",\n\t\tinstancesSection: \".instances-section\",\n\t\tmarksSection: \".marks-section\",\n\t\tdetailsSection: \".details-section\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.section\": \"onSectionClick\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.Identifiers = {\n\t\t\tassessmentID: null,\n\t\t\tinstanceID: null,\n\t\t\tsubmissionID: null\n\t\t};\n\n\t\tPage.reply(Page.Events.GetAssessments, this.fetchAssessments.bind(this));\n\t\tPage.reply(Page.Events.GetInstances, this.fetchInstances.bind(this));\n\t\tPage.reply(Page.Events.GetMarks, this.fetchMarks.bind(this));\n\t\tPage.reply(Page.Events.GetAssessment, this.fetchAssessment.bind(this));\n\t},\n\n\tfetchAssessments: function fetchAssessments() {\n\t\treturn Promise.resolve(new AssessmentCollection().lazyFetch());\n\t},\n\n\tfetchInstances: function fetchInstances(assessmentID) {\n\t\treturn Promise.resolve(new InstanceCollection(null, { assessmentID: assessmentID }).lazyFetch());\n\t},\n\n\tfetchMarks: function fetchMarks(assessmentID, instanceID, includeEducators, includeLeavers) {\n\t\treturn Promise.resolve(new MarkCollection(null, { assessmentID: assessmentID, instanceID: instanceID, includeEducators: includeEducators, includeLeavers: includeLeavers }).lazyFetch());\n\t},\n\n\tfetchAssessment: function fetchAssessment(assessmentID) {\n\t\treturn Promise.resolve(new Assessment(null, { assessmentResourceID: assessmentID }).lazyFetch());\n\t},\n\n\tonRender: function onRender() {\n\t\t// Initialize the sections\n\t\tthis.ActiveSection = this.ui.section.first();\n\t\tthis.ActiveSection.addClass(\"active\");\n\n\t\tthis.disableSection(this.ui.instancesSection);\n\t\tthis.disableSection(this.ui.marksSection);\n\t\tthis.disableSection(this.ui.detailsSection);\n\n\t\t// Show the first section\n\t\tthis.createAssessmentsSection();\n\t},\n\n\tcreateAssessmentsSection: function createAssessmentsSection() {\n\t\t// Create and enable the assessments section\n\t\tif (!this.getRegion(\"assessments\").hasView()) {\n\t\t\tthis.showChildView(\"assessments\", new AssessmentsView());\n\t\t\tthis.listenTo(this.getRegion(\"assessments\").currentView, Page.Events.AssessmentSelected, this.onAssessmentSelected.bind(this));\n\t\t}\n\t},\n\n\tcreateInstancesSection: function createInstancesSection(assessmentID, model) {\n\t\tif (this.getRegion(\"instances\").hasView()) {\n\t\t\tthis.stopListening(this.getRegion(\"instances\").currentView);\n\t\t\tthis.getRegion(\"instances\").reset();\n\t\t}\n\n\t\tthis.showChildView(\"instances\", new InstancesView({ assessmentID: assessmentID, model: model }));\n\t\tthis.listenTo(this.getRegion(\"instances\").currentView, Page.Events.InstanceSelected, this.onInstanceSelected.bind(this));\n\t},\n\n\tcreateMarksSection: function createMarksSection(assessmentID, instanceID) {\n\t\tif (this.getRegion(\"marks\").hasView()) {\n\t\t\tthis.stopListening(this.getRegion(\"marks\").currentView);\n\t\t\tthis.getRegion(\"marks\").reset();\n\t\t}\n\n\t\tthis.showChildView(\"marks\", new MarksView({ assessmentID: assessmentID, instanceID: instanceID }));\n\t\tthis.listenTo(this.getRegion(\"marks\").currentView, Page.Events.SubmissionSelected, this.onSubmissionSelected.bind(this));\n\t},\n\n\tcreateDetailsSection: function createDetailsSection(assessmentID, instanceID, submissionID) {\n\t\tif (this.getRegion(\"details\").hasView()) this.getRegion(\"details\").reset();\n\n\t\tthis.showChildView(\"details\", new DetailsView({ assessmentID: assessmentID, instanceID: instanceID, submissionID: submissionID }));\n\t},\n\n\tnavigateToSection: function navigateToSection(identifiers) {\n\t\tthis.createAssessmentsSection();\n\n\t\tvar section = identifiers.submissionID ? \"details\" : identifiers.instanceID ? \"marks\" : identifiers.assessmentID ? \"instances\" : \"assessments\";\n\n\t\tswitch (section) {\n\t\t\tcase \"details\":\n\t\t\t\tthis.createDetailsSection(identifiers.assessmentID, identifiers.instanceID, identifiers.submissionID);\n\t\t\t\tthis.enableSection(this.ui.detailsSection);\n\t\t\t// no break\n\n\t\t\t// eslint-disable-next-line no-fallthrough\n\t\t\tcase \"marks\":\n\t\t\t\tthis.createMarksSection(identifiers.assessmentID, identifiers.instanceID);\n\t\t\t\tthis.enableSection(this.ui.marksSection);\n\t\t\t// no break\n\n\t\t\t// eslint-disable-next-line no-fallthrough\n\t\t\tcase \"instances\":\n\t\t\t\tthis.createInstancesSection(identifiers.assessmentID, identifiers.model);\n\t\t\t\tthis.enableSection(this.ui.instancesSection);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\tswitch (section) {\n\t\t\tcase \"details\":\n\t\t\t\tthis.activateSection(this.ui.detailsSection);\n\t\t\t\tbreak;\n\n\t\t\tcase \"marks\":\n\t\t\t\tthis.activateSection(this.ui.marksSection);\n\t\t\t\tbreak;\n\n\t\t\tcase \"instances\":\n\t\t\t\tthis.activateSection(this.ui.instancesSection);\n\t\t\t\tbreak;\n\n\t\t\tcase \"assessments\":\n\t\t\t\tthis.activateSection(this.ui.assessmentsSection);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (identifiers.submissionID && identifiers.submissionID !== this.Identifiers.submissionID) {\n\t\t\tthis.Identifiers.submissionID = identifiers.submissionID;\n\t\t\tthis.Identifiers.instanceID = identifiers.instanceID;\n\t\t\tthis.Identifiers.assessmentID = identifiers.assessmentID;\n\t\t} else if (identifiers.instanceID && identifiers.instanceID !== this.Identifiers.instanceID) {\n\t\t\tthis.Identifiers.instanceID = identifiers.instanceID;\n\t\t\tthis.Identifiers.assessmentID = identifiers.assessmentID;\n\t\t\tthis.disableSection(this.ui.detailsSection);\n\t\t} else if (identifiers.assessmentID && identifiers.assessmentID !== this.Identifiers.assessmentID) {\n\t\t\tthis.Identifiers.assessmentID = identifiers.assessmentID;\n\t\t\tthis.disableSection(this.ui.marksSection);\n\t\t\tthis.disableSection(this.ui.detailsSection);\n\t\t}\n\t},\n\n\tonSectionClick: function onSectionClick(event) {\n\t\tvar target = $(event.currentTarget);\n\n\t\tif (target.is(this.ui.assessmentsSection)) radio.trigger(App.Events.Commands.Navigate, settings.urlRoot + \"/console/marks\");else if (target.is(this.ui.instancesSection)) this.onAssessmentSelected(this.Identifiers.assessmentID);else if (target.is(this.ui.marksSection)) this.onInstanceSelected(this.Identifiers.assessmentID, this.Identifiers.instanceID);else if (target.is(this.ui.detailsSection)) this.onSubmissionSelected(this.Identifiers.assessmentID, this.Identifiers.instanceID, this.Identifiers.submissionID);\n\t},\n\n\tdisableSection: function disableSection(section) {\n\t\tsection.prop(\"disabled\", true);\n\n\t\t$(\".tab\", section).addClass(\"disabled\");\n\t\t$(\".tab-label\", section).addClass(\"disabled\");\n\t},\n\n\tenableSection: function enableSection(section) {\n\t\tsection.prop(\"disabled\", false);\n\n\t\t$(\".tab\", section).removeClass(\"disabled\");\n\t\t$(\".tab-label\", section).removeClass(\"disabled\");\n\t},\n\n\tactivateSection: function activateSection(section) {\n\t\tif (!section.prop(\"disabled\")) {\n\t\t\tthis.ActiveSection.removeClass(\"active\");\n\n\t\t\tsection.addClass(\"active\");\n\n\t\t\tthis.ActiveSection = section;\n\t\t}\n\t},\n\n\tonAssessmentSelected: function onAssessmentSelected(assessmentID) {\n\t\tradio.trigger(App.Events.Commands.Navigate, settings.urlRoot + \"/console/marks/\" + assessmentID);\n\t},\n\n\tonInstanceSelected: function onInstanceSelected(assessmentID, instanceID) {\n\t\tradio.trigger(App.Events.Commands.Navigate, settings.urlRoot + \"/console/marks/\" + assessmentID + \"/\" + instanceID);\n\t},\n\n\tonSubmissionSelected: function onSubmissionSelected(assessmentID, instanceID, submissionID) {\n\t\tradio.trigger(App.Events.Commands.Navigate, settings.urlRoot + \"/console/marks/\" + assessmentID + \"/\" + instanceID + \"/\" + submissionID);\n\t}\n});\n\n// ----------------------------------------------------------------------------\n\n\n// ----------------------------------------------------------------------------\n\n\n// ----------------------------------------------------------------------------\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1hcmtzLmpzIl0sIm5hbWVzIjpbIiQiLCJyZXF1aXJlIiwiXyIsIkJhY2tib25lIiwibW9tZW50IiwiUHJvbWlzZSIsInJheWd1biIsInRpcHB5IiwiZGVmYXVsdCIsIkFwcCIsInNldHRpbmdzIiwicmFkaW8iLCJSYWRpbyIsImNoYW5uZWwiLCJQYWdlIiwiRXJyb3JWaWV3IiwiRXZhbHVhdGlvbk1vZGFsIiwiR3JpZCIsIkJhY2tncmlkIiwiU2ltcGxlTWVudSIsIlNtYWxsTW9kYWwiLCJTZXJ2ZXJHcmlkIiwiZ3JhZGVNYXAiLCJleHRlbmQiLCJDYWNoZSIsIkV2ZW50cyIsIkFzc2Vzc21lbnRTZWxlY3RlZCIsIkluc3RhbmNlU2VsZWN0ZWQiLCJTdWJtaXNzaW9uU2VsZWN0ZWQiLCJHZXRBc3Nlc3NtZW50cyIsIkdldEluc3RhbmNlcyIsIkdldE1hcmtzIiwiR2V0QXNzZXNzbWVudCIsIkFzc2Vzc21lbnQiLCJFcG94eSIsIk1vZGVsIiwiaW5pdGlhbGl6ZSIsImF0dHJpYnV0ZXMiLCJvcHRpb25zIiwiQXNzZXNzbWVudFJlc291cmNlSUQiLCJhc3Nlc3NtZW50UmVzb3VyY2VJRCIsInVybFJvb3QiLCJSZXNvdXJjZSIsIkFzc2Vzc21lbnRDb2xsZWN0aW9uIiwiUGFnZWFibGVDb2xsZWN0aW9uIiwibW9kZWwiLCJ1cmwiLCJzdGF0ZSIsInBhZ2VTaXplIiwibW9kZSIsInF1ZXJ5UGFyYW1zIiwic29ydEtleSIsInBhcnNlU3RhdGUiLCJyZXNwIiwidG90YWxSZWNvcmRzIiwidG90YWwiLCJwYXJzZVJlY29yZHMiLCJyb3dzIiwiSW5zdGFuY2UiLCJjb21wdXRlZHMiLCJJbnN0YW5jZUNvbGxlY3Rpb24iLCJtb2RlbHMiLCJBc3Nlc3NtZW50SUQiLCJhc3Nlc3NtZW50SUQiLCJyYXciLCJNYXJrIiwiaWRBdHRyaWJ1dGUiLCJnZXQiLCJvd25lckZpcnN0TmFtZSIsIm93bmVyU3VybmFtZSIsInN0YXR1cyIsImhhcyIsImZpbmQiLCJhY3Rpdml0eSIsIm5hbWUiLCJ1c2VyR3JhZGUiLCJjb2RlVG9IdW1hblZhbHVlIiwibGV4aWNhbCIsIm1hcmtlZCIsInJlc3VsdHMiLCJzY29yZXMiLCJzY29yZURhdGEiLCJzY29yZSIsInVuZGVmaW5lZCIsImVhY2giLCJNYXJrQ29sbGVjdGlvbiIsIkluc3RhbmNlSUQiLCJpbnN0YW5jZUlEIiwiaW5jbHVkZUVkdWNhdG9ycyIsImluY2x1ZGVMZWF2ZXJzIiwiQWN0aXZpdHlEdXJhdGlvbiIsInN0YXJ0IiwiZm9ybWF0IiwiZW5kIiwiZHVyYXRpb24iLCJkaWZmIiwiYXNNaWxsaXNlY29uZHMiLCJBY3Rpdml0eUR1cmF0aW9uQ29sbGVjdGlvbiIsIkNvbGxlY3Rpb24iLCJjb21wYXJhdG9yIiwiU2VjdGlvblZpZXciLCJNYXJpb25ldHRlIiwiVmlldyIsInRhZ05hbWUiLCJnZXRUZW1wbGF0ZSIsInRlbXBsYXRlIiwibG9hZGluZyIsIk9wdGlvbnMiLCJHcmlkTWl4aW4iLCJjb2xsZWN0aW9uRmV0Y2hFcnJvciIsImNvbGxlY3Rpb24iLCJyZXNwb25zZSIsImVycm9yQ29udGFpbmVyIiwiJGVsIiwibWVzc2FnZUNvbnRhaW5lciIsImFkZENsYXNzIiwicmVtb3ZlQ2xhc3MiLCJhcHBlbmQiLCJmZXRjaEVycm9yIiwicmVuZGVyIiwiZGVidWciLCJyZXBvcnRFcnJvcnMiLCJBc3Nlc3NtZW50c1ZpZXciLCJjbGFzc05hbWUiLCJ1aSIsImNvdW50ZXJDb250YWluZXIiLCJncmlkTmF2aWdhdG9yQ29udGFpbmVyIiwiY291bnRlckJhciIsInBhZ2luZyIsImZpbHRlckJhciIsImdyaWQiLCJldmVudHMiLCJjb2xsZWN0aW9uRXZlbnRzIiwiYXNzZXNzbWVudHMiLCJyZXByb2R1Y2VBc3Nlc3NtZW50Iiwid2luZG93Iiwib3BlbiIsImV4cG9ydEFzc2Vzc21lbnQiLCJvblJlbmRlciIsInRvb2x0aXBzIiwidGl0bGUiLCJpY29uIiwiY29sdW1ucyIsImxhYmVsIiwiY2VsbCIsImVkaXRhYmxlIiwic29ydFZhbHVlIiwic3RyaW5nU29ydCIsIlRvb2xiYXJDZWxsIiwic29ydGFibGUiLCJlbCIsImNsaWNrYWJsZSIsImNvdW50ZXIiLCJlbGVtZW50IiwiYmluZEV2ZW50cyIsImxpc3RlblRvIiwib25HcmlkUm93Q2xpY2tlZCIsImJpbmQiLCJ0ZXh0RmlsdGVyIiwidHlwZSIsImRlYm91bmNlIiwic2VydmVyIiwibGFuZ3VhZ2VGaWx0ZXIiLCJjYXRlZ29yaWVzIiwiaXRlbXMiLCJsYW5ndWFnZUxpc3QiLCJzdWJqZWN0RmlsdGVyIiwia2V5IiwidmFsdWUiLCJmZXRjaCIsImluZmluaXRlIiwiZ3JhZGVGaWx0ZXIiLCJtYXAiLCJncmFkZUxpc3QiLCJ2YWwiLCJyZWR1Y2UiLCJzb3J0IiwiYSIsImIiLCJ0b1VwcGVyQ2FzZSIsImxvY2FsZUNvbXBhcmUiLCJzdW0iLCJudW0iLCJwdXNoIiwiY2F0cyIsIm9mZmljZUNvbnRlbnQiLCJwcmVwZW5kIiwiZmlsdGVyIiwiZmlsdGVyQ29udGFpbmVyIiwiZmlsdGVycyIsImRlZmF1bHRGaWx0ZXJzIiwidHJpZ2dlciIsIkluc3RhbmNlc1ZpZXciLCJpbnN0YW5jZXMiLCJNb21lbnRDZWxsIiwibW9kZWxJblVuaXhUaW1lc3RhbXAiLCJkaXNwbGF5Rm9ybWF0IiwiZGlzcGxheUluVVRDIiwiaW5zdGFuY2VNb2RlbCIsIk1hcmtzVmlldyIsInRlc3RUb3RhbCIsImRvd25sb2FkQnV0dG9uIiwicmVmcmVzaEJ1dHRvbiIsImRvd25sb2FkSW5kaXZpZHVhbCIsIm1hcmtzIiwiYXNzZXNzbWVudEZldGNoRXJyb3IiLCJhZGRUb29sdGlwIiwidGhlbWUiLCJwbGFjZW1lbnQiLCJhcnJvdyIsIkNlbGwiLCJjbGljayIsIm9uQ2xpY2siLCJCb29sZWFuSWNvbkNlbGwiLCJyZXF1ZXN0IiwidGhlbiIsImFzc2Vzc21lbnQiLCJxdWVzdGlvbkRhdGEiLCJxdWVzdGlvbkNvdW50ZXIiLCJnZXRTY29yZSIsInF1ZXN0aW9uIiwic3VibWlzc2lvbk1vZGVsIiwic2NvcmVEYXR1bSIsImlkIiwiaGVhZGVyQ2VsbCIsIkhlYWRlckNlbGwiLCJjb2x1bW4iLCJwb3RlbnRpYWxTY29yZSIsImZvcm1hdHRlciIsImZyb21SYXciLCJidG5PcHRpb25zIiwiY2xhc3MiLCJ0ZXh0IiwiQnV0dG9uQ2VsbCIsImZpcnN0QXR0ZW1wdEZpbHRlciIsImluaXRpYWxWYWx1ZSIsImluY2x1ZGVFZHVjYXRvckZpbHRlciIsImluY2x1ZGVMZWF2ZXJGaWx0ZXIiLCJjYXRjaCIsInJlZnJlc2giLCJzaWxlbnQiLCJSZWFkeSIsIm9uRG93bmxvYWRCdXR0b25DbGljayIsImV2ZW50Iiwic3RvcFByb3BhZ2F0aW9uIiwiRG93bmxvYWRNZW51IiwiZGVzdHJveSIsImFuY2hvciIsInNpZGUiLCJzdHJ1Y3R1cmUiLCJjbG9zZU9uQ2xpY2siLCJlbGVtZW50cyIsInNob3ciLCJzZXJ2ZXJQYXJhbXMiLCJvblJlZnJlc2hCdXR0b25DbGljayIsIm9uTmFtZUNsaWNrZWQiLCJvbkdyaWRDb2x1bW5DbGlja2VkIiwicSIsImxlbmd0aCIsIm1vZGFsIiwiYW5zd2VycyIsImNsb3NlIiwicGFnaW5hdG9yIiwicmVzdWx0IiwiZGF0YUNoYW5nZWQiLCJvbkdyaWRDZWxsQ2xpY2tlZCIsImZsYXR0ZW4iLCJjb3JyZWN0QW5zd2VycyIsIm90aGVyQW5zd2VycyIsImxlZnQiLCJyaWdodCIsImFuc3dlciIsInR5cGVzZXRDb250ZW50IiwiY29udGVudCIsInN0YXJ0c1dpdGgiLCJyZXBsYWNlIiwieCIsImNoYXJDb2RlQXQiLCJzdHVkZW50QW5zd2VycyIsInN0dWRlbnRBbnN3ZXIiLCJib2R5IiwiaG9zdCIsImhpZGVCdXR0b25zIiwicGRmUmVwb3J0Iiwid2FybmluZyIsIkFjdGl2aXR5RGV0YWlsc1ZpZXciLCJ0YWciLCJhY3Rpdml0eURldGFpbHMiLCJ0ZW1wbGF0ZUNvbnRleHQiLCJBY3Rpdml0eVZpZXciLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsIlRvdGFsRHVyYXRpb24iLCJ0b3RhbER1cmF0aW9uIiwib25IaWdobGlnaHQiLCJvbkxvd2xpZ2h0IiwiY3NzIiwid2lkdGgiLCJNYXRoIiwicm91bmQiLCJEZXRhaWxUb29sdGlwIiwiSGlnaGxpZ2h0ZWQiLCJ0aXAiLCJfdGlwcHkiLCJoaWRlIiwiQWN0aXZpdHlUaW1lbGluZUJvZHlWaWV3IiwiQ29sbGVjdGlvblZpZXciLCJjaGlsZFZpZXciLCJjaGlsZFZpZXdPcHRpb25zIiwiQWN0aXZpdHlUaW1lbGluZVZpZXciLCJhY3Rpdml0eVRpbWVsaW5lIiwidmFsdWVDb21wbGV0aW9uVGltZSIsImNvbXB1dGVUb3RhbER1cmF0aW9uIiwibWVtbyIsImFjdGl2aXR5RHVyYXRpb24iLCJUaW1lbGluZUJvZHkiLCJjb21wbGV0aW9uVGltZSIsImFzTWludXRlcyIsImNvbXBsZXRpb25UaW1lVW5pdCIsImFzU2Vjb25kcyIsIkRldGFpbHNWaWV3IiwiYWN0aXZpdHlUaW1lbGluZUNvbnRhaW5lciIsImRldGFpbHMiLCJpc1VuZGVmaW5lZCIsIm9uTW91c2VPdmVyIiwib25HcmlkQ2VsbE1vdXNlT3ZlciIsIm9uTW91c2VPdXQiLCJvbkdyaWRDZWxsTW91c2VPdXQiLCJTdWJtaXNzaW9uIiwiTWFya3NHcmlkIiwibm9Mb2FkIiwicXVlc3Rpb25TdGFydCIsImFkZCIsImRhdGEiLCJzdGFydFRpbWUiLCJ0aW1lIiwiZW5kVGltZSIsInVuaXhUaW1lc3RhbXAiLCJBY3Rpdml0eVRpbWVsaW5lIiwic3VibWlzc2lvbklEIiwibW9kdWxlIiwiZXhwb3J0cyIsImxheW91dCIsInJlZ2lvbnMiLCJzZWN0aW9uIiwiYXNzZXNzbWVudHNTZWN0aW9uIiwiaW5zdGFuY2VzU2VjdGlvbiIsIm1hcmtzU2VjdGlvbiIsImRldGFpbHNTZWN0aW9uIiwiSWRlbnRpZmllcnMiLCJyZXBseSIsImZldGNoQXNzZXNzbWVudHMiLCJmZXRjaEluc3RhbmNlcyIsImZldGNoTWFya3MiLCJmZXRjaEFzc2Vzc21lbnQiLCJyZXNvbHZlIiwibGF6eUZldGNoIiwiQWN0aXZlU2VjdGlvbiIsImZpcnN0IiwiZGlzYWJsZVNlY3Rpb24iLCJjcmVhdGVBc3Nlc3NtZW50c1NlY3Rpb24iLCJnZXRSZWdpb24iLCJoYXNWaWV3Iiwic2hvd0NoaWxkVmlldyIsImN1cnJlbnRWaWV3Iiwib25Bc3Nlc3NtZW50U2VsZWN0ZWQiLCJjcmVhdGVJbnN0YW5jZXNTZWN0aW9uIiwic3RvcExpc3RlbmluZyIsInJlc2V0Iiwib25JbnN0YW5jZVNlbGVjdGVkIiwiY3JlYXRlTWFya3NTZWN0aW9uIiwib25TdWJtaXNzaW9uU2VsZWN0ZWQiLCJjcmVhdGVEZXRhaWxzU2VjdGlvbiIsIm5hdmlnYXRlVG9TZWN0aW9uIiwiaWRlbnRpZmllcnMiLCJlbmFibGVTZWN0aW9uIiwiYWN0aXZhdGVTZWN0aW9uIiwib25TZWN0aW9uQ2xpY2siLCJ0YXJnZXQiLCJjdXJyZW50VGFyZ2V0IiwiaXMiLCJDb21tYW5kcyIsIk5hdmlnYXRlIiwicHJvcCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLElBQUlELFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUUsV0FBV0YsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUcsU0FBU0gsUUFBUSxRQUFSLENBQWY7QUFDQSxJQUFNSSxVQUFVSixRQUFRLFVBQVIsQ0FBaEI7QUFDQSxJQUFNSyxTQUFTTCxRQUFRLFFBQVIsQ0FBZjtBQUNBLElBQU1NLFFBQVFOLFFBQVEsVUFBUixFQUFvQk8sT0FBbEM7O0FBRUEsSUFBTUMsTUFBTVIsUUFBUSxhQUFSLENBQVo7QUFDQSxJQUFNUyxXQUFXVCxRQUFRLGNBQVIsQ0FBakI7O0FBRUEsSUFBTVUsUUFBUVIsU0FBU1MsS0FBVCxDQUFlQyxPQUFmLENBQXVCLFFBQXZCLENBQWQ7QUFDQSxJQUFNQyxPQUFPWCxTQUFTUyxLQUFULENBQWVDLE9BQWYsQ0FBdUIsZ0JBQXZCLENBQWI7O0FBRUEsSUFBTUUsWUFBWWQsUUFBUSxxQkFBUixDQUFsQjtBQUNBLElBQU1lLGtCQUFr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Qzs7QUFnTmhEa1QscUJBQW9CLDRCQUFTbFQsWUFBVCxFQUF1QndCLFVBQXZCLEVBQW1DO0FBQ3RENUUsUUFBTW9MLE9BQU4sQ0FBY3RMLElBQUlnQixNQUFKLENBQVdvVyxRQUFYLENBQW9CQyxRQUFsQyxFQUE0Q3BYLFNBQVMrQixPQUFULEdBQW1CLGlCQUFuQixHQUF1Q3NCLFlBQXZDLEdBQXNELEdBQXRELEdBQTREd0IsVUFBeEc7QUFDQSxFQWxOK0M7O0FBb05oRDRSLHVCQUFzQiw4QkFBU3BULFlBQVQsRUFBdUJ3QixVQUF2QixFQUFtQzRQLFlBQW5DLEVBQWlEO0FBQ3RFeFUsUUFBTW9MLE9BQU4sQ0FBY3RMLElBQUlnQixNQUFKLENBQVdvVyxRQUFYLENBQW9CQyxRQUFsQyxFQUE0Q3BYLFNBQVMrQixPQUFULEdBQW1CLGlCQUFuQixHQUF1Q3NCLFlBQXZDLEdBQXNELEdBQXRELEdBQTREd0IsVUFBNUQsR0FBeUUsR0FBekUsR0FBK0U0UCxZQUEzSDtBQUNBO0FBdE4rQyxDQUFoQyxDQUFqQjs7QUF5TkE7OztBQUdBOzs7QUFHQSIsImZpbGUiOiJtYXJrcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRGVwZW5kZW5jaWVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCBtb21lbnQgPSByZXF1aXJlKFwibW9tZW50XCIpO1xuY29uc3QgUHJvbWlzZSA9IHJlcXVpcmUoXCJibHVlYmlyZFwiKTtcbmNvbnN0IHJheWd1biA9IHJlcXVpcmUoXCJyYXlndW5cIik7XG5jb25zdCB0aXBweSA9IHJlcXVpcmUoXCJ0aXBweS5qc1wiKS5kZWZhdWx0O1xuXG5jb25zdCBBcHAgPSByZXF1aXJlKFwiLi4vLi4vaW5kZXhcIik7XG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcbmNvbnN0IFBhZ2UgPSBCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZWR1Y2F0b3ItbWFya3NcIik7XG5cbmNvbnN0IEVycm9yVmlldyA9IHJlcXVpcmUoXCIuLi8uLi9saWIvZXJyb3JWaWV3XCIpO1xuY29uc3QgRXZhbHVhdGlvbk1vZGFsID0gcmVxdWlyZShcIi4vZXZhbHVhdGlvbk1vZGFsXCIpO1xuY29uc3QgR3JpZCA9IHJlcXVpcmUoXCIuLi8uLi9saWIvZ3JpZFwiKTtcbmNvbnN0IEJhY2tncmlkID0gcmVxdWlyZShcImJhY2tncmlkXCIpO1xuY29uc3QgU2ltcGxlTWVudSA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc2ltcGxlTWVudVwiKTtcbmNvbnN0IFNtYWxsTW9kYWwgPSByZXF1aXJlKFwiLi4vLi4vbGliL3NtYWxsTW9kYWxcIik7XG5jb25zdCBTZXJ2ZXJHcmlkID0gcmVxdWlyZShcIi4uLy4uL2xpYi9zZXJ2ZXJHcmlkXCIpO1xuY29uc3QgZ3JhZGVNYXAgPSByZXF1aXJlKFwiLi4vLi4vbGliL2dyYWRlTWFwXCIpO1xuXG5fLmV4dGVuZChQYWdlLCB7XG5cdENhY2hlOiB7fSxcblx0RXZlbnRzOiB7fSxcbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFdmVudHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblBhZ2UuRXZlbnRzID0ge1xuXHRBc3Nlc3NtZW50U2VsZWN0ZWQ6IFwiUGFnZS5FdmVudHMuQXNzZXNzbWVudFNlbGVjdGVkXCIsXG5cdEluc3RhbmNlU2VsZWN0ZWQ6IFwiUGFnZS5FdmVudHMuSW5zdGFuY2VTZWxlY3RlZFwiLFxuXHRTdWJtaXNzaW9uU2VsZWN0ZWQ6IFwiUGFnZS5FdmVudHMuU3VibWlzc2lvblNlbGVjdGVkXCIsXG5cblx0R2V0QXNzZXNzbWVudHM6IFwiUGFnZS5FdmVudHMuR2V0QXNzZXNzbWVudHNcIixcblx0R2V0SW5zdGFuY2VzOiBcIlBhZ2UuRXZlbnRzLkdldEluc3RhbmNlc1wiLFxuXHRHZXRNYXJrczogXCJQYWdlLkV2ZW50cy5HZXRNYXJrc1wiLFxuXHRHZXRBc3Nlc3NtZW50OiBcIlBhZ2UuRXZlbnRzLkdldEFzc2Vzc21lbnRcIixcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE1vZGVsc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuY29uc3QgQXNzZXNzbWVudCA9IEJhY2tib25lLkVwb3h5Lk1vZGVsLmV4dGVuZCh7XG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKGF0dHJpYnV0ZXMsIG9wdGlvbnMpIHtcblx0XHR0aGlzLkFzc2Vzc21lbnRSZXNvdXJjZUlEID0gb3B0aW9ucy5hc3Nlc3NtZW50UmVzb3VyY2VJRDtcblx0fSxcblxuXHR1cmxSb290OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvcmVzb3VyY2VzL2Fzc2Vzc21lbnRzL1wiICsgdGhpcy5Bc3Nlc3NtZW50UmVzb3VyY2VJRDtcblx0fSxcbn0pO1xuXG5jb25zdCBSZXNvdXJjZSA9IHJlcXVpcmUoXCIuLi8uLi9jb250ZW50L21vZGVscy9tYW5hZ2VyL3Jlc291cmNlTW9kZWxcIik7XG5cbmNvbnN0IEFzc2Vzc21lbnRDb2xsZWN0aW9uID0gQmFja2JvbmUuUGFnZWFibGVDb2xsZWN0aW9uLmV4dGVuZCh7XG5cdG1vZGVsOiBSZXNvdXJjZSxcblxuXHR1cmw6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9hc3Nlc3NtZW50cz9wYWdlZD10cnVlXCI7XG5cdH0sXG5cblx0c3RhdGU6IHtcblx0XHRwYWdlU2l6ZTogMzAsXG5cdH0sXG5cdG1vZGU6IFwic2VydmVyXCIsXG5cblx0cXVlcnlQYXJhbXM6IHtcblx0XHRwYWdlU2l6ZTogXCJwYWdlU2l6ZVwiLFxuXHRcdHNvcnRLZXk6IFwic29ydEJ5XCIsXG5cdH0sXG5cblx0cGFyc2VTdGF0ZTogZnVuY3Rpb24ocmVzcCkge1xuXHRcdHJldHVybiB7IHRvdGFsUmVjb3JkczogcmVzcC50b3RhbCB9O1xuXHR9LFxuXG5cdHBhcnNlUmVjb3JkczogZnVuY3Rpb24ocmVzcCkge1xuXHRcdHJldHVybiByZXNwLnJvd3M7XG5cdH0sXG59KTtcblxuY29uc3QgSW5zdGFuY2UgPSBCYWNrYm9uZS5FcG94eS5Nb2RlbC5leHRlbmQoe1xuXHRjb21wdXRlZHM6IHt9LFxufSk7XG5cbmNvbnN0IEluc3RhbmNlQ29sbGVjdGlvbiA9IEJhY2tib25lLlBhZ2VhYmxlQ29sbGVjdGlvbi5leHRlbmQoe1xuXHRtb2RlbDogSW5zdGFuY2UsXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24obW9kZWxzLCBvcHRpb25zKSB7XG5cdFx0dGhpcy5Bc3Nlc3NtZW50SUQgPSBvcHRpb25zLmFzc2Vzc21lbnRJRDtcblx0fSxcblxuXHR1cmw6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGFzc2Vzc21lbnRJRCA9IHRoaXMuQXNzZXNzbWVudElEID8gdGhpcy5Bc3Nlc3NtZW50SUQgOiB0aGlzLm9wdGlvbnMucmF3LkFzc2Vzc21lbnRJRDtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvYXNzZXNzbWVudHMvXCIgKyBhc3Nlc3NtZW50SUQgKyBcIj9wYWdlZD10cnVlXCI7XG5cdH0sXG5cblx0c3RhdGU6IHtcblx0XHRwYWdlU2l6ZTogMzAsXG5cdH0sXG5cdG1vZGU6IFwic2VydmVyXCIsXG5cblx0cXVlcnlQYXJhbXM6IHtcblx0XHRwYWdlU2l6ZTogXCJwYWdlU2l6ZVwiLFxuXHRcdHNvcnRLZXk6IFwic29ydEJ5XCIsXG5cdH0sXG5cblx0cGFyc2VTdGF0ZTogZnVuY3Rpb24ocmVzcCkge1xuXHRcdHJldHVybiB7IHRvdGFsUmVjb3JkczogcmVzcC50b3RhbCB9O1xuXHR9LFxuXG5cdHBhcnNlUmVjb3JkczogZnVuY3Rpb24ocmVzcCkge1xuXHRcdHJldHVybiByZXNwLnJvd3M7XG5cdH0sXG59KTtcblxuY29uc3QgTWFyayA9IEJhY2tib25lLkVwb3h5Lk1vZGVsLmV4dGVuZCh7XG5cdGlkQXR0cmlidXRlOiBcIl9pZFwiLFxuXHR1cmw6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9hc3Nlc3NtZW50cy9cIiArIHRoaXMuZ2V0KFwiYXNzZXNzbWVudFwiKSArIFwiL21hcmtzL1wiICsgdGhpcy5nZXQoXCJhdHRhY2htZW50XCIpICsgXCIvXCIgKyB0aGlzLmdldChcIl9pZFwiKTtcblx0fSxcblx0Y29tcHV0ZWRzOiB7XG5cdFx0b3duZXJGaXJzdE5hbWU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0KFwiZmlyc3RuYW1lXCIpID09PSBudWxsID8gXCJbTm90IEZvdW5kXVwiIDogdGhpcy5nZXQoXCJmaXJzdG5hbWVcIik7XG5cdFx0fSxcblxuXHRcdG93bmVyU3VybmFtZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXQoXCJzdXJuYW1lXCIpID09PSBudWxsID8gXCJbTm90IEZvdW5kXVwiIDogdGhpcy5nZXQoXCJzdXJuYW1lXCIpO1xuXHRcdH0sXG5cblx0XHRzdGF0dXM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29uc3Qgc3RhdHVzID0gdGhpcy5oYXMoXCJwYXlsb2FkXCIpID8gKF8uZmluZCh0aGlzLmdldChcInBheWxvYWRcIikuYWN0aXZpdHksIGFjdGl2aXR5ID0+IGFjdGl2aXR5Lm5hbWUgPT09IFwiYXNzZXNzbWVudC1jb21wbGV0ZWRcIikgPyBcIkNvbXBsZXRlZFwiIDogXCJBYmFuZG9uZWRcIikgOiBcIk5vdCBBdHRlbXB0ZWRcIjtcblx0XHRcdHJldHVybiBzdGF0dXM7XG5cdFx0fSxcblxuXHRcdHVzZXJHcmFkZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5oYXMoXCJncmFkZVwiKSA/IGdyYWRlTWFwLmNvZGVUb0h1bWFuVmFsdWUodGhpcy5nZXQoXCJncmFkZVwiKSwgeyBsZXhpY2FsOiB0cnVlIH0pIDogXCJcIjtcblx0XHR9LFxuXG5cdFx0bWFya2VkOiBmdW5jdGlvbigpIHtcblx0XHRcdGxldCBtYXJrZWQgPSB0cnVlO1xuXG5cdFx0XHRpZiAoIXRoaXMuaGFzKFwicGF5bG9hZFwiKSB8fCAhdGhpcy5nZXQoXCJwYXlsb2FkXCIpLnJlc3VsdHMgfHwgIXRoaXMuZ2V0KFwicGF5bG9hZFwiKS5yZXN1bHRzLnNjb3Jlcylcblx0XHRcdFx0bWFya2VkID0gZmFsc2U7XG5cdFx0XHRlbHNlIGlmIChfLmZpbmQodGhpcy5nZXQoXCJwYXlsb2FkXCIpLnJlc3VsdHMuc2NvcmVzLCBzY29yZURhdGEgPT4gc2NvcmVEYXRhLnNjb3JlID09PSB1bmRlZmluZWQpKVxuXHRcdFx0XHRtYXJrZWQgPSBmYWxzZTtcblxuXHRcdFx0cmV0dXJuIG1hcmtlZDtcblx0XHR9LFxuXG5cdFx0dG90YWw6IGZ1bmN0aW9uKCkge1xuXHRcdFx0bGV0IHRvdGFsID0gMDtcblxuXHRcdFx0aWYgKHRoaXMuaGFzKFwicGF5bG9hZFwiKSAmJiB0aGlzLmdldChcInBheWxvYWRcIikucmVzdWx0cyAmJiB0aGlzLmdldChcInBheWxvYWRcIikucmVzdWx0cy5zY29yZXMpXG5cdFx0XHRcdF8uZWFjaCh0aGlzLmdldChcInBheWxvYWRcIikucmVzdWx0cy5zY29yZXMsIHNjb3JlRGF0YSA9PiB7IHRvdGFsICs9IHNjb3JlRGF0YS5zY29yZSA/IHNjb3JlRGF0YS5zY29yZSA6IDA7IH0pO1xuXG5cdFx0XHRyZXR1cm4gdG90YWw7XG5cdFx0fSxcblx0fSxcbn0pO1xuXG5jb25zdCBNYXJrQ29sbGVjdGlvbiA9IEJhY2tib25lLlBhZ2VhYmxlQ29sbGVjdGlvbi5leHRlbmQoe1xuXHRtb2RlbDogTWFyayxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihtb2RlbHMsIG9wdGlvbnMpIHtcblx0XHR0aGlzLkFzc2Vzc21lbnRJRCA9IG9wdGlvbnMuYXNzZXNzbWVudElEO1xuXHRcdHRoaXMuSW5zdGFuY2VJRCA9IG9wdGlvbnMuaW5zdGFuY2VJRDtcblx0XHR0aGlzLmluY2x1ZGVFZHVjYXRvcnMgPSBvcHRpb25zLmluY2x1ZGVFZHVjYXRvcnM7XG5cdFx0dGhpcy5pbmNsdWRlTGVhdmVycyA9IG9wdGlvbnMuaW5jbHVkZUxlYXZlcnM7XG5cdH0sXG5cblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBhc3Nlc3NtZW50SUQgPSB0aGlzLkFzc2Vzc21lbnRJRCA/IHRoaXMuQXNzZXNzbWVudElEIDogdGhpcy5vcHRpb25zLnJhdy5Bc3Nlc3NtZW50SUQ7XG5cdFx0Y29uc3QgaW5zdGFuY2VJRCA9IHRoaXMuSW5zdGFuY2VJRCA/IHRoaXMuSW5zdGFuY2VJRCA6IHRoaXMub3B0aW9ucy5yYXcuSW5zdGFuY2VJRDtcblx0XHRjb25zdCBpbmNsdWRlRWR1Y2F0b3JzID0gdGhpcy5pbmNsdWRlRWR1Y2F0b3JzID8gXCImaW5jbHVkZUVkdWNhdG9yRmlsdGVyPVwiICsgdGhpcy5pbmNsdWRlRWR1Y2F0b3JzIDogXCJcIjtcblx0XHRjb25zdCBpbmNsdWRlTGVhdmVycyA9IHRoaXMuaW5jbHVkZUxlYXZlcnMgPyBcIiZpbmNsdWRlTGVhdmVyRmlsdGVyPVwiICsgdGhpcy5pbmNsdWRlTGVhdmVycyA6IFwiXCI7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2Fzc2Vzc21lbnRzL1wiICsgYXNzZXNzbWVudElEICsgXCIvbWFya3MvXCIgKyBpbnN0YW5jZUlEICsgXCI/cGFnZWQ9dHJ1ZVwiICsgaW5jbHVkZUVkdWNhdG9ycyArIGluY2x1ZGVMZWF2ZXJzO1xuXHR9LFxuXG5cdHN0YXRlOiB7XG5cdFx0cGFnZVNpemU6IDMwLFxuXHR9LFxuXHRtb2RlOiBcInNlcnZlclwiLFxuXG5cdHF1ZXJ5UGFyYW1zOiB7XG5cdFx0cGFnZVNpemU6IFwicGFnZVNpemVcIixcblx0XHRzb3J0S2V5OiBcInNvcnRCeVwiLFxuXHR9LFxuXG5cdHBhcnNlU3RhdGU6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRyZXR1cm4geyB0b3RhbFJlY29yZHM6IHJlc3AudG90YWwgfTtcblx0fSxcblxuXHRwYXJzZVJlY29yZHM6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRyZXR1cm4gcmVzcC5yb3dzO1xuXHR9LFxufSk7XG5cbmNvbnN0IEFjdGl2aXR5RHVyYXRpb24gPSBCYWNrYm9uZS5FcG94eS5Nb2RlbC5leHRlbmQoe1xuXHRjb21wdXRlZHM6IHtcblx0XHRzdGFydDogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gbW9tZW50KHRoaXMuZ2V0KFwic3RhcnRUaW1lXCIpKS5mb3JtYXQoXCJISDptbTpzcyAoRCBNTU0gWVlZWSlcIik7XG5cdFx0fSxcblxuXHRcdGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gbW9tZW50KHRoaXMuZ2V0KFwiZW5kVGltZVwiKSkuZm9ybWF0KFwiSEg6bW06c3MgKEQgTU1NIFlZWVkpXCIpO1xuXHRcdH0sXG5cblx0XHRkdXJhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gbW9tZW50LmR1cmF0aW9uKG1vbWVudCh0aGlzLmdldChcImVuZFRpbWVcIikpLmRpZmYobW9tZW50KHRoaXMuZ2V0KFwic3RhcnRUaW1lXCIpKSkpLmFzTWlsbGlzZWNvbmRzKCk7XG5cdFx0fSxcblx0fSxcbn0pO1xuXG5jb25zdCBBY3Rpdml0eUR1cmF0aW9uQ29sbGVjdGlvbiA9IEJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IEFjdGl2aXR5RHVyYXRpb24sXG5cblx0Y29tcGFyYXRvcjogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRyZXR1cm4gbW9kZWwuZ2V0KFwic3RhcnRUaW1lXCIpO1xuXHR9LFxufSk7XG5cbmNvbnN0IFNlY3Rpb25WaWV3ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6IFwiZGl2XCIsXG5cblx0Z2V0VGVtcGxhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdGxldCB0ZW1wbGF0ZSA9IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvbWFya3MubnVualwiKS5sb2FkaW5nO1xuXG5cdFx0Ly9pZiAodGhpcy5SZWFkeSlcblx0XHR0ZW1wbGF0ZSA9IHRoaXMuT3B0aW9ucy50ZW1wbGF0ZTtcblxuXHRcdHJldHVybiB0ZW1wbGF0ZTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0Ly8gRmxhZ3Ncblx0XHQvLyBFcnJvcjogc2V0IHRoaXMgdG8gYSBoYXNoIHRvIGRpc3BsYXkgYW4gZXJyb3Jcblx0XHQvLyAgICAgICAge1xuXHRcdC8vICAgICAgICAgICAgbWVzc2FnZTogKFRoZSBlcnJvciBtZXNzYWdlKSxcblx0XHQvLyAgICAgICAgICAgIGNvbnRleHQ6IChUaGUgbW9kZWwvY29sbGVjdGlvbiB0aGF0IGNhdXNlZCB0aGUgZXJyb3IpLFxuXHRcdC8vICAgICAgICAgICAgcmVzcG9uc2U6IChUaGUgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyKVxuXHRcdC8vICAgICAgICB9XG5cdFx0Ly9cblx0XHQvLyBSZWFkeTogc2V0IHRoaXMgdG8gdHJ1ZSB0byBzaWduYWwgdGhhdCBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgZmV0Y2hlZFxuXHRcdC8vICAgICAgICBhbmQgY2FuIGJlIGRpc3BsYXllZFxuXG5cdFx0Ly8gT3B0aW9uc1xuXHRcdC8vIHRlbXBsYXRlOiB0aGUgY3VzdG9tIHRlbXBsYXRlIGZvciB0aGUgc3BlY2lmaWMgdmlld1xuXHRcdHRoaXMuT3B0aW9ucyA9IG9wdGlvbnM7XG5cdH0sXG59KTtcblxuY29uc3QgR3JpZE1peGluID0ge1xuXHRjb2xsZWN0aW9uRmV0Y2hFcnJvcjogZnVuY3Rpb24oY29sbGVjdGlvbiwgcmVzcG9uc2UpIHtcblx0XHRjb25zdCBlcnJvckNvbnRhaW5lciA9ICQoXCIuZXJyb3ItY29udGFpbmVyXCIsIHRoaXMuJGVsKTtcblx0XHRjb25zdCBtZXNzYWdlQ29udGFpbmVyID0gJChcIi5tZXNzYWdlLWNvbnRhaW5lclwiLCB0aGlzLiRlbCk7XG5cblx0XHRtZXNzYWdlQ29udGFpbmVyLmFkZENsYXNzKFwiaGlkZGVuXCIpO1xuXHRcdGVycm9yQ29udGFpbmVyLnJlbW92ZUNsYXNzKFwiaGlkZGVuXCIpO1xuXHRcdGVycm9yQ29udGFpbmVyLmFwcGVuZChuZXcgRXJyb3JWaWV3KHsgZmV0Y2hFcnJvcjogcmVzcG9uc2UgfSkucmVuZGVyKCkuJGVsKTtcblxuXHRcdC8vUmF2ZW4uY2FwdHVyZUV4Y2VwdGlvbihyZXNwb25zZSk7XG5cdFx0aWYgKCFzZXR0aW5ncy5kZWJ1ZyB8fCBzZXR0aW5ncy5yZXBvcnRFcnJvcnMpXG5cdFx0XHRyYXlndW4oXCJzZW5kXCIsIHJlc3BvbnNlKTtcblx0fSxcbn07XG5cblxuY29uc3QgQXNzZXNzbWVudHNWaWV3ID0gU2VjdGlvblZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImFzc2Vzc21lbnRzLXZpZXdcIixcblxuXHR1aToge1xuXHRcdGNvdW50ZXJDb250YWluZXI6IFwiLmdyaWQtaGVhZGVyIC5jb3VudGVyLWNvbnRhaW5lclwiLFxuXHRcdGdyaWROYXZpZ2F0b3JDb250YWluZXI6IFwiLmdyaWQtcGFnaW5nXCIsXG5cdFx0Y291bnRlckJhcjogXCIub3BzLWJhciAuY291bnRlclwiLFxuXHRcdHBhZ2luZzogXCIucGFnaW5nXCIsXG5cdFx0ZmlsdGVyQmFyOiBcIi5vcHMtYmFyIC5maWx0ZXJzXCIsXG5cdFx0Z3JpZDogXCIuZ3JpZFwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHR9LFxuXG5cdGNvbGxlY3Rpb25FdmVudHM6IHtcblx0XHRcInRvb2xiYXI6Y2xpY2s6ZG93bmxvYWRwZGZyZXBvcnRcIjogXCJyZXByb2R1Y2VBc3Nlc3NtZW50XCIsXG5cdFx0XCJ0b29sYmFyOmNsaWNrOmV4cG9ydFwiOiBcImV4cG9ydEFzc2Vzc21lbnRcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0Xy5leHRlbmQodGhpcywgR3JpZE1peGluKTtcblxuXHRcdHRoaXMuT3B0aW9ucyA9IG9wdGlvbnMgPyBvcHRpb25zIDoge307XG5cblx0XHRfLmV4dGVuZCh0aGlzLk9wdGlvbnMsIHtcblx0XHRcdC8vIFNlY3Rpb24gVmlld1xuXHRcdFx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvbWFya3MubnVualwiKS5hc3Nlc3NtZW50cyxcblx0XHR9KTtcblx0fSxcblxuXHRyZXByb2R1Y2VBc3Nlc3NtZW50OiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdHdpbmRvdy5vcGVuKHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2Fzc2Vzc21lbnRzL1wiICsgbW9kZWwuZ2V0KFwiX2lkXCIpICsgXCIvcmVwb3J0P21lbW9Pbmx5PXRydWVcIik7XG5cdH0sXG5cblx0ZXhwb3J0QXNzZXNzbWVudDogZnVuY3Rpb24obW9kZWwpIHtcblx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9hc3Nlc3NtZW50cy9cIiArIG1vZGVsLmdldChcIl9pZFwiKSArIFwiL2V4cG9ydFwiKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgdG9vbHRpcHMgPSBbXG5cdFx0XHR7IHRpdGxlOiBcIkRvd25sb2FkIFBERiBSZXBvcnRcIiwgaWNvbjogXCJmYS1maWxlLXBkZlwiIH0sXG5cdFx0XHR7IHRpdGxlOiBcIkV4cG9ydFwiLCBpY29uOiBcImZhLWNsb3VkLWRvd25sb2FkXCIgfSxcblx0XHRdO1xuXG5cdFx0Y29uc3QgY29sdW1ucyA9IFtcblx0XHRcdHsgbmFtZTogXCJ0aXRsZVwiLCBsYWJlbDogXCJUaXRsZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UsIHNvcnRWYWx1ZTogU2VydmVyR3JpZC5zdHJpbmdTb3J0IH0sXG5cdFx0XHR7IG5hbWU6IFwic3ViamVjdFwiLCBsYWJlbDogXCJTdWJqZWN0XCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImNvbnRlbnRHcmFkZVwiLCBsYWJlbDogXCJZZWFyIG9mIFN0dWR5XCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImxhbmd1YWdlXCIsIGxhYmVsOiBcIkxhbmd1YWdlXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBsYWJlbDogXCJBY3Rpb25zXCIsIGNlbGw6IG5ldyBTZXJ2ZXJHcmlkLlRvb2xiYXJDZWxsKHsgdG9vbHRpcHM6IHRvb2x0aXBzIH0pLCBlZGl0YWJsZTogZmFsc2UsIHNvcnRhYmxlOiBmYWxzZSB9LFxuXHRcdF07XG5cblx0XHR0aGlzLmdyaWQgPSBuZXcgU2VydmVyR3JpZCh7XG5cdFx0XHRlbDogdGhpcy51aS5ncmlkLFxuXHRcdFx0Y29sdW1uczogY29sdW1ucyxcblx0XHRcdGNvbGxlY3Rpb246IG5ldyBBc3Nlc3NtZW50Q29sbGVjdGlvbigpLFxuXHRcdFx0Y2xpY2thYmxlOiB0cnVlLFxuXHRcdFx0Y291bnRlcjoge1xuXHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLmNvdW50ZXJCYXIsXG5cdFx0XHRcdHRlbXBsYXRlOiBcIkFzc2Vzc21lbnRzICRzdGFydCAtICRlbmQgb2YgJHRvdGFsXCIsXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdGVsZW1lbnQ6IHRoaXMudWkucGFnaW5nLFxuXHRcdFx0fSxcblx0XHR9KTtcblxuXHRcdHRoaXMuQ29sbGVjdGlvbiA9IHRoaXMuZ3JpZC5jb2xsZWN0aW9uO1xuXG5cdFx0dGhpcy5iaW5kRXZlbnRzKHRoaXMuQ29sbGVjdGlvbiwgdGhpcy5jb2xsZWN0aW9uRXZlbnRzKTtcblxuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ncmlkLCBcInJvdzpjbGlja2VkXCIsIHRoaXMub25HcmlkUm93Q2xpY2tlZC5iaW5kKHRoaXMpKTtcblxuXHRcdGNvbnN0IHRleHRGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcInRleHRcIixcblx0XHRcdG5hbWU6IFwidGV4dEZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiVGV4dCBTZWFyY2hcIixcblx0XHRcdGRlYm91bmNlOiAyMDAsXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdGNvbnN0IGxhbmd1YWdlRmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJsYW5ndWFnZUZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiTGFuZ3VhZ2VcIixcblx0XHRcdGNhdGVnb3JpZXM6IFtcblx0XHRcdFx0eyBpdGVtczogc2V0dGluZ3MubGFuZ3VhZ2VMaXN0IH0sXG5cdFx0XHRdLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdH07XG5cblx0XHRjb25zdCBzdWJqZWN0RmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJzdWJqZWN0RmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJTdWJqZWN0XCIsXG5cdFx0XHRzZXJ2ZXI6IHtcblx0XHRcdFx0a2V5OiBcInN1YmplY3RfaWRcIixcblx0XHRcdFx0dmFsdWU6IFwic3ViamVjdFwiLFxuXHRcdFx0XHRmZXRjaDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvZGF0YS9zdWJqZWN0c1wiLFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRwYWdlU2l6ZTogMzAsXG5cdFx0XHRcdGluZmluaXRlOiB0cnVlLFxuXHRcdFx0fSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgZ3JhZGVGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcImdyYWRlRmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJZZWFyIG9mIFN0dWR5XCIsXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0XHRjYXRlZ29yaWVzOiBfLm1hcChzZXR0aW5ncy5ncmFkZUxpc3QsICh2YWwsIGtleSkgPT4gKHtcblx0XHRcdFx0bGFiZWw6IGtleSxcblx0XHRcdFx0aXRlbXM6IF8ucmVkdWNlKHZhbC5zb3J0KChhLCBiKSA9PiAoXCJsZXhpY2FsXCIgaW4gYSA/IGEubGV4aWNhbCA6IGEubmFtZSkudG9VcHBlckNhc2UoKS5sb2NhbGVDb21wYXJlKChcImxleGljYWxcIiBpbiBiID8gYi5sZXhpY2FsIDogYi5uYW1lKS50b1VwcGVyQ2FzZSgpKSksXG5cdFx0XHRcdFx0KHN1bSwgbnVtKSA9PiB7IHN1bS5wdXNoKHsgbmFtZTogbnVtLnZhbHVlLCBsYWJlbDogbnVtLm5hbWUgfSk7IHJldHVybiBzdW07IH0sIFtdKSxcblx0XHRcdH0pKSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgY2F0cyA9IFtcblx0XHRcdHsgbmFtZTogXCJhc3Nlc3NtZW50XCIsIGxhYmVsOiBcIkFzc2Vzc21lbnRcIiB9LFxuXHRcdFx0eyBuYW1lOiBcImF1ZGlvXCIsIGxhYmVsOiBcIkF1ZGlvXCIgfSxcblx0XHRcdHsgbmFtZTogXCJmbGFzaGNhcmRkZWNrXCIsIGxhYmVsOiBcIkZsYXNoY2FyZCBEZWNrXCIgfSxcblx0XHRcdHsgbmFtZTogXCJpbWFnZVwiLCBsYWJlbDogXCJJbWFnZVwiIH0sXG5cdFx0XHR7IG5hbWU6IFwicGRmXCIsIGxhYmVsOiBcIlBERlwiIH0sXG5cdFx0XHR7IG5hbWU6IFwidGV4dFwiLCBsYWJlbDogXCJUZXh0XCIgfSxcblx0XHRcdHsgbmFtZTogXCJ1cmxcIiwgbGFiZWw6IFwiVVJMXCIgfSxcblx0XHRcdHsgbmFtZTogXCJ2aWRlb1wiLCBsYWJlbDogXCJWaWRlb1wiIH0sXG5cdFx0XTtcblxuXHRcdGlmIChzZXR0aW5ncy5vZmZpY2VDb250ZW50KSB7XG5cdFx0XHRjYXRzLnB1c2goeyBuYW1lOiBcImV4Y2VsXCIsIGxhYmVsOiBcIk1TIEV4Y2VsXCIgfSxcblx0XHRcdFx0eyBuYW1lOiBcInBvd2VycG9pbnRcIiwgbGFiZWw6IFwiTVMgUG93ZXJQb2ludFwiIH0sXG5cdFx0XHRcdHsgbmFtZTogXCJ3b3JkXCIsIGxhYmVsOiBcIk1TIFdvcmRcIiB9KTtcblx0XHR9XG5cblx0XHR0aGlzLnVpLmZpbHRlckJhci5wcmVwZW5kKHRoaXMuZ3JpZC5maWx0ZXIoe1xuXHRcdFx0ZmlsdGVyQ29udGFpbmVyOiB0aGlzLnVpLmZpbHRlckJhcixcblx0XHRcdGZpbHRlcnM6IFt0ZXh0RmlsdGVyLCBsYW5ndWFnZUZpbHRlciwgc3ViamVjdEZpbHRlciwgZ3JhZGVGaWx0ZXJdLFxuXHRcdFx0ZGVmYXVsdEZpbHRlcnM6IFtcInRleHRGaWx0ZXJcIl0sXG5cdFx0fSkucmVuZGVyKCkuZWwpO1xuXHR9LFxuXG5cdG9uR3JpZFJvd0NsaWNrZWQ6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0dGhpcy50cmlnZ2VyKFBhZ2UuRXZlbnRzLkFzc2Vzc21lbnRTZWxlY3RlZCwgbW9kZWwuZ2V0KFwiX2lkXCIpKTtcblx0fSxcbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IEluc3RhbmNlc1ZpZXcgPSBTZWN0aW9uVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiaW5zdGFuY2VzLXZpZXdcIixcblxuXHR1aToge1xuXHRcdGNvdW50ZXJCYXI6IFwiLm9wcy1iYXIgLmNvdW50ZXJcIixcblx0XHRwYWdpbmc6IFwiLnBhZ2luZ1wiLFxuXHRcdGZpbHRlckJhcjogXCIub3BzLWJhciAuZmlsdGVyc1wiLFxuXHRcdGdyaWQ6IFwiLmdyaWRcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0Xy5leHRlbmQodGhpcywgR3JpZE1peGluKTtcblxuXHRcdHRoaXMuT3B0aW9ucyA9IG9wdGlvbnMgPyBvcHRpb25zIDoge307XG5cblx0XHRfLmV4dGVuZCh0aGlzLk9wdGlvbnMsIHtcblx0XHRcdC8vIFNlY3Rpb24gVmlld1xuXHRcdFx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvbWFya3MubnVualwiKS5pbnN0YW5jZXMsXG5cdFx0fSk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGNvbHVtbnMgPSBbXG5cdFx0XHR7IG5hbWU6IFwidGl0bGVcIiwgbGFiZWw6IFwiVGl0bGVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiaXRlbVRpdGxlXCIsIGxhYmVsOiBcIkJvb2sgLyBHcm91cFwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UsIHNvcnRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImNyZWF0ZWRcIiwgbGFiZWw6IFwiQ3JlYXRlZFwiLCBlZGl0YWJsZTogZmFsc2UsIGNlbGw6IFNlcnZlckdyaWQuTW9tZW50Q2VsbC5leHRlbmQoe1xuXHRcdFx0XHRtb2RlbEluVW5peFRpbWVzdGFtcDogdHJ1ZSxcblx0XHRcdFx0ZGlzcGxheUZvcm1hdDogXCJERCBNTU0gWVlZWSwgSEg6bW0gYVwiLFxuXHRcdFx0XHRkaXNwbGF5SW5VVEM6IGZhbHNlLFxuXHRcdFx0fSkgfSxcblx0XHRdO1xuXG5cdFx0dGhpcy5ncmlkID0gbmV3IFNlcnZlckdyaWQoe1xuXHRcdFx0ZWw6IHRoaXMudWkuZ3JpZCxcblx0XHRcdGNvbHVtbnM6IGNvbHVtbnMsXG5cdFx0XHRjb2xsZWN0aW9uOiBuZXcgSW5zdGFuY2VDb2xsZWN0aW9uKFtdLCB7IGFzc2Vzc21lbnRJRDogdGhpcy5PcHRpb25zLmFzc2Vzc21lbnRJRCB9KSxcblx0XHRcdGNsaWNrYWJsZTogdHJ1ZSxcblx0XHRcdGNvdW50ZXI6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5jb3VudGVyQmFyLFxuXHRcdFx0XHR0ZW1wbGF0ZTogXCJJbnN0YW5jZXMgJHN0YXJ0IC0gJGVuZCBvZiAkdG90YWxcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5wYWdpbmcsXG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5Db2xsZWN0aW9uID0gdGhpcy5ncmlkLmNvbGxlY3Rpb247XG5cdFx0dGhpcy5iaW5kRXZlbnRzKHRoaXMuQ29sbGVjdGlvbiwgdGhpcy5jb2xsZWN0aW9uRXZlbnRzKTtcblxuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ncmlkLCBcInJvdzpjbGlja2VkXCIsIHRoaXMub25HcmlkUm93Q2xpY2tlZC5iaW5kKHRoaXMpKTtcblxuXHRcdGNvbnN0IHRleHRGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcInRleHRcIixcblx0XHRcdG5hbWU6IFwidGV4dEZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiVGV4dCBTZWFyY2hcIixcblx0XHRcdGRlYm91bmNlOiAyMDAsXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdHRoaXMudWkuZmlsdGVyQmFyLnByZXBlbmQodGhpcy5ncmlkLmZpbHRlcih7XG5cdFx0XHRmaWx0ZXJDb250YWluZXI6IHRoaXMudWkuZmlsdGVyQmFyLFxuXHRcdFx0ZmlsdGVyczogW3RleHRGaWx0ZXJdLFxuXHRcdFx0ZGVmYXVsdEZpbHRlcnM6IFtcInRleHRGaWx0ZXJcIl0sXG5cdFx0fSkucmVuZGVyKCkuZWwpO1xuXHR9LFxuXG5cdG9uR3JpZFJvd0NsaWNrZWQ6IGZ1bmN0aW9uKGluc3RhbmNlTW9kZWwpIHtcblx0XHR0aGlzLnRyaWdnZXIoUGFnZS5FdmVudHMuSW5zdGFuY2VTZWxlY3RlZCwgdGhpcy5PcHRpb25zLmFzc2Vzc21lbnRJRCwgaW5zdGFuY2VNb2RlbC5nZXQoXCJfaWRcIikpO1xuXHR9LFxufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgTWFya3NWaWV3ID0gU2VjdGlvblZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcIm1hcmtzLXZpZXdcIixcblxuXHR1aToge1xuXHRcdGZpbHRlckJhcjogXCIub3BzLWJhciAuZmlsdGVyc1wiLFxuXHRcdGNvdW50ZXJCYXI6IFwiLm9wcy1iYXIgLmNvdW50ZXJcIixcblx0XHR0ZXN0VG90YWw6IFwiLnRlc3QtdG90YWxcIixcblx0XHRkb3dubG9hZEJ1dHRvbjogXCIuYnV0dG9uLWRvd25sb2FkXCIsXG5cdFx0cmVmcmVzaEJ1dHRvbjogXCIuYnV0dG9uLXJlZnJlc2hcIixcblx0XHRwYWdpbmc6IFwiLnBhZ2luZ1wiLFxuXHRcdGdyaWQ6IFwiLmdyaWRcIixcblx0XHRkb3dubG9hZEluZGl2aWR1YWw6IFwiLmRvd25sb2FkLWluZGl2aWR1YWxcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5kb3dubG9hZEJ1dHRvblwiOiBcIm9uRG93bmxvYWRCdXR0b25DbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLnJlZnJlc2hCdXR0b25cIjogXCJvblJlZnJlc2hCdXR0b25DbGlja1wiLFxuXHR9LFxuXG5cdGNvbGxlY3Rpb25FdmVudHM6IHtcblx0XHRcImJ1dHRvbmNlbGw6Y2xpY2tlZFwiOiBcInBkZlJlcG9ydFwiLFxuXHRcdFwiY2VsbDpjbGlja2VkXCI6IFwib25HcmlkQ2VsbENsaWNrZWRcIixcblx0XHRcInJvdzpjbGlja2VkXCI6IFwib25OYW1lQ2xpY2tlZFwiLFxuXHRcdFwiaGVhZGVyOmNsaWNrZWRcIjogXCJvbkdyaWRDb2x1bW5DbGlja2VkXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuT3B0aW9ucyA9IG9wdGlvbnMgPyBvcHRpb25zIDoge307XG5cblx0XHRfLmV4dGVuZCh0aGlzLk9wdGlvbnMsIHtcblx0XHRcdC8vIFNlY3Rpb24gVmlld1xuXHRcdFx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvbWFya3MubnVualwiKS5tYXJrcyxcblx0XHR9KTtcblx0fSxcblxuXHRhc3Nlc3NtZW50RmV0Y2hFcnJvcjogZnVuY3Rpb24obW9kZWwsIHJlc3BvbnNlKSB7XG5cdFx0Y29uc3QgZXJyb3JDb250YWluZXIgPSAkKFwiLmVycm9yLWNvbnRhaW5lclwiLCB0aGlzLiRlbCk7XG5cdFx0Y29uc3QgbWVzc2FnZUNvbnRhaW5lciA9ICQoXCIubWVzc2FnZS1jb250YWluZXJcIiwgdGhpcy4kZWwpO1xuXG5cdFx0bWVzc2FnZUNvbnRhaW5lci5hZGRDbGFzcyhcImhpZGRlblwiKTtcblx0XHRlcnJvckNvbnRhaW5lci5yZW1vdmVDbGFzcyhcImhpZGRlblwiKTtcblx0XHRlcnJvckNvbnRhaW5lci5hcHBlbmQobmV3IEVycm9yVmlldyh7IGZldGNoRXJyb3I6IHJlc3BvbnNlIH0pLnJlbmRlcigpLiRlbCk7XG5cblx0XHRpZiAoIXNldHRpbmdzLmRlYnVnIHx8IHNldHRpbmdzLnJlcG9ydEVycm9ycylcblx0XHRcdHJheWd1bihcInNlbmRcIiwgcmVzcG9uc2UpO1xuXHRcdC8vUmF2ZW4uY2FwdHVyZUV4Y2VwdGlvbihyZXNwb25zZSk7XG5cdH0sXG5cblx0YWRkVG9vbHRpcDogZnVuY3Rpb24oZWxlbWVudCkge1xuXHRcdHRpcHB5KGVsZW1lbnQuZ2V0KDApLCB7XG5cdFx0XHR0aGVtZTogXCJibGFja1wiLFxuXHRcdFx0cGxhY2VtZW50OiBcImJvdHRvbVwiLFxuXHRcdFx0YXJyb3c6IHRydWUsXG5cdFx0fSk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGNvbHVtbnMgPSBbXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwiYXR0ZW1wdFwiLFxuXHRcdFx0XHRsYWJlbDogXCJBdHRlbXB0ICNcIixcblx0XHRcdFx0Y2VsbDogQmFja2dyaWQuQ2VsbC5leHRlbmQoe1xuXHRcdFx0XHRcdGNsYXNzTmFtZTogXCJjbGlja2FibGVcIixcblx0XHRcdFx0XHRldmVudHM6IHtcblx0XHRcdFx0XHRcdGNsaWNrOiBcIm9uQ2xpY2tcIixcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9uQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0dGhpcy5tb2RlbC5jb2xsZWN0aW9uLnRyaWdnZXIoXCJyb3c6Y2xpY2tlZFwiLCB0aGlzLm1vZGVsKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9KSxcblx0XHRcdFx0ZWRpdGFibGU6IGZhbHNlLFxuXHRcdFx0XHRzb3J0VmFsdWU6IFNlcnZlckdyaWQuc3RyaW5nU29ydCxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwib3duZXJTdXJuYW1lXCIsXG5cdFx0XHRcdGxhYmVsOiBcIlN1cm5hbWVcIixcblx0XHRcdFx0Y2VsbDogQmFja2dyaWQuQ2VsbC5leHRlbmQoe1xuXHRcdFx0XHRcdGNsYXNzTmFtZTogXCJjbGlja2FibGVcIixcblx0XHRcdFx0XHRldmVudHM6IHtcblx0XHRcdFx0XHRcdGNsaWNrOiBcIm9uQ2xpY2tcIixcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG9uQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0dGhpcy5tb2RlbC5jb2xsZWN0aW9uLnRyaWdnZXIoXCJyb3c6Y2xpY2tlZFwiLCB0aGlzLm1vZGVsKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9KSxcblx0XHRcdFx0ZWRpdGFibGU6IGZhbHNlLFxuXHRcdFx0XHRzb3J0VmFsdWU6IFNlcnZlckdyaWQuc3RyaW5nU29ydCxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwib3duZXJGaXJzdE5hbWVcIixcblx0XHRcdFx0bGFiZWw6IFwiRmlyc3QgTmFtZVwiLFxuXHRcdFx0XHRjZWxsOiBCYWNrZ3JpZC5DZWxsLmV4dGVuZCh7XG5cdFx0XHRcdFx0Y2xhc3NOYW1lOiBcImNsaWNrYWJsZVwiLFxuXHRcdFx0XHRcdGV2ZW50czoge1xuXHRcdFx0XHRcdFx0Y2xpY2s6IFwib25DbGlja1wiLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0b25DbGljazogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHR0aGlzLm1vZGVsLmNvbGxlY3Rpb24udHJpZ2dlcihcInJvdzpjbGlja2VkXCIsIHRoaXMubW9kZWwpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRlZGl0YWJsZTogZmFsc2UsXG5cdFx0XHRcdHNvcnRWYWx1ZTogU2VydmVyR3JpZC5zdHJpbmdTb3J0LFxuXHRcdFx0fSxcblx0XHRcdHsgbmFtZTogXCJ1c2VyR3JhZGVcIixcdGxhYmVsOiBcIkdyYWRlXCIsXHRjZWxsOiBcInN0cmluZ1wiLFx0ZWRpdGFibGU6IGZhbHNlLCBzb3J0VmFsdWU6IFNlcnZlckdyaWQuc3RyaW5nU29ydCB9LFxuXHRcdFx0eyBuYW1lOiBcInN0YXR1c1wiLCBsYWJlbDogXCJTdGF0dXNcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlLCBzb3J0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJtYXJrZWRcIiwgbGFiZWw6IFwiTWFya2VkXCIsIGNlbGw6IFNlcnZlckdyaWQuQm9vbGVhbkljb25DZWxsLmV4dGVuZCh7fSksIGVkaXRhYmxlOiBmYWxzZSwgc29ydGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwidG90YWxcIiwgbGFiZWw6IFwiVG90YWwgTWFya1wiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRdO1xuXG5cdFx0UGFnZS5yZXF1ZXN0KFBhZ2UuRXZlbnRzLkdldEFzc2Vzc21lbnQsIHRoaXMuT3B0aW9ucy5hc3Nlc3NtZW50SUQpLnRoZW4oYXNzZXNzbWVudCA9PiB7XG5cdFx0XHR0aGlzLkFzc2Vzc21lbnQgPSBhc3Nlc3NtZW50O1xuXHRcdFx0Y29uc3QgcXVlc3Rpb25EYXRhID0gdGhpcy5Bc3Nlc3NtZW50LmdldChcInF1ZXN0aW9uRGF0YVwiKTtcblx0XHRcdGxldCBxdWVzdGlvbkNvdW50ZXIgPSAxO1xuXG5cdFx0XHRjb25zdCBnZXRTY29yZSA9IGZ1bmN0aW9uKHF1ZXN0aW9uLCBzdWJtaXNzaW9uTW9kZWwpIHtcblx0XHRcdFx0bGV0IHNjb3JlID0gMDtcblxuXHRcdFx0XHRpZiAoc3VibWlzc2lvbk1vZGVsLmhhcyhcInBheWxvYWRcIikgJiYgc3VibWlzc2lvbk1vZGVsLmdldChcInBheWxvYWRcIikucmVzdWx0cykge1xuXHRcdFx0XHRcdGxldCBzY29yZURhdGEgPSBzdWJtaXNzaW9uTW9kZWwuZ2V0KFwicGF5bG9hZFwiKS5yZXN1bHRzO1xuXG5cdFx0XHRcdFx0aWYgKFwic2NvcmVzXCIgaW4gc2NvcmVEYXRhKSB7XG5cdFx0XHRcdFx0XHRzY29yZURhdGEgPSBzY29yZURhdGEuc2NvcmVzO1xuXG5cdFx0XHRcdFx0XHRjb25zdCBzY29yZURhdHVtID0gc2NvcmVEYXRhW3F1ZXN0aW9uLmlkXTtcblxuXHRcdFx0XHRcdFx0aWYgKCFzY29yZURhdHVtKVxuXHRcdFx0XHRcdFx0XHRzY29yZSA9IFwiTkFcIjtcblx0XHRcdFx0XHRcdGVsc2UgaWYgKHNjb3JlRGF0dW0uc2NvcmUgPT09IHVuZGVmaW5lZClcblx0XHRcdFx0XHRcdFx0c2NvcmUgPSBcIi1cIjtcblx0XHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdFx0c2NvcmUgPSBzY29yZURhdHVtLnNjb3JlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdHNjb3JlID0gXCItXCI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdHNjb3JlID0gXCJOQVwiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHNjb3JlO1xuXHRcdFx0fTtcblxuXHRcdFx0Xy5lYWNoKHF1ZXN0aW9uRGF0YSwgcXVlc3Rpb24gPT4ge1xuXHRcdFx0XHRsZXQgaGVhZGVyQ2VsbCA9IG51bGw7XG5cdFx0XHRcdGlmIChxdWVzdGlvbi50eXBlID09PSAyKSB7XG5cdFx0XHRcdFx0aGVhZGVyQ2VsbCA9IEJhY2tncmlkLkhlYWRlckNlbGwuZXh0ZW5kKHtcblx0XHRcdFx0XHRcdGNsYXNzTmFtZTogXCJjbGlja2FibGVcIixcblx0XHRcdFx0XHRcdGV2ZW50czoge1xuXHRcdFx0XHRcdFx0XHRjbGljazogXCJvbkNsaWNrXCIsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0b25DbGljazogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuY29sbGVjdGlvbi50cmlnZ2VyKFwiaGVhZGVyOmNsaWNrZWRcIiwgdGhpcy5jb2x1bW4uZ2V0KFwibmFtZVwiKSwgdGhpcy5jb2xsZWN0aW9uKTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29sdW1ucy5wdXNoKHtcblx0XHRcdFx0XHRuYW1lOiBxdWVzdGlvbi5pZCxcblx0XHRcdFx0XHRsYWJlbDogXCJRXCIgKyBxdWVzdGlvbkNvdW50ZXIrKyArICgocXVlc3Rpb24udHlwZSA9PT0gMikgPyBcIiAocGFyLilcIiA6IFwiXCIpICsgKHRoaXMuQXNzZXNzbWVudC5nZXQoXCJ2ZXJzaW9uXCIpID49IDUgPyBcIihcIiArIHF1ZXN0aW9uLnBvdGVudGlhbFNjb3JlICsgXCIpXCIgOiBcIlwiKSxcblx0XHRcdFx0XHRjZWxsOiBCYWNrZ3JpZC5DZWxsLmV4dGVuZCh7XG5cdFx0XHRcdFx0XHRjbGFzc05hbWU6IFwiY2xpY2thYmxlXCIsXG5cdFx0XHRcdFx0XHRldmVudHM6IHtcblx0XHRcdFx0XHRcdFx0Y2xpY2s6IFwib25DbGlja1wiLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG9uQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLm1vZGVsLmNvbGxlY3Rpb24udHJpZ2dlcihcImNlbGw6Y2xpY2tlZFwiLCB0aGlzLmNvbHVtbi5nZXQoXCJuYW1lXCIpLCB0aGlzLm1vZGVsKTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0aGVhZGVyQ2VsbDogaGVhZGVyQ2VsbCxcblx0XHRcdFx0XHRlZGl0YWJsZTogZmFsc2UsXG5cdFx0XHRcdFx0c29ydGFibGU6IGZhbHNlLFxuXHRcdFx0XHRcdGZvcm1hdHRlcjoge1xuXHRcdFx0XHRcdFx0ZnJvbVJhdzogZnVuY3Rpb24odmFsdWUsIG1vZGVsKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBnZXRTY29yZShxdWVzdGlvbiwgbW9kZWwpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0XHRjb25zdCBidG5PcHRpb25zID0ge1xuXHRcdFx0XHRjbGFzczogXCJkb3dubG9hZC1pbmRpdmlkdWFsXCIsXG5cdFx0XHRcdGlkOiBcImJ0bkRvd25sb2FkUmVwb3J0XCIsXG5cdFx0XHRcdHRleHQ6IFwiPHNwYW4gY2xhc3M9J2ZhbCBmYS1jbG91ZC1kb3dubG9hZCcgdGl0bGU9J0Rvd25sb2FkIFBERiBSZXBvcnQnIC8+XCIsXG5cdFx0XHR9O1xuXG5cdFx0XHRjb2x1bW5zLnB1c2goeyBsYWJlbDogXCJEb3dubG9hZFwiLCBjZWxsOiBuZXcgU2VydmVyR3JpZC5CdXR0b25DZWxsKGJ0bk9wdGlvbnMpLCBlZGl0YWJsZTogZmFsc2UsIHNvcnRhYmxlOiBmYWxzZSB9KTtcblxuXHRcdFx0Ly8gVXBkYXRlIHRoZSB0ZXN0IHRvdGFsXG5cdFx0XHRpZiAodGhpcy5Bc3Nlc3NtZW50LmhhcyhcIm1heFNjb3JlXCIpKVxuXHRcdFx0XHR0aGlzLnVpLnRlc3RUb3RhbC50ZXh0KFwiVGVzdCB0b3RhbDogXCIgKyB0aGlzLkFzc2Vzc21lbnQuZ2V0KFwibWF4U2NvcmVcIikpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLnVpLnRlc3RUb3RhbC50ZXh0KFwiXCIpO1xuXG5cdFx0XHR0aGlzLmdyaWQgPSBuZXcgU2VydmVyR3JpZCh7XG5cdFx0XHRcdGVsOiB0aGlzLnVpLmdyaWQsXG5cdFx0XHRcdGNvbHVtbnM6IGNvbHVtbnMsXG5cdFx0XHRcdGNvbGxlY3Rpb246IG5ldyBNYXJrQ29sbGVjdGlvbihbXSwgeyBhc3Nlc3NtZW50SUQ6IHRoaXMuT3B0aW9ucy5hc3Nlc3NtZW50SUQsIGluc3RhbmNlSUQ6IHRoaXMuT3B0aW9ucy5pbnN0YW5jZUlEIH0pLFxuXHRcdFx0XHRjbGlja2FibGU6IHRydWUsXG5cdFx0XHRcdGNvdW50ZXI6IHtcblx0XHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLmNvdW50ZXJCYXIsXG5cdFx0XHRcdFx0dGVtcGxhdGU6IFwiTWFya3MgJHN0YXJ0IC0gJGVuZCBvZiAkdG90YWxcIixcblx0XHRcdFx0fSxcblx0XHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5wYWdpbmcsXG5cdFx0XHRcdH0sXG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5Db2xsZWN0aW9uID0gdGhpcy5ncmlkLmNvbGxlY3Rpb247XG5cblx0XHRcdHRoaXMuYmluZEV2ZW50cyh0aGlzLkNvbGxlY3Rpb24sIHRoaXMuY29sbGVjdGlvbkV2ZW50cyk7XG5cblx0XHRcdGNvbnN0IHRleHRGaWx0ZXIgPSB7XG5cdFx0XHRcdHR5cGU6IFwidGV4dFwiLFxuXHRcdFx0XHRuYW1lOiBcInRleHRGaWx0ZXJcIixcblx0XHRcdFx0bGFiZWw6IFwiVGV4dCBTZWFyY2hcIixcblx0XHRcdFx0ZGVib3VuY2U6IDIwMCxcblx0XHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdFx0fTtcblxuXHRcdFx0Y29uc3QgZmlyc3RBdHRlbXB0RmlsdGVyID0ge1xuXHRcdFx0XHR0eXBlOiBcInRvZ2dsZVwiLFxuXHRcdFx0XHRuYW1lOiBcImZpcnN0QXR0ZW1wdEZpbHRlclwiLFxuXHRcdFx0XHRsYWJlbDogXCJPbmx5IHNob3cgZmlyc3QgYXR0ZW1wdFwiLFxuXHRcdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0XHRcdGluaXRpYWxWYWx1ZTogKCkgPT4gW3RydWVdLFxuXHRcdFx0fTtcblxuXHRcdFx0Y29uc3QgaW5jbHVkZUVkdWNhdG9yRmlsdGVyID0ge1xuXHRcdFx0XHR0eXBlOiBcInRvZ2dsZVwiLFxuXHRcdFx0XHRuYW1lOiBcImluY2x1ZGVFZHVjYXRvckZpbHRlclwiLFxuXHRcdFx0XHRsYWJlbDogXCJJbmNsdWRlIGVkdWNhdG9yIG1hcmtzXCIsXG5cdFx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHRcdFx0aW5pdGlhbFZhbHVlOiAoKSA9PiBbZmFsc2VdLFxuXHRcdFx0fTtcblxuXHRcdFx0Y29uc3QgaW5jbHVkZUxlYXZlckZpbHRlciA9IHtcblx0XHRcdFx0dHlwZTogXCJ0b2dnbGVcIixcblx0XHRcdFx0bmFtZTogXCJpbmNsdWRlTGVhdmVyRmlsdGVyXCIsXG5cdFx0XHRcdGxhYmVsOiBcIkluY2x1ZGUgbGVhdmVyIG1hcmtzXCIsXG5cdFx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHRcdFx0aW5pdGlhbFZhbHVlOiAoKSA9PiBbdHJ1ZV0sXG5cdFx0XHR9O1xuXG5cdFx0XHRjb25zdCBncmFkZUZpbHRlciA9IHtcblx0XHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0XHRuYW1lOiBcImdyYWRlRmlsdGVyXCIsXG5cdFx0XHRcdGxhYmVsOiBcIlllYXIgb2YgU3R1ZHlcIixcblx0XHRcdFx0Y2F0ZWdvcmllczogXy5tYXAoc2V0dGluZ3MuZ3JhZGVMaXN0LCAodmFsLCBrZXkpID0+ICh7XG5cdFx0XHRcdFx0bGFiZWw6IGtleSxcblx0XHRcdFx0XHRpdGVtczogXy5yZWR1Y2UodmFsLnNvcnQoKGEsIGIpID0+IChcImxleGljYWxcIiBpbiBhID8gYS5sZXhpY2FsIDogYS5uYW1lKS50b1VwcGVyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoKFwibGV4aWNhbFwiIGluIGIgPyBiLmxleGljYWwgOiBiLm5hbWUpLnRvVXBwZXJDYXNlKCkpKSxcblx0XHRcdFx0XHRcdChzdW0sIG51bSkgPT4geyBzdW0ucHVzaCh7IG5hbWU6IG51bS52YWx1ZSwgbGFiZWw6IG51bS5uYW1lIH0pOyByZXR1cm4gc3VtOyB9LCBbXSksXG5cdFx0XHRcdH0pKSxcblx0XHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdFx0fTtcblxuXHRcdFx0dGhpcy51aS5maWx0ZXJCYXIucHJlcGVuZCh0aGlzLmdyaWQuZmlsdGVyKHtcblx0XHRcdFx0ZmlsdGVyQ29udGFpbmVyOiB0aGlzLnVpLmZpbHRlckJhcixcblx0XHRcdFx0ZmlsdGVyczogW3RleHRGaWx0ZXIsIGZpcnN0QXR0ZW1wdEZpbHRlciwgaW5jbHVkZUVkdWNhdG9yRmlsdGVyLCBpbmNsdWRlTGVhdmVyRmlsdGVyLCBncmFkZUZpbHRlcl0sXG5cdFx0XHRcdGRlZmF1bHRGaWx0ZXJzOiBbXCJ0ZXh0RmlsdGVyXCIsIFwiZmlyc3RBdHRlbXB0RmlsdGVyXCIsIFwiaW5jbHVkZUVkdWNhdG9yRmlsdGVyXCJdLFxuXHRcdFx0fSkucmVuZGVyKCkuZWwpO1xuXG5cdFx0XHRyZXR1cm47XG5cdFx0fSkuYmluZCh0aGlzKS5jYXRjaCh0aGlzLmFzc2Vzc21lbnRGZXRjaEVycm9yLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdHJlZnJlc2g6IGZ1bmN0aW9uKHR5cGUpIHtcblx0XHRpZiAodHlwZSAmJiB0eXBlID09PSBcImxvY2FsXCIpIHtcblx0XHRcdHRoaXMuQ29sbGVjdGlvbi50cmlnZ2VyKFwicmVzZXRcIiwgdGhpcy5Db2xsZWN0aW9uLCB7IHNpbGVudDogZmFsc2UgfSk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5SZWFkeSA9IGZhbHNlO1xuXHRcdFx0dGhpcy5yZW5kZXIoKTtcblx0XHR9XG5cdH0sXG5cblx0b25Eb3dubG9hZEJ1dHRvbkNsaWNrOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0aWYgKHRoaXMuRG93bmxvYWRNZW51KSB7XG5cdFx0XHR0aGlzLkRvd25sb2FkTWVudS5kZXN0cm95KCk7XG5cdFx0XHR0aGlzLkRvd25sb2FkTWVudSA9IG51bGw7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5Eb3dubG9hZE1lbnUgPSBuZXcgU2ltcGxlTWVudSh7XG5cdFx0XHRcdGFuY2hvcjogdGhpcy51aS5kb3dubG9hZEJ1dHRvbixcblx0XHRcdFx0c2lkZTogXCJsZWZ0XCIsXG5cdFx0XHRcdHN0cnVjdHVyZTogW3tcblx0XHRcdFx0XHRjbG9zZU9uQ2xpY2s6IHRydWUsXG5cdFx0XHRcdFx0ZWxlbWVudHM6IFtcblx0XHRcdFx0XHRcdHsgdGV4dDogXCJNYXJrcyBpbiBhIENTViBmaWxlIChmb3IgYXNzZXNzbWVudCByZXN1bHRzKVwiLCBpZDogXCJjc3ZNYXJrc1wiIH0sXG5cdFx0XHRcdFx0XHR7IHRleHQ6IFwiQW5zd2VycyBpbiBhIENTViBmaWxlIChmb3IgcXVlc3Rpb25uYWlyZXMpXCIsIGlkOiBcImNzdkFuc3dlcnNcIiB9LFxuXHRcdFx0XHRcdFx0eyB0ZXh0OiBcIk1hcmtzLCBxdWVzdGlvbnMsIGFuZCBzdGF0aXN0aWNzIGluIGEgUERGIGZpbGUgKGZvciByZXBvcnRzKVwiLCBpZDogXCJwZGZcIiB9LFxuXHRcdFx0XHRcdF0gfSxcblx0XHRcdFx0XSB9KTtcblxuXHRcdFx0dGhpcy5Eb3dubG9hZE1lbnUuc2hvdygpO1xuXG5cdFx0XHR0aGlzLmxpc3RlblRvKHRoaXMuRG93bmxvYWRNZW51LCBcImNsaWNrZWQ6Y3N2TWFya3NcIiwgKCkgPT4ge1xuXHRcdFx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9hc3Nlc3NtZW50cy9cIiArIHRoaXMuT3B0aW9ucy5hc3Nlc3NtZW50SUQgKyBcIi9tYXJrcy9cIiArIHRoaXMuT3B0aW9ucy5pbnN0YW5jZUlEICtcblx0XHRcdFx0XHRcIi9yYXc/aW5jbHVkZUVkdWNhdG9ycz1cIiArIHRoaXMuZ3JpZC5maWx0ZXIuc2VydmVyUGFyYW1zLmluY2x1ZGVFZHVjYXRvckZpbHRlclswXSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLkRvd25sb2FkTWVudSwgXCJjbGlja2VkOmNzdkFuc3dlcnNcIiwgKCkgPT4ge1xuXHRcdFx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9hc3Nlc3NtZW50cy9cIiArIHRoaXMuT3B0aW9ucy5hc3Nlc3NtZW50SUQgKyBcIi9hbnN3ZXJzL1wiICsgdGhpcy5PcHRpb25zLmluc3RhbmNlSUQgK1xuXHRcdFx0XHRcdFwiL3Jhdz9pbmNsdWRlRWR1Y2F0b3JzPVwiICsgdGhpcy5ncmlkLmZpbHRlci5zZXJ2ZXJQYXJhbXMuaW5jbHVkZUVkdWNhdG9yRmlsdGVyWzBdKTtcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLmxpc3RlblRvKHRoaXMuRG93bmxvYWRNZW51LCBcImNsaWNrZWQ6cGRmXCIsICgpID0+IHtcblx0XHRcdFx0d2luZG93Lm9wZW4oc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvYXNzZXNzbWVudHMvXCIgKyB0aGlzLk9wdGlvbnMuYXNzZXNzbWVudElEICsgXCIvbWFya3MvXCIgKyB0aGlzLk9wdGlvbnMuaW5zdGFuY2VJRCArXG5cdFx0XHRcdFx0XCIvcmVwb3J0P2FsbE1hcmtzPXRydWUmaW5jbHVkZUVkdWNhdG9ycz1cIiArIHRoaXMuZ3JpZC5maWx0ZXIuc2VydmVyUGFyYW1zLmluY2x1ZGVFZHVjYXRvckZpbHRlclswXSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLkRvd25sb2FkTWVudSwgXCJjbG9zaW5nXCIsICgpID0+IHsgdGhpcy5Eb3dubG9hZE1lbnUgPSBudWxsOyB9KTtcblx0XHR9XG5cdH0sXG5cblx0b25SZWZyZXNoQnV0dG9uQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMucmVmcmVzaCgpO1xuXHR9LFxuXG5cdG9uTmFtZUNsaWNrZWQ6IGZ1bmN0aW9uKHN1Ym1pc3Npb25Nb2RlbCkge1xuXHRcdHRoaXMudHJpZ2dlcihQYWdlLkV2ZW50cy5TdWJtaXNzaW9uU2VsZWN0ZWQsIHRoaXMuT3B0aW9ucy5hc3Nlc3NtZW50SUQsIHRoaXMuT3B0aW9ucy5pbnN0YW5jZUlELCBzdWJtaXNzaW9uTW9kZWwuZ2V0KFwiX2lkXCIpKTtcblx0fSxcblxuXHRvbkdyaWRDb2x1bW5DbGlja2VkOiBmdW5jdGlvbihuYW1lLCBjb2xsZWN0aW9uKSB7XG5cdFx0Ly8gUmV0cmlldmUgYWxsIHF1ZXN0aW9ucyBmcm9tIHRoZSBlbmNyeXB0ZWQgYXNzZXNzbWVudFxuXHRcdGNvbnN0IHF1ZXN0aW9uRGF0YSA9IHRoaXMuQXNzZXNzbWVudC5nZXQoXCJxdWVzdGlvbkRhdGFcIik7XG5cblx0XHQvLyBGaW5kIHRoZSBxdWVzdGlvbiByZWZlcmVuY2VkIGJ5IHRoaXMgY29sdW1uXG5cdFx0Y29uc3QgcXVlc3Rpb24gPSBfLmZpbmQocXVlc3Rpb25EYXRhLCBxID0+IHEuaWQgPT09IG5hbWUpO1xuXG5cdFx0Ly8gSWYgdGhpcyBpcyBhIHBhcmFncmFwaCBxdWVzdGlvbiBhbmQgdGhlcmUgYXJlIHN1Ym1pc3Npb25zLi4uXG5cdFx0aWYgKHF1ZXN0aW9uLnR5cGUgPT09IDIgJiYgY29sbGVjdGlvbi5sZW5ndGggPiAwKSB7XG5cdFx0XHQvLyAuLi50aGVuIGRpc3BsYXkgdGhlIGV2YWx1YXRpb24gbW9kYWxcblx0XHRcdGNvbnN0IG1vZGFsID0gbmV3IEV2YWx1YXRpb25Nb2RhbCh7XG5cdFx0XHRcdHF1ZXN0aW9uOiBxdWVzdGlvbixcblx0XHRcdFx0YW5zd2VyczogY29sbGVjdGlvbixcblx0XHRcdFx0Z3JpZDogdGhpcy5ncmlkLFxuXHRcdFx0fSk7XG5cblx0XHRcdG1vZGFsLnNob3coe1xuXHRcdFx0XHRjbG9zZTogcmVzdWx0ID0+IHtcblx0XHRcdFx0XHR0aGlzLnVpLnBhZ2luZy5hcHBlbmQodGhpcy5ncmlkLnBhZ2luYXRvci5yZW5kZXIoKS5lbCk7XG5cdFx0XHRcdFx0aWYgKHJlc3VsdC5kYXRhQ2hhbmdlZClcblx0XHRcdFx0XHRcdHRoaXMucmVmcmVzaChcImxvY2FsXCIpO1xuXHRcdFx0XHR9LFxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdG9uR3JpZENlbGxDbGlja2VkOiBmdW5jdGlvbihjb2x1bW4sIG1vZGVsKSB7XG5cdFx0Ly8gUmV0cmlldmUgYWxsIHF1ZXN0aW9ucyBmcm9tIHRoZSBlbmNyeXB0ZWQgYXNzZXNzbWVudFxuXHRcdGNvbnN0IHF1ZXN0aW9uRGF0YSA9IHRoaXMuQXNzZXNzbWVudC5nZXQoXCJxdWVzdGlvbkRhdGFcIik7XG5cblx0XHQvLyBGaW5kIHRoZSBxdWVzdGlvbiByZWZlcmVuY2VkIGJ5IHRoaXMgY29sdW1uXG5cdFx0Y29uc3QgcXVlc3Rpb24gPSBfLmZpbmQocXVlc3Rpb25EYXRhLCBxID0+IHEuaWQgPT09IGNvbHVtbik7XG5cblx0XHQvLyBDb21waWxlIGFsbCBwb3NzaWJsZSBhbnN3ZXJzIGZvciB0aGlzIHF1ZXN0aW9uXG5cdFx0bGV0IGFuc3dlcnMgPSBudWxsO1xuXG5cdFx0c3dpdGNoIChxdWVzdGlvbi50eXBlKSB7XG5cdFx0XHRjYXNlIDE6XG5cdFx0XHRcdGFuc3dlcnMgPSBfLmZsYXR0ZW4oW3F1ZXN0aW9uLmNvcnJlY3RBbnN3ZXJzLCBxdWVzdGlvbi5vdGhlckFuc3dlcnNdKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgMzpcblx0XHRcdFx0YW5zd2VycyA9IHtcblx0XHRcdFx0XHRsZWZ0OiBxdWVzdGlvbi5sZWZ0LFxuXHRcdFx0XHRcdHJpZ2h0OiBxdWVzdGlvbi5yaWdodCxcblx0XHRcdFx0fTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgNDpcblx0XHRcdFx0YW5zd2VycyA9IFtxdWVzdGlvbi5hbnN3ZXJdO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXG5cdFx0Ly8gV3JpdGUgb3V0IHRoZSBxdWVzdGlvbiB0ZXh0XG5cdFx0bGV0IHRleHQgPSBcIjxzdHJvbmc+VGV4dDogPC9zdHJvbmc+XCIgKyBxdWVzdGlvbi5xdWVzdGlvbiArIFwiPGJyLz48YnIvPlwiO1xuXG5cdFx0Ly8gV3JpdGUgb3V0IHRoZSBjb3JyZWN0IGFuc3dlcnNcblx0XHR0ZXh0ICs9IFwiPHN0cm9uZz5Db3JyZWN0IEFuc3dlcihzKTogPC9zdHJvbmc+XCI7XG5cblx0XHRjb25zdCB0eXBlc2V0Q29udGVudCA9IGZ1bmN0aW9uKGNvbnRlbnQpIHtcblx0XHRcdGxldCByZXN1bHQgPSBudWxsO1xuXG5cdFx0XHRpZiAoXy5zdGFydHNXaXRoKGNvbnRlbnQsIFwiZGF0YTppbWFnZVwiKSlcblx0XHRcdFx0cmVzdWx0ID0gXCI8aW1nIHdpZHRoPSc2NCcgaGVpZ2h0PSc2NCcgc3JjPSdcIiArIGNvbnRlbnQgKyBcIicgc3R5bGU9J2Rpc3BsYXk6IGlubGluZScgLz4mbmJzcDtcIjtcblx0XHRcdGVsc2Vcblx0XHRcdFx0cmVzdWx0ID0gY29udGVudC5yZXBsYWNlKC9bXFwmXFw8XFw+XFwnXFxcIl0vZywgeCA9PiBcIiYjXCIgKyB4LmNoYXJDb2RlQXQoMCkgKyBcIjtcIik7XG5cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fTtcblxuXHRcdHN3aXRjaCAocXVlc3Rpb24udHlwZSkge1xuXHRcdFx0Y2FzZSAxOlxuXHRcdFx0XHRfLmVhY2gocXVlc3Rpb24uY29ycmVjdEFuc3dlcnMsIGFuc3dlciA9PiB7XG5cdFx0XHRcdFx0dGV4dCArPSB0eXBlc2V0Q29udGVudChhbnN3ZXIuY29udGVudCkgKyBcIiBcIjtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIDI6XG5cdFx0XHRcdHRleHQgKz0gXCJObyBhbnN3ZXJzIGF2YWlsYWJsZSBmb3IgdGhpcyBxdWVzdGlvbiB0eXBlLlwiO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAzOlxuXHRcdFx0XHRfLmVhY2goYW5zd2Vycy5sZWZ0LCBsZWZ0ID0+IHtcblx0XHRcdFx0XHR0ZXh0ICs9IHR5cGVzZXRDb250ZW50KGxlZnQuY29udGVudCkgKyBcIiBbK10gXCIgKyB0eXBlc2V0Q29udGVudChfLmZpbmQoYW5zd2Vycy5yaWdodCwgcmlnaHQgPT4gcmlnaHQuaWQgPT09IGxlZnQuaWQpLmNvbnRlbnQpICsgXCI7IFwiO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgNDpcblx0XHRcdFx0dGV4dCArPSB0eXBlc2V0Q29udGVudChxdWVzdGlvbi5hbnN3ZXIuY29udGVudCk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHR0ZXh0ICs9IFwiPGJyLz48YnIvPlwiO1xuXG5cdFx0Ly8gV3JpdGUgb3V0IHRoZSBzdHVkZW50J3MgYW5zd2Vyc1xuXHRcdHRleHQgKz0gXCI8c3Ryb25nPlN0dWRlbnQgQW5zd2VyKHMpOiA8L3N0cm9uZz5cIjtcblxuXHRcdGlmICghbW9kZWwuZ2V0KFwicGF5bG9hZFwiKSB8fCAhbW9kZWwuZ2V0KFwicGF5bG9hZFwiKS5yZXN1bHRzIHx8ICFtb2RlbC5nZXQoXCJwYXlsb2FkXCIpLnJlc3VsdHMuc2NvcmVzIHx8ICFtb2RlbC5nZXQoXCJwYXlsb2FkXCIpLnJlc3VsdHMuc2NvcmVzW2NvbHVtbl0pIHtcblx0XHRcdHRleHQgKz0gXCJbTm90IGF0dGVtcHRlZF1cIjtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRjb25zdCBzdHVkZW50QW5zd2VycyA9IG1vZGVsLmdldChcInBheWxvYWRcIikucmVzdWx0cy5zY29yZXNbY29sdW1uXS5hbnN3ZXJzO1xuXG5cdFx0XHRzd2l0Y2ggKHF1ZXN0aW9uLnR5cGUpIHtcblx0XHRcdFx0Y2FzZSAxOlxuXHRcdFx0XHRcdF8uZWFjaChzdHVkZW50QW5zd2Vycywgc3R1ZGVudEFuc3dlciA9PiB7XG5cdFx0XHRcdFx0XHR0ZXh0ICs9IHR5cGVzZXRDb250ZW50KF8uZmluZChhbnN3ZXJzLCBhbnN3ZXIgPT4gYW5zd2VyLmlkID09PSBzdHVkZW50QW5zd2VyKS5jb250ZW50KSArIFwiIFwiO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgMjpcblx0XHRcdFx0XHR0ZXh0ICs9IFwiTm8gYW5zd2VycyBhdmFpbGFibGUgZm9yIHRoaXMgcXVlc3Rpb24gdHlwZS5cIjtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIDM6XG5cdFx0XHRcdFx0Xy5lYWNoKHN0dWRlbnRBbnN3ZXJzLCBzdHVkZW50QW5zd2VyID0+IHtcblx0XHRcdFx0XHRcdHRleHQgKz0gdHlwZXNldENvbnRlbnQoXy5maW5kKGFuc3dlcnMubGVmdCwgbGVmdCA9PiBsZWZ0LmlkID09PSBzdHVkZW50QW5zd2VyLmxlZnQpLmNvbnRlbnQpO1xuXHRcdFx0XHRcdFx0dGV4dCArPSBcIiBbK10gXCI7XG5cdFx0XHRcdFx0XHR0ZXh0ICs9IHR5cGVzZXRDb250ZW50KF8uZmluZChhbnN3ZXJzLnJpZ2h0LCByaWdodCA9PiByaWdodC5pZCA9PT0gc3R1ZGVudEFuc3dlci5yaWdodCkuY29udGVudCk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSA0OlxuXHRcdFx0XHRcdF8uZWFjaChzdHVkZW50QW5zd2Vycywgc3R1ZGVudEFuc3dlciA9PiB7XG5cdFx0XHRcdFx0XHR0ZXh0ICs9IFwiW1wiICsgdHlwZXNldENvbnRlbnQoc3R1ZGVudEFuc3dlcikgKyBcIl0gXCI7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBtb2RhbCA9IG5ldyBTbWFsbE1vZGFsKHtcblx0XHRcdHRpdGxlOiBcIlF1ZXN0aW9uIFwiICsgY29sdW1uLFxuXHRcdFx0Ym9keTogdGV4dCxcblx0XHRcdGhvc3Q6IFwiYm9keVwiLFxuXHRcdFx0aGlkZUJ1dHRvbnM6IFtcImNhbmNlbFwiXSxcblx0XHR9KTtcblxuXHRcdG1vZGFsLnNob3coKTtcblx0fSxcblxuXHRwZGZSZXBvcnQ6IGZ1bmN0aW9uKGNvbHVtbiwgbW9kZWwpIHtcblx0XHRpZiAobW9kZWwuZ2V0KFwiYXR0ZW1wdFwiKSA9PT0gMCkge1xuXHRcdFx0Y29uc3QgbW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHRcdHRpdGxlOiBcIlBERiBSZXBvcnRcIixcblx0XHRcdFx0d2FybmluZzogdHJ1ZSxcblx0XHRcdFx0Ym9keTogXCJUaGVyZSBpcyBubyByZXBvcnQgYXZhaWxhYmxlIGZvciB0aGlzIHVzZXIgYmVjYXVzZSB0aGUgdXNlciBoYXMgbm90IGF0dGVtcHRlZCB0aGUgYXNzZXNzbWVudCBhdCBsZWFzdCBvbmNlLlwiLFxuXHRcdFx0XHRob3N0OiBcImJvZHlcIixcblx0XHRcdFx0aGlkZUJ1dHRvbnM6IFtcImNhbmNlbFwiXSxcblx0XHRcdH0pO1xuXG5cdFx0XHRtb2RhbC5zaG93KCk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0d2luZG93Lm9wZW4oc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvYXNzZXNzbWVudHMvXCIgKyBtb2RlbC5nZXQoXCJhc3Nlc3NtZW50XCIpICsgXCIvbWFya3MvXCIgKyBtb2RlbC5nZXQoXCJhdHRhY2htZW50XCIpICtcblx0XHRcdFx0XCIvcmVwb3J0P3N0dWRlbnRBbnN3ZXJzPXRydWUmYXNzZXNzbWFyaz1cIiArIG1vZGVsLmdldChcIl9pZFwiKSk7XG5cdFx0fVxuXHR9LFxufSk7XG5cbmNvbnN0IEFjdGl2aXR5RGV0YWlsc1ZpZXcgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGFnOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwiYWN0aXZpdHktZGV0YWlsc1wiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL21hcmtzLm51bmpcIikuYWN0aXZpdHlEZXRhaWxzLFxuXG5cdHRlbXBsYXRlQ29udGV4dDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHN0YXJ0OiAoKSA9PiB0aGlzLm1vZGVsLmdldChcInN0YXJ0XCIpLFxuXHRcdFx0ZW5kOiAoKSA9PiB0aGlzLm1vZGVsLmdldChcImVuZFwiKSxcblx0XHR9O1xuXHR9LFxufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgQWN0aXZpdHlWaWV3ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdHRhZzogXCJkaXZcIixcblx0Y2xhc3NOYW1lOiBcImFjdGl2aXR5XCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvbWFya3MubnVualwiKS5hY3Rpdml0eSxcblxuXHRldmVudHM6IHtcblx0XHRtb3VzZW92ZXI6IFwib25IaWdobGlnaHRcIixcblx0XHRtb3VzZW91dDogXCJvbkxvd2xpZ2h0XCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuVG90YWxEdXJhdGlvbiA9IG9wdGlvbnMudG90YWxEdXJhdGlvbjtcblxuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwgXCJhY3Rpdml0eS1kdXJhdGlvbjpoaWdobGlnaHRcIiwgdGhpcy5vbkhpZ2hsaWdodC5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsIFwiYWN0aXZpdHktZHVyYXRpb246bG93bGlnaHRcIiwgdGhpcy5vbkxvd2xpZ2h0LmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC5jc3Moe1xuXHRcdFx0d2lkdGg6IE1hdGgucm91bmQodGhpcy5tb2RlbC5nZXQoXCJkdXJhdGlvblwiKSAvIHRoaXMuVG90YWxEdXJhdGlvbiAqIDEwMCkgKyBcIiVcIixcblx0XHR9KTtcblxuXHRcdHRoaXMuRGV0YWlsVG9vbHRpcCA9IG5ldyBBY3Rpdml0eURldGFpbHNWaWV3KHsgbW9kZWw6IHRoaXMubW9kZWwgfSk7XG5cdFx0dGhpcy5EZXRhaWxUb29sdGlwLnJlbmRlcigpO1xuXG5cdFx0dGlwcHkodGhpcy4kZWwuZ2V0KDApLCB7XG5cdFx0XHR0aGVtZTogXCJibGFja1wiLFxuXHRcdFx0cGxhY2VtZW50OiBcInRvcFwiLFxuXHRcdFx0YXJyb3c6IHRydWUsXG5cdFx0XHRjb250ZW50OiB0aGlzLkRldGFpbFRvb2x0aXAuJGVsLmdldCgwKSxcblx0XHR9KTtcblx0fSxcblxuXHRvbkhpZ2hsaWdodDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLkhpZ2hsaWdodGVkKSB7XG5cdFx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcImFjdGl2aXR5LWhpZ2hsaWdodGVkXCIpO1xuXHRcdFx0Y29uc3QgdGlwID0gdGhpcy4kZWwuZ2V0KDApLl90aXBweTtcblx0XHRcdHRpcC5zaG93KCk7XG5cblx0XHRcdHRoaXMuSGlnaGxpZ2h0ZWQgPSB0cnVlO1xuXHRcdH1cblx0fSxcblxuXHRvbkxvd2xpZ2h0OiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5IaWdobGlnaHRlZCkge1xuXHRcdFx0dGhpcy4kZWwucmVtb3ZlQ2xhc3MoXCJhY3Rpdml0eS1oaWdobGlnaHRlZFwiKTtcblx0XHRcdGNvbnN0IHRpcCA9IHRoaXMuJGVsLmdldCgwKS5fdGlwcHk7XG5cdFx0XHR0aXAuaGlkZSgpO1xuXG5cdFx0XHR0aGlzLkhpZ2hsaWdodGVkID0gZmFsc2U7XG5cdFx0fVxuXHR9LFxufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgQWN0aXZpdHlUaW1lbGluZUJvZHlWaWV3ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5Db2xsZWN0aW9uVmlldy5leHRlbmQoe1xuXHR0YWc6IFwiZGl2XCIsXG5cdGNsYXNzTmFtZTogXCJhY3Rpdml0eS10aW1lbGluZS1ib2R5XCIsXG5cblx0dGVtcGxhdGU6IGZhbHNlLFxuXG5cdGNoaWxkVmlldzogQWN0aXZpdHlWaWV3LFxuXG5cdGNoaWxkVmlld09wdGlvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHR0b3RhbER1cmF0aW9uOiB0aGlzLlRvdGFsRHVyYXRpb24sXG5cdFx0fTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5Ub3RhbER1cmF0aW9uID0gb3B0aW9ucy50b3RhbER1cmF0aW9uO1xuXHR9LFxufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgQWN0aXZpdHlUaW1lbGluZVZpZXcgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGFnOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwiYWN0aXZpdHktdGltZWxpbmVcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9tYXJrcy5udW5qXCIpLmFjdGl2aXR5VGltZWxpbmUsXG5cblx0dWk6IHtcblx0XHR2YWx1ZUNvbXBsZXRpb25UaW1lOiBcIi5jb21wbGV0aW9uLXRpbWVcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5Db2xsZWN0aW9uID0gb3B0aW9ucy5jb2xsZWN0aW9uO1xuXG5cdFx0dGhpcy5jb21wdXRlVG90YWxEdXJhdGlvbigpO1xuXHR9LFxuXG5cdGNvbXB1dGVUb3RhbER1cmF0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLlRvdGFsRHVyYXRpb24gPSB0aGlzLkNvbGxlY3Rpb24ubGVuZ3RoID4gMCA/IHRoaXMuQ29sbGVjdGlvbi5yZWR1Y2UoKG1lbW8sIGFjdGl2aXR5RHVyYXRpb24pID0+IG1lbW8gKyBhY3Rpdml0eUR1cmF0aW9uLmdldChcImR1cmF0aW9uXCIpLCAwKSA6IDA7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuVGltZWxpbmVCb2R5ID0gbmV3IEFjdGl2aXR5VGltZWxpbmVCb2R5Vmlldyh7IGNvbGxlY3Rpb246IHRoaXMuQ29sbGVjdGlvbiwgdG90YWxEdXJhdGlvbjogdGhpcy5Ub3RhbER1cmF0aW9uIH0pO1xuXHRcdHRoaXMuJGVsLnByZXBlbmQodGhpcy5UaW1lbGluZUJvZHkucmVuZGVyKCkuJGVsKTtcblxuXHRcdGxldCBjb21wbGV0aW9uVGltZSA9IE1hdGgucm91bmQobW9tZW50LmR1cmF0aW9uKHRoaXMuVG90YWxEdXJhdGlvbikuYXNNaW51dGVzKCkpO1xuXHRcdGxldCBjb21wbGV0aW9uVGltZVVuaXQgPSBcIm1pbnV0ZVwiO1xuXG5cdFx0aWYgKGNvbXBsZXRpb25UaW1lIDwgMS4wKSB7XG5cdFx0XHRjb21wbGV0aW9uVGltZSA9IE1hdGgucm91bmQobW9tZW50LmR1cmF0aW9uKHRoaXMuVG90YWxEdXJhdGlvbikuYXNTZWNvbmRzKCkpO1xuXHRcdFx0Y29tcGxldGlvblRpbWVVbml0ID0gXCJzZWNvbmRcIjtcblx0XHR9XG5cblx0XHRpZiAoY29tcGxldGlvblRpbWUgIT09IDEpXG5cdFx0XHRjb21wbGV0aW9uVGltZVVuaXQgKz0gXCJzXCI7XG5cblx0XHR0aGlzLnVpLnZhbHVlQ29tcGxldGlvblRpbWUudGV4dChjb21wbGV0aW9uVGltZSArIFwiIFwiICsgY29tcGxldGlvblRpbWVVbml0KTtcblx0fSxcbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IERldGFpbHNWaWV3ID0gU2VjdGlvblZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImRldGFpbHMtdmlld1wiLFxuXG5cdHVpOiB7XG5cdFx0YWN0aXZpdHlUaW1lbGluZUNvbnRhaW5lcjogXCIuYWN0aXZpdHktdGltZWxpbmUtY29udGFpbmVyXCIsXG5cdFx0Z3JpZDogXCJkaXYuZ3JpZFwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2VsbDptb3VzZW92ZXJcIjogXCJvbkdyaWRDZWxsTW91c2VPdmVyXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuT3B0aW9ucyA9IG9wdGlvbnMgPyBvcHRpb25zIDoge307XG5cblx0XHRfLmV4dGVuZCh0aGlzLk9wdGlvbnMsIHtcblx0XHRcdC8vIFNlY3Rpb24gVmlld1xuXHRcdFx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvbWFya3MubnVualwiKS5kZXRhaWxzLFxuXHRcdH0pO1xuXHR9LFxuXG5cdGZldGNoRXJyb3I6IGZ1bmN0aW9uKG1vZGVsLCByZXNwb25zZSkge1xuXHRcdGNvbnN0IGVycm9yQ29udGFpbmVyID0gJChcIi5lcnJvci1jb250YWluZXJcIiwgdGhpcy4kZWwpO1xuXHRcdGNvbnN0IG1lc3NhZ2VDb250YWluZXIgPSAkKFwiLm1lc3NhZ2UtY29udGFpbmVyXCIsIHRoaXMuJGVsKTtcblxuXHRcdG1lc3NhZ2VDb250YWluZXIuYWRkQ2xhc3MoXCJoaWRkZW5cIik7XG5cdFx0ZXJyb3JDb250YWluZXIucmVtb3ZlQ2xhc3MoXCJoaWRkZW5cIik7XG5cdFx0ZXJyb3JDb250YWluZXIuYXBwZW5kKG5ldyBFcnJvclZpZXcoeyBmZXRjaEVycm9yOiByZXNwb25zZSB9KS5yZW5kZXIoKS4kZWwpO1xuXG5cdFx0aWYgKCFzZXR0aW5ncy5kZWJ1ZyB8fCBzZXR0aW5ncy5yZXBvcnRFcnJvcnMpXG5cdFx0XHRyYXlndW4oXCJzZW5kXCIsIHJlc3BvbnNlKTtcblx0XHQvL1JhdmVuLmNhcHR1cmVFeGNlcHRpb24ocmVzcG9uc2UpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBhc3luYyBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5SZWFkeSkge1xuXHRcdFx0Y29uc3QgY29sdW1ucyA9IFtcblx0XHRcdFx0eyBuYW1lOiBcInN1cm5hbWVcIiwgbGFiZWw6IFwiU3VybmFtZVwiLCBlZGl0YWJsZTogZmFsc2UsIGNlbGw6IFwic3RyaW5nXCIgfSxcblx0XHRcdFx0eyBuYW1lOiBcImZpcnN0bmFtZVwiLCBsYWJlbDogXCJGaXJzdCBOYW1lXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0XTtcblxuXHRcdFx0Y29uc3QgcXVlc3Rpb25EYXRhID0gdGhpcy5Bc3Nlc3NtZW50LmdldChcInF1ZXN0aW9uRGF0YVwiKTtcblxuXHRcdFx0bGV0IHF1ZXN0aW9uQ291bnRlciA9IDE7XG5cblx0XHRcdF8uZWFjaChxdWVzdGlvbkRhdGEsIHF1ZXN0aW9uID0+IHtcblx0XHRcdFx0Y29uc3QgbGFiZWwgPSBcIlFcIiArIHF1ZXN0aW9uQ291bnRlcisrICsgKHF1ZXN0aW9uLnR5cGUgPT09IDIgPyBcIiAocGFyLilcIiA6IFwiXCIpO1xuXHRcdFx0XHRjb2x1bW5zLnB1c2goe1xuXHRcdFx0XHRcdG5hbWU6IHF1ZXN0aW9uLmlkLFxuXHRcdFx0XHRcdGxhYmVsOiBsYWJlbCxcblx0XHRcdFx0XHRlZGl0YWJsZTogZmFsc2UsXG5cdFx0XHRcdFx0Zm9ybWF0dGVyOiB7XG5cdFx0XHRcdFx0XHRmcm9tUmF3OiBmdW5jdGlvbih2YWx1ZSwgbW9kZWwpIHtcblx0XHRcdFx0XHRcdFx0bGV0IHNjb3JlID0gMDtcblxuXHRcdFx0XHRcdFx0XHRpZiAobW9kZWwuZ2V0KFwicGF5bG9hZFwiKS5yZXN1bHRzKSB7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IHNjb3JlRGF0YSA9IG1vZGVsLmdldChcInBheWxvYWRcIikucmVzdWx0cztcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChcInNjb3Jlc1wiIGluIHNjb3JlRGF0YSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0c2NvcmVEYXRhID0gc2NvcmVEYXRhLnNjb3JlcztcblxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3Qgc2NvcmVEYXR1bSA9IHNjb3JlRGF0YVtxdWVzdGlvbi5pZF07XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmICghc2NvcmVEYXR1bSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0c2NvcmUgPSBcIk5BXCI7XG5cdFx0XHRcdFx0XHRcdFx0XHRlbHNlIGlmIChfLmlzVW5kZWZpbmVkKHNjb3JlRGF0dW0uc2NvcmUpKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzY29yZSA9IFwiLVwiO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRzY29yZSA9IHNjb3JlRGF0dW0uc2NvcmU7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0c2NvcmUgPSBcIi1cIjtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0c2NvcmUgPSBcIk5BXCI7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gc2NvcmU7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0Y2VsbDogQmFja2dyaWQuQ2VsbC5leHRlbmQoe1xuXHRcdFx0XHRcdFx0Y2xhc3NOYW1lOiBcImhvdmVyYWJsZVwiLFxuXHRcdFx0XHRcdFx0ZXZlbnRzOiB7XG5cdFx0XHRcdFx0XHRcdG1vdXNlb3ZlcjogXCJvbk1vdXNlT3ZlclwiLFxuXHRcdFx0XHRcdFx0XHRtb3VzZW91dDogXCJvbk1vdXNlT3V0XCIsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0b25Nb3VzZU92ZXI6IHRoaXMub25HcmlkQ2VsbE1vdXNlT3Zlci5iaW5kKHRoaXMsIHF1ZXN0aW9uLmlkKSxcblx0XHRcdFx0XHRcdG9uTW91c2VPdXQ6IHRoaXMub25HcmlkQ2VsbE1vdXNlT3V0LmJpbmQodGhpcywgcXVlc3Rpb24uaWQpLFxuXHRcdFx0XHRcdH0pLFxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLkNvbGxlY3Rpb24gPSBuZXcgQmFja2JvbmUuQ29sbGVjdGlvbihbdGhpcy5TdWJtaXNzaW9uXSk7XG5cblx0XHRcdHRoaXMuTWFya3NHcmlkID0gbmV3IEdyaWQoe1xuXHRcdFx0XHRlbDogdGhpcy51aS5ncmlkLFxuXHRcdFx0XHRjb2x1bW5zOiBjb2x1bW5zLFxuXHRcdFx0XHRjb2xsZWN0aW9uOiB0aGlzLkNvbGxlY3Rpb24sXG5cdFx0XHRcdGNsaWNrYWJsZTogZmFsc2UsXG5cdFx0XHRcdG5vTG9hZDogdHJ1ZSxcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLkFjdGl2aXR5RHVyYXRpb25Db2xsZWN0aW9uID0gbmV3IEFjdGl2aXR5RHVyYXRpb25Db2xsZWN0aW9uKCk7XG5cblx0XHRcdGxldCBxdWVzdGlvblN0YXJ0ID0gbnVsbDtcblxuXHRcdFx0Xy5lYWNoKHRoaXMuU3VibWlzc2lvbi5nZXQoXCJwYXlsb2FkXCIpLmFjdGl2aXR5LCBhY3Rpdml0eSA9PiB7XG5cdFx0XHRcdGlmIChhY3Rpdml0eS5uYW1lID09PSBcImFzc2Vzc21lbnQtY29tcGxldGVkXCIgfHwgYWN0aXZpdHkubmFtZSA9PT0gXCJhc3Nlc3NtZW50LWluY29tcGxldGVcIiB8fFxuXHRcdFx0XHRcdGFjdGl2aXR5Lm5hbWUgPT09IFwiYXBwLWZvcmNlLWNsb3NlZFwiIHx8IGFjdGl2aXR5Lm5hbWUgPT09IFwiYXBwLWNyYXNoZWRcIiB8fCBhY3Rpdml0eS5uYW1lID09PSBcInF1ZXN0aW9uLXN0YXJ0XCIpIHtcblx0XHRcdFx0XHQvLyBTYXZlIHRoZSBwcmV2aW91cyBxdWVzdGlvblxuXHRcdFx0XHRcdGlmIChxdWVzdGlvblN0YXJ0KSB7XG5cdFx0XHRcdFx0XHR0aGlzLkFjdGl2aXR5RHVyYXRpb25Db2xsZWN0aW9uLmFkZCh7XG5cdFx0XHRcdFx0XHRcdHF1ZXN0aW9uOiBxdWVzdGlvblN0YXJ0LmRhdGEucXVlc3Rpb24sXG5cdFx0XHRcdFx0XHRcdHN0YXJ0VGltZTogcXVlc3Rpb25TdGFydC50aW1lLFxuXHRcdFx0XHRcdFx0XHRlbmRUaW1lOiBhY3Rpdml0eS50aW1lIHx8IGFjdGl2aXR5LnVuaXhUaW1lc3RhbXAsXG5cdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFx0cXVlc3Rpb25TdGFydCA9IG51bGw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGFjdGl2aXR5Lm5hbWUgPT09IFwicXVlc3Rpb24tc3RhcnRcIilcblx0XHRcdFx0XHRxdWVzdGlvblN0YXJ0ID0gYWN0aXZpdHk7XG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5BY3Rpdml0eVRpbWVsaW5lID0gbmV3IEFjdGl2aXR5VGltZWxpbmVWaWV3KHsgY29sbGVjdGlvbjogdGhpcy5BY3Rpdml0eUR1cmF0aW9uQ29sbGVjdGlvbiB9KTtcblx0XHRcdHRoaXMudWkuYWN0aXZpdHlUaW1lbGluZUNvbnRhaW5lci5wcmVwZW5kKHRoaXMuQWN0aXZpdHlUaW1lbGluZS5yZW5kZXIoKS4kZWwpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMuQXNzZXNzbWVudCA9IGF3YWl0IFBhZ2UucmVxdWVzdChQYWdlLkV2ZW50cy5HZXRBc3Nlc3NtZW50LCB0aGlzLk9wdGlvbnMuYXNzZXNzbWVudElEKTtcblx0XHRcdGNvbnN0IGluY2x1ZGVFZHVjYXRvcnMgPSB0cnVlO1xuXHRcdFx0Y29uc3QgaW5jbHVkZUxlYXZlcnMgPSB0cnVlO1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbiA9IGF3YWl0IFBhZ2UucmVxdWVzdChQYWdlLkV2ZW50cy5HZXRNYXJrcywgdGhpcy5PcHRpb25zLmFzc2Vzc21lbnRJRCwgdGhpcy5PcHRpb25zLmluc3RhbmNlSUQsIGluY2x1ZGVFZHVjYXRvcnMsIGluY2x1ZGVMZWF2ZXJzKTtcblx0XHRcdHRoaXMuU3VibWlzc2lvbiA9IGNvbGxlY3Rpb24uZ2V0KHRoaXMuT3B0aW9ucy5zdWJtaXNzaW9uSUQpO1xuXG5cdFx0XHR0aGlzLlJlYWR5ID0gdHJ1ZTtcblx0XHRcdHRoaXMucmVuZGVyKCk7XG5cdFx0fVxuXHR9LFxuXG5cdG9uR3JpZENlbGxNb3VzZU92ZXI6IGZ1bmN0aW9uKGNvbHVtbikge1xuXHRcdHRoaXMuQWN0aXZpdHlEdXJhdGlvbkNvbGxlY3Rpb24uZWFjaChhY3Rpdml0eUR1cmF0aW9uID0+IHtcblx0XHRcdGlmIChhY3Rpdml0eUR1cmF0aW9uLmdldChcInF1ZXN0aW9uXCIpID09PSBjb2x1bW4pXG5cdFx0XHRcdGFjdGl2aXR5RHVyYXRpb24udHJpZ2dlcihcImFjdGl2aXR5LWR1cmF0aW9uOmhpZ2hsaWdodFwiKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0YWN0aXZpdHlEdXJhdGlvbi50cmlnZ2VyKFwiYWN0aXZpdHktZHVyYXRpb246bG93bGlnaHRcIik7XG5cdFx0fSk7XG5cdH0sXG5cblx0b25HcmlkQ2VsbE1vdXNlT3V0OiBmdW5jdGlvbihjb2x1bW4pIHtcblx0XHR0aGlzLkFjdGl2aXR5RHVyYXRpb25Db2xsZWN0aW9uLmVhY2goYWN0aXZpdHlEdXJhdGlvbiA9PiB7XG5cdFx0XHRpZiAoYWN0aXZpdHlEdXJhdGlvbi5nZXQoXCJxdWVzdGlvblwiKSA9PT0gY29sdW1uKVxuXHRcdFx0XHRhY3Rpdml0eUR1cmF0aW9uLnRyaWdnZXIoXCJhY3Rpdml0eS1kdXJhdGlvbjpsb3dsaWdodFwiKTtcblx0XHR9KTtcblx0fSxcbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFZpZXdzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwiYXNzZXNzbWVudC1sYXlvdXQtdmlld1wiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL21hcmtzLm51bmpcIikubGF5b3V0LFxuXG5cdHJlZ2lvbnM6IHtcblx0XHRhc3Nlc3NtZW50czogXCIjYXNzZXNzbWVudHMtcmVnaW9uXCIsXG5cdFx0aW5zdGFuY2VzOiBcIiNpbnN0YW5jZXMtcmVnaW9uXCIsXG5cdFx0bWFya3M6IFwiI21hcmtzLXJlZ2lvblwiLFxuXHRcdGRldGFpbHM6IFwiI2RldGFpbHMtcmVnaW9uXCIsXG5cdH0sXG5cblx0dWk6IHtcblx0XHRzZWN0aW9uOiBcIi5wYWdlLWFjY29yZGlvbiA+IGxpXCIsXG5cdFx0YXNzZXNzbWVudHNTZWN0aW9uOiBcIi5hc3Nlc3NtZW50cy1zZWN0aW9uXCIsXG5cdFx0aW5zdGFuY2VzU2VjdGlvbjogXCIuaW5zdGFuY2VzLXNlY3Rpb25cIixcblx0XHRtYXJrc1NlY3Rpb246IFwiLm1hcmtzLXNlY3Rpb25cIixcblx0XHRkZXRhaWxzU2VjdGlvbjogXCIuZGV0YWlscy1zZWN0aW9uXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkuc2VjdGlvblwiOiBcIm9uU2VjdGlvbkNsaWNrXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5JZGVudGlmaWVycyA9IHtcblx0XHRcdGFzc2Vzc21lbnRJRDogbnVsbCxcblx0XHRcdGluc3RhbmNlSUQ6IG51bGwsXG5cdFx0XHRzdWJtaXNzaW9uSUQ6IG51bGwsXG5cdFx0fTtcblxuXHRcdFBhZ2UucmVwbHkoUGFnZS5FdmVudHMuR2V0QXNzZXNzbWVudHMsIHRoaXMuZmV0Y2hBc3Nlc3NtZW50cy5iaW5kKHRoaXMpKTtcblx0XHRQYWdlLnJlcGx5KFBhZ2UuRXZlbnRzLkdldEluc3RhbmNlcywgdGhpcy5mZXRjaEluc3RhbmNlcy5iaW5kKHRoaXMpKTtcblx0XHRQYWdlLnJlcGx5KFBhZ2UuRXZlbnRzLkdldE1hcmtzLCB0aGlzLmZldGNoTWFya3MuYmluZCh0aGlzKSk7XG5cdFx0UGFnZS5yZXBseShQYWdlLkV2ZW50cy5HZXRBc3Nlc3NtZW50LCB0aGlzLmZldGNoQXNzZXNzbWVudC5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRmZXRjaEFzc2Vzc21lbnRzOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBBc3Nlc3NtZW50Q29sbGVjdGlvbigpLmxhenlGZXRjaCgpKTtcblx0fSxcblxuXHRmZXRjaEluc3RhbmNlczogZnVuY3Rpb24oYXNzZXNzbWVudElEKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgSW5zdGFuY2VDb2xsZWN0aW9uKG51bGwsIHsgYXNzZXNzbWVudElEOiBhc3Nlc3NtZW50SUQgfSkubGF6eUZldGNoKCkpO1xuXHR9LFxuXG5cdGZldGNoTWFya3M6IGZ1bmN0aW9uKGFzc2Vzc21lbnRJRCwgaW5zdGFuY2VJRCwgaW5jbHVkZUVkdWNhdG9ycywgaW5jbHVkZUxlYXZlcnMpIHtcblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBNYXJrQ29sbGVjdGlvbihudWxsLCB7IGFzc2Vzc21lbnRJRDogYXNzZXNzbWVudElELCBpbnN0YW5jZUlEOiBpbnN0YW5jZUlELCBpbmNsdWRlRWR1Y2F0b3JzOiBpbmNsdWRlRWR1Y2F0b3JzLCBpbmNsdWRlTGVhdmVyczogaW5jbHVkZUxlYXZlcnMgfSkubGF6eUZldGNoKCkpO1xuXHR9LFxuXG5cdGZldGNoQXNzZXNzbWVudDogZnVuY3Rpb24oYXNzZXNzbWVudElEKSB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgQXNzZXNzbWVudChudWxsLCB7IGFzc2Vzc21lbnRSZXNvdXJjZUlEOiBhc3Nlc3NtZW50SUQgfSkubGF6eUZldGNoKCkpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHQvLyBJbml0aWFsaXplIHRoZSBzZWN0aW9uc1xuXHRcdHRoaXMuQWN0aXZlU2VjdGlvbiA9IHRoaXMudWkuc2VjdGlvbi5maXJzdCgpO1xuXHRcdHRoaXMuQWN0aXZlU2VjdGlvbi5hZGRDbGFzcyhcImFjdGl2ZVwiKTtcblxuXHRcdHRoaXMuZGlzYWJsZVNlY3Rpb24odGhpcy51aS5pbnN0YW5jZXNTZWN0aW9uKTtcblx0XHR0aGlzLmRpc2FibGVTZWN0aW9uKHRoaXMudWkubWFya3NTZWN0aW9uKTtcblx0XHR0aGlzLmRpc2FibGVTZWN0aW9uKHRoaXMudWkuZGV0YWlsc1NlY3Rpb24pO1xuXG5cdFx0Ly8gU2hvdyB0aGUgZmlyc3Qgc2VjdGlvblxuXHRcdHRoaXMuY3JlYXRlQXNzZXNzbWVudHNTZWN0aW9uKCk7XG5cdH0sXG5cblx0Y3JlYXRlQXNzZXNzbWVudHNTZWN0aW9uOiBmdW5jdGlvbigpIHtcblx0XHQvLyBDcmVhdGUgYW5kIGVuYWJsZSB0aGUgYXNzZXNzbWVudHMgc2VjdGlvblxuXHRcdGlmICghdGhpcy5nZXRSZWdpb24oXCJhc3Nlc3NtZW50c1wiKS5oYXNWaWV3KCkpIHtcblx0XHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImFzc2Vzc21lbnRzXCIsIG5ldyBBc3Nlc3NtZW50c1ZpZXcoKSk7XG5cdFx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZ2V0UmVnaW9uKFwiYXNzZXNzbWVudHNcIikuY3VycmVudFZpZXcsIFBhZ2UuRXZlbnRzLkFzc2Vzc21lbnRTZWxlY3RlZCwgdGhpcy5vbkFzc2Vzc21lbnRTZWxlY3RlZC5iaW5kKHRoaXMpKTtcblx0XHR9XG5cdH0sXG5cblx0Y3JlYXRlSW5zdGFuY2VzU2VjdGlvbjogZnVuY3Rpb24oYXNzZXNzbWVudElELCBtb2RlbCkge1xuXHRcdGlmICh0aGlzLmdldFJlZ2lvbihcImluc3RhbmNlc1wiKS5oYXNWaWV3KCkpIHtcblx0XHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLmdldFJlZ2lvbihcImluc3RhbmNlc1wiKS5jdXJyZW50Vmlldyk7XG5cdFx0XHR0aGlzLmdldFJlZ2lvbihcImluc3RhbmNlc1wiKS5yZXNldCgpO1xuXHRcdH1cblxuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImluc3RhbmNlc1wiLCBuZXcgSW5zdGFuY2VzVmlldyh7IGFzc2Vzc21lbnRJRDogYXNzZXNzbWVudElELCBtb2RlbCB9KSk7XG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmdldFJlZ2lvbihcImluc3RhbmNlc1wiKS5jdXJyZW50VmlldywgUGFnZS5FdmVudHMuSW5zdGFuY2VTZWxlY3RlZCwgdGhpcy5vbkluc3RhbmNlU2VsZWN0ZWQuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0Y3JlYXRlTWFya3NTZWN0aW9uOiBmdW5jdGlvbihhc3Nlc3NtZW50SUQsIGluc3RhbmNlSUQpIHtcblx0XHRpZiAodGhpcy5nZXRSZWdpb24oXCJtYXJrc1wiKS5oYXNWaWV3KCkpIHtcblx0XHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLmdldFJlZ2lvbihcIm1hcmtzXCIpLmN1cnJlbnRWaWV3KTtcblx0XHRcdHRoaXMuZ2V0UmVnaW9uKFwibWFya3NcIikucmVzZXQoKTtcblx0XHR9XG5cblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJtYXJrc1wiLCBuZXcgTWFya3NWaWV3KHsgYXNzZXNzbWVudElEOiBhc3Nlc3NtZW50SUQsIGluc3RhbmNlSUQ6IGluc3RhbmNlSUQgfSkpO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5nZXRSZWdpb24oXCJtYXJrc1wiKS5jdXJyZW50VmlldywgUGFnZS5FdmVudHMuU3VibWlzc2lvblNlbGVjdGVkLCB0aGlzLm9uU3VibWlzc2lvblNlbGVjdGVkLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdGNyZWF0ZURldGFpbHNTZWN0aW9uOiBmdW5jdGlvbihhc3Nlc3NtZW50SUQsIGluc3RhbmNlSUQsIHN1Ym1pc3Npb25JRCkge1xuXHRcdGlmICh0aGlzLmdldFJlZ2lvbihcImRldGFpbHNcIikuaGFzVmlldygpKVxuXHRcdFx0dGhpcy5nZXRSZWdpb24oXCJkZXRhaWxzXCIpLnJlc2V0KCk7XG5cblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJkZXRhaWxzXCIsIG5ldyBEZXRhaWxzVmlldyh7IGFzc2Vzc21lbnRJRDogYXNzZXNzbWVudElELCBpbnN0YW5jZUlEOiBpbnN0YW5jZUlELCBzdWJtaXNzaW9uSUQ6IHN1Ym1pc3Npb25JRCB9KSk7XG5cdH0sXG5cblx0bmF2aWdhdGVUb1NlY3Rpb246IGZ1bmN0aW9uKGlkZW50aWZpZXJzKSB7XG5cdFx0dGhpcy5jcmVhdGVBc3Nlc3NtZW50c1NlY3Rpb24oKTtcblxuXHRcdGNvbnN0IHNlY3Rpb24gPSBpZGVudGlmaWVycy5zdWJtaXNzaW9uSUQgPyBcImRldGFpbHNcIiA6IGlkZW50aWZpZXJzLmluc3RhbmNlSUQgPyBcIm1hcmtzXCIgOiBpZGVudGlmaWVycy5hc3Nlc3NtZW50SUQgPyBcImluc3RhbmNlc1wiIDogXCJhc3Nlc3NtZW50c1wiO1xuXG5cdFx0c3dpdGNoIChzZWN0aW9uKSB7XG5cdFx0XHRjYXNlIFwiZGV0YWlsc1wiOlxuXHRcdFx0XHR0aGlzLmNyZWF0ZURldGFpbHNTZWN0aW9uKGlkZW50aWZpZXJzLmFzc2Vzc21lbnRJRCwgaWRlbnRpZmllcnMuaW5zdGFuY2VJRCwgaWRlbnRpZmllcnMuc3VibWlzc2lvbklEKTtcblx0XHRcdFx0dGhpcy5lbmFibGVTZWN0aW9uKHRoaXMudWkuZGV0YWlsc1NlY3Rpb24pO1xuXHRcdFx0XHQvLyBubyBicmVha1xuXG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblx0XHRcdGNhc2UgXCJtYXJrc1wiOlxuXHRcdFx0XHR0aGlzLmNyZWF0ZU1hcmtzU2VjdGlvbihpZGVudGlmaWVycy5hc3Nlc3NtZW50SUQsIGlkZW50aWZpZXJzLmluc3RhbmNlSUQpO1xuXHRcdFx0XHR0aGlzLmVuYWJsZVNlY3Rpb24odGhpcy51aS5tYXJrc1NlY3Rpb24pO1xuXHRcdFx0XHQvLyBubyBicmVha1xuXG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcblx0XHRcdGNhc2UgXCJpbnN0YW5jZXNcIjpcblx0XHRcdFx0dGhpcy5jcmVhdGVJbnN0YW5jZXNTZWN0aW9uKGlkZW50aWZpZXJzLmFzc2Vzc21lbnRJRCwgaWRlbnRpZmllcnMubW9kZWwpO1xuXHRcdFx0XHR0aGlzLmVuYWJsZVNlY3Rpb24odGhpcy51aS5pbnN0YW5jZXNTZWN0aW9uKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblxuXHRcdHN3aXRjaCAoc2VjdGlvbikge1xuXHRcdFx0Y2FzZSBcImRldGFpbHNcIjpcblx0XHRcdFx0dGhpcy5hY3RpdmF0ZVNlY3Rpb24odGhpcy51aS5kZXRhaWxzU2VjdGlvbik7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwibWFya3NcIjpcblx0XHRcdFx0dGhpcy5hY3RpdmF0ZVNlY3Rpb24odGhpcy51aS5tYXJrc1NlY3Rpb24pO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcImluc3RhbmNlc1wiOlxuXHRcdFx0XHR0aGlzLmFjdGl2YXRlU2VjdGlvbih0aGlzLnVpLmluc3RhbmNlc1NlY3Rpb24pO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcImFzc2Vzc21lbnRzXCI6XG5cdFx0XHRcdHRoaXMuYWN0aXZhdGVTZWN0aW9uKHRoaXMudWkuYXNzZXNzbWVudHNTZWN0aW9uKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblxuXHRcdGlmIChpZGVudGlmaWVycy5zdWJtaXNzaW9uSUQgJiYgaWRlbnRpZmllcnMuc3VibWlzc2lvbklEICE9PSB0aGlzLklkZW50aWZpZXJzLnN1Ym1pc3Npb25JRCkge1xuXHRcdFx0dGhpcy5JZGVudGlmaWVycy5zdWJtaXNzaW9uSUQgPSBpZGVudGlmaWVycy5zdWJtaXNzaW9uSUQ7XG5cdFx0XHR0aGlzLklkZW50aWZpZXJzLmluc3RhbmNlSUQgPSBpZGVudGlmaWVycy5pbnN0YW5jZUlEO1xuXHRcdFx0dGhpcy5JZGVudGlmaWVycy5hc3Nlc3NtZW50SUQgPSBpZGVudGlmaWVycy5hc3Nlc3NtZW50SUQ7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKGlkZW50aWZpZXJzLmluc3RhbmNlSUQgJiYgaWRlbnRpZmllcnMuaW5zdGFuY2VJRCAhPT0gdGhpcy5JZGVudGlmaWVycy5pbnN0YW5jZUlEKSB7XG5cdFx0XHR0aGlzLklkZW50aWZpZXJzLmluc3RhbmNlSUQgPSBpZGVudGlmaWVycy5pbnN0YW5jZUlEO1xuXHRcdFx0dGhpcy5JZGVudGlmaWVycy5hc3Nlc3NtZW50SUQgPSBpZGVudGlmaWVycy5hc3Nlc3NtZW50SUQ7XG5cdFx0XHR0aGlzLmRpc2FibGVTZWN0aW9uKHRoaXMudWkuZGV0YWlsc1NlY3Rpb24pO1xuXHRcdH1cblx0XHRlbHNlIGlmIChpZGVudGlmaWVycy5hc3Nlc3NtZW50SUQgJiYgaWRlbnRpZmllcnMuYXNzZXNzbWVudElEICE9PSB0aGlzLklkZW50aWZpZXJzLmFzc2Vzc21lbnRJRCkge1xuXHRcdFx0dGhpcy5JZGVudGlmaWVycy5hc3Nlc3NtZW50SUQgPSBpZGVudGlmaWVycy5hc3Nlc3NtZW50SUQ7XG5cdFx0XHR0aGlzLmRpc2FibGVTZWN0aW9uKHRoaXMudWkubWFya3NTZWN0aW9uKTtcblx0XHRcdHRoaXMuZGlzYWJsZVNlY3Rpb24odGhpcy51aS5kZXRhaWxzU2VjdGlvbik7XG5cdFx0fVxuXHR9LFxuXG5cdG9uU2VjdGlvbkNsaWNrOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGNvbnN0IHRhcmdldCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG5cblx0XHRpZiAodGFyZ2V0LmlzKHRoaXMudWkuYXNzZXNzbWVudHNTZWN0aW9uKSlcblx0XHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0ZSwgc2V0dGluZ3MudXJsUm9vdCArIFwiL2NvbnNvbGUvbWFya3NcIik7XG5cdFx0ZWxzZSBpZiAodGFyZ2V0LmlzKHRoaXMudWkuaW5zdGFuY2VzU2VjdGlvbikpXG5cdFx0XHR0aGlzLm9uQXNzZXNzbWVudFNlbGVjdGVkKHRoaXMuSWRlbnRpZmllcnMuYXNzZXNzbWVudElEKTtcblx0XHRlbHNlIGlmICh0YXJnZXQuaXModGhpcy51aS5tYXJrc1NlY3Rpb24pKVxuXHRcdFx0dGhpcy5vbkluc3RhbmNlU2VsZWN0ZWQodGhpcy5JZGVudGlmaWVycy5hc3Nlc3NtZW50SUQsIHRoaXMuSWRlbnRpZmllcnMuaW5zdGFuY2VJRCk7XG5cdFx0ZWxzZSBpZiAodGFyZ2V0LmlzKHRoaXMudWkuZGV0YWlsc1NlY3Rpb24pKVxuXHRcdFx0dGhpcy5vblN1Ym1pc3Npb25TZWxlY3RlZCh0aGlzLklkZW50aWZpZXJzLmFzc2Vzc21lbnRJRCwgdGhpcy5JZGVudGlmaWVycy5pbnN0YW5jZUlELCB0aGlzLklkZW50aWZpZXJzLnN1Ym1pc3Npb25JRCk7XG5cdH0sXG5cblx0ZGlzYWJsZVNlY3Rpb246IGZ1bmN0aW9uKHNlY3Rpb24pIHtcblx0XHRzZWN0aW9uLnByb3AoXCJkaXNhYmxlZFwiLCB0cnVlKTtcblxuXHRcdCQoXCIudGFiXCIsIHNlY3Rpb24pLmFkZENsYXNzKFwiZGlzYWJsZWRcIik7XG5cdFx0JChcIi50YWItbGFiZWxcIiwgc2VjdGlvbikuYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblx0fSxcblxuXHRlbmFibGVTZWN0aW9uOiBmdW5jdGlvbihzZWN0aW9uKSB7XG5cdFx0c2VjdGlvbi5wcm9wKFwiZGlzYWJsZWRcIiwgZmFsc2UpO1xuXG5cdFx0JChcIi50YWJcIiwgc2VjdGlvbikucmVtb3ZlQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblx0XHQkKFwiLnRhYi1sYWJlbFwiLCBzZWN0aW9uKS5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xuXHR9LFxuXG5cdGFjdGl2YXRlU2VjdGlvbjogZnVuY3Rpb24oc2VjdGlvbikge1xuXHRcdGlmICghc2VjdGlvbi5wcm9wKFwiZGlzYWJsZWRcIikpIHtcblx0XHRcdHRoaXMuQWN0aXZlU2VjdGlvbi5yZW1vdmVDbGFzcyhcImFjdGl2ZVwiKTtcblxuXHRcdFx0c2VjdGlvbi5hZGRDbGFzcyhcImFjdGl2ZVwiKTtcblxuXHRcdFx0dGhpcy5BY3RpdmVTZWN0aW9uID0gc2VjdGlvbjtcblx0XHR9XG5cdH0sXG5cblx0b25Bc3Nlc3NtZW50U2VsZWN0ZWQ6IGZ1bmN0aW9uKGFzc2Vzc21lbnRJRCkge1xuXHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0ZSwgc2V0dGluZ3MudXJsUm9vdCArIFwiL2NvbnNvbGUvbWFya3MvXCIgKyBhc3Nlc3NtZW50SUQpO1xuXHR9LFxuXG5cdG9uSW5zdGFuY2VTZWxlY3RlZDogZnVuY3Rpb24oYXNzZXNzbWVudElELCBpbnN0YW5jZUlEKSB7XG5cdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLk5hdmlnYXRlLCBzZXR0aW5ncy51cmxSb290ICsgXCIvY29uc29sZS9tYXJrcy9cIiArIGFzc2Vzc21lbnRJRCArIFwiL1wiICsgaW5zdGFuY2VJRCk7XG5cdH0sXG5cblx0b25TdWJtaXNzaW9uU2VsZWN0ZWQ6IGZ1bmN0aW9uKGFzc2Vzc21lbnRJRCwgaW5zdGFuY2VJRCwgc3VibWlzc2lvbklEKSB7XG5cdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLk5hdmlnYXRlLCBzZXR0aW5ncy51cmxSb290ICsgXCIvY29uc29sZS9tYXJrcy9cIiArIGFzc2Vzc21lbnRJRCArIFwiL1wiICsgaW5zdGFuY2VJRCArIFwiL1wiICsgc3VibWlzc2lvbklEKTtcblx0fSxcbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iXX0=",
    "\"use strict\";\n// ----------------------------------------------------------------------------\n// Dependencies\n// ----------------------------------------------------------------------------\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\n\nvar App = require(\"../../index\");\nvar Page = new Backbone.Marionette.Application();\nvar settings = require(\"app-settings\");\n\nvar ServerGrid = require(\"../../lib/serverGrid\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\n_.extend(Page, {\n\tCache: {},\n\tEvents: {}\n});\n\n// ----------------------------------------------------------------------------\n// Models\n// ----------------------------------------------------------------------------\nvar Mark = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"_id\",\n\n\tcomputeds: {\n\t\townerNames: function ownerNames() {\n\t\t\treturn this.has(\"firstname\") && this.has(\"surname\") ? this.get(\"firstname\") + \" \" + this.get(\"surname\") : \"[User Missing]\";\n\t\t},\n\n\t\tassessmentTitle: function assessmentTitle() {\n\t\t\treturn this.has(\"title\") ? this.get(\"title\") : \"-\";\n\t\t},\n\n\t\tassessmentSubject: function assessmentSubject() {\n\t\t\treturn this.has(\"subject_name\") ? this.get(\"subject_name\") : \"-\";\n\t\t},\n\n\t\tassessmentGrade: function assessmentGrade() {\n\t\t\treturn this.has(\"studyYear\") ? this.get(\"studyYear\") : \"-\";\n\t\t},\n\n\t\tinstanceTitle: function instanceTitle() {\n\t\t\treturn this.has(\"settings\") ? this.get(\"settings\").title : \"-\";\n\t\t},\n\n\t\tcompleted: function completed() {\n\t\t\tvar completed = Boolean(_.find(this.get(\"payload\").activity, function (activity) {\n\t\t\t\treturn activity.name === \"assessment-completed\";\n\t\t\t}));\n\t\t\treturn \"<span class='fal\" + (completed ? \" fa-check assessment-status-complete'>\" : \"assessment-status-incomplete'>\") + \"</span>\";\n\t\t},\n\n\t\tmarked: function marked() {\n\t\t\tvar marked = true;\n\n\t\t\tif (!this.has(\"payload\") || !this.get(\"payload\").results || !this.get(\"payload\").results.scores) marked = false;else if (_.find(this.get(\"payload\").results.scores, function (scoreData) {\n\t\t\t\treturn scoreData.score === undefined;\n\t\t\t})) marked = false;\n\n\t\t\treturn \"<span class='fal\" + (marked ? \" fa-check assessment-status-complete'>\" : \"assessment-status-incomplete'>\") + \"</span>\";\n\t\t},\n\n\t\ttotalMark: function totalMark() {\n\t\t\tvar total = 0;\n\n\t\t\tif (this.has(\"payload\") && this.get(\"payload\").results && this.get(\"payload\").results.scores) _.each(this.get(\"payload\").results.scores, function (scoreData) {\n\t\t\t\ttotal += scoreData.score ? scoreData.score : 0;\n\t\t\t});\n\n\t\t\treturn total;\n\t\t},\n\n\t\tmaxScore: function maxScore() {\n\t\t\tif (this.has(\"payload\") && this.get(\"payload\").results && this.get(\"payload\").results.maxScore) return this.get(\"payload\").results.maxScore;\n\t\t\treturn \"-\";\n\t\t}\n\t}\n});\n\nvar MarkCollection = Backbone.PageableCollection.extend({\n\tmodel: Mark,\n\n\tcomparator: function comparator(model) {\n\t\treturn model.get(\"ownerSurname\") + model.get(\"ownerFirstName\");\n\t},\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/assessments/student?paged=true\";\n\t},\n\n\tstate: {\n\t\tpageSize: 15\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\ttotalPages: null,\n\t\ttotalRecords: null,\n\t\tsortKey: \"sortBy\"\n\t},\n\t// get the state from Github's search API result\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\t// get the actual records\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\n// ----------------------------------------------------------------------------\n// Views\n// ----------------------------------------------------------------------------\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"content user-manager student-marks\",\n\n\ttemplate: require(\"../templates/marks.nunj\").studentMarks,\n\n\tui: {\n\t\tfilterBar: \".ops-bar .filters\",\n\t\tcounterBar: \".ops-bar .counter\",\n\t\taddIcon: \".add-item\",\n\t\timportIcon: \".import-item\",\n\t\tdownload: \"button.download\",\n\t\tdownloadAll: \"div.downloadAll\",\n\t\tgrid: \"div.grid\"\n\t},\n\n\tcollectionEvents: {\n\t\t\"buttoncell:clicked\": \"downloadItem\",\n\t\t\"sync reset add remove\": \"updateCounter\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.addIcon\": \"showAdd\",\n\t\t\"click @ui.importIcon\": \"showImport\",\n\t\t\"click @ui.download\": \"showDownloads\",\n\t\t\"click @ui.downloadAll\": \"downloadCSVMarks\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.raw = new MarkCollection();\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tif (this.grid) this.grid.destroy();\n\t},\n\n\tupdateCounter: function updateCounter() {\n\t\tvar pageStart = (this.collection.state.currentPage - 1) * this.collection.state.pageSize + 1;\n\t\tvar pageEnd = this.collection.state.currentPage * this.collection.state.pageSize;\n\t\tif (pageEnd > this.collection.state.totalRecords) pageEnd = this.collection.state.totalRecords;\n\n\t\tvar text = \"Content items \" + pageStart + \" - \" + pageEnd + \" of \" + this.collection.state.totalRecords;\n\t\tif (this.collection.state.totalRecords === null) text = \"No content to show\";\n\n\t\tthis.ui.counterBar.text(text);\n\t},\n\n\tdownloadList: function downloadList() {\n\t\twindow.open(settings.urlRoot + \"/api/1.0/resources/lists/content\");\n\t},\n\n\tfilterClone: function filterClone(model) {\n\t\treturn model.get(\"category\") === \"assessment\";\n\t},\n\n\tdownloadItem: function downloadItem(id, model) {\n\t\twindow.open(settings.urlRoot + \"/api/1.0/assessments/\" + model.get(\"assessment\") + \"/marks/\" + model.get(\"attachment\") + \"/report?studentAnswers=true&assessmark=\" + model.get(\"_id\"));\n\t},\n\n\tonRender: function onRender() {\n\t\tvar btnOptions = {\n\t\t\tclass: \"download\",\n\t\t\tid: \"btnDownloadReport\",\n\t\t\ttext: \"<span class='fal fa-cloud-download' title='Download PDF Report' />\"\n\t\t};\n\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tvar columns = [{ name: \"assessmentTitle\", label: \"Assessment\", cell: \"string\", editable: false }, { name: \"instanceTitle\", label: \"Instance\", cell: \"string\", editable: false }, { name: \"assessmentSubject\", label: \"Subject\", cell: \"string\", editable: false }, { name: \"completed\", class: \"completeds\", label: \"Completed\", cell: ServerGrid.HTMLCell.extend({}), editable: false, sortable: false }, { name: \"marked\", label: \"Marked\", cell: ServerGrid.HTMLCell.extend({}), editable: false, sortable: false }, { name: \"totalMark\", label: \"Mark\", cell: \"string\", editable: false }, { name: \"maxScore\", label: \"Total\", cell: \"string\", editable: false }, { label: \"Download\", cell: new ServerGrid.ButtonCell(btnOptions), editable: false, sortable: false }];\n\n\t\tif (_.includes(user.roles, \"teacher\") || _.includes(user.roles, \"superuser\")) columns.unshift({ name: \"ownerNames\", label: \"Student Names\", cell: \"string\", editable: false });\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: this.raw,\n\t\t\tclickable: false\n\t\t});\n\n\t\tthis.collection = this.grid.collection;\n\n\t\tthis.bindEvents(this.collection, this.collectionEvents);\n\n\t\tvar searchFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar cats = [{ name: \"assessment\", label: \"Assessment\" }, { name: \"audio\", label: \"Audio\" }, { name: \"flashcarddeck\", label: \"Flashcard Deck\" }, { name: \"image\", label: \"Image\" }, { name: \"pdf\", label: \"PDF\" }, { name: \"text\", label: \"Text\" }, { name: \"url\", label: \"URL\" }, { name: \"video\", label: \"Video\" }];\n\n\t\tif (settings.officeContent) {\n\t\t\tcats.push({ name: \"excel\", label: \"MS Excel\" }, { name: \"powerpoint\", label: \"MS PowerPoint\" }, { name: \"word\", label: \"MS Word\" });\n\t\t}\n\n\t\tthis.ui.filterBar.prepend(this.grid.filter({ filterContainer: this.ui.filterBar, filters: [searchFilter], defaultFilters: [\"textFilter\", \"type\"] }).render().el);\n\n\t\t$(\".paging\", this.el).append(this.grid.paging().render().el);\n\n\t\tif (!settings.assessments) this.ui.importIcon.addClass(\"hide\");\n\t},\n\n\treproduceItem: function reproduceItem(model) {\n\t\twindow.open(settings.urlRoot + \"/api/1.0/assessments/\" + model.get(\"_id\") + \"/report\");\n\t},\n\n\tdownloadCSVMarks: function downloadCSVMarks() {\n\t\twindow.open(settings.urlRoot + \"/api/1.0/assessments/student/export\");\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0dWRlbnRNYXJrcy5qcyJdLCJuYW1lcyI6WyIkIiwicmVxdWlyZSIsIl8iLCJCYWNrYm9uZSIsIkFwcCIsIlBhZ2UiLCJNYXJpb25ldHRlIiwiQXBwbGljYXRpb24iLCJzZXR0aW5ncyIsIlNlcnZlckdyaWQiLCJyYWRpbyIsIlJhZGlvIiwiY2hhbm5lbCIsImV4dGVuZCIsIkNhY2hlIiwiRXZlbnRzIiwiTWFyayIsIkVwb3h5IiwiTW9kZWwiLCJpZEF0dHJpYnV0ZSIsImNvbXB1dGVkcyIsIm93bmVyTmFtZXMiLCJoYXMiLCJnZXQiLCJhc3Nlc3NtZW50VGl0bGUiLCJhc3Nlc3NtZW50U3ViamVjdCIsImFzc2Vzc21lbnRHcmFkZSIsImluc3RhbmNlVGl0bGUiLCJ0aXRsZSIsImNvbXBsZXRlZCIsIkJvb2xlYW4iLCJmaW5kIiwiYWN0aXZpdHkiLCJuYW1lIiwibWFya2VkIiwicmVzdWx0cyIsInNjb3JlcyIsInNjb3JlRGF0YSIsInNjb3JlIiwidW5kZWZpbmVkIiwidG90YWxNYXJrIiwidG90YWwiLCJlYWNoIiwibWF4U2NvcmUiLCJNYXJrQ29sbGVjdGlvbiIsIlBhZ2VhYmxlQ29sbGVjdGlvbiIsIm1vZGVsIiwiY29tcGFyYXRvciIsInVybCIsInVybFJvb3QiLCJzdGF0ZSIsInBhZ2VTaXplIiwibW9kZSIsInF1ZXJ5UGFyYW1zIiwidG90YWxQYWdlcyIsInRvdGFsUmVjb3JkcyIsInNvcnRLZXkiLCJwYXJzZVN0YXRlIiwicmVzcCIsInBhcnNlUmVjb3JkcyIsInJvd3MiLCJtb2R1bGUiLCJleHBvcnRzIiwiVmlldyIsInRhZ05hbWUiLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsInN0dWRlbnRNYXJrcyIsInVpIiwiZmlsdGVyQmFyIiwiY291bnRlckJhciIsImFkZEljb24iLCJpbXBvcnRJY29uIiwiZG93bmxvYWQiLCJkb3dubG9hZEFsbCIsImdyaWQiLCJjb2xsZWN0aW9uRXZlbnRzIiwiZXZlbnRzIiwiaW5pdGlhbGl6ZSIsInJhdyIsIm9uQmVmb3JlRGVzdHJveSIsImRlc3Ryb3kiLCJ1cGRhdGVDb3VudGVyIiwicGFnZVN0YXJ0IiwiY29sbGVjdGlvbiIsImN1cnJlbnRQYWdlIiwicGFnZUVuZCIsInRleHQiLCJkb3dubG9hZExpc3QiLCJ3aW5kb3ciLCJvcGVuIiwiZmlsdGVyQ2xvbmUiLCJkb3dubG9hZEl0ZW0iLCJpZCIsIm9uUmVuZGVyIiwiYnRuT3B0aW9ucyIsImNsYXNzIiwidXNlciIsInJlcXVlc3QiLCJSZXF1ZXN0cyIsIkN1cnJlbnRVc2VyIiwiY29sdW1ucyIsImxhYmVsIiwiY2VsbCIsImVkaXRhYmxlIiwiSFRNTENlbGwiLCJzb3J0YWJsZSIsIkJ1dHRvbkNlbGwiLCJpbmNsdWRlcyIsInJvbGVzIiwidW5zaGlmdCIsImVsIiwiY2xpY2thYmxlIiwiYmluZEV2ZW50cyIsInNlYXJjaEZpbHRlciIsInR5cGUiLCJkZWJvdW5jZSIsInNlcnZlciIsImNhdHMiLCJvZmZpY2VDb250ZW50IiwicHVzaCIsInByZXBlbmQiLCJmaWx0ZXIiLCJmaWx0ZXJDb250YWluZXIiLCJmaWx0ZXJzIiwiZGVmYXVsdEZpbHRlcnMiLCJyZW5kZXIiLCJhcHBlbmQiLCJwYWdpbmciLCJhc3Nlc3NtZW50cyIsImFkZENsYXNzIiwicmVwcm9kdWNlSXRlbSIsImRvd25sb2FkQ1NWTWFya3MiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsSUFBSUQsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNRSxXQUFXRixRQUFRLFVBQVIsQ0FBakI7O0FBRUEsSUFBTUcsTUFBTUgsUUFBUSxhQUFSLENBQVo7QUFDQSxJQUFNSSxPQUFPLElBQUlGLFNBQVNHLFVBQVQsQ0FBb0JDLFdBQXhCLEVBQWI7QUFDQSxJQUFNQyxXQUFXUCxRQUFRLGNBQVIsQ0FBakI7O0FBRUEsSUFBTVEsYUFBYVIsUUFBUSxzQkFBUixDQUFuQjs7QUFFQSxJQUFNUyxRQUFRUCxTQUFTUSxLQUFU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QUFNLE9BQVIsRUFBaUJxRSxPQUFPLFVBQXhCLEVBQVYsRUFDQyxFQUFFckUsTUFBTSxZQUFSLEVBQXNCcUUsT0FBTyxlQUE3QixFQURELEVBRUMsRUFBRXJFLE1BQU0sTUFBUixFQUFnQnFFLE9BQU8sU0FBdkIsRUFGRDtBQUdBOztBQUVELE9BQUtsQyxFQUFMLENBQVFDLFNBQVIsQ0FBa0JvRCxPQUFsQixDQUEwQixLQUFLOUMsSUFBTCxDQUFVK0MsTUFBVixDQUFpQixFQUFFQyxpQkFBaUIsS0FBS3ZELEVBQUwsQ0FBUUMsU0FBM0IsRUFBc0N1RCxTQUFTLENBQUNWLFlBQUQsQ0FBL0MsRUFBK0RXLGdCQUFnQixDQUFDLFlBQUQsRUFBZSxNQUFmLENBQS9FLEVBQWpCLEVBQTBIQyxNQUExSCxHQUFtSWYsRUFBN0o7O0FBRUEvRyxJQUFFLFNBQUYsRUFBYSxLQUFLK0csRUFBbEIsRUFBc0JnQixNQUF0QixDQUE2QixLQUFLcEQsSUFBTCxDQUFVcUQsTUFBVixHQUFtQkYsTUFBbkIsR0FBNEJmLEVBQXpEOztBQUVBLE1BQUksQ0FBQ3ZHLFNBQVN5SCxXQUFkLEVBQ0MsS0FBSzdELEVBQUwsQ0FBUUksVUFBUixDQUFtQjBELFFBQW5CLENBQTRCLE1BQTVCO0FBQ0QsRUFqSStDOztBQW1JaERDLGdCQUFlLHVCQUFTckYsS0FBVCxFQUFnQjtBQUM5QjJDLFNBQU9DLElBQVAsQ0FBWWxGLFNBQVN5QyxPQUFULEdBQW1CLHVCQUFuQixHQUE2Q0gsTUFBTXZCLEdBQU4sQ0FBVSxLQUFWLENBQTdDLEdBQWdFLFNBQTVFO0FBQ0EsRUFySStDOztBQXVJaEQ2RyxtQkFBa0IsNEJBQVc7QUFDNUIzQyxTQUFPQyxJQUFQLENBQVlsRixTQUFTeUMsT0FBVCxHQUFtQixxQ0FBL0I7QUFDQTtBQXpJK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoic3R1ZGVudE1hcmtzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBEZXBlbmRlbmNpZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcblxuY29uc3QgQXBwID0gcmVxdWlyZShcIi4uLy4uL2luZGV4XCIpO1xuY29uc3QgUGFnZSA9IG5ldyBCYWNrYm9uZS5NYXJpb25ldHRlLkFwcGxpY2F0aW9uKCk7XG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IFNlcnZlckdyaWQgPSByZXF1aXJlKFwiLi4vLi4vbGliL3NlcnZlckdyaWRcIik7XG5cbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcblxuXy5leHRlbmQoUGFnZSwge1xuXHRDYWNoZToge30sXG5cdEV2ZW50czoge30sXG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTW9kZWxzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5jb25zdCBNYXJrID0gQmFja2JvbmUuRXBveHkuTW9kZWwuZXh0ZW5kKHtcblx0aWRBdHRyaWJ1dGU6IFwiX2lkXCIsXG5cblx0Y29tcHV0ZWRzOiB7XG5cdFx0b3duZXJOYW1lczogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gKHRoaXMuaGFzKFwiZmlyc3RuYW1lXCIpICYmIHRoaXMuaGFzKFwic3VybmFtZVwiKSA/IHRoaXMuZ2V0KFwiZmlyc3RuYW1lXCIpICsgXCIgXCIgKyB0aGlzLmdldChcInN1cm5hbWVcIikgOiBcIltVc2VyIE1pc3NpbmddXCIpO1xuXHRcdH0sXG5cblx0XHRhc3Nlc3NtZW50VGl0bGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuaGFzKFwidGl0bGVcIikgPyB0aGlzLmdldChcInRpdGxlXCIpIDogXCItXCI7XG5cdFx0fSxcblxuXHRcdGFzc2Vzc21lbnRTdWJqZWN0OiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLmhhcyhcInN1YmplY3RfbmFtZVwiKSA/IHRoaXMuZ2V0KFwic3ViamVjdF9uYW1lXCIpIDogXCItXCI7XG5cdFx0fSxcblxuXHRcdGFzc2Vzc21lbnRHcmFkZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5oYXMoXCJzdHVkeVllYXJcIikgPyB0aGlzLmdldChcInN0dWR5WWVhclwiKSA6IFwiLVwiO1xuXHRcdH0sXG5cblx0XHRpbnN0YW5jZVRpdGxlOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLmhhcyhcInNldHRpbmdzXCIpID8gdGhpcy5nZXQoXCJzZXR0aW5nc1wiKS50aXRsZSA6IFwiLVwiO1xuXHRcdH0sXG5cblx0XHRjb21wbGV0ZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29uc3QgY29tcGxldGVkID0gQm9vbGVhbihfLmZpbmQodGhpcy5nZXQoXCJwYXlsb2FkXCIpLmFjdGl2aXR5LCBhY3Rpdml0eSA9PiBhY3Rpdml0eS5uYW1lID09PSBcImFzc2Vzc21lbnQtY29tcGxldGVkXCIpKTtcblx0XHRcdHJldHVybiBcIjxzcGFuIGNsYXNzPSdmYWxcIiArIChjb21wbGV0ZWQgPyBcIiBmYS1jaGVjayBhc3Nlc3NtZW50LXN0YXR1cy1jb21wbGV0ZSc+XCIgOiBcImFzc2Vzc21lbnQtc3RhdHVzLWluY29tcGxldGUnPlwiKSArIFwiPC9zcGFuPlwiO1xuXHRcdH0sXG5cblx0XHRtYXJrZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0bGV0IG1hcmtlZCA9IHRydWU7XG5cblx0XHRcdGlmICghdGhpcy5oYXMoXCJwYXlsb2FkXCIpIHx8ICF0aGlzLmdldChcInBheWxvYWRcIikucmVzdWx0cyB8fCAhdGhpcy5nZXQoXCJwYXlsb2FkXCIpLnJlc3VsdHMuc2NvcmVzKVxuXHRcdFx0XHRtYXJrZWQgPSBmYWxzZTtcblx0XHRcdGVsc2UgaWYgKF8uZmluZCh0aGlzLmdldChcInBheWxvYWRcIikucmVzdWx0cy5zY29yZXMsIHNjb3JlRGF0YSA9PiBzY29yZURhdGEuc2NvcmUgPT09IHVuZGVmaW5lZCkpXG5cdFx0XHRcdG1hcmtlZCA9IGZhbHNlO1xuXG5cdFx0XHRyZXR1cm4gXCI8c3BhbiBjbGFzcz0nZmFsXCIgKyAobWFya2VkID8gXCIgZmEtY2hlY2sgYXNzZXNzbWVudC1zdGF0dXMtY29tcGxldGUnPlwiIDogXCJhc3Nlc3NtZW50LXN0YXR1cy1pbmNvbXBsZXRlJz5cIikgKyBcIjwvc3Bhbj5cIjtcblx0XHR9LFxuXG5cdFx0dG90YWxNYXJrOiBmdW5jdGlvbigpIHtcblx0XHRcdGxldCB0b3RhbCA9IDA7XG5cblx0XHRcdGlmICh0aGlzLmhhcyhcInBheWxvYWRcIikgJiYgdGhpcy5nZXQoXCJwYXlsb2FkXCIpLnJlc3VsdHMgJiYgdGhpcy5nZXQoXCJwYXlsb2FkXCIpLnJlc3VsdHMuc2NvcmVzKVxuXHRcdFx0XHRfLmVhY2godGhpcy5nZXQoXCJwYXlsb2FkXCIpLnJlc3VsdHMuc2NvcmVzLCBzY29yZURhdGEgPT4geyB0b3RhbCArPSBzY29yZURhdGEuc2NvcmUgPyBzY29yZURhdGEuc2NvcmUgOiAwOyB9KTtcblxuXHRcdFx0cmV0dXJuIHRvdGFsO1xuXHRcdH0sXG5cblx0XHRtYXhTY29yZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAodGhpcy5oYXMoXCJwYXlsb2FkXCIpICYmIHRoaXMuZ2V0KFwicGF5bG9hZFwiKS5yZXN1bHRzICYmIHRoaXMuZ2V0KFwicGF5bG9hZFwiKS5yZXN1bHRzLm1heFNjb3JlKVxuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXQoXCJwYXlsb2FkXCIpLnJlc3VsdHMubWF4U2NvcmU7XG5cdFx0XHRyZXR1cm4gXCItXCI7XG5cdFx0fSxcblx0fSxcbn0pO1xuXG5jb25zdCBNYXJrQ29sbGVjdGlvbiA9IEJhY2tib25lLlBhZ2VhYmxlQ29sbGVjdGlvbi5leHRlbmQoe1xuXHRtb2RlbDogTWFyayxcblxuXHRjb21wYXJhdG9yOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdHJldHVybiBtb2RlbC5nZXQoXCJvd25lclN1cm5hbWVcIikgKyBtb2RlbC5nZXQoXCJvd25lckZpcnN0TmFtZVwiKTtcblx0fSxcblxuXHR1cmw6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9hc3Nlc3NtZW50cy9zdHVkZW50P3BhZ2VkPXRydWVcIjtcblx0fSxcblxuXHRzdGF0ZToge1xuXHRcdHBhZ2VTaXplOiAxNSxcblx0fSxcblx0bW9kZTogXCJzZXJ2ZXJcIixcblxuXHRxdWVyeVBhcmFtczoge1xuXHRcdHBhZ2VTaXplOiBcInBhZ2VTaXplXCIsXG5cdFx0dG90YWxQYWdlczogbnVsbCxcblx0XHR0b3RhbFJlY29yZHM6IG51bGwsXG5cdFx0c29ydEtleTogXCJzb3J0QnlcIixcblx0fSxcblx0Ly8gZ2V0IHRoZSBzdGF0ZSBmcm9tIEdpdGh1YidzIHNlYXJjaCBBUEkgcmVzdWx0XG5cdHBhcnNlU3RhdGU6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRyZXR1cm4geyB0b3RhbFJlY29yZHM6IHJlc3AudG90YWwgfTtcblx0fSxcblxuXHQvLyBnZXQgdGhlIGFjdHVhbCByZWNvcmRzXG5cdHBhcnNlUmVjb3JkczogZnVuY3Rpb24ocmVzcCkge1xuXHRcdHJldHVybiByZXNwLnJvd3M7XG5cdH0sXG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVmlld3Ncbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6IFwiZGl2XCIsXG5cdGNsYXNzTmFtZTogXCJjb250ZW50IHVzZXItbWFuYWdlciBzdHVkZW50LW1hcmtzXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvbWFya3MubnVualwiKS5zdHVkZW50TWFya3MsXG5cblx0dWk6IHtcblx0XHRmaWx0ZXJCYXI6IFwiLm9wcy1iYXIgLmZpbHRlcnNcIixcblx0XHRjb3VudGVyQmFyOiBcIi5vcHMtYmFyIC5jb3VudGVyXCIsXG5cdFx0YWRkSWNvbjogXCIuYWRkLWl0ZW1cIixcblx0XHRpbXBvcnRJY29uOiBcIi5pbXBvcnQtaXRlbVwiLFxuXHRcdGRvd25sb2FkOiBcImJ1dHRvbi5kb3dubG9hZFwiLFxuXHRcdGRvd25sb2FkQWxsOiBcImRpdi5kb3dubG9hZEFsbFwiLFxuXHRcdGdyaWQ6IFwiZGl2LmdyaWRcIixcblx0fSxcblxuXHRjb2xsZWN0aW9uRXZlbnRzOiB7XG5cdFx0XCJidXR0b25jZWxsOmNsaWNrZWRcIjogXCJkb3dubG9hZEl0ZW1cIixcblx0XHRcInN5bmMgcmVzZXQgYWRkIHJlbW92ZVwiOiBcInVwZGF0ZUNvdW50ZXJcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5hZGRJY29uXCI6IFwic2hvd0FkZFwiLFxuXHRcdFwiY2xpY2sgQHVpLmltcG9ydEljb25cIjogXCJzaG93SW1wb3J0XCIsXG5cdFx0XCJjbGljayBAdWkuZG93bmxvYWRcIjogXCJzaG93RG93bmxvYWRzXCIsXG5cdFx0XCJjbGljayBAdWkuZG93bmxvYWRBbGxcIjogXCJkb3dubG9hZENTVk1hcmtzXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5yYXcgPSBuZXcgTWFya0NvbGxlY3Rpb24oKTtcblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLmdyaWQpXG5cdFx0XHR0aGlzLmdyaWQuZGVzdHJveSgpO1xuXHR9LFxuXG5cdHVwZGF0ZUNvdW50ZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHBhZ2VTdGFydCA9ICgoKHRoaXMuY29sbGVjdGlvbi5zdGF0ZS5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5jb2xsZWN0aW9uLnN0YXRlLnBhZ2VTaXplKSArIDEpO1xuXHRcdGxldCBwYWdlRW5kID0gKCh0aGlzLmNvbGxlY3Rpb24uc3RhdGUuY3VycmVudFBhZ2UpICogdGhpcy5jb2xsZWN0aW9uLnN0YXRlLnBhZ2VTaXplKTtcblx0XHRpZiAocGFnZUVuZCA+IHRoaXMuY29sbGVjdGlvbi5zdGF0ZS50b3RhbFJlY29yZHMpXG5cdFx0XHRwYWdlRW5kID0gdGhpcy5jb2xsZWN0aW9uLnN0YXRlLnRvdGFsUmVjb3JkcztcblxuXHRcdGxldCB0ZXh0ID0gXCJDb250ZW50IGl0ZW1zIFwiICsgcGFnZVN0YXJ0ICsgXCIgLSBcIiArIHBhZ2VFbmQgKyBcIiBvZiBcIiArICh0aGlzLmNvbGxlY3Rpb24uc3RhdGUudG90YWxSZWNvcmRzKTtcblx0XHRpZiAodGhpcy5jb2xsZWN0aW9uLnN0YXRlLnRvdGFsUmVjb3JkcyA9PT0gbnVsbClcblx0XHRcdHRleHQgPSBcIk5vIGNvbnRlbnQgdG8gc2hvd1wiO1xuXG5cdFx0dGhpcy51aS5jb3VudGVyQmFyLnRleHQodGV4dCk7XG5cdH0sXG5cblxuXHRkb3dubG9hZExpc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHdpbmRvdy5vcGVuKHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3Jlc291cmNlcy9saXN0cy9jb250ZW50XCIpO1xuXHR9LFxuXG5cdGZpbHRlckNsb25lOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdHJldHVybiBtb2RlbC5nZXQoXCJjYXRlZ29yeVwiKSA9PT0gXCJhc3Nlc3NtZW50XCI7XG5cdH0sXG5cblx0ZG93bmxvYWRJdGVtOiBmdW5jdGlvbihpZCwgbW9kZWwpIHtcblx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9hc3Nlc3NtZW50cy9cIiArIG1vZGVsLmdldChcImFzc2Vzc21lbnRcIikgKyBcIi9tYXJrcy9cIiArIG1vZGVsLmdldChcImF0dGFjaG1lbnRcIikgK1xuXHRcdFx0XCIvcmVwb3J0P3N0dWRlbnRBbnN3ZXJzPXRydWUmYXNzZXNzbWFyaz1cIiArIG1vZGVsLmdldChcIl9pZFwiKSk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGJ0bk9wdGlvbnMgPSB7XG5cdFx0XHRjbGFzczogXCJkb3dubG9hZFwiLFxuXHRcdFx0aWQ6IFwiYnRuRG93bmxvYWRSZXBvcnRcIixcblx0XHRcdHRleHQ6IFwiPHNwYW4gY2xhc3M9J2ZhbCBmYS1jbG91ZC1kb3dubG9hZCcgdGl0bGU9J0Rvd25sb2FkIFBERiBSZXBvcnQnIC8+XCIsXG5cdFx0fTtcblxuXHRcdGNvbnN0IHVzZXIgPSByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpO1xuXG5cdFx0Y29uc3QgY29sdW1ucyA9IFtcblx0XHRcdHsgbmFtZTogXCJhc3Nlc3NtZW50VGl0bGVcIiwgbGFiZWw6IFwiQXNzZXNzbWVudFwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJpbnN0YW5jZVRpdGxlXCIsIGxhYmVsOiBcIkluc3RhbmNlXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImFzc2Vzc21lbnRTdWJqZWN0XCIsIGxhYmVsOiBcIlN1YmplY3RcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiY29tcGxldGVkXCIsIGNsYXNzOiBcImNvbXBsZXRlZHNcIiwgbGFiZWw6IFwiQ29tcGxldGVkXCIsIGNlbGw6IFNlcnZlckdyaWQuSFRNTENlbGwuZXh0ZW5kKHt9KSwgZWRpdGFibGU6IGZhbHNlLCBzb3J0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJtYXJrZWRcIiwgbGFiZWw6IFwiTWFya2VkXCIsIGNlbGw6IFNlcnZlckdyaWQuSFRNTENlbGwuZXh0ZW5kKHt9KSwgZWRpdGFibGU6IGZhbHNlLCBzb3J0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJ0b3RhbE1hcmtcIiwgbGFiZWw6IFwiTWFya1wiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJtYXhTY29yZVwiLCBsYWJlbDogXCJUb3RhbFwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbGFiZWw6IFwiRG93bmxvYWRcIiwgY2VsbDogbmV3IFNlcnZlckdyaWQuQnV0dG9uQ2VsbChidG5PcHRpb25zKSwgZWRpdGFibGU6IGZhbHNlLCBzb3J0YWJsZTogZmFsc2UgfSxcblx0XHRdO1xuXG5cdFx0aWYgKF8uaW5jbHVkZXModXNlci5yb2xlcywgXCJ0ZWFjaGVyXCIpIHx8IF8uaW5jbHVkZXModXNlci5yb2xlcywgXCJzdXBlcnVzZXJcIikpXG5cdFx0XHRjb2x1bW5zLnVuc2hpZnQoeyBuYW1lOiBcIm93bmVyTmFtZXNcIiwgbGFiZWw6IFwiU3R1ZGVudCBOYW1lc1wiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSk7XG5cblx0XHR0aGlzLmdyaWQgPSBuZXcgU2VydmVyR3JpZCh7XG5cdFx0XHRlbDogdGhpcy51aS5ncmlkLFxuXHRcdFx0Y29sdW1uczogY29sdW1ucyxcblx0XHRcdGNvbGxlY3Rpb246IHRoaXMucmF3LFxuXHRcdFx0Y2xpY2thYmxlOiBmYWxzZSxcblx0XHR9KTtcblxuXHRcdHRoaXMuY29sbGVjdGlvbiA9IHRoaXMuZ3JpZC5jb2xsZWN0aW9uO1xuXG5cdFx0dGhpcy5iaW5kRXZlbnRzKHRoaXMuY29sbGVjdGlvbiwgdGhpcy5jb2xsZWN0aW9uRXZlbnRzKTtcblxuXHRcdGNvbnN0IHNlYXJjaEZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwidGV4dFwiLFxuXHRcdFx0bmFtZTogXCJ0ZXh0RmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJUZXh0IFNlYXJjaFwiLFxuXHRcdFx0ZGVib3VuY2U6IDIwMCxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgY2F0cyA9IFtcblx0XHRcdHsgbmFtZTogXCJhc3Nlc3NtZW50XCIsIGxhYmVsOiBcIkFzc2Vzc21lbnRcIiB9LFxuXHRcdFx0eyBuYW1lOiBcImF1ZGlvXCIsIGxhYmVsOiBcIkF1ZGlvXCIgfSxcblx0XHRcdHsgbmFtZTogXCJmbGFzaGNhcmRkZWNrXCIsIGxhYmVsOiBcIkZsYXNoY2FyZCBEZWNrXCIgfSxcblx0XHRcdHsgbmFtZTogXCJpbWFnZVwiLCBsYWJlbDogXCJJbWFnZVwiIH0sXG5cdFx0XHR7IG5hbWU6IFwicGRmXCIsIGxhYmVsOiBcIlBERlwiIH0sXG5cdFx0XHR7IG5hbWU6IFwidGV4dFwiLCBsYWJlbDogXCJUZXh0XCIgfSxcblx0XHRcdHsgbmFtZTogXCJ1cmxcIiwgbGFiZWw6IFwiVVJMXCIgfSxcblx0XHRcdHsgbmFtZTogXCJ2aWRlb1wiLCBsYWJlbDogXCJWaWRlb1wiIH0sXG5cdFx0XTtcblxuXHRcdGlmIChzZXR0aW5ncy5vZmZpY2VDb250ZW50KSB7XG5cdFx0XHRjYXRzLnB1c2goeyBuYW1lOiBcImV4Y2VsXCIsIGxhYmVsOiBcIk1TIEV4Y2VsXCIgfSxcblx0XHRcdFx0eyBuYW1lOiBcInBvd2VycG9pbnRcIiwgbGFiZWw6IFwiTVMgUG93ZXJQb2ludFwiIH0sXG5cdFx0XHRcdHsgbmFtZTogXCJ3b3JkXCIsIGxhYmVsOiBcIk1TIFdvcmRcIiB9KTtcblx0XHR9XG5cblx0XHR0aGlzLnVpLmZpbHRlckJhci5wcmVwZW5kKHRoaXMuZ3JpZC5maWx0ZXIoeyBmaWx0ZXJDb250YWluZXI6IHRoaXMudWkuZmlsdGVyQmFyLCBmaWx0ZXJzOiBbc2VhcmNoRmlsdGVyXSwgZGVmYXVsdEZpbHRlcnM6IFtcInRleHRGaWx0ZXJcIiwgXCJ0eXBlXCJdIH0pLnJlbmRlcigpLmVsKTtcblxuXHRcdCQoXCIucGFnaW5nXCIsIHRoaXMuZWwpLmFwcGVuZCh0aGlzLmdyaWQucGFnaW5nKCkucmVuZGVyKCkuZWwpO1xuXG5cdFx0aWYgKCFzZXR0aW5ncy5hc3Nlc3NtZW50cylcblx0XHRcdHRoaXMudWkuaW1wb3J0SWNvbi5hZGRDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0cmVwcm9kdWNlSXRlbTogZnVuY3Rpb24obW9kZWwpIHtcblx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9hc3Nlc3NtZW50cy9cIiArIG1vZGVsLmdldChcIl9pZFwiKSArIFwiL3JlcG9ydFwiKTtcblx0fSxcblxuXHRkb3dubG9hZENTVk1hcmtzOiBmdW5jdGlvbigpIHtcblx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9hc3Nlc3NtZW50cy9zdHVkZW50L2V4cG9ydFwiKTtcblx0fSxcbn0pOyJdfQ==",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar eventBus = require(\"./console/eventBus\");\nvar App = require(\"../../index\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"tag-modal-container\",\n\n\ttemplate: require(\"../templates/tagModal.nunj\").content,\n\n\tui: {\n\t\tcolourBlock: \".colours div\",\n\t\tselectedColour: \".colours div.selected\",\n\t\tsave: \"button[name='save']\",\n\t\tcancel: \"button[name='cancel']\",\n\t\tcloser: \"div.close\",\n\n\t\tlabel: \"input[type='text']\",\n\t\tcustomColour: \"input[name='customColour']\",\n\n\t\tcreateButton: \"button.create\",\n\t\tupdateButton: \"button.update\",\n\t\tcancelButton: \"button.cancel\",\n\t\terrors: \"div.errors\",\n\t\tworkingSpinner: \"span.spinner-working\",\n\n\t\tdata: \"input[name='data']\",\n\t\tdetails: \".details\",\n\t\taction: \".action\"\n\t},\n\n\tregions: {\n\t\ttagModal: \".tag-modal\"\n\t},\n\n\tevents: {\n\t\tclick: \"onClick\",\n\t\t\"click @ui.createButton\": \"onSave\",\n\t\t\"click @ui.updateButton\": \"onSave\",\n\t\t\"click @ui.cancelButton\": \"onCancel\",\n\t\t\"click @ui.colourBlock\": \"chooseColour\",\n\t\t\"change @ui.customColour\": \"changeCustomColour\",\n\n\t\t\"change @ui.data\": \"onFileChanged\"\n\t},\n\n\tcolours: [\"92de69\", \"469c92\", \"fc5439\", \"50788e\", \"853a4c\", \"97b3c5\", \"d2362d\", \"2e5c5b\", \"eab22e\", \"452959\", \"0033cc\", \"418bca\", \"007437\", \"a8d695\", \"69d100\", \"34495e\", \"a195d5\", \"7e8c8d\", \"ff946a\", \"5843ac\", \"ac4362\", \"fe7f0e\", \"d9544f\", \"d1d100\", \"ad8d44\", \"78f4f4\", \"dacb25\", \"ff4057\", \"fff200\", \"ead3e3\"],\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tcolours: this.colours,\n\t\t\tgetSelectedCss: function getSelectedCss(col) {\n\t\t\t\treturn \"; border-color: #\" + col + \"; box-shadow: 0 0 8px #\" + col;\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.host = options.host || \"#modals\";\n\t\tthis.model = options.model;\n\t\tthis.action = options.action;\n\n\t\tthis.colour = this.model.get(\"colour\");\n\t},\n\n\tshow: function show() {\n\t\t$(\".modal-container\", $(this.host)).append(this.render().el);\n\t},\n\n\tonRender: function onRender() {\n\t\t// Render a background\n\t\t$(\".modal-element\", $(this.host)).removeClass(\"hide\");\n\t\t$(\"body\").addClass(\"hide-overflow\");\n\n\t\tthis.ui.action.text(this.action === \"update\" ? \"Edit\" : \"Create\");\n\n\t\tthis.ui[this.action + \"Button\"].removeClass(\"hide\");\n\t\tif (this.model.get(\"colour\")) {\n\t\t\tthis.ui.customColour.val(\"#\" + this.model.get(\"colour\")).css({\n\t\t\t\t\"box-shadow\": \"0 0 0\"\n\t\t\t}).removeClass(\"selected\");\n\t\t}\n\t},\n\n\tonDestroy: function onDestroy() {\n\t\t// Clean up the background\n\t\t$(\".modal-element\", $(this.host)).addClass(\"hide\");\n\t\t$(\"body\").removeClass(\"hide-overflow\");\n\t},\n\n\tonClick: function onClick(event) {\n\t\tevent.stopPropagation();\n\t},\n\n\tchooseColour: function chooseColour(evt) {\n\t\tevt.stopPropagation();\n\n\t\tthis.colour = $(evt.currentTarget).data(\"colour\");\n\n\t\t$(\"div.selected\", this.el).removeClass(\"selected\").css({\n\t\t\t\"border-color\": \"#FFF\",\n\t\t\t\"box-shadow\": \"0 0 0\"\n\t\t});\n\n\t\t$(evt.currentTarget).addClass(\"selected\").css({\n\t\t\t\"border-color\": \"#\" + this.colour,\n\t\t\t\"box-shadow\": \"0 0 8px #\" + this.colour\n\t\t});\n\n\t\tthis.ui.customColour.val(\"#\" + this.colour).css({\n\t\t\t\"box-shadow\": \"0 0 0\"\n\t\t}).removeClass(\"selected\");\n\t},\n\n\tchangeCustomColour: function changeCustomColour(evt) {\n\t\tevt.stopPropagation();\n\n\t\tthis.colour = evt.currentTarget.value.slice(1);\n\n\t\t$(\"div.selected\", this.el).removeClass(\"selected\").css({\n\t\t\t\"border-color\": \"#FFF\",\n\t\t\t\"box-shadow\": \"0 0 0\"\n\t\t});\n\n\t\tthis.ui.customColour.addClass(\"selected\").css({\n\t\t\t\"box-shadow\": \"0 0 8px #\" + this.colour\n\t\t});\n\t},\n\n\tonSave: function onSave(evt) {\n\t\tevt.stopPropagation();\n\n\t\tif (!_.trim(this.ui.label.val())) return this.ui.errors.html(\"<span class=\\\"error\\\">You must enter a label</span>\");\n\n\t\tif (!this.colour) return this.ui.errors.html(\"<span class=\\\"error\\\">You must choose a colour</span>\");\n\n\t\tthis.model.save({ label: _.trim(this.ui.label.val()), colour: this.colour }, { wait: true, success: this.saveSuccess.bind(this), error: this.saveError.bind(this) });\n\t},\n\n\tsaveSuccess: function saveSuccess() {\n\t\teventBus.trigger(eventBus.Events.TagModified, this.model, this.action === \"update\" ? \"updated\" : \"created\");\n\n\t\tthis.destroy();\n\t\tthis.trigger(\"action\", \"close\");\n\t},\n\n\tsaveError: function saveError(model, xhr) {\n\t\tvar answer = App.parseResponse(xhr);\n\t\tthis.ui.errors.html(\"<span class=\\\"error\\\">\" + (answer.detail || answer.info) + \"</span>\");\n\t},\n\n\tonCancel: function onCancel(evt) {\n\t\tevt.stopPropagation();\n\t\tthis.destroy();\n\t\tthis.trigger(\"action\", \"close\");\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRhZ01vZGFsLmpzIl0sIm5hbWVzIjpbIiQiLCJyZXF1aXJlIiwiXyIsIkJhY2tib25lIiwiZXZlbnRCdXMiLCJBcHAiLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJleHRlbmQiLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsImNvbnRlbnQiLCJ1aSIsImNvbG91ckJsb2NrIiwic2VsZWN0ZWRDb2xvdXIiLCJzYXZlIiwiY2FuY2VsIiwiY2xvc2VyIiwibGFiZWwiLCJjdXN0b21Db2xvdXIiLCJjcmVhdGVCdXR0b24iLCJ1cGRhdGVCdXR0b24iLCJjYW5jZWxCdXR0b24iLCJlcnJvcnMiLCJ3b3JraW5nU3Bpbm5lciIsImRhdGEiLCJkZXRhaWxzIiwiYWN0aW9uIiwicmVnaW9ucyIsInRhZ01vZGFsIiwiZXZlbnRzIiwiY2xpY2siLCJjb2xvdXJzIiwidGVtcGxhdGVDb250ZXh0IiwiZ2V0U2VsZWN0ZWRDc3MiLCJjb2wiLCJpbml0aWFsaXplIiwib3B0aW9ucyIsImhvc3QiLCJtb2RlbCIsImNvbG91ciIsImdldCIsInNob3ciLCJhcHBlbmQiLCJyZW5kZXIiLCJlbCIsIm9uUmVuZGVyIiwicmVtb3ZlQ2xhc3MiLCJhZGRDbGFzcyIsInRleHQiLCJ2YWwiLCJjc3MiLCJvbkRlc3Ryb3kiLCJvbkNsaWNrIiwiZXZlbnQiLCJzdG9wUHJvcGFnYXRpb24iLCJjaG9vc2VDb2xvdXIiLCJldnQiLCJjdXJyZW50VGFyZ2V0IiwiY2hhbmdlQ3VzdG9tQ29sb3VyIiwidmFsdWUiLCJzbGljZSIsIm9uU2F2ZSIsInRyaW0iLCJodG1sIiwid2FpdCIsInN1Y2Nlc3MiLCJzYXZlU3VjY2VzcyIsImJpbmQiLCJlcnJvciIsInNhdmVFcnJvciIsInRyaWdnZXIiLCJFdmVudHMiLCJUYWdNb2RpZmllZCIsImRlc3Ryb3kiLCJ4aHIiLCJhbnN3ZXIiLCJwYXJzZVJlc3BvbnNlIiwiZGV0YWlsIiwiaW5mbyIsIm9uQ2FuY2VsIl0sIm1hcHBpbmdzIjoi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RUFDQyxFQUFFeUIsTUFBTSxJQUFSLEVBQWNDLFNBQVMsS0FBS0MsV0FBTCxDQUFpQkMsSUFBakIsQ0FBc0IsSUFBdEIsQ0FBdkIsRUFBb0RDLE9BQU8sS0FBS0MsU0FBTCxDQUFlRixJQUFmLENBQW9CLElBQXBCLENBQTNELEVBREQ7QUFFQSxFQWhKK0M7O0FBa0poREQsY0FBYSx1QkFBVztBQUN2QmpFLFdBQVNxRSxPQUFULENBQWlCckUsU0FBU3NFLE1BQVQsQ0FBZ0JDLFdBQWpDLEVBQThDLEtBQUtsQyxLQUFuRCxFQUEwRCxLQUFLWixNQUFMLEtBQWdCLFFBQWhCLEdBQTJCLFNBQTNCLEdBQXVDLFNBQWpHOztBQUVBLE9BQUsrQyxPQUFMO0FBQ0EsT0FBS0gsT0FBTCxDQUFhLFFBQWIsRUFBdUIsT0FBdkI7QUFDQSxFQXZKK0M7O0FBeUpoREQsWUFBVyxtQkFBUy9CLEtBQVQsRUFBZ0JvQyxHQUFoQixFQUFxQjtBQUMvQixNQUFNQyxTQUFTekUsSUFBSTBFLGFBQUosQ0FBa0JGLEdBQWxCLENBQWY7QUFDQSxPQUFLL0QsRUFBTCxDQUFRVyxNQUFSLENBQWV5QyxJQUFmLENBQW9CLDRCQUE0QlksT0FBT0UsTUFBUCxJQUFpQkYsT0FBT0csSUFBcEQsSUFBNEQsU0FBaEY7QUFDQSxFQTVKK0M7O0FBOEpoREMsV0FBVSxrQkFBU3ZCLEdBQVQsRUFBYztBQUN2QkEsTUFBSUYsZUFBSjtBQUNBLE9BQUttQixPQUFMO0FBQ0EsT0FBS0gsT0FBTCxDQUFhLFFBQWIsRUFBdUIsT0FBdkI7QUFDQTtBQWxLK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoidGFnTW9kYWwuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IGV2ZW50QnVzID0gcmVxdWlyZShcIi4vY29uc29sZS9ldmVudEJ1c1wiKTtcbmNvbnN0IEFwcCA9IHJlcXVpcmUoXCIuLi8uLi9pbmRleFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInRhZy1tb2RhbC1jb250YWluZXJcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy90YWdNb2RhbC5udW5qXCIpLmNvbnRlbnQsXG5cblx0dWk6IHtcblx0XHRjb2xvdXJCbG9jazogXCIuY29sb3VycyBkaXZcIixcblx0XHRzZWxlY3RlZENvbG91cjogXCIuY29sb3VycyBkaXYuc2VsZWN0ZWRcIixcblx0XHRzYXZlOiBcImJ1dHRvbltuYW1lPSdzYXZlJ11cIixcblx0XHRjYW5jZWw6IFwiYnV0dG9uW25hbWU9J2NhbmNlbCddXCIsXG5cdFx0Y2xvc2VyOiBcImRpdi5jbG9zZVwiLFxuXG5cdFx0bGFiZWw6IFwiaW5wdXRbdHlwZT0ndGV4dCddXCIsXG5cdFx0Y3VzdG9tQ29sb3VyOiBcImlucHV0W25hbWU9J2N1c3RvbUNvbG91ciddXCIsXG5cblx0XHRjcmVhdGVCdXR0b246IFwiYnV0dG9uLmNyZWF0ZVwiLFxuXHRcdHVwZGF0ZUJ1dHRvbjogXCJidXR0b24udXBkYXRlXCIsXG5cdFx0Y2FuY2VsQnV0dG9uOiBcImJ1dHRvbi5jYW5jZWxcIixcblx0XHRlcnJvcnM6IFwiZGl2LmVycm9yc1wiLFxuXHRcdHdvcmtpbmdTcGlubmVyOiBcInNwYW4uc3Bpbm5lci13b3JraW5nXCIsXG5cblx0XHRkYXRhOiBcImlucHV0W25hbWU9J2RhdGEnXVwiLFxuXHRcdGRldGFpbHM6IFwiLmRldGFpbHNcIixcblx0XHRhY3Rpb246IFwiLmFjdGlvblwiLFxuXHR9LFxuXG5cdHJlZ2lvbnM6IHtcblx0XHR0YWdNb2RhbDogXCIudGFnLW1vZGFsXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0Y2xpY2s6IFwib25DbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmNyZWF0ZUJ1dHRvblwiOiBcIm9uU2F2ZVwiLFxuXHRcdFwiY2xpY2sgQHVpLnVwZGF0ZUJ1dHRvblwiOiBcIm9uU2F2ZVwiLFxuXHRcdFwiY2xpY2sgQHVpLmNhbmNlbEJ1dHRvblwiOiBcIm9uQ2FuY2VsXCIsXG5cdFx0XCJjbGljayBAdWkuY29sb3VyQmxvY2tcIjogXCJjaG9vc2VDb2xvdXJcIixcblx0XHRcImNoYW5nZSBAdWkuY3VzdG9tQ29sb3VyXCI6IFwiY2hhbmdlQ3VzdG9tQ29sb3VyXCIsXG5cblx0XHRcImNoYW5nZSBAdWkuZGF0YVwiOiBcIm9uRmlsZUNoYW5nZWRcIixcblx0fSxcblxuXHRjb2xvdXJzOiBbXG5cdFx0XCI5MmRlNjlcIiwgXCI0NjljOTJcIiwgXCJmYzU0MzlcIixcblx0XHRcIjUwNzg4ZVwiLCBcIjg1M2E0Y1wiLCBcIjk3YjNjNVwiLFxuXHRcdFwiZDIzNjJkXCIsIFwiMmU1YzViXCIsIFwiZWFiMjJlXCIsXG5cdFx0XCI0NTI5NTlcIiwgXCIwMDMzY2NcIiwgXCI0MThiY2FcIixcblx0XHRcIjAwNzQzN1wiLCBcImE4ZDY5NVwiLCBcIjY5ZDEwMFwiLFxuXHRcdFwiMzQ0OTVlXCIsIFwiYTE5NWQ1XCIsIFwiN2U4YzhkXCIsXG5cdFx0XCJmZjk0NmFcIiwgXCI1ODQzYWNcIiwgXCJhYzQzNjJcIixcblx0XHRcImZlN2YwZVwiLCBcImQ5NTQ0ZlwiLCBcImQxZDEwMFwiLFxuXHRcdFwiYWQ4ZDQ0XCIsIFwiNzhmNGY0XCIsIFwiZGFjYjI1XCIsXG5cdFx0XCJmZjQwNTdcIiwgXCJmZmYyMDBcIiwgXCJlYWQzZTNcIixcblx0XSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRjb2xvdXJzOiB0aGlzLmNvbG91cnMsXG5cdFx0XHRnZXRTZWxlY3RlZENzczogY29sID0+IGA7IGJvcmRlci1jb2xvcjogIyR7Y29sfTsgYm94LXNoYWRvdzogMCAwIDhweCAjJHtjb2x9YCxcblx0XHR9O1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLmhvc3QgPSBvcHRpb25zLmhvc3QgfHwgXCIjbW9kYWxzXCI7XG5cdFx0dGhpcy5tb2RlbCA9IG9wdGlvbnMubW9kZWw7XG5cdFx0dGhpcy5hY3Rpb24gPSBvcHRpb25zLmFjdGlvbjtcblxuXHRcdHRoaXMuY29sb3VyID0gdGhpcy5tb2RlbC5nZXQoXCJjb2xvdXJcIik7XG5cdH0sXG5cblx0c2hvdzogZnVuY3Rpb24oKSB7XG5cdFx0JChcIi5tb2RhbC1jb250YWluZXJcIiwgJCh0aGlzLmhvc3QpKS5hcHBlbmQodGhpcy5yZW5kZXIoKS5lbCk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIFJlbmRlciBhIGJhY2tncm91bmRcblx0XHQkKFwiLm1vZGFsLWVsZW1lbnRcIiwgJCh0aGlzLmhvc3QpKS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0JChcImJvZHlcIikuYWRkQ2xhc3MoXCJoaWRlLW92ZXJmbG93XCIpO1xuXG5cdFx0dGhpcy51aS5hY3Rpb24udGV4dCh0aGlzLmFjdGlvbiA9PT0gXCJ1cGRhdGVcIiA/IFwiRWRpdFwiIDogXCJDcmVhdGVcIik7XG5cblx0XHR0aGlzLnVpW3RoaXMuYWN0aW9uICsgXCJCdXR0b25cIl0ucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcImNvbG91clwiKSkge1xuXHRcdFx0dGhpcy51aS5jdXN0b21Db2xvdXIudmFsKFwiI1wiICsgdGhpcy5tb2RlbC5nZXQoXCJjb2xvdXJcIikpLmNzcyh7XG5cdFx0XHRcdFwiYm94LXNoYWRvd1wiOiBcIjAgMCAwXCIsXG5cdFx0XHR9KS5yZW1vdmVDbGFzcyhcInNlbGVjdGVkXCIpO1xuXHRcdH1cblx0fSxcblxuXHRvbkRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIENsZWFuIHVwIHRoZSBiYWNrZ3JvdW5kXG5cdFx0JChcIi5tb2RhbC1lbGVtZW50XCIsICQodGhpcy5ob3N0KSkuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdCQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKFwiaGlkZS1vdmVyZmxvd1wiKTtcblx0fSxcblxuXHRvbkNsaWNrOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9LFxuXG5cdGNob29zZUNvbG91cjogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0dGhpcy5jb2xvdXIgPSAkKGV2dC5jdXJyZW50VGFyZ2V0KS5kYXRhKFwiY29sb3VyXCIpO1xuXG5cdFx0JChcImRpdi5zZWxlY3RlZFwiLCB0aGlzLmVsKS5yZW1vdmVDbGFzcyhcInNlbGVjdGVkXCIpLmNzcyh7XG5cdFx0XHRcImJvcmRlci1jb2xvclwiOiBcIiNGRkZcIixcblx0XHRcdFwiYm94LXNoYWRvd1wiOiBcIjAgMCAwXCIsXG5cdFx0fSk7XG5cblx0XHQkKGV2dC5jdXJyZW50VGFyZ2V0KS5hZGRDbGFzcyhcInNlbGVjdGVkXCIpLmNzcyh7XG5cdFx0XHRcImJvcmRlci1jb2xvclwiOiBgIyR7dGhpcy5jb2xvdXJ9YCxcblx0XHRcdFwiYm94LXNoYWRvd1wiOiBgMCAwIDhweCAjJHt0aGlzLmNvbG91cn1gLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy51aS5jdXN0b21Db2xvdXIudmFsKFwiI1wiICsgdGhpcy5jb2xvdXIpLmNzcyh7XG5cdFx0XHRcImJveC1zaGFkb3dcIjogXCIwIDAgMFwiLFxuXHRcdH0pLnJlbW92ZUNsYXNzKFwic2VsZWN0ZWRcIik7XG5cdH0sXG5cblx0Y2hhbmdlQ3VzdG9tQ29sb3VyOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHR0aGlzLmNvbG91ciA9IGV2dC5jdXJyZW50VGFyZ2V0LnZhbHVlLnNsaWNlKDEpO1xuXG5cdFx0JChcImRpdi5zZWxlY3RlZFwiLCB0aGlzLmVsKS5yZW1vdmVDbGFzcyhcInNlbGVjdGVkXCIpLmNzcyh7XG5cdFx0XHRcImJvcmRlci1jb2xvclwiOiBcIiNGRkZcIixcblx0XHRcdFwiYm94LXNoYWRvd1wiOiBcIjAgMCAwXCIsXG5cdFx0fSk7XG5cblx0XHR0aGlzLnVpLmN1c3RvbUNvbG91ci5hZGRDbGFzcyhcInNlbGVjdGVkXCIpLmNzcyh7XG5cdFx0XHRcImJveC1zaGFkb3dcIjogYDAgMCA4cHggIyR7dGhpcy5jb2xvdXJ9YCxcblx0XHR9KTtcblx0fSxcblxuXHRvblNhdmU6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGlmICghXy50cmltKHRoaXMudWkubGFiZWwudmFsKCkpKVxuXHRcdFx0cmV0dXJuIHRoaXMudWkuZXJyb3JzLmh0bWwoXCI8c3BhbiBjbGFzcz1cXFwiZXJyb3JcXFwiPllvdSBtdXN0IGVudGVyIGEgbGFiZWw8L3NwYW4+XCIpO1xuXG5cdFx0aWYgKCF0aGlzLmNvbG91cilcblx0XHRcdHJldHVybiB0aGlzLnVpLmVycm9ycy5odG1sKFwiPHNwYW4gY2xhc3M9XFxcImVycm9yXFxcIj5Zb3UgbXVzdCBjaG9vc2UgYSBjb2xvdXI8L3NwYW4+XCIpO1xuXG5cdFx0dGhpcy5tb2RlbC5zYXZlKHsgbGFiZWw6IF8udHJpbSh0aGlzLnVpLmxhYmVsLnZhbCgpKSwgY29sb3VyOiB0aGlzLmNvbG91ciB9LFxuXHRcdFx0eyB3YWl0OiB0cnVlLCBzdWNjZXNzOiB0aGlzLnNhdmVTdWNjZXNzLmJpbmQodGhpcyksIGVycm9yOiB0aGlzLnNhdmVFcnJvci5iaW5kKHRoaXMpIH0pO1xuXHR9LFxuXG5cdHNhdmVTdWNjZXNzOiBmdW5jdGlvbigpIHtcblx0XHRldmVudEJ1cy50cmlnZ2VyKGV2ZW50QnVzLkV2ZW50cy5UYWdNb2RpZmllZCwgdGhpcy5tb2RlbCwgdGhpcy5hY3Rpb24gPT09IFwidXBkYXRlXCIgPyBcInVwZGF0ZWRcIiA6IFwiY3JlYXRlZFwiKTtcblxuXHRcdHRoaXMuZGVzdHJveSgpO1xuXHRcdHRoaXMudHJpZ2dlcihcImFjdGlvblwiLCBcImNsb3NlXCIpO1xuXHR9LFxuXG5cdHNhdmVFcnJvcjogZnVuY3Rpb24obW9kZWwsIHhocikge1xuXHRcdGNvbnN0IGFuc3dlciA9IEFwcC5wYXJzZVJlc3BvbnNlKHhocik7XG5cdFx0dGhpcy51aS5lcnJvcnMuaHRtbChcIjxzcGFuIGNsYXNzPVxcXCJlcnJvclxcXCI+XCIgKyAoYW5zd2VyLmRldGFpbCB8fCBhbnN3ZXIuaW5mbykgKyBcIjwvc3Bhbj5cIik7XG5cdH0sXG5cblx0b25DYW5jZWw6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHR0aGlzLmRlc3Ryb3koKTtcblx0XHR0aGlzLnRyaWdnZXIoXCJhY3Rpb25cIiwgXCJjbG9zZVwiKTtcblx0fSxcbn0pO1xuIl19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar rester = require(\"rester\");\nvar App = require(\"../../index\");\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar ServerGrid = require(\"../../lib/serverGrid\");\nvar settings = require(\"app-settings\");\nvar SmallModal = require(\"../../lib/smallModal\");\nvar TagModal = require(\"./tagModal\");\nvar eventBus = require(\"./console/eventBus\");\n\nvar TagModel = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"tag_id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/tags\";\n\t},\n\n\tcomputeds: {\n\t\ttag: function tag() {\n\t\t\tvar getContrast = function getContrast(colour) {\n\t\t\t\tif (!colour) return \"000\";\n\n\t\t\t\t// Calculate the perceptive luminance (aka luma) - human eye favors green color...\n\t\t\t\tvar luma = (0.299 * parseInt(colour.slice(0, 2), 16) + 0.587 * parseInt(colour.slice(2, 4), 16) + 0.114 * parseInt(colour.slice(4), 16)) / 255;\n\n\t\t\t\t// Return black for bright colors, white for dark colors\n\t\t\t\treturn luma > 0.5 ? \"000\" : \"FFF\";\n\t\t\t};\n\n\t\t\treturn \"<div class=\\\"tag\\\" style='background-color: #\" + this.get(\"colour\") + \";color:#\" + getContrast(this.get(\"colour\")) + \"'>\\n\\t\\t\\t\\t\" + (this.get(\"label\") ? this.get(\"label\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(/\\n/g, \"<br/>\") : this.get(\"label\")) + \"\\n\\t\\t\\t</div>\";\n\t\t}\n\t}\n});\n\nvar LearningPathModel = Backbone.Model.extend({\n\tdefaults: {},\n\n\tidAttribute: \"group\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/acacia/learningPaths/structure\";\n\t}\n});\n\nvar Collection = Backbone.PageableCollection.extend({\n\tmodel: TagModel,\n\n\tinitialize: function initialize(rows, options) {\n\t\tthis.learningPath = options.learningPath;\n\t},\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/tags?paged=true&lp=\" + this.learningPath;\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"content tag-manager\",\n\n\ttemplate: require(\"../templates/tags.nunj\"),\n\n\tui: {\n\t\tfilterBar: \".ops-bar .filters\",\n\t\tcounterBar: \".ops-bar .counter\",\n\t\taddTagIcon: \".add-tag\",\n\t\tpaging: \".paging\",\n\t\tgrid: \"div.grid\",\n\t\ttitle: \".title .title-text\"\n\t},\n\n\tcollectionEvents: {\n\t\t\"toolbar:click:delete\": \"deleteTag\",\n\t\t\"toolbar:click:edit\": \"updateTag\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.addTagIcon\": \"createTag\"\n\t},\n\n\tupdateTag: function updateTag(model) {\n\t\tthis.addEditTag(model, \"update\");\n\t},\n\n\tcreateTag: function createTag(model) {\n\t\tthis.addEditTag(model, \"create\");\n\t},\n\n\taddEditTag: function addEditTag(model, action) {\n\t\tvar modal = new TagModal({\n\t\t\tmodel: model instanceof Backbone.Model && model.get(\"tag_id\") ? model : new TagModel({ lp: this.options.learningPath }),\n\t\t\taction: action\n\t\t});\n\n\t\tmodal.show();\n\t},\n\n\tfilterDelete: function filterDelete(model) {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tif (model.get(\"owner\") !== user.user_id || !rester.hasAccess(rester.p.api.tags.delete, user) || this.noEdits) return false;\n\n\t\treturn true;\n\t},\n\n\tfilterEdit: function filterEdit(model) {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tif (model.get(\"owner\") !== user.user_id || !rester.hasAccess(rester.p.api.tags.put, user) || this.noEdits) return false;\n\n\t\treturn true;\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [\n\t\t//{ name: \"\", headerCell: \"select-all\", cell: \"select-row\" },\n\t\t{ name: \"tag\", label: \"Label\", cell: ServerGrid.HTMLCell.extend({}), editable: false }, { label: \"Actions\", cell: new ServerGrid.ToolbarCell({ tooltips: [{ title: \"Edit\", icon: \"fa-edit\", filter: this.filterEdit.bind(this) }, { title: \"Delete\", icon: \"fa-trash-alt\", filter: this.filterDelete.bind(this) }] }), editable: false, sortable: false }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new Collection([], {\n\t\t\t\tlearningPath: this.options.learningPath\n\t\t\t}),\n\t\t\tclickable: true,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counterBar,\n\t\t\t\ttemplate: \"Tags $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tthis.bindEvents(this.grid.collection, this.collectionEvents);\n\t\tthis.listenTo(eventBus, eventBus.Events.TagModified, this.onTagModified.bind(this));\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tthis.ui.filterBar.prepend(this.grid.filter({\n\t\t\tfilterContainer: this.ui.filterBar,\n\t\t\tfilters: [textFilter],\n\t\t\tdefaultFilters: [\"textFilter\"]\n\t\t}).render().el);\n\n\t\tif (this.options.learningPath) {\n\t\t\tthis.lpModel = new LearningPathModel({ group: this.options.learningPath });\n\t\t\tthis.lpModel.fetch({ success: this.fetchLpSuccess.bind(this), error: this.fetchLpError.bind(this) });\n\t\t\tthis.listenTo(this.grid, \"row:clicked\", this.updateTag.bind(this));\n\t\t} else {\n\t\t\tthis.ui.addTagIcon.addClass(\"hide\");\n\t\t\tthis.noEdits = true;\n\t\t}\n\t},\n\n\tfetchLpSuccess: function fetchLpSuccess() {\n\t\tif (this.lpModel.get(\"name\")) {\n\t\t\tthis.ui.title.text(\"Manage tags for \" + this.lpModel.get(\"name\"));\n\t\t} else {\n\t\t\tthis.ui.title.html(\"<span class= \\\"warning\\\"> Invalid Learning Path</span>\");\n\t\t\tthis.ui.addTagIcon.addClass(\"hide\");\n\t\t}\n\t},\n\n\tfetchLpError: function fetchLpError(model, xhr) {\n\t\tvar answer = App.parseResponse(xhr);\n\t\tconsole.error(answer.detail || answer.info);\n\t\tthis.ui.title.html(\"<span class= \\\"warning\\\"> Invalid Learning Path</span>\");\n\t},\n\n\tdeleteTag: function deleteTag(model) {\n\t\tvar _this = this;\n\n\t\tvar styles = \"background-color: #\" + model.get(\"colour\") + \"; border-radius: 10px; padding: 0px 8px;\";\n\t\tthis.delModal = new SmallModal({\n\t\t\tpersist: true,\n\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Delete Tag: <span style=\\\"\" + styles + \"\\\">\" + model.get(\"label\").replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t}) + \"</span>\",\n\t\t\tbody: \"<p>Are you sure you want to delete this tag?</p>\",\n\t\t\twarning: true\n\t\t});\n\t\tthis.delModal.on(\"button:ok\", function () {\n\t\t\tmodel.destroy({ wait: true, success: _this.deletionSuccess.bind(_this), error: _this.deletionError.bind(_this) });\n\t\t});\n\n\t\tthis.delModal.show();\n\t},\n\n\tdeletionSuccess: function deletionSuccess(model) {\n\t\tthis.delModal.destroy();\n\t\tradio.trigger(App.Events.Commands.Toast, { content: \"Tag \" + model.get(\"label\") + \" successfully deleted\", icon: \"fa-trash-alt\", iconColour: \"red\" });\n\t},\n\n\tdeletionError: function deletionError(model, xhr) {\n\t\tvar answer = App.parseResponse(xhr);\n\t\tthis.delModal.showError(\"Deletion failed: \" + (answer.detail || answer.info));\n\t},\n\n\tonTagModified: function onTagModified(model, type) {\n\t\tthis.grid.collection.getFirstPage();\n\n\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\tcontent: \"Tag \" + model.get(\"label\") + \" successfully \" + type\n\t\t});\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRhZ3MuanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwicmVzdGVyIiwiQXBwIiwicmFkaW8iLCJSYWRpbyIsImNoYW5uZWwiLCJTZXJ2ZXJHcmlkIiwic2V0dGluZ3MiLCJTbWFsbE1vZGFsIiwiVGFnTW9kYWwiLCJldmVudEJ1cyIsIlRhZ01vZGVsIiwiRXBveHkiLCJNb2RlbCIsImV4dGVuZCIsImlkQXR0cmlidXRlIiwidXJsUm9vdCIsImNvbXB1dGVkcyIsInRhZyIsImdldENvbnRyYXN0IiwiY29sb3VyIiwibHVtYSIsInBhcnNlSW50Iiwic2xpY2UiLCJnZXQiLCJyZXBsYWNlIiwiTGVhcm5pbmdQYXRoTW9kZWwiLCJkZWZhdWx0cyIsIkNvbGxlY3Rpb24iLCJQYWdlYWJsZUNvbGxlY3Rpb24iLCJtb2RlbCIsImluaXRpYWxpemUiLCJyb3dzIiwib3B0aW9ucyIsImxlYXJuaW5nUGF0aCIsInVybCIsInN0YXRlIiwicGFnZVNpemUiLCJtb2RlIiwicXVlcnlQYXJhbXMiLCJzb3J0S2V5IiwicGFyc2VTdGF0ZSIsInJlc3AiLCJ0b3RhbFJlY29yZHMiLCJ0b3RhbCIsInBhcnNlUmVjb3JkcyIsIm1vZHVsZSIsImV4cG9ydHMiLCJNYXJpb25ldHRlIiwiVmlldyIsInRhZ05hbWUiLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsInVpIiwiZmlsdGVyQmFyIiwiY291bnRlckJhciIsImFkZFRhZ0ljb24iLCJwYWdpbmciLCJncmlkIiwidGl0bGUiLCJjb2xsZWN0aW9uRXZlbnRzIiwiZXZlbnRzIiwidXBkYXRlVGFnIiwiYWRkRWRpdFRhZyIsImNyZWF0ZVRhZyIsImFjdGlvbiIsIm1vZGFsIiwibHAiLCJzaG93IiwiZmlsdGVyRGVsZXRlIiwidXNlciIsInJlcXVlc3QiLCJFdmVudHMiLCJSZXF1ZXN0cyIsIkN1cnJlbnRVc2VyIiwidXNlcl9pZCIsImhhc0FjY2VzcyIsInAiLCJhcGkiLCJ0YWdzIiwiZGVsZXRlIiwibm9FZGl0cyIsImZpbHRlckVkaXQiLCJwdXQiLCJvblJlbmRlciIsImNvbHVtbnMiLCJuYW1lIiwibGFiZWwiLCJjZWxsIiwiSFRNTENlbGwiLCJlZGl0YWJsZSIsIlRvb2xiYXJDZWxsIiwidG9vbHRpcHMiLCJpY29uIiwiZmlsdGVyIiwiYmluZCIsInNvcnRhYmxlIiwiZWwiLCJjb2xsZWN0aW9uIiwiY2xpY2thYmxlIiwiY291bnRlciIsImVsZW1lbnQiLCJiaW5kRXZlbnRzIiwibGlzdGVuVG8iLCJUYWdNb2RpZmllZCIsIm9uVGFnTW9kaWZpZWQiLCJ0ZXh0RmlsdGVyIiwidHlwZSIsImRlYm91bmNlIiwic2VydmVyIiwicHJlcGVuZCIsImZpbHRlckNvbnRhaW5lciIsImZpbHRlcnMiLCJkZWZhdWx0RmlsdGVycyIsInJlbmRlciIsImxwTW9kZWwiLCJncm91cCIsImZldGNoIiwic3VjY2VzcyIsImZldGNoTHBTdWNjZXNzIiwiZXJyb3IiLCJmZXRjaExwRXJyb3IiLCJhZGRDbGFzcyIsInRleHQiLCJodG1sIiwieGhyIiwiYW5zd2VyIiwicGFyc2VSZXNwb25zZSIsImNvbnNvbGUiLCJkZXRhaWwiLCJpbmZvIiwiZGVsZXRlVGFnIiwic3R5bGVzIiwiZGVsTW9kYWwiLCJwZXJzaXN0IiwieCIsImNoYXJDb2RlQXQiLCJib2R5Iiwid2FybmluZyIsIm9uIiwiZGVzdHJveSIsIndhaXQiLCJkZWxldGlvblN1Y2Nlc3MiLCJkZWxldGlvbkVycm9yIiwidHJpZ2dlciIsIkNvbW1hbmRzIiwiVG9hc3QiLCJjb250ZW50IiwiaWNvbkNvbG91ciIsInNob3dFcnJvciIsImdldEZpcnN0UGFnZSJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUMsU0FBU0QsUUFBUSxRQUFSLENBQWY7QUFDQSxJQUFNRSxNQUFNRixRQUFRLGFBQVIsQ0FBWjtBQUNBLElBQU1HLFFBQVFKLFNBQVNLLEtBQVQsQ0FBZUMsT0FBZixDQUF1QixRQUF2QixDQUFkOztBQUVBLElBQU1D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QVd5RSxRQUFYLENBQW9CQyxLQUFsQyxFQUF5QyxFQUFFQyxTQUFTLFNBQVNySCxNQUFNTixHQUFOLENBQVUsT0FBVixDQUFULEdBQThCLHVCQUF6QyxFQUFrRXFFLE1BQU0sY0FBeEUsRUFBd0Z1RCxZQUFZLEtBQXBHLEVBQXpDO0FBQ0EsRUFwSitDOztBQXNKaERMLGdCQUFlLHVCQUFTakgsS0FBVCxFQUFnQitGLEdBQWhCLEVBQXFCO0FBQ25DLE1BQU1DLFNBQVM1SCxJQUFJNkgsYUFBSixDQUFrQkYsR0FBbEIsQ0FBZjtBQUNBLE9BQUtRLFFBQUwsQ0FBY2dCLFNBQWQsQ0FBd0IsdUJBQXVCdkIsT0FBT0csTUFBUCxJQUFpQkgsT0FBT0ksSUFBL0MsQ0FBeEI7QUFDQSxFQXpKK0M7O0FBMkpoRHpCLGdCQUFlLHVCQUFTM0UsS0FBVCxFQUFnQjZFLElBQWhCLEVBQXNCO0FBQ3BDLE9BQUtqRCxJQUFMLENBQVV3QyxVQUFWLENBQXFCb0QsWUFBckI7O0FBRUFuSixRQUFNNkksT0FBTixDQUFjOUksSUFBSXNFLE1BQUosQ0FBV3lFLFFBQVgsQ0FBb0JDLEtBQWxDLEVBQXlDO0FBQ3hDQyxZQUFTLFNBQVNySCxNQUFNTixHQUFOLENBQVUsT0FBVixDQUFULEdBQThCLGdCQUE5QixHQUFpRG1GO0FBRGxCLEdBQXpDO0FBR0E7QUFqSytDLENBQWhDLENBQWpCIiwiZmlsZSI6InRhZ3MuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgcmVzdGVyID0gcmVxdWlyZShcInJlc3RlclwiKTtcbmNvbnN0IEFwcCA9IHJlcXVpcmUoXCIuLi8uLi9pbmRleFwiKTtcbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcblxuY29uc3QgU2VydmVyR3JpZCA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc2VydmVyR3JpZFwiKTtcbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcbmNvbnN0IFNtYWxsTW9kYWwgPSByZXF1aXJlKFwiLi4vLi4vbGliL3NtYWxsTW9kYWxcIik7XG5jb25zdCBUYWdNb2RhbCA9IHJlcXVpcmUoXCIuL3RhZ01vZGFsXCIpO1xuY29uc3QgZXZlbnRCdXMgPSByZXF1aXJlKFwiLi9jb25zb2xlL2V2ZW50QnVzXCIpO1xuXG5jb25zdCBUYWdNb2RlbCA9IEJhY2tib25lLkVwb3h5Lk1vZGVsLmV4dGVuZCh7XG5cdGlkQXR0cmlidXRlOiBcInRhZ19pZFwiLFxuXG5cdHVybFJvb3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC90YWdzXCI7XG5cdH0sXG5cblx0Y29tcHV0ZWRzOiB7XG5cdFx0dGFnOiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbnN0IGdldENvbnRyYXN0ID0gZnVuY3Rpb24oY29sb3VyKSB7XG5cdFx0XHRcdGlmICghY29sb3VyKVxuXHRcdFx0XHRcdHJldHVybiBcIjAwMFwiO1xuXG5cdFx0XHRcdC8vIENhbGN1bGF0ZSB0aGUgcGVyY2VwdGl2ZSBsdW1pbmFuY2UgKGFrYSBsdW1hKSAtIGh1bWFuIGV5ZSBmYXZvcnMgZ3JlZW4gY29sb3IuLi5cblx0XHRcdFx0Y29uc3QgbHVtYSA9ICgoMC4yOTkgKiBwYXJzZUludChjb2xvdXIuc2xpY2UoMCwgMiksIDE2KSkgKyAoMC41ODcgKiBwYXJzZUludChjb2xvdXIuc2xpY2UoMiwgNCksIDE2KSkgKyAoMC4xMTQgKiBwYXJzZUludChjb2xvdXIuc2xpY2UoNCksIDE2KSkpIC8gMjU1O1xuXG5cdFx0XHRcdC8vIFJldHVybiBibGFjayBmb3IgYnJpZ2h0IGNvbG9ycywgd2hpdGUgZm9yIGRhcmsgY29sb3JzXG5cdFx0XHRcdHJldHVybiBsdW1hID4gMC41ID8gXCIwMDBcIiA6IFwiRkZGXCI7XG5cdFx0XHR9O1xuXG5cdFx0XHRyZXR1cm4gYDxkaXYgY2xhc3M9XCJ0YWdcIiBzdHlsZT0nYmFja2dyb3VuZC1jb2xvcjogIyR7dGhpcy5nZXQoXCJjb2xvdXJcIil9O2NvbG9yOiMke2dldENvbnRyYXN0KHRoaXMuZ2V0KFwiY29sb3VyXCIpKX0nPlxuXHRcdFx0XHQkeyh0aGlzLmdldChcImxhYmVsXCIpID8gdGhpcy5nZXQoXCJsYWJlbFwiKS5yZXBsYWNlKC88L2csIFwiJmx0O1wiKS5yZXBsYWNlKC8+L2csIFwiJmd0O1wiKS5yZXBsYWNlKC9cXG4vZywgXCI8YnIvPlwiKSA6IHRoaXMuZ2V0KFwibGFiZWxcIikpfVxuXHRcdFx0PC9kaXY+YDtcblx0XHR9LFxuXHR9LFxufSk7XG5cbmNvbnN0IExlYXJuaW5nUGF0aE1vZGVsID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHtcblx0fSxcblxuXHRpZEF0dHJpYnV0ZTogXCJncm91cFwiLFxuXG5cdHVybFJvb3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYWNhY2lhL2xlYXJuaW5nUGF0aHMvc3RydWN0dXJlXCI7XG5cdH0sXG59KTtcblxuY29uc3QgQ29sbGVjdGlvbiA9IEJhY2tib25lLlBhZ2VhYmxlQ29sbGVjdGlvbi5leHRlbmQoe1xuXHRtb2RlbDogVGFnTW9kZWwsXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ocm93cywgb3B0aW9ucykge1xuXHRcdHRoaXMubGVhcm5pbmdQYXRoID0gb3B0aW9ucy5sZWFybmluZ1BhdGg7XG5cdH0sXG5cblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvdGFncz9wYWdlZD10cnVlJmxwPVwiICsgdGhpcy5sZWFybmluZ1BhdGg7XG5cdH0sXG5cblx0c3RhdGU6IHtcblx0XHRwYWdlU2l6ZTogMzAsXG5cdH0sXG5cdG1vZGU6IFwic2VydmVyXCIsXG5cblx0cXVlcnlQYXJhbXM6IHtcblx0XHRwYWdlU2l6ZTogXCJwYWdlU2l6ZVwiLFxuXHRcdHNvcnRLZXk6IFwic29ydEJ5XCIsXG5cdH0sXG5cblx0cGFyc2VTdGF0ZTogZnVuY3Rpb24ocmVzcCkge1xuXHRcdHJldHVybiB7IHRvdGFsUmVjb3JkczogcmVzcC50b3RhbCB9O1xuXHR9LFxuXG5cdHBhcnNlUmVjb3JkczogZnVuY3Rpb24ocmVzcCkge1xuXHRcdHJldHVybiByZXNwLnJvd3M7XG5cdH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogXCJkaXZcIixcblx0Y2xhc3NOYW1lOiBcImNvbnRlbnQgdGFnLW1hbmFnZXJcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy90YWdzLm51bmpcIiksXG5cblx0dWk6IHtcblx0XHRmaWx0ZXJCYXI6IFwiLm9wcy1iYXIgLmZpbHRlcnNcIixcblx0XHRjb3VudGVyQmFyOiBcIi5vcHMtYmFyIC5jb3VudGVyXCIsXG5cdFx0YWRkVGFnSWNvbjogXCIuYWRkLXRhZ1wiLFxuXHRcdHBhZ2luZzogXCIucGFnaW5nXCIsXG5cdFx0Z3JpZDogXCJkaXYuZ3JpZFwiLFxuXHRcdHRpdGxlOiBcIi50aXRsZSAudGl0bGUtdGV4dFwiLFxuXHR9LFxuXG5cdGNvbGxlY3Rpb25FdmVudHM6IHtcblx0XHRcInRvb2xiYXI6Y2xpY2s6ZGVsZXRlXCI6IFwiZGVsZXRlVGFnXCIsXG5cdFx0XCJ0b29sYmFyOmNsaWNrOmVkaXRcIjogXCJ1cGRhdGVUYWdcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5hZGRUYWdJY29uXCI6IFwiY3JlYXRlVGFnXCIsXG5cdH0sXG5cblx0dXBkYXRlVGFnOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdHRoaXMuYWRkRWRpdFRhZyhtb2RlbCwgXCJ1cGRhdGVcIik7XG5cdH0sXG5cblx0Y3JlYXRlVGFnOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdHRoaXMuYWRkRWRpdFRhZyhtb2RlbCwgXCJjcmVhdGVcIik7XG5cdH0sXG5cblx0YWRkRWRpdFRhZzogZnVuY3Rpb24obW9kZWwsIGFjdGlvbikge1xuXHRcdGNvbnN0IG1vZGFsID0gbmV3IFRhZ01vZGFsKHtcblx0XHRcdG1vZGVsOiBtb2RlbCBpbnN0YW5jZW9mIEJhY2tib25lLk1vZGVsICYmIG1vZGVsLmdldChcInRhZ19pZFwiKSA/IG1vZGVsIDogbmV3IFRhZ01vZGVsKHsgbHA6IHRoaXMub3B0aW9ucy5sZWFybmluZ1BhdGggfSksXG5cdFx0XHRhY3Rpb246IGFjdGlvbixcblx0XHR9KTtcblxuXHRcdG1vZGFsLnNob3coKTtcblx0fSxcblxuXHRmaWx0ZXJEZWxldGU6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0Y29uc3QgdXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cblx0XHRpZiAobW9kZWwuZ2V0KFwib3duZXJcIikgIT09IHVzZXIudXNlcl9pZCB8fCAhcmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5hcGkudGFncy5kZWxldGUsIHVzZXIpIHx8IHRoaXMubm9FZGl0cylcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdGZpbHRlckVkaXQ6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0Y29uc3QgdXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cblx0XHRpZiAobW9kZWwuZ2V0KFwib3duZXJcIikgIT09IHVzZXIudXNlcl9pZCB8fCAhcmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5hcGkudGFncy5wdXQsIHVzZXIpIHx8IHRoaXMubm9FZGl0cylcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBjb2x1bW5zID0gW1xuXHRcdFx0Ly97IG5hbWU6IFwiXCIsIGhlYWRlckNlbGw6IFwic2VsZWN0LWFsbFwiLCBjZWxsOiBcInNlbGVjdC1yb3dcIiB9LFxuXHRcdFx0eyBuYW1lOiBcInRhZ1wiLCBsYWJlbDogXCJMYWJlbFwiLCBjZWxsOiBTZXJ2ZXJHcmlkLkhUTUxDZWxsLmV4dGVuZCh7fSksIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBsYWJlbDogXCJBY3Rpb25zXCIsIGNlbGw6IG5ldyBTZXJ2ZXJHcmlkLlRvb2xiYXJDZWxsKHsgdG9vbHRpcHM6IFtcblx0XHRcdFx0eyB0aXRsZTogXCJFZGl0XCIsIGljb246IFwiZmEtZWRpdFwiLCBmaWx0ZXI6IHRoaXMuZmlsdGVyRWRpdC5iaW5kKHRoaXMpIH0sXG5cdFx0XHRcdHsgdGl0bGU6IFwiRGVsZXRlXCIsIGljb246IFwiZmEtdHJhc2gtYWx0XCIsIGZpbHRlcjogdGhpcy5maWx0ZXJEZWxldGUuYmluZCh0aGlzKSB9LFxuXHRcdFx0XSB9KSwgZWRpdGFibGU6IGZhbHNlLCBzb3J0YWJsZTogZmFsc2UgfSxcblx0XHRdO1xuXG5cdFx0dGhpcy5ncmlkID0gbmV3IFNlcnZlckdyaWQoe1xuXHRcdFx0ZWw6IHRoaXMudWkuZ3JpZCxcblx0XHRcdGNvbHVtbnM6IGNvbHVtbnMsXG5cdFx0XHRjb2xsZWN0aW9uOiBuZXcgQ29sbGVjdGlvbihbXSwge1xuXHRcdFx0XHRsZWFybmluZ1BhdGg6IHRoaXMub3B0aW9ucy5sZWFybmluZ1BhdGgsXG5cdFx0XHR9KSxcblx0XHRcdGNsaWNrYWJsZTogdHJ1ZSxcblx0XHRcdGNvdW50ZXI6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5jb3VudGVyQmFyLFxuXHRcdFx0XHR0ZW1wbGF0ZTogXCJUYWdzICRzdGFydCAtICRlbmQgb2YgJHRvdGFsXCIsXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdGVsZW1lbnQ6IHRoaXMudWkucGFnaW5nLFxuXHRcdFx0fSxcblx0XHR9KTtcblxuXHRcdHRoaXMuYmluZEV2ZW50cyh0aGlzLmdyaWQuY29sbGVjdGlvbiwgdGhpcy5jb2xsZWN0aW9uRXZlbnRzKTtcblx0XHR0aGlzLmxpc3RlblRvKGV2ZW50QnVzLCBldmVudEJ1cy5FdmVudHMuVGFnTW9kaWZpZWQsIHRoaXMub25UYWdNb2RpZmllZC5iaW5kKHRoaXMpKTtcblxuXHRcdGNvbnN0IHRleHRGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcInRleHRcIixcblx0XHRcdG5hbWU6IFwidGV4dEZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiVGV4dCBTZWFyY2hcIixcblx0XHRcdGRlYm91bmNlOiAyMDAsXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdHRoaXMudWkuZmlsdGVyQmFyLnByZXBlbmQodGhpcy5ncmlkLmZpbHRlcih7XG5cdFx0XHRmaWx0ZXJDb250YWluZXI6IHRoaXMudWkuZmlsdGVyQmFyLFxuXHRcdFx0ZmlsdGVyczogW3RleHRGaWx0ZXJdLFxuXHRcdFx0ZGVmYXVsdEZpbHRlcnM6IFtcInRleHRGaWx0ZXJcIl0sXG5cdFx0fSkucmVuZGVyKCkuZWwpO1xuXG5cdFx0aWYgKHRoaXMub3B0aW9ucy5sZWFybmluZ1BhdGgpIHtcblx0XHRcdHRoaXMubHBNb2RlbCA9IG5ldyBMZWFybmluZ1BhdGhNb2RlbCh7IGdyb3VwOiB0aGlzLm9wdGlvbnMubGVhcm5pbmdQYXRoIH0pO1xuXHRcdFx0dGhpcy5scE1vZGVsLmZldGNoKHsgc3VjY2VzczogdGhpcy5mZXRjaExwU3VjY2Vzcy5iaW5kKHRoaXMpLCBlcnJvcjogdGhpcy5mZXRjaExwRXJyb3IuYmluZCh0aGlzKSB9KTtcblx0XHRcdHRoaXMubGlzdGVuVG8odGhpcy5ncmlkLCBcInJvdzpjbGlja2VkXCIsIHRoaXMudXBkYXRlVGFnLmJpbmQodGhpcykpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMudWkuYWRkVGFnSWNvbi5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLm5vRWRpdHMgPSB0cnVlO1xuXHRcdH1cblx0fSxcblxuXHRmZXRjaExwU3VjY2VzczogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMubHBNb2RlbC5nZXQoXCJuYW1lXCIpKSB7XG5cdFx0XHR0aGlzLnVpLnRpdGxlLnRleHQoXCJNYW5hZ2UgdGFncyBmb3IgXCIgKyB0aGlzLmxwTW9kZWwuZ2V0KFwibmFtZVwiKSk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy51aS50aXRsZS5odG1sKFwiPHNwYW4gY2xhc3M9IFxcXCJ3YXJuaW5nXFxcIj4gSW52YWxpZCBMZWFybmluZyBQYXRoPC9zcGFuPlwiKTtcblx0XHRcdHRoaXMudWkuYWRkVGFnSWNvbi5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0fVxuXHR9LFxuXG5cdGZldGNoTHBFcnJvcjogZnVuY3Rpb24obW9kZWwsIHhocikge1xuXHRcdGNvbnN0IGFuc3dlciA9IEFwcC5wYXJzZVJlc3BvbnNlKHhocik7XG5cdFx0Y29uc29sZS5lcnJvcihhbnN3ZXIuZGV0YWlsIHx8IGFuc3dlci5pbmZvKTtcblx0XHR0aGlzLnVpLnRpdGxlLmh0bWwoXCI8c3BhbiBjbGFzcz0gXFxcIndhcm5pbmdcXFwiPiBJbnZhbGlkIExlYXJuaW5nIFBhdGg8L3NwYW4+XCIpO1xuXHR9LFxuXG5cdGRlbGV0ZVRhZzogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRjb25zdCBzdHlsZXMgPSBcImJhY2tncm91bmQtY29sb3I6ICNcIiArIG1vZGVsLmdldChcImNvbG91clwiKSArIFwiOyBib3JkZXItcmFkaXVzOiAxMHB4OyBwYWRkaW5nOiAwcHggOHB4O1wiO1xuXHRcdHRoaXMuZGVsTW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHRwZXJzaXN0OiB0cnVlLFxuXHRcdFx0dGl0bGU6IFwiPHNwYW4gY2xhc3M9J2ZhbCBmYS1leGNsYW1hdGlvbi10cmlhbmdsZScvPiBEZWxldGUgVGFnOiA8c3BhbiBzdHlsZT1cXFwiXCIgKyBzdHlsZXMgKyBcIlxcXCI+XCIgK1xuXHRcdFx0XHQobW9kZWwuZ2V0KFwibGFiZWxcIikpLnJlcGxhY2UoL1tcXCZcXDxcXD5cXCdcXFwiXS9nLCB4ID0+IFwiJiNcIiArIHguY2hhckNvZGVBdCgwKSArIFwiO1wiKSArIFwiPC9zcGFuPlwiLFxuXHRcdFx0Ym9keTogXCI8cD5BcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgdGFnPzwvcD5cIixcblx0XHRcdHdhcm5pbmc6IHRydWUsXG5cdFx0fSk7XG5cdFx0dGhpcy5kZWxNb2RhbC5vbihcImJ1dHRvbjpva1wiLCAoKSA9PiB7XG5cdFx0XHRtb2RlbC5kZXN0cm95KHsgd2FpdDogdHJ1ZSwgc3VjY2VzczogdGhpcy5kZWxldGlvblN1Y2Nlc3MuYmluZCh0aGlzKSwgZXJyb3I6IHRoaXMuZGVsZXRpb25FcnJvci5iaW5kKHRoaXMpIH0pO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5kZWxNb2RhbC5zaG93KCk7XG5cdH0sXG5cblx0ZGVsZXRpb25TdWNjZXNzOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdHRoaXMuZGVsTW9kYWwuZGVzdHJveSgpO1xuXHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5Ub2FzdCwgeyBjb250ZW50OiBcIlRhZyBcIiArIG1vZGVsLmdldChcImxhYmVsXCIpICsgXCIgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWRcIiwgaWNvbjogXCJmYS10cmFzaC1hbHRcIiwgaWNvbkNvbG91cjogXCJyZWRcIiB9KTtcblx0fSxcblxuXHRkZWxldGlvbkVycm9yOiBmdW5jdGlvbihtb2RlbCwgeGhyKSB7XG5cdFx0Y29uc3QgYW5zd2VyID0gQXBwLnBhcnNlUmVzcG9uc2UoeGhyKTtcblx0XHR0aGlzLmRlbE1vZGFsLnNob3dFcnJvcihcIkRlbGV0aW9uIGZhaWxlZDogXCIgKyAoYW5zd2VyLmRldGFpbCB8fCBhbnN3ZXIuaW5mbykpO1xuXHR9LFxuXG5cdG9uVGFnTW9kaWZpZWQ6IGZ1bmN0aW9uKG1vZGVsLCB0eXBlKSB7XG5cdFx0dGhpcy5ncmlkLmNvbGxlY3Rpb24uZ2V0Rmlyc3RQYWdlKCk7XG5cblx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuVG9hc3QsIHtcblx0XHRcdGNvbnRlbnQ6IFwiVGFnIFwiICsgbW9kZWwuZ2V0KFwibGFiZWxcIikgKyBcIiBzdWNjZXNzZnVsbHkgXCIgKyB0eXBlLFxuXHRcdH0pO1xuXHR9LFxufSk7XG4iXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar CustomGroupManager = require(\"./views/customGroupManager\");\nvar GroupManager = require(\"./views/groupmanager\");\nvar MembershipManager = require(\"./views/membershipManager\");\nvar TokenManager = require(\"./views/tokenManager\");\n\nvar Module = module.exports = new Backbone.Marionette.Application();\n\n// Add intra-module routing\nModule.routing = function (App) {\n\tModule.Router = {\n\t\troutes: {\n\t\t\t\"manageCustom(/:code)\": \"manageCustomGroups\",\n\t\t\tmanageGlobal: \"manageGlobalGroups\",\n\t\t\t\"manageMembership(/:code)\": \"manageMembership\",\n\t\t\tmanageTokens: \"manageTokens\"\n\t\t},\n\n\t\tmanageCustomGroups: function manageCustomGroups(code) {\n\t\t\tApp.loadView(new CustomGroupManager({ code: code }));\n\t\t},\n\n\t\tmanageGlobalGroups: function manageGlobalGroups() {\n\t\t\tApp.loadView(new GroupManager());\n\t\t},\n\n\t\tmanageMembership: function manageMembership(code) {\n\t\t\tApp.loadView(new MembershipManager({ code: code }));\n\t\t},\n\n\t\tmanageTokens: function manageTokens() {\n\t\t\tApp.loadView(new TokenManager());\n\t\t}\n\t};\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIkN1c3RvbUdyb3VwTWFuYWdlciIsIkdyb3VwTWFuYWdlciIsIk1lbWJlcnNoaXBNYW5hZ2VyIiwiVG9rZW5NYW5hZ2VyIiwiTW9kdWxlIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1hcmlvbmV0dGUiLCJBcHBsaWNhdGlvbiIsInJvdXRpbmciLCJSb3V0ZXIiLCJyb3V0ZXMiLCJtYW5hZ2VHbG9iYWwiLCJtYW5hZ2VUb2tlbnMiLCJtYW5hZ2VDdXN0b21Hcm91cHMiLCJjb2RlIiwiQXBwIiwibG9hZFZpZXciLCJtYW5hZ2VHbG9iYWxHcm91cHMiLCJtYW5hZ2VNZW1iZXJzaGlwIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7O0FBRUEsSUFBTUMscUJBQXFCRCxRQUFRLDRCQUFSLENBQTNCO0FBQ0EsSUFBTUUsZUFBZUYsUUFBUSxzQkFBUixDQUFyQjtBQUNBLElBQU1HLG9CQUFvQkgsUUFBUSwyQkFBUixDQUExQjtBQUNBLElBQU1JLGVBQWVKLFFBQVEsc0JBQVIsQ0FBckI7O0FBRUEsSUFBTUssU0FBU0MsT0FBT0MsT0FBUCxHQUFpQixJQUFJUixTQUFTUyxVQUFULENBQW9CQyxXQUF4QixFQUFoQzs7QUFFQTtBQUNBSixPQUFPSyxPQUFQLEdBQWlCLGVBQU87QUFDdkJMLFFBQU9NLE1BQVAsR0FBZ0I7QUFDZkMsVUFBUTtBQUNQLDJCQUF3QixvQkFEakI7QUFFUEMsaUJBQWMsb0JBRlA7QUFHUCwrQkFBNEIsa0JBSHJCO0FBSVBDLGlCQUFjO0FBSlAsR0FETzs7QUFRZkMsc0JBQW9CLDRCQUFTQyxJQUFULEVBQWU7QUFDbENDLE9BQUlDLFFBQUosQ0FBYSxJQUFJakIsa0JBQUosQ0FBdUIsRUFBRWUsVUFBRixFQUF2QixDQUFiO0FBQ0EsR0FWYzs7QUFZZkcsc0JBQW9CLDhCQUFXO0FBQzlCRixPQUFJQyxRQUFKLENBQWEsSUFBSWhCLFlBQUosRUFBYjtBQUNBLEdBZGM7O0FBZ0Jma0Isb0JBQWtCLDBCQUFTSixJQUFULEVBQWU7QUFDaENDLE9BQUlDLFFBQUosQ0FBYSxJQUFJZixpQkFBSixDQUFzQixFQUFFYSxVQUFGLEVBQXRCLENBQWI7QUFDQSxHQWxCYzs7QUFvQmZGLGdCQUFjLHdCQUFXO0FBQ3hCRyxPQUFJQyxRQUFKLENBQWEsSUFBSWQsWUFBSixFQUFiO0FBQ0E7QUF0QmMsRUFBaEI7QUF3QkEsQ0F6QkQiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuXG5jb25zdCBDdXN0b21Hcm91cE1hbmFnZXIgPSByZXF1aXJlKFwiLi92aWV3cy9jdXN0b21Hcm91cE1hbmFnZXJcIik7XG5jb25zdCBHcm91cE1hbmFnZXIgPSByZXF1aXJlKFwiLi92aWV3cy9ncm91cG1hbmFnZXJcIik7XG5jb25zdCBNZW1iZXJzaGlwTWFuYWdlciA9IHJlcXVpcmUoXCIuL3ZpZXdzL21lbWJlcnNoaXBNYW5hZ2VyXCIpO1xuY29uc3QgVG9rZW5NYW5hZ2VyID0gcmVxdWlyZShcIi4vdmlld3MvdG9rZW5NYW5hZ2VyXCIpO1xuXG5jb25zdCBNb2R1bGUgPSBtb2R1bGUuZXhwb3J0cyA9IG5ldyBCYWNrYm9uZS5NYXJpb25ldHRlLkFwcGxpY2F0aW9uKCk7XG5cbi8vIEFkZCBpbnRyYS1tb2R1bGUgcm91dGluZ1xuTW9kdWxlLnJvdXRpbmcgPSBBcHAgPT4ge1xuXHRNb2R1bGUuUm91dGVyID0ge1xuXHRcdHJvdXRlczoge1xuXHRcdFx0XCJtYW5hZ2VDdXN0b20oLzpjb2RlKVwiOiBcIm1hbmFnZUN1c3RvbUdyb3Vwc1wiLFxuXHRcdFx0bWFuYWdlR2xvYmFsOiBcIm1hbmFnZUdsb2JhbEdyb3Vwc1wiLFxuXHRcdFx0XCJtYW5hZ2VNZW1iZXJzaGlwKC86Y29kZSlcIjogXCJtYW5hZ2VNZW1iZXJzaGlwXCIsXG5cdFx0XHRtYW5hZ2VUb2tlbnM6IFwibWFuYWdlVG9rZW5zXCIsXG5cdFx0fSxcblxuXHRcdG1hbmFnZUN1c3RvbUdyb3VwczogZnVuY3Rpb24oY29kZSkge1xuXHRcdFx0QXBwLmxvYWRWaWV3KG5ldyBDdXN0b21Hcm91cE1hbmFnZXIoeyBjb2RlIH0pKTtcblx0XHR9LFxuXG5cdFx0bWFuYWdlR2xvYmFsR3JvdXBzOiBmdW5jdGlvbigpIHtcblx0XHRcdEFwcC5sb2FkVmlldyhuZXcgR3JvdXBNYW5hZ2VyKCkpO1xuXHRcdH0sXG5cblx0XHRtYW5hZ2VNZW1iZXJzaGlwOiBmdW5jdGlvbihjb2RlKSB7XG5cdFx0XHRBcHAubG9hZFZpZXcobmV3IE1lbWJlcnNoaXBNYW5hZ2VyKHsgY29kZSB9KSk7XG5cdFx0fSxcblxuXHRcdG1hbmFnZVRva2VuczogZnVuY3Rpb24oKSB7XG5cdFx0XHRBcHAubG9hZFZpZXcobmV3IFRva2VuTWFuYWdlcigpKTtcblx0XHR9LFxuXHR9O1xufTsiXX0=",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar globalGroupSelector_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<p class=\\\"text-center\\\">Choose a global group to work with</p>\\n\\n\\t<select name=\\\"groups\\\" data-placeholder=\\\"Global groups...\\\">\\n\\t</select>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar globalGroupSelector_oldRoot = globalGroupSelector_obj.root;\nglobalGroupSelector_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tglobalGroupSelector_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar customGroupSelector_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n    \";\nvar t_1;\nt_1 = ((env.getFilter(\"default\").call(context, runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"settings\")),\"fcClient\"),false))?\"disabled\":\"\");\nframe.set(\"isDisabled\", t_1, true);\nif(frame.topLevel) {\ncontext.setVariable(\"isDisabled\", t_1);\n}\nif(frame.topLevel) {\ncontext.addExport(\"isDisabled\", t_1);\n}\noutput += \"\\n\\n    <p class=\\\"text-center\\\">\\n        <button type=\\\"button\\\" \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"isDisabled\"), env.opts.autoescape);\noutput += \" class=\\\"button create-group\\\">\\n            Create New Custom Group\\n        </button>\\n    </p>\\n\\n    <div class=\\\"or\\\">&mdash; or &mdash;</div>\\n\\n    <p class=\\\"text-center\\\">View/edit an existing custom group</p>\\n\\n    <select \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"isDisabled\"), env.opts.autoescape);\noutput += \" name=\\\"groups\\\" data-placeholder=\\\"Choose a custom group to manage...\\\">\\n        <option value=\\\"\\\"></option>\\n    </select>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar customGroupSelector_oldRoot = customGroupSelector_obj.root;\ncustomGroupSelector_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcustomGroupSelector_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar customGroupCreator_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<p class=\\\"text-center\\\">Enter a name for the new custom group</p>\\n\\n\\t<input type=\\\"text\\\" class=\\\"custom-group-name\\\" value=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"name\"), env.opts.autoescape);\noutput += \"\\\">\\n\\n\\t<div class=\\\"custom-group-creator-footer\\\">\\n\\t\\t<div class=\\\"custom-group-creator-options\\\">\\n\\t\\t\\t<label>\\n\\t\\t\\t\\t<input type=\\\"checkbox\\\" id=\\\"input-generate-token\\\">\\n\\t\\t\\t\\tGenerate a token\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"custom-group-creator-message-container\\\">\\n\\t\\t\\t<div class=\\\"validation-error hide\\\">\\n\\t\\t\\t\\t<span class=\\\"validation-error-glyph fal fa-exclamation-triangle\\\" />&nbsp;&nbsp;<span class=\\\"validation-error-message\\\"></span>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"custom-group-creator-controls\\\">\\n\\t\\t\\t<button type=\\\"button\\\" class=\\\"button secondary button-reject-name\\\">Cancel</button>\\n\\t\\t\\t<button type=\\\"button\\\" class=\\\"button button-accept-name\\\">Start editing</button>\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar customGroupCreator_oldRoot = customGroupCreator_obj.root;\ncustomGroupCreator_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcustomGroupCreator_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar userGrid_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"grid-title-container\\\">\\n\\t\\t<span class=\\\"grid-title unselectable hide\\\"></span>\\n\\t</div>\\n\\n\\t<div class=\\\"grid-header\\\">\\n\\t\\t<div class=\\\"filter-region\\\"></div>\\n\\n\\t\\t<div class=\\\"user-counter-container\\\">\\n\\t\\t\\t<span class=\\\"user-counter\\\"></span>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"grid-region\\\"></div>\\n\\n\\t<div class=\\\"grid-paging\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar userGrid_oldRoot = userGrid_obj.root;\nuserGrid_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tuserGrid_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar editor_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"ops-bar\\\">\\n\\t\\t<div class=\\\"filters\\\"></div>\\n\\t\\t<div class=\\\"title\\\">Custom group name: <input value=\\\"\";\noutput += runtime.suppressValue((lineno = 3, colno = 65, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"customName\"), \"customName\", context, [])), env.opts.autoescape);\noutput += \"\\\"/></div>\\n\\t\\t<div class=\\\"counter\\\"></div>\\n\\t</div>\\n\\n\\t<div class=\\\"grid\\\"></div>\\n\\n\\t<div class=\\\"paging\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar editor_oldRoot = editor_obj.root;\neditor_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\teditor_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar header_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div>\\n\\t\\t<h4 class=\\\"title left\\\"><span class=\\\"fal fa-th\\\"/>&nbsp;Custom Groups</h4>\\n\\t</div>\\n\\n\\t<div class=\\\"editor-control-region hide\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"action-region right hide\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar header_oldRoot = header_obj.root;\nheader_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\theader_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar manager_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"header-region hide\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"status-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"global-group-selector-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"custom-group-selector-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"custom-group-creator-region hide\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"editor-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar manager_oldRoot = manager_obj.root;\nmanager_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmanager_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"globalGroupSelector\": new nunjucks.Template( {obj: globalGroupSelector_obj, type: \"code\"}, env),\t\"customGroupSelector\": new nunjucks.Template( {obj: customGroupSelector_obj, type: \"code\"}, env),\t\"customGroupCreator\": new nunjucks.Template( {obj: customGroupCreator_obj, type: \"code\"}, env),\t\"userGrid\": new nunjucks.Template( {obj: userGrid_obj, type: \"code\"}, env),\t\"editor\": new nunjucks.Template( {obj: editor_obj, type: \"code\"}, env),\t\"header\": new nunjucks.Template( {obj: header_obj, type: \"code\"}, env),\t\"manager\": new nunjucks.Template( {obj: manager_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar fileChooserCard_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"card-header\\\">\\n\\t\\t<span class=\\\"card-title\\\">Choose a file to upload</span>\\n\\t</div>\\n\\n\\t<div class=\\\"card-body\\\">\\n\\t\\t<label>Select the CSV file that contains the custom group specification:\\n\\t\\t\\t<input type=\\\"file\\\" id=\\\"custom-group-file\\\" accept=\\\".csv\\\">\\n\\t\\t</label>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar fileChooserCard_oldRoot = fileChooserCard_obj.root;\nfileChooserCard_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tfileChooserCard_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar fileVerificationSuccess_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<p>Ready to make the following changes:</p>\\n\\n\\t<table class=\\\"statistics\\\">\\n\\t\\t<tr>\\n\\t\\t\\t<td><span class=\\\"change-type-label\\\">User additions: </span></td>\\n\\t\\t\\t<td><span class=\\\"change-type-value user-additions\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"userAdditions\"), env.opts.autoescape);\noutput += \"</span></td>\\n\\t\\t</tr>\\n\\t\\t<tr>\\n\\t\\t\\t<td><span class=\\\"change-type-label\\\">User removals: </span></td>\\n\\t\\t\\t<td><span class=\\\"change-type-value user removals\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"userRemovals\"), env.opts.autoescape);\noutput += \"</span></td>\\n\\t\\t</tr>\\n\\t</table>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar fileVerificationSuccess_oldRoot = fileVerificationSuccess_obj.root;\nfileVerificationSuccess_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tfileVerificationSuccess_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar fileVerificationError_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<p>Errors occurred during processing and are described below:</p>\\n\\n\\t<div class=\\\"grid-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar fileVerificationError_oldRoot = fileVerificationError_obj.root;\nfileVerificationError_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tfileVerificationError_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar fileVerificationCard_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"card-header\\\">\\n\\t\\t<span class=\\\"card-title\\\">Review the upload results</span>\\n\\t</div>\\n\\n\\t<div class=\\\"card-body\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar fileVerificationCard_oldRoot = fileVerificationCard_obj.root;\nfileVerificationCard_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tfileVerificationCard_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"fileChooserCard\": new nunjucks.Template( {obj: fileChooserCard_obj, type: \"code\"}, env),\t\"fileVerificationSuccess\": new nunjucks.Template( {obj: fileVerificationSuccess_obj, type: \"code\"}, env),\t\"fileVerificationError\": new nunjucks.Template( {obj: fileVerificationError_obj, type: \"code\"}, env),\t\"fileVerificationCard\": new nunjucks.Template( {obj: fileVerificationCard_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar information_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"information-profile\\\">\\n\\t\\t<div class=\\\"profile-icon\\\">\\n\\t\\t\\t<span class=\\\"fal fa-users-class\\\"/>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"profile-names\\\">\\n\\t\\t\\t<span class=\\\"profile-names-real\\\"><b>Name: </b>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"name\"), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t\\t<span class=\\\"profile-names-user\\\"><b>Code: </b>(\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"code\"), env.opts.autoescape);\noutput += \")</span>\\n\\t\\t\\t<span class=\\\"profile-email\\\"><b>Members: </b>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"membership_count\"), env.opts.autoescape);\noutput += \" <a target=\\\"_new\\\" href=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"urlRoot\"), env.opts.autoescape);\noutput += \"/groups/manageMembership/\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"code\")), env.opts.autoescape);\noutput += \"\\\"><em>(manage member list in new window)</em></a></span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"profile-roles\\\">\\n\\t\\t\\t<span>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"groupGrade\"), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar information_oldRoot = information_obj.root;\ninformation_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tinformation_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar bookListEmpty_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span>Group does not have any books.</span>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar bookListEmpty_oldRoot = bookListEmpty_obj.root;\nbookListEmpty_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tbookListEmpty_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar bookListItem_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"title\"), env.opts.autoescape);\noutput += \"</span>\\n\\n\\t<div class=\\\"user-details-book-list-item-metadata\\\">\\n\\t\\t<span>ISBN:&nbsp;\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"isbn\"), env.opts.autoescape);\noutput += \"</span>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar bookListItem_oldRoot = bookListItem_obj.root;\nbookListItem_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tbookListItem_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar cgListEmpty_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span>Group does not have any custom groups.</span>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar cgListEmpty_oldRoot = cgListEmpty_obj.root;\ncgListEmpty_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcgListEmpty_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar cgListItem_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"name\"), env.opts.autoescape);\noutput += \"</span>\\n\\n\\t<div class=\\\"user-details-book-list-item-metadata\\\">\\n\\t\\t<span>Code:&nbsp;\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"code\"), env.opts.autoescape);\noutput += \"</span>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar cgListItem_oldRoot = cgListItem_obj.root;\ncgListItem_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcgListItem_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar layout_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"button-close\\\">\\n\\t\\t<span class=\\\"fal fa-times\\\"/>\\n\\t</div>\\n\\n\\t<div class=\\\"status-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"information-region hide\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"container-region\\\">\\n\\n\\t\\t<div class=\\\"list-header-container hide\\\">\\n\\t\\t\\t<div>\\n\\t\\t\\t\\t<span>Books</span>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"list-container hide\\\">\\n\\t\\t\\t<div class=\\\"book-region\\\">\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"list-header-container hide\\\">\\n\\t\\t\\t<div>\\n\\t\\t\\t\\t<span>Custom Groups</span>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"list-container hide\\\">\\n\\t\\t\\t<div class=\\\"cg-region\\\">\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar layout_oldRoot = layout_obj.root;\nlayout_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlayout_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"information\": new nunjucks.Template( {obj: information_obj, type: \"code\"}, env),\t\"bookListEmpty\": new nunjucks.Template( {obj: bookListEmpty_obj, type: \"code\"}, env),\t\"bookListItem\": new nunjucks.Template( {obj: bookListItem_obj, type: \"code\"}, env),\t\"cgListEmpty\": new nunjucks.Template( {obj: cgListEmpty_obj, type: \"code\"}, env),\t\"cgListItem\": new nunjucks.Template( {obj: cgListItem_obj, type: \"code\"}, env),\t\"layout\": new nunjucks.Template( {obj: layout_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"header\\\">\\n\\t<h4 class=\\\"title left\\\"><span class=\\\"fal fa-users-class\\\"/>&nbsp;Global Groups</h4>\\n\\n\\t<div class=\\\"actions\\\">\\n\\t\\t\";\nif(((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"externalSync\")),\"groups\") != \"rw\" || runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"externalSync\")),\"groupYearExclusions\")),\"length\") > 0) && env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"api\")),\"groups\")),\"post\")))) {\noutput += \"\\n\\t\\t\\t<div class=\\\"add-group\\\"><span class=\\\"fal fa-plus\\\"/> Add Groups</div>\\n\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t<div class=\\\"download\\\"><span class=\\\"fal fa-cloud-download\\\"/> Downloads</div>\\n\\t</div>\\n</div>\\n\\n<div class=\\\"ops-bar\\\">\\n\\t<div class=\\\"filters\\\"></div>\\n\\t<div class=\\\"counter\\\"></div>\\n</div>\\n\\n<div class=\\\"grid\\\"></div>\\n\\n<div class=\\\"paging\\\"></div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar content_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\n\\t<div class=\\\"row\\\">\\n\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"oldCode\")) {\noutput += \"\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<label>\\n\\t\\t\\t\\tOld Code\\n\\t\\t\\t\\t<input type=\\\"text\\\" name=\\\"oldCode\\\" placeholder=\\\"Old Code\\\" value=\\\"\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"oldCode\")), env.opts.autoescape);\noutput += \"\\\" readonly/>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"oldName\")) {\noutput += \"\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<label>\\n\\t\\t\\t\\tOld Name\\n\\t\\t\\t\\t<input type=\\\"text\\\" name=\\\"oldName\\\" placeholder=\\\"Old Name\\\" value=\\\"\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"oldName\")), env.opts.autoescape);\noutput += \"\\\" readonly/>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"oldGrade\")) {\noutput += \"\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<label>\\n\\t\\t\\t\\tOld Year of Study\\n\\t\\t\\t\\t<select name=\\\"grade\\\" data-placeholder=\\\"Year of study\\\" \";\noutput += runtime.suppressValue(((lineno = 23, colno = 73, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, []))?\"\":\"disabled\"), env.opts.autoescape);\noutput += \">\\n\\t\\t\\t\\t\\t\";\nframe = frame.push();\nvar t_3 = runtime.contextOrFrameLookup(context, frame, \"gradeList\");\nif(t_3) {var t_1;\nif(runtime.isArray(t_3)) {\nvar t_2 = t_3.length;\nfor(t_1=0; t_1 < t_3.length; t_1++) {\nvar t_4 = t_3[t_1][0]\nframe.set(\"key\", t_3[t_1][0]);\nvar t_5 = t_3[t_1][1]\nframe.set(\"gradeSet\", t_3[t_1][1]);\nframe.set(\"loop.index\", t_1 + 1);\nframe.set(\"loop.index0\", t_1);\nframe.set(\"loop.revindex\", t_2 - t_1);\nframe.set(\"loop.revindex0\", t_2 - t_1 - 1);\nframe.set(\"loop.first\", t_1 === 0);\nframe.set(\"loop.last\", t_1 === t_2 - 1);\nframe.set(\"loop.length\", t_2);\noutput += \"\\n\\t\\t\\t\\t\\t\\t\";\nframe = frame.push();\nvar t_8 = t_5;\nif(t_8) {var t_7 = t_8.length;\nfor(var t_6=0; t_6 < t_8.length; t_6++) {\nvar t_9 = t_8[t_6];\nframe.set(\"gr\", t_9);\nframe.set(\"loop.index\", t_6 + 1);\nframe.set(\"loop.index0\", t_6);\nframe.set(\"loop.revindex\", t_7 - t_6);\nframe.set(\"loop.revindex0\", t_7 - t_6 - 1);\nframe.set(\"loop.first\", t_6 === 0);\nframe.set(\"loop.last\", t_6 === t_7 - 1);\nframe.set(\"loop.length\", t_7);\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t\";\nif(runtime.memberLookup((t_9),\"value\") == runtime.contextOrFrameLookup(context, frame, \"oldGrade\")) {\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t\\t<option value=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_9),\"value\"), env.opts.autoescape);\noutput += \"\\\" selected>\";\noutput += runtime.suppressValue(runtime.memberLookup((t_9),\"name\"), env.opts.autoescape);\noutput += \"</option>\\n\\t\\t\\t\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t\\t\\t\";\n;\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t\\t\\t\\t\";\n;\n}\n} else {\nt_1 = -1;\nvar t_2 = runtime.keys(t_3).length;\nfor(var t_10 in t_3) {\nt_1++;\nvar t_11 = t_3[t_10];\nframe.set(\"key\", t_10);\nframe.set(\"gradeSet\", t_11);\nframe.set(\"loop.index\", t_1 + 1);\nframe.set(\"loop.index0\", t_1);\nframe.set(\"loop.revindex\", t_2 - t_1);\nframe.set(\"loop.revindex0\", t_2 - t_1 - 1);\nframe.set(\"loop.first\", t_1 === 0);\nframe.set(\"loop.last\", t_1 === t_2 - 1);\nframe.set(\"loop.length\", t_2);\noutput += \"\\n\\t\\t\\t\\t\\t\\t\";\nframe = frame.push();\nvar t_14 = t_11;\nif(t_14) {var t_13 = t_14.length;\nfor(var t_12=0; t_12 < t_14.length; t_12++) {\nvar t_15 = t_14[t_12];\nframe.set(\"gr\", t_15);\nframe.set(\"loop.index\", t_12 + 1);\nframe.set(\"loop.index0\", t_12);\nframe.set(\"loop.revindex\", t_13 - t_12);\nframe.set(\"loop.revindex0\", t_13 - t_12 - 1);\nframe.set(\"loop.first\", t_12 === 0);\nframe.set(\"loop.last\", t_12 === t_13 - 1);\nframe.set(\"loop.length\", t_13);\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t\";\nif(runtime.memberLookup((t_15),\"value\") == runtime.contextOrFrameLookup(context, frame, \"oldGrade\")) {\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t\\t<option value=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_15),\"value\"), env.opts.autoescape);\noutput += \"\\\" selected>\";\noutput += runtime.suppressValue(runtime.memberLookup((t_15),\"name\"), env.opts.autoescape);\noutput += \"</option>\\n\\t\\t\\t\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t\\t\\t\";\n;\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t\\t\\t\\t\";\n;\n}\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t\\t\\t</select>\\n\\t\\t\\t</label>\\n\\t\\t\\t<hr>\\n\\t\\t</div>\\n\\t\\t\";\n;\n}\noutput += \"\\n\\n\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"code\")) {\noutput += \"\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<label>\\n\\t\\t\\t\\tCode\\n\\t\\t\\t\\t<input type=\\\"text\\\" name=\\\"code\\\" placeholder=\\\"Code\\\" value=\\\"\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"code\")), env.opts.autoescape);\noutput += \"\\\" readonly/>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\t\\t\";\n;\n}\noutput += \"\\n\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<label>\\n\\t\\t\\t\\tSubject\\n\\t\\t\\t\\t<input name=\\\"subject\\\"/>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<label>\\n\\t\\t\\t\\tLanguage\\n\\t\\t\\t\\t<select name=\\\"language\\\" data-placeholder=\\\"Language\\\" \";\noutput += runtime.suppressValue(((lineno = 56, colno = 71, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, []))?\"\":\"disabled\"), env.opts.autoescape);\noutput += \">\\n\\t\\t\\t\\t\\t<option value=\\\"\\\">\\n\\t\\t\\t\\t\\t\";\nframe = frame.push();\nvar t_18 = runtime.contextOrFrameLookup(context, frame, \"languageList\");\nif(t_18) {var t_17 = t_18.length;\nfor(var t_16=0; t_16 < t_18.length; t_16++) {\nvar t_19 = t_18[t_16];\nframe.set(\"lang\", t_19);\nframe.set(\"loop.index\", t_16 + 1);\nframe.set(\"loop.index0\", t_16);\nframe.set(\"loop.revindex\", t_17 - t_16);\nframe.set(\"loop.revindex0\", t_17 - t_16 - 1);\nframe.set(\"loop.first\", t_16 === 0);\nframe.set(\"loop.last\", t_16 === t_17 - 1);\nframe.set(\"loop.length\", t_17);\noutput += \"\\n\\t\\t\\t\\t\\t\\t<option value=\\\"\";\noutput += runtime.suppressValue(t_19, env.opts.autoescape);\noutput += \"\\\" \";\noutput += runtime.suppressValue((t_19 == runtime.contextOrFrameLookup(context, frame, \"language\")?\"selected\":\"\"), env.opts.autoescape);\noutput += \">\";\noutput += runtime.suppressValue(t_19, env.opts.autoescape);\noutput += \"\\n\\t\\t\\t\\t\\t\";\n;\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t\\t\\t</select>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<label>\\n\\t\\t\\t\\tYear of Study\\n\\t\\t\\t\\t<select name=\\\"grade\\\" data-placeholder=\\\"Year of study\\\" \";\noutput += runtime.suppressValue(((lineno = 68, colno = 73, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, []))?\"\":\"disabled\"), env.opts.autoescape);\noutput += \">\\n\\t\\t\\t\\t\\t<option value=\\\"\\\">\\n\\t\\t\\t\\t\";\nframe = frame.push();\nvar t_22 = runtime.contextOrFrameLookup(context, frame, \"gradeList\");\nif(t_22) {var t_20;\nif(runtime.isArray(t_22)) {\nvar t_21 = t_22.length;\nfor(t_20=0; t_20 < t_22.length; t_20++) {\nvar t_23 = t_22[t_20][0]\nframe.set(\"key\", t_22[t_20][0]);\nvar t_24 = t_22[t_20][1]\nframe.set(\"gradeSet\", t_22[t_20][1]);\nframe.set(\"loop.index\", t_20 + 1);\nframe.set(\"loop.index0\", t_20);\nframe.set(\"loop.revindex\", t_21 - t_20);\nframe.set(\"loop.revindex0\", t_21 - t_20 - 1);\nframe.set(\"loop.first\", t_20 === 0);\nframe.set(\"loop.last\", t_20 === t_21 - 1);\nframe.set(\"loop.length\", t_21);\noutput += \"\\n\\t\\t\\t\\t\\t<optgroup label=\\\"\";\noutput += runtime.suppressValue(t_23, env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t\\t\\t\";\nframe = frame.push();\nvar t_27 = t_24;\nif(t_27) {var t_26 = t_27.length;\nfor(var t_25=0; t_25 < t_27.length; t_25++) {\nvar t_28 = t_27[t_25];\nframe.set(\"gr\", t_28);\nframe.set(\"loop.index\", t_25 + 1);\nframe.set(\"loop.index0\", t_25);\nframe.set(\"loop.revindex\", t_26 - t_25);\nframe.set(\"loop.revindex0\", t_26 - t_25 - 1);\nframe.set(\"loop.first\", t_25 === 0);\nframe.set(\"loop.last\", t_25 === t_26 - 1);\nframe.set(\"loop.length\", t_26);\noutput += \"\\n\\t\\t\\t\\t\\t\\t<option value=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_28),\"value\"), env.opts.autoescape);\noutput += \"\\\" \";\noutput += runtime.suppressValue((runtime.memberLookup((t_28),\"value\") == runtime.contextOrFrameLookup(context, frame, \"grade\")?\"selected\":\"\"), env.opts.autoescape);\noutput += \">\";\noutput += runtime.suppressValue(runtime.memberLookup((t_28),\"name\"), env.opts.autoescape);\noutput += \"</option>\\n\\t\\t\\t\\t\\t\";\n;\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t\\t\\t\\t</optgroup>\\n\\t\\t\\t\\t\";\n;\n}\n} else {\nt_20 = -1;\nvar t_21 = runtime.keys(t_22).length;\nfor(var t_29 in t_22) {\nt_20++;\nvar t_30 = t_22[t_29];\nframe.set(\"key\", t_29);\nframe.set(\"gradeSet\", t_30);\nframe.set(\"loop.index\", t_20 + 1);\nframe.set(\"loop.index0\", t_20);\nframe.set(\"loop.revindex\", t_21 - t_20);\nframe.set(\"loop.revindex0\", t_21 - t_20 - 1);\nframe.set(\"loop.first\", t_20 === 0);\nframe.set(\"loop.last\", t_20 === t_21 - 1);\nframe.set(\"loop.length\", t_21);\noutput += \"\\n\\t\\t\\t\\t\\t<optgroup label=\\\"\";\noutput += runtime.suppressValue(t_29, env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t\\t\\t\";\nframe = frame.push();\nvar t_33 = t_30;\nif(t_33) {var t_32 = t_33.length;\nfor(var t_31=0; t_31 < t_33.length; t_31++) {\nvar t_34 = t_33[t_31];\nframe.set(\"gr\", t_34);\nframe.set(\"loop.index\", t_31 + 1);\nframe.set(\"loop.index0\", t_31);\nframe.set(\"loop.revindex\", t_32 - t_31);\nframe.set(\"loop.revindex0\", t_32 - t_31 - 1);\nframe.set(\"loop.first\", t_31 === 0);\nframe.set(\"loop.last\", t_31 === t_32 - 1);\nframe.set(\"loop.length\", t_32);\noutput += \"\\n\\t\\t\\t\\t\\t\\t<option value=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_34),\"value\"), env.opts.autoescape);\noutput += \"\\\" \";\noutput += runtime.suppressValue((runtime.memberLookup((t_34),\"value\") == runtime.contextOrFrameLookup(context, frame, \"grade\")?\"selected\":\"\"), env.opts.autoescape);\noutput += \">\";\noutput += runtime.suppressValue(runtime.memberLookup((t_34),\"name\"), env.opts.autoescape);\noutput += \"</option>\\n\\t\\t\\t\\t\\t\";\n;\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t\\t\\t\\t</optgroup>\\n\\t\\t\\t\\t\";\n;\n}\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t\\t\\t</select>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"perpetualGroups\")?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t<div class=\\\"row group-lifetime-row\\\">\\n\\t\\t\\t\\t\";\nif(((lineno = 83, colno = 21, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"externalSync\"), \"externalSync\", context, [])) == false || (runtime.memberLookup(((lineno = 83, colno = 56, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"groupYearExclusions\"), \"groupYearExclusions\", context, []))),\"length\") > 0 && (lineno = 83, colno = 103, runtime.callWrap(runtime.memberLookup(((lineno = 83, colno = 93, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"groupYearExclusions\"), \"groupYearExclusions\", context, []))),\"indexOf\"), \"the return value of (groupYearExclusions)[\\\"indexOf\\\"]\", context, [runtime.contextOrFrameLookup(context, frame, \"yr\")])) > -1))) {\noutput += \"\\n\\t\\t\\t\\t\\t<div class=\\\"large-3 columns\\\">\\n\\t\\t\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t\\t\\t<input type=\\\"checkbox\\\" name=\\\"customGroupLifetime\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"isLifetimeCustomised\")?\"checked\":\"\"), env.opts.autoescape);\noutput += \"/>\\n\\t\\t\\t\\t\\t\\t\\tCustomise this group's lifetime\\n\\t\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\n\\t\\t\\t\\t<div class=\\\"large-2 columns group-year \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"isLifetimeCustomised\") || runtime.contextOrFrameLookup(context, frame, \"isLifetimePerpetual\")?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t\\tYear\\n\\t\\t\\t\\t\\t\\t<select name=\\\"year\\\" data-placeholder=\\\"Year\\\" \";\noutput += runtime.suppressValue((!(lineno = 95, colno = 74, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isNew\"), \"isNew\", context, [])) && !(lineno = 95, colno = 92, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"canEdit\"), \"canEdit\", context, []))?\"disabled\":\"\"), env.opts.autoescape);\noutput += \" \";\noutput += runtime.suppressValue(((lineno = 95, colno = 119, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, []))?\"\":\"disabled\"), env.opts.autoescape);\noutput += \">\\n\\t\\t\\t\\t\\t\\t\\t<option value=\\\"\\\">\\n\\t\\t\\t\\t\\t\\t\\t\";\nframe = frame.push();\nvar t_37 = (lineno = 97, colno = 23, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"years\"), \"years\", context, []));\nif(t_37) {var t_36 = t_37.length;\nfor(var t_35=0; t_35 < t_37.length; t_35++) {\nvar t_38 = t_37[t_35];\nframe.set(\"yr\", t_38);\nframe.set(\"loop.index\", t_35 + 1);\nframe.set(\"loop.index0\", t_35);\nframe.set(\"loop.revindex\", t_36 - t_35);\nframe.set(\"loop.revindex0\", t_36 - t_35 - 1);\nframe.set(\"loop.first\", t_35 === 0);\nframe.set(\"loop.last\", t_35 === t_36 - 1);\nframe.set(\"loop.length\", t_36);\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t\\t\";\nif(((lineno = 98, colno = 23, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isModeEdit\"), \"isModeEdit\", context, [])) && t_38 == runtime.contextOrFrameLookup(context, frame, \"year\")) || ((lineno = 98, colno = 53, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"canEdit\"), \"canEdit\", context, [])) && ((lineno = 98, colno = 73, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"externalSync\"), \"externalSync\", context, [])) == false || (runtime.memberLookup(((lineno = 98, colno = 108, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"groupYearExclusions\"), \"groupYearExclusions\", context, []))),\"length\") > 0 && (lineno = 98, colno = 155, runtime.callWrap(runtime.memberLookup(((lineno = 98, colno = 145, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"groupYearExclusions\"), \"groupYearExclusions\", context, []))),\"indexOf\"), \"the return value of (groupYearExclusions)[\\\"indexOf\\\"]\", context, [t_38])) > -1)))) {\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<option value=\\\"\";\noutput += runtime.suppressValue(t_38, env.opts.autoescape);\noutput += \"\\\" \";\noutput += runtime.suppressValue((t_38 == runtime.contextOrFrameLookup(context, frame, \"year\")?\"selected\":\"\"), env.opts.autoescape);\noutput += \">\";\noutput += runtime.suppressValue(t_38, env.opts.autoescape);\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t\";\n;\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t\\t\\t\\t\\t</select>\\n\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div class=\\\"large-3 columns custom-group-lifetime \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"isLifetimeCustomised\") || runtime.contextOrFrameLookup(context, frame, \"isLifetimePerpetual\")?\"\":\"hide\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t\\t<input type=\\\"checkbox\\\" name=\\\"perpetualGroup\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"isLifetimePerpetual\")?\"checked\":\"\"), env.opts.autoescape);\noutput += \" \";\noutput += runtime.suppressValue((!(lineno = 108, colno = 118, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isNew\"), \"isNew\", context, [])) && !(lineno = 108, colno = 136, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"canEdit\"), \"canEdit\", context, []))?\"disabled\":\"\"), env.opts.autoescape);\noutput += \" \";\noutput += runtime.suppressValue(((lineno = 108, colno = 163, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, []))?\"\":\"disabled\"), env.opts.autoescape);\noutput += \"/>\\n\\t\\t\\t\\t\\t\\tMake this a perpetual group\\n\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div class=\\\"large-2 columns custom-group-lifetime definite-group-lifetime \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"isLifetimeCustomised\") && !runtime.contextOrFrameLookup(context, frame, \"isLifetimePerpetual\")?\"\":\"hide\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t\\t\\t<label>Start</label>\\n\\t\\t\\t\\t\\t<input type=\\\"text\\\" class=\\\"datetime\\\" id=\\\"start-date\\\" placeholder=\\\"date\\\" readonly \";\noutput += runtime.suppressValue((!(lineno = 115, colno = 109, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isNew\"), \"isNew\", context, [])) && !(lineno = 115, colno = 127, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"canEdit\"), \"canEdit\", context, []))?\"disabled\":\"\"), env.opts.autoescape);\noutput += \" \";\noutput += runtime.suppressValue(((lineno = 115, colno = 154, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, []))?\"\":\"disabled\"), env.opts.autoescape);\noutput += \">\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div class=\\\"large-1 column custom-group-lifetime definite-group-lifetime \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"isLifetimeCustomised\") && !runtime.contextOrFrameLookup(context, frame, \"isLifeTimePerpetual\")?\"\":\"hide\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div class=\\\"large-2 columns custom-group-lifetime definite-group-lifetime \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"isLifetimeCustomised\") && !runtime.contextOrFrameLookup(context, frame, \"isLifetimePerpetual\")?\"\":\"hide\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t\\t\\t<label>End</label>\\n\\t\\t\\t\\t\\t<input type=\\\"text\\\" class=\\\"datetime\\\" id=\\\"end-date\\\" placeholder=\\\"date\\\" readonly \";\noutput += runtime.suppressValue((!(lineno = 123, colno = 107, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isNew\"), \"isNew\", context, [])) && !(lineno = 123, colno = 125, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"canEdit\"), \"canEdit\", context, []))?\"disabled\":\"\"), env.opts.autoescape);\noutput += \" \";\noutput += runtime.suppressValue(((lineno = 123, colno = 152, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, []))?\"\":\"disabled\"), env.opts.autoescape);\noutput += \">\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<label>\\n\\t\\t\\t\\tMetadata (optional)\\n\\t\\t\\t\\t<input type=\\\"text\\\" name=\\\"metadata\\\" placeholder=\\\"Freeform text to differentiate groups. Used for filtering.\\\" value=\\\"\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"metadata\")), env.opts.autoescape);\noutput += \"\\\" \";\noutput += runtime.suppressValue(((lineno = 131, colno = 153, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, []))?\"\":\"disabled\"), env.opts.autoescape);\noutput += \"/>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<label>\\n\\t\\t\\t\\tName\\n\\t\\t\\t\\t<div class=\\\"relative\\\">\\n\\t\\t\\t\\t\\t\";\nif((lineno = 139, colno = 14, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isNew\"), \"isNew\", context, [])) || (lineno = 139, colno = 27, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"canEdit\"), \"canEdit\", context, []))) {\noutput += \"<div><input type=\\\"checkbox\\\" name=\\\"autoName\\\" \";\noutput += runtime.suppressValue(((lineno = 139, colno = 89, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, []))?\"\":\"disabled\"), env.opts.autoescape);\noutput += \"/> Set custom name</div>\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t\\t<input type=\\\"text\\\" name=\\\"name\\\" placeholder=\\\"Name\\\" value=\\\"\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"name\")), env.opts.autoescape);\noutput += \"\\\" readonly/>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<label>\\n\\t\\t\\t\\t<input type=\\\"checkbox\\\" name=\\\"system\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"systemGroup\")?\"checked\":\"\"), env.opts.autoescape);\noutput += \" \";\noutput += runtime.suppressValue((!(lineno = 147, colno = 95, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, [])) || runtime.contextOrFrameLookup(context, frame, \"educatorControl\") || !(env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"groups\")),\"makeSystem\")))?\"disabled\":\"\"), env.opts.autoescape);\noutput += \"/>\\n\\t\\t\\t\\tSystem Group\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<label>\\n\\t\\t\\t\\t<input type=\\\"checkbox\\\" name=\\\"educatorControl\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"educatorControl\")?\"checked\":\"\"), env.opts.autoescape);\noutput += \" \";\noutput += runtime.suppressValue((!(lineno = 154, colno = 108, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, [])) || (lineno = 154, colno = 126, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"externalSync\"), \"externalSync\", context, [])) || runtime.contextOrFrameLookup(context, frame, \"systemGroup\") || !(env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"groups\")),\"makeSystem\")))?\"disabled\":\"\"), env.opts.autoescape);\noutput += \"/>\\n\\t\\t\\t\\tEducators control membership\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<label>\\n\\t\\t\\t\\tMembership Parents\\n\\t\\t\\t\\t<select name=\\\"memberParents\\\" multiple \";\noutput += runtime.suppressValue((!(lineno = 162, colno = 69, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, [])) || (lineno = 162, colno = 87, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"externalSync\"), \"externalSync\", context, []))?\"disabled\":\"\"), env.opts.autoescape);\noutput += \"></select>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\t</div>\\n\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar content_oldRoot = content_obj.root;\ncontent_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcontent_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"content\": new nunjucks.Template( {obj: content_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar blankStatus_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span class=\\\"blank-status-message\\\">\";\noutput += runtime.suppressValue((lineno = 1, colno = 47, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"getMessage\"), \"getMessage\", context, [])), env.opts.autoescape);\noutput += \"</span>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar blankStatus_oldRoot = blankStatus_obj.root;\nblankStatus_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tblankStatus_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar header_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t\";\nif(((lineno = 1, colno = 16, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isMirrored\"), \"isMirrored\", context, [])))) {\noutput += \"\\n\\t\\t<div class=\\\"filter-region\\\">\\n\\t\\t</div>\\n\\t\\t<div class=\\\"title-container\\\">\\n\\t\\t\\t<h4 class=\\\"title right\\\">\";\noutput += runtime.suppressValue((lineno = 5, colno = 36, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"getTitle\"), \"getTitle\", context, [])), env.opts.autoescape);\noutput += \"&nbsp;<span class=\\\"fa \";\noutput += runtime.suppressValue((lineno = 5, colno = 70, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"getGlyph\"), \"getGlyph\", context, [])), env.opts.autoescape);\noutput += \"\\\"/></h4>\\n\\t\\t</div>\\n\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t<div class=\\\"title-container\\\">\\n\\t\\t\\t<h4 class=\\\"title\\\"><span class=\\\"fa \";\noutput += runtime.suppressValue((lineno = 9, colno = 46, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"getGlyph\"), \"getGlyph\", context, [])), env.opts.autoescape);\noutput += \"\\\"/>&nbsp;\";\noutput += runtime.suppressValue((lineno = 9, colno = 67, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"getTitle\"), \"getTitle\", context, [])), env.opts.autoescape);\noutput += \"</h4>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"filter-region\\\">\\n\\t\\t</div>\\n\\t\";\n;\n}\noutput += \"\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar header_oldRoot = header_obj.root;\nheader_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\theader_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar listLayout_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"list-header-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"body-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar listLayout_oldRoot = listLayout_obj.root;\nlistLayout_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlistLayout_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar serverListLayout_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"header\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"ops-bar\\\">\\n\\t\\t<div class=\\\"filters\\\"></div>\\n\\t\\t<div class=\\\"counter\\\"></div>\\n\\t</div>\\n\\n\\t<div class=\\\"grid\\\"></div>\\n\\n\\t<div class=\\\"paging\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar serverListLayout_oldRoot = serverListLayout_obj.root;\nserverListLayout_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tserverListLayout_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar manager_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"header-region hide\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"status-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"group-selector-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"user-manipulator-region hide\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar manager_oldRoot = manager_obj.root;\nmanager_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmanager_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar groupSelector_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<p class=\\\"text-center\\\">Choose a group to work with</p>\\n\\n\\t<select name=\\\"groups\\\" data-placeholder=\\\"Groups...\\\">\\n\\t</select>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar groupSelector_oldRoot = groupSelector_obj.root;\ngroupSelector_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tgroupSelector_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"blankStatus\": new nunjucks.Template( {obj: blankStatus_obj, type: \"code\"}, env),\t\"header\": new nunjucks.Template( {obj: header_obj, type: \"code\"}, env),\t\"listLayout\": new nunjucks.Template( {obj: listLayout_obj, type: \"code\"}, env),\t\"serverListLayout\": new nunjucks.Template( {obj: serverListLayout_obj, type: \"code\"}, env),\t\"manager\": new nunjucks.Template( {obj: manager_obj, type: \"code\"}, env),\t\"groupSelector\": new nunjucks.Template( {obj: groupSelector_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar displayBody_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<p class=\\\"token-cancellation-modal-body-text\\\">The token was cancelled.</p>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar displayBody_oldRoot = displayBody_obj.root;\ndisplayBody_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tdisplayBody_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar errorBody_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<p class=\\\"token-cancellation-modal-body-text\\\">\\n\\t\\tAn error occurred and the token could not be cancelled. Please try again or contact your support representative.\\n\\t</p>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar errorBody_oldRoot = errorBody_obj.root;\nerrorBody_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\terrorBody_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar statusBody_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"status-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar statusBody_oldRoot = statusBody_obj.root;\nstatusBody_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tstatusBody_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar confirmationBody_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<p class=\\\"token-cancellation-modal-body-text\\\">\\n\\t\\tCancel the token for the group: \";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"groupName\")), env.opts.autoescape);\noutput += \"?\\n\\t</p>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar confirmationBody_oldRoot = confirmationBody_obj.root;\nconfirmationBody_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tconfirmationBody_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"displayBody\": new nunjucks.Template( {obj: displayBody_obj, type: \"code\"}, env),\t\"errorBody\": new nunjucks.Template( {obj: errorBody_obj, type: \"code\"}, env),\t\"statusBody\": new nunjucks.Template( {obj: statusBody_obj, type: \"code\"}, env),\t\"confirmationBody\": new nunjucks.Template( {obj: confirmationBody_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar displayBody_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<p class=\\\"token-creation-modal-body-text\\\">The new token is</p>\\n\\t<br/><br/>\\n\\t<p class=\\\"token-creation-modal-display-body-token-value\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"value\"), env.opts.autoescape);\noutput += \"</p>\\n\\t<br/><br/>\\n\\t<p class=\\\"token-creation-modal-body-text\\\">Enter this token into a device to join the group: \";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"groupName\")), env.opts.autoescape);\noutput += \"\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar displayBody_oldRoot = displayBody_obj.root;\ndisplayBody_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tdisplayBody_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar errorBody_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<p class=\\\"token-creation-modal-body-text\\\">\\n\\t\\tAn error occurred and a token could not be obtained. Please try again or contact your support representative.\\n\\t</p>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar errorBody_oldRoot = errorBody_obj.root;\nerrorBody_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\terrorBody_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar statusBody_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"status-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar statusBody_oldRoot = statusBody_obj.root;\nstatusBody_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tstatusBody_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar formBody_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"option-region\\\">\\n\\t\\t<div class=\\\"selectable forever\\\"><span class=\\\"icon fal fa-circle\\\" />&nbsp;&nbsp;<span class=\\\"option-group-option-label forever\\\">The token will not expire</span></div>\\n\\t\\t<div class=\\\"selectable\\\"><span class=\\\"icon fal fa-check-circle\\\" />&nbsp;&nbsp;<span class=\\\"option-group-option-label\\\">The token will expire</span></div>\\n\\t</div>\\n\\n\\t<div class=\\\"expiration-form\\\">\\n\\t\\t<div class=\\\"form-field-container\\\">\\n\\t\\t\\t<div class=\\\"form-field-label\\\">\\n\\t\\t\\t\\t<span>Token lifetime (minutes)</span>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"form-field-value-container expiration-form-lifetime-region\\\">\\n\\t\\t\\t\\t<input type=\\\"number\\\" min=\\\"1\\\" max=\\\"9999\\\" value=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"lifetime\"), env.opts.autoescape);\noutput += \"\\\" length=\\\"6\\\"/>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar formBody_oldRoot = formBody_obj.root;\nformBody_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tformBody_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"displayBody\": new nunjucks.Template( {obj: displayBody_obj, type: \"code\"}, env),\t\"errorBody\": new nunjucks.Template( {obj: errorBody_obj, type: \"code\"}, env),\t\"statusBody\": new nunjucks.Template( {obj: statusBody_obj, type: \"code\"}, env),\t\"formBody\": new nunjucks.Template( {obj: formBody_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"header\\\">\\n\\t<h4 class=\\\"title left\\\"><span class=\\\"fal fa-users-class\\\"/>&nbsp;Custom Group Tokens</h4>\\n</div>\\n\\n<div class=\\\"ops-bar\\\">\\n\\t<div class=\\\"filters\\\"></div>\\n\\t<div class=\\\"counter\\\"></div>\\n</div>\\n\\n<div class=\\\"grid\\\"></div>\\n\\n<div class=\\\"paging\\\"></div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "\"use strict\";\n\nvar _regenerator = require(\"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\nvar _ = require(\"lodash\");\n/* eslint-disable node/no-extraneous-require */\nvar Backbone = require(\"backbone\");\nvar Promise = require(\"bluebird\");\nvar rester = require(\"rester\");\nvar $ = require(\"jquery\");\n\nvar App = require(\"../../index\");\nvar settings = require(\"app-settings\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar ActionHeader = require(\"../../lib/actionHeader\");\nvar ActionTitle = require(\"../../lib/actionTitle\");\nvar ActionToolbar = require(\"../../lib/actionToolbar\");\nvar ErrorView = require(\"../../lib/errorView\");\nvar SmallModal = require(\"../../lib/smallModal\");\nvar StatusView = require(\"../../lib/statusView\");\nvar TokenCreationModal = require(\"./tokenCreationModal\");\nvar TokenModel = require(\"./tokenModel\");\nvar UploadModal = require(\"./customGroupUploadModal\");\nvar Selectra = require(\"../../lib/selectra\");\nvar ServerGrid = require(\"../../lib/serverGrid\");\nvar gradeMap = require(\"../../lib/gradeMap\");\nvar Backgrid = require(\"backgrid\");\n\nvar GroupModel = Backbone.Model.extend({\n\tdefaults: {},\n\tidAttribute: \"code\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/groups/custom\";\n\t},\n\n\tvalidate: function validate(attributes) {\n\t\t// A collection of groups is required to validate a custom group's name. The Groups collection\n\t\t// augments every model added to it with a reference to itself.\n\n\t\tvar errors = {};\n\t\t//const user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tif (!attributes.name) errors.name = \"A name is required.\";\n\n\t\tif (_.keys(errors).length > 0) return errors;\n\t}\n});\n\nvar UserModel = Backbone.Epoxy.Model.extend({\n\tcomputeds: {\n\t\tuserGrade: function userGrade() {\n\t\t\treturn this.has(\"grade\") ? gradeMap.codeToHumanValue(this.get(\"grade\"), { lexical: true }) : \"\";\n\t\t}\n\t}\n});\n\nvar UserCollection = Backbone.PageableCollection.extend({\n\tmodel: UserModel,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/groups/manager/\" + this.globalGroup.get(\"code\") + \"/\" + this.customGroup.get(\"code\");\n\t},\n\n\tstate: {\n\t\tpageSize: 20\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tinitialize: function initialize(items, options) {\n\t\tthis.globalGroup = options.globalGroup;\n\t\tthis.customGroup = options.customGroup;\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nvar GlobalGroupSelector = Backbone.Marionette.View.extend({\n\tclassName: \"group-selector global-group-selector\",\n\tid: \"global-group-selector\",\n\n\ttemplate: require(\"../templates/customGroupManager.nunj\").globalGroupSelector,\n\n\tui: {\n\t\tgroups: \"select[name=groups]\"\n\t},\n\n\tevents: {\n\t\t\"change @ui.groups\": \"onGroupChange\"\n\t},\n\n\tonRender: function onRender() {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tvar select = new Selectra({\n\t\t\tserver: {\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/users/\" + encodeURIComponent(user.username) + \"/enrolment\",\n\t\t\t\tdelayLoad: true,\n\t\t\t\tkey: \"code\",\n\t\t\t\tvalue: \"name\",\n\t\t\t\tparams: {\n\t\t\t\t\textendedName: true\n\t\t\t\t}\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 20,\n\t\t\t\tinfinite: true\n\t\t\t},\n\t\t\tplaceholder: \"Choose a global group\"\n\t\t});\n\t\tselect.show({ el: this.ui.groups });\n\t},\n\n\tonGroupChange: function onGroupChange(evt, data) {\n\t\tthis.trigger(\"select\", data);\n\t}\n});\n\nvar CustomGroupSelector = Backbone.Marionette.View.extend({\n\tclassName: \"group-selector custom-group-selector\",\n\tid: \"custom-group-selector\",\n\n\ttemplate: require(\"../templates/customGroupManager.nunj\").customGroupSelector,\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tsettings: settings // This makes the 'settings' variable available to Nunjucks\n\t\t};\n\t},\n\n\tui: {\n\t\tbuttonCreateGroup: \"button.create-group\",\n\t\tgroups: \"select[name=groups]\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonCreateGroup\": \"onButtonCreateGroupClick\",\n\t\t\"change @ui.groups\": \"onGroupChange\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.globalGroup = options.globalGroup;\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this = this;\n\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tvar select = new Selectra({\n\t\t\tserver: {\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/users/\" + encodeURIComponent(user.username) + \"/groups/\" + encodeURIComponent(this.globalGroup.get(\"code\")) + \"/custom\",\n\t\t\t\tdelayLoad: true,\n\t\t\t\tkey: \"code\",\n\t\t\t\tvalue: \"name\",\n\t\t\t\tparams: {\n\t\t\t\t\textendedName: true\n\t\t\t\t}\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 20,\n\t\t\t\tinfinite: true\n\t\t\t},\n\t\t\tplaceholder: \"Choose a custom group to edit\"\n\t\t});\n\t\tselect.show({ el: this.ui.groups });\n\n\t\tthis.listenTo(this, \"refresh\", function (code) {\n\t\t\t_this.globalGroup = code;\n\t\t\tselect.trigger(\"clear\");\n\t\t}, this);\n\n\t\tthis.listenTo(this, \"reset\", function () {\n\t\t\tselect.trigger(\"clear\");\n\t\t}, this);\n\t},\n\n\tonButtonCreateGroupClick: function onButtonCreateGroupClick() {\n\t\tthis.trigger(\"create\", this.globalGroup);\n\t},\n\n\tonGroupChange: function onGroupChange(evt, data) {\n\t\tthis.trigger(\"select\", new GroupModel(data.toJSON()), this.globalGroup);\n\t}\n\n\t/*deselect: function()\n {\n \tthis.ui.groups.val(\"\");\n \t\tthis.updateGroupList();\n },*/\n});\n\nvar CustomGroupCreator = Backbone.Marionette.View.extend({\n\tclassName: \"group-selector custom-group-creator\",\n\n\ttemplate: require(\"../templates/customGroupManager.nunj\").customGroupCreator,\n\n\tui: {\n\t\tname: \"> input.custom-group-name\",\n\n\t\tvalidationError: \".validation-error\",\n\t\tvalidationErrorMessage: \".validation-error-message\",\n\t\tinputGenerateToken: \"#input-generate-token\",\n\t\tbuttonAcceptName: \".button-accept-name\",\n\t\tbuttonRejectName: \".button-reject-name\"\n\t},\n\n\tevents: {\n\t\t\"keydown @ui.name\": \"onNameKeydown\",\n\n\t\t\"click @ui.buttonAcceptName\": \"onButtonAcceptNameClick\",\n\t\t\"click @ui.buttonRejectName\": \"onButtonRejectNameClick\"\n\t},\n\n\tmodelEvents: {\n\t\tinvalid: \"onValidationError\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.globalGroup = options.globalGroup;\n\t},\n\n\tfocus: function focus() {\n\t\tthis.ui.name.focus();\n\t\tthis.ui.name.select();\n\t},\n\n\tonNameKeydown: function onNameKeydown(event) {\n\t\tif (event.which === 13) this.acceptName();else if (event.which === 27) this.rejectName();\n\t},\n\n\tonButtonAcceptNameClick: function onButtonAcceptNameClick() {\n\t\tthis.acceptName();\n\t},\n\n\tacceptName: function () {\n\t\tvar _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee2() {\n\t\t\tvar _this2 = this;\n\n\t\t\tvar currentUser, xhr, modal;\n\t\t\treturn _regenerator2.default.wrap(function _callee2$(_context2) {\n\t\t\t\twhile (1) {\n\t\t\t\t\tswitch (_context2.prev = _context2.next) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tthis.model.set({\n\t\t\t\t\t\t\t\tname: _.trim(this.ui.name.val())\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t// to the current custom group\n\t\t\t\t\t\t\tcurrentUser = radio.request(App.Events.Requests.CurrentUser);\n\n\t\t\t\t\t\t\t// If we can own a custom group, pass ourselves through as the owner\n\n\t\t\t\t\t\t\tif (!rester.hasAccess(rester.p.groups.all, currentUser) && rester.hasAccess(rester.p.groups.customGroups.owner, currentUser)) this.model.set({ owner: currentUser.user_id });\n\n\t\t\t\t\t\t\t// Save the model first, to get a code\n\t\t\t\t\t\t\txhr = this.model.save({ wait: true });\n\n\t\t\t\t\t\t\tif (xhr) {\n\t\t\t\t\t\t\t\t_context2.next = 6;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn _context2.abrupt(\"return\");\n\n\t\t\t\t\t\tcase 6:\n\t\t\t\t\t\t\t_context2.next = 8;\n\t\t\t\t\t\t\treturn Promise.resolve(xhr);\n\n\t\t\t\t\t\tcase 8:\n\n\t\t\t\t\t\t\tif (this.ui.inputGenerateToken.prop(\"checked\")) {\n\t\t\t\t\t\t\t\tmodal = new TokenCreationModal({\n\t\t\t\t\t\t\t\t\tmodel: new TokenModel({\n\t\t\t\t\t\t\t\t\t\tgroupCode: this.model.get(\"code\"),\n\t\t\t\t\t\t\t\t\t\tgroupName: this.model.get(\"name\"),\n\t\t\t\t\t\t\t\t\t\tlifetime: 30\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t\tuserOptions: {\n\t\t\t\t\t\t\t\t\t\tprompt: \"Create a token\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\n\n\t\t\t\t\t\t\t\tthis.listenTo(modal, \"close:success\", function () {\n\t\t\t\t\t\t\t\t\tvar _ref2 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee(model) {\n\t\t\t\t\t\t\t\t\t\tvar xhr2;\n\t\t\t\t\t\t\t\t\t\treturn _regenerator2.default.wrap(function _callee$(_context) {\n\t\t\t\t\t\t\t\t\t\t\twhile (1) {\n\t\t\t\t\t\t\t\t\t\t\t\tswitch (_context.prev = _context.next) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t_this2.stopListening(modal);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t_this2.model.set({ token: model.get(\"token\") });\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\txhr2 = _this2.model.save({ wait: true });\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t_context.next = 5;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn Promise.resolve(xhr2);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase 5:\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t_this2.trigger(\"accept\", _this2.model, _this2.globalGroup);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase 6:\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn _context.stop();\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}, _callee, _this2);\n\t\t\t\t\t\t\t\t\t}));\n\n\t\t\t\t\t\t\t\t\treturn function (_x) {\n\t\t\t\t\t\t\t\t\t\treturn _ref2.apply(this, arguments);\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}());\n\n\t\t\t\t\t\t\t\tthis.listenTo(modal, \"close:error\", function () {\n\t\t\t\t\t\t\t\t\t_this2.stopListening(modal);\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tthis.listenTo(modal, \"cancel\", function () {\n\t\t\t\t\t\t\t\t\t_this2.stopListening(modal);\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tmodal.show();\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.trigger(\"accept\", this.model, this.globalGroup);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcase 9:\n\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\treturn _context2.stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, _callee2, this);\n\t\t}));\n\n\t\tfunction acceptName() {\n\t\t\treturn _ref.apply(this, arguments);\n\t\t}\n\n\t\treturn acceptName;\n\t}(),\n\n\trejectName: function rejectName() {\n\t\tthis.ui.name.val(\"\");\n\t},\n\n\tonValidationError: function onValidationError(model, errors) {\n\t\tif (errors.name) {\n\t\t\tthis.ui.validationErrorMessage.text(errors.name);\n\t\t\tthis.ui.validationError.removeClass(\"hide\");\n\t\t}\n\t},\n\n\tonButtonRejectNameClick: function onButtonRejectNameClick() {\n\t\tthis.rejectName();\n\n\t\tthis.trigger(\"reject\", this.model);\n\t}\n});\n\nvar Header = ActionHeader.extend({\n\ttitleView: function titleView() {\n\t\treturn ActionTitle;\n\t},\n\n\ttoolbarView: function toolbarView() {\n\t\treturn ActionToolbar;\n\t},\n\n\tresetState: function resetState() {\n\t\tthis.state = {\n\t\t\tdataChanged: false\n\t\t};\n\t},\n\n\tonTitleReady: function onTitleReady() {\n\t\tthis.eventBus.trigger(\"action-title:change-glyph\", \"fa-th\");\n\t\tthis.eventBus.trigger(\"action-title:change-title\", \"Custom Groups\");\n\t},\n\n\tonToolbarReady: function onToolbarReady() {\n\t\t// Initialize state variables\n\t\tthis.resetState();\n\n\t\t// Set the action bar specification to display the editor toolbar\n\t\tthis.eventBus.trigger(\"action-toolbar:change-specification\", [{\n\t\t\tseparator: true\n\t\t}, {\n\t\t\tglyph: \"fa-user-plus\",\n\t\t\tname: \"action:addall\",\n\t\t\ttooltip: \"Add all users to this custom group\"\n\t\t}, {\n\t\t\tseparator: true\n\t\t}, {\n\t\t\tglyph: \"fa-user-minus\",\n\t\t\tname: \"action:removeall\",\n\t\t\ttooltip: \"Remove all users from this custom group\"\n\t\t}, {\n\t\t\tseparator: true\n\t\t}, {\n\t\t\tglyph: \"fa-cloud-download\",\n\t\t\tname: \"action:download\",\n\t\t\ttooltip: \"Download a snapshot of this custom group\"\n\t\t}, {\n\t\t\tseparator: true\n\t\t}, {\n\t\t\tglyph: \"fa-cloud-upload\",\n\t\t\tname: \"action:upload\",\n\t\t\ttooltip: \"Upload a selection of users\"\n\t\t}, {\n\t\t\tseparator: true\n\t\t}, {\n\t\t\tglyph: \"fa-copy\",\n\t\t\ttype: \"action-type-modification\",\n\t\t\tname: \"action:clone\",\n\t\t\ttooltip: \"Clone this custom group\"\n\t\t}, {\n\t\t\tseparator: true\n\t\t}, {\n\t\t\tglyph: \"fa-arrow-circle-up\",\n\t\t\ttype: \"action-type-modification\",\n\t\t\tname: \"action:upgrade\",\n\t\t\tpermission: this.getUpgradeActionPermission.bind(this),\n\t\t\ttooltip: \"Upgrade this custom group\"\n\t\t}, {\n\t\t\tseparator: true\n\t\t}, {\n\t\t\tglyph: \"fa-trash-alt\",\n\t\t\ttype: \"action-type-dangerous\",\n\t\t\tname: \"action:delete\",\n\t\t\tpermission: this.getDeleteActionPermission.bind(this),\n\t\t\ttooltip: \"Delete this custom group\"\n\t\t}, {\n\t\t\tseparator: true\n\t\t}, {\n\t\t\tglyph: \"fa-save\",\n\t\t\ttype: \"action-type-modification\",\n\t\t\tname: \"action:save\",\n\t\t\tpermission: this.getSaveActionPermission.bind(this),\n\t\t\ttooltip: \"Save this custom group\",\n\t\t\tspinnerEventSource: this.eventBus,\n\t\t\tspinnerShowEvent: \"editor:begin-save\",\n\t\t\tspinnerHideEvent: \"editor:end-save\"\n\t\t}]);\n\n\t\t// Register event handlers\n\t\tthis.listenTo(this.eventBus, \"editor:show\", this.onEditorShow.bind(this));\n\t\tthis.listenTo(this.eventBus, \"editor:back\", this.hideEditorToolbar.bind(this));\n\t\tthis.listenTo(this.eventBus, \"editor:delete\", this.hideEditorToolbar.bind(this));\n\n\t\tthis.listenTo(this.eventBus, \"editor:group-upgraded\", this.hideEditorToolbar.bind(this));\n\n\t\tthis.listenTo(this.eventBus, \"editor:data-changed\", this.onEditorDataChanged.bind(this));\n\t\tthis.listenTo(this.eventBus, \"editor:data-saved\", this.onEditorDataSaved.bind(this));\n\t},\n\n\tonEditorShow: function onEditorShow() {\n\t\tthis.resetState();\n\n\t\tthis.eventBus.trigger(\"action-toolbar:refresh\");\n\t\tthis.eventBus.trigger(\"action-toolbar:show\");\n\t},\n\n\thideEditorToolbar: function hideEditorToolbar() {\n\t\tthis.eventBus.trigger(\"action-toolbar:hide\");\n\t},\n\n\tonEditorDataChanged: function onEditorDataChanged(state) {\n\t\tthis.state.dataChanged = Boolean(state === false || state === true ? state : true);\n\n\t\tif (this.state.dataChanged) radio.trigger(App.Events.Commands.NavigationPrompt, \"<p>The group is not finished saving. If you leave now, changes will be lost.</p><p>Are you sure you wish to leave?</p>\");else radio.trigger(App.Events.Commands.NavigationPrompt, null);\n\n\t\tthis.eventBus.trigger(\"action-toolbar:refresh\");\n\t},\n\n\tonEditorDataSaved: function onEditorDataSaved() {\n\t\tthis.state.dataChanged = false;\n\n\t\tradio.trigger(App.Events.Commands.NavigationPrompt, null);\n\n\t\tthis.eventBus.trigger(\"action-toolbar:refresh\");\n\t},\n\n\tgetSaveActionPermission: function getSaveActionPermission() {\n\t\treturn this.state.dataChanged && this.eventBus.request(\"editor:get-change-permission\");\n\t},\n\n\tgetUpgradeActionPermission: function getUpgradeActionPermission() {\n\t\treturn rester.hasAccess(rester.p.api.groups.custom.upgrade.put, radio.request(App.Events.Requests.CurrentUser)) &&\n\t\t// eslint-disable-next-line no-sync\n\t\trester.hasAccess(rester.p.groups.all, radio.request(App.Events.Requests.CurrentUser)) && settings.externalSync.groups !== \"rw\";\n\t},\n\n\tgetDeleteActionPermission: function getDeleteActionPermission() {\n\t\treturn this.eventBus.request(\"editor:get-change-permission\");\n\t}\n});\n\nvar Editor = Backbone.Marionette.View.extend({\n\tclassName: \"custom-group-editor\",\n\n\ttemplate: require(\"../templates/customGroupManager.nunj\").editor,\n\n\tui: {\n\t\tgrid: \"div.grid\",\n\t\tpaging: \".paging\",\n\t\ttitle: \".title\",\n\t\tcounter: \".counter\",\n\t\tfilters: \".filters\",\n\t\ttitleInput: \".title input\"\n\t},\n\n\tevents: {\n\t\t\"input @ui.titleInput\": \"onCustomGroupNameChanged\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this3 = this;\n\n\t\treturn {\n\t\t\tcustomName: function customName() {\n\t\t\t\treturn _this3.customGroup.get(\"name\");\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.state = {\n\t\t\tdataChanged: false\n\t\t};\n\n\t\tthis.customGroup = options.customGroup;\n\t\tthis.eventBus = options.eventBus;\n\t\tthis.globalGroup = options.globalGroup;\n\n\t\tthis.listenTo(this.eventBus, \"action:back\", this.onActionBack.bind(this));\n\t\tthis.listenTo(this.eventBus, \"action:download\", this.onActionDownload.bind(this));\n\t\tthis.listenTo(this.eventBus, \"action:clone\", this.onActionClone.bind(this));\n\t\tthis.listenTo(this.eventBus, \"action:upgrade\", this.onActionUpgrade.bind(this));\n\t\tthis.listenTo(this.eventBus, \"action:save\", this.onActionSave.bind(this));\n\t\tthis.listenTo(this.eventBus, \"action:addall\", this.onActionAddAll.bind(this));\n\t\tthis.listenTo(this.eventBus, \"action:removeall\", this.onActionRemoveAll.bind(this));\n\n\t\tthis.listenTo(this.eventBus, \"editor:download\", this.onDownload.bind(this));\n\t\tthis.listenTo(this.eventBus, \"editor:begin-clone\", this.onBeginClone.bind(this));\n\t\tthis.listenTo(this.eventBus, \"editor:begin-upgrade\", this.onBeginUpgrade.bind(this));\n\n\t\tthis.eventBus.reply(\"editor:get-change-permission\", this.getChangePermission.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this4 = this;\n\n\t\tvar columns = [{ name: \"username\", label: \"Username\", cell: \"string\", editable: false }, { name: \"firstname\", label: \"First Name\", cell: \"string\", editable: false }, { name: \"surname\", label: \"Surname\", cell: \"string\", editable: false }, { name: \"userGrade\", label: \"Grade\", cell: \"string\", editable: false }, { name: \"member\", label: \"Group Member?\", cell: Backgrid.Cell.extend({\n\t\t\t\tclassName: \"skip\",\n\n\t\t\t\trender: function render() {\n\t\t\t\t\tthis.$el.html(\"<span class='fa-circle \" + (this.model.get(\"member\") ? \"fas membership-status-in' title='Is a member'\" : \"fal membership-status-out' title='Is not a member'\") + \"></span>\");\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t}),\n\t\t\teditable: false }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new UserCollection([], {\n\t\t\t\tcustomGroup: this.customGroup,\n\t\t\t\tglobalGroup: this.globalGroup\n\t\t\t}),\n\t\t\tclickable: true,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counter,\n\t\t\t\ttemplate: \"Users $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tthis.listenTo(this.grid.collection, \"sync\", this.applyEdits.bind(this));\n\t\tthis.listenTo(this.grid, \"row:clicked\", this.handleEdit.bind(this));\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar gradeFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"gradeFilter\",\n\t\t\tlabel: \"Grade\",\n\t\t\tserver: true,\n\t\t\tcategories: _.map(settings.gradeList, function (val, key) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: key,\n\t\t\t\t\titems: _.reduce(val.sort(function (a, b) {\n\t\t\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t\t\t}), function (sum, num) {\n\t\t\t\t\t\tsum.push({ name: num.value, label: num.name });return sum;\n\t\t\t\t\t}, [])\n\t\t\t\t};\n\t\t\t})\n\t\t};\n\n\t\tvar memberFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"memberFilter\",\n\t\t\tlabel: \"Membership\",\n\t\t\tcategories: [{ items: { 1: \"In Group\", 0: \"Out Of Group\" } }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar filterList = [textFilter, gradeFilter, memberFilter];\n\n\t\tthis.ui.filters.prepend(this.grid.filter({ filterContainer: this.ui.filters, filters: filterList, defaultFilters: [\"textFilter\", \"gradeFilter\", \"memberFilter\"] }).render().el);\n\n\t\t// Notify listeners that the editor has been shown\n\t\tthis.eventBus.trigger(\"editor:show\");\n\n\t\tif (!this.getChangePermission()) {\n\t\t\t// ...then warn the current user that changes cannot be saved\n\t\t\tvar modal = new SmallModal({\n\t\t\t\twarning: true,\n\t\t\t\tpersist: false,\n\t\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Edit Custom Group\",\n\t\t\t\tbody: \"<p>You are not the original creator and owner of this custom group.</p>\\n\\t\\t\\t\\t\\t\\t<p>You will not be able to save any changes you make.</p>\",\n\t\t\t\thideButtons: [\"cancel\"]\n\t\t\t});\n\n\t\t\tthis.listenTo(modal, \"button:ok\", function () {\n\t\t\t\t_this4.stopListening(modal);\n\t\t\t\tmodal.destroy();\n\t\t\t});\n\n\t\t\tmodal.show();\n\t\t}\n\t},\n\n\thandleEdit: function handleEdit(model) {\n\t\tif (!this.edits) this.edits = {};\n\n\t\tif (model.get(\"username\") in this.edits) {\n\t\t\tif (model.get(\"member\") === !this.edits[model.get(\"username\")]) {\n\t\t\t\tdelete this.edits[model.get(\"username\")];\n\t\t\t\tmodel.trigger(\"grid:colour\", null);\n\n\t\t\t\tthis.notifyDataChanged(_.keys(this.edits).length);\n\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tthis.edits[model.get(\"username\")] = !model.get(\"member\");\n\t\tmodel.trigger(\"grid:colour\", model.get(\"member\") ? \"#ef4952\" : \"#a3d075\");\n\n\t\tthis.notifyDataChanged(true);\n\t},\n\n\tapplyEdits: function applyEdits(col) {\n\t\tvar _this5 = this;\n\n\t\tif (!this.edits) return;\n\n\t\t_.each(col.models, function (x) {\n\t\t\tif (x.get(\"username\") in _this5.edits) x.trigger(\"grid:colour\", x.get(\"member\") ? \"#ef4952\" : \"#a3d075\");\n\t\t});\n\t},\n\n\tonGlobalGroupUserSelected: function onGlobalGroupUserSelected(userModel) {\n\t\tthis.moveUserFromGlobalToCustom(userModel);\n\t},\n\n\tonCustomGroupUserSelected: function onCustomGroupUserSelected(userModel) {\n\t\tthis.moveUserFromCustomToGlobal(userModel);\n\t},\n\n\tonCustomGroupNameChanged: function onCustomGroupNameChanged() {\n\t\tif (!_.trim(this.ui.titleInput.val())) {\n\t\t\tthis.notifyDataChanged(false);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.customGroup.set(\"name\", _.trim(this.ui.titleInput.val()));\n\n\t\tthis.notifyDataChanged(true);\n\t},\n\n\texecuteInstructions: function executeInstructions(instructions) {\n\t\tvar _this6 = this;\n\n\t\t// Convert the models into data to be saved\n\t\tvar dataa = _.reduce(instructions.models, function (sum, num) {\n\t\t\tif (num.get(\"operation\") === \"add\") sum[num.get(\"username\") || num.get(\"email\")] = true;else sum[num.get(\"username\") || num.get(\"email\")] = false;\n\t\t\treturn sum;\n\t\t}, {});\n\n\t\tvar len = _.keys(dataa).length;\n\n\t\tvar modal = new SmallModal({\n\t\t\ttitle: \"Custom group save confirmation\",\n\t\t\tbody: \"<p>This will update up to <strong>\" + len + \" user\" + (len === 1 ? \"\" : \"s\") + \"</strong>.</p>\\n\\t\\t\\t\\t<p>Do you wish to continue?</p>\",\n\t\t\tpersist: true\n\t\t});\n\n\t\tmodal.on(\"button:ok\", function () {\n\t\t\t_this6.eventBus.trigger(\"editor:begin-save\");\n\n\t\t\tPromise.resolve($.ajax({\n\t\t\t\tmethod: \"PUT\",\n\t\t\t\tdata: {\n\t\t\t\t\tchanges: dataa,\n\t\t\t\t\tusernames: true\n\t\t\t\t},\n\t\t\t\turl: settings.urlRoot + \"/api/1.0/groups/manager/\" + _this6.customGroup.get(\"code\"),\n\t\t\t\tjson: true\n\t\t\t})).then(function (data) {\n\t\t\t\tif (data.ok) {\n\t\t\t\t\t_this6.state.dataChanged = false;\n\n\t\t\t\t\t_this6.grid.collection.getFirstPage();\n\t\t\t\t\t_this6.eventBus.trigger(\"editor:data-saved\");\n\t\t\t\t\t_this6.eventBus.trigger(\"editor:end-save\");\n\n\t\t\t\t\t_this6.edits = {};\n\n\t\t\t\t\treturn modal.destroy();\n\t\t\t\t}\n\n\t\t\t\tmodal.showError(\"There was an error saving the changes\");\n\t\t\t\t_this6.eventBus.trigger(\"editor:end-save\");\n\t\t\t\treturn;\n\t\t\t}).catch(function (e) {\n\t\t\t\tmodal.showError(\"Save error: \" + e.info);\n\t\t\t\t_this6.eventBus.trigger(\"editor:end-save\");\n\t\t\t});\n\t\t}, this);\n\n\t\tsetTimeout(function () {\n\t\t\treturn modal.show();\n\t\t}, 50);\n\t},\n\n\tdeleteCustomGroup: function deleteCustomGroup(callbacks) {\n\t\tthis.customGroup.destroy({\n\t\t\twait: true,\n\t\t\tsuccess: callbacks && callbacks.success ? callbacks.success : undefined,\n\t\t\terror: callbacks && callbacks.error ? callbacks.error : undefined\n\t\t});\n\t},\n\n\tnotifyDataChanged: function notifyDataChanged(override) {\n\t\tif (!_.isUndefined(override)) this.state.dataChanged = Boolean(override);else if (_.keys(this.edits).length) this.state.dataChanged = true;else this.state.dataChanged = false;\n\n\t\tthis.eventBus.trigger(\"editor:data-changed\", this.state.dataChanged);\n\t},\n\n\tconfirmDataChange: function confirmDataChange(gatedEvent) {\n\t\tvar _this7 = this;\n\n\t\tvar options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\tif (this.state.dataChanged && this.getChangePermission()) {\n\t\t\tvar modal = new SmallModal({\n\t\t\t\twarning: true,\n\t\t\t\tpersist: true,\n\t\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Save Custom Group\",\n\t\t\t\tbody: \"<p>The custom group has not been saved. Would you like to save before continuing?</p>\",\n\t\t\t\tcustomOK: \"Yes\",\n\t\t\t\tcustomCancel: \"No\"\n\t\t\t});\n\n\t\t\tmodal.on(\"button:ok\", function () {\n\t\t\t\t_this7.saveCustomGroup({\n\t\t\t\t\tsuccess: function success() {\n\t\t\t\t\t\tmodal.destroy();\n\t\t\t\t\t\t_this7.eventBus.trigger(gatedEvent);\n\t\t\t\t\t},\n\t\t\t\t\terror: function error() {\n\t\t\t\t\t\tmodal.destroy();\n\t\t\t\t\t\tconsole.error(\"error saving custom group\");\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}, this);\n\n\t\t\tmodal.on(\"button:cancel\", function () {\n\t\t\t\tmodal.destroy();\n\n\t\t\t\tif (options.triggerOnCancel) _this7.eventBus.trigger(gatedEvent);\n\t\t\t}, this);\n\n\t\t\tmodal.show();\n\t\t} else {\n\t\t\tthis.eventBus.trigger(gatedEvent);\n\t\t}\n\t},\n\n\tsaveCustomGroup: function saveCustomGroup(callbacks) {\n\t\tvar _this8 = this;\n\n\t\tvar len = _.keys(this.edits).length;\n\n\t\tvar modal = new SmallModal({\n\t\t\ttitle: \"Custom group save confirmation\",\n\t\t\tbody: \"<p>This will update <strong>\" + len + \" user\" + (len === 1 ? \"\" : \"s\") + \"</strong>, and the custom group name (if it changed).</p>\\n\\t\\t\\t\\t<p>Do you wish to continue?</p>\",\n\t\t\tpersist: true\n\t\t});\n\n\t\tmodal.on(\"button:ok\", function () {\n\t\t\t_this8.eventBus.trigger(\"editor:begin-save\");\n\n\t\t\tPromise.resolve($.ajax({\n\t\t\t\tmethod: \"PUT\",\n\t\t\t\tdata: {\n\t\t\t\t\tchanges: JSON.stringify(_this8.edits),\n\t\t\t\t\tname: _this8.customGroup.get(\"name\"),\n\t\t\t\t\tgroup: _this8.customGroup.get(\"code\")\n\t\t\t\t},\n\t\t\t\turl: settings.urlRoot + \"/api/1.0/groups/manager/\" + _this8.customGroup.get(\"code\"),\n\t\t\t\tjson: true\n\t\t\t})).then(function (data) {\n\t\t\t\tif (data.ok) {\n\t\t\t\t\t// Execute a success callback, if defined\n\t\t\t\t\tif (callbacks && callbacks.success) callbacks.success();\n\n\t\t\t\t\t_this8.state.dataChanged = false;\n\n\t\t\t\t\t_this8.grid.collection.getFirstPage();\n\t\t\t\t\t_this8.eventBus.trigger(\"editor:data-saved\");\n\t\t\t\t\t_this8.eventBus.trigger(\"editor:end-save\");\n\n\t\t\t\t\t_this8.edits = {};\n\n\t\t\t\t\treturn modal.destroy();\n\t\t\t\t}\n\n\t\t\t\t// Execute an error callback, if defined\n\t\t\t\tif (callbacks && callbacks.error) callbacks.error();\n\n\t\t\t\tmodal.showError(\"There was an error saving the changes\");\n\t\t\t\t_this8.eventBus.trigger(\"editor:end-save\");\n\t\t\t\treturn;\n\t\t\t}).catch(function (e) {\n\t\t\t\t// Execute an error callback, if defined\n\t\t\t\tif (callbacks && callbacks.error) callbacks.error();\n\n\t\t\t\tmodal.showError(\"Save error: \" + e.info);\n\t\t\t\t_this8.eventBus.trigger(\"editor:end-save\");\n\t\t\t});\n\t\t}, this);\n\n\t\tmodal.show();\n\t},\n\n\tonActionBack: function onActionBack() {\n\t\tthis.confirmDataChange(\"editor:back\", {\n\t\t\tdestroyUnsaved: true,\n\t\t\ttriggerOnCancel: true\n\t\t});\n\t},\n\n\tonActionDownload: function onActionDownload() {\n\t\tthis.confirmDataChange(\"editor:download\");\n\t},\n\n\tonActionClone: function onActionClone() {\n\t\tthis.confirmDataChange(\"editor:begin-clone\");\n\t},\n\n\tonActionUpgrade: function onActionUpgrade() {\n\t\tthis.confirmDataChange(\"editor:begin-upgrade\");\n\t},\n\n\tonActionSave: function onActionSave() {\n\t\tthis.saveCustomGroup();\n\t},\n\n\tonActionAddAll: function onActionAddAll() {\n\t\tvar _this9 = this;\n\n\t\tvar modal = new SmallModal({\n\t\t\ttitle: \"Add All Users To CG\",\n\t\t\tbody: \"This will add ALL users in the relevant global group (including users on other pages) to this custom group.\",\n\t\t\tpersist: true\n\t\t});\n\n\t\tmodal.on(\"button:ok\", function () {\n\t\t\treturn Promise.resolve($.ajax({\n\t\t\t\tmethod: \"POST\",\n\t\t\t\turl: settings.urlRoot + \"/acacia/groups/\" + _this9.customGroup.get(\"code\") + \"/addAll\",\n\t\t\t\tjson: true\n\t\t\t})).then(function () {\n\t\t\t\tmodal.destroy();\n\t\t\t\treturn _this9.grid.collection.fetch();\n\t\t\t}).catch(function (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t\tmodal.showError(e);\n\t\t\t});\n\t\t});\n\n\t\tmodal.show();\n\t},\n\n\tonActionRemoveAll: function onActionRemoveAll() {\n\t\tvar _this10 = this;\n\n\t\tvar modal = new SmallModal({\n\t\t\twarning: true,\n\t\t\ttitle: \"Remove All Users From CG\",\n\t\t\tbody: \"This will remove ALL users in the relevant global group (including users on other pages) from this custom group.\",\n\t\t\tpersist: true\n\t\t});\n\n\t\tmodal.on(\"button:ok\", function () {\n\t\t\treturn Promise.resolve($.ajax({\n\t\t\t\tmethod: \"POST\",\n\t\t\t\turl: settings.urlRoot + \"/acacia/groups/\" + _this10.customGroup.get(\"code\") + \"/removeAll\",\n\t\t\t\tjson: true\n\t\t\t})).then(function () {\n\t\t\t\tmodal.destroy();\n\t\t\t\treturn _this10.grid.collection.fetch();\n\t\t\t}).catch(function (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t\tmodal.showError(e);\n\t\t\t});\n\t\t});\n\n\t\tmodal.show();\n\t},\n\n\tonDownload: function onDownload() {\n\t\twindow.open(settings.urlRoot + \"/api/1.0/groups/manager/\" + this.customGroup.get(\"code\") + \"/snapshot\");\n\t},\n\n\tonBeginClone: function () {\n\t\tvar _ref3 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee3() {\n\t\t\tvar _this11 = this;\n\n\t\t\treturn _regenerator2.default.wrap(function _callee3$(_context3) {\n\t\t\t\twhile (1) {\n\t\t\t\t\tswitch (_context3.prev = _context3.next) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tPromise.resolve($.ajax({\n\t\t\t\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\t\t\t\turl: settings.urlRoot + \"/api/1.0/groups/manager/clone?code=\" + encodeURIComponent(this.customGroup.get(\"code\"))\n\t\t\t\t\t\t\t})).then(function (data) {\n\t\t\t\t\t\t\t\tvar group = new GroupModel(data);\n\t\t\t\t\t\t\t\t_this11.eventBus.trigger(\"editor:end-clone\");\n\t\t\t\t\t\t\t\t_this11.eventBus.trigger(\"editor:clone\", group, _this11.globalGroup);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}).catch(function (e) {\n\t\t\t\t\t\t\t\talert(\"Error cloning group: \" + e.message);\n\t\t\t\t\t\t\t\t_this11.eventBus.trigger(\"editor:end-clone\");\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\treturn _context3.stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, _callee3, this);\n\t\t}));\n\n\t\tfunction onBeginClone() {\n\t\t\treturn _ref3.apply(this, arguments);\n\t\t}\n\n\t\treturn onBeginClone;\n\t}(),\n\n\tonBeginUpgrade: function onBeginUpgrade() {\n\t\tvar _this12 = this;\n\n\t\tthis.upgradeModal = new SmallModal({\n\t\t\tpersist: true,\n\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Upgrade Confirmation\",\n\t\t\tbody: \"<p>This will upgrade the current custom group to a global group.</p><p><ul>\" + \"<li>All attachments and \" + settings.learningPathsCustomName + \" content linked to the group will be preserved.\" + \"<li>All current group members will be preserved.\" + \"<li>The group will NO LONGER be editable through the Custom Groups page.\" + \"<li>The group will be assignable to any books.</ul></p>\"\n\t\t});\n\n\t\tthis.upgradeModal.on(\"button:ok\", function () {\n\t\t\t_this12.customGroup.save(null, {\n\t\t\t\tvalidate: false,\n\t\t\t\twait: true,\n\t\t\t\tsuccess: _this12.upgradeSuccess.bind(_this12),\n\t\t\t\terror: _this12.upgradeError.bind(_this12),\n\t\t\t\turl: settings.urlRoot + \"/api/1.0/groups/custom/upgrade/\" + _this12.customGroup.get(\"code\")\n\t\t\t});\n\t\t}, this);\n\n\t\tthis.upgradeModal.show();\n\t},\n\n\tupgradeSuccess: function upgradeSuccess() {\n\t\tthis.upgradeModal.destroy();\n\n\t\t// Possibly update the current user to know about this change\n\t\tvar currentUser = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tif (!rester.hasAccess(rester.p.groups.all, currentUser)) {\n\t\t\tif (_.includes(currentUser.customGroups, this.customGroup.get(\"code\"))) {\n\t\t\t\tcurrentUser.customGroups = _.without(currentUser.customGroups, this.customGroup.get(\"code\"));\n\t\t\t\tcurrentUser.groups.push(this.customGroup.get(\"code\"));\n\t\t\t\tradio.trigger(App.Events.UpdateUserDetails, currentUser);\n\t\t\t}\n\t\t}\n\n\t\tthis.eventBus.trigger(\"editor:end-upgrade\");\n\t\tthis.eventBus.trigger(\"editor:group-upgraded\");\n\t},\n\n\tupgradeError: function upgradeError(model, xhr) {\n\t\tvar answer = App.parseResponse(xhr);\n\n\t\tthis.upgradeModal.showError(\"Upgrade failed: \" + (answer.detail || answer.info));\n\n\t\tthis.eventBus.trigger(\"editor:end-upgrade\");\n\t},\n\n\tgetChangePermission: function getChangePermission() {\n\t\t// Only the owner of a custom group or a user with full permissions to alter groups is allowed to save changes\n\t\t// to the current custom group\n\t\tvar currentUser = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tif (rester.hasAccess(rester.p.groups.all, currentUser)) return true;\n\n\t\treturn this.customGroup.has(\"owner\") && this.customGroup.get(\"owner\") === currentUser.user_id;\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(this.customGroup);\n\t\tthis.stopListening(this.globalGroupUserGrid);\n\t\tthis.stopListening(this.customGroupUserGrid);\n\n\t\tthis.stopListening(this.eventBus);\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"content custom-group-manager\",\n\n\ttemplate: require(\"../templates/customGroupManager.nunj\").manager,\n\n\tregions: {\n\t\tcustomGroupCreator: \".custom-group-creator-region\",\n\t\tcustomGroupSelector: \".custom-group-selector-region\",\n\t\teditor: \".editor-region\",\n\t\tglobalGroupSelector: \".global-group-selector-region\",\n\t\theader: \".header-region\",\n\t\tstatus: \".status-region\"\n\t},\n\n\tui: {\n\t\tcustomGroupSelectorRegion: \".custom-group-selector-region\",\n\t\tcustomGroupCreatorRegion: \".custom-group-creator-region\",\n\t\tglobalGroupSelectorRegion: \".global-group-selector-region\",\n\t\theaderRegion: \".header-region\",\n\t\tstatusRegion: \".status-region\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.startCode = options.code;\n\t\tthis.eventBus = Backbone.Radio.channel(\"customGroupManager\");\n\n\t\tthis.listenTo(this.eventBus, \"action:delete\", this.onEditorDelete.bind(this));\n\t\tthis.listenTo(this.eventBus, \"action:upload\", this.onEditorUpload.bind(this));\n\n\t\tthis.listenTo(this.eventBus, \"editor:back\", this.onEditorBack.bind(this));\n\t\tthis.listenTo(this.eventBus, \"editor:group-upgraded\", this.onEditorGroupUpgraded.bind(this));\n\t\tthis.listenTo(this.eventBus, \"editor:begin-save\", this.onEditorBeginSave.bind(this));\n\t\tthis.listenTo(this.eventBus, \"editor:end-save\", this.onEditorEndSave.bind(this));\n\t\tthis.listenTo(this.eventBus, \"editor:clone\", this.onEditorClone.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this13 = this;\n\n\t\tthis.ui.statusRegion.addClass(\"hide\");\n\t\tthis.ui.headerRegion.removeClass(\"hide\");\n\n\t\tthis.header = new Header({ eventBus: this.eventBus });\n\t\tthis.showChildView(\"header\", this.header);\n\n\t\tradio.trigger(App.Events.Commands.NavigationPrompt, null);\n\n\t\tif (this.startCode) {\n\t\t\tthis.showChildView(\"status\", new StatusView({ type: \"loading\" }));\n\n\t\t\t// We're trying to edit a custom group, so fetch it from the server\n\t\t\tvar customModel = new GroupModel({\n\t\t\t\tcode: this.startCode\n\t\t\t});\n\n\t\t\t// Don't rerun this code\n\t\t\tdelete this.startCode;\n\n\t\t\tvar xhr = customModel.fetch();\n\t\t\tPromise.resolve(xhr).then(function () {\n\t\t\t\tif (!customModel.get(\"private\")) throw new Error(\"Unable to find matching group\");\n\n\t\t\t\treturn Promise.resolve($.ajax({\n\t\t\t\t\tmethod: \"GET\",\n\t\t\t\t\turl: settings.urlRoot + \"/api/1.0/groups/\" + customModel.get(\"root\"),\n\t\t\t\t\tjson: true\n\t\t\t\t}));\n\t\t\t}).then(function (data) {\n\t\t\t\tvar globalGroup = new GroupModel(data);\n\t\t\t\t_this13.showEditor(customModel, globalGroup);\n\n\t\t\t\treturn _this13.ui.statusRegion.addClass(\"hide\");\n\t\t\t}).catch(function (e) {\n\t\t\t\t_this13.showChildView(\"status\", new ErrorView({ fetchError: e }));\n\t\t\t});\n\t\t} else {\n\t\t\tthis.globalGroupSelector = new GlobalGroupSelector();\n\t\t\tthis.listenTo(this.globalGroupSelector, \"select\", this.onGlobalGroupChange.bind(this));\n\t\t\tthis.showChildView(\"globalGroupSelector\", this.globalGroupSelector);\n\t\t}\n\t},\n\n\trenderError: function renderError(error) {\n\t\tthis.showChildView(\"status\", new ErrorView({ fetchError: error }));\n\t},\n\n\tonGlobalGroupChange: function onGlobalGroupChange(group) {\n\t\tthis.customGroupSelector = new CustomGroupSelector({\n\t\t\tglobalGroup: group\n\t\t});\n\n\t\tthis.listenTo(this.customGroupSelector, \"create\", this.onCreateCustomGroup.bind(this));\n\t\tthis.listenTo(this.customGroupSelector, \"select\", this.onCustomGroupChange.bind(this));\n\t\tthis.showChildView(\"customGroupSelector\", this.customGroupSelector);\n\t},\n\n\tonCreateCustomGroup: function onCreateCustomGroup(globalGroup) {\n\t\tthis.ui.customGroupSelectorRegion.addClass(\"hide\");\n\n\t\tvar customGroupModel = new GroupModel({\n\t\t\tcustom: globalGroup.get(\"name\"),\n\t\t\tname: \"\",\n\t\t\towner: radio.request(App.Events.Requests.CurrentUser).user_id,\n\t\t\tprivate: true,\n\t\t\troot: globalGroup.get(\"code\")\n\t\t});\n\n\t\tthis.customGroupCreator = new CustomGroupCreator({\n\t\t\tmodel: customGroupModel,\n\t\t\tglobalGroup: globalGroup\n\t\t});\n\n\t\tthis.listenTo(this.customGroupCreator, \"accept\", this.onAcceptCustomGroup.bind(this));\n\t\tthis.listenTo(this.customGroupCreator, \"reject\", this.onRejectCustomGroup.bind(this));\n\t\tthis.showChildView(\"customGroupCreator\", this.customGroupCreator);\n\n\t\tthis.ui.customGroupCreatorRegion.removeClass(\"hide\");\n\t\tthis.customGroupCreator.focus();\n\t},\n\n\tdestroyCustomGroupCreator: function destroyCustomGroupCreator() {\n\t\tthis.getRegion(\"customGroupCreator\").reset();\n\n\t\tthis.stopListening(this.customGroupCreator);\n\n\t\tthis.customGroupCreator = null;\n\t},\n\n\tonAcceptCustomGroup: function onAcceptCustomGroup(customGroupModel, globalGroup) {\n\t\tthis.destroyCustomGroupCreator();\n\n\t\tthis.ui.globalGroupSelectorRegion.addClass(\"hide\");\n\t\tthis.ui.customGroupCreatorRegion.addClass(\"hide\");\n\n\t\tthis.showEditor(customGroupModel, globalGroup);\n\t},\n\n\tonRejectCustomGroup: function onRejectCustomGroup() {\n\t\tthis.destroyCustomGroupCreator();\n\n\t\tthis.ui.customGroupCreatorRegion.addClass(\"hide\");\n\t\tthis.ui.customGroupSelectorRegion.removeClass(\"hide\");\n\t},\n\n\tonCustomGroupChange: function onCustomGroupChange(customGroupCode, globalGroupCode) {\n\t\tthis.ui.customGroupSelectorRegion.addClass(\"hide\");\n\t\tthis.ui.globalGroupSelectorRegion.addClass(\"hide\");\n\n\t\tthis.showEditor(customGroupCode, globalGroupCode);\n\t},\n\n\tshowEditor: function showEditor(customGroup, globalGroup) {\n\t\tif (this.editor) this.getRegion(\"editor\").reset();\n\n\t\tthis.editor = new Editor({\n\t\t\tcustomGroup: customGroup,\n\t\t\teventBus: this.eventBus,\n\t\t\tglobalGroup: globalGroup\n\t\t});\n\n\t\tthis.customGroup = customGroup;\n\t\tthis.globalGroup = globalGroup;\n\n\t\tthis.showChildView(\"editor\", this.editor);\n\n\t\tradio.trigger(App.Events.Commands.Navigate, \"/groups/manageCustom/\" + customGroup.get(\"code\"), { trigger: false, replace: false });\n\t},\n\n\tonEditorBack: function onEditorBack() {\n\t\tthis.close();\n\t},\n\n\tonEditorGroupUpgraded: function onEditorGroupUpgraded() {\n\t\tradio.trigger(App.Events.Commands.Navigate, \"/groups/manageCustom\", { replace: true });\n\t},\n\n\tonEditorBeginSave: function onEditorBeginSave() {\n\t\tthis.$el.addClass(\"busy\");\n\t},\n\n\tonEditorEndSave: function onEditorEndSave() {\n\t\tthis.$el.removeClass(\"busy\");\n\t},\n\n\tonEditorClone: function onEditorClone(customGroup, globalGroup) {\n\t\t// Show a new editor for the cloned custom group\n\t\tthis.showEditor(customGroup, globalGroup);\n\t},\n\n\tonEditorUpload: function onEditorUpload() {\n\t\tvar _this14 = this;\n\n\t\t// Construct the collection of all users in the current global group\n\t\tvar uploadModal = new UploadModal();\n\n\t\tthis.listenTo(uploadModal, \"accept\", function (result) {\n\t\t\t_this14.editor.executeInstructions(result.instructions);\n\t\t\t_this14.stopListening(uploadModal);\n\t\t});\n\n\t\tthis.listenTo(uploadModal, \"cancel\", function () {\n\t\t\t_this14.stopListening(uploadModal);\n\t\t});\n\n\t\tuploadModal.show();\n\t},\n\n\tonEditorDelete: function onEditorDelete() {\n\t\tvar _this15 = this;\n\n\t\tvar confirmationModal = new SmallModal({\n\t\t\tpersist: true,\n\t\t\twarning: true,\n\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Delete Custom Group\",\n\t\t\tbody: \"<p>You are about to delete this custom group.</p>\\n\\t\\t\\t\\t<p>All of the content linked to it, in both e-books and \" + settings.learningPathsPluralCustomName + \", will disappear and cannot be recovered.</p>\\n\\t\\t\\t\\t<p>Are you sure you want to delete this custom group?</p>\"\n\t\t});\n\n\t\tconfirmationModal.on(\"button:ok\", function () {\n\t\t\t_this15.editor.deleteCustomGroup({\n\t\t\t\tsuccess: function success() {\n\t\t\t\t\tconfirmationModal.destroy();\n\t\t\t\t\t_this15.eventBus.trigger(\"editor:delete\");\n\t\t\t\t\t_this15.close();\n\t\t\t\t},\n\t\t\t\terror: function error() {\n\t\t\t\t\treturn console.error(\"error deleting custom group\");\n\t\t\t\t}\n\t\t\t});\n\t\t}, this);\n\n\t\tconfirmationModal.show();\n\t},\n\n\tclose: function close() {\n\t\tradio.trigger(App.Events.Commands.Navigate, \"/groups/manageCustom\", { replace: true });\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(this.header);\n\t\tthis.stopListening(this.globalGroupSelector);\n\t\tthis.stopListening(this.customGroupSelector);\n\n\t\tthis.stopListening(this.eventBus);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImN1c3RvbUdyb3VwTWFuYWdlci5qcyJdLCJuYW1lcyI6WyJfIiwicmVxdWlyZSIsIkJhY2tib25lIiwiUHJvbWlzZSIsInJlc3RlciIsIiQiLCJBcHAiLCJzZXR0aW5ncyIsInJhZGlvIiwiUmFkaW8iLCJjaGFubmVsIiwiQWN0aW9uSGVhZGVyIiwiQWN0aW9uVGl0bGUiLCJBY3Rpb25Ub29sYmFyIiwiRXJyb3JWaWV3IiwiU21hbGxNb2RhbCIsIlN0YXR1c1ZpZXciLCJUb2tlbkNyZWF0aW9uTW9kYWwiLCJUb2tlbk1vZGVsIiwiVXBsb2FkTW9kYWwiLCJTZWxlY3RyYSIsIlNlcnZlckdyaWQiLCJncmFkZU1hcCIsIkJhY2tncmlkIiwiR3JvdXBNb2RlbCIsIk1vZGVsIiwiZXh0ZW5kIiwiZGVmYXVsdHMiLCJpZEF0dHJpYnV0ZSIsInVybFJvb3QiLCJ2YWxpZGF0ZSIsImF0dHJpYnV0ZXMiLCJlcnJvcnMiLCJuYW1lIiwia2V5cyIsImxlbmd0aCIsIlVzZXJNb2RlbCIsIkVwb3h5IiwiY29tcHV0ZWRzIiwidXNlckdyYWRlIiwiaGFzIiwiY29kZVRvSHVtYW5WYWx1ZSIsImdldCIsImxleGljYWwiLCJVc2VyQ29sbGVjdGlvbiIsIlBhZ2VhYmxlQ29sbGVjdGlvbiIsIm1vZGVsIiwidXJsIiwiZ2xvYmFsR3JvdXAiLCJjdXN0b21Hcm91cCIsInN0YXRlIiwicGFnZVNpemUiLCJtb2RlIiwicXVlcnlQYXJhbXMiLCJzb3J0S2V5IiwiaW5pdGlhbGl6ZSIsIml0ZW1zIiwib3B0aW9ucyIsInBhcnNlU3RhdGUiLCJyZXNwIiwidG90YWxSZWNvcmRzIiwidG90YWwiLCJwYXJzZVJlY29yZHMiLCJyb3dzIiwiR2xvYmFsR3JvdXBTZWxlY3RvciIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiY2xhc3NOYW1lIiwiaWQiLCJ0ZW1wbGF0ZSIsImdsb2JhbEdyb3VwU2VsZWN0b3IiLCJ1aSIsImdyb3VwcyIsImV2ZW50cyIsIm9uUmVuZGVyIiwidXNlciIsInJlcXVlc3QiLCJFdmVudHMiLCJSZXF1ZXN0cyIsIkN1cnJlbnRVc2VyIiwic2VsZWN0Iiwic2VydmVyIiwiZmV0Y2giLCJlbmNvZGVVUklDb21wb25lbnQiLCJ1c2VybmFtZSIsImRlbGF5TG9hZCIsImtleSIsInZhbHVlIiwicGFyYW1zIiwiZXh0ZW5kZWROYW1lIiwicGFnaW5nIiwiaW5maW5pdGUiLCJwbGFjZWhvbGRlciIsInNob3ciLCJlbCIsIm9uR3JvdXBDaGFuZ2UiLCJldnQiLCJkYXRhIiwidHJpZ2dlciIsIkN1c3RvbUdyb3VwU2VsZWN0b3IiLCJjdXN0b21Hcm91cFNlbGVjdG9yIiwidGVtcGxhdGVDb250ZXh0IiwiYnV0dG9uQ3JlYXRlR3JvdXAiLCJsaXN0ZW5UbyIsImNvZGUiLCJvbkJ1dHRvbkNyZWF0ZUdyb3VwQ2xpY2siLCJ0b0pTT04iLCJDdXN0b21Hcm91cENyZWF0b3IiLCJjdXN0b21Hcm91cENyZWF0b3IiLCJ2YWxpZGF0aW9uRXJyb3IiLCJ2YWxpZGF0aW9uRXJyb3JNZXNzYWdlIiwiaW5wdXRHZW5lcmF0ZVRva2VuIiwiYnV0dG9uQWNjZXB0TmFtZSIsImJ1dHRvblJlamVjdE5hbWUiLCJtb2RlbEV2ZW50cyIsImludmFsaWQiLCJmb2N1cyIsIm9uTmFtZUtleWRvd24iLCJldmVudCIsIndoaWNoIiwiYWNjZXB0TmFtZSIsInJlamVjdE5hbWUiLCJvbkJ1dHRvbkFjY2VwdE5hbWVDbGljayIsInNldCIsInRyaW0iLCJ2YWwiLCJjdXJyZW50VXNlciIsImhhc0FjY2VzcyIsInAiLCJhbGwiLCJjdXN0b21Hcm91cHMiLCJvd25lciIsInVzZXJfaWQiLCJ4aHIiLCJzYXZlIiwid2FpdCIsInJlc29sdmUiLCJwcm9wIiwibW9kYWwiLCJncm91cENvZGUiLCJncm91cE5hbWUiLCJsaWZldGltZSIsInVzZXJPcHRpb25zIiwicHJvbXB0Iiwic3RvcExpc3RlbmluZyIsInRva2VuIiwieGhyMiIsIm9uVmFsaWRhdGlvbkVycm9yIiwidGV4dCIsInJlbW92ZUNsYXNzIiwib25CdXR0b25SZWplY3ROYW1lQ2xpY2siLCJIZWFkZXIiLCJ0aXRsZVZpZXciLCJ0b29sYmFyVmlldyIsInJlc2V0U3RhdGUiLCJkYXRhQ2hhbmdlZCIsIm9uVGl0bGVSZWFkeSIsImV2ZW50QnVzIiwib25Ub29sYmFyUmVhZHkiLCJzZXBhcmF0b3IiLCJnbHlwaCIsInRvb2x0aXAiLCJ0eXBlIiwicGVybWlzc2lvbiIsImdldFVwZ3JhZGVBY3Rpb25QZXJtaXNzaW9uIiwiYmluZCIsImdldERlbGV0ZUFjdGlvblBlcm1pc3Npb24iLCJnZXRTYXZlQWN0aW9uUGVybWlzc2lvbiIsInNwaW5uZXJFdmVudFNvdXJjZSIsInNwaW5uZXJTaG93RXZlbnQiLCJzcGlubmVySGlkZUV2ZW50Iiwib25FZGl0b3JTaG93IiwiaGlkZUVkaXRvclRvb2xiYXIiLCJvbkVkaXRvckRhdGFDaGFuZ2VkIiwib25FZGl0b3JEYXRhU2F2ZWQiLCJCb29sZWFuIiwiQ29tbWFuZHMiLCJOYXZpZ2F0aW9uUHJvbXB0IiwiYXBpIiwiY3VzdG9tIiwidXBncmFkZSIsInB1dCIsImV4dGVybmFsU3luYyIsIkVkaXRvciIsImVkaXRvciIsImdyaWQiLCJ0aXRsZSIsImNvdW50ZXIiLCJmaWx0ZXJzIiwidGl0bGVJbnB1dCIsImN1c3RvbU5hbWUiLCJvbkFjdGlvbkJhY2siLCJvbkFjdGlvbkRvd25sb2FkIiwib25BY3Rpb25DbG9uZSIsIm9uQWN0aW9uVXBncmFkZSIsIm9uQWN0aW9uU2F2ZSIsIm9uQWN0aW9uQWRkQWxsIiwib25BY3Rpb25SZW1vdmVBbGwiLCJvbkRvd25sb2FkIiwib25CZWdpbkNsb25lIiwib25CZWdpblVwZ3JhZGUiLCJyZXBseSIsImdldENoYW5nZVBlcm1pc3Npb24iLCJjb2x1bW5zIiwibGFiZWwiLCJjZWxsIiwiZWRpdGFibGUiLCJDZWxsIiwicmVuZGVyIiwiJGVsIiwiaHRtbCIsImNvbGxlY3Rpb24iLCJjbGlja2FibGUiLCJlbGVtZW50IiwiYXBwbHlFZGl0cyIsImhhbmRsZUVkaXQiLCJ0ZXh0RmlsdGVyIiwiZGVib3VuY2UiLCJncmFkZUZpbHRlciIsImNhdGVnb3JpZXMiLCJtYXAiLCJncmFkZUxpc3QiLCJyZWR1Y2UiLCJzb3J0IiwiYSIsImIiLCJ0b1VwcGVyQ2FzZSIsImxvY2FsZUNvbXBhcmUiLCJzdW0iLCJudW0iLCJwdXNoIiwibWVtYmVyRmlsdGVyIiwiZmlsdGVyTGlzdCIsInByZXBlbmQiLCJmaWx0ZXIiLCJmaWx0ZXJDb250YWluZXIiLCJkZWZhdWx0RmlsdGVycyIsIndhcm5pbmciLCJwZXJzaXN0IiwiYm9keSIsImhpZGVCdXR0b25zIiwiZGVzdHJveSIsImVkaXRzIiwibm90aWZ5RGF0YUNoYW5nZWQiLCJjb2wiLCJlYWNoIiwibW9kZWxzIiwieCIsIm9uR2xvYmFsR3JvdXBVc2VyU2VsZWN0ZWQiLCJ1c2VyTW9kZWwiLCJtb3ZlVXNlckZyb21HbG9iYWxUb0N1c3RvbSIsIm9uQ3VzdG9tR3JvdXBVc2VyU2VsZWN0ZWQiLCJtb3ZlVXNlckZyb21DdXN0b21Ub0dsb2JhbCIsIm9uQ3VzdG9tR3JvdXBOYW1lQ2hhbmdlZCIsImV4ZWN1dGVJbnN0cnVjdGlvbnMiLCJpbnN0cnVjdGlvbnMiLCJkYXRhYSIsImxlbiIsIm9uIiwiYWpheCIsIm1ldGhvZCIsImNoYW5nZXMiLCJ1c2VybmFtZXMiLCJqc29uIiwidGhlbiIsIm9rIiwiZ2V0Rmlyc3RQYWdlIiwic2hvd0Vycm9yIiwiY2F0Y2giLCJlIiwiaW5mbyIsInNldFRpbWVvdXQiLCJkZWxldGVDdXN0b21Hcm91cCIsImNhbGxiYWNrcyIsInN1Y2Nlc3MiLCJ1bmRlZmluZWQiLCJlcnJvciIsIm92ZXJyaWRlIiwiaXNVbmRlZmluZWQiLCJjb25maXJtRGF0YUNoYW5nZSIsImdhdGVkRXZlbnQiLCJjdXN0b21PSyIsImN1c3RvbUNhbmNlbCIsInNhdmVDdXN0b21Hcm91cCIsImNvbnNvbGUiLCJ0cmlnZ2VyT25DYW5jZWwiLCJKU09OIiwic3RyaW5naWZ5IiwiZ3JvdXAiLCJkZXN0cm95VW5zYXZlZCIsIndpbmRvdyIsIm9wZW4iLCJhbGVydCIsIm1lc3NhZ2UiLCJ1cGdyYWRlTW9kYWwiLCJsZWFybmluZ1BhdGhzQ3VzdG9tTmFtZSIsInVwZ3JhZGVTdWNjZXNzIiwidXBncmFkZUVycm9yIiwiaW5jbHVkZXMiLCJ3aXRob3V0IiwiVXBkYXRlVXNlckRldGFpbHMiLCJhbnN3ZXIiLCJwYXJzZVJlc3BvbnNlIiwiZGV0YWlsIiwib25CZWZvcmVEZXN0cm95IiwiZ2xvYmFsR3JvdXBVc2VyR3JpZCIsImN1c3RvbUdyb3VwVXNlckdyaWQiLCJtb2R1bGUiLCJleHBvcnRzIiwibWFuYWdlciIsInJlZ2lvbnMiLCJoZWFkZXIiLCJzdGF0dXMiLCJjdXN0b21Hcm91cFNlbGVjdG9yUmVnaW9uIiwiY3VzdG9tR3JvdXBDcmVhdG9yUmVnaW9uIiwiZ2xvYmFsR3JvdXBTZWxlY3RvclJlZ2lvbiIsImhlYWRlclJlZ2lvbiIsInN0YXR1c1JlZ2lvbiIsInN0YXJ0Q29kZSIsIm9uRWRpdG9yRGVsZXRlIiwib25FZGl0b3JVcGxvYWQiLCJvbkVkaXRvckJhY2siLCJvbkVkaXRvckdyb3VwVXBncmFkZWQiLCJvbkVkaXRvckJlZ2luU2F2ZSIsIm9uRWRpdG9yRW5kU2F2ZSIsIm9uRWRpdG9yQ2xvbmUiLCJhZGRDbGFzcyIsInNob3dDaGlsZFZpZXciLCJjdXN0b21Nb2RlbCIsIkVycm9yIiwic2hvd0VkaXRvciIsImZldGNoRXJyb3IiLCJvbkdsb2JhbEdyb3VwQ2hhbmdlIiwicmVuZGVyRXJyb3IiLCJvbkNyZWF0ZUN1c3RvbUdyb3VwIiwib25DdXN0b21Hcm91cENoYW5nZSIsImN1c3RvbUdyb3VwTW9kZWwiLCJwcml2YXRlIiwicm9vdCIsIm9uQWNjZXB0Q3VzdG9tR3JvdXAiLCJvblJlamVjdEN1c3RvbUdyb3VwIiwiZGVzdHJveUN1c3RvbUdyb3VwQ3JlYXRvciIsImdldFJlZ2lvbiIsInJlc2V0IiwiY3VzdG9tR3JvdXBDb2RlIiwiZ2xvYmFsR3JvdXBDb2RlIiwiTmF2aWdhdGUiLCJyZXBsYWNlIiwiY2xvc2UiLCJ1cGxvYWRNb2RhbCIsInJlc3VsdCIsImNvbmZp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TWFuYWdlci5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG4vKiBlc2xpbnQtZGlzYWJsZSBub2RlL25vLWV4dHJhbmVvdXMtcmVxdWlyZSAqL1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCBQcm9taXNlID0gcmVxdWlyZShcImJsdWViaXJkXCIpO1xuY29uc3QgcmVzdGVyID0gcmVxdWlyZShcInJlc3RlclwiKTtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuXG5jb25zdCBBcHAgPSByZXF1aXJlKFwiLi4vLi4vaW5kZXhcIik7XG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcblxuY29uc3QgQWN0aW9uSGVhZGVyID0gcmVxdWlyZShcIi4uLy4uL2xpYi9hY3Rpb25IZWFkZXJcIik7XG5jb25zdCBBY3Rpb25UaXRsZSA9IHJlcXVpcmUoXCIuLi8uLi9saWIvYWN0aW9uVGl0bGVcIik7XG5jb25zdCBBY3Rpb25Ub29sYmFyID0gcmVxdWlyZShcIi4uLy4uL2xpYi9hY3Rpb25Ub29sYmFyXCIpO1xuY29uc3QgRXJyb3JWaWV3ID0gcmVxdWlyZShcIi4uLy4uL2xpYi9lcnJvclZpZXdcIik7XG5jb25zdCBTbWFsbE1vZGFsID0gcmVxdWlyZShcIi4uLy4uL2xpYi9zbWFsbE1vZGFsXCIpO1xuY29uc3QgU3RhdHVzVmlldyA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc3RhdHVzVmlld1wiKTtcbmNvbnN0IFRva2VuQ3JlYXRpb25Nb2RhbCA9IHJlcXVpcmUoXCIuL3Rva2VuQ3JlYXRpb25Nb2RhbFwiKTtcbmNvbnN0IFRva2VuTW9kZWwgPSByZXF1aXJlKFwiLi90b2tlbk1vZGVsXCIpO1xuY29uc3QgVXBsb2FkTW9kYWwgPSByZXF1aXJlKFwiLi9jdXN0b21Hcm91cFVwbG9hZE1vZGFsXCIpO1xuY29uc3QgU2VsZWN0cmEgPSByZXF1aXJlKFwiLi4vLi4vbGliL3NlbGVjdHJhXCIpO1xuY29uc3QgU2VydmVyR3JpZCA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc2VydmVyR3JpZFwiKTtcbmNvbnN0IGdyYWRlTWFwID0gcmVxdWlyZShcIi4uLy4uL2xpYi9ncmFkZU1hcFwiKTtcbmNvbnN0IEJhY2tncmlkID0gcmVxdWlyZShcImJhY2tncmlkXCIpO1xuXG5jb25zdCBHcm91cE1vZGVsID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHt9LFxuXHRpZEF0dHJpYnV0ZTogXCJjb2RlXCIsXG5cblx0dXJsUm9vdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2dyb3Vwcy9jdXN0b21cIjtcblx0fSxcblxuXHR2YWxpZGF0ZTogZnVuY3Rpb24oYXR0cmlidXRlcykge1xuXHRcdC8vIEEgY29sbGVjdGlvbiBvZiBncm91cHMgaXMgcmVxdWlyZWQgdG8gdmFsaWRhdGUgYSBjdXN0b20gZ3JvdXAncyBuYW1lLiBUaGUgR3JvdXBzIGNvbGxlY3Rpb25cblx0XHQvLyBhdWdtZW50cyBldmVyeSBtb2RlbCBhZGRlZCB0byBpdCB3aXRoIGEgcmVmZXJlbmNlIHRvIGl0c2VsZi5cblxuXHRcdGNvbnN0IGVycm9ycyA9IHt9O1xuXHRcdC8vY29uc3QgdXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cblx0XHRpZiAoIWF0dHJpYnV0ZXMubmFtZSlcblx0XHRcdGVycm9ycy5uYW1lID0gXCJBIG5hbWUgaXMgcmVxdWlyZWQuXCI7XG5cblx0XHRpZiAoXy5rZXlzKGVycm9ycykubGVuZ3RoID4gMClcblx0XHRcdHJldHVybiBlcnJvcnM7XG5cdH0sXG59KTtcblxuY29uc3QgVXNlck1vZGVsID0gQmFja2JvbmUuRXBveHkuTW9kZWwuZXh0ZW5kKHtcblx0Y29tcHV0ZWRzOiB7XG5cdFx0dXNlckdyYWRlOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLmhhcyhcImdyYWRlXCIpID8gZ3JhZGVNYXAuY29kZVRvSHVtYW5WYWx1ZSh0aGlzLmdldChcImdyYWRlXCIpLCB7IGxleGljYWw6IHRydWUgfSkgOiBcIlwiO1xuXHRcdH0sXG5cdH0sXG59KTtcblxuY29uc3QgVXNlckNvbGxlY3Rpb24gPSBCYWNrYm9uZS5QYWdlYWJsZUNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IFVzZXJNb2RlbCxcblxuXHR1cmw6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9ncm91cHMvbWFuYWdlci9cIiArIHRoaXMuZ2xvYmFsR3JvdXAuZ2V0KFwiY29kZVwiKSArIFwiL1wiICsgdGhpcy5jdXN0b21Hcm91cC5nZXQoXCJjb2RlXCIpO1xuXHR9LFxuXG5cdHN0YXRlOiB7XG5cdFx0cGFnZVNpemU6IDIwLFxuXHR9LFxuXHRtb2RlOiBcInNlcnZlclwiLFxuXG5cdHF1ZXJ5UGFyYW1zOiB7XG5cdFx0cGFnZVNpemU6IFwicGFnZVNpemVcIixcblx0XHRzb3J0S2V5OiBcInNvcnRCeVwiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKGl0ZW1zLCBvcHRpb25zKSB7XG5cdFx0dGhpcy5nbG9iYWxHcm91cCA9IG9wdGlvbnMuZ2xvYmFsR3JvdXA7XG5cdFx0dGhpcy5jdXN0b21Hcm91cCA9IG9wdGlvbnMuY3VzdG9tR3JvdXA7XG5cdH0sXG5cblx0cGFyc2VTdGF0ZTogZnVuY3Rpb24ocmVzcCkge1xuXHRcdHJldHVybiB7IHRvdGFsUmVjb3JkczogcmVzcC50b3RhbCB9O1xuXHR9LFxuXG5cdHBhcnNlUmVjb3JkczogZnVuY3Rpb24ocmVzcCkge1xuXHRcdHJldHVybiByZXNwLnJvd3M7XG5cdH0sXG59KTtcblxuY29uc3QgR2xvYmFsR3JvdXBTZWxlY3RvciA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZ3JvdXAtc2VsZWN0b3IgZ2xvYmFsLWdyb3VwLXNlbGVjdG9yXCIsXG5cdGlkOiBcImdsb2JhbC1ncm91cC1zZWxlY3RvclwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2N1c3RvbUdyb3VwTWFuYWdlci5udW5qXCIpLmdsb2JhbEdyb3VwU2VsZWN0b3IsXG5cblx0dWk6IHtcblx0XHRncm91cHM6IFwic2VsZWN0W25hbWU9Z3JvdXBzXVwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2hhbmdlIEB1aS5ncm91cHNcIjogXCJvbkdyb3VwQ2hhbmdlXCIsXG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHVzZXIgPSByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpO1xuXG5cdFx0Y29uc3Qgc2VsZWN0ID0gbmV3IFNlbGVjdHJhKHtcblx0XHRcdHNlcnZlcjoge1xuXHRcdFx0XHRmZXRjaDogYCR7c2V0dGluZ3MudXJsUm9vdH0vYXBpLzEuMC91c2Vycy8ke2VuY29kZVVSSUNvbXBvbmVudCh1c2VyLnVzZXJuYW1lKX0vZW5yb2xtZW50YCxcblx0XHRcdFx0ZGVsYXlMb2FkOiB0cnVlLFxuXHRcdFx0XHRrZXk6IFwiY29kZVwiLFxuXHRcdFx0XHR2YWx1ZTogXCJuYW1lXCIsXG5cdFx0XHRcdHBhcmFtczoge1xuXHRcdFx0XHRcdGV4dGVuZGVkTmFtZTogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0cGFnZVNpemU6IDIwLFxuXHRcdFx0XHRpbmZpbml0ZTogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0XHRwbGFjZWhvbGRlcjogXCJDaG9vc2UgYSBnbG9iYWwgZ3JvdXBcIixcblx0XHR9KTtcblx0XHRzZWxlY3Quc2hvdyh7IGVsOiB0aGlzLnVpLmdyb3VwcyB9KTtcblx0fSxcblxuXHRvbkdyb3VwQ2hhbmdlOiBmdW5jdGlvbihldnQsIGRhdGEpIHtcblx0XHR0aGlzLnRyaWdnZXIoXCJzZWxlY3RcIiwgZGF0YSk7XG5cdH0sXG59KTtcblxuY29uc3QgQ3VzdG9tR3JvdXBTZWxlY3RvciA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZ3JvdXAtc2VsZWN0b3IgY3VzdG9tLWdyb3VwLXNlbGVjdG9yXCIsXG5cdGlkOiBcImN1c3RvbS1ncm91cC1zZWxlY3RvclwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2N1c3RvbUdyb3VwTWFuYWdlci5udW5qXCIpLmN1c3RvbUdyb3VwU2VsZWN0b3IsXG5cblx0dGVtcGxhdGVDb250ZXh0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0c2V0dGluZ3M6IHNldHRpbmdzLCAvLyBUaGlzIG1ha2VzIHRoZSAnc2V0dGluZ3MnIHZhcmlhYmxlIGF2YWlsYWJsZSB0byBOdW5qdWNrc1xuXHRcdH07XG5cdH0sXG5cblx0dWk6IHtcblx0XHRidXR0b25DcmVhdGVHcm91cDogXCJidXR0b24uY3JlYXRlLWdyb3VwXCIsXG5cdFx0Z3JvdXBzOiBcInNlbGVjdFtuYW1lPWdyb3Vwc11cIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5idXR0b25DcmVhdGVHcm91cFwiOiBcIm9uQnV0dG9uQ3JlYXRlR3JvdXBDbGlja1wiLFxuXHRcdFwiY2hhbmdlIEB1aS5ncm91cHNcIjogXCJvbkdyb3VwQ2hhbmdlXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuZ2xvYmFsR3JvdXAgPSBvcHRpb25zLmdsb2JhbEdyb3VwO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCB1c2VyID0gcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblxuXHRcdGNvbnN0IHNlbGVjdCA9IG5ldyBTZWxlY3RyYSh7XG5cdFx0XHRzZXJ2ZXI6IHtcblx0XHRcdFx0ZmV0Y2g6IGAke3NldHRpbmdzLnVybFJvb3R9L2FwaS8xLjAvdXNlcnMvJHtlbmNvZGVVUklDb21wb25lbnQodXNlci51c2VybmFtZSl9L2dyb3Vwcy8ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLmdsb2JhbEdyb3VwLmdldChcImNvZGVcIikpfS9jdXN0b21gLFxuXHRcdFx0XHRkZWxheUxvYWQ6IHRydWUsXG5cdFx0XHRcdGtleTogXCJjb2RlXCIsXG5cdFx0XHRcdHZhbHVlOiBcIm5hbWVcIixcblx0XHRcdFx0cGFyYW1zOiB7XG5cdFx0XHRcdFx0ZXh0ZW5kZWROYW1lOiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRwYWdlU2l6ZTogMjAsXG5cdFx0XHRcdGluZmluaXRlOiB0cnVlLFxuXHRcdFx0fSxcblx0XHRcdHBsYWNlaG9sZGVyOiBcIkNob29zZSBhIGN1c3RvbSBncm91cCB0byBlZGl0XCIsXG5cdFx0fSk7XG5cdFx0c2VsZWN0LnNob3coeyBlbDogdGhpcy51aS5ncm91cHMgfSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHRoaXMsIFwicmVmcmVzaFwiLCBjb2RlID0+IHtcblx0XHRcdHRoaXMuZ2xvYmFsR3JvdXAgPSBjb2RlO1xuXHRcdFx0c2VsZWN0LnRyaWdnZXIoXCJjbGVhclwiKTtcblx0XHR9LCB0aGlzKTtcblxuXHRcdHRoaXMubGlzdGVuVG8odGhpcywgXCJyZXNldFwiLCAoKSA9PiB7XG5cdFx0XHRzZWxlY3QudHJpZ2dlcihcImNsZWFyXCIpO1xuXHRcdH0sIHRoaXMpO1xuXHR9LFxuXG5cdG9uQnV0dG9uQ3JlYXRlR3JvdXBDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy50cmlnZ2VyKFwiY3JlYXRlXCIsIHRoaXMuZ2xvYmFsR3JvdXApO1xuXHR9LFxuXG5cdG9uR3JvdXBDaGFuZ2U6IGZ1bmN0aW9uKGV2dCwgZGF0YSkge1xuXHRcdHRoaXMudHJpZ2dlcihcInNlbGVjdFwiLCBuZXcgR3JvdXBNb2RlbChkYXRhLnRvSlNPTigpKSwgdGhpcy5nbG9iYWxHcm91cCk7XG5cdH0sXG5cblx0LypkZXNlbGVjdDogZnVuY3Rpb24oKVxuXHR7XG5cdFx0dGhpcy51aS5ncm91cHMudmFsKFwiXCIpO1xuXG5cdFx0dGhpcy51cGRhdGVHcm91cExpc3QoKTtcblx0fSwqL1xufSk7XG5cbmNvbnN0IEN1c3RvbUdyb3VwQ3JlYXRvciA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZ3JvdXAtc2VsZWN0b3IgY3VzdG9tLWdyb3VwLWNyZWF0b3JcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9jdXN0b21Hcm91cE1hbmFnZXIubnVualwiKS5jdXN0b21Hcm91cENyZWF0b3IsXG5cblx0dWk6IHtcblx0XHRuYW1lOiBcIj4gaW5wdXQuY3VzdG9tLWdyb3VwLW5hbWVcIixcblxuXHRcdHZhbGlkYXRpb25FcnJvcjogXCIudmFsaWRhdGlvbi1lcnJvclwiLFxuXHRcdHZhbGlkYXRpb25FcnJvck1lc3NhZ2U6IFwiLnZhbGlkYXRpb24tZXJyb3ItbWVzc2FnZVwiLFxuXHRcdGlucHV0R2VuZXJhdGVUb2tlbjogXCIjaW5wdXQtZ2VuZXJhdGUtdG9rZW5cIixcblx0XHRidXR0b25BY2NlcHROYW1lOiBcIi5idXR0b24tYWNjZXB0LW5hbWVcIixcblx0XHRidXR0b25SZWplY3ROYW1lOiBcIi5idXR0b24tcmVqZWN0LW5hbWVcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImtleWRvd24gQHVpLm5hbWVcIjogXCJvbk5hbWVLZXlkb3duXCIsXG5cblx0XHRcImNsaWNrIEB1aS5idXR0b25BY2NlcHROYW1lXCI6IFwib25CdXR0b25BY2NlcHROYW1lQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5idXR0b25SZWplY3ROYW1lXCI6IFwib25CdXR0b25SZWplY3ROYW1lQ2xpY2tcIixcblx0fSxcblxuXHRtb2RlbEV2ZW50czoge1xuXHRcdGludmFsaWQ6IFwib25WYWxpZGF0aW9uRXJyb3JcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5nbG9iYWxHcm91cCA9IG9wdGlvbnMuZ2xvYmFsR3JvdXA7XG5cdH0sXG5cblx0Zm9jdXM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkubmFtZS5mb2N1cygpO1xuXHRcdHRoaXMudWkubmFtZS5zZWxlY3QoKTtcblx0fSxcblxuXHRvbk5hbWVLZXlkb3duOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGlmIChldmVudC53aGljaCA9PT0gMTMpXG5cdFx0XHR0aGlzLmFjY2VwdE5hbWUoKTtcblx0XHRlbHNlIGlmIChldmVudC53aGljaCA9PT0gMjcpXG5cdFx0XHR0aGlzLnJlamVjdE5hbWUoKTtcblx0fSxcblxuXHRvbkJ1dHRvbkFjY2VwdE5hbWVDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5hY2NlcHROYW1lKCk7XG5cdH0sXG5cblx0YWNjZXB0TmFtZTogYXN5bmMgZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5tb2RlbC5zZXQoe1xuXHRcdFx0bmFtZTogXy50cmltKHRoaXMudWkubmFtZS52YWwoKSksXG5cdFx0fSk7XG5cblx0XHQvLyB0byB0aGUgY3VycmVudCBjdXN0b20gZ3JvdXBcblx0XHRjb25zdCBjdXJyZW50VXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cblx0XHQvLyBJZiB3ZSBjYW4gb3duIGEgY3VzdG9tIGdyb3VwLCBwYXNzIG91cnNlbHZlcyB0aHJvdWdoIGFzIHRoZSBvd25lclxuXHRcdGlmICghcmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5ncm91cHMuYWxsLCBjdXJyZW50VXNlcikgJiYgcmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5ncm91cHMuY3VzdG9tR3JvdXBzLm93bmVyLCBjdXJyZW50VXNlcikpXG5cdFx0XHR0aGlzLm1vZGVsLnNldCh7IG93bmVyOiBjdXJyZW50VXNlci51c2VyX2lkIH0pO1xuXG5cdFx0Ly8gU2F2ZSB0aGUgbW9kZWwgZmlyc3QsIHRvIGdldCBhIGNvZGVcblx0XHRjb25zdCB4aHIgPSB0aGlzLm1vZGVsLnNhdmUoeyB3YWl0OiB0cnVlIH0pO1xuXHRcdGlmICgheGhyKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0YXdhaXQgUHJvbWlzZS5yZXNvbHZlKHhocik7XG5cblx0XHRpZiAodGhpcy51aS5pbnB1dEdlbmVyYXRlVG9rZW4ucHJvcChcImNoZWNrZWRcIikpIHtcblx0XHRcdGNvbnN0IG1vZGFsID0gbmV3IFRva2VuQ3JlYXRpb25Nb2RhbCh7XG5cdFx0XHRcdG1vZGVsOiBuZXcgVG9rZW5Nb2RlbCh7XG5cdFx0XHRcdFx0Z3JvdXBDb2RlOiB0aGlzLm1vZGVsLmdldChcImNvZGVcIiksXG5cdFx0XHRcdFx0Z3JvdXBOYW1lOiB0aGlzLm1vZGVsLmdldChcIm5hbWVcIiksXG5cdFx0XHRcdFx0bGlmZXRpbWU6IDMwLFxuXHRcdFx0XHR9KSxcblx0XHRcdFx0dXNlck9wdGlvbnM6IHtcblx0XHRcdFx0XHRwcm9tcHQ6IFwiQ3JlYXRlIGEgdG9rZW5cIixcblx0XHRcdFx0fSxcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLmxpc3RlblRvKG1vZGFsLCBcImNsb3NlOnN1Y2Nlc3NcIiwgYXN5bmMgbW9kZWwgPT4ge1xuXHRcdFx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcobW9kYWwpO1xuXG5cdFx0XHRcdHRoaXMubW9kZWwuc2V0KHsgdG9rZW46IG1vZGVsLmdldChcInRva2VuXCIpIH0pO1xuXG5cdFx0XHRcdGNvbnN0IHhocjIgPSB0aGlzLm1vZGVsLnNhdmUoeyB3YWl0OiB0cnVlIH0pO1xuXHRcdFx0XHRhd2FpdCBQcm9taXNlLnJlc29sdmUoeGhyMik7XG5cdFx0XHRcdHRoaXMudHJpZ2dlcihcImFjY2VwdFwiLCB0aGlzLm1vZGVsLCB0aGlzLmdsb2JhbEdyb3VwKTtcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLmxpc3RlblRvKG1vZGFsLCBcImNsb3NlOmVycm9yXCIsICgpID0+IHtcblx0XHRcdFx0dGhpcy5zdG9wTGlzdGVuaW5nKG1vZGFsKTtcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLmxpc3RlblRvKG1vZGFsLCBcImNhbmNlbFwiLCAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuc3RvcExpc3RlbmluZyhtb2RhbCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0bW9kYWwuc2hvdygpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMudHJpZ2dlcihcImFjY2VwdFwiLCB0aGlzLm1vZGVsLCB0aGlzLmdsb2JhbEdyb3VwKTtcblx0XHR9XG5cdH0sXG5cblx0cmVqZWN0TmFtZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5uYW1lLnZhbChcIlwiKTtcblx0fSxcblxuXHRvblZhbGlkYXRpb25FcnJvcjogZnVuY3Rpb24obW9kZWwsIGVycm9ycykge1xuXHRcdGlmIChlcnJvcnMubmFtZSkge1xuXHRcdFx0dGhpcy51aS52YWxpZGF0aW9uRXJyb3JNZXNzYWdlLnRleHQoZXJyb3JzLm5hbWUpO1xuXHRcdFx0dGhpcy51aS52YWxpZGF0aW9uRXJyb3IucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblx0fSxcblxuXHRvbkJ1dHRvblJlamVjdE5hbWVDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5yZWplY3ROYW1lKCk7XG5cblx0XHR0aGlzLnRyaWdnZXIoXCJyZWplY3RcIiwgdGhpcy5tb2RlbCk7XG5cdH0sXG59KTtcblxuY29uc3QgSGVhZGVyID0gQWN0aW9uSGVhZGVyLmV4dGVuZCh7XG5cdHRpdGxlVmlldzogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIEFjdGlvblRpdGxlO1xuXHR9LFxuXG5cdHRvb2xiYXJWaWV3OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gQWN0aW9uVG9vbGJhcjtcblx0fSxcblxuXHRyZXNldFN0YXRlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnN0YXRlID0ge1xuXHRcdFx0ZGF0YUNoYW5nZWQ6IGZhbHNlLFxuXHRcdH07XG5cdH0sXG5cblx0b25UaXRsZVJlYWR5OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJhY3Rpb24tdGl0bGU6Y2hhbmdlLWdseXBoXCIsIFwiZmEtdGhcIik7XG5cdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwiYWN0aW9uLXRpdGxlOmNoYW5nZS10aXRsZVwiLCBcIkN1c3RvbSBHcm91cHNcIik7XG5cdH0sXG5cblx0b25Ub29sYmFyUmVhZHk6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIEluaXRpYWxpemUgc3RhdGUgdmFyaWFibGVzXG5cdFx0dGhpcy5yZXNldFN0YXRlKCk7XG5cblx0XHQvLyBTZXQgdGhlIGFjdGlvbiBiYXIgc3BlY2lmaWNhdGlvbiB0byBkaXNwbGF5IHRoZSBlZGl0b3IgdG9vbGJhclxuXHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImFjdGlvbi10b29sYmFyOmNoYW5nZS1zcGVjaWZpY2F0aW9uXCIsIFtcblx0XHRcdHtcblx0XHRcdFx0c2VwYXJhdG9yOiB0cnVlLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Z2x5cGg6IFwiZmEtdXNlci1wbHVzXCIsXG5cdFx0XHRcdG5hbWU6IFwiYWN0aW9uOmFkZGFsbFwiLFxuXHRcdFx0XHR0b29sdGlwOiBcIkFkZCBhbGwgdXNlcnMgdG8gdGhpcyBjdXN0b20gZ3JvdXBcIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHNlcGFyYXRvcjogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGdseXBoOiBcImZhLXVzZXItbWludXNcIixcblx0XHRcdFx0bmFtZTogXCJhY3Rpb246cmVtb3ZlYWxsXCIsXG5cdFx0XHRcdHRvb2x0aXA6IFwiUmVtb3ZlIGFsbCB1c2VycyBmcm9tIHRoaXMgY3VzdG9tIGdyb3VwXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRzZXBhcmF0b3I6IHRydWUsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRnbHlwaDogXCJmYS1jbG91ZC1kb3dubG9hZFwiLFxuXHRcdFx0XHRuYW1lOiBcImFjdGlvbjpkb3dubG9hZFwiLFxuXHRcdFx0XHR0b29sdGlwOiBcIkRvd25sb2FkIGEgc25hcHNob3Qgb2YgdGhpcyBjdXN0b20gZ3JvdXBcIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHNlcGFyYXRvcjogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGdseXBoOiBcImZhLWNsb3VkLXVwbG9hZFwiLFxuXHRcdFx0XHRuYW1lOiBcImFjdGlvbjp1cGxvYWRcIixcblx0XHRcdFx0dG9vbHRpcDogXCJVcGxvYWQgYSBzZWxlY3Rpb24gb2YgdXNlcnNcIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHNlcGFyYXRvcjogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGdseXBoOiBcImZhLWNvcHlcIixcblx0XHRcdFx0dHlwZTogXCJhY3Rpb24tdHlwZS1tb2RpZmljYXRpb25cIixcblx0XHRcdFx0bmFtZTogXCJhY3Rpb246Y2xvbmVcIixcblx0XHRcdFx0dG9vbHRpcDogXCJDbG9uZSB0aGlzIGN1c3RvbSBncm91cFwiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0c2VwYXJhdG9yOiB0cnVlLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Z2x5cGg6IFwiZmEtYXJyb3ctY2lyY2xlLXVwXCIsXG5cdFx0XHRcdHR5cGU6IFwiYWN0aW9uLXR5cGUtbW9kaWZpY2F0aW9uXCIsXG5cdFx0XHRcdG5hbWU6IFwiYWN0aW9uOnVwZ3JhZGVcIixcblx0XHRcdFx0cGVybWlzc2lvbjogdGhpcy5nZXRVcGdyYWRlQWN0aW9uUGVybWlzc2lvbi5iaW5kKHRoaXMpLFxuXHRcdFx0XHR0b29sdGlwOiBcIlVwZ3JhZGUgdGhpcyBjdXN0b20gZ3JvdXBcIixcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHNlcGFyYXRvcjogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGdseXBoOiBcImZhLXRyYXNoLWFsdFwiLFxuXHRcdFx0XHR0eXBlOiBcImFjdGlvbi10eXBlLWRhbmdlcm91c1wiLFxuXHRcdFx0XHRuYW1lOiBcImFjdGlvbjpkZWxldGVcIixcblx0XHRcdFx0cGVybWlzc2lvbjogdGhpcy5nZXREZWxldGVBY3Rpb25QZXJtaXNzaW9uLmJpbmQodGhpcyksXG5cdFx0XHRcdHRvb2x0aXA6IFwiRGVsZXRlIHRoaXMgY3VzdG9tIGdyb3VwXCIsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRzZXBhcmF0b3I6IHRydWUsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRnbHlwaDogXCJmYS1zYXZlXCIsXG5cdFx0XHRcdHR5cGU6IFwiYWN0aW9uLXR5cGUtbW9kaWZpY2F0aW9uXCIsXG5cdFx0XHRcdG5hbWU6IFwiYWN0aW9uOnNhdmVcIixcblx0XHRcdFx0cGVybWlzc2lvbjogdGhpcy5nZXRTYXZlQWN0aW9uUGVybWlzc2lvbi5iaW5kKHRoaXMpLFxuXHRcdFx0XHR0b29sdGlwOiBcIlNhdmUgdGhpcyBjdXN0b20gZ3JvdXBcIixcblx0XHRcdFx0c3Bpbm5lckV2ZW50U291cmNlOiB0aGlzLmV2ZW50QnVzLFxuXHRcdFx0XHRzcGlubmVyU2hvd0V2ZW50OiBcImVkaXRvcjpiZWdpbi1zYXZlXCIsXG5cdFx0XHRcdHNwaW5uZXJIaWRlRXZlbnQ6IFwiZWRpdG9yOmVuZC1zYXZlXCIsXG5cdFx0XHR9XVxuXHRcdCk7XG5cblx0XHQvLyBSZWdpc3RlciBldmVudCBoYW5kbGVyc1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJlZGl0b3I6c2hvd1wiLCB0aGlzLm9uRWRpdG9yU2hvdy5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwiZWRpdG9yOmJhY2tcIiwgdGhpcy5oaWRlRWRpdG9yVG9vbGJhci5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwiZWRpdG9yOmRlbGV0ZVwiLCB0aGlzLmhpZGVFZGl0b3JUb29sYmFyLmJpbmQodGhpcykpO1xuXG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmV2ZW50QnVzLCBcImVkaXRvcjpncm91cC11cGdyYWRlZFwiLCB0aGlzLmhpZGVFZGl0b3JUb29sYmFyLmJpbmQodGhpcykpO1xuXG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmV2ZW50QnVzLCBcImVkaXRvcjpkYXRhLWNoYW5nZWRcIiwgdGhpcy5vbkVkaXRvckRhdGFDaGFuZ2VkLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJlZGl0b3I6ZGF0YS1zYXZlZFwiLCB0aGlzLm9uRWRpdG9yRGF0YVNhdmVkLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdG9uRWRpdG9yU2hvdzogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5yZXNldFN0YXRlKCk7XG5cblx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJhY3Rpb24tdG9vbGJhcjpyZWZyZXNoXCIpO1xuXHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImFjdGlvbi10b29sYmFyOnNob3dcIik7XG5cdH0sXG5cblx0aGlkZUVkaXRvclRvb2xiYXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImFjdGlvbi10b29sYmFyOmhpZGVcIik7XG5cdH0sXG5cblx0b25FZGl0b3JEYXRhQ2hhbmdlZDogZnVuY3Rpb24oc3RhdGUpIHtcblx0XHR0aGlzLnN0YXRlLmRhdGFDaGFuZ2VkID0gQm9vbGVhbigoc3RhdGUgPT09IGZhbHNlIHx8IHN0YXRlID09PSB0cnVlKSA/IHN0YXRlIDogdHJ1ZSk7XG5cblx0XHRpZiAodGhpcy5zdGF0ZS5kYXRhQ2hhbmdlZClcblx0XHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0aW9uUHJvbXB0LCBcIjxwPlRoZSBncm91cCBpcyBub3QgZmluaXNoZWQgc2F2aW5nLiBJZiB5b3UgbGVhdmUgbm93LCBjaGFuZ2VzIHdpbGwgYmUgbG9zdC48L3A+PHA+QXJlIHlvdSBzdXJlIHlvdSB3aXNoIHRvIGxlYXZlPzwvcD5cIik7XG5cdFx0ZWxzZVxuXHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLk5hdmlnYXRpb25Qcm9tcHQsIG51bGwpO1xuXG5cdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwiYWN0aW9uLXRvb2xiYXI6cmVmcmVzaFwiKTtcblx0fSxcblxuXHRvbkVkaXRvckRhdGFTYXZlZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zdGF0ZS5kYXRhQ2hhbmdlZCA9IGZhbHNlO1xuXG5cdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLk5hdmlnYXRpb25Qcm9tcHQsIG51bGwpO1xuXG5cdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwiYWN0aW9uLXRvb2xiYXI6cmVmcmVzaFwiKTtcblx0fSxcblxuXHRnZXRTYXZlQWN0aW9uUGVybWlzc2lvbjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuc3RhdGUuZGF0YUNoYW5nZWQgJiYgdGhpcy5ldmVudEJ1cy5yZXF1ZXN0KFwiZWRpdG9yOmdldC1jaGFuZ2UtcGVybWlzc2lvblwiKTtcblx0fSxcblxuXHRnZXRVcGdyYWRlQWN0aW9uUGVybWlzc2lvbjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAuYXBpLmdyb3Vwcy5jdXN0b20udXBncmFkZS5wdXQsIHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcikpICYmXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXN5bmNcblx0XHRcdChyZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmdyb3Vwcy5hbGwsIHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcikpICYmIHNldHRpbmdzLmV4dGVybmFsU3luYy5ncm91cHMgIT09IFwicndcIik7XG5cdH0sXG5cblx0Z2V0RGVsZXRlQWN0aW9uUGVybWlzc2lvbjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXZlbnRCdXMucmVxdWVzdChcImVkaXRvcjpnZXQtY2hhbmdlLXBlcm1pc3Npb25cIik7XG5cdH0sXG59KTtcblxuY29uc3QgRWRpdG9yID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJjdXN0b20tZ3JvdXAtZWRpdG9yXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvY3VzdG9tR3JvdXBNYW5hZ2VyLm51bmpcIikuZWRpdG9yLFxuXG5cdHVpOiB7XG5cdFx0Z3JpZDogXCJkaXYuZ3JpZFwiLFxuXHRcdHBhZ2luZzogXCIucGFnaW5nXCIsXG5cdFx0dGl0bGU6IFwiLnRpdGxlXCIsXG5cdFx0Y291bnRlcjogXCIuY291bnRlclwiLFxuXHRcdGZpbHRlcnM6IFwiLmZpbHRlcnNcIixcblx0XHR0aXRsZUlucHV0OiBcIi50aXRsZSBpbnB1dFwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiaW5wdXQgQHVpLnRpdGxlSW5wdXRcIjogXCJvbkN1c3RvbUdyb3VwTmFtZUNoYW5nZWRcIixcblx0fSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRjdXN0b21OYW1lOiAoKSA9PiB0aGlzLmN1c3RvbUdyb3VwLmdldChcIm5hbWVcIiksXG5cdFx0fTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5zdGF0ZSA9IHtcblx0XHRcdGRhdGFDaGFuZ2VkOiBmYWxzZSxcblx0XHR9O1xuXG5cdFx0dGhpcy5jdXN0b21Hcm91cCA9IG9wdGlvbnMuY3VzdG9tR3JvdXA7XG5cdFx0dGhpcy5ldmVudEJ1cyA9IG9wdGlvbnMuZXZlbnRCdXM7XG5cdFx0dGhpcy5nbG9iYWxHcm91cCA9IG9wdGlvbnMuZ2xvYmFsR3JvdXA7XG5cblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwiYWN0aW9uOmJhY2tcIiwgdGhpcy5vbkFjdGlvbkJhY2suYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmV2ZW50QnVzLCBcImFjdGlvbjpkb3dubG9hZFwiLCB0aGlzLm9uQWN0aW9uRG93bmxvYWQuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmV2ZW50QnVzLCBcImFjdGlvbjpjbG9uZVwiLCB0aGlzLm9uQWN0aW9uQ2xvbmUuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmV2ZW50QnVzLCBcImFjdGlvbjp1cGdyYWRlXCIsIHRoaXMub25BY3Rpb25VcGdyYWRlLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJhY3Rpb246c2F2ZVwiLCB0aGlzLm9uQWN0aW9uU2F2ZS5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwiYWN0aW9uOmFkZGFsbFwiLCB0aGlzLm9uQWN0aW9uQWRkQWxsLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJhY3Rpb246cmVtb3ZlYWxsXCIsIHRoaXMub25BY3Rpb25SZW1vdmVBbGwuYmluZCh0aGlzKSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwiZWRpdG9yOmRvd25sb2FkXCIsIHRoaXMub25Eb3dubG9hZC5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwiZWRpdG9yOmJlZ2luLWNsb25lXCIsIHRoaXMub25CZWdpbkNsb25lLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJlZGl0b3I6YmVnaW4tdXBncmFkZVwiLCB0aGlzLm9uQmVnaW5VcGdyYWRlLmJpbmQodGhpcykpO1xuXG5cdFx0dGhpcy5ldmVudEJ1cy5yZXBseShcImVkaXRvcjpnZXQtY2hhbmdlLXBlcm1pc3Npb25cIiwgdGhpcy5nZXRDaGFuZ2VQZXJtaXNzaW9uLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBjb2x1bW5zID0gW1xuXHRcdFx0eyBuYW1lOiBcInVzZXJuYW1lXCIsIGxhYmVsOiBcIlVzZXJuYW1lXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImZpcnN0bmFtZVwiLCBsYWJlbDogXCJGaXJzdCBOYW1lXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcInN1cm5hbWVcIiwgbGFiZWw6IFwiU3VybmFtZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJ1c2VyR3JhZGVcIiwgbGFiZWw6IFwiR3JhZGVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwibWVtYmVyXCIsIGxhYmVsOiBcIkdyb3VwIE1lbWJlcj9cIiwgY2VsbDogQmFja2dyaWQuQ2VsbC5leHRlbmQoe1xuXHRcdFx0XHRjbGFzc05hbWU6IFwic2tpcFwiLFxuXG5cdFx0XHRcdHJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0dGhpcy4kZWwuaHRtbChcIjxzcGFuIGNsYXNzPSdmYS1jaXJjbGUgXCIgKyAodGhpcy5tb2RlbC5nZXQoXCJtZW1iZXJcIikgP1xuXHRcdFx0XHRcdFx0XCJmYXMgbWVtYmVyc2hpcC1zdGF0dXMtaW4nIHRpdGxlPSdJcyBhIG1lbWJlcidcIiA6IFwiZmFsIG1lbWJlcnNoaXAtc3RhdHVzLW91dCcgdGl0bGU9J0lzIG5vdCBhIG1lbWJlcidcIikgKyBcIj48L3NwYW4+XCIpO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXHRcdFx0fSksXG5cdFx0XHRlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRdO1xuXG5cdFx0dGhpcy5ncmlkID0gbmV3IFNlcnZlckdyaWQoe1xuXHRcdFx0ZWw6IHRoaXMudWkuZ3JpZCxcblx0XHRcdGNvbHVtbnM6IGNvbHVtbnMsXG5cdFx0XHRjb2xsZWN0aW9uOiBuZXcgVXNlckNvbGxlY3Rpb24oW10sIHtcblx0XHRcdFx0Y3VzdG9tR3JvdXA6IHRoaXMuY3VzdG9tR3JvdXAsXG5cdFx0XHRcdGdsb2JhbEdyb3VwOiB0aGlzLmdsb2JhbEdyb3VwLFxuXHRcdFx0fSksXG5cdFx0XHRjbGlja2FibGU6IHRydWUsXG5cdFx0XHRjb3VudGVyOiB7XG5cdFx0XHRcdGVsZW1lbnQ6IHRoaXMudWkuY291bnRlcixcblx0XHRcdFx0dGVtcGxhdGU6IFwiVXNlcnMgJHN0YXJ0IC0gJGVuZCBvZiAkdG90YWxcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5wYWdpbmcsXG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmdyaWQuY29sbGVjdGlvbiwgXCJzeW5jXCIsIHRoaXMuYXBwbHlFZGl0cy5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZ3JpZCwgXCJyb3c6Y2xpY2tlZFwiLCB0aGlzLmhhbmRsZUVkaXQuYmluZCh0aGlzKSk7XG5cblx0XHRjb25zdCB0ZXh0RmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJ0ZXh0XCIsXG5cdFx0XHRuYW1lOiBcInRleHRGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlRleHQgU2VhcmNoXCIsXG5cdFx0XHRkZWJvdW5jZTogMjAwLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdH07XG5cblx0XHRjb25zdCBncmFkZUZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiaXRlbWl6ZWRcIixcblx0XHRcdG5hbWU6IFwiZ3JhZGVGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIkdyYWRlXCIsXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0XHRjYXRlZ29yaWVzOiBfLm1hcChzZXR0aW5ncy5ncmFkZUxpc3QsICh2YWwsIGtleSkgPT4gKHtcblx0XHRcdFx0bGFiZWw6IGtleSxcblx0XHRcdFx0aXRlbXM6IF8ucmVkdWNlKHZhbC5zb3J0KChhLCBiKSA9PiAoXCJsZXhpY2FsXCIgaW4gYSA/IGEubGV4aWNhbCA6IGEubmFtZSkudG9VcHBlckNhc2UoKS5sb2NhbGVDb21wYXJlKChcImxleGljYWxcIiBpbiBiID8gYi5sZXhpY2FsIDogYi5uYW1lKS50b1VwcGVyQ2FzZSgpKSksXG5cdFx0XHRcdFx0KHN1bSwgbnVtKSA9PiB7IHN1bS5wdXNoKHsgbmFtZTogbnVtLnZhbHVlLCBsYWJlbDogbnVtLm5hbWUgfSk7IHJldHVybiBzdW07IH0sIFtdKSxcblx0XHRcdH0pKSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgbWVtYmVyRmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJtZW1iZXJGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIk1lbWJlcnNoaXBcIixcblx0XHRcdGNhdGVnb3JpZXM6IFtcblx0XHRcdFx0eyBpdGVtczogeyAxOiBcIkluIEdyb3VwXCIsIDA6IFwiT3V0IE9mIEdyb3VwXCIgfSB9LFxuXHRcdFx0XSxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgZmlsdGVyTGlzdCA9IFt0ZXh0RmlsdGVyLCBncmFkZUZpbHRlciwgbWVtYmVyRmlsdGVyXTtcblxuXHRcdHRoaXMudWkuZmlsdGVycy5wcmVwZW5kKHRoaXMuZ3JpZC5maWx0ZXIoeyBmaWx0ZXJDb250YWluZXI6IHRoaXMudWkuZmlsdGVycywgZmlsdGVyczogZmlsdGVyTGlzdCwgZGVmYXVsdEZpbHRlcnM6IFtcInRleHRGaWx0ZXJcIiwgXCJncmFkZUZpbHRlclwiLCBcIm1lbWJlckZpbHRlclwiXSB9KS5yZW5kZXIoKS5lbCk7XG5cblx0XHQvLyBOb3RpZnkgbGlzdGVuZXJzIHRoYXQgdGhlIGVkaXRvciBoYXMgYmVlbiBzaG93blxuXHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImVkaXRvcjpzaG93XCIpO1xuXG5cdFx0aWYgKCF0aGlzLmdldENoYW5nZVBlcm1pc3Npb24oKSkge1xuXHRcdFx0Ly8gLi4udGhlbiB3YXJuIHRoZSBjdXJyZW50IHVzZXIgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSBzYXZlZFxuXHRcdFx0Y29uc3QgbW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHRcdHdhcm5pbmc6IHRydWUsXG5cdFx0XHRcdHBlcnNpc3Q6IGZhbHNlLFxuXHRcdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmFsIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJy8+IEVkaXQgQ3VzdG9tIEdyb3VwXCIsXG5cdFx0XHRcdGJvZHk6IGA8cD5Zb3UgYXJlIG5vdCB0aGUgb3JpZ2luYWwgY3JlYXRvciBhbmQgb3duZXIgb2YgdGhpcyBjdXN0b20gZ3JvdXAuPC9wPlxuXHRcdFx0XHRcdFx0PHA+WW91IHdpbGwgbm90IGJlIGFibGUgdG8gc2F2ZSBhbnkgY2hhbmdlcyB5b3UgbWFrZS48L3A+YCxcblx0XHRcdFx0aGlkZUJ1dHRvbnM6IFtcImNhbmNlbFwiXSxcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLmxpc3RlblRvKG1vZGFsLCBcImJ1dHRvbjpva1wiLCAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuc3RvcExpc3RlbmluZyhtb2RhbCk7XG5cdFx0XHRcdG1vZGFsLmRlc3Ryb3koKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRtb2RhbC5zaG93KCk7XG5cdFx0fVxuXHR9LFxuXG5cdGhhbmRsZUVkaXQ6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0aWYgKCF0aGlzLmVkaXRzKVxuXHRcdFx0dGhpcy5lZGl0cyA9IHt9O1xuXG5cdFx0aWYgKG1vZGVsLmdldChcInVzZXJuYW1lXCIpIGluIHRoaXMuZWRpdHMpIHtcblx0XHRcdGlmIChtb2RlbC5nZXQoXCJtZW1iZXJcIikgPT09ICF0aGlzLmVkaXRzW21vZGVsLmdldChcInVzZXJuYW1lXCIpXSkge1xuXHRcdFx0XHRkZWxldGUgdGhpcy5lZGl0c1ttb2RlbC5nZXQoXCJ1c2VybmFtZVwiKV07XG5cdFx0XHRcdG1vZGVsLnRyaWdnZXIoXCJncmlkOmNvbG91clwiLCBudWxsKTtcblxuXHRcdFx0XHR0aGlzLm5vdGlmeURhdGFDaGFuZ2VkKF8ua2V5cyh0aGlzLmVkaXRzKS5sZW5ndGgpO1xuXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLmVkaXRzW21vZGVsLmdldChcInVzZXJuYW1lXCIpXSA9ICFtb2RlbC5nZXQoXCJtZW1iZXJcIik7XG5cdFx0bW9kZWwudHJpZ2dlcihcImdyaWQ6Y29sb3VyXCIsIG1vZGVsLmdldChcIm1lbWJlclwiKSA/IFwiI2VmNDk1MlwiIDogXCIjYTNkMDc1XCIpO1xuXG5cdFx0dGhpcy5ub3RpZnlEYXRhQ2hhbmdlZCh0cnVlKTtcblx0fSxcblxuXHRhcHBseUVkaXRzOiBmdW5jdGlvbihjb2wpIHtcblx0XHRpZiAoIXRoaXMuZWRpdHMpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRfLmVhY2goY29sLm1vZGVscywgeCA9PiB7XG5cdFx0XHRpZiAoeC5nZXQoXCJ1c2VybmFtZVwiKSBpbiB0aGlzLmVkaXRzKVxuXHRcdFx0XHR4LnRyaWdnZXIoXCJncmlkOmNvbG91clwiLCB4LmdldChcIm1lbWJlclwiKSA/IFwiI2VmNDk1MlwiIDogXCIjYTNkMDc1XCIpO1xuXHRcdH0pO1xuXHR9LFxuXG5cblx0b25HbG9iYWxHcm91cFVzZXJTZWxlY3RlZDogZnVuY3Rpb24odXNlck1vZGVsKSB7XG5cdFx0dGhpcy5tb3ZlVXNlckZyb21HbG9iYWxUb0N1c3RvbSh1c2VyTW9kZWwpO1xuXHR9LFxuXG5cdG9uQ3VzdG9tR3JvdXBVc2VyU2VsZWN0ZWQ6IGZ1bmN0aW9uKHVzZXJNb2RlbCkge1xuXHRcdHRoaXMubW92ZVVzZXJGcm9tQ3VzdG9tVG9HbG9iYWwodXNlck1vZGVsKTtcblx0fSxcblxuXHRvbkN1c3RvbUdyb3VwTmFtZUNoYW5nZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghXy50cmltKHRoaXMudWkudGl0bGVJbnB1dC52YWwoKSkpIHtcblx0XHRcdHRoaXMubm90aWZ5RGF0YUNoYW5nZWQoZmFsc2UpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuY3VzdG9tR3JvdXAuc2V0KFwibmFtZVwiLCBfLnRyaW0odGhpcy51aS50aXRsZUlucHV0LnZhbCgpKSk7XG5cblx0XHR0aGlzLm5vdGlmeURhdGFDaGFuZ2VkKHRydWUpO1xuXHR9LFxuXG5cdGV4ZWN1dGVJbnN0cnVjdGlvbnM6IGZ1bmN0aW9uKGluc3RydWN0aW9ucykge1xuXHRcdC8vIENvbnZlcnQgdGhlIG1vZGVscyBpbnRvIGRhdGEgdG8gYmUgc2F2ZWRcblx0XHRjb25zdCBkYXRhYSA9IF8ucmVkdWNlKGluc3RydWN0aW9ucy5tb2RlbHMsIChzdW0sIG51bSkgPT4ge1xuXHRcdFx0aWYgKG51bS5nZXQoXCJvcGVyYXRpb25cIikgPT09IFwiYWRkXCIpXG5cdFx0XHRcdHN1bVtudW0uZ2V0KFwidXNlcm5hbWVcIikgfHwgbnVtLmdldChcImVtYWlsXCIpXSA9IHRydWU7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHN1bVtudW0uZ2V0KFwidXNlcm5hbWVcIikgfHwgbnVtLmdldChcImVtYWlsXCIpXSA9IGZhbHNlO1xuXHRcdFx0cmV0dXJuIHN1bTtcblx0XHR9LCB7fSk7XG5cblx0XHRjb25zdCBsZW4gPSBfLmtleXMoZGF0YWEpLmxlbmd0aDtcblxuXHRcdGNvbnN0IG1vZGFsID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0dGl0bGU6IFwiQ3VzdG9tIGdyb3VwIHNhdmUgY29uZmlybWF0aW9uXCIsXG5cdFx0XHRib2R5OiBgPHA+VGhpcyB3aWxsIHVwZGF0ZSB1cCB0byA8c3Ryb25nPiR7bGVufSB1c2VyJHtsZW4gPT09IDEgPyBcIlwiIDogXCJzXCJ9PC9zdHJvbmc+LjwvcD5cblx0XHRcdFx0PHA+RG8geW91IHdpc2ggdG8gY29udGludWU/PC9wPmAsXG5cdFx0XHRwZXJzaXN0OiB0cnVlLFxuXHRcdH0pO1xuXG5cdFx0bW9kYWwub24oXCJidXR0b246b2tcIiwgKCkgPT4ge1xuXHRcdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwiZWRpdG9yOmJlZ2luLXNhdmVcIik7XG5cblx0XHRcdFByb21pc2UucmVzb2x2ZSgkLmFqYXgoe1xuXHRcdFx0XHRtZXRob2Q6IFwiUFVUXCIsXG5cdFx0XHRcdGRhdGE6IHtcblx0XHRcdFx0XHRjaGFuZ2VzOiBkYXRhYSxcblx0XHRcdFx0XHR1c2VybmFtZXM6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHVybDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvZ3JvdXBzL21hbmFnZXIvXCIgKyB0aGlzLmN1c3RvbUdyb3VwLmdldChcImNvZGVcIiksXG5cdFx0XHRcdGpzb246IHRydWUsXG5cdFx0XHR9KSkudGhlbihkYXRhID0+IHtcblx0XHRcdFx0aWYgKGRhdGEub2spIHtcblx0XHRcdFx0XHR0aGlzLnN0YXRlLmRhdGFDaGFuZ2VkID0gZmFsc2U7XG5cblx0XHRcdFx0XHR0aGlzLmdyaWQuY29sbGVjdGlvbi5nZXRGaXJzdFBhZ2UoKTtcblx0XHRcdFx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJlZGl0b3I6ZGF0YS1zYXZlZFwiKTtcblx0XHRcdFx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJlZGl0b3I6ZW5kLXNhdmVcIik7XG5cblx0XHRcdFx0XHR0aGlzLmVkaXRzID0ge307XG5cblx0XHRcdFx0XHRyZXR1cm4gbW9kYWwuZGVzdHJveSgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0bW9kYWwuc2hvd0Vycm9yKFwiVGhlcmUgd2FzIGFuIGVycm9yIHNhdmluZyB0aGUgY2hhbmdlc1wiKTtcblx0XHRcdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwiZWRpdG9yOmVuZC1zYXZlXCIpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9KS5jYXRjaChlID0+IHtcblx0XHRcdFx0bW9kYWwuc2hvd0Vycm9yKFwiU2F2ZSBlcnJvcjogXCIgKyBlLmluZm8pO1xuXHRcdFx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJlZGl0b3I6ZW5kLXNhdmVcIik7XG5cdFx0XHR9KTtcblx0XHR9LCB0aGlzKTtcblxuXHRcdHNldFRpbWVvdXQoKCkgPT4gbW9kYWwuc2hvdygpLCA1MCk7XG5cdH0sXG5cblx0ZGVsZXRlQ3VzdG9tR3JvdXA6IGZ1bmN0aW9uKGNhbGxiYWNrcykge1xuXHRcdHRoaXMuY3VzdG9tR3JvdXAuZGVzdHJveSh7XG5cdFx0XHR3YWl0OiB0cnVlLFxuXHRcdFx0c3VjY2VzczogY2FsbGJhY2tzICYmIGNhbGxiYWNrcy5zdWNjZXNzID8gY2FsbGJhY2tzLnN1Y2Nlc3MgOiB1bmRlZmluZWQsXG5cdFx0XHRlcnJvcjogY2FsbGJhY2tzICYmIGNhbGxiYWNrcy5lcnJvciA/IGNhbGxiYWNrcy5lcnJvciA6IHVuZGVmaW5lZCxcblx0XHR9KTtcblx0fSxcblxuXHRub3RpZnlEYXRhQ2hhbmdlZDogZnVuY3Rpb24ob3ZlcnJpZGUpIHtcblx0XHRpZiAoIV8uaXNVbmRlZmluZWQob3ZlcnJpZGUpKVxuXHRcdFx0dGhpcy5zdGF0ZS5kYXRhQ2hhbmdlZCA9IEJvb2xlYW4ob3ZlcnJpZGUpO1xuXG5cdFx0ZWxzZSBpZiAoXy5rZXlzKHRoaXMuZWRpdHMpLmxlbmd0aClcblx0XHRcdHRoaXMuc3RhdGUuZGF0YUNoYW5nZWQgPSB0cnVlO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuc3RhdGUuZGF0YUNoYW5nZWQgPSBmYWxzZTtcblxuXHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImVkaXRvcjpkYXRhLWNoYW5nZWRcIiwgdGhpcy5zdGF0ZS5kYXRhQ2hhbmdlZCk7XG5cdH0sXG5cblx0Y29uZmlybURhdGFDaGFuZ2U6IGZ1bmN0aW9uKGdhdGVkRXZlbnQsIG9wdGlvbnMgPSB7fSkge1xuXHRcdGlmICh0aGlzLnN0YXRlLmRhdGFDaGFuZ2VkICYmIHRoaXMuZ2V0Q2hhbmdlUGVybWlzc2lvbigpKSB7XG5cdFx0XHRjb25zdCBtb2RhbCA9IG5ldyBTbWFsbE1vZGFsKHtcblx0XHRcdFx0d2FybmluZzogdHJ1ZSxcblx0XHRcdFx0cGVyc2lzdDogdHJ1ZSxcblx0XHRcdFx0dGl0bGU6IFwiPHNwYW4gY2xhc3M9J2ZhbCBmYS1leGNsYW1hdGlvbi10cmlhbmdsZScvPiBTYXZlIEN1c3RvbSBHcm91cFwiLFxuXHRcdFx0XHRib2R5OiBcIjxwPlRoZSBjdXN0b20gZ3JvdXAgaGFzIG5vdCBiZWVuIHNhdmVkLiBXb3VsZCB5b3UgbGlrZSB0byBzYXZlIGJlZm9yZSBjb250aW51aW5nPzwvcD5cIixcblx0XHRcdFx0Y3VzdG9tT0s6IFwiWWVzXCIsXG5cdFx0XHRcdGN1c3RvbUNhbmNlbDogXCJOb1wiLFxuXHRcdFx0fSk7XG5cblx0XHRcdG1vZGFsLm9uKFwiYnV0dG9uOm9rXCIsICgpID0+IHtcblx0XHRcdFx0dGhpcy5zYXZlQ3VzdG9tR3JvdXAoe1xuXHRcdFx0XHRcdHN1Y2Nlc3M6ICgpID0+IHtcblx0XHRcdFx0XHRcdG1vZGFsLmRlc3Ryb3koKTtcblx0XHRcdFx0XHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihnYXRlZEV2ZW50KTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGVycm9yOiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRtb2RhbC5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKFwiZXJyb3Igc2F2aW5nIGN1c3RvbSBncm91cFwiKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9KTtcblx0XHRcdH0sIHRoaXMpO1xuXG5cdFx0XHRtb2RhbC5vbihcImJ1dHRvbjpjYW5jZWxcIiwgKCkgPT4ge1xuXHRcdFx0XHRtb2RhbC5kZXN0cm95KCk7XG5cblx0XHRcdFx0aWYgKG9wdGlvbnMudHJpZ2dlck9uQ2FuY2VsKVxuXHRcdFx0XHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihnYXRlZEV2ZW50KTtcblx0XHRcdH0sIHRoaXMpO1xuXG5cdFx0XHRtb2RhbC5zaG93KCk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKGdhdGVkRXZlbnQpO1xuXHRcdH1cblx0fSxcblxuXHRzYXZlQ3VzdG9tR3JvdXA6IGZ1bmN0aW9uKGNhbGxiYWNrcykge1xuXHRcdGNvbnN0IGxlbiA9IF8ua2V5cyh0aGlzLmVkaXRzKS5sZW5ndGg7XG5cblx0XHRjb25zdCBtb2RhbCA9IG5ldyBTbWFsbE1vZGFsKHtcblx0XHRcdHRpdGxlOiBcIkN1c3RvbSBncm91cCBzYXZlIGNvbmZpcm1hdGlvblwiLFxuXHRcdFx0Ym9keTogYDxwPlRoaXMgd2lsbCB1cGRhdGUgPHN0cm9uZz4ke2xlbn0gdXNlciR7bGVuID09PSAxID8gXCJcIiA6IFwic1wifTwvc3Ryb25nPiwgYW5kIHRoZSBjdXN0b20gZ3JvdXAgbmFtZSAoaWYgaXQgY2hhbmdlZCkuPC9wPlxuXHRcdFx0XHQ8cD5EbyB5b3Ugd2lzaCB0byBjb250aW51ZT88L3A+YCxcblx0XHRcdHBlcnNpc3Q6IHRydWUsXG5cdFx0fSk7XG5cblx0XHRtb2RhbC5vbihcImJ1dHRvbjpva1wiLCAoKSA9PiB7XG5cdFx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJlZGl0b3I6YmVnaW4tc2F2ZVwiKTtcblxuXHRcdFx0UHJvbWlzZS5yZXNvbHZlKCQuYWpheCh7XG5cdFx0XHRcdG1ldGhvZDogXCJQVVRcIixcblx0XHRcdFx0ZGF0YToge1xuXHRcdFx0XHRcdGNoYW5nZXM6IEpTT04uc3RyaW5naWZ5KHRoaXMuZWRpdHMpLFxuXHRcdFx0XHRcdG5hbWU6IHRoaXMuY3VzdG9tR3JvdXAuZ2V0KFwibmFtZVwiKSxcblx0XHRcdFx0XHRncm91cDogdGhpcy5jdXN0b21Hcm91cC5nZXQoXCJjb2RlXCIpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR1cmw6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2dyb3Vwcy9tYW5hZ2VyL1wiICsgdGhpcy5jdXN0b21Hcm91cC5nZXQoXCJjb2RlXCIpLFxuXHRcdFx0XHRqc29uOiB0cnVlLFxuXHRcdFx0fSkpLnRoZW4oZGF0YSA9PiB7XG5cdFx0XHRcdGlmIChkYXRhLm9rKSB7XG5cdFx0XHRcdFx0Ly8gRXhlY3V0ZSBhIHN1Y2Nlc3MgY2FsbGJhY2ssIGlmIGRlZmluZWRcblx0XHRcdFx0XHRpZiAoY2FsbGJhY2tzICYmIGNhbGxiYWNrcy5zdWNjZXNzKVxuXHRcdFx0XHRcdFx0Y2FsbGJhY2tzLnN1Y2Nlc3MoKTtcblxuXHRcdFx0XHRcdHRoaXMuc3RhdGUuZGF0YUNoYW5nZWQgPSBmYWxzZTtcblxuXHRcdFx0XHRcdHRoaXMuZ3JpZC5jb2xsZWN0aW9uLmdldEZpcnN0UGFnZSgpO1xuXHRcdFx0XHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImVkaXRvcjpkYXRhLXNhdmVkXCIpO1xuXHRcdFx0XHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImVkaXRvcjplbmQtc2F2ZVwiKTtcblxuXHRcdFx0XHRcdHRoaXMuZWRpdHMgPSB7fTtcblxuXHRcdFx0XHRcdHJldHVybiBtb2RhbC5kZXN0cm95KCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBFeGVjdXRlIGFuIGVycm9yIGNhbGxiYWNrLCBpZiBkZWZpbmVkXG5cdFx0XHRcdGlmIChjYWxsYmFja3MgJiYgY2FsbGJhY2tzLmVycm9yKVxuXHRcdFx0XHRcdGNhbGxiYWNrcy5lcnJvcigpO1xuXG5cdFx0XHRcdG1vZGFsLnNob3dFcnJvcihcIlRoZXJlIHdhcyBhbiBlcnJvciBzYXZpbmcgdGhlIGNoYW5nZXNcIik7XG5cdFx0XHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImVkaXRvcjplbmQtc2F2ZVwiKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSkuY2F0Y2goZSA9PiB7XG5cdFx0XHRcdC8vIEV4ZWN1dGUgYW4gZXJyb3IgY2FsbGJhY2ssIGlmIGRlZmluZWRcblx0XHRcdFx0aWYgKGNhbGxiYWNrcyAmJiBjYWxsYmFja3MuZXJyb3IpXG5cdFx0XHRcdFx0Y2FsbGJhY2tzLmVycm9yKCk7XG5cblx0XHRcdFx0bW9kYWwuc2hvd0Vycm9yKFwiU2F2ZSBlcnJvcjogXCIgKyBlLmluZm8pO1xuXHRcdFx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJlZGl0b3I6ZW5kLXNhdmVcIik7XG5cdFx0XHR9KTtcblx0XHR9LCB0aGlzKTtcblxuXHRcdG1vZGFsLnNob3coKTtcblx0fSxcblxuXHRvbkFjdGlvbkJhY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY29uZmlybURhdGFDaGFuZ2UoXCJlZGl0b3I6YmFja1wiLCB7XG5cdFx0XHRkZXN0cm95VW5zYXZlZDogdHJ1ZSxcblx0XHRcdHRyaWdnZXJPbkNhbmNlbDogdHJ1ZSxcblx0XHR9KTtcblx0fSxcblxuXHRvbkFjdGlvbkRvd25sb2FkOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmNvbmZpcm1EYXRhQ2hhbmdlKFwiZWRpdG9yOmRvd25sb2FkXCIpO1xuXHR9LFxuXG5cdG9uQWN0aW9uQ2xvbmU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY29uZmlybURhdGFDaGFuZ2UoXCJlZGl0b3I6YmVnaW4tY2xvbmVcIik7XG5cdH0sXG5cblx0b25BY3Rpb25VcGdyYWRlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmNvbmZpcm1EYXRhQ2hhbmdlKFwiZWRpdG9yOmJlZ2luLXVwZ3JhZGVcIik7XG5cdH0sXG5cblx0b25BY3Rpb25TYXZlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNhdmVDdXN0b21Hcm91cCgpO1xuXHR9LFxuXG5cdG9uQWN0aW9uQWRkQWxsOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBtb2RhbCA9IG5ldyBTbWFsbE1vZGFsKHtcblx0XHRcdHRpdGxlOiBcIkFkZCBBbGwgVXNlcnMgVG8gQ0dcIixcblx0XHRcdGJvZHk6IFwiVGhpcyB3aWxsIGFkZCBBTEwgdXNlcnMgaW4gdGhlIHJlbGV2YW50IGdsb2JhbCBncm91cCAoaW5jbHVkaW5nIHVzZXJzIG9uIG90aGVyIHBhZ2VzKSB0byB0aGlzIGN1c3RvbSBncm91cC5cIixcblx0XHRcdHBlcnNpc3Q6IHRydWUsXG5cdFx0fSk7XG5cblx0XHRtb2RhbC5vbihcImJ1dHRvbjpva1wiLCAoKSA9PiBQcm9taXNlLnJlc29sdmUoJC5hamF4KHtcblx0XHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0XHR1cmw6IGAke3NldHRpbmdzLnVybFJvb3R9L2FjYWNpYS9ncm91cHMvJHt0aGlzLmN1c3RvbUdyb3VwLmdldChcImNvZGVcIil9L2FkZEFsbGAsXG5cdFx0XHRqc29uOiB0cnVlLFxuXHRcdH0pKVxuXHRcdFx0LnRoZW4oKCkgPT4ge1xuXHRcdFx0XHRtb2RhbC5kZXN0cm95KCk7XG5cdFx0XHRcdHJldHVybiB0aGlzLmdyaWQuY29sbGVjdGlvbi5mZXRjaCgpO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChlID0+IHtcblx0XHRcdFx0Y29uc29sZS5lcnJvcihlKTtcblx0XHRcdFx0bW9kYWwuc2hvd0Vycm9yKGUpO1xuXHRcdFx0fSkpO1xuXG5cdFx0bW9kYWwuc2hvdygpO1xuXHR9LFxuXG5cdG9uQWN0aW9uUmVtb3ZlQWxsOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBtb2RhbCA9IG5ldyBTbWFsbE1vZGFsKHtcblx0XHRcdHdhcm5pbmc6IHRydWUsXG5cdFx0XHR0aXRsZTogXCJSZW1vdmUgQWxsIFVzZXJzIEZyb20gQ0dcIixcblx0XHRcdGJvZHk6IFwiVGhpcyB3aWxsIHJlbW92ZSBBTEwgdXNlcnMgaW4gdGhlIHJlbGV2YW50IGdsb2JhbCBncm91cCAoaW5jbHVkaW5nIHVzZXJzIG9uIG90aGVyIHBhZ2VzKSBmcm9tIHRoaXMgY3VzdG9tIGdyb3VwLlwiLFxuXHRcdFx0cGVyc2lzdDogdHJ1ZSxcblx0XHR9KTtcblxuXHRcdG1vZGFsLm9uKFwiYnV0dG9uOm9rXCIsICgpID0+IFByb21pc2UucmVzb2x2ZSgkLmFqYXgoe1xuXHRcdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRcdHVybDogYCR7c2V0dGluZ3MudXJsUm9vdH0vYWNhY2lhL2dyb3Vwcy8ke3RoaXMuY3VzdG9tR3JvdXAuZ2V0KFwiY29kZVwiKX0vcmVtb3ZlQWxsYCxcblx0XHRcdGpzb246IHRydWUsXG5cdFx0fSkpXG5cdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdG1vZGFsLmRlc3Ryb3koKTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ3JpZC5jb2xsZWN0aW9uLmZldGNoKCk7XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKGUgPT4ge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKGUpO1xuXHRcdFx0XHRtb2RhbC5zaG93RXJyb3IoZSk7XG5cdFx0XHR9KSk7XG5cblx0XHRtb2RhbC5zaG93KCk7XG5cdH0sXG5cblx0b25Eb3dubG9hZDogZnVuY3Rpb24oKSB7XG5cdFx0d2luZG93Lm9wZW4oc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvZ3JvdXBzL21hbmFnZXIvXCIgKyB0aGlzLmN1c3RvbUdyb3VwLmdldChcImNvZGVcIikgKyBcIi9zbmFwc2hvdFwiKTtcblx0fSxcblxuXHRvbkJlZ2luQ2xvbmU6IGFzeW5jIGZ1bmN0aW9uKCkge1xuXHRcdFByb21pc2UucmVzb2x2ZSgkLmFqYXgoe1xuXHRcdFx0bWV0aG9kOiBcIkdFVFwiLFxuXHRcdFx0dXJsOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9ncm91cHMvbWFuYWdlci9jbG9uZT9jb2RlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuY3VzdG9tR3JvdXAuZ2V0KFwiY29kZVwiKSksXG5cdFx0fSkpXG5cdFx0XHQudGhlbihkYXRhID0+IHtcblx0XHRcdFx0Y29uc3QgZ3JvdXAgPSBuZXcgR3JvdXBNb2RlbChkYXRhKTtcblx0XHRcdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwiZWRpdG9yOmVuZC1jbG9uZVwiKTtcblx0XHRcdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwiZWRpdG9yOmNsb25lXCIsIGdyb3VwLCB0aGlzLmdsb2JhbEdyb3VwKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChlID0+IHtcblx0XHRcdFx0YWxlcnQoXCJFcnJvciBjbG9uaW5nIGdyb3VwOiBcIiArIGUubWVzc2FnZSk7XG5cdFx0XHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImVkaXRvcjplbmQtY2xvbmVcIik7XG5cdFx0XHR9KTtcblx0fSxcblxuXHRvbkJlZ2luVXBncmFkZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51cGdyYWRlTW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHRwZXJzaXN0OiB0cnVlLFxuXHRcdFx0dGl0bGU6IFwiPHNwYW4gY2xhc3M9J2ZhbCBmYS1leGNsYW1hdGlvbi10cmlhbmdsZScvPiBVcGdyYWRlIENvbmZpcm1hdGlvblwiLFxuXHRcdFx0Ym9keTogXCI8cD5UaGlzIHdpbGwgdXBncmFkZSB0aGUgY3VycmVudCBjdXN0b20gZ3JvdXAgdG8gYSBnbG9iYWwgZ3JvdXAuPC9wPjxwPjx1bD5cIiArXG5cdFx0XHRcdFwiPGxpPkFsbCBhdHRhY2htZW50cyBhbmQgXCIgKyBzZXR0aW5ncy5sZWFybmluZ1BhdGhzQ3VzdG9tTmFtZSArIFwiIGNvbnRlbnQgbGlua2VkIHRvIHRoZSBncm91cCB3aWxsIGJlIHByZXNlcnZlZC5cIiArXG5cdFx0XHRcdFwiPGxpPkFsbCBjdXJyZW50IGdyb3VwIG1lbWJlcnMgd2lsbCBiZSBwcmVzZXJ2ZWQuXCIgK1xuXHRcdFx0XHRcIjxsaT5UaGUgZ3JvdXAgd2lsbCBOTyBMT05HRVIgYmUgZWRpdGFibGUgdGhyb3VnaCB0aGUgQ3VzdG9tIEdyb3VwcyBwYWdlLlwiICtcblx0XHRcdFx0XCI8bGk+VGhlIGdyb3VwIHdpbGwgYmUgYXNzaWduYWJsZSB0byBhbnkgYm9va3MuPC91bD48L3A+XCIsXG5cdFx0fSk7XG5cblx0XHR0aGlzLnVwZ3JhZGVNb2RhbC5vbihcImJ1dHRvbjpva1wiLCAoKSA9PiB7XG5cdFx0XHR0aGlzLmN1c3RvbUdyb3VwLnNhdmUobnVsbCwge1xuXHRcdFx0XHR2YWxpZGF0ZTogZmFsc2UsXG5cdFx0XHRcdHdhaXQ6IHRydWUsXG5cdFx0XHRcdHN1Y2Nlc3M6IHRoaXMudXBncmFkZVN1Y2Nlc3MuYmluZCh0aGlzKSxcblx0XHRcdFx0ZXJyb3I6IHRoaXMudXBncmFkZUVycm9yLmJpbmQodGhpcyksXG5cdFx0XHRcdHVybDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvZ3JvdXBzL2N1c3RvbS91cGdyYWRlL1wiICsgdGhpcy5jdXN0b21Hcm91cC5nZXQoXCJjb2RlXCIpLFxuXHRcdFx0fSk7XG5cdFx0fSwgdGhpcyk7XG5cblx0XHR0aGlzLnVwZ3JhZGVNb2RhbC5zaG93KCk7XG5cdH0sXG5cblx0dXBncmFkZVN1Y2Nlc3M6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudXBncmFkZU1vZGFsLmRlc3Ryb3koKTtcblxuXHRcdC8vIFBvc3NpYmx5IHVwZGF0ZSB0aGUgY3VycmVudCB1c2VyIHRvIGtub3cgYWJvdXQgdGhpcyBjaGFuZ2Vcblx0XHRjb25zdCBjdXJyZW50VXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cblx0XHRpZiAoIXJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAuZ3JvdXBzLmFsbCwgY3VycmVudFVzZXIpKSB7XG5cdFx0XHRpZiAoXy5pbmNsdWRlcyhjdXJyZW50VXNlci5jdXN0b21Hcm91cHMsIHRoaXMuY3VzdG9tR3JvdXAuZ2V0KFwiY29kZVwiKSkpIHtcblx0XHRcdFx0Y3VycmVudFVzZXIuY3VzdG9tR3JvdXBzID0gXy53aXRob3V0KGN1cnJlbnRVc2VyLmN1c3RvbUdyb3VwcywgdGhpcy5jdXN0b21Hcm91cC5nZXQoXCJjb2RlXCIpKTtcblx0XHRcdFx0Y3VycmVudFVzZXIuZ3JvdXBzLnB1c2godGhpcy5jdXN0b21Hcm91cC5nZXQoXCJjb2RlXCIpKTtcblx0XHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLlVwZGF0ZVVzZXJEZXRhaWxzLCBjdXJyZW50VXNlcik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwiZWRpdG9yOmVuZC11cGdyYWRlXCIpO1xuXHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImVkaXRvcjpncm91cC11cGdyYWRlZFwiKTtcblx0fSxcblxuXHR1cGdyYWRlRXJyb3I6IGZ1bmN0aW9uKG1vZGVsLCB4aHIpIHtcblx0XHRjb25zdCBhbnN3ZXIgPSBBcHAucGFyc2VSZXNwb25zZSh4aHIpO1xuXG5cdFx0dGhpcy51cGdyYWRlTW9kYWwuc2hvd0Vycm9yKFwiVXBncmFkZSBmYWlsZWQ6IFwiICsgKGFuc3dlci5kZXRhaWwgfHwgYW5zd2VyLmluZm8pKTtcblxuXHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImVkaXRvcjplbmQtdXBncmFkZVwiKTtcblx0fSxcblxuXHRnZXRDaGFuZ2VQZXJtaXNzaW9uOiBmdW5jdGlvbigpIHtcblx0XHQvLyBPbmx5IHRoZSBvd25lciBvZiBhIGN1c3RvbSBncm91cCBvciBhIHVzZXIgd2l0aCBmdWxsIHBlcm1pc3Npb25zIHRvIGFsdGVyIGdyb3VwcyBpcyBhbGxvd2VkIHRvIHNhdmUgY2hhbmdlc1xuXHRcdC8vIHRvIHRoZSBjdXJyZW50IGN1c3RvbSBncm91cFxuXHRcdGNvbnN0IGN1cnJlbnRVc2VyID0gcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblxuXHRcdGlmIChyZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmdyb3Vwcy5hbGwsIGN1cnJlbnRVc2VyKSlcblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0cmV0dXJuIHRoaXMuY3VzdG9tR3JvdXAuaGFzKFwib3duZXJcIikgJiYgdGhpcy5jdXN0b21Hcm91cC5nZXQoXCJvd25lclwiKSA9PT0gY3VycmVudFVzZXIudXNlcl9pZDtcblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLmN1c3RvbUdyb3VwKTtcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcodGhpcy5nbG9iYWxHcm91cFVzZXJHcmlkKTtcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcodGhpcy5jdXN0b21Hcm91cFVzZXJHcmlkKTtcblxuXHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLmV2ZW50QnVzKTtcblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiY29udGVudCBjdXN0b20tZ3JvdXAtbWFuYWdlclwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2N1c3RvbUdyb3VwTWFuYWdlci5udW5qXCIpLm1hbmFnZXIsXG5cblx0cmVnaW9uczoge1xuXHRcdGN1c3RvbUdyb3VwQ3JlYXRvcjogXCIuY3VzdG9tLWdyb3VwLWNyZWF0b3ItcmVnaW9uXCIsXG5cdFx0Y3VzdG9tR3JvdXBTZWxlY3RvcjogXCIuY3VzdG9tLWdyb3VwLXNlbGVjdG9yLXJlZ2lvblwiLFxuXHRcdGVkaXRvcjogXCIuZWRpdG9yLXJlZ2lvblwiLFxuXHRcdGdsb2JhbEdyb3VwU2VsZWN0b3I6IFwiLmdsb2JhbC1ncm91cC1zZWxlY3Rvci1yZWdpb25cIixcblx0XHRoZWFkZXI6IFwiLmhlYWRlci1yZWdpb25cIixcblx0XHRzdGF0dXM6IFwiLnN0YXR1cy1yZWdpb25cIixcblx0fSxcblxuXHR1aToge1xuXHRcdGN1c3RvbUdyb3VwU2VsZWN0b3JSZWdpb246IFwiLmN1c3RvbS1ncm91cC1zZWxlY3Rvci1yZWdpb25cIixcblx0XHRjdXN0b21Hcm91cENyZWF0b3JSZWdpb246IFwiLmN1c3RvbS1ncm91cC1jcmVhdG9yLXJlZ2lvblwiLFxuXHRcdGdsb2JhbEdyb3VwU2VsZWN0b3JSZWdpb246IFwiLmdsb2JhbC1ncm91cC1zZWxlY3Rvci1yZWdpb25cIixcblx0XHRoZWFkZXJSZWdpb246IFwiLmhlYWRlci1yZWdpb25cIixcblx0XHRzdGF0dXNSZWdpb246IFwiLnN0YXR1cy1yZWdpb25cIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5zdGFydENvZGUgPSBvcHRpb25zLmNvZGU7XG5cdFx0dGhpcy5ldmVudEJ1cyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJjdXN0b21Hcm91cE1hbmFnZXJcIik7XG5cblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwiYWN0aW9uOmRlbGV0ZVwiLCB0aGlzLm9uRWRpdG9yRGVsZXRlLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJhY3Rpb246dXBsb2FkXCIsIHRoaXMub25FZGl0b3JVcGxvYWQuYmluZCh0aGlzKSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwiZWRpdG9yOmJhY2tcIiwgdGhpcy5vbkVkaXRvckJhY2suYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmV2ZW50QnVzLCBcImVkaXRvcjpncm91cC11cGdyYWRlZFwiLCB0aGlzLm9uRWRpdG9yR3JvdXBVcGdyYWRlZC5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwiZWRpdG9yOmJlZ2luLXNhdmVcIiwgdGhpcy5vbkVkaXRvckJlZ2luU2F2ZS5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwiZWRpdG9yOmVuZC1zYXZlXCIsIHRoaXMub25FZGl0b3JFbmRTYXZlLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJlZGl0b3I6Y2xvbmVcIiwgdGhpcy5vbkVkaXRvckNsb25lLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLnN0YXR1c1JlZ2lvbi5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5oZWFkZXJSZWdpb24ucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0dGhpcy5oZWFkZXIgPSBuZXcgSGVhZGVyKHsgZXZlbnRCdXM6IHRoaXMuZXZlbnRCdXMgfSk7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiaGVhZGVyXCIsIHRoaXMuaGVhZGVyKTtcblxuXHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0aW9uUHJvbXB0LCBudWxsKTtcblxuXHRcdGlmICh0aGlzLnN0YXJ0Q29kZSkge1xuXHRcdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwic3RhdHVzXCIsIG5ldyBTdGF0dXNWaWV3KHsgdHlwZTogXCJsb2FkaW5nXCIgfSkpO1xuXG5cdFx0XHQvLyBXZSdyZSB0cnlpbmcgdG8gZWRpdCBhIGN1c3RvbSBncm91cCwgc28gZmV0Y2ggaXQgZnJvbSB0aGUgc2VydmVyXG5cdFx0XHRjb25zdCBjdXN0b21Nb2RlbCA9IG5ldyBHcm91cE1vZGVsKHtcblx0XHRcdFx0Y29kZTogdGhpcy5zdGFydENvZGUsXG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gRG9uJ3QgcmVydW4gdGhpcyBjb2RlXG5cdFx0XHRkZWxldGUgdGhpcy5zdGFydENvZGU7XG5cblx0XHRcdGNvbnN0IHhociA9IGN1c3RvbU1vZGVsLmZldGNoKCk7XG5cdFx0XHRQcm9taXNlLnJlc29sdmUoeGhyKVxuXHRcdFx0XHQudGhlbigoKSA9PiB7XG5cdFx0XHRcdFx0aWYgKCFjdXN0b21Nb2RlbC5nZXQoXCJwcml2YXRlXCIpKVxuXHRcdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIGZpbmQgbWF0Y2hpbmcgZ3JvdXBcIik7XG5cblx0XHRcdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCQuYWpheCh7XG5cdFx0XHRcdFx0XHRtZXRob2Q6IFwiR0VUXCIsXG5cdFx0XHRcdFx0XHR1cmw6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2dyb3Vwcy9cIiArIGN1c3RvbU1vZGVsLmdldChcInJvb3RcIiksXG5cdFx0XHRcdFx0XHRqc29uOiB0cnVlLFxuXHRcdFx0XHRcdH0pKTtcblx0XHRcdFx0fSlcblx0XHRcdFx0LnRoZW4oZGF0YSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgZ2xvYmFsR3JvdXAgPSBuZXcgR3JvdXBNb2RlbChkYXRhKTtcblx0XHRcdFx0XHR0aGlzLnNob3dFZGl0b3IoY3VzdG9tTW9kZWwsIGdsb2JhbEdyb3VwKTtcblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnVpLnN0YXR1c1JlZ2lvbi5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaChlID0+IHtcblx0XHRcdFx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJzdGF0dXNcIiwgbmV3IEVycm9yVmlldyh7IGZldGNoRXJyb3I6IGUgfSkpO1xuXHRcdFx0XHR9KTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLmdsb2JhbEdyb3VwU2VsZWN0b3IgPSBuZXcgR2xvYmFsR3JvdXBTZWxlY3RvcigpO1xuXHRcdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmdsb2JhbEdyb3VwU2VsZWN0b3IsIFwic2VsZWN0XCIsIHRoaXMub25HbG9iYWxHcm91cENoYW5nZS5iaW5kKHRoaXMpKTtcblx0XHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImdsb2JhbEdyb3VwU2VsZWN0b3JcIiwgdGhpcy5nbG9iYWxHcm91cFNlbGVjdG9yKTtcblx0XHR9XG5cdH0sXG5cblx0cmVuZGVyRXJyb3I6IGZ1bmN0aW9uKGVycm9yKSB7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwic3RhdHVzXCIsIG5ldyBFcnJvclZpZXcoeyBmZXRjaEVycm9yOiBlcnJvciB9KSk7XG5cdH0sXG5cblx0b25HbG9iYWxHcm91cENoYW5nZTogZnVuY3Rpb24oZ3JvdXApIHtcblx0XHR0aGlzLmN1c3RvbUdyb3VwU2VsZWN0b3IgPSBuZXcgQ3VzdG9tR3JvdXBTZWxlY3Rvcih7XG5cdFx0XHRnbG9iYWxHcm91cDogZ3JvdXAsXG5cdFx0fSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuY3VzdG9tR3JvdXBTZWxlY3RvciwgXCJjcmVhdGVcIiwgdGhpcy5vbkNyZWF0ZUN1c3RvbUdyb3VwLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5jdXN0b21Hcm91cFNlbGVjdG9yLCBcInNlbGVjdFwiLCB0aGlzLm9uQ3VzdG9tR3JvdXBDaGFuZ2UuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiY3VzdG9tR3JvdXBTZWxlY3RvclwiLCB0aGlzLmN1c3RvbUdyb3VwU2VsZWN0b3IpO1xuXHR9LFxuXG5cdG9uQ3JlYXRlQ3VzdG9tR3JvdXA6IGZ1bmN0aW9uKGdsb2JhbEdyb3VwKSB7XG5cdFx0dGhpcy51aS5jdXN0b21Hcm91cFNlbGVjdG9yUmVnaW9uLmFkZENsYXNzKFwiaGlkZVwiKTtcblxuXHRcdGNvbnN0IGN1c3RvbUdyb3VwTW9kZWwgPSBuZXcgR3JvdXBNb2RlbCh7XG5cdFx0XHRjdXN0b206IGdsb2JhbEdyb3VwLmdldChcIm5hbWVcIiksXG5cdFx0XHRuYW1lOiBcIlwiLFxuXHRcdFx0b3duZXI6IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcikudXNlcl9pZCxcblx0XHRcdHByaXZhdGU6IHRydWUsXG5cdFx0XHRyb290OiBnbG9iYWxHcm91cC5nZXQoXCJjb2RlXCIpLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5jdXN0b21Hcm91cENyZWF0b3IgPSBuZXcgQ3VzdG9tR3JvdXBDcmVhdG9yKHtcblx0XHRcdG1vZGVsOiBjdXN0b21Hcm91cE1vZGVsLFxuXHRcdFx0Z2xvYmFsR3JvdXAsXG5cdFx0fSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuY3VzdG9tR3JvdXBDcmVhdG9yLCBcImFjY2VwdFwiLCB0aGlzLm9uQWNjZXB0Q3VzdG9tR3JvdXAuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmN1c3RvbUdyb3VwQ3JlYXRvciwgXCJyZWplY3RcIiwgdGhpcy5vblJlamVjdEN1c3RvbUdyb3VwLmJpbmQodGhpcykpO1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImN1c3RvbUdyb3VwQ3JlYXRvclwiLCB0aGlzLmN1c3RvbUdyb3VwQ3JlYXRvcik7XG5cblx0XHR0aGlzLnVpLmN1c3RvbUdyb3VwQ3JlYXRvclJlZ2lvbi5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy5jdXN0b21Hcm91cENyZWF0b3IuZm9jdXMoKTtcblx0fSxcblxuXHRkZXN0cm95Q3VzdG9tR3JvdXBDcmVhdG9yOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmdldFJlZ2lvbihcImN1c3RvbUdyb3VwQ3JlYXRvclwiKS5yZXNldCgpO1xuXG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKHRoaXMuY3VzdG9tR3JvdXBDcmVhdG9yKTtcblxuXHRcdHRoaXMuY3VzdG9tR3JvdXBDcmVhdG9yID0gbnVsbDtcblx0fSxcblxuXHRvbkFjY2VwdEN1c3RvbUdyb3VwOiBmdW5jdGlvbihjdXN0b21Hcm91cE1vZGVsLCBnbG9iYWxHcm91cCkge1xuXHRcdHRoaXMuZGVzdHJveUN1c3RvbUdyb3VwQ3JlYXRvcigpO1xuXG5cdFx0dGhpcy51aS5nbG9iYWxHcm91cFNlbGVjdG9yUmVnaW9uLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLmN1c3RvbUdyb3VwQ3JlYXRvclJlZ2lvbi5hZGRDbGFzcyhcImhpZGVcIik7XG5cblx0XHR0aGlzLnNob3dFZGl0b3IoY3VzdG9tR3JvdXBNb2RlbCwgZ2xvYmFsR3JvdXApO1xuXHR9LFxuXG5cdG9uUmVqZWN0Q3VzdG9tR3JvdXA6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZGVzdHJveUN1c3RvbUdyb3VwQ3JlYXRvcigpO1xuXG5cdFx0dGhpcy51aS5jdXN0b21Hcm91cENyZWF0b3JSZWdpb24uYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkuY3VzdG9tR3JvdXBTZWxlY3RvclJlZ2lvbi5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0b25DdXN0b21Hcm91cENoYW5nZTogZnVuY3Rpb24oY3VzdG9tR3JvdXBDb2RlLCBnbG9iYWxHcm91cENvZGUpIHtcblx0XHR0aGlzLnVpLmN1c3RvbUdyb3VwU2VsZWN0b3JSZWdpb24uYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkuZ2xvYmFsR3JvdXBTZWxlY3RvclJlZ2lvbi5hZGRDbGFzcyhcImhpZGVcIik7XG5cblx0XHR0aGlzLnNob3dFZGl0b3IoY3VzdG9tR3JvdXBDb2RlLCBnbG9iYWxHcm91cENvZGUpO1xuXHR9LFxuXG5cdHNob3dFZGl0b3I6IGZ1bmN0aW9uKGN1c3RvbUdyb3VwLCBnbG9iYWxHcm91cCkge1xuXHRcdGlmICh0aGlzLmVkaXRvcilcblx0XHRcdHRoaXMuZ2V0UmVnaW9uKFwiZWRpdG9yXCIpLnJlc2V0KCk7XG5cblx0XHR0aGlzLmVkaXRvciA9IG5ldyBFZGl0b3Ioe1xuXHRcdFx0Y3VzdG9tR3JvdXA6IGN1c3RvbUdyb3VwLFxuXHRcdFx0ZXZlbnRCdXM6IHRoaXMuZXZlbnRCdXMsXG5cdFx0XHRnbG9iYWxHcm91cDogZ2xvYmFsR3JvdXAsXG5cdFx0fSk7XG5cblx0XHR0aGlzLmN1c3RvbUdyb3VwID0gY3VzdG9tR3JvdXA7XG5cdFx0dGhpcy5nbG9iYWxHcm91cCA9IGdsb2JhbEdyb3VwO1xuXG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiZWRpdG9yXCIsIHRoaXMuZWRpdG9yKTtcblxuXHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0ZSwgXCIvZ3JvdXBzL21hbmFnZUN1c3RvbS9cIiArIGN1c3RvbUdyb3VwLmdldChcImNvZGVcIiksIHsgdHJpZ2dlcjogZmFsc2UsIHJlcGxhY2U6IGZhbHNlIH0pO1xuXHR9LFxuXG5cdG9uRWRpdG9yQmFjazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jbG9zZSgpO1xuXHR9LFxuXG5cdG9uRWRpdG9yR3JvdXBVcGdyYWRlZDogZnVuY3Rpb24oKSB7XG5cdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLk5hdmlnYXRlLCBcIi9ncm91cHMvbWFuYWdlQ3VzdG9tXCIsIHsgcmVwbGFjZTogdHJ1ZSB9KTtcblx0fSxcblxuXHRvbkVkaXRvckJlZ2luU2F2ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy4kZWwuYWRkQ2xhc3MoXCJidXN5XCIpO1xuXHR9LFxuXG5cdG9uRWRpdG9yRW5kU2F2ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy4kZWwucmVtb3ZlQ2xhc3MoXCJidXN5XCIpO1xuXHR9LFxuXG5cdG9uRWRpdG9yQ2xvbmU6IGZ1bmN0aW9uKGN1c3RvbUdyb3VwLCBnbG9iYWxHcm91cCkge1xuXHRcdC8vIFNob3cgYSBuZXcgZWRpdG9yIGZvciB0aGUgY2xvbmVkIGN1c3RvbSBncm91cFxuXHRcdHRoaXMuc2hvd0VkaXRvcihjdXN0b21Hcm91cCwgZ2xvYmFsR3JvdXApO1xuXHR9LFxuXG5cdG9uRWRpdG9yVXBsb2FkOiBmdW5jdGlvbigpIHtcblx0XHQvLyBDb25zdHJ1Y3QgdGhlIGNvbGxlY3Rpb24gb2YgYWxsIHVzZXJzIGluIHRoZSBjdXJyZW50IGdsb2JhbCBncm91cFxuXHRcdGNvbnN0IHVwbG9hZE1vZGFsID0gbmV3IFVwbG9hZE1vZGFsKCk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHVwbG9hZE1vZGFsLCBcImFjY2VwdFwiLCByZXN1bHQgPT4ge1xuXHRcdFx0dGhpcy5lZGl0b3IuZXhlY3V0ZUluc3RydWN0aW9ucyhyZXN1bHQuaW5zdHJ1Y3Rpb25zKTtcblx0XHRcdHRoaXMuc3RvcExpc3RlbmluZyh1cGxvYWRNb2RhbCk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHVwbG9hZE1vZGFsLCBcImNhbmNlbFwiLCAoKSA9PiB7XG5cdFx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcodXBsb2FkTW9kYWwpO1xuXHRcdH0pO1xuXG5cdFx0dXBsb2FkTW9kYWwuc2hvdygpO1xuXHR9LFxuXG5cdG9uRWRpdG9yRGVsZXRlOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBjb25maXJtYXRpb25Nb2RhbCA9IG5ldyBTbWFsbE1vZGFsKHtcblx0XHRcdHBlcnNpc3Q6IHRydWUsXG5cdFx0XHR3YXJuaW5nOiB0cnVlLFxuXHRcdFx0dGl0bGU6IFwiPHNwYW4gY2xhc3M9J2ZhbCBmYS1leGNsYW1hdGlvbi10cmlhbmdsZScvPiBEZWxldGUgQ3VzdG9tIEdyb3VwXCIsXG5cdFx0XHRib2R5OiBgPHA+WW91IGFyZSBhYm91dCB0byBkZWxldGUgdGhpcyBjdXN0b20gZ3JvdXAuPC9wPlxuXHRcdFx0XHQ8cD5BbGwgb2YgdGhlIGNvbnRlbnQgbGlua2VkIHRvIGl0LCBpbiBib3RoIGUtYm9va3MgYW5kICR7c2V0dGluZ3MubGVhcm5pbmdQYXRoc1BsdXJhbEN1c3RvbU5hbWV9LCB3aWxsIGRpc2FwcGVhciBhbmQgY2Fubm90IGJlIHJlY292ZXJlZC48L3A+XG5cdFx0XHRcdDxwPkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBjdXN0b20gZ3JvdXA/PC9wPmAsXG5cdFx0fSk7XG5cblx0XHRjb25maXJtYXRpb25Nb2RhbC5vbihcImJ1dHRvbjpva1wiLCAoKSA9PiB7XG5cdFx0XHR0aGlzLmVkaXRvci5kZWxldGVDdXN0b21Hcm91cCh7XG5cdFx0XHRcdHN1Y2Nlc3M6ICgpID0+IHtcblx0XHRcdFx0XHRjb25maXJtYXRpb25Nb2RhbC5kZXN0cm95KCk7XG5cdFx0XHRcdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwiZWRpdG9yOmRlbGV0ZVwiKTtcblx0XHRcdFx0XHR0aGlzLmNsb3NlKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGVycm9yOiAoKSA9PiBjb25zb2xlLmVycm9yKFwiZXJyb3IgZGVsZXRpbmcgY3VzdG9tIGdyb3VwXCIpLFxuXHRcdFx0fSk7XG5cdFx0fSwgdGhpcyk7XG5cblx0XHRjb25maXJtYXRpb25Nb2RhbC5zaG93KCk7XG5cdH0sXG5cblx0Y2xvc2U6IGZ1bmN0aW9uKCkge1xuXHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0ZSwgXCIvZ3JvdXBzL21hbmFnZUN1c3RvbVwiLCB7IHJlcGxhY2U6IHRydWUgfSk7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcodGhpcy5oZWFkZXIpO1xuXHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLmdsb2JhbEdyb3VwU2VsZWN0b3IpO1xuXHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLmN1c3RvbUdyb3VwU2VsZWN0b3IpO1xuXG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKHRoaXMuZXZlbnRCdXMpO1xuXHR9LFxufSk7Il19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\n\nvar settings = require(\"app-settings\");\n\nvar gradeMap = require(\"../../lib/gradeMap\");\nvar _ = require(\"lodash\");\n\nvar seenParents = {};\n\nmodule.exports = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"code\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/groups/custom\";\n\t},\n\n\tcomputeds: {\n\t\tgroupGrade: function groupGrade() {\n\t\t\treturn gradeMap.codeToHumanValue(this.get(\"grade\"), { lexical: true });\n\t\t},\n\n\t\tgroupYear: function groupYear() {\n\t\t\treturn this.get(\"year\").toString();\n\t\t},\n\n\t\tgroupChanged: function groupChanged() {\n\t\t\treturn this.get(\"updated\") || this.get(\"created\");\n\t\t},\n\n\t\tisTokenExpired: function isTokenExpired() {\n\t\t\tvar result = false;\n\n\t\t\tif (this.get(\"lifetime\")) {\n\t\t\t\tvar expirationDate = moment.unix(this.get(\"token_created\")).add(moment.duration(this.get(\"lifetime\").toString().replace(/\\\"/g, \"\")));\n\n\t\t\t\tresult = moment().isAfter(expirationDate);\n\t\t\t}\n\n\t\t\treturn !result;\n\t\t},\n\n\t\texpiration: function expiration() {\n\t\t\tif (!this.get(\"lifetime\")) return \"Never\";\n\n\t\t\treturn moment.unix(this.get(\"token_created\")).add(moment.duration(this.get(\"lifetime\").toString().replace(/\\\"/g, \"\")).asMilliseconds()).format(\"DD MMM YYYY, HH:mm\");\n\t\t},\n\t\tparentGroup: function parentGroup() {\n\t\t\tvar url = this.collection.url();\n\t\t\tif (_.includes(url, \"?textFilter=\")) return this.get(\"parent\");else if (_.includes(url, \"&textFilter=\")) return this.get(\"parent\");\n\n\t\t\tif (this.get(\"parent\") in seenParents) return \"\";\n\n\t\t\tseenParents[this.get(\"parent\")] = true;\n\t\t\treturn this.get(\"parent\");\n\t\t}\n\t},\n\n\tvalidate: function validate(attributes, options) {\n\t\tvar errors = {};\n\n\t\tif ((!options.validateAttributes || options.validateAttributes.name) && (!attributes.name || !attributes.name.trim())) errors.name = \"You must provide a name for the group\";\n\n\t\tif (Object.keys(errors).length > 0) return errors;\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImN1c3RvbUdyb3VwTW9kZWwuanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwibW9tZW50Iiwic2V0dGluZ3MiLCJncmFkZU1hcCIsIl8iLCJzZWVuUGFyZW50cyIsIm1vZHVsZSIsImV4cG9ydHMiLCJFcG94eSIsIk1vZGVsIiwiZXh0ZW5kIiwiaWRBdHRyaWJ1dGUiLCJ1cmxSb290IiwiY29tcHV0ZWRzIiwiZ3JvdXBHcmFkZSIsImNvZGVUb0h1bWFuVmFsdWUiLCJnZXQiLCJsZXhpY2FsIiwiZ3JvdXBZZWFyIiwidG9TdHJpbmciLCJncm91cENoYW5nZWQiLCJpc1Rva2VuRXhwaXJlZCIsInJlc3VsdCIsImV4cGlyYXRpb25EYXRlIiwidW5peCIsImFkZCIsImR1cmF0aW9uIiwicmVwbGFjZSIsImlzQWZ0ZXIiLCJleHBpcmF0aW9uIiwiYXNNaWxsaXNlY29uZHMiLCJmb3JtYXQiLCJwYXJlbnRHcm91cCIsInVybCIsImNvbGxlY3Rpb24iLCJpbmNsdWRlcyIsInZhbGlkYXRlIiwiYXR0cmlidXRlcyIsIm9wdGlvbnMiLCJlcnJvcnMiLCJ2YWxpZGF0ZUF0dHJpYnV0ZXMiLCJuYW1lIiwidHJpbSIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1DLFNBQVNELFFBQVEsUUFBUixDQUFmOztBQUVBLElBQU1FLFdBQVdGLFFBQVEsY0FBUixDQUFqQjs7QUFFQSxJQUFNRyxXQUFXSCxRQUFRLG9CQUFSLENBQWpCO0FBQ0EsSUFBTUksSUFBSUosUUFBUSxRQUFSLENBQVY7O0FBRUEsSUFBTUssY0FBYyxFQUFwQjs7QUFFQUMsT0FBT0MsT0FBUCxHQUFpQlIsU0FBU1MsS0FBVCxDQUFlQyxLQUFmLENBQXFCQyxNQUFyQixDQUE0QjtBQUM1Q0MsY0FBYSxNQUQrQjs7QUFHNUNDLFVBQVMsbUJBQVc7QUFDbkIsU0FBT1YsU0FBU1UsT0FBVCxH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bnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgbW9tZW50ID0gcmVxdWlyZShcIm1vbWVudFwiKTtcblxuY29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuXG5jb25zdCBncmFkZU1hcCA9IHJlcXVpcmUoXCIuLi8uLi9saWIvZ3JhZGVNYXBcIik7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcblxuY29uc3Qgc2VlblBhcmVudHMgPSB7fTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5FcG94eS5Nb2RlbC5leHRlbmQoe1xuXHRpZEF0dHJpYnV0ZTogXCJjb2RlXCIsXG5cblx0dXJsUm9vdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2dyb3Vwcy9jdXN0b21cIjtcblx0fSxcblxuXHRjb21wdXRlZHM6IHtcblx0XHRncm91cEdyYWRlOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBncmFkZU1hcC5jb2RlVG9IdW1hblZhbHVlKHRoaXMuZ2V0KFwiZ3JhZGVcIiksIHsgbGV4aWNhbDogdHJ1ZSB9KTtcblx0XHR9LFxuXG5cdFx0Z3JvdXBZZWFyOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLmdldChcInllYXJcIikudG9TdHJpbmcoKTtcblx0XHR9LFxuXG5cdFx0Z3JvdXBDaGFuZ2VkOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLmdldChcInVwZGF0ZWRcIikgfHwgdGhpcy5nZXQoXCJjcmVhdGVkXCIpO1xuXHRcdH0sXG5cblx0XHRpc1Rva2VuRXhwaXJlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRsZXQgcmVzdWx0ID0gZmFsc2U7XG5cblx0XHRcdGlmICh0aGlzLmdldChcImxpZmV0aW1lXCIpKSB7XG5cdFx0XHRcdGNvbnN0IGV4cGlyYXRpb25EYXRlID0gbW9tZW50LnVuaXgodGhpcy5nZXQoXCJ0b2tlbl9jcmVhdGVkXCIpKS5hZGQobW9tZW50LmR1cmF0aW9uKHRoaXMuZ2V0KFwibGlmZXRpbWVcIikudG9TdHJpbmcoKS5yZXBsYWNlKC9cXFwiL2csIFwiXCIpKSk7XG5cblx0XHRcdFx0cmVzdWx0ID0gbW9tZW50KCkuaXNBZnRlcihleHBpcmF0aW9uRGF0ZSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiAhcmVzdWx0O1xuXHRcdH0sXG5cblx0XHRleHBpcmF0aW9uOiBmdW5jdGlvbigpIHtcblx0XHRcdGlmICghdGhpcy5nZXQoXCJsaWZldGltZVwiKSlcblx0XHRcdFx0cmV0dXJuIFwiTmV2ZXJcIjtcblxuXHRcdFx0cmV0dXJuIG1vbWVudC51bml4KHRoaXMuZ2V0KFwidG9rZW5fY3JlYXRlZFwiKSkuYWRkKG1vbWVudC5kdXJhdGlvbih0aGlzLmdldChcImxpZmV0aW1lXCIpLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxcIi9nLCBcIlwiKSkuYXNNaWxsaXNlY29uZHMoKSkuZm9ybWF0KFwiREQgTU1NIFlZWVksIEhIOm1tXCIpO1xuXHRcdH0sXG5cdFx0cGFyZW50R3JvdXA6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29uc3QgdXJsID0gdGhpcy5jb2xsZWN0aW9uLnVybCgpO1xuXHRcdFx0aWYgKF8uaW5jbHVkZXModXJsLCBcIj90ZXh0RmlsdGVyPVwiKSlcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0KFwicGFyZW50XCIpO1xuXHRcdFx0ZWxzZSBpZiAoXy5pbmNsdWRlcyh1cmwsIFwiJnRleHRGaWx0ZXI9XCIpKVxuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXQoXCJwYXJlbnRcIik7XG5cblx0XHRcdGlmICh0aGlzLmdldChcInBhcmVudFwiKSBpbiBzZWVuUGFyZW50cylcblx0XHRcdFx0cmV0dXJuIFwiXCI7XG5cblx0XHRcdHNlZW5QYXJlbnRzW3RoaXMuZ2V0KFwicGFyZW50XCIpXSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXQoXCJwYXJlbnRcIik7XG5cdFx0fSxcblx0fSxcblxuXHR2YWxpZGF0ZTogZnVuY3Rpb24oYXR0cmlidXRlcywgb3B0aW9ucykge1xuXHRcdGNvbnN0IGVycm9ycyA9IHt9O1xuXG5cdFx0aWYgKCghb3B0aW9ucy52YWxpZGF0ZUF0dHJpYnV0ZXMgfHwgb3B0aW9ucy52YWxpZGF0ZUF0dHJpYnV0ZXMubmFtZSkgJiYgKCFhdHRyaWJ1dGVzLm5hbWUgfHwgIWF0dHJpYnV0ZXMubmFtZS50cmltKCkpKVxuXHRcdFx0ZXJyb3JzLm5hbWUgPSBcIllvdSBtdXN0IHByb3ZpZGUgYSBuYW1lIGZvciB0aGUgZ3JvdXBcIjtcblxuXHRcdGlmIChPYmplY3Qua2V5cyhlcnJvcnMpLmxlbmd0aCA+IDApXG5cdFx0XHRyZXR1cm4gZXJyb3JzO1xuXHR9LFxufSk7Il19",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\n// eslint-disable-next-line node/no-extraneous-require\nvar Papa = require(\"papaparse\");\n\nvar CardModal = require(\"../../lib/cardModal\");\nvar GridBack = require(\"../../lib/gridBack\");\nvar StatusView = require(\"../../lib/statusView\");\n\n// ----------------------------------------------------------------------------\n// Step 1: Choose a CSV file to upload\n// ----------------------------------------------------------------------------\nvar FileChooserCard = Backbone.Marionette.View.extend({\n\tclassName: \"card custom-group-upload-card file-chooser-card\",\n\n\ttemplate: require(\"../templates/customGroupUploadModal.nunj\").fileChooserCard,\n\n\tui: {\n\t\tfileInput: \"#custom-group-file\"\n\t},\n\n\tevents: {\n\t\t\"change @ui.fileInput\": \"onFileInputChange\"\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.trigger(\"card:first\");\n\t},\n\n\tonFileInputChange: function onFileInputChange() {\n\t\tthis.trigger(\"file-chooser-card:file\", this.ui.fileInput.get(0).files[0]);\n\t}\n});\n\n// ----------------------------------------------------------------------------\n// Step 2: Verify the contents of the file to upload\n// ----------------------------------------------------------------------------\nvar FileVerificationSuccessView = Backbone.Marionette.View.extend({\n\tclassName: \"file-verification-success-view\",\n\n\ttemplate: require(\"../templates/customGroupUploadModal.nunj\").fileVerificationSuccess,\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tuserAdditions: this.userAdditions,\n\t\t\tuserRemovals: this.userRemovals\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tvar _this = this;\n\n\t\tthis.userAdditions = 0;\n\t\tthis.userRemovals = 0;\n\n\t\toptions.collection.each(function (instruction) {\n\t\t\tif (instruction.get(\"operation\") === \"add\") _this.userAdditions++;else if (instruction.get(\"operation\") === \"del\") _this.userRemovals++;\n\t\t});\n\t}\n});\n\nvar FileVerificationErrorView = Backbone.Marionette.View.extend({\n\tclassName: \"file-verification-error-view\",\n\n\ttemplate: require(\"../templates/customGroupUploadModal.nunj\").fileVerificationError,\n\n\tregions: {\n\t\tgrid: \".grid-region\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{\n\t\t\tname: \"\",\n\t\t\taccessor: function accessor(name, model) {\n\t\t\t\tvar result = \"-\";\n\n\t\t\t\tif (model.has(\"row\")) result = model.get(\"row\");\n\n\t\t\t\treturn \"<span>\" + result + \"</span>\";\n\t\t\t},\n\t\t\ttitle: \"CSV Row\",\n\t\t\talign: \"left\",\n\t\t\thighlight: \"row\"\n\t\t}, {\n\t\t\tname: \"description\",\n\t\t\ttitle: \"Error Description\",\n\t\t\talign: \"left\",\n\t\t\thighlight: \"row\"\n\t\t}];\n\n\t\tthis.grid = new GridBack({\n\t\t\tborderless: true,\n\t\t\tcollection: this.options.collection,\n\t\t\tcolumns: columns,\n\t\t\tcounterDisabled: true,\n\t\t\tfilterDisabled: true,\n\t\t\tnavigatorDisabled: true,\n\t\t\tpagingDisabled: true\n\t\t});\n\n\t\tthis.showChildView(\"grid\", this.grid);\n\t}\n});\n\nvar FileVerificationCard = Backbone.Marionette.View.extend({\n\tclassName: \"card custom-group-upload-card file-verification-card\",\n\n\ttemplate: require(\"../templates/customGroupUploadModal.nunj\").fileVerificationCard,\n\n\tregions: {\n\t\tbody: \".card-body\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\t},\n\n\tonRender: function onRender() {\n\t\t// Display a spinner and start parsing the file\n\t\tthis.showChildView(\"body\", new StatusView({\n\t\t\tmessage: \"Processing CSV file...\",\n\t\t\ttype: \"loading\"\n\t\t}));\n\n\t\tthis.trigger(\"card:busy\");\n\n\t\tthis.parseCSVFile();\n\t},\n\n\tparseCSVFile: function parseCSVFile() {\n\t\tvar _this2 = this;\n\n\t\t// Field Specification\n\t\t// operation: add/remove\n\t\t// username: Optional if firstname and surname are supplied.\n\t\t// surname: Optional if username is supplied.\n\t\t// firstname: Optional if username is supplied.\n\n\t\tvar users = [];\n\t\tvar errors = [];\n\n\t\tvar currentRow = 2; // 1-indexed; skip header\n\n\t\tPapa.parse(this.options.file, {\n\t\t\tskipEmptyLines: true,\n\t\t\tcomplete: function complete(output) {\n\t\t\t\tvar csv = \"\";\n\n\t\t\t\tif (output.data.length > 0) {\n\t\t\t\t\tvar rows = null;\n\n\t\t\t\t\t// Check for the special separator specifier in the first row and omit it\n\t\t\t\t\tif (_.startsWith(output.data[0][0], \"sep=\")) rows = _.slice(output.data, 1);else rows = output.data;\n\n\t\t\t\t\tcsv = Papa.unparse(rows, {\n\t\t\t\t\t\tquotes: false,\n\t\t\t\t\t\tdelimiter: \"\\t\",\n\t\t\t\t\t\tnewline: \"\\n\"\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tPapa.parse(csv, {\n\t\t\t\t\theader: true,\n\t\t\t\t\tskipEmptyLines: true,\n\t\t\t\t\tstep: function step(results) {\n\t\t\t\t\t\tvar instruction = {\n\t\t\t\t\t\t\toperation: results.data[0].operation ? results.data[0].operation.length === 0 ? undefined : results.data[0].operation : undefined,\n\t\t\t\t\t\t\tusername: results.data[0].username ? results.data[0].username.length === 0 ? undefined : results.data[0].username : undefined,\n\t\t\t\t\t\t\temail: results.data[0].email ? results.data[0].email.length === 0 ? undefined : results.data[0].email : undefined\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tvar rowErrors = [];\n\n\t\t\t\t\t\tif (!instruction.operation || instruction.operation !== \"add\" && instruction.operation !== \"remove\") {\n\t\t\t\t\t\t\trowErrors.push(new Backbone.Model({\n\t\t\t\t\t\t\t\trow: currentRow,\n\t\t\t\t\t\t\t\tdescription: \"Invalid or missing operation\"\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!instruction.username && !instruction.email) {\n\t\t\t\t\t\t\trowErrors.push(new Backbone.Model({\n\t\t\t\t\t\t\t\trow: currentRow,\n\t\t\t\t\t\t\t\tdescription: \"Either a username or an email is required.\"\n\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (rowErrors.length) errors = errors.concat(rowErrors);else users.push(new Backbone.Model(instruction));\n\n\t\t\t\t\t\tcurrentRow++;\n\t\t\t\t\t},\n\t\t\t\t\terror: function error(_error) {\n\t\t\t\t\t\terrors.push(new Backbone.Model({\n\t\t\t\t\t\t\tdescription: _error\n\t\t\t\t\t\t}));\n\t\t\t\t\t},\n\t\t\t\t\tcomplete: function complete() {\n\t\t\t\t\t\t_this2.trigger(\"card:ready\");\n\n\t\t\t\t\t\tif (errors.length) {\n\t\t\t\t\t\t\t// Display the error view\n\t\t\t\t\t\t\t_this2.showChildView(\"body\", new FileVerificationErrorView({\n\t\t\t\t\t\t\t\tcollection: new Backbone.Collection(errors)\n\t\t\t\t\t\t\t}));\n\n\t\t\t\t\t\t\t_this2.trigger(\"card:last\", { error: true });\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t_this2.users = new Backbone.Collection(users);\n\n\t\t\t\t\t\t\t// Display the success view\n\t\t\t\t\t\t\t_this2.showChildView(\"body\", new FileVerificationSuccessView({\n\t\t\t\t\t\t\t\tcollection: _this2.users\n\t\t\t\t\t\t\t}));\n\n\t\t\t\t\t\t\t_this2.trigger(\"file-verification-card:instructions\", _this2.users);\n\t\t\t\t\t\t\t_this2.trigger(\"card:last\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n});\n\n// ----------------------------------------------------------------------------\n// Card Modal Controller\n// ----------------------------------------------------------------------------\nmodule.exports = CardModal.extend({\n\tcardEvents: function cardEvents() {\n\t\treturn {\n\t\t\t\"card:begin\": this.onBegin.bind(this),\n\t\t\t\"card:previous\": this.onPreviousCard.bind(this),\n\t\t\t\"card:next\": this.onNextCard.bind(this),\n\t\t\t\"card:before-destroy\": this.onBeforeDestroyCard.bind(this),\n\t\t\t\"card:accept\": this.onAccept.bind(this),\n\t\t\t\"card:cancel\": this.onCancel.bind(this)\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tCardModal.prototype.initialize.call(this);\n\n\t\tthis.users = options.users;\n\n\t\tthis.state = {};\n\n\t\tthis.on(this.cardEvents());\n\t},\n\n\tshowFileChooserCard: function showFileChooserCard(showFunction) {\n\t\tthis.fileChooserCard = new FileChooserCard();\n\n\t\tthis.listenTo(this.fileChooserCard, \"file-chooser-card:file\", this.onFileChosen.bind(this));\n\n\t\tshowFunction(this.fileChooserCard);\n\n\t\tthis.state.currentStep = 1;\n\t},\n\tshowFileVerificationCard: function showFileVerificationCard(showFunction) {\n\t\tthis.fileVerificationCard = new FileVerificationCard({\n\t\t\tfile: this.state.file,\n\t\t\tusers: this.users\n\t\t});\n\n\t\tthis.listenTo(this.fileVerificationCard, \"file-verification-card:instructions\", this.onInstructionsGenerated.bind(this));\n\n\t\tshowFunction(this.fileVerificationCard);\n\n\t\tthis.state.currentStep = 2;\n\t},\n\n\n\tonBegin: function onBegin() {\n\t\tthis.showFileChooserCard(this.showNextCard.bind(this));\n\t},\n\n\tonPreviousCard: function onPreviousCard() {\n\t\tswitch (this.state.currentStep) {\n\t\t\tcase 2:\n\t\t\t\tthis.showFileChooserCard(this.showPreviousCard.bind(this));\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.error(\"Invalid custom group upload card step.\");\n\t\t}\n\t},\n\n\tonNextCard: function onNextCard() {\n\t\tswitch (this.state.currentStep) {\n\t\t\tcase 1:\n\t\t\t\tthis.showFileVerificationCard(this.showNextCard.bind(this));\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.error(\"Invalid custom group upload card step.\");\n\t\t}\n\t},\n\n\tonBeforeDestroyCard: function onBeforeDestroyCard(cardView) {\n\t\tthis.stopListening(cardView);\n\t},\n\n\tonAccept: function onAccept() {\n\t\tthis.trigger(\"accept\", { instructions: this.state.instructions });\n\n\t\tthis.destroy();\n\t},\n\n\tonCancel: function onCancel() {\n\t\tthis.trigger(\"cancel\");\n\n\t\tthis.destroy();\n\t},\n\n\tonFileChosen: function onFileChosen(file) {\n\t\tthis.state.file = file;\n\n\t\tthis.enableNavigatorNext();\n\t},\n\n\tonInstructionsGenerated: function onInstructionsGenerated(instructions) {\n\t\tthis.state.instructions = instructions;\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(this.fileChooserCard);\n\n\t\tthis.off(this.cardEvents());\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImN1c3RvbUdyb3VwVXBsb2FkTW9kYWwuanMiXSwibmFtZXMiOlsiXyIsInJlcXVpcmUiLCJCYWNrYm9uZSIsIlBhcGEiLCJDYXJkTW9kYWwiLCJHcmlkQmFjayIsIlN0YXR1c1ZpZXciLCJGaWxlQ2hvb3NlckNhcmQiLCJNYXJpb25ldHRlIiwiVmlldyIsImV4dGVuZCIsImNsYXNzTmFtZSIsInRlbXBsYXRlIiwiZmlsZUNob29zZXJDYXJkIiwidWkiLCJmaWxlSW5wdXQiLCJldmVudHMiLCJvblJlbmRlciIsInRyaWdnZXIiLCJvbkZpbGVJbnB1dENoYW5nZSIsImdldCIsImZpbGVzIiwiRmlsZVZlcmlmaWNhdGlvblN1Y2Nlc3NWaWV3IiwiZmlsZVZlcmlmaWNhdGlvblN1Y2Nlc3MiLCJ0ZW1wbGF0ZUNvbnRleHQiLCJ1c2VyQWRkaXRpb25zIiwidXNlclJlbW92YWxzIiwiaW5pdGlhbGl6ZSIsIm9wdGlvbnMiLCJjb2xsZWN0aW9uIiwiZWFjaCIsImluc3RydWN0aW9uIiwiRmlsZVZlcmlmaWNhdGlvbkVycm9yVmlldyIsImZpbGVWZXJpZmljYXRpb25FcnJvciIsInJlZ2lvbnMiLCJncmlkIiwiY29sdW1ucyIsIm5hbWUiLCJhY2Nlc3NvciIsIm1vZGVsIiwicmVzdWx0IiwiaGFzIiwidGl0bGUiLCJhbGlnbiIsImhpZ2hsaWdodCIsImJvcmRlcmxlc3MiLCJjb3VudGVyRGlzYWJsZWQiLCJmaWx0ZXJEaXNhYmxlZCIsIm5hdmlnYXRvckRpc2FibGVkIiwicGFnaW5nRGlzYWJsZWQiLCJzaG93Q2hpbGRWaWV3IiwiRmlsZVZlcmlmaWNhdGlvbkNhcmQiLCJmaWxlVmVyaWZpY2F0aW9uQ2FyZCIsImJvZHkiLCJtZXNzYWdlIiwidHlwZSIsInBhcnNlQ1NWRmlsZSIsInVzZXJzIiwiZXJyb3JzIiwiY3VycmVudFJvdyIsInBhcnNlIiwiZmlsZSIsInNraXBFbXB0eUxpbmVzIiwiY29tcGxldGUiLCJjc3YiLCJvdXRwdXQiLCJkYXRhIiwibGVuZ3RoIiwicm93cyIsInN0YXJ0c1dpdGgiLCJzbGljZSIsInVucGFyc2UiLCJxdW90ZXMiLCJkZWxpbWl0ZXIiLCJuZXdsaW5lIiwiaGVhZGVyIiwic3RlcCIsIm9wZXJhdGlvbiIsInJlc3VsdHMiLCJ1bmRlZmluZWQiLCJ1c2VybmFtZSIsImVtYWlsIiwicm93RXJyb3JzIiwicHVzaCIsIk1vZGVsIiwicm93IiwiZGVzY3JpcHRpb24iLCJjb25jYXQiLCJlcnJvciIsIkNvbGxlY3Rpb24iLCJtb2R1bGUiLCJleHBvcnRzIiwiY2FyZEV2ZW50cyIsIm9uQmVnaW4iLCJiaW5kIiwib25QcmV2aW91c0NhcmQiLCJvbk5leHRDYXJkIiwib25CZWZvcmVEZXN0cm95Q2FyZCIsIm9uQWNjZXB0Iiwib25DYW5jZWwiLCJwcm90b3R5cGUiLCJjYWxsIiwic3RhdGUiLCJvbiIsInNob3dGaWxlQ2hvb3NlckNhcmQiLCJzaG93RnVuY3Rpb24iLCJsaXN0ZW5UbyIsIm9uRmlsZUNob3NlbiIsImN1cnJlbnRTdGVwIiwic2hvd0ZpbGVWZXJpZmljYXRpb25DYXJkIiwib25JbnN0cnVjdGlvbnNHZW5lcmF0ZWQiLCJzaG93TmV4dENhcmQiLCJzaG93UHJldmlvdXNDYXJkIiwiY29uc29sZSIsImNhcmRWaWV3Iiwic3RvcExpc3RlbmluZyIsImluc3RydWN0aW9ucyIsImRlc3Ryb3kiLCJlbmFibGVOYXZpZ2F0b3JOZXh0Iiwib25CZWZvcmVEZXN0cm95Iiwib2ZmIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLFdBQVdELFFBQVEsVUFBUixDQUFqQjtBQUNBO0FBQ0EsSUFBTUUsT0FBT0YsUUFBUSxXQUFSLENBQWI7O0FBRUEsSUFBTUcsWUFBWUgsUUFBUSxxQkFBUixDQUFsQjtBQUNBLElBQU1JLFdBQVdKLFFBQVEsb0JBQVIsQ0FBakI7QUFDQSxJQUFNSyxhQUFhTCxRQUFRLHNCQUFSLENBQW5COztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQU1NLGtCQUFrQkws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TCxDQUFrQmpCLElBQWxCLENBQXVCLElBQXZCLENBQTlCO0FBQ0E7O0FBRUQ7QUFDQ21CLFlBQVF6QixLQUFSLENBQWMsd0NBQWQ7QUFORjtBQVFBLEVBckVnQzs7QUF1RWpDUyxzQkFBcUIsNkJBQVNpQixRQUFULEVBQW1CO0FBQ3ZDLE9BQUtDLGFBQUwsQ0FBbUJELFFBQW5CO0FBQ0EsRUF6RWdDOztBQTJFakNoQixXQUFVLG9CQUFXO0FBQ3BCLE9BQUtoRixPQUFMLENBQWEsUUFBYixFQUF1QixFQUFFa0csY0FBYyxLQUFLZCxLQUFMLENBQVdjLFlBQTNCLEVBQXZCOztBQUVBLE9BQUtDLE9BQUw7QUFDQSxFQS9FZ0M7O0FBaUZqQ2xCLFdBQVUsb0JBQVc7QUFDcEIsT0FBS2pGLE9BQUwsQ0FBYSxRQUFiOztBQUVBLE9BQUttRyxPQUFMO0FBQ0EsRUFyRmdDOztBQXVGakNWLGVBQWMsc0JBQVM5QyxJQUFULEVBQWU7QUFDNUIsT0FBS3lDLEtBQUwsQ0FBV3pDLElBQVgsR0FBa0JBLElBQWxCOztBQUVBLE9BQUt5RCxtQkFBTDtBQUNBLEVBM0ZnQzs7QUE2RmpDUiwwQkFBeUIsaUNBQVNNLFlBQVQsRUFBdUI7QUFDL0MsT0FBS2QsS0FBTCxDQUFXYyxZQUFYLEdBQTBCQSxZQUExQjtBQUNBLEVBL0ZnQzs7QUFpR2pDRyxrQkFBaUIsMkJBQVc7QUFDM0IsT0FBS0osYUFBTCxDQUFtQixLQUFLdEcsZUFBeEI7O0FBRUEsT0FBSzJHLEdBQUwsQ0FBUyxLQUFLNUIsVUFBTCxFQUFUO0FBQ0E7QUFyR2dDLENBQWpCLENBQWpCIiwiZmlsZSI6ImN1c3RvbUdyb3VwVXBsb2FkTW9kYWwuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm9kZS9uby1leHRyYW5lb3VzLXJlcXVpcmVcbmNvbnN0IFBhcGEgPSByZXF1aXJlKFwicGFwYXBhcnNlXCIpO1xuXG5jb25zdCBDYXJkTW9kYWwgPSByZXF1aXJlKFwiLi4vLi4vbGliL2NhcmRNb2RhbFwiKTtcbmNvbnN0IEdyaWRCYWNrID0gcmVxdWlyZShcIi4uLy4uL2xpYi9ncmlkQmFja1wiKTtcbmNvbnN0IFN0YXR1c1ZpZXcgPSByZXF1aXJlKFwiLi4vLi4vbGliL3N0YXR1c1ZpZXdcIik7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFN0ZXAgMTogQ2hvb3NlIGEgQ1NWIGZpbGUgdG8gdXBsb2FkXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5jb25zdCBGaWxlQ2hvb3NlckNhcmQgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImNhcmQgY3VzdG9tLWdyb3VwLXVwbG9hZC1jYXJkIGZpbGUtY2hvb3Nlci1jYXJkXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvY3VzdG9tR3JvdXBVcGxvYWRNb2RhbC5udW5qXCIpLmZpbGVDaG9vc2VyQ2FyZCxcblxuXHR1aToge1xuXHRcdGZpbGVJbnB1dDogXCIjY3VzdG9tLWdyb3VwLWZpbGVcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNoYW5nZSBAdWkuZmlsZUlucHV0XCI6IFwib25GaWxlSW5wdXRDaGFuZ2VcIixcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy50cmlnZ2VyKFwiY2FyZDpmaXJzdFwiKTtcblx0fSxcblxuXHRvbkZpbGVJbnB1dENoYW5nZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy50cmlnZ2VyKFwiZmlsZS1jaG9vc2VyLWNhcmQ6ZmlsZVwiLCB0aGlzLnVpLmZpbGVJbnB1dC5nZXQoMCkuZmlsZXNbMF0pO1xuXHR9LFxufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFN0ZXAgMjogVmVyaWZ5IHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSB0byB1cGxvYWRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmNvbnN0IEZpbGVWZXJpZmljYXRpb25TdWNjZXNzVmlldyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZmlsZS12ZXJpZmljYXRpb24tc3VjY2Vzcy12aWV3XCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvY3VzdG9tR3JvdXBVcGxvYWRNb2RhbC5udW5qXCIpLmZpbGVWZXJpZmljYXRpb25TdWNjZXNzLFxuXG5cdHRlbXBsYXRlQ29udGV4dDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHVzZXJBZGRpdGlvbnM6IHRoaXMudXNlckFkZGl0aW9ucyxcblx0XHRcdHVzZXJSZW1vdmFsczogdGhpcy51c2VyUmVtb3ZhbHMsXG5cdFx0fTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy51c2VyQWRkaXRpb25zID0gMDtcblx0XHR0aGlzLnVzZXJSZW1vdmFscyA9IDA7XG5cblx0XHRvcHRpb25zLmNvbGxlY3Rpb24uZWFjaChpbnN0cnVjdGlvbiA9PiB7XG5cdFx0XHRpZiAoaW5zdHJ1Y3Rpb24uZ2V0KFwib3BlcmF0aW9uXCIpID09PSBcImFkZFwiKVxuXHRcdFx0XHR0aGlzLnVzZXJBZGRpdGlvbnMrKztcblx0XHRcdGVsc2UgaWYgKGluc3RydWN0aW9uLmdldChcIm9wZXJhdGlvblwiKSA9PT0gXCJkZWxcIilcblx0XHRcdFx0dGhpcy51c2VyUmVtb3ZhbHMrKztcblx0XHR9KTtcblx0fSxcbn0pO1xuXG5jb25zdCBGaWxlVmVyaWZpY2F0aW9uRXJyb3JWaWV3ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJmaWxlLXZlcmlmaWNhdGlvbi1lcnJvci12aWV3XCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvY3VzdG9tR3JvdXBVcGxvYWRNb2RhbC5udW5qXCIpLmZpbGVWZXJpZmljYXRpb25FcnJvcixcblxuXHRyZWdpb25zOiB7XG5cdFx0Z3JpZDogXCIuZ3JpZC1yZWdpb25cIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucztcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgY29sdW1ucyA9IFtcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCJcIixcblx0XHRcdFx0YWNjZXNzb3I6IChuYW1lLCBtb2RlbCkgPT4ge1xuXHRcdFx0XHRcdGxldCByZXN1bHQgPSBcIi1cIjtcblxuXHRcdFx0XHRcdGlmIChtb2RlbC5oYXMoXCJyb3dcIikpXG5cdFx0XHRcdFx0XHRyZXN1bHQgPSBtb2RlbC5nZXQoXCJyb3dcIik7XG5cblx0XHRcdFx0XHRyZXR1cm4gXCI8c3Bhbj5cIiArIHJlc3VsdCArIFwiPC9zcGFuPlwiO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aXRsZTogXCJDU1YgUm93XCIsXG5cdFx0XHRcdGFsaWduOiBcImxlZnRcIixcblx0XHRcdFx0aGlnaGxpZ2h0OiBcInJvd1wiLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0bmFtZTogXCJkZXNjcmlwdGlvblwiLFxuXHRcdFx0XHR0aXRsZTogXCJFcnJvciBEZXNjcmlwdGlvblwiLFxuXHRcdFx0XHRhbGlnbjogXCJsZWZ0XCIsXG5cdFx0XHRcdGhpZ2hsaWdodDogXCJyb3dcIixcblx0XHRcdH0sXG5cdFx0XTtcblxuXHRcdHRoaXMuZ3JpZCA9IG5ldyBHcmlkQmFjayh7XG5cdFx0XHRib3JkZXJsZXNzOiB0cnVlLFxuXHRcdFx0Y29sbGVjdGlvbjogdGhpcy5vcHRpb25zLmNvbGxlY3Rpb24sXG5cdFx0XHRjb2x1bW5zOiBjb2x1bW5zLFxuXHRcdFx0Y291bnRlckRpc2FibGVkOiB0cnVlLFxuXHRcdFx0ZmlsdGVyRGlzYWJsZWQ6IHRydWUsXG5cdFx0XHRuYXZpZ2F0b3JEaXNhYmxlZDogdHJ1ZSxcblx0XHRcdHBhZ2luZ0Rpc2FibGVkOiB0cnVlLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiZ3JpZFwiLCB0aGlzLmdyaWQpO1xuXHR9LFxufSk7XG5cbmNvbnN0IEZpbGVWZXJpZmljYXRpb25DYXJkID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJjYXJkIGN1c3RvbS1ncm91cC11cGxvYWQtY2FyZCBmaWxlLXZlcmlmaWNhdGlvbi1jYXJkXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvY3VzdG9tR3JvdXBVcGxvYWRNb2RhbC5udW5qXCIpLmZpbGVWZXJpZmljYXRpb25DYXJkLFxuXG5cdHJlZ2lvbnM6IHtcblx0XHRib2R5OiBcIi5jYXJkLWJvZHlcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucztcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gRGlzcGxheSBhIHNwaW5uZXIgYW5kIHN0YXJ0IHBhcnNpbmcgdGhlIGZpbGVcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJib2R5XCIsIG5ldyBTdGF0dXNWaWV3KHtcblx0XHRcdG1lc3NhZ2U6IFwiUHJvY2Vzc2luZyBDU1YgZmlsZS4uLlwiLFxuXHRcdFx0dHlwZTogXCJsb2FkaW5nXCIsXG5cdFx0fSkpO1xuXG5cdFx0dGhpcy50cmlnZ2VyKFwiY2FyZDpidXN5XCIpO1xuXG5cdFx0dGhpcy5wYXJzZUNTVkZpbGUoKTtcblx0fSxcblxuXHRwYXJzZUNTVkZpbGU6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIEZpZWxkIFNwZWNpZmljYXRpb25cblx0XHQvLyBvcGVyYXRpb246IGFkZC9yZW1vdmVcblx0XHQvLyB1c2VybmFtZTogT3B0aW9uYWwgaWYgZmlyc3RuYW1lIGFuZCBzdXJuYW1lIGFyZSBzdXBwbGllZC5cblx0XHQvLyBzdXJuYW1lOiBPcHRpb25hbCBpZiB1c2VybmFtZSBpcyBzdXBwbGllZC5cblx0XHQvLyBmaXJzdG5hbWU6IE9wdGlvbmFsIGlmIHVzZXJuYW1lIGlzIHN1cHBsaWVkLlxuXG5cdFx0Y29uc3QgdXNlcnMgPSBbXTtcblx0XHRsZXQgZXJyb3JzID0gW107XG5cblx0XHRsZXQgY3VycmVudFJvdyA9IDI7IC8vIDEtaW5kZXhlZDsgc2tpcCBoZWFkZXJcblxuXHRcdFBhcGEucGFyc2UodGhpcy5vcHRpb25zLmZpbGUsIHtcblx0XHRcdHNraXBFbXB0eUxpbmVzOiB0cnVlLFxuXHRcdFx0Y29tcGxldGU6IG91dHB1dCA9PiB7XG5cdFx0XHRcdGxldCBjc3YgPSBcIlwiO1xuXG5cdFx0XHRcdGlmIChvdXRwdXQuZGF0YS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0bGV0IHJvd3MgPSBudWxsO1xuXG5cdFx0XHRcdFx0Ly8gQ2hlY2sgZm9yIHRoZSBzcGVjaWFsIHNlcGFyYXRvciBzcGVjaWZpZXIgaW4gdGhlIGZpcnN0IHJvdyBhbmQgb21pdCBpdFxuXHRcdFx0XHRcdGlmIChfLnN0YXJ0c1dpdGgob3V0cHV0LmRhdGFbMF1bMF0sIFwic2VwPVwiKSlcblx0XHRcdFx0XHRcdHJvd3MgPSBfLnNsaWNlKG91dHB1dC5kYXRhLCAxKTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRyb3dzID0gb3V0cHV0LmRhdGE7XG5cblx0XHRcdFx0XHRjc3YgPSBQYXBhLnVucGFyc2Uocm93cywge1xuXHRcdFx0XHRcdFx0cXVvdGVzOiBmYWxzZSxcblx0XHRcdFx0XHRcdGRlbGltaXRlcjogXCJcXHRcIixcblx0XHRcdFx0XHRcdG5ld2xpbmU6IFwiXFxuXCIsXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRQYXBhLnBhcnNlKGNzdiwge1xuXHRcdFx0XHRcdGhlYWRlcjogdHJ1ZSxcblx0XHRcdFx0XHRza2lwRW1wdHlMaW5lczogdHJ1ZSxcblx0XHRcdFx0XHRzdGVwOiByZXN1bHRzID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGluc3RydWN0aW9uID0ge1xuXHRcdFx0XHRcdFx0XHRvcGVyYXRpb246IHJlc3VsdHMuZGF0YVswXS5vcGVyYXRpb24gPyByZXN1bHRzLmRhdGFbMF0ub3BlcmF0aW9uLmxlbmd0aCA9PT0gMCA/IHVuZGVmaW5lZCA6IHJlc3VsdHMuZGF0YVswXS5vcGVyYXRpb24gOiB1bmRlZmluZWQsXG5cdFx0XHRcdFx0XHRcdHVzZXJuYW1lOiByZXN1bHRzLmRhdGFbMF0udXNlcm5hbWUgPyByZXN1bHRzLmRhdGFbMF0udXNlcm5hbWUubGVuZ3RoID09PSAwID8gdW5kZWZpbmVkIDogcmVzdWx0cy5kYXRhWzBdLnVzZXJuYW1lIDogdW5kZWZpbmVkLFxuXHRcdFx0XHRcdFx0XHRlbWFpbDogcmVzdWx0cy5kYXRhWzBdLmVtYWlsID8gcmVzdWx0cy5kYXRhWzBdLmVtYWlsLmxlbmd0aCA9PT0gMCA/IHVuZGVmaW5lZCA6IHJlc3VsdHMuZGF0YVswXS5lbWFpbCA6IHVuZGVmaW5lZCxcblx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdGNvbnN0IHJvd0Vycm9ycyA9IFtdO1xuXG5cdFx0XHRcdFx0XHRpZiAoIWluc3RydWN0aW9uLm9wZXJhdGlvbiB8fCBpbnN0cnVjdGlvbi5vcGVyYXRpb24gIT09IFwiYWRkXCIgJiYgaW5zdHJ1Y3Rpb24ub3BlcmF0aW9uICE9PSBcInJlbW92ZVwiKSB7XG5cdFx0XHRcdFx0XHRcdHJvd0Vycm9ycy5wdXNoKG5ldyBCYWNrYm9uZS5Nb2RlbCh7XG5cdFx0XHRcdFx0XHRcdFx0cm93OiBjdXJyZW50Um93LFxuXHRcdFx0XHRcdFx0XHRcdGRlc2NyaXB0aW9uOiBcIkludmFsaWQgb3IgbWlzc2luZyBvcGVyYXRpb25cIixcblx0XHRcdFx0XHRcdFx0fSkpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoIWluc3RydWN0aW9uLnVzZXJuYW1lICYmICFpbnN0cnVjdGlvbi5lbWFpbCkge1xuXHRcdFx0XHRcdFx0XHRyb3dFcnJvcnMucHVzaChuZXcgQmFja2JvbmUuTW9kZWwoe1xuXHRcdFx0XHRcdFx0XHRcdHJvdzogY3VycmVudFJvdyxcblx0XHRcdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogXCJFaXRoZXIgYSB1c2VybmFtZSBvciBhbiBlbWFpbCBpcyByZXF1aXJlZC5cIixcblx0XHRcdFx0XHRcdFx0fSkpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAocm93RXJyb3JzLmxlbmd0aClcblx0XHRcdFx0XHRcdFx0ZXJyb3JzID0gZXJyb3JzLmNvbmNhdChyb3dFcnJvcnMpO1xuXHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHR1c2Vycy5wdXNoKG5ldyBCYWNrYm9uZS5Nb2RlbChpbnN0cnVjdGlvbikpO1xuXG5cdFx0XHRcdFx0XHRjdXJyZW50Um93Kys7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRlcnJvcjogZXJyb3IgPT4ge1xuXHRcdFx0XHRcdFx0ZXJyb3JzLnB1c2gobmV3IEJhY2tib25lLk1vZGVsKHtcblx0XHRcdFx0XHRcdFx0ZGVzY3JpcHRpb246IGVycm9yLFxuXHRcdFx0XHRcdFx0fSkpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0Y29tcGxldGU6ICgpID0+IHtcblx0XHRcdFx0XHRcdHRoaXMudHJpZ2dlcihcImNhcmQ6cmVhZHlcIik7XG5cblx0XHRcdFx0XHRcdGlmIChlcnJvcnMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdC8vIERpc3BsYXkgdGhlIGVycm9yIHZpZXdcblx0XHRcdFx0XHRcdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiYm9keVwiLCBuZXcgRmlsZVZlcmlmaWNhdGlvbkVycm9yVmlldyh7XG5cdFx0XHRcdFx0XHRcdFx0Y29sbGVjdGlvbjogbmV3IEJhY2tib25lLkNvbGxlY3Rpb24oZXJyb3JzKSxcblx0XHRcdFx0XHRcdFx0fSkpO1xuXG5cdFx0XHRcdFx0XHRcdHRoaXMudHJpZ2dlcihcImNhcmQ6bGFzdFwiLCB7IGVycm9yOiB0cnVlIH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMudXNlcnMgPSBuZXcgQmFja2JvbmUuQ29sbGVjdGlvbih1c2Vycyk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gRGlzcGxheSB0aGUgc3VjY2VzcyB2aWV3XG5cdFx0XHRcdFx0XHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImJvZHlcIiwgbmV3IEZpbGVWZXJpZmljYXRpb25TdWNjZXNzVmlldyh7XG5cdFx0XHRcdFx0XHRcdFx0Y29sbGVjdGlvbjogdGhpcy51c2Vycyxcblx0XHRcdFx0XHRcdFx0fSkpO1xuXG5cdFx0XHRcdFx0XHRcdHRoaXMudHJpZ2dlcihcImZpbGUtdmVyaWZpY2F0aW9uLWNhcmQ6aW5zdHJ1Y3Rpb25zXCIsIHRoaXMudXNlcnMpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLnRyaWdnZXIoXCJjYXJkOmxhc3RcIik7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9LFxufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENhcmQgTW9kYWwgQ29udHJvbGxlclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxubW9kdWxlLmV4cG9ydHMgPSBDYXJkTW9kYWwuZXh0ZW5kKHtcblx0Y2FyZEV2ZW50czogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdFwiY2FyZDpiZWdpblwiOiB0aGlzLm9uQmVnaW4uYmluZCh0aGlzKSxcblx0XHRcdFwiY2FyZDpwcmV2aW91c1wiOiB0aGlzLm9uUHJldmlvdXNDYXJkLmJpbmQodGhpcyksXG5cdFx0XHRcImNhcmQ6bmV4dFwiOiB0aGlzLm9uTmV4dENhcmQuYmluZCh0aGlzKSxcblx0XHRcdFwiY2FyZDpiZWZvcmUtZGVzdHJveVwiOiB0aGlzLm9uQmVmb3JlRGVzdHJveUNhcmQuYmluZCh0aGlzKSxcblx0XHRcdFwiY2FyZDphY2NlcHRcIjogdGhpcy5vbkFjY2VwdC5iaW5kKHRoaXMpLFxuXHRcdFx0XCJjYXJkOmNhbmNlbFwiOiB0aGlzLm9uQ2FuY2VsLmJpbmQodGhpcyksXG5cdFx0fTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0Q2FyZE1vZGFsLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyk7XG5cblx0XHR0aGlzLnVzZXJzID0gb3B0aW9ucy51c2VycztcblxuXHRcdHRoaXMuc3RhdGUgPSB7fTtcblxuXHRcdHRoaXMub24odGhpcy5jYXJkRXZlbnRzKCkpO1xuXHR9LFxuXG5cdHNob3dGaWxlQ2hvb3NlckNhcmQoc2hvd0Z1bmN0aW9uKSB7XG5cdFx0dGhpcy5maWxlQ2hvb3NlckNhcmQgPSBuZXcgRmlsZUNob29zZXJDYXJkKCk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZmlsZUNob29zZXJDYXJkLCBcImZpbGUtY2hvb3Nlci1jYXJkOmZpbGVcIiwgdGhpcy5vbkZpbGVDaG9zZW4uYmluZCh0aGlzKSk7XG5cblx0XHRzaG93RnVuY3Rpb24odGhpcy5maWxlQ2hvb3NlckNhcmQpO1xuXG5cdFx0dGhpcy5zdGF0ZS5jdXJyZW50U3RlcCA9IDE7XG5cdH0sXG5cblx0c2hvd0ZpbGVWZXJpZmljYXRpb25DYXJkKHNob3dGdW5jdGlvbikge1xuXHRcdHRoaXMuZmlsZVZlcmlmaWNhdGlvbkNhcmQgPSBuZXcgRmlsZVZlcmlmaWNhdGlvbkNhcmQoe1xuXHRcdFx0ZmlsZTogdGhpcy5zdGF0ZS5maWxlLFxuXHRcdFx0dXNlcnM6IHRoaXMudXNlcnMsXG5cdFx0fSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZmlsZVZlcmlmaWNhdGlvbkNhcmQsIFwiZmlsZS12ZXJpZmljYXRpb24tY2FyZDppbnN0cnVjdGlvbnNcIiwgdGhpcy5vbkluc3RydWN0aW9uc0dlbmVyYXRlZC5iaW5kKHRoaXMpKTtcblxuXHRcdHNob3dGdW5jdGlvbih0aGlzLmZpbGVWZXJpZmljYXRpb25DYXJkKTtcblxuXHRcdHRoaXMuc3RhdGUuY3VycmVudFN0ZXAgPSAyO1xuXHR9LFxuXG5cdG9uQmVnaW46IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc2hvd0ZpbGVDaG9vc2VyQ2FyZCh0aGlzLnNob3dOZXh0Q2FyZC5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRvblByZXZpb3VzQ2FyZDogZnVuY3Rpb24oKSB7XG5cdFx0c3dpdGNoICh0aGlzLnN0YXRlLmN1cnJlbnRTdGVwKSB7XG5cdFx0XHRjYXNlIDI6XG5cdFx0XHRcdHRoaXMuc2hvd0ZpbGVDaG9vc2VyQ2FyZCh0aGlzLnNob3dQcmV2aW91c0NhcmQuYmluZCh0aGlzKSk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRjb25zb2xlLmVycm9yKFwiSW52YWxpZCBjdXN0b20gZ3JvdXAgdXBsb2FkIGNhcmQgc3RlcC5cIik7XG5cdFx0fVxuXHR9LFxuXG5cdG9uTmV4dENhcmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHN3aXRjaCAodGhpcy5zdGF0ZS5jdXJyZW50U3RlcCkge1xuXHRcdFx0Y2FzZSAxOlxuXHRcdFx0XHR0aGlzLnNob3dGaWxlVmVyaWZpY2F0aW9uQ2FyZCh0aGlzLnNob3dOZXh0Q2FyZC5iaW5kKHRoaXMpKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoXCJJbnZhbGlkIGN1c3RvbSBncm91cCB1cGxvYWQgY2FyZCBzdGVwLlwiKTtcblx0XHR9XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95Q2FyZDogZnVuY3Rpb24oY2FyZFZpZXcpIHtcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcoY2FyZFZpZXcpO1xuXHR9LFxuXG5cdG9uQWNjZXB0OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnRyaWdnZXIoXCJhY2NlcHRcIiwgeyBpbnN0cnVjdGlvbnM6IHRoaXMuc3RhdGUuaW5zdHJ1Y3Rpb25zIH0pO1xuXG5cdFx0dGhpcy5kZXN0cm95KCk7XG5cdH0sXG5cblx0b25DYW5jZWw6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudHJpZ2dlcihcImNhbmNlbFwiKTtcblxuXHRcdHRoaXMuZGVzdHJveSgpO1xuXHR9LFxuXG5cdG9uRmlsZUNob3NlbjogZnVuY3Rpb24oZmlsZSkge1xuXHRcdHRoaXMuc3RhdGUuZmlsZSA9IGZpbGU7XG5cblx0XHR0aGlzLmVuYWJsZU5hdmlnYXRvck5leHQoKTtcblx0fSxcblxuXHRvbkluc3RydWN0aW9uc0dlbmVyYXRlZDogZnVuY3Rpb24oaW5zdHJ1Y3Rpb25zKSB7XG5cdFx0dGhpcy5zdGF0ZS5pbnN0cnVjdGlvbnMgPSBpbnN0cnVjdGlvbnM7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcodGhpcy5maWxlQ2hvb3NlckNhcmQpO1xuXG5cdFx0dGhpcy5vZmYodGhpcy5jYXJkRXZlbnRzKCkpO1xuXHR9LFxufSk7XG4iXX0=",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar Backbone = require(\"backbone\");\nvar Promise = require(\"bluebird\");\nvar raygun = require(\"raygun\");\n\nvar settings = require(\"app-settings\");\n\nvar ErrorView = require(\"../../lib/errorView\");\nvar StatusView = require(\"../../lib/statusView\");\n\nvar BookModel = Backbone.Model.extend({\n\tdefaults: {},\n\n\tidAttribute: \"_id\"\n});\n\nvar BookCollection = Backbone.Collection.extend({\n\tmodel: BookModel,\n\n\tinitialize: function initialize(models, options) {\n\t\tthis.group = options.group;\n\t},\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/groups/\" + this.group + \"/books\";\n\t}\n});\n\nvar CGCollection = Backbone.Collection.extend({\n\tmodel: BookModel,\n\n\tinitialize: function initialize(models, options) {\n\t\tthis.group = options.group;\n\t},\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/acacia/groups/\" + this.group + \"/customGroups\";\n\t}\n});\n\nvar InformationView = Backbone.Marionette.View.extend({\n\tclassName: \"user-details-information\",\n\n\ttemplate: require(\"../templates/groupDetails.nunj\").information,\n\n\tserializeData: function serializeData() {\n\t\treturn this.model.toJSON({ computed: true });\n\t}\n});\n\nvar BookListEmpty = Backbone.Marionette.View.extend({\n\tclassName: \"user-details-list-empty\",\n\n\ttemplate: require(\"../templates/groupDetails.nunj\").bookListEmpty\n});\n\nvar BookListItem = Backbone.Marionette.View.extend({\n\tclassName: \"user-details-list-item user-details-book-list-item\",\n\n\ttemplate: require(\"../templates/groupDetails.nunj\").bookListItem\n});\n\nvar BookList = Backbone.Marionette.CollectionView.extend({\n\tclassName: \"user-details-list\",\n\n\tchildView: BookListItem,\n\n\temptyView: BookListEmpty\n});\n\nvar CGListEmpty = Backbone.Marionette.View.extend({\n\tclassName: \"user-details-list-empty\",\n\n\ttemplate: require(\"../templates/groupDetails.nunj\").cgListEmpty\n});\n\nvar CGListItem = Backbone.Marionette.View.extend({\n\tclassName: \"user-details-list-item user-details-book-list-item\",\n\n\ttemplate: require(\"../templates/groupDetails.nunj\").cgListItem\n});\n\nvar CGList = Backbone.Marionette.CollectionView.extend({\n\tclassName: \"user-details-list\",\n\n\tchildView: CGListItem,\n\n\temptyView: CGListEmpty\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"user-details-view\",\n\n\ttemplate: require(\"../templates/groupDetails.nunj\").layout,\n\n\tregions: {\n\t\tstatus: \".status-region\",\n\t\tinformation: \".information-region\",\n\t\tgroup: \".group-region\",\n\t\tbook: \".book-region\",\n\t\tcg: \".cg-region\"\n\t},\n\n\tui: {\n\t\tbuttonClose: \".button-close\",\n\t\tstatusRegion: \".status-region\",\n\t\tinformationRegion: \".information-region\",\n\t\tlistHeaderContainer: \".list-header-container\",\n\t\tlistContainer: \".list-container\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonClose\": \"onButtonCloseClick\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.eventBus = options.eventBus;\n\t\tthis.groupModel = options.groupModel;\n\n\t\tthis.host = $(\"#modals\");\n\t},\n\n\tshow: function show() {\n\t\t$(\".modal-container\", this.host).append(this.render().$el);\n\t},\n\n\tclose: function close() {\n\t\tthis.eventBus.trigger(\"groupDetails:close\");\n\t\tthis.destroy();\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this = this;\n\n\t\t// Show the modal background\n\t\t$(\".modal-element\", this.host).removeClass(\"hide\");\n\t\t$(\"body\").addClass(\"hide-overflow\");\n\n\t\t// The modal itself should allow clicks to propagate so that menus in the\n\t\t// modal will be hidden correctly. However, everything underneath the modal\n\t\t// should be unaffected by clicks\n\t\t//this.host.on(\"click\", event => event.stopPropagation(), this);\n\n\t\tthis.renderLoadingStatus();\n\n\t\tvar collections = [new BookCollection([], { group: this.groupModel.get(\"code\") }).lazyFetch(), new CGCollection([], { group: this.groupModel.get(\"code\") }).lazyFetch()];\n\n\t\tPromise.all(collections).spread(function (bookCollection, cg) {\n\t\t\t_this.groupBookCollection = bookCollection;\n\t\t\t_this.cgCollection = cg;\n\n\t\t\t_this.renderPage();\n\t\t}).catch(function (error) {\n\t\t\t_this.renderError(error);\n\n\t\t\tif (!settings.debug || settings.reportErrors) raygun(\"send\", error);\n\t\t});\n\t},\n\n\trenderLoadingStatus: function renderLoadingStatus() {\n\t\tthis.getRegion(\"status\").show(new StatusView({ type: \"loading\" }));\n\t},\n\n\trenderError: function renderError(error) {\n\t\tthis.getRegion(\"status\").show(new ErrorView({ fetchError: error }));\n\t},\n\n\trenderPage: function renderPage() {\n\t\tthis.ui.statusRegion.addClass(\"hide\");\n\t\tthis.ui.informationRegion.removeClass(\"hide\");\n\t\tthis.ui.listHeaderContainer.removeClass(\"hide\");\n\t\tthis.ui.listContainer.removeClass(\"hide\");\n\n\t\tthis.getRegion(\"information\").show(new InformationView({ model: this.groupModel }));\n\n\t\tthis.getRegion(\"book\").show(new BookList({ collection: this.groupBookCollection }));\n\n\t\tthis.getRegion(\"cg\").show(new CGList({ collection: this.cgCollection }));\n\t},\n\n\tonButtonCloseClick: function onButtonCloseClick() {\n\t\tthis.close();\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.host.off(\"click\");\n\t},\n\n\tonDestroy: function onDestroy() {\n\t\t// Unbind the click handler\n\t\tthis.host.off(\"click\");\n\n\t\t// Hide the modal background\n\t\t$(\".modal-element\", this.host).addClass(\"hide\");\n\t\t$(\"body\").removeClass(\"hide-overflow\");\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImdyb3VwRGV0YWlscy5qcyJdLCJuYW1lcyI6WyIkIiwicmVxdWlyZSIsIkJhY2tib25lIiwiUHJvbWlzZSIsInJheWd1biIsInNldHRpbmdzIiwiRXJyb3JWaWV3IiwiU3RhdHVzVmlldyIsIkJvb2tNb2RlbCIsIk1vZGVsIiwiZXh0ZW5kIiwiZGVmYXVsdHMiLCJpZEF0dHJpYnV0ZSIsIkJvb2tDb2xsZWN0aW9uIiwiQ29sbGVjdGlvbiIsIm1vZGVsIiwiaW5pdGlhbGl6ZSIsIm1vZGVscyIsIm9wdGlvbnMiLCJncm91cCIsInVybCIsInVybFJvb3QiLCJDR0NvbGxlY3Rpb24iLCJJbmZvcm1hdGlvblZpZXciLCJNYXJpb25ldHRlIiwiVmlldyIsImNsYXNzTmFtZSIsInRlbXBsYXRlIiwiaW5mb3JtYXRpb24iLCJzZXJpYWxpemVEYXRhIiwidG9KU09OIiwiY29tcHV0ZWQiLCJCb29rTGlzdEVtcHR5IiwiYm9va0xpc3RFbXB0eSIsIkJvb2tMaXN0SXRlbSIsImJvb2tMaXN0SXRlbSIsIkJvb2tMaXN0IiwiQ29sbGVjdGlvblZpZXciLCJjaGlsZFZpZXciLCJlbXB0eVZpZXciLCJDR0xpc3RFbXB0eSIsImNnTGlzdEVtcHR5IiwiQ0dMaXN0SXRlbSIsImNnTGlzdEl0ZW0iLCJDR0xpc3QiLCJtb2R1bGUiLCJleHBvcnRzIiwibGF5b3V0IiwicmVnaW9ucyIsInN0YXR1cyIsImJvb2siLCJjZyIsInVpIiwiYnV0dG9uQ2xvc2UiLCJzdGF0dXNSZWdpb24iLCJpbmZvcm1hdGlvblJlZ2lvbiIsImxpc3RIZWFkZXJDb250YWluZXIiLCJsaXN0Q29udGFpbmVyIiwiZXZlbnRzIiwiZXZlbnRCdXMiLCJncm91cE1vZGVsIiwiaG9zdCIsInNob3ciLCJhcHBlbmQiLCJyZW5kZXIiLCIkZWwiLCJjbG9zZSIsInRyaWdnZXIiLCJkZXN0cm95Iiwib25SZW5kZXIiLCJyZW1vdmVDbGFzcyIsImFkZENsYXNzIiwicmVuZGVyTG9hZGluZ1N0YXR1cyIsImNvbGxlY3Rpb25zIiwiZ2V0IiwibGF6eUZldGNoIiwiYWxsIiwic3ByZWFkIiwiYm9va0NvbGxlY3Rpb24iLCJncm91cEJvb2tDb2xsZWN0aW9uIiwiY2dDb2xsZWN0aW9uIiwicmVuZGVyUGFnZSIsImNhdGNoIiwicmVuZGVyRXJyb3IiLCJlcnJvciIsImRlYnVnIiwicmVwb3J0RXJyb3JzIiwiZ2V0UmVnaW9uIiwidHlwZSIsImZldGNoRXJyb3IiLCJjb2xsZWN0aW9uIiwib25CdXR0b25DbG9zZUNsaWNrIiwib25CZWZvcmVEZXN0cm95Iiwib2ZmIiwib25EZXN0cm95Il0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLFdBQVdELFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1FLFVBQVVGLFFBQVEsVUFBUixDQUFoQjtBQUNBLElBQU1HLFNBQVNILFFBQVEsUUFBUixDQUFmOztBQUVBLElBQU1JLFdBQVdKLFFBQVEsY0FBUixDQUFqQjs7QUFFQSxJQUFNSyxZQUFZTCxRQUFRLHFCQUFSLENBQWxCO0FBQ0EsSUFBTU0sYUFBYU4sUUFBUSxzQkFBUixDQUFuQjs7QUFFQSxJQUFNTyxZQUFZTixTQUFTTyxLQUFULENBQWVDLE1BQWYsQ0FBc0I7QUFDdkNDLFdBQVUsRUFENkI7O0FBR3ZDQyxjQUFhO0FBSDBCLENBQXRCLENBQWxCOztBQU1BLElBQU1DLGlCQUFpQlgsU0FBU1ksVUFBVCxDQUFvQkosTUFBcEIsQ0FBMkI7QUFDakRLLFFBQU9QLFNBRDBDOztBQUdqRFEsYUFBWSxvQkFBU0MsTUFBVCxFQUFpQkMsT0FBakIsRUFBMEI7QUFDckMsT0FBS0MsS0FBTCxHQUFhRCxRQUFRQyxLQUFyQjtBQUNBLEVBTGdEOztBQU9qREMsTUFBSyxlQUFXO0FBQ2YsU0FBT2YsU0FBU2dCLE9BQVQsR0FBbUIsa0JBQW5CLEdBQXdDLEtBQUtGLEtBQTdDLEdBQXFELFFBQTVEO0FBQ0E7QUFUZ0QsQ0FBM0IsQ0FBdkI7O0FBWUEsSUFBTUcsZUFBZXBCLFNBQVNZLFVB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LDhCQUFXO0FBQzlCLE9BQUt6QixLQUFMO0FBQ0EsRUE5RitDOztBQWdHaEQwQixrQkFBaUIsMkJBQVc7QUFDM0IsT0FBSy9CLElBQUwsQ0FBVWdDLEdBQVYsQ0FBYyxPQUFkO0FBQ0EsRUFsRytDOztBQW9HaERDLFlBQVcscUJBQVc7QUFDckI7QUFDQSxPQUFLakMsSUFBTCxDQUFVZ0MsR0FBVixDQUFjLE9BQWQ7O0FBRUE7QUFDQTdGLElBQUUsZ0JBQUYsRUFBb0IsS0FBSzZELElBQXpCLEVBQStCVSxRQUEvQixDQUF3QyxNQUF4QztBQUNBdkUsSUFBRSxNQUFGLEVBQVVzRSxXQUFWLENBQXNCLGVBQXRCO0FBQ0E7QUEzRytDLENBQWhDLENBQWpCIiwiZmlsZSI6Imdyb3VwRGV0YWlscy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IFByb21pc2UgPSByZXF1aXJlKFwiYmx1ZWJpcmRcIik7XG5jb25zdCByYXlndW4gPSByZXF1aXJlKFwicmF5Z3VuXCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IEVycm9yVmlldyA9IHJlcXVpcmUoXCIuLi8uLi9saWIvZXJyb3JWaWV3XCIpO1xuY29uc3QgU3RhdHVzVmlldyA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc3RhdHVzVmlld1wiKTtcblxuY29uc3QgQm9va01vZGVsID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHt9LFxuXG5cdGlkQXR0cmlidXRlOiBcIl9pZFwiLFxufSk7XG5cbmNvbnN0IEJvb2tDb2xsZWN0aW9uID0gQmFja2JvbmUuQ29sbGVjdGlvbi5leHRlbmQoe1xuXHRtb2RlbDogQm9va01vZGVsLFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG1vZGVscywgb3B0aW9ucykge1xuXHRcdHRoaXMuZ3JvdXAgPSBvcHRpb25zLmdyb3VwO1xuXHR9LFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2dyb3Vwcy9cIiArIHRoaXMuZ3JvdXAgKyBcIi9ib29rc1wiO1xuXHR9LFxufSk7XG5cbmNvbnN0IENHQ29sbGVjdGlvbiA9IEJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IEJvb2tNb2RlbCxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihtb2RlbHMsIG9wdGlvbnMpIHtcblx0XHR0aGlzLmdyb3VwID0gb3B0aW9ucy5ncm91cDtcblx0fSxcblxuXHR1cmw6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYWNhY2lhL2dyb3Vwcy9cIiArIHRoaXMuZ3JvdXAgKyBcIi9jdXN0b21Hcm91cHNcIjtcblx0fSxcbn0pO1xuXG5jb25zdCBJbmZvcm1hdGlvblZpZXcgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInVzZXItZGV0YWlscy1pbmZvcm1hdGlvblwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2dyb3VwRGV0YWlscy5udW5qXCIpLmluZm9ybWF0aW9uLFxuXG5cdHNlcmlhbGl6ZURhdGE6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1vZGVsLnRvSlNPTih7IGNvbXB1dGVkOiB0cnVlIH0pO1xuXHR9LFxufSk7XG5cbmNvbnN0IEJvb2tMaXN0RW1wdHkgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInVzZXItZGV0YWlscy1saXN0LWVtcHR5XCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvZ3JvdXBEZXRhaWxzLm51bmpcIikuYm9va0xpc3RFbXB0eSxcbn0pO1xuXG5jb25zdCBCb29rTGlzdEl0ZW0gPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInVzZXItZGV0YWlscy1saXN0LWl0ZW0gdXNlci1kZXRhaWxzLWJvb2stbGlzdC1pdGVtXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvZ3JvdXBEZXRhaWxzLm51bmpcIikuYm9va0xpc3RJdGVtLFxufSk7XG5cbmNvbnN0IEJvb2tMaXN0ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5Db2xsZWN0aW9uVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwidXNlci1kZXRhaWxzLWxpc3RcIixcblxuXHRjaGlsZFZpZXc6IEJvb2tMaXN0SXRlbSxcblxuXHRlbXB0eVZpZXc6IEJvb2tMaXN0RW1wdHksXG59KTtcblxuY29uc3QgQ0dMaXN0RW1wdHkgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInVzZXItZGV0YWlscy1saXN0LWVtcHR5XCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvZ3JvdXBEZXRhaWxzLm51bmpcIikuY2dMaXN0RW1wdHksXG59KTtcblxuY29uc3QgQ0dMaXN0SXRlbSA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwidXNlci1kZXRhaWxzLWxpc3QtaXRlbSB1c2VyLWRldGFpbHMtYm9vay1saXN0LWl0ZW1cIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9ncm91cERldGFpbHMubnVualwiKS5jZ0xpc3RJdGVtLFxufSk7XG5cbmNvbnN0IENHTGlzdCA9IEJhY2tib25lLk1hcmlvbmV0dGUuQ29sbGVjdGlvblZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInVzZXItZGV0YWlscy1saXN0XCIsXG5cblx0Y2hpbGRWaWV3OiBDR0xpc3RJdGVtLFxuXG5cdGVtcHR5VmlldzogQ0dMaXN0RW1wdHksXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInVzZXItZGV0YWlscy12aWV3XCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvZ3JvdXBEZXRhaWxzLm51bmpcIikubGF5b3V0LFxuXG5cdHJlZ2lvbnM6IHtcblx0XHRzdGF0dXM6IFwiLnN0YXR1cy1yZWdpb25cIixcblx0XHRpbmZvcm1hdGlvbjogXCIuaW5mb3JtYXRpb24tcmVnaW9uXCIsXG5cdFx0Z3JvdXA6IFwiLmdyb3VwLXJlZ2lvblwiLFxuXHRcdGJvb2s6IFwiLmJvb2stcmVnaW9uXCIsXG5cdFx0Y2c6IFwiLmNnLXJlZ2lvblwiLFxuXHR9LFxuXG5cdHVpOiB7XG5cdFx0YnV0dG9uQ2xvc2U6IFwiLmJ1dHRvbi1jbG9zZVwiLFxuXHRcdHN0YXR1c1JlZ2lvbjogXCIuc3RhdHVzLXJlZ2lvblwiLFxuXHRcdGluZm9ybWF0aW9uUmVnaW9uOiBcIi5pbmZvcm1hdGlvbi1yZWdpb25cIixcblx0XHRsaXN0SGVhZGVyQ29udGFpbmVyOiBcIi5saXN0LWhlYWRlci1jb250YWluZXJcIixcblx0XHRsaXN0Q29udGFpbmVyOiBcIi5saXN0LWNvbnRhaW5lclwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmJ1dHRvbkNsb3NlXCI6IFwib25CdXR0b25DbG9zZUNsaWNrXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuZXZlbnRCdXMgPSBvcHRpb25zLmV2ZW50QnVzO1xuXHRcdHRoaXMuZ3JvdXBNb2RlbCA9IG9wdGlvbnMuZ3JvdXBNb2RlbDtcblxuXHRcdHRoaXMuaG9zdCA9ICQoXCIjbW9kYWxzXCIpO1xuXHR9LFxuXG5cdHNob3c6IGZ1bmN0aW9uKCkge1xuXHRcdCQoXCIubW9kYWwtY29udGFpbmVyXCIsIHRoaXMuaG9zdCkuYXBwZW5kKHRoaXMucmVuZGVyKCkuJGVsKTtcblx0fSxcblxuXHRjbG9zZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwiZ3JvdXBEZXRhaWxzOmNsb3NlXCIpO1xuXHRcdHRoaXMuZGVzdHJveSgpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHQvLyBTaG93IHRoZSBtb2RhbCBiYWNrZ3JvdW5kXG5cdFx0JChcIi5tb2RhbC1lbGVtZW50XCIsIHRoaXMuaG9zdCkucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdCQoXCJib2R5XCIpLmFkZENsYXNzKFwiaGlkZS1vdmVyZmxvd1wiKTtcblxuXHRcdC8vIFRoZSBtb2RhbCBpdHNlbGYgc2hvdWxkIGFsbG93IGNsaWNrcyB0byBwcm9wYWdhdGUgc28gdGhhdCBtZW51cyBpbiB0aGVcblx0XHQvLyBtb2RhbCB3aWxsIGJlIGhpZGRlbiBjb3JyZWN0bHkuIEhvd2V2ZXIsIGV2ZXJ5dGhpbmcgdW5kZXJuZWF0aCB0aGUgbW9kYWxcblx0XHQvLyBzaG91bGQgYmUgdW5hZmZlY3RlZCBieSBjbGlja3Ncblx0XHQvL3RoaXMuaG9zdC5vbihcImNsaWNrXCIsIGV2ZW50ID0+IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpLCB0aGlzKTtcblxuXHRcdHRoaXMucmVuZGVyTG9hZGluZ1N0YXR1cygpO1xuXG5cdFx0Y29uc3QgY29sbGVjdGlvbnMgPSBbXG5cdFx0XHRuZXcgQm9va0NvbGxlY3Rpb24oW10sIHsgZ3JvdXA6IHRoaXMuZ3JvdXBNb2RlbC5nZXQoXCJjb2RlXCIpIH0pLmxhenlGZXRjaCgpLFxuXHRcdFx0bmV3IENHQ29sbGVjdGlvbihbXSwgeyBncm91cDogdGhpcy5ncm91cE1vZGVsLmdldChcImNvZGVcIikgfSkubGF6eUZldGNoKCksXG5cdFx0XTtcblxuXHRcdFByb21pc2UuYWxsKGNvbGxlY3Rpb25zKS5zcHJlYWQoKGJvb2tDb2xsZWN0aW9uLCBjZykgPT4ge1xuXHRcdFx0dGhpcy5ncm91cEJvb2tDb2xsZWN0aW9uID0gYm9va0NvbGxlY3Rpb247XG5cdFx0XHR0aGlzLmNnQ29sbGVjdGlvbiA9IGNnO1xuXG5cdFx0XHR0aGlzLnJlbmRlclBhZ2UoKTtcblx0XHR9KS5jYXRjaChlcnJvciA9PiB7XG5cdFx0XHR0aGlzLnJlbmRlckVycm9yKGVycm9yKTtcblxuXHRcdFx0aWYgKCFzZXR0aW5ncy5kZWJ1ZyB8fCBzZXR0aW5ncy5yZXBvcnRFcnJvcnMpXG5cdFx0XHRcdHJheWd1bihcInNlbmRcIiwgZXJyb3IpO1xuXHRcdH0pO1xuXHR9LFxuXG5cdHJlbmRlckxvYWRpbmdTdGF0dXM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZ2V0UmVnaW9uKFwic3RhdHVzXCIpLnNob3cobmV3IFN0YXR1c1ZpZXcoeyB0eXBlOiBcImxvYWRpbmdcIiB9KSk7XG5cdH0sXG5cblx0cmVuZGVyRXJyb3I6IGZ1bmN0aW9uKGVycm9yKSB7XG5cdFx0dGhpcy5nZXRSZWdpb24oXCJzdGF0dXNcIikuc2hvdyhuZXcgRXJyb3JWaWV3KHsgZmV0Y2hFcnJvcjogZXJyb3IgfSkpO1xuXHR9LFxuXG5cdHJlbmRlclBhZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkuc3RhdHVzUmVnaW9uLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLmluZm9ybWF0aW9uUmVnaW9uLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLmxpc3RIZWFkZXJDb250YWluZXIucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkubGlzdENvbnRhaW5lci5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cblx0XHR0aGlzLmdldFJlZ2lvbihcImluZm9ybWF0aW9uXCIpLnNob3cobmV3IEluZm9ybWF0aW9uVmlldyh7IG1vZGVsOiB0aGlzLmdyb3VwTW9kZWwgfSkpO1xuXG5cdFx0dGhpcy5nZXRSZWdpb24oXCJib29rXCIpLnNob3cobmV3IEJvb2tMaXN0KHsgY29sbGVjdGlvbjogdGhpcy5ncm91cEJvb2tDb2xsZWN0aW9uIH0pKTtcblxuXHRcdHRoaXMuZ2V0UmVnaW9uKFwiY2dcIikuc2hvdyhuZXcgQ0dMaXN0KHsgY29sbGVjdGlvbjogdGhpcy5jZ0NvbGxlY3Rpb24gfSkpO1xuXHR9LFxuXG5cdG9uQnV0dG9uQ2xvc2VDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jbG9zZSgpO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5ob3N0Lm9mZihcImNsaWNrXCIpO1xuXHR9LFxuXG5cdG9uRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gVW5iaW5kIHRoZSBjbGljayBoYW5kbGVyXG5cdFx0dGhpcy5ob3N0Lm9mZihcImNsaWNrXCIpO1xuXG5cdFx0Ly8gSGlkZSB0aGUgbW9kYWwgYmFja2dyb3VuZFxuXHRcdCQoXCIubW9kYWwtZWxlbWVudFwiLCB0aGlzLmhvc3QpLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHQkKFwiYm9keVwiKS5yZW1vdmVDbGFzcyhcImhpZGUtb3ZlcmZsb3dcIik7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\nvar Pikaday = require(\"pikaday\");\nvar rester = require(\"rester\");\nvar Promise = require(\"bluebird\");\n\nvar settings = require(\"app-settings\");\n\nvar App = require(\"../../index\");\nvar BigModal = require(\"../../lib/bigModal\");\nvar gradeMap = require(\"../../lib/gradeMap\");\nvar GroupModel = require(\"./groupModel\");\nvar Selectra = require(\"../../lib/selectra\");\nvar SmallModal = require(\"../../lib/smallModal\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar DATE_FORMAT = \"DD MMM YYYY\";\n\nmodule.exports = BigModal.extend({\n\tui: {\n\t\tcode: \"input[name='code']\",\n\t\tautoName: \"input[name='autoName']\",\n\t\tname: \"input[name='name']\",\n\t\tsubject: \"input[name='subject']\",\n\t\tlanguage: \"select[name='language']\",\n\t\tgrade: \"select[name='grade']\",\n\t\tyear: \"select[name='year']\",\n\t\tyearPanel: \"div.group-year\",\n\t\tcustomGroupLifetime: \"input[name='customGroupLifetime']\",\n\t\tcustomGroupLifetimePanels: \"div.custom-group-lifetime\",\n\t\tperpetualGroup: \"input[name='perpetualGroup']\",\n\t\tdefiniteGroupLifetimePanels: \"div.definite-group-lifetime\",\n\t\tstartDate: \"input#start-date\",\n\t\tendDate: \"input#end-date\",\n\t\tmetadata: \"input[name='metadata']\",\n\t\tsystemGroup: \"input[name='system']\",\n\t\teducatorControl: \"input[name='educatorControl']\",\n\t\tmemberParents: \"select[name='memberParents']\"\n\t},\n\n\tevents: {\n\t\t\"change @ui.autoName\": \"autoName\",\n\n\t\t\"change @ui.subject\": \"updateName\",\n\t\t\"change @ui.language\": \"updateName\",\n\t\t\"change @ui.grade\": \"updateName\",\n\t\t\"change @ui.year\": \"updateName\",\n\t\t\"change @ui.customGroupLifetime\": \"onCustomGroupLifetimeChange\",\n\t\t\"change @ui.perpetualGroup\": \"onPerpetualGroupChange\",\n\t\t\"keyup @ui.metadata\": \"updateName\",\n\t\t\"change @ui.systemGroup\": \"toggleSystemGroup\",\n\t\t\"change @ui.educatorControl\": \"toggleEducatorControl\"\n\t},\n\n\tactions: {\n\t\tcreateAnother: \"onCreateAnother\"\n\t},\n\n\terrorMap: {\n\t\tname: {\n\t\t\tposition: \"bottom\"\n\t\t}\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this = this;\n\n\t\treturn _.extend({\n\t\t\tyears: function years() {\n\t\t\t\treturn _.range(2014, moment().year() + 2);\n\t\t\t},\n\t\t\tcanEdit: function canEdit() {\n\t\t\t\treturn settings.externalSync.groups !== \"rw\" || _this.model.isNew() && settings.externalSync.groupYearExclusions.length > 0 || // eslint-disable-line no-sync\n\t\t\t\t!_this.model.isNew() && _.includes(settings.externalSync.groupYearExclusions, _this.model.get(\"year\"));\n\t\t\t}, // eslint-disable-line no-sync\n\t\t\teditable: function editable() {\n\t\t\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\t\t\treturn _this.model.isNew() && rester.hasAccess(rester.p.api.groups.post, user) || !_this.model.isNew() && rester.hasAccess(rester.p.api.groups.put, user);\n\t\t\t},\n\t\t\texternalSync: function externalSync() {\n\t\t\t\treturn settings.externalSync.groups === \"rw\";\n\t\t\t}, // eslint-disable-line no-sync\n\t\t\tgroupYearExclusions: function groupYearExclusions() {\n\t\t\t\treturn settings.externalSync.groupYearExclusions;\n\t\t\t} // eslint-disable-line no-sync\n\t\t}, BigModal.prototype.templateContext.call(this));\n\t},\n\n\tinitialize: function initialize() {\n\t\t_.bindAll(this);\n\n\t\tthis.Options = {\n\t\t\tclasses: [\"group-modal\"],\n\t\t\ttemplate: require(\"../templates/groupmodal.nunj\").content,\n\t\t\tbuttons: {\n\t\t\t\tcreate: {\n\t\t\t\t\ttype: \"accept\",\n\t\t\t\t\tlabel: \"Create & Close\",\n\t\t\t\t\tmode: \"create\",\n\t\t\t\t\tpermission: this.permissionToCreate.bind(this),\n\t\t\t\t\tsave: true,\n\t\t\t\t\tvalidate: true\n\t\t\t\t},\n\t\t\t\tcreateAnother: {\n\t\t\t\t\ttype: \"accept\",\n\t\t\t\t\tlabel: \"Create\",\n\t\t\t\t\tmode: \"create\",\n\t\t\t\t\tpermission: this.permissionToCreate.bind(this),\n\t\t\t\t\tsave: true,\n\t\t\t\t\tvalidate: true\n\t\t\t\t},\n\t\t\t\tupdate: {\n\t\t\t\t\ttype: \"accept\",\n\t\t\t\t\tlabel: \"Update\",\n\t\t\t\t\tmode: \"edit\",\n\t\t\t\t\tpermission: this.permissionToUpdate.bind(this),\n\t\t\t\t\tsave: !this.options.dontSave,\n\t\t\t\t\tvalidate: true\n\t\t\t\t},\n\t\t\t\tcancel: {\n\t\t\t\t\ttype: \"cancel\",\n\t\t\t\t\tlabel: \"Cancel\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tdataNoun: \"group\" + (this.model.isNew() ? \"\" : \": \" + this.model.get(\"name\"))\n\t\t};\n\n\t\tif (!this.model.has(\"year\")) this.model.set({ year: moment().year() });\n\n\t\tthis.ui = _.extend(this.ui, BigModal.prototype.ui);\n\t\tthis.events = _.extend(this.events, BigModal.prototype.events);\n\n\t\tBigModal.prototype.initialize.call(this);\n\t},\n\n\tpermissionToCreate: function permissionToCreate() {\n\t\treturn rester.hasAccess(rester.p.api.groups.post, radio.request(App.Events.Requests.CurrentUser));\n\t},\n\n\tpermissionToUpdate: function permissionToUpdate() {\n\t\treturn rester.hasAccess(rester.p.api.groups.post, radio.request(App.Events.Requests.CurrentUser));\n\t},\n\n\trenderForm: function renderForm() {\n\t\tvar _this2 = this;\n\n\t\t// Check if the current name matches the autogenerated one. If not, assume a custom name and check the box.\n\t\tif (!this.model.isNew() && this.generateName() !== this.model.get(\"name\")) {\n\t\t\tthis.ui.autoName.prop(\"checked\", true);\n\t\t\tthis.ui.name.attr(\"readonly\", false);\n\t\t}\n\n\t\tthis.subjectSelect = new Selectra({\n\t\t\tserver: {\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/subjects\",\n\t\t\t\tdelayLoad: true,\n\t\t\t\tkey: \"subject_id\",\n\t\t\t\tvalue: \"subject\",\n\t\t\t\tdefault: {\n\t\t\t\t\tkey: this.model.get(\"subject\"),\n\t\t\t\t\tvalue: this.model.get(\"subject_name\")\n\t\t\t\t}\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 20,\n\t\t\t\tinfinite: true\n\t\t\t},\n\t\t\tplaceholder: \"No subject selected\",\n\t\t\tddHost: \".modal-container\"\n\t\t});\n\n\t\tthis.subjectSelect.show({ el: this.ui.subject });\n\n\t\tvar memberParents = new Selectra({\n\t\t\tmultiple: true,\n\t\t\tsort: true,\n\t\t\tserver: {\n\t\t\t\tkey: \"code\",\n\t\t\t\tvalue: \"name\",\n\t\t\t\tdelayLoad: true,\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/groups\",\n\t\t\t\tdefault: {\n\t\t\t\t\tfetch: settings.urlRoot + \"/acacia/groups/\" + this.model.id + \"/memberParents\"\n\t\t\t\t},\n\t\t\t\tparams: {\n\t\t\t\t\textendedName: true\n\t\t\t\t}\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t},\n\t\t\tplaceholder: \"No membership parents selected\",\n\t\t\tddHost: \".modal-container\"\n\t\t});\n\n\t\tmemberParents.show({ el: this.ui.memberParents });\n\n\t\t$(\"select:not([name='memberParents'])\", this.$el).chosen({\n\t\t\tdisable_search_threshold: 12,\n\t\t\tallow_single_deselect: true,\n\t\t\twidth: \"100%\"\n\t\t});\n\n\t\t// Style and populate the starting and ending date inputs\n\t\tvar start = !this.model.has(\"start\") || this.model.get(\"start\") === null || this.model.get(\"start\") === -1 ? moment() : moment.unix(this.model.get(\"start\"));\n\t\tvar end = !this.model.has(\"end\") || this.model.get(\"end\") === null || this.model.get(\"end\") === -1 ? moment(start) : moment.unix(this.model.get(\"end\"));\n\n\t\tif (this.model.isNew()) {\n\t\t\tstart.startOf(\"day\");\n\t\t\tend.endOf(\"day\");\n\t\t}\n\n\t\tthis.ui.startDate.val(start.format(DATE_FORMAT));\n\t\tthis.ui.endDate.val(end.format(DATE_FORMAT));\n\n\t\tthis.startDatePicker = new Pikaday({\n\t\t\tfield: this.ui.startDate.get(0),\n\t\t\tformat: DATE_FORMAT,\n\n\t\t\tonSelect: function onSelect() {\n\t\t\t\tvar startDate = moment(_this2.ui.startDate.val(), DATE_FORMAT).hour(0).minute(0).second(0);\n\t\t\t\tvar endDate = moment(_this2.ui.endDate.val(), DATE_FORMAT).hour(0).minute(0).second(0);\n\n\t\t\t\tif (startDate.isAfter(endDate)) _this2.endDatePicker.setDate(startDate.toDate());\n\n\t\t\t\t_this2.endDatePicker.setMinDate(startDate.toDate());\n\t\t\t}\n\t\t});\n\n\t\tthis.endDatePicker = new Pikaday({\n\t\t\tfield: this.ui.endDate.get(0),\n\t\t\tformat: DATE_FORMAT,\n\n\t\t\tonSelect: function onSelect() {\n\t\t\t\tvar startDate = moment(_this2.ui.startDate.val(), DATE_FORMAT).hour(0).minute(0).second(0);\n\t\t\t\tvar endDate = moment(_this2.ui.endDate.val(), DATE_FORMAT).hour(0).minute(0).second(0);\n\n\t\t\t\tif (startDate.isAfter(endDate)) _this2.startDatePicker.setDate(endDate.toDate());\n\t\t\t}\n\t\t});\n\t},\n\n\ttoggleSystemGroup: function toggleSystemGroup() {\n\t\tif (this.ui.systemGroup.prop(\"checked\")) this.ui.educatorControl.prop(\"disabled\", true).prop(\"checked\", false);else this.ui.educatorControl.prop(\"disabled\", false).prop(\"checked\", false);\n\t},\n\n\ttoggleEducatorControl: function toggleEducatorControl() {\n\t\tif (this.ui.educatorControl.prop(\"checked\")) this.ui.systemGroup.prop(\"disabled\", true).prop(\"checked\", false);else this.ui.systemGroup.prop(\"disabled\", false).prop(\"checked\", false);\n\t},\n\n\tonCustomGroupLifetimeChange: function onCustomGroupLifetimeChange() {\n\t\tif (this.ui.customGroupLifetime.prop(\"checked\")) this.showCustomGroupLifetimePanels();else this.hideCustomGroupLifetimePanels();\n\t},\n\n\tonPerpetualGroupChange: function onPerpetualGroupChange() {\n\t\tif (this.ui.perpetualGroup.prop(\"checked\")) {\n\t\t\tthis.ui.definiteGroupLifetimePanels.addClass(\"hide\");\n\t\t} else {\n\t\t\tthis.resetDefiniteGroupLifetime();\n\t\t\tthis.ui.definiteGroupLifetimePanels.removeClass(\"hide\");\n\t\t}\n\t},\n\n\tresetDefiniteGroupLifetime: function resetDefiniteGroupLifetime() {\n\t\tvar lifetime = this.computeDefiniteLifetime();\n\n\t\tthis.ui.startDate.val(moment.unix(lifetime.start).format(DATE_FORMAT));\n\t\tthis.startDatePicker.setDate(moment.unix(lifetime.start).toDate());\n\t\tthis.ui.endDate.val(moment.unix(lifetime.end).format(DATE_FORMAT));\n\t\tthis.endDatePicker.setDate(moment.unix(lifetime.end).toDate());\n\t},\n\n\tcomputeDefiniteLifetime: function computeDefiniteLifetime() {\n\t\t// A group's lifetime starts at its target year plus starting month, with 0 being January\n\t\tvar yearStart = moment().year(this.ui.year.val()).month(settings.yearStart).startOf(\"month\").startOf(\"day\");\n\t\tvar end = void 0;\n\t\tvar start = yearStart.unix();\n\n\t\tif (start >= 2115947647) {\n\t\t\tend = 2147483647;\n\t\t} else {\n\t\t\t// Add one year to the start and subtract one second to obtain the end of the group's year-bound lifetime\n\t\t\tyearStart.add(1, \"years\").subtract(1, \"seconds\");\n\t\t\tend = yearStart.unix();\n\t\t}\n\n\t\treturn {\n\t\t\tend: end,\n\t\t\tstart: start\n\t\t};\n\t},\n\n\thideCustomGroupLifetimePanels: function hideCustomGroupLifetimePanels() {\n\t\tthis.ui.customGroupLifetimePanels.addClass(\"hide\");\n\t\tthis.ui.yearPanel.removeClass(\"hide\");\n\t},\n\n\tshowCustomGroupLifetimePanels: function showCustomGroupLifetimePanels() {\n\t\tthis.ui.yearPanel.addClass(\"hide\");\n\n\t\tif (this.ui.perpetualGroup.prop(\"checked\")) this.ui.customGroupLifetimePanels.not(this.ui.definiteGroupLifetimePanels).removeClass(\"hide\");else this.ui.customGroupLifetimePanels.removeClass(\"hide\");\n\t},\n\n\tautoName: function autoName() {\n\t\tthis.ui.name.prop(\"readonly\", !this.ui.autoName.prop(\"checked\"));\n\t\tif (!this.ui.autoName.prop(\"checked\")) this.updateName();\n\t},\n\n\tupdateName: function updateName() {\n\t\tif (this.ui.autoName.prop(\"checked\")) return;\n\n\t\tthis.ui.name.val(this.generateName());\n\t},\n\n\tgenerateName: function generateName() {\n\t\tvar pieces = [];\n\n\t\tif (this.ui.language.val()) pieces.push(\"[\" + this.ui.language.val().replace(\"Isi\", \"\").slice(0, 3) + \"]\");\n\n\t\tif (this.ui.subject.val()) {\n\t\t\tvar val = this.subjectSelect.getSelected().subject;\n\n\t\t\tif (_.includes(val, \":\")) {\n\t\t\t\tval = val.replace(\"Home Language\", \"HL\");\n\t\t\t\tval = val.replace(\"First Additional Language\", \"FAL\");\n\t\t\t\tval = val.replace(\"Second Additional Language\", \"SAL\");\n\t\t\t}\n\n\t\t\tpieces.push(val);\n\t\t}\n\n\t\tvar gm = gradeMap.codeToHumanValue(_.flatten([this.ui.grade.val()]));\n\n\t\tif (gm) pieces.push(\"(\" + gm + \")\");\n\n\t\tif (this.ui.year.val()) pieces.push(this.ui.year.val());\n\n\t\tif (this.ui.metadata.val()) pieces.push(this.ui.metadata.val());\n\n\t\treturn _.trim(pieces.join(\" \"));\n\t},\n\n\tbeforeSave: function beforeSave() {\n\t\tif (!this.model.get(\"memberParents\") || this.model.get(\"memberParents\").length === 0) {\n\t\t\tif ((this.ui.memberParents.val() || []).length > 0) {\n\t\t\t\treturn new Promise(function (resolve) {\n\t\t\t\t\tvar modal = new SmallModal({\n\t\t\t\t\t\tpersist: true,\n\t\t\t\t\t\twarning: true,\n\t\t\t\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Member Inheritance Change\",\n\t\t\t\t\t\tbody: \"<p>You have set at least one group as a membership parent for this group.</p>\\n\\t\\t\\t\\t\\t\\t\\t\\t<p>Once this change is committed, all members currently in the group that are NOT in the membership parents will be REMOVED.</p>\\n\\t\\t\\t\\t\\t\\t\\t\\t<p>Are you sure you want to make this change?</p>\"\n\t\t\t\t\t});\n\n\t\t\t\t\tmodal.on(\"button:ok\", function () {\n\t\t\t\t\t\tmodal.destroy();\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t});\n\n\t\t\t\t\tmodal.on(\"button:cancel\", function () {\n\t\t\t\t\t\tmodal.destroy();\n\t\t\t\t\t\tresolve(false);\n\t\t\t\t\t});\n\n\t\t\t\t\tmodal.show();\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t},\n\n\tassembleData: function assembleData() {\n\t\tvar data = {};\n\n\t\tdata.attributes = {\n\t\t\tsubject: this.subjectSelect.getSelected().subject_id,\n\t\t\tsubject_name: this.subjectSelect.getSelected().subject,\n\t\t\tlanguage: this.ui.language.val(),\n\t\t\tgrade: this.ui.grade.val(),\n\t\t\tmetadata: _.trim(this.ui.metadata.val()),\n\t\t\tname: _.trim(this.ui.name.val()),\n\t\t\tprivate: false,\n\t\t\tsystemGroup: this.ui.systemGroup.prop(\"checked\"),\n\t\t\teducatorControl: this.ui.educatorControl.prop(\"checked\"),\n\t\t\tmemberParents: this.ui.memberParents.val()\n\t\t};\n\n\t\tif (data.attributes.memberParents && data.attributes.memberParents.length === 0) data.attributes.memberParents = null;\n\n\t\t// Set the group's year if the group is not synchronised with an outside source or the group's year is excluded\n\t\t// from synchronisation\n\t\t// eslint-disable-next-line no-sync\n\t\tif (settings.externalSync.groups !== \"rw\" || _.includes(settings.externalSync.groupYearExclusions, parseInt(this.ui.year.val(), 10))) data.attributes.year = this.ui.year.val();\n\n\t\t// Set the group's custom lifetime options iff the group is not synchronised with an outside source\n\t\t// eslint-disable-next-line no-sync\n\t\tif (settings.externalSync.groups !== \"rw\") {\n\t\t\tvar start = void 0;\n\t\t\tvar end = void 0;\n\n\t\t\tif (settings.perpetualGroups) {\n\t\t\t\tstart = 0;\n\t\t\t\tend = 2147483647;\n\t\t\t} else if (this.ui.customGroupLifetime.prop(\"checked\")) {\n\t\t\t\tif (this.ui.perpetualGroup.prop(\"checked\")) {\n\t\t\t\t\tstart = 0;\n\t\t\t\t\tend = 2147483647;\n\t\t\t\t} else {\n\t\t\t\t\tstart = moment(this.ui.startDate.val(), DATE_FORMAT).startOf(\"day\").unix();\n\t\t\t\t\tif (start < 0) start = 0;\n\n\t\t\t\t\tend = moment(this.ui.endDate.val(), DATE_FORMAT).endOf(\"day\").unix();\n\t\t\t\t\tif (end > 2147483647) end = 2147483647;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tvar lifetime = this.computeDefiniteLifetime();\n\n\t\t\t\tstart = lifetime.start;\n\t\t\t\tend = lifetime.end;\n\t\t\t}\n\n\t\t\tdata.attributes.start = start;\n\t\t\tdata.attributes.end = end;\n\t\t\tdata.attributes.year = moment.unix(start).year();\n\t\t}\n\n\t\t// If this is a new group, then generate a code for the group\n\t\tif (this.model.isNew()) {\n\t\t\tdata.attributes._code = _.random(10000) + \"-\" + data.attributes.grade + \"-\" + String(data.attributes.subject).replace(/ /g, \"_\") + \"-\" + data.attributes.year;\n\t\t}\n\n\t\treturn data;\n\t},\n\n\tonCreateAnother: function onCreateAnother() {\n\t\treturn new GroupModel();\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImdyb3VwTW9kYWwuanMiXSwibmFtZXMiOlsiJCIsInJlcXVpcmUiLCJfIiwiQmFja2JvbmUiLCJtb21lbnQiLCJQaWthZGF5IiwicmVzdGVyIiwiUHJvbWlzZSIsInNldHRpbmdzIiwiQXBwIiwiQmlnTW9kYWwiLCJncmFkZU1hcCIsIkdyb3VwTW9kZWwiLCJTZWxlY3RyYSIsIlNtYWxsTW9kYWwiLCJyYWRpbyIsIlJhZGlvIiwiY2hhbm5lbCIsIkRBVEVfRk9STUFUIiwibW9kdWxlIiwiZXhwb3J0cyIsImV4dGVuZCIsInVpIiwiY29kZSIsImF1dG9OYW1lIiwibmFtZSIsInN1YmplY3QiLCJsYW5ndWFnZSIsImdyYWRlIiwieWVhciIsInllYXJQYW5lbCIsImN1c3RvbUdyb3VwTGlmZXRpbWUiLCJjdXN0b21Hcm91cExpZmV0aW1lUGFuZWxzIiwicGVycGV0dWFsR3JvdXAiLCJkZWZpbml0ZUdyb3VwTGlmZXRpbWVQYW5lbHMiLCJzdGFydERhdGUiLCJlbmREYXRlIiwibWV0YWRhdGEiLCJzeXN0ZW1Hcm91cCIsImVkdWNhdG9yQ29udHJvbCIsIm1lbWJlclBhcmVudHMiLCJldmVudHMiLCJhY3Rpb25zIiwiY3JlYXRlQW5vdGhlciIsImVycm9yTWFwIiwicG9zaXRpb24iLCJ0ZW1wbGF0ZUNvbnRleHQiLCJ5ZWFycyIsInJhbmdlIiwiY2FuRWRpdCIsImV4dGVybmFsU3luYyIsImdyb3VwcyIsIm1vZGVsIiwiaXNOZXciLCJncm91cFllYXJFeGNsdXNpb25zIiwibGVuZ3RoIiwiaW5jbHVkZXMiLCJnZXQiLCJlZGl0YWJsZSIsInVzZXIiLCJyZXF1ZXN0IiwiRXZlbnRzIiwiUmVxdWVzdHMiLCJDdXJyZW50VXNlciIsImhhc0FjY2VzcyIsInAiLCJhcGkiLCJwb3N0IiwicHV0IiwicHJvdG90eXBlIiwiY2FsbCIsImluaXRpYWxpemUiLCJiaW5kQWxsIiwiT3B0aW9ucyIsImNsYXNzZXMiLCJ0ZW1wbGF0ZSIsImNvbnRlbnQiLCJidXR0b25zIiwiY3JlYXRlIiwidHlwZSIsImxhYmVsIiwibW9kZSIsInBlcm1pc3Npb24iLCJwZXJtaXNzaW9uVG9DcmVhdGUiLCJiaW5kIiwic2F2ZSIsInZhbGlkYXRlIiwidXBkYXRlIiwicGVybWlzc2lvblRvVXBkYXRlIiwib3B0aW9ucyIsImRvbnRTYXZlIiwiY2FuY2VsIiwiZGF0YU5vdW4iLCJoYXMiLCJzZXQiLCJyZW5kZXJGb3JtIiwiZ2VuZXJhdGVOYW1lIiwicHJvcCIsImF0dHIiLCJzdWJqZWN0U2VsZWN0Iiwic2VydmVyIiwiZmV0Y2giLCJ1cmxSb290IiwiZGVsYXlMb2FkIiwia2V5IiwidmFsdWUiLCJkZWZhdWx0IiwicGFnaW5nIiwicGFnZVNpemUiLCJpbmZpbml0ZSIsInBsYWNlaG9sZGVyIiwiZGRIb3N0Iiwic2hvdyIsImVsIiwibXVsdGlwbGUiLCJzb3J0IiwiaWQiLCJwYXJhbXMiLCJleHRlbmRlZE5hbWUiLCIkZWwiLCJjaG9zZW4iLCJkaXNhYmxlX3NlYXJjaF90aHJlc2hvbGQiLCJhbGxvd19zaW5nbGVfZGVzZWxlY3QiLCJ3aWR0aCIsInN0YXJ0IiwidW5peCIsImVuZCIsInN0YXJ0T2YiLCJlbmRPZiIsInZhbCIsImZvcm1hdCIsInN0YXJ0RGF0ZVBpY2tlciIsImZpZWxkIiwib25TZWxlY3QiLCJob3VyIiwibWludXRlIiwic2Vjb25kIiwiaXNBZnRlciIsImVuZERhdGVQaWNrZXIiLCJzZXREYXRlIiwidG9EYXRlIiwic2V0TWluRGF0ZSIsInRvZ2dsZVN5c3RlbUdyb3VwIiwidG9nZ2xlRWR1Y2F0b3JDb250cm9sIiwib25DdXN0b21Hcm91cExpZmV0aW1lQ2hhbmdlIiwic2hvd0N1c3RvbUdyb3VwTGlmZXRpbWVQYW5lbHMiLCJoaWRlQ3VzdG9tR3JvdXBMaWZldGltZVBhbmVscyIsIm9uUGVycGV0dWFsR3JvdXBDaGFuZ2UiLCJhZGRDbGFzcyIsInJlc2V0RGVmaW5pdGVHcm91cExpZmV0aW1lIiwicmVtb3ZlQ2xhc3MiLCJsaWZldGltZSIsImNvbXB1dGVEZWZpbml0ZUxpZmV0aW1lIiwieWVhclN0YXJ0IiwibW9udGgiLCJhZGQiLCJzdWJ0cmFjdCIsIm5vdCIsInVwZGF0ZU5hbWUiLCJwaWVjZXMiLCJwdXNoIiwicmVwbGFjZSIsInNsaWNlIiwiZ2V0U2VsZWN0ZWQiLCJnbSIsImNvZGVUb0h1bWFuVmFsdWUiLCJmbGF0dGVuIiwidHJpbSIsImpvaW4iLCJiZWZvcmVTYXZlIiwibW9kYWwiLCJwZXJzaXN0Iiwid2FybmluZyIsInRpdGxlIiwiYm9keSIsIm9uIiwiZGVzdHJveSIsInJlc29sdmUiLCJhc3NlbWJsZURhdGEiLCJkYXRhIiwiYXR0cmlidXRlcyIsInN1YmplY3RfaWQiLCJzdWJqZWN0X25hbWUiLCJwcml2YXRlIiwicGFyc2VJbnQiLCJwZXJwZXR1YWxHcm91cHMiLCJfY29kZSIsInJhbmRvbSIsIlN0cmluZyIsIm9uQ3JlYXRlQW5vdGhlciJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsSUFBSUMsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1FLFdBQVdGLFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1HLFNBQVNILFFBQVEsUUFBUixDQUFmO0FBQ0EsSUFBTUksVUFBVUosUUFBUSxTQUFSLENBQWhCO0FBQ0EsSUFBTUssU0FBU0wsUUFBUSxRQUFSLENBQWY7QUFDQSxJQUFNTSxVQUFVTixRQUFRLFVBQVIsQ0FBaEI7O0FBRUEsSUFBTU8sV0FBV1AsUUFBUSxjQUFSLENBQWpCOztBQUVBLElBQU1RLE1BQU1SLFFBQVEsYUFBUixDQUFaO0FBQ0EsSUFBTVMsV0FBV1QsUUFBUSxvQkFBUixDQUFqQjtBQUNBLElBQU1VLFdBQVdWLFFBQVEsb0JBQVIsQ0FBakI7QUFDQSxJQUFNVyxhQUFhWCxRQUFRLGNBQVIsQ0FBbkI7QUFDQSxJQUFNWSxXQUFXWixRQUFRLG9CQUFSLENBQWpCO0FBQ0EsSUFBTWEsYUFBYWIsUUFBUSxzQkFBUixDQUFuQjs7QUFFQSxJQUFNYyxRQUFRWixTQUFTYSxLQUFULENBQWVD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QXZCLEVBQWdDdUksT0FBaEMsQ0FBd0MsSUFBeEMsRUFBOEMsR0FBOUMsQ0FEdUIsR0FDOEIsR0FEOUIsR0FDb0NrQixLQUFLQyxVQUFMLENBQWdCdkosSUFENUU7QUFFQTs7QUFFRCxTQUFPc0osSUFBUDtBQUNBLEVBemIrQjs7QUEyYmhDVSxrQkFBaUIsMkJBQVc7QUFDM0IsU0FBTyxJQUFJakwsVUFBSixFQUFQO0FBQ0E7QUE3YitCLENBQWhCLENBQWpCIiwiZmlsZSI6Imdyb3VwTW9kYWwuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IG1vbWVudCA9IHJlcXVpcmUoXCJtb21lbnRcIik7XG5jb25zdCBQaWthZGF5ID0gcmVxdWlyZShcInBpa2FkYXlcIik7XG5jb25zdCByZXN0ZXIgPSByZXF1aXJlKFwicmVzdGVyXCIpO1xuY29uc3QgUHJvbWlzZSA9IHJlcXVpcmUoXCJibHVlYmlyZFwiKTtcblxuY29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuXG5jb25zdCBBcHAgPSByZXF1aXJlKFwiLi4vLi4vaW5kZXhcIik7XG5jb25zdCBCaWdNb2RhbCA9IHJlcXVpcmUoXCIuLi8uLi9saWIvYmlnTW9kYWxcIik7XG5jb25zdCBncmFkZU1hcCA9IHJlcXVpcmUoXCIuLi8uLi9saWIvZ3JhZGVNYXBcIik7XG5jb25zdCBHcm91cE1vZGVsID0gcmVxdWlyZShcIi4vZ3JvdXBNb2RlbFwiKTtcbmNvbnN0IFNlbGVjdHJhID0gcmVxdWlyZShcIi4uLy4uL2xpYi9zZWxlY3RyYVwiKTtcbmNvbnN0IFNtYWxsTW9kYWwgPSByZXF1aXJlKFwiLi4vLi4vbGliL3NtYWxsTW9kYWxcIik7XG5cbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcblxuY29uc3QgREFURV9GT1JNQVQgPSBcIkREIE1NTSBZWVlZXCI7XG5cbm1vZHVsZS5leHBvcnRzID0gQmlnTW9kYWwuZXh0ZW5kKHtcblx0dWk6IHtcblx0XHRjb2RlOiBcImlucHV0W25hbWU9J2NvZGUnXVwiLFxuXHRcdGF1dG9OYW1lOiBcImlucHV0W25hbWU9J2F1dG9OYW1lJ11cIixcblx0XHRuYW1lOiBcImlucHV0W25hbWU9J25hbWUnXVwiLFxuXHRcdHN1YmplY3Q6IFwiaW5wdXRbbmFtZT0nc3ViamVjdCddXCIsXG5cdFx0bGFuZ3VhZ2U6IFwic2VsZWN0W25hbWU9J2xhbmd1YWdlJ11cIixcblx0XHRncmFkZTogXCJzZWxlY3RbbmFtZT0nZ3JhZGUnXVwiLFxuXHRcdHllYXI6IFwic2VsZWN0W25hbWU9J3llYXInXVwiLFxuXHRcdHllYXJQYW5lbDogXCJkaXYuZ3JvdXAteWVhclwiLFxuXHRcdGN1c3RvbUdyb3VwTGlmZXRpbWU6IFwiaW5wdXRbbmFtZT0nY3VzdG9tR3JvdXBMaWZldGltZSddXCIsXG5cdFx0Y3VzdG9tR3JvdXBMaWZldGltZVBhbmVsczogXCJkaXYuY3VzdG9tLWdyb3VwLWxpZmV0aW1lXCIsXG5cdFx0cGVycGV0dWFsR3JvdXA6IFwiaW5wdXRbbmFtZT0ncGVycGV0dWFsR3JvdXAnXVwiLFxuXHRcdGRlZmluaXRlR3JvdXBMaWZldGltZVBhbmVsczogXCJkaXYuZGVmaW5pdGUtZ3JvdXAtbGlmZXRpbWVcIixcblx0XHRzdGFydERhdGU6IFwiaW5wdXQjc3RhcnQtZGF0ZVwiLFxuXHRcdGVuZERhdGU6IFwiaW5wdXQjZW5kLWRhdGVcIixcblx0XHRtZXRhZGF0YTogXCJpbnB1dFtuYW1lPSdtZXRhZGF0YSddXCIsXG5cdFx0c3lzdGVtR3JvdXA6IFwiaW5wdXRbbmFtZT0nc3lzdGVtJ11cIixcblx0XHRlZHVjYXRvckNvbnRyb2w6IFwiaW5wdXRbbmFtZT0nZWR1Y2F0b3JDb250cm9sJ11cIixcblx0XHRtZW1iZXJQYXJlbnRzOiBcInNlbGVjdFtuYW1lPSdtZW1iZXJQYXJlbnRzJ11cIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNoYW5nZSBAdWkuYXV0b05hbWVcIjogXCJhdXRvTmFtZVwiLFxuXG5cdFx0XCJjaGFuZ2UgQHVpLnN1YmplY3RcIjogXCJ1cGRhdGVOYW1lXCIsXG5cdFx0XCJjaGFuZ2UgQHVpLmxhbmd1YWdlXCI6IFwidXBkYXRlTmFtZVwiLFxuXHRcdFwiY2hhbmdlIEB1aS5ncmFkZVwiOiBcInVwZGF0ZU5hbWVcIixcblx0XHRcImNoYW5nZSBAdWkueWVhclwiOiBcInVwZGF0ZU5hbWVcIixcblx0XHRcImNoYW5nZSBAdWkuY3VzdG9tR3JvdXBMaWZldGltZVwiOiBcIm9uQ3VzdG9tR3JvdXBMaWZldGltZUNoYW5nZVwiLFxuXHRcdFwiY2hhbmdlIEB1aS5wZXJwZXR1YWxHcm91cFwiOiBcIm9uUGVycGV0dWFsR3JvdXBDaGFuZ2VcIixcblx0XHRcImtleXVwIEB1aS5tZXRhZGF0YVwiOiBcInVwZGF0ZU5hbWVcIixcblx0XHRcImNoYW5nZSBAdWkuc3lzdGVtR3JvdXBcIjogXCJ0b2dnbGVTeXN0ZW1Hcm91cFwiLFxuXHRcdFwiY2hhbmdlIEB1aS5lZHVjYXRvckNvbnRyb2xcIjogXCJ0b2dnbGVFZHVjYXRvckNvbnRyb2xcIixcblx0fSxcblxuXHRhY3Rpb25zOiB7XG5cdFx0Y3JlYXRlQW5vdGhlcjogXCJvbkNyZWF0ZUFub3RoZXJcIixcblx0fSxcblxuXHRlcnJvck1hcDoge1xuXHRcdG5hbWU6IHtcblx0XHRcdHBvc2l0aW9uOiBcImJvdHRvbVwiLFxuXHRcdH0sXG5cdH0sXG5cblx0dGVtcGxhdGVDb250ZXh0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gXy5leHRlbmQoe1xuXHRcdFx0eWVhcnM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gXy5yYW5nZSgyMDE0LCBtb21lbnQoKS55ZWFyKCkgKyAyKTtcblx0XHRcdH0sXG5cdFx0XHRjYW5FZGl0OiAoKSA9PiBzZXR0aW5ncy5leHRlcm5hbFN5bmMuZ3JvdXBzICE9PSBcInJ3XCIgfHwgKHRoaXMubW9kZWwuaXNOZXcoKSAmJiBzZXR0aW5ncy5leHRlcm5hbFN5bmMuZ3JvdXBZZWFyRXhjbHVzaW9ucy5sZW5ndGggPiAwKSB8fCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXN5bmNcblx0XHRcdFx0XHQoIXRoaXMubW9kZWwuaXNOZXcoKSAmJiBfLmluY2x1ZGVzKHNldHRpbmdzLmV4dGVybmFsU3luYy5ncm91cFllYXJFeGNsdXNpb25zLCB0aGlzLm1vZGVsLmdldChcInllYXJcIikpKSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zeW5jXG5cdFx0XHRlZGl0YWJsZTogKCkgPT4ge1xuXHRcdFx0XHRjb25zdCB1c2VyID0gcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblxuXHRcdFx0XHRyZXR1cm4gKHRoaXMubW9kZWwuaXNOZXcoKSAmJiByZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmFwaS5ncm91cHMucG9zdCwgdXNlcikpIHx8ICghdGhpcy5tb2RlbC5pc05ldygpICYmIHJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAuYXBpLmdyb3Vwcy5wdXQsIHVzZXIpKTtcblx0XHRcdH0sXG5cdFx0XHRleHRlcm5hbFN5bmM6ICgpID0+IHNldHRpbmdzLmV4dGVybmFsU3luYy5ncm91cHMgPT09IFwicndcIiwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zeW5jXG5cdFx0XHRncm91cFllYXJFeGNsdXNpb25zOiAoKSA9PiBzZXR0aW5ncy5leHRlcm5hbFN5bmMuZ3JvdXBZZWFyRXhjbHVzaW9ucywgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zeW5jXG5cdFx0fSwgQmlnTW9kYWwucHJvdG90eXBlLnRlbXBsYXRlQ29udGV4dC5jYWxsKHRoaXMpKTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRfLmJpbmRBbGwodGhpcyk7XG5cblx0XHR0aGlzLk9wdGlvbnMgPSB7XG5cdFx0XHRjbGFzc2VzOiBbXCJncm91cC1tb2RhbFwiXSxcblx0XHRcdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2dyb3VwbW9kYWwubnVualwiKS5jb250ZW50LFxuXHRcdFx0YnV0dG9uczoge1xuXHRcdFx0XHRjcmVhdGU6IHtcblx0XHRcdFx0XHR0eXBlOiBcImFjY2VwdFwiLFxuXHRcdFx0XHRcdGxhYmVsOiBcIkNyZWF0ZSAmIENsb3NlXCIsXG5cdFx0XHRcdFx0bW9kZTogXCJjcmVhdGVcIixcblx0XHRcdFx0XHRwZXJtaXNzaW9uOiB0aGlzLnBlcm1pc3Npb25Ub0NyZWF0ZS5iaW5kKHRoaXMpLFxuXHRcdFx0XHRcdHNhdmU6IHRydWUsXG5cdFx0XHRcdFx0dmFsaWRhdGU6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGNyZWF0ZUFub3RoZXI6IHtcblx0XHRcdFx0XHR0eXBlOiBcImFjY2VwdFwiLFxuXHRcdFx0XHRcdGxhYmVsOiBcIkNyZWF0ZVwiLFxuXHRcdFx0XHRcdG1vZGU6IFwiY3JlYXRlXCIsXG5cdFx0XHRcdFx0cGVybWlzc2lvbjogdGhpcy5wZXJtaXNzaW9uVG9DcmVhdGUuYmluZCh0aGlzKSxcblx0XHRcdFx0XHRzYXZlOiB0cnVlLFxuXHRcdFx0XHRcdHZhbGlkYXRlOiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR1cGRhdGU6IHtcblx0XHRcdFx0XHR0eXBlOiBcImFjY2VwdFwiLFxuXHRcdFx0XHRcdGxhYmVsOiBcIlVwZGF0ZVwiLFxuXHRcdFx0XHRcdG1vZGU6IFwiZWRpdFwiLFxuXHRcdFx0XHRcdHBlcm1pc3Npb246IHRoaXMucGVybWlzc2lvblRvVXBkYXRlLmJpbmQodGhpcyksXG5cdFx0XHRcdFx0c2F2ZTogIXRoaXMub3B0aW9ucy5kb250U2F2ZSxcblx0XHRcdFx0XHR2YWxpZGF0ZTogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0Y2FuY2VsOiB7XG5cdFx0XHRcdFx0dHlwZTogXCJjYW5jZWxcIixcblx0XHRcdFx0XHRsYWJlbDogXCJDYW5jZWxcIixcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XHRkYXRhTm91bjogXCJncm91cFwiICsgKHRoaXMubW9kZWwuaXNOZXcoKSA/IFwiXCIgOiBcIjogXCIgKyB0aGlzLm1vZGVsLmdldChcIm5hbWVcIikpLFxuXHRcdH07XG5cblx0XHRpZiAoIXRoaXMubW9kZWwuaGFzKFwieWVhclwiKSlcblx0XHRcdHRoaXMubW9kZWwuc2V0KHsgeWVhcjogbW9tZW50KCkueWVhcigpIH0pO1xuXG5cdFx0dGhpcy51aSA9IF8uZXh0ZW5kKHRoaXMudWksIEJpZ01vZGFsLnByb3RvdHlwZS51aSk7XG5cdFx0dGhpcy5ldmVudHMgPSBfLmV4dGVuZCh0aGlzLmV2ZW50cywgQmlnTW9kYWwucHJvdG90eXBlLmV2ZW50cyk7XG5cblx0XHRCaWdNb2RhbC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMpO1xuXHR9LFxuXG5cdHBlcm1pc3Npb25Ub0NyZWF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAuYXBpLmdyb3Vwcy5wb3N0LCByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpKTtcblx0fSxcblxuXHRwZXJtaXNzaW9uVG9VcGRhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiByZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmFwaS5ncm91cHMucG9zdCwgcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKSk7XG5cdH0sXG5cblx0cmVuZGVyRm9ybTogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgbmFtZSBtYXRjaGVzIHRoZSBhdXRvZ2VuZXJhdGVkIG9uZS4gSWYgbm90LCBhc3N1bWUgYSBjdXN0b20gbmFtZSBhbmQgY2hlY2sgdGhlIGJveC5cblx0XHRpZiAoIXRoaXMubW9kZWwuaXNOZXcoKSAmJiB0aGlzLmdlbmVyYXRlTmFtZSgpICE9PSB0aGlzLm1vZGVsLmdldChcIm5hbWVcIikpIHtcblx0XHRcdHRoaXMudWkuYXV0b05hbWUucHJvcChcImNoZWNrZWRcIiwgdHJ1ZSk7XG5cdFx0XHR0aGlzLnVpLm5hbWUuYXR0cihcInJlYWRvbmx5XCIsIGZhbHNlKTtcblx0XHR9XG5cblx0XHR0aGlzLnN1YmplY3RTZWxlY3QgPSBuZXcgU2VsZWN0cmEoe1xuXHRcdFx0c2VydmVyOiB7XG5cdFx0XHRcdGZldGNoOiBgJHtzZXR0aW5ncy51cmxSb290fS9hcGkvMS4wL2RhdGEvc3ViamVjdHNgLFxuXHRcdFx0XHRkZWxheUxvYWQ6IHRydWUsXG5cdFx0XHRcdGtleTogXCJzdWJqZWN0X2lkXCIsXG5cdFx0XHRcdHZhbHVlOiBcInN1YmplY3RcIixcblx0XHRcdFx0ZGVmYXVsdDoge1xuXHRcdFx0XHRcdGtleTogdGhpcy5tb2RlbC5nZXQoXCJzdWJqZWN0XCIpLFxuXHRcdFx0XHRcdHZhbHVlOiB0aGlzLm1vZGVsLmdldChcInN1YmplY3RfbmFtZVwiKSxcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0cGFnZVNpemU6IDIwLFxuXHRcdFx0XHRpbmZpbml0ZTogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0XHRwbGFjZWhvbGRlcjogXCJObyBzdWJqZWN0IHNlbGVjdGVkXCIsXG5cdFx0XHRkZEhvc3Q6IFwiLm1vZGFsLWNvbnRhaW5lclwiLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5zdWJqZWN0U2VsZWN0LnNob3coeyBlbDogdGhpcy51aS5zdWJqZWN0IH0pO1xuXG5cdFx0Y29uc3QgbWVtYmVyUGFyZW50cyA9IG5ldyBTZWxlY3RyYSh7XG5cdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdHNvcnQ6IHRydWUsXG5cdFx0XHRzZXJ2ZXI6IHtcblx0XHRcdFx0a2V5OiBcImNvZGVcIixcblx0XHRcdFx0dmFsdWU6IFwibmFtZVwiLFxuXHRcdFx0XHRkZWxheUxvYWQ6IHRydWUsXG5cdFx0XHRcdGZldGNoOiBgJHtzZXR0aW5ncy51cmxSb290fS9hcGkvMS4wL2dyb3Vwc2AsXG5cdFx0XHRcdGRlZmF1bHQ6IHtcblx0XHRcdFx0XHRmZXRjaDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FjYWNpYS9ncm91cHMvXCIgKyB0aGlzLm1vZGVsLmlkICsgXCIvbWVtYmVyUGFyZW50c1wiLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRwYXJhbXM6IHtcblx0XHRcdFx0XHRleHRlbmRlZE5hbWU6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdHBhZ2VTaXplOiAzMCxcblx0XHRcdFx0aW5maW5pdGU6IHRydWUsXG5cdFx0XHR9LFxuXHRcdFx0cGxhY2Vob2xkZXI6IFwiTm8gbWVtYmVyc2hpcCBwYXJlbnRzIHNlbGVjdGVkXCIsXG5cdFx0XHRkZEhvc3Q6IFwiLm1vZGFsLWNvbnRhaW5lclwiLFxuXHRcdH0pO1xuXG5cdFx0bWVtYmVyUGFyZW50cy5zaG93KHsgZWw6IHRoaXMudWkubWVtYmVyUGFyZW50cyB9KTtcblxuXHRcdCQoXCJzZWxlY3Q6bm90KFtuYW1lPSdtZW1iZXJQYXJlbnRzJ10pXCIsIHRoaXMuJGVsKS5jaG9zZW4oe1xuXHRcdFx0ZGlzYWJsZV9zZWFyY2hfdGhyZXNob2xkOiAxMixcblx0XHRcdGFsbG93X3NpbmdsZV9kZXNlbGVjdDogdHJ1ZSxcblx0XHRcdHdpZHRoOiBcIjEwMCVcIixcblx0XHR9KTtcblxuXHRcdC8vIFN0eWxlIGFuZCBwb3B1bGF0ZSB0aGUgc3RhcnRpbmcgYW5kIGVuZGluZyBkYXRlIGlucHV0c1xuXHRcdGNvbnN0IHN0YXJ0ID0gKCF0aGlzLm1vZGVsLmhhcyhcInN0YXJ0XCIpIHx8IHRoaXMubW9kZWwuZ2V0KFwic3RhcnRcIikgPT09IG51bGwgfHwgdGhpcy5tb2RlbC5nZXQoXCJzdGFydFwiKSA9PT0gLTEpID9cblx0XHRcdG1vbWVudCgpIDogbW9tZW50LnVuaXgodGhpcy5tb2RlbC5nZXQoXCJzdGFydFwiKSk7XG5cdFx0Y29uc3QgZW5kID0gKCF0aGlzLm1vZGVsLmhhcyhcImVuZFwiKSB8fCB0aGlzLm1vZGVsLmdldChcImVuZFwiKSA9PT0gbnVsbCB8fCB0aGlzLm1vZGVsLmdldChcImVuZFwiKSA9PT0gLTEpID9cblx0XHRcdG1vbWVudChzdGFydCkgOiBtb21lbnQudW5peCh0aGlzLm1vZGVsLmdldChcImVuZFwiKSk7XG5cblx0XHRpZiAodGhpcy5tb2RlbC5pc05ldygpKSB7XG5cdFx0XHRzdGFydC5zdGFydE9mKFwiZGF5XCIpO1xuXHRcdFx0ZW5kLmVuZE9mKFwiZGF5XCIpO1xuXHRcdH1cblxuXHRcdHRoaXMudWkuc3RhcnREYXRlLnZhbChzdGFydC5mb3JtYXQoREFURV9GT1JNQVQpKTtcblx0XHR0aGlzLnVpLmVuZERhdGUudmFsKGVuZC5mb3JtYXQoREFURV9GT1JNQVQpKTtcblxuXHRcdHRoaXMuc3RhcnREYXRlUGlja2VyID0gbmV3IFBpa2FkYXkoe1xuXHRcdFx0ZmllbGQ6IHRoaXMudWkuc3RhcnREYXRlLmdldCgwKSxcblx0XHRcdGZvcm1hdDogREFURV9GT1JNQVQsXG5cblx0XHRcdG9uU2VsZWN0OiAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHN0YXJ0RGF0ZSA9IG1vbWVudCh0aGlzLnVpLnN0YXJ0RGF0ZS52YWwoKSwgREFURV9GT1JNQVQpLmhvdXIoMCkubWludXRlKDApLnNlY29uZCgwKTtcblx0XHRcdFx0Y29uc3QgZW5kRGF0ZSA9IG1vbWVudCh0aGlzLnVpLmVuZERhdGUudmFsKCksIERBVEVfRk9STUFUKS5ob3VyKDApLm1pbnV0ZSgwKS5zZWNvbmQoMCk7XG5cblx0XHRcdFx0aWYgKHN0YXJ0RGF0ZS5pc0FmdGVyKGVuZERhdGUpKVxuXHRcdFx0XHRcdHRoaXMuZW5kRGF0ZVBpY2tlci5zZXREYXRlKHN0YXJ0RGF0ZS50b0RhdGUoKSk7XG5cblx0XHRcdFx0dGhpcy5lbmREYXRlUGlja2VyLnNldE1pbkRhdGUoc3RhcnREYXRlLnRvRGF0ZSgpKTtcblx0XHRcdH0sXG5cdFx0fSk7XG5cblx0XHR0aGlzLmVuZERhdGVQaWNrZXIgPSBuZXcgUGlrYWRheSh7XG5cdFx0XHRmaWVsZDogdGhpcy51aS5lbmREYXRlLmdldCgwKSxcblx0XHRcdGZvcm1hdDogREFURV9GT1JNQVQsXG5cblx0XHRcdG9uU2VsZWN0OiAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHN0YXJ0RGF0ZSA9IG1vbWVudCh0aGlzLnVpLnN0YXJ0RGF0ZS52YWwoKSwgREFURV9GT1JNQVQpLmhvdXIoMCkubWludXRlKDApLnNlY29uZCgwKTtcblx0XHRcdFx0Y29uc3QgZW5kRGF0ZSA9IG1vbWVudCh0aGlzLnVpLmVuZERhdGUudmFsKCksIERBVEVfRk9STUFUKS5ob3VyKDApLm1pbnV0ZSgwKS5zZWNvbmQoMCk7XG5cblx0XHRcdFx0aWYgKHN0YXJ0RGF0ZS5pc0FmdGVyKGVuZERhdGUpKVxuXHRcdFx0XHRcdHRoaXMuc3RhcnREYXRlUGlja2VyLnNldERhdGUoZW5kRGF0ZS50b0RhdGUoKSk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9LFxuXG5cdHRvZ2dsZVN5c3RlbUdyb3VwOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy51aS5zeXN0ZW1Hcm91cC5wcm9wKFwiY2hlY2tlZFwiKSlcblx0XHRcdHRoaXMudWkuZWR1Y2F0b3JDb250cm9sLnByb3AoXCJkaXNhYmxlZFwiLCB0cnVlKS5wcm9wKFwiY2hlY2tlZFwiLCBmYWxzZSk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy51aS5lZHVjYXRvckNvbnRyb2wucHJvcChcImRpc2FibGVkXCIsIGZhbHNlKS5wcm9wKFwiY2hlY2tlZFwiLCBmYWxzZSk7XG5cdH0sXG5cblx0dG9nZ2xlRWR1Y2F0b3JDb250cm9sOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy51aS5lZHVjYXRvckNvbnRyb2wucHJvcChcImNoZWNrZWRcIikpXG5cdFx0XHR0aGlzLnVpLnN5c3RlbUdyb3VwLnByb3AoXCJkaXNhYmxlZFwiLCB0cnVlKS5wcm9wKFwiY2hlY2tlZFwiLCBmYWxzZSk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy51aS5zeXN0ZW1Hcm91cC5wcm9wKFwiZGlzYWJsZWRcIiwgZmFsc2UpLnByb3AoXCJjaGVja2VkXCIsIGZhbHNlKTtcblx0fSxcblxuXHRvbkN1c3RvbUdyb3VwTGlmZXRpbWVDaGFuZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLnVpLmN1c3RvbUdyb3VwTGlmZXRpbWUucHJvcChcImNoZWNrZWRcIikpXG5cdFx0XHR0aGlzLnNob3dDdXN0b21Hcm91cExpZmV0aW1lUGFuZWxzKCk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5oaWRlQ3VzdG9tR3JvdXBMaWZldGltZVBhbmVscygpO1xuXHR9LFxuXG5cdG9uUGVycGV0dWFsR3JvdXBDaGFuZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLnVpLnBlcnBldHVhbEdyb3VwLnByb3AoXCJjaGVja2VkXCIpKSB7XG5cdFx0XHR0aGlzLnVpLmRlZmluaXRlR3JvdXBMaWZldGltZVBhbmVscy5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5yZXNldERlZmluaXRlR3JvdXBMaWZldGltZSgpO1xuXHRcdFx0dGhpcy51aS5kZWZpbml0ZUdyb3VwTGlmZXRpbWVQYW5lbHMucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblx0fSxcblxuXHRyZXNldERlZmluaXRlR3JvdXBMaWZldGltZTogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgbGlmZXRpbWUgPSB0aGlzLmNvbXB1dGVEZWZpbml0ZUxpZmV0aW1lKCk7XG5cblx0XHR0aGlzLnVpLnN0YXJ0RGF0ZS52YWwobW9tZW50LnVuaXgobGlmZXRpbWUuc3RhcnQpLmZvcm1hdChEQVRFX0ZPUk1BVCkpO1xuXHRcdHRoaXMuc3RhcnREYXRlUGlja2VyLnNldERhdGUobW9tZW50LnVuaXgobGlmZXRpbWUuc3RhcnQpLnRvRGF0ZSgpKTtcblx0XHR0aGlzLnVpLmVuZERhdGUudmFsKG1vbWVudC51bml4KGxpZmV0aW1lLmVuZCkuZm9ybWF0KERBVEVfRk9STUFUKSk7XG5cdFx0dGhpcy5lbmREYXRlUGlja2VyLnNldERhdGUobW9tZW50LnVuaXgobGlmZXRpbWUuZW5kKS50b0RhdGUoKSk7XG5cdH0sXG5cblx0Y29tcHV0ZURlZmluaXRlTGlmZXRpbWU6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIEEgZ3JvdXAncyBsaWZldGltZSBzdGFydHMgYXQgaXRzIHRhcmdldCB5ZWFyIHBsdXMgc3RhcnRpbmcgbW9udGgsIHdpdGggMCBiZWluZyBKYW51YXJ5XG5cdFx0Y29uc3QgeWVhclN0YXJ0ID0gbW9tZW50KCkueWVhcih0aGlzLnVpLnllYXIudmFsKCkpLm1vbnRoKHNldHRpbmdzLnllYXJTdGFydCkuc3RhcnRPZihcIm1vbnRoXCIpLnN0YXJ0T2YoXCJkYXlcIik7XG5cdFx0bGV0IGVuZDtcblx0XHRjb25zdCBzdGFydCA9IHllYXJTdGFydC51bml4KCk7XG5cblx0XHRpZiAoc3RhcnQgPj0gMjExNTk0NzY0Nykge1xuXHRcdFx0ZW5kID0gMjE0NzQ4MzY0Nztcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHQvLyBBZGQgb25lIHllYXIgdG8gdGhlIHN0YXJ0IGFuZCBzdWJ0cmFjdCBvbmUgc2Vjb25kIHRvIG9idGFpbiB0aGUgZW5kIG9mIHRoZSBncm91cCdzIHllYXItYm91bmQgbGlmZXRpbWVcblx0XHRcdHllYXJTdGFydC5hZGQoMSwgXCJ5ZWFyc1wiKS5zdWJ0cmFjdCgxLCBcInNlY29uZHNcIik7XG5cdFx0XHRlbmQgPSB5ZWFyU3RhcnQudW5peCgpO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRlbmQsXG5cdFx0XHRzdGFydCxcblx0XHR9O1xuXHR9LFxuXG5cdGhpZGVDdXN0b21Hcm91cExpZmV0aW1lUGFuZWxzOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmN1c3RvbUdyb3VwTGlmZXRpbWVQYW5lbHMuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkueWVhclBhbmVsLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRzaG93Q3VzdG9tR3JvdXBMaWZldGltZVBhbmVsczogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS55ZWFyUGFuZWwuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0aWYgKHRoaXMudWkucGVycGV0dWFsR3JvdXAucHJvcChcImNoZWNrZWRcIikpXG5cdFx0XHR0aGlzLnVpLmN1c3RvbUdyb3VwTGlmZXRpbWVQYW5lbHMubm90KHRoaXMudWkuZGVmaW5pdGVHcm91cExpZmV0aW1lUGFuZWxzKS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy51aS5jdXN0b21Hcm91cExpZmV0aW1lUGFuZWxzLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRhdXRvTmFtZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5uYW1lLnByb3AoXCJyZWFkb25seVwiLCAhdGhpcy51aS5hdXRvTmFtZS5wcm9wKFwiY2hlY2tlZFwiKSk7XG5cdFx0aWYgKCF0aGlzLnVpLmF1dG9OYW1lLnByb3AoXCJjaGVja2VkXCIpKVxuXHRcdFx0dGhpcy51cGRhdGVOYW1lKCk7XG5cdH0sXG5cblx0dXBkYXRlTmFtZTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMudWkuYXV0b05hbWUucHJvcChcImNoZWNrZWRcIikpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLnVpLm5hbWUudmFsKHRoaXMuZ2VuZXJhdGVOYW1lKCkpO1xuXHR9LFxuXG5cdGdlbmVyYXRlTmFtZTogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgcGllY2VzID0gW107XG5cblx0XHRpZiAodGhpcy51aS5sYW5ndWFnZS52YWwoKSlcblx0XHRcdHBpZWNlcy5wdXNoKFwiW1wiICsgdGhpcy51aS5sYW5ndWFnZS52YWwoKS5yZXBsYWNlKFwiSXNpXCIsIFwiXCIpLnNsaWNlKDAsIDMpICsgXCJdXCIpO1xuXG5cdFx0aWYgKHRoaXMudWkuc3ViamVjdC52YWwoKSkge1xuXHRcdFx0bGV0IHZhbCA9IHRoaXMuc3ViamVjdFNlbGVjdC5nZXRTZWxlY3RlZCgpLnN1YmplY3Q7XG5cblx0XHRcdGlmIChfLmluY2x1ZGVzKHZhbCwgXCI6XCIpKSB7XG5cdFx0XHRcdHZhbCA9IHZhbC5yZXBsYWNlKFwiSG9tZSBMYW5ndWFnZVwiLCBcIkhMXCIpO1xuXHRcdFx0XHR2YWwgPSB2YWwucmVwbGFjZShcIkZpcnN0IEFkZGl0aW9uYWwgTGFuZ3VhZ2VcIiwgXCJGQUxcIik7XG5cdFx0XHRcdHZhbCA9IHZhbC5yZXBsYWNlKFwiU2Vjb25kIEFkZGl0aW9uYWwgTGFuZ3VhZ2VcIiwgXCJTQUxcIik7XG5cdFx0XHR9XG5cblx0XHRcdHBpZWNlcy5wdXNoKHZhbCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZ20gPSBncmFkZU1hcC5jb2RlVG9IdW1hblZhbHVlKF8uZmxhdHRlbihbdGhpcy51aS5ncmFkZS52YWwoKV0pKTtcblxuXHRcdGlmIChnbSlcblx0XHRcdHBpZWNlcy5wdXNoKFwiKFwiICsgZ20gKyBcIilcIik7XG5cblx0XHRpZiAodGhpcy51aS55ZWFyLnZhbCgpKVxuXHRcdFx0cGllY2VzLnB1c2godGhpcy51aS55ZWFyLnZhbCgpKTtcblxuXHRcdGlmICh0aGlzLnVpLm1ldGFkYXRhLnZhbCgpKVxuXHRcdFx0cGllY2VzLnB1c2godGhpcy51aS5tZXRhZGF0YS52YWwoKSk7XG5cblx0XHRyZXR1cm4gXy50cmltKHBpZWNlcy5qb2luKFwiIFwiKSk7XG5cdH0sXG5cblx0YmVmb3JlU2F2ZTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLm1vZGVsLmdldChcIm1lbWJlclBhcmVudHNcIikgfHwgdGhpcy5tb2RlbC5nZXQoXCJtZW1iZXJQYXJlbnRzXCIpLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0aWYgKCh0aGlzLnVpLm1lbWJlclBhcmVudHMudmFsKCkgfHwgW10pLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IG1vZGFsID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0XHRcdFx0cGVyc2lzdDogdHJ1ZSxcblx0XHRcdFx0XHRcdHdhcm5pbmc6IHRydWUsXG5cdFx0XHRcdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmFsIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJy8+IE1lbWJlciBJbmhlcml0YW5jZSBDaGFuZ2VcIixcblx0XHRcdFx0XHRcdGJvZHk6IGA8cD5Zb3UgaGF2ZSBzZXQgYXQgbGVhc3Qgb25lIGdyb3VwIGFzIGEgbWVtYmVyc2hpcCBwYXJlbnQgZm9yIHRoaXMgZ3JvdXAuPC9wPlxuXHRcdFx0XHRcdFx0XHRcdDxwPk9uY2UgdGhpcyBjaGFuZ2UgaXMgY29tbWl0dGVkLCBhbGwgbWVtYmVycyBjdXJyZW50bHkgaW4gdGhlIGdyb3VwIHRoYXQgYXJlIE5PVCBpbiB0aGUgbWVtYmVyc2hpcCBwYXJlbnRzIHdpbGwgYmUgUkVNT1ZFRC48L3A+XG5cdFx0XHRcdFx0XHRcdFx0PHA+QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIG1ha2UgdGhpcyBjaGFuZ2U/PC9wPmAsXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRtb2RhbC5vbihcImJ1dHRvbjpva1wiLCAoKSA9PiB7XG5cdFx0XHRcdFx0XHRtb2RhbC5kZXN0cm95KCk7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKHRydWUpO1xuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0bW9kYWwub24oXCJidXR0b246Y2FuY2VsXCIsICgpID0+IHtcblx0XHRcdFx0XHRcdG1vZGFsLmRlc3Ryb3koKTtcblx0XHRcdFx0XHRcdHJlc29sdmUoZmFsc2UpO1xuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0bW9kYWwuc2hvdygpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHRhc3NlbWJsZURhdGE6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGRhdGEgPSB7fTtcblxuXHRcdGRhdGEuYXR0cmlidXRlcyA9IHtcblx0XHRcdHN1YmplY3Q6IHRoaXMuc3ViamVjdFNlbGVjdC5nZXRTZWxlY3RlZCgpLnN1YmplY3RfaWQsXG5cdFx0XHRzdWJqZWN0X25hbWU6IHRoaXMuc3ViamVjdFNlbGVjdC5nZXRTZWxlY3RlZCgpLnN1YmplY3QsXG5cdFx0XHRsYW5ndWFnZTogdGhpcy51aS5sYW5ndWFnZS52YWwoKSxcblx0XHRcdGdyYWRlOiB0aGlzLnVpLmdyYWRlLnZhbCgpLFxuXHRcdFx0bWV0YWRhdGE6IF8udHJpbSh0aGlzLnVpLm1ldGFkYXRhLnZhbCgpKSxcblx0XHRcdG5hbWU6IF8udHJpbSh0aGlzLnVpLm5hbWUudmFsKCkpLFxuXHRcdFx0cHJpdmF0ZTogZmFsc2UsXG5cdFx0XHRzeXN0ZW1Hcm91cDogdGhpcy51aS5zeXN0ZW1Hcm91cC5wcm9wKFwiY2hlY2tlZFwiKSxcblx0XHRcdGVkdWNhdG9yQ29udHJvbDogdGhpcy51aS5lZHVjYXRvckNvbnRyb2wucHJvcChcImNoZWNrZWRcIiksXG5cdFx0XHRtZW1iZXJQYXJlbnRzOiB0aGlzLnVpLm1lbWJlclBhcmVudHMudmFsKCksXG5cdFx0fTtcblxuXHRcdGlmIChkYXRhLmF0dHJpYnV0ZXMubWVtYmVyUGFyZW50cyAmJiBkYXRhLmF0dHJpYnV0ZXMubWVtYmVyUGFyZW50cy5sZW5ndGggPT09IDApXG5cdFx0XHRkYXRhLmF0dHJpYnV0ZXMubWVtYmVyUGFyZW50cyA9IG51bGw7XG5cblx0XHQvLyBTZXQgdGhlIGdyb3VwJ3MgeWVhciBpZiB0aGUgZ3JvdXAgaXMgbm90IHN5bmNocm9uaXNlZCB3aXRoIGFuIG91dHNpZGUgc291cmNlIG9yIHRoZSBncm91cCdzIHllYXIgaXMgZXhjbHVkZWRcblx0XHQvLyBmcm9tIHN5bmNocm9uaXNhdGlvblxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zeW5jXG5cdFx0aWYgKHNldHRpbmdzLmV4dGVybmFsU3luYy5ncm91cHMgIT09IFwicndcIiB8fCBfLmluY2x1ZGVzKHNldHRpbmdzLmV4dGVybmFsU3luYy5ncm91cFllYXJFeGNsdXNpb25zLCBwYXJzZUludCh0aGlzLnVpLnllYXIudmFsKCksIDEwKSkpXG5cdFx0XHRkYXRhLmF0dHJpYnV0ZXMueWVhciA9IHRoaXMudWkueWVhci52YWwoKTtcblxuXHRcdC8vIFNldCB0aGUgZ3JvdXAncyBjdXN0b20gbGlmZXRpbWUgb3B0aW9ucyBpZmYgdGhlIGdyb3VwIGlzIG5vdCBzeW5jaHJvbmlzZWQgd2l0aCBhbiBvdXRzaWRlIHNvdXJjZVxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zeW5jXG5cdFx0aWYgKHNldHRpbmdzLmV4dGVybmFsU3luYy5ncm91cHMgIT09IFwicndcIikge1xuXHRcdFx0bGV0IHN0YXJ0O1xuXHRcdFx0bGV0IGVuZDtcblxuXHRcdFx0aWYgKHNldHRpbmdzLnBlcnBldHVhbEdyb3Vwcykge1xuXHRcdFx0XHRzdGFydCA9IDA7XG5cdFx0XHRcdGVuZCA9IDIxNDc0ODM2NDc7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmICh0aGlzLnVpLmN1c3RvbUdyb3VwTGlmZXRpbWUucHJvcChcImNoZWNrZWRcIikpIHtcblx0XHRcdFx0aWYgKHRoaXMudWkucGVycGV0dWFsR3JvdXAucHJvcChcImNoZWNrZWRcIikpIHtcblx0XHRcdFx0XHRzdGFydCA9IDA7XG5cdFx0XHRcdFx0ZW5kID0gMjE0NzQ4MzY0Nztcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRzdGFydCA9IG1vbWVudCh0aGlzLnVpLnN0YXJ0RGF0ZS52YWwoKSwgREFURV9GT1JNQVQpLnN0YXJ0T2YoXCJkYXlcIikudW5peCgpO1xuXHRcdFx0XHRcdGlmIChzdGFydCA8IDApXG5cdFx0XHRcdFx0XHRzdGFydCA9IDA7XG5cblx0XHRcdFx0XHRlbmQgPSBtb21lbnQodGhpcy51aS5lbmREYXRlLnZhbCgpLCBEQVRFX0ZPUk1BVCkuZW5kT2YoXCJkYXlcIikudW5peCgpO1xuXHRcdFx0XHRcdGlmIChlbmQgPiAyMTQ3NDgzNjQ3KVxuXHRcdFx0XHRcdFx0ZW5kID0gMjE0NzQ4MzY0Nztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdGNvbnN0IGxpZmV0aW1lID0gdGhpcy5jb21wdXRlRGVmaW5pdGVMaWZldGltZSgpO1xuXG5cdFx0XHRcdHN0YXJ0ID0gbGlmZXRpbWUuc3RhcnQ7XG5cdFx0XHRcdGVuZCA9IGxpZmV0aW1lLmVuZDtcblx0XHRcdH1cblxuXHRcdFx0ZGF0YS5hdHRyaWJ1dGVzLnN0YXJ0ID0gc3RhcnQ7XG5cdFx0XHRkYXRhLmF0dHJpYnV0ZXMuZW5kID0gZW5kO1xuXHRcdFx0ZGF0YS5hdHRyaWJ1dGVzLnllYXIgPSBtb21lbnQudW5peChzdGFydCkueWVhcigpO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoaXMgaXMgYSBuZXcgZ3JvdXAsIHRoZW4gZ2VuZXJhdGUgYSBjb2RlIGZvciB0aGUgZ3JvdXBcblx0XHRpZiAodGhpcy5tb2RlbC5pc05ldygpKSB7XG5cdFx0XHRkYXRhLmF0dHJpYnV0ZXMuX2NvZGUgPSBfLnJhbmRvbSgxMDAwMCkgKyBcIi1cIiArIGRhdGEuYXR0cmlidXRlcy5ncmFkZSArIFwiLVwiICtcblx0XHRcdFx0U3RyaW5nKGRhdGEuYXR0cmlidXRlcy5zdWJqZWN0KS5yZXBsYWNlKC8gL2csIFwiX1wiKSArIFwiLVwiICsgZGF0YS5hdHRyaWJ1dGVzLnllYXI7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cdH0sXG5cblx0b25DcmVhdGVBbm90aGVyOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gbmV3IEdyb3VwTW9kZWwoKTtcblx0fSxcbn0pOyJdfQ==",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\n\nvar settings = require(\"app-settings\");\n\nvar gradeMap = require(\"../../lib/gradeMap\");\n\nmodule.exports = Backbone.Epoxy.Model.extend({\n\tdefaults: function defaults() {\n\t\tvar year = moment().year();\n\n\t\t// A group's lifetime starts at its target year plus starting month, with 0 being January\n\t\tvar startYear = moment().year(year).month(settings.yearStart).startOf(\"month\").startOf(\"day\");\n\t\tvar start = startYear.unix();\n\n\t\t// Add one year to the start and subtract one second to obtain the end of the group's year-bound lifetime\n\t\tstartYear.add(1, \"years\").subtract(1, \"seconds\");\n\t\tvar end = startYear.unix();\n\n\t\treturn {\n\t\t\tyear: year,\n\t\t\tstart: start,\n\t\t\tend: end\n\t\t};\n\t},\n\n\tidAttribute: \"code\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/groups\";\n\t},\n\n\tcomputeds: {\n\t\tisLifetimePerpetual: function isLifetimePerpetual() {\n\t\t\treturn this.get(\"start\") === 0 && this.get(\"end\") === 2147483647;\n\t\t},\n\n\t\tisLifetimeCustomised: function isLifetimeCustomised() {\n\t\t\t// A group's lifetime starts at its target year plus starting month, with 0 being January\n\t\t\tvar start = moment().year(this.get(\"year\")).month(settings.yearStart).startOf(\"month\").startOf(\"day\");\n\t\t\tvar startUnix = start.unix();\n\n\t\t\t// Add one year to the start and subtract one second to obtain the end of the group's year-bound lifetime\n\t\t\tstart.add(1, \"years\").subtract(1, \"seconds\");\n\t\t\tvar endUnix = start.unix();\n\n\t\t\t// The group's lifetime has been customised if the group's start and end timestamps are not the same as\n\t\t\t// the computed target year of the group\n\t\t\treturn !(this.get(\"start\") === startUnix && this.get(\"end\") === endUnix);\n\t\t},\n\n\t\tlifetimeStart: function lifetimeStart() {\n\t\t\treturn moment.unix(this.get(\"start\")).format(\"DD MMM YYYY\");\n\t\t},\n\n\t\tlifetimeEnd: function lifetimeEnd() {\n\t\t\treturn moment.unix(this.get(\"end\")).format(\"DD MMM YYYY\");\n\t\t},\n\n\t\tgroupGrade: function groupGrade() {\n\t\t\treturn gradeMap.codeToHumanValue(this.get(\"grade\"), { lexical: true });\n\t\t},\n\n\t\tgroupYear: function groupYear() {\n\t\t\tif (this.get(\"start\") === 0 && this.get(\"end\") === 2147483647) return \"(all)\";\n\t\t\treturn this.get(\"year\");\n\t\t},\n\n\t\tgroupChanged: function groupChanged() {\n\t\t\treturn this.get(\"updated\") || this.get(\"created\");\n\t\t},\n\n\t\tgroupSource: function groupSource() {\n\t\t\tswitch (this.get(\"source\")) {\n\t\t\t\tcase \"moodle\":\n\t\t\t\t\treturn \"Moodle\";\n\t\t\t\tcase \"hermes\":\n\t\t\t\t\treturn \"Hermes\";\n\t\t\t\tdefault:\n\t\t\t\t\treturn \"Moodle\";\n\t\t\t}\n\t\t},\n\n\t\tisTokenCancelled: function isTokenCancelled() {\n\t\t\tvar result = false;\n\n\t\t\tif (this.has(\"tokens\") && this.get(\"tokens\").length > 0) {\n\t\t\t\tvar tokens = this.get(\"tokens\");\n\t\t\t\tvar token = tokens[tokens.length - 1];\n\n\t\t\t\tresult = Boolean(token.cancelled);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\n\t\tisTokenExpired: function isTokenExpired() {\n\t\t\tvar result = false;\n\n\t\t\tif (this.has(\"tokens\") && this.get(\"tokens\").length > 0) {\n\t\t\t\tvar tokens = this.get(\"tokens\");\n\t\t\t\tvar token = tokens[tokens.length - 1];\n\n\t\t\t\tif (token.lifetime) {\n\t\t\t\t\tvar expirationDate = moment.unix(token.created).add(moment.duration(token.lifetime));\n\n\t\t\t\t\tresult = moment().isAfter(expirationDate);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t},\n\n\tvalidate: function validate(attributes, options) {\n\t\tvar errors = {};\n\n\t\tif ((!options.validateAttributes || options.validateAttributes.name) && (!attributes.name || !_.trim(attributes.name))) errors.name = \"You must provide a name for the group\";\n\n\t\tif (_.keys(errors).length > 0) return errors;\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImdyb3VwTW9kZWwuanMiXSwibmFtZXMiOlsiXyIsInJlcXVpcmUiLCJCYWNrYm9uZSIsIm1vbWVudCIsInNldHRpbmdzIiwiZ3JhZGVNYXAiLCJtb2R1bGUiLCJleHBvcnRzIiwiRXBveHkiLCJNb2RlbCIsImV4dGVuZCIsImRlZmF1bHRzIiwieWVhciIsInN0YXJ0WWVhciIsIm1vbnRoIiwieWVhclN0YXJ0Iiwic3RhcnRPZiIsInN0YXJ0IiwidW5peCIsImFkZCIsInN1YnRyYWN0IiwiZW5kIiwiaWRBdHRyaWJ1dGUiLCJ1cmxSb290IiwiY29tcHV0ZWRzIiwiaXNMaWZldGltZVBlcnBldHVhbCIsImdldCIsImlzTGlmZXRpbWVDdXN0b21pc2VkIiwic3RhcnRVbml4IiwiZW5kVW5peCIsImxpZmV0aW1lU3RhcnQiLCJmb3JtYXQiLCJsaWZldGltZUVuZCIsImdyb3VwR3JhZGUiLCJjb2RlVG9IdW1hblZhbHVlIiwibGV4aWNhbCIsImdyb3VwWWVhciIsImdyb3VwQ2hhbmdlZCIsImdyb3VwU291cmNlIiwiaXNUb2tlbkNhbmNlbGxlZCIsInJlc3VsdCIsImhhcyIsImxlbmd0aCIsInRva2VucyIsInRva2VuIiwiQm9vbGVhbiIsImNhbmNlbGxlZCIsImlzVG9rZW5FeHBpcmVkIiwibGlmZXRpbWUiLCJleHBpcmF0aW9uRGF0ZSIsImNyZWF0ZWQiLCJkdXJhdGlvbiIsImlzQWZ0ZXIiLCJ2YWxpZGF0ZSIsImF0dHJpYnV0ZXMiLCJvcHRpb25zIiwiZXJyb3JzIiwidmFsaWRhdGVBdHRyaWJ1dGVzIiwibmFtZSIsInRyaW0iLCJrZXlzIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLFdBQVdELFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1FLFNBQVNGLFFBQVEsUUFBUixDQUFmOztBQUVBLElBQU1HLFdBQVdILFFBQVEsY0FBUixDQUFqQjs7QUFFQSxJQUFNSSxXQUFXSixRQUFRLG9CQUFS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QU1DLFNBQVMsRUFBZjs7QUFFQSxNQUFJLENBQUMsQ0FBQ0QsUUFBUUUsa0JBQVQsSUFBK0JGLFFBQVFFLGtCQUFSLENBQTJCQyxJQUEzRCxNQUFxRSxDQUFDSixXQUFXSSxJQUFaLElBQW9CLENBQUMxRCxFQUFFMkQsSUFBRixDQUFPTCxXQUFXSSxJQUFsQixDQUExRixDQUFKLEVBQ0NGLE9BQU9FLElBQVAsR0FBYyx1Q0FBZDs7QUFFRCxNQUFJMUQsRUFBRTRELElBQUYsQ0FBT0osTUFBUCxFQUFlZCxNQUFmLEdBQXdCLENBQTVCLEVBQ0MsT0FBT2MsTUFBUDtBQUNEO0FBakgyQyxDQUE1QixDQUFqQiIsImZpbGUiOiJncm91cE1vZGVsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgbW9tZW50ID0gcmVxdWlyZShcIm1vbWVudFwiKTtcblxuY29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuXG5jb25zdCBncmFkZU1hcCA9IHJlcXVpcmUoXCIuLi8uLi9saWIvZ3JhZGVNYXBcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuRXBveHkuTW9kZWwuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHllYXIgPSBtb21lbnQoKS55ZWFyKCk7XG5cblx0XHQvLyBBIGdyb3VwJ3MgbGlmZXRpbWUgc3RhcnRzIGF0IGl0cyB0YXJnZXQgeWVhciBwbHVzIHN0YXJ0aW5nIG1vbnRoLCB3aXRoIDAgYmVpbmcgSmFudWFyeVxuXHRcdGNvbnN0IHN0YXJ0WWVhciA9IG1vbWVudCgpLnllYXIoeWVhcikubW9udGgoc2V0dGluZ3MueWVhclN0YXJ0KS5zdGFydE9mKFwibW9udGhcIikuc3RhcnRPZihcImRheVwiKTtcblx0XHRjb25zdCBzdGFydCA9IHN0YXJ0WWVhci51bml4KCk7XG5cblx0XHQvLyBBZGQgb25lIHllYXIgdG8gdGhlIHN0YXJ0IGFuZCBzdWJ0cmFjdCBvbmUgc2Vjb25kIHRvIG9idGFpbiB0aGUgZW5kIG9mIHRoZSBncm91cCdzIHllYXItYm91bmQgbGlmZXRpbWVcblx0XHRzdGFydFllYXIuYWRkKDEsIFwieWVhcnNcIikuc3VidHJhY3QoMSwgXCJzZWNvbmRzXCIpO1xuXHRcdGNvbnN0IGVuZCA9IHN0YXJ0WWVhci51bml4KCk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0eWVhcixcblx0XHRcdHN0YXJ0LFxuXHRcdFx0ZW5kLFxuXHRcdH07XG5cdH0sXG5cblx0aWRBdHRyaWJ1dGU6IFwiY29kZVwiLFxuXG5cdHVybFJvb3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9ncm91cHNcIjtcblx0fSxcblxuXHRjb21wdXRlZHM6IHtcblx0XHRpc0xpZmV0aW1lUGVycGV0dWFsOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLmdldChcInN0YXJ0XCIpID09PSAwICYmIHRoaXMuZ2V0KFwiZW5kXCIpID09PSAyMTQ3NDgzNjQ3O1xuXHRcdH0sXG5cblx0XHRpc0xpZmV0aW1lQ3VzdG9taXNlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHQvLyBBIGdyb3VwJ3MgbGlmZXRpbWUgc3RhcnRzIGF0IGl0cyB0YXJnZXQgeWVhciBwbHVzIHN0YXJ0aW5nIG1vbnRoLCB3aXRoIDAgYmVpbmcgSmFudWFyeVxuXHRcdFx0Y29uc3Qgc3RhcnQgPSBtb21lbnQoKS55ZWFyKHRoaXMuZ2V0KFwieWVhclwiKSkubW9udGgoc2V0dGluZ3MueWVhclN0YXJ0KS5zdGFydE9mKFwibW9udGhcIikuc3RhcnRPZihcImRheVwiKTtcblx0XHRcdGNvbnN0IHN0YXJ0VW5peCA9IHN0YXJ0LnVuaXgoKTtcblxuXHRcdFx0Ly8gQWRkIG9uZSB5ZWFyIHRvIHRoZSBzdGFydCBhbmQgc3VidHJhY3Qgb25lIHNlY29uZCB0byBvYnRhaW4gdGhlIGVuZCBvZiB0aGUgZ3JvdXAncyB5ZWFyLWJvdW5kIGxpZmV0aW1lXG5cdFx0XHRzdGFydC5hZGQoMSwgXCJ5ZWFyc1wiKS5zdWJ0cmFjdCgxLCBcInNlY29uZHNcIik7XG5cdFx0XHRjb25zdCBlbmRVbml4ID0gc3RhcnQudW5peCgpO1xuXG5cdFx0XHQvLyBUaGUgZ3JvdXAncyBsaWZldGltZSBoYXMgYmVlbiBjdXN0b21pc2VkIGlmIHRoZSBncm91cCdzIHN0YXJ0IGFuZCBlbmQgdGltZXN0YW1wcyBhcmUgbm90IHRoZSBzYW1lIGFzXG5cdFx0XHQvLyB0aGUgY29tcHV0ZWQgdGFyZ2V0IHllYXIgb2YgdGhlIGdyb3VwXG5cdFx0XHRyZXR1cm4gISh0aGlzLmdldChcInN0YXJ0XCIpID09PSBzdGFydFVuaXggJiYgdGhpcy5nZXQoXCJlbmRcIikgPT09IGVuZFVuaXgpO1xuXHRcdH0sXG5cblx0XHRsaWZldGltZVN0YXJ0OiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBtb21lbnQudW5peCh0aGlzLmdldChcInN0YXJ0XCIpKS5mb3JtYXQoXCJERCBNTU0gWVlZWVwiKTtcblx0XHR9LFxuXG5cdFx0bGlmZXRpbWVFbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIG1vbWVudC51bml4KHRoaXMuZ2V0KFwiZW5kXCIpKS5mb3JtYXQoXCJERCBNTU0gWVlZWVwiKTtcblx0XHR9LFxuXG5cdFx0Z3JvdXBHcmFkZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gZ3JhZGVNYXAuY29kZVRvSHVtYW5WYWx1ZSh0aGlzLmdldChcImdyYWRlXCIpLCB7IGxleGljYWw6IHRydWUgfSk7XG5cdFx0fSxcblxuXHRcdGdyb3VwWWVhcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAodGhpcy5nZXQoXCJzdGFydFwiKSA9PT0gMCAmJiB0aGlzLmdldChcImVuZFwiKSA9PT0gMjE0NzQ4MzY0Nylcblx0XHRcdFx0cmV0dXJuIFwiKGFsbClcIjtcblx0XHRcdHJldHVybiB0aGlzLmdldChcInllYXJcIik7XG5cdFx0fSxcblxuXHRcdGdyb3VwQ2hhbmdlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXQoXCJ1cGRhdGVkXCIpIHx8IHRoaXMuZ2V0KFwiY3JlYXRlZFwiKTtcblx0XHR9LFxuXG5cdFx0Z3JvdXBTb3VyY2U6IGZ1bmN0aW9uKCkge1xuXHRcdFx0c3dpdGNoICh0aGlzLmdldChcInNvdXJjZVwiKSkge1xuXHRcdFx0XHRjYXNlIFwibW9vZGxlXCI6IHJldHVybiBcIk1vb2RsZVwiO1xuXHRcdFx0XHRjYXNlIFwiaGVybWVzXCI6IHJldHVybiBcIkhlcm1lc1wiO1xuXHRcdFx0XHRkZWZhdWx0OiByZXR1cm4gXCJNb29kbGVcIjtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0aXNUb2tlbkNhbmNlbGxlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRsZXQgcmVzdWx0ID0gZmFsc2U7XG5cblx0XHRcdGlmICh0aGlzLmhhcyhcInRva2Vuc1wiKSAmJiB0aGlzLmdldChcInRva2Vuc1wiKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGNvbnN0IHRva2VucyA9IHRoaXMuZ2V0KFwidG9rZW5zXCIpO1xuXHRcdFx0XHRjb25zdCB0b2tlbiA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV07XG5cblx0XHRcdFx0cmVzdWx0ID0gQm9vbGVhbih0b2tlbi5jYW5jZWxsZWQpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH0sXG5cblx0XHRpc1Rva2VuRXhwaXJlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRsZXQgcmVzdWx0ID0gZmFsc2U7XG5cblx0XHRcdGlmICh0aGlzLmhhcyhcInRva2Vuc1wiKSAmJiB0aGlzLmdldChcInRva2Vuc1wiKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGNvbnN0IHRva2VucyA9IHRoaXMuZ2V0KFwidG9rZW5zXCIpO1xuXHRcdFx0XHRjb25zdCB0b2tlbiA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV07XG5cblx0XHRcdFx0aWYgKHRva2VuLmxpZmV0aW1lKSB7XG5cdFx0XHRcdFx0Y29uc3QgZXhwaXJhdGlvbkRhdGUgPSBtb21lbnQudW5peCh0b2tlbi5jcmVhdGVkKS5hZGQobW9tZW50LmR1cmF0aW9uKHRva2VuLmxpZmV0aW1lKSk7XG5cblx0XHRcdFx0XHRyZXN1bHQgPSBtb21lbnQoKS5pc0FmdGVyKGV4cGlyYXRpb25EYXRlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH0sXG5cdH0sXG5cblx0dmFsaWRhdGU6IGZ1bmN0aW9uKGF0dHJpYnV0ZXMsIG9wdGlvbnMpIHtcblx0XHRjb25zdCBlcnJvcnMgPSB7fTtcblxuXHRcdGlmICgoIW9wdGlvbnMudmFsaWRhdGVBdHRyaWJ1dGVzIHx8IG9wdGlvbnMudmFsaWRhdGVBdHRyaWJ1dGVzLm5hbWUpICYmICghYXR0cmlidXRlcy5uYW1lIHx8ICFfLnRyaW0oYXR0cmlidXRlcy5uYW1lKSkpXG5cdFx0XHRlcnJvcnMubmFtZSA9IFwiWW91IG11c3QgcHJvdmlkZSBhIG5hbWUgZm9yIHRoZSBncm91cFwiO1xuXG5cdFx0aWYgKF8ua2V5cyhlcnJvcnMpLmxlbmd0aCA+IDApXG5cdFx0XHRyZXR1cm4gZXJyb3JzO1xuXHR9LFxufSk7Il19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar rester = require(\"rester\");\nvar _ = require(\"lodash\");\nvar moment = require(\"moment\");\nvar qs = require(\"querystring\");\n\nvar App = require(\"../../index\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar ServerGrid = require(\"../../lib/serverGrid\");\nvar settings = require(\"app-settings\");\nvar SmallModal = require(\"../../lib/smallModal\");\nvar SimpleMenu = require(\"../../lib/simpleMenu\");\nvar ChangelogModal = require(\"../../lib/changelogModal\");\n\nvar GroupDetails = require(\"./groupDetails\");\nvar GroupModal = require(\"./groupModal\");\nvar GroupModel = require(\"./groupModel\");\n\nvar Collection = Backbone.PageableCollection.extend({\n\tmodel: GroupModel,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/groups?fullData=1&membershipCount=1&paged=true\";\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"content group-manager\",\n\n\ttemplate: require(\"../templates/groupmanage.nunj\"),\n\n\tui: {\n\t\tcounter: \".ops-bar .counter\",\n\t\tfilters: \".ops-bar .filters\",\n\t\tdownloadList: \".download\",\n\t\toperations: \".operations\",\n\t\taddIcon: \".add-group\",\n\t\tpaging: \".paging\",\n\t\tgrid: \"div.grid\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.downloadList\": \"showDownloads\",\n\t\t\"click @ui.operations\": \"showOperations\",\n\t\t\"click @ui.addIcon\": \"addEditGroup\"\n\t},\n\n\tcollectionEvents: {\n\t\t\"toolbar:click:delete\": \"deleteGroup\",\n\t\t\"toolbar:click:edit\": \"addEditGroup\",\n\t\t\"toolbar:click:changelog\": \"changelog\",\n\t\t\"toolbar:click:details\": \"viewGroupDetails\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this = this;\n\n\t\treturn {\n\t\t\tisNew: function isNew() {\n\t\t\t\treturn !_this.model || _this.model.isNew();\n\t\t\t}\n\t\t};\n\t},\n\n\tshowDownloads: function showDownloads(evt) {\n\t\tevt.stopPropagation();\n\n\t\tvar list = new SimpleMenu({\n\t\t\tanchor: this.ui.downloadList,\n\t\t\tside: \"left\",\n\t\t\tstructure: [{ closeOnClick: true, elements: [{ text: \"Export list of all groups\", id: \"groups\" }, { text: \"Export list of global groups (compatible with CSV Imports)\", id: \"groupsForImport\" }] }]\n\t\t});\n\t\tlist.show();\n\n\t\tthis.listenTo(list, \"clicked:groups\", this.downloadList.bind(this));\n\t\tthis.listenTo(list, \"clicked:groupsForImport\", this.downloadListForImport.bind(this));\n\t},\n\n\tdownloadList: function downloadList() {\n\t\tvar params = this.grid.filter.getServerFilters();\n\t\twindow.open(settings.urlRoot + \"/api/1.0/groups/lists/csv?\" + qs.stringify(params));\n\t},\n\n\tdownloadListForImport: function downloadListForImport() {\n\t\tvar params = this.grid.filter.getServerFilters();\n\t\twindow.open(settings.urlRoot + \"/api/1.0/groups/lists/compatCSV?\" + qs.stringify(params));\n\t},\n\n\tshowOperations: function showOperations(evt) {\n\t\tevt.stopPropagation();\n\t},\n\n\tfilterDelete: function filterDelete(model) {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\t\tif (!settings.fcClient && rester.hasAccess(rester.p.api.groups.delete, user)) {\n\t\t\t// eslint-disable-next-line no-sync\n\t\t\tif (settings.externalSync.groups === \"rw\") {\n\t\t\t\t// eslint-disable-next-line no-sync\n\t\t\t\tif (settings.externalSync.groupYearExclusions.length === 0 || !_.includes(settings.externalSync.groupYearExclusions, model.get(\"year\"))) return false;\n\t\t\t}\n\t\t\treturn rester.matchGrantValues(rester.g.publishers, user, \"\");\n\t\t}\n\t},\n\n\tfilterEdit: function filterEdit() {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tif (settings.fcClient || !rester.hasAccess(rester.p.api.groups.put, user)) return false;\n\t\treturn true;\n\t},\n\n\tfilterDetails: function filterDetails() {\n\t\treturn rester.hasAccess(rester.p.api.groups.get, radio.request(App.Events.Requests.CurrentUser));\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"name\", label: \"Name\", cell: \"string\", editable: false, tooltip: \"name\" }, { name: \"code\", label: \"Code\", cell: \"string\", editable: false }, { name: \"membership_count\", label: \"Members\", cell: \"string\", editable: false }, { name: \"language\", label: \"Language\", cell: \"string\", editable: false }, { name: \"subject_name\", label: \"Subject\", cell: \"string\", editable: false }, { name: \"groupGrade\", label: \"Year of Study\", cell: \"string\", editable: false }, { name: \"groupYear\", label: \"Target Year\", cell: \"string\", editable: false }, { name: \"isLifetimePerpetual\", label: \"Perpetual\", cell: ServerGrid.BooleanIconCell.extend({}), editable: false }];\n\n\t\tif (!settings.perpetualGroups) {\n\t\t\tcolumns.push({ name: \"lifetimeStart\", label: \"Start\", cell: \"string\", editable: false }, { name: \"lifetimeEnd\", label: \"End\", cell: \"string\", editable: false });\n\t\t}\n\n\t\tcolumns.push({ name: \"groupSource\", label: \"Source\", cell: \"string\", editable: false }, { name: \"groupChanged\", label: \"Last Changed\", editable: false, cell: ServerGrid.MomentCell.extend({\n\t\t\t\tmodelInUnixTimestamp: true,\n\t\t\t\tdisplayFormat: \"DD MMM YYYY, HH:mm a\",\n\t\t\t\tdisplayInUTC: false\n\t\t\t}) }, { label: \"Actions\", cell: new ServerGrid.ToolbarCell({ tooltips: [{ title: \"Changelog\", icon: \"fa-list-ul\" }, { title: \"Details\", icon: \"fa-eye\", filter: this.filterDetails.bind(this) }, { title: \"Edit\", icon: \"fa-edit\", data: \"edit\", filter: this.filterEdit.bind(this) }, { title: \"Delete\", icon: \"fa-trash-alt\", data: \"delete\", filter: this.filterDelete.bind(this) }] }), editable: false, sortable: false });\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new Collection(),\n\t\t\tclickable: true,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counter,\n\t\t\t\ttemplate: \"Groups $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tthis.bindEvents(this.grid.collection, this.collectionEvents);\n\n\t\tthis.listenTo(this.grid, \"row:clicked\", this.addEditGroup.bind(this));\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar languageFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"languageFilter\",\n\t\t\tlabel: \"Language\",\n\t\t\tcategories: [{ items: settings.languageList }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar subjectFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"subjectFilter\",\n\t\t\tlabel: \"Subject\",\n\t\t\tserver: {\n\t\t\t\tkey: \"subject_id\",\n\t\t\t\tvalue: \"subject\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/subjects\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\n\t\tvar gradeFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"gradeFilter\",\n\t\t\tlabel: \"Year of Study\",\n\t\t\tserver: true,\n\t\t\tcategories: _.map(settings.gradeList, function (val, key) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: key,\n\t\t\t\t\titems: _.reduce(val.sort(function (a, b) {\n\t\t\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t\t\t}), function (sum, num) {\n\t\t\t\t\t\tsum.push({ name: num.value, label: num.name });return sum;\n\t\t\t\t\t}, [])\n\t\t\t\t};\n\t\t\t})\n\t\t};\n\n\t\tvar yearFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"yearFilter\",\n\t\t\tlabel: \"Target Year\",\n\t\t\tcategories: [{ items: _.range(2014, moment().year() + 2) }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar filterList = [textFilter, languageFilter, subjectFilter, gradeFilter, yearFilter];\n\n\t\tthis.ui.filters.prepend(this.grid.filter({ filterContainer: this.ui.filters, filters: filterList, defaultFilters: [\"textFilter\"] }).render().el);\n\t},\n\n\tviewGroupDetails: function viewGroupDetails(model) {\n\t\tthis.groupDetails = new GroupDetails({\n\t\t\teventBus: this,\n\t\t\tgroupModel: model\n\t\t});\n\n\t\tthis.groupDetails.show();\n\t},\n\n\taddEditGroup: function addEditGroup(model) {\n\t\tvar _this2 = this;\n\n\t\tif (settings.fcClient) return;\n\n\t\tvar modal = new GroupModal({\n\t\t\tmodel: model && model.id ? model : new GroupModel()\n\t\t});\n\n\t\tmodal.show({\n\t\t\tcreate: function create(result) {\n\t\t\t\t_this2.grid.collection.getFirstPage();\n\t\t\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\t\t\tcontent: \"New group \" + result.model.get(\"name\") + \" successfully created\"\n\t\t\t\t});\n\t\t\t},\n\n\t\t\tcreateAnother: function createAnother() {\n\t\t\t\t_this2.grid.collection.getFirstPage();\n\t\t\t},\n\n\t\t\tupdate: function update(result) {\n\t\t\t\tresult.model.trigger(\"grid:render\");\n\n\t\t\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\t\t\tcontent: \"Group \" + result.model.get(\"name\") + \" successfully updated\"\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t},\n\n\tdeleteGroup: function deleteGroup(model) {\n\t\tvar _this3 = this;\n\n\t\tif (!model) return;\n\n\t\tthis.delModal = new SmallModal({\n\t\t\tpersist: true,\n\t\t\twarning: true,\n\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Deletion Confirmation\",\n\t\t\tbody: \"<p>Are you sure you want to delete this group?</p>\\n\\t\\t\\t\\t<p>If any users/books are linked to it, they will be removed from the group, and any content linked to this group in books will stop working.</p>\"\n\t\t});\n\n\t\tthis.delModal.on(\"button:ok\", function () {\n\t\t\tmodel.destroy({ wait: true, success: _this3.deletionSuccess.bind(_this3), error: _this3.deletionError.bind(_this3) });\n\t\t});\n\n\t\tthis.delModal.show();\n\t},\n\n\tdeletionSuccess: function deletionSuccess() {\n\t\tthis.delModal.destroy();\n\t},\n\n\tdeletionError: function deletionError(model, xhr) {\n\t\tvar answer = App.parseResponse(xhr);\n\t\tthis.delModal.showError(\"Deletion failed: \" + (answer.detail || answer.info));\n\t},\n\n\tchangelog: function changelog(model) {\n\t\tvar mod = new Backbone.Model({\n\t\t\ttitle: model.get(\"name\"),\n\t\t\tidentifier: model.get(\"group_id\"),\n\t\t\tcategory: \"group\"\n\t\t});\n\n\t\tvar modal = new ChangelogModal({ model: mod });\n\n\t\tmodal.show();\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImdyb3VwbWFuYWdlci5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCJyZXN0ZXIiLCJfIiwibW9tZW50IiwicXMiLCJBcHAiLCJyYWRpbyIsIlJhZGlvIiwiY2hhbm5lbCIsIlNlcnZlckdyaWQiLCJzZXR0aW5ncyIsIlNtYWxsTW9kYWwiLCJTaW1wbGVNZW51IiwiQ2hhbmdlbG9nTW9kYWwiLCJHcm91cERldGFpbHMiLCJHcm91cE1vZGFsIiwiR3JvdXBNb2RlbCIsIkNvbGxlY3Rpb24iLCJQYWdlYWJsZUNvbGxlY3Rpb24iLCJleHRlbmQiLCJtb2RlbCIsInVybCIsInVybFJvb3QiLCJzdGF0ZSIsInBhZ2VTaXplIiwibW9kZSIsInF1ZXJ5UGFyYW1zIiwic29ydEtleSIsInBhcnNlU3RhdGUiLCJyZXNwIiwidG90YWxSZWNvcmRzIiwidG90YWwiLCJwYXJzZVJlY29yZHMiLCJyb3dzIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1hcmlvbmV0dGUiLCJWaWV3IiwidGFnTmFtZSIsImNsYXNzTmFtZSIsInRlbXBsYXRlIiwidWkiLCJjb3VudGVyIiwiZmlsdGVycyIsImRvd25sb2FkTGlzdCIsIm9wZXJhdGlvbnMiLCJhZGRJY29uIiwicGFnaW5nIiwiZ3JpZCIsImV2ZW50cyIsImNvbGxlY3Rpb25FdmVudHMiLCJ0ZW1wbGF0ZUNvbnRleHQiLCJpc05ldyIsInNob3dEb3dubG9hZHMiLCJldnQiLCJzdG9wUHJvcGFnYXRpb24iLCJsaXN0IiwiYW5jaG9yIiwic2lkZSIsInN0cnVjdHVyZSIsImNsb3NlT25DbGljayIsImVsZW1lbnRzIiwidGV4dCIsImlkIiwic2hvdyIsImxpc3RlblRvIiwiYmluZCIsImRvd25sb2FkTGlzdEZvckltcG9ydCIsInBhcmFtcyIsImZpbHRlciIsImdldFNlcnZlckZpbHRlcnMiLCJ3aW5kb3ciLCJvcGVuIiwic3RyaW5naWZ5Iiwic2hvd09wZXJhdGlvbnMiLCJmaWx0ZXJEZWxldGUiLCJ1c2VyIiwicmVxdWVzdCIsIkV2ZW50cyIsIlJlcXVlc3RzIiwiQ3VycmVudFVzZXIiLCJmY0NsaWVudCIsImhhc0FjY2VzcyIsInAiLCJhcGkiLCJncm91cHMiLCJkZWxldGUiLCJleHRlcm5hbFN5bmMiLCJncm91cFllYXJFeGNsdXNpb25zIiwibGVuZ3RoIiwiaW5jbHVkZXMiLCJnZXQiLCJtYXRjaEdyYW50VmFsdWVzIiwiZyIsInB1Ymxpc2hlcnMiLCJmaWx0ZXJFZGl0IiwicHV0IiwiZmlsdGVyRGV0YWlscyIsIm9uUmVuZGVyIiwiY29sdW1ucyIsIm5hbWUiLCJsYWJlbCIsImNlbGwiLCJlZGl0YWJsZSIsInRvb2x0aXAiLCJCb29sZWFuSWNvbkNlbGwiLCJwZXJwZXR1YWxHcm91cHMiLCJwdXNoIiwiTW9tZW50Q2VsbCIsIm1vZGVsSW5Vbml4VGltZXN0YW1wIiwiZGlzcGxheUZvcm1hdCIsImRpc3BsYXlJblVUQyIsIlRvb2xiYXJDZWxsIiwidG9vbHRpcHMiLCJ0aXRsZSIsImljb24iLCJkYXRhIiwic29ydGFibGUiLCJlbCIsImNvbGxlY3Rpb24iLCJjbGlja2FibGUiLCJlbGVtZW50IiwiYmluZEV2ZW50cyIsImFkZEVkaXRHcm91cCIsInRleHRGaWx0ZXIiLCJ0eXBlIiwiZGVib3VuY2UiLCJzZXJ2ZXIiLCJsYW5ndWFnZUZpbHRlciIsImNhdGVnb3JpZXMiLCJpdGVtcyIsImxhbmd1YWdlTGlzdCIsInN1YmplY3RGaWx0ZXIiLCJrZXkiLCJ2YWx1ZSIsImZldGNoIiwiaW5maW5pdGUiLCJncmFkZUZpbHRlciIsIm1hcCIsImdyYWRlTGlzdCIsInZhbCIsInJlZHVjZSIsInNvcnQiLCJhIiwiYiIsImxleGljYWwiLCJ0b1VwcGVyQ2FzZSIsImxvY2FsZUNvbXBhcmUiLCJzdW0iLCJudW0iLCJ5ZWFyRmlsdGVyIiwicmFuZ2UiLCJ5ZWFyIiwiZmlsdGVyTGlzdCIsInByZXBlbmQiLCJmaWx0ZXJDb250YWluZXIiLCJkZWZhdWx0RmlsdGVycyIsInJlbmRlciIsInZpZXdHcm91cERldGFpbHMiLCJncm91cERldGFpbHMiLCJldmVudEJ1cyIsImdyb3VwTW9kZWwiLCJtb2RhbCIsImNyZWF0ZSIsImdldEZpcnN0UGFnZSIsInRyaWdnZXIiLCJDb21tYW5kcyIsIlRvYXN0IiwiY29udGVudCIsInJlc3VsdCIsImNyZWF0ZUFub3RoZXIiLCJ1cGRhdGUiLCJkZWxldGVHcm91cCIsImRlbE1vZGFsIiwicGVyc2lzdCIsIndhcm5pbmciLCJib2R5Iiwib24iLCJkZXN0cm95Iiwid2FpdCIsInN1Y2Nlc3MiLCJkZWxldGlvblN1Y2Nlc3MiLCJlcnJvciIsImRlbGV0aW9uRXJyb3IiLCJ4aHIiLCJhbnN3ZXIiLCJwYXJzZVJlc3BvbnNlIiwic2hvd0Vycm9yIiwiZGV0YWlsIiwiaW5mbyIsImNoYW5nZWxvZyIsIm1vZCIsIk1vZGVsIiwiaWRlbnRpZmllciIsImNhdGVnb3J5Il0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNQyxTQUFTRCxRQUFRLFFBQVIsQ0FBZjtBQUNBLElBQU1FLElBQUlGLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUcsU0FBU0gsUUFBUSxRQUFSLENBQWY7QUFDQSxJQUFNSSxLQUFLSixRQUFRLGFBQVIsQ0FBWDs7QUFFQSxJQUFNSyxNQUFNTCxRQUFRLGFBQVIsQ0FBWjs7QUFFQSxJQUFNTSxRQUFRUCxTQUFTUSxLQUFULENBQWVDLE9BQWYsQ0FBdUIsUUFBdkIsQ0FBZDs7QUFFQSxJQUFNQyxhQUFhVCxRQUFRLHNCQUFSLENBQW5CO0FBQ0EsSUFBTVUsV0FBV1YsUUFBUSxjQUFSLENBQWpCO0FBQ0EsSUFBTVcsYUFBYVgsUUFBUSxzQkFBUixDQUFuQjtBQUNBLElBQU1ZLGFBQWFaLFFBQVEsc0JBQVIsQ0FBbkI7QUFDQSxJQUFNYSxpQkFBaUJiLFFBQVEsMEJBQVIsQ0FBdkI7O0FBRUEsSUFBTWMsZUFBZWQsUUFBUSxnQkFBUixDQUFyQjtBQUNBLElBQU1lLGFBQWFmLFFBQVEsY0FBUixDQUFuQjtBQUNBLElBQU1nQixhQUFhaEIs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RUFBZDtBQUNBLEdBRkQ7O0FBSUEsT0FBSzJHLFFBQUwsQ0FBYzdHLElBQWQ7QUFDQSxFQXhRK0M7O0FBMFFoRHFILGtCQUFpQiwyQkFBVztBQUMzQixPQUFLUixRQUFMLENBQWNLLE9BQWQ7QUFDQSxFQTVRK0M7O0FBOFFoREssZ0JBQWUsdUJBQVNuSyxLQUFULEVBQWdCb0ssR0FBaEIsRUFBcUI7QUFDbkMsTUFBTUMsU0FBU3BMLElBQUlxTCxhQUFKLENBQWtCRixHQUFsQixDQUFmO0FBQ0EsT0FBS1gsUUFBTCxDQUFjYyxTQUFkLENBQXdCLHVCQUF1QkYsT0FBT0csTUFBUCxJQUFpQkgsT0FBT0ksSUFBL0MsQ0FBeEI7QUFDQSxFQWpSK0M7O0FBbVJoREMsWUFBVyxtQkFBUzFLLEtBQVQsRUFBZ0I7QUFDMUIsTUFBTTJLLE1BQU0sSUFBSWhNLFNBQVNpTSxLQUFiLENBQW1CO0FBQzlCOUUsVUFBTzlGLE1BQU11RSxHQUFOLENBQVUsTUFBVixDQUR1QjtBQUU5QnNHLGVBQVk3SyxNQUFNdUUsR0FBTixDQUFVLFVBQVYsQ0FGa0I7QUFHOUJ1RyxhQUFVO0FBSG9CLEdBQW5CLENBQVo7O0FBTUEsTUFBTWhDLFFBQVEsSUFBSXJKLGNBQUosQ0FBbUIsRUFBRU8sT0FBTzJLLEdBQVQsRUFBbkIsQ0FBZDs7QUFFQTdCLFFBQU1sRyxJQUFOO0FBQ0E7QUE3UitDLENBQWhDLENBQWpCIiwiZmlsZSI6Imdyb3VwbWFuYWdlci5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCByZXN0ZXIgPSByZXF1aXJlKFwicmVzdGVyXCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBtb21lbnQgPSByZXF1aXJlKFwibW9tZW50XCIpO1xuY29uc3QgcXMgPSByZXF1aXJlKFwicXVlcnlzdHJpbmdcIik7XG5cbmNvbnN0IEFwcCA9IHJlcXVpcmUoXCIuLi8uLi9pbmRleFwiKTtcblxuY29uc3QgcmFkaW8gPSBCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZ2xvYmFsXCIpO1xuXG5jb25zdCBTZXJ2ZXJHcmlkID0gcmVxdWlyZShcIi4uLy4uL2xpYi9zZXJ2ZXJHcmlkXCIpO1xuY29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuY29uc3QgU21hbGxNb2RhbCA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc21hbGxNb2RhbFwiKTtcbmNvbnN0IFNpbXBsZU1lbnUgPSByZXF1aXJlKFwiLi4vLi4vbGliL3NpbXBsZU1lbnVcIik7XG5jb25zdCBDaGFuZ2Vsb2dNb2RhbCA9IHJlcXVpcmUoXCIuLi8uLi9saWIvY2hhbmdlbG9nTW9kYWxcIik7XG5cbmNvbnN0IEdyb3VwRGV0YWlscyA9IHJlcXVpcmUoXCIuL2dyb3VwRGV0YWlsc1wiKTtcbmNvbnN0IEdyb3VwTW9kYWwgPSByZXF1aXJlKFwiLi9ncm91cE1vZGFsXCIpO1xuY29uc3QgR3JvdXBNb2RlbCA9IHJlcXVpcmUoXCIuL2dyb3VwTW9kZWxcIik7XG5cbmNvbnN0IENvbGxlY3Rpb24gPSBCYWNrYm9uZS5QYWdlYWJsZUNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IEdyb3VwTW9kZWwsXG5cblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvZ3JvdXBzP2Z1bGxEYXRhPTEmbWVtYmVyc2hpcENvdW50PTEmcGFnZWQ9dHJ1ZVwiO1xuXHR9LFxuXG5cdHN0YXRlOiB7XG5cdFx0cGFnZVNpemU6IDMwLFxuXHR9LFxuXHRtb2RlOiBcInNlcnZlclwiLFxuXG5cdHF1ZXJ5UGFyYW1zOiB7XG5cdFx0cGFnZVNpemU6IFwicGFnZVNpemVcIixcblx0XHRzb3J0S2V5OiBcInNvcnRCeVwiLFxuXHR9LFxuXG5cdHBhcnNlU3RhdGU6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRyZXR1cm4geyB0b3RhbFJlY29yZHM6IHJlc3AudG90YWwgfTtcblx0fSxcblxuXHRwYXJzZVJlY29yZHM6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRyZXR1cm4gcmVzcC5yb3dzO1xuXHR9LFxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6IFwiZGl2XCIsXG5cdGNsYXNzTmFtZTogXCJjb250ZW50IGdyb3VwLW1hbmFnZXJcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9ncm91cG1hbmFnZS5udW5qXCIpLFxuXG5cdHVpOiB7XG5cdFx0Y291bnRlcjogXCIub3BzLWJhciAuY291bnRlclwiLFxuXHRcdGZpbHRlcnM6IFwiLm9wcy1iYXIgLmZpbHRlcnNcIixcblx0XHRkb3dubG9hZExpc3Q6IFwiLmRvd25sb2FkXCIsXG5cdFx0b3BlcmF0aW9uczogXCIub3BlcmF0aW9uc1wiLFxuXHRcdGFkZEljb246IFwiLmFkZC1ncm91cFwiLFxuXHRcdHBhZ2luZzogXCIucGFnaW5nXCIsXG5cdFx0Z3JpZDogXCJkaXYuZ3JpZFwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmRvd25sb2FkTGlzdFwiOiBcInNob3dEb3dubG9hZHNcIixcblx0XHRcImNsaWNrIEB1aS5vcGVyYXRpb25zXCI6IFwic2hvd09wZXJhdGlvbnNcIixcblx0XHRcImNsaWNrIEB1aS5hZGRJY29uXCI6IFwiYWRkRWRpdEdyb3VwXCIsXG5cdH0sXG5cblx0Y29sbGVjdGlvbkV2ZW50czoge1xuXHRcdFwidG9vbGJhcjpjbGljazpkZWxldGVcIjogXCJkZWxldGVHcm91cFwiLFxuXHRcdFwidG9vbGJhcjpjbGljazplZGl0XCI6IFwiYWRkRWRpdEdyb3VwXCIsXG5cdFx0XCJ0b29sYmFyOmNsaWNrOmNoYW5nZWxvZ1wiOiBcImNoYW5nZWxvZ1wiLFxuXHRcdFwidG9vbGJhcjpjbGljazpkZXRhaWxzXCI6IFwidmlld0dyb3VwRGV0YWlsc1wiLFxuXHR9LFxuXG5cdHRlbXBsYXRlQ29udGV4dDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGlzTmV3OiAoKSA9PiAhdGhpcy5tb2RlbCB8fCB0aGlzLm1vZGVsLmlzTmV3KCksXG5cdFx0fTtcblx0fSxcblxuXHRzaG93RG93bmxvYWRzOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRjb25zdCBsaXN0ID0gbmV3IFNpbXBsZU1lbnUoe1xuXHRcdFx0YW5jaG9yOiB0aGlzLnVpLmRvd25sb2FkTGlzdCxcblx0XHRcdHNpZGU6IFwibGVmdFwiLFxuXHRcdFx0c3RydWN0dXJlOiBbXG5cdFx0XHRcdHsgY2xvc2VPbkNsaWNrOiB0cnVlLCBlbGVtZW50czogW1xuXHRcdFx0XHRcdHsgdGV4dDogXCJFeHBvcnQgbGlzdCBvZiBhbGwgZ3JvdXBzXCIsIGlkOiBcImdyb3Vwc1wiIH0sXG5cdFx0XHRcdFx0eyB0ZXh0OiBcIkV4cG9ydCBsaXN0IG9mIGdsb2JhbCBncm91cHMgKGNvbXBhdGlibGUgd2l0aCBDU1YgSW1wb3J0cylcIiwgaWQ6IFwiZ3JvdXBzRm9ySW1wb3J0XCIgfSxcblx0XHRcdFx0XSB9LFxuXHRcdFx0XSxcblx0XHR9KTtcblx0XHRsaXN0LnNob3coKTtcblxuXHRcdHRoaXMubGlzdGVuVG8obGlzdCwgXCJjbGlja2VkOmdyb3Vwc1wiLCB0aGlzLmRvd25sb2FkTGlzdC5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKGxpc3QsIFwiY2xpY2tlZDpncm91cHNGb3JJbXBvcnRcIiwgdGhpcy5kb3dubG9hZExpc3RGb3JJbXBvcnQuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0ZG93bmxvYWRMaXN0OiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBwYXJhbXMgPSB0aGlzLmdyaWQuZmlsdGVyLmdldFNlcnZlckZpbHRlcnMoKTtcblx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9ncm91cHMvbGlzdHMvY3N2P1wiICsgcXMuc3RyaW5naWZ5KHBhcmFtcykpO1xuXHR9LFxuXG5cdGRvd25sb2FkTGlzdEZvckltcG9ydDogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgcGFyYW1zID0gdGhpcy5ncmlkLmZpbHRlci5nZXRTZXJ2ZXJGaWx0ZXJzKCk7XG5cdFx0d2luZG93Lm9wZW4oc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvZ3JvdXBzL2xpc3RzL2NvbXBhdENTVj9cIiArIHFzLnN0cmluZ2lmeShwYXJhbXMpKTtcblx0fSxcblxuXHRzaG93T3BlcmF0aW9uczogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9LFxuXG5cdGZpbHRlckRlbGV0ZTogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRjb25zdCB1c2VyID0gcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblx0XHRpZiAoIXNldHRpbmdzLmZjQ2xpZW50ICYmIHJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAuYXBpLmdyb3Vwcy5kZWxldGUsIHVzZXIpKSB7XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc3luY1xuXHRcdFx0aWYgKHNldHRpbmdzLmV4dGVybmFsU3luYy5ncm91cHMgPT09IFwicndcIikge1xuXHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc3luY1xuXHRcdFx0XHRpZiAoc2V0dGluZ3MuZXh0ZXJuYWxTeW5jLmdyb3VwWWVhckV4Y2x1c2lvbnMubGVuZ3RoID09PSAwIHx8ICFfLmluY2x1ZGVzKHNldHRpbmdzLmV4dGVybmFsU3luYy5ncm91cFllYXJFeGNsdXNpb25zLCBtb2RlbC5nZXQoXCJ5ZWFyXCIpKSlcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzdGVyLm1hdGNoR3JhbnRWYWx1ZXMocmVzdGVyLmcucHVibGlzaGVycywgdXNlciwgXCJcIik7XG5cdFx0fVxuXHR9LFxuXG5cdGZpbHRlckVkaXQ6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHVzZXIgPSByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpO1xuXG5cdFx0aWYgKHNldHRpbmdzLmZjQ2xpZW50IHx8ICFyZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmFwaS5ncm91cHMucHV0LCB1c2VyKSlcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHRmaWx0ZXJEZXRhaWxzOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gcmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5hcGkuZ3JvdXBzLmdldCwgcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKSk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGNvbHVtbnMgPSBbXG5cdFx0XHR7IG5hbWU6IFwibmFtZVwiLCBsYWJlbDogXCJOYW1lXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSwgdG9vbHRpcDogXCJuYW1lXCIgfSxcblx0XHRcdHsgbmFtZTogXCJjb2RlXCIsIGxhYmVsOiBcIkNvZGVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwibWVtYmVyc2hpcF9jb3VudFwiLCBsYWJlbDogXCJNZW1iZXJzXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImxhbmd1YWdlXCIsIGxhYmVsOiBcIkxhbmd1YWdlXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcInN1YmplY3RfbmFtZVwiLCBsYWJlbDogXCJTdWJqZWN0XCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImdyb3VwR3JhZGVcIiwgbGFiZWw6IFwiWWVhciBvZiBTdHVkeVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJncm91cFllYXJcIiwgbGFiZWw6IFwiVGFyZ2V0IFllYXJcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiaXNMaWZldGltZVBlcnBldHVhbFwiLCBsYWJlbDogXCJQZXJwZXR1YWxcIiwgY2VsbDogU2VydmVyR3JpZC5Cb29sZWFuSWNvbkNlbGwuZXh0ZW5kKHt9KSwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XTtcblxuXHRcdGlmICghc2V0dGluZ3MucGVycGV0dWFsR3JvdXBzKSB7XG5cdFx0XHRjb2x1bW5zLnB1c2goXG5cdFx0XHRcdHsgbmFtZTogXCJsaWZldGltZVN0YXJ0XCIsIGxhYmVsOiBcIlN0YXJ0XCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0XHR7IG5hbWU6IFwibGlmZXRpbWVFbmRcIiwgbGFiZWw6IFwiRW5kXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9XG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbHVtbnMucHVzaChcblx0XHRcdHsgbmFtZTogXCJncm91cFNvdXJjZVwiLCBsYWJlbDogXCJTb3VyY2VcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiZ3JvdXBDaGFuZ2VkXCIsIGxhYmVsOiBcIkxhc3QgQ2hhbmdlZFwiLCBlZGl0YWJsZTogZmFsc2UsIGNlbGw6IFNlcnZlckdyaWQuTW9tZW50Q2VsbC5leHRlbmQoe1xuXHRcdFx0XHRtb2RlbEluVW5peFRpbWVzdGFtcDogdHJ1ZSxcblx0XHRcdFx0ZGlzcGxheUZvcm1hdDogXCJERCBNTU0gWVlZWSwgSEg6bW0gYVwiLFxuXHRcdFx0XHRkaXNwbGF5SW5VVEM6IGZhbHNlLFxuXHRcdFx0fSkgfSxcblx0XHRcdHsgbGFiZWw6IFwiQWN0aW9uc1wiLCBjZWxsOiBuZXcgU2VydmVyR3JpZC5Ub29sYmFyQ2VsbCh7IHRvb2x0aXBzOiBbXG5cdFx0XHRcdHsgdGl0bGU6IFwiQ2hhbmdlbG9nXCIsIGljb246IFwiZmEtbGlzdC11bFwiIH0sXG5cdFx0XHRcdHsgdGl0bGU6IFwiRGV0YWlsc1wiLCBpY29uOiBcImZhLWV5ZVwiLCBmaWx0ZXI6IHRoaXMuZmlsdGVyRGV0YWlscy5iaW5kKHRoaXMpIH0sXG5cdFx0XHRcdHsgdGl0bGU6IFwiRWRpdFwiLCBpY29uOiBcImZhLWVkaXRcIiwgZGF0YTogXCJlZGl0XCIsIGZpbHRlcjogdGhpcy5maWx0ZXJFZGl0LmJpbmQodGhpcykgfSxcblx0XHRcdFx0eyB0aXRsZTogXCJEZWxldGVcIiwgaWNvbjogXCJmYS10cmFzaC1hbHRcIiwgZGF0YTogXCJkZWxldGVcIiwgZmlsdGVyOiB0aGlzLmZpbHRlckRlbGV0ZS5iaW5kKHRoaXMpIH0sXG5cdFx0XHRdIH0pLCBlZGl0YWJsZTogZmFsc2UsIHNvcnRhYmxlOiBmYWxzZSB9XG5cdFx0KTtcblxuXHRcdHRoaXMuZ3JpZCA9IG5ldyBTZXJ2ZXJHcmlkKHtcblx0XHRcdGVsOiB0aGlzLnVpLmdyaWQsXG5cdFx0XHRjb2x1bW5zOiBjb2x1bW5zLFxuXHRcdFx0Y29sbGVjdGlvbjogbmV3IENvbGxlY3Rpb24oKSxcblx0XHRcdGNsaWNrYWJsZTogdHJ1ZSxcblx0XHRcdGNvdW50ZXI6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5jb3VudGVyLFxuXHRcdFx0XHR0ZW1wbGF0ZTogXCJHcm91cHMgJHN0YXJ0IC0gJGVuZCBvZiAkdG90YWxcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5wYWdpbmcsXG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5iaW5kRXZlbnRzKHRoaXMuZ3JpZC5jb2xsZWN0aW9uLCB0aGlzLmNvbGxlY3Rpb25FdmVudHMpO1xuXG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmdyaWQsIFwicm93OmNsaWNrZWRcIiwgdGhpcy5hZGRFZGl0R3JvdXAuYmluZCh0aGlzKSk7XG5cblx0XHRjb25zdCB0ZXh0RmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJ0ZXh0XCIsXG5cdFx0XHRuYW1lOiBcInRleHRGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlRleHQgU2VhcmNoXCIsXG5cdFx0XHRkZWJvdW5jZTogMjAwLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdH07XG5cblx0XHRjb25zdCBsYW5ndWFnZUZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiaXRlbWl6ZWRcIixcblx0XHRcdG5hbWU6IFwibGFuZ3VhZ2VGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIkxhbmd1YWdlXCIsXG5cdFx0XHRjYXRlZ29yaWVzOiBbXG5cdFx0XHRcdHsgaXRlbXM6IHNldHRpbmdzLmxhbmd1YWdlTGlzdCB9LFxuXHRcdFx0XSxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3Qgc3ViamVjdEZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiaXRlbWl6ZWRcIixcblx0XHRcdG5hbWU6IFwic3ViamVjdEZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiU3ViamVjdFwiLFxuXHRcdFx0c2VydmVyOiB7XG5cdFx0XHRcdGtleTogXCJzdWJqZWN0X2lkXCIsXG5cdFx0XHRcdHZhbHVlOiBcInN1YmplY3RcIixcblx0XHRcdFx0ZmV0Y2g6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2RhdGEvc3ViamVjdHNcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0cGFnZVNpemU6IDMwLFxuXHRcdFx0XHRpbmZpbml0ZTogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0fTtcblxuXHRcdGNvbnN0IGdyYWRlRmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJncmFkZUZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiWWVhciBvZiBTdHVkeVwiLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdFx0Y2F0ZWdvcmllczogXy5tYXAoc2V0dGluZ3MuZ3JhZGVMaXN0LCAodmFsLCBrZXkpID0+ICh7XG5cdFx0XHRcdGxhYmVsOiBrZXksXG5cdFx0XHRcdGl0ZW1zOiBfLnJlZHVjZSh2YWwuc29ydCgoYSwgYikgPT4gKFwibGV4aWNhbFwiIGluIGEgPyBhLmxleGljYWwgOiBhLm5hbWUpLnRvVXBwZXJDYXNlKCkubG9jYWxlQ29tcGFyZSgoXCJsZXhpY2FsXCIgaW4gYiA/IGIubGV4aWNhbCA6IGIubmFtZSkudG9VcHBlckNhc2UoKSkpLCAoc3VtLCBudW0pID0+IHtcblx0XHRcdFx0XHRzdW0ucHVzaCh7IG5hbWU6IG51bS52YWx1ZSwgbGFiZWw6IG51bS5uYW1lIH0pOyByZXR1cm4gc3VtO1xuXHRcdFx0XHR9LCBbXSksXG5cdFx0XHR9KSksXG5cdFx0fTtcblxuXHRcdGNvbnN0IHllYXJGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcInllYXJGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlRhcmdldCBZZWFyXCIsXG5cdFx0XHRjYXRlZ29yaWVzOiBbXG5cdFx0XHRcdHsgaXRlbXM6IF8ucmFuZ2UoMjAxNCwgbW9tZW50KCkueWVhcigpICsgMikgfSxcblx0XHRcdF0sXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdGNvbnN0IGZpbHRlckxpc3QgPSBbdGV4dEZpbHRlciwgbGFuZ3VhZ2VGaWx0ZXIsIHN1YmplY3RGaWx0ZXIsIGdyYWRlRmlsdGVyLCB5ZWFyRmlsdGVyXTtcblxuXHRcdHRoaXMudWkuZmlsdGVycy5wcmVwZW5kKHRoaXMuZ3JpZC5maWx0ZXIoeyBmaWx0ZXJDb250YWluZXI6IHRoaXMudWkuZmlsdGVycywgZmlsdGVyczogZmlsdGVyTGlzdCwgZGVmYXVsdEZpbHRlcnM6IFtcInRleHRGaWx0ZXJcIl0gfSkucmVuZGVyKCkuZWwpO1xuXHR9LFxuXG5cdHZpZXdHcm91cERldGFpbHM6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0dGhpcy5ncm91cERldGFpbHMgPSBuZXcgR3JvdXBEZXRhaWxzKHtcblx0XHRcdGV2ZW50QnVzOiB0aGlzLFxuXHRcdFx0Z3JvdXBNb2RlbDogbW9kZWwsXG5cdFx0fSk7XG5cblx0XHR0aGlzLmdyb3VwRGV0YWlscy5zaG93KCk7XG5cdH0sXG5cblx0YWRkRWRpdEdyb3VwOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdGlmIChzZXR0aW5ncy5mY0NsaWVudClcblx0XHRcdHJldHVybjtcblxuXG5cdFx0Y29uc3QgbW9kYWwgPSBuZXcgR3JvdXBNb2RhbCh7XG5cdFx0XHRtb2RlbDogbW9kZWwgJiYgbW9kZWwuaWQgPyBtb2RlbCA6IG5ldyBHcm91cE1vZGVsKCksXG5cdFx0fSk7XG5cblx0XHRtb2RhbC5zaG93KHtcblx0XHRcdGNyZWF0ZTogcmVzdWx0ID0+IHtcblx0XHRcdFx0dGhpcy5ncmlkLmNvbGxlY3Rpb24uZ2V0Rmlyc3RQYWdlKCk7XG5cdFx0XHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5Ub2FzdCwge1xuXHRcdFx0XHRcdGNvbnRlbnQ6IFwiTmV3IGdyb3VwIFwiICsgcmVzdWx0Lm1vZGVsLmdldChcIm5hbWVcIikgKyBcIiBzdWNjZXNzZnVsbHkgY3JlYXRlZFwiLFxuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cblx0XHRcdGNyZWF0ZUFub3RoZXI6ICgpID0+IHtcblx0XHRcdFx0dGhpcy5ncmlkLmNvbGxlY3Rpb24uZ2V0Rmlyc3RQYWdlKCk7XG5cdFx0XHR9LFxuXG5cdFx0XHR1cGRhdGU6IHJlc3VsdCA9PiB7XG5cdFx0XHRcdHJlc3VsdC5tb2RlbC50cmlnZ2VyKFwiZ3JpZDpyZW5kZXJcIik7XG5cblx0XHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7XG5cdFx0XHRcdFx0Y29udGVudDogXCJHcm91cCBcIiArIHJlc3VsdC5tb2RlbC5nZXQoXCJuYW1lXCIpICsgXCIgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWRcIixcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9LFxuXG5cdGRlbGV0ZUdyb3VwOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdGlmICghbW9kZWwpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLmRlbE1vZGFsID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0cGVyc2lzdDogdHJ1ZSxcblx0XHRcdHdhcm5pbmc6IHRydWUsXG5cdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmFsIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJy8+IERlbGV0aW9uIENvbmZpcm1hdGlvblwiLFxuXHRcdFx0Ym9keTogYDxwPkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBncm91cD88L3A+XG5cdFx0XHRcdDxwPklmIGFueSB1c2Vycy9ib29rcyBhcmUgbGlua2VkIHRvIGl0LCB0aGV5IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBncm91cCwgYW5kIGFueSBjb250ZW50IGxpbmtlZCB0byB0aGlzIGdyb3VwIGluIGJvb2tzIHdpbGwgc3RvcCB3b3JraW5nLjwvcD5gLFxuXHRcdH0pO1xuXG5cblx0XHR0aGlzLmRlbE1vZGFsLm9uKFwiYnV0dG9uOm9rXCIsICgpID0+IHtcblx0XHRcdG1vZGVsLmRlc3Ryb3koeyB3YWl0OiB0cnVlLCBzdWNjZXNzOiB0aGlzLmRlbGV0aW9uU3VjY2Vzcy5iaW5kKHRoaXMpLCBlcnJvcjogdGhpcy5kZWxldGlvbkVycm9yLmJpbmQodGhpcykgfSk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLmRlbE1vZGFsLnNob3coKTtcblx0fSxcblxuXHRkZWxldGlvblN1Y2Nlc3M6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZGVsTW9kYWwuZGVzdHJveSgpO1xuXHR9LFxuXG5cdGRlbGV0aW9uRXJyb3I6IGZ1bmN0aW9uKG1vZGVsLCB4aHIpIHtcblx0XHRjb25zdCBhbnN3ZXIgPSBBcHAucGFyc2VSZXNwb25zZSh4aHIpO1xuXHRcdHRoaXMuZGVsTW9kYWwuc2hvd0Vycm9yKFwiRGVsZXRpb24gZmFpbGVkOiBcIiArIChhbnN3ZXIuZGV0YWlsIHx8IGFuc3dlci5pbmZvKSk7XG5cdH0sXG5cblx0Y2hhbmdlbG9nOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdGNvbnN0IG1vZCA9IG5ldyBCYWNrYm9uZS5Nb2RlbCh7XG5cdFx0XHR0aXRsZTogbW9kZWwuZ2V0KFwibmFtZVwiKSxcblx0XHRcdGlkZW50aWZpZXI6IG1vZGVsLmdldChcImdyb3VwX2lkXCIpLFxuXHRcdFx0Y2F0ZWdvcnk6IFwiZ3JvdXBcIixcblx0XHR9KTtcblxuXHRcdGNvbnN0IG1vZGFsID0gbmV3IENoYW5nZWxvZ01vZGFsKHsgbW9kZWw6IG1vZCB9KTtcblxuXHRcdG1vZGFsLnNob3coKTtcblx0fSxcbn0pOyJdfQ==",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar settings = require(\"app-settings\");\nvar $ = require(\"jquery\");\nvar rester = require(\"rester\");\n\nvar App = require(\"../../index\");\nvar ActionHeader = require(\"../../lib/actionHeader\");\nvar ActionTitle = require(\"../../lib/actionTitle\");\nvar ErrorView = require(\"../../lib/errorView\");\nvar Backgrid = require(\"backgrid\");\nvar StatusView = require(\"../../lib/statusView\");\nvar UserModel = require(\"../../users/userModel\");\nvar ServerGrid = require(\"../../lib/serverGrid\");\nvar Selectra = require(\"../../lib/selectra\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar UserCollection = Backbone.PageableCollection.extend({\n\tmodel: UserModel,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/users?schoolTypes=true&paged=true&group=\" + encodeURIComponent(this.currentGroup);\n\t},\n\n\tstate: {\n\t\tpageSize: 15\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.currentGroup = options.currentGroup;\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nvar BlankStatus = Backbone.Marionette.View.extend({\n\tclassName: \"blank-status\",\n\n\ttemplate: require(\"../templates/membershipManager.nunj\").blankStatus,\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this = this;\n\n\t\treturn {\n\t\t\tgetMessage: function getMessage() {\n\t\t\t\treturn _this.options.message;\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\t}\n});\n\nvar Header = Backbone.Marionette.View.extend({\n\tclassName: \"header\",\n\n\ttemplate: require(\"../templates/membershipManager.nunj\").header,\n\n\tui: {\n\t\tfilterContainer: \".filter-container\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this2 = this;\n\n\t\treturn {\n\t\t\tisMirrored: function isMirrored() {\n\t\t\t\treturn _this2.options.mirrored;\n\t\t\t},\n\t\t\tgetGlyph: function getGlyph() {\n\t\t\t\treturn _this2.options.glyphClass;\n\t\t\t},\n\t\t\tgetTitle: function getTitle() {\n\t\t\t\treturn _this2.options.title;\n\t\t\t}\n\t\t};\n\t},\n\n\tgetFilterContainer: function getFilterContainer() {\n\t\treturn this.ui.filterContainer;\n\t}\n});\n\n// -----------------------------------------------------------------------------\n// User Manipulation Aspect\n// -----------------------------------------------------------------------------\nvar GroupSelector = Backbone.Marionette.View.extend({\n\tclassName: \"group-selector group-selector\",\n\tid: \"group-selector\",\n\n\ttemplate: require(\"../templates/membershipManager.nunj\").groupSelector,\n\n\tui: {\n\t\tgroups: \"select[name=groups]\"\n\t},\n\n\tevents: {\n\t\t\"change @ui.groups\": \"onGroupChange\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.code = options.code;\n\t},\n\n\tonRender: function onRender() {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tvar s = {\n\t\t\tfetch: settings.urlRoot + \"/api/1.0/users/\" + encodeURIComponent(user.username) + \"/enrolment\",\n\t\t\tdelayLoad: true,\n\t\t\tkey: \"code\",\n\t\t\tvalue: \"name\",\n\t\t\tparams: {\n\t\t\t\textendedName: true\n\t\t\t}\n\t\t};\n\n\t\tif (this.code) {\n\t\t\ts.default = {\n\t\t\t\tfetch: settings.urlRoot + \"/acacia/groups/getSpecificGroup?code=\" + encodeURIComponent(this.code)\n\t\t\t};\n\t\t}\n\n\t\tvar select = new Selectra({\n\t\t\tserver: s,\n\t\t\tpaging: {\n\t\t\t\tpageSize: 20,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t});\n\t\tselect.show({ el: this.ui.groups });\n\t},\n\n\tonGroupChange: function onGroupChange(evt, data) {\n\t\tthis.trigger(\"select\", data);\n\t}\n});\n\nvar UserManipulator = Backbone.Marionette.View.extend({\n\tclassName: \"list user-manipulator\",\n\n\ttemplate: require(\"../templates/membershipManager.nunj\").serverListLayout,\n\n\tregions: {\n\t\theader: \".header\",\n\t\tfilter: \".filter-region\",\n\t\tbody: \"div.grid\"\n\t},\n\n\tui: {\n\t\tcounter: \".ops-bar .counter\",\n\t\tfilters: \".ops-bar .filters\",\n\t\tpaging: \".paging\",\n\t\tgrid: \"div.grid\"\n\t},\n\n\tcollectionEvents: {\n\t\t\"row:clicked\": \"onMembershipToggle\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\t\tthis.currentGroup = options.group;\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.showChildView(\"header\", new Header({\n\t\t\tmirrored: true,\n\t\t\tglyphClass: \"fa-users\",\n\t\t\ttitle: \"Users\"\n\t\t}));\n\n\t\tthis.updateStatus();\n\n\t\tthis.listenTo(this.options.groupCollection, \"select\", this.onGroupSelected.bind(this));\n\t},\n\n\tupdateStatus: function updateStatus() {\n\t\tif (this.currentGroup) {\n\t\t\tthis.detachChildView(\"body\");\n\t\t\tif (!this.grid) this.renderGrid();\n\t\t} else {\n\t\t\tthis.statusView = new BlankStatus({ message: \"No group selected.\" });\n\t\t\tthis.showChildView(\"body\", this.statusView);\n\t\t}\n\t},\n\n\trenderGrid: function renderGrid() {\n\t\tvar _this3 = this;\n\n\t\tvar isMember = function isMember(userModel) {\n\t\t\tvar result = false;\n\n\t\t\tif (_this3.currentGroup) {\n\t\t\t\tif (userModel && userModel.has(\"groups\") && _.includes(userModel.get(\"groups\"), _this3.currentGroup.get(\"code\"))) result = true;\n\t\t\t}\n\n\t\t\treturn result;\n\t\t};\n\n\t\tvar columns = [{\n\t\t\tname: \"member\",\n\t\t\tlabel: \"Member\",\n\t\t\tcell: Backgrid.Cell.extend({\n\t\t\t\tclassName: \"clickable\",\n\t\t\t\tevents: {\n\t\t\t\t\tclick: \"onClick\"\n\t\t\t\t},\n\t\t\t\tonClick: function onClick() {\n\t\t\t\t\tthis.model.collection.trigger(\"row:clicked\", this.model);\n\t\t\t\t},\n\t\t\t\trender: function render() {\n\t\t\t\t\tthis.$el.html(\"<span class='fa-circle \" + (isMember(this.model) ? \" fas membership-status-in' title='Is a member'\" : \"fal membership-status-out' title='Is not a member'\") + \"></span>\");\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t}),\n\t\t\teditable: false,\n\t\t\tsortValue: ServerGrid.stringSort\n\t\t}, { name: \"username\", label: \"Username\", cell: \"string\", editable: false }, { name: \"surname\", label: \"Surname\", cell: \"string\", editable: false }, { name: \"firstname\", label: \"First Name\", cell: \"string\", editable: false }, { name: \"userGrade\", label: \"Grade\", cell: \"string\", editable: false }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new UserCollection({ currentGroup: this.currentGroup.get(\"code\") }),\n\t\t\tclickable: true,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counter,\n\t\t\t\ttemplate: \"Users $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tthis.Collection = this.grid.collection;\n\n\t\tthis.listenTo(this.grid, \"row:clicked\", this.onMembershipToggle.bind(this));\n\t\tthis.bindEvents(this.Collection, this.collectionEvents);\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar roles = {\n\t\t\tstudent: settings.roles.student,\n\t\t\tteacher: settings.roles.teacher\n\t\t};\n\n\t\tvar rolesFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"rolesFilter\",\n\t\t\tlabel: \"Roles\",\n\t\t\tcategories: [{\n\t\t\t\titems: _.fromPairs(_.compact(_.map(roles, function (val, key) {\n\t\t\t\t\tif (key === \"*\") return;\n\t\t\t\t\treturn [key, val.name];\n\t\t\t\t})))\n\t\t\t}],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar gradeFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"gradeFilter\",\n\t\t\tlabel: \"Year of Study\",\n\t\t\tserver: true,\n\t\t\tcategories: _.map(settings.gradeList, function (val, key) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: key,\n\t\t\t\t\titems: _.reduce(val.sort(function (a, b) {\n\t\t\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t\t\t}), function (sum, num) {\n\t\t\t\t\t\tsum.push({ name: num.value, label: num.name });return sum;\n\t\t\t\t\t}, [])\n\t\t\t\t};\n\t\t\t})\n\t\t};\n\n\t\tthis.ui.filters.prepend(this.grid.filter({\n\t\t\tfilterContainer: this.ui.filters,\n\t\t\tfilters: [textFilter, rolesFilter, gradeFilter],\n\t\t\tdefaultFilters: [\"textFilter\"]\n\t\t}).render().el);\n\t},\n\n\tonGroupSelected: function onGroupSelected(groupModel) {\n\t\tthis.currentGroup = groupModel;\n\t\tthis.ui.grid.empty();\n\t\tthis.ui.filters.empty();\n\t\tthis.ui.paging.empty();\n\t\tthis.renderGrid();\n\t},\n\n\tonUserSelected: function onUserSelected(userModel) {\n\t\tthis.options.userCollection.trigger(\"select\", userModel);\n\t},\n\n\tonMembershipToggle: function onMembershipToggle(userModel) {\n\t\tvar _this4 = this;\n\n\t\t// Educators can't modify membership\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\t\tif (rester.hasAccess(rester.p.educatorControl, user) && !this.currentGroup.get(\"educatorControl\")) return;\n\n\t\tvar groups = userModel.get(\"groups\") || [];\n\n\t\tvar action = \"\";\n\t\tif (_.includes(groups, this.currentGroup.get(\"code\"))) action = \"DELETE\";else action = \"PUT\";\n\n\t\t$.ajax({\n\t\t\tmethod: action,\n\t\t\turl: settings.urlRoot + \"/api/1.0/groups/\" + encodeURIComponent(this.currentGroup.get(\"code\")) + \"/users/\" + encodeURIComponent(userModel.get(\"username\")),\n\t\t\tsuccess: function success() {\n\t\t\t\tif (action === \"PUT\") {\n\t\t\t\t\tuserModel.set(\"groups\", groups.concat([_this4.currentGroup.get(\"code\")]));\n\t\t\t\t\t_this4.currentGroup.set(\"membership_count\", (parseInt(_this4.currentGroup.get(\"membership_count\"), 10) || 0) + 1);\n\t\t\t\t} else {\n\t\t\t\t\tuserModel.set(\"groups\", _.without(groups, _this4.currentGroup.get(\"code\")));\n\t\t\t\t\t_this4.currentGroup.set(\"membership_count\", Math.max(0, (parseInt(_this4.currentGroup.get(\"membership_count\"), 10) || 0) - 1));\n\t\t\t\t}\n\n\t\t\t\tuserModel.trigger(\"reset\", userModel);\n\t\t\t},\n\t\t\terror: function error(e) {\n\t\t\t\tvar err = e.responseJSON ? e.responseJSON.detail || e.responseJSON.info : e.message;\n\t\t\t\tradio.trigger(App.Events.Commands.Toast, { content: err, icon: \"fa-times\", iconColour: \"red\" });\n\t\t\t}\n\t\t});\n\t},\n\n\tonDestroy: function onDestroy() {\n\t\tthis.stopListening(this.options.groupCollection);\n\t}\n});\n\n// -----------------------------------------------------------------------------\n\nvar ManagerHeader = ActionHeader.extend({\n\ttitleView: function titleView() {\n\t\treturn ActionTitle;\n\t},\n\n\tonTitleReady: function onTitleReady() {\n\t\tthis.eventBus.trigger(\"action-title:change-glyph\", \"fa-user-plus\");\n\t\tthis.eventBus.trigger(\"action-title:change-title\", \"Group Membership\");\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"content group-membership-manager\",\n\n\ttemplate: require(\"../templates/membershipManager.nunj\").manager,\n\n\tregions: {\n\t\theader: \".header-region\",\n\t\tstatus: \".status-region\",\n\t\tgroupSelector: \".group-selector-region\",\n\t\tuserManipulator: \".user-manipulator-region\"\n\t},\n\n\tui: {\n\t\theaderRegion: \".header-region\",\n\t\tstatusRegion: \".status-region\",\n\t\tgroupSelectorRegion: \".group-selector-region\",\n\t\tuserManipulatorRegion: \".user-manipulator-region\",\n\n\t\tbuttonSwitchAspect: \".button-switch-aspect\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.startCode = options.code;\n\n\t\tthis.eventBus = new Backbone.Marionette.Application();\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.renderLoadingStatus();\n\n\t\tthis.ui.statusRegion.addClass(\"hide\");\n\t\tthis.ui.headerRegion.removeClass(\"hide\");\n\t\tthis.ui.groupSelectorRegion.removeClass(\"hide\");\n\n\t\tthis.header = new ManagerHeader({ eventBus: this.eventBus });\n\t\tthis.getRegion(\"header\").show(this.header);\n\n\t\tthis.groupSelector = new GroupSelector({ code: this.startCode });\n\t\tthis.listenTo(this.groupSelector, \"select\", this.onGroupChange.bind(this));\n\t\tthis.showChildView(\"groupSelector\", this.groupSelector);\n\t},\n\n\trenderLoadingStatus: function renderLoadingStatus() {\n\t\tthis.showChildView(\"status\", new StatusView({ type: \"loading\" }));\n\t},\n\n\trenderError: function renderError(error) {\n\t\tthis.showChildView(\"status\", new ErrorView({ fetchError: error }));\n\t},\n\n\tonGroupChange: function onGroupChange(group) {\n\t\tthis.startCode = null;\n\n\t\tthis.userManipulator = new UserManipulator({\n\t\t\tgroup: group\n\t\t});\n\t\tthis.ui.userManipulatorRegion.removeClass(\"hide\");\n\t\tthis.showChildView(\"userManipulator\", this.userManipulator);\n\n\t\tradio.trigger(App.Events.Commands.Navigate, \"/groups/manageMembership/\" + group.get(\"code\"), { trigger: false });\n\t},\n\n\tonGroupSelected: function onGroupSelected(groupModel) {\n\t\tthis.currentGroup = groupModel;\n\t},\n\n\tonDestroy: function onDestroy() {\n\t\tthis.stopListening(this.groupCollection);\n\t\tthis.stopListening(this.userCollection);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1lbWJlcnNoaXBNYW5hZ2VyLmpzIl0sIm5hbWVzIjpbIl8iLCJyZXF1aXJlIiwiQmFja2JvbmUiLCJzZXR0aW5ncyIsIiQiLCJyZXN0ZXIiLCJBcHAiLCJBY3Rpb25IZWFkZXIiLCJBY3Rpb25UaXRsZSIsIkVycm9yVmlldyIsIkJhY2tncmlkIiwiU3RhdHVzVmlldyIsIlVzZXJNb2RlbCIsIlNlcnZlckdyaWQiLCJTZWxlY3RyYSIsInJhZGlvIiwiUmFkaW8iLCJjaGFubmVsIiwiVXNlckNvbGxlY3Rpb24iLCJQYWdlYWJsZUNvbGxlY3Rpb24iLCJleHRlbmQiLCJtb2RlbCIsInVybCIsInVybFJvb3QiLCJlbmNvZGVVUklDb21wb25lbnQiLCJjdXJyZW50R3JvdXAiLCJzdGF0ZSIsInBhZ2VTaXplIiwibW9kZSIsInF1ZXJ5UGFyYW1zIiwic29ydEtleSIsImluaXRpYWxpemUiLCJvcHRpb25zIiwicGFyc2VTdGF0ZSIsInJlc3AiLCJ0b3RhbFJlY29yZHMiLCJ0b3RhbCIsInBhcnNlUmVjb3JkcyIsInJvd3MiLCJCbGFua1N0YXR1cyIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiY2xhc3NOYW1lIiwidGVtcGxhdGUiLCJibGFua1N0YXR1cyIsInRlbXBsYXRlQ29udGV4dCIsImdldE1lc3NhZ2UiLCJtZXNzYWdlIiwiSGVhZGVyIiwiaGVhZGVyIiwidWkiLCJmaWx0ZXJDb250YWluZXIiLCJpc01pcnJvcmVkIiwibWlycm9yZWQiLCJnZXRHbHlwaCIsImdseXBoQ2xhc3MiLCJnZXRUaXRsZSIsInRpdGxlIiwiZ2V0RmlsdGVyQ29udGFpbmVyIiwiR3JvdXBTZWxlY3RvciIsImlkIiwiZ3JvdXBTZWxlY3RvciIsImdyb3VwcyIsImV2ZW50cyIsImNvZGUiLCJvblJlbmRlciIsInVzZXIiLCJyZXF1ZXN0IiwiRXZlbnRzIiwiUmVxdWVzdHMiLCJDdXJyZW50VXNlciIsInMiLCJmZXRjaCIsInVzZXJuYW1lIiwiZGVsYXlMb2FkIiwia2V5IiwidmFsdWUiLCJwYXJhbXMiLCJleHRlbmRlZE5hbWUiLCJkZWZhdWx0Iiwic2VsZWN0Iiwic2VydmVyIiwicGFnaW5nIiwiaW5maW5pdGUiLCJzaG93IiwiZWwiLCJvbkdyb3VwQ2hhbmdlIiwiZXZ0IiwiZGF0YSIsInRyaWdnZXIiLCJVc2VyTWFuaXB1bGF0b3IiLCJzZXJ2ZXJMaXN0TGF5b3V0IiwicmVnaW9ucyIsImZpbHRlciIsImJvZHkiLCJjb3VudGVyIiwiZmlsdGVycyIsImdyaWQiLCJjb2xsZWN0aW9uRXZlbnRzIiwiZ3JvdXAiLCJzaG93Q2hpbGRWaWV3IiwidXBkYXRlU3RhdHVzIiwibGlzdGVuVG8iLCJncm91cENvbGxlY3Rpb24iLCJvbkdyb3VwU2VsZWN0ZWQiLCJiaW5kIiwiZGV0YWNoQ2hpbGRWaWV3IiwicmVuZGVyR3JpZCIsInN0YXR1c1ZpZXciLCJpc01lbWJlciIsInJlc3VsdCIsInVzZXJNb2RlbCIsImhhcyIsImluY2x1ZGVzIiwiZ2V0IiwiY29sdW1ucyIsIm5hbWUiLCJsYWJlbCIsImNlbGwiLCJDZWxsIiwiY2xpY2siLCJvbkNsaWNrIiwiY29sbGVjdGlvbiIsInJlbmRlciIsIiRlbCIsImh0bWwiLCJlZGl0YWJsZSIsInNvcnRWYWx1ZSIsInN0cmluZ1NvcnQiLCJjbGlja2FibGUiLCJlbGVtZW50IiwiQ29sbGVjdGlvbiIsIm9uTWVtYmVyc2hpcFRvZ2dsZSIsImJpbmRFdmVudHMiLCJ0ZXh0RmlsdGVyIiwidHlwZSIsImRlYm91bmNlIiwicm9sZXMiLCJzdHVkZW50IiwidGVhY2hlciIsInJvbGVzRmlsdGVyIiwiY2F0ZWdvcmllcyIsIml0ZW1zIiwiZnJvbVBhaXJzIiwiY29tcGFjdCIsIm1hcCIsInZhbCIsImdyYWRlRmlsdGVyIiwiZ3JhZGVMaXN0IiwicmVkdWNlIiwic29ydCIsImEiLCJiIiwibGV4aWNhbCIsInRvVXBwZXJDYXNlIiwibG9jYWxlQ29tcGFyZSIsInN1bSIsIm51bSIsInB1c2giLCJwcmVwZW5kIiwiZGVmYXVsdEZpbHRlcnMiLCJncm91cE1vZGVsIiwiZW1wdHkiLCJvblVzZXJTZWxlY3RlZCIsInVzZXJDb2xsZWN0aW9uIiwiaGFzQWNjZXNzIiwicCIsImVkdWNhdG9yQ29udHJvbCIsImFjdGlvbiIsImFqYXgiLCJtZXRob2QiLCJzdWNjZXNzIiwic2V0IiwiY29uY2F0IiwicGFyc2VJbnQiLCJ3aXRob3V0IiwiTWF0aCIsIm1heCIsImVycm9yIiwiZXJyIiwiZSIsInJlc3BvbnNlSlNPTiIsImRldGFpbCIsImluZm8iLCJDb21tYW5kcyIsIlRvYXN0IiwiY29udGVudCIsImljb24iLCJpY29uQ29sb3VyIiwib25EZXN0cm95Iiwic3RvcExpc3RlbmluZyIsIk1hbmFnZXJIZWFkZXIiLCJ0aXRsZVZpZXciLCJvblRpdGxlUmVhZHkiLCJldmVudEJ1cyIsIm1vZHVsZSIsImV4cG9ydHMiLCJtYW5hZ2VyIiwic3RhdHVzIiwidXNlck1hbmlwdWxhdG9yIiwiaGVhZGVyUmVnaW9uIiwic3RhdHVzUmVnaW9uIiwiZ3JvdXBTZWxlY3RvclJlZ2lvbiIsInVzZXJNYW5pcHVsYXRvclJlZ2lvbiIsImJ1dHRvblN3aXRjaEFzcGVjdCIsInN0YXJ0Q29kZSIsIkFwcGxpY2F0aW9uIiwicmVuZGVyTG9hZGluZ1N0YXR1cyIsImFkZENsYXNzIiwicmVtb3ZlQ2xhc3MiLCJnZXRSZWdpb24iLCJyZW5kZXJFcnJvciIsImZldGNoRXJyb3IiLCJOYXZpZ2F0ZSJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsSUFBSUMsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNQyxXQUFXRCxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNRSxXQUFXRixRQUFRLGNBQVIsQ0FBakI7QUFDQSxJQUFNRyxJQUFJSCxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1JLFNBQVNKLFFBQVEsUUFBUixDQUFmOztBQUVBLElBQU1LLE1BQU1MLFFBQVEsYUFBUixDQUFaO0FBQ0EsSUFBTU0sZUFBZU4sUUFBUSx3QkFBUixDQUFyQjtBQUNBLElBQU1PLGNBQWNQLFFBQVEsdUJBQVIsQ0FBcEI7QUFDQSxJ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ci5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgcmVzdGVyID0gcmVxdWlyZShcInJlc3RlclwiKTtcblxuY29uc3QgQXBwID0gcmVxdWlyZShcIi4uLy4uL2luZGV4XCIpO1xuY29uc3QgQWN0aW9uSGVhZGVyID0gcmVxdWlyZShcIi4uLy4uL2xpYi9hY3Rpb25IZWFkZXJcIik7XG5jb25zdCBBY3Rpb25UaXRsZSA9IHJlcXVpcmUoXCIuLi8uLi9saWIvYWN0aW9uVGl0bGVcIik7XG5jb25zdCBFcnJvclZpZXcgPSByZXF1aXJlKFwiLi4vLi4vbGliL2Vycm9yVmlld1wiKTtcbmNvbnN0IEJhY2tncmlkID0gcmVxdWlyZShcImJhY2tncmlkXCIpO1xuY29uc3QgU3RhdHVzVmlldyA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc3RhdHVzVmlld1wiKTtcbmNvbnN0IFVzZXJNb2RlbCA9IHJlcXVpcmUoXCIuLi8uLi91c2Vycy91c2VyTW9kZWxcIik7XG5jb25zdCBTZXJ2ZXJHcmlkID0gcmVxdWlyZShcIi4uLy4uL2xpYi9zZXJ2ZXJHcmlkXCIpO1xuY29uc3QgU2VsZWN0cmEgPSByZXF1aXJlKFwiLi4vLi4vbGliL3NlbGVjdHJhXCIpO1xuXG5jb25zdCByYWRpbyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJnbG9iYWxcIik7XG5cbmNvbnN0IFVzZXJDb2xsZWN0aW9uID0gQmFja2JvbmUuUGFnZWFibGVDb2xsZWN0aW9uLmV4dGVuZCh7XG5cdG1vZGVsOiBVc2VyTW9kZWwsXG5cblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvdXNlcnM/c2Nob29sVHlwZXM9dHJ1ZSZwYWdlZD10cnVlJmdyb3VwPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuY3VycmVudEdyb3VwKTtcblx0fSxcblxuXHRzdGF0ZToge1xuXHRcdHBhZ2VTaXplOiAxNSxcblx0fSxcblx0bW9kZTogXCJzZXJ2ZXJcIixcblxuXHRxdWVyeVBhcmFtczoge1xuXHRcdHBhZ2VTaXplOiBcInBhZ2VTaXplXCIsXG5cdFx0c29ydEtleTogXCJzb3J0QnlcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5jdXJyZW50R3JvdXAgPSBvcHRpb25zLmN1cnJlbnRHcm91cDtcblx0fSxcblxuXHRwYXJzZVN0YXRlOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0cmV0dXJuIHsgdG90YWxSZWNvcmRzOiByZXNwLnRvdGFsIH07XG5cdH0sXG5cblx0cGFyc2VSZWNvcmRzOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0cmV0dXJuIHJlc3Aucm93cztcblx0fSxcbn0pO1xuXG5jb25zdCBCbGFua1N0YXR1cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiYmxhbmstc3RhdHVzXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvbWVtYmVyc2hpcE1hbmFnZXIubnVualwiKS5ibGFua1N0YXR1cyxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRnZXRNZXNzYWdlOiAoKSA9PiB0aGlzLm9wdGlvbnMubWVzc2FnZSxcblx0XHR9O1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXHR9LFxufSk7XG5cbmNvbnN0IEhlYWRlciA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiaGVhZGVyXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvbWVtYmVyc2hpcE1hbmFnZXIubnVualwiKS5oZWFkZXIsXG5cblx0dWk6IHtcblx0XHRmaWx0ZXJDb250YWluZXI6IFwiLmZpbHRlci1jb250YWluZXJcIixcblx0fSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRpc01pcnJvcmVkOiAoKSA9PiB0aGlzLm9wdGlvbnMubWlycm9yZWQsXG5cdFx0XHRnZXRHbHlwaDogKCkgPT4gdGhpcy5vcHRpb25zLmdseXBoQ2xhc3MsXG5cdFx0XHRnZXRUaXRsZTogKCkgPT4gdGhpcy5vcHRpb25zLnRpdGxlLFxuXHRcdH07XG5cdH0sXG5cblx0Z2V0RmlsdGVyQ29udGFpbmVyOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy51aS5maWx0ZXJDb250YWluZXI7XG5cdH0sXG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFVzZXIgTWFuaXB1bGF0aW9uIEFzcGVjdFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmNvbnN0IEdyb3VwU2VsZWN0b3IgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImdyb3VwLXNlbGVjdG9yIGdyb3VwLXNlbGVjdG9yXCIsXG5cdGlkOiBcImdyb3VwLXNlbGVjdG9yXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvbWVtYmVyc2hpcE1hbmFnZXIubnVualwiKS5ncm91cFNlbGVjdG9yLFxuXG5cdHVpOiB7XG5cdFx0Z3JvdXBzOiBcInNlbGVjdFtuYW1lPWdyb3Vwc11cIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNoYW5nZSBAdWkuZ3JvdXBzXCI6IFwib25Hcm91cENoYW5nZVwiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLmNvZGUgPSBvcHRpb25zLmNvZGU7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHVzZXIgPSByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpO1xuXG5cdFx0Y29uc3QgcyA9IHtcblx0XHRcdGZldGNoOiBgJHtzZXR0aW5ncy51cmxSb290fS9hcGkvMS4wL3VzZXJzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHVzZXIudXNlcm5hbWUpfS9lbnJvbG1lbnRgLFxuXHRcdFx0ZGVsYXlMb2FkOiB0cnVlLFxuXHRcdFx0a2V5OiBcImNvZGVcIixcblx0XHRcdHZhbHVlOiBcIm5hbWVcIixcblx0XHRcdHBhcmFtczoge1xuXHRcdFx0XHRleHRlbmRlZE5hbWU6IHRydWUsXG5cdFx0XHR9LFxuXHRcdH07XG5cblx0XHRpZiAodGhpcy5jb2RlKSB7XG5cdFx0XHRzLmRlZmF1bHQgPSB7XG5cdFx0XHRcdGZldGNoOiBgJHtzZXR0aW5ncy51cmxSb290fS9hY2FjaWEvZ3JvdXBzL2dldFNwZWNpZmljR3JvdXA/Y29kZT0ke2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLmNvZGUpfWAsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGNvbnN0IHNlbGVjdCA9IG5ldyBTZWxlY3RyYSh7XG5cdFx0XHRzZXJ2ZXI6IHMsXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0cGFnZVNpemU6IDIwLFxuXHRcdFx0XHRpbmZpbml0ZTogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0fSk7XG5cdFx0c2VsZWN0LnNob3coeyBlbDogdGhpcy51aS5ncm91cHMgfSk7XG5cdH0sXG5cblx0b25Hcm91cENoYW5nZTogZnVuY3Rpb24oZXZ0LCBkYXRhKSB7XG5cdFx0dGhpcy50cmlnZ2VyKFwic2VsZWN0XCIsIGRhdGEpO1xuXHR9LFxufSk7XG5cbmNvbnN0IFVzZXJNYW5pcHVsYXRvciA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwibGlzdCB1c2VyLW1hbmlwdWxhdG9yXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvbWVtYmVyc2hpcE1hbmFnZXIubnVualwiKS5zZXJ2ZXJMaXN0TGF5b3V0LFxuXG5cdHJlZ2lvbnM6IHtcblx0XHRoZWFkZXI6IFwiLmhlYWRlclwiLFxuXHRcdGZpbHRlcjogXCIuZmlsdGVyLXJlZ2lvblwiLFxuXHRcdGJvZHk6IFwiZGl2LmdyaWRcIixcblx0fSxcblxuXHR1aToge1xuXHRcdGNvdW50ZXI6IFwiLm9wcy1iYXIgLmNvdW50ZXJcIixcblx0XHRmaWx0ZXJzOiBcIi5vcHMtYmFyIC5maWx0ZXJzXCIsXG5cdFx0cGFnaW5nOiBcIi5wYWdpbmdcIixcblx0XHRncmlkOiBcImRpdi5ncmlkXCIsXG5cdH0sXG5cblx0Y29sbGVjdGlvbkV2ZW50czoge1xuXHRcdFwicm93OmNsaWNrZWRcIjogXCJvbk1lbWJlcnNoaXBUb2dnbGVcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucztcblx0XHR0aGlzLmN1cnJlbnRHcm91cCA9IG9wdGlvbnMuZ3JvdXA7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImhlYWRlclwiLCBuZXcgSGVhZGVyKHtcblx0XHRcdG1pcnJvcmVkOiB0cnVlLFxuXHRcdFx0Z2x5cGhDbGFzczogXCJmYS11c2Vyc1wiLFxuXHRcdFx0dGl0bGU6IFwiVXNlcnNcIixcblx0XHR9KSk7XG5cblx0XHR0aGlzLnVwZGF0ZVN0YXR1cygpO1xuXG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLm9wdGlvbnMuZ3JvdXBDb2xsZWN0aW9uLCBcInNlbGVjdFwiLCB0aGlzLm9uR3JvdXBTZWxlY3RlZC5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHR1cGRhdGVTdGF0dXM6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLmN1cnJlbnRHcm91cCkge1xuXHRcdFx0dGhpcy5kZXRhY2hDaGlsZFZpZXcoXCJib2R5XCIpO1xuXHRcdFx0aWYgKCF0aGlzLmdyaWQpXG5cdFx0XHRcdHRoaXMucmVuZGVyR3JpZCgpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMuc3RhdHVzVmlldyA9IG5ldyBCbGFua1N0YXR1cyh7IG1lc3NhZ2U6IFwiTm8gZ3JvdXAgc2VsZWN0ZWQuXCIgfSk7XG5cdFx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJib2R5XCIsIHRoaXMuc3RhdHVzVmlldyk7XG5cdFx0fVxuXHR9LFxuXG5cdHJlbmRlckdyaWQ6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGlzTWVtYmVyID0gdXNlck1vZGVsID0+IHtcblx0XHRcdGxldCByZXN1bHQgPSBmYWxzZTtcblxuXHRcdFx0aWYgKHRoaXMuY3VycmVudEdyb3VwKSB7XG5cdFx0XHRcdGlmICh1c2VyTW9kZWwgJiYgdXNlck1vZGVsLmhhcyhcImdyb3Vwc1wiKSAmJiBfLmluY2x1ZGVzKHVzZXJNb2RlbC5nZXQoXCJncm91cHNcIiksIHRoaXMuY3VycmVudEdyb3VwLmdldChcImNvZGVcIikpKVxuXHRcdFx0XHRcdHJlc3VsdCA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fTtcblxuXHRcdGNvbnN0IGNvbHVtbnMgPSBbXG5cdFx0XHR7XG5cdFx0XHRcdG5hbWU6IFwibWVtYmVyXCIsXG5cdFx0XHRcdGxhYmVsOiBcIk1lbWJlclwiLFxuXHRcdFx0XHRjZWxsOiBCYWNrZ3JpZC5DZWxsLmV4dGVuZCh7XG5cdFx0XHRcdFx0Y2xhc3NOYW1lOiBcImNsaWNrYWJsZVwiLFxuXHRcdFx0XHRcdGV2ZW50czoge1xuXHRcdFx0XHRcdFx0Y2xpY2s6IFwib25DbGlja1wiLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0b25DbGljazogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHR0aGlzLm1vZGVsLmNvbGxlY3Rpb24udHJpZ2dlcihcInJvdzpjbGlja2VkXCIsIHRoaXMubW9kZWwpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0cmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHRoaXMuJGVsLmh0bWwoXCI8c3BhbiBjbGFzcz0nZmEtY2lyY2xlIFwiICsgKGlzTWVtYmVyKHRoaXMubW9kZWwpID9cblx0XHRcdFx0XHRcdFx0XCIgZmFzIG1lbWJlcnNoaXAtc3RhdHVzLWluJyB0aXRsZT0nSXMgYSBtZW1iZXInXCIgOiBcImZhbCBtZW1iZXJzaGlwLXN0YXR1cy1vdXQnIHRpdGxlPSdJcyBub3QgYSBtZW1iZXInXCIpICsgXCI+PC9zcGFuPlwiKTtcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRlZGl0YWJsZTogZmFsc2UsXG5cdFx0XHRcdHNvcnRWYWx1ZTogU2VydmVyR3JpZC5zdHJpbmdTb3J0LFxuXHRcdFx0fSxcblx0XHRcdHsgbmFtZTogXCJ1c2VybmFtZVwiLCBsYWJlbDogXCJVc2VybmFtZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJzdXJuYW1lXCIsIGxhYmVsOiBcIlN1cm5hbWVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiZmlyc3RuYW1lXCIsIGxhYmVsOiBcIkZpcnN0IE5hbWVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwidXNlckdyYWRlXCIsIGxhYmVsOiBcIkdyYWRlXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdF07XG5cblx0XHR0aGlzLmdyaWQgPSBuZXcgU2VydmVyR3JpZCh7XG5cdFx0XHRlbDogdGhpcy51aS5ncmlkLFxuXHRcdFx0Y29sdW1uczogY29sdW1ucyxcblx0XHRcdGNvbGxlY3Rpb246IG5ldyBVc2VyQ29sbGVjdGlvbih7IGN1cnJlbnRHcm91cDogdGhpcy5jdXJyZW50R3JvdXAuZ2V0KFwiY29kZVwiKSB9KSxcblx0XHRcdGNsaWNrYWJsZTogdHJ1ZSxcblx0XHRcdGNvdW50ZXI6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5jb3VudGVyLFxuXHRcdFx0XHR0ZW1wbGF0ZTogXCJVc2VycyAkc3RhcnQgLSAkZW5kIG9mICR0b3RhbFwiLFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLnBhZ2luZyxcblx0XHRcdH0sXG5cdFx0fSk7XG5cblx0XHR0aGlzLkNvbGxlY3Rpb24gPSB0aGlzLmdyaWQuY29sbGVjdGlvbjtcblxuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ncmlkLCBcInJvdzpjbGlja2VkXCIsIHRoaXMub25NZW1iZXJzaGlwVG9nZ2xlLmJpbmQodGhpcykpO1xuXHRcdHRoaXMuYmluZEV2ZW50cyh0aGlzLkNvbGxlY3Rpb24sIHRoaXMuY29sbGVjdGlvbkV2ZW50cyk7XG5cblx0XHRjb25zdCB0ZXh0RmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJ0ZXh0XCIsXG5cdFx0XHRuYW1lOiBcInRleHRGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlRleHQgU2VhcmNoXCIsXG5cdFx0XHRkZWJvdW5jZTogMjAwLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdH07XG5cblx0XHRjb25zdCByb2xlcyA9IHtcblx0XHRcdHN0dWRlbnQ6IHNldHRpbmdzLnJvbGVzLnN0dWRlbnQsXG5cdFx0XHR0ZWFjaGVyOiBzZXR0aW5ncy5yb2xlcy50ZWFjaGVyLFxuXHRcdH07XG5cblx0XHRjb25zdCByb2xlc0ZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiaXRlbWl6ZWRcIixcblx0XHRcdG5hbWU6IFwicm9sZXNGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlJvbGVzXCIsXG5cdFx0XHRjYXRlZ29yaWVzOiBbe1xuXHRcdFx0XHRpdGVtczogXy5mcm9tUGFpcnMoXy5jb21wYWN0KF8ubWFwKHJvbGVzLCAodmFsLCBrZXkpID0+IHtcblx0XHRcdFx0XHRpZiAoa2V5ID09PSBcIipcIilcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRyZXR1cm4gW2tleSwgdmFsLm5hbWVdO1xuXHRcdFx0XHR9KSkpLFxuXHRcdFx0fV0sXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdGNvbnN0IGdyYWRlRmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJncmFkZUZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiWWVhciBvZiBTdHVkeVwiLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdFx0Y2F0ZWdvcmllczogXy5tYXAoc2V0dGluZ3MuZ3JhZGVMaXN0LCAodmFsLCBrZXkpID0+ICh7XG5cdFx0XHRcdGxhYmVsOiBrZXksXG5cdFx0XHRcdGl0ZW1zOiBfLnJlZHVjZSh2YWwuc29ydCgoYSwgYikgPT4gKFwibGV4aWNhbFwiIGluIGEgPyBhLmxleGljYWwgOiBhLm5hbWUpLnRvVXBwZXJDYXNlKCkubG9jYWxlQ29tcGFyZSgoXCJsZXhpY2FsXCIgaW4gYiA/IGIubGV4aWNhbCA6IGIubmFtZSkudG9VcHBlckNhc2UoKSkpLFxuXHRcdFx0XHRcdChzdW0sIG51bSkgPT4geyBzdW0ucHVzaCh7IG5hbWU6IG51bS52YWx1ZSwgbGFiZWw6IG51bS5uYW1lIH0pOyByZXR1cm4gc3VtOyB9LCBbXSksXG5cdFx0XHR9KSksXG5cdFx0fTtcblxuXHRcdHRoaXMudWkuZmlsdGVycy5wcmVwZW5kKHRoaXMuZ3JpZC5maWx0ZXIoe1xuXHRcdFx0ZmlsdGVyQ29udGFpbmVyOiB0aGlzLnVpLmZpbHRlcnMsXG5cdFx0XHRmaWx0ZXJzOiBbdGV4dEZpbHRlciwgcm9sZXNGaWx0ZXIsIGdyYWRlRmlsdGVyXSxcblx0XHRcdGRlZmF1bHRGaWx0ZXJzOiBbXCJ0ZXh0RmlsdGVyXCJdLFxuXHRcdH0pLnJlbmRlcigpLmVsKTtcblx0fSxcblxuXHRvbkdyb3VwU2VsZWN0ZWQ6IGZ1bmN0aW9uKGdyb3VwTW9kZWwpIHtcblx0XHR0aGlzLmN1cnJlbnRHcm91cCA9IGdyb3VwTW9kZWw7XG5cdFx0dGhpcy51aS5ncmlkLmVtcHR5KCk7XG5cdFx0dGhpcy51aS5maWx0ZXJzLmVtcHR5KCk7XG5cdFx0dGhpcy51aS5wYWdpbmcuZW1wdHkoKTtcblx0XHR0aGlzLnJlbmRlckdyaWQoKTtcblx0fSxcblxuXHRvblVzZXJTZWxlY3RlZDogZnVuY3Rpb24odXNlck1vZGVsKSB7XG5cdFx0dGhpcy5vcHRpb25zLnVzZXJDb2xsZWN0aW9uLnRyaWdnZXIoXCJzZWxlY3RcIiwgdXNlck1vZGVsKTtcblx0fSxcblxuXHRvbk1lbWJlcnNoaXBUb2dnbGU6IGZ1bmN0aW9uKHVzZXJNb2RlbCkge1xuXHRcdC8vIEVkdWNhdG9ycyBjYW4ndCBtb2RpZnkgbWVtYmVyc2hpcFxuXHRcdGNvbnN0IHVzZXIgPSByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpO1xuXHRcdGlmIChyZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmVkdWNhdG9yQ29udHJvbCwgdXNlcikgJiYgIXRoaXMuY3VycmVudEdyb3VwLmdldChcImVkdWNhdG9yQ29udHJvbFwiKSlcblx0XHRcdHJldHVybjtcblxuXHRcdGNvbnN0IGdyb3VwcyA9IHVzZXJNb2RlbC5nZXQoXCJncm91cHNcIikgfHwgW107XG5cblx0XHRsZXQgYWN0aW9uID0gXCJcIjtcblx0XHRpZiAoXy5pbmNsdWRlcyhncm91cHMsIHRoaXMuY3VycmVudEdyb3VwLmdldChcImNvZGVcIikpKVxuXHRcdFx0YWN0aW9uID0gXCJERUxFVEVcIjtcblx0XHRlbHNlXG5cdFx0XHRhY3Rpb24gPSBcIlBVVFwiO1xuXG5cdFx0JC5hamF4KHtcblx0XHRcdG1ldGhvZDogYWN0aW9uLFxuXHRcdFx0dXJsOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9ncm91cHMvXCIgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy5jdXJyZW50R3JvdXAuZ2V0KFwiY29kZVwiKSkgKyBcIi91c2Vycy9cIiArIGVuY29kZVVSSUNvbXBvbmVudCh1c2VyTW9kZWwuZ2V0KFwidXNlcm5hbWVcIikpLFxuXHRcdFx0c3VjY2VzczogKCkgPT4ge1xuXHRcdFx0XHRpZiAoYWN0aW9uID09PSBcIlBVVFwiKSB7XG5cdFx0XHRcdFx0dXNlck1vZGVsLnNldChcImdyb3Vwc1wiLCBncm91cHMuY29uY2F0KFt0aGlzLmN1cnJlbnRHcm91cC5nZXQoXCJjb2RlXCIpXSkpO1xuXHRcdFx0XHRcdHRoaXMuY3VycmVudEdyb3VwLnNldChcIm1lbWJlcnNoaXBfY291bnRcIiwgKHBhcnNlSW50KHRoaXMuY3VycmVudEdyb3VwLmdldChcIm1lbWJlcnNoaXBfY291bnRcIiksIDEwKSB8fCAwKSArIDEpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdHVzZXJNb2RlbC5zZXQoXCJncm91cHNcIiwgXy53aXRob3V0KGdyb3VwcywgdGhpcy5jdXJyZW50R3JvdXAuZ2V0KFwiY29kZVwiKSkpO1xuXHRcdFx0XHRcdHRoaXMuY3VycmVudEdyb3VwLnNldChcIm1lbWJlcnNoaXBfY291bnRcIiwgTWF0aC5tYXgoMCwgKHBhcnNlSW50KHRoaXMuY3VycmVudEdyb3VwLmdldChcIm1lbWJlcnNoaXBfY291bnRcIiksIDEwKSB8fCAwKSAtIDEpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHVzZXJNb2RlbC50cmlnZ2VyKFwicmVzZXRcIiwgdXNlck1vZGVsKTtcblx0XHRcdH0sXG5cdFx0XHRlcnJvcjogZSA9PiB7XG5cdFx0XHRcdGNvbnN0IGVyciA9IGUucmVzcG9uc2VKU09OID8gKGUucmVzcG9uc2VKU09OLmRldGFpbCB8fCBlLnJlc3BvbnNlSlNPTi5pbmZvKSA6IGUubWVzc2FnZTtcblx0XHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7IGNvbnRlbnQ6IGVyciwgaWNvbjogXCJmYS10aW1lc1wiLCBpY29uQ29sb3VyOiBcInJlZFwiIH0pO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fSxcblxuXHRvbkRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLm9wdGlvbnMuZ3JvdXBDb2xsZWN0aW9uKTtcblx0fSxcbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBNYW5hZ2VySGVhZGVyID0gQWN0aW9uSGVhZGVyLmV4dGVuZCh7XG5cdHRpdGxlVmlldzogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIEFjdGlvblRpdGxlO1xuXHR9LFxuXG5cdG9uVGl0bGVSZWFkeTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwiYWN0aW9uLXRpdGxlOmNoYW5nZS1nbHlwaFwiLCBcImZhLXVzZXItcGx1c1wiKTtcblx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJhY3Rpb24tdGl0bGU6Y2hhbmdlLXRpdGxlXCIsIFwiR3JvdXAgTWVtYmVyc2hpcFwiKTtcblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiY29udGVudCBncm91cC1tZW1iZXJzaGlwLW1hbmFnZXJcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9tZW1iZXJzaGlwTWFuYWdlci5udW5qXCIpLm1hbmFnZXIsXG5cblx0cmVnaW9uczoge1xuXHRcdGhlYWRlcjogXCIuaGVhZGVyLXJlZ2lvblwiLFxuXHRcdHN0YXR1czogXCIuc3RhdHVzLXJlZ2lvblwiLFxuXHRcdGdyb3VwU2VsZWN0b3I6IFwiLmdyb3VwLXNlbGVjdG9yLXJlZ2lvblwiLFxuXHRcdHVzZXJNYW5pcHVsYXRvcjogXCIudXNlci1tYW5pcHVsYXRvci1yZWdpb25cIixcblx0fSxcblxuXHR1aToge1xuXHRcdGhlYWRlclJlZ2lvbjogXCIuaGVhZGVyLXJlZ2lvblwiLFxuXHRcdHN0YXR1c1JlZ2lvbjogXCIuc3RhdHVzLXJlZ2lvblwiLFxuXHRcdGdyb3VwU2VsZWN0b3JSZWdpb246IFwiLmdyb3VwLXNlbGVjdG9yLXJlZ2lvblwiLFxuXHRcdHVzZXJNYW5pcHVsYXRvclJlZ2lvbjogXCIudXNlci1tYW5pcHVsYXRvci1yZWdpb25cIixcblxuXHRcdGJ1dHRvblN3aXRjaEFzcGVjdDogXCIuYnV0dG9uLXN3aXRjaC1hc3BlY3RcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5zdGFydENvZGUgPSBvcHRpb25zLmNvZGU7XG5cblx0XHR0aGlzLmV2ZW50QnVzID0gbmV3IEJhY2tib25lLk1hcmlvbmV0dGUuQXBwbGljYXRpb24oKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5yZW5kZXJMb2FkaW5nU3RhdHVzKCk7XG5cblx0XHR0aGlzLnVpLnN0YXR1c1JlZ2lvbi5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5oZWFkZXJSZWdpb24ucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkuZ3JvdXBTZWxlY3RvclJlZ2lvbi5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cblx0XHR0aGlzLmhlYWRlciA9IG5ldyBNYW5hZ2VySGVhZGVyKHsgZXZlbnRCdXM6IHRoaXMuZXZlbnRCdXMgfSk7XG5cdFx0dGhpcy5nZXRSZWdpb24oXCJoZWFkZXJcIikuc2hvdyh0aGlzLmhlYWRlcik7XG5cblx0XHR0aGlzLmdyb3VwU2VsZWN0b3IgPSBuZXcgR3JvdXBTZWxlY3Rvcih7IGNvZGU6IHRoaXMuc3RhcnRDb2RlIH0pO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ncm91cFNlbGVjdG9yLCBcInNlbGVjdFwiLCB0aGlzLm9uR3JvdXBDaGFuZ2UuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiZ3JvdXBTZWxlY3RvclwiLCB0aGlzLmdyb3VwU2VsZWN0b3IpO1xuXHR9LFxuXG5cdHJlbmRlckxvYWRpbmdTdGF0dXM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcInN0YXR1c1wiLCBuZXcgU3RhdHVzVmlldyh7IHR5cGU6IFwibG9hZGluZ1wiIH0pKTtcblx0fSxcblxuXHRyZW5kZXJFcnJvcjogZnVuY3Rpb24oZXJyb3IpIHtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJzdGF0dXNcIiwgbmV3IEVycm9yVmlldyh7IGZldGNoRXJyb3I6IGVycm9yIH0pKTtcblx0fSxcblxuXHRvbkdyb3VwQ2hhbmdlOiBmdW5jdGlvbihncm91cCkge1xuXHRcdHRoaXMuc3RhcnRDb2RlID0gbnVsbDtcblxuXHRcdHRoaXMudXNlck1hbmlwdWxhdG9yID0gbmV3IFVzZXJNYW5pcHVsYXRvcih7XG5cdFx0XHRncm91cDogZ3JvdXAsXG5cdFx0fSk7XG5cdFx0dGhpcy51aS51c2VyTWFuaXB1bGF0b3JSZWdpb24ucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcInVzZXJNYW5pcHVsYXRvclwiLCB0aGlzLnVzZXJNYW5pcHVsYXRvcik7XG5cblx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuTmF2aWdhdGUsIGAvZ3JvdXBzL21hbmFnZU1lbWJlcnNoaXAvJHtncm91cC5nZXQoXCJjb2RlXCIpfWAsIHsgdHJpZ2dlcjogZmFsc2UgfSk7XG5cdH0sXG5cblx0b25Hcm91cFNlbGVjdGVkOiBmdW5jdGlvbihncm91cE1vZGVsKSB7XG5cdFx0dGhpcy5jdXJyZW50R3JvdXAgPSBncm91cE1vZGVsO1xuXHR9LFxuXG5cdG9uRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKHRoaXMuZ3JvdXBDb2xsZWN0aW9uKTtcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcodGhpcy51c2VyQ29sbGVjdGlvbik7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar modalKit = require(\"../../lib/modalKit/modal\");\nvar StatusView = require(\"../../lib/statusView\");\n\n// -----------------------------------------------------------------------------\n// Display\n// -----------------------------------------------------------------------------\n\nvar TokenCancellationModalDisplayBody = modalKit.Body.extend({\n\tclassName: \"token-cancellation-modal-display-body\",\n\n\ttemplate: require(\"../templates/tokenCancellationModal.nunj\").displayBody\n});\n\nvar TokenCancellationModalDisplayPage = modalKit.Page.extend({\n\theaderView: function headerView() {\n\t\treturn modalKit.Header.extend({ title: \"Group Token\" });\n\t},\n\n\tbodyView: function bodyView() {\n\t\treturn TokenCancellationModalDisplayBody;\n\t},\n\n\tfooterView: function footerView() {\n\t\treturn modalKit.Footer.extend({\n\t\t\tbehaviors: {\n\t\t\t\tCloseButton: {}\n\t\t\t}\n\t\t});\n\t},\n\n\tonClose: function onClose() {\n\t\tthis.closeModal(\"close:success\");\n\t}\n});\n\n// -----------------------------------------------------------------------------\n// Error\n// -----------------------------------------------------------------------------\n\nvar TokenCancellationModalErrorBody = modalKit.Body.extend({\n\tclassName: \"token-cancellation-modal-error-body\",\n\n\ttemplate: require(\"../templates/tokenCancellationModal.nunj\").errorBody\n});\n\nvar TokenCancellationModalErrorPage = modalKit.Page.extend({\n\theaderView: function headerView() {\n\t\treturn modalKit.Header.extend({ title: this.options.userOptions.prompt });\n\t},\n\n\tbodyView: function bodyView() {\n\t\treturn TokenCancellationModalErrorBody;\n\t},\n\n\tfooterView: function footerView() {\n\t\treturn modalKit.Footer.extend({\n\t\t\tbehaviors: {\n\t\t\t\tCloseButton: {}\n\t\t\t}\n\t\t});\n\t},\n\n\tonClose: function onClose() {\n\t\tthis.closeModal(\"close:error\");\n\t}\n});\n\n// -----------------------------------------------------------------------------\n// Status\n// -----------------------------------------------------------------------------\n\nvar TokenCancellationModalStatusBody = modalKit.Body.extend({\n\tclassName: \"token-cancellation-modal-status-body\",\n\n\ttemplate: require(\"../templates/tokenCancellationModal.nunj\").statusBody,\n\n\tregions: {\n\t\tstatus: \".status-region\"\n\t},\n\n\tonRender: function onRender() {\n\t\t// Create the status view\n\t\tthis.showChildView(\"status\", new StatusView({\n\t\t\tmessage: \"Cancelling token...\",\n\t\t\ttype: \"loading\"\n\t\t}));\n\n\t\t// Cancel the token\n\t\tthis.destroyModel();\n\t},\n\n\tonModelDestroyed: function onModelDestroyed() {\n\t\tthis.changePage(\"display\");\n\t},\n\n\tonModelError: function onModelError(model, response) {\n\t\tconsole.error(response);\n\t\tthis.changePage(\"error\");\n\t}\n});\n\nvar TokenCancellationModalStatusPage = modalKit.Page.extend({\n\theaderView: function headerView() {\n\t\treturn modalKit.Header.extend({ title: this.options.userOptions.prompt });\n\t},\n\n\tbodyView: function bodyView() {\n\t\treturn TokenCancellationModalStatusBody;\n\t},\n\n\tfooterView: function footerView() {\n\t\treturn modalKit.Footer.extend({\n\t\t\tbehaviors: {}\n\t\t});\n\t}\n});\n\n// -----------------------------------------------------------------------------\n// Confirmation\n// -----------------------------------------------------------------------------\n\nvar TokenCancellationModalConfirmationBody = modalKit.Body.extend({\n\tclassName: \"token-cancellation-modal-confirmation-body\",\n\n\ttemplate: require(\"../templates/tokenCancellationModal.nunj\").confirmationBody\n});\n\nvar TokenCancellationModalConfirmationPage = modalKit.Page.extend({\n\theaderView: function headerView() {\n\t\treturn modalKit.Header.extend({ title: this.options.userOptions.prompt });\n\t},\n\n\tbodyView: function bodyView() {\n\t\treturn TokenCancellationModalConfirmationBody;\n\t},\n\n\tfooterView: function footerView() {\n\t\treturn modalKit.Footer.extend({\n\t\t\tbehaviors: {\n\t\t\t\tYesButton: {},\n\t\t\t\tNoButton: {}\n\t\t\t}\n\t\t});\n\t},\n\n\tonYes: function onYes() {\n\t\tthis.changePage(\"status\");\n\t},\n\n\tonNo: function onNo() {\n\t\tthis.closeModal(\"no\");\n\t}\n});\n\n// -----------------------------------------------------------------------------\n// Host\n// -----------------------------------------------------------------------------\n\nmodule.exports = modalKit.Host.extend({\n\tpages: {\n\t\tconfirmation: TokenCancellationModalConfirmationPage,\n\t\tstatus: TokenCancellationModalStatusPage,\n\t\terror: TokenCancellationModalErrorPage,\n\t\tdisplay: TokenCancellationModalDisplayPage\n\t},\n\n\toptions: {\n\t\tfirstPage: \"confirmation\"\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRva2VuQ2FuY2VsbGF0aW9uTW9kYWwuanMiXSwibmFtZXMiOlsibW9kYWxLaXQiLCJyZXF1aXJlIiwiU3RhdHVzVmlldyIsIlRva2VuQ2FuY2VsbGF0aW9uTW9kYWxEaXNwbGF5Qm9keSIsIkJvZHkiLCJleHRlbmQiLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsImRpc3BsYXlCb2R5IiwiVG9rZW5DYW5jZWxsYXRpb25Nb2RhbERpc3BsYXlQYWdlIiwiUGFnZSIsImhlYWRlclZpZXciLCJIZWFkZXIiLCJ0aXRsZSIsImJvZHlWaWV3IiwiZm9vdGVyVmlldyIsIkZvb3RlciIsImJlaGF2aW9ycyIsIkNsb3NlQnV0dG9uIiwib25DbG9zZSIsImNsb3NlTW9kYWwiLCJUb2tlbkNhbmNlbGxhdGlvbk1vZGFsRXJyb3JCb2R5IiwiZXJyb3JCb2R5IiwiVG9rZW5DYW5jZWxsYXRpb25Nb2RhbEVycm9yUGFnZSIsIm9wdGlvbnMiLCJ1c2VyT3B0aW9ucyIsInByb21wdCIsIlRva2VuQ2FuY2VsbGF0aW9uTW9kYWxTdGF0dXNCb2R5Iiwic3RhdHVzQm9keSIsInJlZ2lvbnMiLCJzdGF0dXMiLCJvblJlbmRlciIsInNob3dDaGlsZFZpZXciLCJtZXNzYWdlIiwidHlwZSIsImRlc3Ryb3lNb2RlbCIsIm9uTW9kZWxEZXN0cm95ZWQiLCJjaGFuZ2VQYWdlIiwib25Nb2RlbEVycm9yIiwibW9kZWwiLCJyZXNwb25zZSIsImNvbnNvbGUiLCJlcnJvciIsIlRva2VuQ2FuY2VsbGF0aW9uTW9kYWxTdGF0dXNQYWdlIiwiVG9rZW5DYW5jZWxsYXRpb25Nb2RhbENvbmZpcm1hdGlvbkJvZHkiLCJjb25maXJtYXRpb25Cb2R5IiwiVG9rZW5DYW5jZWxsYXRpb25Nb2RhbENvbmZpcm1hdGlvblBhZ2UiLCJZZXNCdXR0b24iLCJOb0J1dHRvbiIsIm9uWWVzIiwib25ObyIsIm1vZHVsZSIsImV4cG9ydHMiLCJIb3N0IiwicGFnZXMiLCJjb25maXJtYXRpb24iLCJkaXNwbGF5IiwiZmly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LENBQWNoRCxNQUFkLENBQXFCO0FBQ3JDaUQsUUFBTztBQUNOQyxnQkFBY1Qsc0NBRFI7QUFFTmhCLFVBQVFhLGdDQUZGO0FBR05ELFNBQU9uQiwrQkFIRDtBQUlOaUMsV0FBUy9DO0FBSkgsRUFEOEI7O0FBUXJDZSxVQUFTO0FBQ1JpQyxhQUFXO0FBREg7QUFSNEIsQ0FBckIsQ0FBakIiLCJmaWxlIjoidG9rZW5DYW5jZWxsYXRpb25Nb2RhbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgbW9kYWxLaXQgPSByZXF1aXJlKFwiLi4vLi4vbGliL21vZGFsS2l0L21vZGFsXCIpO1xuY29uc3QgU3RhdHVzVmlldyA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc3RhdHVzVmlld1wiKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERpc3BsYXlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IFRva2VuQ2FuY2VsbGF0aW9uTW9kYWxEaXNwbGF5Qm9keSA9IG1vZGFsS2l0LkJvZHkuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInRva2VuLWNhbmNlbGxhdGlvbi1tb2RhbC1kaXNwbGF5LWJvZHlcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy90b2tlbkNhbmNlbGxhdGlvbk1vZGFsLm51bmpcIikuZGlzcGxheUJvZHksXG59KTtcblxuY29uc3QgVG9rZW5DYW5jZWxsYXRpb25Nb2RhbERpc3BsYXlQYWdlID0gbW9kYWxLaXQuUGFnZS5leHRlbmQoe1xuXHRoZWFkZXJWaWV3OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gbW9kYWxLaXQuSGVhZGVyLmV4dGVuZCh7IHRpdGxlOiBcIkdyb3VwIFRva2VuXCIgfSk7XG5cdH0sXG5cblx0Ym9keVZpZXc6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBUb2tlbkNhbmNlbGxhdGlvbk1vZGFsRGlzcGxheUJvZHk7XG5cdH0sXG5cblx0Zm9vdGVyVmlldzogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIG1vZGFsS2l0LkZvb3Rlci5leHRlbmQoe1xuXHRcdFx0YmVoYXZpb3JzOiB7XG5cdFx0XHRcdENsb3NlQnV0dG9uOiB7fSxcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH0sXG5cblx0b25DbG9zZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jbG9zZU1vZGFsKFwiY2xvc2U6c3VjY2Vzc1wiKTtcblx0fSxcbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRXJyb3Jcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IFRva2VuQ2FuY2VsbGF0aW9uTW9kYWxFcnJvckJvZHkgPSBtb2RhbEtpdC5Cb2R5LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJ0b2tlbi1jYW5jZWxsYXRpb24tbW9kYWwtZXJyb3ItYm9keVwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL3Rva2VuQ2FuY2VsbGF0aW9uTW9kYWwubnVualwiKS5lcnJvckJvZHksXG59KTtcblxuY29uc3QgVG9rZW5DYW5jZWxsYXRpb25Nb2RhbEVycm9yUGFnZSA9IG1vZGFsS2l0LlBhZ2UuZXh0ZW5kKHtcblx0aGVhZGVyVmlldzogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIG1vZGFsS2l0LkhlYWRlci5leHRlbmQoeyB0aXRsZTogdGhpcy5vcHRpb25zLnVzZXJPcHRpb25zLnByb21wdCB9KTtcblx0fSxcblxuXHRib2R5VmlldzogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIFRva2VuQ2FuY2VsbGF0aW9uTW9kYWxFcnJvckJvZHk7XG5cdH0sXG5cblx0Zm9vdGVyVmlldzogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIG1vZGFsS2l0LkZvb3Rlci5leHRlbmQoe1xuXHRcdFx0YmVoYXZpb3JzOiB7XG5cdFx0XHRcdENsb3NlQnV0dG9uOiB7fSxcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH0sXG5cblx0b25DbG9zZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jbG9zZU1vZGFsKFwiY2xvc2U6ZXJyb3JcIik7XG5cdH0sXG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFN0YXR1c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgVG9rZW5DYW5jZWxsYXRpb25Nb2RhbFN0YXR1c0JvZHkgPSBtb2RhbEtpdC5Cb2R5LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJ0b2tlbi1jYW5jZWxsYXRpb24tbW9kYWwtc3RhdHVzLWJvZHlcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy90b2tlbkNhbmNlbGxhdGlvbk1vZGFsLm51bmpcIikuc3RhdHVzQm9keSxcblxuXHRyZWdpb25zOiB7XG5cdFx0c3RhdHVzOiBcIi5zdGF0dXMtcmVnaW9uXCIsXG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIENyZWF0ZSB0aGUgc3RhdHVzIHZpZXdcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJzdGF0dXNcIiwgbmV3IFN0YXR1c1ZpZXcoe1xuXHRcdFx0bWVzc2FnZTogXCJDYW5jZWxsaW5nIHRva2VuLi4uXCIsXG5cdFx0XHR0eXBlOiBcImxvYWRpbmdcIixcblx0XHR9KSk7XG5cblx0XHQvLyBDYW5jZWwgdGhlIHRva2VuXG5cdFx0dGhpcy5kZXN0cm95TW9kZWwoKTtcblx0fSxcblxuXHRvbk1vZGVsRGVzdHJveWVkOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmNoYW5nZVBhZ2UoXCJkaXNwbGF5XCIpO1xuXHR9LFxuXG5cdG9uTW9kZWxFcnJvcjogZnVuY3Rpb24obW9kZWwsIHJlc3BvbnNlKSB7XG5cdFx0Y29uc29sZS5lcnJvcihyZXNwb25zZSk7XG5cdFx0dGhpcy5jaGFuZ2VQYWdlKFwiZXJyb3JcIik7XG5cdH0sXG59KTtcblxuY29uc3QgVG9rZW5DYW5jZWxsYXRpb25Nb2RhbFN0YXR1c1BhZ2UgPSBtb2RhbEtpdC5QYWdlLmV4dGVuZCh7XG5cdGhlYWRlclZpZXc6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBtb2RhbEtpdC5IZWFkZXIuZXh0ZW5kKHsgdGl0bGU6IHRoaXMub3B0aW9ucy51c2VyT3B0aW9ucy5wcm9tcHQgfSk7XG5cdH0sXG5cblx0Ym9keVZpZXc6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBUb2tlbkNhbmNlbGxhdGlvbk1vZGFsU3RhdHVzQm9keTtcblx0fSxcblxuXHRmb290ZXJWaWV3OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gbW9kYWxLaXQuRm9vdGVyLmV4dGVuZCh7XG5cdFx0XHRiZWhhdmlvcnM6IHtcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH0sXG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvbmZpcm1hdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgVG9rZW5DYW5jZWxsYXRpb25Nb2RhbENvbmZpcm1hdGlvbkJvZHkgPSBtb2RhbEtpdC5Cb2R5LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJ0b2tlbi1jYW5jZWxsYXRpb24tbW9kYWwtY29uZmlybWF0aW9uLWJvZHlcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy90b2tlbkNhbmNlbGxhdGlvbk1vZGFsLm51bmpcIikuY29uZmlybWF0aW9uQm9keSxcbn0pO1xuXG5jb25zdCBUb2tlbkNhbmNlbGxhdGlvbk1vZGFsQ29uZmlybWF0aW9uUGFnZSA9IG1vZGFsS2l0LlBhZ2UuZXh0ZW5kKHtcblx0aGVhZGVyVmlldzogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIG1vZGFsS2l0LkhlYWRlci5leHRlbmQoeyB0aXRsZTogdGhpcy5vcHRpb25zLnVzZXJPcHRpb25zLnByb21wdCB9KTtcblx0fSxcblxuXHRib2R5VmlldzogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIFRva2VuQ2FuY2VsbGF0aW9uTW9kYWxDb25maXJtYXRpb25Cb2R5O1xuXHR9LFxuXG5cdGZvb3RlclZpZXc6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBtb2RhbEtpdC5Gb290ZXIuZXh0ZW5kKHtcblx0XHRcdGJlaGF2aW9yczoge1xuXHRcdFx0XHRZZXNCdXR0b246IHt9LFxuXHRcdFx0XHROb0J1dHRvbjoge30sXG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9LFxuXG5cdG9uWWVzOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmNoYW5nZVBhZ2UoXCJzdGF0dXNcIik7XG5cdH0sXG5cblx0b25ObzogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jbG9zZU1vZGFsKFwibm9cIik7XG5cdH0sXG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEhvc3Rcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbm1vZHVsZS5leHBvcnRzID0gbW9kYWxLaXQuSG9zdC5leHRlbmQoe1xuXHRwYWdlczoge1xuXHRcdGNvbmZpcm1hdGlvbjogVG9rZW5DYW5jZWxsYXRpb25Nb2RhbENvbmZpcm1hdGlvblBhZ2UsXG5cdFx0c3RhdHVzOiBUb2tlbkNhbmNlbGxhdGlvbk1vZGFsU3RhdHVzUGFnZSxcblx0XHRlcnJvcjogVG9rZW5DYW5jZWxsYXRpb25Nb2RhbEVycm9yUGFnZSxcblx0XHRkaXNwbGF5OiBUb2tlbkNhbmNlbGxhdGlvbk1vZGFsRGlzcGxheVBhZ2UsXG5cdH0sXG5cblx0b3B0aW9uczoge1xuXHRcdGZpcnN0UGFnZTogXCJjb25maXJtYXRpb25cIixcblx0fSxcbn0pO1xuIl19",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\n\nvar modalKit = require(\"../../lib/modalKit/modal\");\nvar StatusView = require(\"../../lib/statusView\");\n\n// -----------------------------------------------------------------------------\n// Display\n// -----------------------------------------------------------------------------\n\nvar TokenCreationModalDisplayBody = modalKit.Body.extend({\n\tclassName: \"token-creation-modal-display-body\",\n\n\ttemplate: require(\"../templates/tokenCreationModal.nunj\").displayBody\n});\n\nvar TokenCreationModalDisplayPage = modalKit.Page.extend({\n\theaderView: function headerView() {\n\t\treturn modalKit.Header.extend({ title: \"Group Token\" });\n\t},\n\n\tbodyView: function bodyView() {\n\t\treturn TokenCreationModalDisplayBody;\n\t},\n\n\tfooterView: function footerView() {\n\t\treturn modalKit.Footer.extend({\n\t\t\tbehaviors: {\n\t\t\t\tCloseButton: {}\n\t\t\t}\n\t\t});\n\t},\n\n\tonClose: function onClose() {\n\t\tthis.closeModal(\"close:success\");\n\t}\n});\n\n// -----------------------------------------------------------------------------\n// Error\n// -----------------------------------------------------------------------------\n\nvar TokenCreationModalErrorBody = modalKit.Body.extend({\n\tclassName: \"token-creation-modal-error-body\",\n\n\ttemplate: require(\"../templates/tokenCreationModal.nunj\").errorBody\n});\n\nvar TokenCreationModalErrorPage = modalKit.Page.extend({\n\theaderView: function headerView() {\n\t\treturn modalKit.Header.extend({ title: this.options.userOptions.prompt });\n\t},\n\n\tbodyView: function bodyView() {\n\t\treturn TokenCreationModalErrorBody;\n\t},\n\n\tfooterView: function footerView() {\n\t\treturn modalKit.Footer.extend({\n\t\t\tbehaviors: {\n\t\t\t\tCloseButton: {}\n\t\t\t}\n\t\t});\n\t},\n\n\tonClose: function onClose() {\n\t\tthis.closeModal(\"close:error\");\n\t}\n});\n\n// -----------------------------------------------------------------------------\n// Status\n// -----------------------------------------------------------------------------\n\nvar TokenCreationModalStatusBody = modalKit.Body.extend({\n\tclassName: \"token-creation-modal-status-body\",\n\n\ttemplate: require(\"../templates/tokenCreationModal.nunj\").statusBody,\n\n\tregions: {\n\t\tstatus: \".status-region\"\n\t},\n\n\tonRender: function onRender() {\n\t\t// Create the status view\n\t\tthis.showChildView(\"status\", new StatusView({\n\t\t\tmessage: \"Requesting token...\",\n\t\t\ttype: \"loading\"\n\t\t}));\n\n\t\t// Request the token\n\t\tthis.saveModel();\n\t},\n\n\tonModelSaved: function onModelSaved() {\n\t\tthis.changePage(\"display\");\n\t},\n\n\tonModelError: function onModelError() {\n\t\tthis.changePage(\"error\");\n\t}\n});\n\nvar TokenCreationModalStatusPage = modalKit.Page.extend({\n\theaderView: function headerView() {\n\t\treturn modalKit.Header.extend({ title: this.options.userOptions.prompt });\n\t},\n\n\tbodyView: function bodyView() {\n\t\treturn TokenCreationModalStatusBody;\n\t},\n\n\tfooterView: function footerView() {\n\t\treturn modalKit.Footer.extend({\n\t\t\tbehaviors: {}\n\t\t});\n\t}\n});\n\n// -----------------------------------------------------------------------------\n// Form\n// -----------------------------------------------------------------------------\n\nvar TokenCreationModalFormBody = modalKit.Body.extend({\n\tclassName: \"token-creation-modal-form-body\",\n\n\ttemplate: require(\"../templates/tokenCreationModal.nunj\").formBody,\n\n\tui: {\n\t\texpirationForm: \".expiration-form\",\n\t\texpiry: \".option-region div.selectable\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.expiry\": \"onExpiryChange\"\n\t},\n\n\tmodelEvents: {\n\t\t\"change:life\": \"onLifeChanged\"\n\t},\n\n\tonLifetimeChange: function onLifetimeChange() {\n\t\tthis.model.set(\"lifetime\", parseInt(this.ui.lifetime.val(), 10));\n\t},\n\n\tonLifeChanged: function onLifeChanged() {\n\t\tswitch (this.model.get(\"life\")) {\n\t\t\tcase \"finite\":\n\t\t\t\tthis.ui.expirationForm.removeClass(\"expiration-form-disabled\");\n\t\t\t\tthis.ui.expirationForm.prop(\"disabled\", false);\n\t\t\t\tbreak;\n\n\t\t\tcase \"infinite\":\n\t\t\t\tthis.ui.expirationForm.addClass(\"expiration-form-disabled\");\n\t\t\t\tthis.ui.expirationForm.prop(\"disabled\", true);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.error(\"Invalid group token life value - cannot update form\");\n\t\t}\n\t},\n\n\tonExpiryChange: function onExpiryChange(evt) {\n\t\tvar target = $(evt.currentTarget);\n\n\t\tvar ticked = $(\".fa-check-circle\", target).length;\n\n\t\tif (ticked) return;\n\n\t\t$(\"div.selectable .fal\", this.el).toggleClass(\"fa-circle fa-check-circle\");\n\n\t\tthis.model.set(\"life\", $(\"div.selectable .fa-check-circle\").parent().hasClass(\"forever\") ? \"infinite\" : \"finite\");\n\t}\n});\n\nvar TokenCreationModalFormPage = modalKit.Page.extend({\n\theaderView: function headerView() {\n\t\treturn modalKit.Header.extend({ title: this.options.userOptions.prompt });\n\t},\n\n\tbodyView: function bodyView() {\n\t\treturn TokenCreationModalFormBody;\n\t},\n\n\tfooterView: function footerView() {\n\t\treturn modalKit.Footer.extend({\n\t\t\tbehaviors: {\n\t\t\t\tAcceptButton: { requireValidation: true },\n\t\t\t\tCancelButton: {}\n\t\t\t}\n\t\t});\n\t},\n\n\tonAccept: function onAccept() {\n\t\tthis.changePage(\"status\");\n\t},\n\n\tonCancel: function onCancel() {\n\t\tthis.closeModal(\"cancel\");\n\t}\n});\n\n// -----------------------------------------------------------------------------\n// Host\n// -----------------------------------------------------------------------------\n\nmodule.exports = modalKit.Host.extend({\n\tpages: {\n\t\tform: TokenCreationModalFormPage,\n\t\tstatus: TokenCreationModalStatusPage,\n\t\terror: TokenCreationModalErrorPage,\n\t\tdisplay: TokenCreationModalDisplayPage\n\t},\n\n\toptions: {\n\t\tfirstPage: \"form\"\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRva2VuQ3JlYXRpb25Nb2RhbC5qcyJdLCJuYW1lcyI6WyIkIiwicmVxdWlyZSIsIm1vZGFsS2l0IiwiU3RhdHVzVmlldyIsIlRva2VuQ3JlYXRpb25Nb2RhbERpc3BsYXlCb2R5IiwiQm9keSIsImV4dGVuZCIsImNsYXNzTmFtZSIsInRlbXBsYXRlIiwiZGlzcGxheUJvZHkiLCJUb2tlbkNyZWF0aW9uTW9kYWxEaXNwbGF5UGFnZSIsIlBhZ2UiLCJoZWFkZXJWaWV3IiwiSGVhZGVyIiwidGl0bGUiLCJib2R5VmlldyIsImZvb3RlclZpZXciLCJGb290ZXIiLCJiZWhhdmlvcnMiLCJDbG9zZUJ1dHRvbiIsIm9uQ2xvc2UiLCJjbG9zZU1vZGFsIiwiVG9rZW5DcmVhdGlvbk1vZGFsRXJyb3JCb2R5IiwiZXJyb3JCb2R5IiwiVG9rZW5DcmVhdGlvbk1vZGFsRXJyb3JQYWdlIiwib3B0aW9ucyIsInVzZXJPcHRpb25zIiwicHJvbXB0IiwiVG9rZW5DcmVhdGlvbk1vZGFsU3RhdHVzQm9keSIsInN0YXR1c0JvZHkiLCJyZWdpb25zIiwic3RhdHVzIiwib25SZW5kZXIiLCJzaG93Q2hpbGRWaWV3IiwibWVzc2FnZSIsInR5cGUiLCJzYXZlTW9kZWwiLCJvbk1vZGVsU2F2ZWQiLCJjaGFuZ2VQYWdlIiwib25Nb2RlbEVycm9yIiwiVG9rZW5DcmVhdGlvbk1vZGFsU3RhdHVzUGFnZSIsIlRva2VuQ3JlYXRpb25Nb2RhbEZvcm1Cb2R5IiwiZm9ybUJvZHkiLCJ1aSIsImV4cGlyYXRpb25Gb3JtIiwiZXhwaXJ5IiwiZXZlbnRzIiwibW9kZWxFdmVudHMiLCJvbkxpZmV0aW1lQ2hhbmdlIiwibW9kZWwiLCJzZXQiLCJwYXJzZUludCIsImxpZmV0aW1lIiwidmFsIiwib25MaWZlQ2hhbmdlZCIsImdldCIsInJlbW92ZUNsYXNzIiwicHJvcCIsImFkZENsYXNzIiwiY29uc29sZSIsImVycm9yIiwib25FeHBpcnlDaGFuZ2UiLCJldnQiLCJ0YXJnZXQiLCJjdXJyZW50VGFyZ2V0IiwidGlja2VkIiwibGVuZ3RoIiwiZWwiLCJ0b2dnbGVDbGFzcyIsInBhcmVudCIsImhhc0NsYXNzIiwiVG9rZW5DcmVhdGlvbk1vZGFsRm9ybVBhZ2UiLCJBY2NlcHRCdXR0b24iLCJyZXF1aXJlVmFsaWRhdGlvbiIsIkNhbmNlbEJ1dHRvbiIsIm9uQWNjZXB0Iiwib25DYW5jZWwiLCJtb2R1bGUiLCJleHBvcnRzIiwiSG9zdCIsInBhZ2VzIiwiZm9ybSIsImRpc3BsYXkiLCJmaXJzdFBhZ2UiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWOztBQUVBLElBQU1DLFdBQVdELFFBQVEsMEJBQVIsQ0FBakI7QUFDQSxJQUFNRSxhQUFhRixRQUFRLHNCQUFSLENBQW5COztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxJQUFNRyxnQ0FBZ0NGLFNBQVNHLElBQVQsQ0FBY0MsTUFBZCxDQUFxQjtBQUMxREMsWUFBVyxtQ0FEK0M7O0FBRzFEQyxXQUFVUCxRQUFRLHNDQUFSLEVBQWdEUTtBQUhBLENBQXJCLENBQXRDOztBQU1BLElBQU1DLGdDQUFnQ1IsU0FBU1MsSUFBVCxDQUFjTCxNQUFkLENBQXFCO0FBQzFETSxhQUFZLHNCQUFXO0FBQ3RCLFNBQU9WLFNBQVNXLE1BQVQsQ0FBZ0JQLE1BQWhCLENBQXVCLEVBQUVRLE9BQU8sYUFBVCxFQUF2QixDQUFQO0FBQ0EsRUFIeUQ7O0FBSzFEQyxXQUFVLG9CQUFXO0FBQ3BCLFNBQU9YLDZCQUFQO0FBQ0EsRUFQeUQ7O0FBUzFEWSxhQUFZLHNCQUFXO0FBQ3RCLFNBQU9kLFNBQVNlLE1BQVQsQ0FBZ0JYLE1BQWhCLENBQXVCO0FBQzdCWSxjQUFXO0FBQ1ZDLGlCQUFhO0FBREg7QUFEa0IsR0FBdkIsQ0FBUDtBQUtBLEVBZnlEOztBQWlCMURDLFVBQVMsbUJBQVc7QUFDbkIsT0FBS0MsVUFBTCxDQUFnQixlQUFoQjtBQUNBO0FBbkJ5RCxDQUFyQixDQUF0Qzs7QUFzQkE7QUFDQTtBQUNBOztBQUVBLElBQU1DLDhCQUE4QnBC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QUFDdEIsU0FBT2QsU0FBU2UsTUFBVCxDQUFnQlgsTUFBaEIsQ0FBdUI7QUFDN0JZLGNBQVc7QUFDVnNELGtCQUFjLEVBQUVDLG1CQUFtQixJQUFyQixFQURKO0FBRVZDLGtCQUFjO0FBRko7QUFEa0IsR0FBdkIsQ0FBUDtBQU1BLEVBaEJzRDs7QUFrQnZEQyxXQUFVLG9CQUFXO0FBQ3BCLE9BQUtyQyxVQUFMLENBQWdCLFFBQWhCO0FBQ0EsRUFwQnNEOztBQXNCdkRzQyxXQUFVLG9CQUFXO0FBQ3BCLE9BQUt2RCxVQUFMLENBQWdCLFFBQWhCO0FBQ0E7QUF4QnNELENBQXJCLENBQW5DOztBQTJCQTtBQUNBO0FBQ0E7O0FBRUF3RCxPQUFPQyxPQUFQLEdBQWlCNUUsU0FBUzZFLElBQVQsQ0FBY3pFLE1BQWQsQ0FBcUI7QUFDckMwRSxRQUFPO0FBQ05DLFFBQU1WLDBCQURBO0FBRU54QyxVQUFRUyw0QkFGRjtBQUdOb0IsU0FBT3BDLDJCQUhEO0FBSU4wRCxXQUFTeEU7QUFKSCxFQUQ4Qjs7QUFRckNlLFVBQVM7QUFDUjBELGFBQVc7QUFESDtBQVI0QixDQUFyQixDQUFqQiIsImZpbGUiOiJ0b2tlbkNyZWF0aW9uTW9kYWwuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuXG5jb25zdCBtb2RhbEtpdCA9IHJlcXVpcmUoXCIuLi8uLi9saWIvbW9kYWxLaXQvbW9kYWxcIik7XG5jb25zdCBTdGF0dXNWaWV3ID0gcmVxdWlyZShcIi4uLy4uL2xpYi9zdGF0dXNWaWV3XCIpO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRGlzcGxheVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgVG9rZW5DcmVhdGlvbk1vZGFsRGlzcGxheUJvZHkgPSBtb2RhbEtpdC5Cb2R5LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJ0b2tlbi1jcmVhdGlvbi1tb2RhbC1kaXNwbGF5LWJvZHlcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy90b2tlbkNyZWF0aW9uTW9kYWwubnVualwiKS5kaXNwbGF5Qm9keSxcbn0pO1xuXG5jb25zdCBUb2tlbkNyZWF0aW9uTW9kYWxEaXNwbGF5UGFnZSA9IG1vZGFsS2l0LlBhZ2UuZXh0ZW5kKHtcblx0aGVhZGVyVmlldzogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIG1vZGFsS2l0LkhlYWRlci5leHRlbmQoeyB0aXRsZTogXCJHcm91cCBUb2tlblwiIH0pO1xuXHR9LFxuXG5cdGJvZHlWaWV3OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gVG9rZW5DcmVhdGlvbk1vZGFsRGlzcGxheUJvZHk7XG5cdH0sXG5cblx0Zm9vdGVyVmlldzogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIG1vZGFsS2l0LkZvb3Rlci5leHRlbmQoe1xuXHRcdFx0YmVoYXZpb3JzOiB7XG5cdFx0XHRcdENsb3NlQnV0dG9uOiB7fSxcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH0sXG5cblx0b25DbG9zZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jbG9zZU1vZGFsKFwiY2xvc2U6c3VjY2Vzc1wiKTtcblx0fSxcbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRXJyb3Jcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IFRva2VuQ3JlYXRpb25Nb2RhbEVycm9yQm9keSA9IG1vZGFsS2l0LkJvZHkuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInRva2VuLWNyZWF0aW9uLW1vZGFsLWVycm9yLWJvZHlcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy90b2tlbkNyZWF0aW9uTW9kYWwubnVualwiKS5lcnJvckJvZHksXG59KTtcblxuY29uc3QgVG9rZW5DcmVhdGlvbk1vZGFsRXJyb3JQYWdlID0gbW9kYWxLaXQuUGFnZS5leHRlbmQoe1xuXHRoZWFkZXJWaWV3OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gbW9kYWxLaXQuSGVhZGVyLmV4dGVuZCh7IHRpdGxlOiB0aGlzLm9wdGlvbnMudXNlck9wdGlvbnMucHJvbXB0IH0pO1xuXHR9LFxuXG5cdGJvZHlWaWV3OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gVG9rZW5DcmVhdGlvbk1vZGFsRXJyb3JCb2R5O1xuXHR9LFxuXG5cdGZvb3RlclZpZXc6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBtb2RhbEtpdC5Gb290ZXIuZXh0ZW5kKHtcblx0XHRcdGJlaGF2aW9yczoge1xuXHRcdFx0XHRDbG9zZUJ1dHRvbjoge30sXG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9LFxuXG5cdG9uQ2xvc2U6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY2xvc2VNb2RhbChcImNsb3NlOmVycm9yXCIpO1xuXHR9LFxufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdGF0dXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IFRva2VuQ3JlYXRpb25Nb2RhbFN0YXR1c0JvZHkgPSBtb2RhbEtpdC5Cb2R5LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJ0b2tlbi1jcmVhdGlvbi1tb2RhbC1zdGF0dXMtYm9keVwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL3Rva2VuQ3JlYXRpb25Nb2RhbC5udW5qXCIpLnN0YXR1c0JvZHksXG5cblx0cmVnaW9uczoge1xuXHRcdHN0YXR1czogXCIuc3RhdHVzLXJlZ2lvblwiLFxuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHQvLyBDcmVhdGUgdGhlIHN0YXR1cyB2aWV3XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwic3RhdHVzXCIsIG5ldyBTdGF0dXNWaWV3KHtcblx0XHRcdG1lc3NhZ2U6IFwiUmVxdWVzdGluZyB0b2tlbi4uLlwiLFxuXHRcdFx0dHlwZTogXCJsb2FkaW5nXCIsXG5cdFx0fSkpO1xuXG5cdFx0Ly8gUmVxdWVzdCB0aGUgdG9rZW5cblx0XHR0aGlzLnNhdmVNb2RlbCgpO1xuXHR9LFxuXG5cdG9uTW9kZWxTYXZlZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jaGFuZ2VQYWdlKFwiZGlzcGxheVwiKTtcblx0fSxcblxuXHRvbk1vZGVsRXJyb3I6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY2hhbmdlUGFnZShcImVycm9yXCIpO1xuXHR9LFxufSk7XG5cbmNvbnN0IFRva2VuQ3JlYXRpb25Nb2RhbFN0YXR1c1BhZ2UgPSBtb2RhbEtpdC5QYWdlLmV4dGVuZCh7XG5cdGhlYWRlclZpZXc6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBtb2RhbEtpdC5IZWFkZXIuZXh0ZW5kKHsgdGl0bGU6IHRoaXMub3B0aW9ucy51c2VyT3B0aW9ucy5wcm9tcHQgfSk7XG5cdH0sXG5cblx0Ym9keVZpZXc6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBUb2tlbkNyZWF0aW9uTW9kYWxTdGF0dXNCb2R5O1xuXHR9LFxuXG5cdGZvb3RlclZpZXc6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBtb2RhbEtpdC5Gb290ZXIuZXh0ZW5kKHtcblx0XHRcdGJlaGF2aW9yczoge1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fSxcbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRm9ybVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgVG9rZW5DcmVhdGlvbk1vZGFsRm9ybUJvZHkgPSBtb2RhbEtpdC5Cb2R5LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJ0b2tlbi1jcmVhdGlvbi1tb2RhbC1mb3JtLWJvZHlcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy90b2tlbkNyZWF0aW9uTW9kYWwubnVualwiKS5mb3JtQm9keSxcblxuXHR1aToge1xuXHRcdGV4cGlyYXRpb25Gb3JtOiBcIi5leHBpcmF0aW9uLWZvcm1cIixcblx0XHRleHBpcnk6IFwiLm9wdGlvbi1yZWdpb24gZGl2LnNlbGVjdGFibGVcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5leHBpcnlcIjogXCJvbkV4cGlyeUNoYW5nZVwiLFxuXHR9LFxuXG5cdG1vZGVsRXZlbnRzOiB7XG5cdFx0XCJjaGFuZ2U6bGlmZVwiOiBcIm9uTGlmZUNoYW5nZWRcIixcblx0fSxcblxuXHRvbkxpZmV0aW1lQ2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm1vZGVsLnNldChcImxpZmV0aW1lXCIsIHBhcnNlSW50KHRoaXMudWkubGlmZXRpbWUudmFsKCksIDEwKSk7XG5cdH0sXG5cblx0b25MaWZlQ2hhbmdlZDogZnVuY3Rpb24oKSB7XG5cdFx0c3dpdGNoICh0aGlzLm1vZGVsLmdldChcImxpZmVcIikpIHtcblx0XHRcdGNhc2UgXCJmaW5pdGVcIjpcblx0XHRcdFx0dGhpcy51aS5leHBpcmF0aW9uRm9ybS5yZW1vdmVDbGFzcyhcImV4cGlyYXRpb24tZm9ybS1kaXNhYmxlZFwiKTtcblx0XHRcdFx0dGhpcy51aS5leHBpcmF0aW9uRm9ybS5wcm9wKFwiZGlzYWJsZWRcIiwgZmFsc2UpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcImluZmluaXRlXCI6XG5cdFx0XHRcdHRoaXMudWkuZXhwaXJhdGlvbkZvcm0uYWRkQ2xhc3MoXCJleHBpcmF0aW9uLWZvcm0tZGlzYWJsZWRcIik7XG5cdFx0XHRcdHRoaXMudWkuZXhwaXJhdGlvbkZvcm0ucHJvcChcImRpc2FibGVkXCIsIHRydWUpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0Y29uc29sZS5lcnJvcihcIkludmFsaWQgZ3JvdXAgdG9rZW4gbGlmZSB2YWx1ZSAtIGNhbm5vdCB1cGRhdGUgZm9ybVwiKTtcblx0XHR9XG5cdH0sXG5cblx0b25FeHBpcnlDaGFuZ2U6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGNvbnN0IHRhcmdldCA9ICQoZXZ0LmN1cnJlbnRUYXJnZXQpO1xuXG5cdFx0Y29uc3QgdGlja2VkID0gJChcIi5mYS1jaGVjay1jaXJjbGVcIiwgdGFyZ2V0KS5sZW5ndGg7XG5cblx0XHRpZiAodGlja2VkKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0JChcImRpdi5zZWxlY3RhYmxlIC5mYWxcIiwgdGhpcy5lbCkudG9nZ2xlQ2xhc3MoXCJmYS1jaXJjbGUgZmEtY2hlY2stY2lyY2xlXCIpO1xuXG5cdFx0dGhpcy5tb2RlbC5zZXQoXCJsaWZlXCIsICQoXCJkaXYuc2VsZWN0YWJsZSAuZmEtY2hlY2stY2lyY2xlXCIpLnBhcmVudCgpLmhhc0NsYXNzKFwiZm9yZXZlclwiKSA/IFwiaW5maW5pdGVcIiA6IFwiZmluaXRlXCIpO1xuXHR9LFxufSk7XG5cbmNvbnN0IFRva2VuQ3JlYXRpb25Nb2RhbEZvcm1QYWdlID0gbW9kYWxLaXQuUGFnZS5leHRlbmQoe1xuXHRoZWFkZXJWaWV3OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gbW9kYWxLaXQuSGVhZGVyLmV4dGVuZCh7IHRpdGxlOiB0aGlzLm9wdGlvbnMudXNlck9wdGlvbnMucHJvbXB0IH0pO1xuXHR9LFxuXG5cdGJvZHlWaWV3OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gVG9rZW5DcmVhdGlvbk1vZGFsRm9ybUJvZHk7XG5cdH0sXG5cblx0Zm9vdGVyVmlldzogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIG1vZGFsS2l0LkZvb3Rlci5leHRlbmQoe1xuXHRcdFx0YmVoYXZpb3JzOiB7XG5cdFx0XHRcdEFjY2VwdEJ1dHRvbjogeyByZXF1aXJlVmFsaWRhdGlvbjogdHJ1ZSB9LFxuXHRcdFx0XHRDYW5jZWxCdXR0b246IHt9LFxuXHRcdFx0fSxcblx0XHR9KTtcblx0fSxcblxuXHRvbkFjY2VwdDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jaGFuZ2VQYWdlKFwic3RhdHVzXCIpO1xuXHR9LFxuXG5cdG9uQ2FuY2VsOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmNsb3NlTW9kYWwoXCJjYW5jZWxcIik7XG5cdH0sXG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEhvc3Rcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbm1vZHVsZS5leHBvcnRzID0gbW9kYWxLaXQuSG9zdC5leHRlbmQoe1xuXHRwYWdlczoge1xuXHRcdGZvcm06IFRva2VuQ3JlYXRpb25Nb2RhbEZvcm1QYWdlLFxuXHRcdHN0YXR1czogVG9rZW5DcmVhdGlvbk1vZGFsU3RhdHVzUGFnZSxcblx0XHRlcnJvcjogVG9rZW5DcmVhdGlvbk1vZGFsRXJyb3JQYWdlLFxuXHRcdGRpc3BsYXk6IFRva2VuQ3JlYXRpb25Nb2RhbERpc3BsYXlQYWdlLFxuXHR9LFxuXG5cdG9wdGlvbnM6IHtcblx0XHRmaXJzdFBhZ2U6IFwiZm9ybVwiLFxuXHR9LFxufSk7Il19",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\n\nvar settings = require(\"app-settings\");\n\nvar CustomGroupModel = require(\"./customGroupModel\");\nvar TokenCancellationModal = require(\"./tokenCancellationModal\");\nvar TokenCreationModal = require(\"./tokenCreationModal\");\nvar TokenModel = require(\"./tokenModel\");\nvar ServerGrid = require(\"../../lib/serverGrid\");\n\nvar Collection = Backbone.PageableCollection.extend({\n\tmodel: CustomGroupModel,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/groups/custom?paged=true\";\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"content group-token-manager\",\n\n\ttemplate: require(\"../templates/tokenManager.nunj\"),\n\n\tui: {\n\t\tcounter: \".ops-bar .counter\",\n\t\tfilters: \".ops-bar .filters\",\n\t\tpaging: \".paging\",\n\t\tgrid: \"div.grid\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.eventBus = new Backbone.Marionette.Application();\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"parentGroup\", label: \"Parent Group\", cell: \"string\", editable: false }, { name: \"name\", label: \"Custom Group\", cell: \"string\", editable: false }, { name: \"subject_name\", label: \"Subject\", cell: \"string\", editable: false }, { name: \"language\", label: \"Language\", cell: \"string\", editable: false }, { name: \"groupGrade\", label: \"Year of Study\", cell: \"string\", editable: false }, { name: \"created\", label: \"Created\", editable: false, cell: ServerGrid.MomentCell.extend({\n\t\t\t\tmodelInUnixTimestamp: true,\n\t\t\t\tdisplayFormat: \"DD MMM YYYY, HH:mm a\",\n\t\t\t\tdisplayInUTC: false\n\t\t\t}) }, { name: \"value\", label: \"Token\", cell: \"string\", editable: false }, { name: \"isTokenExpired\", label: \"Active?\", editable: false, cell: ServerGrid.BooleanIconCell.extend({}), sortable: false }, { name: \"expiration\", label: \"Expiration Date\", cell: \"string\", editable: false, sortable: false }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new Collection(),\n\t\t\tclickable: true,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counter,\n\t\t\t\ttemplate: \"Custom groups $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tthis.bindEvents(this.grid.collection, this.collectionEvents);\n\n\t\tthis.listenTo(this.grid, \"row:clicked\", this.addEditToken.bind(this));\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar languageFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"languageFilter\",\n\t\t\tlabel: \"Language\",\n\t\t\tcategories: [{ items: settings.languageList }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar subjectFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"subjectFilter\",\n\t\t\tlabel: \"Subject\",\n\t\t\tserver: {\n\t\t\t\tkey: \"subject_id\",\n\t\t\t\tvalue: \"subject\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/subjects\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\n\t\tvar gradeFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"gradeFilter\",\n\t\t\tlabel: \"Year of Study\",\n\t\t\tserver: true,\n\t\t\tcategories: _.map(settings.gradeList, function (val, key) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: key,\n\t\t\t\t\titems: _.reduce(val.sort(function (a, b) {\n\t\t\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t\t\t}), function (sum, num) {\n\t\t\t\t\t\tsum.push({ name: num.value, label: num.name });return sum;\n\t\t\t\t\t}, [])\n\t\t\t\t};\n\t\t\t})\n\t\t};\n\n\t\tvar yearFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"yearFilter\",\n\t\t\tlabel: \"Year\",\n\t\t\tcategories: [{ items: _.range(2014, moment().year() + 2) }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar filterList = [textFilter, languageFilter, subjectFilter, gradeFilter, yearFilter];\n\n\t\tthis.ui.filters.prepend(this.grid.filter({ filterContainer: this.ui.filters, filters: filterList, defaultFilters: [\"textFilter\"] }).render().el);\n\t},\n\n\taddEditToken: function addEditToken(model) {\n\t\tvar _this = this;\n\n\t\tif (model.get(\"value\")) {\n\t\t\tvar modal = new TokenCancellationModal({\n\t\t\t\tmodel: new TokenModel({\n\t\t\t\t\tgroupCode: model.get(\"code\"),\n\t\t\t\t\tgroupName: model.get(\"name\")\n\t\t\t\t}),\n\t\t\t\tuserOptions: {\n\t\t\t\t\tprompt: \"Cancel a token\"\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.listenTo(modal, \"close:success\", function () {\n\t\t\t\tmodel.unset(\"value\");\n\n\t\t\t\t_this.eventBus.trigger(\"token:changed\");\n\n\t\t\t\t_this.stopListening(modal);\n\t\t\t});\n\n\t\t\tthis.listenTo(modal, \"close:error\", function () {\n\t\t\t\t_this.stopListening(modal);\n\t\t\t});\n\n\t\t\tthis.listenTo(modal, \"no\", function () {\n\t\t\t\t_this.stopListening(modal);\n\t\t\t});\n\n\t\t\tmodal.show();\n\t\t} else {\n\t\t\tvar _modal = new TokenCreationModal({\n\t\t\t\tmodel: new TokenModel({\n\t\t\t\t\tgroupCode: model.get(\"code\"),\n\t\t\t\t\tgroupName: model.get(\"name\"),\n\t\t\t\t\tlifetime: 30\n\t\t\t\t}),\n\t\t\t\tuserOptions: {\n\t\t\t\t\tprompt: \"Create a token\"\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.listenTo(_modal, \"close:success\", function (tmodel) {\n\t\t\t\tmodel.set(tmodel.toJSON());\n\n\t\t\t\t_this.eventBus.trigger(\"token:changed\");\n\t\t\t\t_this.grid.collection.fetch({ reset: true });\n\n\t\t\t\t_this.stopListening(_modal);\n\t\t\t});\n\n\t\t\tthis.listenTo(_modal, \"close:error\", function () {\n\t\t\t\t_this.stopListening(_modal);\n\t\t\t});\n\n\t\t\tthis.listenTo(_modal, \"cancel\", function () {\n\t\t\t\t_this.stopListening(_modal);\n\t\t\t});\n\n\t\t\t_modal.show();\n\t\t}\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(this.eventBus);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRva2VuTWFuYWdlci5qcyJdLCJuYW1lcyI6WyJfIiwicmVxdWlyZSIsIkJhY2tib25lIiwibW9tZW50Iiwic2V0dGluZ3MiLCJDdXN0b21Hcm91cE1vZGVsIiwiVG9rZW5DYW5jZWxsYXRpb25Nb2RhbCIsIlRva2VuQ3JlYXRpb25Nb2RhbCIsIlRva2VuTW9kZWwiLCJTZXJ2ZXJHcmlkIiwiQ29sbGVjdGlvbiIsIlBhZ2VhYmxlQ29sbGVjdGlvbiIsImV4dGVuZCIsIm1vZGVsIiwidXJsIiwidXJsUm9vdCIsInN0YXRlIiwicGFnZVNpemUiLCJtb2RlIiwicXVlcnlQYXJhbXMiLCJzb3J0S2V5IiwicGFyc2VTdGF0ZSIsInJlc3AiLCJ0b3RhbFJlY29yZHMiLCJ0b3RhbCIsInBhcnNlUmVjb3JkcyIsInJvd3MiLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJ0YWdOYW1lIiwiY2xhc3NOYW1lIiwidGVtcGxhdGUiLCJ1aSIsImNvdW50ZXIiLCJmaWx0ZXJzIiwicGFnaW5nIiwiZ3JpZCIsImluaXRpYWxpemUiLCJldmVudEJ1cyIsIkFwcGxpY2F0aW9uIiwib25SZW5kZXIiLCJjb2x1bW5zIiwibmFtZSIsImxhYmVsIiwiY2VsbCIsImVkaXRhYmxlIiwiTW9tZW50Q2VsbCIsIm1vZGVsSW5Vbml4VGltZXN0YW1wIiwiZGlzcGxheUZvcm1hdCIsImRpc3BsYXlJblVUQyIsIkJvb2xlYW5JY29uQ2VsbCIsInNvcnRhYmxlIiwiZWwiLCJjb2xsZWN0aW9uIiwiY2xpY2thYmxlIiwiZWxlbWVudCIsImJpbmRFdmVudHMiLCJjb2xsZWN0aW9uRXZlbnRzIiwibGlzdGVuVG8iLCJhZGRFZGl0VG9rZW4iLCJiaW5kIiwidGV4dEZpbHRlciIsInR5cGUiLCJkZWJvdW5jZSIsInNlcnZlciIsImxhbmd1YWdlRmlsdGVyIiwiY2F0ZWdvcmllcyIsIml0ZW1zIiwibGFuZ3VhZ2VMaXN0Iiwic3ViamVjdEZpbHRlciIsImtleSIsInZhbHVlIiwiZmV0Y2giLCJpbmZpbml0ZSIsImdyYWRlRmlsdGVyIiwibWFwIiwiZ3JhZGVMaXN0IiwidmFsIiwicmVkdWNlIiwic29ydCIsImEiLCJiIiwibGV4aWNhbCIsInRvVXBwZXJDYXNlIiwibG9jYWxlQ29tcGFyZSIsInN1bSIsIm51bSIsInB1c2giLCJ5ZWFyRmlsdGVyIiwicmFuZ2UiLCJ5ZWFyIiwiZmlsdGVyTGlzdCIsInByZXBlbmQiLCJmaWx0ZXIiLCJmaWx0ZXJDb250YWluZXIiLCJkZWZhdWx0RmlsdGVycyIsInJlbmRlciIsImdldCIsIm1vZGFsIiwiZ3JvdXBDb2RlIiwiZ3JvdXBOYW1lIiwidXNlck9wdGlvbnMiLCJwcm9tcHQiLCJ1bnNldCIsInRyaWdnZXIiLCJzdG9wTGlzdGVuaW5nIiwic2hvdyIsImxpZmV0aW1lIiwic2V0IiwidG1vZGVsIiwidG9KU09OIiwicmVzZXQiLCJvbkJlZm9yZURlc3Ryb3kiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsV0FBV0QsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUUsU0FBU0YsUUFBUSxRQUFSLENBQWY7O0FBRUEsSUFBTUcsV0FBV0gsUUFBUSxjQUFSLENBQWpCOztBQUVBLElBQU1JLG1CQUFtQkosUUFBUSxvQkFBUixDQUF6QjtBQUNBLElBQU1LLHlCQUF5QkwsUUFBUSwwQkFBUixDQUEvQjtBQUNBLElBQU1NLHFCQUFxQk4sUUFBUSxzQkFBUixDQUEzQjtBQUNBLElBQU1PLGFBQWFQLFFBQVEsY0FBUixDQUFuQjtBQUNBLElBQU1RLGFBQWFSLFFBQVEsc0JBQVIsQ0FBbkI7O0FBR0EsSUFBTVMsYUFBYVIsU0FBU1Msa0JBQVQsQ0FBNEJDLE1BQTVCLENBQW1DO0FBQ3JEQyxRQUFPUixnQkFEOEM7O0FBR3JEUyxNQUFLLGVBQVc7QUFDZixTQUFPVixTQUFTVyxPQUFULEdBQW1CLG1DQUExQjtBQUNBLEVBTG9EOztBQU9yREMsUUFBTztBQUNOQyxZQUFVO0FBREosRUFQOEM7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aUcsR0FBTixDQUFVQyxPQUFPQyxNQUFQLEVBQVY7O0FBRUEsVUFBS3hFLFFBQUwsQ0FBY2tFLE9BQWQsQ0FBc0IsZUFBdEI7QUFDQSxVQUFLcEUsSUFBTCxDQUFVaUIsVUFBVixDQUFxQm1CLEtBQXJCLENBQTJCLEVBQUV1QyxPQUFPLElBQVQsRUFBM0I7O0FBRUEsVUFBS04sYUFBTCxDQUFtQlAsTUFBbkI7QUFDQSxJQVBEOztBQVNBLFFBQUt4QyxRQUFMLENBQWN3QyxNQUFkLEVBQXFCLGFBQXJCLEVBQW9DLFlBQU07QUFDekMsVUFBS08sYUFBTCxDQUFtQlAsTUFBbkI7QUFDQSxJQUZEOztBQUlBLFFBQUt4QyxRQUFMLENBQWN3QyxNQUFkLEVBQXFCLFFBQXJCLEVBQStCLFlBQU07QUFDcEMsVUFBS08sYUFBTCxDQUFtQlAsTUFBbkI7QUFDQSxJQUZEOztBQUlBQSxVQUFNUSxJQUFOO0FBQ0E7QUFDRCxFQTdLK0M7O0FBK0toRE0sa0JBQWlCLDJCQUFXO0FBQzNCLE9BQUtQLGFBQUwsQ0FBbUIsS0FBS25FLFFBQXhCO0FBQ0E7QUFqTCtDLENBQWhDLENBQWpCIiwiZmlsZSI6InRva2VuTWFuYWdlci5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IG1vbWVudCA9IHJlcXVpcmUoXCJtb21lbnRcIik7XG5cbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxuY29uc3QgQ3VzdG9tR3JvdXBNb2RlbCA9IHJlcXVpcmUoXCIuL2N1c3RvbUdyb3VwTW9kZWxcIik7XG5jb25zdCBUb2tlbkNhbmNlbGxhdGlvbk1vZGFsID0gcmVxdWlyZShcIi4vdG9rZW5DYW5jZWxsYXRpb25Nb2RhbFwiKTtcbmNvbnN0IFRva2VuQ3JlYXRpb25Nb2RhbCA9IHJlcXVpcmUoXCIuL3Rva2VuQ3JlYXRpb25Nb2RhbFwiKTtcbmNvbnN0IFRva2VuTW9kZWwgPSByZXF1aXJlKFwiLi90b2tlbk1vZGVsXCIpO1xuY29uc3QgU2VydmVyR3JpZCA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc2VydmVyR3JpZFwiKTtcblxuXG5jb25zdCBDb2xsZWN0aW9uID0gQmFja2JvbmUuUGFnZWFibGVDb2xsZWN0aW9uLmV4dGVuZCh7XG5cdG1vZGVsOiBDdXN0b21Hcm91cE1vZGVsLFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2dyb3Vwcy9jdXN0b20/cGFnZWQ9dHJ1ZVwiO1xuXHR9LFxuXG5cdHN0YXRlOiB7XG5cdFx0cGFnZVNpemU6IDMwLFxuXHR9LFxuXHRtb2RlOiBcInNlcnZlclwiLFxuXG5cdHF1ZXJ5UGFyYW1zOiB7XG5cdFx0cGFnZVNpemU6IFwicGFnZVNpemVcIixcblx0XHRzb3J0S2V5OiBcInNvcnRCeVwiLFxuXHR9LFxuXG5cdHBhcnNlU3RhdGU6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRyZXR1cm4geyB0b3RhbFJlY29yZHM6IHJlc3AudG90YWwgfTtcblx0fSxcblxuXHRwYXJzZVJlY29yZHM6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRyZXR1cm4gcmVzcC5yb3dzO1xuXHR9LFxufSk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogXCJkaXZcIixcblx0Y2xhc3NOYW1lOiBcImNvbnRlbnQgZ3JvdXAtdG9rZW4tbWFuYWdlclwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL3Rva2VuTWFuYWdlci5udW5qXCIpLFxuXG5cdHVpOiB7XG5cdFx0Y291bnRlcjogXCIub3BzLWJhciAuY291bnRlclwiLFxuXHRcdGZpbHRlcnM6IFwiLm9wcy1iYXIgLmZpbHRlcnNcIixcblx0XHRwYWdpbmc6IFwiLnBhZ2luZ1wiLFxuXHRcdGdyaWQ6IFwiZGl2LmdyaWRcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmV2ZW50QnVzID0gbmV3IEJhY2tib25lLk1hcmlvbmV0dGUuQXBwbGljYXRpb24oKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgY29sdW1ucyA9IFtcblx0XHRcdHsgbmFtZTogXCJwYXJlbnRHcm91cFwiLCBsYWJlbDogXCJQYXJlbnQgR3JvdXBcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwibmFtZVwiLCBsYWJlbDogXCJDdXN0b20gR3JvdXBcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwic3ViamVjdF9uYW1lXCIsIGxhYmVsOiBcIlN1YmplY3RcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwibGFuZ3VhZ2VcIiwgbGFiZWw6IFwiTGFuZ3VhZ2VcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiZ3JvdXBHcmFkZVwiLCBsYWJlbDogXCJZZWFyIG9mIFN0dWR5XCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImNyZWF0ZWRcIiwgbGFiZWw6IFwiQ3JlYXRlZFwiLCBlZGl0YWJsZTogZmFsc2UsIGNlbGw6IFNlcnZlckdyaWQuTW9tZW50Q2VsbC5leHRlbmQoe1xuXHRcdFx0XHRtb2RlbEluVW5peFRpbWVzdGFtcDogdHJ1ZSxcblx0XHRcdFx0ZGlzcGxheUZvcm1hdDogXCJERCBNTU0gWVlZWSwgSEg6bW0gYVwiLFxuXHRcdFx0XHRkaXNwbGF5SW5VVEM6IGZhbHNlLFxuXHRcdFx0fSkgfSxcblx0XHRcdHsgbmFtZTogXCJ2YWx1ZVwiLCBsYWJlbDogXCJUb2tlblwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJpc1Rva2VuRXhwaXJlZFwiLCBsYWJlbDogXCJBY3RpdmU/XCIsIGVkaXRhYmxlOiBmYWxzZSwgY2VsbDogU2VydmVyR3JpZC5Cb29sZWFuSWNvbkNlbGwuZXh0ZW5kKHt9KSwgc29ydGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiZXhwaXJhdGlvblwiLCBsYWJlbDogXCJFeHBpcmF0aW9uIERhdGVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlLCBzb3J0YWJsZTogZmFsc2UgfSxcblx0XHRdO1xuXG5cdFx0dGhpcy5ncmlkID0gbmV3IFNlcnZlckdyaWQoe1xuXHRcdFx0ZWw6IHRoaXMudWkuZ3JpZCxcblx0XHRcdGNvbHVtbnM6IGNvbHVtbnMsXG5cdFx0XHRjb2xsZWN0aW9uOiBuZXcgQ29sbGVjdGlvbigpLFxuXHRcdFx0Y2xpY2thYmxlOiB0cnVlLFxuXHRcdFx0Y291bnRlcjoge1xuXHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLmNvdW50ZXIsXG5cdFx0XHRcdHRlbXBsYXRlOiBcIkN1c3RvbSBncm91cHMgJHN0YXJ0IC0gJGVuZCBvZiAkdG90YWxcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5wYWdpbmcsXG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5iaW5kRXZlbnRzKHRoaXMuZ3JpZC5jb2xsZWN0aW9uLCB0aGlzLmNvbGxlY3Rpb25FdmVudHMpO1xuXG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmdyaWQsIFwicm93OmNsaWNrZWRcIiwgdGhpcy5hZGRFZGl0VG9rZW4uYmluZCh0aGlzKSk7XG5cblx0XHRjb25zdCB0ZXh0RmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJ0ZXh0XCIsXG5cdFx0XHRuYW1lOiBcInRleHRGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlRleHQgU2VhcmNoXCIsXG5cdFx0XHRkZWJvdW5jZTogMjAwLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdH07XG5cblx0XHRjb25zdCBsYW5ndWFnZUZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiaXRlbWl6ZWRcIixcblx0XHRcdG5hbWU6IFwibGFuZ3VhZ2VGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIkxhbmd1YWdlXCIsXG5cdFx0XHRjYXRlZ29yaWVzOiBbXG5cdFx0XHRcdHsgaXRlbXM6IHNldHRpbmdzLmxhbmd1YWdlTGlzdCB9LFxuXHRcdFx0XSxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3Qgc3ViamVjdEZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiaXRlbWl6ZWRcIixcblx0XHRcdG5hbWU6IFwic3ViamVjdEZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiU3ViamVjdFwiLFxuXHRcdFx0c2VydmVyOiB7XG5cdFx0XHRcdGtleTogXCJzdWJqZWN0X2lkXCIsXG5cdFx0XHRcdHZhbHVlOiBcInN1YmplY3RcIixcblx0XHRcdFx0ZmV0Y2g6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2RhdGEvc3ViamVjdHNcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0cGFnZVNpemU6IDMwLFxuXHRcdFx0XHRpbmZpbml0ZTogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0fTtcblxuXHRcdGNvbnN0IGdyYWRlRmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJncmFkZUZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiWWVhciBvZiBTdHVkeVwiLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdFx0Y2F0ZWdvcmllczogXy5tYXAoc2V0dGluZ3MuZ3JhZGVMaXN0LCAodmFsLCBrZXkpID0+ICh7XG5cdFx0XHRcdGxhYmVsOiBrZXksXG5cdFx0XHRcdGl0ZW1zOiBfLnJlZHVjZSh2YWwuc29ydCgoYSwgYikgPT4gKFwibGV4aWNhbFwiIGluIGEgPyBhLmxleGljYWwgOiBhLm5hbWUpLnRvVXBwZXJDYXNlKCkubG9jYWxlQ29tcGFyZSgoXCJsZXhpY2FsXCIgaW4gYiA/IGIubGV4aWNhbCA6IGIubmFtZSkudG9VcHBlckNhc2UoKSkpLFxuXHRcdFx0XHRcdChzdW0sIG51bSkgPT4geyBzdW0ucHVzaCh7IG5hbWU6IG51bS52YWx1ZSwgbGFiZWw6IG51bS5uYW1lIH0pOyByZXR1cm4gc3VtOyB9LCBbXSksXG5cdFx0XHR9KSksXG5cdFx0fTtcblxuXHRcdGNvbnN0IHllYXJGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcInllYXJGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlllYXJcIixcblx0XHRcdGNhdGVnb3JpZXM6IFtcblx0XHRcdFx0eyBpdGVtczogXy5yYW5nZSgyMDE0LCBtb21lbnQoKS55ZWFyKCkgKyAyKSB9LFxuXHRcdFx0XSxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgZmlsdGVyTGlzdCA9IFt0ZXh0RmlsdGVyLCBsYW5ndWFnZUZpbHRlciwgc3ViamVjdEZpbHRlciwgZ3JhZGVGaWx0ZXIsIHllYXJGaWx0ZXJdO1xuXG5cdFx0dGhpcy51aS5maWx0ZXJzLnByZXBlbmQodGhpcy5ncmlkLmZpbHRlcih7IGZpbHRlckNvbnRhaW5lcjogdGhpcy51aS5maWx0ZXJzLCBmaWx0ZXJzOiBmaWx0ZXJMaXN0LCBkZWZhdWx0RmlsdGVyczogW1widGV4dEZpbHRlclwiXSB9KS5yZW5kZXIoKS5lbCk7XG5cdH0sXG5cblx0YWRkRWRpdFRva2VuOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdGlmIChtb2RlbC5nZXQoXCJ2YWx1ZVwiKSkge1xuXHRcdFx0Y29uc3QgbW9kYWwgPSBuZXcgVG9rZW5DYW5jZWxsYXRpb25Nb2RhbCh7XG5cdFx0XHRcdG1vZGVsOiBuZXcgVG9rZW5Nb2RlbCh7XG5cdFx0XHRcdFx0Z3JvdXBDb2RlOiBtb2RlbC5nZXQoXCJjb2RlXCIpLFxuXHRcdFx0XHRcdGdyb3VwTmFtZTogbW9kZWwuZ2V0KFwibmFtZVwiKSxcblx0XHRcdFx0fSksXG5cdFx0XHRcdHVzZXJPcHRpb25zOiB7XG5cdFx0XHRcdFx0cHJvbXB0OiBcIkNhbmNlbCBhIHRva2VuXCIsXG5cdFx0XHRcdH0sXG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5saXN0ZW5Ubyhtb2RhbCwgXCJjbG9zZTpzdWNjZXNzXCIsICgpID0+IHtcblx0XHRcdFx0bW9kZWwudW5zZXQoXCJ2YWx1ZVwiKTtcblxuXHRcdFx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJ0b2tlbjpjaGFuZ2VkXCIpO1xuXG5cdFx0XHRcdHRoaXMuc3RvcExpc3RlbmluZyhtb2RhbCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5saXN0ZW5Ubyhtb2RhbCwgXCJjbG9zZTplcnJvclwiLCAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuc3RvcExpc3RlbmluZyhtb2RhbCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5saXN0ZW5Ubyhtb2RhbCwgXCJub1wiLCAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuc3RvcExpc3RlbmluZyhtb2RhbCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0bW9kYWwuc2hvdygpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGNvbnN0IG1vZGFsID0gbmV3IFRva2VuQ3JlYXRpb25Nb2RhbCh7XG5cdFx0XHRcdG1vZGVsOiBuZXcgVG9rZW5Nb2RlbCh7XG5cdFx0XHRcdFx0Z3JvdXBDb2RlOiBtb2RlbC5nZXQoXCJjb2RlXCIpLFxuXHRcdFx0XHRcdGdyb3VwTmFtZTogbW9kZWwuZ2V0KFwibmFtZVwiKSxcblx0XHRcdFx0XHRsaWZldGltZTogMzAsXG5cdFx0XHRcdH0pLFxuXHRcdFx0XHR1c2VyT3B0aW9uczoge1xuXHRcdFx0XHRcdHByb21wdDogXCJDcmVhdGUgYSB0b2tlblwiLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMubGlzdGVuVG8obW9kYWwsIFwiY2xvc2U6c3VjY2Vzc1wiLCB0bW9kZWwgPT4ge1xuXHRcdFx0XHRtb2RlbC5zZXQodG1vZGVsLnRvSlNPTigpKTtcblxuXHRcdFx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJ0b2tlbjpjaGFuZ2VkXCIpO1xuXHRcdFx0XHR0aGlzLmdyaWQuY29sbGVjdGlvbi5mZXRjaCh7IHJlc2V0OiB0cnVlIH0pO1xuXG5cdFx0XHRcdHRoaXMuc3RvcExpc3RlbmluZyhtb2RhbCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5saXN0ZW5Ubyhtb2RhbCwgXCJjbG9zZTplcnJvclwiLCAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuc3RvcExpc3RlbmluZyhtb2RhbCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5saXN0ZW5Ubyhtb2RhbCwgXCJjYW5jZWxcIiwgKCkgPT4ge1xuXHRcdFx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcobW9kYWwpO1xuXHRcdFx0fSk7XG5cblx0XHRcdG1vZGFsLnNob3coKTtcblx0XHR9XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcodGhpcy5ldmVudEJ1cyk7XG5cdH0sXG59KTtcbiJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\n\nvar settings = require(\"app-settings\");\n\nmodule.exports = Backbone.Model.extend({\n\tdefaults: {\n\t\tlife: \"finite\"\n\t},\n\tidAttribute: \"groupCode\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/groups/custom/token\";\n\t},\n\n\tvalidate: function validate(attributes, options) {\n\t\tvar errors = {};\n\n\t\tif ((!options.validateAttributes || options.validateAttributes.life) && !attributes.life) errors.life = \"You must choose the token's life.\";\n\n\t\tif ((!options.validateAttributes || options.validateAttributes.lifetime) && attributes.life === \"finite\") {\n\t\t\tif (attributes.lifetime) {\n\t\t\t\tif (isNaN(parseInt(attributes.lifetime, 10)) && !moment.duration(attributes.lifetime).isValid()) errors.lifetime = \"The token lifetime must be a number.\";\n\t\t\t} else {\n\t\t\t\terrors.lifetime = \"You must set the token's lifetime.\";\n\t\t\t}\n\t\t}\n\n\t\tif (Object.keys(errors).length > 0) return errors;\n\t},\n\n\tsubject: function subject() {\n\t\treturn this.has(\"subject_name\") ? this.get(\"subject_name\") : \"-\";\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRva2VuTW9kZWwuanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwibW9tZW50Iiwic2V0dGluZ3MiLCJtb2R1bGUiLCJleHBvcnRzIiwiTW9kZWwiLCJleHRlbmQiLCJkZWZhdWx0cyIsImxpZmUiLCJpZEF0dHJpYnV0ZSIsInVybFJvb3QiLCJ2YWxpZGF0ZSIsImF0dHJpYnV0ZXMiLCJvcHRpb25zIiwiZXJyb3JzIiwidmFsaWRhdGVBdHRyaWJ1dGVzIiwibGlmZXRpbWUiLCJpc05hTiIsInBhcnNlSW50IiwiZHVyYXRpb24iLCJpc1ZhbGlkIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsInN1YmplY3QiLCJoYXMiLCJnZXQiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1DLFNBQVNELFFBQVEsUUFBUixDQUFmOztBQUVBLElBQU1FLFdBQVdGLFFBQVEsY0FBUixDQUFqQjs7QUFFQUcsT0FBT0MsT0FBUCxHQUFpQkwsU0FBU00sS0FBVCxDQUFlQyxNQUFmLENBQXNCO0FBQ3RDQyxXQUFVO0FBQ1RDLFFBQU07QUFERyxFQUQ0QjtBQUl0Q0MsY0FBYSxXQUp5Qjs7QUFNdENDLFVBQVMsbUJBQVc7QUFDbkIsU0FBT1IsU0FBU1EsT0FBVCxHQUFtQiw4QkFBMUI7QUFDQSxFQVJxQzs7QUFVdENDLFdBQVUsa0JBQVNDLFVBQVQsRUFBcUJDLE9BQXJCLEVBQThCO0FBQ3ZDLE1BQU1DLFNBQVMsRUFBZjs7QUFFQSxNQUFJLENBQUMsQ0FBQ0QsUUFBUUUsa0JBQVQsSUFBK0JGLFFBQVFFLGtCQUFSLENBQTJCUCxJQUEzRCxLQUFvRSxDQUFDSSxXQUFXSixJQUFwRixFQUNDTSxPQUFPTixJQUFQLEdBQWMsbUNBQWQ7O0FBRUQsTUFBSSxDQUFDLENBQUNLLFFBQVFFLGtCQUFULElBQStCRixRQUFRRSxrQkFBUixDQUEyQkMsUUFBM0QsS0FBd0VKLFdBQVdKLElBQVgsS0FBb0IsUUFBaEcsRUFBMEc7QUFDekcsT0FBSUksV0FBV0ksUUFBZixFQUF5QjtBQUN4QixRQUFJQyxNQUFNQyxTQUFTTixXQUFXSSxRQUFwQixFQUE4QixFQUE5QixDQUFOLEtBQTRDLENBQUNmLE9BQU9rQixRQUFQLENBQWdCUCxXQUFXSSxRQUEzQixFQUFxQ0ksT0FBckMsRUFBakQsRUFDQ04sT0FBT0UsUUFBUCxHQUFrQixzQ0FBbEI7QUFDRCxJQUhELE1BSUs7QUFDSkYsV0FBT0UsUUFBUCxHQUFrQixvQ0FBbEI7QUFDQTtBQUNEOztBQUVELE1BQUlLLE9BQU9DLElBQVAsQ0FBWVIsTUFBWixFQUFvQlMsTUFBcEIsR0FBNkIsQ0FBakMsRUFDQyxPQUFPVCxNQUFQO0FBQ0QsRUE1QnFDOztBQThCdENVLFVBQVMsbUJBQVc7QUFDbkIsU0FBTyxLQUFLQyxHQUFMLENBQVMsY0FBVCxJQUEyQixLQUFLQyxHQUFMLENBQVMsY0FBVCxDQUEzQixHQUFzRCxHQUE3RDtBQUNBO0FBaENxQyxDQUF0QixDQUFqQiIsImZpbGUiOiJ0b2tlbk1vZGVsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IG1vbWVudCA9IHJlcXVpcmUoXCJtb21lbnRcIik7XG5cbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5Nb2RlbC5leHRlbmQoe1xuXHRkZWZhdWx0czoge1xuXHRcdGxpZmU6IFwiZmluaXRlXCIsXG5cdH0sXG5cdGlkQXR0cmlidXRlOiBcImdyb3VwQ29kZVwiLFxuXG5cdHVybFJvb3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9ncm91cHMvY3VzdG9tL3Rva2VuXCI7XG5cdH0sXG5cblx0dmFsaWRhdGU6IGZ1bmN0aW9uKGF0dHJpYnV0ZXMsIG9wdGlvbnMpIHtcblx0XHRjb25zdCBlcnJvcnMgPSB7fTtcblxuXHRcdGlmICgoIW9wdGlvbnMudmFsaWRhdGVBdHRyaWJ1dGVzIHx8IG9wdGlvbnMudmFsaWRhdGVBdHRyaWJ1dGVzLmxpZmUpICYmICFhdHRyaWJ1dGVzLmxpZmUpXG5cdFx0XHRlcnJvcnMubGlmZSA9IFwiWW91IG11c3QgY2hvb3NlIHRoZSB0b2tlbidzIGxpZmUuXCI7XG5cblx0XHRpZiAoKCFvcHRpb25zLnZhbGlkYXRlQXR0cmlidXRlcyB8fCBvcHRpb25zLnZhbGlkYXRlQXR0cmlidXRlcy5saWZldGltZSkgJiYgYXR0cmlidXRlcy5saWZlID09PSBcImZpbml0ZVwiKSB7XG5cdFx0XHRpZiAoYXR0cmlidXRlcy5saWZldGltZSkge1xuXHRcdFx0XHRpZiAoaXNOYU4ocGFyc2VJbnQoYXR0cmlidXRlcy5saWZldGltZSwgMTApKSAmJiAhbW9tZW50LmR1cmF0aW9uKGF0dHJpYnV0ZXMubGlmZXRpbWUpLmlzVmFsaWQoKSlcblx0XHRcdFx0XHRlcnJvcnMubGlmZXRpbWUgPSBcIlRoZSB0b2tlbiBsaWZldGltZSBtdXN0IGJlIGEgbnVtYmVyLlwiO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdGVycm9ycy5saWZldGltZSA9IFwiWW91IG11c3Qgc2V0IHRoZSB0b2tlbidzIGxpZmV0aW1lLlwiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChPYmplY3Qua2V5cyhlcnJvcnMpLmxlbmd0aCA+IDApXG5cdFx0XHRyZXR1cm4gZXJyb3JzO1xuXHR9LFxuXG5cdHN1YmplY3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmhhcyhcInN1YmplY3RfbmFtZVwiKSA/IHRoaXMuZ2V0KFwic3ViamVjdF9uYW1lXCIpIDogXCItXCI7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar MainView = require(\"./views/main\");\n\nvar Module = module.exports = new Backbone.Marionette.Application();\n\n// Add intra-module routing\nModule.routing = function (App) {\n\tModule.Router = {\n\t\troutes: {\n\t\t\t\"\": \"showMain\"\n\t\t},\n\n\t\tshowMain: function showMain() {\n\t\t\tApp.loadView(new MainView());\n\t\t}\n\t};\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIk1haW5WaWV3IiwiTW9kdWxlIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1hcmlvbmV0dGUiLCJBcHBsaWNhdGlvbiIsInJvdXRpbmciLCJSb3V0ZXIiLCJyb3V0ZXMiLCJzaG93TWFpbiIsIkFwcCIsImxvYWRWaWV3Il0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7O0FBRUEsSUFBTUMsV0FBV0QsUUFBUSxjQUFSLENBQWpCOztBQUVBLElBQU1FLFNBQVNDLE9BQU9DLE9BQVAsR0FBaUIsSUFBSUwsU0FBU00sVUFBVCxDQUFvQkMsV0FBeEIsRUFBaEM7O0FBRUE7QUFDQUosT0FBT0ssT0FBUCxHQUFpQixlQUFPO0FBQ3ZCTCxRQUFPTSxNQUFQLEdBQWdCO0FBQ2ZDLFVBQVE7QUFDUCxPQUFJO0FBREcsR0FETzs7QUFLZkMsWUFBVSxvQkFBVztBQUNwQkMsT0FBSUMsUUFBSixDQUFhLElBQUlYLFFBQUosRUFBYjtBQUNBO0FBUGMsRUFBaEI7QUFTQSxDQVZEIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcblxuY29uc3QgTWFpblZpZXcgPSByZXF1aXJlKFwiLi92aWV3cy9tYWluXCIpO1xuXG5jb25zdCBNb2R1bGUgPSBtb2R1bGUuZXhwb3J0cyA9IG5ldyBCYWNrYm9uZS5NYXJpb25ldHRlLkFwcGxpY2F0aW9uKCk7XG5cbi8vIEFkZCBpbnRyYS1tb2R1bGUgcm91dGluZ1xuTW9kdWxlLnJvdXRpbmcgPSBBcHAgPT4ge1xuXHRNb2R1bGUuUm91dGVyID0ge1xuXHRcdHJvdXRlczoge1xuXHRcdFx0XCJcIjogXCJzaG93TWFpblwiLFxuXHRcdH0sXG5cblx0XHRzaG93TWFpbjogZnVuY3Rpb24oKSB7XG5cdFx0XHRBcHAubG9hZFZpZXcobmV3IE1haW5WaWV3KCkpO1xuXHRcdH0sXG5cdH07XG59OyJdfQ==",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"float-left\\\">\\n\\t<h2>\";\noutput += runtime.suppressValue((lineno = 1, colno = 14, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"greeting\"), \"greeting\", context, [])), env.opts.autoescape);\noutput += \", \";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"user\")),\"firstname\")), env.opts.autoescape);\noutput += \"</h2>\\n\\n\\t\";\nif(env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"frontPageLinks\"))) {\noutput += \"\\n\\t<div class=\\\"action\\\">\\n\\t\\t<div class=\\\"header\\\">\\n\\t\\t\\t<span class=\\\"icon fal fa-university\\\"></span>\\n\\t\\t\\t<span class=\\\"landing-page-title\\\"> \";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"serverName\")), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"linker\\\" data-target=\\\"console/books\\\"><span class=\\\"fal fa-book\\\"/> Work with a book</div>\\n\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"enableLearningPaths\")) {\noutput += \"<div class=\\\"linker\\\" data-target=\\\"console/learningPaths\\\"><span class=\\\"fal fa-brain\\\"/> Work with a \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"learningPathsCustomName\"), env.opts.autoescape);\noutput += \"</div>\";\n;\n}\noutput += \"\\n\\t\\t<div class=\\\"linker\\\" data-target=\\\"/analytics\\\" data-new=\\\"true\\\"><span class=\\\"fal fa-chart-line\\\"/> View Analytics</div>\\n\\t\\t<div class=\\\"linker\\\" data-target=\\\"console/calendar\\\"><span class=\\\"fal fa-calendar\\\"/> Add a new calendar event</div>\\n\\t\\t<div class=\\\"linker\\\" data-target=\\\"console/marks\\\"><span class=\\\"fal fa-star\\\"/> Review assessment results</div>\\n\\t\\t<div class=\\\"linker\\\" data-target=\\\"console/attendance/register\\\"><span class=\\\"fal fa-list-ol\\\"/> Roll call</div>\\n\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"enableCustomGroups\")) {\noutput += \"<div class=\\\"linker\\\" data-target=\\\"groups/manageCustom\\\"><span class=\\\"fal fa-th\\\"/> Create custom groups</div>\";\n;\n}\noutput += \"\\n\\t\\t<div class=\\\"linker\\\" data-target=\\\"console/cam\\\" data-new=\\\"true\\\"><img src=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"urlRoot\"), env.opts.autoescape);\noutput += \"/images/icon_realtime.png\\\" style=\\\"width: 28px; height: 28px\\\"/> Go to the Classroom Activity Monitor</div>\\n\\t</div>\\n\\t\";\n;\n}\noutput += \"\\n</div>\\n\\n<div id=\\\"news\\\" class=\\\"float-right\\\">\\n\\t<div style=\\\"margin: 0px 0px -50px 0px;\\\">\\n\\t\\t<img class=\\\"teach360_logo\\\" src=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"urlRoot\"), env.opts.autoescape);\noutput += \"/images/teach360.png\\\" />\\n\\t</div>\\n\\t\\n\\t<h2>\\n\\t\\tWe are now Teach360!\\n\\t</h2>\\n\\t<p>\\n\\t\\tA new chapter begins! We’ve evolved our name to reflect our commitment to complete, holistic education solutions for schools, teachers, and learners – <strong>education from every angle.</strong>\\n\\t</p>\\n\\t<p>\\n\\t\\tSince 1984, we’ve served the education market through respected names such as ITSI, CAMI, Quanta, and Excom. Now, as <strong>Teach360</strong>, we’re bringing these trusted brands together under one unified banner with a stronger, more integrated offering.\\n\\t</p>\\n\\t<p>\\t\\n\\t\\tAs part of our commitment to SA’s educational sector, we continue to offer the <strong>Educator Console platform</strong> to future-focused institutions, empowering them with features like:\\n\\t\\t\\n\\t\\t<ul>\\n\\t\\t\\t<li> <strong>Drag-and-drop support:</strong> Simply drag ebook and Learning Path files from your computer and drop them where you want them.</li>\\n\\t\\t\\t<li> <strong>Preview flashcards/assessments:</strong> Open flashcards and assessments in preview mode from any location.</li>\\n\\t\\t\\t<li> <strong>Convenient content management:</strong> Easily hide outdated content and clean up your ebooks in preparation for the new year (see <a href=\\\"content/manage\\\">Content</a> page).</li>\\n\\t\\t\\t<li> <strong>Sharing to miEbooks:</strong> Generate a link from any ebook that opens in the same place on the miEbooks app.</li>\\n\\t\\t\\t<li> <strong>Hide/Lock support in ebooks:</strong> Resources you hide or lock in a Learning Path stay hidden or locked when viewed in Ebooks.</li>\\n\\t\\t\\t<li> <strong>Clone Learning Paths:</strong> Free up time for your educators by cloning your favourite Learning Paths from previous years.</li>\\n\\t\\t\\t<li> <strong>Helpful tutorial videos:</strong> Need a quick refresher? Visit our <a target=\\\"_blank\\\" href=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"urlRoot\"), env.opts.autoescape);\noutput += \"/help/\\\">Tutorial Videos</a> page to learn more about these features.</li>\\n\\t\\t</ul>\\n\\t</p>\\n\\t<p>\\n\\t\\t<strong>Ready to explore what's new to Teach360?</strong><br>\\n\\t\\t<strong>Visit:<strong> <a target=\\\"_blank\\\" href=\\\"https://teach360.co.za\\\">teach360.co.za</a><br>\\n\\t\\t<strong>Email us:</strong> <a href=\\\"mailto:support@teach360.co.za\\\">support@teach360.co.za</a><br>\\n\\t\\t<strong>Tel.:</strong> 012 941 1546<br>\\n\\t\\t<strong>Whatsapp:</strong> 072 564 2643\\n\\t</p>\\n</div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar $ = require(\"jquery\");\nvar moment = require(\"moment\");\nvar _ = require(\"lodash\");\n\nvar App = require(\"../../index\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar settings = require(\"app-settings\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"content unity-home\",\n\n\ttemplate: require(\"../templates/main.nunj\"),\n\n\tui: {\n\t\taction: \"div.action\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.action\": \"doAction\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tisOnline: function isOnline() {\n\t\t\t\treturn radio.request(App.Events.Requests.IsAuthenticated);\n\t\t\t},\n\t\t\tgreeting: function greeting() {\n\t\t\t\tvar greets = [\"Hi\", \"Greetings\", \"Hello\", \"Howdy\", \"Nice to see you\", \"Hey there\", \"Welcome\"];\n\t\t\t\tif (moment().hour() < 11) greets.push(\"Good morning\", \"Good day\");else if (moment().hour() < 18) greets.push(\"Good afternoon\", \"Good day\");else if (moment().hour() < 23) greets.push(\"Good evening\");\n\n\t\t\t\treturn _.sample(greets);\n\t\t\t}\n\t\t};\n\t},\n\n\tserializeData: function serializeData() {\n\t\treturn {\n\t\t\tuser: radio.request(App.Events.Requests.CurrentUser),\n\t\t\tenableLearningPaths: settings.enableLearningPaths\n\t\t};\n\t},\n\n\tdoAction: function doAction(evt) {\n\t\tvar url = $(evt.target).data(\"target\");\n\t\tif (!url) return;\n\n\t\tif ($(evt.target).data(\"new\")) return window.open(url);\n\n\t\tradio.trigger(App.Events.Commands.Navigate, settings.urlRoot + url);\n\t},\n\n\tonRender: function onRender() {\n\t\t// Display the footer\n\t\t$(\"footer\", document).removeClass(\"hide\");\n\n\t\t// Update the logo\n\t\t$(\"div.logo-host\", document).get(0).classList.forEach(function (x) {\n\t\t\tif (x !== \"logo-host\") $(\"div.logo-host\", document).removeClass(x);\n\t\t});\n\n\t\t$(\"div.logo-host\", document).addClass(\"logo\");\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\t// Hide the footer before we leave this page\n\t\t$(\"footer\", document).addClass(\"hide\");\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1haW4uanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwiJCIsIm1vbWVudCIsIl8iLCJBcHAiLCJyYWRpbyIsIlJhZGlvIiwiY2hhbm5lbCIsInNldHRpbmdzIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiZXh0ZW5kIiwidGFnTmFtZSIsImNsYXNzTmFtZSIsInRlbXBsYXRlIiwidWkiLCJhY3Rpb24iLCJldmVudHMiLCJ0ZW1wbGF0ZUNvbnRleHQiLCJpc09ubGluZSIsInJlcXVlc3QiLCJFdmVudHMiLCJSZXF1ZXN0cyIsIklzQXV0aGVudGljYXRlZCIsImdyZWV0aW5nIiwiZ3JlZXRzIiwiaG91ciIsInB1c2giLCJzYW1wbGUiLCJzZXJpYWxpemVEYXRhIiwidXNlciIsIkN1cnJlbnRVc2VyIiwiZW5hYmxlTGVhcm5pbmdQYXRocyIsImRvQWN0aW9uIiwiZXZ0IiwidXJsIiwidGFyZ2V0IiwiZGF0YSIsIndpbmRvdyIsIm9wZW4iLCJ0cmlnZ2VyIiwiQ29tbWFuZHMiLCJOYXZpZ2F0ZSIsInVybFJvb3QiLCJvblJlbmRlciIsImRvY3VtZW50IiwicmVtb3ZlQ2xhc3MiLCJnZXQiLCJjbGFzc0xpc3QiLCJmb3JFYWNoIiwieCIsImFkZENsYXNzIiwib25CZWZvcmVEZXN0cm95Il0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1FLFNBQVNGLFFBQVEsUUFBUixDQUFmO0FBQ0EsSUFBTUcsSUFBSUgsUUFBUSxRQUFSLENBQVY7O0FBRUEsSUFBTUksTUFBTUosUUFBUSxhQUFSLENBQVo7O0FBRUEsSUFBTUssUUFBUU4sU0FBU08sS0FBVCxDQUFlQyxPQUFmLENBQXVCLFFBQXZCLENBQWQ7O0FBRUEsSUFBTUMsV0FBV1IsUUFBUSxjQUFSLENBQWpCOztBQUVBUyxPQUFPQyxPQUFQLEdBQWlCWCxTQUFTWSxVQUFULENBQW9CQyxJQUFwQixDQUF5QkMsTUFBekIsQ0FBZ0M7QUFDaERDLFVBQVMsS0FEdUM7QUFFaERDLFlBQVcsb0JBRnFDOztBQUloREMsV0FBVWhCLFFBQVEsd0JBQVIsQ0FKc0M7O0FBTWhEaUIsS0FBSTtBQUNIQyxVQUFRO0FBREwsRUFONEM7O0FBVWhEQyxTQUFRO0FBQ1Asc0JBQW9CO0FBRGIsRUFWd0M7O0FBY2hEQyxrQkFBaUIsMkJBQVc7QUFDM0IsU0FBTztBQUNOQyxhQUFVLG9CQUFXO0FBQ3BCLFdBQU9oQixNQUFNaUIsT0FBTixDQUFjbEIsSUFBSW1CLE1BQUosQ0FBV0MsUUFBWCxDQUFvQkMsZUFBbEMsQ0FBUDtBQUNBLElBSEs7QUFJTkMsYUFBVSxvQkFBVztBQUNwQixRQUFNQyxTQUFTLENBQUMsSUFBRCxFQUFPLFdBQVAsRUFBb0IsT0FBcEIsRUFBNkIsT0FBN0IsRUFBc0MsaUJBQXRDLEVBQXlELFdBQXpELEVBQXNFLFNBQXRFLENBQWY7QUFDQSxRQUFJekIsU0FBUzBCLElBQVQsS0FBa0IsRUFBdEIsRUFDQ0QsT0FBT0UsSUFBUCxDQUFZLGNBQVosRUFBNEIsVUFBNUIsRUFERCxLQUVLLElBQUkzQixTQUFTMEIsSUFBVCxLQUFrQixFQUF0QixFQUNKRCxPQUFPRSxJQUFQLENBQVksZ0JBQVosRUFBOEIsVUFBOUIsRUFESSxLQUVBLElBQUkzQixTQUFTMEIsSUFBVCxLQUFrQixFQUF0QixFQUNKRCxPQUFPRSxJQUFQLENBQVksY0FBWjs7QUFFRCxXQUFPMUIsRUFBRTJCLE1BQUYsQ0FBU0gsTUFBVCxDQUFQO0FBQ0E7QUFkSyxHQUFQO0FBZ0JBLEVBL0IrQzs7QUFpQ2hESSxnQkFBZSx5QkFBVztBQUN6QixTQUFPO0FBQ05DLFNBQU0zQixNQUFNaUIsT0FBTixDQUFjbEIsSUFBSW1CLE1BQUosQ0FBV0MsUUFBWCxDQUFvQlMsV0FBbEMsQ0FEQTtBQUVOQyx3QkFBcUIxQixTQUFTMEI7QUFGeEIsR0FBUDtBQUlBLEVBdEMrQzs7QUF3Q2hEQyxXQUFVLGtCQUFTQyxHQUFULEVBQWM7QUFDdkIsTUFBTUMsTUFBTXBDLEVBQUVtQyxJQUFJRSxNQUFOLEVBQWNDLElBQWQsQ0FBbUIsUUFBbkIsQ0FBWjtBQUNBLE1BQUksQ0FBQ0YsR0FBTCxFQUNDOztBQUVELE1BQUlwQyxFQUFFbUMsSUFBSUUsTUFBTixFQUFjQyxJQUFkLENBQW1CLEtBQW5CLENBQUosRUFDQyxPQUFPQyxPQUFPQyxJQUFQLENBQVlKLEdBQVosQ0FBUDs7QUFFRGhDLFFBQU1xQyxPQUFOLENBQWN0QyxJQUFJbUIsTUFBSixDQUFXb0IsUUFBWCxDQUFvQkMsUUFBbEMsRUFBNENwQyxTQUFTcUMsT0FBVCxHQUFtQlIsR0FBL0Q7QUFDQSxFQWpEK0M7O0FBbURoRFMsV0FBVSxvQkFBVztBQUNwQjtBQUNBN0MsSUFBRSxRQUFGLEVBQVk4QyxRQUFaLEVBQXNCQyxXQUF0QixDQUFrQyxNQUFsQzs7QUFFQTtBQUNBL0MsSUFBRSxlQUFGLEVBQW1COEMsUUFBbkIsRUFBNkJFLEdBQTdCLENBQWlDLENBQWpDLEVBQW9DQyxTQUFwQyxDQUE4Q0MsT0FBOUMsQ0FBc0QsYUFBSztBQUMxRCxPQUFJQyxNQUFNLFdBQVYsRUFDQ25ELEVBQUUsZUFBRixFQUFtQjhDLFFBQW5CLEVBQTZCQyxXQUE3QixDQUF5Q0ksQ0FBekM7QUFDRCxHQUhEOztBQUtBbkQsSUFBRSxlQUFGLEVBQW1COEMsUUFBbkIsRUFBNkJNLFFBQTdCLENBQXNDLE1BQXRDO0FBQ0EsRUE5RCtDOztBQWdFaERDLGtCQUFpQiwyQkFBVztBQUMzQjtBQUNBckQsSUFBRSxRQUFGLEVBQVk4QyxRQUFaLEVBQXNCTSxRQUF0QixDQUErQixNQUEvQjtBQUNBO0FBbkUrQyxDQUFoQyxDQUFqQiIsImZpbGUiOiJtYWluLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgbW9tZW50ID0gcmVxdWlyZShcIm1vbWVudFwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuXG5jb25zdCBBcHAgPSByZXF1aXJlKFwiLi4vLi4vaW5kZXhcIik7XG5cbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcblxuY29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwiY29udGVudCB1bml0eS1ob21lXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvbWFpbi5udW5qXCIpLFxuXG5cdHVpOiB7XG5cdFx0YWN0aW9uOiBcImRpdi5hY3Rpb25cIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5hY3Rpb25cIjogXCJkb0FjdGlvblwiLFxuXHR9LFxuXG5cdHRlbXBsYXRlQ29udGV4dDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGlzT25saW5lOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5Jc0F1dGhlbnRpY2F0ZWQpO1xuXHRcdFx0fSxcblx0XHRcdGdyZWV0aW5nOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0Y29uc3QgZ3JlZXRzID0gW1wiSGlcIiwgXCJHcmVldGluZ3NcIiwgXCJIZWxsb1wiLCBcIkhvd2R5XCIsIFwiTmljZSB0byBzZWUgeW91XCIsIFwiSGV5IHRoZXJlXCIsIFwiV2VsY29tZVwiXTtcblx0XHRcdFx0aWYgKG1vbWVudCgpLmhvdXIoKSA8IDExKVxuXHRcdFx0XHRcdGdyZWV0cy5wdXNoKFwiR29vZCBtb3JuaW5nXCIsIFwiR29vZCBkYXlcIik7XG5cdFx0XHRcdGVsc2UgaWYgKG1vbWVudCgpLmhvdXIoKSA8IDE4KVxuXHRcdFx0XHRcdGdyZWV0cy5wdXNoKFwiR29vZCBhZnRlcm5vb25cIiwgXCJHb29kIGRheVwiKTtcblx0XHRcdFx0ZWxzZSBpZiAobW9tZW50KCkuaG91cigpIDwgMjMpXG5cdFx0XHRcdFx0Z3JlZXRzLnB1c2goXCJHb29kIGV2ZW5pbmdcIik7XG5cblx0XHRcdFx0cmV0dXJuIF8uc2FtcGxlKGdyZWV0cyk7XG5cdFx0XHR9LFxuXHRcdH07XG5cdH0sXG5cblx0c2VyaWFsaXplRGF0YTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHVzZXI6IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlciksXG5cdFx0XHRlbmFibGVMZWFybmluZ1BhdGhzOiBzZXR0aW5ncy5lbmFibGVMZWFybmluZ1BhdGhzLFxuXHRcdH07XG5cdH0sXG5cblx0ZG9BY3Rpb246IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGNvbnN0IHVybCA9ICQoZXZ0LnRhcmdldCkuZGF0YShcInRhcmdldFwiKTtcblx0XHRpZiAoIXVybClcblx0XHRcdHJldHVybjtcblxuXHRcdGlmICgkKGV2dC50YXJnZXQpLmRhdGEoXCJuZXdcIikpXG5cdFx0XHRyZXR1cm4gd2luZG93Lm9wZW4odXJsKTtcblxuXHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0ZSwgc2V0dGluZ3MudXJsUm9vdCArIHVybCk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIERpc3BsYXkgdGhlIGZvb3RlclxuXHRcdCQoXCJmb290ZXJcIiwgZG9jdW1lbnQpLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblxuXHRcdC8vIFVwZGF0ZSB0aGUgbG9nb1xuXHRcdCQoXCJkaXYubG9nby1ob3N0XCIsIGRvY3VtZW50KS5nZXQoMCkuY2xhc3NMaXN0LmZvckVhY2goeCA9PiB7XG5cdFx0XHRpZiAoeCAhPT0gXCJsb2dvLWhvc3RcIilcblx0XHRcdFx0JChcImRpdi5sb2dvLWhvc3RcIiwgZG9jdW1lbnQpLnJlbW92ZUNsYXNzKHgpO1xuXHRcdH0pO1xuXG5cdFx0JChcImRpdi5sb2dvLWhvc3RcIiwgZG9jdW1lbnQpLmFkZENsYXNzKFwibG9nb1wiKTtcblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIEhpZGUgdGhlIGZvb3RlciBiZWZvcmUgd2UgbGVhdmUgdGhpcyBwYWdlXG5cdFx0JChcImZvb3RlclwiLCBkb2N1bWVudCkuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxufSk7Il19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nrequire(\"marionette\");\nvar statuses = require(\"statuses\");\n\nvar AcaciaApplication = Backbone.Marionette.Application.extend({\n\tregion: \"main\",\n\n\tViews: {},\n\txhrQueue: []\n});\n\nvar App = new AcaciaApplication();\n\nApp.randomString = function (len) {\n\tvar chars = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz\".split(\"\");\n\n\tvar length = len || 10;\n\n\tvar str = \"\";\n\tfor (var i = 0; i < length; i++) {\n\t\tstr += chars[Math.floor(Math.random() * chars.length)];\n\t}return str;\n};\n\nApp.parseResponse = function (_xhr) {\n\tvar xhr = _xhr || {};\n\tvar answer = xhr.responseJSON;\n\tif (answer) {\n\t\tanswer.status = xhr.status;\n\t\treturn answer;\n\t}\n\n\tvar humanError = void 0;\n\tswitch (xhr.status) {\n\t\tcase 0:\n\t\t\thumanError = \"The connection to the server timed out or was interrupted\";\n\t\t\tbreak;\n\n\t\tcase 500:\n\t\t\thumanError = \"There was an error on the server\";\n\t\t\tbreak;\n\n\t\tcase 404:\n\t\t\thumanError = \"We could not find the information needed to do that\";\n\t\t\tbreak;\n\n\t\tcase 410:\n\t\t\thumanError = \"We could not find the item to work with\";\n\t\t\tbreak;\n\n\t\tcase 502:\n\t\t\thumanError = \"The server is temporarily inaccessible\";\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\thumanError = \"An unexpected error occurred\";\n\t\t\tbreak;\n\t}\n\tanswer = {\n\t\tinfo: humanError + \", code \" + xhr.status + \" (\" + statuses[xhr.status] + \")\",\n\t\tstatus: xhr.status,\n\t\tresponse: xhr.responseText\n\t};\n\n\treturn answer;\n};\n\nApp.mapResourceToIcon = function (category) {\n\tvar singleIcon = \"\";\n\n\tswitch (category) {\n\t\tcase \"assessment\":\n\t\t\tsingleIcon = \"fa-list-ul\";\n\t\t\tbreak;\n\n\t\tcase \"audio\":\n\t\t\tsingleIcon = \"fa-file-audio\";\n\t\t\tbreak;\n\n\t\tcase \"excel\":\n\t\t\tsingleIcon = \"fa-file-excel\";\n\t\t\tbreak;\n\n\t\tcase \"flashcarddeck\":\n\t\t\tsingleIcon = \"fa-clone\";\n\t\t\tbreak;\n\n\t\tcase \"googledrive\":\n\t\t\tsingleIcon = \"fa-google-drive\";\n\t\t\tbreak;\n\n\t\tcase \"image\":\n\t\t\tsingleIcon = \"fa-image\";\n\t\t\tbreak;\n\n\t\tcase \"onenote\":\n\t\t\tsingleIcon = \"fa-one-note\";\n\t\t\tbreak;\n\n\t\tcase \"pdf\":\n\t\t\tsingleIcon = \"fa-file-pdf\";\n\t\t\tbreak;\n\n\t\tcase \"powerpoint\":\n\t\t\tsingleIcon = \"fa-file-powerpoint\";\n\t\t\tbreak;\n\n\t\tcase \"text\":\n\t\t\tsingleIcon = \"fa-file-alt\";\n\t\t\tbreak;\n\n\t\tcase \"url\":\n\t\t\tsingleIcon = \"fa-external-link\";\n\t\t\tbreak;\n\n\t\tcase \"video\":\n\t\t\tsingleIcon = \"fa-video-camera\";\n\t\t\tbreak;\n\n\t\tcase \"word\":\n\t\t\tsingleIcon = \"fa-file-word\";\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\treturn \"\";\n\t}\n\n\treturn singleIcon;\n};\n\nApp.loadView = function (view) {\n\tApp.showView(view);\n};\n\nApp.unloadView = function () {\n\tApp.getRegion().empty();\n};\n\n// Initialise the extensions\n//App.addInitializer(require(\"./app/extensions\"));\n\n//Facebook OAuth callback appends #_=_ to return URL\nif (window.location.hash && window.location.hash === \"#_=_\") window.location.hash = \"\";\n\nApp.Events = require(\"./app/events\");\n\n// Create the global event channel\nApp.globalChannel = Backbone.Radio.channel(\"global\");\n\nApp.on(\"before:start\", function () {\n\t// Events\n\tApp.Events = require(\"./app/events\");\n});\n\nApp.on(\"start\", function () {\n\t// Add a view to track the \"loading\" circle, so modules can manipulate it later\n\trequire(\"./app/spinner\")(App);\n\n\t// Track some information about the main region in order to show spinner\n\trequire(\"./app/regions\")(App);\n\n\t// Add a view to track the navigation bar, and set up Foundation\n\trequire(\"./app/navigation\")(App);\n\n\t// Add a toast system for floating notifications\n\trequire(\"./app/toasts\")(App);\n\n\t// Add websocket connection\n\trequire(\"./app/websockets\")(App);\n\n\t// Add notification view and systems\n\t//App.addInitializer(require(\"./app/notifications\"));\n\n\t// Load routes\n\trequire(\"./app/routing\")(App);\n\n\t// Initialise some modules\n\trequire(\"./app/modules\")(App);\n});\n\nmodule.exports = App;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsInN0YXR1c2VzIiwiQWNhY2lhQXBwbGljYXRpb24iLCJNYXJpb25ldHRlIiwiQXBwbGljYXRpb24iLCJleHRlbmQiLCJyZWdpb24iLCJWaWV3cyIsInhoclF1ZXVlIiwiQXBwIiwicmFuZG9tU3RyaW5nIiwibGVuIiwiY2hhcnMiLCJzcGxpdCIsImxlbmd0aCIsInN0ciIsImkiLCJNYXRoIiwiZmxvb3IiLCJyYW5kb20iLCJwYXJzZVJlc3BvbnNlIiwiX3hociIsInhociIsImFuc3dlciIsInJlc3BvbnNlSlNPTiIsInN0YXR1cyIsImh1bWFuRXJyb3IiLCJpbmZvIiwicmVzcG9uc2UiLCJyZXNwb25zZVRleHQiLCJtYXBSZXNvdXJjZVRvSWNvbiIsImNhdGVnb3J5Iiwic2luZ2xlSWNvbiIsImxvYWRWaWV3IiwidmlldyIsInNob3dWaWV3IiwidW5sb2FkVmlldyIsImdldFJlZ2lvbiIsImVtcHR5Iiwid2luZG93IiwibG9jYXRpb24iLCJoYXNoIiwiRXZlbnRzIiwiZ2xvYmFsQ2hhbm5lbCIsIlJhZGlvIiwiY2hhbm5lbCIsIm9uIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCO0FBQ0FBLFFBQVEsWUFBUjtBQUNBLElBQU1DLFdBQVdELFFBQVEsVUFBUixDQUFqQjs7QUFFQSxJQUFNRSxvQkFBb0JILFNBQVNJLFVBQVQsQ0FBb0JDLFdBQXBCLENBQWdDQyxNQUFoQyxDQUF1QztBQUNoRUMsU0FBUSxNQUR3RDs7QUFHaEVDLFFBQU8sRUFIeUQ7QUFJaEVDLFdBQVU7QUFKc0QsQ0FBdkMsQ0FBMUI7O0FBT0EsSUFBTUMsTUFBTSxJQUFJUCxpQkFBSixFQUFaOztBQUVBTyxJQUFJQyxZQUFKLEdBQW1CLFVBQVNDLEdBQVQsRUFBYztBQUNoQyxLQUFNQyxRQUFRLGdFQUFnRUMsS0FBaEUsQ0FBc0UsRUFB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LE1BQUosR0FBYTFDLFFBQVEsY0FBUixDQUFiOztBQUVBO0FBQ0FTLElBQUlrQyxhQUFKLEdBQW9CNUMsU0FBUzZDLEtBQVQsQ0FBZUMsT0FBZixDQUF1QixRQUF2QixDQUFwQjs7QUFFQXBDLElBQUlxQyxFQUFKLENBQU8sY0FBUCxFQUF1QixZQUFNO0FBQzVCO0FBQ0FyQyxLQUFJaUMsTUFBSixHQUFhMUMsUUFBUSxjQUFSLENBQWI7QUFDQSxDQUhEOztBQUtBUyxJQUFJcUMsRUFBSixDQUFPLE9BQVAsRUFBZ0IsWUFBTTtBQUNyQjtBQUNBOUMsU0FBUSxlQUFSLEVBQXlCUyxHQUF6Qjs7QUFFQTtBQUNBVCxTQUFRLGVBQVIsRUFBeUJTLEdBQXpCOztBQUVBO0FBQ0FULFNBQVEsa0JBQVIsRUFBNEJTLEdBQTVCOztBQUVBO0FBQ0FULFNBQVEsY0FBUixFQUF3QlMsR0FBeEI7O0FBRUE7QUFDQVQsU0FBUSxrQkFBUixFQUE0QlMsR0FBNUI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBVCxTQUFRLGVBQVIsRUFBeUJTLEdBQXpCOztBQUVBO0FBQ0FULFNBQVEsZUFBUixFQUF5QlMsR0FBekI7QUFDQSxDQXhCRDs7QUEwQkFzQyxPQUFPQyxPQUFQLEdBQWlCdkMsR0FBakIiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xucmVxdWlyZShcIm1hcmlvbmV0dGVcIik7XG5jb25zdCBzdGF0dXNlcyA9IHJlcXVpcmUoXCJzdGF0dXNlc1wiKTtcblxuY29uc3QgQWNhY2lhQXBwbGljYXRpb24gPSBCYWNrYm9uZS5NYXJpb25ldHRlLkFwcGxpY2F0aW9uLmV4dGVuZCh7XG5cdHJlZ2lvbjogXCJtYWluXCIsXG5cblx0Vmlld3M6IHt9LFxuXHR4aHJRdWV1ZTogW10sXG59KTtcblxuY29uc3QgQXBwID0gbmV3IEFjYWNpYUFwcGxpY2F0aW9uKCk7XG5cbkFwcC5yYW5kb21TdHJpbmcgPSBmdW5jdGlvbihsZW4pIHtcblx0Y29uc3QgY2hhcnMgPSBcIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hUWmFiY2RlZmdoaWtsbW5vcHFyc3R1dnd4eXpcIi5zcGxpdChcIlwiKTtcblxuXHRjb25zdCBsZW5ndGggPSBsZW4gfHwgMTA7XG5cblx0bGV0IHN0ciA9IFwiXCI7XG5cdGZvcihsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKylcblx0XHRzdHIgKz0gY2hhcnNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcnMubGVuZ3RoKV07XG5cblx0cmV0dXJuIHN0cjtcbn07XG5cbkFwcC5wYXJzZVJlc3BvbnNlID0gZnVuY3Rpb24oX3hocikge1xuXHRjb25zdCB4aHIgPSBfeGhyIHx8IHt9O1xuXHRsZXQgYW5zd2VyID0geGhyLnJlc3BvbnNlSlNPTjtcblx0aWYgKGFuc3dlcikge1xuXHRcdGFuc3dlci5zdGF0dXMgPSB4aHIuc3RhdHVzO1xuXHRcdHJldHVybiBhbnN3ZXI7XG5cdH1cblxuXHRsZXQgaHVtYW5FcnJvcjtcblx0c3dpdGNoICh4aHIuc3RhdHVzKSB7XG5cdFx0Y2FzZSAwOlxuXHRcdFx0aHVtYW5FcnJvciA9IFwiVGhlIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciB0aW1lZCBvdXQgb3Igd2FzIGludGVycnVwdGVkXCI7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgNTAwOlxuXHRcdFx0aHVtYW5FcnJvciA9IFwiVGhlcmUgd2FzIGFuIGVycm9yIG9uIHRoZSBzZXJ2ZXJcIjtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSA0MDQ6XG5cdFx0XHRodW1hbkVycm9yID0gXCJXZSBjb3VsZCBub3QgZmluZCB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGRvIHRoYXRcIjtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSA0MTA6XG5cdFx0XHRodW1hbkVycm9yID0gXCJXZSBjb3VsZCBub3QgZmluZCB0aGUgaXRlbSB0byB3b3JrIHdpdGhcIjtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSA1MDI6XG5cdFx0XHRodW1hbkVycm9yID0gXCJUaGUgc2VydmVyIGlzIHRlbXBvcmFyaWx5IGluYWNjZXNzaWJsZVwiO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRkZWZhdWx0OlxuXHRcdFx0aHVtYW5FcnJvciA9IFwiQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZFwiO1xuXHRcdFx0YnJlYWs7XG5cdH1cblx0YW5zd2VyID0ge1xuXHRcdGluZm86IGh1bWFuRXJyb3IgKyBcIiwgY29kZSBcIiArIHhoci5zdGF0dXMgKyBcIiAoXCIgKyBzdGF0dXNlc1t4aHIuc3RhdHVzXSArIFwiKVwiLFxuXHRcdHN0YXR1czogeGhyLnN0YXR1cyxcblx0XHRyZXNwb25zZTogeGhyLnJlc3BvbnNlVGV4dCxcblx0fTtcblxuXHRyZXR1cm4gYW5zd2VyO1xufTtcblxuQXBwLm1hcFJlc291cmNlVG9JY29uID0gZnVuY3Rpb24oY2F0ZWdvcnkpIHtcblx0bGV0IHNpbmdsZUljb24gPSBcIlwiO1xuXG5cdHN3aXRjaCAoY2F0ZWdvcnkpIHtcblx0XHRjYXNlIFwiYXNzZXNzbWVudFwiOlxuXHRcdFx0c2luZ2xlSWNvbiA9IFwiZmEtbGlzdC11bFwiO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFwiYXVkaW9cIjpcblx0XHRcdHNpbmdsZUljb24gPSBcImZhLWZpbGUtYXVkaW9cIjtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBcImV4Y2VsXCI6XG5cdFx0XHRzaW5nbGVJY29uID0gXCJmYS1maWxlLWV4Y2VsXCI7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgXCJmbGFzaGNhcmRkZWNrXCI6XG5cdFx0XHRzaW5nbGVJY29uID0gXCJmYS1jbG9uZVwiO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFwiZ29vZ2xlZHJpdmVcIjpcblx0XHRcdHNpbmdsZUljb24gPSBcImZhLWdvb2dsZS1kcml2ZVwiO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFwiaW1hZ2VcIjpcblx0XHRcdHNpbmdsZUljb24gPSBcImZhLWltYWdlXCI7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgXCJvbmVub3RlXCI6XG5cdFx0XHRzaW5nbGVJY29uID0gXCJmYS1vbmUtbm90ZVwiO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFwicGRmXCI6XG5cdFx0XHRzaW5nbGVJY29uID0gXCJmYS1maWxlLXBkZlwiO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFwicG93ZXJwb2ludFwiOlxuXHRcdFx0c2luZ2xlSWNvbiA9IFwiZmEtZmlsZS1wb3dlcnBvaW50XCI7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgXCJ0ZXh0XCI6XG5cdFx0XHRzaW5nbGVJY29uID0gXCJmYS1maWxlLWFsdFwiO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIFwidXJsXCI6XG5cdFx0XHRzaW5nbGVJY29uID0gXCJmYS1leHRlcm5hbC1saW5rXCI7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgXCJ2aWRlb1wiOlxuXHRcdFx0c2luZ2xlSWNvbiA9IFwiZmEtdmlkZW8tY2FtZXJhXCI7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgXCJ3b3JkXCI6XG5cdFx0XHRzaW5nbGVJY29uID0gXCJmYS1maWxlLXdvcmRcIjtcblx0XHRcdGJyZWFrO1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJldHVybiBcIlwiO1xuXHR9XG5cblx0cmV0dXJuIHNpbmdsZUljb247XG59O1xuXG5BcHAubG9hZFZpZXcgPSBmdW5jdGlvbih2aWV3KSB7XG5cdEFwcC5zaG93Vmlldyh2aWV3KTtcbn07XG5cbkFwcC51bmxvYWRWaWV3ID0gZnVuY3Rpb24oKSB7XG5cdEFwcC5nZXRSZWdpb24oKS5lbXB0eSgpO1xufTtcblxuLy8gSW5pdGlhbGlzZSB0aGUgZXh0ZW5zaW9uc1xuLy9BcHAuYWRkSW5pdGlhbGl6ZXIocmVxdWlyZShcIi4vYXBwL2V4dGVuc2lvbnNcIikpO1xuXG4vL0ZhY2Vib29rIE9BdXRoIGNhbGxiYWNrIGFwcGVuZHMgI189XyB0byByZXR1cm4gVVJMXG5pZiAod2luZG93LmxvY2F0aW9uLmhhc2ggJiYgd2luZG93LmxvY2F0aW9uLmhhc2ggPT09IFwiI189X1wiKVxuXHR3aW5kb3cubG9jYXRpb24uaGFzaCA9IFwiXCI7XG5cbkFwcC5FdmVudHMgPSByZXF1aXJlKFwiLi9hcHAvZXZlbnRzXCIpO1xuXG4vLyBDcmVhdGUgdGhlIGdsb2JhbCBldmVudCBjaGFubmVsXG5BcHAuZ2xvYmFsQ2hhbm5lbCA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJnbG9iYWxcIik7XG5cbkFwcC5vbihcImJlZm9yZTpzdGFydFwiLCAoKSA9PiB7XG5cdC8vIEV2ZW50c1xuXHRBcHAuRXZlbnRzID0gcmVxdWlyZShcIi4vYXBwL2V2ZW50c1wiKTtcbn0pO1xuXG5BcHAub24oXCJzdGFydFwiLCAoKSA9PiB7XG5cdC8vIEFkZCBhIHZpZXcgdG8gdHJhY2sgdGhlIFwibG9hZGluZ1wiIGNpcmNsZSwgc28gbW9kdWxlcyBjYW4gbWFuaXB1bGF0ZSBpdCBsYXRlclxuXHRyZXF1aXJlKFwiLi9hcHAvc3Bpbm5lclwiKShBcHApO1xuXG5cdC8vIFRyYWNrIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1haW4gcmVnaW9uIGluIG9yZGVyIHRvIHNob3cgc3Bpbm5lclxuXHRyZXF1aXJlKFwiLi9hcHAvcmVnaW9uc1wiKShBcHApO1xuXG5cdC8vIEFkZCBhIHZpZXcgdG8gdHJhY2sgdGhlIG5hdmlnYXRpb24gYmFyLCBhbmQgc2V0IHVwIEZvdW5kYXRpb25cblx0cmVxdWlyZShcIi4vYXBwL25hdmlnYXRpb25cIikoQXBwKTtcblxuXHQvLyBBZGQgYSB0b2FzdCBzeXN0ZW0gZm9yIGZsb2F0aW5nIG5vdGlmaWNhdGlvbnNcblx0cmVxdWlyZShcIi4vYXBwL3RvYXN0c1wiKShBcHApO1xuXG5cdC8vIEFkZCB3ZWJzb2NrZXQgY29ubmVjdGlvblxuXHRyZXF1aXJlKFwiLi9hcHAvd2Vic29ja2V0c1wiKShBcHApO1xuXG5cdC8vIEFkZCBub3RpZmljYXRpb24gdmlldyBhbmQgc3lzdGVtc1xuXHQvL0FwcC5hZGRJbml0aWFsaXplcihyZXF1aXJlKFwiLi9hcHAvbm90aWZpY2F0aW9uc1wiKSk7XG5cblx0Ly8gTG9hZCByb3V0ZXNcblx0cmVxdWlyZShcIi4vYXBwL3JvdXRpbmdcIikoQXBwKTtcblxuXHQvLyBJbml0aWFsaXNlIHNvbWUgbW9kdWxlc1xuXHRyZXF1aXJlKFwiLi9hcHAvbW9kdWxlc1wiKShBcHApO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQXBwOyJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar $ = require(\"jquery\");\n\nvar BlockItem = Backbone.Marionette.View.extend({\n\ttemplate: require(\"./templates/accordion.nunj\").block,\n\n\ttagName: \"div\",\n\tclassName: \"accord-item\"\n});\n\nvar BlockHost = Backbone.Marionette.CompositeView.extend({\n\ttemplate: require(\"./templates/accordion.nunj\").section,\n\n\ttagName: \"div\",\n\tclassName: \"accord-section\",\n\n\tchildViewContainer: \"div.accord-wrapper\",\n\n\tchildViewOptions: function childViewOptions() {\n\t\treturn {\n\t\t\tclickable: this.options.clickable\n\t\t};\n\t},\n\n\tmodelEvents: {\n\t\t\"accordion:toggle\": \"toggle\"\n\t},\n\n\tcollectionEvents: {\n\t\tadd: \"renderCount\",\n\t\tremove: \"renderCount\"\n\t},\n\n\tevents: {\n\t\t\"click .accord-head\": \"toggle\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this = this;\n\n\t\treturn {\n\t\t\tcollectionSize: function collectionSize() {\n\t\t\t\treturn _this.collection.length;\n\t\t\t}\n\t\t};\n\t},\n\n\tchildView: function childView() {\n\t\treturn this.model.get(\"itemView\") || BlockItem;\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\t\tthis.collection = this.model.get(\"items\");\n\n\t\tthis.bindEvents(this.collection, this.collectionEvents);\n\t},\n\n\ttoggle: function toggle() {\n\t\tvar wrapper = $(\".accord-wrapper\", this.el);\n\t\tif (this.collection.length) wrapper.slideToggle();\n\t\twrapper.prev(\".accord-head\").toggleClass(\"active\");\n\t\t$(\".accord-wrapper\").not(wrapper).each(function () {\n\t\t\t// eslint-disable-next-line no-invalid-this\n\t\t\t$(this).slideUp().prev(\".accord-head\").removeClass(\"active\");\n\t\t});\n\t},\n\n\trenderCount: function renderCount() {\n\t\t$(\"span.count\", this.el).text(this.collection.length);\n\n\t\tvar wrapper = $(\".accord-wrapper\", this.el);\n\t\tif (this.collection.length) wrapper.slideDown();else wrapper.slideUp();\n\t}\n});\n\nvar View = Backbone.Marionette.CollectionView.extend({\n\ttemplate: false,\n\ttagName: \"div\",\n\tclassName: \"accordion-host\",\n\n\tchildView: BlockHost,\n\n\tchildViewOptions: function childViewOptions() {\n\t\treturn {\n\t\t\tclickable: true\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options.options;\n\t},\n\n\tonRender: function onRender() {\n\t\t// Find out how tall a head block is\n\t\tvar headSize = $(\".accord-head\", this.el).first().height() * this.collection.length;\n\n\t\tvar parent = this.options.parent || this.$el.parent();\n\n\t\t// Subtract that from the parent block size\n\t\tvar leftover = parent.height() - headSize - (this.options.parentAdjust || 0);\n\n\t\t// That's the max size of all container blocks\n\t\t$(\".accord-wrapper\", this.el).css({ \"max-height\": leftover + \"px\" });\n\n\t\t// Expand the first block\n\t\tif (this.collection.head().get(\"items\").length > 0) this.collection.head().trigger(\"accordion:toggle\");\n\t}\n});\n\nvar Accordion = function Accordion(opts) {\n\tvar view = new View({ collection: opts.collection, options: opts });\n\n\treturn view;\n};\n\nAccordion.Section = Backbone.Model.extend({\n\tdefaults: {\n\t\ttitle: \"Set title attribute\",\n\t\ticon: \"fa-cog\"\n\t}\n});\n\nmodule.exports = Accordion;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFjY29yZGlvbi5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCIkIiwiQmxvY2tJdGVtIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJleHRlbmQiLCJ0ZW1wbGF0ZSIsImJsb2NrIiwidGFnTmFtZSIsImNsYXNzTmFtZSIsIkJsb2NrSG9zdCIsIkNvbXBvc2l0ZVZpZXciLCJzZWN0aW9uIiwiY2hpbGRWaWV3Q29udGFpbmVyIiwiY2hpbGRWaWV3T3B0aW9ucyIsImNsaWNrYWJsZSIsIm9wdGlvbnMiLCJtb2RlbEV2ZW50cyIsImNvbGxlY3Rpb25FdmVudHMiLCJhZGQiLCJyZW1vdmUiLCJldmVudHMiLCJ0ZW1wbGF0ZUNvbnRleHQiLCJjb2xsZWN0aW9uU2l6ZSIsImNvbGxlY3Rpb24iLCJsZW5ndGgiLCJjaGlsZFZpZXciLCJtb2RlbCIsImdldCIsImluaXRpYWxpemUiLCJiaW5kRXZlbnRzIiwidG9nZ2xlIiwid3JhcHBlciIsImVsIiwic2xpZGVUb2dnbGUiLCJwcmV2IiwidG9nZ2xlQ2xhc3MiLCJub3QiLCJlYWNoIiwic2xpZGVVcCIsInJlbW92ZUNsYXNzIiwicmVuZGVyQ291bnQiLCJ0ZXh0Iiwic2xpZGVEb3duIiwiQ29sbGVjdGlvblZpZXciLCJvblJlbmRlciIsImhlYWRTaXplIiwiZmlyc3QiLCJoZWlnaHQiLCJwYXJlbnQiLCIkZWwiLCJsZWZ0b3ZlciIsInBhcmVudEFkanVzdCIsImNzcyIsImhlYWQiLCJ0cmlnZ2VyIiwiQWNjb3JkaW9uIiwib3B0cyIsInZpZXciLCJTZWN0aW9uIiwiTW9kZWwiLCJkZWZhdWx0cyIsInRpdGxlIiwiaWNvbiIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1DLElBQUlELFFBQVEsUUFBUixDQUFWOztBQUVBLElBQU1FLFlBQVlILFNBQVNJLFVBQVQsQ0FBb0JDLElBQXBCLENBQXlCQyxNQUF6QixD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S0FBS2dDLEVBQXZCLEVBQTJCYyxLQUEzQixHQUFtQ0MsTUFBbkMsS0FBOEMsS0FBS3hCLFVBQUwsQ0FBZ0JDLE1BQS9FOztBQUVBLE1BQU13QixTQUFTLEtBQUtqQyxPQUFMLENBQWFpQyxNQUFiLElBQXVCLEtBQUtDLEdBQUwsQ0FBU0QsTUFBVCxFQUF0Qzs7QUFFQTtBQUNBLE1BQU1FLFdBQVdGLE9BQU9ELE1BQVAsS0FBa0JGLFFBQWxCLElBQThCLEtBQUs5QixPQUFMLENBQWFvQyxZQUFiLElBQTZCLENBQTNELENBQWpCOztBQUVBO0FBQ0FuRCxJQUFFLGlCQUFGLEVBQXFCLEtBQUtnQyxFQUExQixFQUE4Qm9CLEdBQTlCLENBQWtDLEVBQUUsY0FBY0YsV0FBVyxJQUEzQixFQUFsQzs7QUFFQTtBQUNBLE1BQUksS0FBSzNCLFVBQUwsQ0FBZ0I4QixJQUFoQixHQUF1QjFCLEdBQXZCLENBQTJCLE9BQTNCLEVBQW9DSCxNQUFwQyxHQUE2QyxDQUFqRCxFQUNDLEtBQUtELFVBQUwsQ0FBZ0I4QixJQUFoQixHQUF1QkMsT0FBdkIsQ0FBK0Isa0JBQS9CO0FBQ0Q7QUFoQ3FELENBQTFDLENBQWI7O0FBbUNBLElBQU1DLFlBQVksU0FBWkEsU0FBWSxDQUFTQyxJQUFULEVBQWU7QUFDaEMsS0FBTUMsT0FBTyxJQUFJdEQsSUFBSixDQUFTLEVBQUVvQixZQUFZaUMsS0FBS2pDLFVBQW5CLEVBQStCUixTQUFTeUMsSUFBeEMsRUFBVCxDQUFiOztBQUVBLFFBQU9DLElBQVA7QUFDQSxDQUpEOztBQU1BRixVQUFVRyxPQUFWLEdBQW9CNUQsU0FBUzZELEtBQVQsQ0FBZXZELE1BQWYsQ0FBc0I7QUFDekN3RCxXQUFVO0FBQ1RDLFNBQU8scUJBREU7QUFFVEMsUUFBTTtBQUZHO0FBRCtCLENBQXRCLENBQXBCOztBQU9BQyxPQUFPQyxPQUFQLEdBQWlCVCxTQUFqQiIsImZpbGUiOiJhY2NvcmRpb24uanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5cbmNvbnN0IEJsb2NrSXRlbSA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4vdGVtcGxhdGVzL2FjY29yZGlvbi5udW5qXCIpLmJsb2NrLFxuXG5cdHRhZ05hbWU6IFwiZGl2XCIsXG5cdGNsYXNzTmFtZTogXCJhY2NvcmQtaXRlbVwiLFxufSk7XG5cbmNvbnN0IEJsb2NrSG9zdCA9IEJhY2tib25lLk1hcmlvbmV0dGUuQ29tcG9zaXRlVmlldy5leHRlbmQoe1xuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4vdGVtcGxhdGVzL2FjY29yZGlvbi5udW5qXCIpLnNlY3Rpb24sXG5cblx0dGFnTmFtZTogXCJkaXZcIixcblx0Y2xhc3NOYW1lOiBcImFjY29yZC1zZWN0aW9uXCIsXG5cblx0Y2hpbGRWaWV3Q29udGFpbmVyOiBcImRpdi5hY2NvcmQtd3JhcHBlclwiLFxuXG5cdGNoaWxkVmlld09wdGlvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRjbGlja2FibGU6IHRoaXMub3B0aW9ucy5jbGlja2FibGUsXG5cdFx0fTtcblx0fSxcblxuXHRtb2RlbEV2ZW50czoge1xuXHRcdFwiYWNjb3JkaW9uOnRvZ2dsZVwiOiBcInRvZ2dsZVwiLFxuXHR9LFxuXG5cdGNvbGxlY3Rpb25FdmVudHM6IHtcblx0XHRhZGQ6IFwicmVuZGVyQ291bnRcIixcblx0XHRyZW1vdmU6IFwicmVuZGVyQ291bnRcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIC5hY2NvcmQtaGVhZFwiOiBcInRvZ2dsZVwiLFxuXHR9LFxuXG5cdHRlbXBsYXRlQ29udGV4dDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGNvbGxlY3Rpb25TaXplOiAoKSA9PiB0aGlzLmNvbGxlY3Rpb24ubGVuZ3RoLFxuXHRcdH07XG5cdH0sXG5cblx0Y2hpbGRWaWV3OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tb2RlbC5nZXQoXCJpdGVtVmlld1wiKSB8fCBCbG9ja0l0ZW07XG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cdFx0dGhpcy5jb2xsZWN0aW9uID0gdGhpcy5tb2RlbC5nZXQoXCJpdGVtc1wiKTtcblxuXHRcdHRoaXMuYmluZEV2ZW50cyh0aGlzLmNvbGxlY3Rpb24sIHRoaXMuY29sbGVjdGlvbkV2ZW50cyk7XG5cdH0sXG5cblx0dG9nZ2xlOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCB3cmFwcGVyID0gJChcIi5hY2NvcmQtd3JhcHBlclwiLCB0aGlzLmVsKTtcblx0XHRpZiAodGhpcy5jb2xsZWN0aW9uLmxlbmd0aClcblx0XHRcdHdyYXBwZXIuc2xpZGVUb2dnbGUoKTtcblx0XHR3cmFwcGVyLnByZXYoXCIuYWNjb3JkLWhlYWRcIikudG9nZ2xlQ2xhc3MoXCJhY3RpdmVcIik7XG5cdFx0JChcIi5hY2NvcmQtd3JhcHBlclwiKS5ub3Qod3JhcHBlcikuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1pbnZhbGlkLXRoaXNcblx0XHRcdCQodGhpcykuc2xpZGVVcCgpLnByZXYoXCIuYWNjb3JkLWhlYWRcIikucmVtb3ZlQ2xhc3MoXCJhY3RpdmVcIik7XG5cdFx0fSk7XG5cdH0sXG5cblx0cmVuZGVyQ291bnQ6IGZ1bmN0aW9uKCkge1xuXHRcdCQoXCJzcGFuLmNvdW50XCIsIHRoaXMuZWwpLnRleHQodGhpcy5jb2xsZWN0aW9uLmxlbmd0aCk7XG5cblx0XHRjb25zdCB3cmFwcGVyID0gJChcIi5hY2NvcmQtd3JhcHBlclwiLCB0aGlzLmVsKTtcblx0XHRpZiAodGhpcy5jb2xsZWN0aW9uLmxlbmd0aClcblx0XHRcdHdyYXBwZXIuc2xpZGVEb3duKCk7XG5cdFx0ZWxzZVxuXHRcdFx0d3JhcHBlci5zbGlkZVVwKCk7XG5cdH0sXG59KTtcblxuY29uc3QgVmlldyA9IEJhY2tib25lLk1hcmlvbmV0dGUuQ29sbGVjdGlvblZpZXcuZXh0ZW5kKHtcblx0dGVtcGxhdGU6IGZhbHNlLFxuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwiYWNjb3JkaW9uLWhvc3RcIixcblxuXHRjaGlsZFZpZXc6IEJsb2NrSG9zdCxcblxuXHRjaGlsZFZpZXdPcHRpb25zOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0Y2xpY2thYmxlOiB0cnVlLFxuXHRcdH07XG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnMub3B0aW9ucztcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gRmluZCBvdXQgaG93IHRhbGwgYSBoZWFkIGJsb2NrIGlzXG5cdFx0Y29uc3QgaGVhZFNpemUgPSAkKFwiLmFjY29yZC1oZWFkXCIsIHRoaXMuZWwpLmZpcnN0KCkuaGVpZ2h0KCkgKiB0aGlzLmNvbGxlY3Rpb24ubGVuZ3RoO1xuXG5cdFx0Y29uc3QgcGFyZW50ID0gdGhpcy5vcHRpb25zLnBhcmVudCB8fCB0aGlzLiRlbC5wYXJlbnQoKTtcblxuXHRcdC8vIFN1YnRyYWN0IHRoYXQgZnJvbSB0aGUgcGFyZW50IGJsb2NrIHNpemVcblx0XHRjb25zdCBsZWZ0b3ZlciA9IHBhcmVudC5oZWlnaHQoKSAtIGhlYWRTaXplIC0gKHRoaXMub3B0aW9ucy5wYXJlbnRBZGp1c3QgfHwgMCk7XG5cblx0XHQvLyBUaGF0J3MgdGhlIG1heCBzaXplIG9mIGFsbCBjb250YWluZXIgYmxvY2tzXG5cdFx0JChcIi5hY2NvcmQtd3JhcHBlclwiLCB0aGlzLmVsKS5jc3MoeyBcIm1heC1oZWlnaHRcIjogbGVmdG92ZXIgKyBcInB4XCIgfSk7XG5cblx0XHQvLyBFeHBhbmQgdGhlIGZpcnN0IGJsb2NrXG5cdFx0aWYgKHRoaXMuY29sbGVjdGlvbi5oZWFkKCkuZ2V0KFwiaXRlbXNcIikubGVuZ3RoID4gMClcblx0XHRcdHRoaXMuY29sbGVjdGlvbi5oZWFkKCkudHJpZ2dlcihcImFjY29yZGlvbjp0b2dnbGVcIik7XG5cdH0sXG59KTtcblxuY29uc3QgQWNjb3JkaW9uID0gZnVuY3Rpb24ob3B0cykge1xuXHRjb25zdCB2aWV3ID0gbmV3IFZpZXcoeyBjb2xsZWN0aW9uOiBvcHRzLmNvbGxlY3Rpb24sIG9wdGlvbnM6IG9wdHMgfSk7XG5cblx0cmV0dXJuIHZpZXc7XG59O1xuXG5BY2NvcmRpb24uU2VjdGlvbiA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7XG5cdFx0dGl0bGU6IFwiU2V0IHRpdGxlIGF0dHJpYnV0ZVwiLFxuXHRcdGljb246IFwiZmEtY29nXCIsXG5cdH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBBY2NvcmRpb247Il19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar tippy = require(\"tippy.js\").default;\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"action-button\",\n\n\ttemplate: require(\"./templates/actionButton.nunj\").button,\n\n\tui: {\n\t\tglyph: \"span.glyph\",\n\t\tspinner: \"div.spinner\"\n\t},\n\n\tevents: {\n\t\tclick: \"onClick\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tglyph: this.options.glyph,\n\t\t\tlabel: this.options.label,\n\t\t\tseparator: this.options.separator,\n\t\t\ttooltip: this.options.tooltip\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\t// Options\n\t\t//   glyph: a string containing the name of the glyph (typically FontAwesome) for the button.\n\t\t//   type: a string containing the name of a CSS class that determines the type of the button.\n\t\t//         Can be one of: action-type-control, action-type-dangerous, action-type-modification.\n\t\t//   label: an optional string label that will appear to the right of the glyph.\n\t\t//   name: a string containing the name of the action - will be used as the event that is\n\t\t//         triggered when the button is clicked.\n\t\t//   permission: whether or not the button should be shown, based on some rule - leave undefined\n\t\t//               to show the button, or define a function that returns a boolean value.\n\t\t//   separator: a boolean value to specify whether is a button or a blank separator.\n\t\t//   tooltip: an optional string containing a tooltip.\n\t\t//   spinnerEventSource: an object upon which the events to control the spinner will be triggered.\n\t\t//   spinnerShowEvent: the name of the event that will cause the spinner to be shown.\n\t\t//   spinnerHideEvent: the name of the event that will cause the spinner to be hidden.\n\t\tthis.options = options;\n\n\t\tthis.tooltipInitialized = false;\n\t},\n\n\tisDisabled: function isDisabled() {\n\t\tvar disabled = false;\n\n\t\tif (this.options.permission) disabled = !this.options.permission();\n\n\t\treturn disabled;\n\t},\n\n\tonRender: function onRender() {\n\t\tif (this.options.tooltip && !this.tooltipInitialized) {\n\t\t\ttippy(this.$el.get(0), {\n\t\t\t\ttheme: \"black\",\n\t\t\t\tplacement: \"bottom\",\n\t\t\t\tcontent: this.options.tooltip\n\t\t\t});\n\n\t\t\tthis.tooltipInitialized = true;\n\t\t}\n\n\t\tif (this.options.separator) this.$el.addClass(\"separator\");\n\n\t\tif (this.options.type) this.ui.glyph.addClass(this.options.type);else this.ui.glyph.addClass(\"action-type-control\");\n\n\t\tthis.updateDisabledStatus();\n\n\t\t// Register spinner events\n\t\tif (this.options.spinnerEventSource) {\n\t\t\tthis.listenTo(this.options.spinnerEventSource, this.options.spinnerShowEvent, this.showSpinner.bind(this));\n\t\t\tthis.listenTo(this.options.spinnerEventSource, this.options.spinnerHideEvent, this.hideSpinner.bind(this));\n\t\t}\n\t},\n\n\tonClick: function onClick() {\n\t\tthis.trigger(this.options.name);\n\t},\n\n\trefresh: function refresh() {\n\t\tthis.updateDisabledStatus();\n\t},\n\n\tupdateDisabledStatus: function updateDisabledStatus() {\n\t\tif (!this.options.separator) {\n\t\t\tif (this.isDisabled()) {\n\t\t\t\tthis.ui.glyph.addClass(\"disabled\");\n\t\t\t\tthis.$el.addClass(\"disabled\");\n\t\t\t} else {\n\t\t\t\tthis.ui.glyph.removeClass(\"disabled\");\n\t\t\t\tthis.$el.removeClass(\"disabled\");\n\t\t\t}\n\t\t}\n\t},\n\n\tshowSpinner: function showSpinner() {\n\t\tthis.ui.spinner.removeClass(\"hide\");\n\t},\n\n\thideSpinner: function hideSpinner() {\n\t\t// Check for the presence of the spinner in case the view is destroyed\n\t\t// before this action is completed.\n\t\tif (this.ui.spinner && this.ui.spinner.addClass) this.ui.spinner.addClass(\"hide\");\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tif (this.options.spinnerEventSource) this.stopListening(this.options.spinnerEventSource);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFjdGlvbkJ1dHRvbi5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCJ0aXBweSIsImRlZmF1bHQiLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJleHRlbmQiLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsImJ1dHRvbiIsInVpIiwiZ2x5cGgiLCJzcGlubmVyIiwiZXZlbnRzIiwiY2xpY2siLCJ0ZW1wbGF0ZUNvbnRleHQiLCJvcHRpb25zIiwibGFiZWwiLCJzZXBhcmF0b3IiLCJ0b29sdGlwIiwiaW5pdGlhbGl6ZSIsInRvb2x0aXBJbml0aWFsaXplZCIsImlzRGlzYWJsZWQiLCJkaXNhYmxlZCIsInBlcm1pc3Npb24iLCJvblJlbmRlciIsIiRlbCIsImdldCIsInRoZW1lIiwicGxhY2VtZW50IiwiY29udGVudCIsImFkZENsYXNzIiwidHlwZSIsInVwZGF0ZURpc2FibGVkU3RhdHVzIiwic3Bpbm5lckV2ZW50U291cmNlIiwibGlzdGVuVG8iLCJzcGlubmVyU2hvd0V2ZW50Iiwic2hvd1NwaW5uZXIiLCJiaW5kIiwic3Bpbm5lckhpZGVFdmVudCIsImhpZGVTcGlubmVyIiwib25DbGljayIsInRyaWdnZXIiLCJuYW1lIiwicmVmcmVzaCIsInJlbW92ZUNsYXNzIiwib25CZWZvcmVEZXN0cm95Iiwic3RvcExpc3RlbmluZyJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUMsUUFBUUQsUUFBUSxVQUFSLEVBQW9CRSxPQUFsQzs7QUFFQUMsT0FBT0MsT0FBUCxHQUFpQkwsU0FBU00sVUFBVCxDQUFvQkMsSUFBcEIsQ0FBeUJDLE1BQXpCLENBQWdDO0FBQ2hEQyxZQUFXLGVBRHFDOztBQUdoREMsV0FBVVQsUUFBUSwrQkFBUixFQUF5Q1UsTUFISDs7QUFLaERDLEtBQUk7QUFDSEMsU0FBTyxZQURKO0FBRUhDLFdBQVM7QUFGTixFQUw0Qzs7QUFVaERDLFNB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Qzs7QUFxR2hEUixjQUFhLHVCQUFXO0FBQ3ZCLE9BQUszQixFQUFMLENBQVFFLE9BQVIsQ0FBZ0JpQyxXQUFoQixDQUE0QixNQUE1QjtBQUNBLEVBdkcrQzs7QUF5R2hETCxjQUFhLHVCQUFXO0FBQ3ZCO0FBQ0E7QUFDQSxNQUFJLEtBQUs5QixFQUFMLENBQVFFLE9BQVIsSUFBbUIsS0FBS0YsRUFBTCxDQUFRRSxPQUFSLENBQWdCbUIsUUFBdkMsRUFDQyxLQUFLckIsRUFBTCxDQUFRRSxPQUFSLENBQWdCbUIsUUFBaEIsQ0FBeUIsTUFBekI7QUFDRCxFQTlHK0M7O0FBZ0hoRGUsa0JBQWlCLDJCQUFXO0FBQzNCLE1BQUksS0FBSzlCLE9BQUwsQ0FBYWtCLGtCQUFqQixFQUNDLEtBQUthLGFBQUwsQ0FBbUIsS0FBSy9CLE9BQUwsQ0FBYWtCLGtCQUFoQztBQUNEO0FBbkgrQyxDQUFoQyxDQUFqQiIsImZpbGUiOiJhY3Rpb25CdXR0b24uanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgdGlwcHkgPSByZXF1aXJlKFwidGlwcHkuanNcIikuZGVmYXVsdDtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImFjdGlvbi1idXR0b25cIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4vdGVtcGxhdGVzL2FjdGlvbkJ1dHRvbi5udW5qXCIpLmJ1dHRvbixcblxuXHR1aToge1xuXHRcdGdseXBoOiBcInNwYW4uZ2x5cGhcIixcblx0XHRzcGlubmVyOiBcImRpdi5zcGlubmVyXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0Y2xpY2s6IFwib25DbGlja1wiLFxuXHR9LFxuXG5cdHRlbXBsYXRlQ29udGV4dDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGdseXBoOiB0aGlzLm9wdGlvbnMuZ2x5cGgsXG5cdFx0XHRsYWJlbDogdGhpcy5vcHRpb25zLmxhYmVsLFxuXHRcdFx0c2VwYXJhdG9yOiB0aGlzLm9wdGlvbnMuc2VwYXJhdG9yLFxuXHRcdFx0dG9vbHRpcDogdGhpcy5vcHRpb25zLnRvb2x0aXAsXG5cdFx0fTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0Ly8gT3B0aW9uc1xuXHRcdC8vICAgZ2x5cGg6IGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGdseXBoICh0eXBpY2FsbHkgRm9udEF3ZXNvbWUpIGZvciB0aGUgYnV0dG9uLlxuXHRcdC8vICAgdHlwZTogYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiBhIENTUyBjbGFzcyB0aGF0IGRldGVybWluZXMgdGhlIHR5cGUgb2YgdGhlIGJ1dHRvbi5cblx0XHQvLyAgICAgICAgIENhbiBiZSBvbmUgb2Y6IGFjdGlvbi10eXBlLWNvbnRyb2wsIGFjdGlvbi10eXBlLWRhbmdlcm91cywgYWN0aW9uLXR5cGUtbW9kaWZpY2F0aW9uLlxuXHRcdC8vICAgbGFiZWw6IGFuIG9wdGlvbmFsIHN0cmluZyBsYWJlbCB0aGF0IHdpbGwgYXBwZWFyIHRvIHRoZSByaWdodCBvZiB0aGUgZ2x5cGguXG5cdFx0Ly8gICBuYW1lOiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gLSB3aWxsIGJlIHVzZWQgYXMgdGhlIGV2ZW50IHRoYXQgaXNcblx0XHQvLyAgICAgICAgIHRyaWdnZXJlZCB3aGVuIHRoZSBidXR0b24gaXMgY2xpY2tlZC5cblx0XHQvLyAgIHBlcm1pc3Npb246IHdoZXRoZXIgb3Igbm90IHRoZSBidXR0b24gc2hvdWxkIGJlIHNob3duLCBiYXNlZCBvbiBzb21lIHJ1bGUgLSBsZWF2ZSB1bmRlZmluZWRcblx0XHQvLyAgICAgICAgICAgICAgIHRvIHNob3cgdGhlIGJ1dHRvbiwgb3IgZGVmaW5lIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZS5cblx0XHQvLyAgIHNlcGFyYXRvcjogYSBib29sZWFuIHZhbHVlIHRvIHNwZWNpZnkgd2hldGhlciBpcyBhIGJ1dHRvbiBvciBhIGJsYW5rIHNlcGFyYXRvci5cblx0XHQvLyAgIHRvb2x0aXA6IGFuIG9wdGlvbmFsIHN0cmluZyBjb250YWluaW5nIGEgdG9vbHRpcC5cblx0XHQvLyAgIHNwaW5uZXJFdmVudFNvdXJjZTogYW4gb2JqZWN0IHVwb24gd2hpY2ggdGhlIGV2ZW50cyB0byBjb250cm9sIHRoZSBzcGlubmVyIHdpbGwgYmUgdHJpZ2dlcmVkLlxuXHRcdC8vICAgc3Bpbm5lclNob3dFdmVudDogdGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRoYXQgd2lsbCBjYXVzZSB0aGUgc3Bpbm5lciB0byBiZSBzaG93bi5cblx0XHQvLyAgIHNwaW5uZXJIaWRlRXZlbnQ6IHRoZSBuYW1lIG9mIHRoZSBldmVudCB0aGF0IHdpbGwgY2F1c2UgdGhlIHNwaW5uZXIgdG8gYmUgaGlkZGVuLlxuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cblx0XHR0aGlzLnRvb2x0aXBJbml0aWFsaXplZCA9IGZhbHNlO1xuXHR9LFxuXG5cdGlzRGlzYWJsZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdGxldCBkaXNhYmxlZCA9IGZhbHNlO1xuXG5cdFx0aWYgKHRoaXMub3B0aW9ucy5wZXJtaXNzaW9uKVxuXHRcdFx0ZGlzYWJsZWQgPSAhdGhpcy5vcHRpb25zLnBlcm1pc3Npb24oKTtcblxuXHRcdHJldHVybiBkaXNhYmxlZDtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMub3B0aW9ucy50b29sdGlwICYmICF0aGlzLnRvb2x0aXBJbml0aWFsaXplZCkge1xuXHRcdFx0dGlwcHkodGhpcy4kZWwuZ2V0KDApLCB7XG5cdFx0XHRcdHRoZW1lOiBcImJsYWNrXCIsXG5cdFx0XHRcdHBsYWNlbWVudDogXCJib3R0b21cIixcblx0XHRcdFx0Y29udGVudDogdGhpcy5vcHRpb25zLnRvb2x0aXAsXG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy50b29sdGlwSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLm9wdGlvbnMuc2VwYXJhdG9yKVxuXHRcdFx0dGhpcy4kZWwuYWRkQ2xhc3MoXCJzZXBhcmF0b3JcIik7XG5cblx0XHRpZiAodGhpcy5vcHRpb25zLnR5cGUpXG5cdFx0XHR0aGlzLnVpLmdseXBoLmFkZENsYXNzKHRoaXMub3B0aW9ucy50eXBlKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnVpLmdseXBoLmFkZENsYXNzKFwiYWN0aW9uLXR5cGUtY29udHJvbFwiKTtcblxuXHRcdHRoaXMudXBkYXRlRGlzYWJsZWRTdGF0dXMoKTtcblxuXHRcdC8vIFJlZ2lzdGVyIHNwaW5uZXIgZXZlbnRzXG5cdFx0aWYgKHRoaXMub3B0aW9ucy5zcGlubmVyRXZlbnRTb3VyY2UpIHtcblx0XHRcdHRoaXMubGlzdGVuVG8odGhpcy5vcHRpb25zLnNwaW5uZXJFdmVudFNvdXJjZSwgdGhpcy5vcHRpb25zLnNwaW5uZXJTaG93RXZlbnQsIHRoaXMuc2hvd1NwaW5uZXIuYmluZCh0aGlzKSk7XG5cdFx0XHR0aGlzLmxpc3RlblRvKHRoaXMub3B0aW9ucy5zcGlubmVyRXZlbnRTb3VyY2UsIHRoaXMub3B0aW9ucy5zcGlubmVySGlkZUV2ZW50LCB0aGlzLmhpZGVTcGlubmVyLmJpbmQodGhpcykpO1xuXHRcdH1cblx0fSxcblxuXHRvbkNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnRyaWdnZXIodGhpcy5vcHRpb25zLm5hbWUpO1xuXHR9LFxuXG5cdHJlZnJlc2g6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudXBkYXRlRGlzYWJsZWRTdGF0dXMoKTtcblx0fSxcblxuXHR1cGRhdGVEaXNhYmxlZFN0YXR1czogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLm9wdGlvbnMuc2VwYXJhdG9yKSB7XG5cdFx0XHRpZiAodGhpcy5pc0Rpc2FibGVkKCkpIHtcblx0XHRcdFx0dGhpcy51aS5nbHlwaC5hZGRDbGFzcyhcImRpc2FibGVkXCIpO1xuXHRcdFx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcImRpc2FibGVkXCIpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHRoaXMudWkuZ2x5cGgucmVtb3ZlQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblx0XHRcdFx0dGhpcy4kZWwucmVtb3ZlQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0c2hvd1NwaW5uZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkuc3Bpbm5lci5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0aGlkZVNwaW5uZXI6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIENoZWNrIGZvciB0aGUgcHJlc2VuY2Ugb2YgdGhlIHNwaW5uZXIgaW4gY2FzZSB0aGUgdmlldyBpcyBkZXN0cm95ZWRcblx0XHQvLyBiZWZvcmUgdGhpcyBhY3Rpb24gaXMgY29tcGxldGVkLlxuXHRcdGlmICh0aGlzLnVpLnNwaW5uZXIgJiYgdGhpcy51aS5zcGlubmVyLmFkZENsYXNzKVxuXHRcdFx0dGhpcy51aS5zcGlubmVyLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLm9wdGlvbnMuc3Bpbm5lckV2ZW50U291cmNlKVxuXHRcdFx0dGhpcy5zdG9wTGlzdGVuaW5nKHRoaXMub3B0aW9ucy5zcGlubmVyRXZlbnRTb3VyY2UpO1xuXHR9LFxufSk7XG4iXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"action-header\",\n\n\ttemplate: require(\"./templates/actionHeader.nunj\"),\n\n\tregions: {\n\t\ttitle: \".action-title-region\",\n\t\ttoolbar: \".action-toolbar-region\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.eventBus = options.eventBus;\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this = this;\n\n\t\t// Create and display the title\n\t\tif (this.titleView) {\n\t\t\tthis.TitleView = this.titleView();\n\n\t\t\tvar titleView = new this.TitleView({ eventBus: this.eventBus });\n\n\t\t\tthis.listenToOnce(titleView, \"render\", function () {\n\t\t\t\tif (_this.onTitleReady) _this.onTitleReady();\n\t\t\t});\n\n\t\t\tthis.showChildView(\"title\", titleView);\n\t\t}\n\n\t\t// Create and display the toolbar\n\t\tif (this.toolbarView) {\n\t\t\tthis.ToolbarView = this.toolbarView();\n\n\t\t\tvar toolbarView = new this.ToolbarView({ eventBus: this.eventBus });\n\n\t\t\tthis.listenToOnce(toolbarView, \"render\", function () {\n\t\t\t\tif (_this.onToolbarReady) _this.onToolbarReady();\n\t\t\t});\n\n\t\t\tthis.showChildView(\"toolbar\", toolbarView);\n\t\t}\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(this.eventBus);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFjdGlvbkhlYWRlci5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJleHRlbmQiLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsInJlZ2lvbnMiLCJ0aXRsZSIsInRvb2xiYXIiLCJpbml0aWFsaXplIiwib3B0aW9ucyIsImV2ZW50QnVzIiwib25SZW5kZXIiLCJ0aXRsZVZpZXciLCJUaXRsZVZpZXciLCJsaXN0ZW5Ub09uY2UiLCJvblRpdGxlUmVhZHkiLCJzaG93Q2hpbGRWaWV3IiwidG9vbGJhclZpZXciLCJUb29sYmFyVmlldyIsIm9uVG9vbGJhclJlYWR5Iiwib25CZWZvcmVEZXN0cm95Iiwic3RvcExpc3RlbmluZyJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCOztBQUVBQyxPQUFPQyxPQUFQLEdBQWlCSCxTQUFTSSxVQUFULENBQW9CQyxJQUFwQixDQUF5QkMsTUFBekIsQ0FBZ0M7QUFDaERDLFlBQVcsZUFEcUM7O0FBR2hEQyxXQUFVUCxRQUFRLCtCQUFSLENBSHNDOztBQUtoRFEsVUFBUztBQUNSQyxTQUFPLHNCQURDO0FBRVJDLFdBQVM7QUFGRCxFQUx1Qzs7QUFVaERDLGFBQVksb0JBQVNDLE9BQVQsRUFBa0I7QUFDN0IsT0FBS0MsUUFBTCxHQUFnQkQsUUFBUUMsUUFBeEI7QUFDQSxFQVorQzs7QUFjaERDLFdBQVUsb0JBQVc7QUFBQTs7QUFDcEI7QUFDQSxNQUFJLEtBQUtDLFNBQVQsRUFBb0I7QUFDbkIsUUFBS0MsU0FBTCxHQUFpQixLQUFLRCxTQUFMLEVBQWpCOztBQUVBLE9BQU1BLFlBQVksSUFBSSxLQUFLQyxTQUFULENBQW1CLEVBQUVILFVBQVUsS0FBS0EsUUFBakIsRUFBbkIsQ0FBbEI7O0FBRUEsUUFBS0ksWUFBTCxDQUFrQkYsU0FBbEIsRUFBNkIsUUFBN0IsRUFBdUMsWUFBTTtBQUM1QyxRQUFJLE1BQUtHLFlBQVQsRUFDQyxNQUFLQSxZQUFMO0FBQ0QsSUFIRDs7QUFLQSxRQUFLQyxhQUFMLENBQW1CLE9BQW5CLEVBQTRCSixTQUE1QjtBQUNBOztBQUVEO0FBQ0EsTUFBSSxLQUFLSyxXQUFULEVBQXNCO0FBQ3JCLFFBQUtDLFdBQUwsR0FBbUIsS0FBS0QsV0FBTCxFQUFuQjs7QUFFQSxPQUFNQSxjQUFjLElBQUksS0FBS0MsV0FBVCxDQUFxQixFQUFFUixVQUFVLEtBQUtBLFFBQWpCLEVBQXJCLENBQXBCOztBQUVBLFFBQUtJLFlBQUwsQ0FBa0JHLFdBQWxCLEVBQStCLFFBQS9CLEVBQXlDLFlBQU07QUFDOUMsUUFBSSxNQUFLRSxjQUFULEVBQ0MsTUFBS0EsY0FBTDtBQUNELElBSEQ7O0FBS0EsUUFBS0gsYUFBTCxDQUFtQixTQUFuQixFQUE4QkMsV0FBOUI7QUFDQTtBQUNELEVBMUMrQzs7QUE0Q2hERyxrQkFBaUIsMkJBQVc7QUFDM0IsT0FBS0MsYUFBTCxDQUFtQixLQUFLWCxRQUF4QjtBQUNBO0FBOUMrQyxDQUFoQyxDQUFqQiIsImZpbGUiOiJhY3Rpb25IZWFkZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiYWN0aW9uLWhlYWRlclwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi90ZW1wbGF0ZXMvYWN0aW9uSGVhZGVyLm51bmpcIiksXG5cblx0cmVnaW9uczoge1xuXHRcdHRpdGxlOiBcIi5hY3Rpb24tdGl0bGUtcmVnaW9uXCIsXG5cdFx0dG9vbGJhcjogXCIuYWN0aW9uLXRvb2xiYXItcmVnaW9uXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuZXZlbnRCdXMgPSBvcHRpb25zLmV2ZW50QnVzO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHQvLyBDcmVhdGUgYW5kIGRpc3BsYXkgdGhlIHRpdGxlXG5cdFx0aWYgKHRoaXMudGl0bGVWaWV3KSB7XG5cdFx0XHR0aGlzLlRpdGxlVmlldyA9IHRoaXMudGl0bGVWaWV3KCk7XG5cblx0XHRcdGNvbnN0IHRpdGxlVmlldyA9IG5ldyB0aGlzLlRpdGxlVmlldyh7IGV2ZW50QnVzOiB0aGlzLmV2ZW50QnVzIH0pO1xuXG5cdFx0XHR0aGlzLmxpc3RlblRvT25jZSh0aXRsZVZpZXcsIFwicmVuZGVyXCIsICgpID0+IHtcblx0XHRcdFx0aWYgKHRoaXMub25UaXRsZVJlYWR5KVxuXHRcdFx0XHRcdHRoaXMub25UaXRsZVJlYWR5KCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwidGl0bGVcIiwgdGl0bGVWaWV3KTtcblx0XHR9XG5cblx0XHQvLyBDcmVhdGUgYW5kIGRpc3BsYXkgdGhlIHRvb2xiYXJcblx0XHRpZiAodGhpcy50b29sYmFyVmlldykge1xuXHRcdFx0dGhpcy5Ub29sYmFyVmlldyA9IHRoaXMudG9vbGJhclZpZXcoKTtcblxuXHRcdFx0Y29uc3QgdG9vbGJhclZpZXcgPSBuZXcgdGhpcy5Ub29sYmFyVmlldyh7IGV2ZW50QnVzOiB0aGlzLmV2ZW50QnVzIH0pO1xuXG5cdFx0XHR0aGlzLmxpc3RlblRvT25jZSh0b29sYmFyVmlldywgXCJyZW5kZXJcIiwgKCkgPT4ge1xuXHRcdFx0XHRpZiAodGhpcy5vblRvb2xiYXJSZWFkeSlcblx0XHRcdFx0XHR0aGlzLm9uVG9vbGJhclJlYWR5KCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwidG9vbGJhclwiLCB0b29sYmFyVmlldyk7XG5cdFx0fVxuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKHRoaXMuZXZlbnRCdXMpO1xuXHR9LFxufSk7XG4iXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"action-title\",\n\n\ttemplate: require(\"./templates/actionTitle.nunj\"),\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this = this;\n\n\t\treturn {\n\t\t\tglyph: function glyph() {\n\t\t\t\treturn _this.glyph;\n\t\t\t},\n\n\t\t\ttitle: function title() {\n\t\t\t\treturn _this.title;\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.glyph = \"\";\n\t\tthis.title = \"\";\n\n\t\tthis.eventBus = options.eventBus;\n\n\t\tthis.listenTo(this.eventBus, \"action-title:change-glyph\", this.changeGlyph.bind(this));\n\t\tthis.listenTo(this.eventBus, \"action-title:change-title\", this.changeTitle.bind(this));\n\t},\n\n\tchangeGlyph: function changeGlyph(newGlyph) {\n\t\tthis.glyph = newGlyph;\n\n\t\tthis.render();\n\t},\n\n\tchangeTitle: function changeTitle(newTitle) {\n\t\tthis.title = newTitle;\n\n\t\tthis.render();\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(this.eventBus);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFjdGlvblRpdGxlLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIm1vZHVsZSIsImV4cG9ydHMiLCJNYXJpb25ldHRlIiwiVmlldyIsImV4dGVuZCIsImNsYXNzTmFtZSIsInRlbXBsYXRlIiwidGVtcGxhdGVDb250ZXh0IiwiZ2x5cGgiLCJ0aXRsZSIsImluaXRpYWxpemUiLCJvcHRpb25zIiwiZXZlbnRCdXMiLCJsaXN0ZW5UbyIsImNoYW5nZUdseXBoIiwiYmluZCIsImNoYW5nZVRpdGxlIiwibmV3R2x5cGgiLCJyZW5kZXIiLCJuZXdUaXRsZSIsIm9uQmVmb3JlRGVzdHJveSIsInN0b3BMaXN0ZW5pbmciXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjs7QUFFQUMsT0FBT0MsT0FBUCxHQUFpQkgsU0FBU0ksVUFBVCxDQUFvQkMsSUFBcEIsQ0FBeUJDLE1BQXpCLENBQWdDO0FBQ2hEQyxZQUFXLGNBRHFDOztBQUdoREMsV0FBVVAsUUFBUSw4QkFBUixDQUhzQzs7QUFLaERRLGtCQUFpQiwyQkFBVztBQUFBOztBQUMzQixTQUFPO0FBQ05DLFVBQU87QUFBQSxXQUFNLE1BQUtBLEtBQVg7QUFBQSxJQUREOztBQUdOQyxVQUFPO0FBQUEsV0FBTSxNQUFLQSxLQUFYO0FBQUE7QUFIRCxHQUFQO0FBS0EsRUFYK0M7O0FBYWhEQyxhQUFZLG9CQUFTQyxPQUFULEVBQWtCO0FBQzdCLE9BQUtILEtBQUwsR0FBYSxFQUFiO0FBQ0EsT0FBS0MsS0FBTCxHQUFhLEVBQWI7O0FBRUEsT0FBS0csUUFBTCxHQUFnQkQsUUFBUUMsUUFBeEI7O0FBRUEsT0FBS0MsUUFBTCxDQUFjLEtBQUtELFFBQW5CLEVBQTZCLDJCQUE3QixFQUEwRCxLQUFLRSxXQUFMLENBQWlCQyxJQUFqQixDQUFzQixJQUF0QixDQUExRDtBQUNBLE9BQUtGLFFBQUwsQ0FBYyxLQUFLRCxRQUFuQixFQUE2QiwyQkFBN0IsRUFBMEQsS0FBS0ksV0FBTCxDQUFpQkQsSUFBakIsQ0FBc0IsSUFBdEIsQ0FBMUQ7QUFDQSxFQXJCK0M7O0FBdUJoREQsY0FBYSxxQkFBU0csUUFBVCxFQUFtQjtBQUMvQixPQUFLVCxLQUFMLEdBQWFTLFFBQWI7O0FBRUEsT0FBS0MsTUFBTDtBQUNBLEVBM0IrQzs7QUE2QmhERixjQUFhLHFCQUFTRyxRQUFULEVBQW1CO0FBQy9CLE9BQUtWLEtBQUwsR0FBYVUsUUFBYjs7QUFFQSxPQUFLRCxNQUFMO0FBQ0EsRUFqQytDOztBQW1DaERFLGtCQUFpQiwyQkFBVztBQUMzQixPQUFLQyxhQUFMLENBQW1CLEtBQUtULFFBQXhCO0FBQ0E7QUFyQytDLENBQWhDLENBQWpCIiwiZmlsZSI6ImFjdGlvblRpdGxlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImFjdGlvbi10aXRsZVwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi90ZW1wbGF0ZXMvYWN0aW9uVGl0bGUubnVualwiKSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRnbHlwaDogKCkgPT4gdGhpcy5nbHlwaCxcblxuXHRcdFx0dGl0bGU6ICgpID0+IHRoaXMudGl0bGUsXG5cdFx0fTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5nbHlwaCA9IFwiXCI7XG5cdFx0dGhpcy50aXRsZSA9IFwiXCI7XG5cblx0XHR0aGlzLmV2ZW50QnVzID0gb3B0aW9ucy5ldmVudEJ1cztcblxuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJhY3Rpb24tdGl0bGU6Y2hhbmdlLWdseXBoXCIsIHRoaXMuY2hhbmdlR2x5cGguYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmV2ZW50QnVzLCBcImFjdGlvbi10aXRsZTpjaGFuZ2UtdGl0bGVcIiwgdGhpcy5jaGFuZ2VUaXRsZS5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRjaGFuZ2VHbHlwaDogZnVuY3Rpb24obmV3R2x5cGgpIHtcblx0XHR0aGlzLmdseXBoID0gbmV3R2x5cGg7XG5cblx0XHR0aGlzLnJlbmRlcigpO1xuXHR9LFxuXG5cdGNoYW5nZVRpdGxlOiBmdW5jdGlvbihuZXdUaXRsZSkge1xuXHRcdHRoaXMudGl0bGUgPSBuZXdUaXRsZTtcblxuXHRcdHRoaXMucmVuZGVyKCk7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcodGhpcy5ldmVudEJ1cyk7XG5cdH0sXG59KTtcbiJdfQ==",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\n\nvar ActionButton = require(\"./actionButton\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"action-toolbar action-toolbar-hidden\",\n\n\ttemplate: false,\n\n\tinitialize: function initialize(options) {\n\t\t// Options\n\t\t//   eventBus (required): A Backbone.Marionette object that can facilitate event handling.\n\t\t//\t name: set this to a string to identify this action toolbar uniquely. This string\n\t\t//\t\t\t\t will be used as the prefix for all events that this toolbar responds to.\n\t\t//         Leaving this attribute undefined will cause the toolbar to use the default\n\t\t//         prefix of 'action-toolbar'.\n\t\t//   small: set to true to reduce the size of the buttons using a pre-defined CSS class\n\t\tthis.options = options;\n\n\t\tthis.eventBus = options.eventBus;\n\t\tthis.prefix = this.options.name ? this.options.name : \"action-toolbar\";\n\n\t\tthis.listenTo(this.eventBus, this.prefix + \":change-specification\", this.onChangeSpecification.bind(this));\n\t\tthis.listenTo(this.eventBus, this.prefix + \":hide\", this.onExplicitHide.bind(this));\n\t\tthis.listenTo(this.eventBus, this.prefix + \":refresh\", this.onRefresh.bind(this));\n\t\tthis.listenTo(this.eventBus, this.prefix + \":show\", this.onExplicitShow.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\tif (this.options.small) this.$el.addClass(\"action-toolbar-small\");\n\t},\n\n\tstopListeningToActionButtons: function stopListeningToActionButtons() {\n\t\tvar _this = this;\n\n\t\tif (this.actionButtons) {\n\t\t\t_.each(this.actionButtons, function (actionButton) {\n\t\t\t\t_this.stopListening(actionButton);\n\t\t\t});\n\t\t}\n\t},\n\n\tdestroyActionButtons: function destroyActionButtons() {\n\t\tif (this.actionButtons) {\n\t\t\t_.each(this.actionButtons, function (actionButton) {\n\t\t\t\tactionButton.destroy();\n\t\t\t});\n\n\t\t\tthis.actionButtons = null;\n\t\t}\n\t},\n\n\tonChangeSpecification: function onChangeSpecification(newSpecification) {\n\t\tvar _this2 = this;\n\n\t\tthis.stopListeningToActionButtons();\n\t\tthis.destroyActionButtons();\n\n\t\tthis.actionButtons = [];\n\n\t\t_.each(newSpecification, function (action) {\n\t\t\tvar actionButton = new ActionButton(action);\n\n\t\t\t_this2.listenTo(actionButton, action.name, function () {\n\t\t\t\t_this2.eventBus.trigger(action.name);\n\t\t\t});\n\n\t\t\t_this2.$el.append(actionButton.render().$el);\n\n\t\t\t_this2.actionButtons.push(actionButton);\n\t\t});\n\t},\n\n\tonExplicitHide: function onExplicitHide() {\n\t\tthis.$el.addClass(\"action-toolbar-hidden\");\n\t},\n\n\tonExplicitShow: function onExplicitShow() {\n\t\tthis.$el.removeClass(\"action-toolbar-hidden\");\n\t},\n\n\tonRefresh: function onRefresh() {\n\t\t_.each(this.actionButtons, function (actionButton) {\n\t\t\treturn actionButton.refresh();\n\t\t});\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListeningToActionButtons();\n\n\t\tthis.stopListening(this.eventBus);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFjdGlvblRvb2xiYXIuanMiXSwibmFtZXMiOlsiXyIsInJlcXVpcmUiLCJCYWNrYm9uZSIsIkFjdGlvbkJ1dHRvbiIsIm1vZHVsZSIsImV4cG9ydHMiLCJNYXJpb25ldHRlIiwiVmlldyIsImV4dGVuZCIsImNsYXNzTmFtZSIsInRlbXBsYXRlIiwiaW5pdGlhbGl6ZSIsIm9wdGlvbnMiLCJldmVudEJ1cyIsInByZWZpeCIsIm5hbWUiLCJsaXN0ZW5UbyIsIm9uQ2hhbmdlU3BlY2lmaWNhdGlvbiIsImJpbmQiLCJvbkV4cGxpY2l0SGlkZSIsIm9uUmVmcmVzaCIsIm9uRXhwbGljaXRTaG93Iiwib25SZW5kZXIiLCJzbWFsbCIsIiRlbCIsImFkZENsYXNzIiwic3RvcExpc3RlbmluZ1RvQWN0aW9uQnV0dG9ucyIsImFjdGlvbkJ1dHRvbnMiLCJlYWNoIiwic3RvcExpc3RlbmluZyIsImFjdGlvbkJ1dHRvbiIsImRlc3Ryb3lBY3Rpb25CdXR0b25zIiwiZGVzdHJveSIsIm5ld1NwZWNpZmljYXRpb24iLCJhY3Rpb24iLCJ0cmlnZ2VyIiwiYXBwZW5kIiwicmVuZGVyIiwicHVzaCIsInJlbW92ZUNsYXNzIiwicmVmcmVzaCIsIm9uQmVmb3JlRGVzdHJveSJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsSUFBSUMsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNQyxXQUFXRCxRQUFRLFVBQVIsQ0FBakI7O0FBRUEsSUFBTUUsZUFBZUYsUUFBUSxnQkFBUixDQUFyQjs7QUFFQUcsT0FBT0MsT0FBUCxHQUFpQkgsU0FBU0ksVUFBVCxDQUFvQkMsSUFBcEIsQ0FBeUJDLE1BQXpCLENBQWdDO0FBQ2hEQyxZQUFXLHNDQURxQzs7QUFHaERDLFdBQVUsS0FIc0M7O0FBS2hEQyxhQUFZLG9CQUFTQyxPQUFULEVBQWtCO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBS0EsT0FBTCxHQUFlQSxPQUFmOztBQUVBLE9BQUtDLFFBQUwsR0FB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ImZpbGUiOiJhY3Rpb25Ub29sYmFyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuXG5jb25zdCBBY3Rpb25CdXR0b24gPSByZXF1aXJlKFwiLi9hY3Rpb25CdXR0b25cIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJhY3Rpb24tdG9vbGJhciBhY3Rpb24tdG9vbGJhci1oaWRkZW5cIixcblxuXHR0ZW1wbGF0ZTogZmFsc2UsXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdC8vIE9wdGlvbnNcblx0XHQvLyAgIGV2ZW50QnVzIChyZXF1aXJlZCk6IEEgQmFja2JvbmUuTWFyaW9uZXR0ZSBvYmplY3QgdGhhdCBjYW4gZmFjaWxpdGF0ZSBldmVudCBoYW5kbGluZy5cblx0XHQvL1x0IG5hbWU6IHNldCB0aGlzIHRvIGEgc3RyaW5nIHRvIGlkZW50aWZ5IHRoaXMgYWN0aW9uIHRvb2xiYXIgdW5pcXVlbHkuIFRoaXMgc3RyaW5nXG5cdFx0Ly9cdFx0XHRcdCB3aWxsIGJlIHVzZWQgYXMgdGhlIHByZWZpeCBmb3IgYWxsIGV2ZW50cyB0aGF0IHRoaXMgdG9vbGJhciByZXNwb25kcyB0by5cblx0XHQvLyAgICAgICAgIExlYXZpbmcgdGhpcyBhdHRyaWJ1dGUgdW5kZWZpbmVkIHdpbGwgY2F1c2UgdGhlIHRvb2xiYXIgdG8gdXNlIHRoZSBkZWZhdWx0XG5cdFx0Ly8gICAgICAgICBwcmVmaXggb2YgJ2FjdGlvbi10b29sYmFyJy5cblx0XHQvLyAgIHNtYWxsOiBzZXQgdG8gdHJ1ZSB0byByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIGJ1dHRvbnMgdXNpbmcgYSBwcmUtZGVmaW5lZCBDU1MgY2xhc3Ncblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG5cdFx0dGhpcy5ldmVudEJ1cyA9IG9wdGlvbnMuZXZlbnRCdXM7XG5cdFx0dGhpcy5wcmVmaXggPSB0aGlzLm9wdGlvbnMubmFtZSA/IHRoaXMub3B0aW9ucy5uYW1lIDogXCJhY3Rpb24tdG9vbGJhclwiO1xuXG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmV2ZW50QnVzLCB0aGlzLnByZWZpeCArIFwiOmNoYW5nZS1zcGVjaWZpY2F0aW9uXCIsIHRoaXMub25DaGFuZ2VTcGVjaWZpY2F0aW9uLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgdGhpcy5wcmVmaXggKyBcIjpoaWRlXCIsIHRoaXMub25FeHBsaWNpdEhpZGUuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmV2ZW50QnVzLCB0aGlzLnByZWZpeCArIFwiOnJlZnJlc2hcIiwgdGhpcy5vblJlZnJlc2guYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmV2ZW50QnVzLCB0aGlzLnByZWZpeCArIFwiOnNob3dcIiwgdGhpcy5vbkV4cGxpY2l0U2hvdy5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMub3B0aW9ucy5zbWFsbClcblx0XHRcdHRoaXMuJGVsLmFkZENsYXNzKFwiYWN0aW9uLXRvb2xiYXItc21hbGxcIik7XG5cdH0sXG5cblx0c3RvcExpc3RlbmluZ1RvQWN0aW9uQnV0dG9uczogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuYWN0aW9uQnV0dG9ucykge1xuXHRcdFx0Xy5lYWNoKHRoaXMuYWN0aW9uQnV0dG9ucywgYWN0aW9uQnV0dG9uID0+IHtcblx0XHRcdFx0dGhpcy5zdG9wTGlzdGVuaW5nKGFjdGlvbkJ1dHRvbik7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0ZGVzdHJveUFjdGlvbkJ1dHRvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLmFjdGlvbkJ1dHRvbnMpIHtcblx0XHRcdF8uZWFjaCh0aGlzLmFjdGlvbkJ1dHRvbnMsIGFjdGlvbkJ1dHRvbiA9PiB7XG5cdFx0XHRcdGFjdGlvbkJ1dHRvbi5kZXN0cm95KCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5hY3Rpb25CdXR0b25zID0gbnVsbDtcblx0XHR9XG5cdH0sXG5cblx0b25DaGFuZ2VTcGVjaWZpY2F0aW9uOiBmdW5jdGlvbihuZXdTcGVjaWZpY2F0aW9uKSB7XG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nVG9BY3Rpb25CdXR0b25zKCk7XG5cdFx0dGhpcy5kZXN0cm95QWN0aW9uQnV0dG9ucygpO1xuXG5cdFx0dGhpcy5hY3Rpb25CdXR0b25zID0gW107XG5cblx0XHRfLmVhY2gobmV3U3BlY2lmaWNhdGlvbiwgYWN0aW9uID0+IHtcblx0XHRcdGNvbnN0IGFjdGlvbkJ1dHRvbiA9IG5ldyBBY3Rpb25CdXR0b24oYWN0aW9uKTtcblxuXHRcdFx0dGhpcy5saXN0ZW5UbyhhY3Rpb25CdXR0b24sIGFjdGlvbi5uYW1lLCAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihhY3Rpb24ubmFtZSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy4kZWwuYXBwZW5kKGFjdGlvbkJ1dHRvbi5yZW5kZXIoKS4kZWwpO1xuXG5cdFx0XHR0aGlzLmFjdGlvbkJ1dHRvbnMucHVzaChhY3Rpb25CdXR0b24pO1xuXHRcdH0pO1xuXHR9LFxuXG5cdG9uRXhwbGljaXRIaWRlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcImFjdGlvbi10b29sYmFyLWhpZGRlblwiKTtcblx0fSxcblxuXHRvbkV4cGxpY2l0U2hvdzogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy4kZWwucmVtb3ZlQ2xhc3MoXCJhY3Rpb24tdG9vbGJhci1oaWRkZW5cIik7XG5cdH0sXG5cblx0b25SZWZyZXNoOiBmdW5jdGlvbigpIHtcblx0XHRfLmVhY2godGhpcy5hY3Rpb25CdXR0b25zLCBhY3Rpb25CdXR0b24gPT4gYWN0aW9uQnV0dG9uLnJlZnJlc2goKSk7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmdUb0FjdGlvbkJ1dHRvbnMoKTtcblxuXHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLmV2ZW50QnVzKTtcblx0fSxcbn0pO1xuIl19",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar NProgress = require(\"nprogress\");\n\nvar gradeMap = require(\"./gradeMap\");\nvar Resource = require(\"../content/models/manager/resourceModel\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"assessment-import-modal\",\n\n\ttemplate: require(\"./templates/assessmentImportModal.nunj\").content,\n\n\tui: {\n\t\tform: \"div.form\",\n\t\timportButton: \"button.import\",\n\t\tcancelButton: \"button.cancel\",\n\t\tcloseButton: \"button.close\",\n\t\tmessage: \"span.message\",\n\t\tworkingSpinner: \"span.spinner-working\",\n\n\t\timportForm: \".import-form\",\n\t\timportResult: \".import-result\",\n\t\tresultMessage: \".import-result-message\",\n\t\tassessmentTitle: \".assessment-metadata-title\",\n\t\tassessmentLanguage: \".assessment-metadata-language\",\n\t\tassessmentGrade: \".assessment-metadata-grade\",\n\t\tassessmentSubject: \".assessment-metadata-subject\",\n\t\tassessmentFile: \"input#assessment-file\"\n\t},\n\n\tevents: {\n\t\tclick: \"onClick\",\n\t\t\"click @ui.importButton\": \"onImport\",\n\t\t\"click @ui.cancelButton\": \"onCancel\",\n\t\t\"click @ui.closeButton\": \"onClose\",\n\n\t\t\"change @ui.assessmentFile\": \"onAssessmentFileChanged\"\n\t},\n\n\tmodelEvents: {\n\t\t\"upload:progress\": \"onUploadProgress\",\n\t\tinvalid: \"validationFail\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.host = options.host || \"#modals\";\n\t},\n\n\tshow: function show() {\n\t\t$(\".modal-container\", $(this.host)).append(this.render().el);\n\t},\n\n\tonRender: function onRender() {\n\t\t// Render a background\n\t\t$(\".modal-element\", $(this.host)).removeClass(\"hide\");\n\t\t$(\"body\").addClass(\"hide-overflow\");\n\n\t\t// Initialize the UI\n\t\tthis.onAssessmentFileChanged();\n\t},\n\n\tonDestroy: function onDestroy() {\n\t\t// Clean up the background\n\t\t$(\".modal-element\", $(this.host)).addClass(\"hide\");\n\t\t$(\"body\").removeClass(\"hide-overflow\");\n\t},\n\n\tgetAssessmentFile: function getAssessmentFile() {\n\t\treturn this.ui.assessmentFile.get(0).files.length === 0 ? null : this.ui.assessmentFile.get(0).files[0];\n\t},\n\n\tonClick: function onClick(event) {\n\t\tevent.stopPropagation();\n\t},\n\n\tonAssessmentFileChanged: function onAssessmentFileChanged() {\n\t\tif (this.getAssessmentFile()) {\n\t\t\tthis.ui.importButton.prop(\"disabled\", false);\n\t\t\tthis.ui.importButton.removeClass(\"disabled\");\n\t\t} else {\n\t\t\tthis.ui.importButton.prop(\"disabled\", true);\n\t\t\tthis.ui.importButton.addClass(\"disabled\");\n\t\t}\n\t},\n\n\tonImport: function onImport() {\n\t\t// Set the assessment file\n\t\tthis.model.setFile(\"file\", this.getAssessmentFile());\n\n\t\tif (this.model.isValid()) {\n\t\t\t// Disable the modal buttons\n\t\t\tthis.setUIBusy();\n\n\t\t\t// Configure and start the progress bar\n\t\t\tNProgress.configure({\n\t\t\t\tparent: $(\".modal-footer\", this.$el).getPath(),\n\t\t\t\tshowSpinner: false,\n\t\t\t\ttrickle: true,\n\t\t\t\tminimum: 0.0\n\t\t\t}).start(0.0);\n\n\t\t\t// Save the model, uploading the assessment file\n\t\t\tthis.xhr = this.model.binarySave(null, {\n\t\t\t\tvalidate: false,\n\t\t\t\twait: true,\n\t\t\t\tsuccess: this.onImportSuccess.bind(this),\n\t\t\t\terror: this.onImportError.bind(this)\n\t\t\t});\n\t\t}\n\t},\n\n\tonImportSuccess: function onImportSuccess(result) {\n\t\tthis.xhr = null;\n\n\t\tthis.Result = new Resource(result.toJSON());\n\t\tthis.Result.setAsset();\n\n\t\tNProgress.set(1.0);\n\t\tthis.setUIReady();\n\n\t\tthis.ui.importButton.addClass(\"hide\");\n\t\tthis.ui.cancelButton.addClass(\"hide\");\n\t\tthis.ui.closeButton.removeClass(\"hide\");\n\n\t\tthis.ui.assessmentTitle.text(this.Result.get(\"title\"));\n\t\tthis.ui.assessmentLanguage.text(this.Result.get(\"language\"));\n\t\tthis.ui.assessmentGrade.text(gradeMap.codeToHumanValue(this.Result.get(\"grade\") || this.Result.get(\"studyYear\")));\n\t\tthis.ui.assessmentSubject.text(this.Result.get(\"subject_name\"));\n\n\t\tthis.ui.importForm.addClass(\"hide\");\n\t\tthis.ui.importResult.removeClass(\"hide\");\n\t},\n\n\tonImportError: function onImportError(model, response) {\n\t\tthis.xhr = null;\n\n\t\tNProgress.set(1.0);\n\t\tthis.setUIReady();\n\n\t\tvar answer = {};\n\n\t\ttry {\n\t\t\tanswer = JSON.parse(response.responseText);\n\t\t} catch (error) {\n\t\t\tanswer.detail = (response.status === 0 ? \"Connection error\" : response.statusText) + \" (code \" + response.status + \")\";\n\t\t}\n\n\t\tthis.ui.message.text(\"Error importing assessment: \" + answer.detail || answer.info).removeClass(\"hide\");\n\t},\n\n\tonCancel: function onCancel() {\n\t\tif (this.xhr) this.xhr.abort();\n\n\t\tthis.destroy();\n\t\tthis.trigger(\"action\", \"cancel\");\n\t},\n\n\tonClose: function onClose() {\n\t\tthis.destroy();\n\t\tthis.trigger(\"action\", \"close\", { model: this.Result });\n\t},\n\n\tsetUIBusy: function setUIBusy() {\n\t\tthis.ui.importButton.addClass(\"disabled\");\n\t\tthis.ui.workingSpinner.removeClass(\"hide\");\n\n\t\tthis.ui.message.addClass(\"hide\");\n\t},\n\n\tsetUIReady: function setUIReady() {\n\t\tthis.ui.importButton.removeClass(\"disabled\");\n\t\tthis.ui.workingSpinner.addClass(\"hide\");\n\t},\n\n\tonUploadProgress: function onUploadProgress(percentage) {\n\t\tNProgress.set(percentage / 100);\n\t},\n\n\tvalidationFail: function validationFail() {\n\t\tvar _this = this;\n\n\t\tthis.clearError();\n\t\tthis.setUIReady();\n\n\t\t_.each(this.model.validationError, function (message, key) {\n\t\t\t_this.displayError(message, _this.ui[key]);\n\t\t});\n\t},\n\n\tdisplayError: function displayError(message, element) {\n\t\telement.parent().append(\"<span class='error'>\" + message + \"</span>\");\n\t\telement.one(\"change keyup\", this.clearError.bind(this));\n\t},\n\n\tclearError: function clearError(event) {\n\t\tif (event) $(event.currentTarget).parent().find(\".error\").remove();else $(\".error\", this.el).remove();\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2Vzc21lbnRJbXBvcnRNb2RhbC5qcyJdLCJuYW1lcyI6WyIkIiwicmVxdWlyZSIsIl8iLCJCYWNrYm9uZSIsIk5Qcm9ncmVzcyIsImdyYWRlTWFwIiwiUmVzb3VyY2UiLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJleHRlbmQiLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsImNvbnRlbnQiLCJ1aSIsImZvcm0iLCJpbXBvcnRCdXR0b24iLCJjYW5jZWxCdXR0b24iLCJjbG9zZUJ1dHRvbiIsIm1lc3NhZ2UiLCJ3b3JraW5nU3Bpbm5lciIsImltcG9ydEZvcm0iLCJpbXBvcnRSZXN1bHQiLCJyZXN1bHRNZXNzYWdlIiwiYXNzZXNzbWVudFRpdGxlIiwiYXNzZXNzbWVudExhbmd1YWdlIiwiYXNzZXNzbWVudEdyYWRlIiwiYXNzZXNzbWVudFN1YmplY3QiLCJhc3Nlc3NtZW50RmlsZSIsImV2ZW50cyIsImNsaWNrIiwibW9kZWxFdmVudHMiLCJpbnZhbGlkIiwiaW5pdGlhbGl6ZSIsIm9wdGlvbnMiLCJob3N0Iiwic2hvdyIsImFwcGVuZCIsInJlbmRlciIsImVsIiwib25SZW5kZXIiLCJyZW1vdmVDbGFzcyIsImFkZENsYXNzIiwib25Bc3Nlc3NtZW50RmlsZUNoYW5nZWQiLCJvbkRlc3Ryb3kiLCJnZXRBc3Nlc3NtZW50RmlsZSIsImdldCIsImZpbGVzIiwibGVuZ3RoIiwib25DbGljayIsImV2ZW50Iiwic3RvcFByb3BhZ2F0aW9uIiwicHJvcCIsIm9uSW1wb3J0IiwibW9kZWwiLCJzZXRGaWxlIiwiaXNWYWxpZCIsInNldFVJQnVzeSIsImNvbmZpZ3VyZSIsInBhcmVudCIsIiRlbCIsImdldFBhdGgiLCJzaG93U3Bpbm5lciIsInRyaWNrbGUiLCJtaW5pbXVtIiwic3RhcnQiLCJ4aHIiLCJiaW5hcnlTYXZlIiwidmFsaWRhdGUiLCJ3YWl0Iiwic3VjY2VzcyIsIm9uSW1wb3J0U3VjY2VzcyIsImJpbmQiLCJlcnJvciIsIm9uSW1wb3J0RXJyb3IiLCJyZXN1bHQiLCJSZXN1bHQiLCJ0b0pTT04iLCJzZXRBc3NldCIsInNldCIsInNldFVJUmVhZHkiLCJ0ZXh0IiwiY29kZVRvSHVtYW5WYWx1ZSIsInJlc3BvbnNlIiwiYW5zd2VyIiwiSlNPTiIsInBhcnNlIiwicmVzcG9uc2VUZXh0IiwiZGV0YWlsIiwic3RhdHVzIiwic3RhdHVzVGV4dCIsImluZm8iLCJvbkNhbmNlbCIsImFib3J0IiwiZGVzdHJveSIsInRyaWdnZXIiLCJvbkNsb3NlIiwib25VcGxvYWRQcm9ncmVzcyIsInBlcmNlbnRhZ2UiLCJ2YWxpZGF0aW9uRmFpbCIsImNsZWFyRXJyb3IiLCJlYWNoIiwidmFsaWRhdGlvbkVycm9yIiwia2V5IiwiZGlzcGxheUVycm9yIiwiZWxlbWVudCIsIm9uZSIsImN1cnJlbnRUYXJnZXQiLCJmaW5kIiwicmVtb3ZlIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLElBQUlELFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUUsV0FBV0YsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUcsWUFBWUgsUUFBUSxXQUFSLENBQWxCOztBQUVBLElBQU1JLFdBQVdKLFFBQVEsWUFBUixDQUFqQjtBQUNBLElBQU1LLFdBQVdMLFFBQVEseUNBQVIsQ0FBakI7O0FBRUFNLE9BQU9DLE9BQVAsR0FBaUJMLFNBQVNNLFVBQVQsQ0FBb0JDLElBQXBCLENBQXlCQyxNQUF6QixDQUFnQztBQUNoREMsWUFBVyx5QkFEcUM7O0FBR2hEQyxXQUFVWixRQUFRLHdDQUFSLEVBQWtEYSxPQUhaOztBQUtoREMsS0FBSTtBQUNIQyxRQUFNLFVBREg7QUFFSEMsZ0JBQWMsZUFGWDtBQUdIQyxnQkFBYyxlQUhYO0FBSUhDLGVBQWEsY0FKVjtBQUtIQyxXQUFTLGNBTE47QUFNSEMsa0JBQWdCLHNCQU5iOztBQVFIQyxjQUFZLGNBUlQ7QUFTSEMsZ0JBQWMsZ0JBVFg7QUFVSEMsaUJBQWUsd0JBVlo7QUFX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O0FBQ0EsRUExTCtDOztBQTRMaEQ0QixhQUFZLG9CQUFTbEQsS0FBVCxFQUFnQjtBQUMzQixNQUFJQSxLQUFKLEVBQ0NuRCxFQUFFbUQsTUFBTXlELGFBQVIsRUFBdUJoRCxNQUF2QixHQUFnQ2lELElBQWhDLENBQXFDLFFBQXJDLEVBQStDQyxNQUEvQyxHQURELEtBR0M5RyxFQUFFLFFBQUYsRUFBWSxLQUFLd0MsRUFBakIsRUFBcUJzRSxNQUFyQjtBQUNEO0FBak0rQyxDQUFoQyxDQUFqQiIsImZpbGUiOiJhc3Nlc3NtZW50SW1wb3J0TW9kYWwuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IE5Qcm9ncmVzcyA9IHJlcXVpcmUoXCJucHJvZ3Jlc3NcIik7XG5cbmNvbnN0IGdyYWRlTWFwID0gcmVxdWlyZShcIi4vZ3JhZGVNYXBcIik7XG5jb25zdCBSZXNvdXJjZSA9IHJlcXVpcmUoXCIuLi9jb250ZW50L21vZGVscy9tYW5hZ2VyL3Jlc291cmNlTW9kZWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJhc3Nlc3NtZW50LWltcG9ydC1tb2RhbFwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi90ZW1wbGF0ZXMvYXNzZXNzbWVudEltcG9ydE1vZGFsLm51bmpcIikuY29udGVudCxcblxuXHR1aToge1xuXHRcdGZvcm06IFwiZGl2LmZvcm1cIixcblx0XHRpbXBvcnRCdXR0b246IFwiYnV0dG9uLmltcG9ydFwiLFxuXHRcdGNhbmNlbEJ1dHRvbjogXCJidXR0b24uY2FuY2VsXCIsXG5cdFx0Y2xvc2VCdXR0b246IFwiYnV0dG9uLmNsb3NlXCIsXG5cdFx0bWVzc2FnZTogXCJzcGFuLm1lc3NhZ2VcIixcblx0XHR3b3JraW5nU3Bpbm5lcjogXCJzcGFuLnNwaW5uZXItd29ya2luZ1wiLFxuXG5cdFx0aW1wb3J0Rm9ybTogXCIuaW1wb3J0LWZvcm1cIixcblx0XHRpbXBvcnRSZXN1bHQ6IFwiLmltcG9ydC1yZXN1bHRcIixcblx0XHRyZXN1bHRNZXNzYWdlOiBcIi5pbXBvcnQtcmVzdWx0LW1lc3NhZ2VcIixcblx0XHRhc3Nlc3NtZW50VGl0bGU6IFwiLmFzc2Vzc21lbnQtbWV0YWRhdGEtdGl0bGVcIixcblx0XHRhc3Nlc3NtZW50TGFuZ3VhZ2U6IFwiLmFzc2Vzc21lbnQtbWV0YWRhdGEtbGFuZ3VhZ2VcIixcblx0XHRhc3Nlc3NtZW50R3JhZGU6IFwiLmFzc2Vzc21lbnQtbWV0YWRhdGEtZ3JhZGVcIixcblx0XHRhc3Nlc3NtZW50U3ViamVjdDogXCIuYXNzZXNzbWVudC1tZXRhZGF0YS1zdWJqZWN0XCIsXG5cdFx0YXNzZXNzbWVudEZpbGU6IFwiaW5wdXQjYXNzZXNzbWVudC1maWxlXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0Y2xpY2s6IFwib25DbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmltcG9ydEJ1dHRvblwiOiBcIm9uSW1wb3J0XCIsXG5cdFx0XCJjbGljayBAdWkuY2FuY2VsQnV0dG9uXCI6IFwib25DYW5jZWxcIixcblx0XHRcImNsaWNrIEB1aS5jbG9zZUJ1dHRvblwiOiBcIm9uQ2xvc2VcIixcblxuXHRcdFwiY2hhbmdlIEB1aS5hc3Nlc3NtZW50RmlsZVwiOiBcIm9uQXNzZXNzbWVudEZpbGVDaGFuZ2VkXCIsXG5cdH0sXG5cblx0bW9kZWxFdmVudHM6IHtcblx0XHRcInVwbG9hZDpwcm9ncmVzc1wiOiBcIm9uVXBsb2FkUHJvZ3Jlc3NcIixcblx0XHRpbnZhbGlkOiBcInZhbGlkYXRpb25GYWlsXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuaG9zdCA9IG9wdGlvbnMuaG9zdCB8fCBcIiNtb2RhbHNcIjtcblx0fSxcblxuXHRzaG93OiBmdW5jdGlvbigpIHtcblx0XHQkKFwiLm1vZGFsLWNvbnRhaW5lclwiLCAkKHRoaXMuaG9zdCkpLmFwcGVuZCh0aGlzLnJlbmRlcigpLmVsKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gUmVuZGVyIGEgYmFja2dyb3VuZFxuXHRcdCQoXCIubW9kYWwtZWxlbWVudFwiLCAkKHRoaXMuaG9zdCkpLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHQkKFwiYm9keVwiKS5hZGRDbGFzcyhcImhpZGUtb3ZlcmZsb3dcIik7XG5cblx0XHQvLyBJbml0aWFsaXplIHRoZSBVSVxuXHRcdHRoaXMub25Bc3Nlc3NtZW50RmlsZUNoYW5nZWQoKTtcblx0fSxcblxuXHRvbkRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIENsZWFuIHVwIHRoZSBiYWNrZ3JvdW5kXG5cdFx0JChcIi5tb2RhbC1lbGVtZW50XCIsICQodGhpcy5ob3N0KSkuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdCQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKFwiaGlkZS1vdmVyZmxvd1wiKTtcblx0fSxcblxuXHRnZXRBc3Nlc3NtZW50RmlsZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMudWkuYXNzZXNzbWVudEZpbGUuZ2V0KDApLmZpbGVzLmxlbmd0aCA9PT0gMCA/IG51bGwgOiB0aGlzLnVpLmFzc2Vzc21lbnRGaWxlLmdldCgwKS5maWxlc1swXTtcblx0fSxcblxuXHRvbkNsaWNrOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9LFxuXG5cdG9uQXNzZXNzbWVudEZpbGVDaGFuZ2VkOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5nZXRBc3Nlc3NtZW50RmlsZSgpKSB7XG5cdFx0XHR0aGlzLnVpLmltcG9ydEJ1dHRvbi5wcm9wKFwiZGlzYWJsZWRcIiwgZmFsc2UpO1xuXHRcdFx0dGhpcy51aS5pbXBvcnRCdXR0b24ucmVtb3ZlQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLnVpLmltcG9ydEJ1dHRvbi5wcm9wKFwiZGlzYWJsZWRcIiwgdHJ1ZSk7XG5cdFx0XHR0aGlzLnVpLmltcG9ydEJ1dHRvbi5hZGRDbGFzcyhcImRpc2FibGVkXCIpO1xuXHRcdH1cblx0fSxcblxuXHRvbkltcG9ydDogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gU2V0IHRoZSBhc3Nlc3NtZW50IGZpbGVcblx0XHR0aGlzLm1vZGVsLnNldEZpbGUoXCJmaWxlXCIsIHRoaXMuZ2V0QXNzZXNzbWVudEZpbGUoKSk7XG5cblx0XHRpZiAodGhpcy5tb2RlbC5pc1ZhbGlkKCkpIHtcblx0XHRcdC8vIERpc2FibGUgdGhlIG1vZGFsIGJ1dHRvbnNcblx0XHRcdHRoaXMuc2V0VUlCdXN5KCk7XG5cblx0XHRcdC8vIENvbmZpZ3VyZSBhbmQgc3RhcnQgdGhlIHByb2dyZXNzIGJhclxuXHRcdFx0TlByb2dyZXNzLmNvbmZpZ3VyZSh7XG5cdFx0XHRcdHBhcmVudDogJChcIi5tb2RhbC1mb290ZXJcIiwgdGhpcy4kZWwpLmdldFBhdGgoKSxcblx0XHRcdFx0c2hvd1NwaW5uZXI6IGZhbHNlLFxuXHRcdFx0XHR0cmlja2xlOiB0cnVlLFxuXHRcdFx0XHRtaW5pbXVtOiAwLjAsXG5cdFx0XHR9KS5zdGFydCgwLjApO1xuXG5cdFx0XHQvLyBTYXZlIHRoZSBtb2RlbCwgdXBsb2FkaW5nIHRoZSBhc3Nlc3NtZW50IGZpbGVcblx0XHRcdHRoaXMueGhyID0gdGhpcy5tb2RlbC5iaW5hcnlTYXZlKG51bGwsIHtcblx0XHRcdFx0dmFsaWRhdGU6IGZhbHNlLFxuXHRcdFx0XHR3YWl0OiB0cnVlLFxuXHRcdFx0XHRzdWNjZXNzOiB0aGlzLm9uSW1wb3J0U3VjY2Vzcy5iaW5kKHRoaXMpLFxuXHRcdFx0XHRlcnJvcjogdGhpcy5vbkltcG9ydEVycm9yLmJpbmQodGhpcyksXG5cdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0b25JbXBvcnRTdWNjZXNzOiBmdW5jdGlvbihyZXN1bHQpIHtcblx0XHR0aGlzLnhociA9IG51bGw7XG5cblx0XHR0aGlzLlJlc3VsdCA9IG5ldyBSZXNvdXJjZShyZXN1bHQudG9KU09OKCkpO1xuXHRcdHRoaXMuUmVzdWx0LnNldEFzc2V0KCk7XG5cblx0XHROUHJvZ3Jlc3Muc2V0KDEuMCk7XG5cdFx0dGhpcy5zZXRVSVJlYWR5KCk7XG5cblx0XHR0aGlzLnVpLmltcG9ydEJ1dHRvbi5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5jYW5jZWxCdXR0b24uYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkuY2xvc2VCdXR0b24ucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0dGhpcy51aS5hc3Nlc3NtZW50VGl0bGUudGV4dCh0aGlzLlJlc3VsdC5nZXQoXCJ0aXRsZVwiKSk7XG5cdFx0dGhpcy51aS5hc3Nlc3NtZW50TGFuZ3VhZ2UudGV4dCh0aGlzLlJlc3VsdC5nZXQoXCJsYW5ndWFnZVwiKSk7XG5cdFx0dGhpcy51aS5hc3Nlc3NtZW50R3JhZGUudGV4dChncmFkZU1hcC5jb2RlVG9IdW1hblZhbHVlKHRoaXMuUmVzdWx0LmdldChcImdyYWRlXCIpIHx8IHRoaXMuUmVzdWx0LmdldChcInN0dWR5WWVhclwiKSkpO1xuXHRcdHRoaXMudWkuYXNzZXNzbWVudFN1YmplY3QudGV4dCh0aGlzLlJlc3VsdC5nZXQoXCJzdWJqZWN0X25hbWVcIikpO1xuXG5cdFx0dGhpcy51aS5pbXBvcnRGb3JtLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLmltcG9ydFJlc3VsdC5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0b25JbXBvcnRFcnJvcjogZnVuY3Rpb24obW9kZWwsIHJlc3BvbnNlKSB7XG5cdFx0dGhpcy54aHIgPSBudWxsO1xuXG5cdFx0TlByb2dyZXNzLnNldCgxLjApO1xuXHRcdHRoaXMuc2V0VUlSZWFkeSgpO1xuXG5cdFx0bGV0IGFuc3dlciA9IHt9O1xuXG5cdFx0dHJ5IHtcblx0XHRcdGFuc3dlciA9IEpTT04ucGFyc2UocmVzcG9uc2UucmVzcG9uc2VUZXh0KTtcblx0XHR9XG5cdFx0Y2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRhbnN3ZXIuZGV0YWlsID0gKHJlc3BvbnNlLnN0YXR1cyA9PT0gMCA/IFwiQ29ubmVjdGlvbiBlcnJvclwiIDogcmVzcG9uc2Uuc3RhdHVzVGV4dCkgKyBcIiAoY29kZSBcIiArIHJlc3BvbnNlLnN0YXR1cyArIFwiKVwiO1xuXHRcdH1cblxuXHRcdHRoaXMudWkubWVzc2FnZS50ZXh0KFwiRXJyb3IgaW1wb3J0aW5nIGFzc2Vzc21lbnQ6IFwiICsgYW5zd2VyLmRldGFpbCB8fCBhbnN3ZXIuaW5mbykucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdG9uQ2FuY2VsOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy54aHIpXG5cdFx0XHR0aGlzLnhoci5hYm9ydCgpO1xuXG5cdFx0dGhpcy5kZXN0cm95KCk7XG5cdFx0dGhpcy50cmlnZ2VyKFwiYWN0aW9uXCIsIFwiY2FuY2VsXCIpO1xuXHR9LFxuXG5cdG9uQ2xvc2U6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZGVzdHJveSgpO1xuXHRcdHRoaXMudHJpZ2dlcihcImFjdGlvblwiLCBcImNsb3NlXCIsIHsgbW9kZWw6IHRoaXMuUmVzdWx0IH0pO1xuXHR9LFxuXG5cdHNldFVJQnVzeTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5pbXBvcnRCdXR0b24uYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblx0XHR0aGlzLnVpLndvcmtpbmdTcGlubmVyLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblxuXHRcdHRoaXMudWkubWVzc2FnZS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0c2V0VUlSZWFkeTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5pbXBvcnRCdXR0b24ucmVtb3ZlQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblx0XHR0aGlzLnVpLndvcmtpbmdTcGlubmVyLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRvblVwbG9hZFByb2dyZXNzOiBmdW5jdGlvbihwZXJjZW50YWdlKSB7XG5cdFx0TlByb2dyZXNzLnNldChwZXJjZW50YWdlIC8gMTAwKTtcblx0fSxcblxuXHR2YWxpZGF0aW9uRmFpbDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jbGVhckVycm9yKCk7XG5cdFx0dGhpcy5zZXRVSVJlYWR5KCk7XG5cblx0XHRfLmVhY2godGhpcy5tb2RlbC52YWxpZGF0aW9uRXJyb3IsIChtZXNzYWdlLCBrZXkpID0+IHtcblx0XHRcdHRoaXMuZGlzcGxheUVycm9yKG1lc3NhZ2UsIHRoaXMudWlba2V5XSk7XG5cdFx0fSk7XG5cdH0sXG5cblx0ZGlzcGxheUVycm9yOiBmdW5jdGlvbihtZXNzYWdlLCBlbGVtZW50KSB7XG5cdFx0ZWxlbWVudC5wYXJlbnQoKS5hcHBlbmQoXCI8c3BhbiBjbGFzcz0nZXJyb3InPlwiICsgbWVzc2FnZSArIFwiPC9zcGFuPlwiKTtcblx0XHRlbGVtZW50Lm9uZShcImNoYW5nZSBrZXl1cFwiLCB0aGlzLmNsZWFyRXJyb3IuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0Y2xlYXJFcnJvcjogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRpZiAoZXZlbnQpXG5cdFx0XHQkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLnBhcmVudCgpLmZpbmQoXCIuZXJyb3JcIikucmVtb3ZlKCk7XG5cdFx0ZWxzZVxuXHRcdFx0JChcIi5lcnJvclwiLCB0aGlzLmVsKS5yZW1vdmUoKTtcblx0fSxcbn0pO1xuIl19",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\n\nmodule.exports = Backbone.Model.extend({\n\tdefaults: {},\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/assessments/import\";\n\t},\n\n\tvalidate: function validate() {\n\t\tvar errors = {};\n\n\t\t_.extend(errors, this.validateFile(\"file\", \"gz\", 30, \"assessmentFile\"));\n\n\t\tif (Object.keys(errors).length > 0) return errors;\n\t},\n\n\tvalidateFile: function validateFile(fileKey, validExtensions, maxSize, errorKey) {\n\t\tvar errors = {};\n\n\t\tvar file = this.getFile(fileKey);\n\n\t\tif (this.isNew() && !file) errors[errorKey] = \"You must provide a file for this resource.\";\n\n\t\tif (file && validExtensions) {\n\t\t\tvar valid = _.flatten([validExtensions]);\n\t\t\tvar supplied = file.name.toLowerCase().split(\".\");\n\t\t\tsupplied = supplied[supplied.length - 1];\n\n\t\t\tif (!_.some(valid, function (x) {\n\t\t\t\treturn x === supplied;\n\t\t\t})) errors[errorKey] = \"The selected file must have one of these extensions: \" + valid.join(\", \");\n\t\t}\n\n\t\tif (file && (file.size > 1024 * 1024 * maxSize || file.size > settings.maxUpload)) errors[errorKey] = \"The file you have selected is larger than the maximum allowed file size (\" + maxSize + \"MB max.).\";\n\n\t\treturn errors;\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2Vzc21lbnRJbXBvcnRNb2RlbC5qcyJdLCJuYW1lcyI6WyJfIiwicmVxdWlyZSIsIkJhY2tib25lIiwic2V0dGluZ3MiLCJtb2R1bGUiLCJleHBvcnRzIiwiTW9kZWwiLCJleHRlbmQiLCJkZWZhdWx0cyIsInVybCIsInVybFJvb3QiLCJ2YWxpZGF0ZSIsImVycm9ycyIsInZhbGlkYXRlRmlsZSIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJmaWxlS2V5IiwidmFsaWRFeHRlbnNpb25zIiwibWF4U2l6ZSIsImVycm9yS2V5IiwiZmlsZSIsImdldEZpbGUiLCJpc05ldyIsInZhbGlkIiwiZmxhdHRlbiIsInN1cHBsaWVkIiwibmFtZSIsInRvTG93ZXJDYXNlIiwic3BsaXQiLCJzb21lIiwieCIsImpvaW4iLCJzaXplIiwibWF4VXBsb2FkIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLFdBQVdELFFBQVEsVUFBUixDQUFqQjs7QUFFQSxJQUFNRSxXQUFXRixRQUFRLGNBQVIsQ0FBakI7O0FBRUFHLE9BQU9DLE9BQVAsR0FBaUJILFNBQVNJLEtBQVQsQ0FBZUMsTUFBZixDQUFzQjtBQUN0Q0MsV0FBVSxFQUQ0QjtBQUV0Q0MsTUFBSyxlQUFXO0FBQ2YsU0FBT04sU0FBU08sT0FBVCxHQUFtQiw2QkFBMUI7QUFDQSxFQUpxQzs7QUFNdENDLFdBQVUsb0JBQVc7QUFDcEIsTUFBTUMsU0FBUyxFQUFmOztBQUVBWixJQUFFTyxNQUFGLENBQVNLLE1BQVQsRUFBaUIsS0FBS0MsWUFBTCxDQUFrQixNQUFsQixFQUEwQixJQUExQixFQUFnQyxFQUFoQyxFQUFvQyxnQkFBcEMsQ0FBakI7O0FBRUEsTUFBSUMsT0FBT0MsSUFBUCxDQUFZSCxNQUFaLEVBQW9CSSxNQUFwQixHQUE2QixDQUFqQyxFQUNDLE9BQU9KLE1BQVA7QUFDRCxFQWJxQzs7QUFldENDLGVBQWMsc0JBQVNJLE9BQVQsRUFBa0JDLGVBQWxCLEVBQW1DQyxPQUFuQyxFQUE0Q0MsUUFBNUMsRUFBc0Q7QUFDbkUsTUFBTVIsU0FBUyxFQUFmOztBQUVBLE1BQU1TLE9BQU8sS0FBS0MsT0FBTCxDQUFhTCxPQUFiLENBQWI7O0FBRUEsTUFBSSxLQUFLTSxLQUFMLE1BQWdCLENBQUNGLElBQXJCLEVBQ0NULE9BQU9RLFFBQVAsSUFBbUIsNENBQW5COztBQUVELE1BQUlDLFFBQVFILGVBQVosRUFBNkI7QUFDNUIsT0FBTU0sUUFBUXhCLEVBQUV5QixPQUFGLENBQVUsQ0FBQ1AsZUFBRCxDQUFWLENBQWQ7QUFDQSxPQUFJUSxXQUFXTCxLQUFLTSxJQUFMLENBQVVDLFdBQVYsR0FBd0JDLEtBQXhCLENBQThCLEdBQTlCLENBQWY7QUFDQUgsY0FBV0EsU0FBU0EsU0FBU1YsTUFBVCxHQUFrQixDQUEzQixDQUFYOztBQUVBLE9BQUksQ0FBQ2hCLEVBQUU4QixJQUFGLENBQU9OLEtBQVAsRUFBYztBQUFBLFdBQUtPLE1BQU1MLFFBQVg7QUFBQSxJQUFkLENBQUwsRUFDQ2QsT0FBT1EsUUFBUCxJQUFtQiwwREFBMERJLE1BQU1RLElBQU4sQ0FBVyxJQUFYLENBQTdFO0FBQ0Q7O0FBRUQsTUFBSVgsU0FBU0EsS0FBS1ksSUFBTCxHQUFZLE9BQU8sSUFBUCxHQUFjZCxPQUExQixJQUFxQ0UsS0FBS1ksSUFBTCxHQUFZOUIsU0FBUytCLFNBQW5FLENBQUosRUFDQ3RCLE9BQU9RLFFBQVAsSUFBbUIsOEVBQThFRCxPQUE5RSxHQUF3RixXQUEzRzs7QUFFRCxTQUFPUCxNQUFQO0FBQ0E7QUFwQ3FDLENBQXRCLENBQWpCIiwiZmlsZSI6ImFzc2Vzc21lbnRJbXBvcnRNb2RlbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcblxuY29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7fSxcblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvYXNzZXNzbWVudHMvaW1wb3J0XCI7XG5cdH0sXG5cblx0dmFsaWRhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGVycm9ycyA9IHt9O1xuXG5cdFx0Xy5leHRlbmQoZXJyb3JzLCB0aGlzLnZhbGlkYXRlRmlsZShcImZpbGVcIiwgXCJnelwiLCAzMCwgXCJhc3Nlc3NtZW50RmlsZVwiKSk7XG5cblx0XHRpZiAoT2JqZWN0LmtleXMoZXJyb3JzKS5sZW5ndGggPiAwKVxuXHRcdFx0cmV0dXJuIGVycm9ycztcblx0fSxcblxuXHR2YWxpZGF0ZUZpbGU6IGZ1bmN0aW9uKGZpbGVLZXksIHZhbGlkRXh0ZW5zaW9ucywgbWF4U2l6ZSwgZXJyb3JLZXkpIHtcblx0XHRjb25zdCBlcnJvcnMgPSB7fTtcblxuXHRcdGNvbnN0IGZpbGUgPSB0aGlzLmdldEZpbGUoZmlsZUtleSk7XG5cblx0XHRpZiAodGhpcy5pc05ldygpICYmICFmaWxlKVxuXHRcdFx0ZXJyb3JzW2Vycm9yS2V5XSA9IFwiWW91IG11c3QgcHJvdmlkZSBhIGZpbGUgZm9yIHRoaXMgcmVzb3VyY2UuXCI7XG5cblx0XHRpZiAoZmlsZSAmJiB2YWxpZEV4dGVuc2lvbnMpIHtcblx0XHRcdGNvbnN0IHZhbGlkID0gXy5mbGF0dGVuKFt2YWxpZEV4dGVuc2lvbnNdKTtcblx0XHRcdGxldCBzdXBwbGllZCA9IGZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLnNwbGl0KFwiLlwiKTtcblx0XHRcdHN1cHBsaWVkID0gc3VwcGxpZWRbc3VwcGxpZWQubGVuZ3RoIC0gMV07XG5cblx0XHRcdGlmICghXy5zb21lKHZhbGlkLCB4ID0+IHggPT09IHN1cHBsaWVkKSlcblx0XHRcdFx0ZXJyb3JzW2Vycm9yS2V5XSA9IFwiVGhlIHNlbGVjdGVkIGZpbGUgbXVzdCBoYXZlIG9uZSBvZiB0aGVzZSBleHRlbnNpb25zOiBcIiArIHZhbGlkLmpvaW4oXCIsIFwiKTtcblx0XHR9XG5cblx0XHRpZiAoZmlsZSAmJiAoZmlsZS5zaXplID4gMTAyNCAqIDEwMjQgKiBtYXhTaXplIHx8IGZpbGUuc2l6ZSA+IHNldHRpbmdzLm1heFVwbG9hZCkpXG5cdFx0XHRlcnJvcnNbZXJyb3JLZXldID0gXCJUaGUgZmlsZSB5b3UgaGF2ZSBzZWxlY3RlZCBpcyBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSBhbGxvd2VkIGZpbGUgc2l6ZSAoXCIgKyBtYXhTaXplICsgXCJNQiBtYXguKS5cIjtcblxuXHRcdHJldHVybiBlcnJvcnM7XG5cdH0sXG59KTtcbiJdfQ==",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\nrequire(\"rangeslider\");\nvar raygun = require(\"raygun\");\n\nvar App = require(\"../index\");\nvar rester = require(\"rester\");\nvar settings = require(\"app-settings\");\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar Assessment = require(\"./assessmentModel\");\nvar BigModal = require(\"./bigModal\");\nvar Iago = require(\"./iago\");\nvar ImageChooser = require(\"./imageChooser\");\nvar SimpleMenu = require(\"./simpleMenu\");\nvar Selectra = require(\"./selectra\");\nvar Slideout = require(\"slideout\");\nvar Errors = require(\"./errors\");\nvar Questions = {},\n    Models = {};\n\nvar Page = new Backbone.Marionette.Object();\n\nvar QuestionTypes = Backbone.Marionette.View.extend({\n\tclassName: \"assessment-question-types\",\n\n\ttemplate: require(\"./templates/assessmentModal.nunj\").questionTypes,\n\n\tui: {\n\t\tblock: \"[data-type]\",\n\n\t\tundo: \".right\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.block\": \"setType\",\n\n\t\t\"click @ui.undo\": \"undo\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this = this;\n\n\t\treturn {\n\t\t\tisNew: function isNew() {\n\t\t\t\treturn _this.model.isNew();\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.total = options.size + 1;\n\t},\n\n\tserializeData: function serializeData() {\n\t\treturn { total: this.total };\n\t},\n\n\tonRender: function onRender() {\n\t\tif (this.total === 1) this.ui.undo.hide();\n\t},\n\n\tsetType: function setType(evt) {\n\t\tvar el = $(evt.currentTarget);\n\t\tthis.trigger(\"type\", el.data(\"type\"));\n\t},\n\n\tundo: function undo() {\n\t\tthis.trigger(\"type\", \"\");\n\t}\n});\n\nvar AssessmentModal = module.exports = BigModal.extend({\n\tui: {\n\t\tbus: \"#iago-assessment\",\n\t\tassessmentBasis: \".assessment-basis\",\n\t\tassessmentPanel: \".assessment-panel\",\n\t\tassessmentArea: \".assessment-area\",\n\t\terrorContainer: \".errors\",\n\t\tcontrolPanel: \".control-panel\",\n\t\tmetadataPanel: \".metadata-panel\",\n\t\ttoggle: \".menuToggle\",\n\t\toptions: \".optionToggle\",\n\t\tpreview: \".preview\",\n\t\ttotalMark: \".total-mark\",\n\t\tquestionNumber: \".question-number\",\n\t\tquestionMark: \".question-mark\",\n\t\tactions: \".actionHost\",\n\t\tsliderHost: \".sliderHost\",\n\t\tsliderNum: \".sliderHost input[type='number']\",\n\t\tsliderCount: \".sliderHost .total\",\n\t\tslider: \"input[type='range']\",\n\t\tdeleteQuestion: \".actionHost .delete\",\n\t\tinfoHost: \".infoHost\",\n\n\t\tmustCloneMessage: \".must-clone-message\",\n\t\tisCloneMessage: \".is-clone-message\",\n\t\tcreateMessage: \".create-message\",\n\t\ttitleLabel: \".title-label\",\n\t\ttitle: \"input[name='title']\",\n\t\tdescription: \"textarea[name='desc']\",\n\t\tsubjectLabel: \".subject-label\",\n\t\tsubject: \"input[name='subject']\",\n\t\tstudyYearLabel: \".studyYear-label\",\n\t\tstudyYear: \"select[name='studyYear']\",\n\t\tlanguage: \"select[name='language']\",\n\t\tfeedback: \"#feedback\",\n\t\tbuttonAddEditQuestions: \"input[type='button'].add-edit-questions\",\n\t\tnextButton: \"#iago-next-question\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.toggle\": \"toggleMenu\",\n\t\t\"click @ui.options\": \"toggleOptions\",\n\t\t\"click @ui.deleteQuestion\": \"deleteQuestion\",\n\t\t\"click @ui.preview\": \"preview\",\n\n\t\t\"change @ui.language\": \"languageChanged\",\n\t\t\"change @ui.feedback\": \"feedbackChanged\",\n\t\t\"click @ui.buttonAddEditQuestions\": \"onButtonAddEditQuestionsClick\",\n\n\t\t\"change @ui.sliderNum\": \"changeQuestionNum\",\n\t\t\"change @ui.slider\": \"changeQuestionSlide\"\n\t},\n\n\tactions: {\n\t\tcreate: \"onAssessmentCreated\",\n\t\tcreateAnother: \"onCreateAnother\",\n\t\tupdate: \"onAssessmentUpdated\"\n\t},\n\n\tregions: {\n\t\terrorContainer: \".errors\"\n\t},\n\n\terrorMap: {\n\t\tlanguage: {\n\t\t\tposition: \"right\"\n\t\t},\n\t\tstudyYear: {\n\t\t\tattractionElement: \"studyYearLabel\",\n\t\t\tposition: \"right\"\n\t\t},\n\t\tsubject: {\n\t\t\tattractionElement: \"subjectLabel\",\n\t\t\tposition: \"right\"\n\t\t},\n\t\ttitle: {\n\t\t\tattractionElement: \"titleLabel\",\n\t\t\tposition: \"right\"\n\t\t}\n\t},\n\n\tinitialize: function initialize() {\n\t\tvar options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n\t\t_.bindAll(this);\n\n\t\tif (options.previewMode) {\n\t\t\tthis.Options = {\n\t\t\t\tclasses: [\"assessment-modal\"],\n\t\t\t\ttemplate: require(\"./templates/assessmentModal.nunj\").content,\n\t\t\t\tbuttons: {\n\t\t\t\t\tcancel: {\n\t\t\t\t\t\ttype: \"cancel\",\n\t\t\t\t\t\tlabel: \"Close Preview\"\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tdataNoun: \"assessment\" + (this.model.isNew() ? \"\" : \": \" + this.model.get(\"title\"))\n\t\t\t};\n\t\t} else {\n\t\t\tthis.Options = {\n\t\t\t\tclasses: [\"assessment-modal\"],\n\t\t\t\ttemplate: require(\"./templates/assessmentModal.nunj\").content,\n\t\t\t\tbuttons: {\n\t\t\t\t\tcreate: {\n\t\t\t\t\t\ttype: \"accept\",\n\t\t\t\t\t\tlabel: \"Create & Close\",\n\t\t\t\t\t\tmode: \"create\",\n\t\t\t\t\t\tsave: true,\n\t\t\t\t\t\tvalidate: true\n\t\t\t\t\t},\n\t\t\t\t\tcreateAnother: {\n\t\t\t\t\t\ttype: \"accept\",\n\t\t\t\t\t\tlabel: \"Create\",\n\t\t\t\t\t\tmode: \"create\",\n\t\t\t\t\t\tsave: true,\n\t\t\t\t\t\tvalidate: true\n\t\t\t\t\t},\n\t\t\t\t\tupdate: {\n\t\t\t\t\t\ttype: \"accept\",\n\t\t\t\t\t\tlabel: \"Update\",\n\t\t\t\t\t\tmode: \"edit\",\n\t\t\t\t\t\tpermission: this.permissionToUpdate.bind(this),\n\t\t\t\t\t\tsave: true,\n\t\t\t\t\t\tvalidate: true\n\t\t\t\t\t},\n\t\t\t\t\tcancel: {\n\t\t\t\t\t\ttype: \"cancel\",\n\t\t\t\t\t\tlabel: \"Cancel\"\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tdataNoun: \"assessment / survey\" + (this.model.isNew() ? \"\" : \": \" + this.model.get(\"title\")),\n\t\t\t\thost: options.host\n\t\t\t};\n\t\t}\n\n\t\tthis.previewMode = Boolean(options.previewMode);\n\t\tthis.restartPreview = Boolean(options.restart);\n\n\t\tthis.iago = new Iago({\n\t\t\teditMode: !this.previewMode,\n\t\t\tpreviewMode: this.previewMode,\n\t\t\tfeedbackMode: this.model.get(\"feedback\"),\n\t\t\tparent: this.$el.get(0)\n\t\t});\n\n\t\tthis.id = 1;\n\t\tthis.questionModels = [];\n\t\tthis.listenTo(Page, \"questions:added\", this.updateUIReadiness.bind(this));\n\t\tthis.listenTo(Page, \"questions:removed\", this.updateUIReadiness.bind(this));\n\t\tthis.deleteWhenCancel = false;\n\n\t\tthis.ui = _.extend(this.ui, BigModal.prototype.ui);\n\t\tthis.events = _.extend(this.events, BigModal.prototype.events);\n\n\t\tBigModal.prototype.initialize.call(this);\n\t},\n\n\taugmentTemplateData: function augmentTemplateData() {\n\t\treturn {\n\t\t\tpreviewMode: this.previewMode\n\t\t};\n\t},\n\n\tpreview: function preview(evt) {\n\t\tevt.stopPropagation();\n\n\t\tif (this.iago.state) {\n\t\t\t// Save the current question, if present (which might fail)\n\t\t\tif (this.currentQuestion && !this.currentQuestion.save()) {\n\t\t\t\tconsole.error(\"Error saving question.\");\n\t\t\t} else {\n\t\t\t\t// Hide any error messages\n\t\t\t\t$(\".question-errors\").addClass(\"hide\");\n\n\t\t\t\tif (this.currentQuestion) this.iago.updateCurrentModel(this.currentQuestion.model.toJSON());\n\n\t\t\t\tvar data = this.model.toJSON();\n\n\t\t\t\tdata.questionData = _.map(this.questionModels, function (model) {\n\t\t\t\t\treturn model.toJSON();\n\t\t\t\t});\n\t\t\t\tthis.iago.state.currentQuestion = 0;\n\t\t\t\tvar modal = new AssessmentModal({\n\t\t\t\t\tmodel: new Assessment(data),\n\t\t\t\t\tpreviewMode: true,\n\t\t\t\t\tcurrentQuestion: this.iago.state.currentQuestion\n\t\t\t\t});\n\n\t\t\t\tmodal.show({});\n\t\t\t}\n\t\t}\n\t},\n\n\tisModeCreate: function isModeCreate() {\n\t\treturn !this.model || this.model.isNew() || this.model.has(\"cloned\") && this.model.get(\"cloned\");\n\t},\n\n\tpermissionToUpdate: function permissionToUpdate() {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\treturn settings.resourceEditing && rester.hasAccess(rester.p.api.resources.put, user);\n\t},\n\n\tloadData: function loadData(cb) {\n\t\tif (!this.previewMode && (!this.model.isNew() || this.model.get(\"cloned\"))) {\n\t\t\t// We need to fetch the unabridged model\n\t\t\tthis._title = this.model.get(\"title\");\n\n\t\t\tthis.model.fetch({\n\t\t\t\tsuccess: this.fetchSuccess.bind(this, cb),\n\t\t\t\terror: this.fetchError.bind(this, cb),\n\t\t\t\turl: settings.urlRoot + \"/api/1.0/resources/assessments/\" + this.model.id\n\t\t\t});\n\t\t} else if (this.previewMode && this.model.get(\"questionData\").length === 0 && !this.model.isNew()) {\n\t\t\t// We need to fetch the unabridged model\n\t\t\tthis._title = this.model.get(\"title\");\n\n\t\t\tthis.model.fetch({\n\t\t\t\tsuccess: this.fetchSuccess.bind(this, cb),\n\t\t\t\terror: this.fetchError.bind(this, cb),\n\t\t\t\turl: settings.urlRoot + \"/api/1.0/resources/assessments/\" + this.model.id\n\t\t\t});\n\t\t} else {\n\t\t\tthis.populateQuestionModels();\n\t\t\treturn cb();\n\t\t}\n\t},\n\n\tfetchSuccess: function fetchSuccess(cb) {\n\t\tif (this.model.get(\"cloned\")) {\n\t\t\tthis.model.set(\"title\", this._title);\n\t\t\tthis.model.unset(\"_id\");\n\t\t\tthis.model.unset(\"cloned\");\n\n\t\t\tthis.isClone = true;\n\t\t}\n\n\t\tthis.populateQuestionModels();\n\n\t\tcb();\n\t},\n\n\tfetchError: function fetchError() {\n\t\tthis.bindEvents(this.model, this.modelEvents);\n\t},\n\n\tpopulateQuestionModels: function populateQuestionModels() {\n\t\tvar _this2 = this;\n\n\t\t_.each(this.model.get(\"questionData\"), function (q) {\n\t\t\tif (q.id > _this2.id) _this2.id = q.id;\n\n\t\t\t_this2.questionModels.push(new Models[q.type + (q.subtype ? \".\" + q.subtype : \"\")](q));\n\t\t});\n\n\t\tthis.id++;\n\t},\n\n\trenderForm: function renderForm() {\n\t\tvar select = new Selectra({\n\t\t\tserver: {\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/subjects\",\n\t\t\t\tdelayLoad: true,\n\t\t\t\tkey: \"subject_id\",\n\t\t\t\tvalue: \"subject\",\n\t\t\t\tdefault: {\n\t\t\t\t\tkey: this.model.get(\"subject\"),\n\t\t\t\t\tvalue: this.model.get(\"subject_name\")\n\t\t\t\t}\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 20,\n\t\t\t\tinfinite: true\n\t\t\t},\n\t\t\tddHost: this.Options.host,\n\t\t\tplaceholder: \"No subject selected\"\n\t\t});\n\n\t\tselect.show({ el: this.ui.subject });\n\n\t\t$(\"select\", this.el).chosen({ width: \"100%\" });\n\t\tthis.ui.slider.rangeslider({ polyfill: false });\n\t\tthis.$el.foundation();\n\n\t\tif (this.previewMode) {\n\t\t\tthis.switchToPreviewMode();\n\t\t\tthis.createQuestion(\"\", this.restartPreview ? 0 : this.options.currentQuestion);\n\t\t\tthis.ui.preview.addClass(\"hide\");\n\t\t\tthis.ui.deleteQuestion.addClass(\"hide\");\n\t\t\tthis.ui.sliderHost.addClass(\"hide\");\n\t\t\tthis.ui.infoHost.addClass(\"hide\");\n\t\t\tthis.ui.options.addClass(\"hide\");\n\t\t} else if (this.isClone || this.mustClone()) {\n\t\t\tthis.showClonedMetadataForm();\n\t\t} else if (!this.model.isNew()) {\n\t\t\tthis.switchToEditMode();\n\t\t\tthis.createQuestion(\"\");\n\t\t}\n\n\t\tthis.updateUIReadiness(this.questionModels);\n\t},\n\n\tupdateUIReadiness: function updateUIReadiness(questions) {\n\t\tif (!questions || questions.length === 0) this.setUIBusy();else this.setUIReady();\n\t},\n\n\tonButtonAddEditQuestionsClick: function onButtonAddEditQuestionsClick() {\n\t\tthis.model.set({\n\t\t\tdescription: this.ui.description.val(),\n\t\t\tfeedback: this.ui.feedback.prop(\"checked\"),\n\t\t\tlanguage: this.ui.language.val(),\n\t\t\ttitle: this.ui.title.val(),\n\t\t\tstudyYear: this.ui.studyYear.val(),\n\t\t\tsubject: this.ui.subject.val()\n\t\t}, { validate: false });\n\n\t\tthis.model.save();\n\n\t\tif (this.ui.title.val() !== \"\" && this.ui.studyYear.val() !== \"\" && this.ui.subject.val() !== \"\") this.switchToEditMode();\n\n\t\tif (this.model.isNew() && !this.isClone) this.showTypes();else this.createQuestion(\"\");\n\t},\n\n\tshowClonedMetadataForm: function showClonedMetadataForm() {\n\t\tif (this.mustClone()) this.ui.mustCloneMessage.removeClass(\"hide\");else this.ui.isCloneMessage.removeClass(\"hide\");\n\n\t\tthis.ui.createMessage.addClass(\"hide\");\n\t\tthis.ui.buttonAddEditQuestions.val(\"Begin editing questions\");\n\t},\n\n\tswitchToEditMode: function switchToEditMode() {\n\t\tthis.ui.controlPanel.addClass(\"hide\");\n\t\tthis.ui.metadataPanel.addClass(\"metadata-panel-collapsed\");\n\t\tthis.ui.assessmentBasis.removeClass(\"assessment-basis-simple\");\n\t\tthis.ui.assessmentPanel.removeClass(\"hide\");\n\n\t\tthis.menu = new Slideout({\n\t\t\tpanel: this.ui.assessmentPanel.get(0),\n\t\t\tmenu: this.ui.metadataPanel.get(0),\n\t\t\tpadding: 512,\n\t\t\ttolerance: 70\n\t\t});\n\t},\n\n\tswitchToPreviewMode: function switchToPreviewMode() {\n\t\tthis.ui.controlPanel.addClass(\"hide\");\n\t\tthis.ui.metadataPanel.addClass(\"metadata-panel-collapsed\");\n\t\tthis.ui.assessmentBasis.removeClass(\"assessment-basis-simple\");\n\t\tthis.ui.assessmentPanel.removeClass(\"hide\");\n\n\t\tthis.menu = new Slideout({\n\t\t\tpanel: this.ui.assessmentPanel.get(0),\n\t\t\tmenu: this.ui.metadataPanel.get(0),\n\t\t\tpadding: 512,\n\t\t\ttolerance: 70\n\t\t});\n\t},\n\n\tsetAssessmentAreaContents: function setAssessmentAreaContents(view) {\n\t\tif (this.assessmentAreaContents) {\n\t\t\tthis.assessmentAreaContents.destroy();\n\t\t\tthis.assessmentAreaContents = null;\n\t\t}\n\n\t\tthis.ui.assessmentArea.append(view.render().$el);\n\n\t\tthis.assessmentAreaContents = view;\n\t},\n\n\tiagoNavigate: function iagoNavigate(evt) {\n\t\t// Update Iago's state with the revised current model\n\t\tthis.iago.updateCurrentModel(this.currentQuestion.model.toJSON());\n\n\t\t// Get rid of the current question\n\t\tthis.currentQuestion.destroy();\n\t\tdelete this.currentQuestion;\n\n\t\tif (evt.detail.direction === true) {\n\t\t\t// If we're at the end of the array...\n\t\t\tif (this.questionModels.length === this.iago.state.currentQuestion + 1) this.showTypes();else this.loadQuestion(this.iago.state.currentQuestion + 1);\n\t\t} else if (this.iago.state.currentQuestion >= 0) {\n\t\t\tthis.loadQuestion(this.iago.state.currentQuestion - 1);\n\t\t}\n\n\t\tthis.updateTotalMark();\n\t},\n\n\tlanguageChanged: function languageChanged() {\n\t\tthis.model.set({ language: this.ui.language.val() });\n\n\t\tif (this.iago.state) this.iago.redraw(this.model.toJSON());\n\t},\n\n\tfeedbackChanged: function feedbackChanged() {\n\t\tthis.model.set({ feedback: this.ui.feedback.prop(\"checked\") });\n\n\t\tif (this.currentQuestion) {\n\t\t\tif (this.iago.state) {\n\t\t\t\t// Save the current question state\n\t\t\t\tthis.currentQuestion.save(true, true);\n\n\t\t\t\t// Propagate it into Iago\n\t\t\t\tthis.iago.updateCurrentModel(this.currentQuestion.model.toJSON());\n\n\t\t\t\t// And redraw\n\t\t\t\tthis.iago.redraw(this.model.toJSON());\n\t\t\t}\n\t\t}\n\n\t\tPage.trigger(\"change:feedback\", this.ui.feedback.prop(\"checked\"));\n\n\t\tif (this.currentQuestion && !this.ui.feedback.prop(\"checked\")) this.iago.redoInstructions();\n\t},\n\n\ttoggleMenu: function toggleMenu() {\n\t\tthis.menu.toggle();\n\t},\n\n\tsetupOptions: function setupOptions(question) {\n\t\tthis.ui.options.removeClass(\"invisible\");\n\n\t\tif (this.optionsMenu) this.optionsMenu.destroy();\n\n\t\tthis.optionsMenu = new SimpleMenu({\n\t\t\tanchor: this.ui.options,\n\t\t\tside: \"right\",\n\t\t\tpersist: true,\n\t\t\thost: \"#modals .modal-container\",\n\t\t\tclickRoot: \"#modals\",\n\t\t\tstructure: question.model.questionOptions\n\t\t});\n\n\t\t// Listen for menu events\n\t\tquestion.bindEvents(this.optionsMenu, question.optionEvents);\n\t},\n\n\thideOptions: function hideOptions() {\n\t\tthis.ui.options.addClass(\"invisible\");\n\n\t\tif (this.optionsMenu) this.optionsMenu.destroy();\n\t},\n\n\ttoggleOptions: function toggleOptions(event) {\n\t\tevent.stopPropagation();\n\n\t\tthis.optionsMenu.show();\n\t},\n\n\ttransitionSaveSuccess: function transitionSaveSuccess(data, response) {\n\t\tthis.model.id = response.id;\n\t\tthis.model._id = response._id;\n\t},\n\n\ttransitionSaveError: function transitionSaveError(model, response) {\n\t\tthis.$el.find(\".form-container\").addClass(\"hide\");\n\n\t\tthis.showError(new Errors.Model({\n\t\t\ttitle: \"Assessment Save Error\",\n\t\t\tmessage: \"An error occurred while saving the assessment.\",\n\t\t\tresponse: response\n\t\t}));\n\t},\n\n\ttransitionSaveAssessment: function transitionSaveAssessment() {\n\t\tif (this.questionModels.length > 0) {\n\t\t\t//Auto saving the assessment\n\t\t\tvar data = this.assembleData();\n\n\t\t\tvar resource = this.wrapAsResource(this.model);\n\t\t\tresource.attributes.questionData = data.attributes.questionData;\n\t\t\tresource.set({\n\t\t\t\tmaxScore: data.attributes.maxScore\n\t\t\t});\n\n\t\t\tif (this.isModeCreate()) {\n\t\t\t\tresource.set({\n\t\t\t\t\t_id: this.model._id\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.switchToEditMode();\n\n\t\t\tresource.save(resource.attributes, {\n\t\t\t\twait: true,\n\t\t\t\tvalidate: false,\n\t\t\t\tsuccess: this.transitionSaveSuccess.bind(this),\n\t\t\t\terror: this.transitionSaveError.bind(this)\n\t\t\t});\n\n\t\t\tApp.trigger(App.Events.ResourceCreated, resource);\n\t\t}\n\t},\n\n\tshowTypes: function showTypes() {\n\t\tthis.transitionSaveAssessment();\n\n\t\tvar view = new QuestionTypes({ size: this.questionModels.length });\n\n\t\tthis.listenTo(view, \"type\", this.createQuestion.bind(this));\n\n\t\tthis.setAssessmentAreaContents(view);\n\n\t\tthis.ui.actions.addClass(\"hide\");\n\t\tthis.ui.options.addClass(\"invisible\");\n\t\tthis.ui.sliderHost.addClass(\"hide\");\n\t},\n\n\tupdateSlider: function updateSlider(index) {\n\t\tvar total = this.questionModels.length;\n\t\tvar actualIndex = _.isUndefined(index) ? total : index + 1;\n\n\t\tthis.ui.questionNumber.text(actualIndex.toString());\n\t\tthis.ui.slider.attr(\"max\", total).val(actualIndex.toString()).rangeslider(\"update\", true);\n\t\tthis.ui.sliderCount.text(total);\n\t\tthis.ui.sliderNum.attr(\"max\", total);\n\n\t\tif (!actualIndex && this.ui.sliderNum.val() > total) this.ui.sliderNum.val(\"\");else this.ui.sliderNum.val(actualIndex.toString());\n\t},\n\n\tupdateTotalMark: function updateTotalMark() {\n\t\tvar totalMarks = 0;\n\t\tvar total = this.questionModels.length + 1;\n\n\t\tvar page = this.currentQuestion ? $(\"#page-input\").val() : total;\n\t\tthis.ui.questionNumber.text(page);\n\n\t\tfor (var i = this.questionModels.length - 1; i >= 0; i--) {\n\t\t\ttotalMarks += this.questionModels[i].attributes.potentialScore;\n\t\t}this.ui.totalMark.text(totalMarks);\n\n\t\tvar mark = 0;\n\n\t\tif (this.currentQuestion) mark = this.currentQuestion.model.attributes.potentialScore > 0 ? this.currentQuestion.model.attributes.potentialScore : 0;\n\n\t\tif (mark === 0) mark = $(\".checkable.fa-check\").length;\n\n\t\tif (mark === 0) mark = $(\".question-content input[type='number']\").val();\n\n\t\tif (mark === 0 || mark === undefined) mark = $(\".match-options.left\").length;\n\n\t\tmark = mark === undefined ? 0 : mark;\n\n\t\tif (mark === 0) {\n\t\t\tthis.ui.questionMark.parent().addClass(\"hide\");\n\t\t\tthis.ui.questionNumber.parent().addClass(\"hide\");\n\t\t} else {\n\t\t\tthis.ui.questionMark.parent().removeClass(\"hide\");\n\t\t\tthis.ui.questionNumber.parent().removeClass(\"hide\");\n\t\t}\n\t\tthis.ui.questionMark.text(mark);\n\t},\n\n\tcreateQuestion: function createQuestion(type, questionIndex) {\n\t\tif (this.currentQuestion) {\n\t\t\tthis.currentQuestion.destroy();\n\t\t\tthis.currentQuestion = null;\n\t\t}\n\n\t\tvar question = void 0;\n\n\t\tif (type === \"\") {\n\t\t\t// Blank means we cancelled, show the latest question instead\n\t\t\tvar model = _.last(this.questionModels);\n\n\t\t\tif (!model) return this.showTypes();\n\n\t\t\tquestion = new Questions[model.get(\"type\") + (model.has(\"subtype\") ? \".\" + model.get(\"subtype\") : \"\")]({\n\t\t\t\tassessment: this.model,\n\t\t\t\tquestion: model,\n\t\t\t\tpreviewMode: this.previewMode\n\t\t\t});\n\t\t} else {\n\t\t\tquestion = new Questions[type]({\n\t\t\t\tid: this.id++,\n\t\t\t\tassessment: this.model,\n\t\t\t\tpreviewMode: this.previewMode\n\t\t\t});\n\n\t\t\t// Add the new model as a valid question to the master array\n\t\t\tthis.questionModels.push(question.model);\n\t\t}\n\n\t\t// Listen for navigation events\n\t\tthis.listenTo(question, \"iago:navigate\", this.iagoNavigate.bind(this));\n\n\t\tthis.setAssessmentAreaContents(question);\n\n\t\t// Does this question type have options we need to show?\n\t\tif (question.model.questionOptions) this.setupOptions(question);\n\n\t\tif (!this.iago.state) {\n\t\t\tvar data = this.model.toJSON();\n\n\t\t\tdata.questionData = _.map(this.questionModels, function (questionModel) {\n\t\t\t\treturn questionModel.toJSON();\n\t\t\t});\n\t\t\tthis.iago.start(data, { settings: { serverSave: false, requireCode: false } }, {\n\t\t\t\tcurrentQuestion: questionIndex === undefined ? this.questionModels.length - 1 : questionIndex,\n\t\t\t\tfeedbackMode: this.model.get(\"feedback\")\n\t\t\t});\n\t\t} else if (type) {\n\t\t\tthis.iago.addQuestion(question.model.toJSON());\n\t\t} else {\n\t\t\tthis.iago.draw(this.questionModels.length - 1);\n\t\t}\n\n\t\tthis.ui.actions.removeClass(\"hide\");\n\t\tthis.ui.slider.attr(\"max\", this.questionModels.length).val(this.questionModels.length).rangeslider(\"update\", true);\n\t\tthis.ui.sliderNum.attr(\"max\", this.questionModels.length).val(this.questionModels.length);\n\t\tthis.ui.sliderHost.removeClass(\"hide\");\n\n\t\tthis.currentQuestion = question;\n\n\t\tif (type !== \"\") Page.trigger(\"questions:added\", this.questionModels);\n\n\t\tthis.updateSlider();\n\t\tthis.updateTotalMark();\n\t},\n\n\tloadQuestion: function loadQuestion(index) {\n\t\tif (this.currentQuestion) {\n\t\t\tthis.currentQuestion.destroy();\n\t\t\tthis.currentQuestion = null;\n\t\t}\n\n\t\tvar model = this.questionModels[index];\n\t\tvar question = new Questions[model.get(\"type\") + (model.has(\"subtype\") ? \".\" + model.get(\"subtype\") : \"\")]({\n\t\t\tassessment: this.model,\n\t\t\tquestion: model,\n\t\t\tpreviewMode: this.previewMode\n\t\t});\n\n\t\t// Listen for navigation events\n\t\tthis.listenTo(question, \"iago:navigate\", this.iagoNavigate.bind(this));\n\n\t\tthis.setAssessmentAreaContents(question);\n\n\t\t// Does this question type have options we need to show?\n\t\tif (question.model.questionOptions) this.setupOptions(question);else this.hideOptions();\n\n\t\tthis.iago.draw(index);\n\n\t\tthis.ui.actions.removeClass(\"hide\");\n\t\tthis.ui.slider.val(index).rangeslider(\"update\", true);\n\t\tthis.ui.sliderNum.val(index);\n\t\tthis.ui.sliderHost.removeClass(\"hide\");\n\n\t\tthis.currentQuestion = question;\n\n\t\tthis.updateSlider(index);\n\t},\n\n\tdeleteQuestion: function deleteQuestion() {\n\t\tvar index = this.iago.state.currentQuestion;\n\n\t\tif (this.currentQuestion) {\n\t\t\tthis.currentQuestion.destroy();\n\t\t\tthis.currentQuestion = null;\n\t\t}\n\n\t\tthis.questionModels.splice(index, 1);\n\n\t\t//adjust the ids\n\t\t//for(let i = 0; i < this.questionModels.length; i++) {\n\t\t//\tthis.questionModels[i].id = i + 2;\n\t\t//\tthis.questionModels[i].attributes.id = i + 2;\n\t\t//}\n\t\t//this.id = this.questionModels.length > 0 ? (this.questionModels[this.questionModels.length - 1].id + 1) : 1;\n\n\t\tthis.iago.removeQuestion();\n\n\t\tPage.trigger(\"questions:removed\", this.questionModels);\n\n\t\tif (this.questionModels.length === 0) this.showTypes();else this.loadQuestion(Math.min(this.questionModels.length - 1, index));\n\n\t\tthis.updateTotalMark();\n\t},\n\n\tchangeQuestionNum: function changeQuestionNum() {\n\t\tvar index = parseInt(this.ui.sliderNum.val(), 10);\n\n\t\tif (this.questionModels.length < index || index - 1 === this.iago.state.currentQuestion) return;\n\n\t\tif (!this.currentQuestion.save()) {\n\t\t\tthis.ui.sliderNum.val(this.iago.state.currentQuestion + 1);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.iago.updateCurrentModel(this.currentQuestion.model.toJSON());\n\t\tthis.loadQuestion(index - 1);\n\t},\n\n\tchangeQuestionSlide: function changeQuestionSlide() {\n\t\tvar index = parseInt(this.ui.slider.val(), 10);\n\n\t\tif (this.questionModels.length < index || index - 1 === this.iago.state.currentQuestion || !this.currentQuestion) return;\n\n\t\tif (!this.currentQuestion.save()) {\n\t\t\tthis.ui.slider.val(this.iago.state.currentQuestion + 1).rangeslider(\"update\", true);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.iago.updateCurrentModel(this.currentQuestion.model.toJSON());\n\t\tthis.loadQuestion(index - 1);\n\t},\n\n\tbeforeValidationFail: function beforeValidationFail() {\n\t\tif (this.model.validationError.language || this.model.validationError.subject || this.model.validationError.studyYear || this.model.validationError.title) {\n\t\t\tif (this.menu) this.menu.open();\n\t\t}\n\t},\n\n\tmustClone: function mustClone() {\n\t\t// Is this assessment already saved and in use?\n\t\treturn !this.model.isNew() && this.model.get(\"uses\") > 0;\n\t},\n\n\tconfirmAccept: function confirmAccept() {\n\t\tvar message = null;\n\n\t\tif (this.currentQuestion && !this.currentQuestion.save()) return;\n\n\t\tif (this.mustClone()) {\n\t\t\tmessage = \"This assessment is being used in \" + this.model.get(\"uses\") + \" other place\" + (this.model.get(\"uses\") > 1 ? \"s\" : \"\") + \" that could generate marks. To ensure those marks are preserved, editing this assessment will cause it to be cloned into a new assessment.\";\n\n\t\t\tthis.ui.title.val(this.model.get(\"title\"));\n\t\t}\n\n\t\treturn message;\n\t},\n\n\tsave: function save(action, data) {\n\t\t// Modify the modal layout\n\t\tthis.setStatusBusy(\"saving\");\n\n\t\tif (data.attributes._id === undefined) data.attributes._id = this.model._id;\n\n\t\t// If files were specified...\n\t\tif (data.files) {\n\t\t\t// ...then employ the model's binary save method...\n\n\t\t\t// Save the model\n\t\t\tthis.xhr = this.model.binarySave(null, {\n\t\t\t\twait: true,\n\t\t\t\tdata: data.attributes,\n\t\t\t\tvalidate: false,\n\t\t\t\tsuccess: this.onSaveSuccess.bind(this, action),\n\t\t\t\terror: this.onSaveError.bind(this)\n\t\t\t});\n\t\t} else {\n\t\t\t// ...otherwise, employ the model's standard save method\n\n\t\t\t// Save the model\n\t\t\tthis.xhr = this.model.save(data.attributes, {\n\t\t\t\twait: true,\n\t\t\t\tvalidate: false,\n\t\t\t\tsuccess: this.onSaveSuccess.bind(this, action),\n\t\t\t\terror: this.onSaveError.bind(this)\n\t\t\t});\n\t\t}\n\n\t\tthis.initializeProgressBar();\n\t},\n\n\tonSaveError: function onSaveError(model, e) {\n\t\tthis.setStatusReady();\n\t\tthis.$el.find(\".form-container\").addClass(\"hide\");\n\n\t\tthis.showError(new Errors.Model({\n\t\t\ttitle: \"Assessment Save Error\",\n\t\t\tmessage: \"An error occurred while saving the assessment.\",\n\t\t\tresponse: e\n\t\t}));\n\t},\n\n\tbeforeSave: function beforeSave() {\n\t\tvar continueSave = true;\n\n\t\t// Save the current question, if present (which might fail)\n\t\tif (this.currentQuestion && !this.currentQuestion.save()) continueSave = false;\n\t\t// To calculate the final mark\n\t\telse if (this.currentQuestion) this.iago.updateCurrentModel(this.currentQuestion.model.toJSON());\n\n\t\treturn continueSave;\n\t},\n\n\tassembleData: function assembleData() {\n\t\tvar data = {};\n\n\t\tdata.attributes = {\n\t\t\tdescription: this.ui.description.val(),\n\t\t\tlanguage: this.ui.language.val(),\n\t\t\tmaxScore: this.iago.getMaxScore(),\n\t\t\tquestionData: _.map(this.questionModels, function (model) {\n\t\t\t\treturn model.toJSON();\n\t\t\t}),\n\t\t\tstudyYear: this.ui.studyYear.val(),\n\t\t\tsubject: this.ui.subject.val(),\n\t\t\ttitle: this.ui.title.val(),\n\t\t\tupdated: this.mustClone() ? null : undefined,\n\t\t\t_id: this.model.id\n\t\t};\n\n\t\t// If this assessment must be cloned, then it will be cloned on the server.\n\t\t// We won't know what the new model is so we must make a note of the fact\n\t\t// that cloning was needed.\n\t\tthis.WasCloned = this.mustClone();\n\n\t\treturn data;\n\t},\n\n\tconfirmCancel: function confirmCancel() {\n\t\tvar message = null;\n\n\t\tif ((this.model.isNew() || settings.resourceEditing && !this.model.isNew()) && this.basis && this.basis.questionModels.length) {\n\t\t\tmessage = \"If you cancel, then \" + this.basis.questionModels.length + \" question\" + (this.basis.questionModels.length === 1 ? \"\" : \"s\") + \" will not be saved.\";\n\t\t}\n\n\t\tif (this.isModeCreate()) {\n\t\t\t//Delete the assessment server side\n\t\t\tvar resource = new Assessment(this.model);\n\t\t\tresource.destroy({\n\t\t\t\twait: true,\n\t\t\t\tdata: { andAttachments: true }\n\t\t\t});\n\t\t}\n\n\t\treturn message;\n\t},\n\n\twrapAsResource: function wrapAsResource(assessmentModel) {\n\t\tassessmentModel.subject = 12;\n\t\tassessmentModel.unset(\"questionData\");\n\t\tvar resource = new Assessment(assessmentModel.toJSON());\n\n\t\tresource.set({\n\t\t\t_id: assessmentModel.get(\"_id\"),\n\t\t\tcategory: \"assessment\",\n\t\t\tcreated: moment().unix(),\n\t\t\ttitle: assessmentModel.get(\"title\"),\n\t\t\tupdated: assessmentModel.has(\"updated\") ? assessmentModel.get(\"updated\") : undefined\n\t\t});\n\n\t\tthis.ui.title.val(assessmentModel.get(\"title\"));\n\n\t\treturn resource;\n\t},\n\n\tonAssessmentCreated: function onAssessmentCreated(result) {\n\t\tApp.trigger(App.Events.ResourceCreated, this.wrapAsResource(result.model));\n\t},\n\n\tonAssessmentUpdated: function onAssessmentUpdated(result) {\n\t\tApp.trigger(this.WasCloned ? App.Events.ResourceCreated : App.Events.ResourceUpdated, this.wrapAsResource(result.model));\n\t},\n\n\tonCreateAnother: function onCreateAnother(result) {\n\t\tthis.onAssessmentCreated(result);\n\n\t\treturn new Assessment({\n\t\t\tlanguage: result.model.get(\"language\"),\n\t\t\tstudyYear: result.model.get(\"studyYear\"),\n\t\t\tsubject: result.model.get(\"subject\"),\n\t\t\tsubject_name: result.model.get(\"subject_name\")\n\t\t});\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tif (!this.optionsMenu) return;\n\t\tthis.optionsMenu.destroy();\n\t\tthis.optionsMenu = null;\n\t}\n});\n\nvar MultiQuestions = {\n\theadingImageClick: function headingImageClick(e) {\n\t\tif (e && $(e.currentTarget).hasClass(\"imageChooser\")) return;\n\n\t\tthis.headingImage = ImageChooser.create($(\".image-placeholder\", this.el), {\n\t\t\ttranscode: true,\n\t\t\tjpeg: true,\n\t\t\tmaxHeight: 250,\n\t\t\tmaxWidth: 300\n\t\t});\n\n\t\tthis.ui.headingImageDel.removeClass(\"hide\");\n\n\t\tthis.model.set({ expectQuestionImage: true });\n\t},\n\n\tdeleteHeadingImage: function deleteHeadingImage() {\n\t\tif (this.headingImage) {\n\t\t\tthis.headingImage.destroy();\n\t\t\tthis.headingImage = null;\n\t\t}\n\n\t\t$(\".image-placeholder\", this.el).replaceWith('<div class=\"image-placeholder\">Click to add an optional image to the title</div>');\n\t\tthis.ui.headingImageDel.addClass(\"hide\");\n\t\tthis.model.set({ expectQuestionImage: false });\n\t},\n\n\tpasted: function pasted(e) {\n\t\te.stopPropagation();\n\t\te.preventDefault();\n\n\t\tif (!e.originalEvent.clipboardData) return;\n\n\t\t$(e.currentTarget).text(e.originalEvent.clipboardData.getData(\"text/plain\"));\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.ui.bus.get(0).addEventListener(\"iago:loaded\", this.loaded);\n\t\tthis.ui.bus.get(0).addEventListener(\"iago:navigate\", this.navigate);\n\n\t\tthis.ui.feedback.attr(\"contenteditable\", this.assessment.get(\"feedback\"));\n\t\tthis.model.feedback = this.assessment.get(\"feedback\");\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.trigger(\"destroyed\", this.model);\n\n\t\t_.each(this.questions, function (el) {\n\t\t\treturn el.destroy();\n\t\t});\n\n\t\tthis.ui.bus.get(0).removeEventListener(\"iago:loaded\", this.loaded);\n\t\tthis.ui.bus.get(0).removeEventListener(\"iago:navigate\", this.navigate);\n\t},\n\n\tchangeFeedback: function changeFeedback(state) {\n\t\tif (this.previewMode) return;\n\n\t\tthis.ui.feedback.attr(\"contenteditable\", state);\n\t\tthis.model.feedback = state;\n\n\t\tif (!this.model.get(\"feedback\")) this.model.set(\"feedback\", \"This is placeholder feedback; click to edit\");\n\n\t\tif (state) this.ui.feedback.addClass(\"iago-editable-dark\").text(this.model.get(\"feedback\"));else this.ui.feedback.removeClass(\"iago-editable-dark\");\n\t},\n\n\tiagoLoaded: function iagoLoaded() {\n\t\tvar _this3 = this;\n\n\t\tthis.bindUIElements();\n\t\tthis.delegateEvents();\n\n\t\t// Check for images and construct accordingly\n\t\t_.each(this.model.get(\"correctAnswers\").concat(this.model.get(\"otherAnswers\")), function (el) {\n\t\t\tif (el.type === \"image\" && !_this3.previewMode) {\n\t\t\t\t_this3.questions[el.id.toString()] = ImageChooser.create($(\".question-options[data-value='\" + el.id + \"']\", _this3.el).children(\"span\"), {\n\t\t\t\t\ttranscode: true,\n\t\t\t\t\tjpeg: true,\n\t\t\t\t\tmaxHeight: 250,\n\t\t\t\t\tmaxWidth: 300\n\t\t\t\t});\n\n\t\t\t\t_this3.questions[el.id.toString()].setImage(el.content);\n\t\t\t}\n\t\t});\n\n\t\tif (this.model.get(\"expectQuestionImage\") && !this.previewMode) {\n\t\t\tthis.headingImageClick();\n\t\t\tthis.headingImage.setImage(this.model.get(\"questionImage\"));\n\t\t}\n\n\t\t// Check for feedback mode\n\t\tif (this.assessment.get(\"feedback\")) this.changeFeedback(true);\n\n\t\tif (this.extraSetup) this.extraSetup();\n\n\t\tif (!this.previewMode) {\n\t\t\tvar answerCount = $(\".checkable.fa-check\").length;\n\t\t\t$(\".question-mark\").text(answerCount);\n\t\t}\n\t},\n\n\tiagoNavigate: function iagoNavigate(evt) {\n\t\t// Save this model, then navigate\n\t\tif (this.save()) this.trigger(\"iago:navigate\", evt);\n\t},\n\n\tsave: function save(noValidation, noFeedback) {\n\t\tvar _this4 = this;\n\n\t\tif (!this.ui.headingText.text) return;\n\n\t\tvar correct = $(\".checkable.fa-check\", this.el).parents(\".question-options\");\n\t\tvar wrong = $(\".checkable.fa-times\", this.el).parents(\".question-options\");\n\n\t\tvar question = _.trim(this.ui.headingText.text());\n\t\tvar feedback = this.assessment.get(\"feedback\") && !noFeedback ? _.trim(this.ui.feedback.text()) : \"\";\n\t\tvar questionImage = null;\n\n\t\tif (this.headingImage) questionImage = this.headingImage.getImage();\n\n\t\tthis.model.set({\n\t\t\tquestion: question,\n\t\t\tquestionImage: questionImage,\n\t\t\texpectQuestionImage: questionImage !== null,\n\t\t\tfeedback: feedback,\n\t\t\tcorrectAnswers: _.map(correct.toArray(), function (el) {\n\t\t\t\tvar element = $(el);\n\t\t\t\tvar span = element.children(\"span\");\n\n\t\t\t\treturn {\n\t\t\t\t\tid: parseInt(element.data(\"value\"), 10),\n\t\t\t\t\ttype: span.hasClass(\"imageChooser\") ? \"image\" : \"text\",\n\t\t\t\t\tcontent: span.hasClass(\"imageChooser\") ? _this4.questions[element.data(\"value\")].getImage() : span.text()\n\t\t\t\t};\n\t\t\t}),\n\t\t\totherAnswers: _.map(wrong.toArray(), function (el) {\n\t\t\t\tvar element = $(el);\n\t\t\t\tvar span = element.children(\"span\");\n\n\t\t\t\treturn {\n\t\t\t\t\tid: parseInt(element.data(\"value\"), 10),\n\t\t\t\t\ttype: span.hasClass(\"imageChooser\") ? \"image\" : \"text\",\n\t\t\t\t\tcontent: span.hasClass(\"imageChooser\") ? _this4.questions[element.data(\"value\")].getImage() : span.text()\n\t\t\t\t};\n\t\t\t})\n\t\t});\n\n\t\tthis.model.set({ potentialScore: this.model.get(\"correctAnswers\").length });\n\n\t\tif (!noValidation) return this.model.isValid();\n\t},\n\n\tvalidationFail: function validationFail() {\n\t\tif (this.previewMode) return;\n\t\t// Build the errors to show\n\t\tvar errs = this.model.validationError.slice(0);\n\n\t\terrs.unshift(\"<strong>The current question has errors and cannot be saved:</strong><br/>\");\n\t\tthis.ui.errors.removeClass(\"hide\").children(\".detail\").html(errs.join(\"<br/>&middot;&nbsp;\"));\n\t},\n\n\tcloseError: function closeError() {\n\t\tthis.ui.errors.addClass(\"hide\");\n\t},\n\n\teditClick: function editClick(evt) {\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\t},\n\n\tchangeType: function changeType(evt) {\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\n\t\t// Get the thing we clicked on\n\t\tvar el = $(evt.currentTarget).parents(\"div.question-options\");\n\n\t\t// Change its type\n\t\tif (evt.currentTarget.classList.contains(\"fa-image\")) {\n\t\t\t// Turn it into an image\n\t\t\tthis.questions[el.data(\"value\")] = ImageChooser.create(el.children(\"span\"), {\n\t\t\t\tjpeg: true,\n\t\t\t\tmaxHeight: 300,\n\t\t\t\tmaxWidth: 300,\n\t\t\t\ttranscode: true\n\t\t\t});\n\n\t\t\tel.children(\"span\").attr(\"contenteditable\", false);\n\t\t} else {\n\t\t\t// Turn it into text\n\t\t\tthis.questions[el.data(\"value\")].destroy();\n\n\t\t\tel.children(\"span\").text(\"Text here\").attr(\"contenteditable\", true);\n\t\t}\n\n\t\t$(evt.currentTarget).toggleClass(\"fa-image fa-file-alt\");\n\t},\n\n\taddOption: function addOption() {\n\t\tvar el = $(\"<div class='question-options many-option' data-value='\" + this.questionID++ + \"' data-selected='false'><span contenteditable='true'>Option \" + ($(\".question-options\").length + 1) + \"</span><div class='option-host'><div class='checkable fal fa-times'/><div class='format fal fa-image'/><div class='deletable fal fa-trash-alt'/></div></div>\", this.el);\n\n\t\t$(\".placeholder\", this.el).before(el);\n\t},\n\n\tdeleteOption: function deleteOption(evt) {\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\n\t\t// If there are only two options left, don't allow deletion\n\t\tif ($(\"div.question-options\", this.el).length === 2) return;\n\n\t\t// Get the thing we clicked on\n\t\tvar el = $(evt.currentTarget).parents(\"div.question-options\");\n\n\t\tif (el.data(\"value\") in this.questions) this.questions[el.data(\"value\")].destroy();\n\n\t\tif (this.model.get(\"subtype\") !== 1 && el.find(\".fa-check\").length) {\n\t\t\t// This is the right answer, so make something else the right answer\n\t\t\tif ($(\"div.question-options\", this.el).first().is(el)) $(\"div.question-options\", this.el).eq(1).find(\".checkable\").toggleClass(\"fa-times fa-check\");else $(\"div.question-options\", this.el).first().find(\".checkable\").toggleClass(\"fa-times fa-check\");\n\t\t}\n\n\t\tel.remove();\n\t},\n\n\tselect: function select(evt) {\n\t\tvar el = $(evt.currentTarget);\n\n\t\tif (!el.prop(\"contenteditable\")) return false;\n\n\t\twindow.setTimeout(function () {\n\t\t\tvar range = document.createRange();\n\t\t\trange.selectNodeContents(el[0]);\n\t\t\tvar sel = window.getSelection();\n\t\t\tsel.removeAllRanges();\n\t\t\tsel.addRange(range);\n\t\t}, 50);\n\t},\n\n\tunselect: function unselect(evt) {\n\t\twindow.getSelection().removeAllRanges();\n\n\t\t// If this element is now blank, we need to reset it\n\t\tif ($(evt.currentTarget).text().trim() !== \"\") return;\n\n\t\tswitch (evt.currentTarget.id) {\n\t\t\tcase \"iago-heading-text\":\n\t\t\t\t$(evt.currentTarget).text(\"Insert Question\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"iago-help-content-text\":\n\t\t\t\t$(evt.currentTarget).text(\"This is placeholder feedback; click to edit\");\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t$(evt.currentTarget).text(\"Text\");\n\t\t\t\tbreak;\n\t\t}\n\t}\n};\n\nvar QuestionModel = Backbone.Model.extend({\n\tdefaults: {},\n\tvalidateBase: function validateBase(attributes) {\n\t\tvar errors = [];\n\n\t\tif (!attributes.id) errors.push(\"No valid question ID\");\n\n\t\tif (!attributes.question) errors.push(\"You must specify a valid question\");\n\n\t\tif (attributes.expectQuestionImage && !attributes.questionImage) errors.push(\"You must specify a question image, or cancel it\");\n\n\t\tif (attributes.question === \"Insert Question\") errors.push(\"You did not change the default question\");\n\n\t\tif (this.feedback) {\n\t\t\tif (!attributes.feedback) errors.push(\"You must provide feedback\");\n\n\t\t\tif (attributes.feedback === \"This is placeholder feedback; click to edit\") errors.push(\"You did not change the default feedback\");\n\t\t}\n\n\t\treturn errors;\n\t}\n});\n\nModels[\"1.1\"] = QuestionModel.extend({\n\tidAttribute: \"id\",\n\n\tdefaults: {\n\t\ttype: 1,\n\t\tsubtype: 1,\n\t\tquestion: \"Insert Question\",\n\t\tquestionImage: null,\n\t\texpectQuestionImage: false,\n\t\tfeedback: \"This is placeholder feedback; click to edit\",\n\t\tcorrectAnswers: [{\n\t\t\tid: 1,\n\t\t\ttype: \"text\",\n\t\t\tcontent: \"Option 1\"\n\t\t}],\n\t\totherAnswers: [{\n\t\t\tid: 2,\n\t\t\ttype: \"text\",\n\t\t\tcontent: \"Option 2\"\n\t\t}],\n\t\tpotentialScore: 0\n\t},\n\n\tvalidate: function validate(attrs) {\n\t\tvar err = [];\n\n\t\terr = err.concat(this.validateBase(attrs));\n\n\t\tif (attrs.correctAnswers.length === 0) err.push(\"You must choose at least one correct answer\");\n\n\t\tif (_.some(attrs.correctAnswers, function (a) {\n\t\t\treturn !a.content;\n\t\t})) err.push(\"You must specify valid content for all questions\");\n\n\t\tif (err.length > 0) return err;\n\t}\n});\n\n//Choose option\nQuestions[\"1.1\"] = Backbone.Marionette.View.extend({\n\ttemplate: require(\"./templates/assessmentModal.nunj\").questionMarkup,\n\n\tui: {\n\t\tbus: \"#iago-assessment\",\n\t\theadingText: \"#iago-heading-text\",\n\t\theadingImage: \"#iago-question-image .image-placeholder\",\n\t\theadingImageDel: \"#iago-question-image .delete-image\",\n\t\tprevButton: \"#iago-previous-question\",\n\t\tnextButton: \"#iago-next-question\",\n\t\tfeedback: \"#iago-help-content-text\",\n\t\terrors: \".question-errors\",\n\t\tcloseError: \".question-errors .close\",\n\n\t\toption: \".question-options\",\n\t\toptionText: \".question-options span\",\n\n\t\tplaceholder: \".placeholder\",\n\t\ttype: \"div.format\",\n\t\tdeleter: \"div.deletable\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.option\": \"toggleAnswer\",\n\t\t\"click @ui.optionText\": \"editClick\",\n\t\t\"click @ui.headingImage\": \"headingImageClick\",\n\t\t\"click @ui.headingImageDel\": \"deleteHeadingImage\",\n\n\t\t\"click @ui.closeError\": \"closeError\",\n\t\t\"click @ui.type\": \"changeType\",\n\t\t\"click @ui.deleter\": \"deleteOption\",\n\n\t\t//\"paste @ui.headingText\": \"pasted\",\n\t\t//\"paste @ui.optionText\": \"pasted\",\n\t\t//\"paste @ui.feedback\": \"pasted\",\n\n\t\t\"focus @ui.optionText\": \"select\",\n\t\t\"focus @ui.feedback\": \"select\",\n\t\t\"focus @ui.headingText\": \"select\",\n\n\t\t\"blur @ui.headingText\": \"unselect\",\n\t\t\"blur @ui.feedback\": \"unselect\",\n\t\t\"blur @ui.optionText\": \"unselect\"\n\t},\n\n\tmodelEvents: {\n\t\tinvalid: \"validationFail\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\t_.extend(this, MultiQuestions);\n\n\t\tthis.model = options.question || new Models[\"1.1\"]({ id: options.id });\n\n\t\tthis.bindEvents(this.model, this.modelEvents);\n\n\t\tthis.assessment = options.assessment;\n\t\tthis.previewMode = options.previewMode;\n\n\t\tthis.questionID = _.maxBy(this.model.get(\"correctAnswers\").concat(this.model.get(\"otherAnswers\")), function (x) {\n\t\t\treturn x.id;\n\t\t}).id + 1;\n\n\t\tthis.listenTo(Page, \"change:feedback\", this.changeFeedback.bind(this));\n\n\t\tthis.questions = {};\n\n\t\tthis.loaded = this.iagoLoaded.bind(this);\n\t\tthis.navigate = this.iagoNavigate.bind(this);\n\t},\n\n\textraSetup: function extraSetup() {\n\t\tthis.ui.placeholder.on(\"click\", this.addOption.bind(this));\n\t},\n\n\ttoggleAnswer: function toggleAnswer(evt) {\n\t\tevt.preventDefault();\n\t\tevt.stopPropagation();\n\n\t\tvar el = $(\".checkable\", evt.currentTarget);\n\n\t\tel.toggleClass(\"fa-check fa-times\");\n\n\t\tvar answerCount = $(\".checkable.fa-check\").length;\n\t\t$(\".question-mark\").text(answerCount);\n\t}\n});\n\nModels[\"1.2\"] = QuestionModel.extend({\n\tidAttribute: \"id\",\n\n\tdefaults: {\n\t\ttype: 1,\n\t\tsubtype: 2,\n\t\tquestion: \"Insert Question\",\n\t\tquestionImage: null,\n\t\texpectQuestionImage: false,\n\t\tfeedback: \"This is placeholder feedback; click to edit\",\n\t\tcorrectAnswers: [{\n\t\t\tid: 1,\n\t\t\ttype: \"text\",\n\t\t\tcontent: \"Option 1\"\n\t\t}],\n\t\totherAnswers: [{\n\t\t\tid: 2,\n\t\t\ttype: \"text\",\n\t\t\tcontent: \"Option 2\"\n\t\t}],\n\t\tpotentialScore: 0\n\t},\n\n\tvalidate: function validate(attrs) {\n\t\tvar err = [];\n\n\t\terr = err.concat(this.validateBase(attrs));\n\n\t\tif (_.some(attrs.correctAnswers, function (a) {\n\t\t\treturn !a.content;\n\t\t})) err.push(\"You must specify valid content for all questions\");\n\n\t\tif (err.length > 0) return err;\n\t}\n});\n\nQuestions[\"1.2\"] = Backbone.Marionette.View.extend({\n\ttemplate: require(\"./templates/assessmentModal.nunj\").questionMarkup,\n\n\tui: {\n\t\tbus: \"#iago-assessment\",\n\t\theadingText: \"#iago-heading-text\",\n\t\theadingImage: \"#iago-question-image .image-placeholder\",\n\t\theadingImageDel: \"#iago-question-image .delete-image\",\n\t\tprevButton: \"#iago-previous-question\",\n\t\tnextButton: \"#iago-next-question\",\n\t\tfeedback: \"#iago-help-content-text\",\n\t\terrors: \".question-errors\",\n\t\tcloseError: \".question-errors .close\",\n\n\t\toption: \".question-options\",\n\t\toptionText: \".question-options span\",\n\n\t\tplaceholder: \".placeholder\",\n\t\ttype: \"div.format\",\n\t\tdeleter: \"div.deletable\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.option\": \"changeCorrectAnswer\",\n\t\t\"click @ui.optionText\": \"editClick\",\n\t\t\"click @ui.headingImage\": \"headingImageClick\",\n\t\t\"click @ui.headingImageDel\": \"deleteHeadingImage\",\n\n\t\t\"click @ui.closeError\": \"closeError\",\n\t\t\"click @ui.type\": \"changeType\",\n\t\t\"click @ui.deleter\": \"deleteOption\",\n\n\t\t//\"paste @ui.headingText\": \"pasted\",\n\t\t//\"paste @ui.optionText\": \"pasted\",\n\t\t//\"paste @ui.feedback\": \"pasted\",\n\n\t\t\"focus @ui.optionText\": \"select\",\n\t\t\"focus @ui.feedback\": \"select\",\n\t\t\"focus @ui.headingText\": \"select\",\n\n\t\t\"blur @ui.headingText\": \"unselect\",\n\t\t\"blur @ui.feedback\": \"unselect\",\n\t\t\"blur @ui.optionText\": \"unselect\"\n\t},\n\n\tmodelEvents: {\n\t\tinvalid: \"validationFail\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\t_.extend(this, MultiQuestions);\n\n\t\tthis.model = options.question || new Models[\"1.2\"]({ id: options.id });\n\n\t\tthis.bindEvents(this.model, this.modelEvents);\n\n\t\tthis.assessment = options.assessment;\n\t\tthis.previewMode = options.previewMode;\n\n\t\tthis.questionID = _.maxBy(this.model.get(\"correctAnswers\").concat(this.model.get(\"otherAnswers\")), function (x) {\n\t\t\treturn x.id;\n\t\t}).id + 1;\n\n\t\tthis.listenTo(Page, \"change:feedback\", this.changeFeedback.bind(this));\n\n\t\tthis.questions = {};\n\n\t\tthis.loaded = this.iagoLoaded.bind(this);\n\t\tthis.navigate = this.iagoNavigate.bind(this);\n\t},\n\n\textraSetup: function extraSetup() {\n\t\tthis.ui.placeholder.on(\"click\", this.addOption.bind(this));\n\t},\n\n\tchangeCorrectAnswer: function changeCorrectAnswer(evt) {\n\t\tevt.preventDefault();\n\t\tevt.stopPropagation();\n\n\t\tvar el = $(\".checkable\", evt.currentTarget);\n\n\t\tif (el.hasClass(\"fa-check\")) return;\n\n\t\t// Make this item correct and the others wrong\n\t\t$(\".checkable.fa-check\", this.el).add(el).toggleClass(\"fa-check fa-times\");\n\t}\n});\n\nModels[\"1.3\"] = QuestionModel.extend({\n\tidAttribute: \"id\",\n\n\tdefaults: {\n\t\ttype: 1,\n\t\tsubtype: 3,\n\t\tquestion: \"Insert Question\",\n\t\tquestionImage: null,\n\t\texpectQuestionImage: false,\n\t\tfeedback: \"This is placeholder feedback; click to edit\",\n\t\tcorrectAnswers: [{\n\t\t\tid: 1,\n\t\t\ttype: \"text\",\n\t\t\tcontent: \"True\"\n\t\t}],\n\t\totherAnswers: [{\n\t\t\tid: 2,\n\t\t\ttype: \"text\",\n\t\t\tcontent: \"False\"\n\t\t}],\n\t\tpotentialScore: 0\n\t},\n\n\tquestionOptions: [{ closeOnClick: false, title: \"Question Format\", name: \"format\", type: \"choose-one\", elements: [{ text: \"True / False\", id: \"truefalse\", selected: true }, { text: \"Yes / No\", id: \"yesno\" }, { text: \"Before / After\", id: \"beforeafter\" }, { text: \"More / Less\", id: \"moreless\" }] }],\n\n\tvalidate: function validate(attrs) {\n\t\tvar err = [];\n\n\t\terr = err.concat(this.validateBase(attrs));\n\n\t\tif (_.some(attrs.correctAnswers, function (a) {\n\t\t\treturn !a.content;\n\t\t})) err.push(\"You must specify valid content for all questions\");\n\n\t\tif (err.length > 0) return err;\n\t}\n});\n\nQuestions[\"1.3\"] = Backbone.Marionette.View.extend({\n\ttemplate: require(\"./templates/assessmentModal.nunj\").questionMarkup,\n\n\tui: {\n\t\tbus: \"#iago-assessment\",\n\t\theadingText: \"#iago-heading-text\",\n\t\theadingImage: \"#iago-question-image .image-placeholder\",\n\t\theadingImageDel: \"#iago-question-image .delete-image\",\n\t\tprevButton: \"#iago-previous-question\",\n\t\tnextButton: \"#iago-next-question\",\n\t\tfeedback: \"#iago-help-content-text\",\n\t\terrors: \".question-errors\",\n\t\tcloseError: \".question-errors .close\",\n\n\t\toption: \".question-options\",\n\t\toptionText: \".question-options span\",\n\t\ttype: \"div.format\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.option\": \"changeCorrectAnswer\",\n\t\t\"click @ui.optionText\": \"editClick\",\n\t\t\"click @ui.headingImage\": \"headingImageClick\",\n\t\t\"click @ui.headingImageDel\": \"deleteHeadingImage\",\n\n\t\t\"click @ui.closeError\": \"closeError\",\n\n\t\t\"click @ui.type\": \"changeType\",\n\n\t\t//\"paste @ui.headingText\": \"pasted\",\n\t\t//\"paste @ui.optionText\": \"pasted\",\n\t\t//\"paste @ui.feedback\": \"pasted\",\n\n\t\t\"focus @ui.optionText\": \"select\",\n\t\t\"focus @ui.feedback\": \"select\",\n\t\t\"focus @ui.headingText\": \"select\",\n\n\t\t\"blur @ui.headingText\": \"unselect\",\n\t\t\"blur @ui.feedback\": \"unselect\",\n\t\t\"blur @ui.optionText\": \"unselect\"\n\t},\n\n\toptionEvents: {\n\t\t\"clicked:format\": \"changeFormat\"\n\t},\n\n\tmodelEvents: {\n\t\tinvalid: \"validationFail\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\t_.extend(this, MultiQuestions);\n\n\t\tthis.model = options.question || new Models[\"1.3\"]({ id: options.id });\n\n\t\tthis.bindEvents(this.model, this.modelEvents);\n\n\t\tthis.assessment = options.assessment;\n\t\tthis.previewMode = options.previewMode;\n\n\t\tvar lang = options.assessment.get(\"language\");\n\t\tif (!_.includes([\"Afrikaans\", \"English\", \"IsiNdebele\", \"Sepedi\", \"Sesotho\", \"Siswati\", \"Setswana\", \"Xitsonga\", \"Tshivenda\", \"IsiXhosa\", \"IsiZulu\"], lang)) lang = \"English\";\n\n\t\tif (!options.question && lang !== \"English\") {\n\t\t\tthis.model.set(\"correctAnswers\", [{\n\t\t\t\tid: 1,\n\t\t\t\ttype: \"text\",\n\t\t\t\tcontent: Iago.instructions[lang].true\n\t\t\t}]);\n\n\t\t\tthis.model.set(\"otherAnswers\", [{\n\t\t\t\tid: 2,\n\t\t\t\ttype: \"text\",\n\t\t\t\tcontent: Iago.instructions[lang].false\n\t\t\t}]);\n\t\t}\n\n\t\tthis.listenTo(Page, \"change:feedback\", this.changeFeedback.bind(this));\n\n\t\tthis.questions = {};\n\n\t\tthis.loaded = this.iagoLoaded.bind(this);\n\t\tthis.navigate = this.iagoNavigate.bind(this);\n\t},\n\n\tchangeCorrectAnswer: function changeCorrectAnswer(evt) {\n\t\tevt.preventDefault();\n\t\tevt.stopPropagation();\n\n\t\tvar el = $(\".checkable\", evt.currentTarget);\n\n\t\tif (el.hasClass(\"fa-check\")) return;\n\n\t\t// Make this item correct and the others wrong\n\t\t$(\".checkable\", this.el).toggleClass(\"fa-check fa-times\");\n\t},\n\n\tchangeFormat: function changeFormat(elem) {\n\t\tvar els = $(\".question-options span\", this.el);\n\n\t\tvar lang = this.assessment.get(\"language\");\n\t\tif (!_.includes([\"Afrikaans\", \"English\", \"IsiNdebele\", \"Sepedi\", \"Sesotho\", \"Siswati\", \"Setswana\", \"Xitsonga\", \"Tshivenda\", \"IsiXhosa\", \"IsiZulu\"], lang)) lang = \"English\";\n\n\t\tvar text = Iago.instructions[lang];\n\n\t\tswitch (elem.id) {\n\t\t\tcase \"truefalse\":\n\t\t\t\tels[0].innerHTML = text.true;\n\t\t\t\tels[1].innerHTML = text.false;\n\t\t\t\tbreak;\n\n\t\t\tcase \"yesno\":\n\t\t\t\tels[0].innerHTML = text.yes;\n\t\t\t\tels[1].innerHTML = text.no;\n\t\t\t\tbreak;\n\n\t\t\tcase \"beforeafter\":\n\t\t\t\tels[0].innerHTML = text.before;\n\t\t\t\tels[1].innerHTML = text.after;\n\t\t\t\tbreak;\n\n\t\t\tcase \"moreless\":\n\t\t\t\tels[0].innerHTML = text.more;\n\t\t\t\tels[1].innerHTML = text.less;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tif (!settings.debug || settings.reportErrors) raygun(\"send\", new Error(\"Invalid assessment case supplied\"));\n\t\t\t\tbreak;\n\t\t}\n\t}\n});\n\nModels[\"2\"] = QuestionModel.extend({\n\tidAttribute: \"id\",\n\n\tdefaults: {\n\t\ttype: 2,\n\t\tquestion: \"Insert Question\",\n\t\tquestionImage: null,\n\t\texpectQuestionImage: false,\n\t\tfeedback: \"This is placeholder feedback; click to edit\",\n\t\tpotentialScore: 0\n\t},\n\n\tvalidate: function validate(attrs) {\n\t\tvar err = [];\n\n\t\terr = err.concat(this.validateBase(attrs));\n\n\t\tif (!attrs.potentialScore || attrs.potentialScore < 0 || attrs.potentialScore > 1000) err.push(\"You must choose a valid mark between 1 and 1000\");\n\n\t\tif (err.length > 0) return err;\n\t}\n});\n\n//Paragraph question\nQuestions[\"2\"] = Backbone.Marionette.View.extend({\n\ttemplate: require(\"./templates/assessmentModal.nunj\").questionMarkup,\n\n\tui: {\n\t\tbus: \"#iago-assessment\",\n\t\theadingText: \"#iago-heading-text\",\n\t\theadingImage: \"#iago-question-image .image-placeholder\",\n\t\theadingImageDel: \"#iago-question-image .delete-image\",\n\t\tprevButton: \"#iago-previous-question\",\n\t\tnextButton: \"#iago-next-question\",\n\t\tfeedback: \"#iago-help-content-text\",\n\t\terrors: \".question-errors\",\n\t\tcloseError: \".question-errors .close\",\n\n\t\tpotentialScore: \"input[type='number']\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.headingImage\": \"headingImageClick\",\n\t\t\"click @ui.headingImageDel\": \"deleteHeadingImage\",\n\n\t\t//\"paste @ui.headingText\": \"pasted\",\n\t\t//\"paste @ui.feedback\": \"pasted\",\n\n\t\t\"focus @ui.feedback\": \"select\",\n\t\t\"focus @ui.headingText\": \"select\",\n\n\t\t\"blur @ui.headingText\": \"unselect\",\n\t\t\"blur @ui.feedback\": \"unselect\",\n\n\t\t\"keyup @ui.potentialScore\": \"changeQuestionMark\",\n\t\t\"mouseup @ui.potentialScore\": \"changeQuestionMark\",\n\t\t\"mousewheel @ui.potentialScore\": \"changeQuestionMark\"\n\t},\n\n\tmodelEvents: {\n\t\tinvalid: \"validationFail\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.model = options.question || new Models[\"2\"]({ id: options.id });\n\n\t\tthis.bindEvents(this.model, this.modelEvents);\n\n\t\tthis.assessment = options.assessment;\n\t\tthis.previewMode = options.previewMode;\n\n\t\tthis.listenTo(Page, \"change:feedback\", this.changeFeedback.bind(this));\n\n\t\tthis.questions = {};\n\n\t\tthis.loaded = this.iagoLoaded.bind(this);\n\t\tthis.navigate = this.iagoNavigate.bind(this);\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.ui.bus.get(0).addEventListener(\"iago:loaded\", this.loaded);\n\t\tthis.ui.bus.get(0).addEventListener(\"iago:navigate\", this.navigate);\n\n\t\tthis.ui.feedback.attr(\"contenteditable\", this.assessment.get(\"feedback\"));\n\t\tthis.model.feedback = this.assessment.get(\"feedback\");\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.trigger(\"destroyed\", this.model);\n\n\t\t_.each(this.questions, function (el) {\n\t\t\treturn el.destroy();\n\t\t});\n\n\t\tthis.ui.bus.get(0).removeEventListener(\"iago:loaded\", this.loaded);\n\t\tthis.ui.bus.get(0).removeEventListener(\"iago:navigate\", this.navigate);\n\t},\n\n\tpasted: function pasted(e) {\n\t\te.stopPropagation();\n\n\t\tif (!e.originalEvent.clipboardData) return;\n\n\t\t// Check if there's a selection\n\t\tvar sel = window.getSelection();\n\t\tif (sel.rangeCount) {\n\t\t\te.preventDefault();\n\t\t\tvar range = sel.getRangeAt(0);\n\t\t\trange.deleteContents();\n\t\t\trange.insertNode(document.createTextNode(e.originalEvent.clipboardData.getData(\"text/plain\")));\n\n\t\t\tsel.removeAllRanges();\n\t\t}\n\t},\n\n\tselect: function select(evt) {\n\t\tvar el = $(evt.currentTarget);\n\n\t\tif (!el.prop(\"contenteditable\")) return false;\n\n\t\twindow.setTimeout(function () {\n\t\t\tvar range = document.createRange();\n\t\t\trange.selectNodeContents(el[0]);\n\t\t\tvar sel = window.getSelection();\n\t\t\tsel.removeAllRanges();\n\t\t\tsel.addRange(range);\n\t\t}, 50);\n\t},\n\n\tunselect: function unselect(evt) {\n\t\twindow.getSelection().removeAllRanges();\n\n\t\t// If this element is now blank, we need to reset it\n\t\tif (_.trim($(evt.currentTarget).text()) === \"\") {\n\t\t\tswitch (evt.currentTarget.id) {\n\t\t\t\tcase \"iago-heading-text\":\n\t\t\t\t\t$(evt.currentTarget).text(\"Insert Question\");\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"iago-help-content-text\":\n\t\t\t\t\t$(evt.currentTarget).text(\"This is placeholder feedback; click to edit\");\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t$(evt.currentTarget).text(\"Text\");\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t},\n\n\tchangeFeedback: function changeFeedback(state) {\n\t\tif (this.previewMode) return;\n\n\t\tthis.model.feedback = state;\n\t\tthis.ui.feedback.attr(\"contenteditable\", state);\n\n\t\tif (!this.model.get(\"feedback\")) this.model.set(\"feedback\", \"This is placeholder feedback; click to edit\");\n\n\t\tif (state) this.ui.feedback.addClass(\"iago-editable-dark\").text(this.model.get(\"feedback\"));else this.ui.feedback.removeClass(\"iago-editable-dark\");\n\t},\n\n\theadingImageClick: function headingImageClick(e) {\n\t\tif (e && $(e.currentTarget).hasClass(\"imageChooser\")) return;\n\n\t\tthis.headingImage = ImageChooser.create($(\".image-placeholder\", this.el), {\n\t\t\tjpeg: true,\n\t\t\tmaxHeight: 250,\n\t\t\tmaxWidth: 300,\n\t\t\ttranscode: true\n\t\t});\n\n\t\tthis.ui.headingImageDel.removeClass(\"hide\");\n\t\tthis.model.set({ expectQuestionImage: true });\n\t},\n\n\tdeleteHeadingImage: function deleteHeadingImage() {\n\t\tif (this.headingImage) {\n\t\t\tthis.headingImage.destroy();\n\t\t\tthis.headingImage = null;\n\t\t}\n\n\t\t$(\".image-placeholder\", this.el).replaceWith('<div class=\"image-placeholder\">Click to add an optional image to the title</div>');\n\t\tthis.ui.headingImageDel.addClass(\"hide\");\n\t\tthis.model.set({ expectQuestionImage: false });\n\t},\n\n\tiagoLoaded: function iagoLoaded() {\n\t\tthis.bindUIElements();\n\t\tthis.delegateEvents();\n\t\tthis.changeQuestionMark();\n\t\t// Check for feedback mode\n\t\tif (this.assessment.get(\"feedback\")) this.changeFeedback(true);\n\n\t\tif (this.model.get(\"expectQuestionImage\") && !this.previewMode) {\n\t\t\tthis.headingImageClick();\n\t\t\tthis.headingImage.setImage(this.model.get(\"questionImage\"));\n\t\t}\n\t\tthis.changeQuestionMark();\n\t},\n\n\tiagoNavigate: function iagoNavigate(evt) {\n\t\t// Save this model, then navigate\n\t\tif (this.save()) this.trigger(\"iago:navigate\", evt);\n\n\t\tthis.changeQuestionMark();\n\t},\n\n\tsave: function save(noValidation, noFeedback) {\n\t\tif (!this.ui.headingText.text) return;\n\n\t\tvar question = _.trim(this.ui.headingText.text());\n\t\tvar feedback = this.assessment.get(\"feedback\") && !noFeedback ? _.trim(this.ui.feedback.text()) : \"\";\n\t\tvar questionImage = null;\n\n\t\tif (this.headingImage) questionImage = this.headingImage.getImage();\n\n\t\tthis.model.set({\n\t\t\tfeedback: feedback,\n\t\t\tpotentialScore: parseInt(this.ui.potentialScore.val(), 10),\n\t\t\tquestion: question,\n\t\t\tquestionImage: questionImage,\n\t\t\texpectQuestionImage: questionImage !== null\n\t\t});\n\n\t\tif (!noValidation) return this.model.isValid();\n\t},\n\n\tvalidationFail: function validationFail() {\n\t\tif (this.previewMode) return;\n\t\t// Build the errors to show\n\t\tvar errs = this.model.validationError.slice(0);\n\t\terrs.unshift(\"<strong>The current question has errors and cannot be saved:</strong><br/>\");\n\n\t\tthis.ui.errors.removeClass(\"hide\").children(\".detail\").html(errs.join(\"<br/>&middot;&nbsp;\"));\n\t},\n\n\tcloseError: function closeError() {\n\t\tthis.ui.errors.addClass(\"hide\");\n\t},\n\n\tchangeQuestionMark: function changeQuestionMark() {\n\t\tif ($(\".match-options.left\").length > 0) return;\n\n\t\tvar mark = this.model.get(\"potentialScore\");\n\n\t\tif (_.isString(this.ui.potentialScore) === false) {\n\t\t\tif (_.isArray(this.ui.potentialScore)) mark = this.ui.potentialScore.val() ? this.ui.potentialScore.val() : this.model.get(\"potentialScore\");\n\n\t\t\tif (this.model.get(\"potentialScore\") !== this.ui.potentialScore.val()) mark = this.ui.potentialScore.val();\n\n\t\t\tmark = mark === 0 || mark === undefined ? $(\".question-content input[type='number']\").val() : mark;\n\t\t} else {\n\t\t\tmark = 0;\n\t\t}\n\t\t$(\".question-mark\").text(mark);\n\t}\n});\n\nModels[\"3\"] = QuestionModel.extend({\n\tidAttribute: \"id\",\n\n\tdefaults: {\n\t\ttype: 3,\n\t\tquestion: \"Insert Question\",\n\t\tquestionImage: null,\n\t\texpectQuestionImage: false,\n\t\tfeedback: \"This is placeholder feedback; click to edit\",\n\t\tleft: [{\n\t\t\tid: 1,\n\t\t\ttype: \"text\",\n\t\t\tcontent: \"Question 1 here\"\n\t\t}, {\n\t\t\tid: 2,\n\t\t\ttype: \"text\",\n\t\t\tcontent: \"Question 2 here\"\n\t\t}],\n\t\tright: [{\n\t\t\tid: 1,\n\t\t\ttype: \"text\",\n\t\t\tcontent: \"Answer 1 here\"\n\t\t}, {\n\t\t\tid: 2,\n\t\t\ttype: \"text\",\n\t\t\tcontent: \"Answer 2 here\"\n\t\t}],\n\t\tpotentialScore: 0\n\t},\n\n\tvalidate: function validate(attrs) {\n\t\tvar err = [];\n\n\t\terr = err.concat(this.validateBase(attrs));\n\n\t\tif (attrs.left.length < 2) err.push(\"You must add at least two question pairs\");\n\n\t\tif (attrs.left.length !== attrs.right.length) err.push(\"The left options must be equal to the right options.\");\n\n\t\tif (_.some(attrs.left, function (a) {\n\t\t\treturn !a.content;\n\t\t})) err.push(\"You must specify valid content for all questions\");\n\t\tif (_.some(attrs.right, function (a) {\n\t\t\treturn !a.content;\n\t\t})) err.push(\"You must specify valid content for all questions\");\n\n\t\tif (err.length > 0) return err;\n\t}\n});\n\nQuestions[\"3\"] = Backbone.Marionette.View.extend({\n\ttemplate: require(\"./templates/assessmentModal.nunj\").questionMarkup,\n\n\tui: {\n\t\tbus: \"#iago-assessment\",\n\t\theadingText: \"#iago-heading-text\",\n\t\theadingImage: \"#iago-question-image .image-placeholder\",\n\t\theadingImageDel: \"#iago-question-image .delete-image\",\n\t\tprevButton: \"#iago-previous-question\",\n\t\tnextButton: \"#iago-next-question\",\n\t\tfeedback: \"#iago-help-content-text\",\n\t\terrors: \".question-errors\",\n\t\tcloseError: \".question-errors .close\",\n\n\t\tleft: \"#listleft\",\n\t\tright: \"#listright\",\n\n\t\toptionText: \".match-options span\",\n\n\t\tplaceholder: \".placeholder\",\n\t\ttype: \"div.format\",\n\t\tdeleter: \"div.deletable\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.option\": \"toggleAnswer\",\n\t\t\"click @ui.headingImage\": \"headingImageClick\",\n\t\t\"click @ui.headingImageDel\": \"deleteHeadingImage\",\n\n\t\t\"click @ui.closeError\": \"closeError\",\n\t\t\"click @ui.type\": \"changeType\",\n\t\t\"click @ui.deleter\": \"deleteOption\",\n\n\t\t//\"paste @ui.headingText\": \"pasted\",\n\t\t//\"paste @ui.feedback\": \"pasted\",\n\t\t//\"paste @ui.optionText\": \"pasted\",\n\n\t\t\"focus @ui.feedback\": \"select\",\n\t\t\"focus @ui.headingText\": \"select\",\n\t\t\"focus @ui.optionText\": \"select\",\n\n\t\t\"blur @ui.headingText\": \"unselect\",\n\t\t\"blur @ui.feedback\": \"unselect\",\n\t\t\"blur @ui.optionText\": \"unselect\"\n\t},\n\n\tmodelEvents: {\n\t\tinvalid: \"validationFail\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.model = options.question || new Models[\"3\"]({ id: options.id });\n\n\t\tthis.bindEvents(this.model, this.modelEvents);\n\n\t\tthis.assessment = options.assessment;\n\t\tthis.previewMode = options.previewMode;\n\n\t\tthis.questionID = _.maxBy(this.model.get(\"left\"), function (x) {\n\t\t\treturn x.id;\n\t\t}).id + 1;\n\n\t\tthis.listenTo(Page, \"change:feedback\", this.changeFeedback.bind(this));\n\n\t\tthis.questions = { left: {}, right: {} };\n\n\t\tthis.loaded = this.iagoLoaded.bind(this);\n\t\tthis.navigate = this.iagoNavigate.bind(this);\n\n\t\t$(\".question-mark\").text($(\".match-options.left\").length);\n\t},\n\n\tpasted: function pasted(e) {\n\t\te.stopPropagation();\n\t\te.preventDefault();\n\n\t\tif (!e.originalEvent.clipboardData) return;\n\n\t\t$(e.currentTarget).text(e.originalEvent.clipboardData.getData(\"text/plain\"));\n\t},\n\n\tselect: function select(evt) {\n\t\tvar el = $(evt.currentTarget);\n\t\tif (!el.prop(\"contenteditable\")) return false;\n\n\t\twindow.setTimeout(function () {\n\t\t\tvar range = document.createRange();\n\t\t\trange.selectNodeContents(el[0]);\n\t\t\tvar sel = window.getSelection();\n\t\t\tsel.removeAllRanges();\n\t\t\tsel.addRange(range);\n\t\t}, 50);\n\t},\n\n\tunselect: function unselect(evt) {\n\t\twindow.getSelection().removeAllRanges();\n\n\t\t// If this element is now blank, we need to reset it\n\t\tif (_.trim($(evt.currentTarget).text()) === \"\") {\n\t\t\tswitch (evt.currentTarget.id) {\n\t\t\t\tcase \"iago-heading-text\":\n\t\t\t\t\t$(evt.currentTarget).text(\"Insert Question\");\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"iago-help-content-text\":\n\t\t\t\t\t$(evt.currentTarget).text(\"This is placeholder feedback; click to edit\");\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t$(evt.currentTarget).text(\"Text\");\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t},\n\n\ttoggleAnswer: function toggleAnswer(evt) {\n\t\tevt.preventDefault();\n\t\tevt.stopPropagation();\n\n\t\tvar el = $(\".checkable\", evt.currentTarget);\n\n\t\tel.toggleClass(\"fa-check fa-times\");\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.ui.bus.get(0).addEventListener(\"iago:loaded\", this.loaded);\n\t\tthis.ui.bus.get(0).addEventListener(\"iago:navigate\", this.navigate);\n\n\t\tthis.ui.feedback.attr(\"contenteditable\", this.assessment.get(\"feedback\"));\n\t\tthis.model.feedback = this.assessment.get(\"feedback\");\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.trigger(\"destroyed\", this.model);\n\n\t\t_.each(this.questions.left, function (el) {\n\t\t\treturn el.destroy();\n\t\t});\n\t\t_.each(this.questions.right, function (el) {\n\t\t\treturn el.destroy();\n\t\t});\n\n\t\tthis.ui.bus.get(0).removeEventListener(\"iago:loaded\", this.loaded);\n\t\tthis.ui.bus.get(0).removeEventListener(\"iago:navigate\", this.navigate);\n\t},\n\n\tchangeFeedback: function changeFeedback(state) {\n\t\tif (this.previewMode) return;\n\n\t\tthis.model.feedback = state;\n\t\tthis.ui.feedback.attr(\"contenteditable\", state);\n\n\t\tif (!this.model.get(\"feedback\")) this.model.set(\"feedback\", \"This is placeholder feedback; click to edit\");\n\n\t\tif (state) this.ui.feedback.addClass(\"iago-editable-dark\").text(this.model.get(\"feedback\"));else this.ui.feedback.removeClass(\"iago-editable-dark\");\n\t},\n\n\theadingImageClick: function headingImageClick(e) {\n\t\tif (e && $(e.currentTarget).hasClass(\"imageChooser\")) return;\n\n\t\tthis.headingImage = ImageChooser.create($(\".image-placeholder\", this.el), {\n\t\t\tjpeg: true,\n\t\t\tmaxHeight: 250,\n\t\t\tmaxWidth: 300,\n\t\t\ttranscode: true\n\t\t});\n\n\t\tthis.ui.headingImageDel.removeClass(\"hide\");\n\t\tthis.model.set({ expectQuestionImage: true });\n\t},\n\n\tdeleteHeadingImage: function deleteHeadingImage() {\n\t\tif (this.headingImage) {\n\t\t\tthis.headingImage.destroy();\n\t\t\tthis.headingImage = null;\n\t\t}\n\n\t\t$(\".image-placeholder\", this.el).replaceWith('<div class=\"image-placeholder\">Click to add an optional image to the title</div>');\n\t\tthis.ui.headingImageDel.addClass(\"hide\");\n\t\tthis.model.set({ expectQuestionImage: false });\n\t},\n\n\tiagoLoaded: function iagoLoaded() {\n\t\tvar _this5 = this;\n\n\t\tthis.bindUIElements();\n\t\tthis.delegateEvents();\n\n\t\t// Check for images and construct accordingly\n\t\t_.each(this.model.get(\"left\"), function (el) {\n\t\t\tif (el.type === \"image\") {\n\t\t\t\t_this5.questions.left[el.id.toString()] = ImageChooser.create($(\".match-options.left[data-value='\" + el.id + \"']\").children(\"span\"), {\n\t\t\t\t\tjpeg: true,\n\t\t\t\t\tmaxHeight: 300,\n\t\t\t\t\tmaxWidth: 300,\n\t\t\t\t\ttranscode: true\n\t\t\t\t});\n\n\t\t\t\t_this5.questions.left[el.id.toString()].setImage(el.content);\n\t\t\t}\n\t\t});\n\n\t\t_.each(this.model.get(\"right\"), function (el) {\n\t\t\tif (el.type === \"image\") {\n\t\t\t\t_this5.questions.right[el.id.toString()] = ImageChooser.create($(\".match-options.right[data-value='\" + el.id + \"']\").children(\"span\"), {\n\t\t\t\t\tjpeg: true,\n\t\t\t\t\tmaxHeight: 300,\n\t\t\t\t\tmaxWidth: 300,\n\t\t\t\t\ttranscode: true\n\t\t\t\t});\n\n\t\t\t\t_this5.questions.right[el.id.toString()].setImage(el.content);\n\t\t\t}\n\t\t});\n\n\t\tif (this.model.get(\"expectQuestionImage\") && !this.previewMode) {\n\t\t\tthis.headingImageClick();\n\t\t\tthis.headingImage.setImage(this.model.get(\"questionImage\"));\n\t\t}\n\n\t\t// Check for feedback mode\n\t\tif (this.assessment.get(\"feedback\")) this.changeFeedback(true);\n\n\t\tthis.ui.placeholder.on(\"click\", this.addOption.bind(this));\n\n\t\t$(\".question-mark\").text($(\".match-options.left\").length);\n\n\t\tif ($(\".match-options.left\").length > 11) $(\".placeholder\").addClass(\"hide\");else $(\".placeholder\").removeClass(\"hide\");\n\t},\n\n\tiagoNavigate: function iagoNavigate(evt) {\n\t\t// Save this model, then navigate\n\t\tif (this.save()) this.trigger(\"iago:navigate\", evt);\n\t},\n\n\tsave: function save(noValidation, noFeedback) {\n\t\tvar _this6 = this;\n\n\t\tif (!this.ui.headingText.text) return;\n\n\t\tvar left = $(\".match-options\", this.ui.left);\n\t\tvar right = $(\".match-options\", this.ui.right);\n\n\t\tvar question = _.trim(this.ui.headingText.text());\n\t\tvar feedback = this.assessment.get(\"feedback\") && !noFeedback ? _.trim(this.ui.feedback.text()) : \"\";\n\t\tvar questionImage = null;\n\n\t\tif (this.headingImage) questionImage = this.headingImage.getImage();\n\n\t\tthis.model.set({\n\t\t\tquestion: question,\n\t\t\tquestionImage: questionImage,\n\t\t\texpectQuestionImage: questionImage !== null,\n\t\t\tfeedback: feedback,\n\t\t\tleft: _.map(left.toArray(), function (el) {\n\t\t\t\tvar element = $(el);\n\t\t\t\tvar span = element.children(\"span\");\n\n\t\t\t\treturn {\n\t\t\t\t\tid: parseInt(element.data(\"value\"), 10),\n\t\t\t\t\ttype: span.hasClass(\"imageChooser\") ? \"image\" : \"text\",\n\t\t\t\t\tcontent: span.hasClass(\"imageChooser\") ? _this6.questions.left[element.data(\"value\")].getImage() : span.text()\n\t\t\t\t};\n\t\t\t}),\n\t\t\tright: _.map(right.toArray(), function (el) {\n\t\t\t\tvar element = $(el);\n\t\t\t\tvar span = element.children(\"span\");\n\n\t\t\t\treturn {\n\t\t\t\t\tid: parseInt(element.data(\"value\"), 10),\n\t\t\t\t\ttype: span.hasClass(\"imageChooser\") ? \"image\" : \"text\",\n\t\t\t\t\tcontent: span.hasClass(\"imageChooser\") ? _this6.questions.right[element.data(\"value\")].getImage() : span.text()\n\t\t\t\t};\n\t\t\t})\n\t\t});\n\n\t\tthis.model.set({ potentialScore: this.model.get(\"left\").length });\n\n\t\tif (!noValidation) return this.model.isValid();\n\t},\n\n\tvalidationFail: function validationFail() {\n\t\tif (this.previewMode) return;\n\t\t// Build the errors to show\n\t\tvar errs = this.model.validationError.slice(0);\n\t\terrs.unshift(\"<strong>The current question has errors and cannot be saved:</strong><br/>\");\n\n\t\tthis.ui.errors.removeClass(\"hide\").children(\".detail\").html(errs.join(\"<br/>&middot;&nbsp;\"));\n\t},\n\n\tcloseError: function closeError() {\n\t\tthis.ui.errors.addClass(\"hide\");\n\t},\n\n\teditClick: function editClick(evt) {\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\t},\n\n\tchangeType: function changeType(evt) {\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\n\t\t// Get the thing we clicked on\n\t\tvar el = $(evt.currentTarget).parents(\"div.match-options\");\n\n\t\tvar side = el.hasClass(\"left\") ? \"left\" : \"right\";\n\n\t\t// Change its type\n\t\tif (evt.currentTarget.classList.contains(\"fa-image\")) {\n\t\t\t// Turn it into an image\n\t\t\tthis.questions[side][el.data(\"value\")] = ImageChooser.create(el.children(\"span\"), { transcode: true, jpeg: true, maxHeight: 300, maxWidth: 300 });\n\t\t\tel.children(\"span\").attr(\"contenteditable\", false);\n\t\t} else {\n\t\t\t// Turn it into text\n\t\t\tthis.questions[side][el.data(\"value\")].destroy();\n\n\t\t\tel.children(\"span\").text(\"Text here\").attr(\"contenteditable\", true);\n\t\t}\n\n\t\t$(evt.currentTarget).toggleClass(\"fa-image fa-file-alt\");\n\t},\n\n\taddOption: function addOption() {\n\t\tthis.ui.left.append(\"<div class=\\\"match-options left\\\" data-match=\\\"0\\\" data-correctmatch=\\\"0\\\" data-selected=\\\"false\\\" data-column=\\\"left\\\" data-value=\\\"\" + this.questionID + \"\\\">\\n\\t\\t\\t<span contenteditable=\\\"true\\\">Question here</span><div class=\\\"border\\\"></div><div class=\\\"option-host\\\"><div class=\\\"format fal fa-image\\\"></div></div></div>\");\n\t\tthis.ui.right.append(\"<div class=\\\"match-options right\\\" data-match=\\\"0\\\" data-correctmatch=\\\"0\\\" data-selected=\\\"false\\\" data-column=\\\"right\\\" data-value=\\\"\" + this.questionID + \"\\\">\\n\\t\\t\\t<div class=\\\"border\\\"></div><span contenteditable=\\\"true\\\">Answer here</span><div class=\\\"option-host\\\"><div class=\\\"format fal fa-image\\\"></div>\\n\\t\\t\\t<div class=\\\"deletable fal fa-trash-alt\\\"></div></div></div>\");\n\n\t\tthis.questionID++;\n\n\t\t// If there are 12 options, hide the placeholder\n\t\tif ($(\".match-options\", this.ui.left).length >= 12) $(\".placeholder\", this.el).addClass(\"invisible\");\n\n\t\t$(\".question-mark\").text(parseInt($(\".question-mark\").text(), 10) + 1);\n\t},\n\n\tdeleteOption: function deleteOption(evt) {\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\n\t\t// If there are only two options left, don't allow deletion\n\t\tif ($(\".match-options\", this.ui.left).length > 2 || $(\".match-options\", this.ui.right).length > 2) {\n\t\t\t// Get the thing we clicked on\n\t\t\tvar el = $(evt.currentTarget).parents(\"div.match-options\");\n\n\t\t\tif (el.data(\"value\") in this.questions.left) this.questions.left[el.data(\"value\")].destroy();\n\n\t\t\tif (el.data(\"value\") in this.questions.right) this.questions.right[el.data(\"value\")].destroy();\n\n\t\t\tel.add($(\"[data-value='\" + el.data(\"value\") + \"']\", this.ui.left)).remove();\n\n\t\t\t$(\".placeholder\", this.el).removeClass(\"invisible\");\n\n\t\t\t$(\".question-mark\").text(parseInt($(\".question-mark\").text(), 10) - 1);\n\t\t}\n\n\t\tif ($(\".match-options.left\").length > 11) $(\".placeholder\").addClass(\"hide\");else $(\".placeholder\").removeClass(\"hide\");\n\t}\n});\n\nModels[\"4\"] = QuestionModel.extend({\n\tidAttribute: \"id\",\n\n\tdefaults: {\n\t\ttype: 4,\n\t\tquestion: \"Insert Question\",\n\t\tquestionImage: null,\n\t\texpectQuestionImage: false,\n\t\tfeedback: \"This is placeholder feedback; click to edit\",\n\t\tanswer: {\n\t\t\ttype: \"blank\",\n\t\t\tcontent: \"To mark sections of text for the user to enter, select some text and then click \\\"Mark\\\". To undo, double-click a selected block.\"\n\t\t},\n\t\tpotentialScore: 0\n\t},\n\n\tvalidate: function validate(attrs) {\n\t\tvar err = [];\n\n\t\terr = err.concat(this.validateBase(attrs));\n\n\t\tif (attrs.answer.content.search(/\\[.+?\\]/gi) === -1) err.push(\"You must mark at least one section of text for the user to enter\");\n\n\t\tif (err.length > 0) return err;\n\t}\n});\n\nQuestions[\"4\"] = Backbone.Marionette.View.extend({\n\ttemplate: require(\"./templates/assessmentModal.nunj\").questionMarkup,\n\n\tui: {\n\t\tbus: \"#iago-assessment\",\n\t\theadingText: \"#iago-heading-text\",\n\t\theadingImage: \"#iago-question-image .image-placeholder\",\n\t\theadingImageDel: \"#iago-question-image .delete-image\",\n\t\tprevButton: \"#iago-previous-question\",\n\t\tnextButton: \"#iago-next-question\",\n\t\tfeedback: \"#iago-help-content-text\",\n\t\terrors: \".question-errors\",\n\t\tcloseError: \".question-errors .close\",\n\n\t\tcontent: \"#iago-question-content\",\n\t\tmarker: \".iago-marker\",\n\t\tparagraph: \".blankParagraph\",\n\t\thighlight: \".blankParagraph span.input\",\n\t\tpreviewParagraph: \".previewParagraph\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.closeError\": \"closeError\",\n\t\t\"click @ui.marker\": \"makeSelection\",\n\t\t\"click @ui.headingImage\": \"headingImageClick\",\n\t\t\"click @ui.headingImageDel\": \"deleteHeadingImage\",\n\n\t\t\"mouseover @ui.marker\": \"makeSelection\",\n\n\t\t\"dblclick @ui.highlight\": \"clearSelection\",\n\n\t\t//\"paste @ui.headingText\": \"pasted\",\n\t\t//\"paste @ui.paragraph\": \"pasted\",\n\t\t//\"paste @ui.feedback\": \"pasted\",\n\n\t\t\"focus @ui.feedback\": \"select\",\n\t\t\"focus @ui.headingText\": \"select\",\n\n\t\t\"blur @ui.headingText\": \"unselect\",\n\t\t\"blur @ui.feedback\": \"unselect\"\n\t},\n\n\tmodelEvents: {\n\t\tinvalid: \"validationFail\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.model = options.question || new Models[\"4\"]({ id: options.id });\n\n\t\tthis.bindEvents(this.model, this.modelEvents);\n\n\t\tthis.assessment = options.assessment;\n\t\tthis.previewMode = options.previewMode;\n\n\t\tthis.listenTo(Page, \"change:feedback\", this.changeFeedback.bind(this));\n\n\t\tthis.loaded = this.iagoLoaded.bind(this);\n\t\tthis.navigate = this.iagoNavigate.bind(this);\n\n\t\tthis.previewMode = options && options.previewMode;\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.ui.bus.get(0).addEventListener(\"iago:loaded\", this.loaded);\n\t\tthis.ui.bus.get(0).addEventListener(\"iago:navigate\", this.navigate);\n\n\t\tthis.ui.feedback.attr(\"contenteditable\", this.assessment.get(\"feedback\"));\n\t\tthis.model.feedback = this.assessment.get(\"feedback\");\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.trigger(\"destroyed\", this.model);\n\n\t\tthis.ui.bus.get(0).removeEventListener(\"iago:loaded\", this.loaded);\n\t\tthis.ui.bus.get(0).removeEventListener(\"iago:navigate\", this.navigate);\n\t},\n\n\tpasted: function pasted(e) {\n\t\te.stopPropagation();\n\t\te.preventDefault();\n\n\t\tif (!e.originalEvent.clipboardData) return;\n\n\t\tvar data = e.originalEvent.clipboardData.getData(\"text/plain\");\n\t\tif (e.currentTarget.className === \"blankParagraph\") data = data.replace(/(?:\\r\\n|\\r|\\n)/g, \"\");\n\n\t\t$(e.currentTarget).text(data);\n\t},\n\n\tselect: function select(evt) {\n\t\tvar el = $(evt.currentTarget);\n\n\t\tif (!el.prop(\"contenteditable\")) return false;\n\n\t\twindow.setTimeout(function () {\n\t\t\tvar range = document.createRange();\n\t\t\trange.selectNodeContents(el[0]);\n\t\t\tvar sel = window.getSelection();\n\t\t\tsel.removeAllRanges();\n\t\t\tsel.addRange(range);\n\t\t}, 50);\n\t},\n\n\tunselect: function unselect(evt) {\n\t\twindow.getSelection().removeAllRanges();\n\n\t\t// If this element is now blank, we need to reset it\n\t\tif (_.trim($(evt.currentTarget).text()) === \"\") {\n\t\t\tswitch (evt.currentTarget.id) {\n\t\t\t\tcase \"iago-heading-text\":\n\t\t\t\t\t$(evt.currentTarget).text(\"Insert Question\");\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"iago-help-content-text\":\n\t\t\t\t\t$(evt.currentTarget).text(\"This is placeholder feedback; click to edit\");\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t$(evt.currentTarget).text(\"Text\");\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t},\n\n\tchangeFeedback: function changeFeedback(state) {\n\t\tif (this.previewMode) return;\n\n\t\tthis.model.feedback = state;\n\t\tthis.ui.feedback.attr(\"contenteditable\", state);\n\n\t\tif (!this.model.get(\"feedback\")) this.model.set(\"feedback\", \"This is placeholder feedback; click to edit\");\n\n\t\tif (state) this.ui.feedback.addClass(\"iago-editable-dark\").text(this.model.get(\"feedback\"));else this.ui.feedback.removeClass(\"iago-editable-dark\");\n\t},\n\n\theadingImageClick: function headingImageClick(e) {\n\t\tif (e && $(e.currentTarget).hasClass(\"imageChooser\")) return;\n\n\t\tthis.headingImage = ImageChooser.create($(\".image-placeholder\", this.el), {\n\t\t\ttranscode: true,\n\t\t\tjpeg: true,\n\t\t\tmaxHeight: 250,\n\t\t\tmaxWidth: 300\n\t\t});\n\n\t\tthis.ui.headingImageDel.removeClass(\"hide\");\n\t\tthis.model.set({ expectQuestionImage: true });\n\t},\n\n\tdeleteHeadingImage: function deleteHeadingImage() {\n\t\tif (this.headingImage) {\n\t\t\tthis.headingImage.destroy();\n\t\t\tthis.headingImage = null;\n\t\t}\n\n\t\t$(\".image-placeholder\", this.el).replaceWith('<div class=\"image-placeholder\">Click to add an optional image to the title</div>');\n\t\tthis.ui.headingImageDel.addClass(\"hide\");\n\t\tthis.model.set({ expectQuestionImage: false });\n\t},\n\n\tiagoLoaded: function iagoLoaded() {\n\t\tthis.bindUIElements();\n\t\tthis.delegateEvents();\n\n\t\t// Check for ranges and construct accordingly\n\t\tvar txt = this.ui.paragraph.text();\n\t\tthis.ui.paragraph.html(txt.replace(/(\\[.+?\\])/gi, \"<span class='input'>$1</span>\"));\n\n\t\tvar markerClass = \"\";\n\n\t\tif (this.previewMode) markerClass = \"hide\";\n\n\t\tvar el = $(\"<div class='iago-marker \" + markerClass + \"'>Mark</div>\");\n\t\tthis.ui.content.prepend(el);\n\n\t\tif (this.model.get(\"expectQuestionImage\") && !this.previewMode) {\n\t\t\tthis.headingImageClick();\n\t\t\tthis.headingImage.setImage(this.model.get(\"questionImage\"));\n\t\t}\n\n\t\t// Check for feedback mode\n\t\tif (this.assessment.get(\"feedback\")) this.changeFeedback(true);\n\t},\n\n\tmakeSelection: function makeSelection(evt) {\n\t\tevt.preventDefault();\n\t\tevt.stopPropagation();\n\n\t\tif (evt.originalEvent.type === \"mouseover\") {\n\t\t\t// IE hack #9567367: clicking clears the selection, so we capture the selection on mouseover and reuse it later\n\t\t\tif (window.getSelection().rangeCount === 0) return;\n\n\t\t\tthis.capturedSelection = window.getSelection().getRangeAt(0);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.capturedSelection || !window.getSelection().isCollapsed) {\n\t\t\tif (window.getSelection().rangeCount === 0 && !this.capturedSelection) return;\n\n\t\t\tvar range = this.capturedSelection || window.getSelection().getRangeAt(0);\n\n\t\t\tvar validRange = range.startContainer.parentNode === range.endContainer.parentNode && this.ui.paragraph.get(0).contains(range.startContainer.parentNode) && this.ui.paragraph.get(0).contains(range.endContainer.parentNode) || range.endContainer.parentNode === this.ui.content.get(0);\n\n\t\t\tif (range && validRange) {\n\t\t\t\t// Replace the range\n\t\t\t\tvar el = document.createElement(\"span\");\n\t\t\t\tel.classList.add(\"input\");\n\t\t\t\tel.textContent = \"[\" + range.toString() + \"]\";\n\n\t\t\t\trange.deleteContents();\n\t\t\t\trange.insertNode(el);\n\t\t\t\trange.detach();\n\n\t\t\t\t$(\".question-mark\").text(parseInt($(\".question-mark\").text(), 10) + 1);\n\t\t\t}\n\n\t\t\tthis.capturedSelection = null;\n\t\t}\n\t},\n\n\tclearSelection: function clearSelection(evt) {\n\t\tif (!this.previewMode) {\n\t\t\t$(\".question-mark\").text(parseInt($(\".question-mark\").text(), 10) - 1);\n\t\t\t$(evt.currentTarget).replaceWith(evt.currentTarget.textContent.slice(1, -1));\n\t\t}\n\t},\n\n\tiagoNavigate: function iagoNavigate(evt) {\n\t\t// Save this model, then navigate\n\t\tif (this.save()) this.trigger(\"iago:navigate\", evt);\n\t},\n\n\tsave: function save(noValidation, noFeedback) {\n\t\tif (!this.ui.headingText.text) return;\n\n\t\tvar question = _.trim(this.ui.headingText.text());\n\t\tvar feedback = this.assessment.get(\"feedback\") && !noFeedback ? _.trim(this.ui.feedback.text()) : \"\";\n\t\tvar questionImage = null;\n\n\t\tif (this.headingImage) questionImage = this.headingImage.getImage();\n\n\t\tvar paragraph = this.ui.paragraph.text().replace(/(?:\\r\\n|\\r|\\n)/g, \"\");\n\t\tthis.model.set({\n\t\t\tanswer: {\n\t\t\t\ttype: \"blank\",\n\t\t\t\tcontent: paragraph\n\t\t\t},\n\t\t\tfeedback: feedback,\n\t\t\tquestion: question,\n\t\t\tquestionImage: questionImage,\n\t\t\texpectQuestionImage: questionImage !== null\n\t\t});\n\n\t\tvar potential = 0;\n\t\tvar breakdown = paragraph.split(/(\\[.*?\\])/);\n\t\t_.each(breakdown, function (part) {\n\t\t\tif (/(^.*\\[|\\].*$)/.test(part)) potential++;\n\t\t});\n\n\t\tthis.model.set({ potentialScore: potential });\n\n\t\tif (!noValidation) return this.model.isValid();\n\t},\n\n\tvalidationFail: function validationFail() {\n\t\tif (this.previewMode) return;\n\t\t// Build the errors to show\n\t\tvar errs = this.model.validationError.slice(0);\n\t\terrs.unshift(\"<strong>The current question has errors and cannot be saved:</strong><br/>\");\n\n\t\tthis.ui.errors.removeClass(\"hide\").children(\".detail\").html(errs.join(\"<br/>&middot;&nbsp;\"));\n\t},\n\n\tcloseError: function closeError() {\n\t\tthis.ui.errors.addClass(\"hide\");\n\t},\n\n\teditClick: function editClick(evt) {\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2Vzc21lbnRNb2RhbC5qcyJdLCJuYW1lcyI6WyIkIiwicmVxdWlyZSIsIl8iLCJCYWNrYm9uZSIsIm1vbWVudCIsInJheWd1biIsIkFwcCIsInJlc3RlciIsInNldHRpbmdzIiwicmFkaW8iLCJSYWRpbyIsImNoYW5uZWwiLCJBc3Nlc3NtZW50IiwiQmlnTW9kYWwiLCJJYWdvIiwiSW1hZ2VDaG9vc2VyIiwiU2ltcGxlTWVudSIsIlNlbGVjdHJhIiwiU2xpZGVvdXQiLCJFcnJvcnMiLCJRdWVzdGlvbnMiLCJNb2RlbHMiLCJQYWdlIiwiTWFyaW9uZXR0ZSIsIk9iamVjdCIsIlF1ZXN0aW9uVHlwZXMiLCJWaWV3IiwiZXh0ZW5kIiwiY2xhc3NOYW1lIiwidGVtcGxhdGUiLCJxdWVzdGlvblR5cGVzIiwidWkiLCJibG9jayIsInVuZG8iLCJldmVudHMiLCJ0ZW1wbGF0ZUNvbnRleHQiLCJpc05ldyIsIm1vZGVsIiwiaW5pdGlhbGl6ZSIsIm9wdGlvbnMiLCJ0b3RhbCIsInNpemUiLCJzZXJpYWxpemVEYXRhIiwib25SZW5kZXIiLCJoaWRlIiwic2V0VHlwZSIsImV2dCIsImVsIiwiY3VycmVudFRhcmdldCIsInRyaWdnZXIiLCJkYXRhIiwiQXNzZXNzbWVudE1vZGFsIiwibW9kdWxlIiwiZXhwb3J0cyIsImJ1cyIsImFzc2Vzc21lbnRCYXNpcyIsImFzc2Vzc21lbnRQYW5lbCIsImFzc2Vzc21lbnRBcmVhIiwiZXJyb3JDb250YWluZXIiLCJjb250cm9sUGFuZWwiLCJtZXRhZGF0YVBhbmVsIiwidG9nZ2xlIiwicHJldmlldyIsInRvdGFsTWFyayIsInF1ZXN0aW9uTnVtYmVyIiwicXVlc3Rpb25NYXJrIiwiYWN0aW9ucyIsInNsaWRlckhvc3QiLCJzbGlkZXJOdW0iLCJzbGlkZXJDb3VudCIsInNsaWRlciIsImRlbGV0ZVF1ZXN0aW9uIiwiaW5mb0hvc3QiLCJtdXN0Q2xvbmVNZXNzYWdlIiwiaXNDbG9uZU1lc3NhZ2UiLCJjcmVhdGVNZXNzYWdlIiwidGl0bGVMYWJlbCIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJzdWJqZWN0TGFiZWwiLCJzdWJqZWN0Iiwic3R1ZHlZZWFyTGFiZWwiLCJzdHVkeVllYXIiLCJsYW5ndWFnZSIsImZlZWRiYWNrIiwiYnV0dG9uQWRkRWRpdFF1ZXN0aW9ucyIsIm5leHRCdXR0b24iLCJjcmVhdGUiLCJjcmVhdGVBbm90aGVyIiwidXBkYXRlIiwicmVnaW9ucyIsImVycm9yTWFwIiwicG9zaXRpb24iLCJhdHRyYWN0aW9uRWxlbWVudCIsImJpbmRBbGwiLCJwcmV2aWV3TW9kZSIsIk9wdGlvbnMiLCJjbGFzc2VzIiwiY29udGVudCIsImJ1dHRvbnMiLCJjYW5jZWwiLCJ0eXBlIiwibGFiZWwiLCJkYXRhTm91biIsImdldCIsIm1vZGUiLCJzYXZlIiwidmFsaWRhdGUiLCJwZXJtaXNzaW9uIiwicGVybWlzc2lvblRvVXBkYXRlIiwiYmluZCIsImhvc3QiLCJCb29sZWFuIiwicmVzdGFydFByZXZpZXciLCJyZXN0YXJ0IiwiaWFnbyIsImVkaXRNb2RlIiwiZmVlZGJhY2tNb2RlIiwicGFyZW50IiwiJGVsIiwiaWQiLCJxdWVzdGlvbk1vZGVscyIsImxpc3RlblRvIiwidXBkYXRlVUlSZWFkaW5lc3MiLCJkZWxldGVXaGVuQ2FuY2VsIiwicHJvdG90eXBlIiwiY2FsbCIsImF1Z21lbnRUZW1wbGF0ZURhdGEiLCJzdG9wUHJvcGFnYXRpb24iLCJzdGF0ZSIsImN1cnJlbnRRdWVzdGlvbiIsImNvbnNvbGUiLCJlcnJvciIsImFkZENsYXNzIiwidXBkYXRlQ3VycmVudE1vZGVsIiwidG9KU09OIiwicXVlc3Rpb25EYXRhIiwibWFwIiwibW9kYWwiLCJzaG93IiwiaXNNb2RlQ3JlYXRlIiwiaGFzIiwidXNlciIsInJlcXVlc3QiLCJFdmVudHMiLCJSZXF1ZXN0cyIsIkN1cnJlbnRVc2VyIiwicmVzb3VyY2VFZGl0aW5nIiwiaGFzQWNjZXNzIiwicCIsImFwaSIsInJlc291cmNlcyIsInB1dCIsImxvYWREYXRhIiwiY2IiLCJfdGl0bGUiLCJmZXRjaCIsInN1Y2Nlc3MiLCJmZXRjaFN1Y2Nlc3MiLCJmZXRjaEVycm9yIiwidXJsIiwidXJsUm9vdCIsImxlbmd0aCIsInBvcHVsYXRlUXVlc3Rpb25Nb2RlbHMiLCJzZXQiLCJ1bnNldCIsImlzQ2xvbmUiLCJiaW5kRXZlbnRzIiwibW9kZWxFdmVudHMiLCJlYWNoIiwicSIsInB1c2giLCJzdWJ0eXBlIiwicmVuZGVyRm9ybSIsInNlbGVjdCIsInNlcnZlciIsImRlbGF5TG9hZCIsImtleSIsInZhbHVlIiwiZGVmYXVsdCIsInBhZ2luZyIsInBhZ2VTaXplIiwiaW5maW5pdGUiLCJkZEhvc3QiLCJwbGFjZWhvbGRlciIsImNob3NlbiIsIndpZHRoIiwicmFuZ2VzbGlkZXIiLCJwb2x5ZmlsbCIsImZvdW5kYXRpb24iLCJzd2l0Y2hUb1ByZXZpZXdNb2RlIiwiY3JlYXRlUXVlc3Rpb24iLCJtdXN0Q2xvbmUiLCJzaG93Q2xvbmVkTWV0YWRhdGFGb3JtIiwic3dpdGNoVG9FZGl0TW9kZSIsInF1ZXN0aW9ucyIsInNldFVJQnVzeSIsInNldFVJUmVhZHkiLCJvbkJ1dHRvbkFkZEVkaXRRdWVzdGlvbnNDbGljayIsInZhbCIsInByb3AiLCJzaG93VHlwZXMiLCJyZW1vdmVDbGFzcyIsIm1lbnUiLCJwYW5lbCIsInBhZGRpbmciLCJ0b2xlcmFuY2UiLCJzZXRBc3Nlc3NtZW50QXJlYUNvbnRlbnRzIiwidmlldyIsImFzc2Vzc21lbnRBcmVhQ29udGVudHMiLCJkZXN0cm95IiwiYXBwZW5kIiwicmVuZGVyIiwiaWFnb05hdmlnYXRlIiwiZGV0YWlsIiwiZGlyZWN0aW9uIiwibG9hZFF1ZXN0aW9uIiwidXBkYXRlVG90YWxNYXJrIiwibGFuZ3VhZ2VDaGFuZ2VkIiwicmVkcmF3IiwiZmVlZGJhY2tDaGFuZ2VkIiwicmVkb0luc3RydWN0aW9ucyIsInRvZ2dsZU1lbnUiLCJzZXR1cE9wdGlvbnMiLCJxdWVzdGlvbiIsIm9wdGlvbnNNZW51IiwiYW5jaG9yIiwic2lkZSIsInBlcnNpc3QiLCJjbGlja1Jvb3QiLCJzdHJ1Y3R1cmUiLCJxdWVzdGlvbk9wdGlvbnMiLCJvcHRpb25FdmVudHMiLCJoaWRlT3B0aW9ucyIsInRvZ2dsZU9wdGlvbnMiLCJldmVudCIsInRyYW5zaXRpb25TYXZlU3VjY2VzcyIsInJlc3BvbnNlIiwiX2lkIiwidHJhbnNpdGlvblNhdmVFcnJvciIsImZpbmQiLCJzaG93RXJyb3IiLCJNb2RlbCIsIm1lc3NhZ2UiLCJ0cmFuc2l0aW9uU2F2ZUFzc2Vzc21lbnQiLCJhc3NlbWJsZURhdGEiLCJyZXNvdXJjZSIsIndyYXBBc1Jlc291cmNlIiwiYXR0cmlidXRlcyIsIm1heFNjb3JlIiwid2FpdCIsIlJlc291cmNlQ3JlYXRlZCIsInVwZGF0ZVNsaWRlciIsImluZGV4IiwiYWN0dWFsSW5kZXgiLCJpc1VuZGVmaW5lZCIsInRleHQiLCJ0b1N0cmluZyIsImF0dHIiLCJ0b3RhbE1hcmtzIiwicGFnZSIsImkiLCJwb3RlbnRpYWxTY29yZSIsIm1hcmsiLCJ1bmRlZmluZWQiLCJxdWVzdGlvbkluZGV4IiwibGFzdCIsImFzc2Vzc21lbnQiLCJxdWVzdGlvbk1vZGVsIiwic3RhcnQiLCJzZXJ2ZXJTYXZlIiwicmVxdWlyZUNvZGUiLCJhZGRRdWVzdGlvbiIsImRyYXciLCJzcGxpY2UiLCJyZW1vdmVRdWVzdGlvbiIsIk1hdGgiLCJtaW4iLCJjaGFuZ2VRdWVzdGlvbk51bSIsInBhcnNlSW50IiwiY2hhbmdlUXVlc3Rpb25TbGlkZSIsImJlZm9yZVZhbGlkYXRpb25GYWlsIiwidmFsaWRhdGlvbkVycm9yIiwib3BlbiIsImNvbmZpcm1BY2NlcHQiLCJhY3Rpb24iLCJzZXRTdGF0dXNCdXN5IiwiZmlsZXMiLCJ4aHIiLCJiaW5hcnlTYXZlIiwib25TYXZlU3VjY2VzcyIsIm9uU2F2ZUVycm9yIiwiaW5pdGlhbGl6ZVByb2dyZXNzQmFyIiwiZSIsInNldFN0YXR1c1JlYWR5IiwiYmVmb3JlU2F2ZSIsImNvbnRpbnVlU2F2ZSIsImdldE1heFNjb3JlIiwidXBkYXRlZCIsIldhc0Nsb25lZCIsImNvbmZpcm1DYW5jZWwiLCJiYXNpcyIsImFuZEF0dGFjaG1lbnRzIiwiYXNzZXNzbWVudE1vZGVsIiwiY2F0ZWdvcnkiLCJjcmVhdGVkIiwidW5peCIsIm9uQXNzZXNzbWVudENyZWF0ZWQiLCJyZXN1bHQiLCJvbkFzc2Vzc21lbnRVcGRhdGVkIiwiUmVzb3VyY2VVcGRhdGVkIiwib25DcmVhdGVBbm90aGVyIiwic3ViamVjdF9uYW1lIiwib25CZWZvcmVEZXN0cm95IiwiTXVsdGlRdWVzdGlvbnMiLCJoZWFkaW5nSW1hZ2VDbGljayIsImhhc0NsYXNzIiwiaGVhZGluZ0ltYWdlIiwidHJhbnNjb2RlIiwianBlZyIsIm1heEhlaWdodCIsIm1heFdpZHRoIiwiaGVhZGluZ0ltYWdlRGVsIiwiZXhwZWN0UXVlc3Rpb25JbWFnZSIsImRlbGV0ZUhlYWRpbmdJbWFnZSIsInJlcGxhY2VXaXRoIiwicGFzdGVkIiwicHJldmVudERlZmF1bHQiLCJvcmlnaW5hbEV2ZW50IiwiY2xpcGJvYXJkRGF0YSIsImdldERhdGEiLCJhZGRFdmVudExpc3RlbmVyIiwibG9hZGVkIiwibmF2aWdhdGUiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwiY2hhbmdlRmVlZGJhY2siLCJpYWdvTG9hZGVkIiwiYmluZFVJRWxlbWVudHMiLCJkZWxlZ2F0ZUV2ZW50cyIsImNvbmNhdCIsImNoaWxkcmVuIiwic2V0SW1hZ2UiLCJleHRyYVNldHVwIiwiYW5zd2VyQ291bnQiLCJub1ZhbGlkYXRpb24iLCJub0ZlZWRiYWNrIiwiaGVhZGluZ1RleHQiLCJjb3JyZWN0IiwicGFyZW50cyIsIndyb25nIiwidHJpbSIsInF1ZXN0aW9uSW1hZ2UiLCJnZXRJbWFnZSIsImNvcnJlY3RBbnN3ZXJzIiwidG9BcnJheSIsImVsZW1lbnQiLCJzcGFuIiwib3RoZXJBbnN3ZXJzIiwiaXNWYWxpZCIsInZhbGlkYXRpb25GYWlsIiwiZXJycyIsInNsaWNlIiwidW5zaGlmdCIsImVycm9ycyIsImh0bWwiLCJqb2luIiwiY2xvc2VFcnJvciIsImVkaXRDbGljayIsImNoYW5nZVR5cGUiLCJjbGFzc0xpc3QiLCJjb250YWlucyIsInRvZ2dsZUNsYXNzIiwiYWRkT3B0aW9uIiwicXVlc3Rpb25JRCIsImJlZm9yZSIsImRlbGV0ZU9wdGlvbiIsImZpcnN0IiwiaXMiLCJlcSIsInJlbW92ZSIsIndpbmRvdyIsInNldFRpbWVvdXQiLCJyYW5nZSIsImRvY3VtZW50IiwiY3JlYXRlUmFuZ2UiLCJzZWxlY3ROb2RlQ29udGVudHMiLCJzZWwiLCJnZXRTZWxlY3Rpb24iLCJyZW1vdmVBbGxSYW5nZXMiLCJhZGRSYW5nZSIsInVuc2VsZWN0IiwiUXVlc3Rpb25Nb2RlbCIsImRlZmF1bHRzIiwidmFsaWRhdGVCYXNlIiwiaWRBdHRyaWJ1dGUiLCJhdHRycyIsImVyciIsInNvbWUiLCJhIiwicXVlc3Rpb25NYXJrdXAiLCJwcmV2QnV0dG9uIiwib3B0aW9uIiwib3B0aW9uVGV4dCIsImRlbGV0ZXIiLCJpbnZhbGlkIiwibWF4QnkiLCJ4Iiwib24iLCJ0b2dnbGVBbnN3ZXIiLCJjaGFuZ2VDb3JyZWN0QW5zd2VyIiwiYWRkIiwiY2xvc2VPbkNsaWNrIiwibmFtZSIsImVsZW1lbnRzIiwic2VsZWN0ZWQiLCJsYW5nIiwiaW5jbHVkZXMiLCJpbnN0cnVjdGlvbnMiLCJ0cnVlIiwiZmFsc2UiLCJjaGFuZ2VGb3JtYXQiLCJlbGVtIiwiZWxzIiwiaW5uZXJIVE1MIiwieWVzIiwibm8iLCJhZnRlciIsIm1vcmUiLCJsZXNzIiwiZGVidWciLCJyZXBvcnRFcnJvcnMiLCJFcnJvciIsInJhbmdlQ291bnQiLCJnZXRSYW5nZUF0IiwiZGVsZXRlQ29udGVudHMiLCJpbnNlcnROb2RlIiwiY3JlYXRlVGV4dE5vZGUiLCJjaGFuZ2VRdWVzdGlvbk1hcmsiLCJpc1N0cmluZyIsImlzQXJyYXkiLCJsZWZ0IiwicmlnaHQiLCJhbnN3ZXIiLCJzZWFyY2giLCJtYXJrZXIiLCJwYXJhZ3JhcGgiLCJoaWdobGlnaHQiLCJwcmV2aWV3UGFyYWdyYXBoIiwicmVwbGFjZSIsInR4dCIsIm1hcmtlckNsYXNzIiwicHJlcGVuZCIsIm1ha2VTZWxlY3Rpb24iLCJjYXB0dXJlZFNlbGVjdGlvbiIsImlzQ29sbGFwc2VkIiwidmFsaWRSYW5nZSIsInN0YXJ0Q29udGFpbmVyIiwicGFyZW50Tm9kZSIsImVuZENvbnRhaW5lciIsImNyZWF0ZUVsZW1lbnQiLCJ0ZXh0Q29udGVudCIsImRldGFjaCIsImNsZWFyU2VsZWN0aW9uIiwicG90ZW50aWFsIiwiYnJlYWtkb3duIiwic3BsaXQiLCJ0ZXN0IiwicGFydCJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsSUFBSUMsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1FLFdBQVdGLFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1HLFNBQVNILFFBQVEsUUFBUixDQUFmO0FBQ0FBLFFBQVEsYUFBUjtBQUNBLElBQU1JLFNBQVNKLFFBQVEsUUFBUixDQUFmOztBQUVBLElBQU1LLE1BQU1MLFFBQVEsVUFBUixDQUFaO0FBQ0EsSUFBTU0sU0FBU04sUUFBUSxRQUFSLENBQWY7QUFDQSxJQUFNTyxXQUFXUCxRQUFRLGNBQVIsQ0FBakI7QUFDQSxJQUFNUSxRQUFRTixTQUFTTyxLQUFULENBQWVDLE9BQWYsQ0FBdUIsUUFBdkIsQ0FBZDs7QUFFQSxJQUFNQyxhQUFhWCxRQUFRLG1CQUFSLENBQW5CO0FBQ0EsSUFBTVksV0FBV1osUUFBUSxZQUFSLENBQWpCO0FBQ0EsSUFBTWEsT0FBT2IsUUFBUSxRQUFSLENBQWI7QUFDQSxJQUFNYyxlQUFlZCxRQUFRLGdCQUFSLENBQXJCO0FBQ0EsSUFBTWUsYUFBYWYsUUFBUSxjQUFSLENBQW5CO0FBQ0EsSUFBTWdCLFdBQVdoQixRQUFRLFlBQVIsQ0FBakI7QUFDQSxJQUFNaUIsV0FBV2pCLFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1rQixTQUFTbEIsUUFBUSxVQUFSLENBQWY7QUFDQSxJQUFNbUIsWUFBWSxFQUFsQjtBQUFBLElBQXNCQyxTQUFTLEVBQS9COztBQUVBLElBQU1DLE9BQU8sSUFBSW5CLFNBQVNvQixVQUFULENBQW9CQyxNQUF4QixFQUFiOztBQUVBLElBQU1DLGdCQUFnQnRCLFNBQVNvQixVQUFULENBQW9CRyxJQUFwQixDQUF5QkMsTUFBekIsQ0FBZ0M7QUFDckRDLFlBQVcsMkJBRDBDOztBQUdyREMsV0FBVTVCLFFBQVEsa0NBQVIsRUFBNEM2QixhQUhEOztBQUtyREMsS0FBSTtBQUNIQyxTQUFPLGFBREo7O0FBR0hDLFFBQU07QUFISCxFQUxpRDs7QUFXckRDLFNBQVE7QUFDUCxxQkFBbUIsU0FEWjs7QUFHUCxvQkFBa0I7QUFIWCxFQVg2Qzs7QUFpQnJEQyxrQkFBaUIsMkJBQVc7QUFBQTs7QUFDM0IsU0FBTztBQUNOQyxVQUFPO0FBQUEsV0FBTSxNQUFLQyxLQUFMLENBQVdELEtBQVgsRUFBTjtBQUFBO0FBREQsR0FBUDtBQUdBLEVBckJvRDs7QUF1QnJERSxhQUFZLG9CQUFTQyxPQUFULEVBQWtCO0FBQzdCLE9BQUtDLEtBQUwsR0FBYUQsUUFBUUUsSUFBUixHQUFlLENBQTVCO0FBQ0EsRUF6Qm9EOztBQTJCckRDLGdCQUFlLHlCQUFXO0FBQ3pCLFNBQU8sRUFBRUYsT0FBTyxLQUFLQSxLQUFkLEVBQVA7QUFDQSxFQTdCb0Q7O0FBK0JyREcsV0FBVSxvQkFBVztBQUNwQixNQUFJLEtBQUtILEtBQUwsS0FBZSxDQUFuQixFQUNDLEtBQUtULEVBQUwsQ0FBUUUsSUFBUixDQUFhVyxJQUFiO0FBQ0QsRUFsQ29EOztBQW9DckRDLFVBQVMsaUJBQVNDLEdBQVQsRUFBYztBQUN0QixNQUFNQyxLQUFLL0MsRUFBRThDLElBQUlFLGFBQU4sQ0FBWDtBQUNBLE9BQUtDLE9BQUwsQ0FBYSxNQUFiLEVBQXFCRixHQUFHRyxJQUFILENBQVEsTUFBUixDQUFyQjtBQUNBLEVBdkNvRDs7QUF5Q3JEakIsT0FBTSxnQkFBVztBQUNoQixPQUFLZ0IsT0FBTCxDQUFhLE1BQWIsRUFBcUIsRUFBckI7QUFDQTtBQTNDb0QsQ0FBaEMsQ0FBdEI7O0FBOENBLElBQU1FLGtCQUFrQkMsT0FBT0MsT0FBUCxHQUFpQnhDLFNBQVNjLE1BQVQsQ0FBZ0I7QUFDeERJLEtBQUk7QUFDSHVCLE9BQUssa0JBREY7QUFFSEMsbUJBQWlCLG1CQUZkO0FBR0hDLG1CQUFpQixtQkFIZDtBQUlIQyxrQkFBZ0Isa0JBSmI7QUFLSEMsa0JBQWdCLFNBTGI7QUFNSEMsZ0JBQWMsZ0JBTlg7QUFPSEMsaUJBQWUsaUJBUFo7QUFRSEMsVUFBUSxhQVJMO0FBU0h0QixXQUFTLGVBVE47QUFVSHVCLFdBQVMsVUFWTjtBQVdIQyxhQUFXLGFBWFI7QUFZSEMsa0JBQWdCLGtCQVpiO0FBYUhDLGdCQUFjLGdCQWJYO0FBY0hDLFdBQVMsYUFkTjtBQWVIQyxjQUFZLGFBZlQ7QUFnQkhDLGFBQVcsa0NBaEJSO0FBaUJIQyxlQUFhLG9CQWpCVjtBQWtCSEMsVUFBUSxxQkFsQkw7QUFtQkhDLGtCQUFnQixxQkFuQmI7QUFvQkhDLFlBQVUsV0FwQlA7O0FBc0JIQyxvQkFBa0IscUJBdEJmO0FBdUJIQyxrQkFBZ0IsbUJBdkJiO0FBd0JIQyxpQkFBZSxpQkF4Qlo7QUF5QkhDLGNBQVksY0F6QlQ7QUEwQkhDLFNBQU8scUJBMUJKO0FBMkJIQyxlQUFhLHVCQTNCVjtBQTRCSEMsZ0JBQWMsZ0JBNUJYO0FBNkJIQyxXQUFTLHVCQTdCTjtBQThCSEMsa0JBQWdCLGtCQTlCYjtBQStCSEMsYUFBVywwQkEvQlI7QUFnQ0hDLFlBQVUseUJBaENQO0FBaUNIQyxZQUFVLFdBakNQO0FBa0NIQywwQkFBd0IseUNBbENyQjtBQW1DSEMsY0FBWTtBQW5DVCxFQURvRDs7QUF1Q3hEcEQsU0FBUTtBQUNQLHNCQUFvQixZQURiO0FBRVAsdUJBQXFCLGVBRmQ7QUFHUCw4QkFBNEIsZ0JBSHJCO0FBSVAsdUJBQXFCLFNBSmQ7O0FBTVAseUJBQXVCLGlCQU5oQjtBQU9QLHlCQUF1QixpQkFQaEI7QUFRUCxzQ0FBb0MsK0JBUjdCOztBQVVQLDBCQUF3QixtQkFWakI7QUFXUCx1QkFBcUI7QUFYZCxFQXZDZ0Q7O0FBcUR4RGdDLFVBQVM7QUFDUnFCLFVBQVEscUJBREE7QUFFUkMsaUJBQWUsaUJBRlA7QUFHUkMsVUFBUTtBQUhBLEVBckQrQzs7QUEyRHhEQyxVQUFTO0FBQ1JoQyxrQkFBZ0I7QUFEUixFQTNEK0M7O0FBK0R4RGlDLFdBQVU7QUFDVFIsWUFBVTtBQUNUUyxhQUFVO0FBREQsR0FERDtBQUlUVixhQUFXO0FBQ1ZXLHNCQUFtQixnQkFEVDtBQUVWRCxhQUFVO0FBRkEsR0FKRjtBQVFUWixXQUFTO0FBQ1JhLHNCQUFtQixjQURYO0FBRVJELGFBQVU7QUFGRixHQVJBO0FBWVRmLFNBQU87QUFDTmdCLHNCQUFtQixZQURiO0FBRU5ELGFBQVU7QUFGSjtBQVpFLEVBL0Q4Qzs7QUFpRnhEdEQsYUFBWSxzQkFBdUI7QUFBQSxNQUFkQyxPQUFjLHVFQUFKLEVBQUk7O0FBQ2xDckMsSUFBRTRGLE9BQUYsQ0FBVSxJQUFWOztBQUVBLE1BQUl2RCxRQUFRd0QsV0FBWixFQUF5QjtBQUN4QixRQUFLQyxPQUFMLEdBQWU7QUFDZEMsYUFBUyxDQUFDLGtCQUFELENBREs7QUFFZHBFLGNBQVU1QixRQUFRLGtDQUFSLEVBQTRDaUcsT0FGeEM7QUFHZEMsYUFBUztBQUNSQyxhQUFRO0FBQ1BDLFlBQU0sUUFEQztBQUVQQyxhQUFPO0FBRkE7QUFEQSxLQUhLO0FBU2RDLGNBQVUsZ0JBQWdCLEtBQUtsRSxLQUFMLENBQVdELEtBQVgsS0FBcUIsRUFBckIsR0FBMEIsT0FBTyxLQUFLQyxLQUFMLENBQVdtRSxHQUFYLENBQWUsT0FBZixDQUFqRDtBQVRJLElBQWY7QUFXQSxHQVpELE1BYUs7QUFDSixRQUFLUixPQUFMLEdBQWU7QUFDZEMsYUFBUyxDQUFDLGtCQUFELENBREs7QUFFZHBFLGNBQVU1QixRQUFRLGtDQUFSLEVBQTRDaUcsT0FGeEM7QUFHZEMsYUFBUztBQUNSWixhQUFRO0FBQ1BjLFlBQU0sUUFEQztBQUVQQyxhQUFPLGdCQUZBO0FBR1BHLFlBQU0sUUFIQztBQUlQQyxZQUFNLElBSkM7QUFLUEMsZ0JBQVU7QUFMSCxNQURBO0FBUVJuQixvQkFBZTtBQUNkYSxZQUFNLFFBRFE7QUFFZEMsYUFBTyxRQUZPO0FBR2RHLFlBQU0sUUFIUTtBQUlkQyxZQUFNLElBSlE7QUFLZEMsZ0JBQVU7QUFMSSxNQVJQO0FBZVJsQixhQUFRO0FBQ1BZLFlBQU0sUUFEQztBQUVQQyxhQUFPLFFBRkE7QUFHUEcsWUFBTSxNQUhDO0FBSVBHLGtCQUFZLEtBQUtDLGtCQUFMLENBQXdCQyxJQUF4QixDQUE2QixJQUE3QixDQUpMO0FBS1BKLFlBQU0sSUFMQztBQU1QQyxnQkFBVTtBQU5ILE1BZkE7QUF1QlJQLGFBQVE7QUFDUEMsWUFBTSxRQURDO0FBRVBDLGFBQU87QUFGQTtBQXZCQSxLQUhLO0FBK0JkQyxjQUFVLHlCQUF5QixLQUFLbEUsS0FBTCxDQUFXRCxLQUFYLEtBQXFCLEVBQXJCLEdBQTBCLE9BQU8sS0FBS0MsS0FBTCxDQUFXbUUsR0FBWCxDQUFlLE9BQWYsQ0FBMUQsQ0EvQkk7QUFnQ2RPLFVBQU14RSxRQUFRd0U7QUFoQ0EsSUFBZjtBQWtDQTs7QUFFRCxPQUFLaEIsV0FBTCxHQUFtQmlCLFFBQVF6RSxRQUFRd0QsV0FBaEIsQ0FBbkI7QUFDQSxPQUFLa0IsY0FBTCxHQUFzQkQsUUFBUXpFLFFBQVEyRSxPQUFoQixDQUF0Qjs7QUFFQSxPQUFLQyxJQUFMLEdBQVksSUFBSXJHLElBQUosQ0FBUztBQUNwQnNHLGFBQVUsQ0FBQyxLQUFLckIsV0FESTtBQUVwQkEsZ0JBQWEsS0FBS0EsV0FGRTtBQUdwQnNCLGlCQUFjLEtBQUtoRixLQUFMLENBQVdtRSxHQUFYLENBQWUsVUFBZixDQUhNO0FBSXBCYyxXQUFRLEtBQUtDLEdBQUwsQ0FBU2YsR0FBVCxDQUFhLENBQWI7QUFKWSxHQUFULENBQVo7O0FBT0EsT0FBS2dCLEVBQUwsR0FBVSxDQUFWO0FBQ0EsT0FBS0MsY0FBTCxHQUFzQixFQUF0QjtBQUNBLE9BQUtDLFFBQUwsQ0FBY3BHLElBQWQsRUFBb0IsaUJBQXBCLEVBQXVDLEtBQUtxRyxpQkFBTCxDQUF1QmIsSUFBdkIsQ0FBNEIsSUFBNUIsQ0FBdkM7QUFDQSxPQUFLWSxRQUFMLENBQWNwRyxJQUFkLEVBQW9CLG1CQUFwQixFQUF5QyxLQUFLcUcsaUJBQUwsQ0FBdUJiLElBQXZCLENBQTRCLElBQTVCLENBQXpDO0FBQ0EsT0FBS2MsZ0JBQUwsR0FBd0IsS0FBeEI7O0FBRUEsT0FBSzdGLEVBQUwsR0FBVTdCLEVBQUV5QixNQUFGLENBQVMsS0FBS0ksRUFBZCxFQUFrQmxCLFNBQVNnSCxTQUFULENBQW1COUYsRUFBckMsQ0FBVjtBQUNBLE9BQUtHLE1BQUwsR0FBY2hDLEVBQUV5QixNQUFGLENBQVMsS0FBS08sTUFBZCxFQUFzQnJCLFNBQVNnSCxTQUFULENBQW1CM0YsTUFBekMsQ0FBZDs7QUFFQXJCLFdBQVNnSCxTQUFULENBQW1CdkYsVUFBbkIsQ0FBOEJ3RixJQUE5QixDQUFtQyxJQUFuQztBQUNBLEVBMUp1RDs7QUE0SnhEQyxzQkFBcUIsK0JBQVc7QUFDL0IsU0FBTztBQUNOaEMsZ0JBQWEsS0FBS0E7QUFEWixHQUFQO0FBR0EsRUFoS3VEOztBQWtLeERqQyxVQUFTLGlCQUFTaEIsR0FBVCxFQUFjO0FBQ3RCQSxNQUFJa0YsZUFBSjs7QUFFQSxNQUFJLEtBQUtiLElBQUwsQ0FBVWMsS0FBZCxFQUFxQjtBQUNwQjtBQUNBLE9BQUksS0FBS0MsZUFBTCxJQUF3QixDQUFDLEtBQUtBLGVBQUwsQ0FBcUJ4QixJQUFyQixFQUE3QixFQUEwRDtBQUN6RHlCLFlBQVFDLEtBQVIsQ0FBYyx3QkFBZDtBQUNBLElBRkQsTUFHSztBQUNKO0FBQ0FwSSxNQUFFLGtCQUFGLEVBQXNCcUksUUFBdEIsQ0FBK0IsTUFBL0I7O0FBRUEsUUFBSSxLQUFLSCxlQUFULEVBQ0MsS0FBS2YsSUFBTCxDQUFVbUIsa0JBQVYsQ0FBNkIsS0FBS0osZUFBTCxDQUFxQjdGLEtBQXJCLENBQTJCa0csTUFBM0IsRUFBN0I7O0FBRUQsUUFBTXJGLE9BQU8sS0FBS2IsS0FBTCxDQUFXa0csTUFBWCxFQUFiOztBQUVBckYsU0FBS3NGLFlBQUwsR0FBb0J0SSxFQUFFdUksR0FBRixDQUFNLEtBQUtoQixjQUFYLEVBQTJCO0FBQUEsWUFBU3BGLE1BQU1rRyxNQUFOLEVBQVQ7QUFBQSxLQUEzQixDQUFwQjtBQUNBLFNBQUtwQixJQUFMLENBQVVjLEtBQVYsQ0FBZ0JDLGVBQWhCLEdBQWtDLENBQWxDO0FBQ0EsUUFBTVEsUUFBUSxJQUFJdkYsZUFBSixDQUFvQjtBQUNqQ2QsWUFBTyxJQUFJekIsVUFBSixDQUFlc0MsSUFBZixDQUQwQjtBQUVqQzZDLGtCQUFhLElBRm9CO0FBR2pDbUMsc0JBQWlCLEtBQUtmLElBQUwsQ0FBVWMsS0FBVixDQUFnQkM7QUFIQSxLQUFwQixDQUFkOztBQU1BUSxVQUFNQyxJQUFOLENBQVcsRUFBWDtBQUNBO0FBQ0Q7QUFDRCxFQTlMdUQ7O0FBZ014REMsZUFBYyx3QkFBVztBQUN4QixTQUFPLENBQUMsS0FBS3ZHLEtBQU4sSUFBZSxLQUFLQSxLQUFMLENBQVdELEtBQVgsRUFBZixJQUFxQyxLQUFLQyxLQUFMLENBQVd3RyxHQUFYLENBQWUsUUFBZixLQUE0QixLQUFLeEcsS0FBTCxDQUFXbUUsR0FBWCxDQUFlLFFBQWYsQ0FBeEU7QUFDQSxFQWxNdUQ7O0FBb014REsscUJBQW9CLDhCQUFXO0FBQzlCLE1BQU1pQyxPQUFPckksTUFBTXNJLE9BQU4sQ0FBY3pJLElBQUkwSSxNQUFKLENBQVdDLFFBQVgsQ0FBb0JDLFdBQWxDLENBQWI7O0FBRUEsU0FBTzFJLFNBQVMySSxlQUFULElBQTRCNUksT0FBTzZJLFNBQVAsQ0FBaUI3SSxPQUFPOEksQ0FBUCxDQUFTQyxHQUFULENBQWFDLFNBQWIsQ0FBdUJDLEdBQXhDLEVBQTZDVixJQUE3QyxDQUFuQztBQUNBLEVBeE11RDs7QUEwTXhEVyxXQUFVLGtCQUFTQyxFQUFULEVBQWE7QUFDdEIsTUFBSSxDQUFDLEtBQUszRCxXQUFOLEtBQXNCLENBQUMsS0FBSzFELEtBQUwsQ0FBV0QsS0FBWCxFQUFELElBQXVCLEtBQUtDLEtBQUwsQ0FBV21FLEdBQVgsQ0FBZSxRQUFmLENBQTdDLENBQUosRUFBNEU7QUFDM0U7QUFDQSxRQUFLbUQsTUFBTCxHQUFjLEtBQUt0SCxLQUFMLENBQVdtRSxHQUFYLENBQWUsT0FBZixDQUFkOztBQUVBLFFBQUtuRSxLQUFMLENBQVd1SCxLQUFYLENBQWlCO0FBQ2hCQyxhQUFTLEtBQUtDLFlBQUwsQ0FBa0JoRCxJQUFsQixDQUF1QixJQUF2QixFQUE2QjRDLEVBQTdCLENBRE87QUFFaEJ0QixXQUFPLEtBQUsyQixVQUFMLENBQWdCakQsSUFBaEIsQ0FBcUIsSUFBckIsRUFBMkI0QyxFQUEzQixDQUZTO0FBR2hCTSxTQUFLeEosU0FBU3lKLE9BQVQsR0FBbUIsaUNBQW5CLEdBQXVELEtBQUs1SCxLQUFMLENBQVdtRjtBQUh2RCxJQUFqQjtBQUtBLEdBVEQsTUFVSyxJQUFJLEtBQUt6QixXQUFMLElBQW9CLEtBQUsxRCxLQUFMLENBQVdtRSxHQUFYLENBQWUsY0FBZixFQUErQjBELE1BQS9CLEtBQTBDLENBQTlELElBQW1FLENBQUMsS0FBSzdILEtBQUwsQ0FBV0QsS0FBWCxFQUF4RSxFQUE0RjtBQUNoRztBQUNBLFFBQUt1SCxNQUFMLEdBQWMsS0FBS3RILEtBQUwsQ0FBV21FLEdBQVgsQ0FBZSxPQUFmLENBQWQ7O0FBRUEsUUFBS25FLEtBQUwsQ0FBV3VILEtBQVgsQ0FBaUI7QUFDaEJDLGFBQVMsS0FBS0MsWUFBTCxDQUFrQmhELElBQWxCLENBQXVCLElBQXZCLEVBQTZCNEMsRUFBN0IsQ0FETztBQUVoQnRCLFdBQU8sS0FBSzJCLFVBQUwsQ0FBZ0JqRCxJQUFoQixDQUFxQixJQUFyQixFQUEyQjRDLEVBQTNCLENBRlM7QUFHaEJNLFNBQUt4SixTQUFTeUosT0FBVCxHQUFtQixpQ0FBbkIsR0FBdUQsS0FBSzVILEtBQUwsQ0FBV21GO0FBSHZELElBQWpCO0FBS0EsR0FUSSxNQVVBO0FBQ0osUUFBSzJDLHNCQUFMO0FBQ0EsVUFBT1QsSUFBUDtBQUNBO0FBQ0QsRUFuT3VEOztBQXFPeERJLGVBQWMsc0JBQVNKLEVBQVQsRUFBYTtBQUMxQixNQUFJLEtBQUtySCxLQUFMLENBQVdtRSxHQUFYLENBQWUsUUFBZixDQUFKLEVBQThCO0FBQzdCLFFBQUtuRSxLQUFMLENBQVcrSCxHQUFYLENBQWUsT0FBZixFQUF3QixLQUFLVCxNQUE3QjtBQUNBLFFBQUt0SCxLQUFMLENBQVdnSSxLQUFYLENBQWlCLEtBQWpCO0FBQ0EsUUFBS2hJLEtBQUwsQ0FBV2dJLEtBQVgsQ0FBaUIsUUFBakI7O0FBRUEsUUFBS0MsT0FBTCxHQUFlLElBQWY7QUFDQTs7QUFFRCxPQUFLSCxzQkFBTDs7QUFFQVQ7QUFDQSxFQWpQdUQ7O0FBbVB4REssYUFBWSxzQkFBVztBQUN0QixPQUFLUSxVQUFMLENBQWdCLEtBQUtsSSxLQUFyQixFQUE0QixLQUFLbUksV0FBakM7QUFDQSxFQXJQdUQ7O0FBdVB4REwseUJBQXdCLGtDQUFXO0FBQUE7O0FBQ2xDakssSUFBRXVLLElBQUYsQ0FBTyxLQUFLcEksS0FBTCxDQUFXbUUsR0FBWCxDQUFlLGNBQWYsQ0FBUCxFQUF1QyxhQUFLO0FBQzNDLE9BQUlrRSxFQUFFbEQsRUFBRixHQUFPLE9BQUtBLEVBQWhCLEVBQ0MsT0FBS0EsRUFBTCxHQUFVa0QsRUFBRWxELEVBQVo7O0FBRUQsVUFBS0MsY0FBTCxDQUFvQmtELElBQXBCLENBQXlCLElBQUl0SixPQUFPcUosRUFBRXJFLElBQUYsSUFBVXFFLEVBQUVFLE9BQUYsR0FBWSxNQUFNRixFQUFFRSxPQUFwQixHQUE4QixFQUF4QyxDQUFQLENBQUosQ0FBd0RGLENBQXhELENBQXpCO0FBQ0EsR0FMRDs7QUFPQSxPQUFLbEQsRUFBTDtBQUNBLEVBaFF1RDs7QUFrUXhEcUQsYUFBWSxzQkFBVztBQUN0QixNQUFNQyxTQUFTLElBQUk3SixRQUFKLENBQWE7QUFDM0I4SixXQUFRO0FBQ1BuQixXQUFVcEosU0FBU3lKLE9BQW5CLDJCQURPO0FBRVBlLGVBQVcsSUFGSjtBQUdQQyxTQUFLLFlBSEU7QUFJUEMsV0FBTyxTQUpBO0FBS1BDLGFBQVM7QUFDUkYsVUFBSyxLQUFLNUksS0FBTCxDQUFXbUUsR0FBWCxDQUFlLFNBQWYsQ0FERztBQUVSMEUsWUFBTyxLQUFLN0ksS0FBTCxDQUFXbUUsR0FBWCxDQUFlLGNBQWY7QUFGQztBQUxGLElBRG1CO0FBVzNCNEUsV0FBUTtBQUNQQyxjQUFVLEVBREg7QUFFUEMsY0FBVTtBQUZILElBWG1CO0FBZTNCQyxXQUFRLEtBQUt2RixPQUFMLENBQWFlLElBZk07QUFnQjNCeUUsZ0JBQWE7QUFoQmMsR0FBYixDQUFmOztBQW1CQVYsU0FBT25DLElBQVAsQ0FBWSxFQUFFNUYsSUFBSSxLQUFLaEIsRUFBTCxDQUFRaUQsT0FBZCxFQUFaOztBQUVBaEYsSUFBRSxRQUFGLEVBQVksS0FBSytDLEVBQWpCLEVBQXFCMEksTUFBckIsQ0FBNEIsRUFBRUMsT0FBTyxNQUFULEVBQTVCO0FBQ0EsT0FBSzNKLEVBQUwsQ0FBUXVDLE1BQVIsQ0FBZXFILFdBQWYsQ0FBMkIsRUFBRUMsVUFBVSxLQUFaLEVBQTNCO0FBQ0EsT0FBS3JFLEdBQUwsQ0FBU3NFLFVBQVQ7O0FBRUEsTUFBSSxLQUFLOUYsV0FBVCxFQUFzQjtBQUNyQixRQUFLK0YsbUJBQUw7QUFDQSxRQUFLQyxjQUFMLENBQW9CLEVBQXBCLEVBQXdCLEtBQUs5RSxjQUFMLEdBQXNCLENBQXRCLEdBQTBCLEtBQUsxRSxPQUFMLENBQWEyRixlQUEvRDtBQUNBLFFBQUtuRyxFQUFMLENBQVErQixPQUFSLENBQWdCdUUsUUFBaEIsQ0FBeUIsTUFBekI7QUFDQSxRQUFLdEcsRUFBTCxDQUFRd0MsY0FBUixDQUF1QjhELFFBQXZCLENBQWdDLE1BQWhDO0FBQ0EsUUFBS3RHLEVBQUwsQ0FBUW9DLFVBQVIsQ0FBbUJrRSxRQUFuQixDQUE0QixNQUE1QjtBQUNBLFFBQUt0RyxFQUFMLENBQVF5QyxRQUFSLENBQWlCNkQsUUFBakIsQ0FBMEIsTUFBMUI7QUFDQSxRQUFLdEcsRUFBTCxDQUFRUSxPQUFSLENBQWdCOEYsUUFBaEIsQ0FBeUIsTUFBekI7QUFDQSxHQVJELE1BU0ssSUFBSSxLQUFLaUMsT0FBTCxJQUFnQixLQUFLMEIsU0FBTCxFQUFwQixFQUFzQztBQUMxQyxRQUFLQyxzQkFBTDtBQUNBLEdBRkksTUFHQSxJQUFJLENBQUMsS0FBSzVKLEtBQUwsQ0FBV0QsS0FBWCxFQUFMLEVBQXlCO0FBQzdCLFFBQUs4SixnQkFBTDtBQUNBLFFBQUtILGNBQUwsQ0FBb0IsRUFBcEI7QUFDQTs7QUFFRCxPQUFLcEUsaUJBQUwsQ0FBdUIsS0FBS0YsY0FBNUI7QUFDQSxFQTlTdUQ7O0FBZ1R4REUsb0JBQW1CLDJCQUFTd0UsU0FBVCxFQUFvQjtBQUN0QyxNQUFJLENBQUNBLFNBQUQsSUFBY0EsVUFBVWpDLE1BQVYsS0FBcUIsQ0FBdkMsRUFDQyxLQUFLa0MsU0FBTCxHQURELEtBR0MsS0FBS0MsVUFBTDtBQUNELEVBclR1RDs7QUF1VHhEQyxnQ0FBK0IseUNBQVc7QUFDekMsT0FBS2pLLEtBQUwsQ0FBVytILEdBQVgsQ0FBZTtBQUNkdEYsZ0JBQWEsS0FBSy9DLEVBQUwsQ0FBUStDLFdBQVIsQ0FBb0J5SCxHQUFwQixFQURDO0FBRWRuSCxhQUFVLEtBQUtyRCxFQUFMLENBQVFxRCxRQUFSLENBQWlCb0gsSUFBakIsQ0FBc0IsU0FBdEIsQ0FGSTtBQUdkckgsYUFBVSxLQUFLcEQsRUFBTCxDQUFRb0QsUUFBUixDQUFpQm9ILEdBQWpCLEVBSEk7QUFJZDFILFVBQU8sS0FBSzlDLEVBQUwsQ0FBUThDLEtBQVIsQ0FBYzBILEdBQWQsRUFKTztBQUtkckgsY0FBVyxLQUFLbkQsRUFBTCxDQUFRbUQsU0FBUixDQUFrQnFILEdBQWxCLEVBTEc7QUFNZHZILFlBQVMsS0FBS2pELEVBQUwsQ0FBUWlELE9BQVIsQ0FBZ0J1SCxHQUFoQjtBQU5LLEdBQWYsRUFPRyxFQUFFNUYsVUFBVSxLQUFaLEVBUEg7O0FBU0EsT0FBS3RFLEtBQUwsQ0FBV3FFLElBQVg7O0FBRUEsTUFBSSxLQUFLM0UsRUFBTCxDQUFROEMsS0FBUixDQUFjMEgsR0FBZCxPQUF3QixFQUF4QixJQUE4QixLQUFLeEssRUFBTCxDQUFRbUQsU0FBUixDQUFrQnFILEdBQWxCLE9BQTRCLEVBQTFELElBQWdFLEtBQUt4SyxFQUFMLENBQVFpRCxPQUFSLENBQWdCdUgsR0FBaEIsT0FBMEIsRUFBOUYsRUFDQyxLQUFLTCxnQkFBTDs7QUFFRCxNQUFJLEtBQUs3SixLQUFMLENBQVdELEtBQVgsTUFBc0IsQ0FBQyxLQUFLa0ksT0FBaEMsRUFDQyxLQUFLbUMsU0FBTCxHQURELEtBR0MsS0FBS1YsY0FBTCxDQUFvQixFQUFwQjtBQUNELEVBMVV1RDs7QUE0VXhERSx5QkFBd0Isa0NBQVc7QUFDbEMsTUFBSSxLQUFLRCxTQUFMLEVBQUosRUFDQyxLQUFLakssRUFBTCxDQUFRMEMsZ0JBQVIsQ0FBeUJpSSxXQUF6QixDQUFxQyxNQUFyQyxFQURELEtBR0MsS0FBSzNLLEVBQUwsQ0FBUTJDLGNBQVIsQ0FBdUJnSSxXQUF2QixDQUFtQyxNQUFuQzs7QUFFRCxPQUFLM0ssRUFBTCxDQUFRNEMsYUFBUixDQUFzQjBELFFBQXRCLENBQStCLE1BQS9CO0FBQ0EsT0FBS3RHLEVBQUwsQ0FBUXNELHNCQUFSLENBQStCa0gsR0FBL0IsQ0FBbUMseUJBQW5DO0FBQ0EsRUFwVnVEOztBQXNWeERMLG1CQUFrQiw0QkFBVztBQUM1QixPQUFLbkssRUFBTCxDQUFRNEIsWUFBUixDQUFxQjBFLFFBQXJCLENBQThCLE1BQTlCO0FBQ0EsT0FBS3RHLEVBQUwsQ0FBUTZCLGFBQVIsQ0FBc0J5RSxRQUF0QixDQUErQiwwQkFBL0I7QUFDQSxPQUFLdEcsRUFBTCxDQUFRd0IsZUFBUixDQUF3Qm1KLFdBQXhCLENBQW9DLHlCQUFwQztBQUNBLE9BQUszSyxFQUFMLENBQVF5QixlQUFSLENBQXdCa0osV0FBeEIsQ0FBb0MsTUFBcEM7O0FBRUEsT0FBS0MsSUFBTCxHQUFZLElBQUl6TCxRQUFKLENBQWE7QUFDeEIwTCxVQUFPLEtBQUs3SyxFQUFMLENBQVF5QixlQUFSLENBQXdCZ0QsR0FBeEIsQ0FBNEIsQ0FBNUIsQ0FEaUI7QUFFeEJtRyxTQUFNLEtBQUs1SyxFQUFMLENBQVE2QixhQUFSLENBQXNCNEMsR0FBdEIsQ0FBMEIsQ0FBMUIsQ0FGa0I7QUFHeEJxRyxZQUFTLEdBSGU7QUFJeEJDLGNBQVc7QUFKYSxHQUFiLENBQVo7QUFNQSxFQWxXdUQ7O0FBb1d4RGhCLHNCQUFxQiwrQkFBVztBQUMvQixPQUFLL0osRUFBTCxDQUFRNEIsWUFBUixDQUFxQjBFLFFBQXJCLENBQThCLE1BQTlCO0FBQ0EsT0FBS3RHLEVBQUwsQ0FBUTZCLGFBQVIsQ0FBc0J5RSxRQUF0QixDQUErQiwwQkFBL0I7QUFDQSxPQUFLdEcsRUFBTCxDQUFRd0IsZUFBUixDQUF3Qm1KLFdBQXhCLENBQW9DLHlCQUFwQztBQUNBLE9BQUszSyxFQUFMLENBQVF5QixlQUFSLENBQXdCa0osV0FBeEIsQ0FBb0MsTUFBcEM7O0FBRUEsT0FBS0MsSUFBTCxHQUFZLElBQUl6TCxRQUFKLENBQWE7QUFDeEIwTCxVQUFPLEtBQUs3SyxFQUFMLENBQVF5QixlQUFSLENBQXdCZ0QsR0FBeEIsQ0FBNEIsQ0FBNUIsQ0FEaUI7QUFFeEJtRyxTQUFNLEtBQUs1SyxFQUFMLENBQVE2QixhQUFSLENBQXNCNEMsR0FBdEIsQ0FBMEIsQ0FBMUIsQ0FGa0I7QUFHeEJxRyxZQUFTLEdBSGU7QUFJeEJDLGNBQVc7QUFKYSxHQUFiLENBQVo7QUFNQSxFQWhYdUQ7O0FBa1h4REMsNEJBQTJCLG1DQUFTQyxJQUFULEVBQWU7QUFDekMsTUFBSSxLQUFLQyxzQkFBVCxFQUFpQztBQUNoQyxRQUFLQSxzQkFBTCxDQUE0QkMsT0FBNUI7QUFDQSxRQUFLRCxzQkFBTCxHQUE4QixJQUE5QjtBQUNBOztBQUVELE9BQUtsTCxFQUFMLENBQVEwQixjQUFSLENBQXVCMEosTUFBdkIsQ0FBOEJILEtBQUtJLE1BQUwsR0FBYzdGLEdBQTVDOztBQUVBLE9BQUswRixzQkFBTCxHQUE4QkQsSUFBOUI7QUFDQSxFQTNYdUQ7O0FBNlh4REssZUFBYyxzQkFBU3ZLLEdBQVQsRUFBYztBQUMzQjtBQUNBLE9BQUtxRSxJQUFMLENBQVVtQixrQkFBVixDQUE2QixLQUFLSixlQUFMLENBQXFCN0YsS0FBckIsQ0FBMkJrRyxNQUEzQixFQUE3Qjs7QUFFQTtBQUNBLE9BQUtMLGVBQUwsQ0FBcUJnRixPQUFyQjtBQUNBLFNBQU8sS0FBS2hGLGVBQVo7O0FBRUEsTUFBSXBGLElBQUl3SyxNQUFKLENBQVdDLFNBQVgsS0FBeUIsSUFBN0IsRUFBbUM7QUFDbEM7QUFDQSxPQUFJLEtBQUs5RixjQUFMLENBQW9CeUMsTUFBcEIsS0FBK0IsS0FBSy9DLElBQUwsQ0FBVWMsS0FBVixDQUFnQkMsZUFBaEIsR0FBa0MsQ0FBckUsRUFDQyxLQUFLdUUsU0FBTCxHQURELEtBR0MsS0FBS2UsWUFBTCxDQUFrQixLQUFLckcsSUFBTCxDQUFVYyxLQUFWLENBQWdCQyxlQUFoQixHQUFrQyxDQUFwRDtBQUNELEdBTkQsTUFPSyxJQUFJLEtBQUtmLElBQUwsQ0FBVWMsS0FBVixDQUFnQkMsZUFBaEIsSUFBbUMsQ0FBdkMsRUFBMEM7QUFDOUMsUUFBS3NGLFlBQUwsQ0FBa0IsS0FBS3JHLElBQUwsQ0FBVWMsS0FBVixDQUFnQkMsZUFBaEIsR0FBa0MsQ0FBcEQ7QUFDQTs7QUFFRCxPQUFLdUYsZUFBTDtBQUNBLEVBalp1RDs7QUFtWnhEQyxrQkFBaUIsMkJBQVc7QUFDM0IsT0FBS3JMLEtBQUwsQ0FBVytILEdBQVgsQ0FBZSxFQUFFakYsVUFBVSxLQUFLcEQsRUFBTCxDQUFRb0QsUUFBUixDQUFpQm9ILEdBQWpCLEVBQVosRUFBZjs7QUFFQSxNQUFJLEtBQUtwRixJQUFMLENBQVVjLEtBQWQsRUFDQyxLQUFLZCxJQUFMLENBQVV3RyxNQUFWLENBQWlCLEtBQUt0TCxLQUFMLENBQVdrRyxNQUFYLEVBQWpCO0FBQ0QsRUF4WnVEOztBQTBaeERxRixrQkFBaUIsMkJBQVc7QUFDM0IsT0FBS3ZMLEtBQUwsQ0FBVytILEdBQVgsQ0FBZSxFQUFFaEYsVUFBVSxLQUFLckQsRUFBTCxDQUFRcUQsUUFBUixDQUFpQm9ILElBQWpCLENBQXNCLFNBQXRCLENBQVosRUFBZjs7QUFFQSxNQUFJLEtBQUt0RSxlQUFULEVBQTBCO0FBQ3pCLE9BQUksS0FBS2YsSUFBTCxDQUFVYyxLQUFkLEVBQXFCO0FBQ3BCO0FBQ0EsU0FBS0MsZUFBTCxDQUFxQnhCLElBQXJCLENBQTBCLElBQTFCLEVBQWdDLElBQWhDOztBQUVBO0FBQ0EsU0FBS1MsSUFBTCxDQUFVbUIsa0JBQVYsQ0FBNkIsS0FBS0osZUFBTCxDQUFxQjdGLEtBQXJCLENBQTJCa0csTUFBM0IsRUFBN0I7O0FBRUE7QUFDQSxTQUFLcEIsSUFBTCxDQUFVd0csTUFBVixDQUFpQixLQUFLdEwsS0FBTCxDQUFXa0csTUFBWCxFQUFqQjtBQUNBO0FBQ0Q7O0FBRURqSCxPQUFLMkIsT0FBTCxDQUFhLGlCQUFiLEVBQWdDLEtBQUtsQixFQUFMLENBQVFxRCxRQUFSLENBQWlCb0gsSUFBakIsQ0FBc0IsU0FBdEIsQ0FBaEM7O0FBRUEsTUFBSSxLQUFLdEUsZUFBTCxJQUF3QixDQUFDLEtBQUtuRyxFQUFMLENBQVFxRCxRQUFSLENBQWlCb0gsSUFBakIsQ0FBc0IsU0FBdEIsQ0FBN0IsRUFDQyxLQUFLckYsSUFBTCxDQUFVMEcsZ0JBQVY7QUFDRCxFQTlhdUQ7O0FBZ2J4REMsYUFBWSxzQkFBVztBQUN0QixPQUFLbkIsSUFBTCxDQUFVOUksTUFBVjtBQUNBLEVBbGJ1RDs7QUFvYnhEa0ssZUFBYyxzQkFBU0MsUUFBVCxFQUFtQjtBQUNoQyxPQUFLak0sRUFBTCxDQUFRUSxPQUFSLENBQWdCbUssV0FBaEIsQ0FBNEIsV0FBNUI7O0FBRUEsTUFBSSxLQUFLdUIsV0FBVCxFQUNDLEtBQUtBLFdBQUwsQ0FBaUJmLE9BQWpCOztBQUVELE9BQUtlLFdBQUwsR0FBbUIsSUFBSWpOLFVBQUosQ0FBZTtBQUNqQ2tOLFdBQVEsS0FBS25NLEVBQUwsQ0FBUVEsT0FEaUI7QUFFakM0TCxTQUFNLE9BRjJCO0FBR2pDQyxZQUFTLElBSHdCO0FBSWpDckgsU0FBTSwwQkFKMkI7QUFLakNzSCxjQUFXLFNBTHNCO0FBTWpDQyxjQUFXTixTQUFTM0wsS0FBVCxDQUFla007QUFOTyxHQUFmLENBQW5COztBQVNBO0FBQ0FQLFdBQVN6RCxVQUFULENBQW9CLEtBQUswRCxXQUF6QixFQUFzQ0QsU0FBU1EsWUFBL0M7QUFDQSxFQXJjdUQ7O0FBdWN4REMsY0FBYSx1QkFBVztBQUN2QixPQUFLMU0sRUFBTCxDQUFRUSxPQUFSLENBQWdCOEYsUUFBaEIsQ0FBeUIsV0FBekI7O0FBRUEsTUFBSSxLQUFLNEYsV0FBVCxFQUNDLEtBQUtBLFdBQUwsQ0FBaUJmLE9BQWpCO0FBQ0QsRUE1Y3VEOztBQThjeER3QixnQkFBZSx1QkFBU0MsS0FBVCxFQUFnQjtBQUM5QkEsUUFBTTNHLGVBQU47O0FBRUEsT0FBS2lHLFdBQUwsQ0FBaUJ0RixJQUFqQjtBQUNBLEVBbGR1RDs7QUFvZHhEaUcsd0JBQXVCLCtCQUFTMUwsSUFBVCxFQUFlMkwsUUFBZixFQUF5QjtBQUMvQyxPQUFLeE0sS0FBTCxDQUFXbUYsRUFBWCxHQUFnQnFILFNBQVNySCxFQUF6QjtBQUNBLE9BQUtuRixLQUFMLENBQVd5TSxHQUFYLEdBQWlCRCxTQUFTQyxHQUExQjtBQUNBLEVBdmR1RDs7QUF5ZHhEQyxzQkFBcUIsNkJBQVMxTSxLQUFULEVBQWdCd00sUUFBaEIsRUFBMEI7QUFDOUMsT0FBS3RILEdBQUwsQ0FBU3lILElBQVQsQ0FBYyxpQkFBZCxFQUFpQzNHLFFBQWpDLENBQTBDLE1BQTFDOztBQUVBLE9BQUs0RyxTQUFMLENBQWUsSUFBSTlOLE9BQU8rTixLQUFYLENBQWlCO0FBQy9CckssVUFBTyx1QkFEd0I7QUFFL0JzSyxZQUFTLGdEQUZzQjtBQUcvQk4sYUFBVUE7QUFIcUIsR0FBakIsQ0FBZjtBQUtBLEVBamV1RDs7QUFtZXhETywyQkFBMEIsb0NBQVc7QUFDcEMsTUFBSSxLQUFLM0gsY0FBTCxDQUFvQnlDLE1BQXBCLEdBQTZCLENBQWpDLEVBQW9DO0FBQ25DO0FBQ0EsT0FBTWhILE9BQU8sS0FBS21NLFlBQUwsRUFBYjs7QUFFQSxPQUFNQyxXQUFXLEtBQUtDLGNBQUwsQ0FBb0IsS0FBS2xOLEtBQXpCLENBQWpCO0FBQ0FpTixZQUFTRSxVQUFULENBQW9CaEgsWUFBcEIsR0FBbUN0RixLQUFLc00sVUFBTCxDQUFnQmhILFlBQW5EO0FBQ0E4RyxZQUFTbEYsR0FBVCxDQUFhO0FBQ1pxRixjQUFVdk0sS0FBS3NNLFVBQUwsQ0FBZ0JDO0FBRGQsSUFBYjs7QUFJQSxPQUFJLEtBQUs3RyxZQUFMLEVBQUosRUFBeUI7QUFDeEIwRyxhQUFTbEYsR0FBVCxDQUFhO0FBQ1owRSxVQUFLLEtBQUt6TSxLQUFMLENBQVd5TTtBQURKLEtBQWI7QUFHQTs7QUFFRCxRQUFLNUMsZ0JBQUw7O0FBRUFvRCxZQUFTNUksSUFBVCxDQUFjNEksU0FBU0UsVUFBdkIsRUFBbUM7QUFDbENFLFVBQU0sSUFENEI7QUFFbEMvSSxjQUFVLEtBRndCO0FBR2xDa0QsYUFBUyxLQUFLK0UscUJBQUwsQ0FBMkI5SCxJQUEzQixDQUFnQyxJQUFoQyxDQUh5QjtBQUlsQ3NCLFdBQU8sS0FBSzJHLG1CQUFMLENBQXlCakksSUFBekIsQ0FBOEIsSUFBOUI7QUFKMkIsSUFBbkM7O0FBT0F4RyxPQUFJMkMsT0FBSixDQUFZM0MsSUFBSTBJLE1BQUosQ0FBVzJHLGVBQXZCLEVBQXdDTCxRQUF4QztBQUNBO0FBQ0QsRUEvZnVEOztBQWlnQnhEN0MsWUFBVyxxQkFBVztBQUNyQixPQUFLMkMsd0JBQUw7O0FBRUEsTUFBTXBDLE9BQU8sSUFBSXZMLGFBQUosQ0FBa0IsRUFBRWdCLE1BQU0sS0FBS2dGLGNBQUwsQ0FBb0J5QyxNQUE1QixFQUFsQixDQUFiOztBQUVBLE9BQUt4QyxRQUFMLENBQWNzRixJQUFkLEVBQW9CLE1BQXBCLEVBQTRCLEtBQUtqQixjQUFMLENBQW9CakYsSUFBcEIsQ0FBeUIsSUFBekIsQ0FBNUI7O0FBRUEsT0FBS2lHLHlCQUFMLENBQStCQyxJQUEvQjs7QUFFQSxPQUFLakwsRUFBTCxDQUFRbUMsT0FBUixDQUFnQm1FLFFBQWhCLENBQXlCLE1BQXpCO0FBQ0EsT0FBS3RHLEVBQUwsQ0FBUVEsT0FBUixDQUFnQjhGLFFBQWhCLENBQXlCLFdBQXpCO0FBQ0EsT0FBS3RHLEVBQUwsQ0FBUW9DLFVBQVIsQ0FBbUJrRSxRQUFuQixDQUE0QixNQUE1QjtBQUNBLEVBN2dCdUQ7O0FBK2dCeER1SCxlQUFjLHNCQUFTQyxLQUFULEVBQWdCO0FBQzdCLE1BQU1yTixRQUFRLEtBQUtpRixjQUFMLENBQW9CeUMsTUFBbEM7QUFDQSxNQUFNNEYsY0FBYzVQLEVBQUU2UCxXQUFGLENBQWNGLEtBQWQsSUFBdUJyTixLQUF2QixHQUErQnFOLFFBQVEsQ0FBM0Q7O0FBRUEsT0FBSzlOLEVBQUwsQ0FBUWlDLGNBQVIsQ0FBdUJnTSxJQUF2QixDQUE0QkYsWUFBWUcsUUFBWixFQUE1QjtBQUNBLE9BQUtsTyxFQUFMLENBQVF1QyxNQUFSLENBQWU0TCxJQUFmLENBQW9CLEtBQXBCLEVBQTJCMU4sS0FBM0IsRUFBa0MrSixHQUFsQyxDQUFzQ3VELFlBQVlHLFFBQVosRUFBdEMsRUFBOER0RSxXQUE5RCxDQUEwRSxRQUExRSxFQUFvRixJQUFwRjtBQUNBLE9BQUs1SixFQUFMLENBQVFzQyxXQUFSLENBQW9CMkwsSUFBcEIsQ0FBeUJ4TixLQUF6QjtBQUNBLE9BQUtULEVBQUwsQ0FBUXFDLFNBQVIsQ0FBa0I4TCxJQUFsQixDQUF1QixLQUF2QixFQUE4QjFOLEtBQTlCOztBQUVBLE1BQUksQ0FBQ3NOLFdBQUQsSUFBZ0IsS0FBSy9OLEVBQUwsQ0FBUXFDLFNBQVIsQ0FBa0JtSSxHQUFsQixLQUEwQi9KLEtBQTlDLEVBQ0MsS0FBS1QsRUFBTCxDQUFRcUMsU0FBUixDQUFrQm1JLEdBQWxCLENBQXNCLEVBQXRCLEVBREQsS0FHQyxLQUFLeEssRUFBTCxDQUFRcUMsU0FBUixDQUFrQm1JLEdBQWxCLENBQXNCdUQsWUFBWUcsUUFBWixFQUF0QjtBQUNELEVBNWhCdUQ7O0FBOGhCeER4QyxrQkFBaUIsMkJBQVc7QUFDM0IsTUFBSTBDLGFBQWEsQ0FBakI7QUFDQSxNQUFNM04sUUFBUSxLQUFLaUYsY0FBTCxDQUFvQnlDLE1BQXBCLEdBQTZCLENBQTNDOztBQUVBLE1BQU1rRyxPQUFPLEtBQUtsSSxlQUFMLEdBQXVCbEksRUFBRSxhQUFGLEVBQWlCdU0sR0FBakIsRUFBdkIsR0FBZ0QvSixLQUE3RDtBQUNBLE9BQUtULEVBQUwsQ0FBUWlDLGNBQVIsQ0FBdUJnTSxJQUF2QixDQUE0QkksSUFBNUI7O0FBRUEsT0FBSSxJQUFJQyxJQUFJLEtBQUs1SSxjQUFMLENBQW9CeUMsTUFBcEIsR0FBNkIsQ0FBekMsRUFBNENtRyxLQUFLLENBQWpELEVBQW9EQSxHQUFwRDtBQUNDRixpQkFBYyxLQUFLMUksY0FBTCxDQUFvQjRJLENBQXBCLEVBQXVCYixVQUF2QixDQUFrQ2MsY0FBaEQ7QUFERCxHQUdBLEtBQUt2TyxFQUFMLENBQVFnQyxTQUFSLENBQWtCaU0sSUFBbEIsQ0FBdUJHLFVBQXZCOztBQUVBLE1BQUlJLE9BQU8sQ0FBWDs7QUFFQSxNQUFJLEtBQUtySSxlQUFULEVBQ0NxSSxPQUFPLEtBQUtySSxlQUFMLENBQXFCN0YsS0FBckIsQ0FBMkJtTixVQUEzQixDQUFzQ2MsY0FBdEMsR0FBdUQsQ0FBdkQsR0FBMkQsS0FBS3BJLGVBQUwsQ0FBcUI3RixLQUFyQixDQUEyQm1OLFVBQTNCLENBQXNDYyxjQUFqRyxHQUFrSCxDQUF6SDs7QUFFRCxNQUFJQyxTQUFTLENBQWIsRUFDQ0EsT0FBT3ZRLEVBQUUscUJBQUYsRUFBeUJrSyxNQUFoQzs7QUFFRCxNQUFJcUcsU0FBUyxDQUFiLEVBQ0NBLE9BQU92USxFQUFFLHdDQUFGLEVBQTRDdU0sR0FBNUMsRUFBUDs7QUFFRCxNQUFJZ0UsU0FBUyxDQUFULElBQWNBLFNBQVNDLFNBQTNCLEVBQ0NELE9BQU92USxFQUFFLHFCQUFGLEVBQXlCa0ssTUFBaEM7O0FBRURxRyxTQUFPQSxTQUFTQyxTQUFULEdBQXFCLENBQXJCLEdBQXlCRCxJQUFoQzs7QUFFQSxNQUFJQSxTQUFTLENBQWIsRUFBZ0I7QUFDZixRQUFLeE8sRUFBTCxDQUFRa0MsWUFBUixDQUFxQnFELE1BQXJCLEdBQThCZSxRQUE5QixDQUF1QyxNQUF2QztBQUNBLFFBQUt0RyxFQUFMLENBQVFpQyxjQUFSLENBQXVCc0QsTUFBdkIsR0FBZ0NlLFFBQWhDLENBQXlDLE1BQXpDO0FBQ0EsR0FIRCxNQUlLO0FBQ0osUUFBS3RHLEVBQUwsQ0FBUWtDLFlBQVIsQ0FBcUJxRCxNQUFyQixHQUE4Qm9GLFdBQTlCLENBQTBDLE1BQTFDO0FBQ0EsUUFBSzNLLEVBQUwsQ0FBUWlDLGNBQVIsQ0FBdUJzRCxNQUF2QixHQUFnQ29GLFdBQWhDLENBQTRDLE1BQTVDO0FBQ0E7QUFDRCxPQUFLM0ssRUFBTCxDQUFRa0MsWUFBUixDQUFxQitMLElBQXJCLENBQTBCTyxJQUExQjtBQUNBLEVBbmtCdUQ7O0FBcWtCeER4RSxpQkFBZ0Isd0JBQVMxRixJQUFULEVBQWVvSyxhQUFmLEVBQThCO0FBQzdDLE1BQUksS0FBS3ZJLGVBQVQsRUFBMEI7QUFDekIsUUFBS0EsZUFBTCxDQUFxQmdGLE9BQXJCO0FBQ0EsUUFBS2hGLGVBQUwsR0FBdUIsSUFBdkI7QUFDQTs7QUFFRCxNQUFJOEYsaUJBQUo7O0FBRUEsTUFBSTNILFNBQVMsRUFBYixFQUFpQjtBQUNoQjtBQUNBLE9BQU1oRSxRQUFRbkMsRUFBRXdRLElBQUYsQ0FBTyxLQUFLakosY0FBWixDQUFkOztBQUVBLE9BQUksQ0FBQ3BGLEtBQUwsRUFDQyxPQUFPLEtBQUtvSyxTQUFMLEVBQVA7O0FBRUR1QixjQUFXLElBQUk1TSxVQUFVaUIsTUFBTW1FLEdBQU4sQ0FBVSxNQUFWLEtBQXFCbkUsTUFBTXdHLEdBQU4sQ0FBVSxTQUFWLElBQXVCLE1BQU14RyxNQUFNbUUsR0FBTixDQUFVLFNBQVYsQ0FBN0IsR0FBb0QsRUFBekUsQ0FBVixDQUFKLENBQTRGO0FBQ3RHbUssZ0JBQVksS0FBS3RPLEtBRHFGO0FBRXRHMkwsY0FBVTNMLEtBRjRGO0FBR3RHMEQsaUJBQWEsS0FBS0E7QUFIb0YsSUFBNUYsQ0FBWDtBQUtBLEdBWkQsTUFhSztBQUNKaUksY0FBVyxJQUFJNU0sVUFBVWlGLElBQVYsQ0FBSixDQUFvQjtBQUM5Qm1CLFFBQUksS0FBS0EsRUFBTCxFQUQwQjtBQUU5Qm1KLGdCQUFZLEtBQUt0TyxLQUZhO0FBRzlCMEQsaUJBQWEsS0FBS0E7QUFIWSxJQUFwQixDQUFYOztBQU1BO0FBQ0EsUUFBSzBCLGNBQUwsQ0FBb0JrRCxJQUFwQixDQUF5QnFELFNBQVMzTCxLQUFsQztBQUNBOztBQUVEO0FBQ0EsT0FBS3FGLFFBQUwsQ0FBY3NHLFFBQWQsRUFBd0IsZUFBeEIsRUFBeUMsS0FBS1gsWUFBTCxDQUFrQnZHLElBQWxCLENBQXVCLElBQXZCLENBQXpDOztBQUVBLE9BQUtpRyx5QkFBTCxDQUErQmlCLFFBQS9COztBQUVBO0FBQ0EsTUFBSUEsU0FBUzNMLEtBQVQsQ0FBZWtNLGVBQW5CLEVBQ0MsS0FBS1IsWUFBTCxDQUFrQkMsUUFBbEI7O0FBRUQsTUFBSSxDQUFDLEtBQUs3RyxJQUFMLENBQVVjLEtBQWYsRUFBc0I7QUFDckIsT0FBTS9FLE9BQU8sS0FBS2IsS0FBTCxDQUFXa0csTUFBWCxFQUFiOztBQUVBckYsUUFBS3NGLFlBQUwsR0FBb0J0SSxFQUFFdUksR0FBRixDQUFNLEtBQUtoQixjQUFYLEVBQTJCO0FBQUEsV0FBaUJtSixjQUFjckksTUFBZCxFQUFqQjtBQUFBLElBQTNCLENBQXBCO0FBQ0EsUUFBS3BCLElBQUwsQ0FBVTBKLEtBQVYsQ0FBZ0IzTixJQUFoQixFQUFzQixFQUFFMUMsVUFBVSxFQUFFc1EsWUFBWSxLQUFkLEVBQXFCQyxhQUFhLEtBQWxDLEVBQVosRUFBdEIsRUFBK0U7QUFDOUU3SSxxQkFBaUJ1SSxrQkFBa0JELFNBQWxCLEdBQThCLEtBQUsvSSxjQUFMLENBQW9CeUMsTUFBcEIsR0FBNkIsQ0FBM0QsR0FBK0R1RyxhQURGO0FBRTlFcEosa0JBQWMsS0FBS2hGLEtBQUwsQ0FBV21FLEdBQVgsQ0FBZSxVQUFmO0FBRmdFLElBQS9FO0FBSUEsR0FSRCxNQVNLLElBQUlILElBQUosRUFBVTtBQUNkLFFBQUtjLElBQUwsQ0FBVTZKLFdBQVYsQ0FBc0JoRCxTQUFTM0wsS0FBVCxDQUFla0csTUFBZixFQUF0QjtBQUNBLEdBRkksTUFHQTtBQUNKLFFBQUtwQixJQUFMLENBQVU4SixJQUFWLENBQWUsS0FBS3hKLGNBQUwsQ0FBb0J5QyxNQUFwQixHQUE2QixDQUE1QztBQUNBOztBQUVELE9BQUtuSSxFQUFMLENBQVFtQyxPQUFSLENBQWdCd0ksV0FBaEIsQ0FBNEIsTUFBNUI7QUFDQSxPQUFLM0ssRUFBTCxDQUFRdUMsTUFBUixDQUFlNEwsSUFBZixDQUFvQixLQUFwQixFQUEyQixLQUFLekksY0FBTCxDQUFvQnlDLE1BQS9DLEVBQXVEcUMsR0FBdkQsQ0FBMkQsS0FBSzlFLGNBQUwsQ0FBb0J5QyxNQUEvRSxFQUF1RnlCLFdBQXZGLENBQW1HLFFBQW5HLEVBQTZHLElBQTdHO0FBQ0EsT0FBSzVKLEVBQUwsQ0FBUXFDLFNBQVIsQ0FBa0I4TCxJQUFsQixDQUF1QixLQUF2QixFQUE4QixLQUFLekksY0FBTCxDQUFvQnlDLE1BQWxELEVBQTBEcUMsR0FBMUQsQ0FBOEQsS0FBSzlFLGNBQUwsQ0FBb0J5QyxNQUFsRjtBQUNBLE9BQUtuSSxFQUFMLENBQVFvQyxVQUFSLENBQW1CdUksV0FBbkIsQ0FBK0IsTUFBL0I7O0FBRUEsT0FBS3hFLGVBQUwsR0FBdUI4RixRQUF2Qjs7QUFFQSxNQUFJM0gsU0FBUyxFQUFiLEVBQ0MvRSxLQUFLMkIsT0FBTCxDQUFhLGlCQUFiLEVBQWdDLEtBQUt3RSxjQUFyQzs7QUFFRCxPQUFLbUksWUFBTDtBQUNBLE9BQUtuQyxlQUFMO0FBQ0EsRUExb0J1RDs7QUE0b0J4REQsZUFBYyxzQkFBU3FDLEtBQVQsRUFBZ0I7QUFDN0IsTUFBSSxLQUFLM0gsZUFBVCxFQUEwQjtBQUN6QixRQUFLQSxlQUFMLENBQXFCZ0YsT0FBckI7QUFDQSxRQUFLaEYsZUFBTCxHQUF1QixJQUF2QjtBQUNBOztBQUVELE1BQU03RixRQUFRLEtBQUtvRixjQUFMLENBQW9Cb0ksS0FBcEIsQ0FBZDtBQUNBLE1BQU03QixXQUFXLElBQUk1TSxVQUFVaUIsTUFBTW1FLEdBQU4sQ0FBVSxNQUFWLEtBQXFCbkUsTUFBTXdHLEdBQU4sQ0FBVSxTQUFWLElBQXVCLE1BQU14RyxNQUFNbUUsR0FBTixDQUFVLFNBQVYsQ0FBN0IsR0FBb0QsRUFBekUsQ0FBVixDQUFKLENBQTRGO0FBQzVHbUssZUFBWSxLQUFLdE8sS0FEMkY7QUFFNUcyTCxhQUFVM0wsS0FGa0c7QUFHNUcwRCxnQkFBYSxLQUFLQTtBQUgwRixHQUE1RixDQUFqQjs7QUFNQTtBQUNBLE9BQUsyQixRQUFMLENBQWNzRyxRQUFkLEVBQXdCLGVBQXhCLEVBQXlDLEtBQUtYLFlBQUwsQ0FBa0J2RyxJQUFsQixDQUF1QixJQUF2QixDQUF6Qzs7QUFFQSxPQUFLaUcseUJBQUwsQ0FBK0JpQixRQUEvQjs7QUFFQTtBQUNBLE1BQUlBLFNBQVMzTCxLQUFULENBQWVrTSxlQUFuQixFQUNDLEtBQUtSLFlBQUwsQ0FBa0JDLFFBQWxCLEVBREQsS0FHQyxLQUFLUyxXQUFMOztBQUVELE9BQUt0SCxJQUFMLENBQVU4SixJQUFWLENBQWVwQixLQUFmOztBQUVBLE9BQUs5TixFQUFMLENBQVFtQyxPQUFSLENBQWdCd0ksV0FBaEIsQ0FBNEIsTUFBNUI7QUFDQSxPQUFLM0ssRUFBTCxDQUFRdUMsTUFBUixDQUFlaUksR0FBZixDQUFtQnNELEtBQW5CLEVBQTBCbEUsV0FBMUIsQ0FBc0MsUUFBdEMsRUFBZ0QsSUFBaEQ7QUFDQSxPQUFLNUosRUFBTCxDQUFRcUMsU0FBUixDQUFrQm1JLEdBQWxCLENBQXNCc0QsS0FBdEI7QUFDQSxPQUFLOU4sRUFBTCxDQUFRb0MsVUFBUixDQUFtQnVJLFdBQW5CLENBQStCLE1BQS9COztBQUVBLE9BQUt4RSxlQUFMLEdBQXVCOEYsUUFBdkI7O0FBRUEsT0FBSzRCLFlBQUwsQ0FBa0JDLEtBQWxCO0FBQ0EsRUE5cUJ1RDs7QUFnckJ4RHRMLGlCQUFnQiwwQkFBVztBQUMxQixNQUFNc0wsUUFBUSxLQUFLMUksSUFBTCxDQUFVYyxLQUFWLENBQWdCQyxlQUE5Qjs7QUFFQSxNQUFJLEtBQUtBLGVBQVQsRUFBMEI7QUFDekIsUUFBS0EsZUFBTCxDQUFxQmdGLE9BQXJCO0FBQ0EsUUFBS2hGLGVBQUwsR0FBdUIsSUFBdkI7QUFDQTs7QUFFRCxPQUFLVCxjQUFMLENBQW9CeUosTUFBcEIsQ0FBMkJyQixLQUEzQixFQUFrQyxDQUFsQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBSzFJLElBQUwsQ0FBVWdLLGNBQVY7O0FBRUE3UCxPQUFLMkIsT0FBTCxDQUFhLG1CQUFiLEVBQWtDLEtBQUt3RSxjQUF2Qzs7QUFFQSxNQUFJLEtBQUtBLGNBQUwsQ0FBb0J5QyxNQUFwQixLQUErQixDQUFuQyxFQUNDLEtBQUt1QyxTQUFMLEdBREQsS0FHQyxLQUFLZSxZQUFMLENBQWtCNEQsS0FBS0MsR0FBTCxDQUFTLEtBQUs1SixjQUFMLENBQW9CeUMsTUFBcEIsR0FBNkIsQ0FBdEMsRUFBeUMyRixLQUF6QyxDQUFsQjs7QUFFRCxPQUFLcEMsZUFBTDtBQUNBLEVBM3NCdUQ7O0FBNnNCeEQ2RCxvQkFBbUIsNkJBQVc7QUFDN0IsTUFBTXpCLFFBQVEwQixTQUFTLEtBQUt4UCxFQUFMLENBQVFxQyxTQUFSLENBQWtCbUksR0FBbEIsRUFBVCxFQUFrQyxFQUFsQyxDQUFkOztBQUVBLE1BQUksS0FBSzlFLGNBQUwsQ0FBb0J5QyxNQUFwQixHQUE2QjJGLEtBQTdCLElBQXNDQSxRQUFRLENBQVIsS0FBYyxLQUFLMUksSUFBTCxDQUFVYyxLQUFWLENBQWdCQyxlQUF4RSxFQUNDOztBQUVELE1BQUksQ0FBQyxLQUFLQSxlQUFMLENBQXFCeEIsSUFBckIsRUFBTCxFQUFrQztBQUNqQyxRQUFLM0UsRUFBTCxDQUFRcUMsU0FBUixDQUFrQm1JLEdBQWxCLENBQXNCLEtBQUtwRixJQUFMLENBQVVjLEtBQVYsQ0FBZ0JDLGVBQWhCLEdBQWtDLENBQXhEO0FBQ0E7QUFDQTs7QUFFRCxPQUFLZixJQUFMLENBQVVtQixrQkFBVixDQUE2QixLQUFLSixlQUFMLENBQXFCN0YsS0FBckIsQ0FBMkJrRyxNQUEzQixFQUE3QjtBQUNBLE9BQUtpRixZQUFMLENBQWtCcUMsUUFBUSxDQUExQjtBQUNBLEVBMXRCdUQ7O0FBNHRCeEQyQixzQkFBcUIsK0JBQVc7QUFDL0IsTUFBTTNCLFFBQVEwQixTQUFTLEtBQUt4UCxFQUFMLENBQVF1QyxNQUFSLENBQWVpSSxHQUFmLEVBQVQsRUFBK0IsRUFBL0IsQ0FBZDs7QUFFQSxNQUFJLEtBQUs5RSxjQUFMLENBQW9CeUMsTUFBcEIsR0FBNkIyRixLQUE3QixJQUFzQ0EsUUFBUSxDQUFSLEtBQWMsS0FBSzFJLElBQUwsQ0FBVWMsS0FBVixDQUFnQkMsZUFBcEUsSUFBdUYsQ0FBQyxLQUFLQSxlQUFqRyxFQUNDOztBQUVELE1BQUksQ0FBQyxLQUFLQSxlQUFMLENBQXFCeEIsSUFBckIsRUFBTCxFQUFrQztBQUNqQyxRQUFLM0UsRUFBTCxDQUFRdUMsTUFBUixDQUFlaUksR0FBZixDQUFtQixLQUFLcEYsSUFBTCxDQUFVYyxLQUFWLENBQWdCQyxlQUFoQixHQUFrQyxDQUFyRCxFQUF3RHlELFdBQXhELENBQW9FLFFBQXBFLEVBQThFLElBQTlFO0FBQ0E7QUFDQTs7QUFFRCxPQUFLeEUsSUFBTCxDQUFVbUIsa0JBQVYsQ0FBNkIsS0FBS0osZUFBTCxDQUFxQjdGLEtBQXJCLENBQTJCa0csTUFBM0IsRUFBN0I7QUFDQSxPQUFLaUYsWUFBTCxDQUFrQnFDLFFBQVEsQ0FBMUI7QUFDQSxFQXp1QnVEOztBQTJ1QnhENEIsdUJBQXNCLGdDQUFXO0FBQ2hDLE1BQUksS0FBS3BQLEtBQUwsQ0FBV3FQLGVBQVgsQ0FBMkJ2TSxRQUEzQixJQUF1QyxLQUFLOUMsS0FBTCxDQUFXcVAsZUFBWCxDQUEyQjFNLE9BQWxFLElBQ0gsS0FBSzNDLEtBQUwsQ0FBV3FQLGVBQVgsQ0FBMkJ4TSxTQUR4QixJQUNxQyxLQUFLN0MsS0FBTCxDQUFXcVAsZUFBWCxDQUEyQjdNLEtBRHBFLEVBQzJFO0FBQzFFLE9BQUksS0FBSzhILElBQVQsRUFDQyxLQUFLQSxJQUFMLENBQVVnRixJQUFWO0FBQ0Q7QUFDRCxFQWp2QnVEOztBQW12QnhEM0YsWUFBVyxxQkFBVztBQUNyQjtBQUNBLFNBQU8sQ0FBQyxLQUFLM0osS0FBTCxDQUFXRCxLQUFYLEVBQUQsSUFBdUIsS0FBS0MsS0FBTCxDQUFXbUUsR0FBWCxDQUFlLE1BQWYsSUFBeUIsQ0FBdkQ7QUFDQSxFQXR2QnVEOztBQXd2QnhEb0wsZ0JBQWUseUJBQVc7QUFDekIsTUFBSXpDLFVBQVUsSUFBZDs7QUFFQSxNQUFJLEtBQUtqSCxlQUFMLElBQXdCLENBQUMsS0FBS0EsZUFBTCxDQUFxQnhCLElBQXJCLEVBQTdCLEVBQ0M7O0FBRUQsTUFBSSxLQUFLc0YsU0FBTCxFQUFKLEVBQXNCO0FBQ3JCbUQsYUFBVSxzQ0FBc0MsS0FBSzlNLEtBQUwsQ0FBV21FLEdBQVgsQ0FBZSxNQUFmLENBQXRDLEdBQ1QsY0FEUyxJQUNTLEtBQUtuRSxLQUFMLENBQVdtRSxHQUFYLENBQWUsTUFBZixJQUF5QixDQUF6QixHQUE2QixHQUE3QixHQUFtQyxFQUQ1QyxJQUVULDRJQUZEOztBQUlBLFFBQUt6RSxFQUFMLENBQVE4QyxLQUFSLENBQWMwSCxHQUFkLENBQWtCLEtBQUtsSyxLQUFMLENBQVdtRSxHQUFYLENBQWUsT0FBZixDQUFsQjtBQUNBOztBQUVELFNBQU8ySSxPQUFQO0FBQ0EsRUF2d0J1RDs7QUF5d0J4RHpJLE9BQU0sY0FBU21MLE1BQVQsRUFBaUIzTyxJQUFqQixFQUF1QjtBQUM1QjtBQUNBLE9BQUs0TyxhQUFMLENBQW1CLFFBQW5COztBQUVBLE1BQUk1TyxLQUFLc00sVUFBTCxDQUFnQlYsR0FBaEIsS0FBd0IwQixTQUE1QixFQUNDdE4sS0FBS3NNLFVBQUwsQ0FBZ0JWLEdBQWhCLEdBQXNCLEtBQUt6TSxLQUFMLENBQVd5TSxHQUFqQzs7QUFFRDtBQUNBLE1BQUk1TCxLQUFLNk8sS0FBVCxFQUFnQjtBQUNmOztBQUVBO0FBQ0EsUUFBS0MsR0FBTCxHQUFXLEtBQUszUCxLQUFMLENBQVc0UCxVQUFYLENBQXNCLElBQXRCLEVBQTRCO0FBQ3RDdkMsVUFBTSxJQURnQztBQUV0Q3hNLFVBQU1BLEtBQUtzTSxVQUYyQjtBQUd0QzdJLGNBQVUsS0FINEI7QUFJdENrRCxhQUFTLEtBQUtxSSxhQUFMLENBQW1CcEwsSUFBbkIsQ0FBd0IsSUFBeEIsRUFBOEIrSyxNQUE5QixDQUo2QjtBQUt0Q3pKLFdBQU8sS0FBSytKLFdBQUwsQ0FBaUJyTCxJQUFqQixDQUFzQixJQUF0QjtBQUwrQixJQUE1QixDQUFYO0FBT0EsR0FYRCxNQVlLO0FBQ0o7O0FBRUE7QUFDQSxRQUFLa0wsR0FBTCxHQUFXLEtBQUszUCxLQUFMLENBQVdxRSxJQUFYLENBQWdCeEQsS0FBS3NNLFVBQXJCLEVBQWlDO0FBQzNDRSxVQUFNLElBRHFDO0FBRTNDL0ksY0FBVSxLQUZpQztBQUczQ2tELGFBQVMsS0FBS3FJLGFBQUwsQ0FBbUJwTCxJQUFuQixDQUF3QixJQUF4QixFQUE4QitLLE1BQTlCLENBSGtDO0FBSTNDekosV0FBTyxLQUFLK0osV0FBTCxDQUFpQnJMLElBQWpCLENBQXNCLElBQXRCO0FBSm9DLElBQWpDLENBQVg7QUFNQTs7QUFFRCxPQUFLc0wscUJBQUw7QUFDQSxFQTF5QnVEOztBQTR5QnhERCxjQUFhLHFCQUFTOVAsS0FBVCxFQUFnQmdRLENBQWhCLEVBQW1CO0FBQy9CLE9BQUtDLGNBQUw7QUFDQSxPQUFLL0ssR0FBTCxDQUFTeUgsSUFBVCxDQUFjLGlCQUFkLEVBQWlDM0csUUFBakMsQ0FBMEMsTUFBMUM7O0FBRUEsT0FBSzRHLFNBQUwsQ0FBZSxJQUFJOU4sT0FBTytOLEtBQVgsQ0FBaUI7QUFDL0JySyxVQUFPLHVCQUR3QjtBQUUvQnNLLFlBQVMsZ0RBRnNCO0FBRy9CTixhQUFVd0Q7QUFIcUIsR0FBakIsQ0FBZjtBQUtBLEVBcnpCdUQ7O0FBdXpCeERFLGFBQVksc0JBQVc7QUFDdEIsTUFBSUMsZUFBZSxJQUFuQjs7QUFFQTtBQUNBLE1BQUksS0FBS3RLLGVBQUwsSUFBd0IsQ0FBQyxLQUFLQSxlQUFMLENBQXFCeEIsSUFBckIsRUFBN0IsRUFDQzhMLGVBQWUsS0FBZjtBQUNEO0FBRkEsT0FHSyxJQUFJLEtBQUt0SyxlQUFULEVBQ0osS0FBS2YsSUFBTCxDQUFVbUIsa0JBQVYsQ0FBNkIsS0FBS0osZUFBTCxDQUFxQjdGLEtBQXJCLENBQTJCa0csTUFBM0IsRUFBN0I7O0FBRUQsU0FBT2lLLFlBQVA7QUFDQSxFQWwwQnVEOztBQW8wQnhEbkQsZUFBYyx3QkFBVztBQUN4QixNQUFNbk0sT0FBTyxFQUFiOztBQUVBQSxPQUFLc00sVUFBTCxHQUFrQjtBQUNqQjFLLGdCQUFhLEtBQUsvQyxFQUFMLENBQVErQyxXQUFSLENBQW9CeUgsR0FBcEIsRUFESTtBQUVqQnBILGFBQVUsS0FBS3BELEVBQUwsQ0FBUW9ELFFBQVIsQ0FBaUJvSCxHQUFqQixFQUZPO0FBR2pCa0QsYUFBVSxLQUFLdEksSUFBTCxDQUFVc0wsV0FBVixFQUhPO0FBSWpCakssaUJBQWN0SSxFQUFFdUksR0FBRixDQUFNLEtBQUtoQixjQUFYLEVBQTJCO0FBQUEsV0FBU3BGLE1BQU1rRyxNQUFOLEVBQVQ7QUFBQSxJQUEzQixDQUpHO0FBS2pCckQsY0FBVyxLQUFLbkQsRUFBTCxDQUFRbUQsU0FBUixDQUFrQnFILEdBQWxCLEVBTE07QUFNakJ2SCxZQUFTLEtBQUtqRCxFQUFMLENBQVFpRCxPQUFSLENBQWdCdUgsR0FBaEIsRUFOUTtBQU9qQjFILFVBQU8sS0FBSzlDLEVBQUwsQ0FBUThDLEtBQVIsQ0FBYzBILEdBQWQsRUFQVTtBQVFqQm1HLFlBQVMsS0FBSzFHLFNBQUwsS0FBbUIsSUFBbkIsR0FBMEJ3RSxTQVJsQjtBQVNqQjFCLFFBQUssS0FBS3pNLEtBQUwsQ0FBV21GO0FBVEMsR0FBbEI7O0FBWUE7QUFDQTtBQUNBO0FBQ0EsT0FBS21MLFNBQUwsR0FBaUIsS0FBSzNHLFNBQUwsRUFBakI7O0FBRUEsU0FBTzlJLElBQVA7QUFDQSxFQXoxQnVEOztBQTIxQnhEMFAsZ0JBQWUseUJBQVc7QUFDekIsTUFBSXpELFVBQVUsSUFBZDs7QUFFQSxNQUFJLENBQUMsS0FBSzlNLEtBQUwsQ0FBV0QsS0FBWCxNQUFzQjVCLFNBQVMySSxlQUFULElBQTRCLENBQUMsS0FBSzlHLEtBQUwsQ0FBV0QsS0FBWCxFQUFwRCxLQUEyRSxLQUFLeVEsS0FBaEYsSUFBeUYsS0FBS0EsS0FBTCxDQUFXcEwsY0FBWCxDQUEwQnlDLE1BQXZILEVBQStIO0FBQzlIaUYsYUFBVSx5QkFBeUIsS0FBSzBELEtBQUwsQ0FBV3BMLGNBQVgsQ0FBMEJ5QyxNQUFuRCxHQUE0RCxXQUE1RCxJQUNSLEtBQUsySSxLQUFMLENBQVdwTCxjQUFYLENBQTBCeUMsTUFBMUIsS0FBcUMsQ0FBckMsR0FBeUMsRUFBekMsR0FBOEMsR0FEdEMsSUFDNkMscUJBRHZEO0FBRUE7O0FBRUQsTUFBSSxLQUFLdEIsWUFBTCxFQUFKLEVBQXlCO0FBQ3hCO0FBQ0EsT0FBTTBHLFdBQVcsSUFBSTFPLFVBQUosQ0FBZSxLQUFLeUIsS0FBcEIsQ0FBakI7QUFDQWlOLFlBQVNwQyxPQUFULENBQWlCO0FBQ2hCd0MsVUFBTSxJQURVO0FBRWhCeE0sVUFBTSxFQUFFNFAsZ0JBQWdCLElBQWxCO0FBRlUsSUFBakI7QUFJQTs7QUFFRCxTQUFPM0QsT0FBUDtBQUNBLEVBNzJCdUQ7O0FBKzJCeERJLGlCQUFnQix3QkFBU3dELGVBQVQsRUFBMEI7QUFDekNBLGtCQUFnQi9OLE9BQWhCLEdBQTBCLEVBQTFCO0FBQ0ErTixrQkFBZ0IxSSxLQUFoQixDQUFzQixjQUF0QjtBQUNBLE1BQU1pRixXQUFXLElBQUkxTyxVQUFKLENBQWVtUyxnQkFBZ0J4SyxNQUFoQixFQUFmLENBQWpCOztBQUVBK0csV0FBU2xGLEdBQVQsQ0FBYTtBQUNaMEUsUUFBS2lFLGdCQUFnQnZNLEdBQWhCLENBQW9CLEtBQXBCLENBRE87QUFFWndNLGFBQVUsWUFGRTtBQUdaQyxZQUFTN1MsU0FBUzhTLElBQVQsRUFIRztBQUlack8sVUFBT2tPLGdCQUFnQnZNLEdBQWhCLENBQW9CLE9BQXBCLENBSks7QUFLWmtNLFlBQVNLLGdCQUFnQmxLLEdBQWhCLENBQW9CLFNBQXBCLElBQWlDa0ssZ0JBQWdCdk0sR0FBaEIsQ0FBb0IsU0FBcEIsQ0FBakMsR0FBa0VnSztBQUwvRCxHQUFiOztBQVFBLE9BQUt6TyxFQUFMLENBQVE4QyxLQUFSLENBQWMwSCxHQUFkLENBQWtCd0csZ0JBQWdCdk0sR0FBaEIsQ0FBb0IsT0FBcEIsQ0FBbEI7O0FBRUEsU0FBTzhJLFFBQVA7QUFDQSxFQS8zQnVEOztBQWk0QnhENkQsc0JBQXFCLDZCQUFTQyxNQUFULEVBQWlCO0FBQ3JDOVMsTUFBSTJDLE9BQUosQ0FBWTNDLElBQUkwSSxNQUFKLENBQVcyRyxlQUF2QixFQUF3QyxLQUFLSixjQUFMLENBQW9CNkQsT0FBTy9RLEtBQTNCLENBQXhDO0FBQ0EsRUFuNEJ1RDs7QUFxNEJ4RGdSLHNCQUFxQiw2QkFBU0QsTUFBVCxFQUFpQjtBQUNyQzlTLE1BQUkyQyxPQUFKLENBQVksS0FBSzBQLFNBQUwsR0FBaUJyUyxJQUFJMEksTUFBSixDQUFXMkcsZUFBNUIsR0FBOENyUCxJQUFJMEksTUFBSixDQUFXc0ssZUFBckUsRUFDQyxLQUFLL0QsY0FBTCxDQUFvQjZELE9BQU8vUSxLQUEzQixDQUREO0FBRUEsRUF4NEJ1RDs7QUEwNEJ4RGtSLGtCQUFpQix5QkFBU0gsTUFBVCxFQUFpQjtBQUNqQyxPQUFLRCxtQkFBTCxDQUF5QkMsTUFBekI7O0FBRUEsU0FBTyxJQUFJeFMsVUFBSixDQUFlO0FBQ3JCdUUsYUFBVWlPLE9BQU8vUSxLQUFQLENBQWFtRSxHQUFiLENBQWlCLFVBQWpCLENBRFc7QUFFckJ0QixjQUFXa08sT0FBTy9RLEtBQVAsQ0FBYW1FLEdBQWIsQ0FBaUIsV0FBakIsQ0FGVTtBQUdyQnhCLFlBQVNvTyxPQUFPL1EsS0FBUCxDQUFhbUUsR0FBYixDQUFpQixTQUFqQixDQUhZO0FBSXJCZ04saUJBQWNKLE9BQU8vUSxLQUFQLENBQWFtRSxHQUFiLENBQWlCLGNBQWpCO0FBSk8sR0FBZixDQUFQO0FBTUEsRUFuNUJ1RDs7QUFxNUJ4RGlOLGtCQUFpQiwyQkFBVztBQUMzQixNQUFJLENBQUMsS0FBS3hGLFdBQVYsRUFDQztBQUNELE9BQUtBLFdBQUwsQ0FBaUJmLE9BQWpCO0FBQ0EsT0FBS2UsV0FBTCxHQUFtQixJQUFuQjtBQUNBO0FBMTVCdUQsQ0FBaEIsQ0FBekM7O0FBNjVCQSxJQUFNeUYsaUJBQWlCO0FBQ3RCQyxvQkFBbUIsMkJBQVN0QixDQUFULEVBQVk7QUFDOUIsTUFBSUEsS0FBS3JTLEVBQUVxUyxFQUFFclAsYUFBSixFQUFtQjRRLFFBQW5CLENBQTRCLGNBQTVCLENBQVQsRUFDQzs7QUFFRCxPQUFLQyxZQUFMLEdBQW9COVMsYUFBYXdFLE1BQWIsQ0FBb0J2RixFQUFFLG9CQUFGLEVBQXdCLEtBQUsrQyxFQUE3QixDQUFwQixFQUFzRDtBQUN6RStRLGNBQVcsSUFEOEQ7QUFFekVDLFNBQU0sSUFGbUU7QUFHekVDLGNBQVcsR0FIOEQ7QUFJekVDLGFBQVU7QUFKK0QsR0FBdEQsQ0FBcEI7O0FBT0EsT0FBS2xTLEVBQUwsQ0FBUW1TLGVBQVIsQ0FBd0J4SCxXQUF4QixDQUFvQyxNQUFwQzs7QUFFQSxPQUFLckssS0FBTCxDQUFXK0gsR0FBWCxDQUFlLEVBQUUrSixxQkFBcUIsSUFBdkIsRUFBZjtBQUNBLEVBZnFCOztBQWlCdEJDLHFCQUFvQiw4QkFBVztBQUM5QixNQUFJLEtBQUtQLFlBQVQsRUFBdUI7QUFDdEIsUUFBS0EsWUFBTCxDQUFrQjNHLE9BQWxCO0FBQ0EsUUFBSzJHLFlBQUwsR0FBb0IsSUFBcEI7QUFDQTs7QUFFRDdULElBQUUsb0JBQUYsRUFBd0IsS0FBSytDLEVBQTdCLEVBQWlDc1IsV0FBakMsQ0FBNkMsa0ZBQTdDO0FBQ0EsT0FBS3RTLEVBQUwsQ0FBUW1TLGVBQVIsQ0FBd0I3TCxRQUF4QixDQUFpQyxNQUFqQztBQUNBLE9BQUtoRyxLQUFMLENBQVcrSCxHQUFYLENBQWUsRUFBRStKLHFCQUFxQixLQUF2QixFQUFmO0FBQ0EsRUExQnFCOztBQTRCdEJHLFNBQVEsZ0JBQVNqQyxDQUFULEVBQVk7QUFDbkJBLElBQUVySyxlQUFGO0FBQ0FxSyxJQUFFa0MsY0FBRjs7QUFFQSxNQUFJLENBQUNsQyxFQUFFbUMsYUFBRixDQUFnQkMsYUFBckIsRUFDQzs7QUFFRHpVLElBQUVxUyxFQUFFclAsYUFBSixFQUFtQmdOLElBQW5CLENBQXdCcUMsRUFBRW1DLGFBQUYsQ0FBZ0JDLGFBQWhCLENBQThCQyxPQUE5QixDQUFzQyxZQUF0QyxDQUF4QjtBQUNBLEVBcENxQjs7QUFzQ3RCL1IsV0FBVSxvQkFBVztBQUNwQixPQUFLWixFQUFMLENBQVF1QixHQUFSLENBQVlrRCxHQUFaLENBQWdCLENBQWhCLEVBQW1CbU8sZ0JBQW5CLENBQW9DLGFBQXBDLEVBQW1ELEtBQUtDLE1BQXhEO0FBQ0EsT0FBSzdTLEVBQUwsQ0FBUXVCLEdBQVIsQ0FBWWtELEdBQVosQ0FBZ0IsQ0FBaEIsRUFBbUJtTyxnQkFBbkIsQ0FBb0MsZUFBcEMsRUFBcUQsS0FBS0UsUUFBMUQ7O0FBRUEsT0FBSzlTLEVBQUwsQ0FBUXFELFFBQVIsQ0FBaUI4SyxJQUFqQixDQUFzQixpQkFBdEIsRUFBeUMsS0FBS1MsVUFBTCxDQUFnQm5LLEdBQWhCLENBQW9CLFVBQXBCLENBQXpDO0FBQ0EsT0FBS25FLEtBQUwsQ0FBVytDLFFBQVgsR0FBc0IsS0FBS3VMLFVBQUwsQ0FBZ0JuSyxHQUFoQixDQUFvQixVQUFwQixDQUF0QjtBQUNBLEVBNUNxQjs7QUE4Q3RCaU4sa0JBQWlCLDJCQUFXO0FBQzNCLE9BQUt4USxPQUFMLENBQWEsV0FBYixFQUEwQixLQUFLWixLQUEvQjs7QUFFQW5DLElBQUV1SyxJQUFGLENBQU8sS0FBSzBCLFNBQVosRUFBdUI7QUFBQSxVQUFNcEosR0FBR21LLE9BQUgsRUFBTjtBQUFBLEdBQXZCOztBQUVBLE9BQUtuTCxFQUFMLENBQVF1QixHQUFSLENBQVlrRCxHQUFaLENBQWdCLENBQWhCLEVBQW1Cc08sbUJBQW5CLENBQXVDLGFBQXZDLEVBQXNELEtBQUtGLE1BQTNEO0FBQ0EsT0FBSzdTLEVBQUwsQ0FBUXVCLEdBQVIsQ0FBWWtELEdBQVosQ0FBZ0IsQ0FBaEIsRUFBbUJzTyxtQkFBbkIsQ0FBdUMsZUFBdkMsRUFBd0QsS0FBS0QsUUFBN0Q7QUFDQSxFQXJEcUI7O0FBdUR0QkUsaUJBQWdCLHdCQUFTOU0sS0FBVCxFQUFnQjtBQUMvQixNQUFJLEtBQUtsQyxXQUFULEVBQ0M7O0FBRUQsT0FBS2hFLEVBQUwsQ0FBUXFELFFBQVIsQ0FBaUI4SyxJQUFqQixDQUFzQixpQkFBdEIsRUFBeUNqSSxLQUF6QztBQUNBLE9BQUs1RixLQUFMLENBQVcrQyxRQUFYLEdBQXNCNkMsS0FBdEI7O0FBRUEsTUFBSSxDQUFDLEtBQUs1RixLQUFMLENBQVdtRSxHQUFYLENBQWUsVUFBZixDQUFMLEVBQ0MsS0FBS25FLEtBQUwsQ0FBVytILEdBQVgsQ0FBZSxVQUFmLEVBQTJCLDZDQUEzQjs7QUFFRCxNQUFJbkMsS0FBSixFQUNDLEtBQUtsRyxFQUFMLENBQVFxRCxRQUFSLENBQWlCaUQsUUFBakIsQ0FBMEIsb0JBQTFCLEVBQWdEMkgsSUFBaEQsQ0FBcUQsS0FBSzNOLEtBQUwsQ0FBV21FLEdBQVgsQ0FBZSxVQUFmLENBQXJELEVBREQsS0FHQyxLQUFLekUsRUFBTCxDQUFRcUQsUUFBUixDQUFpQnNILFdBQWpCLENBQTZCLG9CQUE3QjtBQUNELEVBckVxQjs7QUF1RXRCc0ksYUFBWSxzQkFBVztBQUFBOztBQUN0QixPQUFLQyxjQUFMO0FBQ0EsT0FBS0MsY0FBTDs7QUFFQTtBQUNBaFYsSUFBRXVLLElBQUYsQ0FBTyxLQUFLcEksS0FBTCxDQUFXbUUsR0FBWCxDQUFlLGdCQUFmLEVBQWlDMk8sTUFBakMsQ0FBd0MsS0FBSzlTLEtBQUwsQ0FBV21FLEdBQVgsQ0FBZSxjQUFmLENBQXhDLENBQVAsRUFBZ0YsY0FBTTtBQUNyRixPQUFJekQsR0FBR3NELElBQUgsS0FBWSxPQUFaLElBQXVCLENBQUMsT0FBS04sV0FBakMsRUFBOEM7QUFDN0MsV0FBS29HLFNBQUwsQ0FBZXBKLEdBQUd5RSxFQUFILENBQU15SSxRQUFOLEVBQWYsSUFBbUNsUCxhQUFhd0UsTUFBYixDQUFvQnZGLEVBQUUsbUNBQW1DK0MsR0FBR3lFLEVBQXRDLEdBQTJDLElBQTdDLEVBQW1ELE9BQUt6RSxFQUF4RCxFQUE0RHFTLFFBQTVELENBQXFFLE1BQXJFLENBQXBCLEVBQWtHO0FBQ3BJdEIsZ0JBQVcsSUFEeUg7QUFFcElDLFdBQU0sSUFGOEg7QUFHcElDLGdCQUFXLEdBSHlIO0FBSXBJQyxlQUFVO0FBSjBILEtBQWxHLENBQW5DOztBQU9BLFdBQUs5SCxTQUFMLENBQWVwSixHQUFHeUUsRUFBSCxDQUFNeUksUUFBTixFQUFmLEVBQWlDb0YsUUFBakMsQ0FBMEN0UyxHQUFHbUQsT0FBN0M7QUFDQTtBQUNELEdBWEQ7O0FBYUEsTUFBSSxLQUFLN0QsS0FBTCxDQUFXbUUsR0FBWCxDQUFlLHFCQUFmLEtBQXlDLENBQUMsS0FBS1QsV0FBbkQsRUFBZ0U7QUFDL0QsUUFBSzROLGlCQUFMO0FBQ0EsUUFBS0UsWUFBTCxDQUFrQndCLFFBQWxCLENBQTJCLEtBQUtoVCxLQUFMLENBQVdtRSxHQUFYLENBQWUsZUFBZixDQUEzQjtBQUNBOztBQUVEO0FBQ0EsTUFBSSxLQUFLbUssVUFBTCxDQUFnQm5LLEdBQWhCLENBQW9CLFVBQXBCLENBQUosRUFDQyxLQUFLdU8sY0FBTCxDQUFvQixJQUFwQjs7QUFFRCxNQUFJLEtBQUtPLFVBQVQsRUFDQyxLQUFLQSxVQUFMOztBQUVELE1BQUksQ0FBQyxLQUFLdlAsV0FBVixFQUF1QjtBQUN0QixPQUFNd1AsY0FBY3ZWLEVBQUUscUJBQUYsRUFBeUJrSyxNQUE3QztBQUNBbEssS0FBRSxnQkFBRixFQUFvQmdRLElBQXBCLENBQXlCdUYsV0FBekI7QUFDQTtBQUNELEVBekdxQjs7QUEyR3RCbEksZUFBYyxzQkFBU3ZLLEdBQVQsRUFBYztBQUMzQjtBQUNBLE1BQUksS0FBSzRELElBQUwsRUFBSixFQUNDLEtBQUt6RCxPQUFMLENBQWEsZUFBYixFQUE4QkgsR0FBOUI7QUFDRCxFQS9HcUI7O0FBaUh0QjRELE9BQU0sY0FBUzhPLFlBQVQsRUFBdUJDLFVBQXZCLEVBQW1DO0FBQUE7O0FBQ3hDLE1BQUksQ0FBQyxLQUFLMVQsRUFBTCxDQUFRMlQsV0FBUixDQUFvQjFGLElBQXpCLEVBQ0M7O0FBRUQsTUFBTTJGLFVBQVUzVixFQUFFLHFCQUFGLEVBQXlCLEtBQUsrQyxFQUE5QixFQUFrQzZTLE9BQWxDLENBQTBDLG1CQUExQyxDQUFoQjtBQUNBLE1BQU1DLFFBQVE3VixFQUFFLHFCQUFGLEVBQXlCLEtBQUsrQyxFQUE5QixFQUFrQzZTLE9BQWxDLENBQTBDLG1CQUExQyxDQUFkOztBQUVBLE1BQU01SCxXQUFXOU4sRUFBRTRWLElBQUYsQ0FBTyxLQUFLL1QsRUFBTCxDQUFRMlQsV0FBUixDQUFvQjFGLElBQXBCLEVBQVAsQ0FBakI7QUFDQSxNQUFNNUssV0FBVyxLQUFLdUwsVUFBTCxDQUFnQm5LLEdBQWhCLENBQW9CLFVBQXBCLEtBQW1DLENBQUNpUCxVQUFwQyxHQUFpRHZWLEVBQUU0VixJQUFGLENBQU8sS0FBSy9ULEVBQUwsQ0FBUXFELFFBQVIsQ0FBaUI0SyxJQUFqQixFQUFQLENBQWpELEdBQW1GLEVBQXBHO0FBQ0EsTUFBSStGLGdCQUFnQixJQUFwQjs7QUFFQSxNQUFJLEtBQUtsQyxZQUFULEVBQ0NrQyxnQkFBZ0IsS0FBS2xDLFlBQUwsQ0FBa0JtQyxRQUFsQixFQUFoQjs7QUFFRCxPQUFLM1QsS0FBTCxDQUFXK0gsR0FBWCxDQUFlO0FBQ2Q0RCxhQUFVQSxRQURJO0FBRWQrSCxrQkFBZUEsYUFGRDtBQUdkNUIsd0JBQXFCNEIsa0JBQWtCLElBSHpCO0FBSWQzUSxhQUFVQSxRQUpJO0FBS2Q2USxtQkFBZ0IvVixFQUFFdUksR0FBRixDQUFNa04sUUFBUU8sT0FBUixFQUFOLEVBQXlCLGNBQU07QUFDOUMsUUFBTUMsVUFBVW5XLEVBQUUrQyxFQUFGLENBQWhCO0FBQ0EsUUFBTXFULE9BQU9ELFFBQVFmLFFBQVIsQ0FBaUIsTUFBakIsQ0FBYjs7QUFFQSxXQUFPO0FBQ041TixTQUFJK0osU0FBUzRFLFFBQVFqVCxJQUFSLENBQWEsT0FBYixDQUFULEVBQWdDLEVBQWhDLENBREU7QUFFTm1ELFdBQU0rUCxLQUFLeEMsUUFBTCxDQUFjLGNBQWQsSUFBZ0MsT0FBaEMsR0FBMEMsTUFGMUM7QUFHTjFOLGNBQVNrUSxLQUFLeEMsUUFBTCxDQUFjLGNBQWQsSUFBZ0MsT0FBS3pILFNBQUwsQ0FBZWdLLFFBQVFqVCxJQUFSLENBQWEsT0FBYixDQUFmLEVBQXNDOFMsUUFBdEMsRUFBaEMsR0FBbUZJLEtBQUtwRyxJQUFMO0FBSHRGLEtBQVA7QUFLQSxJQVRlLENBTEY7QUFlZHFHLGlCQUFjblcsRUFBRXVJLEdBQUYsQ0FBTW9OLE1BQU1LLE9BQU4sRUFBTixFQUF1QixjQUFNO0FBQzFDLFFBQU1DLFVBQVVuVyxFQUFFK0MsRUFBRixDQUFoQjtBQUNBLFFBQU1xVCxPQUFPRCxRQUFRZixRQUFSLENBQWlCLE1BQWpCLENBQWI7O0FBRUEsV0FBTztBQUNONU4sU0FBSStKLFNBQVM0RSxRQUFRalQsSUFBUixDQUFhLE9BQWIsQ0FBVCxFQUFnQyxFQUFoQyxDQURFO0FBRU5tRCxXQUFNK1AsS0FBS3hDLFFBQUwsQ0FBYyxjQUFkLElBQWdDLE9BQWhDLEdBQTBDLE1BRjFDO0FBR04xTixjQUFTa1EsS0FBS3hDLFFBQUwsQ0FBYyxjQUFkLElBQWdDLE9BQUt6SCxTQUFMLENBQWVnSyxRQUFRalQsSUFBUixDQUFhLE9BQWIsQ0FBZixFQUFzQzhTLFFBQXRDLEVBQWhDLEdBQW1GSSxLQUFLcEcsSUFBTDtBQUh0RixLQUFQO0FBS0EsSUFUYTtBQWZBLEdBQWY7O0FBMkJBLE9BQUszTixLQUFMLENBQVcrSCxHQUFYLENBQWUsRUFBRWtHLGdCQUFnQixLQUFLak8sS0FBTCxDQUFXbUUsR0FBWCxDQUFlLGdCQUFmLEVBQWlDMEQsTUFBbkQsRUFBZjs7QUFFQSxNQUFJLENBQUNzTCxZQUFMLEVBQ0MsT0FBTyxLQUFLblQsS0FBTCxDQUFXaVUsT0FBWCxFQUFQO0FBQ0QsRUE5SnFCOztBQWdLdEJDLGlCQUFnQiwwQkFBVztBQUMxQixNQUFJLEtBQUt4USxXQUFULEVBQ0M7QUFDRDtBQUNBLE1BQU15USxPQUFPLEtBQUtuVSxLQUFMLENBQVdxUCxlQUFYLENBQTJCK0UsS0FBM0IsQ0FBaUMsQ0FBakMsQ0FBYjs7QUFFQUQsT0FBS0UsT0FBTCxDQUFhLDRFQUFiO0FBQ0EsT0FBSzNVLEVBQUwsQ0FBUTRVLE1BQVIsQ0FBZWpLLFdBQWYsQ0FBMkIsTUFBM0IsRUFBbUMwSSxRQUFuQyxDQUE0QyxTQUE1QyxFQUF1RHdCLElBQXZELENBQTRESixLQUFLSyxJQUFMLENBQVUscUJBQVYsQ0FBNUQ7QUFDQSxFQXhLcUI7O0FBMEt0QkMsYUFBWSxzQkFBVztBQUN0QixPQUFLL1UsRUFBTCxDQUFRNFUsTUFBUixDQUFldE8sUUFBZixDQUF3QixNQUF4QjtBQUNBLEVBNUtxQjs7QUE4S3RCME8sWUFBVyxtQkFBU2pVLEdBQVQsRUFBYztBQUN4QkEsTUFBSWtGLGVBQUo7QUFDQWxGLE1BQUl5UixjQUFKO0FBQ0EsRUFqTHFCOztBQW1MdEJ5QyxhQUFZLG9CQUFTbFUsR0FBVCxFQUFjO0FBQ3pCQSxNQUFJa0YsZUFBSjtBQUNBbEYsTUFBSXlSLGNBQUo7O0FBRUE7QUFDQSxNQUFNeFIsS0FBSy9DLEVBQUU4QyxJQUFJRSxhQUFOLEVBQXFCNFMsT0FBckIsQ0FBNkIsc0JBQTdCLENBQVg7O0FBRUE7QUFDQSxNQUFJOVMsSUFBSUUsYUFBSixDQUFrQmlVLFNBQWxCLENBQTRCQyxRQUE1QixDQUFxQyxVQUFyQyxDQUFKLEVBQXNEO0FBQ3JEO0FBQ0EsUUFBSy9LLFNBQUwsQ0FBZXBKLEdBQUdHLElBQUgsQ0FBUSxPQUFSLENBQWYsSUFBbUNuQyxhQUFhd0UsTUFBYixDQUFvQnhDLEdBQUdxUyxRQUFILENBQVksTUFBWixDQUFwQixFQUF5QztBQUMzRXJCLFVBQU0sSUFEcUU7QUFFM0VDLGVBQVcsR0FGZ0U7QUFHM0VDLGNBQVUsR0FIaUU7QUFJM0VILGVBQVc7QUFKZ0UsSUFBekMsQ0FBbkM7O0FBT0EvUSxNQUFHcVMsUUFBSCxDQUFZLE1BQVosRUFBb0JsRixJQUFwQixDQUF5QixpQkFBekIsRUFBNEMsS0FBNUM7QUFDQSxHQVZELE1BV0s7QUFDSjtBQUNBLFFBQUsvRCxTQUFMLENBQWVwSixHQUFHRyxJQUFILENBQVEsT0FBUixDQUFmLEVBQWlDZ0ssT0FBakM7O0FBRUFuSyxNQUFHcVMsUUFBSCxDQUFZLE1BQVosRUFBb0JwRixJQUFwQixDQUF5QixXQUF6QixFQUFzQ0UsSUFBdEMsQ0FBMkMsaUJBQTNDLEVBQThELElBQTlEO0FBQ0E7O0FBRURsUSxJQUFFOEMsSUFBSUUsYUFBTixFQUFxQm1VLFdBQXJCLENBQWlDLHNCQUFqQztBQUNBLEVBOU1xQjs7QUFnTnRCQyxZQUFXLHFCQUFXO0FBQ3JCLE1BQU1yVSxLQUFLL0MsRUFBRSwyREFBMkQsS0FBS3FYLFVBQUwsRUFBM0QsR0FDWiw4REFEWSxJQUNzRHJYLEVBQUUsbUJBQUYsRUFBdUJrSyxNQUF2QixHQUFnQyxDQUR0RixJQUVYLDhKQUZTLEVBRXVKLEtBQUtuSCxFQUY1SixDQUFYOztBQUlBL0MsSUFBRSxjQUFGLEVBQWtCLEtBQUsrQyxFQUF2QixFQUEyQnVVLE1BQTNCLENBQWtDdlUsRUFBbEM7QUFDQSxFQXROcUI7O0FBd050QndVLGVBQWMsc0JBQVN6VSxHQUFULEVBQWM7QUFDM0JBLE1BQUlrRixlQUFKO0FBQ0FsRixNQUFJeVIsY0FBSjs7QUFFQTtBQUNBLE1BQUl2VSxFQUFFLHNCQUFGLEVBQTBCLEtBQUsrQyxFQUEvQixFQUFtQ21ILE1BQW5DLEtBQThDLENBQWxELEVBQ0M7O0FBRUQ7QUFDQSxNQUFNbkgsS0FBSy9DLEVBQUU4QyxJQUFJRSxhQUFOLEVBQXFCNFMsT0FBckIsQ0FBNkIsc0JBQTdCLENBQVg7O0FBRUEsTUFBSTdTLEdBQUdHLElBQUgsQ0FBUSxPQUFSLEtBQW9CLEtBQUtpSixTQUE3QixFQUNDLEtBQUtBLFNBQUwsQ0FBZXBKLEdBQUdHLElBQUgsQ0FBUSxPQUFSLENBQWYsRUFBaUNnSyxPQUFqQzs7QUFFRCxNQUFJLEtBQUs3SyxLQUFMLENBQVdtRSxHQUFYLENBQWUsU0FBZixNQUE4QixDQUE5QixJQUFtQ3pELEdBQUdpTSxJQUFILENBQVEsV0FBUixFQUFxQjlFLE1BQTVELEVBQW9FO0FBQ25FO0FBQ0EsT0FBSWxLLEVBQUUsc0JBQUYsRUFBMEIsS0FBSytDLEVBQS9CLEVBQW1DeVUsS0FBbkMsR0FBMkNDLEVBQTNDLENBQThDMVUsRUFBOUMsQ0FBSixFQUNDL0MsRUFBRSxzQkFBRixFQUEwQixLQUFLK0MsRUFBL0IsRUFBbUMyVSxFQUFuQyxDQUFzQyxDQUF0QyxFQUF5QzFJLElBQXpDLENBQThDLFlBQTlDLEVBQTREbUksV0FBNUQsQ0FBd0UsbUJBQXhFLEVBREQsS0FHQ25YLEVBQUUsc0JBQUYsRUFBMEIsS0FBSytDLEVBQS9CLEVBQW1DeVUsS0FBbkMsR0FBMkN4SSxJQUEzQyxDQUFnRCxZQUFoRCxFQUE4RG1JLFdBQTlELENBQTBFLG1CQUExRTtBQUNEOztBQUVEcFUsS0FBRzRVLE1BQUg7QUFDQSxFQS9PcUI7O0FBaVB0QjdNLFNBQVEsZ0JBQVNoSSxHQUFULEVBQWM7QUFDckIsTUFBTUMsS0FBSy9DLEVBQUU4QyxJQUFJRSxhQUFOLENBQVg7O0FBRUEsTUFBSSxDQUFDRCxHQUFHeUosSUFBSCxDQUFRLGlCQUFSLENBQUwsRUFDQyxPQUFPLEtBQVA7O0FBRURvTCxTQUFPQyxVQUFQLENBQWtCLFlBQU07QUFDdkIsT0FBTUMsUUFBUUMsU0FBU0MsV0FBVCxFQUFkO0FBQ0FGLFNBQU1HLGtCQUFOLENBQXlCbFYsR0FBRyxDQUFILENBQXpCO0FBQ0EsT0FBTW1WLE1BQU1OLE9BQU9PLFlBQVAsRUFBWjtBQUNBRCxPQUFJRSxlQUFKO0FBQ0FGLE9BQUlHLFFBQUosQ0FBYVAsS0FBYjtBQUNBLEdBTkQsRUFNRyxFQU5IO0FBT0EsRUE5UHFCOztBQWdRdEJRLFdBQVUsa0JBQVN4VixHQUFULEVBQWM7QUFDdkI4VSxTQUFPTyxZQUFQLEdBQXNCQyxlQUF0Qjs7QUFFQTtBQUNBLE1BQUlwWSxFQUFFOEMsSUFBSUUsYUFBTixFQUFxQmdOLElBQXJCLEdBQTRCOEYsSUFBNUIsT0FBdUMsRUFBM0MsRUFDQzs7QUFFRCxVQUFRaFQsSUFBSUUsYUFBSixDQUFrQndFLEVBQTFCO0FBQ0MsUUFBSyxtQkFBTDtBQUNDeEgsTUFBRThDLElBQUlFLGFBQU4sRUFBcUJnTixJQUFyQixDQUEwQixpQkFBMUI7QUFDQTs7QUFFRCxRQUFLLHdCQUFMO0FBQ0NoUSxNQUFFOEMsSUFBSUUsYUFBTixFQUFxQmdOLElBQXJCLENBQTBCLDZDQUExQjtBQUNBOztBQUVEO0FBQ0NoUSxNQUFFOEMsSUFBSUUsYUFBTixFQUFxQmdOLElBQXJCLENBQTBCLE1BQTFCO0FBQ0E7QUFYRjtBQWFBO0FBcFJxQixDQUF2Qjs7QUF1UkEsSUFBTXVJLGdCQUFnQnBZLFNBQVMrTyxLQUFULENBQWV2TixNQUFmLENBQXNCO0FBQzNDNlcsV0FBVSxFQURpQztBQUUzQ0MsZUFBYyxzQkFBU2pKLFVBQVQsRUFBcUI7QUFDbEMsTUFBTW1ILFNBQVMsRUFBZjs7QUFFQSxNQUFJLENBQUNuSCxXQUFXaEksRUFBaEIsRUFDQ21QLE9BQU9oTSxJQUFQLENBQVksc0JBQVo7O0FBRUQsTUFBSSxDQUFDNkUsV0FBV3hCLFFBQWhCLEVBQ0MySSxPQUFPaE0sSUFBUCxDQUFZLG1DQUFaOztBQUVELE1BQUk2RSxXQUFXMkUsbUJBQVgsSUFBa0MsQ0FBQzNFLFdBQVd1RyxhQUFsRCxFQUNDWSxPQUFPaE0sSUFBUCxDQUFZLGlEQUFaOztBQUVELE1BQUk2RSxXQUFXeEIsUUFBWCxLQUF3QixpQkFBNUIsRUFDQzJJLE9BQU9oTSxJQUFQLENBQVkseUNBQVo7O0FBRUQsTUFBSSxLQUFLdkYsUUFBVCxFQUFtQjtBQUNsQixPQUFJLENBQUNvSyxXQUFXcEssUUFBaEIsRUFDQ3VSLE9BQU9oTSxJQUFQLENBQVksMkJBQVo7O0FBRUQsT0FBSTZFLFdBQVdwSyxRQUFYLEtBQXdCLDZDQUE1QixFQUNDdVIsT0FBT2hNLElBQVAsQ0FBWSx5Q0FBWjtBQUNEOztBQUVELFNBQU9nTSxNQUFQO0FBQ0E7QUExQjBDLENBQXRCLENBQXRCOztBQTZCQXRWLE9BQU8sS0FBUCxJQUFnQmtYLGNBQWM1VyxNQUFkLENBQXFCO0FBQ3BDK1csY0FBYSxJQUR1Qjs7QUFHcENGLFdBQVU7QUFDVG5TLFFBQU0sQ0FERztBQUVUdUUsV0FBUyxDQUZBO0FBR1RvRCxZQUFVLGlCQUhEO0FBSVQrSCxpQkFBZSxJQUpOO0FBS1Q1Qix1QkFBcUIsS0FMWjtBQU1UL08sWUFBVSw2Q0FORDtBQU9UNlEsa0JBQWdCLENBQUM7QUFDaEJ6TyxPQUFJLENBRFk7QUFFaEJuQixTQUFNLE1BRlU7QUFHaEJILFlBQVM7QUFITyxHQUFELENBUFA7QUFZVG1RLGdCQUFjLENBQUM7QUFDZDdPLE9BQUksQ0FEVTtBQUVkbkIsU0FBTSxNQUZRO0FBR2RILFlBQVM7QUFISyxHQUFELENBWkw7QUFpQlRvSyxrQkFBZ0I7QUFqQlAsRUFIMEI7O0FBdUJwQzNKLFdBQVUsa0JBQVNnUyxLQUFULEVBQWdCO0FBQ3pCLE1BQUlDLE1BQU0sRUFBVjs7QUFFQUEsUUFBTUEsSUFBSXpELE1BQUosQ0FBVyxLQUFLc0QsWUFBTCxDQUFrQkUsS0FBbEIsQ0FBWCxDQUFOOztBQUVBLE1BQUlBLE1BQU0xQyxjQUFOLENBQXFCL0wsTUFBckIsS0FBZ0MsQ0FBcEMsRUFDQzBPLElBQUlqTyxJQUFKLENBQVMsNkNBQVQ7O0FBRUQsTUFBSXpLLEVBQUUyWSxJQUFGLENBQU9GLE1BQU0xQyxjQUFiLEVBQTZCO0FBQUEsVUFBSyxDQUFDNkMsRUFBRTVTLE9BQVI7QUFBQSxHQUE3QixDQUFKLEVBQ0MwUyxJQUFJak8sSUFBSixDQUFTLGtEQUFUOztBQUVELE1BQUlpTyxJQUFJMU8sTUFBSixHQUFhLENBQWpCLEVBQ0MsT0FBTzBPLEdBQVA7QUFDRDtBQXBDbUMsQ0FBckIsQ0FBaEI7O0FBdUNBO0FBQ0F4WCxVQUFVLEtBQVYsSUFBbUJqQixTQUFTb0IsVUFBVCxDQUFvQkcsSUFBcEIsQ0FBeUJDLE1BQXpCLENBQWdDO0FBQ2xERSxXQUFVNUIsUUFBUSxrQ0FBUixFQUE0QzhZLGNBREo7O0FBR2xEaFgsS0FBSTtBQUNIdUIsT0FBSyxrQkFERjtBQUVIb1MsZUFBYSxvQkFGVjtBQUdIN0IsZ0JBQWMseUNBSFg7QUFJSEssbUJBQWlCLG9DQUpkO0FBS0g4RSxjQUFZLHlCQUxUO0FBTUgxVCxjQUFZLHFCQU5UO0FBT0hGLFlBQVUseUJBUFA7QUFRSHVSLFVBQVEsa0JBUkw7QUFTSEcsY0FBWSx5QkFUVDs7QUFXSG1DLFVBQVEsbUJBWEw7QUFZSEMsY0FBWSx3QkFaVDs7QUFjSDFOLGVBQWEsY0FkVjtBQWVIbkYsUUFBTSxZQWZIO0FBZ0JIOFMsV0FBUztBQWhCTixFQUg4Qzs7QUFzQmxEalgsU0FBUTtBQUNQLHNCQUFvQixjQURiO0FBRVAsMEJBQXdCLFdBRmpCO0FBR1AsNEJBQTBCLG1CQUhuQjtBQUlQLCtCQUE2QixvQkFKdEI7O0FBTVAsMEJBQXdCLFlBTmpCO0FBT1Asb0JBQWtCLFlBUFg7QUFRUCx1QkFBcUIsY0FSZDs7QUFVUDtBQUNBO0FBQ0E7O0FBRUEsMEJBQXdCLFFBZGpCO0FBZVAsd0JBQXNCLFFBZmY7QUFnQlAsMkJBQXlCLFFBaEJsQjs7QUFrQlAsMEJBQXdCLFVBbEJqQjtBQW1CUCx1QkFBcUIsVUFuQmQ7QUFvQlAseUJBQXVCO0FBcEJoQixFQXRCMEM7O0FBNkNsRHNJLGNBQWE7QUFDWjRPLFdBQVM7QUFERyxFQTdDcUM7O0FBaURsRDlXLGFBQVksb0JBQVNDLE9BQVQsRUFBa0I7QUFDN0JyQyxJQUFFeUIsTUFBRixDQUFTLElBQVQsRUFBZStSLGNBQWY7O0FBRUEsT0FBS3JSLEtBQUwsR0FBYUUsUUFBUXlMLFFBQVIsSUFBb0IsSUFBSTNNLE9BQU8sS0FBUCxDQUFKLENBQWtCLEVBQUVtRyxJQUFJakYsUUFBUWlGLEVBQWQsRUFBbEIsQ0FBakM7O0FBRUEsT0FBSytDLFVBQUwsQ0FBZ0IsS0FBS2xJLEtBQXJCLEVBQTRCLEtBQUttSSxXQUFqQzs7QUFFQSxPQUFLbUcsVUFBTCxHQUFrQnBPLFFBQVFvTyxVQUExQjtBQUNBLE9BQUs1SyxXQUFMLEdBQW1CeEQsUUFBUXdELFdBQTNCOztBQUVBLE9BQUtzUixVQUFMLEdBQWtCblgsRUFBRW1aLEtBQUYsQ0FBUSxLQUFLaFgsS0FBTCxDQUFXbUUsR0FBWCxDQUFlLGdCQUFmLEVBQWlDMk8sTUFBakMsQ0FBd0MsS0FBSzlTLEtBQUwsQ0FBV21FLEdBQVgsQ0FBZSxjQUFmLENBQXhDLENBQVIsRUFBaUY7QUFBQSxVQUFLOFMsRUFBRTlSLEVBQVA7QUFBQSxHQUFqRixFQUE0RkEsRUFBNUYsR0FBaUcsQ0FBbkg7O0FBRUEsT0FBS0UsUUFBTCxDQUFjcEcsSUFBZCxFQUFvQixpQkFBcEIsRUFBdUMsS0FBS3lULGNBQUwsQ0FBb0JqTyxJQUFwQixDQUF5QixJQUF6QixDQUF2Qzs7QUFFQSxPQUFLcUYsU0FBTCxHQUFpQixFQUFqQjs7QUFFQSxPQUFLeUksTUFBTCxHQUFjLEtBQUtJLFVBQUwsQ0FBZ0JsTyxJQUFoQixDQUFxQixJQUFyQixDQUFkO0FBQ0EsT0FBSytOLFFBQUwsR0FBZ0IsS0FBS3hILFlBQUwsQ0FBa0J2RyxJQUFsQixDQUF1QixJQUF2QixDQUFoQjtBQUNBLEVBbkVpRDs7QUFxRWxEd08sYUFBWSxzQkFBVztBQUN0QixPQUFLdlQsRUFBTCxDQUFReUosV0FBUixDQUFvQitOLEVBQXBCLENBQXVCLE9BQXZCLEVBQWdDLEtBQUtuQyxTQUFMLENBQWV0USxJQUFmLENBQW9CLElBQXBCLENBQWhDO0FBQ0EsRUF2RWlEOztBQXlFbEQwUyxlQUFjLHNCQUFTMVcsR0FBVCxFQUFjO0FBQzNCQSxNQUFJeVIsY0FBSjtBQUNBelIsTUFBSWtGLGVBQUo7O0FBRUEsTUFBTWpGLEtBQUsvQyxFQUFFLFlBQUYsRUFBZ0I4QyxJQUFJRSxhQUFwQixDQUFYOztBQUVBRCxLQUFHb1UsV0FBSCxDQUFlLG1CQUFmOztBQUVBLE1BQU01QixjQUFjdlYsRUFBRSxxQkFBRixFQUF5QmtLLE1BQTdDO0FBQ0FsSyxJQUFFLGdCQUFGLEVBQW9CZ1EsSUFBcEIsQ0FBeUJ1RixXQUF6QjtBQUNBO0FBbkZpRCxDQUFoQyxDQUFuQjs7QUFzRkFsVSxPQUFPLEtBQVAsSUFBZ0JrWCxjQUFjNVcsTUFBZCxDQUFxQjtBQUNwQytXLGNBQWEsSUFEdUI7O0FBR3BDRixXQUFVO0FBQ1RuUyxRQUFNLENBREc7QUFFVHVFLFdBQVMsQ0FGQTtBQUdUb0QsWUFBVSxpQkFIRDtBQUlUK0gsaUJBQWUsSUFKTjtBQUtUNUIsdUJBQXFCLEtBTFo7QUFNVC9PLFlBQVUsNkNBTkQ7QUFPVDZRLGtCQUFnQixDQUFDO0FBQ2hCek8sT0FBSSxDQURZO0FBRWhCbkIsU0FBTSxNQUZVO0FBR2hCSCxZQUFTO0FBSE8sR0FBRCxDQVBQO0FBWVRtUSxnQkFBYyxDQUFDO0FBQ2Q3TyxPQUFJLENBRFU7QUFFZG5CLFNBQU0sTUFGUTtBQUdkSCxZQUFTO0FBSEssR0FBRCxDQVpMO0FBaUJUb0ssa0JBQWdCO0FBakJQLEVBSDBCOztBQXVCcEMzSixXQUFVLGtCQUFTZ1MsS0FBVCxFQUFnQjtBQUN6QixNQUFJQyxNQUFNLEVBQVY7O0FBRUFBLFFBQU1BLElBQUl6RCxNQUFKLENBQVcsS0FBS3NELFlBQUwsQ0FBa0JFLEtBQWxCLENBQVgsQ0FBTjs7QUFFQSxNQUFJelksRUFBRTJZLElBQUYsQ0FBT0YsTUFBTTFDLGNBQWIsRUFBNkI7QUFBQSxVQUFLLENBQUM2QyxFQUFFNVMsT0FBUjtBQUFBLEdBQTdCLENBQUosRUFDQzBTLElBQUlqTyxJQUFKLENBQVMsa0RBQVQ7O0FBRUQsTUFBSWlPLElBQUkxTyxNQUFKLEdBQWEsQ0FBakIsRUFDQyxPQUFPME8sR0FBUDtBQUNEO0FBakNtQyxDQUFyQixDQUFoQjs7QUFvQ0F4WCxVQUFVLEtBQVYsSUFBbUJqQixTQUFTb0IsVUFBVCxDQUFvQkcsSUFBcEIsQ0FBeUJDLE1BQXpCLENBQWdDO0FBQ2xERSxXQUFVNUIsUUFBUSxrQ0FBUixFQUE0QzhZLGNBREo7O0FBR2xEaFgsS0FBSTtBQUNIdUIsT0FBSyxrQkFERjtBQUVIb1MsZUFBYSxvQkFGVjtBQUdIN0IsZ0JBQWMseUNBSFg7QUFJSEssbUJBQWlCLG9DQUpkO0FBS0g4RSxjQUFZLHlCQUxUO0FBTUgxVCxjQUFZLHFCQU5UO0FBT0hGLFlBQVUseUJBUFA7QUFRSHVSLFVBQVEsa0JBUkw7QUFTSEcsY0FBWSx5QkFUVDs7QUFXSG1DLFVBQVEsbUJBWEw7QUFZSEMsY0FBWSx3QkFaVDs7QUFjSDFOLGVBQWEsY0FkVjtBQWVIbkYsUUFBTSxZQWZIO0FBZ0JIOFMsV0FBUztBQWhCTixFQUg4Qzs7QUFzQmxEalgsU0FBUTtBQUNQLHNCQUFvQixxQkFEYjtBQUVQLDBCQUF3QixXQUZqQjtBQUdQLDRCQUEwQixtQkFIbkI7QUFJUCwrQkFBNkIsb0JBSnRCOztBQU1QLDBCQUF3QixZQU5qQjtBQU9QLG9CQUFrQixZQVBYO0FBUVAsdUJBQXFCLGNBUmQ7O0FBVVA7QUFDQTtBQUNBOztBQUVBLDBCQUF3QixRQWRqQjtBQWVQLHdCQUFzQixRQWZmO0FBZ0JQLDJCQUF5QixRQWhCbEI7O0FBa0JQLDBCQUF3QixVQWxCakI7QUFtQlAsdUJBQXFCLFVBbkJkO0FBb0JQLHlCQUF1QjtBQXBCaEIsRUF0QjBDOztBQTZDbERzSSxjQUFhO0FBQ1o0TyxXQUFTO0FBREcsRUE3Q3FDOztBQWlEbEQ5VyxhQUFZLG9CQUFTQyxPQUFULEVBQWtCO0FBQzdCckMsSUFBRXlCLE1BQUYsQ0FBUyxJQUFULEVBQWUrUixjQUFmOztBQUVBLE9BQUtyUixLQUFMLEdBQWFFLFFBQVF5TCxRQUFSLElBQW9CLElBQUkzTSxPQUFPLEtBQVAsQ0FBSixDQUFrQixFQUFFbUcsSUFBSWpGLFFBQVFpRixFQUFkLEVBQWxCLENBQWpDOztBQUVBLE9BQUsrQyxVQUFMLENBQWdCLEtBQUtsSSxLQUFyQixFQUE0QixLQUFLbUksV0FBakM7O0FBRUEsT0FBS21HLFVBQUwsR0FBa0JwTyxRQUFRb08sVUFBMUI7QUFDQSxPQUFLNUssV0FBTCxHQUFtQnhELFFBQVF3RCxXQUEzQjs7QUFFQSxPQUFLc1IsVUFBTCxHQUFrQm5YLEVBQUVtWixLQUFGLENBQVEsS0FBS2hYLEtBQUwsQ0FBV21FLEdBQVgsQ0FBZSxnQkFBZixFQUFpQzJPLE1BQWpDLENBQXdDLEtBQUs5UyxLQUFMLENBQVdtRSxHQUFYLENBQWUsY0FBZixDQUF4QyxDQUFSLEVBQWlGO0FBQUEsVUFBSzhTLEVBQUU5UixFQUFQO0FBQUEsR0FBakYsRUFBNEZBLEVBQTVGLEdBQWlHLENBQW5IOztBQUVBLE9BQUtFLFFBQUwsQ0FBY3BHLElBQWQsRUFBb0IsaUJBQXBCLEVBQXVDLEtBQUt5VCxjQUFMLENBQW9Cak8sSUFBcEIsQ0FBeUIsSUFBekIsQ0FBdkM7O0FBRUEsT0FBS3FGLFNBQUwsR0FBaUIsRUFBakI7O0FBRUEsT0FBS3lJLE1BQUwsR0FBYyxLQUFLSSxVQUFMLENBQWdCbE8sSUFBaEIsQ0FBcUIsSUFBckIsQ0FBZDtBQUNBLE9BQUsrTixRQUFMLEdBQWdCLEtBQUt4SCxZQUFMLENBQWtCdkcsSUFBbEIsQ0FBdUIsSUFBdkIsQ0FBaEI7QUFDQSxFQW5FaUQ7O0FBcUVsRHdPLGFBQVksc0JBQVc7QUFDdEIsT0FBS3ZULEVBQUwsQ0FBUXlKLFdBQVIsQ0FBb0IrTixFQUFwQixDQUF1QixPQUF2QixFQUFnQyxLQUFLbkMsU0FBTCxDQUFldFEsSUFBZixDQUFvQixJQUFwQixDQUFoQztBQUNBLEVBdkVpRDs7QUF5RWxEMlMsc0JBQXFCLDZCQUFTM1csR0FBVCxFQUFjO0FBQ2xDQSxNQUFJeVIsY0FBSjtBQUNBelIsTUFBSWtGLGVBQUo7O0FBRUEsTUFBTWpGLEtBQUsvQyxFQUFFLFlBQUYsRUFBZ0I4QyxJQUFJRSxhQUFwQixDQUFYOztBQUVBLE1BQUlELEdBQUc2USxRQUFILENBQVksVUFBWixDQUFKLEVBQ0M7O0FBRUQ7QUFDQTVULElBQUUscUJBQUYsRUFBeUIsS0FBSytDLEVBQTlCLEVBQWtDMlcsR0FBbEMsQ0FBc0MzVyxFQUF0QyxFQUEwQ29VLFdBQTFDLENBQXNELG1CQUF0RDtBQUNBO0FBcEZpRCxDQUFoQyxDQUFuQjs7QUF1RkE5VixPQUFPLEtBQVAsSUFBZ0JrWCxjQUFjNVcsTUFBZCxDQUFxQjtBQUNwQytXLGNBQWEsSUFEdUI7O0FBR3BDRixXQUFVO0FBQ1RuUyxRQUFNLENBREc7QUFFVHVFLFdBQVMsQ0FGQTtBQUdUb0QsWUFBVSxpQkFIRDtBQUlUK0gsaUJBQWUsSUFKTjtBQUtUNUIsdUJBQXFCLEtBTFo7QUFNVC9PLFlBQVUsNkNBTkQ7QUFPVDZRLGtCQUFnQixDQUFDO0FBQ2hCek8sT0FBSSxDQURZO0FBRWhCbkIsU0FBTSxNQUZVO0FBR2hCSCxZQUFTO0FBSE8sR0FBRCxDQVBQO0FBWVRtUSxnQkFBYyxDQUFDO0FBQ2Q3TyxPQUFJLENBRFU7QUFFZG5CLFNBQU0sTUFGUTtBQUdkSCxZQUFTO0FBSEssR0FBRCxDQVpMO0FBaUJUb0ssa0JBQWdCO0FBakJQLEVBSDBCOztBQXVCcEMvQixrQkFBaUIsQ0FDaEIsRUFBRW9MLGNBQWMsS0FBaEIsRUFBdUI5VSxPQUFPLGlCQUE5QixFQUFpRCtVLE1BQU0sUUFBdkQsRUFBaUV2VCxNQUFNLFlBQXZFLEVBQXFGd1QsVUFBVSxDQUM5RixFQUFFN0osTUFBTSxjQUFSLEVBQXdCeEksSUFBSSxXQUE1QixFQUF5Q3NTLFVBQVUsSUFBbkQsRUFEOEYsRUFFOUYsRUFBRTlKLE1BQU0sVUFBUixFQUFvQnhJLElBQUksT0FBeEIsRUFGOEYsRUFHOUYsRUFBRXdJLE1BQU0sZ0JBQVIsRUFBMEJ4SSxJQUFJLGFBQTlCLEVBSDhGLEVBSTlGLEVBQUV3SSxNQUFNLGFBQVIsRUFBdUJ4SSxJQUFJLFVBQTNCLEVBSjhGLENBQS9GLEVBRGdCLENBdkJtQjs7QUFnQ3BDYixXQUFVLGtCQUFTZ1MsS0FBVCxFQUFnQjtBQUN6QixNQUFJQyxNQUFNLEVBQVY7O0FBRUFBLFFBQU1BLElBQUl6RCxNQUFKLENBQVcsS0FBS3NELFlBQUwsQ0FBa0JFLEtBQWxCLENBQVgsQ0FBTjs7QUFFQSxNQUFJelksRUFBRTJZLElBQUYsQ0FBT0YsTUFBTTFDLGNBQWIsRUFBNkI7QUFBQSxVQUFLLENBQUM2QyxFQUFFNVMsT0FBUjtBQUFBLEdBQTdCLENBQUosRUFDQzBTLElBQUlqTyxJQUFKLENBQVMsa0RBQVQ7O0FBRUQsTUFBSWlPLElBQUkxTyxNQUFKLEdBQWEsQ0FBakIsRUFDQyxPQUFPME8sR0FBUDtBQUNEO0FBMUNtQyxDQUFyQixDQUFoQjs7QUE2Q0F4WCxVQUFVLEtBQVYsSUFBbUJqQixTQUFTb0IsVUFBVCxDQUFvQkcsSUFBcEIsQ0FBeUJDLE1BQXpCLENBQWdDO0FBQ2xERSxXQUFVNUIsUUFBUSxrQ0FBUixFQUE0QzhZLGNBREo7O0FBR2xEaFgsS0FBSTtBQUNIdUIsT0FBSyxrQkFERjtBQUVIb1MsZUFBYSxvQkFGVjtBQUdIN0IsZ0JBQWMseUNBSFg7QUFJSEssbUJBQWlCLG9DQUpkO0FBS0g4RSxjQUFZLHlCQUxUO0FBTUgxVCxjQUFZLHFCQU5UO0FBT0hGLFlBQVUseUJBUFA7QUFRSHVSLFVBQVEsa0JBUkw7QUFTSEcsY0FBWSx5QkFUVDs7QUFXSG1DLFVBQVEsbUJBWEw7QUFZSEMsY0FBWSx3QkFaVDtBQWFIN1MsUUFBTTtBQWJILEVBSDhDOztBQW1CbERuRSxTQUFRO0FBQ1Asc0JBQW9CLHFCQURiO0FBRVAsMEJBQXdCLFdBRmpCO0FBR1AsNEJBQTBCLG1CQUhuQjtBQUlQLCtCQUE2QixvQkFKdEI7O0FBTVAsMEJBQXdCLFlBTmpCOztBQVFQLG9CQUFrQixZQVJYOztBQVVQO0FBQ0E7QUFDQTs7QUFFQSwwQkFBd0IsUUFkakI7QUFlUCx3QkFBc0IsUUFmZjtBQWdCUCwyQkFBeUIsUUFoQmxCOztBQWtCUCwwQkFBd0IsVUFsQmpCO0FBbUJQLHVCQUFxQixVQW5CZDtBQW9CUCx5QkFBdUI7QUFwQmhCLEVBbkIwQzs7QUEwQ2xEc00sZUFBYztBQUNiLG9CQUFrQjtBQURMLEVBMUNvQzs7QUE4Q2xEaEUsY0FBYTtBQUNaNE8sV0FBUztBQURHLEVBOUNxQzs7QUFrRGxEOVcsYUFBWSxvQkFBU0MsT0FBVCxFQUFrQjtBQUM3QnJDLElBQUV5QixNQUFGLENBQVMsSUFBVCxFQUFlK1IsY0FBZjs7QUFFQSxPQUFLclIsS0FBTCxHQUFhRSxRQUFReUwsUUFBUixJQUFvQixJQUFJM00sT0FBTyxLQUFQLENBQUosQ0FBa0IsRUFBRW1HLElBQUlqRixRQUFRaUYsRUFBZCxFQUFsQixDQUFqQzs7QUFFQSxPQUFLK0MsVUFBTCxDQUFnQixLQUFLbEksS0FBckIsRUFBNEIsS0FBS21JLFdBQWpDOztBQUVBLE9BQUttRyxVQUFMLEdBQWtCcE8sUUFBUW9PLFVBQTFCO0FBQ0EsT0FBSzVLLFdBQUwsR0FBbUJ4RCxRQUFRd0QsV0FBM0I7O0FBRUEsTUFBSWdVLE9BQU94WCxRQUFRb08sVUFBUixDQUFtQm5LLEdBQW5CLENBQXVCLFVBQXZCLENBQVg7QUFDQSxNQUFJLENBQUN0RyxFQUFFOFosUUFBRixDQUFXLENBQUMsV0FBRCxFQUFjLFNBQWQsRUFBeUIsWUFBekIsRUFBdUMsUUFBdkMsRUFBaUQsU0FBakQsRUFBNEQsU0FBNUQsRUFBdUUsVUFBdkUsRUFBbUYsVUFBbkYsRUFBK0YsV0FBL0YsRUFBNEcsVUFBNUcsRUFBd0gsU0FBeEgsQ0FBWCxFQUErSUQsSUFBL0ksQ0FBTCxFQUNDQSxPQUFPLFNBQVA7O0FBRUQsTUFBSSxDQUFDeFgsUUFBUXlMLFFBQVQsSUFBcUIrTCxTQUFTLFNBQWxDLEVBQTZDO0FBQzVDLFFBQUsxWCxLQUFMLENBQVcrSCxHQUFYLENBQWUsZ0JBQWYsRUFBaUMsQ0FDaEM7QUFDQzVDLFFBQUksQ0FETDtBQUVDbkIsVUFBTSxNQUZQO0FBR0NILGFBQVNwRixLQUFLbVosWUFBTCxDQUFrQkYsSUFBbEIsRUFBd0JHO0FBSGxDLElBRGdDLENBQWpDOztBQVFBLFFBQUs3WCxLQUFMLENBQVcrSCxHQUFYLENBQWUsY0FBZixFQUErQixDQUM5QjtBQUNDNUMsUUFBSSxDQURMO0FBRUNuQixVQUFNLE1BRlA7QUFHQ0gsYUFBU3BGLEtBQUttWixZQUFMLENBQWtCRixJQUFsQixFQUF3Qkk7QUFIbEMsSUFEOEIsQ0FBL0I7QUFPQTs7QUFFRCxPQUFLelMsUUFBTCxDQUFjcEcsSUFBZCxFQUFvQixpQkFBcEIsRUFBdUMsS0FBS3lULGNBQUwsQ0FBb0JqTyxJQUFwQixDQUF5QixJQUF6QixDQUF2Qzs7QUFFQSxPQUFLcUYsU0FBTCxHQUFpQixFQUFqQjs7QUFFQSxPQUFLeUksTUFBTCxHQUFjLEtBQUtJLFVBQUwsQ0FBZ0JsTyxJQUFoQixDQUFxQixJQUFyQixDQUFkO0FBQ0EsT0FBSytOLFFBQUwsR0FBZ0IsS0FBS3hILFlBQUwsQ0FBa0J2RyxJQUFsQixDQUF1QixJQUF2QixDQUFoQjtBQUNBLEVBeEZpRDs7QUEwRmxEMlMsc0JBQXFCLDZCQUFTM1csR0FBVCxFQUFjO0FBQ2xDQSxNQUFJeVIsY0FBSjtBQUNBelIsTUFBSWtGLGVBQUo7O0FBRUEsTUFBTWpGLEtBQUsvQyxFQUFFLFlBQUYsRUFBZ0I4QyxJQUFJRSxhQUFwQixDQUFYOztBQUVBLE1BQUlELEdBQUc2USxRQUFILENBQVksVUFBWixDQUFKLEVBQ0M7O0FBRUQ7QUFDQTVULElBQUUsWUFBRixFQUFnQixLQUFLK0MsRUFBckIsRUFBeUJvVSxXQUF6QixDQUFxQyxtQkFBckM7QUFDQSxFQXJHaUQ7O0FBdUdsRGlELGVBQWMsc0JBQVNDLElBQVQsRUFBZTtBQUM1QixNQUFNQyxNQUFNdGEsRUFBRSx3QkFBRixFQUE0QixLQUFLK0MsRUFBakMsQ0FBWjs7QUFFQSxNQUFJZ1gsT0FBTyxLQUFLcEosVUFBTCxDQUFnQm5LLEdBQWhCLENBQW9CLFVBQXBCLENBQVg7QUFDQSxNQUFJLENBQUN0RyxFQUFFOFosUUFBRixDQUFXLENBQUMsV0FBRCxFQUFjLFNBQWQsRUFBeUIsWUFBekIsRUFBdUMsUUFBdkMsRUFBaUQsU0FBakQsRUFBNEQsU0FBNUQsRUFBdUUsVUFBdkUsRUFBbUYsVUFBbkYsRUFBK0YsV0FBL0YsRUFBNEcsVUFBNUcsRUFBd0gsU0FBeEgsQ0FBWCxFQUErSUQsSUFBL0ksQ0FBTCxFQUNDQSxPQUFPLFNBQVA7O0FBRUQsTUFBTS9KLE9BQU9sUCxLQUFLbVosWUFBTCxDQUFrQkYsSUFBbEIsQ0FBYjs7QUFFQSxVQUFRTSxLQUFLN1MsRUFBYjtBQUNDLFFBQUssV0FBTDtBQUNDOFMsUUFBSSxDQUFKLEVBQU9DLFNBQVAsR0FBbUJ2SyxLQUFLa0ssSUFBeEI7QUFDQUksUUFBSSxDQUFKLEVBQU9DLFNBQVAsR0FBbUJ2SyxLQUFLbUssS0FBeEI7QUFDQTs7QUFFRCxRQUFLLE9BQUw7QUFDQ0csUUFBSSxDQUFKLEVBQU9DLFNBQVAsR0FBbUJ2SyxLQUFLd0ssR0FBeEI7QUFDQUYsUUFBSSxDQUFKLEVBQU9DLFNBQVAsR0FBbUJ2SyxLQUFLeUssRUFBeEI7QUFDQTs7QUFFRCxRQUFLLGFBQUw7QUFDQ0gsUUFBSSxDQUFKLEVBQU9DLFNBQVAsR0FBbUJ2SyxLQUFLc0gsTUFBeEI7QUFDQWdELFFBQUksQ0FBSixFQUFPQyxTQUFQLEdBQW1CdkssS0FBSzBLLEtBQXhCO0FBQ0E7O0FBRUQsUUFBSyxVQUFMO0FBQ0NKLFFBQUksQ0FBSixFQUFPQyxTQUFQLEdBQW1CdkssS0FBSzJLLElBQXhCO0FBQ0FMLFFBQUksQ0FBSixFQUFPQyxTQUFQLEdBQW1CdkssS0FBSzRLLElBQXhCO0FBQ0E7O0FBRUQ7QUFDQyxRQUFJLENBQUNwYSxTQUFTcWEsS0FBVixJQUFtQnJhLFNBQVNzYSxZQUFoQyxFQUNDemEsT0FBTyxNQUFQLEVBQWUsSUFBSTBhLEtBQUosQ0FBVSxrQ0FBVixDQUFmO0FBQ0Q7QUF4QkY7QUEwQkE7QUExSWlELENBQWhDLENBQW5COztBQTZJQTFaLE9BQU8sR0FBUCxJQUFja1gsY0FBYzVXLE1BQWQsQ0FBcUI7QUFDbEMrVyxjQUFhLElBRHFCOztBQUdsQ0YsV0FBVTtBQUNUblMsUUFBTSxDQURHO0FBRVQySCxZQUFVLGlCQUZEO0FBR1QrSCxpQkFBZSxJQUhOO0FBSVQ1Qix1QkFBcUIsS0FKWjtBQUtUL08sWUFBVSw2Q0FMRDtBQU1Ua0wsa0JBQWdCO0FBTlAsRUFId0I7O0FBWWxDM0osV0FBVSxrQkFBU2dTLEtBQVQsRUFBZ0I7QUFDekIsTUFBSUMsTUFBTSxFQUFWOztBQUVBQSxRQUFNQSxJQUFJekQsTUFBSixDQUFXLEtBQUtzRCxZQUFMLENBQWtCRSxLQUFsQixDQUFYLENBQU47O0FBRUEsTUFBSSxDQUFDQSxNQUFNckksY0FBUCxJQUF5QnFJLE1BQU1ySSxjQUFOLEdBQXVCLENBQWhELElBQXFEcUksTUFBTXJJLGNBQU4sR0FBdUIsSUFBaEYsRUFDQ3NJLElBQUlqTyxJQUFKLENBQVMsaURBQVQ7O0FBRUQsTUFBSWlPLElBQUkxTyxNQUFKLEdBQWEsQ0FBakIsRUFDQyxPQUFPME8sR0FBUDtBQUNEO0FBdEJpQyxDQUFyQixDQUFkOztBQXlCQTtBQUNBeFgsVUFBVSxHQUFWLElBQWlCakIsU0FBU29CLFVBQVQsQ0FBb0JHLElBQXBCLENBQXlCQyxNQUF6QixDQUFnQztBQUNoREUsV0FBVTVCLFFBQVEsa0NBQVIsRUFBNEM4WSxjQUROOztBQUdoRGhYLEtBQUk7QUFDSHVCLE9BQUssa0JBREY7QUFFSG9TLGVBQWEsb0JBRlY7QUFHSDdCLGdCQUFjLHlDQUhYO0FBSUhLLG1CQUFpQixvQ0FKZDtBQUtIOEUsY0FBWSx5QkFMVDtBQU1IMVQsY0FBWSxxQkFOVDtBQU9IRixZQUFVLHlCQVBQO0FBUUh1UixVQUFRLGtCQVJMO0FBU0hHLGNBQVkseUJBVFQ7O0FBV0h4RyxrQkFBZ0I7QUFYYixFQUg0Qzs7QUFpQmhEcE8sU0FBUTtBQUNQLDRCQUEwQixtQkFEbkI7QUFFUCwrQkFBNkIsb0JBRnRCOztBQUlQO0FBQ0E7O0FBRUEsd0JBQXNCLFFBUGY7QUFRUCwyQkFBeUIsUUFSbEI7O0FBVVAsMEJBQXdCLFVBVmpCO0FBV1AsdUJBQXFCLFVBWGQ7O0FBYVAsOEJBQTRCLG9CQWJyQjtBQWNQLGdDQUE4QixvQkFkdkI7QUFlUCxtQ0FBaUM7QUFmMUIsRUFqQndDOztBQW1DaERzSSxjQUFhO0FBQ1o0TyxXQUFTO0FBREcsRUFuQ21DOztBQXVDaEQ5VyxhQUFZLG9CQUFTQyxPQUFULEVBQWtCO0FBQzdCLE9BQUtGLEtBQUwsR0FBYUUsUUFBUXlMLFFBQVIsSUFBb0IsSUFBSTNNLE9BQU8sR0FBUCxDQUFKLENBQWdCLEVBQUVtRyxJQUFJakYsUUFBUWlGLEVBQWQsRUFBaEIsQ0FBakM7O0FBRUEsT0FBSytDLFVBQUwsQ0FBZ0IsS0FBS2xJLEtBQXJCLEVBQTRCLEtBQUttSSxXQUFqQzs7QUFFQSxPQUFLbUcsVUFBTCxHQUFrQnBPLFFBQVFvTyxVQUExQjtBQUNBLE9BQUs1SyxXQUFMLEdBQW1CeEQsUUFBUXdELFdBQTNCOztBQUVBLE9BQUsyQixRQUFMLENBQWNwRyxJQUFkLEVBQW9CLGlCQUFwQixFQUF1QyxLQUFLeVQsY0FBTCxDQUFvQmpPLElBQXBCLENBQXlCLElBQXpCLENBQXZDOztBQUVBLE9BQUtxRixTQUFMLEdBQWlCLEVBQWpCOztBQUVBLE9BQUt5SSxNQUFMLEdBQWMsS0FBS0ksVUFBTCxDQUFnQmxPLElBQWhCLENBQXFCLElBQXJCLENBQWQ7QUFDQSxPQUFLK04sUUFBTCxHQUFnQixLQUFLeEgsWUFBTCxDQUFrQnZHLElBQWxCLENBQXVCLElBQXZCLENBQWhCO0FBQ0EsRUFyRCtDOztBQXVEaERuRSxXQUFVLG9CQUFXO0FBQ3BCLE9BQUtaLEVBQUwsQ0FBUXVCLEdBQVIsQ0FBWWtELEdBQVosQ0FBZ0IsQ0FBaEIsRUFBbUJtTyxnQkFBbkIsQ0FBb0MsYUFBcEMsRUFBbUQsS0FBS0MsTUFBeEQ7QUFDQSxPQUFLN1MsRUFBTCxDQUFRdUIsR0FBUixDQUFZa0QsR0FBWixDQUFnQixDQUFoQixFQUFtQm1PLGdCQUFuQixDQUFvQyxlQUFwQyxFQUFxRCxLQUFLRSxRQUExRDs7QUFFQSxPQUFLOVMsRUFBTCxDQUFRcUQsUUFBUixDQUFpQjhLLElBQWpCLENBQXNCLGlCQUF0QixFQUF5QyxLQUFLUyxVQUFMLENBQWdCbkssR0FBaEIsQ0FBb0IsVUFBcEIsQ0FBekM7QUFDQSxPQUFLbkUsS0FBTCxDQUFXK0MsUUFBWCxHQUFzQixLQUFLdUwsVUFBTCxDQUFnQm5LLEdBQWhCLENBQW9CLFVBQXBCLENBQXRCO0FBQ0EsRUE3RCtDOztBQStEaERpTixrQkFBaUIsMkJBQVc7QUFDM0IsT0FBS3hRLE9BQUwsQ0FBYSxXQUFiLEVBQTBCLEtBQUtaLEtBQS9COztBQUVBbkMsSUFBRXVLLElBQUYsQ0FBTyxLQUFLMEIsU0FBWixFQUF1QjtBQUFBLFVBQU1wSixHQUFHbUssT0FBSCxFQUFOO0FBQUEsR0FBdkI7O0FBRUEsT0FBS25MLEVBQUwsQ0FBUXVCLEdBQVIsQ0FBWWtELEdBQVosQ0FBZ0IsQ0FBaEIsRUFBbUJzTyxtQkFBbkIsQ0FBdUMsYUFBdkMsRUFBc0QsS0FBS0YsTUFBM0Q7QUFDQSxPQUFLN1MsRUFBTCxDQUFRdUIsR0FBUixDQUFZa0QsR0FBWixDQUFnQixDQUFoQixFQUFtQnNPLG1CQUFuQixDQUF1QyxlQUF2QyxFQUF3RCxLQUFLRCxRQUE3RDtBQUNBLEVBdEUrQzs7QUF3RWhEUCxTQUFRLGdCQUFTakMsQ0FBVCxFQUFZO0FBQ25CQSxJQUFFckssZUFBRjs7QUFFQSxNQUFJLENBQUNxSyxFQUFFbUMsYUFBRixDQUFnQkMsYUFBckIsRUFDQzs7QUFFRDtBQUNBLE1BQU15RCxNQUFNTixPQUFPTyxZQUFQLEVBQVo7QUFDQSxNQUFJRCxJQUFJOEMsVUFBUixFQUFvQjtBQUNuQjNJLEtBQUVrQyxjQUFGO0FBQ0EsT0FBTXVELFFBQVFJLElBQUkrQyxVQUFKLENBQWUsQ0FBZixDQUFkO0FBQ0FuRCxTQUFNb0QsY0FBTjtBQUNBcEQsU0FBTXFELFVBQU4sQ0FBaUJwRCxTQUFTcUQsY0FBVCxDQUF3Qi9JLEVBQUVtQyxhQUFGLENBQWdCQyxhQUFoQixDQUE4QkMsT0FBOUIsQ0FBc0MsWUFBdEMsQ0FBeEIsQ0FBakI7O0FBRUF3RCxPQUFJRSxlQUFKO0FBQ0E7QUFDRCxFQXhGK0M7O0FBMEZoRHROLFNBQVEsZ0JBQVNoSSxHQUFULEVBQWM7QUFDckIsTUFBTUMsS0FBSy9DLEVBQUU4QyxJQUFJRSxhQUFOLENBQVg7O0FBRUEsTUFBSSxDQUFDRCxHQUFHeUosSUFBSCxDQUFRLGlCQUFSLENBQUwsRUFDQyxPQUFPLEtBQVA7O0FBRURvTCxTQUFPQyxVQUFQLENBQWtCLFlBQU07QUFDdkIsT0FBTUMsUUFBUUMsU0FBU0MsV0FBVCxFQUFkO0FBQ0FGLFNBQU1HLGtCQUFOLENBQXlCbFYsR0FBRyxDQUFILENBQXpCO0FBQ0EsT0FBTW1WLE1BQU1OLE9BQU9PLFlBQVAsRUFBWjtBQUNBRCxPQUFJRSxlQUFKO0FBQ0FGLE9BQUlHLFFBQUosQ0FBYVAsS0FBYjtBQUNBLEdBTkQsRUFNRyxFQU5IO0FBT0EsRUF2RytDOztBQXlHaERRLFdBQVUsa0JBQVN4VixHQUFULEVBQWM7QUFDdkI4VSxTQUFPTyxZQUFQLEdBQXNCQyxlQUF0Qjs7QUFFQTtBQUNBLE1BQUlsWSxFQUFFNFYsSUFBRixDQUFPOVYsRUFBRThDLElBQUlFLGFBQU4sRUFBcUJnTixJQUFyQixFQUFQLE1BQXdDLEVBQTVDLEVBQWdEO0FBQy9DLFdBQVFsTixJQUFJRSxhQUFKLENBQWtCd0UsRUFBMUI7QUFDQyxTQUFLLG1CQUFMO0FBQ0N4SCxPQUFFOEMsSUFBSUUsYUFBTixFQUFxQmdOLElBQXJCLENBQTBCLGlCQUExQjtBQUNBOztBQUVELFNBQUssd0JBQUw7QUFDQ2hRLE9BQUU4QyxJQUFJRSxhQUFOLEVBQXFCZ04sSUFBckIsQ0FBMEIsNkNBQTFCO0FBQ0E7O0FBRUQ7QUFDQ2hRLE9BQUU4QyxJQUFJRSxhQUFOLEVBQXFCZ04sSUFBckIsQ0FBMEIsTUFBMUI7QUFDQTtBQVhGO0FBYUE7QUFDRCxFQTVIK0M7O0FBOEhoRCtFLGlCQUFnQix3QkFBUzlNLEtBQVQsRUFBZ0I7QUFDL0IsTUFBSSxLQUFLbEMsV0FBVCxFQUNDOztBQUVELE9BQUsxRCxLQUFMLENBQVcrQyxRQUFYLEdBQXNCNkMsS0FBdEI7QUFDQSxPQUFLbEcsRUFBTCxDQUFRcUQsUUFBUixDQUFpQjhLLElBQWpCLENBQXNCLGlCQUF0QixFQUF5Q2pJLEtBQXpDOztBQUVBLE1BQUksQ0FBQyxLQUFLNUYsS0FBTCxDQUFXbUUsR0FBWCxDQUFlLFVBQWYsQ0FBTCxFQUNDLEtBQUtuRSxLQUFMLENBQVcrSCxHQUFYLENBQWUsVUFBZixFQUEyQiw2Q0FBM0I7O0FBRUQsTUFBSW5DLEtBQUosRUFDQyxLQUFLbEcsRUFBTCxDQUFRcUQsUUFBUixDQUFpQmlELFFBQWpCLENBQTBCLG9CQUExQixFQUFnRDJILElBQWhELENBQXFELEtBQUszTixLQUFMLENBQVdtRSxHQUFYLENBQWUsVUFBZixDQUFyRCxFQURELEtBR0MsS0FBS3pFLEVBQUwsQ0FBUXFELFFBQVIsQ0FBaUJzSCxXQUFqQixDQUE2QixvQkFBN0I7QUFDRCxFQTVJK0M7O0FBOEloRGlILG9CQUFtQiwyQkFBU3RCLENBQVQsRUFBWTtBQUM5QixNQUFJQSxLQUFLclMsRUFBRXFTLEVBQUVyUCxhQUFKLEVBQW1CNFEsUUFBbkIsQ0FBNEIsY0FBNUIsQ0FBVCxFQUNDOztBQUVELE9BQUtDLFlBQUwsR0FBb0I5UyxhQUFhd0UsTUFBYixDQUFvQnZGLEVBQUUsb0JBQUYsRUFBd0IsS0FBSytDLEVBQTdCLENBQXBCLEVBQXNEO0FBQ3pFZ1IsU0FBTSxJQURtRTtBQUV6RUMsY0FBVyxHQUY4RDtBQUd6RUMsYUFBVSxHQUgrRDtBQUl6RUgsY0FBVztBQUo4RCxHQUF0RCxDQUFwQjs7QUFPQSxPQUFLL1IsRUFBTCxDQUFRbVMsZUFBUixDQUF3QnhILFdBQXhCLENBQW9DLE1BQXBDO0FBQ0EsT0FBS3JLLEtBQUwsQ0FBVytILEdBQVgsQ0FBZSxFQUFFK0oscUJBQXFCLElBQXZCLEVBQWY7QUFDQSxFQTNKK0M7O0FBNkpoREMscUJBQW9CLDhCQUFXO0FBQzlCLE1BQUksS0FBS1AsWUFBVCxFQUF1QjtBQUN0QixRQUFLQSxZQUFMLENBQWtCM0csT0FBbEI7QUFDQSxRQUFLMkcsWUFBTCxHQUFvQixJQUFwQjtBQUNBOztBQUVEN1QsSUFBRSxvQkFBRixFQUF3QixLQUFLK0MsRUFBN0IsRUFBaUNzUixXQUFqQyxDQUE2QyxrRkFBN0M7QUFDQSxPQUFLdFMsRUFBTCxDQUFRbVMsZUFBUixDQUF3QjdMLFFBQXhCLENBQWlDLE1BQWpDO0FBQ0EsT0FBS2hHLEtBQUwsQ0FBVytILEdBQVgsQ0FBZSxFQUFFK0oscUJBQXFCLEtBQXZCLEVBQWY7QUFDQSxFQXRLK0M7O0FBd0toRGEsYUFBWSxzQkFBVztBQUN0QixPQUFLQyxjQUFMO0FBQ0EsT0FBS0MsY0FBTDtBQUNBLE9BQUttRyxrQkFBTDtBQUNBO0FBQ0EsTUFBSSxLQUFLMUssVUFBTCxDQUFnQm5LLEdBQWhCLENBQW9CLFVBQXBCLENBQUosRUFDQyxLQUFLdU8sY0FBTCxDQUFvQixJQUFwQjs7QUFFRCxNQUFJLEtBQUsxUyxLQUFMLENBQVdtRSxHQUFYLENBQWUscUJBQWYsS0FBeUMsQ0FBQyxLQUFLVCxXQUFuRCxFQUFnRTtBQUMvRCxRQUFLNE4saUJBQUw7QUFDQSxRQUFLRSxZQUFMLENBQWtCd0IsUUFBbEIsQ0FBMkIsS0FBS2hULEtBQUwsQ0FBV21FLEdBQVgsQ0FBZSxlQUFmLENBQTNCO0FBQ0E7QUFDRCxPQUFLNlUsa0JBQUw7QUFDQSxFQXJMK0M7O0FBdUxoRGhPLGVBQWMsc0JBQVN2SyxHQUFULEVBQWM7QUFDM0I7QUFDQSxNQUFJLEtBQUs0RCxJQUFMLEVBQUosRUFDQyxLQUFLekQsT0FBTCxDQUFhLGVBQWIsRUFBOEJILEdBQTlCOztBQUVELE9BQUt1WSxrQkFBTDtBQUNBLEVBN0wrQzs7QUErTGhEM1UsT0FBTSxjQUFTOE8sWUFBVCxFQUF1QkMsVUFBdkIsRUFBbUM7QUFDeEMsTUFBSSxDQUFDLEtBQUsxVCxFQUFMLENBQVEyVCxXQUFSLENBQW9CMUYsSUFBekIsRUFDQzs7QUFFRCxNQUFNaEMsV0FBVzlOLEVBQUU0VixJQUFGLENBQU8sS0FBSy9ULEVBQUwsQ0FBUTJULFdBQVIsQ0FBb0IxRixJQUFwQixFQUFQLENBQWpCO0FBQ0EsTUFBTTVLLFdBQVcsS0FBS3VMLFVBQUwsQ0FBZ0JuSyxHQUFoQixDQUFvQixVQUFwQixLQUFtQyxDQUFDaVAsVUFBcEMsR0FBaUR2VixFQUFFNFYsSUFBRixDQUFPLEtBQUsvVCxFQUFMLENBQVFxRCxRQUFSLENBQWlCNEssSUFBakIsRUFBUCxDQUFqRCxHQUFtRixFQUFwRztBQUNBLE1BQUkrRixnQkFBZ0IsSUFBcEI7O0FBRUEsTUFBSSxLQUFLbEMsWUFBVCxFQUNDa0MsZ0JBQWdCLEtBQUtsQyxZQUFMLENBQWtCbUMsUUFBbEIsRUFBaEI7O0FBRUQsT0FBSzNULEtBQUwsQ0FBVytILEdBQVgsQ0FBZTtBQUNkaEYsYUFBVUEsUUFESTtBQUVka0wsbUJBQWdCaUIsU0FBUyxLQUFLeFAsRUFBTCxDQUFRdU8sY0FBUixDQUF1Qi9ELEdBQXZCLEVBQVQsRUFBdUMsRUFBdkMsQ0FGRjtBQUdkeUIsYUFBVUEsUUFISTtBQUlkK0gsa0JBQWVBLGFBSkQ7QUFLZDVCLHdCQUFxQjRCLGtCQUFrQjtBQUx6QixHQUFmOztBQVFBLE1BQUksQ0FBQ1AsWUFBTCxFQUNDLE9BQU8sS0FBS25ULEtBQUwsQ0FBV2lVLE9BQVgsRUFBUDtBQUNELEVBcE4rQzs7QUFzTmhEQyxpQkFBZ0IsMEJBQVc7QUFDMUIsTUFBSSxLQUFLeFEsV0FBVCxFQUNDO0FBQ0Q7QUFDQSxNQUFNeVEsT0FBTyxLQUFLblUsS0FBTCxDQUFXcVAsZUFBWCxDQUEyQitFLEtBQTNCLENBQWlDLENBQWpDLENBQWI7QUFDQUQsT0FBS0UsT0FBTCxDQUFhLDRFQUFiOztBQUVBLE9BQUszVSxFQUFMLENBQVE0VSxNQUFSLENBQWVqSyxXQUFmLENBQTJCLE1BQTNCLEVBQW1DMEksUUFBbkMsQ0FBNEMsU0FBNUMsRUFBdUR3QixJQUF2RCxDQUE0REosS0FBS0ssSUFBTCxDQUFVLHFCQUFWLENBQTVEO0FBQ0EsRUE5TitDOztBQWdPaERDLGFBQVksc0JBQVc7QUFDdEIsT0FBSy9VLEVBQUwsQ0FBUTRVLE1BQVIsQ0FBZXRPLFFBQWYsQ0FBd0IsTUFBeEI7QUFDQSxFQWxPK0M7O0FBb09oRGdULHFCQUFvQiw4QkFBVztBQUM5QixNQUFJcmIsRUFBRSxxQkFBRixFQUF5QmtLLE1BQXpCLEdBQWtDLENBQXRDLEVBQ0M7O0FBRUQsTUFBSXFHLE9BQU8sS0FBS2xPLEtBQUwsQ0FBV21FLEdBQVgsQ0FBZSxnQkFBZixDQUFYOztBQUVBLE1BQUl0RyxFQUFFb2IsUUFBRixDQUFXLEtBQUt2WixFQUFMLENBQVF1TyxjQUFuQixNQUF1QyxLQUEzQyxFQUFrRDtBQUNqRCxPQUFJcFEsRUFBRXFiLE9BQUYsQ0FBVSxLQUFLeFosRUFBTCxDQUFRdU8sY0FBbEIsQ0FBSixFQUNDQyxPQUFPLEtBQUt4TyxFQUFMLENBQVF1TyxjQUFSLENBQXVCL0QsR0FBdkIsS0FBK0IsS0FBS3hLLEVBQUwsQ0FBUXVPLGNBQVIsQ0FBdUIvRCxHQUF2QixFQUEvQixHQUE4RCxLQUFLbEssS0FBTCxDQUFXbUUsR0FBWCxDQUFlLGdCQUFmLENBQXJFOztBQUVELE9BQUksS0FBS25FLEtBQUwsQ0FBV21FLEdBQVgsQ0FBZSxnQkFBZixNQUFxQyxLQUFLekUsRUFBTCxDQUFRdU8sY0FBUixDQUF1Qi9ELEdBQXZCLEVBQXpDLEVBQ0NnRSxPQUFPLEtBQUt4TyxFQUFMLENBQVF1TyxjQUFSLENBQXVCL0QsR0FBdkIsRUFBUDs7QUFFRGdFLFVBQU9BLFNBQVMsQ0FBVCxJQUFjQSxTQUFTQyxTQUF2QixHQUFtQ3hRLEVBQUUsd0NBQUYsRUFBNEN1TSxHQUE1QyxFQUFuQyxHQUF1RmdFLElBQTlGO0FBQ0EsR0FSRCxNQVNLO0FBQ0pBLFVBQU8sQ0FBUDtBQUNBO0FBQ0R2USxJQUFFLGdCQUFGLEVBQW9CZ1EsSUFBcEIsQ0FBeUJPLElBQXpCO0FBQ0E7QUF2UCtDLENBQWhDLENBQWpCOztBQTBQQWxQLE9BQU8sR0FBUCxJQUFja1gsY0FBYzVXLE1BQWQsQ0FBcUI7QUFDbEMrVyxjQUFhLElBRHFCOztBQUdsQ0YsV0FBVTtBQUNUblMsUUFBTSxDQURHO0FBRVQySCxZQUFVLGlCQUZEO0FBR1QrSCxpQkFBZSxJQUhOO0FBSVQ1Qix1QkFBcUIsS0FKWjtBQUtUL08sWUFBVSw2Q0FMRDtBQU1Ub1csUUFBTSxDQUFDO0FBQ05oVSxPQUFJLENBREU7QUFFTm5CLFNBQU0sTUFGQTtBQUdOSCxZQUFTO0FBSEgsR0FBRCxFQUtOO0FBQ0NzQixPQUFJLENBREw7QUFFQ25CLFNBQU0sTUFGUDtBQUdDSCxZQUFTO0FBSFYsR0FMTSxDQU5HO0FBZ0JUdVYsU0FBTyxDQUFDO0FBQ1BqVSxPQUFJLENBREc7QUFFUG5CLFNBQU0sTUFGQztBQUdQSCxZQUFTO0FBSEYsR0FBRCxFQUtQO0FBQ0NzQixPQUFJLENBREw7QUFFQ25CLFNBQU0sTUFGUDtBQUdDSCxZQUFTO0FBSFYsR0FMTyxDQWhCRTtBQTBCVG9LLGtCQUFnQjtBQTFCUCxFQUh3Qjs7QUFnQ2xDM0osV0FBVSxrQkFBU2dTLEtBQVQsRUFBZ0I7QUFDekIsTUFBSUMsTUFBTSxFQUFWOztBQUVBQSxRQUFNQSxJQUFJekQsTUFBSixDQUFXLEtBQUtzRCxZQUFMLENBQWtCRSxLQUFsQixDQUFYLENBQU47O0FBRUEsTUFBSUEsTUFBTTZDLElBQU4sQ0FBV3RSLE1BQVgsR0FBb0IsQ0FBeEIsRUFDQzBPLElBQUlqTyxJQUFKLENBQVMsMENBQVQ7O0FBRUQsTUFBSWdPLE1BQU02QyxJQUFOLENBQVd0UixNQUFYLEtBQXNCeU8sTUFBTThDLEtBQU4sQ0FBWXZSLE1BQXRDLEVBQ0MwTyxJQUFJak8sSUFBSixDQUFTLHNEQUFUOztBQUVELE1BQUl6SyxFQUFFMlksSUFBRixDQUFPRixNQUFNNkMsSUFBYixFQUFtQjtBQUFBLFVBQUssQ0FBQzFDLEVBQUU1UyxPQUFSO0FBQUEsR0FBbkIsQ0FBSixFQUNDMFMsSUFBSWpPLElBQUosQ0FBUyxrREFBVDtBQUNELE1BQUl6SyxFQUFFMlksSUFBRixDQUFPRixNQUFNOEMsS0FBYixFQUFvQjtBQUFBLFVBQUssQ0FBQzNDLEVBQUU1UyxPQUFSO0FBQUEsR0FBcEIsQ0FBSixFQUNDMFMsSUFBSWpPLElBQUosQ0FBUyxrREFBVDs7QUFFRCxNQUFJaU8sSUFBSTFPLE1BQUosR0FBYSxDQUFqQixFQUNDLE9BQU8wTyxHQUFQO0FBQ0Q7QUFsRGlDLENBQXJCLENBQWQ7O0FBcURBeFgsVUFBVSxHQUFWLElBQWlCakIsU0FBU29CLFVBQVQsQ0FBb0JHLElBQXBCLENBQXlCQyxNQUF6QixDQUFnQztBQUNoREUsV0FBVTVCLFFBQVEsa0NBQVIsRUFBNEM4WSxjQUROOztBQUdoRGhYLEtBQUk7QUFDSHVCLE9BQUssa0JBREY7QUFFSG9TLGVBQWEsb0JBRlY7QUFHSDdCLGdCQUFjLHlDQUhYO0FBSUhLLG1CQUFpQixvQ0FKZDtBQUtIOEUsY0FBWSx5QkFMVDtBQU1IMVQsY0FBWSxxQkFOVDtBQU9IRixZQUFVLHlCQVBQO0FBUUh1UixVQUFRLGtCQVJMO0FBU0hHLGNBQVkseUJBVFQ7O0FBV0gwRSxRQUFNLFdBWEg7QUFZSEMsU0FBTyxZQVpKOztBQWNIdkMsY0FBWSxxQkFkVDs7QUFnQkgxTixlQUFhLGNBaEJWO0FBaUJIbkYsUUFBTSxZQWpCSDtBQWtCSDhTLFdBQVM7QUFsQk4sRUFINEM7O0FBd0JoRGpYLFNBQVE7QUFDUCxzQkFBb0IsY0FEYjtBQUVQLDRCQUEwQixtQkFGbkI7QUFHUCwrQkFBNkIsb0JBSHRCOztBQUtQLDBCQUF3QixZQUxqQjtBQU1QLG9CQUFrQixZQU5YO0FBT1AsdUJBQXFCLGNBUGQ7O0FBU1A7QUFDQTtBQUNBOztBQUVBLHdCQUFzQixRQWJmO0FBY1AsMkJBQXlCLFFBZGxCO0FBZVAsMEJBQXdCLFFBZmpCOztBQWlCUCwwQkFBd0IsVUFqQmpCO0FBa0JQLHVCQUFxQixVQWxCZDtBQW1CUCx5QkFBdUI7QUFuQmhCLEVBeEJ3Qzs7QUE4Q2hEc0ksY0FBYTtBQUNaNE8sV0FBUztBQURHLEVBOUNtQzs7QUFrRGhEOVcsYUFBWSxvQkFBU0MsT0FBVCxFQUFrQjtBQUM3QixPQUFLRixLQUFMLEdBQWFFLFFBQVF5TCxRQUFSLElBQW9CLElBQUkzTSxPQUFPLEdBQVAsQ0FBSixDQUFnQixFQUFFbUcsSUFBSWpGLFFBQVFpRixFQUFkLEVBQWhCLENBQWpDOztBQUVBLE9BQUsrQyxVQUFMLENBQWdCLEtBQUtsSSxLQUFyQixFQUE0QixLQUFLbUksV0FBakM7O0FBRUEsT0FBS21HLFVBQUwsR0FBa0JwTyxRQUFRb08sVUFBMUI7QUFDQSxPQUFLNUssV0FBTCxHQUFtQnhELFFBQVF3RCxXQUEzQjs7QUFFQSxPQUFLc1IsVUFBTCxHQUFrQm5YLEVBQUVtWixLQUFGLENBQVEsS0FBS2hYLEtBQUwsQ0FBV21FLEdBQVgsQ0FBZSxNQUFmLENBQVIsRUFBZ0M7QUFBQSxVQUFLOFMsRUFBRTlSLEVBQVA7QUFBQSxHQUFoQyxFQUEyQ0EsRUFBM0MsR0FBZ0QsQ0FBbEU7O0FBRUEsT0FBS0UsUUFBTCxDQUFjcEcsSUFBZCxFQUFvQixpQkFBcEIsRUFBdUMsS0FBS3lULGNBQUwsQ0FBb0JqTyxJQUFwQixDQUF5QixJQUF6QixDQUF2Qzs7QUFFQSxPQUFLcUYsU0FBTCxHQUFpQixFQUFFcVAsTUFBTSxFQUFSLEVBQVlDLE9BQU8sRUFBbkIsRUFBakI7O0FBRUEsT0FBSzdHLE1BQUwsR0FBYyxLQUFLSSxVQUFMLENBQWdCbE8sSUFBaEIsQ0FBcUIsSUFBckIsQ0FBZDtBQUNBLE9BQUsrTixRQUFMLEdBQWdCLEtBQUt4SCxZQUFMLENBQWtCdkcsSUFBbEIsQ0FBdUIsSUFBdkIsQ0FBaEI7O0FBRUE5RyxJQUFFLGdCQUFGLEVBQW9CZ1EsSUFBcEIsQ0FBeUJoUSxFQUFFLHFCQUFGLEVBQXlCa0ssTUFBbEQ7QUFDQSxFQXBFK0M7O0FBc0VoRG9LLFNBQVEsZ0JBQVNqQyxDQUFULEVBQVk7QUFDbkJBLElBQUVySyxlQUFGO0FBQ0FxSyxJQUFFa0MsY0FBRjs7QUFFQSxNQUFJLENBQUNsQyxFQUFFbUMsYUFBRixDQUFnQkMsYUFBckIsRUFDQzs7QUFFRHpVLElBQUVxUyxFQUFFclAsYUFBSixFQUFtQmdOLElBQW5CLENBQXdCcUMsRUFBRW1DLGFBQUYsQ0FBZ0JDLGFBQWhCLENBQThCQyxPQUE5QixDQUFzQyxZQUF0QyxDQUF4QjtBQUNBLEVBOUUrQzs7QUFnRmhENUosU0FBUSxnQkFBU2hJLEdBQVQsRUFBYztBQUNyQixNQUFNQyxLQUFLL0MsRUFBRThDLElBQUlFLGFBQU4sQ0FBWDtBQUNBLE1BQUksQ0FBQ0QsR0FBR3lKLElBQUgsQ0FBUSxpQkFBUixDQUFMLEVBQ0MsT0FBTyxLQUFQOztBQUVEb0wsU0FBT0MsVUFBUCxDQUFrQixZQUFNO0FBQ3ZCLE9BQU1DLFFBQVFDLFNBQVNDLFdBQVQsRUFBZDtBQUNBRixTQUFNRyxrQkFBTixDQUF5QmxWLEdBQUcsQ0FBSCxDQUF6QjtBQUNBLE9BQU1tVixNQUFNTixPQUFPTyxZQUFQLEVBQVo7QUFDQUQsT0FBSUUsZUFBSjtBQUNBRixPQUFJRyxRQUFKLENBQWFQLEtBQWI7QUFDQSxHQU5ELEVBTUcsRUFOSDtBQU9BLEVBNUYrQzs7QUE4RmhEUSxXQUFVLGtCQUFTeFYsR0FBVCxFQUFjO0FBQ3ZCOFUsU0FBT08sWUFBUCxHQUFzQkMsZUFBdEI7O0FBRUE7QUFDQSxNQUFJbFksRUFBRTRWLElBQUYsQ0FBTzlWLEVBQUU4QyxJQUFJRSxhQUFOLEVBQXFCZ04sSUFBckIsRUFBUCxNQUF3QyxFQUE1QyxFQUFnRDtBQUMvQyxXQUFRbE4sSUFBSUUsYUFBSixDQUFrQndFLEVBQTFCO0FBQ0MsU0FBSyxtQkFBTDtBQUNDeEgsT0FBRThDLElBQUlFLGFBQU4sRUFBcUJnTixJQUFyQixDQUEwQixpQkFBMUI7QUFDQTs7QUFFRCxTQUFLLHdCQUFMO0FBQ0NoUSxPQUFFOEMsSUFBSUUsYUFBTixFQUFxQmdOLElBQXJCLENBQTBCLDZDQUExQjtBQUNBOztBQUVEO0FBQ0NoUSxPQUFFOEMsSUFBSUUsYUFBTixFQUFxQmdOLElBQXJCLENBQTBCLE1BQTFCO0FBQ0E7QUFYRjtBQWFBO0FBQ0QsRUFqSCtDOztBQW1IaER3SixlQUFjLHNCQUFTMVcsR0FBVCxFQUFjO0FBQzNCQSxNQUFJeVIsY0FBSjtBQUNBelIsTUFBSWtGLGVBQUo7O0FBRUEsTUFBTWpGLEtBQUsvQyxFQUFFLFlBQUYsRUFBZ0I4QyxJQUFJRSxhQUFwQixDQUFYOztBQUVBRCxLQUFHb1UsV0FBSCxDQUFlLG1CQUFmO0FBQ0EsRUExSCtDOztBQTRIaER4VSxXQUFVLG9CQUFXO0FBQ3BCLE9BQUtaLEVBQUwsQ0FBUXVCLEdBQVIsQ0FBWWtELEdBQVosQ0FBZ0IsQ0FBaEIsRUFBbUJtTyxnQkFBbkIsQ0FBb0MsYUFBcEMsRUFBbUQsS0FBS0MsTUFBeEQ7QUFDQSxPQUFLN1MsRUFBTCxDQUFRdUIsR0FBUixDQUFZa0QsR0FBWixDQUFnQixDQUFoQixFQUFtQm1PLGdCQUFuQixDQUFvQyxlQUFwQyxFQUFxRCxLQUFLRSxRQUExRDs7QUFFQSxPQUFLOVMsRUFBTCxDQUFRcUQsUUFBUixDQUFpQjhLLElBQWpCLENBQXNCLGlCQUF0QixFQUF5QyxLQUFLUyxVQUFMLENBQWdCbkssR0FBaEIsQ0FBb0IsVUFBcEIsQ0FBekM7QUFDQSxPQUFLbkUsS0FBTCxDQUFXK0MsUUFBWCxHQUFzQixLQUFLdUwsVUFBTCxDQUFnQm5LLEdBQWhCLENBQW9CLFVBQXBCLENBQXRCO0FBQ0EsRUFsSStDOztBQW9JaERpTixrQkFBaUIsMkJBQVc7QUFDM0IsT0FBS3hRLE9BQUwsQ0FBYSxXQUFiLEVBQTBCLEtBQUtaLEtBQS9COztBQUVBbkMsSUFBRXVLLElBQUYsQ0FBTyxLQUFLMEIsU0FBTCxDQUFlcVAsSUFBdEIsRUFBNEI7QUFBQSxVQUFNelksR0FBR21LLE9BQUgsRUFBTjtBQUFBLEdBQTVCO0FBQ0FoTixJQUFFdUssSUFBRixDQUFPLEtBQUswQixTQUFMLENBQWVzUCxLQUF0QixFQUE2QjtBQUFBLFVBQU0xWSxHQUFHbUssT0FBSCxFQUFOO0FBQUEsR0FBN0I7O0FBRUEsT0FBS25MLEVBQUwsQ0FBUXVCLEdBQVIsQ0FBWWtELEdBQVosQ0FBZ0IsQ0FBaEIsRUFBbUJzTyxtQkFBbkIsQ0FBdUMsYUFBdkMsRUFBc0QsS0FBS0YsTUFBM0Q7QUFDQSxPQUFLN1MsRUFBTCxDQUFRdUIsR0FBUixDQUFZa0QsR0FBWixDQUFnQixDQUFoQixFQUFtQnNPLG1CQUFuQixDQUF1QyxlQUF2QyxFQUF3RCxLQUFLRCxRQUE3RDtBQUNBLEVBNUkrQzs7QUE4SWhERSxpQkFBZ0Isd0JBQVM5TSxLQUFULEVBQWdCO0FBQy9CLE1BQUksS0FBS2xDLFdBQVQsRUFDQzs7QUFFRCxPQUFLMUQsS0FBTCxDQUFXK0MsUUFBWCxHQUFzQjZDLEtBQXRCO0FBQ0EsT0FBS2xHLEVBQUwsQ0FBUXFELFFBQVIsQ0FBaUI4SyxJQUFqQixDQUFzQixpQkFBdEIsRUFBeUNqSSxLQUF6Qzs7QUFFQSxNQUFJLENBQUMsS0FBSzVGLEtBQUwsQ0FBV21FLEdBQVgsQ0FBZSxVQUFmLENBQUwsRUFDQyxLQUFLbkUsS0FBTCxDQUFXK0gsR0FBWCxDQUFlLFVBQWYsRUFBMkIsNkNBQTNCOztBQUVELE1BQUluQyxLQUFKLEVBQ0MsS0FBS2xHLEVBQUwsQ0FBUXFELFFBQVIsQ0FBaUJpRCxRQUFqQixDQUEwQixvQkFBMUIsRUFBZ0QySCxJQUFoRCxDQUFxRCxLQUFLM04sS0FBTCxDQUFXbUUsR0FBWCxDQUFlLFVBQWYsQ0FBckQsRUFERCxLQUdDLEtBQUt6RSxFQUFMLENBQVFxRCxRQUFSLENBQWlCc0gsV0FBakIsQ0FBNkIsb0JBQTdCO0FBQ0QsRUE1SitDOztBQThKaERpSCxvQkFBbUIsMkJBQVN0QixDQUFULEVBQVk7QUFDOUIsTUFBSUEsS0FBS3JTLEVBQUVxUyxFQUFFclAsYUFBSixFQUFtQjRRLFFBQW5CLENBQTRCLGNBQTVCLENBQVQsRUFDQzs7QUFFRCxPQUFLQyxZQUFMLEdBQW9COVMsYUFBYXdFLE1BQWIsQ0FBb0J2RixFQUFFLG9CQUFGLEVBQXdCLEtBQUsrQyxFQUE3QixDQUFwQixFQUFzRDtBQUN6RWdSLFNBQU0sSUFEbUU7QUFFekVDLGNBQVcsR0FGOEQ7QUFHekVDLGFBQVUsR0FIK0Q7QUFJekVILGNBQVc7QUFKOEQsR0FBdEQsQ0FBcEI7O0FBT0EsT0FBSy9SLEVBQUwsQ0FBUW1TLGVBQVIsQ0FBd0J4SCxXQUF4QixDQUFvQyxNQUFwQztBQUNBLE9BQUtySyxLQUFMLENBQVcrSCxHQUFYLENBQWUsRUFBRStKLHFCQUFxQixJQUF2QixFQUFmO0FBQ0EsRUEzSytDOztBQTZLaERDLHFCQUFvQiw4QkFBVztBQUM5QixNQUFJLEtBQUtQLFlBQVQsRUFBdUI7QUFDdEIsUUFBS0EsWUFBTCxDQUFrQjNHLE9BQWxCO0FBQ0EsUUFBSzJHLFlBQUwsR0FBb0IsSUFBcEI7QUFDQTs7QUFFRDdULElBQUUsb0JBQUYsRUFBd0IsS0FBSytDLEVBQTdCLEVBQWlDc1IsV0FBakMsQ0FBNkMsa0ZBQTdDO0FBQ0EsT0FBS3RTLEVBQUwsQ0FBUW1TLGVBQVIsQ0FBd0I3TCxRQUF4QixDQUFpQyxNQUFqQztBQUNBLE9BQUtoRyxLQUFMLENBQVcrSCxHQUFYLENBQWUsRUFBRStKLHFCQUFxQixLQUF2QixFQUFmO0FBQ0EsRUF0TCtDOztBQXdMaERhLGFBQVksc0JBQVc7QUFBQTs7QUFDdEIsT0FBS0MsY0FBTDtBQUNBLE9BQUtDLGNBQUw7O0FBRUE7QUFDQWhWLElBQUV1SyxJQUFGLENBQU8sS0FBS3BJLEtBQUwsQ0FBV21FLEdBQVgsQ0FBZSxNQUFmLENBQVAsRUFBK0IsY0FBTTtBQUNwQyxPQUFJekQsR0FBR3NELElBQUgsS0FBWSxPQUFoQixFQUF5QjtBQUN4QixXQUFLOEYsU0FBTCxDQUFlcVAsSUFBZixDQUFvQnpZLEdBQUd5RSxFQUFILENBQU15SSxRQUFOLEVBQXBCLElBQXdDbFAsYUFBYXdFLE1BQWIsQ0FBb0J2RixFQUFFLHFDQUFxQytDLEdBQUd5RSxFQUF4QyxHQUE2QyxJQUEvQyxFQUFxRDROLFFBQXJELENBQThELE1BQTlELENBQXBCLEVBQTJGO0FBQ2xJckIsV0FBTSxJQUQ0SDtBQUVsSUMsZ0JBQVcsR0FGdUg7QUFHbElDLGVBQVUsR0FId0g7QUFJbElILGdCQUFXO0FBSnVILEtBQTNGLENBQXhDOztBQU9BLFdBQUszSCxTQUFMLENBQWVxUCxJQUFmLENBQW9CelksR0FBR3lFLEVBQUgsQ0FBTXlJLFFBQU4sRUFBcEIsRUFBc0NvRixRQUF0QyxDQUErQ3RTLEdBQUdtRCxPQUFsRDtBQUNBO0FBQ0QsR0FYRDs7QUFhQWhHLElBQUV1SyxJQUFGLENBQU8sS0FBS3BJLEtBQUwsQ0FBV21FLEdBQVgsQ0FBZSxPQUFmLENBQVAsRUFBZ0MsY0FBTTtBQUNyQyxPQUFJekQsR0FBR3NELElBQUgsS0FBWSxPQUFoQixFQUF5QjtBQUN4QixXQUFLOEYsU0FBTCxDQUFlc1AsS0FBZixDQUFxQjFZLEdBQUd5RSxFQUFILENBQU15SSxRQUFOLEVBQXJCLElBQXlDbFAsYUFBYXdFLE1BQWIsQ0FBb0J2RixFQUFFLHNDQUFzQytDLEdBQUd5RSxFQUF6QyxHQUE4QyxJQUFoRCxFQUFzRDROLFFBQXRELENBQStELE1BQS9ELENBQXBCLEVBQTRGO0FBQ3BJckIsV0FBTSxJQUQ4SDtBQUVwSUMsZ0JBQVcsR0FGeUg7QUFHcElDLGVBQVUsR0FIMEg7QUFJcElILGdCQUFXO0FBSnlILEtBQTVGLENBQXpDOztBQU9BLFdBQUszSCxTQUFMLENBQWVzUCxLQUFmLENBQXFCMVksR0FBR3lFLEVBQUgsQ0FBTXlJLFFBQU4sRUFBckIsRUFBdUNvRixRQUF2QyxDQUFnRHRTLEdBQUdtRCxPQUFuRDtBQUNBO0FBQ0QsR0FYRDs7QUFhQSxNQUFJLEtBQUs3RCxLQUFMLENBQVdtRSxHQUFYLENBQWUscUJBQWYsS0FBeUMsQ0FBQyxLQUFLVCxXQUFuRCxFQUFnRTtBQUMvRCxRQUFLNE4saUJBQUw7QUFDQSxRQUFLRSxZQUFMLENBQWtCd0IsUUFBbEIsQ0FBMkIsS0FBS2hULEtBQUwsQ0FBV21FLEdBQVgsQ0FBZSxlQUFmLENBQTNCO0FBQ0E7O0FBRUQ7QUFDQSxNQUFJLEtBQUttSyxVQUFMLENBQWdCbkssR0FBaEIsQ0FBb0IsVUFBcEIsQ0FBSixFQUNDLEtBQUt1TyxjQUFMLENBQW9CLElBQXBCOztBQUVELE9BQUtoVCxFQUFMLENBQVF5SixXQUFSLENBQW9CK04sRUFBcEIsQ0FBdUIsT0FBdkIsRUFBZ0MsS0FBS25DLFNBQUwsQ0FBZXRRLElBQWYsQ0FBb0IsSUFBcEIsQ0FBaEM7O0FBRUE5RyxJQUFFLGdCQUFGLEVBQW9CZ1EsSUFBcEIsQ0FBeUJoUSxFQUFFLHFCQUFGLEVBQXlCa0ssTUFBbEQ7O0FBRUEsTUFBSWxLLEVBQUUscUJBQUYsRUFBeUJrSyxNQUF6QixHQUFrQyxFQUF0QyxFQUNDbEssRUFBRSxjQUFGLEVBQWtCcUksUUFBbEIsQ0FBMkIsTUFBM0IsRUFERCxLQUdDckksRUFBRSxjQUFGLEVBQWtCME0sV0FBbEIsQ0FBOEIsTUFBOUI7QUFDRCxFQXhPK0M7O0FBME9oRFcsZUFBYyxzQkFBU3ZLLEdBQVQsRUFBYztBQUMzQjtBQUNBLE1BQUksS0FBSzRELElBQUwsRUFBSixFQUNDLEtBQUt6RCxPQUFMLENBQWEsZUFBYixFQUE4QkgsR0FBOUI7QUFDRCxFQTlPK0M7O0FBZ1BoRDRELE9BQU0sY0FBUzhPLFlBQVQsRUFBdUJDLFVBQXZCLEVBQW1DO0FBQUE7O0FBQ3hDLE1BQUksQ0FBQyxLQUFLMVQsRUFBTCxDQUFRMlQsV0FBUixDQUFvQjFGLElBQXpCLEVBQ0M7O0FBRUQsTUFBTXdMLE9BQU94YixFQUFFLGdCQUFGLEVBQW9CLEtBQUsrQixFQUFMLENBQVF5WixJQUE1QixDQUFiO0FBQ0EsTUFBTUMsUUFBUXpiLEVBQUUsZ0JBQUYsRUFBb0IsS0FBSytCLEVBQUwsQ0FBUTBaLEtBQTVCLENBQWQ7O0FBRUEsTUFBTXpOLFdBQVc5TixFQUFFNFYsSUFBRixDQUFPLEtBQUsvVCxFQUFMLENBQVEyVCxXQUFSLENBQW9CMUYsSUFBcEIsRUFBUCxDQUFqQjtBQUNBLE1BQU01SyxXQUFXLEtBQUt1TCxVQUFMLENBQWdCbkssR0FBaEIsQ0FBb0IsVUFBcEIsS0FBbUMsQ0FBQ2lQLFVBQXBDLEdBQWlEdlYsRUFBRTRWLElBQUYsQ0FBTyxLQUFLL1QsRUFBTCxDQUFRcUQsUUFBUixDQUFpQjRLLElBQWpCLEVBQVAsQ0FBakQsR0FBbUYsRUFBcEc7QUFDQSxNQUFJK0YsZ0JBQWdCLElBQXBCOztBQUVBLE1BQUksS0FBS2xDLFlBQVQsRUFDQ2tDLGdCQUFnQixLQUFLbEMsWUFBTCxDQUFrQm1DLFFBQWxCLEVBQWhCOztBQUVELE9BQUszVCxLQUFMLENBQVcrSCxHQUFYLENBQWU7QUFDZDRELGFBQVVBLFFBREk7QUFFZCtILGtCQUFlQSxhQUZEO0FBR2Q1Qix3QkFBcUI0QixrQkFBa0IsSUFIekI7QUFJZDNRLGFBQVVBLFFBSkk7QUFLZG9XLFNBQU10YixFQUFFdUksR0FBRixDQUFNK1MsS0FBS3RGLE9BQUwsRUFBTixFQUFzQixjQUFNO0FBQ2pDLFFBQU1DLFVBQVVuVyxFQUFFK0MsRUFBRixDQUFoQjtBQUNBLFFBQU1xVCxPQUFPRCxRQUFRZixRQUFSLENBQWlCLE1BQWpCLENBQWI7O0FBRUEsV0FBTztBQUNONU4sU0FBSStKLFNBQVM0RSxRQUFRalQsSUFBUixDQUFhLE9BQWIsQ0FBVCxFQUFnQyxFQUFoQyxDQURFO0FBRU5tRCxXQUFNK1AsS0FBS3hDLFFBQUwsQ0FBYyxjQUFkLElBQWdDLE9BQWhDLEdBQTBDLE1BRjFDO0FBR04xTixjQUFTa1EsS0FBS3hDLFFBQUwsQ0FBYyxjQUFkLElBQWdDLE9BQUt6SCxTQUFMLENBQWVxUCxJQUFmLENBQW9CckYsUUFBUWpULElBQVIsQ0FBYSxPQUFiLENBQXBCLEVBQTJDOFMsUUFBM0MsRUFBaEMsR0FBd0ZJLEtBQUtwRyxJQUFMO0FBSDNGLEtBQVA7QUFLQSxJQVRLLENBTFE7QUFlZHlMLFVBQU92YixFQUFFdUksR0FBRixDQUFNZ1QsTUFBTXZGLE9BQU4sRUFBTixFQUF1QixjQUFNO0FBQ25DLFFBQU1DLFVBQVVuVyxFQUFFK0MsRUFBRixDQUFoQjtBQUNBLFFBQU1xVCxPQUFPRCxRQUFRZixRQUFSLENBQWlCLE1BQWpCLENBQWI7O0FBRUEsV0FBTztBQUNONU4sU0FBSStKLFNBQVM0RSxRQUFRalQsSUFBUixDQUFhLE9BQWIsQ0FBVCxFQUFnQyxFQUFoQyxDQURFO0FBRU5tRCxXQUFNK1AsS0FBS3hDLFFBQUwsQ0FBYyxjQUFkLElBQWdDLE9BQWhDLEdBQTBDLE1BRjFDO0FBR04xTixjQUFTa1EsS0FBS3hDLFFBQUwsQ0FBYyxjQUFkLElBQWdDLE9BQUt6SCxTQUFMLENBQWVzUCxLQUFmLENBQXFCdEYsUUFBUWpULElBQVIsQ0FBYSxPQUFiLENBQXJCLEVBQTRDOFMsUUFBNUMsRUFBaEMsR0FBeUZJLEtBQUtwRyxJQUFMO0FBSDVGLEtBQVA7QUFLQSxJQVRNO0FBZk8sR0FBZjs7QUEyQkEsT0FBSzNOLEtBQUwsQ0FBVytILEdBQVgsQ0FBZSxFQUFFa0csZ0JBQWdCLEtBQUtqTyxLQUFMLENBQVdtRSxHQUFYLENBQWUsTUFBZixFQUF1QjBELE1BQXpDLEVBQWY7O0FBRUEsTUFBSSxDQUFDc0wsWUFBTCxFQUNDLE9BQU8sS0FBS25ULEtBQUwsQ0FBV2lVLE9BQVgsRUFBUDtBQUNELEVBN1IrQzs7QUErUmhEQyxpQkFBZ0IsMEJBQVc7QUFDMUIsTUFBSSxLQUFLeFEsV0FBVCxFQUNDO0FBQ0Q7QUFDQSxNQUFNeVEsT0FBTyxLQUFLblUsS0FBTCxDQUFXcVAsZUFBWCxDQUEyQitFLEtBQTNCLENBQWlDLENBQWpDLENBQWI7QUFDQUQsT0FBS0UsT0FBTCxDQUFhLDRFQUFiOztBQUVBLE9BQUszVSxFQUFMLENBQVE0VSxNQUFSLENBQWVqSyxXQUFmLENBQTJCLE1BQTNCLEVBQW1DMEksUUFBbkMsQ0FBNEMsU0FBNUMsRUFBdUR3QixJQUF2RCxDQUE0REosS0FBS0ssSUFBTCxDQUFVLHFCQUFWLENBQTVEO0FBQ0EsRUF2UytDOztBQXlTaERDLGFBQVksc0JBQVc7QUFDdEIsT0FBSy9VLEVBQUwsQ0FBUTRVLE1BQVIsQ0FBZXRPLFFBQWYsQ0FBd0IsTUFBeEI7QUFDQSxFQTNTK0M7O0FBNlNoRDBPLFlBQVcsbUJBQVNqVSxHQUFULEVBQWM7QUFDeEJBLE1BQUlrRixlQUFKO0FBQ0FsRixNQUFJeVIsY0FBSjtBQUNBLEVBaFQrQzs7QUFrVGhEeUMsYUFBWSxvQkFBU2xVLEdBQVQsRUFBYztBQUN6QkEsTUFBSWtGLGVBQUo7QUFDQWxGLE1BQUl5UixjQUFKOztBQUVBO0FBQ0EsTUFBTXhSLEtBQUsvQyxFQUFFOEMsSUFBSUUsYUFBTixFQUFxQjRTLE9BQXJCLENBQTZCLG1CQUE3QixDQUFYOztBQUVBLE1BQU16SCxPQUFPcEwsR0FBRzZRLFFBQUgsQ0FBWSxNQUFaLElBQXNCLE1BQXRCLEdBQStCLE9BQTVDOztBQUVBO0FBQ0EsTUFBSTlRLElBQUlFLGFBQUosQ0FBa0JpVSxTQUFsQixDQUE0QkMsUUFBNUIsQ0FBcUMsVUFBckMsQ0FBSixFQUFzRDtBQUNyRDtBQUNBLFFBQUsvSyxTQUFMLENBQWVnQyxJQUFmLEVBQXFCcEwsR0FBR0csSUFBSCxDQUFRLE9BQVIsQ0FBckIsSUFBeUNuQyxhQUFhd0UsTUFBYixDQUFvQnhDLEdBQUdxUyxRQUFILENBQVksTUFBWixDQUFwQixFQUF5QyxFQUFFdEIsV0FBVyxJQUFiLEVBQW1CQyxNQUFNLElBQXpCLEVBQStCQyxXQUFXLEdBQTFDLEVBQStDQyxVQUFVLEdBQXpELEVBQXpDLENBQXpDO0FBQ0FsUixNQUFHcVMsUUFBSCxDQUFZLE1BQVosRUFBb0JsRixJQUFwQixDQUF5QixpQkFBekIsRUFBNEMsS0FBNUM7QUFDQSxHQUpELE1BS0s7QUFDSjtBQUNBLFFBQUsvRCxTQUFMLENBQWVnQyxJQUFmLEVBQXFCcEwsR0FBR0csSUFBSCxDQUFRLE9BQVIsQ0FBckIsRUFBdUNnSyxPQUF2Qzs7QUFFQW5LLE1BQUdxUyxRQUFILENBQVksTUFBWixFQUFvQnBGLElBQXBCLENBQXlCLFdBQXpCLEVBQXNDRSxJQUF0QyxDQUEyQyxpQkFBM0MsRUFBOEQsSUFBOUQ7QUFDQTs7QUFFRGxRLElBQUU4QyxJQUFJRSxhQUFOLEVBQXFCbVUsV0FBckIsQ0FBaUMsc0JBQWpDO0FBQ0EsRUF6VStDOztBQTJVaERDLFlBQVcscUJBQVc7QUFDckIsT0FBS3JWLEVBQUwsQ0FBUXlaLElBQVIsQ0FBYXJPLE1BQWIsMklBQWlKLEtBQUtrSyxVQUF0SjtBQUVBLE9BQUt0VixFQUFMLENBQVEwWixLQUFSLENBQWN0TyxNQUFkLDZJQUFvSixLQUFLa0ssVUFBeko7O0FBSUEsT0FBS0EsVUFBTDs7QUFFQTtBQUNBLE1BQUlyWCxFQUFFLGdCQUFGLEVBQW9CLEtBQUsrQixFQUFMLENBQVF5WixJQUE1QixFQUFrQ3RSLE1BQWxDLElBQTRDLEVBQWhELEVBQ0NsSyxFQUFFLGNBQUYsRUFBa0IsS0FBSytDLEVBQXZCLEVBQTJCc0YsUUFBM0IsQ0FBb0MsV0FBcEM7O0FBRURySSxJQUFFLGdCQUFGLEVBQW9CZ1EsSUFBcEIsQ0FBeUJ1QixTQUFTdlIsRUFBRSxnQkFBRixFQUFvQmdRLElBQXBCLEVBQVQsRUFBcUMsRUFBckMsSUFBMkMsQ0FBcEU7QUFDQSxFQXpWK0M7O0FBMlZoRHVILGVBQWMsc0JBQVN6VSxHQUFULEVBQWM7QUFDM0JBLE1BQUlrRixlQUFKO0FBQ0FsRixNQUFJeVIsY0FBSjs7QUFFQTtBQUNBLE1BQUl2VSxFQUFFLGdCQUFGLEVBQW9CLEtBQUsrQixFQUFMLENBQVF5WixJQUE1QixFQUFrQ3RSLE1BQWxDLEdBQTJDLENBQTNDLElBQWdEbEssRUFBRSxnQkFBRixFQUFvQixLQUFLK0IsRUFBTCxDQUFRMFosS0FBNUIsRUFBbUN2UixNQUFuQyxHQUE0QyxDQUFoRyxFQUFtRztBQUNsRztBQUNBLE9BQU1uSCxLQUFLL0MsRUFBRThDLElBQUlFLGFBQU4sRUFBcUI0UyxPQUFyQixDQUE2QixtQkFBN0IsQ0FBWDs7QUFFQSxPQUFJN1MsR0FBR0csSUFBSCxDQUFRLE9BQVIsS0FBb0IsS0FBS2lKLFNBQUwsQ0FBZXFQLElBQXZDLEVBQ0MsS0FBS3JQLFNBQUwsQ0FBZXFQLElBQWYsQ0FBb0J6WSxHQUFHRyxJQUFILENBQVEsT0FBUixDQUFwQixFQUFzQ2dLLE9BQXRDOztBQUVELE9BQUluSyxHQUFHRyxJQUFILENBQVEsT0FBUixLQUFvQixLQUFLaUosU0FBTCxDQUFlc1AsS0FBdkMsRUFDQyxLQUFLdFAsU0FBTCxDQUFlc1AsS0FBZixDQUFxQjFZLEdBQUdHLElBQUgsQ0FBUSxPQUFSLENBQXJCLEVBQXVDZ0ssT0FBdkM7O0FBRURuSyxNQUFHMlcsR0FBSCxDQUFPMVosRUFBRSxrQkFBa0IrQyxHQUFHRyxJQUFILENBQVEsT0FBUixDQUFsQixHQUFxQyxJQUF2QyxFQUE2QyxLQUFLbkIsRUFBTCxDQUFReVosSUFBckQsQ0FBUCxFQUFtRTdELE1BQW5FOztBQUVBM1gsS0FBRSxjQUFGLEVBQWtCLEtBQUsrQyxFQUF2QixFQUEyQjJKLFdBQTNCLENBQXVDLFdBQXZDOztBQUVBMU0sS0FBRSxnQkFBRixFQUFvQmdRLElBQXBCLENBQXlCdUIsU0FBU3ZSLEVBQUUsZ0JBQUYsRUFBb0JnUSxJQUFwQixFQUFULEVBQXFDLEVBQXJDLElBQTJDLENBQXBFO0FBQ0E7O0FBRUQsTUFBSWhRLEVBQUUscUJBQUYsRUFBeUJrSyxNQUF6QixHQUFrQyxFQUF0QyxFQUNDbEssRUFBRSxjQUFGLEVBQWtCcUksUUFBbEIsQ0FBMkIsTUFBM0IsRUFERCxLQUdDckksRUFBRSxjQUFGLEVBQWtCME0sV0FBbEIsQ0FBOEIsTUFBOUI7QUFDRDtBQXJYK0MsQ0FBaEMsQ0FBakI7O0FBd1hBckwsT0FBTyxHQUFQLElBQWNrWCxjQUFjNVcsTUFBZCxDQUFxQjtBQUNsQytXLGNBQWEsSUFEcUI7O0FBR2xDRixXQUFVO0FBQ1RuUyxRQUFNLENBREc7QUFFVDJILFlBQVUsaUJBRkQ7QUFHVCtILGlCQUFlLElBSE47QUFJVDVCLHVCQUFxQixLQUpaO0FBS1QvTyxZQUFVLDZDQUxEO0FBTVRzVyxVQUFRO0FBQ1ByVixTQUFNLE9BREM7QUFFUEgsWUFBUztBQUZGLEdBTkM7QUFVVG9LLGtCQUFnQjtBQVZQLEVBSHdCOztBQWdCbEMzSixXQUFVLGtCQUFTZ1MsS0FBVCxFQUFnQjtBQUN6QixNQUFJQyxNQUFNLEVBQVY7O0FBRUFBLFFBQU1BLElBQUl6RCxNQUFKLENBQVcsS0FBS3NELFlBQUwsQ0FBa0JFLEtBQWxCLENBQVgsQ0FBTjs7QUFFQSxNQUFJQSxNQUFNK0MsTUFBTixDQUFheFYsT0FBYixDQUFxQnlWLE1BQXJCLENBQTRCLFdBQTVCLE1BQTZDLENBQUMsQ0FBbEQsRUFDQy9DLElBQUlqTyxJQUFKLENBQVMsa0VBQVQ7O0FBRUQsTUFBSWlPLElBQUkxTyxNQUFKLEdBQWEsQ0FBakIsRUFDQyxPQUFPME8sR0FBUDtBQUNEO0FBMUJpQyxDQUFyQixDQUFkOztBQTZCQXhYLFVBQVUsR0FBVixJQUFpQmpCLFNBQVNvQixVQUFULENBQW9CRyxJQUFwQixDQUF5QkMsTUFBekIsQ0FBZ0M7QUFDaERFLFdBQVU1QixRQUFRLGtDQUFSLEVBQTRDOFksY0FETjs7QUFHaERoWCxLQUFJO0FBQ0h1QixPQUFLLGtCQURGO0FBRUhvUyxlQUFhLG9CQUZWO0FBR0g3QixnQkFBYyx5Q0FIWDtBQUlISyxtQkFBaUIsb0NBSmQ7QUFLSDhFLGNBQVkseUJBTFQ7QUFNSDFULGNBQVkscUJBTlQ7QUFPSEYsWUFBVSx5QkFQUDtBQVFIdVIsVUFBUSxrQkFSTDtBQVNIRyxjQUFZLHlCQVRUOztBQVdINVEsV0FBUyx3QkFYTjtBQVlIMFYsVUFBUSxjQVpMO0FBYUhDLGFBQVcsaUJBYlI7QUFjSEMsYUFBVyw0QkFkUjtBQWVIQyxvQkFBa0I7QUFmZixFQUg0Qzs7QUFxQmhEN1osU0FBUTtBQUNQLDBCQUF3QixZQURqQjtBQUVQLHNCQUFvQixlQUZiO0FBR1AsNEJBQTBCLG1CQUhuQjtBQUlQLCtCQUE2QixvQkFKdEI7O0FBTVAsMEJBQXdCLGVBTmpCOztBQVFQLDRCQUEwQixnQkFSbkI7O0FBVVA7QUFDQTtBQUNBOztBQUVBLHdCQUFzQixRQWRmO0FBZVAsMkJBQXlCLFFBZmxCOztBQWlCUCwwQkFBd0IsVUFqQmpCO0FBa0JQLHVCQUFxQjtBQWxCZCxFQXJCd0M7O0FBMENoRHNJLGNBQWE7QUFDWjRPLFdBQVM7QUFERyxFQTFDbUM7O0FBOENoRDlXLGFBQVksb0JBQVNDLE9BQVQsRUFBa0I7QUFDN0IsT0FBS0YsS0FBTCxHQUFhRSxRQUFReUwsUUFBUixJQUFvQixJQUFJM00sT0FBTyxHQUFQLENBQUosQ0FBZ0IsRUFBRW1HLElBQUlqRixRQUFRaUYsRUFBZCxFQUFoQixDQUFqQzs7QUFFQSxPQUFLK0MsVUFBTCxDQUFnQixLQUFLbEksS0FBckIsRUFBNEIsS0FBS21JLFdBQWpDOztBQUVBLE9BQUttRyxVQUFMLEdBQWtCcE8sUUFBUW9PLFVBQTFCO0FBQ0EsT0FBSzVLLFdBQUwsR0FBbUJ4RCxRQUFRd0QsV0FBM0I7O0FBRUEsT0FBSzJCLFFBQUwsQ0FBY3BHLElBQWQsRUFBb0IsaUJBQXBCLEVBQXVDLEtBQUt5VCxjQUFMLENBQW9Cak8sSUFBcEIsQ0FBeUIsSUFBekIsQ0FBdkM7O0FBRUEsT0FBSzhOLE1BQUwsR0FBYyxLQUFLSSxVQUFMLENBQWdCbE8sSUFBaEIsQ0FBcUIsSUFBckIsQ0FBZDtBQUNBLE9BQUsrTixRQUFMLEdBQWdCLEtBQUt4SCxZQUFMLENBQWtCdkcsSUFBbEIsQ0FBdUIsSUFBdkIsQ0FBaEI7O0FBRUEsT0FBS2YsV0FBTCxHQUFtQnhELFdBQVdBLFFBQVF3RCxXQUF0QztBQUNBLEVBNUQrQzs7QUE4RGhEcEQsV0FBVSxvQkFBVztBQUNwQixPQUFLWixFQUFMLENBQVF1QixHQUFSLENBQVlrRCxHQUFaLENBQWdCLENBQWhCLEVBQW1CbU8sZ0JBQW5CLENBQW9DLGFBQXBDLEVBQW1ELEtBQUtDLE1BQXhEO0FBQ0EsT0FBSzdTLEVBQUwsQ0FBUXVCLEdBQVIsQ0FBWWtELEdBQVosQ0FBZ0IsQ0FBaEIsRUFBbUJtTyxnQkFBbkIsQ0FBb0MsZUFBcEMsRUFBcUQsS0FBS0UsUUFBMUQ7O0FBRUEsT0FBSzlTLEVBQUwsQ0FBUXFELFFBQVIsQ0FBaUI4SyxJQUFqQixDQUFzQixpQkFBdEIsRUFBeUMsS0FBS1MsVUFBTCxDQUFnQm5LLEdBQWhCLENBQW9CLFVBQXBCLENBQXpDO0FBQ0EsT0FBS25FLEtBQUwsQ0FBVytDLFFBQVgsR0FBc0IsS0FBS3VMLFVBQUwsQ0FBZ0JuSyxHQUFoQixDQUFvQixVQUFwQixDQUF0QjtBQUNBLEVBcEUrQzs7QUFzRWhEaU4sa0JBQWlCLDJCQUFXO0FBQzNCLE9BQUt4USxPQUFMLENBQWEsV0FBYixFQUEwQixLQUFLWixLQUEvQjs7QUFFQSxPQUFLTixFQUFMLENBQVF1QixHQUFSLENBQVlrRCxHQUFaLENBQWdCLENBQWhCLEVBQW1Cc08sbUJBQW5CLENBQXVDLGFBQXZDLEVBQXNELEtBQUtGLE1BQTNEO0FBQ0EsT0FBSzdTLEVBQUwsQ0FBUXVCLEdBQVIsQ0FBWWtELEdBQVosQ0FBZ0IsQ0FBaEIsRUFBbUJzTyxtQkFBbkIsQ0FBdUMsZUFBdkMsRUFBd0QsS0FBS0QsUUFBN0Q7QUFDQSxFQTNFK0M7O0FBNkVoRFAsU0FBUSxnQkFBU2pDLENBQVQsRUFBWTtBQUNuQkEsSUFBRXJLLGVBQUY7QUFDQXFLLElBQUVrQyxjQUFGOztBQUVBLE1BQUksQ0FBQ2xDLEVBQUVtQyxhQUFGLENBQWdCQyxhQUFyQixFQUNDOztBQUVELE1BQUl2UixPQUFPbVAsRUFBRW1DLGFBQUYsQ0FBZ0JDLGFBQWhCLENBQThCQyxPQUE5QixDQUFzQyxZQUF0QyxDQUFYO0FBQ0EsTUFBSXJDLEVBQUVyUCxhQUFGLENBQWdCcEIsU0FBaEIsS0FBOEIsZ0JBQWxDLEVBQ0NzQixPQUFPQSxLQUFLOFksT0FBTCxDQUFhLGlCQUFiLEVBQWdDLEVBQWhDLENBQVA7O0FBRURoYyxJQUFFcVMsRUFBRXJQLGFBQUosRUFBbUJnTixJQUFuQixDQUF3QjlNLElBQXhCO0FBQ0EsRUF6RitDOztBQTJGaEQ0SCxTQUFRLGdCQUFTaEksR0FBVCxFQUFjO0FBQ3JCLE1BQU1DLEtBQUsvQyxFQUFFOEMsSUFBSUUsYUFBTixDQUFYOztBQUVBLE1BQUksQ0FBQ0QsR0FBR3lKLElBQUgsQ0FBUSxpQkFBUixDQUFMLEVBQ0MsT0FBTyxLQUFQOztBQUVEb0wsU0FBT0MsVUFBUCxDQUFrQixZQUFNO0FBQ3ZCLE9BQU1DLFFBQVFDLFNBQVNDLFdBQVQsRUFBZDtBQUNBRixTQUFNRyxrQkFBTixDQUF5QmxWLEdBQUcsQ0FBSCxDQUF6QjtBQUNBLE9BQU1tVixNQUFNTixPQUFPTyxZQUFQLEVBQVo7QUFDQUQsT0FBSUUsZUFBSjtBQUNBRixPQUFJRyxRQUFKLENBQWFQLEtBQWI7QUFDQSxHQU5ELEVBTUcsRUFOSDtBQU9BLEVBeEcrQzs7QUEwR2hEUSxXQUFVLGtCQUFTeFYsR0FBVCxFQUFjO0FBQ3ZCOFUsU0FBT08sWUFBUCxHQUFzQkMsZUFBdEI7O0FBRUE7QUFDQSxNQUFJbFksRUFBRTRWLElBQUYsQ0FBTzlWLEVBQUU4QyxJQUFJRSxhQUFOLEVBQXFCZ04sSUFBckIsRUFBUCxNQUF3QyxFQUE1QyxFQUFnRDtBQUMvQyxXQUFRbE4sSUFBSUUsYUFBSixDQUFrQndFLEVBQTFCO0FBQ0MsU0FBSyxtQkFBTDtBQUNDeEgsT0FBRThDLElBQUlFLGFBQU4sRUFBcUJnTixJQUFyQixDQUEwQixpQkFBMUI7QUFDQTs7QUFFRCxTQUFLLHdCQUFMO0FBQ0NoUSxPQUFFOEMsSUFBSUUsYUFBTixFQUFxQmdOLElBQXJCLENBQTBCLDZDQUExQjtBQUNBOztBQUVEO0FBQ0NoUSxPQUFFOEMsSUFBSUUsYUFBTixFQUFxQmdOLElBQXJCLENBQTBCLE1BQTFCO0FBQ0E7QUFYRjtBQWFBO0FBQ0QsRUE3SCtDOztBQStIaEQrRSxpQkFBZ0Isd0JBQVM5TSxLQUFULEVBQWdCO0FBQy9CLE1BQUksS0FBS2xDLFdBQVQsRUFDQzs7QUFFRCxPQUFLMUQsS0FBTCxDQUFXK0MsUUFBWCxHQUFzQjZDLEtBQXRCO0FBQ0EsT0FBS2xHLEVBQUwsQ0FBUXFELFFBQVIsQ0FBaUI4SyxJQUFqQixDQUFzQixpQkFBdEIsRUFBeUNqSSxLQUF6Qzs7QUFFQSxNQUFJLENBQUMsS0FBSzVGLEtBQUwsQ0FBV21FLEdBQVgsQ0FBZSxVQUFmLENBQUwsRUFDQyxLQUFLbkUsS0FBTCxDQUFXK0gsR0FBWCxDQUFlLFVBQWYsRUFBMkIsNkNBQTNCOztBQUVELE1BQUluQyxLQUFKLEVBQ0MsS0FBS2xHLEVBQUwsQ0FBUXFELFFBQVIsQ0FBaUJpRCxRQUFqQixDQUEwQixvQkFBMUIsRUFBZ0QySCxJQUFoRCxDQUFxRCxLQUFLM04sS0FBTCxDQUFXbUUsR0FBWCxDQUFlLFVBQWYsQ0FBckQsRUFERCxLQUdDLEtBQUt6RSxFQUFMLENBQVFxRCxRQUFSLENBQWlCc0gsV0FBakIsQ0FBNkIsb0JBQTdCO0FBQ0QsRUE3SStDOztBQStJaERpSCxvQkFBbUIsMkJBQVN0QixDQUFULEVBQVk7QUFDOUIsTUFBSUEsS0FBS3JTLEVBQUVxUyxFQUFFclAsYUFBSixFQUFtQjRRLFFBQW5CLENBQTRCLGNBQTVCLENBQVQsRUFDQzs7QUFFRCxPQUFLQyxZQUFMLEdBQW9COVMsYUFBYXdFLE1BQWIsQ0FBb0J2RixFQUFFLG9CQUFGLEVBQXdCLEtBQUsrQyxFQUE3QixDQUFwQixFQUFzRDtBQUN6RStRLGNBQVcsSUFEOEQ7QUFFekVDLFNBQU0sSUFGbUU7QUFHekVDLGNBQVcsR0FIOEQ7QUFJekVDLGFBQVU7QUFKK0QsR0FBdEQsQ0FBcEI7O0FBT0EsT0FBS2xTLEVBQUwsQ0FBUW1TLGVBQVIsQ0FBd0J4SCxXQUF4QixDQUFvQyxNQUFwQztBQUNBLE9BQUtySyxLQUFMLENBQVcrSCxHQUFYLENBQWUsRUFBRStKLHFCQUFxQixJQUF2QixFQUFmO0FBQ0EsRUE1SitDOztBQThKaERDLHFCQUFvQiw4QkFBVztBQUM5QixNQUFJLEtBQUtQLFlBQVQsRUFBdUI7QUFDdEIsUUFBS0EsWUFBTCxDQUFrQjNHLE9BQWxCO0FBQ0EsUUFBSzJHLFlBQUwsR0FBb0IsSUFBcEI7QUFDQTs7QUFFRDdULElBQUUsb0JBQUYsRUFBd0IsS0FBSytDLEVBQTdCLEVBQWlDc1IsV0FBakMsQ0FBNkMsa0ZBQTdDO0FBQ0EsT0FBS3RTLEVBQUwsQ0FBUW1TLGVBQVIsQ0FBd0I3TCxRQUF4QixDQUFpQyxNQUFqQztBQUNBLE9BQUtoRyxLQUFMLENBQVcrSCxHQUFYLENBQWUsRUFBRStKLHFCQUFxQixLQUF2QixFQUFmO0FBQ0EsRUF2SytDOztBQXlLaERhLGFBQVksc0JBQVc7QUFDdEIsT0FBS0MsY0FBTDtBQUNBLE9BQUtDLGNBQUw7O0FBRUE7QUFDQSxNQUFNK0csTUFBTSxLQUFLbGEsRUFBTCxDQUFROFosU0FBUixDQUFrQjdMLElBQWxCLEVBQVo7QUFDQSxPQUFLak8sRUFBTCxDQUFROFosU0FBUixDQUFrQmpGLElBQWxCLENBQXVCcUYsSUFBSUQsT0FBSixDQUFZLGFBQVosRUFBMkIsK0JBQTNCLENBQXZCOztBQUVBLE1BQUlFLGNBQWMsRUFBbEI7O0FBRUEsTUFBSSxLQUFLblcsV0FBVCxFQUNDbVcsY0FBYyxNQUFkOztBQUVELE1BQU1uWixLQUFLL0MsRUFBRSw2QkFBNkJrYyxXQUE3QixHQUEyQyxjQUE3QyxDQUFYO0FBQ0EsT0FBS25hLEVBQUwsQ0FBUW1FLE9BQVIsQ0FBZ0JpVyxPQUFoQixDQUF3QnBaLEVBQXhCOztBQUVBLE1BQUksS0FBS1YsS0FBTCxDQUFXbUUsR0FBWCxDQUFlLHFCQUFmLEtBQXlDLENBQUMsS0FBS1QsV0FBbkQsRUFBZ0U7QUFDL0QsUUFBSzROLGlCQUFMO0FBQ0EsUUFBS0UsWUFBTCxDQUFrQndCLFFBQWxCLENBQTJCLEtBQUtoVCxLQUFMLENBQVdtRSxHQUFYLENBQWUsZUFBZixDQUEzQjtBQUNBOztBQUVEO0FBQ0EsTUFBSSxLQUFLbUssVUFBTCxDQUFnQm5LLEdBQWhCLENBQW9CLFVBQXBCLENBQUosRUFDQyxLQUFLdU8sY0FBTCxDQUFvQixJQUFwQjtBQUNELEVBak0rQzs7QUFtTWhEcUgsZ0JBQWUsdUJBQVN0WixHQUFULEVBQWM7QUFDNUJBLE1BQUl5UixjQUFKO0FBQ0F6UixNQUFJa0YsZUFBSjs7QUFFQSxNQUFJbEYsSUFBSTBSLGFBQUosQ0FBa0JuTyxJQUFsQixLQUEyQixXQUEvQixFQUE0QztBQUMzQztBQUNBLE9BQUl1UixPQUFPTyxZQUFQLEdBQXNCNkMsVUFBdEIsS0FBcUMsQ0FBekMsRUFDQzs7QUFFRCxRQUFLcUIsaUJBQUwsR0FBeUJ6RSxPQUFPTyxZQUFQLEdBQXNCOEMsVUFBdEIsQ0FBaUMsQ0FBakMsQ0FBekI7QUFDQTtBQUNBOztBQUVELE1BQUksS0FBS29CLGlCQUFMLElBQTBCLENBQUN6RSxPQUFPTyxZQUFQLEdBQXNCbUUsV0FBckQsRUFBa0U7QUFDakUsT0FBSTFFLE9BQU9PLFlBQVAsR0FBc0I2QyxVQUF0QixLQUFxQyxDQUFyQyxJQUEwQyxDQUFDLEtBQUtxQixpQkFBcEQsRUFDQzs7QUFFRCxPQUFNdkUsUUFBUSxLQUFLdUUsaUJBQUwsSUFBMEJ6RSxPQUFPTyxZQUFQLEdBQXNCOEMsVUFBdEIsQ0FBaUMsQ0FBakMsQ0FBeEM7O0FBRUEsT0FBTXNCLGFBQWN6RSxNQUFNMEUsY0FBTixDQUFxQkMsVUFBckIsS0FBb0MzRSxNQUFNNEUsWUFBTixDQUFtQkQsVUFBdkQsSUFBcUUsS0FBSzFhLEVBQUwsQ0FBUThaLFNBQVIsQ0FBa0JyVixHQUFsQixDQUFzQixDQUF0QixFQUF5QjBRLFFBQXpCLENBQWtDWSxNQUFNMEUsY0FBTixDQUFxQkMsVUFBdkQsQ0FBckUsSUFDbkIsS0FBSzFhLEVBQUwsQ0FBUThaLFNBQVIsQ0FBa0JyVixHQUFsQixDQUFzQixDQUF0QixFQUF5QjBRLFFBQXpCLENBQWtDWSxNQUFNNEUsWUFBTixDQUFtQkQsVUFBckQsQ0FEa0IsSUFFbEIzRSxNQUFNNEUsWUFBTixDQUFtQkQsVUFBbkIsS0FBa0MsS0FBSzFhLEVBQUwsQ0FBUW1FLE9BQVIsQ0FBZ0JNLEdBQWhCLENBQW9CLENBQXBCLENBRm5DOztBQUlBLE9BQUlzUixTQUFTeUUsVUFBYixFQUF5QjtBQUN4QjtBQUNBLFFBQU14WixLQUFLZ1YsU0FBUzRFLGFBQVQsQ0FBdUIsTUFBdkIsQ0FBWDtBQUNBNVosT0FBR2tVLFNBQUgsQ0FBYXlDLEdBQWIsQ0FBaUIsT0FBakI7QUFDQTNXLE9BQUc2WixXQUFILEdBQWlCLE1BQU05RSxNQUFNN0gsUUFBTixFQUFOLEdBQXlCLEdBQTFDOztBQUVBNkgsVUFBTW9ELGNBQU47QUFDQXBELFVBQU1xRCxVQUFOLENBQWlCcFksRUFBakI7QUFDQStVLFVBQU0rRSxNQUFOOztBQUVBN2MsTUFBRSxnQkFBRixFQUFvQmdRLElBQXBCLENBQXlCdUIsU0FBU3ZSLEVBQUUsZ0JBQUYsRUFBb0JnUSxJQUFwQixFQUFULEVBQXFDLEVBQXJDLElBQTJDLENBQXBFO0FBQ0E7O0FBRUQsUUFBS3FNLGlCQUFMLEdBQXlCLElBQXpCO0FBQ0E7QUFDRCxFQXpPK0M7O0FBMk9oRFMsaUJBQWdCLHdCQUFTaGEsR0FBVCxFQUFjO0FBQzdCLE1BQUksQ0FBQyxLQUFLaUQsV0FBVixFQUF1QjtBQUN0Qi9GLEtBQUUsZ0JBQUYsRUFBb0JnUSxJQUFwQixDQUF5QnVCLFNBQVN2UixFQUFFLGdCQUFGLEVBQW9CZ1EsSUFBcEIsRUFBVCxFQUFxQyxFQUFyQyxJQUEyQyxDQUFwRTtBQUNBaFEsS0FBRThDLElBQUlFLGFBQU4sRUFBcUJxUixXQUFyQixDQUFpQ3ZSLElBQUlFLGFBQUosQ0FBa0I0WixXQUFsQixDQUE4Qm5HLEtBQTlCLENBQW9DLENBQXBDLEVBQXVDLENBQUMsQ0FBeEMsQ0FBakM7QUFDQTtBQUNELEVBaFArQzs7QUFrUGhEcEosZUFBYyxzQkFBU3ZLLEdBQVQsRUFBYztBQUMzQjtBQUNBLE1BQUksS0FBSzRELElBQUwsRUFBSixFQUNDLEtBQUt6RCxPQUFMLENBQWEsZUFBYixFQUE4QkgsR0FBOUI7QUFDRCxFQXRQK0M7O0FBd1BoRDRELE9BQU0sY0FBUzhPLFlBQVQsRUFBdUJDLFVBQXZCLEVBQW1DO0FBQ3hDLE1BQUksQ0FBQyxLQUFLMVQsRUFBTCxDQUFRMlQsV0FBUixDQUFvQjFGLElBQXpCLEVBQ0M7O0FBRUQsTUFBTWhDLFdBQVc5TixFQUFFNFYsSUFBRixDQUFPLEtBQUsvVCxFQUFMLENBQVEyVCxXQUFSLENBQW9CMUYsSUFBcEIsRUFBUCxDQUFqQjtBQUNBLE1BQU01SyxXQUFXLEtBQUt1TCxVQUFMLENBQWdCbkssR0FBaEIsQ0FBb0IsVUFBcEIsS0FBbUMsQ0FBQ2lQLFVBQXBDLEdBQWlEdlYsRUFBRTRWLElBQUYsQ0FBTyxLQUFLL1QsRUFBTCxDQUFRcUQsUUFBUixDQUFpQjRLLElBQWpCLEVBQVAsQ0FBakQsR0FBbUYsRUFBcEc7QUFDQSxNQUFJK0YsZ0JBQWdCLElBQXBCOztBQUVBLE1BQUksS0FBS2xDLFlBQVQsRUFDQ2tDLGdCQUFnQixLQUFLbEMsWUFBTCxDQUFrQm1DLFFBQWxCLEVBQWhCOztBQUVELE1BQU02RixZQUFZLEtBQUs5WixFQUFMLENBQVE4WixTQUFSLENBQWtCN0wsSUFBbEIsR0FBeUJnTSxPQUF6QixDQUFpQyxpQkFBakMsRUFBb0QsRUFBcEQsQ0FBbEI7QUFDQSxPQUFLM1osS0FBTCxDQUFXK0gsR0FBWCxDQUFlO0FBQ2RzUixXQUFRO0FBQ1ByVixVQUFNLE9BREM7QUFFUEgsYUFBUzJWO0FBRkYsSUFETTtBQUtkelcsYUFBVUEsUUFMSTtBQU1kNEksYUFBVUEsUUFOSTtBQU9kK0gsa0JBQWVBLGFBUEQ7QUFRZDVCLHdCQUFxQjRCLGtCQUFrQjtBQVJ6QixHQUFmOztBQVdBLE1BQUlnSCxZQUFZLENBQWhCO0FBQ0EsTUFBTUMsWUFBWW5CLFVBQVVvQixLQUFWLENBQWdCLFdBQWhCLENBQWxCO0FBQ0EvYyxJQUFFdUssSUFBRixDQUFPdVMsU0FBUCxFQUFrQixnQkFBUTtBQUN6QixPQUFLLGVBQUQsQ0FBa0JFLElBQWxCLENBQXVCQyxJQUF2QixDQUFKLEVBQ0NKO0FBQ0QsR0FIRDs7QUFLQSxPQUFLMWEsS0FBTCxDQUFXK0gsR0FBWCxDQUFlLEVBQUVrRyxnQkFBZ0J5TSxTQUFsQixFQUFmOztBQUVBLE1BQUksQ0FBQ3ZILFlBQUwsRUFDQyxPQUFPLEtBQUtuVCxLQUFMLENBQVdpVSxPQUFYLEVBQVA7QUFDRCxFQTFSK0M7O0FBNFJoREMsaUJBQWdCLDBCQUFXO0FBQzFCLE1BQUksS0FBS3hRLFdBQVQsRUFDQztBQUNEO0FBQ0EsTUFBTXlRLE9BQU8sS0FBS25VLEtBQUwsQ0FBV3FQLGVBQVgsQ0FBMkIrRSxLQUEzQixDQUFpQyxDQUFqQyxDQUFiO0FBQ0FELE9BQUtFLE9BQUwsQ0FBYSw0RUFBYjs7QUFFQSxPQUFLM1UsRUFBTCxDQUFRNFUsTUFBUixDQUFlakssV0FBZixDQUEyQixNQUEzQixFQUFtQzBJLFFBQW5DLENBQTRDLFNBQTVDLEVBQXVEd0IsSUFBdkQsQ0FBNERKLEtBQUtLLElBQUwsQ0FBVSxxQkFBVixDQUE1RDtBQUNBLEVBcFMrQzs7QUFzU2hEQyxhQUFZLHNCQUFXO0FBQ3RCLE9BQUsvVSxFQUFMLENBQVE0VSxNQUFSLENBQWV0TyxRQUFmLENBQXdCLE1BQXhCO0FBQ0EsRUF4UytDOztBQTBTaEQwTyxZQUFXLG1CQUFTalUsR0FBVCxFQUFjO0FBQ3hCQSxNQUFJa0YsZUFBSjtBQUNBbEYsTUFBSXlSLGNBQUo7QUFDQTtBQTdTK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoiYXNzZXNzbWVudE1vZGFsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCBtb21lbnQgPSByZXF1aXJlKFwibW9tZW50XCIpO1xucmVxdWlyZShcInJhbmdlc2xpZGVyXCIpO1xuY29uc3QgcmF5Z3VuID0gcmVxdWlyZShcInJheWd1blwiKTtcblxuY29uc3QgQXBwID0gcmVxdWlyZShcIi4uL2luZGV4XCIpO1xuY29uc3QgcmVzdGVyID0gcmVxdWlyZShcInJlc3RlclwiKTtcbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcblxuY29uc3QgQXNzZXNzbWVudCA9IHJlcXVpcmUoXCIuL2Fzc2Vzc21lbnRNb2RlbFwiKTtcbmNvbnN0IEJpZ01vZGFsID0gcmVxdWlyZShcIi4vYmlnTW9kYWxcIik7XG5jb25zdCBJYWdvID0gcmVxdWlyZShcIi4vaWFnb1wiKTtcbmNvbnN0IEltYWdlQ2hvb3NlciA9IHJlcXVpcmUoXCIuL2ltYWdlQ2hvb3NlclwiKTtcbmNvbnN0IFNpbXBsZU1lbnUgPSByZXF1aXJlKFwiLi9zaW1wbGVNZW51XCIpO1xuY29uc3QgU2VsZWN0cmEgPSByZXF1aXJlKFwiLi9zZWxlY3RyYVwiKTtcbmNvbnN0IFNsaWRlb3V0ID0gcmVxdWlyZShcInNsaWRlb3V0XCIpO1xuY29uc3QgRXJyb3JzID0gcmVxdWlyZShcIi4vZXJyb3JzXCIpO1xuY29uc3QgUXVlc3Rpb25zID0ge30sIE1vZGVscyA9IHt9O1xuXG5jb25zdCBQYWdlID0gbmV3IEJhY2tib25lLk1hcmlvbmV0dGUuT2JqZWN0KCk7XG5cbmNvbnN0IFF1ZXN0aW9uVHlwZXMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImFzc2Vzc21lbnQtcXVlc3Rpb24tdHlwZXNcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4vdGVtcGxhdGVzL2Fzc2Vzc21lbnRNb2RhbC5udW5qXCIpLnF1ZXN0aW9uVHlwZXMsXG5cblx0dWk6IHtcblx0XHRibG9jazogXCJbZGF0YS10eXBlXVwiLFxuXG5cdFx0dW5kbzogXCIucmlnaHRcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5ibG9ja1wiOiBcInNldFR5cGVcIixcblxuXHRcdFwiY2xpY2sgQHVpLnVuZG9cIjogXCJ1bmRvXCIsXG5cdH0sXG5cblx0dGVtcGxhdGVDb250ZXh0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aXNOZXc6ICgpID0+IHRoaXMubW9kZWwuaXNOZXcoKSxcblx0XHR9O1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLnRvdGFsID0gb3B0aW9ucy5zaXplICsgMTtcblx0fSxcblxuXHRzZXJpYWxpemVEYXRhOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4geyB0b3RhbDogdGhpcy50b3RhbCB9O1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy50b3RhbCA9PT0gMSlcblx0XHRcdHRoaXMudWkudW5kby5oaWRlKCk7XG5cdH0sXG5cblx0c2V0VHlwZTogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0Y29uc3QgZWwgPSAkKGV2dC5jdXJyZW50VGFyZ2V0KTtcblx0XHR0aGlzLnRyaWdnZXIoXCJ0eXBlXCIsIGVsLmRhdGEoXCJ0eXBlXCIpKTtcblx0fSxcblxuXHR1bmRvOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnRyaWdnZXIoXCJ0eXBlXCIsIFwiXCIpO1xuXHR9LFxufSk7XG5cbmNvbnN0IEFzc2Vzc21lbnRNb2RhbCA9IG1vZHVsZS5leHBvcnRzID0gQmlnTW9kYWwuZXh0ZW5kKHtcblx0dWk6IHtcblx0XHRidXM6IFwiI2lhZ28tYXNzZXNzbWVudFwiLFxuXHRcdGFzc2Vzc21lbnRCYXNpczogXCIuYXNzZXNzbWVudC1iYXNpc1wiLFxuXHRcdGFzc2Vzc21lbnRQYW5lbDogXCIuYXNzZXNzbWVudC1wYW5lbFwiLFxuXHRcdGFzc2Vzc21lbnRBcmVhOiBcIi5hc3Nlc3NtZW50LWFyZWFcIixcblx0XHRlcnJvckNvbnRhaW5lcjogXCIuZXJyb3JzXCIsXG5cdFx0Y29udHJvbFBhbmVsOiBcIi5jb250cm9sLXBhbmVsXCIsXG5cdFx0bWV0YWRhdGFQYW5lbDogXCIubWV0YWRhdGEtcGFuZWxcIixcblx0XHR0b2dnbGU6IFwiLm1lbnVUb2dnbGVcIixcblx0XHRvcHRpb25zOiBcIi5vcHRpb25Ub2dnbGVcIixcblx0XHRwcmV2aWV3OiBcIi5wcmV2aWV3XCIsXG5cdFx0dG90YWxNYXJrOiBcIi50b3RhbC1tYXJrXCIsXG5cdFx0cXVlc3Rpb25OdW1iZXI6IFwiLnF1ZXN0aW9uLW51bWJlclwiLFxuXHRcdHF1ZXN0aW9uTWFyazogXCIucXVlc3Rpb24tbWFya1wiLFxuXHRcdGFjdGlvbnM6IFwiLmFjdGlvbkhvc3RcIixcblx0XHRzbGlkZXJIb3N0OiBcIi5zbGlkZXJIb3N0XCIsXG5cdFx0c2xpZGVyTnVtOiBcIi5zbGlkZXJIb3N0IGlucHV0W3R5cGU9J251bWJlciddXCIsXG5cdFx0c2xpZGVyQ291bnQ6IFwiLnNsaWRlckhvc3QgLnRvdGFsXCIsXG5cdFx0c2xpZGVyOiBcImlucHV0W3R5cGU9J3JhbmdlJ11cIixcblx0XHRkZWxldGVRdWVzdGlvbjogXCIuYWN0aW9uSG9zdCAuZGVsZXRlXCIsXG5cdFx0aW5mb0hvc3Q6IFwiLmluZm9Ib3N0XCIsXG5cblx0XHRtdXN0Q2xvbmVNZXNzYWdlOiBcIi5tdXN0LWNsb25lLW1lc3NhZ2VcIixcblx0XHRpc0Nsb25lTWVzc2FnZTogXCIuaXMtY2xvbmUtbWVzc2FnZVwiLFxuXHRcdGNyZWF0ZU1lc3NhZ2U6IFwiLmNyZWF0ZS1tZXNzYWdlXCIsXG5cdFx0dGl0bGVMYWJlbDogXCIudGl0bGUtbGFiZWxcIixcblx0XHR0aXRsZTogXCJpbnB1dFtuYW1lPSd0aXRsZSddXCIsXG5cdFx0ZGVzY3JpcHRpb246IFwidGV4dGFyZWFbbmFtZT0nZGVzYyddXCIsXG5cdFx0c3ViamVjdExhYmVsOiBcIi5zdWJqZWN0LWxhYmVsXCIsXG5cdFx0c3ViamVjdDogXCJpbnB1dFtuYW1lPSdzdWJqZWN0J11cIixcblx0XHRzdHVkeVllYXJMYWJlbDogXCIuc3R1ZHlZZWFyLWxhYmVsXCIsXG5cdFx0c3R1ZHlZZWFyOiBcInNlbGVjdFtuYW1lPSdzdHVkeVllYXInXVwiLFxuXHRcdGxhbmd1YWdlOiBcInNlbGVjdFtuYW1lPSdsYW5ndWFnZSddXCIsXG5cdFx0ZmVlZGJhY2s6IFwiI2ZlZWRiYWNrXCIsXG5cdFx0YnV0dG9uQWRkRWRpdFF1ZXN0aW9uczogXCJpbnB1dFt0eXBlPSdidXR0b24nXS5hZGQtZWRpdC1xdWVzdGlvbnNcIixcblx0XHRuZXh0QnV0dG9uOiBcIiNpYWdvLW5leHQtcXVlc3Rpb25cIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS50b2dnbGVcIjogXCJ0b2dnbGVNZW51XCIsXG5cdFx0XCJjbGljayBAdWkub3B0aW9uc1wiOiBcInRvZ2dsZU9wdGlvbnNcIixcblx0XHRcImNsaWNrIEB1aS5kZWxldGVRdWVzdGlvblwiOiBcImRlbGV0ZVF1ZXN0aW9uXCIsXG5cdFx0XCJjbGljayBAdWkucHJldmlld1wiOiBcInByZXZpZXdcIixcblxuXHRcdFwiY2hhbmdlIEB1aS5sYW5ndWFnZVwiOiBcImxhbmd1YWdlQ2hhbmdlZFwiLFxuXHRcdFwiY2hhbmdlIEB1aS5mZWVkYmFja1wiOiBcImZlZWRiYWNrQ2hhbmdlZFwiLFxuXHRcdFwiY2xpY2sgQHVpLmJ1dHRvbkFkZEVkaXRRdWVzdGlvbnNcIjogXCJvbkJ1dHRvbkFkZEVkaXRRdWVzdGlvbnNDbGlja1wiLFxuXG5cdFx0XCJjaGFuZ2UgQHVpLnNsaWRlck51bVwiOiBcImNoYW5nZVF1ZXN0aW9uTnVtXCIsXG5cdFx0XCJjaGFuZ2UgQHVpLnNsaWRlclwiOiBcImNoYW5nZVF1ZXN0aW9uU2xpZGVcIixcblx0fSxcblxuXHRhY3Rpb25zOiB7XG5cdFx0Y3JlYXRlOiBcIm9uQXNzZXNzbWVudENyZWF0ZWRcIixcblx0XHRjcmVhdGVBbm90aGVyOiBcIm9uQ3JlYXRlQW5vdGhlclwiLFxuXHRcdHVwZGF0ZTogXCJvbkFzc2Vzc21lbnRVcGRhdGVkXCIsXG5cdH0sXG5cblx0cmVnaW9uczoge1xuXHRcdGVycm9yQ29udGFpbmVyOiBcIi5lcnJvcnNcIixcblx0fSxcblxuXHRlcnJvck1hcDoge1xuXHRcdGxhbmd1YWdlOiB7XG5cdFx0XHRwb3NpdGlvbjogXCJyaWdodFwiLFxuXHRcdH0sXG5cdFx0c3R1ZHlZZWFyOiB7XG5cdFx0XHRhdHRyYWN0aW9uRWxlbWVudDogXCJzdHVkeVllYXJMYWJlbFwiLFxuXHRcdFx0cG9zaXRpb246IFwicmlnaHRcIixcblx0XHR9LFxuXHRcdHN1YmplY3Q6IHtcblx0XHRcdGF0dHJhY3Rpb25FbGVtZW50OiBcInN1YmplY3RMYWJlbFwiLFxuXHRcdFx0cG9zaXRpb246IFwicmlnaHRcIixcblx0XHR9LFxuXHRcdHRpdGxlOiB7XG5cdFx0XHRhdHRyYWN0aW9uRWxlbWVudDogXCJ0aXRsZUxhYmVsXCIsXG5cdFx0XHRwb3NpdGlvbjogXCJyaWdodFwiLFxuXHRcdH0sXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucyA9IHt9KSB7XG5cdFx0Xy5iaW5kQWxsKHRoaXMpO1xuXG5cdFx0aWYgKG9wdGlvbnMucHJldmlld01vZGUpIHtcblx0XHRcdHRoaXMuT3B0aW9ucyA9IHtcblx0XHRcdFx0Y2xhc3NlczogW1wiYXNzZXNzbWVudC1tb2RhbFwiXSxcblx0XHRcdFx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9hc3Nlc3NtZW50TW9kYWwubnVualwiKS5jb250ZW50LFxuXHRcdFx0XHRidXR0b25zOiB7XG5cdFx0XHRcdFx0Y2FuY2VsOiB7XG5cdFx0XHRcdFx0XHR0eXBlOiBcImNhbmNlbFwiLFxuXHRcdFx0XHRcdFx0bGFiZWw6IFwiQ2xvc2UgUHJldmlld1wiLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGRhdGFOb3VuOiBcImFzc2Vzc21lbnRcIiArICh0aGlzLm1vZGVsLmlzTmV3KCkgPyBcIlwiIDogXCI6IFwiICsgdGhpcy5tb2RlbC5nZXQoXCJ0aXRsZVwiKSksXG5cdFx0XHR9O1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMuT3B0aW9ucyA9IHtcblx0XHRcdFx0Y2xhc3NlczogW1wiYXNzZXNzbWVudC1tb2RhbFwiXSxcblx0XHRcdFx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9hc3Nlc3NtZW50TW9kYWwubnVualwiKS5jb250ZW50LFxuXHRcdFx0XHRidXR0b25zOiB7XG5cdFx0XHRcdFx0Y3JlYXRlOiB7XG5cdFx0XHRcdFx0XHR0eXBlOiBcImFjY2VwdFwiLFxuXHRcdFx0XHRcdFx0bGFiZWw6IFwiQ3JlYXRlICYgQ2xvc2VcIixcblx0XHRcdFx0XHRcdG1vZGU6IFwiY3JlYXRlXCIsXG5cdFx0XHRcdFx0XHRzYXZlOiB0cnVlLFxuXHRcdFx0XHRcdFx0dmFsaWRhdGU6IHRydWUsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRjcmVhdGVBbm90aGVyOiB7XG5cdFx0XHRcdFx0XHR0eXBlOiBcImFjY2VwdFwiLFxuXHRcdFx0XHRcdFx0bGFiZWw6IFwiQ3JlYXRlXCIsXG5cdFx0XHRcdFx0XHRtb2RlOiBcImNyZWF0ZVwiLFxuXHRcdFx0XHRcdFx0c2F2ZTogdHJ1ZSxcblx0XHRcdFx0XHRcdHZhbGlkYXRlOiB0cnVlLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0dXBkYXRlOiB7XG5cdFx0XHRcdFx0XHR0eXBlOiBcImFjY2VwdFwiLFxuXHRcdFx0XHRcdFx0bGFiZWw6IFwiVXBkYXRlXCIsXG5cdFx0XHRcdFx0XHRtb2RlOiBcImVkaXRcIixcblx0XHRcdFx0XHRcdHBlcm1pc3Npb246IHRoaXMucGVybWlzc2lvblRvVXBkYXRlLmJpbmQodGhpcyksXG5cdFx0XHRcdFx0XHRzYXZlOiB0cnVlLFxuXHRcdFx0XHRcdFx0dmFsaWRhdGU6IHRydWUsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRjYW5jZWw6IHtcblx0XHRcdFx0XHRcdHR5cGU6IFwiY2FuY2VsXCIsXG5cdFx0XHRcdFx0XHRsYWJlbDogXCJDYW5jZWxcIixcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRkYXRhTm91bjogXCJhc3Nlc3NtZW50IC8gc3VydmV5XCIgKyAodGhpcy5tb2RlbC5pc05ldygpID8gXCJcIiA6IFwiOiBcIiArIHRoaXMubW9kZWwuZ2V0KFwidGl0bGVcIikpLFxuXHRcdFx0XHRob3N0OiBvcHRpb25zLmhvc3QsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdHRoaXMucHJldmlld01vZGUgPSBCb29sZWFuKG9wdGlvbnMucHJldmlld01vZGUpO1xuXHRcdHRoaXMucmVzdGFydFByZXZpZXcgPSBCb29sZWFuKG9wdGlvbnMucmVzdGFydCk7XG5cblx0XHR0aGlzLmlhZ28gPSBuZXcgSWFnbyh7XG5cdFx0XHRlZGl0TW9kZTogIXRoaXMucHJldmlld01vZGUsXG5cdFx0XHRwcmV2aWV3TW9kZTogdGhpcy5wcmV2aWV3TW9kZSxcblx0XHRcdGZlZWRiYWNrTW9kZTogdGhpcy5tb2RlbC5nZXQoXCJmZWVkYmFja1wiKSxcblx0XHRcdHBhcmVudDogdGhpcy4kZWwuZ2V0KDApLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5pZCA9IDE7XG5cdFx0dGhpcy5xdWVzdGlvbk1vZGVscyA9IFtdO1xuXHRcdHRoaXMubGlzdGVuVG8oUGFnZSwgXCJxdWVzdGlvbnM6YWRkZWRcIiwgdGhpcy51cGRhdGVVSVJlYWRpbmVzcy5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKFBhZ2UsIFwicXVlc3Rpb25zOnJlbW92ZWRcIiwgdGhpcy51cGRhdGVVSVJlYWRpbmVzcy5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmRlbGV0ZVdoZW5DYW5jZWwgPSBmYWxzZTtcblxuXHRcdHRoaXMudWkgPSBfLmV4dGVuZCh0aGlzLnVpLCBCaWdNb2RhbC5wcm90b3R5cGUudWkpO1xuXHRcdHRoaXMuZXZlbnRzID0gXy5leHRlbmQodGhpcy5ldmVudHMsIEJpZ01vZGFsLnByb3RvdHlwZS5ldmVudHMpO1xuXG5cdFx0QmlnTW9kYWwucHJvdG90eXBlLmluaXRpYWxpemUuY2FsbCh0aGlzKTtcblx0fSxcblxuXHRhdWdtZW50VGVtcGxhdGVEYXRhOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0cHJldmlld01vZGU6IHRoaXMucHJldmlld01vZGUsXG5cdFx0fTtcblx0fSxcblxuXHRwcmV2aWV3OiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRpZiAodGhpcy5pYWdvLnN0YXRlKSB7XG5cdFx0XHQvLyBTYXZlIHRoZSBjdXJyZW50IHF1ZXN0aW9uLCBpZiBwcmVzZW50ICh3aGljaCBtaWdodCBmYWlsKVxuXHRcdFx0aWYgKHRoaXMuY3VycmVudFF1ZXN0aW9uICYmICF0aGlzLmN1cnJlbnRRdWVzdGlvbi5zYXZlKCkpIHtcblx0XHRcdFx0Y29uc29sZS5lcnJvcihcIkVycm9yIHNhdmluZyBxdWVzdGlvbi5cIik7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0Ly8gSGlkZSBhbnkgZXJyb3IgbWVzc2FnZXNcblx0XHRcdFx0JChcIi5xdWVzdGlvbi1lcnJvcnNcIikuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0XHRcdGlmICh0aGlzLmN1cnJlbnRRdWVzdGlvbilcblx0XHRcdFx0XHR0aGlzLmlhZ28udXBkYXRlQ3VycmVudE1vZGVsKHRoaXMuY3VycmVudFF1ZXN0aW9uLm1vZGVsLnRvSlNPTigpKTtcblxuXHRcdFx0XHRjb25zdCBkYXRhID0gdGhpcy5tb2RlbC50b0pTT04oKTtcblxuXHRcdFx0XHRkYXRhLnF1ZXN0aW9uRGF0YSA9IF8ubWFwKHRoaXMucXVlc3Rpb25Nb2RlbHMsIG1vZGVsID0+IG1vZGVsLnRvSlNPTigpKTtcblx0XHRcdFx0dGhpcy5pYWdvLnN0YXRlLmN1cnJlbnRRdWVzdGlvbiA9IDA7XG5cdFx0XHRcdGNvbnN0IG1vZGFsID0gbmV3IEFzc2Vzc21lbnRNb2RhbCh7XG5cdFx0XHRcdFx0bW9kZWw6IG5ldyBBc3Nlc3NtZW50KGRhdGEpLFxuXHRcdFx0XHRcdHByZXZpZXdNb2RlOiB0cnVlLFxuXHRcdFx0XHRcdGN1cnJlbnRRdWVzdGlvbjogdGhpcy5pYWdvLnN0YXRlLmN1cnJlbnRRdWVzdGlvbixcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0bW9kYWwuc2hvdyh7fSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdGlzTW9kZUNyZWF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuICF0aGlzLm1vZGVsIHx8IHRoaXMubW9kZWwuaXNOZXcoKSB8fCB0aGlzLm1vZGVsLmhhcyhcImNsb25lZFwiKSAmJiB0aGlzLm1vZGVsLmdldChcImNsb25lZFwiKTtcblx0fSxcblxuXHRwZXJtaXNzaW9uVG9VcGRhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHVzZXIgPSByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpO1xuXG5cdFx0cmV0dXJuIHNldHRpbmdzLnJlc291cmNlRWRpdGluZyAmJiByZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmFwaS5yZXNvdXJjZXMucHV0LCB1c2VyKTtcblx0fSxcblxuXHRsb2FkRGF0YTogZnVuY3Rpb24oY2IpIHtcblx0XHRpZiAoIXRoaXMucHJldmlld01vZGUgJiYgKCF0aGlzLm1vZGVsLmlzTmV3KCkgfHwgdGhpcy5tb2RlbC5nZXQoXCJjbG9uZWRcIikpKSB7XG5cdFx0XHQvLyBXZSBuZWVkIHRvIGZldGNoIHRoZSB1bmFicmlkZ2VkIG1vZGVsXG5cdFx0XHR0aGlzLl90aXRsZSA9IHRoaXMubW9kZWwuZ2V0KFwidGl0bGVcIik7XG5cblx0XHRcdHRoaXMubW9kZWwuZmV0Y2goe1xuXHRcdFx0XHRzdWNjZXNzOiB0aGlzLmZldGNoU3VjY2Vzcy5iaW5kKHRoaXMsIGNiKSxcblx0XHRcdFx0ZXJyb3I6IHRoaXMuZmV0Y2hFcnJvci5iaW5kKHRoaXMsIGNiKSxcblx0XHRcdFx0dXJsOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9yZXNvdXJjZXMvYXNzZXNzbWVudHMvXCIgKyB0aGlzLm1vZGVsLmlkLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKHRoaXMucHJldmlld01vZGUgJiYgdGhpcy5tb2RlbC5nZXQoXCJxdWVzdGlvbkRhdGFcIikubGVuZ3RoID09PSAwICYmICF0aGlzLm1vZGVsLmlzTmV3KCkpIHtcblx0XHRcdC8vIFdlIG5lZWQgdG8gZmV0Y2ggdGhlIHVuYWJyaWRnZWQgbW9kZWxcblx0XHRcdHRoaXMuX3RpdGxlID0gdGhpcy5tb2RlbC5nZXQoXCJ0aXRsZVwiKTtcblxuXHRcdFx0dGhpcy5tb2RlbC5mZXRjaCh7XG5cdFx0XHRcdHN1Y2Nlc3M6IHRoaXMuZmV0Y2hTdWNjZXNzLmJpbmQodGhpcywgY2IpLFxuXHRcdFx0XHRlcnJvcjogdGhpcy5mZXRjaEVycm9yLmJpbmQodGhpcywgY2IpLFxuXHRcdFx0XHR1cmw6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3Jlc291cmNlcy9hc3Nlc3NtZW50cy9cIiArIHRoaXMubW9kZWwuaWQsXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLnBvcHVsYXRlUXVlc3Rpb25Nb2RlbHMoKTtcblx0XHRcdHJldHVybiBjYigpO1xuXHRcdH1cblx0fSxcblxuXHRmZXRjaFN1Y2Nlc3M6IGZ1bmN0aW9uKGNiKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwiY2xvbmVkXCIpKSB7XG5cdFx0XHR0aGlzLm1vZGVsLnNldChcInRpdGxlXCIsIHRoaXMuX3RpdGxlKTtcblx0XHRcdHRoaXMubW9kZWwudW5zZXQoXCJfaWRcIik7XG5cdFx0XHR0aGlzLm1vZGVsLnVuc2V0KFwiY2xvbmVkXCIpO1xuXG5cdFx0XHR0aGlzLmlzQ2xvbmUgPSB0cnVlO1xuXHRcdH1cblxuXHRcdHRoaXMucG9wdWxhdGVRdWVzdGlvbk1vZGVscygpO1xuXG5cdFx0Y2IoKTtcblx0fSxcblxuXHRmZXRjaEVycm9yOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmJpbmRFdmVudHModGhpcy5tb2RlbCwgdGhpcy5tb2RlbEV2ZW50cyk7XG5cdH0sXG5cblx0cG9wdWxhdGVRdWVzdGlvbk1vZGVsczogZnVuY3Rpb24oKSB7XG5cdFx0Xy5lYWNoKHRoaXMubW9kZWwuZ2V0KFwicXVlc3Rpb25EYXRhXCIpLCBxID0+IHtcblx0XHRcdGlmIChxLmlkID4gdGhpcy5pZClcblx0XHRcdFx0dGhpcy5pZCA9IHEuaWQ7XG5cblx0XHRcdHRoaXMucXVlc3Rpb25Nb2RlbHMucHVzaChuZXcgTW9kZWxzW3EudHlwZSArIChxLnN1YnR5cGUgPyBcIi5cIiArIHEuc3VidHlwZSA6IFwiXCIpXShxKSk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLmlkKys7XG5cdH0sXG5cblx0cmVuZGVyRm9ybTogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3Qgc2VsZWN0ID0gbmV3IFNlbGVjdHJhKHtcblx0XHRcdHNlcnZlcjoge1xuXHRcdFx0XHRmZXRjaDogYCR7c2V0dGluZ3MudXJsUm9vdH0vYXBpLzEuMC9kYXRhL3N1YmplY3RzYCxcblx0XHRcdFx0ZGVsYXlMb2FkOiB0cnVlLFxuXHRcdFx0XHRrZXk6IFwic3ViamVjdF9pZFwiLFxuXHRcdFx0XHR2YWx1ZTogXCJzdWJqZWN0XCIsXG5cdFx0XHRcdGRlZmF1bHQ6IHtcblx0XHRcdFx0XHRrZXk6IHRoaXMubW9kZWwuZ2V0KFwic3ViamVjdFwiKSxcblx0XHRcdFx0XHR2YWx1ZTogdGhpcy5tb2RlbC5nZXQoXCJzdWJqZWN0X25hbWVcIiksXG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdHBhZ2VTaXplOiAyMCxcblx0XHRcdFx0aW5maW5pdGU6IHRydWUsXG5cdFx0XHR9LFxuXHRcdFx0ZGRIb3N0OiB0aGlzLk9wdGlvbnMuaG9zdCxcblx0XHRcdHBsYWNlaG9sZGVyOiBcIk5vIHN1YmplY3Qgc2VsZWN0ZWRcIixcblx0XHR9KTtcblxuXHRcdHNlbGVjdC5zaG93KHsgZWw6IHRoaXMudWkuc3ViamVjdCB9KTtcblxuXHRcdCQoXCJzZWxlY3RcIiwgdGhpcy5lbCkuY2hvc2VuKHsgd2lkdGg6IFwiMTAwJVwiIH0pO1xuXHRcdHRoaXMudWkuc2xpZGVyLnJhbmdlc2xpZGVyKHsgcG9seWZpbGw6IGZhbHNlIH0pO1xuXHRcdHRoaXMuJGVsLmZvdW5kYXRpb24oKTtcblxuXHRcdGlmICh0aGlzLnByZXZpZXdNb2RlKSB7XG5cdFx0XHR0aGlzLnN3aXRjaFRvUHJldmlld01vZGUoKTtcblx0XHRcdHRoaXMuY3JlYXRlUXVlc3Rpb24oXCJcIiwgdGhpcy5yZXN0YXJ0UHJldmlldyA/IDAgOiB0aGlzLm9wdGlvbnMuY3VycmVudFF1ZXN0aW9uKTtcblx0XHRcdHRoaXMudWkucHJldmlldy5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLnVpLmRlbGV0ZVF1ZXN0aW9uLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHRoaXMudWkuc2xpZGVySG9zdC5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLnVpLmluZm9Ib3N0LmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHRoaXMudWkub3B0aW9ucy5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKHRoaXMuaXNDbG9uZSB8fCB0aGlzLm11c3RDbG9uZSgpKSB7XG5cdFx0XHR0aGlzLnNob3dDbG9uZWRNZXRhZGF0YUZvcm0oKTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoIXRoaXMubW9kZWwuaXNOZXcoKSkge1xuXHRcdFx0dGhpcy5zd2l0Y2hUb0VkaXRNb2RlKCk7XG5cdFx0XHR0aGlzLmNyZWF0ZVF1ZXN0aW9uKFwiXCIpO1xuXHRcdH1cblxuXHRcdHRoaXMudXBkYXRlVUlSZWFkaW5lc3ModGhpcy5xdWVzdGlvbk1vZGVscyk7XG5cdH0sXG5cblx0dXBkYXRlVUlSZWFkaW5lc3M6IGZ1bmN0aW9uKHF1ZXN0aW9ucykge1xuXHRcdGlmICghcXVlc3Rpb25zIHx8IHF1ZXN0aW9ucy5sZW5ndGggPT09IDApXG5cdFx0XHR0aGlzLnNldFVJQnVzeSgpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuc2V0VUlSZWFkeSgpO1xuXHR9LFxuXG5cdG9uQnV0dG9uQWRkRWRpdFF1ZXN0aW9uc0NsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm1vZGVsLnNldCh7XG5cdFx0XHRkZXNjcmlwdGlvbjogdGhpcy51aS5kZXNjcmlwdGlvbi52YWwoKSxcblx0XHRcdGZlZWRiYWNrOiB0aGlzLnVpLmZlZWRiYWNrLnByb3AoXCJjaGVja2VkXCIpLFxuXHRcdFx0bGFuZ3VhZ2U6IHRoaXMudWkubGFuZ3VhZ2UudmFsKCksXG5cdFx0XHR0aXRsZTogdGhpcy51aS50aXRsZS52YWwoKSxcblx0XHRcdHN0dWR5WWVhcjogdGhpcy51aS5zdHVkeVllYXIudmFsKCksXG5cdFx0XHRzdWJqZWN0OiB0aGlzLnVpLnN1YmplY3QudmFsKCksXG5cdFx0fSwgeyB2YWxpZGF0ZTogZmFsc2UgfSk7XG5cblx0XHR0aGlzLm1vZGVsLnNhdmUoKTtcblxuXHRcdGlmICh0aGlzLnVpLnRpdGxlLnZhbCgpICE9PSBcIlwiICYmIHRoaXMudWkuc3R1ZHlZZWFyLnZhbCgpICE9PSBcIlwiICYmIHRoaXMudWkuc3ViamVjdC52YWwoKSAhPT0gXCJcIilcblx0XHRcdHRoaXMuc3dpdGNoVG9FZGl0TW9kZSgpO1xuXG5cdFx0aWYgKHRoaXMubW9kZWwuaXNOZXcoKSAmJiAhdGhpcy5pc0Nsb25lKVxuXHRcdFx0dGhpcy5zaG93VHlwZXMoKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLmNyZWF0ZVF1ZXN0aW9uKFwiXCIpO1xuXHR9LFxuXG5cdHNob3dDbG9uZWRNZXRhZGF0YUZvcm06IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLm11c3RDbG9uZSgpKVxuXHRcdFx0dGhpcy51aS5tdXN0Q2xvbmVNZXNzYWdlLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnVpLmlzQ2xvbmVNZXNzYWdlLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblxuXHRcdHRoaXMudWkuY3JlYXRlTWVzc2FnZS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5idXR0b25BZGRFZGl0UXVlc3Rpb25zLnZhbChcIkJlZ2luIGVkaXRpbmcgcXVlc3Rpb25zXCIpO1xuXHR9LFxuXG5cdHN3aXRjaFRvRWRpdE1vZGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkuY29udHJvbFBhbmVsLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLm1ldGFkYXRhUGFuZWwuYWRkQ2xhc3MoXCJtZXRhZGF0YS1wYW5lbC1jb2xsYXBzZWRcIik7XG5cdFx0dGhpcy51aS5hc3Nlc3NtZW50QmFzaXMucmVtb3ZlQ2xhc3MoXCJhc3Nlc3NtZW50LWJhc2lzLXNpbXBsZVwiKTtcblx0XHR0aGlzLnVpLmFzc2Vzc21lbnRQYW5lbC5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cblx0XHR0aGlzLm1lbnUgPSBuZXcgU2xpZGVvdXQoe1xuXHRcdFx0cGFuZWw6IHRoaXMudWkuYXNzZXNzbWVudFBhbmVsLmdldCgwKSxcblx0XHRcdG1lbnU6IHRoaXMudWkubWV0YWRhdGFQYW5lbC5nZXQoMCksXG5cdFx0XHRwYWRkaW5nOiA1MTIsXG5cdFx0XHR0b2xlcmFuY2U6IDcwLFxuXHRcdH0pO1xuXHR9LFxuXG5cdHN3aXRjaFRvUHJldmlld01vZGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkuY29udHJvbFBhbmVsLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLm1ldGFkYXRhUGFuZWwuYWRkQ2xhc3MoXCJtZXRhZGF0YS1wYW5lbC1jb2xsYXBzZWRcIik7XG5cdFx0dGhpcy51aS5hc3Nlc3NtZW50QmFzaXMucmVtb3ZlQ2xhc3MoXCJhc3Nlc3NtZW50LWJhc2lzLXNpbXBsZVwiKTtcblx0XHR0aGlzLnVpLmFzc2Vzc21lbnRQYW5lbC5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cblx0XHR0aGlzLm1lbnUgPSBuZXcgU2xpZGVvdXQoe1xuXHRcdFx0cGFuZWw6IHRoaXMudWkuYXNzZXNzbWVudFBhbmVsLmdldCgwKSxcblx0XHRcdG1lbnU6IHRoaXMudWkubWV0YWRhdGFQYW5lbC5nZXQoMCksXG5cdFx0XHRwYWRkaW5nOiA1MTIsXG5cdFx0XHR0b2xlcmFuY2U6IDcwLFxuXHRcdH0pO1xuXHR9LFxuXG5cdHNldEFzc2Vzc21lbnRBcmVhQ29udGVudHM6IGZ1bmN0aW9uKHZpZXcpIHtcblx0XHRpZiAodGhpcy5hc3Nlc3NtZW50QXJlYUNvbnRlbnRzKSB7XG5cdFx0XHR0aGlzLmFzc2Vzc21lbnRBcmVhQ29udGVudHMuZGVzdHJveSgpO1xuXHRcdFx0dGhpcy5hc3Nlc3NtZW50QXJlYUNvbnRlbnRzID0gbnVsbDtcblx0XHR9XG5cblx0XHR0aGlzLnVpLmFzc2Vzc21lbnRBcmVhLmFwcGVuZCh2aWV3LnJlbmRlcigpLiRlbCk7XG5cblx0XHR0aGlzLmFzc2Vzc21lbnRBcmVhQ29udGVudHMgPSB2aWV3O1xuXHR9LFxuXG5cdGlhZ29OYXZpZ2F0ZTogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0Ly8gVXBkYXRlIElhZ28ncyBzdGF0ZSB3aXRoIHRoZSByZXZpc2VkIGN1cnJlbnQgbW9kZWxcblx0XHR0aGlzLmlhZ28udXBkYXRlQ3VycmVudE1vZGVsKHRoaXMuY3VycmVudFF1ZXN0aW9uLm1vZGVsLnRvSlNPTigpKTtcblxuXHRcdC8vIEdldCByaWQgb2YgdGhlIGN1cnJlbnQgcXVlc3Rpb25cblx0XHR0aGlzLmN1cnJlbnRRdWVzdGlvbi5kZXN0cm95KCk7XG5cdFx0ZGVsZXRlIHRoaXMuY3VycmVudFF1ZXN0aW9uO1xuXG5cdFx0aWYgKGV2dC5kZXRhaWwuZGlyZWN0aW9uID09PSB0cnVlKSB7XG5cdFx0XHQvLyBJZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheS4uLlxuXHRcdFx0aWYgKHRoaXMucXVlc3Rpb25Nb2RlbHMubGVuZ3RoID09PSB0aGlzLmlhZ28uc3RhdGUuY3VycmVudFF1ZXN0aW9uICsgMSlcblx0XHRcdFx0dGhpcy5zaG93VHlwZXMoKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5sb2FkUXVlc3Rpb24odGhpcy5pYWdvLnN0YXRlLmN1cnJlbnRRdWVzdGlvbiArIDEpO1xuXHRcdH1cblx0XHRlbHNlIGlmICh0aGlzLmlhZ28uc3RhdGUuY3VycmVudFF1ZXN0aW9uID49IDApIHtcblx0XHRcdHRoaXMubG9hZFF1ZXN0aW9uKHRoaXMuaWFnby5zdGF0ZS5jdXJyZW50UXVlc3Rpb24gLSAxKTtcblx0XHR9XG5cblx0XHR0aGlzLnVwZGF0ZVRvdGFsTWFyaygpO1xuXHR9LFxuXG5cdGxhbmd1YWdlQ2hhbmdlZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5tb2RlbC5zZXQoeyBsYW5ndWFnZTogdGhpcy51aS5sYW5ndWFnZS52YWwoKSB9KTtcblxuXHRcdGlmICh0aGlzLmlhZ28uc3RhdGUpXG5cdFx0XHR0aGlzLmlhZ28ucmVkcmF3KHRoaXMubW9kZWwudG9KU09OKCkpO1xuXHR9LFxuXG5cdGZlZWRiYWNrQ2hhbmdlZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5tb2RlbC5zZXQoeyBmZWVkYmFjazogdGhpcy51aS5mZWVkYmFjay5wcm9wKFwiY2hlY2tlZFwiKSB9KTtcblxuXHRcdGlmICh0aGlzLmN1cnJlbnRRdWVzdGlvbikge1xuXHRcdFx0aWYgKHRoaXMuaWFnby5zdGF0ZSkge1xuXHRcdFx0XHQvLyBTYXZlIHRoZSBjdXJyZW50IHF1ZXN0aW9uIHN0YXRlXG5cdFx0XHRcdHRoaXMuY3VycmVudFF1ZXN0aW9uLnNhdmUodHJ1ZSwgdHJ1ZSk7XG5cblx0XHRcdFx0Ly8gUHJvcGFnYXRlIGl0IGludG8gSWFnb1xuXHRcdFx0XHR0aGlzLmlhZ28udXBkYXRlQ3VycmVudE1vZGVsKHRoaXMuY3VycmVudFF1ZXN0aW9uLm1vZGVsLnRvSlNPTigpKTtcblxuXHRcdFx0XHQvLyBBbmQgcmVkcmF3XG5cdFx0XHRcdHRoaXMuaWFnby5yZWRyYXcodGhpcy5tb2RlbC50b0pTT04oKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0UGFnZS50cmlnZ2VyKFwiY2hhbmdlOmZlZWRiYWNrXCIsIHRoaXMudWkuZmVlZGJhY2sucHJvcChcImNoZWNrZWRcIikpO1xuXG5cdFx0aWYgKHRoaXMuY3VycmVudFF1ZXN0aW9uICYmICF0aGlzLnVpLmZlZWRiYWNrLnByb3AoXCJjaGVja2VkXCIpKVxuXHRcdFx0dGhpcy5pYWdvLnJlZG9JbnN0cnVjdGlvbnMoKTtcblx0fSxcblxuXHR0b2dnbGVNZW51OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm1lbnUudG9nZ2xlKCk7XG5cdH0sXG5cblx0c2V0dXBPcHRpb25zOiBmdW5jdGlvbihxdWVzdGlvbikge1xuXHRcdHRoaXMudWkub3B0aW9ucy5yZW1vdmVDbGFzcyhcImludmlzaWJsZVwiKTtcblxuXHRcdGlmICh0aGlzLm9wdGlvbnNNZW51KVxuXHRcdFx0dGhpcy5vcHRpb25zTWVudS5kZXN0cm95KCk7XG5cblx0XHR0aGlzLm9wdGlvbnNNZW51ID0gbmV3IFNpbXBsZU1lbnUoe1xuXHRcdFx0YW5jaG9yOiB0aGlzLnVpLm9wdGlvbnMsXG5cdFx0XHRzaWRlOiBcInJpZ2h0XCIsXG5cdFx0XHRwZXJzaXN0OiB0cnVlLFxuXHRcdFx0aG9zdDogXCIjbW9kYWxzIC5tb2RhbC1jb250YWluZXJcIixcblx0XHRcdGNsaWNrUm9vdDogXCIjbW9kYWxzXCIsXG5cdFx0XHRzdHJ1Y3R1cmU6IHF1ZXN0aW9uLm1vZGVsLnF1ZXN0aW9uT3B0aW9ucyxcblx0XHR9KTtcblxuXHRcdC8vIExpc3RlbiBmb3IgbWVudSBldmVudHNcblx0XHRxdWVzdGlvbi5iaW5kRXZlbnRzKHRoaXMub3B0aW9uc01lbnUsIHF1ZXN0aW9uLm9wdGlvbkV2ZW50cyk7XG5cdH0sXG5cblx0aGlkZU9wdGlvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkub3B0aW9ucy5hZGRDbGFzcyhcImludmlzaWJsZVwiKTtcblxuXHRcdGlmICh0aGlzLm9wdGlvbnNNZW51KVxuXHRcdFx0dGhpcy5vcHRpb25zTWVudS5kZXN0cm95KCk7XG5cdH0sXG5cblx0dG9nZ2xlT3B0aW9uczogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdHRoaXMub3B0aW9uc01lbnUuc2hvdygpO1xuXHR9LFxuXG5cdHRyYW5zaXRpb25TYXZlU3VjY2VzczogZnVuY3Rpb24oZGF0YSwgcmVzcG9uc2UpIHtcblx0XHR0aGlzLm1vZGVsLmlkID0gcmVzcG9uc2UuaWQ7XG5cdFx0dGhpcy5tb2RlbC5faWQgPSByZXNwb25zZS5faWQ7XG5cdH0sXG5cblx0dHJhbnNpdGlvblNhdmVFcnJvcjogZnVuY3Rpb24obW9kZWwsIHJlc3BvbnNlKSB7XG5cdFx0dGhpcy4kZWwuZmluZChcIi5mb3JtLWNvbnRhaW5lclwiKS5hZGRDbGFzcyhcImhpZGVcIik7XG5cblx0XHR0aGlzLnNob3dFcnJvcihuZXcgRXJyb3JzLk1vZGVsKHtcblx0XHRcdHRpdGxlOiBcIkFzc2Vzc21lbnQgU2F2ZSBFcnJvclwiLFxuXHRcdFx0bWVzc2FnZTogXCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBzYXZpbmcgdGhlIGFzc2Vzc21lbnQuXCIsXG5cdFx0XHRyZXNwb25zZTogcmVzcG9uc2UsXG5cdFx0fSkpO1xuXHR9LFxuXG5cdHRyYW5zaXRpb25TYXZlQXNzZXNzbWVudDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMucXVlc3Rpb25Nb2RlbHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Ly9BdXRvIHNhdmluZyB0aGUgYXNzZXNzbWVudFxuXHRcdFx0Y29uc3QgZGF0YSA9IHRoaXMuYXNzZW1ibGVEYXRhKCk7XG5cblx0XHRcdGNvbnN0IHJlc291cmNlID0gdGhpcy53cmFwQXNSZXNvdXJjZSh0aGlzLm1vZGVsKTtcblx0XHRcdHJlc291cmNlLmF0dHJpYnV0ZXMucXVlc3Rpb25EYXRhID0gZGF0YS5hdHRyaWJ1dGVzLnF1ZXN0aW9uRGF0YTtcblx0XHRcdHJlc291cmNlLnNldCh7XG5cdFx0XHRcdG1heFNjb3JlOiBkYXRhLmF0dHJpYnV0ZXMubWF4U2NvcmUsXG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKHRoaXMuaXNNb2RlQ3JlYXRlKCkpIHtcblx0XHRcdFx0cmVzb3VyY2Uuc2V0KHtcblx0XHRcdFx0XHRfaWQ6IHRoaXMubW9kZWwuX2lkLFxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5zd2l0Y2hUb0VkaXRNb2RlKCk7XG5cblx0XHRcdHJlc291cmNlLnNhdmUocmVzb3VyY2UuYXR0cmlidXRlcywge1xuXHRcdFx0XHR3YWl0OiB0cnVlLFxuXHRcdFx0XHR2YWxpZGF0ZTogZmFsc2UsXG5cdFx0XHRcdHN1Y2Nlc3M6IHRoaXMudHJhbnNpdGlvblNhdmVTdWNjZXNzLmJpbmQodGhpcyksXG5cdFx0XHRcdGVycm9yOiB0aGlzLnRyYW5zaXRpb25TYXZlRXJyb3IuYmluZCh0aGlzKSxcblx0XHRcdH0pO1xuXG5cdFx0XHRBcHAudHJpZ2dlcihBcHAuRXZlbnRzLlJlc291cmNlQ3JlYXRlZCwgcmVzb3VyY2UpO1xuXHRcdH1cblx0fSxcblxuXHRzaG93VHlwZXM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudHJhbnNpdGlvblNhdmVBc3Nlc3NtZW50KCk7XG5cblx0XHRjb25zdCB2aWV3ID0gbmV3IFF1ZXN0aW9uVHlwZXMoeyBzaXplOiB0aGlzLnF1ZXN0aW9uTW9kZWxzLmxlbmd0aCB9KTtcblxuXHRcdHRoaXMubGlzdGVuVG8odmlldywgXCJ0eXBlXCIsIHRoaXMuY3JlYXRlUXVlc3Rpb24uYmluZCh0aGlzKSk7XG5cblx0XHR0aGlzLnNldEFzc2Vzc21lbnRBcmVhQ29udGVudHModmlldyk7XG5cblx0XHR0aGlzLnVpLmFjdGlvbnMuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkub3B0aW9ucy5hZGRDbGFzcyhcImludmlzaWJsZVwiKTtcblx0XHR0aGlzLnVpLnNsaWRlckhvc3QuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdHVwZGF0ZVNsaWRlcjogZnVuY3Rpb24oaW5kZXgpIHtcblx0XHRjb25zdCB0b3RhbCA9IHRoaXMucXVlc3Rpb25Nb2RlbHMubGVuZ3RoO1xuXHRcdGNvbnN0IGFjdHVhbEluZGV4ID0gXy5pc1VuZGVmaW5lZChpbmRleCkgPyB0b3RhbCA6IGluZGV4ICsgMTtcblxuXHRcdHRoaXMudWkucXVlc3Rpb25OdW1iZXIudGV4dChhY3R1YWxJbmRleC50b1N0cmluZygpKTtcblx0XHR0aGlzLnVpLnNsaWRlci5hdHRyKFwibWF4XCIsIHRvdGFsKS52YWwoYWN0dWFsSW5kZXgudG9TdHJpbmcoKSkucmFuZ2VzbGlkZXIoXCJ1cGRhdGVcIiwgdHJ1ZSk7XG5cdFx0dGhpcy51aS5zbGlkZXJDb3VudC50ZXh0KHRvdGFsKTtcblx0XHR0aGlzLnVpLnNsaWRlck51bS5hdHRyKFwibWF4XCIsIHRvdGFsKTtcblxuXHRcdGlmICghYWN0dWFsSW5kZXggJiYgdGhpcy51aS5zbGlkZXJOdW0udmFsKCkgPiB0b3RhbClcblx0XHRcdHRoaXMudWkuc2xpZGVyTnVtLnZhbChcIlwiKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnVpLnNsaWRlck51bS52YWwoYWN0dWFsSW5kZXgudG9TdHJpbmcoKSk7XG5cdH0sXG5cblx0dXBkYXRlVG90YWxNYXJrOiBmdW5jdGlvbigpIHtcblx0XHRsZXQgdG90YWxNYXJrcyA9IDA7XG5cdFx0Y29uc3QgdG90YWwgPSB0aGlzLnF1ZXN0aW9uTW9kZWxzLmxlbmd0aCArIDE7XG5cblx0XHRjb25zdCBwYWdlID0gdGhpcy5jdXJyZW50UXVlc3Rpb24gPyAkKFwiI3BhZ2UtaW5wdXRcIikudmFsKCkgOiB0b3RhbDtcblx0XHR0aGlzLnVpLnF1ZXN0aW9uTnVtYmVyLnRleHQocGFnZSk7XG5cblx0XHRmb3IobGV0IGkgPSB0aGlzLnF1ZXN0aW9uTW9kZWxzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKVxuXHRcdFx0dG90YWxNYXJrcyArPSB0aGlzLnF1ZXN0aW9uTW9kZWxzW2ldLmF0dHJpYnV0ZXMucG90ZW50aWFsU2NvcmU7XG5cblx0XHR0aGlzLnVpLnRvdGFsTWFyay50ZXh0KHRvdGFsTWFya3MpO1xuXG5cdFx0bGV0IG1hcmsgPSAwO1xuXG5cdFx0aWYgKHRoaXMuY3VycmVudFF1ZXN0aW9uKVxuXHRcdFx0bWFyayA9IHRoaXMuY3VycmVudFF1ZXN0aW9uLm1vZGVsLmF0dHJpYnV0ZXMucG90ZW50aWFsU2NvcmUgPiAwID8gdGhpcy5jdXJyZW50UXVlc3Rpb24ubW9kZWwuYXR0cmlidXRlcy5wb3RlbnRpYWxTY29yZSA6IDA7XG5cblx0XHRpZiAobWFyayA9PT0gMClcblx0XHRcdG1hcmsgPSAkKFwiLmNoZWNrYWJsZS5mYS1jaGVja1wiKS5sZW5ndGg7XG5cblx0XHRpZiAobWFyayA9PT0gMClcblx0XHRcdG1hcmsgPSAkKFwiLnF1ZXN0aW9uLWNvbnRlbnQgaW5wdXRbdHlwZT0nbnVtYmVyJ11cIikudmFsKCk7XG5cblx0XHRpZiAobWFyayA9PT0gMCB8fCBtYXJrID09PSB1bmRlZmluZWQpXG5cdFx0XHRtYXJrID0gJChcIi5tYXRjaC1vcHRpb25zLmxlZnRcIikubGVuZ3RoO1xuXG5cdFx0bWFyayA9IG1hcmsgPT09IHVuZGVmaW5lZCA/IDAgOiBtYXJrO1xuXG5cdFx0aWYgKG1hcmsgPT09IDApIHtcblx0XHRcdHRoaXMudWkucXVlc3Rpb25NYXJrLnBhcmVudCgpLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHRoaXMudWkucXVlc3Rpb25OdW1iZXIucGFyZW50KCkuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMudWkucXVlc3Rpb25NYXJrLnBhcmVudCgpLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHRoaXMudWkucXVlc3Rpb25OdW1iZXIucGFyZW50KCkucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblx0XHR0aGlzLnVpLnF1ZXN0aW9uTWFyay50ZXh0KG1hcmspO1xuXHR9LFxuXG5cdGNyZWF0ZVF1ZXN0aW9uOiBmdW5jdGlvbih0eXBlLCBxdWVzdGlvbkluZGV4KSB7XG5cdFx0aWYgKHRoaXMuY3VycmVudFF1ZXN0aW9uKSB7XG5cdFx0XHR0aGlzLmN1cnJlbnRRdWVzdGlvbi5kZXN0cm95KCk7XG5cdFx0XHR0aGlzLmN1cnJlbnRRdWVzdGlvbiA9IG51bGw7XG5cdFx0fVxuXG5cdFx0bGV0IHF1ZXN0aW9uO1xuXG5cdFx0aWYgKHR5cGUgPT09IFwiXCIpIHtcblx0XHRcdC8vIEJsYW5rIG1lYW5zIHdlIGNhbmNlbGxlZCwgc2hvdyB0aGUgbGF0ZXN0IHF1ZXN0aW9uIGluc3RlYWRcblx0XHRcdGNvbnN0IG1vZGVsID0gXy5sYXN0KHRoaXMucXVlc3Rpb25Nb2RlbHMpO1xuXG5cdFx0XHRpZiAoIW1vZGVsKVxuXHRcdFx0XHRyZXR1cm4gdGhpcy5zaG93VHlwZXMoKTtcblxuXHRcdFx0cXVlc3Rpb24gPSBuZXcgUXVlc3Rpb25zW21vZGVsLmdldChcInR5cGVcIikgKyAobW9kZWwuaGFzKFwic3VidHlwZVwiKSA/IFwiLlwiICsgbW9kZWwuZ2V0KFwic3VidHlwZVwiKSA6IFwiXCIpXSh7XG5cdFx0XHRcdGFzc2Vzc21lbnQ6IHRoaXMubW9kZWwsXG5cdFx0XHRcdHF1ZXN0aW9uOiBtb2RlbCxcblx0XHRcdFx0cHJldmlld01vZGU6IHRoaXMucHJldmlld01vZGUsXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRxdWVzdGlvbiA9IG5ldyBRdWVzdGlvbnNbdHlwZV0oe1xuXHRcdFx0XHRpZDogdGhpcy5pZCsrLFxuXHRcdFx0XHRhc3Nlc3NtZW50OiB0aGlzLm1vZGVsLFxuXHRcdFx0XHRwcmV2aWV3TW9kZTogdGhpcy5wcmV2aWV3TW9kZSxcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBBZGQgdGhlIG5ldyBtb2RlbCBhcyBhIHZhbGlkIHF1ZXN0aW9uIHRvIHRoZSBtYXN0ZXIgYXJyYXlcblx0XHRcdHRoaXMucXVlc3Rpb25Nb2RlbHMucHVzaChxdWVzdGlvbi5tb2RlbCk7XG5cdFx0fVxuXG5cdFx0Ly8gTGlzdGVuIGZvciBuYXZpZ2F0aW9uIGV2ZW50c1xuXHRcdHRoaXMubGlzdGVuVG8ocXVlc3Rpb24sIFwiaWFnbzpuYXZpZ2F0ZVwiLCB0aGlzLmlhZ29OYXZpZ2F0ZS5iaW5kKHRoaXMpKTtcblxuXHRcdHRoaXMuc2V0QXNzZXNzbWVudEFyZWFDb250ZW50cyhxdWVzdGlvbik7XG5cblx0XHQvLyBEb2VzIHRoaXMgcXVlc3Rpb24gdHlwZSBoYXZlIG9wdGlvbnMgd2UgbmVlZCB0byBzaG93P1xuXHRcdGlmIChxdWVzdGlvbi5tb2RlbC5xdWVzdGlvbk9wdGlvbnMpXG5cdFx0XHR0aGlzLnNldHVwT3B0aW9ucyhxdWVzdGlvbik7XG5cblx0XHRpZiAoIXRoaXMuaWFnby5zdGF0ZSkge1xuXHRcdFx0Y29uc3QgZGF0YSA9IHRoaXMubW9kZWwudG9KU09OKCk7XG5cblx0XHRcdGRhdGEucXVlc3Rpb25EYXRhID0gXy5tYXAodGhpcy5xdWVzdGlvbk1vZGVscywgcXVlc3Rpb25Nb2RlbCA9PiBxdWVzdGlvbk1vZGVsLnRvSlNPTigpKTtcblx0XHRcdHRoaXMuaWFnby5zdGFydChkYXRhLCB7IHNldHRpbmdzOiB7IHNlcnZlclNhdmU6IGZhbHNlLCByZXF1aXJlQ29kZTogZmFsc2UgfSB9LCB7XG5cdFx0XHRcdGN1cnJlbnRRdWVzdGlvbjogcXVlc3Rpb25JbmRleCA9PT0gdW5kZWZpbmVkID8gdGhpcy5xdWVzdGlvbk1vZGVscy5sZW5ndGggLSAxIDogcXVlc3Rpb25JbmRleCxcblx0XHRcdFx0ZmVlZGJhY2tNb2RlOiB0aGlzLm1vZGVsLmdldChcImZlZWRiYWNrXCIpLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKHR5cGUpIHtcblx0XHRcdHRoaXMuaWFnby5hZGRRdWVzdGlvbihxdWVzdGlvbi5tb2RlbC50b0pTT04oKSk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5pYWdvLmRyYXcodGhpcy5xdWVzdGlvbk1vZGVscy5sZW5ndGggLSAxKTtcblx0XHR9XG5cblx0XHR0aGlzLnVpLmFjdGlvbnMucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkuc2xpZGVyLmF0dHIoXCJtYXhcIiwgdGhpcy5xdWVzdGlvbk1vZGVscy5sZW5ndGgpLnZhbCh0aGlzLnF1ZXN0aW9uTW9kZWxzLmxlbmd0aCkucmFuZ2VzbGlkZXIoXCJ1cGRhdGVcIiwgdHJ1ZSk7XG5cdFx0dGhpcy51aS5zbGlkZXJOdW0uYXR0cihcIm1heFwiLCB0aGlzLnF1ZXN0aW9uTW9kZWxzLmxlbmd0aCkudmFsKHRoaXMucXVlc3Rpb25Nb2RlbHMubGVuZ3RoKTtcblx0XHR0aGlzLnVpLnNsaWRlckhvc3QucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0dGhpcy5jdXJyZW50UXVlc3Rpb24gPSBxdWVzdGlvbjtcblxuXHRcdGlmICh0eXBlICE9PSBcIlwiKVxuXHRcdFx0UGFnZS50cmlnZ2VyKFwicXVlc3Rpb25zOmFkZGVkXCIsIHRoaXMucXVlc3Rpb25Nb2RlbHMpO1xuXG5cdFx0dGhpcy51cGRhdGVTbGlkZXIoKTtcblx0XHR0aGlzLnVwZGF0ZVRvdGFsTWFyaygpO1xuXHR9LFxuXG5cdGxvYWRRdWVzdGlvbjogZnVuY3Rpb24oaW5kZXgpIHtcblx0XHRpZiAodGhpcy5jdXJyZW50UXVlc3Rpb24pIHtcblx0XHRcdHRoaXMuY3VycmVudFF1ZXN0aW9uLmRlc3Ryb3koKTtcblx0XHRcdHRoaXMuY3VycmVudFF1ZXN0aW9uID0gbnVsbDtcblx0XHR9XG5cblx0XHRjb25zdCBtb2RlbCA9IHRoaXMucXVlc3Rpb25Nb2RlbHNbaW5kZXhdO1xuXHRcdGNvbnN0IHF1ZXN0aW9uID0gbmV3IFF1ZXN0aW9uc1ttb2RlbC5nZXQoXCJ0eXBlXCIpICsgKG1vZGVsLmhhcyhcInN1YnR5cGVcIikgPyBcIi5cIiArIG1vZGVsLmdldChcInN1YnR5cGVcIikgOiBcIlwiKV0oe1xuXHRcdFx0YXNzZXNzbWVudDogdGhpcy5tb2RlbCxcblx0XHRcdHF1ZXN0aW9uOiBtb2RlbCxcblx0XHRcdHByZXZpZXdNb2RlOiB0aGlzLnByZXZpZXdNb2RlLFxuXHRcdH0pO1xuXG5cdFx0Ly8gTGlzdGVuIGZvciBuYXZpZ2F0aW9uIGV2ZW50c1xuXHRcdHRoaXMubGlzdGVuVG8ocXVlc3Rpb24sIFwiaWFnbzpuYXZpZ2F0ZVwiLCB0aGlzLmlhZ29OYXZpZ2F0ZS5iaW5kKHRoaXMpKTtcblxuXHRcdHRoaXMuc2V0QXNzZXNzbWVudEFyZWFDb250ZW50cyhxdWVzdGlvbik7XG5cblx0XHQvLyBEb2VzIHRoaXMgcXVlc3Rpb24gdHlwZSBoYXZlIG9wdGlvbnMgd2UgbmVlZCB0byBzaG93P1xuXHRcdGlmIChxdWVzdGlvbi5tb2RlbC5xdWVzdGlvbk9wdGlvbnMpXG5cdFx0XHR0aGlzLnNldHVwT3B0aW9ucyhxdWVzdGlvbik7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5oaWRlT3B0aW9ucygpO1xuXG5cdFx0dGhpcy5pYWdvLmRyYXcoaW5kZXgpO1xuXG5cdFx0dGhpcy51aS5hY3Rpb25zLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLnNsaWRlci52YWwoaW5kZXgpLnJhbmdlc2xpZGVyKFwidXBkYXRlXCIsIHRydWUpO1xuXHRcdHRoaXMudWkuc2xpZGVyTnVtLnZhbChpbmRleCk7XG5cdFx0dGhpcy51aS5zbGlkZXJIb3N0LnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblxuXHRcdHRoaXMuY3VycmVudFF1ZXN0aW9uID0gcXVlc3Rpb247XG5cblx0XHR0aGlzLnVwZGF0ZVNsaWRlcihpbmRleCk7XG5cdH0sXG5cblx0ZGVsZXRlUXVlc3Rpb246IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGluZGV4ID0gdGhpcy5pYWdvLnN0YXRlLmN1cnJlbnRRdWVzdGlvbjtcblxuXHRcdGlmICh0aGlzLmN1cnJlbnRRdWVzdGlvbikge1xuXHRcdFx0dGhpcy5jdXJyZW50UXVlc3Rpb24uZGVzdHJveSgpO1xuXHRcdFx0dGhpcy5jdXJyZW50UXVlc3Rpb24gPSBudWxsO1xuXHRcdH1cblxuXHRcdHRoaXMucXVlc3Rpb25Nb2RlbHMuc3BsaWNlKGluZGV4LCAxKTtcblxuXHRcdC8vYWRqdXN0IHRoZSBpZHNcblx0XHQvL2ZvcihsZXQgaSA9IDA7IGkgPCB0aGlzLnF1ZXN0aW9uTW9kZWxzLmxlbmd0aDsgaSsrKSB7XG5cdFx0Ly9cdHRoaXMucXVlc3Rpb25Nb2RlbHNbaV0uaWQgPSBpICsgMjtcblx0XHQvL1x0dGhpcy5xdWVzdGlvbk1vZGVsc1tpXS5hdHRyaWJ1dGVzLmlkID0gaSArIDI7XG5cdFx0Ly99XG5cdFx0Ly90aGlzLmlkID0gdGhpcy5xdWVzdGlvbk1vZGVscy5sZW5ndGggPiAwID8gKHRoaXMucXVlc3Rpb25Nb2RlbHNbdGhpcy5xdWVzdGlvbk1vZGVscy5sZW5ndGggLSAxXS5pZCArIDEpIDogMTtcblxuXHRcdHRoaXMuaWFnby5yZW1vdmVRdWVzdGlvbigpO1xuXG5cdFx0UGFnZS50cmlnZ2VyKFwicXVlc3Rpb25zOnJlbW92ZWRcIiwgdGhpcy5xdWVzdGlvbk1vZGVscyk7XG5cblx0XHRpZiAodGhpcy5xdWVzdGlvbk1vZGVscy5sZW5ndGggPT09IDApXG5cdFx0XHR0aGlzLnNob3dUeXBlcygpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMubG9hZFF1ZXN0aW9uKE1hdGgubWluKHRoaXMucXVlc3Rpb25Nb2RlbHMubGVuZ3RoIC0gMSwgaW5kZXgpKTtcblxuXHRcdHRoaXMudXBkYXRlVG90YWxNYXJrKCk7XG5cdH0sXG5cblx0Y2hhbmdlUXVlc3Rpb25OdW06IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGluZGV4ID0gcGFyc2VJbnQodGhpcy51aS5zbGlkZXJOdW0udmFsKCksIDEwKTtcblxuXHRcdGlmICh0aGlzLnF1ZXN0aW9uTW9kZWxzLmxlbmd0aCA8IGluZGV4IHx8IGluZGV4IC0gMSA9PT0gdGhpcy5pYWdvLnN0YXRlLmN1cnJlbnRRdWVzdGlvbilcblx0XHRcdHJldHVybjtcblxuXHRcdGlmICghdGhpcy5jdXJyZW50UXVlc3Rpb24uc2F2ZSgpKSB7XG5cdFx0XHR0aGlzLnVpLnNsaWRlck51bS52YWwodGhpcy5pYWdvLnN0YXRlLmN1cnJlbnRRdWVzdGlvbiArIDEpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuaWFnby51cGRhdGVDdXJyZW50TW9kZWwodGhpcy5jdXJyZW50UXVlc3Rpb24ubW9kZWwudG9KU09OKCkpO1xuXHRcdHRoaXMubG9hZFF1ZXN0aW9uKGluZGV4IC0gMSk7XG5cdH0sXG5cblx0Y2hhbmdlUXVlc3Rpb25TbGlkZTogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgaW5kZXggPSBwYXJzZUludCh0aGlzLnVpLnNsaWRlci52YWwoKSwgMTApO1xuXG5cdFx0aWYgKHRoaXMucXVlc3Rpb25Nb2RlbHMubGVuZ3RoIDwgaW5kZXggfHwgaW5kZXggLSAxID09PSB0aGlzLmlhZ28uc3RhdGUuY3VycmVudFF1ZXN0aW9uIHx8ICF0aGlzLmN1cnJlbnRRdWVzdGlvbilcblx0XHRcdHJldHVybjtcblxuXHRcdGlmICghdGhpcy5jdXJyZW50UXVlc3Rpb24uc2F2ZSgpKSB7XG5cdFx0XHR0aGlzLnVpLnNsaWRlci52YWwodGhpcy5pYWdvLnN0YXRlLmN1cnJlbnRRdWVzdGlvbiArIDEpLnJhbmdlc2xpZGVyKFwidXBkYXRlXCIsIHRydWUpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuaWFnby51cGRhdGVDdXJyZW50TW9kZWwodGhpcy5jdXJyZW50UXVlc3Rpb24ubW9kZWwudG9KU09OKCkpO1xuXHRcdHRoaXMubG9hZFF1ZXN0aW9uKGluZGV4IC0gMSk7XG5cdH0sXG5cblx0YmVmb3JlVmFsaWRhdGlvbkZhaWw6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLm1vZGVsLnZhbGlkYXRpb25FcnJvci5sYW5ndWFnZSB8fCB0aGlzLm1vZGVsLnZhbGlkYXRpb25FcnJvci5zdWJqZWN0IHx8XG5cdFx0XHR0aGlzLm1vZGVsLnZhbGlkYXRpb25FcnJvci5zdHVkeVllYXIgfHwgdGhpcy5tb2RlbC52YWxpZGF0aW9uRXJyb3IudGl0bGUpIHtcblx0XHRcdGlmICh0aGlzLm1lbnUpXG5cdFx0XHRcdHRoaXMubWVudS5vcGVuKCk7XG5cdFx0fVxuXHR9LFxuXG5cdG11c3RDbG9uZTogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gSXMgdGhpcyBhc3Nlc3NtZW50IGFscmVhZHkgc2F2ZWQgYW5kIGluIHVzZT9cblx0XHRyZXR1cm4gIXRoaXMubW9kZWwuaXNOZXcoKSAmJiB0aGlzLm1vZGVsLmdldChcInVzZXNcIikgPiAwO1xuXHR9LFxuXG5cdGNvbmZpcm1BY2NlcHQ6IGZ1bmN0aW9uKCkge1xuXHRcdGxldCBtZXNzYWdlID0gbnVsbDtcblxuXHRcdGlmICh0aGlzLmN1cnJlbnRRdWVzdGlvbiAmJiAhdGhpcy5jdXJyZW50UXVlc3Rpb24uc2F2ZSgpKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0aWYgKHRoaXMubXVzdENsb25lKCkpIHtcblx0XHRcdG1lc3NhZ2UgPSBcIlRoaXMgYXNzZXNzbWVudCBpcyBiZWluZyB1c2VkIGluIFwiICsgdGhpcy5tb2RlbC5nZXQoXCJ1c2VzXCIpICtcblx0XHRcdFx0XCIgb3RoZXIgcGxhY2VcIiArICh0aGlzLm1vZGVsLmdldChcInVzZXNcIikgPiAxID8gXCJzXCIgOiBcIlwiKSArXG5cdFx0XHRcdFwiIHRoYXQgY291bGQgZ2VuZXJhdGUgbWFya3MuIFRvIGVuc3VyZSB0aG9zZSBtYXJrcyBhcmUgcHJlc2VydmVkLCBlZGl0aW5nIHRoaXMgYXNzZXNzbWVudCB3aWxsIGNhdXNlIGl0IHRvIGJlIGNsb25lZCBpbnRvIGEgbmV3IGFzc2Vzc21lbnQuXCI7XG5cblx0XHRcdHRoaXMudWkudGl0bGUudmFsKHRoaXMubW9kZWwuZ2V0KFwidGl0bGVcIikpO1xuXHRcdH1cblxuXHRcdHJldHVybiBtZXNzYWdlO1xuXHR9LFxuXG5cdHNhdmU6IGZ1bmN0aW9uKGFjdGlvbiwgZGF0YSkge1xuXHRcdC8vIE1vZGlmeSB0aGUgbW9kYWwgbGF5b3V0XG5cdFx0dGhpcy5zZXRTdGF0dXNCdXN5KFwic2F2aW5nXCIpO1xuXG5cdFx0aWYgKGRhdGEuYXR0cmlidXRlcy5faWQgPT09IHVuZGVmaW5lZClcblx0XHRcdGRhdGEuYXR0cmlidXRlcy5faWQgPSB0aGlzLm1vZGVsLl9pZDtcblxuXHRcdC8vIElmIGZpbGVzIHdlcmUgc3BlY2lmaWVkLi4uXG5cdFx0aWYgKGRhdGEuZmlsZXMpIHtcblx0XHRcdC8vIC4uLnRoZW4gZW1wbG95IHRoZSBtb2RlbCdzIGJpbmFyeSBzYXZlIG1ldGhvZC4uLlxuXG5cdFx0XHQvLyBTYXZlIHRoZSBtb2RlbFxuXHRcdFx0dGhpcy54aHIgPSB0aGlzLm1vZGVsLmJpbmFyeVNhdmUobnVsbCwge1xuXHRcdFx0XHR3YWl0OiB0cnVlLFxuXHRcdFx0XHRkYXRhOiBkYXRhLmF0dHJpYnV0ZXMsXG5cdFx0XHRcdHZhbGlkYXRlOiBmYWxzZSxcblx0XHRcdFx0c3VjY2VzczogdGhpcy5vblNhdmVTdWNjZXNzLmJpbmQodGhpcywgYWN0aW9uKSxcblx0XHRcdFx0ZXJyb3I6IHRoaXMub25TYXZlRXJyb3IuYmluZCh0aGlzKSxcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdC8vIC4uLm90aGVyd2lzZSwgZW1wbG95IHRoZSBtb2RlbCdzIHN0YW5kYXJkIHNhdmUgbWV0aG9kXG5cblx0XHRcdC8vIFNhdmUgdGhlIG1vZGVsXG5cdFx0XHR0aGlzLnhociA9IHRoaXMubW9kZWwuc2F2ZShkYXRhLmF0dHJpYnV0ZXMsIHtcblx0XHRcdFx0d2FpdDogdHJ1ZSxcblx0XHRcdFx0dmFsaWRhdGU6IGZhbHNlLFxuXHRcdFx0XHRzdWNjZXNzOiB0aGlzLm9uU2F2ZVN1Y2Nlc3MuYmluZCh0aGlzLCBhY3Rpb24pLFxuXHRcdFx0XHRlcnJvcjogdGhpcy5vblNhdmVFcnJvci5iaW5kKHRoaXMpLFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5pbml0aWFsaXplUHJvZ3Jlc3NCYXIoKTtcblx0fSxcblxuXHRvblNhdmVFcnJvcjogZnVuY3Rpb24obW9kZWwsIGUpIHtcblx0XHR0aGlzLnNldFN0YXR1c1JlYWR5KCk7XG5cdFx0dGhpcy4kZWwuZmluZChcIi5mb3JtLWNvbnRhaW5lclwiKS5hZGRDbGFzcyhcImhpZGVcIik7XG5cblx0XHR0aGlzLnNob3dFcnJvcihuZXcgRXJyb3JzLk1vZGVsKHtcblx0XHRcdHRpdGxlOiBcIkFzc2Vzc21lbnQgU2F2ZSBFcnJvclwiLFxuXHRcdFx0bWVzc2FnZTogXCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBzYXZpbmcgdGhlIGFzc2Vzc21lbnQuXCIsXG5cdFx0XHRyZXNwb25zZTogZSxcblx0XHR9KSk7XG5cdH0sXG5cblx0YmVmb3JlU2F2ZTogZnVuY3Rpb24oKSB7XG5cdFx0bGV0IGNvbnRpbnVlU2F2ZSA9IHRydWU7XG5cblx0XHQvLyBTYXZlIHRoZSBjdXJyZW50IHF1ZXN0aW9uLCBpZiBwcmVzZW50ICh3aGljaCBtaWdodCBmYWlsKVxuXHRcdGlmICh0aGlzLmN1cnJlbnRRdWVzdGlvbiAmJiAhdGhpcy5jdXJyZW50UXVlc3Rpb24uc2F2ZSgpKVxuXHRcdFx0Y29udGludWVTYXZlID0gZmFsc2U7XG5cdFx0Ly8gVG8gY2FsY3VsYXRlIHRoZSBmaW5hbCBtYXJrXG5cdFx0ZWxzZSBpZiAodGhpcy5jdXJyZW50UXVlc3Rpb24pXG5cdFx0XHR0aGlzLmlhZ28udXBkYXRlQ3VycmVudE1vZGVsKHRoaXMuY3VycmVudFF1ZXN0aW9uLm1vZGVsLnRvSlNPTigpKTtcblxuXHRcdHJldHVybiBjb250aW51ZVNhdmU7XG5cdH0sXG5cblx0YXNzZW1ibGVEYXRhOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBkYXRhID0ge307XG5cblx0XHRkYXRhLmF0dHJpYnV0ZXMgPSB7XG5cdFx0XHRkZXNjcmlwdGlvbjogdGhpcy51aS5kZXNjcmlwdGlvbi52YWwoKSxcblx0XHRcdGxhbmd1YWdlOiB0aGlzLnVpLmxhbmd1YWdlLnZhbCgpLFxuXHRcdFx0bWF4U2NvcmU6IHRoaXMuaWFnby5nZXRNYXhTY29yZSgpLFxuXHRcdFx0cXVlc3Rpb25EYXRhOiBfLm1hcCh0aGlzLnF1ZXN0aW9uTW9kZWxzLCBtb2RlbCA9PiBtb2RlbC50b0pTT04oKSksXG5cdFx0XHRzdHVkeVllYXI6IHRoaXMudWkuc3R1ZHlZZWFyLnZhbCgpLFxuXHRcdFx0c3ViamVjdDogdGhpcy51aS5zdWJqZWN0LnZhbCgpLFxuXHRcdFx0dGl0bGU6IHRoaXMudWkudGl0bGUudmFsKCksXG5cdFx0XHR1cGRhdGVkOiB0aGlzLm11c3RDbG9uZSgpID8gbnVsbCA6IHVuZGVmaW5lZCxcblx0XHRcdF9pZDogdGhpcy5tb2RlbC5pZCxcblx0XHR9O1xuXG5cdFx0Ly8gSWYgdGhpcyBhc3Nlc3NtZW50IG11c3QgYmUgY2xvbmVkLCB0aGVuIGl0IHdpbGwgYmUgY2xvbmVkIG9uIHRoZSBzZXJ2ZXIuXG5cdFx0Ly8gV2Ugd29uJ3Qga25vdyB3aGF0IHRoZSBuZXcgbW9kZWwgaXMgc28gd2UgbXVzdCBtYWtlIGEgbm90ZSBvZiB0aGUgZmFjdFxuXHRcdC8vIHRoYXQgY2xvbmluZyB3YXMgbmVlZGVkLlxuXHRcdHRoaXMuV2FzQ2xvbmVkID0gdGhpcy5tdXN0Q2xvbmUoKTtcblxuXHRcdHJldHVybiBkYXRhO1xuXHR9LFxuXG5cdGNvbmZpcm1DYW5jZWw6IGZ1bmN0aW9uKCkge1xuXHRcdGxldCBtZXNzYWdlID0gbnVsbDtcblxuXHRcdGlmICgodGhpcy5tb2RlbC5pc05ldygpIHx8IHNldHRpbmdzLnJlc291cmNlRWRpdGluZyAmJiAhdGhpcy5tb2RlbC5pc05ldygpKSAmJiB0aGlzLmJhc2lzICYmIHRoaXMuYmFzaXMucXVlc3Rpb25Nb2RlbHMubGVuZ3RoKSB7XG5cdFx0XHRtZXNzYWdlID0gXCJJZiB5b3UgY2FuY2VsLCB0aGVuIFwiICsgdGhpcy5iYXNpcy5xdWVzdGlvbk1vZGVscy5sZW5ndGggKyBcIiBxdWVzdGlvblwiICtcblx0XHRcdFx0KHRoaXMuYmFzaXMucXVlc3Rpb25Nb2RlbHMubGVuZ3RoID09PSAxID8gXCJcIiA6IFwic1wiKSArIFwiIHdpbGwgbm90IGJlIHNhdmVkLlwiO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmlzTW9kZUNyZWF0ZSgpKSB7XG5cdFx0XHQvL0RlbGV0ZSB0aGUgYXNzZXNzbWVudCBzZXJ2ZXIgc2lkZVxuXHRcdFx0Y29uc3QgcmVzb3VyY2UgPSBuZXcgQXNzZXNzbWVudCh0aGlzLm1vZGVsKTtcblx0XHRcdHJlc291cmNlLmRlc3Ryb3koe1xuXHRcdFx0XHR3YWl0OiB0cnVlLFxuXHRcdFx0XHRkYXRhOiB7IGFuZEF0dGFjaG1lbnRzOiB0cnVlIH0sXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWVzc2FnZTtcblx0fSxcblxuXHR3cmFwQXNSZXNvdXJjZTogZnVuY3Rpb24oYXNzZXNzbWVudE1vZGVsKSB7XG5cdFx0YXNzZXNzbWVudE1vZGVsLnN1YmplY3QgPSAxMjtcblx0XHRhc3Nlc3NtZW50TW9kZWwudW5zZXQoXCJxdWVzdGlvbkRhdGFcIik7XG5cdFx0Y29uc3QgcmVzb3VyY2UgPSBuZXcgQXNzZXNzbWVudChhc3Nlc3NtZW50TW9kZWwudG9KU09OKCkpO1xuXG5cdFx0cmVzb3VyY2Uuc2V0KHtcblx0XHRcdF9pZDogYXNzZXNzbWVudE1vZGVsLmdldChcIl9pZFwiKSxcblx0XHRcdGNhdGVnb3J5OiBcImFzc2Vzc21lbnRcIixcblx0XHRcdGNyZWF0ZWQ6IG1vbWVudCgpLnVuaXgoKSxcblx0XHRcdHRpdGxlOiBhc3Nlc3NtZW50TW9kZWwuZ2V0KFwidGl0bGVcIiksXG5cdFx0XHR1cGRhdGVkOiBhc3Nlc3NtZW50TW9kZWwuaGFzKFwidXBkYXRlZFwiKSA/IGFzc2Vzc21lbnRNb2RlbC5nZXQoXCJ1cGRhdGVkXCIpIDogdW5kZWZpbmVkLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy51aS50aXRsZS52YWwoYXNzZXNzbWVudE1vZGVsLmdldChcInRpdGxlXCIpKTtcblxuXHRcdHJldHVybiByZXNvdXJjZTtcblx0fSxcblxuXHRvbkFzc2Vzc21lbnRDcmVhdGVkOiBmdW5jdGlvbihyZXN1bHQpIHtcblx0XHRBcHAudHJpZ2dlcihBcHAuRXZlbnRzLlJlc291cmNlQ3JlYXRlZCwgdGhpcy53cmFwQXNSZXNvdXJjZShyZXN1bHQubW9kZWwpKTtcblx0fSxcblxuXHRvbkFzc2Vzc21lbnRVcGRhdGVkOiBmdW5jdGlvbihyZXN1bHQpIHtcblx0XHRBcHAudHJpZ2dlcih0aGlzLldhc0Nsb25lZCA/IEFwcC5FdmVudHMuUmVzb3VyY2VDcmVhdGVkIDogQXBwLkV2ZW50cy5SZXNvdXJjZVVwZGF0ZWQsXG5cdFx0XHR0aGlzLndyYXBBc1Jlc291cmNlKHJlc3VsdC5tb2RlbCkpO1xuXHR9LFxuXG5cdG9uQ3JlYXRlQW5vdGhlcjogZnVuY3Rpb24ocmVzdWx0KSB7XG5cdFx0dGhpcy5vbkFzc2Vzc21lbnRDcmVhdGVkKHJlc3VsdCk7XG5cblx0XHRyZXR1cm4gbmV3IEFzc2Vzc21lbnQoe1xuXHRcdFx0bGFuZ3VhZ2U6IHJlc3VsdC5tb2RlbC5nZXQoXCJsYW5ndWFnZVwiKSxcblx0XHRcdHN0dWR5WWVhcjogcmVzdWx0Lm1vZGVsLmdldChcInN0dWR5WWVhclwiKSxcblx0XHRcdHN1YmplY3Q6IHJlc3VsdC5tb2RlbC5nZXQoXCJzdWJqZWN0XCIpLFxuXHRcdFx0c3ViamVjdF9uYW1lOiByZXN1bHQubW9kZWwuZ2V0KFwic3ViamVjdF9uYW1lXCIpLFxuXHRcdH0pO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLm9wdGlvbnNNZW51KVxuXHRcdFx0cmV0dXJuO1xuXHRcdHRoaXMub3B0aW9uc01lbnUuZGVzdHJveSgpO1xuXHRcdHRoaXMub3B0aW9uc01lbnUgPSBudWxsO1xuXHR9LFxufSk7XG5cbmNvbnN0IE11bHRpUXVlc3Rpb25zID0ge1xuXHRoZWFkaW5nSW1hZ2VDbGljazogZnVuY3Rpb24oZSkge1xuXHRcdGlmIChlICYmICQoZS5jdXJyZW50VGFyZ2V0KS5oYXNDbGFzcyhcImltYWdlQ2hvb3NlclwiKSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuaGVhZGluZ0ltYWdlID0gSW1hZ2VDaG9vc2VyLmNyZWF0ZSgkKFwiLmltYWdlLXBsYWNlaG9sZGVyXCIsIHRoaXMuZWwpLCB7XG5cdFx0XHR0cmFuc2NvZGU6IHRydWUsXG5cdFx0XHRqcGVnOiB0cnVlLFxuXHRcdFx0bWF4SGVpZ2h0OiAyNTAsXG5cdFx0XHRtYXhXaWR0aDogMzAwLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy51aS5oZWFkaW5nSW1hZ2VEZWwucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0dGhpcy5tb2RlbC5zZXQoeyBleHBlY3RRdWVzdGlvbkltYWdlOiB0cnVlIH0pO1xuXHR9LFxuXG5cdGRlbGV0ZUhlYWRpbmdJbWFnZTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuaGVhZGluZ0ltYWdlKSB7XG5cdFx0XHR0aGlzLmhlYWRpbmdJbWFnZS5kZXN0cm95KCk7XG5cdFx0XHR0aGlzLmhlYWRpbmdJbWFnZSA9IG51bGw7XG5cdFx0fVxuXG5cdFx0JChcIi5pbWFnZS1wbGFjZWhvbGRlclwiLCB0aGlzLmVsKS5yZXBsYWNlV2l0aCgnPGRpdiBjbGFzcz1cImltYWdlLXBsYWNlaG9sZGVyXCI+Q2xpY2sgdG8gYWRkIGFuIG9wdGlvbmFsIGltYWdlIHRvIHRoZSB0aXRsZTwvZGl2PicpO1xuXHRcdHRoaXMudWkuaGVhZGluZ0ltYWdlRGVsLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLm1vZGVsLnNldCh7IGV4cGVjdFF1ZXN0aW9uSW1hZ2U6IGZhbHNlIH0pO1xuXHR9LFxuXG5cdHBhc3RlZDogZnVuY3Rpb24oZSkge1xuXHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0aWYgKCFlLm9yaWdpbmFsRXZlbnQuY2xpcGJvYXJkRGF0YSlcblx0XHRcdHJldHVybjtcblxuXHRcdCQoZS5jdXJyZW50VGFyZ2V0KS50ZXh0KGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhLmdldERhdGEoXCJ0ZXh0L3BsYWluXCIpKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5idXMuZ2V0KDApLmFkZEV2ZW50TGlzdGVuZXIoXCJpYWdvOmxvYWRlZFwiLCB0aGlzLmxvYWRlZCk7XG5cdFx0dGhpcy51aS5idXMuZ2V0KDApLmFkZEV2ZW50TGlzdGVuZXIoXCJpYWdvOm5hdmlnYXRlXCIsIHRoaXMubmF2aWdhdGUpO1xuXG5cdFx0dGhpcy51aS5mZWVkYmFjay5hdHRyKFwiY29udGVudGVkaXRhYmxlXCIsIHRoaXMuYXNzZXNzbWVudC5nZXQoXCJmZWVkYmFja1wiKSk7XG5cdFx0dGhpcy5tb2RlbC5mZWVkYmFjayA9IHRoaXMuYXNzZXNzbWVudC5nZXQoXCJmZWVkYmFja1wiKTtcblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudHJpZ2dlcihcImRlc3Ryb3llZFwiLCB0aGlzLm1vZGVsKTtcblxuXHRcdF8uZWFjaCh0aGlzLnF1ZXN0aW9ucywgZWwgPT4gZWwuZGVzdHJveSgpKTtcblxuXHRcdHRoaXMudWkuYnVzLmdldCgwKS5yZW1vdmVFdmVudExpc3RlbmVyKFwiaWFnbzpsb2FkZWRcIiwgdGhpcy5sb2FkZWQpO1xuXHRcdHRoaXMudWkuYnVzLmdldCgwKS5yZW1vdmVFdmVudExpc3RlbmVyKFwiaWFnbzpuYXZpZ2F0ZVwiLCB0aGlzLm5hdmlnYXRlKTtcblx0fSxcblxuXHRjaGFuZ2VGZWVkYmFjazogZnVuY3Rpb24oc3RhdGUpIHtcblx0XHRpZiAodGhpcy5wcmV2aWV3TW9kZSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMudWkuZmVlZGJhY2suYXR0cihcImNvbnRlbnRlZGl0YWJsZVwiLCBzdGF0ZSk7XG5cdFx0dGhpcy5tb2RlbC5mZWVkYmFjayA9IHN0YXRlO1xuXG5cdFx0aWYgKCF0aGlzLm1vZGVsLmdldChcImZlZWRiYWNrXCIpKVxuXHRcdFx0dGhpcy5tb2RlbC5zZXQoXCJmZWVkYmFja1wiLCBcIlRoaXMgaXMgcGxhY2Vob2xkZXIgZmVlZGJhY2s7IGNsaWNrIHRvIGVkaXRcIik7XG5cblx0XHRpZiAoc3RhdGUpXG5cdFx0XHR0aGlzLnVpLmZlZWRiYWNrLmFkZENsYXNzKFwiaWFnby1lZGl0YWJsZS1kYXJrXCIpLnRleHQodGhpcy5tb2RlbC5nZXQoXCJmZWVkYmFja1wiKSk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy51aS5mZWVkYmFjay5yZW1vdmVDbGFzcyhcImlhZ28tZWRpdGFibGUtZGFya1wiKTtcblx0fSxcblxuXHRpYWdvTG9hZGVkOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmJpbmRVSUVsZW1lbnRzKCk7XG5cdFx0dGhpcy5kZWxlZ2F0ZUV2ZW50cygpO1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIGltYWdlcyBhbmQgY29uc3RydWN0IGFjY29yZGluZ2x5XG5cdFx0Xy5lYWNoKHRoaXMubW9kZWwuZ2V0KFwiY29ycmVjdEFuc3dlcnNcIikuY29uY2F0KHRoaXMubW9kZWwuZ2V0KFwib3RoZXJBbnN3ZXJzXCIpKSwgZWwgPT4ge1xuXHRcdFx0aWYgKGVsLnR5cGUgPT09IFwiaW1hZ2VcIiAmJiAhdGhpcy5wcmV2aWV3TW9kZSkge1xuXHRcdFx0XHR0aGlzLnF1ZXN0aW9uc1tlbC5pZC50b1N0cmluZygpXSA9IEltYWdlQ2hvb3Nlci5jcmVhdGUoJChcIi5xdWVzdGlvbi1vcHRpb25zW2RhdGEtdmFsdWU9J1wiICsgZWwuaWQgKyBcIiddXCIsIHRoaXMuZWwpLmNoaWxkcmVuKFwic3BhblwiKSwge1xuXHRcdFx0XHRcdHRyYW5zY29kZTogdHJ1ZSxcblx0XHRcdFx0XHRqcGVnOiB0cnVlLFxuXHRcdFx0XHRcdG1heEhlaWdodDogMjUwLFxuXHRcdFx0XHRcdG1heFdpZHRoOiAzMDAsXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHRoaXMucXVlc3Rpb25zW2VsLmlkLnRvU3RyaW5nKCldLnNldEltYWdlKGVsLmNvbnRlbnQpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwiZXhwZWN0UXVlc3Rpb25JbWFnZVwiKSAmJiAhdGhpcy5wcmV2aWV3TW9kZSkge1xuXHRcdFx0dGhpcy5oZWFkaW5nSW1hZ2VDbGljaygpO1xuXHRcdFx0dGhpcy5oZWFkaW5nSW1hZ2Uuc2V0SW1hZ2UodGhpcy5tb2RlbC5nZXQoXCJxdWVzdGlvbkltYWdlXCIpKTtcblx0XHR9XG5cblx0XHQvLyBDaGVjayBmb3IgZmVlZGJhY2sgbW9kZVxuXHRcdGlmICh0aGlzLmFzc2Vzc21lbnQuZ2V0KFwiZmVlZGJhY2tcIikpXG5cdFx0XHR0aGlzLmNoYW5nZUZlZWRiYWNrKHRydWUpO1xuXG5cdFx0aWYgKHRoaXMuZXh0cmFTZXR1cClcblx0XHRcdHRoaXMuZXh0cmFTZXR1cCgpO1xuXG5cdFx0aWYgKCF0aGlzLnByZXZpZXdNb2RlKSB7XG5cdFx0XHRjb25zdCBhbnN3ZXJDb3VudCA9ICQoXCIuY2hlY2thYmxlLmZhLWNoZWNrXCIpLmxlbmd0aDtcblx0XHRcdCQoXCIucXVlc3Rpb24tbWFya1wiKS50ZXh0KGFuc3dlckNvdW50KTtcblx0XHR9XG5cdH0sXG5cblx0aWFnb05hdmlnYXRlOiBmdW5jdGlvbihldnQpIHtcblx0XHQvLyBTYXZlIHRoaXMgbW9kZWwsIHRoZW4gbmF2aWdhdGVcblx0XHRpZiAodGhpcy5zYXZlKCkpXG5cdFx0XHR0aGlzLnRyaWdnZXIoXCJpYWdvOm5hdmlnYXRlXCIsIGV2dCk7XG5cdH0sXG5cblx0c2F2ZTogZnVuY3Rpb24obm9WYWxpZGF0aW9uLCBub0ZlZWRiYWNrKSB7XG5cdFx0aWYgKCF0aGlzLnVpLmhlYWRpbmdUZXh0LnRleHQpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRjb25zdCBjb3JyZWN0ID0gJChcIi5jaGVja2FibGUuZmEtY2hlY2tcIiwgdGhpcy5lbCkucGFyZW50cyhcIi5xdWVzdGlvbi1vcHRpb25zXCIpO1xuXHRcdGNvbnN0IHdyb25nID0gJChcIi5jaGVja2FibGUuZmEtdGltZXNcIiwgdGhpcy5lbCkucGFyZW50cyhcIi5xdWVzdGlvbi1vcHRpb25zXCIpO1xuXG5cdFx0Y29uc3QgcXVlc3Rpb24gPSBfLnRyaW0odGhpcy51aS5oZWFkaW5nVGV4dC50ZXh0KCkpO1xuXHRcdGNvbnN0IGZlZWRiYWNrID0gdGhpcy5hc3Nlc3NtZW50LmdldChcImZlZWRiYWNrXCIpICYmICFub0ZlZWRiYWNrID8gXy50cmltKHRoaXMudWkuZmVlZGJhY2sudGV4dCgpKSA6IFwiXCI7XG5cdFx0bGV0IHF1ZXN0aW9uSW1hZ2UgPSBudWxsO1xuXG5cdFx0aWYgKHRoaXMuaGVhZGluZ0ltYWdlKVxuXHRcdFx0cXVlc3Rpb25JbWFnZSA9IHRoaXMuaGVhZGluZ0ltYWdlLmdldEltYWdlKCk7XG5cblx0XHR0aGlzLm1vZGVsLnNldCh7XG5cdFx0XHRxdWVzdGlvbjogcXVlc3Rpb24sXG5cdFx0XHRxdWVzdGlvbkltYWdlOiBxdWVzdGlvbkltYWdlLFxuXHRcdFx0ZXhwZWN0UXVlc3Rpb25JbWFnZTogcXVlc3Rpb25JbWFnZSAhPT0gbnVsbCxcblx0XHRcdGZlZWRiYWNrOiBmZWVkYmFjayxcblx0XHRcdGNvcnJlY3RBbnN3ZXJzOiBfLm1hcChjb3JyZWN0LnRvQXJyYXkoKSwgZWwgPT4ge1xuXHRcdFx0XHRjb25zdCBlbGVtZW50ID0gJChlbCk7XG5cdFx0XHRcdGNvbnN0IHNwYW4gPSBlbGVtZW50LmNoaWxkcmVuKFwic3BhblwiKTtcblxuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdGlkOiBwYXJzZUludChlbGVtZW50LmRhdGEoXCJ2YWx1ZVwiKSwgMTApLFxuXHRcdFx0XHRcdHR5cGU6IHNwYW4uaGFzQ2xhc3MoXCJpbWFnZUNob29zZXJcIikgPyBcImltYWdlXCIgOiBcInRleHRcIixcblx0XHRcdFx0XHRjb250ZW50OiBzcGFuLmhhc0NsYXNzKFwiaW1hZ2VDaG9vc2VyXCIpID8gdGhpcy5xdWVzdGlvbnNbZWxlbWVudC5kYXRhKFwidmFsdWVcIildLmdldEltYWdlKCkgOiBzcGFuLnRleHQoKSxcblx0XHRcdFx0fTtcblx0XHRcdH0pLFxuXHRcdFx0b3RoZXJBbnN3ZXJzOiBfLm1hcCh3cm9uZy50b0FycmF5KCksIGVsID0+IHtcblx0XHRcdFx0Y29uc3QgZWxlbWVudCA9ICQoZWwpO1xuXHRcdFx0XHRjb25zdCBzcGFuID0gZWxlbWVudC5jaGlsZHJlbihcInNwYW5cIik7XG5cblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRpZDogcGFyc2VJbnQoZWxlbWVudC5kYXRhKFwidmFsdWVcIiksIDEwKSxcblx0XHRcdFx0XHR0eXBlOiBzcGFuLmhhc0NsYXNzKFwiaW1hZ2VDaG9vc2VyXCIpID8gXCJpbWFnZVwiIDogXCJ0ZXh0XCIsXG5cdFx0XHRcdFx0Y29udGVudDogc3Bhbi5oYXNDbGFzcyhcImltYWdlQ2hvb3NlclwiKSA/IHRoaXMucXVlc3Rpb25zW2VsZW1lbnQuZGF0YShcInZhbHVlXCIpXS5nZXRJbWFnZSgpIDogc3Bhbi50ZXh0KCksXG5cdFx0XHRcdH07XG5cdFx0XHR9KSxcblx0XHR9KTtcblxuXHRcdHRoaXMubW9kZWwuc2V0KHsgcG90ZW50aWFsU2NvcmU6IHRoaXMubW9kZWwuZ2V0KFwiY29ycmVjdEFuc3dlcnNcIikubGVuZ3RoIH0pO1xuXG5cdFx0aWYgKCFub1ZhbGlkYXRpb24pXG5cdFx0XHRyZXR1cm4gdGhpcy5tb2RlbC5pc1ZhbGlkKCk7XG5cdH0sXG5cblx0dmFsaWRhdGlvbkZhaWw6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLnByZXZpZXdNb2RlKVxuXHRcdFx0cmV0dXJuO1xuXHRcdC8vIEJ1aWxkIHRoZSBlcnJvcnMgdG8gc2hvd1xuXHRcdGNvbnN0IGVycnMgPSB0aGlzLm1vZGVsLnZhbGlkYXRpb25FcnJvci5zbGljZSgwKTtcblxuXHRcdGVycnMudW5zaGlmdChcIjxzdHJvbmc+VGhlIGN1cnJlbnQgcXVlc3Rpb24gaGFzIGVycm9ycyBhbmQgY2Fubm90IGJlIHNhdmVkOjwvc3Ryb25nPjxici8+XCIpO1xuXHRcdHRoaXMudWkuZXJyb3JzLnJlbW92ZUNsYXNzKFwiaGlkZVwiKS5jaGlsZHJlbihcIi5kZXRhaWxcIikuaHRtbChlcnJzLmpvaW4oXCI8YnIvPiZtaWRkb3Q7Jm5ic3A7XCIpKTtcblx0fSxcblxuXHRjbG9zZUVycm9yOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmVycm9ycy5hZGRDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0ZWRpdENsaWNrOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0ZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cdH0sXG5cblx0Y2hhbmdlVHlwZTogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0Ly8gR2V0IHRoZSB0aGluZyB3ZSBjbGlja2VkIG9uXG5cdFx0Y29uc3QgZWwgPSAkKGV2dC5jdXJyZW50VGFyZ2V0KS5wYXJlbnRzKFwiZGl2LnF1ZXN0aW9uLW9wdGlvbnNcIik7XG5cblx0XHQvLyBDaGFuZ2UgaXRzIHR5cGVcblx0XHRpZiAoZXZ0LmN1cnJlbnRUYXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiZmEtaW1hZ2VcIikpIHtcblx0XHRcdC8vIFR1cm4gaXQgaW50byBhbiBpbWFnZVxuXHRcdFx0dGhpcy5xdWVzdGlvbnNbZWwuZGF0YShcInZhbHVlXCIpXSA9IEltYWdlQ2hvb3Nlci5jcmVhdGUoZWwuY2hpbGRyZW4oXCJzcGFuXCIpLCB7XG5cdFx0XHRcdGpwZWc6IHRydWUsXG5cdFx0XHRcdG1heEhlaWdodDogMzAwLFxuXHRcdFx0XHRtYXhXaWR0aDogMzAwLFxuXHRcdFx0XHR0cmFuc2NvZGU6IHRydWUsXG5cdFx0XHR9KTtcblxuXHRcdFx0ZWwuY2hpbGRyZW4oXCJzcGFuXCIpLmF0dHIoXCJjb250ZW50ZWRpdGFibGVcIiwgZmFsc2UpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdC8vIFR1cm4gaXQgaW50byB0ZXh0XG5cdFx0XHR0aGlzLnF1ZXN0aW9uc1tlbC5kYXRhKFwidmFsdWVcIildLmRlc3Ryb3koKTtcblxuXHRcdFx0ZWwuY2hpbGRyZW4oXCJzcGFuXCIpLnRleHQoXCJUZXh0IGhlcmVcIikuYXR0cihcImNvbnRlbnRlZGl0YWJsZVwiLCB0cnVlKTtcblx0XHR9XG5cblx0XHQkKGV2dC5jdXJyZW50VGFyZ2V0KS50b2dnbGVDbGFzcyhcImZhLWltYWdlIGZhLWZpbGUtYWx0XCIpO1xuXHR9LFxuXG5cdGFkZE9wdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgZWwgPSAkKFwiPGRpdiBjbGFzcz0ncXVlc3Rpb24tb3B0aW9ucyBtYW55LW9wdGlvbicgZGF0YS12YWx1ZT0nXCIgKyB0aGlzLnF1ZXN0aW9uSUQrKyArXG5cdFx0XHRcIicgZGF0YS1zZWxlY3RlZD0nZmFsc2UnPjxzcGFuIGNvbnRlbnRlZGl0YWJsZT0ndHJ1ZSc+T3B0aW9uIFwiICsgKCQoXCIucXVlc3Rpb24tb3B0aW9uc1wiKS5sZW5ndGggKyAxKSArXG5cdFx0XHRcdFwiPC9zcGFuPjxkaXYgY2xhc3M9J29wdGlvbi1ob3N0Jz48ZGl2IGNsYXNzPSdjaGVja2FibGUgZmFsIGZhLXRpbWVzJy8+PGRpdiBjbGFzcz0nZm9ybWF0IGZhbCBmYS1pbWFnZScvPjxkaXYgY2xhc3M9J2RlbGV0YWJsZSBmYWwgZmEtdHJhc2gtYWx0Jy8+PC9kaXY+PC9kaXY+XCIsIHRoaXMuZWwpO1xuXG5cdFx0JChcIi5wbGFjZWhvbGRlclwiLCB0aGlzLmVsKS5iZWZvcmUoZWwpO1xuXHR9LFxuXG5cdGRlbGV0ZU9wdGlvbjogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0Ly8gSWYgdGhlcmUgYXJlIG9ubHkgdHdvIG9wdGlvbnMgbGVmdCwgZG9uJ3QgYWxsb3cgZGVsZXRpb25cblx0XHRpZiAoJChcImRpdi5xdWVzdGlvbi1vcHRpb25zXCIsIHRoaXMuZWwpLmxlbmd0aCA9PT0gMilcblx0XHRcdHJldHVybjtcblxuXHRcdC8vIEdldCB0aGUgdGhpbmcgd2UgY2xpY2tlZCBvblxuXHRcdGNvbnN0IGVsID0gJChldnQuY3VycmVudFRhcmdldCkucGFyZW50cyhcImRpdi5xdWVzdGlvbi1vcHRpb25zXCIpO1xuXG5cdFx0aWYgKGVsLmRhdGEoXCJ2YWx1ZVwiKSBpbiB0aGlzLnF1ZXN0aW9ucylcblx0XHRcdHRoaXMucXVlc3Rpb25zW2VsLmRhdGEoXCJ2YWx1ZVwiKV0uZGVzdHJveSgpO1xuXG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwic3VidHlwZVwiKSAhPT0gMSAmJiBlbC5maW5kKFwiLmZhLWNoZWNrXCIpLmxlbmd0aCkge1xuXHRcdFx0Ly8gVGhpcyBpcyB0aGUgcmlnaHQgYW5zd2VyLCBzbyBtYWtlIHNvbWV0aGluZyBlbHNlIHRoZSByaWdodCBhbnN3ZXJcblx0XHRcdGlmICgkKFwiZGl2LnF1ZXN0aW9uLW9wdGlvbnNcIiwgdGhpcy5lbCkuZmlyc3QoKS5pcyhlbCkpXG5cdFx0XHRcdCQoXCJkaXYucXVlc3Rpb24tb3B0aW9uc1wiLCB0aGlzLmVsKS5lcSgxKS5maW5kKFwiLmNoZWNrYWJsZVwiKS50b2dnbGVDbGFzcyhcImZhLXRpbWVzIGZhLWNoZWNrXCIpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHQkKFwiZGl2LnF1ZXN0aW9uLW9wdGlvbnNcIiwgdGhpcy5lbCkuZmlyc3QoKS5maW5kKFwiLmNoZWNrYWJsZVwiKS50b2dnbGVDbGFzcyhcImZhLXRpbWVzIGZhLWNoZWNrXCIpO1xuXHRcdH1cblxuXHRcdGVsLnJlbW92ZSgpO1xuXHR9LFxuXG5cdHNlbGVjdDogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0Y29uc3QgZWwgPSAkKGV2dC5jdXJyZW50VGFyZ2V0KTtcblxuXHRcdGlmICghZWwucHJvcChcImNvbnRlbnRlZGl0YWJsZVwiKSlcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcblx0XHRcdHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbFswXSk7XG5cdFx0XHRjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cdFx0XHRzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG5cdFx0XHRzZWwuYWRkUmFuZ2UocmFuZ2UpO1xuXHRcdH0sIDUwKTtcblx0fSxcblxuXHR1bnNlbGVjdDogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0d2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpO1xuXG5cdFx0Ly8gSWYgdGhpcyBlbGVtZW50IGlzIG5vdyBibGFuaywgd2UgbmVlZCB0byByZXNldCBpdFxuXHRcdGlmICgkKGV2dC5jdXJyZW50VGFyZ2V0KS50ZXh0KCkudHJpbSgpICE9PSBcIlwiKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0c3dpdGNoIChldnQuY3VycmVudFRhcmdldC5pZCkge1xuXHRcdFx0Y2FzZSBcImlhZ28taGVhZGluZy10ZXh0XCI6XG5cdFx0XHRcdCQoZXZ0LmN1cnJlbnRUYXJnZXQpLnRleHQoXCJJbnNlcnQgUXVlc3Rpb25cIik7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwiaWFnby1oZWxwLWNvbnRlbnQtdGV4dFwiOlxuXHRcdFx0XHQkKGV2dC5jdXJyZW50VGFyZ2V0KS50ZXh0KFwiVGhpcyBpcyBwbGFjZWhvbGRlciBmZWVkYmFjazsgY2xpY2sgdG8gZWRpdFwiKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdCQoZXZ0LmN1cnJlbnRUYXJnZXQpLnRleHQoXCJUZXh0XCIpO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH0sXG59O1xuXG5jb25zdCBRdWVzdGlvbk1vZGVsID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHt9LFxuXHR2YWxpZGF0ZUJhc2U6IGZ1bmN0aW9uKGF0dHJpYnV0ZXMpIHtcblx0XHRjb25zdCBlcnJvcnMgPSBbXTtcblxuXHRcdGlmICghYXR0cmlidXRlcy5pZClcblx0XHRcdGVycm9ycy5wdXNoKFwiTm8gdmFsaWQgcXVlc3Rpb24gSURcIik7XG5cblx0XHRpZiAoIWF0dHJpYnV0ZXMucXVlc3Rpb24pXG5cdFx0XHRlcnJvcnMucHVzaChcIllvdSBtdXN0IHNwZWNpZnkgYSB2YWxpZCBxdWVzdGlvblwiKTtcblxuXHRcdGlmIChhdHRyaWJ1dGVzLmV4cGVjdFF1ZXN0aW9uSW1hZ2UgJiYgIWF0dHJpYnV0ZXMucXVlc3Rpb25JbWFnZSlcblx0XHRcdGVycm9ycy5wdXNoKFwiWW91IG11c3Qgc3BlY2lmeSBhIHF1ZXN0aW9uIGltYWdlLCBvciBjYW5jZWwgaXRcIik7XG5cblx0XHRpZiAoYXR0cmlidXRlcy5xdWVzdGlvbiA9PT0gXCJJbnNlcnQgUXVlc3Rpb25cIilcblx0XHRcdGVycm9ycy5wdXNoKFwiWW91IGRpZCBub3QgY2hhbmdlIHRoZSBkZWZhdWx0IHF1ZXN0aW9uXCIpO1xuXG5cdFx0aWYgKHRoaXMuZmVlZGJhY2spIHtcblx0XHRcdGlmICghYXR0cmlidXRlcy5mZWVkYmFjaylcblx0XHRcdFx0ZXJyb3JzLnB1c2goXCJZb3UgbXVzdCBwcm92aWRlIGZlZWRiYWNrXCIpO1xuXG5cdFx0XHRpZiAoYXR0cmlidXRlcy5mZWVkYmFjayA9PT0gXCJUaGlzIGlzIHBsYWNlaG9sZGVyIGZlZWRiYWNrOyBjbGljayB0byBlZGl0XCIpXG5cdFx0XHRcdGVycm9ycy5wdXNoKFwiWW91IGRpZCBub3QgY2hhbmdlIHRoZSBkZWZhdWx0IGZlZWRiYWNrXCIpO1xuXHRcdH1cblxuXHRcdHJldHVybiBlcnJvcnM7XG5cdH0sXG59KTtcblxuTW9kZWxzW1wiMS4xXCJdID0gUXVlc3Rpb25Nb2RlbC5leHRlbmQoe1xuXHRpZEF0dHJpYnV0ZTogXCJpZFwiLFxuXG5cdGRlZmF1bHRzOiB7XG5cdFx0dHlwZTogMSxcblx0XHRzdWJ0eXBlOiAxLFxuXHRcdHF1ZXN0aW9uOiBcIkluc2VydCBRdWVzdGlvblwiLFxuXHRcdHF1ZXN0aW9uSW1hZ2U6IG51bGwsXG5cdFx0ZXhwZWN0UXVlc3Rpb25JbWFnZTogZmFsc2UsXG5cdFx0ZmVlZGJhY2s6IFwiVGhpcyBpcyBwbGFjZWhvbGRlciBmZWVkYmFjazsgY2xpY2sgdG8gZWRpdFwiLFxuXHRcdGNvcnJlY3RBbnN3ZXJzOiBbe1xuXHRcdFx0aWQ6IDEsXG5cdFx0XHR0eXBlOiBcInRleHRcIixcblx0XHRcdGNvbnRlbnQ6IFwiT3B0aW9uIDFcIixcblx0XHR9XSxcblx0XHRvdGhlckFuc3dlcnM6IFt7XG5cdFx0XHRpZDogMixcblx0XHRcdHR5cGU6IFwidGV4dFwiLFxuXHRcdFx0Y29udGVudDogXCJPcHRpb24gMlwiLFxuXHRcdH1dLFxuXHRcdHBvdGVudGlhbFNjb3JlOiAwLFxuXHR9LFxuXG5cdHZhbGlkYXRlOiBmdW5jdGlvbihhdHRycykge1xuXHRcdGxldCBlcnIgPSBbXTtcblxuXHRcdGVyciA9IGVyci5jb25jYXQodGhpcy52YWxpZGF0ZUJhc2UoYXR0cnMpKTtcblxuXHRcdGlmIChhdHRycy5jb3JyZWN0QW5zd2Vycy5sZW5ndGggPT09IDApXG5cdFx0XHRlcnIucHVzaChcIllvdSBtdXN0IGNob29zZSBhdCBsZWFzdCBvbmUgY29ycmVjdCBhbnN3ZXJcIik7XG5cblx0XHRpZiAoXy5zb21lKGF0dHJzLmNvcnJlY3RBbnN3ZXJzLCBhID0+ICFhLmNvbnRlbnQpKVxuXHRcdFx0ZXJyLnB1c2goXCJZb3UgbXVzdCBzcGVjaWZ5IHZhbGlkIGNvbnRlbnQgZm9yIGFsbCBxdWVzdGlvbnNcIik7XG5cblx0XHRpZiAoZXJyLmxlbmd0aCA+IDApXG5cdFx0XHRyZXR1cm4gZXJyO1xuXHR9LFxufSk7XG5cbi8vQ2hvb3NlIG9wdGlvblxuUXVlc3Rpb25zW1wiMS4xXCJdID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi90ZW1wbGF0ZXMvYXNzZXNzbWVudE1vZGFsLm51bmpcIikucXVlc3Rpb25NYXJrdXAsXG5cblx0dWk6IHtcblx0XHRidXM6IFwiI2lhZ28tYXNzZXNzbWVudFwiLFxuXHRcdGhlYWRpbmdUZXh0OiBcIiNpYWdvLWhlYWRpbmctdGV4dFwiLFxuXHRcdGhlYWRpbmdJbWFnZTogXCIjaWFnby1xdWVzdGlvbi1pbWFnZSAuaW1hZ2UtcGxhY2Vob2xkZXJcIixcblx0XHRoZWFkaW5nSW1hZ2VEZWw6IFwiI2lhZ28tcXVlc3Rpb24taW1hZ2UgLmRlbGV0ZS1pbWFnZVwiLFxuXHRcdHByZXZCdXR0b246IFwiI2lhZ28tcHJldmlvdXMtcXVlc3Rpb25cIixcblx0XHRuZXh0QnV0dG9uOiBcIiNpYWdvLW5leHQtcXVlc3Rpb25cIixcblx0XHRmZWVkYmFjazogXCIjaWFnby1oZWxwLWNvbnRlbnQtdGV4dFwiLFxuXHRcdGVycm9yczogXCIucXVlc3Rpb24tZXJyb3JzXCIsXG5cdFx0Y2xvc2VFcnJvcjogXCIucXVlc3Rpb24tZXJyb3JzIC5jbG9zZVwiLFxuXG5cdFx0b3B0aW9uOiBcIi5xdWVzdGlvbi1vcHRpb25zXCIsXG5cdFx0b3B0aW9uVGV4dDogXCIucXVlc3Rpb24tb3B0aW9ucyBzcGFuXCIsXG5cblx0XHRwbGFjZWhvbGRlcjogXCIucGxhY2Vob2xkZXJcIixcblx0XHR0eXBlOiBcImRpdi5mb3JtYXRcIixcblx0XHRkZWxldGVyOiBcImRpdi5kZWxldGFibGVcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5vcHRpb25cIjogXCJ0b2dnbGVBbnN3ZXJcIixcblx0XHRcImNsaWNrIEB1aS5vcHRpb25UZXh0XCI6IFwiZWRpdENsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkuaGVhZGluZ0ltYWdlXCI6IFwiaGVhZGluZ0ltYWdlQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5oZWFkaW5nSW1hZ2VEZWxcIjogXCJkZWxldGVIZWFkaW5nSW1hZ2VcIixcblxuXHRcdFwiY2xpY2sgQHVpLmNsb3NlRXJyb3JcIjogXCJjbG9zZUVycm9yXCIsXG5cdFx0XCJjbGljayBAdWkudHlwZVwiOiBcImNoYW5nZVR5cGVcIixcblx0XHRcImNsaWNrIEB1aS5kZWxldGVyXCI6IFwiZGVsZXRlT3B0aW9uXCIsXG5cblx0XHQvL1wicGFzdGUgQHVpLmhlYWRpbmdUZXh0XCI6IFwicGFzdGVkXCIsXG5cdFx0Ly9cInBhc3RlIEB1aS5vcHRpb25UZXh0XCI6IFwicGFzdGVkXCIsXG5cdFx0Ly9cInBhc3RlIEB1aS5mZWVkYmFja1wiOiBcInBhc3RlZFwiLFxuXG5cdFx0XCJmb2N1cyBAdWkub3B0aW9uVGV4dFwiOiBcInNlbGVjdFwiLFxuXHRcdFwiZm9jdXMgQHVpLmZlZWRiYWNrXCI6IFwic2VsZWN0XCIsXG5cdFx0XCJmb2N1cyBAdWkuaGVhZGluZ1RleHRcIjogXCJzZWxlY3RcIixcblxuXHRcdFwiYmx1ciBAdWkuaGVhZGluZ1RleHRcIjogXCJ1bnNlbGVjdFwiLFxuXHRcdFwiYmx1ciBAdWkuZmVlZGJhY2tcIjogXCJ1bnNlbGVjdFwiLFxuXHRcdFwiYmx1ciBAdWkub3B0aW9uVGV4dFwiOiBcInVuc2VsZWN0XCIsXG5cdH0sXG5cblx0bW9kZWxFdmVudHM6IHtcblx0XHRpbnZhbGlkOiBcInZhbGlkYXRpb25GYWlsXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdF8uZXh0ZW5kKHRoaXMsIE11bHRpUXVlc3Rpb25zKTtcblxuXHRcdHRoaXMubW9kZWwgPSBvcHRpb25zLnF1ZXN0aW9uIHx8IG5ldyBNb2RlbHNbXCIxLjFcIl0oeyBpZDogb3B0aW9ucy5pZCB9KTtcblxuXHRcdHRoaXMuYmluZEV2ZW50cyh0aGlzLm1vZGVsLCB0aGlzLm1vZGVsRXZlbnRzKTtcblxuXHRcdHRoaXMuYXNzZXNzbWVudCA9IG9wdGlvbnMuYXNzZXNzbWVudDtcblx0XHR0aGlzLnByZXZpZXdNb2RlID0gb3B0aW9ucy5wcmV2aWV3TW9kZTtcblxuXHRcdHRoaXMucXVlc3Rpb25JRCA9IF8ubWF4QnkodGhpcy5tb2RlbC5nZXQoXCJjb3JyZWN0QW5zd2Vyc1wiKS5jb25jYXQodGhpcy5tb2RlbC5nZXQoXCJvdGhlckFuc3dlcnNcIikpLCB4ID0+IHguaWQpLmlkICsgMTtcblxuXHRcdHRoaXMubGlzdGVuVG8oUGFnZSwgXCJjaGFuZ2U6ZmVlZGJhY2tcIiwgdGhpcy5jaGFuZ2VGZWVkYmFjay5iaW5kKHRoaXMpKTtcblxuXHRcdHRoaXMucXVlc3Rpb25zID0ge307XG5cblx0XHR0aGlzLmxvYWRlZCA9IHRoaXMuaWFnb0xvYWRlZC5iaW5kKHRoaXMpO1xuXHRcdHRoaXMubmF2aWdhdGUgPSB0aGlzLmlhZ29OYXZpZ2F0ZS5iaW5kKHRoaXMpO1xuXHR9LFxuXG5cdGV4dHJhU2V0dXA6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkucGxhY2Vob2xkZXIub24oXCJjbGlja1wiLCB0aGlzLmFkZE9wdGlvbi5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHR0b2dnbGVBbnN3ZXI6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGNvbnN0IGVsID0gJChcIi5jaGVja2FibGVcIiwgZXZ0LmN1cnJlbnRUYXJnZXQpO1xuXG5cdFx0ZWwudG9nZ2xlQ2xhc3MoXCJmYS1jaGVjayBmYS10aW1lc1wiKTtcblxuXHRcdGNvbnN0IGFuc3dlckNvdW50ID0gJChcIi5jaGVja2FibGUuZmEtY2hlY2tcIikubGVuZ3RoO1xuXHRcdCQoXCIucXVlc3Rpb24tbWFya1wiKS50ZXh0KGFuc3dlckNvdW50KTtcblx0fSxcbn0pO1xuXG5Nb2RlbHNbXCIxLjJcIl0gPSBRdWVzdGlvbk1vZGVsLmV4dGVuZCh7XG5cdGlkQXR0cmlidXRlOiBcImlkXCIsXG5cblx0ZGVmYXVsdHM6IHtcblx0XHR0eXBlOiAxLFxuXHRcdHN1YnR5cGU6IDIsXG5cdFx0cXVlc3Rpb246IFwiSW5zZXJ0IFF1ZXN0aW9uXCIsXG5cdFx0cXVlc3Rpb25JbWFnZTogbnVsbCxcblx0XHRleHBlY3RRdWVzdGlvbkltYWdlOiBmYWxzZSxcblx0XHRmZWVkYmFjazogXCJUaGlzIGlzIHBsYWNlaG9sZGVyIGZlZWRiYWNrOyBjbGljayB0byBlZGl0XCIsXG5cdFx0Y29ycmVjdEFuc3dlcnM6IFt7XG5cdFx0XHRpZDogMSxcblx0XHRcdHR5cGU6IFwidGV4dFwiLFxuXHRcdFx0Y29udGVudDogXCJPcHRpb24gMVwiLFxuXHRcdH1dLFxuXHRcdG90aGVyQW5zd2VyczogW3tcblx0XHRcdGlkOiAyLFxuXHRcdFx0dHlwZTogXCJ0ZXh0XCIsXG5cdFx0XHRjb250ZW50OiBcIk9wdGlvbiAyXCIsXG5cdFx0fV0sXG5cdFx0cG90ZW50aWFsU2NvcmU6IDAsXG5cdH0sXG5cblx0dmFsaWRhdGU6IGZ1bmN0aW9uKGF0dHJzKSB7XG5cdFx0bGV0IGVyciA9IFtdO1xuXG5cdFx0ZXJyID0gZXJyLmNvbmNhdCh0aGlzLnZhbGlkYXRlQmFzZShhdHRycykpO1xuXG5cdFx0aWYgKF8uc29tZShhdHRycy5jb3JyZWN0QW5zd2VycywgYSA9PiAhYS5jb250ZW50KSlcblx0XHRcdGVyci5wdXNoKFwiWW91IG11c3Qgc3BlY2lmeSB2YWxpZCBjb250ZW50IGZvciBhbGwgcXVlc3Rpb25zXCIpO1xuXG5cdFx0aWYgKGVyci5sZW5ndGggPiAwKVxuXHRcdFx0cmV0dXJuIGVycjtcblx0fSxcbn0pO1xuXG5RdWVzdGlvbnNbXCIxLjJcIl0gPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9hc3Nlc3NtZW50TW9kYWwubnVualwiKS5xdWVzdGlvbk1hcmt1cCxcblxuXHR1aToge1xuXHRcdGJ1czogXCIjaWFnby1hc3Nlc3NtZW50XCIsXG5cdFx0aGVhZGluZ1RleHQ6IFwiI2lhZ28taGVhZGluZy10ZXh0XCIsXG5cdFx0aGVhZGluZ0ltYWdlOiBcIiNpYWdvLXF1ZXN0aW9uLWltYWdlIC5pbWFnZS1wbGFjZWhvbGRlclwiLFxuXHRcdGhlYWRpbmdJbWFnZURlbDogXCIjaWFnby1xdWVzdGlvbi1pbWFnZSAuZGVsZXRlLWltYWdlXCIsXG5cdFx0cHJldkJ1dHRvbjogXCIjaWFnby1wcmV2aW91cy1xdWVzdGlvblwiLFxuXHRcdG5leHRCdXR0b246IFwiI2lhZ28tbmV4dC1xdWVzdGlvblwiLFxuXHRcdGZlZWRiYWNrOiBcIiNpYWdvLWhlbHAtY29udGVudC10ZXh0XCIsXG5cdFx0ZXJyb3JzOiBcIi5xdWVzdGlvbi1lcnJvcnNcIixcblx0XHRjbG9zZUVycm9yOiBcIi5xdWVzdGlvbi1lcnJvcnMgLmNsb3NlXCIsXG5cblx0XHRvcHRpb246IFwiLnF1ZXN0aW9uLW9wdGlvbnNcIixcblx0XHRvcHRpb25UZXh0OiBcIi5xdWVzdGlvbi1vcHRpb25zIHNwYW5cIixcblxuXHRcdHBsYWNlaG9sZGVyOiBcIi5wbGFjZWhvbGRlclwiLFxuXHRcdHR5cGU6IFwiZGl2LmZvcm1hdFwiLFxuXHRcdGRlbGV0ZXI6IFwiZGl2LmRlbGV0YWJsZVwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLm9wdGlvblwiOiBcImNoYW5nZUNvcnJlY3RBbnN3ZXJcIixcblx0XHRcImNsaWNrIEB1aS5vcHRpb25UZXh0XCI6IFwiZWRpdENsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkuaGVhZGluZ0ltYWdlXCI6IFwiaGVhZGluZ0ltYWdlQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5oZWFkaW5nSW1hZ2VEZWxcIjogXCJkZWxldGVIZWFkaW5nSW1hZ2VcIixcblxuXHRcdFwiY2xpY2sgQHVpLmNsb3NlRXJyb3JcIjogXCJjbG9zZUVycm9yXCIsXG5cdFx0XCJjbGljayBAdWkudHlwZVwiOiBcImNoYW5nZVR5cGVcIixcblx0XHRcImNsaWNrIEB1aS5kZWxldGVyXCI6IFwiZGVsZXRlT3B0aW9uXCIsXG5cblx0XHQvL1wicGFzdGUgQHVpLmhlYWRpbmdUZXh0XCI6IFwicGFzdGVkXCIsXG5cdFx0Ly9cInBhc3RlIEB1aS5vcHRpb25UZXh0XCI6IFwicGFzdGVkXCIsXG5cdFx0Ly9cInBhc3RlIEB1aS5mZWVkYmFja1wiOiBcInBhc3RlZFwiLFxuXG5cdFx0XCJmb2N1cyBAdWkub3B0aW9uVGV4dFwiOiBcInNlbGVjdFwiLFxuXHRcdFwiZm9jdXMgQHVpLmZlZWRiYWNrXCI6IFwic2VsZWN0XCIsXG5cdFx0XCJmb2N1cyBAdWkuaGVhZGluZ1RleHRcIjogXCJzZWxlY3RcIixcblxuXHRcdFwiYmx1ciBAdWkuaGVhZGluZ1RleHRcIjogXCJ1bnNlbGVjdFwiLFxuXHRcdFwiYmx1ciBAdWkuZmVlZGJhY2tcIjogXCJ1bnNlbGVjdFwiLFxuXHRcdFwiYmx1ciBAdWkub3B0aW9uVGV4dFwiOiBcInVuc2VsZWN0XCIsXG5cdH0sXG5cblx0bW9kZWxFdmVudHM6IHtcblx0XHRpbnZhbGlkOiBcInZhbGlkYXRpb25GYWlsXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdF8uZXh0ZW5kKHRoaXMsIE11bHRpUXVlc3Rpb25zKTtcblxuXHRcdHRoaXMubW9kZWwgPSBvcHRpb25zLnF1ZXN0aW9uIHx8IG5ldyBNb2RlbHNbXCIxLjJcIl0oeyBpZDogb3B0aW9ucy5pZCB9KTtcblxuXHRcdHRoaXMuYmluZEV2ZW50cyh0aGlzLm1vZGVsLCB0aGlzLm1vZGVsRXZlbnRzKTtcblxuXHRcdHRoaXMuYXNzZXNzbWVudCA9IG9wdGlvbnMuYXNzZXNzbWVudDtcblx0XHR0aGlzLnByZXZpZXdNb2RlID0gb3B0aW9ucy5wcmV2aWV3TW9kZTtcblxuXHRcdHRoaXMucXVlc3Rpb25JRCA9IF8ubWF4QnkodGhpcy5tb2RlbC5nZXQoXCJjb3JyZWN0QW5zd2Vyc1wiKS5jb25jYXQodGhpcy5tb2RlbC5nZXQoXCJvdGhlckFuc3dlcnNcIikpLCB4ID0+IHguaWQpLmlkICsgMTtcblxuXHRcdHRoaXMubGlzdGVuVG8oUGFnZSwgXCJjaGFuZ2U6ZmVlZGJhY2tcIiwgdGhpcy5jaGFuZ2VGZWVkYmFjay5iaW5kKHRoaXMpKTtcblxuXHRcdHRoaXMucXVlc3Rpb25zID0ge307XG5cblx0XHR0aGlzLmxvYWRlZCA9IHRoaXMuaWFnb0xvYWRlZC5iaW5kKHRoaXMpO1xuXHRcdHRoaXMubmF2aWdhdGUgPSB0aGlzLmlhZ29OYXZpZ2F0ZS5iaW5kKHRoaXMpO1xuXHR9LFxuXG5cdGV4dHJhU2V0dXA6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkucGxhY2Vob2xkZXIub24oXCJjbGlja1wiLCB0aGlzLmFkZE9wdGlvbi5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRjaGFuZ2VDb3JyZWN0QW5zd2VyOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQucHJldmVudERlZmF1bHQoKTtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRjb25zdCBlbCA9ICQoXCIuY2hlY2thYmxlXCIsIGV2dC5jdXJyZW50VGFyZ2V0KTtcblxuXHRcdGlmIChlbC5oYXNDbGFzcyhcImZhLWNoZWNrXCIpKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0Ly8gTWFrZSB0aGlzIGl0ZW0gY29ycmVjdCBhbmQgdGhlIG90aGVycyB3cm9uZ1xuXHRcdCQoXCIuY2hlY2thYmxlLmZhLWNoZWNrXCIsIHRoaXMuZWwpLmFkZChlbCkudG9nZ2xlQ2xhc3MoXCJmYS1jaGVjayBmYS10aW1lc1wiKTtcblx0fSxcbn0pO1xuXG5Nb2RlbHNbXCIxLjNcIl0gPSBRdWVzdGlvbk1vZGVsLmV4dGVuZCh7XG5cdGlkQXR0cmlidXRlOiBcImlkXCIsXG5cblx0ZGVmYXVsdHM6IHtcblx0XHR0eXBlOiAxLFxuXHRcdHN1YnR5cGU6IDMsXG5cdFx0cXVlc3Rpb246IFwiSW5zZXJ0IFF1ZXN0aW9uXCIsXG5cdFx0cXVlc3Rpb25JbWFnZTogbnVsbCxcblx0XHRleHBlY3RRdWVzdGlvbkltYWdlOiBmYWxzZSxcblx0XHRmZWVkYmFjazogXCJUaGlzIGlzIHBsYWNlaG9sZGVyIGZlZWRiYWNrOyBjbGljayB0byBlZGl0XCIsXG5cdFx0Y29ycmVjdEFuc3dlcnM6IFt7XG5cdFx0XHRpZDogMSxcblx0XHRcdHR5cGU6IFwidGV4dFwiLFxuXHRcdFx0Y29udGVudDogXCJUcnVlXCIsXG5cdFx0fV0sXG5cdFx0b3RoZXJBbnN3ZXJzOiBbe1xuXHRcdFx0aWQ6IDIsXG5cdFx0XHR0eXBlOiBcInRleHRcIixcblx0XHRcdGNvbnRlbnQ6IFwiRmFsc2VcIixcblx0XHR9XSxcblx0XHRwb3RlbnRpYWxTY29yZTogMCxcblx0fSxcblxuXHRxdWVzdGlvbk9wdGlvbnM6IFtcblx0XHR7IGNsb3NlT25DbGljazogZmFsc2UsIHRpdGxlOiBcIlF1ZXN0aW9uIEZvcm1hdFwiLCBuYW1lOiBcImZvcm1hdFwiLCB0eXBlOiBcImNob29zZS1vbmVcIiwgZWxlbWVudHM6IFtcblx0XHRcdHsgdGV4dDogXCJUcnVlIC8gRmFsc2VcIiwgaWQ6IFwidHJ1ZWZhbHNlXCIsIHNlbGVjdGVkOiB0cnVlIH0sXG5cdFx0XHR7IHRleHQ6IFwiWWVzIC8gTm9cIiwgaWQ6IFwieWVzbm9cIiB9LFxuXHRcdFx0eyB0ZXh0OiBcIkJlZm9yZSAvIEFmdGVyXCIsIGlkOiBcImJlZm9yZWFmdGVyXCIgfSxcblx0XHRcdHsgdGV4dDogXCJNb3JlIC8gTGVzc1wiLCBpZDogXCJtb3JlbGVzc1wiIH0sXG5cdFx0XSB9LFxuXHRdLFxuXG5cdHZhbGlkYXRlOiBmdW5jdGlvbihhdHRycykge1xuXHRcdGxldCBlcnIgPSBbXTtcblxuXHRcdGVyciA9IGVyci5jb25jYXQodGhpcy52YWxpZGF0ZUJhc2UoYXR0cnMpKTtcblxuXHRcdGlmIChfLnNvbWUoYXR0cnMuY29ycmVjdEFuc3dlcnMsIGEgPT4gIWEuY29udGVudCkpXG5cdFx0XHRlcnIucHVzaChcIllvdSBtdXN0IHNwZWNpZnkgdmFsaWQgY29udGVudCBmb3IgYWxsIHF1ZXN0aW9uc1wiKTtcblxuXHRcdGlmIChlcnIubGVuZ3RoID4gMClcblx0XHRcdHJldHVybiBlcnI7XG5cdH0sXG59KTtcblxuUXVlc3Rpb25zW1wiMS4zXCJdID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi90ZW1wbGF0ZXMvYXNzZXNzbWVudE1vZGFsLm51bmpcIikucXVlc3Rpb25NYXJrdXAsXG5cblx0dWk6IHtcblx0XHRidXM6IFwiI2lhZ28tYXNzZXNzbWVudFwiLFxuXHRcdGhlYWRpbmdUZXh0OiBcIiNpYWdvLWhlYWRpbmctdGV4dFwiLFxuXHRcdGhlYWRpbmdJbWFnZTogXCIjaWFnby1xdWVzdGlvbi1pbWFnZSAuaW1hZ2UtcGxhY2Vob2xkZXJcIixcblx0XHRoZWFkaW5nSW1hZ2VEZWw6IFwiI2lhZ28tcXVlc3Rpb24taW1hZ2UgLmRlbGV0ZS1pbWFnZVwiLFxuXHRcdHByZXZCdXR0b246IFwiI2lhZ28tcHJldmlvdXMtcXVlc3Rpb25cIixcblx0XHRuZXh0QnV0dG9uOiBcIiNpYWdvLW5leHQtcXVlc3Rpb25cIixcblx0XHRmZWVkYmFjazogXCIjaWFnby1oZWxwLWNvbnRlbnQtdGV4dFwiLFxuXHRcdGVycm9yczogXCIucXVlc3Rpb24tZXJyb3JzXCIsXG5cdFx0Y2xvc2VFcnJvcjogXCIucXVlc3Rpb24tZXJyb3JzIC5jbG9zZVwiLFxuXG5cdFx0b3B0aW9uOiBcIi5xdWVzdGlvbi1vcHRpb25zXCIsXG5cdFx0b3B0aW9uVGV4dDogXCIucXVlc3Rpb24tb3B0aW9ucyBzcGFuXCIsXG5cdFx0dHlwZTogXCJkaXYuZm9ybWF0XCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkub3B0aW9uXCI6IFwiY2hhbmdlQ29ycmVjdEFuc3dlclwiLFxuXHRcdFwiY2xpY2sgQHVpLm9wdGlvblRleHRcIjogXCJlZGl0Q2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5oZWFkaW5nSW1hZ2VcIjogXCJoZWFkaW5nSW1hZ2VDbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmhlYWRpbmdJbWFnZURlbFwiOiBcImRlbGV0ZUhlYWRpbmdJbWFnZVwiLFxuXG5cdFx0XCJjbGljayBAdWkuY2xvc2VFcnJvclwiOiBcImNsb3NlRXJyb3JcIixcblxuXHRcdFwiY2xpY2sgQHVpLnR5cGVcIjogXCJjaGFuZ2VUeXBlXCIsXG5cblx0XHQvL1wicGFzdGUgQHVpLmhlYWRpbmdUZXh0XCI6IFwicGFzdGVkXCIsXG5cdFx0Ly9cInBhc3RlIEB1aS5vcHRpb25UZXh0XCI6IFwicGFzdGVkXCIsXG5cdFx0Ly9cInBhc3RlIEB1aS5mZWVkYmFja1wiOiBcInBhc3RlZFwiLFxuXG5cdFx0XCJmb2N1cyBAdWkub3B0aW9uVGV4dFwiOiBcInNlbGVjdFwiLFxuXHRcdFwiZm9jdXMgQHVpLmZlZWRiYWNrXCI6IFwic2VsZWN0XCIsXG5cdFx0XCJmb2N1cyBAdWkuaGVhZGluZ1RleHRcIjogXCJzZWxlY3RcIixcblxuXHRcdFwiYmx1ciBAdWkuaGVhZGluZ1RleHRcIjogXCJ1bnNlbGVjdFwiLFxuXHRcdFwiYmx1ciBAdWkuZmVlZGJhY2tcIjogXCJ1bnNlbGVjdFwiLFxuXHRcdFwiYmx1ciBAdWkub3B0aW9uVGV4dFwiOiBcInVuc2VsZWN0XCIsXG5cdH0sXG5cblx0b3B0aW9uRXZlbnRzOiB7XG5cdFx0XCJjbGlja2VkOmZvcm1hdFwiOiBcImNoYW5nZUZvcm1hdFwiLFxuXHR9LFxuXG5cdG1vZGVsRXZlbnRzOiB7XG5cdFx0aW52YWxpZDogXCJ2YWxpZGF0aW9uRmFpbFwiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHRfLmV4dGVuZCh0aGlzLCBNdWx0aVF1ZXN0aW9ucyk7XG5cblx0XHR0aGlzLm1vZGVsID0gb3B0aW9ucy5xdWVzdGlvbiB8fCBuZXcgTW9kZWxzW1wiMS4zXCJdKHsgaWQ6IG9wdGlvbnMuaWQgfSk7XG5cblx0XHR0aGlzLmJpbmRFdmVudHModGhpcy5tb2RlbCwgdGhpcy5tb2RlbEV2ZW50cyk7XG5cblx0XHR0aGlzLmFzc2Vzc21lbnQgPSBvcHRpb25zLmFzc2Vzc21lbnQ7XG5cdFx0dGhpcy5wcmV2aWV3TW9kZSA9IG9wdGlvbnMucHJldmlld01vZGU7XG5cblx0XHRsZXQgbGFuZyA9IG9wdGlvbnMuYXNzZXNzbWVudC5nZXQoXCJsYW5ndWFnZVwiKTtcblx0XHRpZiAoIV8uaW5jbHVkZXMoW1wiQWZyaWthYW5zXCIsIFwiRW5nbGlzaFwiLCBcIklzaU5kZWJlbGVcIiwgXCJTZXBlZGlcIiwgXCJTZXNvdGhvXCIsIFwiU2lzd2F0aVwiLCBcIlNldHN3YW5hXCIsIFwiWGl0c29uZ2FcIiwgXCJUc2hpdmVuZGFcIiwgXCJJc2lYaG9zYVwiLCBcIklzaVp1bHVcIl0sIGxhbmcpKVxuXHRcdFx0bGFuZyA9IFwiRW5nbGlzaFwiO1xuXG5cdFx0aWYgKCFvcHRpb25zLnF1ZXN0aW9uICYmIGxhbmcgIT09IFwiRW5nbGlzaFwiKSB7XG5cdFx0XHR0aGlzLm1vZGVsLnNldChcImNvcnJlY3RBbnN3ZXJzXCIsIFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGlkOiAxLFxuXHRcdFx0XHRcdHR5cGU6IFwidGV4dFwiLFxuXHRcdFx0XHRcdGNvbnRlbnQ6IElhZ28uaW5zdHJ1Y3Rpb25zW2xhbmddLnRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRdKTtcblxuXHRcdFx0dGhpcy5tb2RlbC5zZXQoXCJvdGhlckFuc3dlcnNcIiwgW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWQ6IDIsXG5cdFx0XHRcdFx0dHlwZTogXCJ0ZXh0XCIsXG5cdFx0XHRcdFx0Y29udGVudDogSWFnby5pbnN0cnVjdGlvbnNbbGFuZ10uZmFsc2UsXG5cdFx0XHRcdH0sXG5cdFx0XHRdKTtcblx0XHR9XG5cblx0XHR0aGlzLmxpc3RlblRvKFBhZ2UsIFwiY2hhbmdlOmZlZWRiYWNrXCIsIHRoaXMuY2hhbmdlRmVlZGJhY2suYmluZCh0aGlzKSk7XG5cblx0XHR0aGlzLnF1ZXN0aW9ucyA9IHt9O1xuXG5cdFx0dGhpcy5sb2FkZWQgPSB0aGlzLmlhZ29Mb2FkZWQuYmluZCh0aGlzKTtcblx0XHR0aGlzLm5hdmlnYXRlID0gdGhpcy5pYWdvTmF2aWdhdGUuYmluZCh0aGlzKTtcblx0fSxcblxuXHRjaGFuZ2VDb3JyZWN0QW5zd2VyOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQucHJldmVudERlZmF1bHQoKTtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRjb25zdCBlbCA9ICQoXCIuY2hlY2thYmxlXCIsIGV2dC5jdXJyZW50VGFyZ2V0KTtcblxuXHRcdGlmIChlbC5oYXNDbGFzcyhcImZhLWNoZWNrXCIpKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0Ly8gTWFrZSB0aGlzIGl0ZW0gY29ycmVjdCBhbmQgdGhlIG90aGVycyB3cm9uZ1xuXHRcdCQoXCIuY2hlY2thYmxlXCIsIHRoaXMuZWwpLnRvZ2dsZUNsYXNzKFwiZmEtY2hlY2sgZmEtdGltZXNcIik7XG5cdH0sXG5cblx0Y2hhbmdlRm9ybWF0OiBmdW5jdGlvbihlbGVtKSB7XG5cdFx0Y29uc3QgZWxzID0gJChcIi5xdWVzdGlvbi1vcHRpb25zIHNwYW5cIiwgdGhpcy5lbCk7XG5cblx0XHRsZXQgbGFuZyA9IHRoaXMuYXNzZXNzbWVudC5nZXQoXCJsYW5ndWFnZVwiKTtcblx0XHRpZiAoIV8uaW5jbHVkZXMoW1wiQWZyaWthYW5zXCIsIFwiRW5nbGlzaFwiLCBcIklzaU5kZWJlbGVcIiwgXCJTZXBlZGlcIiwgXCJTZXNvdGhvXCIsIFwiU2lzd2F0aVwiLCBcIlNldHN3YW5hXCIsIFwiWGl0c29uZ2FcIiwgXCJUc2hpdmVuZGFcIiwgXCJJc2lYaG9zYVwiLCBcIklzaVp1bHVcIl0sIGxhbmcpKVxuXHRcdFx0bGFuZyA9IFwiRW5nbGlzaFwiO1xuXG5cdFx0Y29uc3QgdGV4dCA9IElhZ28uaW5zdHJ1Y3Rpb25zW2xhbmddO1xuXG5cdFx0c3dpdGNoIChlbGVtLmlkKSB7XG5cdFx0XHRjYXNlIFwidHJ1ZWZhbHNlXCI6XG5cdFx0XHRcdGVsc1swXS5pbm5lckhUTUwgPSB0ZXh0LnRydWU7XG5cdFx0XHRcdGVsc1sxXS5pbm5lckhUTUwgPSB0ZXh0LmZhbHNlO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcInllc25vXCI6XG5cdFx0XHRcdGVsc1swXS5pbm5lckhUTUwgPSB0ZXh0Lnllcztcblx0XHRcdFx0ZWxzWzFdLmlubmVySFRNTCA9IHRleHQubm87XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwiYmVmb3JlYWZ0ZXJcIjpcblx0XHRcdFx0ZWxzWzBdLmlubmVySFRNTCA9IHRleHQuYmVmb3JlO1xuXHRcdFx0XHRlbHNbMV0uaW5uZXJIVE1MID0gdGV4dC5hZnRlcjtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJtb3JlbGVzc1wiOlxuXHRcdFx0XHRlbHNbMF0uaW5uZXJIVE1MID0gdGV4dC5tb3JlO1xuXHRcdFx0XHRlbHNbMV0uaW5uZXJIVE1MID0gdGV4dC5sZXNzO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0aWYgKCFzZXR0aW5ncy5kZWJ1ZyB8fCBzZXR0aW5ncy5yZXBvcnRFcnJvcnMpXG5cdFx0XHRcdFx0cmF5Z3VuKFwic2VuZFwiLCBuZXcgRXJyb3IoXCJJbnZhbGlkIGFzc2Vzc21lbnQgY2FzZSBzdXBwbGllZFwiKSk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fSxcbn0pO1xuXG5Nb2RlbHNbXCIyXCJdID0gUXVlc3Rpb25Nb2RlbC5leHRlbmQoe1xuXHRpZEF0dHJpYnV0ZTogXCJpZFwiLFxuXG5cdGRlZmF1bHRzOiB7XG5cdFx0dHlwZTogMixcblx0XHRxdWVzdGlvbjogXCJJbnNlcnQgUXVlc3Rpb25cIixcblx0XHRxdWVzdGlvbkltYWdlOiBudWxsLFxuXHRcdGV4cGVjdFF1ZXN0aW9uSW1hZ2U6IGZhbHNlLFxuXHRcdGZlZWRiYWNrOiBcIlRoaXMgaXMgcGxhY2Vob2xkZXIgZmVlZGJhY2s7IGNsaWNrIHRvIGVkaXRcIixcblx0XHRwb3RlbnRpYWxTY29yZTogMCxcblx0fSxcblxuXHR2YWxpZGF0ZTogZnVuY3Rpb24oYXR0cnMpIHtcblx0XHRsZXQgZXJyID0gW107XG5cblx0XHRlcnIgPSBlcnIuY29uY2F0KHRoaXMudmFsaWRhdGVCYXNlKGF0dHJzKSk7XG5cblx0XHRpZiAoIWF0dHJzLnBvdGVudGlhbFNjb3JlIHx8IGF0dHJzLnBvdGVudGlhbFNjb3JlIDwgMCB8fCBhdHRycy5wb3RlbnRpYWxTY29yZSA+IDEwMDApXG5cdFx0XHRlcnIucHVzaChcIllvdSBtdXN0IGNob29zZSBhIHZhbGlkIG1hcmsgYmV0d2VlbiAxIGFuZCAxMDAwXCIpO1xuXG5cdFx0aWYgKGVyci5sZW5ndGggPiAwKVxuXHRcdFx0cmV0dXJuIGVycjtcblx0fSxcbn0pO1xuXG4vL1BhcmFncmFwaCBxdWVzdGlvblxuUXVlc3Rpb25zW1wiMlwiXSA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4vdGVtcGxhdGVzL2Fzc2Vzc21lbnRNb2RhbC5udW5qXCIpLnF1ZXN0aW9uTWFya3VwLFxuXG5cdHVpOiB7XG5cdFx0YnVzOiBcIiNpYWdvLWFzc2Vzc21lbnRcIixcblx0XHRoZWFkaW5nVGV4dDogXCIjaWFnby1oZWFkaW5nLXRleHRcIixcblx0XHRoZWFkaW5nSW1hZ2U6IFwiI2lhZ28tcXVlc3Rpb24taW1hZ2UgLmltYWdlLXBsYWNlaG9sZGVyXCIsXG5cdFx0aGVhZGluZ0ltYWdlRGVsOiBcIiNpYWdvLXF1ZXN0aW9uLWltYWdlIC5kZWxldGUtaW1hZ2VcIixcblx0XHRwcmV2QnV0dG9uOiBcIiNpYWdvLXByZXZpb3VzLXF1ZXN0aW9uXCIsXG5cdFx0bmV4dEJ1dHRvbjogXCIjaWFnby1uZXh0LXF1ZXN0aW9uXCIsXG5cdFx0ZmVlZGJhY2s6IFwiI2lhZ28taGVscC1jb250ZW50LXRleHRcIixcblx0XHRlcnJvcnM6IFwiLnF1ZXN0aW9uLWVycm9yc1wiLFxuXHRcdGNsb3NlRXJyb3I6IFwiLnF1ZXN0aW9uLWVycm9ycyAuY2xvc2VcIixcblxuXHRcdHBvdGVudGlhbFNjb3JlOiBcImlucHV0W3R5cGU9J251bWJlciddXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkuaGVhZGluZ0ltYWdlXCI6IFwiaGVhZGluZ0ltYWdlQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5oZWFkaW5nSW1hZ2VEZWxcIjogXCJkZWxldGVIZWFkaW5nSW1hZ2VcIixcblxuXHRcdC8vXCJwYXN0ZSBAdWkuaGVhZGluZ1RleHRcIjogXCJwYXN0ZWRcIixcblx0XHQvL1wicGFzdGUgQHVpLmZlZWRiYWNrXCI6IFwicGFzdGVkXCIsXG5cblx0XHRcImZvY3VzIEB1aS5mZWVkYmFja1wiOiBcInNlbGVjdFwiLFxuXHRcdFwiZm9jdXMgQHVpLmhlYWRpbmdUZXh0XCI6IFwic2VsZWN0XCIsXG5cblx0XHRcImJsdXIgQHVpLmhlYWRpbmdUZXh0XCI6IFwidW5zZWxlY3RcIixcblx0XHRcImJsdXIgQHVpLmZlZWRiYWNrXCI6IFwidW5zZWxlY3RcIixcblxuXHRcdFwia2V5dXAgQHVpLnBvdGVudGlhbFNjb3JlXCI6IFwiY2hhbmdlUXVlc3Rpb25NYXJrXCIsXG5cdFx0XCJtb3VzZXVwIEB1aS5wb3RlbnRpYWxTY29yZVwiOiBcImNoYW5nZVF1ZXN0aW9uTWFya1wiLFxuXHRcdFwibW91c2V3aGVlbCBAdWkucG90ZW50aWFsU2NvcmVcIjogXCJjaGFuZ2VRdWVzdGlvbk1hcmtcIixcblx0fSxcblxuXHRtb2RlbEV2ZW50czoge1xuXHRcdGludmFsaWQ6IFwidmFsaWRhdGlvbkZhaWxcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5tb2RlbCA9IG9wdGlvbnMucXVlc3Rpb24gfHwgbmV3IE1vZGVsc1tcIjJcIl0oeyBpZDogb3B0aW9ucy5pZCB9KTtcblxuXHRcdHRoaXMuYmluZEV2ZW50cyh0aGlzLm1vZGVsLCB0aGlzLm1vZGVsRXZlbnRzKTtcblxuXHRcdHRoaXMuYXNzZXNzbWVudCA9IG9wdGlvbnMuYXNzZXNzbWVudDtcblx0XHR0aGlzLnByZXZpZXdNb2RlID0gb3B0aW9ucy5wcmV2aWV3TW9kZTtcblxuXHRcdHRoaXMubGlzdGVuVG8oUGFnZSwgXCJjaGFuZ2U6ZmVlZGJhY2tcIiwgdGhpcy5jaGFuZ2VGZWVkYmFjay5iaW5kKHRoaXMpKTtcblxuXHRcdHRoaXMucXVlc3Rpb25zID0ge307XG5cblx0XHR0aGlzLmxvYWRlZCA9IHRoaXMuaWFnb0xvYWRlZC5iaW5kKHRoaXMpO1xuXHRcdHRoaXMubmF2aWdhdGUgPSB0aGlzLmlhZ29OYXZpZ2F0ZS5iaW5kKHRoaXMpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmJ1cy5nZXQoMCkuYWRkRXZlbnRMaXN0ZW5lcihcImlhZ286bG9hZGVkXCIsIHRoaXMubG9hZGVkKTtcblx0XHR0aGlzLnVpLmJ1cy5nZXQoMCkuYWRkRXZlbnRMaXN0ZW5lcihcImlhZ286bmF2aWdhdGVcIiwgdGhpcy5uYXZpZ2F0ZSk7XG5cblx0XHR0aGlzLnVpLmZlZWRiYWNrLmF0dHIoXCJjb250ZW50ZWRpdGFibGVcIiwgdGhpcy5hc3Nlc3NtZW50LmdldChcImZlZWRiYWNrXCIpKTtcblx0XHR0aGlzLm1vZGVsLmZlZWRiYWNrID0gdGhpcy5hc3Nlc3NtZW50LmdldChcImZlZWRiYWNrXCIpO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy50cmlnZ2VyKFwiZGVzdHJveWVkXCIsIHRoaXMubW9kZWwpO1xuXG5cdFx0Xy5lYWNoKHRoaXMucXVlc3Rpb25zLCBlbCA9PiBlbC5kZXN0cm95KCkpO1xuXG5cdFx0dGhpcy51aS5idXMuZ2V0KDApLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJpYWdvOmxvYWRlZFwiLCB0aGlzLmxvYWRlZCk7XG5cdFx0dGhpcy51aS5idXMuZ2V0KDApLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJpYWdvOm5hdmlnYXRlXCIsIHRoaXMubmF2aWdhdGUpO1xuXHR9LFxuXG5cdHBhc3RlZDogZnVuY3Rpb24oZSkge1xuXHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRpZiAoIWUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgdGhlcmUncyBhIHNlbGVjdGlvblxuXHRcdGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcblx0XHRpZiAoc2VsLnJhbmdlQ291bnQpIHtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHRcdGNvbnN0IHJhbmdlID0gc2VsLmdldFJhbmdlQXQoMCk7XG5cdFx0XHRyYW5nZS5kZWxldGVDb250ZW50cygpO1xuXHRcdFx0cmFuZ2UuaW5zZXJ0Tm9kZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlLm9yaWdpbmFsRXZlbnQuY2xpcGJvYXJkRGF0YS5nZXREYXRhKFwidGV4dC9wbGFpblwiKSkpO1xuXG5cdFx0XHRzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG5cdFx0fVxuXHR9LFxuXG5cdHNlbGVjdDogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0Y29uc3QgZWwgPSAkKGV2dC5jdXJyZW50VGFyZ2V0KTtcblxuXHRcdGlmICghZWwucHJvcChcImNvbnRlbnRlZGl0YWJsZVwiKSlcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcblx0XHRcdHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbFswXSk7XG5cdFx0XHRjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cdFx0XHRzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG5cdFx0XHRzZWwuYWRkUmFuZ2UocmFuZ2UpO1xuXHRcdH0sIDUwKTtcblx0fSxcblxuXHR1bnNlbGVjdDogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0d2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpO1xuXG5cdFx0Ly8gSWYgdGhpcyBlbGVtZW50IGlzIG5vdyBibGFuaywgd2UgbmVlZCB0byByZXNldCBpdFxuXHRcdGlmIChfLnRyaW0oJChldnQuY3VycmVudFRhcmdldCkudGV4dCgpKSA9PT0gXCJcIikge1xuXHRcdFx0c3dpdGNoIChldnQuY3VycmVudFRhcmdldC5pZCkge1xuXHRcdFx0XHRjYXNlIFwiaWFnby1oZWFkaW5nLXRleHRcIjpcblx0XHRcdFx0XHQkKGV2dC5jdXJyZW50VGFyZ2V0KS50ZXh0KFwiSW5zZXJ0IFF1ZXN0aW9uXCIpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJpYWdvLWhlbHAtY29udGVudC10ZXh0XCI6XG5cdFx0XHRcdFx0JChldnQuY3VycmVudFRhcmdldCkudGV4dChcIlRoaXMgaXMgcGxhY2Vob2xkZXIgZmVlZGJhY2s7IGNsaWNrIHRvIGVkaXRcIik7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHQkKGV2dC5jdXJyZW50VGFyZ2V0KS50ZXh0KFwiVGV4dFwiKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0Y2hhbmdlRmVlZGJhY2s6IGZ1bmN0aW9uKHN0YXRlKSB7XG5cdFx0aWYgKHRoaXMucHJldmlld01vZGUpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLm1vZGVsLmZlZWRiYWNrID0gc3RhdGU7XG5cdFx0dGhpcy51aS5mZWVkYmFjay5hdHRyKFwiY29udGVudGVkaXRhYmxlXCIsIHN0YXRlKTtcblxuXHRcdGlmICghdGhpcy5tb2RlbC5nZXQoXCJmZWVkYmFja1wiKSlcblx0XHRcdHRoaXMubW9kZWwuc2V0KFwiZmVlZGJhY2tcIiwgXCJUaGlzIGlzIHBsYWNlaG9sZGVyIGZlZWRiYWNrOyBjbGljayB0byBlZGl0XCIpO1xuXG5cdFx0aWYgKHN0YXRlKVxuXHRcdFx0dGhpcy51aS5mZWVkYmFjay5hZGRDbGFzcyhcImlhZ28tZWRpdGFibGUtZGFya1wiKS50ZXh0KHRoaXMubW9kZWwuZ2V0KFwiZmVlZGJhY2tcIikpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMudWkuZmVlZGJhY2sucmVtb3ZlQ2xhc3MoXCJpYWdvLWVkaXRhYmxlLWRhcmtcIik7XG5cdH0sXG5cblx0aGVhZGluZ0ltYWdlQ2xpY2s6IGZ1bmN0aW9uKGUpIHtcblx0XHRpZiAoZSAmJiAkKGUuY3VycmVudFRhcmdldCkuaGFzQ2xhc3MoXCJpbWFnZUNob29zZXJcIikpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLmhlYWRpbmdJbWFnZSA9IEltYWdlQ2hvb3Nlci5jcmVhdGUoJChcIi5pbWFnZS1wbGFjZWhvbGRlclwiLCB0aGlzLmVsKSwge1xuXHRcdFx0anBlZzogdHJ1ZSxcblx0XHRcdG1heEhlaWdodDogMjUwLFxuXHRcdFx0bWF4V2lkdGg6IDMwMCxcblx0XHRcdHRyYW5zY29kZTogdHJ1ZSxcblx0XHR9KTtcblxuXHRcdHRoaXMudWkuaGVhZGluZ0ltYWdlRGVsLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLm1vZGVsLnNldCh7IGV4cGVjdFF1ZXN0aW9uSW1hZ2U6IHRydWUgfSk7XG5cdH0sXG5cblx0ZGVsZXRlSGVhZGluZ0ltYWdlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5oZWFkaW5nSW1hZ2UpIHtcblx0XHRcdHRoaXMuaGVhZGluZ0ltYWdlLmRlc3Ryb3koKTtcblx0XHRcdHRoaXMuaGVhZGluZ0ltYWdlID0gbnVsbDtcblx0XHR9XG5cblx0XHQkKFwiLmltYWdlLXBsYWNlaG9sZGVyXCIsIHRoaXMuZWwpLnJlcGxhY2VXaXRoKCc8ZGl2IGNsYXNzPVwiaW1hZ2UtcGxhY2Vob2xkZXJcIj5DbGljayB0byBhZGQgYW4gb3B0aW9uYWwgaW1hZ2UgdG8gdGhlIHRpdGxlPC9kaXY+Jyk7XG5cdFx0dGhpcy51aS5oZWFkaW5nSW1hZ2VEZWwuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMubW9kZWwuc2V0KHsgZXhwZWN0UXVlc3Rpb25JbWFnZTogZmFsc2UgfSk7XG5cdH0sXG5cblx0aWFnb0xvYWRlZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5iaW5kVUlFbGVtZW50cygpO1xuXHRcdHRoaXMuZGVsZWdhdGVFdmVudHMoKTtcblx0XHR0aGlzLmNoYW5nZVF1ZXN0aW9uTWFyaygpO1xuXHRcdC8vIENoZWNrIGZvciBmZWVkYmFjayBtb2RlXG5cdFx0aWYgKHRoaXMuYXNzZXNzbWVudC5nZXQoXCJmZWVkYmFja1wiKSlcblx0XHRcdHRoaXMuY2hhbmdlRmVlZGJhY2sodHJ1ZSk7XG5cblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJleHBlY3RRdWVzdGlvbkltYWdlXCIpICYmICF0aGlzLnByZXZpZXdNb2RlKSB7XG5cdFx0XHR0aGlzLmhlYWRpbmdJbWFnZUNsaWNrKCk7XG5cdFx0XHR0aGlzLmhlYWRpbmdJbWFnZS5zZXRJbWFnZSh0aGlzLm1vZGVsLmdldChcInF1ZXN0aW9uSW1hZ2VcIikpO1xuXHRcdH1cblx0XHR0aGlzLmNoYW5nZVF1ZXN0aW9uTWFyaygpO1xuXHR9LFxuXG5cdGlhZ29OYXZpZ2F0ZTogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0Ly8gU2F2ZSB0aGlzIG1vZGVsLCB0aGVuIG5hdmlnYXRlXG5cdFx0aWYgKHRoaXMuc2F2ZSgpKVxuXHRcdFx0dGhpcy50cmlnZ2VyKFwiaWFnbzpuYXZpZ2F0ZVwiLCBldnQpO1xuXG5cdFx0dGhpcy5jaGFuZ2VRdWVzdGlvbk1hcmsoKTtcblx0fSxcblxuXHRzYXZlOiBmdW5jdGlvbihub1ZhbGlkYXRpb24sIG5vRmVlZGJhY2spIHtcblx0XHRpZiAoIXRoaXMudWkuaGVhZGluZ1RleHQudGV4dClcblx0XHRcdHJldHVybjtcblxuXHRcdGNvbnN0IHF1ZXN0aW9uID0gXy50cmltKHRoaXMudWkuaGVhZGluZ1RleHQudGV4dCgpKTtcblx0XHRjb25zdCBmZWVkYmFjayA9IHRoaXMuYXNzZXNzbWVudC5nZXQoXCJmZWVkYmFja1wiKSAmJiAhbm9GZWVkYmFjayA/IF8udHJpbSh0aGlzLnVpLmZlZWRiYWNrLnRleHQoKSkgOiBcIlwiO1xuXHRcdGxldCBxdWVzdGlvbkltYWdlID0gbnVsbDtcblxuXHRcdGlmICh0aGlzLmhlYWRpbmdJbWFnZSlcblx0XHRcdHF1ZXN0aW9uSW1hZ2UgPSB0aGlzLmhlYWRpbmdJbWFnZS5nZXRJbWFnZSgpO1xuXG5cdFx0dGhpcy5tb2RlbC5zZXQoe1xuXHRcdFx0ZmVlZGJhY2s6IGZlZWRiYWNrLFxuXHRcdFx0cG90ZW50aWFsU2NvcmU6IHBhcnNlSW50KHRoaXMudWkucG90ZW50aWFsU2NvcmUudmFsKCksIDEwKSxcblx0XHRcdHF1ZXN0aW9uOiBxdWVzdGlvbixcblx0XHRcdHF1ZXN0aW9uSW1hZ2U6IHF1ZXN0aW9uSW1hZ2UsXG5cdFx0XHRleHBlY3RRdWVzdGlvbkltYWdlOiBxdWVzdGlvbkltYWdlICE9PSBudWxsLFxuXHRcdH0pO1xuXG5cdFx0aWYgKCFub1ZhbGlkYXRpb24pXG5cdFx0XHRyZXR1cm4gdGhpcy5tb2RlbC5pc1ZhbGlkKCk7XG5cdH0sXG5cblx0dmFsaWRhdGlvbkZhaWw6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLnByZXZpZXdNb2RlKVxuXHRcdFx0cmV0dXJuO1xuXHRcdC8vIEJ1aWxkIHRoZSBlcnJvcnMgdG8gc2hvd1xuXHRcdGNvbnN0IGVycnMgPSB0aGlzLm1vZGVsLnZhbGlkYXRpb25FcnJvci5zbGljZSgwKTtcblx0XHRlcnJzLnVuc2hpZnQoXCI8c3Ryb25nPlRoZSBjdXJyZW50IHF1ZXN0aW9uIGhhcyBlcnJvcnMgYW5kIGNhbm5vdCBiZSBzYXZlZDo8L3N0cm9uZz48YnIvPlwiKTtcblxuXHRcdHRoaXMudWkuZXJyb3JzLnJlbW92ZUNsYXNzKFwiaGlkZVwiKS5jaGlsZHJlbihcIi5kZXRhaWxcIikuaHRtbChlcnJzLmpvaW4oXCI8YnIvPiZtaWRkb3Q7Jm5ic3A7XCIpKTtcblx0fSxcblxuXHRjbG9zZUVycm9yOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmVycm9ycy5hZGRDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0Y2hhbmdlUXVlc3Rpb25NYXJrOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoJChcIi5tYXRjaC1vcHRpb25zLmxlZnRcIikubGVuZ3RoID4gMClcblx0XHRcdHJldHVybjtcblxuXHRcdGxldCBtYXJrID0gdGhpcy5tb2RlbC5nZXQoXCJwb3RlbnRpYWxTY29yZVwiKTtcblxuXHRcdGlmIChfLmlzU3RyaW5nKHRoaXMudWkucG90ZW50aWFsU2NvcmUpID09PSBmYWxzZSkge1xuXHRcdFx0aWYgKF8uaXNBcnJheSh0aGlzLnVpLnBvdGVudGlhbFNjb3JlKSlcblx0XHRcdFx0bWFyayA9IHRoaXMudWkucG90ZW50aWFsU2NvcmUudmFsKCkgPyB0aGlzLnVpLnBvdGVudGlhbFNjb3JlLnZhbCgpIDogdGhpcy5tb2RlbC5nZXQoXCJwb3RlbnRpYWxTY29yZVwiKTtcblxuXHRcdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwicG90ZW50aWFsU2NvcmVcIikgIT09IHRoaXMudWkucG90ZW50aWFsU2NvcmUudmFsKCkpXG5cdFx0XHRcdG1hcmsgPSB0aGlzLnVpLnBvdGVudGlhbFNjb3JlLnZhbCgpO1xuXG5cdFx0XHRtYXJrID0gbWFyayA9PT0gMCB8fCBtYXJrID09PSB1bmRlZmluZWQgPyAkKFwiLnF1ZXN0aW9uLWNvbnRlbnQgaW5wdXRbdHlwZT0nbnVtYmVyJ11cIikudmFsKCkgOiBtYXJrO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdG1hcmsgPSAwO1xuXHRcdH1cblx0XHQkKFwiLnF1ZXN0aW9uLW1hcmtcIikudGV4dChtYXJrKTtcblx0fSxcbn0pO1xuXG5Nb2RlbHNbXCIzXCJdID0gUXVlc3Rpb25Nb2RlbC5leHRlbmQoe1xuXHRpZEF0dHJpYnV0ZTogXCJpZFwiLFxuXG5cdGRlZmF1bHRzOiB7XG5cdFx0dHlwZTogMyxcblx0XHRxdWVzdGlvbjogXCJJbnNlcnQgUXVlc3Rpb25cIixcblx0XHRxdWVzdGlvbkltYWdlOiBudWxsLFxuXHRcdGV4cGVjdFF1ZXN0aW9uSW1hZ2U6IGZhbHNlLFxuXHRcdGZlZWRiYWNrOiBcIlRoaXMgaXMgcGxhY2Vob2xkZXIgZmVlZGJhY2s7IGNsaWNrIHRvIGVkaXRcIixcblx0XHRsZWZ0OiBbe1xuXHRcdFx0aWQ6IDEsXG5cdFx0XHR0eXBlOiBcInRleHRcIixcblx0XHRcdGNvbnRlbnQ6IFwiUXVlc3Rpb24gMSBoZXJlXCIsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRpZDogMixcblx0XHRcdHR5cGU6IFwidGV4dFwiLFxuXHRcdFx0Y29udGVudDogXCJRdWVzdGlvbiAyIGhlcmVcIixcblx0XHR9XSxcblx0XHRyaWdodDogW3tcblx0XHRcdGlkOiAxLFxuXHRcdFx0dHlwZTogXCJ0ZXh0XCIsXG5cdFx0XHRjb250ZW50OiBcIkFuc3dlciAxIGhlcmVcIixcblx0XHR9LFxuXHRcdHtcblx0XHRcdGlkOiAyLFxuXHRcdFx0dHlwZTogXCJ0ZXh0XCIsXG5cdFx0XHRjb250ZW50OiBcIkFuc3dlciAyIGhlcmVcIixcblx0XHR9XSxcblx0XHRwb3RlbnRpYWxTY29yZTogMCxcblx0fSxcblxuXHR2YWxpZGF0ZTogZnVuY3Rpb24oYXR0cnMpIHtcblx0XHRsZXQgZXJyID0gW107XG5cblx0XHRlcnIgPSBlcnIuY29uY2F0KHRoaXMudmFsaWRhdGVCYXNlKGF0dHJzKSk7XG5cblx0XHRpZiAoYXR0cnMubGVmdC5sZW5ndGggPCAyKVxuXHRcdFx0ZXJyLnB1c2goXCJZb3UgbXVzdCBhZGQgYXQgbGVhc3QgdHdvIHF1ZXN0aW9uIHBhaXJzXCIpO1xuXG5cdFx0aWYgKGF0dHJzLmxlZnQubGVuZ3RoICE9PSBhdHRycy5yaWdodC5sZW5ndGgpXG5cdFx0XHRlcnIucHVzaChcIlRoZSBsZWZ0IG9wdGlvbnMgbXVzdCBiZSBlcXVhbCB0byB0aGUgcmlnaHQgb3B0aW9ucy5cIik7XG5cblx0XHRpZiAoXy5zb21lKGF0dHJzLmxlZnQsIGEgPT4gIWEuY29udGVudCkpXG5cdFx0XHRlcnIucHVzaChcIllvdSBtdXN0IHNwZWNpZnkgdmFsaWQgY29udGVudCBmb3IgYWxsIHF1ZXN0aW9uc1wiKTtcblx0XHRpZiAoXy5zb21lKGF0dHJzLnJpZ2h0LCBhID0+ICFhLmNvbnRlbnQpKVxuXHRcdFx0ZXJyLnB1c2goXCJZb3UgbXVzdCBzcGVjaWZ5IHZhbGlkIGNvbnRlbnQgZm9yIGFsbCBxdWVzdGlvbnNcIik7XG5cblx0XHRpZiAoZXJyLmxlbmd0aCA+IDApXG5cdFx0XHRyZXR1cm4gZXJyO1xuXHR9LFxufSk7XG5cblF1ZXN0aW9uc1tcIjNcIl0gPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9hc3Nlc3NtZW50TW9kYWwubnVualwiKS5xdWVzdGlvbk1hcmt1cCxcblxuXHR1aToge1xuXHRcdGJ1czogXCIjaWFnby1hc3Nlc3NtZW50XCIsXG5cdFx0aGVhZGluZ1RleHQ6IFwiI2lhZ28taGVhZGluZy10ZXh0XCIsXG5cdFx0aGVhZGluZ0ltYWdlOiBcIiNpYWdvLXF1ZXN0aW9uLWltYWdlIC5pbWFnZS1wbGFjZWhvbGRlclwiLFxuXHRcdGhlYWRpbmdJbWFnZURlbDogXCIjaWFnby1xdWVzdGlvbi1pbWFnZSAuZGVsZXRlLWltYWdlXCIsXG5cdFx0cHJldkJ1dHRvbjogXCIjaWFnby1wcmV2aW91cy1xdWVzdGlvblwiLFxuXHRcdG5leHRCdXR0b246IFwiI2lhZ28tbmV4dC1xdWVzdGlvblwiLFxuXHRcdGZlZWRiYWNrOiBcIiNpYWdvLWhlbHAtY29udGVudC10ZXh0XCIsXG5cdFx0ZXJyb3JzOiBcIi5xdWVzdGlvbi1lcnJvcnNcIixcblx0XHRjbG9zZUVycm9yOiBcIi5xdWVzdGlvbi1lcnJvcnMgLmNsb3NlXCIsXG5cblx0XHRsZWZ0OiBcIiNsaXN0bGVmdFwiLFxuXHRcdHJpZ2h0OiBcIiNsaXN0cmlnaHRcIixcblxuXHRcdG9wdGlvblRleHQ6IFwiLm1hdGNoLW9wdGlvbnMgc3BhblwiLFxuXG5cdFx0cGxhY2Vob2xkZXI6IFwiLnBsYWNlaG9sZGVyXCIsXG5cdFx0dHlwZTogXCJkaXYuZm9ybWF0XCIsXG5cdFx0ZGVsZXRlcjogXCJkaXYuZGVsZXRhYmxlXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkub3B0aW9uXCI6IFwidG9nZ2xlQW5zd2VyXCIsXG5cdFx0XCJjbGljayBAdWkuaGVhZGluZ0ltYWdlXCI6IFwiaGVhZGluZ0ltYWdlQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5oZWFkaW5nSW1hZ2VEZWxcIjogXCJkZWxldGVIZWFkaW5nSW1hZ2VcIixcblxuXHRcdFwiY2xpY2sgQHVpLmNsb3NlRXJyb3JcIjogXCJjbG9zZUVycm9yXCIsXG5cdFx0XCJjbGljayBAdWkudHlwZVwiOiBcImNoYW5nZVR5cGVcIixcblx0XHRcImNsaWNrIEB1aS5kZWxldGVyXCI6IFwiZGVsZXRlT3B0aW9uXCIsXG5cblx0XHQvL1wicGFzdGUgQHVpLmhlYWRpbmdUZXh0XCI6IFwicGFzdGVkXCIsXG5cdFx0Ly9cInBhc3RlIEB1aS5mZWVkYmFja1wiOiBcInBhc3RlZFwiLFxuXHRcdC8vXCJwYXN0ZSBAdWkub3B0aW9uVGV4dFwiOiBcInBhc3RlZFwiLFxuXG5cdFx0XCJmb2N1cyBAdWkuZmVlZGJhY2tcIjogXCJzZWxlY3RcIixcblx0XHRcImZvY3VzIEB1aS5oZWFkaW5nVGV4dFwiOiBcInNlbGVjdFwiLFxuXHRcdFwiZm9jdXMgQHVpLm9wdGlvblRleHRcIjogXCJzZWxlY3RcIixcblxuXHRcdFwiYmx1ciBAdWkuaGVhZGluZ1RleHRcIjogXCJ1bnNlbGVjdFwiLFxuXHRcdFwiYmx1ciBAdWkuZmVlZGJhY2tcIjogXCJ1bnNlbGVjdFwiLFxuXHRcdFwiYmx1ciBAdWkub3B0aW9uVGV4dFwiOiBcInVuc2VsZWN0XCIsXG5cdH0sXG5cblx0bW9kZWxFdmVudHM6IHtcblx0XHRpbnZhbGlkOiBcInZhbGlkYXRpb25GYWlsXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMubW9kZWwgPSBvcHRpb25zLnF1ZXN0aW9uIHx8IG5ldyBNb2RlbHNbXCIzXCJdKHsgaWQ6IG9wdGlvbnMuaWQgfSk7XG5cblx0XHR0aGlzLmJpbmRFdmVudHModGhpcy5tb2RlbCwgdGhpcy5tb2RlbEV2ZW50cyk7XG5cblx0XHR0aGlzLmFzc2Vzc21lbnQgPSBvcHRpb25zLmFzc2Vzc21lbnQ7XG5cdFx0dGhpcy5wcmV2aWV3TW9kZSA9IG9wdGlvbnMucHJldmlld01vZGU7XG5cblx0XHR0aGlzLnF1ZXN0aW9uSUQgPSBfLm1heEJ5KHRoaXMubW9kZWwuZ2V0KFwibGVmdFwiKSwgeCA9PiB4LmlkKS5pZCArIDE7XG5cblx0XHR0aGlzLmxpc3RlblRvKFBhZ2UsIFwiY2hhbmdlOmZlZWRiYWNrXCIsIHRoaXMuY2hhbmdlRmVlZGJhY2suYmluZCh0aGlzKSk7XG5cblx0XHR0aGlzLnF1ZXN0aW9ucyA9IHsgbGVmdDoge30sIHJpZ2h0OiB7fSB9O1xuXG5cdFx0dGhpcy5sb2FkZWQgPSB0aGlzLmlhZ29Mb2FkZWQuYmluZCh0aGlzKTtcblx0XHR0aGlzLm5hdmlnYXRlID0gdGhpcy5pYWdvTmF2aWdhdGUuYmluZCh0aGlzKTtcblxuXHRcdCQoXCIucXVlc3Rpb24tbWFya1wiKS50ZXh0KCQoXCIubWF0Y2gtb3B0aW9ucy5sZWZ0XCIpLmxlbmd0aCk7XG5cdH0sXG5cblx0cGFzdGVkOiBmdW5jdGlvbihlKSB7XG5cdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRpZiAoIWUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0JChlLmN1cnJlbnRUYXJnZXQpLnRleHQoZS5vcmlnaW5hbEV2ZW50LmNsaXBib2FyZERhdGEuZ2V0RGF0YShcInRleHQvcGxhaW5cIikpO1xuXHR9LFxuXG5cdHNlbGVjdDogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0Y29uc3QgZWwgPSAkKGV2dC5jdXJyZW50VGFyZ2V0KTtcblx0XHRpZiAoIWVsLnByb3AoXCJjb250ZW50ZWRpdGFibGVcIikpXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHR3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG5cdFx0XHRyYW5nZS5zZWxlY3ROb2RlQ29udGVudHMoZWxbMF0pO1xuXHRcdFx0Y29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuXHRcdFx0c2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuXHRcdFx0c2VsLmFkZFJhbmdlKHJhbmdlKTtcblx0XHR9LCA1MCk7XG5cdH0sXG5cblx0dW5zZWxlY3Q6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKTtcblxuXHRcdC8vIElmIHRoaXMgZWxlbWVudCBpcyBub3cgYmxhbmssIHdlIG5lZWQgdG8gcmVzZXQgaXRcblx0XHRpZiAoXy50cmltKCQoZXZ0LmN1cnJlbnRUYXJnZXQpLnRleHQoKSkgPT09IFwiXCIpIHtcblx0XHRcdHN3aXRjaCAoZXZ0LmN1cnJlbnRUYXJnZXQuaWQpIHtcblx0XHRcdFx0Y2FzZSBcImlhZ28taGVhZGluZy10ZXh0XCI6XG5cdFx0XHRcdFx0JChldnQuY3VycmVudFRhcmdldCkudGV4dChcIkluc2VydCBRdWVzdGlvblwiKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiaWFnby1oZWxwLWNvbnRlbnQtdGV4dFwiOlxuXHRcdFx0XHRcdCQoZXZ0LmN1cnJlbnRUYXJnZXQpLnRleHQoXCJUaGlzIGlzIHBsYWNlaG9sZGVyIGZlZWRiYWNrOyBjbGljayB0byBlZGl0XCIpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0JChldnQuY3VycmVudFRhcmdldCkudGV4dChcIlRleHRcIik7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdHRvZ2dsZUFuc3dlcjogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0Y29uc3QgZWwgPSAkKFwiLmNoZWNrYWJsZVwiLCBldnQuY3VycmVudFRhcmdldCk7XG5cblx0XHRlbC50b2dnbGVDbGFzcyhcImZhLWNoZWNrIGZhLXRpbWVzXCIpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmJ1cy5nZXQoMCkuYWRkRXZlbnRMaXN0ZW5lcihcImlhZ286bG9hZGVkXCIsIHRoaXMubG9hZGVkKTtcblx0XHR0aGlzLnVpLmJ1cy5nZXQoMCkuYWRkRXZlbnRMaXN0ZW5lcihcImlhZ286bmF2aWdhdGVcIiwgdGhpcy5uYXZpZ2F0ZSk7XG5cblx0XHR0aGlzLnVpLmZlZWRiYWNrLmF0dHIoXCJjb250ZW50ZWRpdGFibGVcIiwgdGhpcy5hc3Nlc3NtZW50LmdldChcImZlZWRiYWNrXCIpKTtcblx0XHR0aGlzLm1vZGVsLmZlZWRiYWNrID0gdGhpcy5hc3Nlc3NtZW50LmdldChcImZlZWRiYWNrXCIpO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy50cmlnZ2VyKFwiZGVzdHJveWVkXCIsIHRoaXMubW9kZWwpO1xuXG5cdFx0Xy5lYWNoKHRoaXMucXVlc3Rpb25zLmxlZnQsIGVsID0+IGVsLmRlc3Ryb3koKSk7XG5cdFx0Xy5lYWNoKHRoaXMucXVlc3Rpb25zLnJpZ2h0LCBlbCA9PiBlbC5kZXN0cm95KCkpO1xuXG5cdFx0dGhpcy51aS5idXMuZ2V0KDApLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJpYWdvOmxvYWRlZFwiLCB0aGlzLmxvYWRlZCk7XG5cdFx0dGhpcy51aS5idXMuZ2V0KDApLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJpYWdvOm5hdmlnYXRlXCIsIHRoaXMubmF2aWdhdGUpO1xuXHR9LFxuXG5cdGNoYW5nZUZlZWRiYWNrOiBmdW5jdGlvbihzdGF0ZSkge1xuXHRcdGlmICh0aGlzLnByZXZpZXdNb2RlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5tb2RlbC5mZWVkYmFjayA9IHN0YXRlO1xuXHRcdHRoaXMudWkuZmVlZGJhY2suYXR0cihcImNvbnRlbnRlZGl0YWJsZVwiLCBzdGF0ZSk7XG5cblx0XHRpZiAoIXRoaXMubW9kZWwuZ2V0KFwiZmVlZGJhY2tcIikpXG5cdFx0XHR0aGlzLm1vZGVsLnNldChcImZlZWRiYWNrXCIsIFwiVGhpcyBpcyBwbGFjZWhvbGRlciBmZWVkYmFjazsgY2xpY2sgdG8gZWRpdFwiKTtcblxuXHRcdGlmIChzdGF0ZSlcblx0XHRcdHRoaXMudWkuZmVlZGJhY2suYWRkQ2xhc3MoXCJpYWdvLWVkaXRhYmxlLWRhcmtcIikudGV4dCh0aGlzLm1vZGVsLmdldChcImZlZWRiYWNrXCIpKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnVpLmZlZWRiYWNrLnJlbW92ZUNsYXNzKFwiaWFnby1lZGl0YWJsZS1kYXJrXCIpO1xuXHR9LFxuXG5cdGhlYWRpbmdJbWFnZUNsaWNrOiBmdW5jdGlvbihlKSB7XG5cdFx0aWYgKGUgJiYgJChlLmN1cnJlbnRUYXJnZXQpLmhhc0NsYXNzKFwiaW1hZ2VDaG9vc2VyXCIpKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5oZWFkaW5nSW1hZ2UgPSBJbWFnZUNob29zZXIuY3JlYXRlKCQoXCIuaW1hZ2UtcGxhY2Vob2xkZXJcIiwgdGhpcy5lbCksIHtcblx0XHRcdGpwZWc6IHRydWUsXG5cdFx0XHRtYXhIZWlnaHQ6IDI1MCxcblx0XHRcdG1heFdpZHRoOiAzMDAsXG5cdFx0XHR0cmFuc2NvZGU6IHRydWUsXG5cdFx0fSk7XG5cblx0XHR0aGlzLnVpLmhlYWRpbmdJbWFnZURlbC5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy5tb2RlbC5zZXQoeyBleHBlY3RRdWVzdGlvbkltYWdlOiB0cnVlIH0pO1xuXHR9LFxuXG5cdGRlbGV0ZUhlYWRpbmdJbWFnZTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuaGVhZGluZ0ltYWdlKSB7XG5cdFx0XHR0aGlzLmhlYWRpbmdJbWFnZS5kZXN0cm95KCk7XG5cdFx0XHR0aGlzLmhlYWRpbmdJbWFnZSA9IG51bGw7XG5cdFx0fVxuXG5cdFx0JChcIi5pbWFnZS1wbGFjZWhvbGRlclwiLCB0aGlzLmVsKS5yZXBsYWNlV2l0aCgnPGRpdiBjbGFzcz1cImltYWdlLXBsYWNlaG9sZGVyXCI+Q2xpY2sgdG8gYWRkIGFuIG9wdGlvbmFsIGltYWdlIHRvIHRoZSB0aXRsZTwvZGl2PicpO1xuXHRcdHRoaXMudWkuaGVhZGluZ0ltYWdlRGVsLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLm1vZGVsLnNldCh7IGV4cGVjdFF1ZXN0aW9uSW1hZ2U6IGZhbHNlIH0pO1xuXHR9LFxuXG5cdGlhZ29Mb2FkZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuYmluZFVJRWxlbWVudHMoKTtcblx0XHR0aGlzLmRlbGVnYXRlRXZlbnRzKCk7XG5cblx0XHQvLyBDaGVjayBmb3IgaW1hZ2VzIGFuZCBjb25zdHJ1Y3QgYWNjb3JkaW5nbHlcblx0XHRfLmVhY2godGhpcy5tb2RlbC5nZXQoXCJsZWZ0XCIpLCBlbCA9PiB7XG5cdFx0XHRpZiAoZWwudHlwZSA9PT0gXCJpbWFnZVwiKSB7XG5cdFx0XHRcdHRoaXMucXVlc3Rpb25zLmxlZnRbZWwuaWQudG9TdHJpbmcoKV0gPSBJbWFnZUNob29zZXIuY3JlYXRlKCQoXCIubWF0Y2gtb3B0aW9ucy5sZWZ0W2RhdGEtdmFsdWU9J1wiICsgZWwuaWQgKyBcIiddXCIpLmNoaWxkcmVuKFwic3BhblwiKSwge1xuXHRcdFx0XHRcdGpwZWc6IHRydWUsXG5cdFx0XHRcdFx0bWF4SGVpZ2h0OiAzMDAsXG5cdFx0XHRcdFx0bWF4V2lkdGg6IDMwMCxcblx0XHRcdFx0XHR0cmFuc2NvZGU6IHRydWUsXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHRoaXMucXVlc3Rpb25zLmxlZnRbZWwuaWQudG9TdHJpbmcoKV0uc2V0SW1hZ2UoZWwuY29udGVudCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRfLmVhY2godGhpcy5tb2RlbC5nZXQoXCJyaWdodFwiKSwgZWwgPT4ge1xuXHRcdFx0aWYgKGVsLnR5cGUgPT09IFwiaW1hZ2VcIikge1xuXHRcdFx0XHR0aGlzLnF1ZXN0aW9ucy5yaWdodFtlbC5pZC50b1N0cmluZygpXSA9IEltYWdlQ2hvb3Nlci5jcmVhdGUoJChcIi5tYXRjaC1vcHRpb25zLnJpZ2h0W2RhdGEtdmFsdWU9J1wiICsgZWwuaWQgKyBcIiddXCIpLmNoaWxkcmVuKFwic3BhblwiKSwge1xuXHRcdFx0XHRcdGpwZWc6IHRydWUsXG5cdFx0XHRcdFx0bWF4SGVpZ2h0OiAzMDAsXG5cdFx0XHRcdFx0bWF4V2lkdGg6IDMwMCxcblx0XHRcdFx0XHR0cmFuc2NvZGU6IHRydWUsXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHRoaXMucXVlc3Rpb25zLnJpZ2h0W2VsLmlkLnRvU3RyaW5nKCldLnNldEltYWdlKGVsLmNvbnRlbnQpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwiZXhwZWN0UXVlc3Rpb25JbWFnZVwiKSAmJiAhdGhpcy5wcmV2aWV3TW9kZSkge1xuXHRcdFx0dGhpcy5oZWFkaW5nSW1hZ2VDbGljaygpO1xuXHRcdFx0dGhpcy5oZWFkaW5nSW1hZ2Uuc2V0SW1hZ2UodGhpcy5tb2RlbC5nZXQoXCJxdWVzdGlvbkltYWdlXCIpKTtcblx0XHR9XG5cblx0XHQvLyBDaGVjayBmb3IgZmVlZGJhY2sgbW9kZVxuXHRcdGlmICh0aGlzLmFzc2Vzc21lbnQuZ2V0KFwiZmVlZGJhY2tcIikpXG5cdFx0XHR0aGlzLmNoYW5nZUZlZWRiYWNrKHRydWUpO1xuXG5cdFx0dGhpcy51aS5wbGFjZWhvbGRlci5vbihcImNsaWNrXCIsIHRoaXMuYWRkT3B0aW9uLmJpbmQodGhpcykpO1xuXG5cdFx0JChcIi5xdWVzdGlvbi1tYXJrXCIpLnRleHQoJChcIi5tYXRjaC1vcHRpb25zLmxlZnRcIikubGVuZ3RoKTtcblxuXHRcdGlmICgkKFwiLm1hdGNoLW9wdGlvbnMubGVmdFwiKS5sZW5ndGggPiAxMSlcblx0XHRcdCQoXCIucGxhY2Vob2xkZXJcIikuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdGVsc2Vcblx0XHRcdCQoXCIucGxhY2Vob2xkZXJcIikucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdGlhZ29OYXZpZ2F0ZTogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0Ly8gU2F2ZSB0aGlzIG1vZGVsLCB0aGVuIG5hdmlnYXRlXG5cdFx0aWYgKHRoaXMuc2F2ZSgpKVxuXHRcdFx0dGhpcy50cmlnZ2VyKFwiaWFnbzpuYXZpZ2F0ZVwiLCBldnQpO1xuXHR9LFxuXG5cdHNhdmU6IGZ1bmN0aW9uKG5vVmFsaWRhdGlvbiwgbm9GZWVkYmFjaykge1xuXHRcdGlmICghdGhpcy51aS5oZWFkaW5nVGV4dC50ZXh0KVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0Y29uc3QgbGVmdCA9ICQoXCIubWF0Y2gtb3B0aW9uc1wiLCB0aGlzLnVpLmxlZnQpO1xuXHRcdGNvbnN0IHJpZ2h0ID0gJChcIi5tYXRjaC1vcHRpb25zXCIsIHRoaXMudWkucmlnaHQpO1xuXG5cdFx0Y29uc3QgcXVlc3Rpb24gPSBfLnRyaW0odGhpcy51aS5oZWFkaW5nVGV4dC50ZXh0KCkpO1xuXHRcdGNvbnN0IGZlZWRiYWNrID0gdGhpcy5hc3Nlc3NtZW50LmdldChcImZlZWRiYWNrXCIpICYmICFub0ZlZWRiYWNrID8gXy50cmltKHRoaXMudWkuZmVlZGJhY2sudGV4dCgpKSA6IFwiXCI7XG5cdFx0bGV0IHF1ZXN0aW9uSW1hZ2UgPSBudWxsO1xuXG5cdFx0aWYgKHRoaXMuaGVhZGluZ0ltYWdlKVxuXHRcdFx0cXVlc3Rpb25JbWFnZSA9IHRoaXMuaGVhZGluZ0ltYWdlLmdldEltYWdlKCk7XG5cblx0XHR0aGlzLm1vZGVsLnNldCh7XG5cdFx0XHRxdWVzdGlvbjogcXVlc3Rpb24sXG5cdFx0XHRxdWVzdGlvbkltYWdlOiBxdWVzdGlvbkltYWdlLFxuXHRcdFx0ZXhwZWN0UXVlc3Rpb25JbWFnZTogcXVlc3Rpb25JbWFnZSAhPT0gbnVsbCxcblx0XHRcdGZlZWRiYWNrOiBmZWVkYmFjayxcblx0XHRcdGxlZnQ6IF8ubWFwKGxlZnQudG9BcnJheSgpLCBlbCA9PiB7XG5cdFx0XHRcdGNvbnN0IGVsZW1lbnQgPSAkKGVsKTtcblx0XHRcdFx0Y29uc3Qgc3BhbiA9IGVsZW1lbnQuY2hpbGRyZW4oXCJzcGFuXCIpO1xuXG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0aWQ6IHBhcnNlSW50KGVsZW1lbnQuZGF0YShcInZhbHVlXCIpLCAxMCksXG5cdFx0XHRcdFx0dHlwZTogc3Bhbi5oYXNDbGFzcyhcImltYWdlQ2hvb3NlclwiKSA/IFwiaW1hZ2VcIiA6IFwidGV4dFwiLFxuXHRcdFx0XHRcdGNvbnRlbnQ6IHNwYW4uaGFzQ2xhc3MoXCJpbWFnZUNob29zZXJcIikgPyB0aGlzLnF1ZXN0aW9ucy5sZWZ0W2VsZW1lbnQuZGF0YShcInZhbHVlXCIpXS5nZXRJbWFnZSgpIDogc3Bhbi50ZXh0KCksXG5cdFx0XHRcdH07XG5cdFx0XHR9KSxcblx0XHRcdHJpZ2h0OiBfLm1hcChyaWdodC50b0FycmF5KCksIGVsID0+IHtcblx0XHRcdFx0Y29uc3QgZWxlbWVudCA9ICQoZWwpO1xuXHRcdFx0XHRjb25zdCBzcGFuID0gZWxlbWVudC5jaGlsZHJlbihcInNwYW5cIik7XG5cblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRpZDogcGFyc2VJbnQoZWxlbWVudC5kYXRhKFwidmFsdWVcIiksIDEwKSxcblx0XHRcdFx0XHR0eXBlOiBzcGFuLmhhc0NsYXNzKFwiaW1hZ2VDaG9vc2VyXCIpID8gXCJpbWFnZVwiIDogXCJ0ZXh0XCIsXG5cdFx0XHRcdFx0Y29udGVudDogc3Bhbi5oYXNDbGFzcyhcImltYWdlQ2hvb3NlclwiKSA/IHRoaXMucXVlc3Rpb25zLnJpZ2h0W2VsZW1lbnQuZGF0YShcInZhbHVlXCIpXS5nZXRJbWFnZSgpIDogc3Bhbi50ZXh0KCksXG5cdFx0XHRcdH07XG5cdFx0XHR9KSxcblx0XHR9KTtcblxuXHRcdHRoaXMubW9kZWwuc2V0KHsgcG90ZW50aWFsU2NvcmU6IHRoaXMubW9kZWwuZ2V0KFwibGVmdFwiKS5sZW5ndGggfSk7XG5cblx0XHRpZiAoIW5vVmFsaWRhdGlvbilcblx0XHRcdHJldHVybiB0aGlzLm1vZGVsLmlzVmFsaWQoKTtcblx0fSxcblxuXHR2YWxpZGF0aW9uRmFpbDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMucHJldmlld01vZGUpXG5cdFx0XHRyZXR1cm47XG5cdFx0Ly8gQnVpbGQgdGhlIGVycm9ycyB0byBzaG93XG5cdFx0Y29uc3QgZXJycyA9IHRoaXMubW9kZWwudmFsaWRhdGlvbkVycm9yLnNsaWNlKDApO1xuXHRcdGVycnMudW5zaGlmdChcIjxzdHJvbmc+VGhlIGN1cnJlbnQgcXVlc3Rpb24gaGFzIGVycm9ycyBhbmQgY2Fubm90IGJlIHNhdmVkOjwvc3Ryb25nPjxici8+XCIpO1xuXG5cdFx0dGhpcy51aS5lcnJvcnMucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpLmNoaWxkcmVuKFwiLmRldGFpbFwiKS5odG1sKGVycnMuam9pbihcIjxici8+Jm1pZGRvdDsmbmJzcDtcIikpO1xuXHR9LFxuXG5cdGNsb3NlRXJyb3I6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkuZXJyb3JzLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRlZGl0Q2xpY2s6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRldnQucHJldmVudERlZmF1bHQoKTtcblx0fSxcblxuXHRjaGFuZ2VUeXBlOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0ZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHQvLyBHZXQgdGhlIHRoaW5nIHdlIGNsaWNrZWQgb25cblx0XHRjb25zdCBlbCA9ICQoZXZ0LmN1cnJlbnRUYXJnZXQpLnBhcmVudHMoXCJkaXYubWF0Y2gtb3B0aW9uc1wiKTtcblxuXHRcdGNvbnN0IHNpZGUgPSBlbC5oYXNDbGFzcyhcImxlZnRcIikgPyBcImxlZnRcIiA6IFwicmlnaHRcIjtcblxuXHRcdC8vIENoYW5nZSBpdHMgdHlwZVxuXHRcdGlmIChldnQuY3VycmVudFRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoXCJmYS1pbWFnZVwiKSkge1xuXHRcdFx0Ly8gVHVybiBpdCBpbnRvIGFuIGltYWdlXG5cdFx0XHR0aGlzLnF1ZXN0aW9uc1tzaWRlXVtlbC5kYXRhKFwidmFsdWVcIildID0gSW1hZ2VDaG9vc2VyLmNyZWF0ZShlbC5jaGlsZHJlbihcInNwYW5cIiksIHsgdHJhbnNjb2RlOiB0cnVlLCBqcGVnOiB0cnVlLCBtYXhIZWlnaHQ6IDMwMCwgbWF4V2lkdGg6IDMwMCB9KTtcblx0XHRcdGVsLmNoaWxkcmVuKFwic3BhblwiKS5hdHRyKFwiY29udGVudGVkaXRhYmxlXCIsIGZhbHNlKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHQvLyBUdXJuIGl0IGludG8gdGV4dFxuXHRcdFx0dGhpcy5xdWVzdGlvbnNbc2lkZV1bZWwuZGF0YShcInZhbHVlXCIpXS5kZXN0cm95KCk7XG5cblx0XHRcdGVsLmNoaWxkcmVuKFwic3BhblwiKS50ZXh0KFwiVGV4dCBoZXJlXCIpLmF0dHIoXCJjb250ZW50ZWRpdGFibGVcIiwgdHJ1ZSk7XG5cdFx0fVxuXG5cdFx0JChldnQuY3VycmVudFRhcmdldCkudG9nZ2xlQ2xhc3MoXCJmYS1pbWFnZSBmYS1maWxlLWFsdFwiKTtcblx0fSxcblxuXHRhZGRPcHRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkubGVmdC5hcHBlbmQoYDxkaXYgY2xhc3M9XCJtYXRjaC1vcHRpb25zIGxlZnRcIiBkYXRhLW1hdGNoPVwiMFwiIGRhdGEtY29ycmVjdG1hdGNoPVwiMFwiIGRhdGEtc2VsZWN0ZWQ9XCJmYWxzZVwiIGRhdGEtY29sdW1uPVwibGVmdFwiIGRhdGEtdmFsdWU9XCIke3RoaXMucXVlc3Rpb25JRH1cIj5cblx0XHRcdDxzcGFuIGNvbnRlbnRlZGl0YWJsZT1cInRydWVcIj5RdWVzdGlvbiBoZXJlPC9zcGFuPjxkaXYgY2xhc3M9XCJib3JkZXJcIj48L2Rpdj48ZGl2IGNsYXNzPVwib3B0aW9uLWhvc3RcIj48ZGl2IGNsYXNzPVwiZm9ybWF0IGZhbCBmYS1pbWFnZVwiPjwvZGl2PjwvZGl2PjwvZGl2PmApO1xuXHRcdHRoaXMudWkucmlnaHQuYXBwZW5kKGA8ZGl2IGNsYXNzPVwibWF0Y2gtb3B0aW9ucyByaWdodFwiIGRhdGEtbWF0Y2g9XCIwXCIgZGF0YS1jb3JyZWN0bWF0Y2g9XCIwXCIgZGF0YS1zZWxlY3RlZD1cImZhbHNlXCIgZGF0YS1jb2x1bW49XCJyaWdodFwiIGRhdGEtdmFsdWU9XCIke3RoaXMucXVlc3Rpb25JRH1cIj5cblx0XHRcdDxkaXYgY2xhc3M9XCJib3JkZXJcIj48L2Rpdj48c3BhbiBjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCI+QW5zd2VyIGhlcmU8L3NwYW4+PGRpdiBjbGFzcz1cIm9wdGlvbi1ob3N0XCI+PGRpdiBjbGFzcz1cImZvcm1hdCBmYWwgZmEtaW1hZ2VcIj48L2Rpdj5cblx0XHRcdDxkaXYgY2xhc3M9XCJkZWxldGFibGUgZmFsIGZhLXRyYXNoLWFsdFwiPjwvZGl2PjwvZGl2PjwvZGl2PmApO1xuXG5cdFx0dGhpcy5xdWVzdGlvbklEKys7XG5cblx0XHQvLyBJZiB0aGVyZSBhcmUgMTIgb3B0aW9ucywgaGlkZSB0aGUgcGxhY2Vob2xkZXJcblx0XHRpZiAoJChcIi5tYXRjaC1vcHRpb25zXCIsIHRoaXMudWkubGVmdCkubGVuZ3RoID49IDEyKVxuXHRcdFx0JChcIi5wbGFjZWhvbGRlclwiLCB0aGlzLmVsKS5hZGRDbGFzcyhcImludmlzaWJsZVwiKTtcblxuXHRcdCQoXCIucXVlc3Rpb24tbWFya1wiKS50ZXh0KHBhcnNlSW50KCQoXCIucXVlc3Rpb24tbWFya1wiKS50ZXh0KCksIDEwKSArIDEpO1xuXHR9LFxuXG5cdGRlbGV0ZU9wdGlvbjogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0Ly8gSWYgdGhlcmUgYXJlIG9ubHkgdHdvIG9wdGlvbnMgbGVmdCwgZG9uJ3QgYWxsb3cgZGVsZXRpb25cblx0XHRpZiAoJChcIi5tYXRjaC1vcHRpb25zXCIsIHRoaXMudWkubGVmdCkubGVuZ3RoID4gMiB8fCAkKFwiLm1hdGNoLW9wdGlvbnNcIiwgdGhpcy51aS5yaWdodCkubGVuZ3RoID4gMikge1xuXHRcdFx0Ly8gR2V0IHRoZSB0aGluZyB3ZSBjbGlja2VkIG9uXG5cdFx0XHRjb25zdCBlbCA9ICQoZXZ0LmN1cnJlbnRUYXJnZXQpLnBhcmVudHMoXCJkaXYubWF0Y2gtb3B0aW9uc1wiKTtcblxuXHRcdFx0aWYgKGVsLmRhdGEoXCJ2YWx1ZVwiKSBpbiB0aGlzLnF1ZXN0aW9ucy5sZWZ0KVxuXHRcdFx0XHR0aGlzLnF1ZXN0aW9ucy5sZWZ0W2VsLmRhdGEoXCJ2YWx1ZVwiKV0uZGVzdHJveSgpO1xuXG5cdFx0XHRpZiAoZWwuZGF0YShcInZhbHVlXCIpIGluIHRoaXMucXVlc3Rpb25zLnJpZ2h0KVxuXHRcdFx0XHR0aGlzLnF1ZXN0aW9ucy5yaWdodFtlbC5kYXRhKFwidmFsdWVcIildLmRlc3Ryb3koKTtcblxuXHRcdFx0ZWwuYWRkKCQoXCJbZGF0YS12YWx1ZT0nXCIgKyBlbC5kYXRhKFwidmFsdWVcIikgKyBcIiddXCIsIHRoaXMudWkubGVmdCkpLnJlbW92ZSgpO1xuXG5cdFx0XHQkKFwiLnBsYWNlaG9sZGVyXCIsIHRoaXMuZWwpLnJlbW92ZUNsYXNzKFwiaW52aXNpYmxlXCIpO1xuXG5cdFx0XHQkKFwiLnF1ZXN0aW9uLW1hcmtcIikudGV4dChwYXJzZUludCgkKFwiLnF1ZXN0aW9uLW1hcmtcIikudGV4dCgpLCAxMCkgLSAxKTtcblx0XHR9XG5cblx0XHRpZiAoJChcIi5tYXRjaC1vcHRpb25zLmxlZnRcIikubGVuZ3RoID4gMTEpXG5cdFx0XHQkKFwiLnBsYWNlaG9sZGVyXCIpLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRlbHNlXG5cdFx0XHQkKFwiLnBsYWNlaG9sZGVyXCIpLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0fSxcbn0pO1xuXG5Nb2RlbHNbXCI0XCJdID0gUXVlc3Rpb25Nb2RlbC5leHRlbmQoe1xuXHRpZEF0dHJpYnV0ZTogXCJpZFwiLFxuXG5cdGRlZmF1bHRzOiB7XG5cdFx0dHlwZTogNCxcblx0XHRxdWVzdGlvbjogXCJJbnNlcnQgUXVlc3Rpb25cIixcblx0XHRxdWVzdGlvbkltYWdlOiBudWxsLFxuXHRcdGV4cGVjdFF1ZXN0aW9uSW1hZ2U6IGZhbHNlLFxuXHRcdGZlZWRiYWNrOiBcIlRoaXMgaXMgcGxhY2Vob2xkZXIgZmVlZGJhY2s7IGNsaWNrIHRvIGVkaXRcIixcblx0XHRhbnN3ZXI6IHtcblx0XHRcdHR5cGU6IFwiYmxhbmtcIixcblx0XHRcdGNvbnRlbnQ6IFwiVG8gbWFyayBzZWN0aW9ucyBvZiB0ZXh0IGZvciB0aGUgdXNlciB0byBlbnRlciwgc2VsZWN0IHNvbWUgdGV4dCBhbmQgdGhlbiBjbGljayBcXFwiTWFya1xcXCIuIFRvIHVuZG8sIGRvdWJsZS1jbGljayBhIHNlbGVjdGVkIGJsb2NrLlwiLFxuXHRcdH0sXG5cdFx0cG90ZW50aWFsU2NvcmU6IDAsXG5cdH0sXG5cblx0dmFsaWRhdGU6IGZ1bmN0aW9uKGF0dHJzKSB7XG5cdFx0bGV0IGVyciA9IFtdO1xuXG5cdFx0ZXJyID0gZXJyLmNvbmNhdCh0aGlzLnZhbGlkYXRlQmFzZShhdHRycykpO1xuXG5cdFx0aWYgKGF0dHJzLmFuc3dlci5jb250ZW50LnNlYXJjaCgvXFxbLis/XFxdL2dpKSA9PT0gLTEpXG5cdFx0XHRlcnIucHVzaChcIllvdSBtdXN0IG1hcmsgYXQgbGVhc3Qgb25lIHNlY3Rpb24gb2YgdGV4dCBmb3IgdGhlIHVzZXIgdG8gZW50ZXJcIik7XG5cblx0XHRpZiAoZXJyLmxlbmd0aCA+IDApXG5cdFx0XHRyZXR1cm4gZXJyO1xuXHR9LFxufSk7XG5cblF1ZXN0aW9uc1tcIjRcIl0gPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9hc3Nlc3NtZW50TW9kYWwubnVualwiKS5xdWVzdGlvbk1hcmt1cCxcblxuXHR1aToge1xuXHRcdGJ1czogXCIjaWFnby1hc3Nlc3NtZW50XCIsXG5cdFx0aGVhZGluZ1RleHQ6IFwiI2lhZ28taGVhZGluZy10ZXh0XCIsXG5cdFx0aGVhZGluZ0ltYWdlOiBcIiNpYWdvLXF1ZXN0aW9uLWltYWdlIC5pbWFnZS1wbGFjZWhvbGRlclwiLFxuXHRcdGhlYWRpbmdJbWFnZURlbDogXCIjaWFnby1xdWVzdGlvbi1pbWFnZSAuZGVsZXRlLWltYWdlXCIsXG5cdFx0cHJldkJ1dHRvbjogXCIjaWFnby1wcmV2aW91cy1xdWVzdGlvblwiLFxuXHRcdG5leHRCdXR0b246IFwiI2lhZ28tbmV4dC1xdWVzdGlvblwiLFxuXHRcdGZlZWRiYWNrOiBcIiNpYWdvLWhlbHAtY29udGVudC10ZXh0XCIsXG5cdFx0ZXJyb3JzOiBcIi5xdWVzdGlvbi1lcnJvcnNcIixcblx0XHRjbG9zZUVycm9yOiBcIi5xdWVzdGlvbi1lcnJvcnMgLmNsb3NlXCIsXG5cblx0XHRjb250ZW50OiBcIiNpYWdvLXF1ZXN0aW9uLWNvbnRlbnRcIixcblx0XHRtYXJrZXI6IFwiLmlhZ28tbWFya2VyXCIsXG5cdFx0cGFyYWdyYXBoOiBcIi5ibGFua1BhcmFncmFwaFwiLFxuXHRcdGhpZ2hsaWdodDogXCIuYmxhbmtQYXJhZ3JhcGggc3Bhbi5pbnB1dFwiLFxuXHRcdHByZXZpZXdQYXJhZ3JhcGg6IFwiLnByZXZpZXdQYXJhZ3JhcGhcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5jbG9zZUVycm9yXCI6IFwiY2xvc2VFcnJvclwiLFxuXHRcdFwiY2xpY2sgQHVpLm1hcmtlclwiOiBcIm1ha2VTZWxlY3Rpb25cIixcblx0XHRcImNsaWNrIEB1aS5oZWFkaW5nSW1hZ2VcIjogXCJoZWFkaW5nSW1hZ2VDbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmhlYWRpbmdJbWFnZURlbFwiOiBcImRlbGV0ZUhlYWRpbmdJbWFnZVwiLFxuXG5cdFx0XCJtb3VzZW92ZXIgQHVpLm1hcmtlclwiOiBcIm1ha2VTZWxlY3Rpb25cIixcblxuXHRcdFwiZGJsY2xpY2sgQHVpLmhpZ2hsaWdodFwiOiBcImNsZWFyU2VsZWN0aW9uXCIsXG5cblx0XHQvL1wicGFzdGUgQHVpLmhlYWRpbmdUZXh0XCI6IFwicGFzdGVkXCIsXG5cdFx0Ly9cInBhc3RlIEB1aS5wYXJhZ3JhcGhcIjogXCJwYXN0ZWRcIixcblx0XHQvL1wicGFzdGUgQHVpLmZlZWRiYWNrXCI6IFwicGFzdGVkXCIsXG5cblx0XHRcImZvY3VzIEB1aS5mZWVkYmFja1wiOiBcInNlbGVjdFwiLFxuXHRcdFwiZm9jdXMgQHVpLmhlYWRpbmdUZXh0XCI6IFwic2VsZWN0XCIsXG5cblx0XHRcImJsdXIgQHVpLmhlYWRpbmdUZXh0XCI6IFwidW5zZWxlY3RcIixcblx0XHRcImJsdXIgQHVpLmZlZWRiYWNrXCI6IFwidW5zZWxlY3RcIixcblx0fSxcblxuXHRtb2RlbEV2ZW50czoge1xuXHRcdGludmFsaWQ6IFwidmFsaWRhdGlvbkZhaWxcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5tb2RlbCA9IG9wdGlvbnMucXVlc3Rpb24gfHwgbmV3IE1vZGVsc1tcIjRcIl0oeyBpZDogb3B0aW9ucy5pZCB9KTtcblxuXHRcdHRoaXMuYmluZEV2ZW50cyh0aGlzLm1vZGVsLCB0aGlzLm1vZGVsRXZlbnRzKTtcblxuXHRcdHRoaXMuYXNzZXNzbWVudCA9IG9wdGlvbnMuYXNzZXNzbWVudDtcblx0XHR0aGlzLnByZXZpZXdNb2RlID0gb3B0aW9ucy5wcmV2aWV3TW9kZTtcblxuXHRcdHRoaXMubGlzdGVuVG8oUGFnZSwgXCJjaGFuZ2U6ZmVlZGJhY2tcIiwgdGhpcy5jaGFuZ2VGZWVkYmFjay5iaW5kKHRoaXMpKTtcblxuXHRcdHRoaXMubG9hZGVkID0gdGhpcy5pYWdvTG9hZGVkLmJpbmQodGhpcyk7XG5cdFx0dGhpcy5uYXZpZ2F0ZSA9IHRoaXMuaWFnb05hdmlnYXRlLmJpbmQodGhpcyk7XG5cblx0XHR0aGlzLnByZXZpZXdNb2RlID0gb3B0aW9ucyAmJiBvcHRpb25zLnByZXZpZXdNb2RlO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmJ1cy5nZXQoMCkuYWRkRXZlbnRMaXN0ZW5lcihcImlhZ286bG9hZGVkXCIsIHRoaXMubG9hZGVkKTtcblx0XHR0aGlzLnVpLmJ1cy5nZXQoMCkuYWRkRXZlbnRMaXN0ZW5lcihcImlhZ286bmF2aWdhdGVcIiwgdGhpcy5uYXZpZ2F0ZSk7XG5cblx0XHR0aGlzLnVpLmZlZWRiYWNrLmF0dHIoXCJjb250ZW50ZWRpdGFibGVcIiwgdGhpcy5hc3Nlc3NtZW50LmdldChcImZlZWRiYWNrXCIpKTtcblx0XHR0aGlzLm1vZGVsLmZlZWRiYWNrID0gdGhpcy5hc3Nlc3NtZW50LmdldChcImZlZWRiYWNrXCIpO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy50cmlnZ2VyKFwiZGVzdHJveWVkXCIsIHRoaXMubW9kZWwpO1xuXG5cdFx0dGhpcy51aS5idXMuZ2V0KDApLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJpYWdvOmxvYWRlZFwiLCB0aGlzLmxvYWRlZCk7XG5cdFx0dGhpcy51aS5idXMuZ2V0KDApLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJpYWdvOm5hdmlnYXRlXCIsIHRoaXMubmF2aWdhdGUpO1xuXHR9LFxuXG5cdHBhc3RlZDogZnVuY3Rpb24oZSkge1xuXHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0aWYgKCFlLm9yaWdpbmFsRXZlbnQuY2xpcGJvYXJkRGF0YSlcblx0XHRcdHJldHVybjtcblxuXHRcdGxldCBkYXRhID0gZS5vcmlnaW5hbEV2ZW50LmNsaXBib2FyZERhdGEuZ2V0RGF0YShcInRleHQvcGxhaW5cIik7XG5cdFx0aWYgKGUuY3VycmVudFRhcmdldC5jbGFzc05hbWUgPT09IFwiYmxhbmtQYXJhZ3JhcGhcIilcblx0XHRcdGRhdGEgPSBkYXRhLnJlcGxhY2UoLyg/OlxcclxcbnxcXHJ8XFxuKS9nLCBcIlwiKTtcblxuXHRcdCQoZS5jdXJyZW50VGFyZ2V0KS50ZXh0KGRhdGEpO1xuXHR9LFxuXG5cdHNlbGVjdDogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0Y29uc3QgZWwgPSAkKGV2dC5jdXJyZW50VGFyZ2V0KTtcblxuXHRcdGlmICghZWwucHJvcChcImNvbnRlbnRlZGl0YWJsZVwiKSlcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcblx0XHRcdHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhlbFswXSk7XG5cdFx0XHRjb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG5cdFx0XHRzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG5cdFx0XHRzZWwuYWRkUmFuZ2UocmFuZ2UpO1xuXHRcdH0sIDUwKTtcblx0fSxcblxuXHR1bnNlbGVjdDogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0d2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpO1xuXG5cdFx0Ly8gSWYgdGhpcyBlbGVtZW50IGlzIG5vdyBibGFuaywgd2UgbmVlZCB0byByZXNldCBpdFxuXHRcdGlmIChfLnRyaW0oJChldnQuY3VycmVudFRhcmdldCkudGV4dCgpKSA9PT0gXCJcIikge1xuXHRcdFx0c3dpdGNoIChldnQuY3VycmVudFRhcmdldC5pZCkge1xuXHRcdFx0XHRjYXNlIFwiaWFnby1oZWFkaW5nLXRleHRcIjpcblx0XHRcdFx0XHQkKGV2dC5jdXJyZW50VGFyZ2V0KS50ZXh0KFwiSW5zZXJ0IFF1ZXN0aW9uXCIpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJpYWdvLWhlbHAtY29udGVudC10ZXh0XCI6XG5cdFx0XHRcdFx0JChldnQuY3VycmVudFRhcmdldCkudGV4dChcIlRoaXMgaXMgcGxhY2Vob2xkZXIgZmVlZGJhY2s7IGNsaWNrIHRvIGVkaXRcIik7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHQkKGV2dC5jdXJyZW50VGFyZ2V0KS50ZXh0KFwiVGV4dFwiKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0Y2hhbmdlRmVlZGJhY2s6IGZ1bmN0aW9uKHN0YXRlKSB7XG5cdFx0aWYgKHRoaXMucHJldmlld01vZGUpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLm1vZGVsLmZlZWRiYWNrID0gc3RhdGU7XG5cdFx0dGhpcy51aS5mZWVkYmFjay5hdHRyKFwiY29udGVudGVkaXRhYmxlXCIsIHN0YXRlKTtcblxuXHRcdGlmICghdGhpcy5tb2RlbC5nZXQoXCJmZWVkYmFja1wiKSlcblx0XHRcdHRoaXMubW9kZWwuc2V0KFwiZmVlZGJhY2tcIiwgXCJUaGlzIGlzIHBsYWNlaG9sZGVyIGZlZWRiYWNrOyBjbGljayB0byBlZGl0XCIpO1xuXG5cdFx0aWYgKHN0YXRlKVxuXHRcdFx0dGhpcy51aS5mZWVkYmFjay5hZGRDbGFzcyhcImlhZ28tZWRpdGFibGUtZGFya1wiKS50ZXh0KHRoaXMubW9kZWwuZ2V0KFwiZmVlZGJhY2tcIikpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMudWkuZmVlZGJhY2sucmVtb3ZlQ2xhc3MoXCJpYWdvLWVkaXRhYmxlLWRhcmtcIik7XG5cdH0sXG5cblx0aGVhZGluZ0ltYWdlQ2xpY2s6IGZ1bmN0aW9uKGUpIHtcblx0XHRpZiAoZSAmJiAkKGUuY3VycmVudFRhcmdldCkuaGFzQ2xhc3MoXCJpbWFnZUNob29zZXJcIikpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLmhlYWRpbmdJbWFnZSA9IEltYWdlQ2hvb3Nlci5jcmVhdGUoJChcIi5pbWFnZS1wbGFjZWhvbGRlclwiLCB0aGlzLmVsKSwge1xuXHRcdFx0dHJhbnNjb2RlOiB0cnVlLFxuXHRcdFx0anBlZzogdHJ1ZSxcblx0XHRcdG1heEhlaWdodDogMjUwLFxuXHRcdFx0bWF4V2lkdGg6IDMwMCxcblx0XHR9KTtcblxuXHRcdHRoaXMudWkuaGVhZGluZ0ltYWdlRGVsLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLm1vZGVsLnNldCh7IGV4cGVjdFF1ZXN0aW9uSW1hZ2U6IHRydWUgfSk7XG5cdH0sXG5cblx0ZGVsZXRlSGVhZGluZ0ltYWdlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5oZWFkaW5nSW1hZ2UpIHtcblx0XHRcdHRoaXMuaGVhZGluZ0ltYWdlLmRlc3Ryb3koKTtcblx0XHRcdHRoaXMuaGVhZGluZ0ltYWdlID0gbnVsbDtcblx0XHR9XG5cblx0XHQkKFwiLmltYWdlLXBsYWNlaG9sZGVyXCIsIHRoaXMuZWwpLnJlcGxhY2VXaXRoKCc8ZGl2IGNsYXNzPVwiaW1hZ2UtcGxhY2Vob2xkZXJcIj5DbGljayB0byBhZGQgYW4gb3B0aW9uYWwgaW1hZ2UgdG8gdGhlIHRpdGxlPC9kaXY+Jyk7XG5cdFx0dGhpcy51aS5oZWFkaW5nSW1hZ2VEZWwuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMubW9kZWwuc2V0KHsgZXhwZWN0UXVlc3Rpb25JbWFnZTogZmFsc2UgfSk7XG5cdH0sXG5cblx0aWFnb0xvYWRlZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5iaW5kVUlFbGVtZW50cygpO1xuXHRcdHRoaXMuZGVsZWdhdGVFdmVudHMoKTtcblxuXHRcdC8vIENoZWNrIGZvciByYW5nZXMgYW5kIGNvbnN0cnVjdCBhY2NvcmRpbmdseVxuXHRcdGNvbnN0IHR4dCA9IHRoaXMudWkucGFyYWdyYXBoLnRleHQoKTtcblx0XHR0aGlzLnVpLnBhcmFncmFwaC5odG1sKHR4dC5yZXBsYWNlKC8oXFxbLis/XFxdKS9naSwgXCI8c3BhbiBjbGFzcz0naW5wdXQnPiQxPC9zcGFuPlwiKSk7XG5cblx0XHRsZXQgbWFya2VyQ2xhc3MgPSBcIlwiO1xuXG5cdFx0aWYgKHRoaXMucHJldmlld01vZGUpXG5cdFx0XHRtYXJrZXJDbGFzcyA9IFwiaGlkZVwiO1xuXG5cdFx0Y29uc3QgZWwgPSAkKFwiPGRpdiBjbGFzcz0naWFnby1tYXJrZXIgXCIgKyBtYXJrZXJDbGFzcyArIFwiJz5NYXJrPC9kaXY+XCIpO1xuXHRcdHRoaXMudWkuY29udGVudC5wcmVwZW5kKGVsKTtcblxuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcImV4cGVjdFF1ZXN0aW9uSW1hZ2VcIikgJiYgIXRoaXMucHJldmlld01vZGUpIHtcblx0XHRcdHRoaXMuaGVhZGluZ0ltYWdlQ2xpY2soKTtcblx0XHRcdHRoaXMuaGVhZGluZ0ltYWdlLnNldEltYWdlKHRoaXMubW9kZWwuZ2V0KFwicXVlc3Rpb25JbWFnZVwiKSk7XG5cdFx0fVxuXG5cdFx0Ly8gQ2hlY2sgZm9yIGZlZWRiYWNrIG1vZGVcblx0XHRpZiAodGhpcy5hc3Nlc3NtZW50LmdldChcImZlZWRiYWNrXCIpKVxuXHRcdFx0dGhpcy5jaGFuZ2VGZWVkYmFjayh0cnVlKTtcblx0fSxcblxuXHRtYWtlU2VsZWN0aW9uOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQucHJldmVudERlZmF1bHQoKTtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRpZiAoZXZ0Lm9yaWdpbmFsRXZlbnQudHlwZSA9PT0gXCJtb3VzZW92ZXJcIikge1xuXHRcdFx0Ly8gSUUgaGFjayAjOTU2NzM2NzogY2xpY2tpbmcgY2xlYXJzIHRoZSBzZWxlY3Rpb24sIHNvIHdlIGNhcHR1cmUgdGhlIHNlbGVjdGlvbiBvbiBtb3VzZW92ZXIgYW5kIHJldXNlIGl0IGxhdGVyXG5cdFx0XHRpZiAod2luZG93LmdldFNlbGVjdGlvbigpLnJhbmdlQ291bnQgPT09IDApXG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0dGhpcy5jYXB0dXJlZFNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5nZXRSYW5nZUF0KDApO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmNhcHR1cmVkU2VsZWN0aW9uIHx8ICF3aW5kb3cuZ2V0U2VsZWN0aW9uKCkuaXNDb2xsYXBzZWQpIHtcblx0XHRcdGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmFuZ2VDb3VudCA9PT0gMCAmJiAhdGhpcy5jYXB0dXJlZFNlbGVjdGlvbilcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRjb25zdCByYW5nZSA9IHRoaXMuY2FwdHVyZWRTZWxlY3Rpb24gfHwgd2luZG93LmdldFNlbGVjdGlvbigpLmdldFJhbmdlQXQoMCk7XG5cblx0XHRcdGNvbnN0IHZhbGlkUmFuZ2UgPSAocmFuZ2Uuc3RhcnRDb250YWluZXIucGFyZW50Tm9kZSA9PT0gcmFuZ2UuZW5kQ29udGFpbmVyLnBhcmVudE5vZGUgJiYgdGhpcy51aS5wYXJhZ3JhcGguZ2V0KDApLmNvbnRhaW5zKHJhbmdlLnN0YXJ0Q29udGFpbmVyLnBhcmVudE5vZGUpICYmXG5cdFx0XHRcdHRoaXMudWkucGFyYWdyYXBoLmdldCgwKS5jb250YWlucyhyYW5nZS5lbmRDb250YWluZXIucGFyZW50Tm9kZSkpIHx8XG5cdFx0XHRcdHJhbmdlLmVuZENvbnRhaW5lci5wYXJlbnROb2RlID09PSB0aGlzLnVpLmNvbnRlbnQuZ2V0KDApO1xuXG5cdFx0XHRpZiAocmFuZ2UgJiYgdmFsaWRSYW5nZSkge1xuXHRcdFx0XHQvLyBSZXBsYWNlIHRoZSByYW5nZVxuXHRcdFx0XHRjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuXHRcdFx0XHRlbC5jbGFzc0xpc3QuYWRkKFwiaW5wdXRcIik7XG5cdFx0XHRcdGVsLnRleHRDb250ZW50ID0gXCJbXCIgKyByYW5nZS50b1N0cmluZygpICsgXCJdXCI7XG5cblx0XHRcdFx0cmFuZ2UuZGVsZXRlQ29udGVudHMoKTtcblx0XHRcdFx0cmFuZ2UuaW5zZXJ0Tm9kZShlbCk7XG5cdFx0XHRcdHJhbmdlLmRldGFjaCgpO1xuXG5cdFx0XHRcdCQoXCIucXVlc3Rpb24tbWFya1wiKS50ZXh0KHBhcnNlSW50KCQoXCIucXVlc3Rpb24tbWFya1wiKS50ZXh0KCksIDEwKSArIDEpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmNhcHR1cmVkU2VsZWN0aW9uID0gbnVsbDtcblx0XHR9XG5cdH0sXG5cblx0Y2xlYXJTZWxlY3Rpb246IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGlmICghdGhpcy5wcmV2aWV3TW9kZSkge1xuXHRcdFx0JChcIi5xdWVzdGlvbi1tYXJrXCIpLnRleHQocGFyc2VJbnQoJChcIi5xdWVzdGlvbi1tYXJrXCIpLnRleHQoKSwgMTApIC0gMSk7XG5cdFx0XHQkKGV2dC5jdXJyZW50VGFyZ2V0KS5yZXBsYWNlV2l0aChldnQuY3VycmVudFRhcmdldC50ZXh0Q29udGVudC5zbGljZSgxLCAtMSkpO1xuXHRcdH1cblx0fSxcblxuXHRpYWdvTmF2aWdhdGU6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdC8vIFNhdmUgdGhpcyBtb2RlbCwgdGhlbiBuYXZpZ2F0ZVxuXHRcdGlmICh0aGlzLnNhdmUoKSlcblx0XHRcdHRoaXMudHJpZ2dlcihcImlhZ286bmF2aWdhdGVcIiwgZXZ0KTtcblx0fSxcblxuXHRzYXZlOiBmdW5jdGlvbihub1ZhbGlkYXRpb24sIG5vRmVlZGJhY2spIHtcblx0XHRpZiAoIXRoaXMudWkuaGVhZGluZ1RleHQudGV4dClcblx0XHRcdHJldHVybjtcblxuXHRcdGNvbnN0IHF1ZXN0aW9uID0gXy50cmltKHRoaXMudWkuaGVhZGluZ1RleHQudGV4dCgpKTtcblx0XHRjb25zdCBmZWVkYmFjayA9IHRoaXMuYXNzZXNzbWVudC5nZXQoXCJmZWVkYmFja1wiKSAmJiAhbm9GZWVkYmFjayA/IF8udHJpbSh0aGlzLnVpLmZlZWRiYWNrLnRleHQoKSkgOiBcIlwiO1xuXHRcdGxldCBxdWVzdGlvbkltYWdlID0gbnVsbDtcblxuXHRcdGlmICh0aGlzLmhlYWRpbmdJbWFnZSlcblx0XHRcdHF1ZXN0aW9uSW1hZ2UgPSB0aGlzLmhlYWRpbmdJbWFnZS5nZXRJbWFnZSgpO1xuXG5cdFx0Y29uc3QgcGFyYWdyYXBoID0gdGhpcy51aS5wYXJhZ3JhcGgudGV4dCgpLnJlcGxhY2UoLyg/OlxcclxcbnxcXHJ8XFxuKS9nLCBcIlwiKTtcblx0XHR0aGlzLm1vZGVsLnNldCh7XG5cdFx0XHRhbnN3ZXI6IHtcblx0XHRcdFx0dHlwZTogXCJibGFua1wiLFxuXHRcdFx0XHRjb250ZW50OiBwYXJhZ3JhcGgsXG5cdFx0XHR9LFxuXHRcdFx0ZmVlZGJhY2s6IGZlZWRiYWNrLFxuXHRcdFx0cXVlc3Rpb246IHF1ZXN0aW9uLFxuXHRcdFx0cXVlc3Rpb25JbWFnZTogcXVlc3Rpb25JbWFnZSxcblx0XHRcdGV4cGVjdFF1ZXN0aW9uSW1hZ2U6IHF1ZXN0aW9uSW1hZ2UgIT09IG51bGwsXG5cdFx0fSk7XG5cblx0XHRsZXQgcG90ZW50aWFsID0gMDtcblx0XHRjb25zdCBicmVha2Rvd24gPSBwYXJhZ3JhcGguc3BsaXQoLyhcXFsuKj9cXF0pLyk7XG5cdFx0Xy5lYWNoKGJyZWFrZG93biwgcGFydCA9PiB7XG5cdFx0XHRpZiAoKC8oXi4qXFxbfFxcXS4qJCkvKS50ZXN0KHBhcnQpKVxuXHRcdFx0XHRwb3RlbnRpYWwrKztcblx0XHR9KTtcblxuXHRcdHRoaXMubW9kZWwuc2V0KHsgcG90ZW50aWFsU2NvcmU6IHBvdGVudGlhbCB9KTtcblxuXHRcdGlmICghbm9WYWxpZGF0aW9uKVxuXHRcdFx0cmV0dXJuIHRoaXMubW9kZWwuaXNWYWxpZCgpO1xuXHR9LFxuXG5cdHZhbGlkYXRpb25GYWlsOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5wcmV2aWV3TW9kZSlcblx0XHRcdHJldHVybjtcblx0XHQvLyBCdWlsZCB0aGUgZXJyb3JzIHRvIHNob3dcblx0XHRjb25zdCBlcnJzID0gdGhpcy5tb2RlbC52YWxpZGF0aW9uRXJyb3Iuc2xpY2UoMCk7XG5cdFx0ZXJycy51bnNoaWZ0KFwiPHN0cm9uZz5UaGUgY3VycmVudCBxdWVzdGlvbiBoYXMgZXJyb3JzIGFuZCBjYW5ub3QgYmUgc2F2ZWQ6PC9zdHJvbmc+PGJyLz5cIik7XG5cblx0XHR0aGlzLnVpLmVycm9ycy5yZW1vdmVDbGFzcyhcImhpZGVcIikuY2hpbGRyZW4oXCIuZGV0YWlsXCIpLmh0bWwoZXJycy5qb2luKFwiPGJyLz4mbWlkZG90OyZuYnNwO1wiKSk7XG5cdH0sXG5cblx0Y2xvc2VFcnJvcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5lcnJvcnMuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdGVkaXRDbGljazogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuXHR9LFxufSk7Il19",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\n\nvar App = require(\"../index\");\nvar settings = require(\"app-settings\");\n\nvar gradeMap = require(\"./gradeMap\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nmodule.exports = Backbone.Model.extend({\n\tdefaults: {\n\t\tversion: 1,\n\t\tquestionData: [],\n\t\tlanguage: \"English\",\n\t\tsubject: \"\",\n\t\tstudyYear: \"\",\n\t\tfeedback: false,\n\t\tpayloadVersion: 6\n\t},\n\n\tinitialize: function initialize() {\n\t\tvar _this = this;\n\n\t\t// Initialise the usage\n\t\tif (!this.get(\"usage\")) this.set(\"usage\", 0);\n\n\t\t// Listen for usage (as an attachment) of this resource\n\t\tthis.listenTo(radio, \"attachmentAdded:\" + this.get(\"_id\"), this.incrementUsage.bind(this));\n\t\tthis.listenTo(radio, \"attachmentRemoved:\" + this.get(\"_id\"), this.decrementUsage.bind(this));\n\n\t\t// Listen for book unloading and reset usage accordingly\n\t\tthis.listenTo(radio, App.Events.UnloadBook, function () {\n\t\t\t_this.set(\"usage\", 0);\n\t\t});\n\t\tthis.listenTo(radio, App.Events.UnloadLearningPath, function () {\n\t\t\t_this.set(\"usage\", 0);\n\t\t});\n\n\t\tif (this.isNew()) this.listenTo(this, \"sync change:category\", this.setValues.bind(this));else this.setValues();\n\t},\n\n\tidAttribute: \"_id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/resources/assessments\";\n\t},\n\n\tsetValues: function setValues() {\n\t\tthis.set({ icon: \"fa-list-ul\", img: \"annotation_interactive\", typeName: \"Annotation\" });\n\n\t\tvar ct = \"\";\n\t\tif (settings.contentIcons === \"img\") ct = \"<img src='\" + settings.urlRoot + \"/images/content/\" + this.get(\"img\") + \".png'/>\";else ct = \"<span class='fa \" + this.get(\"icon\") + \"'/>\";\n\n\t\tthis.set({ contentType: ct, contentGrade: gradeMap.codeToHumanValue(this.get(\"studyYear\") || this.get(\"grade\")) || \"\", lastChange: this.get(\"updated\") || this.get(\"created\") });\n\t},\n\n\tvalidate: function validate(attributes) {\n\t\tvar errors = {};\n\n\t\tif (!attributes.language) errors.language = \"You must select a language for this resource.\";\n\n\t\tif (!attributes.subject) errors.subject = \"You must select a subject for this resource.\";\n\n\t\tif (!attributes.studyYear) errors.studyYear = \"You must select a grade for this resource.\";\n\n\t\tif (!attributes.title) errors.title = \"You must enter a title for this resource.\";\n\n\t\tif (attributes.questionData.length === 0) errors.questions = \"You must specify at least one question\";\n\n\t\tif (_.keys(errors).length > 0) return errors;\n\t},\n\n\tincrementUsage: function incrementUsage() {\n\t\tif (this.has(\"usage\")) this.set(\"usage\", this.get(\"usage\") + 1);else this.set(\"usage\", 1);\n\t},\n\n\tdecrementUsage: function decrementUsage() {\n\t\tthis.set(\"usage\", Math.max(0, this.get(\"usage\") - 1));\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2Vzc21lbnRNb2RlbC5qcyJdLCJuYW1lcyI6WyJfIiwicmVxdWlyZSIsIkJhY2tib25lIiwiQXBwIiwic2V0dGluZ3MiLCJncmFkZU1hcCIsInJhZGlvIiwiUmFkaW8iLCJjaGFubmVsIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1vZGVsIiwiZXh0ZW5kIiwiZGVmYXVsdHMiLCJ2ZXJzaW9uIiwicXVlc3Rpb25EYXRhIiwibGFuZ3VhZ2UiLCJzdWJqZWN0Iiwic3R1ZHlZZWFyIiwiZmVlZGJhY2siLCJwYXlsb2FkVmVyc2lvbiIsImluaXRpYWxpemUiLCJnZXQiLCJzZXQiLCJsaXN0ZW5UbyIsImluY3JlbWVudFVzYWdlIiwiYmluZCIsImRlY3JlbWVudFVzYWdlIiwiRXZlbnRzIiwiVW5sb2FkQm9vayIsIlVubG9hZExlYXJuaW5nUGF0aCIsImlzTmV3Iiwic2V0VmFsdWVzIiwiaWRBdHRyaWJ1dGUiLCJ1cmxSb290IiwiaWNvbiIsImltZyIsInR5cGVOYW1lIiwiY3QiLCJjb250ZW50SWNvbnMiLCJjb250ZW50VHlwZSIsImNvbnRlbnRHcmFkZSIsImNvZGVUb0h1bWFuVmFsdWUiLCJsYXN0Q2hhbmdlIiwidmFsaWRhdGUiLCJhdHRyaWJ1dGVzIiwiZXJyb3JzIiwidGl0bGUiLCJsZW5ndGgiLCJxdWVzdGlvbnMiLCJrZXlzIiwiaGFzIiwiTWF0aCIsIm1heCJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsSUFBSUMsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNQyxXQUFXRCxRQUFRLFVBQVIsQ0FBakI7O0FBRUEsSUFBTUUsTUFBTUYsUUFBUSxVQUFSLENBQVo7QUFDQSxJQUFNRyxXQUFXSCxRQUFRLGNBQVIsQ0FBakI7O0FBRUEsSUFBTUksV0FBV0osUUFBUSxZQUFSLENBQWpCOztBQUVBLElBQU1LLFFBQVFKLFNBQVNLLEtBQVQsQ0FBZUMsT0FBZixDQUF1QixRQUF2QixDQUFkOztBQUVBQyxPQUFPQyxPQUFQLEdBQWlCUixTQUFTUyxLQUFU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QUFPQyxLQUFQLEdBQWUsMkNBQWY7O0FBRUQsTUFBSUYsV0FBVzlCLFlBQVgsQ0FBd0JpQyxNQUF4QixLQUFtQyxDQUF2QyxFQUNDRixPQUFPRyxTQUFQLEdBQW1CLHdDQUFuQjs7QUFFRCxNQUFJakQsRUFBRWtELElBQUYsQ0FBT0osTUFBUCxFQUFlRSxNQUFmLEdBQXdCLENBQTVCLEVBQ0MsT0FBT0YsTUFBUDtBQUNELEVBcEVxQzs7QUFzRXRDckIsaUJBQWdCLDBCQUFXO0FBQzFCLE1BQUksS0FBSzBCLEdBQUwsQ0FBUyxPQUFULENBQUosRUFDQyxLQUFLNUIsR0FBTCxDQUFTLE9BQVQsRUFBa0IsS0FBS0QsR0FBTCxDQUFTLE9BQVQsSUFBb0IsQ0FBdEMsRUFERCxLQUdDLEtBQUtDLEdBQUwsQ0FBUyxPQUFULEVBQWtCLENBQWxCO0FBQ0QsRUEzRXFDOztBQTZFdENJLGlCQUFnQiwwQkFBVztBQUMxQixPQUFLSixHQUFMLENBQVMsT0FBVCxFQUFrQjZCLEtBQUtDLEdBQUwsQ0FBUyxDQUFULEVBQVksS0FBSy9CLEdBQUwsQ0FBUyxPQUFULElBQW9CLENBQWhDLENBQWxCO0FBQ0E7QUEvRXFDLENBQXRCLENBQWpCIiwiZmlsZSI6ImFzc2Vzc21lbnRNb2RlbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcblxuY29uc3QgQXBwID0gcmVxdWlyZShcIi4uL2luZGV4XCIpO1xuY29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuXG5jb25zdCBncmFkZU1hcCA9IHJlcXVpcmUoXCIuL2dyYWRlTWFwXCIpO1xuXG5jb25zdCByYWRpbyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJnbG9iYWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHtcblx0XHR2ZXJzaW9uOiAxLFxuXHRcdHF1ZXN0aW9uRGF0YTogW10sXG5cdFx0bGFuZ3VhZ2U6IFwiRW5nbGlzaFwiLFxuXHRcdHN1YmplY3Q6IFwiXCIsXG5cdFx0c3R1ZHlZZWFyOiBcIlwiLFxuXHRcdGZlZWRiYWNrOiBmYWxzZSxcblx0XHRwYXlsb2FkVmVyc2lvbjogNixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHQvLyBJbml0aWFsaXNlIHRoZSB1c2FnZVxuXHRcdGlmICghdGhpcy5nZXQoXCJ1c2FnZVwiKSlcblx0XHRcdHRoaXMuc2V0KFwidXNhZ2VcIiwgMCk7XG5cblx0XHQvLyBMaXN0ZW4gZm9yIHVzYWdlIChhcyBhbiBhdHRhY2htZW50KSBvZiB0aGlzIHJlc291cmNlXG5cdFx0dGhpcy5saXN0ZW5UbyhyYWRpbywgXCJhdHRhY2htZW50QWRkZWQ6XCIgKyB0aGlzLmdldChcIl9pZFwiKSwgdGhpcy5pbmNyZW1lbnRVc2FnZS5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKHJhZGlvLCBcImF0dGFjaG1lbnRSZW1vdmVkOlwiICsgdGhpcy5nZXQoXCJfaWRcIiksIHRoaXMuZGVjcmVtZW50VXNhZ2UuYmluZCh0aGlzKSk7XG5cblx0XHQvLyBMaXN0ZW4gZm9yIGJvb2sgdW5sb2FkaW5nIGFuZCByZXNldCB1c2FnZSBhY2NvcmRpbmdseVxuXHRcdHRoaXMubGlzdGVuVG8ocmFkaW8sIEFwcC5FdmVudHMuVW5sb2FkQm9vaywgKCkgPT4geyB0aGlzLnNldChcInVzYWdlXCIsIDApOyB9KTtcblx0XHR0aGlzLmxpc3RlblRvKHJhZGlvLCBBcHAuRXZlbnRzLlVubG9hZExlYXJuaW5nUGF0aCwgKCkgPT4geyB0aGlzLnNldChcInVzYWdlXCIsIDApOyB9KTtcblxuXHRcdGlmICh0aGlzLmlzTmV3KCkpXG5cdFx0XHR0aGlzLmxpc3RlblRvKHRoaXMsIFwic3luYyBjaGFuZ2U6Y2F0ZWdvcnlcIiwgdGhpcy5zZXRWYWx1ZXMuYmluZCh0aGlzKSk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5zZXRWYWx1ZXMoKTtcblx0fSxcblxuXHRpZEF0dHJpYnV0ZTogXCJfaWRcIixcblxuXHR1cmxSb290OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvcmVzb3VyY2VzL2Fzc2Vzc21lbnRzXCI7XG5cdH0sXG5cblx0c2V0VmFsdWVzOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNldCh7IGljb246IFwiZmEtbGlzdC11bFwiLCBpbWc6IFwiYW5ub3RhdGlvbl9pbnRlcmFjdGl2ZVwiLCB0eXBlTmFtZTogXCJBbm5vdGF0aW9uXCIgfSk7XG5cblx0XHRsZXQgY3QgPSBcIlwiO1xuXHRcdGlmIChzZXR0aW5ncy5jb250ZW50SWNvbnMgPT09IFwiaW1nXCIpXG5cdFx0XHRjdCA9IFwiPGltZyBzcmM9J1wiICsgc2V0dGluZ3MudXJsUm9vdCArIFwiL2ltYWdlcy9jb250ZW50L1wiICsgdGhpcy5nZXQoXCJpbWdcIikgKyBcIi5wbmcnLz5cIjtcblx0XHRlbHNlXG5cdFx0XHRjdCA9IFwiPHNwYW4gY2xhc3M9J2ZhIFwiICsgdGhpcy5nZXQoXCJpY29uXCIpICsgXCInLz5cIjtcblxuXHRcdHRoaXMuc2V0KHsgY29udGVudFR5cGU6IGN0LCBjb250ZW50R3JhZGU6IGdyYWRlTWFwLmNvZGVUb0h1bWFuVmFsdWUodGhpcy5nZXQoXCJzdHVkeVllYXJcIikgfHwgdGhpcy5nZXQoXCJncmFkZVwiKSkgfHwgXCJcIiwgbGFzdENoYW5nZTogdGhpcy5nZXQoXCJ1cGRhdGVkXCIpIHx8IHRoaXMuZ2V0KFwiY3JlYXRlZFwiKSB9KTtcblx0fSxcblxuXHR2YWxpZGF0ZTogZnVuY3Rpb24oYXR0cmlidXRlcykge1xuXHRcdGNvbnN0IGVycm9ycyA9IHt9O1xuXG5cdFx0aWYgKCFhdHRyaWJ1dGVzLmxhbmd1YWdlKVxuXHRcdFx0ZXJyb3JzLmxhbmd1YWdlID0gXCJZb3UgbXVzdCBzZWxlY3QgYSBsYW5ndWFnZSBmb3IgdGhpcyByZXNvdXJjZS5cIjtcblxuXHRcdGlmICghYXR0cmlidXRlcy5zdWJqZWN0KVxuXHRcdFx0ZXJyb3JzLnN1YmplY3QgPSBcIllvdSBtdXN0IHNlbGVjdCBhIHN1YmplY3QgZm9yIHRoaXMgcmVzb3VyY2UuXCI7XG5cblx0XHRpZiAoIWF0dHJpYnV0ZXMuc3R1ZHlZZWFyKVxuXHRcdFx0ZXJyb3JzLnN0dWR5WWVhciA9IFwiWW91IG11c3Qgc2VsZWN0IGEgZ3JhZGUgZm9yIHRoaXMgcmVzb3VyY2UuXCI7XG5cblx0XHRpZiAoIWF0dHJpYnV0ZXMudGl0bGUpXG5cdFx0XHRlcnJvcnMudGl0bGUgPSBcIllvdSBtdXN0IGVudGVyIGEgdGl0bGUgZm9yIHRoaXMgcmVzb3VyY2UuXCI7XG5cblx0XHRpZiAoYXR0cmlidXRlcy5xdWVzdGlvbkRhdGEubGVuZ3RoID09PSAwKVxuXHRcdFx0ZXJyb3JzLnF1ZXN0aW9ucyA9IFwiWW91IG11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgcXVlc3Rpb25cIjtcblxuXHRcdGlmIChfLmtleXMoZXJyb3JzKS5sZW5ndGggPiAwKVxuXHRcdFx0cmV0dXJuIGVycm9ycztcblx0fSxcblxuXHRpbmNyZW1lbnRVc2FnZTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuaGFzKFwidXNhZ2VcIikpXG5cdFx0XHR0aGlzLnNldChcInVzYWdlXCIsIHRoaXMuZ2V0KFwidXNhZ2VcIikgKyAxKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnNldChcInVzYWdlXCIsIDEpO1xuXHR9LFxuXG5cdGRlY3JlbWVudFVzYWdlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNldChcInVzYWdlXCIsIE1hdGgubWF4KDAsIHRoaXMuZ2V0KFwidXNhZ2VcIikgLSAxKSk7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\nvar flatpickr = require(\"flatpickr\");\nvar settings = require(\"app-settings\");\n\nvar AssessmentSettingsModel = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"_id\",\n\n\tvalidate: function validate(attributes) {\n\t\tvar errors = {};\n\n\t\tif (attributes.save && !attributes.instanceName) errors.instanceName = \"You must provide a name so that marks can be saved to the server.\";\n\n\t\tif (attributes.activationType === \"specific\") {\n\t\t\tif (!attributes.startTime) errors.startTime = \"You must provide a starting time.\";else if (!moment(attributes.startTime, \"h:mma\").isValid()) errors.startTime = \"The provided starting time is not a valid time.\";\n\n\t\t\tif (attributes.activationTime && attributes.activationTime < moment().unix()) errors.startDate = \"You cannot set an unlock date that is before the current date\";\n\t\t}\n\n\t\tif (Object.keys(errors).length > 0) return errors;\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"assessment-prompt\",\n\n\ttemplate: require(\"./templates/assessmentPrompt.nunj\").editor,\n\n\tui: {\n\t\tsaveButton: \"button.save\",\n\t\tcancelButton: \"button.skip\",\n\t\tmessage: \"span.message\",\n\t\tworkingSpinner: \"span.spinner-working\",\n\n\t\tsave: \"input[name='chkSave']\",\n\t\tinstanceName: \"input[name='instanceName']\",\n\t\tactivationType: \"select[name='activationType']\",\n\t\tcode: \"input[name='chkCode']\",\n\t\tname: \"div.name\",\n\t\tcodeShow: \"div.codeShow\",\n\t\tcodeField: \".code-show\",\n\t\ttimes: \"div.times\",\n\t\tstartDate: \"#startDate\",\n\t\tstartTime: \"#startTime\",\n\t\tdisableRandomization: \"input[name='chkDisableRandomization']\",\n\t\thideCompleteButtons: \"input[name='chkHideCompleteButtons']\",\n\t\tdisableResult: \"input[name='chkDisableResult']\"\n\t},\n\n\tevents: {\n\t\tclick: \"onClick\",\n\t\t\"change @ui.save\": \"onSaveChange\",\n\t\t\"change @ui.activationType\": \"onActivationTypeChange\",\n\t\t\"change @ui.code\": \"onCodeChange\",\n\t\t\"click @ui.saveButton\": \"onSave\",\n\t\t\"click @ui.cancelButton\": \"onCancel\"\n\t},\n\n\tmodelEvents: {\n\t\tchange: \"onModelChanged\",\n\t\tinvalid: \"validationFail\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tisNew: this.model.isNew()\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.model = new AssessmentSettingsModel(options.settings || {});\n\n\t\tthis.bindEvents(this.model, this.modelEvents);\n\n\t\tthis.host = options.host || \"#modals\";\n\n\t\tthis.noTime = options.noTime;\n\n\t\t// Calculate the random code for this instance\n\t\tvar code = options.resource.get(\"baseCode\");\n\n\t\tthis.randomString = _.times(6, function () {\n\t\t\treturn (Math.random() * 16 | 0).toString(16);\n\t\t}).join(\"\");\n\n\t\tif (code) {\n\t\t\tthis.setCode(code);\n\t\t} else {\n\t\t\t$.ajax({\n\t\t\t\tmethod: \"GET\",\n\t\t\t\turl: settings.urlRoot + \"/acacia/learningPaths/resources/\" + options.resource.get(\"_id\"),\n\t\t\t\tsuccess: this.onResourceFetchSuccess.bind(this),\n\t\t\t\terror: function error(model, xhr) {\n\t\t\t\t\tconsole.error(xhr);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n\n\tonResourceFetchSuccess: function onResourceFetchSuccess(response) {\n\t\tthis.setCode(response.baseCode);\n\t\tif (this.ui.codeField.text() === \"\") this.ui.codeField.text(this.code);\n\t},\n\n\tsetCode: function setCode(code) {\n\t\tthis.code = (parseInt(code, 16) ^ parseInt(this.randomString, 16)).toString(16);\n\n\t\twhile (this.code.length < 6) {\n\t\t\tthis.code = \"0\" + this.code;\n\t\t}if (this.ui.codeField.text) this.ui.codeField.text(this.code);\n\t},\n\n\tserializeData: function serializeData() {\n\t\treturn _.merge(this.model.toJSON(), {\n\t\t\tcode: this.code,\n\t\t\tnoTime: this.noTime\n\t\t});\n\t},\n\n\tshow: function show() {\n\t\t$(\".modal-container\", $(this.host)).append(this.render().el);\n\t},\n\n\tonRender: function onRender() {\n\t\tvar d = this.model.has(\"activationTime\") && this.model.get(\"activationTime\") !== 0 ? moment.unix(this.model.get(\"activationTime\")).local().hour(0).minute(0).second(0).valueOf() : moment.unix(moment().unix()).local().hour(0).minute(0).second(0).valueOf();\n\n\t\tflatpickr(this.ui.startDate.get(0), {\n\t\t\tdefaultDate: d,\n\t\t\tdateFormat: \"d M Y\",\n\t\t\taltInput: true,\n\t\t\taltFormat: \"d M Y\"\n\t\t});\n\n\t\tflatpickr(this.ui.startTime.get(0), {\n\t\t\tenableTime: true,\n\t\t\tnoCalendar: true,\n\t\t\tdefaultDate: this.model.has(\"activationTime\") ? this.model.get(\"activationTime\") * 1000 : 0,\n\t\t\taltInput: true,\n\t\t\tdateFormat: \"H i\",\n\t\t\taltFormat: \"H:i K\"\n\t\t});\n\n\t\t// Render a background\n\t\t$(\".modal-element\", $(this.host)).removeClass(\"hide\");\n\t\t$(\"body\").addClass(\"hide-overflow\");\n\n\t\tif (this.model.get(\"activationTime\")) {\n\t\t\tthis.ui.activationType.val(\"specific\");\n\t\t\tthis.ui.times.removeClass(\"hide\");\n\t\t}\n\n\t\tthis.ui.activationType.chosen({\n\t\t\tdisable_search: true,\n\t\t\twidth: \"175px\"\n\t\t});\n\t},\n\n\tonDestroy: function onDestroy() {\n\t\t// Clean up the background\n\t\t$(\".modal-element\", $(this.host)).addClass(\"hide\");\n\t\t$(\"body\").removeClass(\"hide-overflow\");\n\t},\n\n\tonClick: function onClick(event) {\n\t\tevent.stopPropagation();\n\t},\n\n\tonSaveChange: function onSaveChange() {\n\t\tif (this.ui.save.is(\":checked\")) this.ui.name.removeClass(\"hide\");else this.ui.name.addClass(\"hide\");\n\t},\n\n\tonCodeChange: function onCodeChange() {\n\t\tif (this.ui.code.is(\":checked\")) this.ui.codeShow.removeClass(\"hide\");else this.ui.codeShow.addClass(\"hide\");\n\t},\n\n\tonActivationTypeChange: function onActivationTypeChange() {\n\t\tif (this.ui.activationType.val() === \"immediate\") this.ui.times.addClass(\"hide\");else this.ui.times.removeClass(\"hide\");\n\t},\n\n\tshowMessage: function showMessage(message) {\n\t\t$(\"span.message\", this.el).text(message);\n\t},\n\n\tonSave: function onSave() {\n\t\tvar activationTime = moment(this.ui.startDate.val(), \"DD MMM YYYY\").hour(0).minute(0).second(0);\n\t\tvar time = moment(this.ui.startTime.val(), \"h:mma\");\n\t\tactivationTime.hour(time.hour()).minute(time.minute()).second(0);\n\n\t\tvar data = {\n\t\t\tsave: this.ui.save.is(\":checked\"),\n\t\t\tinstanceName: this.ui.save.is(\":checked\") ? this.ui.instanceName.val() : \"\",\n\t\t\tactivationType: this.ui.activationType.val(),\n\t\t\tstartDate: this.ui.startDate.val(),\n\t\t\tstartTime: this.ui.startTime.val(),\n\t\t\trequireCode: this.ui.code.is(\":checked\"),\n\t\t\tcode: this.randomString,\n\t\t\tdisableRandomization: this.ui.disableRandomization.is(\":checked\"),\n\t\t\thideCompleteButtons: this.ui.hideCompleteButtons.is(\":checked\"),\n\t\t\tdisableResult: this.ui.disableResult.is(\":checked\"),\n\t\t\tactivationTime: this.ui.activationType.val() === \"specific\" ? activationTime.unix() : null\n\t\t};\n\n\t\tthis.ui.message.addClass(\"hide\");\n\n\t\tthis.model.set(data, { validate: true });\n\t},\n\n\tvalidationFail: function validationFail() {\n\t\tvar _this = this;\n\n\t\t$(\".error\", this.el).remove();\n\n\t\tconsole.error(this.model.validationError);\n\n\t\tthis.ui.message.text(\"There were some errors and the attachment could not be created.\").removeClass(\"hide\");\n\t\tthis.ui.saveButton.removeClass(\"disabled\");\n\n\t\t_.each(this.model.validationError, function (item, key) {\n\t\t\t_this.ui[key].parent().append(\"<span class='error'>\" + item + \"</span>\");\n\t\t\t_this.ui[key].on(\"change keyup\", _this.clearError);\n\t\t});\n\t},\n\n\tclearError: function clearError(event) {\n\t\tvar el = $(event.currentTarget);\n\t\tel.parent().find(\".error\").remove();\n\t},\n\n\tonModelChanged: function onModelChanged(model) {\n\t\tthis.destroy();\n\n\t\tthis.trigger(\"action\", \"ok\", model.toJSON());\n\t},\n\n\tonCancel: function onCancel() {\n\t\tthis.destroy();\n\n\t\tthis.trigger(\"action\", \"cancel\");\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFzc2Vzc21lbnRQcm9tcHQuanMiXSwibmFtZXMiOlsiJCIsInJlcXVpcmUiLCJfIiwiQmFja2JvbmUiLCJtb21lbnQiLCJmbGF0cGlja3IiLCJzZXR0aW5ncyIsIkFzc2Vzc21lbnRTZXR0aW5nc01vZGVsIiwiRXBveHkiLCJNb2RlbCIsImV4dGVuZCIsImlkQXR0cmlidXRlIiwidmFsaWRhdGUiLCJhdHRyaWJ1dGVzIiwiZXJyb3JzIiwic2F2ZSIsImluc3RhbmNlTmFtZSIsImFjdGl2YXRpb25UeXBlIiwic3RhcnRUaW1lIiwiaXNWYWxpZCIsImFjdGl2YXRpb25UaW1lIiwidW5peCIsInN0YXJ0RGF0ZSIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsImVkaXRvciIsInVpIiwic2F2ZUJ1dHRvbiIsImNhbmNlbEJ1dHRvbiIsIm1lc3NhZ2UiLCJ3b3JraW5nU3Bpbm5lciIsImNvZGUiLCJuYW1lIiwiY29kZVNob3ciLCJjb2RlRmllbGQiLCJ0aW1lcyIsImRpc2FibGVSYW5kb21pemF0aW9uIiwiaGlkZUNvbXBsZXRlQnV0dG9ucyIsImRpc2FibGVSZXN1bHQiLCJldmVudHMiLCJjbGljayIsIm1vZGVsRXZlbnRzIiwiY2hhbmdlIiwiaW52YWxpZCIsInRlbXBsYXRlQ29udGV4dCIsImlzTmV3IiwibW9kZWwiLCJpbml0aWFsaXplIiwib3B0aW9ucyIsImJpbmRFdmVudHMiLCJob3N0Iiwibm9UaW1lIiwicmVzb3VyY2UiLCJnZXQiLCJyYW5kb21TdHJpbmciLCJNYXRoIiwicmFuZG9tIiwidG9TdHJpbmciLCJqb2luIiwic2V0Q29kZSIsImFqYXgiLCJtZXRob2QiLCJ1cmwiLCJ1cmxSb290Iiwic3VjY2VzcyIsIm9uUmVzb3VyY2VGZXRjaFN1Y2Nlc3MiLCJiaW5kIiwiZXJyb3IiLCJ4aHIiLCJjb25zb2xlIiwicmVzcG9uc2UiLCJiYXNlQ29kZSIsInRleHQiLCJwYXJzZUludCIsInNlcmlhbGl6ZURhdGEiLCJtZXJnZSIsInRvSlNPTiIsInNob3ciLCJhcHBlbmQiLCJyZW5kZXIiLCJlbCIsIm9uUmVuZGVyIiwiZCIsImhhcyIsImxvY2FsIiwiaG91ciIsIm1pbnV0ZSIsInNlY29uZCIsInZhbHVlT2YiLCJkZWZhdWx0RGF0ZSIsImRhdGVGb3JtYXQiLCJhbHRJbnB1dCIsImFsdEZvcm1hdCIsImVuYWJsZVRpbWUiLCJub0NhbGVuZGFyIiwicmVtb3ZlQ2xhc3MiLCJhZGRDbGFzcyIsInZhbCIsImNob3NlbiIsImRpc2FibGVfc2VhcmNoIiwid2lkdGgiLCJvbkRlc3Ryb3kiLCJvbkNsaWNrIiwiZXZlbnQiLCJzdG9wUHJvcGFnYXRpb24iLCJvblNhdmVDaGFuZ2UiLCJpcyIsIm9uQ29kZUNoYW5nZSIsIm9uQWN0aXZhdGlvblR5cGVDaGFuZ2UiLCJzaG93TWVzc2FnZSIsIm9uU2F2ZSIsInRpbWUiLCJkYXRhIiwicmVxdWlyZUNvZGUiLCJzZXQiLCJ2YWxpZGF0aW9uRmFpbCIsInJlbW92ZSIsInZhbGlkYXRpb25FcnJvciIsImVhY2giLCJpdGVtIiwia2V5IiwicGFyZW50Iiwib24iLCJjbGVhckVycm9yIiwiY3VycmVudFRhcmdldCIsImZpbmQiLCJvbk1vZGVsQ2hhbmdlZCIsImRlc3Ryb3kiLCJ0cmlnZ2VyIiwib25DYW5jZWwiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsSUFBSUQsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNRSxXQUFXRixRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNRyxTQUFTSCxRQUFRLFFBQVIsQ0FBZjtBQUNBLElBQU1JLFlBQVlKLFFBQVEsV0FBUixDQUFsQjtBQUNBLElBQU1LLFdBQVdMLFFBQVEsY0FBUixDQUFqQjs7QUFFQSxJQUFNTSwwQkFBMEJKLFNBQVNLLEtBQVQsQ0FBZUMsS0FBZixDQUFxQkMsTUFBckIsQ0FBNEI7QUFDM0RD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QXZCLEVBQTZCbEYsTUFBTThCLE1BQU4sRUFBN0I7QUFDQSxFQTNOK0M7O0FBNk5oRHFELFdBQVUsb0JBQVc7QUFDcEIsT0FBS0YsT0FBTDs7QUFFQSxPQUFLQyxPQUFMLENBQWEsUUFBYixFQUF1QixRQUF2QjtBQUNBO0FBak8rQyxDQUFoQyxDQUFqQiIsImZpbGUiOiJhc3Nlc3NtZW50UHJvbXB0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCBtb21lbnQgPSByZXF1aXJlKFwibW9tZW50XCIpO1xuY29uc3QgZmxhdHBpY2tyID0gcmVxdWlyZShcImZsYXRwaWNrclwiKTtcbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxuY29uc3QgQXNzZXNzbWVudFNldHRpbmdzTW9kZWwgPSBCYWNrYm9uZS5FcG94eS5Nb2RlbC5leHRlbmQoe1xuXHRpZEF0dHJpYnV0ZTogXCJfaWRcIixcblxuXHR2YWxpZGF0ZTogZnVuY3Rpb24oYXR0cmlidXRlcykge1xuXHRcdGNvbnN0IGVycm9ycyA9IHt9O1xuXG5cdFx0aWYgKGF0dHJpYnV0ZXMuc2F2ZSAmJiAhYXR0cmlidXRlcy5pbnN0YW5jZU5hbWUpXG5cdFx0XHRlcnJvcnMuaW5zdGFuY2VOYW1lID0gXCJZb3UgbXVzdCBwcm92aWRlIGEgbmFtZSBzbyB0aGF0IG1hcmtzIGNhbiBiZSBzYXZlZCB0byB0aGUgc2VydmVyLlwiO1xuXG5cdFx0aWYgKGF0dHJpYnV0ZXMuYWN0aXZhdGlvblR5cGUgPT09IFwic3BlY2lmaWNcIikge1xuXHRcdFx0aWYgKCFhdHRyaWJ1dGVzLnN0YXJ0VGltZSlcblx0XHRcdFx0ZXJyb3JzLnN0YXJ0VGltZSA9IFwiWW91IG11c3QgcHJvdmlkZSBhIHN0YXJ0aW5nIHRpbWUuXCI7XG5cdFx0XHRlbHNlIGlmICghbW9tZW50KGF0dHJpYnV0ZXMuc3RhcnRUaW1lLCBcImg6bW1hXCIpLmlzVmFsaWQoKSlcblx0XHRcdFx0ZXJyb3JzLnN0YXJ0VGltZSA9IFwiVGhlIHByb3ZpZGVkIHN0YXJ0aW5nIHRpbWUgaXMgbm90IGEgdmFsaWQgdGltZS5cIjtcblxuXHRcdFx0aWYgKGF0dHJpYnV0ZXMuYWN0aXZhdGlvblRpbWUgJiYgYXR0cmlidXRlcy5hY3RpdmF0aW9uVGltZSA8IG1vbWVudCgpLnVuaXgoKSlcblx0XHRcdFx0ZXJyb3JzLnN0YXJ0RGF0ZSA9IFwiWW91IGNhbm5vdCBzZXQgYW4gdW5sb2NrIGRhdGUgdGhhdCBpcyBiZWZvcmUgdGhlIGN1cnJlbnQgZGF0ZVwiO1xuXHRcdH1cblxuXHRcdGlmIChPYmplY3Qua2V5cyhlcnJvcnMpLmxlbmd0aCA+IDApXG5cdFx0XHRyZXR1cm4gZXJyb3JzO1xuXHR9LFxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJhc3Nlc3NtZW50LXByb21wdFwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi90ZW1wbGF0ZXMvYXNzZXNzbWVudFByb21wdC5udW5qXCIpLmVkaXRvcixcblxuXHR1aToge1xuXHRcdHNhdmVCdXR0b246IFwiYnV0dG9uLnNhdmVcIixcblx0XHRjYW5jZWxCdXR0b246IFwiYnV0dG9uLnNraXBcIixcblx0XHRtZXNzYWdlOiBcInNwYW4ubWVzc2FnZVwiLFxuXHRcdHdvcmtpbmdTcGlubmVyOiBcInNwYW4uc3Bpbm5lci13b3JraW5nXCIsXG5cblx0XHRzYXZlOiBcImlucHV0W25hbWU9J2Noa1NhdmUnXVwiLFxuXHRcdGluc3RhbmNlTmFtZTogXCJpbnB1dFtuYW1lPSdpbnN0YW5jZU5hbWUnXVwiLFxuXHRcdGFjdGl2YXRpb25UeXBlOiBcInNlbGVjdFtuYW1lPSdhY3RpdmF0aW9uVHlwZSddXCIsXG5cdFx0Y29kZTogXCJpbnB1dFtuYW1lPSdjaGtDb2RlJ11cIixcblx0XHRuYW1lOiBcImRpdi5uYW1lXCIsXG5cdFx0Y29kZVNob3c6IFwiZGl2LmNvZGVTaG93XCIsXG5cdFx0Y29kZUZpZWxkOiBcIi5jb2RlLXNob3dcIixcblx0XHR0aW1lczogXCJkaXYudGltZXNcIixcblx0XHRzdGFydERhdGU6IFwiI3N0YXJ0RGF0ZVwiLFxuXHRcdHN0YXJ0VGltZTogXCIjc3RhcnRUaW1lXCIsXG5cdFx0ZGlzYWJsZVJhbmRvbWl6YXRpb246IFwiaW5wdXRbbmFtZT0nY2hrRGlzYWJsZVJhbmRvbWl6YXRpb24nXVwiLFxuXHRcdGhpZGVDb21wbGV0ZUJ1dHRvbnM6IFwiaW5wdXRbbmFtZT0nY2hrSGlkZUNvbXBsZXRlQnV0dG9ucyddXCIsXG5cdFx0ZGlzYWJsZVJlc3VsdDogXCJpbnB1dFtuYW1lPSdjaGtEaXNhYmxlUmVzdWx0J11cIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRjbGljazogXCJvbkNsaWNrXCIsXG5cdFx0XCJjaGFuZ2UgQHVpLnNhdmVcIjogXCJvblNhdmVDaGFuZ2VcIixcblx0XHRcImNoYW5nZSBAdWkuYWN0aXZhdGlvblR5cGVcIjogXCJvbkFjdGl2YXRpb25UeXBlQ2hhbmdlXCIsXG5cdFx0XCJjaGFuZ2UgQHVpLmNvZGVcIjogXCJvbkNvZGVDaGFuZ2VcIixcblx0XHRcImNsaWNrIEB1aS5zYXZlQnV0dG9uXCI6IFwib25TYXZlXCIsXG5cdFx0XCJjbGljayBAdWkuY2FuY2VsQnV0dG9uXCI6IFwib25DYW5jZWxcIixcblx0fSxcblxuXHRtb2RlbEV2ZW50czoge1xuXHRcdGNoYW5nZTogXCJvbk1vZGVsQ2hhbmdlZFwiLFxuXHRcdGludmFsaWQ6IFwidmFsaWRhdGlvbkZhaWxcIixcblx0fSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRpc05ldzogdGhpcy5tb2RlbC5pc05ldygpLFxuXHRcdH07XG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMubW9kZWwgPSBuZXcgQXNzZXNzbWVudFNldHRpbmdzTW9kZWwob3B0aW9ucy5zZXR0aW5ncyB8fCB7fSk7XG5cblx0XHR0aGlzLmJpbmRFdmVudHModGhpcy5tb2RlbCwgdGhpcy5tb2RlbEV2ZW50cyk7XG5cblx0XHR0aGlzLmhvc3QgPSBvcHRpb25zLmhvc3QgfHwgXCIjbW9kYWxzXCI7XG5cblx0XHR0aGlzLm5vVGltZSA9IG9wdGlvbnMubm9UaW1lO1xuXG5cdFx0Ly8gQ2FsY3VsYXRlIHRoZSByYW5kb20gY29kZSBmb3IgdGhpcyBpbnN0YW5jZVxuXHRcdGNvbnN0IGNvZGUgPSBvcHRpb25zLnJlc291cmNlLmdldChcImJhc2VDb2RlXCIpO1xuXG5cdFx0dGhpcy5yYW5kb21TdHJpbmcgPSBfLnRpbWVzKDYsICgpID0+IChNYXRoLnJhbmRvbSgpICogMTYgfCAwKS50b1N0cmluZygxNikpLmpvaW4oXCJcIik7XG5cblx0XHRpZiAoY29kZSkge1xuXHRcdFx0dGhpcy5zZXRDb2RlKGNvZGUpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdCQuYWpheCh7XG5cdFx0XHRcdG1ldGhvZDogXCJHRVRcIixcblx0XHRcdFx0dXJsOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYWNhY2lhL2xlYXJuaW5nUGF0aHMvcmVzb3VyY2VzL1wiICsgb3B0aW9ucy5yZXNvdXJjZS5nZXQoXCJfaWRcIiksXG5cdFx0XHRcdHN1Y2Nlc3M6IHRoaXMub25SZXNvdXJjZUZldGNoU3VjY2Vzcy5iaW5kKHRoaXMpLFxuXHRcdFx0XHRlcnJvcjogZnVuY3Rpb24obW9kZWwsIHhocikge1xuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoeGhyKTtcblx0XHRcdFx0fSxcblx0XHRcdH0pO1xuXHRcdH1cblx0fSxcblxuXHRvblJlc291cmNlRmV0Y2hTdWNjZXNzOiBmdW5jdGlvbihyZXNwb25zZSkge1xuXHRcdHRoaXMuc2V0Q29kZShyZXNwb25zZS5iYXNlQ29kZSk7XG5cdFx0aWYgKHRoaXMudWkuY29kZUZpZWxkLnRleHQoKSA9PT0gXCJcIilcblx0XHRcdHRoaXMudWkuY29kZUZpZWxkLnRleHQodGhpcy5jb2RlKTtcblx0fSxcblxuXHRzZXRDb2RlOiBmdW5jdGlvbihjb2RlKSB7XG5cdFx0dGhpcy5jb2RlID0gKHBhcnNlSW50KGNvZGUsIDE2KSBeIHBhcnNlSW50KHRoaXMucmFuZG9tU3RyaW5nLCAxNikpLnRvU3RyaW5nKDE2KTtcblxuXHRcdHdoaWxlKHRoaXMuY29kZS5sZW5ndGggPCA2KVxuXHRcdFx0dGhpcy5jb2RlID0gXCIwXCIgKyB0aGlzLmNvZGU7XG5cblx0XHRpZiAodGhpcy51aS5jb2RlRmllbGQudGV4dClcblx0XHRcdHRoaXMudWkuY29kZUZpZWxkLnRleHQodGhpcy5jb2RlKTtcblx0fSxcblxuXHRzZXJpYWxpemVEYXRhOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gXy5tZXJnZSh0aGlzLm1vZGVsLnRvSlNPTigpLCB7XG5cdFx0XHRjb2RlOiB0aGlzLmNvZGUsXG5cdFx0XHRub1RpbWU6IHRoaXMubm9UaW1lLFxuXHRcdH0pO1xuXHR9LFxuXG5cdHNob3c6IGZ1bmN0aW9uKCkge1xuXHRcdCQoXCIubW9kYWwtY29udGFpbmVyXCIsICQodGhpcy5ob3N0KSkuYXBwZW5kKHRoaXMucmVuZGVyKCkuZWwpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBkID0gdGhpcy5tb2RlbC5oYXMoXCJhY3RpdmF0aW9uVGltZVwiKSAmJiB0aGlzLm1vZGVsLmdldChcImFjdGl2YXRpb25UaW1lXCIpICE9PSAwID8gbW9tZW50LnVuaXgodGhpcy5tb2RlbC5nZXQoXCJhY3RpdmF0aW9uVGltZVwiKSkubG9jYWwoKS5ob3VyKDApLm1pbnV0ZSgwKS5zZWNvbmQoMCkudmFsdWVPZigpIDpcblx0XHRcdG1vbWVudC51bml4KG1vbWVudCgpLnVuaXgoKSkubG9jYWwoKS5ob3VyKDApLm1pbnV0ZSgwKS5zZWNvbmQoMCkudmFsdWVPZigpO1xuXG5cdFx0ZmxhdHBpY2tyKHRoaXMudWkuc3RhcnREYXRlLmdldCgwKSwge1xuXHRcdFx0ZGVmYXVsdERhdGU6IGQsXG5cdFx0XHRkYXRlRm9ybWF0OiBcImQgTSBZXCIsXG5cdFx0XHRhbHRJbnB1dDogdHJ1ZSxcblx0XHRcdGFsdEZvcm1hdDogXCJkIE0gWVwiLFxuXHRcdH0pO1xuXG5cdFx0ZmxhdHBpY2tyKHRoaXMudWkuc3RhcnRUaW1lLmdldCgwKSwge1xuXHRcdFx0ZW5hYmxlVGltZTogdHJ1ZSxcblx0XHRcdG5vQ2FsZW5kYXI6IHRydWUsXG5cdFx0XHRkZWZhdWx0RGF0ZTogdGhpcy5tb2RlbC5oYXMoXCJhY3RpdmF0aW9uVGltZVwiKSA/IHRoaXMubW9kZWwuZ2V0KFwiYWN0aXZhdGlvblRpbWVcIikgKiAxMDAwIDogMCxcblx0XHRcdGFsdElucHV0OiB0cnVlLFxuXHRcdFx0ZGF0ZUZvcm1hdDogXCJIIGlcIixcblx0XHRcdGFsdEZvcm1hdDogXCJIOmkgS1wiLFxuXHRcdH0pO1xuXG5cdFx0Ly8gUmVuZGVyIGEgYmFja2dyb3VuZFxuXHRcdCQoXCIubW9kYWwtZWxlbWVudFwiLCAkKHRoaXMuaG9zdCkpLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHQkKFwiYm9keVwiKS5hZGRDbGFzcyhcImhpZGUtb3ZlcmZsb3dcIik7XG5cblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJhY3RpdmF0aW9uVGltZVwiKSkge1xuXHRcdFx0dGhpcy51aS5hY3RpdmF0aW9uVHlwZS52YWwoXCJzcGVjaWZpY1wiKTtcblx0XHRcdHRoaXMudWkudGltZXMucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblxuXHRcdHRoaXMudWkuYWN0aXZhdGlvblR5cGUuY2hvc2VuKHtcblx0XHRcdGRpc2FibGVfc2VhcmNoOiB0cnVlLFxuXHRcdFx0d2lkdGg6IFwiMTc1cHhcIixcblx0XHR9KTtcblx0fSxcblxuXHRvbkRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIENsZWFuIHVwIHRoZSBiYWNrZ3JvdW5kXG5cdFx0JChcIi5tb2RhbC1lbGVtZW50XCIsICQodGhpcy5ob3N0KSkuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdCQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKFwiaGlkZS1vdmVyZmxvd1wiKTtcblx0fSxcblxuXHRvbkNsaWNrOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9LFxuXG5cdG9uU2F2ZUNoYW5nZTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMudWkuc2F2ZS5pcyhcIjpjaGVja2VkXCIpKVxuXHRcdFx0dGhpcy51aS5uYW1lLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnVpLm5hbWUuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdG9uQ29kZUNoYW5nZTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMudWkuY29kZS5pcyhcIjpjaGVja2VkXCIpKVxuXHRcdFx0dGhpcy51aS5jb2RlU2hvdy5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy51aS5jb2RlU2hvdy5hZGRDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0b25BY3RpdmF0aW9uVHlwZUNoYW5nZTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMudWkuYWN0aXZhdGlvblR5cGUudmFsKCkgPT09IFwiaW1tZWRpYXRlXCIpXG5cdFx0XHR0aGlzLnVpLnRpbWVzLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnVpLnRpbWVzLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRzaG93TWVzc2FnZTogZnVuY3Rpb24obWVzc2FnZSkge1xuXHRcdCQoXCJzcGFuLm1lc3NhZ2VcIiwgdGhpcy5lbCkudGV4dChtZXNzYWdlKTtcblx0fSxcblxuXHRvblNhdmU6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGFjdGl2YXRpb25UaW1lID0gbW9tZW50KHRoaXMudWkuc3RhcnREYXRlLnZhbCgpLCBcIkREIE1NTSBZWVlZXCIpLmhvdXIoMCkubWludXRlKDApLnNlY29uZCgwKTtcblx0XHRjb25zdCB0aW1lID0gbW9tZW50KHRoaXMudWkuc3RhcnRUaW1lLnZhbCgpLCBcImg6bW1hXCIpO1xuXHRcdGFjdGl2YXRpb25UaW1lLmhvdXIodGltZS5ob3VyKCkpLm1pbnV0ZSh0aW1lLm1pbnV0ZSgpKS5zZWNvbmQoMCk7XG5cblx0XHRjb25zdCBkYXRhID0ge1xuXHRcdFx0c2F2ZTogdGhpcy51aS5zYXZlLmlzKFwiOmNoZWNrZWRcIiksXG5cdFx0XHRpbnN0YW5jZU5hbWU6IHRoaXMudWkuc2F2ZS5pcyhcIjpjaGVja2VkXCIpID8gdGhpcy51aS5pbnN0YW5jZU5hbWUudmFsKCkgOiBcIlwiLFxuXHRcdFx0YWN0aXZhdGlvblR5cGU6IHRoaXMudWkuYWN0aXZhdGlvblR5cGUudmFsKCksXG5cdFx0XHRzdGFydERhdGU6IHRoaXMudWkuc3RhcnREYXRlLnZhbCgpLFxuXHRcdFx0c3RhcnRUaW1lOiB0aGlzLnVpLnN0YXJ0VGltZS52YWwoKSxcblx0XHRcdHJlcXVpcmVDb2RlOiB0aGlzLnVpLmNvZGUuaXMoXCI6Y2hlY2tlZFwiKSxcblx0XHRcdGNvZGU6IHRoaXMucmFuZG9tU3RyaW5nLFxuXHRcdFx0ZGlzYWJsZVJhbmRvbWl6YXRpb246IHRoaXMudWkuZGlzYWJsZVJhbmRvbWl6YXRpb24uaXMoXCI6Y2hlY2tlZFwiKSxcblx0XHRcdGhpZGVDb21wbGV0ZUJ1dHRvbnM6IHRoaXMudWkuaGlkZUNvbXBsZXRlQnV0dG9ucy5pcyhcIjpjaGVja2VkXCIpLFxuXHRcdFx0ZGlzYWJsZVJlc3VsdDogdGhpcy51aS5kaXNhYmxlUmVzdWx0LmlzKFwiOmNoZWNrZWRcIiksXG5cdFx0XHRhY3RpdmF0aW9uVGltZTogdGhpcy51aS5hY3RpdmF0aW9uVHlwZS52YWwoKSA9PT0gXCJzcGVjaWZpY1wiID8gYWN0aXZhdGlvblRpbWUudW5peCgpIDogbnVsbCxcblx0XHR9O1xuXG5cdFx0dGhpcy51aS5tZXNzYWdlLmFkZENsYXNzKFwiaGlkZVwiKTtcblxuXHRcdHRoaXMubW9kZWwuc2V0KGRhdGEsIHsgdmFsaWRhdGU6IHRydWUgfSk7XG5cdH0sXG5cblx0dmFsaWRhdGlvbkZhaWw6IGZ1bmN0aW9uKCkge1xuXHRcdCQoXCIuZXJyb3JcIiwgdGhpcy5lbCkucmVtb3ZlKCk7XG5cblx0XHRjb25zb2xlLmVycm9yKHRoaXMubW9kZWwudmFsaWRhdGlvbkVycm9yKTtcblxuXHRcdHRoaXMudWkubWVzc2FnZS50ZXh0KFwiVGhlcmUgd2VyZSBzb21lIGVycm9ycyBhbmQgdGhlIGF0dGFjaG1lbnQgY291bGQgbm90IGJlIGNyZWF0ZWQuXCIpLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLnNhdmVCdXR0b24ucmVtb3ZlQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblxuXHRcdF8uZWFjaCh0aGlzLm1vZGVsLnZhbGlkYXRpb25FcnJvciwgKGl0ZW0sIGtleSkgPT4ge1xuXHRcdFx0dGhpcy51aVtrZXldLnBhcmVudCgpLmFwcGVuZChcIjxzcGFuIGNsYXNzPSdlcnJvcic+XCIgKyBpdGVtICsgXCI8L3NwYW4+XCIpO1xuXHRcdFx0dGhpcy51aVtrZXldLm9uKFwiY2hhbmdlIGtleXVwXCIsIHRoaXMuY2xlYXJFcnJvcik7XG5cdFx0fSk7XG5cdH0sXG5cblx0Y2xlYXJFcnJvcjogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRjb25zdCBlbCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG5cdFx0ZWwucGFyZW50KCkuZmluZChcIi5lcnJvclwiKS5yZW1vdmUoKTtcblx0fSxcblxuXHRvbk1vZGVsQ2hhbmdlZDogZnVuY3Rpb24obW9kZWwpIHtcblx0XHR0aGlzLmRlc3Ryb3koKTtcblxuXHRcdHRoaXMudHJpZ2dlcihcImFjdGlvblwiLCBcIm9rXCIsIG1vZGVsLnRvSlNPTigpKTtcblx0fSxcblxuXHRvbkNhbmNlbDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5kZXN0cm95KCk7XG5cblx0XHR0aGlzLnRyaWdnZXIoXCJhY3Rpb25cIiwgXCJjYW5jZWxcIik7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\n//var moment = require(\"moment\");\nvar Promise = require(\"bluebird\");\nvar qs = require(\"querystring\");\n\n//var loc = require(\"moment/locale/en-gb.js\");\n//moment.locale(\"en-gb\", loc);\n\nrequire(\"chosen\");\nvar Backbone = require(\"backbone\");\nBackbone.$ = $;\nrequire(\"backbone.paginator\");\nrequire(\"string_score\");\n\nvar VirtualCollection = require(\"backbone.virtual-collection\");\nBackbone.VirtualCollection = VirtualCollection;\nrequire(\"toolbar\");\nrequire(\"marionette\");\nrequire(\"backbone.epoxy\");\nrequire(\"fullcalendar\");\nrequire(\"multiselect\");\n// eslint-disable-next-line node/no-extraneous-require\nrequire(\"timepicker\");\nrequire(\"quicksearch\");\nrequire(\"spectrum\");\n\nvar App = void 0;\n\n// $.getScript is broken in IE11. Because of course it is.\n$.dynamicScript = function (url, callback) {\n\tvar script = document.createElement(\"script\");\n\tscript.type = \"text/javascript\";\n\n\tif (script.readyState) {\n\t\t//IE\n\t\tscript.onreadystatechange = function () {\n\t\t\tif (script.readyState === \"loaded\" || script.readyState === \"complete\") {\n\t\t\t\tscript.onreadystatechange = null;\n\t\t\t\treturn callback();\n\t\t\t}\n\t\t};\n\t} else {\n\t\t//Others\n\t\tscript.addEventListener(\"load\", function () {\n\t\t\tcallback();\n\t\t});\n\t}\n\n\tscript.src = url;\n\tdocument.getElementsByTagName(\"head\")[0].appendChild(script);\n};\n\n// Convert jQuery object into selector string\n$.fn.getPath = function () {\n\tif (this.length !== 1) throw new Error(\"Requires one element\");\n\n\tvar path = [];\n\tvar el = this[0];\n\n\twhile (el.nodeType === Node.ELEMENT_NODE && el.nodeName.toLowerCase() !== \"body\" && el.nodeName.toLowerCase() !== \"html\") {\n\t\tpath.push(el.nodeName.toLowerCase().replace(/:/g, \"\\\\:\") + \":nth-child(\" + ($(el).index() + 1) + \")\");\n\t\tel = el.parentNode;\n\t}\n\n\tpath.push(\"body\");\n\tvar sel = path.reverse().join(\" > \");\n\n\treturn sel;\n};\n\n// Some stuff to keep track of global Ajax calls, to allow aborts\n$.abortAllXhr = function () {\n\tif (!App) App = require(\"../index\");\n\n\t_.each(App.xhrQueue, function (xhr) {\n\t\txhr.abort();\n\t});\n\n\tApp.xhrQueue = [];\n};\n\n// CSRF token for general Ajax calls\n$.ajaxSetup({\n\tcache: false,\n\tbeforeSend: function beforeSend(xhr, settings) {\n\t\tif (!App) App = require(\"../index\");\n\n\t\tif (!settings.uncancellable) App.xhrQueue.push(xhr);\n\n\t\t// Append the CSRF token\n\t\txhr.setRequestHeader(\"X-CSRF-TOKEN\", App.Session ? App.Session.get(\"_csrf\") || $(\"meta[name='csrf-token']\").attr(\"content\") : $(\"meta[name='csrf-token']\").attr(\"content\"));\n\t\t// No HTTP Basic for UI front-end\n\t\txhr.setRequestHeader(\"X-Auth-Mechanism\", \"no-basic\");\n\t\t// Do we need to send a JWT token?\n\t\tvar url = qs.parse(window.location.search ? window.location.search.slice(1) : \"\");\n\t\tif (url.auth_token) xhr.setRequestHeader(\"Authorization\", \"JWT \" + url.auth_token);\n\t}\n});\n\n// Patch the Backbone sync method to emit upload progress events\n// And to also send the CSRF token\nvar oldSync = Backbone.sync;\nBackbone.sync = function (method, model, options) {\n\toptions.beforeSend = function (xhr, settings) {\n\t\tif (!settings.uncancellable) App.xhrQueue.push(xhr);\n\n\t\t// CSRF token\n\t\tif (App.Session) xhr.setRequestHeader(\"X-CSRF-TOKEN\", App.Session.get(\"_csrf\") || $(\"meta[name='csrf-token']\").attr(\"content\"));\n\n\t\t// No HTTP Basic for UI front-end\n\t\txhr.setRequestHeader(\"X-Auth-Mechanism\", \"no-basic\");\n\n\t\tsettings.xhr = function () {\n\t\t\tvar xhr2 = $.ajaxSettings.xhr();\n\t\t\txhr2.upload.addEventListener(\"progress\", function (evt) {\n\t\t\t\tif (evt.lengthComputable) model.trigger(\"upload:progress\", Math.ceil(evt.loaded / evt.total * 100));\n\t\t\t}, false);\n\t\t\treturn xhr2;\n\t\t};\n\t};\n\treturn oldSync(method, model, options);\n};\n\nBackbone.Collection.prototype.lazyFetch = function () {\n\tvar _this = this;\n\n\tvar options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n\t//var s = options.success || _.identity;\n\t//var e = options.error || _.identity;\n\n\t//delete options.success;\n\t//delete options.error;\n\n\treturn this.fetch(options).then(function () {\n\t\treturn Promise.resolve(_this);\n\t});\n};\n\nBackbone.Model.prototype.lazyFetch = function () {\n\tvar _this2 = this;\n\n\tvar options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n\t//var s = options.success || _.identity;\n\t//var e = options.error || _.identity;\n\n\t//delete options.success;\n\t//delete options.error;\n\n\treturn this.fetch(options).then(function () {\n\t\treturn Promise.resolve(_this2);\n\t});\n};\n\n// Add a save call that allows saving of binary data\nBackbone.Model.prototype.binarySave = function (key, val) {\n\tvar _options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n\tvar attrs = void 0;\n\tvar options = _options;\n\n\tif (key === null || _.isPlainObject(key)) {\n\t\tattrs = key;\n\t\toptions = val;\n\t} else {\n\t\t(attrs = {})[key] = val;\n\t}\n\n\tvar vars = new FormData();\n\tif (attrs) {\n\t\tfor (var a in attrs) {\n\t\t\tvars.append(a, attrs[a]);\n\t\t}\n\t}\n\n\tif (options && options.data) {\n\t\tfor (var m in options.data) {\n\t\t\tvars.append(m, options.data[m]);\n\t\t}\n\t}\n\n\tif (this._fileMap && _.keys(this._fileMap).length > 0) {\n\t\tfor (var f in this._fileMap) {\n\t\t\tvars.append(f, this._fileMap[f]);\n\t\t}\n\t}\n\n\toptions.contentType = false;\n\toptions.processData = false;\n\toptions.data = vars;\n\n\treturn this.save(key, val, options);\n};\n\nBackbone.Model.prototype.setFile = function (key, val) {\n\tvar attrs = void 0;\n\tif (key === null) return this;\n\n\t// Allow File objects to be stored\n\tif (!this._fileMap) this._fileMap = {};\n\n\tif (_.isPlainObject(key)) attrs = key;else (attrs = {})[key] = val;\n\n\tfor (var k in attrs) {\n\t\tthis._fileMap[k] = attrs[k];\n\t}return this;\n};\n\nBackbone.Model.prototype.getFile = function (key) {\n\treturn this._fileMap && this.hasFile(key) ? this._fileMap[key] : undefined;\n};\n\nBackbone.Model.prototype.hasFile = function (key) {\n\treturn key in this._fileMap;\n};\n\nBackbone.Model.prototype.clearFiles = function () {\n\tthis._fileMap = {};\n};\n\n// -----------------------------------------------------------------------------\n// Epoxy-style computeds without caching\n// -----------------------------------------------------------------------------\nvar getReadComputed = function getReadComputed(computed) {\n\treturn _.isFunction(computed) ? computed : computed.get;\n};\n\nvar getWriteComputed = function getWriteComputed(computed) {\n\treturn computed.set;\n};\n\nvar oldGet = Backbone.Model.prototype.get;\nBackbone.Model.prototype.get = function (attribute, options) {\n\tvar result = void 0;\n\n\tif (this.computeds && attribute in this.computeds) {\n\t\tvar readComputed = getReadComputed(this.computeds[attribute]);\n\t\tresult = readComputed === undefined ? undefined : readComputed.call(this);\n\t} else {\n\t\tresult = oldGet.call(this, attribute, options);\n\t}\n\n\treturn result;\n};\n\nvar oldSet = Backbone.Model.prototype.set;\nBackbone.Model.prototype.set = function (attribute, value, options) {\n\tif (this.computeds && attribute in this.computeds) {\n\t\tvar writeComputed = getWriteComputed(this.computeds[attribute]);\n\n\t\tif (writeComputed) writeComputed.call(this, value);\n\t} else {\n\t\treturn oldSet.call(this, attribute, value, options);\n\t}\n};\n\nvar oldHas = Backbone.Model.prototype.has;\nBackbone.Model.prototype.has = function (attribute) {\n\treturn this.computeds && attribute in this.computeds || oldHas.call(this, attribute);\n};\n\nvar oldToJSON = Backbone.Model.prototype.toJSON;\nBackbone.Model.prototype.toJSON = function (options) {\n\tvar _this3 = this;\n\n\tvar json = oldToJSON.call(this, options);\n\n\tif (options && options.computed) {\n\t\t_.each(this.computeds, function (computed, attribute) {\n\t\t\tvar readComputed = getReadComputed(computed);\n\t\t\tjson[attribute] = readComputed === undefined ? undefined : readComputed.call(_this3);\n\t\t});\n\t}\n\n\treturn json;\n};\n// -----------------------------------------------------------------------------\n\n// Make Marionette use precompiled templates\nBackbone.Marionette.Renderer.render = function (template, data) {\n\tif (!template) return;\n\treturn template.render(data);\n};\n\nmodule.exports = Backbone;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJhY2tiYWNvbi5qcyJdLCJuYW1lcyI6WyIkIiwicmVxdWlyZSIsIl8iLCJQcm9taXNlIiwicXMiLCJCYWNrYm9uZSIsIlZpcnR1YWxDb2xsZWN0aW9uIiwiQXBwIiwiZHluYW1pY1NjcmlwdCIsInVybCIsImNhbGxiYWNrIiwic2NyaXB0IiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwidHlwZSIsInJlYWR5U3RhdGUiLCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCJhZGRFdmVudExpc3RlbmVyIiwic3JjIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJhcHBlbmRDaGlsZCIsImZuIiwiZ2V0UGF0aCIsImxlbmd0aCIsIkVycm9yIiwicGF0aCIsImVsIiwibm9kZVR5cGUiLCJOb2RlIiwiRUxFTUVOVF9OT0RFIiwibm9kZU5hbWUiLCJ0b0xvd2VyQ2FzZSIsInB1c2giLCJyZXBsYWNlIiwiaW5kZXgiLCJwYXJlbnROb2RlIiwic2VsIiwicmV2ZXJzZSIsImpvaW4iLCJhYm9ydEFsbFhociIsImVhY2giLCJ4aHJRdWV1ZSIsInhociIsImFib3J0IiwiYWpheFNldHVwIiwiY2FjaGUiLCJiZWZvcmVTZW5kIiwic2V0dGluZ3MiLCJ1bmNhbmNlbGxhYmxlIiwic2V0UmVxdWVzdEhlYWRlciIsIlNlc3Npb24iLCJnZXQiLCJhdHRyIiwicGFyc2UiLCJ3aW5kb3ciLCJsb2NhdGlvbiIsInNlYXJjaCIsInNsaWNlIiwiYXV0aF90b2tlbiIsIm9sZFN5bmMiLCJzeW5jIiwibWV0aG9kIiwibW9kZWwiLCJvcHRpb25zIiwieGhyMiIsImFqYXhTZXR0aW5ncyIsInVwbG9hZCIsImV2dCIsImxlbmd0aENvbXB1dGFibGUiLCJ0cmlnZ2VyIiwiTWF0aCIsImNlaWwiLCJsb2FkZWQiLCJ0b3RhbCIsIkNvbGxlY3Rpb24iLCJwcm90b3R5cGUiLCJsYXp5RmV0Y2giLCJmZXRjaCIsInRoZW4iLCJyZXNvbHZlIiwiTW9kZWwiLCJiaW5hcnlTYXZlIiwia2V5IiwidmFsIiwiX29wdGlvbnMiLCJhdHRycyIsImlzUGxhaW5PYmplY3QiLCJ2YXJzIiwiRm9ybURhdGEiLCJhIiwiYXBwZW5kIiwiZGF0YSIsIm0iLCJfZmlsZU1hcCIsImtleXMiLCJmIiwiY29udGVudFR5cGUiLCJwcm9jZXNzRGF0YSIsInNhdmUiLCJzZXRGaWxlIiwiayIsImdldEZpbGUiLCJoYXNGaWxlIiwidW5kZWZpbmVkIiwiY2xlYXJGaWxlcyIsImdldFJlYWRDb21wdXRlZCIsImNvbXB1dGVkIiwiaXNGdW5jdGlvbiIsImdldFdyaXRlQ29tcHV0ZWQiLCJzZXQiLCJvbGRHZXQiLCJhdHRyaWJ1dGUiLCJyZXN1bHQiLCJjb21wdXRlZHMiLCJyZWFkQ29tcHV0ZWQiLCJjYWxsIiwib2xkU2V0IiwidmFsdWUiLCJ3cml0ZUNvbXB1dGVkIiwib2xkSGFzIiwiaGFzIiwib2xkVG9KU09OIiwidG9KU09OIiwianNvbiIsIk1hcmlvbmV0dGUiLCJSZW5kZXJlciIsInJlbmRlciIsInRlbXBsYXRlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsSUFBSUMsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjtBQUNBO0FBQ0EsSUFBTUUsVUFBVUYsUUFBUSxVQUFSLENBQWhCO0FBQ0EsSUFBTUcsS0FBS0gsUUFBUSxhQUFSLENBQVg7O0FBRUE7QUFDQTs7QUFFQUEsUUFBUSxRQUFSO0FBQ0EsSUFBTUksV0FBV0osUUFBUSxVQUFSLENBQWpCO0FBQ0FJLFNBQVNMLENBQVQsR0FBYUEsQ0FBYjtBQUNBQyxRQUFRLG9CQUFSO0FBQ0FBLFFBQVEsY0FBUjs7QUFFQSxJQUFNSyxvQkFBb0JMLFFBQVEsNkJBQVIsQ0FBMUI7QUFDQUksU0FBU0MsaUJBQVQsR0FBNkJBLGlCQUE3QjtBQUNBTCxRQUFRLFNBQVI7QUFDQUEsUUFBUSxZQUFSO0FBQ0FBLFFBQVEsZ0JBQVI7QUFDQUEsUUFBUSxjQUFSO0FBQ0FBLFFBQVEsYUFBUjtBQUNBO0FBQ0FBLFFBQVEs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cmljdFwiO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbi8vdmFyIG1vbWVudCA9IHJlcXVpcmUoXCJtb21lbnRcIik7XG5jb25zdCBQcm9taXNlID0gcmVxdWlyZShcImJsdWViaXJkXCIpO1xuY29uc3QgcXMgPSByZXF1aXJlKFwicXVlcnlzdHJpbmdcIik7XG5cbi8vdmFyIGxvYyA9IHJlcXVpcmUoXCJtb21lbnQvbG9jYWxlL2VuLWdiLmpzXCIpO1xuLy9tb21lbnQubG9jYWxlKFwiZW4tZ2JcIiwgbG9jKTtcblxucmVxdWlyZShcImNob3NlblwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuQmFja2JvbmUuJCA9ICQ7XG5yZXF1aXJlKFwiYmFja2JvbmUucGFnaW5hdG9yXCIpO1xucmVxdWlyZShcInN0cmluZ19zY29yZVwiKTtcblxuY29uc3QgVmlydHVhbENvbGxlY3Rpb24gPSByZXF1aXJlKFwiYmFja2JvbmUudmlydHVhbC1jb2xsZWN0aW9uXCIpO1xuQmFja2JvbmUuVmlydHVhbENvbGxlY3Rpb24gPSBWaXJ0dWFsQ29sbGVjdGlvbjtcbnJlcXVpcmUoXCJ0b29sYmFyXCIpO1xucmVxdWlyZShcIm1hcmlvbmV0dGVcIik7XG5yZXF1aXJlKFwiYmFja2JvbmUuZXBveHlcIik7XG5yZXF1aXJlKFwiZnVsbGNhbGVuZGFyXCIpO1xucmVxdWlyZShcIm11bHRpc2VsZWN0XCIpO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vZGUvbm8tZXh0cmFuZW91cy1yZXF1aXJlXG5yZXF1aXJlKFwidGltZXBpY2tlclwiKTtcbnJlcXVpcmUoXCJxdWlja3NlYXJjaFwiKTtcbnJlcXVpcmUoXCJzcGVjdHJ1bVwiKTtcblxubGV0IEFwcDtcblxuLy8gJC5nZXRTY3JpcHQgaXMgYnJva2VuIGluIElFMTEuIEJlY2F1c2Ugb2YgY291cnNlIGl0IGlzLlxuJC5keW5hbWljU2NyaXB0ID0gZnVuY3Rpb24odXJsLCBjYWxsYmFjaykge1xuXHRjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xuXHRzY3JpcHQudHlwZSA9IFwidGV4dC9qYXZhc2NyaXB0XCI7XG5cblx0aWYgKHNjcmlwdC5yZWFkeVN0YXRlKSB7IC8vSUVcblx0XHRzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoc2NyaXB0LnJlYWR5U3RhdGUgPT09IFwibG9hZGVkXCIgfHwgc2NyaXB0LnJlYWR5U3RhdGUgPT09IFwiY29tcGxldGVcIikge1xuXHRcdFx0XHRzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcblx0XHRcdFx0cmV0dXJuIGNhbGxiYWNrKCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXHRlbHNlIHsgLy9PdGhlcnNcblx0XHRzY3JpcHQuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgKCkgPT4ge1xuXHRcdFx0Y2FsbGJhY2soKTtcblx0XHR9KTtcblx0fVxuXG5cdHNjcmlwdC5zcmMgPSB1cmw7XG5cdGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaGVhZFwiKVswXS5hcHBlbmRDaGlsZChzY3JpcHQpO1xufTtcblxuLy8gQ29udmVydCBqUXVlcnkgb2JqZWN0IGludG8gc2VsZWN0b3Igc3RyaW5nXG4kLmZuLmdldFBhdGggPSBmdW5jdGlvbigpIHtcblx0aWYgKHRoaXMubGVuZ3RoICE9PSAxKVxuXHRcdHRocm93IG5ldyBFcnJvcihcIlJlcXVpcmVzIG9uZSBlbGVtZW50XCIpO1xuXG5cdGNvbnN0IHBhdGggPSBbXTtcblx0bGV0IGVsID0gdGhpc1swXTtcblxuXHR3aGlsZShlbC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgZWwubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJib2R5XCIgJiYgZWwubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJodG1sXCIpIHtcblx0XHRwYXRoLnB1c2goZWwubm9kZU5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC86L2csIFwiXFxcXDpcIikgKyBcIjpudGgtY2hpbGQoXCIgKyAoJChlbCkuaW5kZXgoKSArIDEpICsgXCIpXCIpO1xuXHRcdGVsID0gZWwucGFyZW50Tm9kZTtcblx0fVxuXG5cdHBhdGgucHVzaChcImJvZHlcIik7XG5cdGNvbnN0IHNlbCA9IHBhdGgucmV2ZXJzZSgpLmpvaW4oXCIgPiBcIik7XG5cblx0cmV0dXJuIHNlbDtcbn07XG5cbi8vIFNvbWUgc3R1ZmYgdG8ga2VlcCB0cmFjayBvZiBnbG9iYWwgQWpheCBjYWxscywgdG8gYWxsb3cgYWJvcnRzXG4kLmFib3J0QWxsWGhyID0gZnVuY3Rpb24oKSB7XG5cdGlmICghQXBwKVxuXHRcdEFwcCA9IHJlcXVpcmUoXCIuLi9pbmRleFwiKTtcblxuXHRfLmVhY2goQXBwLnhoclF1ZXVlLCB4aHIgPT4ge1xuXHRcdHhoci5hYm9ydCgpO1xuXHR9KTtcblxuXHRBcHAueGhyUXVldWUgPSBbXTtcbn07XG5cbi8vIENTUkYgdG9rZW4gZm9yIGdlbmVyYWwgQWpheCBjYWxsc1xuJC5hamF4U2V0dXAoe1xuXHRjYWNoZTogZmFsc2UsXG5cdGJlZm9yZVNlbmQ6IGZ1bmN0aW9uKHhociwgc2V0dGluZ3MpIHtcblx0XHRpZiAoIUFwcClcblx0XHRcdEFwcCA9IHJlcXVpcmUoXCIuLi9pbmRleFwiKTtcblxuXHRcdGlmICghc2V0dGluZ3MudW5jYW5jZWxsYWJsZSlcblx0XHRcdEFwcC54aHJRdWV1ZS5wdXNoKHhocik7XG5cblx0XHQvLyBBcHBlbmQgdGhlIENTUkYgdG9rZW5cblx0XHR4aHIuc2V0UmVxdWVzdEhlYWRlcihcIlgtQ1NSRi1UT0tFTlwiLCBBcHAuU2Vzc2lvbiA/IChBcHAuU2Vzc2lvbi5nZXQoXCJfY3NyZlwiKSB8fCAkKFwibWV0YVtuYW1lPSdjc3JmLXRva2VuJ11cIikuYXR0cihcImNvbnRlbnRcIikpIDogJChcIm1ldGFbbmFtZT0nY3NyZi10b2tlbiddXCIpLmF0dHIoXCJjb250ZW50XCIpKTtcblx0XHQvLyBObyBIVFRQIEJhc2ljIGZvciBVSSBmcm9udC1lbmRcblx0XHR4aHIuc2V0UmVxdWVzdEhlYWRlcihcIlgtQXV0aC1NZWNoYW5pc21cIiwgXCJuby1iYXNpY1wiKTtcblx0XHQvLyBEbyB3ZSBuZWVkIHRvIHNlbmQgYSBKV1QgdG9rZW4/XG5cdFx0Y29uc3QgdXJsID0gcXMucGFyc2Uod2luZG93LmxvY2F0aW9uLnNlYXJjaCA/IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guc2xpY2UoMSkgOiBcIlwiKTtcblx0XHRpZiAodXJsLmF1dGhfdG9rZW4pXG5cdFx0XHR4aHIuc2V0UmVxdWVzdEhlYWRlcihcIkF1dGhvcml6YXRpb25cIiwgXCJKV1QgXCIgKyB1cmwuYXV0aF90b2tlbik7XG5cdH0sXG59KTtcblxuLy8gUGF0Y2ggdGhlIEJhY2tib25lIHN5bmMgbWV0aG9kIHRvIGVtaXQgdXBsb2FkIHByb2dyZXNzIGV2ZW50c1xuLy8gQW5kIHRvIGFsc28gc2VuZCB0aGUgQ1NSRiB0b2tlblxuY29uc3Qgb2xkU3luYyA9IEJhY2tib25lLnN5bmM7XG5CYWNrYm9uZS5zeW5jID0gZnVuY3Rpb24obWV0aG9kLCBtb2RlbCwgb3B0aW9ucykge1xuXHRvcHRpb25zLmJlZm9yZVNlbmQgPSBmdW5jdGlvbih4aHIsIHNldHRpbmdzKSB7XG5cdFx0aWYgKCFzZXR0aW5ncy51bmNhbmNlbGxhYmxlKVxuXHRcdFx0QXBwLnhoclF1ZXVlLnB1c2goeGhyKTtcblxuXHRcdC8vIENTUkYgdG9rZW5cblx0XHRpZiAoQXBwLlNlc3Npb24pXG5cdFx0XHR4aHIuc2V0UmVxdWVzdEhlYWRlcihcIlgtQ1NSRi1UT0tFTlwiLCBBcHAuU2Vzc2lvbi5nZXQoXCJfY3NyZlwiKSB8fCAkKFwibWV0YVtuYW1lPSdjc3JmLXRva2VuJ11cIikuYXR0cihcImNvbnRlbnRcIikpO1xuXG5cdFx0Ly8gTm8gSFRUUCBCYXNpYyBmb3IgVUkgZnJvbnQtZW5kXG5cdFx0eGhyLnNldFJlcXVlc3RIZWFkZXIoXCJYLUF1dGgtTWVjaGFuaXNtXCIsIFwibm8tYmFzaWNcIik7XG5cblx0XHRzZXR0aW5ncy54aHIgPSBmdW5jdGlvbigpIHtcblx0XHRcdGNvbnN0IHhocjIgPSAkLmFqYXhTZXR0aW5ncy54aHIoKTtcblx0XHRcdHhocjIudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoXCJwcm9ncmVzc1wiLCBldnQgPT4ge1xuXHRcdFx0XHRpZiAoZXZ0Lmxlbmd0aENvbXB1dGFibGUpXG5cdFx0XHRcdFx0bW9kZWwudHJpZ2dlcihcInVwbG9hZDpwcm9ncmVzc1wiLCBNYXRoLmNlaWwoKGV2dC5sb2FkZWQgLyBldnQudG90YWwpICogMTAwKSk7XG5cdFx0XHR9LCBmYWxzZSk7XG5cdFx0XHRyZXR1cm4geGhyMjtcblx0XHR9O1xuXHR9O1xuXHRyZXR1cm4gb2xkU3luYyhtZXRob2QsIG1vZGVsLCBvcHRpb25zKTtcbn07XG5cbkJhY2tib25lLkNvbGxlY3Rpb24ucHJvdG90eXBlLmxhenlGZXRjaCA9IGZ1bmN0aW9uKG9wdGlvbnMgPSB7fSkge1xuXHQvL3ZhciBzID0gb3B0aW9ucy5zdWNjZXNzIHx8IF8uaWRlbnRpdHk7XG5cdC8vdmFyIGUgPSBvcHRpb25zLmVycm9yIHx8IF8uaWRlbnRpdHk7XG5cblx0Ly9kZWxldGUgb3B0aW9ucy5zdWNjZXNzO1xuXHQvL2RlbGV0ZSBvcHRpb25zLmVycm9yO1xuXG5cdHJldHVybiB0aGlzLmZldGNoKG9wdGlvbnMpLnRoZW4oKCkgPT4gUHJvbWlzZS5yZXNvbHZlKHRoaXMpKTtcbn07XG5cbkJhY2tib25lLk1vZGVsLnByb3RvdHlwZS5sYXp5RmV0Y2ggPSBmdW5jdGlvbihvcHRpb25zID0ge30pIHtcblx0Ly92YXIgcyA9IG9wdGlvbnMuc3VjY2VzcyB8fCBfLmlkZW50aXR5O1xuXHQvL3ZhciBlID0gb3B0aW9ucy5lcnJvciB8fCBfLmlkZW50aXR5O1xuXG5cdC8vZGVsZXRlIG9wdGlvbnMuc3VjY2Vzcztcblx0Ly9kZWxldGUgb3B0aW9ucy5lcnJvcjtcblxuXHRyZXR1cm4gdGhpcy5mZXRjaChvcHRpb25zKS50aGVuKCgpID0+IFByb21pc2UucmVzb2x2ZSh0aGlzKSk7XG59O1xuXG4vLyBBZGQgYSBzYXZlIGNhbGwgdGhhdCBhbGxvd3Mgc2F2aW5nIG9mIGJpbmFyeSBkYXRhXG5CYWNrYm9uZS5Nb2RlbC5wcm90b3R5cGUuYmluYXJ5U2F2ZSA9IGZ1bmN0aW9uKGtleSwgdmFsLCBfb3B0aW9ucyA9IHt9KSB7XG5cdGxldCBhdHRycztcblx0bGV0IG9wdGlvbnMgPSBfb3B0aW9ucztcblxuXHRpZiAoa2V5ID09PSBudWxsIHx8IF8uaXNQbGFpbk9iamVjdChrZXkpKSB7XG5cdFx0YXR0cnMgPSBrZXk7XG5cdFx0b3B0aW9ucyA9IHZhbDtcblx0fVxuXHRlbHNlIHtcblx0XHQoYXR0cnMgPSB7fSlba2V5XSA9IHZhbDtcblx0fVxuXG5cdGNvbnN0IHZhcnMgPSBuZXcgRm9ybURhdGEoKTtcblx0aWYgKGF0dHJzKSB7XG5cdFx0Zm9yKGNvbnN0IGEgaW4gYXR0cnMpXG5cdFx0XHR2YXJzLmFwcGVuZChhLCBhdHRyc1thXSk7XG5cdH1cblxuXHRpZiAob3B0aW9ucyAmJiBvcHRpb25zLmRhdGEpIHtcblx0XHRmb3IoY29uc3QgbSBpbiBvcHRpb25zLmRhdGEpXG5cdFx0XHR2YXJzLmFwcGVuZChtLCBvcHRpb25zLmRhdGFbbV0pO1xuXHR9XG5cblx0aWYgKHRoaXMuX2ZpbGVNYXAgJiYgXy5rZXlzKHRoaXMuX2ZpbGVNYXApLmxlbmd0aCA+IDApIHtcblx0XHRmb3IoY29uc3QgZiBpbiB0aGlzLl9maWxlTWFwKVxuXHRcdFx0dmFycy5hcHBlbmQoZiwgdGhpcy5fZmlsZU1hcFtmXSk7XG5cdH1cblxuXHRvcHRpb25zLmNvbnRlbnRUeXBlID0gZmFsc2U7XG5cdG9wdGlvbnMucHJvY2Vzc0RhdGEgPSBmYWxzZTtcblx0b3B0aW9ucy5kYXRhID0gdmFycztcblxuXHRyZXR1cm4gdGhpcy5zYXZlKGtleSwgdmFsLCBvcHRpb25zKTtcbn07XG5cbkJhY2tib25lLk1vZGVsLnByb3RvdHlwZS5zZXRGaWxlID0gZnVuY3Rpb24oa2V5LCB2YWwpIHtcblx0bGV0IGF0dHJzO1xuXHRpZiAoa2V5ID09PSBudWxsKSByZXR1cm4gdGhpcztcblxuXHQvLyBBbGxvdyBGaWxlIG9iamVjdHMgdG8gYmUgc3RvcmVkXG5cdGlmICghdGhpcy5fZmlsZU1hcClcblx0XHR0aGlzLl9maWxlTWFwID0ge307XG5cblx0aWYgKF8uaXNQbGFpbk9iamVjdChrZXkpKVxuXHRcdGF0dHJzID0ga2V5O1xuXHRlbHNlXG5cdFx0KGF0dHJzID0ge30pW2tleV0gPSB2YWw7XG5cblx0Zm9yKGNvbnN0IGsgaW4gYXR0cnMpXG5cdFx0dGhpcy5fZmlsZU1hcFtrXSA9IGF0dHJzW2tdO1xuXG5cdHJldHVybiB0aGlzO1xufTtcblxuQmFja2JvbmUuTW9kZWwucHJvdG90eXBlLmdldEZpbGUgPSBmdW5jdGlvbihrZXkpIHtcblx0cmV0dXJuICh0aGlzLl9maWxlTWFwICYmIHRoaXMuaGFzRmlsZShrZXkpID8gdGhpcy5fZmlsZU1hcFtrZXldIDogdW5kZWZpbmVkKTtcbn07XG5cbkJhY2tib25lLk1vZGVsLnByb3RvdHlwZS5oYXNGaWxlID0gZnVuY3Rpb24oa2V5KSB7XG5cdHJldHVybiAoa2V5IGluIHRoaXMuX2ZpbGVNYXApO1xufTtcblxuQmFja2JvbmUuTW9kZWwucHJvdG90eXBlLmNsZWFyRmlsZXMgPSBmdW5jdGlvbigpIHtcblx0dGhpcy5fZmlsZU1hcCA9IHt9O1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEVwb3h5LXN0eWxlIGNvbXB1dGVkcyB3aXRob3V0IGNhY2hpbmdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5jb25zdCBnZXRSZWFkQ29tcHV0ZWQgPSBmdW5jdGlvbihjb21wdXRlZCkge1xuXHRyZXR1cm4gXy5pc0Z1bmN0aW9uKGNvbXB1dGVkKSA/IGNvbXB1dGVkIDogY29tcHV0ZWQuZ2V0O1xufTtcblxuY29uc3QgZ2V0V3JpdGVDb21wdXRlZCA9IGZ1bmN0aW9uKGNvbXB1dGVkKSB7XG5cdHJldHVybiBjb21wdXRlZC5zZXQ7XG59O1xuXG5jb25zdCBvbGRHZXQgPSBCYWNrYm9uZS5Nb2RlbC5wcm90b3R5cGUuZ2V0O1xuQmFja2JvbmUuTW9kZWwucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKGF0dHJpYnV0ZSwgb3B0aW9ucykge1xuXHRsZXQgcmVzdWx0O1xuXG5cdGlmICh0aGlzLmNvbXB1dGVkcyAmJiBhdHRyaWJ1dGUgaW4gdGhpcy5jb21wdXRlZHMpIHtcblx0XHRjb25zdCByZWFkQ29tcHV0ZWQgPSBnZXRSZWFkQ29tcHV0ZWQodGhpcy5jb21wdXRlZHNbYXR0cmlidXRlXSk7XG5cdFx0cmVzdWx0ID0gcmVhZENvbXB1dGVkID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByZWFkQ29tcHV0ZWQuY2FsbCh0aGlzKTtcblx0fVxuXHRlbHNlIHtcblx0XHRyZXN1bHQgPSBvbGRHZXQuY2FsbCh0aGlzLCBhdHRyaWJ1dGUsIG9wdGlvbnMpO1xuXHR9XG5cblx0cmV0dXJuIHJlc3VsdDtcbn07XG5cbmNvbnN0IG9sZFNldCA9IEJhY2tib25lLk1vZGVsLnByb3RvdHlwZS5zZXQ7XG5CYWNrYm9uZS5Nb2RlbC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24oYXR0cmlidXRlLCB2YWx1ZSwgb3B0aW9ucykge1xuXHRpZiAodGhpcy5jb21wdXRlZHMgJiYgYXR0cmlidXRlIGluIHRoaXMuY29tcHV0ZWRzKSB7XG5cdFx0Y29uc3Qgd3JpdGVDb21wdXRlZCA9IGdldFdyaXRlQ29tcHV0ZWQodGhpcy5jb21wdXRlZHNbYXR0cmlidXRlXSk7XG5cblx0XHRpZiAod3JpdGVDb21wdXRlZClcblx0XHRcdHdyaXRlQ29tcHV0ZWQuY2FsbCh0aGlzLCB2YWx1ZSk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0cmV0dXJuIG9sZFNldC5jYWxsKHRoaXMsIGF0dHJpYnV0ZSwgdmFsdWUsIG9wdGlvbnMpO1xuXHR9XG59O1xuXG5jb25zdCBvbGRIYXMgPSBCYWNrYm9uZS5Nb2RlbC5wcm90b3R5cGUuaGFzO1xuQmFja2JvbmUuTW9kZWwucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uKGF0dHJpYnV0ZSkge1xuXHRyZXR1cm4gdGhpcy5jb21wdXRlZHMgJiYgYXR0cmlidXRlIGluIHRoaXMuY29tcHV0ZWRzIHx8IG9sZEhhcy5jYWxsKHRoaXMsIGF0dHJpYnV0ZSk7XG59O1xuXG5jb25zdCBvbGRUb0pTT04gPSBCYWNrYm9uZS5Nb2RlbC5wcm90b3R5cGUudG9KU09OO1xuQmFja2JvbmUuTW9kZWwucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0Y29uc3QganNvbiA9IG9sZFRvSlNPTi5jYWxsKHRoaXMsIG9wdGlvbnMpO1xuXG5cdGlmIChvcHRpb25zICYmIG9wdGlvbnMuY29tcHV0ZWQpIHtcblx0XHRfLmVhY2godGhpcy5jb21wdXRlZHMsIChjb21wdXRlZCwgYXR0cmlidXRlKSA9PiB7XG5cdFx0XHRjb25zdCByZWFkQ29tcHV0ZWQgPSBnZXRSZWFkQ29tcHV0ZWQoY29tcHV0ZWQpO1xuXHRcdFx0anNvblthdHRyaWJ1dGVdID0gcmVhZENvbXB1dGVkID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByZWFkQ29tcHV0ZWQuY2FsbCh0aGlzKTtcblx0XHR9KTtcblx0fVxuXG5cdHJldHVybiBqc29uO1xufTtcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIE1ha2UgTWFyaW9uZXR0ZSB1c2UgcHJlY29tcGlsZWQgdGVtcGxhdGVzXG5CYWNrYm9uZS5NYXJpb25ldHRlLlJlbmRlcmVyLnJlbmRlciA9IGZ1bmN0aW9uKHRlbXBsYXRlLCBkYXRhKSB7XG5cdGlmICghdGVtcGxhdGUpXG5cdFx0cmV0dXJuO1xuXHRyZXR1cm4gdGVtcGxhdGUucmVuZGVyKGRhdGEpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZTsiXX0=",
    "\"use strict\";\n\nvar _regenerator = require(\"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar NProgress = require(\"nprogress\");\nvar raygun = require(\"raygun\");\nvar settings = require(\"app-settings\");\nvar tippy = require(\"tippy.js\").default;\n\nvar Errors = require(\"./errors.js\");\nvar ErrorView = require(\"./errorView.js\");\n\nvar App = require(\"../index\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"big-modal modal-min-size\",\n\n\tui: {\n\t\tmodalTitle: \".modal-title\",\n\n\t\tmodalBody: \".modal-body\",\n\n\t\terrorContainer: \"div.error-container\",\n\t\tformContainer: \"div.form-container\",\n\t\tconfirmationContainer: \"div.confirmation-container\",\n\t\tstatusContainer: \"div.status-container\",\n\n\t\tstatusContents: \"div.status-container span\",\n\t\tstatusMessageLoading: \"span.status-message-loading\",\n\t\tstatusMessageSaving: \"span.status-message-saving\",\n\t\tstatusMessageDeleting: \"span.status-message-deleting\",\n\t\tstatusMessageWorking: \"span.status-message-working\",\n\t\tstatusMessageSuccess: \"span.status-message-success\",\n\t\tspinner: \"span.spinner-icon\",\n\n\t\tconfirmationMessage: \"span.confirmation-message\",\n\t\tconfirmationQuestion: \"span.confirmation-question\",\n\t\tconfirmationAcceptButton: \"button.confirmation-yes\",\n\t\tconfirmationDeclineButton: \"button.confirmation-no\",\n\n\t\tmodalFooter: \"div.modal-footer\",\n\n\t\tform: \"div.form\"\n\t},\n\n\tmodelEvents: {\n\t\t\"upload:progress\": \"onUploadProgress\",\n\t\tinvalid: \"validationFail\"\n\t},\n\n\ttoTitleCase: function toTitleCase(string) {\n\t\treturn string.replace(/\\w\\S*/g, function (text) {\n\t\t\treturn text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();\n\t\t});\n\t},\n\n\tgetTemplate: function getTemplate() {\n\t\treturn require(\"./templates/bigModal.nunj\");\n\t},\n\n\tserializeData: function serializeData() {\n\t\t// Attempt to gather additional data from the concrete modal. The concrete modal\n\t\t// does not have to return data explicitly if that data should be added to the model,\n\t\t// in which case the model may have been altered but nothing will be returned.\n\t\t// Therefore, augmentTemplateData should be called before the model is serialized\n\t\tvar additionalData = !_.isFunction(this.loadData) && this.augmentTemplateData ? this.augmentTemplateData() || {} : {};\n\t\tvar modelData = this.model ? this.model.toJSON({ computed: true }) : {};\n\n\t\treturn $.extend(modelData, additionalData);\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this = this;\n\n\t\treturn {\n\t\t\tisModeCreate: function isModeCreate() {\n\t\t\t\treturn _this.isModeCreate();\n\t\t\t},\n\n\t\t\tisModeEdit: function isModeEdit() {\n\t\t\t\treturn _this.isModeEdit();\n\t\t\t},\n\n\t\t\tisNew: function isNew() {\n\t\t\t\treturn _this.model.isNew();\n\t\t\t},\n\n\t\t\tdataNoun: function dataNoun(titleCase) {\n\t\t\t\tvar noun = _this.Options.dataNoun === null ? \"\" : _this.Options.dataNoun || \"data\";\n\t\t\t\treturn titleCase ? _this.toTitleCase(noun) : noun;\n\t\t\t},\n\n\t\t\tcreateIcon: function createIcon() {\n\t\t\t\treturn _this.Options.createIcon || \"fa-plus\";\n\t\t\t},\n\n\t\t\teditIcon: function editIcon() {\n\t\t\t\treturn _this.Options.editIcon || \"fa-edit\";\n\t\t\t},\n\n\t\t\tcreateVerb: function createVerb(titleCase) {\n\t\t\t\tvar verb = _this.Options.createVerb === null ? \"\" : _this.Options.createVerb || \"create\";\n\t\t\t\treturn titleCase ? _this.toTitleCase(verb) : verb;\n\t\t\t},\n\n\t\t\teditVerb: function editVerb(titleCase) {\n\t\t\t\tvar verb = _this.Options.editVerb || \"edit\";\n\t\t\t\treturn titleCase ? _this.toTitleCase(verb) : verb;\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize() {\n\t\t_.bindAll(this);\n\n\t\tthis.EventBus = Backbone.Radio.channel(\"bigmodal-\" + App.randomString(10));\n\n\t\tthis.Host = $(this.Options.host || App.modalContext || \"#modals\");\n\n\t\tthis.TooltipElements = [];\n\n\t\t//this.$el.css({ \"max-height\": \"25vh\", \"max-width\": \"30vw\" });\n\t},\n\n\tisModeCreate: function isModeCreate() {\n\t\treturn !this.model || this.model.isNew();\n\t},\n\n\tisModeEdit: function isModeEdit() {\n\t\treturn !this.isModeCreate();\n\t},\n\n\tshow: function show(listeners) {\n\t\tvar _this2 = this;\n\n\t\t// Register convenience listeners\n\t\tif (listeners) {\n\t\t\t_.each(listeners, function (handler, event) {\n\t\t\t\t_this2.on(event, handler);\n\t\t\t});\n\t\t}\n\n\t\t// Register request-response action handlers\n\t\tif (this.actions) {\n\t\t\t_.each(this.actions, function (handler, action) {\n\t\t\t\t_this2.EventBus.reply(\"bigModal:\" + action, _this2[handler].bind(_this2));\n\t\t\t});\n\t\t}\n\n\t\t$(\".modal-container\", this.Host).append(this.render().$el);\n\t},\n\n\tcompleteLoading: function completeLoading() {\n\t\tthis.requireLoading = false;\n\n\t\t// Replace the centre\n\t\tthis.onRender();\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this3 = this;\n\n\t\t// Show the modal background\n\t\t$(\".modal-element\", this.Host).removeClass(\"hide\");\n\t\t$(\"body\").addClass(\"hide-overflow\");\n\n\t\t// If there's any other modals visible right now, hide them, and restore it after\n\t\tthis.dunked = $.map($(\".modal-container\", this.Host).children(), function (item) {\n\t\t\tif ($(item).is(_this3.$el)) return;\n\t\t\t$(item).addClass(\"hide\");\n\t\t\treturn $(item).getPath();\n\t\t});\n\n\t\t// The modal itself should allow clicks to propagate so that menus in the\n\t\t// modal will be hidden correctly. However, everything underneath the modal\n\t\t// should be unaffected by clicks\n\t\t$(\"#modals\").on(\"click\", function (event) {\n\t\t\treturn event.stopPropagation();\n\t\t});\n\n\t\t// Display the loading status message if required\n\t\tif (_.isFunction(this.loadData) && this.requireLoading !== false) {\n\t\t\tthis.ui.spinner.removeClass(\"hide\");\n\t\t\tthis.ui.statusMessageLoading.removeClass(\"hide\");\n\t\t\tthis.ui.statusContainer.css({ opacity: 1, \"pointer-events\": \"all\" });\n\t\t\treturn this.loadData(this.completeLoading.bind(this));\n\t\t}\n\n\t\t// Set the primary style of the modal\n\t\tif (this.Options.type) {\n\t\t\tswitch (this.Options.type) {\n\t\t\t\tcase \"warning\":\n\t\t\t\t\tthis.ui.modalTitle.addClass(\"modal-warning\");\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t// No need to add an additional class\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Add any additional CSS classes, specified by the custom modal, to the bigModal element\n\t\tif (this.Options.classes) {\n\t\t\t_.each(this.Options.classes, function (className) {\n\t\t\t\t_this3.$el.addClass(className);\n\t\t\t});\n\t\t}\n\n\t\t// Create the buttons\n\t\tthis.Buttons = {};\n\n\t\t_.each(this.Options.buttons, function (specification, action) {\n\t\t\tvar classes = \"\";\n\t\t\tvar handler = null;\n\n\t\t\tswitch (specification.type) {\n\t\t\t\tcase \"accept\":\n\t\t\t\t\tclasses += \"success\";\n\t\t\t\t\thandler = _this3.onAccept.bind(_this3, action, specification.save, specification.validate);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"delete\":\n\t\t\t\t\tclasses += \"alert\";\n\t\t\t\t\thandler = _this3.onDelete.bind(_this3, action);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"cancel\":\n\t\t\t\t\tclasses += \"secondary\";\n\t\t\t\t\thandler = _this3.onCancel.bind(_this3, action);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tclasses = String(classes);\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (specification.mode) {\n\t\t\t\tswitch (specification.mode) {\n\t\t\t\t\tcase \"create\":\n\t\t\t\t\t\tclasses += _this3.isModeCreate() ? \"\" : \" hide\";\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"edit\":\n\t\t\t\t\t\tclasses += _this3.isModeEdit() ? \"\" : \" hide\";\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\t// If the mode is not specified, then show the button at all times\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (specification.permission && !specification.permission()) classes += \" hide\";\n\n\t\t\t_this3.ui.modalFooter.append(\"<button type=\\\"button\\\" class='button \" + classes + \" \" + action + \"'>\" + specification.label + \"</button>\");\n\n\t\t\t_this3.Buttons[action] = $(\"button.\" + action, _this3.ui.modalFooter);\n\t\t\t_this3.Buttons[action].on(\"click\", handler);\n\t\t});\n\n\t\t// Render the content\n\t\tvar data = this.mixinTemplateContext(this.serializeData());\n\t\tthis.ui.formContainer.html(this.Options.template.render(data));\n\n\t\t// Update UI bindings\n\t\tthis.bindUIElements();\n\n\t\t// Define renderForm to perform any special initialization of the form UI\n\t\tif (this.renderForm) this.renderForm();\n\n\t\t// Allow the element to transition to its true size\n\t\tthis.$el.removeClass(\"modal-min-size\"); //css({ \"max-width\": \"\", \"max-height\": \"\" });\n\n\t\tthis.ui.statusContainer.css({ opacity: 0, \"pointer-events\": \"none\" });\n\t},\n\n\tonDestroy: function onDestroy() {\n\t\t// Clean up the background\n\t\tif (this.dunked && this.dunked.length === 0) {\n\t\t\t$(\".modal-element\", this.Host).addClass(\"hide\");\n\t\t\t$(\"body\").removeClass(\"hide-overflow\");\n\n\t\t\t// Unbind the click handler\n\t\t\t$(\"#modals\").off(\"click\");\n\t\t}\n\n\t\tif (this.dunked) {\n\t\t\t_.each(this.dunked, function (item) {\n\t\t\t\tif (!item) return;\n\t\t\t\tvar el = $(item);\n\t\t\t\tif (el && el.length) el.removeClass(\"hide\");\n\t\t\t});\n\t\t} else {\n\t\t\t// Unbind the button event handlers\n\t\t\t_.each(this.Options.buttons, function (specification, action) {\n\t\t\t\t$(\"button.\" + action).off(\"click\");\n\t\t\t});\n\t\t}\n\t},\n\n\tonAccept: function onAccept(action, save, validate) {\n\t\tthis.onAction(\"confirmAccept\", \"Would you like to continue?\", this.accept.bind(this, action, save, validate));\n\t},\n\n\tonDelete: function onDelete(action) {\n\t\tthis.onAction(\"confirmDelete\", \"Are you sure that you wish to delete this \" + this.templateContext().dataNoun() + \"?\", this.delete.bind(this, action));\n\t},\n\n\tonCancel: function onCancel(action) {\n\t\tthis.onAction(\"confirmCancel\", \"Are you sure that you wish to cancel this \" + this.templateContext().dataNoun() + \"?\", this.close.bind(this, action));\n\t},\n\n\tonAction: function onAction(confirmMessageCallbackIdentifier, question, onAccept) {\n\t\t// Determine if the concrete modal requires confirmation for this action\n\t\tvar confirmationMessage = this[confirmMessageCallbackIdentifier] ? this[confirmMessageCallbackIdentifier]() : null;\n\n\t\t// If the concrete modal supplied a confirmation message...\n\t\tif (confirmationMessage) {\n\t\t\t// ...then confirmation is required\n\t\t\tthis.showConfirmation({\n\t\t\t\tmessage: confirmationMessage,\n\t\t\t\tquestion: question,\n\t\t\t\tonAccept: onAccept\n\t\t\t});\n\t\t} else {\n\t\t\tonAccept();\n\t\t}\n\t},\n\n\tonUploadProgress: function onUploadProgress(percentage) {\n\t\tNProgress.set(percentage / 100);\n\t},\n\n\taccept: function () {\n\t\tvar _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee(action, save, validate) {\n\t\t\tvar _this4 = this;\n\n\t\t\tvar continueSave, data;\n\t\t\treturn _regenerator2.default.wrap(function _callee$(_context) {\n\t\t\t\twhile (1) {\n\t\t\t\t\tswitch (_context.prev = _context.next) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t// Execute handlers, if defined by the concrete modal\n\t\t\t\t\t\t\tcontinueSave = true;\n\n\t\t\t\t\t\t\tif (!this.beforeSave) {\n\t\t\t\t\t\t\t\t_context.next = 5;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_context.next = 4;\n\t\t\t\t\t\t\treturn this.beforeSave();\n\n\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\tcontinueSave = _context.sent;\n\n\t\t\t\t\t\tcase 5:\n\t\t\t\t\t\t\tif (!continueSave) {\n\t\t\t\t\t\t\t\t_context.next = 10;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this.model) {\n\t\t\t\t\t\t\t\t_context.next = 8;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn _context.abrupt(\"return\", this.close(action));\n\n\t\t\t\t\t\tcase 8:\n\n\t\t\t\t\t\t\t// Retrieve the attributes from the custom modal\n\t\t\t\t\t\t\tdata = this.assembleData ? this.assembleData() : null;\n\n\t\t\t\t\t\t\t// Set the model attributes\n\n\t\t\t\t\t\t\tif (data) {\n\t\t\t\t\t\t\t\tif (data.files) {\n\t\t\t\t\t\t\t\t\t// Set the files\n\t\t\t\t\t\t\t\t\t_.each(data.files, function (file, name) {\n\t\t\t\t\t\t\t\t\t\t_this4.model.setFile(name, file);\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Preserve the attributes that are about to be changed\n\t\t\t\t\t\t\t\tthis.oldAttributes = _.reduce(data.attributes, function (accumulator, value, key) {\n\t\t\t\t\t\t\t\t\taccumulator[key] = _this4.model.get(key);\n\t\t\t\t\t\t\t\t\treturn accumulator;\n\t\t\t\t\t\t\t\t}, {});\n\n\t\t\t\t\t\t\t\tthis.model.set(data.attributes, { validate: false });\n\n\t\t\t\t\t\t\t\tif (!validate || validate && this.model.isValid()) {\n\t\t\t\t\t\t\t\t\t// If the model data must be saved...\n\t\t\t\t\t\t\t\t\tif (save)\n\t\t\t\t\t\t\t\t\t\t// ...then employ the internal save procedure...\n\t\t\t\t\t\t\t\t\t\tthis.save(action, data);else\n\t\t\t\t\t\t\t\t\t\t// ...otherwise, close the modal and return the model\n\t\t\t\t\t\t\t\t\t\tthis.close(action, { model: this.model });\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcase 10:\n\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\treturn _context.stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, _callee, this);\n\t\t}));\n\n\t\tfunction accept(_x, _x2, _x3) {\n\t\t\treturn _ref.apply(this, arguments);\n\t\t}\n\n\t\treturn accept;\n\t}(),\n\n\t// Call .save() to save the model for this modal. The parameter, data, must\n\t// contain a hash that contains the attributes and any binary files that should be saved:\n\t// {\n\t//     attributes: {\n\t//         \"title\": this.ui.inputTitle.val(),\n\t//     },\n\t//     files: {\n\t//         \"file\": this.ui.video.get(0).files[0]\n\t//     },\n\t// }\n\t// If files is undefined or is empty, then a normal model.save() will be executed.\n\t// If files is not empty, then the requisite calls to set the file will be made\n\t// and a model.binarySave() will be executed.\n\tsave: function save(action, data) {\n\t\t// Modify the modal layout\n\t\tthis.setStatusBusy(\"saving\");\n\n\t\t// If files were specified...\n\t\tif (data.files) {\n\t\t\t// ...then employ the model's binary save method...\n\n\t\t\t// Save the model\n\t\t\tthis.xhr = this.model.binarySave(null, {\n\t\t\t\twait: true,\n\t\t\t\tdata: data.attributes,\n\t\t\t\tvalidate: false,\n\t\t\t\tsuccess: this.onSaveSuccess.bind(this, action),\n\t\t\t\terror: this.onSaveError.bind(this)\n\t\t\t});\n\t\t} else {\n\t\t\t// ...otherwise, employ the model's standard save method\n\n\t\t\t// Save the model\n\t\t\tthis.xhr = this.model.save(data.attributes, {\n\t\t\t\twait: true,\n\t\t\t\tvalidate: false,\n\t\t\t\tsuccess: this.onSaveSuccess.bind(this, action),\n\t\t\t\terror: this.onSaveError.bind(this)\n\t\t\t});\n\t\t}\n\n\t\tthis.initializeProgressBar();\n\t},\n\n\tonSaveSuccess: function onSaveSuccess(action, model) {\n\t\tthis.xhr = null;\n\t\tNProgress.set(1.0);\n\n\t\tthis.setUIHidden();\n\n\t\tthis.close(action, { model: model });\n\t},\n\n\tonSaveError: function onSaveError(model, response) {\n\t\tthis.xhr = null;\n\t\tNProgress.set(1.0);\n\n\t\t// Restore the old attribute values\n\t\tthis.model.set(this.oldAttributes, { validate: false });\n\n\t\tthis.showError(new Errors.Model({\n\t\t\ttitle: \"Save Error\",\n\t\t\tmessage: \"An error occurred while saving data to the server.\",\n\t\t\tresponse: response\n\t\t}));\n\t},\n\n\tdelete: function _delete(action) {\n\t\t// Disable the primary buttons and display the status container\n\t\tthis.setStatusBusy(\"deleting\");\n\n\t\t// Delete the model\n\t\tthis.xhr = this.model.destroy({\n\t\t\twait: true,\n\t\t\tsuccess: this.onDeleteSuccess.bind(this, action),\n\t\t\terror: this.onDeleteError.bind(this)\n\t\t});\n\n\t\tthis.initializeProgressBar();\n\t},\n\n\tonDeleteSuccess: function onDeleteSuccess(action, model) {\n\t\tthis.xhr = null;\n\t\tNProgress.set(1.0);\n\n\t\tthis.setUIHidden();\n\n\t\tthis.close(action, { model: model });\n\t},\n\n\tonDeleteError: function onDeleteError(model, response) {\n\t\tthis.xhr = null;\n\t\tNProgress.set(1.0);\n\n\t\tthis.showError(new Errors.Model({\n\t\t\ttitle: \"Delete Error\",\n\t\t\tmessage: \"An error occurred while deleting data from the server.\",\n\t\t\tresponse: response\n\t\t}));\n\t},\n\n\t// Call .close() to destroy the modal, signal the modal client, and, optionally,\n\t// return a custom value\n\tclose: function close(action, result) {\n\t\tvar _this5 = this;\n\n\t\t// Abort communication with the server if any is in progress\n\t\tif (this.xhr) {\n\t\t\tthis.xhr.abort();\n\n\t\t\t// Revert any changes made to the model\n\t\t\tif (this.oldAttributes) this.model.set(this.oldAttributes, { validate: false });\n\t\t}\n\n\t\t// Destroy all of the tooltips\n\t\tthis.destroyValidationErrors();\n\n\t\t// Obtain any additional, custom values from the concrete modal\n\t\tvar completeResult = result ? result : {};\n\n\t\tif (this.assembleResult) {\n\t\t\tcompleteResult = _.reduce(this.assembleResult(), function (accumulator, value, key) {\n\t\t\t\taccumulator[key] = value;\n\t\t\t\treturn accumulator;\n\t\t\t}, completeResult);\n\t\t}\n\n\t\t// Trigger an event for any optionally registered listeners\n\t\tthis.trigger(action, completeResult);\n\n\t\t// Trigger an event that corresponds to the completed action. The event\n\t\t// might return a model for which the modal should be reset.\n\t\tvar newModel = this.EventBus.request(\"bigModal:\" + action, completeResult);\n\n\t\tif (newModel) {\n\t\t\t// Reset the modal for editing the returned model\n\t\t\tthis.model = newModel;\n\t\t\tthis.render();\n\t\t} else {\n\t\t\tif (this.actions) {\n\t\t\t\t_.each(this.actions, function (handler, oldAction) {\n\t\t\t\t\t_this5.EventBus.stopReplying(\"bigModal:\" + oldAction);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.destroy();\n\t\t}\n\t},\n\n\tshowConfirmation: function showConfirmation(options) {\n\t\t// Set the confirmation container's messages\n\t\tthis.ui.confirmationMessage.text(options.message ? options.message : \"\");\n\t\tthis.ui.confirmationQuestion.text(options.question ? options.question : \"\");\n\n\t\t// Show the confirmation container\n\t\tthis.ui.formContainer.addClass(\"hide\");\n\t\tthis.ui.confirmationContainer.removeClass(\"hide\");\n\n\t\t// Hide the primary buttons\n\t\tthis.setUIHidden();\n\n\t\t// Bind the action to the accept/decline button click handlers\n\t\tthis.ui.confirmationAcceptButton.one(\"click\", this.onConfirmationAccept.bind(this, options.onAccept));\n\t\tthis.ui.confirmationDeclineButton.one(\"click\", this.onConfirmationDecline.bind(this));\n\t},\n\n\tonConfirmationAccept: function onConfirmationAccept(accept) {\n\t\t// The user accepted so unbind the decline click handler\n\t\tthis.ui.confirmationDeclineButton.off(\"click\");\n\n\t\t// Hide the confirmation container\n\t\tthis.ui.confirmationContainer.addClass(\"hide\");\n\n\t\t// Perform the accept operation\n\t\tif (accept) accept();\n\t},\n\n\tonConfirmationDecline: function onConfirmationDecline() {\n\t\t// The user declined so unbind the accept click handler\n\t\tthis.ui.confirmationAcceptButton.off(\"click\");\n\n\t\t// Show the primary buttons\n\t\tthis.setUIVisible();\n\n\t\t// Hide the confirmation container\n\t\tthis.ui.confirmationContainer.addClass(\"hide\");\n\t\tthis.ui.formContainer.removeClass(\"hide\");\n\t},\n\n\tsetSavingStatus: function setSavingStatus(text) {\n\t\tthis.ui.statusMessageSaving.html(\"&nbsp;&nbsp;\" + text);\n\t},\n\n\tsetUIBusy: function setUIBusy() {\n\t\tvar _this6 = this;\n\n\t\tvar options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n\t\t// Record which buttons are being hidden/disabled so that presently\n\t\t// hidden/disabled buttons are not inadvertantly revealed/enabled when this\n\t\t// operation is reversed\n\t\tif (!this.BusyButtons) {\n\t\t\tthis.BusyButtons = [];\n\n\t\t\t_.each(this.Buttons, function (button, action) {\n\t\t\t\tif (button.append) {\n\t\t\t\t\tif (_this6.Options.buttons[action].type !== \"cancel\") {\n\t\t\t\t\t\tif (options.hide) {\n\t\t\t\t\t\t\tif (!button.hasClass(\"hide\")) {\n\t\t\t\t\t\t\t\tbutton.addClass(\"hide\");\n\t\t\t\t\t\t\t\t_this6.BusyButtons.push(button);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (!button.hasClass(\"disabled\") && !button.hasClass(\"hide\")) {\n\t\t\t\t\t\t\tbutton.prop(\"disabled\", true);\n\t\t\t\t\t\t\tbutton.addClass(\"disabled\");\n\t\t\t\t\t\t\t_this6.BusyButtons.push(button);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n\n\tsetUIReady: function setUIReady() {\n\t\t_.each(this.BusyButtons, function (button) {\n\t\t\tif (button.append) {\n\t\t\t\tif (button.hasClass(\"hide\")) {\n\t\t\t\t\tbutton.removeClass(\"hide\");\n\t\t\t\t} else {\n\t\t\t\t\tbutton.prop(\"disabled\", false);\n\t\t\t\t\tbutton.removeClass(\"disabled\");\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis.BusyButtons = null;\n\t},\n\n\tsetUIHidden: function setUIHidden() {\n\t\tvar _this7 = this;\n\n\t\t// Record which buttons are being hidden so that presently hidden buttons\n\t\t// are not inadvertantly revealed when this operation is reversed\n\t\tif (!this.HiddenButtons) {\n\t\t\tthis.HiddenButtons = [];\n\n\t\t\t_.each(this.Buttons, function (button) {\n\t\t\t\tif (button.append) {\n\t\t\t\t\tif (!button.hasClass(\"hide\")) {\n\t\t\t\t\t\tbutton.addClass(\"hide\");\n\t\t\t\t\t\t_this7.HiddenButtons.push(button);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n\n\tsetUIVisible: function setUIVisible() {\n\t\t_.each(this.HiddenButtons, function (button) {\n\t\t\tif (button.append) button.removeClass(\"hide\");\n\t\t});\n\n\t\tthis.HiddenButtons = null;\n\t},\n\n\tinitializeProgressBar: function initializeProgressBar() {\n\t\t// Configure and start the progress bar\n\t\tNProgress.configure({\n\t\t\tparent: $(\".modal-footer\", this.$el).getPath(),\n\t\t\tshowSpinner: false,\n\t\t\ttrickle: true,\n\t\t\tminimum: 0.01,\n\t\t\ttrickleRate: 0.01,\n\t\t\ttrickleSpeed: 1000\n\t\t}).start(0.0);\n\t},\n\n\tsetProgress: function setProgress(fraction) {\n\t\tNProgress.set(fraction);\n\t},\n\n\tsetStatusReady: function setStatusReady() {\n\t\t// Hide all of the containers and show the form container\n\t\tthis.ui.modalBody.css({ \"overflow-y\": \"\" });\n\t\tthis.ui.errorContainer.css({ opacity: 0, \"pointer-events\": \"none\" }); //.addClass(\"hide\");\n\t\tthis.ui.statusContainer.css({ opacity: 0, \"pointer-events\": \"none\" }); //addClass(\"hide\");\n\t\tthis.ui.confirmationContainer.addClass(\"hide\");\n\t\tthis.ui.formContainer.removeClass(\"hide\");\n\n\t\t// Reveal all modal buttons previously hidden during the busy status\n\t\tthis.setUIReady();\n\t},\n\n\tsetStatusBusy: function setStatusBusy(status) {\n\t\t// Hide all modal buttons except for cancel\n\t\tthis.setUIBusy({ hide: true });\n\n\t\t// Hide all of the elements in the status container\n\t\tthis.ui.statusContents.addClass(\"hide\");\n\n\t\t// Disable scrolling on the main block\n\t\tthis.ui.modalBody.css({ \"overflow-y\": \"hidden\" });\n\n\t\t// Show a message that corresponds to the status\n\t\tswitch (status) {\n\t\t\tcase \"loading\":\n\t\t\t\tthis.ui.statusMessageLoading.removeClass(\"hide\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"saving\":\n\t\t\t\tthis.ui.statusMessageSaving.removeClass(\"hide\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"deleting\":\n\t\t\t\tthis.ui.statusMessageDeleting.removeClass(\"hide\");\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthis.ui.statusMessageWorking.removeClass(\"hide\");\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// Show the spinner\n\t\tthis.ui.spinner.removeClass(\"hide\");\n\n\t\t// Hide the form container and show the status container\n\t\t//this.ui.formContainer.addClass(\"hide\");\n\t\tthis.ui.statusContainer.css({ opacity: 1, \"pointer-events\": \"all\" }); //removeClass(\"hide\");\n\t},\n\n\tsetStatusFail: function setStatusFail() {\n\t\tthis.ui.statusContainer.css({ opacity: 0, \"pointer-events\": \"none\" }); //addClass(\"hide\");\n\t\tthis.ui.modalBody.css({ \"overflow-y\": \"\" });\n\n\t\t//this.ui.formContainer.addClass(\"hide\");\n\t\tthis.ui.errorContainer.css({ opacity: 1, \"pointer-events\": \"all\" }); //.removeClass(\"hide\");\n\t},\n\n\tshowError: function showError(error) {\n\t\tvar _this8 = this;\n\n\t\tthis.ErrorView = new ErrorView({\n\t\t\tcloseButton: true,\n\t\t\tmodel: error\n\t\t});\n\n\t\tthis.ErrorView.once(\"error:close\", function () {\n\t\t\t_this8.setUIVisible();\n\t\t\t_this8.setStatusReady();\n\n\t\t\t_this8.ErrorView.destroy();\n\t\t\t_this8.ErrorView = null;\n\t\t});\n\n\t\tNProgress.done();\n\t\tthis.ui.errorContainer.append(this.ErrorView.render().$el);\n\n\t\tthis.setUIHidden();\n\t\tthis.setStatusFail();\n\n\t\tif (!settings.debug || settings.reportErrors) raygun(\"send\", error.response);\n\t},\n\n\tvalidationFail: function validationFail() {\n\t\tvar _this9 = this;\n\n\t\tif (!this.errorMap) this.errorMap = {};\n\n\t\tif (this.beforeValidationFail) this.beforeValidationFail();\n\n\t\t_.each(this.model.validationError, function (item, key) {\n\t\t\tif (key in _this9.errorMap) {\n\t\t\t\tvar attractionElementKey = _this9.errorMap[key].attractionElement || key;\n\t\t\t\tvar changeElementKey = _this9.errorMap[key].changeElement || key;\n\n\t\t\t\tvar attractionElement = _this9.ui[attractionElementKey];\n\t\t\t\tvar changeElement = _this9.ui[changeElementKey];\n\n\t\t\t\tif (changeElement.length === 0) {\n\t\t\t\t\t// Look up the element dynamically\n\t\t\t\t\tchangeElement = $(_this9.ui[changeElementKey].selector, _this9.$el);\n\t\t\t\t}\n\n\t\t\t\t_this9.showValidationErrorMessage(attractionElement, changeElement, item, _this9.errorMap[key].position);\n\t\t\t}\n\t\t});\n\t},\n\n\tshowValidationErrorMessage: function showValidationErrorMessage(attractionElement, changeElement, message, position) {\n\t\tif (attractionElement.is(\":visible\")) {\n\t\t\tif (_.find(this.TooltipElements, _.matchesProperty(\"attractionElement\", attractionElement)) === undefined) {\n\t\t\t\ttippy(attractionElement.get(0), {\n\t\t\t\t\ttheme: \"red\",\n\t\t\t\t\tplacement: position,\n\t\t\t\t\tarrow: true,\n\t\t\t\t\tcontent: \"<span>\" + message.replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t\t\t}) + \"</span>\",\n\t\t\t\t\ttrigger: \"manual\",\n\t\t\t\t\tdelay: 0,\n\t\t\t\t\tinteractive: false,\n\t\t\t\t\tmultiple: false,\n\t\t\t\t\thideOnClick: false\n\t\t\t\t});\n\n\t\t\t\tthis.TooltipElements.push({\n\t\t\t\t\tattractionElement: attractionElement.get(0)._tippy,\n\t\t\t\t\tchangeElement: changeElement\n\t\t\t\t});\n\n\t\t\t\tchangeElement.one(\"change\", this.onChangeElementChange.bind(this));\n\n\t\t\t\tattractionElement.get(0)._tippy.show();\n\t\t\t} else {\n\t\t\t\tattractionElement._tippy.setContent(message).show(\"show\");\n\t\t\t}\n\t\t}\n\t},\n\n\thideValidationErrorMessage: function hideValidationErrorMessage(changeElement) {\n\t\t_.each(this.TooltipElements, function (pair) {\n\t\t\tif (pair.changeElement.get(0) === changeElement.get(0)) pair.attractionElement.hide();\n\t\t});\n\t},\n\n\tonChangeElementChange: function onChangeElementChange(event) {\n\t\t_.each(this.TooltipElements, function (pair) {\n\t\t\tif (pair.changeElement.get(0) === event.target) pair.attractionElement.hide();\n\t\t});\n\t},\n\n\tdestroyValidationErrors: function destroyValidationErrors() {\n\t\tvar _this10 = this;\n\n\t\t_.each(this.TooltipElements, function (tooltip) {\n\t\t\ttooltip.changeElement.off(\"change\", _this10.onChangeElementChange);\n\t\t\ttooltip.attractionElement.hide();\n\t\t});\n\n\t\tthis.TooltipElements = [];\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJpZ01vZGFsLmpzIl0sIm5hbWVzIjpbIiQiLCJyZXF1aXJlIiwiXyIsIkJhY2tib25lIiwiTlByb2dyZXNzIiwicmF5Z3VuIiwic2V0dGluZ3MiLCJ0aXBweSIsImRlZmF1bHQiLCJFcnJvcnMiLCJFcnJvclZpZXciLCJBcHAiLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJleHRlbmQiLCJjbGFzc05hbWUiLCJ1aSIsIm1vZGFsVGl0bGUiLCJtb2RhbEJvZHkiLCJlcnJvckNvbnRhaW5lciIsImZvcm1Db250YWluZXIiLCJjb25maXJtYXRpb25Db250YWluZXIiLCJzdGF0dXNDb250YWluZXIiLCJzdGF0dXNDb250ZW50cyIsInN0YXR1c01lc3NhZ2VMb2FkaW5nIiwic3RhdHVzTWVzc2FnZVNhdmluZyIsInN0YXR1c01lc3NhZ2VEZWxldGluZyIsInN0YXR1c01lc3NhZ2VXb3JraW5nIiwic3RhdHVzTWVzc2FnZVN1Y2Nlc3MiLCJzcGlubmVyIiwiY29uZmlybWF0aW9uTWVzc2FnZSIsImNvbmZpcm1hdGlvblF1ZXN0aW9uIiwiY29uZmlybWF0aW9uQWNjZXB0QnV0dG9uIiwiY29uZmlybWF0aW9uRGVjbGluZUJ1dHRvbiIsIm1vZGFsRm9vdGVyIiwiZm9ybSIsIm1vZGVsRXZlbnRzIiwiaW52YWxpZCIsInRvVGl0bGVDYXNlIiwic3RyaW5nIiwicmVwbGFjZSIsInRleHQiLCJjaGFyQXQiLCJ0b1VwcGVyQ2FzZSIsInN1YnN0ciIsInRvTG93ZXJDYXNlIiwiZ2V0VGVtcGxhdGUiLCJzZXJpYWxpemVEYXRhIiwiYWRkaXRpb25hbERhdGEiLCJpc0Z1bmN0aW9uIiwibG9hZERhdGEiLCJhdWdtZW50VGVtcGxhdGVEYXRhIiwibW9kZWxEYXRhIiwibW9kZWwiLCJ0b0pTT04iLCJjb21wdXRlZCIsInRlbXBsYXRlQ29udGV4dCIsImlzTW9kZUNyZWF0ZSIsImlzTW9kZUVkaXQiLCJpc05ldyIsImRhdGFOb3VuIiwibm91biIsIk9wdGlvbnMiLCJ0aXRsZUNhc2UiLCJjcmVhdGVJY29uIiwiZWRpdEljb24iLCJjcmVhdGVWZXJiIiwidmVyYiIsImVkaXRWZXJiIiwiaW5pdGlhbGl6ZSIsImJpbmRBbGwiLCJFdmVudEJ1cyIsIlJhZGlvIiwiY2hhbm5lbCIsInJhbmRvbVN0cmluZyIsIkhvc3QiLCJob3N0IiwibW9kYWxDb250ZXh0IiwiVG9vbHRpcEVsZW1lbnRzIiwic2hvdyIsImxpc3RlbmVycyIsImVhY2giLCJoYW5kbGVyIiwiZXZlbnQiLCJvbiIsImFjdGlvbnMiLCJhY3Rpb24iLCJyZXBseSIsImJpbmQiLCJhcHBlbmQiLCJyZW5kZXIiLCIkZWwiLCJjb21wbGV0ZUxvYWRpbmciLCJyZXF1aXJlTG9hZGluZyIsIm9uUmVuZGVyIiwicmVtb3ZlQ2xhc3MiLCJhZGRDbGFzcyIsImR1bmtlZCIsIm1hcCIsImNoaWxkcmVuIiwiaXRlbSIsImlzIiwiZ2V0UGF0aCIsInN0b3BQcm9wYWdhdGlvbiIsImNzcyIsIm9wYWNpdHkiLCJ0eXBlIiwiY2xhc3NlcyIsIkJ1dHRvbnMiLCJidXR0b25zIiwic3BlY2lmaWNhdGlvbiIsIm9uQWNjZXB0Iiwic2F2ZSIsInZhbGlkYXRlIiwib25EZWxldGUiLCJvbkNhbmNlbCIsIlN0cmluZyIsIm1vZGUiLCJwZXJtaXNzaW9uIiwibGFiZWwiLCJkYXRhIiwibWl4aW5UZW1wbGF0ZUNvbnRleHQiLCJodG1sIiwidGVtcGxhdGUiLCJiaW5kVUlFbGVtZW50cyIsInJlbmRlckZvcm0iLCJvbkRlc3Ryb3kiLCJsZW5ndGgiLCJvZmYiLCJlbCIsIm9uQWN0aW9uIiwiYWNjZXB0IiwiZGVsZXRlIiwiY2xvc2UiLCJjb25maXJtTWVzc2FnZUNhbGxiYWNrSWRlbnRpZmllciIsInF1ZXN0aW9uIiwic2hvd0NvbmZpcm1hdGlvbiIsIm1lc3NhZ2UiLCJvblVwbG9hZFByb2dyZXNzIiwicGVyY2VudGFnZSIsInNldCIsImNvbnRpbnVlU2F2ZSIsImJlZm9yZVNhdmUiLCJhc3NlbWJsZURhdGEiLCJmaWxlcyIsImZpbGUiLCJuYW1lIiwic2V0RmlsZSIsIm9sZEF0dHJpYnV0ZXMiLCJyZWR1Y2UiLCJhdHRyaWJ1dGVzIiwiYWNjdW11bGF0b3IiLCJ2YWx1ZSIsImtleSIsImdldCIsImlzVmFsaWQiLCJzZXRTdGF0dXNCdXN5IiwieGhyIiwiYmluYXJ5U2F2ZSIsIndhaXQiLCJzdWNjZXNzIiwib25TYXZlU3VjY2VzcyIsImVycm9yIiwib25TYXZlRXJyb3IiLCJpbml0aWFsaXplUHJvZ3Jlc3NCYXIiLCJzZXRVSUhpZGRlbiIsInJlc3BvbnNlIiwic2hvd0Vycm9yIiwiTW9kZWwiLCJ0aXRsZSIsImRlc3Ryb3kiLCJvbkRlbGV0ZVN1Y2Nlc3MiLCJvbkRlbGV0ZUVycm9yIiwicmVzdWx0IiwiYWJvcnQiLCJkZXN0cm95VmFsaWRhdGlvbkVycm9ycyIsImNvbXBsZXRlUmVzdWx0IiwiYXNzZW1ibGVSZXN1bHQiLCJ0cmlnZ2VyIiwibmV3TW9kZWwiLCJyZXF1ZXN0Iiwib2xkQWN0aW9uIiwic3RvcFJlcGx5aW5nIiwib3B0aW9ucyIsIm9uZSIsIm9uQ29uZmlybWF0aW9uQWNjZXB0Iiwib25Db25maXJtYXRpb25EZWNsaW5lIiwic2V0VUlWaXNpYmxlIiwic2V0U2F2aW5nU3RhdHVzIiwic2V0VUlCdXN5IiwiQnVzeUJ1dHRvbnMiLCJidXR0b24iLCJoaWRlIiwiaGFzQ2xhc3MiLCJwdXNoIiwicHJvcCIsInNldFVJUmVhZHkiLCJIaWRkZW5CdXR0b25zIiwiY29uZmlndXJlIiwicGFyZW50Iiwic2hvd1NwaW5uZXIiLCJ0cmlja2xlIiwibWluaW11bSIsInRyaWNrbGVSYXRlIiwidHJpY2tsZVNwZWVkIiwic3RhcnQiLCJzZXRQcm9ncmVzcyIsImZyYWN0aW9uIiwic2V0U3RhdHVzUmVhZHkiLCJzdGF0dXMiLCJzZXRTdGF0dXNGYWlsIiwiY2xvc2VCdXR0b24iLCJvbmNlIiwiZG9uZSIsImRlYnVnIiwicmVwb3J0RXJyb3JzIiwidmFsaWRhdGlvbkZhaWwiLCJlcnJvck1hcCIsImJlZm9yZVZhbGlkYXRpb25GYWlsIiwidmFsaWRhdGlvbkVycm9yIiwiYXR0cmFjdGlvbkVsZW1lbnRLZXkiLCJhdHRyYWN0aW9uRWxlbWVudCIsImNoYW5nZUVsZW1lbnRLZXkiLCJjaGFuZ2VFbGVtZW50Iiwic2VsZWN0b3IiLCJzaG93VmFsaWRhdGlvbkVycm9yTWVzc2FnZSIsInBvc2l0aW9uIiwiZmluZCIsIm1hdGNoZXNQcm9wZXJ0eSIsInVuZGVmaW5lZCIsInRoZW1lIiwicGxhY2VtZW50IiwiYXJyb3ciLCJjb250ZW50IiwieCIsImNoYXJDb2RlQXQiLCJkZWxheSIsImludGVyYWN0aXZlIiwibXVsdGlwbGUiLCJoaWRlT25DbGljayIsIl90aXBweSIsIm9uQ2hhbmdlRWxlbWVudENoYW5nZSIsInNldENvbnRlbnQiLCJoaWRlVmFsaWRhdGlvbkVycm9yTWVzc2FnZSIsInBhaXIiLCJ0YXJnZXQiLCJ0b29sdGlwIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsSUFBSUQsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNRSxXQUFXRixRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNRyxZQUFZSCxRQUFRLFdBQVIsQ0FBbEI7QUFDQSxJQUFNSSxTQUFTSixRQUFRLFFBQVIsQ0FBZjtBQUNBLElBQU1LLFdBQVdMLFFBQVEsY0FBUixDQUFqQjtBQUNBLElBQU1NLFFBQVFOLFFBQVEsVUFBUixFQUFvQk8sT0FBbEM7O0FBRUEsSUFBTUMsU0FBU1IsUUFBUSxhQUFSLENBQWY7QUFDQSxJQUFNUyxZQUFZVCxRQUFRLGdCQUFSLENBQWxCOztBQUVBLElBQU1VLE1BQU1WLFFBQVEsVUFBUixDQUFaOztBQUVBVyxPQUFPQyxPQUFQLEdBQWlCVixTQUFTVyxVQUFULENBQW9CQyxJQUFwQixDQUF5QkMsTUFBekIsQ0FBZ0M7QUFDaERDLFlBQVcsMEJBRHFDOztBQUdoREMsS0FBSTtBQUNIQyxjQUFZLGNBRFQ7O0FBR0hDLGFBQVcsYUFIUjs7QUFLSEMsa0JBQWdC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QyxDQUFqQiIsImZpbGUiOiJiaWdNb2RhbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgTlByb2dyZXNzID0gcmVxdWlyZShcIm5wcm9ncmVzc1wiKTtcbmNvbnN0IHJheWd1biA9IHJlcXVpcmUoXCJyYXlndW5cIik7XG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5jb25zdCB0aXBweSA9IHJlcXVpcmUoXCJ0aXBweS5qc1wiKS5kZWZhdWx0O1xuXG5jb25zdCBFcnJvcnMgPSByZXF1aXJlKFwiLi9lcnJvcnMuanNcIik7XG5jb25zdCBFcnJvclZpZXcgPSByZXF1aXJlKFwiLi9lcnJvclZpZXcuanNcIik7XG5cbmNvbnN0IEFwcCA9IHJlcXVpcmUoXCIuLi9pbmRleFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImJpZy1tb2RhbCBtb2RhbC1taW4tc2l6ZVwiLFxuXG5cdHVpOiB7XG5cdFx0bW9kYWxUaXRsZTogXCIubW9kYWwtdGl0bGVcIixcblxuXHRcdG1vZGFsQm9keTogXCIubW9kYWwtYm9keVwiLFxuXG5cdFx0ZXJyb3JDb250YWluZXI6IFwiZGl2LmVycm9yLWNvbnRhaW5lclwiLFxuXHRcdGZvcm1Db250YWluZXI6IFwiZGl2LmZvcm0tY29udGFpbmVyXCIsXG5cdFx0Y29uZmlybWF0aW9uQ29udGFpbmVyOiBcImRpdi5jb25maXJtYXRpb24tY29udGFpbmVyXCIsXG5cdFx0c3RhdHVzQ29udGFpbmVyOiBcImRpdi5zdGF0dXMtY29udGFpbmVyXCIsXG5cblx0XHRzdGF0dXNDb250ZW50czogXCJkaXYuc3RhdHVzLWNvbnRhaW5lciBzcGFuXCIsXG5cdFx0c3RhdHVzTWVzc2FnZUxvYWRpbmc6IFwic3Bhbi5zdGF0dXMtbWVzc2FnZS1sb2FkaW5nXCIsXG5cdFx0c3RhdHVzTWVzc2FnZVNhdmluZzogXCJzcGFuLnN0YXR1cy1tZXNzYWdlLXNhdmluZ1wiLFxuXHRcdHN0YXR1c01lc3NhZ2VEZWxldGluZzogXCJzcGFuLnN0YXR1cy1tZXNzYWdlLWRlbGV0aW5nXCIsXG5cdFx0c3RhdHVzTWVzc2FnZVdvcmtpbmc6IFwic3Bhbi5zdGF0dXMtbWVzc2FnZS13b3JraW5nXCIsXG5cdFx0c3RhdHVzTWVzc2FnZVN1Y2Nlc3M6IFwic3Bhbi5zdGF0dXMtbWVzc2FnZS1zdWNjZXNzXCIsXG5cdFx0c3Bpbm5lcjogXCJzcGFuLnNwaW5uZXItaWNvblwiLFxuXG5cdFx0Y29uZmlybWF0aW9uTWVzc2FnZTogXCJzcGFuLmNvbmZpcm1hdGlvbi1tZXNzYWdlXCIsXG5cdFx0Y29uZmlybWF0aW9uUXVlc3Rpb246IFwic3Bhbi5jb25maXJtYXRpb24tcXVlc3Rpb25cIixcblx0XHRjb25maXJtYXRpb25BY2NlcHRCdXR0b246IFwiYnV0dG9uLmNvbmZpcm1hdGlvbi15ZXNcIixcblx0XHRjb25maXJtYXRpb25EZWNsaW5lQnV0dG9uOiBcImJ1dHRvbi5jb25maXJtYXRpb24tbm9cIixcblxuXHRcdG1vZGFsRm9vdGVyOiBcImRpdi5tb2RhbC1mb290ZXJcIixcblxuXHRcdGZvcm06IFwiZGl2LmZvcm1cIixcblx0fSxcblxuXHRtb2RlbEV2ZW50czoge1xuXHRcdFwidXBsb2FkOnByb2dyZXNzXCI6IFwib25VcGxvYWRQcm9ncmVzc1wiLFxuXHRcdGludmFsaWQ6IFwidmFsaWRhdGlvbkZhaWxcIixcblx0fSxcblxuXHR0b1RpdGxlQ2FzZTogZnVuY3Rpb24oc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHN0cmluZy5yZXBsYWNlKC9cXHdcXFMqL2csIHRleHQgPT4gdGV4dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleHQuc3Vic3RyKDEpLnRvTG93ZXJDYXNlKCkpO1xuXHR9LFxuXG5cdGdldFRlbXBsYXRlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gcmVxdWlyZShcIi4vdGVtcGxhdGVzL2JpZ01vZGFsLm51bmpcIik7XG5cdH0sXG5cblx0c2VyaWFsaXplRGF0YTogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gQXR0ZW1wdCB0byBnYXRoZXIgYWRkaXRpb25hbCBkYXRhIGZyb20gdGhlIGNvbmNyZXRlIG1vZGFsLiBUaGUgY29uY3JldGUgbW9kYWxcblx0XHQvLyBkb2VzIG5vdCBoYXZlIHRvIHJldHVybiBkYXRhIGV4cGxpY2l0bHkgaWYgdGhhdCBkYXRhIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgbW9kZWwsXG5cdFx0Ly8gaW4gd2hpY2ggY2FzZSB0aGUgbW9kZWwgbWF5IGhhdmUgYmVlbiBhbHRlcmVkIGJ1dCBub3RoaW5nIHdpbGwgYmUgcmV0dXJuZWQuXG5cdFx0Ly8gVGhlcmVmb3JlLCBhdWdtZW50VGVtcGxhdGVEYXRhIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBtb2RlbCBpcyBzZXJpYWxpemVkXG5cdFx0Y29uc3QgYWRkaXRpb25hbERhdGEgPSAhXy5pc0Z1bmN0aW9uKHRoaXMubG9hZERhdGEpICYmIHRoaXMuYXVnbWVudFRlbXBsYXRlRGF0YSA/IHRoaXMuYXVnbWVudFRlbXBsYXRlRGF0YSgpIHx8IHt9IDoge307XG5cdFx0Y29uc3QgbW9kZWxEYXRhID0gdGhpcy5tb2RlbCA/IHRoaXMubW9kZWwudG9KU09OKHsgY29tcHV0ZWQ6IHRydWUgfSkgOiB7fTtcblxuXHRcdHJldHVybiAkLmV4dGVuZChtb2RlbERhdGEsIGFkZGl0aW9uYWxEYXRhKTtcblx0fSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRpc01vZGVDcmVhdGU6ICgpID0+IHRoaXMuaXNNb2RlQ3JlYXRlKCksXG5cblx0XHRcdGlzTW9kZUVkaXQ6ICgpID0+IHRoaXMuaXNNb2RlRWRpdCgpLFxuXG5cdFx0XHRpc05ldzogKCkgPT4gdGhpcy5tb2RlbC5pc05ldygpLFxuXG5cdFx0XHRkYXRhTm91bjogdGl0bGVDYXNlID0+IHtcblx0XHRcdFx0Y29uc3Qgbm91biA9IHRoaXMuT3B0aW9ucy5kYXRhTm91biA9PT0gbnVsbCA/IFwiXCIgOiAodGhpcy5PcHRpb25zLmRhdGFOb3VuIHx8IFwiZGF0YVwiKTtcblx0XHRcdFx0cmV0dXJuIHRpdGxlQ2FzZSA/IHRoaXMudG9UaXRsZUNhc2Uobm91bikgOiBub3VuO1xuXHRcdFx0fSxcblxuXHRcdFx0Y3JlYXRlSWNvbjogKCkgPT4gdGhpcy5PcHRpb25zLmNyZWF0ZUljb24gfHwgXCJmYS1wbHVzXCIsXG5cblx0XHRcdGVkaXRJY29uOiAoKSA9PiB0aGlzLk9wdGlvbnMuZWRpdEljb24gfHwgXCJmYS1lZGl0XCIsXG5cblx0XHRcdGNyZWF0ZVZlcmI6IHRpdGxlQ2FzZSA9PiB7XG5cdFx0XHRcdGNvbnN0IHZlcmIgPSB0aGlzLk9wdGlvbnMuY3JlYXRlVmVyYiA9PT0gbnVsbCA/IFwiXCIgOiAodGhpcy5PcHRpb25zLmNyZWF0ZVZlcmIgfHwgXCJjcmVhdGVcIik7XG5cdFx0XHRcdHJldHVybiB0aXRsZUNhc2UgPyB0aGlzLnRvVGl0bGVDYXNlKHZlcmIpIDogdmVyYjtcblx0XHRcdH0sXG5cblx0XHRcdGVkaXRWZXJiOiB0aXRsZUNhc2UgPT4ge1xuXHRcdFx0XHRjb25zdCB2ZXJiID0gdGhpcy5PcHRpb25zLmVkaXRWZXJiIHx8IFwiZWRpdFwiO1xuXHRcdFx0XHRyZXR1cm4gdGl0bGVDYXNlID8gdGhpcy50b1RpdGxlQ2FzZSh2ZXJiKSA6IHZlcmI7XG5cdFx0XHR9LFxuXHRcdH07XG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0Xy5iaW5kQWxsKHRoaXMpO1xuXG5cdFx0dGhpcy5FdmVudEJ1cyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJiaWdtb2RhbC1cIiArIEFwcC5yYW5kb21TdHJpbmcoMTApKTtcblxuXHRcdHRoaXMuSG9zdCA9ICQodGhpcy5PcHRpb25zLmhvc3QgfHwgQXBwLm1vZGFsQ29udGV4dCB8fCBcIiNtb2RhbHNcIik7XG5cblx0XHR0aGlzLlRvb2x0aXBFbGVtZW50cyA9IFtdO1xuXG5cdFx0Ly90aGlzLiRlbC5jc3MoeyBcIm1heC1oZWlnaHRcIjogXCIyNXZoXCIsIFwibWF4LXdpZHRoXCI6IFwiMzB2d1wiIH0pO1xuXHR9LFxuXG5cdGlzTW9kZUNyZWF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuICF0aGlzLm1vZGVsIHx8IHRoaXMubW9kZWwuaXNOZXcoKTtcblx0fSxcblxuXHRpc01vZGVFZGl0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gIXRoaXMuaXNNb2RlQ3JlYXRlKCk7XG5cdH0sXG5cblx0c2hvdzogZnVuY3Rpb24obGlzdGVuZXJzKSB7XG5cdFx0Ly8gUmVnaXN0ZXIgY29udmVuaWVuY2UgbGlzdGVuZXJzXG5cdFx0aWYgKGxpc3RlbmVycykge1xuXHRcdFx0Xy5lYWNoKGxpc3RlbmVycywgKGhhbmRsZXIsIGV2ZW50KSA9PiB7XG5cdFx0XHRcdHRoaXMub24oZXZlbnQsIGhhbmRsZXIpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0Ly8gUmVnaXN0ZXIgcmVxdWVzdC1yZXNwb25zZSBhY3Rpb24gaGFuZGxlcnNcblx0XHRpZiAodGhpcy5hY3Rpb25zKSB7XG5cdFx0XHRfLmVhY2godGhpcy5hY3Rpb25zLCAoaGFuZGxlciwgYWN0aW9uKSA9PiB7XG5cdFx0XHRcdHRoaXMuRXZlbnRCdXMucmVwbHkoXCJiaWdNb2RhbDpcIiArIGFjdGlvbiwgdGhpc1toYW5kbGVyXS5iaW5kKHRoaXMpKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdCQoXCIubW9kYWwtY29udGFpbmVyXCIsIHRoaXMuSG9zdCkuYXBwZW5kKHRoaXMucmVuZGVyKCkuJGVsKTtcblx0fSxcblxuXHRjb21wbGV0ZUxvYWRpbmc6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMucmVxdWlyZUxvYWRpbmcgPSBmYWxzZTtcblxuXHRcdC8vIFJlcGxhY2UgdGhlIGNlbnRyZVxuXHRcdHRoaXMub25SZW5kZXIoKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gU2hvdyB0aGUgbW9kYWwgYmFja2dyb3VuZFxuXHRcdCQoXCIubW9kYWwtZWxlbWVudFwiLCB0aGlzLkhvc3QpLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHQkKFwiYm9keVwiKS5hZGRDbGFzcyhcImhpZGUtb3ZlcmZsb3dcIik7XG5cblx0XHQvLyBJZiB0aGVyZSdzIGFueSBvdGhlciBtb2RhbHMgdmlzaWJsZSByaWdodCBub3csIGhpZGUgdGhlbSwgYW5kIHJlc3RvcmUgaXQgYWZ0ZXJcblx0XHR0aGlzLmR1bmtlZCA9ICQubWFwKCQoXCIubW9kYWwtY29udGFpbmVyXCIsIHRoaXMuSG9zdCkuY2hpbGRyZW4oKSwgaXRlbSA9PiB7XG5cdFx0XHRpZiAoJChpdGVtKS5pcyh0aGlzLiRlbCkpXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdCQoaXRlbSkuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0cmV0dXJuICQoaXRlbSkuZ2V0UGF0aCgpO1xuXHRcdH0pO1xuXG5cdFx0Ly8gVGhlIG1vZGFsIGl0c2VsZiBzaG91bGQgYWxsb3cgY2xpY2tzIHRvIHByb3BhZ2F0ZSBzbyB0aGF0IG1lbnVzIGluIHRoZVxuXHRcdC8vIG1vZGFsIHdpbGwgYmUgaGlkZGVuIGNvcnJlY3RseS4gSG93ZXZlciwgZXZlcnl0aGluZyB1bmRlcm5lYXRoIHRoZSBtb2RhbFxuXHRcdC8vIHNob3VsZCBiZSB1bmFmZmVjdGVkIGJ5IGNsaWNrc1xuXHRcdCQoXCIjbW9kYWxzXCIpLm9uKFwiY2xpY2tcIiwgZXZlbnQgPT4gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCkpO1xuXG5cdFx0Ly8gRGlzcGxheSB0aGUgbG9hZGluZyBzdGF0dXMgbWVzc2FnZSBpZiByZXF1aXJlZFxuXHRcdGlmIChfLmlzRnVuY3Rpb24odGhpcy5sb2FkRGF0YSkgJiYgdGhpcy5yZXF1aXJlTG9hZGluZyAhPT0gZmFsc2UpIHtcblx0XHRcdHRoaXMudWkuc3Bpbm5lci5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLnVpLnN0YXR1c01lc3NhZ2VMb2FkaW5nLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHRoaXMudWkuc3RhdHVzQ29udGFpbmVyLmNzcyh7IG9wYWNpdHk6IDEsIFwicG9pbnRlci1ldmVudHNcIjogXCJhbGxcIiB9KTtcblx0XHRcdHJldHVybiB0aGlzLmxvYWREYXRhKHRoaXMuY29tcGxldGVMb2FkaW5nLmJpbmQodGhpcykpO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgcHJpbWFyeSBzdHlsZSBvZiB0aGUgbW9kYWxcblx0XHRpZiAodGhpcy5PcHRpb25zLnR5cGUpIHtcblx0XHRcdHN3aXRjaCAodGhpcy5PcHRpb25zLnR5cGUpIHtcblx0XHRcdFx0Y2FzZSBcIndhcm5pbmdcIjpcblx0XHRcdFx0XHR0aGlzLnVpLm1vZGFsVGl0bGUuYWRkQ2xhc3MoXCJtb2RhbC13YXJuaW5nXCIpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0Ly8gTm8gbmVlZCB0byBhZGQgYW4gYWRkaXRpb25hbCBjbGFzc1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFkZCBhbnkgYWRkaXRpb25hbCBDU1MgY2xhc3Nlcywgc3BlY2lmaWVkIGJ5IHRoZSBjdXN0b20gbW9kYWwsIHRvIHRoZSBiaWdNb2RhbCBlbGVtZW50XG5cdFx0aWYgKHRoaXMuT3B0aW9ucy5jbGFzc2VzKSB7XG5cdFx0XHRfLmVhY2godGhpcy5PcHRpb25zLmNsYXNzZXMsIGNsYXNzTmFtZSA9PiB7XG5cdFx0XHRcdHRoaXMuJGVsLmFkZENsYXNzKGNsYXNzTmFtZSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvLyBDcmVhdGUgdGhlIGJ1dHRvbnNcblx0XHR0aGlzLkJ1dHRvbnMgPSB7fTtcblxuXHRcdF8uZWFjaCh0aGlzLk9wdGlvbnMuYnV0dG9ucywgKHNwZWNpZmljYXRpb24sIGFjdGlvbikgPT4ge1xuXHRcdFx0bGV0IGNsYXNzZXMgPSBcIlwiO1xuXHRcdFx0bGV0IGhhbmRsZXIgPSBudWxsO1xuXG5cdFx0XHRzd2l0Y2ggKHNwZWNpZmljYXRpb24udHlwZSkge1xuXHRcdFx0XHRjYXNlIFwiYWNjZXB0XCI6XG5cdFx0XHRcdFx0Y2xhc3NlcyArPSBcInN1Y2Nlc3NcIjtcblx0XHRcdFx0XHRoYW5kbGVyID0gdGhpcy5vbkFjY2VwdC5iaW5kKHRoaXMsIGFjdGlvbiwgc3BlY2lmaWNhdGlvbi5zYXZlLCBzcGVjaWZpY2F0aW9uLnZhbGlkYXRlKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFwiZGVsZXRlXCI6XG5cdFx0XHRcdFx0Y2xhc3NlcyArPSBcImFsZXJ0XCI7XG5cdFx0XHRcdFx0aGFuZGxlciA9IHRoaXMub25EZWxldGUuYmluZCh0aGlzLCBhY3Rpb24pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJjYW5jZWxcIjpcblx0XHRcdFx0XHRjbGFzc2VzICs9IFwic2Vjb25kYXJ5XCI7XG5cdFx0XHRcdFx0aGFuZGxlciA9IHRoaXMub25DYW5jZWwuYmluZCh0aGlzLCBhY3Rpb24pO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0Y2xhc3NlcyA9IFN0cmluZyhjbGFzc2VzKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblxuXHRcdFx0aWYgKHNwZWNpZmljYXRpb24ubW9kZSkge1xuXHRcdFx0XHRzd2l0Y2ggKHNwZWNpZmljYXRpb24ubW9kZSkge1xuXHRcdFx0XHRcdGNhc2UgXCJjcmVhdGVcIjpcblx0XHRcdFx0XHRcdGNsYXNzZXMgKz0gdGhpcy5pc01vZGVDcmVhdGUoKSA/IFwiXCIgOiBcIiBoaWRlXCI7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgXCJlZGl0XCI6XG5cdFx0XHRcdFx0XHRjbGFzc2VzICs9IHRoaXMuaXNNb2RlRWRpdCgpID8gXCJcIiA6IFwiIGhpZGVcIjtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdC8vIElmIHRoZSBtb2RlIGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gc2hvdyB0aGUgYnV0dG9uIGF0IGFsbCB0aW1lc1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKHNwZWNpZmljYXRpb24ucGVybWlzc2lvbiAmJiAhc3BlY2lmaWNhdGlvbi5wZXJtaXNzaW9uKCkpXG5cdFx0XHRcdGNsYXNzZXMgKz0gXCIgaGlkZVwiO1xuXG5cdFx0XHR0aGlzLnVpLm1vZGFsRm9vdGVyLmFwcGVuZChcIjxidXR0b24gdHlwZT1cXFwiYnV0dG9uXFxcIiBjbGFzcz0nYnV0dG9uIFwiICsgY2xhc3NlcyArIFwiIFwiICsgYWN0aW9uICsgXCInPlwiICsgc3BlY2lmaWNhdGlvbi5sYWJlbCArIFwiPC9idXR0b24+XCIpO1xuXG5cdFx0XHR0aGlzLkJ1dHRvbnNbYWN0aW9uXSA9ICQoXCJidXR0b24uXCIgKyBhY3Rpb24sIHRoaXMudWkubW9kYWxGb290ZXIpO1xuXHRcdFx0dGhpcy5CdXR0b25zW2FjdGlvbl0ub24oXCJjbGlja1wiLCBoYW5kbGVyKTtcblx0XHR9KTtcblxuXHRcdC8vIFJlbmRlciB0aGUgY29udGVudFxuXHRcdGNvbnN0IGRhdGEgPSB0aGlzLm1peGluVGVtcGxhdGVDb250ZXh0KHRoaXMuc2VyaWFsaXplRGF0YSgpKTtcblx0XHR0aGlzLnVpLmZvcm1Db250YWluZXIuaHRtbCh0aGlzLk9wdGlvbnMudGVtcGxhdGUucmVuZGVyKGRhdGEpKTtcblxuXHRcdC8vIFVwZGF0ZSBVSSBiaW5kaW5nc1xuXHRcdHRoaXMuYmluZFVJRWxlbWVudHMoKTtcblxuXHRcdC8vIERlZmluZSByZW5kZXJGb3JtIHRvIHBlcmZvcm0gYW55IHNwZWNpYWwgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGZvcm0gVUlcblx0XHRpZiAodGhpcy5yZW5kZXJGb3JtKVxuXHRcdFx0dGhpcy5yZW5kZXJGb3JtKCk7XG5cblx0XHQvLyBBbGxvdyB0aGUgZWxlbWVudCB0byB0cmFuc2l0aW9uIHRvIGl0cyB0cnVlIHNpemVcblx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyhcIm1vZGFsLW1pbi1zaXplXCIpOy8vY3NzKHsgXCJtYXgtd2lkdGhcIjogXCJcIiwgXCJtYXgtaGVpZ2h0XCI6IFwiXCIgfSk7XG5cblx0XHR0aGlzLnVpLnN0YXR1c0NvbnRhaW5lci5jc3MoeyBvcGFjaXR5OiAwLCBcInBvaW50ZXItZXZlbnRzXCI6IFwibm9uZVwiIH0pO1xuXHR9LFxuXG5cdG9uRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gQ2xlYW4gdXAgdGhlIGJhY2tncm91bmRcblx0XHRpZiAodGhpcy5kdW5rZWQgJiYgdGhpcy5kdW5rZWQubGVuZ3RoID09PSAwKSB7XG5cdFx0XHQkKFwiLm1vZGFsLWVsZW1lbnRcIiwgdGhpcy5Ib3N0KS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHQkKFwiYm9keVwiKS5yZW1vdmVDbGFzcyhcImhpZGUtb3ZlcmZsb3dcIik7XG5cblx0XHRcdC8vIFVuYmluZCB0aGUgY2xpY2sgaGFuZGxlclxuXHRcdFx0JChcIiNtb2RhbHNcIikub2ZmKFwiY2xpY2tcIik7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuZHVua2VkKSB7XG5cdFx0XHRfLmVhY2godGhpcy5kdW5rZWQsIGl0ZW0gPT4ge1xuXHRcdFx0XHRpZiAoIWl0ZW0pXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRjb25zdCBlbCA9ICQoaXRlbSk7XG5cdFx0XHRcdGlmIChlbCAmJiBlbC5sZW5ndGgpXG5cdFx0XHRcdFx0ZWwucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0Ly8gVW5iaW5kIHRoZSBidXR0b24gZXZlbnQgaGFuZGxlcnNcblx0XHRcdF8uZWFjaCh0aGlzLk9wdGlvbnMuYnV0dG9ucywgKHNwZWNpZmljYXRpb24sIGFjdGlvbikgPT4ge1xuXHRcdFx0XHQkKFwiYnV0dG9uLlwiICsgYWN0aW9uKS5vZmYoXCJjbGlja1wiKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fSxcblxuXHRvbkFjY2VwdDogZnVuY3Rpb24oYWN0aW9uLCBzYXZlLCB2YWxpZGF0ZSkge1xuXHRcdHRoaXMub25BY3Rpb24oXCJjb25maXJtQWNjZXB0XCIsIFwiV291bGQgeW91IGxpa2UgdG8gY29udGludWU/XCIsIHRoaXMuYWNjZXB0LmJpbmQodGhpcywgYWN0aW9uLCBzYXZlLCB2YWxpZGF0ZSkpO1xuXHR9LFxuXG5cdG9uRGVsZXRlOiBmdW5jdGlvbihhY3Rpb24pIHtcblx0XHR0aGlzLm9uQWN0aW9uKFwiY29uZmlybURlbGV0ZVwiLCBcIkFyZSB5b3Ugc3VyZSB0aGF0IHlvdSB3aXNoIHRvIGRlbGV0ZSB0aGlzIFwiICsgdGhpcy50ZW1wbGF0ZUNvbnRleHQoKS5kYXRhTm91bigpICsgXCI/XCIsXG5cdFx0XHR0aGlzLmRlbGV0ZS5iaW5kKHRoaXMsIGFjdGlvbikpO1xuXHR9LFxuXG5cdG9uQ2FuY2VsOiBmdW5jdGlvbihhY3Rpb24pIHtcblx0XHR0aGlzLm9uQWN0aW9uKFwiY29uZmlybUNhbmNlbFwiLCBcIkFyZSB5b3Ugc3VyZSB0aGF0IHlvdSB3aXNoIHRvIGNhbmNlbCB0aGlzIFwiICsgdGhpcy50ZW1wbGF0ZUNvbnRleHQoKS5kYXRhTm91bigpICsgXCI/XCIsXG5cdFx0XHR0aGlzLmNsb3NlLmJpbmQodGhpcywgYWN0aW9uKSk7XG5cdH0sXG5cblx0b25BY3Rpb246IGZ1bmN0aW9uKGNvbmZpcm1NZXNzYWdlQ2FsbGJhY2tJZGVudGlmaWVyLCBxdWVzdGlvbiwgb25BY2NlcHQpIHtcblx0XHQvLyBEZXRlcm1pbmUgaWYgdGhlIGNvbmNyZXRlIG1vZGFsIHJlcXVpcmVzIGNvbmZpcm1hdGlvbiBmb3IgdGhpcyBhY3Rpb25cblx0XHRjb25zdCBjb25maXJtYXRpb25NZXNzYWdlID0gdGhpc1tjb25maXJtTWVzc2FnZUNhbGxiYWNrSWRlbnRpZmllcl0gPyB0aGlzW2NvbmZpcm1NZXNzYWdlQ2FsbGJhY2tJZGVudGlmaWVyXSgpIDogbnVsbDtcblxuXHRcdC8vIElmIHRoZSBjb25jcmV0ZSBtb2RhbCBzdXBwbGllZCBhIGNvbmZpcm1hdGlvbiBtZXNzYWdlLi4uXG5cdFx0aWYgKGNvbmZpcm1hdGlvbk1lc3NhZ2UpIHtcblx0XHRcdC8vIC4uLnRoZW4gY29uZmlybWF0aW9uIGlzIHJlcXVpcmVkXG5cdFx0XHR0aGlzLnNob3dDb25maXJtYXRpb24oe1xuXHRcdFx0XHRtZXNzYWdlOiBjb25maXJtYXRpb25NZXNzYWdlLFxuXHRcdFx0XHRxdWVzdGlvbjogcXVlc3Rpb24sXG5cdFx0XHRcdG9uQWNjZXB0OiBvbkFjY2VwdCxcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdG9uQWNjZXB0KCk7XG5cdFx0fVxuXHR9LFxuXG5cdG9uVXBsb2FkUHJvZ3Jlc3M6IGZ1bmN0aW9uKHBlcmNlbnRhZ2UpIHtcblx0XHROUHJvZ3Jlc3Muc2V0KHBlcmNlbnRhZ2UgLyAxMDApO1xuXHR9LFxuXG5cdGFjY2VwdDogYXN5bmMgZnVuY3Rpb24oYWN0aW9uLCBzYXZlLCB2YWxpZGF0ZSkge1xuXHRcdC8vIEV4ZWN1dGUgaGFuZGxlcnMsIGlmIGRlZmluZWQgYnkgdGhlIGNvbmNyZXRlIG1vZGFsXG5cdFx0bGV0IGNvbnRpbnVlU2F2ZSA9IHRydWU7XG5cblx0XHRpZiAodGhpcy5iZWZvcmVTYXZlKVxuXHRcdFx0Y29udGludWVTYXZlID0gYXdhaXQgdGhpcy5iZWZvcmVTYXZlKCk7XG5cblx0XHRpZiAoY29udGludWVTYXZlKSB7XG5cdFx0XHRpZiAoIXRoaXMubW9kZWwpXG5cdFx0XHRcdHJldHVybiB0aGlzLmNsb3NlKGFjdGlvbik7XG5cblx0XHRcdC8vIFJldHJpZXZlIHRoZSBhdHRyaWJ1dGVzIGZyb20gdGhlIGN1c3RvbSBtb2RhbFxuXHRcdFx0Y29uc3QgZGF0YSA9IHRoaXMuYXNzZW1ibGVEYXRhID8gdGhpcy5hc3NlbWJsZURhdGEoKSA6IG51bGw7XG5cblx0XHRcdC8vIFNldCB0aGUgbW9kZWwgYXR0cmlidXRlc1xuXHRcdFx0aWYgKGRhdGEpIHtcblx0XHRcdFx0aWYgKGRhdGEuZmlsZXMpIHtcblx0XHRcdFx0XHQvLyBTZXQgdGhlIGZpbGVzXG5cdFx0XHRcdFx0Xy5lYWNoKGRhdGEuZmlsZXMsIChmaWxlLCBuYW1lKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLm1vZGVsLnNldEZpbGUobmFtZSwgZmlsZSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBQcmVzZXJ2ZSB0aGUgYXR0cmlidXRlcyB0aGF0IGFyZSBhYm91dCB0byBiZSBjaGFuZ2VkXG5cdFx0XHRcdHRoaXMub2xkQXR0cmlidXRlcyA9IF8ucmVkdWNlKGRhdGEuYXR0cmlidXRlcywgKGFjY3VtdWxhdG9yLCB2YWx1ZSwga2V5KSA9PiB7XG5cdFx0XHRcdFx0YWNjdW11bGF0b3Jba2V5XSA9IHRoaXMubW9kZWwuZ2V0KGtleSk7XG5cdFx0XHRcdFx0cmV0dXJuIGFjY3VtdWxhdG9yO1xuXHRcdFx0XHR9LCB7fSk7XG5cblx0XHRcdFx0dGhpcy5tb2RlbC5zZXQoZGF0YS5hdHRyaWJ1dGVzLCB7IHZhbGlkYXRlOiBmYWxzZSB9KTtcblxuXHRcdFx0XHRpZiAoIXZhbGlkYXRlIHx8IHZhbGlkYXRlICYmIHRoaXMubW9kZWwuaXNWYWxpZCgpKSB7XG5cdFx0XHRcdFx0Ly8gSWYgdGhlIG1vZGVsIGRhdGEgbXVzdCBiZSBzYXZlZC4uLlxuXHRcdFx0XHRcdGlmIChzYXZlKVxuXHRcdFx0XHRcdFx0Ly8gLi4udGhlbiBlbXBsb3kgdGhlIGludGVybmFsIHNhdmUgcHJvY2VkdXJlLi4uXG5cdFx0XHRcdFx0XHR0aGlzLnNhdmUoYWN0aW9uLCBkYXRhKTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHQvLyAuLi5vdGhlcndpc2UsIGNsb3NlIHRoZSBtb2RhbCBhbmQgcmV0dXJuIHRoZSBtb2RlbFxuXHRcdFx0XHRcdFx0dGhpcy5jbG9zZShhY3Rpb24sIHsgbW9kZWw6IHRoaXMubW9kZWwgfSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0Ly8gQ2FsbCAuc2F2ZSgpIHRvIHNhdmUgdGhlIG1vZGVsIGZvciB0aGlzIG1vZGFsLiBUaGUgcGFyYW1ldGVyLCBkYXRhLCBtdXN0XG5cdC8vIGNvbnRhaW4gYSBoYXNoIHRoYXQgY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgYW5kIGFueSBiaW5hcnkgZmlsZXMgdGhhdCBzaG91bGQgYmUgc2F2ZWQ6XG5cdC8vIHtcblx0Ly8gICAgIGF0dHJpYnV0ZXM6IHtcblx0Ly8gICAgICAgICBcInRpdGxlXCI6IHRoaXMudWkuaW5wdXRUaXRsZS52YWwoKSxcblx0Ly8gICAgIH0sXG5cdC8vICAgICBmaWxlczoge1xuXHQvLyAgICAgICAgIFwiZmlsZVwiOiB0aGlzLnVpLnZpZGVvLmdldCgwKS5maWxlc1swXVxuXHQvLyAgICAgfSxcblx0Ly8gfVxuXHQvLyBJZiBmaWxlcyBpcyB1bmRlZmluZWQgb3IgaXMgZW1wdHksIHRoZW4gYSBub3JtYWwgbW9kZWwuc2F2ZSgpIHdpbGwgYmUgZXhlY3V0ZWQuXG5cdC8vIElmIGZpbGVzIGlzIG5vdCBlbXB0eSwgdGhlbiB0aGUgcmVxdWlzaXRlIGNhbGxzIHRvIHNldCB0aGUgZmlsZSB3aWxsIGJlIG1hZGVcblx0Ly8gYW5kIGEgbW9kZWwuYmluYXJ5U2F2ZSgpIHdpbGwgYmUgZXhlY3V0ZWQuXG5cdHNhdmU6IGZ1bmN0aW9uKGFjdGlvbiwgZGF0YSkge1xuXHRcdC8vIE1vZGlmeSB0aGUgbW9kYWwgbGF5b3V0XG5cdFx0dGhpcy5zZXRTdGF0dXNCdXN5KFwic2F2aW5nXCIpO1xuXG5cdFx0Ly8gSWYgZmlsZXMgd2VyZSBzcGVjaWZpZWQuLi5cblx0XHRpZiAoZGF0YS5maWxlcykge1xuXHRcdFx0Ly8gLi4udGhlbiBlbXBsb3kgdGhlIG1vZGVsJ3MgYmluYXJ5IHNhdmUgbWV0aG9kLi4uXG5cblx0XHRcdC8vIFNhdmUgdGhlIG1vZGVsXG5cdFx0XHR0aGlzLnhociA9IHRoaXMubW9kZWwuYmluYXJ5U2F2ZShudWxsLCB7XG5cdFx0XHRcdHdhaXQ6IHRydWUsXG5cdFx0XHRcdGRhdGE6IGRhdGEuYXR0cmlidXRlcyxcblx0XHRcdFx0dmFsaWRhdGU6IGZhbHNlLFxuXHRcdFx0XHRzdWNjZXNzOiB0aGlzLm9uU2F2ZVN1Y2Nlc3MuYmluZCh0aGlzLCBhY3Rpb24pLFxuXHRcdFx0XHRlcnJvcjogdGhpcy5vblNhdmVFcnJvci5iaW5kKHRoaXMpLFxuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0Ly8gLi4ub3RoZXJ3aXNlLCBlbXBsb3kgdGhlIG1vZGVsJ3Mgc3RhbmRhcmQgc2F2ZSBtZXRob2RcblxuXHRcdFx0Ly8gU2F2ZSB0aGUgbW9kZWxcblx0XHRcdHRoaXMueGhyID0gdGhpcy5tb2RlbC5zYXZlKGRhdGEuYXR0cmlidXRlcywge1xuXHRcdFx0XHR3YWl0OiB0cnVlLFxuXHRcdFx0XHR2YWxpZGF0ZTogZmFsc2UsXG5cdFx0XHRcdHN1Y2Nlc3M6IHRoaXMub25TYXZlU3VjY2Vzcy5iaW5kKHRoaXMsIGFjdGlvbiksXG5cdFx0XHRcdGVycm9yOiB0aGlzLm9uU2F2ZUVycm9yLmJpbmQodGhpcyksXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHR0aGlzLmluaXRpYWxpemVQcm9ncmVzc0JhcigpO1xuXHR9LFxuXG5cdG9uU2F2ZVN1Y2Nlc3M6IGZ1bmN0aW9uKGFjdGlvbiwgbW9kZWwpIHtcblx0XHR0aGlzLnhociA9IG51bGw7XG5cdFx0TlByb2dyZXNzLnNldCgxLjApO1xuXG5cdFx0dGhpcy5zZXRVSUhpZGRlbigpO1xuXG5cdFx0dGhpcy5jbG9zZShhY3Rpb24sIHsgbW9kZWw6IG1vZGVsIH0pO1xuXHR9LFxuXG5cdG9uU2F2ZUVycm9yOiBmdW5jdGlvbihtb2RlbCwgcmVzcG9uc2UpIHtcblx0XHR0aGlzLnhociA9IG51bGw7XG5cdFx0TlByb2dyZXNzLnNldCgxLjApO1xuXG5cdFx0Ly8gUmVzdG9yZSB0aGUgb2xkIGF0dHJpYnV0ZSB2YWx1ZXNcblx0XHR0aGlzLm1vZGVsLnNldCh0aGlzLm9sZEF0dHJpYnV0ZXMsIHsgdmFsaWRhdGU6IGZhbHNlIH0pO1xuXG5cdFx0dGhpcy5zaG93RXJyb3IobmV3IEVycm9ycy5Nb2RlbCh7XG5cdFx0XHR0aXRsZTogXCJTYXZlIEVycm9yXCIsXG5cdFx0XHRtZXNzYWdlOiBcIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHNhdmluZyBkYXRhIHRvIHRoZSBzZXJ2ZXIuXCIsXG5cdFx0XHRyZXNwb25zZTogcmVzcG9uc2UsXG5cdFx0fSkpO1xuXHR9LFxuXG5cdGRlbGV0ZTogZnVuY3Rpb24oYWN0aW9uKSB7XG5cdFx0Ly8gRGlzYWJsZSB0aGUgcHJpbWFyeSBidXR0b25zIGFuZCBkaXNwbGF5IHRoZSBzdGF0dXMgY29udGFpbmVyXG5cdFx0dGhpcy5zZXRTdGF0dXNCdXN5KFwiZGVsZXRpbmdcIik7XG5cblx0XHQvLyBEZWxldGUgdGhlIG1vZGVsXG5cdFx0dGhpcy54aHIgPSB0aGlzLm1vZGVsLmRlc3Ryb3koe1xuXHRcdFx0d2FpdDogdHJ1ZSxcblx0XHRcdHN1Y2Nlc3M6IHRoaXMub25EZWxldGVTdWNjZXNzLmJpbmQodGhpcywgYWN0aW9uKSxcblx0XHRcdGVycm9yOiB0aGlzLm9uRGVsZXRlRXJyb3IuYmluZCh0aGlzKSxcblx0XHR9KTtcblxuXHRcdHRoaXMuaW5pdGlhbGl6ZVByb2dyZXNzQmFyKCk7XG5cdH0sXG5cblx0b25EZWxldGVTdWNjZXNzOiBmdW5jdGlvbihhY3Rpb24sIG1vZGVsKSB7XG5cdFx0dGhpcy54aHIgPSBudWxsO1xuXHRcdE5Qcm9ncmVzcy5zZXQoMS4wKTtcblxuXHRcdHRoaXMuc2V0VUlIaWRkZW4oKTtcblxuXHRcdHRoaXMuY2xvc2UoYWN0aW9uLCB7IG1vZGVsOiBtb2RlbCB9KTtcblx0fSxcblxuXHRvbkRlbGV0ZUVycm9yOiBmdW5jdGlvbihtb2RlbCwgcmVzcG9uc2UpIHtcblx0XHR0aGlzLnhociA9IG51bGw7XG5cdFx0TlByb2dyZXNzLnNldCgxLjApO1xuXG5cdFx0dGhpcy5zaG93RXJyb3IobmV3IEVycm9ycy5Nb2RlbCh7XG5cdFx0XHR0aXRsZTogXCJEZWxldGUgRXJyb3JcIixcblx0XHRcdG1lc3NhZ2U6IFwiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgZGVsZXRpbmcgZGF0YSBmcm9tIHRoZSBzZXJ2ZXIuXCIsXG5cdFx0XHRyZXNwb25zZTogcmVzcG9uc2UsXG5cdFx0fSkpO1xuXHR9LFxuXG5cdC8vIENhbGwgLmNsb3NlKCkgdG8gZGVzdHJveSB0aGUgbW9kYWwsIHNpZ25hbCB0aGUgbW9kYWwgY2xpZW50LCBhbmQsIG9wdGlvbmFsbHksXG5cdC8vIHJldHVybiBhIGN1c3RvbSB2YWx1ZVxuXHRjbG9zZTogZnVuY3Rpb24oYWN0aW9uLCByZXN1bHQpIHtcblx0XHQvLyBBYm9ydCBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHNlcnZlciBpZiBhbnkgaXMgaW4gcHJvZ3Jlc3Ncblx0XHRpZiAodGhpcy54aHIpIHtcblx0XHRcdHRoaXMueGhyLmFib3J0KCk7XG5cblx0XHRcdC8vIFJldmVydCBhbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBtb2RlbFxuXHRcdFx0aWYgKHRoaXMub2xkQXR0cmlidXRlcylcblx0XHRcdFx0dGhpcy5tb2RlbC5zZXQodGhpcy5vbGRBdHRyaWJ1dGVzLCB7IHZhbGlkYXRlOiBmYWxzZSB9KTtcblx0XHR9XG5cblx0XHQvLyBEZXN0cm95IGFsbCBvZiB0aGUgdG9vbHRpcHNcblx0XHR0aGlzLmRlc3Ryb3lWYWxpZGF0aW9uRXJyb3JzKCk7XG5cblx0XHQvLyBPYnRhaW4gYW55IGFkZGl0aW9uYWwsIGN1c3RvbSB2YWx1ZXMgZnJvbSB0aGUgY29uY3JldGUgbW9kYWxcblx0XHRsZXQgY29tcGxldGVSZXN1bHQgPSByZXN1bHQgPyByZXN1bHQgOiB7fTtcblxuXHRcdGlmICh0aGlzLmFzc2VtYmxlUmVzdWx0KSB7XG5cdFx0XHRjb21wbGV0ZVJlc3VsdCA9IF8ucmVkdWNlKHRoaXMuYXNzZW1ibGVSZXN1bHQoKSwgKGFjY3VtdWxhdG9yLCB2YWx1ZSwga2V5KSA9PiB7XG5cdFx0XHRcdGFjY3VtdWxhdG9yW2tleV0gPSB2YWx1ZTtcblx0XHRcdFx0cmV0dXJuIGFjY3VtdWxhdG9yO1xuXHRcdFx0fSwgY29tcGxldGVSZXN1bHQpO1xuXHRcdH1cblxuXHRcdC8vIFRyaWdnZXIgYW4gZXZlbnQgZm9yIGFueSBvcHRpb25hbGx5IHJlZ2lzdGVyZWQgbGlzdGVuZXJzXG5cdFx0dGhpcy50cmlnZ2VyKGFjdGlvbiwgY29tcGxldGVSZXN1bHQpO1xuXG5cdFx0Ly8gVHJpZ2dlciBhbiBldmVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjb21wbGV0ZWQgYWN0aW9uLiBUaGUgZXZlbnRcblx0XHQvLyBtaWdodCByZXR1cm4gYSBtb2RlbCBmb3Igd2hpY2ggdGhlIG1vZGFsIHNob3VsZCBiZSByZXNldC5cblx0XHRjb25zdCBuZXdNb2RlbCA9IHRoaXMuRXZlbnRCdXMucmVxdWVzdChcImJpZ01vZGFsOlwiICsgYWN0aW9uLCBjb21wbGV0ZVJlc3VsdCk7XG5cblx0XHRpZiAobmV3TW9kZWwpIHtcblx0XHRcdC8vIFJlc2V0IHRoZSBtb2RhbCBmb3IgZWRpdGluZyB0aGUgcmV0dXJuZWQgbW9kZWxcblx0XHRcdHRoaXMubW9kZWwgPSBuZXdNb2RlbDtcblx0XHRcdHRoaXMucmVuZGVyKCk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0aWYgKHRoaXMuYWN0aW9ucykge1xuXHRcdFx0XHRfLmVhY2godGhpcy5hY3Rpb25zLCAoaGFuZGxlciwgb2xkQWN0aW9uKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5FdmVudEJ1cy5zdG9wUmVwbHlpbmcoXCJiaWdNb2RhbDpcIiArIG9sZEFjdGlvbik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmRlc3Ryb3koKTtcblx0XHR9XG5cdH0sXG5cblx0c2hvd0NvbmZpcm1hdGlvbjogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdC8vIFNldCB0aGUgY29uZmlybWF0aW9uIGNvbnRhaW5lcidzIG1lc3NhZ2VzXG5cdFx0dGhpcy51aS5jb25maXJtYXRpb25NZXNzYWdlLnRleHQob3B0aW9ucy5tZXNzYWdlID8gb3B0aW9ucy5tZXNzYWdlIDogXCJcIik7XG5cdFx0dGhpcy51aS5jb25maXJtYXRpb25RdWVzdGlvbi50ZXh0KG9wdGlvbnMucXVlc3Rpb24gPyBvcHRpb25zLnF1ZXN0aW9uIDogXCJcIik7XG5cblx0XHQvLyBTaG93IHRoZSBjb25maXJtYXRpb24gY29udGFpbmVyXG5cdFx0dGhpcy51aS5mb3JtQ29udGFpbmVyLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLmNvbmZpcm1hdGlvbkNvbnRhaW5lci5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cblx0XHQvLyBIaWRlIHRoZSBwcmltYXJ5IGJ1dHRvbnNcblx0XHR0aGlzLnNldFVJSGlkZGVuKCk7XG5cblx0XHQvLyBCaW5kIHRoZSBhY3Rpb24gdG8gdGhlIGFjY2VwdC9kZWNsaW5lIGJ1dHRvbiBjbGljayBoYW5kbGVyc1xuXHRcdHRoaXMudWkuY29uZmlybWF0aW9uQWNjZXB0QnV0dG9uLm9uZShcImNsaWNrXCIsIHRoaXMub25Db25maXJtYXRpb25BY2NlcHQuYmluZCh0aGlzLCBvcHRpb25zLm9uQWNjZXB0KSk7XG5cdFx0dGhpcy51aS5jb25maXJtYXRpb25EZWNsaW5lQnV0dG9uLm9uZShcImNsaWNrXCIsIHRoaXMub25Db25maXJtYXRpb25EZWNsaW5lLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdG9uQ29uZmlybWF0aW9uQWNjZXB0OiBmdW5jdGlvbihhY2NlcHQpIHtcblx0XHQvLyBUaGUgdXNlciBhY2NlcHRlZCBzbyB1bmJpbmQgdGhlIGRlY2xpbmUgY2xpY2sgaGFuZGxlclxuXHRcdHRoaXMudWkuY29uZmlybWF0aW9uRGVjbGluZUJ1dHRvbi5vZmYoXCJjbGlja1wiKTtcblxuXHRcdC8vIEhpZGUgdGhlIGNvbmZpcm1hdGlvbiBjb250YWluZXJcblx0XHR0aGlzLnVpLmNvbmZpcm1hdGlvbkNvbnRhaW5lci5hZGRDbGFzcyhcImhpZGVcIik7XG5cblx0XHQvLyBQZXJmb3JtIHRoZSBhY2NlcHQgb3BlcmF0aW9uXG5cdFx0aWYgKGFjY2VwdClcblx0XHRcdGFjY2VwdCgpO1xuXHR9LFxuXG5cdG9uQ29uZmlybWF0aW9uRGVjbGluZTogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gVGhlIHVzZXIgZGVjbGluZWQgc28gdW5iaW5kIHRoZSBhY2NlcHQgY2xpY2sgaGFuZGxlclxuXHRcdHRoaXMudWkuY29uZmlybWF0aW9uQWNjZXB0QnV0dG9uLm9mZihcImNsaWNrXCIpO1xuXG5cdFx0Ly8gU2hvdyB0aGUgcHJpbWFyeSBidXR0b25zXG5cdFx0dGhpcy5zZXRVSVZpc2libGUoKTtcblxuXHRcdC8vIEhpZGUgdGhlIGNvbmZpcm1hdGlvbiBjb250YWluZXJcblx0XHR0aGlzLnVpLmNvbmZpcm1hdGlvbkNvbnRhaW5lci5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5mb3JtQ29udGFpbmVyLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRzZXRTYXZpbmdTdGF0dXM6IGZ1bmN0aW9uKHRleHQpIHtcblx0XHR0aGlzLnVpLnN0YXR1c01lc3NhZ2VTYXZpbmcuaHRtbChcIiZuYnNwOyZuYnNwO1wiICsgdGV4dCk7XG5cdH0sXG5cblx0c2V0VUlCdXN5OiBmdW5jdGlvbihvcHRpb25zID0ge30pIHtcblx0XHQvLyBSZWNvcmQgd2hpY2ggYnV0dG9ucyBhcmUgYmVpbmcgaGlkZGVuL2Rpc2FibGVkIHNvIHRoYXQgcHJlc2VudGx5XG5cdFx0Ly8gaGlkZGVuL2Rpc2FibGVkIGJ1dHRvbnMgYXJlIG5vdCBpbmFkdmVydGFudGx5IHJldmVhbGVkL2VuYWJsZWQgd2hlbiB0aGlzXG5cdFx0Ly8gb3BlcmF0aW9uIGlzIHJldmVyc2VkXG5cdFx0aWYgKCF0aGlzLkJ1c3lCdXR0b25zKSB7XG5cdFx0XHR0aGlzLkJ1c3lCdXR0b25zID0gW107XG5cblx0XHRcdF8uZWFjaCh0aGlzLkJ1dHRvbnMsIChidXR0b24sIGFjdGlvbikgPT4ge1xuXHRcdFx0XHRpZiAoYnV0dG9uLmFwcGVuZCkge1xuXHRcdFx0XHRcdGlmICh0aGlzLk9wdGlvbnMuYnV0dG9uc1thY3Rpb25dLnR5cGUgIT09IFwiY2FuY2VsXCIpIHtcblx0XHRcdFx0XHRcdGlmIChvcHRpb25zLmhpZGUpIHtcblx0XHRcdFx0XHRcdFx0aWYgKCFidXR0b24uaGFzQ2xhc3MoXCJoaWRlXCIpKSB7XG5cdFx0XHRcdFx0XHRcdFx0YnV0dG9uLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLkJ1c3lCdXR0b25zLnB1c2goYnV0dG9uKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZSBpZiAoIWJ1dHRvbi5oYXNDbGFzcyhcImRpc2FibGVkXCIpICYmICFidXR0b24uaGFzQ2xhc3MoXCJoaWRlXCIpKSB7XG5cdFx0XHRcdFx0XHRcdGJ1dHRvbi5wcm9wKFwiZGlzYWJsZWRcIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHRcdGJ1dHRvbi5hZGRDbGFzcyhcImRpc2FibGVkXCIpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLkJ1c3lCdXR0b25zLnB1c2goYnV0dG9uKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fSxcblxuXHRzZXRVSVJlYWR5OiBmdW5jdGlvbigpIHtcblx0XHRfLmVhY2godGhpcy5CdXN5QnV0dG9ucywgYnV0dG9uID0+IHtcblx0XHRcdGlmIChidXR0b24uYXBwZW5kKSB7XG5cdFx0XHRcdGlmIChidXR0b24uaGFzQ2xhc3MoXCJoaWRlXCIpKSB7XG5cdFx0XHRcdFx0YnV0dG9uLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRidXR0b24ucHJvcChcImRpc2FibGVkXCIsIGZhbHNlKTtcblx0XHRcdFx0XHRidXR0b24ucmVtb3ZlQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0dGhpcy5CdXN5QnV0dG9ucyA9IG51bGw7XG5cdH0sXG5cblx0c2V0VUlIaWRkZW46IGZ1bmN0aW9uKCkge1xuXHRcdC8vIFJlY29yZCB3aGljaCBidXR0b25zIGFyZSBiZWluZyBoaWRkZW4gc28gdGhhdCBwcmVzZW50bHkgaGlkZGVuIGJ1dHRvbnNcblx0XHQvLyBhcmUgbm90IGluYWR2ZXJ0YW50bHkgcmV2ZWFsZWQgd2hlbiB0aGlzIG9wZXJhdGlvbiBpcyByZXZlcnNlZFxuXHRcdGlmICghdGhpcy5IaWRkZW5CdXR0b25zKSB7XG5cdFx0XHR0aGlzLkhpZGRlbkJ1dHRvbnMgPSBbXTtcblxuXHRcdFx0Xy5lYWNoKHRoaXMuQnV0dG9ucywgYnV0dG9uID0+IHtcblx0XHRcdFx0aWYgKGJ1dHRvbi5hcHBlbmQpIHtcblx0XHRcdFx0XHRpZiAoIWJ1dHRvbi5oYXNDbGFzcyhcImhpZGVcIikpIHtcblx0XHRcdFx0XHRcdGJ1dHRvbi5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHRcdFx0XHR0aGlzLkhpZGRlbkJ1dHRvbnMucHVzaChidXR0b24pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdHNldFVJVmlzaWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0Xy5lYWNoKHRoaXMuSGlkZGVuQnV0dG9ucywgYnV0dG9uID0+IHtcblx0XHRcdGlmIChidXR0b24uYXBwZW5kKVxuXHRcdFx0XHRidXR0b24ucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5IaWRkZW5CdXR0b25zID0gbnVsbDtcblx0fSxcblxuXHRpbml0aWFsaXplUHJvZ3Jlc3NCYXI6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIENvbmZpZ3VyZSBhbmQgc3RhcnQgdGhlIHByb2dyZXNzIGJhclxuXHRcdE5Qcm9ncmVzcy5jb25maWd1cmUoe1xuXHRcdFx0cGFyZW50OiAkKFwiLm1vZGFsLWZvb3RlclwiLCB0aGlzLiRlbCkuZ2V0UGF0aCgpLFxuXHRcdFx0c2hvd1NwaW5uZXI6IGZhbHNlLFxuXHRcdFx0dHJpY2tsZTogdHJ1ZSxcblx0XHRcdG1pbmltdW06IDAuMDEsXG5cdFx0XHR0cmlja2xlUmF0ZTogMC4wMSxcblx0XHRcdHRyaWNrbGVTcGVlZDogMTAwMCxcblx0XHR9KS5zdGFydCgwLjApO1xuXHR9LFxuXG5cdHNldFByb2dyZXNzOiBmdW5jdGlvbihmcmFjdGlvbikge1xuXHRcdE5Qcm9ncmVzcy5zZXQoZnJhY3Rpb24pO1xuXHR9LFxuXG5cdHNldFN0YXR1c1JlYWR5OiBmdW5jdGlvbigpIHtcblx0XHQvLyBIaWRlIGFsbCBvZiB0aGUgY29udGFpbmVycyBhbmQgc2hvdyB0aGUgZm9ybSBjb250YWluZXJcblx0XHR0aGlzLnVpLm1vZGFsQm9keS5jc3MoeyBcIm92ZXJmbG93LXlcIjogXCJcIiB9KTtcblx0XHR0aGlzLnVpLmVycm9yQ29udGFpbmVyLmNzcyh7IG9wYWNpdHk6IDAsIFwicG9pbnRlci1ldmVudHNcIjogXCJub25lXCIgfSk7Ly8uYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkuc3RhdHVzQ29udGFpbmVyLmNzcyh7IG9wYWNpdHk6IDAsIFwicG9pbnRlci1ldmVudHNcIjogXCJub25lXCIgfSk7Ly9hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5jb25maXJtYXRpb25Db250YWluZXIuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkuZm9ybUNvbnRhaW5lci5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cblx0XHQvLyBSZXZlYWwgYWxsIG1vZGFsIGJ1dHRvbnMgcHJldmlvdXNseSBoaWRkZW4gZHVyaW5nIHRoZSBidXN5IHN0YXR1c1xuXHRcdHRoaXMuc2V0VUlSZWFkeSgpO1xuXHR9LFxuXG5cdHNldFN0YXR1c0J1c3k6IGZ1bmN0aW9uKHN0YXR1cykge1xuXHRcdC8vIEhpZGUgYWxsIG1vZGFsIGJ1dHRvbnMgZXhjZXB0IGZvciBjYW5jZWxcblx0XHR0aGlzLnNldFVJQnVzeSh7IGhpZGU6IHRydWUgfSk7XG5cblx0XHQvLyBIaWRlIGFsbCBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHN0YXR1cyBjb250YWluZXJcblx0XHR0aGlzLnVpLnN0YXR1c0NvbnRlbnRzLmFkZENsYXNzKFwiaGlkZVwiKTtcblxuXHRcdC8vIERpc2FibGUgc2Nyb2xsaW5nIG9uIHRoZSBtYWluIGJsb2NrXG5cdFx0dGhpcy51aS5tb2RhbEJvZHkuY3NzKHsgXCJvdmVyZmxvdy15XCI6IFwiaGlkZGVuXCIgfSk7XG5cblx0XHQvLyBTaG93IGEgbWVzc2FnZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBzdGF0dXNcblx0XHRzd2l0Y2ggKHN0YXR1cykge1xuXHRcdFx0Y2FzZSBcImxvYWRpbmdcIjpcblx0XHRcdFx0dGhpcy51aS5zdGF0dXNNZXNzYWdlTG9hZGluZy5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwic2F2aW5nXCI6XG5cdFx0XHRcdHRoaXMudWkuc3RhdHVzTWVzc2FnZVNhdmluZy5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwiZGVsZXRpbmdcIjpcblx0XHRcdFx0dGhpcy51aS5zdGF0dXNNZXNzYWdlRGVsZXRpbmcucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhpcy51aS5zdGF0dXNNZXNzYWdlV29ya2luZy5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblxuXHRcdC8vIFNob3cgdGhlIHNwaW5uZXJcblx0XHR0aGlzLnVpLnNwaW5uZXIucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0Ly8gSGlkZSB0aGUgZm9ybSBjb250YWluZXIgYW5kIHNob3cgdGhlIHN0YXR1cyBjb250YWluZXJcblx0XHQvL3RoaXMudWkuZm9ybUNvbnRhaW5lci5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5zdGF0dXNDb250YWluZXIuY3NzKHsgb3BhY2l0eTogMSwgXCJwb2ludGVyLWV2ZW50c1wiOiBcImFsbFwiIH0pOy8vcmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdHNldFN0YXR1c0ZhaWw6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkuc3RhdHVzQ29udGFpbmVyLmNzcyh7IG9wYWNpdHk6IDAsIFwicG9pbnRlci1ldmVudHNcIjogXCJub25lXCIgfSk7Ly9hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5tb2RhbEJvZHkuY3NzKHsgXCJvdmVyZmxvdy15XCI6IFwiXCIgfSk7XG5cblx0XHQvL3RoaXMudWkuZm9ybUNvbnRhaW5lci5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5lcnJvckNvbnRhaW5lci5jc3MoeyBvcGFjaXR5OiAxLCBcInBvaW50ZXItZXZlbnRzXCI6IFwiYWxsXCIgfSk7Ly8ucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdHNob3dFcnJvcjogZnVuY3Rpb24oZXJyb3IpIHtcblx0XHR0aGlzLkVycm9yVmlldyA9IG5ldyBFcnJvclZpZXcoe1xuXHRcdFx0Y2xvc2VCdXR0b246IHRydWUsXG5cdFx0XHRtb2RlbDogZXJyb3IsXG5cdFx0fSk7XG5cblx0XHR0aGlzLkVycm9yVmlldy5vbmNlKFwiZXJyb3I6Y2xvc2VcIiwgKCkgPT4ge1xuXHRcdFx0dGhpcy5zZXRVSVZpc2libGUoKTtcblx0XHRcdHRoaXMuc2V0U3RhdHVzUmVhZHkoKTtcblxuXHRcdFx0dGhpcy5FcnJvclZpZXcuZGVzdHJveSgpO1xuXHRcdFx0dGhpcy5FcnJvclZpZXcgPSBudWxsO1xuXHRcdH0pO1xuXG5cdFx0TlByb2dyZXNzLmRvbmUoKTtcblx0XHR0aGlzLnVpLmVycm9yQ29udGFpbmVyLmFwcGVuZCh0aGlzLkVycm9yVmlldy5yZW5kZXIoKS4kZWwpO1xuXG5cdFx0dGhpcy5zZXRVSUhpZGRlbigpO1xuXHRcdHRoaXMuc2V0U3RhdHVzRmFpbCgpO1xuXG5cdFx0aWYgKCFzZXR0aW5ncy5kZWJ1ZyB8fCBzZXR0aW5ncy5yZXBvcnRFcnJvcnMpXG5cdFx0XHRyYXlndW4oXCJzZW5kXCIsIGVycm9yLnJlc3BvbnNlKTtcblx0fSxcblxuXHR2YWxpZGF0aW9uRmFpbDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLmVycm9yTWFwKVxuXHRcdFx0dGhpcy5lcnJvck1hcCA9IHt9O1xuXG5cdFx0aWYgKHRoaXMuYmVmb3JlVmFsaWRhdGlvbkZhaWwpXG5cdFx0XHR0aGlzLmJlZm9yZVZhbGlkYXRpb25GYWlsKCk7XG5cblx0XHRfLmVhY2godGhpcy5tb2RlbC52YWxpZGF0aW9uRXJyb3IsIChpdGVtLCBrZXkpID0+IHtcblx0XHRcdGlmIChrZXkgaW4gdGhpcy5lcnJvck1hcCkge1xuXHRcdFx0XHRjb25zdCBhdHRyYWN0aW9uRWxlbWVudEtleSA9IHRoaXMuZXJyb3JNYXBba2V5XS5hdHRyYWN0aW9uRWxlbWVudCB8fCBrZXk7XG5cdFx0XHRcdGNvbnN0IGNoYW5nZUVsZW1lbnRLZXkgPSB0aGlzLmVycm9yTWFwW2tleV0uY2hhbmdlRWxlbWVudCB8fCBrZXk7XG5cblx0XHRcdFx0Y29uc3QgYXR0cmFjdGlvbkVsZW1lbnQgPSB0aGlzLnVpW2F0dHJhY3Rpb25FbGVtZW50S2V5XTtcblx0XHRcdFx0bGV0IGNoYW5nZUVsZW1lbnQgPSB0aGlzLnVpW2NoYW5nZUVsZW1lbnRLZXldO1xuXG5cdFx0XHRcdGlmIChjaGFuZ2VFbGVtZW50Lmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdC8vIExvb2sgdXAgdGhlIGVsZW1lbnQgZHluYW1pY2FsbHlcblx0XHRcdFx0XHRjaGFuZ2VFbGVtZW50ID0gJCh0aGlzLnVpW2NoYW5nZUVsZW1lbnRLZXldLnNlbGVjdG9yLCB0aGlzLiRlbCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLnNob3dWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKGF0dHJhY3Rpb25FbGVtZW50LCBjaGFuZ2VFbGVtZW50LCBpdGVtLCB0aGlzLmVycm9yTWFwW2tleV0ucG9zaXRpb24pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9LFxuXG5cdHNob3dWYWxpZGF0aW9uRXJyb3JNZXNzYWdlOiBmdW5jdGlvbihhdHRyYWN0aW9uRWxlbWVudCwgY2hhbmdlRWxlbWVudCwgbWVzc2FnZSwgcG9zaXRpb24pIHtcblx0XHRpZiAoYXR0cmFjdGlvbkVsZW1lbnQuaXMoXCI6dmlzaWJsZVwiKSkge1xuXHRcdFx0aWYgKF8uZmluZCh0aGlzLlRvb2x0aXBFbGVtZW50cywgXy5tYXRjaGVzUHJvcGVydHkoXCJhdHRyYWN0aW9uRWxlbWVudFwiLCBhdHRyYWN0aW9uRWxlbWVudCkpID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGlwcHkoYXR0cmFjdGlvbkVsZW1lbnQuZ2V0KDApLCB7XG5cdFx0XHRcdFx0dGhlbWU6IFwicmVkXCIsXG5cdFx0XHRcdFx0cGxhY2VtZW50OiBwb3NpdGlvbixcblx0XHRcdFx0XHRhcnJvdzogdHJ1ZSxcblx0XHRcdFx0XHRjb250ZW50OiBcIjxzcGFuPlwiICsgbWVzc2FnZS5yZXBsYWNlKC9bXFwmXFw8XFw+XFwnXFxcIl0vZywgeCA9PiBcIiYjXCIgKyB4LmNoYXJDb2RlQXQoMCkgKyBcIjtcIikgKyBcIjwvc3Bhbj5cIixcblx0XHRcdFx0XHR0cmlnZ2VyOiBcIm1hbnVhbFwiLFxuXHRcdFx0XHRcdGRlbGF5OiAwLFxuXHRcdFx0XHRcdGludGVyYWN0aXZlOiBmYWxzZSxcblx0XHRcdFx0XHRtdWx0aXBsZTogZmFsc2UsXG5cdFx0XHRcdFx0aGlkZU9uQ2xpY2s6IGZhbHNlLFxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR0aGlzLlRvb2x0aXBFbGVtZW50cy5wdXNoKHtcblx0XHRcdFx0XHRhdHRyYWN0aW9uRWxlbWVudDogYXR0cmFjdGlvbkVsZW1lbnQuZ2V0KDApLl90aXBweSxcblx0XHRcdFx0XHRjaGFuZ2VFbGVtZW50OiBjaGFuZ2VFbGVtZW50LFxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRjaGFuZ2VFbGVtZW50Lm9uZShcImNoYW5nZVwiLCB0aGlzLm9uQ2hhbmdlRWxlbWVudENoYW5nZS5iaW5kKHRoaXMpKTtcblxuXHRcdFx0XHRhdHRyYWN0aW9uRWxlbWVudC5nZXQoMCkuX3RpcHB5LnNob3coKTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRhdHRyYWN0aW9uRWxlbWVudC5fdGlwcHkuc2V0Q29udGVudChtZXNzYWdlKS5zaG93KFwic2hvd1wiKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0aGlkZVZhbGlkYXRpb25FcnJvck1lc3NhZ2U6IGZ1bmN0aW9uKGNoYW5nZUVsZW1lbnQpIHtcblx0XHRfLmVhY2godGhpcy5Ub29sdGlwRWxlbWVudHMsIHBhaXIgPT4ge1xuXHRcdFx0aWYgKHBhaXIuY2hhbmdlRWxlbWVudC5nZXQoMCkgPT09IGNoYW5nZUVsZW1lbnQuZ2V0KDApKVxuXHRcdFx0XHRwYWlyLmF0dHJhY3Rpb25FbGVtZW50LmhpZGUoKTtcblx0XHR9KTtcblx0fSxcblxuXHRvbkNoYW5nZUVsZW1lbnRDaGFuZ2U6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0Xy5lYWNoKHRoaXMuVG9vbHRpcEVsZW1lbnRzLCBwYWlyID0+IHtcblx0XHRcdGlmIChwYWlyLmNoYW5nZUVsZW1lbnQuZ2V0KDApID09PSBldmVudC50YXJnZXQpXG5cdFx0XHRcdHBhaXIuYXR0cmFjdGlvbkVsZW1lbnQuaGlkZSgpO1xuXHRcdH0pO1xuXHR9LFxuXG5cdGRlc3Ryb3lWYWxpZGF0aW9uRXJyb3JzOiBmdW5jdGlvbigpIHtcblx0XHRfLmVhY2godGhpcy5Ub29sdGlwRWxlbWVudHMsIHRvb2x0aXAgPT4ge1xuXHRcdFx0dG9vbHRpcC5jaGFuZ2VFbGVtZW50Lm9mZihcImNoYW5nZVwiLCB0aGlzLm9uQ2hhbmdlRWxlbWVudENoYW5nZSk7XG5cdFx0XHR0b29sdGlwLmF0dHJhY3Rpb25FbGVtZW50LmhpZGUoKTtcblx0XHR9KTtcblxuXHRcdHRoaXMuVG9vbHRpcEVsZW1lbnRzID0gW107XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n// ----------------------------------------------------------------------------\n// Dependencies\n// ----------------------------------------------------------------------------\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\n\nvar App = require(\"../index\");\nvar settings = require(\"app-settings\");\nvar radio = Backbone.Radio.channel(\"global\");\n// For IE11\n// eslint-disable-next-line no-unused-vars\nvar Promise = require(\"bluebird\");\n\nvar BooksView = require(\"./booksView\");\nvar ServerFilterManager = require(\"./serverFilterManager\");\nvar moment = require(\"moment\");\n\n// ----------------------------------------------------------------------------\n// Models\n// ----------------------------------------------------------------------------\n\nvar Book = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"_id\"\n});\n\nvar getPageSize = function getPageSize() {\n\t// Get the dimensions of the viewport\n\tvar width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;\n\n\tif (width <= 1447) return 10;else if (width <= 1677) return 12;else if (width <= 1907) return 14;else if (width <= 2367) return 16;else if (width <= 2597) return 20;\n\n\treturn 22;\n};\n\nvar Books = Backbone.PageableCollection.extend({\n\tmodel: Book,\n\n\turl: function url() {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\t\treturn settings.urlRoot + \"/api/1.0/users/\" + user.username + \"/books?paged=true\";\n\t},\n\n\tstate: {\n\t\tpageSize: getPageSize()\n\t},\n\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\ttotalPages: null,\n\t\ttotalRecords: null,\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\n// ----------------------------------------------------------------------------\n// Views\n// ----------------------------------------------------------------------------\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"book-chooser\",\n\tregions: {\n\t\tsearchResults: \"#searchResults\"\n\t},\n\ttemplate: require(\"./templates/bookChooser.nunj\").bookChooser,\n\n\tui: {\n\t\tgrid: \"div.grid\",\n\n\t\tfilters: \".ops-bar .filters\",\n\t\tsearchBox: \"input\",\n\t\tsearchOverlay: \"div.input-overlay\",\n\n\t\tpaging: \".pagination\",\n\t\tcounter: \".counter\",\n\t\tpage: \".page\",\n\t\toverlay: \".overlay\",\n\t\tsearchResults: \"#searchResults\"\n\t},\n\n\tevents: {\n\t\t// Paging events\n\t\t\"click .next\": \"next\",\n\t\t\"click .prev\": \"prev\",\n\t\t\"click .first\": \"first\",\n\t\t\"click .last\": \"last\",\n\t\t\"click @ui.page\": \"jumpToPage\"\n\t},\n\n\tcollectionEvents: {\n\t\trequest: \"fetchStart\",\n\t\t\"sync error\": \"fetchEnd\"\n\t},\n\n\tchildViewEvents: {\n\t\t\"child:select:book\": \"selectBook\"\n\t},\n\tinitialize: function initialize() {\n\t\tthis.collection = new Books();\n\t\tthis.bindEvents(this.collection, this.collectionEvents);\n\t},\n\n\tfetchStart: function fetchStart() {\n\t\t$(\"div.no-results\", this.ui.searchResults).remove();\n\t\tthis.ui.overlay.addClass(\"shown\").html(\"<span class='spinner'><span class='spinner-icon spinner-red'/>&nbsp;&nbsp;Fetching...</span>\");\n\t\t$(\".filling-empty-space-childs\").remove();\n\t},\n\n\tfetchEnd: function fetchEnd(model, err) {\n\t\tif (err && err.status) {\n\t\t\tvar errMsg = App.parseResponse(err);\n\t\t\tradio.trigger(App.Events.Commands.Toast, { content: errMsg.detail || errMsg.info, icon: \"fa-exclamation-triangle\", iconColour: \"#ec5840\" });\n\t\t}\n\n\t\t$(\"div.no-results\", this.ui.searchResults).remove();\n\t\tthis.ui.overlay.empty().removeClass(\"shown\");\n\t\tthis.updateCounter();\n\n\t\tif (this.collection.length === 0) {\n\t\t\tthis.ui.searchResults.append(\"<div class='no-results'><div>No results found <span class='fal fa-frown'/></div>\\n\\t\\t\\t\\t<div class='subtext'>If you have any filters selected, try changing them, or unchoosing them</div></div>\");\n\t\t} else {\n\t\t\twindow.scrollTo(0, 0);\n\t\t}\n\t},\n\n\tonRender: function onRender() {\n\t\tvar booksView = new BooksView({ collection: this.collection });\n\t\tthis.getRegion(\"searchResults\").show(booksView);\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar languageFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"languageFilter\",\n\t\t\tlabel: \"Language\",\n\t\t\tcategories: [{ items: settings.languageList }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar subjectFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"subjectFilter\",\n\t\t\tlabel: \"Subject\",\n\t\t\tserver: {\n\t\t\t\tkey: \"subject_id\",\n\t\t\t\tvalue: \"subject\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/subjects\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\n\t\tvar gradeFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"gradeFilter\",\n\t\t\tlabel: \"Year of Study\",\n\t\t\tserver: true,\n\t\t\tcategories: _.map(settings.gradeList, function (val, key) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: key,\n\t\t\t\t\titems: _.reduce(val.sort(function (a, b) {\n\t\t\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t\t\t}), function (sum, num) {\n\t\t\t\t\t\tsum.push({ name: num.value, label: num.name });return sum;\n\t\t\t\t\t}, [])\n\t\t\t\t};\n\t\t\t})\n\t\t};\n\n\t\tvar yearFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"yearFilter\",\n\t\t\tlabel: \"Chosen Year\",\n\t\t\tcategories: [{ items: _.range(2014, moment().year() + 2) }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar formatFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"formatFilter\",\n\t\t\tlabel: \"Format\",\n\t\t\tcategories: [{ items: { mpdf: \"PDF\", mpub: \"EPUB\" } }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar pubFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"pubFilter\",\n\t\t\tlabel: \"Publisher\",\n\t\t\tserver: {\n\t\t\t\tkey: \"publisher_id\",\n\t\t\t\tvalue: \"fullname\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/publishers?dummy=false\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\n\t\tvar hideOldBooks = {\n\t\t\ttype: \"toggle\",\n\t\t\tname: \"hideOldBooks\",\n\t\t\tlabel: \" Hide old books\",\n\t\t\tcategories: [{}],\n\t\t\tinitialValue: function initialValue() {\n\t\t\t\treturn [true];\n\t\t\t},\n\t\t\tserver: true\n\t\t};\n\n\t\tthis.filter = new ServerFilterManager({\n\t\t\traw: this.collection,\n\t\t\tfilterContainer: this.ui.filters,\n\t\t\tfilters: [textFilter, languageFilter, subjectFilter, gradeFilter, yearFilter, formatFilter, pubFilter, hideOldBooks],\n\t\t\tdefaultFilters: [\"textFilter\", \"hideOldBooks\"]\n\t\t});\n\n\t\tthis.ui.filters.prepend(this.filter.render().el);\n\n\t\tif (this.getQueryStringParam(\"page\") === null) {\n\t\t\tthis.collection.getFirstPage({ reset: true });\n\t\t} else {\n\t\t\tvar page = parseInt(this.getQueryStringParam(\"page\"), 10);\n\t\t\tthis.collection.getPage(page, { reset: true });\n\t\t}\n\t},\n\n\tgetQueryStringParam: function getQueryStringParam(name) {\n\t\tvar url = window.location.href;\n\t\tvar parsedName = name.replace(/[\\[\\]]/g, \"\\\\$&\");\n\t\tvar regex = new RegExp(\"[?&]\" + parsedName + \"(=([^&#]*)|&|#|$)\"),\n\t\t    results = regex.exec(url);\n\t\tif (!results) return null;\n\t\tif (!results[2]) return \"\";\n\t\treturn decodeURIComponent(results[2].replace(/\\+/g, \" \"));\n\t},\n\n\tselectBook: function selectBook(model) {\n\t\tthis.trigger(\"selected\", model.get(\"_id\"));\n\t},\n\n\n\tjumpToPage: function jumpToPage(evt) {\n\t\tvar el = $(evt.currentTarget);\n\t\tvar page = parseInt(el.text(), 10);\n\n\t\tthis.collection.getPage(page);\n\t},\n\n\tfirst: function first() {\n\t\tthis.collection.getFirstPage({ reset: true });\n\t},\n\n\tprev: function prev() {\n\t\tif (this.collection.hasPreviousPage()) this.collection.getPreviousPage();\n\t},\n\n\tnext: function next() {\n\t\tif (this.collection.hasNextPage()) this.collection.getNextPage();\n\t},\n\n\tlast: function last() {\n\t\tthis.collection.getPage(this.collection.state.totalPages);\n\t},\n\n\tupdateCounter: function updateCounter() {\n\t\tvar pageStart = (this.collection.state.currentPage - 1) * this.collection.state.pageSize + 1;\n\t\tvar pageEnd = this.collection.state.currentPage * this.collection.state.pageSize;\n\t\tif (pageEnd > this.collection.state.totalRecords) pageEnd = this.collection.state.totalRecords;\n\t\tvar prevDisable = true,\n\t\t    nextDisable = true;\n\n\t\tif (this.collection.state.totalPages > 1) {\n\t\t\tif (this.collection.state.currentPage > 1) prevDisable = false;\n\t\t\tif (this.collection.state.currentPage < this.collection.state.totalPages) nextDisable = false;\n\t\t}\n\n\t\tif (this.collection.state.totalRecords > 0) {\n\t\t\tvar text = \" <div class='first jumper \" + (prevDisable ? \" disabled\" : \"\") + \"' title='First page'><span class='fal fa-angle-double-left'/></div> <div class='prev jumper \" + (prevDisable ? \" disabled\" : \"\") + \"' title='Previous page'><span class='fal fa-angle-left'/></div>\";\n\n\t\t\t// Show up to 10 page numbers\n\t\t\tvar collection = this.collection;\n\t\t\tvar state = collection.state;\n\t\t\tvar windowSize = 10;\n\t\t\tvar slideScale = 0.5;\n\n\t\t\tvar slideThisMuch = function slideThisMuch(firstPage, lastPage, currentPage, _windowSize, _slideScale) {\n\t\t\t\treturn ~~(_windowSize * _slideScale);\n\t\t\t};\n\n\t\t\tvar slideMaybe = function slideMaybe(firstPage, lastPage, currentPage, _windowSize) {\n\t\t\t\treturn Math.round(currentPage % _windowSize / _windowSize);\n\t\t\t};\n\n\t\t\tvar firstPage = state.firstPage;\n\t\t\tvar lastPage = Number(state.lastPage);\n\t\t\tlastPage = Math.max(0, firstPage ? lastPage - 1 : lastPage);\n\t\t\tvar currentPage = Math.max(state.currentPage, state.firstPage);\n\t\t\tcurrentPage = firstPage ? currentPage - 1 : currentPage;\n\n\t\t\tvar windowStart = Math.floor(currentPage / windowSize) * windowSize;\n\t\t\tif (currentPage <= lastPage - slideThisMuch()) {\n\t\t\t\twindowStart += slideMaybe(firstPage, lastPage, currentPage, windowSize, slideScale) * slideThisMuch(firstPage, lastPage, currentPage, windowSize, slideScale);\n\t\t\t}\n\t\t\tvar windowEnd = Math.min(lastPage + 1, windowStart + windowSize);\n\n\t\t\tfor (var i = windowStart; i < windowEnd; i++) {\n\t\t\t\ttext += \"<span class='page \" + (i + 1 === state.currentPage ? \"active\" : \"\") + \"'>\" + (i + 1) + \"</span>\";\n\t\t\t}text += \"<div class='next jumper \" + (nextDisable ? \" disabled\" : \"\") + \"' title='Next page'><span class='fal fa-angle-right'/></div> <div class='last jumper \" + (nextDisable ? \" disabled\" : \"\") + \"' title='Last page'><span class='fal fa-angle-double-right'/></div>\";\n\n\t\t\tvar counterText = \"<span class='counterInfo'>Books \" + pageStart + \" - \" + pageEnd + \" of \" + state.totalRecords.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \" \") + \"</span>\";\n\n\t\t\tthis.ui.paging.html(text);\n\t\t\tthis.ui.counter.html(counterText);\n\n\t\t\tradio.trigger(App.Events.Commands.Navigate, settings.urlRoot + \"/console/books?page=\" + (currentPage + 1), { trigger: false, replace: true });\n\t\t} else {\n\t\t\tthis.ui.paging.empty();\n\t\t\tthis.ui.counter.empty();\n\t\t}\n\n\t\tif (this.getQueryStringParam(\"textFilter\")) {\n\t\t\tvar searchText = _.replace(this.getQueryStringParam(\"textFilter\"), /\\|/g, \" \");\n\t\t\t$(\".search-input\").val(searchText);\n\t\t}\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJvb2tDaG9vc2VyLmpzIl0sIm5hbWVzIjpbIiQiLCJyZXF1aXJlIiwiXyIsIkJhY2tib25lIiwiQXBwIiwic2V0dGluZ3MiLCJyYWRpbyIsIlJhZGlvIiwiY2hhbm5lbCIsIlByb21pc2UiLCJCb29rc1ZpZXciLCJTZXJ2ZXJGaWx0ZXJNYW5hZ2VyIiwibW9tZW50IiwiQm9vayIsIkVwb3h5IiwiTW9kZWwiLCJleHRlbmQiLCJpZEF0dHJpYnV0ZSIsImdldFBhZ2VTaXplIiwid2lkdGgiLCJ3aW5kb3ciLCJpbm5lcldpZHRoIiwiZG9jdW1lbnQiLCJkb2N1bWVudEVsZW1lbnQiLCJjbGllbnRXaWR0aCIsImJvZHkiLCJCb29rcyIsIlBhZ2VhYmxlQ29sbGVjdGlvbiIsIm1vZGVsIiwidXJsIiwidXNlciIsInJlcXVlc3QiLCJFdmVudHMiLCJSZXF1ZXN0cyIsIkN1cnJlbnRVc2VyIiwidXJsUm9vdCIsInVzZXJuYW1lIiwic3RhdGUiLCJwYWdlU2l6ZSIsIm1vZGUiLCJxdWVyeVBhcmFtcyIsInRvdGFsUGFnZXMiLCJ0b3RhbFJlY29yZHMiLCJzb3J0S2V5IiwicGFyc2VTdGF0ZSIsInJlc3AiLCJ0b3RhbCIsInBhcnNlUmVjb3JkcyIsInJvd3MiLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJ0YWdOYW1lIiwiY2xhc3NOYW1lIiwicmVnaW9ucyIsInNlYXJjaFJlc3VsdHMiLCJ0ZW1wbGF0ZSIsImJvb2tDaG9vc2VyIiwidWkiLCJncmlkIiwiZmlsdGVycyIsInNlYXJjaEJveCIsInNlYXJjaE92ZXJsYXkiLCJwYWdpbmciLCJjb3VudGVyIiwicGFnZSIsIm92ZXJsYXkiLCJldmVudHMiLCJjb2xsZWN0aW9uRXZlbnRzIiwiY2hpbGRWaWV3RXZlbnRzIiwiaW5pdGlhbGl6ZSIsImNvbGxlY3Rpb24iLCJiaW5kRXZlbnRzIiwiZmV0Y2hTdGFydCIsInJlbW92ZSIsImFkZENsYXNzIiwiaHRtbCIsImZldGNoRW5kIiwiZXJyIiwic3RhdHVzIiwiZXJyTXNnIiwicGFyc2VSZXNwb25zZSIsInRyaWdnZXIiLCJDb21tYW5kcyIsIlRvYXN0IiwiY29udGVudCIsImRldGFpbCIsImluZm8iLCJpY29uIiwiaWNvbkNvbG91ciIsImVtcHR5IiwicmVtb3ZlQ2xhc3MiLCJ1cGRhdGVDb3VudGVyIiwibGVuZ3RoIiwiYXBwZW5kIiwic2Nyb2xsVG8iLCJvblJlbmRlciIsImJvb2tzVmlldyIsImdldFJlZ2lvbiIsInNob3ciLCJ0ZXh0RmlsdGVyIiwidHlwZSIsIm5hbWUiLCJsYWJlbCIsImRlYm91bmNlIiwic2VydmVyIiwibGFuZ3VhZ2VGaWx0ZXIiLCJjYXRlZ29yaWVzIiwiaXRlbXMiLCJsYW5ndWFnZUxpc3QiLCJzdWJqZWN0RmlsdGVyIiwia2V5IiwidmFsdWUiLCJmZXRjaCIsImluZmluaXRlIiwiZ3JhZGVGaWx0ZXIiLCJtYXAiLCJncmFkZUxpc3QiLCJ2YWwiLCJyZWR1Y2UiLCJzb3J0IiwiYSIsImIiLCJsZXhpY2FsIiwidG9VcHBlckNhc2UiLCJsb2NhbGVDb21wYXJlIiwic3VtIiwibnVtIiwicHVzaCIsInllYXJGaWx0ZXIiLCJyYW5nZSIsInllYXIiLCJmb3JtYXRGaWx0ZXIiLCJtcGRmIiwibXB1YiIsInB1YkZpbHRlciIsImhpZGVPbGRCb29rcyIsImluaXRpYWxWYWx1ZSIsImZpbHRlciIsInJhdyIsImZpbHRlckNvbnRhaW5lciIsImRlZmF1bHRGaWx0ZXJzIiwicHJlcGVuZCIsInJlbmRlciIsImVsIiwiZ2V0UXVlcnlTdHJpbmdQYXJhbSIsImdldEZpcnN0UGFnZSIsInJlc2V0IiwicGFyc2VJbnQiLCJnZXRQYWdlIiwibG9jYXRpb24iLCJocmVmIiwicGFyc2VkTmFtZSIsInJlcGxhY2UiLCJyZWdleCIsIlJlZ0V4cCIsInJlc3VsdHMiLCJleGVjIiwiZGVjb2RlVVJJQ29tcG9uZW50Iiwic2VsZWN0Qm9vayIsImdldCIsImp1bXBUb1BhZ2UiLCJldnQiLCJjdXJyZW50VGFyZ2V0IiwidGV4dCIsImZpcnN0IiwicHJldiIsImhhc1ByZXZpb3VzUGFnZSIsImdldFByZXZpb3VzUGFnZSIsIm5leHQiLCJoYXNOZXh0UGFnZSIsImdldE5leHRQYWdlIiwibGFzdCIsInBhZ2VTdGFydCIsImN1cnJlbnRQYWdlIiwicGFnZUVuZCIsInByZXZEaXNhYmxlIiwibmV4dERpc2FibGUiLCJ3aW5kb3dTaXplIiwic2xpZGVTY2FsZSIsInNsaWRlVGhpc011Y2giLCJmaXJzdFBhZ2UiLCJsYXN0UGFnZSIsIl93aW5kb3dTaXplIiwiX3NsaWRlU2NhbGUiLCJzbGlkZU1heWJlIiwiTWF0aCIsInJvdW5kIiwiTnVtYmVyIiwibWF4Iiwid2luZG93U3RhcnQiLCJmbG9vciIsIndpbmRvd0VuZCIsIm1pbiIsImkiLCJjb3VudGVyVGV4dCIsInRvU3RyaW5nIiwiTmF2aWdhdGUiLCJzZWFyY2hUZXh0Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLElBQUlELFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUUsV0FBV0YsUUFBUSxVQUFSLENBQWpCOztBQUVBLElBQU1HLE1BQU1ILFFBQVEsVUFBUixDQUFaO0FBQ0EsSUFBTUksV0FBV0osUUFBUSxjQUFSLENBQWpCO0FBQ0EsSUFBTUssUUFBUUgsU0FBU0ksS0FBVCxDQUFlQyxPQUFmLENBQXVCLFFBQXZCLENBQWQ7QUFDQTtBQUNBO0FBQ0EsSUFBTUMsVUFBVVIsUUFBUSxVQUFSLENBQWhCOztBQUVBLElBQU1TLFlBQVlULFFBQVEsYUFBUixDQUFsQjtBQUNBLElBQU1VLHNCQUFzQlYsUUFBUSx1QkFBUixDQUE1QjtBQUNBLElBQU1XLFNBQVNYLFFBQVEsUUFBUixDQUFmOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxJQUFNWSxPQUFPVixTQUFTVyxLQUFULENBQWVDLEtBQWYsQ0FBcUJDLE1BQXJCLENBQTRCO0FBQ3hDQyxjQUFhO0FBRDJCLENBQTVCLENBQWI7O0FBSUEsSUFBTUMsY0FBYyxTQUFk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QixDQUF1QmdGLFVBQXZCO0FBQ0E7QUFDRDtBQWpTK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoiYm9va0Nob29zZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERlcGVuZGVuY2llc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuXG5jb25zdCBBcHAgPSByZXF1aXJlKFwiLi4vaW5kZXhcIik7XG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5jb25zdCByYWRpbyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJnbG9iYWxcIik7XG4vLyBGb3IgSUUxMVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5jb25zdCBQcm9taXNlID0gcmVxdWlyZShcImJsdWViaXJkXCIpO1xuXG5jb25zdCBCb29rc1ZpZXcgPSByZXF1aXJlKFwiLi9ib29rc1ZpZXdcIik7XG5jb25zdCBTZXJ2ZXJGaWx0ZXJNYW5hZ2VyID0gcmVxdWlyZShcIi4vc2VydmVyRmlsdGVyTWFuYWdlclwiKTtcbmNvbnN0IG1vbWVudCA9IHJlcXVpcmUoXCJtb21lbnRcIik7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE1vZGVsc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBCb29rID0gQmFja2JvbmUuRXBveHkuTW9kZWwuZXh0ZW5kKHtcblx0aWRBdHRyaWJ1dGU6IFwiX2lkXCIsXG59KTtcblxuY29uc3QgZ2V0UGFnZVNpemUgPSBmdW5jdGlvbigpIHtcblx0Ly8gR2V0IHRoZSBkaW1lbnNpb25zIG9mIHRoZSB2aWV3cG9ydFxuXHRjb25zdCB3aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCB8fCBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoO1xuXG5cdGlmICh3aWR0aCA8PSAxNDQ3KVxuXHRcdHJldHVybiAxMDtcblx0ZWxzZSBpZiAod2lkdGggPD0gMTY3Nylcblx0XHRyZXR1cm4gMTI7XG5cdGVsc2UgaWYgKHdpZHRoIDw9IDE5MDcpXG5cdFx0cmV0dXJuIDE0O1xuXHRlbHNlIGlmICh3aWR0aCA8PSAyMzY3KVxuXHRcdHJldHVybiAxNjtcblx0ZWxzZSBpZiAod2lkdGggPD0gMjU5Nylcblx0XHRyZXR1cm4gMjA7XG5cblx0cmV0dXJuIDIyO1xufTtcblxuY29uc3QgQm9va3MgPSBCYWNrYm9uZS5QYWdlYWJsZUNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IEJvb2ssXG5cblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCB1c2VyID0gcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvdXNlcnMvXCIgKyB1c2VyLnVzZXJuYW1lICsgXCIvYm9va3M/cGFnZWQ9dHJ1ZVwiO1xuXHR9LFxuXG5cdHN0YXRlOiB7XG5cdFx0cGFnZVNpemU6IGdldFBhZ2VTaXplKCksXG5cdH0sXG5cblx0bW9kZTogXCJzZXJ2ZXJcIixcblxuXHRxdWVyeVBhcmFtczoge1xuXHRcdHBhZ2VTaXplOiBcInBhZ2VTaXplXCIsXG5cdFx0dG90YWxQYWdlczogbnVsbCxcblx0XHR0b3RhbFJlY29yZHM6IG51bGwsXG5cdFx0c29ydEtleTogXCJzb3J0QnlcIixcblx0fSxcblxuXHRwYXJzZVN0YXRlOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0cmV0dXJuIHsgdG90YWxSZWNvcmRzOiByZXNwLnRvdGFsIH07XG5cdH0sXG5cblx0cGFyc2VSZWNvcmRzOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0cmV0dXJuIHJlc3Aucm93cztcblx0fSxcbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBWaWV3c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogXCJkaXZcIixcblx0Y2xhc3NOYW1lOiBcImJvb2stY2hvb3NlclwiLFxuXHRyZWdpb25zOiB7XG5cdFx0c2VhcmNoUmVzdWx0czogXCIjc2VhcmNoUmVzdWx0c1wiLFxuXHR9LFxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4vdGVtcGxhdGVzL2Jvb2tDaG9vc2VyLm51bmpcIikuYm9va0Nob29zZXIsXG5cblx0dWk6IHtcblx0XHRncmlkOiBcImRpdi5ncmlkXCIsXG5cblx0XHRmaWx0ZXJzOiBcIi5vcHMtYmFyIC5maWx0ZXJzXCIsXG5cdFx0c2VhcmNoQm94OiBcImlucHV0XCIsXG5cdFx0c2VhcmNoT3ZlcmxheTogXCJkaXYuaW5wdXQtb3ZlcmxheVwiLFxuXG5cdFx0cGFnaW5nOiBcIi5wYWdpbmF0aW9uXCIsXG5cdFx0Y291bnRlcjogXCIuY291bnRlclwiLFxuXHRcdHBhZ2U6IFwiLnBhZ2VcIixcblx0XHRvdmVybGF5OiBcIi5vdmVybGF5XCIsXG5cdFx0c2VhcmNoUmVzdWx0czogXCIjc2VhcmNoUmVzdWx0c1wiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdC8vIFBhZ2luZyBldmVudHNcblx0XHRcImNsaWNrIC5uZXh0XCI6IFwibmV4dFwiLFxuXHRcdFwiY2xpY2sgLnByZXZcIjogXCJwcmV2XCIsXG5cdFx0XCJjbGljayAuZmlyc3RcIjogXCJmaXJzdFwiLFxuXHRcdFwiY2xpY2sgLmxhc3RcIjogXCJsYXN0XCIsXG5cdFx0XCJjbGljayBAdWkucGFnZVwiOiBcImp1bXBUb1BhZ2VcIixcblx0fSxcblxuXHRjb2xsZWN0aW9uRXZlbnRzOiB7XG5cdFx0cmVxdWVzdDogXCJmZXRjaFN0YXJ0XCIsXG5cdFx0XCJzeW5jIGVycm9yXCI6IFwiZmV0Y2hFbmRcIixcblx0fSxcblxuXHRjaGlsZFZpZXdFdmVudHM6IHtcblx0XHRcImNoaWxkOnNlbGVjdDpib29rXCI6IFwic2VsZWN0Qm9va1wiLFxuXHR9LFxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmNvbGxlY3Rpb24gPSBuZXcgQm9va3MoKTtcblx0XHR0aGlzLmJpbmRFdmVudHModGhpcy5jb2xsZWN0aW9uLCB0aGlzLmNvbGxlY3Rpb25FdmVudHMpO1xuXHR9LFxuXG5cdGZldGNoU3RhcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdCQoXCJkaXYubm8tcmVzdWx0c1wiLCB0aGlzLnVpLnNlYXJjaFJlc3VsdHMpLnJlbW92ZSgpO1xuXHRcdHRoaXMudWkub3ZlcmxheS5hZGRDbGFzcyhcInNob3duXCIpLmh0bWwoXCI8c3BhbiBjbGFzcz0nc3Bpbm5lcic+PHNwYW4gY2xhc3M9J3NwaW5uZXItaWNvbiBzcGlubmVyLXJlZCcvPiZuYnNwOyZuYnNwO0ZldGNoaW5nLi4uPC9zcGFuPlwiKTtcblx0XHQkKFwiLmZpbGxpbmctZW1wdHktc3BhY2UtY2hpbGRzXCIpLnJlbW92ZSgpO1xuXHR9LFxuXG5cdGZldGNoRW5kOiBmdW5jdGlvbihtb2RlbCwgZXJyKSB7XG5cdFx0aWYgKGVyciAmJiBlcnIuc3RhdHVzKSB7XG5cdFx0XHRjb25zdCBlcnJNc2cgPSBBcHAucGFyc2VSZXNwb25zZShlcnIpO1xuXHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7IGNvbnRlbnQ6IChlcnJNc2cuZGV0YWlsIHx8IGVyck1zZy5pbmZvKSwgaWNvbjogXCJmYS1leGNsYW1hdGlvbi10cmlhbmdsZVwiLCBpY29uQ29sb3VyOiBcIiNlYzU4NDBcIiB9KTtcblx0XHR9XG5cblx0XHQkKFwiZGl2Lm5vLXJlc3VsdHNcIiwgdGhpcy51aS5zZWFyY2hSZXN1bHRzKS5yZW1vdmUoKTtcblx0XHR0aGlzLnVpLm92ZXJsYXkuZW1wdHkoKS5yZW1vdmVDbGFzcyhcInNob3duXCIpO1xuXHRcdHRoaXMudXBkYXRlQ291bnRlcigpO1xuXG5cdFx0aWYgKHRoaXMuY29sbGVjdGlvbi5sZW5ndGggPT09IDApIHtcblx0XHRcdHRoaXMudWkuc2VhcmNoUmVzdWx0cy5hcHBlbmQoYDxkaXYgY2xhc3M9J25vLXJlc3VsdHMnPjxkaXY+Tm8gcmVzdWx0cyBmb3VuZCA8c3BhbiBjbGFzcz0nZmFsIGZhLWZyb3duJy8+PC9kaXY+XG5cdFx0XHRcdDxkaXYgY2xhc3M9J3N1YnRleHQnPklmIHlvdSBoYXZlIGFueSBmaWx0ZXJzIHNlbGVjdGVkLCB0cnkgY2hhbmdpbmcgdGhlbSwgb3IgdW5jaG9vc2luZyB0aGVtPC9kaXY+PC9kaXY+YCk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0d2luZG93LnNjcm9sbFRvKDAsIDApO1xuXHRcdH1cblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgYm9va3NWaWV3ID0gbmV3IEJvb2tzVmlldyh7IGNvbGxlY3Rpb246IHRoaXMuY29sbGVjdGlvbiB9KTtcblx0XHR0aGlzLmdldFJlZ2lvbihcInNlYXJjaFJlc3VsdHNcIikuc2hvdyhib29rc1ZpZXcpO1xuXG5cdFx0Y29uc3QgdGV4dEZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwidGV4dFwiLFxuXHRcdFx0bmFtZTogXCJ0ZXh0RmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJUZXh0IFNlYXJjaFwiLFxuXHRcdFx0ZGVib3VuY2U6IDIwMCxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgbGFuZ3VhZ2VGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcImxhbmd1YWdlRmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJMYW5ndWFnZVwiLFxuXHRcdFx0Y2F0ZWdvcmllczogW1xuXHRcdFx0XHR7IGl0ZW1zOiBzZXR0aW5ncy5sYW5ndWFnZUxpc3QgfSxcblx0XHRcdF0sXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdGNvbnN0IHN1YmplY3RGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcInN1YmplY3RGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlN1YmplY3RcIixcblx0XHRcdHNlcnZlcjoge1xuXHRcdFx0XHRrZXk6IFwic3ViamVjdF9pZFwiLFxuXHRcdFx0XHR2YWx1ZTogXCJzdWJqZWN0XCIsXG5cdFx0XHRcdGZldGNoOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9kYXRhL3N1YmplY3RzXCIsXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdHBhZ2VTaXplOiAzMCxcblx0XHRcdFx0aW5maW5pdGU6IHRydWUsXG5cdFx0XHR9LFxuXHRcdH07XG5cblx0XHRjb25zdCBncmFkZUZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiaXRlbWl6ZWRcIixcblx0XHRcdG5hbWU6IFwiZ3JhZGVGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlllYXIgb2YgU3R1ZHlcIixcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHRcdGNhdGVnb3JpZXM6IF8ubWFwKHNldHRpbmdzLmdyYWRlTGlzdCwgKHZhbCwga2V5KSA9PiAoe1xuXHRcdFx0XHRsYWJlbDoga2V5LFxuXHRcdFx0XHRpdGVtczogXy5yZWR1Y2UodmFsLnNvcnQoKGEsIGIpID0+IChcImxleGljYWxcIiBpbiBhID8gYS5sZXhpY2FsIDogYS5uYW1lKS50b1VwcGVyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoKFwibGV4aWNhbFwiIGluIGIgPyBiLmxleGljYWwgOiBiLm5hbWUpLnRvVXBwZXJDYXNlKCkpKSxcblx0XHRcdFx0XHQoc3VtLCBudW0pID0+IHsgc3VtLnB1c2goeyBuYW1lOiBudW0udmFsdWUsIGxhYmVsOiBudW0ubmFtZSB9KTsgcmV0dXJuIHN1bTsgfSwgW10pLFxuXHRcdFx0fSkpLFxuXHRcdH07XG5cblx0XHRjb25zdCB5ZWFyRmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJ5ZWFyRmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJDaG9zZW4gWWVhclwiLFxuXHRcdFx0Y2F0ZWdvcmllczogW1xuXHRcdFx0XHR7IGl0ZW1zOiBfLnJhbmdlKDIwMTQsIG1vbWVudCgpLnllYXIoKSArIDIpIH0sXG5cdFx0XHRdLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdH07XG5cblx0XHRjb25zdCBmb3JtYXRGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcImZvcm1hdEZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiRm9ybWF0XCIsXG5cdFx0XHRjYXRlZ29yaWVzOiBbXG5cdFx0XHRcdHsgaXRlbXM6IHsgbXBkZjogXCJQREZcIiwgbXB1YjogXCJFUFVCXCIgfSB9LFxuXHRcdFx0XSxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgcHViRmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJwdWJGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlB1Ymxpc2hlclwiLFxuXHRcdFx0c2VydmVyOiB7XG5cdFx0XHRcdGtleTogXCJwdWJsaXNoZXJfaWRcIixcblx0XHRcdFx0dmFsdWU6IFwiZnVsbG5hbWVcIixcblx0XHRcdFx0ZmV0Y2g6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2RhdGEvcHVibGlzaGVycz9kdW1teT1mYWxzZVwiLFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRwYWdlU2l6ZTogMzAsXG5cdFx0XHRcdGluZmluaXRlOiB0cnVlLFxuXHRcdFx0fSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgaGlkZU9sZEJvb2tzID0ge1xuXHRcdFx0dHlwZTogXCJ0b2dnbGVcIixcblx0XHRcdG5hbWU6IFwiaGlkZU9sZEJvb2tzXCIsXG5cdFx0XHRsYWJlbDogXCIgSGlkZSBvbGQgYm9va3NcIixcblx0XHRcdGNhdGVnb3JpZXM6IFtcblx0XHRcdFx0e30sXG5cdFx0XHRdLFxuXHRcdFx0aW5pdGlhbFZhbHVlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIFt0cnVlXTtcblx0XHRcdH0sXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdHRoaXMuZmlsdGVyID0gbmV3IFNlcnZlckZpbHRlck1hbmFnZXIoe1xuXHRcdFx0cmF3OiB0aGlzLmNvbGxlY3Rpb24sXG5cdFx0XHRmaWx0ZXJDb250YWluZXI6IHRoaXMudWkuZmlsdGVycyxcblx0XHRcdGZpbHRlcnM6IFt0ZXh0RmlsdGVyLCBsYW5ndWFnZUZpbHRlciwgc3ViamVjdEZpbHRlciwgZ3JhZGVGaWx0ZXIsIHllYXJGaWx0ZXIsIGZvcm1hdEZpbHRlciwgcHViRmlsdGVyLCBoaWRlT2xkQm9va3NdLFxuXHRcdFx0ZGVmYXVsdEZpbHRlcnM6IFtcInRleHRGaWx0ZXJcIiwgXCJoaWRlT2xkQm9va3NcIl0sXG5cdFx0fSk7XG5cblx0XHR0aGlzLnVpLmZpbHRlcnMucHJlcGVuZCh0aGlzLmZpbHRlci5yZW5kZXIoKS5lbCk7XG5cblx0XHRpZiAodGhpcy5nZXRRdWVyeVN0cmluZ1BhcmFtKFwicGFnZVwiKSA9PT0gbnVsbCkgeyB0aGlzLmNvbGxlY3Rpb24uZ2V0Rmlyc3RQYWdlKHsgcmVzZXQ6IHRydWUgfSk7IH1cblx0XHRlbHNlIHtcblx0XHRcdGNvbnN0IHBhZ2UgPSBwYXJzZUludCh0aGlzLmdldFF1ZXJ5U3RyaW5nUGFyYW0oXCJwYWdlXCIpLCAxMCk7XG5cdFx0XHR0aGlzLmNvbGxlY3Rpb24uZ2V0UGFnZShwYWdlLCB7IHJlc2V0OiB0cnVlIH0pO1xuXHRcdH1cblx0fSxcblxuXHRnZXRRdWVyeVN0cmluZ1BhcmFtOiBmdW5jdGlvbihuYW1lKSB7XG5cdFx0Y29uc3QgdXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG5cdFx0Y29uc3QgcGFyc2VkTmFtZSA9IG5hbWUucmVwbGFjZSgvW1xcW1xcXV0vZywgXCJcXFxcJCZcIik7XG5cdFx0Y29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKFwiWz8mXVwiICsgcGFyc2VkTmFtZSArIFwiKD0oW14mI10qKXwmfCN8JClcIiksXG5cdFx0XHRyZXN1bHRzID0gcmVnZXguZXhlYyh1cmwpO1xuXHRcdGlmICghcmVzdWx0cykgcmV0dXJuIG51bGw7XG5cdFx0aWYgKCFyZXN1bHRzWzJdKSByZXR1cm4gXCJcIjtcblx0XHRyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHJlc3VsdHNbMl0ucmVwbGFjZSgvXFwrL2csIFwiIFwiKSk7XG5cdH0sXG5cblx0c2VsZWN0Qm9vayhtb2RlbCkge1xuXHRcdHRoaXMudHJpZ2dlcihcInNlbGVjdGVkXCIsIG1vZGVsLmdldChcIl9pZFwiKSk7XG5cdH0sXG5cblx0anVtcFRvUGFnZTogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0Y29uc3QgZWwgPSAkKGV2dC5jdXJyZW50VGFyZ2V0KTtcblx0XHRjb25zdCBwYWdlID0gcGFyc2VJbnQoZWwudGV4dCgpLCAxMCk7XG5cblx0XHR0aGlzLmNvbGxlY3Rpb24uZ2V0UGFnZShwYWdlKTtcblx0fSxcblxuXHRmaXJzdDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jb2xsZWN0aW9uLmdldEZpcnN0UGFnZSh7IHJlc2V0OiB0cnVlIH0pO1xuXHR9LFxuXG5cdHByZXY6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLmNvbGxlY3Rpb24uaGFzUHJldmlvdXNQYWdlKCkpXG5cdFx0XHR0aGlzLmNvbGxlY3Rpb24uZ2V0UHJldmlvdXNQYWdlKCk7XG5cdH0sXG5cblx0bmV4dDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuY29sbGVjdGlvbi5oYXNOZXh0UGFnZSgpKVxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uLmdldE5leHRQYWdlKCk7XG5cdH0sXG5cblx0bGFzdDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jb2xsZWN0aW9uLmdldFBhZ2UodGhpcy5jb2xsZWN0aW9uLnN0YXRlLnRvdGFsUGFnZXMpO1xuXHR9LFxuXG5cdHVwZGF0ZUNvdW50ZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHBhZ2VTdGFydCA9ICgoKHRoaXMuY29sbGVjdGlvbi5zdGF0ZS5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5jb2xsZWN0aW9uLnN0YXRlLnBhZ2VTaXplKSArIDEpO1xuXHRcdGxldCBwYWdlRW5kID0gKCh0aGlzLmNvbGxlY3Rpb24uc3RhdGUuY3VycmVudFBhZ2UpICogdGhpcy5jb2xsZWN0aW9uLnN0YXRlLnBhZ2VTaXplKTtcblx0XHRpZiAocGFnZUVuZCA+IHRoaXMuY29sbGVjdGlvbi5zdGF0ZS50b3RhbFJlY29yZHMpXG5cdFx0XHRwYWdlRW5kID0gdGhpcy5jb2xsZWN0aW9uLnN0YXRlLnRvdGFsUmVjb3Jkcztcblx0XHRsZXQgcHJldkRpc2FibGUgPSB0cnVlLCBuZXh0RGlzYWJsZSA9IHRydWU7XG5cblx0XHRpZiAodGhpcy5jb2xsZWN0aW9uLnN0YXRlLnRvdGFsUGFnZXMgPiAxKSB7XG5cdFx0XHRpZiAodGhpcy5jb2xsZWN0aW9uLnN0YXRlLmN1cnJlbnRQYWdlID4gMSlcblx0XHRcdFx0cHJldkRpc2FibGUgPSBmYWxzZTtcblx0XHRcdGlmICh0aGlzLmNvbGxlY3Rpb24uc3RhdGUuY3VycmVudFBhZ2UgPCB0aGlzLmNvbGxlY3Rpb24uc3RhdGUudG90YWxQYWdlcylcblx0XHRcdFx0bmV4dERpc2FibGUgPSBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5jb2xsZWN0aW9uLnN0YXRlLnRvdGFsUmVjb3JkcyA+IDApIHtcblx0XHRcdGxldCB0ZXh0ID0gXCIgPGRpdiBjbGFzcz0nZmlyc3QganVtcGVyIFwiICsgKHByZXZEaXNhYmxlID8gXCIgZGlzYWJsZWRcIiA6IFwiXCIpICsgXCInIHRpdGxlPSdGaXJzdCBwYWdlJz48c3BhbiBjbGFzcz0nZmFsIGZhLWFuZ2xlLWRvdWJsZS1sZWZ0Jy8+PC9kaXY+IDxkaXYgY2xhc3M9J3ByZXYganVtcGVyIFwiICtcblx0XHRcdFx0KHByZXZEaXNhYmxlID8gXCIgZGlzYWJsZWRcIiA6IFwiXCIpICsgXCInIHRpdGxlPSdQcmV2aW91cyBwYWdlJz48c3BhbiBjbGFzcz0nZmFsIGZhLWFuZ2xlLWxlZnQnLz48L2Rpdj5cIjtcblxuXHRcdFx0Ly8gU2hvdyB1cCB0byAxMCBwYWdlIG51bWJlcnNcblx0XHRcdGNvbnN0IGNvbGxlY3Rpb24gPSB0aGlzLmNvbGxlY3Rpb247XG5cdFx0XHRjb25zdCBzdGF0ZSA9IGNvbGxlY3Rpb24uc3RhdGU7XG5cdFx0XHRjb25zdCB3aW5kb3dTaXplID0gMTA7XG5cdFx0XHRjb25zdCBzbGlkZVNjYWxlID0gMC41O1xuXG5cdFx0XHRjb25zdCBzbGlkZVRoaXNNdWNoID0gZnVuY3Rpb24oZmlyc3RQYWdlLCBsYXN0UGFnZSwgY3VycmVudFBhZ2UsIF93aW5kb3dTaXplLCBfc2xpZGVTY2FsZSkge1xuXHRcdFx0XHRyZXR1cm4gfn4oX3dpbmRvd1NpemUgKiBfc2xpZGVTY2FsZSk7XG5cdFx0XHR9O1xuXG5cdFx0XHRjb25zdCBzbGlkZU1heWJlID0gZnVuY3Rpb24oZmlyc3RQYWdlLCBsYXN0UGFnZSwgY3VycmVudFBhZ2UsIF93aW5kb3dTaXplKSB7XG5cdFx0XHRcdHJldHVybiBNYXRoLnJvdW5kKGN1cnJlbnRQYWdlICUgX3dpbmRvd1NpemUgLyBfd2luZG93U2l6ZSk7XG5cdFx0XHR9O1xuXG5cdFx0XHRjb25zdCBmaXJzdFBhZ2UgPSBzdGF0ZS5maXJzdFBhZ2U7XG5cdFx0XHRsZXQgbGFzdFBhZ2UgPSBOdW1iZXIoc3RhdGUubGFzdFBhZ2UpO1xuXHRcdFx0bGFzdFBhZ2UgPSBNYXRoLm1heCgwLCBmaXJzdFBhZ2UgPyBsYXN0UGFnZSAtIDEgOiBsYXN0UGFnZSk7XG5cdFx0XHRsZXQgY3VycmVudFBhZ2UgPSBNYXRoLm1heChzdGF0ZS5jdXJyZW50UGFnZSwgc3RhdGUuZmlyc3RQYWdlKTtcblx0XHRcdGN1cnJlbnRQYWdlID0gZmlyc3RQYWdlID8gY3VycmVudFBhZ2UgLSAxIDogY3VycmVudFBhZ2U7XG5cblx0XHRcdGxldCB3aW5kb3dTdGFydCA9IE1hdGguZmxvb3IoY3VycmVudFBhZ2UgLyB3aW5kb3dTaXplKSAqIHdpbmRvd1NpemU7XG5cdFx0XHRpZiAoY3VycmVudFBhZ2UgPD0gbGFzdFBhZ2UgLSBzbGlkZVRoaXNNdWNoKCkpIHtcblx0XHRcdFx0d2luZG93U3RhcnQgKz0gKHNsaWRlTWF5YmUoZmlyc3RQYWdlLCBsYXN0UGFnZSwgY3VycmVudFBhZ2UsIHdpbmRvd1NpemUsIHNsaWRlU2NhbGUpICpcblx0XHRcdFx0c2xpZGVUaGlzTXVjaChmaXJzdFBhZ2UsIGxhc3RQYWdlLCBjdXJyZW50UGFnZSwgd2luZG93U2l6ZSwgc2xpZGVTY2FsZSkpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgd2luZG93RW5kID0gTWF0aC5taW4obGFzdFBhZ2UgKyAxLCB3aW5kb3dTdGFydCArIHdpbmRvd1NpemUpO1xuXG5cdFx0XHRmb3IobGV0IGkgPSB3aW5kb3dTdGFydDsgaSA8IHdpbmRvd0VuZDsgaSsrKVxuXHRcdFx0XHR0ZXh0ICs9IGA8c3BhbiBjbGFzcz0ncGFnZSAkeyBpICsgMSA9PT0gc3RhdGUuY3VycmVudFBhZ2UgPyBcImFjdGl2ZVwiIDogXCJcIn0nPiR7IGkgKyAxIH08L3NwYW4+YDtcblxuXHRcdFx0dGV4dCArPSBcIjxkaXYgY2xhc3M9J25leHQganVtcGVyIFwiICsgKG5leHREaXNhYmxlID8gXCIgZGlzYWJsZWRcIiA6IFwiXCIpICsgXCInIHRpdGxlPSdOZXh0IHBhZ2UnPjxzcGFuIGNsYXNzPSdmYWwgZmEtYW5nbGUtcmlnaHQnLz48L2Rpdj4gPGRpdiBjbGFzcz0nbGFzdCBqdW1wZXIgXCIgK1xuXHRcdFx0XHQobmV4dERpc2FibGUgPyBcIiBkaXNhYmxlZFwiIDogXCJcIikgKyBcIicgdGl0bGU9J0xhc3QgcGFnZSc+PHNwYW4gY2xhc3M9J2ZhbCBmYS1hbmdsZS1kb3VibGUtcmlnaHQnLz48L2Rpdj5cIjtcblxuXHRcdFx0Y29uc3QgY291bnRlclRleHQgPSBcIjxzcGFuIGNsYXNzPSdjb3VudGVySW5mbyc+Qm9va3MgXCIgKyBwYWdlU3RhcnQgKyBcIiAtIFwiICsgcGFnZUVuZCArIFwiIG9mIFwiICtcblx0XHRcdFx0c3RhdGUudG90YWxSZWNvcmRzLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxCKD89KFxcZHszfSkrKD8hXFxkKSkvZywgXCIgXCIpICsgXCI8L3NwYW4+XCI7XG5cblx0XHRcdHRoaXMudWkucGFnaW5nLmh0bWwodGV4dCk7XG5cdFx0XHR0aGlzLnVpLmNvdW50ZXIuaHRtbChjb3VudGVyVGV4dCk7XG5cblx0XHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0ZSwgc2V0dGluZ3MudXJsUm9vdCArIFwiL2NvbnNvbGUvYm9va3M/cGFnZT1cIiArIChjdXJyZW50UGFnZSArIDEpLCB7IHRyaWdnZXI6IGZhbHNlLCByZXBsYWNlOiB0cnVlIH0pO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMudWkucGFnaW5nLmVtcHR5KCk7XG5cdFx0XHR0aGlzLnVpLmNvdW50ZXIuZW1wdHkoKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5nZXRRdWVyeVN0cmluZ1BhcmFtKFwidGV4dEZpbHRlclwiKSkge1xuXHRcdFx0Y29uc3Qgc2VhcmNoVGV4dCA9IF8ucmVwbGFjZSh0aGlzLmdldFF1ZXJ5U3RyaW5nUGFyYW0oXCJ0ZXh0RmlsdGVyXCIpLCAvXFx8L2csIFwiIFwiKTtcblx0XHRcdCQoXCIuc2VhcmNoLWlucHV0XCIpLnZhbChzZWFyY2hUZXh0KTtcblx0XHR9XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\nvar _ = require(\"lodash\");\nvar $ = require(\"jquery\");\nvar settings = require(\"app-settings\");\n\nvar tippy = require(\"tippy.js\").default;\n// import tippy from 'tippy.js';\n// import 'tippy.js/dist/tippy.css';\n\nvar LastUsedModel = Backbone.Model.extend({\n\tdefaults: {\n\t\ttype: \"book\"\n\t},\n\n\tidAttribute: \"last_used_id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/acacia/logs/lastUsed\";\n\t}\n});\n\nvar BookView = Backbone.Marionette.View.extend({\n\tclassName: \"\",\n\ttemplate: require(\"./templates/booksView.nunj\"),\n\n\tui: {\n\t\tcover: \".bookImg\",\n\t\ttype: \".cover-type\",\n\t\ttitle: \".title\",\n\t\tbottomTitle: \".bottom-title\",\n\t\tinfo: \".info\",\n\t\tbookTooltip: \".bookTooltip\",\n\t\tchosenYears: \".chosenYears\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.more\": \"viewBook\",\n\t\t\"click @ui.title\": \"viewBook\",\n\t\t\"click @ui.cover\": \"viewBook\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.model.set(\"urlRoot\", settings.urlRoot);\n\t\tthis.model.set(\"currentYear\", moment().year());\n\t\tif (this.model.get(\"years\") !== null) this.model.set(\"years\", _.filter(this.model.get(\"years\"), function (year) {\n\t\t\treturn year <= moment().year();\n\t\t}));\n\t},\n\n\tserializeData: function serializeData() {\n\t\treturn this.model.toJSON();\n\t},\n\n\tonRender: function onRender() {\n\t\t// Also set the book type\n\t\tthis.ui.cover.css({ \"background-image\": \"url('/unity/api/1.0/epubs/\" + this.model.get(\"_id\") + \"/cover')\" });\n\n\t\t_.each([{\n\t\t\ttargetEl: this.ui.title.get(0)\n\t\t}, {\n\t\t\ttargetEl: this.ui.bottomTitle.get(0)\n\t\t}], function (spec) {\n\t\t\treturn tippy(spec.targetEl, _.extend(_.omit(spec, [\"targetEl\"]), {\n\t\t\t\ttheme: \"black\",\n\t\t\t\tplacement: \"top\",\n\t\t\t\tarrow: true,\n\t\t\t\tcontent: $(spec.targetEl).attr(\"data-title\"),\n\t\t\t\tdelay: 500\n\t\t\t}));\n\t\t});\n\t},\n\n\tonAttach: function onAttach() {\n\t\t//Add ellipsis to title and chosenYear that are cut off\n\t\twhile (this.ui.title.find(\"p\").outerHeight() > this.ui.title.height()) {\n\t\t\tthis.ui.title.find(\"p\").text(function (index, text) {\n\t\t\t\treturn text.replace(/\\W*\\s(\\S)*$/, \"...\");\n\t\t\t});\n\t\t}while (this.ui.chosenYears.find(\"p\").outerHeight() > this.ui.chosenYears.height()) {\n\t\t\tthis.ui.chosenYears.find(\"p\").text(function (index, text) {\n\t\t\t\treturn text.replace(/\\W*\\s(\\S)*$/, \"...\");\n\t\t\t});\n\t\t}\n\t},\n\n\tviewBook: function viewBook(event) {\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\t\tthis.trigger(\"select:book\", this.model);\n\t\tvar lastUsed = new LastUsedModel({ item_id: this.model.get(\"book_id\") });\n\t\tlastUsed.save();\n\t}\n});\n\nvar BooksView = Backbone.Marionette.CollectionView.extend({\n\tclassName: \"row\",\n\tchildView: BookView,\n\tchildViewTriggers: {\n\t\t\"select:book\": \"child:select:book\"\n\t}\n});\n\nmodule.exports = BooksView;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJvb2tzVmlldy5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCJtb21lbnQiLCJfIiwiJCIsInNldHRpbmdzIiwidGlwcHkiLCJkZWZhdWx0IiwiTGFzdFVzZWRNb2RlbCIsIk1vZGVsIiwiZXh0ZW5kIiwiZGVmYXVsdHMiLCJ0eXBlIiwiaWRBdHRyaWJ1dGUiLCJ1cmxSb290IiwiQm9va1ZpZXciLCJNYXJpb25ldHRlIiwiVmlldyIsImNsYXNzTmFtZSIsInRlbXBsYXRlIiwidWkiLCJjb3ZlciIsInRpdGxlIiwiYm90dG9tVGl0bGUiLCJpbmZvIiwiYm9va1Rvb2x0aXAiLCJjaG9zZW5ZZWFycyIsImV2ZW50cyIsImluaXRpYWxpemUiLCJtb2RlbCIsInNldCIsInllYXIiLCJnZXQiLCJmaWx0ZXIiLCJzZXJpYWxpemVEYXRhIiwidG9KU09OIiwib25SZW5kZXIiLCJjc3MiLCJlYWNoIiwidGFyZ2V0RWwiLCJzcGVjIiwib21pdCIsInRoZW1lIiwicGxhY2VtZW50IiwiYXJyb3ciLCJjb250ZW50IiwiYXR0ciIsImRlbGF5Iiwib25BdHRhY2giLCJmaW5kIiwib3V0ZXJIZWlnaHQiLCJoZWlnaHQiLCJ0ZXh0IiwiaW5kZXgiLCJyZXBsYWNlIiwidmlld0Jvb2siLCJldmVudCIsInN0b3BQcm9wYWdhdGlvbiIsInByZXZlbnREZWZhdWx0IiwidHJpZ2dlciIsImxhc3RVc2VkIiwiaXRlbV9pZCIsInNhdmUiLCJCb29rc1ZpZXciLCJDb2xsZWN0aW9uVmlldyIsImNoaWxkVmlldyIsImNoaWxkVmlld1RyaWdnZXJzIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUMsU0FBU0QsUUFBUSxRQUFSLENBQWY7QUFDQSxJQUFNRSxJQUFJRixRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1HLElBQUlILFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUksV0FB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b25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgbW9tZW50ID0gcmVxdWlyZShcIm1vbWVudFwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IHRpcHB5ID0gcmVxdWlyZShcInRpcHB5LmpzXCIpLmRlZmF1bHQ7XG4vLyBpbXBvcnQgdGlwcHkgZnJvbSAndGlwcHkuanMnO1xuLy8gaW1wb3J0ICd0aXBweS5qcy9kaXN0L3RpcHB5LmNzcyc7XG5cbmNvbnN0IExhc3RVc2VkTW9kZWwgPSBCYWNrYm9uZS5Nb2RlbC5leHRlbmQoe1xuXHRkZWZhdWx0czoge1xuXHRcdHR5cGU6IFwiYm9va1wiLFxuXHR9LFxuXG5cdGlkQXR0cmlidXRlOiBcImxhc3RfdXNlZF9pZFwiLFxuXG5cdHVybFJvb3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYWNhY2lhL2xvZ3MvbGFzdFVzZWRcIjtcblx0fSxcbn0pO1xuXG5jb25zdCBCb29rVmlldyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiXCIsXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi90ZW1wbGF0ZXMvYm9va3NWaWV3Lm51bmpcIiksXG5cblx0dWk6IHtcblx0XHRjb3ZlcjogXCIuYm9va0ltZ1wiLFxuXHRcdHR5cGU6IFwiLmNvdmVyLXR5cGVcIixcblx0XHR0aXRsZTogXCIudGl0bGVcIixcblx0XHRib3R0b21UaXRsZTogXCIuYm90dG9tLXRpdGxlXCIsXG5cdFx0aW5mbzogXCIuaW5mb1wiLFxuXHRcdGJvb2tUb29sdGlwOiBcIi5ib29rVG9vbHRpcFwiLFxuXHRcdGNob3NlblllYXJzOiBcIi5jaG9zZW5ZZWFyc1wiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLm1vcmVcIjogXCJ2aWV3Qm9va1wiLFxuXHRcdFwiY2xpY2sgQHVpLnRpdGxlXCI6IFwidmlld0Jvb2tcIixcblx0XHRcImNsaWNrIEB1aS5jb3ZlclwiOiBcInZpZXdCb29rXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5tb2RlbC5zZXQoXCJ1cmxSb290XCIsIHNldHRpbmdzLnVybFJvb3QpO1xuXHRcdHRoaXMubW9kZWwuc2V0KFwiY3VycmVudFllYXJcIiwgbW9tZW50KCkueWVhcigpKTtcblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJ5ZWFyc1wiKSAhPT0gbnVsbClcblx0XHRcdHRoaXMubW9kZWwuc2V0KFwieWVhcnNcIiwgXy5maWx0ZXIodGhpcy5tb2RlbC5nZXQoXCJ5ZWFyc1wiKSwgeWVhciA9PiB5ZWFyIDw9IG1vbWVudCgpLnllYXIoKSkpO1xuXHR9LFxuXG5cdHNlcmlhbGl6ZURhdGE6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1vZGVsLnRvSlNPTigpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHQvLyBBbHNvIHNldCB0aGUgYm9vayB0eXBlXG5cdFx0dGhpcy51aS5jb3Zlci5jc3MoeyBcImJhY2tncm91bmQtaW1hZ2VcIjogYHVybCgnL3VuaXR5L2FwaS8xLjAvZXB1YnMvJHt0aGlzLm1vZGVsLmdldChcIl9pZFwiKX0vY292ZXInKWAgfSk7XG5cblx0XHRfLmVhY2goW1xuXHRcdFx0e1xuXHRcdFx0XHR0YXJnZXRFbDogdGhpcy51aS50aXRsZS5nZXQoMCksXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHR0YXJnZXRFbDogdGhpcy51aS5ib3R0b21UaXRsZS5nZXQoMCksXG5cdFx0XHR9LFxuXHRcdF0sIHNwZWMgPT4gdGlwcHkoc3BlYy50YXJnZXRFbCwgXy5leHRlbmQoXy5vbWl0KHNwZWMsIFtcInRhcmdldEVsXCJdKSwge1xuXHRcdFx0dGhlbWU6IFwiYmxhY2tcIixcblx0XHRcdHBsYWNlbWVudDogXCJ0b3BcIixcblx0XHRcdGFycm93OiB0cnVlLFxuXHRcdFx0Y29udGVudDogJChzcGVjLnRhcmdldEVsKS5hdHRyKFwiZGF0YS10aXRsZVwiKSxcblx0XHRcdGRlbGF5OiA1MDAsXG5cdFx0fSkpKTtcblx0fSxcblxuXHRvbkF0dGFjaDogZnVuY3Rpb24oKSB7XG5cdFx0Ly9BZGQgZWxsaXBzaXMgdG8gdGl0bGUgYW5kIGNob3NlblllYXIgdGhhdCBhcmUgY3V0IG9mZlxuXHRcdHdoaWxlKHRoaXMudWkudGl0bGUuZmluZChcInBcIikub3V0ZXJIZWlnaHQoKSA+IHRoaXMudWkudGl0bGUuaGVpZ2h0KCkpXG5cdFx0XHR0aGlzLnVpLnRpdGxlLmZpbmQoXCJwXCIpLnRleHQoKGluZGV4LCB0ZXh0KSA9PiB0ZXh0LnJlcGxhY2UoL1xcVypcXHMoXFxTKSokLywgXCIuLi5cIikpO1xuXHRcdHdoaWxlKHRoaXMudWkuY2hvc2VuWWVhcnMuZmluZChcInBcIikub3V0ZXJIZWlnaHQoKSA+IHRoaXMudWkuY2hvc2VuWWVhcnMuaGVpZ2h0KCkpXG5cdFx0XHR0aGlzLnVpLmNob3NlblllYXJzLmZpbmQoXCJwXCIpLnRleHQoKGluZGV4LCB0ZXh0KSA9PiB0ZXh0LnJlcGxhY2UoL1xcVypcXHMoXFxTKSokLywgXCIuLi5cIikpO1xuXHR9LFxuXG5cdHZpZXdCb29rOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0dGhpcy50cmlnZ2VyKFwic2VsZWN0OmJvb2tcIiwgdGhpcy5tb2RlbCk7XG5cdFx0Y29uc3QgbGFzdFVzZWQgPSBuZXcgTGFzdFVzZWRNb2RlbCh7IGl0ZW1faWQ6IHRoaXMubW9kZWwuZ2V0KFwiYm9va19pZFwiKSB9KTtcblx0XHRsYXN0VXNlZC5zYXZlKCk7XG5cdH0sXG59KTtcblxuY29uc3QgQm9va3NWaWV3ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5Db2xsZWN0aW9uVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwicm93XCIsXG5cdGNoaWxkVmlldzogQm9va1ZpZXcsXG5cdGNoaWxkVmlld1RyaWdnZXJzOiB7XG5cdFx0XCJzZWxlY3Q6Ym9va1wiOiBcImNoaWxkOnNlbGVjdDpib29rXCIsXG5cdH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBCb29rc1ZpZXc7Il19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar Resource = require(\"../content/models/manager/resourceModel\");\nvar _ = require(\"lodash\");\n\nmodule.exports = Backbone.Marionette.Object.extend({\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\n\t\tthis.mimes = {\n\t\t\texcel: [\".xls\", \".xlsx\", \"application/octet-stream\", \"application/vnd.ms-excel\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", \"application/zip\"],\n\t\t\tpowerpoint: [\".ppt\", \".pptx\", \".pps\", \".ppsx\", \"application/octet-stream\", \"application/vnd.ms-powerpoint\", \"application/vnd.openxmlformats-officedocument.presentationml.presentation\", \"application/zip\"],\n\t\t\tword: [\".doc\", \".docx\", \"application/octet-stream\", \"application/msword\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\", \"application/zip\"],\n\t\t\tvideo: [\"video/mp4\", \"application/octet-stream\", \"audio/mp4\"],\n\t\t\tpdf: [\"application/pdf\", \"application/x-pdf\", \"application/vnd.pdf\", \".pdf\"],\n\t\t\taudio: [\"audio/mpeg\", \"audio/mp3\", \"application/octet-stream\", \".mp3\"],\n\t\t\timage: [\".jpg\", \".jpeg\", \".png\", \".gif\", \"image/png\", \"image/gif\", \"image/jpeg\"],\n\t\t\ttext: [\"text/plain\"],\n\t\t\tflashcarddeck: [\"text/csv\", \".csv\"]\n\t\t};\n\t},\n\n\tgetFileCategory: function getFileCategory(fileModel) {\n\t\tvar category = \"unknown\";\n\n\t\tif (fileModel.get(\"category\")) return fileModel.get(\"category\");\n\n\t\tvar filename = fileModel.get(\"file\").name || fileModel.get(\"file\").get(\"filename\");\n\t\t_.forOwn(this.mimes, function (mimes, type) {\n\t\t\tif (_.includes(mimes, fileModel.get(\"type\")) || _.includes(mimes, \".\" + filename.split(\".\").pop())) category = type;\n\t\t});\n\n\t\treturn category;\n\t},\n\n\tgetResourceModel: function getResourceModel(file) {\n\t\tvar category = this.getFileCategory(file);\n\t\tvar filename = file.get(\"file\").name || file.get(\"filename\");\n\n\t\tvar resource = new Resource({\n\t\t\tcategory: category,\n\t\t\tresourceType: category,\n\t\t\tlanguage: file.get(\"language\") ? file.get(\"language\") : \"\",\n\t\t\tsubject: file.get(\"subject\") ? file.get(\"subject\") : \"\",\n\t\t\tgrade: file.get(\"grade\") ? file.get(\"grade\") : \"\",\n\t\t\tstudyYear: file.get(\"grade\") ? file.get(\"grade\") : \"\",\n\t\t\ttitle: filename.substring(0, filename.lastIndexOf(\".\")),\n\t\t\tfilename: filename,\n\t\t\tdescription: \"\",\n\t\t\tfileModel: file,\n\t\t\tflashCards: category === \"flashcarddeck\" ? [] : null\n\t\t});\n\n\t\tresource.setFile(\"file\", file.get(\"file\"));\n\n\t\tvar errors = resource.validate(resource.attributes);\n\t\tif (errors) {\n\t\t\tdelete errors.language;\n\t\t\tdelete errors.studyYear;\n\t\t\tdelete errors.subject;\n\t\t\tdelete errors.text;\n\t\t}\n\n\t\tresource.set(\"errors\", errors);\n\n\t\treturn resource;\n\t},\n\n\textractFilesFromEvent: function extractFilesFromEvent(event) {\n\t\tvar file = void 0;\n\n\t\tvar fileList = _.isNil(event.originalEvent.dataTransfer.items) ? event.originalEvent.dataTransfer.files : event.originalEvent.dataTransfer.items;\n\t\tvar files = [];\n\n\t\tif (fileList.length >= 1) {\n\t\t\t_.each(_.range(fileList.length), function (i) {\n\t\t\t\tif (_.isFunction(fileList.item)) {\n\t\t\t\t\tfile = fileList.item(i);\n\n\t\t\t\t\tif ((_.isNil(file) || _.isNil(file.name)) && !_.isNil(event.originalEvent.dataTransfer.items)) file = event.originalEvent.dataTransfer.items[i].kind === \"file\" ? event.originalEvent.dataTransfer.items[i].getAsFile() : null;\n\t\t\t\t} else {\n\t\t\t\t\tfile = fileList[i].kind === \"file\" ? fileList[i].getAsFile() : null;\n\t\t\t\t}\n\t\t\t\tfiles.push(file);\n\t\t\t});\n\t\t}\n\n\t\treturn files;\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJ1bGtEcmFnRHJvcEhlbHBlci5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCJSZXNvdXJjZSIsIl8iLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIk9iamVjdCIsImV4dGVuZCIsImluaXRpYWxpemUiLCJvcHRpb25zIiwibWltZXMiLCJleGNlbCIsInBvd2VycG9pbnQiLCJ3b3JkIiwidmlkZW8iLCJwZGYiLCJhdWRpbyIsImltYWdlIiwidGV4dCIsImZsYXNoY2FyZGRlY2siLCJnZXRGaWxlQ2F0ZWdvcnkiLCJmaWxlTW9kZWwiLCJjYXRlZ29yeSIsImdldCIsImZpbGVuYW1lIiwibmFtZSIsImZvck93biIsInR5cGUiLCJpbmNsdWRlcyIsInNwbGl0IiwicG9wIiwiZ2V0UmVzb3VyY2VNb2RlbCIsImZpbGUiLCJyZXNvdXJjZSIsInJlc291cmNlVHlwZSIsImxhbmd1YWdlIiwic3ViamVjdCIsImdyYWRlIiwic3R1ZHlZZWFyIiwidGl0bGUiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsImRlc2NyaXB0aW9uIiwiZmxhc2hDYXJkcyIsInNldEZpbGUiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImF0dHJpYnV0ZXMiLCJzZXQiLCJleHRyYWN0RmlsZXNGcm9tRXZlbnQiLCJldmVudCIsImZpbGVMaXN0IiwiaXNOaWwiLCJvcmlnaW5hbEV2ZW50IiwiZGF0YVRyYW5zZmVyIiwiaXRlbXMiLCJmaWxlcyIsImxlbmd0aCIsImVhY2giLCJyYW5nZSIsImlzRnVuY3Rpb24iLCJpdGVtIiwiaSIsImtpbmQiLCJnZXRBc0ZpbGUiLCJwdXNoIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNQyxXQUFXRCxRQUFRLHlDQUFSLENBQWpCO0FBQ0EsSUFBTUUsSUFBSUYsUUFBUSxRQUFSLENBQVY7O0FBRUFHLE9BQU9DLE9BQVAsR0FBaUJMLFNBQVNNLFVBQVQsQ0FBb0JDLE1B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QUYsQ0FBYVQsU0FBU1UsSUFBdEIsQ0FBSixFQUFpQztBQUNoQzdCLFlBQU9tQixTQUFTVSxJQUFULENBQWNDLENBQWQsQ0FBUDs7QUFFQSxTQUFJLENBQUM1RCxFQUFFa0QsS0FBRixDQUFRcEIsSUFBUixLQUFpQjlCLEVBQUVrRCxLQUFGLENBQVFwQixLQUFLUCxJQUFiLENBQWxCLEtBQXlDLENBQUN2QixFQUFFa0QsS0FBRixDQUFRRixNQUFNRyxhQUFOLENBQW9CQyxZQUFwQixDQUFpQ0MsS0FBekMsQ0FBOUMsRUFDQ3ZCLE9BQU9rQixNQUFNRyxhQUFOLENBQW9CQyxZQUFwQixDQUFpQ0MsS0FBakMsQ0FBdUNPLENBQXZDLEVBQTBDQyxJQUExQyxLQUFtRCxNQUFuRCxHQUE0RGIsTUFBTUcsYUFBTixDQUFvQkMsWUFBcEIsQ0FBaUNDLEtBQWpDLENBQXVDTyxDQUF2QyxFQUEwQ0UsU0FBMUMsRUFBNUQsR0FBb0gsSUFBM0g7QUFDRCxLQUxELE1BTUs7QUFDSmhDLFlBQU9tQixTQUFTVyxDQUFULEVBQVlDLElBQVosS0FBcUIsTUFBckIsR0FBOEJaLFNBQVNXLENBQVQsRUFBWUUsU0FBWixFQUE5QixHQUF3RCxJQUEvRDtBQUNBO0FBQ0RSLFVBQU1TLElBQU4sQ0FBV2pDLElBQVg7QUFDQSxJQVhEO0FBWUE7O0FBRUQsU0FBT3dCLEtBQVA7QUFDQTtBQXhGaUQsQ0FBbEMsQ0FBakIiLCJmaWxlIjoiYnVsa0RyYWdEcm9wSGVscGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IFJlc291cmNlID0gcmVxdWlyZShcIi4uL2NvbnRlbnQvbW9kZWxzL21hbmFnZXIvcmVzb3VyY2VNb2RlbFwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuT2JqZWN0LmV4dGVuZCh7XG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG5cdFx0dGhpcy5taW1lcyA9IHtcblx0XHRcdGV4Y2VsOiBbXCIueGxzXCIsIFwiLnhsc3hcIiwgXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIiwgXCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWxcIiwgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldFwiLCBcImFwcGxpY2F0aW9uL3ppcFwiXSxcblx0XHRcdHBvd2VycG9pbnQ6IFtcIi5wcHRcIiwgXCIucHB0eFwiLCBcIi5wcHNcIiwgXCIucHBzeFwiLCBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiLCBcImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50XCIsIFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnByZXNlbnRhdGlvblwiLFxuXHRcdFx0XHRcImFwcGxpY2F0aW9uL3ppcFwiXSxcblx0XHRcdHdvcmQ6IFtcIi5kb2NcIiwgXCIuZG9jeFwiLCBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiLCBcImFwcGxpY2F0aW9uL21zd29yZFwiLCBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50XCIsIFwiYXBwbGljYXRpb24vemlwXCJdLFxuXHRcdFx0dmlkZW86IFtcInZpZGVvL21wNFwiLCBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiLCBcImF1ZGlvL21wNFwiXSxcblx0XHRcdHBkZjogW1wiYXBwbGljYXRpb24vcGRmXCIsIFwiYXBwbGljYXRpb24veC1wZGZcIiwgXCJhcHBsaWNhdGlvbi92bmQucGRmXCIsIFwiLnBkZlwiXSxcblx0XHRcdGF1ZGlvOiBbXCJhdWRpby9tcGVnXCIsIFwiYXVkaW8vbXAzXCIsIFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCIsIFwiLm1wM1wiXSxcblx0XHRcdGltYWdlOiBbXCIuanBnXCIsIFwiLmpwZWdcIiwgXCIucG5nXCIsIFwiLmdpZlwiLCBcImltYWdlL3BuZ1wiLCBcImltYWdlL2dpZlwiLCBcImltYWdlL2pwZWdcIl0sXG5cdFx0XHR0ZXh0OiBbXCJ0ZXh0L3BsYWluXCJdLFxuXHRcdFx0Zmxhc2hjYXJkZGVjazogW1widGV4dC9jc3ZcIiwgXCIuY3N2XCJdLFxuXHRcdH07XG5cdH0sXG5cblx0Z2V0RmlsZUNhdGVnb3J5OiBmdW5jdGlvbihmaWxlTW9kZWwpIHtcblx0XHRsZXQgY2F0ZWdvcnkgPSBcInVua25vd25cIjtcblxuXHRcdGlmIChmaWxlTW9kZWwuZ2V0KFwiY2F0ZWdvcnlcIikpXG5cdFx0XHRyZXR1cm4gZmlsZU1vZGVsLmdldChcImNhdGVnb3J5XCIpO1xuXG5cdFx0Y29uc3QgZmlsZW5hbWUgPSBmaWxlTW9kZWwuZ2V0KFwiZmlsZVwiKS5uYW1lIHx8IGZpbGVNb2RlbC5nZXQoXCJmaWxlXCIpLmdldChcImZpbGVuYW1lXCIpO1xuXHRcdF8uZm9yT3duKHRoaXMubWltZXMsIChtaW1lcywgdHlwZSkgPT4ge1xuXHRcdFx0aWYgKF8uaW5jbHVkZXMobWltZXMsIGZpbGVNb2RlbC5nZXQoXCJ0eXBlXCIpKSB8fCBfLmluY2x1ZGVzKG1pbWVzLCBcIi5cIiArIGZpbGVuYW1lLnNwbGl0KFwiLlwiKS5wb3AoKSkpXG5cdFx0XHRcdGNhdGVnb3J5ID0gdHlwZTtcblx0XHR9KTtcblxuXHRcdHJldHVybiBjYXRlZ29yeTtcblx0fSxcblxuXHRnZXRSZXNvdXJjZU1vZGVsOiBmdW5jdGlvbihmaWxlKSB7XG5cdFx0Y29uc3QgY2F0ZWdvcnkgPSB0aGlzLmdldEZpbGVDYXRlZ29yeShmaWxlKTtcblx0XHRjb25zdCBmaWxlbmFtZSA9IGZpbGUuZ2V0KFwiZmlsZVwiKS5uYW1lIHx8IGZpbGUuZ2V0KFwiZmlsZW5hbWVcIik7XG5cblx0XHRjb25zdCByZXNvdXJjZSA9IG5ldyBSZXNvdXJjZSh7XG5cdFx0XHRjYXRlZ29yeSxcblx0XHRcdHJlc291cmNlVHlwZTogY2F0ZWdvcnksXG5cdFx0XHRsYW5ndWFnZTogZmlsZS5nZXQoXCJsYW5ndWFnZVwiKSA/IGZpbGUuZ2V0KFwibGFuZ3VhZ2VcIikgOiBcIlwiLFxuXHRcdFx0c3ViamVjdDogZmlsZS5nZXQoXCJzdWJqZWN0XCIpID8gZmlsZS5nZXQoXCJzdWJqZWN0XCIpIDogXCJcIixcblx0XHRcdGdyYWRlOiBmaWxlLmdldChcImdyYWRlXCIpID8gZmlsZS5nZXQoXCJncmFkZVwiKSA6IFwiXCIsXG5cdFx0XHRzdHVkeVllYXI6IGZpbGUuZ2V0KFwiZ3JhZGVcIikgPyBmaWxlLmdldChcImdyYWRlXCIpIDogXCJcIixcblx0XHRcdHRpdGxlOiBmaWxlbmFtZS5zdWJzdHJpbmcoMCwgZmlsZW5hbWUubGFzdEluZGV4T2YoXCIuXCIpKSxcblx0XHRcdGZpbGVuYW1lOiBmaWxlbmFtZSxcblx0XHRcdGRlc2NyaXB0aW9uOiBcIlwiLFxuXHRcdFx0ZmlsZU1vZGVsOiBmaWxlLFxuXHRcdFx0Zmxhc2hDYXJkczogY2F0ZWdvcnkgPT09IFwiZmxhc2hjYXJkZGVja1wiID8gW10gOiBudWxsLFxuXHRcdH0pO1xuXG5cdFx0cmVzb3VyY2Uuc2V0RmlsZShcImZpbGVcIiwgZmlsZS5nZXQoXCJmaWxlXCIpKTtcblxuXHRcdGNvbnN0IGVycm9ycyA9IHJlc291cmNlLnZhbGlkYXRlKHJlc291cmNlLmF0dHJpYnV0ZXMpO1xuXHRcdGlmIChlcnJvcnMpIHtcblx0XHRcdGRlbGV0ZSBlcnJvcnMubGFuZ3VhZ2U7XG5cdFx0XHRkZWxldGUgZXJyb3JzLnN0dWR5WWVhcjtcblx0XHRcdGRlbGV0ZSBlcnJvcnMuc3ViamVjdDtcblx0XHRcdGRlbGV0ZSBlcnJvcnMudGV4dDtcblx0XHR9XG5cblx0XHRyZXNvdXJjZS5zZXQoXCJlcnJvcnNcIiwgZXJyb3JzKTtcblxuXHRcdHJldHVybiByZXNvdXJjZTtcblx0fSxcblxuXHRleHRyYWN0RmlsZXNGcm9tRXZlbnQ6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0bGV0IGZpbGU7XG5cblx0XHRjb25zdCBmaWxlTGlzdCA9IF8uaXNOaWwoZXZlbnQub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXIuaXRlbXMpID8gZXZlbnQub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXIuZmlsZXMgOiBldmVudC5vcmlnaW5hbEV2ZW50LmRhdGFUcmFuc2Zlci5pdGVtcztcblx0XHRjb25zdCBmaWxlcyA9IFtdO1xuXG5cdFx0aWYgKGZpbGVMaXN0Lmxlbmd0aCA+PSAxKSB7XG5cdFx0XHRfLmVhY2goXy5yYW5nZShmaWxlTGlzdC5sZW5ndGgpLCBpID0+IHtcblx0XHRcdFx0aWYgKF8uaXNGdW5jdGlvbihmaWxlTGlzdC5pdGVtKSkge1xuXHRcdFx0XHRcdGZpbGUgPSBmaWxlTGlzdC5pdGVtKGkpO1xuXG5cdFx0XHRcdFx0aWYgKChfLmlzTmlsKGZpbGUpIHx8IF8uaXNOaWwoZmlsZS5uYW1lKSkgJiYgIV8uaXNOaWwoZXZlbnQub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXIuaXRlbXMpKVxuXHRcdFx0XHRcdFx0ZmlsZSA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLml0ZW1zW2ldLmtpbmQgPT09IFwiZmlsZVwiID8gZXZlbnQub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXIuaXRlbXNbaV0uZ2V0QXNGaWxlKCkgOiBudWxsO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdGZpbGUgPSBmaWxlTGlzdFtpXS5raW5kID09PSBcImZpbGVcIiA/IGZpbGVMaXN0W2ldLmdldEFzRmlsZSgpIDogbnVsbDtcblx0XHRcdFx0fVxuXHRcdFx0XHRmaWxlcy5wdXNoKGZpbGUpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZpbGVzO1xuXHR9LFxufSk7Il19",
    "\"use strict\";\n\nvar _radioEvents;\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\n\nvar BulkDragDropHelper = require(\"./bulkDragDropHelper\");\nvar DragDropFileChooser = require(\"./dragDropFileChooser\");\nvar Errors = require(\"./errors.js\");\n\nvar BigModal = require(\"./bigModal\");\nvar App = require(\"../index\");\nvar globalRadio = Backbone.Radio.channel(\"global\");\nvar SmallModal = require(\"./smallModal\");\n\nvar Item = Backbone.Marionette.View.extend({\n\ttemplate: require(\"./templates/bulkResourceUploadModal.nunj\").listItem,\n\ttagName: \"tr\",\n\n\tui: {\n\t\titem: \".clickable\",\n\t\tstatusIcon: \".status-icon\",\n\t\tcancelButton: \"button.cancel\",\n\t\terrorButton: \"button.error\",\n\t\tcompletedButton: \"button.completed\",\n\t\tprogressBar: \".upload-progress .progress-bar\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.cancelButton\": \"onCancelClick\",\n\t\t\"click @ui.errorButton\": \"onCancelClick\"\n\t},\n\n\tmodelEvents: {\n\t\t\"upload:progress\": \"onUploadProgress\",\n\t\t\"save:success\": \"saveSuccess\",\n\t\t\"save:error\": \"saveError\",\n\t\t\"change:scrollIntoView\": \"onScrollIntoViewChange\",\n\t\t\"change:uploadStarted\": \"onUploadStarted\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tfileSize: this.fileSize(),\n\t\t\terrorMessage: this.getErrorMessage(),\n\t\t\thasError: _.values(this.model.get(\"errors\")).length > 0 || this.model.get(\"category\") === \"unknown\",\n\t\t\terrorsArray: _.values(_.pickBy(this.model.get(\"errors\"), function (value, key) {\n\t\t\t\treturn _.endsWith(key, \"FileChooser\");\n\t\t\t}))\n\t\t};\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.model.set(\"uploadStarted\", false);\n\t\tthis.bindEvents(this.model, this.modelEvents);\n\t\tthis.percentage = 0;\n\t},\n\n\tgetErrorMessage: function getErrorMessage() {\n\t\tif (_.values(this.model.get(\"errors\")).length > 0) {\n\t\t\treturn _.values(this.model.get(\"errors\")).join(\". \") + (this.model.get(\"retry\") ? \"\" : \" This file will be skipped during the upload. Click error button to remove it from the list.\") + (this.model.get(\"category\") === \"unknown\" ? \" The supported file types are excel, powerpoint, word, video, pdf, audio, image, text, csv flashcard deck.\" : \"\");\n\t\t}\n\n\t\treturn \"\";\n\t},\n\n\tfileSize: function fileSize() {\n\t\tvar fileModel = this.model.get(\"fileModel\") ? this.model.get(\"fileModel\") : this.model;\n\t\tvar i = Math.floor(Math.log(fileModel.get(\"size\")) / Math.log(1024)),\n\t\t    sizes = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"];\n\n\t\treturn Number((fileModel.get(\"size\") / Math.pow(1024, i)).toFixed(2)) * 1 + \" \" + sizes[i];\n\t},\n\n\tonUploadStarted: function onUploadStarted() {\n\t\tif (this.model.get(\"uploadStarted\")) {\n\t\t\tthis.model.set(\"errors\", {});\n\t\t\tthis.render();\n\t\t}\n\t},\n\n\tonCancelClick: function onCancelClick() {\n\t\tthis.model.set(\"selected\", false);\n\t\tthis.model.trigger(\"upload:cancel\", this.model);\n\t\tthis.model.collection.remove(this.model);\n\t\tthis.destroy();\n\t},\n\n\tonUploadProgress: function onUploadProgress(percentage) {\n\t\tif (this.percentage <= percentage) {\n\t\t\tthis.ui.progressBar.animate({ width: percentage + \"%\" });\n\t\t\tthis.percentage = percentage;\n\t\t}\n\n\t\tif (!this.model.get(\"scrollIntoView\")) this.model.set(\"scrollIntoView\", true);\n\n\t\tif (!this.model.get(\"uploadStarted\")) this.model.set(\"uploadStarted\", true);\n\t},\n\n\tsaveSuccess: function saveSuccess() {\n\t\tthis.ui.progressBar.animate({ width: \"100%\" });\n\t\tthis.percentage = 100;\n\t\tthis.ui.cancelButton.addClass(\"hide\");\n\t\tthis.ui.completedButton.removeClass(\"hide\");\n\t\tthis.model.set(\"scrollIntoView\", false);\n\t},\n\n\tsaveError: function saveError(xhr) {\n\t\tthis.ui.progressBar.animate({ width: \"0%\" });\n\t\tthis.percentage = 0;\n\t\tthis.model.set(\"scrollIntoView\", false);\n\t\tthis.model.set(\"uploadStarted\", false);\n\n\t\tvar errors = { error: xhr.responseJSON.info };\n\t\tthis.model.set(\"errors\", errors);\n\t\tif (xhr.retry) this.model.set(\"retry\", true);\n\n\t\tthis.render();\n\t},\n\n\tonScrollIntoViewChange: function onScrollIntoViewChange() {\n\t\tif (this.model.get(\"scrollIntoView\")) {\n\t\t\t$(\".list-container\").animate({\n\t\t\t\tscrollTop: this.$el.position().top + 10\n\t\t\t}, 800);\n\t\t}\n\t}\n});\n\nvar List = Backbone.Marionette.CollectionView.extend({\n\tchildView: Item,\n\ttagName: \"tbody\",\n\tchildViewTriggers: {\n\t\t\"select:camUser\": \"child:select:camUser\",\n\t\t\"change:camUser\": \"child:change:camUser\"\n\t}\n});\n\nvar BulkUploadWizard = Backbone.Marionette.View.extend({\n\tclassName: \"resourceUploadWizard-container\",\n\n\ttemplate: require(\"./templates/bulkResourceUploadModal.nunj\").wizard,\n\n\tregions: {\n\t\tfileChooser: \"div.file-chooser-region\"\n\t},\n\n\tui: {\n\t\tresourceSelector: \"#resourceSelector\",\n\t\tverify: \"#verify\",\n\t\tselectAll: \"#select-all\",\n\t\tresourceError: \"#resourceError\",\n\t\tsmartSelect: \"button.smart\",\n\t\tdeselect: \"button.deselect\",\n\t\t\"choose-files\": \"#file-chooser\",\n\t\tconfirm: \"#confirm\",\n\t\tconfirmList: \"#confirm .confirm-list\",\n\t\tconfirmListHeader: \".confirm-list-header\"\n\t},\n\n\tmodelEvents: {\n\t\t\"change:loading\": \"render\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.bulkDragDropHelper = new BulkDragDropHelper();\n\t\tthis.selectedFiles = [];\n\t},\n\n\tonRender: function onRender() {\n\t\tif (this.model.get(\"loading\")) return;\n\n\t\tif (this.model.get(\"files\")) {\n\t\t\tthis.setSelectedFiles(this.model.get(\"files\"));\n\n\t\t\tthis.renderStep(\"confirm\");\n\t\t} else {\n\t\t\tthis.renderStep(\"choose-files\");\n\t\t}\n\t},\n\n\trenderStep: function renderStep(step) {\n\t\t// Filter out canceled files\n\t\tthis.selectedFiles = _.filter(this.selectedFiles, function (file) {\n\t\t\treturn file.get(\"selected\") !== false;\n\t\t});\n\t\tif (step === \"choose-files\") {\n\t\t\tthis.fileChooser = new DragDropFileChooser({\n\t\t\t\tacceptedFileTypes: [\".mp3\", \"audio/mpeg\", \"audio/mp3\", \".xls\", \".xlsx\", \"application/vnd.ms-excel\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", \".csv\", \"text/csv\", \"text/plain\", \".jpg\", \".jpeg\", \".png\", \".gif\", \"image/gif\", \"image/jpeg\", \"image/png\", \".pdf\", \"application/pdf\", \".ppt\", \".pptx\", \".pps\", \".ppsx\", \".mp4\", \"video/mp4\", \".doc\", \".docx\", \"application/msword\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\", \"application/vnd.ms-powerpoint\", \"application/vnd.openxmlformats-officedocument.presentationml.presentation\", \"application/vnd.ms-powerpoint\", \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\"],\n\t\t\t\theight: \"100%\",\n\t\t\t\tmultiple: true\n\t\t\t});\n\t\t\tthis.listenTo(this.fileChooser, \"selected\", this.onFilesSelected.bind(this));\n\t\t\tthis.showChildView(\"fileChooser\", this.fileChooser);\n\t\t\tthis.ui.confirm.addClass(\"hide\");\n\t\t\tthis.ui[\"choose-files\"].removeClass(\"hide\");\n\t\t} else if (step === \"confirm\") {\n\t\t\t$(\"#resourceHeader label\").removeClass(\"active\");\n\t\t\t$(\"#resourceHeader .confirm\").addClass(\"active\");\n\t\t\tthis.fileList = new List({\n\t\t\t\tcollection: new Backbone.Collection(this.selectedFiles)\n\t\t\t});\n\n\t\t\tthis.ui.confirmList.html(this.ui.confirmListHeader.html());\n\t\t\tthis.ui.confirmList.append(this.fileList.render().el);\n\t\t\tthis.ui[\"choose-files\"].addClass(\"hide\");\n\t\t\tthis.ui.confirm.removeClass(\"hide\");\n\t\t}\n\t},\n\n\tonFilesSelected: function onFilesSelected(files) {\n\t\tthis.setSelectedFiles(files);\n\n\t\tthis.renderStep(\"confirm\");\n\t\tthis.trigger(\"files-selected\");\n\t},\n\n\tsetSelectedFiles: function setSelectedFiles(files) {\n\t\tvar _this = this;\n\n\t\tthis.selectedFiles = _.concat(this.selectedFiles, _.map(_.filter(files, function (f) {\n\t\t\treturn f !== null;\n\t\t}), function (file) {\n\t\t\treturn file instanceof Backbone.Model ? file : _this.bulkDragDropHelper.getResourceModel(new Backbone.Model(_.merge(file, { file: file })));\n\t\t}));\n\t},\n\n\tshowError: function showError(error) {\n\t\tthis.ui.resourceError.html(error);\n\t}\n});\n\nmodule.exports = BigModal.extend({\n\tui: {\n\t\tresourceContainer: \"div#resourceContainer\",\n\t\tconfirmBtn: \".modal-footer .create\",\n\t\tcancelBtn: \".modal-footer .cancel\",\n\t\tchooseLabel: \"label.choose-files\",\n\t\tconfirmLabel: \"label.confirm\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.confirmBtn\": \"onConfirmBtnClick\",\n\t\t\"click @ui.chooseLabel\": \"onChooseLabelancelBtnClick\",\n\t\t\"click @ui.confirmLabel\": \"onConfirmLabelancelBtnClick\"\n\t},\n\n\tradioEvents: (_radioEvents = {}, _defineProperty(_radioEvents, App.Events.WebsocketConnected, \"wsConnected\"), _defineProperty(_radioEvents, App.Events.WebsocketDisconnected, \"wsDisconnected\"), _radioEvents),\n\n\tinitialize: function initialize(options) {\n\t\t_.bindAll(this);\n\n\t\tthis.Options = {\n\t\t\tclasses: [\"import-resource-modal\"],\n\t\t\ttemplate: require(\"./templates/bulkResourceUploadModal.nunj\").container,\n\t\t\tcreateIcon: \"fa-arrow-alt-to-bottom\",\n\t\t\tbuttons: {\n\t\t\t\tcreate: {\n\t\t\t\t\ttype: \"accept\",\n\t\t\t\t\tlabel: \"Confirm\",\n\t\t\t\t\tmode: \"create\",\n\t\t\t\t\tvalidate: false,\n\t\t\t\t\tsave: false\n\t\t\t\t},\n\t\t\t\tcancel: {\n\t\t\t\t\ttype: \"cancel\",\n\t\t\t\t\tlabel: \"Cancel\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tcreateVerb: \"Import from my computer\",\n\t\t\tdataNoun: null,\n\t\t\tsizeConstraints: {\n\t\t\t\tminHeight: \"50vh\",\n\t\t\t\tminWidth: \"50vw\"\n\t\t\t},\n\t\t\thost: options.host\n\t\t};\n\n\t\tthis.bulkDragDropHelper = new BulkDragDropHelper();\n\t\tthis.canceledFiles = [];\n\t\tthis.xhr = {\n\t\t\tabort: function abort() {\n\t\t\t\treturn _.noop();\n\t\t\t}\n\t\t};\n\n\t\tthis.model.set({ wsConnected: true });\n\t\tthis.bindEvents(globalRadio, this.radioEvents);\n\n\t\tthis.ui = _.extend(this.ui, BigModal.prototype.ui);\n\t\tthis.events = _.extend(this.events, BigModal.prototype.events);\n\n\t\tBigModal.prototype.initialize.call(this);\n\t},\n\n\trenderForm: function renderForm() {\n\t\tvar _this2 = this;\n\n\t\tvar invalidFiles = _.filter(this.model.get(\"files\"), function (f) {\n\t\t\tif (f === null) return true;else if (f instanceof Backbone.Model && f.get(\"errors\") && _.values(f.get(\"errors\")).length > 0) return true;else if (f instanceof Backbone.Model && (_.isNil(f.get(\"errors\")) || _.values(f.get(\"errors\")).length === 0)) return false;else if (_.values(_this2.bulkDragDropHelper.getResourceModel(new Backbone.Model(_.merge(f, { file: f }))).get(\"errors\")).length > 0) return true;\n\n\t\t\treturn false;\n\t\t});\n\n\t\t// If only invalid files are present, show error view\n\t\tif (this.model.has(\"files\") && this.model.get(\"files\").length === invalidFiles.length) {\n\t\t\tthis.setUIReady();\n\t\t\tthis.trigger(\"action\", \"close\");\n\t\t\tthis.close();\n\t\t\tthis.ErrorDialog = new SmallModal({\n\t\t\t\ttitle: \"<span class='fal fa-times-circle'/> Error: No valid files found\",\n\t\t\t\tbody: \"<p>Only invalid files where detected. Please try again with valid files.</p>\\n\\t\\t\\t\\t\\t<p>The supported file types are excel, powerpoint, word, video, pdf, audio, image, text, csv flashcard deck.</p>\",\n\t\t\t\thost: \"#modals\",\n\t\t\t\thideButtons: [\"close\"],\n\t\t\t\twarning: true\n\t\t\t});\n\n\t\t\tthis.ErrorDialog.show();\n\t\t} else if (this.model.get(\"chooseFiles\") || _.filter(this.model.get(\"files\"), function (f) {\n\t\t\treturn f !== null;\n\t\t}).length > 0) {\n\t\t\tthis.bulkUploadWizard = new BulkUploadWizard({\n\t\t\t\tmodel: new Backbone.Model({ files: this.model.get(\"files\") })\n\t\t\t});\n\t\t\tthis.ui.resourceContainer.append(this.bulkUploadWizard.render().el);\n\n\t\t\tif (this.model.get(\"files\")) {\n\t\t\t\tthis.ui.chooseLabel.removeClass(\"active\");\n\t\t\t\tthis.ui.confirmLabel.addClass(\"active\");\n\t\t\t\tthis.setSaveQueue();\n\t\t\t} else {\n\t\t\t\tthis.ui.chooseLabel.addClass(\"active\");\n\t\t\t\tthis.ui.confirmLabel.removeClass(\"active\");\n\t\t\t\tthis.ui.confirmBtn.prop(\"disabled\", true);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.showError(new Errors.Model({\n\t\t\t\ttitle: \"Save Error\",\n\t\t\t\tmessage: \"Folders are not supported, rather try dragging files into this view.\",\n\t\t\t\tresponse: { status: \"folders are not supported\" }\n\t\t\t}));\n\n\t\t\tthis.bulkUploadWizard = new BulkUploadWizard({\n\t\t\t\tmodel: new Backbone.Model({})\n\t\t\t});\n\n\t\t\tthis.ui.chooseLabel.addClass(\"active\");\n\t\t\tthis.ui.confirmLabel.removeClass(\"active\");\n\t\t\tthis.ui.confirmBtn.prop(\"disabled\", true);\n\n\t\t\tthis.ui.resourceContainer.append(this.bulkUploadWizard.render().el);\n\t\t}\n\n\t\tthis.listenTo(this.bulkUploadWizard, \"files-selected\", this.onFilesSelected.bind(this));\n\t},\n\n\tonChooseLabelancelBtnClick: function onChooseLabelancelBtnClick() {\n\t\tif (!this.ui.chooseLabel.hasClass(\"disabled\")) {\n\t\t\tthis.ui.confirmLabel.removeClass(\"active\");\n\t\t\tthis.ui.chooseLabel.addClass(\"active\");\n\t\t\tthis.bulkUploadWizard.renderStep(\"choose-files\");\n\t\t}\n\t},\n\n\tonConfirmLabelancelBtnClick: function onConfirmLabelancelBtnClick() {\n\t\tif (!this.ui.chooseLabel.hasClass(\"disabled\")) {\n\t\t\tthis.ui.chooseLabel.removeClass(\"active\");\n\t\t\tthis.ui.confirmLabel.addClass(\"active\");\n\t\t\tthis.bulkUploadWizard.renderStep(\"confirm\");\n\n\t\t\tif (this.currentlySaving) this.listenTo(this.currentlySaving, \"upload:progress\", this.onUploadProgress.bind(this, this.currentlySaving.get(\"fileModel\")));\n\t\t}\n\t},\n\n\tsetSaveQueue: function setSaveQueue() {\n\t\tvar _this3 = this;\n\n\t\tvar errorCount = 0;\n\t\tvar files = this.bulkUploadWizard.fileList && this.bulkUploadWizard.fileList.collection.models ? this.bulkUploadWizard.fileList.collection.models : this.model.get(\"files\");\n\n\t\tthis.saveQueue = _.filter(files, function (file) {\n\t\t\tif (file.get(\"selected\") === false) {\n\t\t\t\t_this3.canceledFiles.push(file);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (!file.get(\"saved\") && (_.values(file.get(\"errors\")).length === 0 || file.get(\"retry\"))) {\n\t\t\t\t_this3.stopListening(file, \"upload:cancel\", _this3.onUploadCancel.bind(_this3, file));\n\t\t\t\t_this3.listenTo(file, \"upload:cancel\", _this3.onUploadCancel.bind(_this3, file));\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\terrorCount++;\n\t\t\treturn false;\n\t\t});\n\n\t\t// If all files are invalid, disable the confirm button\n\t\tif (errorCount > 0 && this.saveQueue.length === 0) this.ui.confirmBtn.prop(\"disabled\", true);\n\t},\n\n\tonFilesSelected: function onFilesSelected() {\n\t\tthis.ui.confirmBtn.prop(\"disabled\", false);\n\t},\n\n\tonConfirmBtnClick: function onConfirmBtnClick() {\n\t\tthis.ui.confirmBtn.prop(\"disabled\", true);\n\t\tthis.errorCount = 0;\n\t\tthis.uploadStarted = true;\n\n\t\tthis.ui.chooseLabel.addClass(\"disabled\");\n\n\t\tthis.setSaveQueue();\n\n\t\tif (this.model.get(\"dontSave\")) {\n\t\t\tthis.trigger(\"action\", \"save\", this.saveQueue, this.canceledFiles);\n\t\t\tthis.destroy();\n\t\t} else {\n\t\t\tthis.saveFiles();\n\t\t}\n\t},\n\n\tsaveFiles: function saveFiles() {\n\t\tif (this.saveQueue.length === 0 || this.dontSaveFiles) return;\n\n\t\tif (!this.currentlySaving) this.currentlySaving = this.saveQueue.shift();\n\n\t\tthis.listenTo(this.currentlySaving, \"upload:progress\", this.onUploadProgress.bind(this, this.currentlySaving.get(\"fileModel\")));\n\n\t\t// Save the model, uploading the file\n\t\tthis.xhr[this.currentlySaving.cid] = this.currentlySaving.binarySave(null, {\n\t\t\tvalidate: false,\n\t\t\twait: true,\n\t\t\tdata: this.currentlySaving.attributes,\n\t\t\tsuccess: this.saveSuccess.bind(this, this.currentlySaving.get(\"fileModel\")),\n\t\t\terror: this.saveError.bind(this, this.currentlySaving.get(\"fileModel\"))\n\t\t});\n\t},\n\n\tsaveSuccess: function saveSuccess(file, model) {\n\t\tthis.xhr[file.cid] = null;\n\t\tthis.setUIReady();\n\t\tmodel.trigger(\"save:success\", model);\n\t\tthis.currentlySaving = false;\n\t\tfile.set(\"saved\", true);\n\t\tmodel.set(\"saved\", true);\n\n\t\tif (this.saveQueue.length === 0 && this.errorCount === 0) {\n\t\t\tthis.trigger(\"action\", \"save\");\n\t\t\tthis.destroy();\n\t\t} else if (this.saveQueue.length === 0 && this.errorCount > 0) {\n\t\t\tthis.ui.confirmBtn.prop(\"disabled\", true);\n\t\t\tthis.ui.cancelBtn.text(\"Close\");\n\t\t}\n\n\t\tthis.saveFiles();\n\t},\n\n\tsaveError: function saveError(file, model, xhr) {\n\t\tthis.xhr[file.cid] = null;\n\t\tthis.setUIReady();\n\t\tthis.errorCount++;\n\n\t\tif (xhr.statusText === \"abort\") model.trigger(\"save:error\", { retry: true, responseJSON: { info: \"Upload suspended. Once the connection is reestablished, you can click the confirm button to try again.\" } });else model.trigger(\"save:error\", xhr);\n\n\t\tif (this.saveQueue.length > 0) this.currentlySaving = false;else this.ui.cancelBtn.text(\"Close\");\n\n\t\tif (this.model.get(\"wsConnected\")) this.saveFiles();\n\t},\n\n\tonUploadProgress: function onUploadProgress(file, percentage) {\n\t\tfile.trigger(\"upload:progress\", percentage, file);\n\t},\n\n\tonUploadCancel: function onUploadCancel(canceledFile) {\n\t\t// Set separate saveQueue to filter out saved files, canceled files and files with errors\n\t\tvar saveQueue = _.filter(this.bulkUploadWizard.fileList.collection.models, function (file) {\n\t\t\treturn file.cid !== canceledFile.cid && !file.get(\"saved\") && _.values(file.get(\"errors\")).length === 0;\n\t\t});\n\n\t\tif (saveQueue.length === 0) this.ui.confirmBtn.prop(\"disabled\", true);\n\n\t\t// remove canceledFile from this.saveQueue\n\t\tthis.saveQueue = _.reject(this.saveQueue, function (file) {\n\t\t\treturn file.cid === canceledFile.cid;\n\t\t});\n\n\t\tif (this.currentlySaving && canceledFile.cid === this.currentlySaving.cid) {\n\t\t\t// Abort communication with the server if item is in progress\n\t\t\tif (this.currentlySaving && this.xhr[this.currentlySaving.cid]) {\n\t\t\t\tthis.xhr[this.currentlySaving.cid].abort();\n\t\t\t\tthis.currentlySaving = false;\n\t\t\t\t// Revert any changes made to the model\n\t\t\t\tif (this.oldAttributes) this.model.set(this.oldAttributes, { validate: false });\n\t\t\t}\n\n\t\t\tthis.currentlySaving = false;\n\t\t}\n\n\t\tif (!this.model.get(\"dontSave\") && this.uploadStarted && this.currentlySaving === false) this.saveFiles();\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.dontSaveFiles = true;\n\t\tif (this.currentlySaving && this.xhr[this.currentlySaving.cid]) this.xhr[this.currentlySaving.cid].abort();\n\n\t\tif (this.saveQueue && this.saveQueue.length > 0) {\n\t\t\t_.forOwn(this.xhr, function (value, key) {\n\t\t\t\tif (key !== \"abort\" && !_.isNil(value)) value.abort();\n\t\t\t});\n\t\t}\n\n\t\tthis.saveQueue = [];\n\t\tthis.trigger(\"action\", _.toLower(this.ui.cancelBtn.text()));\n\t},\n\n\twsConnected: function wsConnected() {\n\t\tthis.model.set({ wsConnected: true });\n\t\tthis.ui.confirmBtn.prop(\"disabled\", false);\n\n\t\tthis.setUIVisible();\n\t\tthis.setStatusReady();\n\n\t\tif (this.ErrorView) {\n\t\t\tthis.ErrorView.destroy();\n\t\t\tthis.ErrorView = null;\n\t\t}\n\n\t\tglobalRadio.trigger(App.Events.Commands.Toast, {\n\t\t\tcontent: \"The connection has been reestablished.\",\n\t\t\ticon: \"fa-wifi\",\n\t\t\ticonColour: \"green\",\n\t\t\thost: \"#modals\"\n\t\t});\n\t},\n\n\twsDisconnected: function wsDisconnected() {\n\t\tthis.model.set({ wsConnected: false });\n\t\tif (this.currentlySaving && this.xhr[this.currentlySaving.cid]) {\n\t\t\tthis.xhr[this.currentlySaving.cid].abort();\n\t\t\t// readd this.currentlySaving to saveQueue\n\t\t\tthis.saveQueue.unshift(this.currentlySaving);\n\t\t\tthis.currentlySaving = false;\n\t\t}\n\n\t\tthis.showError(new Errors.Model({\n\t\t\ttitle: \"Save Error\",\n\t\t\tmessage: \"Connectivity lost. The upload has been suspended.\",\n\t\t\tresponse: { status: \"Connection to server lost\" }\n\t\t}));\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJ1bGtSZXNvdXJjZVVwbG9hZE1vZGFsLmpzIl0sIm5hbWVzIjpbIiQiLCJyZXF1aXJlIiwiXyIsIkJhY2tib25lIiwiQnVsa0RyYWdEcm9wSGVscGVyIiwiRHJhZ0Ryb3BGaWxlQ2hvb3NlciIsIkVycm9ycyIsIkJpZ01vZGFsIiwiQXBwIiwiZ2xvYmFsUmFkaW8iLCJSYWRpbyIsImNoYW5uZWwiLCJTbWFsbE1vZGFsIiwiSXRlbSIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiZXh0ZW5kIiwidGVtcGxhdGUiLCJsaXN0SXRlbSIsInRhZ05hbWUiLCJ1aSIsIml0ZW0iLCJzdGF0dXNJY29uIiwiY2FuY2VsQnV0dG9uIiwiZXJyb3JCdXR0b24iLCJjb21wbGV0ZWRCdXR0b24iLCJwcm9ncmVzc0JhciIsImV2ZW50cyIsIm1vZGVsRXZlbnRzIiwidGVtcGxhdGVDb250ZXh0IiwiZmlsZVNpemUiLCJlcnJvck1lc3NhZ2UiLCJnZXRFcnJvck1lc3NhZ2UiLCJoYXNFcnJvciIsInZhbHVlcyIsIm1vZGVsIiwiZ2V0IiwibGVuZ3RoIiwiZXJyb3JzQXJyYXkiLCJwaWNrQnkiLCJ2YWx1ZSIsImtleSIsImVuZHNXaXRoIiwiaW5pdGlhbGl6ZSIsInNldCIsImJpbmRFdmVudHMiLCJwZXJjZW50YWdlIiwiam9pbiIsImZpbGVNb2RlbCIsImkiLCJNYXRoIiwiZmxvb3IiLCJsb2ciLCJzaXplcyIsIk51bWJlciIsInBvdyIsInRvRml4ZWQiLCJvblVwbG9hZFN0YXJ0ZWQiLCJyZW5kZXIiLCJvbkNhbmNlbENsaWNrIiwidHJpZ2dlciIsImNvbGxlY3Rpb24iLCJyZW1vdmUiLCJkZXN0cm95Iiwib25VcGxvYWRQcm9ncmVzcyIsImFuaW1hdGUiLCJ3aWR0aCIsInNhdmVTdWNjZXNzIiwiYWRkQ2xhc3MiLCJyZW1vdmVDbGFzcyIsInNhdmVFcnJvciIsInhociIsImVycm9ycyIsImVycm9yIiwicmVzcG9uc2VKU09OIiwiaW5mbyIsInJldHJ5Iiwib25TY3JvbGxJbnRvVmlld0NoYW5nZSIsInNjcm9sbFRvcCIsIiRlbCIsInBvc2l0aW9uIiwidG9wIiwiTGlzdCIsIkNvbGxlY3Rpb25WaWV3IiwiY2hpbGRWaWV3IiwiY2hpbGRWaWV3VHJpZ2dlcnMiLCJCdWxrVXBsb2FkV2l6YXJkIiwiY2xhc3NOYW1lIiwid2l6YXJkIiwicmVnaW9ucyIsImZpbGVDaG9vc2VyIiwicmVzb3VyY2VTZWxlY3RvciIsInZlcmlmeSIsInNlbGVjdEFsbCIsInJlc291cmNlRXJyb3IiLCJzbWFydFNlbGVjdCIsImRlc2VsZWN0IiwiY29uZmlybSIsImNvbmZpcm1MaXN0IiwiY29uZmlybUxpc3RIZWFkZXIiLCJidWxrRHJhZ0Ryb3BIZWxwZXIiLCJzZWxlY3RlZEZpbGVzIiwib25SZW5kZXIiLCJzZXRTZWxlY3RlZEZpbGVzIiwicmVuZGVyU3RlcCIsInN0ZXAiLCJmaWx0ZXIiLCJmaWxlIiwiYWNjZXB0ZWRGaWxlVHlwZXMiLCJoZWlnaHQiLCJtdWx0aXBsZSIsImxpc3RlblRvIiwib25GaWxlc1NlbGVjdGVkIiwiYmluZCIsInNob3dDaGlsZFZpZXciLCJmaWxlTGlzdCIsIkNvbGxlY3Rpb24iLCJodG1sIiwiYXBwZW5kIiwiZWwiLCJmaWxlcyIsImNvbmNhdCIsIm1hcCIsImYiLCJNb2RlbCIsImdldFJlc291cmNlTW9kZWwiLCJtZXJnZSIsInNob3dFcnJvciIsIm1vZHVsZSIsImV4cG9ydHMiLCJyZXNvdXJjZUNvbnRhaW5lciIsImNvbmZpcm1CdG4iLCJjYW5jZWxCdG4iLCJjaG9vc2VMYWJlbCIsImNvbmZpcm1MYWJlbCIsInJhZGlvRXZlbnRzIiwiRXZlbnRzIiwiV2Vic29ja2V0Q29ubmVjdGVkIiwiV2Vic29ja2V0RGlzY29ubmVjdGVkIiwib3B0aW9ucyIsImJpbmRBbGwiLCJPcHRpb25zIiwiY2xhc3NlcyIsImNvbnRhaW5lciIsImNyZWF0ZUljb24iLCJidXR0b25zIiwiY3JlYXRlIiwidHlwZSIsImxhYmVsIiwibW9kZSIsInZhbGlkYXRlIiwic2F2ZSIsImNhbmNlbCIsImNyZWF0ZVZlcmIiLCJkYXRhTm91biIsInNpemVDb25zdHJhaW50cyIsIm1pbkhlaWdodCIsIm1pbldpZHRoIiwiaG9zdCIsImNhbmNlbGVkRmlsZXMiLCJhYm9ydCIsIm5vb3AiLCJ3c0Nvbm5lY3RlZCIsInByb3RvdHlwZSIsImNhbGwiLCJyZW5kZXJGb3JtIiwiaW52YWxpZEZpbGVzIiwiaXNOaWwiLCJoYXMiLCJzZXRVSVJlYWR5IiwiY2xvc2UiLCJFcnJvckRpYWxvZyIsInRpdGxlIiwiYm9keSIsImhpZGVCdXR0b25zIiwid2FybmluZyIsInNob3ciLCJidWxrVXBsb2FkV2l6YXJkIiwic2V0U2F2ZVF1ZXVlIiwicHJvcCIsIm1lc3NhZ2UiLCJyZXNwb25zZSIsInN0YXR1cyIsIm9uQ2hvb3NlTGFiZWxhbmNlbEJ0bkNsaWNrIiwiaGFzQ2xhc3MiLCJvbkNvbmZpcm1MYWJlbGFuY2VsQnRuQ2xpY2siLCJjdXJyZW50bHlTYXZpbmciLCJlcnJvckNvdW50IiwibW9kZWxzIiwic2F2ZVF1ZXVlIiwicHVzaCIsInN0b3BMaXN0ZW5pbmciLCJvblVwbG9hZENhbmNlbCIsIm9uQ29uZmlybUJ0bkNsaWNrIiwidXBsb2FkU3RhcnRlZCIsInNhdmVGaWxlcyIsImRvbnRTYXZlRmlsZXMiLCJzaGlmdCIsImNpZCIsImJpbmFyeVNhdmUiLCJ3YWl0IiwiZGF0YSIsImF0dHJpYnV0ZXMiLCJzdWNjZXNzIiwidGV4dCIsInN0YXR1c1RleHQiLCJjYW5jZWxlZEZpbGUiLCJyZWplY3QiLCJvbGRBdHRyaWJ1dGVzIiwib25CZWZvcmVEZXN0cm95IiwiZm9yT3duIiwidG9Mb3dlciIsInNldFVJVmlzaWJsZSIsInNldFN0YXR1c1JlYWR5IiwiRXJyb3JWaWV3IiwiQ29tbWFuZHMiLCJUb2FzdCIsImNvbnRlbnQiLCJpY29uIiwiaWNvbkNvbG91ciIsIndzRGlzY29ubmVjdGVkIiwidW5zaGlmdCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsSUFBSUQsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNRSxXQUFXRixRQUFRLFVBQVIsQ0FBakI7O0FBRUEsSUFBTUcscUJBQXFCSCxRQUFRLHNCQUFSLENBQTNCO0FBQ0EsSUFBTUksc0JBQXNCSixRQUFRLHVCQUFSLENBQTVCO0FBQ0EsSUFBTUssU0FBU0wsUUFBUSxhQUFSLENBQWY7O0FBRUEsSUFBTU0sV0FBV04sUUFBUSxZQUFSLENBQWpCO0FBQ0EsSUFBTU8sTUFBTVAsUUFBUSxVQUFSLENBQVo7QUFDQSxJQUFNUSxjQUFjTixTQUFTTyxLQUFULENBQWVDLE9BQWYsQ0FBdUIsUUFBdkIsQ0FBcEI7QUFDQSxJQUFNQyxhQUFhWCxRQUFRLGNBQVIsQ0FBbkI7O0FBRUEsSUFBTVksT0FBT1YsU0FBU1csVUFBVCxDQUFvQkMsSUFBcEIsQ0FBeUJDLE1BQXpCLENBQWdDO0FBQzVDQyxXQUFVaEIsUUFBUSwwQ0FBUixFQUFvRGlCLFFBRGxCO0FBRTVDQyxVQUFTLElBRm1DOztBQUk1Q0MsS0FBSTtBQUNIQyxRQUFNLFlBREg7QUFFSEMsY0FBWSxjQUZUO0FBR0hDLGdCQUFjLGVBSFg7QUFJSEMsZUFBYSxjQUpWO0FBS0hDLG1CQUFpQixrQkFMZDtBQU1IQyxlQUFhO0FBTlYsRUFKd0M7O0FBYTVDQyxTQUFRO0FBQ1AsNEJBQTBCLGVBRG5CO0FBRVAsMkJBQXlCO0FBRmxCLEVBYm9DOztBQWtCNUNDLGNBQWE7QUFDWixxQkFBbUIsa0JBRFA7QUFFWixrQkFBZ0IsYUFGSjtBQUdaLGdCQUFjLFdBSEY7QUFJWiwyQkFBeUIsd0JBSmI7QUFLWiwwQkFBd0I7QUFMWixFQWxCK0I7O0FBMEI1Q0Msa0JBQWlCLDJCQUFXO0FBQzNCLFNBQU87QUFDTkMsYUFBVSxLQUFLQSxRQUFMLEVBREo7QUFFTkMsaUJBQWMsS0FBS0MsZUFBTCxFQUZSO0FBR05DLGFBQVUvQixFQUFFZ0MsTUFBRixDQUFTLEtBQUtDLEtBQUwsQ0FBV0MsR0FBWCxDQUFlLFFBQWYsQ0FBVCxFQUFtQ0MsTUFBbkMsR0FBNEMsQ0FBNUMsSUFBaUQsS0FBS0YsS0FBTCxDQUFXQyxHQUFYLENBQWUsVUFBZixNQUErQixTQUhwRjtBQUlORSxnQkFBYXBDLEVBQUVnQyxNQUFGLENBQVNoQyxFQUFFcUMsTUFBRixDQUFTLEtBQUtKLEtBQUwsQ0FBV0MsR0FBWCxDQUFlLFFBQWYsQ0FBVCxFQUFtQyxVQUFDSSxLQUFELEVBQVFDLEdBQVI7QUFBQSxXQUFnQnZDLEVBQUV3QyxRQUFGLENBQVdELEdBQVgsRUFBZ0IsYUFBaEIsQ0FBaEI7QUFBQSxJQUFuQyxDQUFUO0FBSlAsR0FBUDtBQU1BLEVBakMyQzs7QUFtQzVDRSxhQUFZLHNCQUFXO0FBQ3RCLE9BQUtSLEtBQUwsQ0FBV1MsR0FBWCxDQUFlLGVBQWYsRUFBZ0MsS0FBaEM7QUFDQSxPQUFLQyxVQUFMLENBQWdCLEtBQUtWLEtBQXJCLEVBQTRCLEtBQUtQLFdBQWpDO0FBQ0EsT0FBS2tCLFVBQUwsR0FBa0IsQ0FBbEI7QUFDQSxFQXZDMkM7O0FBeUM1Q2Qsa0JBQWlCLDJCQUFXO0FBQzNCLE1BQUk5QixFQUFFZ0MsTUFBRixDQUFTLEtBQUtDLEtBQUwsQ0FBV0MsR0FBWCxDQUFlLFFBQWYsQ0FBVCxFQUFtQ0MsTUFBbkMsR0FBNEMsQ0FBaEQsRUFBbUQ7QUFDbEQsVUFBT25DLEVBQUVnQyxNQUFGLENBQVMsS0FBS0MsS0FBTCxDQUFXQyxHQUFYLENBQWUsUUFBZixDQUFULEVBQW1DVyxJQUFuQyxDQUF3QyxJQUF4QyxLQUNMLEtBQUtaLEtBQUwsQ0FBV0MsR0FBWCxDQUFlLE9BQWYsSUFBMEIsRUFBMUIsR0FBK0IsOEZBRDFCLEtBRUwsS0FBS0QsS0FBTCxDQUFXQyxHQUFYLENBQWUsVUFBZixNQUErQixTQUEvQixHQUEyQyw0R0FBM0MsR0FBMEosRUFGckosQ0FBUDtBQUdBOztBQUVELFNBQU8sRUFBUDtBQUNBLEVBakQyQzs7QUFtRDVDTixXQUFVLG9CQUFXO0FBQ3BCLE1BQU1rQixZQUFZLEtBQUtiLEtBQUwsQ0FBV0MsR0FBWCxDQUFlLFdBQWYsSUFBOEIsS0FBS0QsS0FBTCxDQUFXQyxHQUFYLENBQWUsV0FBZixDQUE5QixHQUE0RCxLQUFLRCxLQUFuRjtBQUNBLE1BQU1jLElBQUlDLEtBQUtDLEtBQUwsQ0FBV0QsS0FBS0UsR0FBTCxDQUFTSixVQUFVWixHQUFWLENBQWMsTUFBZCxDQUFULElBQWtDYyxLQUFLRSxHQUFMLENBQVMsSUFBVCxDQUE3QyxDQUFWO0FBQUEsTUFDQ0MsUUFBUSxDQUFDLEdBQUQsRUFBTSxJQUFOLEVBQVksSUFBWixFQUFrQixJQUFsQixFQUF3QixJQUF4QixFQUE4QixJQUE5QixFQUFvQyxJQUFwQyxFQUEwQyxJQUExQyxFQUFnRCxJQUFoRCxDQURUOztBQUdBLFNBQU9DLE9BQU8sQ0FBQ04sVUFBVVosR0FBVixDQUFjLE1BQWQsSUFBd0JjLEtBQUtLLEdBQUwsQ0FBUyxJQUFULEVBQWVOLENBQWYsQ0FBekIsRUFBNENPLE9BQTVDLENBQW9ELENBQXBELENBQVAsSUFBaUUsQ0FBakUsR0FBcUUsR0FBckUsR0FBMkVILE1BQU1KLENBQU4sQ0FBbEY7QUFDQSxFQXpEMkM7O0FBMkQ1Q1Esa0JBQWlCLDJCQUFXO0FBQzNCLE1BQUksS0FBS3RCLEtBQUwsQ0FBV0MsR0FBWCxDQUFlLGVBQWYsQ0FBSixFQUFxQztBQUNwQyxRQUFLRCxLQUFMLENBQVdTLEdBQVgsQ0FBZSxRQUFmLEVBQXlCLEVBQXpCO0FBQ0EsUUFBS2MsTUFBTDtBQUNBO0FBQ0QsRUFoRTJDOztBQWtFNUNDLGdCQUFlLHlCQUFXO0FBQ3pCLE9BQUt4QixLQUFMLENBQVdTLEdBQVgsQ0FBZSxVQUFmLEVBQTJCLEtBQTNCO0FBQ0EsT0FBS1QsS0FBTCxDQUFXeUIsT0FBWCxDQUFtQixlQUFuQixFQUFvQyxLQUFLekIsS0FBekM7QUFDQSxPQUFLQSxLQUFMLENBQVcwQixVQUFYLENBQXNCQyxNQUF0QixDQUE2QixLQUFLM0IsS0FBbEM7QUFDQSxPQUFLNEIsT0FBTDtBQUNBLEVBdkUyQzs7QUF5RTVDQyxtQkFBa0IsMEJBQVNsQixVQUFULEVBQXFCO0FBQ3RDLE1BQUksS0FBS0EsVUFBTCxJQUFtQkEsVUFBdkIsRUFBbUM7QUFDbEMsUUFBSzFCLEVBQUwsQ0FBUU0sV0FBUixDQUFvQnVDLE9BQXBCLENBQTRCLEVBQUVDLE9BQU9wQixhQUFhLEdBQXRCLEVBQTVCO0FBQ0EsUUFBS0EsVUFBTCxHQUFrQkEsVUFBbEI7QUFDQTs7QUFFRCxNQUFJLENBQUMsS0FBS1gsS0FBTCxDQUFXQyxHQUFYLENBQWUsZ0JBQWYsQ0FBTCxFQUNDLEtBQUtELEtBQUwsQ0FBV1MsR0FBWCxDQUFlLGdCQUFmLEVBQWlDLElBQWpDOztBQUVELE1BQUksQ0FBQyxLQUFLVCxLQUFMLENBQVdDLEdBQVgsQ0FBZSxlQUFmLENBQUwsRUFDQyxLQUFLRCxLQUFMLENBQVdTLEdBQVgsQ0FBZSxlQUFmLEVBQWdDLElBQWhDO0FBQ0QsRUFwRjJDOztBQXNGNUN1QixjQUFhLHVCQUFXO0FBQ3ZCLE9BQUsvQyxFQUFMLENBQVFNLFdBQVIsQ0FBb0J1QyxPQUFwQixDQUE0QixFQUFFQyxPQUFPLE1BQVQsRUFBNUI7QUFDQSxPQUFLcEIsVUFBTCxHQUFrQixHQUFsQjtBQUNBLE9BQUsxQixFQUFMLENBQVFHLFlBQVIsQ0FBcUI2QyxRQUFyQixDQUE4QixNQUE5QjtBQUNBLE9BQUtoRCxFQUFMLENBQVFLLGVBQVIsQ0FBd0I0QyxXQUF4QixDQUFvQyxNQUFwQztBQUNBLE9BQUtsQyxLQUFMLENBQVdTLEdBQVgsQ0FBZSxnQkFBZixFQUFpQyxLQUFqQztBQUNBLEVBNUYyQzs7QUE4RjVDMEIsWUFBVyxtQkFBU0MsR0FBVCxFQUFjO0FBQ3hCLE9BQUtuRCxFQUFMLENBQVFNLFdBQVIsQ0FBb0J1QyxPQUFwQixDQUE0QixFQUFFQyxPQUFPLElBQVQsRUFBNUI7QUFDQSxPQUFLcEIsVUFBTCxHQUFrQixDQUFsQjtBQUNBLE9BQUtYLEtBQUwsQ0FBV1MsR0FBWCxDQUFlLGdCQUFmLEVBQWlDLEtBQWpDO0FBQ0EsT0FBS1QsS0FBTCxDQUFXUyxHQUFYLENBQWUsZUFBZixFQUFnQyxLQUFoQzs7QUFFQSxNQUFNNEIsU0FBUyxFQUFFQyxPQUFPRixJQUFJRyxZQUFKLENBQWlCQyxJQUExQixFQUFmO0FBQ0EsT0FBS3hDLEtBQUwsQ0FBV1MsR0FBWCxDQUFlLFFBQWYsRUFBeUI0QixNQUF6QjtBQUNBLE1BQUlELElBQUlLLEtBQVIsRUFDQyxLQUFLekMsS0FBTCxDQUFXUyxHQUFYLENBQWUsT0FBZixFQUF3QixJQUF4Qjs7QUFFRCxPQUFLYyxNQUFMO0FBQ0EsRUExRzJDOztBQTRHNUNtQix5QkFBd0Isa0NBQVc7QUFDbEMsTUFBSSxLQUFLMUMsS0FBTCxDQUFXQyxHQUFYLENBQWUsZ0JBQWYsQ0FBSixFQUFzQztBQUNyQ3BDLEtBQUUsaUJBQUYsRUFBcUJpRSxPQUFyQixDQUE2QjtBQUM1QmEsZUFBVyxLQUFLQyxHQUFMLENBQVNDLFFBQVQsR0FBb0JDLEdBQXBCLEdBQTBCO0FBRFQsSUFBN0IsRUFFRyxHQUZIO0FBR0E7QUFDRDtBQWxIMkMsQ0FBaEMsQ0FBYjs7QUFxSEEsSUFBTUMsT0FBTy9FLFNBQVNXLFVBQVQsQ0FBb0JxRSxjQUFwQixDQUFtQ25FLE1BQW5DLENBQTBDO0FBQ3REb0UsWUFBV3ZFLElBRDJDO0FBRXRETSxVQUFTLE9BRjZDO0FBR3REa0Usb0JBQW1CO0FBQ2xCLG9CQUFrQixzQkFEQTtBQUVsQixvQkFBa0I7QUFGQTtBQUhtQyxDQUExQyxDQUFiOztBQVNBLElBQU1DLG1CQUFtQm5GLFNBQVNXLFVBQVQsQ0FBb0JDLElBQXBCLENBQXlCQyxNQUF6QixDQUFnQztBQUN4RHVFLFlBQVcsZ0NBRDZDOztBQUd4RHRFLFdBQVVoQixRQUFRLDBDQUFSLEVBQW9EdUYsTUFITjs7QUFLeERDLFVBQVM7QUFDUkMsZUFBYTtBQURMLEVBTCtDOztBQVN4RHRFLEtBQUk7QUFDSHVFLG9CQUFrQixtQkFEZjtBQUVIQyxVQUFRLFNBRkw7QUFHSEMsYUFBVyxhQUhSO0FBSUhDLGlCQUFlLGdCQUpaO0FBS0hDLGVBQWEsY0FMVjtBQU1IQyxZQUFVLGlCQU5QO0FBT0gsa0JBQWdCLGVBUGI7QUFRSEMsV0FBUyxVQVJOO0FBU0hDLGVBQWEsd0JBVFY7QUFVSEMscUJBQW1CO0FBVmhCLEVBVG9EOztBQXNCeER2RSxjQUFhO0FBQ1osb0JBQWtCO0FBRE4sRUF0QjJDOztBQTBCeERlLGFBQVksc0JBQVc7QUFDdEIsT0FBS3lELGtCQUFMLEdBQTBCLElBQUloRyxrQkFBSixFQUExQjtBQUNBLE9BQUtpRyxhQUFMLEdBQXFCLEVBQXJCO0FBQ0EsRUE3QnVEOztBQStCeERDLFdBQVUsb0JBQVc7QUFDcEIsTUFBSSxLQUFLbkUsS0FBTCxDQUFXQyxHQUFYLENBQWUsU0FBZixDQUFKLEVBQ0M7O0FBRUQsTUFBSSxLQUFLRCxLQUFMLENBQVdDLEdBQVgsQ0FBZSxPQUFmLENBQUosRUFBNkI7QUFDNUIsUUFBS21FLGdCQUFMLENBQXNCLEtBQUtwRSxLQUFMLENBQVdDLEdBQVgsQ0FBZSxPQUFmLENBQXRCOztBQUVBLFFBQUtvRSxVQUFMLENBQWdCLFNBQWhCO0FBQ0EsR0FKRCxNQUtLO0FBQ0osUUFBS0EsVUFBTCxDQUFnQixjQUFoQjtBQUNBO0FBQ0QsRUEzQ3VEOztBQTZDeERBLGFBQVksb0JBQVNDLElBQVQsRUFBZTtBQUMxQjtBQUNBLE9BQUtKLGFBQUwsR0FBcUJuRyxFQUFFd0csTUFBRixDQUFTLEtBQUtMLGFBQWQsRUFBNkI7QUFBQSxVQUFRTSxLQUFLdkUsR0FBTCxDQUFTLFVBQVQsTUFBeUIsS0FBakM7QUFBQSxHQUE3QixDQUFyQjtBQUNBLE1BQUlxRSxTQUFTLGNBQWIsRUFBNkI7QUFDNUIsUUFBS2YsV0FBTCxHQUFtQixJQUFJckYsbUJBQUosQ0FBd0I7QUFDMUN1Ryx1QkFBbUIsQ0FBQyxNQUFELEVBQVMsWUFBVCxFQUF1QixXQUF2QixFQUFvQyxNQUFwQyxFQUE0QyxPQUE1QyxFQUFxRCwwQkFBckQsRUFBaUYsbUVBQWpGLEVBQ2xCLE1BRGtCLEVBQ1YsVUFEVSxFQUNFLFlBREYsRUFDZ0IsTUFEaEIsRUFDd0IsT0FEeEIsRUFDaUMsTUFEakMsRUFDeUMsTUFEekMsRUFDaUQsV0FEakQsRUFDOEQsWUFEOUQsRUFDNEUsV0FENUUsRUFDeUYsTUFEekYsRUFDaUcsaUJBRGpHLEVBQ29ILE1BRHBILEVBQzRILE9BRDVILEVBRWxCLE1BRmtCLEVBRVYsT0FGVSxFQUVELE1BRkMsRUFFTyxXQUZQLEVBRW9CLE1BRnBCLEVBRTRCLE9BRjVCLEVBRXFDLG9CQUZyQyxFQUUyRCx5RUFGM0QsRUFHbEIsK0JBSGtCLEVBR2UsMkVBSGYsRUFJbEIsK0JBSmtCLEVBSWUsd0VBSmYsQ0FEdUI7QUFNMUNDLFlBQVEsTUFOa0M7QUFPMUNDLGNBQVU7QUFQZ0MsSUFBeEIsQ0FBbkI7QUFTQSxRQUFLQyxRQUFMLENBQWMsS0FBS3JCLFdBQW5CLEVBQWdDLFVBQWhDLEVBQTRDLEtBQUtzQixlQUFMLENBQXFCQyxJQUFyQixDQUEwQixJQUExQixDQUE1QztBQUNBLFFBQUtDLGFBQUwsQ0FBbUIsYUFBbkIsRUFBa0MsS0FBS3hCLFdBQXZDO0FBQ0EsUUFBS3RFLEVBQUwsQ0FBUTZFLE9BQVIsQ0FBZ0I3QixRQUFoQixDQUF5QixNQUF6QjtBQUNBLFFBQUtoRCxFQUFMLENBQVEsY0FBUixFQUF3QmlELFdBQXhCLENBQW9DLE1BQXBDO0FBQ0EsR0FkRCxNQWVLLElBQUlvQyxTQUFTLFNBQWIsRUFBd0I7QUFDNUJ6RyxLQUFFLHVCQUFGLEVBQTJCcUUsV0FBM0IsQ0FBdUMsUUFBdkM7QUFDQXJFLEtBQUUsMEJBQUYsRUFBOEJvRSxRQUE5QixDQUF1QyxRQUF2QztBQUNBLFFBQUsrQyxRQUFMLEdBQWdCLElBQUlqQyxJQUFKLENBQVM7QUFDeEJyQixnQkFBWSxJQUFJMUQsU0FBU2lILFVBQWIsQ0FBd0IsS0FBS2YsYUFBN0I7QUFEWSxJQUFULENBQWhCOztBQUlBLFFBQUtqRixFQUFMLENBQVE4RSxXQUFSLENBQW9CbUIsSUFBcEIsQ0FBeUIsS0FBS2pHLEVBQUwsQ0FBUStFLGlCQUFSLENBQTBCa0IsSUFBMUIsRUFBekI7QUFDQSxRQUFLakcsRUFBTCxDQUFROEUsV0FBUixDQUFvQm9CLE1BQXBCLENBQTJCLEtBQUtILFFBQUwsQ0FBY3pELE1BQWQsR0FBdUI2RCxFQUFsRDtBQUNBLFFBQUtuRyxFQUFMLENBQVEsY0FBUixFQUF3QmdELFFBQXhCLENBQWlDLE1BQWpDO0FBQ0EsUUFBS2hELEVBQUwsQ0FBUTZFLE9BQVIsQ0FBZ0I1QixXQUFoQixDQUE0QixNQUE1QjtBQUNBO0FBQ0QsRUEzRXVEOztBQTZFeEQyQyxrQkFBaUIseUJBQVNRLEtBQVQsRUFBZ0I7QUFDaEMsT0FBS2pCLGdCQUFMLENBQXNCaUIsS0FBdEI7O0FBRUEsT0FBS2hCLFVBQUwsQ0FBZ0IsU0FBaEI7QUFDQSxPQUFLNUMsT0FBTCxDQUFhLGdCQUFiO0FBQ0EsRUFsRnVEOztBQW9GeEQyQyxtQkFBa0IsMEJBQVNpQixLQUFULEVBQWdCO0FBQUE7O0FBQ2pDLE9BQUtuQixhQUFMLEdBQXFCbkcsRUFBRXVILE1BQUYsQ0FDcEIsS0FBS3BCLGFBRGUsRUFFcEJuRyxFQUFFd0gsR0FBRixDQUFNeEgsRUFBRXdHLE1BQUYsQ0FBU2MsS0FBVCxFQUFnQjtBQUFBLFVBQUtHLE1BQU0sSUFBWDtBQUFBLEdBQWhCLENBQU4sRUFBd0M7QUFBQSxVQUFTaEIsZ0JBQWdCeEcsU0FBU3lILEtBQXpCLEdBQWlDakIsSUFBakMsR0FBd0MsTUFBS1Asa0JBQUwsQ0FBd0J5QixnQkFBeEIsQ0FBeUMsSUFBSTFILFNBQVN5SCxLQUFiLENBQW1CMUgsRUFBRTRILEtBQUYsQ0FBUW5CLElBQVIsRUFBYyxFQUFFQSxVQUFGLEVBQWQsQ0FBbkIsQ0FBekMsQ0FBakQ7QUFBQSxHQUF4QyxDQUZvQixDQUFyQjtBQUlBLEVBekZ1RDs7QUEyRnhEb0IsWUFBVyxtQkFBU3RELEtBQVQsRUFBZ0I7QUFDMUIsT0FBS3JELEVBQUwsQ0FBUTBFLGFBQVIsQ0FBc0J1QixJQUF0QixDQUEyQjVDLEtBQTNCO0FBQ0E7QUE3RnVELENBQWhDLENBQXpCOztBQWdHQXVELE9BQU9DLE9BQVAsR0FBaUIxSCxTQUFTUyxNQUFULENBQWdCO0FBQ2hDSSxLQUFJO0FBQ0g4RyxxQkFBbUIsdUJBRGhCO0FBRUhDLGNBQVksdUJBRlQ7QUFHSEMsYUFBVyx1QkFIUjtBQUlIQyxlQUFhLG9CQUpWO0FBS0hDLGdCQUFjO0FBTFgsRUFENEI7O0FBU2hDM0csU0FBUTtBQUNQLDBCQUF3QixtQkFEakI7QUFFUCwyQkFBeUIsNEJBRmxCO0FBR1AsNEJBQTBCO0FBSG5CLEVBVHdCOztBQWVoQzRHLGdFQUNFL0gsSUFBSWdJLE1BQUosQ0FBV0Msa0JBRGIsRUFDa0MsYUFEbEMsaUNBRUVqSSxJQUFJZ0ksTUFBSixDQUFXRSxxQkFGYixFQUVxQyxnQkFGckMsZ0JBZmdDOztBQW9CaEMvRixhQUFZLG9CQUFTZ0csT0FBVCxFQUFrQjtBQUM3QnpJLElBQUUwSSxPQUFGLENBQVUsSUFBVjs7QUFFQSxPQUFLQyxPQUFMLEdBQWU7QUFDZEMsWUFBUyxDQUFDLHVCQUFELENBREs7QUFFZDdILGFBQVVoQixRQUFRLDBDQUFSLEVBQW9EOEksU0FGaEQ7QUFHZEMsZUFBWSx3QkFIRTtBQUlkQyxZQUFTO0FBQ1JDLFlBQVE7QUFDUEMsV0FBTSxRQURDO0FBRVBDLFlBQU8sU0FGQTtBQUdQQyxXQUFNLFFBSEM7QUFJUEMsZUFBVSxLQUpIO0FBS1BDLFdBQU07QUFMQyxLQURBO0FBUVJDLFlBQVE7QUFDUEwsV0FBTSxRQURDO0FBRVBDLFlBQU87QUFGQTtBQVJBLElBSks7QUFpQmRLLGVBQVkseUJBakJFO0FBa0JkQyxhQUFVLElBbEJJO0FBbUJkQyxvQkFBaUI7QUFDaEJDLGVBQVcsTUFESztBQUVoQkMsY0FBVTtBQUZNLElBbkJIO0FBdUJkQyxTQUFNbkIsUUFBUW1CO0FBdkJBLEdBQWY7O0FBMEJBLE9BQUsxRCxrQkFBTCxHQUEwQixJQUFJaEcsa0JBQUosRUFBMUI7QUFDQSxPQUFLMkosYUFBTCxHQUFxQixFQUFyQjtBQUNBLE9BQUt4RixHQUFMLEdBQVc7QUFDVnlGLFVBQU8saUJBQVc7QUFDakIsV0FBTzlKLEVBQUUrSixJQUFGLEVBQVA7QUFDQTtBQUhTLEdBQVg7O0FBTUEsT0FBSzlILEtBQUwsQ0FBV1MsR0FBWCxDQUFlLEVBQUVzSCxhQUFhLElBQWYsRUFBZjtBQUNBLE9BQUtySCxVQUFMLENBQWdCcEMsV0FBaEIsRUFBNkIsS0FBSzhILFdBQWxDOztBQUVBLE9BQUtuSCxFQUFMLEdBQVVsQixFQUFFYyxNQUFGLENBQVMsS0FBS0ksRUFBZCxFQUFrQmIsU0FBUzRKLFNBQVQsQ0FBbUIvSSxFQUFyQyxDQUFWO0FBQ0EsT0FBS08sTUFBTCxHQUFjekIsRUFBRWMsTUFBRixDQUFTLEtBQUtXLE1BQWQsRUFBc0JwQixTQUFTNEosU0FBVCxDQUFtQnhJLE1BQXpDLENBQWQ7O0FBRUFwQixXQUFTNEosU0FBVCxDQUFtQnhILFVBQW5CLENBQThCeUgsSUFBOUIsQ0FBbUMsSUFBbkM7QUFDQSxFQWhFK0I7O0FBa0VoQ0MsYUFBWSxzQkFBVztBQUFBOztBQUN0QixNQUFNQyxlQUFlcEssRUFBRXdHLE1BQUYsQ0FBUyxLQUFLdkUsS0FBTCxDQUFXQyxHQUFYLENBQWUsT0FBZixDQUFULEVBQWtDLGFBQUs7QUFDM0QsT0FBSXVGLE1BQU0sSUFBVixFQUNDLE9BQU8sSUFBUCxDQURELEtBRUssSUFBSUEsYUFBYXhILFNBQVN5SCxLQUF0QixJQUErQkQsRUFBRXZGLEdBQUYsQ0FBTSxRQUFOLENBQS9CLElBQWtEbEMsRUFBRWdDLE1BQUYsQ0FBU3lGLEVBQUV2RixHQUFGLENBQU0sUUFBTixDQUFULEVBQTBCQyxNQUExQixHQUFtQyxDQUF6RixFQUNKLE9BQU8sSUFBUCxDQURJLEtBRUEsSUFBSXNGLGFBQWF4SCxTQUFTeUgsS0FBdEIsS0FBZ0MxSCxFQUFFcUssS0FBRixDQUFRNUMsRUFBRXZGLEdBQUYsQ0FBTSxRQUFOLENBQVIsS0FBNEJsQyxFQUFFZ0MsTUFBRixDQUFTeUYsRUFBRXZGLEdBQUYsQ0FBTSxRQUFOLENBQVQsRUFBMEJDLE1BQTFCLEtBQXFDLENBQWpHLENBQUosRUFDSixPQUFPLEtBQVAsQ0FESSxLQUVBLElBQUluQyxFQUFFZ0MsTUFBRixDQUFTLE9BQUtrRSxrQkFBTCxDQUF3QnlCLGdCQUF4QixDQUF5QyxJQUFJMUgsU0FBU3lILEtBQWIsQ0FBbUIxSCxFQUFFNEgsS0FBRixDQUFRSCxDQUFSLEVBQVcsRUFBRWhCLE1BQU1nQixDQUFSLEVBQVgsQ0FBbkIsQ0FBekMsRUFBc0Z2RixHQUF0RixDQUEwRixRQUExRixDQUFULEVBQThHQyxNQUE5RyxHQUF1SCxDQUEzSCxFQUNKLE9BQU8sSUFBUDs7QUFFRCxVQUFPLEtBQVA7QUFDQSxHQVhvQixDQUFyQjs7QUFhQTtBQUNBLE1BQUksS0FBS0YsS0FBTCxDQUFXcUksR0FBWCxDQUFlLE9BQWYsS0FBMkIsS0FBS3JJLEtBQUwsQ0FBV0MsR0FBWCxDQUFlLE9BQWYsRUFBd0JDLE1BQXhCLEtBQW1DaUksYUFBYWpJLE1BQS9FLEVBQXVGO0FBQ3RGLFFBQUtvSSxVQUFMO0FBQ0EsUUFBSzdHLE9BQUwsQ0FBYSxRQUFiLEVBQXVCLE9BQXZCO0FBQ0EsUUFBSzhHLEtBQUw7QUFDQSxRQUFLQyxXQUFMLEdBQW1CLElBQUkvSixVQUFKLENBQWU7QUFDakNnSyxXQUFPLGlFQUQwQjtBQUVqQ0Msb05BRmlDO0FBSWpDZixVQUFNLFNBSjJCO0FBS2pDZ0IsaUJBQWEsQ0FBQyxPQUFELENBTG9CO0FBTWpDQyxhQUFTO0FBTndCLElBQWYsQ0FBbkI7O0FBU0EsUUFBS0osV0FBTCxDQUFpQkssSUFBakI7QUFDQSxHQWRELE1BZUssSUFBSSxLQUFLN0ksS0FBTCxDQUFXQyxHQUFYLENBQWUsYUFBZixLQUFpQ2xDLEVBQUV3RyxNQUFGLENBQVMsS0FBS3ZFLEtBQUwsQ0FBV0MsR0FBWCxDQUFlLE9BQWYsQ0FBVCxFQUFrQztBQUFBLFVBQUt1RixNQUFNLElBQVg7QUFBQSxHQUFsQyxFQUFtRHRGLE1BQW5ELEdBQTRELENBQWpHLEVBQW9HO0FBQ3hHLFFBQUs0SSxnQkFBTCxHQUF3QixJQUFJM0YsZ0JBQUosQ0FBcUI7QUFDNUNuRCxXQUFPLElBQUloQyxTQUFTeUgsS0FBYixDQUFtQixFQUFFSixPQUFPLEtBQUtyRixLQUFMLENBQVdDLEdBQVgsQ0FBZSxPQUFmLENBQVQsRUFBbkI7QUFEcUMsSUFBckIsQ0FBeEI7QUFHQSxRQUFLaEIsRUFBTCxDQUFROEcsaUJBQVIsQ0FBMEJaLE1BQTFCLENBQWlDLEtBQUsyRCxnQkFBTCxDQUFzQnZILE1BQXRCLEdBQStCNkQsRUFBaEU7O0FBRUEsT0FBSSxLQUFLcEYsS0FBTCxDQUFXQyxHQUFYLENBQWUsT0FBZixDQUFKLEVBQTZCO0FBQzVCLFNBQUtoQixFQUFMLENBQVFpSCxXQUFSLENBQW9CaEUsV0FBcEIsQ0FBZ0MsUUFBaEM7QUFDQSxTQUFLakQsRUFBTCxDQUFRa0gsWUFBUixDQUFxQmxFLFFBQXJCLENBQThCLFFBQTlCO0FBQ0EsU0FBSzhHLFlBQUw7QUFDQSxJQUpELE1BS0s7QUFDSixTQUFLOUosRUFBTCxDQUFRaUgsV0FBUixDQUFvQmpFLFFBQXBCLENBQTZCLFFBQTdCO0FBQ0EsU0FBS2hELEVBQUwsQ0FBUWtILFlBQVIsQ0FBcUJqRSxXQUFyQixDQUFpQyxRQUFqQztBQUNBLFNBQUtqRCxFQUFMLENBQVErRyxVQUFSLENBQW1CZ0QsSUFBbkIsQ0FBd0IsVUFBeEIsRUFBb0MsSUFBcEM7QUFDQTtBQUNELEdBaEJJLE1BaUJBO0FBQ0osUUFBS3BELFNBQUwsQ0FBZSxJQUFJekgsT0FBT3NILEtBQVgsQ0FBaUI7QUFDL0JnRCxXQUFPLFlBRHdCO0FBRS9CUSxhQUFTLHNFQUZzQjtBQUcvQkMsY0FBVSxFQUFFQyxRQUFRLDJCQUFWO0FBSHFCLElBQWpCLENBQWY7O0FBTUEsUUFBS0wsZ0JBQUwsR0FBd0IsSUFBSTNGLGdCQUFKLENBQXFCO0FBQzVDbkQsV0FBTyxJQUFJaEMsU0FBU3lILEtBQWIsQ0FBbUIsRUFBbkI7QUFEcUMsSUFBckIsQ0FBeEI7O0FBSUEsUUFBS3hHLEVBQUwsQ0FBUWlILFdBQVIsQ0FBb0JqRSxRQUFwQixDQUE2QixRQUE3QjtBQUNBLFFBQUtoRCxFQUFMLENBQVFrSCxZQUFSLENBQXFCakUsV0FBckIsQ0FBaUMsUUFBakM7QUFDQSxRQUFLakQsRUFBTCxDQUFRK0csVUFBUixDQUFtQmdELElBQW5CLENBQXdCLFVBQXhCLEVBQW9DLElBQXBDOztBQUVBLFFBQUsvSixFQUFMLENBQVE4RyxpQkFBUixDQUEwQlosTUFBMUIsQ0FBaUMsS0FBSzJELGdCQUFMLENBQXNCdkgsTUFBdEIsR0FBK0I2RCxFQUFoRTtBQUNBOztBQUVELE9BQUtSLFFBQUwsQ0FBYyxLQUFLa0UsZ0JBQW5CLEVBQXFDLGdCQUFyQyxFQUF1RCxLQUFLakUsZUFBTCxDQUFxQkMsSUFBckIsQ0FBMEIsSUFBMUIsQ0FBdkQ7QUFDQSxFQXBJK0I7O0FBc0loQ3NFLDZCQUE0QixzQ0FBVztBQUN0QyxNQUFJLENBQUMsS0FBS25LLEVBQUwsQ0FBUWlILFdBQVIsQ0FBb0JtRCxRQUFwQixDQUE2QixVQUE3QixDQUFMLEVBQStDO0FBQzlDLFFBQUtwSyxFQUFMLENBQVFrSCxZQUFSLENBQXFCakUsV0FBckIsQ0FBaUMsUUFBakM7QUFDQSxRQUFLakQsRUFBTCxDQUFRaUgsV0FBUixDQUFvQmpFLFFBQXBCLENBQTZCLFFBQTdCO0FBQ0EsUUFBSzZHLGdCQUFMLENBQXNCekUsVUFBdEIsQ0FBaUMsY0FBakM7QUFDQTtBQUNELEVBNUkrQjs7QUE4SWhDaUYsOEJBQTZCLHVDQUFXO0FBQ3ZDLE1BQUksQ0FBQyxLQUFLckssRUFBTCxDQUFRaUgsV0FBUixDQUFvQm1ELFFBQXBCLENBQTZCLFVBQTdCLENBQUwsRUFBK0M7QUFDOUMsUUFBS3BLLEVBQUwsQ0FBUWlILFdBQVIsQ0FBb0JoRSxXQUFwQixDQUFnQyxRQUFoQztBQUNBLFFBQUtqRCxFQUFMLENBQVFrSCxZQUFSLENBQXFCbEUsUUFBckIsQ0FBOEIsUUFBOUI7QUFDQSxRQUFLNkcsZ0JBQUwsQ0FBc0J6RSxVQUF0QixDQUFpQyxTQUFqQzs7QUFFQSxPQUFJLEtBQUtrRixlQUFULEVBQ0MsS0FBSzNFLFFBQUwsQ0FBYyxLQUFLMkUsZUFBbkIsRUFBb0MsaUJBQXBDLEVBQXVELEtBQUsxSCxnQkFBTCxDQUFzQmlELElBQXRCLENBQTJCLElBQTNCLEVBQWlDLEtBQUt5RSxlQUFMLENBQXFCdEosR0FBckIsQ0FBeUIsV0FBekIsQ0FBakMsQ0FBdkQ7QUFDRDtBQUNELEVBdkorQjs7QUF5SmhDOEksZUFBYyx3QkFBVztBQUFBOztBQUN4QixNQUFJUyxhQUFhLENBQWpCO0FBQ0EsTUFBTW5FLFFBQVEsS0FBS3lELGdCQUFMLENBQXNCOUQsUUFBdEIsSUFBa0MsS0FBSzhELGdCQUFMLENBQXNCOUQsUUFBdEIsQ0FBK0J0RCxVQUEvQixDQUEwQytILE1BQTVFLEdBQXFGLEtBQUtYLGdCQUFMLENBQXNCOUQsUUFBdEIsQ0FBK0J0RCxVQUEvQixDQUEwQytILE1BQS9ILEdBQXdJLEtBQUt6SixLQUFMLENBQVdDLEdBQVgsQ0FBZSxPQUFmLENBQXRKOztBQUVBLE9BQUt5SixTQUFMLEdBQWlCM0wsRUFBRXdHLE1BQUYsQ0FBU2MsS0FBVCxFQUFnQixnQkFBUTtBQUN4QyxPQUFJYixLQUFLdkUsR0FBTCxDQUFTLFVBQVQsTUFBeUIsS0FBN0IsRUFBb0M7QUFDbkMsV0FBSzJILGFBQUwsQ0FBbUIrQixJQUFuQixDQUF3Qm5GLElBQXhCO0FBQ0EsV0FBTyxLQUFQO0FBQ0E7O0FBRUQsT0FBSSxDQUFDQSxLQUFLdkUsR0FBTCxDQUFTLE9BQVQsQ0FBRCxLQUF1QmxDLEVBQUVnQyxNQUFGLENBQVN5RSxLQUFLdkUsR0FBTCxDQUFTLFFBQVQsQ0FBVCxFQUE2QkMsTUFBN0IsS0FBd0MsQ0FBeEMsSUFBNkNzRSxLQUFLdkUsR0FBTCxDQUFTLE9BQVQsQ0FBcEUsQ0FBSixFQUE0RjtBQUMzRixXQUFLMkosYUFBTCxDQUFtQnBGLElBQW5CLEVBQXlCLGVBQXpCLEVBQTBDLE9BQUtxRixjQUFMLENBQW9CL0UsSUFBcEIsQ0FBeUIsTUFBekIsRUFBK0JOLElBQS9CLENBQTFDO0FBQ0EsV0FBS0ksUUFBTCxDQUFjSixJQUFkLEVBQW9CLGVBQXBCLEVBQXFDLE9BQUtxRixjQUFMLENBQW9CL0UsSUFBcEIsQ0FBeUIsTUFBekIsRUFBK0JOLElBQS9CLENBQXJDO0FBQ0EsV0FBTyxJQUFQO0FBQ0E7QUFDRGdGO0FBQ0EsVUFBTyxLQUFQO0FBQ0EsR0FiZ0IsQ0FBakI7O0FBZUE7QUFDQSxNQUFJQSxhQUFhLENBQWIsSUFBa0IsS0FBS0UsU0FBTCxDQUFleEosTUFBZixLQUEwQixDQUFoRCxFQUNDLEtBQUtqQixFQUFMLENBQVErRyxVQUFSLENBQW1CZ0QsSUFBbkIsQ0FBd0IsVUFBeEIsRUFBb0MsSUFBcEM7QUFDRCxFQS9LK0I7O0FBaUxoQ25FLGtCQUFpQiwyQkFBVztBQUMzQixPQUFLNUYsRUFBTCxDQUFRK0csVUFBUixDQUFtQmdELElBQW5CLENBQXdCLFVBQXhCLEVBQW9DLEtBQXBDO0FBQ0EsRUFuTCtCOztBQXFMaENjLG9CQUFtQiw2QkFBVztBQUM3QixPQUFLN0ssRUFBTCxDQUFRK0csVUFBUixDQUFtQmdELElBQW5CLENBQXdCLFVBQXhCLEVBQW9DLElBQXBDO0FBQ0EsT0FBS1EsVUFBTCxHQUFrQixDQUFsQjtBQUNBLE9BQUtPLGFBQUwsR0FBcUIsSUFBckI7O0FBRUEsT0FBSzlLLEVBQUwsQ0FBUWlILFdBQVIsQ0FBb0JqRSxRQUFwQixDQUE2QixVQUE3Qjs7QUFFQSxPQUFLOEcsWUFBTDs7QUFFQSxNQUFJLEtBQUsvSSxLQUFMLENBQVdDLEdBQVgsQ0FBZSxVQUFmLENBQUosRUFBZ0M7QUFDL0IsUUFBS3dCLE9BQUwsQ0FBYSxRQUFiLEVBQXVCLE1BQXZCLEVBQStCLEtBQUtpSSxTQUFwQyxFQUErQyxLQUFLOUIsYUFBcEQ7QUFDQSxRQUFLaEcsT0FBTDtBQUNBLEdBSEQsTUFJSztBQUNKLFFBQUtvSSxTQUFMO0FBQ0E7QUFDRCxFQXJNK0I7O0FBdU1oQ0EsWUFBVyxxQkFBVztBQUNyQixNQUFJLEtBQUtOLFNBQUwsQ0FBZXhKLE1BQWYsS0FBMEIsQ0FBMUIsSUFBK0IsS0FBSytKLGFBQXhDLEVBQ0M7O0FBRUQsTUFBSSxDQUFDLEtBQUtWLGVBQVYsRUFDQyxLQUFLQSxlQUFMLEdBQXVCLEtBQUtHLFNBQUwsQ0FBZVEsS0FBZixFQUF2Qjs7QUFFRCxPQUFLdEYsUUFBTCxDQUFjLEtBQUsyRSxlQUFuQixFQUFvQyxpQkFBcEMsRUFBdUQsS0FBSzFILGdCQUFMLENBQXNCaUQsSUFBdEIsQ0FBMkIsSUFBM0IsRUFBaUMsS0FBS3lFLGVBQUwsQ0FBcUJ0SixHQUFyQixDQUF5QixXQUF6QixDQUFqQyxDQUF2RDs7QUFFQTtBQUNBLE9BQUttQyxHQUFMLENBQVMsS0FBS21ILGVBQUwsQ0FBcUJZLEdBQTlCLElBQXFDLEtBQUtaLGVBQUwsQ0FBcUJhLFVBQXJCLENBQWdDLElBQWhDLEVBQXNDO0FBQzFFakQsYUFBVSxLQURnRTtBQUUxRWtELFNBQU0sSUFGb0U7QUFHMUVDLFNBQU0sS0FBS2YsZUFBTCxDQUFxQmdCLFVBSCtDO0FBSTFFQyxZQUFTLEtBQUt4SSxXQUFMLENBQWlCOEMsSUFBakIsQ0FBc0IsSUFBdEIsRUFBNEIsS0FBS3lFLGVBQUwsQ0FBcUJ0SixHQUFyQixDQUF5QixXQUF6QixDQUE1QixDQUppRTtBQUsxRXFDLFVBQU8sS0FBS0gsU0FBTCxDQUFlMkMsSUFBZixDQUFvQixJQUFwQixFQUEwQixLQUFLeUUsZUFBTCxDQUFxQnRKLEdBQXJCLENBQXlCLFdBQXpCLENBQTFCO0FBTG1FLEdBQXRDLENBQXJDO0FBT0EsRUF4TitCOztBQTBOaEMrQixjQUFhLHFCQUFTd0MsSUFBVCxFQUFleEUsS0FBZixFQUFzQjtBQUNsQyxPQUFLb0MsR0FBTCxDQUFTb0MsS0FBSzJGLEdBQWQsSUFBcUIsSUFBckI7QUFDQSxPQUFLN0IsVUFBTDtBQUNBdEksUUFBTXlCLE9BQU4sQ0FBYyxjQUFkLEVBQThCekIsS0FBOUI7QUFDQSxPQUFLdUosZUFBTCxHQUF1QixLQUF2QjtBQUNBL0UsT0FBSy9ELEdBQUwsQ0FBUyxPQUFULEVBQWtCLElBQWxCO0FBQ0FULFFBQU1TLEdBQU4sQ0FBVSxPQUFWLEVBQW1CLElBQW5COztBQUVBLE1BQUksS0FBS2lKLFNBQUwsQ0FBZXhKLE1BQWYsS0FBMEIsQ0FBMUIsSUFBK0IsS0FBS3NKLFVBQUwsS0FBb0IsQ0FBdkQsRUFBMEQ7QUFDekQsUUFBSy9ILE9BQUwsQ0FBYSxRQUFiLEVBQXVCLE1BQXZCO0FBQ0EsUUFBS0csT0FBTDtBQUNBLEdBSEQsTUFJSyxJQUFJLEtBQUs4SCxTQUFMLENBQWV4SixNQUFmLEtBQTBCLENBQTFCLElBQStCLEtBQUtzSixVQUFMLEdBQWtCLENBQXJELEVBQXdEO0FBQzVELFFBQUt2SyxFQUFMLENBQVErRyxVQUFSLENBQW1CZ0QsSUFBbkIsQ0FBd0IsVUFBeEIsRUFBb0MsSUFBcEM7QUFDQSxRQUFLL0osRUFBTCxDQUFRZ0gsU0FBUixDQUFrQndFLElBQWxCLENBQXVCLE9BQXZCO0FBQ0E7O0FBRUQsT0FBS1QsU0FBTDtBQUNBLEVBNU8rQjs7QUE4T2hDN0gsWUFBVyxtQkFBU3FDLElBQVQsRUFBZXhFLEtBQWYsRUFBc0JvQyxHQUF0QixFQUEyQjtBQUNyQyxPQUFLQSxHQUFMLENBQVNvQyxLQUFLMkYsR0FBZCxJQUFxQixJQUFyQjtBQUNBLE9BQUs3QixVQUFMO0FBQ0EsT0FBS2tCLFVBQUw7O0FBRUEsTUFBSXBILElBQUlzSSxVQUFKLEtBQW1CLE9BQXZCLEVBQ0MxSyxNQUFNeUIsT0FBTixDQUFjLFlBQWQsRUFBNEIsRUFBRWdCLE9BQU8sSUFBVCxFQUFlRixjQUFjLEVBQUVDLE1BQU0sd0dBQVIsRUFBN0IsRUFBNUIsRUFERCxLQUdDeEMsTUFBTXlCLE9BQU4sQ0FBYyxZQUFkLEVBQTRCVyxHQUE1Qjs7QUFFRCxNQUFJLEtBQUtzSCxTQUFMLENBQWV4SixNQUFmLEdBQXdCLENBQTVCLEVBQ0MsS0FBS3FKLGVBQUwsR0FBdUIsS0FBdkIsQ0FERCxLQUdDLEtBQUt0SyxFQUFMLENBQVFnSCxTQUFSLENBQWtCd0UsSUFBbEIsQ0FBdUIsT0FBdkI7O0FBRUQsTUFBSSxLQUFLekssS0FBTCxDQUFXQyxHQUFYLENBQWUsYUFBZixDQUFKLEVBQ0MsS0FBSytKLFNBQUw7QUFDRCxFQS9QK0I7O0FBaVFoQ25JLG1CQUFrQiwwQkFBUzJDLElBQVQsRUFBZTdELFVBQWYsRUFBMkI7QUFDNUM2RCxPQUFLL0MsT0FBTCxDQUFhLGlCQUFiLEVBQWdDZCxVQUFoQyxFQUE0QzZELElBQTVDO0FBQ0EsRUFuUStCOztBQXFRaENxRixpQkFBZ0Isd0JBQVNjLFlBQVQsRUFBdUI7QUFDdEM7QUFDQSxNQUFNakIsWUFBWTNMLEVBQUV3RyxNQUFGLENBQVMsS0FBS3VFLGdCQUFMLENBQXNCOUQsUUFBdEIsQ0FBK0J0RCxVQUEvQixDQUEwQytILE1BQW5ELEVBQTJEO0FBQUEsVUFBUWpGLEtBQUsyRixHQUFMLEtBQWFRLGFBQWFSLEdBQTFCLElBQWlDLENBQUMzRixLQUFLdkUsR0FBTCxDQUFTLE9BQVQsQ0FBbEMsSUFBdURsQyxFQUFFZ0MsTUFBRixDQUFTeUUsS0FBS3ZFLEdBQUwsQ0FBUyxRQUFULENBQVQsRUFBNkJDLE1BQTdCLEtBQXdDLENBQXZHO0FBQUEsR0FBM0QsQ0FBbEI7O0FBRUEsTUFBSXdKLFVBQVV4SixNQUFWLEtBQXFCLENBQXpCLEVBQ0MsS0FBS2pCLEVBQUwsQ0FBUStHLFVBQVIsQ0FBbUJnRCxJQUFuQixDQUF3QixVQUF4QixFQUFvQyxJQUFwQzs7QUFFRDtBQUNBLE9BQUtVLFNBQUwsR0FBaUIzTCxFQUFFNk0sTUFBRixDQUFTLEtBQUtsQixTQUFkLEVBQXlCO0FBQUEsVUFBUWxGLEtBQUsyRixHQUFMLEtBQWFRLGFBQWFSLEdBQWxDO0FBQUEsR0FBekIsQ0FBakI7O0FBRUEsTUFBSSxLQUFLWixlQUFMLElBQXdCb0IsYUFBYVIsR0FBYixLQUFxQixLQUFLWixlQUFMLENBQXFCWSxHQUF0RSxFQUEyRTtBQUMxRTtBQUNBLE9BQUksS0FBS1osZUFBTCxJQUF3QixLQUFLbkgsR0FBTCxDQUFTLEtBQUttSCxlQUFMLENBQXFCWSxHQUE5QixDQUE1QixFQUFnRTtBQUMvRCxTQUFLL0gsR0FBTCxDQUFTLEtBQUttSCxlQUFMLENBQXFCWSxHQUE5QixFQUFtQ3RDLEtBQW5DO0FBQ0EsU0FBSzBCLGVBQUwsR0FBdUIsS0FBdkI7QUFDQTtBQUNBLFFBQUksS0FBS3NCLGFBQVQsRUFDQyxLQUFLN0ssS0FBTCxDQUFXUyxHQUFYLENBQWUsS0FBS29LLGFBQXBCLEVBQW1DLEVBQUUxRCxVQUFVLEtBQVosRUFBbkM7QUFDRDs7QUFFRCxRQUFLb0MsZUFBTCxHQUF1QixLQUF2QjtBQUNBOztBQUVELE1BQUksQ0FBQyxLQUFLdkosS0FBTCxDQUFXQyxHQUFYLENBQWUsVUFBZixDQUFELElBQStCLEtBQUs4SixhQUFwQyxJQUFxRCxLQUFLUixlQUFMLEtBQXlCLEtBQWxGLEVBQ0MsS0FBS1MsU0FBTDtBQUNELEVBOVIrQjs7QUFnU2hDYyxrQkFBaUIsMkJBQVc7QUFDM0IsT0FBS2IsYUFBTCxHQUFxQixJQUFyQjtBQUNBLE1BQUksS0FBS1YsZUFBTCxJQUF3QixLQUFLbkgsR0FBTCxDQUFTLEtBQUttSCxlQUFMLENBQXFCWSxHQUE5QixDQUE1QixFQUNDLEtBQUsvSCxHQUFMLENBQVMsS0FBS21ILGVBQUwsQ0FBcUJZLEdBQTlCLEVBQW1DdEMsS0FBbkM7O0FBRUQsTUFBSSxLQUFLNkIsU0FBTCxJQUFrQixLQUFLQSxTQUFMLENBQWV4SixNQUFmLEdBQXdCLENBQTlDLEVBQWlEO0FBQ2hEbkMsS0FBRWdOLE1BQUYsQ0FBUyxLQUFLM0ksR0FBZCxFQUFtQixVQUFDL0IsS0FBRCxFQUFRQyxHQUFSLEVBQWdCO0FBQ2xDLFFBQUlBLFFBQVEsT0FBUixJQUFtQixDQUFDdkMsRUFBRXFLLEtBQUYsQ0FBUS9ILEtBQVIsQ0FBeEIsRUFDQ0EsTUFBTXdILEtBQU47QUFDRCxJQUhEO0FBSUE7O0FBRUQsT0FBSzZCLFNBQUwsR0FBaUIsRUFBakI7QUFDQSxPQUFLakksT0FBTCxDQUFhLFFBQWIsRUFBdUIxRCxFQUFFaU4sT0FBRixDQUFVLEtBQUsvTCxFQUFMLENBQVFnSCxTQUFSLENBQWtCd0UsSUFBbEIsRUFBVixDQUF2QjtBQUNBLEVBOVMrQjs7QUFnVGhDMUMsY0FBYSx1QkFBVztBQUN2QixPQUFLL0gsS0FBTCxDQUFXUyxHQUFYLENBQWUsRUFBRXNILGFBQWEsSUFBZixFQUFmO0FBQ0EsT0FBSzlJLEVBQUwsQ0FBUStHLFVBQVIsQ0FBbUJnRCxJQUFuQixDQUF3QixVQUF4QixFQUFvQyxLQUFwQzs7QUFFQSxPQUFLaUMsWUFBTDtBQUNBLE9BQUtDLGNBQUw7O0FBRUEsTUFBSSxLQUFLQyxTQUFULEVBQW9CO0FBQ25CLFFBQUtBLFNBQUwsQ0FBZXZKLE9BQWY7QUFDQSxRQUFLdUosU0FBTCxHQUFpQixJQUFqQjtBQUNBOztBQUVEN00sY0FBWW1ELE9BQVosQ0FBb0JwRCxJQUFJZ0ksTUFBSixDQUFXK0UsUUFBWCxDQUFvQkMsS0FBeEMsRUFBK0M7QUFDOUNDLFlBQVMsd0NBRHFDO0FBRTlDQyxTQUFNLFNBRndDO0FBRzlDQyxlQUFZLE9BSGtDO0FBSTlDN0QsU0FBTTtBQUp3QyxHQUEvQztBQU1BLEVBbFUrQjs7QUFvVWhDOEQsaUJBQWdCLDBCQUFXO0FBQzFCLE9BQUt6TCxLQUFMLENBQVdTLEdBQVgsQ0FBZSxFQUFFc0gsYUFBYSxLQUFmLEVBQWY7QUFDQSxNQUFJLEtBQUt3QixlQUFMLElBQXdCLEtBQUtuSCxHQUFMLENBQVMsS0FBS21ILGVBQUwsQ0FBcUJZLEdBQTlCLENBQTVCLEVBQWdFO0FBQy9ELFFBQUsvSCxHQUFMLENBQVMsS0FBS21ILGVBQUwsQ0FBcUJZLEdBQTlCLEVBQW1DdEMsS0FBbkM7QUFDQTtBQUNBLFFBQUs2QixTQUFMLENBQWVnQyxPQUFmLENBQXVCLEtBQUtuQyxlQUE1QjtBQUNBLFFBQUtBLGVBQUwsR0FBdUIsS0FBdkI7QUFDQTs7QUFFRCxPQUFLM0QsU0FBTCxDQUFlLElBQUl6SCxPQUFPc0gsS0FBWCxDQUFpQjtBQUMvQmdELFVBQU8sWUFEd0I7QUFFL0JRLFlBQVMsbURBRnNCO0FBRy9CQyxhQUFVLEVBQUVDLFFBQVEsMkJBQVY7QUFIcUIsR0FBakIsQ0FBZjtBQUtBO0FBbFYrQixDQUFoQixDQUFqQiIsImZpbGUiOiJidWxrUmVzb3VyY2VVcGxvYWRNb2RhbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuXG5jb25zdCBCdWxrRHJhZ0Ryb3BIZWxwZXIgPSByZXF1aXJlKFwiLi9idWxrRHJhZ0Ryb3BIZWxwZXJcIik7XG5jb25zdCBEcmFnRHJvcEZpbGVDaG9vc2VyID0gcmVxdWlyZShcIi4vZHJhZ0Ryb3BGaWxlQ2hvb3NlclwiKTtcbmNvbnN0IEVycm9ycyA9IHJlcXVpcmUoXCIuL2Vycm9ycy5qc1wiKTtcblxuY29uc3QgQmlnTW9kYWwgPSByZXF1aXJlKFwiLi9iaWdNb2RhbFwiKTtcbmNvbnN0IEFwcCA9IHJlcXVpcmUoXCIuLi9pbmRleFwiKTtcbmNvbnN0IGdsb2JhbFJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcbmNvbnN0IFNtYWxsTW9kYWwgPSByZXF1aXJlKFwiLi9zbWFsbE1vZGFsXCIpO1xuXG5jb25zdCBJdGVtID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi90ZW1wbGF0ZXMvYnVsa1Jlc291cmNlVXBsb2FkTW9kYWwubnVualwiKS5saXN0SXRlbSxcblx0dGFnTmFtZTogXCJ0clwiLFxuXG5cdHVpOiB7XG5cdFx0aXRlbTogXCIuY2xpY2thYmxlXCIsXG5cdFx0c3RhdHVzSWNvbjogXCIuc3RhdHVzLWljb25cIixcblx0XHRjYW5jZWxCdXR0b246IFwiYnV0dG9uLmNhbmNlbFwiLFxuXHRcdGVycm9yQnV0dG9uOiBcImJ1dHRvbi5lcnJvclwiLFxuXHRcdGNvbXBsZXRlZEJ1dHRvbjogXCJidXR0b24uY29tcGxldGVkXCIsXG5cdFx0cHJvZ3Jlc3NCYXI6IFwiLnVwbG9hZC1wcm9ncmVzcyAucHJvZ3Jlc3MtYmFyXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkuY2FuY2VsQnV0dG9uXCI6IFwib25DYW5jZWxDbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmVycm9yQnV0dG9uXCI6IFwib25DYW5jZWxDbGlja1wiLFxuXHR9LFxuXG5cdG1vZGVsRXZlbnRzOiB7XG5cdFx0XCJ1cGxvYWQ6cHJvZ3Jlc3NcIjogXCJvblVwbG9hZFByb2dyZXNzXCIsXG5cdFx0XCJzYXZlOnN1Y2Nlc3NcIjogXCJzYXZlU3VjY2Vzc1wiLFxuXHRcdFwic2F2ZTplcnJvclwiOiBcInNhdmVFcnJvclwiLFxuXHRcdFwiY2hhbmdlOnNjcm9sbEludG9WaWV3XCI6IFwib25TY3JvbGxJbnRvVmlld0NoYW5nZVwiLFxuXHRcdFwiY2hhbmdlOnVwbG9hZFN0YXJ0ZWRcIjogXCJvblVwbG9hZFN0YXJ0ZWRcIixcblx0fSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRmaWxlU2l6ZTogdGhpcy5maWxlU2l6ZSgpLFxuXHRcdFx0ZXJyb3JNZXNzYWdlOiB0aGlzLmdldEVycm9yTWVzc2FnZSgpLFxuXHRcdFx0aGFzRXJyb3I6IF8udmFsdWVzKHRoaXMubW9kZWwuZ2V0KFwiZXJyb3JzXCIpKS5sZW5ndGggPiAwIHx8IHRoaXMubW9kZWwuZ2V0KFwiY2F0ZWdvcnlcIikgPT09IFwidW5rbm93blwiLFxuXHRcdFx0ZXJyb3JzQXJyYXk6IF8udmFsdWVzKF8ucGlja0J5KHRoaXMubW9kZWwuZ2V0KFwiZXJyb3JzXCIpLCAodmFsdWUsIGtleSkgPT4gXy5lbmRzV2l0aChrZXksIFwiRmlsZUNob29zZXJcIikpKSxcblx0XHR9O1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMubW9kZWwuc2V0KFwidXBsb2FkU3RhcnRlZFwiLCBmYWxzZSk7XG5cdFx0dGhpcy5iaW5kRXZlbnRzKHRoaXMubW9kZWwsIHRoaXMubW9kZWxFdmVudHMpO1xuXHRcdHRoaXMucGVyY2VudGFnZSA9IDA7XG5cdH0sXG5cblx0Z2V0RXJyb3JNZXNzYWdlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoXy52YWx1ZXModGhpcy5tb2RlbC5nZXQoXCJlcnJvcnNcIikpLmxlbmd0aCA+IDApIHtcblx0XHRcdHJldHVybiBfLnZhbHVlcyh0aGlzLm1vZGVsLmdldChcImVycm9yc1wiKSkuam9pbihcIi4gXCIpICtcblx0XHRcdFx0KHRoaXMubW9kZWwuZ2V0KFwicmV0cnlcIikgPyBcIlwiIDogXCIgVGhpcyBmaWxlIHdpbGwgYmUgc2tpcHBlZCBkdXJpbmcgdGhlIHVwbG9hZC4gQ2xpY2sgZXJyb3IgYnV0dG9uIHRvIHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0LlwiKSArXG5cdFx0XHRcdCh0aGlzLm1vZGVsLmdldChcImNhdGVnb3J5XCIpID09PSBcInVua25vd25cIiA/IFwiIFRoZSBzdXBwb3J0ZWQgZmlsZSB0eXBlcyBhcmUgZXhjZWwsIHBvd2VycG9pbnQsIHdvcmQsIHZpZGVvLCBwZGYsIGF1ZGlvLCBpbWFnZSwgdGV4dCwgY3N2IGZsYXNoY2FyZCBkZWNrLlwiIDogXCJcIik7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFwiXCI7XG5cdH0sXG5cblx0ZmlsZVNpemU6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGZpbGVNb2RlbCA9IHRoaXMubW9kZWwuZ2V0KFwiZmlsZU1vZGVsXCIpID8gdGhpcy5tb2RlbC5nZXQoXCJmaWxlTW9kZWxcIikgOiB0aGlzLm1vZGVsO1xuXHRcdGNvbnN0IGkgPSBNYXRoLmZsb29yKE1hdGgubG9nKGZpbGVNb2RlbC5nZXQoXCJzaXplXCIpKSAvIE1hdGgubG9nKDEwMjQpKSxcblx0XHRcdHNpemVzID0gW1wiQlwiLCBcIktCXCIsIFwiTUJcIiwgXCJHQlwiLCBcIlRCXCIsIFwiUEJcIiwgXCJFQlwiLCBcIlpCXCIsIFwiWUJcIl07XG5cblx0XHRyZXR1cm4gTnVtYmVyKChmaWxlTW9kZWwuZ2V0KFwic2l6ZVwiKSAvIE1hdGgucG93KDEwMjQsIGkpKS50b0ZpeGVkKDIpKSAqIDEgKyBcIiBcIiArIHNpemVzW2ldO1xuXHR9LFxuXG5cdG9uVXBsb2FkU3RhcnRlZDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwidXBsb2FkU3RhcnRlZFwiKSkge1xuXHRcdFx0dGhpcy5tb2RlbC5zZXQoXCJlcnJvcnNcIiwge30pO1xuXHRcdFx0dGhpcy5yZW5kZXIoKTtcblx0XHR9XG5cdH0sXG5cblx0b25DYW5jZWxDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5tb2RlbC5zZXQoXCJzZWxlY3RlZFwiLCBmYWxzZSk7XG5cdFx0dGhpcy5tb2RlbC50cmlnZ2VyKFwidXBsb2FkOmNhbmNlbFwiLCB0aGlzLm1vZGVsKTtcblx0XHR0aGlzLm1vZGVsLmNvbGxlY3Rpb24ucmVtb3ZlKHRoaXMubW9kZWwpO1xuXHRcdHRoaXMuZGVzdHJveSgpO1xuXHR9LFxuXG5cdG9uVXBsb2FkUHJvZ3Jlc3M6IGZ1bmN0aW9uKHBlcmNlbnRhZ2UpIHtcblx0XHRpZiAodGhpcy5wZXJjZW50YWdlIDw9IHBlcmNlbnRhZ2UpIHtcblx0XHRcdHRoaXMudWkucHJvZ3Jlc3NCYXIuYW5pbWF0ZSh7IHdpZHRoOiBwZXJjZW50YWdlICsgXCIlXCIgfSk7XG5cdFx0XHR0aGlzLnBlcmNlbnRhZ2UgPSBwZXJjZW50YWdlO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5tb2RlbC5nZXQoXCJzY3JvbGxJbnRvVmlld1wiKSlcblx0XHRcdHRoaXMubW9kZWwuc2V0KFwic2Nyb2xsSW50b1ZpZXdcIiwgdHJ1ZSk7XG5cblx0XHRpZiAoIXRoaXMubW9kZWwuZ2V0KFwidXBsb2FkU3RhcnRlZFwiKSlcblx0XHRcdHRoaXMubW9kZWwuc2V0KFwidXBsb2FkU3RhcnRlZFwiLCB0cnVlKTtcblx0fSxcblxuXHRzYXZlU3VjY2VzczogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5wcm9ncmVzc0Jhci5hbmltYXRlKHsgd2lkdGg6IFwiMTAwJVwiIH0pO1xuXHRcdHRoaXMucGVyY2VudGFnZSA9IDEwMDtcblx0XHR0aGlzLnVpLmNhbmNlbEJ1dHRvbi5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5jb21wbGV0ZWRCdXR0b24ucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMubW9kZWwuc2V0KFwic2Nyb2xsSW50b1ZpZXdcIiwgZmFsc2UpO1xuXHR9LFxuXG5cdHNhdmVFcnJvcjogZnVuY3Rpb24oeGhyKSB7XG5cdFx0dGhpcy51aS5wcm9ncmVzc0Jhci5hbmltYXRlKHsgd2lkdGg6IFwiMCVcIiB9KTtcblx0XHR0aGlzLnBlcmNlbnRhZ2UgPSAwO1xuXHRcdHRoaXMubW9kZWwuc2V0KFwic2Nyb2xsSW50b1ZpZXdcIiwgZmFsc2UpO1xuXHRcdHRoaXMubW9kZWwuc2V0KFwidXBsb2FkU3RhcnRlZFwiLCBmYWxzZSk7XG5cblx0XHRjb25zdCBlcnJvcnMgPSB7IGVycm9yOiB4aHIucmVzcG9uc2VKU09OLmluZm8gfTtcblx0XHR0aGlzLm1vZGVsLnNldChcImVycm9yc1wiLCBlcnJvcnMpO1xuXHRcdGlmICh4aHIucmV0cnkpXG5cdFx0XHR0aGlzLm1vZGVsLnNldChcInJldHJ5XCIsIHRydWUpO1xuXG5cdFx0dGhpcy5yZW5kZXIoKTtcblx0fSxcblxuXHRvblNjcm9sbEludG9WaWV3Q2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJzY3JvbGxJbnRvVmlld1wiKSkge1xuXHRcdFx0JChcIi5saXN0LWNvbnRhaW5lclwiKS5hbmltYXRlKHtcblx0XHRcdFx0c2Nyb2xsVG9wOiB0aGlzLiRlbC5wb3NpdGlvbigpLnRvcCArIDEwLFxuXHRcdFx0fSwgODAwKTtcblx0XHR9XG5cdH0sXG59KTtcblxuY29uc3QgTGlzdCA9IEJhY2tib25lLk1hcmlvbmV0dGUuQ29sbGVjdGlvblZpZXcuZXh0ZW5kKHtcblx0Y2hpbGRWaWV3OiBJdGVtLFxuXHR0YWdOYW1lOiBcInRib2R5XCIsXG5cdGNoaWxkVmlld1RyaWdnZXJzOiB7XG5cdFx0XCJzZWxlY3Q6Y2FtVXNlclwiOiBcImNoaWxkOnNlbGVjdDpjYW1Vc2VyXCIsXG5cdFx0XCJjaGFuZ2U6Y2FtVXNlclwiOiBcImNoaWxkOmNoYW5nZTpjYW1Vc2VyXCIsXG5cdH0sXG59KTtcblxuY29uc3QgQnVsa1VwbG9hZFdpemFyZCA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwicmVzb3VyY2VVcGxvYWRXaXphcmQtY29udGFpbmVyXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9idWxrUmVzb3VyY2VVcGxvYWRNb2RhbC5udW5qXCIpLndpemFyZCxcblxuXHRyZWdpb25zOiB7XG5cdFx0ZmlsZUNob29zZXI6IFwiZGl2LmZpbGUtY2hvb3Nlci1yZWdpb25cIixcblx0fSxcblxuXHR1aToge1xuXHRcdHJlc291cmNlU2VsZWN0b3I6IFwiI3Jlc291cmNlU2VsZWN0b3JcIixcblx0XHR2ZXJpZnk6IFwiI3ZlcmlmeVwiLFxuXHRcdHNlbGVjdEFsbDogXCIjc2VsZWN0LWFsbFwiLFxuXHRcdHJlc291cmNlRXJyb3I6IFwiI3Jlc291cmNlRXJyb3JcIixcblx0XHRzbWFydFNlbGVjdDogXCJidXR0b24uc21hcnRcIixcblx0XHRkZXNlbGVjdDogXCJidXR0b24uZGVzZWxlY3RcIixcblx0XHRcImNob29zZS1maWxlc1wiOiBcIiNmaWxlLWNob29zZXJcIixcblx0XHRjb25maXJtOiBcIiNjb25maXJtXCIsXG5cdFx0Y29uZmlybUxpc3Q6IFwiI2NvbmZpcm0gLmNvbmZpcm0tbGlzdFwiLFxuXHRcdGNvbmZpcm1MaXN0SGVhZGVyOiBcIi5jb25maXJtLWxpc3QtaGVhZGVyXCIsXG5cdH0sXG5cblx0bW9kZWxFdmVudHM6IHtcblx0XHRcImNoYW5nZTpsb2FkaW5nXCI6IFwicmVuZGVyXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5idWxrRHJhZ0Ryb3BIZWxwZXIgPSBuZXcgQnVsa0RyYWdEcm9wSGVscGVyKCk7XG5cdFx0dGhpcy5zZWxlY3RlZEZpbGVzID0gW107XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcImxvYWRpbmdcIikpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJmaWxlc1wiKSkge1xuXHRcdFx0dGhpcy5zZXRTZWxlY3RlZEZpbGVzKHRoaXMubW9kZWwuZ2V0KFwiZmlsZXNcIikpO1xuXG5cdFx0XHR0aGlzLnJlbmRlclN0ZXAoXCJjb25maXJtXCIpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMucmVuZGVyU3RlcChcImNob29zZS1maWxlc1wiKTtcblx0XHR9XG5cdH0sXG5cblx0cmVuZGVyU3RlcDogZnVuY3Rpb24oc3RlcCkge1xuXHRcdC8vIEZpbHRlciBvdXQgY2FuY2VsZWQgZmlsZXNcblx0XHR0aGlzLnNlbGVjdGVkRmlsZXMgPSBfLmZpbHRlcih0aGlzLnNlbGVjdGVkRmlsZXMsIGZpbGUgPT4gZmlsZS5nZXQoXCJzZWxlY3RlZFwiKSAhPT0gZmFsc2UpO1xuXHRcdGlmIChzdGVwID09PSBcImNob29zZS1maWxlc1wiKSB7XG5cdFx0XHR0aGlzLmZpbGVDaG9vc2VyID0gbmV3IERyYWdEcm9wRmlsZUNob29zZXIoe1xuXHRcdFx0XHRhY2NlcHRlZEZpbGVUeXBlczogW1wiLm1wM1wiLCBcImF1ZGlvL21wZWdcIiwgXCJhdWRpby9tcDNcIiwgXCIueGxzXCIsIFwiLnhsc3hcIiwgXCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWxcIiwgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldFwiLFxuXHRcdFx0XHRcdFwiLmNzdlwiLCBcInRleHQvY3N2XCIsIFwidGV4dC9wbGFpblwiLCBcIi5qcGdcIiwgXCIuanBlZ1wiLCBcIi5wbmdcIiwgXCIuZ2lmXCIsIFwiaW1hZ2UvZ2lmXCIsIFwiaW1hZ2UvanBlZ1wiLCBcImltYWdlL3BuZ1wiLCBcIi5wZGZcIiwgXCJhcHBsaWNhdGlvbi9wZGZcIiwgXCIucHB0XCIsIFwiLnBwdHhcIixcblx0XHRcdFx0XHRcIi5wcHNcIiwgXCIucHBzeFwiLCBcIi5tcDRcIiwgXCJ2aWRlby9tcDRcIiwgXCIuZG9jXCIsIFwiLmRvY3hcIiwgXCJhcHBsaWNhdGlvbi9tc3dvcmRcIiwgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQud29yZHByb2Nlc3NpbmdtbC5kb2N1bWVudFwiLFxuXHRcdFx0XHRcdFwiYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnRcIiwgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQucHJlc2VudGF0aW9ubWwucHJlc2VudGF0aW9uXCIsXG5cdFx0XHRcdFx0XCJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludFwiLCBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5zbGlkZXNob3dcIl0sXG5cdFx0XHRcdGhlaWdodDogXCIxMDAlXCIsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZmlsZUNob29zZXIsIFwic2VsZWN0ZWRcIiwgdGhpcy5vbkZpbGVzU2VsZWN0ZWQuYmluZCh0aGlzKSk7XG5cdFx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJmaWxlQ2hvb3NlclwiLCB0aGlzLmZpbGVDaG9vc2VyKTtcblx0XHRcdHRoaXMudWkuY29uZmlybS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLnVpW1wiY2hvb3NlLWZpbGVzXCJdLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoc3RlcCA9PT0gXCJjb25maXJtXCIpIHtcblx0XHRcdCQoXCIjcmVzb3VyY2VIZWFkZXIgbGFiZWxcIikucmVtb3ZlQ2xhc3MoXCJhY3RpdmVcIik7XG5cdFx0XHQkKFwiI3Jlc291cmNlSGVhZGVyIC5jb25maXJtXCIpLmFkZENsYXNzKFwiYWN0aXZlXCIpO1xuXHRcdFx0dGhpcy5maWxlTGlzdCA9IG5ldyBMaXN0KHtcblx0XHRcdFx0Y29sbGVjdGlvbjogbmV3IEJhY2tib25lLkNvbGxlY3Rpb24odGhpcy5zZWxlY3RlZEZpbGVzKSxcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLnVpLmNvbmZpcm1MaXN0Lmh0bWwodGhpcy51aS5jb25maXJtTGlzdEhlYWRlci5odG1sKCkpO1xuXHRcdFx0dGhpcy51aS5jb25maXJtTGlzdC5hcHBlbmQodGhpcy5maWxlTGlzdC5yZW5kZXIoKS5lbCk7XG5cdFx0XHR0aGlzLnVpW1wiY2hvb3NlLWZpbGVzXCJdLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHRoaXMudWkuY29uZmlybS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0fVxuXHR9LFxuXG5cdG9uRmlsZXNTZWxlY3RlZDogZnVuY3Rpb24oZmlsZXMpIHtcblx0XHR0aGlzLnNldFNlbGVjdGVkRmlsZXMoZmlsZXMpO1xuXG5cdFx0dGhpcy5yZW5kZXJTdGVwKFwiY29uZmlybVwiKTtcblx0XHR0aGlzLnRyaWdnZXIoXCJmaWxlcy1zZWxlY3RlZFwiKTtcblx0fSxcblxuXHRzZXRTZWxlY3RlZEZpbGVzOiBmdW5jdGlvbihmaWxlcykge1xuXHRcdHRoaXMuc2VsZWN0ZWRGaWxlcyA9IF8uY29uY2F0KFxuXHRcdFx0dGhpcy5zZWxlY3RlZEZpbGVzLFxuXHRcdFx0Xy5tYXAoXy5maWx0ZXIoZmlsZXMsIGYgPT4gZiAhPT0gbnVsbCksIGZpbGUgPT4gKGZpbGUgaW5zdGFuY2VvZiBCYWNrYm9uZS5Nb2RlbCA/IGZpbGUgOiB0aGlzLmJ1bGtEcmFnRHJvcEhlbHBlci5nZXRSZXNvdXJjZU1vZGVsKG5ldyBCYWNrYm9uZS5Nb2RlbChfLm1lcmdlKGZpbGUsIHsgZmlsZSB9KSkpKSlcblx0XHQpO1xuXHR9LFxuXG5cdHNob3dFcnJvcjogZnVuY3Rpb24oZXJyb3IpIHtcblx0XHR0aGlzLnVpLnJlc291cmNlRXJyb3IuaHRtbChlcnJvcik7XG5cdH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBCaWdNb2RhbC5leHRlbmQoe1xuXHR1aToge1xuXHRcdHJlc291cmNlQ29udGFpbmVyOiBcImRpdiNyZXNvdXJjZUNvbnRhaW5lclwiLFxuXHRcdGNvbmZpcm1CdG46IFwiLm1vZGFsLWZvb3RlciAuY3JlYXRlXCIsXG5cdFx0Y2FuY2VsQnRuOiBcIi5tb2RhbC1mb290ZXIgLmNhbmNlbFwiLFxuXHRcdGNob29zZUxhYmVsOiBcImxhYmVsLmNob29zZS1maWxlc1wiLFxuXHRcdGNvbmZpcm1MYWJlbDogXCJsYWJlbC5jb25maXJtXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkuY29uZmlybUJ0blwiOiBcIm9uQ29uZmlybUJ0bkNsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkuY2hvb3NlTGFiZWxcIjogXCJvbkNob29zZUxhYmVsYW5jZWxCdG5DbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmNvbmZpcm1MYWJlbFwiOiBcIm9uQ29uZmlybUxhYmVsYW5jZWxCdG5DbGlja1wiLFxuXHR9LFxuXG5cdHJhZGlvRXZlbnRzOiB7XG5cdFx0W0FwcC5FdmVudHMuV2Vic29ja2V0Q29ubmVjdGVkXTogXCJ3c0Nvbm5lY3RlZFwiLFxuXHRcdFtBcHAuRXZlbnRzLldlYnNvY2tldERpc2Nvbm5lY3RlZF06IFwid3NEaXNjb25uZWN0ZWRcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0Xy5iaW5kQWxsKHRoaXMpO1xuXG5cdFx0dGhpcy5PcHRpb25zID0ge1xuXHRcdFx0Y2xhc3NlczogW1wiaW1wb3J0LXJlc291cmNlLW1vZGFsXCJdLFxuXHRcdFx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9idWxrUmVzb3VyY2VVcGxvYWRNb2RhbC5udW5qXCIpLmNvbnRhaW5lcixcblx0XHRcdGNyZWF0ZUljb246IFwiZmEtYXJyb3ctYWx0LXRvLWJvdHRvbVwiLFxuXHRcdFx0YnV0dG9uczoge1xuXHRcdFx0XHRjcmVhdGU6IHtcblx0XHRcdFx0XHR0eXBlOiBcImFjY2VwdFwiLFxuXHRcdFx0XHRcdGxhYmVsOiBcIkNvbmZpcm1cIixcblx0XHRcdFx0XHRtb2RlOiBcImNyZWF0ZVwiLFxuXHRcdFx0XHRcdHZhbGlkYXRlOiBmYWxzZSxcblx0XHRcdFx0XHRzYXZlOiBmYWxzZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0Y2FuY2VsOiB7XG5cdFx0XHRcdFx0dHlwZTogXCJjYW5jZWxcIixcblx0XHRcdFx0XHRsYWJlbDogXCJDYW5jZWxcIixcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XHRjcmVhdGVWZXJiOiBcIkltcG9ydCBmcm9tIG15IGNvbXB1dGVyXCIsXG5cdFx0XHRkYXRhTm91bjogbnVsbCxcblx0XHRcdHNpemVDb25zdHJhaW50czoge1xuXHRcdFx0XHRtaW5IZWlnaHQ6IFwiNTB2aFwiLFxuXHRcdFx0XHRtaW5XaWR0aDogXCI1MHZ3XCIsXG5cdFx0XHR9LFxuXHRcdFx0aG9zdDogb3B0aW9ucy5ob3N0LFxuXHRcdH07XG5cblx0XHR0aGlzLmJ1bGtEcmFnRHJvcEhlbHBlciA9IG5ldyBCdWxrRHJhZ0Ryb3BIZWxwZXIoKTtcblx0XHR0aGlzLmNhbmNlbGVkRmlsZXMgPSBbXTtcblx0XHR0aGlzLnhociA9IHtcblx0XHRcdGFib3J0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIF8ubm9vcCgpO1xuXHRcdFx0fSxcblx0XHR9O1xuXG5cdFx0dGhpcy5tb2RlbC5zZXQoeyB3c0Nvbm5lY3RlZDogdHJ1ZSB9KTtcblx0XHR0aGlzLmJpbmRFdmVudHMoZ2xvYmFsUmFkaW8sIHRoaXMucmFkaW9FdmVudHMpO1xuXG5cdFx0dGhpcy51aSA9IF8uZXh0ZW5kKHRoaXMudWksIEJpZ01vZGFsLnByb3RvdHlwZS51aSk7XG5cdFx0dGhpcy5ldmVudHMgPSBfLmV4dGVuZCh0aGlzLmV2ZW50cywgQmlnTW9kYWwucHJvdG90eXBlLmV2ZW50cyk7XG5cblx0XHRCaWdNb2RhbC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMpO1xuXHR9LFxuXG5cdHJlbmRlckZvcm06IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGludmFsaWRGaWxlcyA9IF8uZmlsdGVyKHRoaXMubW9kZWwuZ2V0KFwiZmlsZXNcIiksIGYgPT4ge1xuXHRcdFx0aWYgKGYgPT09IG51bGwpXG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0ZWxzZSBpZiAoZiBpbnN0YW5jZW9mIEJhY2tib25lLk1vZGVsICYmIGYuZ2V0KFwiZXJyb3JzXCIpICYmIF8udmFsdWVzKGYuZ2V0KFwiZXJyb3JzXCIpKS5sZW5ndGggPiAwKVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGVsc2UgaWYgKGYgaW5zdGFuY2VvZiBCYWNrYm9uZS5Nb2RlbCAmJiAoXy5pc05pbChmLmdldChcImVycm9yc1wiKSkgfHwgXy52YWx1ZXMoZi5nZXQoXCJlcnJvcnNcIikpLmxlbmd0aCA9PT0gMCkpXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdGVsc2UgaWYgKF8udmFsdWVzKHRoaXMuYnVsa0RyYWdEcm9wSGVscGVyLmdldFJlc291cmNlTW9kZWwobmV3IEJhY2tib25lLk1vZGVsKF8ubWVyZ2UoZiwgeyBmaWxlOiBmIH0pKSkuZ2V0KFwiZXJyb3JzXCIpKS5sZW5ndGggPiAwKVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0pO1xuXG5cdFx0Ly8gSWYgb25seSBpbnZhbGlkIGZpbGVzIGFyZSBwcmVzZW50LCBzaG93IGVycm9yIHZpZXdcblx0XHRpZiAodGhpcy5tb2RlbC5oYXMoXCJmaWxlc1wiKSAmJiB0aGlzLm1vZGVsLmdldChcImZpbGVzXCIpLmxlbmd0aCA9PT0gaW52YWxpZEZpbGVzLmxlbmd0aCkge1xuXHRcdFx0dGhpcy5zZXRVSVJlYWR5KCk7XG5cdFx0XHR0aGlzLnRyaWdnZXIoXCJhY3Rpb25cIiwgXCJjbG9zZVwiKTtcblx0XHRcdHRoaXMuY2xvc2UoKTtcblx0XHRcdHRoaXMuRXJyb3JEaWFsb2cgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHRcdHRpdGxlOiBcIjxzcGFuIGNsYXNzPSdmYWwgZmEtdGltZXMtY2lyY2xlJy8+IEVycm9yOiBObyB2YWxpZCBmaWxlcyBmb3VuZFwiLFxuXHRcdFx0XHRib2R5OiBgPHA+T25seSBpbnZhbGlkIGZpbGVzIHdoZXJlIGRldGVjdGVkLiBQbGVhc2UgdHJ5IGFnYWluIHdpdGggdmFsaWQgZmlsZXMuPC9wPlxuXHRcdFx0XHRcdDxwPlRoZSBzdXBwb3J0ZWQgZmlsZSB0eXBlcyBhcmUgZXhjZWwsIHBvd2VycG9pbnQsIHdvcmQsIHZpZGVvLCBwZGYsIGF1ZGlvLCBpbWFnZSwgdGV4dCwgY3N2IGZsYXNoY2FyZCBkZWNrLjwvcD5gLFxuXHRcdFx0XHRob3N0OiBcIiNtb2RhbHNcIixcblx0XHRcdFx0aGlkZUJ1dHRvbnM6IFtcImNsb3NlXCJdLFxuXHRcdFx0XHR3YXJuaW5nOiB0cnVlLFxuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMuRXJyb3JEaWFsb2cuc2hvdygpO1xuXHRcdH1cblx0XHRlbHNlIGlmICh0aGlzLm1vZGVsLmdldChcImNob29zZUZpbGVzXCIpIHx8IF8uZmlsdGVyKHRoaXMubW9kZWwuZ2V0KFwiZmlsZXNcIiksIGYgPT4gZiAhPT0gbnVsbCkubGVuZ3RoID4gMCkge1xuXHRcdFx0dGhpcy5idWxrVXBsb2FkV2l6YXJkID0gbmV3IEJ1bGtVcGxvYWRXaXphcmQoe1xuXHRcdFx0XHRtb2RlbDogbmV3IEJhY2tib25lLk1vZGVsKHsgZmlsZXM6IHRoaXMubW9kZWwuZ2V0KFwiZmlsZXNcIikgfSksXG5cdFx0XHR9KTtcblx0XHRcdHRoaXMudWkucmVzb3VyY2VDb250YWluZXIuYXBwZW5kKHRoaXMuYnVsa1VwbG9hZFdpemFyZC5yZW5kZXIoKS5lbCk7XG5cblx0XHRcdGlmICh0aGlzLm1vZGVsLmdldChcImZpbGVzXCIpKSB7XG5cdFx0XHRcdHRoaXMudWkuY2hvb3NlTGFiZWwucmVtb3ZlQ2xhc3MoXCJhY3RpdmVcIik7XG5cdFx0XHRcdHRoaXMudWkuY29uZmlybUxhYmVsLmFkZENsYXNzKFwiYWN0aXZlXCIpO1xuXHRcdFx0XHR0aGlzLnNldFNhdmVRdWV1ZSgpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHRoaXMudWkuY2hvb3NlTGFiZWwuYWRkQ2xhc3MoXCJhY3RpdmVcIik7XG5cdFx0XHRcdHRoaXMudWkuY29uZmlybUxhYmVsLnJlbW92ZUNsYXNzKFwiYWN0aXZlXCIpO1xuXHRcdFx0XHR0aGlzLnVpLmNvbmZpcm1CdG4ucHJvcChcImRpc2FibGVkXCIsIHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMuc2hvd0Vycm9yKG5ldyBFcnJvcnMuTW9kZWwoe1xuXHRcdFx0XHR0aXRsZTogXCJTYXZlIEVycm9yXCIsXG5cdFx0XHRcdG1lc3NhZ2U6IFwiRm9sZGVycyBhcmUgbm90IHN1cHBvcnRlZCwgcmF0aGVyIHRyeSBkcmFnZ2luZyBmaWxlcyBpbnRvIHRoaXMgdmlldy5cIixcblx0XHRcdFx0cmVzcG9uc2U6IHsgc3RhdHVzOiBcImZvbGRlcnMgYXJlIG5vdCBzdXBwb3J0ZWRcIiB9LFxuXHRcdFx0fSkpO1xuXG5cdFx0XHR0aGlzLmJ1bGtVcGxvYWRXaXphcmQgPSBuZXcgQnVsa1VwbG9hZFdpemFyZCh7XG5cdFx0XHRcdG1vZGVsOiBuZXcgQmFja2JvbmUuTW9kZWwoeyB9KSxcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLnVpLmNob29zZUxhYmVsLmFkZENsYXNzKFwiYWN0aXZlXCIpO1xuXHRcdFx0dGhpcy51aS5jb25maXJtTGFiZWwucmVtb3ZlQ2xhc3MoXCJhY3RpdmVcIik7XG5cdFx0XHR0aGlzLnVpLmNvbmZpcm1CdG4ucHJvcChcImRpc2FibGVkXCIsIHRydWUpO1xuXG5cdFx0XHR0aGlzLnVpLnJlc291cmNlQ29udGFpbmVyLmFwcGVuZCh0aGlzLmJ1bGtVcGxvYWRXaXphcmQucmVuZGVyKCkuZWwpO1xuXHRcdH1cblxuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5idWxrVXBsb2FkV2l6YXJkLCBcImZpbGVzLXNlbGVjdGVkXCIsIHRoaXMub25GaWxlc1NlbGVjdGVkLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdG9uQ2hvb3NlTGFiZWxhbmNlbEJ0bkNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIXRoaXMudWkuY2hvb3NlTGFiZWwuaGFzQ2xhc3MoXCJkaXNhYmxlZFwiKSkge1xuXHRcdFx0dGhpcy51aS5jb25maXJtTGFiZWwucmVtb3ZlQ2xhc3MoXCJhY3RpdmVcIik7XG5cdFx0XHR0aGlzLnVpLmNob29zZUxhYmVsLmFkZENsYXNzKFwiYWN0aXZlXCIpO1xuXHRcdFx0dGhpcy5idWxrVXBsb2FkV2l6YXJkLnJlbmRlclN0ZXAoXCJjaG9vc2UtZmlsZXNcIik7XG5cdFx0fVxuXHR9LFxuXG5cdG9uQ29uZmlybUxhYmVsYW5jZWxCdG5DbGljazogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLnVpLmNob29zZUxhYmVsLmhhc0NsYXNzKFwiZGlzYWJsZWRcIikpIHtcblx0XHRcdHRoaXMudWkuY2hvb3NlTGFiZWwucmVtb3ZlQ2xhc3MoXCJhY3RpdmVcIik7XG5cdFx0XHR0aGlzLnVpLmNvbmZpcm1MYWJlbC5hZGRDbGFzcyhcImFjdGl2ZVwiKTtcblx0XHRcdHRoaXMuYnVsa1VwbG9hZFdpemFyZC5yZW5kZXJTdGVwKFwiY29uZmlybVwiKTtcblxuXHRcdFx0aWYgKHRoaXMuY3VycmVudGx5U2F2aW5nKVxuXHRcdFx0XHR0aGlzLmxpc3RlblRvKHRoaXMuY3VycmVudGx5U2F2aW5nLCBcInVwbG9hZDpwcm9ncmVzc1wiLCB0aGlzLm9uVXBsb2FkUHJvZ3Jlc3MuYmluZCh0aGlzLCB0aGlzLmN1cnJlbnRseVNhdmluZy5nZXQoXCJmaWxlTW9kZWxcIikpKTtcblx0XHR9XG5cdH0sXG5cblx0c2V0U2F2ZVF1ZXVlOiBmdW5jdGlvbigpIHtcblx0XHRsZXQgZXJyb3JDb3VudCA9IDA7XG5cdFx0Y29uc3QgZmlsZXMgPSB0aGlzLmJ1bGtVcGxvYWRXaXphcmQuZmlsZUxpc3QgJiYgdGhpcy5idWxrVXBsb2FkV2l6YXJkLmZpbGVMaXN0LmNvbGxlY3Rpb24ubW9kZWxzID8gdGhpcy5idWxrVXBsb2FkV2l6YXJkLmZpbGVMaXN0LmNvbGxlY3Rpb24ubW9kZWxzIDogdGhpcy5tb2RlbC5nZXQoXCJmaWxlc1wiKTtcblxuXHRcdHRoaXMuc2F2ZVF1ZXVlID0gXy5maWx0ZXIoZmlsZXMsIGZpbGUgPT4ge1xuXHRcdFx0aWYgKGZpbGUuZ2V0KFwic2VsZWN0ZWRcIikgPT09IGZhbHNlKSB7XG5cdFx0XHRcdHRoaXMuY2FuY2VsZWRGaWxlcy5wdXNoKGZpbGUpO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghZmlsZS5nZXQoXCJzYXZlZFwiKSAmJiAoXy52YWx1ZXMoZmlsZS5nZXQoXCJlcnJvcnNcIikpLmxlbmd0aCA9PT0gMCB8fCBmaWxlLmdldChcInJldHJ5XCIpKSkge1xuXHRcdFx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcoZmlsZSwgXCJ1cGxvYWQ6Y2FuY2VsXCIsIHRoaXMub25VcGxvYWRDYW5jZWwuYmluZCh0aGlzLCBmaWxlKSk7XG5cdFx0XHRcdHRoaXMubGlzdGVuVG8oZmlsZSwgXCJ1cGxvYWQ6Y2FuY2VsXCIsIHRoaXMub25VcGxvYWRDYW5jZWwuYmluZCh0aGlzLCBmaWxlKSk7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0ZXJyb3JDb3VudCsrO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0pO1xuXG5cdFx0Ly8gSWYgYWxsIGZpbGVzIGFyZSBpbnZhbGlkLCBkaXNhYmxlIHRoZSBjb25maXJtIGJ1dHRvblxuXHRcdGlmIChlcnJvckNvdW50ID4gMCAmJiB0aGlzLnNhdmVRdWV1ZS5sZW5ndGggPT09IDApXG5cdFx0XHR0aGlzLnVpLmNvbmZpcm1CdG4ucHJvcChcImRpc2FibGVkXCIsIHRydWUpO1xuXHR9LFxuXG5cdG9uRmlsZXNTZWxlY3RlZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5jb25maXJtQnRuLnByb3AoXCJkaXNhYmxlZFwiLCBmYWxzZSk7XG5cdH0sXG5cblx0b25Db25maXJtQnRuQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkuY29uZmlybUJ0bi5wcm9wKFwiZGlzYWJsZWRcIiwgdHJ1ZSk7XG5cdFx0dGhpcy5lcnJvckNvdW50ID0gMDtcblx0XHR0aGlzLnVwbG9hZFN0YXJ0ZWQgPSB0cnVlO1xuXG5cdFx0dGhpcy51aS5jaG9vc2VMYWJlbC5hZGRDbGFzcyhcImRpc2FibGVkXCIpO1xuXG5cdFx0dGhpcy5zZXRTYXZlUXVldWUoKTtcblxuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcImRvbnRTYXZlXCIpKSB7XG5cdFx0XHR0aGlzLnRyaWdnZXIoXCJhY3Rpb25cIiwgXCJzYXZlXCIsIHRoaXMuc2F2ZVF1ZXVlLCB0aGlzLmNhbmNlbGVkRmlsZXMpO1xuXHRcdFx0dGhpcy5kZXN0cm95KCk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5zYXZlRmlsZXMoKTtcblx0XHR9XG5cdH0sXG5cblx0c2F2ZUZpbGVzOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5zYXZlUXVldWUubGVuZ3RoID09PSAwIHx8IHRoaXMuZG9udFNhdmVGaWxlcylcblx0XHRcdHJldHVybjtcblxuXHRcdGlmICghdGhpcy5jdXJyZW50bHlTYXZpbmcpXG5cdFx0XHR0aGlzLmN1cnJlbnRseVNhdmluZyA9IHRoaXMuc2F2ZVF1ZXVlLnNoaWZ0KCk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuY3VycmVudGx5U2F2aW5nLCBcInVwbG9hZDpwcm9ncmVzc1wiLCB0aGlzLm9uVXBsb2FkUHJvZ3Jlc3MuYmluZCh0aGlzLCB0aGlzLmN1cnJlbnRseVNhdmluZy5nZXQoXCJmaWxlTW9kZWxcIikpKTtcblxuXHRcdC8vIFNhdmUgdGhlIG1vZGVsLCB1cGxvYWRpbmcgdGhlIGZpbGVcblx0XHR0aGlzLnhoclt0aGlzLmN1cnJlbnRseVNhdmluZy5jaWRdID0gdGhpcy5jdXJyZW50bHlTYXZpbmcuYmluYXJ5U2F2ZShudWxsLCB7XG5cdFx0XHR2YWxpZGF0ZTogZmFsc2UsXG5cdFx0XHR3YWl0OiB0cnVlLFxuXHRcdFx0ZGF0YTogdGhpcy5jdXJyZW50bHlTYXZpbmcuYXR0cmlidXRlcyxcblx0XHRcdHN1Y2Nlc3M6IHRoaXMuc2F2ZVN1Y2Nlc3MuYmluZCh0aGlzLCB0aGlzLmN1cnJlbnRseVNhdmluZy5nZXQoXCJmaWxlTW9kZWxcIikpLFxuXHRcdFx0ZXJyb3I6IHRoaXMuc2F2ZUVycm9yLmJpbmQodGhpcywgdGhpcy5jdXJyZW50bHlTYXZpbmcuZ2V0KFwiZmlsZU1vZGVsXCIpKSxcblx0XHR9KTtcblx0fSxcblxuXHRzYXZlU3VjY2VzczogZnVuY3Rpb24oZmlsZSwgbW9kZWwpIHtcblx0XHR0aGlzLnhocltmaWxlLmNpZF0gPSBudWxsO1xuXHRcdHRoaXMuc2V0VUlSZWFkeSgpO1xuXHRcdG1vZGVsLnRyaWdnZXIoXCJzYXZlOnN1Y2Nlc3NcIiwgbW9kZWwpO1xuXHRcdHRoaXMuY3VycmVudGx5U2F2aW5nID0gZmFsc2U7XG5cdFx0ZmlsZS5zZXQoXCJzYXZlZFwiLCB0cnVlKTtcblx0XHRtb2RlbC5zZXQoXCJzYXZlZFwiLCB0cnVlKTtcblxuXHRcdGlmICh0aGlzLnNhdmVRdWV1ZS5sZW5ndGggPT09IDAgJiYgdGhpcy5lcnJvckNvdW50ID09PSAwKSB7XG5cdFx0XHR0aGlzLnRyaWdnZXIoXCJhY3Rpb25cIiwgXCJzYXZlXCIpO1xuXHRcdFx0dGhpcy5kZXN0cm95KCk7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKHRoaXMuc2F2ZVF1ZXVlLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmVycm9yQ291bnQgPiAwKSB7XG5cdFx0XHR0aGlzLnVpLmNvbmZpcm1CdG4ucHJvcChcImRpc2FibGVkXCIsIHRydWUpO1xuXHRcdFx0dGhpcy51aS5jYW5jZWxCdG4udGV4dChcIkNsb3NlXCIpO1xuXHRcdH1cblxuXHRcdHRoaXMuc2F2ZUZpbGVzKCk7XG5cdH0sXG5cblx0c2F2ZUVycm9yOiBmdW5jdGlvbihmaWxlLCBtb2RlbCwgeGhyKSB7XG5cdFx0dGhpcy54aHJbZmlsZS5jaWRdID0gbnVsbDtcblx0XHR0aGlzLnNldFVJUmVhZHkoKTtcblx0XHR0aGlzLmVycm9yQ291bnQrKztcblxuXHRcdGlmICh4aHIuc3RhdHVzVGV4dCA9PT0gXCJhYm9ydFwiKVxuXHRcdFx0bW9kZWwudHJpZ2dlcihcInNhdmU6ZXJyb3JcIiwgeyByZXRyeTogdHJ1ZSwgcmVzcG9uc2VKU09OOiB7IGluZm86IFwiVXBsb2FkIHN1c3BlbmRlZC4gT25jZSB0aGUgY29ubmVjdGlvbiBpcyByZWVzdGFibGlzaGVkLCB5b3UgY2FuIGNsaWNrIHRoZSBjb25maXJtIGJ1dHRvbiB0byB0cnkgYWdhaW4uXCIgfSB9KTtcblx0XHRlbHNlXG5cdFx0XHRtb2RlbC50cmlnZ2VyKFwic2F2ZTplcnJvclwiLCB4aHIpO1xuXG5cdFx0aWYgKHRoaXMuc2F2ZVF1ZXVlLmxlbmd0aCA+IDApXG5cdFx0XHR0aGlzLmN1cnJlbnRseVNhdmluZyA9IGZhbHNlO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMudWkuY2FuY2VsQnRuLnRleHQoXCJDbG9zZVwiKTtcblxuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcIndzQ29ubmVjdGVkXCIpKVxuXHRcdFx0dGhpcy5zYXZlRmlsZXMoKTtcblx0fSxcblxuXHRvblVwbG9hZFByb2dyZXNzOiBmdW5jdGlvbihmaWxlLCBwZXJjZW50YWdlKSB7XG5cdFx0ZmlsZS50cmlnZ2VyKFwidXBsb2FkOnByb2dyZXNzXCIsIHBlcmNlbnRhZ2UsIGZpbGUpO1xuXHR9LFxuXG5cdG9uVXBsb2FkQ2FuY2VsOiBmdW5jdGlvbihjYW5jZWxlZEZpbGUpIHtcblx0XHQvLyBTZXQgc2VwYXJhdGUgc2F2ZVF1ZXVlIHRvIGZpbHRlciBvdXQgc2F2ZWQgZmlsZXMsIGNhbmNlbGVkIGZpbGVzIGFuZCBmaWxlcyB3aXRoIGVycm9yc1xuXHRcdGNvbnN0IHNhdmVRdWV1ZSA9IF8uZmlsdGVyKHRoaXMuYnVsa1VwbG9hZFdpemFyZC5maWxlTGlzdC5jb2xsZWN0aW9uLm1vZGVscywgZmlsZSA9PiBmaWxlLmNpZCAhPT0gY2FuY2VsZWRGaWxlLmNpZCAmJiAhZmlsZS5nZXQoXCJzYXZlZFwiKSAmJiBfLnZhbHVlcyhmaWxlLmdldChcImVycm9yc1wiKSkubGVuZ3RoID09PSAwKTtcblxuXHRcdGlmIChzYXZlUXVldWUubGVuZ3RoID09PSAwKVxuXHRcdFx0dGhpcy51aS5jb25maXJtQnRuLnByb3AoXCJkaXNhYmxlZFwiLCB0cnVlKTtcblxuXHRcdC8vIHJlbW92ZSBjYW5jZWxlZEZpbGUgZnJvbSB0aGlzLnNhdmVRdWV1ZVxuXHRcdHRoaXMuc2F2ZVF1ZXVlID0gXy5yZWplY3QodGhpcy5zYXZlUXVldWUsIGZpbGUgPT4gZmlsZS5jaWQgPT09IGNhbmNlbGVkRmlsZS5jaWQpO1xuXG5cdFx0aWYgKHRoaXMuY3VycmVudGx5U2F2aW5nICYmIGNhbmNlbGVkRmlsZS5jaWQgPT09IHRoaXMuY3VycmVudGx5U2F2aW5nLmNpZCkge1xuXHRcdFx0Ly8gQWJvcnQgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBzZXJ2ZXIgaWYgaXRlbSBpcyBpbiBwcm9ncmVzc1xuXHRcdFx0aWYgKHRoaXMuY3VycmVudGx5U2F2aW5nICYmIHRoaXMueGhyW3RoaXMuY3VycmVudGx5U2F2aW5nLmNpZF0pIHtcblx0XHRcdFx0dGhpcy54aHJbdGhpcy5jdXJyZW50bHlTYXZpbmcuY2lkXS5hYm9ydCgpO1xuXHRcdFx0XHR0aGlzLmN1cnJlbnRseVNhdmluZyA9IGZhbHNlO1xuXHRcdFx0XHQvLyBSZXZlcnQgYW55IGNoYW5nZXMgbWFkZSB0byB0aGUgbW9kZWxcblx0XHRcdFx0aWYgKHRoaXMub2xkQXR0cmlidXRlcylcblx0XHRcdFx0XHR0aGlzLm1vZGVsLnNldCh0aGlzLm9sZEF0dHJpYnV0ZXMsIHsgdmFsaWRhdGU6IGZhbHNlIH0pO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmN1cnJlbnRseVNhdmluZyA9IGZhbHNlO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5tb2RlbC5nZXQoXCJkb250U2F2ZVwiKSAmJiB0aGlzLnVwbG9hZFN0YXJ0ZWQgJiYgdGhpcy5jdXJyZW50bHlTYXZpbmcgPT09IGZhbHNlKVxuXHRcdFx0dGhpcy5zYXZlRmlsZXMoKTtcblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZG9udFNhdmVGaWxlcyA9IHRydWU7XG5cdFx0aWYgKHRoaXMuY3VycmVudGx5U2F2aW5nICYmIHRoaXMueGhyW3RoaXMuY3VycmVudGx5U2F2aW5nLmNpZF0pXG5cdFx0XHR0aGlzLnhoclt0aGlzLmN1cnJlbnRseVNhdmluZy5jaWRdLmFib3J0KCk7XG5cblx0XHRpZiAodGhpcy5zYXZlUXVldWUgJiYgdGhpcy5zYXZlUXVldWUubGVuZ3RoID4gMCkge1xuXHRcdFx0Xy5mb3JPd24odGhpcy54aHIsICh2YWx1ZSwga2V5KSA9PiB7XG5cdFx0XHRcdGlmIChrZXkgIT09IFwiYWJvcnRcIiAmJiAhXy5pc05pbCh2YWx1ZSkpXG5cdFx0XHRcdFx0dmFsdWUuYWJvcnQoKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHRoaXMuc2F2ZVF1ZXVlID0gW107XG5cdFx0dGhpcy50cmlnZ2VyKFwiYWN0aW9uXCIsIF8udG9Mb3dlcih0aGlzLnVpLmNhbmNlbEJ0bi50ZXh0KCkpKTtcblx0fSxcblxuXHR3c0Nvbm5lY3RlZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5tb2RlbC5zZXQoeyB3c0Nvbm5lY3RlZDogdHJ1ZSB9KTtcblx0XHR0aGlzLnVpLmNvbmZpcm1CdG4ucHJvcChcImRpc2FibGVkXCIsIGZhbHNlKTtcblxuXHRcdHRoaXMuc2V0VUlWaXNpYmxlKCk7XG5cdFx0dGhpcy5zZXRTdGF0dXNSZWFkeSgpO1xuXG5cdFx0aWYgKHRoaXMuRXJyb3JWaWV3KSB7XG5cdFx0XHR0aGlzLkVycm9yVmlldy5kZXN0cm95KCk7XG5cdFx0XHR0aGlzLkVycm9yVmlldyA9IG51bGw7XG5cdFx0fVxuXG5cdFx0Z2xvYmFsUmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7XG5cdFx0XHRjb250ZW50OiBcIlRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIHJlZXN0YWJsaXNoZWQuXCIsXG5cdFx0XHRpY29uOiBcImZhLXdpZmlcIixcblx0XHRcdGljb25Db2xvdXI6IFwiZ3JlZW5cIixcblx0XHRcdGhvc3Q6IFwiI21vZGFsc1wiLFxuXHRcdH0pO1xuXHR9LFxuXG5cdHdzRGlzY29ubmVjdGVkOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm1vZGVsLnNldCh7IHdzQ29ubmVjdGVkOiBmYWxzZSB9KTtcblx0XHRpZiAodGhpcy5jdXJyZW50bHlTYXZpbmcgJiYgdGhpcy54aHJbdGhpcy5jdXJyZW50bHlTYXZpbmcuY2lkXSkge1xuXHRcdFx0dGhpcy54aHJbdGhpcy5jdXJyZW50bHlTYXZpbmcuY2lkXS5hYm9ydCgpO1xuXHRcdFx0Ly8gcmVhZGQgdGhpcy5jdXJyZW50bHlTYXZpbmcgdG8gc2F2ZVF1ZXVlXG5cdFx0XHR0aGlzLnNhdmVRdWV1ZS51bnNoaWZ0KHRoaXMuY3VycmVudGx5U2F2aW5nKTtcblx0XHRcdHRoaXMuY3VycmVudGx5U2F2aW5nID0gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dGhpcy5zaG93RXJyb3IobmV3IEVycm9ycy5Nb2RlbCh7XG5cdFx0XHR0aXRsZTogXCJTYXZlIEVycm9yXCIsXG5cdFx0XHRtZXNzYWdlOiBcIkNvbm5lY3Rpdml0eSBsb3N0LiBUaGUgdXBsb2FkIGhhcyBiZWVuIHN1c3BlbmRlZC5cIixcblx0XHRcdHJlc3BvbnNlOiB7IHN0YXR1czogXCJDb25uZWN0aW9uIHRvIHNlcnZlciBsb3N0XCIgfSxcblx0XHR9KSk7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar _regenerator = require(\"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\nvar Promise = require(\"bluebird\");\n\nvar ErrorView = require(\"./errorView\");\nvar StatusView = require(\"./statusView\");\n\n// ISO Day of Week\nvar WEEK_DAYS = {\n\tmonday: 1,\n\ttuesday: 2,\n\twednesday: 3,\n\tthursday: 4,\n\tfriday: 5,\n\tsaturday: 6,\n\tsunday: 7\n};\n\nvar Header = Backbone.Marionette.View.extend({\n\tclassName: \"cal-back-header\",\n\n\ttemplate: require(\"./templates/calBack.nunj\").header,\n\n\tui: {\n\t\tbuttonNavigateLeft: \".navigator-button-left\",\n\t\tbuttonNavigateRight: \".navigator-button-right\",\n\t\tmonthTitle: \".month-title\",\n\t\tyearTitle: \".year-title\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonNavigateLeft\": \"onButtonNavigateLeftClick\",\n\t\t\"click @ui.buttonNavigateRight\": \"onButtonNavigateRightClick\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tweekDays: this.weekDays\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.channel = options.channel;\n\t\tthis.currentDate = options.defaultDate.clone() || moment();\n\t\tthis.eventBus = options.eventBus;\n\n\t\t// Initialize the weekday strings for display\n\t\tthis.weekDays = [\"M\", \"T\", \"W\", \"T\", \"F\", \"S\", \"S\"];\n\n\t\t// Adjust the weekdays according to the specified first day of the week\n\t\tvar firstDayOfWeek = options.firstDayOfWeek - 1;\n\n\t\tfor (var i = 0; i < firstDayOfWeek; i++) {\n\t\t\tthis.weekDays.push(this.weekDays.shift());\n\t\t} // Listen to events\n\t\tthis.listenTo(this.eventBus, \"navigate\", this.updateTitle.bind(this));\n\t\tthis.listenTo(this.eventBus, \"select:day\", this.onSelectDay.bind(this));\n\n\t\tif (this.channel !== undefined) this.listenTo(Backbone.Radio.channel(this.channel), \"calendar:refresh\", this.onRefresh.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.eventBus.trigger(\"navigate\", this.currentDate);\n\t},\n\n\tonButtonNavigateLeftClick: function onButtonNavigateLeftClick() {\n\t\tthis.currentDate.subtract(1, \"months\");\n\n\t\tthis.eventBus.trigger(\"navigate\", this.currentDate);\n\t},\n\n\tonButtonNavigateRightClick: function onButtonNavigateRightClick() {\n\t\tthis.currentDate.add(1, \"months\");\n\n\t\tthis.eventBus.trigger(\"navigate\", this.currentDate);\n\t},\n\n\tonRefresh: function onRefresh() {\n\t\tthis.eventBus.trigger(\"navigate\", this.currentDate);\n\t},\n\n\tonSelectDay: function onSelectDay(day) {\n\t\tvar dayDate = this.currentDate.clone();\n\n\t\tdayDate.date(day);\n\n\t\tthis.eventBus.trigger(\"select:date\", dayDate);\n\t},\n\n\tupdateTitle: function updateTitle(displayDate) {\n\t\tthis.ui.monthTitle.text(displayDate.format(\"MMMM\"));\n\t\tthis.ui.yearTitle.text(displayDate.format(\"YYYY\"));\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(this.eventBus);\n\t}\n});\n\nvar Week = Backbone.Marionette.View.extend({\n\tclassName: \"cal-back-week\",\n\n\ttemplate: require(\"./templates/calBack.nunj\").week,\n\n\tui: {\n\t\tday: \".cal-back-day\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.day\": \"onDayClick\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.eventBus = options.eventBus;\n\t},\n\n\tonDayClick: function onDayClick(event) {\n\t\tevent.stopPropagation();\n\n\t\tvar day = $(event.currentTarget);\n\n\t\tif (!day.hasClass(\"excluded\") && day.hasClass(\"clickable\")) this.eventBus.trigger(\"select:day\", parseInt(day.attr(\"data-day\"), 10));\n\t}\n});\n\nvar Body = Backbone.Marionette.CollectionView.extend({\n\tclassName: \"cal-back-body\",\n\n\tchildView: Week,\n\n\tchildViewOptions: function childViewOptions() {\n\t\treturn {\n\t\t\teventBus: this.eventBus\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.eventBus = options.eventBus;\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"cal-back\",\n\n\ttemplate: require(\"./templates/calBack.nunj\").layout,\n\n\tregions: {\n\t\theader: \".header-region\",\n\t\tbody: \".body-region\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\t// Options:\n\t\t//   channel: The name of the channel on which the calendar will trigger events.\n\t\t//\n\t\t//   externalRequest: The name of the request that calBack will trigger on \"channel\" with arguments 'startDate' and\n\t\t//   'endDate' (each a Moment instance) whenever a month is displayed by the calendar (on render and on navigation).\n\t\t//   The request handler must return an object of the form: { clickableDates: [], disabledDates: [],\n\t\t//   highlightedDates: [], markedDates: [] }. The mentioned attributes correspond to the arrays expected in the\n\t\t//   similarly named options and must contain Unix timestamps, as applicable, in the range ['startDate','endDate'].\n\t\tthis.channel = options.channel || \"_\";\n\t\tthis.clickableDates = options.clickableDates;\n\t\tthis.defaultDate = options.defaultDate;\n\t\tthis.disabledDates = options.disabledDates;\n\t\tthis.externalRequest = options.externalRequest;\n\t\tthis.firstDayOfWeek = WEEK_DAYS[options.firstDayOfWeek.toLowerCase()];\n\t\tthis.highlightedDates = options.highlightedDates;\n\t\tthis.markedDates = options.markedDates;\n\t\tthis.maximumDate = options.maximumDate;\n\t\tthis.minimumDate = options.minimumDate;\n\n\t\tthis.eventBus = new Backbone.Marionette.Application();\n\n\t\tthis.weekCollection = new Backbone.Collection();\n\n\t\tthis.listenTo(Backbone.Radio.channel(this.channel), \"calendar:navigate\", this.onNavigate.bind(this));\n\t\tthis.listenTo(this.eventBus, \"navigate\", this.updateWeekCollection.bind(this));\n\t\tthis.listenTo(this.eventBus, \"select:date\", this.onSelectDate.bind(this));\n\t},\n\n\tonRender: function () {\n\t\tvar _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee() {\n\t\t\tvar _this = this;\n\n\t\t\treturn _regenerator2.default.wrap(function _callee$(_context) {\n\t\t\t\twhile (1) {\n\t\t\t\t\tswitch (_context.prev = _context.next) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tif (!(this.defaultDate === undefined)) {\n\t\t\t\t\t\t\t\t_context.next = 10;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_context.prev = 1;\n\t\t\t\t\t\t\t_context.next = 4;\n\t\t\t\t\t\t\treturn new Promise(function (resolve, reject) {\n\t\t\t\t\t\t\t\tBackbone.Radio.channel(_this.channel).request(\"calendar:date:default\", resolve, reject);\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\tthis.defaultDate = _context.sent;\n\t\t\t\t\t\t\t_context.next = 10;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 7:\n\t\t\t\t\t\t\t_context.prev = 7;\n\t\t\t\t\t\t\t_context.t0 = _context[\"catch\"](1);\n\t\t\t\t\t\t\tthrow _context.t0;\n\n\t\t\t\t\t\tcase 10:\n\n\t\t\t\t\t\t\tthis.header = new Header({\n\t\t\t\t\t\t\t\tchannel: this.channel,\n\t\t\t\t\t\t\t\tdefaultDate: this.defaultDate,\n\t\t\t\t\t\t\t\teventBus: this.eventBus,\n\t\t\t\t\t\t\t\tfirstDayOfWeek: this.firstDayOfWeek\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tthis.showChildView(\"header\", this.header);\n\n\t\t\t\t\t\tcase 12:\n\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\treturn _context.stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, _callee, this, [[1, 7]]);\n\t\t}));\n\n\t\tfunction onRender() {\n\t\t\treturn _ref.apply(this, arguments);\n\t\t}\n\n\t\treturn onRender;\n\t}(),\n\n\tonNavigate: function onNavigate(displayDate) {\n\t\tthis.eventBus.trigger(\"navigate\", displayDate);\n\t},\n\n\tonSelectDate: function onSelectDate(date) {\n\t\tthis.trigger(\"select\", date);\n\t\tBackbone.Radio.channel(this.channel).trigger(\"calendar:select\", date);\n\t},\n\n\tshowCalendar: function showCalendar() {\n\t\tthis.showChildView(\"body\", new Body({\n\t\t\tcollection: this.weekCollection,\n\t\t\teventBus: this.eventBus\n\t\t}));\n\t},\n\n\tshowError: function showError(error) {\n\t\tthis.showChildView(\"body\", new ErrorView({ fetchError: error }));\n\t},\n\n\tshowStatus: function showStatus() {\n\t\tthis.showChildView(\"body\", new StatusView({\n\t\t\tmessage: \"\",\n\t\t\ttype: \"loading\"\n\t\t}));\n\t},\n\n\tupdateWeekCollection: function () {\n\t\tvar _ref2 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee2(displayDate) {\n\t\t\tvar _this2 = this;\n\n\t\t\tvar state, minimumDisplayDays, isClickable, isHighlighted, isMarked, startDate, endDate, daysAdded, i, data, week, days, _i;\n\n\t\t\treturn _regenerator2.default.wrap(function _callee2$(_context2) {\n\t\t\t\twhile (1) {\n\t\t\t\t\tswitch (_context2.prev = _context2.next) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t// Do not mutate the moment referenced by the parameter\n\t\t\t\t\t\t\tstate = displayDate.clone();\n\n\t\t\t\t\t\t\t// Ensure that the state begins on the first day of the month\n\n\t\t\t\t\t\t\tstate.startOf(\"month\");\n\n\t\t\t\t\t\t\t// Determine the minimum number of days to be displayed\n\t\t\t\t\t\t\tminimumDisplayDays = state.daysInMonth();\n\n\t\t\t\t\t\t\t// Roll back to the first day of the week\n\n\t\t\t\t\t\t\twhile (state.isoWeekday() !== this.firstDayOfWeek) {\n\t\t\t\t\t\t\t\tstate.subtract(\"1\", \"days\");\n\t\t\t\t\t\t\t\tminimumDisplayDays++;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Construct the week collection\n\n\t\t\t\t\t\t\tisClickable = function isClickable(queryDate) {\n\t\t\t\t\t\t\t\tvar clickable = false;\n\n\t\t\t\t\t\t\t\tvar satisfiesMinimum = _this2.minimumDate ? moment.unix(_this2.minimumDate).isSameOrBefore(queryDate, \"day\") : true;\n\t\t\t\t\t\t\t\tvar satisfiesMaximum = _this2.maximumDate ? moment.unix(_this2.maximumDate).isSameOrAfter(queryDate, \"day\") : true;\n\n\t\t\t\t\t\t\t\tif (satisfiesMinimum && satisfiesMaximum) {\n\t\t\t\t\t\t\t\t\tif (_this2.clickableDates) {\n\t\t\t\t\t\t\t\t\t\tif (_this2.clickableDates.length === 0) clickable = true;else clickable = Boolean(_.find(_this2.clickableDates, function (date) {\n\t\t\t\t\t\t\t\t\t\t\treturn moment.unix(date).isSame(queryDate, \"day\");\n\t\t\t\t\t\t\t\t\t\t}));\n\t\t\t\t\t\t\t\t\t} else if (_this2.disabledDates) {\n\t\t\t\t\t\t\t\t\t\tif (_this2.disabledDates.length === 0) clickable = true;else clickable = _.find(_this2.disabledDates, function (date) {\n\t\t\t\t\t\t\t\t\t\t\treturn moment.unix(date).isSame(queryDate, \"day\");\n\t\t\t\t\t\t\t\t\t\t}) === undefined;\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tclickable = true;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn clickable;\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tisHighlighted = function isHighlighted(queryDate) {\n\t\t\t\t\t\t\t\tvar highlighted = false;\n\n\t\t\t\t\t\t\t\tif (_this2.highlightedDates) highlighted = Boolean(_.find(_this2.highlightedDates, function (date) {\n\t\t\t\t\t\t\t\t\treturn moment.unix(date).isSame(queryDate, \"day\");\n\t\t\t\t\t\t\t\t}));\n\n\t\t\t\t\t\t\t\treturn highlighted;\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tisMarked = function isMarked(queryDate) {\n\t\t\t\t\t\t\t\tvar marked = false;\n\n\t\t\t\t\t\t\t\tif (_this2.markedDates) marked = Boolean(_.find(_this2.markedDates, function (date) {\n\t\t\t\t\t\t\t\t\treturn moment.unix(date).isSame(queryDate, \"day\");\n\t\t\t\t\t\t\t\t}));\n\n\t\t\t\t\t\t\t\treturn marked;\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tstartDate = state.clone();\n\t\t\t\t\t\t\tendDate = state.clone();\n\t\t\t\t\t\t\tdaysAdded = 0;\n\n\n\t\t\t\t\t\t\twhile (daysAdded < minimumDisplayDays) {\n\t\t\t\t\t\t\t\tfor (i = 0; i < 7; i++) {\n\t\t\t\t\t\t\t\t\tendDate.add(\"1\", \"days\");\n\t\t\t\t\t\t\t\t\tdaysAdded++;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (!this.externalRequest) {\n\t\t\t\t\t\t\t\t_context2.next = 29;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthis.showStatus();\n\n\t\t\t\t\t\t\tdata = void 0;\n\t\t\t\t\t\t\t_context2.prev = 14;\n\t\t\t\t\t\t\t_context2.next = 17;\n\t\t\t\t\t\t\treturn new Promise(function (resolve, reject) {\n\t\t\t\t\t\t\t\tBackbone.Radio.channel(_this2.channel).request(_this2.externalRequest, startDate, endDate, resolve, reject);\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\tcase 17:\n\t\t\t\t\t\t\tdata = _context2.sent;\n\n\t\t\t\t\t\t\tthis.showCalendar();\n\t\t\t\t\t\t\t_context2.next = 25;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 21:\n\t\t\t\t\t\t\t_context2.prev = 21;\n\t\t\t\t\t\t\t_context2.t0 = _context2[\"catch\"](14);\n\n\t\t\t\t\t\t\tthis.showError(_context2.t0);\n\t\t\t\t\t\t\tthrow _context2.t0;\n\n\t\t\t\t\t\tcase 25:\n\n\t\t\t\t\t\t\tthis.clickableDates = data.clickableDates;\n\t\t\t\t\t\t\tthis.disabledDates = data.disabledDates;\n\t\t\t\t\t\t\tthis.highlightedDates = data.highlightedDates;\n\t\t\t\t\t\t\tthis.markedDates = data.markedDates;\n\n\t\t\t\t\t\tcase 29:\n\n\t\t\t\t\t\t\tthis.weekCollection.reset();\n\n\t\t\t\t\t\t\twhile (state.isBefore(endDate, \"day\")) {\n\t\t\t\t\t\t\t\tweek = new Backbone.Model();\n\t\t\t\t\t\t\t\tdays = [];\n\n\n\t\t\t\t\t\t\t\tfor (_i = 0; _i < 7; _i++) {\n\t\t\t\t\t\t\t\t\tdays.push({\n\t\t\t\t\t\t\t\t\t\tclickable: isClickable(state),\n\t\t\t\t\t\t\t\t\t\tdate: state.date(),\n\t\t\t\t\t\t\t\t\t\texcluded: !state.isSame(displayDate, \"month\"),\n\t\t\t\t\t\t\t\t\t\thighlighted: isHighlighted(state),\n\t\t\t\t\t\t\t\t\t\tmarked: isMarked(state)\n\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\tstate.add(\"1\", \"days\");\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tweek.set(\"days\", days);\n\t\t\t\t\t\t\t\tthis.weekCollection.add(week);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (this.externalRequest === undefined) this.showCalendar();\n\n\t\t\t\t\t\t\tBackbone.Radio.channel(this.channel).trigger(\"calendar:change\", displayDate.clone().startOf(\"month\"));\n\n\t\t\t\t\t\tcase 33:\n\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\treturn _context2.stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, _callee2, this, [[14, 21]]);\n\t\t}));\n\n\t\tfunction updateWeekCollection(_x) {\n\t\t\treturn _ref2.apply(this, arguments);\n\t\t}\n\n\t\treturn updateWeekCollection;\n\t}(),\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(this.eventBus);\n\t\tthis.stopListening(Backbone.Radio.channel(this.channel));\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNhbEJhY2suanMiXSwibmFtZXMiOlsiJCIsInJlcXVpcmUiLCJfIiwiQmFja2JvbmUiLCJtb21lbnQiLCJQcm9taXNlIiwiRXJyb3JWaWV3IiwiU3RhdHVzVmlldyIsIldFRUtfREFZUyIsIm1vbmRheSIsInR1ZXNkYXkiLCJ3ZWRuZXNkYXkiLCJ0aHVyc2RheSIsImZyaWRheSIsInNhdHVyZGF5Iiwic3VuZGF5IiwiSGVhZGVyIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJleHRlbmQiLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsImhlYWRlciIsInVpIiwiYnV0dG9uTmF2aWdhdGVMZWZ0IiwiYnV0dG9uTmF2aWdhdGVSaWdodCIsIm1vbnRoVGl0bGUiLCJ5ZWFyVGl0bGUiLCJldmVudHMiLCJ0ZW1wbGF0ZUNvbnRleHQiLCJ3ZWVrRGF5cyIsImluaXRpYWxpemUiLCJvcHRpb25zIiwiY2hhbm5lbCIsImN1cnJlbnREYXRlIiwiZGVmYXVsdERhdGUiLCJjbG9uZSIsImV2ZW50QnVzIiwiZmlyc3REYXlPZldlZWsiLCJpIiwicHVzaCIsInNoaWZ0IiwibGlzdGVuVG8iLCJ1cGRhdGVUaXRsZSIsImJpbmQiLCJvblNlbGVjdERheSIsInVuZGVmaW5lZCIsIlJhZGlvIiwib25SZWZyZXNoIiwib25SZW5kZXIiLCJ0cmlnZ2VyIiwib25CdXR0b25OYXZpZ2F0ZUxlZnRDbGljayIsInN1YnRyYWN0Iiwib25CdXR0b25OYXZpZ2F0ZVJpZ2h0Q2xpY2siLCJhZGQiLCJkYXkiLCJkYXlEYXRlIiwiZGF0ZSIsImRpc3BsYXlEYXRlIiwidGV4dCIsImZvcm1hdCIsIm9uQmVmb3JlRGVzdHJveSIsInN0b3BMaXN0ZW5pbmciLCJXZWVrIiwid2VlayIsIm9uRGF5Q2xpY2siLCJldmVudCIsInN0b3BQcm9wYWdhdGlvbiIsImN1cnJlbnRUYXJnZXQiLCJoYXNDbGFzcyIsInBhcnNlSW50IiwiYXR0ciIsIkJvZHkiLCJDb2xsZWN0aW9uVmlldyIsImNoaWxkVmlldyIsImNoaWxkVmlld09wdGlvbnMiLCJtb2R1bGUiLCJleHBvcnRzIiwibGF5b3V0IiwicmVnaW9ucyIsImJvZHkiLCJjbGlja2FibGVEYXRlcyIsImRpc2FibGVkRGF0ZXMiLCJleHRlcm5hbFJlcXVlc3QiLCJ0b0xvd2VyQ2FzZSIsImhpZ2hsaWdodGVkRGF0ZXMiLCJtYXJrZWREYXRlcyIsIm1heGltdW1EYXRlIiwibWluaW11bURhdGUiLCJBcHBsaWNhdGlvbiIsIndlZWtDb2xsZWN0aW9uIiwiQ29sbGVjdGlvbiIsIm9uTmF2aWdhdGUiLCJ1cGRhdGVXZWVrQ29sbGVjdGlvbiIsIm9uU2VsZWN0RGF0ZSIsInJlc29sdmUiLCJyZWplY3QiLCJyZXF1ZXN0Iiwic2hvd0NoaWxkVmlldyIsInNob3dDYWxlbmRhciIsImNvbGxlY3Rpb24iLCJzaG93RXJyb3IiLCJlcnJvciIsImZldGNoRXJyb3IiLCJzaG93U3RhdHVzIiwibWVzc2FnZSIsInR5cGUiLCJzdGF0ZSIsInN0YXJ0T2YiLCJtaW5pbXVtRGlzcGxheURheXMiLCJkYXlzSW5Nb250aCIsImlzb1dlZWtkYXkiLCJpc0NsaWNrYWJsZSIsImNsaWNrYWJsZSIsInNhdGlzZmllc01pbmltdW0iLCJ1bml4IiwiaXNTYW1lT3JCZWZvcmUiLCJxdWVyeURhdGUiLCJzYXRpc2ZpZXNNYXhpbXVtIiwiaXNTYW1lT3JBZnRlciIsImxlbmd0aCIsIkJvb2xlYW4iLCJmaW5kIiwiaXNTYW1lIiwiaXNIaWdobGlnaHRlZCIsImhpZ2hsaWdodGVkIiwiaXNNYXJrZWQiLCJtYXJrZWQiLCJzdGFydERhdGUiLCJlbmREYXRlIiwiZGF5c0FkZGVkIiwiZGF0YSIsInJlc2V0IiwiaXNCZWZvcmUiLCJNb2RlbCIsImRheXMiLCJleGNsdWRlZCIsInNldCJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLElBQUlELFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUUsV0FBV0YsUUFBUSxVQUFSLENBQWpCO0FB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QTtBQUFBLEdBQXRCOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLElBdkZnRDs7QUFtTmhEL0Msa0JBQWlCLDJCQUFXO0FBQzNCLE9BQUtDLGFBQUwsQ0FBbUIsS0FBS3pCLFFBQXhCO0FBQ0EsT0FBS3lCLGFBQUwsQ0FBbUIzRCxTQUFTNEMsS0FBVCxDQUFlZCxPQUFmLENBQXVCLEtBQUtBLE9BQTVCLENBQW5CO0FBQ0E7QUF0TitDLENBQWhDLENBQWpCIiwiZmlsZSI6ImNhbEJhY2suanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IG1vbWVudCA9IHJlcXVpcmUoXCJtb21lbnRcIik7XG5jb25zdCBQcm9taXNlID0gcmVxdWlyZShcImJsdWViaXJkXCIpO1xuXG5jb25zdCBFcnJvclZpZXcgPSByZXF1aXJlKFwiLi9lcnJvclZpZXdcIik7XG5jb25zdCBTdGF0dXNWaWV3ID0gcmVxdWlyZShcIi4vc3RhdHVzVmlld1wiKTtcblxuLy8gSVNPIERheSBvZiBXZWVrXG5jb25zdCBXRUVLX0RBWVMgPSB7XG5cdG1vbmRheTogMSxcblx0dHVlc2RheTogMixcblx0d2VkbmVzZGF5OiAzLFxuXHR0aHVyc2RheTogNCxcblx0ZnJpZGF5OiA1LFxuXHRzYXR1cmRheTogNixcblx0c3VuZGF5OiA3LFxufTtcblxuY29uc3QgSGVhZGVyID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJjYWwtYmFjay1oZWFkZXJcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4vdGVtcGxhdGVzL2NhbEJhY2subnVualwiKS5oZWFkZXIsXG5cblx0dWk6IHtcblx0XHRidXR0b25OYXZpZ2F0ZUxlZnQ6IFwiLm5hdmlnYXRvci1idXR0b24tbGVmdFwiLFxuXHRcdGJ1dHRvbk5hdmlnYXRlUmlnaHQ6IFwiLm5hdmlnYXRvci1idXR0b24tcmlnaHRcIixcblx0XHRtb250aFRpdGxlOiBcIi5tb250aC10aXRsZVwiLFxuXHRcdHllYXJUaXRsZTogXCIueWVhci10aXRsZVwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmJ1dHRvbk5hdmlnYXRlTGVmdFwiOiBcIm9uQnV0dG9uTmF2aWdhdGVMZWZ0Q2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5idXR0b25OYXZpZ2F0ZVJpZ2h0XCI6IFwib25CdXR0b25OYXZpZ2F0ZVJpZ2h0Q2xpY2tcIixcblx0fSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHR3ZWVrRGF5czogdGhpcy53ZWVrRGF5cyxcblx0XHR9O1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLmNoYW5uZWwgPSBvcHRpb25zLmNoYW5uZWw7XG5cdFx0dGhpcy5jdXJyZW50RGF0ZSA9IG9wdGlvbnMuZGVmYXVsdERhdGUuY2xvbmUoKSB8fCBtb21lbnQoKTtcblx0XHR0aGlzLmV2ZW50QnVzID0gb3B0aW9ucy5ldmVudEJ1cztcblxuXHRcdC8vIEluaXRpYWxpemUgdGhlIHdlZWtkYXkgc3RyaW5ncyBmb3IgZGlzcGxheVxuXHRcdHRoaXMud2Vla0RheXMgPSBbXCJNXCIsIFwiVFwiLCBcIldcIiwgXCJUXCIsIFwiRlwiLCBcIlNcIiwgXCJTXCJdO1xuXG5cdFx0Ly8gQWRqdXN0IHRoZSB3ZWVrZGF5cyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBmaXJzdCBkYXkgb2YgdGhlIHdlZWtcblx0XHRjb25zdCBmaXJzdERheU9mV2VlayA9IG9wdGlvbnMuZmlyc3REYXlPZldlZWsgLSAxO1xuXG5cdFx0Zm9yKGxldCBpID0gMDsgaSA8IGZpcnN0RGF5T2ZXZWVrOyBpKyspXG5cdFx0XHR0aGlzLndlZWtEYXlzLnB1c2godGhpcy53ZWVrRGF5cy5zaGlmdCgpKTtcblxuXHRcdC8vIExpc3RlbiB0byBldmVudHNcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwibmF2aWdhdGVcIiwgdGhpcy51cGRhdGVUaXRsZS5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwic2VsZWN0OmRheVwiLCB0aGlzLm9uU2VsZWN0RGF5LmJpbmQodGhpcykpO1xuXG5cdFx0aWYgKHRoaXMuY2hhbm5lbCAhPT0gdW5kZWZpbmVkKVxuXHRcdFx0dGhpcy5saXN0ZW5UbyhCYWNrYm9uZS5SYWRpby5jaGFubmVsKHRoaXMuY2hhbm5lbCksIFwiY2FsZW5kYXI6cmVmcmVzaFwiLCB0aGlzLm9uUmVmcmVzaC5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwibmF2aWdhdGVcIiwgdGhpcy5jdXJyZW50RGF0ZSk7XG5cdH0sXG5cblx0b25CdXR0b25OYXZpZ2F0ZUxlZnRDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jdXJyZW50RGF0ZS5zdWJ0cmFjdCgxLCBcIm1vbnRoc1wiKTtcblxuXHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcIm5hdmlnYXRlXCIsIHRoaXMuY3VycmVudERhdGUpO1xuXHR9LFxuXG5cdG9uQnV0dG9uTmF2aWdhdGVSaWdodENsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmN1cnJlbnREYXRlLmFkZCgxLCBcIm1vbnRoc1wiKTtcblxuXHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcIm5hdmlnYXRlXCIsIHRoaXMuY3VycmVudERhdGUpO1xuXHR9LFxuXG5cdG9uUmVmcmVzaDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwibmF2aWdhdGVcIiwgdGhpcy5jdXJyZW50RGF0ZSk7XG5cdH0sXG5cblx0b25TZWxlY3REYXk6IGZ1bmN0aW9uKGRheSkge1xuXHRcdGNvbnN0IGRheURhdGUgPSB0aGlzLmN1cnJlbnREYXRlLmNsb25lKCk7XG5cblx0XHRkYXlEYXRlLmRhdGUoZGF5KTtcblxuXHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcInNlbGVjdDpkYXRlXCIsIGRheURhdGUpO1xuXHR9LFxuXG5cdHVwZGF0ZVRpdGxlOiBmdW5jdGlvbihkaXNwbGF5RGF0ZSkge1xuXHRcdHRoaXMudWkubW9udGhUaXRsZS50ZXh0KGRpc3BsYXlEYXRlLmZvcm1hdChcIk1NTU1cIikpO1xuXHRcdHRoaXMudWkueWVhclRpdGxlLnRleHQoZGlzcGxheURhdGUuZm9ybWF0KFwiWVlZWVwiKSk7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcodGhpcy5ldmVudEJ1cyk7XG5cdH0sXG59KTtcblxuY29uc3QgV2VlayA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiY2FsLWJhY2std2Vla1wiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi90ZW1wbGF0ZXMvY2FsQmFjay5udW5qXCIpLndlZWssXG5cblx0dWk6IHtcblx0XHRkYXk6IFwiLmNhbC1iYWNrLWRheVwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmRheVwiOiBcIm9uRGF5Q2xpY2tcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5ldmVudEJ1cyA9IG9wdGlvbnMuZXZlbnRCdXM7XG5cdH0sXG5cblx0b25EYXlDbGljazogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGNvbnN0IGRheSA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG5cblx0XHRpZiAoIWRheS5oYXNDbGFzcyhcImV4Y2x1ZGVkXCIpICYmIGRheS5oYXNDbGFzcyhcImNsaWNrYWJsZVwiKSlcblx0XHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcInNlbGVjdDpkYXlcIiwgcGFyc2VJbnQoZGF5LmF0dHIoXCJkYXRhLWRheVwiKSwgMTApKTtcblx0fSxcbn0pO1xuXG5jb25zdCBCb2R5ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5Db2xsZWN0aW9uVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiY2FsLWJhY2stYm9keVwiLFxuXG5cdGNoaWxkVmlldzogV2VlayxcblxuXHRjaGlsZFZpZXdPcHRpb25zOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0ZXZlbnRCdXM6IHRoaXMuZXZlbnRCdXMsXG5cdFx0fTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5ldmVudEJ1cyA9IG9wdGlvbnMuZXZlbnRCdXM7XG5cdH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImNhbC1iYWNrXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9jYWxCYWNrLm51bmpcIikubGF5b3V0LFxuXG5cdHJlZ2lvbnM6IHtcblx0XHRoZWFkZXI6IFwiLmhlYWRlci1yZWdpb25cIixcblx0XHRib2R5OiBcIi5ib2R5LXJlZ2lvblwiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHQvLyBPcHRpb25zOlxuXHRcdC8vICAgY2hhbm5lbDogVGhlIG5hbWUgb2YgdGhlIGNoYW5uZWwgb24gd2hpY2ggdGhlIGNhbGVuZGFyIHdpbGwgdHJpZ2dlciBldmVudHMuXG5cdFx0Ly9cblx0XHQvLyAgIGV4dGVybmFsUmVxdWVzdDogVGhlIG5hbWUgb2YgdGhlIHJlcXVlc3QgdGhhdCBjYWxCYWNrIHdpbGwgdHJpZ2dlciBvbiBcImNoYW5uZWxcIiB3aXRoIGFyZ3VtZW50cyAnc3RhcnREYXRlJyBhbmRcblx0XHQvLyAgICdlbmREYXRlJyAoZWFjaCBhIE1vbWVudCBpbnN0YW5jZSkgd2hlbmV2ZXIgYSBtb250aCBpcyBkaXNwbGF5ZWQgYnkgdGhlIGNhbGVuZGFyIChvbiByZW5kZXIgYW5kIG9uIG5hdmlnYXRpb24pLlxuXHRcdC8vICAgVGhlIHJlcXVlc3QgaGFuZGxlciBtdXN0IHJldHVybiBhbiBvYmplY3Qgb2YgdGhlIGZvcm06IHsgY2xpY2thYmxlRGF0ZXM6IFtdLCBkaXNhYmxlZERhdGVzOiBbXSxcblx0XHQvLyAgIGhpZ2hsaWdodGVkRGF0ZXM6IFtdLCBtYXJrZWREYXRlczogW10gfS4gVGhlIG1lbnRpb25lZCBhdHRyaWJ1dGVzIGNvcnJlc3BvbmQgdG8gdGhlIGFycmF5cyBleHBlY3RlZCBpbiB0aGVcblx0XHQvLyAgIHNpbWlsYXJseSBuYW1lZCBvcHRpb25zIGFuZCBtdXN0IGNvbnRhaW4gVW5peCB0aW1lc3RhbXBzLCBhcyBhcHBsaWNhYmxlLCBpbiB0aGUgcmFuZ2UgWydzdGFydERhdGUnLCdlbmREYXRlJ10uXG5cdFx0dGhpcy5jaGFubmVsID0gb3B0aW9ucy5jaGFubmVsIHx8IFwiX1wiO1xuXHRcdHRoaXMuY2xpY2thYmxlRGF0ZXMgPSBvcHRpb25zLmNsaWNrYWJsZURhdGVzO1xuXHRcdHRoaXMuZGVmYXVsdERhdGUgPSBvcHRpb25zLmRlZmF1bHREYXRlO1xuXHRcdHRoaXMuZGlzYWJsZWREYXRlcyA9IG9wdGlvbnMuZGlzYWJsZWREYXRlcztcblx0XHR0aGlzLmV4dGVybmFsUmVxdWVzdCA9IG9wdGlvbnMuZXh0ZXJuYWxSZXF1ZXN0O1xuXHRcdHRoaXMuZmlyc3REYXlPZldlZWsgPSBXRUVLX0RBWVNbb3B0aW9ucy5maXJzdERheU9mV2Vlay50b0xvd2VyQ2FzZSgpXTtcblx0XHR0aGlzLmhpZ2hsaWdodGVkRGF0ZXMgPSBvcHRpb25zLmhpZ2hsaWdodGVkRGF0ZXM7XG5cdFx0dGhpcy5tYXJrZWREYXRlcyA9IG9wdGlvbnMubWFya2VkRGF0ZXM7XG5cdFx0dGhpcy5tYXhpbXVtRGF0ZSA9IG9wdGlvbnMubWF4aW11bURhdGU7XG5cdFx0dGhpcy5taW5pbXVtRGF0ZSA9IG9wdGlvbnMubWluaW11bURhdGU7XG5cblx0XHR0aGlzLmV2ZW50QnVzID0gbmV3IEJhY2tib25lLk1hcmlvbmV0dGUuQXBwbGljYXRpb24oKTtcblxuXHRcdHRoaXMud2Vla0NvbGxlY3Rpb24gPSBuZXcgQmFja2JvbmUuQ29sbGVjdGlvbigpO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhCYWNrYm9uZS5SYWRpby5jaGFubmVsKHRoaXMuY2hhbm5lbCksIFwiY2FsZW5kYXI6bmF2aWdhdGVcIiwgdGhpcy5vbk5hdmlnYXRlLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJuYXZpZ2F0ZVwiLCB0aGlzLnVwZGF0ZVdlZWtDb2xsZWN0aW9uLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJzZWxlY3Q6ZGF0ZVwiLCB0aGlzLm9uU2VsZWN0RGF0ZS5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRvblJlbmRlcjogYXN5bmMgZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuZGVmYXVsdERhdGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dGhpcy5kZWZhdWx0RGF0ZSA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0XHRCYWNrYm9uZS5SYWRpby5jaGFubmVsKHRoaXMuY2hhbm5lbCkucmVxdWVzdChcImNhbGVuZGFyOmRhdGU6ZGVmYXVsdFwiLCByZXNvbHZlLCByZWplY3QpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLmhlYWRlciA9IG5ldyBIZWFkZXIoe1xuXHRcdFx0Y2hhbm5lbDogdGhpcy5jaGFubmVsLFxuXHRcdFx0ZGVmYXVsdERhdGU6IHRoaXMuZGVmYXVsdERhdGUsXG5cdFx0XHRldmVudEJ1czogdGhpcy5ldmVudEJ1cyxcblx0XHRcdGZpcnN0RGF5T2ZXZWVrOiB0aGlzLmZpcnN0RGF5T2ZXZWVrLFxuXHRcdH0pO1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImhlYWRlclwiLCB0aGlzLmhlYWRlcik7XG5cdH0sXG5cblx0b25OYXZpZ2F0ZTogZnVuY3Rpb24oZGlzcGxheURhdGUpIHtcblx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJuYXZpZ2F0ZVwiLCBkaXNwbGF5RGF0ZSk7XG5cdH0sXG5cblx0b25TZWxlY3REYXRlOiBmdW5jdGlvbihkYXRlKSB7XG5cdFx0dGhpcy50cmlnZ2VyKFwic2VsZWN0XCIsIGRhdGUpO1xuXHRcdEJhY2tib25lLlJhZGlvLmNoYW5uZWwodGhpcy5jaGFubmVsKS50cmlnZ2VyKFwiY2FsZW5kYXI6c2VsZWN0XCIsIGRhdGUpO1xuXHR9LFxuXG5cdHNob3dDYWxlbmRhcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiYm9keVwiLCBuZXcgQm9keSh7XG5cdFx0XHRjb2xsZWN0aW9uOiB0aGlzLndlZWtDb2xsZWN0aW9uLFxuXHRcdFx0ZXZlbnRCdXM6IHRoaXMuZXZlbnRCdXMsXG5cdFx0fSkpO1xuXHR9LFxuXG5cdHNob3dFcnJvcjogZnVuY3Rpb24oZXJyb3IpIHtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJib2R5XCIsIG5ldyBFcnJvclZpZXcoeyBmZXRjaEVycm9yOiBlcnJvciB9KSk7XG5cdH0sXG5cblx0c2hvd1N0YXR1czogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiYm9keVwiLCBuZXcgU3RhdHVzVmlldyh7XG5cdFx0XHRtZXNzYWdlOiBcIlwiLFxuXHRcdFx0dHlwZTogXCJsb2FkaW5nXCIsXG5cdFx0fSkpO1xuXHR9LFxuXG5cdHVwZGF0ZVdlZWtDb2xsZWN0aW9uOiBhc3luYyBmdW5jdGlvbihkaXNwbGF5RGF0ZSkge1xuXHRcdC8vIERvIG5vdCBtdXRhdGUgdGhlIG1vbWVudCByZWZlcmVuY2VkIGJ5IHRoZSBwYXJhbWV0ZXJcblx0XHRjb25zdCBzdGF0ZSA9IGRpc3BsYXlEYXRlLmNsb25lKCk7XG5cblx0XHQvLyBFbnN1cmUgdGhhdCB0aGUgc3RhdGUgYmVnaW5zIG9uIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoXG5cdFx0c3RhdGUuc3RhcnRPZihcIm1vbnRoXCIpO1xuXG5cdFx0Ly8gRGV0ZXJtaW5lIHRoZSBtaW5pbXVtIG51bWJlciBvZiBkYXlzIHRvIGJlIGRpc3BsYXllZFxuXHRcdGxldCBtaW5pbXVtRGlzcGxheURheXMgPSBzdGF0ZS5kYXlzSW5Nb250aCgpO1xuXG5cdFx0Ly8gUm9sbCBiYWNrIHRvIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWtcblx0XHR3aGlsZShzdGF0ZS5pc29XZWVrZGF5KCkgIT09IHRoaXMuZmlyc3REYXlPZldlZWspIHtcblx0XHRcdHN0YXRlLnN1YnRyYWN0KFwiMVwiLCBcImRheXNcIik7XG5cdFx0XHRtaW5pbXVtRGlzcGxheURheXMrKztcblx0XHR9XG5cblx0XHQvLyBDb25zdHJ1Y3QgdGhlIHdlZWsgY29sbGVjdGlvblxuXHRcdGNvbnN0IGlzQ2xpY2thYmxlID0gcXVlcnlEYXRlID0+IHtcblx0XHRcdGxldCBjbGlja2FibGUgPSBmYWxzZTtcblxuXHRcdFx0Y29uc3Qgc2F0aXNmaWVzTWluaW11bSA9IHRoaXMubWluaW11bURhdGUgPyBtb21lbnQudW5peCh0aGlzLm1pbmltdW1EYXRlKS5pc1NhbWVPckJlZm9yZShxdWVyeURhdGUsIFwiZGF5XCIpIDogdHJ1ZTtcblx0XHRcdGNvbnN0IHNhdGlzZmllc01heGltdW0gPSB0aGlzLm1heGltdW1EYXRlID8gbW9tZW50LnVuaXgodGhpcy5tYXhpbXVtRGF0ZSkuaXNTYW1lT3JBZnRlcihxdWVyeURhdGUsIFwiZGF5XCIpIDogdHJ1ZTtcblxuXHRcdFx0aWYgKHNhdGlzZmllc01pbmltdW0gJiYgc2F0aXNmaWVzTWF4aW11bSkge1xuXHRcdFx0XHRpZiAodGhpcy5jbGlja2FibGVEYXRlcykge1xuXHRcdFx0XHRcdGlmICh0aGlzLmNsaWNrYWJsZURhdGVzLmxlbmd0aCA9PT0gMClcblx0XHRcdFx0XHRcdGNsaWNrYWJsZSA9IHRydWU7XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0Y2xpY2thYmxlID0gQm9vbGVhbihfLmZpbmQodGhpcy5jbGlja2FibGVEYXRlcywgZGF0ZSA9PiBtb21lbnQudW5peChkYXRlKS5pc1NhbWUocXVlcnlEYXRlLCBcImRheVwiKSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2UgaWYgKHRoaXMuZGlzYWJsZWREYXRlcykge1xuXHRcdFx0XHRcdGlmICh0aGlzLmRpc2FibGVkRGF0ZXMubGVuZ3RoID09PSAwKVxuXHRcdFx0XHRcdFx0Y2xpY2thYmxlID0gdHJ1ZTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRjbGlja2FibGUgPSBfLmZpbmQodGhpcy5kaXNhYmxlZERhdGVzLCBkYXRlID0+IG1vbWVudC51bml4KGRhdGUpLmlzU2FtZShxdWVyeURhdGUsIFwiZGF5XCIpKSA9PT0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdGNsaWNrYWJsZSA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGNsaWNrYWJsZTtcblx0XHR9O1xuXG5cdFx0Y29uc3QgaXNIaWdobGlnaHRlZCA9IHF1ZXJ5RGF0ZSA9PiB7XG5cdFx0XHRsZXQgaGlnaGxpZ2h0ZWQgPSBmYWxzZTtcblxuXHRcdFx0aWYgKHRoaXMuaGlnaGxpZ2h0ZWREYXRlcylcblx0XHRcdFx0aGlnaGxpZ2h0ZWQgPSBCb29sZWFuKF8uZmluZCh0aGlzLmhpZ2hsaWdodGVkRGF0ZXMsIGRhdGUgPT4gbW9tZW50LnVuaXgoZGF0ZSkuaXNTYW1lKHF1ZXJ5RGF0ZSwgXCJkYXlcIikpKTtcblxuXHRcdFx0cmV0dXJuIGhpZ2hsaWdodGVkO1xuXHRcdH07XG5cblx0XHRjb25zdCBpc01hcmtlZCA9IHF1ZXJ5RGF0ZSA9PiB7XG5cdFx0XHRsZXQgbWFya2VkID0gZmFsc2U7XG5cblx0XHRcdGlmICh0aGlzLm1hcmtlZERhdGVzKVxuXHRcdFx0XHRtYXJrZWQgPSBCb29sZWFuKF8uZmluZCh0aGlzLm1hcmtlZERhdGVzLCBkYXRlID0+IG1vbWVudC51bml4KGRhdGUpLmlzU2FtZShxdWVyeURhdGUsIFwiZGF5XCIpKSk7XG5cblx0XHRcdHJldHVybiBtYXJrZWQ7XG5cdFx0fTtcblxuXHRcdGNvbnN0IHN0YXJ0RGF0ZSA9IHN0YXRlLmNsb25lKCk7XG5cdFx0Y29uc3QgZW5kRGF0ZSA9IHN0YXRlLmNsb25lKCk7XG5cblx0XHRsZXQgZGF5c0FkZGVkID0gMDtcblxuXHRcdHdoaWxlKGRheXNBZGRlZCA8IG1pbmltdW1EaXNwbGF5RGF5cykge1xuXHRcdFx0Zm9yKGxldCBpID0gMDsgaSA8IDc7IGkrKykge1xuXHRcdFx0XHRlbmREYXRlLmFkZChcIjFcIiwgXCJkYXlzXCIpO1xuXHRcdFx0XHRkYXlzQWRkZWQrKztcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy5leHRlcm5hbFJlcXVlc3QpIHtcblx0XHRcdHRoaXMuc2hvd1N0YXR1cygpO1xuXG5cdFx0XHRsZXQgZGF0YTtcblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ZGF0YSA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0XHRCYWNrYm9uZS5SYWRpby5jaGFubmVsKHRoaXMuY2hhbm5lbCkucmVxdWVzdCh0aGlzLmV4dGVybmFsUmVxdWVzdCwgc3RhcnREYXRlLCBlbmREYXRlLCByZXNvbHZlLCByZWplY3QpO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0dGhpcy5zaG93Q2FsZW5kYXIoKTtcblx0XHRcdH1cblx0XHRcdGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHR0aGlzLnNob3dFcnJvcihlcnJvcik7XG5cdFx0XHRcdHRocm93IGVycm9yO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmNsaWNrYWJsZURhdGVzID0gZGF0YS5jbGlja2FibGVEYXRlcztcblx0XHRcdHRoaXMuZGlzYWJsZWREYXRlcyA9IGRhdGEuZGlzYWJsZWREYXRlcztcblx0XHRcdHRoaXMuaGlnaGxpZ2h0ZWREYXRlcyA9IGRhdGEuaGlnaGxpZ2h0ZWREYXRlcztcblx0XHRcdHRoaXMubWFya2VkRGF0ZXMgPSBkYXRhLm1hcmtlZERhdGVzO1xuXHRcdH1cblxuXHRcdHRoaXMud2Vla0NvbGxlY3Rpb24ucmVzZXQoKTtcblxuXHRcdHdoaWxlKHN0YXRlLmlzQmVmb3JlKGVuZERhdGUsIFwiZGF5XCIpKSB7XG5cdFx0XHRjb25zdCB3ZWVrID0gbmV3IEJhY2tib25lLk1vZGVsKCk7XG5cdFx0XHRjb25zdCBkYXlzID0gW107XG5cblx0XHRcdGZvcihsZXQgaSA9IDA7IGkgPCA3OyBpKyspIHtcblx0XHRcdFx0ZGF5cy5wdXNoKHtcblx0XHRcdFx0XHRjbGlja2FibGU6IGlzQ2xpY2thYmxlKHN0YXRlKSxcblx0XHRcdFx0XHRkYXRlOiBzdGF0ZS5kYXRlKCksXG5cdFx0XHRcdFx0ZXhjbHVkZWQ6ICFzdGF0ZS5pc1NhbWUoZGlzcGxheURhdGUsIFwibW9udGhcIiksXG5cdFx0XHRcdFx0aGlnaGxpZ2h0ZWQ6IGlzSGlnaGxpZ2h0ZWQoc3RhdGUpLFxuXHRcdFx0XHRcdG1hcmtlZDogaXNNYXJrZWQoc3RhdGUpLFxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRzdGF0ZS5hZGQoXCIxXCIsIFwiZGF5c1wiKTtcblx0XHRcdH1cblxuXHRcdFx0d2Vlay5zZXQoXCJkYXlzXCIsIGRheXMpO1xuXHRcdFx0dGhpcy53ZWVrQ29sbGVjdGlvbi5hZGQod2Vlayk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuZXh0ZXJuYWxSZXF1ZXN0ID09PSB1bmRlZmluZWQpXG5cdFx0XHR0aGlzLnNob3dDYWxlbmRhcigpO1xuXG5cdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbCh0aGlzLmNoYW5uZWwpLnRyaWdnZXIoXCJjYWxlbmRhcjpjaGFuZ2VcIiwgZGlzcGxheURhdGUuY2xvbmUoKS5zdGFydE9mKFwibW9udGhcIikpO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKHRoaXMuZXZlbnRCdXMpO1xuXHRcdHRoaXMuc3RvcExpc3RlbmluZyhCYWNrYm9uZS5SYWRpby5jaGFubmVsKHRoaXMuY2hhbm5lbCkpO1xuXHR9LFxufSk7Il19",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar Backbone = require(\"backbone\");\n\nvar App = require(\"../index\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"card-modal\",\n\n\ttemplate: require(\"./templates/cardModal.nunj\").layout,\n\n\tregions: {\n\t\tcardOne: \".card-region-one\",\n\t\tcardTwo: \".card-region-two\"\n\t},\n\n\tui: {\n\t\tnavigatorContainer: \".card-navigator-container\",\n\t\tnavigatorPrevious: \".card-navigator-previous\",\n\t\tnavigatorNext: \".card-navigator-next\",\n\t\tnavigatorCancel: \".card-navigator-cancel\",\n\n\t\tcardRegionContainer: \".card-region-container\",\n\t\tcardRegionOne: \".card-region-one\",\n\t\tcardRegionTwo: \".card-region-two\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.navigatorPrevious\": \"onNavigatorPreviousClick\",\n\t\t\"click @ui.navigatorNext\": \"onNavigatorNextClick\",\n\t\t\"click @ui.navigatorCancel\": \"onNavigatorCancelClick\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.host = $(options && options.host || App.modalContext || \"#modals\");\n\n\t\tthis._state = {\n\t\t\tcloseNext: false\n\t\t};\n\n\t\t// Initialize region trackers\n\t\tthis.currentCard = null;\n\t\tthis.otherCard = null;\n\t},\n\n\tshow: function show() {\n\t\t$(\".modal-container\", this.host).append(this.render().$el);\n\t},\n\n\tonRender: function onRender() {\n\t\t// Show the modal background\n\t\t$(\".modal-element\", this.host).removeClass(\"hide\");\n\t\t$(\"body\").addClass(\"hide-overflow\");\n\n\t\t// The modal itself should allow clicks to propagate so that menus in the\n\t\t// modal will be hidden correctly. However, everything underneath the modal\n\t\t// should be unaffected by clicks\n\t\t$(\"#modals\").on(\"click\", function (event) {\n\t\t\treturn event.stopPropagation();\n\t\t});\n\n\t\t// Show the first card\n\t\tthis.trigger(\"card:begin\");\n\t},\n\n\tregisterCardEvents: function registerCardEvents(cardView) {\n\t\tthis.listenTo(cardView, \"card:first\", this.onCardFirst.bind(this));\n\t\tthis.listenTo(cardView, \"card:last\", this.onCardLast.bind(this));\n\t\tthis.listenTo(cardView, \"card:busy\", this.onCardBusy.bind(this));\n\t\tthis.listenTo(cardView, \"card:ready\", this.onCardReady.bind(this));\n\t},\n\n\tregisterCardTransitionEnd: function registerCardTransitionEnd() {\n\t\tvar _this = this;\n\n\t\t// Complete the update once the new card is in position\n\t\tthis.otherCard.element.one(\"transitionend\", function () {\n\t\t\t// Show the navigation controls\n\t\t\t_this.ui.navigatorContainer.removeClass(\"hide\");\n\n\t\t\t// Remove the old card\n\t\t\t_this.stopListening(_this.currentCard.region.currentView);\n\t\t\t_this.trigger(\"card:before-destroy\", _this.currentCard.region.currentView);\n\t\t\t_this.currentCard.region.reset();\n\n\t\t\t// Update the card region trackers\n\t\t\tvar temp = _this.currentCard;\n\t\t\t_this.currentCard = _this.otherCard;\n\t\t\t_this.otherCard = temp;\n\t\t});\n\t},\n\n\tshowNextCard: function showNextCard(cardView) {\n\t\tthis.registerCardEvents(cardView);\n\n\t\tif (this.currentCard) {\n\t\t\t// Hide the navigation controls\n\t\t\tthis.ui.navigatorContainer.addClass(\"hide\");\n\n\t\t\t// Move the other card region off-screen, to the right and prepare the new card\n\t\t\tthis.otherCard.element.addClass(\"card-region-off-screen-right\");\n\t\t\tthis.otherCard.region.show(cardView);\n\n\t\t\tthis.registerCardTransitionEnd();\n\n\t\t\t// Move both cards to the left\n\t\t\tthis.currentCard.element.addClass(\"card-region-off-screen-left\");\n\t\t\tthis.otherCard.element.removeClass(\"card-region-off-screen-right\");\n\t\t} else {\n\t\t\tthis.currentCard = {\n\t\t\t\telement: this.ui.cardRegionOne,\n\t\t\t\tregion: this.getRegion(\"cardOne\")\n\t\t\t};\n\n\t\t\tthis.otherCard = {\n\t\t\t\telement: this.ui.cardRegionTwo,\n\t\t\t\tregion: this.getRegion(\"cardTwo\")\n\t\t\t};\n\n\t\t\tthis.currentCard.region.show(cardView);\n\t\t}\n\t},\n\n\tshowPreviousCard: function showPreviousCard(cardView) {\n\t\tthis.registerCardEvents(cardView);\n\n\t\t// Hide the navigation controls\n\t\tthis.ui.navigatorContainer.addClass(\"hide\");\n\n\t\t// Move the other card region off-screen, to the left and prepare the new card\n\t\tthis.otherCard.element.addClass(\"card-region-off-screen-left\");\n\t\tthis.otherCard.region.show(cardView);\n\n\t\tthis.registerCardTransitionEnd();\n\n\t\t// Move both cards to the right\n\t\tthis.currentCard.element.addClass(\"card-region-off-screen-right\");\n\t\tthis.otherCard.element.removeClass(\"card-region-off-screen-left\");\n\t},\n\n\thideNavigatorPrevious: function hideNavigatorPrevious() {\n\t\tthis.hideNavigator(this.ui.navigatorPrevious);\n\t},\n\n\thideNavigatorNext: function hideNavigatorNext() {\n\t\tthis.hideNavigator(this.ui.navigatorNext);\n\t},\n\n\thideNavigatorCancel: function hideNavigatorCancel() {\n\t\tthis.hideNavigator(this.ui.navigatorCancel);\n\t},\n\n\thideNavigator: function hideNavigator(navigatorElement) {\n\t\tnavigatorElement.addClass(\"hide\");\n\t},\n\n\tshowNavigatorNext: function showNavigatorNext() {\n\t\tthis.showNavigator(this.ui.navigatorNext);\n\t},\n\n\tshowNavigatorPrevious: function showNavigatorPrevious() {\n\t\tthis.showNavigator(this.ui.navigatorPrevious);\n\t},\n\n\tshowNavigatorCancel: function showNavigatorCancel() {\n\t\tthis.showNavigator(this.ui.navigatorCancel);\n\t},\n\n\tshowNavigator: function showNavigator(navigatorElement) {\n\t\tif (navigatorElement.hasClass(\"hide\")) navigatorElement.removeClass(\"hide\");\n\t},\n\n\tdisableNavigatorPrevious: function disableNavigatorPrevious() {\n\t\tthis.disableNavigator(this.ui.navigatorPrevious);\n\t},\n\n\tenableNavigatorPrevious: function enableNavigatorPrevious() {\n\t\tthis.enableNavigator(this.ui.navigatorPrevious);\n\t},\n\n\tdisableNavigatorNext: function disableNavigatorNext() {\n\t\tthis.disableNavigator(this.ui.navigatorNext);\n\t},\n\n\tenableNavigatorNext: function enableNavigatorNext() {\n\t\tthis.enableNavigator(this.ui.navigatorNext);\n\t},\n\n\tdisableNavigator: function disableNavigator(navigatorElement) {\n\t\tnavigatorElement.addClass(\"disabled\");\n\t\tnavigatorElement.prop(\"disabled\", true);\n\t},\n\n\tenableNavigator: function enableNavigator(navigatorElement) {\n\t\tif (navigatorElement.hasClass(\"disabled\")) {\n\t\t\tnavigatorElement.removeClass(\"disabled\");\n\t\t\tnavigatorElement.prop(\"disabled\", false);\n\t\t}\n\n\t\tthis.showNavigator(navigatorElement);\n\t},\n\n\tupdateNavigatorNext: function updateNavigatorNext() {\n\t\tif (this._state.closeNext) {\n\t\t\tthis.ui.navigatorNext.removeClass(\"fa-chevron-right\");\n\t\t\tthis.ui.navigatorNext.addClass(\"fa-check\");\n\t\t\tthis.ui.navigatorNext.attr(\"title\", \"Success (Close)\");\n\t\t} else if (this.ui.navigatorNext.hasClass(\"fa-check\")) {\n\t\t\tthis.ui.navigatorNext.removeClass(\"fa-check\");\n\t\t\tthis.ui.navigatorNext.addClass(\"fa-chevron-right\");\n\t\t\tthis.ui.navigatorNext.attr(\"title\", \"Next card\");\n\t\t}\n\t},\n\n\tonCardFirst: function onCardFirst() {\n\t\tthis.hideNavigatorPrevious();\n\t\tthis.disableNavigatorNext();\n\t},\n\n\tonCardLast: function onCardLast(options) {\n\t\tif (options && options.error) {\n\t\t\tthis.enableNavigatorPrevious();\n\t\t\tthis.hideNavigatorNext();\n\t\t} else {\n\t\t\tthis.enableNavigatorPrevious();\n\t\t\tthis.enableNavigatorNext();\n\n\t\t\tthis._state.closeNext = true;\n\n\t\t\tthis.updateNavigatorNext();\n\t\t}\n\t},\n\n\tonCardBusy: function onCardBusy() {\n\t\tthis.hideNavigatorNext();\n\t\tthis.hideNavigatorPrevious();\n\t\tthis.hideNavigatorCancel();\n\t},\n\n\tonCardReady: function onCardReady() {\n\t\tthis.showNavigatorNext();\n\t\tthis.showNavigatorPrevious();\n\t\tthis.showNavigatorCancel();\n\t},\n\n\tonNavigatorPreviousClick: function onNavigatorPreviousClick() {\n\t\tthis.trigger(\"card:previous\");\n\n\t\tif (this._state.closeNext) this._state.closeNext = false;\n\n\t\tthis.updateNavigatorNext();\n\t},\n\n\tonNavigatorNextClick: function onNavigatorNextClick() {\n\t\tif (this._state.closeNext) this.trigger(\"card:accept\");else this.trigger(\"card:next\");\n\t},\n\n\tonNavigatorCancelClick: function onNavigatorCancelClick() {\n\t\tthis.trigger(\"card:cancel\");\n\t},\n\n\tonDestroy: function onDestroy() {\n\t\t// Stop listening to the current (and last) card\n\t\tthis.stopListening(this.currentCard.region.currentView);\n\n\t\t// Unbind the click handler\n\t\t$(\"#modals\").off(\"click\");\n\n\t\t// Hide the modal background\n\t\t$(\".modal-element\", this.host).addClass(\"hide\");\n\t\t$(\"body\").removeClass(\"hide-overflow\");\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNhcmRNb2RhbC5qcyJdLCJuYW1lcyI6WyIkIiwicmVxdWlyZSIsIkJhY2tib25lIiwiQXBwIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiZXh0ZW5kIiwiY2xhc3NOYW1lIiwidGVtcGxhdGUiLCJsYXlvdXQiLCJyZWdpb25zIiwiY2FyZE9uZSIsImNhcmRUd28iLCJ1aSIsIm5hdmlnYXRvckNvbnRhaW5lciIsIm5hdmlnYXRvclByZXZpb3VzIiwibmF2aWdhdG9yTmV4dCIsIm5hdmlnYXRvckNhbmNlbCIsImNhcmRSZWdpb25Db250YWluZXIiLCJjYXJkUmVnaW9uT25lIiwiY2FyZFJlZ2lvblR3byIsImV2ZW50cyIsImluaXRpYWxpemUiLCJvcHRpb25zIiwiaG9zdCIsIm1vZGFsQ29udGV4dCIsIl9zdGF0ZSIsImNsb3NlTmV4dCIsImN1cnJlbnRDYXJkIiwib3RoZXJDYXJkIiwic2hvdyIsImFwcGVuZCIsInJlbmRlciIsIiRlbCIsIm9uUmVuZGVyIiwicmVtb3ZlQ2xhc3MiLCJhZGRDbGFzcyIsIm9uIiwiZXZlbnQiLCJzdG9wUHJvcGFnYXRpb24iLCJ0cmlnZ2VyIiwicmVnaXN0ZXJDYXJkRXZlbnRzIiwiY2FyZFZpZXciLCJsaXN0ZW5UbyIsIm9uQ2FyZEZpcnN0IiwiYmluZCIsIm9uQ2FyZExhc3QiLCJvbkNhcmRCdXN5Iiwib25DYXJkUmVhZHkiLCJyZWdpc3RlckNhcmRUcmFuc2l0aW9uRW5kIiwiZWxlbWVudCIsIm9uZSIsInN0b3BMaXN0ZW5pbmciLCJyZWdpb24iLCJjdXJyZW50VmlldyIsInJlc2V0IiwidGVtcCIsInNob3dOZXh0Q2FyZCIsImdldFJlZ2lvbiIsInNob3dQcmV2aW91c0NhcmQiLCJoaWRlTmF2aWdhdG9yUHJldmlvdXMiLCJoaWRlTmF2aWdhdG9yIiwiaGlkZU5hdmlnYXRvck5leHQiLCJoaWRlTmF2aWdhdG9yQ2FuY2VsIiwibmF2aWdhdG9yRWxlbWVudCIsInNob3dOYXZpZ2F0b3JOZXh0Iiwic2hvd05hdmlnYXRvciIsInNob3dOYXZpZ2F0b3JQcmV2aW91cyIsInNob3dOYXZpZ2F0b3JDYW5jZWwiLCJoYXNDbGFzcyIsImRpc2FibGVOYXZpZ2F0b3JQcmV2aW91cyIsImRpc2FibGVOYXZpZ2F0b3IiLCJlbmFibGVOYXZpZ2F0b3JQcmV2aW91cyIsImVuYWJsZU5hdmlnYXRvciIsImRpc2FibGVOYXZpZ2F0b3JOZXh0IiwiZW5hYmxlTmF2aWdhdG9yTmV4dCIsInByb3AiLCJ1cGRhdGVOYXZpZ2F0b3JOZXh0IiwiYXR0ciIsImVycm9yIiwib25OYXZpZ2F0b3JQcmV2aW91c0NsaWNrIiwib25OYXZpZ2F0b3JOZXh0Q2xpY2siLCJvbk5hdmlnYXRvckNhbmNlbENsaWNrIiwib25EZXN0cm95Iiwib2ZmIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLFdBQVdELFFBQVEsVUFBUixDQUFqQjs7QUFFQSxJQUFNRSxNQUFNRixRQUFRLFVBQVIsQ0FBWjs7QUFFQUcsT0FBT0MsT0FBUCxHQUFpQkgsU0FBU0ksVUFBVCxDQUFvQkMsSUFBcEIsQ0FBeUJDLE1BQXpCLENBQWdDO0FBQ2hEQyxZQUFXLFlBRHFDOztBQUdoREMsV0FBVVQsUUFBUSw0QkFBUixFQUFzQ1UsTUFIQTs7QUFLaERDLFVBQVM7QUFDUkMsV0FBUyxrQkFERDtBQUVSQyxXQUFTO0FBRkQsRUFMdUM7O0FBVWhEQyxLQUFJO0FBQ0hDLHNCQUFvQiwyQkFEakI7QUFFSEMscUJBQW1CLDBCQUZoQjtBQUdIQyxpQkFBZSxzQkFIWjtBQUlIQyxtQkFBaUIsd0JBSmQ7O0FBTUhDLHVCQUFxQix3QkFObEI7QUFPSEMsaUJBQWUsa0JBUFo7QUFRSEMsaUJBQWU7QUFSWixFQVY0Qzs7QUFxQmhEQyxTQUFRO0FBQ1AsaUNBQStCLDBCQUR4QjtBQUVQLDZCQUEyQixzQkFGcEI7QUFHUCwrQkFBNkI7QUFIdEIsRUFyQndDOztBQTJCaERDLGFBQVksb0JBQVNDLE9BQVQsRUFBa0I7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QUFLMEIsSUFBekIsRUFBK0JZLFFBQS9CLENBQXdDLE1BQXhDO0FBQ0F0QyxJQUFFLE1BQUYsRUFBVXFDLFdBQVYsQ0FBc0IsZUFBdEI7QUFDQTtBQTdRK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoiY2FyZE1vZGFsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuXG5jb25zdCBBcHAgPSByZXF1aXJlKFwiLi4vaW5kZXhcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJjYXJkLW1vZGFsXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9jYXJkTW9kYWwubnVualwiKS5sYXlvdXQsXG5cblx0cmVnaW9uczoge1xuXHRcdGNhcmRPbmU6IFwiLmNhcmQtcmVnaW9uLW9uZVwiLFxuXHRcdGNhcmRUd286IFwiLmNhcmQtcmVnaW9uLXR3b1wiLFxuXHR9LFxuXG5cdHVpOiB7XG5cdFx0bmF2aWdhdG9yQ29udGFpbmVyOiBcIi5jYXJkLW5hdmlnYXRvci1jb250YWluZXJcIixcblx0XHRuYXZpZ2F0b3JQcmV2aW91czogXCIuY2FyZC1uYXZpZ2F0b3ItcHJldmlvdXNcIixcblx0XHRuYXZpZ2F0b3JOZXh0OiBcIi5jYXJkLW5hdmlnYXRvci1uZXh0XCIsXG5cdFx0bmF2aWdhdG9yQ2FuY2VsOiBcIi5jYXJkLW5hdmlnYXRvci1jYW5jZWxcIixcblxuXHRcdGNhcmRSZWdpb25Db250YWluZXI6IFwiLmNhcmQtcmVnaW9uLWNvbnRhaW5lclwiLFxuXHRcdGNhcmRSZWdpb25PbmU6IFwiLmNhcmQtcmVnaW9uLW9uZVwiLFxuXHRcdGNhcmRSZWdpb25Ud286IFwiLmNhcmQtcmVnaW9uLXR3b1wiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLm5hdmlnYXRvclByZXZpb3VzXCI6IFwib25OYXZpZ2F0b3JQcmV2aW91c0NsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkubmF2aWdhdG9yTmV4dFwiOiBcIm9uTmF2aWdhdG9yTmV4dENsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkubmF2aWdhdG9yQ2FuY2VsXCI6IFwib25OYXZpZ2F0b3JDYW5jZWxDbGlja1wiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLmhvc3QgPSAkKG9wdGlvbnMgJiYgb3B0aW9ucy5ob3N0IHx8IEFwcC5tb2RhbENvbnRleHQgfHwgXCIjbW9kYWxzXCIpO1xuXG5cdFx0dGhpcy5fc3RhdGUgPSB7XG5cdFx0XHRjbG9zZU5leHQ6IGZhbHNlLFxuXHRcdH07XG5cblx0XHQvLyBJbml0aWFsaXplIHJlZ2lvbiB0cmFja2Vyc1xuXHRcdHRoaXMuY3VycmVudENhcmQgPSBudWxsO1xuXHRcdHRoaXMub3RoZXJDYXJkID0gbnVsbDtcblx0fSxcblxuXHRzaG93OiBmdW5jdGlvbigpIHtcblx0XHQkKFwiLm1vZGFsLWNvbnRhaW5lclwiLCB0aGlzLmhvc3QpLmFwcGVuZCh0aGlzLnJlbmRlcigpLiRlbCk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIFNob3cgdGhlIG1vZGFsIGJhY2tncm91bmRcblx0XHQkKFwiLm1vZGFsLWVsZW1lbnRcIiwgdGhpcy5ob3N0KS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0JChcImJvZHlcIikuYWRkQ2xhc3MoXCJoaWRlLW92ZXJmbG93XCIpO1xuXG5cdFx0Ly8gVGhlIG1vZGFsIGl0c2VsZiBzaG91bGQgYWxsb3cgY2xpY2tzIHRvIHByb3BhZ2F0ZSBzbyB0aGF0IG1lbnVzIGluIHRoZVxuXHRcdC8vIG1vZGFsIHdpbGwgYmUgaGlkZGVuIGNvcnJlY3RseS4gSG93ZXZlciwgZXZlcnl0aGluZyB1bmRlcm5lYXRoIHRoZSBtb2RhbFxuXHRcdC8vIHNob3VsZCBiZSB1bmFmZmVjdGVkIGJ5IGNsaWNrc1xuXHRcdCQoXCIjbW9kYWxzXCIpLm9uKFwiY2xpY2tcIiwgZXZlbnQgPT4gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCkpO1xuXG5cdFx0Ly8gU2hvdyB0aGUgZmlyc3QgY2FyZFxuXHRcdHRoaXMudHJpZ2dlcihcImNhcmQ6YmVnaW5cIik7XG5cdH0sXG5cblx0cmVnaXN0ZXJDYXJkRXZlbnRzOiBmdW5jdGlvbihjYXJkVmlldykge1xuXHRcdHRoaXMubGlzdGVuVG8oY2FyZFZpZXcsIFwiY2FyZDpmaXJzdFwiLCB0aGlzLm9uQ2FyZEZpcnN0LmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8oY2FyZFZpZXcsIFwiY2FyZDpsYXN0XCIsIHRoaXMub25DYXJkTGFzdC5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKGNhcmRWaWV3LCBcImNhcmQ6YnVzeVwiLCB0aGlzLm9uQ2FyZEJ1c3kuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5UbyhjYXJkVmlldywgXCJjYXJkOnJlYWR5XCIsIHRoaXMub25DYXJkUmVhZHkuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0cmVnaXN0ZXJDYXJkVHJhbnNpdGlvbkVuZDogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gQ29tcGxldGUgdGhlIHVwZGF0ZSBvbmNlIHRoZSBuZXcgY2FyZCBpcyBpbiBwb3NpdGlvblxuXHRcdHRoaXMub3RoZXJDYXJkLmVsZW1lbnQub25lKFwidHJhbnNpdGlvbmVuZFwiLCAoKSA9PiB7XG5cdFx0XHQvLyBTaG93IHRoZSBuYXZpZ2F0aW9uIGNvbnRyb2xzXG5cdFx0XHR0aGlzLnVpLm5hdmlnYXRvckNvbnRhaW5lci5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cblx0XHRcdC8vIFJlbW92ZSB0aGUgb2xkIGNhcmRcblx0XHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLmN1cnJlbnRDYXJkLnJlZ2lvbi5jdXJyZW50Vmlldyk7XG5cdFx0XHR0aGlzLnRyaWdnZXIoXCJjYXJkOmJlZm9yZS1kZXN0cm95XCIsIHRoaXMuY3VycmVudENhcmQucmVnaW9uLmN1cnJlbnRWaWV3KTtcblx0XHRcdHRoaXMuY3VycmVudENhcmQucmVnaW9uLnJlc2V0KCk7XG5cblx0XHRcdC8vIFVwZGF0ZSB0aGUgY2FyZCByZWdpb24gdHJhY2tlcnNcblx0XHRcdGNvbnN0IHRlbXAgPSB0aGlzLmN1cnJlbnRDYXJkO1xuXHRcdFx0dGhpcy5jdXJyZW50Q2FyZCA9IHRoaXMub3RoZXJDYXJkO1xuXHRcdFx0dGhpcy5vdGhlckNhcmQgPSB0ZW1wO1xuXHRcdH0pO1xuXHR9LFxuXG5cdHNob3dOZXh0Q2FyZDogZnVuY3Rpb24oY2FyZFZpZXcpIHtcblx0XHR0aGlzLnJlZ2lzdGVyQ2FyZEV2ZW50cyhjYXJkVmlldyk7XG5cblx0XHRpZiAodGhpcy5jdXJyZW50Q2FyZCkge1xuXHRcdFx0Ly8gSGlkZSB0aGUgbmF2aWdhdGlvbiBjb250cm9sc1xuXHRcdFx0dGhpcy51aS5uYXZpZ2F0b3JDb250YWluZXIuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0XHQvLyBNb3ZlIHRoZSBvdGhlciBjYXJkIHJlZ2lvbiBvZmYtc2NyZWVuLCB0byB0aGUgcmlnaHQgYW5kIHByZXBhcmUgdGhlIG5ldyBjYXJkXG5cdFx0XHR0aGlzLm90aGVyQ2FyZC5lbGVtZW50LmFkZENsYXNzKFwiY2FyZC1yZWdpb24tb2ZmLXNjcmVlbi1yaWdodFwiKTtcblx0XHRcdHRoaXMub3RoZXJDYXJkLnJlZ2lvbi5zaG93KGNhcmRWaWV3KTtcblxuXHRcdFx0dGhpcy5yZWdpc3RlckNhcmRUcmFuc2l0aW9uRW5kKCk7XG5cblx0XHRcdC8vIE1vdmUgYm90aCBjYXJkcyB0byB0aGUgbGVmdFxuXHRcdFx0dGhpcy5jdXJyZW50Q2FyZC5lbGVtZW50LmFkZENsYXNzKFwiY2FyZC1yZWdpb24tb2ZmLXNjcmVlbi1sZWZ0XCIpO1xuXHRcdFx0dGhpcy5vdGhlckNhcmQuZWxlbWVudC5yZW1vdmVDbGFzcyhcImNhcmQtcmVnaW9uLW9mZi1zY3JlZW4tcmlnaHRcIik7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5jdXJyZW50Q2FyZCA9IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5jYXJkUmVnaW9uT25lLFxuXHRcdFx0XHRyZWdpb246IHRoaXMuZ2V0UmVnaW9uKFwiY2FyZE9uZVwiKSxcblx0XHRcdH07XG5cblx0XHRcdHRoaXMub3RoZXJDYXJkID0ge1xuXHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLmNhcmRSZWdpb25Ud28sXG5cdFx0XHRcdHJlZ2lvbjogdGhpcy5nZXRSZWdpb24oXCJjYXJkVHdvXCIpLFxuXHRcdFx0fTtcblxuXHRcdFx0dGhpcy5jdXJyZW50Q2FyZC5yZWdpb24uc2hvdyhjYXJkVmlldyk7XG5cdFx0fVxuXHR9LFxuXG5cdHNob3dQcmV2aW91c0NhcmQ6IGZ1bmN0aW9uKGNhcmRWaWV3KSB7XG5cdFx0dGhpcy5yZWdpc3RlckNhcmRFdmVudHMoY2FyZFZpZXcpO1xuXG5cdFx0Ly8gSGlkZSB0aGUgbmF2aWdhdGlvbiBjb250cm9sc1xuXHRcdHRoaXMudWkubmF2aWdhdG9yQ29udGFpbmVyLmFkZENsYXNzKFwiaGlkZVwiKTtcblxuXHRcdC8vIE1vdmUgdGhlIG90aGVyIGNhcmQgcmVnaW9uIG9mZi1zY3JlZW4sIHRvIHRoZSBsZWZ0IGFuZCBwcmVwYXJlIHRoZSBuZXcgY2FyZFxuXHRcdHRoaXMub3RoZXJDYXJkLmVsZW1lbnQuYWRkQ2xhc3MoXCJjYXJkLXJlZ2lvbi1vZmYtc2NyZWVuLWxlZnRcIik7XG5cdFx0dGhpcy5vdGhlckNhcmQucmVnaW9uLnNob3coY2FyZFZpZXcpO1xuXG5cdFx0dGhpcy5yZWdpc3RlckNhcmRUcmFuc2l0aW9uRW5kKCk7XG5cblx0XHQvLyBNb3ZlIGJvdGggY2FyZHMgdG8gdGhlIHJpZ2h0XG5cdFx0dGhpcy5jdXJyZW50Q2FyZC5lbGVtZW50LmFkZENsYXNzKFwiY2FyZC1yZWdpb24tb2ZmLXNjcmVlbi1yaWdodFwiKTtcblx0XHR0aGlzLm90aGVyQ2FyZC5lbGVtZW50LnJlbW92ZUNsYXNzKFwiY2FyZC1yZWdpb24tb2ZmLXNjcmVlbi1sZWZ0XCIpO1xuXHR9LFxuXG5cdGhpZGVOYXZpZ2F0b3JQcmV2aW91czogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5oaWRlTmF2aWdhdG9yKHRoaXMudWkubmF2aWdhdG9yUHJldmlvdXMpO1xuXHR9LFxuXG5cdGhpZGVOYXZpZ2F0b3JOZXh0OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmhpZGVOYXZpZ2F0b3IodGhpcy51aS5uYXZpZ2F0b3JOZXh0KTtcblx0fSxcblxuXHRoaWRlTmF2aWdhdG9yQ2FuY2VsOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmhpZGVOYXZpZ2F0b3IodGhpcy51aS5uYXZpZ2F0b3JDYW5jZWwpO1xuXHR9LFxuXG5cdGhpZGVOYXZpZ2F0b3I6IGZ1bmN0aW9uKG5hdmlnYXRvckVsZW1lbnQpIHtcblx0XHRuYXZpZ2F0b3JFbGVtZW50LmFkZENsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRzaG93TmF2aWdhdG9yTmV4dDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zaG93TmF2aWdhdG9yKHRoaXMudWkubmF2aWdhdG9yTmV4dCk7XG5cdH0sXG5cblx0c2hvd05hdmlnYXRvclByZXZpb3VzOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNob3dOYXZpZ2F0b3IodGhpcy51aS5uYXZpZ2F0b3JQcmV2aW91cyk7XG5cdH0sXG5cblx0c2hvd05hdmlnYXRvckNhbmNlbDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zaG93TmF2aWdhdG9yKHRoaXMudWkubmF2aWdhdG9yQ2FuY2VsKTtcblx0fSxcblxuXHRzaG93TmF2aWdhdG9yOiBmdW5jdGlvbihuYXZpZ2F0b3JFbGVtZW50KSB7XG5cdFx0aWYgKG5hdmlnYXRvckVsZW1lbnQuaGFzQ2xhc3MoXCJoaWRlXCIpKVxuXHRcdFx0bmF2aWdhdG9yRWxlbWVudC5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0ZGlzYWJsZU5hdmlnYXRvclByZXZpb3VzOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmRpc2FibGVOYXZpZ2F0b3IodGhpcy51aS5uYXZpZ2F0b3JQcmV2aW91cyk7XG5cdH0sXG5cblx0ZW5hYmxlTmF2aWdhdG9yUHJldmlvdXM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZW5hYmxlTmF2aWdhdG9yKHRoaXMudWkubmF2aWdhdG9yUHJldmlvdXMpO1xuXHR9LFxuXG5cdGRpc2FibGVOYXZpZ2F0b3JOZXh0OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmRpc2FibGVOYXZpZ2F0b3IodGhpcy51aS5uYXZpZ2F0b3JOZXh0KTtcblx0fSxcblxuXHRlbmFibGVOYXZpZ2F0b3JOZXh0OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmVuYWJsZU5hdmlnYXRvcih0aGlzLnVpLm5hdmlnYXRvck5leHQpO1xuXHR9LFxuXG5cdGRpc2FibGVOYXZpZ2F0b3I6IGZ1bmN0aW9uKG5hdmlnYXRvckVsZW1lbnQpIHtcblx0XHRuYXZpZ2F0b3JFbGVtZW50LmFkZENsYXNzKFwiZGlzYWJsZWRcIik7XG5cdFx0bmF2aWdhdG9yRWxlbWVudC5wcm9wKFwiZGlzYWJsZWRcIiwgdHJ1ZSk7XG5cdH0sXG5cblx0ZW5hYmxlTmF2aWdhdG9yOiBmdW5jdGlvbihuYXZpZ2F0b3JFbGVtZW50KSB7XG5cdFx0aWYgKG5hdmlnYXRvckVsZW1lbnQuaGFzQ2xhc3MoXCJkaXNhYmxlZFwiKSkge1xuXHRcdFx0bmF2aWdhdG9yRWxlbWVudC5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xuXHRcdFx0bmF2aWdhdG9yRWxlbWVudC5wcm9wKFwiZGlzYWJsZWRcIiwgZmFsc2UpO1xuXHRcdH1cblxuXHRcdHRoaXMuc2hvd05hdmlnYXRvcihuYXZpZ2F0b3JFbGVtZW50KTtcblx0fSxcblxuXHR1cGRhdGVOYXZpZ2F0b3JOZXh0OiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5fc3RhdGUuY2xvc2VOZXh0KSB7XG5cdFx0XHR0aGlzLnVpLm5hdmlnYXRvck5leHQucmVtb3ZlQ2xhc3MoXCJmYS1jaGV2cm9uLXJpZ2h0XCIpO1xuXHRcdFx0dGhpcy51aS5uYXZpZ2F0b3JOZXh0LmFkZENsYXNzKFwiZmEtY2hlY2tcIik7XG5cdFx0XHR0aGlzLnVpLm5hdmlnYXRvck5leHQuYXR0cihcInRpdGxlXCIsIFwiU3VjY2VzcyAoQ2xvc2UpXCIpO1xuXHRcdH1cblx0XHRlbHNlIGlmICh0aGlzLnVpLm5hdmlnYXRvck5leHQuaGFzQ2xhc3MoXCJmYS1jaGVja1wiKSkge1xuXHRcdFx0dGhpcy51aS5uYXZpZ2F0b3JOZXh0LnJlbW92ZUNsYXNzKFwiZmEtY2hlY2tcIik7XG5cdFx0XHR0aGlzLnVpLm5hdmlnYXRvck5leHQuYWRkQ2xhc3MoXCJmYS1jaGV2cm9uLXJpZ2h0XCIpO1xuXHRcdFx0dGhpcy51aS5uYXZpZ2F0b3JOZXh0LmF0dHIoXCJ0aXRsZVwiLCBcIk5leHQgY2FyZFwiKTtcblx0XHR9XG5cdH0sXG5cblx0b25DYXJkRmlyc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuaGlkZU5hdmlnYXRvclByZXZpb3VzKCk7XG5cdFx0dGhpcy5kaXNhYmxlTmF2aWdhdG9yTmV4dCgpO1xuXHR9LFxuXG5cdG9uQ2FyZExhc3Q6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHRpZiAob3B0aW9ucyAmJiBvcHRpb25zLmVycm9yKSB7XG5cdFx0XHR0aGlzLmVuYWJsZU5hdmlnYXRvclByZXZpb3VzKCk7XG5cdFx0XHR0aGlzLmhpZGVOYXZpZ2F0b3JOZXh0KCk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5lbmFibGVOYXZpZ2F0b3JQcmV2aW91cygpO1xuXHRcdFx0dGhpcy5lbmFibGVOYXZpZ2F0b3JOZXh0KCk7XG5cblx0XHRcdHRoaXMuX3N0YXRlLmNsb3NlTmV4dCA9IHRydWU7XG5cblx0XHRcdHRoaXMudXBkYXRlTmF2aWdhdG9yTmV4dCgpO1xuXHRcdH1cblx0fSxcblxuXHRvbkNhcmRCdXN5OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmhpZGVOYXZpZ2F0b3JOZXh0KCk7XG5cdFx0dGhpcy5oaWRlTmF2aWdhdG9yUHJldmlvdXMoKTtcblx0XHR0aGlzLmhpZGVOYXZpZ2F0b3JDYW5jZWwoKTtcblx0fSxcblxuXHRvbkNhcmRSZWFkeTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zaG93TmF2aWdhdG9yTmV4dCgpO1xuXHRcdHRoaXMuc2hvd05hdmlnYXRvclByZXZpb3VzKCk7XG5cdFx0dGhpcy5zaG93TmF2aWdhdG9yQ2FuY2VsKCk7XG5cdH0sXG5cblx0b25OYXZpZ2F0b3JQcmV2aW91c0NsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnRyaWdnZXIoXCJjYXJkOnByZXZpb3VzXCIpO1xuXG5cdFx0aWYgKHRoaXMuX3N0YXRlLmNsb3NlTmV4dClcblx0XHRcdHRoaXMuX3N0YXRlLmNsb3NlTmV4dCA9IGZhbHNlO1xuXG5cdFx0dGhpcy51cGRhdGVOYXZpZ2F0b3JOZXh0KCk7XG5cdH0sXG5cblx0b25OYXZpZ2F0b3JOZXh0Q2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLl9zdGF0ZS5jbG9zZU5leHQpXG5cdFx0XHR0aGlzLnRyaWdnZXIoXCJjYXJkOmFjY2VwdFwiKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnRyaWdnZXIoXCJjYXJkOm5leHRcIik7XG5cdH0sXG5cblx0b25OYXZpZ2F0b3JDYW5jZWxDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy50cmlnZ2VyKFwiY2FyZDpjYW5jZWxcIik7XG5cdH0sXG5cblx0b25EZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHQvLyBTdG9wIGxpc3RlbmluZyB0byB0aGUgY3VycmVudCAoYW5kIGxhc3QpIGNhcmRcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcodGhpcy5jdXJyZW50Q2FyZC5yZWdpb24uY3VycmVudFZpZXcpO1xuXG5cdFx0Ly8gVW5iaW5kIHRoZSBjbGljayBoYW5kbGVyXG5cdFx0JChcIiNtb2RhbHNcIikub2ZmKFwiY2xpY2tcIik7XG5cblx0XHQvLyBIaWRlIHRoZSBtb2RhbCBiYWNrZ3JvdW5kXG5cdFx0JChcIi5tb2RhbC1lbGVtZW50XCIsIHRoaXMuaG9zdCkuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdCQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKFwiaGlkZS1vdmVyZmxvd1wiKTtcblx0fSxcbn0pO1xuIl19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar moment = require(\"moment\");\n\nvar settings = require(\"app-settings\");\n\nvar Actions = Backbone.Collection.extend({\n\tinitialize: function initialize(models, options) {\n\t\tthis.identifier = options.identifier;\n\t\tthis.category = options.category;\n\t},\n\tmodel: Backbone.Model,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/data/changelogs/\" + this.category + \"/\" + this.identifier;\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttemplate: require(\"./templates/changelogModal.nunj\"),\n\n\tclassName: \"changelog-modal\",\n\n\tui: {\n\t\titem: \".item\",\n\t\tsearch: \"input\",\n\t\toverlay: \"div.input-overlay\"\n\t},\n\n\tevents: {\n\t\t\"click button.ok\": \"skip\",\n\t\t\"mouseover @ui.item\": \"showFullDate\",\n\t\t\"mouseout @ui.item\": \"hideFullDate\",\n\t\t\"input @ui.search\": \"search\",\n\n\t\t\"click label @ui.overlay\": \"clearBox\"\n\t},\n\n\tcollectionEvents: {\n\t\treset: \"render\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tfromNow: function fromNow(dt) {\n\t\t\t\treturn moment.unix(dt).utc().format(\"DD MMM YYYY, HH:mm a\");\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.host = options.host || \"#modals\";\n\n\t\tthis.items = new Actions([], {\n\t\t\tidentifier: this.model.get(\"identifier\"),\n\t\t\tcategory: this.model.get(\"category\")\n\t\t});\n\n\t\tthis.collection = new Backbone.VirtualCollection(this.items, {});\n\n\t\tthis.bindEvents(this.collection, this.collectionEvents);\n\n\t\tthis.xhr = this.items.fetch({ reset: true });\n\t},\n\n\tserializeData: function serializeData() {\n\t\treturn {\n\t\t\titems: this.collection ? this.collection.toJSON() : undefined,\n\t\t\tmodel: this.model.toJSON(),\n\t\t\tsearchText: this.searchText || \"\"\n\t\t};\n\t},\n\n\tclearBox: function clearBox(evt) {\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\n\t\tvar el = $(evt.currentTarget);\n\t\tthis.ui.overlay.addClass(\"hide\");\n\t\tel.siblings(\"input\").val(\"\");\n\t\tthis.search();\n\t},\n\n\tshow: function show() {\n\t\t$(\".modal-container\", $(this.host)).append(this.render().el);\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this = this;\n\n\t\t// Render a background\n\t\t$(\".modal-element\", $(this.host)).removeClass(\"hide\");\n\t\t$(\"body\").addClass(\"hide-overflow\");\n\n\t\tif (this.options.classNames) this.$el.addClass(this.options.classNames);\n\n\t\t// If there's any other modals visible right now, hide them, and restore it after\n\t\tthis.dunked = $.map($(\".modal-container\", $(this.host)).children(), function (item) {\n\t\t\tif ($(item).is(_this.$el)) return;\n\t\t\t$(item).addClass(\"hide\");\n\t\t\treturn $(item).getPath();\n\t\t});\n\n\t\tthis.trigger(\"rendered\", this);\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tif (this.xhr) this.xhr.abort();\n\t},\n\n\tonDestroy: function onDestroy() {\n\t\t// Clean up the background\n\t\tif (this.dunked && this.dunked.length === 0) {\n\t\t\t$(\".modal-element\", $(this.host)).addClass(\"hide\");\n\t\t\t$(\"body\").removeClass(\"hide-overflow\");\n\t\t}\n\n\t\tif (this.dunked) {\n\t\t\t_.each(this.dunked, function (item) {\n\t\t\t\tif (!item) return;\n\t\t\t\tvar el = $(item);\n\t\t\t\tif (el && el.length) el.removeClass(\"hide\");\n\t\t\t});\n\t\t}\n\t},\n\n\tskip: function skip() {\n\t\tthis.trigger(\"action\", \"skip\");\n\t\tthis.destroy();\n\t},\n\n\tsearch: _.debounce(function () {\n\t\tvar _this2 = this;\n\n\t\t/* eslint-disable no-invalid-this */\n\n\t\tthis.searchText = _.trim(this.ui.search.val() || \"\").toLowerCase();\n\t\tif (!this.searchText) {\n\t\t\tthis.collection.updateFilter({});\n\t\t\tthis.render();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.collection.updateFilter(function (x) {\n\t\t\treturn _.every(_this2.searchText.split(\" \"), function (y) {\n\t\t\t\treturn x.get(\"reason\") && _.includes(x.get(\"reason\").toLowerCase(), y) || x.get(\"user\") && _.includes(x.get(\"user\").toLowerCase(), y) || _.some(_.keys(x.get(\"changes\")), function (z) {\n\t\t\t\t\treturn _.includes(z.toLowerCase(), y);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\tthis.render();\n\t\tthis.delegateEvents();\n\n\t\tthis.ui.search.focus();\n\n\t\t/* eslint-enable no-invalid-this */\n\t}, 500)\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNoYW5nZWxvZ01vZGFsLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIiQiLCJfIiwibW9tZW50Iiwic2V0dGluZ3MiLCJBY3Rpb25zIiwiQ29sbGVjdGlvbiIsImV4dGVuZCIsImluaXRpYWxpemUiLCJtb2RlbHMiLCJvcHRpb25zIiwiaWRlbnRpZmllciIsImNhdGVnb3J5IiwibW9kZWwiLCJNb2RlbCIsInVybCIsInVybFJvb3QiLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJ0ZW1wbGF0ZSIsImNsYXNzTmFtZSIsInVpIiwiaXRlbSIsInNlYXJjaCIsIm92ZXJsYXkiLCJldmVudHMiLCJjb2xsZWN0aW9uRXZlbnRzIiwicmVzZXQiLCJ0ZW1wbGF0ZUNvbnRleHQiLCJmcm9tTm93IiwiZHQiLCJ1bml4IiwidXRjIiwiZm9ybWF0IiwiaG9zdCIsIml0ZW1zIiwiZ2V0IiwiY29sbGVjdGlvbiIsIlZpcnR1YWxDb2xsZWN0aW9uIiwiYmluZEV2ZW50cyIsInhociIsImZldGNoIiwic2VyaWFsaXplRGF0YSIsInRvSlNPTiIsInVuZGVmaW5lZCIsInNlYXJjaFRleHQiLCJjbGVhckJveCIsImV2dCIsInN0b3BQcm9wYWdhdGlvbiIsInByZXZlbnREZWZhdWx0IiwiZWwiLCJjdXJyZW50VGFyZ2V0IiwiYWRkQ2xhc3MiLCJzaWJsaW5ncyIsInZhbCIsInNob3ciLCJhcHBlbmQiLCJyZW5kZXIiLCJvblJlbmRlciIsInJlbW92ZUNsYXNzIiwiY2xhc3NOYW1lcyIsIiRlbCIsImR1bmtlZCIsIm1hcCIsImNoaWxkcmVuIiwiaXMiLCJnZXRQYXRoIiwidHJpZ2dlciIsIm9uQmVmb3JlRGVzdHJveSIsImFib3J0Iiwib25EZXN0cm95IiwibGVuZ3RoIiwiZWFjaCIsInNraXAiLCJkZXN0cm95IiwiZGVib3VuY2UiLCJ0cmltIiwidG9Mb3dlckNhc2UiLCJ1cGRhdGVGaWx0ZXIiLCJldmVyeSIsInNwbGl0IiwieCIsImlu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QUYsQ0FBUSxPQUFLbEMsVUFBTCxDQUFnQm1DLEtBQWhCLENBQXNCLEdBQXRCLENBQVIsRUFBb0M7QUFBQSxXQUNwRUMsRUFBRTdDLEdBQUYsQ0FBTSxRQUFOLEtBQW1CcEMsRUFBRWtGLFFBQUYsQ0FBV0QsRUFBRTdDLEdBQUYsQ0FBTSxRQUFOLEVBQWdCeUMsV0FBaEIsRUFBWCxFQUEwQ00sQ0FBMUMsQ0FBcEIsSUFBc0VGLEVBQUU3QyxHQUFGLENBQU0sTUFBTixLQUFpQnBDLEVBQUVrRixRQUFGLENBQVdELEVBQUU3QyxHQUFGLENBQU0sTUFBTixFQUFjeUMsV0FBZCxFQUFYLEVBQXdDTSxDQUF4QyxDQUF2RixJQUNDbkYsRUFBRW9GLElBQUYsQ0FBT3BGLEVBQUVxRixJQUFGLENBQU9KLEVBQUU3QyxHQUFGLENBQU0sU0FBTixDQUFQLENBQVAsRUFBaUM7QUFBQSxZQUFLcEMsRUFBRWtGLFFBQUYsQ0FBV0ksRUFBRVQsV0FBRixFQUFYLEVBQTRCTSxDQUE1QixDQUFMO0FBQUEsS0FBakMsQ0FGb0U7QUFBQSxJQUFwQyxDQUFMO0FBQUEsR0FBN0I7O0FBSUEsT0FBSzFCLE1BQUw7QUFDQSxPQUFLOEIsY0FBTDs7QUFFQSxPQUFLbEUsRUFBTCxDQUFRRSxNQUFSLENBQWVpRSxLQUFmOztBQUVBO0FBQ0EsRUFwQk8sRUFvQkwsR0FwQks7QUFwSHdDLENBQWhDLENBQWpCIiwiZmlsZSI6ImNoYW5nZWxvZ01vZGFsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBtb21lbnQgPSByZXF1aXJlKFwibW9tZW50XCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IEFjdGlvbnMgPSBCYWNrYm9uZS5Db2xsZWN0aW9uLmV4dGVuZCh7XG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG1vZGVscywgb3B0aW9ucykge1xuXHRcdHRoaXMuaWRlbnRpZmllciA9IG9wdGlvbnMuaWRlbnRpZmllcjtcblx0XHR0aGlzLmNhdGVnb3J5ID0gb3B0aW9ucy5jYXRlZ29yeTtcblx0fSxcblx0bW9kZWw6IEJhY2tib25lLk1vZGVsLFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2RhdGEvY2hhbmdlbG9ncy9cIiArIHRoaXMuY2F0ZWdvcnkgKyBcIi9cIiArIHRoaXMuaWRlbnRpZmllcjtcblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4vdGVtcGxhdGVzL2NoYW5nZWxvZ01vZGFsLm51bmpcIiksXG5cblx0Y2xhc3NOYW1lOiBcImNoYW5nZWxvZy1tb2RhbFwiLFxuXG5cdHVpOiB7XG5cdFx0aXRlbTogXCIuaXRlbVwiLFxuXHRcdHNlYXJjaDogXCJpbnB1dFwiLFxuXHRcdG92ZXJsYXk6IFwiZGl2LmlucHV0LW92ZXJsYXlcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIGJ1dHRvbi5va1wiOiBcInNraXBcIixcblx0XHRcIm1vdXNlb3ZlciBAdWkuaXRlbVwiOiBcInNob3dGdWxsRGF0ZVwiLFxuXHRcdFwibW91c2VvdXQgQHVpLml0ZW1cIjogXCJoaWRlRnVsbERhdGVcIixcblx0XHRcImlucHV0IEB1aS5zZWFyY2hcIjogXCJzZWFyY2hcIixcblxuXHRcdFwiY2xpY2sgbGFiZWwgQHVpLm92ZXJsYXlcIjogXCJjbGVhckJveFwiLFxuXHR9LFxuXG5cdGNvbGxlY3Rpb25FdmVudHM6IHtcblx0XHRyZXNldDogXCJyZW5kZXJcIixcblx0fSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRmcm9tTm93OiBmdW5jdGlvbihkdCkge1xuXHRcdFx0XHRyZXR1cm4gbW9tZW50LnVuaXgoZHQpLnV0YygpLmZvcm1hdChcIkREIE1NTSBZWVlZLCBISDptbSBhXCIpO1xuXHRcdFx0fSxcblx0XHR9O1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLmhvc3QgPSBvcHRpb25zLmhvc3QgfHwgXCIjbW9kYWxzXCI7XG5cblx0XHR0aGlzLml0ZW1zID0gbmV3IEFjdGlvbnMoW10sIHtcblx0XHRcdGlkZW50aWZpZXI6IHRoaXMubW9kZWwuZ2V0KFwiaWRlbnRpZmllclwiKSxcblx0XHRcdGNhdGVnb3J5OiB0aGlzLm1vZGVsLmdldChcImNhdGVnb3J5XCIpLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5jb2xsZWN0aW9uID0gbmV3IEJhY2tib25lLlZpcnR1YWxDb2xsZWN0aW9uKHRoaXMuaXRlbXMsIHt9KTtcblxuXHRcdHRoaXMuYmluZEV2ZW50cyh0aGlzLmNvbGxlY3Rpb24sIHRoaXMuY29sbGVjdGlvbkV2ZW50cyk7XG5cblx0XHR0aGlzLnhociA9IHRoaXMuaXRlbXMuZmV0Y2goeyByZXNldDogdHJ1ZSB9KTtcblx0fSxcblxuXHRzZXJpYWxpemVEYXRhOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aXRlbXM6IHRoaXMuY29sbGVjdGlvbiA/IHRoaXMuY29sbGVjdGlvbi50b0pTT04oKSA6IHVuZGVmaW5lZCxcblx0XHRcdG1vZGVsOiB0aGlzLm1vZGVsLnRvSlNPTigpLFxuXHRcdFx0c2VhcmNoVGV4dDogdGhpcy5zZWFyY2hUZXh0IHx8IFwiXCIsXG5cdFx0fTtcblx0fSxcblxuXHRjbGVhckJveDogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0Y29uc3QgZWwgPSAkKGV2dC5jdXJyZW50VGFyZ2V0KTtcblx0XHR0aGlzLnVpLm92ZXJsYXkuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdGVsLnNpYmxpbmdzKFwiaW5wdXRcIikudmFsKFwiXCIpO1xuXHRcdHRoaXMuc2VhcmNoKCk7XG5cdH0sXG5cblx0c2hvdzogZnVuY3Rpb24oKSB7XG5cdFx0JChcIi5tb2RhbC1jb250YWluZXJcIiwgJCh0aGlzLmhvc3QpKS5hcHBlbmQodGhpcy5yZW5kZXIoKS5lbCk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIFJlbmRlciBhIGJhY2tncm91bmRcblx0XHQkKFwiLm1vZGFsLWVsZW1lbnRcIiwgJCh0aGlzLmhvc3QpKS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0JChcImJvZHlcIikuYWRkQ2xhc3MoXCJoaWRlLW92ZXJmbG93XCIpO1xuXG5cdFx0aWYgKHRoaXMub3B0aW9ucy5jbGFzc05hbWVzKVxuXHRcdFx0dGhpcy4kZWwuYWRkQ2xhc3ModGhpcy5vcHRpb25zLmNsYXNzTmFtZXMpO1xuXG5cdFx0Ly8gSWYgdGhlcmUncyBhbnkgb3RoZXIgbW9kYWxzIHZpc2libGUgcmlnaHQgbm93LCBoaWRlIHRoZW0sIGFuZCByZXN0b3JlIGl0IGFmdGVyXG5cdFx0dGhpcy5kdW5rZWQgPSAkLm1hcCgkKFwiLm1vZGFsLWNvbnRhaW5lclwiLCAkKHRoaXMuaG9zdCkpLmNoaWxkcmVuKCksIGl0ZW0gPT4ge1xuXHRcdFx0aWYgKCQoaXRlbSkuaXModGhpcy4kZWwpKVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHQkKGl0ZW0pLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHJldHVybiAkKGl0ZW0pLmdldFBhdGgoKTtcblx0XHR9KTtcblxuXHRcdHRoaXMudHJpZ2dlcihcInJlbmRlcmVkXCIsIHRoaXMpO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMueGhyKVxuXHRcdFx0dGhpcy54aHIuYWJvcnQoKTtcblx0fSxcblxuXHRvbkRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIENsZWFuIHVwIHRoZSBiYWNrZ3JvdW5kXG5cdFx0aWYgKHRoaXMuZHVua2VkICYmIHRoaXMuZHVua2VkLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0JChcIi5tb2RhbC1lbGVtZW50XCIsICQodGhpcy5ob3N0KSkuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0JChcImJvZHlcIikucmVtb3ZlQ2xhc3MoXCJoaWRlLW92ZXJmbG93XCIpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmR1bmtlZCkge1xuXHRcdFx0Xy5lYWNoKHRoaXMuZHVua2VkLCBpdGVtID0+IHtcblx0XHRcdFx0aWYgKCFpdGVtKVxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0Y29uc3QgZWwgPSAkKGl0ZW0pO1xuXHRcdFx0XHRpZiAoZWwgJiYgZWwubGVuZ3RoKVxuXHRcdFx0XHRcdGVsLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fSxcblxuXHRza2lwOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnRyaWdnZXIoXCJhY3Rpb25cIiwgXCJza2lwXCIpO1xuXHRcdHRoaXMuZGVzdHJveSgpO1xuXHR9LFxuXG5cdHNlYXJjaDogXy5kZWJvdW5jZShmdW5jdGlvbigpIHtcblx0XHQvKiBlc2xpbnQtZGlzYWJsZSBuby1pbnZhbGlkLXRoaXMgKi9cblxuXHRcdHRoaXMuc2VhcmNoVGV4dCA9IF8udHJpbSh0aGlzLnVpLnNlYXJjaC52YWwoKSB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpO1xuXHRcdGlmICghdGhpcy5zZWFyY2hUZXh0KSB7XG5cdFx0XHR0aGlzLmNvbGxlY3Rpb24udXBkYXRlRmlsdGVyKHt9KTtcblx0XHRcdHRoaXMucmVuZGVyKCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5jb2xsZWN0aW9uLnVwZGF0ZUZpbHRlcih4ID0+IF8uZXZlcnkodGhpcy5zZWFyY2hUZXh0LnNwbGl0KFwiIFwiKSwgeSA9PlxuXHRcdFx0KHguZ2V0KFwicmVhc29uXCIpICYmIF8uaW5jbHVkZXMoeC5nZXQoXCJyZWFzb25cIikudG9Mb3dlckNhc2UoKSwgeSkpIHx8ICh4LmdldChcInVzZXJcIikgJiYgXy5pbmNsdWRlcyh4LmdldChcInVzZXJcIikudG9Mb3dlckNhc2UoKSwgeSkpIHx8XG5cdFx0XHRcdF8uc29tZShfLmtleXMoeC5nZXQoXCJjaGFuZ2VzXCIpKSwgeiA9PiBfLmluY2x1ZGVzKHoudG9Mb3dlckNhc2UoKSwgeSkpKSk7XG5cblx0XHR0aGlzLnJlbmRlcigpO1xuXHRcdHRoaXMuZGVsZWdhdGVFdmVudHMoKTtcblxuXHRcdHRoaXMudWkuc2VhcmNoLmZvY3VzKCk7XG5cblx0XHQvKiBlc2xpbnQtZW5hYmxlIG5vLWludmFsaWQtdGhpcyAqL1xuXHR9LCA1MDApLFxufSk7Il19",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\n\nvar settings = require(\"app-settings\");\nvar BulkDragDropHelper = require(\"./bulkDragDropHelper\");\n\nvar DEFAULT_HEIGHT = 260;\nvar IMAGE_THUMBNAIL_BORDER_SIZE = 20;\nvar FAILED_DRAG_MESSAGE_DISPLAY_DURATION = 2500;\n\nvar InvalidDragDisplay = Backbone.Marionette.View.extend({\n\tclassName: \"drag-drop-label-display\",\n\n\ttemplate: require(\"./templates/dragDropFileChooser.nunj\").invalidDisplay\n});\n\nvar LabelDisplay = Backbone.Marionette.View.extend({\n\tclassName: \"drag-drop-label-display\",\n\n\ttemplate: require(\"./templates/dragDropFileChooser.nunj\").labelDisplay\n});\n\nvar LockedDisplay = Backbone.Marionette.View.extend({\n\tclassName: \"drag-drop-label-display\",\n\n\ttemplate: require(\"./templates/dragDropFileChooser.nunj\").lockedDisplay\n});\n\nvar DownloadDisplay = Backbone.Marionette.View.extend({\n\tclassName: \"drag-drop-file-display\",\n\n\ttemplate: require(\"./templates/dragDropFileChooser.nunj\").fileDisplay,\n\n\tui: {\n\t\tbuttonDownload: \".ddfc-download-button\",\n\t\tdownloadLink: \".ddfc-download-link\",\n\t\timage: \"> .ddfc-image\",\n\t\timageThumbnail: \"> .ddfc-image > .ddfc-image-thumbnail\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonDownload\": \"onButtonDownloadClick\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this = this;\n\n\t\treturn {\n\t\t\tgetFileTypeClass: function getFileTypeClass() {\n\t\t\t\tvar fileTypeClass = void 0;\n\n\t\t\t\tswitch (_this.model.get(\"category\")) {\n\t\t\t\t\tcase \"audio\":\n\t\t\t\t\t\tfileTypeClass = \"fa-file-audio\";\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"excel\":\n\t\t\t\t\t\tfileTypeClass = \"fa-file-excel\";\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"flashcarddeck\":\n\t\t\t\t\t\tfileTypeClass = \"fa-clone\";\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"image\":\n\t\t\t\t\t\tfileTypeClass = \"fa-image\";\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"pdf\":\n\t\t\t\t\t\tfileTypeClass = \"fa-file-pdf\";\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"powerpoint\":\n\t\t\t\t\t\tfileTypeClass = \"fa-file-powerpoint\";\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"video\":\n\t\t\t\t\t\tfileTypeClass = \"fa-video-camera\";\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"word\":\n\t\t\t\t\t\tfileTypeClass = \"fa-file-word\";\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tfileTypeClass = \"\";\n\t\t\t\t}\n\n\t\t\t\tif (settings.contentIcons === \"img\") fileTypeClass = \"img-\" + fileTypeClass;else fileTypeClass = \"fal \" + fileTypeClass;\n\n\t\t\t\treturn fileTypeClass;\n\t\t\t},\n\n\t\t\tgetFileModificationDate: function getFileModificationDate() {\n\t\t\t\treturn moment.unix(_this.model.get(\"updatedDate\") || _this.model.get(\"created\")).format(\"D MMM YYYY\");\n\t\t\t},\n\n\t\t\tgetFileName: function getFileName() {\n\t\t\t\treturn _this.model.get(\"filename\");\n\t\t\t},\n\n\t\t\tgetFileSize: function getFileSize() {\n\t\t\t\tvar result = \"0 bytes\";\n\t\t\t\tvar fileSizeInBytes = _this.model.get(\"size\");\n\n\t\t\t\tif (fileSizeInBytes && fileSizeInBytes > 0) {\n\t\t\t\t\tvar order = 1e3;\n\t\t\t\t\tvar units = [\"bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"];\n\t\t\t\t\tvar x = Math.floor(Math.log(fileSizeInBytes) / Math.log(order));\n\n\t\t\t\t\tresult = parseFloat((fileSizeInBytes / Math.pow(order, x)).toFixed(2)) + \" \" + units[x];\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t},\n\n\t\t\tisDownloadable: function isDownloadable() {\n\t\t\t\treturn !_.isNil(_this.model);\n\t\t\t},\n\n\t\t\tisImage: function isImage() {\n\t\t\t\treturn _this.isImage();\n\t\t\t}\n\t\t};\n\t},\n\n\tisImage: function isImage() {\n\t\treturn !_.isNil(this.model) && this.model.get(\"category\") === \"image\";\n\t},\n\n\tgetDownloadLink: function getDownloadLink() {\n\t\treturn settings.urlRoot + \"/api/1.0/resources/\" + this.model.get(\"_id\") + \"/data\";\n\t},\n\n\tonRender: function onRender() {\n\t\tif (this.ui.downloadLink) this.ui.downloadLink.on(\"click\", this.onDownloadLinkClick.bind(this));\n\n\t\tif (this.isImage()) this.loadImage();\n\t},\n\n\tonButtonDownloadClick: function onButtonDownloadClick(event) {\n\t\tevent.stopPropagation();\n\n\t\twindow.open(this.getDownloadLink(), \"_new\");\n\t},\n\n\tonDownloadLinkClick: function onDownloadLinkClick(event) {\n\t\tevent.stopPropagation();\n\t},\n\n\tloadImage: function loadImage() {\n\t\tvar _this2 = this;\n\n\t\tthis.ui.imageThumbnail.get(0).addEventListener(\"load\", function () {\n\t\t\t_this2.ui.imageThumbnail.css({\n\t\t\t\theight: _this2.$el.height() - IMAGE_THUMBNAIL_BORDER_SIZE * 2,\n\t\t\t\t\"max-height\": _this2.$el.height() - IMAGE_THUMBNAIL_BORDER_SIZE * 2\n\t\t\t});\n\n\t\t\t_this2.ui.image.css({\n\t\t\t\twidth: _this2.ui.imageThumbnail.width() + IMAGE_THUMBNAIL_BORDER_SIZE * 2,\n\t\t\t\t\"min-width\": _this2.ui.imageThumbnail.width() + IMAGE_THUMBNAIL_BORDER_SIZE * 2\n\t\t\t});\n\t\t});\n\n\t\tthis.ui.imageThumbnail.css({\n\t\t\theight: \"0px\",\n\t\t\t\"max-height\": \"0px\"\n\t\t});\n\n\t\tthis.ui.imageThumbnail.get(0).src = this.getDownloadLink();\n\t}\n});\n\nvar FileDisplay = Backbone.Marionette.View.extend({\n\tclassName: \"drag-drop-file-display\",\n\n\ttemplate: require(\"./templates/dragDropFileChooser.nunj\").fileDisplay,\n\n\tui: {\n\t\timage: \"> .ddfc-image\",\n\t\timageThumbnail: \"> .ddfc-image > .ddfc-image-thumbnail\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this3 = this;\n\n\t\treturn {\n\t\t\tgetFileTypeClass: function getFileTypeClass() {\n\t\t\t\tvar fileTypeClass = void 0;\n\n\t\t\t\tswitch (_this3.getFileExtension()) {\n\t\t\t\t\t// Audio\n\t\t\t\t\tcase \"mp3\":\n\t\t\t\t\t\tfileTypeClass = \"fa-file-audio\";\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t// Excel\n\t\t\t\t\tcase \"xls\":\n\t\t\t\t\tcase \"xlsx\":\n\t\t\t\t\t\tfileTypeClass = \"fa-file-excel\";\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t// Flashcard Deck\n\t\t\t\t\tcase \"csv\":\n\t\t\t\t\t\tfileTypeClass = \"fa-clone\";\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t// Image\n\t\t\t\t\tcase \"jpg\":\n\t\t\t\t\tcase \"jpeg\":\n\t\t\t\t\tcase \"png\":\n\t\t\t\t\tcase \"gif\":\n\t\t\t\t\t\tfileTypeClass = \"fa-image\";\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t// PDF\n\t\t\t\t\tcase \"pdf\":\n\t\t\t\t\t\tfileTypeClass = \"fa-file-pdf\";\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t// Powerpoint\n\t\t\t\t\tcase \"ppt\":\n\t\t\t\t\tcase \"pptx\":\n\t\t\t\t\tcase \"pps\":\n\t\t\t\t\tcase \"ppsx\":\n\t\t\t\t\t\tfileTypeClass = \"fa-file-powerpoint\";\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t// Video\n\t\t\t\t\tcase \"mp4\":\n\t\t\t\t\t\tfileTypeClass = \"fa-video-camera\";\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t// Word\n\t\t\t\t\tcase \"doc\":\n\t\t\t\t\tcase \"docx\":\n\t\t\t\t\t\tfileTypeClass = \"fa-file-word\";\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tfileTypeClass = \"\";\n\t\t\t\t}\n\n\t\t\t\tif (settings.contentIcons === \"img\") fileTypeClass = \"img-\" + fileTypeClass;else fileTypeClass = \"fal \" + fileTypeClass;\n\n\t\t\t\treturn fileTypeClass;\n\t\t\t},\n\n\t\t\tgetFileModificationDate: function getFileModificationDate() {\n\t\t\t\treturn moment(_this3.options.file.lastModified).format(\"D MMM YYYY\");\n\t\t\t},\n\n\t\t\tgetFileName: function getFileName() {\n\t\t\t\treturn _this3.options.file.name;\n\t\t\t},\n\n\t\t\tgetFileSize: function getFileSize() {\n\t\t\t\tvar result = \"0 bytes\";\n\t\t\t\tvar fileSizeInBytes = _this3.options.file.size;\n\n\t\t\t\tif (fileSizeInBytes && fileSizeInBytes > 0) {\n\t\t\t\t\tvar order = 1e3;\n\t\t\t\t\tvar units = [\"bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"];\n\t\t\t\t\tvar x = Math.floor(Math.log(fileSizeInBytes) / Math.log(order));\n\n\t\t\t\t\tresult = parseFloat((fileSizeInBytes / Math.pow(order, x)).toFixed(2)) + \" \" + units[x];\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t},\n\n\t\t\tisDownloadable: function isDownloadable() {\n\t\t\t\treturn !_.isNil(_this3.model);\n\t\t\t},\n\n\t\t\tisImage: function isImage() {\n\t\t\t\treturn _this3.isImage();\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\t},\n\n\tgetFileExtension: function getFileExtension() {\n\t\tvar extension = _.isNil(this.options.file.name) ? \"\" : this.options.file.name.toLowerCase().split(\".\");\n\t\treturn extension.length === 0 ? \"\" : extension[extension.length - 1];\n\t},\n\n\tisImage: function isImage() {\n\t\treturn _.includes([\"jpg\", \"jpeg\", \"png\", \"gif\"], this.getFileExtension());\n\t},\n\n\tonRender: function onRender() {\n\t\tif (this.isImage()) this.loadImage();\n\t},\n\n\tloadImage: function loadImage() {\n\t\tvar _this4 = this;\n\n\t\tvar reader = new FileReader();\n\n\t\treader.addEventListener(\"load\", function (e) {\n\t\t\t_this4.ui.imageThumbnail.css({\n\t\t\t\theight: _this4.$el.height() - IMAGE_THUMBNAIL_BORDER_SIZE * 2\n\t\t\t});\n\n\t\t\t_this4.ui.imageThumbnail.get(0).addEventListener(\"load\", function () {\n\t\t\t\t_this4.ui.image.css({\n\t\t\t\t\twidth: _this4.ui.imageThumbnail.width() + IMAGE_THUMBNAIL_BORDER_SIZE * 2,\n\t\t\t\t\t\"min-width\": _this4.ui.imageThumbnail.width() + IMAGE_THUMBNAIL_BORDER_SIZE * 2\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t_this4.ui.imageThumbnail.get(0).src = e.target.result;\n\t\t});\n\n\t\treader.readAsDataURL(this.options.file);\n\t}\n});\n\nvar FilesDisplay = Backbone.Marionette.View.extend({\n\tclassName: \"drag-drop-file-display\",\n\n\ttemplate: require(\"./templates/dragDropFileChooser.nunj\").filesDisplay,\n\n\tui: {\n\t\timage: \"> .ddfc-image\",\n\t\timageThumbnail: \"> .ddfc-image > .ddfc-image-thumbnail\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this5 = this;\n\n\t\treturn {\n\t\t\tgetFileModificationDate: function getFileModificationDate() {\n\t\t\t\treturn moment(_this5.options.file.lastModified).format(\"D MMM YYYY\");\n\t\t\t},\n\n\t\t\tgetFiles: function getFiles() {\n\t\t\t\treturn _this5.options.files;\n\t\t\t},\n\n\t\t\tgetFileSize: function getFileSize() {\n\t\t\t\tvar result = \"0 bytes\";\n\t\t\t\tvar fileSizeInBytes = _this5.options.file.size;\n\n\t\t\t\tif (fileSizeInBytes && fileSizeInBytes > 0) {\n\t\t\t\t\tvar order = 1e3;\n\t\t\t\t\tvar units = [\"bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"];\n\t\t\t\t\tvar x = Math.floor(Math.log(fileSizeInBytes) / Math.log(order));\n\n\t\t\t\t\tresult = parseFloat((fileSizeInBytes / Math.pow(order, x)).toFixed(2)) + \" \" + units[x];\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t},\n\n\t\t\tisDownloadable: function isDownloadable() {\n\t\t\t\treturn !_.isNil(_this5.model);\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"drag-drop-file-chooser ddfc-editable\",\n\n\ttemplate: require(\"./templates/dragDropFileChooser.nunj\").layout,\n\n\tregions: {\n\t\tdisplay: \"> .ddfc-display-region\"\n\t},\n\n\tui: {\n\t\tfileInput: \"> .ddfc-file-input\"\n\t},\n\n\tevents: {\n\t\tclick: \"onClick\",\n\t\tdrop: \"onDrop\",\n\t\tdragenter: \"onDrag\",\n\t\tdragover: \"onDrag\",\n\n\t\t\"change @ui.fileInput\": \"onFileInputChange\",\n\t\t\"click @ui.fileInput\": \"onFileInputClick\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this6 = this;\n\n\t\treturn {\n\t\t\tgetAcceptedFileTypes: function getAcceptedFileTypes() {\n\t\t\t\treturn _.isArray(_this6.options.acceptedFileTypes) ? _this6.options.acceptedFileTypes.join(\",\") : undefined;\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\t// Options\n\t\t//   acceptedFileTypes: An array of file extensions and/or MIME types that the file chooser will accept.\n\t\t//   displayText: Provide a string that will override the default text in the template.\n\t\t//   existingFile: Provide a reference to a resource model to make the resource's associated file available\n\t\t//     for download.\n\t\t//   height: An optional integer to set the desired height of the chooser (for image previews).\n\t\t//   locked: A boolean value. Set to true to prevent the user from choosing a new file if `existingFile` is set.\n\t\tthis.options = options;\n\n\t\tthis.on(\"selected\", this.showFile.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.showDefaultView();\n\n\t\tif (this.isLocked()) this.$el.removeClass(\"ddfc-editable\");\n\n\t\tthis.$el.css({ height: this.options.height || DEFAULT_HEIGHT });\n\n\t\tif (this.options.multiple) this.ui.fileInput.attr(\"multiple\", true);\n\t},\n\n\tflashLocked: function flashLocked() {\n\t\tthis.showChildView(\"display\", new LockedDisplay());\n\n\t\tsetTimeout(this.showDefaultView.bind(this), FAILED_DRAG_MESSAGE_DISPLAY_DURATION);\n\t},\n\n\tflashInvalidDrag: function flashInvalidDrag() {\n\t\tthis.showChildView(\"display\", new InvalidDragDisplay());\n\n\t\tsetTimeout(this.showDefaultView.bind(this), FAILED_DRAG_MESSAGE_DISPLAY_DURATION);\n\t},\n\n\tisLocked: function isLocked() {\n\t\treturn this.options.existingFile && this.options.locked;\n\t},\n\n\tselectFile: function selectFile(file) {\n\t\tthis.selectedFile = file;\n\t\tthis.trigger(\"selected\", file);\n\t},\n\n\tselectFiles: function selectFiles(files) {\n\t\tthis.selectedFiles = files;\n\t\tthis.trigger(\"selected\", files);\n\t},\n\n\tshowDefaultView: function showDefaultView() {\n\t\tif (this.options.existingFile) this.showDownload();else if (this.selectedFile) this.showFile(this.selectedFile);else this.showPrompt();\n\t},\n\n\tshowDownload: function showDownload() {\n\t\tthis.showChildView(\"display\", new DownloadDisplay({ model: this.options.existingFile }));\n\t},\n\n\tshowFile: function showFile(file) {\n\t\tif (this.options.multiple) this.showChildView(\"display\", new FilesDisplay({ files: file }));else this.showChildView(\"display\", new FileDisplay({ file: file }));\n\t},\n\n\tshowPrompt: function showPrompt() {\n\t\tthis.showChildView(\"display\", new LabelDisplay({ displayText: this.options.displayText }));\n\t},\n\n\t// --------------------------------------------------------------------------\n\t// Root\n\t// --------------------------------------------------------------------------\n\n\tonClick: function onClick(event) {\n\t\tevent.stopPropagation();\n\n\t\tif (!this.isLocked()) this.ui.fileInput.click();\n\t},\n\n\tonDrag: function onDrag(event) {\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\t\tevent.originalEvent.dataTransfer.dropEffect = \"copy\";\n\t},\n\n\textractFileFromEvent: function extractFileFromEvent(event) {\n\t\tvar file = void 0;\n\t\tvar fileList = _.isNil(event.originalEvent.dataTransfer.items) ? event.originalEvent.dataTransfer.files : event.originalEvent.dataTransfer.items;\n\n\t\tif (fileList.length >= 1) {\n\t\t\tif (_.isFunction(fileList.item)) {\n\t\t\t\tfile = fileList.item(0);\n\n\t\t\t\tif ((_.isNil(file) || _.isNil(file.name)) && !_.isNil(event.originalEvent.dataTransfer.items)) file = event.originalEvent.dataTransfer.items[0].kind === \"file\" ? event.originalEvent.dataTransfer.items[0].getAsFile() : null;\n\t\t\t} else {\n\t\t\t\tfile = fileList[0].kind === \"file\" ? fileList[0].getAsFile() : null;\n\t\t\t}\n\t\t}\n\n\t\treturn file;\n\t},\n\n\tisFileAcceptable: function isFileAcceptable(file) {\n\t\tvar result = false;\n\n\t\tif (!_.isNil(file)) {\n\t\t\tvar fileExtension = _.trimStart(this.extractFileExtension(file), \".\");\n\t\t\tvar acceptedFileTypes = _.map(this.options.acceptedFileTypes, function (fileType) {\n\t\t\t\treturn _.trimStart(fileType, \".\");\n\t\t\t});\n\n\t\t\tresult = _.includes(acceptedFileTypes, file.type) || _.includes(acceptedFileTypes, fileExtension);\n\t\t}\n\n\t\treturn result;\n\t},\n\n\textractFileExtension: function extractFileExtension(file) {\n\t\tvar extension = _.isNil(file.name) ? \"\" : file.name.toLowerCase().split(\".\");\n\t\treturn extension.length === 0 ? \"\" : extension[extension.length - 1];\n\t},\n\n\tonDrop: function onDrop(event) {\n\t\tvar _this7 = this;\n\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\n\t\tif (this.options.multiple) {\n\t\t\tif (!this.bulkDragDropHelper) this.bulkDragDropHelper = new BulkDragDropHelper();\n\t\t\tvar files = _.filter(this.bulkDragDropHelper.extractFilesFromEvent(event), function (f) {\n\t\t\t\treturn f !== null && _this7.isFileAcceptable(f);\n\t\t\t});\n\t\t\tthis.selectFiles(files);\n\t\t} else {\n\t\t\tvar file = this.extractFileFromEvent(event);\n\n\t\t\tif (this.isLocked()) this.flashLocked();else if (this.isFileAcceptable(file)) this.selectFile(file);else this.flashInvalidDrag();\n\t\t}\n\t},\n\n\t// --------------------------------------------------------------------------\n\t// File Input\n\t// --------------------------------------------------------------------------\n\n\tonFileInputChange: function onFileInputChange() {\n\t\tif (this.ui.fileInput.get(0).files[0] && !this.options.multiple) this.selectFile(this.ui.fileInput.get(0).files[0]);else if (this.ui.fileInput.get(0).files.length > 0 && this.options.multiple) this.selectFiles(this.ui.fileInput.get(0).files);\n\t},\n\n\tonFileInputClick: function onFileInputClick(event) {\n\t\tevent.stopPropagation();\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRyYWdEcm9wRmlsZUNob29zZXIuanMiXSwibmFtZXMiOlsiXyIsInJlcXVpcmUiLCJCYWNrYm9uZSIsIm1vbWVudCIsInNldHRpbmdzIiwiQnVsa0RyYWdEcm9wSGVscGVyIiwiREVGQVVMVF9IRUlHSFQiLCJJTUFHRV9USFVNQk5BSUxfQk9SREVSX1NJWkUiLCJGQUlMRURfRFJBR19NRVNTQUdFX0RJU1BMQVlfRFVSQVRJT04iLCJJbnZhbGlkRHJhZ0Rpc3BsYXkiLCJNYXJpb25ldHRlIiwiVmlldyIsImV4dGVuZCIsImNsYXNzTmFtZSIsInRlbXBsYXRlIiwiaW52YWxpZERpc3BsYXkiLCJMYWJlbERpc3BsYXkiLCJsYWJlbERpc3BsYXkiLCJMb2NrZWREaXNwbGF5IiwibG9ja2VkRGlzcGxheSIsIkRvd25sb2FkRGlzcGxheSIsImZpbGVEaXNwbGF5IiwidWkiLCJidXR0b25Eb3dubG9hZCIsImRvd25sb2FkTGluayIsImltYWdlIiwiaW1hZ2VUaHVtYm5haWwiLCJldmVudHMiLCJ0ZW1wbGF0ZUNvbnRleHQiLCJnZXRGaWxlVHlwZUNsYXNzIiwiZmlsZVR5cGVDbGFzcyIsIm1vZGVsIiwiZ2V0IiwiY29udGVudEljb25zIiwiZ2V0RmlsZU1vZGlmaWNhdGlvbkRhdGUiLCJ1bml4IiwiZm9ybWF0IiwiZ2V0RmlsZU5hbWUiLCJnZXRGaWxlU2l6ZSIsInJlc3VsdCIsImZpbGVTaXplSW5CeXRlcyIsIm9yZGVyIiwidW5pdHMiLCJ4IiwiTWF0aCIsImZsb29yIiwibG9nIiwicGFyc2VGbG9hdCIsInBvdyIsInRvRml4ZWQiLCJpc0Rvd25sb2FkYWJsZSIsImlzTmlsIiwiaXNJbWFnZSIsImdldERvd25sb2FkTGluayIsInVybFJvb3QiLCJvblJlbmRlciIsIm9uIiwib25Eb3dubG9hZExpbmtDbGljayIsImJpbmQiLCJsb2FkSW1hZ2UiLCJvbkJ1dHRvbkRvd25sb2FkQ2xpY2siLCJldmVudCIsInN0b3BQcm9wYWdhdGlvbiIsIndpbmRvdyIsIm9wZW4iLCJhZGRFdmVudExpc3RlbmVyIiwiY3NzIiwiaGVpZ2h0IiwiJGVsIiwid2lkdGgiLCJzcmMiLCJGaWxlRGlzcGxheSIsImdldEZpbGVFeHRlbnNpb24iLCJvcHRpb25zIiwiZmlsZSIsImxhc3RNb2RpZmllZCIsIm5hbWUiLCJzaXplIiwiaW5pdGlhbGl6ZSIsImV4dGVuc2lvbiIsInRvTG93ZXJDYXNlIiwic3BsaXQiLCJsZW5ndGgiLCJpbmNsdWRlcyIsInJlYWRlciIsIkZpbGVSZWFkZXIiLCJlIiwidGFyZ2V0IiwicmVhZEFzRGF0YVVSTCIsIkZpbGVzRGlzcGxheSIsImZpbGVzRGlzcGxheSIsImdldEZpbGVzIiwiZmlsZXMiLCJtb2R1bGUiLCJleHBvcnRzIiwibGF5b3V0IiwicmVnaW9ucyIsImRpc3BsYXkiLCJmaWxlSW5wdXQiLCJjbGljayIsImRyb3AiLCJkcmFnZW50ZXIiLCJkcmFnb3ZlciIsImdldEFjY2VwdGVkRmlsZVR5cGVzIiwiaXNBcnJheSIsImFjY2VwdGVkRmlsZVR5cGVzIiwiam9pbiIsInVuZGVmaW5lZCIsInNob3dGaWxlIiwic2hvd0RlZmF1bHRWaWV3IiwiaXNMb2NrZWQiLCJyZW1vdmVDbGFzcyIsIm11bHRpcGxlIiwiYXR0ciIsImZsYXNoTG9ja2VkIiwic2hvd0NoaWxkVmlldyIsInNldFRpbWVvdXQiLCJmbGFzaEludmFsaWREcmFnIiwiZXhpc3RpbmdGaWxlIiwibG9ja2VkIiwic2VsZWN0RmlsZSIsInNlbGVjdGVkRmlsZSIsInRyaWdnZXIiLCJzZWxlY3RGaWxlcyIsInNlbGVjdGVkRmlsZXMiLCJzaG93RG93bmxvYWQiLCJzaG93UHJvbXB0IiwiZGlzcGxheVRleHQiLCJvbkNsaWNrIiwib25EcmFnIiwicHJldmVudERlZmF1bHQiLCJvcmlnaW5hbEV2ZW50IiwiZGF0YVRyYW5zZmVyIiwiZHJvcEVmZmVjdCIsImV4dHJhY3RGaWxlRnJvbUV2ZW50IiwiZmlsZUxpc3QiLCJpdGVtcyIsImlzRnVuY3Rpb24iLCJpdGVtIiwia2luZCIsImdldEFzRmlsZSIsImlzRmlsZUFjY2VwdGFibGUiLCJmaWxlRXh0ZW5zaW9uIiwidHJpbVN0YXJ0IiwiZXh0cmFjdEZpbGVFeHRlbnNpb24iLCJtYXAiLCJmaWxlVHlwZSIsInR5cGUiLCJvbkRyb3AiLCJidWxrRHJhZ0Ryb3BIZWxwZXIiLCJmaWx0ZXIiLCJleHRyYWN0RmlsZXNGcm9tRXZlbnQiLCJmIiwib25GaWxlSW5wdXRDaGFuZ2UiLCJvbkZpbGVJbnB1dENsaWNrIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLFdBQVdELFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1FLFNBQVNGLFFBQVEsUUFBUixDQUFmOztBQUVBLElBQU1HLFdBQVdILFFBQVEsY0FBUixDQUFqQjtBQUNBLElBQU1JLHFCQUFxQkosUUFBUSxzQkFBUixDQUEzQjs7QUFFQSxJQUFNSyxpQkFBaUIsR0FBdkI7QUFDQSxJQUFNQyw4QkFBOEIsRUFBcEM7QUFDQSxJQUFNQyx1Q0FBdUMsSUFBN0M7O0FBRUEsSUFBTUMscUJBQXFCUCxTQUFTUSxVQUFULENBQW9CQyxJQUFwQixDQUF5QkMsTUFBekIsQ0FBZ0M7QUFDMURDLFlBQVcseUJBRCtDOztBQUcxREMsV0FBVWIsUUFBUSxzQ0FBUixFQUFnRGM7QUFIQSxDQUFoQyxDQUEzQjs7QUFNQSxJQUFNQyxlQUFlZCxTQUFTUSxVQUFULENBQW9CQyxJQUFwQixDQUF5QkMsTUFBekIsQ0FBZ0M7QUFDcERDLFlBQVcseUJBRHlDOztBQUdwREMsV0FBVWIsUUFBUSxzQ0FBUixFQUFnRGdCO0FBSE4sQ0FBaEMsQ0FBckI7O0FBTUEsSUFBTUMsZ0JBQWdCaEIsU0FBU1EsVUFBVCxDQUFvQkMsSUFBcEIsQ0FBeUJDLE1BQXpCLENBQWdDO0FBQ3JEQyxZQUFXLHlCQUQwQzs7QUFHckRDLFdBQVViLFFBQVEsc0NBQVIsRUFBZ0RrQjtBQUhMLENBQWhDLENBQXRCOztBQU1BLElBQU1DLGtCQUFrQmxCLFNBQVNRLFVBQVQsQ0FBb0JDLElBQXBCLENB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UzdGLEtBQVQsRUFBZ0I7QUFDakNBLFFBQU1DLGVBQU47QUFDQTtBQWpNK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoiZHJhZ0Ryb3BGaWxlQ2hvb3Nlci5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IG1vbWVudCA9IHJlcXVpcmUoXCJtb21lbnRcIik7XG5cbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcbmNvbnN0IEJ1bGtEcmFnRHJvcEhlbHBlciA9IHJlcXVpcmUoXCIuL2J1bGtEcmFnRHJvcEhlbHBlclwiKTtcblxuY29uc3QgREVGQVVMVF9IRUlHSFQgPSAyNjA7XG5jb25zdCBJTUFHRV9USFVNQk5BSUxfQk9SREVSX1NJWkUgPSAyMDtcbmNvbnN0IEZBSUxFRF9EUkFHX01FU1NBR0VfRElTUExBWV9EVVJBVElPTiA9IDI1MDA7XG5cbmNvbnN0IEludmFsaWREcmFnRGlzcGxheSA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZHJhZy1kcm9wLWxhYmVsLWRpc3BsYXlcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4vdGVtcGxhdGVzL2RyYWdEcm9wRmlsZUNob29zZXIubnVualwiKS5pbnZhbGlkRGlzcGxheSxcbn0pO1xuXG5jb25zdCBMYWJlbERpc3BsYXkgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImRyYWctZHJvcC1sYWJlbC1kaXNwbGF5XCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9kcmFnRHJvcEZpbGVDaG9vc2VyLm51bmpcIikubGFiZWxEaXNwbGF5LFxufSk7XG5cbmNvbnN0IExvY2tlZERpc3BsYXkgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImRyYWctZHJvcC1sYWJlbC1kaXNwbGF5XCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9kcmFnRHJvcEZpbGVDaG9vc2VyLm51bmpcIikubG9ja2VkRGlzcGxheSxcbn0pO1xuXG5jb25zdCBEb3dubG9hZERpc3BsYXkgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImRyYWctZHJvcC1maWxlLWRpc3BsYXlcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4vdGVtcGxhdGVzL2RyYWdEcm9wRmlsZUNob29zZXIubnVualwiKS5maWxlRGlzcGxheSxcblxuXHR1aToge1xuXHRcdGJ1dHRvbkRvd25sb2FkOiBcIi5kZGZjLWRvd25sb2FkLWJ1dHRvblwiLFxuXHRcdGRvd25sb2FkTGluazogXCIuZGRmYy1kb3dubG9hZC1saW5rXCIsXG5cdFx0aW1hZ2U6IFwiPiAuZGRmYy1pbWFnZVwiLFxuXHRcdGltYWdlVGh1bWJuYWlsOiBcIj4gLmRkZmMtaW1hZ2UgPiAuZGRmYy1pbWFnZS10aHVtYm5haWxcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5idXR0b25Eb3dubG9hZFwiOiBcIm9uQnV0dG9uRG93bmxvYWRDbGlja1wiLFxuXHR9LFxuXG5cdHRlbXBsYXRlQ29udGV4dDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGdldEZpbGVUeXBlQ2xhc3M6ICgpID0+IHtcblx0XHRcdFx0bGV0IGZpbGVUeXBlQ2xhc3M7XG5cblx0XHRcdFx0c3dpdGNoICh0aGlzLm1vZGVsLmdldChcImNhdGVnb3J5XCIpKSB7XG5cdFx0XHRcdFx0Y2FzZSBcImF1ZGlvXCI6XG5cdFx0XHRcdFx0XHRmaWxlVHlwZUNsYXNzID0gXCJmYS1maWxlLWF1ZGlvXCI7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgXCJleGNlbFwiOlxuXHRcdFx0XHRcdFx0ZmlsZVR5cGVDbGFzcyA9IFwiZmEtZmlsZS1leGNlbFwiO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlIFwiZmxhc2hjYXJkZGVja1wiOlxuXHRcdFx0XHRcdFx0ZmlsZVR5cGVDbGFzcyA9IFwiZmEtY2xvbmVcIjtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSBcImltYWdlXCI6XG5cdFx0XHRcdFx0XHRmaWxlVHlwZUNsYXNzID0gXCJmYS1pbWFnZVwiO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlIFwicGRmXCI6XG5cdFx0XHRcdFx0XHRmaWxlVHlwZUNsYXNzID0gXCJmYS1maWxlLXBkZlwiO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlIFwicG93ZXJwb2ludFwiOlxuXHRcdFx0XHRcdFx0ZmlsZVR5cGVDbGFzcyA9IFwiZmEtZmlsZS1wb3dlcnBvaW50XCI7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgXCJ2aWRlb1wiOlxuXHRcdFx0XHRcdFx0ZmlsZVR5cGVDbGFzcyA9IFwiZmEtdmlkZW8tY2FtZXJhXCI7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgXCJ3b3JkXCI6XG5cdFx0XHRcdFx0XHRmaWxlVHlwZUNsYXNzID0gXCJmYS1maWxlLXdvcmRcIjtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdGZpbGVUeXBlQ2xhc3MgPSBcIlwiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHNldHRpbmdzLmNvbnRlbnRJY29ucyA9PT0gXCJpbWdcIilcblx0XHRcdFx0XHRmaWxlVHlwZUNsYXNzID0gXCJpbWctXCIgKyBmaWxlVHlwZUNsYXNzO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0ZmlsZVR5cGVDbGFzcyA9IFwiZmFsIFwiICsgZmlsZVR5cGVDbGFzcztcblxuXHRcdFx0XHRyZXR1cm4gZmlsZVR5cGVDbGFzcztcblx0XHRcdH0sXG5cblx0XHRcdGdldEZpbGVNb2RpZmljYXRpb25EYXRlOiAoKSA9PiBtb21lbnQudW5peCh0aGlzLm1vZGVsLmdldChcInVwZGF0ZWREYXRlXCIpIHx8IHRoaXMubW9kZWwuZ2V0KFwiY3JlYXRlZFwiKSkuZm9ybWF0KFwiRCBNTU0gWVlZWVwiKSxcblxuXHRcdFx0Z2V0RmlsZU5hbWU6ICgpID0+IHRoaXMubW9kZWwuZ2V0KFwiZmlsZW5hbWVcIiksXG5cblx0XHRcdGdldEZpbGVTaXplOiAoKSA9PiB7XG5cdFx0XHRcdGxldCByZXN1bHQgPSBcIjAgYnl0ZXNcIjtcblx0XHRcdFx0Y29uc3QgZmlsZVNpemVJbkJ5dGVzID0gdGhpcy5tb2RlbC5nZXQoXCJzaXplXCIpO1xuXG5cdFx0XHRcdGlmIChmaWxlU2l6ZUluQnl0ZXMgJiYgZmlsZVNpemVJbkJ5dGVzID4gMCkge1xuXHRcdFx0XHRcdGNvbnN0IG9yZGVyID0gMWUzO1xuXHRcdFx0XHRcdGNvbnN0IHVuaXRzID0gW1wiYnl0ZXNcIiwgXCJLQlwiLCBcIk1CXCIsIFwiR0JcIiwgXCJUQlwiLCBcIlBCXCIsIFwiRUJcIiwgXCJaQlwiLCBcIllCXCJdO1xuXHRcdFx0XHRcdGNvbnN0IHggPSBNYXRoLmZsb29yKE1hdGgubG9nKGZpbGVTaXplSW5CeXRlcykgLyBNYXRoLmxvZyhvcmRlcikpO1xuXG5cdFx0XHRcdFx0cmVzdWx0ID0gcGFyc2VGbG9hdCgoZmlsZVNpemVJbkJ5dGVzIC8gTWF0aC5wb3cob3JkZXIsIHgpKS50b0ZpeGVkKDIpKSArIFwiIFwiICsgdW5pdHNbeF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fSxcblxuXHRcdFx0aXNEb3dubG9hZGFibGU6ICgpID0+ICFfLmlzTmlsKHRoaXMubW9kZWwpLFxuXG5cdFx0XHRpc0ltYWdlOiAoKSA9PiB0aGlzLmlzSW1hZ2UoKSxcblx0XHR9O1xuXHR9LFxuXG5cdGlzSW1hZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiAhXy5pc05pbCh0aGlzLm1vZGVsKSAmJiB0aGlzLm1vZGVsLmdldChcImNhdGVnb3J5XCIpID09PSBcImltYWdlXCI7XG5cdH0sXG5cblx0Z2V0RG93bmxvYWRMaW5rOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvcmVzb3VyY2VzL1wiICsgdGhpcy5tb2RlbC5nZXQoXCJfaWRcIikgKyBcIi9kYXRhXCI7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLnVpLmRvd25sb2FkTGluaylcblx0XHRcdHRoaXMudWkuZG93bmxvYWRMaW5rLm9uKFwiY2xpY2tcIiwgdGhpcy5vbkRvd25sb2FkTGlua0NsaWNrLmJpbmQodGhpcykpO1xuXG5cdFx0aWYgKHRoaXMuaXNJbWFnZSgpKVxuXHRcdFx0dGhpcy5sb2FkSW1hZ2UoKTtcblx0fSxcblxuXHRvbkJ1dHRvbkRvd25sb2FkQ2xpY2s6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHR3aW5kb3cub3Blbih0aGlzLmdldERvd25sb2FkTGluaygpLCBcIl9uZXdcIik7XG5cdH0sXG5cblx0b25Eb3dubG9hZExpbmtDbGljazogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0fSxcblxuXHRsb2FkSW1hZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkuaW1hZ2VUaHVtYm5haWwuZ2V0KDApLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsICgpID0+IHtcblx0XHRcdHRoaXMudWkuaW1hZ2VUaHVtYm5haWwuY3NzKHtcblx0XHRcdFx0aGVpZ2h0OiB0aGlzLiRlbC5oZWlnaHQoKSAtIElNQUdFX1RIVU1CTkFJTF9CT1JERVJfU0laRSAqIDIsXG5cdFx0XHRcdFwibWF4LWhlaWdodFwiOiB0aGlzLiRlbC5oZWlnaHQoKSAtIElNQUdFX1RIVU1CTkFJTF9CT1JERVJfU0laRSAqIDIsXG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy51aS5pbWFnZS5jc3Moe1xuXHRcdFx0XHR3aWR0aDogdGhpcy51aS5pbWFnZVRodW1ibmFpbC53aWR0aCgpICsgSU1BR0VfVEhVTUJOQUlMX0JPUkRFUl9TSVpFICogMixcblx0XHRcdFx0XCJtaW4td2lkdGhcIjogdGhpcy51aS5pbWFnZVRodW1ibmFpbC53aWR0aCgpICsgSU1BR0VfVEhVTUJOQUlMX0JPUkRFUl9TSVpFICogMixcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy51aS5pbWFnZVRodW1ibmFpbC5jc3Moe1xuXHRcdFx0aGVpZ2h0OiBcIjBweFwiLFxuXHRcdFx0XCJtYXgtaGVpZ2h0XCI6IFwiMHB4XCIsXG5cdFx0fSk7XG5cblx0XHR0aGlzLnVpLmltYWdlVGh1bWJuYWlsLmdldCgwKS5zcmMgPSB0aGlzLmdldERvd25sb2FkTGluaygpO1xuXHR9LFxufSk7XG5cbmNvbnN0IEZpbGVEaXNwbGF5ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJkcmFnLWRyb3AtZmlsZS1kaXNwbGF5XCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9kcmFnRHJvcEZpbGVDaG9vc2VyLm51bmpcIikuZmlsZURpc3BsYXksXG5cblx0dWk6IHtcblx0XHRpbWFnZTogXCI+IC5kZGZjLWltYWdlXCIsXG5cdFx0aW1hZ2VUaHVtYm5haWw6IFwiPiAuZGRmYy1pbWFnZSA+IC5kZGZjLWltYWdlLXRodW1ibmFpbFwiLFxuXHR9LFxuXG5cdHRlbXBsYXRlQ29udGV4dDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGdldEZpbGVUeXBlQ2xhc3M6ICgpID0+IHtcblx0XHRcdFx0bGV0IGZpbGVUeXBlQ2xhc3M7XG5cblx0XHRcdFx0c3dpdGNoICh0aGlzLmdldEZpbGVFeHRlbnNpb24oKSkge1xuXHRcdFx0XHRcdC8vIEF1ZGlvXG5cdFx0XHRcdFx0Y2FzZSBcIm1wM1wiOlxuXHRcdFx0XHRcdFx0ZmlsZVR5cGVDbGFzcyA9IFwiZmEtZmlsZS1hdWRpb1wiO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHQvLyBFeGNlbFxuXHRcdFx0XHRcdGNhc2UgXCJ4bHNcIjpcblx0XHRcdFx0XHRjYXNlIFwieGxzeFwiOlxuXHRcdFx0XHRcdFx0ZmlsZVR5cGVDbGFzcyA9IFwiZmEtZmlsZS1leGNlbFwiO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHQvLyBGbGFzaGNhcmQgRGVja1xuXHRcdFx0XHRcdGNhc2UgXCJjc3ZcIjpcblx0XHRcdFx0XHRcdGZpbGVUeXBlQ2xhc3MgPSBcImZhLWNsb25lXCI7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdC8vIEltYWdlXG5cdFx0XHRcdFx0Y2FzZSBcImpwZ1wiOlxuXHRcdFx0XHRcdGNhc2UgXCJqcGVnXCI6XG5cdFx0XHRcdFx0Y2FzZSBcInBuZ1wiOlxuXHRcdFx0XHRcdGNhc2UgXCJnaWZcIjpcblx0XHRcdFx0XHRcdGZpbGVUeXBlQ2xhc3MgPSBcImZhLWltYWdlXCI7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdC8vIFBERlxuXHRcdFx0XHRcdGNhc2UgXCJwZGZcIjpcblx0XHRcdFx0XHRcdGZpbGVUeXBlQ2xhc3MgPSBcImZhLWZpbGUtcGRmXCI7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdC8vIFBvd2VycG9pbnRcblx0XHRcdFx0XHRjYXNlIFwicHB0XCI6XG5cdFx0XHRcdFx0Y2FzZSBcInBwdHhcIjpcblx0XHRcdFx0XHRjYXNlIFwicHBzXCI6XG5cdFx0XHRcdFx0Y2FzZSBcInBwc3hcIjpcblx0XHRcdFx0XHRcdGZpbGVUeXBlQ2xhc3MgPSBcImZhLWZpbGUtcG93ZXJwb2ludFwiO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHQvLyBWaWRlb1xuXHRcdFx0XHRcdGNhc2UgXCJtcDRcIjpcblx0XHRcdFx0XHRcdGZpbGVUeXBlQ2xhc3MgPSBcImZhLXZpZGVvLWNhbWVyYVwiO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHQvLyBXb3JkXG5cdFx0XHRcdFx0Y2FzZSBcImRvY1wiOlxuXHRcdFx0XHRcdGNhc2UgXCJkb2N4XCI6XG5cdFx0XHRcdFx0XHRmaWxlVHlwZUNsYXNzID0gXCJmYS1maWxlLXdvcmRcIjtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdGZpbGVUeXBlQ2xhc3MgPSBcIlwiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHNldHRpbmdzLmNvbnRlbnRJY29ucyA9PT0gXCJpbWdcIilcblx0XHRcdFx0XHRmaWxlVHlwZUNsYXNzID0gXCJpbWctXCIgKyBmaWxlVHlwZUNsYXNzO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0ZmlsZVR5cGVDbGFzcyA9IFwiZmFsIFwiICsgZmlsZVR5cGVDbGFzcztcblxuXHRcdFx0XHRyZXR1cm4gZmlsZVR5cGVDbGFzcztcblx0XHRcdH0sXG5cblx0XHRcdGdldEZpbGVNb2RpZmljYXRpb25EYXRlOiAoKSA9PiBtb21lbnQodGhpcy5vcHRpb25zLmZpbGUubGFzdE1vZGlmaWVkKS5mb3JtYXQoXCJEIE1NTSBZWVlZXCIpLFxuXG5cdFx0XHRnZXRGaWxlTmFtZTogKCkgPT4gdGhpcy5vcHRpb25zLmZpbGUubmFtZSxcblxuXHRcdFx0Z2V0RmlsZVNpemU6ICgpID0+IHtcblx0XHRcdFx0bGV0IHJlc3VsdCA9IFwiMCBieXRlc1wiO1xuXHRcdFx0XHRjb25zdCBmaWxlU2l6ZUluQnl0ZXMgPSB0aGlzLm9wdGlvbnMuZmlsZS5zaXplO1xuXG5cdFx0XHRcdGlmIChmaWxlU2l6ZUluQnl0ZXMgJiYgZmlsZVNpemVJbkJ5dGVzID4gMCkge1xuXHRcdFx0XHRcdGNvbnN0IG9yZGVyID0gMWUzO1xuXHRcdFx0XHRcdGNvbnN0IHVuaXRzID0gW1wiYnl0ZXNcIiwgXCJLQlwiLCBcIk1CXCIsIFwiR0JcIiwgXCJUQlwiLCBcIlBCXCIsIFwiRUJcIiwgXCJaQlwiLCBcIllCXCJdO1xuXHRcdFx0XHRcdGNvbnN0IHggPSBNYXRoLmZsb29yKE1hdGgubG9nKGZpbGVTaXplSW5CeXRlcykgLyBNYXRoLmxvZyhvcmRlcikpO1xuXG5cdFx0XHRcdFx0cmVzdWx0ID0gcGFyc2VGbG9hdCgoZmlsZVNpemVJbkJ5dGVzIC8gTWF0aC5wb3cob3JkZXIsIHgpKS50b0ZpeGVkKDIpKSArIFwiIFwiICsgdW5pdHNbeF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0fSxcblxuXHRcdFx0aXNEb3dubG9hZGFibGU6ICgpID0+ICFfLmlzTmlsKHRoaXMubW9kZWwpLFxuXG5cdFx0XHRpc0ltYWdlOiAoKSA9PiB0aGlzLmlzSW1hZ2UoKSxcblx0XHR9O1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXHR9LFxuXG5cdGdldEZpbGVFeHRlbnNpb246IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGV4dGVuc2lvbiA9IF8uaXNOaWwodGhpcy5vcHRpb25zLmZpbGUubmFtZSkgPyBcIlwiIDogdGhpcy5vcHRpb25zLmZpbGUubmFtZS50b0xvd2VyQ2FzZSgpLnNwbGl0KFwiLlwiKTtcblx0XHRyZXR1cm4gZXh0ZW5zaW9uLmxlbmd0aCA9PT0gMCA/IFwiXCIgOiBleHRlbnNpb25bZXh0ZW5zaW9uLmxlbmd0aCAtIDFdO1xuXHR9LFxuXG5cdGlzSW1hZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBfLmluY2x1ZGVzKFtcImpwZ1wiLCBcImpwZWdcIiwgXCJwbmdcIiwgXCJnaWZcIl0sIHRoaXMuZ2V0RmlsZUV4dGVuc2lvbigpKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuaXNJbWFnZSgpKVxuXHRcdFx0dGhpcy5sb2FkSW1hZ2UoKTtcblx0fSxcblxuXHRsb2FkSW1hZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cblx0XHRyZWFkZXIuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgZSA9PiB7XG5cdFx0XHR0aGlzLnVpLmltYWdlVGh1bWJuYWlsLmNzcyh7XG5cdFx0XHRcdGhlaWdodDogdGhpcy4kZWwuaGVpZ2h0KCkgLSBJTUFHRV9USFVNQk5BSUxfQk9SREVSX1NJWkUgKiAyLFxuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMudWkuaW1hZ2VUaHVtYm5haWwuZ2V0KDApLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsICgpID0+IHtcblx0XHRcdFx0dGhpcy51aS5pbWFnZS5jc3Moe1xuXHRcdFx0XHRcdHdpZHRoOiB0aGlzLnVpLmltYWdlVGh1bWJuYWlsLndpZHRoKCkgKyBJTUFHRV9USFVNQk5BSUxfQk9SREVSX1NJWkUgKiAyLFxuXHRcdFx0XHRcdFwibWluLXdpZHRoXCI6IHRoaXMudWkuaW1hZ2VUaHVtYm5haWwud2lkdGgoKSArIElNQUdFX1RIVU1CTkFJTF9CT1JERVJfU0laRSAqIDIsXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMudWkuaW1hZ2VUaHVtYm5haWwuZ2V0KDApLnNyYyA9IGUudGFyZ2V0LnJlc3VsdDtcblx0XHR9KTtcblxuXHRcdHJlYWRlci5yZWFkQXNEYXRhVVJMKHRoaXMub3B0aW9ucy5maWxlKTtcblx0fSxcbn0pO1xuXG5jb25zdCBGaWxlc0Rpc3BsYXkgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImRyYWctZHJvcC1maWxlLWRpc3BsYXlcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4vdGVtcGxhdGVzL2RyYWdEcm9wRmlsZUNob29zZXIubnVualwiKS5maWxlc0Rpc3BsYXksXG5cblx0dWk6IHtcblx0XHRpbWFnZTogXCI+IC5kZGZjLWltYWdlXCIsXG5cdFx0aW1hZ2VUaHVtYm5haWw6IFwiPiAuZGRmYy1pbWFnZSA+IC5kZGZjLWltYWdlLXRodW1ibmFpbFwiLFxuXHR9LFxuXG5cdHRlbXBsYXRlQ29udGV4dDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGdldEZpbGVNb2RpZmljYXRpb25EYXRlOiAoKSA9PiBtb21lbnQodGhpcy5vcHRpb25zLmZpbGUubGFzdE1vZGlmaWVkKS5mb3JtYXQoXCJEIE1NTSBZWVlZXCIpLFxuXG5cdFx0XHRnZXRGaWxlczogKCkgPT4gdGhpcy5vcHRpb25zLmZpbGVzLFxuXG5cdFx0XHRnZXRGaWxlU2l6ZTogKCkgPT4ge1xuXHRcdFx0XHRsZXQgcmVzdWx0ID0gXCIwIGJ5dGVzXCI7XG5cdFx0XHRcdGNvbnN0IGZpbGVTaXplSW5CeXRlcyA9IHRoaXMub3B0aW9ucy5maWxlLnNpemU7XG5cblx0XHRcdFx0aWYgKGZpbGVTaXplSW5CeXRlcyAmJiBmaWxlU2l6ZUluQnl0ZXMgPiAwKSB7XG5cdFx0XHRcdFx0Y29uc3Qgb3JkZXIgPSAxZTM7XG5cdFx0XHRcdFx0Y29uc3QgdW5pdHMgPSBbXCJieXRlc1wiLCBcIktCXCIsIFwiTUJcIiwgXCJHQlwiLCBcIlRCXCIsIFwiUEJcIiwgXCJFQlwiLCBcIlpCXCIsIFwiWUJcIl07XG5cdFx0XHRcdFx0Y29uc3QgeCA9IE1hdGguZmxvb3IoTWF0aC5sb2coZmlsZVNpemVJbkJ5dGVzKSAvIE1hdGgubG9nKG9yZGVyKSk7XG5cblx0XHRcdFx0XHRyZXN1bHQgPSBwYXJzZUZsb2F0KChmaWxlU2l6ZUluQnl0ZXMgLyBNYXRoLnBvdyhvcmRlciwgeCkpLnRvRml4ZWQoMikpICsgXCIgXCIgKyB1bml0c1t4XTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHR9LFxuXG5cdFx0XHRpc0Rvd25sb2FkYWJsZTogKCkgPT4gIV8uaXNOaWwodGhpcy5tb2RlbCksXG5cdFx0fTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucztcblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZHJhZy1kcm9wLWZpbGUtY2hvb3NlciBkZGZjLWVkaXRhYmxlXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9kcmFnRHJvcEZpbGVDaG9vc2VyLm51bmpcIikubGF5b3V0LFxuXG5cdHJlZ2lvbnM6IHtcblx0XHRkaXNwbGF5OiBcIj4gLmRkZmMtZGlzcGxheS1yZWdpb25cIixcblx0fSxcblxuXHR1aToge1xuXHRcdGZpbGVJbnB1dDogXCI+IC5kZGZjLWZpbGUtaW5wdXRcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRjbGljazogXCJvbkNsaWNrXCIsXG5cdFx0ZHJvcDogXCJvbkRyb3BcIixcblx0XHRkcmFnZW50ZXI6IFwib25EcmFnXCIsXG5cdFx0ZHJhZ292ZXI6IFwib25EcmFnXCIsXG5cblx0XHRcImNoYW5nZSBAdWkuZmlsZUlucHV0XCI6IFwib25GaWxlSW5wdXRDaGFuZ2VcIixcblx0XHRcImNsaWNrIEB1aS5maWxlSW5wdXRcIjogXCJvbkZpbGVJbnB1dENsaWNrXCIsXG5cdH0sXG5cblx0dGVtcGxhdGVDb250ZXh0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0Z2V0QWNjZXB0ZWRGaWxlVHlwZXM6ICgpID0+IChfLmlzQXJyYXkodGhpcy5vcHRpb25zLmFjY2VwdGVkRmlsZVR5cGVzKSA/IHRoaXMub3B0aW9ucy5hY2NlcHRlZEZpbGVUeXBlcy5qb2luKFwiLFwiKSA6IHVuZGVmaW5lZCksXG5cdFx0fTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0Ly8gT3B0aW9uc1xuXHRcdC8vICAgYWNjZXB0ZWRGaWxlVHlwZXM6IEFuIGFycmF5IG9mIGZpbGUgZXh0ZW5zaW9ucyBhbmQvb3IgTUlNRSB0eXBlcyB0aGF0IHRoZSBmaWxlIGNob29zZXIgd2lsbCBhY2NlcHQuXG5cdFx0Ly8gICBkaXNwbGF5VGV4dDogUHJvdmlkZSBhIHN0cmluZyB0aGF0IHdpbGwgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdGV4dCBpbiB0aGUgdGVtcGxhdGUuXG5cdFx0Ly8gICBleGlzdGluZ0ZpbGU6IFByb3ZpZGUgYSByZWZlcmVuY2UgdG8gYSByZXNvdXJjZSBtb2RlbCB0byBtYWtlIHRoZSByZXNvdXJjZSdzIGFzc29jaWF0ZWQgZmlsZSBhdmFpbGFibGVcblx0XHQvLyAgICAgZm9yIGRvd25sb2FkLlxuXHRcdC8vICAgaGVpZ2h0OiBBbiBvcHRpb25hbCBpbnRlZ2VyIHRvIHNldCB0aGUgZGVzaXJlZCBoZWlnaHQgb2YgdGhlIGNob29zZXIgKGZvciBpbWFnZSBwcmV2aWV3cykuXG5cdFx0Ly8gICBsb2NrZWQ6IEEgYm9vbGVhbiB2YWx1ZS4gU2V0IHRvIHRydWUgdG8gcHJldmVudCB0aGUgdXNlciBmcm9tIGNob29zaW5nIGEgbmV3IGZpbGUgaWYgYGV4aXN0aW5nRmlsZWAgaXMgc2V0LlxuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cblx0XHR0aGlzLm9uKFwic2VsZWN0ZWRcIiwgdGhpcy5zaG93RmlsZS5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zaG93RGVmYXVsdFZpZXcoKTtcblxuXHRcdGlmICh0aGlzLmlzTG9ja2VkKCkpXG5cdFx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyhcImRkZmMtZWRpdGFibGVcIik7XG5cblx0XHR0aGlzLiRlbC5jc3MoeyBoZWlnaHQ6IHRoaXMub3B0aW9ucy5oZWlnaHQgfHwgREVGQVVMVF9IRUlHSFQgfSk7XG5cblx0XHRpZiAodGhpcy5vcHRpb25zLm11bHRpcGxlKVxuXHRcdFx0dGhpcy51aS5maWxlSW5wdXQuYXR0cihcIm11bHRpcGxlXCIsIHRydWUpO1xuXHR9LFxuXG5cdGZsYXNoTG9ja2VkOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJkaXNwbGF5XCIsIG5ldyBMb2NrZWREaXNwbGF5KCkpO1xuXG5cdFx0c2V0VGltZW91dCh0aGlzLnNob3dEZWZhdWx0Vmlldy5iaW5kKHRoaXMpLCBGQUlMRURfRFJBR19NRVNTQUdFX0RJU1BMQVlfRFVSQVRJT04pO1xuXHR9LFxuXG5cdGZsYXNoSW52YWxpZERyYWc6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImRpc3BsYXlcIiwgbmV3IEludmFsaWREcmFnRGlzcGxheSgpKTtcblxuXHRcdHNldFRpbWVvdXQodGhpcy5zaG93RGVmYXVsdFZpZXcuYmluZCh0aGlzKSwgRkFJTEVEX0RSQUdfTUVTU0FHRV9ESVNQTEFZX0RVUkFUSU9OKTtcblx0fSxcblxuXHRpc0xvY2tlZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMub3B0aW9ucy5leGlzdGluZ0ZpbGUgJiYgdGhpcy5vcHRpb25zLmxvY2tlZDtcblx0fSxcblxuXHRzZWxlY3RGaWxlOiBmdW5jdGlvbihmaWxlKSB7XG5cdFx0dGhpcy5zZWxlY3RlZEZpbGUgPSBmaWxlO1xuXHRcdHRoaXMudHJpZ2dlcihcInNlbGVjdGVkXCIsIGZpbGUpO1xuXHR9LFxuXG5cdHNlbGVjdEZpbGVzOiBmdW5jdGlvbihmaWxlcykge1xuXHRcdHRoaXMuc2VsZWN0ZWRGaWxlcyA9IGZpbGVzO1xuXHRcdHRoaXMudHJpZ2dlcihcInNlbGVjdGVkXCIsIGZpbGVzKTtcblx0fSxcblxuXHRzaG93RGVmYXVsdFZpZXc6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLm9wdGlvbnMuZXhpc3RpbmdGaWxlKVxuXHRcdFx0dGhpcy5zaG93RG93bmxvYWQoKTtcblx0XHRlbHNlIGlmICh0aGlzLnNlbGVjdGVkRmlsZSlcblx0XHRcdHRoaXMuc2hvd0ZpbGUodGhpcy5zZWxlY3RlZEZpbGUpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuc2hvd1Byb21wdCgpO1xuXHR9LFxuXG5cdHNob3dEb3dubG9hZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiZGlzcGxheVwiLCBuZXcgRG93bmxvYWREaXNwbGF5KHsgbW9kZWw6IHRoaXMub3B0aW9ucy5leGlzdGluZ0ZpbGUgfSkpO1xuXHR9LFxuXG5cdHNob3dGaWxlOiBmdW5jdGlvbihmaWxlKSB7XG5cdFx0aWYgKHRoaXMub3B0aW9ucy5tdWx0aXBsZSlcblx0XHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImRpc3BsYXlcIiwgbmV3IEZpbGVzRGlzcGxheSh7IGZpbGVzOiBmaWxlIH0pKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJkaXNwbGF5XCIsIG5ldyBGaWxlRGlzcGxheSh7IGZpbGUgfSkpO1xuXHR9LFxuXG5cdHNob3dQcm9tcHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImRpc3BsYXlcIiwgbmV3IExhYmVsRGlzcGxheSh7IGRpc3BsYXlUZXh0OiB0aGlzLm9wdGlvbnMuZGlzcGxheVRleHQgfSkpO1xuXHR9LFxuXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFJvb3Rcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRvbkNsaWNrOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0aWYgKCF0aGlzLmlzTG9ja2VkKCkpXG5cdFx0XHR0aGlzLnVpLmZpbGVJbnB1dC5jbGljaygpO1xuXHR9LFxuXG5cdG9uRHJhZzogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdGV2ZW50Lm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSBcImNvcHlcIjtcblx0fSxcblxuXHRleHRyYWN0RmlsZUZyb21FdmVudDogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRsZXQgZmlsZTtcblx0XHRjb25zdCBmaWxlTGlzdCA9IF8uaXNOaWwoZXZlbnQub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXIuaXRlbXMpID8gZXZlbnQub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXIuZmlsZXMgOiBldmVudC5vcmlnaW5hbEV2ZW50LmRhdGFUcmFuc2Zlci5pdGVtcztcblxuXHRcdGlmIChmaWxlTGlzdC5sZW5ndGggPj0gMSkge1xuXHRcdFx0aWYgKF8uaXNGdW5jdGlvbihmaWxlTGlzdC5pdGVtKSkge1xuXHRcdFx0XHRmaWxlID0gZmlsZUxpc3QuaXRlbSgwKTtcblxuXHRcdFx0XHRpZiAoKF8uaXNOaWwoZmlsZSkgfHwgXy5pc05pbChmaWxlLm5hbWUpKSAmJiAhXy5pc05pbChldmVudC5vcmlnaW5hbEV2ZW50LmRhdGFUcmFuc2Zlci5pdGVtcykpXG5cdFx0XHRcdFx0ZmlsZSA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLml0ZW1zWzBdLmtpbmQgPT09IFwiZmlsZVwiID8gZXZlbnQub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXIuaXRlbXNbMF0uZ2V0QXNGaWxlKCkgOiBudWxsO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdGZpbGUgPSBmaWxlTGlzdFswXS5raW5kID09PSBcImZpbGVcIiA/IGZpbGVMaXN0WzBdLmdldEFzRmlsZSgpIDogbnVsbDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmlsZTtcblx0fSxcblxuXHRpc0ZpbGVBY2NlcHRhYmxlOiBmdW5jdGlvbihmaWxlKSB7XG5cdFx0bGV0IHJlc3VsdCA9IGZhbHNlO1xuXG5cdFx0aWYgKCFfLmlzTmlsKGZpbGUpKSB7XG5cdFx0XHRjb25zdCBmaWxlRXh0ZW5zaW9uID0gXy50cmltU3RhcnQodGhpcy5leHRyYWN0RmlsZUV4dGVuc2lvbihmaWxlKSwgXCIuXCIpO1xuXHRcdFx0Y29uc3QgYWNjZXB0ZWRGaWxlVHlwZXMgPSBfLm1hcCh0aGlzLm9wdGlvbnMuYWNjZXB0ZWRGaWxlVHlwZXMsIGZpbGVUeXBlID0+IF8udHJpbVN0YXJ0KGZpbGVUeXBlLCBcIi5cIikpO1xuXG5cdFx0XHRyZXN1bHQgPSBfLmluY2x1ZGVzKGFjY2VwdGVkRmlsZVR5cGVzLCBmaWxlLnR5cGUpIHx8IF8uaW5jbHVkZXMoYWNjZXB0ZWRGaWxlVHlwZXMsIGZpbGVFeHRlbnNpb24pO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG5cblx0ZXh0cmFjdEZpbGVFeHRlbnNpb246IGZ1bmN0aW9uKGZpbGUpIHtcblx0XHRjb25zdCBleHRlbnNpb24gPSBfLmlzTmlsKGZpbGUubmFtZSkgPyBcIlwiIDogZmlsZS5uYW1lLnRvTG93ZXJDYXNlKCkuc3BsaXQoXCIuXCIpO1xuXHRcdHJldHVybiBleHRlbnNpb24ubGVuZ3RoID09PSAwID8gXCJcIiA6IGV4dGVuc2lvbltleHRlbnNpb24ubGVuZ3RoIC0gMV07XG5cdH0sXG5cblx0b25Ecm9wOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRpZiAodGhpcy5vcHRpb25zLm11bHRpcGxlKSB7XG5cdFx0XHRpZiAoIXRoaXMuYnVsa0RyYWdEcm9wSGVscGVyKVxuXHRcdFx0XHR0aGlzLmJ1bGtEcmFnRHJvcEhlbHBlciA9IG5ldyBCdWxrRHJhZ0Ryb3BIZWxwZXIoKTtcblx0XHRcdGNvbnN0IGZpbGVzID0gXy5maWx0ZXIodGhpcy5idWxrRHJhZ0Ryb3BIZWxwZXIuZXh0cmFjdEZpbGVzRnJvbUV2ZW50KGV2ZW50KSwgZiA9PiBmICE9PSBudWxsICYmIHRoaXMuaXNGaWxlQWNjZXB0YWJsZShmKSk7XG5cdFx0XHR0aGlzLnNlbGVjdEZpbGVzKGZpbGVzKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRjb25zdCBmaWxlID0gdGhpcy5leHRyYWN0RmlsZUZyb21FdmVudChldmVudCk7XG5cblx0XHRcdGlmICh0aGlzLmlzTG9ja2VkKCkpXG5cdFx0XHRcdHRoaXMuZmxhc2hMb2NrZWQoKTtcblx0XHRcdGVsc2UgaWYgKHRoaXMuaXNGaWxlQWNjZXB0YWJsZShmaWxlKSlcblx0XHRcdFx0dGhpcy5zZWxlY3RGaWxlKGZpbGUpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLmZsYXNoSW52YWxpZERyYWcoKTtcblx0XHR9XG5cdH0sXG5cblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gRmlsZSBJbnB1dFxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdG9uRmlsZUlucHV0Q2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy51aS5maWxlSW5wdXQuZ2V0KDApLmZpbGVzWzBdICYmICF0aGlzLm9wdGlvbnMubXVsdGlwbGUpXG5cdFx0XHR0aGlzLnNlbGVjdEZpbGUodGhpcy51aS5maWxlSW5wdXQuZ2V0KDApLmZpbGVzWzBdKTtcblx0XHRlbHNlIGlmICh0aGlzLnVpLmZpbGVJbnB1dC5nZXQoMCkuZmlsZXMubGVuZ3RoID4gMCAmJiB0aGlzLm9wdGlvbnMubXVsdGlwbGUpXG5cdFx0XHR0aGlzLnNlbGVjdEZpbGVzKHRoaXMudWkuZmlsZUlucHV0LmdldCgwKS5maWxlcyk7XG5cdH0sXG5cblx0b25GaWxlSW5wdXRDbGljazogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0fSxcbn0pO1xuIl19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar tippy = require(\"tippy.js\").default;\n\nvar Errors = require(\"./errors.js\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"error-view\",\n\n\ttemplate: require(\"./templates/errorView.nunj\").layout,\n\n\tui: {\n\t\tbuttonClose: \".close-button\",\n\t\terrorDetailsButton: \".error-details-button\",\n\t\tbuttonSelfHelp: \".self-help-button\",\n\t\tbuttonDetails: \".details-button\",\n\t\terrorDetailsPanel: \".error-details-panel\",\n\t\tselfHelp: \".self-help\",\n\t\terrorDetails: \".error-details\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonClose\": \"onButtonCloseClick\",\n\t\t\"click @ui.errorDetailsButton\": \"onErrorDetailsButtonClick\",\n\t\t\"click @ui.buttonSelfHelp\": \"onButtonSelfHelpClick\",\n\t\t\"click @ui.buttonDetails\": \"onButtonDetailsClick\"\n\t},\n\n\tserializeData: function serializeData() {\n\t\treturn this.model.toJSON({ computed: true });\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\n\t\tif (this.model) {\n\t\t\tthis.model.set(\"status\", this.model.get(\"response\").status);\n\t\t} else {\n\t\t\tthis.model = new Errors.Model(options.fetchError);\n\t\t\tthis.model.set(\"message\", \"An error occurred while communicating with the server. Click on one of the options below to find out more or refresh the page to try again.\");\n\t\t}\n\t},\n\n\tonRender: function onRender() {\n\t\tif (this.options.closeButton) {\n\t\t\ttippy(this.ui.buttonClose.get(0), {\n\t\t\t\ttheme: \"black\",\n\t\t\t\tplacement: \"bottom\",\n\t\t\t\tarrow: true,\n\t\t\t\tdelay: 0,\n\t\t\t\tcontent: this.ui.buttonClose.get(0).title\n\t\t\t});\n\t\t\tthis.ui.buttonClose.get(0).title = \"\";\n\n\t\t\tthis.ui.buttonClose.removeClass(\"hide\");\n\t\t}\n\t},\n\n\tonButtonCloseClick: function onButtonCloseClick() {\n\t\tthis.trigger(\"error:close\");\n\t},\n\n\tonErrorDetailsButtonClick: function onErrorDetailsButtonClick() {\n\t\tthis.ui.errorDetailsButton.removeClass(\"error-details-button-selected\");\n\t\tthis.ui.errorDetailsPanel.addClass(\"hide\");\n\t},\n\n\tonButtonSelfHelpClick: function onButtonSelfHelpClick() {\n\t\tthis.ui.buttonSelfHelp.addClass(\"error-details-button-selected\");\n\t\tthis.ui.selfHelp.removeClass(\"hide\");\n\t},\n\n\tonButtonDetailsClick: function onButtonDetailsClick() {\n\t\tthis.ui.buttonDetails.addClass(\"error-details-button-selected\");\n\t\tthis.ui.errorDetails.removeClass(\"hide\");\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVycm9yVmlldy5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCJ0aXBweSIsImRlZmF1bHQiLCJFcnJvcnMiLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJleHRlbmQiLCJ0YWdOYW1lIiwiY2xhc3NOYW1lIiwidGVtcGxhdGUiLCJsYXlvdXQiLCJ1aSIsImJ1dHRvbkNsb3NlIiwiZXJyb3JEZXRhaWxzQnV0dG9uIiwiYnV0dG9uU2VsZkhlbHAiLCJidXR0b25EZXRhaWxzIiwiZXJyb3JEZXRhaWxzUGFuZWwiLCJzZWxmSGVscCIsImVycm9yRGV0YWlscyIsImV2ZW50cyIsInNlcmlhbGl6ZURhdGEiLCJtb2RlbCIsInRvSlNPTiIsImNvbXB1dGVkIiwiaW5pdGlhbGl6ZSIsIm9wdGlvbnMiLCJzZXQiLCJnZXQiLCJzdGF0dXMiLCJNb2RlbCIsImZldGNoRXJyb3IiLCJvblJlbmRlciIsImNsb3NlQnV0dG9uIiwidGhlbWUiLCJwbGFjZW1lbnQiLCJhcnJvdyIsImRlbGF5IiwiY29udGVudCIsInRpdGxlIiwicmVtb3ZlQ2xhc3MiLCJvbkJ1dHRvbkNsb3NlQ2xpY2siLCJ0cmlnZ2VyIiwib25FcnJvckRldGFpbHNCdXR0b25DbGljayIsImFkZENsYXNzIiwib25CdXR0b25TZWxmSGVscENsaWNrIiwib25CdXR0b25EZXRhaWxzQ2xpY2siXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1DLFFBQVFELFFBQVEsVUFBUixFQUFvQkUsT0FBbEM7O0FBRUEsSUFBTUMsU0FBU0gsUUFBUSxhQUFSLENBQWY7O0FBRUFJLE9BQU9DLE9BQVAsR0FBaUJOLFNBQVNPLFVBQVQsQ0FBb0JDLElBQXBCLENBQXlCQyxNQUF6QixDQUFnQztBQUNoREMsVUFBUyxLQUR1QztBQUVoREMsWUFBVyxZQUZxQzs7QUFJaERDLFdBQVVYLFFBQVEsNEJBQVIsRUFBc0NZLE1BSkE7O0FBTWhEQyxLQUFJO0FBQ0hDLGVBQWEsZUFEVjtBQUVIQyxzQkFBb0IsdUJBRmpCO0FBR0hDLGtCQUFnQixtQkFIYjtBQUlIQyxpQkFBZSxpQkFKWjtBQUtIQyxxQkFBbUIsc0JBTGhCO0FBTUhDLFlBQVUsWUFOUDtBQU9IQyxnQkFBYztBQVBYLEVBTjRDOztBQWdCaERDLFNBQVE7QUFDUCwyQkFBeUIsb0JBRGxCO0FBRVAsa0NBQWdDLDJCQUZ6QjtBQUdQLDhCQUE0Qix1QkFIckI7QUFJUCw2QkFBMkI7QUFKcEIsRUFoQndDOztBQXVCaERDLGdCQUFlLHlCQUFXO0FBQ3pCLFNBQU8sS0FBS0MsS0FBTCxDQUFXQyxNQUFYLENBQWtCLEVBQUVDLFVBQVUsSUFBWixFQUFsQixDQUFQO0FBQ0EsRUF6QitDOztBQTJCaERDLGFBQVksb0JBQVNDLE9BQVQsRUFBa0I7QUFDN0IsT0FBS0EsT0FBTCxHQUFlQSxPQUFmOztBQUVBLE1BQUksS0FBS0osS0FBVCxFQUFnQjtBQUNmLFFBQUtBLEtBQUwsQ0FBV0ssR0FBWCxDQUFlLFFBQWYsRUFBeUIsS0FBS0wsS0FBTCxDQUFXTSxHQUFYLENBQWUsVUFBZixFQUEyQkMsTUFBcEQ7QUFDQSxHQUZELE1BR0s7QUFDSixRQUFLUCxLQUFMLEdBQWEsSUFBSXBCLE9BQU80QixLQUFYLENBQWlCSixRQUFRSyxVQUF6QixDQUFiO0FBQ0EsUUFBS1QsS0FBTCxDQUFXSyxHQUFYLENBQWUsU0FBZixFQUEwQiw2SUFBMUI7QUFDQTtBQUNELEVBckMrQzs7QUF1Q2hESyxXQUFVLG9CQUFXO0FBQ3BCLE1BQUksS0FBS04sT0FBTCxDQUFhTyxXQUFqQixFQUE4QjtBQUM3QmpDLFNBQU0sS0FBS1ksRUFBTCxDQUFRQyxXQUFSLENBQW9CZSxHQUFwQixDQUF3QixDQUF4QixDQUFOLEVBQWtDO0FBQ2pDTSxXQUFPLE9BRDBCO0FBRWpDQyxlQUFXLFFBRnNCO0FBR2pDQyxXQUFPLElBSDBCO0FBSWpDQyxXQUFPLENBSjBCO0FBS2pDQyxhQUFTLEtBQUsxQixFQUFMLENBQVFDLFdBQVIsQ0FBb0JlLEdBQXBCLENBQXdCLENBQXhCLEVBQTJCVztBQUxILElBQWxDO0FBT0EsUUFBSzNCLEVBQUwsQ0FBUUMsV0FBUixDQUFvQmUsR0FBcEIsQ0FBd0IsQ0FBeEIsRUFBMkJXLEtBQTNCLEdBQW1DLEVBQW5DOztBQUVBLFFBQUszQixFQUFMLENBQVFDLFdBQVIsQ0FBb0IyQixXQUFwQixDQUFnQyxNQUFoQztBQUNBO0FBQ0QsRUFwRCtDOztBQXNEaERDLHFCQUFvQiw4QkFBVztBQUM5QixPQUFLQyxPQUFMLENBQWEsYUFBYjtBQUNBLEVBeEQrQzs7QUEwRGhEQyw0QkFBMkIscUNBQVc7QUFDckMsT0FBSy9CLEVBQUwsQ0FBUUUsa0JBQVIsQ0FBMkIwQixXQUEzQixDQUF1QywrQkFBdkM7QUFDQSxPQUFLNUIsRUFBTCxDQUFRSyxpQkFBUixDQUEwQjJCLFFBQTFCLENBQW1DLE1BQW5DO0FBQ0EsRUE3RCtDOztBQStEaERDLHdCQUF1QixpQ0FBVztBQUNqQyxPQUFLakMsRUFBTCxDQUFRRyxjQUFSLENBQXVCNkIsUUFBdkIsQ0FBZ0MsK0JBQWhDO0FBQ0EsT0FBS2hDLEVBQUwsQ0FBUU0sUUFBUixDQUFpQnNCLFdBQWpCLENBQTZCLE1BQTdCO0FBQ0EsRUFsRStDOztBQW9FaERNLHVCQUFzQixnQ0FBVztBQUNoQyxPQUFLbEMsRUFBTCxDQUFRSSxhQUFSLENBQXNCNEIsUUFBdEIsQ0FBK0IsK0JBQS9CO0FBQ0EsT0FBS2hDLEVBQUwsQ0FBUU8sWUFBUixDQUFxQnFCLFdBQXJCLENBQWlDLE1BQWpDO0FBQ0E7QUF2RStDLENBQWhDLENBQWpCIiwiZmlsZSI6ImVycm9yVmlldy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCB0aXBweSA9IHJlcXVpcmUoXCJ0aXBweS5qc1wiKS5kZWZhdWx0O1xuXG5jb25zdCBFcnJvcnMgPSByZXF1aXJlKFwiLi9lcnJvcnMuanNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6IFwiZGl2XCIsXG5cdGNsYXNzTmFtZTogXCJlcnJvci12aWV3XCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9lcnJvclZpZXcubnVualwiKS5sYXlvdXQsXG5cblx0dWk6IHtcblx0XHRidXR0b25DbG9zZTogXCIuY2xvc2UtYnV0dG9uXCIsXG5cdFx0ZXJyb3JEZXRhaWxzQnV0dG9uOiBcIi5lcnJvci1kZXRhaWxzLWJ1dHRvblwiLFxuXHRcdGJ1dHRvblNlbGZIZWxwOiBcIi5zZWxmLWhlbHAtYnV0dG9uXCIsXG5cdFx0YnV0dG9uRGV0YWlsczogXCIuZGV0YWlscy1idXR0b25cIixcblx0XHRlcnJvckRldGFpbHNQYW5lbDogXCIuZXJyb3ItZGV0YWlscy1wYW5lbFwiLFxuXHRcdHNlbGZIZWxwOiBcIi5zZWxmLWhlbHBcIixcblx0XHRlcnJvckRldGFpbHM6IFwiLmVycm9yLWRldGFpbHNcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5idXR0b25DbG9zZVwiOiBcIm9uQnV0dG9uQ2xvc2VDbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmVycm9yRGV0YWlsc0J1dHRvblwiOiBcIm9uRXJyb3JEZXRhaWxzQnV0dG9uQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5idXR0b25TZWxmSGVscFwiOiBcIm9uQnV0dG9uU2VsZkhlbHBDbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmJ1dHRvbkRldGFpbHNcIjogXCJvbkJ1dHRvbkRldGFpbHNDbGlja1wiLFxuXHR9LFxuXG5cdHNlcmlhbGl6ZURhdGE6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1vZGVsLnRvSlNPTih7IGNvbXB1dGVkOiB0cnVlIH0pO1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG5cdFx0aWYgKHRoaXMubW9kZWwpIHtcblx0XHRcdHRoaXMubW9kZWwuc2V0KFwic3RhdHVzXCIsIHRoaXMubW9kZWwuZ2V0KFwicmVzcG9uc2VcIikuc3RhdHVzKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLm1vZGVsID0gbmV3IEVycm9ycy5Nb2RlbChvcHRpb25zLmZldGNoRXJyb3IpO1xuXHRcdFx0dGhpcy5tb2RlbC5zZXQoXCJtZXNzYWdlXCIsIFwiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBzZXJ2ZXIuIENsaWNrIG9uIG9uZSBvZiB0aGUgb3B0aW9ucyBiZWxvdyB0byBmaW5kIG91dCBtb3JlIG9yIHJlZnJlc2ggdGhlIHBhZ2UgdG8gdHJ5IGFnYWluLlwiKTtcblx0XHR9XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLm9wdGlvbnMuY2xvc2VCdXR0b24pIHtcblx0XHRcdHRpcHB5KHRoaXMudWkuYnV0dG9uQ2xvc2UuZ2V0KDApLCB7XG5cdFx0XHRcdHRoZW1lOiBcImJsYWNrXCIsXG5cdFx0XHRcdHBsYWNlbWVudDogXCJib3R0b21cIixcblx0XHRcdFx0YXJyb3c6IHRydWUsXG5cdFx0XHRcdGRlbGF5OiAwLFxuXHRcdFx0XHRjb250ZW50OiB0aGlzLnVpLmJ1dHRvbkNsb3NlLmdldCgwKS50aXRsZSxcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy51aS5idXR0b25DbG9zZS5nZXQoMCkudGl0bGUgPSBcIlwiO1xuXG5cdFx0XHR0aGlzLnVpLmJ1dHRvbkNsb3NlLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR9XG5cdH0sXG5cblx0b25CdXR0b25DbG9zZUNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnRyaWdnZXIoXCJlcnJvcjpjbG9zZVwiKTtcblx0fSxcblxuXHRvbkVycm9yRGV0YWlsc0J1dHRvbkNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmVycm9yRGV0YWlsc0J1dHRvbi5yZW1vdmVDbGFzcyhcImVycm9yLWRldGFpbHMtYnV0dG9uLXNlbGVjdGVkXCIpO1xuXHRcdHRoaXMudWkuZXJyb3JEZXRhaWxzUGFuZWwuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdG9uQnV0dG9uU2VsZkhlbHBDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5idXR0b25TZWxmSGVscC5hZGRDbGFzcyhcImVycm9yLWRldGFpbHMtYnV0dG9uLXNlbGVjdGVkXCIpO1xuXHRcdHRoaXMudWkuc2VsZkhlbHAucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdG9uQnV0dG9uRGV0YWlsc0NsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmJ1dHRvbkRldGFpbHMuYWRkQ2xhc3MoXCJlcnJvci1kZXRhaWxzLWJ1dHRvbi1zZWxlY3RlZFwiKTtcblx0XHR0aGlzLnVpLmVycm9yRGV0YWlscy5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdH0sXG59KTtcbiJdfQ==",
    "\"use strict\";\n// ----------------------------------------------------------------------------\n// Dependencies\n// ----------------------------------------------------------------------------\n\nvar Backbone = require(\"backbone\");\n\nvar App = require(\"../index\");\n\n// ----------------------------------------------------------------------------\n// Error Categories\n// ----------------------------------------------------------------------------\nvar Errors = {};\n\n// ----------------------------------------------------------------------------\n// Errors\n// ----------------------------------------------------------------------------\nErrors.Model = Backbone.Epoxy.Model.extend({\n\tcomputeds: {\n\t\tdetails: function details() {\n\t\t\tif (this.has(\"response\")) {\n\t\t\t\tvar resp = App.parseResponse(this.get(\"response\"));\n\t\t\t\treturn resp.detail || resp.info;\n\t\t\t}\n\n\t\t\treturn this.parseStatus(this.get(\"status\"));\n\t\t}\n\t},\n\n\tparseStatus: function parseStatus(status) {\n\t\tvar details = void 0;\n\n\t\tswitch (status) {\n\t\t\tcase 0:\n\t\t\t\tdetails = \"The connection to the server timed out or was interrupted\";\n\t\t\t\tbreak;\n\n\t\t\tcase 500:\n\t\t\t\tdetails = \"There was an error on the server\";\n\t\t\t\tbreak;\n\n\t\t\tcase 404:\n\t\t\t\tdetails = \"The required information could not be found\";\n\t\t\t\tbreak;\n\n\t\t\tcase 410:\n\t\t\t\tdetails = \"The required object was removed\";\n\t\t\t\tbreak;\n\n\t\t\tcase 502:\n\t\t\t\tdetails = \"The server is temporarily inaccessible\";\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tdetails = \"An unexpected error occurred\";\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn details;\n\t}\n});\n\nmodule.exports = Errors;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVycm9ycy5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCJBcHAiLCJFcnJvcnMiLCJNb2RlbCIsIkVwb3h5IiwiZXh0ZW5kIiwiY29tcHV0ZWRzIiwiZGV0YWlscyIsImhhcyIsInJlc3AiLCJwYXJzZVJlc3BvbnNlIiwiZ2V0IiwiZGV0YWlsIiwiaW5mbyIsInBhcnNlU3RhdHVzIiwic3RhdHVzIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCOztBQUVBLElBQU1DLE1BQU1ELFFBQVEsVUFBUixDQUFaOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQU1FLFNBQVMsRUFBZjs7QUFFQTtBQUNBO0FBQ0E7QUFDQUEsT0FBT0MsS0FBUCxHQUFlSixTQUFTSyxLQUFULENBQWVELEtBQWYsQ0FBcUJFLE1BQXJCLENBQTRCO0FBQzFDQyxZQUFXO0FBQ1ZDLFdBQVMsbUJBQVc7QUFDbkIsT0FBSSxLQUFLQyxHQUFMLENBQVMsVUFBVCxDQUFKLEVBQTBCO0FBQ3pCLFFBQU1DLE9BQU9SLElBQUlTLGFBQUosQ0FBa0IsS0FBS0MsR0FBTCxDQUFTLFVBQVQsQ0FBbEIsQ0FBYjtBQUNBLFdBQU9GLEtBQUtHLE1BQUwsSUFBZUgsS0FBS0ksSUFBM0I7QUFDQTs7QUFFRCxVQUFPLEtBQUtDLFdBQUwsQ0FBaUIsS0FBS0gsR0FBTCxDQUFTLFFBQVQsQ0FBakIsQ0FBUDtBQUNBO0FBUlMsRUFEK0I7O0FBWTFDRyxjQUFhLHFCQUFTQyxNQUFULEVBQWlCO0FBQzdCLE1BQUlSLGdCQUFKOztBQUVBLFVBQVFRLE1BQVI7QUFDQyxRQUFLLENBQUw7QUFDQ1IsY0FBVSwyREFBVjtBQUNBOztBQUVELFFBQUssR0FBTDtBQUNDQSxjQUFVLGtDQUFWO0FBQ0E7O0FBRUQsUUFBSyxHQUFMO0FBQ0NBLGNBQVUsNkNBQVY7QUFDQTs7QUFFRCxRQUFLLEdBQUw7QUFDQ0EsY0FBVSxpQ0FBVjtBQUNBOztBQUVELFFBQUssR0FBTDtBQUNDQSxjQUFVLHdDQUFWO0FBQ0E7O0FBRUQ7QUFDQ0EsY0FBVSw4QkFBVjtBQUNBO0FBdkJGOztBQTBCQSxTQUFPQSxPQUFQO0FBQ0E7QUExQ3lDLENBQTVCLENBQWY7O0FBNkNBUyxPQUFPQyxPQUFQLEdBQWlCZixNQUFqQiIsImZpbGUiOiJlcnJvcnMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIERlcGVuZGVuY2llc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5cbmNvbnN0IEFwcCA9IHJlcXVpcmUoXCIuLi9pbmRleFwiKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRXJyb3IgQ2F0ZWdvcmllc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuY29uc3QgRXJyb3JzID0ge307XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEVycm9yc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuRXJyb3JzLk1vZGVsID0gQmFja2JvbmUuRXBveHkuTW9kZWwuZXh0ZW5kKHtcblx0Y29tcHV0ZWRzOiB7XG5cdFx0ZGV0YWlsczogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAodGhpcy5oYXMoXCJyZXNwb25zZVwiKSkge1xuXHRcdFx0XHRjb25zdCByZXNwID0gQXBwLnBhcnNlUmVzcG9uc2UodGhpcy5nZXQoXCJyZXNwb25zZVwiKSk7XG5cdFx0XHRcdHJldHVybiByZXNwLmRldGFpbCB8fCByZXNwLmluZm87XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLnBhcnNlU3RhdHVzKHRoaXMuZ2V0KFwic3RhdHVzXCIpKTtcblx0XHR9LFxuXHR9LFxuXG5cdHBhcnNlU3RhdHVzOiBmdW5jdGlvbihzdGF0dXMpIHtcblx0XHRsZXQgZGV0YWlscztcblxuXHRcdHN3aXRjaCAoc3RhdHVzKSB7XG5cdFx0XHRjYXNlIDA6XG5cdFx0XHRcdGRldGFpbHMgPSBcIlRoZSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIgdGltZWQgb3V0IG9yIHdhcyBpbnRlcnJ1cHRlZFwiO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSA1MDA6XG5cdFx0XHRcdGRldGFpbHMgPSBcIlRoZXJlIHdhcyBhbiBlcnJvciBvbiB0aGUgc2VydmVyXCI7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIDQwNDpcblx0XHRcdFx0ZGV0YWlscyA9IFwiVGhlIHJlcXVpcmVkIGluZm9ybWF0aW9uIGNvdWxkIG5vdCBiZSBmb3VuZFwiO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSA0MTA6XG5cdFx0XHRcdGRldGFpbHMgPSBcIlRoZSByZXF1aXJlZCBvYmplY3Qgd2FzIHJlbW92ZWRcIjtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgNTAyOlxuXHRcdFx0XHRkZXRhaWxzID0gXCJUaGUgc2VydmVyIGlzIHRlbXBvcmFyaWx5IGluYWNjZXNzaWJsZVwiO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0ZGV0YWlscyA9IFwiQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZFwiO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHRyZXR1cm4gZGV0YWlscztcblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEVycm9ycztcbiJdfQ==",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar moment = require(\"moment\");\nvar pikaday = require(\"pikaday\");\n\nvar settings = require(\"app-settings\");\n\nvar BigModal = require(\"./bigModal\");\nvar EventModel = require(\"./eventModel\");\nvar Selectra = require(\"./selectra\");\n\nmodule.exports = BigModal.extend({\n\tui: {\n\t\ttitle: \"input#title\",\n\t\teventIcon: \"div.event-icon\",\n\t\tdescription: \"textarea#description\",\n\t\tlocation: \"select#location\",\n\t\tstartDate: \"input#start-date\",\n\t\tstartTime: \"input#start-time\",\n\t\tendDate: \"input#end-date\",\n\t\tendTime: \"input#end-time\",\n\t\tallDay: \"input#all-day\",\n\t\tgap: \"select#gap\",\n\t\trepeatFrequency: \"div.repeat-frequency\",\n\t\tinterval: \"#interval\",\n\t\tintervalLabel: \"span.interval-label\",\n\t\tweeklyRepeat: \"div.weekly-repeat\",\n\t\trepeatWeekdays: \"select#repeat-week-days\",\n\t\tmonthlyRepeat: \"div.monthly-repeat\",\n\t\trepeatMonthType: \"select#repeat-month-type\",\n\t\tmonthlyRepeatLabel: \"span.monthly-repeat-label\",\n\t\trepeatEnd: \"div.repeat-end\",\n\t\tuntil: \"select#until\",\n\t\tuntilDate: \"input#until-date\",\n\t\tuntilCount: \"input#until-count\",\n\t\trepeatInfo: \"div.info.repeat\",\n\t\teveryone: \"input#everyone\",\n\t\taudience: \"select#audience\",\n\t\ttags: \"select#tags\",\n\t\tsubCalendarLabel: \"label.sub-calendar-label\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.eventIcon\": \"onEventIconClick\",\n\t\t\"click @ui.allDay\": \"onAllDayClick\",\n\t\t\"click @ui.everyone\": \"onEveryoneClick\",\n\t\t\"change @ui.startDate\": \"onStartDateChange\",\n\t\t\"change @ui.startTime\": \"onStartTimeChange\",\n\t\t\"change @ui.endTime\": \"onEndTimeChange\",\n\t\t\"change @ui.gap\": \"onGapChange\",\n\t\t\"change @ui.repeatMonthType\": \"onRepeatMonthTypeChange\",\n\t\t\"change @ui.until\": \"onUntilChange\"\n\t},\n\n\tactions: {\n\t\tcreateAnother: \"onCreateAnother\"\n\t},\n\n\terrorMap: {\n\t\ttitle: {\n\t\t\tposition: \"bottom\"\n\t\t},\n\t\tstartDate: {\n\t\t\tposition: \"top\"\n\t\t},\n\t\tendDate: {\n\t\t\tposition: \"bottom\"\n\t\t},\n\t\tgap: {\n\t\t\tposition: \"right\"\n\t\t},\n\t\tuntilDate: {\n\t\t\tposition: \"right\"\n\t\t},\n\t\tuntilCount: {\n\t\t\tposition: \"right\"\n\t\t},\n\t\tuntil: {\n\t\t\tposition: \"top\"\n\t\t},\n\t\ttags: {\n\t\t\tattractionElement: \"subCalendarLabel\",\n\t\t\tposition: \"top\"\n\t\t}\n\t},\n\n\tinitialize: function initialize() {\n\t\t_.bindAll(this);\n\n\t\tthis.Options = {\n\t\t\tclasses: [\"event-modal\"],\n\t\t\ttemplate: require(\"./templates/eventModal.nunj\").content,\n\t\t\tbuttons: {\n\t\t\t\tcreate: {\n\t\t\t\t\ttype: \"accept\",\n\t\t\t\t\tlabel: \"Create & Close\",\n\t\t\t\t\tmode: \"create\",\n\t\t\t\t\tsave: true,\n\t\t\t\t\tvalidate: true\n\t\t\t\t},\n\t\t\t\tcreateAnother: {\n\t\t\t\t\ttype: \"accept\",\n\t\t\t\t\tlabel: \"Create\",\n\t\t\t\t\tmode: \"create\",\n\t\t\t\t\tsave: true,\n\t\t\t\t\tvalidate: true\n\t\t\t\t},\n\t\t\t\tupdate: {\n\t\t\t\t\ttype: \"accept\",\n\t\t\t\t\tlabel: \"Update\",\n\t\t\t\t\tmode: \"edit\",\n\t\t\t\t\tsave: true,\n\t\t\t\t\tvalidate: true\n\t\t\t\t},\n\t\t\t\tdelete: {\n\t\t\t\t\ttype: \"delete\",\n\t\t\t\t\tlabel: \"Delete\",\n\t\t\t\t\tmode: \"edit\",\n\t\t\t\t\tconfirm: true\n\t\t\t\t},\n\t\t\t\tcancel: {\n\t\t\t\t\ttype: \"cancel\",\n\t\t\t\t\tlabel: \"Cancel\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tdataNoun: \"event\" + (this.model.isNew() ? \"\" : \": \" + this.model.get(\"title\")),\n\t\t\teditVerb: \"Change\"\n\t\t};\n\n\t\tthis.ui = _.extend(this.ui, BigModal.prototype.ui);\n\t\tthis.events = _.extend(this.events, BigModal.prototype.events);\n\n\t\tBigModal.prototype.initialize.call(this);\n\t},\n\n\trenderForm: function renderForm() {\n\t\tvar _this = this;\n\n\t\tvar modelIsNew = this.model.isNew();\n\n\t\tvar values = modelIsNew ? {} : this.model.toJSON();\n\n\t\tif (!values.repeatOpts) values.repeatOpts = {};\n\n\t\tvar start = this.model.has(\"start\") ? moment.unix(this.model.get(\"start\")) : moment();\n\t\tvar end = this.model.has(\"end\") ? moment.unix(this.model.get(\"end\")) : moment(start);\n\t\tvar until = end;\n\t\tvar count = 1;\n\n\t\tif (modelIsNew) {\n\t\t\tstart.startOf(\"day\").add(8, \"h\");\n\t\t\tend = moment(start).add(30, \"m\");\n\t\t\tuntil = end;\n\t\t} else if (this.model.get(\"repeat\") && this.model.get(\"repeatOpts\").until === \"date\") {\n\t\t\tuntil = moment.unix(this.model.get(\"repeatOpts\").end);\n\t\t} else if (this.model.get(\"repeat\") && this.model.get(\"repeatOpts\").until === \"instances\") {\n\t\t\tcount = this.model.get(\"repeatOpts\").end;\n\t\t}\n\n\t\t// Style and populate the starting and ending dates and time inputs\n\t\tvar dateFormat = \"DD MMM YYYY\";\n\t\tvar timeFormat = \"HH:mm\";\n\n\t\tthis.ui.startDate.val(start.format(dateFormat));\n\t\tthis.ui.endDate.val(end.format(dateFormat));\n\n\t\t// eslint-disable-next-line new-cap, no-new\n\t\tthis.StartDatePicker = new pikaday({\n\t\t\tfield: this.ui.startDate.get(0),\n\t\t\tformat: dateFormat,\n\t\t\t//\t\t\tminDate: start.toDate(),\n\n\t\t\tonSelect: function onSelect() {\n\t\t\t\tvar startDate = moment(_this.ui.startDate.val(), _this.DateFormat).hour(0).minute(0).second(0);\n\t\t\t\tvar endDate = moment(_this.ui.endDate.val(), _this.DateFormat).hour(0).minute(0).second(0);\n\t\t\t\tvar repeatEnd = moment(_this.ui.untilDate.val(), _this.DateFormat).hour(0).minute(0).second(0);\n\n\t\t\t\tif (startDate.isAfter(endDate)) _this.EndDatePicker.setDate(startDate.toDate());\n\n\t\t\t\tif (startDate.isAfter(repeatEnd)) _this.RepeatEndDatePicker.setDate(startDate.toDate());\n\n\t\t\t\t_this.updateTimeLeft();\n\n\t\t\t\t//\t\t\t\tthis.EndDatePicker.setMinDate(startDate.toDate());\n\t\t\t\t_this.RepeatEndDatePicker.setMinDate(startDate.toDate());\n\t\t\t}\n\t\t});\n\n\t\t// eslint-disable-next-line new-cap, no-new\n\t\tthis.EndDatePicker = new pikaday({\n\t\t\tfield: this.ui.endDate.get(0),\n\t\t\tformat: dateFormat,\n\t\t\t//\t\t\tminDate: end.toDate(),\n\n\t\t\tonSelect: function onSelect() {\n\t\t\t\tvar startDate = moment(_this.ui.startDate.val(), _this.DateFormat).hour(0).minute(0).second(0);\n\t\t\t\tvar endDate = moment(_this.ui.endDate.val(), _this.DateFormat).hour(0).minute(0).second(0);\n\n\t\t\t\tif (startDate.isAfter(endDate)) _this.StartDatePicker.setDate(endDate.toDate());\n\n\t\t\t\t_this.updateTimeRight();\n\t\t\t}\n\t\t});\n\n\t\tthis.ui.startTime.val(start.format(timeFormat)).timePicker();\n\t\tthis.ui.endTime.val(end.format(timeFormat)).timePicker();\n\n\t\t// Style the event repetition inputs\n\t\tthis.ui.gap.chosen({\n\t\t\tdisable_search: true,\n\t\t\twidth: \"200px\"\n\t\t});\n\n\t\tif (!modelIsNew) {\n\t\t\tif (this.model.get(\"allDay\")) this.ui.allDay.trigger(\"click\");\n\n\t\t\tif (this.model.get(\"repeat\")) {\n\t\t\t\tvar repeatOptions = this.model.get(\"repeatOpts\");\n\n\t\t\t\tthis.ui.gap.val(repeatOptions.gap);\n\t\t\t\tthis.ui.gap.trigger(\"chosen:updated\");\n\t\t\t\tthis.ui.gap.trigger(\"change\");\n\n\t\t\t\tswitch (repeatOptions.gap) {\n\t\t\t\t\tdefault:\n\t\t\t\t\tcase \"day\":\n\t\t\t\t\t\tthis.ui.interval.val(repeatOptions.interval);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"week\":\n\t\t\t\t\t\tthis.ui.interval.val(repeatOptions.interval);\n\t\t\t\t\t\tthis.ui.repeatWeekdays.val(repeatOptions.weekDays);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"month\":\n\t\t\t\t\t\tthis.ui.interval.val(repeatOptions.interval);\n\t\t\t\t\t\tthis.ui.repeatMonthType.val(repeatOptions.monthStyle);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"year\":\n\t\t\t\t\t\tthis.ui.interval.val(repeatOptions.interval);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tswitch (repeatOptions.until) {\n\t\t\t\t\tdefault:\n\t\t\t\t\tcase \"date\":\n\t\t\t\t\t\tthis.ui.untilDate.val(moment.unix(repeatOptions.end).format(\"DD MMM YYYY\"));\n\t\t\t\t\t\tthis.ui.until.val(\"date\");\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"instances\":\n\t\t\t\t\t\tthis.ui.untilCount.val(repeatOptions.end);\n\t\t\t\t\t\tthis.ui.until.val(\"instances\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tthis.ui.until.trigger(\"change\");\n\t\t\t}\n\t\t}\n\n\t\tthis.updateInterval();\n\n\t\tthis.ui.repeatWeekdays.chosen({\n\t\t\tdisable_search: true,\n\t\t\twidth: \"50%\"\n\t\t});\n\n\t\tthis.ui.repeatMonthType.chosen({\n\t\t\tdisable_search: true,\n\t\t\twidth: \"150px\"\n\t\t});\n\n\t\t// Style and populate the event repetition termination inputs\n\t\tthis.ui.until.chosen({\n\t\t\tdisable_search: true,\n\t\t\twidth: \"150px\"\n\t\t});\n\n\t\tthis.ui.untilDate.val(until.format(dateFormat));\n\n\t\t// eslint-disable-next-line new-cap, no-new\n\t\tthis.RepeatEndDatePicker = new pikaday({\n\t\t\tfield: this.ui.untilDate.get(0),\n\t\t\tformat: dateFormat,\n\t\t\tminDate: end.toDate()\n\t\t});\n\n\t\tthis.ui.untilCount.val(count);\n\n\t\tvar locServer = {\n\t\t\tfetch: settings.urlRoot + \"/acacia/calendar/locations\",\n\t\t\tkey: \"location\",\n\t\t\tvalue: \"location\"\n\t\t};\n\n\t\tif (!this.model.isNew() && this.model.get(\"location\")) {\n\t\t\tlocServer.default = {\n\t\t\t\tkey: this.model.get(\"location\"),\n\t\t\t\tvalue: this.model.get(\"location\")\n\t\t\t};\n\t\t}\n\n\t\tvar locations = new Selectra({\n\t\t\tserver: locServer,\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t},\n\t\t\tplaceholder: \"Choose where this event occurs\",\n\t\t\tddHost: \".modal-container\",\n\t\t\tallowCreation: {\n\t\t\t\tmode: \"nomatch\",\n\t\t\t\ttext: \"Add new event\"\n\t\t\t},\n\t\t\tsingleDeselect: true\n\t\t});\n\n\t\tlocations.show({ el: this.ui.location });\n\n\t\tvar audServer = {\n\t\t\tfetch: settings.urlRoot + \"/acacia/calendar/audience\"\n\t\t};\n\n\t\tif (!this.model.isNew()) {\n\t\t\taudServer.default = {\n\t\t\t\tfetch: settings.urlRoot + \"/acacia/calendar/audience/\" + this.model.id\n\t\t\t};\n\t\t}\n\n\t\tthis.audience = new Selectra({\n\t\t\tmultiple: true,\n\t\t\tserver: audServer,\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t},\n\t\t\tplaceholder: \"Choose who can see this event\",\n\t\t\tddHost: \".modal-container\"\n\t\t});\n\n\t\tthis.audience.show({ el: this.ui.audience });\n\n\t\tif (!modelIsNew && this.model.has(\"access\")) {\n\t\t\tif (this.model.get(\"access\").length === 1 && this.model.get(\"access\")[0] === \"all\") this.ui.everyone.prop(\"checked\", true);\n\n\t\t\tthis.updateAudience();\n\t\t}\n\n\t\tvar tagServer = {\n\t\t\tfetch: settings.urlRoot + \"/acacia/calendar/tags\",\n\t\t\tkey: \"tag\",\n\t\t\tvalue: \"tag\"\n\t\t};\n\n\t\tif (!this.model.isNew()) {\n\t\t\ttagServer.default = {\n\t\t\t\tkey: _.first(this.model.get(\"tags\")),\n\t\t\t\tvalue: _.first(this.model.get(\"tags\"))\n\t\t\t};\n\t\t}\n\n\t\tvar tags = new Selectra({\n\t\t\tserver: tagServer,\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t},\n\t\t\tplaceholder: \"Choose the tags for this event\",\n\t\t\tddHost: \".modal-container\",\n\t\t\tallowCreation: {\n\t\t\t\tmode: \"nomatch\",\n\t\t\t\ttext: \"Add new tag\"\n\t\t\t},\n\t\t\tsingleDeselect: true\n\t\t});\n\n\t\ttags.show({ el: this.ui.tags });\n\t},\n\n\tonAllDayClick: function onAllDayClick() {\n\t\tif (this.ui.allDay.prop(\"checked\")) {\n\t\t\tthis.ui.startTime.addClass(\"hide\");\n\t\t\tthis.ui.endTime.addClass(\"hide\");\n\t\t} else {\n\t\t\tthis.ui.startTime.removeClass(\"hide\");\n\t\t\tthis.ui.endTime.removeClass(\"hide\");\n\t\t}\n\t},\n\n\tonOnceClick: function onOnceClick() {\n\t\tthis.updateRepeatFrequency();\n\n\t\tif (this.ui.gap.val() === \"once\") {\n\t\t\tthis.ui.repeatEnd.addClass(\"hide\");\n\t\t\tthis.ui.repeatInfo.addClass(\"hide\");\n\t\t\t//this.ui.gap.prop(\"disabled\", true);\n\t\t} else {\n\t\t\tthis.ui.repeatEnd.removeClass(\"hide\");\n\t\t\tthis.ui.repeatInfo.removeClass(\"hide\");\n\t\t\t//this.ui.gap.prop(\"disabled\", false);\n\t\t}\n\n\t\tthis.ui.gap.trigger(\"chosen:updated\");\n\t},\n\n\tonEveryoneClick: function onEveryoneClick() {\n\t\tthis.updateAudience();\n\t},\n\n\tonStartDateChange: function onStartDateChange() {\n\t\tthis.updateMonthlyRepeatLabel();\n\t},\n\n\tparseEventDurationBounds: function parseEventDurationBounds() {\n\t\treturn {\n\t\t\tstart: this.parseTimeInput(this.ui.startTime, this.parseDateInput(this.ui.startDate)),\n\t\t\tend: this.parseTimeInput(this.ui.endTime, this.parseDateInput(this.ui.endDate))\n\t\t};\n\t},\n\n\tupdateTimeLeft: function updateTimeLeft() {\n\t\tvar duration = this.parseEventDurationBounds();\n\n\t\tif (duration.start.isSame(duration.end) || duration.start.isAfter(duration.end)) {\n\t\t\tvar newEnd = moment(duration.start).add(30, \"m\");\n\t\t\tthis.ui.endTime.val(newEnd.format(\"HH:mm\"));\n\t\t\tthis.EndDatePicker.setDate(newEnd.toDate());\n\t\t}\n\t},\n\n\tupdateTimeRight: function updateTimeRight() {\n\t\tvar duration = this.parseEventDurationBounds();\n\n\t\tif (duration.start.isSame(duration.end) || duration.start.isAfter(duration.end)) {\n\t\t\tvar newStart = moment(duration.start).subtract(30, \"m\");\n\t\t\tthis.ui.startTime.val(newStart.format(\"HH:mm\"));\n\t\t\tthis.StartDatePicker.setDate(newStart.toDate());\n\t\t}\n\t},\n\n\tonStartTimeChange: function onStartTimeChange() {\n\t\tthis.updateTimeLeft();\n\t},\n\n\tonEndTimeChange: function onEndTimeChange() {\n\t\tthis.updateTimeRight();\n\t},\n\n\tonGapChange: function onGapChange() {\n\t\t//if(this.ui.gap.val() == \"once\")\n\t\tthis.onOnceClick();\n\n\t\tthis.updateInterval();\n\t\tthis.updateRepeatFrequency();\n\n\t\tif (this.ui.gap.val() === \"week\") {\n\t\t\tthis.ui.monthlyRepeat.addClass(\"hide\");\n\t\t\tthis.ui.weeklyRepeat.removeClass(\"hide\");\n\t\t} else if (this.ui.gap.val() === \"month\") {\n\t\t\tthis.ui.weeklyRepeat.addClass(\"hide\");\n\t\t\tthis.ui.monthlyRepeat.removeClass(\"hide\");\n\t\t} else if (this.ui.gap.val() === \"year\") {\n\t\t\tvar startDate = moment(this.ui.startDate.val(), this.DateFormat).hour(0).minute(0).second(0);\n\n\t\t\tif (this.RepeatEndDatePicker) this.RepeatEndDatePicker.setDate(startDate.add(1, \"y\").toDate());\n\n\t\t\tthis.ui.weeklyRepeat.addClass(\"hide\");\n\t\t\tthis.ui.monthlyRepeat.addClass(\"hide\");\n\t\t} else {\n\t\t\tthis.ui.weeklyRepeat.addClass(\"hide\");\n\t\t\tthis.ui.monthlyRepeat.addClass(\"hide\");\n\t\t}\n\t},\n\n\tonRepeatMonthTypeChange: function onRepeatMonthTypeChange() {\n\t\tthis.updateMonthlyRepeatLabel();\n\t},\n\n\tonUntilChange: function onUntilChange() {\n\t\tswitch (this.ui.until.val()) {\n\t\t\tdefault:\n\t\t\tcase \"date\":\n\t\t\t\tthis.ui.untilCount.addClass(\"hide\");\n\t\t\t\tthis.ui.untilDate.removeClass(\"hide\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"instances\":\n\t\t\t\tthis.ui.untilDate.addClass(\"hide\");\n\t\t\t\tthis.ui.untilCount.removeClass(\"hide\");\n\t\t\t\tbreak;\n\t\t}\n\t},\n\n\tparseDateInput: function parseDateInput(input) {\n\t\treturn moment(input.val(), \"DD MMM YYYY\").hour(0).minute(0).second(0);\n\t},\n\n\tparseTimeInput: function parseTimeInput(input, dateTime) {\n\t\tvar time = moment(input.val(), \"HH:mm\");\n\n\t\tdateTime.hour(time.hour()).minute(time.minute()).second(0);\n\n\t\treturn dateTime;\n\t},\n\n\tassembleData: function assembleData() {\n\t\tvar data = {};\n\n\t\t// Parse the starting and ending date and time inputs\n\t\tvar start = this.parseDateInput(this.ui.startDate);\n\t\tvar end = this.parseDateInput(this.ui.endDate).hour(23).minute(59);\n\t\tvar allDay = this.ui.allDay.prop(\"checked\");\n\n\t\tif (!allDay && start && end) {\n\t\t\tthis.parseTimeInput(this.ui.startTime, start);\n\t\t\tthis.parseTimeInput(this.ui.endTime, end);\n\t\t}\n\n\t\t// Parse the repeat specification\n\t\tvar repeat = this.ui.gap.val() !== \"once\";\n\t\tvar repeatOptions = {};\n\n\t\tif (repeat) {\n\t\t\trepeatOptions.gap = this.ui.gap.val();\n\t\t\trepeatOptions.interval = parseInt(this.ui.interval.val(), 10);\n\n\t\t\tswitch (repeatOptions.gap) {\n\t\t\t\tdefault:\n\t\t\t\tcase \"day\":\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"weekday\":\n\t\t\t\t\trepeatOptions.interval = 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"week\":\n\t\t\t\t\trepeatOptions.weekDays = _.map(_.compact(this.ui.repeatWeekdays.val() || []), function (i) {\n\t\t\t\t\t\treturn Number(i);\n\t\t\t\t\t}).sort();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"month\":\n\t\t\t\t\trepeatOptions.monthStyle = this.ui.repeatMonthType.val();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"year\":\n\t\t\t\t\trepeatOptions.interval = 1;\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\trepeatOptions.until = this.ui.until.val();\n\n\t\t\tswitch (repeatOptions.until) {\n\t\t\t\tdefault:\n\t\t\t\tcase \"date\":\n\t\t\t\t\trepeatOptions.end = moment(this.ui.untilDate.val(), \"DD MMM YYYY\").hour(start.hour()).minute(start.minute()).unix();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"instances\":\n\t\t\t\t\trepeatOptions.end = parseInt(this.ui.untilCount.val(), 10);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Set the attributes that will be saved\n\t\tdata.attributes = {\n\t\t\taccess: this.ui.everyone.prop(\"checked\") ? [\"all\"] : this.ui.audience.val() || [],\n\t\t\tallDay: allDay,\n\t\t\tdesc: this.ui.description.val(),\n\t\t\tend: end.unix(),\n\t\t\tlocation: this.ui.location.val(),\n\t\t\trepeat: repeat,\n\t\t\trepeatOpts: repeat ? repeatOptions : null,\n\t\t\tstart: start.unix(),\n\t\t\ttags: this.ui.tags.val() ? [this.ui.tags.val()] : [],\n\t\t\ttitle: this.ui.title.val()\n\t\t};\n\n\t\treturn data;\n\t},\n\n\tupdateRepeatFrequency: function updateRepeatFrequency() {\n\t\tif (this.ui.gap.val() === \"once\" || this.ui.gap.val() === \"weekday\" || this.ui.gap.val() === \"year\") this.ui.repeatFrequency.addClass(\"hide\");else this.ui.repeatFrequency.removeClass(\"hide\");\n\t},\n\n\tupdateInterval: function updateInterval() {\n\t\tvar intervalMax = 0;\n\n\t\tswitch (this.ui.gap.val()) {\n\t\t\tdefault:\n\t\t\tcase \"day\":\n\t\t\t\tthis.ui.intervalLabel.text(\"days\");\n\t\t\t\tintervalMax = 30;\n\t\t\t\tbreak;\n\n\t\t\tcase \"week\":\n\t\t\t\tthis.ui.intervalLabel.text(\"weeks\");\n\t\t\t\tintervalMax = 52;\n\t\t\t\tbreak;\n\n\t\t\tcase \"month\":\n\t\t\t\tthis.ui.intervalLabel.text(\"months\");\n\t\t\t\tintervalMax = 12;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.ui.interval.attr(\"max\", intervalMax);\n\t\tif (this.ui.interval.val() > intervalMax) this.ui.interval.val(intervalMax);\n\t},\n\n\tupdateMonthlyRepeatLabel: function updateMonthlyRepeatLabel() {\n\t\tvar startDate = moment(this.ui.startDate.val(), \"DD MMM YYYY\");\n\n\t\tswitch (this.ui.repeatMonthType.val()) {\n\t\t\tdefault:\n\t\t\tcase \"dayofmonth\":\n\t\t\t\tstartDate = startDate.format(\"Do\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"dayofweek\":\n\t\t\t\t{\n\t\t\t\t\tvar day = startDate.date();\n\t\t\t\t\tvar ordinalSuffixes = [\"st\", \"nd\", \"rd\", \"th\", \"th\"];\n\n\t\t\t\t\tstartDate = Math.ceil(day / 7) + ordinalSuffixes[day / 7 % 1 === 0 ? Math.max(day / 7 - 1, 0) : Math.floor(day / 7)] + \" \" + startDate.format(\"dddd\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t}\n\n\t\tthis.ui.monthlyRepeatLabel.text(\"(\" + startDate + \")\");\n\t},\n\n\tupdateAudience: function updateAudience() {\n\t\tif (this.ui.everyone.prop(\"checked\")) this.audience.model.set({ disabled: true });else this.audience.model.set({ disabled: false });\n\t},\n\n\tonCreateAnother: function onCreateAnother(result) {\n\t\treturn new EventModel({\n\t\t\tstart: result.model.get(\"start\"),\n\t\t\tend: result.model.get(\"end\")\n\t\t});\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV2ZW50TW9kYWwuanMiXSwibmFtZXMiOlsiXyIsInJlcXVpcmUiLCJtb21lbnQiLCJwaWthZGF5Iiwic2V0dGluZ3MiLCJCaWdNb2RhbCIsIkV2ZW50TW9kZWwiLCJTZWxlY3RyYSIsIm1vZHVsZSIsImV4cG9ydHMiLCJleHRlbmQiLCJ1aSIsInRpdGxlIiwiZXZlbnRJY29uIiwiZGVzY3JpcHRpb24iLCJsb2NhdGlvbiIsInN0YXJ0RGF0ZSIsInN0YXJ0VGltZSIsImVuZERhdGUiLCJlbmRUaW1lIiwiYWxsRGF5IiwiZ2FwIiwicmVwZWF0RnJlcXVlbmN5IiwiaW50ZXJ2YWwiLCJpbnRlcnZhbExhYmVsIiwid2Vla2x5UmVwZWF0IiwicmVwZWF0V2Vla2RheXMiLCJtb250aGx5UmVwZWF0IiwicmVwZWF0TW9udGhUeXBlIiwibW9udGhseVJlcGVhdExhYmVsIiwicmVwZWF0RW5kIiwidW50aWwiLCJ1bnRpbERhdGUiLCJ1bnRpbENvdW50IiwicmVwZWF0SW5mbyIsImV2ZXJ5b25lIiwiYXVkaWVuY2UiLCJ0YWdzIiwic3ViQ2FsZW5kYXJMYWJlbCIsImV2ZW50cyIsImFjdGlvbnMiLCJjcmVhdGVBbm90aGVyIiwiZXJyb3JNYXAiLCJwb3NpdGlvbiIsImF0dHJhY3Rpb25FbGVtZW50IiwiaW5pdGlhbGl6ZSIsImJpbmRBbGwiLCJPcHRpb25zIiwiY2xhc3NlcyIsInRlbXBsYXRlIiwiY29udGVudCIsImJ1dHRvbnMiLCJjcmVhdGUiLCJ0eXBlIiwibGFiZWwiLCJtb2RlIiwic2F2ZSIsInZhbGlkYXRlIiwidXBkYXRlIiwiZGVsZXRlIiwiY29uZmlybSIsImNhbmNlbCIsImRhdGFOb3VuIiwibW9kZWwiLCJpc05ldyIsImdldCIsImVkaXRWZXJiIiwicHJvdG90eXBlIiwiY2FsbCIsInJlbmRlckZvcm0iLCJtb2RlbElzTmV3IiwidmFsdWVzIiwidG9KU09OIiwicmVwZWF0T3B0cyIsInN0YXJ0IiwiaGFzIiwidW5peCIsImVuZCIsImNvdW50Iiwic3RhcnRPZiIsImFkZCIsImRhdGVGb3JtYXQiLCJ0aW1lRm9ybWF0IiwidmFsIiwiZm9ybWF0IiwiU3RhcnREYXRlUGlja2VyIiwiZmllbGQiLCJvblNlbGVjdCIsIkRhdGVGb3JtYXQiLCJob3VyIiwibWludXRlIiwic2Vjb25kIiwiaXNBZnRlciIsIkVuZERhdGVQaWNrZXIiLCJzZXREYXRlIiwidG9EYXRlIiwiUmVwZWF0RW5kRGF0ZVBpY2tlciIsInVwZGF0ZVRpbWVMZWZ0Iiwic2V0TWluRGF0ZSIsInVwZGF0ZVRpbWVSaWdodCIsInRpbWVQaWNrZXIiLCJjaG9zZW4iLCJkaXNhYmxlX3NlYXJjaCIsIndpZHRoIiwidHJpZ2dlciIsInJlcGVhdE9wdGlvbnMiLCJ3ZWVrRGF5cyIsIm1vbnRoU3R5bGUiLCJ1cGRhdGVJbnRlcnZhbCIsIm1pbkRhdGUiLCJsb2NTZXJ2ZXIiLCJmZXRjaCIsInVybFJvb3QiLCJrZXkiLCJ2YWx1ZSIsImRlZmF1bHQiLCJsb2NhdGlvbnMiLCJzZXJ2ZXIiLCJwYWdpbmciLCJwYWdlU2l6ZSIsImluZmluaXRlIiwicGxhY2Vob2xkZXIiLCJkZEhvc3QiLCJhbGxvd0NyZWF0aW9uIiwidGV4dCIsInNpbmdsZURlc2VsZWN0Iiwic2hvdyIsImVsIiwiYXVkU2VydmVyIiwiaWQiLCJtdWx0aXBsZSIsImxlbmd0aCIsInByb3AiLCJ1cGRhdGVBdWRpZW5jZSIsInRhZ1NlcnZlciIsImZpcnN0Iiwib25BbGxEYXlDbGljayIsImFkZENsYXNzIiwicmVtb3ZlQ2xhc3MiLCJvbk9uY2VDbGljayIsInVwZGF0ZVJlcGVhdEZyZXF1ZW5jeSIsIm9uRXZlcnlvbmVDbGljayIsIm9uU3RhcnREYXRlQ2hhbmdlIiwidXBkYXRlTW9udGhseVJlcGVhdExhYmVsIiwicGFyc2VFdmVudER1cmF0aW9uQm91bmRzIiwicGFyc2VUaW1lSW5wdXQiLCJwYXJzZURhdGVJbnB1dCIsImR1cmF0aW9uIiwiaXNTYW1lIiwibmV3RW5kIiwibmV3U3RhcnQiLCJzdWJ0cmFjdCIsIm9uU3RhcnRUaW1lQ2hhbmdlIiwib25FbmRUaW1lQ2hhbmdlIiwib25HYXBDaGFuZ2UiLCJvblJlcGVhdE1vbnRoVHlwZUNoYW5nZSIsIm9uVW50aWxDaGFuZ2UiLCJpbnB1dCIsImRhdGVUaW1lIiwidGltZSIsImFzc2VtYmxlRGF0YSIsImRhdGEiLCJyZXBlYXQiLCJwYXJzZUludCIsIm1hcCIsImNvbXBhY3QiLCJOdW1iZXIiLCJpIiwic29ydCIsImF0dHJpYnV0ZXMiLCJhY2Nlc3MiLCJkZXNjIiwiaW50ZXJ2YWxNYXgiLCJhdHRyIiwiZGF5IiwiZGF0ZSIsIm9yZGluYWxTdWZmaXhlcyIsIk1hdGgiLCJjZWlsIiwibWF4IiwiZmxvb3IiLCJzZXQiLCJkaXNhYmxlZCIsIm9uQ3JlYXRlQW5vdGhlciIsInJlc3VsdCJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsSUFBSUMsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNQyxTQUFTRCxRQUFRLFFBQVIsQ0FBZjtBQUNBLElBQU1FLFVBQVVGLFFBQVEsU0FBUixDQUFoQjs7QUFFQSxJQUFNRyxXQUFXSCxRQUFRLGNBQVIsQ0FBakI7O0FBRUEsSUFBTUksV0FBV0osUUFBUSxZQUFSLENBQWpCO0FBQ0EsSUFBTUssYUFBYUwsUUFBUSxjQUFSLENBQW5CO0FBQ0EsSUFBTU0sV0FBV04sUUFBUSxZQUFSLENBQWpCOztBQUVBTyxPQUFPQyxPQUFQLEdBQWlCSixTQUFTSyxNQUFULENBQWdCO0FBQ2hDQyxLQUFJO0FBQ0hDLFNBQU8sYUFESjtBQUVIQyxhQUFXLGdCQUZSO0FBR0hDLGVBQWEsc0JBSFY7QUFJSEMsWUFBVSxpQkFKUDtBQUtIQyxhQUFXLGtCQUxSO0FBTUhDLGFBQVcsa0JBTlI7QUFPSEMsV0FBUyxnQkFQTjtBQVFIQyxXQUFTLGdCQVJOO0FBU0hDLFVBQVEsZUFUTDtBQVVIQyxPQUFLLFlBVkY7QUFXSEMsbUJBQWlCLHNCQVhkO0FBWUhDLFlBQVUsV0FaUDtBQWFIQyxpQkFBZSxxQkFiWjtBQWNIQyxnQkFBYyxtQkFkWDtBQWVIQyxrQkFBZ0IseUJBZmI7QUFn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b3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgbW9tZW50ID0gcmVxdWlyZShcIm1vbWVudFwiKTtcbmNvbnN0IHBpa2FkYXkgPSByZXF1aXJlKFwicGlrYWRheVwiKTtcblxuY29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuXG5jb25zdCBCaWdNb2RhbCA9IHJlcXVpcmUoXCIuL2JpZ01vZGFsXCIpO1xuY29uc3QgRXZlbnRNb2RlbCA9IHJlcXVpcmUoXCIuL2V2ZW50TW9kZWxcIik7XG5jb25zdCBTZWxlY3RyYSA9IHJlcXVpcmUoXCIuL3NlbGVjdHJhXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJpZ01vZGFsLmV4dGVuZCh7XG5cdHVpOiB7XG5cdFx0dGl0bGU6IFwiaW5wdXQjdGl0bGVcIixcblx0XHRldmVudEljb246IFwiZGl2LmV2ZW50LWljb25cIixcblx0XHRkZXNjcmlwdGlvbjogXCJ0ZXh0YXJlYSNkZXNjcmlwdGlvblwiLFxuXHRcdGxvY2F0aW9uOiBcInNlbGVjdCNsb2NhdGlvblwiLFxuXHRcdHN0YXJ0RGF0ZTogXCJpbnB1dCNzdGFydC1kYXRlXCIsXG5cdFx0c3RhcnRUaW1lOiBcImlucHV0I3N0YXJ0LXRpbWVcIixcblx0XHRlbmREYXRlOiBcImlucHV0I2VuZC1kYXRlXCIsXG5cdFx0ZW5kVGltZTogXCJpbnB1dCNlbmQtdGltZVwiLFxuXHRcdGFsbERheTogXCJpbnB1dCNhbGwtZGF5XCIsXG5cdFx0Z2FwOiBcInNlbGVjdCNnYXBcIixcblx0XHRyZXBlYXRGcmVxdWVuY3k6IFwiZGl2LnJlcGVhdC1mcmVxdWVuY3lcIixcblx0XHRpbnRlcnZhbDogXCIjaW50ZXJ2YWxcIixcblx0XHRpbnRlcnZhbExhYmVsOiBcInNwYW4uaW50ZXJ2YWwtbGFiZWxcIixcblx0XHR3ZWVrbHlSZXBlYXQ6IFwiZGl2LndlZWtseS1yZXBlYXRcIixcblx0XHRyZXBlYXRXZWVrZGF5czogXCJzZWxlY3QjcmVwZWF0LXdlZWstZGF5c1wiLFxuXHRcdG1vbnRobHlSZXBlYXQ6IFwiZGl2Lm1vbnRobHktcmVwZWF0XCIsXG5cdFx0cmVwZWF0TW9udGhUeXBlOiBcInNlbGVjdCNyZXBlYXQtbW9udGgtdHlwZVwiLFxuXHRcdG1vbnRobHlSZXBlYXRMYWJlbDogXCJzcGFuLm1vbnRobHktcmVwZWF0LWxhYmVsXCIsXG5cdFx0cmVwZWF0RW5kOiBcImRpdi5yZXBlYXQtZW5kXCIsXG5cdFx0dW50aWw6IFwic2VsZWN0I3VudGlsXCIsXG5cdFx0dW50aWxEYXRlOiBcImlucHV0I3VudGlsLWRhdGVcIixcblx0XHR1bnRpbENvdW50OiBcImlucHV0I3VudGlsLWNvdW50XCIsXG5cdFx0cmVwZWF0SW5mbzogXCJkaXYuaW5mby5yZXBlYXRcIixcblx0XHRldmVyeW9uZTogXCJpbnB1dCNldmVyeW9uZVwiLFxuXHRcdGF1ZGllbmNlOiBcInNlbGVjdCNhdWRpZW5jZVwiLFxuXHRcdHRhZ3M6IFwic2VsZWN0I3RhZ3NcIixcblx0XHRzdWJDYWxlbmRhckxhYmVsOiBcImxhYmVsLnN1Yi1jYWxlbmRhci1sYWJlbFwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmV2ZW50SWNvblwiOiBcIm9uRXZlbnRJY29uQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5hbGxEYXlcIjogXCJvbkFsbERheUNsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkuZXZlcnlvbmVcIjogXCJvbkV2ZXJ5b25lQ2xpY2tcIixcblx0XHRcImNoYW5nZSBAdWkuc3RhcnREYXRlXCI6IFwib25TdGFydERhdGVDaGFuZ2VcIixcblx0XHRcImNoYW5nZSBAdWkuc3RhcnRUaW1lXCI6IFwib25TdGFydFRpbWVDaGFuZ2VcIixcblx0XHRcImNoYW5nZSBAdWkuZW5kVGltZVwiOiBcIm9uRW5kVGltZUNoYW5nZVwiLFxuXHRcdFwiY2hhbmdlIEB1aS5nYXBcIjogXCJvbkdhcENoYW5nZVwiLFxuXHRcdFwiY2hhbmdlIEB1aS5yZXBlYXRNb250aFR5cGVcIjogXCJvblJlcGVhdE1vbnRoVHlwZUNoYW5nZVwiLFxuXHRcdFwiY2hhbmdlIEB1aS51bnRpbFwiOiBcIm9uVW50aWxDaGFuZ2VcIixcblx0fSxcblxuXHRhY3Rpb25zOiB7XG5cdFx0Y3JlYXRlQW5vdGhlcjogXCJvbkNyZWF0ZUFub3RoZXJcIixcblx0fSxcblxuXHRlcnJvck1hcDoge1xuXHRcdHRpdGxlOiB7XG5cdFx0XHRwb3NpdGlvbjogXCJib3R0b21cIixcblx0XHR9LFxuXHRcdHN0YXJ0RGF0ZToge1xuXHRcdFx0cG9zaXRpb246IFwidG9wXCIsXG5cdFx0fSxcblx0XHRlbmREYXRlOiB7XG5cdFx0XHRwb3NpdGlvbjogXCJib3R0b21cIixcblx0XHR9LFxuXHRcdGdhcDoge1xuXHRcdFx0cG9zaXRpb246IFwicmlnaHRcIixcblx0XHR9LFxuXHRcdHVudGlsRGF0ZToge1xuXHRcdFx0cG9zaXRpb246IFwicmlnaHRcIixcblx0XHR9LFxuXHRcdHVudGlsQ291bnQ6IHtcblx0XHRcdHBvc2l0aW9uOiBcInJpZ2h0XCIsXG5cdFx0fSxcblx0XHR1bnRpbDoge1xuXHRcdFx0cG9zaXRpb246IFwidG9wXCIsXG5cdFx0fSxcblx0XHR0YWdzOiB7XG5cdFx0XHRhdHRyYWN0aW9uRWxlbWVudDogXCJzdWJDYWxlbmRhckxhYmVsXCIsXG5cdFx0XHRwb3NpdGlvbjogXCJ0b3BcIixcblx0XHR9LFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdF8uYmluZEFsbCh0aGlzKTtcblxuXHRcdHRoaXMuT3B0aW9ucyA9IHtcblx0XHRcdGNsYXNzZXM6IFtcImV2ZW50LW1vZGFsXCJdLFxuXHRcdFx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9ldmVudE1vZGFsLm51bmpcIikuY29udGVudCxcblx0XHRcdGJ1dHRvbnM6IHtcblx0XHRcdFx0Y3JlYXRlOiB7XG5cdFx0XHRcdFx0dHlwZTogXCJhY2NlcHRcIixcblx0XHRcdFx0XHRsYWJlbDogXCJDcmVhdGUgJiBDbG9zZVwiLFxuXHRcdFx0XHRcdG1vZGU6IFwiY3JlYXRlXCIsXG5cdFx0XHRcdFx0c2F2ZTogdHJ1ZSxcblx0XHRcdFx0XHR2YWxpZGF0ZTogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0Y3JlYXRlQW5vdGhlcjoge1xuXHRcdFx0XHRcdHR5cGU6IFwiYWNjZXB0XCIsXG5cdFx0XHRcdFx0bGFiZWw6IFwiQ3JlYXRlXCIsXG5cdFx0XHRcdFx0bW9kZTogXCJjcmVhdGVcIixcblx0XHRcdFx0XHRzYXZlOiB0cnVlLFxuXHRcdFx0XHRcdHZhbGlkYXRlOiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHR1cGRhdGU6IHtcblx0XHRcdFx0XHR0eXBlOiBcImFjY2VwdFwiLFxuXHRcdFx0XHRcdGxhYmVsOiBcIlVwZGF0ZVwiLFxuXHRcdFx0XHRcdG1vZGU6IFwiZWRpdFwiLFxuXHRcdFx0XHRcdHNhdmU6IHRydWUsXG5cdFx0XHRcdFx0dmFsaWRhdGU6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGRlbGV0ZToge1xuXHRcdFx0XHRcdHR5cGU6IFwiZGVsZXRlXCIsXG5cdFx0XHRcdFx0bGFiZWw6IFwiRGVsZXRlXCIsXG5cdFx0XHRcdFx0bW9kZTogXCJlZGl0XCIsXG5cdFx0XHRcdFx0Y29uZmlybTogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0Y2FuY2VsOiB7XG5cdFx0XHRcdFx0dHlwZTogXCJjYW5jZWxcIixcblx0XHRcdFx0XHRsYWJlbDogXCJDYW5jZWxcIixcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XHRkYXRhTm91bjogXCJldmVudFwiICsgKHRoaXMubW9kZWwuaXNOZXcoKSA/IFwiXCIgOiBcIjogXCIgKyB0aGlzLm1vZGVsLmdldChcInRpdGxlXCIpKSxcblx0XHRcdGVkaXRWZXJiOiBcIkNoYW5nZVwiLFxuXHRcdH07XG5cblx0XHR0aGlzLnVpID0gXy5leHRlbmQodGhpcy51aSwgQmlnTW9kYWwucHJvdG90eXBlLnVpKTtcblx0XHR0aGlzLmV2ZW50cyA9IF8uZXh0ZW5kKHRoaXMuZXZlbnRzLCBCaWdNb2RhbC5wcm90b3R5cGUuZXZlbnRzKTtcblxuXHRcdEJpZ01vZGFsLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyk7XG5cdH0sXG5cblx0cmVuZGVyRm9ybTogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgbW9kZWxJc05ldyA9IHRoaXMubW9kZWwuaXNOZXcoKTtcblxuXHRcdGNvbnN0IHZhbHVlcyA9IG1vZGVsSXNOZXcgPyB7fSA6IHRoaXMubW9kZWwudG9KU09OKCk7XG5cblx0XHRpZiAoIXZhbHVlcy5yZXBlYXRPcHRzKVxuXHRcdFx0dmFsdWVzLnJlcGVhdE9wdHMgPSB7fTtcblxuXHRcdGNvbnN0IHN0YXJ0ID0gdGhpcy5tb2RlbC5oYXMoXCJzdGFydFwiKSA/IG1vbWVudC51bml4KHRoaXMubW9kZWwuZ2V0KFwic3RhcnRcIikpIDogbW9tZW50KCk7XG5cdFx0bGV0IGVuZCA9IHRoaXMubW9kZWwuaGFzKFwiZW5kXCIpID8gbW9tZW50LnVuaXgodGhpcy5tb2RlbC5nZXQoXCJlbmRcIikpIDogbW9tZW50KHN0YXJ0KTtcblx0XHRsZXQgdW50aWwgPSBlbmQ7XG5cdFx0bGV0IGNvdW50ID0gMTtcblxuXHRcdGlmIChtb2RlbElzTmV3KSB7XG5cdFx0XHRzdGFydC5zdGFydE9mKFwiZGF5XCIpLmFkZCg4LCBcImhcIik7XG5cdFx0XHRlbmQgPSBtb21lbnQoc3RhcnQpLmFkZCgzMCwgXCJtXCIpO1xuXHRcdFx0dW50aWwgPSBlbmQ7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKHRoaXMubW9kZWwuZ2V0KFwicmVwZWF0XCIpICYmIHRoaXMubW9kZWwuZ2V0KFwicmVwZWF0T3B0c1wiKS51bnRpbCA9PT0gXCJkYXRlXCIpIHtcblx0XHRcdHVudGlsID0gbW9tZW50LnVuaXgodGhpcy5tb2RlbC5nZXQoXCJyZXBlYXRPcHRzXCIpLmVuZCk7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKHRoaXMubW9kZWwuZ2V0KFwicmVwZWF0XCIpICYmIHRoaXMubW9kZWwuZ2V0KFwicmVwZWF0T3B0c1wiKS51bnRpbCA9PT0gXCJpbnN0YW5jZXNcIikge1xuXHRcdFx0Y291bnQgPSB0aGlzLm1vZGVsLmdldChcInJlcGVhdE9wdHNcIikuZW5kO1xuXHRcdH1cblxuXHRcdC8vIFN0eWxlIGFuZCBwb3B1bGF0ZSB0aGUgc3RhcnRpbmcgYW5kIGVuZGluZyBkYXRlcyBhbmQgdGltZSBpbnB1dHNcblx0XHRjb25zdCBkYXRlRm9ybWF0ID0gXCJERCBNTU0gWVlZWVwiO1xuXHRcdGNvbnN0IHRpbWVGb3JtYXQgPSBcIkhIOm1tXCI7XG5cblx0XHR0aGlzLnVpLnN0YXJ0RGF0ZS52YWwoc3RhcnQuZm9ybWF0KGRhdGVGb3JtYXQpKTtcblx0XHR0aGlzLnVpLmVuZERhdGUudmFsKGVuZC5mb3JtYXQoZGF0ZUZvcm1hdCkpO1xuXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5ldy1jYXAsIG5vLW5ld1xuXHRcdHRoaXMuU3RhcnREYXRlUGlja2VyID0gbmV3IHBpa2FkYXkoe1xuXHRcdFx0ZmllbGQ6IHRoaXMudWkuc3RhcnREYXRlLmdldCgwKSxcblx0XHRcdGZvcm1hdDogZGF0ZUZvcm1hdCxcblx0XHRcdC8vXHRcdFx0bWluRGF0ZTogc3RhcnQudG9EYXRlKCksXG5cblx0XHRcdG9uU2VsZWN0OiAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHN0YXJ0RGF0ZSA9IG1vbWVudCh0aGlzLnVpLnN0YXJ0RGF0ZS52YWwoKSwgdGhpcy5EYXRlRm9ybWF0KS5ob3VyKDApLm1pbnV0ZSgwKS5zZWNvbmQoMCk7XG5cdFx0XHRcdGNvbnN0IGVuZERhdGUgPSBtb21lbnQodGhpcy51aS5lbmREYXRlLnZhbCgpLCB0aGlzLkRhdGVGb3JtYXQpLmhvdXIoMCkubWludXRlKDApLnNlY29uZCgwKTtcblx0XHRcdFx0Y29uc3QgcmVwZWF0RW5kID0gbW9tZW50KHRoaXMudWkudW50aWxEYXRlLnZhbCgpLCB0aGlzLkRhdGVGb3JtYXQpLmhvdXIoMCkubWludXRlKDApLnNlY29uZCgwKTtcblxuXHRcdFx0XHRpZiAoc3RhcnREYXRlLmlzQWZ0ZXIoZW5kRGF0ZSkpXG5cdFx0XHRcdFx0dGhpcy5FbmREYXRlUGlja2VyLnNldERhdGUoc3RhcnREYXRlLnRvRGF0ZSgpKTtcblxuXHRcdFx0XHRpZiAoc3RhcnREYXRlLmlzQWZ0ZXIocmVwZWF0RW5kKSlcblx0XHRcdFx0XHR0aGlzLlJlcGVhdEVuZERhdGVQaWNrZXIuc2V0RGF0ZShzdGFydERhdGUudG9EYXRlKCkpO1xuXG5cdFx0XHRcdHRoaXMudXBkYXRlVGltZUxlZnQoKTtcblxuXHRcdFx0XHQvL1x0XHRcdFx0dGhpcy5FbmREYXRlUGlja2VyLnNldE1pbkRhdGUoc3RhcnREYXRlLnRvRGF0ZSgpKTtcblx0XHRcdFx0dGhpcy5SZXBlYXRFbmREYXRlUGlja2VyLnNldE1pbkRhdGUoc3RhcnREYXRlLnRvRGF0ZSgpKTtcblx0XHRcdH0sXG5cdFx0fSk7XG5cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcCwgbm8tbmV3XG5cdFx0dGhpcy5FbmREYXRlUGlja2VyID0gbmV3IHBpa2FkYXkoe1xuXHRcdFx0ZmllbGQ6IHRoaXMudWkuZW5kRGF0ZS5nZXQoMCksXG5cdFx0XHRmb3JtYXQ6IGRhdGVGb3JtYXQsXG5cdFx0XHQvL1x0XHRcdG1pbkRhdGU6IGVuZC50b0RhdGUoKSxcblxuXHRcdFx0b25TZWxlY3Q6ICgpID0+IHtcblx0XHRcdFx0Y29uc3Qgc3RhcnREYXRlID0gbW9tZW50KHRoaXMudWkuc3RhcnREYXRlLnZhbCgpLCB0aGlzLkRhdGVGb3JtYXQpLmhvdXIoMCkubWludXRlKDApLnNlY29uZCgwKTtcblx0XHRcdFx0Y29uc3QgZW5kRGF0ZSA9IG1vbWVudCh0aGlzLnVpLmVuZERhdGUudmFsKCksIHRoaXMuRGF0ZUZvcm1hdCkuaG91cigwKS5taW51dGUoMCkuc2Vjb25kKDApO1xuXG5cdFx0XHRcdGlmIChzdGFydERhdGUuaXNBZnRlcihlbmREYXRlKSlcblx0XHRcdFx0XHR0aGlzLlN0YXJ0RGF0ZVBpY2tlci5zZXREYXRlKGVuZERhdGUudG9EYXRlKCkpO1xuXG5cdFx0XHRcdHRoaXMudXBkYXRlVGltZVJpZ2h0KCk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0dGhpcy51aS5zdGFydFRpbWUudmFsKHN0YXJ0LmZvcm1hdCh0aW1lRm9ybWF0KSkudGltZVBpY2tlcigpO1xuXHRcdHRoaXMudWkuZW5kVGltZS52YWwoZW5kLmZvcm1hdCh0aW1lRm9ybWF0KSkudGltZVBpY2tlcigpO1xuXG5cdFx0Ly8gU3R5bGUgdGhlIGV2ZW50IHJlcGV0aXRpb24gaW5wdXRzXG5cdFx0dGhpcy51aS5nYXAuY2hvc2VuKHtcblx0XHRcdGRpc2FibGVfc2VhcmNoOiB0cnVlLFxuXHRcdFx0d2lkdGg6IFwiMjAwcHhcIixcblx0XHR9KTtcblxuXHRcdGlmICghbW9kZWxJc05ldykge1xuXHRcdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwiYWxsRGF5XCIpKVxuXHRcdFx0XHR0aGlzLnVpLmFsbERheS50cmlnZ2VyKFwiY2xpY2tcIik7XG5cblx0XHRcdGlmICh0aGlzLm1vZGVsLmdldChcInJlcGVhdFwiKSkge1xuXHRcdFx0XHRjb25zdCByZXBlYXRPcHRpb25zID0gdGhpcy5tb2RlbC5nZXQoXCJyZXBlYXRPcHRzXCIpO1xuXG5cdFx0XHRcdHRoaXMudWkuZ2FwLnZhbChyZXBlYXRPcHRpb25zLmdhcCk7XG5cdFx0XHRcdHRoaXMudWkuZ2FwLnRyaWdnZXIoXCJjaG9zZW46dXBkYXRlZFwiKTtcblx0XHRcdFx0dGhpcy51aS5nYXAudHJpZ2dlcihcImNoYW5nZVwiKTtcblxuXHRcdFx0XHRzd2l0Y2ggKHJlcGVhdE9wdGlvbnMuZ2FwKSB7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRjYXNlIFwiZGF5XCI6XG5cdFx0XHRcdFx0XHR0aGlzLnVpLmludGVydmFsLnZhbChyZXBlYXRPcHRpb25zLmludGVydmFsKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSBcIndlZWtcIjpcblx0XHRcdFx0XHRcdHRoaXMudWkuaW50ZXJ2YWwudmFsKHJlcGVhdE9wdGlvbnMuaW50ZXJ2YWwpO1xuXHRcdFx0XHRcdFx0dGhpcy51aS5yZXBlYXRXZWVrZGF5cy52YWwocmVwZWF0T3B0aW9ucy53ZWVrRGF5cyk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgXCJtb250aFwiOlxuXHRcdFx0XHRcdFx0dGhpcy51aS5pbnRlcnZhbC52YWwocmVwZWF0T3B0aW9ucy5pbnRlcnZhbCk7XG5cdFx0XHRcdFx0XHR0aGlzLnVpLnJlcGVhdE1vbnRoVHlwZS52YWwocmVwZWF0T3B0aW9ucy5tb250aFN0eWxlKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSBcInllYXJcIjpcblx0XHRcdFx0XHRcdHRoaXMudWkuaW50ZXJ2YWwudmFsKHJlcGVhdE9wdGlvbnMuaW50ZXJ2YWwpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRzd2l0Y2ggKHJlcGVhdE9wdGlvbnMudW50aWwpIHtcblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdGNhc2UgXCJkYXRlXCI6XG5cdFx0XHRcdFx0XHR0aGlzLnVpLnVudGlsRGF0ZS52YWwobW9tZW50LnVuaXgocmVwZWF0T3B0aW9ucy5lbmQpLmZvcm1hdChcIkREIE1NTSBZWVlZXCIpKTtcblx0XHRcdFx0XHRcdHRoaXMudWkudW50aWwudmFsKFwiZGF0ZVwiKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSBcImluc3RhbmNlc1wiOlxuXHRcdFx0XHRcdFx0dGhpcy51aS51bnRpbENvdW50LnZhbChyZXBlYXRPcHRpb25zLmVuZCk7XG5cdFx0XHRcdFx0XHR0aGlzLnVpLnVudGlsLnZhbChcImluc3RhbmNlc1wiKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy51aS51bnRpbC50cmlnZ2VyKFwiY2hhbmdlXCIpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMudXBkYXRlSW50ZXJ2YWwoKTtcblxuXHRcdHRoaXMudWkucmVwZWF0V2Vla2RheXMuY2hvc2VuKHtcblx0XHRcdGRpc2FibGVfc2VhcmNoOiB0cnVlLFxuXHRcdFx0d2lkdGg6IFwiNTAlXCIsXG5cdFx0fSk7XG5cblx0XHR0aGlzLnVpLnJlcGVhdE1vbnRoVHlwZS5jaG9zZW4oe1xuXHRcdFx0ZGlzYWJsZV9zZWFyY2g6IHRydWUsXG5cdFx0XHR3aWR0aDogXCIxNTBweFwiLFxuXHRcdH0pO1xuXG5cdFx0Ly8gU3R5bGUgYW5kIHBvcHVsYXRlIHRoZSBldmVudCByZXBldGl0aW9uIHRlcm1pbmF0aW9uIGlucHV0c1xuXHRcdHRoaXMudWkudW50aWwuY2hvc2VuKHtcblx0XHRcdGRpc2FibGVfc2VhcmNoOiB0cnVlLFxuXHRcdFx0d2lkdGg6IFwiMTUwcHhcIixcblx0XHR9KTtcblxuXHRcdHRoaXMudWkudW50aWxEYXRlLnZhbCh1bnRpbC5mb3JtYXQoZGF0ZUZvcm1hdCkpO1xuXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5ldy1jYXAsIG5vLW5ld1xuXHRcdHRoaXMuUmVwZWF0RW5kRGF0ZVBpY2tlciA9IG5ldyBwaWthZGF5KHtcblx0XHRcdGZpZWxkOiB0aGlzLnVpLnVudGlsRGF0ZS5nZXQoMCksXG5cdFx0XHRmb3JtYXQ6IGRhdGVGb3JtYXQsXG5cdFx0XHRtaW5EYXRlOiBlbmQudG9EYXRlKCksXG5cdFx0fSk7XG5cblx0XHR0aGlzLnVpLnVudGlsQ291bnQudmFsKGNvdW50KTtcblxuXHRcdGNvbnN0IGxvY1NlcnZlciA9IHtcblx0XHRcdGZldGNoOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYWNhY2lhL2NhbGVuZGFyL2xvY2F0aW9uc1wiLFxuXHRcdFx0a2V5OiBcImxvY2F0aW9uXCIsXG5cdFx0XHR2YWx1ZTogXCJsb2NhdGlvblwiLFxuXHRcdH07XG5cblx0XHRpZiAoIXRoaXMubW9kZWwuaXNOZXcoKSAmJiB0aGlzLm1vZGVsLmdldChcImxvY2F0aW9uXCIpKSB7XG5cdFx0XHRsb2NTZXJ2ZXIuZGVmYXVsdCA9IHtcblx0XHRcdFx0a2V5OiB0aGlzLm1vZGVsLmdldChcImxvY2F0aW9uXCIpLFxuXHRcdFx0XHR2YWx1ZTogdGhpcy5tb2RlbC5nZXQoXCJsb2NhdGlvblwiKSxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Y29uc3QgbG9jYXRpb25zID0gbmV3IFNlbGVjdHJhKHtcblx0XHRcdHNlcnZlcjogbG9jU2VydmVyLFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdHBhZ2VTaXplOiAzMCxcblx0XHRcdFx0aW5maW5pdGU6IHRydWUsXG5cdFx0XHR9LFxuXHRcdFx0cGxhY2Vob2xkZXI6IFwiQ2hvb3NlIHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJzXCIsXG5cdFx0XHRkZEhvc3Q6IFwiLm1vZGFsLWNvbnRhaW5lclwiLFxuXHRcdFx0YWxsb3dDcmVhdGlvbjoge1xuXHRcdFx0XHRtb2RlOiBcIm5vbWF0Y2hcIixcblx0XHRcdFx0dGV4dDogXCJBZGQgbmV3IGV2ZW50XCIsXG5cdFx0XHR9LFxuXHRcdFx0c2luZ2xlRGVzZWxlY3Q6IHRydWUsXG5cdFx0fSk7XG5cblx0XHRsb2NhdGlvbnMuc2hvdyh7IGVsOiB0aGlzLnVpLmxvY2F0aW9uIH0pO1xuXG5cdFx0Y29uc3QgYXVkU2VydmVyID0ge1xuXHRcdFx0ZmV0Y2g6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hY2FjaWEvY2FsZW5kYXIvYXVkaWVuY2VcIixcblx0XHR9O1xuXG5cdFx0aWYgKCF0aGlzLm1vZGVsLmlzTmV3KCkpIHtcblx0XHRcdGF1ZFNlcnZlci5kZWZhdWx0ID0ge1xuXHRcdFx0XHRmZXRjaDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FjYWNpYS9jYWxlbmRhci9hdWRpZW5jZS9cIiArIHRoaXMubW9kZWwuaWQsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdHRoaXMuYXVkaWVuY2UgPSBuZXcgU2VsZWN0cmEoe1xuXHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRzZXJ2ZXI6IGF1ZFNlcnZlcixcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRwYWdlU2l6ZTogMzAsXG5cdFx0XHRcdGluZmluaXRlOiB0cnVlLFxuXHRcdFx0fSxcblx0XHRcdHBsYWNlaG9sZGVyOiBcIkNob29zZSB3aG8gY2FuIHNlZSB0aGlzIGV2ZW50XCIsXG5cdFx0XHRkZEhvc3Q6IFwiLm1vZGFsLWNvbnRhaW5lclwiLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5hdWRpZW5jZS5zaG93KHsgZWw6IHRoaXMudWkuYXVkaWVuY2UgfSk7XG5cblx0XHRpZiAoIW1vZGVsSXNOZXcgJiYgdGhpcy5tb2RlbC5oYXMoXCJhY2Nlc3NcIikpIHtcblx0XHRcdGlmICh0aGlzLm1vZGVsLmdldChcImFjY2Vzc1wiKS5sZW5ndGggPT09IDEgJiYgdGhpcy5tb2RlbC5nZXQoXCJhY2Nlc3NcIilbMF0gPT09IFwiYWxsXCIpXG5cdFx0XHRcdHRoaXMudWkuZXZlcnlvbmUucHJvcChcImNoZWNrZWRcIiwgdHJ1ZSk7XG5cblx0XHRcdHRoaXMudXBkYXRlQXVkaWVuY2UoKTtcblx0XHR9XG5cblx0XHRjb25zdCB0YWdTZXJ2ZXIgPSB7XG5cdFx0XHRmZXRjaDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FjYWNpYS9jYWxlbmRhci90YWdzXCIsXG5cdFx0XHRrZXk6IFwidGFnXCIsXG5cdFx0XHR2YWx1ZTogXCJ0YWdcIixcblx0XHR9O1xuXG5cdFx0aWYgKCF0aGlzLm1vZGVsLmlzTmV3KCkpIHtcblx0XHRcdHRhZ1NlcnZlci5kZWZhdWx0ID0ge1xuXHRcdFx0XHRrZXk6IF8uZmlyc3QodGhpcy5tb2RlbC5nZXQoXCJ0YWdzXCIpKSxcblx0XHRcdFx0dmFsdWU6IF8uZmlyc3QodGhpcy5tb2RlbC5nZXQoXCJ0YWdzXCIpKSxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Y29uc3QgdGFncyA9IG5ldyBTZWxlY3RyYSh7XG5cdFx0XHRzZXJ2ZXI6IHRhZ1NlcnZlcixcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRwYWdlU2l6ZTogMzAsXG5cdFx0XHRcdGluZmluaXRlOiB0cnVlLFxuXHRcdFx0fSxcblx0XHRcdHBsYWNlaG9sZGVyOiBcIkNob29zZSB0aGUgdGFncyBmb3IgdGhpcyBldmVudFwiLFxuXHRcdFx0ZGRIb3N0OiBcIi5tb2RhbC1jb250YWluZXJcIixcblx0XHRcdGFsbG93Q3JlYXRpb246IHtcblx0XHRcdFx0bW9kZTogXCJub21hdGNoXCIsXG5cdFx0XHRcdHRleHQ6IFwiQWRkIG5ldyB0YWdcIixcblx0XHRcdH0sXG5cdFx0XHRzaW5nbGVEZXNlbGVjdDogdHJ1ZSxcblx0XHR9KTtcblxuXHRcdHRhZ3Muc2hvdyh7IGVsOiB0aGlzLnVpLnRhZ3MgfSk7XG5cdH0sXG5cblx0b25BbGxEYXlDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMudWkuYWxsRGF5LnByb3AoXCJjaGVja2VkXCIpKSB7XG5cdFx0XHR0aGlzLnVpLnN0YXJ0VGltZS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLnVpLmVuZFRpbWUuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMudWkuc3RhcnRUaW1lLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHRoaXMudWkuZW5kVGltZS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0fVxuXHR9LFxuXG5cdG9uT25jZUNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVwZGF0ZVJlcGVhdEZyZXF1ZW5jeSgpO1xuXG5cdFx0aWYgKHRoaXMudWkuZ2FwLnZhbCgpID09PSBcIm9uY2VcIikge1xuXHRcdFx0dGhpcy51aS5yZXBlYXRFbmQuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0dGhpcy51aS5yZXBlYXRJbmZvLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdC8vdGhpcy51aS5nYXAucHJvcChcImRpc2FibGVkXCIsIHRydWUpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMudWkucmVwZWF0RW5kLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHRoaXMudWkucmVwZWF0SW5mby5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHQvL3RoaXMudWkuZ2FwLnByb3AoXCJkaXNhYmxlZFwiLCBmYWxzZSk7XG5cdFx0fVxuXG5cdFx0dGhpcy51aS5nYXAudHJpZ2dlcihcImNob3Nlbjp1cGRhdGVkXCIpO1xuXHR9LFxuXG5cdG9uRXZlcnlvbmVDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51cGRhdGVBdWRpZW5jZSgpO1xuXHR9LFxuXG5cdG9uU3RhcnREYXRlQ2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVwZGF0ZU1vbnRobHlSZXBlYXRMYWJlbCgpO1xuXHR9LFxuXG5cdHBhcnNlRXZlbnREdXJhdGlvbkJvdW5kczogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHN0YXJ0OiB0aGlzLnBhcnNlVGltZUlucHV0KHRoaXMudWkuc3RhcnRUaW1lLCB0aGlzLnBhcnNlRGF0ZUlucHV0KHRoaXMudWkuc3RhcnREYXRlKSksXG5cdFx0XHRlbmQ6IHRoaXMucGFyc2VUaW1lSW5wdXQodGhpcy51aS5lbmRUaW1lLCB0aGlzLnBhcnNlRGF0ZUlucHV0KHRoaXMudWkuZW5kRGF0ZSkpLFxuXHRcdH07XG5cdH0sXG5cblx0dXBkYXRlVGltZUxlZnQ6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGR1cmF0aW9uID0gdGhpcy5wYXJzZUV2ZW50RHVyYXRpb25Cb3VuZHMoKTtcblxuXHRcdGlmIChkdXJhdGlvbi5zdGFydC5pc1NhbWUoZHVyYXRpb24uZW5kKSB8fCBkdXJhdGlvbi5zdGFydC5pc0FmdGVyKGR1cmF0aW9uLmVuZCkpIHtcblx0XHRcdGNvbnN0IG5ld0VuZCA9IG1vbWVudChkdXJhdGlvbi5zdGFydCkuYWRkKDMwLCBcIm1cIik7XG5cdFx0XHR0aGlzLnVpLmVuZFRpbWUudmFsKG5ld0VuZC5mb3JtYXQoXCJISDptbVwiKSk7XG5cdFx0XHR0aGlzLkVuZERhdGVQaWNrZXIuc2V0RGF0ZShuZXdFbmQudG9EYXRlKCkpO1xuXHRcdH1cblx0fSxcblxuXHR1cGRhdGVUaW1lUmlnaHQ6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGR1cmF0aW9uID0gdGhpcy5wYXJzZUV2ZW50RHVyYXRpb25Cb3VuZHMoKTtcblxuXHRcdGlmIChkdXJhdGlvbi5zdGFydC5pc1NhbWUoZHVyYXRpb24uZW5kKSB8fCBkdXJhdGlvbi5zdGFydC5pc0FmdGVyKGR1cmF0aW9uLmVuZCkpIHtcblx0XHRcdGNvbnN0IG5ld1N0YXJ0ID0gbW9tZW50KGR1cmF0aW9uLnN0YXJ0KS5zdWJ0cmFjdCgzMCwgXCJtXCIpO1xuXHRcdFx0dGhpcy51aS5zdGFydFRpbWUudmFsKG5ld1N0YXJ0LmZvcm1hdChcIkhIOm1tXCIpKTtcblx0XHRcdHRoaXMuU3RhcnREYXRlUGlja2VyLnNldERhdGUobmV3U3RhcnQudG9EYXRlKCkpO1xuXHRcdH1cblx0fSxcblxuXHRvblN0YXJ0VGltZUNoYW5nZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51cGRhdGVUaW1lTGVmdCgpO1xuXHR9LFxuXG5cdG9uRW5kVGltZUNoYW5nZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51cGRhdGVUaW1lUmlnaHQoKTtcblx0fSxcblxuXHRvbkdhcENoYW5nZTogZnVuY3Rpb24oKSB7XG5cdFx0Ly9pZih0aGlzLnVpLmdhcC52YWwoKSA9PSBcIm9uY2VcIilcblx0XHR0aGlzLm9uT25jZUNsaWNrKCk7XG5cblx0XHR0aGlzLnVwZGF0ZUludGVydmFsKCk7XG5cdFx0dGhpcy51cGRhdGVSZXBlYXRGcmVxdWVuY3koKTtcblxuXHRcdGlmICh0aGlzLnVpLmdhcC52YWwoKSA9PT0gXCJ3ZWVrXCIpIHtcblx0XHRcdHRoaXMudWkubW9udGhseVJlcGVhdC5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLnVpLndlZWtseVJlcGVhdC5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKHRoaXMudWkuZ2FwLnZhbCgpID09PSBcIm1vbnRoXCIpIHtcblx0XHRcdHRoaXMudWkud2Vla2x5UmVwZWF0LmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHRoaXMudWkubW9udGhseVJlcGVhdC5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKHRoaXMudWkuZ2FwLnZhbCgpID09PSBcInllYXJcIikge1xuXHRcdFx0Y29uc3Qgc3RhcnREYXRlID0gbW9tZW50KHRoaXMudWkuc3RhcnREYXRlLnZhbCgpLCB0aGlzLkRhdGVGb3JtYXQpLmhvdXIoMCkubWludXRlKDApLnNlY29uZCgwKTtcblxuXHRcdFx0aWYgKHRoaXMuUmVwZWF0RW5kRGF0ZVBpY2tlcilcblx0XHRcdFx0dGhpcy5SZXBlYXRFbmREYXRlUGlja2VyLnNldERhdGUoc3RhcnREYXRlLmFkZCgxLCBcInlcIikudG9EYXRlKCkpO1xuXG5cdFx0XHR0aGlzLnVpLndlZWtseVJlcGVhdC5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLnVpLm1vbnRobHlSZXBlYXQuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMudWkud2Vla2x5UmVwZWF0LmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHRoaXMudWkubW9udGhseVJlcGVhdC5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0fVxuXHR9LFxuXG5cdG9uUmVwZWF0TW9udGhUeXBlQ2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVwZGF0ZU1vbnRobHlSZXBlYXRMYWJlbCgpO1xuXHR9LFxuXG5cdG9uVW50aWxDaGFuZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdHN3aXRjaCAodGhpcy51aS51bnRpbC52YWwoKSkge1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdGNhc2UgXCJkYXRlXCI6XG5cdFx0XHRcdHRoaXMudWkudW50aWxDb3VudC5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHRcdHRoaXMudWkudW50aWxEYXRlLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJpbnN0YW5jZXNcIjpcblx0XHRcdFx0dGhpcy51aS51bnRpbERhdGUuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0XHR0aGlzLnVpLnVudGlsQ291bnQucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH0sXG5cblx0cGFyc2VEYXRlSW5wdXQ6IGZ1bmN0aW9uKGlucHV0KSB7XG5cdFx0cmV0dXJuIG1vbWVudChpbnB1dC52YWwoKSwgXCJERCBNTU0gWVlZWVwiKS5ob3VyKDApLm1pbnV0ZSgwKS5zZWNvbmQoMCk7XG5cdH0sXG5cblx0cGFyc2VUaW1lSW5wdXQ6IGZ1bmN0aW9uKGlucHV0LCBkYXRlVGltZSkge1xuXHRcdGNvbnN0IHRpbWUgPSBtb21lbnQoaW5wdXQudmFsKCksIFwiSEg6bW1cIik7XG5cblx0XHRkYXRlVGltZS5ob3VyKHRpbWUuaG91cigpKS5taW51dGUodGltZS5taW51dGUoKSkuc2Vjb25kKDApO1xuXG5cdFx0cmV0dXJuIGRhdGVUaW1lO1xuXHR9LFxuXG5cdGFzc2VtYmxlRGF0YTogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgZGF0YSA9IHt9O1xuXG5cdFx0Ly8gUGFyc2UgdGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcgZGF0ZSBhbmQgdGltZSBpbnB1dHNcblx0XHRjb25zdCBzdGFydCA9IHRoaXMucGFyc2VEYXRlSW5wdXQodGhpcy51aS5zdGFydERhdGUpO1xuXHRcdGNvbnN0IGVuZCA9IHRoaXMucGFyc2VEYXRlSW5wdXQodGhpcy51aS5lbmREYXRlKS5ob3VyKDIzKS5taW51dGUoNTkpO1xuXHRcdGNvbnN0IGFsbERheSA9IHRoaXMudWkuYWxsRGF5LnByb3AoXCJjaGVja2VkXCIpO1xuXG5cdFx0aWYgKCFhbGxEYXkgJiYgc3RhcnQgJiYgZW5kKSB7XG5cdFx0XHR0aGlzLnBhcnNlVGltZUlucHV0KHRoaXMudWkuc3RhcnRUaW1lLCBzdGFydCk7XG5cdFx0XHR0aGlzLnBhcnNlVGltZUlucHV0KHRoaXMudWkuZW5kVGltZSwgZW5kKTtcblx0XHR9XG5cblx0XHQvLyBQYXJzZSB0aGUgcmVwZWF0IHNwZWNpZmljYXRpb25cblx0XHRjb25zdCByZXBlYXQgPSB0aGlzLnVpLmdhcC52YWwoKSAhPT0gXCJvbmNlXCI7XG5cdFx0Y29uc3QgcmVwZWF0T3B0aW9ucyA9IHt9O1xuXG5cdFx0aWYgKHJlcGVhdCkge1xuXHRcdFx0cmVwZWF0T3B0aW9ucy5nYXAgPSB0aGlzLnVpLmdhcC52YWwoKTtcblx0XHRcdHJlcGVhdE9wdGlvbnMuaW50ZXJ2YWwgPSBwYXJzZUludCh0aGlzLnVpLmludGVydmFsLnZhbCgpLCAxMCk7XG5cblx0XHRcdHN3aXRjaCAocmVwZWF0T3B0aW9ucy5nYXApIHtcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0Y2FzZSBcImRheVwiOlxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJ3ZWVrZGF5XCI6XG5cdFx0XHRcdFx0cmVwZWF0T3B0aW9ucy5pbnRlcnZhbCA9IDE7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBcIndlZWtcIjpcblx0XHRcdFx0XHRyZXBlYXRPcHRpb25zLndlZWtEYXlzID0gXy5tYXAoXy5jb21wYWN0KHRoaXMudWkucmVwZWF0V2Vla2RheXMudmFsKCkgfHwgW10pLCBpID0+IE51bWJlcihpKSkuc29ydCgpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJtb250aFwiOlxuXHRcdFx0XHRcdHJlcGVhdE9wdGlvbnMubW9udGhTdHlsZSA9IHRoaXMudWkucmVwZWF0TW9udGhUeXBlLnZhbCgpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJ5ZWFyXCI6XG5cdFx0XHRcdFx0cmVwZWF0T3B0aW9ucy5pbnRlcnZhbCA9IDE7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cblx0XHRcdHJlcGVhdE9wdGlvbnMudW50aWwgPSB0aGlzLnVpLnVudGlsLnZhbCgpO1xuXG5cdFx0XHRzd2l0Y2ggKHJlcGVhdE9wdGlvbnMudW50aWwpIHtcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0Y2FzZSBcImRhdGVcIjpcblx0XHRcdFx0XHRyZXBlYXRPcHRpb25zLmVuZCA9XG5cdFx0XHRcdFx0XHRtb21lbnQodGhpcy51aS51bnRpbERhdGUudmFsKCksIFwiREQgTU1NIFlZWVlcIilcblx0XHRcdFx0XHRcdFx0LmhvdXIoc3RhcnQuaG91cigpKVxuXHRcdFx0XHRcdFx0XHQubWludXRlKHN0YXJ0Lm1pbnV0ZSgpKVxuXHRcdFx0XHRcdFx0XHQudW5peCgpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgXCJpbnN0YW5jZXNcIjpcblx0XHRcdFx0XHRyZXBlYXRPcHRpb25zLmVuZCA9IHBhcnNlSW50KHRoaXMudWkudW50aWxDb3VudC52YWwoKSwgMTApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgYXR0cmlidXRlcyB0aGF0IHdpbGwgYmUgc2F2ZWRcblx0XHRkYXRhLmF0dHJpYnV0ZXMgPSB7XG5cdFx0XHRhY2Nlc3M6IHRoaXMudWkuZXZlcnlvbmUucHJvcChcImNoZWNrZWRcIikgPyBbXCJhbGxcIl0gOiAodGhpcy51aS5hdWRpZW5jZS52YWwoKSB8fCBbXSksXG5cdFx0XHRhbGxEYXk6IGFsbERheSxcblx0XHRcdGRlc2M6IHRoaXMudWkuZGVzY3JpcHRpb24udmFsKCksXG5cdFx0XHRlbmQ6IGVuZC51bml4KCksXG5cdFx0XHRsb2NhdGlvbjogdGhpcy51aS5sb2NhdGlvbi52YWwoKSxcblx0XHRcdHJlcGVhdDogcmVwZWF0LFxuXHRcdFx0cmVwZWF0T3B0czogcmVwZWF0ID8gcmVwZWF0T3B0aW9ucyA6IG51bGwsXG5cdFx0XHRzdGFydDogc3RhcnQudW5peCgpLFxuXHRcdFx0dGFnczogdGhpcy51aS50YWdzLnZhbCgpID8gW3RoaXMudWkudGFncy52YWwoKV0gOiBbXSxcblx0XHRcdHRpdGxlOiB0aGlzLnVpLnRpdGxlLnZhbCgpLFxuXHRcdH07XG5cblx0XHRyZXR1cm4gZGF0YTtcblx0fSxcblxuXHR1cGRhdGVSZXBlYXRGcmVxdWVuY3k6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLnVpLmdhcC52YWwoKSA9PT0gXCJvbmNlXCIgfHwgdGhpcy51aS5nYXAudmFsKCkgPT09IFwid2Vla2RheVwiIHx8IHRoaXMudWkuZ2FwLnZhbCgpID09PSBcInllYXJcIilcblx0XHRcdHRoaXMudWkucmVwZWF0RnJlcXVlbmN5LmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnVpLnJlcGVhdEZyZXF1ZW5jeS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0dXBkYXRlSW50ZXJ2YWw6IGZ1bmN0aW9uKCkge1xuXHRcdGxldCBpbnRlcnZhbE1heCA9IDA7XG5cblx0XHRzd2l0Y2ggKHRoaXMudWkuZ2FwLnZhbCgpKSB7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0Y2FzZSBcImRheVwiOlxuXHRcdFx0XHR0aGlzLnVpLmludGVydmFsTGFiZWwudGV4dChcImRheXNcIik7XG5cdFx0XHRcdGludGVydmFsTWF4ID0gMzA7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwid2Vla1wiOlxuXHRcdFx0XHR0aGlzLnVpLmludGVydmFsTGFiZWwudGV4dChcIndlZWtzXCIpO1xuXHRcdFx0XHRpbnRlcnZhbE1heCA9IDUyO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcIm1vbnRoXCI6XG5cdFx0XHRcdHRoaXMudWkuaW50ZXJ2YWxMYWJlbC50ZXh0KFwibW9udGhzXCIpO1xuXHRcdFx0XHRpbnRlcnZhbE1heCA9IDEyO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHR0aGlzLnVpLmludGVydmFsLmF0dHIoXCJtYXhcIiwgaW50ZXJ2YWxNYXgpO1xuXHRcdGlmICh0aGlzLnVpLmludGVydmFsLnZhbCgpID4gaW50ZXJ2YWxNYXgpXG5cdFx0XHR0aGlzLnVpLmludGVydmFsLnZhbChpbnRlcnZhbE1heCk7XG5cdH0sXG5cblx0dXBkYXRlTW9udGhseVJlcGVhdExhYmVsOiBmdW5jdGlvbigpIHtcblx0XHRsZXQgc3RhcnREYXRlID0gbW9tZW50KHRoaXMudWkuc3RhcnREYXRlLnZhbCgpLCBcIkREIE1NTSBZWVlZXCIpO1xuXG5cdFx0c3dpdGNoICh0aGlzLnVpLnJlcGVhdE1vbnRoVHlwZS52YWwoKSkge1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdGNhc2UgXCJkYXlvZm1vbnRoXCI6XG5cdFx0XHRcdHN0YXJ0RGF0ZSA9IHN0YXJ0RGF0ZS5mb3JtYXQoXCJEb1wiKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJkYXlvZndlZWtcIjoge1xuXHRcdFx0XHRjb25zdCBkYXkgPSBzdGFydERhdGUuZGF0ZSgpO1xuXHRcdFx0XHRjb25zdCBvcmRpbmFsU3VmZml4ZXMgPSBbXCJzdFwiLCBcIm5kXCIsIFwicmRcIiwgXCJ0aFwiLCBcInRoXCJdO1xuXG5cdFx0XHRcdHN0YXJ0RGF0ZSA9IE1hdGguY2VpbChkYXkgLyA3KSArIG9yZGluYWxTdWZmaXhlc1tkYXkgLyA3ICUgMSA9PT0gMCA/IE1hdGgubWF4KGRheSAvIDcgLSAxLCAwKSA6IE1hdGguZmxvb3IoZGF5IC8gNyldICsgXCIgXCIgKyBzdGFydERhdGUuZm9ybWF0KFwiZGRkZFwiKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy51aS5tb250aGx5UmVwZWF0TGFiZWwudGV4dChcIihcIiArIHN0YXJ0RGF0ZSArIFwiKVwiKTtcblx0fSxcblxuXHR1cGRhdGVBdWRpZW5jZTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMudWkuZXZlcnlvbmUucHJvcChcImNoZWNrZWRcIikpXG5cdFx0XHR0aGlzLmF1ZGllbmNlLm1vZGVsLnNldCh7IGRpc2FibGVkOiB0cnVlIH0pO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuYXVkaWVuY2UubW9kZWwuc2V0KHsgZGlzYWJsZWQ6IGZhbHNlIH0pO1xuXHR9LFxuXG5cdG9uQ3JlYXRlQW5vdGhlcjogZnVuY3Rpb24ocmVzdWx0KSB7XG5cdFx0cmV0dXJuIG5ldyBFdmVudE1vZGVsKHtcblx0XHRcdHN0YXJ0OiByZXN1bHQubW9kZWwuZ2V0KFwic3RhcnRcIiksXG5cdFx0XHRlbmQ6IHJlc3VsdC5tb2RlbC5nZXQoXCJlbmRcIiksXG5cdFx0fSk7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\n\nvar settings = require(\"app-settings\");\n\nmodule.exports = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"_id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/calendar/events\";\n\t},\n\n\t/*computeds: {\n \tuniqueID: function() {\n \t\treturn this.id + (this.has(\"_value\") ? \"-\" + this.get(\"_value\").abs + this.get(\"_value\").rel : \"\");\n \t},\n },*/\n\n\tvalidate: function validate(attributes) {\n\t\tvar errors = {};\n\n\t\tif (!attributes.title) errors.title = \"You must enter a title for this event.\";\n\n\t\tif (!attributes.start) errors.startDate = \"You must specify a starting date and, optionally, a starting time for this event.\";else if (!moment.unix(attributes.start).isValid()) errors.startDate = \"The provided starting date or time is not valid.\";\n\n\t\tif (!attributes.end) errors.endDate = \"You must specify an ending date and, optionally, an ending time for this event.\";else if (!moment.unix(attributes.end).isValid()) errors.endDate = \"The provided ending date or time is not valid.\";\n\n\t\tif (!errors.startDate && !errors.endDate && moment.unix(attributes.start).isAfter(moment.unix(attributes.end))) errors.startDate = \"The starting date and time cannot be after the ending date and time.\";\n\n\t\tif (attributes.repeat) {\n\t\t\tif (attributes.repeatOpts.gap) {\n\t\t\t\tvar validateInterval = function validateInterval(unitString) {\n\t\t\t\t\tvar interval = parseInt(attributes.repeatOpts.interval, 10);\n\n\t\t\t\t\tif (!attributes.repeatOpts.interval) errors.gap = \"You must specified a number of \" + unitString + \" to repeat this event.\";else if (!_.isNumber(interval) || interval < 1 || interval > 30) errors.gap = \"The specified number of \" + unitString + \" is not valid.\";\n\t\t\t\t};\n\n\t\t\t\tswitch (attributes.repeatOpts.gap) {\n\t\t\t\t\tdefault:\n\t\t\t\t\tcase \"day\":\n\t\t\t\t\t\tvalidateInterval(\"days\");\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"week\":\n\t\t\t\t\t\tvalidateInterval(\"weeks\");\n\n\t\t\t\t\t\tif (!attributes.repeatOpts.weekDays || attributes.repeatOpts.weekDays.length === 0) errors.gap = \"You must specify at least one day for this item to repeat on.\";\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"month\":\n\t\t\t\t\t\tvalidateInterval(\"months\");\n\n\t\t\t\t\t\tif (!attributes.repeatOpts.monthStyle) errors.gap = \"You must specify a repeating style.\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\terrors.gap = \"You must specify a repeat type.\";\n\t\t\t}\n\n\t\t\tif (attributes.repeatOpts.until) {\n\t\t\t\tswitch (attributes.repeatOpts.until) {\n\t\t\t\t\tdefault:\n\t\t\t\t\tcase \"date\":\n\t\t\t\t\t\tif (!moment.unix(attributes.repeatOpts.end).isValid()) errors.untilDate = \"The repeat ending date is not valid.\";else if (!errors.startDate && moment.unix(attributes.repeatOpts.end).isBefore(moment.unix(attributes.start))) errors.untilDate = \"The repeat ending date cannot be before the event starting date.\";\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase \"instances\":\n\t\t\t\t\t\tif (!attributes.repeatOpts.end) errors.untilCount = \"You must enter the number of repeat instances.\";else if (!_.isNumber(parseInt(attributes.repeatOpts.end, 10)) || parseInt(attributes.repeatOpts.end, 10) < 1) errors.untilCount = \"The specified number of repeat instances is not valid.\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\terrors.until = \"You must specify the repeat end condition.\";\n\t\t\t}\n\t\t}\n\n\t\tif (!attributes.tags || attributes.tags.length === 0) errors.tags = \"You must choose a sub-calendar to assign this event to.\";\n\n\t\tif (_.keys(errors).length > 0) return errors;\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV2ZW50TW9kZWwuanMiXSwibmFtZXMiOlsiXyIsInJlcXVpcmUiLCJCYWNrYm9uZSIsIm1vbWVudCIsInNldHRpbmdzIiwibW9kdWxlIiwiZXhwb3J0cyIsIkVwb3h5IiwiTW9kZWwiLCJleHRlbmQiLCJpZEF0dHJpYnV0ZSIsInVybFJvb3QiLCJ2YWxpZGF0ZSIsImF0dHJpYnV0ZXMiLCJlcnJvcnMiLCJ0aXRsZSIsInN0YXJ0Iiwic3RhcnREYXRlIiwidW5peCIsImlzVmFsaWQiLCJlbmQiLCJlbmREYXRlIiwiaXNBZnRlciIsInJlcGVhdCIsInJlcGVhdE9wdHMiLCJnYXAiLCJ2YWxpZGF0ZUludGVydmFsIiwidW5pdFN0cmluZyIsImludGVydmFsIiwicGFyc2VJbnQiLCJpc051bWJlciIsIndlZWtEYXlzIiwibGVuZ3RoIiwibW9udGhTdHlsZSIsInVudGlsIiwidW50aWxEYXRlIiwiaXNCZWZvcmUiLCJ1bnRpbENvdW50IiwidGFncyIsImtleXMiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsV0FBV0QsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUUsU0FBU0YsUUFBUSxRQUFSLENBQWY7O0FBRUEsSUFBTUcsV0FBV0gsUUFBUSxjQUFSLENBQWpCOztBQUVBSSxPQUFPQyxPQUFQLEdBQWlCSixTQUFTSyxLQUFULENBQWVDLEtBQWYsQ0FBcUJDLE1BQXJCLENBQTRCO0FBQzVDQyxjQUFhLEtBRCtCOztBQUc1Q0MsVUFBUyxtQkFBVztBQUNuQixTQUFPUCxTQUFTTyxPQUFULEdBQW1CLDBCQUExQjtBQUNBLEVBTDJDOztBQU81Qzs7Ozs7O0FBTUFDLFdBQVUsa0JBQVNDLFVBQVQsRUFBcUI7QUFDOUIsTUFBTUMsU0FBUyxFQUFmOztBQUVBLE1BQUksQ0FBQ0QsV0FBV0UsS0FBaEIsRUFDQ0QsT0FBT0MsS0FBUCxHQUFlLHdDQUFmOztBQUVELE1BQUksQ0FBQ0YsV0FBV0csS0FBaEIsRUFDQ0YsT0FBT0csU0FBUCxHQUFtQixtRkFBbkIsQ0FERCxLQUVLLElBQUksQ0FBQ2QsT0FBT2UsSUFBUCxDQUFZTCxXQUFXRyxLQUF2QixFQUE4QkcsT0FBOUIsRUFBTCxFQUNKTCxPQUFPRyxTQUFQLEdBQW1CLGtEQUFuQjs7QUFFRCxNQUFJLENBQUNKLFdBQVdPLEdBQWhCLEVBQ0NOLE9BQU9PLE9BQVAsR0FBaUIsaUZBQWpCLENBREQsS0FFSyxJQUFJLENBQUNsQixPQUFPZSxJQUFQLENBQVlMLFdBQVdPLEdBQXZCLEVBQTRCRCxPQUE1QixFQUFMLEVBQ0pMLE9BQU9PLE9BQVAsR0FBaUIsZ0RBQWpCOztBQUVELE1BQUksQ0FBQ1AsT0FBT0csU0FBUixJQUFxQixDQUFDSCxPQUFPTyxPQUE3QixJQUF3Q2xCLE9BQU9lLElBQVAsQ0FBWUwsV0FBV0csS0FBdkIsRUFBOEJNLE9BQTlCLENBQXNDbkIsT0FBT2UsSUFBUCxDQUFZTCxXQUFXTyxHQUF2QixDQUF0QyxDQUE1QyxFQUNDTixPQUFPRyxTQUFQLEdBQW1CLHNFQUFuQjs7QUFFRCxNQUFJSixXQUFXVSxNQUFmLEVBQXVCO0FBQ3RCLE9BQUlWLFdBQVdXLFVBQVgsQ0FBc0JDLEdBQTFCLEVBQStCO0FBQzlCLFFBQU1DLG1CQUFtQixTQUFuQkEsZ0JBQW1CLENBQVNDLFVBQVQsRUFBcUI7QUFDN0MsU0FBTUMsV0FBV0MsU0FBU2hCLFdBQVdXLFVBQVgsQ0FBc0JJLFFBQS9CLEVBQXlDLEVBQXpDLENBQWpCOztBQUVBLFNBQUksQ0FBQ2YsV0FBV1csVUFBWCxDQUFzQkksUUFBM0IsRUFDQ2QsT0FBT1csR0FBUCxHQUFhLG9DQUFvQ0UsVUFBcEMsR0FBaUQsd0JBQTlELENBREQsS0FFSyxJQUFJLENBQUMzQixFQUFFOEIsUUFBRixDQUFXRixRQUFYLENBQUQsSUFBeUJBLFdBQVcsQ0FBcEMsSUFBeUNBLFdBQVcsRUFBeEQsRUFDSmQsT0FBT1csR0FBUCxHQUFhLDZCQUE2QkUsVUFBN0IsR0FBMEMsZ0JBQXZEO0FBQ0QsS0FQRDs7QUFTQSxZQUFRZCxXQUFXVyxVQUFYLENBQXNCQyxHQUE5QjtBQUNDO0FBQ0EsVUFBSyxLQUFMO0FBQ0NDLHVCQUFpQixNQUFqQjtBQUNBOztBQUVELFVBQUssTUFBTDtBQUNDQSx1QkFBaUIsT0FBakI7O0FBRUEsVUFBSSxDQUFDYixXQUFXVyxVQUFYLENBQXNCTyxRQUF2QixJQUFtQ2xCLFdBQVdXLFVBQVgsQ0FBc0JPLFFBQXRCLENBQStCQyxNQUEvQixLQUEwQyxDQUFqRixFQUNDbEIsT0FBT1csR0FBUCxHQUFhLCtEQUFiO0FBQ0Q7O0FBRUQsVUFBSyxPQUFMO0FBQ0NDLHVCQUFpQixRQUFqQjs7QUFFQSxVQUFJLENBQUNiLFdBQVdXLFVBQVgsQ0FBc0JTLFVBQTNCLEVBQ0NuQixPQUFPVyxHQUFQLEdBQWEscUNBQWI7QUFDRDtBQWxCRjtBQW9CQSxJQTlCRCxNQStCSztBQUNKWCxXQUFPVyxHQUFQLEdBQWEsaUNBQWI7QUFDQTs7QUFFRCxPQUFJWixXQUFXVyxVQUFYLENBQXNCVSxLQUExQixFQUFpQztBQUNoQyxZQUFRckIsV0FBV1csVUFBWCxDQUFzQlUsS0FBOUI7QUFDQztBQUNBLFVBQUssTUFBTDtBQUNDLFVBQUksQ0FBQy9CLE9BQU9lLElBQVAsQ0FBWUwsV0FBV1csVUFBWCxDQUFzQkosR0FBbEMsRUFBdUNELE9BQXZDLEVBQUwsRUFDQ0wsT0FBT3FCLFNBQVAsR0FBbUIsc0NBQW5CLENBREQsS0FFSyxJQUFJLENBQUNyQixPQUFPRyxTQUFSLElBQXFCZCxPQUFPZSxJQUFQLENBQVlMLFdBQVdXLFVBQVgsQ0FBc0JKLEdBQWxDLEVBQXVDZ0IsUUFBdkMsQ0FBZ0RqQyxPQUFPZSxJQUFQLENBQVlMLFdBQVdHLEtBQXZCLENBQWhELENBQXpCLEVBQ0pGLE9BQU9xQixTQUFQLEdBQW1CLGtFQUFuQjtBQUNEOztBQUVELFVBQUssV0FBTDtBQUNDLFVBQUksQ0FBQ3RCLFdBQVdXLFVBQVgsQ0FBc0JKLEdBQTNCLEVBQ0NOLE9BQU91QixVQUFQLEdBQW9CLGdEQUFwQixDQURELEtBRUssSUFBSSxDQUFDckMsRUFBRThCLFFBQUYsQ0FBV0QsU0FBU2hCLFdBQVdXLFVBQVgsQ0FBc0JKLEdBQS9CLEVBQW9DLEVBQXBDLENBQVgsQ0FBRCxJQUF3RFMsU0FBU2hCLFdBQVdXLFVBQVgsQ0FBc0JKLEdBQS9CLEVBQW9DLEVBQXBDLElBQTBDLENBQXRHLEVBQ0pOLE9BQU91QixVQUFQLEdBQW9CLHdEQUFwQjtBQUNEO0FBZEY7QUFnQkEsSUFqQkQsTUFrQks7QUFDSnZCLFdBQU9vQixLQUFQLEdBQWUsNENBQWY7QUFDQTtBQUNEOztBQUVELE1BQUksQ0FBQ3JCLFdBQVd5QixJQUFaLElBQW9CekIsV0FBV3lCLElBQVgsQ0FBZ0JOLE1BQWhCLEtBQTJCLENBQW5ELEVBQ0NsQixPQUFPd0IsSUFBUCxHQUFjLHlEQUFkOztBQUVELE1BQUl0QyxFQUFFdUMsSUFBRixDQUFPekIsTUFBUCxFQUFla0IsTUFBZixHQUF3QixDQUE1QixFQUNDLE9BQU9sQixNQUFQO0FBQ0Q7QUFoRzJDLENBQTVCLENBQWpCIiwiZmlsZSI6ImV2ZW50TW9kZWwuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCBtb21lbnQgPSByZXF1aXJlKFwibW9tZW50XCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuRXBveHkuTW9kZWwuZXh0ZW5kKHtcblx0aWRBdHRyaWJ1dGU6IFwiX2lkXCIsXG5cblx0dXJsUm9vdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2NhbGVuZGFyL2V2ZW50c1wiO1xuXHR9LFxuXG5cdC8qY29tcHV0ZWRzOiB7XG5cdFx0dW5pcXVlSUQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuaWQgKyAodGhpcy5oYXMoXCJfdmFsdWVcIikgPyBcIi1cIiArIHRoaXMuZ2V0KFwiX3ZhbHVlXCIpLmFicyArIHRoaXMuZ2V0KFwiX3ZhbHVlXCIpLnJlbCA6IFwiXCIpO1xuXHRcdH0sXG5cdH0sKi9cblxuXHR2YWxpZGF0ZTogZnVuY3Rpb24oYXR0cmlidXRlcykge1xuXHRcdGNvbnN0IGVycm9ycyA9IHt9O1xuXG5cdFx0aWYgKCFhdHRyaWJ1dGVzLnRpdGxlKVxuXHRcdFx0ZXJyb3JzLnRpdGxlID0gXCJZb3UgbXVzdCBlbnRlciBhIHRpdGxlIGZvciB0aGlzIGV2ZW50LlwiO1xuXG5cdFx0aWYgKCFhdHRyaWJ1dGVzLnN0YXJ0KVxuXHRcdFx0ZXJyb3JzLnN0YXJ0RGF0ZSA9IFwiWW91IG11c3Qgc3BlY2lmeSBhIHN0YXJ0aW5nIGRhdGUgYW5kLCBvcHRpb25hbGx5LCBhIHN0YXJ0aW5nIHRpbWUgZm9yIHRoaXMgZXZlbnQuXCI7XG5cdFx0ZWxzZSBpZiAoIW1vbWVudC51bml4KGF0dHJpYnV0ZXMuc3RhcnQpLmlzVmFsaWQoKSlcblx0XHRcdGVycm9ycy5zdGFydERhdGUgPSBcIlRoZSBwcm92aWRlZCBzdGFydGluZyBkYXRlIG9yIHRpbWUgaXMgbm90IHZhbGlkLlwiO1xuXG5cdFx0aWYgKCFhdHRyaWJ1dGVzLmVuZClcblx0XHRcdGVycm9ycy5lbmREYXRlID0gXCJZb3UgbXVzdCBzcGVjaWZ5IGFuIGVuZGluZyBkYXRlIGFuZCwgb3B0aW9uYWxseSwgYW4gZW5kaW5nIHRpbWUgZm9yIHRoaXMgZXZlbnQuXCI7XG5cdFx0ZWxzZSBpZiAoIW1vbWVudC51bml4KGF0dHJpYnV0ZXMuZW5kKS5pc1ZhbGlkKCkpXG5cdFx0XHRlcnJvcnMuZW5kRGF0ZSA9IFwiVGhlIHByb3ZpZGVkIGVuZGluZyBkYXRlIG9yIHRpbWUgaXMgbm90IHZhbGlkLlwiO1xuXG5cdFx0aWYgKCFlcnJvcnMuc3RhcnREYXRlICYmICFlcnJvcnMuZW5kRGF0ZSAmJiBtb21lbnQudW5peChhdHRyaWJ1dGVzLnN0YXJ0KS5pc0FmdGVyKG1vbWVudC51bml4KGF0dHJpYnV0ZXMuZW5kKSkpXG5cdFx0XHRlcnJvcnMuc3RhcnREYXRlID0gXCJUaGUgc3RhcnRpbmcgZGF0ZSBhbmQgdGltZSBjYW5ub3QgYmUgYWZ0ZXIgdGhlIGVuZGluZyBkYXRlIGFuZCB0aW1lLlwiO1xuXG5cdFx0aWYgKGF0dHJpYnV0ZXMucmVwZWF0KSB7XG5cdFx0XHRpZiAoYXR0cmlidXRlcy5yZXBlYXRPcHRzLmdhcCkge1xuXHRcdFx0XHRjb25zdCB2YWxpZGF0ZUludGVydmFsID0gZnVuY3Rpb24odW5pdFN0cmluZykge1xuXHRcdFx0XHRcdGNvbnN0IGludGVydmFsID0gcGFyc2VJbnQoYXR0cmlidXRlcy5yZXBlYXRPcHRzLmludGVydmFsLCAxMCk7XG5cblx0XHRcdFx0XHRpZiAoIWF0dHJpYnV0ZXMucmVwZWF0T3B0cy5pbnRlcnZhbClcblx0XHRcdFx0XHRcdGVycm9ycy5nYXAgPSBcIllvdSBtdXN0IHNwZWNpZmllZCBhIG51bWJlciBvZiBcIiArIHVuaXRTdHJpbmcgKyBcIiB0byByZXBlYXQgdGhpcyBldmVudC5cIjtcblx0XHRcdFx0XHRlbHNlIGlmICghXy5pc051bWJlcihpbnRlcnZhbCkgfHwgaW50ZXJ2YWwgPCAxIHx8IGludGVydmFsID4gMzApXG5cdFx0XHRcdFx0XHRlcnJvcnMuZ2FwID0gXCJUaGUgc3BlY2lmaWVkIG51bWJlciBvZiBcIiArIHVuaXRTdHJpbmcgKyBcIiBpcyBub3QgdmFsaWQuXCI7XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0c3dpdGNoIChhdHRyaWJ1dGVzLnJlcGVhdE9wdHMuZ2FwKSB7XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRjYXNlIFwiZGF5XCI6XG5cdFx0XHRcdFx0XHR2YWxpZGF0ZUludGVydmFsKFwiZGF5c1wiKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSBcIndlZWtcIjpcblx0XHRcdFx0XHRcdHZhbGlkYXRlSW50ZXJ2YWwoXCJ3ZWVrc1wiKTtcblxuXHRcdFx0XHRcdFx0aWYgKCFhdHRyaWJ1dGVzLnJlcGVhdE9wdHMud2Vla0RheXMgfHwgYXR0cmlidXRlcy5yZXBlYXRPcHRzLndlZWtEYXlzLmxlbmd0aCA9PT0gMClcblx0XHRcdFx0XHRcdFx0ZXJyb3JzLmdhcCA9IFwiWW91IG11c3Qgc3BlY2lmeSBhdCBsZWFzdCBvbmUgZGF5IGZvciB0aGlzIGl0ZW0gdG8gcmVwZWF0IG9uLlwiO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlIFwibW9udGhcIjpcblx0XHRcdFx0XHRcdHZhbGlkYXRlSW50ZXJ2YWwoXCJtb250aHNcIik7XG5cblx0XHRcdFx0XHRcdGlmICghYXR0cmlidXRlcy5yZXBlYXRPcHRzLm1vbnRoU3R5bGUpXG5cdFx0XHRcdFx0XHRcdGVycm9ycy5nYXAgPSBcIllvdSBtdXN0IHNwZWNpZnkgYSByZXBlYXRpbmcgc3R5bGUuXCI7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdGVycm9ycy5nYXAgPSBcIllvdSBtdXN0IHNwZWNpZnkgYSByZXBlYXQgdHlwZS5cIjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGF0dHJpYnV0ZXMucmVwZWF0T3B0cy51bnRpbCkge1xuXHRcdFx0XHRzd2l0Y2ggKGF0dHJpYnV0ZXMucmVwZWF0T3B0cy51bnRpbCkge1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0Y2FzZSBcImRhdGVcIjpcblx0XHRcdFx0XHRcdGlmICghbW9tZW50LnVuaXgoYXR0cmlidXRlcy5yZXBlYXRPcHRzLmVuZCkuaXNWYWxpZCgpKVxuXHRcdFx0XHRcdFx0XHRlcnJvcnMudW50aWxEYXRlID0gXCJUaGUgcmVwZWF0IGVuZGluZyBkYXRlIGlzIG5vdCB2YWxpZC5cIjtcblx0XHRcdFx0XHRcdGVsc2UgaWYgKCFlcnJvcnMuc3RhcnREYXRlICYmIG1vbWVudC51bml4KGF0dHJpYnV0ZXMucmVwZWF0T3B0cy5lbmQpLmlzQmVmb3JlKG1vbWVudC51bml4KGF0dHJpYnV0ZXMuc3RhcnQpKSlcblx0XHRcdFx0XHRcdFx0ZXJyb3JzLnVudGlsRGF0ZSA9IFwiVGhlIHJlcGVhdCBlbmRpbmcgZGF0ZSBjYW5ub3QgYmUgYmVmb3JlIHRoZSBldmVudCBzdGFydGluZyBkYXRlLlwiO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlIFwiaW5zdGFuY2VzXCI6XG5cdFx0XHRcdFx0XHRpZiAoIWF0dHJpYnV0ZXMucmVwZWF0T3B0cy5lbmQpXG5cdFx0XHRcdFx0XHRcdGVycm9ycy51bnRpbENvdW50ID0gXCJZb3UgbXVzdCBlbnRlciB0aGUgbnVtYmVyIG9mIHJlcGVhdCBpbnN0YW5jZXMuXCI7XG5cdFx0XHRcdFx0XHRlbHNlIGlmICghXy5pc051bWJlcihwYXJzZUludChhdHRyaWJ1dGVzLnJlcGVhdE9wdHMuZW5kLCAxMCkpIHx8IHBhcnNlSW50KGF0dHJpYnV0ZXMucmVwZWF0T3B0cy5lbmQsIDEwKSA8IDEpXG5cdFx0XHRcdFx0XHRcdGVycm9ycy51bnRpbENvdW50ID0gXCJUaGUgc3BlY2lmaWVkIG51bWJlciBvZiByZXBlYXQgaW5zdGFuY2VzIGlzIG5vdCB2YWxpZC5cIjtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0ZXJyb3JzLnVudGlsID0gXCJZb3UgbXVzdCBzcGVjaWZ5IHRoZSByZXBlYXQgZW5kIGNvbmRpdGlvbi5cIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIWF0dHJpYnV0ZXMudGFncyB8fCBhdHRyaWJ1dGVzLnRhZ3MubGVuZ3RoID09PSAwKVxuXHRcdFx0ZXJyb3JzLnRhZ3MgPSBcIllvdSBtdXN0IGNob29zZSBhIHN1Yi1jYWxlbmRhciB0byBhc3NpZ24gdGhpcyBldmVudCB0by5cIjtcblxuXHRcdGlmIChfLmtleXMoZXJyb3JzKS5sZW5ndGggPiAwKVxuXHRcdFx0cmV0dXJuIGVycm9ycztcblx0fSxcbn0pO1xuIl19",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar pikaday = require(\"pikaday\");\nvar moment = require(\"moment\");\nvar tippy = require(\"tippy.js\").default;\n\nvar Selectra = require(\"./selectra\");\n\nvar Models = {},\n    Strategies = {},\n    Views = {};\n\nvar EventBus = Backbone.Marionette.Object.extend({});\n\nvar eventBus = new EventBus();\n\nvar FilterModel = Backbone.Model.extend({\n\tdefaults: {\n\t\tname: \"\",\n\t\tlabel: \"\"\n\t}\n});\n\nModels.ItemizedFilterModel = FilterModel.extend({\n\tdefaults: {\n\t\tcategories: null\n\t}\n});\n\nStrategies.ItemizedFilterStrategy = Backbone.Marionette.Object.extend({});\n\nViews.ItemizedFilterView = Backbone.View.extend({\n\tinitialize: function initialize(o) {\n\t\tthis.options = o;\n\t},\n\n\tselectraView: true,\n\n\tshow: function show(el) {\n\t\tvar _this = this;\n\n\t\t// Convert filter format into Selectra format\n\t\tvar items = void 0,\n\t\t    server = void 0,\n\t\t    showCategories = false;\n\n\t\tif (this.options.server && _.isPlainObject(this.options.server)) server = this.options.server;\n\n\t\tif (this.options.categories) {\n\t\t\tif (this.options.categories.length === 1) {\n\t\t\t\tif (_.isArray(this.options.categories[0].items)) {\n\t\t\t\t\tif (_.isPlainObject(this.options.categories[0].items[0])) items = _.map(this.options.categories[0].items, function (val) {\n\t\t\t\t\t\treturn { key: val.name, value: val.label, image: val.image, selected: Boolean(val.selected) };\n\t\t\t\t\t});else items = _.map(this.options.categories[0].items, function (val) {\n\t\t\t\t\t\treturn { key: val, value: val };\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\titems = _.map(this.options.categories[0].items, function (val, key) {\n\t\t\t\t\t\treturn { key: key, value: val };\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\titems = _.reduce(this.options.categories, function (sum, num) {\n\t\t\t\t\tsum[num.label] = _.map(num.items, function (val) {\n\t\t\t\t\t\treturn { key: val.name, value: val.label, image: val.image };\n\t\t\t\t\t});\n\t\t\t\t\treturn sum;\n\t\t\t\t}, {});\n\t\t\t}\n\n\t\t\tshowCategories = true;\n\t\t}\n\n\t\tvar sOpts = {\n\t\t\tmultiple: true,\n\t\t\tplaceholder: this.options.label + \": All <span class='fal fa-angle-down'/>\",\n\t\t\tflat: true,\n\t\t\tcheckboxes: true,\n\t\t\tddWidth: 300,\n\t\t\tpreviewSelection: true,\n\t\t\titems: items,\n\t\t\tshowCategories: showCategories\n\t\t};\n\n\t\tvar passThroughFields = [\"busChannel\", \"key\", \"value\", \"icons\", \"multiple\", \"checkboxes\", \"deselection\", \"lockedList\", \"ddWidth\", \"paging\"];\n\n\t\t_.extend(sOpts, _.pick(this.options, passThroughFields));\n\n\t\tif (server) sOpts.server = server;\n\n\t\tthis.selectra = new Selectra(sOpts);\n\n\t\tthis.listenTo(this.selectra, \"change\", function (data) {\n\t\t\teventBus.trigger(_this.options.name + \":selected\", _.map(data, function (x) {\n\t\t\t\treturn x.get(_this.selectra.model.get(\"key\"));\n\t\t\t}));\n\t\t});\n\n\t\tthis.selectra.show({ el: el });\n\t},\n\n\tcloseMenu: function closeMenu() {\n\t\tif (!this.selectra) return;\n\n\t\tthis.selectra.close();\n\t},\n\n\tdestroy: function destroy() {\n\t\tif (!this.selectra) return;\n\n\t\tthis.selectra.destroy();\n\t\tthis.selectra = null;\n\t},\n\n\ttoggle: function toggle(d) {\n\t\tif (!this.selectra) return;\n\n\t\tthis.selectra.model.set({ disabled: d === 0 });\n\t}\n});\n\n//________________________________________________________________\n\n\nModels.TextFilterModel = FilterModel.extend({\n\tdefaults: {\n\t\tvalue: \"\"\n\t}\n});\n\nStrategies.TextFilterStrategy = Backbone.Marionette.Object.extend({\n\tlistenToSelection: function listenToSelection(client) {\n\t\t// Listen for a signal that the selection of filter items associated with this\n\t\t// filter has changed\n\t\tclient.listenTo(eventBus, client.model.get(\"name\") + \":changed\", client.updateLabel.bind(client));\n\t}\n});\n\nViews.TextFilterView = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"filter-search-menu\",\n\n\tui: {\n\t\ttextInput: \".text-filter-input\",\n\t\tclearBox: \".fa-times\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.clearBox\": \"clear\"\n\t},\n\n\tgetTemplate: function getTemplate() {\n\t\treturn this.options.template || require(\"./templates/filter/text-menu.nunj\");\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tif (options.debounce) this.filterInputKey = _.debounce(this.filterInputKeyUp.bind(this), options.debounce);else this.filterInputKey = this.filterInputKeyUp;\n\n\t\tif (options.minLength === undefined) options.minLength = 3;\n\t\tthis.options = options;\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.ui.textInput.off(\"keyup\");\n\t},\n\n\tserializeData: function serializeData() {\n\t\treturn { minLength: this.options.minLength || \"\" };\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.toggle(this.options.enabled);\n\n\t\tthis.ui.textInput.on(\"keyup\", this.filterInputKey.bind(this));\n\t},\n\n\ttoggle: function toggle(enabled) {\n\t\tif (this.options.show !== false) this.ui.textInput.attr(\"disabled\", !enabled);\n\t},\n\n\tclear: function clear() {\n\t\tthis.ui.textInput.val(\"\");\n\t\tthis.filterInputKeyUp();\n\t},\n\n\tfilterInputKeyUp: function filterInputKeyUp() {\n\t\t// Retrieve the text value from the UI\n\t\tvar textInputValue = _.trim(this.ui.textInput.val());\n\t\tif (textInputValue && this.options.minLength && textInputValue.length < this.options.minLength) return;\n\n\t\tif (this.ui.textInput.val()) this.ui.clearBox.removeClass(\"hide\");else this.ui.clearBox.addClass(\"hide\");\n\n\t\t// React to the new input value immediately\n\t\tthis.updateInputValue(textInputValue);\n\t},\n\n\tupdateInputValue: function updateInputValue(nv) {\n\t\tvar newValue = (nv || \"\").toLowerCase();\n\t\t// Update the underlying model\n\t\tthis.model.set(\"value\", newValue);\n\n\t\t// Generate the selection array that will be passed to listeners\n\t\tvar selection = newValue;\n\t\tif (!this.options.raw) selection = _.compact(selection.split(\" \"));\n\n\t\t// Notify listeners of the current value of the text input\n\t\teventBus.trigger(this.model.get(\"name\") + \":changed\", selection);\n\t\teventBus.trigger(this.model.get(\"name\") + \":selected\", selection);\n\t\tthis.trigger(\"changed\", selection);\n\t}\n});\n\n//________________________________________________________________\n\n\nModels.ToggleFilterModel = FilterModel.extend({\n\tdefaults: {\n\t\tvalue: \"\",\n\t\ttemplate: \"./templates/filter/toggle-menu.nunj\"\n\t}\n});\n\nStrategies.ToggleFilterStrategy = Backbone.Marionette.Object.extend({\n\tlistenToSelection: function listenToSelection(client) {\n\t\t// Listen for a signal that the selection of filter items associated with this\n\t\t// filter has changed\n\t\tclient.listenTo(eventBus, client.model.get(\"name\") + \":changed\", function (selected_labels) {\n\t\t\tclient.updateLabel(selected_labels);\n\t\t});\n\t},\n\n\tcreateMenu: _.noop\n});\n\nViews.ToggleFilterView = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"filter-toggle-menu fa-circle fal\",\n\ttemplate: require(\"./templates/filter/toggle-menu.nunj\"),\n\n\tchecked: false,\n\n\tui: {},\n\n\tevents: {\n\t\tclick: \"clicked\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\n\t\tif (options.initialValue) this.checked = options.initialValue()[0];\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.toggle(this.options.enabled);\n\n\t\tif (this.options.tooltip) {\n\t\t\tthis.$el.attr(\"title\", this.options.tooltip);\n\n\t\t\ttippy(this.$el.get(0), {\n\t\t\t\ttheme: \"black\",\n\t\t\t\tplacement: \"bottom\",\n\t\t\t\tdelay: 1000,\n\t\t\t\tcontent: this.options.tooltip\n\t\t\t});\n\t\t}\n\n\t\tif (this.checked) this.$el.addClass(\"fas\").removeClass(\"fal\");\n\t},\n\n\ttoggle: function toggle() {\n\t\tvar enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n\t\tif (enabled) this.$el.removeClass(\"disabled\");else this.$el.addClass(\"disabled\");\n\t},\n\n\tclicked: function clicked() {\n\t\tthis.checked = !this.checked;\n\t\tif (this.checked) this.$el.toggleClass(\"fas\").removeClass(\"fal\");else this.$el.addClass(\"fal\").removeClass(\"fas\");\n\n\t\teventBus.trigger(this.model.get(\"name\") + \":changed\", [this.checked]);\n\t\teventBus.trigger(this.model.get(\"name\") + \":selected\", [this.checked]);\n\t\tthis.trigger(\"changed\", [this.checked]);\n\t}\n});\n\n//_____________________________________________________________________________\n\n\nModels.DateFilterModel = FilterModel.extend({\n\tdefaults: {\n\t\tvalue: \"\",\n\t\ttemplate: \"./templates/filter/date-menu.nunj\"\n\t}\n});\n\nStrategies.DateFilterStrategy = Backbone.Marionette.Object.extend({\n\tlistenToSelection: function listenToSelection(client) {\n\t\t// Listen for a signal that the selection of filter items associated with this\n\t\t// filter has changed\n\t\tclient.listenTo(eventBus, client.model.get(\"name\") + \":changed\", function (selected_labels) {\n\t\t\tclient.updateLabel(selected_labels);\n\t\t});\n\t}\n});\n\nViews.DateFilterView = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"filter-date-menu\",\n\ttemplate: require(\"./templates/filter/date-menu.nunj\"),\n\n\tui: {\n\t\tfield: \"input[type='text']\"\n\t},\n\n\tevents: {\n\t\tclick: \"clicked\",\n\t\t\"change @ui.field\": \"changed\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\t},\n\n\ttoggle: _.noop,\n\n\tserializeData: function serializeData() {\n\t\treturn { title: this.options.label, name: this.options.name };\n\t},\n\n\tonRender: function onRender() {\n\t\tvar def = moment();\n\t\tif (this.options.initialValue) def = moment.unix(this.options.initialValue()[0]);\n\n\t\t// eslint-disable-next-line new-cap, no-new\n\t\tnew pikaday({\n\t\t\tfield: this.ui.field.get(0),\n\t\t\tformat: \"DD MMMM YYYY\",\n\t\t\tdefaultDate: def.toDate(),\n\t\t\tsetDefaultDate: true\n\t\t});\n\n\t\tthis.toggle(this.options.enabled);\n\n\t\tif (this.options.initialValue) this.ui.field.val(moment.unix(this.options.initialValue()[0]).format(\"DD MMMM YYYY\"));\n\t},\n\n\tchanged: function changed() {\n\t\tvar val = moment(this.ui.field.val(), \"DD MMMM YYYY\").endOf(\"day\").unix();\n\t\teventBus.trigger(this.model.get(\"name\") + \":changed\", [val]);\n\t\teventBus.trigger(this.model.get(\"name\") + \":selected\", [val]);\n\t\tthis.trigger(\"changed\", [val]);\n\t}\n});\n\n//______________________________________________________________________\n\n\nModels.DateTimeFilterModel = FilterModel.extend({\n\tdefaults: {\n\t\tvalue: \"\",\n\t\ttemplate: \"./templates/filter/date-time-menu.nunj\"\n\t}\n});\n\nStrategies.DateTimeFilterStrategy = Backbone.Marionette.Object.extend({\n\tlistenToSelection: function listenToSelection(client) {\n\t\t// Listen for a signal that the selection of filter items associated with this\n\t\t// filter has changed\n\t\tclient.listenTo(eventBus, client.model.get(\"name\") + \":changed\", function (selected_labels) {\n\t\t\tclient.updateLabel(selected_labels);\n\t\t});\n\t}\n});\n\nViews.DateTimeFilterView = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"filter-date-time-menu\",\n\ttemplate: require(\"./templates/filter/date-time-menu.nunj\"),\n\n\tui: {\n\t\tfield: \"input.date\",\n\t\ttime: \"input.time\"\n\t},\n\n\tevents: {\n\t\tclick: \"clicked\",\n\t\t\"change @ui.field\": \"changed\",\n\t\t\"change @ui.time\": \"changed\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\t},\n\n\ttoggle: _.noop,\n\n\tserializeData: function serializeData() {\n\t\treturn { title: this.options.label, name: this.options.name };\n\t},\n\n\tonRender: function onRender() {\n\t\tvar def = moment();\n\t\tif (this.options.initialValue) def = moment.unix(this.options.initialValue()[0]);\n\n\t\tthis.toggle(this.options.enabled);\n\n\t\tif (this.options.initialValue) this.ui.field.val(moment.unix(this.options.initialValue()[0]).format(\"DD MMM YYYY\"));\n\n\t\tthis.ui.time.val(moment.unix(this.options.initialValue()[0]).format(\"HH:mm\")).timePicker();\n\n\t\t// eslint-disable-next-line new-cap, no-new\n\t\tnew pikaday({\n\t\t\tfield: this.ui.field.get(0),\n\t\t\tformat: \"DD MMM YYYY\",\n\t\t\tdefaultDate: def.toDate(),\n\t\t\tsetDefaultDate: true\n\t\t});\n\t},\n\n\tchanged: function changed() {\n\t\tvar val = moment(this.ui.field.val(), \"DD MMM YYYY\");\n\t\tvar time = moment(this.ui.time.val(), \"HH:mm\");\n\n\t\tval.hour(time.hour()).minute(time.minute()).second(0);\n\t\tval = val.unix();\n\n\t\tthis.model.set(\"value\", val);\n\n\t\teventBus.trigger(this.model.get(\"name\") + \":changed\", [val]);\n\t\teventBus.trigger(this.model.get(\"name\") + \":selected\", [val]);\n\t\tthis.trigger(\"changed\", [val]);\n\t},\n\n\tupdateInputValue: function updateInputValue(nv) {\n\t\tthis.ui.field.val(moment.unix(nv).format(\"DD MMM YYYY\"));\n\t\tthis.ui.time.val(moment.unix(nv).format(\"HH:mm\"));\n\t}\n});\n\n//____________________________________________________________________\n\n\nvar Filter = function Filter(options) {\n\tvar ident = options.type.charAt(0).toUpperCase() + options.type.slice(1);\n\n\tif (!(ident + \"FilterModel\" in Models)) throw new Error(\"No valid model found: \", ident);\n\n\tif (!(ident + \"FilterStrategy\" in Strategies)) throw new Error(\"No valid strategy found: \", ident);\n\n\tif (!(ident + \"FilterView\" in Views)) throw new Error(\"No valid view found: \", ident);\n\n\toptions.host = options.host || \"body\";\n\n\tvar model = new Models[ident + \"FilterModel\"](options);\n\tvar strategy = new Strategies[ident + \"FilterStrategy\"]();\n\n\tif (options.name) this.name = options.name;\n\tif (options.label) this.label = options.label;\n\n\toptions.model = model;\n\toptions.strategy = strategy;\n\n\treturn new Views[ident + \"FilterView\"](options);\n};\n\nexports.Control = Filter;\nexports.Events = eventBus;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbHRlci5qcyJdLCJuYW1lcyI6WyJfIiwicmVxdWlyZSIsIkJhY2tib25lIiwicGlrYWRheSIsIm1vbWVudCIsInRpcHB5IiwiZGVmYXVsdCIsIlNlbGVjdHJhIiwiTW9kZWxzIiwiU3RyYXRlZ2llcyIsIlZpZXdzIiwiRXZlbnRCdXMiLCJNYXJpb25ldHRlIiwiT2JqZWN0IiwiZXh0ZW5kIiwiZXZlbnRCdXMiLCJGaWx0ZXJNb2RlbCIsIk1vZGVsIiwiZGVmYXVsdHMiLCJuYW1lIiwibGFiZWwiLCJJdGVtaXplZEZpbHRlck1vZGVsIiwiY2F0ZWdvcmllcyIsIkl0ZW1pemVkRmlsdGVyU3RyYXRlZ3kiLCJJdGVtaXplZEZpbHRlclZpZXciLCJWaWV3IiwiaW5pdGlhbGl6ZSIsIm8iLCJvcHRpb25zIiwic2VsZWN0cmFWaWV3Iiwic2hvdyIsImVsIiwiaXRlbXMiLCJzZXJ2ZXIiLCJzaG93Q2F0ZWdvcmllcyIsImlzUGxhaW5PYmplY3QiLCJsZW5ndGgiLCJpc0FycmF5IiwibWFwIiwia2V5IiwidmFsIiwidmFsdWUiLCJpbWFnZSIsInNlbGVjdGVkIiwiQm9vbGVhbiIsInJlZHVjZSIsInN1bSIsIm51bSIsInNPcHRzIiwibXVsdGlwbGUiLCJwbGFjZWhvbGRlciIsImZsYXQiLCJjaGVja2JveGVzIiwiZGRXaWR0aCIsInByZXZpZXdTZWxlY3Rpb24iLCJwYXNzVGhyb3VnaEZpZWxkcyIsInBpY2siLCJzZWxlY3RyYSIsImxpc3RlblRvIiwidHJpZ2dlciIsImRhdGEiLCJ4IiwiZ2V0IiwibW9kZWwiLCJjbG9zZU1lbnUiLCJjbG9zZSIsImRlc3Ryb3kiLCJ0b2dnbGUiLCJkIiwic2V0IiwiZGlzYWJsZWQiLCJUZXh0RmlsdGVyTW9kZWwiLCJUZXh0RmlsdGVyU3RyYXRlZ3kiLCJsaXN0ZW5Ub1NlbGVjdGlvbiIsImNsaWVudCIsInVwZGF0ZUxhYmVsIiwiYmluZCIsIlRleHRGaWx0ZXJWaWV3IiwidGFnTmFtZSIsImNsYXNzTmFtZSIsInVpIiwidGV4dElucHV0IiwiY2xlYXJCb3giLCJldmVudHMiLCJnZXRUZW1wbGF0ZSIsInRlbXBsYXRlIiwiZGVib3VuY2UiLCJmaWx0ZXJJbnB1dEtleSIsImZpbHRlcklucHV0S2V5VXAiLCJtaW5MZW5ndGgiLCJ1bmRlZmluZWQiLCJvbkJlZm9yZURlc3Ryb3kiLCJvZmYiLCJzZXJpYWxpemVEYXRhIiwib25SZW5kZXIiLCJlbmFibGVkIiwib24iLCJhdHRyIiwiY2xlYXIiLCJ0ZXh0SW5wdXRWYWx1ZSIsInRyaW0iLCJyZW1vdmVDbGFzcyIsImFkZENsYXNzIiwidXBkYXRlSW5wdXRWYWx1ZSIsIm52IiwibmV3VmFsdWUiLCJ0b0xvd2VyQ2FzZSIsInNlbGVjdGlvbiIsInJhdyIsImNvbXBhY3QiLCJzcGxpdCIsIlRvZ2dsZUZpbHRlck1vZGVsIiwiVG9nZ2xlRmlsdGVyU3RyYXRlZ3kiLCJzZWxlY3RlZF9sYWJlbHMiLCJjcmVhdGVNZW51Iiwibm9vcCIsIlRvZ2dsZUZpbHRlclZpZXciLCJjaGVja2VkIiwiY2xpY2siLCJpbml0aWFsVmFsdWUiLCJ0b29sdGlwIiwiJGVsIiwidGhlbWUiLCJwbGFjZW1lbnQiLCJkZWxheSIsImNvbnRlbnQiLCJjbGlja2VkIiwidG9nZ2xlQ2xhc3MiLCJEYXRlRmlsdGVyTW9kZWwiLCJEYXRlRmlsdGVyU3RyYXRlZ3kiLCJEYXRlRmlsdGVyVmlldyIsImZpZWxkIiwidGl0bGUiLCJkZWYiLCJ1bml4IiwiZm9ybWF0IiwiZGVmYXVsdERhdGUiLCJ0b0RhdGUiLCJzZXREZWZhdWx0RGF0ZSIsImNoYW5nZWQiLCJlbmRPZiIsIkRhdGVUaW1lRmlsdGVyTW9kZWwiLCJEYXRlVGltZUZpbHRlclN0cmF0ZWd5IiwiRGF0ZVRpbWVGaWx0ZXJWaWV3IiwidGltZSIsInRpbWVQaWNrZXIiLCJob3VyIiwibWludXRlIiwic2Vjb25kIiwiRmlsdGVyIiwiaWRlbnQiLCJ0eXBlIiwiY2hhckF0IiwidG9VcHBlckNhc2UiLCJzbGljZSIsIkVycm9yIiwiaG9zdCIsInN0cmF0ZWd5IiwiZXhw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UUFBUSxZQUFSLElBQXdCNUksS0FBMUIsQ0FBSixFQUNDLE1BQU0sSUFBSWlKLEtBQUosQ0FBVSx1QkFBVixFQUFtQ0wsS0FBbkMsQ0FBTjs7QUFFRDFILFNBQVFnSSxJQUFSLEdBQWVoSSxRQUFRZ0ksSUFBUixJQUFnQixNQUEvQjs7QUFFQSxLQUFNN0YsUUFBUSxJQUFJdkQsT0FBTzhJLFFBQVEsYUFBZixDQUFKLENBQWtDMUgsT0FBbEMsQ0FBZDtBQUNBLEtBQU1pSSxXQUFXLElBQUlwSixXQUFXNkksUUFBUSxnQkFBbkIsQ0FBSixFQUFqQjs7QUFFQSxLQUFJMUgsUUFBUVQsSUFBWixFQUNDLEtBQUtBLElBQUwsR0FBWVMsUUFBUVQsSUFBcEI7QUFDRCxLQUFJUyxRQUFRUixLQUFaLEVBQ0MsS0FBS0EsS0FBTCxHQUFhUSxRQUFRUixLQUFyQjs7QUFFRFEsU0FBUW1DLEtBQVIsR0FBZ0JBLEtBQWhCO0FBQ0FuQyxTQUFRaUksUUFBUixHQUFtQkEsUUFBbkI7O0FBRUEsUUFBTyxJQUFJbkosTUFBTTRJLFFBQVEsWUFBZCxDQUFKLENBQWdDMUgsT0FBaEMsQ0FBUDtBQUNBLENBMUJEOztBQTRCQWtJLFFBQVFDLE9BQVIsR0FBa0JWLE1BQWxCO0FBQ0FTLFFBQVFFLE1BQVIsR0FBaUJqSixRQUFqQiIsImZpbGUiOiJmaWx0ZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCBwaWthZGF5ID0gcmVxdWlyZShcInBpa2FkYXlcIik7XG5jb25zdCBtb21lbnQgPSByZXF1aXJlKFwibW9tZW50XCIpO1xuY29uc3QgdGlwcHkgPSByZXF1aXJlKFwidGlwcHkuanNcIikuZGVmYXVsdDtcblxuY29uc3QgU2VsZWN0cmEgPSByZXF1aXJlKFwiLi9zZWxlY3RyYVwiKTtcblxuY29uc3QgTW9kZWxzID0ge30sIFN0cmF0ZWdpZXMgPSB7fSwgVmlld3MgPSB7fTtcblxuY29uc3QgRXZlbnRCdXMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLk9iamVjdC5leHRlbmQoe30pO1xuXG5jb25zdCBldmVudEJ1cyA9IG5ldyBFdmVudEJ1cygpO1xuXG5jb25zdCBGaWx0ZXJNb2RlbCA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7XG5cdFx0bmFtZTogXCJcIixcblx0XHRsYWJlbDogXCJcIixcblx0fSxcbn0pO1xuXG5Nb2RlbHMuSXRlbWl6ZWRGaWx0ZXJNb2RlbCA9IEZpbHRlck1vZGVsLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7XG5cdFx0Y2F0ZWdvcmllczogbnVsbCxcblx0fSxcbn0pO1xuXG5TdHJhdGVnaWVzLkl0ZW1pemVkRmlsdGVyU3RyYXRlZ3kgPSBCYWNrYm9uZS5NYXJpb25ldHRlLk9iamVjdC5leHRlbmQoe1xuXG59KTtcblxuVmlld3MuSXRlbWl6ZWRGaWx0ZXJWaWV3ID0gQmFja2JvbmUuVmlldy5leHRlbmQoe1xuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvKSB7XG5cdFx0dGhpcy5vcHRpb25zID0gbztcblx0fSxcblxuXHRzZWxlY3RyYVZpZXc6IHRydWUsXG5cblx0c2hvdzogZnVuY3Rpb24oZWwpIHtcblx0XHQvLyBDb252ZXJ0IGZpbHRlciBmb3JtYXQgaW50byBTZWxlY3RyYSBmb3JtYXRcblx0XHRsZXQgaXRlbXMsIHNlcnZlciwgc2hvd0NhdGVnb3JpZXMgPSBmYWxzZTtcblxuXHRcdGlmICh0aGlzLm9wdGlvbnMuc2VydmVyICYmIF8uaXNQbGFpbk9iamVjdCh0aGlzLm9wdGlvbnMuc2VydmVyKSlcblx0XHRcdHNlcnZlciA9IHRoaXMub3B0aW9ucy5zZXJ2ZXI7XG5cblx0XHRpZiAodGhpcy5vcHRpb25zLmNhdGVnb3JpZXMpIHtcblx0XHRcdGlmICh0aGlzLm9wdGlvbnMuY2F0ZWdvcmllcy5sZW5ndGggPT09IDEpIHtcblx0XHRcdFx0aWYgKF8uaXNBcnJheSh0aGlzLm9wdGlvbnMuY2F0ZWdvcmllc1swXS5pdGVtcykpIHtcblx0XHRcdFx0XHRpZiAoXy5pc1BsYWluT2JqZWN0KHRoaXMub3B0aW9ucy5jYXRlZ29yaWVzWzBdLml0ZW1zWzBdKSlcblx0XHRcdFx0XHRcdGl0ZW1zID0gXy5tYXAodGhpcy5vcHRpb25zLmNhdGVnb3JpZXNbMF0uaXRlbXMsIHZhbCA9PiAoeyBrZXk6IHZhbC5uYW1lLCB2YWx1ZTogdmFsLmxhYmVsLCBpbWFnZTogdmFsLmltYWdlLCBzZWxlY3RlZDogQm9vbGVhbih2YWwuc2VsZWN0ZWQpIH0pKTtcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRpdGVtcyA9IF8ubWFwKHRoaXMub3B0aW9ucy5jYXRlZ29yaWVzWzBdLml0ZW1zLCB2YWwgPT4gKHsga2V5OiB2YWwsIHZhbHVlOiB2YWwgfSkpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdGl0ZW1zID0gXy5tYXAodGhpcy5vcHRpb25zLmNhdGVnb3JpZXNbMF0uaXRlbXMsICh2YWwsIGtleSkgPT4gKHsga2V5LCB2YWx1ZTogdmFsIH0pKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdGl0ZW1zID0gXy5yZWR1Y2UodGhpcy5vcHRpb25zLmNhdGVnb3JpZXMsIChzdW0sIG51bSkgPT4ge1xuXHRcdFx0XHRcdHN1bVtudW0ubGFiZWxdID0gXy5tYXAobnVtLml0ZW1zLCB2YWwgPT4gKHsga2V5OiB2YWwubmFtZSwgdmFsdWU6IHZhbC5sYWJlbCwgaW1hZ2U6IHZhbC5pbWFnZSB9KSk7XG5cdFx0XHRcdFx0cmV0dXJuIHN1bTtcblx0XHRcdFx0fSwge30pO1xuXHRcdFx0fVxuXG5cdFx0XHRzaG93Q2F0ZWdvcmllcyA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc09wdHMgPSB7XG5cdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdHBsYWNlaG9sZGVyOiB0aGlzLm9wdGlvbnMubGFiZWwgKyBcIjogQWxsIDxzcGFuIGNsYXNzPSdmYWwgZmEtYW5nbGUtZG93bicvPlwiLFxuXHRcdFx0ZmxhdDogdHJ1ZSxcblx0XHRcdGNoZWNrYm94ZXM6IHRydWUsXG5cdFx0XHRkZFdpZHRoOiAzMDAsXG5cdFx0XHRwcmV2aWV3U2VsZWN0aW9uOiB0cnVlLFxuXHRcdFx0aXRlbXMsXG5cdFx0XHRzaG93Q2F0ZWdvcmllcyxcblx0XHR9O1xuXG5cdFx0Y29uc3QgcGFzc1Rocm91Z2hGaWVsZHMgPSBbXCJidXNDaGFubmVsXCIsIFwia2V5XCIsIFwidmFsdWVcIiwgXCJpY29uc1wiLCBcIm11bHRpcGxlXCIsIFwiY2hlY2tib3hlc1wiLCBcImRlc2VsZWN0aW9uXCIsIFwibG9ja2VkTGlzdFwiLCBcImRkV2lkdGhcIiwgXCJwYWdpbmdcIl07XG5cblx0XHRfLmV4dGVuZChzT3B0cywgXy5waWNrKHRoaXMub3B0aW9ucywgcGFzc1Rocm91Z2hGaWVsZHMpKTtcblxuXHRcdGlmIChzZXJ2ZXIpXG5cdFx0XHRzT3B0cy5zZXJ2ZXIgPSBzZXJ2ZXI7XG5cblx0XHR0aGlzLnNlbGVjdHJhID0gbmV3IFNlbGVjdHJhKHNPcHRzKTtcblxuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5zZWxlY3RyYSwgXCJjaGFuZ2VcIiwgZGF0YSA9PiB7XG5cdFx0XHRldmVudEJ1cy50cmlnZ2VyKHRoaXMub3B0aW9ucy5uYW1lICsgXCI6c2VsZWN0ZWRcIiwgXy5tYXAoZGF0YSwgeCA9PiB4LmdldCh0aGlzLnNlbGVjdHJhLm1vZGVsLmdldChcImtleVwiKSkpKTtcblx0XHR9KTtcblxuXHRcdHRoaXMuc2VsZWN0cmEuc2hvdyh7IGVsIH0pO1xuXHR9LFxuXG5cdGNsb3NlTWVudTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLnNlbGVjdHJhKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5zZWxlY3RyYS5jbG9zZSgpO1xuXHR9LFxuXG5cdGRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghdGhpcy5zZWxlY3RyYSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuc2VsZWN0cmEuZGVzdHJveSgpO1xuXHRcdHRoaXMuc2VsZWN0cmEgPSBudWxsO1xuXHR9LFxuXG5cdHRvZ2dsZTogZnVuY3Rpb24oZCkge1xuXHRcdGlmICghdGhpcy5zZWxlY3RyYSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuc2VsZWN0cmEubW9kZWwuc2V0KHsgZGlzYWJsZWQ6IGQgPT09IDAgfSk7XG5cdH0sXG59KTtcblxuXG4vL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19cblxuXG5Nb2RlbHMuVGV4dEZpbHRlck1vZGVsID0gRmlsdGVyTW9kZWwuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHtcblx0XHR2YWx1ZTogXCJcIixcblx0fSxcbn0pO1xuXG5TdHJhdGVnaWVzLlRleHRGaWx0ZXJTdHJhdGVneSA9IEJhY2tib25lLk1hcmlvbmV0dGUuT2JqZWN0LmV4dGVuZCh7XG5cdGxpc3RlblRvU2VsZWN0aW9uOiBmdW5jdGlvbihjbGllbnQpIHtcblx0XHQvLyBMaXN0ZW4gZm9yIGEgc2lnbmFsIHRoYXQgdGhlIHNlbGVjdGlvbiBvZiBmaWx0ZXIgaXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoaXNcblx0XHQvLyBmaWx0ZXIgaGFzIGNoYW5nZWRcblx0XHRjbGllbnQubGlzdGVuVG8oZXZlbnRCdXMsIGNsaWVudC5tb2RlbC5nZXQoXCJuYW1lXCIpICsgXCI6Y2hhbmdlZFwiLCBjbGllbnQudXBkYXRlTGFiZWwuYmluZChjbGllbnQpKTtcblx0fSxcbn0pO1xuXG5WaWV3cy5UZXh0RmlsdGVyVmlldyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwiZmlsdGVyLXNlYXJjaC1tZW51XCIsXG5cblx0dWk6IHtcblx0XHR0ZXh0SW5wdXQ6IFwiLnRleHQtZmlsdGVyLWlucHV0XCIsXG5cdFx0Y2xlYXJCb3g6IFwiLmZhLXRpbWVzXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkuY2xlYXJCb3hcIjogXCJjbGVhclwiLFxuXHR9LFxuXG5cdGdldFRlbXBsYXRlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5vcHRpb25zLnRlbXBsYXRlIHx8IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9maWx0ZXIvdGV4dC1tZW51Lm51bmpcIik7XG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdGlmIChvcHRpb25zLmRlYm91bmNlKVxuXHRcdFx0dGhpcy5maWx0ZXJJbnB1dEtleSA9IF8uZGVib3VuY2UodGhpcy5maWx0ZXJJbnB1dEtleVVwLmJpbmQodGhpcyksIG9wdGlvbnMuZGVib3VuY2UpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuZmlsdGVySW5wdXRLZXkgPSB0aGlzLmZpbHRlcklucHV0S2V5VXA7XG5cblx0XHRpZiAob3B0aW9ucy5taW5MZW5ndGggPT09IHVuZGVmaW5lZClcblx0XHRcdG9wdGlvbnMubWluTGVuZ3RoID0gMztcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS50ZXh0SW5wdXQub2ZmKFwia2V5dXBcIik7XG5cdH0sXG5cblx0c2VyaWFsaXplRGF0YTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHsgbWluTGVuZ3RoOiB0aGlzLm9wdGlvbnMubWluTGVuZ3RoIHx8IFwiXCIgfTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy50b2dnbGUodGhpcy5vcHRpb25zLmVuYWJsZWQpO1xuXG5cdFx0dGhpcy51aS50ZXh0SW5wdXQub24oXCJrZXl1cFwiLCB0aGlzLmZpbHRlcklucHV0S2V5LmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdHRvZ2dsZTogZnVuY3Rpb24oZW5hYmxlZCkge1xuXHRcdGlmICh0aGlzLm9wdGlvbnMuc2hvdyAhPT0gZmFsc2UpXG5cdFx0XHR0aGlzLnVpLnRleHRJbnB1dC5hdHRyKFwiZGlzYWJsZWRcIiwgIWVuYWJsZWQpO1xuXHR9LFxuXG5cdGNsZWFyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLnRleHRJbnB1dC52YWwoXCJcIik7XG5cdFx0dGhpcy5maWx0ZXJJbnB1dEtleVVwKCk7XG5cdH0sXG5cblx0ZmlsdGVySW5wdXRLZXlVcDogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gUmV0cmlldmUgdGhlIHRleHQgdmFsdWUgZnJvbSB0aGUgVUlcblx0XHRjb25zdCB0ZXh0SW5wdXRWYWx1ZSA9IF8udHJpbSh0aGlzLnVpLnRleHRJbnB1dC52YWwoKSk7XG5cdFx0aWYgKHRleHRJbnB1dFZhbHVlICYmIHRoaXMub3B0aW9ucy5taW5MZW5ndGggJiYgdGV4dElucHV0VmFsdWUubGVuZ3RoIDwgdGhpcy5vcHRpb25zLm1pbkxlbmd0aClcblx0XHRcdHJldHVybjtcblxuXHRcdGlmICh0aGlzLnVpLnRleHRJbnB1dC52YWwoKSlcblx0XHRcdHRoaXMudWkuY2xlYXJCb3gucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMudWkuY2xlYXJCb3guYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0Ly8gUmVhY3QgdG8gdGhlIG5ldyBpbnB1dCB2YWx1ZSBpbW1lZGlhdGVseVxuXHRcdHRoaXMudXBkYXRlSW5wdXRWYWx1ZSh0ZXh0SW5wdXRWYWx1ZSk7XG5cdH0sXG5cblx0dXBkYXRlSW5wdXRWYWx1ZTogZnVuY3Rpb24obnYpIHtcblx0XHRjb25zdCBuZXdWYWx1ZSA9IChudiB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpO1xuXHRcdC8vIFVwZGF0ZSB0aGUgdW5kZXJseWluZyBtb2RlbFxuXHRcdHRoaXMubW9kZWwuc2V0KFwidmFsdWVcIiwgbmV3VmFsdWUpO1xuXG5cdFx0Ly8gR2VuZXJhdGUgdGhlIHNlbGVjdGlvbiBhcnJheSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIGxpc3RlbmVyc1xuXHRcdGxldCBzZWxlY3Rpb24gPSBuZXdWYWx1ZTtcblx0XHRpZiAoIXRoaXMub3B0aW9ucy5yYXcpXG5cdFx0XHRzZWxlY3Rpb24gPSBfLmNvbXBhY3Qoc2VsZWN0aW9uLnNwbGl0KFwiIFwiKSk7XG5cblx0XHQvLyBOb3RpZnkgbGlzdGVuZXJzIG9mIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSB0ZXh0IGlucHV0XG5cdFx0ZXZlbnRCdXMudHJpZ2dlcih0aGlzLm1vZGVsLmdldChcIm5hbWVcIikgKyBcIjpjaGFuZ2VkXCIsIHNlbGVjdGlvbik7XG5cdFx0ZXZlbnRCdXMudHJpZ2dlcih0aGlzLm1vZGVsLmdldChcIm5hbWVcIikgKyBcIjpzZWxlY3RlZFwiLCBzZWxlY3Rpb24pO1xuXHRcdHRoaXMudHJpZ2dlcihcImNoYW5nZWRcIiwgc2VsZWN0aW9uKTtcblx0fSxcbn0pO1xuXG5cbi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1xuXG5cbk1vZGVscy5Ub2dnbGVGaWx0ZXJNb2RlbCA9IEZpbHRlck1vZGVsLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7XG5cdFx0dmFsdWU6IFwiXCIsXG5cdFx0dGVtcGxhdGU6IFwiLi90ZW1wbGF0ZXMvZmlsdGVyL3RvZ2dsZS1tZW51Lm51bmpcIixcblx0fSxcbn0pO1xuXG5TdHJhdGVnaWVzLlRvZ2dsZUZpbHRlclN0cmF0ZWd5ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5PYmplY3QuZXh0ZW5kKHtcblx0bGlzdGVuVG9TZWxlY3Rpb246IGZ1bmN0aW9uKGNsaWVudClcdHtcblx0XHQvLyBMaXN0ZW4gZm9yIGEgc2lnbmFsIHRoYXQgdGhlIHNlbGVjdGlvbiBvZiBmaWx0ZXIgaXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoaXNcblx0XHQvLyBmaWx0ZXIgaGFzIGNoYW5nZWRcblx0XHRjbGllbnQubGlzdGVuVG8oZXZlbnRCdXMsIGNsaWVudC5tb2RlbC5nZXQoXCJuYW1lXCIpICsgXCI6Y2hhbmdlZFwiLCBzZWxlY3RlZF9sYWJlbHMgPT4ge1xuXHRcdFx0Y2xpZW50LnVwZGF0ZUxhYmVsKHNlbGVjdGVkX2xhYmVscyk7XG5cdFx0fSk7XG5cdH0sXG5cblx0Y3JlYXRlTWVudTogXy5ub29wLFxufSk7XG5cblZpZXdzLlRvZ2dsZUZpbHRlclZpZXcgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogXCJkaXZcIixcblx0Y2xhc3NOYW1lOiBcImZpbHRlci10b2dnbGUtbWVudSBmYS1jaXJjbGUgZmFsXCIsXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi90ZW1wbGF0ZXMvZmlsdGVyL3RvZ2dsZS1tZW51Lm51bmpcIiksXG5cblx0Y2hlY2tlZDogZmFsc2UsXG5cblx0dWk6IHtcblxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdGNsaWNrOiBcImNsaWNrZWRcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuXHRcdGlmIChvcHRpb25zLmluaXRpYWxWYWx1ZSlcblx0XHRcdHRoaXMuY2hlY2tlZCA9IG9wdGlvbnMuaW5pdGlhbFZhbHVlKClbMF07XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudG9nZ2xlKHRoaXMub3B0aW9ucy5lbmFibGVkKTtcblxuXHRcdGlmICh0aGlzLm9wdGlvbnMudG9vbHRpcCkge1xuXHRcdFx0dGhpcy4kZWwuYXR0cihcInRpdGxlXCIsIHRoaXMub3B0aW9ucy50b29sdGlwKTtcblxuXHRcdFx0dGlwcHkodGhpcy4kZWwuZ2V0KDApLCB7XG5cdFx0XHRcdHRoZW1lOiBcImJsYWNrXCIsXG5cdFx0XHRcdHBsYWNlbWVudDogXCJib3R0b21cIixcblx0XHRcdFx0ZGVsYXk6IDEwMDAsXG5cdFx0XHRcdGNvbnRlbnQ6IHRoaXMub3B0aW9ucy50b29sdGlwLFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuY2hlY2tlZClcblx0XHRcdHRoaXMuJGVsLmFkZENsYXNzKFwiZmFzXCIpLnJlbW92ZUNsYXNzKFwiZmFsXCIpO1xuXHR9LFxuXG5cdHRvZ2dsZTogZnVuY3Rpb24oZW5hYmxlZCA9IHRydWUpIHtcblx0XHRpZiAoZW5hYmxlZClcblx0XHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKFwiZGlzYWJsZWRcIik7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy4kZWwuYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblx0fSxcblxuXHRjbGlja2VkOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmNoZWNrZWQgPSAhdGhpcy5jaGVja2VkO1xuXHRcdGlmICh0aGlzLmNoZWNrZWQpXG5cdFx0XHR0aGlzLiRlbC50b2dnbGVDbGFzcyhcImZhc1wiKS5yZW1vdmVDbGFzcyhcImZhbFwiKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcImZhbFwiKS5yZW1vdmVDbGFzcyhcImZhc1wiKTtcblxuXHRcdGV2ZW50QnVzLnRyaWdnZXIodGhpcy5tb2RlbC5nZXQoXCJuYW1lXCIpICsgXCI6Y2hhbmdlZFwiLCBbdGhpcy5jaGVja2VkXSk7XG5cdFx0ZXZlbnRCdXMudHJpZ2dlcih0aGlzLm1vZGVsLmdldChcIm5hbWVcIikgKyBcIjpzZWxlY3RlZFwiLCBbdGhpcy5jaGVja2VkXSk7XG5cdFx0dGhpcy50cmlnZ2VyKFwiY2hhbmdlZFwiLCBbdGhpcy5jaGVja2VkXSk7XG5cdH0sXG59KTtcblxuXG4vL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXG5cblxuTW9kZWxzLkRhdGVGaWx0ZXJNb2RlbCA9IEZpbHRlck1vZGVsLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7XG5cdFx0dmFsdWU6IFwiXCIsXG5cdFx0dGVtcGxhdGU6IFwiLi90ZW1wbGF0ZXMvZmlsdGVyL2RhdGUtbWVudS5udW5qXCIsXG5cdH0sXG59KTtcblxuU3RyYXRlZ2llcy5EYXRlRmlsdGVyU3RyYXRlZ3kgPSBCYWNrYm9uZS5NYXJpb25ldHRlLk9iamVjdC5leHRlbmQoe1xuXHRsaXN0ZW5Ub1NlbGVjdGlvbjogZnVuY3Rpb24oY2xpZW50KVx0e1xuXHRcdC8vIExpc3RlbiBmb3IgYSBzaWduYWwgdGhhdCB0aGUgc2VsZWN0aW9uIG9mIGZpbHRlciBpdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhpc1xuXHRcdC8vIGZpbHRlciBoYXMgY2hhbmdlZFxuXHRcdGNsaWVudC5saXN0ZW5UbyhldmVudEJ1cywgY2xpZW50Lm1vZGVsLmdldChcIm5hbWVcIikgKyBcIjpjaGFuZ2VkXCIsIHNlbGVjdGVkX2xhYmVscyA9PiB7XG5cdFx0XHRjbGllbnQudXBkYXRlTGFiZWwoc2VsZWN0ZWRfbGFiZWxzKTtcblx0XHR9KTtcblx0fSxcbn0pO1xuXG5WaWV3cy5EYXRlRmlsdGVyVmlldyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwiZmlsdGVyLWRhdGUtbWVudVwiLFxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4vdGVtcGxhdGVzL2ZpbHRlci9kYXRlLW1lbnUubnVualwiKSxcblxuXHR1aToge1xuXHRcdGZpZWxkOiBcImlucHV0W3R5cGU9J3RleHQnXVwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdGNsaWNrOiBcImNsaWNrZWRcIixcblx0XHRcImNoYW5nZSBAdWkuZmllbGRcIjogXCJjaGFuZ2VkXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cdH0sXG5cblx0dG9nZ2xlOiBfLm5vb3AsXG5cblx0c2VyaWFsaXplRGF0YTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHsgdGl0bGU6IHRoaXMub3B0aW9ucy5sYWJlbCwgbmFtZTogdGhpcy5vcHRpb25zLm5hbWUgfTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0bGV0IGRlZiA9IG1vbWVudCgpO1xuXHRcdGlmICh0aGlzLm9wdGlvbnMuaW5pdGlhbFZhbHVlKVxuXHRcdFx0ZGVmID0gbW9tZW50LnVuaXgodGhpcy5vcHRpb25zLmluaXRpYWxWYWx1ZSgpWzBdKTtcblxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwLCBuby1uZXdcblx0XHRuZXcgcGlrYWRheSh7XG5cdFx0XHRmaWVsZDogdGhpcy51aS5maWVsZC5nZXQoMCksXG5cdFx0XHRmb3JtYXQ6IFwiREQgTU1NTSBZWVlZXCIsXG5cdFx0XHRkZWZhdWx0RGF0ZTogZGVmLnRvRGF0ZSgpLFxuXHRcdFx0c2V0RGVmYXVsdERhdGU6IHRydWUsXG5cdFx0fSk7XG5cblx0XHR0aGlzLnRvZ2dsZSh0aGlzLm9wdGlvbnMuZW5hYmxlZCk7XG5cblx0XHRpZiAodGhpcy5vcHRpb25zLmluaXRpYWxWYWx1ZSlcblx0XHRcdHRoaXMudWkuZmllbGQudmFsKG1vbWVudC51bml4KHRoaXMub3B0aW9ucy5pbml0aWFsVmFsdWUoKVswXSkuZm9ybWF0KFwiREQgTU1NTSBZWVlZXCIpKTtcblx0fSxcblxuXHRjaGFuZ2VkOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCB2YWwgPSBtb21lbnQodGhpcy51aS5maWVsZC52YWwoKSwgXCJERCBNTU1NIFlZWVlcIikuZW5kT2YoXCJkYXlcIikudW5peCgpO1xuXHRcdGV2ZW50QnVzLnRyaWdnZXIodGhpcy5tb2RlbC5nZXQoXCJuYW1lXCIpICsgXCI6Y2hhbmdlZFwiLCBbdmFsXSk7XG5cdFx0ZXZlbnRCdXMudHJpZ2dlcih0aGlzLm1vZGVsLmdldChcIm5hbWVcIikgKyBcIjpzZWxlY3RlZFwiLCBbdmFsXSk7XG5cdFx0dGhpcy50cmlnZ2VyKFwiY2hhbmdlZFwiLCBbdmFsXSk7XG5cdH0sXG59KTtcblxuXG4vL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19cblxuXG5Nb2RlbHMuRGF0ZVRpbWVGaWx0ZXJNb2RlbCA9IEZpbHRlck1vZGVsLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7XG5cdFx0dmFsdWU6IFwiXCIsXG5cdFx0dGVtcGxhdGU6IFwiLi90ZW1wbGF0ZXMvZmlsdGVyL2RhdGUtdGltZS1tZW51Lm51bmpcIixcblx0fSxcbn0pO1xuXG5TdHJhdGVnaWVzLkRhdGVUaW1lRmlsdGVyU3RyYXRlZ3kgPSBCYWNrYm9uZS5NYXJpb25ldHRlLk9iamVjdC5leHRlbmQoe1xuXHRsaXN0ZW5Ub1NlbGVjdGlvbjogZnVuY3Rpb24oY2xpZW50KVx0e1xuXHRcdC8vIExpc3RlbiBmb3IgYSBzaWduYWwgdGhhdCB0aGUgc2VsZWN0aW9uIG9mIGZpbHRlciBpdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhpc1xuXHRcdC8vIGZpbHRlciBoYXMgY2hhbmdlZFxuXHRcdGNsaWVudC5saXN0ZW5UbyhldmVudEJ1cywgY2xpZW50Lm1vZGVsLmdldChcIm5hbWVcIikgKyBcIjpjaGFuZ2VkXCIsIHNlbGVjdGVkX2xhYmVscyA9PiB7XG5cdFx0XHRjbGllbnQudXBkYXRlTGFiZWwoc2VsZWN0ZWRfbGFiZWxzKTtcblx0XHR9KTtcblx0fSxcbn0pO1xuXG5WaWV3cy5EYXRlVGltZUZpbHRlclZpZXcgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogXCJkaXZcIixcblx0Y2xhc3NOYW1lOiBcImZpbHRlci1kYXRlLXRpbWUtbWVudVwiLFxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4vdGVtcGxhdGVzL2ZpbHRlci9kYXRlLXRpbWUtbWVudS5udW5qXCIpLFxuXG5cdHVpOiB7XG5cdFx0ZmllbGQ6IFwiaW5wdXQuZGF0ZVwiLFxuXHRcdHRpbWU6IFwiaW5wdXQudGltZVwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdGNsaWNrOiBcImNsaWNrZWRcIixcblx0XHRcImNoYW5nZSBAdWkuZmllbGRcIjogXCJjaGFuZ2VkXCIsXG5cdFx0XCJjaGFuZ2UgQHVpLnRpbWVcIjogXCJjaGFuZ2VkXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cdH0sXG5cblx0dG9nZ2xlOiBfLm5vb3AsXG5cblx0c2VyaWFsaXplRGF0YTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHsgdGl0bGU6IHRoaXMub3B0aW9ucy5sYWJlbCwgbmFtZTogdGhpcy5vcHRpb25zLm5hbWUgfTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0bGV0IGRlZiA9IG1vbWVudCgpO1xuXHRcdGlmICh0aGlzLm9wdGlvbnMuaW5pdGlhbFZhbHVlKVxuXHRcdFx0ZGVmID0gbW9tZW50LnVuaXgodGhpcy5vcHRpb25zLmluaXRpYWxWYWx1ZSgpWzBdKTtcblxuXHRcdHRoaXMudG9nZ2xlKHRoaXMub3B0aW9ucy5lbmFibGVkKTtcblxuXHRcdGlmICh0aGlzLm9wdGlvbnMuaW5pdGlhbFZhbHVlKVxuXHRcdFx0dGhpcy51aS5maWVsZC52YWwobW9tZW50LnVuaXgodGhpcy5vcHRpb25zLmluaXRpYWxWYWx1ZSgpWzBdKS5mb3JtYXQoXCJERCBNTU0gWVlZWVwiKSk7XG5cblx0XHR0aGlzLnVpLnRpbWUudmFsKG1vbWVudC51bml4KHRoaXMub3B0aW9ucy5pbml0aWFsVmFsdWUoKVswXSkuZm9ybWF0KFwiSEg6bW1cIikpLnRpbWVQaWNrZXIoKTtcblxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwLCBuby1uZXdcblx0XHRuZXcgcGlrYWRheSh7XG5cdFx0XHRmaWVsZDogdGhpcy51aS5maWVsZC5nZXQoMCksXG5cdFx0XHRmb3JtYXQ6IFwiREQgTU1NIFlZWVlcIixcblx0XHRcdGRlZmF1bHREYXRlOiBkZWYudG9EYXRlKCksXG5cdFx0XHRzZXREZWZhdWx0RGF0ZTogdHJ1ZSxcblx0XHR9KTtcblx0fSxcblxuXHRjaGFuZ2VkOiBmdW5jdGlvbigpIHtcblx0XHRsZXQgdmFsID0gbW9tZW50KHRoaXMudWkuZmllbGQudmFsKCksIFwiREQgTU1NIFlZWVlcIik7XG5cdFx0Y29uc3QgdGltZSA9IG1vbWVudCh0aGlzLnVpLnRpbWUudmFsKCksIFwiSEg6bW1cIik7XG5cblx0XHR2YWwuaG91cih0aW1lLmhvdXIoKSkubWludXRlKHRpbWUubWludXRlKCkpLnNlY29uZCgwKTtcblx0XHR2YWwgPSB2YWwudW5peCgpO1xuXG5cdFx0dGhpcy5tb2RlbC5zZXQoXCJ2YWx1ZVwiLCB2YWwpO1xuXG5cdFx0ZXZlbnRCdXMudHJpZ2dlcih0aGlzLm1vZGVsLmdldChcIm5hbWVcIikgKyBcIjpjaGFuZ2VkXCIsIFt2YWxdKTtcblx0XHRldmVudEJ1cy50cmlnZ2VyKHRoaXMubW9kZWwuZ2V0KFwibmFtZVwiKSArIFwiOnNlbGVjdGVkXCIsIFt2YWxdKTtcblx0XHR0aGlzLnRyaWdnZXIoXCJjaGFuZ2VkXCIsIFt2YWxdKTtcblx0fSxcblxuXHR1cGRhdGVJbnB1dFZhbHVlOiBmdW5jdGlvbihudikge1xuXHRcdHRoaXMudWkuZmllbGQudmFsKG1vbWVudC51bml4KG52KS5mb3JtYXQoXCJERCBNTU0gWVlZWVwiKSk7XG5cdFx0dGhpcy51aS50aW1lLnZhbChtb21lbnQudW5peChudikuZm9ybWF0KFwiSEg6bW1cIikpO1xuXHR9LFxufSk7XG5cblxuLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1xuXG5cbmNvbnN0IEZpbHRlciA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0Y29uc3QgaWRlbnQgPSBvcHRpb25zLnR5cGUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBvcHRpb25zLnR5cGUuc2xpY2UoMSk7XG5cblx0aWYgKCEoaWRlbnQgKyBcIkZpbHRlck1vZGVsXCIgaW4gTW9kZWxzKSlcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJObyB2YWxpZCBtb2RlbCBmb3VuZDogXCIsIGlkZW50KTtcblxuXHRpZiAoIShpZGVudCArIFwiRmlsdGVyU3RyYXRlZ3lcIiBpbiBTdHJhdGVnaWVzKSlcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJObyB2YWxpZCBzdHJhdGVneSBmb3VuZDogXCIsIGlkZW50KTtcblxuXHRpZiAoIShpZGVudCArIFwiRmlsdGVyVmlld1wiIGluIFZpZXdzKSlcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJObyB2YWxpZCB2aWV3IGZvdW5kOiBcIiwgaWRlbnQpO1xuXG5cdG9wdGlvbnMuaG9zdCA9IG9wdGlvbnMuaG9zdCB8fCBcImJvZHlcIjtcblxuXHRjb25zdCBtb2RlbCA9IG5ldyBNb2RlbHNbaWRlbnQgKyBcIkZpbHRlck1vZGVsXCJdKG9wdGlvbnMpO1xuXHRjb25zdCBzdHJhdGVneSA9IG5ldyBTdHJhdGVnaWVzW2lkZW50ICsgXCJGaWx0ZXJTdHJhdGVneVwiXSgpO1xuXG5cdGlmIChvcHRpb25zLm5hbWUpXG5cdFx0dGhpcy5uYW1lID0gb3B0aW9ucy5uYW1lO1xuXHRpZiAob3B0aW9ucy5sYWJlbClcblx0XHR0aGlzLmxhYmVsID0gb3B0aW9ucy5sYWJlbDtcblxuXHRvcHRpb25zLm1vZGVsID0gbW9kZWw7XG5cdG9wdGlvbnMuc3RyYXRlZ3kgPSBzdHJhdGVneTtcblxuXHRyZXR1cm4gbmV3IFZpZXdzW2lkZW50ICsgXCJGaWx0ZXJWaWV3XCJdKG9wdGlvbnMpO1xufTtcblxuZXhwb3J0cy5Db250cm9sID0gRmlsdGVyO1xuZXhwb3J0cy5FdmVudHMgPSBldmVudEJ1czsiXX0=",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\n\nvar BlankFilter = Backbone.Marionette.View.extend({\n\tclassName: \"blank-filter\",\n\n\ttemplate: require(\"./templates/filterBack.nunj\").blankFilter\n});\n\nvar TextFilter = Backbone.Marionette.View.extend({\n\tclassName: \"text-filter\",\n\n\ttemplate: require(\"./templates/filterBack.nunj\").textFilter,\n\n\tui: {\n\t\tinput: \".text-filter-input\",\n\t\tbuttonClear: \".button-clear\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonClear\": \"onButtonClearClick\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tif (this.model.has(\"debounce\") && this.model.get(\"debounce\")) this.onInputKeyUp = _.debounce(this.execute.bind(this), this.model.get(\"debounce\"));else this.onInputKeyUp = this.execute;\n\n\t\tif (!this.model.has(\"defaultText\")) this.model.set(\"defaultText\", \"Type search query...\");\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.ui.input.on(\"keyup\", this.onInputKeyUp.bind(this));\n\t},\n\n\tonButtonClearClick: function onButtonClearClick() {\n\t\tthis.ui.input.val(\"\");\n\t\tthis.execute();\n\t},\n\n\texecute: function execute() {\n\t\tvar inputValue = _.trim(this.ui.input.val()).toLowerCase();\n\n\t\tif (inputValue) {\n\t\t\tthis.ui.buttonClear.removeClass(\"hide\");\n\t\t\tthis.model.trigger(\"execute\", this.model.get(\"filterFactory\")(inputValue));\n\t\t} else {\n\t\t\tthis.ui.buttonClear.addClass(\"hide\");\n\t\t\tthis.model.trigger(\"execute\", _.constant(true));\n\t\t}\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.ui.input.off(\"keyup\");\n\t}\n});\n\nvar Filter = Backbone.Marionette.View.extend({\n\tclassName: \"filter-back-filter\",\n\n\ttemplate: require(\"./templates/filterBack.nunj\").filter,\n\n\tregions: {\n\t\tfilter: \".filter-back-filter-region\"\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.filterImplementation = null;\n\n\t\tswitch (this.model.get(\"type\")) {\n\t\t\tcase \"text\":\n\t\t\t\tthis.filterImplementation = new TextFilter({ model: this.model });\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthis.filterImplementation = new BlankFilter();\n\t\t}\n\n\t\tthis.showChildView(\"filter\", this.filterImplementation);\n\t}\n});\n\nvar FilterContainers = Backbone.Marionette.CollectionView.extend({\n\tclassName: \"filter-back-filter-containers\",\n\n\tchildView: Filter\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"filter-back\",\n\n\ttemplate: require(\"./templates/filterBack.nunj\").container,\n\n\tregions: {\n\t\tfilters: \".filter-back-filter-containers-region\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tvar _this = this;\n\n\t\tif (options && options.descriptors && _.isArray(options.descriptors)) {\n\t\t\tthis.filterCollection = new Backbone.Collection();\n\n\t\t\t_.each(options.descriptors, function (descriptor) {\n\t\t\t\t_this.filterCollection.add(new Backbone.Model(descriptor));\n\t\t\t});\n\n\t\t\tthis.listenTo(this.filterCollection, \"execute\", this.onExecute.bind(this));\n\t\t}\n\t},\n\n\tonRender: function onRender() {\n\t\tif (this.filterCollection) this.showChildView(\"filters\", new FilterContainers({ collection: this.filterCollection }));\n\t},\n\n\tonExecute: function onExecute(filter) {\n\t\tthis.trigger(\"execute\", filter);\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(this.filterCollection);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbHRlckJhY2suanMiXSwibmFtZXMiOlsiXyIsInJlcXVpcmUiLCJCYWNrYm9uZSIsIkJsYW5rRmlsdGVyIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJleHRlbmQiLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsImJsYW5rRmlsdGVyIiwiVGV4dEZpbHRlciIsInRleHRGaWx0ZXIiLCJ1aSIsImlucHV0IiwiYnV0dG9uQ2xlYXIiLCJldmVudHMiLCJpbml0aWFsaXplIiwibW9kZWwiLCJoYXMiLCJnZXQiLCJvbklucHV0S2V5VXAiLCJkZWJvdW5jZSIsImV4ZWN1dGUiLCJiaW5kIiwic2V0Iiwib25SZW5kZXIiLCJvbiIsIm9uQnV0dG9uQ2xlYXJDbGljayIsInZhbCIsImlucHV0VmFsdWUiLCJ0cmltIiwidG9Mb3dlckNhc2UiLCJyZW1vdmVDbGFzcyIsInRyaWdnZXIiLCJhZGRDbGFzcyIsImNvbnN0YW50Iiwib25CZWZvcmVEZXN0cm95Iiwib2ZmIiwiRmlsdGVyIiwiZmlsdGVyIiwicmVnaW9ucyIsImZpbHRlckltcGxlbWVudGF0aW9uIiwic2hvd0NoaWxkVmlldyIsIkZpbHRlckNvbnRhaW5lcnMiLCJDb2xsZWN0aW9uVmlldyIsImNoaWxkVmlldyIsIm1vZHVsZSIsImV4cG9ydHMiLCJjb250YWluZXIiLCJmaWx0ZXJzIiwib3B0aW9ucyIsImRlc2NyaXB0b3JzIiwiaXNBcnJheSIsImZpbHRlckNvbGxlY3Rpb24iLCJDb2xsZWN0aW9uIiwiZWFjaCIsImFkZCIsIk1vZGVsIiwiZGVzY3JpcHRvciIsImxpc3RlblRvIiwib25FeGVjdXRlIiwiY29sbGVjdGlvbiIsInN0b3BMaXN0ZW5pbmciXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsV0FBV0QsUUFBUSxVQUFSLENBQWpCOztBQUVBLElBQU1FLGNBQWNELFNBQVNFLFVBQVQsQ0FBb0JDLElBQXBCLENBQXlCQyxNQUF6QixDQUFnQztB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QUFxQixFQUFFa0IsWUFBWSxLQUFLUixnQkFBbkIsRUFBckIsQ0FBOUI7QUFDRCxFQXhCK0M7O0FBMEJoRE8sWUFBVyxtQkFBU3JCLE1BQVQsRUFBaUI7QUFDM0IsT0FBS04sT0FBTCxDQUFhLFNBQWIsRUFBd0JNLE1BQXhCO0FBQ0EsRUE1QitDOztBQThCaERILGtCQUFpQiwyQkFBVztBQUMzQixPQUFLMEIsYUFBTCxDQUFtQixLQUFLVCxnQkFBeEI7QUFDQTtBQWhDK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoiZmlsdGVyQmFjay5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcblxuY29uc3QgQmxhbmtGaWx0ZXIgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImJsYW5rLWZpbHRlclwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi90ZW1wbGF0ZXMvZmlsdGVyQmFjay5udW5qXCIpLmJsYW5rRmlsdGVyLFxufSk7XG5cbmNvbnN0IFRleHRGaWx0ZXIgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInRleHQtZmlsdGVyXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9maWx0ZXJCYWNrLm51bmpcIikudGV4dEZpbHRlcixcblxuXHR1aToge1xuXHRcdGlucHV0OiBcIi50ZXh0LWZpbHRlci1pbnB1dFwiLFxuXHRcdGJ1dHRvbkNsZWFyOiBcIi5idXR0b24tY2xlYXJcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5idXR0b25DbGVhclwiOiBcIm9uQnV0dG9uQ2xlYXJDbGlja1wiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLm1vZGVsLmhhcyhcImRlYm91bmNlXCIpICYmIHRoaXMubW9kZWwuZ2V0KFwiZGVib3VuY2VcIikpXG5cdFx0XHR0aGlzLm9uSW5wdXRLZXlVcCA9IF8uZGVib3VuY2UodGhpcy5leGVjdXRlLmJpbmQodGhpcyksIHRoaXMubW9kZWwuZ2V0KFwiZGVib3VuY2VcIikpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMub25JbnB1dEtleVVwID0gdGhpcy5leGVjdXRlO1xuXG5cdFx0aWYgKCF0aGlzLm1vZGVsLmhhcyhcImRlZmF1bHRUZXh0XCIpKVxuXHRcdFx0dGhpcy5tb2RlbC5zZXQoXCJkZWZhdWx0VGV4dFwiLCBcIlR5cGUgc2VhcmNoIHF1ZXJ5Li4uXCIpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmlucHV0Lm9uKFwia2V5dXBcIiwgdGhpcy5vbklucHV0S2V5VXAuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0b25CdXR0b25DbGVhckNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmlucHV0LnZhbChcIlwiKTtcblx0XHR0aGlzLmV4ZWN1dGUoKTtcblx0fSxcblxuXHRleGVjdXRlOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBpbnB1dFZhbHVlID0gXy50cmltKHRoaXMudWkuaW5wdXQudmFsKCkpLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRpZiAoaW5wdXRWYWx1ZSkge1xuXHRcdFx0dGhpcy51aS5idXR0b25DbGVhci5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLm1vZGVsLnRyaWdnZXIoXCJleGVjdXRlXCIsIHRoaXMubW9kZWwuZ2V0KFwiZmlsdGVyRmFjdG9yeVwiKShpbnB1dFZhbHVlKSk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy51aS5idXR0b25DbGVhci5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLm1vZGVsLnRyaWdnZXIoXCJleGVjdXRlXCIsIF8uY29uc3RhbnQodHJ1ZSkpO1xuXHRcdH1cblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkuaW5wdXQub2ZmKFwia2V5dXBcIik7XG5cdH0sXG59KTtcblxuY29uc3QgRmlsdGVyID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJmaWx0ZXItYmFjay1maWx0ZXJcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4vdGVtcGxhdGVzL2ZpbHRlckJhY2subnVualwiKS5maWx0ZXIsXG5cblx0cmVnaW9uczoge1xuXHRcdGZpbHRlcjogXCIuZmlsdGVyLWJhY2stZmlsdGVyLXJlZ2lvblwiLFxuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmZpbHRlckltcGxlbWVudGF0aW9uID0gbnVsbDtcblxuXHRcdHN3aXRjaCAodGhpcy5tb2RlbC5nZXQoXCJ0eXBlXCIpKSB7XG5cdFx0XHRjYXNlIFwidGV4dFwiOlxuXHRcdFx0XHR0aGlzLmZpbHRlckltcGxlbWVudGF0aW9uID0gbmV3IFRleHRGaWx0ZXIoeyBtb2RlbDogdGhpcy5tb2RlbCB9KTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRoaXMuZmlsdGVySW1wbGVtZW50YXRpb24gPSBuZXcgQmxhbmtGaWx0ZXIoKTtcblx0XHR9XG5cblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJmaWx0ZXJcIiwgdGhpcy5maWx0ZXJJbXBsZW1lbnRhdGlvbik7XG5cdH0sXG59KTtcblxuY29uc3QgRmlsdGVyQ29udGFpbmVycyA9IEJhY2tib25lLk1hcmlvbmV0dGUuQ29sbGVjdGlvblZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImZpbHRlci1iYWNrLWZpbHRlci1jb250YWluZXJzXCIsXG5cblx0Y2hpbGRWaWV3OiBGaWx0ZXIsXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImZpbHRlci1iYWNrXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9maWx0ZXJCYWNrLm51bmpcIikuY29udGFpbmVyLFxuXG5cdHJlZ2lvbnM6IHtcblx0XHRmaWx0ZXJzOiBcIi5maWx0ZXItYmFjay1maWx0ZXItY29udGFpbmVycy1yZWdpb25cIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0aWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5kZXNjcmlwdG9ycyAmJiBfLmlzQXJyYXkob3B0aW9ucy5kZXNjcmlwdG9ycykpIHtcblx0XHRcdHRoaXMuZmlsdGVyQ29sbGVjdGlvbiA9IG5ldyBCYWNrYm9uZS5Db2xsZWN0aW9uKCk7XG5cblx0XHRcdF8uZWFjaChvcHRpb25zLmRlc2NyaXB0b3JzLCBkZXNjcmlwdG9yID0+IHtcblx0XHRcdFx0dGhpcy5maWx0ZXJDb2xsZWN0aW9uLmFkZChuZXcgQmFja2JvbmUuTW9kZWwoZGVzY3JpcHRvcikpO1xuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMubGlzdGVuVG8odGhpcy5maWx0ZXJDb2xsZWN0aW9uLCBcImV4ZWN1dGVcIiwgdGhpcy5vbkV4ZWN1dGUuYmluZCh0aGlzKSk7XG5cdFx0fVxuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5maWx0ZXJDb2xsZWN0aW9uKVxuXHRcdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiZmlsdGVyc1wiLCBuZXcgRmlsdGVyQ29udGFpbmVycyh7IGNvbGxlY3Rpb246IHRoaXMuZmlsdGVyQ29sbGVjdGlvbiB9KSk7XG5cdH0sXG5cblx0b25FeGVjdXRlOiBmdW5jdGlvbihmaWx0ZXIpIHtcblx0XHR0aGlzLnRyaWdnZXIoXCJleGVjdXRlXCIsIGZpbHRlcik7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcodGhpcy5maWx0ZXJDb2xsZWN0aW9uKTtcblx0fSxcbn0pO1xuIl19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar _ = require(\"lodash\");\n\nvar Filter = require(\"./filter\");\nvar SimpleMenu = require(\"./simpleMenu\");\n\nvar App = require(\"../index\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar FilterHost = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"filter-host-selector\",\n\n\tevents: {\n\t\tclick: \"toggleFilterList\"\n\t},\n\n\tgetTemplate: function getTemplate() {\n\t\treturn this.options.template || require(\"./templates/filterHost.nunj\").icon;\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\n\t\tthis.collection = new Backbone.Collection([], { model: Backbone.Model });\n\t\tthis.virtual = new Backbone.VirtualCollection(options.raw);\n\n\t\tthis.handlers = {};\n\t\tthis.filters = {};\n\t\tthis.externalFilters = {};\n\t\tthis.hasFilters = false;\n\t\tthis.filtersSynced = true;\n\t\tthis.serverParams = {};\n\t\tthis.baseUrl = options.raw.url;\n\n\t\tthis.listenTo(options.raw, \"reset\", this.refreshData.bind(this));\n\n\t\tthis.listenTo(Filter.Events, \"menu:close\", this.hideFilterList.bind(this));\n\n\t\tthis.listenTo(radio, App.Events.PageChange, this.hideFilterList.bind(this));\n\n\t\t_.each(options.filters, this.addFilter.bind(this));\n\n\t\t_.each(options.externalFilters || [], this.addExternalFilter.bind(this));\n\n\t\tif (options.defaultFilters.length === options.filters.length) {\n\t\t\t// If all filters start off enabled, don't show the filter toggle\n\t\t\tthis.$el.addClass(\"hide\");\n\t\t}\n\n\t\tthis.host = options.host || \"body\";\n\n\t\tif (this.virtual.length) {\n\t\t\tthis.updateFilters();\n\t\t\tthis.refreshData();\n\t\t}\n\t},\n\n\tonDestroy: function onDestroy() {\n\t\tif (this.list) this.list.destroy();\n\t\tthis.removeAllFilters();\n\t},\n\n\tgetServerFilters: function getServerFilters() {\n\t\treturn this.serverParams;\n\t},\n\n\tenableDefaultFilters: function enableDefaultFilters() {\n\t\tvar _this = this;\n\n\t\t_.each(this.options.defaultFilters, function (item) {\n\t\t\t_this.filterToggled(item, true);\n\t\t});\n\t},\n\n\thideFilterList: function hideFilterList() {\n\t\tif (this.list) this.list.destroy();\n\t},\n\n\thideAllFilterLists: function hideAllFilterLists() {\n\t\tif (this.list) this.list.destroy();\n\n\t\t_.each(this.filters, function (val) {\n\t\t\tif (val.view && val.view.closeMenu) val.view.closeMenu();\n\t\t});\n\t},\n\n\ttoggleFilterList: function toggleFilterList(evt) {\n\t\tvar _this2 = this;\n\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\n\t\tif (this.list && !this.list.isDestroyed()) {\n\t\t\tthis.stopListening(this.list, \"clicked closing\");\n\t\t\tthis.list.destroy();\n\t\t\tthis.$el.removeClass(\"active\");\n\t\t} else {\n\t\t\tFilter.Events.trigger(\"menu:close\");\n\n\t\t\tthis.list = new SimpleMenu({\n\t\t\t\tanchor: this.$el,\n\t\t\t\thost: this.host,\n\t\t\t\tstructure: [{\n\t\t\t\t\ttype: \"choose-many\",\n\t\t\t\t\tname: \"filters\",\n\t\t\t\t\telements: _.map(this.collection.models, function (item) {\n\t\t\t\t\t\treturn { text: item.get(\"label\"), id: item.get(\"name\"), selected: Boolean(item.get(\"selected\")) };\n\t\t\t\t\t})\n\t\t\t\t}]\n\t\t\t});\n\t\t\tthis.list.show();\n\n\t\t\tthis.listenTo(this.list, \"clicked\", this.filterToggled.bind(this));\n\t\t\tthis.listenTo(this.list, \"closing\", function () {\n\t\t\t\t_this2.$el.removeClass(\"active\");\n\t\t\t});\n\t\t\tthis.$el.addClass(\"active\");\n\t\t}\n\t},\n\n\taddFilter: function addFilter(filter) {\n\t\tif (filter.type === \"hidden\") {\n\t\t\tthis.filters[filter.name] = filter;\n\t\t\tvar resolver = filter.resolver || _.identity;\n\t\t\tthis.handlers[filter.name] = filter.handler.bind(this, _.map(filter.initialValue ? filter.initialValue() : [true], resolver));\n\t\t\tthis.filtersSynced = false;\n\t\t} else {\n\t\t\tthis.collection.add(filter);\n\t\t\tthis.filters[filter.name] = filter;\n\n\t\t\tif (_.includes(this.options.defaultFilters, filter.name)) {\n\t\t\t\t// Default filter, enable it now\n\t\t\t\tthis.filterToggled(filter.name, true);\n\t\t\t}\n\t\t}\n\t},\n\n\taddExternalFilter: function addExternalFilter(filter) {\n\t\tthis.externalFilters[filter.name] = filter;\n\n\t\tvar resolver = filter.resolver || _.identity;\n\t\tthis.handlers[filter.name] = filter.handler.bind(this, _.map(filter.initialValue ? filter.initialValue() : [true], resolver));\n\t\tthis.filtersSynced = false;\n\n\t\tthis.listenTo(filter, \"change changed\", this.onFilterChange.bind(this, filter.name));\n\t},\n\n\tremoveFilter: _.noop,\n\n\tremoveExternalFilter: _.noop,\n\n\tfilterToggled: function filterToggled(name, enabled) {\n\t\tvar id = name.id || name;\n\n\t\tif (enabled) {\n\t\t\t// Add new filter\n\t\t\tvar opts = this.filters[id];\n\t\t\topts.enabled = Boolean(this.virtual.length);\n\t\t\topts.host = this.host;\n\t\t\tthis.filters[id].view = new Filter.Control(opts);\n\n\t\t\tif (opts.server) {\n\t\t\t\tvar resolver = opts.resolver || _.identity;\n\t\t\t\tvar val = _.map(opts.initialValue ? opts.initialValue() : [true], resolver);\n\t\t\t\tthis.serverParams[id] = val;\n\t\t\t\tthis.updateServerFilters(!this.virtual.length);\n\t\t\t} else if (opts.initialValue) {\n\t\t\t\tvar _resolver = opts.resolver || _.identity;\n\t\t\t\tthis.handlers[id] = this.filters[id].handler.bind(this, _.map(opts.initialValue ? opts.initialValue() : [true], _resolver));\n\t\t\t\tthis.filtersSynced = false;\n\t\t\t}\n\n\t\t\tthis.listenTo(Filter.Events, id + \":selected\", this.onFilterChange.bind(this, id));\n\n\t\t\tthis.collection.each(function (item) {\n\t\t\t\tif (item.get(\"name\") === id) item.set(\"selected\", true);\n\t\t\t});\n\n\t\t\tif (!this.filters[id].hidden) {\n\t\t\t\tif (this.filters[id].view.selectraView) this.filters[id].view.show(this.options.filterContainer);else this.options.filterContainer.append(this.filters[id].view.render().el);\n\t\t\t}\n\n\t\t\tthis.updateFilters();\n\t\t} else if (id in this.filters) {\n\t\t\tthis.filters[id].view.destroy();\n\t\t\tthis.stopListening(Filter.Events, id + \":selected\");\n\t\t\tthis.collection.each(function (item) {\n\t\t\t\tif (item.get(\"name\") === id) item.set(\"selected\", false);\n\t\t\t});\n\t\t\tdelete this.filters[id].view;\n\n\t\t\tif (this.filters[id].server) {\n\t\t\t\t// Remove the server sync information\n\t\t\t\tdelete this.serverParams[id];\n\t\t\t\tthis.updateServerFilters();\n\t\t\t}\n\n\t\t\tif (id in this.handlers || this.filters[id].server) {\n\t\t\t\tdelete this.handlers[id];\n\t\t\t\tthis.filtersSynced = false;\n\t\t\t}\n\n\t\t\tvar change = this.updateFilters();\n\t\t\tif (change) this.refreshData();\n\t\t\tthis.trigger(\"changed\", change);\n\t\t}\n\t},\n\n\tclearFilters: function clearFilters() {\n\t\tthis.removeAllFilters();\n\t\tthis.updateFilters();\n\t\tthis.refreshData();\n\t},\n\n\tresetFilters: function resetFilters() {\n\t\tthis.removeAllFilters();\n\n\t\t_.each(this.options.filters, this.addFilter.bind(this));\n\n\t\t_.each(this.options.externalFilters || [], this.addExternalFilter.bind(this));\n\n\t\tthis.updateFilters();\n\t\tthis.refreshData();\n\t},\n\n\tremoveAllFilters: function removeAllFilters() {\n\t\tvar _this3 = this;\n\n\t\tvar _loop = function _loop(id) {\n\t\t\tif (_this3.filters[id].view) _this3.filters[id].view.destroy();\n\n\t\t\t_this3.stopListening(Filter.Events, id + \":selected\");\n\t\t\t_this3.collection.each(function (item) {\n\t\t\t\tif (item.get(\"name\") === id) item.set(\"selected\", false);\n\t\t\t});\n\n\t\t\tdelete _this3.filters[id].view;\n\n\t\t\tif (_this3.filters[id].server) {\n\t\t\t\t// Remove the server sync information\n\t\t\t\tdelete _this3.serverParams[id];\n\t\t\t}\n\n\t\t\tif (id in _this3.handlers) {\n\t\t\t\tdelete _this3.handlers[id];\n\t\t\t\t_this3.filtersSynced = false;\n\t\t\t\t_this3.updateFilters();\n\t\t\t}\n\t\t};\n\n\t\tfor (var id in this.filters) {\n\t\t\t_loop(id);\n\t\t}\n\t},\n\n\tonFilterChange: function onFilterChange(name, selection) {\n\t\t// When the user changes a filter, update the filter function for the appropriate virtual collection.\n\t\t// Re-filters the collection and propagates changes into the main collection\n\n\t\tif (selection.length) {\n\t\t\tvar f = name in this.filters ? this.filters[name] : this.externalFilters[name];\n\t\t\tvar resolver = f.resolver || _.identity;\n\n\t\t\t// Update any potential server-side filters\n\t\t\tif (f.server && !f.handler) {\n\t\t\t\tthis.serverParams[name] = _.map(selection, resolver);\n\t\t\t\tthis.updateServerFilters();\n\t\t\t} else {\n\t\t\t\tthis.handlers[name] = f.handler.bind(this, _.map(selection, resolver));\n\t\t\t}\n\t\t} else {\n\t\t\tdelete this.handlers[name];\n\t\t}\n\n\t\tthis.filtersSynced = false;\n\n\t\tvar change = this.updateFilters();\n\t\tif (change) this.refreshData();\n\t\tthis.trigger(\"changed\", change);\n\t},\n\n\tupdateServerFilters: function updateServerFilters(noFetch) {\n\t\tvar _this4 = this;\n\n\t\t// Wrap the collection's url fetch to append extra params\n\t\tthis.options.raw.url = function () {\n\t\t\tvar url = _this4.baseUrl;\n\t\t\tif (_.isFunction(_this4.baseUrl)) url = _this4.baseUrl();\n\n\t\t\tif (!_.includes(url, \"?\")) url += \"?\";\n\n\t\t\turl += _.map(_this4.serverParams, function (v, k) {\n\t\t\t\treturn k + \"=\" + v.join(\";\");\n\t\t\t}).join(\"&\");\n\t\t\treturn url;\n\t\t};\n\n\t\tif (noFetch) return;\n\n\t\tif (this.xhr) this.xhr.abort();\n\t\tthis.options.raw.reset([]);\n\t\tthis.xhr = this.options.raw.fetch({ reset: true });\n\t},\n\n\tupdateFilters: function updateFilters(force) {\n\t\tvar _this5 = this;\n\n\t\tif (this.filtersSynced && !force) return false;\n\n\t\tthis.filtersSynced = true;\n\n\t\tif (_.keys(this.handlers).length === 0) {\n\t\t\tif (this.hasFilters) {\n\t\t\t\tthis.virtual.updateFilter({});\n\t\t\t\tthis.filterToggle();\n\t\t\t\tthis.hasFilters = false;\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.hasFilters = true;\n\n\t\t// Update the filter for the virtual collection\n\t\tthis.virtual.updateFilter(function (model) {\n\t\t\treturn _.every(_this5.handlers, function (func) {\n\t\t\t\treturn func(model);\n\t\t\t});\n\t\t});\n\n\t\tthis.filterToggle();\n\n\t\treturn true;\n\t},\n\n\tfilterToggle: function filterToggle() {\n\t\tvar _this6 = this;\n\n\t\t_.each(this.filters, function (item) {\n\t\t\tif (item.view && item.view.toggle) item.view.toggle(_this6.options.raw.length, true);\n\t\t});\n\t},\n\n\trefreshData: function refreshData() {\n\t\tvar col = this.options.paged instanceof Backbone.PageableCollection ? this.options.paged.fullCollection : this.options.paged;\n\n\t\tcol.reset(this.virtual.models);\n\n\t\tif (this.options.paged instanceof Backbone.PageableCollection) {\n\t\t\tvar state = this.options.paged.state;\n\t\t\tif (this.options.paged.length <= (state.currentPage - 1) * state.pageSize) this.options.paged.getFirstPage();\n\t\t}\n\n\t\tthis.filterToggle();\n\t}\n});\n\nmodule.exports = FilterHost;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbHRlck1hbmFnZXIuanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwiXyIsIkZpbHRlciIsIlNpbXBsZU1lbnUiLCJBcHAiLCJyYWRpbyIsIlJhZGlvIiwiY2hhbm5lbCIsIkZpbHRlckhvc3QiLCJNYXJpb25ldHRlIiwiVmlldyIsImV4dGVuZCIsInRhZ05hbWUiLCJjbGFzc05hbWUiLCJldmVudHMiLCJjbGljayIsImdldFRlbXBsYXRlIiwib3B0aW9ucyIsInRlbXBsYXRlIiwiaWNvbiIsImluaXRpYWxpemUiLCJjb2xsZWN0aW9uIiwiQ29sbGVjdGlvbiIsIm1vZGVsIiwiTW9kZWwiLCJ2aXJ0dWFsIiwiVmlydHVhbENvbGxlY3Rpb24iLCJyYXciLCJoYW5kbGVycyIsImZpbHRlcnMiLCJleHRlcm5hbEZpbHRlcnMiLCJoYXNGaWx0ZXJzIiwiZmlsdGVyc1N5bmNlZCIsInNlcnZlclBhcmFtcyIsImJhc2VVcmwiLCJ1cmwiLCJsaXN0ZW5UbyIsInJlZnJlc2hEYXRhIiwiYmluZCIsIkV2ZW50cyIsImhpZGVGaWx0ZXJMaXN0IiwiUGFnZUNoYW5nZSIsImVhY2giLCJhZGRGaWx0ZXIiLCJhZGRFeHRlcm5hbEZpbHRlciIsImRlZmF1bHRGaWx0ZXJzIiwibGVuZ3RoIiwiJGVsIiwiYWRkQ2xhc3MiLCJob3N0IiwidXBkYXRlRmlsdGVycyIsIm9uRGVzdHJveSIsImxpc3QiLCJkZXN0cm95IiwicmVtb3ZlQWxsRmlsdGVycyIsImdldFNlcnZlckZpbHRlcnMiLCJlbmFibGVEZWZhdWx0RmlsdGVycyIsImZpbHRlclRvZ2dsZWQiLCJpdGVtIiwiaGlkZUFsbEZpbHRlckxpc3RzIiwidmFsIiwidmlldyIsImNsb3NlTWVudSIsInRvZ2dsZUZpbHRlckxpc3QiLCJldnQiLCJzdG9wUHJvcGFnYXRpb24iLCJwcmV2ZW50RGVmYXVsdCIsImlzRGVzdHJveWVkIiwic3RvcExpc3RlbmluZyIsInJlbW92ZUNsYXNzIiwidHJpZ2dlciIsImFuY2hvciIsInN0cnVjdHVyZSIsInR5cGUiLCJuYW1lIiwiZWxlbWVudHMiLCJtYXAiLCJtb2RlbHMiLCJ0ZXh0IiwiZ2V0IiwiaWQiLCJzZWxlY3RlZCIsIkJvb2xlYW4iLCJzaG93IiwiZmlsdGVyIiwicmVzb2x2ZXIiLCJpZGVudGl0eSIsImhhbmRsZXIiLCJpbml0aWFsVmFsdWUiLCJhZGQiLCJpbmNsdWRlcyIsIm9uRmlsdGVyQ2hhbmdlIiwicmVtb3ZlRmlsdGVyIiwibm9vcCIsInJlbW92ZUV4dGVybmFsRmlsdGVyIiwiZW5hYmxlZCIsIm9wdHMiLCJDb250cm9sIiwic2VydmVyIiwidXBkYXRlU2VydmVyRmlsdGVycyIsInNldCIsImhpZGRlbiIsInNlbGVjdHJhVmlldyIsImZpbHRlckNvbnRhaW5lciIsImFwcGVuZCIsInJlbmRlciIsImVsIiwiY2hhbmdlIiwiY2xlYXJGaWx0ZXJzIiwicmVzZXRGaWx0ZXJzIiwic2VsZWN0aW9uIiwiZiIsIm5vRmV0Y2giLCJpc0Z1bmN0aW9uIiwidiIsImsiLCJqb2luIiwieGhyIiwiYWJvcnQiLCJyZXNldCIsImZldGNoIiwiZm9yY2UiLCJrZXlzIiwidXBkYXRlRmlsdGVyIiwiZmlsdGVyVG9nZ2xlIiwiZXZlcnkiLCJmdW5jIiwidG9nZ2xlIiwiY29sIiwicGFnZWQiLCJQYWdlYWJsZUNvbGxlY3Rpb24iLCJmdWxsQ29sbGVjdGlvbiIsInN0YXRlIiwiY3VycmVudFBhZ2UiLCJwYWdlU2l6ZSIsImdldEZpcnN0UGFnZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1DLElBQUlELFFBQVEsUUFBUixDQUFWOztBQUVBLElBQU1FLFNBQVNGLFFBQVEsVUFBUixDQUFmO0FBQ0EsSUFBTUcsYUFBYUgsUUFBUSxjQUFSLENBQW5COztBQUVBLElBQU1JLE1BQU1KLFFBQVEsVUFBUixDQUFaOztBQUVBLElBQU1LLFFBQVFOLFNBQVNPLEtBQVQsQ0FBZUMsT0FBZixD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QixNQUFsQyxFQUEwQyxJQUExQztBQUNELEdBSEQ7QUFJQSxFQTdVaUQ7O0FBK1VsRFQsY0FBYSx1QkFBVztBQUN2QixNQUFNMkYsTUFBTSxLQUFLL0csT0FBTCxDQUFhZ0gsS0FBYixZQUE4QmxJLFNBQVNtSSxrQkFBdkMsR0FBNEQsS0FBS2pILE9BQUwsQ0FBYWdILEtBQWIsQ0FBbUJFLGNBQS9FLEdBQWdHLEtBQUtsSCxPQUFMLENBQWFnSCxLQUF6SDs7QUFFQUQsTUFBSVQsS0FBSixDQUFVLEtBQUs5RixPQUFMLENBQWFvRCxNQUF2Qjs7QUFFQSxNQUFJLEtBQUs1RCxPQUFMLENBQWFnSCxLQUFiLFlBQThCbEksU0FBU21JLGtCQUEzQyxFQUErRDtBQUM5RCxPQUFNRSxRQUFRLEtBQUtuSCxPQUFMLENBQWFnSCxLQUFiLENBQW1CRyxLQUFqQztBQUNBLE9BQUksS0FBS25ILE9BQUwsQ0FBYWdILEtBQWIsQ0FBbUJuRixNQUFuQixJQUE2QixDQUFDc0YsTUFBTUMsV0FBTixHQUFvQixDQUFyQixJQUEwQkQsTUFBTUUsUUFBakUsRUFDQyxLQUFLckgsT0FBTCxDQUFhZ0gsS0FBYixDQUFtQk0sWUFBbkI7QUFDRDs7QUFFRCxPQUFLWCxZQUFMO0FBQ0E7QUEzVmlELENBQWhDLENBQW5COztBQThWQVksT0FBT0MsT0FBUCxHQUFpQmpJLFVBQWpCIiwiZmlsZSI6ImZpbHRlck1hbmFnZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5cbmNvbnN0IEZpbHRlciA9IHJlcXVpcmUoXCIuL2ZpbHRlclwiKTtcbmNvbnN0IFNpbXBsZU1lbnUgPSByZXF1aXJlKFwiLi9zaW1wbGVNZW51XCIpO1xuXG5jb25zdCBBcHAgPSByZXF1aXJlKFwiLi4vaW5kZXhcIik7XG5cbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcblxuY29uc3QgRmlsdGVySG9zdCA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwiZmlsdGVyLWhvc3Qtc2VsZWN0b3JcIixcblxuXHRldmVudHM6IHtcblx0XHRjbGljazogXCJ0b2dnbGVGaWx0ZXJMaXN0XCIsXG5cdH0sXG5cblx0Z2V0VGVtcGxhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm9wdGlvbnMudGVtcGxhdGUgfHwgcmVxdWlyZShcIi4vdGVtcGxhdGVzL2ZpbHRlckhvc3QubnVualwiKS5pY29uO1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG5cdFx0dGhpcy5jb2xsZWN0aW9uID0gbmV3IEJhY2tib25lLkNvbGxlY3Rpb24oW10sIHsgbW9kZWw6IEJhY2tib25lLk1vZGVsIH0pO1xuXHRcdHRoaXMudmlydHVhbCA9IG5ldyBCYWNrYm9uZS5WaXJ0dWFsQ29sbGVjdGlvbihvcHRpb25zLnJhdyk7XG5cblx0XHR0aGlzLmhhbmRsZXJzID0ge307XG5cdFx0dGhpcy5maWx0ZXJzID0ge307XG5cdFx0dGhpcy5leHRlcm5hbEZpbHRlcnMgPSB7fTtcblx0XHR0aGlzLmhhc0ZpbHRlcnMgPSBmYWxzZTtcblx0XHR0aGlzLmZpbHRlcnNTeW5jZWQgPSB0cnVlO1xuXHRcdHRoaXMuc2VydmVyUGFyYW1zID0ge307XG5cdFx0dGhpcy5iYXNlVXJsID0gb3B0aW9ucy5yYXcudXJsO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhvcHRpb25zLnJhdywgXCJyZXNldFwiLCB0aGlzLnJlZnJlc2hEYXRhLmJpbmQodGhpcykpO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhGaWx0ZXIuRXZlbnRzLCBcIm1lbnU6Y2xvc2VcIiwgdGhpcy5oaWRlRmlsdGVyTGlzdC5iaW5kKHRoaXMpKTtcblxuXHRcdHRoaXMubGlzdGVuVG8ocmFkaW8sIEFwcC5FdmVudHMuUGFnZUNoYW5nZSwgdGhpcy5oaWRlRmlsdGVyTGlzdC5iaW5kKHRoaXMpKTtcblxuXHRcdF8uZWFjaChvcHRpb25zLmZpbHRlcnMsIHRoaXMuYWRkRmlsdGVyLmJpbmQodGhpcykpO1xuXG5cdFx0Xy5lYWNoKG9wdGlvbnMuZXh0ZXJuYWxGaWx0ZXJzIHx8IFtdLCB0aGlzLmFkZEV4dGVybmFsRmlsdGVyLmJpbmQodGhpcykpO1xuXG5cdFx0aWYgKG9wdGlvbnMuZGVmYXVsdEZpbHRlcnMubGVuZ3RoID09PSBvcHRpb25zLmZpbHRlcnMubGVuZ3RoKSB7XG5cdFx0XHQvLyBJZiBhbGwgZmlsdGVycyBzdGFydCBvZmYgZW5hYmxlZCwgZG9uJ3Qgc2hvdyB0aGUgZmlsdGVyIHRvZ2dsZVxuXHRcdFx0dGhpcy4kZWwuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblxuXHRcdHRoaXMuaG9zdCA9IG9wdGlvbnMuaG9zdCB8fCBcImJvZHlcIjtcblxuXHRcdGlmICh0aGlzLnZpcnR1YWwubGVuZ3RoKSB7XG5cdFx0XHR0aGlzLnVwZGF0ZUZpbHRlcnMoKTtcblx0XHRcdHRoaXMucmVmcmVzaERhdGEoKTtcblx0XHR9XG5cdH0sXG5cblx0b25EZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5saXN0KVxuXHRcdFx0dGhpcy5saXN0LmRlc3Ryb3koKTtcblx0XHR0aGlzLnJlbW92ZUFsbEZpbHRlcnMoKTtcblx0fSxcblxuXHRnZXRTZXJ2ZXJGaWx0ZXJzOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5zZXJ2ZXJQYXJhbXM7XG5cdH0sXG5cblx0ZW5hYmxlRGVmYXVsdEZpbHRlcnM6IGZ1bmN0aW9uKCkge1xuXHRcdF8uZWFjaCh0aGlzLm9wdGlvbnMuZGVmYXVsdEZpbHRlcnMsIGl0ZW0gPT4ge1xuXHRcdFx0dGhpcy5maWx0ZXJUb2dnbGVkKGl0ZW0sIHRydWUpO1xuXHRcdH0pO1xuXHR9LFxuXG5cdGhpZGVGaWx0ZXJMaXN0OiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5saXN0KVxuXHRcdFx0dGhpcy5saXN0LmRlc3Ryb3koKTtcblx0fSxcblxuXHRoaWRlQWxsRmlsdGVyTGlzdHM6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLmxpc3QpXG5cdFx0XHR0aGlzLmxpc3QuZGVzdHJveSgpO1xuXG5cdFx0Xy5lYWNoKHRoaXMuZmlsdGVycywgdmFsID0+IHtcblx0XHRcdGlmICh2YWwudmlldyAmJiB2YWwudmlldy5jbG9zZU1lbnUpXG5cdFx0XHRcdHZhbC52aWV3LmNsb3NlTWVudSgpO1xuXHRcdH0pO1xuXHR9LFxuXG5cdHRvZ2dsZUZpbHRlckxpc3Q6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRldnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdGlmICh0aGlzLmxpc3QgJiYgIXRoaXMubGlzdC5pc0Rlc3Ryb3llZCgpKSB7XG5cdFx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcodGhpcy5saXN0LCBcImNsaWNrZWQgY2xvc2luZ1wiKTtcblx0XHRcdHRoaXMubGlzdC5kZXN0cm95KCk7XG5cdFx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyhcImFjdGl2ZVwiKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRGaWx0ZXIuRXZlbnRzLnRyaWdnZXIoXCJtZW51OmNsb3NlXCIpO1xuXG5cdFx0XHR0aGlzLmxpc3QgPSBuZXcgU2ltcGxlTWVudSh7XG5cdFx0XHRcdGFuY2hvcjogdGhpcy4kZWwsXG5cdFx0XHRcdGhvc3Q6IHRoaXMuaG9zdCxcblx0XHRcdFx0c3RydWN0dXJlOiBbe1xuXHRcdFx0XHRcdHR5cGU6IFwiY2hvb3NlLW1hbnlcIixcblx0XHRcdFx0XHRuYW1lOiBcImZpbHRlcnNcIixcblx0XHRcdFx0XHRlbGVtZW50czogXy5tYXAodGhpcy5jb2xsZWN0aW9uLm1vZGVscywgaXRlbSA9PiAoeyB0ZXh0OiBpdGVtLmdldChcImxhYmVsXCIpLCBpZDogaXRlbS5nZXQoXCJuYW1lXCIpLCBzZWxlY3RlZDogQm9vbGVhbihpdGVtLmdldChcInNlbGVjdGVkXCIpKSB9KSksXG5cdFx0XHRcdH1dLFxuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLmxpc3Quc2hvdygpO1xuXG5cdFx0XHR0aGlzLmxpc3RlblRvKHRoaXMubGlzdCwgXCJjbGlja2VkXCIsIHRoaXMuZmlsdGVyVG9nZ2xlZC5iaW5kKHRoaXMpKTtcblx0XHRcdHRoaXMubGlzdGVuVG8odGhpcy5saXN0LCBcImNsb3NpbmdcIiwgKCkgPT4geyB0aGlzLiRlbC5yZW1vdmVDbGFzcyhcImFjdGl2ZVwiKTsgfSk7XG5cdFx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcImFjdGl2ZVwiKTtcblx0XHR9XG5cdH0sXG5cblx0YWRkRmlsdGVyOiBmdW5jdGlvbihmaWx0ZXIpIHtcblx0XHRpZiAoZmlsdGVyLnR5cGUgPT09IFwiaGlkZGVuXCIpIHtcblx0XHRcdHRoaXMuZmlsdGVyc1tmaWx0ZXIubmFtZV0gPSBmaWx0ZXI7XG5cdFx0XHRjb25zdCByZXNvbHZlciA9IGZpbHRlci5yZXNvbHZlciB8fCBfLmlkZW50aXR5O1xuXHRcdFx0dGhpcy5oYW5kbGVyc1tmaWx0ZXIubmFtZV0gPSBmaWx0ZXIuaGFuZGxlci5iaW5kKHRoaXMsIF8ubWFwKGZpbHRlci5pbml0aWFsVmFsdWUgPyBmaWx0ZXIuaW5pdGlhbFZhbHVlKCkgOiBbdHJ1ZV0sIHJlc29sdmVyKSk7XG5cdFx0XHR0aGlzLmZpbHRlcnNTeW5jZWQgPSBmYWxzZTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLmNvbGxlY3Rpb24uYWRkKGZpbHRlcik7XG5cdFx0XHR0aGlzLmZpbHRlcnNbZmlsdGVyLm5hbWVdID0gZmlsdGVyO1xuXG5cdFx0XHRpZiAoXy5pbmNsdWRlcyh0aGlzLm9wdGlvbnMuZGVmYXVsdEZpbHRlcnMsIGZpbHRlci5uYW1lKSkge1xuXHRcdFx0XHQvLyBEZWZhdWx0IGZpbHRlciwgZW5hYmxlIGl0IG5vd1xuXHRcdFx0XHR0aGlzLmZpbHRlclRvZ2dsZWQoZmlsdGVyLm5hbWUsIHRydWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRhZGRFeHRlcm5hbEZpbHRlcjogZnVuY3Rpb24oZmlsdGVyKSB7XG5cdFx0dGhpcy5leHRlcm5hbEZpbHRlcnNbZmlsdGVyLm5hbWVdID0gZmlsdGVyO1xuXG5cdFx0Y29uc3QgcmVzb2x2ZXIgPSBmaWx0ZXIucmVzb2x2ZXIgfHwgXy5pZGVudGl0eTtcblx0XHR0aGlzLmhhbmRsZXJzW2ZpbHRlci5uYW1lXSA9IGZpbHRlci5oYW5kbGVyLmJpbmQodGhpcywgXy5tYXAoZmlsdGVyLmluaXRpYWxWYWx1ZSA/IGZpbHRlci5pbml0aWFsVmFsdWUoKSA6IFt0cnVlXSwgcmVzb2x2ZXIpKTtcblx0XHR0aGlzLmZpbHRlcnNTeW5jZWQgPSBmYWxzZTtcblxuXHRcdHRoaXMubGlzdGVuVG8oZmlsdGVyLCBcImNoYW5nZSBjaGFuZ2VkXCIsIHRoaXMub25GaWx0ZXJDaGFuZ2UuYmluZCh0aGlzLCBmaWx0ZXIubmFtZSkpO1xuXHR9LFxuXG5cdHJlbW92ZUZpbHRlcjogXy5ub29wLFxuXG5cdHJlbW92ZUV4dGVybmFsRmlsdGVyOiBfLm5vb3AsXG5cblx0ZmlsdGVyVG9nZ2xlZDogZnVuY3Rpb24obmFtZSwgZW5hYmxlZCkge1xuXHRcdGNvbnN0IGlkID0gbmFtZS5pZCB8fCBuYW1lO1xuXG5cdFx0aWYgKGVuYWJsZWQpIHtcblx0XHRcdC8vIEFkZCBuZXcgZmlsdGVyXG5cdFx0XHRjb25zdCBvcHRzID0gdGhpcy5maWx0ZXJzW2lkXTtcblx0XHRcdG9wdHMuZW5hYmxlZCA9IEJvb2xlYW4odGhpcy52aXJ0dWFsLmxlbmd0aCk7XG5cdFx0XHRvcHRzLmhvc3QgPSB0aGlzLmhvc3Q7XG5cdFx0XHR0aGlzLmZpbHRlcnNbaWRdLnZpZXcgPSBuZXcgRmlsdGVyLkNvbnRyb2wob3B0cyk7XG5cblx0XHRcdGlmIChvcHRzLnNlcnZlcikge1xuXHRcdFx0XHRjb25zdCByZXNvbHZlciA9IG9wdHMucmVzb2x2ZXIgfHwgXy5pZGVudGl0eTtcblx0XHRcdFx0Y29uc3QgdmFsID0gXy5tYXAob3B0cy5pbml0aWFsVmFsdWUgPyBvcHRzLmluaXRpYWxWYWx1ZSgpIDogW3RydWVdLCByZXNvbHZlcik7XG5cdFx0XHRcdHRoaXMuc2VydmVyUGFyYW1zW2lkXSA9IHZhbDtcblx0XHRcdFx0dGhpcy51cGRhdGVTZXJ2ZXJGaWx0ZXJzKCF0aGlzLnZpcnR1YWwubGVuZ3RoKTtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKG9wdHMuaW5pdGlhbFZhbHVlKSB7XG5cdFx0XHRcdGNvbnN0IHJlc29sdmVyID0gb3B0cy5yZXNvbHZlciB8fCBfLmlkZW50aXR5O1xuXHRcdFx0XHR0aGlzLmhhbmRsZXJzW2lkXSA9IHRoaXMuZmlsdGVyc1tpZF0uaGFuZGxlci5iaW5kKHRoaXMsIF8ubWFwKG9wdHMuaW5pdGlhbFZhbHVlID8gb3B0cy5pbml0aWFsVmFsdWUoKSA6IFt0cnVlXSwgcmVzb2x2ZXIpKTtcblx0XHRcdFx0dGhpcy5maWx0ZXJzU3luY2VkID0gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubGlzdGVuVG8oRmlsdGVyLkV2ZW50cywgaWQgKyBcIjpzZWxlY3RlZFwiLCB0aGlzLm9uRmlsdGVyQ2hhbmdlLmJpbmQodGhpcywgaWQpKTtcblxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uLmVhY2goaXRlbSA9PiB7XG5cdFx0XHRcdGlmIChpdGVtLmdldChcIm5hbWVcIikgPT09IGlkKVxuXHRcdFx0XHRcdGl0ZW0uc2V0KFwic2VsZWN0ZWRcIiwgdHJ1ZSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKCF0aGlzLmZpbHRlcnNbaWRdLmhpZGRlbikge1xuXHRcdFx0XHRpZiAodGhpcy5maWx0ZXJzW2lkXS52aWV3LnNlbGVjdHJhVmlldylcblx0XHRcdFx0XHR0aGlzLmZpbHRlcnNbaWRdLnZpZXcuc2hvdyh0aGlzLm9wdGlvbnMuZmlsdGVyQ29udGFpbmVyKTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdHRoaXMub3B0aW9ucy5maWx0ZXJDb250YWluZXIuYXBwZW5kKHRoaXMuZmlsdGVyc1tpZF0udmlldy5yZW5kZXIoKS5lbCk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMudXBkYXRlRmlsdGVycygpO1xuXHRcdH1cblx0XHRlbHNlIGlmIChpZCBpbiB0aGlzLmZpbHRlcnMpIHtcblx0XHRcdHRoaXMuZmlsdGVyc1tpZF0udmlldy5kZXN0cm95KCk7XG5cdFx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcoRmlsdGVyLkV2ZW50cywgaWQgKyBcIjpzZWxlY3RlZFwiKTtcblx0XHRcdHRoaXMuY29sbGVjdGlvbi5lYWNoKGl0ZW0gPT4ge1xuXHRcdFx0XHRpZiAoaXRlbS5nZXQoXCJuYW1lXCIpID09PSBpZClcblx0XHRcdFx0XHRpdGVtLnNldChcInNlbGVjdGVkXCIsIGZhbHNlKTtcblx0XHRcdH0pO1xuXHRcdFx0ZGVsZXRlIHRoaXMuZmlsdGVyc1tpZF0udmlldztcblxuXHRcdFx0aWYgKHRoaXMuZmlsdGVyc1tpZF0uc2VydmVyKSB7XG5cdFx0XHRcdC8vIFJlbW92ZSB0aGUgc2VydmVyIHN5bmMgaW5mb3JtYXRpb25cblx0XHRcdFx0ZGVsZXRlIHRoaXMuc2VydmVyUGFyYW1zW2lkXTtcblx0XHRcdFx0dGhpcy51cGRhdGVTZXJ2ZXJGaWx0ZXJzKCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpZCBpbiB0aGlzLmhhbmRsZXJzIHx8IHRoaXMuZmlsdGVyc1tpZF0uc2VydmVyKSB7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzLmhhbmRsZXJzW2lkXTtcblx0XHRcdFx0dGhpcy5maWx0ZXJzU3luY2VkID0gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGNoYW5nZSA9IHRoaXMudXBkYXRlRmlsdGVycygpO1xuXHRcdFx0aWYgKGNoYW5nZSlcblx0XHRcdFx0dGhpcy5yZWZyZXNoRGF0YSgpO1xuXHRcdFx0dGhpcy50cmlnZ2VyKFwiY2hhbmdlZFwiLCBjaGFuZ2UpO1xuXHRcdH1cblx0fSxcblxuXHRjbGVhckZpbHRlcnM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMucmVtb3ZlQWxsRmlsdGVycygpO1xuXHRcdHRoaXMudXBkYXRlRmlsdGVycygpO1xuXHRcdHRoaXMucmVmcmVzaERhdGEoKTtcblx0fSxcblxuXHRyZXNldEZpbHRlcnM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMucmVtb3ZlQWxsRmlsdGVycygpO1xuXG5cdFx0Xy5lYWNoKHRoaXMub3B0aW9ucy5maWx0ZXJzLCB0aGlzLmFkZEZpbHRlci5iaW5kKHRoaXMpKTtcblxuXHRcdF8uZWFjaCh0aGlzLm9wdGlvbnMuZXh0ZXJuYWxGaWx0ZXJzIHx8IFtdLCB0aGlzLmFkZEV4dGVybmFsRmlsdGVyLmJpbmQodGhpcykpO1xuXG5cdFx0dGhpcy51cGRhdGVGaWx0ZXJzKCk7XG5cdFx0dGhpcy5yZWZyZXNoRGF0YSgpO1xuXHR9LFxuXG5cdHJlbW92ZUFsbEZpbHRlcnM6IGZ1bmN0aW9uKCkge1xuXHRcdGZvcihjb25zdCBpZCBpbiB0aGlzLmZpbHRlcnMpIHtcblx0XHRcdGlmICh0aGlzLmZpbHRlcnNbaWRdLnZpZXcpXG5cdFx0XHRcdHRoaXMuZmlsdGVyc1tpZF0udmlldy5kZXN0cm95KCk7XG5cblx0XHRcdHRoaXMuc3RvcExpc3RlbmluZyhGaWx0ZXIuRXZlbnRzLCBpZCArIFwiOnNlbGVjdGVkXCIpO1xuXHRcdFx0dGhpcy5jb2xsZWN0aW9uLmVhY2goaXRlbSA9PiB7XG5cdFx0XHRcdGlmIChpdGVtLmdldChcIm5hbWVcIikgPT09IGlkKVxuXHRcdFx0XHRcdGl0ZW0uc2V0KFwic2VsZWN0ZWRcIiwgZmFsc2UpO1xuXHRcdFx0fSk7XG5cblx0XHRcdGRlbGV0ZSB0aGlzLmZpbHRlcnNbaWRdLnZpZXc7XG5cblx0XHRcdGlmICh0aGlzLmZpbHRlcnNbaWRdLnNlcnZlcikge1xuXHRcdFx0XHQvLyBSZW1vdmUgdGhlIHNlcnZlciBzeW5jIGluZm9ybWF0aW9uXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLnNlcnZlclBhcmFtc1tpZF07XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpZCBpbiB0aGlzLmhhbmRsZXJzKSB7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzLmhhbmRsZXJzW2lkXTtcblx0XHRcdFx0dGhpcy5maWx0ZXJzU3luY2VkID0gZmFsc2U7XG5cdFx0XHRcdHRoaXMudXBkYXRlRmlsdGVycygpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRvbkZpbHRlckNoYW5nZTogZnVuY3Rpb24obmFtZSwgc2VsZWN0aW9uKSB7XG5cdFx0Ly8gV2hlbiB0aGUgdXNlciBjaGFuZ2VzIGEgZmlsdGVyLCB1cGRhdGUgdGhlIGZpbHRlciBmdW5jdGlvbiBmb3IgdGhlIGFwcHJvcHJpYXRlIHZpcnR1YWwgY29sbGVjdGlvbi5cblx0XHQvLyBSZS1maWx0ZXJzIHRoZSBjb2xsZWN0aW9uIGFuZCBwcm9wYWdhdGVzIGNoYW5nZXMgaW50byB0aGUgbWFpbiBjb2xsZWN0aW9uXG5cblx0XHRpZiAoc2VsZWN0aW9uLmxlbmd0aCkge1xuXHRcdFx0Y29uc3QgZiA9IG5hbWUgaW4gdGhpcy5maWx0ZXJzID8gdGhpcy5maWx0ZXJzW25hbWVdIDogdGhpcy5leHRlcm5hbEZpbHRlcnNbbmFtZV07XG5cdFx0XHRjb25zdCByZXNvbHZlciA9IGYucmVzb2x2ZXIgfHwgXy5pZGVudGl0eTtcblxuXHRcdFx0Ly8gVXBkYXRlIGFueSBwb3RlbnRpYWwgc2VydmVyLXNpZGUgZmlsdGVyc1xuXHRcdFx0aWYgKGYuc2VydmVyICYmICFmLmhhbmRsZXIpIHtcblx0XHRcdFx0dGhpcy5zZXJ2ZXJQYXJhbXNbbmFtZV0gPSBfLm1hcChzZWxlY3Rpb24sIHJlc29sdmVyKTtcblx0XHRcdFx0dGhpcy51cGRhdGVTZXJ2ZXJGaWx0ZXJzKCk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0dGhpcy5oYW5kbGVyc1tuYW1lXSA9IGYuaGFuZGxlci5iaW5kKHRoaXMsIF8ubWFwKHNlbGVjdGlvbiwgcmVzb2x2ZXIpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRkZWxldGUgdGhpcy5oYW5kbGVyc1tuYW1lXTtcblx0XHR9XG5cblx0XHR0aGlzLmZpbHRlcnNTeW5jZWQgPSBmYWxzZTtcblxuXHRcdGNvbnN0IGNoYW5nZSA9IHRoaXMudXBkYXRlRmlsdGVycygpO1xuXHRcdGlmIChjaGFuZ2UpXG5cdFx0XHR0aGlzLnJlZnJlc2hEYXRhKCk7XG5cdFx0dGhpcy50cmlnZ2VyKFwiY2hhbmdlZFwiLCBjaGFuZ2UpO1xuXHR9LFxuXG5cdHVwZGF0ZVNlcnZlckZpbHRlcnM6IGZ1bmN0aW9uKG5vRmV0Y2gpIHtcblx0XHQvLyBXcmFwIHRoZSBjb2xsZWN0aW9uJ3MgdXJsIGZldGNoIHRvIGFwcGVuZCBleHRyYSBwYXJhbXNcblx0XHR0aGlzLm9wdGlvbnMucmF3LnVybCA9ICgpID0+IHtcblx0XHRcdGxldCB1cmwgPSB0aGlzLmJhc2VVcmw7XG5cdFx0XHRpZiAoXy5pc0Z1bmN0aW9uKHRoaXMuYmFzZVVybCkpXG5cdFx0XHRcdHVybCA9IHRoaXMuYmFzZVVybCgpO1xuXG5cdFx0XHRpZiAoIV8uaW5jbHVkZXModXJsLCBcIj9cIikpXG5cdFx0XHRcdHVybCArPSBcIj9cIjtcblxuXHRcdFx0dXJsICs9IF8ubWFwKHRoaXMuc2VydmVyUGFyYW1zLCAodiwgaykgPT4gayArIFwiPVwiICsgdi5qb2luKFwiO1wiKSkuam9pbihcIiZcIik7XG5cdFx0XHRyZXR1cm4gdXJsO1xuXHRcdH07XG5cblx0XHRpZiAobm9GZXRjaClcblx0XHRcdHJldHVybjtcblxuXHRcdGlmICh0aGlzLnhocilcblx0XHRcdHRoaXMueGhyLmFib3J0KCk7XG5cdFx0dGhpcy5vcHRpb25zLnJhdy5yZXNldChbXSk7XG5cdFx0dGhpcy54aHIgPSB0aGlzLm9wdGlvbnMucmF3LmZldGNoKHsgcmVzZXQ6IHRydWUgfSk7XG5cdH0sXG5cblx0dXBkYXRlRmlsdGVyczogZnVuY3Rpb24oZm9yY2UpIHtcblx0XHRpZiAodGhpcy5maWx0ZXJzU3luY2VkICYmICFmb3JjZSlcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdHRoaXMuZmlsdGVyc1N5bmNlZCA9IHRydWU7XG5cblx0XHRpZiAoXy5rZXlzKHRoaXMuaGFuZGxlcnMpLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0aWYgKHRoaXMuaGFzRmlsdGVycykge1xuXHRcdFx0XHR0aGlzLnZpcnR1YWwudXBkYXRlRmlsdGVyKHt9KTtcblx0XHRcdFx0dGhpcy5maWx0ZXJUb2dnbGUoKTtcblx0XHRcdFx0dGhpcy5oYXNGaWx0ZXJzID0gZmFsc2U7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dGhpcy5oYXNGaWx0ZXJzID0gdHJ1ZTtcblxuXHRcdC8vIFVwZGF0ZSB0aGUgZmlsdGVyIGZvciB0aGUgdmlydHVhbCBjb2xsZWN0aW9uXG5cdFx0dGhpcy52aXJ0dWFsLnVwZGF0ZUZpbHRlcihtb2RlbCA9PiBfLmV2ZXJ5KHRoaXMuaGFuZGxlcnMsIGZ1bmMgPT4gZnVuYyhtb2RlbCkpKTtcblxuXHRcdHRoaXMuZmlsdGVyVG9nZ2xlKCk7XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHRmaWx0ZXJUb2dnbGU6IGZ1bmN0aW9uKCkge1xuXHRcdF8uZWFjaCh0aGlzLmZpbHRlcnMsIGl0ZW0gPT4ge1xuXHRcdFx0aWYgKGl0ZW0udmlldyAmJiBpdGVtLnZpZXcudG9nZ2xlKVxuXHRcdFx0XHRpdGVtLnZpZXcudG9nZ2xlKHRoaXMub3B0aW9ucy5yYXcubGVuZ3RoLCB0cnVlKTtcblx0XHR9KTtcblx0fSxcblxuXHRyZWZyZXNoRGF0YTogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgY29sID0gdGhpcy5vcHRpb25zLnBhZ2VkIGluc3RhbmNlb2YgQmFja2JvbmUuUGFnZWFibGVDb2xsZWN0aW9uID8gdGhpcy5vcHRpb25zLnBhZ2VkLmZ1bGxDb2xsZWN0aW9uIDogdGhpcy5vcHRpb25zLnBhZ2VkO1xuXG5cdFx0Y29sLnJlc2V0KHRoaXMudmlydHVhbC5tb2RlbHMpO1xuXG5cdFx0aWYgKHRoaXMub3B0aW9ucy5wYWdlZCBpbnN0YW5jZW9mIEJhY2tib25lLlBhZ2VhYmxlQ29sbGVjdGlvbikge1xuXHRcdFx0Y29uc3Qgc3RhdGUgPSB0aGlzLm9wdGlvbnMucGFnZWQuc3RhdGU7XG5cdFx0XHRpZiAodGhpcy5vcHRpb25zLnBhZ2VkLmxlbmd0aCA8PSAoc3RhdGUuY3VycmVudFBhZ2UgLSAxKSAqIHN0YXRlLnBhZ2VTaXplKVxuXHRcdFx0XHR0aGlzLm9wdGlvbnMucGFnZWQuZ2V0Rmlyc3RQYWdlKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5maWx0ZXJUb2dnbGUoKTtcblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZpbHRlckhvc3Q7Il19",
    "\"use strict\";\n\n(function (root, factory) {\n\tif (typeof exports === \"undefined\") root.FlashCardPlayer = factory();else module.exports = factory();\n})(undefined, function () {\n\t\"use strict\";\n\n\t/* eslint-env browser */\n\n\tvar NativeCustomEvent = window.CustomEvent;\n\n\tvar useNative = function useNative() {\n\t\ttry {\n\t\t\tvar p = new NativeCustomEvent(\"cat\", { detail: { foo: \"bar\" } });\n\t\t\treturn p.type === \"cat\" && p.detail.foo === \"bar\";\n\t\t} catch (e) {}\n\n\t\treturn false;\n\t};\n\n\t/**\n  * Cross-browser `CustomEvent` constructor.\n  *\n  * https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent.CustomEvent\n  *\n  * @public\n  */\n\n\tvar NativeCustomEvent = window.CustomEvent;\n\n\tfunction useNative() {\n\t\ttry {\n\t\t\tvar p = new NativeCustomEvent(\"cat\", { detail: { foo: \"bar\" } });\n\t\t\treturn p.type === \"cat\" && p.detail.foo === \"bar\";\n\t\t} catch (e) {}\n\n\t\treturn false;\n\t}\n\n\t/**\n  * Cross-browser `CustomEvent` constructor.\n  *\n  * https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent.CustomEvent\n  *\n  * @public\n  */\n\n\tvar eventer = useNative() ? NativeCustomEvent :\n\n\t// IE >= 9\n\ttypeof document.createEvent === \"function\" ? function CustomEvent(type, params) {\n\t\tvar e = document.createEvent(\"CustomEvent\");\n\n\t\tif (params) e.initCustomEvent(type, params.bubbles, params.cancelable, params.detail);else e.initCustomEvent(type, false, false, void 0);\n\n\t\treturn e;\n\t} :\n\n\t// IE <= 8\n\tfunction CustomEvent(type, params) {\n\t\tvar e = document.createEventObject();\n\n\t\te.type = type;\n\n\t\tif (params) {\n\t\t\te.bubbles = Boolean(params.bubbles);\n\t\t\te.cancelable = Boolean(params.cancelable);\n\t\t\te.detail = params.detail;\n\t\t} else {\n\t\t\te.bubbles = false;\n\t\t\te.cancelable = false;\n\t\t\te.detail = void 0;\n\t\t}\n\n\t\treturn e;\n\t};\n\n\tif (!useNative()) window.CustomEvent = eventer;\n\n\t// Polyfill: Array.from()\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from\n\t//\n\t// Production steps of ECMA-262, Edition 6, 22.1.2.1\n\tif (!Array.from) {\n\t\tArray.from = function () {\n\t\t\tvar toStr = Object.prototype.toString;\n\t\t\tvar isCallable = function isCallable(fn) {\n\t\t\t\treturn typeof fn === 'function' || toStr.call(fn) === '[object Function]';\n\t\t\t};\n\t\t\tvar toInteger = function toInteger(value) {\n\t\t\t\tvar number = Number(value);\n\t\t\t\tif (isNaN(number)) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\tif (number === 0 || !isFinite(number)) {\n\t\t\t\t\treturn number;\n\t\t\t\t}\n\t\t\t\treturn (number > 0 ? 1 : -1) * Math.floor(Math.abs(number));\n\t\t\t};\n\t\t\tvar maxSafeInteger = Math.pow(2, 53) - 1;\n\t\t\tvar toLength = function toLength(value) {\n\t\t\t\tvar len = toInteger(value);\n\t\t\t\treturn Math.min(Math.max(len, 0), maxSafeInteger);\n\t\t\t};\n\n\t\t\t// The length property of the from method is 1.\n\t\t\treturn function from(arrayLike /*, mapFn, thisArg */) {\n\t\t\t\t// 1. Let C be the this value.\n\t\t\t\tvar C = this;\n\n\t\t\t\t// 2. Let items be ToObject(arrayLike).\n\t\t\t\tvar items = Object(arrayLike);\n\n\t\t\t\t// 3. ReturnIfAbrupt(items).\n\t\t\t\tif (arrayLike == null) {\n\t\t\t\t\tthrow new TypeError('Array.from requires an array-like object - not null or undefined');\n\t\t\t\t}\n\n\t\t\t\t// 4. If mapfn is undefined, then let mapping be false.\n\t\t\t\tvar mapFn = arguments.length > 1 ? arguments[1] : void undefined;\n\t\t\t\tvar T;\n\t\t\t\tif (typeof mapFn !== 'undefined') {\n\t\t\t\t\t// 5. else\n\t\t\t\t\t// 5. a If IsCallable(mapfn) is false, throw a TypeError exception.\n\t\t\t\t\tif (!isCallable(mapFn)) {\n\t\t\t\t\t\tthrow new TypeError('Array.from: when provided, the second argument must be a function');\n\t\t\t\t\t}\n\n\t\t\t\t\t// 5. b. If thisArg was supplied, let T be thisArg; else let T be undefined.\n\t\t\t\t\tif (arguments.length > 2) {\n\t\t\t\t\t\tT = arguments[2];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// 10. Let lenValue be Get(items, \"length\").\n\t\t\t\t// 11. Let len be ToLength(lenValue).\n\t\t\t\tvar len = toLength(items.length);\n\n\t\t\t\t// 13. If IsConstructor(C) is true, then\n\t\t\t\t// 13. a. Let A be the result of calling the [[Construct]] internal method\n\t\t\t\t// of C with an argument list containing the single item len.\n\t\t\t\t// 14. a. Else, Let A be ArrayCreate(len).\n\t\t\t\tvar A = isCallable(C) ? Object(new C(len)) : new Array(len);\n\n\t\t\t\t// 16. Let k be 0.\n\t\t\t\tvar k = 0;\n\t\t\t\t// 17. Repeat, while k < len… (also steps a - h)\n\t\t\t\tvar kValue;\n\t\t\t\twhile (k < len) {\n\t\t\t\t\tkValue = items[k];\n\t\t\t\t\tif (mapFn) {\n\t\t\t\t\t\tA[k] = typeof T === 'undefined' ? mapFn(kValue, k) : mapFn.call(T, kValue, k);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tA[k] = kValue;\n\t\t\t\t\t}\n\t\t\t\t\tk += 1;\n\t\t\t\t}\n\t\t\t\t// 18. Let putStatus be Put(A, \"length\", len, true).\n\t\t\t\tA.length = len;\n\t\t\t\t// 20. Return A.\n\t\t\t\treturn A;\n\t\t\t};\n\t\t}();\n\t}\n\n\t// ---------------------------------------------------------------------------\n\n\t// ---------------------------------------------------------------------------\n\t// Start of flash card player\n\t// ---------------------------------------------------------------------------\n\tvar MODULE_VERSION = \"1.31\";\n\n\tvar DISMISS_REASON = {\n\t\tGOT_IT: \"got it\",\n\t\tINVALID: \"invalid\",\n\t\tNEEDS_PRACTISE: \"needs practise\",\n\t\tSKIPPED: \"skipped\"\n\t};\n\n\tvar TRANSITION = {\n\t\tDISMISS_FLASH_CARD: \"flash-card-dismiss\"\n\t};\n\n\t// ---------------------------------------------------------------------------\n\t// UI Components\n\t// ---------------------------------------------------------------------------\n\tvar CheckBox = function CheckBox(options) {\n\t\tthis.options = options;\n\t\tthis.$ = this.options.$;\n\t\tthis.checked = this.options.checked;\n\n\t\tthis.render(this.options.parent);\n\t};\n\n\tCheckBox.prototype.render = function ($parent) {\n\t\tthis.$checkbox = this.$(\"<div></div>\", {\n\t\t\t\"class\": \"flash-card-player-check-box\"\n\t\t});\n\n\t\tthis.$glyphContainer = this.$(\"<div></div>\", {\n\t\t\t\"class\": \"flash-card-player-check-box-glyph-container\"\n\t\t});\n\n\t\tthis.$glyph = this.$(\"<span></span>\", {\n\t\t\t\"class\": \"fal fa-square flash-card-player-check-box-glyph\"\n\t\t});\n\n\t\tthis.$label = this.$(\"<span></span>\", {\n\t\t\t\"class\": \"flash-card-player-check-box-label\"\n\t\t}).html(this.options.label);\n\n\t\tthis.$glyphContainer.append(this.$glyph);\n\t\tthis.$checkbox.append(this.$glyphContainer);\n\t\tthis.$checkbox.append(this.$label);\n\n\t\tthis.$checkbox.on(\"click\", this.onClick.bind(this));\n\n\t\tthis.$($parent).append(this.$checkbox);\n\t};\n\n\tCheckBox.prototype.onClick = function ($event) {\n\t\t$event.originalEvent.stopPropagation();\n\n\t\tif (this.checked) {\n\t\t\tthis.$glyph.removeClass(\"fa-check-square\");\n\t\t\tthis.$glyph.addClass(\"fa-square\");\n\t\t\tthis.checked = false;\n\t\t} else {\n\t\t\tthis.$glyph.removeClass(\"fa-square\");\n\t\t\tthis.$glyph.addClass(\"fa-check-square\");\n\t\t\tthis.checked = true;\n\t\t}\n\n\t\tif (this.options.onClick) this.options.onClick(this.checked);\n\t};\n\n\tCheckBox.prototype.destroy = function () {\n\t\t// Remove the checkbox, all of its component elements, and unbind its handlers\n\t\tthis.$checkbox.remove();\n\t};\n\n\t// ---------------------------------------------------------------------------\n\t// Event Bus\n\t// ---------------------------------------------------------------------------\n\tvar EventBus = function EventBus() {\n\t\tthis.listeners = {};\n\t};\n\n\tEventBus.prototype.transcodeEvent = function (event) {\n\t\treturn event.replace(\":\", \"-\");\n\t};\n\n\tEventBus.prototype.off = function (event, handler) {\n\t\tvar transcodedEvent = this.transcodeEvent(event);\n\n\t\tif (handler) {\n\t\t\tthis.listeners[transcodedEvent] = this.listeners[transcodedEvent].filter(function (listener) {\n\t\t\t\treturn listener !== handler;\n\t\t\t});\n\t\t} else {\n\t\t\tdelete this.listeners[transcodedEvent];\n\t\t}\n\t};\n\n\tEventBus.prototype.on = function (event, handler) {\n\t\tvar transcodedEvent = this.transcodeEvent(event);\n\n\t\tif (!(transcodedEvent in this.listeners)) this.listeners[transcodedEvent] = [];\n\n\t\tthis.listeners[transcodedEvent].push(handler);\n\t};\n\n\tEventBus.prototype.trigger = function (event, data) {\n\t\tvar transcodedEvent = this.transcodeEvent(event);\n\n\t\tif (transcodedEvent in this.listeners) {\n\t\t\tthis.listeners[transcodedEvent].forEach(function (listener) {\n\t\t\t\tlistener(data);\n\t\t\t});\n\t\t}\n\t};\n\n\tvar eventBus = new EventBus();\n\n\t// ---------------------------------------------------------------------------\n\t// Session History\n\t// ---------------------------------------------------------------------------\n\tvar SessionHistory = function SessionHistory(history) {\n\t\tthis.sessions = history && history.sessions ? history.sessions : [];\n\n\t\tthis.sessions.sort(function (a, b) {\n\t\t\tvar result = 0;\n\n\t\t\tif (a.created < b.created) result = -1;else if (a.created > b.created) result = 1;\n\n\t\t\treturn result;\n\t\t});\n\t};\n\n\tSessionHistory.prototype.getLatestSession = function () {\n\t\treturn this.sessions.length > 0 ? this.sessions[this.sessions.length - 1] : undefined;\n\t};\n\n\tSessionHistory.prototype.getPreviousSession = function () {\n\t\treturn this.sessions.length > 1 ? this.sessions[this.sessions.length - 2] : undefined;\n\t};\n\n\tSessionHistory.prototype.getSessions = function () {\n\t\treturn this.sessions;\n\t};\n\n\tSessionHistory.prototype.addSession = function (session) {\n\t\tthis.sessions.push(session);\n\t};\n\n\tSessionHistory.prototype.toJSON = function () {\n\t\treturn { sessions: this.sessions };\n\t};\n\n\t// ---------------------------------------------------------------------------\n\t// View: Error\n\t// ---------------------------------------------------------------------------\n\tvar ErrorView = function ErrorView(options) {\n\t\tthis.$ = options.$;\n\t\tthis.$el = this.$(\".flash-card-player-view#error\", options.parent);\n\t\tthis.message = options.message;\n\t\tthis.resource = options.resource;\n\t\tthis.showCloseButton = options.showCloseButton;\n\t};\n\n\tErrorView.prototype.render = function () {\n\t\tthis.$(\"#deck-title\", this.$el).text(this.resource.title);\n\t\tthis.$(\"#error-message\", this.$el).text(this.message);\n\n\t\tif (this.showCloseButton) {\n\t\t\tthis.$(\"#console-button-close\", this.$el).removeClass(\"hidden\");\n\t\t\tthis.$(\"#console-button-close\", this.$el).on(\"click\", this.onCloseClick.bind(this));\n\t\t}\n\n\t\tthis.$(\".version-information-container > span\", this.$el).text(MODULE_VERSION);\n\t};\n\n\tErrorView.prototype.hide = function () {\n\t\tthis.$el.addClass(\"hidden\");\n\t};\n\n\tErrorView.prototype.show = function () {\n\t\tthis.$el.removeClass(\"hidden\");\n\t};\n\n\tErrorView.prototype.onCloseClick = function () {\n\t\teventBus.trigger(\"error:close\");\n\t};\n\n\tErrorView.prototype.destroy = function () {\n\t\tif (this.showCloseButton) this.$(\"#console-button-close\", this.$el).off(\"click\");\n\t};\n\n\t// ---------------------------------------------------------------------------\n\t// View: Menu\n\t// ---------------------------------------------------------------------------\n\tvar MenuView = function MenuView(options) {\n\t\tthis.$ = options.$;\n\t\tthis.$el = this.$(\".flash-card-player-view#menu\", options.parent);\n\t\tthis.flashCards = options.flashCards;\n\t\tthis.history = options.history;\n\t\tthis.previewMode = options.previewMode;\n\t\tthis.resource = options.resource;\n\t};\n\n\tMenuView.prototype.render = function () {\n\t\tthis.$(\"#deck-title\", this.$el).text(this.resource.title);\n\n\t\tif (!this.previewMode && this.isSessionIncomplete()) this.$(\"#console-button-resume\", this.$el).removeClass(\"hidden\");else this.$(\"#console-button-resume\", this.$el).addClass(\"hidden\");\n\n\t\tif (this.previewMode) this.$(\"#console-button-statistics\", this.$el).addClass(\"hidden\");else this.$(\"#console-button-statistics\", this.$el).removeClass(\"hidden\");\n\n\t\tthis.$(\"#console-button-configure\", this.$el).on(\"click\", this.onConfigureClick.bind(this));\n\t\tthis.$(\"#console-button-resume\", this.$el).on(\"click\", this.onResumeClick.bind(this));\n\t\tthis.$(\"#console-button-statistics\", this.$el).on(\"click\", this.onStatisticsClick.bind(this));\n\n\t\tthis.$(\".version-information-container > span\", this.$el).text(MODULE_VERSION);\n\t};\n\n\tMenuView.prototype.isSessionIncomplete = function () {\n\t\tvar incomplete = false;\n\n\t\tvar latestSession = this.history.getLatestSession();\n\n\t\tif (latestSession !== undefined) {\n\t\t\t// Count the number of card dismissals from the latest session\n\t\t\tvar completedCount = 0;\n\n\t\t\tlatestSession.transitions.forEach(function (transition) {\n\t\t\t\tif (transition.name === TRANSITION.DISMISS_FLASH_CARD && transition.data.reason !== DISMISS_REASON.SKIPPED) completedCount++;\n\t\t\t});\n\n\t\t\tif (completedCount < latestSession.flashCardCount) incomplete = true;\n\t\t}\n\n\t\treturn incomplete;\n\t};\n\n\tMenuView.prototype.hide = function () {\n\t\tthis.$el.addClass(\"hidden\");\n\t};\n\n\tMenuView.prototype.show = function () {\n\t\tthis.$el.removeClass(\"hidden\");\n\t};\n\n\tMenuView.prototype.onConfigureClick = function () {\n\t\teventBus.trigger(\"configuration:show\");\n\t};\n\n\tMenuView.prototype.onResumeClick = function () {\n\t\teventBus.trigger(\"session:resume\");\n\t};\n\n\tMenuView.prototype.onStatisticsClick = function () {\n\t\teventBus.trigger(\"statistics:show\");\n\t};\n\n\tMenuView.prototype.destroy = function () {\n\t\tthis.$(\"#console-button-configure\", this.$el).off(\"click\");\n\t\tthis.$(\"#console-button-resume\", this.$el).off(\"click\");\n\t\tthis.$(\"#console-button-statistics\", this.$el).off(\"click\");\n\t};\n\n\t// ---------------------------------------------------------------------------\n\t// View: Configuration\n\t// ---------------------------------------------------------------------------\n\tvar ConfigurationView = function ConfigurationView(options) {\n\t\tthis.$ = options.$;\n\t\tthis.$el = this.$(\".flash-card-player-view#configuration\", options.parent);\n\t\tthis.resource = options.resource;\n\t};\n\n\tConfigurationView.prototype.render = function () {\n\t\tthis.$(\"#deck-title\", this.$el).text(this.resource.title);\n\n\t\tvar $container = this.$(\"#configuration-options\");\n\t\t$container.empty();\n\n\t\tthis.checkBoxRandomizeCards = new CheckBox({\n\t\t\t$: this.$,\n\t\t\tlabel: \"Shuffle the deck\",\n\t\t\tonClick: this.onCheckBoxRandomiseCardsClicked.bind(this),\n\t\t\tparent: $container\n\t\t});\n\n\t\tthis.checkBoxReverseMode = new CheckBox({\n\t\t\t$: this.$,\n\t\t\tlabel: \"Show back of cards first\",\n\t\t\tonClick: this.onCheckBoxReverseModeClicked.bind(this),\n\t\t\tparent: $container\n\t\t});\n\n\t\tthis.$(\"#console-button-start\", this.$el).text(this.generateStartButtonLabel());\n\n\t\tthis.$(\".flash-card-player-back-button\", this.$el).on(\"click\", this.onBackClick.bind(this));\n\t\tthis.$(\"#console-button-start\", this.$el).on(\"click\", this.onStartClick.bind(this));\n\n\t\tthis.$(\".version-information-container > span\", this.$el).text(MODULE_VERSION);\n\t};\n\n\tConfigurationView.prototype.hide = function () {\n\t\tthis.$el.addClass(\"hidden\");\n\t};\n\n\tConfigurationView.prototype.show = function () {\n\t\tthis.$el.removeClass(\"hidden\");\n\t};\n\n\tConfigurationView.prototype.onBackClick = function () {\n\t\teventBus.trigger(\"configuration:back\");\n\t};\n\n\tConfigurationView.prototype.onCheckBoxRandomiseCardsClicked = function (checked) {\n\t\teventBus.trigger(\"mode:randomize\", { enabled: checked });\n\t};\n\n\tConfigurationView.prototype.onCheckBoxReverseModeClicked = function (checked) {\n\t\teventBus.trigger(\"mode:reverse\", { enabled: checked });\n\t};\n\n\tConfigurationView.prototype.onStartClick = function () {\n\t\teventBus.trigger(\"session:start\");\n\t};\n\n\tConfigurationView.prototype.generateStartButtonLabel = function () {\n\t\tvar labels = [\"OK, I'm ready!\", \"OK, let's go!\", \"Start shuffling!\", \"Start dealing!\", \"Start playing!\", \"Let's do this!\", \"Tap 'n Go!\"];\n\n\t\treturn labels[Math.floor(Math.random() * labels.length)];\n\t};\n\n\tConfigurationView.prototype.destroy = function () {\n\t\tthis.$(\".flash-card-player-back-button\", this.$el).off(\"click\");\n\t\tthis.$(\"#console-button-start\", this.$el).off(\"click\");\n\t\tthis.checkBoxReverseMode.destroy();\n\t\tthis.checkBoxRandomizeCards.destroy();\n\t};\n\n\t// ---------------------------------------------------------------------------\n\t// View: Statistics\n\t// ---------------------------------------------------------------------------\n\tvar StatisticsView = function StatisticsView(options) {\n\t\tthis.$ = options.$;\n\t\tthis.flashCards = options.flashCards;\n\t\tthis.history = options.history;\n\t\tthis.moment = options.moment;\n\t\tthis.resource = options.resource;\n\t\tthis.tryAgain = options.tryAgain;\n\t\tthis.$el = this.$(\".flash-card-player-view#statistics\", options.parent);\n\t};\n\n\tStatisticsView.prototype.render = function () {\n\t\tthis.$(\"#deck-title\", this.$el).text(this.resource.title);\n\n\t\tvar self = this;\n\n\t\tvar createDataPointBase = function createDataPointBase() {\n\t\t\treturn self.$(\"<div></div>\", { class: \"data-point\" });\n\t\t};\n\n\t\tvar createDate = function createDate(date, options) {\n\t\t\tvar $date = self.$(\"<div></div>\", { \"class\": \"date\" });\n\n\t\t\tif (date) $date.append(self.$(\"<span></span>\").html(date.format(\"DD/MM/YYYY\")));\n\n\t\t\tif (date && options && options.includeTime) $date.append(self.$(\"<span></span>\").html(date.format(\"HH:mm\")));\n\n\t\t\treturn $date;\n\t\t};\n\n\t\tvar createLabel = function createLabel(value) {\n\t\t\tvar $label = self.$(\"<div></div>\", { \"class\": \"data-point-label\" });\n\t\t\t$label.append(self.$(\"<span></span>\").html(value));\n\n\t\t\treturn $label;\n\t\t};\n\n\t\tvar createDataPointSpacer = function createDataPointSpacer() {\n\t\t\tvar $dataPoint = createDataPointBase();\n\t\t\t$dataPoint.addClass(\"data-point-spacer\");\n\t\t\t$dataPoint.append(self.$(\"<div></div>\", { \"class\": \"empty\" }));\n\t\t\t$dataPoint.append(createDate());\n\t\t\t$dataPoint.append(createLabel(\"\"));\n\n\t\t\treturn $dataPoint;\n\t\t};\n\n\t\tvar createDataPointFiller = function createDataPointFiller() {\n\t\t\tvar $dataPoint = createDataPointBase();\n\t\t\t$dataPoint.addClass(\"data-point-filler\");\n\t\t\t$dataPoint.append(self.$(\"<div></div>\", { \"class\": \"empty\" }));\n\t\t\t$dataPoint.append(createDate());\n\t\t\t$dataPoint.append(createLabel(\"\"));\n\n\t\t\treturn $dataPoint;\n\t\t};\n\n\t\tvar createDataPoint = function createDataPoint(date, session, sessionNumber, maxFlashCardCount) {\n\t\t\tvar gotItCount = 0;\n\t\t\tvar needsPractiseCount = 0;\n\t\t\tvar skippedCount = 0;\n\t\t\tvar incompleteCount = 0;\n\t\t\tvar invalidCount = 0;\n\n\t\t\tif (session.transitions) {\n\t\t\t\tsession.transitions.forEach(function (transition) {\n\t\t\t\t\tif (transition.name === TRANSITION.DISMISS_FLASH_CARD) {\n\t\t\t\t\t\tif (transition.data.reason === DISMISS_REASON.GOT_IT) gotItCount++;else if (transition.data.reason === DISMISS_REASON.NEEDS_PRACTISE) needsPractiseCount++;else if (transition.data.reason === DISMISS_REASON.SKIPPED) skippedCount++;else if (transition.data.reason === DISMISS_REASON.INVALID) invalidCount++;else console.log(\"Unrecognised card dismissal transition encountered: \" + JSON.stringify(transition.data.reason));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tvar validFlashCardCount = session.flashCardCount - invalidCount;\n\t\t\tincompleteCount = validFlashCardCount - (gotItCount + needsPractiseCount + skippedCount);\n\n\t\t\tvar $dataPoint = createDataPointBase();\n\n\t\t\tif (validFlashCardCount < maxFlashCardCount) {\n\t\t\t\tvar $blank = self.$(\"<div></div>\", {\n\t\t\t\t\t\"class\": \"value blank\",\n\t\t\t\t\t\"style\": \"height: calc((100% - 4.0rem - 1.0rem) * \" + (maxFlashCardCount - validFlashCardCount) / maxFlashCardCount + \");\"\n\t\t\t\t});\n\n\t\t\t\t$dataPoint.append($blank);\n\t\t\t}\n\n\t\t\tvar $totalLabel = self.$(\"<div></div>\", { \"class\": \"value total-label\" });\n\t\t\t$totalLabel.append(\"<span></span>\").html(validFlashCardCount + (validFlashCardCount === 1 ? \" card\" : \" cards\"));\n\t\t\t$dataPoint.append($totalLabel);\n\n\t\t\tif (incompleteCount > 0) {\n\t\t\t\tvar $incomplete = self.$(\"<div></div>\", {\n\t\t\t\t\t\"class\": \"value incomplete\",\n\t\t\t\t\t\"style\": \"height: calc((100% - 4.0rem - 1.0rem) * \" + incompleteCount / maxFlashCardCount + \");\"\n\t\t\t\t});\n\n\t\t\t\t$incomplete.append(\"<span></span>\").html(incompleteCount);\n\n\t\t\t\t$dataPoint.append($incomplete);\n\t\t\t}\n\n\t\t\tif (skippedCount > 0) {\n\t\t\t\tvar $skipped = self.$(\"<div></div>\", {\n\t\t\t\t\t\"class\": \"value skipped\",\n\t\t\t\t\t\"style\": \"height: calc((100% - 4.0rem - 1.0rem) * \" + skippedCount / maxFlashCardCount + \");\"\n\t\t\t\t});\n\n\t\t\t\t$skipped.append(\"<span></span>\").html(skippedCount);\n\n\t\t\t\t$dataPoint.append($skipped);\n\t\t\t}\n\n\t\t\tif (needsPractiseCount > 0) {\n\t\t\t\tvar $needsPractise = self.$(\"<div></div>\", {\n\t\t\t\t\t\"class\": \"value needs-practise\",\n\t\t\t\t\t\"style\": \"height: calc((100% - 4.0rem - 1.0rem) * \" + needsPractiseCount / maxFlashCardCount + \");\"\n\t\t\t\t});\n\n\t\t\t\t$needsPractise.append(\"<span></span>\").html(needsPractiseCount);\n\n\t\t\t\t$dataPoint.append($needsPractise);\n\t\t\t}\n\n\t\t\tif (gotItCount > 0) {\n\t\t\t\tvar $gotIt = self.$(\"<div></div>\", {\n\t\t\t\t\t\"class\": \"value got-it\",\n\t\t\t\t\t\"style\": \"height: calc((100% - 4.0rem - 1.0rem) * \" + gotItCount / maxFlashCardCount + \");\"\n\t\t\t\t});\n\n\t\t\t\t$gotIt.append(\"<span></span>\").html(gotItCount);\n\n\t\t\t\t$dataPoint.append($gotIt);\n\t\t\t}\n\n\t\t\t$dataPoint.append(createDate(date, { includeTime: true }));\n\t\t\t$dataPoint.append(createLabel(sessionNumber));\n\n\t\t\treturn $dataPoint;\n\t\t};\n\n\t\tvar createNullDataPoint = function createNullDataPoint(date) {\n\t\t\tvar $dataPoint = createDataPointBase();\n\t\t\t$dataPoint.append(self.$(\"<div></div>\", { class: \"no-data\" }));\n\t\t\t$dataPoint.append(createDate(date));\n\t\t\t$dataPoint.append(createLabel(\"\"));\n\n\t\t\treturn $dataPoint;\n\t\t};\n\n\t\tvar $xAxis = self.$(\"<div></div>\", { id: \"x-axis\" });\n\n\t\tvar sessions = this.history.getSessions();\n\n\t\tvar maxFlashCardCount = 0;\n\n\t\tsessions.forEach(function (session) {\n\t\t\tvar sessionFlashCardCount = session.flashCardCount;\n\n\t\t\tif (session.transitions) {\n\t\t\t\tsession.transitions.forEach(function (transition) {\n\t\t\t\t\tif (transition.name === TRANSITION.DISMISS_FLASH_CARD && transition.data.reason === DISMISS_REASON.INVALID) sessionFlashCardCount--;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (sessionFlashCardCount > maxFlashCardCount) maxFlashCardCount = sessionFlashCardCount;\n\t\t});\n\n\t\tsessions.forEach(function (session, index, sessions) {\n\t\t\t$xAxis.append(createDataPointSpacer());\n\t\t\t$xAxis.append(createDataPoint(self.moment.unix(session.created), session, index + 1, maxFlashCardCount));\n\t\t});\n\n\t\t$xAxis.append(createDataPointFiller());\n\n\t\tthis.$(\"#x-axis\").remove();\n\t\tthis.$(\"#session-history-chart-data\").append($xAxis);\n\n\t\tthis.$(\".flash-card-player-back-button\", this.$el).on(\"click\", this.onBackClick.bind(this));\n\n\t\tif (this.tryAgain) {\n\t\t\tthis.$(\"#statistics-button-try-again\", this.$el).removeClass(\"hidden\");\n\t\t\tthis.$(\"#statistics-button-try-again\", this.$el).on(\"click\", this.onTryAgainClick.bind(this));\n\t\t} else {\n\t\t\tthis.$(\"#statistics-button-try-again\", this.$el).addClass(\"hidden\");\n\t\t}\n\n\t\tthis.$(\".version-information-container > span\", this.$el).text(MODULE_VERSION);\n\t};\n\n\tStatisticsView.prototype.hide = function () {\n\t\tthis.$el.addClass(\"hidden\");\n\t};\n\n\tStatisticsView.prototype.show = function () {\n\t\tthis.$el.removeClass(\"hidden\");\n\t};\n\n\tStatisticsView.prototype.onBackClick = function () {\n\t\teventBus.trigger(\"statistics:back\");\n\t};\n\n\tStatisticsView.prototype.onTryAgainClick = function () {\n\t\teventBus.trigger(\"configuration:show\");\n\t};\n\n\tStatisticsView.prototype.destroy = function () {\n\t\tthis.$(\"#statistics-button-try-again\", this.$el).off(\"click\");\n\t\tthis.$(\".flash-card-player-back-button\", this.$el).off(\"click\");\n\t\tthis.$(\"#x-axis\").remove();\n\t};\n\n\t// ---------------------------------------------------------------------------\n\t// View: Viewer\n\t// ---------------------------------------------------------------------------\n\tvar ViewerView = function ViewerView(options) {\n\t\tthis.$ = options.$;\n\t\tthis.$el = this.$(\".flash-card-player-view#viewer\", options.parent);\n\t\tthis.flashCards = Array.from(options.flashCards);\n\t\tthis.history = options.history;\n\t\tthis.invalidFlashCardCount = options.invalidFlashCardCount;\n\t\tthis.modeRandomizeCards = options.modeRandomizeCards;\n\t\tthis.modeRandomizeCardsSeed = options.modeRandomizeCardsSeed;\n\t\tthis.modeReverseSides = options.modeReverseSides;\n\t\tthis.previewMode = options.previewMode;\n\t\tthis.resource = options.resource;\n\t\tthis.resume = options.resume;\n\t\tthis.seedrandom = options.seedrandom;\n\n\t\tthis.initializeState();\n\t};\n\n\tViewerView.prototype.render = function () {\n\t\tthis.$(\"#deck-title\", this.$el).text(this.resource.title);\n\n\t\tif (this.previewMode) {\n\t\t\tthis.$(\"#live-footer\", this.$el).addClass(\"hidden\");\n\t\t\tthis.$(\"#preview-footer\", this.$el).removeClass(\"hidden\");\n\n\t\t\tthis.$(\"#viewer-button-next\", this.$el).on(\"click\", this.onNextClick.bind(this));\n\t\t\tthis.$(\"#viewer-button-previous\", this.$el).on(\"click\", this.onPreviousClick.bind(this));\n\n\t\t\tthis.updatePreviousButton();\n\t\t} else {\n\t\t\tthis.$(\"#viewer-button-skip\", this.$el).on(\"click\", this.onSkipClick.bind(this));\n\t\t\tthis.$(\"#viewer-button-needs-practise\", this.$el).on(\"click\", this.onNeedsPractiseClick.bind(this));\n\t\t\tthis.$(\"#viewer-button-got-it\", this.$el).on(\"click\", this.onGotItClick.bind(this));\n\t\t}\n\n\t\tthis.$(\".flash-card-player-back-button\", this.$el).on(\"click\", this.onBackClick.bind(this));\n\n\t\tthis.$(\".version-information-container > span\", this.$el).text(MODULE_VERSION);\n\n\t\tthis.advanceSession();\n\t\tthis.createFlashCard();\n\t\tthis.renderFlashCard();\n\t};\n\n\tViewerView.prototype.hide = function () {\n\t\tthis.$el.addClass(\"hidden\");\n\t};\n\n\tViewerView.prototype.show = function () {\n\t\tthis.$el.removeClass(\"hidden\");\n\t\tthis.updateScrollPrompt();\n\t};\n\n\tViewerView.prototype.onBackClick = function () {\n\t\teventBus.trigger(\"viewer:back\");\n\t};\n\n\tViewerView.prototype.initializeState = function () {\n\t\tvar startingIndex = -1;\n\n\t\tif (this.resume) {\n\t\t\tvar latestSession = this.history.getPreviousSession();\n\n\t\t\tthis.modeRandomizeCards = latestSession.modeRandomizeCards;\n\t\t\tthis.modeRandomizeCardsSeed = latestSession.modeRandomizeCardsSeed;\n\t\t\tthis.modeReverseSides = latestSession.modeReverseSides;\n\n\t\t\tlatestSession.transitions.forEach(function (transition) {\n\t\t\t\tif (transition.name === TRANSITION.DISMISS_FLASH_CARD) startingIndex++;\n\t\t\t});\n\t\t}\n\n\t\tif (this.modeRandomizeCards) this.flashCards = this.shuffle(this.flashCards);\n\n\t\tthis.currentCard = {\n\t\t\tindex: startingIndex,\n\t\t\tside: this.getInitialCardSide()\n\t\t};\n\n\t\tthis.invalidOffset = 0;\n\t\tthis.isRendering = false;\n\t};\n\n\tViewerView.prototype.getValidFlashCardCount = function () {\n\t\treturn this.flashCards.length - this.invalidFlashCardCount;\n\t};\n\n\tViewerView.prototype.shuffle = function (array) {\n\t\tthis.seedrandom(this.modeRandomizeCardsSeed, { global: true });\n\t\tfor (var j, x, i = array.length; i; j = Math.floor(Math.random() * i), x = array[--i], array[i] = array[j], array[j] = x) {}\n\t\treturn array;\n\t};\n\n\tViewerView.prototype.createFlashCard = function () {\n\t\tvar $flashCard = this.$(\"<div></div>\", { id: \"flash-card-player-card\" });\n\t\tvar $front = this.$(\"<div></div>\", { class: \"flash-card-player-card-front flash-card-player-card-reversible\" });\n\t\tvar $back = this.$(\"<div></div>\", { class: \"flash-card-player-card-back flash-card-player-card-reversible\" });\n\t\tvar $frontText = this.$(\"<div></div>\", { class: \"flash-card-player-card-text\", id: \"flash-card-front-text\" });\n\t\tvar $backText = this.$(\"<div></div>\", { class: \"flash-card-player-card-text\", id: \"flash-card-back-text\" });\n\t\tvar $frontSpacer = this.$(\"<div></div>\", { class: \"flash-card-player-scroll-prompt\" });\n\t\tvar $backSpacer = this.$(\"<div></div>\", { class: \"flash-card-player-scroll-prompt\" });\n\t\tvar $frontScrollPrompt = this.$(\"<div></div>\", { class: \"flash-card-player-scroll-prompt\", id: \"scroll-prompt-front\" });\n\t\tvar $backScrollPrompt = this.$(\"<div></div>\", { class: \"flash-card-player-scroll-prompt\", id: \"scroll-prompt-back\" });\n\n\t\t$front.append(this.$(\"<div></div>\", { id: \"flash-card-front-ribbon\", class: \"flash-card-player-card-ribbon top-left shadow\" }));\n\t\t$back.append(this.$(\"<div></div>\", { id: \"flash-card-back-ribbon\", class: \"flash-card-player-card-ribbon top-right shadow\" }));\n\n\t\tthis.$(\"#flash-card-front-ribbon\", $front);\n\t\tthis.$(\"#flash-card-back-ribbon\", $back);\n\n\t\t$frontScrollPrompt.append(this.$(\"<span>Scroll down for more</span>\"));\n\t\t$backScrollPrompt.append(this.$(\"<span>Scroll down for more</span>\"));\n\n\t\t$front.append($frontSpacer);\n\t\t$front.append($frontText);\n\t\t$front.append($frontScrollPrompt);\n\t\t$back.append($backSpacer);\n\t\t$back.append($backText);\n\t\t$back.append($backScrollPrompt);\n\n\t\t$frontText.on(\"scroll\", this.onFlashCardTextScroll.bind(this));\n\t\t$backText.on(\"scroll\", this.onFlashCardTextScroll.bind(this));\n\n\t\t$flashCard.append($front);\n\t\t$flashCard.append($back);\n\n\t\tthis.$(\"#flash-card-player-card-container\", this.$el).append($flashCard);\n\n\t\t$flashCard.flip({\n\t\t\tback: \".flash-card-player-card-back\",\n\t\t\tfront: \".flash-card-player-card-front\",\n\t\t\tspeed: 400,\n\t\t\ttrigger: \"manual\"\n\t\t});\n\n\t\t$flashCard.on(\"transitionend\", this.onFlashCardTransitionEnd.bind(this));\n\t\t$flashCard.on(\"click\", this.onFlashCardClick.bind(this));\n\t};\n\n\tViewerView.prototype.destroyFlashCard = function () {\n\t\tthis.$(\"#flash-card-front-text\", this.$el).off(\"scroll\");\n\t\tthis.$(\"#flash-card-back-text\", this.$el).off(\"scroll\");\n\t\tthis.$(\"#flash-card-player-card\", this.$el).remove();\n\t};\n\n\tViewerView.prototype.renderFlashCard = function () {\n\t\tif (!this.isRendering) {\n\t\t\tthis.isRendering = true;\n\n\t\t\tvar $flashCard = this.$(\"#flash-card-player-card\", this.$el);\n\n\t\t\tif ($flashCard.data(\"flip-model\") && $flashCard.data(\"flip-model\").isFlipped) {\n\t\t\t\tthis.destroyFlashCard();\n\t\t\t\tthis.createFlashCard();\n\t\t\t}\n\n\t\t\tvar backText = this.getCurrentFlashCard().back.trim().replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t}).replace(/\\n/g, \"<br>\");\n\t\t\tvar frontText = this.getCurrentFlashCard().front.trim().replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t}).replace(/\\n/g, \"<br>\");\n\n\t\t\tif (this.modeReverseSides) {\n\t\t\t\tthis.$(\"#flash-card-front-ribbon\", this.$el).html(\"Back\");\n\t\t\t\tthis.$(\"#flash-card-back-ribbon\", this.$el).html(\"Front\");\n\n\t\t\t\tthis.$(\"#flash-card-front-text\", this.$el).html(backText);\n\t\t\t\tthis.$(\"#flash-card-back-text\", this.$el).html(frontText);\n\t\t\t} else {\n\t\t\t\tthis.$(\"#flash-card-front-ribbon\", this.$el).html(\"Front\");\n\t\t\t\tthis.$(\"#flash-card-back-ribbon\", this.$el).html(\"Back\");\n\n\t\t\t\tthis.$(\"#flash-card-front-text\", this.$el).html(frontText);\n\t\t\t\tthis.$(\"#flash-card-back-text\", this.$el).html(backText);\n\t\t\t}\n\n\t\t\tthis.updateInformationDisplay();\n\t\t\tthis.updateDismissalButtons();\n\t\t\tthis.updateScrollPrompt();\n\t\t\tthis.showFlashCard();\n\n\t\t\tthis.isRendering = false;\n\t\t}\n\t};\n\n\tViewerView.prototype.enableActiveDismissalButtons = function () {\n\t\tthis.$(\"#viewer-button-got-it\", this.$el).removeClass(\"flash-card-player-viewer-button-disabled\");\n\t\tthis.$(\"#viewer-button-needs-practise\", this.$el).removeClass(\"flash-card-player-viewer-button-disabled\");\n\t};\n\n\tViewerView.prototype.disableActiveDismissalButtons = function () {\n\t\tthis.$(\"#viewer-button-got-it\", this.$el).addClass(\"flash-card-player-viewer-button-disabled\");\n\t\tthis.$(\"#viewer-button-needs-practise\", this.$el).addClass(\"flash-card-player-viewer-button-disabled\");\n\t};\n\n\tViewerView.prototype.updateDismissalButtons = function () {\n\t\tif (this.flipped) this.enableActiveDismissalButtons();else this.disableActiveDismissalButtons();\n\t};\n\n\tViewerView.prototype.updateInformationDisplay = function () {\n\t\tif (this.flipped) this.$(\".flash-card-player-viewer-static-information-display\", this.$el).addClass(\"invisible\");else this.$(\".flash-card-player-viewer-static-information-display\", this.$el).removeClass(\"invisible\");\n\n\t\tthis.$(\"#card-number-display\", this.$el).text(\"Card \" + (this.currentCard.index + 1 - this.invalidOffset) + \" of \" + this.getValidFlashCardCount());\n\t};\n\n\tViewerView.prototype.getCurrentFlashCard = function () {\n\t\treturn this.flashCards[this.currentCard.index];\n\t};\n\n\tViewerView.prototype.getCurrentFlashCardId = function () {\n\t\treturn this.getCurrentFlashCard()._id;\n\t};\n\n\tViewerView.prototype.getInitialCardSide = function () {\n\t\treturn this.modeReverseSides ? \"back\" : \"front\";\n\t};\n\n\tViewerView.prototype.onFlashCardTextScroll = function (event) {\n\t\tif (!this.handlingScrollEvent) {\n\t\t\tthis.handlingScrollEvent = true;\n\t\t\tvar self = this;\n\n\t\t\twindow.requestAnimationFrame(function () {\n\t\t\t\tself.updateScrollPrompt(event);\n\t\t\t\tself.handlingScrollEvent = false;\n\t\t\t});\n\t\t}\n\t};\n\n\tViewerView.prototype.updateScrollPrompt = function (scrollEvent) {\n\t\tif (scrollEvent) {\n\t\t\tif (scrollEvent.currentTarget.scrollTop < scrollEvent.currentTarget.scrollHeight - scrollEvent.currentTarget.clientHeight) this.showScrollPrompt(this.currentCard.side);else this.hideScrollPrompt(this.currentCard.side);\n\t\t} else {\n\t\t\tvar text = this.$(\"#flash-card-\" + this.currentCard.side + \"-text\", this.$el);\n\n\t\t\tif (text.get(0).scrollHeight > text.get(0).clientHeight && text.get(0).scrollTop < text.get(0).scrollHeight - text.get(0).clientHeight) this.showScrollPrompt(this.currentCard.side);else this.hideScrollPrompt(this.currentCard.side);\n\t\t}\n\t};\n\n\tViewerView.prototype.showScrollPrompt = function (side) {\n\t\tthis.$(\"#scroll-prompt-\" + side, this.$el).removeClass(\"invisible\");\n\t};\n\n\tViewerView.prototype.hideScrollPrompt = function (side) {\n\t\tthis.$(\"#scroll-prompt-\" + side, this.$el).addClass(\"invisible\");\n\t};\n\n\tViewerView.prototype.onFlashCardTransitionEnd = function () {\n\t\tif (!this.isFlashCardVisible()) this.renderFlashCard();\n\n\t\tthis.updatePreviousButton();\n\t};\n\n\tViewerView.prototype.onFlashCardClick = function () {\n\t\tvar self = this;\n\t\tvar front = \"front\";\n\t\tvar back = \"back\";\n\n\t\tif (this.modeReverseSides) {\n\t\t\tfront = \"back\";\n\t\t\tback = \"front\";\n\t\t}\n\n\t\tif (this.currentCard.side === front) this.currentCard.side = back;else this.currentCard.side = front;\n\n\t\tthis.flipped = true;\n\t\tthis.hideScrollPrompt(this.currentCard.side);\n\n\t\tthis.$(\"#flash-card-player-card\", this.$el).flip(this.currentCard.side === back, function () {\n\t\t\tself.updateInformationDisplay();\n\t\t\tself.updateDismissalButtons();\n\t\t\tself.updateScrollPrompt();\n\t\t});\n\n\t\teventBus.trigger(\"transitions:record\", {\n\t\t\tdata: { flashCard: this.getCurrentFlashCardId() },\n\t\t\tname: \"flash-card-flip\"\n\t\t});\n\t};\n\n\tViewerView.prototype.onNextClick = function () {\n\t\tthis.advanceSession();\n\t};\n\n\tViewerView.prototype.onPreviousClick = function () {\n\t\tthis.retreatSession();\n\t};\n\n\tViewerView.prototype.onSkipClick = function () {\n\t\teventBus.trigger(\"transitions:record\", {\n\t\t\tdata: {\n\t\t\t\tflashCard: this.getCurrentFlashCardId(),\n\t\t\t\treason: DISMISS_REASON.SKIPPED\n\t\t\t},\n\t\t\tname: TRANSITION.DISMISS_FLASH_CARD\n\t\t});\n\t\tthis.advanceSession();\n\t};\n\n\tViewerView.prototype.onNeedsPractiseClick = function () {\n\t\teventBus.trigger(\"transitions:record\", {\n\t\t\tdata: {\n\t\t\t\tflashCard: this.getCurrentFlashCardId(),\n\t\t\t\treason: DISMISS_REASON.NEEDS_PRACTISE\n\t\t\t},\n\t\t\tname: TRANSITION.DISMISS_FLASH_CARD\n\t\t});\n\t\tthis.advanceSession();\n\t};\n\n\tViewerView.prototype.onGotItClick = function () {\n\t\teventBus.trigger(\"transitions:record\", {\n\t\t\tdata: {\n\t\t\t\tflashCard: this.getCurrentFlashCardId(),\n\t\t\t\treason: DISMISS_REASON.GOT_IT\n\t\t\t},\n\t\t\tname: TRANSITION.DISMISS_FLASH_CARD\n\t\t});\n\t\tthis.advanceSession();\n\t};\n\n\tViewerView.prototype.isFlashCardVisible = function () {\n\t\treturn !this.$(\"#flash-card-player-card\", this.$el).hasClass(\"flash-card-player-card-invisible\");\n\t};\n\n\tViewerView.prototype.hideFlashCard = function () {\n\t\tthis.$(\"#flash-card-player-card\", this.$el).addClass(\"flash-card-player-card-invisible\");\n\t};\n\n\tViewerView.prototype.showFlashCard = function () {\n\t\tthis.$(\"#flash-card-player-card\", this.$el).removeClass(\"flash-card-player-card-invisible\");\n\n\t\teventBus.trigger(\"transitions:record\", {\n\t\t\tdata: {\n\t\t\t\tflashCard: this.getCurrentFlashCardId(),\n\t\t\t\tside: this.currentCard.side\n\t\t\t},\n\t\t\tname: \"flash-card-show\"\n\t\t});\n\t};\n\n\tViewerView.prototype.advanceSession = function () {\n\t\teventBus.trigger(\"transitions:synchronize\");\n\n\t\tvar valid = false;\n\n\t\twhile (!valid && this.currentCard.index + 1 < this.flashCards.length) {\n\t\t\tthis.currentCard.index++;\n\t\t\tvar flashCard = this.getCurrentFlashCard();\n\n\t\t\tif (flashCard.back === undefined || flashCard.back === null || flashCard.back.length === 0 || flashCard.front === undefined || flashCard.front === null || flashCard.front.length === 0) {\n\t\t\t\teventBus.trigger(\"transitions:record\", {\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tflashCard: this.getCurrentFlashCardId(),\n\t\t\t\t\t\treason: DISMISS_REASON.INVALID\n\t\t\t\t\t},\n\t\t\t\t\tname: TRANSITION.DISMISS_FLASH_CARD\n\t\t\t\t});\n\n\t\t\t\tthis.invalidOffset++;\n\t\t\t} else {\n\t\t\t\tvalid = true;\n\t\t\t}\n\t\t}\n\n\t\tif (valid) {\n\t\t\tthis.currentCard.side = this.getInitialCardSide();\n\t\t\tthis.flipped = false;\n\t\t\tthis.hideFlashCard();\n\t\t} else {\n\t\t\teventBus.trigger(\"session:end\");\n\t\t}\n\t};\n\n\tViewerView.prototype.retreatSession = function () {\n\t\tif (this.currentCard.index > 0) {\n\t\t\tthis.currentCard.index--;\n\t\t\tthis.currentCard.side = this.getInitialCardSide();\n\t\t\tthis.flipped = false;\n\t\t\tthis.hideFlashCard();\n\t\t}\n\t};\n\n\tViewerView.prototype.updatePreviousButton = function () {\n\t\tif (this.currentCard.index <= 0) this.$(\"#viewer-button-previous\", this.$el).addClass(\"flash-card-player-viewer-button-disabled\");else this.$(\"#viewer-button-previous\", this.$el).removeClass(\"flash-card-player-viewer-button-disabled\");\n\t};\n\n\tViewerView.prototype.destroy = function () {\n\t\tthis.$(\".flash-card-player-back-button\", this.$el).off(\"click\");\n\n\t\tif (this.previewMode) {\n\t\t\tthis.$(\"#viewer-button-next\", this.$el).off(\"click\");\n\t\t\tthis.$(\"#viewer-button-previous\", this.$el).off(\"click\");\n\t\t} else {\n\t\t\tthis.$(\"#viewer-button-got-it\", this.$el).off(\"click\");\n\t\t\tthis.$(\"#viewer-button-needs-practise\", this.$el).off(\"click\");\n\t\t\tthis.$(\"#viewer-button-skip\", this.$el).off(\"click\");\n\t\t}\n\n\t\tthis.destroyFlashCard();\n\t};\n\n\t// ---------------------------------------------------------------------------\n\t// Flashcard Player\n\t// ---------------------------------------------------------------------------\n\tvar FlashCardPlayer = function FlashCardPlayer(opts) {\n\t\tvar options = opts || {};\n\n\t\tif (options.parent) this.parent = options.parent;else this.parent = document;\n\n\t\tthis.$ = options.$ || $;\n\t\tthis.moment = options.moment || moment;\n\t\tthis.seedrandom = options.seedrandom || Math.seedrandom;\n\t};\n\n\t// ---------------------------------------------------------------------------\n\t// start: prepare data, construct the UI, and start the player\n\t// ---------------------------------------------------------------------------\n\tFlashCardPlayer.prototype.start = function (resource, resourceData, history, options) {\n\t\t// Initialize required data and options\n\t\tif (resource) this.resource = resource;else throw new Error(\"Resource was not provided; cannot start\");\n\n\t\tif (resourceData) {\n\t\t\tthis.flashCards = resourceData.flashCards;\n\t\t\tthis.invalidFlashCardCount = this.countInvalidFlashCards();\n\t\t} else throw new Error(\"Resource data (flashcards) were not provided; cannot start\");\n\n\t\tthis.history = new SessionHistory(history);\n\t\tthis.previewMode = options && options.previewMode;\n\n\t\t// Create mockups for the synchronization operations if they are missing\n\t\tif (!window.Sync) window.Sync = {};\n\n\t\tif (!window.Sync.flashCardsTransition) window.Sync.flashCardsTransition = function () {};\n\n\t\tif (!window.Sync.flashCardsComplete) window.Sync.flashCardsComplete = function () {};\n\n\t\tif (this.flashCards.length > 0) {\n\t\t\tthis.registerEventHandlers();\n\t\t\tthis.showMenu();\n\t\t} else {\n\t\t\tthis.showError(\"This flashcard deck is empty.\");\n\t\t}\n\t};\n\n\tFlashCardPlayer.prototype.countInvalidFlashCards = function () {\n\t\treturn this.flashCards.reduce(function (acc, flashCard) {\n\t\t\treturn flashCard.back === undefined || flashCard.back === null || flashCard.back.length === 0 || flashCard.front === undefined || flashCard.front === null || flashCard.front.length === 0 ? acc + 1 : acc;\n\t\t}, 0);\n\t};\n\n\tFlashCardPlayer.prototype.registerEventHandlers = function () {\n\t\t// From menu view\n\t\teventBus.on(\"configuration:show\", this.showConfiguration.bind(this)); // Also from statistics view\n\t\teventBus.on(\"session:resume\", this.resumeSession.bind(this));\n\t\teventBus.on(\"statistics:show\", this.showStatistics.bind(this));\n\n\t\t// From configuration view\n\t\teventBus.on(\"configuration:back\", this.showMenu.bind(this));\n\t\teventBus.on(\"mode:randomize\", this.onModeRandomizeChanged.bind(this));\n\t\teventBus.on(\"mode:reverse\", this.onModeReverseChanged.bind(this));\n\t\teventBus.on(\"session:start\", this.startSession.bind(this));\n\n\t\t// From statistics view\n\t\teventBus.on(\"statistics:back\", this.showMenu.bind(this));\n\n\t\t// From viewer\n\t\teventBus.on(\"viewer:back\", this.endSession.bind(this));\n\t\teventBus.on(\"session:end\", this.endSession.bind(this));\n\t\teventBus.on(\"transitions:record\", this.recordTransition.bind(this));\n\t\teventBus.on(\"transitions:synchronize\", this.synchronizeTransitions.bind(this));\n\t};\n\n\tFlashCardPlayer.prototype.recordTransition = function (transition) {\n\t\tthis.currentSession.transitions.push({\n\t\t\tname: transition.name,\n\t\t\tdata: transition.data || {},\n\t\t\ttime: new Date().valueOf()\n\t\t});\n\t};\n\n\tFlashCardPlayer.prototype.synchronizeTransitions = function () {\n\t\twindow.Sync.flashCardsTransition(JSON.stringify(this.history.toJSON()));\n\t};\n\n\tFlashCardPlayer.prototype.finalizeTransitions = function () {\n\t\twindow.Sync.flashCardsComplete(JSON.stringify(this.history.toJSON()));\n\t};\n\n\tvar createUUID = function createUUID() {\n\t\tvar s = [];\n\t\tvar hexDigits = \"0123456789abcdef\";\n\t\tfor (var i = 0; i < 36; i++) {\n\t\t\ts[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);\n\t\t}\n\t\ts[14] = \"4\"; // bits 12-15 of the time_hi_and_version field to 0010\n\t\ts[19] = hexDigits.substr(s[19] & 0x3 | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01\n\t\ts[8] = s[13] = s[18] = s[23] = \"-\";\n\t\treturn s.join(\"\");\n\t};\n\n\tFlashCardPlayer.prototype.createSession = function () {\n\t\tthis.currentSession = {\n\t\t\tattachment: this.resource.attachment || null,\n\t\t\tcreated: this.moment().unix(),\n\t\t\tflashCardCount: this.flashCards.length,\n\t\t\tmodeRandomizeCards: false,\n\t\t\tmodeReverseSides: false,\n\t\t\tresource: this.resource.id,\n\t\t\ttransitions: [],\n\t\t\tdeviceid: createUUID()\n\t\t};\n\t};\n\n\tFlashCardPlayer.prototype.endSession = function () {\n\t\tthis.recordTransition({ name: \"session-stop\" });\n\t\tthis.finalizeTransitions();\n\n\t\tif (this.previewMode) this.showMenu();else this.showStatistics({ tryAgain: true });\n\t};\n\n\tFlashCardPlayer.prototype.resumeSession = function () {\n\t\tthis.createSession();\n\t\tthis.startSession(true);\n\t};\n\n\tFlashCardPlayer.prototype.startSession = function (resume) {\n\t\tthis.history.addSession(this.currentSession);\n\t\tthis.recordTransition({ name: \"session-start\" });\n\t\tthis.synchronizeTransitions();\n\t\tthis.showViewer({ resume: resume });\n\t};\n\n\tFlashCardPlayer.prototype.onModeRandomizeChanged = function (data) {\n\t\tthis.currentSession.modeRandomizeCards = data.enabled;\n\t\tthis.currentSession.modeRandomizeCardsSeed = this.moment().unix() + \"\";\n\t};\n\n\tFlashCardPlayer.prototype.onModeReverseChanged = function (data) {\n\t\tthis.currentSession.modeReverseSides = data.enabled;\n\t};\n\n\tFlashCardPlayer.prototype.showError = function (message, showCloseButton) {\n\t\tthis.showView(new ErrorView({\n\t\t\t$: this.$,\n\t\t\tmessage: message,\n\t\t\tparent: this.parent,\n\t\t\tresource: this.resource,\n\t\t\tshowCloseButton: showCloseButton\n\t\t}));\n\t};\n\n\tFlashCardPlayer.prototype.showMenu = function () {\n\t\tthis.showView(new MenuView({\n\t\t\t$: this.$,\n\t\t\tflashCards: this.flashCards,\n\t\t\thistory: this.history,\n\t\t\tparent: this.parent,\n\t\t\tpreviewMode: this.previewMode,\n\t\t\tresource: this.resource\n\t\t}));\n\t};\n\n\tFlashCardPlayer.prototype.showConfiguration = function () {\n\t\tthis.createSession();\n\n\t\tthis.showView(new ConfigurationView({\n\t\t\t$: this.$,\n\t\t\tparent: this.parent,\n\t\t\tresource: this.resource\n\t\t}));\n\t};\n\n\tFlashCardPlayer.prototype.showStatistics = function (options) {\n\t\tthis.showView(new StatisticsView({\n\t\t\t$: this.$,\n\t\t\tflashCards: this.flashCards,\n\t\t\thistory: this.history,\n\t\t\tmoment: this.moment,\n\t\t\tparent: this.parent,\n\t\t\tresource: this.resource,\n\t\t\ttryAgain: options ? options.tryAgain : undefined\n\t\t}));\n\t};\n\n\tFlashCardPlayer.prototype.showViewer = function (options) {\n\t\tthis.showView(new ViewerView({\n\t\t\t$: this.$,\n\t\t\tflashCards: this.flashCards,\n\t\t\thistory: this.history,\n\t\t\tinvalidFlashCardCount: this.invalidFlashCardCount,\n\t\t\tmodeRandomizeCards: this.currentSession.modeRandomizeCards,\n\t\t\tmodeRandomizeCardsSeed: this.currentSession.modeRandomizeCardsSeed,\n\t\t\tmodeReverseSides: this.currentSession.modeReverseSides,\n\t\t\tparent: this.parent,\n\t\t\tpreviewMode: this.previewMode,\n\t\t\tresource: this.resource,\n\t\t\tresume: options && options.resume,\n\t\t\tseedrandom: this.seedrandom\n\t\t}));\n\t};\n\n\tFlashCardPlayer.prototype.showView = function (view) {\n\t\tif (this.currentView) {\n\t\t\tthis.currentView.hide();\n\t\t\tthis.currentView.destroy();\n\t\t}\n\n\t\tthis.currentView = view;\n\n\t\tthis.currentView.render();\n\t\tthis.currentView.show();\n\t};\n\n\treturn FlashCardPlayer;\n});\n\nif (typeof exports === \"undefined\") window.flashCardPlayer = new window.FlashCardPlayer();\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZsYXNoQ2FyZFBsYXllci5qcyJdLCJuYW1lcyI6WyJyb290IiwiZmFjdG9yeSIsImV4cG9ydHMiLCJGbGFzaENhcmRQbGF5ZXIiLCJtb2R1bGUiLCJOYXRpdmVDdXN0b21FdmVudCIsIndpbmRvdyIsIkN1c3RvbUV2ZW50IiwidXNlTmF0aXZlIiwicCIsImRldGFpbCIsImZvbyIsInR5cGUiLCJlIiwiZXZlbnRlciIsImRvY3VtZW50IiwiY3JlYXRlRXZlbnQiLCJwYXJhbXMiLCJpbml0Q3VzdG9tRXZlbnQiLCJidWJibGVzIiwiY2FuY2VsYWJsZSIsImNyZWF0ZUV2ZW50T2JqZWN0IiwiQm9vbGVhbiIsIkFycmF5IiwiZnJvbSIsInRvU3RyIiwiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJpc0NhbGxhYmxlIiwiZm4iLCJjYWxsIiwidG9JbnRlZ2VyIiwidmFsdWUiLCJudW1iZXIiLCJOdW1iZXIiLCJpc05hTiIsImlzRmluaXRlIiwiTWF0aCIsImZsb29yIiwiYWJzIiwibWF4U2FmZUludGVnZXIiLCJwb3ciLCJ0b0xlbmd0aCIsImxlbiIsIm1pbiIsIm1heCIsImFycmF5TGlrZSIsIkMiLCJpdGVtcyIsIlR5cGVFcnJvciIsIm1hcEZuIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiVCIsIkEiLCJrIiwia1ZhbHVlIiwiTU9EVUxFX1ZFUlNJT04iLCJESVNNSVNTX1JFQVNPTiIsIkdPVF9JVCIsIklOVkFMSUQiLCJORUVEU19QUkFDVElTRSIsIlNLSVBQRUQiLCJUUkFOU0lUSU9OIiwiRElTTUlTU19GTEFTSF9DQVJEIiwiQ2hlY2tCb3giLCJvcHRpb25zIiwiJCIsImNoZWNrZWQiLCJyZW5kZXIiLCJwYXJlbnQiLCIkcGFyZW50IiwiJGNoZWNrYm94IiwiJGdseXBoQ29udGFpbmVyIiwiJGdseXBoIiwiJGxhYmVsIiwiaHRtbCIsImxhYmVsIiwiYXBwZW5kIiwib24iLCJvbkNsaWNrIiwiYmluZCIsIiRldmVudCIsIm9yaWdpbmFsRXZlbnQiLCJzdG9wUHJvcGFnYXRpb24iLCJyZW1vdmVDbGFzcyIsImFkZENsYXNzIiwiZGVzdHJveSIsInJlbW92ZSIsIkV2ZW50QnVzIiwibGlzdGVuZXJzIiwidHJhbnNjb2RlRXZlbnQiLCJldmVudCIsInJlcGxhY2UiLCJvZmYiLCJoYW5kbGVyIiwidHJhbnNjb2RlZEV2ZW50IiwiZmlsdGVyIiwibGlzdGVuZXIiLCJwdXNoIiwidHJpZ2dlciIsImRhdGEiLCJmb3JFYWNoIiwiZXZlbnRCdXMiLCJTZXNzaW9uSGlzdG9yeSIsImhpc3RvcnkiLCJzZXNzaW9ucyIsInNvcnQiLCJhIiwiYiIsInJlc3VsdCIsImNyZWF0ZWQiLCJnZXRMYXRlc3RTZXNzaW9uIiwiZ2V0UHJldmlvdXNTZXNzaW9uIiwiZ2V0U2Vzc2lvbnMiLCJhZGRTZXNzaW9uIiwic2Vzc2lvbiIsInRvSlNPTiIsIkVycm9yVmlldyIsIiRlbCIsIm1lc3NhZ2UiLCJyZXNvdXJjZSIsInNob3dDbG9zZUJ1dHRvbiIsInRleHQiLCJ0aXRsZSIsIm9uQ2xvc2VDbGljayIsImhpZGUiLCJzaG93IiwiTWVudVZpZXciLCJmbGFzaENhcmRzIiwicHJldmlld01vZGUiLCJpc1Nlc3Npb25JbmNvbXBsZXRlIiwib25Db25maWd1cmVDbGljayIsIm9uUmVzdW1lQ2xpY2siLCJvblN0YXRpc3RpY3NDbGljayIsImluY29tcGxldGUiLCJsYXRlc3RTZXNzaW9uIiwiY29tcGxldGVkQ291bnQiLCJ0cmFuc2l0aW9ucyIsInRyYW5zaXRpb24iLCJuYW1lIiwicmVhc29uIiwiZmxhc2hDYXJkQ291bnQiLCJDb25maWd1cmF0aW9uVmlldyIsIiRjb250YWluZXIiLCJlbXB0eSIsImNoZWNrQm94UmFuZG9taXplQ2FyZHMiLCJvbkNoZWNrQm94UmFuZG9taXNlQ2FyZHNDbGlja2VkIiwiY2hlY2tCb3hSZXZlcnNlTW9kZSIsIm9uQ2hlY2tCb3hSZXZlcnNlTW9kZUNsaWNrZWQiLCJnZW5lcmF0ZVN0YXJ0QnV0dG9uTGFiZWwiLCJvbkJhY2tDbGljayIsIm9uU3RhcnRDbGljayIsImVuYWJsZWQiLCJsYWJlbHMiLCJyYW5kb20iLCJTdGF0aXN0aWNzVmlldyIsIm1vbWVudCIsInRyeUFnYWluIiwic2VsZiIsImNyZWF0ZURhdGFQb2ludEJhc2UiLCJjbGFzcyIsImNyZWF0ZURhdGUiLCJkYXRlIiwiJGRhdGUiLCJmb3JtYXQiLCJpbmNsdWRlVGltZSIsImNyZWF0ZUxhYmVsIiwiY3JlYXRlRGF0YVBvaW50U3BhY2VyIiwiJGRhdGFQb2ludCIsImNyZWF0ZURhdGFQb2ludEZpbGxlciIsImNyZWF0ZURhdGFQb2ludCIsInNlc3Npb25OdW1iZXIiLCJtYXhGbGFzaENhcmRDb3VudCIsImdvdEl0Q291bnQiLCJuZWVkc1ByYWN0aXNlQ291bnQiLCJza2lwcGVkQ291bnQiLCJpbmNvbXBsZXRlQ291bnQiLCJpbnZhbGlkQ291bnQiLCJjb25zb2xlIiwibG9nIiwiSlNPTiIsInN0cmluZ2lmeSIsInZhbGlkRmxhc2hDYXJkQ291bnQiLCIkYmxhbmsiLCIkdG90YWxMYWJlbCIsIiRpbmNvbXBsZXRlIiwiJHNraXBwZWQiLCIkbmVlZHNQcmFjdGlzZSIsIiRnb3RJdCIsImNyZWF0ZU51bGxEYXRhUG9pbnQiLCIkeEF4aXMiLCJpZCIsInNlc3Npb25GbGFzaENhcmRDb3VudCIsImluZGV4IiwidW5peCIsIm9uVHJ5QWdhaW5DbGljayIsIlZpZXdlclZpZXciLCJpbnZhbGlkRmxhc2hDYXJkQ291bnQiLCJtb2RlUmFuZG9taXplQ2FyZHMiLCJtb2RlUmFuZG9taXplQ2FyZHNTZWVkIiwibW9kZVJldmVyc2VTaWRlcyIsInJlc3VtZSIsInNlZWRyYW5kb20iLCJpbml0aWFsaXplU3RhdGUiLCJvbk5leHRDbGljayIsIm9uUHJldmlvdXNDbGljayIsInVwZGF0ZVByZXZpb3VzQnV0dG9uIiwib25Ta2lwQ2xpY2siLCJvbk5lZWRzUHJhY3Rpc2VDbGljayIsIm9uR290SXRDbGljayIsImFkdmFuY2VTZXNzaW9uIiwiY3JlYXRlRmxhc2hDYXJkIiwicmVuZGVyRmxhc2hDYXJkIiwidXBkYXRlU2Nyb2xsUHJvbXB0Iiwic3RhcnRpbmdJbmRleCIsInNodWZmbGUiLCJjdXJyZW50Q2FyZCIsInNpZGUiLCJnZXRJbml0aWFsQ2FyZFNpZGUiLCJpbnZhbGlkT2Zmc2V0IiwiaXNSZW5kZXJpbmciLCJnZXRWYWxpZEZsYXNoQ2FyZENvdW50IiwiYXJyYXkiLCJnbG9iYWwiLCJqIiwieCIsImkiLCIkZmxhc2hDYXJkIiwiJGZyb250IiwiJGJhY2siLCIkZnJvbnRUZXh0IiwiJGJhY2tUZXh0IiwiJGZyb250U3BhY2VyIiwiJGJhY2tTcGFjZXIiLCIkZnJvbnRTY3JvbGxQcm9tcHQiLCIkYmFja1Njcm9sbFByb21wdCIsIm9uRmxhc2hDYXJkVGV4dFNjcm9sbCIsImZsaXAiLCJiYWNrIiwiZnJvbnQiLCJzcGVlZCIsIm9uRmxhc2hDYXJkVHJhbnNpdGlvbkVuZCIsIm9uRmxhc2hDYXJkQ2xpY2siLCJkZXN0cm95Rmxhc2hDYXJkIiwiaXNGbGlwcGVkIiwiYmFja1RleHQiLCJnZXRDdXJyZW50Rmxhc2hDYXJkIiwidHJpbSIsImNoYXJDb2RlQXQiLCJmcm9udFRleHQiLCJ1cGRhdGVJbmZvcm1hdGlvbkRpc3BsYXkiLCJ1cGRhdGVEaXNtaXNzYWxCdXR0b25zIiwic2hvd0ZsYXNoQ2FyZCIsImVuYWJsZUFjdGl2ZURpc21pc3NhbEJ1dHRvbnMiLCJkaXNhYmxlQWN0aXZlRGlzbWlzc2FsQnV0dG9ucyIsImZsaXBwZWQiLCJnZXRDdXJyZW50Rmxhc2hDYXJkSWQiLCJfaWQiLCJoYW5kbGluZ1Njcm9sbEV2ZW50IiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwic2Nyb2xsRXZlbnQiLCJjdXJyZW50VGFyZ2V0Iiwic2Nyb2xsVG9wIiwic2Nyb2xsSGVpZ2h0IiwiY2xpZW50SGVpZ2h0Iiwic2hvd1Njcm9sbFByb21wdCIsImhpZGVTY3JvbGxQcm9tcHQiLCJnZXQiLCJpc0ZsYXNoQ2FyZFZpc2libGUiLCJmbGFzaENhcmQiLCJyZXRyZWF0U2Vzc2lvbiIsImhhc0NsYXNzIiwiaGlkZUZsYXNoQ2FyZCIsInZhbGlkIiwib3B0cyIsInN0YXJ0IiwicmVzb3VyY2VEYXRhIiwiRXJyb3IiLCJjb3VudEludmFsaWRGbGFzaENhcmRzIiwiU3luYyIsImZsYXNoQ2FyZHNUcmFuc2l0aW9uIiwiZmxhc2hDYXJkc0NvbXBsZXRlIiwicmVnaXN0ZXJFdmVudEhhbmRsZXJzIiwic2hvd01lbnUiLCJzaG93RXJyb3IiLCJyZWR1Y2UiLCJhY2MiLCJzaG93Q29uZmlndXJhdGlvbiIsInJlc3VtZVNlc3Npb24iLCJzaG93U3RhdGlzdGljcyIsIm9uTW9kZVJhbmRvbWl6ZUNoYW5nZWQiLCJvbk1vZGVSZXZlcnNlQ2hhbmdlZCIsInN0YXJ0U2Vzc2lvbiIsImVuZFNlc3Npb24iLCJyZWNvcmRUcmFuc2l0aW9uIiwic3luY2hyb25pemVUcmFuc2l0aW9ucyIsImN1cnJlbnRTZXNzaW9uIiwidGltZSIsIkRhdGUiLCJ2YWx1ZU9mIiwiZmluYWxpemVUcmFuc2l0aW9ucyIsImNyZWF0ZVVVSUQiLCJzIiwiaGV4RGlnaXRzIiwic3Vic3RyIiwiam9pbiIsImNyZWF0ZVNlc3Npb24iLCJhdHRhY2htZW50IiwiZGV2aWNlaWQiLCJzaG93Vmlld2VyIiwic2hvd1ZpZXciLCJ2aWV3IiwiY3VycmVudFZpZXciLCJmbGFzaENhcmRQbGF5ZXIiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNDLFdBQVNBLElBQVQsRUFBZUMsT0FBZixFQUF3QjtBQUN4QixLQUFJLE9BQU9DLE9BQVAsS0FBbUIsV0FBdkIsRUFDQ0YsS0FBS0csZUFBTCxHQUF1QkYsU0FBdkIsQ0FERCxLQUdDRyxPQUFPRixPQUFQLEdBQWlCRCxTQUFqQjtBQUNELENBTEEsYUFLTyxZQUFXO0FBQ2xCOztBQUVBOztBQUVBLEtBQUlJLG9CQUFvQkMsT0FBT0MsV0FBL0I7O0FBRUEsS0FBSUMsWUFBWSxTQUFaQSxTQUFZLEdBQVc7QUFDMUIsTUFBSTtBQUNILE9BQUlDLElBQUksSUFBSUosaUJBQUosQ0FBc0IsS0FBdEIsRUFBNkIsRUFBRUssUUFBUSxF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QUFDQyxNQUFJLEtBQUtDLFdBQVQsRUFDQTtBQUNDLFFBQUtBLFdBQUwsQ0FBaUIzTCxJQUFqQjtBQUNBLFFBQUsyTCxXQUFMLENBQWlCbE8sT0FBakI7QUFDQTs7QUFFRCxPQUFLa08sV0FBTCxHQUFtQkQsSUFBbkI7O0FBRUEsT0FBS0MsV0FBTCxDQUFpQnBQLE1BQWpCO0FBQ0EsT0FBS29QLFdBQUwsQ0FBaUIxTCxJQUFqQjtBQUNBLEVBWkQ7O0FBY0EsUUFBTzlILGVBQVA7QUFDQSxDQTloREEsQ0FBRDs7QUFnaURBLElBQUksT0FBT0QsT0FBUCxLQUFtQixXQUF2QixFQUNDSSxPQUFPc1QsZUFBUCxHQUF5QixJQUFJdFQsT0FBT0gsZUFBWCxFQUF6QiIsImZpbGUiOiJmbGFzaENhcmRQbGF5ZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbihmdW5jdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJ1bmRlZmluZWRcIilcblx0XHRyb290LkZsYXNoQ2FyZFBsYXllciA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xufSh0aGlzLCBmdW5jdGlvbigpIHtcblx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0LyogZXNsaW50LWVudiBicm93c2VyICovXG5cblx0dmFyIE5hdGl2ZUN1c3RvbUV2ZW50ID0gd2luZG93LkN1c3RvbUV2ZW50O1xuXG5cdHZhciB1c2VOYXRpdmUgPSBmdW5jdGlvbigpIHtcblx0XHR0cnkge1xuXHRcdFx0dmFyIHAgPSBuZXcgTmF0aXZlQ3VzdG9tRXZlbnQoXCJjYXRcIiwgeyBkZXRhaWw6IHsgZm9vOiBcImJhclwiIH0gfSk7XG5cdFx0XHRyZXR1cm4gcC50eXBlID09PSBcImNhdFwiICYmIHAuZGV0YWlsLmZvbyA9PT0gXCJiYXJcIjtcblx0XHR9XG5cdFx0Y2F0Y2ggKGUpIHtcblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG5cblx0LyoqXG5cdCAqIENyb3NzLWJyb3dzZXIgYEN1c3RvbUV2ZW50YCBjb25zdHJ1Y3Rvci5cblx0ICpcblx0ICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0N1c3RvbUV2ZW50LkN1c3RvbUV2ZW50XG5cdCAqXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cblx0dmFyIE5hdGl2ZUN1c3RvbUV2ZW50ID0gd2luZG93LkN1c3RvbUV2ZW50O1xuXG5cdGZ1bmN0aW9uIHVzZU5hdGl2ZSgpIHtcblx0XHR0cnkge1xuXHRcdFx0dmFyIHAgPSBuZXcgTmF0aXZlQ3VzdG9tRXZlbnQoXCJjYXRcIiwgeyBkZXRhaWw6IHsgZm9vOiBcImJhclwiIH0gfSk7XG5cdFx0XHRyZXR1cm4gcC50eXBlID09PSBcImNhdFwiICYmIHAuZGV0YWlsLmZvbyA9PT0gXCJiYXJcIjtcblx0XHR9XG5cdFx0Y2F0Y2ggKGUpIHtcblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogQ3Jvc3MtYnJvd3NlciBgQ3VzdG9tRXZlbnRgIGNvbnN0cnVjdG9yLlxuXHQgKlxuXHQgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQ3VzdG9tRXZlbnQuQ3VzdG9tRXZlbnRcblx0ICpcblx0ICogQHB1YmxpY1xuXHQgKi9cblxuXHR2YXIgZXZlbnRlciA9IHVzZU5hdGl2ZSgpID8gTmF0aXZlQ3VzdG9tRXZlbnQgOlxuXG5cdC8vIElFID49IDlcblx0XHR0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRXZlbnQgPT09IFwiZnVuY3Rpb25cIiA/IGZ1bmN0aW9uIEN1c3RvbUV2ZW50KHR5cGUsIHBhcmFtcykge1xuXHRcdFx0dmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFdmVudChcIkN1c3RvbUV2ZW50XCIpO1xuXG5cdFx0XHRpZiAocGFyYW1zKVxuXHRcdFx0XHRlLmluaXRDdXN0b21FdmVudCh0eXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUsIHBhcmFtcy5kZXRhaWwpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRlLmluaXRDdXN0b21FdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UsIHZvaWQgMCk7XG5cblx0XHRcdHJldHVybiBlO1xuXHRcdH0gOlxuXG5cdFx0Ly8gSUUgPD0gOFxuXHRcdFx0ZnVuY3Rpb24gQ3VzdG9tRXZlbnQodHlwZSwgcGFyYW1zKSB7XG5cdFx0XHRcdHZhciBlID0gZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3QoKTtcblxuXHRcdFx0XHRlLnR5cGUgPSB0eXBlO1xuXG5cdFx0XHRcdGlmIChwYXJhbXMpIHtcblx0XHRcdFx0XHRlLmJ1YmJsZXMgPSBCb29sZWFuKHBhcmFtcy5idWJibGVzKTtcblx0XHRcdFx0XHRlLmNhbmNlbGFibGUgPSBCb29sZWFuKHBhcmFtcy5jYW5jZWxhYmxlKTtcblx0XHRcdFx0XHRlLmRldGFpbCA9IHBhcmFtcy5kZXRhaWw7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0ZS5idWJibGVzID0gZmFsc2U7XG5cdFx0XHRcdFx0ZS5jYW5jZWxhYmxlID0gZmFsc2U7XG5cdFx0XHRcdFx0ZS5kZXRhaWwgPSB2b2lkIDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZTtcblx0XHRcdH07XG5cblx0aWYgKCF1c2VOYXRpdmUoKSlcblx0XHR3aW5kb3cuQ3VzdG9tRXZlbnQgPSBldmVudGVyO1xuXG5cdC8vIFBvbHlmaWxsOiBBcnJheS5mcm9tKClcblx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZnJvbVxuXHQvL1xuXHQvLyBQcm9kdWN0aW9uIHN0ZXBzIG9mIEVDTUEtMjYyLCBFZGl0aW9uIDYsIDIyLjEuMi4xXG5cdGlmICghQXJyYXkuZnJvbSkge1xuXHRcdEFycmF5LmZyb20gPSAoZnVuY3Rpb24gKCkge1xuXHRcdFx0dmFyIHRvU3RyID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblx0XHRcdHZhciBpc0NhbGxhYmxlID0gZnVuY3Rpb24gKGZuKSB7XG5cdFx0XHRcdHJldHVybiB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgfHwgdG9TdHIuY2FsbChmbikgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG5cdFx0XHR9O1xuXHRcdFx0dmFyIHRvSW50ZWdlciA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRcdFx0XHR2YXIgbnVtYmVyID0gTnVtYmVyKHZhbHVlKTtcblx0XHRcdFx0aWYgKGlzTmFOKG51bWJlcikpIHsgcmV0dXJuIDA7IH1cblx0XHRcdFx0aWYgKG51bWJlciA9PT0gMCB8fCAhaXNGaW5pdGUobnVtYmVyKSkgeyByZXR1cm4gbnVtYmVyOyB9XG5cdFx0XHRcdHJldHVybiAobnVtYmVyID4gMCA/IDEgOiAtMSkgKiBNYXRoLmZsb29yKE1hdGguYWJzKG51bWJlcikpO1xuXHRcdFx0fTtcblx0XHRcdHZhciBtYXhTYWZlSW50ZWdlciA9IE1hdGgucG93KDIsIDUzKSAtIDE7XG5cdFx0XHR2YXIgdG9MZW5ndGggPSBmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRcdFx0dmFyIGxlbiA9IHRvSW50ZWdlcih2YWx1ZSk7XG5cdFx0XHRcdHJldHVybiBNYXRoLm1pbihNYXRoLm1heChsZW4sIDApLCBtYXhTYWZlSW50ZWdlcik7XG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBUaGUgbGVuZ3RoIHByb3BlcnR5IG9mIHRoZSBmcm9tIG1ldGhvZCBpcyAxLlxuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlLyosIG1hcEZuLCB0aGlzQXJnICovKSB7XG5cdFx0XHRcdC8vIDEuIExldCBDIGJlIHRoZSB0aGlzIHZhbHVlLlxuXHRcdFx0XHR2YXIgQyA9IHRoaXM7XG5cblx0XHRcdFx0Ly8gMi4gTGV0IGl0ZW1zIGJlIFRvT2JqZWN0KGFycmF5TGlrZSkuXG5cdFx0XHRcdHZhciBpdGVtcyA9IE9iamVjdChhcnJheUxpa2UpO1xuXG5cdFx0XHRcdC8vIDMuIFJldHVybklmQWJydXB0KGl0ZW1zKS5cblx0XHRcdFx0aWYgKGFycmF5TGlrZSA9PSBudWxsKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignQXJyYXkuZnJvbSByZXF1aXJlcyBhbiBhcnJheS1saWtlIG9iamVjdCAtIG5vdCBudWxsIG9yIHVuZGVmaW5lZCcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gNC4gSWYgbWFwZm4gaXMgdW5kZWZpbmVkLCB0aGVuIGxldCBtYXBwaW5nIGJlIGZhbHNlLlxuXHRcdFx0XHR2YXIgbWFwRm4gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHZvaWQgdW5kZWZpbmVkO1xuXHRcdFx0XHR2YXIgVDtcblx0XHRcdFx0aWYgKHR5cGVvZiBtYXBGbiAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0XHQvLyA1LiBlbHNlXG5cdFx0XHRcdFx0Ly8gNS4gYSBJZiBJc0NhbGxhYmxlKG1hcGZuKSBpcyBmYWxzZSwgdGhyb3cgYSBUeXBlRXJyb3IgZXhjZXB0aW9uLlxuXHRcdFx0XHRcdGlmICghaXNDYWxsYWJsZShtYXBGbikpIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0FycmF5LmZyb206IHdoZW4gcHJvdmlkZWQsIHRoZSBzZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gNS4gYi4gSWYgdGhpc0FyZyB3YXMgc3VwcGxpZWQsIGxldCBUIGJlIHRoaXNBcmc7IGVsc2UgbGV0IFQgYmUgdW5kZWZpbmVkLlxuXHRcdFx0XHRcdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikge1xuXHRcdFx0XHRcdFx0VCA9IGFyZ3VtZW50c1syXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyAxMC4gTGV0IGxlblZhbHVlIGJlIEdldChpdGVtcywgXCJsZW5ndGhcIikuXG5cdFx0XHRcdC8vIDExLiBMZXQgbGVuIGJlIFRvTGVuZ3RoKGxlblZhbHVlKS5cblx0XHRcdFx0dmFyIGxlbiA9IHRvTGVuZ3RoKGl0ZW1zLmxlbmd0aCk7XG5cblx0XHRcdFx0Ly8gMTMuIElmIElzQ29uc3RydWN0b3IoQykgaXMgdHJ1ZSwgdGhlblxuXHRcdFx0XHQvLyAxMy4gYS4gTGV0IEEgYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NvbnN0cnVjdF1dIGludGVybmFsIG1ldGhvZFxuXHRcdFx0XHQvLyBvZiBDIHdpdGggYW4gYXJndW1lbnQgbGlzdCBjb250YWluaW5nIHRoZSBzaW5nbGUgaXRlbSBsZW4uXG5cdFx0XHRcdC8vIDE0LiBhLiBFbHNlLCBMZXQgQSBiZSBBcnJheUNyZWF0ZShsZW4pLlxuXHRcdFx0XHR2YXIgQSA9IGlzQ2FsbGFibGUoQykgPyBPYmplY3QobmV3IEMobGVuKSkgOiBuZXcgQXJyYXkobGVuKTtcblxuXHRcdFx0XHQvLyAxNi4gTGV0IGsgYmUgMC5cblx0XHRcdFx0dmFyIGsgPSAwO1xuXHRcdFx0XHQvLyAxNy4gUmVwZWF0LCB3aGlsZSBrIDwgbGVu4oCmIChhbHNvIHN0ZXBzIGEgLSBoKVxuXHRcdFx0XHR2YXIga1ZhbHVlO1xuXHRcdFx0XHR3aGlsZSAoayA8IGxlbikge1xuXHRcdFx0XHRcdGtWYWx1ZSA9IGl0ZW1zW2tdO1xuXHRcdFx0XHRcdGlmIChtYXBGbikge1xuXHRcdFx0XHRcdFx0QVtrXSA9IHR5cGVvZiBUID09PSAndW5kZWZpbmVkJyA/IG1hcEZuKGtWYWx1ZSwgaykgOiBtYXBGbi5jYWxsKFQsIGtWYWx1ZSwgayk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdEFba10gPSBrVmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGsgKz0gMTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyAxOC4gTGV0IHB1dFN0YXR1cyBiZSBQdXQoQSwgXCJsZW5ndGhcIiwgbGVuLCB0cnVlKS5cblx0XHRcdFx0QS5sZW5ndGggPSBsZW47XG5cdFx0XHRcdC8vIDIwLiBSZXR1cm4gQS5cblx0XHRcdFx0cmV0dXJuIEE7XG5cdFx0XHR9O1xuXHRcdH0oKSk7XG5cdH1cblxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gU3RhcnQgb2YgZmxhc2ggY2FyZCBwbGF5ZXJcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdHZhciBNT0RVTEVfVkVSU0lPTiA9IFwiMS4zMVwiO1xuXG5cdHZhciBESVNNSVNTX1JFQVNPTiA9IHtcblx0XHRHT1RfSVQ6IFwiZ290IGl0XCIsXG5cdFx0SU5WQUxJRDogXCJpbnZhbGlkXCIsXG5cdFx0TkVFRFNfUFJBQ1RJU0U6IFwibmVlZHMgcHJhY3Rpc2VcIixcblx0XHRTS0lQUEVEOiBcInNraXBwZWRcIixcblx0fTtcblxuXHR2YXIgVFJBTlNJVElPTiA9IHtcblx0XHRESVNNSVNTX0ZMQVNIX0NBUkQ6IFwiZmxhc2gtY2FyZC1kaXNtaXNzXCIsXG5cdH07XG5cblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFVJIENvbXBvbmVudHNcblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdHZhciBDaGVja0JveCA9IGZ1bmN0aW9uKG9wdGlvbnMpXG5cdHtcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXHRcdHRoaXMuJCA9IHRoaXMub3B0aW9ucy4kO1xuXHRcdHRoaXMuY2hlY2tlZCA9IHRoaXMub3B0aW9ucy5jaGVja2VkO1xuXG5cdFx0dGhpcy5yZW5kZXIodGhpcy5vcHRpb25zLnBhcmVudCk7XG5cdH07XG5cblx0Q2hlY2tCb3gucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uKCRwYXJlbnQpXG5cdHtcblx0XHR0aGlzLiRjaGVja2JveCA9IHRoaXMuJChcIjxkaXY+PC9kaXY+XCIsIHtcblx0XHRcdFwiY2xhc3NcIjogXCJmbGFzaC1jYXJkLXBsYXllci1jaGVjay1ib3hcIixcblx0XHR9KTtcblxuXHRcdHRoaXMuJGdseXBoQ29udGFpbmVyID0gdGhpcy4kKFwiPGRpdj48L2Rpdj5cIiwge1xuXHRcdFx0XCJjbGFzc1wiOiBcImZsYXNoLWNhcmQtcGxheWVyLWNoZWNrLWJveC1nbHlwaC1jb250YWluZXJcIixcblx0XHR9KTtcblxuXHRcdHRoaXMuJGdseXBoID0gdGhpcy4kKFwiPHNwYW4+PC9zcGFuPlwiLCB7XG5cdFx0XHRcImNsYXNzXCI6IFwiZmFsIGZhLXNxdWFyZSBmbGFzaC1jYXJkLXBsYXllci1jaGVjay1ib3gtZ2x5cGhcIixcblx0XHR9KTtcblxuXHRcdHRoaXMuJGxhYmVsID0gdGhpcy4kKFwiPHNwYW4+PC9zcGFuPlwiLCB7XG5cdFx0XHRcImNsYXNzXCI6IFwiZmxhc2gtY2FyZC1wbGF5ZXItY2hlY2stYm94LWxhYmVsXCIsXG5cdFx0fSkuaHRtbCh0aGlzLm9wdGlvbnMubGFiZWwpO1xuXG5cdFx0dGhpcy4kZ2x5cGhDb250YWluZXIuYXBwZW5kKHRoaXMuJGdseXBoKTtcblx0XHR0aGlzLiRjaGVja2JveC5hcHBlbmQodGhpcy4kZ2x5cGhDb250YWluZXIpO1xuXHRcdHRoaXMuJGNoZWNrYm94LmFwcGVuZCh0aGlzLiRsYWJlbCk7XG5cblx0XHR0aGlzLiRjaGVja2JveC5vbihcImNsaWNrXCIsIHRoaXMub25DbGljay5iaW5kKHRoaXMpKTtcblxuXHRcdHRoaXMuJCgkcGFyZW50KS5hcHBlbmQodGhpcy4kY2hlY2tib3gpO1xuXHR9O1xuXG5cdENoZWNrQm94LnByb3RvdHlwZS5vbkNsaWNrID0gZnVuY3Rpb24oJGV2ZW50KVxuXHR7XG5cdFx0JGV2ZW50Lm9yaWdpbmFsRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRpZiAodGhpcy5jaGVja2VkKVxuXHRcdHtcblx0XHRcdHRoaXMuJGdseXBoLnJlbW92ZUNsYXNzKFwiZmEtY2hlY2stc3F1YXJlXCIpO1xuXHRcdFx0dGhpcy4kZ2x5cGguYWRkQ2xhc3MoXCJmYS1zcXVhcmVcIik7XG5cdFx0XHR0aGlzLmNoZWNrZWQgPSBmYWxzZTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHRoaXMuJGdseXBoLnJlbW92ZUNsYXNzKFwiZmEtc3F1YXJlXCIpO1xuXHRcdFx0dGhpcy4kZ2x5cGguYWRkQ2xhc3MoXCJmYS1jaGVjay1zcXVhcmVcIik7XG5cdFx0XHR0aGlzLmNoZWNrZWQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLm9wdGlvbnMub25DbGljaylcblx0XHRcdHRoaXMub3B0aW9ucy5vbkNsaWNrKHRoaXMuY2hlY2tlZCk7XG5cdH07XG5cblx0Q2hlY2tCb3gucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpXG5cdHtcblx0XHQvLyBSZW1vdmUgdGhlIGNoZWNrYm94LCBhbGwgb2YgaXRzIGNvbXBvbmVudCBlbGVtZW50cywgYW5kIHVuYmluZCBpdHMgaGFuZGxlcnNcblx0XHR0aGlzLiRjaGVja2JveC5yZW1vdmUoKTtcblx0fTtcblxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gRXZlbnQgQnVzXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHR2YXIgRXZlbnRCdXMgPSBmdW5jdGlvbigpXG5cdHtcblx0XHR0aGlzLmxpc3RlbmVycyA9IHt9O1xuXHR9O1xuXG5cdEV2ZW50QnVzLnByb3RvdHlwZS50cmFuc2NvZGVFdmVudCA9IGZ1bmN0aW9uKGV2ZW50KVxuXHR7XG5cdFx0cmV0dXJuIGV2ZW50LnJlcGxhY2UoXCI6XCIsIFwiLVwiKTtcblx0fTtcblxuXHRFdmVudEJ1cy5wcm90b3R5cGUub2ZmID0gZnVuY3Rpb24oZXZlbnQsIGhhbmRsZXIpXG5cdHtcblx0XHR2YXIgdHJhbnNjb2RlZEV2ZW50ID0gdGhpcy50cmFuc2NvZGVFdmVudChldmVudCk7XG5cblx0XHRpZiAoaGFuZGxlcilcblx0XHR7XG5cdFx0XHR0aGlzLmxpc3RlbmVyc1t0cmFuc2NvZGVkRXZlbnRdID0gdGhpcy5saXN0ZW5lcnNbdHJhbnNjb2RlZEV2ZW50XS5maWx0ZXIoZnVuY3Rpb24obGlzdGVuZXIpIHtcblx0XHRcdFx0cmV0dXJuIGxpc3RlbmVyICE9PSBoYW5kbGVyO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHRkZWxldGUgdGhpcy5saXN0ZW5lcnNbdHJhbnNjb2RlZEV2ZW50XTtcblx0XHR9XG5cdH07XG5cblx0RXZlbnRCdXMucHJvdG90eXBlLm9uID0gZnVuY3Rpb24oZXZlbnQsIGhhbmRsZXIpXG5cdHtcblx0XHR2YXIgdHJhbnNjb2RlZEV2ZW50ID0gdGhpcy50cmFuc2NvZGVFdmVudChldmVudCk7XG5cblx0XHRpZiAoISh0cmFuc2NvZGVkRXZlbnQgaW4gdGhpcy5saXN0ZW5lcnMpKVxuXHRcdFx0dGhpcy5saXN0ZW5lcnNbdHJhbnNjb2RlZEV2ZW50XSA9IFtdO1xuXG5cdFx0dGhpcy5saXN0ZW5lcnNbdHJhbnNjb2RlZEV2ZW50XS5wdXNoKGhhbmRsZXIpO1xuXHR9O1xuXG5cdEV2ZW50QnVzLnByb3RvdHlwZS50cmlnZ2VyID0gZnVuY3Rpb24oZXZlbnQsIGRhdGEpXG5cdHtcblx0XHR2YXIgdHJhbnNjb2RlZEV2ZW50ID0gdGhpcy50cmFuc2NvZGVFdmVudChldmVudCk7XG5cblx0XHRpZiAodHJhbnNjb2RlZEV2ZW50IGluIHRoaXMubGlzdGVuZXJzKVxuXHRcdHtcblx0XHRcdHRoaXMubGlzdGVuZXJzW3RyYW5zY29kZWRFdmVudF0uZm9yRWFjaChmdW5jdGlvbihsaXN0ZW5lcikge1xuXHRcdFx0XHRsaXN0ZW5lcihkYXRhKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fTtcblxuXHR2YXIgZXZlbnRCdXMgPSBuZXcgRXZlbnRCdXMoKTtcblxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gU2Vzc2lvbiBIaXN0b3J5XG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHR2YXIgU2Vzc2lvbkhpc3RvcnkgPSBmdW5jdGlvbihoaXN0b3J5KVxuXHR7XG5cdFx0dGhpcy5zZXNzaW9ucyA9IGhpc3RvcnkgJiYgaGlzdG9yeS5zZXNzaW9ucyA/IGhpc3Rvcnkuc2Vzc2lvbnMgOiBbXSA7XG5cblx0XHR0aGlzLnNlc3Npb25zLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuXHRcdFx0dmFyIHJlc3VsdCA9IDA7XG5cblx0XHRcdGlmIChhLmNyZWF0ZWQgPCBiLmNyZWF0ZWQpXG5cdFx0XHRcdHJlc3VsdCA9IC0xO1xuXHRcdFx0ZWxzZSBpZiAoYS5jcmVhdGVkID4gYi5jcmVhdGVkKVxuXHRcdFx0XHRyZXN1bHQgPSAxO1xuXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH0pO1xuXHR9O1xuXG5cdFNlc3Npb25IaXN0b3J5LnByb3RvdHlwZS5nZXRMYXRlc3RTZXNzaW9uID0gZnVuY3Rpb24oKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuc2Vzc2lvbnMubGVuZ3RoID4gMCA/IHRoaXMuc2Vzc2lvbnNbdGhpcy5zZXNzaW9ucy5sZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcblx0fTtcblxuXHRTZXNzaW9uSGlzdG9yeS5wcm90b3R5cGUuZ2V0UHJldmlvdXNTZXNzaW9uID0gZnVuY3Rpb24oKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuc2Vzc2lvbnMubGVuZ3RoID4gMSA/IHRoaXMuc2Vzc2lvbnNbdGhpcy5zZXNzaW9ucy5sZW5ndGggLSAyXSA6IHVuZGVmaW5lZDtcblx0fTtcblxuXHRTZXNzaW9uSGlzdG9yeS5wcm90b3R5cGUuZ2V0U2Vzc2lvbnMgPSBmdW5jdGlvbigpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5zZXNzaW9ucztcblx0fTtcblxuXHRTZXNzaW9uSGlzdG9yeS5wcm90b3R5cGUuYWRkU2Vzc2lvbiA9IGZ1bmN0aW9uKHNlc3Npb24pXG5cdHtcblx0XHR0aGlzLnNlc3Npb25zLnB1c2goc2Vzc2lvbik7XG5cdH07XG5cblx0U2Vzc2lvbkhpc3RvcnkucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKClcblx0e1xuXHRcdHJldHVybiB7IHNlc3Npb25zOiB0aGlzLnNlc3Npb25zIH07XG5cdH07XG5cblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFZpZXc6IEVycm9yXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHR2YXIgRXJyb3JWaWV3ID0gZnVuY3Rpb24ob3B0aW9ucylcblx0e1xuXHRcdHRoaXMuJCA9IG9wdGlvbnMuJDtcblx0XHR0aGlzLiRlbCA9IHRoaXMuJChcIi5mbGFzaC1jYXJkLXBsYXllci12aWV3I2Vycm9yXCIsIG9wdGlvbnMucGFyZW50KTtcblx0XHR0aGlzLm1lc3NhZ2UgPSBvcHRpb25zLm1lc3NhZ2U7XG5cdFx0dGhpcy5yZXNvdXJjZSA9IG9wdGlvbnMucmVzb3VyY2U7XG5cdFx0dGhpcy5zaG93Q2xvc2VCdXR0b24gPSBvcHRpb25zLnNob3dDbG9zZUJ1dHRvbjtcblx0fTtcblxuXHRFcnJvclZpZXcucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uKClcblx0e1xuXHRcdHRoaXMuJChcIiNkZWNrLXRpdGxlXCIsIHRoaXMuJGVsKS50ZXh0KHRoaXMucmVzb3VyY2UudGl0bGUpO1xuXHRcdHRoaXMuJChcIiNlcnJvci1tZXNzYWdlXCIsIHRoaXMuJGVsKS50ZXh0KHRoaXMubWVzc2FnZSk7XG5cblx0XHRpZiAodGhpcy5zaG93Q2xvc2VCdXR0b24pXG5cdFx0e1xuXHRcdFx0dGhpcy4kKFwiI2NvbnNvbGUtYnV0dG9uLWNsb3NlXCIsIHRoaXMuJGVsKS5yZW1vdmVDbGFzcyhcImhpZGRlblwiKTtcblx0XHRcdHRoaXMuJChcIiNjb25zb2xlLWJ1dHRvbi1jbG9zZVwiLCB0aGlzLiRlbCkub24oXCJjbGlja1wiLCB0aGlzLm9uQ2xvc2VDbGljay5iaW5kKHRoaXMpKTtcblx0XHR9XG5cblx0XHR0aGlzLiQoXCIudmVyc2lvbi1pbmZvcm1hdGlvbi1jb250YWluZXIgPiBzcGFuXCIsIHRoaXMuJGVsKS50ZXh0KE1PRFVMRV9WRVJTSU9OKTtcblx0fTtcblxuXHRFcnJvclZpZXcucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbigpXG5cdHtcblx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcImhpZGRlblwiKTtcblx0fTtcblxuXHRFcnJvclZpZXcucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbigpXG5cdHtcblx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyhcImhpZGRlblwiKTtcblx0fTtcblxuXHRFcnJvclZpZXcucHJvdG90eXBlLm9uQ2xvc2VDbGljayA9IGZ1bmN0aW9uKClcblx0e1xuXHRcdGV2ZW50QnVzLnRyaWdnZXIoXCJlcnJvcjpjbG9zZVwiKTtcblx0fTtcblxuXHRFcnJvclZpZXcucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpXG5cdHtcblx0XHRpZiAodGhpcy5zaG93Q2xvc2VCdXR0b24pXG5cdFx0XHR0aGlzLiQoXCIjY29uc29sZS1idXR0b24tY2xvc2VcIiwgdGhpcy4kZWwpLm9mZihcImNsaWNrXCIpO1xuXHR9O1xuXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBWaWV3OiBNZW51XG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHR2YXIgTWVudVZpZXcgPSBmdW5jdGlvbihvcHRpb25zKVxuXHR7XG5cdFx0dGhpcy4kID0gb3B0aW9ucy4kO1xuXHRcdHRoaXMuJGVsID0gdGhpcy4kKFwiLmZsYXNoLWNhcmQtcGxheWVyLXZpZXcjbWVudVwiLCBvcHRpb25zLnBhcmVudCk7XG5cdFx0dGhpcy5mbGFzaENhcmRzID0gb3B0aW9ucy5mbGFzaENhcmRzO1xuXHRcdHRoaXMuaGlzdG9yeSA9IG9wdGlvbnMuaGlzdG9yeTtcblx0XHR0aGlzLnByZXZpZXdNb2RlID0gb3B0aW9ucy5wcmV2aWV3TW9kZTtcblx0XHR0aGlzLnJlc291cmNlID0gb3B0aW9ucy5yZXNvdXJjZTtcblx0fTtcblxuXHRNZW51Vmlldy5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24oKVxuXHR7XG5cdFx0dGhpcy4kKFwiI2RlY2stdGl0bGVcIiwgdGhpcy4kZWwpLnRleHQodGhpcy5yZXNvdXJjZS50aXRsZSk7XG5cblx0XHRpZiAoIXRoaXMucHJldmlld01vZGUgJiYgdGhpcy5pc1Nlc3Npb25JbmNvbXBsZXRlKCkpXG5cdFx0XHR0aGlzLiQoXCIjY29uc29sZS1idXR0b24tcmVzdW1lXCIsIHRoaXMuJGVsKS5yZW1vdmVDbGFzcyhcImhpZGRlblwiKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLiQoXCIjY29uc29sZS1idXR0b24tcmVzdW1lXCIsIHRoaXMuJGVsKS5hZGRDbGFzcyhcImhpZGRlblwiKTtcblxuXHRcdGlmICh0aGlzLnByZXZpZXdNb2RlKVxuXHRcdFx0dGhpcy4kKFwiI2NvbnNvbGUtYnV0dG9uLXN0YXRpc3RpY3NcIiwgdGhpcy4kZWwpLmFkZENsYXNzKFwiaGlkZGVuXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuJChcIiNjb25zb2xlLWJ1dHRvbi1zdGF0aXN0aWNzXCIsIHRoaXMuJGVsKS5yZW1vdmVDbGFzcyhcImhpZGRlblwiKTtcblxuXHRcdHRoaXMuJChcIiNjb25zb2xlLWJ1dHRvbi1jb25maWd1cmVcIiwgdGhpcy4kZWwpLm9uKFwiY2xpY2tcIiwgdGhpcy5vbkNvbmZpZ3VyZUNsaWNrLmJpbmQodGhpcykpO1xuXHRcdHRoaXMuJChcIiNjb25zb2xlLWJ1dHRvbi1yZXN1bWVcIiwgdGhpcy4kZWwpLm9uKFwiY2xpY2tcIiwgdGhpcy5vblJlc3VtZUNsaWNrLmJpbmQodGhpcykpO1xuXHRcdHRoaXMuJChcIiNjb25zb2xlLWJ1dHRvbi1zdGF0aXN0aWNzXCIsIHRoaXMuJGVsKS5vbihcImNsaWNrXCIsIHRoaXMub25TdGF0aXN0aWNzQ2xpY2suYmluZCh0aGlzKSk7XG5cblx0XHR0aGlzLiQoXCIudmVyc2lvbi1pbmZvcm1hdGlvbi1jb250YWluZXIgPiBzcGFuXCIsIHRoaXMuJGVsKS50ZXh0KE1PRFVMRV9WRVJTSU9OKTtcblx0fTtcblxuXHRNZW51Vmlldy5wcm90b3R5cGUuaXNTZXNzaW9uSW5jb21wbGV0ZSA9IGZ1bmN0aW9uKClcblx0e1xuXHRcdHZhciBpbmNvbXBsZXRlID0gZmFsc2U7XG5cblx0XHR2YXIgbGF0ZXN0U2Vzc2lvbiA9IHRoaXMuaGlzdG9yeS5nZXRMYXRlc3RTZXNzaW9uKCk7XG5cblx0XHRpZiAobGF0ZXN0U2Vzc2lvbiAhPT0gdW5kZWZpbmVkKVxuXHRcdHtcblx0XHRcdC8vIENvdW50IHRoZSBudW1iZXIgb2YgY2FyZCBkaXNtaXNzYWxzIGZyb20gdGhlIGxhdGVzdCBzZXNzaW9uXG5cdFx0XHR2YXIgY29tcGxldGVkQ291bnQgPSAwO1xuXG5cdFx0XHRsYXRlc3RTZXNzaW9uLnRyYW5zaXRpb25zLmZvckVhY2goZnVuY3Rpb24odHJhbnNpdGlvbikge1xuXHRcdFx0XHRpZiAodHJhbnNpdGlvbi5uYW1lID09PSBUUkFOU0lUSU9OLkRJU01JU1NfRkxBU0hfQ0FSRCAmJiB0cmFuc2l0aW9uLmRhdGEucmVhc29uICE9PSBESVNNSVNTX1JFQVNPTi5TS0lQUEVEKVxuXHRcdFx0XHRcdGNvbXBsZXRlZENvdW50Kys7XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKGNvbXBsZXRlZENvdW50IDwgbGF0ZXN0U2Vzc2lvbi5mbGFzaENhcmRDb3VudClcblx0XHRcdFx0aW5jb21wbGV0ZSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGluY29tcGxldGU7XG5cdH07XG5cblx0TWVudVZpZXcucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbigpXG5cdHtcblx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcImhpZGRlblwiKTtcblx0fTtcblxuXHRNZW51Vmlldy5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uKClcblx0e1xuXHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKFwiaGlkZGVuXCIpO1xuXHR9O1xuXG5cdE1lbnVWaWV3LnByb3RvdHlwZS5vbkNvbmZpZ3VyZUNsaWNrID0gZnVuY3Rpb24oKVxuXHR7XG5cdFx0ZXZlbnRCdXMudHJpZ2dlcihcImNvbmZpZ3VyYXRpb246c2hvd1wiKTtcblx0fTtcblxuXHRNZW51Vmlldy5wcm90b3R5cGUub25SZXN1bWVDbGljayA9IGZ1bmN0aW9uKClcblx0e1xuXHRcdGV2ZW50QnVzLnRyaWdnZXIoXCJzZXNzaW9uOnJlc3VtZVwiKTtcblx0fTtcblxuXHRNZW51Vmlldy5wcm90b3R5cGUub25TdGF0aXN0aWNzQ2xpY2sgPSBmdW5jdGlvbigpXG5cdHtcblx0XHRldmVudEJ1cy50cmlnZ2VyKFwic3RhdGlzdGljczpzaG93XCIpO1xuXHR9O1xuXG5cdE1lbnVWaWV3LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKVxuXHR7XG5cdFx0dGhpcy4kKFwiI2NvbnNvbGUtYnV0dG9uLWNvbmZpZ3VyZVwiLCB0aGlzLiRlbCkub2ZmKFwiY2xpY2tcIik7XG5cdFx0dGhpcy4kKFwiI2NvbnNvbGUtYnV0dG9uLXJlc3VtZVwiLCB0aGlzLiRlbCkub2ZmKFwiY2xpY2tcIik7XG5cdFx0dGhpcy4kKFwiI2NvbnNvbGUtYnV0dG9uLXN0YXRpc3RpY3NcIiwgdGhpcy4kZWwpLm9mZihcImNsaWNrXCIpO1xuXHR9O1xuXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBWaWV3OiBDb25maWd1cmF0aW9uXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHR2YXIgQ29uZmlndXJhdGlvblZpZXcgPSBmdW5jdGlvbihvcHRpb25zKVxuXHR7XG5cdFx0dGhpcy4kID0gb3B0aW9ucy4kO1xuXHRcdHRoaXMuJGVsID0gdGhpcy4kKFwiLmZsYXNoLWNhcmQtcGxheWVyLXZpZXcjY29uZmlndXJhdGlvblwiLCBvcHRpb25zLnBhcmVudCk7XG5cdFx0dGhpcy5yZXNvdXJjZSA9IG9wdGlvbnMucmVzb3VyY2U7XG5cdH07XG5cblx0Q29uZmlndXJhdGlvblZpZXcucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uKClcblx0e1xuXHRcdHRoaXMuJChcIiNkZWNrLXRpdGxlXCIsIHRoaXMuJGVsKS50ZXh0KHRoaXMucmVzb3VyY2UudGl0bGUpO1xuXG5cdFx0dmFyICRjb250YWluZXIgPSB0aGlzLiQoXCIjY29uZmlndXJhdGlvbi1vcHRpb25zXCIpO1xuXHRcdCRjb250YWluZXIuZW1wdHkoKTtcblxuXHRcdHRoaXMuY2hlY2tCb3hSYW5kb21pemVDYXJkcyA9IG5ldyBDaGVja0JveCh7XG5cdFx0XHQkOiB0aGlzLiQsXG5cdFx0XHRsYWJlbDogXCJTaHVmZmxlIHRoZSBkZWNrXCIsXG5cdFx0XHRvbkNsaWNrOiB0aGlzLm9uQ2hlY2tCb3hSYW5kb21pc2VDYXJkc0NsaWNrZWQuYmluZCh0aGlzKSxcblx0XHRcdHBhcmVudDogJGNvbnRhaW5lcixcblx0XHR9KTtcblxuXHRcdHRoaXMuY2hlY2tCb3hSZXZlcnNlTW9kZSA9IG5ldyBDaGVja0JveCh7XG5cdFx0XHQkOiB0aGlzLiQsXG5cdFx0XHRsYWJlbDogXCJTaG93IGJhY2sgb2YgY2FyZHMgZmlyc3RcIixcblx0XHRcdG9uQ2xpY2s6IHRoaXMub25DaGVja0JveFJldmVyc2VNb2RlQ2xpY2tlZC5iaW5kKHRoaXMpLFxuXHRcdFx0cGFyZW50OiAkY29udGFpbmVyLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy4kKFwiI2NvbnNvbGUtYnV0dG9uLXN0YXJ0XCIsIHRoaXMuJGVsKS50ZXh0KHRoaXMuZ2VuZXJhdGVTdGFydEJ1dHRvbkxhYmVsKCkpO1xuXG5cdFx0dGhpcy4kKFwiLmZsYXNoLWNhcmQtcGxheWVyLWJhY2stYnV0dG9uXCIsIHRoaXMuJGVsKS5vbihcImNsaWNrXCIsIHRoaXMub25CYWNrQ2xpY2suYmluZCh0aGlzKSk7XG5cdFx0dGhpcy4kKFwiI2NvbnNvbGUtYnV0dG9uLXN0YXJ0XCIsIHRoaXMuJGVsKS5vbihcImNsaWNrXCIsIHRoaXMub25TdGFydENsaWNrLmJpbmQodGhpcykpO1xuXG5cdFx0dGhpcy4kKFwiLnZlcnNpb24taW5mb3JtYXRpb24tY29udGFpbmVyID4gc3BhblwiLCB0aGlzLiRlbCkudGV4dChNT0RVTEVfVkVSU0lPTik7XG5cdH07XG5cblx0Q29uZmlndXJhdGlvblZpZXcucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbigpXG5cdHtcblx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcImhpZGRlblwiKTtcblx0fTtcblxuXHRDb25maWd1cmF0aW9uVmlldy5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uKClcblx0e1xuXHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKFwiaGlkZGVuXCIpO1xuXHR9O1xuXG5cdENvbmZpZ3VyYXRpb25WaWV3LnByb3RvdHlwZS5vbkJhY2tDbGljayA9IGZ1bmN0aW9uKClcblx0e1xuXHRcdGV2ZW50QnVzLnRyaWdnZXIoXCJjb25maWd1cmF0aW9uOmJhY2tcIik7XG5cdH07XG5cblx0Q29uZmlndXJhdGlvblZpZXcucHJvdG90eXBlLm9uQ2hlY2tCb3hSYW5kb21pc2VDYXJkc0NsaWNrZWQgPSBmdW5jdGlvbihjaGVja2VkKVxuXHR7XG5cdFx0ZXZlbnRCdXMudHJpZ2dlcihcIm1vZGU6cmFuZG9taXplXCIsIHsgZW5hYmxlZDogY2hlY2tlZCB9KTtcblx0fTtcblxuXHRDb25maWd1cmF0aW9uVmlldy5wcm90b3R5cGUub25DaGVja0JveFJldmVyc2VNb2RlQ2xpY2tlZCA9IGZ1bmN0aW9uKGNoZWNrZWQpXG5cdHtcblx0XHRldmVudEJ1cy50cmlnZ2VyKFwibW9kZTpyZXZlcnNlXCIsIHsgZW5hYmxlZDogY2hlY2tlZCB9KTtcblx0fTtcblxuXHRDb25maWd1cmF0aW9uVmlldy5wcm90b3R5cGUub25TdGFydENsaWNrID0gZnVuY3Rpb24oKVxuXHR7XG5cdFx0ZXZlbnRCdXMudHJpZ2dlcihcInNlc3Npb246c3RhcnRcIik7XG5cdH07XG5cblx0Q29uZmlndXJhdGlvblZpZXcucHJvdG90eXBlLmdlbmVyYXRlU3RhcnRCdXR0b25MYWJlbCA9IGZ1bmN0aW9uKClcblx0e1xuXHRcdHZhciBsYWJlbHMgPSBbXG5cdFx0XHRcIk9LLCBJJ20gcmVhZHkhXCIsXG5cdFx0XHRcIk9LLCBsZXQncyBnbyFcIixcblx0XHRcdFwiU3RhcnQgc2h1ZmZsaW5nIVwiLFxuXHRcdFx0XCJTdGFydCBkZWFsaW5nIVwiLFxuXHRcdFx0XCJTdGFydCBwbGF5aW5nIVwiLFxuXHRcdFx0XCJMZXQncyBkbyB0aGlzIVwiLFxuXHRcdFx0XCJUYXAgJ24gR28hXCIsXG5cdFx0XTtcblxuXHRcdHJldHVybiBsYWJlbHNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbGFiZWxzLmxlbmd0aCldO1xuXHR9O1xuXG5cdENvbmZpZ3VyYXRpb25WaWV3LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKVxuXHR7XG5cdFx0dGhpcy4kKFwiLmZsYXNoLWNhcmQtcGxheWVyLWJhY2stYnV0dG9uXCIsIHRoaXMuJGVsKS5vZmYoXCJjbGlja1wiKTtcblx0XHR0aGlzLiQoXCIjY29uc29sZS1idXR0b24tc3RhcnRcIiwgdGhpcy4kZWwpLm9mZihcImNsaWNrXCIpO1xuXHRcdHRoaXMuY2hlY2tCb3hSZXZlcnNlTW9kZS5kZXN0cm95KCk7XG5cdFx0dGhpcy5jaGVja0JveFJhbmRvbWl6ZUNhcmRzLmRlc3Ryb3koKTtcblx0fTtcblxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gVmlldzogU3RhdGlzdGljc1xuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0dmFyIFN0YXRpc3RpY3NWaWV3ID0gZnVuY3Rpb24ob3B0aW9ucylcblx0e1xuXHRcdHRoaXMuJCA9IG9wdGlvbnMuJDtcblx0XHR0aGlzLmZsYXNoQ2FyZHMgPSBvcHRpb25zLmZsYXNoQ2FyZHM7XG5cdFx0dGhpcy5oaXN0b3J5ID0gb3B0aW9ucy5oaXN0b3J5O1xuXHRcdHRoaXMubW9tZW50ID0gb3B0aW9ucy5tb21lbnQ7XG5cdFx0dGhpcy5yZXNvdXJjZSA9IG9wdGlvbnMucmVzb3VyY2U7XG5cdFx0dGhpcy50cnlBZ2FpbiA9IG9wdGlvbnMudHJ5QWdhaW47XG5cdFx0dGhpcy4kZWwgPSB0aGlzLiQoXCIuZmxhc2gtY2FyZC1wbGF5ZXItdmlldyNzdGF0aXN0aWNzXCIsIG9wdGlvbnMucGFyZW50KTtcblx0fTtcblxuXHRTdGF0aXN0aWNzVmlldy5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24oKVxuXHR7XG5cdFx0dGhpcy4kKFwiI2RlY2stdGl0bGVcIiwgdGhpcy4kZWwpLnRleHQodGhpcy5yZXNvdXJjZS50aXRsZSk7XG5cblx0XHR2YXIgc2VsZiA9IHRoaXM7XG5cblx0XHR2YXIgY3JlYXRlRGF0YVBvaW50QmFzZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHNlbGYuJChcIjxkaXY+PC9kaXY+XCIsIHsgY2xhc3M6IFwiZGF0YS1wb2ludFwiIH0pO1xuXHRcdH07XG5cblx0XHR2YXIgY3JlYXRlRGF0ZSA9IGZ1bmN0aW9uKGRhdGUsIG9wdGlvbnMpXG5cdFx0e1xuXHRcdFx0dmFyICRkYXRlID0gc2VsZi4kKFwiPGRpdj48L2Rpdj5cIiwgeyBcImNsYXNzXCI6IFwiZGF0ZVwiIH0pO1xuXG5cdFx0XHRpZiAoZGF0ZSlcblx0XHRcdFx0JGRhdGUuYXBwZW5kKHNlbGYuJChcIjxzcGFuPjwvc3Bhbj5cIikuaHRtbChkYXRlLmZvcm1hdChcIkREL01NL1lZWVlcIikpKTtcblxuXHRcdFx0aWYgKGRhdGUgJiYgb3B0aW9ucyAmJiBvcHRpb25zLmluY2x1ZGVUaW1lKVxuXHRcdFx0XHQkZGF0ZS5hcHBlbmQoc2VsZi4kKFwiPHNwYW4+PC9zcGFuPlwiKS5odG1sKGRhdGUuZm9ybWF0KFwiSEg6bW1cIikpKTtcblxuXHRcdFx0cmV0dXJuICRkYXRlO1xuXHRcdH07XG5cblx0XHR2YXIgY3JlYXRlTGFiZWwgPSBmdW5jdGlvbih2YWx1ZSlcblx0XHR7XG5cdFx0XHR2YXIgJGxhYmVsID0gc2VsZi4kKFwiPGRpdj48L2Rpdj5cIiwgeyBcImNsYXNzXCI6IFwiZGF0YS1wb2ludC1sYWJlbFwiIH0pO1xuXHRcdFx0JGxhYmVsLmFwcGVuZChzZWxmLiQoXCI8c3Bhbj48L3NwYW4+XCIpLmh0bWwodmFsdWUpKTtcblxuXHRcdFx0cmV0dXJuICRsYWJlbDtcblx0XHR9O1xuXG5cdFx0dmFyIGNyZWF0ZURhdGFQb2ludFNwYWNlciA9IGZ1bmN0aW9uKClcblx0XHR7XG5cdFx0XHR2YXIgJGRhdGFQb2ludCA9IGNyZWF0ZURhdGFQb2ludEJhc2UoKTtcblx0XHRcdCRkYXRhUG9pbnQuYWRkQ2xhc3MoXCJkYXRhLXBvaW50LXNwYWNlclwiKTtcblx0XHRcdCRkYXRhUG9pbnQuYXBwZW5kKHNlbGYuJChcIjxkaXY+PC9kaXY+XCIsIHsgXCJjbGFzc1wiOiBcImVtcHR5XCIgfSkpO1xuXHRcdFx0JGRhdGFQb2ludC5hcHBlbmQoY3JlYXRlRGF0ZSgpKTtcblx0XHRcdCRkYXRhUG9pbnQuYXBwZW5kKGNyZWF0ZUxhYmVsKFwiXCIpKTtcblxuXHRcdFx0cmV0dXJuICRkYXRhUG9pbnQ7XG5cdFx0fTtcblxuXHRcdHZhciBjcmVhdGVEYXRhUG9pbnRGaWxsZXIgPSBmdW5jdGlvbigpXG5cdFx0e1xuXHRcdFx0dmFyICRkYXRhUG9pbnQgPSBjcmVhdGVEYXRhUG9pbnRCYXNlKCk7XG5cdFx0XHQkZGF0YVBvaW50LmFkZENsYXNzKFwiZGF0YS1wb2ludC1maWxsZXJcIik7XG5cdFx0XHQkZGF0YVBvaW50LmFwcGVuZChzZWxmLiQoXCI8ZGl2PjwvZGl2PlwiLCB7IFwiY2xhc3NcIjogXCJlbXB0eVwiIH0pKTtcblx0XHRcdCRkYXRhUG9pbnQuYXBwZW5kKGNyZWF0ZURhdGUoKSk7XG5cdFx0XHQkZGF0YVBvaW50LmFwcGVuZChjcmVhdGVMYWJlbChcIlwiKSk7XG5cblx0XHRcdHJldHVybiAkZGF0YVBvaW50O1xuXHRcdH07XG5cblx0XHR2YXIgY3JlYXRlRGF0YVBvaW50ID0gZnVuY3Rpb24oZGF0ZSwgc2Vzc2lvbiwgc2Vzc2lvbk51bWJlciwgbWF4Rmxhc2hDYXJkQ291bnQpXG5cdFx0e1xuXHRcdFx0dmFyIGdvdEl0Q291bnQgPSAwO1xuXHRcdFx0dmFyIG5lZWRzUHJhY3Rpc2VDb3VudCA9IDA7XG5cdFx0XHR2YXIgc2tpcHBlZENvdW50ID0gMDtcblx0XHRcdHZhciBpbmNvbXBsZXRlQ291bnQgPSAwO1xuXHRcdFx0dmFyIGludmFsaWRDb3VudCA9IDA7XG5cblx0XHRcdGlmIChzZXNzaW9uLnRyYW5zaXRpb25zKVxuXHRcdFx0e1xuXHRcdFx0XHRzZXNzaW9uLnRyYW5zaXRpb25zLmZvckVhY2goZnVuY3Rpb24odHJhbnNpdGlvbikge1xuXHRcdFx0XHRcdGlmICh0cmFuc2l0aW9uLm5hbWUgPT09IFRSQU5TSVRJT04uRElTTUlTU19GTEFTSF9DQVJEKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdGlmICh0cmFuc2l0aW9uLmRhdGEucmVhc29uID09PSBESVNNSVNTX1JFQVNPTi5HT1RfSVQpXG5cdFx0XHRcdFx0XHRcdGdvdEl0Q291bnQrKztcblx0XHRcdFx0XHRcdGVsc2UgaWYgKHRyYW5zaXRpb24uZGF0YS5yZWFzb24gPT09IERJU01JU1NfUkVBU09OLk5FRURTX1BSQUNUSVNFKVxuXHRcdFx0XHRcdFx0XHRuZWVkc1ByYWN0aXNlQ291bnQrKztcblx0XHRcdFx0XHRcdGVsc2UgaWYgKHRyYW5zaXRpb24uZGF0YS5yZWFzb24gPT09IERJU01JU1NfUkVBU09OLlNLSVBQRUQpXG5cdFx0XHRcdFx0XHRcdHNraXBwZWRDb3VudCsrO1xuXHRcdFx0XHRcdFx0ZWxzZSBpZiAodHJhbnNpdGlvbi5kYXRhLnJlYXNvbiA9PT0gRElTTUlTU19SRUFTT04uSU5WQUxJRClcblx0XHRcdFx0XHRcdFx0aW52YWxpZENvdW50Kys7XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKFwiVW5yZWNvZ25pc2VkIGNhcmQgZGlzbWlzc2FsIHRyYW5zaXRpb24gZW5jb3VudGVyZWQ6IFwiICsgSlNPTi5zdHJpbmdpZnkodHJhbnNpdGlvbi5kYXRhLnJlYXNvbikpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdHZhciB2YWxpZEZsYXNoQ2FyZENvdW50ID0gc2Vzc2lvbi5mbGFzaENhcmRDb3VudCAtIGludmFsaWRDb3VudDtcblx0XHRcdGluY29tcGxldGVDb3VudCA9IHZhbGlkRmxhc2hDYXJkQ291bnQgLSAoZ290SXRDb3VudCArIG5lZWRzUHJhY3Rpc2VDb3VudCArIHNraXBwZWRDb3VudCk7XG5cblx0XHRcdHZhciAkZGF0YVBvaW50ID0gY3JlYXRlRGF0YVBvaW50QmFzZSgpO1xuXG5cdFx0XHRpZiAodmFsaWRGbGFzaENhcmRDb3VudCA8IG1heEZsYXNoQ2FyZENvdW50KVxuXHRcdFx0e1xuXHRcdFx0XHR2YXIgJGJsYW5rID0gc2VsZi4kKFwiPGRpdj48L2Rpdj5cIiwge1xuXHRcdFx0XHRcdFwiY2xhc3NcIjogXCJ2YWx1ZSBibGFua1wiLFxuXHRcdFx0XHRcdFwic3R5bGVcIjogXCJoZWlnaHQ6IGNhbGMoKDEwMCUgLSA0LjByZW0gLSAxLjByZW0pICogXCIgKyAoKG1heEZsYXNoQ2FyZENvdW50IC0gdmFsaWRGbGFzaENhcmRDb3VudCkgLyBtYXhGbGFzaENhcmRDb3VudCkgKyBcIik7XCIsXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdCRkYXRhUG9pbnQuYXBwZW5kKCRibGFuayk7XG5cdFx0XHR9XG5cblx0XHRcdHZhciAkdG90YWxMYWJlbCA9IHNlbGYuJChcIjxkaXY+PC9kaXY+XCIsIHsgXCJjbGFzc1wiOiBcInZhbHVlIHRvdGFsLWxhYmVsXCIgfSk7XG5cdFx0XHQkdG90YWxMYWJlbC5hcHBlbmQoXCI8c3Bhbj48L3NwYW4+XCIpLmh0bWwodmFsaWRGbGFzaENhcmRDb3VudCArICh2YWxpZEZsYXNoQ2FyZENvdW50ID09PSAxID8gXCIgY2FyZFwiIDogXCIgY2FyZHNcIikpO1xuXHRcdFx0JGRhdGFQb2ludC5hcHBlbmQoJHRvdGFsTGFiZWwpO1xuXG5cdFx0XHRpZiAoaW5jb21wbGV0ZUNvdW50ID4gMClcblx0XHRcdHtcblx0XHRcdFx0dmFyICRpbmNvbXBsZXRlID0gc2VsZi4kKFwiPGRpdj48L2Rpdj5cIiwge1xuXHRcdFx0XHRcdFwiY2xhc3NcIjogXCJ2YWx1ZSBpbmNvbXBsZXRlXCIsXG5cdFx0XHRcdFx0XCJzdHlsZVwiOiBcImhlaWdodDogY2FsYygoMTAwJSAtIDQuMHJlbSAtIDEuMHJlbSkgKiBcIiArIChpbmNvbXBsZXRlQ291bnQgLyBtYXhGbGFzaENhcmRDb3VudCkgKyBcIik7XCIsXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdCRpbmNvbXBsZXRlLmFwcGVuZChcIjxzcGFuPjwvc3Bhbj5cIikuaHRtbChpbmNvbXBsZXRlQ291bnQpO1xuXG5cdFx0XHRcdCRkYXRhUG9pbnQuYXBwZW5kKCRpbmNvbXBsZXRlKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHNraXBwZWRDb3VudCA+IDApXG5cdFx0XHR7XG5cdFx0XHRcdHZhciAkc2tpcHBlZCA9IHNlbGYuJChcIjxkaXY+PC9kaXY+XCIsIHtcblx0XHRcdFx0XHRcImNsYXNzXCI6IFwidmFsdWUgc2tpcHBlZFwiLFxuXHRcdFx0XHRcdFwic3R5bGVcIjogXCJoZWlnaHQ6IGNhbGMoKDEwMCUgLSA0LjByZW0gLSAxLjByZW0pICogXCIgKyAoc2tpcHBlZENvdW50IC8gbWF4Rmxhc2hDYXJkQ291bnQpICsgXCIpO1wiLFxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHQkc2tpcHBlZC5hcHBlbmQoXCI8c3Bhbj48L3NwYW4+XCIpLmh0bWwoc2tpcHBlZENvdW50KTtcblxuXHRcdFx0XHQkZGF0YVBvaW50LmFwcGVuZCgkc2tpcHBlZCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChuZWVkc1ByYWN0aXNlQ291bnQgPiAwKVxuXHRcdFx0e1xuXHRcdFx0XHR2YXIgJG5lZWRzUHJhY3Rpc2UgPSBzZWxmLiQoXCI8ZGl2PjwvZGl2PlwiLCB7XG5cdFx0XHRcdFx0XCJjbGFzc1wiOiBcInZhbHVlIG5lZWRzLXByYWN0aXNlXCIsXG5cdFx0XHRcdFx0XCJzdHlsZVwiOiBcImhlaWdodDogY2FsYygoMTAwJSAtIDQuMHJlbSAtIDEuMHJlbSkgKiBcIiArIChuZWVkc1ByYWN0aXNlQ291bnQgLyBtYXhGbGFzaENhcmRDb3VudCkgKyBcIik7XCIsXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdCRuZWVkc1ByYWN0aXNlLmFwcGVuZChcIjxzcGFuPjwvc3Bhbj5cIikuaHRtbChuZWVkc1ByYWN0aXNlQ291bnQpO1xuXG5cdFx0XHRcdCRkYXRhUG9pbnQuYXBwZW5kKCRuZWVkc1ByYWN0aXNlKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGdvdEl0Q291bnQgPiAwKVxuXHRcdFx0e1xuXHRcdFx0XHR2YXIgJGdvdEl0ID0gc2VsZi4kKFwiPGRpdj48L2Rpdj5cIiwge1xuXHRcdFx0XHRcdFwiY2xhc3NcIjogXCJ2YWx1ZSBnb3QtaXRcIixcblx0XHRcdFx0XHRcInN0eWxlXCI6IFwiaGVpZ2h0OiBjYWxjKCgxMDAlIC0gNC4wcmVtIC0gMS4wcmVtKSAqIFwiICsgKGdvdEl0Q291bnQgLyBtYXhGbGFzaENhcmRDb3VudCkgKyBcIik7XCIsXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdCRnb3RJdC5hcHBlbmQoXCI8c3Bhbj48L3NwYW4+XCIpLmh0bWwoZ290SXRDb3VudCk7XG5cblx0XHRcdFx0JGRhdGFQb2ludC5hcHBlbmQoJGdvdEl0KTtcblx0XHRcdH1cblxuXHRcdFx0JGRhdGFQb2ludC5hcHBlbmQoY3JlYXRlRGF0ZShkYXRlLCB7IGluY2x1ZGVUaW1lOiB0cnVlIH0pKTtcblx0XHRcdCRkYXRhUG9pbnQuYXBwZW5kKGNyZWF0ZUxhYmVsKHNlc3Npb25OdW1iZXIpKTtcblxuXHRcdFx0cmV0dXJuICRkYXRhUG9pbnQ7XG5cdFx0fTtcblxuXHRcdHZhciBjcmVhdGVOdWxsRGF0YVBvaW50ID0gZnVuY3Rpb24oZGF0ZSkge1xuXHRcdFx0dmFyICRkYXRhUG9pbnQgPSBjcmVhdGVEYXRhUG9pbnRCYXNlKCk7XG5cdFx0XHQkZGF0YVBvaW50LmFwcGVuZChzZWxmLiQoXCI8ZGl2PjwvZGl2PlwiLCB7IGNsYXNzOiBcIm5vLWRhdGFcIiB9KSk7XG5cdFx0XHQkZGF0YVBvaW50LmFwcGVuZChjcmVhdGVEYXRlKGRhdGUpKTtcblx0XHRcdCRkYXRhUG9pbnQuYXBwZW5kKGNyZWF0ZUxhYmVsKFwiXCIpKTtcblxuXHRcdFx0cmV0dXJuICRkYXRhUG9pbnQ7XG5cdFx0fTtcblxuXHRcdHZhciAkeEF4aXMgPSBzZWxmLiQoXCI8ZGl2PjwvZGl2PlwiLCB7IGlkOiBcIngtYXhpc1wiIH0pO1xuXG5cdFx0dmFyIHNlc3Npb25zID0gdGhpcy5oaXN0b3J5LmdldFNlc3Npb25zKCk7XG5cblx0XHR2YXIgbWF4Rmxhc2hDYXJkQ291bnQgPSAwO1xuXG5cdFx0c2Vzc2lvbnMuZm9yRWFjaChmdW5jdGlvbihzZXNzaW9uKSB7XG5cdFx0XHR2YXIgc2Vzc2lvbkZsYXNoQ2FyZENvdW50ID0gc2Vzc2lvbi5mbGFzaENhcmRDb3VudDtcblxuXHRcdFx0aWYgKHNlc3Npb24udHJhbnNpdGlvbnMpXG5cdFx0XHR7XG5cdFx0XHRcdHNlc3Npb24udHJhbnNpdGlvbnMuZm9yRWFjaChmdW5jdGlvbih0cmFuc2l0aW9uKSB7XG5cdFx0XHRcdFx0aWYgKHRyYW5zaXRpb24ubmFtZSA9PT0gVFJBTlNJVElPTi5ESVNNSVNTX0ZMQVNIX0NBUkQgJiYgdHJhbnNpdGlvbi5kYXRhLnJlYXNvbiA9PT0gRElTTUlTU19SRUFTT04uSU5WQUxJRClcblx0XHRcdFx0XHRcdHNlc3Npb25GbGFzaENhcmRDb3VudC0tO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHNlc3Npb25GbGFzaENhcmRDb3VudCA+IG1heEZsYXNoQ2FyZENvdW50KVxuXHRcdFx0XHRtYXhGbGFzaENhcmRDb3VudCA9IHNlc3Npb25GbGFzaENhcmRDb3VudDtcblx0XHR9KTtcblxuXHRcdHNlc3Npb25zLmZvckVhY2goZnVuY3Rpb24oc2Vzc2lvbiwgaW5kZXgsIHNlc3Npb25zKSB7XG5cdFx0XHQkeEF4aXMuYXBwZW5kKGNyZWF0ZURhdGFQb2ludFNwYWNlcigpKTtcblx0XHRcdCR4QXhpcy5hcHBlbmQoY3JlYXRlRGF0YVBvaW50KHNlbGYubW9tZW50LnVuaXgoc2Vzc2lvbi5jcmVhdGVkKSwgc2Vzc2lvbiwgaW5kZXggKyAxLCBtYXhGbGFzaENhcmRDb3VudCkpO1xuXHRcdH0pO1xuXG5cdFx0JHhBeGlzLmFwcGVuZChjcmVhdGVEYXRhUG9pbnRGaWxsZXIoKSk7XG5cblx0XHR0aGlzLiQoXCIjeC1heGlzXCIpLnJlbW92ZSgpO1xuXHRcdHRoaXMuJChcIiNzZXNzaW9uLWhpc3RvcnktY2hhcnQtZGF0YVwiKS5hcHBlbmQoJHhBeGlzKTtcblxuXHRcdHRoaXMuJChcIi5mbGFzaC1jYXJkLXBsYXllci1iYWNrLWJ1dHRvblwiLCB0aGlzLiRlbCkub24oXCJjbGlja1wiLCB0aGlzLm9uQmFja0NsaWNrLmJpbmQodGhpcykpO1xuXG5cdFx0aWYgKHRoaXMudHJ5QWdhaW4pXG5cdFx0e1xuXHRcdFx0dGhpcy4kKFwiI3N0YXRpc3RpY3MtYnV0dG9uLXRyeS1hZ2FpblwiLCB0aGlzLiRlbCkucmVtb3ZlQ2xhc3MoXCJoaWRkZW5cIik7XG5cdFx0XHR0aGlzLiQoXCIjc3RhdGlzdGljcy1idXR0b24tdHJ5LWFnYWluXCIsIHRoaXMuJGVsKS5vbihcImNsaWNrXCIsIHRoaXMub25UcnlBZ2FpbkNsaWNrLmJpbmQodGhpcykpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dGhpcy4kKFwiI3N0YXRpc3RpY3MtYnV0dG9uLXRyeS1hZ2FpblwiLCB0aGlzLiRlbCkuYWRkQ2xhc3MoXCJoaWRkZW5cIik7XG5cdFx0fVxuXG5cdFx0dGhpcy4kKFwiLnZlcnNpb24taW5mb3JtYXRpb24tY29udGFpbmVyID4gc3BhblwiLCB0aGlzLiRlbCkudGV4dChNT0RVTEVfVkVSU0lPTik7XG5cdH07XG5cblx0U3RhdGlzdGljc1ZpZXcucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbigpXG5cdHtcblx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcImhpZGRlblwiKTtcblx0fTtcblxuXHRTdGF0aXN0aWNzVmlldy5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uKClcblx0e1xuXHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKFwiaGlkZGVuXCIpO1xuXHR9O1xuXG5cdFN0YXRpc3RpY3NWaWV3LnByb3RvdHlwZS5vbkJhY2tDbGljayA9IGZ1bmN0aW9uKClcblx0e1xuXHRcdGV2ZW50QnVzLnRyaWdnZXIoXCJzdGF0aXN0aWNzOmJhY2tcIik7XG5cdH07XG5cblx0U3RhdGlzdGljc1ZpZXcucHJvdG90eXBlLm9uVHJ5QWdhaW5DbGljayA9IGZ1bmN0aW9uKClcblx0e1xuXHRcdGV2ZW50QnVzLnRyaWdnZXIoXCJjb25maWd1cmF0aW9uOnNob3dcIik7XG5cdH07XG5cblx0U3RhdGlzdGljc1ZpZXcucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpXG5cdHtcblx0XHR0aGlzLiQoXCIjc3RhdGlzdGljcy1idXR0b24tdHJ5LWFnYWluXCIsIHRoaXMuJGVsKS5vZmYoXCJjbGlja1wiKTtcblx0XHR0aGlzLiQoXCIuZmxhc2gtY2FyZC1wbGF5ZXItYmFjay1idXR0b25cIiwgdGhpcy4kZWwpLm9mZihcImNsaWNrXCIpO1xuXHRcdHRoaXMuJChcIiN4LWF4aXNcIikucmVtb3ZlKCk7XG5cdH07XG5cblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFZpZXc6IFZpZXdlclxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0dmFyIFZpZXdlclZpZXcgPSBmdW5jdGlvbihvcHRpb25zKVxuXHR7XG5cdFx0dGhpcy4kID0gb3B0aW9ucy4kO1xuXHRcdHRoaXMuJGVsID0gdGhpcy4kKFwiLmZsYXNoLWNhcmQtcGxheWVyLXZpZXcjdmlld2VyXCIsIG9wdGlvbnMucGFyZW50KTtcblx0XHR0aGlzLmZsYXNoQ2FyZHMgPSBBcnJheS5mcm9tKG9wdGlvbnMuZmxhc2hDYXJkcyk7XG5cdFx0dGhpcy5oaXN0b3J5ID0gb3B0aW9ucy5oaXN0b3J5O1xuXHRcdHRoaXMuaW52YWxpZEZsYXNoQ2FyZENvdW50ID0gb3B0aW9ucy5pbnZhbGlkRmxhc2hDYXJkQ291bnQ7XG5cdFx0dGhpcy5tb2RlUmFuZG9taXplQ2FyZHMgPSBvcHRpb25zLm1vZGVSYW5kb21pemVDYXJkcztcblx0XHR0aGlzLm1vZGVSYW5kb21pemVDYXJkc1NlZWQgPSBvcHRpb25zLm1vZGVSYW5kb21pemVDYXJkc1NlZWQ7XG5cdFx0dGhpcy5tb2RlUmV2ZXJzZVNpZGVzID0gb3B0aW9ucy5tb2RlUmV2ZXJzZVNpZGVzO1xuXHRcdHRoaXMucHJldmlld01vZGUgPSBvcHRpb25zLnByZXZpZXdNb2RlO1xuXHRcdHRoaXMucmVzb3VyY2UgPSBvcHRpb25zLnJlc291cmNlO1xuXHRcdHRoaXMucmVzdW1lID0gb3B0aW9ucy5yZXN1bWU7XG5cdFx0dGhpcy5zZWVkcmFuZG9tID0gb3B0aW9ucy5zZWVkcmFuZG9tO1xuXG5cdFx0dGhpcy5pbml0aWFsaXplU3RhdGUoKTtcblx0fTtcblxuXHRWaWV3ZXJWaWV3LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbigpXG5cdHtcblx0XHR0aGlzLiQoXCIjZGVjay10aXRsZVwiLCB0aGlzLiRlbCkudGV4dCh0aGlzLnJlc291cmNlLnRpdGxlKTtcblxuXHRcdGlmICh0aGlzLnByZXZpZXdNb2RlKVxuXHRcdHtcblx0XHRcdHRoaXMuJChcIiNsaXZlLWZvb3RlclwiLCB0aGlzLiRlbCkuYWRkQ2xhc3MoXCJoaWRkZW5cIik7XG5cdFx0XHR0aGlzLiQoXCIjcHJldmlldy1mb290ZXJcIiwgdGhpcy4kZWwpLnJlbW92ZUNsYXNzKFwiaGlkZGVuXCIpO1xuXG5cdFx0XHR0aGlzLiQoXCIjdmlld2VyLWJ1dHRvbi1uZXh0XCIsIHRoaXMuJGVsKS5vbihcImNsaWNrXCIsIHRoaXMub25OZXh0Q2xpY2suYmluZCh0aGlzKSk7XG5cdFx0XHR0aGlzLiQoXCIjdmlld2VyLWJ1dHRvbi1wcmV2aW91c1wiLCB0aGlzLiRlbCkub24oXCJjbGlja1wiLCB0aGlzLm9uUHJldmlvdXNDbGljay5iaW5kKHRoaXMpKTtcblxuXHRcdFx0dGhpcy51cGRhdGVQcmV2aW91c0J1dHRvbigpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dGhpcy4kKFwiI3ZpZXdlci1idXR0b24tc2tpcFwiLCB0aGlzLiRlbCkub24oXCJjbGlja1wiLCB0aGlzLm9uU2tpcENsaWNrLmJpbmQodGhpcykpO1xuXHRcdFx0dGhpcy4kKFwiI3ZpZXdlci1idXR0b24tbmVlZHMtcHJhY3Rpc2VcIiwgdGhpcy4kZWwpLm9uKFwiY2xpY2tcIiwgdGhpcy5vbk5lZWRzUHJhY3Rpc2VDbGljay5iaW5kKHRoaXMpKTtcblx0XHRcdHRoaXMuJChcIiN2aWV3ZXItYnV0dG9uLWdvdC1pdFwiLCB0aGlzLiRlbCkub24oXCJjbGlja1wiLCB0aGlzLm9uR290SXRDbGljay5iaW5kKHRoaXMpKTtcblx0XHR9XG5cblx0XHR0aGlzLiQoXCIuZmxhc2gtY2FyZC1wbGF5ZXItYmFjay1idXR0b25cIiwgdGhpcy4kZWwpLm9uKFwiY2xpY2tcIiwgdGhpcy5vbkJhY2tDbGljay5iaW5kKHRoaXMpKTtcblxuXHRcdHRoaXMuJChcIi52ZXJzaW9uLWluZm9ybWF0aW9uLWNvbnRhaW5lciA+IHNwYW5cIiwgdGhpcy4kZWwpLnRleHQoTU9EVUxFX1ZFUlNJT04pO1xuXG5cdFx0dGhpcy5hZHZhbmNlU2Vzc2lvbigpO1xuXHRcdHRoaXMuY3JlYXRlRmxhc2hDYXJkKCk7XG5cdFx0dGhpcy5yZW5kZXJGbGFzaENhcmQoKTtcblx0fTtcblxuXHRWaWV3ZXJWaWV3LnByb3RvdHlwZS5oaWRlID0gZnVuY3Rpb24oKVxuXHR7XG5cdFx0dGhpcy4kZWwuYWRkQ2xhc3MoXCJoaWRkZW5cIik7XG5cdH07XG5cblx0Vmlld2VyVmlldy5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uKClcblx0e1xuXHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKFwiaGlkZGVuXCIpO1xuXHRcdHRoaXMudXBkYXRlU2Nyb2xsUHJvbXB0KCk7XG5cdH07XG5cblx0Vmlld2VyVmlldy5wcm90b3R5cGUub25CYWNrQ2xpY2sgPSBmdW5jdGlvbigpXG5cdHtcblx0XHRldmVudEJ1cy50cmlnZ2VyKFwidmlld2VyOmJhY2tcIik7XG5cdH07XG5cblx0Vmlld2VyVmlldy5wcm90b3R5cGUuaW5pdGlhbGl6ZVN0YXRlID0gZnVuY3Rpb24oKVxuXHR7XG5cdFx0dmFyIHN0YXJ0aW5nSW5kZXggPSAtMTtcblxuXHRcdGlmICh0aGlzLnJlc3VtZSlcblx0XHR7XG5cdFx0XHR2YXIgbGF0ZXN0U2Vzc2lvbiA9IHRoaXMuaGlzdG9yeS5nZXRQcmV2aW91c1Nlc3Npb24oKTtcblxuXHRcdFx0dGhpcy5tb2RlUmFuZG9taXplQ2FyZHMgPSBsYXRlc3RTZXNzaW9uLm1vZGVSYW5kb21pemVDYXJkcztcblx0XHRcdHRoaXMubW9kZVJhbmRvbWl6ZUNhcmRzU2VlZCA9IGxhdGVzdFNlc3Npb24ubW9kZVJhbmRvbWl6ZUNhcmRzU2VlZDtcblx0XHRcdHRoaXMubW9kZVJldmVyc2VTaWRlcyA9IGxhdGVzdFNlc3Npb24ubW9kZVJldmVyc2VTaWRlcztcblxuXHRcdFx0bGF0ZXN0U2Vzc2lvbi50cmFuc2l0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKHRyYW5zaXRpb24pIHtcblx0XHRcdFx0aWYgKHRyYW5zaXRpb24ubmFtZSA9PT0gVFJBTlNJVElPTi5ESVNNSVNTX0ZMQVNIX0NBUkQpXG5cdFx0XHRcdFx0c3RhcnRpbmdJbmRleCsrO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMubW9kZVJhbmRvbWl6ZUNhcmRzKVxuXHRcdFx0dGhpcy5mbGFzaENhcmRzID0gdGhpcy5zaHVmZmxlKHRoaXMuZmxhc2hDYXJkcyk7XG5cblx0XHR0aGlzLmN1cnJlbnRDYXJkID0ge1xuXHRcdFx0aW5kZXg6IHN0YXJ0aW5nSW5kZXgsXG5cdFx0XHRzaWRlOiB0aGlzLmdldEluaXRpYWxDYXJkU2lkZSgpLFxuXHRcdH07XG5cblx0XHR0aGlzLmludmFsaWRPZmZzZXQgPSAwO1xuXHRcdHRoaXMuaXNSZW5kZXJpbmcgPSBmYWxzZTtcblx0fTtcblxuXHRWaWV3ZXJWaWV3LnByb3RvdHlwZS5nZXRWYWxpZEZsYXNoQ2FyZENvdW50ID0gZnVuY3Rpb24oKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuZmxhc2hDYXJkcy5sZW5ndGggLSB0aGlzLmludmFsaWRGbGFzaENhcmRDb3VudDtcblx0fTtcblxuXHRWaWV3ZXJWaWV3LnByb3RvdHlwZS5zaHVmZmxlID0gZnVuY3Rpb24oYXJyYXkpXG5cdHtcblx0XHR0aGlzLnNlZWRyYW5kb20odGhpcy5tb2RlUmFuZG9taXplQ2FyZHNTZWVkLCB7IGdsb2JhbDogdHJ1ZSB9KTtcblx0XHRmb3IgKHZhciBqLCB4LCBpID0gYXJyYXkubGVuZ3RoOyBpOyBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogaSksIHggPSBhcnJheVstLWldLCBhcnJheVtpXSA9IGFycmF5W2pdLCBhcnJheVtqXSA9IHgpO1xuXHRcdHJldHVybiBhcnJheTtcblx0fTtcblxuXHRWaWV3ZXJWaWV3LnByb3RvdHlwZS5jcmVhdGVGbGFzaENhcmQgPSBmdW5jdGlvbigpXG5cdHtcblx0XHR2YXIgJGZsYXNoQ2FyZCA9IHRoaXMuJChcIjxkaXY+PC9kaXY+XCIsIHsgaWQ6IFwiZmxhc2gtY2FyZC1wbGF5ZXItY2FyZFwiIH0pO1xuXHRcdHZhciAkZnJvbnQgPSB0aGlzLiQoXCI8ZGl2PjwvZGl2PlwiLCB7IGNsYXNzOiBcImZsYXNoLWNhcmQtcGxheWVyLWNhcmQtZnJvbnQgZmxhc2gtY2FyZC1wbGF5ZXItY2FyZC1yZXZlcnNpYmxlXCIgfSk7XG5cdFx0dmFyICRiYWNrID0gdGhpcy4kKFwiPGRpdj48L2Rpdj5cIiwgeyBjbGFzczogXCJmbGFzaC1jYXJkLXBsYXllci1jYXJkLWJhY2sgZmxhc2gtY2FyZC1wbGF5ZXItY2FyZC1yZXZlcnNpYmxlXCIgfSk7XG5cdFx0dmFyICRmcm9udFRleHQgPSB0aGlzLiQoXCI8ZGl2PjwvZGl2PlwiLCB7IGNsYXNzOiBcImZsYXNoLWNhcmQtcGxheWVyLWNhcmQtdGV4dFwiLCBpZDogXCJmbGFzaC1jYXJkLWZyb250LXRleHRcIiB9KTtcblx0XHR2YXIgJGJhY2tUZXh0ID0gdGhpcy4kKFwiPGRpdj48L2Rpdj5cIiwgeyBjbGFzczogXCJmbGFzaC1jYXJkLXBsYXllci1jYXJkLXRleHRcIiwgaWQ6IFwiZmxhc2gtY2FyZC1iYWNrLXRleHRcIiB9KTtcblx0XHR2YXIgJGZyb250U3BhY2VyID0gdGhpcy4kKFwiPGRpdj48L2Rpdj5cIiwgeyBjbGFzczogXCJmbGFzaC1jYXJkLXBsYXllci1zY3JvbGwtcHJvbXB0XCIgfSk7XG5cdFx0dmFyICRiYWNrU3BhY2VyID0gdGhpcy4kKFwiPGRpdj48L2Rpdj5cIiwgeyBjbGFzczogXCJmbGFzaC1jYXJkLXBsYXllci1zY3JvbGwtcHJvbXB0XCIgfSk7XG5cdFx0dmFyICRmcm9udFNjcm9sbFByb21wdCA9IHRoaXMuJChcIjxkaXY+PC9kaXY+XCIsIHsgY2xhc3M6IFwiZmxhc2gtY2FyZC1wbGF5ZXItc2Nyb2xsLXByb21wdFwiLCBpZDogXCJzY3JvbGwtcHJvbXB0LWZyb250XCIgfSk7XG5cdFx0dmFyICRiYWNrU2Nyb2xsUHJvbXB0ID0gdGhpcy4kKFwiPGRpdj48L2Rpdj5cIiwgeyBjbGFzczogXCJmbGFzaC1jYXJkLXBsYXllci1zY3JvbGwtcHJvbXB0XCIsIGlkOiBcInNjcm9sbC1wcm9tcHQtYmFja1wiIH0pO1xuXG5cdFx0JGZyb250LmFwcGVuZCh0aGlzLiQoXCI8ZGl2PjwvZGl2PlwiLCB7IGlkOiBcImZsYXNoLWNhcmQtZnJvbnQtcmliYm9uXCIsIGNsYXNzOiBcImZsYXNoLWNhcmQtcGxheWVyLWNhcmQtcmliYm9uIHRvcC1sZWZ0IHNoYWRvd1wiIH0pKTtcblx0XHQkYmFjay5hcHBlbmQodGhpcy4kKFwiPGRpdj48L2Rpdj5cIiwgeyBpZDogXCJmbGFzaC1jYXJkLWJhY2stcmliYm9uXCIsIGNsYXNzOiBcImZsYXNoLWNhcmQtcGxheWVyLWNhcmQtcmliYm9uIHRvcC1yaWdodCBzaGFkb3dcIiB9KSk7XG5cblx0XHR0aGlzLiQoXCIjZmxhc2gtY2FyZC1mcm9udC1yaWJib25cIiwgJGZyb250KTtcblx0XHR0aGlzLiQoXCIjZmxhc2gtY2FyZC1iYWNrLXJpYmJvblwiLCAkYmFjayk7XG5cblx0XHQkZnJvbnRTY3JvbGxQcm9tcHQuYXBwZW5kKHRoaXMuJChcIjxzcGFuPlNjcm9sbCBkb3duIGZvciBtb3JlPC9zcGFuPlwiKSk7XG5cdFx0JGJhY2tTY3JvbGxQcm9tcHQuYXBwZW5kKHRoaXMuJChcIjxzcGFuPlNjcm9sbCBkb3duIGZvciBtb3JlPC9zcGFuPlwiKSk7XG5cblx0XHQkZnJvbnQuYXBwZW5kKCRmcm9udFNwYWNlcik7XG5cdFx0JGZyb250LmFwcGVuZCgkZnJvbnRUZXh0KTtcblx0XHQkZnJvbnQuYXBwZW5kKCRmcm9udFNjcm9sbFByb21wdCk7XG5cdFx0JGJhY2suYXBwZW5kKCRiYWNrU3BhY2VyKTtcblx0XHQkYmFjay5hcHBlbmQoJGJhY2tUZXh0KTtcblx0XHQkYmFjay5hcHBlbmQoJGJhY2tTY3JvbGxQcm9tcHQpO1xuXG5cdFx0JGZyb250VGV4dC5vbihcInNjcm9sbFwiLCB0aGlzLm9uRmxhc2hDYXJkVGV4dFNjcm9sbC5iaW5kKHRoaXMpKTtcblx0XHQkYmFja1RleHQub24oXCJzY3JvbGxcIiwgdGhpcy5vbkZsYXNoQ2FyZFRleHRTY3JvbGwuYmluZCh0aGlzKSk7XG5cblx0XHQkZmxhc2hDYXJkLmFwcGVuZCgkZnJvbnQpO1xuXHRcdCRmbGFzaENhcmQuYXBwZW5kKCRiYWNrKTtcblxuXHRcdHRoaXMuJChcIiNmbGFzaC1jYXJkLXBsYXllci1jYXJkLWNvbnRhaW5lclwiLCB0aGlzLiRlbCkuYXBwZW5kKCRmbGFzaENhcmQpO1xuXG5cdFx0JGZsYXNoQ2FyZC5mbGlwKHtcblx0XHRcdGJhY2s6IFwiLmZsYXNoLWNhcmQtcGxheWVyLWNhcmQtYmFja1wiLFxuXHRcdFx0ZnJvbnQ6IFwiLmZsYXNoLWNhcmQtcGxheWVyLWNhcmQtZnJvbnRcIixcblx0XHRcdHNwZWVkOiA0MDAsXG5cdFx0XHR0cmlnZ2VyOiBcIm1hbnVhbFwiLFxuXHRcdH0pO1xuXG5cdFx0JGZsYXNoQ2FyZC5vbihcInRyYW5zaXRpb25lbmRcIiwgdGhpcy5vbkZsYXNoQ2FyZFRyYW5zaXRpb25FbmQuYmluZCh0aGlzKSk7XG5cdFx0JGZsYXNoQ2FyZC5vbihcImNsaWNrXCIsIHRoaXMub25GbGFzaENhcmRDbGljay5iaW5kKHRoaXMpKTtcblx0fTtcblxuXHRWaWV3ZXJWaWV3LnByb3RvdHlwZS5kZXN0cm95Rmxhc2hDYXJkID0gZnVuY3Rpb24oKVxuXHR7XG5cdFx0dGhpcy4kKFwiI2ZsYXNoLWNhcmQtZnJvbnQtdGV4dFwiLCB0aGlzLiRlbCkub2ZmKFwic2Nyb2xsXCIpO1xuXHRcdHRoaXMuJChcIiNmbGFzaC1jYXJkLWJhY2stdGV4dFwiLCB0aGlzLiRlbCkub2ZmKFwic2Nyb2xsXCIpO1xuXHRcdHRoaXMuJChcIiNmbGFzaC1jYXJkLXBsYXllci1jYXJkXCIsIHRoaXMuJGVsKS5yZW1vdmUoKTtcblx0fTtcblxuXHRWaWV3ZXJWaWV3LnByb3RvdHlwZS5yZW5kZXJGbGFzaENhcmQgPSBmdW5jdGlvbigpXG5cdHtcblx0XHRpZiAoIXRoaXMuaXNSZW5kZXJpbmcpXG5cdFx0e1xuXHRcdFx0dGhpcy5pc1JlbmRlcmluZyA9IHRydWU7XG5cblx0XHRcdHZhciAkZmxhc2hDYXJkID0gdGhpcy4kKFwiI2ZsYXNoLWNhcmQtcGxheWVyLWNhcmRcIiwgdGhpcy4kZWwpO1xuXG5cdFx0XHRpZiAoJGZsYXNoQ2FyZC5kYXRhKFwiZmxpcC1tb2RlbFwiKSAmJiAkZmxhc2hDYXJkLmRhdGEoXCJmbGlwLW1vZGVsXCIpLmlzRmxpcHBlZClcblx0XHRcdHtcblx0XHRcdFx0dGhpcy5kZXN0cm95Rmxhc2hDYXJkKCk7XG5cdFx0XHRcdHRoaXMuY3JlYXRlRmxhc2hDYXJkKCk7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBiYWNrVGV4dCA9IHRoaXMuZ2V0Q3VycmVudEZsYXNoQ2FyZCgpLmJhY2sudHJpbSgpLnJlcGxhY2UoL1tcXCZcXDxcXD5cXCdcXFwiXS9nLCBmdW5jdGlvbih4KSB7IHJldHVybiBcIiYjXCIgKyB4LmNoYXJDb2RlQXQoMCkgKyBcIjtcIjsgfSkucmVwbGFjZSgvXFxuL2csIFwiPGJyPlwiKTtcblx0XHRcdHZhciBmcm9udFRleHQgPSB0aGlzLmdldEN1cnJlbnRGbGFzaENhcmQoKS5mcm9udC50cmltKCkucmVwbGFjZSgvW1xcJlxcPFxcPlxcJ1xcXCJdL2csIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIFwiJiNcIiArIHguY2hhckNvZGVBdCgwKSArIFwiO1wiOyB9KS5yZXBsYWNlKC9cXG4vZywgXCI8YnI+XCIpO1xuXG5cdFx0XHRpZiAodGhpcy5tb2RlUmV2ZXJzZVNpZGVzKVxuXHRcdFx0e1xuXHRcdFx0XHR0aGlzLiQoXCIjZmxhc2gtY2FyZC1mcm9udC1yaWJib25cIiwgdGhpcy4kZWwpLmh0bWwoXCJCYWNrXCIpO1xuXHRcdFx0XHR0aGlzLiQoXCIjZmxhc2gtY2FyZC1iYWNrLXJpYmJvblwiLCB0aGlzLiRlbCkuaHRtbChcIkZyb250XCIpO1xuXG5cdFx0XHRcdHRoaXMuJChcIiNmbGFzaC1jYXJkLWZyb250LXRleHRcIiwgdGhpcy4kZWwpLmh0bWwoYmFja1RleHQpO1xuXHRcdFx0XHR0aGlzLiQoXCIjZmxhc2gtY2FyZC1iYWNrLXRleHRcIiwgdGhpcy4kZWwpLmh0bWwoZnJvbnRUZXh0KTtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdHtcblx0XHRcdFx0dGhpcy4kKFwiI2ZsYXNoLWNhcmQtZnJvbnQtcmliYm9uXCIsIHRoaXMuJGVsKS5odG1sKFwiRnJvbnRcIik7XG5cdFx0XHRcdHRoaXMuJChcIiNmbGFzaC1jYXJkLWJhY2stcmliYm9uXCIsIHRoaXMuJGVsKS5odG1sKFwiQmFja1wiKTtcblxuXHRcdFx0XHR0aGlzLiQoXCIjZmxhc2gtY2FyZC1mcm9udC10ZXh0XCIsIHRoaXMuJGVsKS5odG1sKGZyb250VGV4dCk7XG5cdFx0XHRcdHRoaXMuJChcIiNmbGFzaC1jYXJkLWJhY2stdGV4dFwiLCB0aGlzLiRlbCkuaHRtbChiYWNrVGV4dCk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMudXBkYXRlSW5mb3JtYXRpb25EaXNwbGF5KCk7XG5cdFx0XHR0aGlzLnVwZGF0ZURpc21pc3NhbEJ1dHRvbnMoKTtcblx0XHRcdHRoaXMudXBkYXRlU2Nyb2xsUHJvbXB0KCk7XG5cdFx0XHR0aGlzLnNob3dGbGFzaENhcmQoKTtcblxuXHRcdFx0dGhpcy5pc1JlbmRlcmluZyA9IGZhbHNlO1xuXHRcdH1cblx0fTtcblxuXHRWaWV3ZXJWaWV3LnByb3RvdHlwZS5lbmFibGVBY3RpdmVEaXNtaXNzYWxCdXR0b25zID0gZnVuY3Rpb24oKVxuXHR7XG5cdFx0dGhpcy4kKFwiI3ZpZXdlci1idXR0b24tZ290LWl0XCIsIHRoaXMuJGVsKS5yZW1vdmVDbGFzcyhcImZsYXNoLWNhcmQtcGxheWVyLXZpZXdlci1idXR0b24tZGlzYWJsZWRcIik7XG5cdFx0dGhpcy4kKFwiI3ZpZXdlci1idXR0b24tbmVlZHMtcHJhY3Rpc2VcIiwgdGhpcy4kZWwpLnJlbW92ZUNsYXNzKFwiZmxhc2gtY2FyZC1wbGF5ZXItdmlld2VyLWJ1dHRvbi1kaXNhYmxlZFwiKTtcblx0fTtcblxuXHRWaWV3ZXJWaWV3LnByb3RvdHlwZS5kaXNhYmxlQWN0aXZlRGlzbWlzc2FsQnV0dG9ucyA9IGZ1bmN0aW9uKClcblx0e1xuXHRcdHRoaXMuJChcIiN2aWV3ZXItYnV0dG9uLWdvdC1pdFwiLCB0aGlzLiRlbCkuYWRkQ2xhc3MoXCJmbGFzaC1jYXJkLXBsYXllci12aWV3ZXItYnV0dG9uLWRpc2FibGVkXCIpO1xuXHRcdHRoaXMuJChcIiN2aWV3ZXItYnV0dG9uLW5lZWRzLXByYWN0aXNlXCIsIHRoaXMuJGVsKS5hZGRDbGFzcyhcImZsYXNoLWNhcmQtcGxheWVyLXZpZXdlci1idXR0b24tZGlzYWJsZWRcIik7XG5cdH07XG5cblx0Vmlld2VyVmlldy5wcm90b3R5cGUudXBkYXRlRGlzbWlzc2FsQnV0dG9ucyA9IGZ1bmN0aW9uKClcblx0e1xuXHRcdGlmICh0aGlzLmZsaXBwZWQpXG5cdFx0XHR0aGlzLmVuYWJsZUFjdGl2ZURpc21pc3NhbEJ1dHRvbnMoKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLmRpc2FibGVBY3RpdmVEaXNtaXNzYWxCdXR0b25zKCk7XG5cdH07XG5cblx0Vmlld2VyVmlldy5wcm90b3R5cGUudXBkYXRlSW5mb3JtYXRpb25EaXNwbGF5ID0gZnVuY3Rpb24oKVxuXHR7XG5cdFx0aWYgKHRoaXMuZmxpcHBlZClcblx0XHRcdHRoaXMuJChcIi5mbGFzaC1jYXJkLXBsYXllci12aWV3ZXItc3RhdGljLWluZm9ybWF0aW9uLWRpc3BsYXlcIiwgdGhpcy4kZWwpLmFkZENsYXNzKFwiaW52aXNpYmxlXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuJChcIi5mbGFzaC1jYXJkLXBsYXllci12aWV3ZXItc3RhdGljLWluZm9ybWF0aW9uLWRpc3BsYXlcIiwgdGhpcy4kZWwpLnJlbW92ZUNsYXNzKFwiaW52aXNpYmxlXCIpO1xuXG5cdFx0dGhpcy4kKFwiI2NhcmQtbnVtYmVyLWRpc3BsYXlcIiwgdGhpcy4kZWwpLnRleHQoXCJDYXJkIFwiICsgKCh0aGlzLmN1cnJlbnRDYXJkLmluZGV4ICsgMSkgLSB0aGlzLmludmFsaWRPZmZzZXQpICsgXCIgb2YgXCIgKyB0aGlzLmdldFZhbGlkRmxhc2hDYXJkQ291bnQoKSk7XG5cdH07XG5cblx0Vmlld2VyVmlldy5wcm90b3R5cGUuZ2V0Q3VycmVudEZsYXNoQ2FyZCA9IGZ1bmN0aW9uKClcblx0e1xuXHRcdHJldHVybiB0aGlzLmZsYXNoQ2FyZHNbdGhpcy5jdXJyZW50Q2FyZC5pbmRleF07XG5cdH07XG5cblx0Vmlld2VyVmlldy5wcm90b3R5cGUuZ2V0Q3VycmVudEZsYXNoQ2FyZElkID0gZnVuY3Rpb24oKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0Q3VycmVudEZsYXNoQ2FyZCgpLl9pZDtcblx0fTtcblxuXHRWaWV3ZXJWaWV3LnByb3RvdHlwZS5nZXRJbml0aWFsQ2FyZFNpZGUgPSBmdW5jdGlvbigpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5tb2RlUmV2ZXJzZVNpZGVzID8gXCJiYWNrXCIgOiBcImZyb250XCI7XG5cdH07XG5cblx0Vmlld2VyVmlldy5wcm90b3R5cGUub25GbGFzaENhcmRUZXh0U2Nyb2xsID0gZnVuY3Rpb24oZXZlbnQpXG5cdHtcblx0XHRpZiAoIXRoaXMuaGFuZGxpbmdTY3JvbGxFdmVudClcblx0XHR7XG5cdFx0XHR0aGlzLmhhbmRsaW5nU2Nyb2xsRXZlbnQgPSB0cnVlO1xuXHRcdFx0dmFyIHNlbGYgPSB0aGlzO1xuXG5cdFx0XHR3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRzZWxmLnVwZGF0ZVNjcm9sbFByb21wdChldmVudCk7XG5cdFx0XHRcdHNlbGYuaGFuZGxpbmdTY3JvbGxFdmVudCA9IGZhbHNlO1xuICAgIFx0fSk7XG5cdFx0fVxuXHR9O1xuXG5cdFZpZXdlclZpZXcucHJvdG90eXBlLnVwZGF0ZVNjcm9sbFByb21wdCA9IGZ1bmN0aW9uKHNjcm9sbEV2ZW50KVxuXHR7XG5cdFx0aWYgKHNjcm9sbEV2ZW50KVxuXHRcdHtcblx0XHRcdGlmIChzY3JvbGxFdmVudC5jdXJyZW50VGFyZ2V0LnNjcm9sbFRvcCA8IChzY3JvbGxFdmVudC5jdXJyZW50VGFyZ2V0LnNjcm9sbEhlaWdodCAtIHNjcm9sbEV2ZW50LmN1cnJlbnRUYXJnZXQuY2xpZW50SGVpZ2h0KSlcblx0XHRcdFx0dGhpcy5zaG93U2Nyb2xsUHJvbXB0KHRoaXMuY3VycmVudENhcmQuc2lkZSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMuaGlkZVNjcm9sbFByb21wdCh0aGlzLmN1cnJlbnRDYXJkLnNpZGUpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dmFyIHRleHQgPSB0aGlzLiQoXCIjZmxhc2gtY2FyZC1cIiArIHRoaXMuY3VycmVudENhcmQuc2lkZSArIFwiLXRleHRcIiwgdGhpcy4kZWwpO1xuXG5cdFx0XHRpZiAodGV4dC5nZXQoMCkuc2Nyb2xsSGVpZ2h0ID4gdGV4dC5nZXQoMCkuY2xpZW50SGVpZ2h0ICYmXG5cdFx0XHRcdHRleHQuZ2V0KDApLnNjcm9sbFRvcCA8ICh0ZXh0LmdldCgwKS5zY3JvbGxIZWlnaHQgLSB0ZXh0LmdldCgwKS5jbGllbnRIZWlnaHQpKVxuXHRcdFx0XHR0aGlzLnNob3dTY3JvbGxQcm9tcHQodGhpcy5jdXJyZW50Q2FyZC5zaWRlKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5oaWRlU2Nyb2xsUHJvbXB0KHRoaXMuY3VycmVudENhcmQuc2lkZSk7XG5cdFx0fVxuXHR9O1xuXG5cdFZpZXdlclZpZXcucHJvdG90eXBlLnNob3dTY3JvbGxQcm9tcHQgPSBmdW5jdGlvbihzaWRlKVxuXHR7XG5cdFx0dGhpcy4kKFwiI3Njcm9sbC1wcm9tcHQtXCIgKyBzaWRlLCB0aGlzLiRlbCkucmVtb3ZlQ2xhc3MoXCJpbnZpc2libGVcIik7XG5cdH07XG5cblx0Vmlld2VyVmlldy5wcm90b3R5cGUuaGlkZVNjcm9sbFByb21wdCA9IGZ1bmN0aW9uKHNpZGUpXG5cdHtcblx0XHR0aGlzLiQoXCIjc2Nyb2xsLXByb21wdC1cIiArIHNpZGUsIHRoaXMuJGVsKS5hZGRDbGFzcyhcImludmlzaWJsZVwiKTtcblx0fTtcblxuXHRWaWV3ZXJWaWV3LnByb3RvdHlwZS5vbkZsYXNoQ2FyZFRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbigpXG5cdHtcblx0XHRpZiAoIXRoaXMuaXNGbGFzaENhcmRWaXNpYmxlKCkpXG5cdFx0XHR0aGlzLnJlbmRlckZsYXNoQ2FyZCgpO1xuXG5cdFx0dGhpcy51cGRhdGVQcmV2aW91c0J1dHRvbigpO1xuXHR9O1xuXG5cdFZpZXdlclZpZXcucHJvdG90eXBlLm9uRmxhc2hDYXJkQ2xpY2sgPSBmdW5jdGlvbigpXG5cdHtcblx0XHR2YXIgc2VsZiA9IHRoaXM7XG5cdFx0dmFyIGZyb250ID0gXCJmcm9udFwiO1xuXHRcdHZhciBiYWNrID0gXCJiYWNrXCI7XG5cblx0XHRpZiAodGhpcy5tb2RlUmV2ZXJzZVNpZGVzKVxuXHRcdHtcblx0XHRcdGZyb250ID0gXCJiYWNrXCI7XG5cdFx0XHRiYWNrID0gXCJmcm9udFwiO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmN1cnJlbnRDYXJkLnNpZGUgPT09IGZyb250KVxuXHRcdFx0dGhpcy5jdXJyZW50Q2FyZC5zaWRlID0gYmFjaztcblx0XHRlbHNlXG5cdFx0XHR0aGlzLmN1cnJlbnRDYXJkLnNpZGUgPSBmcm9udDtcblxuXHRcdHRoaXMuZmxpcHBlZCA9IHRydWU7XG5cdFx0dGhpcy5oaWRlU2Nyb2xsUHJvbXB0KHRoaXMuY3VycmVudENhcmQuc2lkZSk7XG5cblx0XHR0aGlzLiQoXCIjZmxhc2gtY2FyZC1wbGF5ZXItY2FyZFwiLCB0aGlzLiRlbCkuZmxpcCh0aGlzLmN1cnJlbnRDYXJkLnNpZGUgPT09IGJhY2ssIGZ1bmN0aW9uKCkge1xuXHRcdFx0c2VsZi51cGRhdGVJbmZvcm1hdGlvbkRpc3BsYXkoKTtcblx0XHRcdHNlbGYudXBkYXRlRGlzbWlzc2FsQnV0dG9ucygpO1xuXHRcdFx0c2VsZi51cGRhdGVTY3JvbGxQcm9tcHQoKTtcblx0XHR9KTtcblxuXHRcdGV2ZW50QnVzLnRyaWdnZXIoXCJ0cmFuc2l0aW9uczpyZWNvcmRcIiwge1xuXHRcdFx0ZGF0YTogeyBmbGFzaENhcmQ6IHRoaXMuZ2V0Q3VycmVudEZsYXNoQ2FyZElkKCkgfSxcblx0XHRcdG5hbWU6IFwiZmxhc2gtY2FyZC1mbGlwXCIsXG5cdFx0fSk7XG5cdH07XG5cblx0Vmlld2VyVmlldy5wcm90b3R5cGUub25OZXh0Q2xpY2sgPSBmdW5jdGlvbigpXG5cdHtcblx0XHR0aGlzLmFkdmFuY2VTZXNzaW9uKCk7XG5cdH07XG5cblx0Vmlld2VyVmlldy5wcm90b3R5cGUub25QcmV2aW91c0NsaWNrID0gZnVuY3Rpb24oKVxuXHR7XG5cdFx0dGhpcy5yZXRyZWF0U2Vzc2lvbigpO1xuXHR9O1xuXG5cdFZpZXdlclZpZXcucHJvdG90eXBlLm9uU2tpcENsaWNrID0gZnVuY3Rpb24oKVxuXHR7XG5cdFx0ZXZlbnRCdXMudHJpZ2dlcihcInRyYW5zaXRpb25zOnJlY29yZFwiLCB7XG5cdFx0XHRkYXRhOiB7XG5cdFx0XHRcdGZsYXNoQ2FyZDogdGhpcy5nZXRDdXJyZW50Rmxhc2hDYXJkSWQoKSxcblx0XHRcdFx0cmVhc29uOiBESVNNSVNTX1JFQVNPTi5TS0lQUEVELFxuXHRcdFx0fSxcblx0XHRcdG5hbWU6IFRSQU5TSVRJT04uRElTTUlTU19GTEFTSF9DQVJELFxuXHRcdH0pO1xuXHRcdHRoaXMuYWR2YW5jZVNlc3Npb24oKTtcblx0fTtcblxuXHRWaWV3ZXJWaWV3LnByb3RvdHlwZS5vbk5lZWRzUHJhY3Rpc2VDbGljayA9IGZ1bmN0aW9uKClcblx0e1xuXHRcdGV2ZW50QnVzLnRyaWdnZXIoXCJ0cmFuc2l0aW9uczpyZWNvcmRcIiwge1xuXHRcdFx0ZGF0YToge1xuXHRcdFx0XHRmbGFzaENhcmQ6IHRoaXMuZ2V0Q3VycmVudEZsYXNoQ2FyZElkKCksXG5cdFx0XHRcdHJlYXNvbjogRElTTUlTU19SRUFTT04uTkVFRFNfUFJBQ1RJU0UsXG5cdFx0XHR9LFxuXHRcdFx0bmFtZTogVFJBTlNJVElPTi5ESVNNSVNTX0ZMQVNIX0NBUkQsXG5cdFx0fSk7XG5cdFx0dGhpcy5hZHZhbmNlU2Vzc2lvbigpO1xuXHR9O1xuXG5cdFZpZXdlclZpZXcucHJvdG90eXBlLm9uR290SXRDbGljayA9IGZ1bmN0aW9uKClcblx0e1xuXHRcdGV2ZW50QnVzLnRyaWdnZXIoXCJ0cmFuc2l0aW9uczpyZWNvcmRcIiwge1xuXHRcdFx0ZGF0YToge1xuXHRcdFx0XHRmbGFzaENhcmQ6IHRoaXMuZ2V0Q3VycmVudEZsYXNoQ2FyZElkKCksXG5cdFx0XHRcdHJlYXNvbjogRElTTUlTU19SRUFTT04uR09UX0lULFxuXHRcdFx0fSxcblx0XHRcdG5hbWU6IFRSQU5TSVRJT04uRElTTUlTU19GTEFTSF9DQVJELFxuXHRcdH0pO1xuXHRcdHRoaXMuYWR2YW5jZVNlc3Npb24oKTtcblx0fTtcblxuXHRWaWV3ZXJWaWV3LnByb3RvdHlwZS5pc0ZsYXNoQ2FyZFZpc2libGUgPSBmdW5jdGlvbigpXG5cdHtcblx0XHRyZXR1cm4gIXRoaXMuJChcIiNmbGFzaC1jYXJkLXBsYXllci1jYXJkXCIsIHRoaXMuJGVsKS5oYXNDbGFzcyhcImZsYXNoLWNhcmQtcGxheWVyLWNhcmQtaW52aXNpYmxlXCIpO1xuXHR9O1xuXG5cdFZpZXdlclZpZXcucHJvdG90eXBlLmhpZGVGbGFzaENhcmQgPSBmdW5jdGlvbigpXG5cdHtcblx0XHR0aGlzLiQoXCIjZmxhc2gtY2FyZC1wbGF5ZXItY2FyZFwiLCB0aGlzLiRlbCkuYWRkQ2xhc3MoXCJmbGFzaC1jYXJkLXBsYXllci1jYXJkLWludmlzaWJsZVwiKTtcblx0fTtcblxuXHRWaWV3ZXJWaWV3LnByb3RvdHlwZS5zaG93Rmxhc2hDYXJkID0gZnVuY3Rpb24oKVxuXHR7XG5cdFx0dGhpcy4kKFwiI2ZsYXNoLWNhcmQtcGxheWVyLWNhcmRcIiwgdGhpcy4kZWwpLnJlbW92ZUNsYXNzKFwiZmxhc2gtY2FyZC1wbGF5ZXItY2FyZC1pbnZpc2libGVcIik7XG5cblx0XHRldmVudEJ1cy50cmlnZ2VyKFwidHJhbnNpdGlvbnM6cmVjb3JkXCIsIHtcblx0XHRcdGRhdGE6IHtcblx0XHRcdFx0Zmxhc2hDYXJkOiB0aGlzLmdldEN1cnJlbnRGbGFzaENhcmRJZCgpLFxuXHRcdFx0XHRzaWRlOiB0aGlzLmN1cnJlbnRDYXJkLnNpZGUsXG5cdFx0XHR9LFxuXHRcdFx0bmFtZTogXCJmbGFzaC1jYXJkLXNob3dcIixcblx0XHR9KTtcblx0fTtcblxuXHRWaWV3ZXJWaWV3LnByb3RvdHlwZS5hZHZhbmNlU2Vzc2lvbiA9IGZ1bmN0aW9uKClcblx0e1xuXHRcdGV2ZW50QnVzLnRyaWdnZXIoXCJ0cmFuc2l0aW9uczpzeW5jaHJvbml6ZVwiKTtcblxuXHRcdHZhciB2YWxpZCA9IGZhbHNlO1xuXG5cdFx0d2hpbGUgKCF2YWxpZCAmJiB0aGlzLmN1cnJlbnRDYXJkLmluZGV4ICsgMSA8IHRoaXMuZmxhc2hDYXJkcy5sZW5ndGgpXG5cdFx0e1xuXHRcdFx0dGhpcy5jdXJyZW50Q2FyZC5pbmRleCsrO1xuXHRcdFx0dmFyIGZsYXNoQ2FyZCA9IHRoaXMuZ2V0Q3VycmVudEZsYXNoQ2FyZCgpO1xuXG5cdFx0XHRpZiAoZmxhc2hDYXJkLmJhY2sgPT09IHVuZGVmaW5lZCB8fCBmbGFzaENhcmQuYmFjayA9PT0gbnVsbCB8fCBmbGFzaENhcmQuYmFjay5sZW5ndGggPT09IDAgfHxcblx0XHRcdFx0Zmxhc2hDYXJkLmZyb250ID09PSB1bmRlZmluZWQgfHwgZmxhc2hDYXJkLmZyb250ID09PSBudWxsIHx8IGZsYXNoQ2FyZC5mcm9udC5sZW5ndGggPT09IDApXG5cdFx0XHR7XG5cdFx0XHRcdGV2ZW50QnVzLnRyaWdnZXIoXCJ0cmFuc2l0aW9uczpyZWNvcmRcIiwge1xuXHRcdFx0XHRcdGRhdGE6IHtcblx0XHRcdFx0XHRcdGZsYXNoQ2FyZDogdGhpcy5nZXRDdXJyZW50Rmxhc2hDYXJkSWQoKSxcblx0XHRcdFx0XHRcdHJlYXNvbjogRElTTUlTU19SRUFTT04uSU5WQUxJRCxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdG5hbWU6IFRSQU5TSVRJT04uRElTTUlTU19GTEFTSF9DQVJELFxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR0aGlzLmludmFsaWRPZmZzZXQrKztcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdHtcblx0XHRcdFx0dmFsaWQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh2YWxpZClcblx0XHR7XG5cdFx0XHR0aGlzLmN1cnJlbnRDYXJkLnNpZGUgPSB0aGlzLmdldEluaXRpYWxDYXJkU2lkZSgpO1xuXHRcdFx0dGhpcy5mbGlwcGVkID0gZmFsc2U7XG5cdFx0XHR0aGlzLmhpZGVGbGFzaENhcmQoKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdGV2ZW50QnVzLnRyaWdnZXIoXCJzZXNzaW9uOmVuZFwiKTtcblx0XHR9XG5cdH07XG5cblx0Vmlld2VyVmlldy5wcm90b3R5cGUucmV0cmVhdFNlc3Npb24gPSBmdW5jdGlvbigpXG5cdHtcblx0XHRpZiAodGhpcy5jdXJyZW50Q2FyZC5pbmRleCA+IDApXG5cdFx0e1xuXHRcdFx0dGhpcy5jdXJyZW50Q2FyZC5pbmRleC0tO1xuXHRcdFx0dGhpcy5jdXJyZW50Q2FyZC5zaWRlID0gdGhpcy5nZXRJbml0aWFsQ2FyZFNpZGUoKTtcblx0XHRcdHRoaXMuZmxpcHBlZCA9IGZhbHNlO1xuXHRcdFx0dGhpcy5oaWRlRmxhc2hDYXJkKCk7XG5cdFx0fVxuXHR9O1xuXG5cdFZpZXdlclZpZXcucHJvdG90eXBlLnVwZGF0ZVByZXZpb3VzQnV0dG9uID0gZnVuY3Rpb24oKVxuXHR7XG5cdFx0aWYgKHRoaXMuY3VycmVudENhcmQuaW5kZXggPD0gMClcblx0XHRcdHRoaXMuJChcIiN2aWV3ZXItYnV0dG9uLXByZXZpb3VzXCIsIHRoaXMuJGVsKS5hZGRDbGFzcyhcImZsYXNoLWNhcmQtcGxheWVyLXZpZXdlci1idXR0b24tZGlzYWJsZWRcIik7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy4kKFwiI3ZpZXdlci1idXR0b24tcHJldmlvdXNcIiwgdGhpcy4kZWwpLnJlbW92ZUNsYXNzKFwiZmxhc2gtY2FyZC1wbGF5ZXItdmlld2VyLWJ1dHRvbi1kaXNhYmxlZFwiKTtcblx0fTtcblxuXHRWaWV3ZXJWaWV3LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKVxuXHR7XG5cdFx0dGhpcy4kKFwiLmZsYXNoLWNhcmQtcGxheWVyLWJhY2stYnV0dG9uXCIsIHRoaXMuJGVsKS5vZmYoXCJjbGlja1wiKTtcblxuXHRcdGlmICh0aGlzLnByZXZpZXdNb2RlKVxuXHRcdHtcblx0XHRcdHRoaXMuJChcIiN2aWV3ZXItYnV0dG9uLW5leHRcIiwgdGhpcy4kZWwpLm9mZihcImNsaWNrXCIpO1xuXHRcdFx0dGhpcy4kKFwiI3ZpZXdlci1idXR0b24tcHJldmlvdXNcIiwgdGhpcy4kZWwpLm9mZihcImNsaWNrXCIpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dGhpcy4kKFwiI3ZpZXdlci1idXR0b24tZ290LWl0XCIsIHRoaXMuJGVsKS5vZmYoXCJjbGlja1wiKTtcblx0XHRcdHRoaXMuJChcIiN2aWV3ZXItYnV0dG9uLW5lZWRzLXByYWN0aXNlXCIsIHRoaXMuJGVsKS5vZmYoXCJjbGlja1wiKTtcblx0XHRcdHRoaXMuJChcIiN2aWV3ZXItYnV0dG9uLXNraXBcIiwgdGhpcy4kZWwpLm9mZihcImNsaWNrXCIpO1xuXHRcdH1cblxuXHRcdHRoaXMuZGVzdHJveUZsYXNoQ2FyZCgpO1xuXHR9O1xuXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBGbGFzaGNhcmQgUGxheWVyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHR2YXIgRmxhc2hDYXJkUGxheWVyID0gZnVuY3Rpb24ob3B0cylcblx0e1xuXHRcdHZhciBvcHRpb25zID0gb3B0cyB8fCB7fTtcblxuXHRcdGlmIChvcHRpb25zLnBhcmVudClcblx0XHRcdHRoaXMucGFyZW50ID0gb3B0aW9ucy5wYXJlbnQ7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5wYXJlbnQgPSBkb2N1bWVudDtcblxuXHRcdHRoaXMuJCA9IG9wdGlvbnMuJCB8fCAkO1xuXHRcdHRoaXMubW9tZW50ID0gb3B0aW9ucy5tb21lbnQgfHwgbW9tZW50O1xuXHRcdHRoaXMuc2VlZHJhbmRvbSA9IG9wdGlvbnMuc2VlZHJhbmRvbSB8fCBNYXRoLnNlZWRyYW5kb207XG5cdH07XG5cblx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIHN0YXJ0OiBwcmVwYXJlIGRhdGEsIGNvbnN0cnVjdCB0aGUgVUksIGFuZCBzdGFydCB0aGUgcGxheWVyXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHRGbGFzaENhcmRQbGF5ZXIucHJvdG90eXBlLnN0YXJ0ID0gZnVuY3Rpb24ocmVzb3VyY2UsIHJlc291cmNlRGF0YSwgaGlzdG9yeSwgb3B0aW9ucylcblx0e1xuXHRcdC8vIEluaXRpYWxpemUgcmVxdWlyZWQgZGF0YSBhbmQgb3B0aW9uc1xuXHRcdGlmIChyZXNvdXJjZSlcblx0XHRcdHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTtcblx0XHRlbHNlXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJSZXNvdXJjZSB3YXMgbm90IHByb3ZpZGVkOyBjYW5ub3Qgc3RhcnRcIik7XG5cblx0XHRpZiAocmVzb3VyY2VEYXRhKVxuXHRcdHtcblx0XHRcdHRoaXMuZmxhc2hDYXJkcyA9IHJlc291cmNlRGF0YS5mbGFzaENhcmRzO1xuXHRcdFx0dGhpcy5pbnZhbGlkRmxhc2hDYXJkQ291bnQgPSB0aGlzLmNvdW50SW52YWxpZEZsYXNoQ2FyZHMoKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiUmVzb3VyY2UgZGF0YSAoZmxhc2hjYXJkcykgd2VyZSBub3QgcHJvdmlkZWQ7IGNhbm5vdCBzdGFydFwiKTtcblxuXHRcdHRoaXMuaGlzdG9yeSA9IG5ldyBTZXNzaW9uSGlzdG9yeShoaXN0b3J5KTtcblx0XHR0aGlzLnByZXZpZXdNb2RlID0gb3B0aW9ucyAmJiBvcHRpb25zLnByZXZpZXdNb2RlO1xuXG5cdFx0Ly8gQ3JlYXRlIG1vY2t1cHMgZm9yIHRoZSBzeW5jaHJvbml6YXRpb24gb3BlcmF0aW9ucyBpZiB0aGV5IGFyZSBtaXNzaW5nXG5cdFx0aWYgKCF3aW5kb3cuU3luYylcblx0XHRcdHdpbmRvdy5TeW5jID0ge307XG5cblx0XHRpZiAoIXdpbmRvdy5TeW5jLmZsYXNoQ2FyZHNUcmFuc2l0aW9uKVxuXHRcdFx0d2luZG93LlN5bmMuZmxhc2hDYXJkc1RyYW5zaXRpb24gPSBmdW5jdGlvbigpIHt9O1xuXG5cdFx0aWYgKCF3aW5kb3cuU3luYy5mbGFzaENhcmRzQ29tcGxldGUpXG5cdFx0XHR3aW5kb3cuU3luYy5mbGFzaENhcmRzQ29tcGxldGUgPSBmdW5jdGlvbigpIHt9O1xuXG5cdFx0aWYgKHRoaXMuZmxhc2hDYXJkcy5sZW5ndGggPiAwKVxuXHRcdHtcblx0XHRcdHRoaXMucmVnaXN0ZXJFdmVudEhhbmRsZXJzKCk7XG5cdFx0XHR0aGlzLnNob3dNZW51KCk7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHR0aGlzLnNob3dFcnJvcihcIlRoaXMgZmxhc2hjYXJkIGRlY2sgaXMgZW1wdHkuXCIpO1xuXHRcdH1cblx0fTtcblxuXHRGbGFzaENhcmRQbGF5ZXIucHJvdG90eXBlLmNvdW50SW52YWxpZEZsYXNoQ2FyZHMgPSBmdW5jdGlvbigpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5mbGFzaENhcmRzLnJlZHVjZShmdW5jdGlvbihhY2MsIGZsYXNoQ2FyZCkge1xuXHRcdFx0cmV0dXJuIGZsYXNoQ2FyZC5iYWNrID09PSB1bmRlZmluZWQgfHwgZmxhc2hDYXJkLmJhY2sgPT09IG51bGwgfHwgZmxhc2hDYXJkLmJhY2subGVuZ3RoID09PSAwIHx8XG5cdFx0XHRcdGZsYXNoQ2FyZC5mcm9udCA9PT0gdW5kZWZpbmVkIHx8IGZsYXNoQ2FyZC5mcm9udCA9PT0gbnVsbCB8fCBmbGFzaENhcmQuZnJvbnQubGVuZ3RoID09PSAwID8gYWNjICsgMSA6IGFjYztcblx0XHR9LCAwKTtcblx0fTtcblxuXHRGbGFzaENhcmRQbGF5ZXIucHJvdG90eXBlLnJlZ2lzdGVyRXZlbnRIYW5kbGVycyA9IGZ1bmN0aW9uKClcblx0e1xuXHRcdC8vIEZyb20gbWVudSB2aWV3XG5cdFx0ZXZlbnRCdXMub24oXCJjb25maWd1cmF0aW9uOnNob3dcIiwgdGhpcy5zaG93Q29uZmlndXJhdGlvbi5iaW5kKHRoaXMpKTsgLy8gQWxzbyBmcm9tIHN0YXRpc3RpY3Mgdmlld1xuXHRcdGV2ZW50QnVzLm9uKFwic2Vzc2lvbjpyZXN1bWVcIiwgdGhpcy5yZXN1bWVTZXNzaW9uLmJpbmQodGhpcykpO1xuXHRcdGV2ZW50QnVzLm9uKFwic3RhdGlzdGljczpzaG93XCIsIHRoaXMuc2hvd1N0YXRpc3RpY3MuYmluZCh0aGlzKSk7XG5cblx0XHQvLyBGcm9tIGNvbmZpZ3VyYXRpb24gdmlld1xuXHRcdGV2ZW50QnVzLm9uKFwiY29uZmlndXJhdGlvbjpiYWNrXCIsIHRoaXMuc2hvd01lbnUuYmluZCh0aGlzKSk7XG5cdFx0ZXZlbnRCdXMub24oXCJtb2RlOnJhbmRvbWl6ZVwiLCB0aGlzLm9uTW9kZVJhbmRvbWl6ZUNoYW5nZWQuYmluZCh0aGlzKSk7XG5cdFx0ZXZlbnRCdXMub24oXCJtb2RlOnJldmVyc2VcIiwgdGhpcy5vbk1vZGVSZXZlcnNlQ2hhbmdlZC5iaW5kKHRoaXMpKTtcblx0XHRldmVudEJ1cy5vbihcInNlc3Npb246c3RhcnRcIiwgdGhpcy5zdGFydFNlc3Npb24uYmluZCh0aGlzKSk7XG5cblx0XHQvLyBGcm9tIHN0YXRpc3RpY3Mgdmlld1xuXHRcdGV2ZW50QnVzLm9uKFwic3RhdGlzdGljczpiYWNrXCIsIHRoaXMuc2hvd01lbnUuYmluZCh0aGlzKSk7XG5cblx0XHQvLyBGcm9tIHZpZXdlclxuXHRcdGV2ZW50QnVzLm9uKFwidmlld2VyOmJhY2tcIiwgdGhpcy5lbmRTZXNzaW9uLmJpbmQodGhpcykpO1xuXHRcdGV2ZW50QnVzLm9uKFwic2Vzc2lvbjplbmRcIiwgdGhpcy5lbmRTZXNzaW9uLmJpbmQodGhpcykpO1xuXHRcdGV2ZW50QnVzLm9uKFwidHJhbnNpdGlvbnM6cmVjb3JkXCIsIHRoaXMucmVjb3JkVHJhbnNpdGlvbi5iaW5kKHRoaXMpKTtcblx0XHRldmVudEJ1cy5vbihcInRyYW5zaXRpb25zOnN5bmNocm9uaXplXCIsIHRoaXMuc3luY2hyb25pemVUcmFuc2l0aW9ucy5iaW5kKHRoaXMpKTtcblx0fTtcblxuXHRGbGFzaENhcmRQbGF5ZXIucHJvdG90eXBlLnJlY29yZFRyYW5zaXRpb24gPSBmdW5jdGlvbih0cmFuc2l0aW9uKVxuXHR7XG5cdFx0dGhpcy5jdXJyZW50U2Vzc2lvbi50cmFuc2l0aW9ucy5wdXNoKHtcblx0XHRcdG5hbWU6IHRyYW5zaXRpb24ubmFtZSxcblx0XHRcdGRhdGE6IHRyYW5zaXRpb24uZGF0YSB8fCB7fSxcblx0XHRcdHRpbWU6IG5ldyBEYXRlKCkudmFsdWVPZigpLFxuXHRcdH0pO1xuXHR9O1xuXG5cdEZsYXNoQ2FyZFBsYXllci5wcm90b3R5cGUuc3luY2hyb25pemVUcmFuc2l0aW9ucyA9IGZ1bmN0aW9uKClcblx0e1xuXHRcdHdpbmRvdy5TeW5jLmZsYXNoQ2FyZHNUcmFuc2l0aW9uKEpTT04uc3RyaW5naWZ5KHRoaXMuaGlzdG9yeS50b0pTT04oKSkpO1xuXHR9O1xuXG5cdEZsYXNoQ2FyZFBsYXllci5wcm90b3R5cGUuZmluYWxpemVUcmFuc2l0aW9ucyA9IGZ1bmN0aW9uKClcblx0e1xuXHRcdHdpbmRvdy5TeW5jLmZsYXNoQ2FyZHNDb21wbGV0ZShKU09OLnN0cmluZ2lmeSh0aGlzLmhpc3RvcnkudG9KU09OKCkpKTtcblx0fTtcblxuXHR2YXIgY3JlYXRlVVVJRCA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBzID0gW107XG5cdFx0dmFyIGhleERpZ2l0cyA9IFwiMDEyMzQ1Njc4OWFiY2RlZlwiO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgMzY7IGkrKykge1xuXHRcdFx0c1tpXSA9IGhleERpZ2l0cy5zdWJzdHIoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMHgxMCksIDEpO1xuXHRcdH1cblx0XHRzWzE0XSA9IFwiNFwiOyAgLy8gYml0cyAxMi0xNSBvZiB0aGUgdGltZV9oaV9hbmRfdmVyc2lvbiBmaWVsZCB0byAwMDEwXG5cdFx0c1sxOV0gPSBoZXhEaWdpdHMuc3Vic3RyKChzWzE5XSAmIDB4MykgfCAweDgsIDEpOyAgLy8gYml0cyA2LTcgb2YgdGhlIGNsb2NrX3NlcV9oaV9hbmRfcmVzZXJ2ZWQgdG8gMDFcblx0XHRzWzhdID0gc1sxM10gPSBzWzE4XSA9IHNbMjNdID0gXCItXCI7XG5cdFx0cmV0dXJuIHMuam9pbihcIlwiKTtcblx0fTtcblxuXHRGbGFzaENhcmRQbGF5ZXIucHJvdG90eXBlLmNyZWF0ZVNlc3Npb24gPSBmdW5jdGlvbigpXG5cdHtcblx0XHR0aGlzLmN1cnJlbnRTZXNzaW9uID0ge1xuXHRcdFx0YXR0YWNobWVudDogdGhpcy5yZXNvdXJjZS5hdHRhY2htZW50IHx8IG51bGwsXG5cdFx0XHRjcmVhdGVkOiB0aGlzLm1vbWVudCgpLnVuaXgoKSxcblx0XHRcdGZsYXNoQ2FyZENvdW50OiB0aGlzLmZsYXNoQ2FyZHMubGVuZ3RoLFxuXHRcdFx0bW9kZVJhbmRvbWl6ZUNhcmRzOiBmYWxzZSxcblx0XHRcdG1vZGVSZXZlcnNlU2lkZXM6IGZhbHNlLFxuXHRcdFx0cmVzb3VyY2U6IHRoaXMucmVzb3VyY2UuaWQsXG5cdFx0XHR0cmFuc2l0aW9uczogW10sXG5cdFx0XHRkZXZpY2VpZDogY3JlYXRlVVVJRCgpLFxuXHRcdH07XG5cdH07XG5cblx0Rmxhc2hDYXJkUGxheWVyLnByb3RvdHlwZS5lbmRTZXNzaW9uID0gZnVuY3Rpb24oKVxuXHR7XG5cdFx0dGhpcy5yZWNvcmRUcmFuc2l0aW9uKHsgbmFtZTogXCJzZXNzaW9uLXN0b3BcIiB9KTtcblx0XHR0aGlzLmZpbmFsaXplVHJhbnNpdGlvbnMoKTtcblxuXHRcdGlmICh0aGlzLnByZXZpZXdNb2RlKVxuXHRcdFx0dGhpcy5zaG93TWVudSgpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuc2hvd1N0YXRpc3RpY3MoeyB0cnlBZ2FpbjogdHJ1ZSB9KTtcblx0fTtcblxuXHRGbGFzaENhcmRQbGF5ZXIucHJvdG90eXBlLnJlc3VtZVNlc3Npb24gPSBmdW5jdGlvbigpXG5cdHtcblx0XHR0aGlzLmNyZWF0ZVNlc3Npb24oKTtcblx0XHR0aGlzLnN0YXJ0U2Vzc2lvbih0cnVlKTtcblx0fTtcblxuXHRGbGFzaENhcmRQbGF5ZXIucHJvdG90eXBlLnN0YXJ0U2Vzc2lvbiA9IGZ1bmN0aW9uKHJlc3VtZSlcblx0e1xuXHRcdHRoaXMuaGlzdG9yeS5hZGRTZXNzaW9uKHRoaXMuY3VycmVudFNlc3Npb24pO1xuXHRcdHRoaXMucmVjb3JkVHJhbnNpdGlvbih7IG5hbWU6IFwic2Vzc2lvbi1zdGFydFwiIH0pO1xuXHRcdHRoaXMuc3luY2hyb25pemVUcmFuc2l0aW9ucygpO1xuXHRcdHRoaXMuc2hvd1ZpZXdlcih7IHJlc3VtZTogcmVzdW1lIH0pO1xuXHR9O1xuXG5cdEZsYXNoQ2FyZFBsYXllci5wcm90b3R5cGUub25Nb2RlUmFuZG9taXplQ2hhbmdlZCA9IGZ1bmN0aW9uKGRhdGEpXG5cdHtcblx0XHR0aGlzLmN1cnJlbnRTZXNzaW9uLm1vZGVSYW5kb21pemVDYXJkcyA9IGRhdGEuZW5hYmxlZDtcblx0XHR0aGlzLmN1cnJlbnRTZXNzaW9uLm1vZGVSYW5kb21pemVDYXJkc1NlZWQgPSB0aGlzLm1vbWVudCgpLnVuaXgoKSArIFwiXCI7XG5cdH07XG5cblx0Rmxhc2hDYXJkUGxheWVyLnByb3RvdHlwZS5vbk1vZGVSZXZlcnNlQ2hhbmdlZCA9IGZ1bmN0aW9uKGRhdGEpXG5cdHtcblx0XHR0aGlzLmN1cnJlbnRTZXNzaW9uLm1vZGVSZXZlcnNlU2lkZXMgPSBkYXRhLmVuYWJsZWQ7XG5cdH07XG5cblx0Rmxhc2hDYXJkUGxheWVyLnByb3RvdHlwZS5zaG93RXJyb3IgPSBmdW5jdGlvbihtZXNzYWdlLCBzaG93Q2xvc2VCdXR0b24pXG5cdHtcblx0XHR0aGlzLnNob3dWaWV3KG5ldyBFcnJvclZpZXcoe1xuXHRcdFx0JDogdGhpcy4kLFxuXHRcdFx0bWVzc2FnZTogbWVzc2FnZSxcblx0XHRcdHBhcmVudDogdGhpcy5wYXJlbnQsXG5cdFx0XHRyZXNvdXJjZTogdGhpcy5yZXNvdXJjZSxcblx0XHRcdHNob3dDbG9zZUJ1dHRvbjogc2hvd0Nsb3NlQnV0dG9uLFxuXHRcdH0pKTtcblx0fTtcblxuXHRGbGFzaENhcmRQbGF5ZXIucHJvdG90eXBlLnNob3dNZW51ID0gZnVuY3Rpb24oKVxuXHR7XG5cdFx0dGhpcy5zaG93VmlldyhuZXcgTWVudVZpZXcoe1xuXHRcdFx0JDogdGhpcy4kLFxuXHRcdFx0Zmxhc2hDYXJkczogdGhpcy5mbGFzaENhcmRzLFxuXHRcdFx0aGlzdG9yeTogdGhpcy5oaXN0b3J5LFxuXHRcdFx0cGFyZW50OiB0aGlzLnBhcmVudCxcblx0XHRcdHByZXZpZXdNb2RlOiB0aGlzLnByZXZpZXdNb2RlLFxuXHRcdFx0cmVzb3VyY2U6IHRoaXMucmVzb3VyY2UsXG5cdFx0fSkpO1xuXHR9O1xuXG5cdEZsYXNoQ2FyZFBsYXllci5wcm90b3R5cGUuc2hvd0NvbmZpZ3VyYXRpb24gPSBmdW5jdGlvbigpXG5cdHtcblx0XHR0aGlzLmNyZWF0ZVNlc3Npb24oKTtcblxuXHRcdHRoaXMuc2hvd1ZpZXcobmV3IENvbmZpZ3VyYXRpb25WaWV3KHtcblx0XHRcdCQ6IHRoaXMuJCxcblx0XHRcdHBhcmVudDogdGhpcy5wYXJlbnQsXG5cdFx0XHRyZXNvdXJjZTogdGhpcy5yZXNvdXJjZSxcblx0XHR9KSk7XG5cdH07XG5cblx0Rmxhc2hDYXJkUGxheWVyLnByb3RvdHlwZS5zaG93U3RhdGlzdGljcyA9IGZ1bmN0aW9uKG9wdGlvbnMpXG5cdHtcblx0XHR0aGlzLnNob3dWaWV3KG5ldyBTdGF0aXN0aWNzVmlldyh7XG5cdFx0XHQkOiB0aGlzLiQsXG5cdFx0XHRmbGFzaENhcmRzOiB0aGlzLmZsYXNoQ2FyZHMsXG5cdFx0XHRoaXN0b3J5OiB0aGlzLmhpc3RvcnksXG5cdFx0XHRtb21lbnQ6IHRoaXMubW9tZW50LFxuXHRcdFx0cGFyZW50OiB0aGlzLnBhcmVudCxcblx0XHRcdHJlc291cmNlOiB0aGlzLnJlc291cmNlLFxuXHRcdFx0dHJ5QWdhaW46IG9wdGlvbnMgPyBvcHRpb25zLnRyeUFnYWluIDogdW5kZWZpbmVkLFxuXHRcdH0pKTtcblx0fTtcblxuXHRGbGFzaENhcmRQbGF5ZXIucHJvdG90eXBlLnNob3dWaWV3ZXIgPSBmdW5jdGlvbihvcHRpb25zKVxuXHR7XG5cdFx0dGhpcy5zaG93VmlldyhuZXcgVmlld2VyVmlldyh7XG5cdFx0XHQkOiB0aGlzLiQsXG5cdFx0XHRmbGFzaENhcmRzOiB0aGlzLmZsYXNoQ2FyZHMsXG5cdFx0XHRoaXN0b3J5OiB0aGlzLmhpc3RvcnksXG5cdFx0XHRpbnZhbGlkRmxhc2hDYXJkQ291bnQ6IHRoaXMuaW52YWxpZEZsYXNoQ2FyZENvdW50LFxuXHRcdFx0bW9kZVJhbmRvbWl6ZUNhcmRzOiB0aGlzLmN1cnJlbnRTZXNzaW9uLm1vZGVSYW5kb21pemVDYXJkcyxcblx0XHRcdG1vZGVSYW5kb21pemVDYXJkc1NlZWQ6IHRoaXMuY3VycmVudFNlc3Npb24ubW9kZVJhbmRvbWl6ZUNhcmRzU2VlZCxcblx0XHRcdG1vZGVSZXZlcnNlU2lkZXM6IHRoaXMuY3VycmVudFNlc3Npb24ubW9kZVJldmVyc2VTaWRlcyxcblx0XHRcdHBhcmVudDogdGhpcy5wYXJlbnQsXG5cdFx0XHRwcmV2aWV3TW9kZTogdGhpcy5wcmV2aWV3TW9kZSxcblx0XHRcdHJlc291cmNlOiB0aGlzLnJlc291cmNlLFxuXHRcdFx0cmVzdW1lOiBvcHRpb25zICYmIG9wdGlvbnMucmVzdW1lLFxuXHRcdFx0c2VlZHJhbmRvbTogdGhpcy5zZWVkcmFuZG9tLFxuXHRcdH0pKTtcblx0fTtcblxuXHRGbGFzaENhcmRQbGF5ZXIucHJvdG90eXBlLnNob3dWaWV3ID0gZnVuY3Rpb24odmlldylcblx0e1xuXHRcdGlmICh0aGlzLmN1cnJlbnRWaWV3KVxuXHRcdHtcblx0XHRcdHRoaXMuY3VycmVudFZpZXcuaGlkZSgpO1xuXHRcdFx0dGhpcy5jdXJyZW50Vmlldy5kZXN0cm95KCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5jdXJyZW50VmlldyA9IHZpZXc7XG5cblx0XHR0aGlzLmN1cnJlbnRWaWV3LnJlbmRlcigpO1xuXHRcdHRoaXMuY3VycmVudFZpZXcuc2hvdygpO1xuXHR9O1xuXG5cdHJldHVybiBGbGFzaENhcmRQbGF5ZXI7XG59KSk7XG5cbmlmICh0eXBlb2YgZXhwb3J0cyA9PT0gXCJ1bmRlZmluZWRcIilcblx0d2luZG93LmZsYXNoQ2FyZFBsYXllciA9IG5ldyB3aW5kb3cuRmxhc2hDYXJkUGxheWVyKCk7Il19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar $ = require(\"jquery\");\nvar moment = require(\"moment\");\nvar seedrandom = require(\"seedrandom\");\nvar settings = require(\"app-settings\");\n\nvar FlashCardPlayer = require(\"./flashCardPlayer\");\n\nvar Collection = Backbone.Collection.extend({\n\tmodel: Backbone.Model,\n\n\tinitialize: function initialize(opts) {\n\t\tthis.deck = opts.deck;\n\t},\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/flashCards/\" + this.deck;\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"flashcard-previewer\",\n\ttemplate: require(\"./templates/flashcardPreview.nunj\"),\n\n\tui: {\n\t\tbutton: \".footer button\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.button\": \"close\"\n\t},\n\n\tcollectionEvents: {\n\t\tsync: \"start\"\n\t},\n\n\tinitialize: function initialize(opts) {\n\t\tthis.collection = new Collection({ deck: opts.model.id });\n\t\tthis.bindEvents(this.collection, this.collectionEvents);\n\n\t\tthis.host = $(opts.host || \"#modals\");\n\t},\n\n\tshow: function show() {\n\t\tvar _this = this;\n\n\t\t$(\".modal-container\", this.host).append(this.render().el);\n\n\t\tif (!this.model.get(\"title\")) {\n\t\t\t// Fetch the resource model first\n\t\t\tthis.xhr = this.model.fetch({\n\t\t\t\tsuccess: function success() {\n\t\t\t\t\t_this.xhr = _this.collection.fetch();\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tthis.xhr = this.collection.fetch();\n\t},\n\n\tstart: function start() {\n\t\tthis.xhr = null;\n\t\t// Replace the content with the markup the flashcard player expects\n\t\t$(\".body\", this.$el).html(require(\"../content/templates/flashCards/playerContainer.nunj\").render());\n\n\t\t// Fetch the cards\n\t\tthis.flashCardPlayer = new FlashCardPlayer({\n\t\t\t$: $,\n\t\t\tmoment: moment,\n\t\t\tparent: $(\".body\", this.$el),\n\t\t\tseedrandom: seedrandom\n\t\t});\n\n\t\tvar flashCardDeck = this.model.toJSON();\n\t\tvar flashCards = { flashCards: this.collection.map(function (x) {\n\t\t\t\treturn x.toJSON();\n\t\t\t}) };\n\n\t\tthis.flashCardPlayer.start(flashCardDeck, flashCards, { sessions: [] }, { previewMode: true });\n\t},\n\n\tonRender: function onRender() {\n\t\t// Show the modal background\n\t\t$(\".modal-element\", this.host).removeClass(\"hide\");\n\t\t$(\"body\").addClass(\"hide-overflow\");\n\t},\n\n\tonDestroy: function onDestroy() {\n\t\tif (this.xhr) this.xhr.abort();\n\n\t\t// Hide the modal background\n\t\t$(\".modal-element\", this.host).addClass(\"hide\");\n\t\t$(\"body\").removeClass(\"hide-overflow\");\n\t},\n\n\tclose: function close() {\n\t\tthis.destroy();\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZsYXNoY2FyZFByZXZpZXcuanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwiJCIsIm1vbWVudCIsInNlZWRyYW5kb20iLCJzZXR0aW5ncyIsIkZsYXNoQ2FyZFBsYXllciIsIkNvbGxlY3Rpb24iLCJleHRlbmQiLCJtb2RlbCIsIk1vZGVsIiwiaW5pdGlhbGl6ZSIsIm9wdHMiLCJkZWNrIiwidXJsIiwidXJsUm9vdCIsIm1vZHVsZSIsImV4cG9ydHMiLCJNYXJpb25ldHRlIiwiVmlldyIsInRhZ05hbWUiLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsInVpIiwiYnV0dG9uIiwiZXZlbnRzIiwiY29sbGVjdGlvbkV2ZW50cyIsInN5bmMiLCJjb2xsZWN0aW9uIiwiaWQiLCJiaW5kRXZlbnRzIiwiaG9zdCIsInNob3ciLCJhcHBlbmQiLCJyZW5kZXIiLCJlbCIsImdldCIsInhociIsImZldGNoIiwic3VjY2VzcyIsInN0YXJ0IiwiJGVsIiwiaHRtbCIsImZsYXNoQ2FyZFBsYXllciIsInBhcmVudCIsImZsYXNoQ2FyZERlY2siLCJ0b0pTT04iLCJmbGFzaENhcmRzIiwibWFwIiwieCIsInNlc3Npb25zIiwicHJldmlld01vZGUiLCJvblJlbmRlciIsInJlbW92ZUNsYXNzIiwiYWRkQ2xhc3MiLCJvbkRlc3Ryb3kiLCJhYm9ydCIsImNsb3NlIiwiZGVzdHJveSJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUMsSUFBSUQsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNRSxTQUFTRixRQUFRLFFBQVIsQ0FBZjtBQUNBLElBQU1HLGFBQWFILFFBQVEsWUFBUixDQUFuQjtBQUNBLElBQU1JLFdBQVdKLFFBQVEsY0FBUixDQUFqQjs7QUFFQSxJQUFNSyxrQkFBa0JMLFFBQVEsbUJBQVIsQ0FBeEI7O0FBRUEsSUFBTU0sYUFBYVAsU0FBU08sVUFBVCxDQUFvQkMsTUFBcEIsQ0FBMkI7QUFDN0ND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QVc7QUFDckIsTUFBSSxLQUFLbEIsR0FBVCxFQUNDLEtBQUtBLEdBQUwsQ0FBU21CLEtBQVQ7O0FBRUQ7QUFDQXRELElBQUUsZ0JBQUYsRUFBb0IsS0FBSzZCLElBQXpCLEVBQStCdUIsUUFBL0IsQ0FBd0MsTUFBeEM7QUFDQXBELElBQUUsTUFBRixFQUFVbUQsV0FBVixDQUFzQixlQUF0QjtBQUNBLEVBeEUrQzs7QUEwRWhESSxRQUFPLGlCQUFXO0FBQ2pCLE9BQUtDLE9BQUw7QUFDQTtBQTVFK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoiZmxhc2hjYXJkUHJldmlldy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbmNvbnN0IG1vbWVudCA9IHJlcXVpcmUoXCJtb21lbnRcIik7XG5jb25zdCBzZWVkcmFuZG9tID0gcmVxdWlyZShcInNlZWRyYW5kb21cIik7XG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IEZsYXNoQ2FyZFBsYXllciA9IHJlcXVpcmUoXCIuL2ZsYXNoQ2FyZFBsYXllclwiKTtcblxuY29uc3QgQ29sbGVjdGlvbiA9IEJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IEJhY2tib25lLk1vZGVsLFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdHMpIHtcblx0XHR0aGlzLmRlY2sgPSBvcHRzLmRlY2s7XG5cdH0sXG5cblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gYCR7c2V0dGluZ3MudXJsUm9vdH0vYXBpLzEuMC9mbGFzaENhcmRzLyR7dGhpcy5kZWNrfWA7XG5cdH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogXCJkaXZcIixcblx0Y2xhc3NOYW1lOiBcImZsYXNoY2FyZC1wcmV2aWV3ZXJcIixcblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9mbGFzaGNhcmRQcmV2aWV3Lm51bmpcIiksXG5cblx0dWk6IHtcblx0XHRidXR0b246IFwiLmZvb3RlciBidXR0b25cIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5idXR0b25cIjogXCJjbG9zZVwiLFxuXHR9LFxuXG5cdGNvbGxlY3Rpb25FdmVudHM6IHtcblx0XHRzeW5jOiBcInN0YXJ0XCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0cykge1xuXHRcdHRoaXMuY29sbGVjdGlvbiA9IG5ldyBDb2xsZWN0aW9uKHsgZGVjazogb3B0cy5tb2RlbC5pZCB9KTtcblx0XHR0aGlzLmJpbmRFdmVudHModGhpcy5jb2xsZWN0aW9uLCB0aGlzLmNvbGxlY3Rpb25FdmVudHMpO1xuXG5cdFx0dGhpcy5ob3N0ID0gJChvcHRzLmhvc3QgfHwgXCIjbW9kYWxzXCIpO1xuXHR9LFxuXG5cdHNob3c6IGZ1bmN0aW9uKCkge1xuXHRcdCQoXCIubW9kYWwtY29udGFpbmVyXCIsIHRoaXMuaG9zdCkuYXBwZW5kKHRoaXMucmVuZGVyKCkuZWwpO1xuXG5cdFx0aWYgKCF0aGlzLm1vZGVsLmdldChcInRpdGxlXCIpKSB7XG5cdFx0XHQvLyBGZXRjaCB0aGUgcmVzb3VyY2UgbW9kZWwgZmlyc3Rcblx0XHRcdHRoaXMueGhyID0gdGhpcy5tb2RlbC5mZXRjaCh7XG5cdFx0XHRcdHN1Y2Nlc3M6ICgpID0+IHtcblx0XHRcdFx0XHR0aGlzLnhociA9IHRoaXMuY29sbGVjdGlvbi5mZXRjaCgpO1xuXHRcdFx0XHR9LFxuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy54aHIgPSB0aGlzLmNvbGxlY3Rpb24uZmV0Y2goKTtcblx0fSxcblxuXHRzdGFydDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy54aHIgPSBudWxsO1xuXHRcdC8vIFJlcGxhY2UgdGhlIGNvbnRlbnQgd2l0aCB0aGUgbWFya3VwIHRoZSBmbGFzaGNhcmQgcGxheWVyIGV4cGVjdHNcblx0XHQkKFwiLmJvZHlcIiwgdGhpcy4kZWwpLmh0bWwocmVxdWlyZShcIi4uL2NvbnRlbnQvdGVtcGxhdGVzL2ZsYXNoQ2FyZHMvcGxheWVyQ29udGFpbmVyLm51bmpcIikucmVuZGVyKCkpO1xuXG5cdFx0Ly8gRmV0Y2ggdGhlIGNhcmRzXG5cdFx0dGhpcy5mbGFzaENhcmRQbGF5ZXIgPSBuZXcgRmxhc2hDYXJkUGxheWVyKHtcblx0XHRcdCQ6ICQsXG5cdFx0XHRtb21lbnQ6IG1vbWVudCxcblx0XHRcdHBhcmVudDogJChcIi5ib2R5XCIsIHRoaXMuJGVsKSxcblx0XHRcdHNlZWRyYW5kb206IHNlZWRyYW5kb20sXG5cdFx0fSk7XG5cblx0XHRjb25zdCBmbGFzaENhcmREZWNrID0gdGhpcy5tb2RlbC50b0pTT04oKTtcblx0XHRjb25zdCBmbGFzaENhcmRzID0geyBmbGFzaENhcmRzOiB0aGlzLmNvbGxlY3Rpb24ubWFwKHggPT4geC50b0pTT04oKSkgfTtcblxuXHRcdHRoaXMuZmxhc2hDYXJkUGxheWVyLnN0YXJ0KGZsYXNoQ2FyZERlY2ssIGZsYXNoQ2FyZHMsIHsgc2Vzc2lvbnM6IFtdIH0sIHsgcHJldmlld01vZGU6IHRydWUgfSk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIFNob3cgdGhlIG1vZGFsIGJhY2tncm91bmRcblx0XHQkKFwiLm1vZGFsLWVsZW1lbnRcIiwgdGhpcy5ob3N0KS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0JChcImJvZHlcIikuYWRkQ2xhc3MoXCJoaWRlLW92ZXJmbG93XCIpO1xuXHR9LFxuXG5cdG9uRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMueGhyKVxuXHRcdFx0dGhpcy54aHIuYWJvcnQoKTtcblxuXHRcdC8vIEhpZGUgdGhlIG1vZGFsIGJhY2tncm91bmRcblx0XHQkKFwiLm1vZGFsLWVsZW1lbnRcIiwgdGhpcy5ob3N0KS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0JChcImJvZHlcIikucmVtb3ZlQ2xhc3MoXCJoaWRlLW92ZXJmbG93XCIpO1xuXHR9LFxuXG5cdGNsb3NlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmRlc3Ryb3koKTtcblx0fSxcbn0pOyJdfQ==",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\n\nvar settings = require(\"app-settings\");\n\nvar gradeList = require(\"../../../config/grades.json\");\n\n// Options:\n// lexical: set to true to return lexicographically sortable values\n// value:   set to true to return a value instead of an array\nmodule.exports = {\n\tcodeToHumanValue: function codeToHumanValue(grade, options) {\n\t\tvar result = [];\n\t\tvar grades = _.flatten([grade]);\n\n\t\t_.each(settings.gradeList, function (descriptors) {\n\t\t\t_.each(descriptors, function (descriptor) {\n\t\t\t\tif (_.includes(grades, descriptor.value)) {\n\t\t\t\t\tif (options && options.value) result = descriptor.value;else result.push(options && options.lexical && descriptor.lexical ? descriptor.lexical : descriptor.name);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\treturn options && options.value ? result : result.join(\", \");\n\t},\n\n\tcodeToString: function codeToString(code) {\n\t\tvar result = code;\n\n\t\tif (_.isNumber(code)) {\n\t\t\tresult = _.reduce(gradeList, function (acc, descriptors) {\n\t\t\t\tvar descriptor = _.find(descriptors, function (d) {\n\t\t\t\t\treturn d.alt === acc;\n\t\t\t\t});\n\t\t\t\treturn descriptor ? descriptor.value : acc;\n\t\t\t}, code);\n\t\t}\n\n\t\treturn result;\n\t}\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImdyYWRlTWFwLmpzIl0sIm5hbWVzIjpbIl8iLCJyZXF1aXJlIiwic2V0dGluZ3MiLCJncmFkZUxpc3QiLCJtb2R1bGUiLCJleHBvcnRzIiwiY29kZVRvSHVtYW5WYWx1ZSIsImdyYWRlIiwib3B0aW9ucyIsInJlc3VsdCIsImdyYWRlcyIsImZsYXR0ZW4iLCJlYWNoIiwiZGVzY3JpcHRvcnMiLCJpbmNsdWRlcyIsImRlc2NyaXB0b3IiLCJ2YWx1ZSIsInB1c2giLCJsZXhpY2FsIiwibmFtZSIsImpvaW4iLCJjb2RlVG9TdHJpbmciLCJjb2RlIiwiaXNOdW1iZXIiLCJyZWR1Y2UiLCJhY2MiLCJmaW5kIiwiZCIsImFsdCJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsSUFBSUMsUUFBUSxRQUFSLENBQVY7O0FBRUEsSUFBTUMsV0FBV0QsUUFBUSxjQUFSLENBQWpCOztBQUVBLElBQU1FLFlBQVlGLFFBQVEsNkJBQVIsQ0FBbEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0FHLE9BQU9DLE9BQVAsR0FBaUI7QUFDaEJDLG1CQUFrQiwwQkFBU0MsS0FBVCxFQUFnQkMsT0FBaEIsRUFBeUI7QUFDMUMsTUFBSUMsU0FBUyxFQUFiO0FBQ0EsTUFBTUMsU0FBU1YsRUFBRVcsT0FBRixDQUFVLENBQUNKLEtBQUQsQ0FBVixDQUFmOztBQUVBUCxJQUFFWSxJQUFGLENBQU9WLFNBQVNDLFNBQWhCLEVBQTJCLHVCQUFlO0FBQ3pDSCxLQUFFWSxJQUFGLENBQU9DLFdBQVAsRUFBb0Isc0JBQWM7QUFDakMsUUFBSWIsRUFBRWMsUUFBRixDQUFXSixNQUFYLEVBQW1CSyxXQUFXQyxLQUE5QixDQUFKLEVBQTBDO0FBQ3pDLFNBQUlSLFdBQVdBLFFBQVFRLEtBQXZCLEVBQ0NQLFNBQVNNLFdBQVdDLEtBQXBCLENBREQsS0FHQ1AsT0FBT1EsSUFBUCxDQUFZVCxXQUFXQSxRQUFRVSxPQUFuQixJQUE4QkgsV0FBV0csT0FBekMsR0FBbURILFdBQVdHLE9BQTlELEdBQXdFSCxXQUFXSSxJQUEvRjtBQUNEO0FBQ0QsSUFQRDtBQVFBLEdBVEQ7O0FBV0EsU0FBT1gsV0FBV0EsUUFBUVEsS0FBbkIsR0FBMkJQLE1BQTNCLEdBQW9DQSxPQUFPVyxJQUFQLENBQVksSUFBWixDQUEzQztBQUNBLEVBakJlOztBQW1CaEJDLGVBQWMsc0JBQVNDLElBQVQsRUFBZTtBQUM1QixNQUFJYixTQUFTYSxJQUFiOztBQUVBLE1BQUl0QixFQUFFdUIsUUFBRixDQUFXRCxJQUFYLENBQUosRUFBc0I7QUFDckJiLFlBQVNULEVBQUV3QixNQUFGLENBQVNyQixTQUFULEVBQW9CLFVBQUNzQixHQUFELEVBQU1aLFdBQU4sRUFBc0I7QUFDbEQsUUFBTUUsYUFBYWYsRUFBRTBCLElBQUYsQ0FBT2IsV0FBUCxFQUFvQjtBQUFBLFlBQUtjLEVBQUVDLEdBQUYsS0FBVUgsR0FBZjtBQUFBLEtBQXBCLENBQW5CO0FBQ0EsV0FBT1YsYUFBYUEsV0FBV0MsS0FBeEIsR0FBZ0NTLEdBQXZDO0FBQ0EsSUFIUSxFQUdOSCxJQUhNLENBQVQ7QUFJQTs7QUFFRCxTQUFPYixNQUFQO0FBQ0E7QUE5QmUsQ0FBakIiLCJmaWxlIjoiZ3JhZGVNYXAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IGdyYWRlTGlzdCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb25maWcvZ3JhZGVzLmpzb25cIik7XG5cbi8vIE9wdGlvbnM6XG4vLyBsZXhpY2FsOiBzZXQgdG8gdHJ1ZSB0byByZXR1cm4gbGV4aWNvZ3JhcGhpY2FsbHkgc29ydGFibGUgdmFsdWVzXG4vLyB2YWx1ZTogICBzZXQgdG8gdHJ1ZSB0byByZXR1cm4gYSB2YWx1ZSBpbnN0ZWFkIG9mIGFuIGFycmF5XG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0Y29kZVRvSHVtYW5WYWx1ZTogZnVuY3Rpb24oZ3JhZGUsIG9wdGlvbnMpIHtcblx0XHRsZXQgcmVzdWx0ID0gW107XG5cdFx0Y29uc3QgZ3JhZGVzID0gXy5mbGF0dGVuKFtncmFkZV0pO1xuXG5cdFx0Xy5lYWNoKHNldHRpbmdzLmdyYWRlTGlzdCwgZGVzY3JpcHRvcnMgPT4ge1xuXHRcdFx0Xy5lYWNoKGRlc2NyaXB0b3JzLCBkZXNjcmlwdG9yID0+IHtcblx0XHRcdFx0aWYgKF8uaW5jbHVkZXMoZ3JhZGVzLCBkZXNjcmlwdG9yLnZhbHVlKSkge1xuXHRcdFx0XHRcdGlmIChvcHRpb25zICYmIG9wdGlvbnMudmFsdWUpXG5cdFx0XHRcdFx0XHRyZXN1bHQgPSBkZXNjcmlwdG9yLnZhbHVlO1xuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdHJlc3VsdC5wdXNoKG9wdGlvbnMgJiYgb3B0aW9ucy5sZXhpY2FsICYmIGRlc2NyaXB0b3IubGV4aWNhbCA/IGRlc2NyaXB0b3IubGV4aWNhbCA6IGRlc2NyaXB0b3IubmFtZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIG9wdGlvbnMgJiYgb3B0aW9ucy52YWx1ZSA/IHJlc3VsdCA6IHJlc3VsdC5qb2luKFwiLCBcIik7XG5cdH0sXG5cblx0Y29kZVRvU3RyaW5nOiBmdW5jdGlvbihjb2RlKSB7XG5cdFx0bGV0IHJlc3VsdCA9IGNvZGU7XG5cblx0XHRpZiAoXy5pc051bWJlcihjb2RlKSkge1xuXHRcdFx0cmVzdWx0ID0gXy5yZWR1Y2UoZ3JhZGVMaXN0LCAoYWNjLCBkZXNjcmlwdG9ycykgPT4ge1xuXHRcdFx0XHRjb25zdCBkZXNjcmlwdG9yID0gXy5maW5kKGRlc2NyaXB0b3JzLCBkID0+IGQuYWx0ID09PSBhY2MpO1xuXHRcdFx0XHRyZXR1cm4gZGVzY3JpcHRvciA/IGRlc2NyaXB0b3IudmFsdWUgOiBhY2M7XG5cdFx0XHR9LCBjb2RlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9LFxufTtcbiJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar Backgrid = require(\"backgrid\");\nrequire(\"backgrid.moment-cell\");\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar tippy = require(\"tippy.js\").default;\nrequire(\"backgrid-paginator\");\nvar FilterManager = require(\"./filterManager\");\n\nvar defaultModel = Backbone.Model.extend({ defaults: {} });\n\nvar Grid = function Grid(opts) {\n\t_.extend(this, Backbone.Events);\n\n\topts.model = opts.model || defaultModel;\n\topts.url = opts.url;\n\topts.columns = opts.columns || [];\n\n\tif (opts.collection instanceof Backbone.PageableCollection) throw new Error(\"Must pass a plain Backbone collection to Grid constructor\");\n\n\tthis.rawCollection = opts.collection;\n\n\tvar TCol = Backbone.PageableCollection.extend({\n\t\tmodel: opts.collection.model,\n\t\turl: opts.collection.url,\n\n\t\tstate: {\n\t\t\tpageSize: opts.pageSize || 25\n\t\t},\n\t\tmode: \"client\"\n\t});\n\n\tthis.collection = new TCol([]);\n\n\tthis.opts = opts;\n\n\tif (opts.counter) this.listenTo(this.collection, \"sync reset add remove\", this.updateCounter.bind(this));\n\n\tif (opts.paging) opts.paging.element.append(this.paging().render().el);\n\n\tthis.regenerate();\n\n\tif (opts.el) opts.el.append(this.grid.render().el);\n\n\tif (!opts.noLoad) this.rawCollection.fetch({ reset: true });else if (opts.collection.length) this.collection.fullCollection.reset(opts.collection.models);\n};\n\nexports = module.exports = Grid;\n\nGrid.prototype.updateCounter = function () {\n\tif (!this.collection.state.totalRecords) return this.opts.counter.element.text(\"No data found\");\n\n\tvar pageStart = (this.collection.state.currentPage - 1) * this.collection.state.pageSize + 1;\n\tvar pageEnd = this.collection.state.currentPage * this.collection.state.pageSize;\n\tif (pageEnd > this.collection.state.totalRecords) pageEnd = this.collection.state.totalRecords;\n\n\tif (_.isFunction(this.opts.counter.template)) return this.opts.counter.element.text(this.opts.counter.template(this.collection));\n\n\tthis.opts.counter.element.text(this.opts.counter.template.replace(/\\$start/, pageStart).replace(/\\$end/, pageEnd).replace(/\\$total/, this.collection.state.totalRecords).toLocaleString());\n};\n\nGrid.ButtonCell = function (options) {\n\treturn Backgrid.Cell.extend({\n\t\ttemplate: _.template(\"<button type=\\\"button\\\" class=\\\"button small\\\"><%=text%></button>\"),\n\t\tevents: {\n\t\t\t\"click button\": \"clicked\"\n\t\t},\n\t\tclicked: function clicked(e) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\n\t\t\tthis.trigger(\"buttoncell:clicked\", options.id, this.model);\n\t\t},\n\t\trender: function render() {\n\t\t\tthis.el.innerHTML = _.isFunction(options.text) ? options.text.call(this.model) : this.template({ text: options.text });\n\t\t\tthis.delegateEvents();\n\t\t\treturn this;\n\t\t}\n\t});\n};\n\nGrid.HTMLCell = Backgrid.Cell.extend({\n\trender: function render() {\n\t\tthis.el.innerHTML = this.model.get(this.column.get(\"name\"));\n\n\t\ttippy($(\"span\", this.el).get(0), {\n\t\t\ttheme: \"black\",\n\t\t\tplacement: \"bottom\",\n\t\t\tdelay: 500,\n\t\t\tcontent: $(\"span\", this.el).attr(\"title\")\n\t\t});\n\n\t\treturn this;\n\t}\n});\n\nGrid.SizeCell = Backgrid.Cell.extend({\n\trender: function render() {\n\t\tif (!this.model.get(this.column.get(\"name\")) || _.includes([\"text\", \"url\"], this.model.get(\"category\"))) {\n\t\t\tthis.el.innerHTML = \"\";\n\t\t\treturn this;\n\t\t}\n\n\t\tvar num = parseFloat(this.model.get(this.column.get(\"name\")));\n\n\t\tvar units = [\"B\", \"KB\", \"MB\", \"GB\"];\n\t\twhile (num > 1000) {\n\t\t\tunits.shift();\n\t\t\tnum /= 1000;\n\t\t}\n\n\t\tthis.el.innerHTML = num.toFixed(2) + \" \" + units[0];\n\n\t\ttippy($(\"span\", this.el).get(0), {\n\t\t\ttheme: \"black\",\n\t\t\tplacement: \"bottom\",\n\t\t\tdelay: 500,\n\t\t\tcontent: $(\"span\", this.el).attr(\"title\")\n\t\t});\n\n\t\treturn this;\n\t}\n});\n\nGrid.VersionCell = Backgrid.Cell.extend({\n\trender: function render() {\n\t\tvar val = this.model.get(this.column.get(\"name\"));\n\t\tif (!val) return this;\n\n\t\tvar final = Math.floor(val);\n\t\tif (val % 1) final += \".\" + (val % 1).toFixed(4).substring(2).replace(/^[^1-9]+(.+?$)/, \"$1\");\n\n\t\tthis.el.innerHTML = final;\n\n\t\treturn this;\n\t}\n});\n\nGrid.BooleanIconCell = Backgrid.Cell.extend({\n\ttemplate: _.template(\"<a class='fal <%=icon%>' style='color: <%=colour%>'></a>\"),\n\n\trender: function render() {\n\t\tvar data = {};\n\t\tif (this.model.get(this.column.get(\"name\"))) data = { icon: \"fa-check\", colour: this.falseColour || \"green\" };else data = { icon: \"fa-times\", colour: this.falseColour || \"red\" };\n\n\t\tthis.el.innerHTML = this.template(data);\n\t\tthis.el.style.textAlign = \"center\";\n\t\treturn this;\n\t}\n});\n\nGrid.MomentCell = Backgrid.Extension.MomentCell;\n\nGrid.ToolbarCell = function (options) {\n\tvar _generateTooltips = function _generateTooltips(model) {\n\t\tvar html = _.map(options.tooltips, function (item) {\n\t\t\tif (!item.filter || item.filter(model)) return \"<a title='\" + item.title + \"' data-name='\" + (item.data || item.title).toLowerCase().replace(/\\s/g, \"\") + \"' class='fal \" + item.icon + \"'></a>\";\n\t\t\treturn \"\";\n\t\t});\n\t\treturn html.join(\"\");\n\t};\n\n\treturn Backgrid.Cell.extend({\n\t\ttemplate: _.template(\"<div class='toolbar-host fal fa-cog hide'>&nbsp;<span class='fal fa-caret-down hide' style='font-size:0.8rem'/></div>\"),\n\t\ttemplateClean: _.template(\"<div>&nbsp;</div>\"),\n\t\tevents: {\n\t\t\ttoolbarItemClick: \"clicked\",\n\t\t\tmouseover: \"generateTooltips\"\n\t\t},\n\t\tclicked: function clicked(evt, item) {\n\t\t\tthis.model.trigger(\"toolbar:click:\" + $(item).data(\"name\"), this.model);\n\t\t},\n\t\tgenerateTooltips: function generateTooltips() {\n\t\t\tif (this.generated) return;\n\t\t\tthis.generated = true;\n\t\t\tvar tt = _generateTooltips(this.model);\n\t\t\tif (!tt) {\n\t\t\t\t$(\"span\", this.el).remove();\n\t\t\t\t$(\"div\", this.el).removeClass(\"toolbar-host fal fa-cog\");\n\t\t\t\treturn this;\n\t\t\t}\n\n\t\t\t$(\"div.toolbar-host\", this.el).toolbar({\n\t\t\t\thideOnClick: true,\n\t\t\t\tcontent: $(\"<div>\" + tt + \"</div>\"),\n\t\t\t\tposition: \"bottom\",\n\t\t\t\tevent: \"click\",\n\t\t\t\tstyle: \"dark\",\n\t\t\t\tanimation: \"standard\"\n\t\t\t});\n\t\t},\n\t\trender: function render() {\n\t\t\tvar _this = this;\n\n\t\t\tif (options.tooltips && _.some(options.tooltips, function (t) {\n\t\t\t\treturn !t.filter || t.filter(_this.model);\n\t\t\t})) this.el.innerHTML = this.template({});else this.el.innerHTML = this.templateClean({});\n\n\t\t\tif (this.generated) $(\".hide\", this.el).removeClass(\"hide\");\n\t\t\tthis.generated = false;\n\t\t\tthis.delegateEvents();\n\t\t\treturn this;\n\t\t}\n\t});\n};\n\nGrid.stringSort = function (model, col) {\n\treturn model && model.has(col) ? (model.get(col) || \"\").toLowerCase() : \"\";\n};\n\nGrid.prototype.regenerate = function () {\n\tvar _this2 = this;\n\n\tvar selectedRow = void 0;\n\n\t// eslint-disable-next-line consistent-this\n\tvar grid = this;\n\n\tvar row = Backgrid.Row.extend({\n\t\thighlightColor: \"#DBF2FF\",\n\n\t\tevents: {\n\t\t\tclick: \"click\",\n\t\t\tmouseover: \"rowFocused\",\n\t\t\tmouseout: \"rowLostFocus\"\n\t\t},\n\t\tinitialize: function initialize() {\n\t\t\tfor (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n\t\t\t\targs[_key] = arguments[_key];\n\t\t\t}\n\n\t\t\tBackgrid.Row.prototype.initialize.apply(this, args);\n\n\t\t\tif (grid.opts.clickable) $(this.el).addClass(\"row-clickable\"); //.attr(\"title\", \"Click to edit item\");\n\n\t\t\tthis.listenTo(this.model, \"grid:render\", this.render.bind(this));\n\t\t\tthis.listenTo(this.model, \"grid:colour\", this.setColour.bind(this));\n\t\t},\n\t\trender: function render() {\n\t\t\tfor (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n\t\t\t\targs[_key2] = arguments[_key2];\n\t\t\t}\n\n\t\t\tBackgrid.Row.prototype.render.apply(this, args);\n\n\t\t\tthis.setColour();\n\n\t\t\tthis.model.trigger(\"grid:rendered\");\n\t\t\tif (selectedRow === this) $(\".toolbar-host, .fa-caret-down\", this.el).removeClass(\"hide\");\n\n\t\t\treturn this;\n\t\t},\n\t\trowFocused: function rowFocused() {\n\t\t\tif (selectedRow !== this) {\n\t\t\t\t$(\".toolbar-host, .fa-caret-down\", this.el).removeClass(\"hide\");\n\t\t\t\tif (!grid.opts.noHighlight) this.el.style.backgroundColor = this.highlightColor;\n\t\t\t}\n\t\t},\n\t\trowLostFocus: function rowLostFocus() {\n\t\t\tif (selectedRow !== this) {\n\t\t\t\t$(\".toolbar-host, .fa-caret-down\", this.el).addClass(\"hide\");\n\t\t\t\tif (!grid.opts.noHighlight) this.el.style.backgroundColor = \"\";\n\t\t\t}\n\t\t},\n\t\tsetColour: function setColour(col) {\n\t\t\tif (col) this.model.colour = col;else if (col === null) this.model.colour = \"\";\n\t\t\tthis.el.style.backgroundColor = this.model.colour;\n\t\t},\n\t\tclick: function click(evt) {\n\t\t\tif (selectedRow) selectedRow.unselect();\n\n\t\t\t// eslint-disable-next-line consistent-this\n\t\t\tselectedRow = this;\n\n\t\t\t$(\".toolbar-host, .fa-caret-down\", this.el).removeClass(\"hide\");\n\t\t\tif (!grid.opts.noHighlight) this.el.style.backgroundColor = this.highlightColor;\n\n\t\t\tif (evt.target.nodeName !== \"TD\") return;\n\n\t\t\tif (grid.opts.clickable) grid.trigger(\"row:clicked\", this.model);\n\t\t},\n\n\t\tunselect: function unselect() {\n\t\t\t$(\".toolbar-host, .fa-caret-down\", this.el).addClass(\"hide\");\n\t\t\tif (!grid.opts.noHighlight) this.el.style.backgroundColor = \"\";\n\t\t}\n\t});\n\n\tthis.grid = new Backgrid.Grid({\n\t\trow: row,\n\t\tcolumns: this.opts.columns,\n\t\tcollection: this.collection,\n\t\temptyText: function emptyText() {\n\t\t\tif (_this2.collection.fetching) return \"<span class='spinner-icon spinner-small'></span> Fetching data...\";\n\t\t\treturn \"There is nothing to show\";\n\t\t}\n\t});\n\n\tthis.listenTo(this.grid, \"before:destroy\", this.destroy.bind(this));\n\n\tthis.listenTo(this.collection, \"reset\", function () {\n\t\t_this2.collection.fetching = false;\n\t\t_this2.trigger(\"reset\");\n\t});\n\n\tthis.listenTo(this.rawCollection, \"request\", function (item) {\n\t\tif (\"attributes\" in item)\n\t\t\t// Single-item fetch, don't re-render\n\t\t\treturn;\n\n\t\t_this2.collection.fetching = true;\n\t\tif (!_this2.collection.length) _this2.grid.body.render();\n\t});\n\n\tthis.listenTo(this.rawCollection, \"sync\", function (item, resp) {\n\t\tif (resp.ok)\n\t\t\t// Single-item fetch, don't re-render the grid\n\t\t\treturn;\n\n\t\t_this2.collection.fetching = false;\n\t\tif (!_this2.collection.length) _this2.grid.body.render();\n\t});\n\n\tthis.listenTo(this.collection, \"remove\", function (m, c, o) {\n\t\t_this2.rawCollection.remove(m, o);\n\t\t_this2.collection.fetching = false;\n\t\tif (!_this2.collection.length) _this2.grid.body.render();\n\t});\n\n\tthis.listenTo(this.collection.fullCollection, \"add\", function () {\n\t\t//this.rawCollection.add(m, o);\n\t\t//this.collection.fullCollection.add(m, o);\n\t\t_this2.collection.fetching = false;\n\t\tif (!_this2.collection.length) _this2.grid.body.render();else if (_this2.collection.state.currentPage < _this2.collection.state.totalPages) _this2.collection.getPage(_this2.collection.state.totalPages);\n\t});\n\n\t/*this.listenTo(this.collection, \"add\", function(m, c, o) {\n \t//this.rawCollection.add(m, o);\n \t//this.collection.fullCollection.add(m, o);\n \tself.collection.fetching = false;\n \tif(!self.collection.length)\n \t\tself.grid.body.render();\n \telse if(self.collection.state.currentPage < self.collection.state.totalPages)\n \t\tself.collection.getPage(self.collection.state.totalPages);\n });*/\n};\n\nGrid.prototype.destroy = function (arg1) {\n\tif (this.filter && this.filter.destroy) this.filter.destroy();\n\n\tif (!arg1 && this.grid) this.grid.remove();\n};\n\nGrid.prototype.paging = function () {\n\tvar paginator = new Backgrid.Extension.Paginator({\n\t\tcollection: this.collection\n\t});\n\n\treturn paginator;\n};\n\nGrid.prototype.filter = function (opts) {\n\tthis.filter = new FilterManager({\n\t\traw: this.rawCollection,\n\t\tpaged: this.collection,\n\t\tfilterContainer: opts.filterContainer,\n\t\tfilters: opts.filters || [],\n\t\tdefaultFilters: opts.defaultFilters || []\n\t});\n\n\treturn this.filter;\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImdyaWQuanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwiQmFja2dyaWQiLCIkIiwiXyIsInRpcHB5IiwiZGVmYXVsdCIsIkZpbHRlck1hbmFnZXIiLCJkZWZhdWx0TW9kZWwiLCJNb2RlbCIsImV4dGVuZCIsImRlZmF1bHRzIiwiR3JpZCIsIm9wdHMiLCJFdmVudHMiLCJtb2RlbCIsInVybCIsImNvbHVtbnMiLCJjb2xsZWN0aW9uIiwiUGFnZWFibGVDb2xsZWN0aW9uIiwiRXJyb3IiLCJyYXdDb2xsZWN0aW9uIiwiVENvbCIsInN0YXRlIiwicGFnZVNpemUiLCJtb2RlIiwiY291bnRlciIsImxpc3RlblRvIiwidXBkYXRlQ291bnRlciIsImJpbmQiLCJwYWdpbmciLCJlbGVtZW50IiwiYXBwZW5kIiwicmVuZGVyIiwiZWwiLCJyZWdlbmVyYXRlIiwiZ3JpZCIsIm5vTG9hZCIsImZldGNoIiwicmVzZXQiLCJsZW5ndGgiLCJmdWxsQ29sbGVjdGlvbiIsIm1vZGVscyIsImV4cG9ydHMiLCJtb2R1bGUiLCJwcm90b3R5cGUiLCJ0b3RhbFJlY29yZHMiLCJ0ZXh0IiwicGFnZVN0YXJ0IiwiY3VycmVudFBhZ2UiLCJwYWdlRW5kIiwiaXNGdW5jdGlvbiIsInRlbXBsYXRlIiwicmVwbGFjZSIsInRvTG9jYWxlU3RyaW5nIiwiQnV0dG9uQ2VsbCIsIm9wdGlvbnMiLCJDZWxsIiwiZXZlbnRzIiwiY2xpY2tlZCIsImUiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsInRyaWdnZXIiLCJpZCIsImlubmVySFRNTCIsImNhbGwiLCJkZWxlZ2F0ZUV2ZW50cyIsIkhUTUxDZWxsIiwiZ2V0IiwiY29sdW1uIiwidGhlbWUiLCJwbGFjZW1lbnQiLCJkZWxheSIsImNvbnRlbnQiLCJhdHRyIiwiU2l6ZUNlbGwiLCJpbmNsdWRlcyIsIm51bSIsInBhcnNlRmxvYXQiLCJ1bml0cyIsInNoaWZ0IiwidG9GaXhlZCIsIlZlcnNpb25DZWxsIiwidmFsIiwiZmluYWwiLCJNYXRoIiwiZmxvb3IiLCJzdWJzdHJpbmciLCJCb29sZWFuSWNvbkNlbGwiLCJkYXRhIiwiaWNvbiIsImNvbG91ciIsImZhbHNlQ29sb3VyIiwic3R5bGUiLCJ0ZXh0QWxpZ24iLCJNb21lbnRDZWxsIiwiRXh0ZW5zaW9uIiwiVG9vbGJhckNlbGwiLCJnZW5lcmF0ZVRvb2x0aXBzIiwiaHRtbCIsIm1hcCIsInRvb2x0aXBzIiwiaXRlbSIsImZpbHRlciIsInRpdGxlIiwidG9Mb3dlckNhc2UiLCJqb2luIiwidGVtcGxhdGVDbGVhbiIsInRvb2xiYXJJdGVtQ2xpY2siLCJtb3VzZW92ZXIiLCJldnQiLCJnZW5lcmF0ZWQiLCJ0dCIsInJlbW92ZSIsInJlbW92ZUNsYXNzIiwidG9vbGJhciIsImhpZGVPbkNsaWNrIiwicG9zaXRpb24iLCJldmVudCIsImFuaW1hdGlvbiIsInNvbWUiLCJ0Iiwic3RyaW5nU29ydCIsImNvbCIsImhhcyIsInNlbGVjdGVkUm93Iiwicm93IiwiUm93IiwiaGlnaGxpZ2h0Q29sb3IiLCJjbGljayIsIm1vdXNlb3V0IiwiaW5pdGlhbGl6ZSIsImFyZ3MiLCJhcHBseSIsImNsaWNrYWJsZSIsImFkZENsYXNzIiwic2V0Q29sb3VyIiwicm93Rm9jdXNlZCIsIm5vSGlnaGxpZ2h0IiwiYmFja2dyb3VuZENvbG9yIiwicm93TG9zdEZvY3VzIiwidW5zZWxlY3QiLCJ0YXJnZXQiLCJub2RlTmFtZSIsImVtcHR5VGV4dCIsImZldGNoaW5nIiwiZGVzdHJveSIsImJvZHkiLCJyZXNwIiwib2siLCJtIiwiYyIsIm8iLCJ0b3RhbFBhZ2VzIiwiZ2V0UGFnZSIsImFyZzEiLCJwYWdpbmF0b3IiLCJQYWdpbmF0b3IiLCJyYXciLCJwYWdlZCIsImZpbHRlckNvbnRhaW5lciIsImZpbHRlcnMiLCJkZWZhdWx0RmlsdGVycyJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUMsV0FBV0QsUUFBUSxVQUFSLENBQWpC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RGlDLEVBQWpDLENBQWxCOztBQUlBLFFBQU8ySSxTQUFQO0FBQ0EsQ0FORDs7QUFRQWpKLEtBQUtpQyxTQUFMLENBQWUyRCxNQUFmLEdBQXdCLFVBQVMzRixJQUFULEVBQWU7QUFDdEMsTUFBSzJGLE1BQUwsR0FBYyxJQUFJakcsYUFBSixDQUFrQjtBQUMvQndKLE9BQUssS0FBSzFJLGFBRHFCO0FBRS9CMkksU0FBTyxLQUFLOUksVUFGbUI7QUFHL0IrSSxtQkFBaUJwSixLQUFLb0osZUFIUztBQUkvQkMsV0FBU3JKLEtBQUtxSixPQUFMLElBQWdCLEVBSk07QUFLL0JDLGtCQUFnQnRKLEtBQUtzSixjQUFMLElBQXVCO0FBTFIsRUFBbEIsQ0FBZDs7QUFRQSxRQUFPLEtBQUszRCxNQUFaO0FBQ0EsQ0FWRCIsImZpbGUiOiJncmlkLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IEJhY2tncmlkID0gcmVxdWlyZShcImJhY2tncmlkXCIpO1xucmVxdWlyZShcImJhY2tncmlkLm1vbWVudC1jZWxsXCIpO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IHRpcHB5ID0gcmVxdWlyZShcInRpcHB5LmpzXCIpLmRlZmF1bHQ7XG5yZXF1aXJlKFwiYmFja2dyaWQtcGFnaW5hdG9yXCIpO1xuY29uc3QgRmlsdGVyTWFuYWdlciA9IHJlcXVpcmUoXCIuL2ZpbHRlck1hbmFnZXJcIik7XG5cbmNvbnN0IGRlZmF1bHRNb2RlbCA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7IGRlZmF1bHRzOiB7fSB9KTtcblxuY29uc3QgR3JpZCA9IGZ1bmN0aW9uKG9wdHMpIHtcblx0Xy5leHRlbmQodGhpcywgQmFja2JvbmUuRXZlbnRzKTtcblxuXHRvcHRzLm1vZGVsID0gb3B0cy5tb2RlbCB8fCBkZWZhdWx0TW9kZWw7XG5cdG9wdHMudXJsID0gb3B0cy51cmw7XG5cdG9wdHMuY29sdW1ucyA9IG9wdHMuY29sdW1ucyB8fCBbXTtcblxuXHRpZiAob3B0cy5jb2xsZWN0aW9uIGluc3RhbmNlb2YgQmFja2JvbmUuUGFnZWFibGVDb2xsZWN0aW9uKVxuXHRcdHRocm93IG5ldyBFcnJvcihcIk11c3QgcGFzcyBhIHBsYWluIEJhY2tib25lIGNvbGxlY3Rpb24gdG8gR3JpZCBjb25zdHJ1Y3RvclwiKTtcblxuXHR0aGlzLnJhd0NvbGxlY3Rpb24gPSBvcHRzLmNvbGxlY3Rpb247XG5cblx0Y29uc3QgVENvbCA9IEJhY2tib25lLlBhZ2VhYmxlQ29sbGVjdGlvbi5leHRlbmQoe1xuXHRcdG1vZGVsOiBvcHRzLmNvbGxlY3Rpb24ubW9kZWwsXG5cdFx0dXJsOiBvcHRzLmNvbGxlY3Rpb24udXJsLFxuXG5cdFx0c3RhdGU6IHtcblx0XHRcdHBhZ2VTaXplOiBvcHRzLnBhZ2VTaXplIHx8IDI1LFxuXHRcdH0sXG5cdFx0bW9kZTogXCJjbGllbnRcIixcblx0fSk7XG5cblx0dGhpcy5jb2xsZWN0aW9uID0gbmV3IFRDb2woW10pO1xuXG5cdHRoaXMub3B0cyA9IG9wdHM7XG5cblx0aWYgKG9wdHMuY291bnRlcilcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuY29sbGVjdGlvbiwgXCJzeW5jIHJlc2V0IGFkZCByZW1vdmVcIiwgdGhpcy51cGRhdGVDb3VudGVyLmJpbmQodGhpcykpO1xuXG5cdGlmIChvcHRzLnBhZ2luZylcblx0XHRvcHRzLnBhZ2luZy5lbGVtZW50LmFwcGVuZCh0aGlzLnBhZ2luZygpLnJlbmRlcigpLmVsKTtcblxuXHR0aGlzLnJlZ2VuZXJhdGUoKTtcblxuXHRpZiAob3B0cy5lbClcblx0XHRvcHRzLmVsLmFwcGVuZCh0aGlzLmdyaWQucmVuZGVyKCkuZWwpO1xuXG5cdGlmICghb3B0cy5ub0xvYWQpXG5cdFx0dGhpcy5yYXdDb2xsZWN0aW9uLmZldGNoKHsgcmVzZXQ6IHRydWUgfSk7XG5cdGVsc2UgaWYgKG9wdHMuY29sbGVjdGlvbi5sZW5ndGgpXG5cdFx0dGhpcy5jb2xsZWN0aW9uLmZ1bGxDb2xsZWN0aW9uLnJlc2V0KG9wdHMuY29sbGVjdGlvbi5tb2RlbHMpO1xufTtcblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gR3JpZDtcblxuR3JpZC5wcm90b3R5cGUudXBkYXRlQ291bnRlciA9IGZ1bmN0aW9uKCkge1xuXHRpZiAoIXRoaXMuY29sbGVjdGlvbi5zdGF0ZS50b3RhbFJlY29yZHMpXG5cdFx0cmV0dXJuIHRoaXMub3B0cy5jb3VudGVyLmVsZW1lbnQudGV4dChcIk5vIGRhdGEgZm91bmRcIik7XG5cblx0Y29uc3QgcGFnZVN0YXJ0ID0gKCgodGhpcy5jb2xsZWN0aW9uLnN0YXRlLmN1cnJlbnRQYWdlIC0gMSkgKiB0aGlzLmNvbGxlY3Rpb24uc3RhdGUucGFnZVNpemUpICsgMSk7XG5cdGxldCBwYWdlRW5kID0gKCh0aGlzLmNvbGxlY3Rpb24uc3RhdGUuY3VycmVudFBhZ2UpICogdGhpcy5jb2xsZWN0aW9uLnN0YXRlLnBhZ2VTaXplKTtcblx0aWYgKHBhZ2VFbmQgPiB0aGlzLmNvbGxlY3Rpb24uc3RhdGUudG90YWxSZWNvcmRzKVxuXHRcdHBhZ2VFbmQgPSB0aGlzLmNvbGxlY3Rpb24uc3RhdGUudG90YWxSZWNvcmRzO1xuXG5cdGlmIChfLmlzRnVuY3Rpb24odGhpcy5vcHRzLmNvdW50ZXIudGVtcGxhdGUpKVxuXHRcdHJldHVybiB0aGlzLm9wdHMuY291bnRlci5lbGVtZW50LnRleHQodGhpcy5vcHRzLmNvdW50ZXIudGVtcGxhdGUodGhpcy5jb2xsZWN0aW9uKSk7XG5cblx0dGhpcy5vcHRzLmNvdW50ZXIuZWxlbWVudC50ZXh0KHRoaXMub3B0cy5jb3VudGVyLnRlbXBsYXRlXG5cdFx0LnJlcGxhY2UoL1xcJHN0YXJ0LywgcGFnZVN0YXJ0KVxuXHRcdC5yZXBsYWNlKC9cXCRlbmQvLCBwYWdlRW5kKVxuXHRcdC5yZXBsYWNlKC9cXCR0b3RhbC8sIHRoaXMuY29sbGVjdGlvbi5zdGF0ZS50b3RhbFJlY29yZHMpLnRvTG9jYWxlU3RyaW5nKCkpO1xufTtcblxuR3JpZC5CdXR0b25DZWxsID0gZnVuY3Rpb24ob3B0aW9ucykge1xuXHRyZXR1cm4gQmFja2dyaWQuQ2VsbC5leHRlbmQoe1xuXHRcdHRlbXBsYXRlOiBfLnRlbXBsYXRlKFwiPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidXR0b24gc21hbGxcXFwiPjwlPXRleHQlPjwvYnV0dG9uPlwiKSxcblx0XHRldmVudHM6IHtcblx0XHRcdFwiY2xpY2sgYnV0dG9uXCI6IFwiY2xpY2tlZFwiLFxuXHRcdH0sXG5cdFx0Y2xpY2tlZDogZnVuY3Rpb24oZSkge1xuXHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdFx0dGhpcy50cmlnZ2VyKFwiYnV0dG9uY2VsbDpjbGlja2VkXCIsIG9wdGlvbnMuaWQsIHRoaXMubW9kZWwpO1xuXHRcdH0sXG5cdFx0cmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRcdHRoaXMuZWwuaW5uZXJIVE1MID0gXy5pc0Z1bmN0aW9uKG9wdGlvbnMudGV4dCkgPyBvcHRpb25zLnRleHQuY2FsbCh0aGlzLm1vZGVsKSA6IHRoaXMudGVtcGxhdGUoeyB0ZXh0OiBvcHRpb25zLnRleHQgfSk7XG5cdFx0XHR0aGlzLmRlbGVnYXRlRXZlbnRzKCk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9LFxuXHR9KTtcbn07XG5cbkdyaWQuSFRNTENlbGwgPSBCYWNrZ3JpZC5DZWxsLmV4dGVuZCh7XG5cdHJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5lbC5pbm5lckhUTUwgPSB0aGlzLm1vZGVsLmdldCh0aGlzLmNvbHVtbi5nZXQoXCJuYW1lXCIpKTtcblxuXHRcdHRpcHB5KCQoXCJzcGFuXCIsIHRoaXMuZWwpLmdldCgwKSwge1xuXHRcdFx0dGhlbWU6IFwiYmxhY2tcIixcblx0XHRcdHBsYWNlbWVudDogXCJib3R0b21cIixcblx0XHRcdGRlbGF5OiA1MDAsXG5cdFx0XHRjb250ZW50OiAkKFwic3BhblwiLCB0aGlzLmVsKS5hdHRyKFwidGl0bGVcIiksXG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcbn0pO1xuXG5HcmlkLlNpemVDZWxsID0gQmFja2dyaWQuQ2VsbC5leHRlbmQoe1xuXHRyZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghdGhpcy5tb2RlbC5nZXQodGhpcy5jb2x1bW4uZ2V0KFwibmFtZVwiKSkgfHwgXy5pbmNsdWRlcyhbXCJ0ZXh0XCIsIFwidXJsXCJdLCB0aGlzLm1vZGVsLmdldChcImNhdGVnb3J5XCIpKSkge1xuXHRcdFx0dGhpcy5lbC5pbm5lckhUTUwgPSBcIlwiO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0bGV0IG51bSA9IHBhcnNlRmxvYXQodGhpcy5tb2RlbC5nZXQodGhpcy5jb2x1bW4uZ2V0KFwibmFtZVwiKSkpO1xuXG5cdFx0Y29uc3QgdW5pdHMgPSBbXCJCXCIsIFwiS0JcIiwgXCJNQlwiLCBcIkdCXCJdO1xuXHRcdHdoaWxlKG51bSA+IDEwMDApIHtcblx0XHRcdHVuaXRzLnNoaWZ0KCk7XG5cdFx0XHRudW0gLz0gMTAwMDtcblx0XHR9XG5cblx0XHR0aGlzLmVsLmlubmVySFRNTCA9IG51bS50b0ZpeGVkKDIpICsgXCIgXCIgKyB1bml0c1swXTtcblxuXHRcdHRpcHB5KCQoXCJzcGFuXCIsIHRoaXMuZWwpLmdldCgwKSwge1xuXHRcdFx0dGhlbWU6IFwiYmxhY2tcIixcblx0XHRcdHBsYWNlbWVudDogXCJib3R0b21cIixcblx0XHRcdGRlbGF5OiA1MDAsXG5cdFx0XHRjb250ZW50OiAkKFwic3BhblwiLCB0aGlzLmVsKS5hdHRyKFwidGl0bGVcIiksXG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcbn0pO1xuXG5HcmlkLlZlcnNpb25DZWxsID0gQmFja2dyaWQuQ2VsbC5leHRlbmQoe1xuXHRyZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHZhbCA9IHRoaXMubW9kZWwuZ2V0KHRoaXMuY29sdW1uLmdldChcIm5hbWVcIikpO1xuXHRcdGlmICghdmFsKVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRsZXQgZmluYWwgPSBNYXRoLmZsb29yKHZhbCk7XG5cdFx0aWYgKHZhbCAlIDEpXG5cdFx0XHRmaW5hbCArPSBcIi5cIiArICh2YWwgJSAxKS50b0ZpeGVkKDQpLnN1YnN0cmluZygyKS5yZXBsYWNlKC9eW14xLTldKyguKz8kKS8sIFwiJDFcIik7XG5cblx0XHR0aGlzLmVsLmlubmVySFRNTCA9IGZpbmFsO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG59KTtcblxuR3JpZC5Cb29sZWFuSWNvbkNlbGwgPSBCYWNrZ3JpZC5DZWxsLmV4dGVuZCh7XG5cdHRlbXBsYXRlOiBfLnRlbXBsYXRlKFwiPGEgY2xhc3M9J2ZhbCA8JT1pY29uJT4nIHN0eWxlPSdjb2xvcjogPCU9Y29sb3VyJT4nPjwvYT5cIiksXG5cblx0cmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRsZXQgZGF0YSA9IHt9O1xuXHRcdGlmICh0aGlzLm1vZGVsLmdldCh0aGlzLmNvbHVtbi5nZXQoXCJuYW1lXCIpKSlcblx0XHRcdGRhdGEgPSB7IGljb246IFwiZmEtY2hlY2tcIiwgY29sb3VyOiB0aGlzLmZhbHNlQ29sb3VyIHx8IFwiZ3JlZW5cIiB9O1xuXHRcdGVsc2Vcblx0XHRcdGRhdGEgPSB7IGljb246IFwiZmEtdGltZXNcIiwgY29sb3VyOiB0aGlzLmZhbHNlQ29sb3VyIHx8IFwicmVkXCIgfTtcblxuXHRcdHRoaXMuZWwuaW5uZXJIVE1MID0gdGhpcy50ZW1wbGF0ZShkYXRhKTtcblx0XHR0aGlzLmVsLnN0eWxlLnRleHRBbGlnbiA9IFwiY2VudGVyXCI7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG59KTtcblxuR3JpZC5Nb21lbnRDZWxsID0gQmFja2dyaWQuRXh0ZW5zaW9uLk1vbWVudENlbGw7XG5cbkdyaWQuVG9vbGJhckNlbGwgPSBmdW5jdGlvbihvcHRpb25zKSB7XG5cdGNvbnN0IGdlbmVyYXRlVG9vbHRpcHMgPSBmdW5jdGlvbihtb2RlbCkge1xuXHRcdGNvbnN0IGh0bWwgPSBfLm1hcChvcHRpb25zLnRvb2x0aXBzLCBpdGVtID0+IHtcblx0XHRcdGlmICghaXRlbS5maWx0ZXIgfHwgaXRlbS5maWx0ZXIobW9kZWwpKVxuXHRcdFx0XHRyZXR1cm4gXCI8YSB0aXRsZT0nXCIgKyBpdGVtLnRpdGxlICsgXCInIGRhdGEtbmFtZT0nXCIgKyAoaXRlbS5kYXRhIHx8IGl0ZW0udGl0bGUpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzL2csIFwiXCIpICsgXCInIGNsYXNzPSdmYWwgXCIgKyBpdGVtLmljb24gKyBcIic+PC9hPlwiO1xuXHRcdFx0cmV0dXJuIFwiXCI7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIGh0bWwuam9pbihcIlwiKTtcblx0fTtcblxuXHRyZXR1cm4gQmFja2dyaWQuQ2VsbC5leHRlbmQoe1xuXHRcdHRlbXBsYXRlOiBfLnRlbXBsYXRlKFwiPGRpdiBjbGFzcz0ndG9vbGJhci1ob3N0IGZhbCBmYS1jb2cgaGlkZSc+Jm5ic3A7PHNwYW4gY2xhc3M9J2ZhbCBmYS1jYXJldC1kb3duIGhpZGUnIHN0eWxlPSdmb250LXNpemU6MC44cmVtJy8+PC9kaXY+XCIpLFxuXHRcdHRlbXBsYXRlQ2xlYW46IF8udGVtcGxhdGUoXCI8ZGl2PiZuYnNwOzwvZGl2PlwiKSxcblx0XHRldmVudHM6IHtcblx0XHRcdHRvb2xiYXJJdGVtQ2xpY2s6IFwiY2xpY2tlZFwiLFxuXHRcdFx0bW91c2VvdmVyOiBcImdlbmVyYXRlVG9vbHRpcHNcIixcblx0XHR9LFxuXHRcdGNsaWNrZWQ6IGZ1bmN0aW9uKGV2dCwgaXRlbSkge1xuXHRcdFx0dGhpcy5tb2RlbC50cmlnZ2VyKFwidG9vbGJhcjpjbGljazpcIiArICQoaXRlbSkuZGF0YShcIm5hbWVcIiksIHRoaXMubW9kZWwpO1xuXHRcdH0sXG5cdFx0Z2VuZXJhdGVUb29sdGlwczogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAodGhpcy5nZW5lcmF0ZWQpXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdHRoaXMuZ2VuZXJhdGVkID0gdHJ1ZTtcblx0XHRcdGNvbnN0IHR0ID0gZ2VuZXJhdGVUb29sdGlwcyh0aGlzLm1vZGVsKTtcblx0XHRcdGlmICghdHQpIHtcblx0XHRcdFx0JChcInNwYW5cIiwgdGhpcy5lbCkucmVtb3ZlKCk7XG5cdFx0XHRcdCQoXCJkaXZcIiwgdGhpcy5lbCkucmVtb3ZlQ2xhc3MoXCJ0b29sYmFyLWhvc3QgZmFsIGZhLWNvZ1wiKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9XG5cblx0XHRcdCQoXCJkaXYudG9vbGJhci1ob3N0XCIsIHRoaXMuZWwpLnRvb2xiYXIoe1xuXHRcdFx0XHRoaWRlT25DbGljazogdHJ1ZSxcblx0XHRcdFx0Y29udGVudDogJChcIjxkaXY+XCIgKyB0dCArIFwiPC9kaXY+XCIpLFxuXHRcdFx0XHRwb3NpdGlvbjogXCJib3R0b21cIixcblx0XHRcdFx0ZXZlbnQ6IFwiY2xpY2tcIixcblx0XHRcdFx0c3R5bGU6IFwiZGFya1wiLFxuXHRcdFx0XHRhbmltYXRpb246IFwic3RhbmRhcmRcIixcblx0XHRcdH0pO1xuXHRcdH0sXG5cdFx0cmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRcdGlmIChvcHRpb25zLnRvb2x0aXBzICYmIF8uc29tZShvcHRpb25zLnRvb2x0aXBzLCB0ID0+ICF0LmZpbHRlciB8fCB0LmZpbHRlcih0aGlzLm1vZGVsKSkpXG5cdFx0XHRcdHRoaXMuZWwuaW5uZXJIVE1MID0gdGhpcy50ZW1wbGF0ZSh7fSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMuZWwuaW5uZXJIVE1MID0gdGhpcy50ZW1wbGF0ZUNsZWFuKHt9KTtcblxuXHRcdFx0aWYgKHRoaXMuZ2VuZXJhdGVkKVxuXHRcdFx0XHQkKFwiLmhpZGVcIiwgdGhpcy5lbCkucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0dGhpcy5nZW5lcmF0ZWQgPSBmYWxzZTtcblx0XHRcdHRoaXMuZGVsZWdhdGVFdmVudHMoKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH0sXG5cdH0pO1xufTtcblxuR3JpZC5zdHJpbmdTb3J0ID0gZnVuY3Rpb24obW9kZWwsIGNvbCkge1xuXHRyZXR1cm4gbW9kZWwgJiYgbW9kZWwuaGFzKGNvbCkgPyAobW9kZWwuZ2V0KGNvbCkgfHwgXCJcIikudG9Mb3dlckNhc2UoKSA6IFwiXCI7XG59O1xuXG5HcmlkLnByb3RvdHlwZS5yZWdlbmVyYXRlID0gZnVuY3Rpb24oKSB7XG5cdGxldCBzZWxlY3RlZFJvdztcblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC10aGlzXG5cdGNvbnN0IGdyaWQgPSB0aGlzO1xuXG5cdGNvbnN0IHJvdyA9IEJhY2tncmlkLlJvdy5leHRlbmQoe1xuXHRcdGhpZ2hsaWdodENvbG9yOiBcIiNEQkYyRkZcIixcblxuXHRcdGV2ZW50czoge1xuXHRcdFx0Y2xpY2s6IFwiY2xpY2tcIixcblx0XHRcdG1vdXNlb3ZlcjogXCJyb3dGb2N1c2VkXCIsXG5cdFx0XHRtb3VzZW91dDogXCJyb3dMb3N0Rm9jdXNcIixcblx0XHR9LFxuXHRcdGluaXRpYWxpemU6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcblx0XHRcdEJhY2tncmlkLlJvdy5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLCBhcmdzKTtcblxuXHRcdFx0aWYgKGdyaWQub3B0cy5jbGlja2FibGUpXG5cdFx0XHRcdCQodGhpcy5lbCkuYWRkQ2xhc3MoXCJyb3ctY2xpY2thYmxlXCIpOy8vLmF0dHIoXCJ0aXRsZVwiLCBcIkNsaWNrIHRvIGVkaXQgaXRlbVwiKTtcblxuXHRcdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCBcImdyaWQ6cmVuZGVyXCIsIHRoaXMucmVuZGVyLmJpbmQodGhpcykpO1xuXHRcdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCBcImdyaWQ6Y29sb3VyXCIsIHRoaXMuc2V0Q29sb3VyLmJpbmQodGhpcykpO1xuXHRcdH0sXG5cdFx0cmVuZGVyOiBmdW5jdGlvbiguLi5hcmdzKSB7XG5cdFx0XHRCYWNrZ3JpZC5Sb3cucHJvdG90eXBlLnJlbmRlci5hcHBseSh0aGlzLCBhcmdzKTtcblxuXHRcdFx0dGhpcy5zZXRDb2xvdXIoKTtcblxuXHRcdFx0dGhpcy5tb2RlbC50cmlnZ2VyKFwiZ3JpZDpyZW5kZXJlZFwiKTtcblx0XHRcdGlmIChzZWxlY3RlZFJvdyA9PT0gdGhpcylcblx0XHRcdFx0JChcIi50b29sYmFyLWhvc3QsIC5mYS1jYXJldC1kb3duXCIsIHRoaXMuZWwpLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fSxcblx0XHRyb3dGb2N1c2VkOiBmdW5jdGlvbigpIHtcblx0XHRcdGlmIChzZWxlY3RlZFJvdyAhPT0gdGhpcykge1xuXHRcdFx0XHQkKFwiLnRvb2xiYXItaG9zdCwgLmZhLWNhcmV0LWRvd25cIiwgdGhpcy5lbCkucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0XHRpZiAoIWdyaWQub3B0cy5ub0hpZ2hsaWdodClcblx0XHRcdFx0XHR0aGlzLmVsLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuaGlnaGxpZ2h0Q29sb3I7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRyb3dMb3N0Rm9jdXM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKHNlbGVjdGVkUm93ICE9PSB0aGlzKSB7XG5cdFx0XHRcdCQoXCIudG9vbGJhci1ob3N0LCAuZmEtY2FyZXQtZG93blwiLCB0aGlzLmVsKS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHRcdGlmICghZ3JpZC5vcHRzLm5vSGlnaGxpZ2h0KVxuXHRcdFx0XHRcdHRoaXMuZWwuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gXCJcIjtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHNldENvbG91cjogZnVuY3Rpb24oY29sKSB7XG5cdFx0XHRpZiAoY29sKVxuXHRcdFx0XHR0aGlzLm1vZGVsLmNvbG91ciA9IGNvbDtcblx0XHRcdGVsc2UgaWYgKGNvbCA9PT0gbnVsbClcblx0XHRcdFx0dGhpcy5tb2RlbC5jb2xvdXIgPSBcIlwiO1xuXHRcdFx0dGhpcy5lbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLm1vZGVsLmNvbG91cjtcblx0XHR9LFxuXHRcdGNsaWNrOiBmdW5jdGlvbihldnQpIHtcblx0XHRcdGlmIChzZWxlY3RlZFJvdylcblx0XHRcdFx0c2VsZWN0ZWRSb3cudW5zZWxlY3QoKTtcblxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtdGhpc1xuXHRcdFx0c2VsZWN0ZWRSb3cgPSB0aGlzO1xuXG5cdFx0XHQkKFwiLnRvb2xiYXItaG9zdCwgLmZhLWNhcmV0LWRvd25cIiwgdGhpcy5lbCkucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0aWYgKCFncmlkLm9wdHMubm9IaWdobGlnaHQpXG5cdFx0XHRcdHRoaXMuZWwuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdGhpcy5oaWdobGlnaHRDb2xvcjtcblxuXHRcdFx0aWYgKGV2dC50YXJnZXQubm9kZU5hbWUgIT09IFwiVERcIilcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRpZiAoZ3JpZC5vcHRzLmNsaWNrYWJsZSlcblx0XHRcdFx0Z3JpZC50cmlnZ2VyKFwicm93OmNsaWNrZWRcIiwgdGhpcy5tb2RlbCk7XG5cdFx0fSxcblxuXHRcdHVuc2VsZWN0OiBmdW5jdGlvbigpIHtcblx0XHRcdCQoXCIudG9vbGJhci1ob3N0LCAuZmEtY2FyZXQtZG93blwiLCB0aGlzLmVsKS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHRpZiAoIWdyaWQub3B0cy5ub0hpZ2hsaWdodClcblx0XHRcdFx0dGhpcy5lbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBcIlwiO1xuXHRcdH0sXG5cdH0pO1xuXG5cdHRoaXMuZ3JpZCA9IG5ldyBCYWNrZ3JpZC5HcmlkKHtcblx0XHRyb3c6IHJvdyxcblx0XHRjb2x1bW5zOiB0aGlzLm9wdHMuY29sdW1ucyxcblx0XHRjb2xsZWN0aW9uOiB0aGlzLmNvbGxlY3Rpb24sXG5cdFx0ZW1wdHlUZXh0OiAoKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5jb2xsZWN0aW9uLmZldGNoaW5nKVxuXHRcdFx0XHRyZXR1cm4gXCI8c3BhbiBjbGFzcz0nc3Bpbm5lci1pY29uIHNwaW5uZXItc21hbGwnPjwvc3Bhbj4gRmV0Y2hpbmcgZGF0YS4uLlwiO1xuXHRcdFx0cmV0dXJuIFwiVGhlcmUgaXMgbm90aGluZyB0byBzaG93XCI7XG5cdFx0fSxcblx0fSk7XG5cblx0dGhpcy5saXN0ZW5Ubyh0aGlzLmdyaWQsIFwiYmVmb3JlOmRlc3Ryb3lcIiwgdGhpcy5kZXN0cm95LmJpbmQodGhpcykpO1xuXG5cdHRoaXMubGlzdGVuVG8odGhpcy5jb2xsZWN0aW9uLCBcInJlc2V0XCIsICgpID0+IHtcblx0XHR0aGlzLmNvbGxlY3Rpb24uZmV0Y2hpbmcgPSBmYWxzZTtcblx0XHR0aGlzLnRyaWdnZXIoXCJyZXNldFwiKTtcblx0fSk7XG5cblx0dGhpcy5saXN0ZW5Ubyh0aGlzLnJhd0NvbGxlY3Rpb24sIFwicmVxdWVzdFwiLCBpdGVtID0+IHtcblx0XHRpZiAoXCJhdHRyaWJ1dGVzXCIgaW4gaXRlbSlcblx0XHRcdC8vIFNpbmdsZS1pdGVtIGZldGNoLCBkb24ndCByZS1yZW5kZXJcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuY29sbGVjdGlvbi5mZXRjaGluZyA9IHRydWU7XG5cdFx0aWYgKCF0aGlzLmNvbGxlY3Rpb24ubGVuZ3RoKVxuXHRcdFx0dGhpcy5ncmlkLmJvZHkucmVuZGVyKCk7XG5cdH0pO1xuXG5cdHRoaXMubGlzdGVuVG8odGhpcy5yYXdDb2xsZWN0aW9uLCBcInN5bmNcIiwgKGl0ZW0sIHJlc3ApID0+IHtcblx0XHRpZiAocmVzcC5vaylcblx0XHRcdC8vIFNpbmdsZS1pdGVtIGZldGNoLCBkb24ndCByZS1yZW5kZXIgdGhlIGdyaWRcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuY29sbGVjdGlvbi5mZXRjaGluZyA9IGZhbHNlO1xuXHRcdGlmICghdGhpcy5jb2xsZWN0aW9uLmxlbmd0aClcblx0XHRcdHRoaXMuZ3JpZC5ib2R5LnJlbmRlcigpO1xuXHR9KTtcblxuXHR0aGlzLmxpc3RlblRvKHRoaXMuY29sbGVjdGlvbiwgXCJyZW1vdmVcIiwgKG0sIGMsIG8pID0+IHtcblx0XHR0aGlzLnJhd0NvbGxlY3Rpb24ucmVtb3ZlKG0sIG8pO1xuXHRcdHRoaXMuY29sbGVjdGlvbi5mZXRjaGluZyA9IGZhbHNlO1xuXHRcdGlmICghdGhpcy5jb2xsZWN0aW9uLmxlbmd0aClcblx0XHRcdHRoaXMuZ3JpZC5ib2R5LnJlbmRlcigpO1xuXHR9KTtcblxuXHR0aGlzLmxpc3RlblRvKHRoaXMuY29sbGVjdGlvbi5mdWxsQ29sbGVjdGlvbiwgXCJhZGRcIiwgKCkgPT4ge1xuXHRcdC8vdGhpcy5yYXdDb2xsZWN0aW9uLmFkZChtLCBvKTtcblx0XHQvL3RoaXMuY29sbGVjdGlvbi5mdWxsQ29sbGVjdGlvbi5hZGQobSwgbyk7XG5cdFx0dGhpcy5jb2xsZWN0aW9uLmZldGNoaW5nID0gZmFsc2U7XG5cdFx0aWYgKCF0aGlzLmNvbGxlY3Rpb24ubGVuZ3RoKVxuXHRcdFx0dGhpcy5ncmlkLmJvZHkucmVuZGVyKCk7XG5cdFx0ZWxzZSBpZiAodGhpcy5jb2xsZWN0aW9uLnN0YXRlLmN1cnJlbnRQYWdlIDwgdGhpcy5jb2xsZWN0aW9uLnN0YXRlLnRvdGFsUGFnZXMpXG5cdFx0XHR0aGlzLmNvbGxlY3Rpb24uZ2V0UGFnZSh0aGlzLmNvbGxlY3Rpb24uc3RhdGUudG90YWxQYWdlcyk7XG5cdH0pO1xuXG5cdC8qdGhpcy5saXN0ZW5Ubyh0aGlzLmNvbGxlY3Rpb24sIFwiYWRkXCIsIGZ1bmN0aW9uKG0sIGMsIG8pIHtcblx0XHQvL3RoaXMucmF3Q29sbGVjdGlvbi5hZGQobSwgbyk7XG5cdFx0Ly90aGlzLmNvbGxlY3Rpb24uZnVsbENvbGxlY3Rpb24uYWRkKG0sIG8pO1xuXHRcdHNlbGYuY29sbGVjdGlvbi5mZXRjaGluZyA9IGZhbHNlO1xuXHRcdGlmKCFzZWxmLmNvbGxlY3Rpb24ubGVuZ3RoKVxuXHRcdFx0c2VsZi5ncmlkLmJvZHkucmVuZGVyKCk7XG5cdFx0ZWxzZSBpZihzZWxmLmNvbGxlY3Rpb24uc3RhdGUuY3VycmVudFBhZ2UgPCBzZWxmLmNvbGxlY3Rpb24uc3RhdGUudG90YWxQYWdlcylcblx0XHRcdHNlbGYuY29sbGVjdGlvbi5nZXRQYWdlKHNlbGYuY29sbGVjdGlvbi5zdGF0ZS50b3RhbFBhZ2VzKTtcblx0fSk7Ki9cbn07XG5cbkdyaWQucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbihhcmcxKSB7XG5cdGlmICh0aGlzLmZpbHRlciAmJiB0aGlzLmZpbHRlci5kZXN0cm95KVxuXHRcdHRoaXMuZmlsdGVyLmRlc3Ryb3koKTtcblxuXHRpZiAoIWFyZzEgJiYgdGhpcy5ncmlkKVxuXHRcdHRoaXMuZ3JpZC5yZW1vdmUoKTtcbn07XG5cbkdyaWQucHJvdG90eXBlLnBhZ2luZyA9IGZ1bmN0aW9uKCkge1xuXHRjb25zdCBwYWdpbmF0b3IgPSBuZXcgQmFja2dyaWQuRXh0ZW5zaW9uLlBhZ2luYXRvcih7XG5cdFx0Y29sbGVjdGlvbjogdGhpcy5jb2xsZWN0aW9uLFxuXHR9KTtcblxuXHRyZXR1cm4gcGFnaW5hdG9yO1xufTtcblxuR3JpZC5wcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24ob3B0cykge1xuXHR0aGlzLmZpbHRlciA9IG5ldyBGaWx0ZXJNYW5hZ2VyKHtcblx0XHRyYXc6IHRoaXMucmF3Q29sbGVjdGlvbixcblx0XHRwYWdlZDogdGhpcy5jb2xsZWN0aW9uLFxuXHRcdGZpbHRlckNvbnRhaW5lcjogb3B0cy5maWx0ZXJDb250YWluZXIsXG5cdFx0ZmlsdGVyczogb3B0cy5maWx0ZXJzIHx8IFtdLFxuXHRcdGRlZmF1bHRGaWx0ZXJzOiBvcHRzLmRlZmF1bHRGaWx0ZXJzIHx8IFtdLFxuXHR9KTtcblxuXHRyZXR1cm4gdGhpcy5maWx0ZXI7XG59OyJdfQ==",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\n\nvar FilterBack = require(\"./filterBack\");\n\nvar Page = new Backbone.Marionette.Application();\n\nPage.Events = {\n\tClick: \"Page.Events.Click\",\n\tLabelMouseOver: \"Page.Events.LabelMouseOver\",\n\tLabelMouseOut: \"Page.Events.LabelMouseOut\",\n\tRowMouseOver: \"Page.Events.RowMouseOver\",\n\tRowMouseOut: \"Page.Events.RowMouseOut\"\n};\n\nvar GridRowModel = Backbone.Model.extend({\n\tdefaults: {}\n});\n\nvar GridValueModel = Backbone.Model.extend({\n\tdefaults: {}\n});\n\nvar ActionView = Backbone.Marionette.View.extend({\n\ttagName: \"a\",\n\n\tclassName: function className() {\n\t\treturn \"fal \" + this.model.get(\"glyph\");\n\t},\n\n\tattributes: function attributes() {\n\t\treturn {\n\t\t\ttitle: this.model.get(\"label\")\n\t\t};\n\t},\n\n\ttemplate: false,\n\n\tevents: {\n\t\tclick: \"onClick\"\n\t},\n\n\tonClick: function onClick() {\n\t\tthis.trigger(\"action\", this.model);\n\t}\n});\n\nvar ActionToolbar = Backbone.Marionette.CollectionView.extend({\n\ttagName: \"div\",\n\n\tclassName: \"grid-back-action-toolbar\",\n\n\tchildView: ActionView,\n\n\tchildViewEvents: {\n\t\taction: function action(actionModel) {\n\t\t\tthis.trigger(\"action\", actionModel);\n\t\t}\n\t}\n});\n\nvar ValueView = Backbone.Marionette.View.extend({\n\ttagName: \"td\",\n\tclassName: \"grid-back-value grid-back-cell\",\n\n\tattributes: function attributes() {\n\t\tvar result = {};\n\n\t\tif (this.model.has(\"minWidth\")) result.style = \"min-width: \" + this.model.get(\"minWidth\");\n\n\t\treturn result;\n\t},\n\n\ttemplate: require(\"./templates/gridBack.nunj\").value,\n\n\tevents: {\n\t\tclick: \"onClick\",\n\t\tmouseover: \"onMouseOver\",\n\t\tmouseout: \"onMouseOut\"\n\t},\n\n\tmodelEvents: {\n\t\tchange: \"onModelChanged\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this = this;\n\n\t\treturn {\n\t\t\thighlightRow: function highlightRow() {\n\t\t\t\treturn _this.HighlightRow;\n\t\t\t},\n\t\t\tisActionCell: function isActionCell() {\n\t\t\t\treturn _this.isActionCell;\n\t\t\t},\n\t\t\tvalue: function value() {\n\t\t\t\treturn _this.value;\n\t\t\t},\n\t\t\tescapeValue: function escapeValue() {\n\t\t\t\treturn _this.model.get(\"column\").escape;\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize() {\n\t\tvar _this2 = this;\n\n\t\tthis.computeCellContent();\n\n\t\tvar highlight = this.model.get(\"highlight\");\n\t\tvar highlightAll = highlight === \"all\";\n\n\t\tthis.HighlightRow = highlight === \"row\" || highlightAll;\n\t\tthis.HighlightColumn = highlight === \"column\" || highlightAll;\n\t\tthis.HighlightSelf = highlight === \"cell\" || highlightAll || this.HighlightRow || this.HighlightColumn;\n\n\t\tif (this.HighlightColumn) {\n\t\t\tthis.listenTo(Page, Page.Events.LabelMouseOver + \":\" + this.model.get(\"column\"), this.highlight.bind(this));\n\t\t\tthis.listenTo(Page, Page.Events.LabelMouseOut + \":\" + this.model.get(\"column\"), this.lowlight.bind(this));\n\t\t}\n\n\t\tthis.on({\n\t\t\tarticulateHighlight: function articulateHighlight() {\n\t\t\t\t_this2.articulateHighlight();\n\t\t\t\t_this2.stickHighlight();\n\t\t\t},\n\t\t\thighlight: this.highlight.bind(this),\n\t\t\tlowlight: this.lowlight.bind(this),\n\t\t\tstickHighlight: this.onStickHighlight.bind(this),\n\t\t\tunstickHighlight: this.onUnstickHighlight.bind(this),\n\t\t\tdeselect: this.onDeselect.bind(this)\n\t\t});\n\t},\n\n\tcomputeCellContent: function computeCellContent() {\n\t\tthis.value = this.model.get(\"value\");\n\n\t\tif (_.isObject(this.value)) {\n\t\t\tthis.isActionCell = Boolean(this.value.actions);\n\t\t\tthis.isClickDisabled = Boolean(this.value.disableClick);\n\n\t\t\tthis.value = this.value.markup || \"[actions]\";\n\t\t}\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this3 = this;\n\n\t\tif (this.isActionCell) {\n\t\t\tthis.ActionToolbar = new ActionToolbar({ collection: this.model.get(\"value\").actions });\n\n\t\t\tthis.listenTo(this.ActionToolbar, \"action\", this.onAction.bind(this));\n\n\t\t\t$(\".grid-back-action-toolbar-button\", this.el).toolbar({\n\t\t\t\tadjustment: 20,\n\t\t\t\tanimation: \"standard\",\n\t\t\t\tcontent: this.ActionToolbar.render().$el,\n\t\t\t\tevent: \"click\",\n\t\t\t\thideOnClick: true,\n\t\t\t\tposition: \"right\",\n\t\t\t\tstyle: \"dark\"\n\t\t\t});\n\n\t\t\t$(\".grid-back-action-toolbar-button\", this.el).on(\"toolbarShown\", function () {\n\t\t\t\t_this3.sinkDeselect = true;\n\t\t\t});\n\t\t}\n\n\t\tif (this.isClickDisabled) this.$el.addClass(\"grid-back-cell-click-disabled\");\n\t},\n\n\tonModelChanged: function onModelChanged() {\n\t\tthis.computeCellContent();\n\n\t\tvar valueContainer = $(\"div\", this.$el);\n\n\t\tvalueContainer.empty();\n\t\tvalueContainer.append(this.value);\n\t},\n\n\tonAction: function onAction(actionModel) {\n\t\tactionModel.get(\"onClick\")(this.model.get(\"model\"));\n\t},\n\n\tonClick: function onClick(event) {\n\t\tevent.stopPropagation();\n\n\t\tif (!this.isClickDisabled) {\n\t\t\tthis.trigger(\"click\");\n\n\t\t\tthis.stickHighlight();\n\n\t\t\tif (this.model.has(\"cellClick\")) this.model.get(\"cellClick\")(this.model.get(\"column\"), this.model.get(\"model\"));\n\t\t}\n\t},\n\n\tonMouseOver: function onMouseOver() {\n\t\tthis.articulateHighlight();\n\t},\n\n\tonMouseOut: function onMouseOut() {\n\t\tif (!this.highlightStuck) this.articulateLowlight();\n\t},\n\n\tarticulateHighlight: function articulateHighlight() {\n\t\tif (this.HighlightRow) {\n\t\t\tthis.trigger(\"highlightRow\");\n\t\t} else if (this.HighlightSelf) {\n\t\t\tthis.highlight();\n\n\t\t\tif (this.model.has(\"cellMouseOver\")) this.model.get(\"cellMouseOver\")(this.model.get(\"column\"), this.model.get(\"model\"));\n\t\t}\n\t},\n\n\tarticulateLowlight: function articulateLowlight() {\n\t\tif (this.HighlightRow) {\n\t\t\tthis.trigger(\"lowlightRow\");\n\t\t} else if (this.HighlightSelf) {\n\t\t\tthis.lowlight();\n\n\t\t\tif (this.model.has(\"cellMouseOut\")) this.model.get(\"cellMouseOut\")(this.model.get(\"column\"), this.model.get(\"model\"));\n\t\t}\n\t},\n\n\thighlight: function highlight() {\n\t\tthis.$el.addClass(\"grid-back-cell-hover\");\n\t},\n\n\tlowlight: function lowlight() {\n\t\tthis.$el.removeClass(\"grid-back-cell-hover\");\n\t},\n\n\tstickHighlight: function stickHighlight() {\n\t\tif (this.model.has(\"stickyHighlight\") && this.model.get(\"stickyHighlight\")) this.trigger(\"stickHighlight\");\n\t},\n\n\tonStickHighlight: function onStickHighlight() {\n\t\tthis.highlightStuck = true;\n\t},\n\n\tonUnstickHighlight: function onUnstickHighlight() {\n\t\tthis.highlightStuck = false;\n\t},\n\n\tonDeselect: function onDeselect() {\n\t\tif (this.sinkDeselect) this.sinkDeselect = false;else if (this.isActionCell) $(\".grid-back-action-toolbar-button\", this.el).toolbar(\"hide\");\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tif (this.isActionCell) {\n\t\t\t$(\".grid-back-action-toolbar-button\", this.el).off(\"toolbarShown\");\n\n\t\t\tif (this.ActionToolbar) this.stopListening(this.ActionToolbar);\n\t\t}\n\n\t\tif (this.HighlightColumn) {\n\t\t\tthis.stopListening(Page);\n\t\t\tthis.stopListening(Page);\n\t\t}\n\n\t\tthis.off(\"articulateHighlight\");\n\t\tthis.off(\"highlight\");\n\t\tthis.off(\"lowlight\");\n\n\t\tthis.off(\"stickHighlight\");\n\t\tthis.off(\"unstickHighlight\");\n\t}\n});\n\n// ----------------------------------------------------------------------------\n\nvar LabelView = Backbone.Marionette.View.extend({\n\ttagName: \"th\",\n\tclassName: \"grid-back-label grid-back-cell\",\n\n\tattributes: function attributes() {\n\t\tvar result = {};\n\n\t\tif (this.model.has(\"minWidth\")) result.style = \"min-width: \" + this.model.get(\"minWidth\");\n\n\t\treturn result;\n\t},\n\n\ttemplate: require(\"./templates/gridBack.nunj\").label,\n\n\tui: {\n\t\tcontrolContainer: \".grid-back-label-control-container\",\n\t\ticonSort: \".icon-sort\"\n\t},\n\n\tevents: {\n\t\tclick: \"onClick\",\n\t\tmouseover: \"onMouseOver\",\n\t\tmouseout: \"onMouseOut\",\n\n\t\t\"click @ui.controlContainer\": \"onControlContainerClick\",\n\t\t\"click @ui.iconSort\": \"onIconSortClick\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this4 = this;\n\n\t\treturn {\n\t\t\tsortable: function sortable() {\n\t\t\t\treturn _this4.isSortable();\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.Highlight = this.model.get(\"highlight\");\n\n\t\tif (this.isSortable()) this.sortMode = \"unsorted\";\n\n\t\tthis.on(\"resetSort\", this.onResetSort.bind(this));\n\t},\n\n\tisSortable: function isSortable() {\n\t\treturn this.model.has(\"sort\") && this.model.get(\"sort\");\n\t},\n\n\tonClick: function onClick() {\n\t\tif (this.model.has(\"columnClick\")) this.model.get(\"columnClick\")(this.model.get(\"column\"));\n\t},\n\n\tonControlContainerClick: function onControlContainerClick(event) {\n\t\tevent.stopPropagation();\n\t},\n\n\tonIconSortClick: function onIconSortClick() {\n\t\tthis.toggleSortMode();\n\t},\n\n\tonMouseOver: function onMouseOver() {\n\t\tif (this.Highlight === \"column\" || this.Highlight === \"all\") {\n\t\t\tthis.$el.addClass(\"grid-back-cell-hover\");\n\t\t\tPage.trigger(Page.Events.LabelMouseOver + \":\" + this.model.get(\"column\"));\n\t\t}\n\t},\n\n\tonMouseOut: function onMouseOut() {\n\t\tif (this.Highlight === \"column\" || this.Highlight === \"all\") {\n\t\t\tthis.$el.removeClass(\"grid-back-cell-hover\");\n\t\t\tPage.trigger(Page.Events.LabelMouseOut + \":\" + this.model.get(\"column\"));\n\t\t}\n\t},\n\n\tonResetSort: function onResetSort() {\n\t\tswitch (this.sortMode) {\n\t\t\tdefault:\n\t\t\tcase \"unsorted\":\n\t\t\t\t// Do nothing\n\t\t\t\tbreak;\n\n\t\t\tcase \"ascending\":\n\t\t\t\tthis.ui.iconSort.removeClass(\"fa-sort-asc\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"descending\":\n\t\t\t\tthis.ui.iconSort.removeClass(\"fa-sort-desc\");\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.ui.iconSort.addClass(\"fa-sort\");\n\t\tthis.sortMode = \"unsorted\";\n\t},\n\n\ttoggleSortMode: function toggleSortMode() {\n\t\tvar criterion = _.isFunction(this.model.get(\"sort\")) ? this.model.get(\"sort\") : this.model.get(\"column\");\n\n\t\tswitch (this.sortMode) {\n\t\t\tcase \"unsorted\":\n\t\t\t\tthis.trigger(\"sort\", \"ascending\", criterion);\n\t\t\t\tthis.ui.iconSort.removeClass(\"fa-sort\");\n\t\t\t\tthis.ui.iconSort.addClass(\"fa-sort-asc\");\n\t\t\t\tthis.sortMode = \"ascending\";\n\t\t\t\tbreak;\n\n\t\t\tcase \"ascending\":\n\t\t\t\tthis.trigger(\"sort\", \"descending\", criterion);\n\t\t\t\tthis.ui.iconSort.removeClass(\"fa-sort-asc\");\n\t\t\t\tthis.ui.iconSort.addClass(\"fa-sort-desc\");\n\t\t\t\tthis.sortMode = \"descending\";\n\t\t\t\tbreak;\n\n\t\t\tcase \"descending\":\n\t\t\t\tthis.trigger(\"sort\", \"default\", criterion);\n\t\t\t\tthis.ui.iconSort.removeClass(\"fa-sort-desc\");\n\t\t\t\tthis.ui.iconSort.addClass(\"fa-sort\");\n\t\t\t\tthis.sortMode = \"unsorted\";\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t// Do nothing\n\t\t\t\tbreak;\n\t\t}\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.off(\"resetSort\");\n\t}\n});\n\n// ----------------------------------------------------------------------------\n\nvar RowView = Backbone.Marionette.CollectionView.extend({\n\ttagName: \"tr\",\n\tclassName: \"grid-back-row\",\n\n\tchildViewEvents: {\n\t\tclick: function click() {\n\t\t\tthis.trigger(\"click\");\n\t\t},\n\n\t\thighlightRow: function highlightRow() {\n\t\t\tthis.children.each(function (childView) {\n\t\t\t\tchildView.trigger(\"highlight\");\n\t\t\t});\n\t\t},\n\n\t\tlowlightRow: function lowlightRow() {\n\t\t\tif (!this.highlightStuck) {\n\t\t\t\tthis.children.each(function (childView) {\n\t\t\t\t\tchildView.trigger(\"lowlight\");\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\tsort: function sort(order, criterion) {\n\t\t\tthis.children.each(function (childView) {\n\t\t\t\t//if (childView !== view)\n\t\t\t\tchildView.trigger(\"resetSort\");\n\t\t\t});\n\n\t\t\tthis.trigger(\"sort\", order, criterion);\n\t\t},\n\n\t\tstickHighlight: function stickHighlight() {\n\t\t\tthis.highlightStuck = true;\n\t\t}\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tvar _this5 = this;\n\n\t\tthis.options = options;\n\t\tthis.Columns = options.columns;\n\n\t\tthis.constructCollection();\n\n\t\tif (!options.header) {\n\t\t\tthis.listenTo(this.model, \"gridBack:refresh\", function () {\n\t\t\t\t_this5.constructCollection();\n\t\t\t\t_this5.render();\n\t\t\t});\n\t\t}\n\n\t\tthis.listenTo(this.model, \"gridBack:highlight\", function () {\n\t\t\t_this5.children.each(function (childView) {\n\t\t\t\tchildView.trigger(\"articulateHighlight\");\n\t\t\t});\n\t\t});\n\n\t\tthis.on(\"deselect\", function () {\n\t\t\t_this5.unstickHighlight();\n\n\t\t\t_this5.children.each(function (childView) {\n\t\t\t\tchildView.trigger(\"deselect\");\n\t\t\t});\n\t\t});\n\t},\n\n\tconstructCollection: function constructCollection() {\n\t\tvar _this6 = this;\n\n\t\tvar unlabelledCounter = 0;\n\n\t\tthis.collection = new Backbone.Collection(_.map(this.Columns, function (column) {\n\t\t\tvar columnName = column.name ? column.name : \"_\" + unlabelledCounter++;\n\n\t\t\tvar valueModel = new GridValueModel({\n\t\t\t\talign: column.align,\n\t\t\t\tcellClick: column.cellClick,\n\t\t\t\tcellMouseOver: column.cellMouseOver,\n\t\t\t\tcellMouseOut: column.cellMouseOut,\n\t\t\t\tcolumnClick: column.columnClick,\n\t\t\t\tcolumn: columnName,\n\t\t\t\thighlight: column.highlight,\n\t\t\t\tminWidth: column.minWidth,\n\t\t\t\tmodel: _this6.model,\n\t\t\t\tsort: column.sort,\n\t\t\t\tstickyHighlight: column.stickyHighlight,\n\t\t\t\tescape: Boolean(column.escape)\n\t\t\t});\n\n\t\t\tvar value = \"\";\n\n\t\t\tif (_this6.model.has(columnName)) value = _this6.model.get(columnName);else if (column.accessor) value = column.accessor(columnName, _this6.model);else if (column.actions) value = { actions: new Backbone.Collection(column.actions) };\n\n\t\t\tvalueModel.set(\"value\", value);\n\n\t\t\tif (!_this6.model.has(columnName) && column.accessor) {\n\t\t\t\t_this6.listenTo(_this6.model, \"change\", function () {\n\t\t\t\t\tvalueModel.set(\"value\", column.accessor(columnName, _this6.model, \"change\"));\n\t\t\t\t});\n\n\t\t\t\t_this6.listenTo(_this6.model, \"request\", function () {\n\t\t\t\t\tvalueModel.set(\"value\", column.accessor(columnName, _this6.model, \"request\"));\n\t\t\t\t});\n\n\t\t\t\t_this6.listenTo(_this6.model, \"sync\", function () {\n\t\t\t\t\tvalueModel.set(\"value\", column.accessor(columnName, _this6.model, \"sync\"));\n\t\t\t\t});\n\n\t\t\t\t_this6.listenTo(_this6.model, \"error\", function () {\n\t\t\t\t\tvalueModel.set(\"value\", column.accessor(columnName, _this6.model, \"error\"));\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn valueModel;\n\t\t}));\n\t},\n\n\tunstickHighlight: function unstickHighlight() {\n\t\tif (this.highlightStuck) {\n\t\t\tthis.highlightStuck = false;\n\n\t\t\tthis.children.each(function (childView) {\n\t\t\t\tchildView.trigger(\"lowlight\");\n\t\t\t});\n\t\t}\n\n\t\tthis.children.each(function (childView) {\n\t\t\tchildView.trigger(\"unstickHighlight\");\n\t\t});\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(this.model);\n\t\tthis.off(\"unstickHighlight\");\n\t}\n});\n\n// ----------------------------------------------------------------------------\n\nvar BodyView = Backbone.Marionette.CollectionView.extend({\n\ttagName: \"tbody\",\n\tclassName: \"grid-back-table-body\",\n\n\tchildView: RowView,\n\n\tchildViewOptions: function childViewOptions() {\n\t\treturn {\n\t\t\tchildView: ValueView,\n\t\t\tcolumns: this.Columns\n\t\t};\n\t},\n\n\tchildViewEvents: {\n\t\tclick: function click() {\n\t\t\tthis.children.each(function (rowView) {\n\t\t\t\trowView.trigger(\"deselect\");\n\t\t\t});\n\t\t}\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tvar _this7 = this;\n\n\t\tthis.Columns = options.columns;\n\n\t\tthis.listenTo(this.collection, \"reset\", function () {\n\t\t\t_this7.collection.each(function (model) {\n\t\t\t\tmodel.trigger(\"gridBack:refresh\");\n\t\t\t});\n\t\t});\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(this.collection);\n\t}\n});\n\n// ----------------------------------------------------------------------------\n\nvar HeaderView = Backbone.Marionette.CollectionView.extend({\n\ttagName: \"thead\",\n\tclassName: \"grid-back-table-header\",\n\n\tchildView: RowView,\n\n\tchildViewOptions: function childViewOptions() {\n\t\treturn {\n\t\t\tchildView: LabelView,\n\t\t\tcolumns: this.Columns,\n\t\t\theader: true\n\t\t};\n\t},\n\n\tchildViewEvents: {\n\t\tsort: function sort(order, criterion) {\n\t\t\tthis.trigger(\"sort\", order, criterion);\n\t\t}\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.Columns = options.columns;\n\n\t\tvar unlabelledCounter = 0;\n\n\t\tthis.collection = new Backbone.Collection([new GridRowModel(_.reduce(this.Columns, function (accumulator, column) {\n\t\t\taccumulator[column.name ? column.name : \"_\" + unlabelledCounter++] = column.title;\n\t\t\treturn accumulator;\n\t\t}, {}))]);\n\t}\n});\n\nvar CounterView = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"grid-back-counter\",\n\n\ttemplate: false,\n\n\tinitialize: function initialize(options) {\n\t\tthis.id = options.id ? options.id : undefined;\n\t\tthis.Label = options.label;\n\n\t\tthis.PagedCollection = options.pagedCollection;\n\t\tthis.listenTo(this.PagedCollection, \"reset\", this.update.bind(this));\n\t\tthis.listenTo(this.PagedCollection, \"sync\", this.update.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.update();\n\t},\n\n\tupdate: function update() {\n\t\tvar firstRecord = (this.PagedCollection.state.currentPage - 1) * this.PagedCollection.state.pageSize + 1;\n\t\tvar lastRecord = this.PagedCollection.state.currentPage * this.PagedCollection.state.pageSize;\n\n\t\tif (lastRecord > this.PagedCollection.state.totalRecords) lastRecord = this.PagedCollection.state.totalRecords;\n\n\t\tvar text = this.Label + \" \" + firstRecord + \" - \" + lastRecord + \" of \" + this.PagedCollection.state.totalRecords;\n\n\t\tif (this.PagedCollection.state.totalRecords === null) text = \"\";\n\n\t\tthis.$el.text(text);\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(this.PagedCollection);\n\t}\n});\n\nvar NavigatorView = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"grid-back-navigator\",\n\n\ttemplate: require(\"./templates/gridBack.nunj\").navigator,\n\n\tui: {\n\t\tbuttonFastPrevious: \".grid-back-fast-previous\",\n\t\tbuttonPrevious: \".grid-back-previous\",\n\t\tbuttonNext: \".grid-back-next\",\n\t\tbuttonFastNext: \".grid-back-fast-next\",\n\n\t\tpageButtonContainer: \".page-button-container\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonFastPrevious\": \"onButtonFastPreviousClick\",\n\t\t\"click @ui.buttonPrevious\": \"onButtonPreviousClick\",\n\t\t\"click @ui.buttonNext\": \"onButtonNextClick\",\n\t\t\"click @ui.buttonFastNext\": \"onButtonFastNextClick\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tvar _this8 = this;\n\n\t\tthis.id = options.id ? options.id : undefined;\n\n\t\tthis.PagedCollection = options.pagedCollection;\n\t\tthis.listenTo(this.PagedCollection, \"reset\", function () {\n\t\t\t_this8.updatePageButtons();\n\t\t\t_this8.updateButtons();\n\t\t});\n\n\t\tthis.PageButtonCollection = new Backbone.Collection(_.map(_.range(this.PagedCollection.state.totalPages), function (pageIndex) {\n\t\t\tvar offset = _this8.PagedCollection.state.firstPage;\n\n\t\t\treturn {\n\t\t\t\tindex: pageIndex + offset,\n\t\t\t\tlabel: offset === 0 ? pageIndex + 1 : pageIndex + offset\n\t\t\t};\n\t\t}));\n\n\t\tthis.listenTo(this.PageButtonCollection, \"navigate\", this.onNavigate.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\t// eslint-disable-next-line no-use-before-define\n\t\tthis.PageButtons = new PageButtons({ collection: this.PageButtonCollection });\n\t\tthis.ui.pageButtonContainer.append(this.PageButtons.render().$el);\n\n\t\tthis.updatePageButtons();\n\t\tthis.updateButtons();\n\t},\n\n\tupdatePageButtons: function updatePageButtons() {\n\t\tvar _this9 = this;\n\n\t\tthis.PageButtonCollection.trigger(\"hideAll\");\n\t\tthis.PageButtonCollection.trigger(\"lowlightAll\");\n\n\t\tthis.PageButtonCollection.each(function (pageButtonModel) {\n\t\t\tvar pageButtonIndex = pageButtonModel.get(\"index\");\n\t\t\tvar firstPage = _this9.PagedCollection.state.firstPage;\n\t\t\tvar currentPage = _this9.PagedCollection.state.currentPage;\n\t\t\tvar lastPage = _this9.PagedCollection.state.lastPage;\n\n\t\t\tif (pageButtonIndex === currentPage - 1 || currentPage === lastPage && pageButtonIndex === currentPage - 2) {\n\t\t\t\tpageButtonModel.trigger(\"show\");\n\t\t\t} else if (pageButtonIndex === currentPage) {\n\t\t\t\tpageButtonModel.trigger(\"show\");\n\t\t\t\tpageButtonModel.trigger(\"highlight\");\n\t\t\t} else if (pageButtonIndex === currentPage + 1 || currentPage === firstPage && pageButtonIndex === currentPage + 2) {\n\t\t\t\tpageButtonModel.trigger(\"show\");\n\t\t\t}\n\t\t});\n\t},\n\n\tupdateButtons: function updateButtons() {\n\t\tif (this.PagedCollection.hasPreviousPage()) {\n\t\t\tthis.ui.buttonFastPrevious.prop(\"disabled\", false);\n\t\t\tthis.ui.buttonPrevious.prop(\"disabled\", false);\n\t\t\tthis.ui.buttonFastPrevious.addClass(\"grid-back-button-enabled\");\n\t\t\tthis.ui.buttonPrevious.addClass(\"grid-back-button-enabled\");\n\t\t} else {\n\t\t\tthis.ui.buttonFastPrevious.prop(\"disabled\", true);\n\t\t\tthis.ui.buttonPrevious.prop(\"disabled\", true);\n\t\t\tthis.ui.buttonFastPrevious.removeClass(\"grid-back-button-enabled\");\n\t\t\tthis.ui.buttonPrevious.removeClass(\"grid-back-button-enabled\");\n\t\t}\n\n\t\tif (this.PagedCollection.hasNextPage()) {\n\t\t\tthis.ui.buttonNext.prop(\"disabled\", false);\n\t\t\tthis.ui.buttonFastNext.prop(\"disabled\", false);\n\t\t\tthis.ui.buttonNext.addClass(\"grid-back-button-enabled\");\n\t\t\tthis.ui.buttonFastNext.addClass(\"grid-back-button-enabled\");\n\t\t} else {\n\t\t\tthis.ui.buttonNext.prop(\"disabled\", true);\n\t\t\tthis.ui.buttonFastNext.prop(\"disabled\", true);\n\t\t\tthis.ui.buttonNext.removeClass(\"grid-back-button-enabled\");\n\t\t\tthis.ui.buttonFastNext.removeClass(\"grid-back-button-enabled\");\n\t\t}\n\t},\n\n\tonButtonFastPreviousClick: function onButtonFastPreviousClick() {\n\t\tthis.PagedCollection.getFirstPage();\n\t},\n\n\tonButtonPreviousClick: function onButtonPreviousClick() {\n\t\tthis.PagedCollection.getPreviousPage();\n\t},\n\n\tonButtonNextClick: function onButtonNextClick() {\n\t\tthis.PagedCollection.getNextPage();\n\t},\n\n\tonButtonFastNextClick: function onButtonFastNextClick() {\n\t\tthis.PagedCollection.getLastPage();\n\t},\n\n\tonNavigate: function onNavigate(pageButtonModel) {\n\t\tthis.PagedCollection.getPage(pageButtonModel.get(\"index\"));\n\n\t\tthis.updateButtons();\n\t\tthis.updatePageButtons();\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.PageButtons.destroy();\n\t\tthis.stopListening(this.PagedCollection);\n\t\tthis.stopListening(this.PageButtonCollection);\n\t}\n});\n\n// ----------------------------------------------------------------------------\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"grid-back\",\n\n\ttemplate: require(\"./templates/gridBack.nunj\").grid,\n\n\tui: {\n\t\ttable: \"table.grid-back-table\",\n\t\tfilterContainer: \".grid-back-filter-container\",\n\t\tcounterContainer: \".grid-back-counter-container\",\n\t\tnavigatorContainer: \".grid-back-navigator-container\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tvar _this10 = this;\n\n\t\tthis.Borderless = options.borderless;\n\n\t\tthis.Columns = options.columns;\n\n\t\tthis.OriginalCollection = this.collection;\n\t\tthis.FilteredCollection = new Backbone.VirtualCollection(this.OriginalCollection);\n\n\t\tthis.PagingDisabled = options.pagingDisabled;\n\n\t\tif (this.PagingDisabled) {\n\t\t\tthis.collection = this.FilteredCollection;\n\t\t} else {\n\t\t\tvar PagedCollection = Backbone.PageableCollection.extend({\n\t\t\t\tmodel: options.collection.model,\n\t\t\t\turl: options.collection.url,\n\n\t\t\t\tstate: {\n\t\t\t\t\tpageSize: options.pageSize || 6\n\t\t\t\t},\n\n\t\t\t\tmode: \"client\"\n\t\t\t});\n\n\t\t\tthis.collection = new PagedCollection(this.FilteredCollection.models);\n\t\t}\n\n\t\tthis.listenTo(this.OriginalCollection, \"reset\", function () {\n\t\t\tif (!_this10.PagingDisabled) _this10.collection.fullCollection.trigger(\"reset\", _this10.collection, { silent: false });\n\t\t});\n\n\t\tthis.CounterDisabled = Boolean(options.counterDisabled);\n\t\tthis.CounterContainer = options.counterContainer || this.ui.counterContainer;\n\t\tthis.CounterID = options.counterID || null;\n\t\tthis.CounterLabel = options.counterLabel || \"Record\";\n\n\t\tthis.NavigatorDisabled = Boolean(options.navigatorDisabled);\n\t\tthis.NavigatorContainer = options.navigatorContainer || this.ui.navigatorContainer;\n\t\tthis.NavigatorID = options.navigatorID || null;\n\n\t\tthis.FilterDisabled = Boolean(options.filterDisabled);\n\t\tthis.FilterOptions = options.filterOptions || null;\n\t\tthis.FilterContainer = options.filterContainer || this.ui.filterContainer;\n\t\tthis.FilterID = options.filterID || null;\n\t},\n\n\tonRender: function onRender() {\n\t\t// Set style options\n\t\tif (this.Borderless) this.$el.addClass(\"borderless\");\n\n\t\t// Construct the header\n\t\tthis.headerView = new HeaderView({\n\t\t\tcolumns: this.Columns\n\t\t});\n\n\t\tthis.listenTo(this.headerView, \"sort\", this.onSort.bind(this));\n\n\t\tthis.ui.table.append(this.headerView.render().$el);\n\n\t\t// Construct the body\n\t\tthis.BodyView = new BodyView({\n\t\t\tcolumns: this.Columns,\n\t\t\tcollection: this.collection,\n\t\t\treorderOnSort: true\n\t\t});\n\n\t\tthis.ui.table.append(this.BodyView.render().$el);\n\n\t\t// Construct the filter\n\t\tif (!this.FilterDisabled) {\n\t\t\tthis.Filter = new FilterBack(this.FilterOptions);\n\n\t\t\tthis.listenTo(this.Filter, \"execute\", this.onFilter.bind(this));\n\n\t\t\tthis.FilterContainer.prepend(this.Filter.render().$el);\n\t\t}\n\n\t\t// Construct the counter\n\t\tif (!this.CounterDisabled) {\n\t\t\tthis.Counter = new CounterView({ pagedCollection: this.collection, id: this.CounterID || undefined, label: this.CounterLabel });\n\t\t\tthis.CounterContainer.append(this.Counter.render().$el);\n\t\t}\n\n\t\t// Construct the navigator\n\t\tif (!this.NavigatorDisabled) {\n\t\t\tthis.Navigator = new NavigatorView({ pagedCollection: this.collection, id: this.NavigatorID || undefined });\n\t\t\tthis.NavigatorContainer.append(this.Navigator.render().$el);\n\t\t}\n\n\t\tthis.trigger(\"grid:onShow\");\n\t},\n\n\tonFilter: function onFilter(filter) {\n\t\tthis.FilteredCollection.updateFilter(filter);\n\n\t\tif (!this.PagingDisabled) this.collection.fullCollection.reset(this.FilteredCollection.models);\n\t},\n\n\tonSort: function onSort(order, criterion) {\n\t\tvar defaultComparator = function defaultComparator(model) {\n\t\t\treturn model.cid;\n\t\t};\n\n\t\tif (!this.preservedComparator && this.collection.comparator) this.preservedComparator = this.collection.comparator;\n\n\t\tif (order === \"default\") {\n\t\t\tif (this.preservedComparator) {\n\t\t\t\tthis.collection.comparator = this.preservedComparator;\n\n\t\t\t\tthis.preservedComparator = null;\n\t\t\t} else {\n\t\t\t\tthis.collection.comparator = defaultComparator;\n\t\t\t}\n\t\t} else if (_.isFunction(criterion)) {\n\t\t\tthis.collection.comparator = criterion(order);\n\t\t} else {\n\t\t\t// Start with ascending order...\n\t\t\tvar ltResult = -1;\n\t\t\tvar gtResult = 1;\n\n\t\t\tif (order === \"descending\") {\n\t\t\t\tltResult = 1;\n\t\t\t\tgtResult = -1;\n\t\t\t}\n\n\t\t\tvar sortingComparator = function sortingComparator(firstModel, secondModel) {\n\t\t\t\tvar result = 0;\n\n\t\t\t\tvar firstValue = firstModel.get(criterion);\n\t\t\t\tvar secondValue = secondModel.get(criterion);\n\n\t\t\t\tif (_.isString(firstValue)) firstValue = firstValue.toLowerCase();\n\n\t\t\t\tif (_.isString(secondValue)) secondValue = secondValue.toLowerCase();\n\n\t\t\t\tif (firstValue < secondValue) result = ltResult;else if (firstValue > secondValue) result = gtResult;\n\n\t\t\t\treturn result;\n\t\t\t};\n\n\t\t\tthis.collection.comparator = sortingComparator;\n\t\t}\n\n\t\tthis.collection.sort();\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(this.Filter);\n\t\tthis.stopListening(this.headerView);\n\n\t\tif (this.Counter) this.Counter.destroy();\n\n\t\tif (this.Navigator) this.Navigator.destroy();\n\n\t\tthis.BodyView.destroy();\n\n\t\tthis.stopListening(this.OriginalCollection);\n\t}\n});\n\n// ----------------------------------------------------------------------------\n\n\nvar PageButton = Backbone.Marionette.View.extend({\n\tclassName: \"grid-back-page-button\",\n\n\ttemplate: require(\"./templates/gridBack.nunj\").pageButton,\n\n\tevents: {\n\t\tclick: \"onClick\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.on(\"hide\", this.onHide.bind(this));\n\t\tthis.listenTo(this.model, \"show\", this.onShow.bind(this));\n\n\t\tthis.on(\"lowlight\", this.onLowlight.bind(this));\n\t\tthis.listenTo(this.model, \"highlight\", this.onHighlight.bind(this));\n\t},\n\n\tonClick: function onClick() {\n\t\tthis.model.trigger(\"navigate\", this.model);\n\t},\n\n\tonHide: function onHide() {\n\t\tthis.$el.addClass(\"hide\");\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.$el.removeClass(\"hide\");\n\t},\n\n\tonLowlight: function onLowlight() {\n\t\tthis.$el.removeClass(\"grid-back-page-button-highlight\");\n\t},\n\n\tonHighlight: function onHighlight() {\n\t\tthis.$el.addClass(\"grid-back-page-button-highlight\");\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.off(\"hide\");\n\t\tthis.off(\"lowlight\");\n\t\tthis.stopListening(this.model);\n\t}\n});\n\nvar PageButtons = Backbone.Marionette.CollectionView.extend({\n\tclassName: \"grid-back-page-buttons\",\n\n\tchildView: PageButton,\n\n\tinitialize: function initialize() {\n\t\tthis.listenTo(this.collection, \"hideAll\", this.hideChildren.bind(this));\n\t\tthis.listenTo(this.collection, \"lowlightAll\", this.lowlightChildren.bind(this));\n\t},\n\n\thideChildren: function hideChildren() {\n\t\tthis.children.each(function (childView) {\n\t\t\tchildView.trigger(\"hide\");\n\t\t});\n\t},\n\n\tlowlightChildren: function lowlightChildren() {\n\t\tthis.children.each(function (childView) {\n\t\t\tchildView.trigger(\"lowlight\");\n\t\t});\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(this.collection);\n\t}\n});\n\n// ----------------------------------------------------------------------------\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImdyaWRCYWNrLmpzIl0sIm5hbWVzIjpbIiQiLCJyZXF1aXJlIiwiXyIsIkJhY2tib25lIiwiRmlsdGVyQmFjayIsIlBhZ2UiLCJNYXJpb25ldHRlIiwiQXBwbGljYXRpb24iLCJFdmVudHMiLCJDbGljayIsIkxhYmVsTW91c2VPdmVyIiwiTGFiZWxNb3VzZU91dCIsIlJvd01vdXNlT3ZlciIsIlJvd01vdXNlT3V0IiwiR3JpZFJvd01vZGVsIiwiTW9kZWwiLCJleHRlbmQiLCJkZWZhdWx0cyIsIkdyaWRWYWx1ZU1vZGVsIiwiQWN0aW9uVmlldyIsIlZpZXciLCJ0YWdOYW1lIiwiY2xhc3NOYW1lIiwibW9kZWwiLCJnZXQiLCJhdHRyaWJ1dGVzIiwidGl0bGUiLCJ0ZW1wbGF0ZSIsImV2ZW50cyIsImNsaWNrIiwib25DbGljayIsInRyaWdnZXIiLCJBY3Rpb25Ub29sYmFyIiwiQ29sbGVjdGlvblZpZXciLCJjaGlsZFZpZXciLCJjaGlsZFZpZXdFdmVudHMiLCJhY3Rpb24iLCJhY3Rpb25Nb2RlbCIsIlZhbHVlVmlldyIsInJlc3VsdCIsImhhcyIsInN0eWxlIiwidmFsdWUiLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsIm1vZGVsRXZlbnRzIiwiY2hhbmdlIiwidGVtcGxhdGVDb250ZXh0IiwiaGlnaGxpZ2h0Um93IiwiSGlnaGxpZ2h0Um93IiwiaXNBY3Rpb25DZWxsIiwiZXNjYXBlVmFsdWUiLCJlc2NhcGUiLCJpbml0aWFsaXplIiwiY29tcHV0ZUNlbGxDb250ZW50IiwiaGlnaGxpZ2h0IiwiaGlnaGxpZ2h0QWxsIiwiSGlnaGxpZ2h0Q29sdW1uIiwiSGlnaGxpZ2h0U2VsZiIsImxpc3RlblRvIiwiYmluZCIsImxvd2xpZ2h0Iiwib24iLCJhcnRpY3VsYXRlSGlnaGxpZ2h0Iiwic3RpY2tIaWdobGlnaHQiLCJvblN0aWNrSGlnaGxpZ2h0IiwidW5zdGlja0hpZ2hsaWdodCIsIm9uVW5zdGlja0hpZ2hsaWdodCIsImRlc2VsZWN0Iiwib25EZXNlbGVjdCIsImlzT2JqZWN0IiwiQm9vbGVhbiIsImFjdGlvbnMiLCJpc0NsaWNrRGlzYWJsZWQiLCJkaXNhYmxlQ2xpY2siLCJtYXJrdXAiLCJvblJlbmRlciIsImNvbGxlY3Rpb24iLCJvbkFjdGlvbiIsImVsIiwidG9vbGJhciIsImFkanVzdG1lbnQiLCJhbmltYXRpb24iLCJjb250ZW50IiwicmVuZGVyIiwiJGVsIiwiZXZlbnQiLCJoaWRlT25DbGljayIsInBvc2l0aW9uIiwic2lua0Rlc2VsZWN0IiwiYWRkQ2xhc3MiLCJvbk1vZGVsQ2hhbmdlZCIsInZhbHVlQ29udGFpbmVyIiwiZW1wdHkiLCJhcHBlbmQiLCJzdG9wUHJvcGFnYXRpb24iLCJvbk1vdXNlT3ZlciIsIm9uTW91c2VPdXQiLCJoaWdobGlnaHRTdHVjayIsImFydGljdWxhdGVMb3dsaWdodCIsInJlbW92ZUNsYXNzIiwib25CZWZvcmVEZXN0cm95Iiwib2ZmIiwic3RvcExpc3RlbmluZyIsIkxhYmVsVmlldyIsImxhYmVsIiwidWkiLCJjb250cm9sQ29udGFpbmVyIiwiaWNvblNvcnQiLCJzb3J0YWJsZSIsImlzU29ydGFibGUiLCJIaWdobGlnaHQiLCJzb3J0TW9kZSIsIm9uUmVzZXRTb3J0Iiwib25Db250cm9sQ29udGFpbmVyQ2xpY2siLCJvbkljb25Tb3J0Q2xpY2siLCJ0b2dnbGVTb3J0TW9kZSIsImNyaXRlcmlvbiIsImlzRnVuY3Rpb24iLCJSb3dWaWV3IiwiY2hpbGRyZW4iLCJlYWNoIiwibG93bGlnaHRSb3ciLCJzb3J0Iiwib3JkZXIiLCJvcHRpb25zIiwiQ29sdW1ucyIsImNvbHVtbnMiLCJjb25zdHJ1Y3RDb2xsZWN0aW9uIiwiaGVhZGVyIiwidW5sYWJlbGxlZENvdW50ZXIiLCJDb2xsZWN0aW9uIiwibWFwIiwiY29sdW1uTmFtZSIsImNvbHVtbiIsIm5hbWUiLCJ2YWx1ZU1vZGVsIiwiYWxpZ24iLCJjZWxsQ2xpY2siLCJjZWxsTW91c2VPdmVyIiwiY2VsbE1vdXNlT3V0IiwiY29sdW1uQ2xpY2siLCJtaW5XaWR0aCIsInN0aWNreUhpZ2hsaWdodCIsImFjY2Vzc29yIiwic2V0IiwiQm9keVZpZXciLCJjaGlsZFZpZXdPcHRpb25zIiwicm93VmlldyIsIkhlYWRlclZpZXciLCJyZWR1Y2UiLCJhY2N1bXVsYXRvciIsIkNvdW50ZXJWaWV3IiwiaWQiLCJ1bmRlZmluZWQiLCJMYWJlbCIsIlBhZ2VkQ29sbGVjdGlvbiIsInBhZ2VkQ29sbGVjdGlvbiIsInVwZGF0ZSIsImZpcnN0UmVjb3JkIiwic3RhdGUiLCJjdXJyZW50UGFnZSIsInBhZ2VTaXplIiwibGFzdFJlY29yZCIsInRvdGFsUmVjb3JkcyIsInRleHQiLCJOYXZpZ2F0b3JWaWV3IiwibmF2aWdhdG9yIiwiYnV0dG9uRmFzdFByZXZpb3VzIiwiYnV0dG9uUHJldmlvdXMiLCJidXR0b25OZXh0IiwiYnV0dG9uRmFzdE5leHQiLCJwYWdlQnV0dG9uQ29udGFpbmVyIiwidXBkYXRlUGFnZUJ1dHRvbnMiLCJ1cGRhdGVCdXR0b25zIiwiUGFnZUJ1dHRvbkNvbGxlY3Rpb24iLCJyYW5nZSIsInRvdGFsUGFnZXMiLCJvZmZzZXQiLCJmaXJzdFBhZ2UiLCJpbmRleCIsInBhZ2VJbmRleCIsIm9uTmF2aWdhdGUiLCJQYWdlQnV0dG9ucyIsInBhZ2VCdXR0b25JbmRleCIsInBhZ2VCdXR0b25Nb2RlbCIsImxhc3RQYWdlIiwiaGFzUHJldmlvdXNQYWdlIiwicHJvcCIsImhhc05leHRQYWdlIiwib25CdXR0b25GYXN0UHJldmlvdXNDbGljayIsImdldEZpcnN0UGFnZSIsIm9uQnV0dG9uUHJldmlvdXNDbGljayIsImdldFByZXZpb3VzUGFnZSIsIm9uQnV0dG9uTmV4dENsaWNrIiwiZ2V0TmV4dFBhZ2UiLCJvbkJ1dHRvbkZhc3ROZXh0Q2xpY2siLCJnZXRMYXN0UGFnZSIsImdldFBhZ2UiLCJkZXN0cm95IiwibW9kdWxlIiwiZXhwb3J0cyIsImdyaWQiLCJ0YWJsZSIsImZpbHRlckNvbnRhaW5lciIsImNvdW50ZXJDb250YWluZXIiLCJuYXZpZ2F0b3JDb250YWluZXIiLCJCb3JkZXJsZXNzIiwiYm9yZGVybGVzcyIsIk9yaWdpbmFsQ29sbGVjdGlvbiIsIkZpbHRlcmVkQ29sbGVjdGlvbiIsIlZpcnR1YWxDb2xsZWN0aW9uIiwiUGFnaW5nRGlzYWJsZWQiLCJwYWdpbmdEaXNhYmxlZCIsIlBhZ2VhYmxlQ29sbGVjdGlvbiIsInVybCIsIm1vZGUiLCJtb2RlbHMiLCJmdWxsQ29sbGVjdGlvbiIsInNpbGVudCIsIkNvdW50ZXJEaXNhYmxlZCIsImNvdW50ZXJEaXNhYmxlZCIsIkNvdW50ZXJDb250YWluZXIiLCJDb3VudGVySUQiLCJjb3VudGVySUQiLCJDb3VudGVyTGFiZWwiLCJjb3VudGVyTGFiZWwiLCJOYXZpZ2F0b3JEaXNhYmxlZCIsIm5hdmlnYXRvckRpc2FibGVkIiwiTmF2aWdhdG9yQ29udGFpbmVyIiwiTmF2aWdhdG9ySUQiLCJuYXZpZ2F0b3JJRCIsIkZpbHRlckRpc2FibGVkIiwiZmlsdGVyRGlzYWJsZWQiLCJGaWx0ZXJPcHRpb25zIiwiZmlsdGVyT3B0aW9ucyIsIkZpbHRlckNvbnRhaW5lciIsIkZpbHRlcklEIiwiZmlsdGVySUQiLCJoZWFkZXJWaWV3Iiwib25Tb3J0IiwicmVvcmRlck9uU29ydCIsIkZpbHRlciIsIm9uRmlsdGVyIiwicHJlcGVuZCIsIkNvdW50ZXIiLCJOYXZpZ2F0b3IiLCJmaWx0ZXIiLCJ1cGRhdGVGaWx0ZXIiLCJyZXNldCIsImRlZmF1bHRDb21wYXJhdG9yIiwiY2lkIiwicHJlc2VydmVkQ29tcGFyYXRvciIsImNvbXBhcmF0b3IiLCJsdFJlc3VsdCIsImd0UmVzdWx0Iiwic29ydGluZ0NvbXBhcmF0b3IiLCJmaXJzdE1vZGVsIiwic2Vjb25kTW9kZWwiLCJmaXJzdFZhbHVlIiwic2Vjb25kVmFsdWUiLCJpc1N0cmluZyIsInRvTG93ZXJDYXNlIiwiUGFnZUJ1dHRvbiIsInBhZ2VCdXR0b24iLCJvbkhpZGUiLCJvblNob3ciLCJvbkxvd2xpZ2h0Iiwib25IaWdobGlnaHQiLCJoaWRlQ2hpbGRyZW4iLCJsb3dsaWdodENoaWxkcmVuIl0s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LElBQXZCLENBQTFDO0FBQ0EsT0FBS0QsUUFBTCxDQUFjLEtBQUtrQixVQUFuQixFQUErQixhQUEvQixFQUE4QyxLQUFLaU0sZ0JBQUwsQ0FBc0JsTixJQUF0QixDQUEyQixJQUEzQixDQUE5QztBQUNBLEVBUjREOztBQVU3RGlOLGVBQWMsd0JBQVc7QUFDeEIsT0FBS3JKLFFBQUwsQ0FBY0MsSUFBZCxDQUFtQixxQkFBYTtBQUMvQnZGLGFBQVVILE9BQVYsQ0FBa0IsTUFBbEI7QUFDQSxHQUZEO0FBR0EsRUFkNEQ7O0FBZ0I3RCtPLG1CQUFrQiw0QkFBVztBQUM1QixPQUFLdEosUUFBTCxDQUFjQyxJQUFkLENBQW1CLHFCQUFhO0FBQy9CdkYsYUFBVUgsT0FBVixDQUFrQixVQUFsQjtBQUNBLEdBRkQ7QUFHQSxFQXBCNEQ7O0FBc0I3RHNFLGtCQUFpQiwyQkFBVztBQUMzQixPQUFLRSxhQUFMLENBQW1CLEtBQUsxQixVQUF4QjtBQUNBO0FBeEI0RCxDQUExQyxDQUFwQjs7QUE2QkEiLCJmaWxlIjoiZ3JpZEJhY2suanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcblxuY29uc3QgRmlsdGVyQmFjayA9IHJlcXVpcmUoXCIuL2ZpbHRlckJhY2tcIik7XG5cbmNvbnN0IFBhZ2UgPSBuZXcgQmFja2JvbmUuTWFyaW9uZXR0ZS5BcHBsaWNhdGlvbigpO1xuXG5QYWdlLkV2ZW50cyA9IHtcblx0Q2xpY2s6IFwiUGFnZS5FdmVudHMuQ2xpY2tcIixcblx0TGFiZWxNb3VzZU92ZXI6IFwiUGFnZS5FdmVudHMuTGFiZWxNb3VzZU92ZXJcIixcblx0TGFiZWxNb3VzZU91dDogXCJQYWdlLkV2ZW50cy5MYWJlbE1vdXNlT3V0XCIsXG5cdFJvd01vdXNlT3ZlcjogXCJQYWdlLkV2ZW50cy5Sb3dNb3VzZU92ZXJcIixcblx0Um93TW91c2VPdXQ6IFwiUGFnZS5FdmVudHMuUm93TW91c2VPdXRcIixcbn07XG5cbmNvbnN0IEdyaWRSb3dNb2RlbCA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7fSxcbn0pO1xuXG5jb25zdCBHcmlkVmFsdWVNb2RlbCA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7fSxcbn0pO1xuXG5jb25zdCBBY3Rpb25WaWV3ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6IFwiYVwiLFxuXG5cdGNsYXNzTmFtZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIFwiZmFsIFwiICsgdGhpcy5tb2RlbC5nZXQoXCJnbHlwaFwiKTtcblx0fSxcblxuXHRhdHRyaWJ1dGVzOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0dGl0bGU6IHRoaXMubW9kZWwuZ2V0KFwibGFiZWxcIiksXG5cdFx0fTtcblx0fSxcblxuXHR0ZW1wbGF0ZTogZmFsc2UsXG5cblx0ZXZlbnRzOiB7XG5cdFx0Y2xpY2s6IFwib25DbGlja1wiLFxuXHR9LFxuXG5cdG9uQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudHJpZ2dlcihcImFjdGlvblwiLCB0aGlzLm1vZGVsKTtcblx0fSxcbn0pO1xuXG5jb25zdCBBY3Rpb25Ub29sYmFyID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5Db2xsZWN0aW9uVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXG5cdGNsYXNzTmFtZTogXCJncmlkLWJhY2stYWN0aW9uLXRvb2xiYXJcIixcblxuXHRjaGlsZFZpZXc6IEFjdGlvblZpZXcsXG5cblx0Y2hpbGRWaWV3RXZlbnRzOiB7XG5cdFx0YWN0aW9uOiBmdW5jdGlvbihhY3Rpb25Nb2RlbCkge1xuXHRcdFx0dGhpcy50cmlnZ2VyKFwiYWN0aW9uXCIsIGFjdGlvbk1vZGVsKTtcblx0XHR9LFxuXHR9LFxufSk7XG5cbmNvbnN0IFZhbHVlVmlldyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcInRkXCIsXG5cdGNsYXNzTmFtZTogXCJncmlkLWJhY2stdmFsdWUgZ3JpZC1iYWNrLWNlbGxcIixcblxuXHRhdHRyaWJ1dGVzOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCByZXN1bHQgPSB7fTtcblxuXHRcdGlmICh0aGlzLm1vZGVsLmhhcyhcIm1pbldpZHRoXCIpKVxuXHRcdFx0cmVzdWx0LnN0eWxlID0gXCJtaW4td2lkdGg6IFwiICsgdGhpcy5tb2RlbC5nZXQoXCJtaW5XaWR0aFwiKTtcblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9ncmlkQmFjay5udW5qXCIpLnZhbHVlLFxuXG5cdGV2ZW50czoge1xuXHRcdGNsaWNrOiBcIm9uQ2xpY2tcIixcblx0XHRtb3VzZW92ZXI6IFwib25Nb3VzZU92ZXJcIixcblx0XHRtb3VzZW91dDogXCJvbk1vdXNlT3V0XCIsXG5cdH0sXG5cblx0bW9kZWxFdmVudHM6IHtcblx0XHRjaGFuZ2U6IFwib25Nb2RlbENoYW5nZWRcIixcblx0fSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRoaWdobGlnaHRSb3c6ICgpID0+IHRoaXMuSGlnaGxpZ2h0Um93LFxuXHRcdFx0aXNBY3Rpb25DZWxsOiAoKSA9PiB0aGlzLmlzQWN0aW9uQ2VsbCxcblx0XHRcdHZhbHVlOiAoKSA9PiB0aGlzLnZhbHVlLFxuXHRcdFx0ZXNjYXBlVmFsdWU6ICgpID0+IHRoaXMubW9kZWwuZ2V0KFwiY29sdW1uXCIpLmVzY2FwZSxcblx0XHR9O1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY29tcHV0ZUNlbGxDb250ZW50KCk7XG5cblx0XHRjb25zdCBoaWdobGlnaHQgPSB0aGlzLm1vZGVsLmdldChcImhpZ2hsaWdodFwiKTtcblx0XHRjb25zdCBoaWdobGlnaHRBbGwgPSBoaWdobGlnaHQgPT09IFwiYWxsXCI7XG5cblx0XHR0aGlzLkhpZ2hsaWdodFJvdyA9IGhpZ2hsaWdodCA9PT0gXCJyb3dcIiB8fCBoaWdobGlnaHRBbGw7XG5cdFx0dGhpcy5IaWdobGlnaHRDb2x1bW4gPSBoaWdobGlnaHQgPT09IFwiY29sdW1uXCIgfHwgaGlnaGxpZ2h0QWxsO1xuXHRcdHRoaXMuSGlnaGxpZ2h0U2VsZiA9IGhpZ2hsaWdodCA9PT0gXCJjZWxsXCIgfHwgaGlnaGxpZ2h0QWxsIHx8IHRoaXMuSGlnaGxpZ2h0Um93IHx8IHRoaXMuSGlnaGxpZ2h0Q29sdW1uO1xuXG5cdFx0aWYgKHRoaXMuSGlnaGxpZ2h0Q29sdW1uKSB7XG5cdFx0XHR0aGlzLmxpc3RlblRvKFBhZ2UsIFBhZ2UuRXZlbnRzLkxhYmVsTW91c2VPdmVyICsgXCI6XCIgKyB0aGlzLm1vZGVsLmdldChcImNvbHVtblwiKSwgdGhpcy5oaWdobGlnaHQuYmluZCh0aGlzKSk7XG5cdFx0XHR0aGlzLmxpc3RlblRvKFBhZ2UsIFBhZ2UuRXZlbnRzLkxhYmVsTW91c2VPdXQgKyBcIjpcIiArIHRoaXMubW9kZWwuZ2V0KFwiY29sdW1uXCIpLCB0aGlzLmxvd2xpZ2h0LmJpbmQodGhpcykpO1xuXHRcdH1cblxuXHRcdHRoaXMub24oe1xuXHRcdFx0YXJ0aWN1bGF0ZUhpZ2hsaWdodDogKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmFydGljdWxhdGVIaWdobGlnaHQoKTtcblx0XHRcdFx0dGhpcy5zdGlja0hpZ2hsaWdodCgpO1xuXHRcdFx0fSxcblx0XHRcdGhpZ2hsaWdodDogdGhpcy5oaWdobGlnaHQuYmluZCh0aGlzKSxcblx0XHRcdGxvd2xpZ2h0OiB0aGlzLmxvd2xpZ2h0LmJpbmQodGhpcyksXG5cdFx0XHRzdGlja0hpZ2hsaWdodDogdGhpcy5vblN0aWNrSGlnaGxpZ2h0LmJpbmQodGhpcyksXG5cdFx0XHR1bnN0aWNrSGlnaGxpZ2h0OiB0aGlzLm9uVW5zdGlja0hpZ2hsaWdodC5iaW5kKHRoaXMpLFxuXHRcdFx0ZGVzZWxlY3Q6IHRoaXMub25EZXNlbGVjdC5iaW5kKHRoaXMpLFxuXHRcdH0pO1xuXHR9LFxuXG5cdGNvbXB1dGVDZWxsQ29udGVudDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy52YWx1ZSA9IHRoaXMubW9kZWwuZ2V0KFwidmFsdWVcIik7XG5cblx0XHRpZiAoXy5pc09iamVjdCh0aGlzLnZhbHVlKSkge1xuXHRcdFx0dGhpcy5pc0FjdGlvbkNlbGwgPSBCb29sZWFuKHRoaXMudmFsdWUuYWN0aW9ucyk7XG5cdFx0XHR0aGlzLmlzQ2xpY2tEaXNhYmxlZCA9IEJvb2xlYW4odGhpcy52YWx1ZS5kaXNhYmxlQ2xpY2spO1xuXG5cdFx0XHR0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5tYXJrdXAgfHwgXCJbYWN0aW9uc11cIjtcblx0XHR9XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLmlzQWN0aW9uQ2VsbCkge1xuXHRcdFx0dGhpcy5BY3Rpb25Ub29sYmFyID0gbmV3IEFjdGlvblRvb2xiYXIoeyBjb2xsZWN0aW9uOiB0aGlzLm1vZGVsLmdldChcInZhbHVlXCIpLmFjdGlvbnMgfSk7XG5cblx0XHRcdHRoaXMubGlzdGVuVG8odGhpcy5BY3Rpb25Ub29sYmFyLCBcImFjdGlvblwiLCB0aGlzLm9uQWN0aW9uLmJpbmQodGhpcykpO1xuXG5cdFx0XHQkKFwiLmdyaWQtYmFjay1hY3Rpb24tdG9vbGJhci1idXR0b25cIiwgdGhpcy5lbCkudG9vbGJhcih7XG5cdFx0XHRcdGFkanVzdG1lbnQ6IDIwLFxuXHRcdFx0XHRhbmltYXRpb246IFwic3RhbmRhcmRcIixcblx0XHRcdFx0Y29udGVudDogdGhpcy5BY3Rpb25Ub29sYmFyLnJlbmRlcigpLiRlbCxcblx0XHRcdFx0ZXZlbnQ6IFwiY2xpY2tcIixcblx0XHRcdFx0aGlkZU9uQ2xpY2s6IHRydWUsXG5cdFx0XHRcdHBvc2l0aW9uOiBcInJpZ2h0XCIsXG5cdFx0XHRcdHN0eWxlOiBcImRhcmtcIixcblx0XHRcdH0pO1xuXG5cdFx0XHQkKFwiLmdyaWQtYmFjay1hY3Rpb24tdG9vbGJhci1idXR0b25cIiwgdGhpcy5lbCkub24oXCJ0b29sYmFyU2hvd25cIiwgKCkgPT4ge1xuXHRcdFx0XHR0aGlzLnNpbmtEZXNlbGVjdCA9IHRydWU7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5pc0NsaWNrRGlzYWJsZWQpXG5cdFx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcImdyaWQtYmFjay1jZWxsLWNsaWNrLWRpc2FibGVkXCIpO1xuXHR9LFxuXG5cdG9uTW9kZWxDaGFuZ2VkOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmNvbXB1dGVDZWxsQ29udGVudCgpO1xuXG5cdFx0Y29uc3QgdmFsdWVDb250YWluZXIgPSAkKFwiZGl2XCIsIHRoaXMuJGVsKTtcblxuXHRcdHZhbHVlQ29udGFpbmVyLmVtcHR5KCk7XG5cdFx0dmFsdWVDb250YWluZXIuYXBwZW5kKHRoaXMudmFsdWUpO1xuXHR9LFxuXG5cdG9uQWN0aW9uOiBmdW5jdGlvbihhY3Rpb25Nb2RlbCkge1xuXHRcdGFjdGlvbk1vZGVsLmdldChcIm9uQ2xpY2tcIikodGhpcy5tb2RlbC5nZXQoXCJtb2RlbFwiKSk7XG5cdH0sXG5cblx0b25DbGljazogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGlmICghdGhpcy5pc0NsaWNrRGlzYWJsZWQpIHtcblx0XHRcdHRoaXMudHJpZ2dlcihcImNsaWNrXCIpO1xuXG5cdFx0XHR0aGlzLnN0aWNrSGlnaGxpZ2h0KCk7XG5cblx0XHRcdGlmICh0aGlzLm1vZGVsLmhhcyhcImNlbGxDbGlja1wiKSlcblx0XHRcdFx0dGhpcy5tb2RlbC5nZXQoXCJjZWxsQ2xpY2tcIikodGhpcy5tb2RlbC5nZXQoXCJjb2x1bW5cIiksIHRoaXMubW9kZWwuZ2V0KFwibW9kZWxcIikpO1xuXHRcdH1cblx0fSxcblxuXHRvbk1vdXNlT3ZlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5hcnRpY3VsYXRlSGlnaGxpZ2h0KCk7XG5cdH0sXG5cblx0b25Nb3VzZU91dDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLmhpZ2hsaWdodFN0dWNrKVxuXHRcdFx0dGhpcy5hcnRpY3VsYXRlTG93bGlnaHQoKTtcblx0fSxcblxuXHRhcnRpY3VsYXRlSGlnaGxpZ2h0OiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5IaWdobGlnaHRSb3cpIHtcblx0XHRcdHRoaXMudHJpZ2dlcihcImhpZ2hsaWdodFJvd1wiKTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAodGhpcy5IaWdobGlnaHRTZWxmKSB7XG5cdFx0XHR0aGlzLmhpZ2hsaWdodCgpO1xuXG5cdFx0XHRpZiAodGhpcy5tb2RlbC5oYXMoXCJjZWxsTW91c2VPdmVyXCIpKVxuXHRcdFx0XHR0aGlzLm1vZGVsLmdldChcImNlbGxNb3VzZU92ZXJcIikodGhpcy5tb2RlbC5nZXQoXCJjb2x1bW5cIiksIHRoaXMubW9kZWwuZ2V0KFwibW9kZWxcIikpO1xuXHRcdH1cblx0fSxcblxuXHRhcnRpY3VsYXRlTG93bGlnaHQ6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLkhpZ2hsaWdodFJvdykge1xuXHRcdFx0dGhpcy50cmlnZ2VyKFwibG93bGlnaHRSb3dcIik7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKHRoaXMuSGlnaGxpZ2h0U2VsZikge1xuXHRcdFx0dGhpcy5sb3dsaWdodCgpO1xuXG5cdFx0XHRpZiAodGhpcy5tb2RlbC5oYXMoXCJjZWxsTW91c2VPdXRcIikpXG5cdFx0XHRcdHRoaXMubW9kZWwuZ2V0KFwiY2VsbE1vdXNlT3V0XCIpKHRoaXMubW9kZWwuZ2V0KFwiY29sdW1uXCIpLCB0aGlzLm1vZGVsLmdldChcIm1vZGVsXCIpKTtcblx0XHR9XG5cdH0sXG5cblx0aGlnaGxpZ2h0OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcImdyaWQtYmFjay1jZWxsLWhvdmVyXCIpO1xuXHR9LFxuXG5cdGxvd2xpZ2h0OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyhcImdyaWQtYmFjay1jZWxsLWhvdmVyXCIpO1xuXHR9LFxuXG5cdHN0aWNrSGlnaGxpZ2h0OiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5oYXMoXCJzdGlja3lIaWdobGlnaHRcIikgJiYgdGhpcy5tb2RlbC5nZXQoXCJzdGlja3lIaWdobGlnaHRcIikpXG5cdFx0XHR0aGlzLnRyaWdnZXIoXCJzdGlja0hpZ2hsaWdodFwiKTtcblx0fSxcblxuXHRvblN0aWNrSGlnaGxpZ2h0OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmhpZ2hsaWdodFN0dWNrID0gdHJ1ZTtcblx0fSxcblxuXHRvblVuc3RpY2tIaWdobGlnaHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuaGlnaGxpZ2h0U3R1Y2sgPSBmYWxzZTtcblx0fSxcblxuXHRvbkRlc2VsZWN0OiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5zaW5rRGVzZWxlY3QpXG5cdFx0XHR0aGlzLnNpbmtEZXNlbGVjdCA9IGZhbHNlO1xuXHRcdGVsc2UgaWYgKHRoaXMuaXNBY3Rpb25DZWxsKVxuXHRcdFx0JChcIi5ncmlkLWJhY2stYWN0aW9uLXRvb2xiYXItYnV0dG9uXCIsIHRoaXMuZWwpLnRvb2xiYXIoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuaXNBY3Rpb25DZWxsKSB7XG5cdFx0XHQkKFwiLmdyaWQtYmFjay1hY3Rpb24tdG9vbGJhci1idXR0b25cIiwgdGhpcy5lbCkub2ZmKFwidG9vbGJhclNob3duXCIpO1xuXG5cdFx0XHRpZiAodGhpcy5BY3Rpb25Ub29sYmFyKVxuXHRcdFx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcodGhpcy5BY3Rpb25Ub29sYmFyKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5IaWdobGlnaHRDb2x1bW4pIHtcblx0XHRcdHRoaXMuc3RvcExpc3RlbmluZyhQYWdlKTtcblx0XHRcdHRoaXMuc3RvcExpc3RlbmluZyhQYWdlKTtcblx0XHR9XG5cblx0XHR0aGlzLm9mZihcImFydGljdWxhdGVIaWdobGlnaHRcIik7XG5cdFx0dGhpcy5vZmYoXCJoaWdobGlnaHRcIik7XG5cdFx0dGhpcy5vZmYoXCJsb3dsaWdodFwiKTtcblxuXHRcdHRoaXMub2ZmKFwic3RpY2tIaWdobGlnaHRcIik7XG5cdFx0dGhpcy5vZmYoXCJ1bnN0aWNrSGlnaGxpZ2h0XCIpO1xuXHR9LFxufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgTGFiZWxWaWV3ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdHRhZ05hbWU6IFwidGhcIixcblx0Y2xhc3NOYW1lOiBcImdyaWQtYmFjay1sYWJlbCBncmlkLWJhY2stY2VsbFwiLFxuXG5cdGF0dHJpYnV0ZXM6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IHt9O1xuXG5cdFx0aWYgKHRoaXMubW9kZWwuaGFzKFwibWluV2lkdGhcIikpXG5cdFx0XHRyZXN1bHQuc3R5bGUgPSBcIm1pbi13aWR0aDogXCIgKyB0aGlzLm1vZGVsLmdldChcIm1pbldpZHRoXCIpO1xuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fSxcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4vdGVtcGxhdGVzL2dyaWRCYWNrLm51bmpcIikubGFiZWwsXG5cblx0dWk6IHtcblx0XHRjb250cm9sQ29udGFpbmVyOiBcIi5ncmlkLWJhY2stbGFiZWwtY29udHJvbC1jb250YWluZXJcIixcblx0XHRpY29uU29ydDogXCIuaWNvbi1zb3J0XCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0Y2xpY2s6IFwib25DbGlja1wiLFxuXHRcdG1vdXNlb3ZlcjogXCJvbk1vdXNlT3ZlclwiLFxuXHRcdG1vdXNlb3V0OiBcIm9uTW91c2VPdXRcIixcblxuXHRcdFwiY2xpY2sgQHVpLmNvbnRyb2xDb250YWluZXJcIjogXCJvbkNvbnRyb2xDb250YWluZXJDbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmljb25Tb3J0XCI6IFwib25JY29uU29ydENsaWNrXCIsXG5cdH0sXG5cblx0dGVtcGxhdGVDb250ZXh0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0c29ydGFibGU6ICgpID0+IHRoaXMuaXNTb3J0YWJsZSgpLFxuXHRcdH07XG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5IaWdobGlnaHQgPSB0aGlzLm1vZGVsLmdldChcImhpZ2hsaWdodFwiKTtcblxuXHRcdGlmICh0aGlzLmlzU29ydGFibGUoKSlcblx0XHRcdHRoaXMuc29ydE1vZGUgPSBcInVuc29ydGVkXCI7XG5cblx0XHR0aGlzLm9uKFwicmVzZXRTb3J0XCIsIHRoaXMub25SZXNldFNvcnQuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0aXNTb3J0YWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubW9kZWwuaGFzKFwic29ydFwiKSAmJiB0aGlzLm1vZGVsLmdldChcInNvcnRcIik7XG5cdH0sXG5cblx0b25DbGljazogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwuaGFzKFwiY29sdW1uQ2xpY2tcIikpXG5cdFx0XHR0aGlzLm1vZGVsLmdldChcImNvbHVtbkNsaWNrXCIpKHRoaXMubW9kZWwuZ2V0KFwiY29sdW1uXCIpKTtcblx0fSxcblxuXHRvbkNvbnRyb2xDb250YWluZXJDbGljazogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0fSxcblxuXHRvbkljb25Tb3J0Q2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudG9nZ2xlU29ydE1vZGUoKTtcblx0fSxcblxuXHRvbk1vdXNlT3ZlcjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuSGlnaGxpZ2h0ID09PSBcImNvbHVtblwiIHx8IHRoaXMuSGlnaGxpZ2h0ID09PSBcImFsbFwiKSB7XG5cdFx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcImdyaWQtYmFjay1jZWxsLWhvdmVyXCIpO1xuXHRcdFx0UGFnZS50cmlnZ2VyKFBhZ2UuRXZlbnRzLkxhYmVsTW91c2VPdmVyICsgXCI6XCIgKyB0aGlzLm1vZGVsLmdldChcImNvbHVtblwiKSk7XG5cdFx0fVxuXHR9LFxuXG5cdG9uTW91c2VPdXQ6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLkhpZ2hsaWdodCA9PT0gXCJjb2x1bW5cIiB8fCB0aGlzLkhpZ2hsaWdodCA9PT0gXCJhbGxcIikge1xuXHRcdFx0dGhpcy4kZWwucmVtb3ZlQ2xhc3MoXCJncmlkLWJhY2stY2VsbC1ob3ZlclwiKTtcblx0XHRcdFBhZ2UudHJpZ2dlcihQYWdlLkV2ZW50cy5MYWJlbE1vdXNlT3V0ICsgXCI6XCIgKyB0aGlzLm1vZGVsLmdldChcImNvbHVtblwiKSk7XG5cdFx0fVxuXHR9LFxuXG5cdG9uUmVzZXRTb3J0OiBmdW5jdGlvbigpIHtcblx0XHRzd2l0Y2ggKHRoaXMuc29ydE1vZGUpIHtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRjYXNlIFwidW5zb3J0ZWRcIjpcblx0XHRcdFx0Ly8gRG8gbm90aGluZ1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcImFzY2VuZGluZ1wiOlxuXHRcdFx0XHR0aGlzLnVpLmljb25Tb3J0LnJlbW92ZUNsYXNzKFwiZmEtc29ydC1hc2NcIik7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwiZGVzY2VuZGluZ1wiOlxuXHRcdFx0XHR0aGlzLnVpLmljb25Tb3J0LnJlbW92ZUNsYXNzKFwiZmEtc29ydC1kZXNjXCIpO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHR0aGlzLnVpLmljb25Tb3J0LmFkZENsYXNzKFwiZmEtc29ydFwiKTtcblx0XHR0aGlzLnNvcnRNb2RlID0gXCJ1bnNvcnRlZFwiO1xuXHR9LFxuXG5cdHRvZ2dsZVNvcnRNb2RlOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBjcml0ZXJpb24gPSBfLmlzRnVuY3Rpb24odGhpcy5tb2RlbC5nZXQoXCJzb3J0XCIpKSA/IHRoaXMubW9kZWwuZ2V0KFwic29ydFwiKSA6IHRoaXMubW9kZWwuZ2V0KFwiY29sdW1uXCIpO1xuXG5cdFx0c3dpdGNoICh0aGlzLnNvcnRNb2RlKSB7XG5cdFx0XHRjYXNlIFwidW5zb3J0ZWRcIjpcblx0XHRcdFx0dGhpcy50cmlnZ2VyKFwic29ydFwiLCBcImFzY2VuZGluZ1wiLCBjcml0ZXJpb24pO1xuXHRcdFx0XHR0aGlzLnVpLmljb25Tb3J0LnJlbW92ZUNsYXNzKFwiZmEtc29ydFwiKTtcblx0XHRcdFx0dGhpcy51aS5pY29uU29ydC5hZGRDbGFzcyhcImZhLXNvcnQtYXNjXCIpO1xuXHRcdFx0XHR0aGlzLnNvcnRNb2RlID0gXCJhc2NlbmRpbmdcIjtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJhc2NlbmRpbmdcIjpcblx0XHRcdFx0dGhpcy50cmlnZ2VyKFwic29ydFwiLCBcImRlc2NlbmRpbmdcIiwgY3JpdGVyaW9uKTtcblx0XHRcdFx0dGhpcy51aS5pY29uU29ydC5yZW1vdmVDbGFzcyhcImZhLXNvcnQtYXNjXCIpO1xuXHRcdFx0XHR0aGlzLnVpLmljb25Tb3J0LmFkZENsYXNzKFwiZmEtc29ydC1kZXNjXCIpO1xuXHRcdFx0XHR0aGlzLnNvcnRNb2RlID0gXCJkZXNjZW5kaW5nXCI7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwiZGVzY2VuZGluZ1wiOlxuXHRcdFx0XHR0aGlzLnRyaWdnZXIoXCJzb3J0XCIsIFwiZGVmYXVsdFwiLCBjcml0ZXJpb24pO1xuXHRcdFx0XHR0aGlzLnVpLmljb25Tb3J0LnJlbW92ZUNsYXNzKFwiZmEtc29ydC1kZXNjXCIpO1xuXHRcdFx0XHR0aGlzLnVpLmljb25Tb3J0LmFkZENsYXNzKFwiZmEtc29ydFwiKTtcblx0XHRcdFx0dGhpcy5zb3J0TW9kZSA9IFwidW5zb3J0ZWRcIjtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdC8vIERvIG5vdGhpbmdcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5vZmYoXCJyZXNldFNvcnRcIik7XG5cdH0sXG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBSb3dWaWV3ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5Db2xsZWN0aW9uVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcInRyXCIsXG5cdGNsYXNzTmFtZTogXCJncmlkLWJhY2stcm93XCIsXG5cblx0Y2hpbGRWaWV3RXZlbnRzOiB7XG5cdFx0Y2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dGhpcy50cmlnZ2VyKFwiY2xpY2tcIik7XG5cdFx0fSxcblxuXHRcdGhpZ2hsaWdodFJvdzogZnVuY3Rpb24oKSB7XG5cdFx0XHR0aGlzLmNoaWxkcmVuLmVhY2goY2hpbGRWaWV3ID0+IHtcblx0XHRcdFx0Y2hpbGRWaWV3LnRyaWdnZXIoXCJoaWdobGlnaHRcIik7XG5cdFx0XHR9KTtcblx0XHR9LFxuXG5cdFx0bG93bGlnaHRSb3c6IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCF0aGlzLmhpZ2hsaWdodFN0dWNrKSB7XG5cdFx0XHRcdHRoaXMuY2hpbGRyZW4uZWFjaChjaGlsZFZpZXcgPT4ge1xuXHRcdFx0XHRcdGNoaWxkVmlldy50cmlnZ2VyKFwibG93bGlnaHRcIik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRzb3J0OiBmdW5jdGlvbihvcmRlciwgY3JpdGVyaW9uKSB7XG5cdFx0XHR0aGlzLmNoaWxkcmVuLmVhY2goY2hpbGRWaWV3ID0+IHtcblx0XHRcdFx0Ly9pZiAoY2hpbGRWaWV3ICE9PSB2aWV3KVxuXHRcdFx0XHRjaGlsZFZpZXcudHJpZ2dlcihcInJlc2V0U29ydFwiKTtcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLnRyaWdnZXIoXCJzb3J0XCIsIG9yZGVyLCBjcml0ZXJpb24pO1xuXHRcdH0sXG5cblx0XHRzdGlja0hpZ2hsaWdodDogZnVuY3Rpb24oKSB7XG5cdFx0XHR0aGlzLmhpZ2hsaWdodFN0dWNrID0gdHJ1ZTtcblx0XHR9LFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXHRcdHRoaXMuQ29sdW1ucyA9IG9wdGlvbnMuY29sdW1ucztcblxuXHRcdHRoaXMuY29uc3RydWN0Q29sbGVjdGlvbigpO1xuXG5cdFx0aWYgKCFvcHRpb25zLmhlYWRlcikge1xuXHRcdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCBcImdyaWRCYWNrOnJlZnJlc2hcIiwgKCkgPT4ge1xuXHRcdFx0XHR0aGlzLmNvbnN0cnVjdENvbGxlY3Rpb24oKTtcblx0XHRcdFx0dGhpcy5yZW5kZXIoKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwgXCJncmlkQmFjazpoaWdobGlnaHRcIiwgKCkgPT4ge1xuXHRcdFx0dGhpcy5jaGlsZHJlbi5lYWNoKGNoaWxkVmlldyA9PiB7XG5cdFx0XHRcdGNoaWxkVmlldy50cmlnZ2VyKFwiYXJ0aWN1bGF0ZUhpZ2hsaWdodFwiKTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5vbihcImRlc2VsZWN0XCIsICgpID0+IHtcblx0XHRcdHRoaXMudW5zdGlja0hpZ2hsaWdodCgpO1xuXG5cdFx0XHR0aGlzLmNoaWxkcmVuLmVhY2goY2hpbGRWaWV3ID0+IHtcblx0XHRcdFx0Y2hpbGRWaWV3LnRyaWdnZXIoXCJkZXNlbGVjdFwiKTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9LFxuXG5cdGNvbnN0cnVjdENvbGxlY3Rpb246IGZ1bmN0aW9uKCkge1xuXHRcdGxldCB1bmxhYmVsbGVkQ291bnRlciA9IDA7XG5cblx0XHR0aGlzLmNvbGxlY3Rpb24gPSBuZXcgQmFja2JvbmUuQ29sbGVjdGlvbihfLm1hcCh0aGlzLkNvbHVtbnMsIGNvbHVtbiA9PiB7XG5cdFx0XHRjb25zdCBjb2x1bW5OYW1lID0gY29sdW1uLm5hbWUgPyBjb2x1bW4ubmFtZSA6IFwiX1wiICsgdW5sYWJlbGxlZENvdW50ZXIrKztcblxuXHRcdFx0Y29uc3QgdmFsdWVNb2RlbCA9IG5ldyBHcmlkVmFsdWVNb2RlbCh7XG5cdFx0XHRcdGFsaWduOiBjb2x1bW4uYWxpZ24sXG5cdFx0XHRcdGNlbGxDbGljazogY29sdW1uLmNlbGxDbGljayxcblx0XHRcdFx0Y2VsbE1vdXNlT3ZlcjogY29sdW1uLmNlbGxNb3VzZU92ZXIsXG5cdFx0XHRcdGNlbGxNb3VzZU91dDogY29sdW1uLmNlbGxNb3VzZU91dCxcblx0XHRcdFx0Y29sdW1uQ2xpY2s6IGNvbHVtbi5jb2x1bW5DbGljayxcblx0XHRcdFx0Y29sdW1uOiBjb2x1bW5OYW1lLFxuXHRcdFx0XHRoaWdobGlnaHQ6IGNvbHVtbi5oaWdobGlnaHQsXG5cdFx0XHRcdG1pbldpZHRoOiBjb2x1bW4ubWluV2lkdGgsXG5cdFx0XHRcdG1vZGVsOiB0aGlzLm1vZGVsLFxuXHRcdFx0XHRzb3J0OiBjb2x1bW4uc29ydCxcblx0XHRcdFx0c3RpY2t5SGlnaGxpZ2h0OiBjb2x1bW4uc3RpY2t5SGlnaGxpZ2h0LFxuXHRcdFx0XHRlc2NhcGU6IEJvb2xlYW4oY29sdW1uLmVzY2FwZSksXG5cdFx0XHR9KTtcblxuXHRcdFx0bGV0IHZhbHVlID0gXCJcIjtcblxuXHRcdFx0aWYgKHRoaXMubW9kZWwuaGFzKGNvbHVtbk5hbWUpKVxuXHRcdFx0XHR2YWx1ZSA9IHRoaXMubW9kZWwuZ2V0KGNvbHVtbk5hbWUpO1xuXHRcdFx0ZWxzZSBpZiAoY29sdW1uLmFjY2Vzc29yKVxuXHRcdFx0XHR2YWx1ZSA9IGNvbHVtbi5hY2Nlc3Nvcihjb2x1bW5OYW1lLCB0aGlzLm1vZGVsKTtcblx0XHRcdGVsc2UgaWYgKGNvbHVtbi5hY3Rpb25zKVxuXHRcdFx0XHR2YWx1ZSA9IHsgYWN0aW9uczogbmV3IEJhY2tib25lLkNvbGxlY3Rpb24oY29sdW1uLmFjdGlvbnMpIH07XG5cblx0XHRcdHZhbHVlTW9kZWwuc2V0KFwidmFsdWVcIiwgdmFsdWUpO1xuXG5cdFx0XHRpZiAoIXRoaXMubW9kZWwuaGFzKGNvbHVtbk5hbWUpICYmIGNvbHVtbi5hY2Nlc3Nvcikge1xuXHRcdFx0XHR0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsIFwiY2hhbmdlXCIsICgpID0+IHtcblx0XHRcdFx0XHR2YWx1ZU1vZGVsLnNldChcInZhbHVlXCIsIGNvbHVtbi5hY2Nlc3Nvcihjb2x1bW5OYW1lLCB0aGlzLm1vZGVsLCBcImNoYW5nZVwiKSk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwgXCJyZXF1ZXN0XCIsICgpID0+IHtcblx0XHRcdFx0XHR2YWx1ZU1vZGVsLnNldChcInZhbHVlXCIsIGNvbHVtbi5hY2Nlc3Nvcihjb2x1bW5OYW1lLCB0aGlzLm1vZGVsLCBcInJlcXVlc3RcIikpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHR0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsIFwic3luY1wiLCAoKSA9PiB7XG5cdFx0XHRcdFx0dmFsdWVNb2RlbC5zZXQoXCJ2YWx1ZVwiLCBjb2x1bW4uYWNjZXNzb3IoY29sdW1uTmFtZSwgdGhpcy5tb2RlbCwgXCJzeW5jXCIpKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCBcImVycm9yXCIsICgpID0+IHtcblx0XHRcdFx0XHR2YWx1ZU1vZGVsLnNldChcInZhbHVlXCIsIGNvbHVtbi5hY2Nlc3Nvcihjb2x1bW5OYW1lLCB0aGlzLm1vZGVsLCBcImVycm9yXCIpKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB2YWx1ZU1vZGVsO1xuXHRcdH0pKTtcblx0fSxcblxuXHR1bnN0aWNrSGlnaGxpZ2h0OiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5oaWdobGlnaHRTdHVjaykge1xuXHRcdFx0dGhpcy5oaWdobGlnaHRTdHVjayA9IGZhbHNlO1xuXG5cdFx0XHR0aGlzLmNoaWxkcmVuLmVhY2goY2hpbGRWaWV3ID0+IHtcblx0XHRcdFx0Y2hpbGRWaWV3LnRyaWdnZXIoXCJsb3dsaWdodFwiKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHRoaXMuY2hpbGRyZW4uZWFjaChjaGlsZFZpZXcgPT4ge1xuXHRcdFx0Y2hpbGRWaWV3LnRyaWdnZXIoXCJ1bnN0aWNrSGlnaGxpZ2h0XCIpO1xuXHRcdH0pO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKHRoaXMubW9kZWwpO1xuXHRcdHRoaXMub2ZmKFwidW5zdGlja0hpZ2hsaWdodFwiKTtcblx0fSxcbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IEJvZHlWaWV3ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5Db2xsZWN0aW9uVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcInRib2R5XCIsXG5cdGNsYXNzTmFtZTogXCJncmlkLWJhY2stdGFibGUtYm9keVwiLFxuXG5cdGNoaWxkVmlldzogUm93VmlldyxcblxuXHRjaGlsZFZpZXdPcHRpb25zOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0Y2hpbGRWaWV3OiBWYWx1ZVZpZXcsXG5cdFx0XHRjb2x1bW5zOiB0aGlzLkNvbHVtbnMsXG5cdFx0fTtcblx0fSxcblxuXHRjaGlsZFZpZXdFdmVudHM6IHtcblx0XHRjbGljazogZnVuY3Rpb24oKSB7XG5cdFx0XHR0aGlzLmNoaWxkcmVuLmVhY2gocm93VmlldyA9PiB7XG5cdFx0XHRcdHJvd1ZpZXcudHJpZ2dlcihcImRlc2VsZWN0XCIpO1xuXHRcdFx0fSk7XG5cdFx0fSxcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5Db2x1bW5zID0gb3B0aW9ucy5jb2x1bW5zO1xuXG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmNvbGxlY3Rpb24sIFwicmVzZXRcIiwgKCkgPT4ge1xuXHRcdFx0dGhpcy5jb2xsZWN0aW9uLmVhY2gobW9kZWwgPT4ge1xuXHRcdFx0XHRtb2RlbC50cmlnZ2VyKFwiZ3JpZEJhY2s6cmVmcmVzaFwiKTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKHRoaXMuY29sbGVjdGlvbik7XG5cdH0sXG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBIZWFkZXJWaWV3ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5Db2xsZWN0aW9uVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcInRoZWFkXCIsXG5cdGNsYXNzTmFtZTogXCJncmlkLWJhY2stdGFibGUtaGVhZGVyXCIsXG5cblx0Y2hpbGRWaWV3OiBSb3dWaWV3LFxuXG5cdGNoaWxkVmlld09wdGlvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRjaGlsZFZpZXc6IExhYmVsVmlldyxcblx0XHRcdGNvbHVtbnM6IHRoaXMuQ29sdW1ucyxcblx0XHRcdGhlYWRlcjogdHJ1ZSxcblx0XHR9O1xuXHR9LFxuXG5cdGNoaWxkVmlld0V2ZW50czoge1xuXHRcdHNvcnQ6IGZ1bmN0aW9uKG9yZGVyLCBjcml0ZXJpb24pIHtcblx0XHRcdHRoaXMudHJpZ2dlcihcInNvcnRcIiwgb3JkZXIsIGNyaXRlcmlvbik7XG5cdFx0fSxcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5Db2x1bW5zID0gb3B0aW9ucy5jb2x1bW5zO1xuXG5cdFx0bGV0IHVubGFiZWxsZWRDb3VudGVyID0gMDtcblxuXHRcdHRoaXMuY29sbGVjdGlvbiA9IG5ldyBCYWNrYm9uZS5Db2xsZWN0aW9uKFtuZXcgR3JpZFJvd01vZGVsKF8ucmVkdWNlKHRoaXMuQ29sdW1ucywgKGFjY3VtdWxhdG9yLCBjb2x1bW4pID0+IHtcblx0XHRcdGFjY3VtdWxhdG9yW2NvbHVtbi5uYW1lID8gY29sdW1uLm5hbWUgOiBcIl9cIiArIHVubGFiZWxsZWRDb3VudGVyKytdID0gY29sdW1uLnRpdGxlO1xuXHRcdFx0cmV0dXJuIGFjY3VtdWxhdG9yO1xuXHRcdH0sIHt9KSldKTtcblx0fSxcbn0pO1xuXG5jb25zdCBDb3VudGVyVmlldyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwiZ3JpZC1iYWNrLWNvdW50ZXJcIixcblxuXHR0ZW1wbGF0ZTogZmFsc2UsXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuaWQgPSBvcHRpb25zLmlkID8gb3B0aW9ucy5pZCA6IHVuZGVmaW5lZDtcblx0XHR0aGlzLkxhYmVsID0gb3B0aW9ucy5sYWJlbDtcblxuXHRcdHRoaXMuUGFnZWRDb2xsZWN0aW9uID0gb3B0aW9ucy5wYWdlZENvbGxlY3Rpb247XG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLlBhZ2VkQ29sbGVjdGlvbiwgXCJyZXNldFwiLCB0aGlzLnVwZGF0ZS5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuUGFnZWRDb2xsZWN0aW9uLCBcInN5bmNcIiwgdGhpcy51cGRhdGUuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudXBkYXRlKCk7XG5cdH0sXG5cblx0dXBkYXRlOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBmaXJzdFJlY29yZCA9ICh0aGlzLlBhZ2VkQ29sbGVjdGlvbi5zdGF0ZS5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5QYWdlZENvbGxlY3Rpb24uc3RhdGUucGFnZVNpemUgKyAxO1xuXHRcdGxldCBsYXN0UmVjb3JkID0gdGhpcy5QYWdlZENvbGxlY3Rpb24uc3RhdGUuY3VycmVudFBhZ2UgKiB0aGlzLlBhZ2VkQ29sbGVjdGlvbi5zdGF0ZS5wYWdlU2l6ZTtcblxuXHRcdGlmIChsYXN0UmVjb3JkID4gdGhpcy5QYWdlZENvbGxlY3Rpb24uc3RhdGUudG90YWxSZWNvcmRzKVxuXHRcdFx0bGFzdFJlY29yZCA9IHRoaXMuUGFnZWRDb2xsZWN0aW9uLnN0YXRlLnRvdGFsUmVjb3JkcztcblxuXHRcdGxldCB0ZXh0ID0gdGhpcy5MYWJlbCArIFwiIFwiICsgZmlyc3RSZWNvcmQgKyBcIiAtIFwiICsgbGFzdFJlY29yZCArIFwiIG9mIFwiICsgdGhpcy5QYWdlZENvbGxlY3Rpb24uc3RhdGUudG90YWxSZWNvcmRzO1xuXG5cdFx0aWYgKHRoaXMuUGFnZWRDb2xsZWN0aW9uLnN0YXRlLnRvdGFsUmVjb3JkcyA9PT0gbnVsbClcblx0XHRcdHRleHQgPSBcIlwiO1xuXG5cdFx0dGhpcy4kZWwudGV4dCh0ZXh0KTtcblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLlBhZ2VkQ29sbGVjdGlvbik7XG5cdH0sXG59KTtcblxuY29uc3QgTmF2aWdhdG9yVmlldyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwiZ3JpZC1iYWNrLW5hdmlnYXRvclwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi90ZW1wbGF0ZXMvZ3JpZEJhY2subnVualwiKS5uYXZpZ2F0b3IsXG5cblx0dWk6IHtcblx0XHRidXR0b25GYXN0UHJldmlvdXM6IFwiLmdyaWQtYmFjay1mYXN0LXByZXZpb3VzXCIsXG5cdFx0YnV0dG9uUHJldmlvdXM6IFwiLmdyaWQtYmFjay1wcmV2aW91c1wiLFxuXHRcdGJ1dHRvbk5leHQ6IFwiLmdyaWQtYmFjay1uZXh0XCIsXG5cdFx0YnV0dG9uRmFzdE5leHQ6IFwiLmdyaWQtYmFjay1mYXN0LW5leHRcIixcblxuXHRcdHBhZ2VCdXR0b25Db250YWluZXI6IFwiLnBhZ2UtYnV0dG9uLWNvbnRhaW5lclwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmJ1dHRvbkZhc3RQcmV2aW91c1wiOiBcIm9uQnV0dG9uRmFzdFByZXZpb3VzQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5idXR0b25QcmV2aW91c1wiOiBcIm9uQnV0dG9uUHJldmlvdXNDbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmJ1dHRvbk5leHRcIjogXCJvbkJ1dHRvbk5leHRDbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmJ1dHRvbkZhc3ROZXh0XCI6IFwib25CdXR0b25GYXN0TmV4dENsaWNrXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuaWQgPSBvcHRpb25zLmlkID8gb3B0aW9ucy5pZCA6IHVuZGVmaW5lZDtcblxuXHRcdHRoaXMuUGFnZWRDb2xsZWN0aW9uID0gb3B0aW9ucy5wYWdlZENvbGxlY3Rpb247XG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLlBhZ2VkQ29sbGVjdGlvbiwgXCJyZXNldFwiLCAoKSA9PiB7XG5cdFx0XHR0aGlzLnVwZGF0ZVBhZ2VCdXR0b25zKCk7XG5cdFx0XHR0aGlzLnVwZGF0ZUJ1dHRvbnMoKTtcblx0XHR9KTtcblxuXHRcdHRoaXMuUGFnZUJ1dHRvbkNvbGxlY3Rpb24gPSBuZXcgQmFja2JvbmUuQ29sbGVjdGlvbihfLm1hcChfLnJhbmdlKHRoaXMuUGFnZWRDb2xsZWN0aW9uLnN0YXRlLnRvdGFsUGFnZXMpLCBwYWdlSW5kZXggPT4ge1xuXHRcdFx0Y29uc3Qgb2Zmc2V0ID0gdGhpcy5QYWdlZENvbGxlY3Rpb24uc3RhdGUuZmlyc3RQYWdlO1xuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRpbmRleDogcGFnZUluZGV4ICsgb2Zmc2V0LFxuXHRcdFx0XHRsYWJlbDogb2Zmc2V0ID09PSAwID8gcGFnZUluZGV4ICsgMSA6IHBhZ2VJbmRleCArIG9mZnNldCxcblx0XHRcdH07XG5cdFx0fSkpO1xuXG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLlBhZ2VCdXR0b25Db2xsZWN0aW9uLCBcIm5hdmlnYXRlXCIsIHRoaXMub25OYXZpZ2F0ZS5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG5cdFx0dGhpcy5QYWdlQnV0dG9ucyA9IG5ldyBQYWdlQnV0dG9ucyh7IGNvbGxlY3Rpb246IHRoaXMuUGFnZUJ1dHRvbkNvbGxlY3Rpb24gfSk7XG5cdFx0dGhpcy51aS5wYWdlQnV0dG9uQ29udGFpbmVyLmFwcGVuZCh0aGlzLlBhZ2VCdXR0b25zLnJlbmRlcigpLiRlbCk7XG5cblx0XHR0aGlzLnVwZGF0ZVBhZ2VCdXR0b25zKCk7XG5cdFx0dGhpcy51cGRhdGVCdXR0b25zKCk7XG5cdH0sXG5cblx0dXBkYXRlUGFnZUJ1dHRvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuUGFnZUJ1dHRvbkNvbGxlY3Rpb24udHJpZ2dlcihcImhpZGVBbGxcIik7XG5cdFx0dGhpcy5QYWdlQnV0dG9uQ29sbGVjdGlvbi50cmlnZ2VyKFwibG93bGlnaHRBbGxcIik7XG5cblx0XHR0aGlzLlBhZ2VCdXR0b25Db2xsZWN0aW9uLmVhY2gocGFnZUJ1dHRvbk1vZGVsID0+IHtcblx0XHRcdGNvbnN0IHBhZ2VCdXR0b25JbmRleCA9IHBhZ2VCdXR0b25Nb2RlbC5nZXQoXCJpbmRleFwiKTtcblx0XHRcdGNvbnN0IGZpcnN0UGFnZSA9IHRoaXMuUGFnZWRDb2xsZWN0aW9uLnN0YXRlLmZpcnN0UGFnZTtcblx0XHRcdGNvbnN0IGN1cnJlbnRQYWdlID0gdGhpcy5QYWdlZENvbGxlY3Rpb24uc3RhdGUuY3VycmVudFBhZ2U7XG5cdFx0XHRjb25zdCBsYXN0UGFnZSA9IHRoaXMuUGFnZWRDb2xsZWN0aW9uLnN0YXRlLmxhc3RQYWdlO1xuXG5cdFx0XHRpZiAocGFnZUJ1dHRvbkluZGV4ID09PSBjdXJyZW50UGFnZSAtIDEgfHxcblx0XHRcdFx0Y3VycmVudFBhZ2UgPT09IGxhc3RQYWdlICYmIHBhZ2VCdXR0b25JbmRleCA9PT0gY3VycmVudFBhZ2UgLSAyKSB7XG5cdFx0XHRcdHBhZ2VCdXR0b25Nb2RlbC50cmlnZ2VyKFwic2hvd1wiKTtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKHBhZ2VCdXR0b25JbmRleCA9PT0gY3VycmVudFBhZ2UpIHtcblx0XHRcdFx0cGFnZUJ1dHRvbk1vZGVsLnRyaWdnZXIoXCJzaG93XCIpO1xuXHRcdFx0XHRwYWdlQnV0dG9uTW9kZWwudHJpZ2dlcihcImhpZ2hsaWdodFwiKTtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKHBhZ2VCdXR0b25JbmRleCA9PT0gY3VycmVudFBhZ2UgKyAxIHx8XG5cdFx0XHRcdGN1cnJlbnRQYWdlID09PSBmaXJzdFBhZ2UgJiYgcGFnZUJ1dHRvbkluZGV4ID09PSBjdXJyZW50UGFnZSArIDIpIHtcblx0XHRcdFx0cGFnZUJ1dHRvbk1vZGVsLnRyaWdnZXIoXCJzaG93XCIpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9LFxuXG5cdHVwZGF0ZUJ1dHRvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLlBhZ2VkQ29sbGVjdGlvbi5oYXNQcmV2aW91c1BhZ2UoKSkge1xuXHRcdFx0dGhpcy51aS5idXR0b25GYXN0UHJldmlvdXMucHJvcChcImRpc2FibGVkXCIsIGZhbHNlKTtcblx0XHRcdHRoaXMudWkuYnV0dG9uUHJldmlvdXMucHJvcChcImRpc2FibGVkXCIsIGZhbHNlKTtcblx0XHRcdHRoaXMudWkuYnV0dG9uRmFzdFByZXZpb3VzLmFkZENsYXNzKFwiZ3JpZC1iYWNrLWJ1dHRvbi1lbmFibGVkXCIpO1xuXHRcdFx0dGhpcy51aS5idXR0b25QcmV2aW91cy5hZGRDbGFzcyhcImdyaWQtYmFjay1idXR0b24tZW5hYmxlZFwiKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLnVpLmJ1dHRvbkZhc3RQcmV2aW91cy5wcm9wKFwiZGlzYWJsZWRcIiwgdHJ1ZSk7XG5cdFx0XHR0aGlzLnVpLmJ1dHRvblByZXZpb3VzLnByb3AoXCJkaXNhYmxlZFwiLCB0cnVlKTtcblx0XHRcdHRoaXMudWkuYnV0dG9uRmFzdFByZXZpb3VzLnJlbW92ZUNsYXNzKFwiZ3JpZC1iYWNrLWJ1dHRvbi1lbmFibGVkXCIpO1xuXHRcdFx0dGhpcy51aS5idXR0b25QcmV2aW91cy5yZW1vdmVDbGFzcyhcImdyaWQtYmFjay1idXR0b24tZW5hYmxlZFwiKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5QYWdlZENvbGxlY3Rpb24uaGFzTmV4dFBhZ2UoKSkge1xuXHRcdFx0dGhpcy51aS5idXR0b25OZXh0LnByb3AoXCJkaXNhYmxlZFwiLCBmYWxzZSk7XG5cdFx0XHR0aGlzLnVpLmJ1dHRvbkZhc3ROZXh0LnByb3AoXCJkaXNhYmxlZFwiLCBmYWxzZSk7XG5cdFx0XHR0aGlzLnVpLmJ1dHRvbk5leHQuYWRkQ2xhc3MoXCJncmlkLWJhY2stYnV0dG9uLWVuYWJsZWRcIik7XG5cdFx0XHR0aGlzLnVpLmJ1dHRvbkZhc3ROZXh0LmFkZENsYXNzKFwiZ3JpZC1iYWNrLWJ1dHRvbi1lbmFibGVkXCIpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMudWkuYnV0dG9uTmV4dC5wcm9wKFwiZGlzYWJsZWRcIiwgdHJ1ZSk7XG5cdFx0XHR0aGlzLnVpLmJ1dHRvbkZhc3ROZXh0LnByb3AoXCJkaXNhYmxlZFwiLCB0cnVlKTtcblx0XHRcdHRoaXMudWkuYnV0dG9uTmV4dC5yZW1vdmVDbGFzcyhcImdyaWQtYmFjay1idXR0b24tZW5hYmxlZFwiKTtcblx0XHRcdHRoaXMudWkuYnV0dG9uRmFzdE5leHQucmVtb3ZlQ2xhc3MoXCJncmlkLWJhY2stYnV0dG9uLWVuYWJsZWRcIik7XG5cdFx0fVxuXHR9LFxuXG5cdG9uQnV0dG9uRmFzdFByZXZpb3VzQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuUGFnZWRDb2xsZWN0aW9uLmdldEZpcnN0UGFnZSgpO1xuXHR9LFxuXG5cdG9uQnV0dG9uUHJldmlvdXNDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5QYWdlZENvbGxlY3Rpb24uZ2V0UHJldmlvdXNQYWdlKCk7XG5cdH0sXG5cblx0b25CdXR0b25OZXh0Q2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuUGFnZWRDb2xsZWN0aW9uLmdldE5leHRQYWdlKCk7XG5cdH0sXG5cblx0b25CdXR0b25GYXN0TmV4dENsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLlBhZ2VkQ29sbGVjdGlvbi5nZXRMYXN0UGFnZSgpO1xuXHR9LFxuXG5cdG9uTmF2aWdhdGU6IGZ1bmN0aW9uKHBhZ2VCdXR0b25Nb2RlbCkge1xuXHRcdHRoaXMuUGFnZWRDb2xsZWN0aW9uLmdldFBhZ2UocGFnZUJ1dHRvbk1vZGVsLmdldChcImluZGV4XCIpKTtcblxuXHRcdHRoaXMudXBkYXRlQnV0dG9ucygpO1xuXHRcdHRoaXMudXBkYXRlUGFnZUJ1dHRvbnMoKTtcblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuUGFnZUJ1dHRvbnMuZGVzdHJveSgpO1xuXHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLlBhZ2VkQ29sbGVjdGlvbik7XG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKHRoaXMuUGFnZUJ1dHRvbkNvbGxlY3Rpb24pO1xuXHR9LFxufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogXCJkaXZcIixcblx0Y2xhc3NOYW1lOiBcImdyaWQtYmFja1wiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi90ZW1wbGF0ZXMvZ3JpZEJhY2subnVualwiKS5ncmlkLFxuXG5cdHVpOiB7XG5cdFx0dGFibGU6IFwidGFibGUuZ3JpZC1iYWNrLXRhYmxlXCIsXG5cdFx0ZmlsdGVyQ29udGFpbmVyOiBcIi5ncmlkLWJhY2stZmlsdGVyLWNvbnRhaW5lclwiLFxuXHRcdGNvdW50ZXJDb250YWluZXI6IFwiLmdyaWQtYmFjay1jb3VudGVyLWNvbnRhaW5lclwiLFxuXHRcdG5hdmlnYXRvckNvbnRhaW5lcjogXCIuZ3JpZC1iYWNrLW5hdmlnYXRvci1jb250YWluZXJcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5Cb3JkZXJsZXNzID0gb3B0aW9ucy5ib3JkZXJsZXNzO1xuXG5cdFx0dGhpcy5Db2x1bW5zID0gb3B0aW9ucy5jb2x1bW5zO1xuXG5cdFx0dGhpcy5PcmlnaW5hbENvbGxlY3Rpb24gPSB0aGlzLmNvbGxlY3Rpb247XG5cdFx0dGhpcy5GaWx0ZXJlZENvbGxlY3Rpb24gPSBuZXcgQmFja2JvbmUuVmlydHVhbENvbGxlY3Rpb24odGhpcy5PcmlnaW5hbENvbGxlY3Rpb24pO1xuXG5cdFx0dGhpcy5QYWdpbmdEaXNhYmxlZCA9IG9wdGlvbnMucGFnaW5nRGlzYWJsZWQ7XG5cblx0XHRpZiAodGhpcy5QYWdpbmdEaXNhYmxlZCkge1xuXHRcdFx0dGhpcy5jb2xsZWN0aW9uID0gdGhpcy5GaWx0ZXJlZENvbGxlY3Rpb247XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0Y29uc3QgUGFnZWRDb2xsZWN0aW9uID0gQmFja2JvbmUuUGFnZWFibGVDb2xsZWN0aW9uLmV4dGVuZCh7XG5cdFx0XHRcdG1vZGVsOiBvcHRpb25zLmNvbGxlY3Rpb24ubW9kZWwsXG5cdFx0XHRcdHVybDogb3B0aW9ucy5jb2xsZWN0aW9uLnVybCxcblxuXHRcdFx0XHRzdGF0ZToge1xuXHRcdFx0XHRcdHBhZ2VTaXplOiBvcHRpb25zLnBhZ2VTaXplIHx8IDYsXG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0bW9kZTogXCJjbGllbnRcIixcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLmNvbGxlY3Rpb24gPSBuZXcgUGFnZWRDb2xsZWN0aW9uKHRoaXMuRmlsdGVyZWRDb2xsZWN0aW9uLm1vZGVscyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLk9yaWdpbmFsQ29sbGVjdGlvbiwgXCJyZXNldFwiLCAoKSA9PiB7XG5cdFx0XHRpZiAoIXRoaXMuUGFnaW5nRGlzYWJsZWQpXG5cdFx0XHRcdHRoaXMuY29sbGVjdGlvbi5mdWxsQ29sbGVjdGlvbi50cmlnZ2VyKFwicmVzZXRcIiwgdGhpcy5jb2xsZWN0aW9uLCB7IHNpbGVudDogZmFsc2UgfSk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLkNvdW50ZXJEaXNhYmxlZCA9IEJvb2xlYW4ob3B0aW9ucy5jb3VudGVyRGlzYWJsZWQpO1xuXHRcdHRoaXMuQ291bnRlckNvbnRhaW5lciA9IG9wdGlvbnMuY291bnRlckNvbnRhaW5lciB8fCB0aGlzLnVpLmNvdW50ZXJDb250YWluZXI7XG5cdFx0dGhpcy5Db3VudGVySUQgPSBvcHRpb25zLmNvdW50ZXJJRCB8fCBudWxsO1xuXHRcdHRoaXMuQ291bnRlckxhYmVsID0gb3B0aW9ucy5jb3VudGVyTGFiZWwgfHwgXCJSZWNvcmRcIjtcblxuXHRcdHRoaXMuTmF2aWdhdG9yRGlzYWJsZWQgPSBCb29sZWFuKG9wdGlvbnMubmF2aWdhdG9yRGlzYWJsZWQpO1xuXHRcdHRoaXMuTmF2aWdhdG9yQ29udGFpbmVyID0gb3B0aW9ucy5uYXZpZ2F0b3JDb250YWluZXIgfHwgdGhpcy51aS5uYXZpZ2F0b3JDb250YWluZXI7XG5cdFx0dGhpcy5OYXZpZ2F0b3JJRCA9IG9wdGlvbnMubmF2aWdhdG9ySUQgfHwgbnVsbDtcblxuXHRcdHRoaXMuRmlsdGVyRGlzYWJsZWQgPSBCb29sZWFuKG9wdGlvbnMuZmlsdGVyRGlzYWJsZWQpO1xuXHRcdHRoaXMuRmlsdGVyT3B0aW9ucyA9IG9wdGlvbnMuZmlsdGVyT3B0aW9ucyB8fCBudWxsO1xuXHRcdHRoaXMuRmlsdGVyQ29udGFpbmVyID0gb3B0aW9ucy5maWx0ZXJDb250YWluZXIgfHwgdGhpcy51aS5maWx0ZXJDb250YWluZXI7XG5cdFx0dGhpcy5GaWx0ZXJJRCA9IG9wdGlvbnMuZmlsdGVySUQgfHwgbnVsbDtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gU2V0IHN0eWxlIG9wdGlvbnNcblx0XHRpZiAodGhpcy5Cb3JkZXJsZXNzKVxuXHRcdFx0dGhpcy4kZWwuYWRkQ2xhc3MoXCJib3JkZXJsZXNzXCIpO1xuXG5cdFx0Ly8gQ29uc3RydWN0IHRoZSBoZWFkZXJcblx0XHR0aGlzLmhlYWRlclZpZXcgPSBuZXcgSGVhZGVyVmlldyh7XG5cdFx0XHRjb2x1bW5zOiB0aGlzLkNvbHVtbnMsXG5cdFx0fSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuaGVhZGVyVmlldywgXCJzb3J0XCIsIHRoaXMub25Tb3J0LmJpbmQodGhpcykpO1xuXG5cdFx0dGhpcy51aS50YWJsZS5hcHBlbmQodGhpcy5oZWFkZXJWaWV3LnJlbmRlcigpLiRlbCk7XG5cblx0XHQvLyBDb25zdHJ1Y3QgdGhlIGJvZHlcblx0XHR0aGlzLkJvZHlWaWV3ID0gbmV3IEJvZHlWaWV3KHtcblx0XHRcdGNvbHVtbnM6IHRoaXMuQ29sdW1ucyxcblx0XHRcdGNvbGxlY3Rpb246IHRoaXMuY29sbGVjdGlvbixcblx0XHRcdHJlb3JkZXJPblNvcnQ6IHRydWUsXG5cdFx0fSk7XG5cblx0XHR0aGlzLnVpLnRhYmxlLmFwcGVuZCh0aGlzLkJvZHlWaWV3LnJlbmRlcigpLiRlbCk7XG5cblx0XHQvLyBDb25zdHJ1Y3QgdGhlIGZpbHRlclxuXHRcdGlmICghdGhpcy5GaWx0ZXJEaXNhYmxlZCkge1xuXHRcdFx0dGhpcy5GaWx0ZXIgPSBuZXcgRmlsdGVyQmFjayh0aGlzLkZpbHRlck9wdGlvbnMpO1xuXG5cdFx0XHR0aGlzLmxpc3RlblRvKHRoaXMuRmlsdGVyLCBcImV4ZWN1dGVcIiwgdGhpcy5vbkZpbHRlci5iaW5kKHRoaXMpKTtcblxuXHRcdFx0dGhpcy5GaWx0ZXJDb250YWluZXIucHJlcGVuZCh0aGlzLkZpbHRlci5yZW5kZXIoKS4kZWwpO1xuXHRcdH1cblxuXHRcdC8vIENvbnN0cnVjdCB0aGUgY291bnRlclxuXHRcdGlmICghdGhpcy5Db3VudGVyRGlzYWJsZWQpIHtcblx0XHRcdHRoaXMuQ291bnRlciA9IG5ldyBDb3VudGVyVmlldyh7IHBhZ2VkQ29sbGVjdGlvbjogdGhpcy5jb2xsZWN0aW9uLCBpZDogdGhpcy5Db3VudGVySUQgfHwgdW5kZWZpbmVkLCBsYWJlbDogdGhpcy5Db3VudGVyTGFiZWwgfSk7XG5cdFx0XHR0aGlzLkNvdW50ZXJDb250YWluZXIuYXBwZW5kKHRoaXMuQ291bnRlci5yZW5kZXIoKS4kZWwpO1xuXHRcdH1cblxuXHRcdC8vIENvbnN0cnVjdCB0aGUgbmF2aWdhdG9yXG5cdFx0aWYgKCF0aGlzLk5hdmlnYXRvckRpc2FibGVkKSB7XG5cdFx0XHR0aGlzLk5hdmlnYXRvciA9IG5ldyBOYXZpZ2F0b3JWaWV3KHsgcGFnZWRDb2xsZWN0aW9uOiB0aGlzLmNvbGxlY3Rpb24sIGlkOiB0aGlzLk5hdmlnYXRvcklEIHx8IHVuZGVmaW5lZCB9KTtcblx0XHRcdHRoaXMuTmF2aWdhdG9yQ29udGFpbmVyLmFwcGVuZCh0aGlzLk5hdmlnYXRvci5yZW5kZXIoKS4kZWwpO1xuXHRcdH1cblxuXHRcdHRoaXMudHJpZ2dlcihcImdyaWQ6b25TaG93XCIpO1xuXHR9LFxuXG5cdG9uRmlsdGVyOiBmdW5jdGlvbihmaWx0ZXIpIHtcblx0XHR0aGlzLkZpbHRlcmVkQ29sbGVjdGlvbi51cGRhdGVGaWx0ZXIoZmlsdGVyKTtcblxuXHRcdGlmICghdGhpcy5QYWdpbmdEaXNhYmxlZClcblx0XHRcdHRoaXMuY29sbGVjdGlvbi5mdWxsQ29sbGVjdGlvbi5yZXNldCh0aGlzLkZpbHRlcmVkQ29sbGVjdGlvbi5tb2RlbHMpO1xuXHR9LFxuXG5cdG9uU29ydDogZnVuY3Rpb24ob3JkZXIsIGNyaXRlcmlvbikge1xuXHRcdGNvbnN0IGRlZmF1bHRDb21wYXJhdG9yID0gZnVuY3Rpb24obW9kZWwpIHtcblx0XHRcdHJldHVybiBtb2RlbC5jaWQ7XG5cdFx0fTtcblxuXHRcdGlmICghdGhpcy5wcmVzZXJ2ZWRDb21wYXJhdG9yICYmIHRoaXMuY29sbGVjdGlvbi5jb21wYXJhdG9yKVxuXHRcdFx0dGhpcy5wcmVzZXJ2ZWRDb21wYXJhdG9yID0gdGhpcy5jb2xsZWN0aW9uLmNvbXBhcmF0b3I7XG5cblx0XHRpZiAob3JkZXIgPT09IFwiZGVmYXVsdFwiKSB7XG5cdFx0XHRpZiAodGhpcy5wcmVzZXJ2ZWRDb21wYXJhdG9yKSB7XG5cdFx0XHRcdHRoaXMuY29sbGVjdGlvbi5jb21wYXJhdG9yID0gdGhpcy5wcmVzZXJ2ZWRDb21wYXJhdG9yO1xuXG5cdFx0XHRcdHRoaXMucHJlc2VydmVkQ29tcGFyYXRvciA9IG51bGw7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0dGhpcy5jb2xsZWN0aW9uLmNvbXBhcmF0b3IgPSBkZWZhdWx0Q29tcGFyYXRvcjtcblx0XHRcdH1cblx0XHR9XG5cdFx0ZWxzZSBpZiAoXy5pc0Z1bmN0aW9uKGNyaXRlcmlvbikpIHtcblx0XHRcdHRoaXMuY29sbGVjdGlvbi5jb21wYXJhdG9yID0gY3JpdGVyaW9uKG9yZGVyKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHQvLyBTdGFydCB3aXRoIGFzY2VuZGluZyBvcmRlci4uLlxuXHRcdFx0bGV0IGx0UmVzdWx0ID0gLTE7XG5cdFx0XHRsZXQgZ3RSZXN1bHQgPSAxO1xuXG5cdFx0XHRpZiAob3JkZXIgPT09IFwiZGVzY2VuZGluZ1wiKSB7XG5cdFx0XHRcdGx0UmVzdWx0ID0gMTtcblx0XHRcdFx0Z3RSZXN1bHQgPSAtMTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgc29ydGluZ0NvbXBhcmF0b3IgPSBmdW5jdGlvbihmaXJzdE1vZGVsLCBzZWNvbmRNb2RlbCkge1xuXHRcdFx0XHRsZXQgcmVzdWx0ID0gMDtcblxuXHRcdFx0XHRsZXQgZmlyc3RWYWx1ZSA9IGZpcnN0TW9kZWwuZ2V0KGNyaXRlcmlvbik7XG5cdFx0XHRcdGxldCBzZWNvbmRWYWx1ZSA9IHNlY29uZE1vZGVsLmdldChjcml0ZXJpb24pO1xuXG5cdFx0XHRcdGlmIChfLmlzU3RyaW5nKGZpcnN0VmFsdWUpKVxuXHRcdFx0XHRcdGZpcnN0VmFsdWUgPSBmaXJzdFZhbHVlLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdFx0aWYgKF8uaXNTdHJpbmcoc2Vjb25kVmFsdWUpKVxuXHRcdFx0XHRcdHNlY29uZFZhbHVlID0gc2Vjb25kVmFsdWUudG9Mb3dlckNhc2UoKTtcblxuXHRcdFx0XHRpZiAoZmlyc3RWYWx1ZSA8IHNlY29uZFZhbHVlKVxuXHRcdFx0XHRcdHJlc3VsdCA9IGx0UmVzdWx0O1xuXHRcdFx0XHRlbHNlIGlmIChmaXJzdFZhbHVlID4gc2Vjb25kVmFsdWUpXG5cdFx0XHRcdFx0cmVzdWx0ID0gZ3RSZXN1bHQ7XG5cblx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdH07XG5cblx0XHRcdHRoaXMuY29sbGVjdGlvbi5jb21wYXJhdG9yID0gc29ydGluZ0NvbXBhcmF0b3I7XG5cdFx0fVxuXG5cdFx0dGhpcy5jb2xsZWN0aW9uLnNvcnQoKTtcblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLkZpbHRlcik7XG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKHRoaXMuaGVhZGVyVmlldyk7XG5cblx0XHRpZiAodGhpcy5Db3VudGVyKVxuXHRcdFx0dGhpcy5Db3VudGVyLmRlc3Ryb3koKTtcblxuXHRcdGlmICh0aGlzLk5hdmlnYXRvcilcblx0XHRcdHRoaXMuTmF2aWdhdG9yLmRlc3Ryb3koKTtcblxuXHRcdHRoaXMuQm9keVZpZXcuZGVzdHJveSgpO1xuXG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKHRoaXMuT3JpZ2luYWxDb2xsZWN0aW9uKTtcblx0fSxcbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuY29uc3QgUGFnZUJ1dHRvbiA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZ3JpZC1iYWNrLXBhZ2UtYnV0dG9uXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9ncmlkQmFjay5udW5qXCIpLnBhZ2VCdXR0b24sXG5cblx0ZXZlbnRzOiB7XG5cdFx0Y2xpY2s6IFwib25DbGlja1wiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMub24oXCJoaWRlXCIsIHRoaXMub25IaWRlLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwgXCJzaG93XCIsIHRoaXMub25TaG93LmJpbmQodGhpcykpO1xuXG5cdFx0dGhpcy5vbihcImxvd2xpZ2h0XCIsIHRoaXMub25Mb3dsaWdodC5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsIFwiaGlnaGxpZ2h0XCIsIHRoaXMub25IaWdobGlnaHQuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0b25DbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5tb2RlbC50cmlnZ2VyKFwibmF2aWdhdGVcIiwgdGhpcy5tb2RlbCk7XG5cdH0sXG5cblx0b25IaWRlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRvbkxvd2xpZ2h0OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyhcImdyaWQtYmFjay1wYWdlLWJ1dHRvbi1oaWdobGlnaHRcIik7XG5cdH0sXG5cblx0b25IaWdobGlnaHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuJGVsLmFkZENsYXNzKFwiZ3JpZC1iYWNrLXBhZ2UtYnV0dG9uLWhpZ2hsaWdodFwiKTtcblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMub2ZmKFwiaGlkZVwiKTtcblx0XHR0aGlzLm9mZihcImxvd2xpZ2h0XCIpO1xuXHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLm1vZGVsKTtcblx0fSxcbn0pO1xuXG5jb25zdCBQYWdlQnV0dG9ucyA9IEJhY2tib25lLk1hcmlvbmV0dGUuQ29sbGVjdGlvblZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImdyaWQtYmFjay1wYWdlLWJ1dHRvbnNcIixcblxuXHRjaGlsZFZpZXc6IFBhZ2VCdXR0b24sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmNvbGxlY3Rpb24sIFwiaGlkZUFsbFwiLCB0aGlzLmhpZGVDaGlsZHJlbi5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuY29sbGVjdGlvbiwgXCJsb3dsaWdodEFsbFwiLCB0aGlzLmxvd2xpZ2h0Q2hpbGRyZW4uYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0aGlkZUNoaWxkcmVuOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmNoaWxkcmVuLmVhY2goY2hpbGRWaWV3ID0+IHtcblx0XHRcdGNoaWxkVmlldy50cmlnZ2VyKFwiaGlkZVwiKTtcblx0XHR9KTtcblx0fSxcblxuXHRsb3dsaWdodENoaWxkcmVuOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmNoaWxkcmVuLmVhY2goY2hpbGRWaWV3ID0+IHtcblx0XHRcdGNoaWxkVmlldy50cmlnZ2VyKFwibG93bGlnaHRcIik7XG5cdFx0fSk7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcodGhpcy5jb2xsZWN0aW9uKTtcblx0fSxcbn0pO1xuXG5cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIl19",
    "\"use strict\";\n\n(function (root, factory) {\n\tif (typeof exports !== \"undefined\") {\n\t\tmodule.exports = factory();\n\t} else {\n\t\troot.Iago = factory();\n\t}\n})(undefined, function () {\n\t\"use strict\";\n\n\t/*eslint-env browser */\n\n\tvar NativeCustomEvent = window.CustomEvent;\n\n\tvar useNative = function useNative() {\n\t\ttry {\n\t\t\tvar p = new NativeCustomEvent(\"cat\", { detail: { foo: \"bar\" } });\n\t\t\treturn p.type === \"cat\" && p.detail.foo === \"bar\";\n\t\t} catch (e) {\n\t\t\t// Zilch\n\t\t}\n\t\treturn false;\n\t};\n\n\t/**\n  * Cross-browser `CustomEvent` constructor.\n  *\n  * https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent.CustomEvent\n  *\n  * @public\n  */\n\n\tvar NativeCustomEvent = window.CustomEvent;\n\n\tfunction useNative() {\n\t\ttry {\n\t\t\tvar p = new NativeCustomEvent(\"cat\", { detail: { foo: \"bar\" } });\n\t\t\treturn \"cat\" === p.type && \"bar\" === p.detail.foo;\n\t\t} catch (e) {}\n\t\treturn false;\n\t}\n\n\t/**\n  * Cross-browser `CustomEvent` constructor.\n  *\n  * https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent.CustomEvent\n  *\n  * @public\n  */\n\n\tvar eventer = useNative() ? NativeCustomEvent :\n\n\t// IE >= 9\n\t\"function\" === typeof document.createEvent ? function CustomEvent(type, params) {\n\t\tvar e = document.createEvent(\"CustomEvent\");\n\t\tif (params) {\n\t\t\te.initCustomEvent(type, params.bubbles, params.cancelable, params.detail);\n\t\t} else {\n\t\t\te.initCustomEvent(type, false, false, void 0);\n\t\t}\n\t\treturn e;\n\t} :\n\n\t// IE <= 8\n\tfunction CustomEvent(type, params) {\n\t\tvar e = document.createEventObject();\n\t\te.type = type;\n\t\tif (params) {\n\t\t\te.bubbles = Boolean(params.bubbles);\n\t\t\te.cancelable = Boolean(params.cancelable);\n\t\t\te.detail = params.detail;\n\t\t} else {\n\t\t\te.bubbles = false;\n\t\t\te.cancelable = false;\n\t\t\te.detail = void 0;\n\t\t}\n\t\treturn e;\n\t};\n\n\tif (!useNative()) window.CustomEvent = eventer;\n\n\t/*******************************************************************************\n \tGeneral Notes:\n Type 1: Choose the correct option (Feedback + score)\n Type 2: Paragraph Response (Feedback)\n Type 3: Match the options (Feedback + score)\n Type 4: Fill in the blanks (Feedback + score)\n \t*********************************************************************************/\n\n\tvar url;\n\n\t/*******************************************************************************\n \tStart of assessment functionality\n \t*********************************************************************************/\n\n\tvar Iago = function Iago(options) {\n\t\tthis.options = options || {};\n\n\t\tif (!this.options.parent) this.parent = document;else this.parent = this.options.parent;\n\n\t\tthis.loadedBefore = false;\n\t\tthis.landingPageStarted = false;\n\t};\n\n\tIago.prototype.loadUI = function () {\n\t\tvar self = this;\n\n\t\tthis.parent.querySelector(\"#iago-restart-question\").onclick = function () {\n\t\t\tself.restart.call(self);\n\t\t};\n\t\t// this.parent.querySelector(\"#iago-back-to-app\").onclick = function() {\n\t\t// \tself.backToApp.call(self);\n\t\t// };\n\t\tthis.parent.querySelector(\"#iago-complete-question\").onclick = function () {\n\t\t\tself.completeQuestions.call(self);\n\t\t};\n\t\tthis.parent.querySelector(\"#iago-next-question\").onclick = function (evt) {\n\t\t\tself.navigateQuestions.call(self, true, evt);\n\t\t};\n\t\tthis.parent.querySelector(\"#iago-previous-question\").onclick = function (evt) {\n\t\t\tself.navigateQuestions.call(self, false, evt);\n\t\t};\n\t\tthis.parent.querySelector(\"#iago-feedback-question\").onclick = function () {\n\t\t\tself.restartWithFeedback.call(self);\n\t\t};\n\t};\n\n\tIago.prototype.start = function (resource, attachment, opts) {\n\t\tif (!resource) throw new Error(\"No assessment data was provided; cannot start\");\n\n\t\topts = opts || {};\n\n\t\tif (opts.editMode || this.options.editMode) attachment = { settings: { requireCode: false } };\n\n\t\tif ([\"Afrikaans\", \"English\", \"IsiNdebele\", \"Sepedi\", \"Sesotho\", \"Siswati\", \"Setswana\", \"Xitsonga\", \"Tshivenda\", \"IsiXhosa\", \"IsiZulu\"].indexOf(resource.language) === -1) resource.language = \"English\";\n\n\t\tif (typeof resource.questionData === \"string\") resource.questionData = JSON.parse(resource.questionData);\n\n\t\tif (resource.questionData.questionData) {\n\t\t\tresource.code = resource.questionData.code;\n\t\t\tresource.questionData = resource.questionData.questionData;\n\t\t\tresource.payloadVersion = resource.questionData.payloadVersion;\n\t\t}\n\n\t\tif (!opts.editMode && !this.options.editMode && this.landingPageStarted === false) {\n\t\t\tthis.state = {};\n\t\t\tthis.state.previewMode = opts.previewMode || this.options.previewMode;\n\t\t\tthis.loadLandingPage(resource, attachment, opts);\n\t\t\treturn;\n\t\t} else {\n\t\t\tthis.parent.querySelector(\"#iago-assessment\").style.display = \"none\";\n\t\t}\n\n\t\tthis.parent.querySelector(\"#iago-start-question\").style.display = \"none\";\n\n\t\tthis.attachment = attachment;\n\n\t\tif (!this.gotCode && this.attachment.settings.requireCode) {\n\t\t\treturn this.askForCode(resource, attachment, opts);\n\t\t}\n\n\t\tthis.parent.querySelector(\"#iago-code-prompt\").style.display = \"none\";\n\t\tthis.parent.querySelector(\"#iago-assessment\").style.display = \"\";\n\n\t\t// Mock out the Sync operations if they're missing\n\t\tif (!window.Sync) window.Sync = {};\n\n\t\tif (!window.Sync.assessmentTransition) window.Sync.assessmentTransition = function () {};\n\t\tif (!window.Sync.assessmentComplete) window.Sync.assessmentComplete = function () {};\n\n\t\turl = \"/api/1.0/assessments/\" + this.attachment.resource + \"/marks/\" + this.attachment._id;\n\n\t\tthis.loadUI();\n\n\t\tthis.state = {\n\t\t\t// Index of the current question being viewed\n\t\t\tcurrentQuestion: opts.currentQuestion || this.options.currentQuestion || -1,\n\t\t\t// State of all questions answered\n\t\t\tquestions: {},\n\t\t\t// Are we in feedback mode?\n\t\t\tfeedbackMode: opts.feedbackMode || (this.state ? this.state.feedbackMode : !!this.options.feedbackMode),\n\t\t\t// Are we in edit mode?\n\t\t\teditMode: opts.editMode || this.options.editMode,\n\t\t\t// Are we in preview mode?\n\t\t\tpreviewMode: opts.previewMode || this.options.previewMode\n\t\t};\n\n\t\tthis.transition(\"assessment-start\", { resource: resource._id, attachment: attachment._id });\n\n\t\tthis.assessmentData = resource;\n\n\t\tif (!this.state.previewMode && !this.state.editMode && !this.versioned) {\n\t\t\tvar txt = this.parent.querySelector(\"#version\").textContent;\n\t\t\tthis.parent.querySelector(\"#version\").textContent = txt + \"; v\" + this.assessmentData.version;\n\t\t\tthis.versioned = true;\n\t\t}\n\n\t\t// Shuffle the questions - if we're not in either edit or preview modes and\n\t\t// randomization has not been disabled\n\t\tif (!this.loadedBefore && !this.state.editMode && !this.state.previewMode && !this.attachment.settings.disableRandomization) this.assessmentData.questionData = this.shuffle(this.assessmentData.questionData);\n\n\t\t// Shuffle the individual questions' answers, if we're not in edit mode\n\t\tthis.assessmentData.questionData = this.assessmentData.questionData.map(this.prepareQuestion.bind(this));\n\n\t\tthis.feedback = {\n\t\t\tscores: {},\n\t\t\tmarkableCount: resource.questionData.reduce(function (sum, num) {\n\t\t\t\tif (num.type !== 2) sum += 1;\n\t\t\t\treturn sum;\n\t\t\t}, 0),\n\t\t\tmark: 0,\n\t\t\ttime: 0,\n\t\t\tmaxScore: this.getMaxScore()\n\t\t};\n\n\t\tif (!this.state.feedbackMode && !this.state.editMode && this.attachment.settings && this.attachment.settings.serverSave) window.Sync.assessmentTransition(JSON.stringify({ results: this.feedback, activity: this.activity, url: url }));\n\n\t\t// We only run some stuff once to ensure a consistent ordering when going back/forth and also in feedback mode\n\t\tif (!this.state.editMode) {\n\t\t\tthis.loadedBefore = true;\n\t\t\tthis.parent.querySelector(\".progress-container\").style.display = \"\";\n\t\t\tthis.parent.querySelector(\".progress-items\").innerHTML = \"\";\n\t\t\tfor (var i = 1; i < this.assessmentData.questionData.length + 1; i++) {\n\t\t\t\tthis.parent.querySelector(\".progress-items\").innerHTML += \"<div class=\\\"progress-item skipped item-\" + i + \"\\\">\" + i + \"</div>\";\n\t\t\t}\n\t\t\tthis.parent.querySelector(\".progress-items\").innerHTML += \"<div class=\\\"item-complete disabled-button\\\">Complete</div>\";\n\t\t\tthis.parent.querySelector(\".item-complete\").addEventListener(\"click\", this.completeQuestions.bind(this));\n\t\t\tvar items = this.parent.querySelectorAll(\".progress-item\");\n\t\t\tfor (var i = 0; i < items.length; i++) {\n\t\t\t\titems[i].addEventListener(\"click\", this.jumpToQuestion.bind(this));\n\t\t\t}\n\n\t\t\tvar isBrowser = function isBrowser() {\n\t\t\t\t// Opera 8.0+\n\t\t\t\tvar isOpera = !!window.opr && !!opr.addons || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;\n\t\t\t\t// Firefox 1.0+\n\t\t\t\tvar isFirefox = typeof InstallTrigger !== 'undefined';\n\t\t\t\t// Chrome 1 - 71\n\t\t\t\tvar isChrome = !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime);\n\n\t\t\t\treturn isOpera || isFirefox || isChrome;\n\t\t\t};\n\n\t\t\tif (navigator.platform.startsWith(\"Win\") && !isBrowser()) this.parent.querySelector(\".progress-items\").style.paddingBottom = \"20px\";\n\t\t}\n\n\t\tthis.loadQuestionData(this.state.currentQuestion === -1 ? undefined : this.state.currentQuestion);\n\t};\n\n\tIago.prototype.askForCode = function (resource, attachment, opts) {\n\t\tvar self = this;\n\n\t\tthis.parent.querySelector(\"#iago-code-prompt\").style.display = \"\";\n\n\t\tthis.parent.querySelector(\"#iago-code\").onchange = this.parent.querySelector(\"#iago-code\").onfocus = function () {\n\t\t\tself.parent.querySelector(\"#iago-code-fail\").style.display = \"none\";\n\t\t};\n\n\t\tthis.parent.querySelector(\"#iago-check-code\").onclick = function () {\n\t\t\t// Check the code\n\t\t\tvar code = (self.parent.querySelector(\"#iago-code\").value || \"\").replace(/[^a-f0-9]/gi, \"\").toLowerCase();\n\t\t\tcode = parseInt(code, 16);\n\n\t\t\tvar xor = parseInt(attachment.settings.code, 16);\n\n\t\t\tvar realCode = (code ^ xor).toString(16).toLowerCase();\n\t\t\twhile (realCode.length < 6) {\n\t\t\t\trealCode = \"0\" + realCode;\n\t\t\t}if (resource.code.toLowerCase() === realCode) {\n\t\t\t\tself.gotCode = true;\n\t\t\t\tself.start(resource, attachment, opts);\n\t\t\t} else {\n\t\t\t\tself.parent.querySelector(\"#iago-code-fail\").style.display = \"\";\n\t\t\t}\n\t\t};\n\t};\n\n\tIago.prototype.prepareQuestion = function (q, idx) {\n\t\tthis.state.questions[idx] = { id: q.id, time: [] };\n\n\t\tswitch (q.type) {\n\t\t\tcase 1:\n\t\t\t\tif (!this.loadedBefore) {\n\t\t\t\t\tq.answers = q.correctAnswers.concat(q.otherAnswers);\n\t\t\t\t\tq.answers.sort(function (a, b) {\n\t\t\t\t\t\treturn a.id - b.id;\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!this.state.editMode && !this.attachment.settings.disableRandomization) q.answers = this.shuffle(q.answers);\n\t\t\t\t}\n\t\t\t\tthis.state.questions[idx].selectedAnswers = [];\n\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\tthis.state.questions[idx].answer = \"\";\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\tthis.state.questions[idx].matches = [];\n\n\t\t\t\tif (!this.loadedBefore) {\n\t\t\t\t\tfor (var i = 0; i < q.left.length; i++) {\n\t\t\t\t\t\tq.left[i].id = i + 1;\n\t\t\t\t\t\tq.right[i].id = i + 1;\n\t\t\t\t\t}\n\t\t\t\t\tq.rightPreShuffle = q.right.slice();\n\t\t\t\t\tq.leftPreShuffle = q.left.slice();\n\t\t\t\t\tif (!this.state.editMode && !this.attachment.settings.disableRandomization) {\n\t\t\t\t\t\tq.left = this.shuffle(q.left);\n\t\t\t\t\t\tq.right = this.shuffle(q.right);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 4:\n\t\t\t\tthis.state.questions[idx].enteredAnswers = [];\n\t\t\t\tif (!this.loadedBefore) {\n\t\t\t\t\tq.correctAnswers = [];\n\t\t\t\t\tq.answer.content = q.answer.content.replace(/(?:\\r\\n|\\r|\\n)/g, \"\");\n\t\t\t\t\tvar breakdown = q.answer.content.split(/(\\[.*?\\])/);\n\t\t\t\t\tbreakdown.forEach(function (part) {\n\t\t\t\t\t\tif (/(^.*\\[|\\].*$)/.test(part)) q.correctAnswers.push(part.replace(\"[\", \"\").replace(\"]\", \"\"));\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t\treturn q;\n\t};\n\n\tIago.prototype.redraw = function (options) {\n\t\tif (!this.options.editMode) throw new Error(\"Cannot call redraw if not in edit mode\");\n\n\t\t// Update some values and redraw the current question\n\t\tif (options.language) {\n\t\t\tvar lang = options.language;\n\n\t\t\tif ([\"Afrikaans\", \"English\", \"IsiNdebele\", \"Sepedi\", \"Sesotho\", \"Siswati\", \"Setswana\", \"Xitsonga\", \"Tshivenda\", \"IsiXhosa\", \"IsiZulu\"].indexOf(lang) === -1) lang = \"English\";\n\n\t\t\tthis.assessmentData.language = lang;\n\t\t}\n\t\tif (\"feedbackMode\" in options) this.state.feedbackMode = options.feedbackMode;\n\n\t\tthis.loadQuestionData(this.state.currentQuestion);\n\t};\n\n\tIago.prototype.redoInstructions = function () {\n\t\tif (this.assessmentData.questionData[this.state.currentQuestion].subtype) {\n\t\t\tthis.parent.querySelector(\"#iago-help-content-text\").innerHTML = Iago.assesments[\"type\" + this.assessmentData.questionData[this.state.currentQuestion].type].subtypes[\"subtype\" + this.assessmentData.questionData[this.state.currentQuestion].subtype].instructions[this.assessmentData.language];\n\t\t} else {\n\t\t\tthis.parent.querySelector(\"#iago-help-content-text\").innerHTML = Iago.assesments[\"type\" + this.assessmentData.questionData[this.state.currentQuestion].type].instructions[this.assessmentData.language];\n\t\t}\n\t};\n\n\tIago.prototype.draw = function (index) {\n\t\tthis.loadUI();\n\t\tthis.loadQuestionData(index);\n\t};\n\n\tIago.prototype.updateCurrentModel = function (model) {\n\t\tthis.assessmentData.questionData[this.state.currentQuestion] = this.prepareQuestion(model, this.state.currentQuestion);\n\t};\n\n\tIago.prototype.addQuestion = function (question, noDraw) {\n\t\tvar index = this.assessmentData.questionData.length;\n\t\tthis.assessmentData.questionData.push(this.prepareQuestion(question, index));\n\n\t\tif (!noDraw) {\n\t\t\tthis.loadUI();\n\t\t\tthis.loadQuestionData(index);\n\t\t}\n\t};\n\n\tIago.prototype.removeQuestion = function (index) {\n\t\tindex = index || this.state.currentQuestion;\n\n\t\tif (this.assessmentData.questionData.length < index + 1) return;\n\n\t\tthis.assessmentData.questionData.splice(index, 1);\n\t\t// Shift all the answers across\n\t\tfor (var i = index; i < this.assessmentData.questionData.length; i++) {\n\t\t\tthis.state.questions[i] = this.state.questions[i + 1];\n\t\t}delete this.state.questions[this.assessmentData.questionData.length];\n\t};\n\n\tIago.prototype.loadQuestionData = function (index) {\n\t\tvar self = this;\n\t\tindex = index || 0;\n\n\t\tthis.state.currentQuestion = index;\n\n\t\tif (!this.state.editMode) {\n\t\t\tif (!this.state.feedbackMode) {\n\t\t\t\tif (!this.state.questions[this.state.currentQuestion].time.length) this.transition(\"question-start\", { question: this.assessmentData.questionData[this.state.currentQuestion].id });else this.transition(\"question-resume\", { question: this.assessmentData.questionData[this.state.currentQuestion].id });\n\t\t\t} else this.transition(\"feedback-question-start\", { question: this.assessmentData.questionData[this.state.currentQuestion].id });\n\t\t}\n\n\t\tthis.setProgress();\n\n\t\tvar option, optionContent, optionBorder, breakdown;\n\n\t\t//this.parent.querySelector(\"#iago-back-to-app\").innerHTML = Iago.instructions[this.assessmentData.language].back;\n\t\tthis.parent.querySelector(\"#iago-restart-question\").innerHTML = Iago.instructions[this.assessmentData.language].restart;\n\t\tthis.parent.querySelector(\"#iago-complete-question\").innerHTML = Iago.instructions[this.assessmentData.language].complete;\n\t\tthis.parent.querySelector(\"#iago-next-question\").innerHTML = Iago.instructions[this.assessmentData.language].next;\n\t\tthis.parent.querySelector(\"#iago-previous-question\").innerHTML = Iago.instructions[this.assessmentData.language].previous;\n\t\tthis.parent.querySelector(\"#iago-feedback-question\").innerHTML = Iago.instructions[this.assessmentData.language].showFeedback;\n\n\t\tif (this.state.feedbackMode) {\n\t\t\tthis.parent.querySelector(\"#iago-help-content-text\").innerHTML = (this.state.editMode ? \"\" : Iago.instructions[this.assessmentData.language].teacherFeedback) + \" \" + (this.assessmentData.questionData[this.state.currentQuestion].feedback || Iago.instructions[this.assessmentData.language].noteacherFeedback);\n\t\t} else {\n\t\t\tif (this.assessmentData.questionData[this.state.currentQuestion].subtype) {\n\t\t\t\tthis.parent.querySelector(\"#iago-help-content-text\").innerHTML = Iago.assesments[\"type\" + this.assessmentData.questionData[this.state.currentQuestion].type].subtypes[\"subtype\" + this.assessmentData.questionData[this.state.currentQuestion].subtype].instructions[this.assessmentData.language];\n\t\t\t} else {\n\t\t\t\tthis.parent.querySelector(\"#iago-help-content-text\").innerHTML = Iago.assesments[\"type\" + this.assessmentData.questionData[this.state.currentQuestion].type].instructions[this.assessmentData.language];\n\t\t\t}\n\t\t}\n\t\tthis.parent.querySelector(\"#iago-question-feedback-text\").innerHTML = Iago.instructions[this.assessmentData.language].feedback.replace(\"{count}\", index + 1).replace(\"{total}\", this.assessmentData.questionData.length);\n\t\tthis.parent.querySelector(\"#iago-heading-text\").innerHTML = this.assessmentData.questionData[this.state.currentQuestion].question;\n\t\tif (!this.state.editMode) {\n\t\t\tthis.parent.querySelector(\"#iago-heading-text\").setAttribute(\"contenteditable\", false);\n\n\t\t\tif (this.assessmentData.questionData[this.state.currentQuestion].questionImage) {\n\t\t\t\tvar img = document.createElement(\"img\");\n\t\t\t\timg.src = this.assessmentData.questionData[this.state.currentQuestion].questionImage;\n\t\t\t\tvar elm = this.parent.querySelector(\"#iago-question-image\");\n\t\t\t\twhile (elm.hasChildNodes()) {\n\t\t\t\t\telm.removeChild(elm.lastChild);\n\t\t\t\t}this.parent.querySelector(\"#iago-question-image\").appendChild(img);\n\t\t\t\tthis.parent.querySelector(\"#iago-question-image\").style.display = \"\";\n\t\t\t} else {\n\t\t\t\tthis.parent.querySelector(\"#iago-question-image\").style.display = \"none\";\n\t\t\t}\n\t\t}\n\n\t\t//**************************************************************//\n\t\t//              1. Choose the correct Option                    //\n\t\t//**************************************************************//\n\t\tif (this.assessmentData.questionData[this.state.currentQuestion].type === 1) {\n\t\t\tthis.parent.querySelector(\"#iago-question-content\").innerHTML = \"\";\n\n\t\t\tvar answers = this.state.questions[this.state.currentQuestion].selectedAnswers;\n\n\t\t\tif (this.feedbackState && this.state.feedbackMode) answers = this.feedbackState.questions[this.state.currentQuestion].selectedAnswers;\n\n\t\t\tthis.assessmentData.questionData[this.state.currentQuestion].answers.forEach(function (answer, idx) {\n\t\t\t\toption = document.createElement(\"div\");\n\t\t\t\toption.setAttribute(\"data-value\", answer.id);\n\n\t\t\t\tif (answers.indexOf(answer.id) > -1 && !self.state.editMode) {\n\t\t\t\t\toption.classList.add(\"question-options-selected\");\n\t\t\t\t\toption.setAttribute(\"data-selected\", true);\n\t\t\t\t} else {\n\t\t\t\t\toption.setAttribute(\"data-selected\", false);\n\t\t\t\t}\n\n\t\t\t\tif (self.state.previewMode || !self.state.feedbackMode && !self.state.editMode) self.addTap(option, self.selectOption.bind(self));\n\n\t\t\t\toption.classList.add(\"question-options\");\n\n\t\t\t\tif (self.assessmentData.questionData[self.state.currentQuestion].subtype === 3) option.classList.add(\"true-false\");else option.classList.add(\"many-option\");\n\n\t\t\t\toptionContent = self.returnNode(answer.content, answer.type, answer.id);\n\t\t\t\tif (self.state.editMode && answer.type === \"text\") optionContent.setAttribute(\"contenteditable\", true);\n\t\t\t\toption.appendChild(optionContent);\n\n\t\t\t\tif (self.state.editMode) {\n\t\t\t\t\tvar host = document.createElement(\"div\");\n\t\t\t\t\thost.classList.add(\"option-host\");\n\n\t\t\t\t\tvar check = document.createElement(\"div\");\n\t\t\t\t\tcheck.classList.add(\"checkable\");\n\t\t\t\t\tcheck.classList.add(\"fal\");\n\t\t\t\t\tvar chk = self.state.editMode ? self.assessmentData.questionData[self.state.currentQuestion].correctAnswers.indexOf(answer) > -1 : idx === 0;\n\t\t\t\t\tcheck.classList.add(chk ? \"fa-check\" : \"fa-times\");\n\n\t\t\t\t\thost.appendChild(check);\n\n\t\t\t\t\t// Append options to change the item type\n\t\t\t\t\tvar format = document.createElement(\"div\");\n\t\t\t\t\tformat.classList.add(\"format\");\n\t\t\t\t\tformat.classList.add(\"fal\");\n\t\t\t\t\tformat.classList.add(\"fa-image\");\n\n\t\t\t\t\thost.appendChild(format);\n\n\t\t\t\t\tif (self.assessmentData.questionData[self.state.currentQuestion].subtype !== 3) {\n\t\t\t\t\t\t// Allow deletion of items\n\t\t\t\t\t\tvar del = document.createElement(\"div\");\n\t\t\t\t\t\tdel.classList.add(\"deletable\");\n\t\t\t\t\t\tdel.classList.add(\"fal\");\n\t\t\t\t\t\tdel.classList.add(\"fa-trash-alt\");\n\n\t\t\t\t\t\thost.appendChild(del);\n\t\t\t\t\t}\n\n\t\t\t\t\toption.appendChild(host);\n\t\t\t\t}\n\t\t\t\tself.parent.querySelector(\"#iago-question-content\").appendChild(option);\n\t\t\t});\n\n\t\t\tif (self.state.editMode && self.assessmentData.questionData[self.state.currentQuestion].subtype !== 3) {\n\t\t\t\t// Append a placeholder element to all users to add more items\n\t\t\t\tvar placeholder = document.createElement(\"div\");\n\t\t\t\tplaceholder.textContent = \"Click to add another option\";\n\t\t\t\tplaceholder.classList.add(\"placeholder\");\n\n\t\t\t\tself.parent.querySelector(\"#iago-question-content\").appendChild(placeholder);\n\t\t\t}\n\n\t\t\tthis.prevNextButtons(answers.length);\n\t\t}\n\n\t\t//**************************************************************//\n\t\t//               2. Paragraph Answer No Marks                   //\n\t\t//**************************************************************//\n\t\tif (this.assessmentData.questionData[this.state.currentQuestion].type == 2) {\n\t\t\tvar answer = \"\";\n\n\t\t\tif (this.state.feedbackMode && this.feedbackState && this.feedbackState.questions[this.state.currentQuestion].answer) answer = this.feedbackState.questions[this.state.currentQuestion].answer;\n\n\t\t\tthis.parent.querySelector(\"#iago-question-content\").innerHTML = \"\";\n\t\t\tvar container = document.createElement(\"div\");\n\t\t\tcontainer.classList.add(\"paragraph-container\");\n\t\t\toption = document.createElement(\"textarea\");\n\t\t\tvar mark = document.createElement(\"span\");\n\t\t\tmark.classList.add(\"paragraph-mark\");\n\t\t\tmark.innerHTML = \"Mark: \" + this.assessmentData.questionData[this.state.currentQuestion].potentialScore;\n\n\t\t\tif (!this.state.previewMode && (this.state.feedbackMode || this.state.editMode)) option.setAttribute(\"readonly\", \"readonly\");\n\t\t\tif (this.state.editMode) option.value = \"The learner will write an answer here\";\n\n\t\t\toption.style.width = \"100%\";\n\t\t\toption.style.maxWidth = \"100%\";\n\n\t\t\toption.onkeyup = self.paragraphHandler.bind(self, option);\n\t\t\tif (!this.state.editMode) option.value = answer;\n\t\t\tcontainer.appendChild(option);\n\t\t\tcontainer.appendChild(mark);\n\t\t\tif (this.state.editMode) {\n\t\t\t\tvar total = document.createElement(\"div\");\n\t\t\t\tvar txt = document.createElement(\"span\");\n\t\t\t\ttxt.textContent = \"How many marks can be earned for this question?  \";\n\t\t\t\ttotal.appendChild(txt);\n\n\t\t\t\tvar marks = document.createElement(\"input\");\n\t\t\t\tmarks.setAttribute(\"type\", \"number\");\n\t\t\t\tmarks.setAttribute(\"maxlength\", \"3\");\n\t\t\t\tmarks.setAttribute(\"value\", this.assessmentData.questionData[this.state.currentQuestion].potentialScore || \"1\");\n\t\t\t\tmarks.setAttribute(\"min\", \"1\");\n\t\t\t\tmarks.setAttribute(\"max\", \"1000\");\n\t\t\t\tmarks.style.width = \"80px\";\n\t\t\t\tmarks.style.display = \"inline-block\";\n\n\t\t\t\ttotal.appendChild(marks);\n\n\t\t\t\tcontainer.appendChild(total);\n\t\t\t}\n\n\t\t\tthis.parent.querySelector(\"#iago-question-content\").appendChild(container);\n\n\t\t\tthis.prevNextButtons(Boolean(this.state.questions[this.state.currentQuestion].answer));\n\t\t}\n\n\t\t//**************************************************************//\n\t\t//                    3. Match the columns                      //\n\t\t//**************************************************************//\n\t\tif (this.assessmentData.questionData[this.state.currentQuestion].type == 3) {\n\t\t\tthis.parent.querySelector(\"#iago-question-content\").innerHTML = \"\";\n\n\t\t\tthis.backgroundPallette = this.shuffle([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]);\n\t\t\tthis.matchSelection = {\n\t\t\t\tleft: {\n\t\t\t\t\tselected: false\n\t\t\t\t},\n\t\t\t\tright: {\n\t\t\t\t\tselected: false\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvar left = this.assessmentData.questionData[this.state.currentQuestion].left;\n\t\t\tvar right = this.assessmentData.questionData[this.state.currentQuestion].right;\n\t\t\tvar currMatches = this.state.questions[this.state.currentQuestion].matches;\n\t\t\tif (this.state.feedbackMode && !this.state.previewMode) {\n\t\t\t\tleft = this.assessmentData.questionData[this.state.currentQuestion].leftPreShuffle;\n\t\t\t\tright = this.assessmentData.questionData[this.state.currentQuestion].rightPreShuffle;\n\t\t\t\tcurrMatches = [];\n\t\t\t\tfor (var aa = 0; aa < left.length; aa++) {\n\t\t\t\t\tcurrMatches.push({ left: left[aa].id, right: left[aa].id, bg: this.backgroundPallette.pop() });\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar listleft = document.createElement(\"div\");\n\t\t\tlistleft.classList.add(\"list-left\");\n\t\t\tlistleft.setAttribute(\"id\", \"listleft\");\n\t\t\tleft.forEach(function (answer) {\n\t\t\t\toption = document.createElement(\"div\");\n\t\t\t\toption.classList.add(\"match-options\");\n\t\t\t\toption.classList.add(\"left\");\n\n\t\t\t\tif (self.state.previewMode || !self.state.feedbackMode && !self.state.editMode) self.addTap(option, self.selectMatch.bind(self));\n\n\t\t\t\toptionContent = self.returnNode(answer.content, answer.type);\n\t\t\t\tif (self.state.editMode && answer.type === \"text\") optionContent.setAttribute(\"contenteditable\", true);\n\t\t\t\toption.appendChild(optionContent);\n\t\t\t\toptionBorder = document.createElement(\"div\");\n\t\t\t\toptionBorder.classList.add(\"border\");\n\t\t\t\toption.appendChild(optionBorder);\n\n\t\t\t\tif (self.state.editMode) {\n\t\t\t\t\tvar host = document.createElement(\"div\");\n\t\t\t\t\thost.classList.add(\"option-host\");\n\n\t\t\t\t\t// Append options to change the item type\n\t\t\t\t\tvar format = document.createElement(\"div\");\n\t\t\t\t\tformat.classList.add(\"format\");\n\t\t\t\t\tformat.classList.add(\"fal\");\n\t\t\t\t\tformat.classList.add(\"fa-image\");\n\n\t\t\t\t\thost.appendChild(format);\n\n\t\t\t\t\toption.appendChild(host);\n\t\t\t\t}\n\n\t\t\t\toption.setAttribute(\"data-selected\", \"false\");\n\t\t\t\toption.setAttribute(\"data-column\", \"left\");\n\t\t\t\toption.setAttribute(\"data-value\", answer.id);\n\t\t\t\tlistleft.appendChild(option);\n\t\t\t});\n\t\t\tthis.parent.querySelector(\"#iago-question-content\").appendChild(listleft);\n\n\t\t\tvar listright = document.createElement(\"div\");\n\t\t\tlistright.setAttribute(\"id\", \"listright\");\n\t\t\tlistright.classList.add(\"list-right\");\n\t\t\tright.forEach(function (answer) {\n\t\t\t\toption = document.createElement(\"div\");\n\t\t\t\toption.classList.add(\"match-options\");\n\t\t\t\toption.classList.add(\"right\");\n\n\t\t\t\tif (self.state.previewMode || !self.state.feedbackMode && !self.state.editMode) self.addTap(option, self.selectMatch.bind(self));\n\n\t\t\t\toptionContent = self.returnNode(answer.content, answer.type);\n\t\t\t\tif (self.state.editMode && answer.type == \"text\") optionContent.setAttribute(\"contenteditable\", true);\n\n\t\t\t\toptionBorder = document.createElement(\"div\");\n\t\t\t\toptionBorder.classList.add(\"border\");\n\t\t\t\toption.appendChild(optionBorder);\n\t\t\t\toption.appendChild(optionContent);\n\n\t\t\t\tif (self.state.editMode) {\n\t\t\t\t\tvar host = document.createElement(\"div\");\n\t\t\t\t\thost.classList.add(\"option-host\");\n\n\t\t\t\t\t// Append options to change the item type\n\t\t\t\t\tvar format = document.createElement(\"div\");\n\t\t\t\t\tformat.classList.add(\"format\");\n\t\t\t\t\tformat.classList.add(\"fal\");\n\t\t\t\t\tformat.classList.add(\"fa-image\");\n\n\t\t\t\t\thost.appendChild(format);\n\n\t\t\t\t\t// Allow deletion of items\n\t\t\t\t\tvar del = document.createElement(\"div\");\n\t\t\t\t\tdel.classList.add(\"deletable\");\n\t\t\t\t\tdel.classList.add(\"fal\");\n\t\t\t\t\tdel.classList.add(\"fa-trash-alt\");\n\n\t\t\t\t\thost.appendChild(del);\n\n\t\t\t\t\toption.appendChild(host);\n\t\t\t\t}\n\n\t\t\t\toption.setAttribute(\"data-selected\", \"false\");\n\t\t\t\toption.setAttribute(\"data-column\", \"right\");\n\t\t\t\toption.setAttribute(\"data-value\", answer.id);\n\t\t\t\tlistright.appendChild(option);\n\t\t\t});\n\t\t\tthis.parent.querySelector(\"#iago-question-content\").appendChild(listright);\n\n\t\t\tfor (var a = 0; a < currMatches.length; a++) {\n\t\t\t\tif (!this.state.editMode) {\n\t\t\t\t\tthis.parent.querySelector(\"#listleft [data-value='\" + currMatches[a].left + \"'] .border\").classList.add(\"border-\" + currMatches[a].bg);\n\t\t\t\t\tthis.parent.querySelector(\"#listleft [data-value='\" + currMatches[a].left + \"']\").setAttribute(\"data-selected\", \"true\");\n\t\t\t\t\tthis.parent.querySelector(\"#listright [data-value='\" + currMatches[a].right + \"'] .border\").classList.add(\"border-\" + currMatches[a].bg);\n\t\t\t\t\tthis.parent.querySelector(\"#listright [data-value='\" + currMatches[a].right + \"']\").setAttribute(\"data-selected\", \"true\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (self.state.editMode) {\n\t\t\t\t// Append a placeholder element to all users to add more items\n\t\t\t\tvar br = document.createElement(\"br\");\n\t\t\t\tbr.setAttribute(\"clear\", \"all\");\n\n\t\t\t\tself.parent.querySelector(\"#iago-question-content\").appendChild(br);\n\n\t\t\t\tvar placeholder2 = document.createElement(\"div\");\n\t\t\t\tplaceholder2.textContent = \"Click to add another pair\";\n\t\t\t\tplaceholder2.classList.add(\"placeholder\");\n\n\t\t\t\tself.parent.querySelector(\"#iago-question-content\").appendChild(placeholder2);\n\t\t\t}\n\n\t\t\tthis.prevNextButtons(currMatches.length === left.length);\n\t\t}\n\n\t\t//**************************************************************//\n\t\t//                    4. Fill in the blanks                     //\n\t\t//**************************************************************//\n\t\tif (this.assessmentData.questionData[this.state.currentQuestion].type === 4) {\n\t\t\tthis.parent.querySelector(\"#iago-question-content\").innerHTML = \"\";\n\t\t\tvar filler = this.assessmentData.questionData[this.state.currentQuestion];\n\n\t\t\toption = document.createElement(\"div\");\n\t\t\toption.classList.add(\"blankParagraph\");\n\t\t\tif (!self.state.editMode) {\n\t\t\t\tif (self.state.previewMode) {\n\t\t\t\t\toption.classList.remove(\"blankParagraph\");\n\t\t\t\t\toption.classList.add(\"previewParagraph\");\n\t\t\t\t\toption.setAttribute(\"contenteditable\", false);\n\n\t\t\t\t\tbreakdown = filler.answer.content.split(/(\\[.*?\\])/);\n\t\t\t\t\tvar index = -1;\n\t\t\t\t\tbreakdown.forEach(function (part) {\n\t\t\t\t\t\tif (part.match(/(\\[.+?\\])/)) {\n\t\t\t\t\t\t\tindex++;\n\t\t\t\t\t\t\tvar innerOption = document.createElement(\"input\");\n\t\t\t\t\t\t\tinnerOption.type = \"text\";\n\t\t\t\t\t\t\tinnerOption.classList.add(\"fill-in\");\n\t\t\t\t\t\t\tif (self.state.questions[self.state.currentQuestion].enteredAnswers && self.state.questions[self.state.currentQuestion].enteredAnswers[index]) {\n\t\t\t\t\t\t\t\tinnerOption.value = self.state.questions[self.state.currentQuestion].enteredAnswers[index];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\toption.appendChild(innerOption);\n\t\t\t\t\t\t\tinnerOption.onkeyup = self.previewFillInHandler.bind(self, option, innerOption, index);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\toption.appendChild(self.returnNode(part, \"text\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tbreakdown = filler.answer.content.split(/(\\[.*?\\])/);\n\t\t\t\t\tindex = -1;\n\t\t\t\t\tbreakdown.forEach(function (part) {\n\t\t\t\t\t\tif (/(^.*\\[|\\].*$)/.test(part)) {\n\t\t\t\t\t\t\toptionContent = self.returnNode(part, \"blank\");\n\t\t\t\t\t\t\toptionContent.setAttribute(\"data-index\", ++index);\n\t\t\t\t\t\t\tif (self.state.feedbackMode) {\n\t\t\t\t\t\t\t\toptionContent.setAttribute(\"readonly\", \"readonly\");\n\t\t\t\t\t\t\t\toptionContent.value = filler.correctAnswers[index];\n\t\t\t\t\t\t\t} else if (self.state.questions[self.state.currentQuestion].enteredAnswers && self.state.questions[self.state.currentQuestion].enteredAnswers[index]) optionContent.value = self.state.questions[self.state.currentQuestion].enteredAnswers[index];\n\t\t\t\t\t\t} else optionContent = self.returnNode(part, \"text\");\n\t\t\t\t\t\toption.appendChild(optionContent);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toption.setAttribute(\"contenteditable\", true);\n\t\t\t\toption.textContent = filler.answer.content;\n\t\t\t}\n\n\t\t\tthis.parent.querySelector(\"#iago-question-content\").appendChild(option);\n\t\t\tthis.prevNextButtons(this.state.questions[this.state.currentQuestion].enteredAnswers.length === filler.correctAnswers.length);\n\t\t}\n\n\t\tvar skipped = false,\n\t\t    questionData,\n\t\t    enteredAnswers;\n\t\tvar question = this.state.questions[this.state.currentQuestion];\n\n\t\tif (question.matches || question.enteredAnswers) {\n\t\t\tquestionData = this.assessmentData.questionData.filter(function (item) {\n\t\t\t\treturn item.id === question.id;\n\t\t\t});\n\t\t\tquestionData = questionData[0];\n\t\t}\n\n\t\t// Remove blank entered answers\n\t\tif (question.enteredAnswers) enteredAnswers = question.enteredAnswers.filter(function (el) {\n\t\t\treturn el.trim() !== \"\" ? el : false;\n\t\t});\n\n\t\tif (question.selectedAnswers && question.selectedAnswers.length === 0 || question.matches && (question.matches.length === 0 || questionData.left.length > question.matches.length)) skipped = true;else if (question.enteredAnswers && (enteredAnswers.length === 0 || questionData.correctAnswers.length > enteredAnswers.length) || question.answer === \"\") skipped = true;\n\n\t\t// If the question has not been answered and question start is not set, then set it\n\t\tif (!(this.state.questions[this.state.currentQuestion].questionStart && skipped)) this.state.questions[this.state.currentQuestion].questionStart = new Date().valueOf();\n\n\t\tthis.parent.querySelector(\"#iago-assessment\").dispatchEvent(new CustomEvent(\"iago:loaded\", { question: this.state.currentQuestion }));\n\n\t\t// Scroll to top\n\t\tthis.parent.scrollTop = 0; //querySelector(\"#iago-question\").scrollIntoView();\n\t};\n\n\tIago.prototype.loadLandingPage = function (resource, attachment, opts) {\n\t\tvar self = this;\n\n\t\tthis.parent.querySelector(\"#iago-start-question\").innerHTML = Iago.instructions[resource.language].start;\n\t\tthis.parent.querySelector(\"#iago-help-content-text\").innerHTML = Iago.instructions[resource.language].landingPageHelp;\n\t\tthis.parent.querySelector(\"#iago-heading-text\").innerHTML = Iago.instructions[resource.language].landingPageHeading;\n\n\t\tvar container = document.createElement(\"div\");\n\t\tcontainer.classList.add(\"landing-page-container\");\n\t\tvar assessmentTitle = document.createElement(\"h1\");\n\t\tvar instanceTitle = document.createElement(\"h3\");\n\t\tassessmentTitle.innerHTML = \"Title: \" + resource.title;\n\t\tinstanceTitle.innerHTML = \"Instance: \" + (attachment.settings.title === undefined ? \"(no title set)\" : attachment.settings.title);\n\n\t\tcontainer.appendChild(assessmentTitle);\n\t\tif (attachment.settings.title) container.appendChild(instanceTitle);\n\t\tthis.parent.querySelector(\"#iago-question-content\").appendChild(container);\n\n\t\tcontainer.style[\"text-align\"] = \"center\";\n\t\tthis.parent.querySelector(\"#iago-assessment\").style.display = \"block\";\n\t\tthis.parent.querySelector(\"#iago-start-question\").style.display = \"block\";\n\t\tthis.parent.querySelector(\"#iago-start-question\").onclick = self.start.bind(self, resource, attachment, opts);\n\n\t\tif (this.state.previewMode) {\n\t\t\tthis.parent.querySelector(\"#iago-heading-text\").setAttribute(\"contenteditable\", false);\n\t\t\tthis.parent.querySelector(\"#iago-question-image\").style.display = \"none\";\n\t\t}\n\t\tthis.landingPageStarted = true;\n\t};\n\n\tIago.prototype.navigateQuestions = function (direction, evt) {\n\t\tif (evt) {\n\t\t\tvar el = evt.currentTarget || evt.originalTarget;\n\n\t\t\tif (el.classList.contains(\"disabled-button\")) return;\n\t\t}\n\n\t\tif (!this.state.editMode) {\n\t\t\tif (!this.state.questions[this.state.currentQuestion].questionStart) this.state.questions[this.state.currentQuestion].questionStart = new Date().valueOf();\n\t\t\tthis.state.questions[this.state.currentQuestion].time.push(new Date().valueOf() - this.state.questions[this.state.currentQuestion].questionStart);\n\n\t\t\t// Update the results for the current question\n\t\t\tthis.extractMark();\n\n\t\t\t// Recalc the current time\n\t\t\tthis.feedback.time = this.sumOf(this.feedback.scores, \"time\");\n\n\t\t\t// And the current mark\n\t\t\tthis.feedback.mark = this.sumOf(this.feedback.scores, \"score\");\n\n\t\t\tif (!this.state.feedbackMode && !this.state.editMode && this.attachment.settings && this.attachment.settings.serverSave) window.Sync.assessmentTransition(JSON.stringify({ results: this.feedback, activity: this.activity, url: url }));\n\n\t\t\tif (direction === true) {\n\t\t\t\tthis.state.currentQuestion++;\n\t\t\t\tthis.transition(\"navigate\", { direction: \"forward\" });\n\t\t\t} else if (direction === false) {\n\t\t\t\tthis.state.currentQuestion--;\n\t\t\t\tthis.transition(\"navigate\", { direction: \"backward\" });\n\t\t\t}\n\n\t\t\tvar question, questionData, index, skipped, enteredAnswers;\n\n\t\t\tfor (var key in this.state.questions) {\n\t\t\t\tif (this.state.questions.hasOwnProperty(key)) {\n\t\t\t\t\tquestion = this.state.questions[key];\n\n\t\t\t\t\tindex = parseInt(key, 10) + 1;\n\t\t\t\t\tskipped = false;\n\n\t\t\t\t\tif (question.matches || question.enteredAnswers) {\n\t\t\t\t\t\tquestionData = this.assessmentData.questionData.filter(function (item) {\n\t\t\t\t\t\t\treturn item.id === question.id;\n\t\t\t\t\t\t});\n\t\t\t\t\t\tquestionData = questionData[0];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove blank entered answers\n\t\t\t\t\tif (question.enteredAnswers) enteredAnswers = question.enteredAnswers.filter(function (el) {\n\t\t\t\t\t\treturn el.trim() !== \"\" ? el : false;\n\t\t\t\t\t});\n\n\t\t\t\t\tif (question.selectedAnswers && question.selectedAnswers.length === 0 || question.matches && (question.matches.length === 0 || questionData.left.length > question.matches.length)) skipped = true;else if (question.enteredAnswers && (enteredAnswers.length === 0 || questionData.correctAnswers.length > enteredAnswers.length) || question.answer === \"\") skipped = true;\n\n\t\t\t\t\tif (skipped) this.parent.querySelector(\".item-\" + index).classList.add(\"skipped\");else this.parent.querySelector(\".item-\" + index).classList.remove(\"skipped\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this.loadQuestionData(this.state.currentQuestion);\n\t\t}\n\n\t\tthis.parent.querySelector(\"#iago-assessment\").dispatchEvent(new CustomEvent(\"iago:navigate\", { detail: { direction: direction } }));\n\t};\n\n\tIago.prototype.jumpToQuestion = function (evt) {\n\t\tif (!this.state) this.state = {};\n\t\tthis.state.currentQuestion = parseInt(evt.target.innerHTML, 10) - 1;\n\t\tthis.navigateQuestions(\"jump\", evt);\n\t};\n\n\tIago.prototype.returnNode = function (content, type, id) {\n\t\tvar node;\n\t\tif (type === \"text\") {\n\t\t\tnode = document.createElement(\"span\");\n\t\t\tnode.innerHTML = content;\n\t\t}\n\t\tif (type === \"image\") {\n\t\t\tif (this.state.editMode) {\n\t\t\t\tnode = document.createElement(\"span\");\n\t\t\t\t//node.innerHTML = content;\n\t\t\t} else {\n\t\t\t\tnode = document.createElement(\"img\");\n\t\t\t\tnode.setAttribute(\"src\", content);\n\t\t\t}\n\t\t}\n\t\tif (type === \"blank\") {\n\t\t\tnode = document.createElement(\"input\");\n\t\t\tnode.setAttribute(\"type\", \"text\");\n\t\t\tnode.style.width = (content.length - 2) * 18 + \"px\";\n\t\t\t//node.setAttribute(\"maxlength\", content.length - 2);\n\t\t\tnode.setAttribute(\"data-value\", id);\n\t\t\tnode.setAttribute(\"autocapitalize\", \"off\");\n\t\t\tnode.onkeyup = this.blankHandler.bind(this);\n\t\t}\n\t\treturn node;\n\t};\n\n\tIago.prototype.paragraphHandler = function (textarea) {\n\t\tthis.state.questions[this.state.currentQuestion].answer = textarea.value;\n\t\tif (textarea.value.length) this.prevNextButtons(true);else this.prevNextButtons(false);\n\t};\n\n\tIago.prototype.previewFillInHandler = function (markup, textinput, index) {\n\t\tthis.state.questions[this.state.currentQuestion].enteredAnswers[index] = textinput.value;\n\t\tvar enteredAnswers = this.state.questions[this.state.currentQuestion].enteredAnswers.filter(function (el) {\n\t\t\treturn el != \"\";\n\t\t});\n\n\t\tif (enteredAnswers.length == this.assessmentData.questionData[this.state.currentQuestion].correctAnswers.length) this.prevNextButtons(true);else this.prevNextButtons(false);\n\t};\n\n\tIago.prototype.blankHandler = function (evt) {\n\t\tvar el = evt.currentTarget || evt.originalTarget;\n\n\t\tthis.state.questions[this.state.currentQuestion].enteredAnswers[el.getAttribute(\"data-index\")] = el.value;\n\n\t\t//Check if each textbox has been touched. Allows blank answers.\n\t\tvar all = 0;\n\t\tthis.state.questions[this.state.currentQuestion].enteredAnswers.forEach(function (answer) {\n\t\t\tif (!!answer) all++;\n\t\t});\n\t\tthis.prevNextButtons(all === this.assessmentData.questionData[this.state.currentQuestion].correctAnswers.length);\n\t};\n\n\tIago.prototype.prevNextButtons = function (canAdvance) {\n\t\tvar self = this;\n\t\t//canAdvance = true;\n\n\t\tvar togglePrev = function togglePrev(toggle, hide) {\n\t\t\tself.parent.querySelector(\"#iago-previous-question\").style.display = hide ? \"none\" : \"inline-block\";\n\n\t\t\tif (toggle) {\n\t\t\t\tself.parent.querySelector(\"#iago-previous-question\").classList.remove(\"disabled-button\");\n\t\t\t\tself.parent.querySelector(\"#iago-previous-question\").classList.add(\"button\");\n\t\t\t} else {\n\t\t\t\tself.parent.querySelector(\"#iago-previous-question\").classList.add(\"disabled-button\");\n\t\t\t\tself.parent.querySelector(\"#iago-previous-question\").classList.remove(\"button\");\n\t\t\t}\n\t\t};\n\n\t\tvar toggleNext = function toggleNext(toggle, hide) {\n\t\t\tself.parent.querySelector(\"#iago-next-question\").style.display = hide ? \"none\" : \"inline-block\";\n\n\t\t\tif (toggle) {\n\t\t\t\tself.parent.querySelector(\"#iago-next-question\").classList.remove(\"disabled-button\");\n\t\t\t\tself.parent.querySelector(\"#iago-next-question\").classList.add(\"button\");\n\t\t\t} else {\n\t\t\t\tself.parent.querySelector(\"#iago-next-question\").classList.add(\"disabled-button\");\n\t\t\t\tself.parent.querySelector(\"#iago-next-question\").classList.remove(\"button\");\n\t\t\t}\n\t\t};\n\n\t\tvar toggleComplete = function toggleComplete(toggle, hide) {\n\t\t\tself.parent.querySelector(\"#iago-complete-question\").style.display = hide ? \"none\" : \"inline-block\";\n\n\t\t\tif (toggle) {\n\t\t\t\tself.parent.querySelector(\"#iago-complete-question\").classList.remove(\"disabled-button\");\n\t\t\t\tself.parent.querySelector(\"#iago-complete-question\").classList.add(\"button\");\n\t\t\t\tif (self.parent.querySelector(\".item-complete\")) self.parent.querySelector(\".item-complete\").classList.remove(\"disabled-button\");\n\t\t\t} else {\n\t\t\t\tself.parent.querySelector(\"#iago-complete-question\").classList.add(\"disabled-button\");\n\t\t\t\tself.parent.querySelector(\"#iago-complete-question\").classList.remove(\"button\");\n\t\t\t\tif (self.parent.querySelector(\".item-complete\")) self.parent.querySelector(\".item-complete\").classList.add(\"disabled-button\");\n\t\t\t}\n\t\t};\n\n\t\tvar skippedQuestions = [];\n\t\tvar question, questionData, enteredAnswers;\n\n\t\tfor (var key in this.state.questions) {\n\t\t\tif (this.state.questions.hasOwnProperty(key)) {\n\t\t\t\tquestion = this.state.questions[key];\n\n\t\t\t\tif (question.matches || question.enteredAnswers) {\n\t\t\t\t\tquestionData = this.assessmentData.questionData.filter(function (item) {\n\t\t\t\t\t\treturn item.id === question.id;\n\t\t\t\t\t});\n\t\t\t\t\tquestionData = questionData[0];\n\t\t\t\t}\n\n\t\t\t\t// Remove blank entered answers\n\t\t\t\tif (question.enteredAnswers) enteredAnswers = question.enteredAnswers.filter(function (el) {\n\t\t\t\t\treturn el.trim() !== \"\" ? el : false;\n\t\t\t\t});\n\n\t\t\t\tif (question.selectedAnswers && question.selectedAnswers.length === 0 || question.matches && (question.matches.length === 0 || questionData.left.length > question.matches.length)) skippedQuestions.push(key);else if (question.enteredAnswers && (enteredAnswers.length === 0 || questionData.correctAnswers.length > enteredAnswers.length) || question.answer === \"\") skippedQuestions.push(key);\n\t\t\t}\n\t\t}\n\n\t\tif (this.state.currentQuestion === this.assessmentData.questionData.length - 1) {\n\t\t\ttoggleNext(canAdvance || this.state.editMode, !this.state.editMode);\n\t\t\ttogglePrev(this.assessmentData.questionData.length > 1, false);\n\n\t\t\tif (!this.state.feedbackMode && skippedQuestions.length > 0 || !this.state.editMode && skippedQuestions.length > 0) toggleComplete(false, this.state.editMode);else toggleComplete((!this.state.feedbackMode || this.state.previewMode) && canAdvance, this.state.editMode);\n\t\t} else if (this.state.currentQuestion === 0) {\n\t\t\ttoggleNext(true, false);\n\t\t\ttogglePrev(false, false);\n\t\t\ttoggleComplete(false, true);\n\t\t} else {\n\t\t\ttoggleNext(true, false);\n\t\t\ttogglePrev(true, false);\n\t\t\ttoggleComplete(false, true);\n\t\t}\n\n\t\tif (!skippedQuestions.length && this.state.currentQuestion !== this.assessmentData.questionData.length - 1) toggleComplete(true, true);\n\t};\n\n\tIago.prototype.completeButtons = function (hide) {\n\t\tif (hide) {\n\t\t\tthis.parent.querySelector(\"#iago-restart-question\").style.display = \"none\";\n\t\t\tthis.parent.querySelector(\"#iago-feedback-question\").style.display = \"none\";\n\t\t\tthis.parent.querySelector(\"#iago-previous-question\").style.display = \"none\";\n\t\t\t//this.parent.querySelector(\"#iago-back-to-app\").style.display = \"none\";\n\t\t\treturn;\n\t\t}\n\n\t\tthis.parent.querySelector(\"#iago-restart-question\").style.display = \"inline-block\";\n\t\t//this.parent.querySelector(\"#iago-back-to-app\").style.display = \"inline-block\";\n\t\tif (this.assessmentData.feedback) this.parent.querySelector(\"#iago-feedback-question\").style.display = \"inline-block\";\n\n\t\tthis.parent.querySelector(\"#iago-next-question\").style.display = \"none\";\n\t\tthis.parent.querySelector(\"#iago-complete-question\").style.display = \"inline-block\";\n\t\tthis.parent.querySelector(\"#iago-previous-question\").style.display = \"none\";\n\t};\n\n\tIago.prototype.selectOption = function (evt) {\n\t\tvar self = this;\n\n\t\tvar selectAnswer = function selectAnswer(el) {\n\t\t\tvar id = parseInt(el.getAttribute(\"data-value\"), 10);\n\n\t\t\tself.state.questions[self.state.currentQuestion].selectedAnswers.push(id);\n\n\t\t\tel.setAttribute(\"data-selected\", true);\n\t\t\tel.classList.add(\"question-options-selected\");\n\n\t\t\tself.transition(\"question-action\", {\n\t\t\t\taction: \"select-option\",\n\t\t\t\tquestion: self.assessmentData.questionData[self.state.currentQuestion].id\n\t\t\t});\n\n\t\t\tself.prevNextButtons(true);\n\t\t};\n\n\t\tvar el = evt.currentTarget || evt.originalTarget;\n\n\t\tif (this.assessmentData.questionData[this.state.currentQuestion].subtype === 1) {\n\t\t\tif (el.getAttribute(\"data-selected\") === \"false\") selectAnswer(el);else this.clearSelected(el);\n\t\t} else {\n\t\t\tvar node = el.parentNode.firstChild;\n\n\t\t\twhile (node) {\n\t\t\t\tthis.clearSelected(node);\n\t\t\t\tnode = node.nextElementSibling || node.nextSibling;\n\t\t\t}\n\n\t\t\tselectAnswer(el);\n\t\t}\n\t};\n\n\tIago.prototype.clearSelected = function (el) {\n\t\tif (!el.classList.contains(\"question-options-selected\")) return;\n\n\t\tel.classList.remove(\"question-options-selected\");\n\t\tel.setAttribute(\"data-selected\", false);\n\n\t\tthis.transition(\"question-action\", {\n\t\t\taction: \"clear-option\",\n\t\t\tquestion: this.assessmentData.questionData[this.state.currentQuestion].id\n\t\t});\n\n\t\tvar id = parseInt(el.getAttribute(\"data-value\"), 10);\n\n\t\tthis.state.questions[this.state.currentQuestion].selectedAnswers = this.state.questions[this.state.currentQuestion].selectedAnswers.filter(function (x) {\n\t\t\treturn x !== id;\n\t\t});\n\n\t\tif (this.state.questions[this.state.currentQuestion].selectedAnswers.length === 0) this.prevNextButtons(false);\n\t};\n\n\tIago.prototype.selectMatch = function (evt) {\n\t\tvar el = evt.currentTarget || evt.originalTarget;\n\n\t\tvar side = el.getAttribute(\"data-column\");\n\t\tvar value = parseInt(el.getAttribute(\"data-value\"), 10);\n\t\t//var correctMatch = el.getAttribute(\"data-correctmatch\");\n\t\tvar otherside = function otherside() {\n\t\t\treturn side === \"left\" ? \"right\" : \"left\";\n\t\t};\n\t\tvar bg;\n\n\t\t// No items yet selected, but this item already paired; deselect both\n\t\tif (!this.matchSelection.left.selected && !this.matchSelection.right.selected && el.getAttribute(\"data-selected\") === \"true\") {\n\t\t\tthis.transition(\"question-action\", { question: this.assessmentData.questionData[this.state.currentQuestion].id, action: \"deselect-match\" });\n\n\t\t\t// Find the matching element\n\t\t\tvar match = this.state.questions[this.state.currentQuestion].matches.filter(function (item) {\n\t\t\t\treturn item[side] === value;\n\t\t\t});\n\n\t\t\tif (!match.length) throw new Error(\"No match found, impossible state\");\n\n\t\t\tmatch = match[0];\n\n\t\t\tvar left = this.parent.querySelector(\"#listleft [data-value='\" + match.left + \"']\");\n\t\t\tvar right = this.parent.querySelector(\"#listright [data-value='\" + match.right + \"']\");\n\n\t\t\tleft.querySelector(\"div.border\").classList.remove(\"border-\" + match.bg);\n\t\t\tleft.setAttribute(\"data-selected\", \"false\");\n\t\t\tright.querySelector(\"div.border\").classList.remove(\"border-\" + match.bg);\n\t\t\tright.setAttribute(\"data-selected\", \"false\");\n\n\t\t\tthis.backgroundPallette.push(match.bg);\n\t\t\tthis.matchSelection = { left: { selected: false }, right: { selected: false } };\n\n\t\t\tthis.state.questions[this.state.currentQuestion].matches = this.state.questions[this.state.currentQuestion].matches.filter(function (item) {\n\t\t\t\treturn item != match;\n\t\t\t});\n\t\t}\n\t\t// No items yet selected, this item not paired: pick a border and assign it\n\t\telse if (!this.matchSelection.left.selected && !this.matchSelection.right.selected && el.getAttribute(\"data-selected\") === \"false\") {\n\t\t\t\tthis.transition(\"question-action\", { question: this.assessmentData.questionData[this.state.currentQuestion].id, action: \"select-first-match\" });\n\n\t\t\t\tbg = this.backgroundPallette.pop();\n\t\t\t\tthis.matchSelection[side] = { selected: true, bg: bg, value: value };\n\t\t\t\tel.querySelector(\"div.border\").classList.add(\"border-\" + bg);\n\t\t\t\tel.setAttribute(\"data-selected\", \"true\");\n\t\t\t}\n\t\t\t// One item already selected\n\t\t\telse if (this.matchSelection.left.selected || this.matchSelection.right.selected) {\n\t\t\t\t\t// Clicked on same item; deselect\n\t\t\t\t\tif (this.matchSelection[side].selected && this.matchSelection[side].value === value) {\n\t\t\t\t\t\tthis.transition(\"question-action\", { question: this.assessmentData.questionData[this.state.currentQuestion].id, action: \"deselect-match\" });\n\t\t\t\t\t\tbg = this.matchSelection[side].bg;\n\t\t\t\t\t\tel.querySelector(\"div.border\").classList.remove(\"border-\" + bg);\n\t\t\t\t\t\tthis.backgroundPallette.push(bg);\n\t\t\t\t\t\tthis.matchSelection[side] = { selected: false };\n\t\t\t\t\t\tel.setAttribute(\"data-selected\", \"false\");\n\t\t\t\t\t}\n\t\t\t\t\t// Clicked on unselected item on same side; do nothing\n\t\t\t\t\telse if (this.matchSelection[side].selected && this.matchSelection[side].value !== value) {}\n\t\t\t\t\t\t// Clicked on selected item on other side; do nothing\n\t\t\t\t\t\telse if (this.matchSelection[otherside()].selected && el.getAttribute(\"data-selected\") === \"true\") {}\n\t\t\t\t\t\t\t// Clicked on unselected item on other side; add it\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tthis.transition(\"question-action\", { question: this.assessmentData.questionData[this.state.currentQuestion].id, action: \"select-second-match\" });\n\t\t\t\t\t\t\t\t\tbg = this.matchSelection[otherside()].bg;\n\t\t\t\t\t\t\t\t\tel.querySelector(\"div.border\").classList.add(\"border-\" + bg);\n\t\t\t\t\t\t\t\t\tthis.matchSelection[side] = { selected: false, bg: bg, value: value };\n\t\t\t\t\t\t\t\t\tthis.state.questions[this.state.currentQuestion].matches.push({ left: this.matchSelection.left.value, right: this.matchSelection.right.value, bg: bg, correct: this.matchSelection.left.value === this.matchSelection.right.value });\n\n\t\t\t\t\t\t\t\t\tthis.matchSelection = { left: { selected: false }, right: { selected: false } };\n\t\t\t\t\t\t\t\t\tel.setAttribute(\"data-selected\", \"true\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t}\n\n\t\tthis.prevNextButtons(this.state.questions[this.state.currentQuestion].matches.length == this.assessmentData.questionData[this.state.currentQuestion].left.length);\n\t};\n\n\tIago.prototype.restart = function (data) {\n\t\tthis.saved = false;\n\t\tthis.completeButtons(true);\n\t\tthis.start(data || this.assessmentData, this.attachment);\n\t};\n\n\tIago.prototype.backToApp = function () {\n\t\twindow.open(\"\", \"_self\").close();\n\t\t//<a href=\"javascript:window.open('','_self').close();\">close</a>\n\t};\n\n\tIago.prototype.restartWithFeedback = function () {\n\t\tthis.transition(\"toggle-feedback\");\n\t\tthis.state.feedbackMode = true;\n\t\tthis.restart();\n\t};\n\n\tIago.prototype.setProgress = function () {\n\t\tvar progress = (this.state.currentQuestion + 1) / this.assessmentData.questionData.length * 100;\n\t\tthis.parent.querySelector(\"#iago-progress-done\").style.width = Math.floor(progress) + \"%\";\n\t\tthis.parent.querySelector(\"#iago-progress-left\").style.width = Math.ceil(100 - progress) + \"%\";\n\n\t\tif (!this.state.editMode) {\n\t\t\tif (this.parent.querySelector(\".progress-item.active\")) this.parent.querySelector(\".progress-item.active\").classList.remove(\"active\");\n\t\t\tvar item = this.parent.querySelector(\".item-\" + (this.state.currentQuestion + 1));\n\t\t\titem.classList.add(\"active\");\n\t\t\tthis.parent.scrollTop = 0;\n\t\t}\n\t};\n\n\tIago.prototype.completeQuestions = function () {\n\t\tif (this.parent.querySelector(\"#iago-complete-question\").classList.contains(\"disabled-button\")) return;\n\n\t\tthis.parent.querySelector(\".progress-items\").innerHTML = \"\";\n\n\t\tif (!this.state.feedbackMode) this.transition(\"assessment-end\", { resource: this.assessmentData._id, attachment: this.attachment._id });\n\n\t\tthis.feedbackState = this.state;\n\n\t\tthis.completeButtons(this.attachment.settings.hideCompleteButtons);\n\t\tthis.parent.querySelector(\"#iago-heading-text\").innerHTML = \"\";\n\t\tthis.parent.querySelector(\"#iago-next-question\").style.display = \"none\";\n\t\tthis.parent.querySelector(\"#iago-complete-question\").style.display = \"none\";\n\t\tthis.parent.querySelector(\"#iago-question-content\").innerHTML = \"\";\n\t\tthis.parent.querySelector(\"#iago-help-content-text\").innerHTML = Iago.instructions[this.assessmentData.language].endScreen;\n\t\tvar option = document.createElement(\"div\");\n\t\toption.classList.add(\"question-options\");\n\n\t\tif (!this.state.feedbackMode) {\n\t\t\tthis.state.questions[this.state.currentQuestion].time.push(new Date().valueOf() - this.state.questions[this.state.currentQuestion].questionStart);\n\n\t\t\tfor (var i = 0; i < this.assessmentData.questionData.length; i++) {\n\t\t\t\tthis.extractMark(i);\n\t\t\t} // Recalc the current time\n\t\t\tthis.feedback.time = this.sumOf(this.feedback.scores, \"time\");\n\n\t\t\t// And the current mark\n\t\t\tthis.feedback.mark = this.sumOf(this.feedback.scores, \"score\");\n\n\t\t\t//this.feedback.maxScore = this.sumOf(this.feedback.scores, \"potentialScore\");\n\n\t\t\tif (!this.state.feedbackMode && !this.state.editMode && this.attachment.settings && this.attachment.settings.serverSave === true) window.Sync.assessmentComplete(JSON.stringify({ results: this.feedback, activity: this.activity, url: url }));\n\n\t\t\tif (!this.attachment.settings.disableResult) {\n\t\t\t\tvar questionCount = this.assessmentData.questionData.length;\n\t\t\t\tvar qAutoCount = this.feedback.markableCount;\n\t\t\t\tvar qManualCount = questionCount - qAutoCount;\n\t\t\t\tvar manualTotal = 0,\n\t\t\t\t    autoTotal = 0,\n\t\t\t\t    autoMark = 0;\n\n\t\t\t\tvar scoresObj = this.feedback.scores;\n\t\t\t\tvar scores = Object.keys(scoresObj).map(function (key) {\n\t\t\t\t\treturn scoresObj[key];\n\t\t\t\t});\n\n\t\t\t\tscores.forEach(function (score, i) {\n\t\t\t\t\tif (score.score !== undefined) {\n\t\t\t\t\t\tautoTotal += score.potentialScore;\n\t\t\t\t\t\tautoMark += score.score;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmanualTotal += score.potentialScore;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif (this.assessmentData.questionData.length - this.feedback.markableCount) {\n\t\t\t\t\toption.innerHTML += Iago.instructions[this.assessmentData.language].teacherToMark.replace(\"{qManualCount}\", \"<strong>\" + qManualCount + \"</strong>\").replace(\"{questionCount}\", \"<strong>\" + questionCount + \"</strong>\").replace(\"{manualTotal}\", \"<strong>\" + manualTotal + \"</strong>\") + \"<br/>\";\n\t\t\t\t}\n\n\t\t\t\toption.innerHTML += Iago.instructions[this.assessmentData.language].automaticMark.replace(\"{qAutoCount}\", \"<strong>\" + qAutoCount + \"</strong>\").replace(\"{questionCount}\", \"<strong>\" + questionCount + \"</strong>\").replace(\"{autoTotal}\", \"<strong>\" + autoTotal + \"</strong>\").replace(\"{autoMark}\", \"<strong>\" + autoMark + \"</strong>\").replace(\"{autoTotal}\", \"<strong>\" + autoTotal + \"</strong>\") + \"<br/>\";\n\n\t\t\t\toption.innerHTML += Iago.instructions[this.assessmentData.language].totalQuestions.replace(\"{count}\", \"<strong>\" + this.sumOf(this.feedback.scores, \"correct\") + \"</strong>\").replace(\"{total}\", \"<strong>\" + this.feedback.markableCount + \"</strong>\") + \"<br/>\";\n\t\t\t\toption.innerHTML += Iago.instructions[this.assessmentData.language].totalScore.replace(\"{count}\", \"<strong>\" + this.sumOf(this.feedback.scores, \"score\") + \"</strong>\").replace(\"{total}\", \"<strong>\" + this.sumOf(this.feedback.scores, \"potentialScore\") + \"</strong>\") + \"<br/>\";\n\t\t\t}\n\n\t\t\toption.innerHTML += Iago.instructions[this.assessmentData.language].totalTime.replace(\"{count}\", \"<strong>\" + this.timeToMinSec(this.sumOf(this.feedback.scores, \"time\")) + \"</strong>\") + \"<br/>\";\n\t\t} else option.innerHTML += Iago.instructions[this.assessmentData.language].feedbackdone;\n\n\t\tthis.parent.querySelector(\"#iago-question-content\").appendChild(option);\n\t};\n\n\tIago.prototype.extractMark = function (index) {\n\t\tindex = index || this.state.currentQuestion;\n\n\t\tvar question = this.assessmentData.questionData[index];\n\t\tvar user = this.state.questions[index];\n\n\t\tvar newScore = {\n\t\t\tid: question.id,\n\t\t\ttype: question.type,\n\t\t\tscore: 0,\n\t\t\tpotentialScore: 0,\n\t\t\tcorrect: false,\n\t\t\tanswers: [],\n\t\t\ttime: user.time.reduce(function (sum, num) {\n\t\t\t\treturn sum + num;\n\t\t\t}, 0)\n\t\t};\n\n\t\tif (question.type === 1) {\n\t\t\tnewScore.correct = true;\n\t\t\tquestion.correctAnswers.forEach(function (ans) {\n\t\t\t\tnewScore.potentialScore++;\n\t\t\t\tif (user.selectedAnswers.indexOf(ans.id) > -1) newScore.score++;else newScore.correct = false;\n\t\t\t});\n\t\t\tnewScore.answers = user.selectedAnswers;\n\t\t\tif (user.selectedAnswers.length > question.correctAnswers.length) {\n\t\t\t\tnewScore.correct = false;\n\t\t\t\tnewScore.score = Math.max(0, newScore.score - (user.selectedAnswers.length - question.correctAnswers.length));\n\t\t\t}\n\t\t}\n\t\tif (question.type === 2) {\n\t\t\tdelete newScore.score;\n\t\t\tnewScore.potentialScore = question.potentialScore || 1;\n\t\t\tnewScore.answers.push(user.answer);\n\t\t}\n\t\tif (question.type === 3) {\n\t\t\tnewScore.correct = true;\n\t\t\tuser.matches.forEach(function (match) {\n\t\t\t\tnewScore.potentialScore++;\n\t\t\t\tif (match.correct) newScore.score++;else newScore.correct = false;\n\t\t\t});\n\t\t\tnewScore.answers = user.matches;\n\t\t}\n\t\tif (question.type === 4) {\n\t\t\tnewScore.correct = true;\n\t\t\tquestion.correctAnswers.forEach(function (answer, idx) {\n\t\t\t\tnewScore.potentialScore++;\n\t\t\t\tvar userAnswer = user.enteredAnswers[idx] === undefined ? \"\" : user.enteredAnswers[idx].trim().toLowerCase();\n\t\t\t\tif (answer.trim().toLowerCase() === userAnswer) newScore.score++;else newScore.correct = false;\n\t\t\t\tnewScore.answers.push(user.enteredAnswers[idx]);\n\t\t\t});\n\t\t}\n\n\t\tthis.feedback.scores[newScore.id] = newScore;\n\t};\n\n\tIago.prototype.getMaxScore = function () {\n\t\tvar index,\n\t\t    potentialScore,\n\t\t    ret = 0;\n\n\t\tif (!this.assessmentData) return 0;\n\n\t\tfor (var i = 0; i < this.assessmentData.questionData.length; i++) {\n\t\t\tindex = i;\n\n\t\t\tvar question = this.assessmentData.questionData[index];\n\n\t\t\tpotentialScore = 0;\n\n\t\t\tif (question.type === 1) potentialScore += (question.correctAnswers || []).length;\n\n\t\t\tif (question.type === 2) potentialScore += question.potentialScore || 1;\n\n\t\t\tif (question.type === 3) potentialScore += (question.left || []).length;\n\n\t\t\tif (question.type === 4) potentialScore += (question.correctAnswers || []).length;\n\n\t\t\tret += potentialScore;\n\t\t}\n\n\t\treturn ret;\n\t};\n\n\tIago.prototype.transition = function (name, data) {\n\t\tif (this.state.feedbackMode || this.state.editMode) return;\n\n\t\tif (!this.activity) this.activity = [];\n\n\t\t//\t\tdata = data || {};\n\n\t\tthis.activity.push({\n\t\t\tname: name,\n\t\t\tdata: data || {},\n\t\t\ttime: new Date().valueOf()\n\t\t});\n\t};\n\n\tIago.prototype.sumOf = function (obj, field) {\n\t\tvar total = 0;\n\t\tfor (var key in obj) {\n\t\t\ttotal += ~~obj[key][field];\n\t\t}return total;\n\t};\n\n\tIago.prototype.shuffle = function (arr) {\n\t\tfor (var j, x, i = arr.length; i; j = Math.floor(Math.random() * i), x = arr[--i], arr[i] = arr[j], arr[j] = x) {}\n\t\treturn arr;\n\t};\n\n\tIago.prototype.timeToMinSec = function (date) {\n\t\tvar output = new Date(date).toISOString().substr(11, 8);\n\t\tif (output.slice(0, 3) === \"00:\") output = output.slice(3);\n\t\treturn output;\n\t};\n\n\tIago.prototype.addTap = function (el, ev) {\n\t\tel.addEventListener(\"mouseup\", ev, false);\n\t};\n\n\t/*******************************************************************************\n \tAll language data such as instructions etc is defined below.\n \t*********************************************************************************/\n\n\tIago.assesments = {\n\t\ttype1: {\n\t\t\tname: \"Multiple Choice\",\n\t\t\tdescription: \"Choose the correct option\",\n\t\t\tinstructions: {\n\t\t\t\tAfrikaans: \"Kies die regte antwoord en druk Volgende.\",\n\t\t\t\tEnglish: \"Choose the correct answer. Then press Next.\",\n\t\t\t\tXitsonga: \"Hlawula nhlamulo leyi nga lulama. Kutani tshikelela leyi landzelaka.\",\n\t\t\t\tIsiNdebele: \"Khetha ipendulo efaneleko. Ngemva kwalokho gandelela okulandelako.\",\n\t\t\t\tIsiXhosa: \"Khetha impendulo echanekileyo. Uze ucinezele elandelayo.\",\n\t\t\t\tSepedi: \"Kgetha karabo ye e nepagetšego. Go tloga fao o kgotle latelago.\",\n\t\t\t\tSesotho: \"Kgetha karabo e nepahetseng. O nto hatisa e latelang.\",\n\t\t\t\tSiswati: \"Khetsa imphendvulo lengiyo. Bese ufacata lokulandzelako.\",\n\t\t\t\tTshivenda: \"Nangani phindulo yone. Ni kone u puṱedza zwitevhelaho.\",\n\t\t\t\tSetswana: \"Tlhopha karabo e e nepagetseng. Morago ga moo tobetsa latelang.\",\n\t\t\t\tIsiZulu: \"Khetha impendulo eshaya khona. Bese ucindezela u-Next.\"\n\n\t\t\t},\n\t\t\tsubtypes: {\n\t\t\t\tsubtype1: {\n\t\t\t\t\tname: \"Choose more than one correct answer\",\n\t\t\t\t\tinstructions: {\n\t\t\t\t\t\tAfrikaans: \"Kies die regte antwoorde en druk Volgende.\",\n\t\t\t\t\t\tEnglish: \"Choose the correct answers. Then press Next.\",\n\t\t\t\t\t\tXitsonga: \"Hlawula tinhlamulo leti nga lulama. Kutani tshikelela leyi landzelaka.\",\n\t\t\t\t\t\tIsiNdebele: \"Khetha iimpendulo ezifaneleko. Ngemva kwalokho gandelela okulandelako.\",\n\t\t\t\t\t\tIsiXhosa: \"Khetha iimpendulo ezichanekileyo. Uze ucinezele elandelayo.\",\n\t\t\t\t\t\tSepedi: \"Kgetha dikarabo tše di nepagetšego. Go tloga fao o kgotle latelago.\",\n\t\t\t\t\t\tSesotho: \"Kgetha dikarabo tse nepahetseng. O nto hatisa e latelang.\",\n\t\t\t\t\t\tSiswati: \"Khetsa timphendvulo letingito. Bese ufacata lokulandzelako.\",\n\t\t\t\t\t\tTshivenda: \"Nangani phindulo dzone. Ni kone u puṱedza zwitevhelaho.\",\n\t\t\t\t\t\tSetswana: \"Tlhopha dikarabo tse di nepagetseng. Morago ga moo tobetsa latelang.\",\n\t\t\t\t\t\tIsiZulu: \"Khetha izimpendulo ezishaya khona. Bese ucindezela u-Next.\"\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tsubtype2: {\n\t\t\t\t\tname: \"Choose exactly one option\",\n\t\t\t\t\tinstructions: {\n\t\t\t\t\t\tAfrikaans: \"Kies die regte antwoord en druk Volgende.\",\n\t\t\t\t\t\tEnglish: \"Choose the correct answer. Then press Next.\",\n\t\t\t\t\t\tXitsonga: \"Hlawula nhlamulo leyi nga lulama. Kutani tshikelela leyi landzelaka.\",\n\t\t\t\t\t\tIsiNdebele: \"Khetha ipendulo efaneleko. Ngemva kwalokho gandelela okulandelako.\",\n\t\t\t\t\t\tIsiXhosa: \"Khetha impendulo echanekileyo. Uze ucinezele elandelayo.\",\n\t\t\t\t\t\tSepedi: \"Kgetha karabo ye e nepagetšego. Go tloga fao o kgotle latelago.\",\n\t\t\t\t\t\tSesotho: \"Kgetha karabo e nepahetseng. O nto hatisa e latelang.\",\n\t\t\t\t\t\tSiswati: \"Khetsa imphendvulo lengiyo. Bese ufacata lokulandzelako.\",\n\t\t\t\t\t\tTshivenda: \"Nangani phindulo yone. Ni kone u puṱedza zwitevhelaho.\",\n\t\t\t\t\t\tSetswana: \"Tlhopha karabo e e nepagetseng. Morago ga moo tobetsa latelang.\",\n\t\t\t\t\t\tIsiZulu: \"Khetha impendulo eshaya khona. Bese ucindezela u-Next.\"\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tsubtype3: {\n\t\t\t\t\tname: \"True false\",\n\t\t\t\t\tinstructions: {\n\t\t\t\t\t\tAfrikaans: \"Kies die regte antwoord en druk Volgende.\",\n\t\t\t\t\t\tEnglish: \"Choose the correct answer. Then press Next.\",\n\t\t\t\t\t\tXitsonga: \"Hlawula nhlamulo leyi nga lulama. Kutani tshikelela leyi landzelaka.\",\n\t\t\t\t\t\tIsiNdebele: \"Khetha ipendulo efaneleko. Ngemva kwalokho gandelela okulandelako.\",\n\t\t\t\t\t\tIsiXhosa: \"Khetha impendulo echanekileyo. Uze ucinezele elandelayo.\",\n\t\t\t\t\t\tSepedi: \"Kgetha karabo ye e nepagetšego. Go tloga fao o kgotle latelago.\",\n\t\t\t\t\t\tSesotho: \"Kgetha karabo e nepahetseng. O nto hatisa e latelang.\",\n\t\t\t\t\t\tSiswati: \"Khetsa imphendvulo lengiyo. Bese ufacata lokulandzelako.\",\n\t\t\t\t\t\tTshivenda: \"Nangani phindulo yone. Ni kone u puṱedza zwitevhelaho.\",\n\t\t\t\t\t\tSetswana: \"Tlhopha karabo e e nepagetseng. Morago ga moo tobetsa latelang.\",\n\t\t\t\t\t\tIsiZulu: \"Khetha impendulo eshaya khona. Bese ucindezela u-Next.\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\ttype2: {\n\t\t\tname: \"Paragraph Response\",\n\t\t\tdescription: \"Paragraph response only, no marks will be given.\",\n\t\t\tinstructions: {\n\t\t\t\tAfrikaans: \"Tik jou antwoord in die oop spasie en druk Volgende.\",\n\t\t\t\tEnglish: \"Type the answer in the space below. Then press Next.\",\n\t\t\t\tXitsonga: \"Thayipa nhlamulo eka xivandla lexi nga hava nchumu lexi nga laha hansi. Kutani tshikelela leyi landzelaka.\",\n\t\t\t\tIsiNdebele: \"Gadangisa nanyana thayibha ipendulo esikhaleni esingenzasi. Ngemva kwalokho gandelela okulandelako.\",\n\t\t\t\tIsiXhosa: \"Chwetheza impendulo kwisithuba esingezantsi. Uze ucinezele elandelayo.\",\n\t\t\t\tSepedi: \"Tlanya karabo ka sekgobeng sa ka mo fase. Go tloga fao o kgotle latelago.\",\n\t\t\t\tSesotho: \"Thaepa karabo sebakeng se ka tlase. O nto hatisa e latelang.\",\n\t\t\t\tSiswati: \"Bhala impendvulo kulesikhala lesingaphasi. Bese ufacata lokulandzelako.\",\n\t\t\t\tTshivenda: \"Thaiphelani phindulo kha tshikhala tshi re nga fhasi. Ni kone u puṱedza zwitevhelaho.\",\n\t\t\t\tSetswana: \"Tlanya karabo mo sebakeng se se fa tlase. Morago ga moo tobetsa latelang.\",\n\t\t\t\tIsiZulu: \"Bhala impendulo kwindawo engezansi. Bese ucindezela u-Next.\"\n\t\t\t},\n\t\t\tsubtypes: {}\n\t\t},\n\t\ttype3: {\n\t\t\tname: \"Match the options\",\n\t\t\tdescription: \"\",\n\t\t\tinstructions: {\n\t\t\t\tAfrikaans: \"Kies &#180;n opsie in een kolom en pas dit by die ooreenstemmende opsie in die ander kolom. Ooreenstemmende opsies sal dieselfde kleur wees. Opsies kan verander word deur weer op die gekose blokkie te druk. Druk Volgende wanneer jy klaar is. \",\n\t\t\t\tEnglish: \"Choose one option on the left, and match it to its corresponding option on the right. Matching options will have the same colour. To undo a match, just press on the options again.  Once done, press Next.\",\n\t\t\t\tXitsonga: \"Hlawula xihlawuriwa lexi nga eximatsini, kutani u xi fananisa na xihlawuriwa lexi fambelanaka na xona lexi nga exineneni. Swihlawuriwa swo fanana swi ta va na muhlovo wo fana. Ku tlherisela endzhaku ku fanana loku, tshikelela ntsena swihlawuriwa nakambe. Loko u hetile, tshikelela leyi landzelaka.\",\n\t\t\t\tIsiNdebele: \"Khetha ikhetho elilodwa ngesinceleni, bese ulimadanisa nekhetho elikhambelana nalo ngesidleni. Amakhetho amadanako azakuba nombala ofanako. Ukususa ukumadanokho,  gandelela amakhetho godu. Nasele uqedile, gandelela okulandelako.\",\n\t\t\t\tIsiXhosa: \"Chonga ukhetho olunye ekhohlo, uze ululinganise nokhetho oluhambelana nalo ekunene. Amakhetho afanayo aya kuba nombala ofanayo. Ukuphelisa ukulingana, cinezela nje amakhetho kwakhona.  Wakuba wenzile, cinezela Elandelayo.\",\n\t\t\t\tSepedi: \"Kgetha kgetho e tee ka lehlakoreng la nngele, gomme o e nyalantšhe le kgetho ye e sepelelanago le yona ka lehlakoreng la goja. Dikgetho tše di sepelelanago di tla ba le mmala wa go swana. Go dirolla go sepelelana fao, o no kgotla fela go dikgetho gape. Ge o feditše, kgotla latelago.\",\n\t\t\t\tSesotho: \"Hlwaya kgetho e le nngwe ho le letshehadi, mme o e nyalanye le kgetho e tsamaelanang le yona ho le letona. Dikgetho tse nyalanang di tla ba le mmala o tshwanang. Ho etsolla nyalano, hatisa feela dikgetho hape.  Hang ha o qetile, hatisa e Latelang.\",\n\t\t\t\tSiswati: \"Khetsa kunye lokungasencele, bese ukucondzanisa naloko lokuvumelana nako ngasekudla. Lokucondzanako kutawuba nembala lofananako. Kute wente lokukucondzene kungasacondzani, facata futsi kuloku lokukhetsile. Nasewucedzile, facata lokulandzelako.\",\n\t\t\t\tTshivenda: \"Nangani tshithihi kha monde, ni tshi vhambedze na tshe na nanga tshine tsha elana natsho kha tshauḽa. U vhambedza zwe zwa nangwa hu ḓo vha na muvhala u fanaho. U khantsela u vhambedza ho itwaho, ni sokou puṱedza hafhu hune na tea u nanga hone.  Musi no no fhedza, ni puṱedza zwitevhelaho.\",\n\t\t\t\tSetswana: \"Tlhopha seitlhophelwa se le sengwe ka fa molemeng, o bo o se nyalanya le tlhopho e e tshwanang le sone ka fa mojeng. Diitlhophelwa tse di tshwanang di tla nna le mmala o o tshwanang. Go di nyalolola, tobetsa diitlhophelwa gape. Morago ga moo, tobetsa  Latelang.\",\n\t\t\t\tIsiZulu: \"Khetha okukodwa kulokho okungakwesokunxele, bese ukumatanisa nalokho okungakwesokudla. Izinto ezifanayo ziyoba nombala owodwa. Uma ufuna ukuphinda uqale phansi vele ucindezele lapho kukhethwa khona futhi. Uma usukwenzile lokho, cindezela u-Next.\"\n\t\t\t},\n\t\t\tsubtypes: {}\n\t\t},\n\t\ttype4: {\n\t\t\tname: \"Fill in the blanks\",\n\t\t\tdescription: \"\",\n\t\t\tinstructions: {\n\t\t\t\tAfrikaans: \"Tik die ontbrekende terme in en druk Volgende.\",\n\t\t\t\tEnglish: \"Type the answer in the blank space/s below. Then press Next\",\n\t\t\t\tXitsonga: \"Thayipa nhlamulo eka xivandla lexi nga hava nchumu lexi nga laha hansi. Kutani tshikelela leyi landzelaka.\",\n\t\t\t\tIsiNdebele: \"Gadangisa nanyana thayibha ipendulo esikhaleni nanyana eenkhaleni ezinganalitho ngenzasi. Ngemva kwalokho gandelela okulandelako.\",\n\t\t\t\tIsiXhosa: \"Chwetheza impendulo kwisi(zi)khewu esi(zi)ngenanto ngezantsi. Uze ucinezele elandelayo.\",\n\t\t\t\tSepedi: \"Tlanya karabo ka sekgobeng/dikgobeng tše di se nago selo ka mo fase. Go tloga fao o kgotle latelago.\",\n\t\t\t\tSesotho: \"Thaepa karabo sebakeng se sekgeo (dikgeo) ka tlase. O nto hatisa e latelang.\",\n\t\t\t\tSiswati: \"Bhala imphendvulo esi(ti)khaleni lesi(ti)ngaphasi lesi(ti)te lutfo. Bese ufacata lokulandzelako.\",\n\t\t\t\tTshivenda: \"Thaiphelani phindulo kha (zwi)tshikhala (zwi) tshi sina tshithu/(zwi) tshi re nga fhasi. Ni kone u puṱedza zwitevhelaho.\",\n\t\t\t\tSetswana: \"Tlanya karabo mo di/sebakeng se se senang sepe fa tlase. Morago ga moo tobetsa latelang.\",\n\t\t\t\tIsiZulu: \"Bhala impendulo kwindawo engezansi engabhalwe lutho. Bese ucindezela u-Next.\"\n\t\t\t},\n\t\t\tsubtypes: {}\n\t\t}\n\t};\n\n\tIago.instructions = {\n\t\tAfrikaans: {\n\t\t\tendScreen: \"Jy het al die vrae voltooi en jou uitslag is ingedien.\",\n\t\t\trestart: \"Probeer weer\",\n\t\t\tstart: \"Start\",\n\t\t\tlandingPageHeading: \"Assessment / Survey\",\n\t\t\tlandingPageHelp: \"You are about to begin the assessment. Click the \\\"Start\\\" button below to continue.\",\n\t\t\tcomplete: \"Voltooi\",\n\t\t\tnext: \"Volgende\",\n\t\t\tprevious: \"Vorige\",\n\t\t\tfeedback: \"{count} uit {total}\",\n\t\t\ttotalQuestions: \"Jy het volpunte vir {count} uit {total} vrae behaal.\",\n\t\t\ttotalTime: \"Dit het jou {count} geneem om die evaluering te voltooi.\",\n\t\t\ttotalScore: \"Jou totale punt is {count} uit {total}\",\n\t\t\taverageTime: \"Jou gemiddelde tyd per vraag is {average}.\",\n\t\t\tautomaticMark: \"{qAutoCount} (out of {questionCount}) questions, for a total of {autoTotal} marks, were marked automatically. You scored {autoMark} out of {autoTotal}.\",\n\t\t\tteacherToMark: \"Jy het {count} vrae vir merk ingedien.\",\n\t\t\tshowFeedback: \"Wys terugvoer\",\n\t\t\tteacherFeedback: \"<strong>Terugvoer:</strong>\",\n\t\t\tfeedbackdone: \"Jy het deur die terugvoer vir alle vrae gewerk.\",\n\t\t\tnoteacherFeedback: \"Geen terugvoer is verskaf nie.\",\n\t\t\ttrue: \"Waar\",\n\t\t\tfalse: \"Onwaar\",\n\t\t\tyes: \"Ja\",\n\t\t\tno: \"Nee\",\n\t\t\tbefore: \"Voor\",\n\t\t\tafter: \"Na\",\n\t\t\tmore: \"Meer\",\n\t\t\tless: \"Minder\"\n\t\t},\n\t\tEnglish: {\n\t\t\tendScreen: \"You have completed all the questions and your results have been submitted.\",\n\t\t\trestart: \"Try again\",\n\t\t\tstart: \"Start\",\n\t\t\tlandingPageHeading: \"Assessment / Survey\",\n\t\t\tlandingPageHelp: \"You are about to begin the assessment. Click the \\\"Start\\\" button below to continue.\",\n\t\t\tcomplete: \"Complete\",\n\t\t\tnext: \"Next\",\n\t\t\tprevious: \"Previous\",\n\t\t\tfeedback: \"{count} of {total}\",\n\t\t\ttotalQuestions: \"You got full marks for {count} out of {total} questions.\",\n\t\t\ttotalTime: \"It took you {count} to complete the assessment.\",\n\t\t\ttotalScore: \"Your total score is {count} out of {total}.\",\n\t\t\taverageTime: \"Your average time per question {average}.\",\n\t\t\tteacherToMark: \"{qManualCount} (out of {questionCount}) questions, for a total of {manualTotal} marks, were submitted for manual marking.\",\n\t\t\tautomaticMark: \"{qAutoCount} (out of {questionCount}) questions, for a total of {autoTotal} marks, were marked automatically. You scored {autoMark} out of {autoTotal}.\",\n\t\t\tshowFeedback: \"Show feedback\",\n\t\t\tteacherFeedback: \"<strong>Feedback:</strong>\",\n\t\t\tfeedbackdone: \"You have worked through the feedback of all questions.\",\n\t\t\tnoteacherFeedback: \"No feedback was provided.\",\n\t\t\ttrue: \"True\",\n\t\t\tfalse: \"False\",\n\t\t\tyes: \"Yes\",\n\t\t\tno: \"No\",\n\t\t\tbefore: \"Before\",\n\t\t\tafter: \"After\",\n\t\t\tmore: \"More\",\n\t\t\tless: \"Less\"\n\t\t},\n\t\tXitsonga: {\n\t\t\tendScreen: \"U hetile swivutiso hinkwaswo naswona mivuyelo ya wena yi tisiwile.\",\n\t\t\trestart: \"Ringeta nakambe\",\n\t\t\tstart: \"Start\",\n\t\t\tlandingPageHeading: \"Assessment / Survey\",\n\t\t\tlandingPageHelp: \"You are about to begin the assessment. Click the \\\"Start\\\" button below to continue.\",\n\t\t\tcomplete: \"Hetisa\",\n\t\t\tnext: \"Lexi landzelaka\",\n\t\t\tprevious: \"Lexi nga hundza\",\n\t\t\tfeedback: \"{count} wa {total}\",\n\t\t\ttotalQuestions: \"U kumile timaraka hi vutalo ta swivutiso swa {count} ehenhla ka {total}\",\n\t\t\ttotalTime: \"Swi ku tekele {count} ku hetisa nhlahluvo.\",\n\t\t\ttotalScore: \"Xikoro xa wena hinkwaxo i {count} ehenhla ka {total}.\",\n\t\t\taverageTime: \"Nkarhi wa wena wa nhlayoxikarhi hi xivutiso {average}.\",\n\t\t\tautomaticMark: \"{qAutoCount} (out of {questionCount}) questions, for a total of {autoTotal} marks, were marked automatically. You scored {autoMark} out of {autoTotal}.\",\n\t\t\tteacherToMark: \"U tisile swivutiso swa {count} ku ta makiwa.\",\n\t\t\tshowFeedback: \"Komba mbiko\",\n\t\t\tteacherFeedback: \"<strong>Mbiko:</strong>\",\n\t\t\tfeedbackdone: \"U tirhanile na mbiko wa swivutiso hinkwaswo.\",\n\t\t\tnoteacherFeedback: \"Ku hava mbiko lowu nyikiweke.\",\n\t\t\ttrue: \"Hi swona\",\n\t\t\tfalse: \"A hi swona\",\n\t\t\tyes: \"Ina\",\n\t\t\tno: \"E-e\",\n\t\t\tbefore: \"Ekusunguleni ka swona\",\n\t\t\tafter: \"Endzhaku ka swona\",\n\t\t\tmore: \"Ehenhla\",\n\t\t\tless: \"Ehansi\"\n\t\t},\n\t\tIsiXhosa: {\n\t\t\tendScreen: \"Uyigqibile yonke imibuzo yaye iziphumo zithunyelwe.\",\n\t\t\trestart: \"Zama kwakhona\",\n\t\t\tstart: \"Start\",\n\t\t\tlandingPageHeading: \"Assessment / Survey\",\n\t\t\tlandingPageHelp: \"You are about to begin the assessment. Click the \\\"Start\\\" button below to continue.\",\n\t\t\tcomplete: \"Gqiba\",\n\t\t\tnext: \"Elandelayo\",\n\t\t\tprevious: \"Eyangaphambili\",\n\t\t\tfeedback: \"{count} eye-{total}\",\n\t\t\ttotalQuestions: \"Ufumene amanqaku apheleleyo malunga {count} ukuphuma kwi-{total} imibuzo.\",\n\t\t\ttotalTime: \"Kukuthathe  {count} ukugqiba uvavanyo.\",\n\t\t\ttotalScore: \"Amanqaku akho ewonke ngama- {count} ukuphuma kuma- {total}.\",\n\t\t\taverageTime: \"Umndilili wakho wexesha lombuzo ngamnye ngama- {average}.\",\n\t\t\tautomaticMark: \"{qAutoCount} (out of {questionCount}) questions, for a total of {autoTotal} marks, were marked automatically. You scored {autoMark} out of {autoTotal}.\",\n\t\t\tteacherToMark: \"Uthumele imibuzo {count} ukwenzela ukuphawulwa.\",\n\t\t\tshowFeedback: \"Bonisa ingxelo\",\n\t\t\tteacherFeedback: \"<strong>Ingxelo:</strong>\",\n\t\t\tfeedbackdone: \"Usebenze kwingxelo yayo yonke imibuzo.\",\n\t\t\tnoteacherFeedback: \"Akukho ngxelo enikelweyo.\",\n\t\t\ttrue: \"Yinyaniso\",\n\t\t\tfalse: \"Yimposiso\",\n\t\t\tyes: \"Ewe\",\n\t\t\tno: \"Hayi\",\n\t\t\tbefore: \"Ngaphambili\",\n\t\t\tafter: \"Ngasemva\",\n\t\t\tmore: \"Ngaphezulu\",\n\t\t\tless: \"Ngaphantsi\"\n\t\t},\n\t\tSepedi: {\n\t\t\tendScreen: \"O tladitše dipotšišo ka moka gomme dipoelo tša gago di rometšwe.\",\n\t\t\trestart: \"Leka gape\",\n\t\t\tstart: \"Start\",\n\t\t\tlandingPageHeading: \"Assessment / Survey\",\n\t\t\tlandingPageHelp: \"You are about to begin the assessment. Click the \\\"Start\\\" button below to continue.\",\n\t\t\tcomplete: \"Tlatša\",\n\t\t\tnext: \"Latelago\",\n\t\t\tprevious: \"Fetilego\",\n\t\t\tfeedback: \"{count} ya {total}\",\n\t\t\ttotalQuestions: \"O na le meputso ka moka ye {count} go dipotšišo tše {total}.\",\n\t\t\ttotalTime: \"Go go tšere {count} go fetša tekodišišo.\",\n\t\t\ttotalScore: \"Palomoka ya dintlha tša gago ke {count} go tše {total}.\",\n\t\t\taverageTime: \"Palogare ya nako ya gago ka potšišo ke {average}.\",\n\t\t\tautomaticMark: \"{qAutoCount} (out of {questionCount}) questions, for a total of {autoTotal} marks, were marked automatically. You scored {autoMark} out of {autoTotal}.\",\n\t\t\tteacherToMark: \"O rometše dipotšišo tše {count} tša go swaya.\",\n\t\t\tshowFeedback: \"Bontšha poelo\",\n\t\t\tteacherFeedback: \"<strong>Poelo:</strong>\",\n\t\t\tfeedbackdone: \"O šomile ka poelo ya dipotšišo ka moka.\",\n\t\t\tnoteacherFeedback: \"Ga go poelo ye e filwego.\",\n\t\t\ttrue: \"Nnete\",\n\t\t\tfalse: \"Maaka\",\n\t\t\tyes: \"Ee\",\n\t\t\tno: \"Aowa\",\n\t\t\tbefore: \"Pele\",\n\t\t\tafter: \"Ka morago\",\n\t\t\tmore: \"Ntši\",\n\t\t\tless: \"Nnyane\"\n\t\t},\n\t\tSesotho: {\n\t\t\tendScreen: \"O di qetile kaofela dipotso mme diphetho di rometswe.\",\n\t\t\trestart: \"Leka hape\",\n\t\t\tstart: \"Start\",\n\t\t\tlandingPageHeading: \"Assessment / Survey\",\n\t\t\tlandingPageHelp: \"You are about to begin the assessment. Click the \\\"Start\\\" button below to continue.\",\n\t\t\tcomplete: \"Qeta\",\n\t\t\tnext: \"E latelang\",\n\t\t\tprevious: \"Ya pele\",\n\t\t\tfeedback: \"{count} ya {total}\",\n\t\t\ttotalQuestions: \"O fumane matshwao a feletseng mabapi le {count} ho tswa ho {total} dipotso.\",\n\t\t\ttotalTime: \"Ho o nkile {count} ho qeta tekolo.\",\n\t\t\ttotalScore: \"Matshwao a hao kaofela ke {count} ho tswa ho a {total}.\",\n\t\t\taverageTime: \"Palohare ya nako ya hao ya potso ka nngwe ke {average}.\",\n\t\t\tautomaticMark: \"{qAutoCount} (out of {questionCount}) questions, for a total of {autoTotal} marks, were marked automatically. You scored {autoMark} out of {autoTotal}.\",\n\t\t\tteacherToMark: \"O rometse dipotso {count} bakeng sa ho tshwauwa.\",\n\t\t\tshowFeedback: \"Bontsha tlaleho\",\n\t\t\tteacherFeedback: \"<strong>Tlaleho:</strong>\",\n\t\t\tfeedbackdone: \"O sebeditse ho tlaleho ya dipotso kaofela.\",\n\t\t\tnoteacherFeedback: \"Ha ho tlaleho e nehuweng.\",\n\t\t\ttrue: \"Nnete\",\n\t\t\tfalse: \"Leshano\",\n\t\t\tyes: \"Ee\",\n\t\t\tno: \"Tjhee\",\n\t\t\tbefore: \"Pele\",\n\t\t\tafter: \"Ka morao\",\n\t\t\tmore: \"Ka hodimo\",\n\t\t\tless: \"Ka tlase\"\n\t\t},\n\t\tSiswati: {\n\t\t\tendScreen: \"Uyiphendvule yonkhe imibuto futsi imiphumela yakho seyingenisiwe.\",\n\t\t\trestart: \"Yetama futsi\",\n\t\t\tstart: \"Start\",\n\t\t\tlandingPageHeading: \"Assessment / Survey\",\n\t\t\tlandingPageHelp: \"You are about to begin the assessment. Click the \\\"Start\\\" button below to continue.\",\n\t\t\tcomplete: \"Phendvula\",\n\t\t\tnext: \"Lokulandzelako\",\n\t\t\tprevious: \"Lokwendlulile\",\n\t\t\tfeedback: \"{count} kwe {total}\",\n\t\t\ttotalQuestions: \"Utfole emamaki laphelele {count} kumibuto le{total}.\",\n\t\t\ttotalTime: \"Kukutsetse {count} kucedza loluhlolo.\",\n\t\t\ttotalScore: \"Emamaki akho asaphelele angu {count} kusamba salangu {total}.\",\n\t\t\taverageTime: \"Sikhatsi sakho lesisemkhatsini sembuto ngamunye ngu {average}.\",\n\t\t\tautomaticMark: \"{qAutoCount} (out of {questionCount}) questions, for a total of {autoTotal} marks, were marked automatically. You scored {autoMark} out of {autoTotal}.\",\n\t\t\tteacherToMark: \"Ungenise imibuto lengu {count} kutsi imakwe.\",\n\t\t\tshowFeedback: \"Khombisa umbiko\",\n\t\t\tteacherFeedback: \"<strong>Umbiko:</strong>\",\n\t\t\tfeedbackdone: \"Uyibuko yonkhe imibiko yalemibuto.\",\n\t\t\tnoteacherFeedback: \"Kute umbiko loniketiwe\",\n\t\t\ttrue: \"Liciniso\",\n\t\t\tfalse: \"Ngemanga\",\n\t\t\tyes: \"Yebo\",\n\t\t\tno: \"Cha\",\n\t\t\tbefore: \"Phambilini\",\n\t\t\tafter: \"Ngemuva\",\n\t\t\tmore: \"Ngetulu\",\n\t\t\tless: \"Ngaphasi\"\n\t\t},\n\t\tTshivenda: {\n\t\t\tendScreen: \"No ṱhaphudza mbudziso dzoṱhe phindulo dzaṋu dzo ṋetshedzwa.\",\n\t\t\trestart: \"Lingedzani hafhu\",\n\t\t\tstart: \"Start\",\n\t\t\tlandingPageHeading: \"Assessment / Survey\",\n\t\t\tlandingPageHelp: \"You are about to begin the assessment. Click the \\\"Start\\\" button below to continue.\",\n\t\t\tcomplete: \"Ṱhaphudzani\",\n\t\t\tnext: \"Tevhelaho\",\n\t\t\tprevious: \"Fhiraho\",\n\t\t\tfeedback: \"{count} tsha {total}\",\n\t\t\ttotalQuestions: \"No wana maraga dzoṱhe dza {count} kha mbudziso {total}.\",\n\t\t\ttotalTime: \"Zwo ni dzhiela {count} u ṱhaphudza asesimennde.\",\n\t\t\ttotalScore: \"Maraga dzaṋu ndi {count} kha {total}.\",\n\t\t\taverageTime: \"Tshifhinga tshe na tshi fhedza kha mbudziso ndi {average}.\",\n\t\t\tautomaticMark: \"{qAutoCount} (out of {questionCount}) questions, for a total of {autoTotal} marks, were marked automatically. You scored {autoMark} out of {autoTotal}.\",\n\t\t\tteacherToMark: \"No ṋetshedza mbudziso {count} u ri dzi korekwe.\",\n\t\t\tshowFeedback: \"Sumbedzani u vhiga murahu nga ha kushumele\",\n\t\t\tteacherFeedback: \"<strong>Vhiga murahu nga ha kushumele:</strong>\",\n\t\t\tfeedbackdone: \"No shuma na u vhiga murahu nga ha kushumele kha mbudziso dzoṱhe.\",\n\t\t\tnoteacherFeedback: \"A huna u vhiga murahu nga ha kushumele ho ṋetshedzwaho.\",\n\t\t\ttrue: \"Ngoho\",\n\t\t\tfalse: \"A si ngoho\",\n\t\t\tyes: \"Ee\",\n\t\t\tno: \"Hai\",\n\t\t\tbefore: \"Nga phanḓa\",\n\t\t\tafter: \"Nga murahu\",\n\t\t\tmore: \"Fhirisa\",\n\t\t\tless: \"Zwiṱuku\"\n\t\t},\n\t\tSetswana: {\n\t\t\tendScreen: \"O feditse dipotso tsotlhe mme dipholo tsa gago di rometswe\",\n\t\t\trestart: \"Leka gape\",\n\t\t\tstart: \"Start\",\n\t\t\tlandingPageHeading: \"Assessment / Survey\",\n\t\t\tlandingPageHelp: \"You are about to begin the assessment. Click the \\\"Start\\\" button below to continue.\",\n\t\t\tcomplete: \"Feleletsa\",\n\t\t\tnext: \"Latelang\",\n\t\t\tprevious: \"Fetileng\",\n\t\t\tfeedback: \"{count} ya tse {total}\",\n\t\t\ttotalQuestions: \"O bone dimmaraka tsotlhe tsa dipotso di le {count} mo go tse {total}.\",\n\t\t\ttotalTime: \"Go fetsa tekolo go go tsere {count}.\",\n\t\t\ttotalScore: \"Maduo otlhe a gago ke {count} mo go a le {total}.\",\n\t\t\taverageTime: \"Palogare ya nako ya gago ya potso nngwe le nngwe {average}.\",\n\t\t\tautomaticMark: \"{qAutoCount} (out of {questionCount}) questions, for a total of {autoTotal} marks, were marked automatically. You scored {autoMark} out of {autoTotal}.\",\n\t\t\tteacherToMark: \"O rometse dipotso di le {count} gore di tshwaiwe.\",\n\t\t\tshowFeedback: \"Bontsha pegelokarabo\",\n\t\t\tteacherFeedback: \"<strong>Pegelokarabo:</strong>\",\n\t\t\tfeedbackdone: \"O ne wa leba pegelokarabo ya dipotso tsotlhe.\",\n\t\t\tnoteacherFeedback: \"Ga go a romelwa pegelokarabo epe.\",\n\t\t\ttrue: \"Boammaaruri\",\n\t\t\tfalse: \"Maaka\",\n\t\t\tyes: \"Ee\",\n\t\t\tno: \"Nnyaa\",\n\t\t\tbefore: \"Pele\",\n\t\t\tafter: \"Morago\",\n\t\t\tmore: \"Ntsi\",\n\t\t\tless: \"Nnye\"\n\t\t},\n\t\tIsiZulu: {\n\t\t\tendScreen: \"Ngabe uyigcwalise yonke imibuzo futhi ngabe uyilethile imiphumela yakho?\",\n\t\t\trestart: \"Phinda uzame futhi\",\n\t\t\tstart: \"Start\",\n\t\t\tlandingPageHeading: \"Assessment / Survey\",\n\t\t\tlandingPageHelp: \"You are about to begin the assessment. Click the \\\"Start\\\" button below to continue.\",\n\t\t\tcomplete: \"Gcwalisa\",\n\t\t\tnext: \"Okulandelayo\",\n\t\t\tprevious: \"Okwedlule\",\n\t\t\tfeedback: \"{count} kokuyi {total}\",\n\t\t\ttotalQuestions: \"Uthole amaphuzu aphelele kwi {count} kwawu {total} lemibuzo.\",\n\t\t\ttotalTime: \"Kukuthathe {count} ukuqedela ukuhlolwa.\",\n\t\t\ttotalScore: \"Isibalo sakho esiphelele siwu {count} kokuyi {total}.\",\n\t\t\taverageTime: \"Isikhathi esilinganiselwe sakho kumbuzo ngamunye sibe wu {average}.\",\n\t\t\tautomaticMark: \"{qAutoCount} (out of {questionCount}) questions, for a total of {autoTotal} marks, were marked automatically. You scored {autoMark} out of {autoTotal}.\",\n\t\t\tteacherToMark: \"Ulethe inani lemibuzo ewu {count} ukuze izomakwa.\",\n\t\t\tshowFeedback: \"Bonisa izimpendulo\",\n\t\t\tteacherFeedback: \"<strong>Izimpendulo:</strong>\",\n\t\t\tfeedbackdone: \"Usubheke izimpendulo zayo yonke imibuzo.\",\n\t\t\tnoteacherFeedback: \"Akukho zimpendulo ezihlinzekiwe.\",\n\t\t\ttrue: \"Iqiniso\",\n\t\t\tfalse: \"Iphutha\",\n\t\t\tyes: \"Yebo\",\n\t\t\tno: \"Cha\",\n\t\t\tbefore: \"Ngaphambi\",\n\t\t\tafter: \"Ngemuva\",\n\t\t\tmore: \"Ngaphezulu\",\n\t\t\tless: \"Ngaphansi\"\n\t\t},\n\t\tIsiNdebele: {\n\t\t\tendScreen: \"Uyiqedile yoke imibuzo begodu imiphumela yakho ithunyelwe.\",\n\t\t\trestart: \"Zama godu\",\n\t\t\tstart: \"Start\",\n\t\t\tlandingPageHeading: \"Assessment / Survey\",\n\t\t\tlandingPageHelp: \"You are about to begin the assessment. Click the \\\"Start\\\" button below to continue.\",\n\t\t\tcomplete: \"Zalisa\",\n\t\t\tnext: \"Okulandelako\",\n\t\t\tprevious: \"Kwangaphambilini\",\n\t\t\tfeedback: \"{count} se {total}\",\n\t\t\ttotalQuestions: \"Uthole amamaksi apheleleko walokha {count} kuna {total} lemibuzo.\",\n\t\t\ttotalTime: \"Kukuthethe  {count} ukobana uqede ukuhlolwa.\",\n\t\t\ttotalScore: \"Inani lamamaksakho {count} kune {total}.\",\n\t\t\taverageTime: \"Isikhathi sakho esibekiweko embuzweni ngamunye {average}.\",\n\t\t\tautomaticMark: \"{qAutoCount} (out of {questionCount}) questions, for a total of {autoTotal} marks, were marked automatically. You scored {autoMark} out of {autoTotal}.\",\n\t\t\tteacherToMark: \"Uthumele {count} lemibuzo ukobana itshwaywe.\",\n\t\t\tshowFeedback: \"Tjengisa umbiko obuyako.\",\n\t\t\tteacherFeedback: \"<strong>Umbiko obuyako:</strong>\",\n\t\t\tfeedbackdone: \"Uqalisise kuhle umbiko obuyako wayo yoke imibuzo.\",\n\t\t\tnoteacherFeedback: \"Awukho umbiko obuyako othunyelweko.\",\n\t\t\ttrue: \"Liqiniso\",\n\t\t\tfalse: \"Mamala\",\n\t\t\tyes: \"Iye\",\n\t\t\tno: \"Awa\",\n\t\t\tbefore: \"Ngaphambili\",\n\t\t\tafter: \"Ngemva\",\n\t\t\tmore: \"Okunengi\",\n\t\t\tless: \"Okuncani\"\n\t\t}\n\t};\n\n\treturn Iago;\n});\n\nif (typeof exports === \"undefined\") window.iago = new window.Iago();\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImlhZ28uanMiXSwibmFtZXMiOlsicm9vdCIsImZhY3RvcnkiLCJleHBvcnRzIiwibW9kdWxlIiwiSWFnbyIsIk5hdGl2ZUN1c3RvbUV2ZW50Iiwid2luZG93IiwiQ3VzdG9tRXZlbnQiLCJ1c2VOYXRpdmUiLCJwIiwiZGV0YWlsIiwiZm9vIiwidHlwZSIsImUiLCJldmVudGVyIiwiZG9jdW1lbnQiLCJjcmVhdGVFdmVudCIsInBhcmFtcyIsImluaXRDdXN0b21FdmVudCIsImJ1YmJsZXMiLCJjYW5jZWxhYmxlIiwiY3JlYXRlRXZlbnRPYmplY3QiLCJCb29sZWFuIiwidXJsIiwib3B0aW9ucyIsInBhcmVudCIsImxvYWRlZEJlZm9yZSIsImxhbmRpbmdQYWdlU3RhcnRlZCIsInByb3RvdHlwZSIsImxvYWRVSSIsInNlbGYiLCJxdWVyeVNlbGVjdG9yIiwib25jbGljayIsInJlc3RhcnQiLCJjYWxsIiwiY29tcGxldGVRdWVzdGlvbnMiLCJldnQiLCJuYXZpZ2F0ZVF1ZXN0aW9ucyIsInJlc3RhcnRXaXRoRmVlZGJhY2siLCJzdGFydCIsInJlc291cmNlIiwiYXR0YWNobWVudCIsIm9wdHMiLCJFcnJvciIsImVkaXRNb2RlIiwic2V0dGluZ3MiLCJyZXF1aXJlQ29kZSIsImluZGV4T2YiLCJsYW5ndWFnZSIsInF1ZXN0aW9uRGF0YSIsIkpTT04iLCJwYXJzZSIsImNvZGUiLCJwYXlsb2FkVmVyc2lvbiIsInN0YXRlIiwicHJldmlld01vZGUiLCJsb2FkTGFuZGluZ1BhZ2UiLCJzdHlsZSIsImRpc3BsYXkiLCJnb3RDb2RlIiwiYXNrRm9yQ29kZSIsIlN5bmMiLCJhc3Nlc3NtZW50VHJhbnNpdGlvbiIsImFzc2Vzc21lbnRDb21wbGV0ZSIsIl9pZCIsImN1cnJlbnRRdWVzdGlvbiIsInF1ZXN0aW9ucyIsImZlZWRiYWNrTW9kZSIsInRyYW5zaXRpb24iLCJhc3Nlc3NtZW50RGF0YSIsInZlcnNpb25lZCIsInR4dCIsInRleHRDb250ZW50IiwidmVyc2lvbiIsImRpc2FibGVSYW5kb21pemF0aW9uIiwic2h1ZmZsZSIsIm1hcCIsInByZXBhcmVRdWVzdGlvbiIsImJpbmQiLCJmZWVkYmFjayIsInNjb3JlcyIsIm1hcmthYmxlQ291bnQiLCJyZWR1Y2UiLCJzdW0iLCJudW0iLCJtYXJrIiwidGltZSIsIm1heFNjb3JlIiwiZ2V0TWF4U2NvcmUiLCJzZXJ2ZXJTYXZlIiwic3RyaW5naWZ5IiwicmVzdWx0cyIsImFjdGl2aXR5IiwiaW5uZXJIVE1MIiwiaSIsImxlbmd0aCIsImFkZEV2ZW50TGlzdGVuZXIiLCJpdGVtcyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJqdW1wVG9RdWVzdGlvbiIsImlzQnJvd3NlciIsImlzT3BlcmEiLCJvcHIiLCJhZGRvbnMiLCJvcGVyYSIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsImlzRmlyZWZveCIsIkluc3RhbGxUcmlnZ2VyIiwiaXNDaHJvbWUiLCJjaHJvbWUiLCJ3ZWJzdG9yZSIsInJ1bnRpbWUiLCJwbGF0Zm9ybSIsInN0YXJ0c1dpdGgiLCJwYWRkaW5nQm90dG9tIiwibG9hZFF1ZXN0aW9uRGF0YSIsInVuZGVmaW5lZCIsIm9uY2hhbmdlIiwib25mb2N1cyIsInZhbHVlIiwicmVwbGFjZSIsInRvTG93ZXJDYXNlIiwicGFyc2VJbnQiLCJ4b3IiLCJyZWFsQ29kZSIsInRvU3RyaW5nIiwicSIsImlkeCIsImlkIiwiYW5zd2VycyIsImNvcnJlY3RBbnN3ZXJzIiwiY29uY2F0Iiwib3RoZXJBbnN3ZXJzIiwic29ydCIsImEiLCJiIiwic2VsZWN0ZWRBbnN3ZXJzIiwiYW5zd2VyIiwibWF0Y2hlcyIsImxlZnQiLCJyaWdodCIsInJpZ2h0UHJlU2h1ZmZsZSIsInNsaWNlIiwibGVmdFByZVNodWZmbGUiLCJlbnRlcmVkQW5zd2VycyIsImNvbnRlbnQiLCJicmVha2Rvd24iLCJzcGxpdCIsImZvckVhY2giLCJwYXJ0IiwidGVzdCIsInB1c2giLCJyZWRyYXciLCJsYW5nIiwicmVkb0luc3RydWN0aW9ucyIsInN1YnR5cGUiLCJhc3Nlc21lbnRzIiwic3VidHlwZXMiLCJpbnN0cnVjdGlvbnMiLCJkcmF3IiwiaW5kZXgiLCJ1cGRhdGVDdXJyZW50TW9kZWwiLCJtb2RlbCIsImFkZFF1ZXN0aW9uIiwicXVlc3Rpb24iLCJub0RyYXciLCJyZW1vdmVRdWVzdGlvbiIsInNwbGljZSIsInNldFByb2dyZXNzIiwib3B0aW9uIiwib3B0aW9uQ29udGVudCIsIm9wdGlvbkJvcmRlciIsImNvbXBsZXRlIiwibmV4dCIsInByZXZpb3VzIiwic2hvd0ZlZWRiYWNrIiwidGVhY2hlckZlZWRiYWNrIiwibm90ZWFjaGVyRmVlZGJhY2siLCJzZXRBdHRyaWJ1dGUiLCJxdWVzdGlvbkltYWdlIiwiaW1nIiwiY3JlYXRlRWxlbWVudCIsInNyYyIsImVsbSIsImhhc0NoaWxkTm9kZXMiLCJyZW1vdmVDaGlsZCIsImxhc3RDaGlsZCIsImFwcGVuZENoaWxkIiwiZmVlZGJhY2tTdGF0ZSIsImNsYXNzTGlzdCIsImFkZCIsImFkZFRhcCIsInNlbGVjdE9wdGlvbiIsInJldHVybk5vZGUiLCJob3N0IiwiY2hlY2siLCJjaGsiLCJmb3JtYXQiLCJkZWwiLCJwbGFjZWhvbGRlciIsInByZXZOZXh0QnV0dG9ucyIsImNvbnRhaW5lciIsInBvdGVudGlhbFNjb3JlIiwid2lkdGgiLCJtYXhXaWR0aCIsIm9ua2V5dXAiLCJwYXJhZ3JhcGhIYW5kbGVyIiwidG90YWwiLCJtYXJrcyIsImJhY2tncm91bmRQYWxsZXR0ZSIsIm1hdGNoU2VsZWN0aW9uIiwic2VsZWN0ZWQiLCJjdXJyTWF0Y2hlcyIsImFhIiwiYmciLCJwb3AiLCJsaXN0bGVmdCIsInNlbGVjdE1hdGNoIiwibGlzdHJpZ2h0IiwiYnIiLCJwbGFjZWhvbGRlcjIiLCJmaWxsZXIiLCJyZW1vdmUiLCJtYXRjaCIsImlubmVyT3B0aW9uIiwicHJldmlld0ZpbGxJbkhhbmRsZXIiLCJza2lwcGVkIiwiZmlsdGVyIiwiaXRlbSIsImVsIiwidHJpbSIsInF1ZXN0aW9uU3RhcnQiLCJEYXRlIiwidmFsdWVPZiIsImRpc3BhdGNoRXZlbnQiLCJzY3JvbGxUb3AiLCJsYW5kaW5nUGFnZUhlbHAiLCJsYW5kaW5nUGFnZUhlYWRpbmciLCJhc3Nlc3NtZW50VGl0bGUiLCJpbnN0YW5jZVRpdGxlIiwidGl0bGUiLCJkaXJlY3Rpb24iLCJjdXJyZW50VGFyZ2V0Iiwib3JpZ2luYWxUYXJnZXQiLCJjb250YWlucyIsImV4dHJhY3RNYXJrIiwic3VtT2YiLCJrZXkiLCJoYXNPd25Qcm9wZXJ0eSIsInRhcmdldCIsIm5vZGUiLCJibGFua0hhbmRsZXIiLCJ0ZXh0YXJlYSIsIm1hcmt1cCIsInRleHRpbnB1dCIsImdldEF0dHJpYnV0ZSIsImFsbCIsImNhbkFkdmFuY2UiLCJ0b2dnbGVQcmV2IiwidG9nZ2xlIiwiaGlkZSIsInRvZ2dsZU5leHQiLCJ0b2dnbGVDb21wbGV0ZSIsInNraXBwZWRRdWVzdGlvbnMiLCJjb21wbGV0ZUJ1dHRvbnMiLCJzZWxlY3RBbnN3ZXIiLCJhY3Rpb24iLCJjbGVhclNlbGVjdGVkIiwicGFyZW50Tm9kZSIsImZpcnN0Q2hpbGQiLCJuZXh0RWxlbWVudFNpYmxpbmciLCJuZXh0U2libGluZyIsIngiLCJzaWRlIiwib3RoZXJzaWRlIiwiY29ycmVjdCIsImRhdGEiLCJzYXZlZCIsImJhY2tUb0FwcCIsIm9wZW4iLCJjbG9zZSIsInByb2dyZXNzIiwiTWF0aCIsImZsb29yIiwiY2VpbCIsImhpZGVDb21wbGV0ZUJ1dHRvbnMiLCJlbmRTY3JlZW4iLCJkaXNhYmxlUmVzdWx0IiwicXVlc3Rpb25Db3VudCIsInFBdXRvQ291bnQiLCJxTWFudWFsQ291bnQiLCJtYW51YWxUb3RhbCIsImF1dG9Ub3RhbCIsImF1dG9NYXJrIiwic2NvcmVzT2JqIiwiT2JqZWN0Iiwia2V5cyIsInNjb3JlIiwidGVhY2hlclRvTWFyayIsImF1dG9tYXRpY01hcmsiLCJ0b3RhbFF1ZXN0aW9ucyIsInRvdGFsU2NvcmUiLCJ0b3RhbFRpbWUiLCJ0aW1lVG9NaW5TZWMiLCJmZWVkYmFja2RvbmUiLCJ1c2VyIiwibmV3U2NvcmUiLCJhbnMiLCJtYXgiLCJ1c2VyQW5zd2VyIiwicmV0IiwibmFtZSIsIm9iaiIsImZpZWxkIiwiYXJyIiwiaiIsInJhbmRvbSIsImRhdGUiLCJvdXRwdXQiLCJ0b0lTT1N0cmluZyIsInN1YnN0ciIsImV2IiwidHlwZTEiLCJkZXNjcmlwdGlvbiIsIkFmcmlrYWFucyIsIkVuZ2xpc2giLCJYaXRzb25nYSIsIklzaU5kZWJlbGUiLCJJc2lYaG9zYSIsIlNlcGVkaSIsIlNlc290aG8iLCJTaXN3YXRpIiwiVHNoaXZlbmRhIiwiU2V0c3dhbmEiLCJJc2ladWx1Iiwic3VidHlwZTEiLCJzdWJ0eXBlMiIsInN1YnR5cGUzIiwidHlwZTIiLCJ0eXBlMyIsInR5cGU0IiwiYXZlcmFnZVRpbWUiLCJ0cnVlIiwiZmFsc2UiLCJ5ZXMiLCJubyIsImJlZm9yZSIsImFmdGVyIiwibW9yZSIsImxlc3MiLCJpYWdvIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQyxXQUFTQSxJQUFULEVBQWVDLE9BQWYsRUFBd0I7QUFDeEIsS0FBSSxPQUFPQyxPQUFQLEtBQW1CLFdBQXZCLEVBQW9DO0FBQ25DQyxTQUFPRCxPQUFQLEdBQWlCRCxTQUFqQjtBQUNBLEVBRkQsTUFHSTtBQUNIRCxPQUFLSSxJQUFMLEdBQVlILFNBQVo7QUFDQTtBQUNELENBUEEsYUFPTyxZQUFXO0FBQ2xCOztBQUVBOztBQUVBLEtBQUlJLG9CQUFvQkMsT0FBT0MsV0FBL0I7O0FBRUEsS0FBSUMsWUFBWSxTQUFaQSxTQUFZLEdBQVc7QUFDMUIsTUFBSTtBQUNILE9BQUlDLElBQUksSUFBSUosaUJBQUosQ0FBc0IsS0FBdEIsRUFBNkIsRUFBRUssUUFBUSxFQUFFQyxLQUFLLEtBQVAsRUFBVixFQUE3QixDQUFSO0FBQ0EsVUFBT0YsRUFBRUcsSUFBRixLQUFXLEtBQVgsSUFBb0JILEVBQUVDLE1BQUYsQ0FBU0MsR0FBVCxLQUFpQixLQUE1QztBQUNBLEdBSEQsQ0FJQSxPQUFPRSxDQUFQLEVBQVU7QUFDVDtBQUNBO0FBQ0QsU0FBTyxLQUFQO0FBQ0EsRUFURDs7QUFX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REFiRjtBQWNYMUMsa0JBQWUseUpBZEo7QUFlWEQsa0JBQWUsOENBZko7QUFnQlgzSCxpQkFBYywwQkFoQkg7QUFpQlhDLG9CQUFpQixrQ0FqQk47QUFrQlhnSSxpQkFBYyxtREFsQkg7QUFtQlgvSCxzQkFBbUIscUNBbkJSO0FBb0JYcUssU0FBTSxVQXBCSztBQXFCWEMsVUFBTyxRQXJCSTtBQXNCWEMsUUFBSyxLQXRCTTtBQXVCWEMsT0FBSSxLQXZCTztBQXdCWEMsV0FBUSxhQXhCRztBQXlCWEMsVUFBTyxRQXpCSTtBQTBCWEMsU0FBTSxVQTFCSztBQTJCWEMsU0FBTTtBQTNCSztBQW5TTyxFQUFwQjs7QUFrVUEsUUFBTzFWLElBQVA7QUFDQSxDQXg5REEsQ0FBRDs7QUEwOURBLElBQUksT0FBT0YsT0FBUCxLQUFtQixXQUF2QixFQUNDSSxPQUFPeVYsSUFBUCxHQUFjLElBQUl6VixPQUFPRixJQUFYLEVBQWQiLCJmaWxlIjoiaWFnby5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuKGZ1bmN0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYgKHR5cGVvZiBleHBvcnRzICE9PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdH1cbmVsc2Uge1xuXHRcdHJvb3QuSWFnbyA9IGZhY3RvcnkoKTtcblx0fVxufSh0aGlzLCBmdW5jdGlvbigpIHtcblx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0Lyplc2xpbnQtZW52IGJyb3dzZXIgKi9cblxuXHR2YXIgTmF0aXZlQ3VzdG9tRXZlbnQgPSB3aW5kb3cuQ3VzdG9tRXZlbnQ7XG5cblx0dmFyIHVzZU5hdGl2ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdHRyeSB7XG5cdFx0XHR2YXIgcCA9IG5ldyBOYXRpdmVDdXN0b21FdmVudChcImNhdFwiLCB7IGRldGFpbDogeyBmb286IFwiYmFyXCIgfSB9KTtcblx0XHRcdHJldHVybiBwLnR5cGUgPT09IFwiY2F0XCIgJiYgcC5kZXRhaWwuZm9vID09PSBcImJhclwiO1xuXHRcdH1cblx0XHRjYXRjaCAoZSkge1xuXHRcdFx0Ly8gWmlsY2hcblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBDcm9zcy1icm93c2VyIGBDdXN0b21FdmVudGAgY29uc3RydWN0b3IuXG5cdCAqXG5cdCAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9DdXN0b21FdmVudC5DdXN0b21FdmVudFxuXHQgKlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXG5cdHZhciBOYXRpdmVDdXN0b21FdmVudCA9IHdpbmRvdy5DdXN0b21FdmVudDtcblxuXHRmdW5jdGlvbiB1c2VOYXRpdmUgKCkge1xuXHQgIHRyeSB7XG5cdFx0dmFyIHAgPSBuZXcgTmF0aXZlQ3VzdG9tRXZlbnQoXCJjYXRcIiwgeyBkZXRhaWw6IHsgZm9vOiBcImJhclwiIH0gfSk7XG5cdFx0cmV0dXJuICBcImNhdFwiID09PSBwLnR5cGUgJiYgXCJiYXJcIiA9PT0gcC5kZXRhaWwuZm9vO1xuXHQgIH0gY2F0Y2ggKGUpIHtcblx0ICB9XG5cdCAgcmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyb3NzLWJyb3dzZXIgYEN1c3RvbUV2ZW50YCBjb25zdHJ1Y3Rvci5cblx0ICpcblx0ICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0N1c3RvbUV2ZW50LkN1c3RvbUV2ZW50XG5cdCAqXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cblx0dmFyIGV2ZW50ZXIgPSB1c2VOYXRpdmUoKSA/IE5hdGl2ZUN1c3RvbUV2ZW50IDpcblxuXHQvLyBJRSA+PSA5XG5cdFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUV2ZW50ID8gZnVuY3Rpb24gQ3VzdG9tRXZlbnQgKHR5cGUsIHBhcmFtcykge1xuXHQgIHZhciBlID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJDdXN0b21FdmVudFwiKTtcblx0ICBpZiAocGFyYW1zKSB7XG5cdFx0ZS5pbml0Q3VzdG9tRXZlbnQodHlwZSwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlLCBwYXJhbXMuZGV0YWlsKTtcblx0ICB9IGVsc2Uge1xuXHRcdGUuaW5pdEN1c3RvbUV2ZW50KHR5cGUsIGZhbHNlLCBmYWxzZSwgdm9pZCAwKTtcblx0ICB9XG5cdCAgcmV0dXJuIGU7XG5cdH0gOlxuXG5cdC8vIElFIDw9IDhcblx0ZnVuY3Rpb24gQ3VzdG9tRXZlbnQgKHR5cGUsIHBhcmFtcykge1xuXHQgIHZhciBlID0gZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3QoKTtcblx0ICBlLnR5cGUgPSB0eXBlO1xuXHQgIGlmIChwYXJhbXMpIHtcblx0XHRlLmJ1YmJsZXMgPSBCb29sZWFuKHBhcmFtcy5idWJibGVzKTtcblx0XHRlLmNhbmNlbGFibGUgPSBCb29sZWFuKHBhcmFtcy5jYW5jZWxhYmxlKTtcblx0XHRlLmRldGFpbCA9IHBhcmFtcy5kZXRhaWw7XG5cdCAgfSBlbHNlIHtcblx0XHRlLmJ1YmJsZXMgPSBmYWxzZTtcblx0XHRlLmNhbmNlbGFibGUgPSBmYWxzZTtcblx0XHRlLmRldGFpbCA9IHZvaWQgMDtcblx0ICB9XG5cdCAgcmV0dXJuIGU7XG5cdH07XG5cblx0aWYoIXVzZU5hdGl2ZSgpKVxuXHRcdHdpbmRvdy5DdXN0b21FdmVudCA9IGV2ZW50ZXI7XG5cblx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuXHRHZW5lcmFsIE5vdGVzOlxuXHRUeXBlIDE6IENob29zZSB0aGUgY29ycmVjdCBvcHRpb24gKEZlZWRiYWNrICsgc2NvcmUpXG5cdFR5cGUgMjogUGFyYWdyYXBoIFJlc3BvbnNlIChGZWVkYmFjaylcblx0VHlwZSAzOiBNYXRjaCB0aGUgb3B0aW9ucyAoRmVlZGJhY2sgKyBzY29yZSlcblx0VHlwZSA0OiBGaWxsIGluIHRoZSBibGFua3MgKEZlZWRiYWNrICsgc2NvcmUpXG5cblx0KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5cdHZhciB1cmw7XG5cblx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuXHRTdGFydCBvZiBhc3Nlc3NtZW50IGZ1bmN0aW9uYWxpdHlcblxuXHQqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cblx0dmFyIElhZ28gPSBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRcdGlmKCF0aGlzLm9wdGlvbnMucGFyZW50KVxuXHRcdFx0dGhpcy5wYXJlbnQgPSBkb2N1bWVudDtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnBhcmVudCA9IHRoaXMub3B0aW9ucy5wYXJlbnQ7XG5cblx0XHR0aGlzLmxvYWRlZEJlZm9yZSA9IGZhbHNlO1xuXHRcdHRoaXMubGFuZGluZ1BhZ2VTdGFydGVkID0gZmFsc2U7XG5cdH07XG5cblx0SWFnby5wcm90b3R5cGUubG9hZFVJID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHNlbGYgPSB0aGlzO1xuXG5cdFx0dGhpcy5wYXJlbnQucXVlcnlTZWxlY3RvcihcIiNpYWdvLXJlc3RhcnQtcXVlc3Rpb25cIikub25jbGljayA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0c2VsZi5yZXN0YXJ0LmNhbGwoc2VsZik7XG5cdFx0fTtcblx0XHQvLyB0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tYmFjay10by1hcHBcIikub25jbGljayA9IGZ1bmN0aW9uKCkge1xuXHRcdC8vIFx0c2VsZi5iYWNrVG9BcHAuY2FsbChzZWxmKTtcblx0XHQvLyB9O1xuXHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1jb21wbGV0ZS1xdWVzdGlvblwiKS5vbmNsaWNrID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRzZWxmLmNvbXBsZXRlUXVlc3Rpb25zLmNhbGwoc2VsZik7XG5cdFx0fTtcblx0XHR0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tbmV4dC1xdWVzdGlvblwiKS5vbmNsaWNrID0gZnVuY3Rpb24oZXZ0KSB7XG5cdFx0XHRzZWxmLm5hdmlnYXRlUXVlc3Rpb25zLmNhbGwoc2VsZiwgdHJ1ZSwgZXZ0KTtcblx0XHR9O1xuXHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1wcmV2aW91cy1xdWVzdGlvblwiKS5vbmNsaWNrID0gZnVuY3Rpb24oZXZ0KSB7XG5cdFx0XHRzZWxmLm5hdmlnYXRlUXVlc3Rpb25zLmNhbGwoc2VsZiwgZmFsc2UsIGV2dCk7XG5cdFx0fTtcblx0XHR0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tZmVlZGJhY2stcXVlc3Rpb25cIikub25jbGljayA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0c2VsZi5yZXN0YXJ0V2l0aEZlZWRiYWNrLmNhbGwoc2VsZik7XG5cdFx0fTtcblx0fTtcblxuXHRJYWdvLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uKHJlc291cmNlLCBhdHRhY2htZW50LCBvcHRzKSB7XG5cdFx0aWYoIXJlc291cmNlKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiTm8gYXNzZXNzbWVudCBkYXRhIHdhcyBwcm92aWRlZDsgY2Fubm90IHN0YXJ0XCIpO1xuXG5cdFx0b3B0cyA9IG9wdHMgfHwge307XG5cblx0XHRpZihvcHRzLmVkaXRNb2RlIHx8IHRoaXMub3B0aW9ucy5lZGl0TW9kZSlcblx0XHRcdGF0dGFjaG1lbnQgPSB7IHNldHRpbmdzOiB7IHJlcXVpcmVDb2RlOiBmYWxzZSB9IH07XG5cblx0XHRpZihbXCJBZnJpa2FhbnNcIiwgXCJFbmdsaXNoXCIsIFwiSXNpTmRlYmVsZVwiLCBcIlNlcGVkaVwiLCBcIlNlc290aG9cIiwgXCJTaXN3YXRpXCIsIFwiU2V0c3dhbmFcIiwgXCJYaXRzb25nYVwiLCBcIlRzaGl2ZW5kYVwiLCBcIklzaVhob3NhXCIsIFwiSXNpWnVsdVwiXS5pbmRleE9mKHJlc291cmNlLmxhbmd1YWdlKSA9PT0gLTEpXG5cdFx0XHRyZXNvdXJjZS5sYW5ndWFnZSA9IFwiRW5nbGlzaFwiO1xuXG5cdFx0aWYodHlwZW9mIHJlc291cmNlLnF1ZXN0aW9uRGF0YSA9PT0gXCJzdHJpbmdcIilcblx0XHRcdHJlc291cmNlLnF1ZXN0aW9uRGF0YSA9IEpTT04ucGFyc2UocmVzb3VyY2UucXVlc3Rpb25EYXRhKTtcblxuXHRcdGlmKHJlc291cmNlLnF1ZXN0aW9uRGF0YS5xdWVzdGlvbkRhdGEpIHtcblx0XHRcdHJlc291cmNlLmNvZGUgPSByZXNvdXJjZS5xdWVzdGlvbkRhdGEuY29kZTtcblx0XHRcdHJlc291cmNlLnF1ZXN0aW9uRGF0YSA9IHJlc291cmNlLnF1ZXN0aW9uRGF0YS5xdWVzdGlvbkRhdGE7XG5cdFx0XHRyZXNvdXJjZS5wYXlsb2FkVmVyc2lvbiA9IHJlc291cmNlLnF1ZXN0aW9uRGF0YS5wYXlsb2FkVmVyc2lvbjtcblx0XHR9XG5cblx0XHRpZighb3B0cy5lZGl0TW9kZSAmJiAhdGhpcy5vcHRpb25zLmVkaXRNb2RlICYmIHRoaXMubGFuZGluZ1BhZ2VTdGFydGVkID09PSBmYWxzZSkge1xuXHRcdFx0dGhpcy5zdGF0ZSA9IHt9O1xuXHRcdFx0dGhpcy5zdGF0ZS5wcmV2aWV3TW9kZSA9IG9wdHMucHJldmlld01vZGUgfHwgdGhpcy5vcHRpb25zLnByZXZpZXdNb2RlO1xuXHRcdFx0dGhpcy5sb2FkTGFuZGluZ1BhZ2UocmVzb3VyY2UsIGF0dGFjaG1lbnQsIG9wdHMpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1hc3Nlc3NtZW50XCIpLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcblx0XHR9XG5cblx0XHR0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tc3RhcnQtcXVlc3Rpb25cIikuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXG5cdFx0dGhpcy5hdHRhY2htZW50ID0gYXR0YWNobWVudDtcblxuXHRcdGlmKCF0aGlzLmdvdENvZGUgJiYgdGhpcy5hdHRhY2htZW50LnNldHRpbmdzLnJlcXVpcmVDb2RlKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5hc2tGb3JDb2RlKHJlc291cmNlLCBhdHRhY2htZW50LCBvcHRzKTtcblx0XHR9XG5cblx0XHR0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tY29kZS1wcm9tcHRcIikuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1hc3Nlc3NtZW50XCIpLnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuXG5cdFx0Ly8gTW9jayBvdXQgdGhlIFN5bmMgb3BlcmF0aW9ucyBpZiB0aGV5J3JlIG1pc3Npbmdcblx0XHRpZighd2luZG93LlN5bmMpXG5cdFx0XHR3aW5kb3cuU3luYyA9IHt9O1xuXG5cdFx0aWYoIXdpbmRvdy5TeW5jLmFzc2Vzc21lbnRUcmFuc2l0aW9uKVxuXHRcdFx0d2luZG93LlN5bmMuYXNzZXNzbWVudFRyYW5zaXRpb24gPSBmdW5jdGlvbigpIHsgIH07XG5cdFx0aWYoIXdpbmRvdy5TeW5jLmFzc2Vzc21lbnRDb21wbGV0ZSlcblx0XHRcdHdpbmRvdy5TeW5jLmFzc2Vzc21lbnRDb21wbGV0ZSA9IGZ1bmN0aW9uKCkgeyAgfTtcblxuXHRcdHVybCA9IFwiL2FwaS8xLjAvYXNzZXNzbWVudHMvXCIgKyB0aGlzLmF0dGFjaG1lbnQucmVzb3VyY2UgKyBcIi9tYXJrcy9cIiArIHRoaXMuYXR0YWNobWVudC5faWQ7XG5cblx0XHR0aGlzLmxvYWRVSSgpO1xuXG5cdFx0dGhpcy5zdGF0ZSA9IHtcblx0XHRcdC8vIEluZGV4IG9mIHRoZSBjdXJyZW50IHF1ZXN0aW9uIGJlaW5nIHZpZXdlZFxuXHRcdFx0Y3VycmVudFF1ZXN0aW9uOiBvcHRzLmN1cnJlbnRRdWVzdGlvbiB8fCB0aGlzLm9wdGlvbnMuY3VycmVudFF1ZXN0aW9uIHx8IC0xLFxuXHRcdFx0Ly8gU3RhdGUgb2YgYWxsIHF1ZXN0aW9ucyBhbnN3ZXJlZFxuXHRcdFx0cXVlc3Rpb25zOiB7fSxcblx0XHRcdC8vIEFyZSB3ZSBpbiBmZWVkYmFjayBtb2RlP1xuXHRcdFx0ZmVlZGJhY2tNb2RlOiBvcHRzLmZlZWRiYWNrTW9kZSB8fCAodGhpcy5zdGF0ZSA/IHRoaXMuc3RhdGUuZmVlZGJhY2tNb2RlIDogISF0aGlzLm9wdGlvbnMuZmVlZGJhY2tNb2RlKSxcblx0XHRcdC8vIEFyZSB3ZSBpbiBlZGl0IG1vZGU/XG5cdFx0XHRlZGl0TW9kZTogb3B0cy5lZGl0TW9kZSB8fCB0aGlzLm9wdGlvbnMuZWRpdE1vZGUsXG5cdFx0XHQvLyBBcmUgd2UgaW4gcHJldmlldyBtb2RlP1xuXHRcdFx0cHJldmlld01vZGU6IG9wdHMucHJldmlld01vZGUgfHwgdGhpcy5vcHRpb25zLnByZXZpZXdNb2RlLFxuXHRcdH07XG5cblx0XHR0aGlzLnRyYW5zaXRpb24oXCJhc3Nlc3NtZW50LXN0YXJ0XCIsIHsgcmVzb3VyY2U6IHJlc291cmNlLl9pZCwgYXR0YWNobWVudDogYXR0YWNobWVudC5faWQgfSk7XG5cblx0XHR0aGlzLmFzc2Vzc21lbnREYXRhID0gcmVzb3VyY2U7XG5cblx0XHRpZighdGhpcy5zdGF0ZS5wcmV2aWV3TW9kZSAmJiAhdGhpcy5zdGF0ZS5lZGl0TW9kZSAmJiAhdGhpcy52ZXJzaW9uZWQpIHtcblx0XHRcdHZhciB0eHQgPSB0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI3ZlcnNpb25cIikudGV4dENvbnRlbnQ7XG5cdFx0XHR0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI3ZlcnNpb25cIikudGV4dENvbnRlbnQgPSB0eHQgKyBcIjsgdlwiICsgdGhpcy5hc3Nlc3NtZW50RGF0YS52ZXJzaW9uO1xuXHRcdFx0dGhpcy52ZXJzaW9uZWQgPSB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIFNodWZmbGUgdGhlIHF1ZXN0aW9ucyAtIGlmIHdlJ3JlIG5vdCBpbiBlaXRoZXIgZWRpdCBvciBwcmV2aWV3IG1vZGVzIGFuZFxuXHRcdC8vIHJhbmRvbWl6YXRpb24gaGFzIG5vdCBiZWVuIGRpc2FibGVkXG5cdFx0aWYgKCF0aGlzLmxvYWRlZEJlZm9yZSAmJiAhdGhpcy5zdGF0ZS5lZGl0TW9kZSAmJiAhdGhpcy5zdGF0ZS5wcmV2aWV3TW9kZSAmJlxuXHRcdFx0IXRoaXMuYXR0YWNobWVudC5zZXR0aW5ncy5kaXNhYmxlUmFuZG9taXphdGlvbilcblx0XHRcdHRoaXMuYXNzZXNzbWVudERhdGEucXVlc3Rpb25EYXRhID0gdGhpcy5zaHVmZmxlKHRoaXMuYXNzZXNzbWVudERhdGEucXVlc3Rpb25EYXRhKTtcblxuXHRcdC8vIFNodWZmbGUgdGhlIGluZGl2aWR1YWwgcXVlc3Rpb25zJyBhbnN3ZXJzLCBpZiB3ZSdyZSBub3QgaW4gZWRpdCBtb2RlXG5cdFx0dGhpcy5hc3Nlc3NtZW50RGF0YS5xdWVzdGlvbkRhdGEgPSB0aGlzLmFzc2Vzc21lbnREYXRhLnF1ZXN0aW9uRGF0YS5tYXAodGhpcy5wcmVwYXJlUXVlc3Rpb24uYmluZCh0aGlzKSk7XG5cblx0XHR0aGlzLmZlZWRiYWNrID0ge1xuXHRcdFx0c2NvcmVzOiB7fSxcblx0XHRcdG1hcmthYmxlQ291bnQ6IHJlc291cmNlLnF1ZXN0aW9uRGF0YS5yZWR1Y2UoZnVuY3Rpb24oc3VtLCBudW0pIHtcblx0XHRcdFx0aWYobnVtLnR5cGUgIT09IDIpXG5cdFx0XHRcdFx0c3VtICs9IDE7XG5cdFx0XHRcdHJldHVybiBzdW07XG5cdFx0XHR9LCAwKSxcblx0XHRcdG1hcms6IDAsXG5cdFx0XHR0aW1lOiAwLFxuXHRcdFx0bWF4U2NvcmU6IHRoaXMuZ2V0TWF4U2NvcmUoKSxcblx0XHR9O1xuXG5cdFx0aWYoIXRoaXMuc3RhdGUuZmVlZGJhY2tNb2RlICYmICF0aGlzLnN0YXRlLmVkaXRNb2RlICYmIHRoaXMuYXR0YWNobWVudC5zZXR0aW5ncyAmJiB0aGlzLmF0dGFjaG1lbnQuc2V0dGluZ3Muc2VydmVyU2F2ZSlcblx0XHRcdHdpbmRvdy5TeW5jLmFzc2Vzc21lbnRUcmFuc2l0aW9uKEpTT04uc3RyaW5naWZ5KHsgcmVzdWx0czogdGhpcy5mZWVkYmFjaywgYWN0aXZpdHk6IHRoaXMuYWN0aXZpdHksIHVybDogdXJsIH0pKTtcblxuXHRcdC8vIFdlIG9ubHkgcnVuIHNvbWUgc3R1ZmYgb25jZSB0byBlbnN1cmUgYSBjb25zaXN0ZW50IG9yZGVyaW5nIHdoZW4gZ29pbmcgYmFjay9mb3J0aCBhbmQgYWxzbyBpbiBmZWVkYmFjayBtb2RlXG5cdFx0aWYoIXRoaXMuc3RhdGUuZWRpdE1vZGUpIHtcblx0XHRcdHRoaXMubG9hZGVkQmVmb3JlID0gdHJ1ZTtcblx0XHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIucHJvZ3Jlc3MtY29udGFpbmVyXCIpLnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuXHRcdFx0dGhpcy5wYXJlbnQucXVlcnlTZWxlY3RvcihcIi5wcm9ncmVzcy1pdGVtc1wiKS5pbm5lckhUTUwgPSBcIlwiO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDE7IGkgPCB0aGlzLmFzc2Vzc21lbnREYXRhLnF1ZXN0aW9uRGF0YS5sZW5ndGggKyAxOyBpKyspIHtcblx0XHRcdFx0dGhpcy5wYXJlbnQucXVlcnlTZWxlY3RvcihcIi5wcm9ncmVzcy1pdGVtc1wiKS5pbm5lckhUTUwgKz0gXCI8ZGl2IGNsYXNzPVxcXCJwcm9ncmVzcy1pdGVtIHNraXBwZWQgaXRlbS1cIiArIGkgKyBcIlxcXCI+XCIgKyBpICtcIjwvZGl2PlwiO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5wYXJlbnQucXVlcnlTZWxlY3RvcihcIi5wcm9ncmVzcy1pdGVtc1wiKS5pbm5lckhUTUwgKz0gXCI8ZGl2IGNsYXNzPVxcXCJpdGVtLWNvbXBsZXRlIGRpc2FibGVkLWJ1dHRvblxcXCI+Q29tcGxldGU8L2Rpdj5cIjtcblx0XHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIuaXRlbS1jb21wbGV0ZVwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5jb21wbGV0ZVF1ZXN0aW9ucy5iaW5kKHRoaXMpKTtcblx0XHRcdHZhciBpdGVtcyA9IHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIucHJvZ3Jlc3MtaXRlbVwiKTtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aXRlbXNbaV0uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuanVtcFRvUXVlc3Rpb24uYmluZCh0aGlzKSk7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBpc0Jyb3dzZXIgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdC8vIE9wZXJhIDguMCtcblx0XHRcdFx0dmFyIGlzT3BlcmEgPSAoISF3aW5kb3cub3ByICYmICEhb3ByLmFkZG9ucykgfHwgISF3aW5kb3cub3BlcmEgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCcgT1BSLycpID49IDA7XG5cdFx0XHRcdC8vIEZpcmVmb3ggMS4wK1xuXHRcdFx0XHR2YXIgaXNGaXJlZm94ID0gdHlwZW9mIEluc3RhbGxUcmlnZ2VyICE9PSAndW5kZWZpbmVkJztcblx0XHRcdFx0Ly8gQ2hyb21lIDEgLSA3MVxuXHRcdFx0XHR2YXIgaXNDaHJvbWUgPSAhIXdpbmRvdy5jaHJvbWUgJiYgKCEhd2luZG93LmNocm9tZS53ZWJzdG9yZSB8fCAhIXdpbmRvdy5jaHJvbWUucnVudGltZSk7XG5cblx0XHRcdFx0cmV0dXJuIGlzT3BlcmEgfHwgaXNGaXJlZm94IHx8IGlzQ2hyb21lO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobmF2aWdhdG9yLnBsYXRmb3JtLnN0YXJ0c1dpdGgoXCJXaW5cIikgJiYgIWlzQnJvd3NlcigpKVxuXHRcdFx0XHR0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiLnByb2dyZXNzLWl0ZW1zXCIpLnN0eWxlLnBhZGRpbmdCb3R0b20gPSBcIjIwcHhcIjtcblx0XHR9XG5cblx0XHR0aGlzLmxvYWRRdWVzdGlvbkRhdGEodGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb24gPT09IC0xID8gdW5kZWZpbmVkIDogdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb24pO1xuXHR9O1xuXG5cdElhZ28ucHJvdG90eXBlLmFza0ZvckNvZGUgPSBmdW5jdGlvbihyZXNvdXJjZSwgYXR0YWNobWVudCwgb3B0cykge1xuXHRcdHZhciBzZWxmID0gdGhpcztcblxuXHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1jb2RlLXByb21wdFwiKS5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcblxuXHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1jb2RlXCIpLm9uY2hhbmdlID0gdGhpcy5wYXJlbnQucXVlcnlTZWxlY3RvcihcIiNpYWdvLWNvZGVcIikub25mb2N1cyA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0c2VsZi5wYXJlbnQucXVlcnlTZWxlY3RvcihcIiNpYWdvLWNvZGUtZmFpbFwiKS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG5cdFx0fTtcblxuXHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1jaGVjay1jb2RlXCIpLm9uY2xpY2sgPSBmdW5jdGlvbigpIHtcblx0XHRcdC8vIENoZWNrIHRoZSBjb2RlXG5cdFx0XHR2YXIgY29kZSA9IChzZWxmLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tY29kZVwiKS52YWx1ZSB8fCBcIlwiKS5yZXBsYWNlKC9bXmEtZjAtOV0vZ2ksIFwiXCIpLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRjb2RlID0gcGFyc2VJbnQoY29kZSwgMTYpO1xuXG5cdFx0XHR2YXIgeG9yID0gcGFyc2VJbnQoYXR0YWNobWVudC5zZXR0aW5ncy5jb2RlLCAxNik7XG5cblx0XHRcdHZhciByZWFsQ29kZSA9IChjb2RlIF4geG9yKS50b1N0cmluZygxNikudG9Mb3dlckNhc2UoKTtcblx0XHRcdHdoaWxlKHJlYWxDb2RlLmxlbmd0aCA8IDYpXG5cdFx0XHRcdHJlYWxDb2RlID0gXCIwXCIgKyByZWFsQ29kZTtcblxuXHRcdFx0aWYocmVzb3VyY2UuY29kZS50b0xvd2VyQ2FzZSgpID09PSByZWFsQ29kZSkge1xuXHRcdFx0XHRzZWxmLmdvdENvZGUgPSB0cnVlO1xuXHRcdFx0XHRzZWxmLnN0YXJ0KHJlc291cmNlLCBhdHRhY2htZW50LCBvcHRzKTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRzZWxmLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tY29kZS1mYWlsXCIpLnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuXHRcdFx0fVxuXHRcdH07XG5cdH07XG5cblx0SWFnby5wcm90b3R5cGUucHJlcGFyZVF1ZXN0aW9uID0gZnVuY3Rpb24ocSwgaWR4KSB7XG5cdFx0dGhpcy5zdGF0ZS5xdWVzdGlvbnNbaWR4XSA9IHsgaWQ6IHEuaWQsIHRpbWU6IFtdIH07XG5cblx0XHRzd2l0Y2gocS50eXBlKSB7XG5cdFx0XHRjYXNlIDE6XG5cdFx0XHRcdGlmKCF0aGlzLmxvYWRlZEJlZm9yZSkge1xuXHRcdFx0XHRcdHEuYW5zd2VycyA9IHEuY29ycmVjdEFuc3dlcnMuY29uY2F0KHEub3RoZXJBbnN3ZXJzKTtcblx0XHRcdFx0XHRxLmFuc3dlcnMuc29ydChmdW5jdGlvbihhLCBiKSB7IHJldHVybiBhLmlkIC0gYi5pZDsgfSk7XG5cblx0XHRcdFx0XHRpZiAoIXRoaXMuc3RhdGUuZWRpdE1vZGUgJiYgIXRoaXMuYXR0YWNobWVudC5zZXR0aW5ncy5kaXNhYmxlUmFuZG9taXphdGlvbilcblx0XHRcdFx0XHRcdHEuYW5zd2VycyA9IHRoaXMuc2h1ZmZsZShxLmFuc3dlcnMpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuc3RhdGUucXVlc3Rpb25zW2lkeF0uc2VsZWN0ZWRBbnN3ZXJzID0gW107XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgMjpcblx0XHRcdFx0dGhpcy5zdGF0ZS5xdWVzdGlvbnNbaWR4XS5hbnN3ZXIgPSBcIlwiO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAzOlxuXHRcdFx0XHR0aGlzLnN0YXRlLnF1ZXN0aW9uc1tpZHhdLm1hdGNoZXMgPSBbXTtcblxuXHRcdFx0XHRpZighdGhpcy5sb2FkZWRCZWZvcmUpIHtcblx0XHRcdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHEubGVmdC5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0cS5sZWZ0W2ldLmlkID0gaSsxO1xuXHRcdFx0XHRcdFx0cS5yaWdodFtpXS5pZCA9IGkrMTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cS5yaWdodFByZVNodWZmbGUgPSBxLnJpZ2h0LnNsaWNlKCk7XG5cdFx0XHRcdFx0cS5sZWZ0UHJlU2h1ZmZsZSA9IHEubGVmdC5zbGljZSgpO1xuXHRcdFx0XHRcdGlmICghdGhpcy5zdGF0ZS5lZGl0TW9kZSAmJiAhdGhpcy5hdHRhY2htZW50LnNldHRpbmdzLmRpc2FibGVSYW5kb21pemF0aW9uKVxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHEubGVmdCA9IHRoaXMuc2h1ZmZsZShxLmxlZnQpO1xuXHRcdFx0XHRcdFx0cS5yaWdodCA9IHRoaXMuc2h1ZmZsZShxLnJpZ2h0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgNDpcblx0XHRcdFx0dGhpcy5zdGF0ZS5xdWVzdGlvbnNbaWR4XS5lbnRlcmVkQW5zd2VycyA9IFtdO1xuXHRcdFx0XHRpZighdGhpcy5sb2FkZWRCZWZvcmUpIHtcblx0XHRcdFx0XHRxLmNvcnJlY3RBbnN3ZXJzID0gW107XG5cdFx0XHRcdFx0cS5hbnN3ZXIuY29udGVudCA9IHEuYW5zd2VyLmNvbnRlbnQucmVwbGFjZSgvKD86XFxyXFxufFxccnxcXG4pL2csIFwiXCIpO1xuXHRcdFx0XHRcdHZhciBicmVha2Rvd24gPSBxLmFuc3dlci5jb250ZW50LnNwbGl0KC8oXFxbLio/XFxdKS8pO1xuXHRcdFx0XHRcdGJyZWFrZG93bi5mb3JFYWNoKGZ1bmN0aW9uIChwYXJ0KSB7XG5cdFx0XHRcdFx0XHRpZiAoKC8oXi4qXFxbfFxcXS4qJCkvKS50ZXN0KHBhcnQpKVxuXHRcdFx0XHRcdFx0XHRxLmNvcnJlY3RBbnN3ZXJzLnB1c2gocGFydC5yZXBsYWNlKFwiW1wiLCBcIlwiKS5yZXBsYWNlKFwiXVwiLCBcIlwiKSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdHJldHVybiBxO1xuXHR9O1xuXG5cdElhZ28ucHJvdG90eXBlLnJlZHJhdyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHRpZighdGhpcy5vcHRpb25zLmVkaXRNb2RlKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNhbGwgcmVkcmF3IGlmIG5vdCBpbiBlZGl0IG1vZGVcIik7XG5cblx0XHQvLyBVcGRhdGUgc29tZSB2YWx1ZXMgYW5kIHJlZHJhdyB0aGUgY3VycmVudCBxdWVzdGlvblxuXHRcdGlmKG9wdGlvbnMubGFuZ3VhZ2UpIHtcblx0XHRcdHZhciBsYW5nID0gb3B0aW9ucy5sYW5ndWFnZTtcblxuXHRcdFx0aWYoW1wiQWZyaWthYW5zXCIsIFwiRW5nbGlzaFwiLCBcIklzaU5kZWJlbGVcIiwgXCJTZXBlZGlcIiwgXCJTZXNvdGhvXCIsIFwiU2lzd2F0aVwiLCBcIlNldHN3YW5hXCIsIFwiWGl0c29uZ2FcIiwgXCJUc2hpdmVuZGFcIiwgXCJJc2lYaG9zYVwiLCBcIklzaVp1bHVcIl0uaW5kZXhPZihsYW5nKSA9PT0gLTEpXG5cdFx0XHRcdGxhbmcgPSBcIkVuZ2xpc2hcIjtcblxuXHRcdFx0dGhpcy5hc3Nlc3NtZW50RGF0YS5sYW5ndWFnZSA9IGxhbmc7XG5cdFx0fVxuXHRcdGlmKFwiZmVlZGJhY2tNb2RlXCIgaW4gb3B0aW9ucylcblx0XHRcdHRoaXMuc3RhdGUuZmVlZGJhY2tNb2RlID0gb3B0aW9ucy5mZWVkYmFja01vZGU7XG5cblx0XHR0aGlzLmxvYWRRdWVzdGlvbkRhdGEodGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb24pO1xuXHR9O1xuXG5cdElhZ28ucHJvdG90eXBlLnJlZG9JbnN0cnVjdGlvbnMgPSBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5hc3Nlc3NtZW50RGF0YS5xdWVzdGlvbkRhdGFbdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLnN1YnR5cGUpXG5cdFx0e1xuXHRcdFx0dGhpcy5wYXJlbnQucXVlcnlTZWxlY3RvcihcIiNpYWdvLWhlbHAtY29udGVudC10ZXh0XCIpLmlubmVySFRNTCA9XG5cdFx0XHRcdElhZ28uYXNzZXNtZW50c1tcInR5cGVcIiArIHRoaXMuYXNzZXNzbWVudERhdGEucXVlc3Rpb25EYXRhW3RoaXMuc3RhdGUuY3VycmVudFF1ZXN0aW9uXS50eXBlXS5zdWJ0eXBlc1tcInN1YnR5cGVcIiArXG5cdFx0XHRcdFx0dGhpcy5hc3Nlc3NtZW50RGF0YS5xdWVzdGlvbkRhdGFbdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLnN1YnR5cGVdLmluc3RydWN0aW9uc1t0aGlzLmFzc2Vzc21lbnREYXRhLmxhbmd1YWdlXTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1oZWxwLWNvbnRlbnQtdGV4dFwiKS5pbm5lckhUTUwgPVxuXHRcdFx0XHRJYWdvLmFzc2VzbWVudHNbXCJ0eXBlXCIgKyB0aGlzLmFzc2Vzc21lbnREYXRhLnF1ZXN0aW9uRGF0YVt0aGlzLnN0YXRlLmN1cnJlbnRRdWVzdGlvbl0udHlwZV0uaW5zdHJ1Y3Rpb25zW3RoaXMuYXNzZXNzbWVudERhdGEubGFuZ3VhZ2VdO1xuXHRcdH1cblx0fTtcblxuXHRJYWdvLnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24oaW5kZXgpIHtcblx0XHR0aGlzLmxvYWRVSSgpO1xuXHRcdHRoaXMubG9hZFF1ZXN0aW9uRGF0YShpbmRleCk7XG5cdH07XG5cblx0SWFnby5wcm90b3R5cGUudXBkYXRlQ3VycmVudE1vZGVsID0gZnVuY3Rpb24obW9kZWwpIHtcblx0XHR0aGlzLmFzc2Vzc21lbnREYXRhLnF1ZXN0aW9uRGF0YVt0aGlzLnN0YXRlLmN1cnJlbnRRdWVzdGlvbl0gPSB0aGlzLnByZXBhcmVRdWVzdGlvbihtb2RlbCwgdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb24pO1xuXHR9O1xuXG5cdElhZ28ucHJvdG90eXBlLmFkZFF1ZXN0aW9uID0gZnVuY3Rpb24ocXVlc3Rpb24sIG5vRHJhdykge1xuXHRcdHZhciBpbmRleCA9IHRoaXMuYXNzZXNzbWVudERhdGEucXVlc3Rpb25EYXRhLmxlbmd0aDtcblx0XHR0aGlzLmFzc2Vzc21lbnREYXRhLnF1ZXN0aW9uRGF0YS5wdXNoKHRoaXMucHJlcGFyZVF1ZXN0aW9uKHF1ZXN0aW9uLCBpbmRleCkpO1xuXG5cdFx0aWYoIW5vRHJhdykge1xuXHRcdFx0dGhpcy5sb2FkVUkoKTtcblx0XHRcdHRoaXMubG9hZFF1ZXN0aW9uRGF0YShpbmRleCk7XG5cdFx0fVxuXHR9O1xuXG5cdElhZ28ucHJvdG90eXBlLnJlbW92ZVF1ZXN0aW9uID0gZnVuY3Rpb24oaW5kZXgpIHtcblx0XHRpbmRleCA9IGluZGV4IHx8IHRoaXMuc3RhdGUuY3VycmVudFF1ZXN0aW9uO1xuXG5cdFx0aWYodGhpcy5hc3Nlc3NtZW50RGF0YS5xdWVzdGlvbkRhdGEubGVuZ3RoIDwgKGluZGV4ICsgMSkpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLmFzc2Vzc21lbnREYXRhLnF1ZXN0aW9uRGF0YS5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdC8vIFNoaWZ0IGFsbCB0aGUgYW5zd2VycyBhY3Jvc3Ncblx0XHRmb3IodmFyIGkgPSBpbmRleDsgaSA8IHRoaXMuYXNzZXNzbWVudERhdGEucXVlc3Rpb25EYXRhLmxlbmd0aDsgaSsrKVxuXHRcdFx0dGhpcy5zdGF0ZS5xdWVzdGlvbnNbaV0gPSB0aGlzLnN0YXRlLnF1ZXN0aW9uc1tpICsgMV07XG5cdFx0ZGVsZXRlIHRoaXMuc3RhdGUucXVlc3Rpb25zW3RoaXMuYXNzZXNzbWVudERhdGEucXVlc3Rpb25EYXRhLmxlbmd0aF07XG5cdH07XG5cblx0SWFnby5wcm90b3R5cGUubG9hZFF1ZXN0aW9uRGF0YSA9IGZ1bmN0aW9uKGluZGV4KSB7XG5cdFx0dmFyIHNlbGYgPSB0aGlzO1xuXHRcdGluZGV4ID0gaW5kZXggfHwgMDtcblxuXHRcdHRoaXMuc3RhdGUuY3VycmVudFF1ZXN0aW9uID0gaW5kZXg7XG5cblx0XHRpZighdGhpcy5zdGF0ZS5lZGl0TW9kZSkge1xuXHRcdFx0aWYoIXRoaXMuc3RhdGUuZmVlZGJhY2tNb2RlKSB7XG5cdFx0XHRcdGlmKCF0aGlzLnN0YXRlLnF1ZXN0aW9uc1t0aGlzLnN0YXRlLmN1cnJlbnRRdWVzdGlvbl0udGltZS5sZW5ndGgpXG5cdFx0XHRcdFx0dGhpcy50cmFuc2l0aW9uKFwicXVlc3Rpb24tc3RhcnRcIiwgeyBxdWVzdGlvbjogdGhpcy5hc3Nlc3NtZW50RGF0YS5xdWVzdGlvbkRhdGFbdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLmlkIH0pO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dGhpcy50cmFuc2l0aW9uKFwicXVlc3Rpb24tcmVzdW1lXCIsIHsgcXVlc3Rpb246IHRoaXMuYXNzZXNzbWVudERhdGEucXVlc3Rpb25EYXRhW3RoaXMuc3RhdGUuY3VycmVudFF1ZXN0aW9uXS5pZCB9KTtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy50cmFuc2l0aW9uKFwiZmVlZGJhY2stcXVlc3Rpb24tc3RhcnRcIiwgeyBxdWVzdGlvbjogdGhpcy5hc3Nlc3NtZW50RGF0YS5xdWVzdGlvbkRhdGFbdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLmlkIH0pO1xuXHRcdH1cblxuXHRcdHRoaXMuc2V0UHJvZ3Jlc3MoKTtcblxuXHRcdHZhciBvcHRpb24sIG9wdGlvbkNvbnRlbnQsIG9wdGlvbkJvcmRlciwgYnJlYWtkb3duO1xuXG5cdFx0Ly90aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tYmFjay10by1hcHBcIikuaW5uZXJIVE1MID0gSWFnby5pbnN0cnVjdGlvbnNbdGhpcy5hc3Nlc3NtZW50RGF0YS5sYW5ndWFnZV0uYmFjaztcblx0XHR0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tcmVzdGFydC1xdWVzdGlvblwiKS5pbm5lckhUTUwgPSBJYWdvLmluc3RydWN0aW9uc1t0aGlzLmFzc2Vzc21lbnREYXRhLmxhbmd1YWdlXS5yZXN0YXJ0O1xuXHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1jb21wbGV0ZS1xdWVzdGlvblwiKS5pbm5lckhUTUwgPSBJYWdvLmluc3RydWN0aW9uc1t0aGlzLmFzc2Vzc21lbnREYXRhLmxhbmd1YWdlXS5jb21wbGV0ZTtcblx0XHR0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tbmV4dC1xdWVzdGlvblwiKS5pbm5lckhUTUwgPSBJYWdvLmluc3RydWN0aW9uc1t0aGlzLmFzc2Vzc21lbnREYXRhLmxhbmd1YWdlXS5uZXh0O1xuXHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1wcmV2aW91cy1xdWVzdGlvblwiKS5pbm5lckhUTUwgPSBJYWdvLmluc3RydWN0aW9uc1t0aGlzLmFzc2Vzc21lbnREYXRhLmxhbmd1YWdlXS5wcmV2aW91cztcblx0XHR0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tZmVlZGJhY2stcXVlc3Rpb25cIikuaW5uZXJIVE1MID0gSWFnby5pbnN0cnVjdGlvbnNbdGhpcy5hc3Nlc3NtZW50RGF0YS5sYW5ndWFnZV0uc2hvd0ZlZWRiYWNrO1xuXG5cdFx0aWYgKHRoaXMuc3RhdGUuZmVlZGJhY2tNb2RlKSB7XG5cdFx0XHR0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28taGVscC1jb250ZW50LXRleHRcIikuaW5uZXJIVE1MID0gICh0aGlzLnN0YXRlLmVkaXRNb2RlID8gXCJcIiA6IElhZ28uaW5zdHJ1Y3Rpb25zW3RoaXMuYXNzZXNzbWVudERhdGEubGFuZ3VhZ2VdLnRlYWNoZXJGZWVkYmFjaykgKyBcIiBcIiArICh0aGlzLmFzc2Vzc21lbnREYXRhLnF1ZXN0aW9uRGF0YVt0aGlzLnN0YXRlLmN1cnJlbnRRdWVzdGlvbl0uZmVlZGJhY2sgfHwgSWFnby5pbnN0cnVjdGlvbnNbdGhpcy5hc3Nlc3NtZW50RGF0YS5sYW5ndWFnZV0ubm90ZWFjaGVyRmVlZGJhY2spO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGlmICh0aGlzLmFzc2Vzc21lbnREYXRhLnF1ZXN0aW9uRGF0YVt0aGlzLnN0YXRlLmN1cnJlbnRRdWVzdGlvbl0uc3VidHlwZSkge1xuXHRcdFx0XHR0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28taGVscC1jb250ZW50LXRleHRcIikuaW5uZXJIVE1MID0gSWFnby5hc3Nlc21lbnRzW1widHlwZVwiICsgdGhpcy5hc3Nlc3NtZW50RGF0YS5xdWVzdGlvbkRhdGFbdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLnR5cGVdLnN1YnR5cGVzW1wic3VidHlwZVwiICsgdGhpcy5hc3Nlc3NtZW50RGF0YS5xdWVzdGlvbkRhdGFbdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLnN1YnR5cGVdLmluc3RydWN0aW9uc1t0aGlzLmFzc2Vzc21lbnREYXRhLmxhbmd1YWdlXTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHR0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28taGVscC1jb250ZW50LXRleHRcIikuaW5uZXJIVE1MID0gSWFnby5hc3Nlc21lbnRzW1widHlwZVwiICsgdGhpcy5hc3Nlc3NtZW50RGF0YS5xdWVzdGlvbkRhdGFbdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLnR5cGVdLmluc3RydWN0aW9uc1t0aGlzLmFzc2Vzc21lbnREYXRhLmxhbmd1YWdlXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5wYXJlbnQucXVlcnlTZWxlY3RvcihcIiNpYWdvLXF1ZXN0aW9uLWZlZWRiYWNrLXRleHRcIikuaW5uZXJIVE1MID0gSWFnby5pbnN0cnVjdGlvbnNbdGhpcy5hc3Nlc3NtZW50RGF0YS5sYW5ndWFnZV0uZmVlZGJhY2sucmVwbGFjZShcIntjb3VudH1cIiwgaW5kZXggKyAxKS5yZXBsYWNlKFwie3RvdGFsfVwiLCB0aGlzLmFzc2Vzc21lbnREYXRhLnF1ZXN0aW9uRGF0YS5sZW5ndGgpO1xuXHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1oZWFkaW5nLXRleHRcIikuaW5uZXJIVE1MID0gdGhpcy5hc3Nlc3NtZW50RGF0YS5xdWVzdGlvbkRhdGFbdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLnF1ZXN0aW9uO1xuXHRcdGlmKCF0aGlzLnN0YXRlLmVkaXRNb2RlKSB7XG5cdFx0XHR0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28taGVhZGluZy10ZXh0XCIpLnNldEF0dHJpYnV0ZShcImNvbnRlbnRlZGl0YWJsZVwiLCBmYWxzZSk7XG5cblx0XHRcdGlmKHRoaXMuYXNzZXNzbWVudERhdGEucXVlc3Rpb25EYXRhW3RoaXMuc3RhdGUuY3VycmVudFF1ZXN0aW9uXS5xdWVzdGlvbkltYWdlKSB7XG5cdFx0XHRcdHZhciBpbWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO1xuXHRcdFx0XHRpbWcuc3JjID0gdGhpcy5hc3Nlc3NtZW50RGF0YS5xdWVzdGlvbkRhdGFbdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLnF1ZXN0aW9uSW1hZ2U7XG5cdFx0XHRcdHZhciBlbG0gPSB0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tcXVlc3Rpb24taW1hZ2VcIik7XG5cdFx0XHRcdHdoaWxlIChlbG0uaGFzQ2hpbGROb2RlcygpKVxuXHRcdFx0XHQgIGVsbS5yZW1vdmVDaGlsZChlbG0ubGFzdENoaWxkKTtcblx0XHRcdFx0dGhpcy5wYXJlbnQucXVlcnlTZWxlY3RvcihcIiNpYWdvLXF1ZXN0aW9uLWltYWdlXCIpLmFwcGVuZENoaWxkKGltZyk7XG5cdFx0XHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1xdWVzdGlvbi1pbWFnZVwiKS5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHR0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tcXVlc3Rpb24taW1hZ2VcIikuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovL1xuXHRcdC8vICAgICAgICAgICAgICAxLiBDaG9vc2UgdGhlIGNvcnJlY3QgT3B0aW9uICAgICAgICAgICAgICAgICAgICAvL1xuXHRcdC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovL1xuXHRcdGlmICh0aGlzLmFzc2Vzc21lbnREYXRhLnF1ZXN0aW9uRGF0YVt0aGlzLnN0YXRlLmN1cnJlbnRRdWVzdGlvbl0udHlwZSA9PT0gMSkge1xuXHRcdFx0dGhpcy5wYXJlbnQucXVlcnlTZWxlY3RvcihcIiNpYWdvLXF1ZXN0aW9uLWNvbnRlbnRcIikuaW5uZXJIVE1MID0gXCJcIjtcblxuXHRcdFx0dmFyIGFuc3dlcnMgPSB0aGlzLnN0YXRlLnF1ZXN0aW9uc1t0aGlzLnN0YXRlLmN1cnJlbnRRdWVzdGlvbl0uc2VsZWN0ZWRBbnN3ZXJzO1xuXG5cdFx0XHRpZiAodGhpcy5mZWVkYmFja1N0YXRlICYmIHRoaXMuc3RhdGUuZmVlZGJhY2tNb2RlKVxuXHRcdFx0XHRhbnN3ZXJzID0gdGhpcy5mZWVkYmFja1N0YXRlLnF1ZXN0aW9uc1t0aGlzLnN0YXRlLmN1cnJlbnRRdWVzdGlvbl0uc2VsZWN0ZWRBbnN3ZXJzO1xuXG5cdFx0XHR0aGlzLmFzc2Vzc21lbnREYXRhLnF1ZXN0aW9uRGF0YVt0aGlzLnN0YXRlLmN1cnJlbnRRdWVzdGlvbl0uYW5zd2Vycy5mb3JFYWNoKGZ1bmN0aW9uKGFuc3dlciwgaWR4KSB7XG5cdFx0XHRcdG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0XHRcdG9wdGlvbi5zZXRBdHRyaWJ1dGUoXCJkYXRhLXZhbHVlXCIsIGFuc3dlci5pZCk7XG5cblx0XHRcdFx0aWYgKGFuc3dlcnMuaW5kZXhPZihhbnN3ZXIuaWQpID4gLTEgJiYgIXNlbGYuc3RhdGUuZWRpdE1vZGUpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRvcHRpb24uY2xhc3NMaXN0LmFkZChcInF1ZXN0aW9uLW9wdGlvbnMtc2VsZWN0ZWRcIik7XG5cdFx0XHRcdFx0b3B0aW9uLnNldEF0dHJpYnV0ZShcImRhdGEtc2VsZWN0ZWRcIiwgdHJ1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0b3B0aW9uLnNldEF0dHJpYnV0ZShcImRhdGEtc2VsZWN0ZWRcIiwgZmFsc2UpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHNlbGYuc3RhdGUucHJldmlld01vZGUgfHwgIXNlbGYuc3RhdGUuZmVlZGJhY2tNb2RlICYmICFzZWxmLnN0YXRlLmVkaXRNb2RlKVxuXHRcdFx0XHRcdHNlbGYuYWRkVGFwKG9wdGlvbiwgc2VsZi5zZWxlY3RPcHRpb24uYmluZChzZWxmKSk7XG5cblx0XHRcdFx0b3B0aW9uLmNsYXNzTGlzdC5hZGQoXCJxdWVzdGlvbi1vcHRpb25zXCIpO1xuXG5cdFx0XHRcdGlmIChzZWxmLmFzc2Vzc21lbnREYXRhLnF1ZXN0aW9uRGF0YVtzZWxmLnN0YXRlLmN1cnJlbnRRdWVzdGlvbl0uc3VidHlwZSA9PT0gMylcblx0XHRcdFx0XHRvcHRpb24uY2xhc3NMaXN0LmFkZChcInRydWUtZmFsc2VcIik7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRvcHRpb24uY2xhc3NMaXN0LmFkZChcIm1hbnktb3B0aW9uXCIpO1xuXG5cdFx0XHRcdG9wdGlvbkNvbnRlbnQgPSBzZWxmLnJldHVybk5vZGUoYW5zd2VyLmNvbnRlbnQsIGFuc3dlci50eXBlLCBhbnN3ZXIuaWQpO1xuXHRcdFx0XHRpZihzZWxmLnN0YXRlLmVkaXRNb2RlICYmIGFuc3dlci50eXBlID09PSBcInRleHRcIilcblx0XHRcdFx0XHRvcHRpb25Db250ZW50LnNldEF0dHJpYnV0ZShcImNvbnRlbnRlZGl0YWJsZVwiLCB0cnVlKTtcblx0XHRcdFx0b3B0aW9uLmFwcGVuZENoaWxkKG9wdGlvbkNvbnRlbnQpO1xuXG5cdFx0XHRcdGlmKHNlbGYuc3RhdGUuZWRpdE1vZGUpIHtcblx0XHRcdFx0XHR2YXIgaG9zdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0XHRcdFx0aG9zdC5jbGFzc0xpc3QuYWRkKFwib3B0aW9uLWhvc3RcIik7XG5cblx0XHRcdFx0XHR2YXIgY2hlY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdFx0XHRcdGNoZWNrLmNsYXNzTGlzdC5hZGQoXCJjaGVja2FibGVcIik7XG5cdFx0XHRcdFx0Y2hlY2suY2xhc3NMaXN0LmFkZChcImZhbFwiKTtcblx0XHRcdFx0XHR2YXIgY2hrID0gc2VsZi5zdGF0ZS5lZGl0TW9kZSA/IHNlbGYuYXNzZXNzbWVudERhdGEucXVlc3Rpb25EYXRhW3NlbGYuc3RhdGUuY3VycmVudFF1ZXN0aW9uXS5jb3JyZWN0QW5zd2Vycy5pbmRleE9mKGFuc3dlcikgPiAtMSA6IChpZHggPT09IDApO1xuXHRcdFx0XHRcdGNoZWNrLmNsYXNzTGlzdC5hZGQoY2hrID8gXCJmYS1jaGVja1wiIDogXCJmYS10aW1lc1wiKTtcblxuXHRcdFx0XHRcdGhvc3QuYXBwZW5kQ2hpbGQoY2hlY2spO1xuXG5cdFx0XHRcdFx0Ly8gQXBwZW5kIG9wdGlvbnMgdG8gY2hhbmdlIHRoZSBpdGVtIHR5cGVcblx0XHRcdFx0XHR2YXIgZm9ybWF0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHRcdFx0XHRmb3JtYXQuY2xhc3NMaXN0LmFkZChcImZvcm1hdFwiKTtcblx0XHRcdFx0XHRmb3JtYXQuY2xhc3NMaXN0LmFkZChcImZhbFwiKTtcblx0XHRcdFx0XHRmb3JtYXQuY2xhc3NMaXN0LmFkZChcImZhLWltYWdlXCIpO1xuXG5cdFx0XHRcdFx0aG9zdC5hcHBlbmRDaGlsZChmb3JtYXQpO1xuXG5cdFx0XHRcdFx0aWYoc2VsZi5hc3Nlc3NtZW50RGF0YS5xdWVzdGlvbkRhdGFbc2VsZi5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLnN1YnR5cGUgIT09IDMpIHtcblx0XHRcdFx0XHRcdC8vIEFsbG93IGRlbGV0aW9uIG9mIGl0ZW1zXG5cdFx0XHRcdFx0XHR2YXIgZGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHRcdFx0XHRcdGRlbC5jbGFzc0xpc3QuYWRkKFwiZGVsZXRhYmxlXCIpO1xuXHRcdFx0XHRcdFx0ZGVsLmNsYXNzTGlzdC5hZGQoXCJmYWxcIik7XG5cdFx0XHRcdFx0XHRkZWwuY2xhc3NMaXN0LmFkZChcImZhLXRyYXNoLWFsdFwiKTtcblxuXHRcdFx0XHRcdFx0aG9zdC5hcHBlbmRDaGlsZChkZWwpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG9wdGlvbi5hcHBlbmRDaGlsZChob3N0KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRzZWxmLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tcXVlc3Rpb24tY29udGVudFwiKS5hcHBlbmRDaGlsZChvcHRpb24pO1xuXHRcdFx0fSk7XG5cblx0XHRcdGlmKHNlbGYuc3RhdGUuZWRpdE1vZGUgJiYgc2VsZi5hc3Nlc3NtZW50RGF0YS5xdWVzdGlvbkRhdGFbc2VsZi5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLnN1YnR5cGUgIT09IDMpIHtcblx0XHRcdFx0Ly8gQXBwZW5kIGEgcGxhY2Vob2xkZXIgZWxlbWVudCB0byBhbGwgdXNlcnMgdG8gYWRkIG1vcmUgaXRlbXNcblx0XHRcdFx0dmFyIHBsYWNlaG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHRcdFx0cGxhY2Vob2xkZXIudGV4dENvbnRlbnQgPSBcIkNsaWNrIHRvIGFkZCBhbm90aGVyIG9wdGlvblwiO1xuXHRcdFx0XHRwbGFjZWhvbGRlci5jbGFzc0xpc3QuYWRkKFwicGxhY2Vob2xkZXJcIik7XG5cblx0XHRcdFx0c2VsZi5wYXJlbnQucXVlcnlTZWxlY3RvcihcIiNpYWdvLXF1ZXN0aW9uLWNvbnRlbnRcIikuYXBwZW5kQ2hpbGQocGxhY2Vob2xkZXIpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnByZXZOZXh0QnV0dG9ucyhhbnN3ZXJzLmxlbmd0aCk7XG5cdFx0fVxuXG5cdFx0Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vXG5cdFx0Ly8gICAgICAgICAgICAgICAyLiBQYXJhZ3JhcGggQW5zd2VyIE5vIE1hcmtzICAgICAgICAgICAgICAgICAgIC8vXG5cdFx0Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vXG5cdFx0aWYgKHRoaXMuYXNzZXNzbWVudERhdGEucXVlc3Rpb25EYXRhW3RoaXMuc3RhdGUuY3VycmVudFF1ZXN0aW9uXS50eXBlID09IDIpIHtcblx0XHRcdHZhciBhbnN3ZXIgPSBcIlwiO1xuXG5cdFx0XHRpZiAodGhpcy5zdGF0ZS5mZWVkYmFja01vZGUgJiYgdGhpcy5mZWVkYmFja1N0YXRlICYmIHRoaXMuZmVlZGJhY2tTdGF0ZS5xdWVzdGlvbnNbdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLmFuc3dlcilcblx0XHRcdFx0YW5zd2VyID0gdGhpcy5mZWVkYmFja1N0YXRlLnF1ZXN0aW9uc1t0aGlzLnN0YXRlLmN1cnJlbnRRdWVzdGlvbl0uYW5zd2VyO1xuXG5cdFx0XHR0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tcXVlc3Rpb24tY29udGVudFwiKS5pbm5lckhUTUwgPSBcIlwiO1xuXHRcdFx0dmFyIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0XHRjb250YWluZXIuY2xhc3NMaXN0LmFkZChcInBhcmFncmFwaC1jb250YWluZXJcIik7XG5cdFx0XHRvcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIik7XG5cdFx0XHR2YXIgbWFyayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuXHRcdFx0bWFyay5jbGFzc0xpc3QuYWRkKFwicGFyYWdyYXBoLW1hcmtcIik7XG5cdFx0XHRtYXJrLmlubmVySFRNTCA9IFwiTWFyazogXCIgKyB0aGlzLmFzc2Vzc21lbnREYXRhLnF1ZXN0aW9uRGF0YVt0aGlzLnN0YXRlLmN1cnJlbnRRdWVzdGlvbl0ucG90ZW50aWFsU2NvcmU7XG5cblx0XHRcdGlmICghdGhpcy5zdGF0ZS5wcmV2aWV3TW9kZSAmJiAodGhpcy5zdGF0ZS5mZWVkYmFja01vZGUgfHwgdGhpcy5zdGF0ZS5lZGl0TW9kZSkpXG5cdFx0XHRcdG9wdGlvbi5zZXRBdHRyaWJ1dGUoXCJyZWFkb25seVwiLFwicmVhZG9ubHlcIik7XG5cdFx0XHRpZih0aGlzLnN0YXRlLmVkaXRNb2RlKVxuXHRcdFx0XHRvcHRpb24udmFsdWUgPSBcIlRoZSBsZWFybmVyIHdpbGwgd3JpdGUgYW4gYW5zd2VyIGhlcmVcIjtcblxuXHRcdFx0b3B0aW9uLnN0eWxlLndpZHRoID0gXCIxMDAlXCI7XG5cdFx0XHRvcHRpb24uc3R5bGUubWF4V2lkdGggPSBcIjEwMCVcIjtcblxuXHRcdFx0b3B0aW9uLm9ua2V5dXAgPSBzZWxmLnBhcmFncmFwaEhhbmRsZXIuYmluZChzZWxmLCBvcHRpb24pO1xuXHRcdFx0aWYoIXRoaXMuc3RhdGUuZWRpdE1vZGUpXG5cdFx0XHRcdG9wdGlvbi52YWx1ZSA9IGFuc3dlcjtcblx0XHRcdGNvbnRhaW5lci5hcHBlbmRDaGlsZChvcHRpb24pO1xuXHRcdFx0Y29udGFpbmVyLmFwcGVuZENoaWxkKG1hcmspO1xuXHRcdFx0aWYodGhpcy5zdGF0ZS5lZGl0TW9kZSkge1xuXHRcdFx0XHR2YXIgdG90YWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdFx0XHR2YXIgdHh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG5cdFx0XHRcdHR4dC50ZXh0Q29udGVudCA9IFwiSG93IG1hbnkgbWFya3MgY2FuIGJlIGVhcm5lZCBmb3IgdGhpcyBxdWVzdGlvbj8gIFwiO1xuXHRcdFx0XHR0b3RhbC5hcHBlbmRDaGlsZCh0eHQpO1xuXG5cdFx0XHRcdHZhciBtYXJrcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcblx0XHRcdFx0bWFya3Muc2V0QXR0cmlidXRlKFwidHlwZVwiLCBcIm51bWJlclwiKTtcblx0XHRcdFx0bWFya3Muc2V0QXR0cmlidXRlKFwibWF4bGVuZ3RoXCIsIFwiM1wiKTtcblx0XHRcdFx0bWFya3Muc2V0QXR0cmlidXRlKFwidmFsdWVcIiwgdGhpcy5hc3Nlc3NtZW50RGF0YS5xdWVzdGlvbkRhdGFbdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLnBvdGVudGlhbFNjb3JlIHx8IFwiMVwiKTtcblx0XHRcdFx0bWFya3Muc2V0QXR0cmlidXRlKFwibWluXCIsIFwiMVwiKTtcblx0XHRcdFx0bWFya3Muc2V0QXR0cmlidXRlKFwibWF4XCIsIFwiMTAwMFwiKTtcblx0XHRcdFx0bWFya3Muc3R5bGUud2lkdGggPSBcIjgwcHhcIjtcblx0XHRcdFx0bWFya3Muc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7XG5cblx0XHRcdFx0dG90YWwuYXBwZW5kQ2hpbGQobWFya3MpO1xuXG5cdFx0XHRcdGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0b3RhbCk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1xdWVzdGlvbi1jb250ZW50XCIpLmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG5cblx0XHRcdHRoaXMucHJldk5leHRCdXR0b25zKEJvb2xlYW4odGhpcy5zdGF0ZS5xdWVzdGlvbnNbdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLmFuc3dlcikpO1xuXHRcdH1cblxuXHRcdC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovL1xuXHRcdC8vICAgICAgICAgICAgICAgICAgICAzLiBNYXRjaCB0aGUgY29sdW1ucyAgICAgICAgICAgICAgICAgICAgICAvL1xuXHRcdC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovL1xuXHRcdGlmICh0aGlzLmFzc2Vzc21lbnREYXRhLnF1ZXN0aW9uRGF0YVt0aGlzLnN0YXRlLmN1cnJlbnRRdWVzdGlvbl0udHlwZSA9PSAzKSB7XG5cdFx0XHR0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tcXVlc3Rpb24tY29udGVudFwiKS5pbm5lckhUTUwgPSBcIlwiO1xuXG5cdFx0XHR0aGlzLmJhY2tncm91bmRQYWxsZXR0ZSA9IHRoaXMuc2h1ZmZsZShbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMl0pO1xuXHRcdFx0dGhpcy5tYXRjaFNlbGVjdGlvbiA9IHtcblx0XHRcdFx0bGVmdDoge1xuXHRcdFx0XHRcdHNlbGVjdGVkOiBmYWxzZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRyaWdodDoge1xuXHRcdFx0XHRcdHNlbGVjdGVkOiBmYWxzZVxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHR2YXIgbGVmdCA9IHRoaXMuYXNzZXNzbWVudERhdGEucXVlc3Rpb25EYXRhW3RoaXMuc3RhdGUuY3VycmVudFF1ZXN0aW9uXS5sZWZ0O1xuXHRcdFx0dmFyIHJpZ2h0ID0gdGhpcy5hc3Nlc3NtZW50RGF0YS5xdWVzdGlvbkRhdGFbdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLnJpZ2h0O1xuXHRcdFx0dmFyIGN1cnJNYXRjaGVzID0gdGhpcy5zdGF0ZS5xdWVzdGlvbnNbdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLm1hdGNoZXM7XG5cdFx0XHRpZiAodGhpcy5zdGF0ZS5mZWVkYmFja01vZGUgJiYgIXRoaXMuc3RhdGUucHJldmlld01vZGUpXG5cdFx0XHR7XG5cdFx0XHRcdGxlZnQgPSAgdGhpcy5hc3Nlc3NtZW50RGF0YS5xdWVzdGlvbkRhdGFbdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLmxlZnRQcmVTaHVmZmxlO1xuXHRcdFx0XHRyaWdodCA9IHRoaXMuYXNzZXNzbWVudERhdGEucXVlc3Rpb25EYXRhW3RoaXMuc3RhdGUuY3VycmVudFF1ZXN0aW9uXS5yaWdodFByZVNodWZmbGU7XG5cdFx0XHRcdGN1cnJNYXRjaGVzID0gW107XG5cdFx0XHRcdGZvciAodmFyIGFhID0gMDsgYWEgPCBsZWZ0Lmxlbmd0aDsgYWErKykge1xuXHRcdFx0XHRcdGN1cnJNYXRjaGVzLnB1c2goe2xlZnQ6IGxlZnRbYWFdLmlkLCByaWdodDogbGVmdFthYV0uaWQsIGJnOiB0aGlzLmJhY2tncm91bmRQYWxsZXR0ZS5wb3AoKX0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHZhciBsaXN0bGVmdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0XHRsaXN0bGVmdC5jbGFzc0xpc3QuYWRkKFwibGlzdC1sZWZ0XCIpO1xuXHRcdFx0bGlzdGxlZnQuc2V0QXR0cmlidXRlKFwiaWRcIiwgXCJsaXN0bGVmdFwiKTtcblx0XHRcdGxlZnQuZm9yRWFjaChmdW5jdGlvbiAoYW5zd2VyKSB7XG5cdFx0XHRcdG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0XHRcdG9wdGlvbi5jbGFzc0xpc3QuYWRkKFwibWF0Y2gtb3B0aW9uc1wiKTtcblx0XHRcdFx0b3B0aW9uLmNsYXNzTGlzdC5hZGQoXCJsZWZ0XCIpO1xuXG5cdFx0XHRcdGlmIChzZWxmLnN0YXRlLnByZXZpZXdNb2RlIHx8ICFzZWxmLnN0YXRlLmZlZWRiYWNrTW9kZSAmJiAhc2VsZi5zdGF0ZS5lZGl0TW9kZSlcblx0XHRcdFx0XHRzZWxmLmFkZFRhcChvcHRpb24sIHNlbGYuc2VsZWN0TWF0Y2guYmluZChzZWxmKSk7XG5cblx0XHRcdFx0b3B0aW9uQ29udGVudCA9IHNlbGYucmV0dXJuTm9kZShhbnN3ZXIuY29udGVudCwgYW5zd2VyLnR5cGUpO1xuXHRcdFx0XHRpZihzZWxmLnN0YXRlLmVkaXRNb2RlICYmIGFuc3dlci50eXBlID09PSBcInRleHRcIilcblx0XHRcdFx0XHRvcHRpb25Db250ZW50LnNldEF0dHJpYnV0ZShcImNvbnRlbnRlZGl0YWJsZVwiLCB0cnVlKTtcblx0XHRcdFx0b3B0aW9uLmFwcGVuZENoaWxkKG9wdGlvbkNvbnRlbnQpO1xuXHRcdFx0XHRvcHRpb25Cb3JkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdFx0XHRvcHRpb25Cb3JkZXIuY2xhc3NMaXN0LmFkZChcImJvcmRlclwiKTtcblx0XHRcdFx0b3B0aW9uLmFwcGVuZENoaWxkKG9wdGlvbkJvcmRlcik7XG5cblx0XHRcdFx0aWYoc2VsZi5zdGF0ZS5lZGl0TW9kZSkge1xuXHRcdFx0XHRcdHZhciBob3N0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHRcdFx0XHRob3N0LmNsYXNzTGlzdC5hZGQoXCJvcHRpb24taG9zdFwiKTtcblxuXHRcdFx0XHRcdC8vIEFwcGVuZCBvcHRpb25zIHRvIGNoYW5nZSB0aGUgaXRlbSB0eXBlXG5cdFx0XHRcdFx0dmFyIGZvcm1hdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0XHRcdFx0Zm9ybWF0LmNsYXNzTGlzdC5hZGQoXCJmb3JtYXRcIik7XG5cdFx0XHRcdFx0Zm9ybWF0LmNsYXNzTGlzdC5hZGQoXCJmYWxcIik7XG5cdFx0XHRcdFx0Zm9ybWF0LmNsYXNzTGlzdC5hZGQoXCJmYS1pbWFnZVwiKTtcblxuXHRcdFx0XHRcdGhvc3QuYXBwZW5kQ2hpbGQoZm9ybWF0KTtcblxuXHRcdFx0XHRcdG9wdGlvbi5hcHBlbmRDaGlsZChob3N0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdG9wdGlvbi5zZXRBdHRyaWJ1dGUoXCJkYXRhLXNlbGVjdGVkXCIsIFwiZmFsc2VcIik7XG5cdFx0XHRcdG9wdGlvbi5zZXRBdHRyaWJ1dGUoXCJkYXRhLWNvbHVtblwiLCBcImxlZnRcIik7XG5cdFx0XHRcdG9wdGlvbi5zZXRBdHRyaWJ1dGUoXCJkYXRhLXZhbHVlXCIsIGFuc3dlci5pZCk7XG5cdFx0XHRcdGxpc3RsZWZ0LmFwcGVuZENoaWxkKG9wdGlvbik7XG5cdFx0XHR9KTtcblx0XHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1xdWVzdGlvbi1jb250ZW50XCIpLmFwcGVuZENoaWxkKGxpc3RsZWZ0KTtcblxuXHRcdFx0dmFyIGxpc3RyaWdodCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0XHRsaXN0cmlnaHQuc2V0QXR0cmlidXRlKFwiaWRcIiwgXCJsaXN0cmlnaHRcIik7XG5cdFx0XHRsaXN0cmlnaHQuY2xhc3NMaXN0LmFkZChcImxpc3QtcmlnaHRcIik7XG5cdFx0XHRyaWdodC5mb3JFYWNoKGZ1bmN0aW9uIChhbnN3ZXIpIHtcblx0XHRcdFx0b3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHRcdFx0b3B0aW9uLmNsYXNzTGlzdC5hZGQoXCJtYXRjaC1vcHRpb25zXCIpO1xuXHRcdFx0XHRvcHRpb24uY2xhc3NMaXN0LmFkZChcInJpZ2h0XCIpO1xuXG5cdFx0XHRcdGlmIChzZWxmLnN0YXRlLnByZXZpZXdNb2RlIHx8ICFzZWxmLnN0YXRlLmZlZWRiYWNrTW9kZSAmJiAhc2VsZi5zdGF0ZS5lZGl0TW9kZSlcblx0XHRcdFx0XHRzZWxmLmFkZFRhcChvcHRpb24sIHNlbGYuc2VsZWN0TWF0Y2guYmluZChzZWxmKSk7XG5cblx0XHRcdFx0b3B0aW9uQ29udGVudCA9IHNlbGYucmV0dXJuTm9kZShhbnN3ZXIuY29udGVudCwgYW5zd2VyLnR5cGUpO1xuXHRcdFx0XHRpZihzZWxmLnN0YXRlLmVkaXRNb2RlICYmIGFuc3dlci50eXBlID09IFwidGV4dFwiKVxuXHRcdFx0XHRcdG9wdGlvbkNvbnRlbnQuc2V0QXR0cmlidXRlKFwiY29udGVudGVkaXRhYmxlXCIsIHRydWUpO1xuXG5cdFx0XHRcdG9wdGlvbkJvcmRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0XHRcdG9wdGlvbkJvcmRlci5jbGFzc0xpc3QuYWRkKFwiYm9yZGVyXCIpO1xuXHRcdFx0XHRvcHRpb24uYXBwZW5kQ2hpbGQob3B0aW9uQm9yZGVyKTtcblx0XHRcdFx0b3B0aW9uLmFwcGVuZENoaWxkKG9wdGlvbkNvbnRlbnQpO1xuXG5cdFx0XHRcdGlmKHNlbGYuc3RhdGUuZWRpdE1vZGUpIHtcblx0XHRcdFx0XHR2YXIgaG9zdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0XHRcdFx0aG9zdC5jbGFzc0xpc3QuYWRkKFwib3B0aW9uLWhvc3RcIik7XG5cblx0XHRcdFx0XHQvLyBBcHBlbmQgb3B0aW9ucyB0byBjaGFuZ2UgdGhlIGl0ZW0gdHlwZVxuXHRcdFx0XHRcdHZhciBmb3JtYXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdFx0XHRcdGZvcm1hdC5jbGFzc0xpc3QuYWRkKFwiZm9ybWF0XCIpO1xuXHRcdFx0XHRcdGZvcm1hdC5jbGFzc0xpc3QuYWRkKFwiZmFsXCIpO1xuXHRcdFx0XHRcdGZvcm1hdC5jbGFzc0xpc3QuYWRkKFwiZmEtaW1hZ2VcIik7XG5cblx0XHRcdFx0XHRob3N0LmFwcGVuZENoaWxkKGZvcm1hdCk7XG5cblx0XHRcdFx0XHQvLyBBbGxvdyBkZWxldGlvbiBvZiBpdGVtc1xuXHRcdFx0XHRcdHZhciBkZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdFx0XHRcdGRlbC5jbGFzc0xpc3QuYWRkKFwiZGVsZXRhYmxlXCIpO1xuXHRcdFx0XHRcdGRlbC5jbGFzc0xpc3QuYWRkKFwiZmFsXCIpO1xuXHRcdFx0XHRcdGRlbC5jbGFzc0xpc3QuYWRkKFwiZmEtdHJhc2gtYWx0XCIpO1xuXG5cdFx0XHRcdFx0aG9zdC5hcHBlbmRDaGlsZChkZWwpO1xuXG5cdFx0XHRcdFx0b3B0aW9uLmFwcGVuZENoaWxkKGhvc3QpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0b3B0aW9uLnNldEF0dHJpYnV0ZShcImRhdGEtc2VsZWN0ZWRcIiwgXCJmYWxzZVwiKTtcblx0XHRcdFx0b3B0aW9uLnNldEF0dHJpYnV0ZShcImRhdGEtY29sdW1uXCIsIFwicmlnaHRcIik7XG5cdFx0XHRcdG9wdGlvbi5zZXRBdHRyaWJ1dGUoXCJkYXRhLXZhbHVlXCIsIGFuc3dlci5pZCk7XG5cdFx0XHRcdGxpc3RyaWdodC5hcHBlbmRDaGlsZChvcHRpb24pO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tcXVlc3Rpb24tY29udGVudFwiKS5hcHBlbmRDaGlsZChsaXN0cmlnaHQpO1xuXG5cdFx0XHRmb3IgKHZhciBhID0gMDsgYSA8IGN1cnJNYXRjaGVzLmxlbmd0aDsgYSsrKXtcblx0XHRcdFx0aWYgKCF0aGlzLnN0YXRlLmVkaXRNb2RlKSB7XG5cdFx0XHRcdFx0dGhpcy5wYXJlbnQucXVlcnlTZWxlY3RvcihcIiNsaXN0bGVmdCBbZGF0YS12YWx1ZT0nXCIgKyBjdXJyTWF0Y2hlc1thXS5sZWZ0ICsgXCInXSAuYm9yZGVyXCIpLmNsYXNzTGlzdC5hZGQoXCJib3JkZXItXCIgKyBjdXJyTWF0Y2hlc1thXS5iZyk7XG5cdFx0XHRcdFx0dGhpcy5wYXJlbnQucXVlcnlTZWxlY3RvcihcIiNsaXN0bGVmdCBbZGF0YS12YWx1ZT0nXCIgKyBjdXJyTWF0Y2hlc1thXS5sZWZ0ICsgXCInXVwiKS5zZXRBdHRyaWJ1dGUoXCJkYXRhLXNlbGVjdGVkXCIsIFwidHJ1ZVwiKTtcblx0XHRcdFx0XHR0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2xpc3RyaWdodCBbZGF0YS12YWx1ZT0nXCIgKyBjdXJyTWF0Y2hlc1thXS5yaWdodCArIFwiJ10gLmJvcmRlclwiKS5jbGFzc0xpc3QuYWRkKFwiYm9yZGVyLVwiICsgY3Vyck1hdGNoZXNbYV0uYmcpO1xuXHRcdFx0XHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjbGlzdHJpZ2h0IFtkYXRhLXZhbHVlPSdcIiArIGN1cnJNYXRjaGVzW2FdLnJpZ2h0ICsgXCInXVwiKS5zZXRBdHRyaWJ1dGUoXCJkYXRhLXNlbGVjdGVkXCIsIFwidHJ1ZVwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZihzZWxmLnN0YXRlLmVkaXRNb2RlKSB7XG5cdFx0XHRcdC8vIEFwcGVuZCBhIHBsYWNlaG9sZGVyIGVsZW1lbnQgdG8gYWxsIHVzZXJzIHRvIGFkZCBtb3JlIGl0ZW1zXG5cdFx0XHRcdHZhciBiciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJiclwiKTtcblx0XHRcdFx0YnIuc2V0QXR0cmlidXRlKFwiY2xlYXJcIiwgXCJhbGxcIik7XG5cblx0XHRcdFx0c2VsZi5wYXJlbnQucXVlcnlTZWxlY3RvcihcIiNpYWdvLXF1ZXN0aW9uLWNvbnRlbnRcIikuYXBwZW5kQ2hpbGQoYnIpO1xuXG5cdFx0XHRcdHZhciBwbGFjZWhvbGRlcjIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdFx0XHRwbGFjZWhvbGRlcjIudGV4dENvbnRlbnQgPSBcIkNsaWNrIHRvIGFkZCBhbm90aGVyIHBhaXJcIjtcblx0XHRcdFx0cGxhY2Vob2xkZXIyLmNsYXNzTGlzdC5hZGQoXCJwbGFjZWhvbGRlclwiKTtcblxuXHRcdFx0XHRzZWxmLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tcXVlc3Rpb24tY29udGVudFwiKS5hcHBlbmRDaGlsZChwbGFjZWhvbGRlcjIpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnByZXZOZXh0QnV0dG9ucyhjdXJyTWF0Y2hlcy5sZW5ndGggPT09IGxlZnQubGVuZ3RoKTtcblx0XHR9XG5cblx0XHQvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy9cblx0XHQvLyAgICAgICAgICAgICAgICAgICAgNC4gRmlsbCBpbiB0aGUgYmxhbmtzICAgICAgICAgICAgICAgICAgICAgLy9cblx0XHQvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy9cblx0XHRpZiAodGhpcy5hc3Nlc3NtZW50RGF0YS5xdWVzdGlvbkRhdGFbdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLnR5cGUgPT09IDQpIHtcblx0XHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1xdWVzdGlvbi1jb250ZW50XCIpLmlubmVySFRNTCA9IFwiXCI7XG5cdFx0XHR2YXIgZmlsbGVyID0gdGhpcy5hc3Nlc3NtZW50RGF0YS5xdWVzdGlvbkRhdGFbdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dO1xuXG5cdFx0XHRvcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdFx0b3B0aW9uLmNsYXNzTGlzdC5hZGQoXCJibGFua1BhcmFncmFwaFwiKTtcblx0XHRcdGlmICghc2VsZi5zdGF0ZS5lZGl0TW9kZSlcblx0XHRcdHtcblx0XHRcdFx0aWYgKHNlbGYuc3RhdGUucHJldmlld01vZGUpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRvcHRpb24uY2xhc3NMaXN0LnJlbW92ZShcImJsYW5rUGFyYWdyYXBoXCIpO1xuXHRcdFx0XHRcdG9wdGlvbi5jbGFzc0xpc3QuYWRkKFwicHJldmlld1BhcmFncmFwaFwiKTtcblx0XHRcdFx0XHRvcHRpb24uc2V0QXR0cmlidXRlKFwiY29udGVudGVkaXRhYmxlXCIsIGZhbHNlKTtcblxuXHRcdFx0XHRcdGJyZWFrZG93biA9IGZpbGxlci5hbnN3ZXIuY29udGVudC5zcGxpdCgvKFxcWy4qP1xcXSkvKTtcblx0XHRcdFx0XHR2YXIgaW5kZXggPSAtMTtcblx0XHRcdFx0XHRicmVha2Rvd24uZm9yRWFjaChmdW5jdGlvbiAocGFydCkge1xuXHRcdFx0XHRcdFx0aWYgKHBhcnQubWF0Y2goLyhcXFsuKz9cXF0pLykpIHtcblx0XHRcdFx0XHRcdFx0aW5kZXgrKztcblx0XHRcdFx0XHRcdFx0dmFyIGlubmVyT3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuXHRcdFx0XHRcdFx0XHRpbm5lck9wdGlvbi50eXBlID0gXCJ0ZXh0XCI7XG5cdFx0XHRcdFx0XHRcdGlubmVyT3B0aW9uLmNsYXNzTGlzdC5hZGQoXCJmaWxsLWluXCIpO1xuXHRcdFx0XHRcdFx0XHRpZiAoc2VsZi5zdGF0ZS5xdWVzdGlvbnNbc2VsZi5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLmVudGVyZWRBbnN3ZXJzICYmIHNlbGYuc3RhdGUucXVlc3Rpb25zW3NlbGYuc3RhdGUuY3VycmVudFF1ZXN0aW9uXS5lbnRlcmVkQW5zd2Vyc1tpbmRleF0pIHtcblx0XHRcdFx0XHRcdFx0XHRpbm5lck9wdGlvbi52YWx1ZSA9IHNlbGYuc3RhdGUucXVlc3Rpb25zW3NlbGYuc3RhdGUuY3VycmVudFF1ZXN0aW9uXS5lbnRlcmVkQW5zd2Vyc1tpbmRleF07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0b3B0aW9uLmFwcGVuZENoaWxkKGlubmVyT3B0aW9uKTtcblx0XHRcdFx0XHRcdFx0aW5uZXJPcHRpb24ub25rZXl1cCA9IHNlbGYucHJldmlld0ZpbGxJbkhhbmRsZXIuYmluZChzZWxmLCBvcHRpb24sIGlubmVyT3B0aW9uLCBpbmRleCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvcHRpb24uYXBwZW5kQ2hpbGQoc2VsZi5yZXR1cm5Ob2RlKHBhcnQsIFwidGV4dFwiKSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRicmVha2Rvd24gPSBmaWxsZXIuYW5zd2VyLmNvbnRlbnQuc3BsaXQoLyhcXFsuKj9cXF0pLyk7XG5cdFx0XHRcdFx0aW5kZXggPSAtMTtcblx0XHRcdFx0XHRicmVha2Rvd24uZm9yRWFjaChmdW5jdGlvbiAocGFydCkge1xuXHRcdFx0XHRcdFx0aWYgKCgvKF4uKlxcW3xcXF0uKiQpLykudGVzdChwYXJ0KSkge1xuXHRcdFx0XHRcdFx0XHRvcHRpb25Db250ZW50ID0gc2VsZi5yZXR1cm5Ob2RlKHBhcnQsIFwiYmxhbmtcIik7XG5cdFx0XHRcdFx0XHRcdG9wdGlvbkNvbnRlbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1pbmRleFwiLCArK2luZGV4KTtcblx0XHRcdFx0XHRcdFx0aWYgKHNlbGYuc3RhdGUuZmVlZGJhY2tNb2RlKSB7XG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9uQ29udGVudC5zZXRBdHRyaWJ1dGUoXCJyZWFkb25seVwiLFwicmVhZG9ubHlcIik7XG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9uQ29udGVudC52YWx1ZSA9IGZpbGxlci5jb3JyZWN0QW5zd2Vyc1tpbmRleF07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0ZWxzZSBpZiAoc2VsZi5zdGF0ZS5xdWVzdGlvbnNbc2VsZi5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLmVudGVyZWRBbnN3ZXJzICYmIHNlbGYuc3RhdGUucXVlc3Rpb25zW3NlbGYuc3RhdGUuY3VycmVudFF1ZXN0aW9uXS5lbnRlcmVkQW5zd2Vyc1tpbmRleF0pXG5cdFx0XHRcdFx0XHRcdFx0b3B0aW9uQ29udGVudC52YWx1ZSA9IHNlbGYuc3RhdGUucXVlc3Rpb25zW3NlbGYuc3RhdGUuY3VycmVudFF1ZXN0aW9uXS5lbnRlcmVkQW5zd2Vyc1tpbmRleF07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdG9wdGlvbkNvbnRlbnQgPSBzZWxmLnJldHVybk5vZGUocGFydCwgXCJ0ZXh0XCIpO1xuXHRcdFx0XHRcdFx0b3B0aW9uLmFwcGVuZENoaWxkKG9wdGlvbkNvbnRlbnQpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdG9wdGlvbi5zZXRBdHRyaWJ1dGUoXCJjb250ZW50ZWRpdGFibGVcIiwgdHJ1ZSk7XG5cdFx0XHRcdG9wdGlvbi50ZXh0Q29udGVudCA9IGZpbGxlci5hbnN3ZXIuY29udGVudDtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5wYXJlbnQucXVlcnlTZWxlY3RvcihcIiNpYWdvLXF1ZXN0aW9uLWNvbnRlbnRcIikuYXBwZW5kQ2hpbGQob3B0aW9uKTtcblx0XHRcdHRoaXMucHJldk5leHRCdXR0b25zKHRoaXMuc3RhdGUucXVlc3Rpb25zW3RoaXMuc3RhdGUuY3VycmVudFF1ZXN0aW9uXS5lbnRlcmVkQW5zd2Vycy5sZW5ndGggPT09IGZpbGxlci5jb3JyZWN0QW5zd2Vycy5sZW5ndGgpO1xuXHRcdH1cblxuXHRcdHZhciBza2lwcGVkID0gZmFsc2UsIHF1ZXN0aW9uRGF0YSwgZW50ZXJlZEFuc3dlcnM7XG5cdFx0dmFyIHF1ZXN0aW9uID0gdGhpcy5zdGF0ZS5xdWVzdGlvbnNbdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dO1xuXG5cdFx0aWYgKHF1ZXN0aW9uLm1hdGNoZXMgfHwgcXVlc3Rpb24uZW50ZXJlZEFuc3dlcnMpIHtcblx0XHRcdHF1ZXN0aW9uRGF0YSA9IHRoaXMuYXNzZXNzbWVudERhdGEucXVlc3Rpb25EYXRhLmZpbHRlcihmdW5jdGlvbihpdGVtKSB7IHJldHVybiBpdGVtLmlkID09PSBxdWVzdGlvbi5pZDsgfSk7XG5cdFx0XHRxdWVzdGlvbkRhdGEgPSBxdWVzdGlvbkRhdGFbMF07XG5cdFx0fVxuXG5cblx0XHQvLyBSZW1vdmUgYmxhbmsgZW50ZXJlZCBhbnN3ZXJzXG5cdFx0aWYgKHF1ZXN0aW9uLmVudGVyZWRBbnN3ZXJzKVxuXHRcdFx0ZW50ZXJlZEFuc3dlcnMgPSBxdWVzdGlvbi5lbnRlcmVkQW5zd2Vycy5maWx0ZXIoZnVuY3Rpb24oZWwpIHsgcmV0dXJuIGVsLnRyaW0oKSAhPT0gXCJcIiA/IGVsIDogZmFsc2U7IH0pO1xuXG5cdFx0aWYgKChxdWVzdGlvbi5zZWxlY3RlZEFuc3dlcnMgJiYgcXVlc3Rpb24uc2VsZWN0ZWRBbnN3ZXJzLmxlbmd0aCA9PT0gMCkgfHwgKHF1ZXN0aW9uLm1hdGNoZXMgJiYgKHF1ZXN0aW9uLm1hdGNoZXMubGVuZ3RoID09PSAwIHx8IHF1ZXN0aW9uRGF0YS5sZWZ0Lmxlbmd0aCA+IHF1ZXN0aW9uLm1hdGNoZXMubGVuZ3RoKSkpXG5cdFx0XHRza2lwcGVkID0gdHJ1ZTtcblx0XHRlbHNlIGlmICgocXVlc3Rpb24uZW50ZXJlZEFuc3dlcnMgJiYgKGVudGVyZWRBbnN3ZXJzLmxlbmd0aCA9PT0gMCB8fCBxdWVzdGlvbkRhdGEuY29ycmVjdEFuc3dlcnMubGVuZ3RoID4gZW50ZXJlZEFuc3dlcnMubGVuZ3RoKSkgfHwgKHF1ZXN0aW9uLmFuc3dlciA9PT0gXCJcIikpXG5cdFx0XHRza2lwcGVkID0gdHJ1ZTtcblxuXHRcdC8vIElmIHRoZSBxdWVzdGlvbiBoYXMgbm90IGJlZW4gYW5zd2VyZWQgYW5kIHF1ZXN0aW9uIHN0YXJ0IGlzIG5vdCBzZXQsIHRoZW4gc2V0IGl0XG5cdFx0aWYgKCEodGhpcy5zdGF0ZS5xdWVzdGlvbnNbdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLnF1ZXN0aW9uU3RhcnQgJiYgc2tpcHBlZCkpXG5cdFx0XHR0aGlzLnN0YXRlLnF1ZXN0aW9uc1t0aGlzLnN0YXRlLmN1cnJlbnRRdWVzdGlvbl0ucXVlc3Rpb25TdGFydCA9IG5ldyBEYXRlKCkudmFsdWVPZigpO1xuXG5cdFx0dGhpcy5wYXJlbnQucXVlcnlTZWxlY3RvcihcIiNpYWdvLWFzc2Vzc21lbnRcIikuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJpYWdvOmxvYWRlZFwiLCB7cXVlc3Rpb246IHRoaXMuc3RhdGUuY3VycmVudFF1ZXN0aW9ufSkpO1xuXG5cdFx0Ly8gU2Nyb2xsIHRvIHRvcFxuXHRcdHRoaXMucGFyZW50LnNjcm9sbFRvcCA9IDA7Ly9xdWVyeVNlbGVjdG9yKFwiI2lhZ28tcXVlc3Rpb25cIikuc2Nyb2xsSW50b1ZpZXcoKTtcblx0fTtcblxuXHRJYWdvLnByb3RvdHlwZS5sb2FkTGFuZGluZ1BhZ2UgPSBmdW5jdGlvbihyZXNvdXJjZSwgYXR0YWNobWVudCwgb3B0cykge1xuXHRcdHZhciBzZWxmID0gdGhpcztcblxuXHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1zdGFydC1xdWVzdGlvblwiKS5pbm5lckhUTUwgPSBJYWdvLmluc3RydWN0aW9uc1tyZXNvdXJjZS5sYW5ndWFnZV0uc3RhcnQ7XG5cdFx0dGhpcy5wYXJlbnQucXVlcnlTZWxlY3RvcihcIiNpYWdvLWhlbHAtY29udGVudC10ZXh0XCIpLmlubmVySFRNTCA9IElhZ28uaW5zdHJ1Y3Rpb25zW3Jlc291cmNlLmxhbmd1YWdlXS5sYW5kaW5nUGFnZUhlbHA7XG5cdFx0dGhpcy5wYXJlbnQucXVlcnlTZWxlY3RvcihcIiNpYWdvLWhlYWRpbmctdGV4dFwiKS5pbm5lckhUTUwgPSBJYWdvLmluc3RydWN0aW9uc1tyZXNvdXJjZS5sYW5ndWFnZV0ubGFuZGluZ1BhZ2VIZWFkaW5nO1xuXG5cdFx0dmFyIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0Y29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJsYW5kaW5nLXBhZ2UtY29udGFpbmVyXCIpO1xuXHRcdHZhciBhc3Nlc3NtZW50VGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaDFcIik7XG5cdFx0dmFyIGluc3RhbmNlVGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaDNcIik7XG5cdFx0YXNzZXNzbWVudFRpdGxlLmlubmVySFRNTCA9IFwiVGl0bGU6IFwiICsgcmVzb3VyY2UudGl0bGU7XG5cdFx0aW5zdGFuY2VUaXRsZS5pbm5lckhUTUwgPSBcIkluc3RhbmNlOiBcIiArIChhdHRhY2htZW50LnNldHRpbmdzLnRpdGxlID09PSB1bmRlZmluZWQgPyBcIihubyB0aXRsZSBzZXQpXCIgOiBhdHRhY2htZW50LnNldHRpbmdzLnRpdGxlKTtcblxuXHRcdGNvbnRhaW5lci5hcHBlbmRDaGlsZChhc3Nlc3NtZW50VGl0bGUpO1xuXHRcdGlmIChhdHRhY2htZW50LnNldHRpbmdzLnRpdGxlKVxuXHRcdFx0Y29udGFpbmVyLmFwcGVuZENoaWxkKGluc3RhbmNlVGl0bGUpO1xuXHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1xdWVzdGlvbi1jb250ZW50XCIpLmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG5cblx0XHRjb250YWluZXIuc3R5bGVbXCJ0ZXh0LWFsaWduXCJdID0gXCJjZW50ZXJcIjtcblx0XHR0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tYXNzZXNzbWVudFwiKS5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuXHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1zdGFydC1xdWVzdGlvblwiKS5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuXHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1zdGFydC1xdWVzdGlvblwiKS5vbmNsaWNrID0gc2VsZi5zdGFydC5iaW5kKHNlbGYsIHJlc291cmNlLCBhdHRhY2htZW50LCBvcHRzKTtcblxuXHRcdGlmICh0aGlzLnN0YXRlLnByZXZpZXdNb2RlKSB7XG5cdFx0XHR0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28taGVhZGluZy10ZXh0XCIpLnNldEF0dHJpYnV0ZShcImNvbnRlbnRlZGl0YWJsZVwiLCBmYWxzZSk7XG5cdFx0XHR0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tcXVlc3Rpb24taW1hZ2VcIikuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXHRcdH1cblx0XHR0aGlzLmxhbmRpbmdQYWdlU3RhcnRlZCA9IHRydWU7XG5cdH07XG5cblx0SWFnby5wcm90b3R5cGUubmF2aWdhdGVRdWVzdGlvbnMgPSBmdW5jdGlvbihkaXJlY3Rpb24sIGV2dCkge1xuXHRcdGlmKGV2dCkge1xuXHRcdFx0dmFyIGVsID0gZXZ0LmN1cnJlbnRUYXJnZXQgfHwgZXZ0Lm9yaWdpbmFsVGFyZ2V0O1xuXG5cdFx0XHRpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKFwiZGlzYWJsZWQtYnV0dG9uXCIpKVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYoIXRoaXMuc3RhdGUuZWRpdE1vZGUpIHtcblx0XHRcdGlmICghdGhpcy5zdGF0ZS5xdWVzdGlvbnNbdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLnF1ZXN0aW9uU3RhcnQpXG5cdFx0XHRcdHRoaXMuc3RhdGUucXVlc3Rpb25zW3RoaXMuc3RhdGUuY3VycmVudFF1ZXN0aW9uXS5xdWVzdGlvblN0YXJ0ID0gbmV3IERhdGUoKS52YWx1ZU9mKCk7XG5cdFx0XHR0aGlzLnN0YXRlLnF1ZXN0aW9uc1t0aGlzLnN0YXRlLmN1cnJlbnRRdWVzdGlvbl0udGltZS5wdXNoKG5ldyBEYXRlKCkudmFsdWVPZigpIC0gdGhpcy5zdGF0ZS5xdWVzdGlvbnNbdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLnF1ZXN0aW9uU3RhcnQpO1xuXG5cdFx0XHQvLyBVcGRhdGUgdGhlIHJlc3VsdHMgZm9yIHRoZSBjdXJyZW50IHF1ZXN0aW9uXG5cdFx0XHR0aGlzLmV4dHJhY3RNYXJrKCk7XG5cblx0XHRcdC8vIFJlY2FsYyB0aGUgY3VycmVudCB0aW1lXG5cdFx0XHR0aGlzLmZlZWRiYWNrLnRpbWUgPSB0aGlzLnN1bU9mKHRoaXMuZmVlZGJhY2suc2NvcmVzLCBcInRpbWVcIik7XG5cblx0XHRcdC8vIEFuZCB0aGUgY3VycmVudCBtYXJrXG5cdFx0XHR0aGlzLmZlZWRiYWNrLm1hcmsgPSB0aGlzLnN1bU9mKHRoaXMuZmVlZGJhY2suc2NvcmVzLCBcInNjb3JlXCIpO1xuXG5cdFx0XHRpZighdGhpcy5zdGF0ZS5mZWVkYmFja01vZGUgJiYgIXRoaXMuc3RhdGUuZWRpdE1vZGUgJiYgdGhpcy5hdHRhY2htZW50LnNldHRpbmdzICYmIHRoaXMuYXR0YWNobWVudC5zZXR0aW5ncy5zZXJ2ZXJTYXZlKVxuXHRcdFx0XHR3aW5kb3cuU3luYy5hc3Nlc3NtZW50VHJhbnNpdGlvbihKU09OLnN0cmluZ2lmeSh7cmVzdWx0czogdGhpcy5mZWVkYmFjaywgYWN0aXZpdHk6IHRoaXMuYWN0aXZpdHksIHVybDogdXJsfSkpO1xuXG5cdFx0XHRpZiAoZGlyZWN0aW9uID09PSB0cnVlKSB7XG5cdFx0XHRcdHRoaXMuc3RhdGUuY3VycmVudFF1ZXN0aW9uKys7XG5cdFx0XHRcdHRoaXMudHJhbnNpdGlvbihcIm5hdmlnYXRlXCIsIHsgZGlyZWN0aW9uOiBcImZvcndhcmRcIiB9KTtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gZmFsc2UpIHtcblx0XHRcdFx0dGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb24tLTtcblx0XHRcdFx0dGhpcy50cmFuc2l0aW9uKFwibmF2aWdhdGVcIiwgeyBkaXJlY3Rpb246IFwiYmFja3dhcmRcIiB9KTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIHF1ZXN0aW9uLCBxdWVzdGlvbkRhdGEsIGluZGV4LCBza2lwcGVkLCBlbnRlcmVkQW5zd2VycztcblxuXHRcdFx0Zm9yICh2YXIga2V5IGluIHRoaXMuc3RhdGUucXVlc3Rpb25zKSB7XG5cdFx0XHRcdGlmICh0aGlzLnN0YXRlLnF1ZXN0aW9ucy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG5cdFx0XHRcdFx0cXVlc3Rpb24gPSB0aGlzLnN0YXRlLnF1ZXN0aW9uc1trZXldO1xuXG5cdFx0XHRcdFx0aW5kZXggPSBwYXJzZUludChrZXksIDEwKSArIDE7XG5cdFx0XHRcdFx0c2tpcHBlZCA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0aWYgKHF1ZXN0aW9uLm1hdGNoZXMgfHwgcXVlc3Rpb24uZW50ZXJlZEFuc3dlcnMpIHtcblx0XHRcdFx0XHRcdHF1ZXN0aW9uRGF0YSA9IHRoaXMuYXNzZXNzbWVudERhdGEucXVlc3Rpb25EYXRhLmZpbHRlcihmdW5jdGlvbihpdGVtKSB7IHJldHVybiBpdGVtLmlkID09PSBxdWVzdGlvbi5pZDsgfSk7XG5cdFx0XHRcdFx0XHRxdWVzdGlvbkRhdGEgPSBxdWVzdGlvbkRhdGFbMF07XG5cdFx0XHRcdFx0fVxuXG5cblx0XHRcdFx0XHQvLyBSZW1vdmUgYmxhbmsgZW50ZXJlZCBhbnN3ZXJzXG5cdFx0XHRcdFx0aWYgKHF1ZXN0aW9uLmVudGVyZWRBbnN3ZXJzKVxuXHRcdFx0XHRcdFx0ZW50ZXJlZEFuc3dlcnMgPSBxdWVzdGlvbi5lbnRlcmVkQW5zd2Vycy5maWx0ZXIoZnVuY3Rpb24oZWwpIHsgcmV0dXJuIGVsLnRyaW0oKSAhPT0gXCJcIiA/IGVsIDogZmFsc2U7IH0pO1xuXG5cdFx0XHRcdFx0aWYgKChxdWVzdGlvbi5zZWxlY3RlZEFuc3dlcnMgJiYgcXVlc3Rpb24uc2VsZWN0ZWRBbnN3ZXJzLmxlbmd0aCA9PT0gMCkgfHwgKHF1ZXN0aW9uLm1hdGNoZXMgJiYgKHF1ZXN0aW9uLm1hdGNoZXMubGVuZ3RoID09PSAwIHx8IHF1ZXN0aW9uRGF0YS5sZWZ0Lmxlbmd0aCA+IHF1ZXN0aW9uLm1hdGNoZXMubGVuZ3RoKSkpXG5cdFx0XHRcdFx0XHRza2lwcGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRlbHNlIGlmICgocXVlc3Rpb24uZW50ZXJlZEFuc3dlcnMgJiYgKGVudGVyZWRBbnN3ZXJzLmxlbmd0aCA9PT0gMCB8fCBxdWVzdGlvbkRhdGEuY29ycmVjdEFuc3dlcnMubGVuZ3RoID4gZW50ZXJlZEFuc3dlcnMubGVuZ3RoKSkgfHwgKHF1ZXN0aW9uLmFuc3dlciA9PT0gXCJcIikpXG5cdFx0XHRcdFx0XHRza2lwcGVkID0gdHJ1ZTtcblxuXHRcdFx0XHRcdGlmIChza2lwcGVkKVxuXHRcdFx0XHRcdFx0dGhpcy5wYXJlbnQucXVlcnlTZWxlY3RvcihcIi5pdGVtLVwiICsgaW5kZXgpLmNsYXNzTGlzdC5hZGQoXCJza2lwcGVkXCIpO1xuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIuaXRlbS1cIiArIGluZGV4KS5jbGFzc0xpc3QucmVtb3ZlKFwic2tpcHBlZFwiKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcy5sb2FkUXVlc3Rpb25EYXRhKHRoaXMuc3RhdGUuY3VycmVudFF1ZXN0aW9uKTtcblx0XHR9XG5cblx0XHR0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tYXNzZXNzbWVudFwiKS5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChcImlhZ286bmF2aWdhdGVcIiwge2RldGFpbDoge2RpcmVjdGlvbjogZGlyZWN0aW9ufX0pKTtcblx0fTtcblxuXHRJYWdvLnByb3RvdHlwZS5qdW1wVG9RdWVzdGlvbiA9IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGlmICghdGhpcy5zdGF0ZSlcblx0XHRcdHRoaXMuc3RhdGUgPSB7fTtcblx0XHR0aGlzLnN0YXRlLmN1cnJlbnRRdWVzdGlvbiA9IHBhcnNlSW50KGV2dC50YXJnZXQuaW5uZXJIVE1MLCAxMCkgLSAxO1xuXHRcdHRoaXMubmF2aWdhdGVRdWVzdGlvbnMoXCJqdW1wXCIsIGV2dCk7XG5cdH07XG5cblx0SWFnby5wcm90b3R5cGUucmV0dXJuTm9kZSA9IGZ1bmN0aW9uKGNvbnRlbnQsIHR5cGUsIGlkKSB7XG5cdFx0dmFyIG5vZGU7XG5cdFx0aWYgKHR5cGUgPT09IFwidGV4dFwiKSB7XG5cdFx0XHRub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG5cdFx0XHRub2RlLmlubmVySFRNTCA9IGNvbnRlbnQ7XG5cdFx0fVxuXHRcdGlmICh0eXBlID09PSBcImltYWdlXCIpIHtcblx0XHRcdGlmKHRoaXMuc3RhdGUuZWRpdE1vZGUpIHtcblx0XHRcdFx0bm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuXHRcdFx0XHQvL25vZGUuaW5uZXJIVE1MID0gY29udGVudDtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImltZ1wiKTtcblx0XHRcdFx0bm9kZS5zZXRBdHRyaWJ1dGUoXCJzcmNcIiwgY29udGVudCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICh0eXBlID09PSBcImJsYW5rXCIpIHtcblx0XHRcdG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG5cdFx0XHRub2RlLnNldEF0dHJpYnV0ZShcInR5cGVcIixcInRleHRcIik7XG5cdFx0XHRub2RlLnN0eWxlLndpZHRoID0gKGNvbnRlbnQubGVuZ3RoIC0gMikgKiAxOCArIFwicHhcIjtcblx0XHRcdC8vbm9kZS5zZXRBdHRyaWJ1dGUoXCJtYXhsZW5ndGhcIiwgY29udGVudC5sZW5ndGggLSAyKTtcblx0XHRcdG5vZGUuc2V0QXR0cmlidXRlKFwiZGF0YS12YWx1ZVwiLCBpZCk7XG5cdFx0XHRub2RlLnNldEF0dHJpYnV0ZShcImF1dG9jYXBpdGFsaXplXCIsIFwib2ZmXCIpO1xuXHRcdFx0bm9kZS5vbmtleXVwID0gdGhpcy5ibGFua0hhbmRsZXIuYmluZCh0aGlzKTtcblx0XHR9XG5cdFx0cmV0dXJuIG5vZGU7XG5cdH07XG5cblx0SWFnby5wcm90b3R5cGUucGFyYWdyYXBoSGFuZGxlciA9IGZ1bmN0aW9uKHRleHRhcmVhKSB7XG5cdFx0dGhpcy5zdGF0ZS5xdWVzdGlvbnNbdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLmFuc3dlciA9IHRleHRhcmVhLnZhbHVlO1xuXHRcdGlmICh0ZXh0YXJlYS52YWx1ZS5sZW5ndGgpXG5cdFx0XHR0aGlzLnByZXZOZXh0QnV0dG9ucyh0cnVlKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnByZXZOZXh0QnV0dG9ucyhmYWxzZSk7XG5cdH07XG5cblx0SWFnby5wcm90b3R5cGUucHJldmlld0ZpbGxJbkhhbmRsZXIgPSBmdW5jdGlvbihtYXJrdXAsIHRleHRpbnB1dCwgaW5kZXgpIHtcblx0XHR0aGlzLnN0YXRlLnF1ZXN0aW9uc1t0aGlzLnN0YXRlLmN1cnJlbnRRdWVzdGlvbl0uZW50ZXJlZEFuc3dlcnNbaW5kZXhdID0gdGV4dGlucHV0LnZhbHVlO1xuXHRcdHZhciBlbnRlcmVkQW5zd2VycyA9IHRoaXMuc3RhdGUucXVlc3Rpb25zW3RoaXMuc3RhdGUuY3VycmVudFF1ZXN0aW9uXS5lbnRlcmVkQW5zd2Vycy5maWx0ZXIoZnVuY3Rpb24gKGVsKSB7XG5cdFx0XHRyZXR1cm4gZWwgIT0gXCJcIjtcblx0XHR9KTtcblxuXHRcdGlmIChlbnRlcmVkQW5zd2Vycy5sZW5ndGggPT0gdGhpcy5hc3Nlc3NtZW50RGF0YS5xdWVzdGlvbkRhdGFbdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLmNvcnJlY3RBbnN3ZXJzLmxlbmd0aClcblx0XHRcdHRoaXMucHJldk5leHRCdXR0b25zKHRydWUpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMucHJldk5leHRCdXR0b25zKGZhbHNlKTtcblx0fTtcblxuXHRJYWdvLnByb3RvdHlwZS5ibGFua0hhbmRsZXIgPSBmdW5jdGlvbihldnQpIHtcblx0XHR2YXIgZWwgPSBldnQuY3VycmVudFRhcmdldCB8fCBldnQub3JpZ2luYWxUYXJnZXQ7XG5cblx0XHR0aGlzLnN0YXRlLnF1ZXN0aW9uc1t0aGlzLnN0YXRlLmN1cnJlbnRRdWVzdGlvbl0uZW50ZXJlZEFuc3dlcnNbZWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1pbmRleFwiKV0gPSBlbC52YWx1ZTtcblxuXHRcdC8vQ2hlY2sgaWYgZWFjaCB0ZXh0Ym94IGhhcyBiZWVuIHRvdWNoZWQuIEFsbG93cyBibGFuayBhbnN3ZXJzLlxuXHRcdHZhciBhbGwgPSAwO1xuXHRcdHRoaXMuc3RhdGUucXVlc3Rpb25zW3RoaXMuc3RhdGUuY3VycmVudFF1ZXN0aW9uXS5lbnRlcmVkQW5zd2Vycy5mb3JFYWNoKGZ1bmN0aW9uKGFuc3dlcikge1xuXHRcdFx0aWYoISFhbnN3ZXIpXG5cdFx0XHRcdGFsbCsrO1xuXHRcdH0pO1xuXHRcdHRoaXMucHJldk5leHRCdXR0b25zKGFsbCA9PT0gdGhpcy5hc3Nlc3NtZW50RGF0YS5xdWVzdGlvbkRhdGFbdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLmNvcnJlY3RBbnN3ZXJzLmxlbmd0aCk7XG5cdH07XG5cblx0SWFnby5wcm90b3R5cGUucHJldk5leHRCdXR0b25zID0gZnVuY3Rpb24oY2FuQWR2YW5jZSkge1xuXHRcdHZhciBzZWxmID0gdGhpcztcblx0XHQvL2NhbkFkdmFuY2UgPSB0cnVlO1xuXG5cdFx0dmFyIHRvZ2dsZVByZXYgPSBmdW5jdGlvbih0b2dnbGUsIGhpZGUpXG5cdFx0e1xuXHRcdFx0c2VsZi5wYXJlbnQucXVlcnlTZWxlY3RvcihcIiNpYWdvLXByZXZpb3VzLXF1ZXN0aW9uXCIpLnN0eWxlLmRpc3BsYXkgPSBoaWRlID8gXCJub25lXCIgOiBcImlubGluZS1ibG9ja1wiO1xuXG5cdFx0XHRpZiAodG9nZ2xlKVxuXHRcdFx0e1xuXHRcdFx0XHRzZWxmLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tcHJldmlvdXMtcXVlc3Rpb25cIikuY2xhc3NMaXN0LnJlbW92ZShcImRpc2FibGVkLWJ1dHRvblwiKTtcblx0XHRcdFx0c2VsZi5wYXJlbnQucXVlcnlTZWxlY3RvcihcIiNpYWdvLXByZXZpb3VzLXF1ZXN0aW9uXCIpLmNsYXNzTGlzdC5hZGQoXCJidXR0b25cIik7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdHNlbGYucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1wcmV2aW91cy1xdWVzdGlvblwiKS5jbGFzc0xpc3QuYWRkKFwiZGlzYWJsZWQtYnV0dG9uXCIpO1xuXHRcdFx0XHRzZWxmLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tcHJldmlvdXMtcXVlc3Rpb25cIikuY2xhc3NMaXN0LnJlbW92ZShcImJ1dHRvblwiKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dmFyIHRvZ2dsZU5leHQgPSBmdW5jdGlvbih0b2dnbGUsIGhpZGUpXG5cdFx0e1xuXHRcdFx0c2VsZi5wYXJlbnQucXVlcnlTZWxlY3RvcihcIiNpYWdvLW5leHQtcXVlc3Rpb25cIikuc3R5bGUuZGlzcGxheSA9IGhpZGUgPyBcIm5vbmVcIiA6IFwiaW5saW5lLWJsb2NrXCI7XG5cblx0XHRcdGlmICh0b2dnbGUpXG5cdFx0XHR7XG5cdFx0XHRcdHNlbGYucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1uZXh0LXF1ZXN0aW9uXCIpLmNsYXNzTGlzdC5yZW1vdmUoXCJkaXNhYmxlZC1idXR0b25cIik7XG5cdFx0XHRcdHNlbGYucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1uZXh0LXF1ZXN0aW9uXCIpLmNsYXNzTGlzdC5hZGQoXCJidXR0b25cIik7XG5cdFx0XHR9XG5cdFx0XHRlbHNlXG5cdFx0XHR7XG5cdFx0XHRcdHNlbGYucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1uZXh0LXF1ZXN0aW9uXCIpLmNsYXNzTGlzdC5hZGQoXCJkaXNhYmxlZC1idXR0b25cIik7XG5cdFx0XHRcdHNlbGYucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1uZXh0LXF1ZXN0aW9uXCIpLmNsYXNzTGlzdC5yZW1vdmUoXCJidXR0b25cIik7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdHZhciB0b2dnbGVDb21wbGV0ZSA9IGZ1bmN0aW9uKHRvZ2dsZSwgaGlkZSlcblx0XHR7XG5cdFx0XHRzZWxmLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tY29tcGxldGUtcXVlc3Rpb25cIikuc3R5bGUuZGlzcGxheSA9IGhpZGUgPyBcIm5vbmVcIiA6IFwiaW5saW5lLWJsb2NrXCI7XG5cblx0XHRcdGlmICh0b2dnbGUpXG5cdFx0XHR7XG5cdFx0XHRcdHNlbGYucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1jb21wbGV0ZS1xdWVzdGlvblwiKS5jbGFzc0xpc3QucmVtb3ZlKFwiZGlzYWJsZWQtYnV0dG9uXCIpO1xuXHRcdFx0XHRzZWxmLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tY29tcGxldGUtcXVlc3Rpb25cIikuY2xhc3NMaXN0LmFkZChcImJ1dHRvblwiKTtcblx0XHRcdFx0aWYgKHNlbGYucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIuaXRlbS1jb21wbGV0ZVwiKSlcblx0XHRcdFx0XHRzZWxmLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiLml0ZW0tY29tcGxldGVcIikuY2xhc3NMaXN0LnJlbW92ZShcImRpc2FibGVkLWJ1dHRvblwiKTtcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdHtcblx0XHRcdFx0c2VsZi5wYXJlbnQucXVlcnlTZWxlY3RvcihcIiNpYWdvLWNvbXBsZXRlLXF1ZXN0aW9uXCIpLmNsYXNzTGlzdC5hZGQoXCJkaXNhYmxlZC1idXR0b25cIik7XG5cdFx0XHRcdHNlbGYucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1jb21wbGV0ZS1xdWVzdGlvblwiKS5jbGFzc0xpc3QucmVtb3ZlKFwiYnV0dG9uXCIpO1xuXHRcdFx0XHRpZiAoc2VsZi5wYXJlbnQucXVlcnlTZWxlY3RvcihcIi5pdGVtLWNvbXBsZXRlXCIpKVxuXHRcdFx0XHRcdHNlbGYucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIuaXRlbS1jb21wbGV0ZVwiKS5jbGFzc0xpc3QuYWRkKFwiZGlzYWJsZWQtYnV0dG9uXCIpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR2YXIgc2tpcHBlZFF1ZXN0aW9ucyA9IFtdO1xuXHRcdHZhciBxdWVzdGlvbiwgcXVlc3Rpb25EYXRhLCBlbnRlcmVkQW5zd2VycztcblxuXHRcdGZvciAodmFyIGtleSBpbiB0aGlzLnN0YXRlLnF1ZXN0aW9ucykge1xuXHRcdFx0aWYgKHRoaXMuc3RhdGUucXVlc3Rpb25zLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0XHRcdFx0cXVlc3Rpb24gPSB0aGlzLnN0YXRlLnF1ZXN0aW9uc1trZXldO1xuXG5cdFx0XHRcdGlmIChxdWVzdGlvbi5tYXRjaGVzIHx8IHF1ZXN0aW9uLmVudGVyZWRBbnN3ZXJzKSB7XG5cdFx0XHRcdFx0cXVlc3Rpb25EYXRhID0gdGhpcy5hc3Nlc3NtZW50RGF0YS5xdWVzdGlvbkRhdGEuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pIHsgcmV0dXJuIGl0ZW0uaWQgPT09IHF1ZXN0aW9uLmlkOyB9KTtcblx0XHRcdFx0XHRxdWVzdGlvbkRhdGEgPSBxdWVzdGlvbkRhdGFbMF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZW1vdmUgYmxhbmsgZW50ZXJlZCBhbnN3ZXJzXG5cdFx0XHRcdGlmIChxdWVzdGlvbi5lbnRlcmVkQW5zd2Vycylcblx0XHRcdFx0XHRlbnRlcmVkQW5zd2VycyA9IHF1ZXN0aW9uLmVudGVyZWRBbnN3ZXJzLmZpbHRlcihmdW5jdGlvbihlbCkgeyByZXR1cm4gZWwudHJpbSgpICE9PSBcIlwiID8gZWwgOiBmYWxzZTsgfSk7XG5cblx0XHRcdFx0aWYgKChxdWVzdGlvbi5zZWxlY3RlZEFuc3dlcnMgJiYgcXVlc3Rpb24uc2VsZWN0ZWRBbnN3ZXJzLmxlbmd0aCA9PT0gMCkgfHwgKHF1ZXN0aW9uLm1hdGNoZXMgJiYgKHF1ZXN0aW9uLm1hdGNoZXMubGVuZ3RoID09PSAwIHx8IHF1ZXN0aW9uRGF0YS5sZWZ0Lmxlbmd0aCA+IHF1ZXN0aW9uLm1hdGNoZXMubGVuZ3RoKSkpXG5cdFx0XHRcdFx0c2tpcHBlZFF1ZXN0aW9ucy5wdXNoKGtleSk7XG5cdFx0XHRcdGVsc2UgaWYgKChxdWVzdGlvbi5lbnRlcmVkQW5zd2VycyAmJiAoZW50ZXJlZEFuc3dlcnMubGVuZ3RoID09PSAwIHx8IHF1ZXN0aW9uRGF0YS5jb3JyZWN0QW5zd2Vycy5sZW5ndGggPiBlbnRlcmVkQW5zd2Vycy5sZW5ndGgpKSB8fCAocXVlc3Rpb24uYW5zd2VyID09PSBcIlwiKSlcblx0XHRcdFx0XHRza2lwcGVkUXVlc3Rpb25zLnB1c2goa2V5KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb24gPT09IHRoaXMuYXNzZXNzbWVudERhdGEucXVlc3Rpb25EYXRhLmxlbmd0aCAtIDEpXG5cdFx0e1xuXHRcdFx0dG9nZ2xlTmV4dChjYW5BZHZhbmNlIHx8IHRoaXMuc3RhdGUuZWRpdE1vZGUsICF0aGlzLnN0YXRlLmVkaXRNb2RlKTtcblx0XHRcdHRvZ2dsZVByZXYodGhpcy5hc3Nlc3NtZW50RGF0YS5xdWVzdGlvbkRhdGEubGVuZ3RoID4gMSwgZmFsc2UpO1xuXG5cdFx0XHRpZiAoKCF0aGlzLnN0YXRlLmZlZWRiYWNrTW9kZSAmJiBza2lwcGVkUXVlc3Rpb25zLmxlbmd0aCA+IDApIHx8ICghdGhpcy5zdGF0ZS5lZGl0TW9kZSAmJiBza2lwcGVkUXVlc3Rpb25zLmxlbmd0aCA+IDApKVxuXHRcdFx0XHR0b2dnbGVDb21wbGV0ZShmYWxzZSwgdGhpcy5zdGF0ZS5lZGl0TW9kZSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRvZ2dsZUNvbXBsZXRlKCghdGhpcy5zdGF0ZS5mZWVkYmFja01vZGUgfHwgdGhpcy5zdGF0ZS5wcmV2aWV3TW9kZSkgJiYgY2FuQWR2YW5jZSwgdGhpcy5zdGF0ZS5lZGl0TW9kZSk7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKHRoaXMuc3RhdGUuY3VycmVudFF1ZXN0aW9uID09PSAwKVxuXHRcdHtcblx0XHRcdHRvZ2dsZU5leHQodHJ1ZSwgZmFsc2UpO1xuXHRcdFx0dG9nZ2xlUHJldihmYWxzZSwgZmFsc2UpO1xuXHRcdFx0dG9nZ2xlQ29tcGxldGUoZmFsc2UsIHRydWUpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dG9nZ2xlTmV4dCh0cnVlLCBmYWxzZSk7XG5cdFx0XHR0b2dnbGVQcmV2KHRydWUsIGZhbHNlKTtcblx0XHRcdHRvZ2dsZUNvbXBsZXRlKGZhbHNlLCB0cnVlKTtcblx0XHR9XG5cblx0XHRpZiAoIXNraXBwZWRRdWVzdGlvbnMubGVuZ3RoICYmIHRoaXMuc3RhdGUuY3VycmVudFF1ZXN0aW9uICE9PSB0aGlzLmFzc2Vzc21lbnREYXRhLnF1ZXN0aW9uRGF0YS5sZW5ndGggLSAxKVxuXHRcdFx0dG9nZ2xlQ29tcGxldGUodHJ1ZSwgdHJ1ZSk7XG5cdH07XG5cblx0SWFnby5wcm90b3R5cGUuY29tcGxldGVCdXR0b25zID0gZnVuY3Rpb24oaGlkZSkge1xuXHRcdGlmIChoaWRlKVxuXHRcdHtcblx0XHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1yZXN0YXJ0LXF1ZXN0aW9uXCIpLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcblx0XHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1mZWVkYmFjay1xdWVzdGlvblwiKS5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG5cdFx0XHR0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tcHJldmlvdXMtcXVlc3Rpb25cIikuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXHRcdFx0Ly90aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tYmFjay10by1hcHBcIikuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1yZXN0YXJ0LXF1ZXN0aW9uXCIpLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuXHRcdC8vdGhpcy5wYXJlbnQucXVlcnlTZWxlY3RvcihcIiNpYWdvLWJhY2stdG8tYXBwXCIpLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuXHRcdGlmICh0aGlzLmFzc2Vzc21lbnREYXRhLmZlZWRiYWNrKVxuXHRcdFx0dGhpcy5wYXJlbnQucXVlcnlTZWxlY3RvcihcIiNpYWdvLWZlZWRiYWNrLXF1ZXN0aW9uXCIpLnN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuXG5cdFx0dGhpcy5wYXJlbnQucXVlcnlTZWxlY3RvcihcIiNpYWdvLW5leHQtcXVlc3Rpb25cIikuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1jb21wbGV0ZS1xdWVzdGlvblwiKS5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjtcblx0XHR0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tcHJldmlvdXMtcXVlc3Rpb25cIikuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXHR9O1xuXG5cdElhZ28ucHJvdG90eXBlLnNlbGVjdE9wdGlvbiA9IGZ1bmN0aW9uKGV2dCkge1xuXHRcdHZhciBzZWxmID0gdGhpcztcblxuXHRcdHZhciBzZWxlY3RBbnN3ZXIgPSBmdW5jdGlvbihlbCkge1xuXHRcdFx0dmFyIGlkID0gcGFyc2VJbnQoZWwuZ2V0QXR0cmlidXRlKFwiZGF0YS12YWx1ZVwiKSwgMTApO1xuXG5cdFx0XHRzZWxmLnN0YXRlLnF1ZXN0aW9uc1tzZWxmLnN0YXRlLmN1cnJlbnRRdWVzdGlvbl0uc2VsZWN0ZWRBbnN3ZXJzLnB1c2goaWQpO1xuXG5cdFx0XHRlbC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXNlbGVjdGVkXCIsIHRydWUpO1xuXHRcdFx0ZWwuY2xhc3NMaXN0LmFkZChcInF1ZXN0aW9uLW9wdGlvbnMtc2VsZWN0ZWRcIik7XG5cblx0XHRcdHNlbGYudHJhbnNpdGlvbihcInF1ZXN0aW9uLWFjdGlvblwiLCB7XG5cdFx0XHRcdGFjdGlvbjogXCJzZWxlY3Qtb3B0aW9uXCIsXG5cdFx0XHRcdHF1ZXN0aW9uOiBzZWxmLmFzc2Vzc21lbnREYXRhLnF1ZXN0aW9uRGF0YVtzZWxmLnN0YXRlLmN1cnJlbnRRdWVzdGlvbl0uaWQsXG5cdFx0XHR9KTtcblxuXHRcdFx0c2VsZi5wcmV2TmV4dEJ1dHRvbnModHJ1ZSk7XG5cdFx0fTtcblxuXHRcdHZhciBlbCA9IGV2dC5jdXJyZW50VGFyZ2V0IHx8IGV2dC5vcmlnaW5hbFRhcmdldDtcblxuXHRcdGlmICh0aGlzLmFzc2Vzc21lbnREYXRhLnF1ZXN0aW9uRGF0YVt0aGlzLnN0YXRlLmN1cnJlbnRRdWVzdGlvbl0uc3VidHlwZSA9PT0gMSlcblx0XHR7XG5cdFx0XHRpZiAoZWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1zZWxlY3RlZFwiKSA9PT0gXCJmYWxzZVwiKVxuXHRcdFx0XHRzZWxlY3RBbnN3ZXIoZWwpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLmNsZWFyU2VsZWN0ZWQoZWwpO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0e1xuXHRcdFx0dmFyIG5vZGUgPSBlbC5wYXJlbnROb2RlLmZpcnN0Q2hpbGQ7XG5cblx0XHRcdHdoaWxlKG5vZGUpXG5cdFx0XHR7XG5cdFx0XHRcdHRoaXMuY2xlYXJTZWxlY3RlZChub2RlKTtcblx0XHRcdFx0bm9kZSA9IG5vZGUubmV4dEVsZW1lbnRTaWJsaW5nIHx8IG5vZGUubmV4dFNpYmxpbmc7XG5cdFx0XHR9XG5cblx0XHRcdHNlbGVjdEFuc3dlcihlbCk7XG5cdFx0fVxuXHR9O1xuXG5cdElhZ28ucHJvdG90eXBlLmNsZWFyU2VsZWN0ZWQgPSBmdW5jdGlvbihlbCkge1xuXHRcdGlmICghZWwuY2xhc3NMaXN0LmNvbnRhaW5zKFwicXVlc3Rpb24tb3B0aW9ucy1zZWxlY3RlZFwiKSlcblx0XHRcdHJldHVybjtcblxuXHRcdGVsLmNsYXNzTGlzdC5yZW1vdmUoXCJxdWVzdGlvbi1vcHRpb25zLXNlbGVjdGVkXCIpO1xuXHRcdGVsLnNldEF0dHJpYnV0ZShcImRhdGEtc2VsZWN0ZWRcIiwgZmFsc2UpO1xuXG5cdFx0dGhpcy50cmFuc2l0aW9uKFwicXVlc3Rpb24tYWN0aW9uXCIsIHtcblx0XHRcdGFjdGlvbjogXCJjbGVhci1vcHRpb25cIixcblx0XHRcdHF1ZXN0aW9uOiB0aGlzLmFzc2Vzc21lbnREYXRhLnF1ZXN0aW9uRGF0YVt0aGlzLnN0YXRlLmN1cnJlbnRRdWVzdGlvbl0uaWQsXG5cdFx0fSk7XG5cblx0XHR2YXIgaWQgPSBwYXJzZUludChlbC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXZhbHVlXCIpLCAxMCk7XG5cblx0XHR0aGlzLnN0YXRlLnF1ZXN0aW9uc1t0aGlzLnN0YXRlLmN1cnJlbnRRdWVzdGlvbl0uc2VsZWN0ZWRBbnN3ZXJzID1cblx0XHRcdHRoaXMuc3RhdGUucXVlc3Rpb25zW3RoaXMuc3RhdGUuY3VycmVudFF1ZXN0aW9uXS5zZWxlY3RlZEFuc3dlcnMuZmlsdGVyKGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHggIT09IGlkOyB9KTtcblxuXHRcdGlmICh0aGlzLnN0YXRlLnF1ZXN0aW9uc1t0aGlzLnN0YXRlLmN1cnJlbnRRdWVzdGlvbl0uc2VsZWN0ZWRBbnN3ZXJzLmxlbmd0aCA9PT0gMClcblx0XHRcdHRoaXMucHJldk5leHRCdXR0b25zKGZhbHNlKTtcblx0fTtcblxuXHRJYWdvLnByb3RvdHlwZS5zZWxlY3RNYXRjaCA9IGZ1bmN0aW9uKGV2dCkge1xuXHRcdHZhciBlbCA9IGV2dC5jdXJyZW50VGFyZ2V0IHx8IGV2dC5vcmlnaW5hbFRhcmdldDtcblxuXHRcdHZhciBzaWRlID0gZWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1jb2x1bW5cIik7XG5cdFx0dmFyIHZhbHVlID0gcGFyc2VJbnQoZWwuZ2V0QXR0cmlidXRlKFwiZGF0YS12YWx1ZVwiKSwgMTApO1xuXHRcdC8vdmFyIGNvcnJlY3RNYXRjaCA9IGVsLmdldEF0dHJpYnV0ZShcImRhdGEtY29ycmVjdG1hdGNoXCIpO1xuXHRcdHZhciBvdGhlcnNpZGUgPSBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBzaWRlID09PSBcImxlZnRcIiA/IFwicmlnaHRcIiA6IFwibGVmdFwiO1xuXHRcdH07XG5cdFx0dmFyIGJnO1xuXG5cdFx0Ly8gTm8gaXRlbXMgeWV0IHNlbGVjdGVkLCBidXQgdGhpcyBpdGVtIGFscmVhZHkgcGFpcmVkOyBkZXNlbGVjdCBib3RoXG5cdFx0aWYoIXRoaXMubWF0Y2hTZWxlY3Rpb24ubGVmdC5zZWxlY3RlZCAmJiAhdGhpcy5tYXRjaFNlbGVjdGlvbi5yaWdodC5zZWxlY3RlZCAmJiBlbC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXNlbGVjdGVkXCIpID09PSBcInRydWVcIikge1xuXHRcdFx0dGhpcy50cmFuc2l0aW9uKFwicXVlc3Rpb24tYWN0aW9uXCIsIHsgcXVlc3Rpb246IHRoaXMuYXNzZXNzbWVudERhdGEucXVlc3Rpb25EYXRhW3RoaXMuc3RhdGUuY3VycmVudFF1ZXN0aW9uXS5pZCwgYWN0aW9uOiBcImRlc2VsZWN0LW1hdGNoXCIgfSk7XG5cblx0XHRcdC8vIEZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnRcblx0XHRcdHZhciBtYXRjaCA9IHRoaXMuc3RhdGUucXVlc3Rpb25zW3RoaXMuc3RhdGUuY3VycmVudFF1ZXN0aW9uXS5tYXRjaGVzLmZpbHRlcihmdW5jdGlvbihpdGVtKSB7IHJldHVybiBpdGVtW3NpZGVdID09PSB2YWx1ZTsgfSk7XG5cblx0XHRcdGlmKCFtYXRjaC5sZW5ndGgpXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIk5vIG1hdGNoIGZvdW5kLCBpbXBvc3NpYmxlIHN0YXRlXCIpO1xuXG5cdFx0XHRtYXRjaCA9IG1hdGNoWzBdO1xuXG5cdFx0XHR2YXIgbGVmdCA9IHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjbGlzdGxlZnQgW2RhdGEtdmFsdWU9J1wiICsgbWF0Y2gubGVmdCArIFwiJ11cIik7XG5cdFx0XHR2YXIgcmlnaHQgPSB0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2xpc3RyaWdodCBbZGF0YS12YWx1ZT0nXCIgKyBtYXRjaC5yaWdodCArIFwiJ11cIik7XG5cblx0XHRcdGxlZnQucXVlcnlTZWxlY3RvcihcImRpdi5ib3JkZXJcIikuY2xhc3NMaXN0LnJlbW92ZShcImJvcmRlci1cIiArIG1hdGNoLmJnKTtcblx0XHRcdGxlZnQuc2V0QXR0cmlidXRlKFwiZGF0YS1zZWxlY3RlZFwiLCBcImZhbHNlXCIpO1xuXHRcdFx0cmlnaHQucXVlcnlTZWxlY3RvcihcImRpdi5ib3JkZXJcIikuY2xhc3NMaXN0LnJlbW92ZShcImJvcmRlci1cIiArIG1hdGNoLmJnKTtcblx0XHRcdHJpZ2h0LnNldEF0dHJpYnV0ZShcImRhdGEtc2VsZWN0ZWRcIiwgXCJmYWxzZVwiKTtcblxuXHRcdFx0dGhpcy5iYWNrZ3JvdW5kUGFsbGV0dGUucHVzaChtYXRjaC5iZyk7XG5cdFx0XHR0aGlzLm1hdGNoU2VsZWN0aW9uID0ge2xlZnQ6IHtzZWxlY3RlZDogZmFsc2V9LCByaWdodDoge3NlbGVjdGVkOiBmYWxzZX19O1xuXG5cdFx0XHR0aGlzLnN0YXRlLnF1ZXN0aW9uc1t0aGlzLnN0YXRlLmN1cnJlbnRRdWVzdGlvbl0ubWF0Y2hlcyA9IHRoaXMuc3RhdGUucXVlc3Rpb25zW3RoaXMuc3RhdGUuY3VycmVudFF1ZXN0aW9uXS5tYXRjaGVzLmZpbHRlcihmdW5jdGlvbihpdGVtKSB7IHJldHVybiBpdGVtICE9IG1hdGNoOyB9KTtcblx0XHR9XG5cdFx0Ly8gTm8gaXRlbXMgeWV0IHNlbGVjdGVkLCB0aGlzIGl0ZW0gbm90IHBhaXJlZDogcGljayBhIGJvcmRlciBhbmQgYXNzaWduIGl0XG5cdFx0ZWxzZSBpZighdGhpcy5tYXRjaFNlbGVjdGlvbi5sZWZ0LnNlbGVjdGVkICYmICF0aGlzLm1hdGNoU2VsZWN0aW9uLnJpZ2h0LnNlbGVjdGVkICYmIGVsLmdldEF0dHJpYnV0ZShcImRhdGEtc2VsZWN0ZWRcIikgPT09IFwiZmFsc2VcIikge1xuXHRcdFx0dGhpcy50cmFuc2l0aW9uKFwicXVlc3Rpb24tYWN0aW9uXCIsIHtxdWVzdGlvbjogdGhpcy5hc3Nlc3NtZW50RGF0YS5xdWVzdGlvbkRhdGFbdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLmlkLCBhY3Rpb246IFwic2VsZWN0LWZpcnN0LW1hdGNoXCJ9KTtcblxuXHRcdFx0YmcgPSB0aGlzLmJhY2tncm91bmRQYWxsZXR0ZS5wb3AoKTtcblx0XHRcdHRoaXMubWF0Y2hTZWxlY3Rpb25bc2lkZV0gPSB7c2VsZWN0ZWQ6IHRydWUsIGJnOiBiZywgdmFsdWU6IHZhbHVlfTtcblx0XHRcdGVsLnF1ZXJ5U2VsZWN0b3IoXCJkaXYuYm9yZGVyXCIpLmNsYXNzTGlzdC5hZGQoXCJib3JkZXItXCIgKyBiZyk7XG5cdFx0XHRlbC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXNlbGVjdGVkXCIsIFwidHJ1ZVwiKTtcblx0XHR9XG5cdFx0Ly8gT25lIGl0ZW0gYWxyZWFkeSBzZWxlY3RlZFxuXHRcdGVsc2UgaWYodGhpcy5tYXRjaFNlbGVjdGlvbi5sZWZ0LnNlbGVjdGVkIHx8IHRoaXMubWF0Y2hTZWxlY3Rpb24ucmlnaHQuc2VsZWN0ZWQpIHtcblx0XHRcdC8vIENsaWNrZWQgb24gc2FtZSBpdGVtOyBkZXNlbGVjdFxuXHRcdFx0aWYodGhpcy5tYXRjaFNlbGVjdGlvbltzaWRlXS5zZWxlY3RlZCAmJiB0aGlzLm1hdGNoU2VsZWN0aW9uW3NpZGVdLnZhbHVlID09PSB2YWx1ZSkge1xuXHRcdFx0XHR0aGlzLnRyYW5zaXRpb24oXCJxdWVzdGlvbi1hY3Rpb25cIiwge3F1ZXN0aW9uOiB0aGlzLmFzc2Vzc21lbnREYXRhLnF1ZXN0aW9uRGF0YVt0aGlzLnN0YXRlLmN1cnJlbnRRdWVzdGlvbl0uaWQsIGFjdGlvbjogXCJkZXNlbGVjdC1tYXRjaFwifSk7XG5cdFx0XHRcdGJnID0gdGhpcy5tYXRjaFNlbGVjdGlvbltzaWRlXS5iZztcblx0XHRcdFx0ZWwucXVlcnlTZWxlY3RvcihcImRpdi5ib3JkZXJcIikuY2xhc3NMaXN0LnJlbW92ZShcImJvcmRlci1cIiArIGJnKTtcblx0XHRcdFx0dGhpcy5iYWNrZ3JvdW5kUGFsbGV0dGUucHVzaChiZyk7XG5cdFx0XHRcdHRoaXMubWF0Y2hTZWxlY3Rpb25bc2lkZV0gPSB7c2VsZWN0ZWQ6IGZhbHNlfTtcblx0XHRcdFx0ZWwuc2V0QXR0cmlidXRlKFwiZGF0YS1zZWxlY3RlZFwiLCBcImZhbHNlXCIpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gQ2xpY2tlZCBvbiB1bnNlbGVjdGVkIGl0ZW0gb24gc2FtZSBzaWRlOyBkbyBub3RoaW5nXG5cdFx0XHRlbHNlIGlmKHRoaXMubWF0Y2hTZWxlY3Rpb25bc2lkZV0uc2VsZWN0ZWQgJiYgdGhpcy5tYXRjaFNlbGVjdGlvbltzaWRlXS52YWx1ZSAhPT0gdmFsdWUpIHtcblxuXHRcdFx0fVxuXHRcdFx0Ly8gQ2xpY2tlZCBvbiBzZWxlY3RlZCBpdGVtIG9uIG90aGVyIHNpZGU7IGRvIG5vdGhpbmdcblx0XHRcdGVsc2UgaWYodGhpcy5tYXRjaFNlbGVjdGlvbltvdGhlcnNpZGUoKV0uc2VsZWN0ZWQgJiYgZWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1zZWxlY3RlZFwiKSA9PT0gXCJ0cnVlXCIpIHtcblxuXHRcdFx0fVxuXHRcdFx0Ly8gQ2xpY2tlZCBvbiB1bnNlbGVjdGVkIGl0ZW0gb24gb3RoZXIgc2lkZTsgYWRkIGl0XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0dGhpcy50cmFuc2l0aW9uKFwicXVlc3Rpb24tYWN0aW9uXCIsIHtxdWVzdGlvbjogdGhpcy5hc3Nlc3NtZW50RGF0YS5xdWVzdGlvbkRhdGFbdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLmlkLCBhY3Rpb246IFwic2VsZWN0LXNlY29uZC1tYXRjaFwifSk7XG5cdFx0XHRcdGJnID0gdGhpcy5tYXRjaFNlbGVjdGlvbltvdGhlcnNpZGUoKV0uYmc7XG5cdFx0XHRcdGVsLnF1ZXJ5U2VsZWN0b3IoXCJkaXYuYm9yZGVyXCIpLmNsYXNzTGlzdC5hZGQoXCJib3JkZXItXCIgKyBiZyk7XG5cdFx0XHRcdHRoaXMubWF0Y2hTZWxlY3Rpb25bc2lkZV0gPSB7c2VsZWN0ZWQ6IGZhbHNlLCBiZzogYmcsIHZhbHVlOiB2YWx1ZX07XG5cdFx0XHRcdHRoaXMuc3RhdGUucXVlc3Rpb25zW3RoaXMuc3RhdGUuY3VycmVudFF1ZXN0aW9uXS5tYXRjaGVzLnB1c2goe2xlZnQ6IHRoaXMubWF0Y2hTZWxlY3Rpb24ubGVmdC52YWx1ZSwgcmlnaHQ6IHRoaXMubWF0Y2hTZWxlY3Rpb24ucmlnaHQudmFsdWUsIGJnOiBiZywgY29ycmVjdDogdGhpcy5tYXRjaFNlbGVjdGlvbi5sZWZ0LnZhbHVlID09PSB0aGlzLm1hdGNoU2VsZWN0aW9uLnJpZ2h0LnZhbHVlfSk7XG5cblx0XHRcdFx0dGhpcy5tYXRjaFNlbGVjdGlvbiA9IHtsZWZ0OiB7c2VsZWN0ZWQ6IGZhbHNlfSwgcmlnaHQ6IHtzZWxlY3RlZDogZmFsc2V9fTtcblx0XHRcdFx0ZWwuc2V0QXR0cmlidXRlKFwiZGF0YS1zZWxlY3RlZFwiLCBcInRydWVcIik7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5wcmV2TmV4dEJ1dHRvbnModGhpcy5zdGF0ZS5xdWVzdGlvbnNbdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLm1hdGNoZXMubGVuZ3RoID09IHRoaXMuYXNzZXNzbWVudERhdGEucXVlc3Rpb25EYXRhW3RoaXMuc3RhdGUuY3VycmVudFF1ZXN0aW9uXS5sZWZ0Lmxlbmd0aCk7XG5cdH07XG5cblx0SWFnby5wcm90b3R5cGUucmVzdGFydCA9IGZ1bmN0aW9uKGRhdGEpIHtcblx0XHR0aGlzLnNhdmVkID0gZmFsc2U7XG5cdFx0dGhpcy5jb21wbGV0ZUJ1dHRvbnModHJ1ZSk7XG5cdFx0dGhpcy5zdGFydChkYXRhIHx8IHRoaXMuYXNzZXNzbWVudERhdGEsIHRoaXMuYXR0YWNobWVudCk7XG5cdH07XG5cblx0SWFnby5wcm90b3R5cGUuYmFja1RvQXBwID0gZnVuY3Rpb24oKSB7XG5cdFx0d2luZG93Lm9wZW4oXCJcIiwgXCJfc2VsZlwiKS5jbG9zZSgpO1xuXHRcdC8vPGEgaHJlZj1cImphdmFzY3JpcHQ6d2luZG93Lm9wZW4oJycsJ19zZWxmJykuY2xvc2UoKTtcIj5jbG9zZTwvYT5cblx0fTtcblxuXHRJYWdvLnByb3RvdHlwZS5yZXN0YXJ0V2l0aEZlZWRiYWNrID0gZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy50cmFuc2l0aW9uKFwidG9nZ2xlLWZlZWRiYWNrXCIpO1xuXHRcdHRoaXMuc3RhdGUuZmVlZGJhY2tNb2RlID0gdHJ1ZTtcblx0XHR0aGlzLnJlc3RhcnQoKTtcblx0fTtcblxuXHRJYWdvLnByb3RvdHlwZS5zZXRQcm9ncmVzcyA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBwcm9ncmVzcyA9ICh0aGlzLnN0YXRlLmN1cnJlbnRRdWVzdGlvbiArIDEpIC8gdGhpcy5hc3Nlc3NtZW50RGF0YS5xdWVzdGlvbkRhdGEubGVuZ3RoICogMTAwO1xuXHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1wcm9ncmVzcy1kb25lXCIpLnN0eWxlLndpZHRoID0gTWF0aC5mbG9vcihwcm9ncmVzcykgKyBcIiVcIjtcblx0XHR0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tcHJvZ3Jlc3MtbGVmdFwiKS5zdHlsZS53aWR0aCA9IE1hdGguY2VpbCgxMDAgLSBwcm9ncmVzcykgKyBcIiVcIjtcblxuXHRcdGlmICghdGhpcy5zdGF0ZS5lZGl0TW9kZSkge1xuXHRcdFx0aWYgKHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIucHJvZ3Jlc3MtaXRlbS5hY3RpdmVcIikpXG5cdFx0XHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIucHJvZ3Jlc3MtaXRlbS5hY3RpdmVcIikuY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKTtcblx0XHRcdHZhciBpdGVtID0gdGhpcy5wYXJlbnQucXVlcnlTZWxlY3RvcihcIi5pdGVtLVwiICsgKHRoaXMuc3RhdGUuY3VycmVudFF1ZXN0aW9uICsgMSkpO1xuXHRcdFx0aXRlbS5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xuXHRcdFx0dGhpcy5wYXJlbnQuc2Nyb2xsVG9wID0gMDtcblx0XHR9XG5cdH07XG5cblx0SWFnby5wcm90b3R5cGUuY29tcGxldGVRdWVzdGlvbnMgPSBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5wYXJlbnQucXVlcnlTZWxlY3RvcihcIiNpYWdvLWNvbXBsZXRlLXF1ZXN0aW9uXCIpLmNsYXNzTGlzdC5jb250YWlucyhcImRpc2FibGVkLWJ1dHRvblwiKSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIucHJvZ3Jlc3MtaXRlbXNcIikuaW5uZXJIVE1MID0gXCJcIjtcblxuXHRcdGlmKCF0aGlzLnN0YXRlLmZlZWRiYWNrTW9kZSlcblx0XHRcdHRoaXMudHJhbnNpdGlvbihcImFzc2Vzc21lbnQtZW5kXCIsIHtyZXNvdXJjZTogdGhpcy5hc3Nlc3NtZW50RGF0YS5faWQsIGF0dGFjaG1lbnQ6IHRoaXMuYXR0YWNobWVudC5faWR9KTtcblxuXHRcdHRoaXMuZmVlZGJhY2tTdGF0ZSA9IHRoaXMuc3RhdGU7XG5cblx0XHR0aGlzLmNvbXBsZXRlQnV0dG9ucyh0aGlzLmF0dGFjaG1lbnQuc2V0dGluZ3MuaGlkZUNvbXBsZXRlQnV0dG9ucyk7XG5cdFx0dGhpcy5wYXJlbnQucXVlcnlTZWxlY3RvcihcIiNpYWdvLWhlYWRpbmctdGV4dFwiKS5pbm5lckhUTUwgPSBcIlwiO1xuXHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1uZXh0LXF1ZXN0aW9uXCIpLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcblx0XHR0aGlzLnBhcmVudC5xdWVyeVNlbGVjdG9yKFwiI2lhZ28tY29tcGxldGUtcXVlc3Rpb25cIikuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1xdWVzdGlvbi1jb250ZW50XCIpLmlubmVySFRNTCA9IFwiXCI7XG5cdFx0dGhpcy5wYXJlbnQucXVlcnlTZWxlY3RvcihcIiNpYWdvLWhlbHAtY29udGVudC10ZXh0XCIpLmlubmVySFRNTCA9IElhZ28uaW5zdHJ1Y3Rpb25zW3RoaXMuYXNzZXNzbWVudERhdGEubGFuZ3VhZ2VdLmVuZFNjcmVlbjtcblx0XHR2YXIgb3B0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHRvcHRpb24uY2xhc3NMaXN0LmFkZChcInF1ZXN0aW9uLW9wdGlvbnNcIik7XG5cblx0XHRpZiAoIXRoaXMuc3RhdGUuZmVlZGJhY2tNb2RlKSB7XG5cdFx0XHR0aGlzLnN0YXRlLnF1ZXN0aW9uc1t0aGlzLnN0YXRlLmN1cnJlbnRRdWVzdGlvbl0udGltZS5wdXNoKG5ldyBEYXRlKCkudmFsdWVPZigpIC0gdGhpcy5zdGF0ZS5xdWVzdGlvbnNbdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb25dLnF1ZXN0aW9uU3RhcnQpO1xuXG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuYXNzZXNzbWVudERhdGEucXVlc3Rpb25EYXRhLmxlbmd0aDsgaSsrKVxuXHRcdFx0XHR0aGlzLmV4dHJhY3RNYXJrKGkpO1xuXG5cdFx0XHQvLyBSZWNhbGMgdGhlIGN1cnJlbnQgdGltZVxuXHRcdFx0dGhpcy5mZWVkYmFjay50aW1lID0gdGhpcy5zdW1PZih0aGlzLmZlZWRiYWNrLnNjb3JlcywgXCJ0aW1lXCIpO1xuXG5cdFx0XHQvLyBBbmQgdGhlIGN1cnJlbnQgbWFya1xuXHRcdFx0dGhpcy5mZWVkYmFjay5tYXJrID0gdGhpcy5zdW1PZih0aGlzLmZlZWRiYWNrLnNjb3JlcywgXCJzY29yZVwiKTtcblxuXHRcdFx0Ly90aGlzLmZlZWRiYWNrLm1heFNjb3JlID0gdGhpcy5zdW1PZih0aGlzLmZlZWRiYWNrLnNjb3JlcywgXCJwb3RlbnRpYWxTY29yZVwiKTtcblxuXHRcdFx0aWYoIXRoaXMuc3RhdGUuZmVlZGJhY2tNb2RlICYmICF0aGlzLnN0YXRlLmVkaXRNb2RlICYmIHRoaXMuYXR0YWNobWVudC5zZXR0aW5ncyAmJiB0aGlzLmF0dGFjaG1lbnQuc2V0dGluZ3Muc2VydmVyU2F2ZSA9PT0gdHJ1ZSlcblx0XHRcdFx0d2luZG93LlN5bmMuYXNzZXNzbWVudENvbXBsZXRlKEpTT04uc3RyaW5naWZ5KHtyZXN1bHRzOiB0aGlzLmZlZWRiYWNrLCBhY3Rpdml0eTogdGhpcy5hY3Rpdml0eSwgdXJsOiB1cmx9KSk7XG5cblx0XHRcdGlmICghdGhpcy5hdHRhY2htZW50LnNldHRpbmdzLmRpc2FibGVSZXN1bHQpXG5cdFx0XHR7XG5cdFx0XHRcdHZhciBxdWVzdGlvbkNvdW50ID0gdGhpcy5hc3Nlc3NtZW50RGF0YS5xdWVzdGlvbkRhdGEubGVuZ3RoO1xuXHRcdFx0XHR2YXIgcUF1dG9Db3VudCA9IHRoaXMuZmVlZGJhY2subWFya2FibGVDb3VudDtcblx0XHRcdFx0dmFyIHFNYW51YWxDb3VudCA9IHF1ZXN0aW9uQ291bnQgLSBxQXV0b0NvdW50O1xuXHRcdFx0XHR2YXIgbWFudWFsVG90YWwgPSAwLCBhdXRvVG90YWwgPSAwLCBhdXRvTWFyayA9IDA7XG5cblx0XHRcdFx0dmFyIHNjb3Jlc09iaiA9IHRoaXMuZmVlZGJhY2suc2NvcmVzO1xuXHRcdFx0XHR2YXIgc2NvcmVzID0gT2JqZWN0LmtleXMoc2NvcmVzT2JqKS5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gc2NvcmVzT2JqW2tleV07IH0pO1xuXG5cdFx0XHRcdHNjb3Jlcy5mb3JFYWNoKGZ1bmN0aW9uKHNjb3JlLCBpKSB7XG5cdFx0XHRcdFx0aWYoc2NvcmUuc2NvcmUgIT09IHVuZGVmaW5lZCl7XG5cdFx0XHRcdFx0XHRhdXRvVG90YWwgKz0gc2NvcmUucG90ZW50aWFsU2NvcmU7XG5cdFx0XHRcdFx0XHRhdXRvTWFyayArPSBzY29yZS5zY29yZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZWxzZXtcblx0XHRcdFx0XHRcdG1hbnVhbFRvdGFsICs9IHNjb3JlLnBvdGVudGlhbFNjb3JlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRpZigodGhpcy5hc3Nlc3NtZW50RGF0YS5xdWVzdGlvbkRhdGEubGVuZ3RoIC0gdGhpcy5mZWVkYmFjay5tYXJrYWJsZUNvdW50KSkge1xuXHRcdFx0XHRcdG9wdGlvbi5pbm5lckhUTUwgKz0gSWFnby5pbnN0cnVjdGlvbnNbdGhpcy5hc3Nlc3NtZW50RGF0YS5sYW5ndWFnZV0udGVhY2hlclRvTWFya1xuXHRcdFx0XHRcdFx0LnJlcGxhY2UoXCJ7cU1hbnVhbENvdW50fVwiLCBcIjxzdHJvbmc+XCIgKyBxTWFudWFsQ291bnQgKyBcIjwvc3Ryb25nPlwiKVxuXHRcdFx0XHRcdFx0LnJlcGxhY2UoXCJ7cXVlc3Rpb25Db3VudH1cIiwgXCI8c3Ryb25nPlwiICsgcXVlc3Rpb25Db3VudCArIFwiPC9zdHJvbmc+XCIpXG5cdFx0XHRcdFx0XHQucmVwbGFjZShcInttYW51YWxUb3RhbH1cIiwgXCI8c3Ryb25nPlwiICsgbWFudWFsVG90YWwgKyBcIjwvc3Ryb25nPlwiKVxuXHRcdFx0XHRcdCsgXCI8YnIvPlwiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0b3B0aW9uLmlubmVySFRNTCArPSBJYWdvLmluc3RydWN0aW9uc1t0aGlzLmFzc2Vzc21lbnREYXRhLmxhbmd1YWdlXS5hdXRvbWF0aWNNYXJrXG5cdFx0XHRcdFx0LnJlcGxhY2UoXCJ7cUF1dG9Db3VudH1cIiwgXCI8c3Ryb25nPlwiICsgcUF1dG9Db3VudCArIFwiPC9zdHJvbmc+XCIpXG5cdFx0XHRcdFx0LnJlcGxhY2UoXCJ7cXVlc3Rpb25Db3VudH1cIiwgXCI8c3Ryb25nPlwiICsgcXVlc3Rpb25Db3VudCArIFwiPC9zdHJvbmc+XCIpXG5cdFx0XHRcdFx0LnJlcGxhY2UoXCJ7YXV0b1RvdGFsfVwiLCBcIjxzdHJvbmc+XCIgKyBhdXRvVG90YWwgKyBcIjwvc3Ryb25nPlwiKVxuXHRcdFx0XHRcdC5yZXBsYWNlKFwie2F1dG9NYXJrfVwiLCBcIjxzdHJvbmc+XCIgKyBhdXRvTWFyayArIFwiPC9zdHJvbmc+XCIpXG5cdFx0XHRcdFx0LnJlcGxhY2UoXCJ7YXV0b1RvdGFsfVwiLCBcIjxzdHJvbmc+XCIgKyBhdXRvVG90YWwgKyBcIjwvc3Ryb25nPlwiKVxuXHRcdFx0XHQrIFwiPGJyLz5cIjtcblxuXHRcdFx0XHRvcHRpb24uaW5uZXJIVE1MICs9IElhZ28uaW5zdHJ1Y3Rpb25zW3RoaXMuYXNzZXNzbWVudERhdGEubGFuZ3VhZ2VdLnRvdGFsUXVlc3Rpb25zLnJlcGxhY2UoXCJ7Y291bnR9XCIsIFwiPHN0cm9uZz5cIiArIHRoaXMuc3VtT2YodGhpcy5mZWVkYmFjay5zY29yZXMsIFwiY29ycmVjdFwiKSArIFwiPC9zdHJvbmc+XCIpLnJlcGxhY2UoXCJ7dG90YWx9XCIsIFwiPHN0cm9uZz5cIiArIHRoaXMuZmVlZGJhY2subWFya2FibGVDb3VudCArIFwiPC9zdHJvbmc+XCIpICsgXCI8YnIvPlwiO1xuXHRcdFx0XHRvcHRpb24uaW5uZXJIVE1MICs9IElhZ28uaW5zdHJ1Y3Rpb25zW3RoaXMuYXNzZXNzbWVudERhdGEubGFuZ3VhZ2VdLnRvdGFsU2NvcmUucmVwbGFjZShcIntjb3VudH1cIiwgXCI8c3Ryb25nPlwiICsgdGhpcy5zdW1PZih0aGlzLmZlZWRiYWNrLnNjb3JlcywgXCJzY29yZVwiKSArIFwiPC9zdHJvbmc+XCIpLnJlcGxhY2UoXCJ7dG90YWx9XCIsIFwiPHN0cm9uZz5cIiArIHRoaXMuc3VtT2YodGhpcy5mZWVkYmFjay5zY29yZXMsIFwicG90ZW50aWFsU2NvcmVcIikgKyBcIjwvc3Ryb25nPlwiKSArIFwiPGJyLz5cIjtcblx0XHRcdH1cblxuXHRcdFx0b3B0aW9uLmlubmVySFRNTCArPSBJYWdvLmluc3RydWN0aW9uc1t0aGlzLmFzc2Vzc21lbnREYXRhLmxhbmd1YWdlXS50b3RhbFRpbWUucmVwbGFjZShcIntjb3VudH1cIiwgXCI8c3Ryb25nPlwiICsgdGhpcy50aW1lVG9NaW5TZWModGhpcy5zdW1PZih0aGlzLmZlZWRiYWNrLnNjb3JlcywgXCJ0aW1lXCIpKSArIFwiPC9zdHJvbmc+XCIpICsgXCI8YnIvPlwiO1xuXHRcdH1cblx0XHRlbHNlXG5cdFx0XHRvcHRpb24uaW5uZXJIVE1MICs9IElhZ28uaW5zdHJ1Y3Rpb25zW3RoaXMuYXNzZXNzbWVudERhdGEubGFuZ3VhZ2VdLmZlZWRiYWNrZG9uZTtcblxuXHRcdHRoaXMucGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCIjaWFnby1xdWVzdGlvbi1jb250ZW50XCIpLmFwcGVuZENoaWxkKG9wdGlvbik7XG5cdH07XG5cblx0SWFnby5wcm90b3R5cGUuZXh0cmFjdE1hcmsgPSBmdW5jdGlvbihpbmRleCkge1xuXHRcdGluZGV4ID0gaW5kZXggfHwgdGhpcy5zdGF0ZS5jdXJyZW50UXVlc3Rpb247XG5cblx0XHR2YXIgcXVlc3Rpb24gPSB0aGlzLmFzc2Vzc21lbnREYXRhLnF1ZXN0aW9uRGF0YVtpbmRleF07XG5cdFx0dmFyIHVzZXIgPSB0aGlzLnN0YXRlLnF1ZXN0aW9uc1tpbmRleF07XG5cblx0XHR2YXIgbmV3U2NvcmUgPSB7XG5cdFx0XHRpZDogcXVlc3Rpb24uaWQsXG5cdFx0XHR0eXBlOiBxdWVzdGlvbi50eXBlLFxuXHRcdFx0c2NvcmU6IDAsXG5cdFx0XHRwb3RlbnRpYWxTY29yZTogMCxcblx0XHRcdGNvcnJlY3Q6IGZhbHNlLFxuXHRcdFx0YW5zd2VyczogW10sXG5cdFx0XHR0aW1lOiB1c2VyLnRpbWUucmVkdWNlKGZ1bmN0aW9uKHN1bSwgbnVtKSB7IHJldHVybiBzdW0gKyBudW07IH0sIDApXG5cdFx0fTtcblxuXHRcdGlmIChxdWVzdGlvbi50eXBlID09PSAxKSB7XG5cdFx0XHRuZXdTY29yZS5jb3JyZWN0ID0gdHJ1ZTtcblx0XHRcdHF1ZXN0aW9uLmNvcnJlY3RBbnN3ZXJzLmZvckVhY2goZnVuY3Rpb24oYW5zKSB7XG5cdFx0XHRcdG5ld1Njb3JlLnBvdGVudGlhbFNjb3JlKys7XG5cdFx0XHRcdGlmICh1c2VyLnNlbGVjdGVkQW5zd2Vycy5pbmRleE9mKGFucy5pZCkgPiAtMSlcblx0XHRcdFx0XHRuZXdTY29yZS5zY29yZSsrO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0bmV3U2NvcmUuY29ycmVjdCA9IGZhbHNlO1xuXHRcdFx0fSk7XG5cdFx0XHRuZXdTY29yZS5hbnN3ZXJzID0gdXNlci5zZWxlY3RlZEFuc3dlcnM7XG5cdFx0XHRpZiAodXNlci5zZWxlY3RlZEFuc3dlcnMubGVuZ3RoID4gcXVlc3Rpb24uY29ycmVjdEFuc3dlcnMubGVuZ3RoKSB7XG5cdFx0XHRcdG5ld1Njb3JlLmNvcnJlY3QgPSBmYWxzZTtcblx0XHRcdFx0bmV3U2NvcmUuc2NvcmUgPSBNYXRoLm1heCgwLCBuZXdTY29yZS5zY29yZSAtICh1c2VyLnNlbGVjdGVkQW5zd2Vycy5sZW5ndGggLSBxdWVzdGlvbi5jb3JyZWN0QW5zd2Vycy5sZW5ndGgpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHF1ZXN0aW9uLnR5cGUgPT09IDIpIHtcblx0XHRcdGRlbGV0ZSBuZXdTY29yZS5zY29yZTtcblx0XHRcdG5ld1Njb3JlLnBvdGVudGlhbFNjb3JlID0gcXVlc3Rpb24ucG90ZW50aWFsU2NvcmUgfHwgMTtcblx0XHRcdG5ld1Njb3JlLmFuc3dlcnMucHVzaCh1c2VyLmFuc3dlcik7XG5cdFx0fVxuXHRcdGlmIChxdWVzdGlvbi50eXBlID09PSAzKSB7XG5cdFx0XHRuZXdTY29yZS5jb3JyZWN0ID0gdHJ1ZTtcblx0XHRcdHVzZXIubWF0Y2hlcy5mb3JFYWNoKGZ1bmN0aW9uKG1hdGNoKSB7XG5cdFx0XHRcdG5ld1Njb3JlLnBvdGVudGlhbFNjb3JlKys7XG5cdFx0XHRcdGlmIChtYXRjaC5jb3JyZWN0KVxuXHRcdFx0XHRcdG5ld1Njb3JlLnNjb3JlKys7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRuZXdTY29yZS5jb3JyZWN0ID0gZmFsc2U7XG5cdFx0XHR9KTtcblx0XHRcdG5ld1Njb3JlLmFuc3dlcnMgPSB1c2VyLm1hdGNoZXM7XG5cdFx0fVxuXHRcdGlmIChxdWVzdGlvbi50eXBlID09PSA0KSB7XG5cdFx0XHRuZXdTY29yZS5jb3JyZWN0ID0gdHJ1ZTtcblx0XHRcdHF1ZXN0aW9uLmNvcnJlY3RBbnN3ZXJzLmZvckVhY2goZnVuY3Rpb24oYW5zd2VyLCBpZHgpIHtcblx0XHRcdFx0bmV3U2NvcmUucG90ZW50aWFsU2NvcmUrKztcblx0XHRcdFx0dmFyIHVzZXJBbnN3ZXIgPSB1c2VyLmVudGVyZWRBbnN3ZXJzW2lkeF0gPT09IHVuZGVmaW5lZCA/IFwiXCIgOiB1c2VyLmVudGVyZWRBbnN3ZXJzW2lkeF0udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdGlmIChhbnN3ZXIudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09IHVzZXJBbnN3ZXIpXG5cdFx0XHRcdFx0bmV3U2NvcmUuc2NvcmUrKztcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdG5ld1Njb3JlLmNvcnJlY3QgPSBmYWxzZTtcblx0XHRcdFx0bmV3U2NvcmUuYW5zd2Vycy5wdXNoKHVzZXIuZW50ZXJlZEFuc3dlcnNbaWR4XSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHR0aGlzLmZlZWRiYWNrLnNjb3Jlc1tuZXdTY29yZS5pZF0gPSBuZXdTY29yZTtcblx0fTtcblxuXHRJYWdvLnByb3RvdHlwZS5nZXRNYXhTY29yZSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBpbmRleCwgcG90ZW50aWFsU2NvcmUsIHJldCA9IDA7XG5cblx0XHRpZighdGhpcy5hc3Nlc3NtZW50RGF0YSlcblx0XHRcdHJldHVybiAwO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmFzc2Vzc21lbnREYXRhLnF1ZXN0aW9uRGF0YS5sZW5ndGg7IGkrKykge1xuXHRcdFx0aW5kZXggPSBpO1xuXG5cdFx0XHR2YXIgcXVlc3Rpb24gPSB0aGlzLmFzc2Vzc21lbnREYXRhLnF1ZXN0aW9uRGF0YVtpbmRleF07XG5cblx0XHRcdHBvdGVudGlhbFNjb3JlID0gMDtcblxuXHRcdFx0aWYgKHF1ZXN0aW9uLnR5cGUgPT09IDEpXG5cdFx0XHRcdHBvdGVudGlhbFNjb3JlICs9IChxdWVzdGlvbi5jb3JyZWN0QW5zd2VycyB8fCBbXSkubGVuZ3RoO1xuXG5cdFx0XHRpZiAocXVlc3Rpb24udHlwZSA9PT0gMilcblx0XHRcdFx0cG90ZW50aWFsU2NvcmUgKz0gcXVlc3Rpb24ucG90ZW50aWFsU2NvcmUgfHwgMTtcblxuXHRcdFx0aWYgKHF1ZXN0aW9uLnR5cGUgPT09IDMpXG5cdFx0XHRcdHBvdGVudGlhbFNjb3JlICs9IChxdWVzdGlvbi5sZWZ0IHx8IFtdKS5sZW5ndGg7XG5cblx0XHRcdGlmIChxdWVzdGlvbi50eXBlID09PSA0KVxuXHRcdFx0XHRwb3RlbnRpYWxTY29yZSArPSAocXVlc3Rpb24uY29ycmVjdEFuc3dlcnMgfHwgW10pLmxlbmd0aDtcblxuXHRcdFx0cmV0ICs9IHBvdGVudGlhbFNjb3JlO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXQ7XG5cdH07XG5cblx0SWFnby5wcm90b3R5cGUudHJhbnNpdGlvbiA9IGZ1bmN0aW9uKG5hbWUsIGRhdGEpIHtcblx0XHRpZiAodGhpcy5zdGF0ZS5mZWVkYmFja01vZGUgfHwgdGhpcy5zdGF0ZS5lZGl0TW9kZSlcblx0XHRcdHJldHVybjtcblxuXHRcdGlmICghdGhpcy5hY3Rpdml0eSlcblx0XHRcdHRoaXMuYWN0aXZpdHkgPSBbXTtcblxuLy9cdFx0ZGF0YSA9IGRhdGEgfHwge307XG5cblx0XHR0aGlzLmFjdGl2aXR5LnB1c2goe1xuXHRcdFx0bmFtZTogbmFtZSxcblx0XHRcdGRhdGE6IGRhdGEgfHwge30sXG5cdFx0XHR0aW1lOiBuZXcgRGF0ZSgpLnZhbHVlT2YoKSxcblx0XHR9KTtcblx0fTtcblxuXHRJYWdvLnByb3RvdHlwZS5zdW1PZiA9IGZ1bmN0aW9uKG9iaiwgZmllbGQpIHtcblx0XHR2YXIgdG90YWwgPSAwO1xuXHRcdGZvciAodmFyIGtleSBpbiBvYmopXG5cdFx0XHR0b3RhbCArPSB+fm9ialtrZXldW2ZpZWxkXTtcblx0XHRyZXR1cm4gdG90YWw7XG5cdH07XG5cblx0SWFnby5wcm90b3R5cGUuc2h1ZmZsZSA9IGZ1bmN0aW9uKGFycikge1xuXHRcdGZvciAodmFyIGosIHgsIGkgPSBhcnIubGVuZ3RoOyBpOyBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogaSksIHggPSBhcnJbLS1pXSwgYXJyW2ldID0gYXJyW2pdLCBhcnJbal0gPSB4KTtcblx0XHRyZXR1cm4gYXJyO1xuXHR9O1xuXG5cdElhZ28ucHJvdG90eXBlLnRpbWVUb01pblNlYyA9IGZ1bmN0aW9uKGRhdGUpIHtcblx0XHR2YXIgb3V0cHV0ID0gbmV3IERhdGUoZGF0ZSkudG9JU09TdHJpbmcoKS5zdWJzdHIoMTEsIDgpXG5cdFx0aWYgKG91dHB1dC5zbGljZSgwLCAzKSA9PT0gXCIwMDpcIilcblx0XHRcdG91dHB1dCA9IG91dHB1dC5zbGljZSgzKTtcblx0XHRyZXR1cm4gb3V0cHV0O1xuXHR9O1xuXG5cdElhZ28ucHJvdG90eXBlLmFkZFRhcCA9IGZ1bmN0aW9uKGVsLGV2KSB7XG5cdFx0ZWwuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgZXYsIGZhbHNlKTtcblx0fTtcblxuXHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5cdEFsbCBsYW5ndWFnZSBkYXRhIHN1Y2ggYXMgaW5zdHJ1Y3Rpb25zIGV0YyBpcyBkZWZpbmVkIGJlbG93LlxuXG5cdCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuXHRJYWdvLmFzc2VzbWVudHMgPSB7XG5cdFx0dHlwZTE6IHtcblx0XHRcdG5hbWU6IFwiTXVsdGlwbGUgQ2hvaWNlXCIsXG5cdFx0XHRkZXNjcmlwdGlvbjogXCJDaG9vc2UgdGhlIGNvcnJlY3Qgb3B0aW9uXCIsXG5cdFx0XHRpbnN0cnVjdGlvbnM6IHtcblx0XHRcdFx0QWZyaWthYW5zOiBcIktpZXMgZGllIHJlZ3RlIGFudHdvb3JkIGVuIGRydWsgVm9sZ2VuZGUuXCIsXG5cdFx0XHRcdEVuZ2xpc2g6IFwiQ2hvb3NlIHRoZSBjb3JyZWN0IGFuc3dlci4gVGhlbiBwcmVzcyBOZXh0LlwiLFxuXHRcdFx0XHRYaXRzb25nYTogXCJIbGF3dWxhIG5obGFtdWxvIGxleWkgbmdhIGx1bGFtYS4gS3V0YW5pIHRzaGlrZWxlbGEgbGV5aSBsYW5kemVsYWthLlwiLFxuXHRcdFx0XHRJc2lOZGViZWxlOiBcIktoZXRoYSBpcGVuZHVsbyBlZmFuZWxla28uIE5nZW12YSBrd2Fsb2tobyBnYW5kZWxlbGEgb2t1bGFuZGVsYWtvLlwiLFxuXHRcdFx0XHRJc2lYaG9zYTogXCJLaGV0aGEgaW1wZW5kdWxvIGVjaGFuZWtpbGV5by4gVXplIHVjaW5lemVsZSBlbGFuZGVsYXlvLlwiLFxuXHRcdFx0XHRTZXBlZGk6IFwiS2dldGhhIGthcmFibyB5ZSBlIG5lcGFnZXTFoWVnby4gR28gdGxvZ2EgZmFvIG8ga2dvdGxlIGxhdGVsYWdvLlwiLFxuXHRcdFx0XHRTZXNvdGhvOiBcIktnZXRoYSBrYXJhYm8gZSBuZXBhaGV0c2VuZy4gTyBudG8gaGF0aXNhIGUgbGF0ZWxhbmcuXCIsXG5cdFx0XHRcdFNpc3dhdGk6IFwiS2hldHNhIGltcGhlbmR2dWxvIGxlbmdpeW8uIEJlc2UgdWZhY2F0YSBsb2t1bGFuZHplbGFrby5cIixcblx0XHRcdFx0VHNoaXZlbmRhOiBcIk5hbmdhbmkgcGhpbmR1bG8geW9uZS4gTmkga29uZSB1IHB14bmxZWR6YSB6d2l0ZXZoZWxhaG8uXCIsXG5cdFx0XHRcdFNldHN3YW5hOiBcIlRsaG9waGEga2FyYWJvIGUgZSBuZXBhZ2V0c2VuZy4gTW9yYWdvIGdhIG1vbyB0b2JldHNhIGxhdGVsYW5nLlwiLFxuXHRcdFx0XHRJc2ladWx1OiBcIktoZXRoYSBpbXBlbmR1bG8gZXNoYXlhIGtob25hLiBCZXNlIHVjaW5kZXplbGEgdS1OZXh0LlwiLFxuXG5cdFx0XHR9LFxuXHRcdFx0c3VidHlwZXM6IHtcblx0XHRcdFx0c3VidHlwZTE6IHtcblx0XHRcdFx0ICAgbmFtZTogXCJDaG9vc2UgbW9yZSB0aGFuIG9uZSBjb3JyZWN0IGFuc3dlclwiLFxuXHRcdFx0XHQgICBpbnN0cnVjdGlvbnM6IHtcblx0XHRcdFx0XHQgICBBZnJpa2FhbnM6IFwiS2llcyBkaWUgcmVndGUgYW50d29vcmRlIGVuIGRydWsgVm9sZ2VuZGUuXCIsXG5cdFx0XHRcdFx0ICAgRW5nbGlzaDogXCJDaG9vc2UgdGhlIGNvcnJlY3QgYW5zd2Vycy4gVGhlbiBwcmVzcyBOZXh0LlwiLFxuXHRcdFx0XHRcdCAgIFhpdHNvbmdhOiBcIkhsYXd1bGEgdGluaGxhbXVsbyBsZXRpIG5nYSBsdWxhbWEuIEt1dGFuaSB0c2hpa2VsZWxhIGxleWkgbGFuZHplbGFrYS5cIixcblx0XHRcdFx0XHQgICBJc2lOZGViZWxlOiBcIktoZXRoYSBpaW1wZW5kdWxvIGV6aWZhbmVsZWtvLiBOZ2VtdmEga3dhbG9raG8gZ2FuZGVsZWxhIG9rdWxhbmRlbGFrby5cIixcblx0XHRcdFx0XHQgICBJc2lYaG9zYTogXCJLaGV0aGEgaWltcGVuZHVsbyBlemljaGFuZWtpbGV5by4gVXplIHVjaW5lemVsZSBlbGFuZGVsYXlvLlwiLFxuXHRcdFx0XHRcdCAgIFNlcGVkaTogXCJLZ2V0aGEgZGlrYXJhYm8gdMWhZSBkaSBuZXBhZ2V0xaFlZ28uIEdvIHRsb2dhIGZhbyBvIGtnb3RsZSBsYXRlbGFnby5cIixcblx0XHRcdFx0XHQgICBTZXNvdGhvOiBcIktnZXRoYSBkaWthcmFibyB0c2UgbmVwYWhldHNlbmcuIE8gbnRvIGhhdGlzYSBlIGxhdGVsYW5nLlwiLFxuXHRcdFx0XHRcdCAgIFNpc3dhdGk6IFwiS2hldHNhIHRpbXBoZW5kdnVsbyBsZXRpbmdpdG8uIEJlc2UgdWZhY2F0YSBsb2t1bGFuZHplbGFrby5cIixcblx0XHRcdFx0XHQgICBUc2hpdmVuZGE6IFwiTmFuZ2FuaSBwaGluZHVsbyBkem9uZS4gTmkga29uZSB1IHB14bmxZWR6YSB6d2l0ZXZoZWxhaG8uXCIsXG5cdFx0XHRcdFx0ICAgU2V0c3dhbmE6IFwiVGxob3BoYSBkaWthcmFibyB0c2UgZGkgbmVwYWdldHNlbmcuIE1vcmFnbyBnYSBtb28gdG9iZXRzYSBsYXRlbGFuZy5cIixcblx0XHRcdFx0XHQgICBJc2ladWx1OiBcIktoZXRoYSBpemltcGVuZHVsbyBlemlzaGF5YSBraG9uYS4gQmVzZSB1Y2luZGV6ZWxhIHUtTmV4dC5cIixcblx0XHRcdFx0ICAgfSxcblx0XHRcdCAgIH0sXG5cdFx0XHRcdHN1YnR5cGUyOiB7XG5cdFx0XHRcdFx0bmFtZTogXCJDaG9vc2UgZXhhY3RseSBvbmUgb3B0aW9uXCIsXG5cdFx0XHRcdFx0aW5zdHJ1Y3Rpb25zOiB7XG5cdFx0XHRcdFx0XHRBZnJpa2FhbnM6IFwiS2llcyBkaWUgcmVndGUgYW50d29vcmQgZW4gZHJ1ayBWb2xnZW5kZS5cIixcblx0XHRcdFx0XHRcdEVuZ2xpc2g6IFwiQ2hvb3NlIHRoZSBjb3JyZWN0IGFuc3dlci4gVGhlbiBwcmVzcyBOZXh0LlwiLFxuXHRcdFx0XHRcdFx0WGl0c29uZ2E6IFwiSGxhd3VsYSBuaGxhbXVsbyBsZXlpIG5nYSBsdWxhbWEuIEt1dGFuaSB0c2hpa2VsZWxhIGxleWkgbGFuZHplbGFrYS5cIixcblx0XHRcdFx0XHRcdElzaU5kZWJlbGU6IFwiS2hldGhhIGlwZW5kdWxvIGVmYW5lbGVrby4gTmdlbXZhIGt3YWxva2hvIGdhbmRlbGVsYSBva3VsYW5kZWxha28uXCIsXG5cdFx0XHRcdFx0XHRJc2lYaG9zYTogXCJLaGV0aGEgaW1wZW5kdWxvIGVjaGFuZWtpbGV5by4gVXplIHVjaW5lemVsZSBlbGFuZGVsYXlvLlwiLFxuXHRcdFx0XHRcdFx0U2VwZWRpOiBcIktnZXRoYSBrYXJhYm8geWUgZSBuZXBhZ2V0xaFlZ28uIEdvIHRsb2dhIGZhbyBvIGtnb3RsZSBsYXRlbGFnby5cIixcblx0XHRcdFx0XHRcdFNlc290aG86IFwiS2dldGhhIGthcmFibyBlIG5lcGFoZXRzZW5nLiBPIG50byBoYXRpc2EgZSBsYXRlbGFuZy5cIixcblx0XHRcdFx0XHRcdFNpc3dhdGk6IFwiS2hldHNhIGltcGhlbmR2dWxvIGxlbmdpeW8uIEJlc2UgdWZhY2F0YSBsb2t1bGFuZHplbGFrby5cIixcblx0XHRcdFx0XHRcdFRzaGl2ZW5kYTogXCJOYW5nYW5pIHBoaW5kdWxvIHlvbmUuIE5pIGtvbmUgdSBwdeG5sWVkemEgendpdGV2aGVsYWhvLlwiLFxuXHRcdFx0XHRcdFx0U2V0c3dhbmE6IFwiVGxob3BoYSBrYXJhYm8gZSBlIG5lcGFnZXRzZW5nLiBNb3JhZ28gZ2EgbW9vIHRvYmV0c2EgbGF0ZWxhbmcuXCIsXG5cdFx0XHRcdFx0XHRJc2ladWx1OiBcIktoZXRoYSBpbXBlbmR1bG8gZXNoYXlhIGtob25hLiBCZXNlIHVjaW5kZXplbGEgdS1OZXh0LlwiLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHN1YnR5cGUzOiB7XG5cdFx0XHRcdFx0bmFtZTogXCJUcnVlIGZhbHNlXCIsXG5cdFx0XHRcdFx0aW5zdHJ1Y3Rpb25zOiB7XG5cdFx0XHRcdFx0XHRBZnJpa2FhbnM6IFwiS2llcyBkaWUgcmVndGUgYW50d29vcmQgZW4gZHJ1ayBWb2xnZW5kZS5cIixcblx0XHRcdFx0XHRcdEVuZ2xpc2g6IFwiQ2hvb3NlIHRoZSBjb3JyZWN0IGFuc3dlci4gVGhlbiBwcmVzcyBOZXh0LlwiLFxuXHRcdFx0XHRcdFx0WGl0c29uZ2E6IFwiSGxhd3VsYSBuaGxhbXVsbyBsZXlpIG5nYSBsdWxhbWEuIEt1dGFuaSB0c2hpa2VsZWxhIGxleWkgbGFuZHplbGFrYS5cIixcblx0XHRcdFx0XHRcdElzaU5kZWJlbGU6IFwiS2hldGhhIGlwZW5kdWxvIGVmYW5lbGVrby4gTmdlbXZhIGt3YWxva2hvIGdhbmRlbGVsYSBva3VsYW5kZWxha28uXCIsXG5cdFx0XHRcdFx0XHRJc2lYaG9zYTogXCJLaGV0aGEgaW1wZW5kdWxvIGVjaGFuZWtpbGV5by4gVXplIHVjaW5lemVsZSBlbGFuZGVsYXlvLlwiLFxuXHRcdFx0XHRcdFx0U2VwZWRpOiBcIktnZXRoYSBrYXJhYm8geWUgZSBuZXBhZ2V0xaFlZ28uIEdvIHRsb2dhIGZhbyBvIGtnb3RsZSBsYXRlbGFnby5cIixcblx0XHRcdFx0XHRcdFNlc290aG86IFwiS2dldGhhIGthcmFibyBlIG5lcGFoZXRzZW5nLiBPIG50byBoYXRpc2EgZSBsYXRlbGFuZy5cIixcblx0XHRcdFx0XHRcdFNpc3dhdGk6IFwiS2hldHNhIGltcGhlbmR2dWxvIGxlbmdpeW8uIEJlc2UgdWZhY2F0YSBsb2t1bGFuZHplbGFrby5cIixcblx0XHRcdFx0XHRcdFRzaGl2ZW5kYTogXCJOYW5nYW5pIHBoaW5kdWxvIHlvbmUuIE5pIGtvbmUgdSBwdeG5sWVkemEgendpdGV2aGVsYWhvLlwiLFxuXHRcdFx0XHRcdFx0U2V0c3dhbmE6IFwiVGxob3BoYSBrYXJhYm8gZSBlIG5lcGFnZXRzZW5nLiBNb3JhZ28gZ2EgbW9vIHRvYmV0c2EgbGF0ZWxhbmcuXCIsXG5cdFx0XHRcdFx0XHRJc2ladWx1OiBcIktoZXRoYSBpbXBlbmR1bG8gZXNoYXlhIGtob25hLiBCZXNlIHVjaW5kZXplbGEgdS1OZXh0LlwiLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdH0sXG5cdFx0dHlwZTI6IHtcblx0XHRcdG5hbWU6IFwiUGFyYWdyYXBoIFJlc3BvbnNlXCIsXG5cdFx0XHRkZXNjcmlwdGlvbjogXCJQYXJhZ3JhcGggcmVzcG9uc2Ugb25seSwgbm8gbWFya3Mgd2lsbCBiZSBnaXZlbi5cIixcblx0XHRcdGluc3RydWN0aW9uczoge1xuXHRcdFx0XHRBZnJpa2FhbnM6IFwiVGlrIGpvdSBhbnR3b29yZCBpbiBkaWUgb29wIHNwYXNpZSBlbiBkcnVrIFZvbGdlbmRlLlwiLFxuXHRcdFx0XHRFbmdsaXNoOiBcIlR5cGUgdGhlIGFuc3dlciBpbiB0aGUgc3BhY2UgYmVsb3cuIFRoZW4gcHJlc3MgTmV4dC5cIixcblx0XHRcdFx0WGl0c29uZ2E6IFwiVGhheWlwYSBuaGxhbXVsbyBla2EgeGl2YW5kbGEgbGV4aSBuZ2EgaGF2YSBuY2h1bXUgbGV4aSBuZ2EgbGFoYSBoYW5zaS4gS3V0YW5pIHRzaGlrZWxlbGEgbGV5aSBsYW5kemVsYWthLlwiLFxuXHRcdFx0XHRJc2lOZGViZWxlOiBcIkdhZGFuZ2lzYSBuYW55YW5hIHRoYXlpYmhhIGlwZW5kdWxvIGVzaWtoYWxlbmkgZXNpbmdlbnphc2kuIE5nZW12YSBrd2Fsb2tobyBnYW5kZWxlbGEgb2t1bGFuZGVsYWtvLlwiLFxuXHRcdFx0XHRJc2lYaG9zYTogXCJDaHdldGhlemEgaW1wZW5kdWxvIGt3aXNpdGh1YmEgZXNpbmdlemFudHNpLiBVemUgdWNpbmV6ZWxlIGVsYW5kZWxheW8uXCIsXG5cdFx0XHRcdFNlcGVkaTogXCJUbGFueWEga2FyYWJvIGthIHNla2dvYmVuZyBzYSBrYSBtbyBmYXNlLiBHbyB0bG9nYSBmYW8gbyBrZ290bGUgbGF0ZWxhZ28uXCIsXG5cdFx0XHRcdFNlc290aG86IFwiVGhhZXBhIGthcmFibyBzZWJha2VuZyBzZSBrYSB0bGFzZS4gTyBudG8gaGF0aXNhIGUgbGF0ZWxhbmcuXCIsXG5cdFx0XHRcdFNpc3dhdGk6IFwiQmhhbGEgaW1wZW5kdnVsbyBrdWxlc2lraGFsYSBsZXNpbmdhcGhhc2kuIEJlc2UgdWZhY2F0YSBsb2t1bGFuZHplbGFrby5cIixcblx0XHRcdFx0VHNoaXZlbmRhOiBcIlRoYWlwaGVsYW5pIHBoaW5kdWxvIGtoYSB0c2hpa2hhbGEgdHNoaSByZSBuZ2EgZmhhc2kuIE5pIGtvbmUgdSBwdeG5sWVkemEgendpdGV2aGVsYWhvLlwiLFxuXHRcdFx0XHRTZXRzd2FuYTogXCJUbGFueWEga2FyYWJvIG1vIHNlYmFrZW5nIHNlIHNlIGZhIHRsYXNlLiBNb3JhZ28gZ2EgbW9vIHRvYmV0c2EgbGF0ZWxhbmcuXCIsXG5cdFx0XHRcdElzaVp1bHU6IFwiQmhhbGEgaW1wZW5kdWxvIGt3aW5kYXdvIGVuZ2V6YW5zaS4gQmVzZSB1Y2luZGV6ZWxhIHUtTmV4dC5cIixcblx0XHRcdH0sXG5cdFx0XHRzdWJ0eXBlczoge1xuXHRcdFx0fSxcblx0XHR9LFxuXHRcdHR5cGUzOiB7XG5cdFx0XHRuYW1lOiBcIk1hdGNoIHRoZSBvcHRpb25zXCIsXG5cdFx0XHRkZXNjcmlwdGlvbjogXCJcIixcblx0XHRcdGluc3RydWN0aW9uczoge1xuXHRcdFx0XHRBZnJpa2FhbnM6IFwiS2llcyAmIzE4MDtuIG9wc2llIGluIGVlbiBrb2xvbSBlbiBwYXMgZGl0IGJ5IGRpZSBvb3JlZW5zdGVtbWVuZGUgb3BzaWUgaW4gZGllIGFuZGVyIGtvbG9tLiBPb3JlZW5zdGVtbWVuZGUgb3BzaWVzIHNhbCBkaWVzZWxmZGUga2xldXIgd2Vlcy4gT3BzaWVzIGthbiB2ZXJhbmRlciB3b3JkIGRldXIgd2VlciBvcCBkaWUgZ2Vrb3NlIGJsb2traWUgdGUgZHJ1ay4gRHJ1ayBWb2xnZW5kZSB3YW5uZWVyIGp5IGtsYWFyIGlzLiBcIixcblx0XHRcdFx0RW5nbGlzaDogXCJDaG9vc2Ugb25lIG9wdGlvbiBvbiB0aGUgbGVmdCwgYW5kIG1hdGNoIGl0IHRvIGl0cyBjb3JyZXNwb25kaW5nIG9wdGlvbiBvbiB0aGUgcmlnaHQuIE1hdGNoaW5nIG9wdGlvbnMgd2lsbCBoYXZlIHRoZSBzYW1lIGNvbG91ci4gVG8gdW5kbyBhIG1hdGNoLCBqdXN0IHByZXNzIG9uIHRoZSBvcHRpb25zIGFnYWluLiAgT25jZSBkb25lLCBwcmVzcyBOZXh0LlwiLFxuXHRcdFx0XHRYaXRzb25nYTogXCJIbGF3dWxhIHhpaGxhd3VyaXdhIGxleGkgbmdhIGV4aW1hdHNpbmksIGt1dGFuaSB1IHhpIGZhbmFuaXNhIG5hIHhpaGxhd3VyaXdhIGxleGkgZmFtYmVsYW5ha2EgbmEgeG9uYSBsZXhpIG5nYSBleGluZW5lbmkuIFN3aWhsYXd1cml3YSBzd28gZmFuYW5hIHN3aSB0YSB2YSBuYSBtdWhsb3ZvIHdvIGZhbmEuIEt1IHRsaGVyaXNlbGEgZW5kemhha3Uga3UgZmFuYW5hIGxva3UsIHRzaGlrZWxlbGEgbnRzZW5hIHN3aWhsYXd1cml3YSBuYWthbWJlLiBMb2tvIHUgaGV0aWxlLCB0c2hpa2VsZWxhIGxleWkgbGFuZHplbGFrYS5cIixcblx0XHRcdFx0SXNpTmRlYmVsZTogXCJLaGV0aGEgaWtoZXRobyBlbGlsb2R3YSBuZ2VzaW5jZWxlbmksIGJlc2UgdWxpbWFkYW5pc2EgbmVraGV0aG8gZWxpa2hhbWJlbGFuYSBuYWxvIG5nZXNpZGxlbmkuIEFtYWtoZXRobyBhbWFkYW5ha28gYXpha3ViYSBub21iYWxhIG9mYW5ha28uIFVrdXN1c2EgdWt1bWFkYW5va2hvLCAgZ2FuZGVsZWxhIGFtYWtoZXRobyBnb2R1LiBOYXNlbGUgdXFlZGlsZSwgZ2FuZGVsZWxhIG9rdWxhbmRlbGFrby5cIixcblx0XHRcdFx0SXNpWGhvc2E6IFwiQ2hvbmdhIHVraGV0aG8gb2x1bnllIGVraG9obG8sIHV6ZSB1bHVsaW5nYW5pc2Ugbm9raGV0aG8gb2x1aGFtYmVsYW5hIG5hbG8gZWt1bmVuZS4gQW1ha2hldGhvIGFmYW5heW8gYXlhIGt1YmEgbm9tYmFsYSBvZmFuYXlvLiBVa3VwaGVsaXNhIHVrdWxpbmdhbmEsIGNpbmV6ZWxhIG5qZSBhbWFraGV0aG8ga3dha2hvbmEuICBXYWt1YmEgd2VuemlsZSwgY2luZXplbGEgRWxhbmRlbGF5by5cIixcblx0XHRcdFx0U2VwZWRpOiBcIktnZXRoYSBrZ2V0aG8gZSB0ZWUga2EgbGVobGFrb3JlbmcgbGEgbm5nZWxlLCBnb21tZSBvIGUgbnlhbGFudMWhaGUgbGUga2dldGhvIHllIGUgc2VwZWxlbGFuYWdvIGxlIHlvbmEga2EgbGVobGFrb3JlbmcgbGEgZ29qYS4gRGlrZ2V0aG8gdMWhZSBkaSBzZXBlbGVsYW5hZ28gZGkgdGxhIGJhIGxlIG1tYWxhIHdhIGdvIHN3YW5hLiBHbyBkaXJvbGxhIGdvIHNlcGVsZWxhbmEgZmFvLCBvIG5vIGtnb3RsYSBmZWxhIGdvIGRpa2dldGhvIGdhcGUuIEdlIG8gZmVkaXTFoWUsIGtnb3RsYSBsYXRlbGFnby5cIixcblx0XHRcdFx0U2Vzb3RobzogXCJIbHdheWEga2dldGhvIGUgbGUgbm5nd2UgaG8gbGUgbGV0c2hlaGFkaSwgbW1lIG8gZSBueWFsYW55ZSBsZSBrZ2V0aG8gZSB0c2FtYWVsYW5hbmcgbGUgeW9uYSBobyBsZSBsZXRvbmEuIERpa2dldGhvIHRzZSBueWFsYW5hbmcgZGkgdGxhIGJhIGxlIG1tYWxhIG8gdHNod2FuYW5nLiBIbyBldHNvbGxhIG55YWxhbm8sIGhhdGlzYSBmZWVsYSBkaWtnZXRobyBoYXBlLiAgSGFuZyBoYSBvIHFldGlsZSwgaGF0aXNhIGUgTGF0ZWxhbmcuXCIsXG5cdFx0XHRcdFNpc3dhdGk6IFwiS2hldHNhIGt1bnllIGxva3VuZ2FzZW5jZWxlLCBiZXNlIHVrdWNvbmR6YW5pc2EgbmFsb2tvIGxva3V2dW1lbGFuYSBuYWtvIG5nYXNla3VkbGEuIExva3Vjb25kemFuYWtvIGt1dGF3dWJhIG5lbWJhbGEgbG9mYW5hbmFrby4gS3V0ZSB3ZW50ZSBsb2t1a3Vjb25kemVuZSBrdW5nYXNhY29uZHphbmksIGZhY2F0YSBmdXRzaSBrdWxva3UgbG9rdWtoZXRzaWxlLiBOYXNld3VjZWR6aWxlLCBmYWNhdGEgbG9rdWxhbmR6ZWxha28uXCIsXG5cdFx0XHRcdFRzaGl2ZW5kYTogXCJOYW5nYW5pIHRzaGl0aGloaSBraGEgbW9uZGUsIG5pIHRzaGkgdmhhbWJlZHplIG5hIHRzaGUgbmEgbmFuZ2EgdHNoaW5lIHRzaGEgZWxhbmEgbmF0c2hvIGtoYSB0c2hhdeG4vWEuIFUgdmhhbWJlZHphIHp3ZSB6d2EgbmFuZ3dhIGh1IOG4k28gdmhhIG5hIG11dmhhbGEgdSBmYW5haG8uIFUga2hhbnRzZWxhIHUgdmhhbWJlZHphIGhvIGl0d2Fobywgbmkgc29rb3UgcHXhubFlZHphIGhhZmh1IGh1bmUgbmEgdGVhIHUgbmFuZ2EgaG9uZS4gIE11c2kgbm8gbm8gZmhlZHphLCBuaSBwdeG5sWVkemEgendpdGV2aGVsYWhvLlwiLFxuXHRcdFx0XHRTZXRzd2FuYTogXCJUbGhvcGhhIHNlaXRsaG9waGVsd2Egc2UgbGUgc2VuZ3dlIGthIGZhIG1vbGVtZW5nLCBvIGJvIG8gc2UgbnlhbGFueWEgbGUgdGxob3BobyBlIGUgdHNod2FuYW5nIGxlIHNvbmUga2EgZmEgbW9qZW5nLiBEaWl0bGhvcGhlbHdhIHRzZSBkaSB0c2h3YW5hbmcgZGkgdGxhIG5uYSBsZSBtbWFsYSBvIG8gdHNod2FuYW5nLiBHbyBkaSBueWFsb2xvbGEsIHRvYmV0c2EgZGlpdGxob3BoZWx3YSBnYXBlLiBNb3JhZ28gZ2EgbW9vLCB0b2JldHNhICBMYXRlbGFuZy5cIixcblx0XHRcdFx0SXNpWnVsdTogXCJLaGV0aGEgb2t1a29kd2Ega3Vsb2tobyBva3VuZ2Frd2Vzb2t1bnhlbGUsIGJlc2UgdWt1bWF0YW5pc2EgbmFsb2tobyBva3VuZ2Frd2Vzb2t1ZGxhLiBJemludG8gZXppZmFuYXlvIHppeW9iYSBub21iYWxhIG93b2R3YS4gVW1hIHVmdW5hIHVrdXBoaW5kYSB1cWFsZSBwaGFuc2kgdmVsZSB1Y2luZGV6ZWxlIGxhcGhvIGt1a2hldGh3YSBraG9uYSBmdXRoaS4gVW1hIHVzdWt3ZW56aWxlIGxva2hvLCBjaW5kZXplbGEgdS1OZXh0LlwiXG5cdFx0XHR9LFxuXHRcdFx0c3VidHlwZXM6IHtcblx0XHRcdH0sXG5cdFx0fSxcblx0XHR0eXBlNDoge1xuXHRcdFx0bmFtZTogXCJGaWxsIGluIHRoZSBibGFua3NcIixcblx0XHRcdGRlc2NyaXB0aW9uOiBcIlwiLFxuXHRcdFx0aW5zdHJ1Y3Rpb25zOiB7XG5cdFx0XHRcdEFmcmlrYWFuczogXCJUaWsgZGllIG9udGJyZWtlbmRlIHRlcm1lIGluIGVuIGRydWsgVm9sZ2VuZGUuXCIsXG5cdFx0XHRcdEVuZ2xpc2g6IFwiVHlwZSB0aGUgYW5zd2VyIGluIHRoZSBibGFuayBzcGFjZS9zIGJlbG93LiBUaGVuIHByZXNzIE5leHRcIixcblx0XHRcdFx0WGl0c29uZ2E6IFwiVGhheWlwYSBuaGxhbXVsbyBla2EgeGl2YW5kbGEgbGV4aSBuZ2EgaGF2YSBuY2h1bXUgbGV4aSBuZ2EgbGFoYSBoYW5zaS4gS3V0YW5pIHRzaGlrZWxlbGEgbGV5aSBsYW5kemVsYWthLlwiLFxuXHRcdFx0XHRJc2lOZGViZWxlOiBcIkdhZGFuZ2lzYSBuYW55YW5hIHRoYXlpYmhhIGlwZW5kdWxvIGVzaWtoYWxlbmkgbmFueWFuYSBlZW5raGFsZW5pIGV6aW5nYW5hbGl0aG8gbmdlbnphc2kuIE5nZW12YSBrd2Fsb2tobyBnYW5kZWxlbGEgb2t1bGFuZGVsYWtvLlwiLFxuXHRcdFx0XHRJc2lYaG9zYTogXCJDaHdldGhlemEgaW1wZW5kdWxvIGt3aXNpKHppKWtoZXd1IGVzaSh6aSluZ2VuYW50byBuZ2V6YW50c2kuIFV6ZSB1Y2luZXplbGUgZWxhbmRlbGF5by5cIixcblx0XHRcdFx0U2VwZWRpOiBcIlRsYW55YSBrYXJhYm8ga2Egc2VrZ29iZW5nL2Rpa2dvYmVuZyB0xaFlIGRpIHNlIG5hZ28gc2VsbyBrYSBtbyBmYXNlLiBHbyB0bG9nYSBmYW8gbyBrZ290bGUgbGF0ZWxhZ28uXCIsXG5cdFx0XHRcdFNlc290aG86IFwiVGhhZXBhIGthcmFibyBzZWJha2VuZyBzZSBzZWtnZW8gKGRpa2dlbykga2EgdGxhc2UuIE8gbnRvIGhhdGlzYSBlIGxhdGVsYW5nLlwiLFxuXHRcdFx0XHRTaXN3YXRpOiBcIkJoYWxhIGltcGhlbmR2dWxvIGVzaSh0aSlraGFsZW5pIGxlc2kodGkpbmdhcGhhc2kgbGVzaSh0aSl0ZSBsdXRmby4gQmVzZSB1ZmFjYXRhIGxva3VsYW5kemVsYWtvLlwiLFxuXHRcdFx0XHRUc2hpdmVuZGE6IFwiVGhhaXBoZWxhbmkgcGhpbmR1bG8ga2hhICh6d2kpdHNoaWtoYWxhICh6d2kpIHRzaGkgc2luYSB0c2hpdGh1Lyh6d2kpIHRzaGkgcmUgbmdhIGZoYXNpLiBOaSBrb25lIHUgcHXhubFlZHphIHp3aXRldmhlbGFoby5cIixcblx0XHRcdFx0U2V0c3dhbmE6IFwiVGxhbnlhIGthcmFibyBtbyBkaS9zZWJha2VuZyBzZSBzZSBzZW5hbmcgc2VwZSBmYSB0bGFzZS4gTW9yYWdvIGdhIG1vbyB0b2JldHNhIGxhdGVsYW5nLlwiLFxuXHRcdFx0XHRJc2ladWx1OiBcIkJoYWxhIGltcGVuZHVsbyBrd2luZGF3byBlbmdlemFuc2kgZW5nYWJoYWx3ZSBsdXRoby4gQmVzZSB1Y2luZGV6ZWxhIHUtTmV4dC5cIlxuXHRcdFx0fSxcblx0XHRcdHN1YnR5cGVzOiB7fSxcblx0XHR9LFxuXHR9O1xuXG5cdElhZ28uaW5zdHJ1Y3Rpb25zID0ge1xuXHRcdEFmcmlrYWFuczoge1xuXHRcdFx0ZW5kU2NyZWVuOiBcIkp5IGhldCBhbCBkaWUgdnJhZSB2b2x0b29pIGVuIGpvdSB1aXRzbGFnIGlzIGluZ2VkaWVuLlwiLFxuXHRcdFx0cmVzdGFydDogXCJQcm9iZWVyIHdlZXJcIixcblx0XHRcdHN0YXJ0OiBcIlN0YXJ0XCIsXG5cdFx0XHRsYW5kaW5nUGFnZUhlYWRpbmc6IFwiQXNzZXNzbWVudCAvIFN1cnZleVwiLFxuXHRcdFx0bGFuZGluZ1BhZ2VIZWxwOiBcIllvdSBhcmUgYWJvdXQgdG8gYmVnaW4gdGhlIGFzc2Vzc21lbnQuIENsaWNrIHRoZSBcXFwiU3RhcnRcXFwiIGJ1dHRvbiBiZWxvdyB0byBjb250aW51ZS5cIixcblx0XHRcdGNvbXBsZXRlOiBcIlZvbHRvb2lcIixcblx0XHRcdG5leHQ6IFwiVm9sZ2VuZGVcIixcblx0XHRcdHByZXZpb3VzOiBcIlZvcmlnZVwiLFxuXHRcdFx0ZmVlZGJhY2s6IFwie2NvdW50fSB1aXQge3RvdGFsfVwiLFxuXHRcdFx0dG90YWxRdWVzdGlvbnM6IFwiSnkgaGV0IHZvbHB1bnRlIHZpciB7Y291bnR9IHVpdCB7dG90YWx9IHZyYWUgYmVoYWFsLlwiLFxuXHRcdFx0dG90YWxUaW1lOiBcIkRpdCBoZXQgam91IHtjb3VudH0gZ2VuZWVtIG9tIGRpZSBldmFsdWVyaW5nIHRlIHZvbHRvb2kuXCIsXG5cdFx0XHR0b3RhbFNjb3JlOiBcIkpvdSB0b3RhbGUgcHVudCBpcyB7Y291bnR9IHVpdCB7dG90YWx9XCIsXG5cdFx0XHRhdmVyYWdlVGltZTogXCJKb3UgZ2VtaWRkZWxkZSB0eWQgcGVyIHZyYWFnIGlzIHthdmVyYWdlfS5cIixcblx0XHRcdGF1dG9tYXRpY01hcms6IFwie3FBdXRvQ291bnR9IChvdXQgb2Yge3F1ZXN0aW9uQ291bnR9KSBxdWVzdGlvbnMsIGZvciBhIHRvdGFsIG9mIHthdXRvVG90YWx9IG1hcmtzLCB3ZXJlIG1hcmtlZCBhdXRvbWF0aWNhbGx5LiBZb3Ugc2NvcmVkIHthdXRvTWFya30gb3V0IG9mIHthdXRvVG90YWx9LlwiLFxuXHRcdFx0dGVhY2hlclRvTWFyazogXCJKeSBoZXQge2NvdW50fSB2cmFlIHZpciBtZXJrIGluZ2VkaWVuLlwiLFxuXHRcdFx0c2hvd0ZlZWRiYWNrOiBcIld5cyB0ZXJ1Z3ZvZXJcIixcblx0XHRcdHRlYWNoZXJGZWVkYmFjazogXCI8c3Ryb25nPlRlcnVndm9lcjo8L3N0cm9uZz5cIixcblx0XHRcdGZlZWRiYWNrZG9uZTogXCJKeSBoZXQgZGV1ciBkaWUgdGVydWd2b2VyIHZpciBhbGxlIHZyYWUgZ2V3ZXJrLlwiLFxuXHRcdFx0bm90ZWFjaGVyRmVlZGJhY2s6IFwiR2VlbiB0ZXJ1Z3ZvZXIgaXMgdmVyc2thZiBuaWUuXCIsXG5cdFx0XHR0cnVlOiBcIldhYXJcIixcblx0XHRcdGZhbHNlOiBcIk9ud2FhclwiLFxuXHRcdFx0eWVzOiBcIkphXCIsXG5cdFx0XHRubzogXCJOZWVcIixcblx0XHRcdGJlZm9yZTogXCJWb29yXCIsXG5cdFx0XHRhZnRlcjogXCJOYVwiLFxuXHRcdFx0bW9yZTogXCJNZWVyXCIsXG5cdFx0XHRsZXNzOiBcIk1pbmRlclwiLFxuXHRcdH0sXG5cdFx0RW5nbGlzaDoge1xuXHRcdFx0ZW5kU2NyZWVuOiBcIllvdSBoYXZlIGNvbXBsZXRlZCBhbGwgdGhlIHF1ZXN0aW9ucyBhbmQgeW91ciByZXN1bHRzIGhhdmUgYmVlbiBzdWJtaXR0ZWQuXCIsXG5cdFx0XHRyZXN0YXJ0OiBcIlRyeSBhZ2FpblwiLFxuXHRcdFx0c3RhcnQ6IFwiU3RhcnRcIixcblx0XHRcdGxhbmRpbmdQYWdlSGVhZGluZzogXCJBc3Nlc3NtZW50IC8gU3VydmV5XCIsXG5cdFx0XHRsYW5kaW5nUGFnZUhlbHA6IFwiWW91IGFyZSBhYm91dCB0byBiZWdpbiB0aGUgYXNzZXNzbWVudC4gQ2xpY2sgdGhlIFxcXCJTdGFydFxcXCIgYnV0dG9uIGJlbG93IHRvIGNvbnRpbnVlLlwiLFxuXHRcdFx0Y29tcGxldGU6IFwiQ29tcGxldGVcIixcblx0XHRcdG5leHQ6IFwiTmV4dFwiLFxuXHRcdFx0cHJldmlvdXM6IFwiUHJldmlvdXNcIixcblx0XHRcdGZlZWRiYWNrOiBcIntjb3VudH0gb2Yge3RvdGFsfVwiLFxuXHRcdFx0dG90YWxRdWVzdGlvbnM6IFwiWW91IGdvdCBmdWxsIG1hcmtzIGZvciB7Y291bnR9IG91dCBvZiB7dG90YWx9IHF1ZXN0aW9ucy5cIixcblx0XHRcdHRvdGFsVGltZTogXCJJdCB0b29rIHlvdSB7Y291bnR9IHRvIGNvbXBsZXRlIHRoZSBhc3Nlc3NtZW50LlwiLFxuXHRcdFx0dG90YWxTY29yZTogXCJZb3VyIHRvdGFsIHNjb3JlIGlzIHtjb3VudH0gb3V0IG9mIHt0b3RhbH0uXCIsXG5cdFx0XHRhdmVyYWdlVGltZTogXCJZb3VyIGF2ZXJhZ2UgdGltZSBwZXIgcXVlc3Rpb24ge2F2ZXJhZ2V9LlwiLFxuXHRcdFx0dGVhY2hlclRvTWFyazogXCJ7cU1hbnVhbENvdW50fSAob3V0IG9mIHtxdWVzdGlvbkNvdW50fSkgcXVlc3Rpb25zLCBmb3IgYSB0b3RhbCBvZiB7bWFudWFsVG90YWx9IG1hcmtzLCB3ZXJlIHN1Ym1pdHRlZCBmb3IgbWFudWFsIG1hcmtpbmcuXCIsXG5cdFx0XHRhdXRvbWF0aWNNYXJrOiBcIntxQXV0b0NvdW50fSAob3V0IG9mIHtxdWVzdGlvbkNvdW50fSkgcXVlc3Rpb25zLCBmb3IgYSB0b3RhbCBvZiB7YXV0b1RvdGFsfSBtYXJrcywgd2VyZSBtYXJrZWQgYXV0b21hdGljYWxseS4gWW91IHNjb3JlZCB7YXV0b01hcmt9IG91dCBvZiB7YXV0b1RvdGFsfS5cIixcblx0XHRcdHNob3dGZWVkYmFjazogXCJTaG93IGZlZWRiYWNrXCIsXG5cdFx0XHR0ZWFjaGVyRmVlZGJhY2s6IFwiPHN0cm9uZz5GZWVkYmFjazo8L3N0cm9uZz5cIixcblx0XHRcdGZlZWRiYWNrZG9uZTogXCJZb3UgaGF2ZSB3b3JrZWQgdGhyb3VnaCB0aGUgZmVlZGJhY2sgb2YgYWxsIHF1ZXN0aW9ucy5cIixcblx0XHRcdG5vdGVhY2hlckZlZWRiYWNrOiBcIk5vIGZlZWRiYWNrIHdhcyBwcm92aWRlZC5cIixcblx0XHRcdHRydWU6IFwiVHJ1ZVwiLFxuXHRcdFx0ZmFsc2U6IFwiRmFsc2VcIixcblx0XHRcdHllczogXCJZZXNcIixcblx0XHRcdG5vOiBcIk5vXCIsXG5cdFx0XHRiZWZvcmU6IFwiQmVmb3JlXCIsXG5cdFx0XHRhZnRlcjogXCJBZnRlclwiLFxuXHRcdFx0bW9yZTogXCJNb3JlXCIsXG5cdFx0XHRsZXNzOiBcIkxlc3NcIixcblx0XHR9LFxuXHRcdFhpdHNvbmdhOiB7XG5cdFx0XHRlbmRTY3JlZW46IFwiVSBoZXRpbGUgc3dpdnV0aXNvIGhpbmt3YXN3byBuYXN3b25hIG1pdnV5ZWxvIHlhIHdlbmEgeWkgdGlzaXdpbGUuXCIsXG5cdFx0XHRyZXN0YXJ0OiBcIlJpbmdldGEgbmFrYW1iZVwiLFxuXHRcdFx0c3RhcnQ6IFwiU3RhcnRcIixcblx0XHRcdGxhbmRpbmdQYWdlSGVhZGluZzogXCJBc3Nlc3NtZW50IC8gU3VydmV5XCIsXG5cdFx0XHRsYW5kaW5nUGFnZUhlbHA6IFwiWW91IGFyZSBhYm91dCB0byBiZWdpbiB0aGUgYXNzZXNzbWVudC4gQ2xpY2sgdGhlIFxcXCJTdGFydFxcXCIgYnV0dG9uIGJlbG93IHRvIGNvbnRpbnVlLlwiLFxuXHRcdFx0Y29tcGxldGU6IFwiSGV0aXNhXCIsXG5cdFx0XHRuZXh0OiBcIkxleGkgbGFuZHplbGFrYVwiLFxuXHRcdFx0cHJldmlvdXM6IFwiTGV4aSBuZ2EgaHVuZHphXCIsXG5cdFx0XHRmZWVkYmFjazogXCJ7Y291bnR9IHdhIHt0b3RhbH1cIixcblx0XHRcdHRvdGFsUXVlc3Rpb25zOiBcIlUga3VtaWxlIHRpbWFyYWthIGhpIHZ1dGFsbyB0YSBzd2l2dXRpc28gc3dhIHtjb3VudH0gZWhlbmhsYSBrYSB7dG90YWx9XCIsXG5cdFx0XHR0b3RhbFRpbWU6IFwiU3dpIGt1IHRla2VsZSB7Y291bnR9IGt1IGhldGlzYSBuaGxhaGx1dm8uXCIsXG5cdFx0XHR0b3RhbFNjb3JlOiBcIlhpa29ybyB4YSB3ZW5hIGhpbmt3YXhvIGkge2NvdW50fSBlaGVuaGxhIGthIHt0b3RhbH0uXCIsXG5cdFx0XHRhdmVyYWdlVGltZTogXCJOa2FyaGkgd2Egd2VuYSB3YSBuaGxheW94aWthcmhpIGhpIHhpdnV0aXNvIHthdmVyYWdlfS5cIixcblx0XHRcdGF1dG9tYXRpY01hcms6IFwie3FBdXRvQ291bnR9IChvdXQgb2Yge3F1ZXN0aW9uQ291bnR9KSBxdWVzdGlvbnMsIGZvciBhIHRvdGFsIG9mIHthdXRvVG90YWx9IG1hcmtzLCB3ZXJlIG1hcmtlZCBhdXRvbWF0aWNhbGx5LiBZb3Ugc2NvcmVkIHthdXRvTWFya30gb3V0IG9mIHthdXRvVG90YWx9LlwiLFxuXHRcdFx0dGVhY2hlclRvTWFyazogXCJVIHRpc2lsZSBzd2l2dXRpc28gc3dhIHtjb3VudH0ga3UgdGEgbWFraXdhLlwiLFxuXHRcdFx0c2hvd0ZlZWRiYWNrOiBcIktvbWJhIG1iaWtvXCIsXG5cdFx0XHR0ZWFjaGVyRmVlZGJhY2s6IFwiPHN0cm9uZz5NYmlrbzo8L3N0cm9uZz5cIixcblx0XHRcdGZlZWRiYWNrZG9uZTogXCJVIHRpcmhhbmlsZSBuYSBtYmlrbyB3YSBzd2l2dXRpc28gaGlua3dhc3dvLlwiLFxuXHRcdFx0bm90ZWFjaGVyRmVlZGJhY2s6IFwiS3UgaGF2YSBtYmlrbyBsb3d1IG55aWtpd2VrZS5cIixcblx0XHRcdHRydWU6IFwiSGkgc3dvbmFcIixcblx0XHRcdGZhbHNlOiBcIkEgaGkgc3dvbmFcIixcblx0XHRcdHllczogXCJJbmFcIixcblx0XHRcdG5vOiBcIkUtZVwiLFxuXHRcdFx0YmVmb3JlOiBcIkVrdXN1bmd1bGVuaSBrYSBzd29uYVwiLFxuXHRcdFx0YWZ0ZXI6IFwiRW5kemhha3Uga2Egc3dvbmFcIixcblx0XHRcdG1vcmU6IFwiRWhlbmhsYVwiLFxuXHRcdFx0bGVzczogXCJFaGFuc2lcIixcblx0XHR9LFxuXHRcdElzaVhob3NhOiB7XG5cdFx0XHRlbmRTY3JlZW46IFwiVXlpZ3FpYmlsZSB5b25rZSBpbWlidXpvIHlheWUgaXppcGh1bW8geml0aHVueWVsd2UuXCIsXG5cdFx0XHRyZXN0YXJ0OiBcIlphbWEga3dha2hvbmFcIixcblx0XHRcdHN0YXJ0OiBcIlN0YXJ0XCIsXG5cdFx0XHRsYW5kaW5nUGFnZUhlYWRpbmc6IFwiQXNzZXNzbWVudCAvIFN1cnZleVwiLFxuXHRcdFx0bGFuZGluZ1BhZ2VIZWxwOiBcIllvdSBhcmUgYWJvdXQgdG8gYmVnaW4gdGhlIGFzc2Vzc21lbnQuIENsaWNrIHRoZSBcXFwiU3RhcnRcXFwiIGJ1dHRvbiBiZWxvdyB0byBjb250aW51ZS5cIixcblx0XHRcdGNvbXBsZXRlOiBcIkdxaWJhXCIsXG5cdFx0XHRuZXh0OiBcIkVsYW5kZWxheW9cIixcblx0XHRcdHByZXZpb3VzOiBcIkV5YW5nYXBoYW1iaWxpXCIsXG5cdFx0XHRmZWVkYmFjazogXCJ7Y291bnR9IGV5ZS17dG90YWx9XCIsXG5cdFx0XHR0b3RhbFF1ZXN0aW9uczogXCJVZnVtZW5lIGFtYW5xYWt1IGFwaGVsZWxleW8gbWFsdW5nYSB7Y291bnR9IHVrdXBodW1hIGt3aS17dG90YWx9IGltaWJ1em8uXCIsXG5cdFx0XHR0b3RhbFRpbWU6IFwiS3VrdXRoYXRoZSAge2NvdW50fSB1a3VncWliYSB1dmF2YW55by5cIixcblx0XHRcdHRvdGFsU2NvcmU6IFwiQW1hbnFha3UgYWtobyBld29ua2UgbmdhbWEtIHtjb3VudH0gdWt1cGh1bWEga3VtYS0ge3RvdGFsfS5cIixcblx0XHRcdGF2ZXJhZ2VUaW1lOiBcIlVtbmRpbGlsaSB3YWtobyB3ZXhlc2hhIGxvbWJ1em8gbmdhbW55ZSBuZ2FtYS0ge2F2ZXJhZ2V9LlwiLFxuXHRcdFx0YXV0b21hdGljTWFyazogXCJ7cUF1dG9Db3VudH0gKG91dCBvZiB7cXVlc3Rpb25Db3VudH0pIHF1ZXN0aW9ucywgZm9yIGEgdG90YWwgb2Yge2F1dG9Ub3RhbH0gbWFya3MsIHdlcmUgbWFya2VkIGF1dG9tYXRpY2FsbHkuIFlvdSBzY29yZWQge2F1dG9NYXJrfSBvdXQgb2Yge2F1dG9Ub3RhbH0uXCIsXG5cdFx0XHR0ZWFjaGVyVG9NYXJrOiBcIlV0aHVtZWxlIGltaWJ1em8ge2NvdW50fSB1a3dlbnplbGEgdWt1cGhhd3Vsd2EuXCIsXG5cdFx0XHRzaG93RmVlZGJhY2s6IFwiQm9uaXNhIGluZ3hlbG9cIixcblx0XHRcdHRlYWNoZXJGZWVkYmFjazogXCI8c3Ryb25nPkluZ3hlbG86PC9zdHJvbmc+XCIsXG5cdFx0XHRmZWVkYmFja2RvbmU6IFwiVXNlYmVuemUga3dpbmd4ZWxvIHlheW8geW9ua2UgaW1pYnV6by5cIixcblx0XHRcdG5vdGVhY2hlckZlZWRiYWNrOiBcIkFrdWtobyBuZ3hlbG8gZW5pa2Vsd2V5by5cIixcblx0XHRcdHRydWU6IFwiWWlueWFuaXNvXCIsXG5cdFx0XHRmYWxzZTogXCJZaW1wb3Npc29cIixcblx0XHRcdHllczogXCJFd2VcIixcblx0XHRcdG5vOiBcIkhheWlcIixcblx0XHRcdGJlZm9yZTogXCJOZ2FwaGFtYmlsaVwiLFxuXHRcdFx0YWZ0ZXI6IFwiTmdhc2VtdmFcIixcblx0XHRcdG1vcmU6IFwiTmdhcGhlenVsdVwiLFxuXHRcdFx0bGVzczogXCJOZ2FwaGFudHNpXCIsXG5cdFx0fSxcblx0XHRTZXBlZGk6IHtcblx0XHRcdGVuZFNjcmVlbjogXCJPIHRsYWRpdMWhZSBkaXBvdMWhacWhbyBrYSBtb2thIGdvbW1lIGRpcG9lbG8gdMWhYSBnYWdvIGRpIHJvbWV0xaF3ZS5cIixcblx0XHRcdHJlc3RhcnQ6IFwiTGVrYSBnYXBlXCIsXG5cdFx0XHRzdGFydDogXCJTdGFydFwiLFxuXHRcdFx0bGFuZGluZ1BhZ2VIZWFkaW5nOiBcIkFzc2Vzc21lbnQgLyBTdXJ2ZXlcIixcblx0XHRcdGxhbmRpbmdQYWdlSGVscDogXCJZb3UgYXJlIGFib3V0IHRvIGJlZ2luIHRoZSBhc3Nlc3NtZW50LiBDbGljayB0aGUgXFxcIlN0YXJ0XFxcIiBidXR0b24gYmVsb3cgdG8gY29udGludWUuXCIsXG5cdFx0XHRjb21wbGV0ZTogXCJUbGF0xaFhXCIsXG5cdFx0XHRuZXh0OiBcIkxhdGVsYWdvXCIsXG5cdFx0XHRwcmV2aW91czogXCJGZXRpbGVnb1wiLFxuXHRcdFx0ZmVlZGJhY2s6IFwie2NvdW50fSB5YSB7dG90YWx9XCIsXG5cdFx0XHR0b3RhbFF1ZXN0aW9uczogXCJPIG5hIGxlIG1lcHV0c28ga2EgbW9rYSB5ZSB7Y291bnR9IGdvIGRpcG90xaFpxaFvIHTFoWUge3RvdGFsfS5cIixcblx0XHRcdHRvdGFsVGltZTogXCJHbyBnbyB0xaFlcmUge2NvdW50fSBnbyBmZXTFoWEgdGVrb2RpxaFpxaFvLlwiLFxuXHRcdFx0dG90YWxTY29yZTogXCJQYWxvbW9rYSB5YSBkaW50bGhhIHTFoWEgZ2FnbyBrZSB7Y291bnR9IGdvIHTFoWUge3RvdGFsfS5cIixcblx0XHRcdGF2ZXJhZ2VUaW1lOiBcIlBhbG9nYXJlIHlhIG5ha28geWEgZ2FnbyBrYSBwb3TFoWnFoW8ga2Uge2F2ZXJhZ2V9LlwiLFxuXHRcdFx0YXV0b21hdGljTWFyazogXCJ7cUF1dG9Db3VudH0gKG91dCBvZiB7cXVlc3Rpb25Db3VudH0pIHF1ZXN0aW9ucywgZm9yIGEgdG90YWwgb2Yge2F1dG9Ub3RhbH0gbWFya3MsIHdlcmUgbWFya2VkIGF1dG9tYXRpY2FsbHkuIFlvdSBzY29yZWQge2F1dG9NYXJrfSBvdXQgb2Yge2F1dG9Ub3RhbH0uXCIsXG5cdFx0XHR0ZWFjaGVyVG9NYXJrOiBcIk8gcm9tZXTFoWUgZGlwb3TFoWnFoW8gdMWhZSB7Y291bnR9IHTFoWEgZ28gc3dheWEuXCIsXG5cdFx0XHRzaG93RmVlZGJhY2s6IFwiQm9udMWhaGEgcG9lbG9cIixcblx0XHRcdHRlYWNoZXJGZWVkYmFjazogXCI8c3Ryb25nPlBvZWxvOjwvc3Ryb25nPlwiLFxuXHRcdFx0ZmVlZGJhY2tkb25lOiBcIk8gxaFvbWlsZSBrYSBwb2VsbyB5YSBkaXBvdMWhacWhbyBrYSBtb2thLlwiLFxuXHRcdFx0bm90ZWFjaGVyRmVlZGJhY2s6IFwiR2EgZ28gcG9lbG8geWUgZSBmaWx3ZWdvLlwiLFxuXHRcdFx0dHJ1ZTogXCJObmV0ZVwiLFxuXHRcdFx0ZmFsc2U6IFwiTWFha2FcIixcblx0XHRcdHllczogXCJFZVwiLFxuXHRcdFx0bm86IFwiQW93YVwiLFxuXHRcdFx0YmVmb3JlOiBcIlBlbGVcIixcblx0XHRcdGFmdGVyOiBcIkthIG1vcmFnb1wiLFxuXHRcdFx0bW9yZTogXCJOdMWhaVwiLFxuXHRcdFx0bGVzczogXCJObnlhbmVcIixcblx0XHR9LFxuXHRcdFNlc290aG86IHtcblx0XHRcdGVuZFNjcmVlbjogXCJPIGRpIHFldGlsZSBrYW9mZWxhIGRpcG90c28gbW1lIGRpcGhldGhvIGRpIHJvbWV0c3dlLlwiLFxuXHRcdFx0cmVzdGFydDogXCJMZWthIGhhcGVcIixcblx0XHRcdHN0YXJ0OiBcIlN0YXJ0XCIsXG5cdFx0XHRsYW5kaW5nUGFnZUhlYWRpbmc6IFwiQXNzZXNzbWVudCAvIFN1cnZleVwiLFxuXHRcdFx0bGFuZGluZ1BhZ2VIZWxwOiBcIllvdSBhcmUgYWJvdXQgdG8gYmVnaW4gdGhlIGFzc2Vzc21lbnQuIENsaWNrIHRoZSBcXFwiU3RhcnRcXFwiIGJ1dHRvbiBiZWxvdyB0byBjb250aW51ZS5cIixcblx0XHRcdGNvbXBsZXRlOiBcIlFldGFcIixcblx0XHRcdG5leHQ6IFwiRSBsYXRlbGFuZ1wiLFxuXHRcdFx0cHJldmlvdXM6IFwiWWEgcGVsZVwiLFxuXHRcdFx0ZmVlZGJhY2s6IFwie2NvdW50fSB5YSB7dG90YWx9XCIsXG5cdFx0XHR0b3RhbFF1ZXN0aW9uczogXCJPIGZ1bWFuZSBtYXRzaHdhbyBhIGZlbGV0c2VuZyBtYWJhcGkgbGUge2NvdW50fSBobyB0c3dhIGhvIHt0b3RhbH0gZGlwb3Rzby5cIixcblx0XHRcdHRvdGFsVGltZTogXCJIbyBvIG5raWxlIHtjb3VudH0gaG8gcWV0YSB0ZWtvbG8uXCIsXG5cdFx0XHR0b3RhbFNjb3JlOiBcIk1hdHNod2FvIGEgaGFvIGthb2ZlbGEga2Uge2NvdW50fSBobyB0c3dhIGhvIGEge3RvdGFsfS5cIixcblx0XHRcdGF2ZXJhZ2VUaW1lOiBcIlBhbG9oYXJlIHlhIG5ha28geWEgaGFvIHlhIHBvdHNvIGthIG5uZ3dlIGtlIHthdmVyYWdlfS5cIixcblx0XHRcdGF1dG9tYXRpY01hcms6IFwie3FBdXRvQ291bnR9IChvdXQgb2Yge3F1ZXN0aW9uQ291bnR9KSBxdWVzdGlvbnMsIGZvciBhIHRvdGFsIG9mIHthdXRvVG90YWx9IG1hcmtzLCB3ZXJlIG1hcmtlZCBhdXRvbWF0aWNhbGx5LiBZb3Ugc2NvcmVkIHthdXRvTWFya30gb3V0IG9mIHthdXRvVG90YWx9LlwiLFxuXHRcdFx0dGVhY2hlclRvTWFyazogXCJPIHJvbWV0c2UgZGlwb3RzbyB7Y291bnR9IGJha2VuZyBzYSBobyB0c2h3YXV3YS5cIixcblx0XHRcdHNob3dGZWVkYmFjazogXCJCb250c2hhIHRsYWxlaG9cIixcblx0XHRcdHRlYWNoZXJGZWVkYmFjazogXCI8c3Ryb25nPlRsYWxlaG86PC9zdHJvbmc+XCIsXG5cdFx0XHRmZWVkYmFja2RvbmU6IFwiTyBzZWJlZGl0c2UgaG8gdGxhbGVobyB5YSBkaXBvdHNvIGthb2ZlbGEuXCIsXG5cdFx0XHRub3RlYWNoZXJGZWVkYmFjazogXCJIYSBobyB0bGFsZWhvIGUgbmVodXdlbmcuXCIsXG5cdFx0XHR0cnVlOiBcIk5uZXRlXCIsXG5cdFx0XHRmYWxzZTogXCJMZXNoYW5vXCIsXG5cdFx0XHR5ZXM6IFwiRWVcIixcblx0XHRcdG5vOiBcIlRqaGVlXCIsXG5cdFx0XHRiZWZvcmU6IFwiUGVsZVwiLFxuXHRcdFx0YWZ0ZXI6IFwiS2EgbW9yYW9cIixcblx0XHRcdG1vcmU6IFwiS2EgaG9kaW1vXCIsXG5cdFx0XHRsZXNzOiBcIkthIHRsYXNlXCIsXG5cdFx0fSxcblx0XHRTaXN3YXRpOiB7XG5cdFx0XHRlbmRTY3JlZW46IFwiVXlpcGhlbmR2dWxlIHlvbmtoZSBpbWlidXRvIGZ1dHNpIGltaXBodW1lbGEgeWFraG8gc2V5aW5nZW5pc2l3ZS5cIixcblx0XHRcdHJlc3RhcnQ6IFwiWWV0YW1hIGZ1dHNpXCIsXG5cdFx0XHRzdGFydDogXCJTdGFydFwiLFxuXHRcdFx0bGFuZGluZ1BhZ2VIZWFkaW5nOiBcIkFzc2Vzc21lbnQgLyBTdXJ2ZXlcIixcblx0XHRcdGxhbmRpbmdQYWdlSGVscDogXCJZb3UgYXJlIGFib3V0IHRvIGJlZ2luIHRoZSBhc3Nlc3NtZW50LiBDbGljayB0aGUgXFxcIlN0YXJ0XFxcIiBidXR0b24gYmVsb3cgdG8gY29udGludWUuXCIsXG5cdFx0XHRjb21wbGV0ZTogXCJQaGVuZHZ1bGFcIixcblx0XHRcdG5leHQ6IFwiTG9rdWxhbmR6ZWxha29cIixcblx0XHRcdHByZXZpb3VzOiBcIkxva3dlbmRsdWxpbGVcIixcblx0XHRcdGZlZWRiYWNrOiBcIntjb3VudH0ga3dlIHt0b3RhbH1cIixcblx0XHRcdHRvdGFsUXVlc3Rpb25zOiBcIlV0Zm9sZSBlbWFtYWtpIGxhcGhlbGVsZSB7Y291bnR9IGt1bWlidXRvIGxle3RvdGFsfS5cIixcblx0XHRcdHRvdGFsVGltZTogXCJLdWt1dHNldHNlIHtjb3VudH0ga3VjZWR6YSBsb2x1aGxvbG8uXCIsXG5cdFx0XHR0b3RhbFNjb3JlOiBcIkVtYW1ha2kgYWtobyBhc2FwaGVsZWxlIGFuZ3Uge2NvdW50fSBrdXNhbWJhIHNhbGFuZ3Uge3RvdGFsfS5cIixcblx0XHRcdGF2ZXJhZ2VUaW1lOiBcIlNpa2hhdHNpIHNha2hvIGxlc2lzZW1raGF0c2luaSBzZW1idXRvIG5nYW11bnllIG5ndSB7YXZlcmFnZX0uXCIsXG5cdFx0XHRhdXRvbWF0aWNNYXJrOiBcIntxQXV0b0NvdW50fSAob3V0IG9mIHtxdWVzdGlvbkNvdW50fSkgcXVlc3Rpb25zLCBmb3IgYSB0b3RhbCBvZiB7YXV0b1RvdGFsfSBtYXJrcywgd2VyZSBtYXJrZWQgYXV0b21hdGljYWxseS4gWW91IHNjb3JlZCB7YXV0b01hcmt9IG91dCBvZiB7YXV0b1RvdGFsfS5cIixcblx0XHRcdHRlYWNoZXJUb01hcms6IFwiVW5nZW5pc2UgaW1pYnV0byBsZW5ndSB7Y291bnR9IGt1dHNpIGltYWt3ZS5cIixcblx0XHRcdHNob3dGZWVkYmFjazogXCJLaG9tYmlzYSB1bWJpa29cIixcblx0XHRcdHRlYWNoZXJGZWVkYmFjazogXCI8c3Ryb25nPlVtYmlrbzo8L3N0cm9uZz5cIixcblx0XHRcdGZlZWRiYWNrZG9uZTogXCJVeWlidWtvIHlvbmtoZSBpbWliaWtvIHlhbGVtaWJ1dG8uXCIsXG5cdFx0XHRub3RlYWNoZXJGZWVkYmFjazogXCJLdXRlIHVtYmlrbyBsb25pa2V0aXdlXCIsXG5cdFx0XHR0cnVlOiBcIkxpY2luaXNvXCIsXG5cdFx0XHRmYWxzZTogXCJOZ2VtYW5nYVwiLFxuXHRcdFx0eWVzOiBcIlllYm9cIixcblx0XHRcdG5vOiBcIkNoYVwiLFxuXHRcdFx0YmVmb3JlOiBcIlBoYW1iaWxpbmlcIixcblx0XHRcdGFmdGVyOiBcIk5nZW11dmFcIixcblx0XHRcdG1vcmU6IFwiTmdldHVsdVwiLFxuXHRcdFx0bGVzczogXCJOZ2FwaGFzaVwiLFxuXHRcdH0sXG5cdFx0VHNoaXZlbmRhOiB7XG5cdFx0XHRlbmRTY3JlZW46IFwiTm8g4bmxaGFwaHVkemEgbWJ1ZHppc28gZHpv4bmxaGUgcGhpbmR1bG8gZHph4bmLdSBkem8g4bmLZXRzaGVkendhLlwiLFxuXHRcdFx0cmVzdGFydDogXCJMaW5nZWR6YW5pIGhhZmh1XCIsXG5cdFx0XHRzdGFydDogXCJTdGFydFwiLFxuXHRcdFx0bGFuZGluZ1BhZ2VIZWFkaW5nOiBcIkFzc2Vzc21lbnQgLyBTdXJ2ZXlcIixcblx0XHRcdGxhbmRpbmdQYWdlSGVscDogXCJZb3UgYXJlIGFib3V0IHRvIGJlZ2luIHRoZSBhc3Nlc3NtZW50LiBDbGljayB0aGUgXFxcIlN0YXJ0XFxcIiBidXR0b24gYmVsb3cgdG8gY29udGludWUuXCIsXG5cdFx0XHRjb21wbGV0ZTogXCLhubBoYXBodWR6YW5pXCIsXG5cdFx0XHRuZXh0OiBcIlRldmhlbGFob1wiLFxuXHRcdFx0cHJldmlvdXM6IFwiRmhpcmFob1wiLFxuXHRcdFx0ZmVlZGJhY2s6IFwie2NvdW50fSB0c2hhIHt0b3RhbH1cIixcblx0XHRcdHRvdGFsUXVlc3Rpb25zOiBcIk5vIHdhbmEgbWFyYWdhIGR6b+G5sWhlIGR6YSB7Y291bnR9IGtoYSBtYnVkemlzbyB7dG90YWx9LlwiLFxuXHRcdFx0dG90YWxUaW1lOiBcIlp3byBuaSBkemhpZWxhIHtjb3VudH0gdSDhubFoYXBodWR6YSBhc2VzaW1lbm5kZS5cIixcblx0XHRcdHRvdGFsU2NvcmU6IFwiTWFyYWdhIGR6YeG5i3UgbmRpIHtjb3VudH0ga2hhIHt0b3RhbH0uXCIsXG5cdFx0XHRhdmVyYWdlVGltZTogXCJUc2hpZmhpbmdhIHRzaGUgbmEgdHNoaSBmaGVkemEga2hhIG1idWR6aXNvIG5kaSB7YXZlcmFnZX0uXCIsXG5cdFx0XHRhdXRvbWF0aWNNYXJrOiBcIntxQXV0b0NvdW50fSAob3V0IG9mIHtxdWVzdGlvbkNvdW50fSkgcXVlc3Rpb25zLCBmb3IgYSB0b3RhbCBvZiB7YXV0b1RvdGFsfSBtYXJrcywgd2VyZSBtYXJrZWQgYXV0b21hdGljYWxseS4gWW91IHNjb3JlZCB7YXV0b01hcmt9IG91dCBvZiB7YXV0b1RvdGFsfS5cIixcblx0XHRcdHRlYWNoZXJUb01hcms6IFwiTm8g4bmLZXRzaGVkemEgbWJ1ZHppc28ge2NvdW50fSB1IHJpIGR6aSBrb3Jla3dlLlwiLFxuXHRcdFx0c2hvd0ZlZWRiYWNrOiBcIlN1bWJlZHphbmkgdSB2aGlnYSBtdXJhaHUgbmdhIGhhIGt1c2h1bWVsZVwiLFxuXHRcdFx0dGVhY2hlckZlZWRiYWNrOiBcIjxzdHJvbmc+VmhpZ2EgbXVyYWh1IG5nYSBoYSBrdXNodW1lbGU6PC9zdHJvbmc+XCIsXG5cdFx0XHRmZWVkYmFja2RvbmU6IFwiTm8gc2h1bWEgbmEgdSB2aGlnYSBtdXJhaHUgbmdhIGhhIGt1c2h1bWVsZSBraGEgbWJ1ZHppc28gZHpv4bmxaGUuXCIsXG5cdFx0XHRub3RlYWNoZXJGZWVkYmFjazogXCJBIGh1bmEgdSB2aGlnYSBtdXJhaHUgbmdhIGhhIGt1c2h1bWVsZSBobyDhuYtldHNoZWR6d2Foby5cIixcblx0XHRcdHRydWU6IFwiTmdvaG9cIixcblx0XHRcdGZhbHNlOiBcIkEgc2kgbmdvaG9cIixcblx0XHRcdHllczogXCJFZVwiLFxuXHRcdFx0bm86IFwiSGFpXCIsXG5cdFx0XHRiZWZvcmU6IFwiTmdhIHBoYW7huJNhXCIsXG5cdFx0XHRhZnRlcjogXCJOZ2EgbXVyYWh1XCIsXG5cdFx0XHRtb3JlOiBcIkZoaXJpc2FcIixcblx0XHRcdGxlc3M6IFwiWndp4bmxdWt1XCIsXG5cdFx0fSxcblx0XHRTZXRzd2FuYToge1xuXHRcdFx0ZW5kU2NyZWVuOiBcIk8gZmVkaXRzZSBkaXBvdHNvIHRzb3RsaGUgbW1lIGRpcGhvbG8gdHNhIGdhZ28gZGkgcm9tZXRzd2VcIixcblx0XHRcdHJlc3RhcnQ6IFwiTGVrYSBnYXBlXCIsXG5cdFx0XHRzdGFydDogXCJTdGFydFwiLFxuXHRcdFx0bGFuZGluZ1BhZ2VIZWFkaW5nOiBcIkFzc2Vzc21lbnQgLyBTdXJ2ZXlcIixcblx0XHRcdGxhbmRpbmdQYWdlSGVscDogXCJZb3UgYXJlIGFib3V0IHRvIGJlZ2luIHRoZSBhc3Nlc3NtZW50LiBDbGljayB0aGUgXFxcIlN0YXJ0XFxcIiBidXR0b24gYmVsb3cgdG8gY29udGludWUuXCIsXG5cdFx0XHRjb21wbGV0ZTogXCJGZWxlbGV0c2FcIixcblx0XHRcdG5leHQ6IFwiTGF0ZWxhbmdcIixcblx0XHRcdHByZXZpb3VzOiBcIkZldGlsZW5nXCIsXG5cdFx0XHRmZWVkYmFjazogXCJ7Y291bnR9IHlhIHRzZSB7dG90YWx9XCIsXG5cdFx0XHR0b3RhbFF1ZXN0aW9uczogXCJPIGJvbmUgZGltbWFyYWthIHRzb3RsaGUgdHNhIGRpcG90c28gZGkgbGUge2NvdW50fSBtbyBnbyB0c2Uge3RvdGFsfS5cIixcblx0XHRcdHRvdGFsVGltZTogXCJHbyBmZXRzYSB0ZWtvbG8gZ28gZ28gdHNlcmUge2NvdW50fS5cIixcblx0XHRcdHRvdGFsU2NvcmU6IFwiTWFkdW8gb3RsaGUgYSBnYWdvIGtlIHtjb3VudH0gbW8gZ28gYSBsZSB7dG90YWx9LlwiLFxuXHRcdFx0YXZlcmFnZVRpbWU6IFwiUGFsb2dhcmUgeWEgbmFrbyB5YSBnYWdvIHlhIHBvdHNvIG5uZ3dlIGxlIG5uZ3dlIHthdmVyYWdlfS5cIixcblx0XHRcdGF1dG9tYXRpY01hcms6IFwie3FBdXRvQ291bnR9IChvdXQgb2Yge3F1ZXN0aW9uQ291bnR9KSBxdWVzdGlvbnMsIGZvciBhIHRvdGFsIG9mIHthdXRvVG90YWx9IG1hcmtzLCB3ZXJlIG1hcmtlZCBhdXRvbWF0aWNhbGx5LiBZb3Ugc2NvcmVkIHthdXRvTWFya30gb3V0IG9mIHthdXRvVG90YWx9LlwiLFxuXHRcdFx0dGVhY2hlclRvTWFyazogXCJPIHJvbWV0c2UgZGlwb3RzbyBkaSBsZSB7Y291bnR9IGdvcmUgZGkgdHNod2Fpd2UuXCIsXG5cdFx0XHRzaG93RmVlZGJhY2s6IFwiQm9udHNoYSBwZWdlbG9rYXJhYm9cIixcblx0XHRcdHRlYWNoZXJGZWVkYmFjazogXCI8c3Ryb25nPlBlZ2Vsb2thcmFibzo8L3N0cm9uZz5cIixcblx0XHRcdGZlZWRiYWNrZG9uZTogXCJPIG5lIHdhIGxlYmEgcGVnZWxva2FyYWJvIHlhIGRpcG90c28gdHNvdGxoZS5cIixcblx0XHRcdG5vdGVhY2hlckZlZWRiYWNrOiBcIkdhIGdvIGEgcm9tZWx3YSBwZWdlbG9rYXJhYm8gZXBlLlwiLFxuXHRcdFx0dHJ1ZTogXCJCb2FtbWFhcnVyaVwiLFxuXHRcdFx0ZmFsc2U6IFwiTWFha2FcIixcblx0XHRcdHllczogXCJFZVwiLFxuXHRcdFx0bm86IFwiTm55YWFcIixcblx0XHRcdGJlZm9yZTogXCJQZWxlXCIsXG5cdFx0XHRhZnRlcjogXCJNb3JhZ29cIixcblx0XHRcdG1vcmU6IFwiTnRzaVwiLFxuXHRcdFx0bGVzczogXCJObnllXCIsXG5cdFx0fSxcblx0XHRJc2ladWx1OiB7XG5cdFx0XHRlbmRTY3JlZW46IFwiTmdhYmUgdXlpZ2N3YWxpc2UgeW9ua2UgaW1pYnV6byBmdXRoaSBuZ2FiZSB1eWlsZXRoaWxlIGltaXBodW1lbGEgeWFraG8/XCIsXG5cdFx0XHRyZXN0YXJ0OiBcIlBoaW5kYSB1emFtZSBmdXRoaVwiLFxuXHRcdFx0c3RhcnQ6IFwiU3RhcnRcIixcblx0XHRcdGxhbmRpbmdQYWdlSGVhZGluZzogXCJBc3Nlc3NtZW50IC8gU3VydmV5XCIsXG5cdFx0XHRsYW5kaW5nUGFnZUhlbHA6IFwiWW91IGFyZSBhYm91dCB0byBiZWdpbiB0aGUgYXNzZXNzbWVudC4gQ2xpY2sgdGhlIFxcXCJTdGFydFxcXCIgYnV0dG9uIGJlbG93IHRvIGNvbnRpbnVlLlwiLFxuXHRcdFx0Y29tcGxldGU6IFwiR2N3YWxpc2FcIixcblx0XHRcdG5leHQ6IFwiT2t1bGFuZGVsYXlvXCIsXG5cdFx0XHRwcmV2aW91czogXCJPa3dlZGx1bGVcIixcblx0XHRcdGZlZWRiYWNrOiBcIntjb3VudH0ga29rdXlpIHt0b3RhbH1cIixcblx0XHRcdHRvdGFsUXVlc3Rpb25zOiBcIlV0aG9sZSBhbWFwaHV6dSBhcGhlbGVsZSBrd2kge2NvdW50fSBrd2F3dSB7dG90YWx9IGxlbWlidXpvLlwiLFxuXHRcdFx0dG90YWxUaW1lOiBcIkt1a3V0aGF0aGUge2NvdW50fSB1a3VxZWRlbGEgdWt1aGxvbHdhLlwiLFxuXHRcdFx0dG90YWxTY29yZTogXCJJc2liYWxvIHNha2hvIGVzaXBoZWxlbGUgc2l3dSB7Y291bnR9IGtva3V5aSB7dG90YWx9LlwiLFxuXHRcdFx0YXZlcmFnZVRpbWU6IFwiSXNpa2hhdGhpIGVzaWxpbmdhbmlzZWx3ZSBzYWtobyBrdW1idXpvIG5nYW11bnllIHNpYmUgd3Uge2F2ZXJhZ2V9LlwiLFxuXHRcdFx0YXV0b21hdGljTWFyazogXCJ7cUF1dG9Db3VudH0gKG91dCBvZiB7cXVlc3Rpb25Db3VudH0pIHF1ZXN0aW9ucywgZm9yIGEgdG90YWwgb2Yge2F1dG9Ub3RhbH0gbWFya3MsIHdlcmUgbWFya2VkIGF1dG9tYXRpY2FsbHkuIFlvdSBzY29yZWQge2F1dG9NYXJrfSBvdXQgb2Yge2F1dG9Ub3RhbH0uXCIsXG5cdFx0XHR0ZWFjaGVyVG9NYXJrOiBcIlVsZXRoZSBpbmFuaSBsZW1pYnV6byBld3Uge2NvdW50fSB1a3V6ZSBpem9tYWt3YS5cIixcblx0XHRcdHNob3dGZWVkYmFjazogXCJCb25pc2EgaXppbXBlbmR1bG9cIixcblx0XHRcdHRlYWNoZXJGZWVkYmFjazogXCI8c3Ryb25nPkl6aW1wZW5kdWxvOjwvc3Ryb25nPlwiLFxuXHRcdFx0ZmVlZGJhY2tkb25lOiBcIlVzdWJoZWtlIGl6aW1wZW5kdWxvIHpheW8geW9ua2UgaW1pYnV6by5cIixcblx0XHRcdG5vdGVhY2hlckZlZWRiYWNrOiBcIkFrdWtobyB6aW1wZW5kdWxvIGV6aWhsaW56ZWtpd2UuXCIsXG5cdFx0XHR0cnVlOiBcIklxaW5pc29cIixcblx0XHRcdGZhbHNlOiBcIklwaHV0aGFcIixcblx0XHRcdHllczogXCJZZWJvXCIsXG5cdFx0XHRubzogXCJDaGFcIixcblx0XHRcdGJlZm9yZTogXCJOZ2FwaGFtYmlcIixcblx0XHRcdGFmdGVyOiBcIk5nZW11dmFcIixcblx0XHRcdG1vcmU6IFwiTmdhcGhlenVsdVwiLFxuXHRcdFx0bGVzczogXCJOZ2FwaGFuc2lcIixcblx0XHR9LFxuXHRcdElzaU5kZWJlbGU6IHtcblx0XHRcdGVuZFNjcmVlbjogXCJVeWlxZWRpbGUgeW9rZSBpbWlidXpvIGJlZ29kdSBpbWlwaHVtZWxhIHlha2hvIGl0aHVueWVsd2UuXCIsXG5cdFx0XHRyZXN0YXJ0OiBcIlphbWEgZ29kdVwiLFxuXHRcdFx0c3RhcnQ6IFwiU3RhcnRcIixcblx0XHRcdGxhbmRpbmdQYWdlSGVhZGluZzogXCJBc3Nlc3NtZW50IC8gU3VydmV5XCIsXG5cdFx0XHRsYW5kaW5nUGFnZUhlbHA6IFwiWW91IGFyZSBhYm91dCB0byBiZWdpbiB0aGUgYXNzZXNzbWVudC4gQ2xpY2sgdGhlIFxcXCJTdGFydFxcXCIgYnV0dG9uIGJlbG93IHRvIGNvbnRpbnVlLlwiLFxuXHRcdFx0Y29tcGxldGU6IFwiWmFsaXNhXCIsXG5cdFx0XHRuZXh0OiBcIk9rdWxhbmRlbGFrb1wiLFxuXHRcdFx0cHJldmlvdXM6IFwiS3dhbmdhcGhhbWJpbGluaVwiLFxuXHRcdFx0ZmVlZGJhY2s6IFwie2NvdW50fSBzZSB7dG90YWx9XCIsXG5cdFx0XHR0b3RhbFF1ZXN0aW9uczogXCJVdGhvbGUgYW1hbWFrc2kgYXBoZWxlbGVrbyB3YWxva2hhIHtjb3VudH0ga3VuYSB7dG90YWx9IGxlbWlidXpvLlwiLFxuXHRcdFx0dG90YWxUaW1lOiBcIkt1a3V0aGV0aGUgIHtjb3VudH0gdWtvYmFuYSB1cWVkZSB1a3VobG9sd2EuXCIsXG5cdFx0XHR0b3RhbFNjb3JlOiBcIkluYW5pIGxhbWFtYWtzYWtobyB7Y291bnR9IGt1bmUge3RvdGFsfS5cIixcblx0XHRcdGF2ZXJhZ2VUaW1lOiBcIklzaWtoYXRoaSBzYWtobyBlc2liZWtpd2VrbyBlbWJ1endlbmkgbmdhbXVueWUge2F2ZXJhZ2V9LlwiLFxuXHRcdFx0YXV0b21hdGljTWFyazogXCJ7cUF1dG9Db3VudH0gKG91dCBvZiB7cXVlc3Rpb25Db3VudH0pIHF1ZXN0aW9ucywgZm9yIGEgdG90YWwgb2Yge2F1dG9Ub3RhbH0gbWFya3MsIHdlcmUgbWFya2VkIGF1dG9tYXRpY2FsbHkuIFlvdSBzY29yZWQge2F1dG9NYXJrfSBvdXQgb2Yge2F1dG9Ub3RhbH0uXCIsXG5cdFx0XHR0ZWFjaGVyVG9NYXJrOiBcIlV0aHVtZWxlIHtjb3VudH0gbGVtaWJ1em8gdWtvYmFuYSBpdHNod2F5d2UuXCIsXG5cdFx0XHRzaG93RmVlZGJhY2s6IFwiVGplbmdpc2EgdW1iaWtvIG9idXlha28uXCIsXG5cdFx0XHR0ZWFjaGVyRmVlZGJhY2s6IFwiPHN0cm9uZz5VbWJpa28gb2J1eWFrbzo8L3N0cm9uZz5cIixcblx0XHRcdGZlZWRiYWNrZG9uZTogXCJVcWFsaXNpc2Uga3VobGUgdW1iaWtvIG9idXlha28gd2F5byB5b2tlIGltaWJ1em8uXCIsXG5cdFx0XHRub3RlYWNoZXJGZWVkYmFjazogXCJBd3VraG8gdW1iaWtvIG9idXlha28gb3RodW55ZWx3ZWtvLlwiLFxuXHRcdFx0dHJ1ZTogXCJMaXFpbmlzb1wiLFxuXHRcdFx0ZmFsc2U6IFwiTWFtYWxhXCIsXG5cdFx0XHR5ZXM6IFwiSXllXCIsXG5cdFx0XHRubzogXCJBd2FcIixcblx0XHRcdGJlZm9yZTogXCJOZ2FwaGFtYmlsaVwiLFxuXHRcdFx0YWZ0ZXI6IFwiTmdlbXZhXCIsXG5cdFx0XHRtb3JlOiBcIk9rdW5lbmdpXCIsXG5cdFx0XHRsZXNzOiBcIk9rdW5jYW5pXCIsXG5cdFx0fSxcblx0fTtcblxuXHRyZXR1cm4gSWFnbztcbn0pKTtcblxuaWYgKHR5cGVvZiBleHBvcnRzID09PSBcInVuZGVmaW5lZFwiKVxuXHR3aW5kb3cuaWFnbyA9IG5ldyB3aW5kb3cuSWFnbygpOyJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\n\nvar noop = function noop(evt) {\n\tevt.stopPropagation();\n\tevt.preventDefault();\n};\n\nvar stopProp = function stopProp(evt) {\n\tevt.stopPropagation();\n};\n\nvar ImageChooser = function ImageChooser(id, el, options) {\n\tvar _this = this;\n\n\t_.extend(this, Backbone.Events);\n\tthis.listeners = {};\n\tthis._fileMap = {};\n\tthis.set = false;\n\n\tthis.options = options;\n\n\tthis.el = el;\n\tthis.id = id;\n\tvar dropbox = el.get(0);\n\n\tvar types = \"image/*\";\n\tif (options.types) types = options.types;\n\n\tvar handleDrop = function handleDrop(e) {\n\t\te.stopPropagation();\n\t\te.preventDefault();\n\n\t\tif (e.dataTransfer.files.length > 0) _this.handleNewImage(e.dataTransfer.files[0]);\n\t};\n\n\tvar imageChosen = function imageChosen() {\n\t\tvar file = $(\"#fc-\" + _this.id).get(0).files[0];\n\t\tif (!file) return;\n\n\t\t_this.handleNewImage(file);\n\t};\n\n\tif (!options.passive) {\n\t\tdropbox.addEventListener(\"dragenter\", noop, false);\n\t\tdropbox.addEventListener(\"dragover\", noop, false);\n\t\tthis.listeners.dropListener = handleDrop.bind(this);\n\t\tdropbox.addEventListener(\"drop\", this.listeners.dropListener, false);\n\t}\n\n\tel.addClass(\"imageChooser\").html(\"<div class='text'>\" + options.text + \"</div>\");\n\n\tif (options.passive) el.css({ cursor: \"auto\" });else el.css(\"cursor\", \"pointer\").append(\"<input type='file' id='fc-\" + this.id + \"' accept='\" + types + \"' style='display:none'></input>\");\n\n\tif (!options.passive) $(\"#fc-\" + this.id).on(\"click\", stopProp);\n\n\tif (!options.passive) {\n\t\tthis.listeners.click = function (evt) {\n\t\t\tevt.stopPropagation();evt.preventDefault();$(\"#fc-\" + _this.id).get(0).click();\n\t\t};\n\t\tthis.el.on(\"click\", this.listeners.click);\n\t\tthis.listeners.changeHandler = imageChosen.bind(this);\n\t\t$(\"#fc-\" + this.id).on(\"change\", this.listeners.changeHandler);\n\t}\n};\n\nImageChooser.prototype.handleNewImage = function (file) {\n\tvar _this2 = this;\n\n\tthis._fileMap[this.id] = file;\n\tvar reader = new FileReader();\n\n\treader.addEventListener(\"load\", function (e) {\n\t\tvar data = e.target.result;\n\n\t\tif (_this2.options.transcode) {\n\t\t\tvar img = new Image();\n\t\t\timg.addEventListener(\"load\", function () {\n\t\t\t\tvar canvas = $(\"<canvas />\").get(0);\n\t\t\t\tvar ctx = canvas.getContext(\"2d\");\n\n\t\t\t\tvar maxWidth = _this2.options.maxWidth || 1000;\n\t\t\t\tvar maxHeight = _this2.options.maxHeight || 1000;\n\n\t\t\t\tvar w = img.width,\n\t\t\t\t    h = img.height;\n\t\t\t\tif (w > maxWidth) {\n\t\t\t\t\th = Math.floor(h * (maxWidth / w));\n\t\t\t\t\tw = maxWidth;\n\t\t\t\t}\n\t\t\t\tif (h > maxHeight) {\n\t\t\t\t\tw = Math.floor(w * (maxHeight / h));\n\t\t\t\t\th = maxHeight;\n\t\t\t\t}\n\n\t\t\t\tcanvas.width = w;\n\t\t\t\tcanvas.height = h;\n\t\t\t\timg.width = w;\n\t\t\t\timg.height = h;\n\n\t\t\t\tif (_this2.options.maxWidth || _this2.options.maxHeight) _this2.el.css({ height: h + \"px\", width: w + \"px\" });\n\n\t\t\t\tctx.clearRect(0, 0, canvas.width, canvas.height);\n\t\t\t\tcanvas.width = img.width;\n\t\t\t\tcanvas.height = img.height;\n\n\t\t\t\tctx.drawImage(img, 0, 0, img.width, img.height);\n\n\t\t\t\tif (_this2.options.jpeg) data = canvas.toDataURL(\"image/jpeg\", 0.6);else data = canvas.toDataURL(\"image/png\");\n\n\t\t\t\t_this2.setImage(data);\n\t\t\t\t_this2.trigger(\"imageChange\");\n\t\t\t});\n\t\t\timg.src = data;\n\t\t} else {\n\t\t\t_this2.setImage(data);\n\t\t\t_this2.trigger(\"imageChange\");\n\t\t}\n\t});\n\treader.readAsDataURL(file);\n};\n\nvar randomString = function randomString() {\n\tvar text = \"\";\n\tvar possible = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n\n\tfor (var i = 0; i < 5; i++) {\n\t\ttext += possible.charAt(Math.floor(Math.random() * possible.length));\n\t}return text;\n};\n\nImageChooser.create = function (el) {\n\tvar options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\tif (el.length === 0) return null;\n\n\toptions.text = options.text || \"Click to choose image<br/>OR<br/>Drag and drop from hard drive\";\n\n\tvar id = randomString(10);\n\n\tvar ret = new ImageChooser(id, el, options);\n\n\treturn ret;\n};\n\nImageChooser.prototype.getImage = function () {\n\treturn this.image;\n};\n\nImageChooser.prototype.getImageFile = function () {\n\treturn this._fileMap[this.id];\n};\n\nImageChooser.prototype.setImage = function (image) {\n\tif (!this.el) return;\n\n\tthis.image = image;\n\tthis.el.css({ \"background-image\": \"url('\" + image + \"')\" }).find(\".text\").hide();\n\tthis.set = true;\n\n\tif (this.options.maxWidth) this.el.css({ width: this.options.maxWidth + \"px\" });\n\tif (this.options.maxHeight) this.el.css({ height: this.options.maxHeight + \"px\" });\n};\n\nImageChooser.prototype.destroy = function () {\n\tif (!this.el) return;\n\n\tvar dropbox = this.el.get(0);\n\n\tdropbox.removeEventListener(\"dragenter\", noop, false);\n\tdropbox.removeEventListener(\"dragover\", noop, false);\n\tdropbox.removeEventListener(\"drop\", this.listeners.dropListener, false);\n\n\tthis.el.off(\"click\", this.listeners.click);\n\t$(\"#fc-\" + this.id).off(\"click\", stopProp);\n\t$(\"#fc-\" + this.id).off(\"change\", this.listeners.changeHandler);\n\n\t$(\"#fc-\" + this.id).remove();\n\n\tthis.el.empty().removeClass(\"imageChooser\").css({ \"background-image\": \"\" });\n\tif (this.options.maxWidth || this.options.maxHeight) this.el.css({ width: \"\", height: \"\" });\n\n\tdelete this.el;\n\tdelete this.image;\n\tdelete this.listeners;\n\tdelete this._fileMap;\n};\n\nexports = module.exports = ImageChooser;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImltYWdlQ2hvb3Nlci5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCIkIiwiXyIsIm5vb3AiLCJldnQiLCJzdG9wUHJvcGFnYXRpb24iLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wIiwiSW1hZ2VDaG9vc2VyIiwiaWQiLCJlbCIsIm9wdGlvbnMiLCJleHRlbmQiLCJFdmVudHMiLCJsaXN0ZW5lcnMiLCJfZmlsZU1hcCIsInNldCIsImRyb3Bib3giLCJnZXQiLCJ0eXBlcyIsImhhbmRsZURyb3AiLCJlIiwiZGF0YVRyYW5zZmVyIiwiZmlsZXMiLCJsZW5ndGgiLCJoYW5kbGVOZXdJbWFnZSIsImltYWdlQ2hvc2VuIiwiZmlsZSIsInBhc3NpdmUiLCJhZGRFdmVudExpc3RlbmVyIiwiZHJvcExpc3RlbmVyIiwiYmluZCIsImFkZENsYXNzIiwiaHRtbCIsInRleHQiLCJjc3MiLCJjdXJzb3IiLCJhcHBlbmQiLCJvbiIsImNsaWNrIiwiY2hhbmdlSGFuZGxlciIsInByb3RvdHlwZSIsInJlYWRlciIsIkZpbGVSZWFkZXIiLCJkYXRhIiwidGFyZ2V0IiwicmVzdWx0IiwidHJhbnNjb2RlIiwiaW1nIiwiSW1hZ2UiLCJjYW52YXMiLCJjdHgiLCJnZXRDb250ZXh0IiwibWF4V2lkdGgiLCJtYXhIZWlnaHQiLCJ3Iiwid2lkdGgiLCJoIiwiaGVpZ2h0IiwiTWF0aCIsImZsb29yIiwiY2xlYXJSZWN0IiwiZHJhd0ltYWdlIiwianBlZyIsInRvRGF0YVVSTCIsInNldEltYWdlIiwidHJpZ2dlciIsInNyYyIsInJlYWRBc0RhdGFVUkwiLCJyYW5kb21TdHJpbmciLCJwb3NzaWJsZSIsImkiLCJjaGFyQXQiLCJyYW5kb20iLCJjcmVhdGUiLCJyZXQiLCJnZXRJbWFnZSIsImltYWdlIiwiZ2V0SW1hZ2VGaWxlIiwiZmluZCIsImhpZGUiLCJkZXN0cm95IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIm9mZiIsInJlbW92ZSIsImVtcHR5IiwicmVtb3ZlQ2xh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QUFDQWMsU0FBUWlFLG1CQUFSLENBQTRCLE1BQTVCLEVBQW9DLEtBQUtwRSxTQUFMLENBQWVnQixZQUFuRCxFQUFpRSxLQUFqRTs7QUFFQSxNQUFLcEIsRUFBTCxDQUFReUUsR0FBUixDQUFZLE9BQVosRUFBcUIsS0FBS3JFLFNBQUwsQ0FBZXlCLEtBQXBDO0FBQ0F0QyxHQUFFLFNBQVMsS0FBS1EsRUFBaEIsRUFBb0IwRSxHQUFwQixDQUF3QixPQUF4QixFQUFpQzVFLFFBQWpDO0FBQ0FOLEdBQUUsU0FBUyxLQUFLUSxFQUFoQixFQUFvQjBFLEdBQXBCLENBQXdCLFFBQXhCLEVBQWtDLEtBQUtyRSxTQUFMLENBQWUwQixhQUFqRDs7QUFFQXZDLEdBQUUsU0FBUyxLQUFLUSxFQUFoQixFQUFvQjJFLE1BQXBCOztBQUVBLE1BQUsxRSxFQUFMLENBQVEyRSxLQUFSLEdBQWdCQyxXQUFoQixDQUE0QixjQUE1QixFQUE0Q25ELEdBQTVDLENBQWdELEVBQUUsb0JBQW9CLEVBQXRCLEVBQWhEO0FBQ0EsS0FBSSxLQUFLeEIsT0FBTCxDQUFhMEMsUUFBYixJQUF5QixLQUFLMUMsT0FBTCxDQUFhMkMsU0FBMUMsRUFDQyxLQUFLNUMsRUFBTCxDQUFReUIsR0FBUixDQUFZLEVBQUVxQixPQUFPLEVBQVQsRUFBYUUsUUFBUSxFQUFyQixFQUFaOztBQUVELFFBQU8sS0FBS2hELEVBQVo7QUFDQSxRQUFPLEtBQUttRSxLQUFaO0FBQ0EsUUFBTyxLQUFLL0QsU0FBWjtBQUNBLFFBQU8sS0FBS0MsUUFBWjtBQUNBLENBeEJEOztBQTBCQXdFLFVBQVVDLE9BQU9ELE9BQVAsR0FBaUIvRSxZQUEzQiIsImZpbGUiOiJpbWFnZUNob29zZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcblxuY29uc3Qgbm9vcCA9IGZ1bmN0aW9uKGV2dCkge1xuXHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xufTtcblxuY29uc3Qgc3RvcFByb3AgPSBmdW5jdGlvbihldnQpIHtcblx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xufTtcblxuY29uc3QgSW1hZ2VDaG9vc2VyID0gZnVuY3Rpb24oaWQsIGVsLCBvcHRpb25zKSB7XG5cdF8uZXh0ZW5kKHRoaXMsIEJhY2tib25lLkV2ZW50cyk7XG5cdHRoaXMubGlzdGVuZXJzID0ge307XG5cdHRoaXMuX2ZpbGVNYXAgPSB7fTtcblx0dGhpcy5zZXQgPSBmYWxzZTtcblxuXHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG5cdHRoaXMuZWwgPSBlbDtcblx0dGhpcy5pZCA9IGlkO1xuXHRjb25zdCBkcm9wYm94ID0gZWwuZ2V0KDApO1xuXG5cdGxldCB0eXBlcyA9IFwiaW1hZ2UvKlwiO1xuXHRpZiAob3B0aW9ucy50eXBlcylcblx0XHR0eXBlcyA9IG9wdGlvbnMudHlwZXM7XG5cblx0Y29uc3QgaGFuZGxlRHJvcCA9IGUgPT4ge1xuXHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0aWYgKGUuZGF0YVRyYW5zZmVyLmZpbGVzLmxlbmd0aCA+IDApXG5cdFx0XHR0aGlzLmhhbmRsZU5ld0ltYWdlKGUuZGF0YVRyYW5zZmVyLmZpbGVzWzBdKTtcblx0fTtcblxuXHRjb25zdCBpbWFnZUNob3NlbiA9ICgpID0+IHtcblx0XHRjb25zdCBmaWxlID0gJChcIiNmYy1cIiArIHRoaXMuaWQpLmdldCgwKS5maWxlc1swXTtcblx0XHRpZiAoIWZpbGUpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLmhhbmRsZU5ld0ltYWdlKGZpbGUpO1xuXHR9O1xuXG5cdGlmICghb3B0aW9ucy5wYXNzaXZlKSB7XG5cdFx0ZHJvcGJveC5hZGRFdmVudExpc3RlbmVyKFwiZHJhZ2VudGVyXCIsIG5vb3AsIGZhbHNlKTtcblx0XHRkcm9wYm94LmFkZEV2ZW50TGlzdGVuZXIoXCJkcmFnb3ZlclwiLCBub29wLCBmYWxzZSk7XG5cdFx0dGhpcy5saXN0ZW5lcnMuZHJvcExpc3RlbmVyID0gaGFuZGxlRHJvcC5iaW5kKHRoaXMpO1xuXHRcdGRyb3Bib3guYWRkRXZlbnRMaXN0ZW5lcihcImRyb3BcIiwgdGhpcy5saXN0ZW5lcnMuZHJvcExpc3RlbmVyLCBmYWxzZSk7XG5cdH1cblxuXHRlbC5hZGRDbGFzcyhcImltYWdlQ2hvb3NlclwiKS5odG1sKFwiPGRpdiBjbGFzcz0ndGV4dCc+XCIgKyBvcHRpb25zLnRleHQgKyBcIjwvZGl2PlwiKTtcblxuXHRpZiAob3B0aW9ucy5wYXNzaXZlKVxuXHRcdGVsLmNzcyh7IGN1cnNvcjogXCJhdXRvXCIgfSk7XG5cdGVsc2Vcblx0XHRlbC5jc3MoXCJjdXJzb3JcIiwgXCJwb2ludGVyXCIpLmFwcGVuZChcIjxpbnB1dCB0eXBlPSdmaWxlJyBpZD0nZmMtXCIgKyB0aGlzLmlkICsgXCInIGFjY2VwdD0nXCIgKyB0eXBlcyArIFwiJyBzdHlsZT0nZGlzcGxheTpub25lJz48L2lucHV0PlwiKTtcblxuXHRpZiAoIW9wdGlvbnMucGFzc2l2ZSlcblx0XHQkKFwiI2ZjLVwiICsgdGhpcy5pZCkub24oXCJjbGlja1wiLCBzdG9wUHJvcCk7XG5cblx0aWYgKCFvcHRpb25zLnBhc3NpdmUpIHtcblx0XHR0aGlzLmxpc3RlbmVycy5jbGljayA9IGV2dCA9PiB7IGV2dC5zdG9wUHJvcGFnYXRpb24oKTsgZXZ0LnByZXZlbnREZWZhdWx0KCk7ICQoXCIjZmMtXCIgKyB0aGlzLmlkKS5nZXQoMCkuY2xpY2soKTsgfTtcblx0XHR0aGlzLmVsLm9uKFwiY2xpY2tcIiwgdGhpcy5saXN0ZW5lcnMuY2xpY2spO1xuXHRcdHRoaXMubGlzdGVuZXJzLmNoYW5nZUhhbmRsZXIgPSBpbWFnZUNob3Nlbi5iaW5kKHRoaXMpO1xuXHRcdCQoXCIjZmMtXCIgKyB0aGlzLmlkKS5vbihcImNoYW5nZVwiLCB0aGlzLmxpc3RlbmVycy5jaGFuZ2VIYW5kbGVyKTtcblx0fVxufTtcblxuSW1hZ2VDaG9vc2VyLnByb3RvdHlwZS5oYW5kbGVOZXdJbWFnZSA9IGZ1bmN0aW9uKGZpbGUpIHtcblx0dGhpcy5fZmlsZU1hcFt0aGlzLmlkXSA9IGZpbGU7XG5cdGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cblx0cmVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsIGUgPT4ge1xuXHRcdGxldCBkYXRhID0gZS50YXJnZXQucmVzdWx0O1xuXG5cdFx0aWYgKHRoaXMub3B0aW9ucy50cmFuc2NvZGUpIHtcblx0XHRcdGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xuXHRcdFx0aW1nLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsICgpID0+IHtcblx0XHRcdFx0Y29uc3QgY2FudmFzID0gJChcIjxjYW52YXMgLz5cIikuZ2V0KDApO1xuXHRcdFx0XHRjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuXG5cdFx0XHRcdGNvbnN0IG1heFdpZHRoID0gdGhpcy5vcHRpb25zLm1heFdpZHRoIHx8IDEwMDA7XG5cdFx0XHRcdGNvbnN0IG1heEhlaWdodCA9IHRoaXMub3B0aW9ucy5tYXhIZWlnaHQgfHwgMTAwMDtcblxuXHRcdFx0XHRsZXQgdyA9IGltZy53aWR0aCwgaCA9IGltZy5oZWlnaHQ7XG5cdFx0XHRcdGlmICh3ID4gbWF4V2lkdGgpIHtcblx0XHRcdFx0XHRoID0gTWF0aC5mbG9vcihoICogKG1heFdpZHRoIC8gdykpO1xuXHRcdFx0XHRcdHcgPSBtYXhXaWR0aDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoaCA+IG1heEhlaWdodCkge1xuXHRcdFx0XHRcdHcgPSBNYXRoLmZsb29yKHcgKiAobWF4SGVpZ2h0IC8gaCkpO1xuXHRcdFx0XHRcdGggPSBtYXhIZWlnaHQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjYW52YXMud2lkdGggPSB3O1xuXHRcdFx0XHRjYW52YXMuaGVpZ2h0ID0gaDtcblx0XHRcdFx0aW1nLndpZHRoID0gdztcblx0XHRcdFx0aW1nLmhlaWdodCA9IGg7XG5cblx0XHRcdFx0aWYgKHRoaXMub3B0aW9ucy5tYXhXaWR0aCB8fCB0aGlzLm9wdGlvbnMubWF4SGVpZ2h0KVxuXHRcdFx0XHRcdHRoaXMuZWwuY3NzKHsgaGVpZ2h0OiBoICsgXCJweFwiLCB3aWR0aDogdyArIFwicHhcIiB9KTtcblxuXHRcdFx0XHRjdHguY2xlYXJSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG5cdFx0XHRcdGNhbnZhcy53aWR0aCA9IGltZy53aWR0aDtcblx0XHRcdFx0Y2FudmFzLmhlaWdodCA9IGltZy5oZWlnaHQ7XG5cblx0XHRcdFx0Y3R4LmRyYXdJbWFnZShpbWcsIDAsIDAsIGltZy53aWR0aCwgaW1nLmhlaWdodCk7XG5cblx0XHRcdFx0aWYgKHRoaXMub3B0aW9ucy5qcGVnKVxuXHRcdFx0XHRcdGRhdGEgPSBjYW52YXMudG9EYXRhVVJMKFwiaW1hZ2UvanBlZ1wiLCAwLjYpO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0ZGF0YSA9IGNhbnZhcy50b0RhdGFVUkwoXCJpbWFnZS9wbmdcIik7XG5cblx0XHRcdFx0dGhpcy5zZXRJbWFnZShkYXRhKTtcblx0XHRcdFx0dGhpcy50cmlnZ2VyKFwiaW1hZ2VDaGFuZ2VcIik7XG5cdFx0XHR9KTtcblx0XHRcdGltZy5zcmMgPSBkYXRhO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMuc2V0SW1hZ2UoZGF0YSk7XG5cdFx0XHR0aGlzLnRyaWdnZXIoXCJpbWFnZUNoYW5nZVwiKTtcblx0XHR9XG5cdH0pO1xuXHRyZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbn07XG5cbmNvbnN0IHJhbmRvbVN0cmluZyA9IGZ1bmN0aW9uKCkge1xuXHRsZXQgdGV4dCA9IFwiXCI7XG5cdGNvbnN0IHBvc3NpYmxlID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OVwiO1xuXG5cdGZvcihsZXQgaSA9IDA7IGkgPCA1OyBpKyspXG5cdFx0dGV4dCArPSBwb3NzaWJsZS5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogcG9zc2libGUubGVuZ3RoKSk7XG5cblx0cmV0dXJuIHRleHQ7XG59O1xuXG5JbWFnZUNob29zZXIuY3JlYXRlID0gZnVuY3Rpb24oZWwsIG9wdGlvbnMgPSB7fSkge1xuXHRpZiAoZWwubGVuZ3RoID09PSAwKVxuXHRcdHJldHVybiBudWxsO1xuXG5cdG9wdGlvbnMudGV4dCA9IG9wdGlvbnMudGV4dCB8fCBcIkNsaWNrIHRvIGNob29zZSBpbWFnZTxici8+T1I8YnIvPkRyYWcgYW5kIGRyb3AgZnJvbSBoYXJkIGRyaXZlXCI7XG5cblx0Y29uc3QgaWQgPSByYW5kb21TdHJpbmcoMTApO1xuXG5cdGNvbnN0IHJldCA9IG5ldyBJbWFnZUNob29zZXIoaWQsIGVsLCBvcHRpb25zKTtcblxuXHRyZXR1cm4gcmV0O1xufTtcblxuSW1hZ2VDaG9vc2VyLnByb3RvdHlwZS5nZXRJbWFnZSA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcy5pbWFnZTtcbn07XG5cbkltYWdlQ2hvb3Nlci5wcm90b3R5cGUuZ2V0SW1hZ2VGaWxlID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiB0aGlzLl9maWxlTWFwW3RoaXMuaWRdO1xufTtcblxuSW1hZ2VDaG9vc2VyLnByb3RvdHlwZS5zZXRJbWFnZSA9IGZ1bmN0aW9uKGltYWdlKSB7XG5cdGlmICghdGhpcy5lbClcblx0XHRyZXR1cm47XG5cblx0dGhpcy5pbWFnZSA9IGltYWdlO1xuXHR0aGlzLmVsLmNzcyh7IFwiYmFja2dyb3VuZC1pbWFnZVwiOiBcInVybCgnXCIgKyBpbWFnZSArIFwiJylcIiB9KS5maW5kKFwiLnRleHRcIikuaGlkZSgpO1xuXHR0aGlzLnNldCA9IHRydWU7XG5cblx0aWYgKHRoaXMub3B0aW9ucy5tYXhXaWR0aClcblx0XHR0aGlzLmVsLmNzcyh7IHdpZHRoOiB0aGlzLm9wdGlvbnMubWF4V2lkdGggKyBcInB4XCIgfSk7XG5cdGlmICh0aGlzLm9wdGlvbnMubWF4SGVpZ2h0KVxuXHRcdHRoaXMuZWwuY3NzKHsgaGVpZ2h0OiB0aGlzLm9wdGlvbnMubWF4SGVpZ2h0ICsgXCJweFwiIH0pO1xufTtcblxuSW1hZ2VDaG9vc2VyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG5cdGlmICghdGhpcy5lbClcblx0XHRyZXR1cm47XG5cblx0Y29uc3QgZHJvcGJveCA9IHRoaXMuZWwuZ2V0KDApO1xuXG5cdGRyb3Bib3gucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImRyYWdlbnRlclwiLCBub29wLCBmYWxzZSk7XG5cdGRyb3Bib3gucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImRyYWdvdmVyXCIsIG5vb3AsIGZhbHNlKTtcblx0ZHJvcGJveC5yZW1vdmVFdmVudExpc3RlbmVyKFwiZHJvcFwiLCB0aGlzLmxpc3RlbmVycy5kcm9wTGlzdGVuZXIsIGZhbHNlKTtcblxuXHR0aGlzLmVsLm9mZihcImNsaWNrXCIsIHRoaXMubGlzdGVuZXJzLmNsaWNrKTtcblx0JChcIiNmYy1cIiArIHRoaXMuaWQpLm9mZihcImNsaWNrXCIsIHN0b3BQcm9wKTtcblx0JChcIiNmYy1cIiArIHRoaXMuaWQpLm9mZihcImNoYW5nZVwiLCB0aGlzLmxpc3RlbmVycy5jaGFuZ2VIYW5kbGVyKTtcblxuXHQkKFwiI2ZjLVwiICsgdGhpcy5pZCkucmVtb3ZlKCk7XG5cblx0dGhpcy5lbC5lbXB0eSgpLnJlbW92ZUNsYXNzKFwiaW1hZ2VDaG9vc2VyXCIpLmNzcyh7IFwiYmFja2dyb3VuZC1pbWFnZVwiOiBcIlwiIH0pO1xuXHRpZiAodGhpcy5vcHRpb25zLm1heFdpZHRoIHx8IHRoaXMub3B0aW9ucy5tYXhIZWlnaHQpXG5cdFx0dGhpcy5lbC5jc3MoeyB3aWR0aDogXCJcIiwgaGVpZ2h0OiBcIlwiIH0pO1xuXG5cdGRlbGV0ZSB0aGlzLmVsO1xuXHRkZWxldGUgdGhpcy5pbWFnZTtcblx0ZGVsZXRlIHRoaXMubGlzdGVuZXJzO1xuXHRkZWxldGUgdGhpcy5fZmlsZU1hcDtcbn07XG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IEltYWdlQ2hvb3NlcjsiXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar qs = require(\"querystring\");\nvar _ = require(\"lodash\");\n\nvar Model = Backbone.Model.extend({\n\tdefaults: {\n\t\tvalue: null\n\t},\n\n\tidAttribute: \"key\"\n});\n\nmodule.exports = Backbone.PageableCollection.extend({\n\tmode: \"infinite\",\n\tmodel: Model,\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\",\n\t\ttotalPages: null,\n\t\ttotalRecords: null\n\t},\n\n\turl: function url() {\n\t\treturn this._url + \"?\" + qs.stringify(this.getParams());\n\t},\n\n\tinitialize: function initialize(items) {\n\t\tvar options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t\tthis._url = options.url;\n\t\tthis._params = {};\n\t\tthis._dynamicParams = options.params || {};\n\n\t\tif (_.includes(this._url, \"?\")) {\n\t\t\tthis._params = qs.parse(this._url.slice(this._url.indexOf(\"?\") + 1));\n\t\t\tthis._url = this._url.slice(0, this._url.indexOf(\"?\"));\n\t\t}\n\t\tthis._params.paged = true;\n\n\t\tthis._map = options.map;\n\n\t\tthis._settings = new Backbone.Model();\n\n\t\tthis.listenTo(this, \"request\", this.onRequest.bind(this));\n\t\tthis.listenTo(this, \"sync\", this.onSynced.bind(this));\n\t},\n\n\tgetParams: function getParams() {\n\t\tvar params = {};\n\t\tif (_.isFunction(this._dynamicParams)) _.extend(params, this._dynamicParams());else _.extend(params, this._dynamicParams);\n\n\t\tvar ret = _.extend(params, this._params);\n\t\t_.each(ret, function (val, key) {\n\t\t\tif (_.isUndefined(val)) delete ret[key];\n\t\t\tif (_.isArray(val) && !val.length) delete ret[key];\n\t\t});\n\n\t\treturn ret;\n\t},\n\n\tget: function get() {\n\t\tfor (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n\t\t\targs[_key] = arguments[_key];\n\t\t}\n\n\t\tthis._settings.get.apply(this._settings, args);\n\t},\n\n\tonRequest: function onRequest() {\n\t\tthis._settings.set({ fetching: true });\n\t},\n\n\tonSynced: function onSynced() {\n\t\tthis._settings.set({ fetching: false });\n\t},\n\n\tparseState: function parseState(resp) {\n\t\tvar _this = this;\n\n\t\t// Capture arbitrary response fields\n\t\t_.each(resp, function (k, v) {\n\t\t\tif (k !== \"total\" && k !== \"rows\") _this._settings.set({ k: v });\n\t\t});\n\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\tvar rows = resp.rows;\n\t\tif (this._map) return _.map(rows, this._map);\n\t\treturn rows;\n\t},\n\n\tparseLinks: function parseLinks(resp) {\n\t\tvar page = this.state.currentPage;\n\t\tvar pageSize = this.state.pageSize;\n\t\tvar total = resp.total;\n\n\t\tvar hasNext = Math.ceil(total / pageSize) > page;\n\n\t\tvar ret = {};\n\n\t\tif (hasNext) {\n\t\t\tret.first = this._url + \"?\" + qs.stringify(this.getParams()) + \"&page=1\";\n\t\t\tret.next = this._url + \"?\" + qs.stringify(this.getParams()) + \"&page=\" + (page + 1);\n\t\t\tret.last = this._url + \"?\" + qs.stringify(this.getParams()) + \"&page=\" + Math.ceil(total / pageSize);\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tsetSearchTerms: function setSearchTerms(terms, silent) {\n\t\tvar _this2 = this;\n\n\t\tthis.searchTerms = _.toLower(terms);\n\n\t\tif (terms) this._params.textFilter = terms;else this._params.textFilter = \"\";\n\n\t\tthis.fullCollection.reset([]);\n\n\t\t_.each(this.links, function (v, k) {\n\t\t\tif (!v || _.isFunction(v) || !parseInt(k, 10)) return;\n\n\t\t\t_this2.links[k] = _this2._url + \"?\" + qs.stringify(_this2.getParams()) + \"&page=\" + k;\n\t\t});\n\n\t\tif (!silent) this.getFirstPage({ fetch: true });\n\t},\n\n\tsetServerFilters: function setServerFilters(filters) {\n\t\tvar _this3 = this;\n\n\t\tthis.fullCollection.reset([]);\n\n\t\tthis._params = _.reduce(filters, function (sum, num, key) {\n\t\t\tif (_.isArray(num) && num.length === 0) return sum;\n\t\t\tsum[key] = num;\n\t\t\treturn sum;\n\t\t}, {});\n\n\t\t_.each(this.links, function (v, k) {\n\t\t\tif (!v || _.isFunction(v) || !parseInt(k, 10)) return;\n\n\t\t\t_this3.links[k] = _this3._url + \"?\" + qs.stringify(_this3.getParams()) + \"&page=\" + k;\n\t\t});\n\n\t\treturn this.getFirstPage({ fetch: true });\n\t},\n\n\tregenerateLinks: function regenerateLinks() {\n\t\tvar _this4 = this;\n\n\t\t_.each(this.links, function (v, k) {\n\t\t\tif (!v || _.isFunction(v) || !parseInt(k, 10)) return;\n\n\t\t\t_this4.links[k] = _this4._url + \"?\" + qs.stringify(_this4.getParams()) + \"&page=\" + k;\n\t\t});\n\t},\n\n\tdynaFilter: function dynaFilter(filters) {\n\t\tthis.fullCollection.reset([]);\n\n\t\t_.extend(this._params, filters);\n\t\tthis.regenerateLinks();\n\n\t\tthis.getFirstPage({ fetch: true });\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZmluaXRlQ29sbGVjdGlvbi5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCJxcyIsIl8iLCJNb2RlbCIsImV4dGVuZCIsImRlZmF1bHRzIiwidmFsdWUiLCJpZEF0dHJpYnV0ZSIsIm1vZHVsZSIsImV4cG9ydHMiLCJQYWdlYWJsZUNvbGxlY3Rpb24iLCJtb2RlIiwibW9kZWwiLCJxdWVyeVBhcmFtcyIsInBhZ2VTaXplIiwic29ydEtleSIsInRvdGFsUGFnZXMiLCJ0b3RhbFJlY29yZHMiLCJ1cmwiLCJfdXJsIiwic3RyaW5naWZ5IiwiZ2V0UGFyYW1zIiwiaW5pdGlhbGl6ZSIsIml0ZW1zIiwib3B0aW9ucyIsIl9wYXJhbXMiLCJfZHluYW1pY1BhcmFtcyIsInBhcmFtcyIsImluY2x1ZGVzIiwicGFyc2UiLCJzbGljZSIsImluZGV4T2YiLCJwYWdlZCIsIl9tYXAiLCJtYXAiLCJfc2V0dGluZ3MiLCJsaXN0ZW5UbyIsIm9uUmVxdWVzdCIsImJpbmQiLCJvblN5bmNlZCIsImlzRnVuY3Rpb24iLCJyZXQiLCJlYWNoIiwidmFsIiwia2V5IiwiaXNVbmRlZmluZWQiLCJpc0FycmF5IiwibGVuZ3RoIiwiZ2V0IiwiYXJncyIsImFwcGx5Iiwic2V0IiwiZmV0Y2hpbmciLCJwYXJzZVN0YXRlIiwicmVzcCIsImsiLCJ2IiwidG90YWwiLCJwYXJzZVJlY29yZHMiLCJyb3dzIiwicGFyc2VMaW5rcyIsInBhZ2UiLCJzdGF0ZSIsImN1cnJlbnRQYWdlIiwiaGFzTmV4dCIsIk1hdGgiLCJjZWlsIiwiZmlyc3QiLCJuZXh0IiwibGFzdCIsInNldFNlYXJjaFRlcm1zIiwidGVybXMiLCJzaWxlbnQiLCJzZWFyY2hUZXJtcyIsInRvTG93ZXIiLCJ0ZXh0RmlsdGVyIiwiZnVsbENvbGxlY3Rpb24iLCJyZXNldCIsImxpbmtzIiwicGFyc2VJbnQiLCJnZXRGaXJzdFBhZ2UiLCJmZXRjaCIsInNldFNlcnZlckZpbHRlcnMiLCJmaWx0ZXJzIiwicmVkdWNlIiwic3VtIiwibnVtIiwicmVnZW5lcmF0ZUxpbmtzIiwiZHluYUZpbHRlciJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUMsS0FBS0QsUUFBUSxhQUFSLENBQVg7QUFDQSxJQUFNRSxJQUFJRixRQUFRLFFBQVIsQ0FBVjs7QUFFQSxJQUFNRyxRQUFRSixTQUFTSSxLQUFULENBQWVDLE1BQWYsQ0FBc0I7QUFDbkNDLFdBQVU7QUFDVEMsU0FBTztBQURFLEVBRHlCOztBQUtuQ0MsY0FBYTtBQUxzQixDQUF0QixDQUFkOztBQVFBQyxPQUFPQyxPQUFQLEdBQWlCVixTQUFTVyxrQkFBVCxDQUE0Qk4sTUFBNUIsQ0FBbUM7QUFDbkRPLE9BQU0sVUFENkM7QUFFbkRDLFFBQU9ULEtBRjRDOztBQUluRFUsY0FBYTtBQUNaQyxZQUFVLFVBREU7QUFFWkMsV0FBUyxRQUZHO0FBR1pDLGNBQVksSUFIQTtBQUlaQyxnQkFBYztBQUpGLEVBSnNDOztBQVduREMsTUFBSyxlQUFXO0FBQ2YsU0FBTyxLQUFLQyxJQUFMLEdBQVksR0FBWixHQUFrQmxCLEdBQUdtQixTQUFILENBQWEsS0FBS0MsU0FBTCxFQUFiLENBQXpCO0FBQ0EsRUFia0Q7O0FBZW5EQyxhQUFZLG9CQUFTQyxLQUFULEVBQThCO0FBQUEsTUFBZEMsT0FBYyx1RUFBSixFQUFJOztBQUN6QyxPQUFLTCxJQUFMLEdBQVlLLFFBQVFOLEdBQXBCO0FBQ0EsT0FBS08sT0FBTCxHQUFlLEVBQWY7QUFDQSxPQUFLQyxjQUFMLEdBQXNCRixRQUFRRyxNQUFSLElBQWtCLEVBQXhDOztBQUVBLE1BQUl6QixFQUFFMEIsUUFBRixDQUFXLEtBQUtULElBQWhCLEVBQXNCLEdBQXRCLENBQUosRUFBZ0M7QUFDL0IsUUFBS00sT0FBTCxHQUFleEIsR0FBRzRCLEtBQUgsQ0FBUyxLQUFLVixJQUFMLENBQVVXLEtBQVYsQ0FBZ0IsS0FBS1gsSUFBTCxDQUFVWSxPQUFWLENBQWtCLEdBQWxCLElBQXlCLENBQXpDLENBQVQsQ0FBZjtBQUNBLFFBQUtaLElBQUwsR0FBWSxLQUFLQSxJQUFMLENBQVVXLEtBQVYsQ0FBZ0IsQ0FBaEIsRUFBbUIsS0FBS1gsSUFBTCxDQUFVWSxPQUFWLENBQWtCLEdBQWxCLENBQW5CLENBQVo7QUFDQTtBQUNELE9BQUtOLE9BQUwsQ0FBYU8sS0FBYixHQUFxQixJQUFyQjs7QUFFQSxPQUFLQyxJQUFMLEdBQVlULFFBQVFVLEdBQXBCOztBQUVBLE9BQUtDLFNBQUwsR0FBaUIsSUFBSXBDLFNBQVNJLEtBQWIsRUFBakI7O0FBRUEsT0FBS2lDLFFBQUwsQ0FBYyxJQUFkLEVBQW9CLFNBQXBCLEVBQStCLEtBQUtDLFNBQUwsQ0FBZUMsSUFBZixDQUFvQixJQUFwQixDQUEvQjtBQUNBLE9BQUtGLFFBQUwsQ0FBYyxJQUFkLEVBQW9CLE1BQXBCLEVBQTRCLEtBQUtHLFFBQUwsQ0FBY0QsSUFBZCxDQUFtQixJQUFuQixDQUE1QjtBQUNBLEVBaENrRDs7QUFrQ25EakIsWUFBVyxxQkFBVztBQUNyQixNQUFNTSxTQUFTLEVBQWY7QUFDQSxNQUFJekIsRUFBRXNDLFVBQUYsQ0FBYSxLQUFLZCxjQUFsQixDQUFKLEVBQ0N4QixFQUFFRSxNQUFGLENBQVN1QixNQUFULEVBQWlCLEtBQUtELGNBQUwsRUFBakIsRUFERCxLQUdDeEIsRUFBRUUsTUFBRixDQUFTdUIsTUFBVCxFQUFpQixLQUFLRCxjQUF0Qjs7QUFFRCxNQUFNZSxNQUFNdkMsRUFBRUUsTUFBRixDQUFTdUIsTUFBVCxFQUFpQixLQUFLRixPQUF0QixDQUFaO0FBQ0F2QixJQUFFd0MsSUFBRixDQUFPRCxHQUFQLEVBQVksVUFBQ0UsR0FBRCxFQUFNQyxHQUFOLEVBQWM7QUFDekIsT0FBSTFDLEVBQUUyQyxXQUFGLENBQWNGLEdBQWQsQ0FBSixFQUNDLE9BQU9GLElBQUlHLEdBQUosQ0FBUDtBQUNELE9BQUkxQyxFQUFFNEMsT0FBRixDQUFVSCxHQUFWLEtBQWtCLENBQUNBLElBQUlJLE1BQTNCLEVBQ0MsT0FBT04sSUFBSUcsR0FBSixDQUFQO0FBQ0QsR0FMRDs7QUFPQSxTQUFPSCxHQUFQO0FBQ0EsRUFsRGtEOztBQW9EbkRPLE1BQUssZUFBa0I7QUFBQSxvQ0FBTkMsSUFBTTtBQUFOQSxPQUFNO0FBQUE7O0FBQ3RCLE9BQUtkLFNBQUwsQ0FBZWEsR0FBZixDQUFtQkUsS0FBbkIsQ0FBeUIsS0FBS2YsU0FBOUIsRUFBeUNjLElBQXpDO0FBQ0EsRUF0RGtEOztBQXdEbkRaLFlBQVcscUJBQVc7QUFDckIsT0FBS0YsU0FBTCxDQUFlZ0IsR0FBZixDQUFtQixFQUFFQyxVQUFVLElBQVosRUFBbkI7QUFDQSxFQTFEa0Q7O0FBNERuRGIsV0FBVSxvQkFBVztBQUNwQixPQUFLSixTQUFMLENBQWVnQixHQUFmLENBQW1CLEVBQUVDLFVBQVUsS0FBWixFQUFuQjtBQUNBLEVBOURrRDs7QUFnRW5EQyxhQUFZLG9CQUFTQyxJQUFULEVBQWU7QUFBQTs7QUFDMUI7QUFDQXBELElBQUV3QyxJQUFGLENBQU9ZLElBQVAsRUFBYSxVQUFDQyxDQUFELEVBQUlDLENBQUosRUFBVTtBQUN0QixPQUFJRCxNQUFNLE9BQU4sSUFBaUJBLE1BQU0sTUFBM0IsRUFDQyxNQUFLcEIsU0FBTCxDQUFlZ0IsR0FBZixDQUFtQixFQUFFSSxHQUFHQyxDQUFMLEVBQW5CO0FBQ0QsR0FIRDs7QUFLQSxTQUFPLEVBQUV2QyxjQUFjcUMsS0FBS0csS0FBckIsRUFBUDtBQUNBLEVBeEVrRDs7QUEwRW5EQyxlQUFjLHNCQUFTSixJQUFULEVBQWU7QUFDNUIsTUFBTUssT0FBT0wsS0FBS0ssSUFBbEI7QUFDQSxNQUFJLEtBQUsxQixJQUFULEVBQ0MsT0FBTy9CLEVBQUVnQyxHQUFGLENBQU15QixJQUFOLEVBQVksS0FBSzFCLElBQWpCLENBQVA7QUFDRCxTQUFPMEIsSUFBUDtBQUNBLEVBL0VrRDs7QUFpRm5EQyxhQUFZLG9CQUFTTixJQUFULEVBQWU7QUFDMUIsTUFBTU8sT0FBTyxLQUFLQyxLQUFMLENBQVdDLFdBQXhCO0FBQ0EsTUFBTWpELFdBQVcsS0FBS2dELEtBQUwsQ0FBV2hELFFBQTVCO0FBQ0EsTUFBTTJDLFFBQVFILEtBQUtHLEtBQW5COztBQUVBLE1BQU1PLFVBQVVDLEtBQUtDLElBQUwsQ0FBVVQsUUFBUTNDLFFBQWxCLElBQThCK0MsSUFBOUM7O0FBRUEsTUFBTXBCLE1BQU0sRUFBWjs7QUFFQSxNQUFJdUIsT0FBSixFQUFhO0FBQ1p2QixPQUFJMEIsS0FBSixHQUFZLEtBQUtoRCxJQUFMLEdBQVksR0FBWixHQUFrQmxCLEdBQUdtQixTQUFILENBQWEsS0FBS0MsU0FBTCxFQUFiLENBQWxCLEdBQW1ELFNBQS9EO0FBQ0FvQixPQUFJMkIsSUFBSixHQUFXLEtBQUtqRCxJQUFMLEdBQVksR0FBWixHQUFrQmxCLEdBQUdtQixTQUFILENBQWEsS0FBS0MsU0FBTCxFQUFiLENBQWxCLEdBQW1ELFFBQW5ELElBQStEd0MsT0FBTyxDQUF0RSxDQUFYO0FBQ0FwQixPQUFJNEIsSUFBSixHQUFXLEtBQUtsRCxJQUFMLEdBQVksR0FBWixHQUFrQmxCLEdBQUdtQixTQUFILENBQWEsS0FBS0MsU0FBTCxFQUFiLENBQWxCLEdBQW1ELFFBQW5ELEdBQThENEMsS0FBS0MsSUFBTCxDQUFVVCxRQUFRM0MsUUFBbEIsQ0FBekU7QUFDQTs7QUFFRCxTQUFPMkIsR0FBUDtBQUNBLEVBakdrRDs7QUFtR25ENkIsaUJBQWdCLHdCQUFTQyxLQUFULEVBQWdCQyxNQUFoQixFQUF3QjtBQUFBOztBQUN2QyxPQUFLQyxXQUFMLEdBQW1CdkUsRUFBRXdFLE9BQUYsQ0FBVUgsS0FBVixDQUFuQjs7QUFFQSxNQUFJQSxLQUFKLEVBQ0MsS0FBSzlDLE9BQUwsQ0FBYWtELFVBQWIsR0FBMEJKLEtBQTFCLENBREQsS0FHQyxLQUFLOUMsT0FBTCxDQUFha0QsVUFBYixHQUEwQixFQUExQjs7QUFFRCxPQUFLQyxjQUFMLENBQW9CQyxLQUFwQixDQUEwQixFQUExQjs7QUFFQTNFLElBQUV3QyxJQUFGLENBQU8sS0FBS29DLEtBQVosRUFBbUIsVUFBQ3RCLENBQUQsRUFBSUQsQ0FBSixFQUFVO0FBQzVCLE9BQUksQ0FBQ0MsQ0FBRCxJQUFNdEQsRUFBRXNDLFVBQUYsQ0FBYWdCLENBQWIsQ0FBTixJQUF5QixDQUFDdUIsU0FBU3hCLENBQVQsRUFBWSxFQUFaLENBQTlCLEVBQ0M7O0FBRUQsVUFBS3VCLEtBQUwsQ0FBV3ZCLENBQVgsSUFBZ0IsT0FBS3BDLElBQUwsR0FBWSxHQUFaLEdBQWtCbEIsR0FBR21CLFNBQUgsQ0FBYSxPQUFLQyxTQUFMLEVBQWIsQ0FBbEIsR0FBbUQsUUFBbkQsR0FBOERrQyxDQUE5RTtBQUNBLEdBTEQ7O0FBT0EsTUFBSSxDQUFDaUIsTUFBTCxFQUNDLEtBQUtRLFlBQUwsQ0FBa0IsRUFBRUMsT0FBTyxJQUFULEVBQWxCO0FBQ0QsRUF0SGtEOztBQXdIbkRDLG1CQUFrQiwwQkFBU0MsT0FBVCxFQUFrQjtBQUFBOztBQUNuQyxPQUFLUCxjQUFMLENBQW9CQyxLQUFwQixDQUEwQixFQUExQjs7QUFFQSxPQUFLcEQsT0FBTCxHQUFldkIsRUFBRWtGLE1BQUYsQ0FBU0QsT0FBVCxFQUFrQixVQUFDRSxHQUFELEVBQU1DLEdBQU4sRUFBVzFDLEdBQVgsRUFBbUI7QUFDbkQsT0FBSTFDLEVBQUU0QyxPQUFGLENBQVV3QyxHQUFWLEtBQWtCQSxJQUFJdkMsTUFBSixLQUFlLENBQXJDLEVBQ0MsT0FBT3NDLEdBQVA7QUFDREEsT0FBSXpDLEdBQUosSUFBVzBDLEdBQVg7QUFDQSxVQUFPRCxHQUFQO0FBQ0EsR0FMYyxFQUtaLEVBTFksQ0FBZjs7QUFPQW5GLElBQUV3QyxJQUFGLENBQU8sS0FBS29DLEtBQVosRUFBbUIsVUFBQ3RCLENBQUQsRUFBSUQsQ0FBSixFQUFVO0FBQzVCLE9BQUksQ0FBQ0MsQ0FBRCxJQUFNdEQsRUFBRXNDLFVBQUYsQ0FBYWdCLENBQWIsQ0FBTixJQUF5QixDQUFDdUIsU0FBU3hCLENBQVQsRUFBWSxFQUFaLENBQTlCLEVBQ0M7O0FBRUQsVUFBS3VCLEtBQUwsQ0FBV3ZCLENBQVgsSUFBZ0IsT0FBS3BDLElBQUwsR0FBWSxHQUFaLEdBQWtCbEIsR0FBR21CLFNBQUgsQ0FBYSxPQUFLQyxTQUFMLEVBQWIsQ0FBbEIsR0FBbUQsUUFBbkQsR0FBOERrQyxDQUE5RTtBQUNBLEdBTEQ7O0FBT0EsU0FBTyxLQUFLeUIsWUFBTCxDQUFrQixFQUFFQyxPQUFPLElBQVQsRUFBbEIsQ0FBUDtBQUNBLEVBMUlrRDs7QUE0SW5ETSxrQkFBaUIsMkJBQVc7QUFBQTs7QUFDM0JyRixJQUFFd0MsSUFBRixDQUFPLEtBQUtvQyxLQUFaLEVBQW1CLFVBQUN0QixDQUFELEVBQUlELENBQUosRUFBVTtBQUM1QixPQUFJLENBQUNDLENBQUQsSUFBTXRELEVBQUVzQyxVQUFGLENBQWFnQixDQUFiLENBQU4sSUFBeUIsQ0FBQ3VCLFNBQVN4QixDQUFULEVBQVksRUFBWixDQUE5QixFQUNDOztBQUVELFVBQUt1QixLQUFMLENBQVd2QixDQUFYLElBQWdCLE9BQUtwQyxJQUFMLEdBQVksR0FBWixHQUFrQmxCLEdBQUdtQixTQUFILENBQWEsT0FBS0MsU0FBTCxFQUFiLENBQWxCLEdBQW1ELFFBQW5ELEdBQThEa0MsQ0FBOUU7QUFDQSxHQUxEO0FBTUEsRUFuSmtEOztBQXFKbkRpQyxhQUFZLG9CQUFTTCxPQUFULEVBQWtCO0FBQzdCLE9BQUtQLGNBQUwsQ0FBb0JDLEtBQXBCLENBQTBCLEVBQTFCOztBQUVBM0UsSUFBRUUsTUFBRixDQUFTLEtBQUtxQixPQUFkLEVBQXVCMEQsT0FBdkI7QUFDQSxPQUFLSSxlQUFMOztBQUVBLE9BQUtQLFlBQUwsQ0FBa0IsRUFBRUMsT0FBTyxJQUFULEVBQWxCO0FBQ0E7QUE1SmtELENBQW5DLENBQWpCIiwiZmlsZSI6ImluZmluaXRlQ29sbGVjdGlvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCBxcyA9IHJlcXVpcmUoXCJxdWVyeXN0cmluZ1wiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuXG5jb25zdCBNb2RlbCA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7XG5cdFx0dmFsdWU6IG51bGwsXG5cdH0sXG5cblx0aWRBdHRyaWJ1dGU6IFwia2V5XCIsXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5QYWdlYWJsZUNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZTogXCJpbmZpbml0ZVwiLFxuXHRtb2RlbDogTW9kZWwsXG5cblx0cXVlcnlQYXJhbXM6IHtcblx0XHRwYWdlU2l6ZTogXCJwYWdlU2l6ZVwiLFxuXHRcdHNvcnRLZXk6IFwic29ydEJ5XCIsXG5cdFx0dG90YWxQYWdlczogbnVsbCxcblx0XHR0b3RhbFJlY29yZHM6IG51bGwsXG5cdH0sXG5cblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5fdXJsICsgXCI/XCIgKyBxcy5zdHJpbmdpZnkodGhpcy5nZXRQYXJhbXMoKSk7XG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oaXRlbXMsIG9wdGlvbnMgPSB7fSkge1xuXHRcdHRoaXMuX3VybCA9IG9wdGlvbnMudXJsO1xuXHRcdHRoaXMuX3BhcmFtcyA9IHt9O1xuXHRcdHRoaXMuX2R5bmFtaWNQYXJhbXMgPSBvcHRpb25zLnBhcmFtcyB8fCB7fTtcblxuXHRcdGlmIChfLmluY2x1ZGVzKHRoaXMuX3VybCwgXCI/XCIpKSB7XG5cdFx0XHR0aGlzLl9wYXJhbXMgPSBxcy5wYXJzZSh0aGlzLl91cmwuc2xpY2UodGhpcy5fdXJsLmluZGV4T2YoXCI/XCIpICsgMSkpO1xuXHRcdFx0dGhpcy5fdXJsID0gdGhpcy5fdXJsLnNsaWNlKDAsIHRoaXMuX3VybC5pbmRleE9mKFwiP1wiKSk7XG5cdFx0fVxuXHRcdHRoaXMuX3BhcmFtcy5wYWdlZCA9IHRydWU7XG5cblx0XHR0aGlzLl9tYXAgPSBvcHRpb25zLm1hcDtcblxuXHRcdHRoaXMuX3NldHRpbmdzID0gbmV3IEJhY2tib25lLk1vZGVsKCk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHRoaXMsIFwicmVxdWVzdFwiLCB0aGlzLm9uUmVxdWVzdC5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMsIFwic3luY1wiLCB0aGlzLm9uU3luY2VkLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdGdldFBhcmFtczogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgcGFyYW1zID0ge307XG5cdFx0aWYgKF8uaXNGdW5jdGlvbih0aGlzLl9keW5hbWljUGFyYW1zKSlcblx0XHRcdF8uZXh0ZW5kKHBhcmFtcywgdGhpcy5fZHluYW1pY1BhcmFtcygpKTtcblx0XHRlbHNlXG5cdFx0XHRfLmV4dGVuZChwYXJhbXMsIHRoaXMuX2R5bmFtaWNQYXJhbXMpO1xuXG5cdFx0Y29uc3QgcmV0ID0gXy5leHRlbmQocGFyYW1zLCB0aGlzLl9wYXJhbXMpO1xuXHRcdF8uZWFjaChyZXQsICh2YWwsIGtleSkgPT4ge1xuXHRcdFx0aWYgKF8uaXNVbmRlZmluZWQodmFsKSlcblx0XHRcdFx0ZGVsZXRlIHJldFtrZXldO1xuXHRcdFx0aWYgKF8uaXNBcnJheSh2YWwpICYmICF2YWwubGVuZ3RoKVxuXHRcdFx0XHRkZWxldGUgcmV0W2tleV07XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXG5cdGdldDogZnVuY3Rpb24oLi4uYXJncykge1xuXHRcdHRoaXMuX3NldHRpbmdzLmdldC5hcHBseSh0aGlzLl9zZXR0aW5ncywgYXJncyk7XG5cdH0sXG5cblx0b25SZXF1ZXN0OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLl9zZXR0aW5ncy5zZXQoeyBmZXRjaGluZzogdHJ1ZSB9KTtcblx0fSxcblxuXHRvblN5bmNlZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5fc2V0dGluZ3Muc2V0KHsgZmV0Y2hpbmc6IGZhbHNlIH0pO1xuXHR9LFxuXG5cdHBhcnNlU3RhdGU6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHQvLyBDYXB0dXJlIGFyYml0cmFyeSByZXNwb25zZSBmaWVsZHNcblx0XHRfLmVhY2gocmVzcCwgKGssIHYpID0+IHtcblx0XHRcdGlmIChrICE9PSBcInRvdGFsXCIgJiYgayAhPT0gXCJyb3dzXCIpXG5cdFx0XHRcdHRoaXMuX3NldHRpbmdzLnNldCh7IGs6IHYgfSk7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4geyB0b3RhbFJlY29yZHM6IHJlc3AudG90YWwgfTtcblx0fSxcblxuXHRwYXJzZVJlY29yZHM6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRjb25zdCByb3dzID0gcmVzcC5yb3dzO1xuXHRcdGlmICh0aGlzLl9tYXApXG5cdFx0XHRyZXR1cm4gXy5tYXAocm93cywgdGhpcy5fbWFwKTtcblx0XHRyZXR1cm4gcm93cztcblx0fSxcblxuXHRwYXJzZUxpbmtzOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0Y29uc3QgcGFnZSA9IHRoaXMuc3RhdGUuY3VycmVudFBhZ2U7XG5cdFx0Y29uc3QgcGFnZVNpemUgPSB0aGlzLnN0YXRlLnBhZ2VTaXplO1xuXHRcdGNvbnN0IHRvdGFsID0gcmVzcC50b3RhbDtcblxuXHRcdGNvbnN0IGhhc05leHQgPSBNYXRoLmNlaWwodG90YWwgLyBwYWdlU2l6ZSkgPiBwYWdlO1xuXG5cdFx0Y29uc3QgcmV0ID0ge307XG5cblx0XHRpZiAoaGFzTmV4dCkge1xuXHRcdFx0cmV0LmZpcnN0ID0gdGhpcy5fdXJsICsgXCI/XCIgKyBxcy5zdHJpbmdpZnkodGhpcy5nZXRQYXJhbXMoKSkgKyBcIiZwYWdlPTFcIjtcblx0XHRcdHJldC5uZXh0ID0gdGhpcy5fdXJsICsgXCI/XCIgKyBxcy5zdHJpbmdpZnkodGhpcy5nZXRQYXJhbXMoKSkgKyBcIiZwYWdlPVwiICsgKHBhZ2UgKyAxKTtcblx0XHRcdHJldC5sYXN0ID0gdGhpcy5fdXJsICsgXCI/XCIgKyBxcy5zdHJpbmdpZnkodGhpcy5nZXRQYXJhbXMoKSkgKyBcIiZwYWdlPVwiICsgTWF0aC5jZWlsKHRvdGFsIC8gcGFnZVNpemUpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXQ7XG5cdH0sXG5cblx0c2V0U2VhcmNoVGVybXM6IGZ1bmN0aW9uKHRlcm1zLCBzaWxlbnQpIHtcblx0XHR0aGlzLnNlYXJjaFRlcm1zID0gXy50b0xvd2VyKHRlcm1zKTtcblxuXHRcdGlmICh0ZXJtcylcblx0XHRcdHRoaXMuX3BhcmFtcy50ZXh0RmlsdGVyID0gdGVybXM7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5fcGFyYW1zLnRleHRGaWx0ZXIgPSBcIlwiO1xuXG5cdFx0dGhpcy5mdWxsQ29sbGVjdGlvbi5yZXNldChbXSk7XG5cblx0XHRfLmVhY2godGhpcy5saW5rcywgKHYsIGspID0+IHtcblx0XHRcdGlmICghdiB8fCBfLmlzRnVuY3Rpb24odikgfHwgIXBhcnNlSW50KGssIDEwKSlcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR0aGlzLmxpbmtzW2tdID0gdGhpcy5fdXJsICsgXCI/XCIgKyBxcy5zdHJpbmdpZnkodGhpcy5nZXRQYXJhbXMoKSkgKyBcIiZwYWdlPVwiICsgaztcblx0XHR9KTtcblxuXHRcdGlmICghc2lsZW50KVxuXHRcdFx0dGhpcy5nZXRGaXJzdFBhZ2UoeyBmZXRjaDogdHJ1ZSB9KTtcblx0fSxcblxuXHRzZXRTZXJ2ZXJGaWx0ZXJzOiBmdW5jdGlvbihmaWx0ZXJzKSB7XG5cdFx0dGhpcy5mdWxsQ29sbGVjdGlvbi5yZXNldChbXSk7XG5cblx0XHR0aGlzLl9wYXJhbXMgPSBfLnJlZHVjZShmaWx0ZXJzLCAoc3VtLCBudW0sIGtleSkgPT4ge1xuXHRcdFx0aWYgKF8uaXNBcnJheShudW0pICYmIG51bS5sZW5ndGggPT09IDApXG5cdFx0XHRcdHJldHVybiBzdW07XG5cdFx0XHRzdW1ba2V5XSA9IG51bTtcblx0XHRcdHJldHVybiBzdW07XG5cdFx0fSwge30pO1xuXG5cdFx0Xy5lYWNoKHRoaXMubGlua3MsICh2LCBrKSA9PiB7XG5cdFx0XHRpZiAoIXYgfHwgXy5pc0Z1bmN0aW9uKHYpIHx8ICFwYXJzZUludChrLCAxMCkpXG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0dGhpcy5saW5rc1trXSA9IHRoaXMuX3VybCArIFwiP1wiICsgcXMuc3RyaW5naWZ5KHRoaXMuZ2V0UGFyYW1zKCkpICsgXCImcGFnZT1cIiArIGs7XG5cdFx0fSk7XG5cblx0XHRyZXR1cm4gdGhpcy5nZXRGaXJzdFBhZ2UoeyBmZXRjaDogdHJ1ZSB9KTtcblx0fSxcblxuXHRyZWdlbmVyYXRlTGlua3M6IGZ1bmN0aW9uKCkge1xuXHRcdF8uZWFjaCh0aGlzLmxpbmtzLCAodiwgaykgPT4ge1xuXHRcdFx0aWYgKCF2IHx8IF8uaXNGdW5jdGlvbih2KSB8fCAhcGFyc2VJbnQoaywgMTApKVxuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdHRoaXMubGlua3Nba10gPSB0aGlzLl91cmwgKyBcIj9cIiArIHFzLnN0cmluZ2lmeSh0aGlzLmdldFBhcmFtcygpKSArIFwiJnBhZ2U9XCIgKyBrO1xuXHRcdH0pO1xuXHR9LFxuXG5cdGR5bmFGaWx0ZXI6IGZ1bmN0aW9uKGZpbHRlcnMpIHtcblx0XHR0aGlzLmZ1bGxDb2xsZWN0aW9uLnJlc2V0KFtdKTtcblxuXHRcdF8uZXh0ZW5kKHRoaXMuX3BhcmFtcywgZmlsdGVycyk7XG5cdFx0dGhpcy5yZWdlbmVyYXRlTGlua3MoKTtcblxuXHRcdHRoaXMuZ2V0Rmlyc3RQYWdlKHsgZmV0Y2g6IHRydWUgfSk7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar Promise = require(\"bluebird\");\nvar qs = require(\"querystring\");\n\nvar PAGE_SIZE_MAX = 100;\n\nvar State = function State(options) {\n\tthis._pageSize = options.pageSize || PAGE_SIZE_MAX;\n\tthis.reset();\n};\n\nState.prototype.reset = function () {\n\tthis._offset = 0;\n\tthis._total = null;\n};\n\nState.prototype.setTotal = function (newTotal) {\n\tthis._total = newTotal;\n};\n\nState.prototype.getBatchParameters = function () {\n\treturn {\n\t\tpageSize: this._pageSize,\n\t\toffset: this._offset\n\t};\n};\n\nState.prototype.getExtentParameters = function () {\n\treturn {\n\t\tpageSize: this._offset + this._pageSize,\n\t\toffset: 0\n\t};\n};\n\nState.prototype.hasNextBatch = function () {\n\treturn !_.isNil(this._total) && this._total > 0 && !_.isNil(this._offset) && this._offset + this._pageSize < this._total;\n};\n\nState.prototype.advanceBatch = function (offset) {\n\tif (_.isNil(this._total)) throw new Error(\"Next batch requested but state was not initialized\");\n\n\tif (this._offset === this._total) throw new Error(\"Next batch requested but no more batches are available\");\n\n\tif (_.isNil(offset)) this._offset += _.min([this._pageSize, this._total - this._offset]);else this._offset += _.min([offset, this._total - this._offset]);\n};\n\n// eslint-disable-next-line backbone/collection-model\nmodule.exports = Backbone.Collection.extend({\n\t// options\n\t//   pageSize: an integer specifying the maximum number of models to fetch per batch\n\t//   url: a string specifying the location of the models on the server\n\tinitialize: function initialize(models, options) {\n\t\tthis._state = new State({ pageSize: options.pageSize });\n\n\t\t// Parse the specified URL and separate the location from the query parameters\n\t\tthis._queryParameters = {};\n\n\t\tif (_.includes(options.url, \"?\")) {\n\t\t\tthis._queryParameters = qs.parse(_.slice(options.url, _.indexOf(options.url, \"?\") + 1));\n\t\t\tthis._url = _.slice(options.url, 0, _.indexOf(options.url, \"?\"));\n\t\t} else {\n\t\t\tthis._url = options.url;\n\t\t}\n\n\t\t// Signal the server to return the models in batches rather than all of the models at once\n\t\tthis._queryParameters.paged = true;\n\n\t\t// Event handlers for internal bookkeeping\n\t\tthis.on(\"destroy\", this._onModelDestroyed.bind(this));\n\t},\n\n\turl: function url() {\n\t\t// Return the unadorned location of the collection on the server so that operations other than\n\t\t// paged fetch will continue to work\n\t\treturn this._url;\n\t},\n\n\tsetSearchTerms: function setSearchTerms(terms) {\n\t\tif (_.isNil(terms)) {\n\t\t\tdelete this._queryParameters.textFilter;\n\n\t\t\tif (!_.isNil(this._unfilteredState)) {\n\t\t\t\tthis._state = this._unfilteredState;\n\t\t\t\tdelete this._unfilteredState;\n\n\t\t\t\tthis.reset([]);\n\t\t\t\tthis._fetchBatch(this._state.getExtentParameters()).spread(this._onBatch.bind(this));\n\t\t\t}\n\t\t} else {\n\t\t\tif (_.isNil(this._unfilteredState)) this._unfilteredState = this._state;\n\n\t\t\tthis._state = _.clone(this._state);\n\t\t\tthis._state.reset();\n\t\t\tthis._queryParameters.textFilter = terms;\n\t\t\tthis.getFirstBatch();\n\t\t}\n\t},\n\n\tgetFirstBatch: function getFirstBatch() {\n\t\tvar _this = this;\n\n\t\tthis._state.reset();\n\n\t\tthis._fetchBatch().spread(function (batch, response) {\n\t\t\t_this.reset(batch);\n\t\t\t_this.trigger(\"sync\", _this, response);\n\t\t});\n\t},\n\n\thasNextBatch: function hasNextBatch() {\n\t\treturn this._state.hasNextBatch();\n\t},\n\n\tgetNextBatch: function getNextBatch(offset) {\n\t\tthis._state.advanceBatch(offset);\n\t\tthis._fetchBatch().spread(this._onBatch.bind(this));\n\t},\n\n\t_onBatch: function _onBatch(batch, response) {\n\t\tvar newModels = this._vivifyModels(batch);\n\t\tvar existingModelCount = this._countExistingModels(newModels);\n\n\t\tif (_.isNil(this._pendingModels)) this._pendingModels = [];\n\n\t\tthis._pendingModels = _.concat(this._pendingModels, newModels);\n\n\t\tif (existingModelCount > 0) {\n\t\t\tthis.getNextBatch(existingModelCount);\n\t\t} else {\n\t\t\tthis.add(this._pendingModels, { merge: true });\n\t\t\tdelete this._pendingModels;\n\t\t\tthis.trigger(\"sync\", this, response);\n\t\t}\n\t},\n\n\t_fetchBatch: function _fetchBatch(fetchParameters) {\n\t\tvar _this2 = this;\n\n\t\tvar jqXHR = $.ajax(this._url, {\n\t\t\tdata: _.extend(_.clone(this._queryParameters), _.isNil(fetchParameters) ? this._state.getBatchParameters() : fetchParameters),\n\t\t\tmethod: \"GET\"\n\t\t});\n\n\t\tthis.trigger(\"request\", this, jqXHR);\n\n\t\treturn Promise.resolve(jqXHR).then(function (data) {\n\t\t\t_this2._state.setTotal(data.total);\n\t\t\treturn [data.rows, jqXHR.responseXML || jqXHR.responseText];\n\t\t}).catch(function () {\n\t\t\tif (!_.isNil(_this2._pendingModels)) delete _this2._pendingModels;\n\n\t\t\t_this2.trigger(\"error\", _this2, jqXHR);\n\t\t});\n\t},\n\n\t_vivifyModels: function _vivifyModels(jsonDocs) {\n\t\tvar _this3 = this;\n\n\t\tif (_.isNil(this.model)) throw new Error(\"LazyCollection.model must be assigned a model type but is undefined\");\n\n\t\t// eslint-disable-next-line new-cap\n\t\treturn _.map(jsonDocs, function (doc) {\n\t\t\treturn new _this3.model(doc);\n\t\t});\n\t},\n\n\t_countExistingModels: function _countExistingModels(newModels) {\n\t\tvar _this4 = this;\n\n\t\treturn _.filter(newModels, function (n) {\n\t\t\treturn !_.isNil(_this4.get(n.id));\n\t\t}).length;\n\t},\n\n\t_onModelDestroyed: function _onModelDestroyed() {\n\t\tthis._fetchBatch().spread(this._onBatch.bind(this));\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxhenlDb2xsZWN0aW9uLmpzIl0sIm5hbWVzIjpbIiQiLCJyZXF1aXJlIiwiXyIsIkJhY2tib25lIiwiUHJvbWlzZSIsInFzIiwiUEFHRV9TSVpFX01BWCIsIlN0YXRlIiwib3B0aW9ucyIsIl9wYWdlU2l6ZSIsInBhZ2VTaXplIiwicmVzZXQiLCJwcm90b3R5cGUiLCJfb2Zmc2V0IiwiX3RvdGFsIiwic2V0VG90YWwiLCJuZXdUb3RhbCIsImdldEJhdGNoUGFyYW1ldGVycyIsIm9mZnNldCIsImdldEV4dGVudFBhcmFtZXRlcnMiLCJoYXNOZXh0QmF0Y2giLCJpc05pbCIsImFkdmFuY2VCYXRjaCIsIkVycm9yIiwibWluIiwibW9kdWxlIiwiZXhwb3J0cyIsIkNvbGxlY3Rpb24iLCJleHRlbmQiLCJpbml0aWFsaXplIiwibW9kZWxzIiwiX3N0YXRlIiwiX3F1ZXJ5UGFyYW1ldGVycyIsImluY2x1ZGVzIiwidXJsIiwicGFyc2UiLCJzbGljZSIsImluZGV4T2YiLCJfdXJsIiwicGFnZWQiLCJvbiIsIl9vbk1vZGVsRGVzdHJveWVkIiwiYmluZCIsInNldFNlYXJjaFRlcm1zIiwidGVybXMiLCJ0ZXh0RmlsdGVyIiwiX3VuZmlsdGVyZWRTdGF0ZSIsIl9mZXRjaEJhdGNoIiwic3ByZWFkIiwiX29uQmF0Y2giLCJjbG9uZSIsImdldEZpcnN0QmF0Y2giLCJiYXRjaCIsInJlc3BvbnNlIiwidHJpZ2dlciIsImdldE5leHRCYXRjaCIsIm5ld01vZGVscyIsIl92aXZpZnlNb2RlbHMiLCJleGlzdGluZ01vZGVsQ291bnQiLCJfY291bnRFeGlzdGluZ01vZGVscyIsIl9wZW5kaW5nTW9kZWxzIiwiY29uY2F0IiwiYWRkIiwibWVyZ2UiLCJmZXRjaFBhcmFtZXRlcnMiLCJqcVhIUiIsImFqYXgiLCJkYXRhIiwibWV0aG9kIiwicmVzb2x2ZSIsInRoZW4iLCJ0b3RhbCIsInJvd3MiLCJyZXNwb25zZVhNTCIsInJlc3BvbnNlVGV4dCIsImNhdGNoIiwianNvbkRvY3Mi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QUFDWixPQUFJLENBQUN6RSxFQUFFbUIsS0FBRixDQUFRLE9BQUt1QyxjQUFiLENBQUwsRUFDQyxPQUFPLE9BQUtBLGNBQVo7O0FBRUQsVUFBS04sT0FBTCxDQUFhLE9BQWIsRUFBc0IsTUFBdEIsRUFBNEJXLEtBQTVCO0FBQ0EsR0FWSyxDQUFQO0FBV0EsRUE5RzBDOztBQWdIM0NSLGdCQUFlLHVCQUFTbUIsUUFBVCxFQUFtQjtBQUFBOztBQUNqQyxNQUFJMUUsRUFBRW1CLEtBQUYsQ0FBUSxLQUFLd0QsS0FBYixDQUFKLEVBQ0MsTUFBTSxJQUFJdEQsS0FBSixDQUFVLHFFQUFWLENBQU47O0FBRUQ7QUFDQSxTQUFPckIsRUFBRTRFLEdBQUYsQ0FBTUYsUUFBTixFQUFnQjtBQUFBLFVBQU8sSUFBSSxPQUFLQyxLQUFULENBQWVFLEdBQWYsQ0FBUDtBQUFBLEdBQWhCLENBQVA7QUFDQSxFQXRIMEM7O0FBd0gzQ3BCLHVCQUFzQiw4QkFBU0gsU0FBVCxFQUFvQjtBQUFBOztBQUN6QyxTQUFPdEQsRUFBRThFLE1BQUYsQ0FBU3hCLFNBQVQsRUFBb0I7QUFBQSxVQUFLLENBQUN0RCxFQUFFbUIsS0FBRixDQUFRLE9BQUs0RCxHQUFMLENBQVNDLEVBQUVDLEVBQVgsQ0FBUixDQUFOO0FBQUEsR0FBcEIsRUFBbURDLE1BQTFEO0FBQ0EsRUExSDBDOztBQTRIM0MzQyxvQkFBbUIsNkJBQVc7QUFDN0IsT0FBS00sV0FBTCxHQUFtQkMsTUFBbkIsQ0FBMEIsS0FBS0MsUUFBTCxDQUFjUCxJQUFkLENBQW1CLElBQW5CLENBQTFCO0FBQ0E7QUE5SDBDLENBQTNCLENBQWpCIiwiZmlsZSI6ImxhenlDb2xsZWN0aW9uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCBQcm9taXNlID0gcmVxdWlyZShcImJsdWViaXJkXCIpO1xuY29uc3QgcXMgPSByZXF1aXJlKFwicXVlcnlzdHJpbmdcIik7XG5cbmNvbnN0IFBBR0VfU0laRV9NQVggPSAxMDA7XG5cbmNvbnN0IFN0YXRlID0gZnVuY3Rpb24ob3B0aW9ucykge1xuXHR0aGlzLl9wYWdlU2l6ZSA9IG9wdGlvbnMucGFnZVNpemUgfHwgUEFHRV9TSVpFX01BWDtcblx0dGhpcy5yZXNldCgpO1xufTtcblxuU3RhdGUucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24oKSB7XG5cdHRoaXMuX29mZnNldCA9IDA7XG5cdHRoaXMuX3RvdGFsID0gbnVsbDtcbn07XG5cblN0YXRlLnByb3RvdHlwZS5zZXRUb3RhbCA9IGZ1bmN0aW9uKG5ld1RvdGFsKSB7XG5cdHRoaXMuX3RvdGFsID0gbmV3VG90YWw7XG59O1xuXG5TdGF0ZS5wcm90b3R5cGUuZ2V0QmF0Y2hQYXJhbWV0ZXJzID0gZnVuY3Rpb24oKSB7XG5cdHJldHVybiB7XG5cdFx0cGFnZVNpemU6IHRoaXMuX3BhZ2VTaXplLFxuXHRcdG9mZnNldDogdGhpcy5fb2Zmc2V0LFxuXHR9O1xufTtcblxuU3RhdGUucHJvdG90eXBlLmdldEV4dGVudFBhcmFtZXRlcnMgPSBmdW5jdGlvbigpIHtcblx0cmV0dXJuIHtcblx0XHRwYWdlU2l6ZTogdGhpcy5fb2Zmc2V0ICsgdGhpcy5fcGFnZVNpemUsXG5cdFx0b2Zmc2V0OiAwLFxuXHR9O1xufTtcblxuU3RhdGUucHJvdG90eXBlLmhhc05leHRCYXRjaCA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gIV8uaXNOaWwodGhpcy5fdG90YWwpICYmIHRoaXMuX3RvdGFsID4gMCAmJiAhXy5pc05pbCh0aGlzLl9vZmZzZXQpICYmIHRoaXMuX29mZnNldCArIHRoaXMuX3BhZ2VTaXplIDwgdGhpcy5fdG90YWw7XG59O1xuXG5TdGF0ZS5wcm90b3R5cGUuYWR2YW5jZUJhdGNoID0gZnVuY3Rpb24ob2Zmc2V0KSB7XG5cdGlmIChfLmlzTmlsKHRoaXMuX3RvdGFsKSlcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJOZXh0IGJhdGNoIHJlcXVlc3RlZCBidXQgc3RhdGUgd2FzIG5vdCBpbml0aWFsaXplZFwiKTtcblxuXHRpZiAodGhpcy5fb2Zmc2V0ID09PSB0aGlzLl90b3RhbClcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJOZXh0IGJhdGNoIHJlcXVlc3RlZCBidXQgbm8gbW9yZSBiYXRjaGVzIGFyZSBhdmFpbGFibGVcIik7XG5cblx0aWYgKF8uaXNOaWwob2Zmc2V0KSlcblx0XHR0aGlzLl9vZmZzZXQgKz0gXy5taW4oW3RoaXMuX3BhZ2VTaXplLCB0aGlzLl90b3RhbCAtIHRoaXMuX29mZnNldF0pO1xuXHRlbHNlXG5cdFx0dGhpcy5fb2Zmc2V0ICs9IF8ubWluKFtvZmZzZXQsIHRoaXMuX3RvdGFsIC0gdGhpcy5fb2Zmc2V0XSk7XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgYmFja2JvbmUvY29sbGVjdGlvbi1tb2RlbFxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5Db2xsZWN0aW9uLmV4dGVuZCh7XG5cdC8vIG9wdGlvbnNcblx0Ly8gICBwYWdlU2l6ZTogYW4gaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBtYXhpbXVtIG51bWJlciBvZiBtb2RlbHMgdG8gZmV0Y2ggcGVyIGJhdGNoXG5cdC8vICAgdXJsOiBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgbW9kZWxzIG9uIHRoZSBzZXJ2ZXJcblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24obW9kZWxzLCBvcHRpb25zKSB7XG5cdFx0dGhpcy5fc3RhdGUgPSBuZXcgU3RhdGUoeyBwYWdlU2l6ZTogb3B0aW9ucy5wYWdlU2l6ZSB9KTtcblxuXHRcdC8vIFBhcnNlIHRoZSBzcGVjaWZpZWQgVVJMIGFuZCBzZXBhcmF0ZSB0aGUgbG9jYXRpb24gZnJvbSB0aGUgcXVlcnkgcGFyYW1ldGVyc1xuXHRcdHRoaXMuX3F1ZXJ5UGFyYW1ldGVycyA9IHt9O1xuXG5cdFx0aWYgKF8uaW5jbHVkZXMob3B0aW9ucy51cmwsIFwiP1wiKSkge1xuXHRcdFx0dGhpcy5fcXVlcnlQYXJhbWV0ZXJzID0gcXMucGFyc2UoXy5zbGljZShvcHRpb25zLnVybCwgXy5pbmRleE9mKG9wdGlvbnMudXJsLCBcIj9cIikgKyAxKSk7XG5cdFx0XHR0aGlzLl91cmwgPSBfLnNsaWNlKG9wdGlvbnMudXJsLCAwLCBfLmluZGV4T2Yob3B0aW9ucy51cmwsIFwiP1wiKSk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5fdXJsID0gb3B0aW9ucy51cmw7XG5cdFx0fVxuXG5cdFx0Ly8gU2lnbmFsIHRoZSBzZXJ2ZXIgdG8gcmV0dXJuIHRoZSBtb2RlbHMgaW4gYmF0Y2hlcyByYXRoZXIgdGhhbiBhbGwgb2YgdGhlIG1vZGVscyBhdCBvbmNlXG5cdFx0dGhpcy5fcXVlcnlQYXJhbWV0ZXJzLnBhZ2VkID0gdHJ1ZTtcblxuXHRcdC8vIEV2ZW50IGhhbmRsZXJzIGZvciBpbnRlcm5hbCBib29ra2VlcGluZ1xuXHRcdHRoaXMub24oXCJkZXN0cm95XCIsIHRoaXMuX29uTW9kZWxEZXN0cm95ZWQuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHQvLyBSZXR1cm4gdGhlIHVuYWRvcm5lZCBsb2NhdGlvbiBvZiB0aGUgY29sbGVjdGlvbiBvbiB0aGUgc2VydmVyIHNvIHRoYXQgb3BlcmF0aW9ucyBvdGhlciB0aGFuXG5cdFx0Ly8gcGFnZWQgZmV0Y2ggd2lsbCBjb250aW51ZSB0byB3b3JrXG5cdFx0cmV0dXJuIHRoaXMuX3VybDtcblx0fSxcblxuXHRzZXRTZWFyY2hUZXJtczogZnVuY3Rpb24odGVybXMpIHtcblx0XHRpZiAoXy5pc05pbCh0ZXJtcykpIHtcblx0XHRcdGRlbGV0ZSB0aGlzLl9xdWVyeVBhcmFtZXRlcnMudGV4dEZpbHRlcjtcblxuXHRcdFx0aWYgKCFfLmlzTmlsKHRoaXMuX3VuZmlsdGVyZWRTdGF0ZSkpIHtcblx0XHRcdFx0dGhpcy5fc3RhdGUgPSB0aGlzLl91bmZpbHRlcmVkU3RhdGU7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzLl91bmZpbHRlcmVkU3RhdGU7XG5cblx0XHRcdFx0dGhpcy5yZXNldChbXSk7XG5cdFx0XHRcdHRoaXMuX2ZldGNoQmF0Y2godGhpcy5fc3RhdGUuZ2V0RXh0ZW50UGFyYW1ldGVycygpKS5zcHJlYWQodGhpcy5fb25CYXRjaC5iaW5kKHRoaXMpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRpZiAoXy5pc05pbCh0aGlzLl91bmZpbHRlcmVkU3RhdGUpKVxuXHRcdFx0XHR0aGlzLl91bmZpbHRlcmVkU3RhdGUgPSB0aGlzLl9zdGF0ZTtcblxuXHRcdFx0dGhpcy5fc3RhdGUgPSBfLmNsb25lKHRoaXMuX3N0YXRlKTtcblx0XHRcdHRoaXMuX3N0YXRlLnJlc2V0KCk7XG5cdFx0XHR0aGlzLl9xdWVyeVBhcmFtZXRlcnMudGV4dEZpbHRlciA9IHRlcm1zO1xuXHRcdFx0dGhpcy5nZXRGaXJzdEJhdGNoKCk7XG5cdFx0fVxuXHR9LFxuXG5cdGdldEZpcnN0QmF0Y2g6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuX3N0YXRlLnJlc2V0KCk7XG5cblx0XHR0aGlzLl9mZXRjaEJhdGNoKCkuc3ByZWFkKChiYXRjaCwgcmVzcG9uc2UpID0+IHtcblx0XHRcdHRoaXMucmVzZXQoYmF0Y2gpO1xuXHRcdFx0dGhpcy50cmlnZ2VyKFwic3luY1wiLCB0aGlzLCByZXNwb25zZSk7XG5cdFx0fSk7XG5cdH0sXG5cblx0aGFzTmV4dEJhdGNoOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5fc3RhdGUuaGFzTmV4dEJhdGNoKCk7XG5cdH0sXG5cblx0Z2V0TmV4dEJhdGNoOiBmdW5jdGlvbihvZmZzZXQpIHtcblx0XHR0aGlzLl9zdGF0ZS5hZHZhbmNlQmF0Y2gob2Zmc2V0KTtcblx0XHR0aGlzLl9mZXRjaEJhdGNoKCkuc3ByZWFkKHRoaXMuX29uQmF0Y2guYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0X29uQmF0Y2g6IGZ1bmN0aW9uKGJhdGNoLCByZXNwb25zZSkge1xuXHRcdGNvbnN0IG5ld01vZGVscyA9IHRoaXMuX3ZpdmlmeU1vZGVscyhiYXRjaCk7XG5cdFx0Y29uc3QgZXhpc3RpbmdNb2RlbENvdW50ID0gdGhpcy5fY291bnRFeGlzdGluZ01vZGVscyhuZXdNb2RlbHMpO1xuXG5cdFx0aWYgKF8uaXNOaWwodGhpcy5fcGVuZGluZ01vZGVscykpXG5cdFx0XHR0aGlzLl9wZW5kaW5nTW9kZWxzID0gW107XG5cblx0XHR0aGlzLl9wZW5kaW5nTW9kZWxzID0gXy5jb25jYXQodGhpcy5fcGVuZGluZ01vZGVscywgbmV3TW9kZWxzKTtcblxuXHRcdGlmIChleGlzdGluZ01vZGVsQ291bnQgPiAwKSB7XG5cdFx0XHR0aGlzLmdldE5leHRCYXRjaChleGlzdGluZ01vZGVsQ291bnQpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMuYWRkKHRoaXMuX3BlbmRpbmdNb2RlbHMsIHsgbWVyZ2U6IHRydWUgfSk7XG5cdFx0XHRkZWxldGUgdGhpcy5fcGVuZGluZ01vZGVscztcblx0XHRcdHRoaXMudHJpZ2dlcihcInN5bmNcIiwgdGhpcywgcmVzcG9uc2UpO1xuXHRcdH1cblx0fSxcblxuXHRfZmV0Y2hCYXRjaDogZnVuY3Rpb24oZmV0Y2hQYXJhbWV0ZXJzKSB7XG5cdFx0Y29uc3QganFYSFIgPSAkLmFqYXgodGhpcy5fdXJsLCB7XG5cdFx0XHRkYXRhOiBfLmV4dGVuZChfLmNsb25lKHRoaXMuX3F1ZXJ5UGFyYW1ldGVycyksIF8uaXNOaWwoZmV0Y2hQYXJhbWV0ZXJzKSA/IHRoaXMuX3N0YXRlLmdldEJhdGNoUGFyYW1ldGVycygpIDogZmV0Y2hQYXJhbWV0ZXJzKSxcblx0XHRcdG1ldGhvZDogXCJHRVRcIixcblx0XHR9KTtcblxuXHRcdHRoaXMudHJpZ2dlcihcInJlcXVlc3RcIiwgdGhpcywganFYSFIpO1xuXG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZShqcVhIUilcblx0XHRcdC50aGVuKGRhdGEgPT4ge1xuXHRcdFx0XHR0aGlzLl9zdGF0ZS5zZXRUb3RhbChkYXRhLnRvdGFsKTtcblx0XHRcdFx0cmV0dXJuIFtkYXRhLnJvd3MsIGpxWEhSLnJlc3BvbnNlWE1MIHx8IGpxWEhSLnJlc3BvbnNlVGV4dF07XG5cdFx0XHR9KVxuXHRcdFx0LmNhdGNoKCgpID0+IHtcblx0XHRcdFx0aWYgKCFfLmlzTmlsKHRoaXMuX3BlbmRpbmdNb2RlbHMpKVxuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLl9wZW5kaW5nTW9kZWxzO1xuXG5cdFx0XHRcdHRoaXMudHJpZ2dlcihcImVycm9yXCIsIHRoaXMsIGpxWEhSKTtcblx0XHRcdH0pO1xuXHR9LFxuXG5cdF92aXZpZnlNb2RlbHM6IGZ1bmN0aW9uKGpzb25Eb2NzKSB7XG5cdFx0aWYgKF8uaXNOaWwodGhpcy5tb2RlbCkpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJMYXp5Q29sbGVjdGlvbi5tb2RlbCBtdXN0IGJlIGFzc2lnbmVkIGEgbW9kZWwgdHlwZSBidXQgaXMgdW5kZWZpbmVkXCIpO1xuXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5ldy1jYXBcblx0XHRyZXR1cm4gXy5tYXAoanNvbkRvY3MsIGRvYyA9PiBuZXcgdGhpcy5tb2RlbChkb2MpKTtcblx0fSxcblxuXHRfY291bnRFeGlzdGluZ01vZGVsczogZnVuY3Rpb24obmV3TW9kZWxzKSB7XG5cdFx0cmV0dXJuIF8uZmlsdGVyKG5ld01vZGVscywgbiA9PiAhXy5pc05pbCh0aGlzLmdldChuLmlkKSkpLmxlbmd0aDtcblx0fSxcblxuXHRfb25Nb2RlbERlc3Ryb3llZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5fZmV0Y2hCYXRjaCgpLnNwcmVhZCh0aGlzLl9vbkJhdGNoLmJpbmQodGhpcykpO1xuXHR9LFxufSk7XG4iXX0=",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar $ = require(\"jquery\");\nvar Backbone = require(\"backbone\");\nvar App = require(\"../index\");\nvar settings = require(\"app-settings\");\nvar radio = Backbone.Radio.channel(\"global\");\n// For IE11\n// eslint-disable-next-line no-unused-vars\nvar Promise = require(\"bluebird\");\n\nvar ServerFilterManager = require(\"./serverFilterManager\");\nvar LearningPathsView = require(\"./learningPathsView\");\nvar Selectra = require(\"./selectra\");\n// ----------------------------------------------------------------------------\n// Models\n// ----------------------------------------------------------------------------\n\nvar LearningPath = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"_id\"\n});\n\nvar getPageSize = function getPageSize() {\n\t// Get the dimensions of the viewport\n\tvar width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;\n\n\tif (width <= 1447) return 10;else if (width <= 1677) return 12;else if (width <= 1907) return 14;else if (width <= 2367) return 16;else if (width <= 2597) return 20;\n\n\treturn 22;\n};\n\nvar LearningPaths = Backbone.PageableCollection.extend({\n\tmodel: LearningPath,\n\n\turl: function url() {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\t\treturn settings.urlRoot + \"/acacia/users/\" + encodeURIComponent(user.username) + \"/learningPaths\";\n\t},\n\n\tstate: {\n\t\tpageSize: getPageSize()\n\t},\n\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\ttotalPages: null,\n\t\ttotalRecords: null,\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\n// ----------------------------------------------------------------------------\n// Views\n// ----------------------------------------------------------------------------\n\nvar SmallSelector = Backbone.Marionette.View.extend({\n\tclassName: \"lp-chooser\",\n\n\ttemplate: require(\"./templates/learningPathChooser.nunj\").LearningPathChooser,\n\n\tui: {\n\t\tlabel: \"p.chooser-label\",\n\t\tgroups: \"select[name='groups']\",\n\t\talsoResourcesContainer: \"p.alsoResources\",\n\t\talsoResources: \"input[name='content']\",\n\t\talsoTags: \"input[name='tags']\"\n\t},\n\n\tevents: {\n\t\t\"change @ui.groups\": \"onLearningPathSelected\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.label = options.label ? options.label : null;\n\t\tthis.maxHeight = options.maxHeight ? options.maxHeight : null;\n\t},\n\n\tonRender: function onRender() {\n\t\tif (this.label) this.ui.label.text(this.label);else this.ui.alsoResourcesContainer.hide();\n\n\t\tthis.listenTo(Backbone.Radio.channel(\"groupSelector\"), \"Events.ValueChanged\", this.onLearningPathSelected.bind(this));\n\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tthis.groups = new Selectra({\n\t\t\tsort: true,\n\t\t\tserver: {\n\t\t\t\tkey: \"code\",\n\t\t\t\tvalue: \"name\",\n\t\t\t\tfetch: settings.urlRoot + \"/acacia/users/\" + encodeURIComponent(user.username) + \"/learningPaths?skipEmpty=true\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t},\n\t\t\tplaceholder: \"No groups selected\",\n\t\t\twidth: this.maxHeight ? this.maxHeight : null,\n\t\t\tddHost: \"#link-resources\"\n\t\t});\n\n\t\tthis.groups.show({ el: this.ui.groups });\n\t},\n\n\tonLearningPathSelected: function onLearningPathSelected(event, model) {\n\t\tif (model.get(\"code\")) {\n\t\t\tthis.trigger(\"selected\", {\n\t\t\t\tgroupCode: model.get(\"code\"),\n\t\t\t\twithResources: this.ui.alsoResources.prop(\"checked\"),\n\t\t\t\twithTags: this.ui.alsoTags.prop(\"checked\")\n\t\t\t});\n\t\t}\n\t}\n});\n\nvar LargeSelector = Backbone.Marionette.View.extend({\n\tclassName: \"learningPath-selector\",\n\n\ttemplate: require(\"./templates/learningPathChooser.nunj\").learningPathSelector,\n\n\tregions: {\n\t\tfilter: \".learningPath-filter-region\",\n\t\tgrid: \".learningPath-grid-region\"\n\t},\n\n\tui: {\n\t\tgrid: \"div.grid\",\n\t\tresult: \".result\",\n\n\t\tfilters: \".learningPath-filter-region .filters\",\n\t\tsearchBox: \"input\",\n\t\tsearchOverlay: \"div.input-overlay\",\n\n\t\tpaging: \".pagination\",\n\t\tcounter: \".counter\",\n\t\tpage: \".page\",\n\t\toverlay: \".overlay\"\n\t},\n\n\tevents: {\n\t\t// Paging events\n\t\t\"click .next\": \"next\",\n\t\t\"click .prev\": \"prev\",\n\t\t\"click .first\": \"first\",\n\t\t\"click .last\": \"last\",\n\t\t\"click @ui.page\": \"jumpToPage\"\n\t},\n\n\tcollectionEvents: {\n\t\trequest: \"fetchStart\",\n\t\t\"sync error\": \"fetchEnd\"\n\t},\n\n\tchildViewEvents: {\n\t\t\"child:select:learningPath\": \"onSelect\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.collection = new LearningPaths();\n\t\tthis.bindEvents(this.collection, this.collectionEvents);\n\t},\n\n\tfetchStart: function fetchStart() {\n\t\t$(\"div.no-results\", this.ui.result).remove();\n\t\tthis.ui.overlay.addClass(\"shown\").html(\"<span class='spinner'><span class='spinner-icon spinner-red'/>&nbsp;&nbsp;Fetching...</span>\");\n\t},\n\n\tfetchEnd: function fetchEnd(model, err) {\n\t\tif (err && err.status) {\n\t\t\tvar errMsg = App.parseResponse(err);\n\t\t\tradio.trigger(App.Events.Commands.Toast, { content: errMsg.detail || errMsg.info, icon: \"fa-exclamation-triangle\", iconColour: \"#ec5840\" });\n\t\t}\n\n\t\t$(\"div.no-results\", this.ui.result).remove();\n\t\tthis.ui.overlay.empty().removeClass(\"shown\");\n\t\tthis.updateCounter();\n\n\t\tif (this.collection.length === 0) {\n\t\t\tthis.ui.result.append(\"<div class='no-results'><div>No results found <span class='fal fa-frown'/></div>\\n\\t\\t\\t\\t<div class='subtext'>If you have any filters selected, try changing them, or unchoosing them</div></div>\");\n\t\t} else {\n\t\t\twindow.scrollTo(0, 0);\n\t\t}\n\t},\n\n\tonRender: function onRender() {\n\t\tvar learningPathsView = new LearningPathsView({ collection: this.collection });\n\t\tthis.showChildView(\"grid\", learningPathsView);\n\n\t\t// Create the filter\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar currentlyActiveLearningPaths = {\n\t\t\ttype: \"toggle\",\n\t\t\tname: \"currentlyActiveLearningPaths\",\n\t\t\tlabel: \"Hide old \" + settings.learningPathsPluralCustomName,\n\t\t\tcategories: [{}],\n\t\t\tinitialValue: function initialValue() {\n\t\t\t\treturn [true];\n\t\t\t},\n\t\t\tserver: true\n\t\t};\n\n\t\tvar subjectFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"subjectFilter\",\n\t\t\tlabel: \"Subject\",\n\t\t\tserver: {\n\t\t\t\tkey: \"subject_id\",\n\t\t\t\tvalue: \"subject\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/subjects\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\n\t\tvar gradeFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"gradeFilter\",\n\t\t\tlabel: \"Year of Study\",\n\t\t\tserver: true,\n\t\t\tcategories: _.map(settings.gradeList, function (val, key) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: key,\n\t\t\t\t\titems: _.reduce(val.sort(function (a, b) {\n\t\t\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t\t\t}), function (sum, num) {\n\t\t\t\t\t\tsum.push({ name: num.value, label: num.name });return sum;\n\t\t\t\t\t}, [])\n\t\t\t\t};\n\t\t\t})\n\t\t};\n\n\t\tthis.filter = new ServerFilterManager({\n\t\t\traw: this.collection,\n\t\t\tfilterContainer: this.ui.filters,\n\t\t\tfilters: [textFilter, currentlyActiveLearningPaths, subjectFilter, gradeFilter],\n\t\t\tdefaultFilters: [\"textFilter\", \"currentlyActiveLearningPaths\"]\n\t\t});\n\n\t\tthis.ui.filters.prepend(this.filter.render().el);\n\n\t\tif (this.getQueryStringParam(\"page\") === null) {\n\t\t\tthis.collection.getFirstPage({ reset: true });\n\t\t} else {\n\t\t\tvar page = parseInt(this.getQueryStringParam(\"page\"), 10);\n\t\t\tthis.collection.getPage(page, { reset: true });\n\t\t}\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.filter.destroy();\n\t},\n\n\tonSelect: function onSelect(learningPathOptionModel) {\n\t\tthis.trigger(\"selected\", { learningPathOptionModel: learningPathOptionModel });\n\t},\n\n\tgetQueryStringParam: function getQueryStringParam(name) {\n\t\tvar url = window.location.href;\n\t\tvar parsedName = name.replace(/[\\[\\]]/g, \"\\\\$&\");\n\t\tvar regex = new RegExp(\"[?&]\" + parsedName + \"(=([^&#]*)|&|#|$)\"),\n\t\t    results = regex.exec(url);\n\t\tif (!results) return null;\n\t\tif (!results[2]) return \"\";\n\t\treturn decodeURIComponent(results[2].replace(/\\+/g, \" \"));\n\t},\n\n\tjumpToPage: function jumpToPage(evt) {\n\t\tvar el = $(evt.currentTarget);\n\t\tvar page = parseInt(el.text(), 10);\n\n\t\tthis.collection.getPage(page);\n\t},\n\n\tfirst: function first() {\n\t\tthis.collection.getFirstPage({ reset: true });\n\t},\n\n\tprev: function prev() {\n\t\tif (this.collection.hasPreviousPage()) this.collection.getPreviousPage();\n\t},\n\n\tnext: function next() {\n\t\tif (this.collection.hasNextPage()) this.collection.getNextPage();\n\t},\n\n\tlast: function last() {\n\t\tthis.collection.getPage(this.collection.state.totalPages);\n\t},\n\n\tupdateCounter: function updateCounter() {\n\t\tvar pageStart = (this.collection.state.currentPage - 1) * this.collection.state.pageSize + 1;\n\t\tvar pageEnd = this.collection.state.currentPage * this.collection.state.pageSize;\n\t\tif (pageEnd > this.collection.state.totalRecords) pageEnd = this.collection.state.totalRecords;\n\t\tvar prevDisable = true,\n\t\t    nextDisable = true;\n\n\t\tif (this.collection.state.totalPages > 1) {\n\t\t\tif (this.collection.state.currentPage > 1) prevDisable = false;\n\t\t\tif (this.collection.state.currentPage < this.collection.state.totalPages) nextDisable = false;\n\t\t}\n\n\t\tif (this.collection.state.totalRecords > 0) {\n\t\t\tvar text = \" <div class='first jumper \" + (prevDisable ? \" disabled\" : \"\") + \"' title='First page'><span class='fal fa-angle-double-left'/></div> <div class='prev jumper \" + (prevDisable ? \" disabled\" : \"\") + \"' title='Previous page'><span class='fal fa-angle-left'/></div>\";\n\n\t\t\t// Show up to 10 page numbers\n\t\t\tvar collection = this.collection;\n\t\t\tvar state = collection.state;\n\t\t\tvar windowSize = 10;\n\t\t\tvar slideScale = 0.5;\n\n\t\t\tvar slideThisMuch = function slideThisMuch(firstPage, lastPage, currentPage, _windowSize, _slideScale) {\n\t\t\t\treturn ~~(_windowSize * _slideScale);\n\t\t\t};\n\n\t\t\tvar slideMaybe = function slideMaybe(firstPage, lastPage, currentPage, _windowSize) {\n\t\t\t\treturn Math.round(currentPage % _windowSize / _windowSize);\n\t\t\t};\n\n\t\t\tvar firstPage = state.firstPage;\n\t\t\tvar lastPage = Number(state.lastPage);\n\t\t\tlastPage = Math.max(0, firstPage ? lastPage - 1 : lastPage);\n\t\t\tvar currentPage = Math.max(state.currentPage, state.firstPage);\n\t\t\tcurrentPage = firstPage ? currentPage - 1 : currentPage;\n\n\t\t\tvar windowStart = Math.floor(currentPage / windowSize) * windowSize;\n\t\t\tif (currentPage <= lastPage - slideThisMuch()) {\n\t\t\t\twindowStart += slideMaybe(firstPage, lastPage, currentPage, windowSize, slideScale) * slideThisMuch(firstPage, lastPage, currentPage, windowSize, slideScale);\n\t\t\t}\n\t\t\tvar windowEnd = Math.min(lastPage + 1, windowStart + windowSize);\n\n\t\t\tfor (var i = windowStart; i < windowEnd; i++) {\n\t\t\t\ttext += \"<span class='page \" + (i + 1 === state.currentPage ? \"active\" : \"\") + \"'>\" + (i + 1) + \"</span>\";\n\t\t\t}text += \"<div class='next jumper \" + (nextDisable ? \" disabled\" : \"\") + \"' title='Next page'><span class='fal fa-angle-right'/></div> <div class='last jumper \" + (nextDisable ? \" disabled\" : \"\") + \"' title='Last page'><span class='fal fa-angle-double-right'/></div>\";\n\n\t\t\tvar counterText = \"<span class='counterInfo'>\" + settings.learningPathsCustomName + \" \" + pageStart + \" - \" + pageEnd + \" of \" + state.totalRecords.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, \" \") + \"</span>\";\n\n\t\t\tthis.ui.paging.html(text);\n\t\t\tthis.ui.counter.html(counterText);\n\n\t\t\tradio.trigger(App.Events.Commands.Navigate, settings.urlRoot + \"/console/learningPaths?page=\" + (currentPage + 1), { trigger: false, replace: true });\n\t\t} else {\n\t\t\tthis.ui.paging.empty();\n\t\t\tthis.ui.counter.empty();\n\t\t}\n\n\t\tif (this.getQueryStringParam(\"textFilter\")) {\n\t\t\tvar searchText = _.replace(this.getQueryStringParam(\"textFilter\"), /\\|/g, \" \");\n\t\t\t$(\".search-input\").val(searchText);\n\t\t}\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"learningPath-selector-layout\",\n\n\ttemplate: require(\"./templates/learningPathChooser.nunj\").layout,\n\n\tregions: {\n\t\tcontent: \".learningPath-selector-region\"\n\t},\n\n\tonRender: function onRender() {\n\t\tif (this.options.large) {\n\t\t\tthis.selectorView = new LargeSelector();\n\t\t} else {\n\t\t\tthis.selectorView = new SmallSelector({\n\t\t\t\tlabel: this.options.label,\n\t\t\t\tmaxHeight: this.options.maxHeight\n\t\t\t});\n\t\t}\n\n\t\tthis.showChildView(\"content\", this.selectorView);\n\n\t\tthis.listenTo(this.selectorView, \"selected\", this.onLearningPathSelected.bind(this));\n\t},\n\n\tonLearningPathSelected: function onLearningPathSelected(details) {\n\t\tthis.trigger(\"selected\", details);\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(this.selectorView);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxlYXJuaW5nUGF0aENob29zZXIuanMiXSwibmFtZXMiOlsiXyIsInJlcXVpcmUiLCIkIiwiQmFja2JvbmUiLCJBcHAiLCJzZXR0aW5ncyIsInJhZGlvIiwiUmFkaW8iLCJjaGFubmVsIiwiUHJvbWlzZSIsIlNlcnZlckZpbHRlck1hbmFnZXIiLCJMZWFybmluZ1BhdGhzVmlldyIsIlNlbGVjdHJhIiwiTGVhcm5pbmdQYXRoIiwiRXBveHkiLCJNb2RlbCIsImV4dGVuZCIsImlkQXR0cmlidXRlIiwiZ2V0UGFnZVNpemUiLCJ3aWR0aCIsIndpbmRvdyIsImlubmVyV2lkdGgiLCJkb2N1bWVudCIsImRvY3VtZW50RWxlbWVudCIsImNsaWVudFdpZHRoIiwiYm9keSIsIkxlYXJuaW5nUGF0aHMiLCJQYWdlYWJsZUNvbGxlY3Rpb24iLCJtb2RlbCIsInVybCIsInVzZXIiLCJyZXF1ZXN0IiwiRXZlbnRzIiwiUmVxdWVzdHMiLCJDdXJyZW50VXNlciIsInVybFJvb3QiLCJlbmNvZGVVUklDb21wb25lbnQiLCJ1c2VybmFtZSIsInN0YXRlIiwicGFnZVNpemUiLCJtb2RlIiwicXVlcnlQYXJhbXMiLCJ0b3RhbFBhZ2VzIiwidG90YWxSZWNvcmRzIiwic29ydEtleSIsInBhcnNlU3RhdGUiLCJyZXNwIiwidG90YWwiLCJwYXJzZVJlY29yZHMiLCJyb3dzIiwiU21hbGxTZWxlY3RvciIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiY2xhc3NOYW1lIiwidGVtcGxhdGUiLCJMZWFybmluZ1BhdGhDaG9vc2VyIiwidWkiLCJsYWJlbCIsImdyb3VwcyIsImFsc29SZXNvdXJjZXNDb250YWluZXIiLCJhbHNvUmVzb3VyY2VzIiwiYWxzb1RhZ3MiLCJldmVudHMiLCJpbml0aWFsaXplIiwib3B0aW9ucyIsIm1heEhlaWdodCIsIm9uUmVuZGVyIiwidGV4dCIsImhpZGUiLCJsaXN0ZW5UbyIsIm9uTGVhcm5pbmdQYXRoU2VsZWN0ZWQiLCJiaW5kIiwic29ydCIsInNlcnZlciIsImtleSIsInZhbHVlIiwiZmV0Y2giLCJwYWdpbmciLCJpbmZpbml0ZSIsInBsYWNlaG9sZGVyIiwiZGRIb3N0Iiwic2hvdyIsImVsIiwiZXZlbnQiLCJnZXQiLCJ0cmlnZ2VyIiwiZ3JvdXBDb2RlIiwid2l0aFJlc291cmNlcyIsInByb3AiLCJ3aXRoVGFncyIsIkxhcmdlU2VsZWN0b3IiLCJsZWFybmluZ1BhdGhTZWxlY3RvciIsInJlZ2lvbnMiLCJmaWx0ZXIiLCJncmlkIiwicmVzdWx0IiwiZmlsdGVycyIsInNlYXJjaEJveCIsInNlYXJjaE92ZXJsYXkiLCJjb3VudGVyIiwicGFnZSIsIm92ZXJsYXkiLCJjb2xsZWN0aW9uRXZlbnRzIiwiY2hpbGRWaWV3RXZlbnRzIiwiY29sbGVjdGlvbiIsImJpbmRFdmVudHMiLCJmZXRjaFN0YXJ0IiwicmVtb3ZlIiwiYWRkQ2xhc3MiLCJodG1sIiwiZmV0Y2hFbmQiLCJlcnIiLCJzdGF0dXMiLCJlcnJNc2ciLCJwYXJzZVJlc3BvbnNlIiwiQ29tbWFuZHMiLCJUb2FzdCIsImNvbnRlbnQiLCJkZXRhaWwiLCJpbmZvIiwiaWNvbiIsImljb25Db2xvdXIiLCJlbXB0eSIsInJlbW92ZUNsYXNzIiwidXBkYXRlQ291bnRlciIsImxlbmd0aCIsImFwcGVuZCIsInNjcm9sbFRvIiwibGVhcm5pbmdQYXRoc1ZpZXciLCJzaG93Q2hpbGRWaWV3IiwidGV4dEZpbHRlciIsInR5cGUiLCJuYW1lIiwiZGVib3VuY2UiLCJjdXJyZW50bHlBY3RpdmVMZWFybmluZ1BhdGhzIiwibGVhcm5pbmdQYXRoc1BsdXJhbEN1c3RvbU5hbWUiLCJjYXRlZ29yaWVzIiwiaW5pdGlhbFZhbHVlIiwic3ViamVjdEZpbHRlciIsImdyYWRlRmlsdGVyIiwibWFwIiwiZ3JhZGVMaXN0IiwidmFsIiwiaXRlbXMiLCJyZWR1Y2UiLCJhIiwiYiIsImxleGljYWwiLCJ0b1VwcGVyQ2FzZSIsImxvY2FsZUNvbXBhcmUiLCJzdW0iLCJudW0iLCJwdXNoIiwicmF3IiwiZmlsdGVyQ29udGFpbmVyIiwiZGVmYXVsdEZpbHRlcnMiLCJwcmVwZW5kIiwicmVuZGVyIiwiZ2V0UXVlcnlTdHJpbmdQYXJhbSIsImdldEZpcnN0UGFnZSIsInJlc2V0IiwicGFyc2VJbnQiLCJnZXRQYWdlIiwib25CZWZvcmVEZXN0cm95IiwiZGVzdHJveSIsIm9uU2VsZWN0IiwibGVhcm5pbmdQYXRoT3B0aW9uTW9kZWwiLCJsb2NhdGlvbiIsImhyZWYiLCJwYXJzZWROYW1lIiwicmVwbGFjZSIsInJlZ2V4IiwiUmVnRXhwIiwicmVzdWx0cyIsImV4ZWMiLCJkZWNvZGVVUklDb21wb25lbnQiLCJqdW1wVG9QYWdlIiwiZXZ0IiwiY3VycmVudFRhcmdldCIsImZpcnN0IiwicHJldiIsImhhc1ByZXZpb3VzUGFnZSIsImdldFByZXZpb3VzUGFnZSIsIm5leHQiLCJoYXNOZXh0UGFnZSIsImdldE5leHRQYWdlIiwibGFzdCIsInBhZ2VTdGFydCIsImN1cnJlbnRQYWdlIiwicGFnZUVuZCIsInByZXZEaXNhYmxlIiwibmV4dERpc2FibGUiLCJ3aW5kb3dTaXplIiwic2xpZGVTY2FsZSIsInNsaWRlVGhpc011Y2giLCJmaXJzdFBhZ2UiLCJsYXN0UGFnZSIsIl93aW5kb3dTaXplIiwiX3NsaWRlU2NhbGUiLCJzbGlkZU1heWJlIiwiTWF0aCIsInJvdW5kIiwiTnVtYmVyIiwibWF4Iiwid2luZG93U3RhcnQiLCJmbG9vciIsIndpbmRvd0VuZCIsIm1pbiIsImkiLCJjb3VudGVyVGV4dCIsImxlYXJuaW5nUGF0aHNDdXN0b21OYW1lIiwidG9TdHJpbmciLCJOYXZpZ2F0ZSIsInNlYXJjaFRleHQiLCJtb2R1bGUiLCJleHBvcnRzIiwibGF5b3V0IiwibGFyZ2UiLCJzZWxlY3RvclZpZXciLCJkZXRhaWxzIiwic3RvcExpc3RlbmluZyJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsSUFBSUMsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1FLFdBQVdGLFFBQVEsVUFBUixDQUFqQjtB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OEIsS0FBS3lGLFlBQW5DOztBQUVBLE9BQUtySixRQUFMLENBQWMsS0FBS3FKLFlBQW5CLEVBQWlDLFVBQWpDLEVBQTZDLEtBQUtwSixzQkFBTCxDQUE0QkMsSUFBNUIsQ0FBaUMsSUFBakMsQ0FBN0M7QUFDQSxFQXZCK0M7O0FBeUJoREQseUJBQXdCLGdDQUFTcUosT0FBVCxFQUFrQjtBQUN6QyxPQUFLdEksT0FBTCxDQUFhLFVBQWIsRUFBeUJzSSxPQUF6QjtBQUNBLEVBM0IrQzs7QUE2QmhEeEQsa0JBQWlCLDJCQUFXO0FBQzNCLE9BQUt5RCxhQUFMLENBQW1CLEtBQUtGLFlBQXhCO0FBQ0E7QUEvQitDLENBQWhDLENBQWpCIiwiZmlsZSI6ImxlYXJuaW5nUGF0aENob29zZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IEFwcCA9IHJlcXVpcmUoXCIuLi9pbmRleFwiKTtcbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcbi8vIEZvciBJRTExXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbmNvbnN0IFByb21pc2UgPSByZXF1aXJlKFwiYmx1ZWJpcmRcIik7XG5cbmNvbnN0IFNlcnZlckZpbHRlck1hbmFnZXIgPSByZXF1aXJlKFwiLi9zZXJ2ZXJGaWx0ZXJNYW5hZ2VyXCIpO1xuY29uc3QgTGVhcm5pbmdQYXRoc1ZpZXcgPSByZXF1aXJlKFwiLi9sZWFybmluZ1BhdGhzVmlld1wiKTtcbmNvbnN0IFNlbGVjdHJhID0gcmVxdWlyZShcIi4vc2VsZWN0cmFcIik7XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNb2RlbHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgTGVhcm5pbmdQYXRoID0gQmFja2JvbmUuRXBveHkuTW9kZWwuZXh0ZW5kKHtcblx0aWRBdHRyaWJ1dGU6IFwiX2lkXCIsXG59KTtcblxuY29uc3QgZ2V0UGFnZVNpemUgPSBmdW5jdGlvbigpIHtcblx0Ly8gR2V0IHRoZSBkaW1lbnNpb25zIG9mIHRoZSB2aWV3cG9ydFxuXHRjb25zdCB3aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCB8fCBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoO1xuXG5cdGlmICh3aWR0aCA8PSAxNDQ3KVxuXHRcdHJldHVybiAxMDtcblx0ZWxzZSBpZiAod2lkdGggPD0gMTY3Nylcblx0XHRyZXR1cm4gMTI7XG5cdGVsc2UgaWYgKHdpZHRoIDw9IDE5MDcpXG5cdFx0cmV0dXJuIDE0O1xuXHRlbHNlIGlmICh3aWR0aCA8PSAyMzY3KVxuXHRcdHJldHVybiAxNjtcblx0ZWxzZSBpZiAod2lkdGggPD0gMjU5Nylcblx0XHRyZXR1cm4gMjA7XG5cblx0cmV0dXJuIDIyO1xufTtcblxuY29uc3QgTGVhcm5pbmdQYXRocyA9IEJhY2tib25lLlBhZ2VhYmxlQ29sbGVjdGlvbi5leHRlbmQoe1xuXHRtb2RlbDogTGVhcm5pbmdQYXRoLFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgdXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hY2FjaWEvdXNlcnMvXCIgKyBlbmNvZGVVUklDb21wb25lbnQodXNlci51c2VybmFtZSkgKyBcIi9sZWFybmluZ1BhdGhzXCI7XG5cdH0sXG5cblx0c3RhdGU6IHtcblx0XHRwYWdlU2l6ZTogZ2V0UGFnZVNpemUoKSxcblx0fSxcblxuXHRtb2RlOiBcInNlcnZlclwiLFxuXG5cdHF1ZXJ5UGFyYW1zOiB7XG5cdFx0cGFnZVNpemU6IFwicGFnZVNpemVcIixcblx0XHR0b3RhbFBhZ2VzOiBudWxsLFxuXHRcdHRvdGFsUmVjb3JkczogbnVsbCxcblx0XHRzb3J0S2V5OiBcInNvcnRCeVwiLFxuXHR9LFxuXG5cdHBhcnNlU3RhdGU6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRyZXR1cm4geyB0b3RhbFJlY29yZHM6IHJlc3AudG90YWwgfTtcblx0fSxcblxuXHRwYXJzZVJlY29yZHM6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRyZXR1cm4gcmVzcC5yb3dzO1xuXHR9LFxufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFZpZXdzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IFNtYWxsU2VsZWN0b3IgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImxwLWNob29zZXJcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4vdGVtcGxhdGVzL2xlYXJuaW5nUGF0aENob29zZXIubnVualwiKS5MZWFybmluZ1BhdGhDaG9vc2VyLFxuXG5cdHVpOiB7XG5cdFx0bGFiZWw6IFwicC5jaG9vc2VyLWxhYmVsXCIsXG5cdFx0Z3JvdXBzOiBcInNlbGVjdFtuYW1lPSdncm91cHMnXVwiLFxuXHRcdGFsc29SZXNvdXJjZXNDb250YWluZXI6IFwicC5hbHNvUmVzb3VyY2VzXCIsXG5cdFx0YWxzb1Jlc291cmNlczogXCJpbnB1dFtuYW1lPSdjb250ZW50J11cIixcblx0XHRhbHNvVGFnczogXCJpbnB1dFtuYW1lPSd0YWdzJ11cIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNoYW5nZSBAdWkuZ3JvdXBzXCI6IFwib25MZWFybmluZ1BhdGhTZWxlY3RlZFwiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLmxhYmVsID0gb3B0aW9ucy5sYWJlbCA/IG9wdGlvbnMubGFiZWwgOiBudWxsO1xuXHRcdHRoaXMubWF4SGVpZ2h0ID0gb3B0aW9ucy5tYXhIZWlnaHQgPyBvcHRpb25zLm1heEhlaWdodCA6IG51bGw7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLmxhYmVsKVxuXHRcdFx0dGhpcy51aS5sYWJlbC50ZXh0KHRoaXMubGFiZWwpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMudWkuYWxzb1Jlc291cmNlc0NvbnRhaW5lci5oaWRlKCk7XG5cblx0XHR0aGlzLmxpc3RlblRvKEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJncm91cFNlbGVjdG9yXCIpLCBcIkV2ZW50cy5WYWx1ZUNoYW5nZWRcIiwgdGhpcy5vbkxlYXJuaW5nUGF0aFNlbGVjdGVkLmJpbmQodGhpcykpO1xuXG5cdFx0Y29uc3QgdXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cblx0XHR0aGlzLmdyb3VwcyA9IG5ldyBTZWxlY3RyYSh7XG5cdFx0XHRzb3J0OiB0cnVlLFxuXHRcdFx0c2VydmVyOiB7XG5cdFx0XHRcdGtleTogXCJjb2RlXCIsXG5cdFx0XHRcdHZhbHVlOiBcIm5hbWVcIixcblx0XHRcdFx0ZmV0Y2g6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hY2FjaWEvdXNlcnMvXCIgKyBlbmNvZGVVUklDb21wb25lbnQodXNlci51c2VybmFtZSkgKyBcIi9sZWFybmluZ1BhdGhzP3NraXBFbXB0eT10cnVlXCIsXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdHBhZ2VTaXplOiAzMCxcblx0XHRcdFx0aW5maW5pdGU6IHRydWUsXG5cdFx0XHR9LFxuXHRcdFx0cGxhY2Vob2xkZXI6IFwiTm8gZ3JvdXBzIHNlbGVjdGVkXCIsXG5cdFx0XHR3aWR0aDogdGhpcy5tYXhIZWlnaHQgPyB0aGlzLm1heEhlaWdodCA6IG51bGwsXG5cdFx0XHRkZEhvc3Q6IFwiI2xpbmstcmVzb3VyY2VzXCIsXG5cdFx0fSk7XG5cblx0XHR0aGlzLmdyb3Vwcy5zaG93KHsgZWw6IHRoaXMudWkuZ3JvdXBzIH0pO1xuXHR9LFxuXG5cdG9uTGVhcm5pbmdQYXRoU2VsZWN0ZWQ6IGZ1bmN0aW9uKGV2ZW50LCBtb2RlbCkge1xuXHRcdGlmIChtb2RlbC5nZXQoXCJjb2RlXCIpKSB7XG5cdFx0XHR0aGlzLnRyaWdnZXIoXCJzZWxlY3RlZFwiLCB7XG5cdFx0XHRcdGdyb3VwQ29kZTogbW9kZWwuZ2V0KFwiY29kZVwiKSxcblx0XHRcdFx0d2l0aFJlc291cmNlczogdGhpcy51aS5hbHNvUmVzb3VyY2VzLnByb3AoXCJjaGVja2VkXCIpLFxuXHRcdFx0XHR3aXRoVGFnczogdGhpcy51aS5hbHNvVGFncy5wcm9wKFwiY2hlY2tlZFwiKSxcblx0XHRcdH0pO1xuXHRcdH1cblx0fSxcbn0pO1xuXG5jb25zdCBMYXJnZVNlbGVjdG9yID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJsZWFybmluZ1BhdGgtc2VsZWN0b3JcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4vdGVtcGxhdGVzL2xlYXJuaW5nUGF0aENob29zZXIubnVualwiKS5sZWFybmluZ1BhdGhTZWxlY3RvcixcblxuXHRyZWdpb25zOiB7XG5cdFx0ZmlsdGVyOiBcIi5sZWFybmluZ1BhdGgtZmlsdGVyLXJlZ2lvblwiLFxuXHRcdGdyaWQ6IFwiLmxlYXJuaW5nUGF0aC1ncmlkLXJlZ2lvblwiLFxuXHR9LFxuXG5cdHVpOiB7XG5cdFx0Z3JpZDogXCJkaXYuZ3JpZFwiLFxuXHRcdHJlc3VsdDogXCIucmVzdWx0XCIsXG5cblx0XHRmaWx0ZXJzOiBcIi5sZWFybmluZ1BhdGgtZmlsdGVyLXJlZ2lvbiAuZmlsdGVyc1wiLFxuXHRcdHNlYXJjaEJveDogXCJpbnB1dFwiLFxuXHRcdHNlYXJjaE92ZXJsYXk6IFwiZGl2LmlucHV0LW92ZXJsYXlcIixcblxuXHRcdHBhZ2luZzogXCIucGFnaW5hdGlvblwiLFxuXHRcdGNvdW50ZXI6IFwiLmNvdW50ZXJcIixcblx0XHRwYWdlOiBcIi5wYWdlXCIsXG5cdFx0b3ZlcmxheTogXCIub3ZlcmxheVwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdC8vIFBhZ2luZyBldmVudHNcblx0XHRcImNsaWNrIC5uZXh0XCI6IFwibmV4dFwiLFxuXHRcdFwiY2xpY2sgLnByZXZcIjogXCJwcmV2XCIsXG5cdFx0XCJjbGljayAuZmlyc3RcIjogXCJmaXJzdFwiLFxuXHRcdFwiY2xpY2sgLmxhc3RcIjogXCJsYXN0XCIsXG5cdFx0XCJjbGljayBAdWkucGFnZVwiOiBcImp1bXBUb1BhZ2VcIixcblx0fSxcblxuXHRjb2xsZWN0aW9uRXZlbnRzOiB7XG5cdFx0cmVxdWVzdDogXCJmZXRjaFN0YXJ0XCIsXG5cdFx0XCJzeW5jIGVycm9yXCI6IFwiZmV0Y2hFbmRcIixcblx0fSxcblxuXHRjaGlsZFZpZXdFdmVudHM6IHtcblx0XHRcImNoaWxkOnNlbGVjdDpsZWFybmluZ1BhdGhcIjogXCJvblNlbGVjdFwiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY29sbGVjdGlvbiA9IG5ldyBMZWFybmluZ1BhdGhzKCk7XG5cdFx0dGhpcy5iaW5kRXZlbnRzKHRoaXMuY29sbGVjdGlvbiwgdGhpcy5jb2xsZWN0aW9uRXZlbnRzKTtcblx0fSxcblxuXHRmZXRjaFN0YXJ0OiBmdW5jdGlvbigpIHtcblx0XHQkKFwiZGl2Lm5vLXJlc3VsdHNcIiwgdGhpcy51aS5yZXN1bHQpLnJlbW92ZSgpO1xuXHRcdHRoaXMudWkub3ZlcmxheS5hZGRDbGFzcyhcInNob3duXCIpLmh0bWwoXCI8c3BhbiBjbGFzcz0nc3Bpbm5lcic+PHNwYW4gY2xhc3M9J3NwaW5uZXItaWNvbiBzcGlubmVyLXJlZCcvPiZuYnNwOyZuYnNwO0ZldGNoaW5nLi4uPC9zcGFuPlwiKTtcblx0fSxcblxuXHRmZXRjaEVuZDogZnVuY3Rpb24obW9kZWwsIGVycikge1xuXHRcdGlmIChlcnIgJiYgZXJyLnN0YXR1cykge1xuXHRcdFx0Y29uc3QgZXJyTXNnID0gQXBwLnBhcnNlUmVzcG9uc2UoZXJyKTtcblx0XHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5Ub2FzdCwgeyBjb250ZW50OiAoZXJyTXNnLmRldGFpbCB8fCBlcnJNc2cuaW5mbyksIGljb246IFwiZmEtZXhjbGFtYXRpb24tdHJpYW5nbGVcIiwgaWNvbkNvbG91cjogXCIjZWM1ODQwXCIgfSk7XG5cdFx0fVxuXG5cdFx0JChcImRpdi5uby1yZXN1bHRzXCIsIHRoaXMudWkucmVzdWx0KS5yZW1vdmUoKTtcblx0XHR0aGlzLnVpLm92ZXJsYXkuZW1wdHkoKS5yZW1vdmVDbGFzcyhcInNob3duXCIpO1xuXHRcdHRoaXMudXBkYXRlQ291bnRlcigpO1xuXG5cdFx0aWYgKHRoaXMuY29sbGVjdGlvbi5sZW5ndGggPT09IDApIHtcblx0XHRcdHRoaXMudWkucmVzdWx0LmFwcGVuZChgPGRpdiBjbGFzcz0nbm8tcmVzdWx0cyc+PGRpdj5ObyByZXN1bHRzIGZvdW5kIDxzcGFuIGNsYXNzPSdmYWwgZmEtZnJvd24nLz48L2Rpdj5cblx0XHRcdFx0PGRpdiBjbGFzcz0nc3VidGV4dCc+SWYgeW91IGhhdmUgYW55IGZpbHRlcnMgc2VsZWN0ZWQsIHRyeSBjaGFuZ2luZyB0aGVtLCBvciB1bmNob29zaW5nIHRoZW08L2Rpdj48L2Rpdj5gKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR3aW5kb3cuc2Nyb2xsVG8oMCwgMCk7XG5cdFx0fVxuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBsZWFybmluZ1BhdGhzVmlldyA9IG5ldyBMZWFybmluZ1BhdGhzVmlldyh7IGNvbGxlY3Rpb246IHRoaXMuY29sbGVjdGlvbiB9KTtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJncmlkXCIsIGxlYXJuaW5nUGF0aHNWaWV3KTtcblxuXHRcdC8vIENyZWF0ZSB0aGUgZmlsdGVyXG5cdFx0Y29uc3QgdGV4dEZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwidGV4dFwiLFxuXHRcdFx0bmFtZTogXCJ0ZXh0RmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJUZXh0IFNlYXJjaFwiLFxuXHRcdFx0ZGVib3VuY2U6IDIwMCxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgY3VycmVudGx5QWN0aXZlTGVhcm5pbmdQYXRocyA9IHtcblx0XHRcdHR5cGU6IFwidG9nZ2xlXCIsXG5cdFx0XHRuYW1lOiBcImN1cnJlbnRseUFjdGl2ZUxlYXJuaW5nUGF0aHNcIixcblx0XHRcdGxhYmVsOiBgSGlkZSBvbGQgJHtzZXR0aW5ncy5sZWFybmluZ1BhdGhzUGx1cmFsQ3VzdG9tTmFtZX1gLFxuXHRcdFx0Y2F0ZWdvcmllczogW1xuXHRcdFx0XHR7fSxcblx0XHRcdF0sXG5cdFx0XHRpbml0aWFsVmFsdWU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gW3RydWVdO1xuXHRcdFx0fSxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3Qgc3ViamVjdEZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiaXRlbWl6ZWRcIixcblx0XHRcdG5hbWU6IFwic3ViamVjdEZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiU3ViamVjdFwiLFxuXHRcdFx0c2VydmVyOiB7XG5cdFx0XHRcdGtleTogXCJzdWJqZWN0X2lkXCIsXG5cdFx0XHRcdHZhbHVlOiBcInN1YmplY3RcIixcblx0XHRcdFx0ZmV0Y2g6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2RhdGEvc3ViamVjdHNcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0cGFnZVNpemU6IDMwLFxuXHRcdFx0XHRpbmZpbml0ZTogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0fTtcblxuXHRcdGNvbnN0IGdyYWRlRmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJncmFkZUZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiWWVhciBvZiBTdHVkeVwiLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdFx0Y2F0ZWdvcmllczogXy5tYXAoc2V0dGluZ3MuZ3JhZGVMaXN0LCAodmFsLCBrZXkpID0+ICh7XG5cdFx0XHRcdGxhYmVsOiBrZXksXG5cdFx0XHRcdGl0ZW1zOiBfLnJlZHVjZSh2YWwuc29ydCgoYSwgYikgPT4gKFwibGV4aWNhbFwiIGluIGEgPyBhLmxleGljYWwgOiBhLm5hbWUpLnRvVXBwZXJDYXNlKCkubG9jYWxlQ29tcGFyZSgoXCJsZXhpY2FsXCIgaW4gYiA/IGIubGV4aWNhbCA6IGIubmFtZSkudG9VcHBlckNhc2UoKSkpLFxuXHRcdFx0XHRcdChzdW0sIG51bSkgPT4geyBzdW0ucHVzaCh7IG5hbWU6IG51bS52YWx1ZSwgbGFiZWw6IG51bS5uYW1lIH0pOyByZXR1cm4gc3VtOyB9LCBbXSksXG5cdFx0XHR9KSksXG5cdFx0fTtcblxuXHRcdHRoaXMuZmlsdGVyID0gbmV3IFNlcnZlckZpbHRlck1hbmFnZXIoe1xuXHRcdFx0cmF3OiB0aGlzLmNvbGxlY3Rpb24sXG5cdFx0XHRmaWx0ZXJDb250YWluZXI6IHRoaXMudWkuZmlsdGVycyxcblx0XHRcdGZpbHRlcnM6IFt0ZXh0RmlsdGVyLCBjdXJyZW50bHlBY3RpdmVMZWFybmluZ1BhdGhzLCBzdWJqZWN0RmlsdGVyLCBncmFkZUZpbHRlcl0sXG5cdFx0XHRkZWZhdWx0RmlsdGVyczogW1widGV4dEZpbHRlclwiLCBcImN1cnJlbnRseUFjdGl2ZUxlYXJuaW5nUGF0aHNcIl0sXG5cdFx0fSk7XG5cblx0XHR0aGlzLnVpLmZpbHRlcnMucHJlcGVuZCh0aGlzLmZpbHRlci5yZW5kZXIoKS5lbCk7XG5cblx0XHRpZiAodGhpcy5nZXRRdWVyeVN0cmluZ1BhcmFtKFwicGFnZVwiKSA9PT0gbnVsbCkgeyB0aGlzLmNvbGxlY3Rpb24uZ2V0Rmlyc3RQYWdlKHsgcmVzZXQ6IHRydWUgfSk7IH1cblx0XHRlbHNlIHtcblx0XHRcdGNvbnN0IHBhZ2UgPSBwYXJzZUludCh0aGlzLmdldFF1ZXJ5U3RyaW5nUGFyYW0oXCJwYWdlXCIpLCAxMCk7XG5cdFx0XHR0aGlzLmNvbGxlY3Rpb24uZ2V0UGFnZShwYWdlLCB7IHJlc2V0OiB0cnVlIH0pO1xuXHRcdH1cblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZmlsdGVyLmRlc3Ryb3koKTtcblx0fSxcblxuXHRvblNlbGVjdDogZnVuY3Rpb24obGVhcm5pbmdQYXRoT3B0aW9uTW9kZWwpIHtcblx0XHR0aGlzLnRyaWdnZXIoXCJzZWxlY3RlZFwiLCB7IGxlYXJuaW5nUGF0aE9wdGlvbk1vZGVsOiBsZWFybmluZ1BhdGhPcHRpb25Nb2RlbCB9KTtcblx0fSxcblxuXHRnZXRRdWVyeVN0cmluZ1BhcmFtOiBmdW5jdGlvbihuYW1lKSB7XG5cdFx0Y29uc3QgdXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG5cdFx0Y29uc3QgcGFyc2VkTmFtZSA9IG5hbWUucmVwbGFjZSgvW1xcW1xcXV0vZywgXCJcXFxcJCZcIik7XG5cdFx0Y29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKFwiWz8mXVwiICsgcGFyc2VkTmFtZSArIFwiKD0oW14mI10qKXwmfCN8JClcIiksXG5cdFx0XHRyZXN1bHRzID0gcmVnZXguZXhlYyh1cmwpO1xuXHRcdGlmICghcmVzdWx0cykgcmV0dXJuIG51bGw7XG5cdFx0aWYgKCFyZXN1bHRzWzJdKSByZXR1cm4gXCJcIjtcblx0XHRyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHJlc3VsdHNbMl0ucmVwbGFjZSgvXFwrL2csIFwiIFwiKSk7XG5cdH0sXG5cblx0anVtcFRvUGFnZTogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0Y29uc3QgZWwgPSAkKGV2dC5jdXJyZW50VGFyZ2V0KTtcblx0XHRjb25zdCBwYWdlID0gcGFyc2VJbnQoZWwudGV4dCgpLCAxMCk7XG5cblx0XHR0aGlzLmNvbGxlY3Rpb24uZ2V0UGFnZShwYWdlKTtcblx0fSxcblxuXHRmaXJzdDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jb2xsZWN0aW9uLmdldEZpcnN0UGFnZSh7IHJlc2V0OiB0cnVlIH0pO1xuXHR9LFxuXG5cdHByZXY6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLmNvbGxlY3Rpb24uaGFzUHJldmlvdXNQYWdlKCkpXG5cdFx0XHR0aGlzLmNvbGxlY3Rpb24uZ2V0UHJldmlvdXNQYWdlKCk7XG5cdH0sXG5cblx0bmV4dDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuY29sbGVjdGlvbi5oYXNOZXh0UGFnZSgpKVxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uLmdldE5leHRQYWdlKCk7XG5cdH0sXG5cblx0bGFzdDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jb2xsZWN0aW9uLmdldFBhZ2UodGhpcy5jb2xsZWN0aW9uLnN0YXRlLnRvdGFsUGFnZXMpO1xuXHR9LFxuXG5cdHVwZGF0ZUNvdW50ZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHBhZ2VTdGFydCA9ICgoKHRoaXMuY29sbGVjdGlvbi5zdGF0ZS5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5jb2xsZWN0aW9uLnN0YXRlLnBhZ2VTaXplKSArIDEpO1xuXHRcdGxldCBwYWdlRW5kID0gKCh0aGlzLmNvbGxlY3Rpb24uc3RhdGUuY3VycmVudFBhZ2UpICogdGhpcy5jb2xsZWN0aW9uLnN0YXRlLnBhZ2VTaXplKTtcblx0XHRpZiAocGFnZUVuZCA+IHRoaXMuY29sbGVjdGlvbi5zdGF0ZS50b3RhbFJlY29yZHMpXG5cdFx0XHRwYWdlRW5kID0gdGhpcy5jb2xsZWN0aW9uLnN0YXRlLnRvdGFsUmVjb3Jkcztcblx0XHRsZXQgcHJldkRpc2FibGUgPSB0cnVlLCBuZXh0RGlzYWJsZSA9IHRydWU7XG5cblx0XHRpZiAodGhpcy5jb2xsZWN0aW9uLnN0YXRlLnRvdGFsUGFnZXMgPiAxKSB7XG5cdFx0XHRpZiAodGhpcy5jb2xsZWN0aW9uLnN0YXRlLmN1cnJlbnRQYWdlID4gMSlcblx0XHRcdFx0cHJldkRpc2FibGUgPSBmYWxzZTtcblx0XHRcdGlmICh0aGlzLmNvbGxlY3Rpb24uc3RhdGUuY3VycmVudFBhZ2UgPCB0aGlzLmNvbGxlY3Rpb24uc3RhdGUudG90YWxQYWdlcylcblx0XHRcdFx0bmV4dERpc2FibGUgPSBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5jb2xsZWN0aW9uLnN0YXRlLnRvdGFsUmVjb3JkcyA+IDApIHtcblx0XHRcdGxldCB0ZXh0ID0gXCIgPGRpdiBjbGFzcz0nZmlyc3QganVtcGVyIFwiICsgKHByZXZEaXNhYmxlID8gXCIgZGlzYWJsZWRcIiA6IFwiXCIpICsgXCInIHRpdGxlPSdGaXJzdCBwYWdlJz48c3BhbiBjbGFzcz0nZmFsIGZhLWFuZ2xlLWRvdWJsZS1sZWZ0Jy8+PC9kaXY+IDxkaXYgY2xhc3M9J3ByZXYganVtcGVyIFwiICtcblx0XHRcdFx0KHByZXZEaXNhYmxlID8gXCIgZGlzYWJsZWRcIiA6IFwiXCIpICsgXCInIHRpdGxlPSdQcmV2aW91cyBwYWdlJz48c3BhbiBjbGFzcz0nZmFsIGZhLWFuZ2xlLWxlZnQnLz48L2Rpdj5cIjtcblxuXHRcdFx0Ly8gU2hvdyB1cCB0byAxMCBwYWdlIG51bWJlcnNcblx0XHRcdGNvbnN0IGNvbGxlY3Rpb24gPSB0aGlzLmNvbGxlY3Rpb247XG5cdFx0XHRjb25zdCBzdGF0ZSA9IGNvbGxlY3Rpb24uc3RhdGU7XG5cdFx0XHRjb25zdCB3aW5kb3dTaXplID0gMTA7XG5cdFx0XHRjb25zdCBzbGlkZVNjYWxlID0gMC41O1xuXG5cdFx0XHRjb25zdCBzbGlkZVRoaXNNdWNoID0gZnVuY3Rpb24oZmlyc3RQYWdlLCBsYXN0UGFnZSwgY3VycmVudFBhZ2UsIF93aW5kb3dTaXplLCBfc2xpZGVTY2FsZSkge1xuXHRcdFx0XHRyZXR1cm4gfn4oX3dpbmRvd1NpemUgKiBfc2xpZGVTY2FsZSk7XG5cdFx0XHR9O1xuXG5cdFx0XHRjb25zdCBzbGlkZU1heWJlID0gZnVuY3Rpb24oZmlyc3RQYWdlLCBsYXN0UGFnZSwgY3VycmVudFBhZ2UsIF93aW5kb3dTaXplKSB7XG5cdFx0XHRcdHJldHVybiBNYXRoLnJvdW5kKGN1cnJlbnRQYWdlICUgX3dpbmRvd1NpemUgLyBfd2luZG93U2l6ZSk7XG5cdFx0XHR9O1xuXG5cdFx0XHRjb25zdCBmaXJzdFBhZ2UgPSBzdGF0ZS5maXJzdFBhZ2U7XG5cdFx0XHRsZXQgbGFzdFBhZ2UgPSBOdW1iZXIoc3RhdGUubGFzdFBhZ2UpO1xuXHRcdFx0bGFzdFBhZ2UgPSBNYXRoLm1heCgwLCBmaXJzdFBhZ2UgPyBsYXN0UGFnZSAtIDEgOiBsYXN0UGFnZSk7XG5cdFx0XHRsZXQgY3VycmVudFBhZ2UgPSBNYXRoLm1heChzdGF0ZS5jdXJyZW50UGFnZSwgc3RhdGUuZmlyc3RQYWdlKTtcblx0XHRcdGN1cnJlbnRQYWdlID0gZmlyc3RQYWdlID8gY3VycmVudFBhZ2UgLSAxIDogY3VycmVudFBhZ2U7XG5cblx0XHRcdGxldCB3aW5kb3dTdGFydCA9IE1hdGguZmxvb3IoY3VycmVudFBhZ2UgLyB3aW5kb3dTaXplKSAqIHdpbmRvd1NpemU7XG5cdFx0XHRpZiAoY3VycmVudFBhZ2UgPD0gbGFzdFBhZ2UgLSBzbGlkZVRoaXNNdWNoKCkpIHtcblx0XHRcdFx0d2luZG93U3RhcnQgKz0gKHNsaWRlTWF5YmUoZmlyc3RQYWdlLCBsYXN0UGFnZSwgY3VycmVudFBhZ2UsIHdpbmRvd1NpemUsIHNsaWRlU2NhbGUpICpcblx0XHRcdFx0c2xpZGVUaGlzTXVjaChmaXJzdFBhZ2UsIGxhc3RQYWdlLCBjdXJyZW50UGFnZSwgd2luZG93U2l6ZSwgc2xpZGVTY2FsZSkpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3Qgd2luZG93RW5kID0gTWF0aC5taW4obGFzdFBhZ2UgKyAxLCB3aW5kb3dTdGFydCArIHdpbmRvd1NpemUpO1xuXG5cdFx0XHRmb3IobGV0IGkgPSB3aW5kb3dTdGFydDsgaSA8IHdpbmRvd0VuZDsgaSsrKVxuXHRcdFx0XHR0ZXh0ICs9IGA8c3BhbiBjbGFzcz0ncGFnZSAkeyBpICsgMSA9PT0gc3RhdGUuY3VycmVudFBhZ2UgPyBcImFjdGl2ZVwiIDogXCJcIn0nPiR7IGkgKyAxIH08L3NwYW4+YDtcblxuXHRcdFx0dGV4dCArPSBcIjxkaXYgY2xhc3M9J25leHQganVtcGVyIFwiICsgKG5leHREaXNhYmxlID8gXCIgZGlzYWJsZWRcIiA6IFwiXCIpICsgXCInIHRpdGxlPSdOZXh0IHBhZ2UnPjxzcGFuIGNsYXNzPSdmYWwgZmEtYW5nbGUtcmlnaHQnLz48L2Rpdj4gPGRpdiBjbGFzcz0nbGFzdCBqdW1wZXIgXCIgK1xuXHRcdFx0XHQobmV4dERpc2FibGUgPyBcIiBkaXNhYmxlZFwiIDogXCJcIikgKyBcIicgdGl0bGU9J0xhc3QgcGFnZSc+PHNwYW4gY2xhc3M9J2ZhbCBmYS1hbmdsZS1kb3VibGUtcmlnaHQnLz48L2Rpdj5cIjtcblxuXHRcdFx0Y29uc3QgY291bnRlclRleHQgPSBcIjxzcGFuIGNsYXNzPSdjb3VudGVySW5mbyc+XCIgKyBzZXR0aW5ncy5sZWFybmluZ1BhdGhzQ3VzdG9tTmFtZSArIFwiIFwiICsgcGFnZVN0YXJ0ICsgXCIgLSBcIiArIHBhZ2VFbmQgKyBcIiBvZiBcIiArXG5cdFx0XHRcdHN0YXRlLnRvdGFsUmVjb3Jkcy50b1N0cmluZygpLnJlcGxhY2UoL1xcQig/PShcXGR7M30pKyg/IVxcZCkpL2csIFwiIFwiKSArIFwiPC9zcGFuPlwiO1xuXG5cdFx0XHR0aGlzLnVpLnBhZ2luZy5odG1sKHRleHQpO1xuXHRcdFx0dGhpcy51aS5jb3VudGVyLmh0bWwoY291bnRlclRleHQpO1xuXG5cdFx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuTmF2aWdhdGUsIHNldHRpbmdzLnVybFJvb3QgKyBcIi9jb25zb2xlL2xlYXJuaW5nUGF0aHM/cGFnZT1cIiArIChjdXJyZW50UGFnZSArIDEpLCB7IHRyaWdnZXI6IGZhbHNlLCByZXBsYWNlOiB0cnVlIH0pO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMudWkucGFnaW5nLmVtcHR5KCk7XG5cdFx0XHR0aGlzLnVpLmNvdW50ZXIuZW1wdHkoKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5nZXRRdWVyeVN0cmluZ1BhcmFtKFwidGV4dEZpbHRlclwiKSkge1xuXHRcdFx0Y29uc3Qgc2VhcmNoVGV4dCA9IF8ucmVwbGFjZSh0aGlzLmdldFF1ZXJ5U3RyaW5nUGFyYW0oXCJ0ZXh0RmlsdGVyXCIpLCAvXFx8L2csIFwiIFwiKTtcblx0XHRcdCQoXCIuc2VhcmNoLWlucHV0XCIpLnZhbChzZWFyY2hUZXh0KTtcblx0XHR9XG5cdH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImxlYXJuaW5nUGF0aC1zZWxlY3Rvci1sYXlvdXRcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4vdGVtcGxhdGVzL2xlYXJuaW5nUGF0aENob29zZXIubnVualwiKS5sYXlvdXQsXG5cblx0cmVnaW9uczoge1xuXHRcdGNvbnRlbnQ6IFwiLmxlYXJuaW5nUGF0aC1zZWxlY3Rvci1yZWdpb25cIixcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMub3B0aW9ucy5sYXJnZSkge1xuXHRcdFx0dGhpcy5zZWxlY3RvclZpZXcgPSBuZXcgTGFyZ2VTZWxlY3RvcigpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMuc2VsZWN0b3JWaWV3ID0gbmV3IFNtYWxsU2VsZWN0b3Ioe1xuXHRcdFx0XHRsYWJlbDogdGhpcy5vcHRpb25zLmxhYmVsLFxuXHRcdFx0XHRtYXhIZWlnaHQ6IHRoaXMub3B0aW9ucy5tYXhIZWlnaHQsXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJjb250ZW50XCIsIHRoaXMuc2VsZWN0b3JWaWV3KTtcblxuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5zZWxlY3RvclZpZXcsIFwic2VsZWN0ZWRcIiwgdGhpcy5vbkxlYXJuaW5nUGF0aFNlbGVjdGVkLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdG9uTGVhcm5pbmdQYXRoU2VsZWN0ZWQ6IGZ1bmN0aW9uKGRldGFpbHMpIHtcblx0XHR0aGlzLnRyaWdnZXIoXCJzZWxlY3RlZFwiLCBkZXRhaWxzKTtcblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLnNlbGVjdG9yVmlldyk7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar settings = require(\"app-settings\");\nvar gradeMap = require(\"../lib/gradeMap\");\nvar tippy = require(\"tippy.js\").default;\nvar $ = require(\"jquery\");\n\nvar LastUsedModel = Backbone.Model.extend({\n\tdefaults: {\n\t\ttype: \"learningPath\"\n\t},\n\n\tidAttribute: \"last_used_id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/acacia/logs/lastUsed\";\n\t}\n});\n\nvar LearningPathView = Backbone.Marionette.View.extend({\n\tclassName: \"\",\n\ttemplate: require(\"./templates/learningPathsView.nunj\"),\n\n\tui: {\n\t\tcontainer: \".container\",\n\t\ttype: \".cover-type\",\n\t\tinfo: \".info\",\n\t\tlearningPathTooltip: \".learningPathTooltip\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.container\": \"viewLearningPath\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.model.set(\"grade\", this.model.has(\"grade\") ? gradeMap.codeToHumanValue(this.model.get(\"grade\"), { lexical: true }) : \"\");\n\t},\n\n\tserializeData: function serializeData() {\n\t\treturn this.model.toJSON();\n\t},\n\n\tonAttach: function onAttach() {\n\t\tthis.ui.learningPathTooltip.each(function (i, el) {\n\t\t\ttippy(el, {\n\t\t\t\ttheme: \"black\",\n\t\t\t\tplacement: \"top\",\n\t\t\t\tarrow: true,\n\t\t\t\tcontent: $(el).attr(\"data-title\"),\n\t\t\t\tdelay: 500\n\t\t\t});\n\t\t});\n\t},\n\n\tviewLearningPath: function viewLearningPath(event) {\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\t\tvar lastUsed = new LastUsedModel({ item_id: this.model.get(\"group_id\") });\n\t\tlastUsed.save();\n\t\tthis.trigger(\"select:learningPath\", this.model);\n\t}\n});\n\nvar LearningPathsView = Backbone.Marionette.CollectionView.extend({\n\tclassName: \"row-container\",\n\tchildView: LearningPathView,\n\tchildViewTriggers: {\n\t\t\"select:learningPath\": \"child:select:learningPath\"\n\t}\n});\n\nmodule.exports = LearningPathsView;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxlYXJuaW5nUGF0aHNWaWV3LmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsInNldHRpbmdzIiwiZ3JhZGVNYXAiLCJ0aXBweSIsImRlZmF1bHQiLCIkIiwiTGFzdFVzZWRNb2RlbCIsIk1vZGVsIiwiZXh0ZW5kIiwiZGVmYXVsdHMiLCJ0eXBlIiwiaWRBdHRyaWJ1dGUiLCJ1cmxSb290IiwiTGVhcm5pbmdQYXRoVmlldyIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiY2xhc3NOYW1lIiwidGVtcGxhdGUiLCJ1aSIsImNvbnRhaW5lciIsImluZm8iLCJsZWFybmluZ1BhdGhUb29sdGlwIiwiZXZlbnRzIiwiaW5pdGlhbGl6ZSIsIm1vZGVsIiwic2V0IiwiaGFzIiwiY29kZVRvSHVtYW5WYWx1ZSIsImdldCIsImxleGljYWwiLCJzZXJpYWxpemVEYXRhIiwidG9KU09OIiwib25BdHRhY2giLCJlYWNoIiwiaSIsImVsIiwidGhlbWUiLCJwbGFjZW1lbnQiLCJhcnJvdyIsImNvbnRlbnQiLCJhdHRyIiwiZGVsYXkiLCJ2aWV3TGVhcm5pbmdQYXRoIiwiZXZlbnQiLCJzdG9wUHJvcGFnYXRpb24iLCJwcmV2ZW50RGVmYXVsdCIsImxhc3RVc2VkIiwiaXRlbV9pZCIsInNhdmUiLCJ0cmlnZ2VyIiwiTGVhcm5pbmdQYXRoc1ZpZXciLCJDb2xsZWN0aW9uVmlldyIsImNoaWxkVmlldyIsImNoaWxkVmlld1RyaWdnZXJzIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUMsV0FBV0QsUUFBUSxjQUFSLENBQWpCO0FBQ0EsSUFBTUUsV0FBV0YsUUFBUSxpQkFBUixDQUFqQjtBQUNBLElBQU1HLFFBQVFILFFBQVEsVUFBUixFQUFvQkksT0FBbEM7QUFDQSxJQUFNQyxJQUFJTCxRQUFRLFFBQVIsQ0FBVjs7QUFFQSxJQUFNTSxnQkFBZ0JQLFNBQVNRLEtBQVQsQ0FBZUMsTUFBZixDQUFzQjtBQUMzQ0MsV0FBVTtBQUNUQyxRQUFNO0FBREcsRUFEaUM7O0FBSzNDQyxjQUFhLGNBTDhCOztBQU8zQ0MsVUFBUyxtQkFBVztBQUNuQixTQUFPWCxTQUFTVyxPQUFULEdBQW1CLHVCQUExQjtBQUNBO0FBVDBDLENBQXRCLENBQXRCOztBQVlBLElBQU1DLG1CQUFtQmQsU0FBU2UsVUFBVCxDQUFvQkMsSUFBcEIsQ0FBeUJQLE1BQXpCLENBQWdDO0FBQ3hEUSxZQUFXLEVBRDZDO0FBRXhEQyxXQUFVakIsUUFBUSxvQ0FBUixDQUY4Qzs7QUFJeERrQixLQUFJO0FBQ0hDLGFBQVcsWUFEUjtBQUVIVCxRQUFNLGFBRkg7QUFHSFUsUUFBTSxPQUhIO0FBSUhDLHVCQUFxQjtBQUpsQixFQUpvRDs7QUFXeERDLFNBQVE7QUFDUCx5QkFBdUI7QUFEaEIsRUFYZ0Q7O0FBZXhEQyxhQUFZLHNCQUFXO0FBQ3RCLE9BQUtDLEtBQUwsQ0FBV0MsR0FBWCxDQUFlLE9BQWYsRUFBd0IsS0FBS0QsS0FBTCxDQUFXRSxHQUFYLENBQWUsT0FBZixJQUEwQnhCLFNBQVN5QixnQkFBVCxDQUEwQixLQUFLSCxLQUFMLENBQVdJLEdBQVgsQ0FBZSxPQUFmLENBQTFCLEVBQW1ELEVBQUVDLFNBQVMsSUFBWCxFQUFuRCxDQUExQixHQUFrRyxFQUExSDtBQUNBLEVBakJ1RDs7QUFtQnhEQyxnQkFBZSx5QkFBVztBQUN6QixTQUFPLEtBQUtOLEtBQUwsQ0FBV08sTUFBWCxFQUFQO0FBQ0EsRUFyQnVEOztBQXVCeERDLFdBQVUsb0JBQVc7QUFDcEIsT0FBS2QsRUFBTCxDQUFRRyxtQkFBUixDQUE0QlksSUFBNUIsQ0FBaUMsVUFBQ0MsQ0FBRCxFQUFJQyxFQUFKLEVBQVc7QUFDM0NoQyxTQUFNZ0MsRUFBTixFQUFVO0FBQ1RDLFdBQU8sT0FERTtBQUVUQyxlQUFXLEtBRkY7QUFHVEMsV0FBTyxJQUhFO0FBSVRDLGFBQVNsQyxFQUFFOEIsRUFBRixFQUFNSyxJQUFOLENBQVcsWUFBWCxDQUpBO0FBS1RDLFdBQU87QUFMRSxJQUFWO0FBT0EsR0FSRDtBQVNBLEVBakN1RDs7QUFtQ3hEQyxtQkFBa0IsMEJBQVNDLEtBQVQsRUFBZ0I7QUFDakNBLFFBQU1DLGVBQU47QUFDQUQsUUFBTUUsY0FBTjtBQUNBLE1BQU1DLFdBQVcsSUFBSXhDLGFBQUosQ0FBa0IsRUFBRXlDLFNBQVMsS0FBS3ZCLEtBQUwsQ0FBV0ksR0FBWCxDQUFlLFVBQWYsQ0FBWCxFQUFsQixDQUFqQjtBQUNBa0IsV0FBU0UsSUFBVDtBQUNBLE9BQUtDLE9BQUwsQ0FBYSxxQkFBYixFQUFvQyxLQUFLekIsS0FBekM7QUFDQTtBQXpDdUQsQ0FBaEMsQ0FBekI7O0FBNENBLElBQU0wQixvQkFBb0JuRCxTQUFTZSxVQUFULENBQW9CcUMsY0FBcEIsQ0FBbUMzQyxNQUFuQyxDQUEwQztBQUNuRVEsWUFBVyxlQUR3RDtBQUVuRW9DLFlBQVd2QyxnQkFGd0Q7QUFHbkV3QyxvQkFBbUI7QUFDbEIseUJBQXVCO0FBREw7QUFIZ0QsQ0FBMUMsQ0FBMUI7O0FBUUFDLE9BQU9DLE9BQVAsR0FBaUJMLGlCQUFqQiIsImZpbGUiOiJsZWFybmluZ1BhdGhzVmlldy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5jb25zdCBncmFkZU1hcCA9IHJlcXVpcmUoXCIuLi9saWIvZ3JhZGVNYXBcIik7XG5jb25zdCB0aXBweSA9IHJlcXVpcmUoXCJ0aXBweS5qc1wiKS5kZWZhdWx0O1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5cbmNvbnN0IExhc3RVc2VkTW9kZWwgPSBCYWNrYm9uZS5Nb2RlbC5leHRlbmQoe1xuXHRkZWZhdWx0czoge1xuXHRcdHR5cGU6IFwibGVhcm5pbmdQYXRoXCIsXG5cdH0sXG5cblx0aWRBdHRyaWJ1dGU6IFwibGFzdF91c2VkX2lkXCIsXG5cblx0dXJsUm9vdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hY2FjaWEvbG9ncy9sYXN0VXNlZFwiO1xuXHR9LFxufSk7XG5cbmNvbnN0IExlYXJuaW5nUGF0aFZpZXcgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcIlwiLFxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4vdGVtcGxhdGVzL2xlYXJuaW5nUGF0aHNWaWV3Lm51bmpcIiksXG5cblx0dWk6IHtcblx0XHRjb250YWluZXI6IFwiLmNvbnRhaW5lclwiLFxuXHRcdHR5cGU6IFwiLmNvdmVyLXR5cGVcIixcblx0XHRpbmZvOiBcIi5pbmZvXCIsXG5cdFx0bGVhcm5pbmdQYXRoVG9vbHRpcDogXCIubGVhcm5pbmdQYXRoVG9vbHRpcFwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmNvbnRhaW5lclwiOiBcInZpZXdMZWFybmluZ1BhdGhcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm1vZGVsLnNldChcImdyYWRlXCIsIHRoaXMubW9kZWwuaGFzKFwiZ3JhZGVcIikgPyBncmFkZU1hcC5jb2RlVG9IdW1hblZhbHVlKHRoaXMubW9kZWwuZ2V0KFwiZ3JhZGVcIiksIHsgbGV4aWNhbDogdHJ1ZSB9KSA6IFwiXCIpO1xuXHR9LFxuXG5cdHNlcmlhbGl6ZURhdGE6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1vZGVsLnRvSlNPTigpO1xuXHR9LFxuXG5cdG9uQXR0YWNoOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmxlYXJuaW5nUGF0aFRvb2x0aXAuZWFjaCgoaSwgZWwpID0+IHtcblx0XHRcdHRpcHB5KGVsLCB7XG5cdFx0XHRcdHRoZW1lOiBcImJsYWNrXCIsXG5cdFx0XHRcdHBsYWNlbWVudDogXCJ0b3BcIixcblx0XHRcdFx0YXJyb3c6IHRydWUsXG5cdFx0XHRcdGNvbnRlbnQ6ICQoZWwpLmF0dHIoXCJkYXRhLXRpdGxlXCIpLFxuXHRcdFx0XHRkZWxheTogNTAwLFxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH0sXG5cblx0dmlld0xlYXJuaW5nUGF0aDogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdGNvbnN0IGxhc3RVc2VkID0gbmV3IExhc3RVc2VkTW9kZWwoeyBpdGVtX2lkOiB0aGlzLm1vZGVsLmdldChcImdyb3VwX2lkXCIpIH0pO1xuXHRcdGxhc3RVc2VkLnNhdmUoKTtcblx0XHR0aGlzLnRyaWdnZXIoXCJzZWxlY3Q6bGVhcm5pbmdQYXRoXCIsIHRoaXMubW9kZWwpO1xuXHR9LFxufSk7XG5cbmNvbnN0IExlYXJuaW5nUGF0aHNWaWV3ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5Db2xsZWN0aW9uVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwicm93LWNvbnRhaW5lclwiLFxuXHRjaGlsZFZpZXc6IExlYXJuaW5nUGF0aFZpZXcsXG5cdGNoaWxkVmlld1RyaWdnZXJzOiB7XG5cdFx0XCJzZWxlY3Q6bGVhcm5pbmdQYXRoXCI6IFwiY2hpbGQ6c2VsZWN0OmxlYXJuaW5nUGF0aFwiLFxuXHR9LFxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gTGVhcm5pbmdQYXRoc1ZpZXc7XG4iXX0=",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar Backbone = require(\"backbone\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"light-box\",\n\n\ttemplate: require(\"./templates/lightBox.nunj\"),\n\n\tui: {\n\t\tcloseMessage: \".light-box-close-message\"\n\t},\n\n\tevents: {\n\t\tclick: \"onClick\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\timage: this.image,\n\t\t\tvideo: this.video\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.host = $(options && options.host || \"#modals\");\n\t\tthis.image = options.image;\n\t\tthis.video = options.video;\n\t},\n\n\tshow: function show() {\n\t\t$(\".modal-container\", this.host).append(this.render().$el);\n\t},\n\n\tonRender: function onRender() {\n\t\t// Show the modal background\n\t\t$(\".modal-element\", this.host).removeClass(\"hide\");\n\t\t$(\"body\").addClass(\"hide-overflow\");\n\n\t\t// The modal itself should allow clicks to propagate so that menus in the\n\t\t// modal will be hidden correctly. However, everything underneath the modal\n\t\t// should be unaffected by clicks\n\t\t$(\"#modals\").on(\"click\", function (event) {\n\t\t\treturn event.stopPropagation();\n\t\t});\n\t\t$(\".modal-container\").on(\"click\", this.onOutsideClick.bind(this));\n\n\t\tif (this.image) $(\"img\", this.$el).on(\"load\", this.flashCloseMessage.bind(this));else if (this.video) $(\"video\", this.$el).on(\"canplay\", this.flashCloseMessage.bind(this));\n\t},\n\n\tonImageLoad: function onImageLoad() {\n\t\tthis.flashCloseMessage();\n\t},\n\n\tonClick: function onClick(event) {\n\t\tevent.stopPropagation();\n\t},\n\n\tonOutsideClick: function onOutsideClick(event) {\n\t\tevent.stopPropagation();\n\t\tthis.close();\n\t},\n\n\tflashCloseMessage: function flashCloseMessage() {\n\t\tvar _this = this;\n\n\t\tthis.ui.closeMessage.css({\n\t\t\ttop: this.$el.offset().top + this.$el.height() / 4 * 3 + \"px\",\n\t\t\tleft: this.$el.offset().left + this.$el.width() / 2 - this.ui.closeMessage.width() / 2 + \"px\"\n\t\t});\n\n\t\tthis.ui.closeMessage.removeClass(\"light-box-close-message-faded\");\n\n\t\tsetTimeout(function () {\n\t\t\tif (_this.ui.closeMessage.addClass) _this.ui.closeMessage.addClass(\"light-box-close-message-faded\");\n\t\t}, 2000);\n\t},\n\n\tclose: function close() {\n\t\t$(\".modal-element\", this.host).addClass(\"hide\");\n\t\t$(\"body\").removeClass(\"hide-overflow\");\n\n\t\tthis.destroy();\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpZ2h0Qm94LmpzIl0sIm5hbWVzIjpbIiQiLCJyZXF1aXJlIiwiQmFja2JvbmUiLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJleHRlbmQiLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsInVpIiwiY2xvc2VNZXNzYWdlIiwiZXZlbnRzIiwiY2xpY2siLCJ0ZW1wbGF0ZUNvbnRleHQiLCJpbWFnZSIsInZpZGVvIiwiaW5pdGlhbGl6ZSIsIm9wdGlvbnMiLCJob3N0Iiwic2hvdyIsImFwcGVuZCIsInJlbmRlciIsIiRlbCIsIm9uUmVuZGVyIiwicmVtb3ZlQ2xhc3MiLCJhZGRDbGFzcyIsIm9uIiwiZXZlbnQiLCJzdG9wUHJvcGFnYXRpb24iLCJvbk91dHNpZGVDbGljayIsImJpbmQiLCJmbGFzaENsb3NlTWVzc2FnZSIsIm9uSW1hZ2VMb2FkIiwib25DbGljayIsImNsb3NlIiwiY3NzIiwidG9wIiwib2Zmc2V0IiwiaGVpZ2h0IiwibGVmdCIsIndpZHRoIiwic2V0VGltZW91dCIsImRlc3Ryb3kiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsV0FBV0QsUUFBUSxVQUFSLENBQWpCOztBQUVBRSxPQUFPQyxPQUFQLEdBQWlCRixTQUFTRyxVQUFULENBQW9CQyxJQUFwQixDQUF5QkMsTUFBekIsQ0FBZ0M7QUFDaERDLFlBQVcsV0FEcUM7O0FBR2hEQyxXQUFVUixRQUFRLDJCQUFSLENBSHNDOztBQUtoRFMsS0FBSTtBQUNIQyxnQkFBYztBQURYLEVBTDRDOztBQVNoREMsU0FBUTtBQUNQQyxTQUFPO0FBREEsRUFUd0M7O0FBYWhEQyxrQkFBaUIsMkJBQVc7QUFDM0IsU0FBTztBQUNOQyxVQUFPLEtBQUtBLEtBRE47QUFFTkMsVUFBTyxLQUFLQTtBQUZOLEdBQVA7QUFJQSxFQWxCK0M7O0FBb0JoREMsYUFBWSxvQkFBU0MsT0FBVCxFQUFrQjtBQUM3QixPQUFLQyxJQUFM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dXNlIHN0cmljdFwiO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImxpZ2h0LWJveFwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi90ZW1wbGF0ZXMvbGlnaHRCb3gubnVualwiKSxcblxuXHR1aToge1xuXHRcdGNsb3NlTWVzc2FnZTogXCIubGlnaHQtYm94LWNsb3NlLW1lc3NhZ2VcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRjbGljazogXCJvbkNsaWNrXCIsXG5cdH0sXG5cblx0dGVtcGxhdGVDb250ZXh0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aW1hZ2U6IHRoaXMuaW1hZ2UsXG5cdFx0XHR2aWRlbzogdGhpcy52aWRlbyxcblx0XHR9O1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLmhvc3QgPSAkKG9wdGlvbnMgJiYgb3B0aW9ucy5ob3N0IHx8IFwiI21vZGFsc1wiKTtcblx0XHR0aGlzLmltYWdlID0gb3B0aW9ucy5pbWFnZTtcblx0XHR0aGlzLnZpZGVvID0gb3B0aW9ucy52aWRlbztcblx0fSxcblxuXHRzaG93OiBmdW5jdGlvbigpIHtcblx0XHQkKFwiLm1vZGFsLWNvbnRhaW5lclwiLCB0aGlzLmhvc3QpLmFwcGVuZCh0aGlzLnJlbmRlcigpLiRlbCk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIFNob3cgdGhlIG1vZGFsIGJhY2tncm91bmRcblx0XHQkKFwiLm1vZGFsLWVsZW1lbnRcIiwgdGhpcy5ob3N0KS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0JChcImJvZHlcIikuYWRkQ2xhc3MoXCJoaWRlLW92ZXJmbG93XCIpO1xuXG5cdFx0Ly8gVGhlIG1vZGFsIGl0c2VsZiBzaG91bGQgYWxsb3cgY2xpY2tzIHRvIHByb3BhZ2F0ZSBzbyB0aGF0IG1lbnVzIGluIHRoZVxuXHRcdC8vIG1vZGFsIHdpbGwgYmUgaGlkZGVuIGNvcnJlY3RseS4gSG93ZXZlciwgZXZlcnl0aGluZyB1bmRlcm5lYXRoIHRoZSBtb2RhbFxuXHRcdC8vIHNob3VsZCBiZSB1bmFmZmVjdGVkIGJ5IGNsaWNrc1xuXHRcdCQoXCIjbW9kYWxzXCIpLm9uKFwiY2xpY2tcIiwgZXZlbnQgPT4gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCkpO1xuXHRcdCQoXCIubW9kYWwtY29udGFpbmVyXCIpLm9uKFwiY2xpY2tcIiwgdGhpcy5vbk91dHNpZGVDbGljay5iaW5kKHRoaXMpKTtcblxuXHRcdGlmICh0aGlzLmltYWdlKVxuXHRcdFx0JChcImltZ1wiLCB0aGlzLiRlbCkub24oXCJsb2FkXCIsIHRoaXMuZmxhc2hDbG9zZU1lc3NhZ2UuYmluZCh0aGlzKSk7XG5cdFx0ZWxzZSBpZiAodGhpcy52aWRlbylcblx0XHRcdCQoXCJ2aWRlb1wiLCB0aGlzLiRlbCkub24oXCJjYW5wbGF5XCIsIHRoaXMuZmxhc2hDbG9zZU1lc3NhZ2UuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0b25JbWFnZUxvYWQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZmxhc2hDbG9zZU1lc3NhZ2UoKTtcblx0fSxcblxuXHRvbkNsaWNrOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9LFxuXG5cdG9uT3V0c2lkZUNsaWNrOiBmdW5jdGlvbihldmVudCkge1xuXHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdHRoaXMuY2xvc2UoKTtcblx0fSxcblxuXHRmbGFzaENsb3NlTWVzc2FnZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5jbG9zZU1lc3NhZ2UuY3NzKHtcblx0XHRcdHRvcDogKHRoaXMuJGVsLm9mZnNldCgpLnRvcCArIHRoaXMuJGVsLmhlaWdodCgpIC8gNCAqIDMpICsgXCJweFwiLFxuXHRcdFx0bGVmdDogKHRoaXMuJGVsLm9mZnNldCgpLmxlZnQgKyB0aGlzLiRlbC53aWR0aCgpIC8gMiAtIHRoaXMudWkuY2xvc2VNZXNzYWdlLndpZHRoKCkgLyAyKSArIFwicHhcIixcblx0XHR9KTtcblxuXHRcdHRoaXMudWkuY2xvc2VNZXNzYWdlLnJlbW92ZUNsYXNzKFwibGlnaHQtYm94LWNsb3NlLW1lc3NhZ2UtZmFkZWRcIik7XG5cblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdGlmICh0aGlzLnVpLmNsb3NlTWVzc2FnZS5hZGRDbGFzcylcblx0XHRcdFx0dGhpcy51aS5jbG9zZU1lc3NhZ2UuYWRkQ2xhc3MoXCJsaWdodC1ib3gtY2xvc2UtbWVzc2FnZS1mYWRlZFwiKTtcblx0XHR9LCAyMDAwKTtcblx0fSxcblxuXHRjbG9zZTogZnVuY3Rpb24oKSB7XG5cdFx0JChcIi5tb2RhbC1lbGVtZW50XCIsIHRoaXMuaG9zdCkuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdCQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKFwiaGlkZS1vdmVyZmxvd1wiKTtcblxuXHRcdHRoaXMuZGVzdHJveSgpO1xuXHR9LFxufSk7Il19",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\n\nvar Behaviors = {};\n\n// -----------------------------------------------------------------------------\n// Header\n// -----------------------------------------------------------------------------\n\nvar Header = Backbone.Marionette.View.extend({\n\tclassName: \"mk-header\",\n\n\ttemplate: require(\"../templates/modalKit/modal.nunj\").header,\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\ttitle: this.title || \"\"\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.eventBus = options.eventBus;\n\t}\n});\n\n// -----------------------------------------------------------------------------\n// Body\n// -----------------------------------------------------------------------------\n\nvar Body = Backbone.Marionette.View.extend({\n\tinitialize: function initialize(options) {\n\t\tthis.eventBus = options.eventBus;\n\n\t\t// Register event handlers\n\t\tif (this.onModelDestroyed) this.listenTo(this.eventBus, \"mk-modal:destroyed\", this.onModelDestroyed.bind(this));\n\n\t\tif (this.onModelSaved) this.listenTo(this.eventBus, \"mk-modal:saved\", this.onModelSaved.bind(this));\n\n\t\tif (this.onModelError) this.listenTo(this.eventBus, \"mk-modal:error\", this.onModelError.bind(this));\n\t},\n\n\tchangePage: function changePage(newPage) {\n\t\tthis.eventBus.trigger(\"mk-modal:page\", newPage);\n\t},\n\n\tcloseModal: function closeModal(action, data) {\n\t\tthis.eventBus.trigger(\"mk-modal:close\", action, data);\n\t},\n\n\tdestroyModel: function destroyModel() {\n\t\tthis.eventBus.trigger(\"mk-modal:destroy\");\n\t},\n\n\tsaveModel: function saveModel() {\n\t\tthis.eventBus.trigger(\"mk-modal:save\");\n\t}\n});\n\n// -----------------------------------------------------------------------------\n// Footer\n// -----------------------------------------------------------------------------\n\nvar AcceptButton = Backbone.Marionette.Behavior.extend({\n\tui: {\n\t\tacceptButton: \".mk-footer-button.mk-accept\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.acceptButton\": \"onAcceptButtonClick\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.view.acceptButton = true;\n\t\tthis.view.acceptButtonRequiresValidation = this.options.requireValidation;\n\t},\n\n\tonAcceptButtonClick: function onAcceptButtonClick() {\n\t\tthis.view.eventBus.trigger(\"mk-page:accept\");\n\t}\n});\n\nvar CancelButton = Backbone.Marionette.Behavior.extend({\n\tui: {\n\t\tcancelButton: \".mk-footer-button.mk-cancel\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.cancelButton\": \"onCancelButtonClick\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.view.cancelButton = true;\n\t},\n\n\tonCancelButtonClick: function onCancelButtonClick() {\n\t\tthis.view.eventBus.trigger(\"mk-page:cancel\");\n\t}\n});\n\nvar CloseButton = Backbone.Marionette.Behavior.extend({\n\tui: {\n\t\tcloseButton: \".mk-footer-button.mk-close\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.closeButton\": \"onCloseButtonClick\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.view.closeButton = true;\n\t},\n\n\tonCloseButtonClick: function onCloseButtonClick() {\n\t\tthis.view.eventBus.trigger(\"mk-page:close\");\n\t}\n});\n\nvar NavigationButtonNext = Backbone.Marionette.Behavior.extend({\n\tui: {\n\t\tbutton: \".mk-footer-button.mk-navigate\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.button\": \"onButtonClick\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.view.navigationButtonNext = true;\n\t},\n\n\tonButtonClick: function onButtonClick() {\n\t\tif (this.view.showButton(\"navigationButtonNext\")) this.view.eventBus.trigger(\"mk-page:navigate:next\");\n\t}\n});\n\nvar NavigationButtonPrevious = Backbone.Marionette.Behavior.extend({\n\tui: {\n\t\tbutton: \".mk-footer-button.mk-navigate\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.button\": \"onButtonClick\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.view.navigationButtonPrevious = true;\n\t},\n\n\tonButtonClick: function onButtonClick() {\n\t\tif (this.view.showButton(\"navigationButtonPrevious\")) this.view.eventBus.trigger(\"mk-page:navigate:previous\");\n\t}\n});\n\nvar NoButton = Backbone.Marionette.Behavior.extend({\n\tui: {\n\t\tnoButton: \".mk-footer-button.mk-no\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.noButton\": \"onNoButtonClick\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.view.noButton = true;\n\t},\n\n\tonNoButtonClick: function onNoButtonClick() {\n\t\tthis.view.eventBus.trigger(\"mk-page:no\");\n\t}\n});\n\nvar YesButton = Backbone.Marionette.Behavior.extend({\n\tui: {\n\t\tyesButton: \".mk-footer-button.mk-yes\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.yesButton\": \"onYesButtonClick\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.view.yesButton = true;\n\t},\n\n\tonYesButtonClick: function onYesButtonClick() {\n\t\tthis.view.eventBus.trigger(\"mk-page:yes\");\n\t}\n});\n\nvar Footer = Backbone.Marionette.View.extend({\n\tclassName: \"mk-footer\",\n\n\ttemplate: require(\"../templates/modalKit/modal.nunj\").footer,\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this = this;\n\n\t\treturn {\n\t\t\tshowButton: function showButton(buttonName) {\n\t\t\t\treturn _this.showButton(buttonName);\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.eventBus = options.eventBus;\n\n\t\tif (this.acceptButtonRequiresValidation) this.listenTo(this.eventBus, \"mk-modal:validate\", this.onValidate.bind(this));\n\t},\n\n\tshowButton: function showButton(buttonName) {\n\t\treturn Boolean(this[buttonName]);\n\t},\n\n\tonValidate: function onValidate(valid) {\n\t\tvar acceptButton = $(\".mk-accept\", this.$el);\n\n\t\tif (valid) {\n\t\t\tacceptButton.removeClass(\"mk-disabled\");\n\t\t\tacceptButton.prop(\"disabled\", false);\n\t\t} else {\n\t\t\tacceptButton.addClass(\"mk-disabled\");\n\t\t\tacceptButton.prop(\"disabled\", true);\n\t\t}\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(this.eventBus);\n\t}\n});\n\n// -----------------------------------------------------------------------------\n// Page\n// -----------------------------------------------------------------------------\n\nvar Page = Backbone.Marionette.View.extend({\n\tclassName: \"mk-page\",\n\n\ttemplate: require(\"../templates/modalKit/modal.nunj\").page,\n\n\tregions: {\n\t\theader: \".mk-page-header-region\",\n\t\tbody: \".mk-page-body-region\",\n\t\tfooter: \".mk-page-footer-region\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.eventBus = options.eventBus;\n\n\t\t// Register event handlers\n\t\tif (this.onModelDestroyed) this.listenTo(this.eventBus, \"mk-modal:destroyed\", this.onModelDestroyed.bind(this));\n\n\t\tif (this.onModelSaved) this.listenTo(this.eventBus, \"mk-modal:saved\", this.onModelSaved.bind(this));\n\n\t\tif (this.onModelError) this.listenTo(this.eventBus, \"mk-modal:error\", this.onModelError.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this2 = this;\n\n\t\t// Create and display the header\n\t\tif (this.headerView) this.HeaderView = this.headerView();else this.HeaderView = Header;\n\n\t\tthis.showChildView(\"header\", new this.HeaderView({\n\t\t\teventBus: this.eventBus,\n\t\t\tmodel: this.model || undefined,\n\t\t\tuserOptions: this.options.userOptions\n\t\t}));\n\n\t\t// Display the body, if one is defined\n\t\tif (this.bodyView) {\n\t\t\tvar BodyView = _.isFunction(this.bodyView) ? this.bodyView() : this.BodyView;\n\n\t\t\tthis.showChildView(\"body\", new BodyView({\n\t\t\t\teventBus: this.eventBus,\n\t\t\t\tmodel: this.model || undefined,\n\t\t\t\tuserOptions: this.options.userOptions\n\t\t\t}));\n\t\t}\n\n\t\t// Create and display the footer\n\t\tif (this.footerView) {\n\t\t\tthis.FooterView = this.footerView();\n\t\t} else {\n\t\t\tthis.FooterView = Footer.extend({\n\t\t\t\tbehaviors: {\n\t\t\t\t\tCloseButton: {}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.getRegion(\"footer\").show(new this.FooterView({ eventBus: this.eventBus }));\n\n\t\t// Register event handlers\n\t\tthis.listenTo(this.eventBus, \"mk-page:accept\", function () {\n\t\t\tif (_this2.onAccept) _this2.onAccept();\n\t\t});\n\t\tthis.listenTo(this.eventBus, \"mk-page:cancel\", function () {\n\t\t\tif (_this2.onCancel) _this2.onCancel();\n\t\t});\n\t\tthis.listenTo(this.eventBus, \"mk-page:close\", function () {\n\t\t\tif (_this2.onClose) _this2.onClose();\n\t\t});\n\t\tthis.listenTo(this.eventBus, \"mk-page:navigate:previous\", function () {\n\t\t\tif (_this2.onNavigatePrevious) _this2.onNavigatePrevious();\n\t\t});\n\t\tthis.listenTo(this.eventBus, \"mk-page:navigate:next\", function () {\n\t\t\tif (_this2.onNavigateNext) _this2.onNavigateNext();\n\t\t});\n\t\tthis.listenTo(this.eventBus, \"mk-page:no\", function () {\n\t\t\tif (_this2.onNo) _this2.onNo();\n\t\t});\n\t\tthis.listenTo(this.eventBus, \"mk-page:yes\", function () {\n\t\t\tif (_this2.onYes) _this2.onYes();\n\t\t});\n\t},\n\n\tchangePage: function changePage(newPage) {\n\t\tthis.eventBus.trigger(\"mk-modal:page\", newPage);\n\t},\n\n\tcloseModal: function closeModal(action, data) {\n\t\tthis.eventBus.trigger(\"mk-modal:close\", action, data);\n\t},\n\n\tdestroyModel: function destroyModel() {\n\t\tthis.eventBus.trigger(\"mk-modal:destroy\");\n\t},\n\n\tsaveModel: function saveModel() {\n\t\tthis.eventBus.trigger(\"mk-modal:save\");\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(this.eventBus);\n\t}\n});\n\n// -----------------------------------------------------------------------------\n// Host\n// -----------------------------------------------------------------------------\n\nvar Host = Backbone.Marionette.View.extend({\n\tclassName: \"mk-host\",\n\n\ttemplate: require(\"../templates/modalKit/modal.nunj\").host,\n\n\tregions: {\n\t\tpage: \".mk-host-page-region\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.changedAttributes = {};\n\t\tthis.eventBus = new Backbone.Marionette.Application();\n\t\tthis.host = $(options && options.host || \"#modals\");\n\t\tthis.originalModel = this.model;\n\n\t\tif (this.originalModel) {\n\t\t\tthis.model = this.originalModel.clone();\n\t\t} else {\n\t\t\tvar EmptyModel = Backbone.Model.extend({\n\t\t\t\tdefaults: {},\n\t\t\t\tvalidate: function validate() {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.model = new EmptyModel();\n\t\t}\n\n\t\tif (this.model) this.listenTo(this.model, \"change\", this.onModelChanged.bind(this));\n\t},\n\n\tonModelChanged: function onModelChanged(model) {\n\t\t_.assign(this.changedAttributes, model.changed);\n\n\t\tthis.validateModel();\n\t},\n\n\tvalidateModel: function validateModel() {\n\t\tthis.eventBus.trigger(\"mk-modal:validate\", this.model.validate(this.model.toJSON(), {}) === undefined);\n\t},\n\n\tshow: function show() {\n\t\t$(\".modal-container\", this.host).append(this.render().$el);\n\n\t\tthis.validateModel();\n\t},\n\n\tonRender: function onRender() {\n\t\t// Show the modal background\n\t\t$(\".modal-element\", this.host).removeClass(\"hide\");\n\t\t$(\"body\").addClass(\"hide-overflow\");\n\n\t\t// The modal itself should allow clicks to propagate so that menus in the\n\t\t// modal will be hidden correctly. However, everything underneath the modal\n\t\t// should be unaffected by clicks\n\t\t$(\"#modals\").on(\"click\", function (event) {\n\t\t\treturn event.stopPropagation();\n\t\t});\n\n\t\t// Register event handlers\n\t\tthis.listenTo(this.eventBus, \"mk-modal:close\", this.close.bind(this));\n\t\tthis.listenTo(this.eventBus, \"mk-modal:destroy\", this.destroyModel.bind(this));\n\t\tthis.listenTo(this.eventBus, \"mk-modal:page\", this.showPage.bind(this));\n\t\tthis.listenTo(this.eventBus, \"mk-modal:save\", this.saveModel.bind(this));\n\n\t\t// Render the first page\n\t\tthis.showPage(this.options.firstPage);\n\t},\n\n\tclose: function close(action, data) {\n\t\tif (action) this.trigger(action, this.model, data);\n\n\t\tthis.destroy();\n\t},\n\n\tshowPage: function showPage(page) {\n\t\tthis.pageView = new this.pages[page]({\n\t\t\teventBus: this.eventBus,\n\t\t\tmodel: this.model || undefined,\n\t\t\tuserOptions: this.options.userOptions\n\t\t});\n\t\tthis.showChildView(\"page\", this.pageView);\n\t},\n\n\tdestroyModel: function destroyModel() {\n\t\tthis.xhr = this.model.destroy({\n\t\t\twait: true,\n\t\t\tsuccess: this.onDestroyModelSuccess.bind(this),\n\t\t\terror: this.onDestroyModelError.bind(this)\n\t\t});\n\t},\n\n\tonDestroyModelSuccess: function onDestroyModelSuccess(model) {\n\t\tthis.eventBus.trigger(\"mk-modal:destroyed\", model);\n\t},\n\n\tonDestroyModelError: function onDestroyModelError(model, response) {\n\t\tthis.eventBus.trigger(\"mk-modal:error\", model, response);\n\t},\n\n\tsaveModel: function saveModel() {\n\t\tthis.xhr = this.model.save(this.changedAttributes, {\n\t\t\twait: true,\n\t\t\tvalidate: true,\n\t\t\tsuccess: this.onSaveModelSuccess.bind(this),\n\t\t\terror: this.onSaveModelError.bind(this)\n\t\t});\n\t},\n\n\tonSaveModelSuccess: function onSaveModelSuccess(model) {\n\t\tthis.eventBus.trigger(\"mk-modal:saved\", model);\n\t},\n\n\tonSaveModelError: function onSaveModelError(model, response) {\n\t\tthis.eventBus.trigger(\"mk-modal:error\", model, response);\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tif (this.model) this.stopListening(this.model);\n\n\t\tthis.stopListening(this.eventBus);\n\t},\n\n\tonDestroy: function onDestroy() {\n\t\t// Unbind the click handler\n\t\t$(\"#modals\").off(\"click\");\n\n\t\t// Hide the modal background\n\t\t$(\".modal-element\", this.host).addClass(\"hide\");\n\t\t$(\"body\").removeClass(\"hide-overflow\");\n\t}\n});\n\n// -----------------------------------------------------------------------------\n// Behaviours\n// -----------------------------------------------------------------------------\n\nBackbone.Marionette.Behaviors.behaviorsLookup = function () {\n\treturn Behaviors;\n};\n\nBehaviors.AcceptButton = AcceptButton;\nBehaviors.CancelButton = CancelButton;\nBehaviors.CloseButton = CloseButton;\nBehaviors.NavigationButtonNext = NavigationButtonNext;\nBehaviors.NavigationButtonPrevious = NavigationButtonPrevious;\nBehaviors.NoButton = NoButton;\nBehaviors.YesButton = YesButton;\n\n// -----------------------------------------------------------------------------\n// Module\n// -----------------------------------------------------------------------------\n\nmodule.exports = {\n\tHeader: Header,\n\tBody: Body,\n\tFooter: Footer,\n\n\tfooter: {\n\t\tAcceptButton: AcceptButton,\n\t\tCancelButton: CancelButton,\n\t\tCloseButton: CloseButton,\n\t\tNavigationButtonNext: NavigationButtonNext,\n\t\tNavigationButtonPrevious: NavigationButtonPrevious,\n\t\tNoButton: NoButton,\n\t\tYesButton: YesButton\n\t},\n\n\tPage: Page,\n\n\tHost: Host\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1vZGFsLmpzIl0sIm5hbWVzIjpbIiQiLCJyZXF1aXJlIiwiXyIsIkJhY2tib25lIiwiQmVoYXZpb3JzIiwiSGVhZGVyIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJleHRlbmQiLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsImhlYWRlciIsInRlbXBsYXRlQ29udGV4dCIsInRpdGxlIiwiaW5pdGlhbGl6ZSIsIm9wdGlvbnMiLCJldmVudEJ1cyIsIkJvZHkiLCJvbk1vZGVsRGVzdHJveWVkIiwibGlzdGVuVG8iLCJiaW5kIiwib25Nb2RlbFNhdmVkIiwib25Nb2RlbEVycm9yIiwiY2hhbmdlUGFnZSIsIm5ld1BhZ2UiLCJ0cmlnZ2VyIiwiY2xvc2VNb2RhbCIsImFjdGlvbiIsImRhdGEiLCJkZXN0cm95TW9kZWwiLCJzYXZlTW9kZWwiLCJBY2NlcHRCdXR0b24iLCJCZWhhdmlvciIsInVpIiwiYWNjZXB0QnV0dG9uIiwiZXZlbnRzIiwidmlldyIsImFjY2VwdEJ1dHRvblJlcXVpcmVzVmFsaWRhdGlvbiIsInJlcXVpcmVWYWxpZGF0aW9uIiwib25BY2NlcHRCdXR0b25DbGljayIsIkNhbmNlbEJ1dHRvbiIsImNhbmNlbEJ1dHRvbiIsIm9uQ2FuY2VsQnV0dG9uQ2xpY2siLCJDbG9zZUJ1dHRvbiIsImNsb3NlQnV0dG9uIiwib25DbG9zZUJ1dHRvbkNsaWNrIiwiTmF2aWdhdGlvbkJ1dHRvbk5leHQiLCJidXR0b24iLCJuYXZpZ2F0aW9uQnV0dG9uTmV4dCIsIm9uQnV0dG9uQ2xpY2siLCJzaG93QnV0dG9uIiwiTmF2aWdhdGlvbkJ1dHRvblByZXZpb3VzIiwibmF2aWdhdGlvbkJ1dHRvblByZXZpb3VzIiwiTm9CdXR0b24iLCJub0J1dHRvbiIsIm9uTm9CdXR0b25DbGljayIsIlllc0J1dHRvbiIsInllc0J1dHRvbiIsIm9uWWVzQnV0dG9uQ2xpY2siLCJGb290ZXIiLCJmb290ZXIiLCJidXR0b25OYW1lIiwib25WYWxpZGF0ZSIsIkJvb2xlYW4iLCJ2YWxpZCIsIiRlbCIsInJlbW92ZUNsYXNzIiwicHJvcCIsImFkZENsYXNzIiwib25CZWZvcmVEZXN0cm95Iiwic3RvcExpc3RlbmluZyIsIlBhZ2UiLCJwYWdlIiwicmVnaW9ucyIsImJvZHkiLCJvblJlbmRlciIsImhlYWRlclZpZXciLCJIZWFkZXJWaWV3Iiwic2hvd0NoaWxkVmlldyIsIm1vZGVsIiwidW5kZWZpbmVkIiwidXNlck9wdGlvbnMiLCJib2R5VmlldyIsIkJvZHlWaWV3IiwiaXNGdW5jdGlvbiIsImZvb3RlclZpZXciLCJGb290ZXJWaWV3IiwiYmVoYXZpb3JzIiwiZ2V0UmVnaW9uIiwic2hvdyIsIm9uQWNjZXB0Iiwib25DYW5jZWwiLCJvbkNsb3NlIiwib25OYXZpZ2F0ZVByZXZpb3VzIiwib25OYXZpZ2F0ZU5leHQiLCJvbk5vIiwib25ZZXMiLCJIb3N0IiwiaG9zdCIsImNoYW5nZWRBdHRyaWJ1dGVzIiwiQXBwbGljYXRpb24iLCJvcmlnaW5hbE1vZGVsIiwiY2xvbmUiLCJFbXB0eU1vZGVsIiwiTW9kZWwiLCJkZWZhdWx0cyIsInZhbGlkYXRlIiwib25Nb2RlbENoYW5nZWQiLCJhc3NpZ24iLCJjaGFuZ2VkIiwidmFsaWRhdGVNb2RlbCIsInRvSlNPTiIsImFwcGVuZCIsInJlbmRlciIsIm9uIiwiZXZlbnQiLCJzdG9wUHJvcGFnYXRpb24iLCJjbG9zZSIsInNob3dQYWdlIiwiZmlyc3RQYWdlIiwiZGVzdHJveSIsInBhZ2VWaWV3IiwicGFnZXMiLCJ4aHIiLCJ3YWl0Iiwic3VjY2VzcyIsIm9uRGVzdHJveU1vZGVsU3VjY2VzcyIsImVycm9yIiwib25EZXN0cm95TW9kZWxFcnJvciIsInJlc3BvbnNlIiwic2F2ZSIsIm9uU2F2ZU1vZGVsU3VjY2VzcyIsIm9uU2F2ZU1vZGVsRXJyb3IiLCJvbkRlc3Ryb3kiLCJvZmYiLCJiZWhhdmlvcnNMb29rdXAiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElB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LFdBQVYsQ0FBc0IsZUFBdEI7QUFDQTtBQXBJMkMsQ0FBaEMsQ0FBYjs7QUF1SUE7QUFDQTtBQUNBOztBQUVBL0QsU0FBU0csVUFBVCxDQUFvQkYsU0FBcEIsQ0FBOEJtSSxlQUE5QixHQUFnRCxZQUFXO0FBQzFELFFBQU9uSSxTQUFQO0FBQ0EsQ0FGRDs7QUFJQUEsVUFBVTJCLFlBQVYsR0FBeUJBLFlBQXpCO0FBQ0EzQixVQUFVb0MsWUFBVixHQUF5QkEsWUFBekI7QUFDQXBDLFVBQVV1QyxXQUFWLEdBQXdCQSxXQUF4QjtBQUNBdkMsVUFBVTBDLG9CQUFWLEdBQWlDQSxvQkFBakM7QUFDQTFDLFVBQVUrQyx3QkFBVixHQUFxQ0Esd0JBQXJDO0FBQ0EvQyxVQUFVaUQsUUFBVixHQUFxQkEsUUFBckI7QUFDQWpELFVBQVVvRCxTQUFWLEdBQXNCQSxTQUF0Qjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUFnRixPQUFPQyxPQUFQLEdBQWlCO0FBQ2hCcEksU0FBUUEsTUFEUTtBQUVoQlksT0FBTUEsSUFGVTtBQUdoQjBDLFNBQVFBLE1BSFE7O0FBS2hCQyxTQUFRO0FBQ1A3QixnQkFBY0EsWUFEUDtBQUVQUyxnQkFBY0EsWUFGUDtBQUdQRyxlQUFhQSxXQUhOO0FBSVBHLHdCQUFzQkEsb0JBSmY7QUFLUEssNEJBQTBCQSx3QkFMbkI7QUFNUEUsWUFBVUEsUUFOSDtBQU9QRyxhQUFXQTtBQVBKLEVBTFE7O0FBZWhCZSxPQUFNQSxJQWZVOztBQWlCaEIwQixPQUFNQTtBQWpCVSxDQUFqQiIsImZpbGUiOiJtb2RhbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuXG5jb25zdCBCZWhhdmlvcnMgPSB7fTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEhlYWRlclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgSGVhZGVyID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJtay1oZWFkZXJcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9tb2RhbEtpdC9tb2RhbC5udW5qXCIpLmhlYWRlcixcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHR0aXRsZTogdGhpcy50aXRsZSB8fCBcIlwiLFxuXHRcdH07XG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuZXZlbnRCdXMgPSBvcHRpb25zLmV2ZW50QnVzO1xuXHR9LFxufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBCb2R5XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBCb2R5ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLmV2ZW50QnVzID0gb3B0aW9ucy5ldmVudEJ1cztcblxuXHRcdC8vIFJlZ2lzdGVyIGV2ZW50IGhhbmRsZXJzXG5cdFx0aWYgKHRoaXMub25Nb2RlbERlc3Ryb3llZClcblx0XHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJtay1tb2RhbDpkZXN0cm95ZWRcIiwgdGhpcy5vbk1vZGVsRGVzdHJveWVkLmJpbmQodGhpcykpO1xuXG5cdFx0aWYgKHRoaXMub25Nb2RlbFNhdmVkKVxuXHRcdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmV2ZW50QnVzLCBcIm1rLW1vZGFsOnNhdmVkXCIsIHRoaXMub25Nb2RlbFNhdmVkLmJpbmQodGhpcykpO1xuXG5cdFx0aWYgKHRoaXMub25Nb2RlbEVycm9yKVxuXHRcdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmV2ZW50QnVzLCBcIm1rLW1vZGFsOmVycm9yXCIsIHRoaXMub25Nb2RlbEVycm9yLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdGNoYW5nZVBhZ2U6IGZ1bmN0aW9uKG5ld1BhZ2UpIHtcblx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJtay1tb2RhbDpwYWdlXCIsIG5ld1BhZ2UpO1xuXHR9LFxuXG5cdGNsb3NlTW9kYWw6IGZ1bmN0aW9uKGFjdGlvbiwgZGF0YSkge1xuXHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcIm1rLW1vZGFsOmNsb3NlXCIsIGFjdGlvbiwgZGF0YSk7XG5cdH0sXG5cblx0ZGVzdHJveU1vZGVsOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJtay1tb2RhbDpkZXN0cm95XCIpO1xuXHR9LFxuXG5cdHNhdmVNb2RlbDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwibWstbW9kYWw6c2F2ZVwiKTtcblx0fSxcbn0pO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRm9vdGVyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBBY2NlcHRCdXR0b24gPSBCYWNrYm9uZS5NYXJpb25ldHRlLkJlaGF2aW9yLmV4dGVuZCh7XG5cdHVpOiB7XG5cdFx0YWNjZXB0QnV0dG9uOiBcIi5tay1mb290ZXItYnV0dG9uLm1rLWFjY2VwdFwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmFjY2VwdEJ1dHRvblwiOiBcIm9uQWNjZXB0QnV0dG9uQ2xpY2tcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnZpZXcuYWNjZXB0QnV0dG9uID0gdHJ1ZTtcblx0XHR0aGlzLnZpZXcuYWNjZXB0QnV0dG9uUmVxdWlyZXNWYWxpZGF0aW9uID0gdGhpcy5vcHRpb25zLnJlcXVpcmVWYWxpZGF0aW9uO1xuXHR9LFxuXG5cdG9uQWNjZXB0QnV0dG9uQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudmlldy5ldmVudEJ1cy50cmlnZ2VyKFwibWstcGFnZTphY2NlcHRcIik7XG5cdH0sXG59KTtcblxuY29uc3QgQ2FuY2VsQnV0dG9uID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5CZWhhdmlvci5leHRlbmQoe1xuXHR1aToge1xuXHRcdGNhbmNlbEJ1dHRvbjogXCIubWstZm9vdGVyLWJ1dHRvbi5tay1jYW5jZWxcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5jYW5jZWxCdXR0b25cIjogXCJvbkNhbmNlbEJ1dHRvbkNsaWNrXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy52aWV3LmNhbmNlbEJ1dHRvbiA9IHRydWU7XG5cdH0sXG5cblx0b25DYW5jZWxCdXR0b25DbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy52aWV3LmV2ZW50QnVzLnRyaWdnZXIoXCJtay1wYWdlOmNhbmNlbFwiKTtcblx0fSxcbn0pO1xuXG5jb25zdCBDbG9zZUJ1dHRvbiA9IEJhY2tib25lLk1hcmlvbmV0dGUuQmVoYXZpb3IuZXh0ZW5kKHtcblx0dWk6IHtcblx0XHRjbG9zZUJ1dHRvbjogXCIubWstZm9vdGVyLWJ1dHRvbi5tay1jbG9zZVwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmNsb3NlQnV0dG9uXCI6IFwib25DbG9zZUJ1dHRvbkNsaWNrXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy52aWV3LmNsb3NlQnV0dG9uID0gdHJ1ZTtcblx0fSxcblxuXHRvbkNsb3NlQnV0dG9uQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudmlldy5ldmVudEJ1cy50cmlnZ2VyKFwibWstcGFnZTpjbG9zZVwiKTtcblx0fSxcbn0pO1xuXG5jb25zdCBOYXZpZ2F0aW9uQnV0dG9uTmV4dCA9IEJhY2tib25lLk1hcmlvbmV0dGUuQmVoYXZpb3IuZXh0ZW5kKHtcblx0dWk6IHtcblx0XHRidXR0b246IFwiLm1rLWZvb3Rlci1idXR0b24ubWstbmF2aWdhdGVcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5idXR0b25cIjogXCJvbkJ1dHRvbkNsaWNrXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy52aWV3Lm5hdmlnYXRpb25CdXR0b25OZXh0ID0gdHJ1ZTtcblx0fSxcblxuXHRvbkJ1dHRvbkNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy52aWV3LnNob3dCdXR0b24oXCJuYXZpZ2F0aW9uQnV0dG9uTmV4dFwiKSlcblx0XHRcdHRoaXMudmlldy5ldmVudEJ1cy50cmlnZ2VyKFwibWstcGFnZTpuYXZpZ2F0ZTpuZXh0XCIpO1xuXHR9LFxufSk7XG5cbmNvbnN0IE5hdmlnYXRpb25CdXR0b25QcmV2aW91cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuQmVoYXZpb3IuZXh0ZW5kKHtcblx0dWk6IHtcblx0XHRidXR0b246IFwiLm1rLWZvb3Rlci1idXR0b24ubWstbmF2aWdhdGVcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5idXR0b25cIjogXCJvbkJ1dHRvbkNsaWNrXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy52aWV3Lm5hdmlnYXRpb25CdXR0b25QcmV2aW91cyA9IHRydWU7XG5cdH0sXG5cblx0b25CdXR0b25DbGljazogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMudmlldy5zaG93QnV0dG9uKFwibmF2aWdhdGlvbkJ1dHRvblByZXZpb3VzXCIpKVxuXHRcdFx0dGhpcy52aWV3LmV2ZW50QnVzLnRyaWdnZXIoXCJtay1wYWdlOm5hdmlnYXRlOnByZXZpb3VzXCIpO1xuXHR9LFxufSk7XG5cbmNvbnN0IE5vQnV0dG9uID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5CZWhhdmlvci5leHRlbmQoe1xuXHR1aToge1xuXHRcdG5vQnV0dG9uOiBcIi5tay1mb290ZXItYnV0dG9uLm1rLW5vXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkubm9CdXR0b25cIjogXCJvbk5vQnV0dG9uQ2xpY2tcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnZpZXcubm9CdXR0b24gPSB0cnVlO1xuXHR9LFxuXG5cdG9uTm9CdXR0b25DbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy52aWV3LmV2ZW50QnVzLnRyaWdnZXIoXCJtay1wYWdlOm5vXCIpO1xuXHR9LFxufSk7XG5cbmNvbnN0IFllc0J1dHRvbiA9IEJhY2tib25lLk1hcmlvbmV0dGUuQmVoYXZpb3IuZXh0ZW5kKHtcblx0dWk6IHtcblx0XHR5ZXNCdXR0b246IFwiLm1rLWZvb3Rlci1idXR0b24ubWsteWVzXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkueWVzQnV0dG9uXCI6IFwib25ZZXNCdXR0b25DbGlja1wiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudmlldy55ZXNCdXR0b24gPSB0cnVlO1xuXHR9LFxuXG5cdG9uWWVzQnV0dG9uQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudmlldy5ldmVudEJ1cy50cmlnZ2VyKFwibWstcGFnZTp5ZXNcIik7XG5cdH0sXG59KTtcblxuY29uc3QgRm9vdGVyID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJtay1mb290ZXJcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9tb2RhbEtpdC9tb2RhbC5udW5qXCIpLmZvb3RlcixcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRzaG93QnV0dG9uOiBidXR0b25OYW1lID0+IHRoaXMuc2hvd0J1dHRvbihidXR0b25OYW1lKSxcblx0XHR9O1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLmV2ZW50QnVzID0gb3B0aW9ucy5ldmVudEJ1cztcblxuXHRcdGlmICh0aGlzLmFjY2VwdEJ1dHRvblJlcXVpcmVzVmFsaWRhdGlvbilcblx0XHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJtay1tb2RhbDp2YWxpZGF0ZVwiLCB0aGlzLm9uVmFsaWRhdGUuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0c2hvd0J1dHRvbjogZnVuY3Rpb24oYnV0dG9uTmFtZSkge1xuXHRcdHJldHVybiBCb29sZWFuKHRoaXNbYnV0dG9uTmFtZV0pO1xuXHR9LFxuXG5cdG9uVmFsaWRhdGU6IGZ1bmN0aW9uKHZhbGlkKSB7XG5cdFx0Y29uc3QgYWNjZXB0QnV0dG9uID0gJChcIi5tay1hY2NlcHRcIiwgdGhpcy4kZWwpO1xuXG5cdFx0aWYgKHZhbGlkKSB7XG5cdFx0XHRhY2NlcHRCdXR0b24ucmVtb3ZlQ2xhc3MoXCJtay1kaXNhYmxlZFwiKTtcblx0XHRcdGFjY2VwdEJ1dHRvbi5wcm9wKFwiZGlzYWJsZWRcIiwgZmFsc2UpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGFjY2VwdEJ1dHRvbi5hZGRDbGFzcyhcIm1rLWRpc2FibGVkXCIpO1xuXHRcdFx0YWNjZXB0QnV0dG9uLnByb3AoXCJkaXNhYmxlZFwiLCB0cnVlKTtcblx0XHR9XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcodGhpcy5ldmVudEJ1cyk7XG5cdH0sXG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFBhZ2Vcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IFBhZ2UgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcIm1rLXBhZ2VcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9tb2RhbEtpdC9tb2RhbC5udW5qXCIpLnBhZ2UsXG5cblx0cmVnaW9uczoge1xuXHRcdGhlYWRlcjogXCIubWstcGFnZS1oZWFkZXItcmVnaW9uXCIsXG5cdFx0Ym9keTogXCIubWstcGFnZS1ib2R5LXJlZ2lvblwiLFxuXHRcdGZvb3RlcjogXCIubWstcGFnZS1mb290ZXItcmVnaW9uXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuZXZlbnRCdXMgPSBvcHRpb25zLmV2ZW50QnVzO1xuXG5cdFx0Ly8gUmVnaXN0ZXIgZXZlbnQgaGFuZGxlcnNcblx0XHRpZiAodGhpcy5vbk1vZGVsRGVzdHJveWVkKVxuXHRcdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmV2ZW50QnVzLCBcIm1rLW1vZGFsOmRlc3Ryb3llZFwiLCB0aGlzLm9uTW9kZWxEZXN0cm95ZWQuYmluZCh0aGlzKSk7XG5cblx0XHRpZiAodGhpcy5vbk1vZGVsU2F2ZWQpXG5cdFx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwibWstbW9kYWw6c2F2ZWRcIiwgdGhpcy5vbk1vZGVsU2F2ZWQuYmluZCh0aGlzKSk7XG5cblx0XHRpZiAodGhpcy5vbk1vZGVsRXJyb3IpXG5cdFx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwibWstbW9kYWw6ZXJyb3JcIiwgdGhpcy5vbk1vZGVsRXJyb3IuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIENyZWF0ZSBhbmQgZGlzcGxheSB0aGUgaGVhZGVyXG5cdFx0aWYgKHRoaXMuaGVhZGVyVmlldylcblx0XHRcdHRoaXMuSGVhZGVyVmlldyA9IHRoaXMuaGVhZGVyVmlldygpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuSGVhZGVyVmlldyA9IEhlYWRlcjtcblxuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImhlYWRlclwiLCBuZXcgdGhpcy5IZWFkZXJWaWV3KHtcblx0XHRcdGV2ZW50QnVzOiB0aGlzLmV2ZW50QnVzLFxuXHRcdFx0bW9kZWw6IHRoaXMubW9kZWwgfHwgdW5kZWZpbmVkLFxuXHRcdFx0dXNlck9wdGlvbnM6IHRoaXMub3B0aW9ucy51c2VyT3B0aW9ucyxcblx0XHR9KSk7XG5cblx0XHQvLyBEaXNwbGF5IHRoZSBib2R5LCBpZiBvbmUgaXMgZGVmaW5lZFxuXHRcdGlmICh0aGlzLmJvZHlWaWV3KSB7XG5cdFx0XHRjb25zdCBCb2R5VmlldyA9IF8uaXNGdW5jdGlvbih0aGlzLmJvZHlWaWV3KSA/IHRoaXMuYm9keVZpZXcoKSA6IHRoaXMuQm9keVZpZXc7XG5cblx0XHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImJvZHlcIiwgbmV3IEJvZHlWaWV3KHtcblx0XHRcdFx0ZXZlbnRCdXM6IHRoaXMuZXZlbnRCdXMsXG5cdFx0XHRcdG1vZGVsOiB0aGlzLm1vZGVsIHx8IHVuZGVmaW5lZCxcblx0XHRcdFx0dXNlck9wdGlvbnM6IHRoaXMub3B0aW9ucy51c2VyT3B0aW9ucyxcblx0XHRcdH0pKTtcblx0XHR9XG5cblx0XHQvLyBDcmVhdGUgYW5kIGRpc3BsYXkgdGhlIGZvb3RlclxuXHRcdGlmICh0aGlzLmZvb3RlclZpZXcpIHtcblx0XHRcdHRoaXMuRm9vdGVyVmlldyA9IHRoaXMuZm9vdGVyVmlldygpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMuRm9vdGVyVmlldyA9IEZvb3Rlci5leHRlbmQoe1xuXHRcdFx0XHRiZWhhdmlvcnM6IHtcblx0XHRcdFx0XHRDbG9zZUJ1dHRvbjoge30sXG5cdFx0XHRcdH0sXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHR0aGlzLmdldFJlZ2lvbihcImZvb3RlclwiKS5zaG93KG5ldyB0aGlzLkZvb3RlclZpZXcoeyBldmVudEJ1czogdGhpcy5ldmVudEJ1cyB9KSk7XG5cblx0XHQvLyBSZWdpc3RlciBldmVudCBoYW5kbGVyc1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJtay1wYWdlOmFjY2VwdFwiLCAoKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5vbkFjY2VwdClcblx0XHRcdFx0dGhpcy5vbkFjY2VwdCgpO1xuXHRcdH0pO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJtay1wYWdlOmNhbmNlbFwiLCAoKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5vbkNhbmNlbClcblx0XHRcdFx0dGhpcy5vbkNhbmNlbCgpO1xuXHRcdH0pO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJtay1wYWdlOmNsb3NlXCIsICgpID0+IHtcblx0XHRcdGlmICh0aGlzLm9uQ2xvc2UpXG5cdFx0XHRcdHRoaXMub25DbG9zZSgpO1xuXHRcdH0pO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJtay1wYWdlOm5hdmlnYXRlOnByZXZpb3VzXCIsICgpID0+IHtcblx0XHRcdGlmICh0aGlzLm9uTmF2aWdhdGVQcmV2aW91cylcblx0XHRcdFx0dGhpcy5vbk5hdmlnYXRlUHJldmlvdXMoKTtcblx0XHR9KTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwibWstcGFnZTpuYXZpZ2F0ZTpuZXh0XCIsICgpID0+IHtcblx0XHRcdGlmICh0aGlzLm9uTmF2aWdhdGVOZXh0KVxuXHRcdFx0XHR0aGlzLm9uTmF2aWdhdGVOZXh0KCk7XG5cdFx0fSk7XG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmV2ZW50QnVzLCBcIm1rLXBhZ2U6bm9cIiwgKCkgPT4ge1xuXHRcdFx0aWYgKHRoaXMub25Obylcblx0XHRcdFx0dGhpcy5vbk5vKCk7XG5cdFx0fSk7XG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmV2ZW50QnVzLCBcIm1rLXBhZ2U6eWVzXCIsICgpID0+IHtcblx0XHRcdGlmICh0aGlzLm9uWWVzKVxuXHRcdFx0XHR0aGlzLm9uWWVzKCk7XG5cdFx0fSk7XG5cdH0sXG5cblx0Y2hhbmdlUGFnZTogZnVuY3Rpb24obmV3UGFnZSkge1xuXHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcIm1rLW1vZGFsOnBhZ2VcIiwgbmV3UGFnZSk7XG5cdH0sXG5cblx0Y2xvc2VNb2RhbDogZnVuY3Rpb24oYWN0aW9uLCBkYXRhKSB7XG5cdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwibWstbW9kYWw6Y2xvc2VcIiwgYWN0aW9uLCBkYXRhKTtcblx0fSxcblxuXHRkZXN0cm95TW9kZWw6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcIm1rLW1vZGFsOmRlc3Ryb3lcIik7XG5cdH0sXG5cblx0c2F2ZU1vZGVsOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJtay1tb2RhbDpzYXZlXCIpO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKHRoaXMuZXZlbnRCdXMpO1xuXHR9LFxufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBIb3N0XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBIb3N0ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJtay1ob3N0XCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvbW9kYWxLaXQvbW9kYWwubnVualwiKS5ob3N0LFxuXG5cdHJlZ2lvbnM6IHtcblx0XHRwYWdlOiBcIi5tay1ob3N0LXBhZ2UtcmVnaW9uXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuY2hhbmdlZEF0dHJpYnV0ZXMgPSB7fTtcblx0XHR0aGlzLmV2ZW50QnVzID0gbmV3IEJhY2tib25lLk1hcmlvbmV0dGUuQXBwbGljYXRpb24oKTtcblx0XHR0aGlzLmhvc3QgPSAkKG9wdGlvbnMgJiYgb3B0aW9ucy5ob3N0IHx8IFwiI21vZGFsc1wiKTtcblx0XHR0aGlzLm9yaWdpbmFsTW9kZWwgPSB0aGlzLm1vZGVsO1xuXG5cdFx0aWYgKHRoaXMub3JpZ2luYWxNb2RlbCkge1xuXHRcdFx0dGhpcy5tb2RlbCA9IHRoaXMub3JpZ2luYWxNb2RlbC5jbG9uZSgpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGNvbnN0IEVtcHR5TW9kZWwgPSBCYWNrYm9uZS5Nb2RlbC5leHRlbmQoe1xuXHRcdFx0XHRkZWZhdWx0czoge30sXG5cdFx0XHRcdHZhbGlkYXRlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0XHR9LFxuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMubW9kZWwgPSBuZXcgRW1wdHlNb2RlbCgpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLm1vZGVsKVxuXHRcdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCBcImNoYW5nZVwiLCB0aGlzLm9uTW9kZWxDaGFuZ2VkLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdG9uTW9kZWxDaGFuZ2VkOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdF8uYXNzaWduKHRoaXMuY2hhbmdlZEF0dHJpYnV0ZXMsIG1vZGVsLmNoYW5nZWQpO1xuXG5cdFx0dGhpcy52YWxpZGF0ZU1vZGVsKCk7XG5cdH0sXG5cblx0dmFsaWRhdGVNb2RlbDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwibWstbW9kYWw6dmFsaWRhdGVcIiwgdGhpcy5tb2RlbC52YWxpZGF0ZSh0aGlzLm1vZGVsLnRvSlNPTigpLCB7fSkgPT09IHVuZGVmaW5lZCk7XG5cdH0sXG5cblx0c2hvdzogZnVuY3Rpb24oKSB7XG5cdFx0JChcIi5tb2RhbC1jb250YWluZXJcIiwgdGhpcy5ob3N0KS5hcHBlbmQodGhpcy5yZW5kZXIoKS4kZWwpO1xuXG5cdFx0dGhpcy52YWxpZGF0ZU1vZGVsKCk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIFNob3cgdGhlIG1vZGFsIGJhY2tncm91bmRcblx0XHQkKFwiLm1vZGFsLWVsZW1lbnRcIiwgdGhpcy5ob3N0KS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0JChcImJvZHlcIikuYWRkQ2xhc3MoXCJoaWRlLW92ZXJmbG93XCIpO1xuXG5cdFx0Ly8gVGhlIG1vZGFsIGl0c2VsZiBzaG91bGQgYWxsb3cgY2xpY2tzIHRvIHByb3BhZ2F0ZSBzbyB0aGF0IG1lbnVzIGluIHRoZVxuXHRcdC8vIG1vZGFsIHdpbGwgYmUgaGlkZGVuIGNvcnJlY3RseS4gSG93ZXZlciwgZXZlcnl0aGluZyB1bmRlcm5lYXRoIHRoZSBtb2RhbFxuXHRcdC8vIHNob3VsZCBiZSB1bmFmZmVjdGVkIGJ5IGNsaWNrc1xuXHRcdCQoXCIjbW9kYWxzXCIpLm9uKFwiY2xpY2tcIiwgZXZlbnQgPT4gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCkpO1xuXG5cdFx0Ly8gUmVnaXN0ZXIgZXZlbnQgaGFuZGxlcnNcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwibWstbW9kYWw6Y2xvc2VcIiwgdGhpcy5jbG9zZS5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwibWstbW9kYWw6ZGVzdHJveVwiLCB0aGlzLmRlc3Ryb3lNb2RlbC5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwibWstbW9kYWw6cGFnZVwiLCB0aGlzLnNob3dQYWdlLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJtay1tb2RhbDpzYXZlXCIsIHRoaXMuc2F2ZU1vZGVsLmJpbmQodGhpcykpO1xuXG5cdFx0Ly8gUmVuZGVyIHRoZSBmaXJzdCBwYWdlXG5cdFx0dGhpcy5zaG93UGFnZSh0aGlzLm9wdGlvbnMuZmlyc3RQYWdlKTtcblx0fSxcblxuXHRjbG9zZTogZnVuY3Rpb24oYWN0aW9uLCBkYXRhKSB7XG5cdFx0aWYgKGFjdGlvbilcblx0XHRcdHRoaXMudHJpZ2dlcihhY3Rpb24sIHRoaXMubW9kZWwsIGRhdGEpO1xuXG5cdFx0dGhpcy5kZXN0cm95KCk7XG5cdH0sXG5cblx0c2hvd1BhZ2U6IGZ1bmN0aW9uKHBhZ2UpIHtcblx0XHR0aGlzLnBhZ2VWaWV3ID0gbmV3IHRoaXMucGFnZXNbcGFnZV0oe1xuXHRcdFx0ZXZlbnRCdXM6IHRoaXMuZXZlbnRCdXMsXG5cdFx0XHRtb2RlbDogdGhpcy5tb2RlbCB8fCB1bmRlZmluZWQsXG5cdFx0XHR1c2VyT3B0aW9uczogdGhpcy5vcHRpb25zLnVzZXJPcHRpb25zLFxuXHRcdH0pO1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcInBhZ2VcIiwgdGhpcy5wYWdlVmlldyk7XG5cdH0sXG5cblx0ZGVzdHJveU1vZGVsOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnhociA9IHRoaXMubW9kZWwuZGVzdHJveSh7XG5cdFx0XHR3YWl0OiB0cnVlLFxuXHRcdFx0c3VjY2VzczogdGhpcy5vbkRlc3Ryb3lNb2RlbFN1Y2Nlc3MuYmluZCh0aGlzKSxcblx0XHRcdGVycm9yOiB0aGlzLm9uRGVzdHJveU1vZGVsRXJyb3IuYmluZCh0aGlzKSxcblx0XHR9KTtcblx0fSxcblxuXHRvbkRlc3Ryb3lNb2RlbFN1Y2Nlc3M6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwibWstbW9kYWw6ZGVzdHJveWVkXCIsIG1vZGVsKTtcblx0fSxcblxuXHRvbkRlc3Ryb3lNb2RlbEVycm9yOiBmdW5jdGlvbihtb2RlbCwgcmVzcG9uc2UpIHtcblx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJtay1tb2RhbDplcnJvclwiLCBtb2RlbCwgcmVzcG9uc2UpO1xuXHR9LFxuXG5cdHNhdmVNb2RlbDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy54aHIgPSB0aGlzLm1vZGVsLnNhdmUodGhpcy5jaGFuZ2VkQXR0cmlidXRlcywge1xuXHRcdFx0d2FpdDogdHJ1ZSxcblx0XHRcdHZhbGlkYXRlOiB0cnVlLFxuXHRcdFx0c3VjY2VzczogdGhpcy5vblNhdmVNb2RlbFN1Y2Nlc3MuYmluZCh0aGlzKSxcblx0XHRcdGVycm9yOiB0aGlzLm9uU2F2ZU1vZGVsRXJyb3IuYmluZCh0aGlzKSxcblx0XHR9KTtcblx0fSxcblxuXHRvblNhdmVNb2RlbFN1Y2Nlc3M6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwibWstbW9kYWw6c2F2ZWRcIiwgbW9kZWwpO1xuXHR9LFxuXG5cdG9uU2F2ZU1vZGVsRXJyb3I6IGZ1bmN0aW9uKG1vZGVsLCByZXNwb25zZSkge1xuXHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcIm1rLW1vZGFsOmVycm9yXCIsIG1vZGVsLCByZXNwb25zZSk7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbClcblx0XHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLm1vZGVsKTtcblxuXHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLmV2ZW50QnVzKTtcblx0fSxcblxuXHRvbkRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIFVuYmluZCB0aGUgY2xpY2sgaGFuZGxlclxuXHRcdCQoXCIjbW9kYWxzXCIpLm9mZihcImNsaWNrXCIpO1xuXG5cdFx0Ly8gSGlkZSB0aGUgbW9kYWwgYmFja2dyb3VuZFxuXHRcdCQoXCIubW9kYWwtZWxlbWVudFwiLCB0aGlzLmhvc3QpLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHQkKFwiYm9keVwiKS5yZW1vdmVDbGFzcyhcImhpZGUtb3ZlcmZsb3dcIik7XG5cdH0sXG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEJlaGF2aW91cnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbkJhY2tib25lLk1hcmlvbmV0dGUuQmVoYXZpb3JzLmJlaGF2aW9yc0xvb2t1cCA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gQmVoYXZpb3JzO1xufTtcblxuQmVoYXZpb3JzLkFjY2VwdEJ1dHRvbiA9IEFjY2VwdEJ1dHRvbjtcbkJlaGF2aW9ycy5DYW5jZWxCdXR0b24gPSBDYW5jZWxCdXR0b247XG5CZWhhdmlvcnMuQ2xvc2VCdXR0b24gPSBDbG9zZUJ1dHRvbjtcbkJlaGF2aW9ycy5OYXZpZ2F0aW9uQnV0dG9uTmV4dCA9IE5hdmlnYXRpb25CdXR0b25OZXh0O1xuQmVoYXZpb3JzLk5hdmlnYXRpb25CdXR0b25QcmV2aW91cyA9IE5hdmlnYXRpb25CdXR0b25QcmV2aW91cztcbkJlaGF2aW9ycy5Ob0J1dHRvbiA9IE5vQnV0dG9uO1xuQmVoYXZpb3JzLlllc0J1dHRvbiA9IFllc0J1dHRvbjtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE1vZHVsZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdEhlYWRlcjogSGVhZGVyLFxuXHRCb2R5OiBCb2R5LFxuXHRGb290ZXI6IEZvb3RlcixcblxuXHRmb290ZXI6IHtcblx0XHRBY2NlcHRCdXR0b246IEFjY2VwdEJ1dHRvbixcblx0XHRDYW5jZWxCdXR0b246IENhbmNlbEJ1dHRvbixcblx0XHRDbG9zZUJ1dHRvbjogQ2xvc2VCdXR0b24sXG5cdFx0TmF2aWdhdGlvbkJ1dHRvbk5leHQ6IE5hdmlnYXRpb25CdXR0b25OZXh0LFxuXHRcdE5hdmlnYXRpb25CdXR0b25QcmV2aW91czogTmF2aWdhdGlvbkJ1dHRvblByZXZpb3VzLFxuXHRcdE5vQnV0dG9uOiBOb0J1dHRvbixcblx0XHRZZXNCdXR0b246IFllc0J1dHRvbixcblx0fSxcblxuXHRQYWdlOiBQYWdlLFxuXG5cdEhvc3Q6IEhvc3QsXG59O1xuIl19",
    "\"use strict\";\n\nvar nunjucks = require(\"nunjucks\");\nvar moment = require(\"moment\");\nvar rester = require(\"rester\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\n\n//var App = require(\"../index\");\nvar radio = Backbone.Radio.channel(\"global\");\n\n// DO NOT REQUIRE SETTINGS HERE. REQUIRE THEM IN THE FILTERS THEMSELVES\n// OR BROWSERIFY WILL EAT YOUR FACE.\n\nvar env = nunjucks.env || new nunjucks.Environment();\n\nenv.addFilter(\"ownerMatch\", function (val) {\n\tvar App = require(\"../index\");\n\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\treturn user.user_id === val;\n});\n\nvar stringToBgRGBAColor = function stringToBgRGBAColor(str) {\n\tvar colorsArray = [\"88d958\", \"20948b\", \"ff410d\", \"336b86\", \"7d152e\", \"8fafc4\", \"d41600\", \"004445\", \"ecad00\", \"240041\", \"FF4057\", \"702283\", \"76B39D\", \"FDB44B\", \"FF6107\", \"E9290F\", \"B32C50\", \"0A0944\", \"08C299\", \"cddc39\", \"2196f3\", \"f98765\"];\n\n\tvar hashCode = function hashCode(strToHash) {\n\t\tvar hash = 0;\n\t\tfor (var _i = 0; _i < strToHash.length; _i++) {\n\t\t\thash = strToHash.charCodeAt(_i) + ((hash << 5) - hash) & 0xFFFFFFFF;\n\t\t}return hash;\n\t};\n\n\tvar i = Math.abs(hashCode(str));\n\n\tvar bgColor = colorsArray[i % (colorsArray.length - 1)];\n\tvar r = parseInt(bgColor.substr(0, 2), 16);\n\tvar g = parseInt(bgColor.substr(2, 2), 16);\n\tvar b = parseInt(bgColor.substr(4, 2), 16);\n\n\treturn [r, g, b];\n};\n\nenv.addFilter(\"stringToBgRGBAColorLight\", function (val) {\n\treturn \"rgba(\" + stringToBgRGBAColor(val).join(\",\") + \", 0.6)\";\n});\n\nenv.addFilter(\"stringToBgRGBAColor\", function (val) {\n\treturn \"rgba(\" + stringToBgRGBAColor(val).join(\",\") + \", 0.8)\";\n});\n\nenv.addFilter(\"stringToTextHexColor\", function (val) {\n\tvar bgColor = stringToBgRGBAColor(val);\n\tvar yiq = (bgColor[0] * 299 + bgColor[1] * 587 + bgColor[2] * 114) / 1000;\n\treturn yiq >= 100 ? \"#000\" : \"#FFF\";\n});\n\nenv.addFilter(\"formatDateFull\", function (date) {\n\tvar d = moment.unix(date);\n\tif (!d.isValid()) return \"\";\n\treturn d.format(\"DD MMMM YYYY, HH:mm a\");\n});\n\nenv.addFilter(\"formatDateShort\", function (date) {\n\tvar d = moment.unix(date);\n\tif (!d.isValid()) return \"\";\n\treturn d.format(\"DD MMMM YYYY\");\n});\n\nenv.addFilter(\"formatDateHuman\", function (date) {\n\tvar d = moment.unix(date);\n\tif (!d.isValid()) return \"\";\n\treturn d.format(\"Do [of] MMMM, YYYY\");\n});\n\nenv.addFilter(\"dumpIfObject\", function (obj) {\n\tif (_.isPlainObject(obj)) return JSON.stringify(obj);\n\tif (_.isNull(obj)) return \"null\";\n\tif (_.isUndefined(obj)) return \"undefined\";\n\tif (_.isArray(obj) && !obj.length) return \"[]\";\n\treturn obj;\n});\n\nenv.addFilter(\"before\", function (date, count, interval) {\n\tvar d = moment.unix(date);\n\treturn d.isBefore(moment().subtract(count, interval));\n});\n\nenv.addFilter(\"hasAccess\", function (perm, u) {\n\tvar App = require(\"../index\");\n\tvar user = u || radio.request(App.Events.Requests.CurrentUser);\n\treturn rester.hasAccess(perm, user);\n});\n\nenv.addFilter(\"impersonateAccess\", function (perm, u) {\n\tvar App = require(\"../index\");\n\tvar user = u || radio.request(App.Events.Requests.Impersonator);\n\treturn rester.hasAccess(perm, user);\n});\n\nenv.addFilter(\"hasOwnGrant\", function (grant, usr) {\n\tvar App = require(\"../index\");\n\tvar user = usr || radio.request(App.Events.Requests.CurrentUser);\n\tif (!user) return false;\n\treturn rester.hasAccess(rester.p.grants.main[grant], user);\n});\n\nenv.addFilter(\"getGrantValues\", function (grant, usr) {\n\tvar App = require(\"../index\");\n\tvar user = usr || radio.request(App.Events.Requests.CurrentUser);\n\tif (!user) return [];\n\treturn rester.getGrantValues(user, grant) || [];\n});\n\nenv.addFilter(\"contains\", function (collection, item) {\n\treturn collection && _.includes(collection, item);\n});\n\nenv.addFilter(\"toFixed\", function (n, dec) {\n\tvar num = n || 0;\n\treturn parseFloat(num).toFixed(dec);\n});\n\nenv.addFilter(\"isArray\", function (arr) {\n\treturn _.isArray(arr);\n});\n\nenv.addFilter(\"stringify\", function (arg) {\n\tif (!arg) return \"\";\n\treturn JSON.stringify(arg);\n});\n\nenv.addFilter(\"urlencode\", function (arg) {\n\tif (!arg) return \"\";\n\treturn encodeURIComponent(arg);\n});\n\nenv.addFilter(\"impersonating\", function () {\n\tvar App = require(\"../index\");\n\treturn radio.request(App.Events.Requests.IsImpersonating);\n});\n\nenv.addFilter(\"pluck\", function (col, field) {\n\treturn _.map(col, field);\n});\n\nenv.addFilter(\"split\", function (val, field) {\n\treturn (val || \"\").split(field);\n});\n\nenv.addFilter(\"gradeMap\", function (grades) {\n\tvar settings = require(\"app-settings\");\n\n\tvar g = _.flatten([grades]);\n\n\tvar ret = [];\n\t_.each(settings.gradeList, function (val) {\n\t\t_.each(val, function (grade) {\n\t\t\tif (_.includes(g, grade.value)) ret.push(grade.name);\n\t\t});\n\t});\n\n\treturn ret.join(\", \");\n});\n\nenv.addFilter(\"showPdfRestrictions\", function (data) {\n\treturn _.map(data, function (val, key) {\n\t\tswitch (key) {\n\t\t\tcase \"print\":\n\t\t\t\tif (val === \"none\") return \"No printing\";else if (val === \"low\") return \"Low-res printing\";else if (val === \"full\") return \"Full-res printing\";\n\t\t\t\tbreak;\n\t\t\tcase \"modify\":\n\t\t\t\tif (val === \"annotate\") return \"Only highlights & annotations\";else if (val === \"all\") return \"All modifications\";\n\t\t\t\tbreak;\n\t\t\tcase \"extract\":\n\t\t\t\tif (val === \"y\") return \"Allow extraction\";else if (val === \"n\") return \"Disallow extraction\";\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treturn \"Unknown permission\";\n\t\t}\n\t}).join(\", \");\n});\n\nenv.addFilter(\"versionFormat\", function (v) {\n\tvar val = parseFloat(v);\n\tvar final = Math.floor(val);\n\tif (val % 1) final += \".\" + (val % 1).toFixed(4).substring(2).replace(/^[^1-9]+(.+?$)/, \"$1\");\n\treturn final;\n});\n\nmodule.exports = env;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm51bmp1Y2tzLWVudi5qcyJdLCJuYW1lcyI6WyJudW5qdWNrcyIsInJlcXVpcmUiLCJtb21lbnQiLCJyZXN0ZXIiLCJfIiwiQmFja2JvbmUiLCJyYWRpbyIsIlJhZGlvIiwiY2hhbm5lbCIsImVudiIsIkVudmlyb25tZW50IiwiYWRkRmlsdGVyIiwiQXBwIiwidXNlciIsInJlcXVlc3QiLCJFdmVudHMiLCJSZXF1ZXN0cyIsIkN1cnJlbnRVc2VyIiwidXNlcl9pZCIsInZhbCIsInN0cmluZ1RvQmdSR0JBQ29sb3IiLCJzdHIiLCJjb2xvcnNBcnJheSIsImhhc2hDb2RlIiwic3RyVG9IYXNoIiwiaGFzaCIsImkiLCJsZW5ndGgiLCJjaGFyQ29kZUF0IiwiTWF0aCIsImFicyIsImJnQ29sb3IiLCJyIiwicGFyc2VJbnQiLCJzdWJzdHIiLCJnIiwiYiIsImpvaW4iLCJ5aXEiLCJkIiwidW5peCIsImRhdGUiLCJpc1ZhbGlkIiwiZm9ybWF0IiwiaXNQbGFpbk9iamVjdCIsIm9iaiIsIkpTT04iLCJzdHJpbmdpZnkiLCJpc051bGwiLCJpc1VuZGVmaW5lZCIsImlzQXJyYXkiLCJjb3VudCIsImludGVydmFsIiwiaXNCZWZvcmUiLCJzdWJ0cmFjdCIsInBlcm0iLCJ1IiwiaGFzQWNjZXNzIiwiSW1wZXJzb25hdG9yIiwiZ3JhbnQiLCJ1c3IiLCJwIiwiZ3JhbnRzIiwibWFpbiIsImdldEdyYW50VmFsdWVzIiwiY29sbGVjdGlvbiIsIml0ZW0iLCJpbmNsdWRlcyIsIm4iLCJkZWMiLCJudW0iLCJwYXJzZUZsb2F0IiwidG9GaXhlZCIsImFyciIsImFyZyIsImVuY29kZVVSSUNvbXBvbmVudCIsIklzSW1wZXJzb25hdGluZyIsImNvbCIsImZpZWxkIiwibWFwIiwic3BsaXQiLCJzZXR0aW5ncyIsImZsYXR0ZW4iLCJncmFkZXMiLCJyZXQiLCJlYWNoIiwiZ3JhZGVMaXN0IiwiZ3JhZGUiLCJ2YWx1ZSIsInB1c2giLCJuYW1lIiwiZGF0YSIsImtleSIsInYiLCJmaW5h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RSxLQUFLa0UsS0FBTCxDQUFXNUUsR0FBWCxDQUFaO0FBQ0EsS0FBSUEsTUFBTSxDQUFWLEVBQ0MyRSxTQUFTLE1BQU0sQ0FBQzNFLE1BQU0sQ0FBUCxFQUFVcUQsT0FBVixDQUFrQixDQUFsQixFQUFxQndCLFNBQXJCLENBQStCLENBQS9CLEVBQWtDQyxPQUFsQyxDQUEwQyxnQkFBMUMsRUFBNEQsSUFBNUQsQ0FBZjtBQUNELFFBQU9ILEtBQVA7QUFDQSxDQU5EOztBQVFBSSxPQUFPQyxPQUFQLEdBQWlCMUYsR0FBakIiLCJmaWxlIjoibnVuanVja3MtZW52LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBudW5qdWNrcyA9IHJlcXVpcmUoXCJudW5qdWNrc1wiKTtcbmNvbnN0IG1vbWVudCA9IHJlcXVpcmUoXCJtb21lbnRcIik7XG5jb25zdCByZXN0ZXIgPSByZXF1aXJlKFwicmVzdGVyXCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcblxuLy92YXIgQXBwID0gcmVxdWlyZShcIi4uL2luZGV4XCIpO1xuY29uc3QgcmFkaW8gPSBCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZ2xvYmFsXCIpO1xuXG4vLyBETyBOT1QgUkVRVUlSRSBTRVRUSU5HUyBIRVJFLiBSRVFVSVJFIFRIRU0gSU4gVEhFIEZJTFRFUlMgVEhFTVNFTFZFU1xuLy8gT1IgQlJPV1NFUklGWSBXSUxMIEVBVCBZT1VSIEZBQ0UuXG5cbmNvbnN0IGVudiA9IG51bmp1Y2tzLmVudiB8fCBuZXcgbnVuanVja3MuRW52aXJvbm1lbnQoKTtcblxuZW52LmFkZEZpbHRlcihcIm93bmVyTWF0Y2hcIiwgdmFsID0+IHtcblx0Y29uc3QgQXBwID0gcmVxdWlyZShcIi4uL2luZGV4XCIpO1xuXHRjb25zdCB1c2VyID0gcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblx0cmV0dXJuIHVzZXIudXNlcl9pZCA9PT0gdmFsO1xufSk7XG5cbmNvbnN0IHN0cmluZ1RvQmdSR0JBQ29sb3IgPSBmdW5jdGlvbihzdHIpIHtcblx0Y29uc3QgY29sb3JzQXJyYXkgPSBbXCI4OGQ5NThcIiwgXCIyMDk0OGJcIiwgXCJmZjQxMGRcIiwgXCIzMzZiODZcIiwgXCI3ZDE1MmVcIiwgXCI4ZmFmYzRcIixcblx0XHRcImQ0MTYwMFwiLCBcIjAwNDQ0NVwiLCBcImVjYWQwMFwiLCBcIjI0MDA0MVwiLCBcIkZGNDA1N1wiLCBcIjcwMjI4M1wiLCBcIjc2QjM5RFwiLCBcIkZEQjQ0QlwiLFxuXHRcdFwiRkY2MTA3XCIsIFwiRTkyOTBGXCIsIFwiQjMyQzUwXCIsIFwiMEEwOTQ0XCIsIFwiMDhDMjk5XCIsIFwiY2RkYzM5XCIsIFwiMjE5NmYzXCIsIFwiZjk4NzY1XCJdO1xuXG5cdGNvbnN0IGhhc2hDb2RlID0gZnVuY3Rpb24oc3RyVG9IYXNoKSB7XG5cdFx0bGV0IGhhc2ggPSAwO1xuXHRcdGZvcihsZXQgaSA9IDA7IGkgPCBzdHJUb0hhc2gubGVuZ3RoOyBpKyspXG5cdFx0XHRoYXNoID0gKHN0clRvSGFzaC5jaGFyQ29kZUF0KGkpICsgKChoYXNoIDw8IDUpIC0gaGFzaCkpICYgMHhGRkZGRkZGRjtcblx0XHRyZXR1cm4gaGFzaDtcblx0fTtcblxuXHRjb25zdCBpID0gTWF0aC5hYnMoaGFzaENvZGUoc3RyKSk7XG5cblx0Y29uc3QgYmdDb2xvciA9IGNvbG9yc0FycmF5W2kgJSAoY29sb3JzQXJyYXkubGVuZ3RoIC0gMSldO1xuXHRjb25zdCByID0gcGFyc2VJbnQoYmdDb2xvci5zdWJzdHIoMCwgMiksIDE2KTtcblx0Y29uc3QgZyA9IHBhcnNlSW50KGJnQ29sb3Iuc3Vic3RyKDIsIDIpLCAxNik7XG5cdGNvbnN0IGIgPSBwYXJzZUludChiZ0NvbG9yLnN1YnN0cig0LCAyKSwgMTYpO1xuXG5cdHJldHVybiBbciwgZywgYl07XG59O1xuXG5lbnYuYWRkRmlsdGVyKFwic3RyaW5nVG9CZ1JHQkFDb2xvckxpZ2h0XCIsIHZhbCA9PiBcInJnYmEoXCIgKyBzdHJpbmdUb0JnUkdCQUNvbG9yKHZhbCkuam9pbihcIixcIikgKyBcIiwgMC42KVwiKTtcblxuZW52LmFkZEZpbHRlcihcInN0cmluZ1RvQmdSR0JBQ29sb3JcIiwgdmFsID0+IFwicmdiYShcIiArIHN0cmluZ1RvQmdSR0JBQ29sb3IodmFsKS5qb2luKFwiLFwiKSArIFwiLCAwLjgpXCIpO1xuXG5lbnYuYWRkRmlsdGVyKFwic3RyaW5nVG9UZXh0SGV4Q29sb3JcIiwgdmFsID0+IHtcblx0Y29uc3QgYmdDb2xvciA9IHN0cmluZ1RvQmdSR0JBQ29sb3IodmFsKTtcblx0Y29uc3QgeWlxID0gKChiZ0NvbG9yWzBdICogMjk5KSArIChiZ0NvbG9yWzFdICogNTg3KSArIChiZ0NvbG9yWzJdICogMTE0KSkgLyAxMDAwO1xuXHRyZXR1cm4gKHlpcSA+PSAxMDApID8gXCIjMDAwXCIgOiBcIiNGRkZcIjtcbn0pO1xuXG5lbnYuYWRkRmlsdGVyKFwiZm9ybWF0RGF0ZUZ1bGxcIiwgZGF0ZSA9PiB7XG5cdGNvbnN0IGQgPSBtb21lbnQudW5peChkYXRlKTtcblx0aWYgKCFkLmlzVmFsaWQoKSlcblx0XHRyZXR1cm4gXCJcIjtcblx0cmV0dXJuIGQuZm9ybWF0KFwiREQgTU1NTSBZWVlZLCBISDptbSBhXCIpO1xufSk7XG5cbmVudi5hZGRGaWx0ZXIoXCJmb3JtYXREYXRlU2hvcnRcIiwgZGF0ZSA9PiB7XG5cdGNvbnN0IGQgPSBtb21lbnQudW5peChkYXRlKTtcblx0aWYgKCFkLmlzVmFsaWQoKSlcblx0XHRyZXR1cm4gXCJcIjtcblx0cmV0dXJuIGQuZm9ybWF0KFwiREQgTU1NTSBZWVlZXCIpO1xufSk7XG5cbmVudi5hZGRGaWx0ZXIoXCJmb3JtYXREYXRlSHVtYW5cIiwgZGF0ZSA9PiB7XG5cdGNvbnN0IGQgPSBtb21lbnQudW5peChkYXRlKTtcblx0aWYgKCFkLmlzVmFsaWQoKSlcblx0XHRyZXR1cm4gXCJcIjtcblx0cmV0dXJuIGQuZm9ybWF0KFwiRG8gW29mXSBNTU1NLCBZWVlZXCIpO1xufSk7XG5cbmVudi5hZGRGaWx0ZXIoXCJkdW1wSWZPYmplY3RcIiwgb2JqID0+IHtcblx0aWYgKF8uaXNQbGFpbk9iamVjdChvYmopKVxuXHRcdHJldHVybiBKU09OLnN0cmluZ2lmeShvYmopO1xuXHRpZiAoXy5pc051bGwob2JqKSlcblx0XHRyZXR1cm4gXCJudWxsXCI7XG5cdGlmIChfLmlzVW5kZWZpbmVkKG9iaikpXG5cdFx0cmV0dXJuIFwidW5kZWZpbmVkXCI7XG5cdGlmIChfLmlzQXJyYXkob2JqKSAmJiAhb2JqLmxlbmd0aClcblx0XHRyZXR1cm4gXCJbXVwiO1xuXHRyZXR1cm4gb2JqO1xufSk7XG5cbmVudi5hZGRGaWx0ZXIoXCJiZWZvcmVcIiwgKGRhdGUsIGNvdW50LCBpbnRlcnZhbCkgPT4ge1xuXHRjb25zdCBkID0gbW9tZW50LnVuaXgoZGF0ZSk7XG5cdHJldHVybiBkLmlzQmVmb3JlKG1vbWVudCgpLnN1YnRyYWN0KGNvdW50LCBpbnRlcnZhbCkpO1xufSk7XG5cbmVudi5hZGRGaWx0ZXIoXCJoYXNBY2Nlc3NcIiwgKHBlcm0sIHUpID0+IHtcblx0Y29uc3QgQXBwID0gcmVxdWlyZShcIi4uL2luZGV4XCIpO1xuXHRjb25zdCB1c2VyID0gdSB8fCByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpO1xuXHRyZXR1cm4gcmVzdGVyLmhhc0FjY2VzcyhwZXJtLCB1c2VyKTtcbn0pO1xuXG5lbnYuYWRkRmlsdGVyKFwiaW1wZXJzb25hdGVBY2Nlc3NcIiwgKHBlcm0sIHUpID0+IHtcblx0Y29uc3QgQXBwID0gcmVxdWlyZShcIi4uL2luZGV4XCIpO1xuXHRjb25zdCB1c2VyID0gdSB8fCByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuSW1wZXJzb25hdG9yKTtcblx0cmV0dXJuIHJlc3Rlci5oYXNBY2Nlc3MocGVybSwgdXNlcik7XG59KTtcblxuZW52LmFkZEZpbHRlcihcImhhc093bkdyYW50XCIsIChncmFudCwgdXNyKSA9PiB7XG5cdGNvbnN0IEFwcCA9IHJlcXVpcmUoXCIuLi9pbmRleFwiKTtcblx0Y29uc3QgdXNlciA9IHVzciB8fCByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpO1xuXHRpZiAoIXVzZXIpXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHRyZXR1cm4gcmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5ncmFudHMubWFpbltncmFudF0sIHVzZXIpO1xufSk7XG5cbmVudi5hZGRGaWx0ZXIoXCJnZXRHcmFudFZhbHVlc1wiLCAoZ3JhbnQsIHVzcikgPT4ge1xuXHRjb25zdCBBcHAgPSByZXF1aXJlKFwiLi4vaW5kZXhcIik7XG5cdGNvbnN0IHVzZXIgPSB1c3IgfHwgcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblx0aWYgKCF1c2VyKVxuXHRcdHJldHVybiBbXTtcblx0cmV0dXJuIHJlc3Rlci5nZXRHcmFudFZhbHVlcyh1c2VyLCBncmFudCkgfHwgW107XG59KTtcblxuZW52LmFkZEZpbHRlcihcImNvbnRhaW5zXCIsIChjb2xsZWN0aW9uLCBpdGVtKSA9PiBjb2xsZWN0aW9uICYmIF8uaW5jbHVkZXMoY29sbGVjdGlvbiwgaXRlbSkpO1xuXG5lbnYuYWRkRmlsdGVyKFwidG9GaXhlZFwiLCAobiwgZGVjKSA9PiB7XG5cdGNvbnN0IG51bSA9IG4gfHwgMDtcblx0cmV0dXJuIHBhcnNlRmxvYXQobnVtKS50b0ZpeGVkKGRlYyk7XG59KTtcblxuZW52LmFkZEZpbHRlcihcImlzQXJyYXlcIiwgYXJyID0+IF8uaXNBcnJheShhcnIpKTtcblxuZW52LmFkZEZpbHRlcihcInN0cmluZ2lmeVwiLCBhcmcgPT4ge1xuXHRpZiAoIWFyZylcblx0XHRyZXR1cm4gXCJcIjtcblx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZyk7XG59KTtcblxuZW52LmFkZEZpbHRlcihcInVybGVuY29kZVwiLCBhcmcgPT4ge1xuXHRpZiAoIWFyZylcblx0XHRyZXR1cm4gXCJcIjtcblx0cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChhcmcpO1xufSk7XG5cbmVudi5hZGRGaWx0ZXIoXCJpbXBlcnNvbmF0aW5nXCIsICgpID0+IHtcblx0Y29uc3QgQXBwID0gcmVxdWlyZShcIi4uL2luZGV4XCIpO1xuXHRyZXR1cm4gcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLklzSW1wZXJzb25hdGluZyk7XG59KTtcblxuZW52LmFkZEZpbHRlcihcInBsdWNrXCIsIChjb2wsIGZpZWxkKSA9PiBfLm1hcChjb2wsIGZpZWxkKSk7XG5cbmVudi5hZGRGaWx0ZXIoXCJzcGxpdFwiLCAodmFsLCBmaWVsZCkgPT4gKHZhbCB8fCBcIlwiKS5zcGxpdChmaWVsZCkpO1xuXG5lbnYuYWRkRmlsdGVyKFwiZ3JhZGVNYXBcIiwgZ3JhZGVzID0+IHtcblx0Y29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuXG5cdGNvbnN0IGcgPSBfLmZsYXR0ZW4oW2dyYWRlc10pO1xuXG5cdGNvbnN0IHJldCA9IFtdO1xuXHRfLmVhY2goc2V0dGluZ3MuZ3JhZGVMaXN0LCB2YWwgPT4ge1xuXHRcdF8uZWFjaCh2YWwsIGdyYWRlID0+IHtcblx0XHRcdGlmIChfLmluY2x1ZGVzKGcsIGdyYWRlLnZhbHVlKSlcblx0XHRcdFx0cmV0LnB1c2goZ3JhZGUubmFtZSk7XG5cdFx0fSk7XG5cdH0pO1xuXG5cdHJldHVybiByZXQuam9pbihcIiwgXCIpO1xufSk7XG5cbmVudi5hZGRGaWx0ZXIoXCJzaG93UGRmUmVzdHJpY3Rpb25zXCIsIGRhdGEgPT4gXy5tYXAoZGF0YSwgKHZhbCwga2V5KSA9PiB7XG5cdHN3aXRjaCAoa2V5KSB7XG5cdFx0Y2FzZSBcInByaW50XCI6XG5cdFx0XHRpZiAodmFsID09PSBcIm5vbmVcIilcblx0XHRcdFx0cmV0dXJuIFwiTm8gcHJpbnRpbmdcIjtcblx0XHRcdGVsc2UgaWYgKHZhbCA9PT0gXCJsb3dcIilcblx0XHRcdFx0cmV0dXJuIFwiTG93LXJlcyBwcmludGluZ1wiO1xuXHRcdFx0ZWxzZSBpZiAodmFsID09PSBcImZ1bGxcIilcblx0XHRcdFx0cmV0dXJuIFwiRnVsbC1yZXMgcHJpbnRpbmdcIjtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJtb2RpZnlcIjpcblx0XHRcdGlmICh2YWwgPT09IFwiYW5ub3RhdGVcIilcblx0XHRcdFx0cmV0dXJuIFwiT25seSBoaWdobGlnaHRzICYgYW5ub3RhdGlvbnNcIjtcblx0XHRcdGVsc2UgaWYgKHZhbCA9PT0gXCJhbGxcIilcblx0XHRcdFx0cmV0dXJuIFwiQWxsIG1vZGlmaWNhdGlvbnNcIjtcblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgXCJleHRyYWN0XCI6XG5cdFx0XHRpZiAodmFsID09PSBcInlcIilcblx0XHRcdFx0cmV0dXJuIFwiQWxsb3cgZXh0cmFjdGlvblwiO1xuXHRcdFx0ZWxzZSBpZiAodmFsID09PSBcIm5cIilcblx0XHRcdFx0cmV0dXJuIFwiRGlzYWxsb3cgZXh0cmFjdGlvblwiO1xuXHRcdFx0YnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHJldHVybiBcIlVua25vd24gcGVybWlzc2lvblwiO1xuXHR9XG59KS5qb2luKFwiLCBcIikpO1xuXG5lbnYuYWRkRmlsdGVyKFwidmVyc2lvbkZvcm1hdFwiLCB2ID0+IHtcblx0Y29uc3QgdmFsID0gcGFyc2VGbG9hdCh2KTtcblx0bGV0IGZpbmFsID0gTWF0aC5mbG9vcih2YWwpO1xuXHRpZiAodmFsICUgMSlcblx0XHRmaW5hbCArPSBcIi5cIiArICh2YWwgJSAxKS50b0ZpeGVkKDQpLnN1YnN0cmluZygyKS5yZXBsYWNlKC9eW14xLTldKyguKz8kKS8sIFwiJDFcIik7XG5cdHJldHVybiBmaW5hbDtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVudjsiXX0=",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar App = require(\"../index\");\nvar rester = require(\"rester\");\nvar settings = require(\"app-settings\");\n\nvar BigModal = require(\"./bigModal\");\nvar DragDropFileChooser = require(\"./dragDropFileChooser\");\nvar Resource = require(\"../content/models/manager/resourceModel\");\nvar Selectra = require(\"./selectra\");\n\nmodule.exports = BigModal.extend({\n\tregions: {\n\t\taudioFileChooser: \"div.audio-file-chooser-region\",\n\t\tflashCardDeckFileChooser: \"div.flash-card-deck-file-chooser-region\",\n\t\timageFileChooser: \"div.image-file-chooser-region\",\n\t\tofficeFileChooser: \"div.office-file-chooser-region\",\n\t\tpdfFileChooser: \"div.pdf-file-chooser-region\",\n\t\tvideoFileChooser: \"div.video-file-chooser-region\"\n\t},\n\n\tui: {\n\t\twelcome: \"div.welcome\",\n\t\tform: \"div.form\",\n\n\t\tmainrow: \".mainrow\",\n\t\tcategoryLabel: \".category-label\",\n\t\tcategory: \"select#category\",\n\t\tlanguageLabel: \".language-label\",\n\t\tlanguage: \"select#language\",\n\t\tsubjectLabel: \".subject-label\",\n\t\tsubject: \"select#subject\",\n\t\tstudyYearLabel: \".study-year-label\",\n\t\tstudyYear: \"select#studyYear\",\n\t\ttitle: \"input#title\",\n\t\tdescription: \"textarea#description\",\n\n\t\tfile: \".ddfc-file-input\",\n\n\t\tflashCardDeckForm: \"div.flash-card-deck-form\",\n\t\tflashCardDeckFileChooser: \"div.flash-card-deck-file-chooser\",\n\t\tflashCardUpload: \"div.flash-card-upload\",\n\t\tshowFlashCardUpload: \"input#show-flash-card-upload\",\n\n\t\timageForm: \"div.image-form\",\n\t\timageFileChooser: \"div.image-file-chooser\",\n\n\t\tpdfForm: \"div.pdf-form\",\n\t\tpdfFileChooser: \"div.pdf-file-chooser\",\n\n\t\tofficeForm: \"div.office-form\",\n\t\tofficeFileLabel: \"#office-file-label\",\n\t\tofficeFileChooser: \"div.office-file-chooser\",\n\n\t\ttextForm: \"div.text-form\",\n\t\ttext: \"textarea#text\",\n\n\t\turlForm: \"div.url-form\",\n\t\turl: \"input#url\",\n\n\t\tvideoForm: \"div.video-form\",\n\t\tvideoFileChooser: \"div.video-file-chooser\",\n\n\t\taudioForm: \"div.audio-form\",\n\t\taudioFileChooser: \"div.audio-file-chooser\"\n\t},\n\n\tevents: {\n\t\t\"change @ui.category\": \"onChangeCategory\",\n\t\t\"change @ui.showFlashCardUpload\": \"onFlashCardUploadChanged\",\n\t\t\"change @ui.title\": \"onTitleEdited\",\n\t\t\"keyup @ui.title\": \"onTitleEdited\"\n\t},\n\n\tactions: {\n\t\tcreate: \"onResourceCreated\",\n\t\tcreateAnother: \"onCreateAnother\",\n\t\tupdate: \"onResourceUpdated\"\n\t},\n\n\terrorMap: {\n\t\tcategory: {\n\t\t\tattractionElement: \"categoryLabel\",\n\t\t\tposition: \"bottom\"\n\t\t},\n\t\timageFileChooser: {\n\t\t\tposition: \"top\",\n\t\t\tchangeElement: \"file\"\n\t\t},\n\t\tpdfFileChooser: {\n\t\t\tposition: \"top\",\n\t\t\tchangeElement: \"file\"\n\t\t},\n\t\tofficeFileChooser: {\n\t\t\tposition: \"top\",\n\t\t\tchangeElement: \"file\"\n\t\t},\n\t\ttext: {\n\t\t\tposition: \"top\"\n\t\t},\n\t\turl: {\n\t\t\tposition: \"top\"\n\t\t},\n\t\tvideoFileChooser: {\n\t\t\tposition: \"top\",\n\t\t\tchangeElement: \"file\"\n\t\t},\n\t\taudioFileChooser: {\n\t\t\tposition: \"top\",\n\t\t\tchangeElement: \"file\"\n\t\t},\n\t\tlanguage: {\n\t\t\tattractionElement: \"languageLabel\",\n\t\t\tposition: \"bottom\"\n\t\t},\n\t\tsubject: {\n\t\t\tattractionElement: \"subjectLabel\",\n\t\t\tposition: \"bottom\"\n\t\t},\n\t\tstudyYear: {\n\t\t\tattractionElement: \"studyYearLabel\",\n\t\t\tposition: \"bottom\"\n\t\t},\n\t\ttitle: {\n\t\t\tposition: \"bottom\"\n\t\t}\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this = this;\n\n\t\treturn _.extend({\n\t\t\tcategoryLocked: function categoryLocked() {\n\t\t\t\treturn _this.lockCategory;\n\t\t\t},\n\t\t\teditable: function editable() {\n\t\t\t\treturn _this.isEditable();\n\t\t\t},\n\t\t\tflashCardsTutorialVideoSrc: settings.urlRoot + \"/help/Flashcards/Flashcards%20-%20How%20to%20upload%20flashcards%20using%20a%20CSV%20file.mp4\"\n\t\t}, BigModal.prototype.templateContext.call(this));\n\t},\n\n\tinitialize: function initialize(options) {\n\t\t_.bindAll(this);\n\n\t\tthis.selectedFile = undefined;\n\t\tthis.lockCategory = options.lockCategory;\n\n\t\tthis.Options = {\n\t\t\tclasses: [\"resource-modal\"],\n\t\t\ttemplate: require(\"./templates/resourceModal.nunj\").content,\n\t\t\tbuttons: {\n\t\t\t\tcreate: {\n\t\t\t\t\ttype: \"accept\",\n\t\t\t\t\tlabel: \"Create & Close\",\n\t\t\t\t\tmode: \"create\",\n\t\t\t\t\tsave: true,\n\t\t\t\t\tvalidate: true\n\t\t\t\t},\n\t\t\t\tcreateAnother: {\n\t\t\t\t\ttype: \"accept\",\n\t\t\t\t\tlabel: \"Create\",\n\t\t\t\t\tmode: \"create\",\n\t\t\t\t\tsave: true,\n\t\t\t\t\tvalidate: true\n\t\t\t\t},\n\t\t\t\tupdate: {\n\t\t\t\t\ttype: \"accept\",\n\t\t\t\t\tlabel: \"Update\",\n\t\t\t\t\tmode: \"edit\",\n\t\t\t\t\tpermission: this.permissionToUpdate.bind(this),\n\t\t\t\t\tsave: true,\n\t\t\t\t\tvalidate: true\n\t\t\t\t},\n\t\t\t\tcancel: {\n\t\t\t\t\ttype: \"cancel\",\n\t\t\t\t\tlabel: \"Cancel\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tdataNoun: \"resource\" + (this.model.isNew() ? \"\" : \": \" + this.model.get(\"title\")),\n\t\t\tsizeConstraints: {\n\t\t\t\tminHeight: \"620px\",\n\t\t\t\tminWidth: \"1200px\"\n\t\t\t},\n\t\t\thost: options.host\n\t\t};\n\n\t\tif (options.disableBatchCreate) delete this.Options.buttons.createAnother;\n\n\t\tthis.ui = _.extend(this.ui, BigModal.prototype.ui);\n\t\tthis.events = _.extend(this.events, BigModal.prototype.events);\n\n\t\tBigModal.prototype.initialize.call(this);\n\t},\n\n\tpermissionToUpdate: function permissionToUpdate() {\n\t\treturn settings.resourceEditing;\n\t},\n\n\tisEditable: function isEditable() {\n\t\treturn this.model.isNew() || !this.model.isNew() && rester.hasAccess(rester.p.api.resources.put, radio.request(App.Events.Requests.CurrentUser));\n\t},\n\n\trenderForm: function renderForm() {\n\t\tvar _this2 = this;\n\n\t\tvar cats = [{ key: \"audio\", value: \"Audio\", image: settings.urlRoot + \"/images/content/annotation_mp3.png\" }, { key: \"flashcarddeck\", value: \"Flashcard Deck\", image: settings.urlRoot + \"/images/content/annotation_flashcards.png\" }, { key: \"googledrive\", value: \"Google Drive\", image: settings.urlRoot + \"/images/content/annotation_googledrive.png\" }, { key: \"image\", value: \"Image\", image: settings.urlRoot + \"/images/content/annotation_graphic.png\" }, { key: \"onenote\", value: \"One Note\", image: settings.urlRoot + \"/images/content/annotation_onenote.png\" }, { key: \"pdf\", value: \"PDF\", image: settings.urlRoot + \"/images/content/annotation_pdf.png\" }, { key: \"text\", value: \"Text\", image: settings.urlRoot + \"/images/content/annotation_text.png\" }, { key: \"url\", value: \"URL\", image: settings.urlRoot + \"/images/content/annotation_url.png\" }, { key: \"video\", value: \"Video\", image: settings.urlRoot + \"/images/content/annotation_video.png\" }];\n\n\t\tif (settings.officeContent) {\n\t\t\tcats.push({ key: \"excel\", value: \"MS Excel\", image: settings.urlRoot + \"/images/content/annotation_excel.png\" }, { key: \"powerpoint\", value: \"MS PowerPoint\", image: settings.urlRoot + \"/images/content/annotation_powerpoint.png\" }, { key: \"word\", value: \"MS Word\", image: settings.urlRoot + \"/images/content/annotation_word.png\" });\n\t\t}\n\n\t\t_.each(cats, function (x) {\n\t\t\tif (x.key === _this2.model.get(\"category\")) x.selected = true;\n\t\t});\n\n\t\tvar types = new Selectra({\n\t\t\twidth: \"130px\",\n\t\t\titems: cats,\n\t\t\ticons: true,\n\t\t\tddHost: this.Options.host,\n\t\t\tplaceholder: \"Choose...\",\n\t\t\tsearch: false\n\t\t});\n\n\t\ttypes.show({ el: this.ui.category });\n\n\t\tvar language = new Selectra({\n\t\t\twidth: \"115px\",\n\t\t\titems: _.map(settings.languageList, function (x) {\n\t\t\t\treturn { key: x, value: x, selected: x === _this2.model.get(\"language\") };\n\t\t\t}),\n\t\t\tddHost: this.Options.host,\n\t\t\tplaceholder: \"Choose...\",\n\t\t\tsearch: false\n\t\t});\n\n\t\tlanguage.show({ el: this.ui.language });\n\n\t\tthis.subjectSelect = new Selectra({\n\t\t\twidth: \"330px\",\n\t\t\tserver: {\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/subjects\",\n\t\t\t\tdelayLoad: true,\n\t\t\t\tkey: \"subject_id\",\n\t\t\t\tvalue: \"subject\",\n\t\t\t\tdefault: {\n\t\t\t\t\tkey: this.model.get(\"subject\"),\n\t\t\t\t\tvalue: this.model.get(\"subject_name\")\n\t\t\t\t}\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 20,\n\t\t\t\tinfinite: true\n\t\t\t},\n\t\t\tddHost: this.Options.host,\n\t\t\tplaceholder: \"No subject selected\"\n\t\t});\n\n\t\tthis.subjectSelect.show({ el: this.ui.subject });\n\n\t\tvar grades = new Selectra({\n\t\t\twidth: \"200px\",\n\t\t\titems: _.reduce(settings.gradeList, function (sum, num, key) {\n\t\t\t\tsum[key] = _.reduce(num.sort(function (a, b) {\n\t\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t\t}), function (sum1, num1) {\n\t\t\t\t\tsum1.push({ key: num1.value, value: num1.name, selected: _.includes(_.flatten([_this2.model.get(\"studyYear\")]), num1.value) });\n\t\t\t\t\treturn sum1;\n\t\t\t\t}, []);\n\t\t\t\treturn sum;\n\t\t\t}, {}),\n\t\t\tshowCategories: true,\n\t\t\tplaceholder: \"Choose...\",\n\t\t\tddHost: this.Options.host\n\t\t});\n\n\t\tgrades.show({ el: this.ui.studyYear });\n\n\t\tif (!this.model.isNew() || this.model.has(\"category\") && this.lockCategory) setTimeout(function () {\n\t\t\t_this2.onChangeCategory();\n\t\t}, 10);\n\t},\n\n\tonFlashCardUploadChanged: function onFlashCardUploadChanged() {\n\t\tif (this.ui.showFlashCardUpload.prop(\"checked\")) this.showFlashCardUpload();else this.hideFlashCardUpload();\n\t},\n\n\thideFlashCardUpload: function hideFlashCardUpload() {\n\t\tthis.ui.flashCardDeckFileChooser.addClass(\"hide\");\n\t},\n\n\tshowFlashCardUpload: function showFlashCardUpload() {\n\t\tthis.ui.flashCardDeckFileChooser.removeClass(\"hide\");\n\t},\n\n\tonTitleEdited: function onTitleEdited() {\n\t\tthis.titleEdited = true;\n\t},\n\n\tonFileSelected: function onFileSelected(file) {\n\t\tthis.selectedFile = file;\n\n\t\tif (!this.titleEdited && this.model.isNew() || this.ui.title.val() === \"\" && (!this.model.has(\"title\") || this.model.get(\"title\") === \"\")) this.ui.title.val(file.name.replace(/\\.[^/.]+$/, \"\"));\n\t},\n\n\tonChangeCategory: function onChangeCategory() {\n\t\tif (this.currentResourceForm) {\n\t\t\tthis.currentResourceForm.addClass(\"hide\");\n\t\t} else {\n\t\t\tthis.ui.welcome.addClass(\"hide\");\n\t\t\tthis.ui.form.removeClass(\"hide\");\n\t\t}\n\n\t\tif (this.fileChooser) {\n\t\t\tthis.stopListening(this.fileChooser);\n\t\t\tthis.fileChooser.destroy();\n\t\t\tthis.selectedFile = undefined;\n\t\t}\n\n\t\tswitch (this.ui.category.val()) {\n\t\t\tcase \"audio\":\n\t\t\t\tthis.fileChooser = new DragDropFileChooser({\n\t\t\t\t\tacceptedFileTypes: [\".mp3\", \"audio/mpeg\", \"audio/mp3\"],\n\t\t\t\t\texistingFile: this.model.isNew() ? undefined : this.model,\n\t\t\t\t\theight: 210,\n\t\t\t\t\tlocked: !(this.permissionToUpdate() && this.isEditable())\n\t\t\t\t});\n\t\t\t\tthis.listenTo(this.fileChooser, \"selected\", this.onFileSelected.bind(this));\n\t\t\t\tthis.showChildView(\"audioFileChooser\", this.fileChooser);\n\n\t\t\t\tthis.currentResourceForm = this.ui.audioForm;\n\t\t\t\tbreak;\n\n\t\t\tcase \"excel\":\n\t\t\t\tthis.fileChooser = new DragDropFileChooser({\n\t\t\t\t\tacceptedFileTypes: [\".xls\", \".xlsx\", \"application/vnd.ms-excel\", \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"],\n\t\t\t\t\texistingFile: this.model.isNew() ? undefined : this.model,\n\t\t\t\t\theight: 210,\n\t\t\t\t\tlocked: !(this.permissionToUpdate() && this.isEditable())\n\t\t\t\t});\n\t\t\t\tthis.listenTo(this.fileChooser, \"selected\", this.onFileSelected.bind(this));\n\t\t\t\tthis.showChildView(\"officeFileChooser\", this.fileChooser);\n\n\t\t\t\tthis.currentResourceForm = this.ui.officeForm;\n\t\t\t\tthis.ui.officeFileLabel.text(\"Microsoft Excel file\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"flashcarddeck\":\n\t\t\t\tif (this.model.isNew()) {\n\t\t\t\t\tthis.fileChooser = new DragDropFileChooser({\n\t\t\t\t\t\tacceptedFileTypes: [\".csv\", \"text/csv\", \"text/plain\"],\n\t\t\t\t\t\theight: 210,\n\t\t\t\t\t\tlocked: !(this.permissionToUpdate() && this.isEditable())\n\t\t\t\t\t});\n\t\t\t\t\tthis.listenTo(this.fileChooser, \"selected\", this.onFileSelected.bind(this));\n\t\t\t\t\tthis.showChildView(\"flashCardDeckFileChooser\", this.fileChooser);\n\n\t\t\t\t\tthis.ui.flashCardUpload.removeClass(\"hide\");\n\t\t\t\t} else {\n\t\t\t\t\tthis.ui.flashCardUpload.addClass(\"hide\");\n\t\t\t\t}\n\n\t\t\t\tthis.currentResourceForm = this.ui.flashCardDeckForm;\n\t\t\t\tbreak;\n\n\t\t\tcase \"googledrive\":\n\t\t\t\tthis.currentResourceForm = this.ui.urlForm;\n\t\t\t\tbreak;\n\n\t\t\tcase \"image\":\n\t\t\t\tthis.fileChooser = new DragDropFileChooser({\n\t\t\t\t\tacceptedFileTypes: [\".jpg\", \".jpeg\", \".png\", \".gif\", \"image/gif\", \"image/jpeg\", \"image/png\", \"image/gif\"],\n\t\t\t\t\texistingFile: this.model.isNew() ? undefined : this.model,\n\t\t\t\t\theight: 210,\n\t\t\t\t\tlocked: !(this.permissionToUpdate() && this.isEditable())\n\t\t\t\t});\n\t\t\t\tthis.listenTo(this.fileChooser, \"selected\", this.onFileSelected.bind(this));\n\t\t\t\tthis.showChildView(\"imageFileChooser\", this.fileChooser);\n\n\t\t\t\tthis.currentResourceForm = this.ui.imageForm;\n\t\t\t\tbreak;\n\n\t\t\tcase \"onenote\":\n\t\t\t\tthis.currentResourceForm = this.ui.urlForm;\n\t\t\t\tbreak;\n\n\t\t\tcase \"pdf\":\n\t\t\t\tthis.fileChooser = new DragDropFileChooser({\n\t\t\t\t\tacceptedFileTypes: [\".pdf\", \"application/pdf\"],\n\t\t\t\t\texistingFile: this.model.isNew() ? undefined : this.model,\n\t\t\t\t\theight: 210,\n\t\t\t\t\tlocked: !(this.permissionToUpdate() && this.isEditable())\n\t\t\t\t});\n\t\t\t\tthis.listenTo(this.fileChooser, \"selected\", this.onFileSelected.bind(this));\n\t\t\t\tthis.showChildView(\"pdfFileChooser\", this.fileChooser);\n\n\t\t\t\tthis.currentResourceForm = this.ui.pdfForm;\n\t\t\t\tbreak;\n\n\t\t\tcase \"powerpoint\":\n\t\t\t\tthis.fileChooser = new DragDropFileChooser({\n\t\t\t\t\tacceptedFileTypes: [\".ppt\", \".pptx\", \".pps\", \".ppsx\", \"application/vnd.ms-powerpoint\", \"application/vnd.openxmlformats-officedocument.presentationml.presentation\", \"application/vnd.ms-powerpoint\", \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\"],\n\t\t\t\t\texistingFile: this.model.isNew() ? undefined : this.model,\n\t\t\t\t\theight: 210,\n\t\t\t\t\tlocked: !(this.permissionToUpdate() && this.isEditable())\n\t\t\t\t});\n\t\t\t\tthis.listenTo(this.fileChooser, \"selected\", this.onFileSelected.bind(this));\n\t\t\t\tthis.showChildView(\"officeFileChooser\", this.fileChooser);\n\n\t\t\t\tthis.currentResourceForm = this.ui.officeForm;\n\t\t\t\tthis.ui.officeFileLabel.text(\"Microsoft PowerPoint file\");\n\t\t\t\tbreak;\n\n\t\t\tcase \"text\":\n\t\t\t\tthis.currentResourceForm = this.ui.textForm;\n\t\t\t\tbreak;\n\n\t\t\tcase \"url\":\n\t\t\t\tthis.currentResourceForm = this.ui.urlForm;\n\t\t\t\tbreak;\n\n\t\t\tcase \"video\":\n\t\t\t\tthis.fileChooser = new DragDropFileChooser({\n\t\t\t\t\tacceptedFileTypes: [\".mp4\", \"video/mp4\"],\n\t\t\t\t\texistingFile: this.model.isNew() ? undefined : this.model,\n\t\t\t\t\theight: 210,\n\t\t\t\t\tlocked: !(this.permissionToUpdate() && this.isEditable())\n\t\t\t\t});\n\t\t\t\tthis.listenTo(this.fileChooser, \"selected\", this.onFileSelected.bind(this));\n\t\t\t\tthis.showChildView(\"videoFileChooser\", this.fileChooser);\n\n\t\t\t\tthis.currentResourceForm = this.ui.videoForm;\n\t\t\t\tbreak;\n\n\t\t\tcase \"word\":\n\t\t\t\tthis.fileChooser = new DragDropFileChooser({\n\t\t\t\t\tacceptedFileTypes: [\".doc\", \".docx\", \"application/msword\", \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\"],\n\t\t\t\t\texistingFile: this.model.isNew() ? undefined : this.model,\n\t\t\t\t\theight: 210,\n\t\t\t\t\tlocked: !(this.permissionToUpdate() && this.isEditable())\n\t\t\t\t});\n\t\t\t\tthis.listenTo(this.fileChooser, \"selected\", this.onFileSelected.bind(this));\n\t\t\t\tthis.showChildView(\"officeFileChooser\", this.fileChooser);\n\n\t\t\t\tthis.currentResourceForm = this.ui.officeForm;\n\t\t\t\tthis.ui.officeFileLabel.text(\"Microsoft Word file\");\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthis.ui.welcome.removeClass(\"hide\");\n\t\t\t\tthis.ui.mainrow.addClass(\"hide\");\n\t\t\t\treturn;\n\t\t}\n\n\t\tthis.currentResourceForm.removeClass(\"hide\");\n\t\tthis.ui.mainrow.removeClass(\"hide\");\n\t},\n\n\tassembleData: function assembleData() {\n\t\tvar data = {};\n\n\t\tdata.attributes = {\n\t\t\tcategory: this.ui.category.val(),\n\t\t\tlanguage: this.ui.language.val(),\n\t\t\tsubject: parseInt(this.ui.subject.val(), 10),\n\t\t\tsubject_name: this.subjectSelect.getSelected().subject,\n\t\t\tstudyYear: this.ui.studyYear.val(),\n\t\t\ttitle: this.ui.title.val(),\n\t\t\tdescription: this.ui.description.val()\n\t\t};\n\n\t\tdata.files = {};\n\n\t\tswitch (this.ui.category.val()) {\n\t\t\tcase \"audio\":\n\t\t\tcase \"excel\":\n\t\t\tcase \"powerpoint\":\n\t\t\tcase \"word\":\n\t\t\tcase \"pdf\":\n\t\t\tcase \"video\":\n\t\t\tcase \"image\":\n\t\t\t\tdata.files.file = this.selectedFile;\n\t\t\t\tbreak;\n\n\t\t\tcase \"flashcarddeck\":\n\t\t\t\tif (this.selectedFile) data.files.file = this.selectedFile;\n\n\t\t\t\tif (!this.model.has(\"flashCards\") || this.model.get(\"flashCards\").length === 0) data.attributes.flashCards = [];\n\t\t\t\tbreak;\n\n\t\t\tcase \"googledrive\":\n\t\t\t\tdata.attributes.googledrive = this.ui.url.val();\n\t\t\t\tbreak;\n\n\t\t\tcase \"onenote\":\n\t\t\t\tdata.attributes.onenote = this.ui.url.val();\n\t\t\t\tbreak;\n\n\t\t\tcase \"text\":\n\t\t\t\tdata.attributes.text = this.ui.text.val();\n\t\t\t\tbreak;\n\n\t\t\tcase \"url\":\n\t\t\t\tdata.attributes.url = this.ui.url.val();\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t// No data to set\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn data;\n\t},\n\n\tonResourceCreated: function onResourceCreated(result) {\n\t\tApp.trigger(App.Events.ResourceCreated, result.model);\n\t\tthis.currentResourceForm = null;\n\t},\n\n\tonResourceUpdated: function onResourceUpdated(result) {\n\t\tresult.model.set({\n\t\t\tupdated: moment().unix()\n\t\t});\n\n\t\tApp.trigger(App.Events.ResourceUpdated, result.model);\n\t},\n\n\tonCreateAnother: function onCreateAnother(result) {\n\t\tthis.onResourceCreated(result);\n\n\t\treturn new Resource({\n\t\t\tlanguage: result.model.get(\"language\"),\n\t\t\tstudyYear: result.model.get(\"studyYear\"),\n\t\t\tsubject: result.model.get(\"subject\"),\n\t\t\tsubject_name: result.model.get(\"subject_name\")\n\t\t});\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJlc291cmNlTW9kYWwuanMiXSwibmFtZXMiOlsiXyIsInJlcXVpcmUiLCJCYWNrYm9uZSIsIm1vbWVudCIsInJhZGlvIiwiUmFkaW8iLCJjaGFubmVsIiwiQXBwIiwicmVzdGVyIiwic2V0dGluZ3MiLCJCaWdNb2RhbCIsIkRyYWdEcm9wRmlsZUNob29zZXIiLCJSZXNvdXJjZSIsIlNlbGVjdHJhIiwibW9kdWxlIiwiZXhwb3J0cyIsImV4dGVuZCIsInJlZ2lvbnMiLCJhdWRpb0ZpbGVDaG9vc2VyIiwiZmxhc2hDYXJkRGVja0ZpbGVDaG9vc2VyIiwiaW1hZ2VGaWxlQ2hvb3NlciIsIm9mZmljZUZpbGVDaG9vc2VyIiwicGRmRmlsZUNob29zZXIiLCJ2aWRlb0ZpbGVDaG9vc2VyIiwidWkiLCJ3ZWxjb21lIiwiZm9ybSIsIm1haW5yb3ciLCJjYXRlZ29yeUxhYmVsIiwiY2F0ZWdvcnkiLCJsYW5ndWFnZUxhYmVsIiwibGFuZ3VhZ2UiLCJzdWJqZWN0TGFiZWwiLCJzdWJqZWN0Iiwic3R1ZHlZZWFyTGFiZWwiLCJzdHVkeVllYXIiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwiZmlsZSIsImZsYXNoQ2FyZERlY2tGb3JtIiwiZmxhc2hDYXJkVXBsb2FkIiwic2hvd0ZsYXNoQ2FyZFVwbG9hZCIsImltYWdlRm9ybSIsInBkZkZvcm0iLCJvZmZpY2VGb3JtIiwib2ZmaWNlRmlsZUxhYmVsIiwidGV4dEZvcm0iLCJ0ZXh0IiwidXJsRm9ybSIsInVybCIsInZpZGVvRm9ybSIsImF1ZGlvRm9ybSIsImV2ZW50cyIsImFjdGlvbnMiLCJjcmVhdGUiLCJjcmVhdGVBbm90aGVyIiwidXBkYXRlIiwiZXJyb3JNYXAiLCJhdHRyYWN0aW9uRWxlbWVudCIsInBvc2l0aW9uIiwiY2hhbmdlRWxlbWVudCIsInRlbXBsYXRlQ29udGV4dCIsImNhdGVnb3J5TG9ja2VkIiwibG9ja0NhdGVnb3J5IiwiZWRpdGFibGUiLCJpc0VkaXRhYmxlIiwiZmxhc2hDYXJkc1R1dG9yaWFsVmlkZW9TcmMiLCJ1cmxSb290IiwicHJvdG90eXBlIiwiY2FsbCIsImluaXRpYWxpemUiLCJvcHRpb25zIiwiYmluZEFsbCIsInNlbGVjdGVkRmlsZSIsInVuZGVmaW5lZCIsIk9wdGlvbnMiLCJjbGFzc2VzIiwidGVtcGxhdGUiLCJjb250ZW50IiwiYnV0dG9ucyIsInR5cGUiLCJsYWJlbCIsIm1vZGUiLCJzYXZlIiwidmFsaWRhdGUiLCJwZXJtaXNzaW9uIiwicGVybWlzc2lvblRvVXBkYXRlIiwiYmluZCIsImNhbmNlbCIsImRhdGFOb3VuIiwibW9kZWwiLCJpc05ldyIsImdldCIsInNpemVDb25zdHJhaW50cyIsIm1pbkhlaWdodCIsIm1pbldpZHRoIiwiaG9zdCIsImRpc2FibGVCYXRjaENyZWF0ZSIsInJlc291cmNlRWRpdGluZyIsImhhc0FjY2VzcyIsInAiLCJhcGkiLCJyZXNvdXJjZXMiLCJwdXQiLCJyZXF1ZXN0IiwiRXZlbnRzIiwiUmVxdWVzdHMiLCJDdXJyZW50VXNlciIsInJlbmRlckZvcm0iLCJjYXRzIiwia2V5IiwidmFsdWUiLCJpbWFnZSIsIm9mZmljZUNvbnRlbnQiLCJwdXNoIiwiZWFjaCIsIngiLCJzZWxlY3RlZCIsInR5cGVzIiwid2lkdGgiLCJpdGVtcyIsImljb25zIiwiZGRIb3N0IiwicGxhY2Vob2xkZXIiLCJzZWFyY2giLCJzaG93IiwiZWwiLCJtYXAiLCJsYW5ndWFnZUxpc3QiLCJzdWJqZWN0U2VsZWN0Iiwic2VydmVyIiwiZmV0Y2giLCJkZWxheUxvYWQiLCJkZWZhdWx0IiwicGFnaW5nIiwicGFnZVNpemUiLCJpbmZpbml0ZSIsImdyYWRlcyIsInJlZHVjZSIsImdyYWRlTGlzdCIsInN1bSIsIm51bSIsInNvcnQiLCJhIiwiYiIsImxleGljYWwiLCJuYW1lIiwidG9VcHBlckNhc2UiLCJsb2NhbGVDb21wYXJlIiwic3VtMSIsIm51bTEiLCJpbmNsdWRlcyIsImZsYXR0ZW4iLCJzaG93Q2F0ZWdvcmllcyIsImhhcyIsInNldFRpbWVvdXQiLCJvbkNoYW5nZUNhdGVnb3J5Iiwib25GbGFzaENhcmRVcGxvYWRDaGFuZ2VkIiwicHJvcCIsImhpZGVGbGFzaENhcmRVcGxvYWQiLCJhZGRDbGFzcyIsInJlbW92ZUNsYXNzIiwib25UaXRsZUVkaXRlZCIsInRpdGxlRWRpdGVkIiwib25GaWxlU2VsZWN0ZWQiLCJ2YWwiLCJyZXBsYWNlIiwiY3VycmVudFJlc291cmNlRm9ybSIsImZpbGVDaG9vc2VyIiwic3RvcExpc3RlbmluZyIsImRlc3Ryb3kiLCJhY2NlcHRlZEZpbGVUeXBlcyIsImV4aXN0aW5nRmlsZSIsImhlaWdodCIsImxvY2tlZCIsImxpc3RlblRvIiwic2hvd0NoaWxkVmlldyIsImFzc2VtYmxlRGF0YSIsImRhdGEiLCJhdHRyaWJ1dGVzIiwicGFyc2VJbnQiLCJzdWJqZWN0X25hbWUiLCJnZXRTZWxlY3RlZCIsImZpbGVzIiwibGVuZ3RoIiwiZmxhc2hDYXJkcyIsImdvb2dsZWRyaXZlIiwib25lbm90ZSIsIm9uUmVzb3VyY2VDcmVhdGVkIiwicmVzdWx0IiwidHJpZ2dlciIsIlJlc291cmNlQ3JlYXRlZCIsIm9uUmVzb3VyY2VVcGRhdGVkIiwic2V0IiwidXBkYXRlZCIsInVuaXgiLCJSZXNvdXJjZVVwZGF0ZWQiLCJvbkNyZWF0ZUFub3RoZXIiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsV0FBV0QsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUUsU0FBU0YsUUFBUSxRQUFSLENBQWY7QUFDQSxJQUFNRyxRQUFRRixTQUFTRyxLQUFULENBQWVDLE9BQWYsQ0FBdUIsUUFBdkIsQ0FBZDs7QUFFQSxJQUFNQyxNQUFNTixRQUFRLFVBQVIsQ0FBWjtBQUNBLElBQU1PLFNBQVNQLFFBQVEsUUFBUixDQUFmO0FBQ0EsSUFBTVEsV0FBV1IsUUFBUSxjQUFSLENBQWpCOztBQUVBLElBQU1TLFdBQVdULFFBQVEsWUFBUixDQUFqQjtBQUNBLElBQU1VLHNCQUFzQlYsUUFBUSx1QkFBUixDQUE1QjtBQUNB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QUEvQztBQUNBLEVBL2dCK0I7O0FBaWhCaEMyRyxrQkFBaUIseUJBQVNSLE1BQVQsRUFBaUI7QUFDakMsT0FBS0QsaUJBQUwsQ0FBdUJDLE1BQXZCOztBQUVBLFNBQU8sSUFBSWpMLFFBQUosQ0FBYTtBQUNuQm1CLGFBQVU4SixPQUFPbkcsS0FBUCxDQUFhRSxHQUFiLENBQWlCLFVBQWpCLENBRFM7QUFFbkJ6RCxjQUFXMEosT0FBT25HLEtBQVAsQ0FBYUUsR0FBYixDQUFpQixXQUFqQixDQUZRO0FBR25CM0QsWUFBUzRKLE9BQU9uRyxLQUFQLENBQWFFLEdBQWIsQ0FBaUIsU0FBakIsQ0FIVTtBQUluQnlGLGlCQUFjUSxPQUFPbkcsS0FBUCxDQUFhRSxHQUFiLENBQWlCLGNBQWpCO0FBSkssR0FBYixDQUFQO0FBTUE7QUExaEIrQixDQUFoQixDQUFqQiIsImZpbGUiOiJyZXNvdXJjZU1vZGFsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgbW9tZW50ID0gcmVxdWlyZShcIm1vbWVudFwiKTtcbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcblxuY29uc3QgQXBwID0gcmVxdWlyZShcIi4uL2luZGV4XCIpO1xuY29uc3QgcmVzdGVyID0gcmVxdWlyZShcInJlc3RlclwiKTtcbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxuY29uc3QgQmlnTW9kYWwgPSByZXF1aXJlKFwiLi9iaWdNb2RhbFwiKTtcbmNvbnN0IERyYWdEcm9wRmlsZUNob29zZXIgPSByZXF1aXJlKFwiLi9kcmFnRHJvcEZpbGVDaG9vc2VyXCIpO1xuY29uc3QgUmVzb3VyY2UgPSByZXF1aXJlKFwiLi4vY29udGVudC9tb2RlbHMvbWFuYWdlci9yZXNvdXJjZU1vZGVsXCIpO1xuY29uc3QgU2VsZWN0cmEgPSByZXF1aXJlKFwiLi9zZWxlY3RyYVwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCaWdNb2RhbC5leHRlbmQoe1xuXHRyZWdpb25zOiB7XG5cdFx0YXVkaW9GaWxlQ2hvb3NlcjogXCJkaXYuYXVkaW8tZmlsZS1jaG9vc2VyLXJlZ2lvblwiLFxuXHRcdGZsYXNoQ2FyZERlY2tGaWxlQ2hvb3NlcjogXCJkaXYuZmxhc2gtY2FyZC1kZWNrLWZpbGUtY2hvb3Nlci1yZWdpb25cIixcblx0XHRpbWFnZUZpbGVDaG9vc2VyOiBcImRpdi5pbWFnZS1maWxlLWNob29zZXItcmVnaW9uXCIsXG5cdFx0b2ZmaWNlRmlsZUNob29zZXI6IFwiZGl2Lm9mZmljZS1maWxlLWNob29zZXItcmVnaW9uXCIsXG5cdFx0cGRmRmlsZUNob29zZXI6IFwiZGl2LnBkZi1maWxlLWNob29zZXItcmVnaW9uXCIsXG5cdFx0dmlkZW9GaWxlQ2hvb3NlcjogXCJkaXYudmlkZW8tZmlsZS1jaG9vc2VyLXJlZ2lvblwiLFxuXHR9LFxuXG5cdHVpOiB7XG5cdFx0d2VsY29tZTogXCJkaXYud2VsY29tZVwiLFxuXHRcdGZvcm06IFwiZGl2LmZvcm1cIixcblxuXHRcdG1haW5yb3c6IFwiLm1haW5yb3dcIixcblx0XHRjYXRlZ29yeUxhYmVsOiBcIi5jYXRlZ29yeS1sYWJlbFwiLFxuXHRcdGNhdGVnb3J5OiBcInNlbGVjdCNjYXRlZ29yeVwiLFxuXHRcdGxhbmd1YWdlTGFiZWw6IFwiLmxhbmd1YWdlLWxhYmVsXCIsXG5cdFx0bGFuZ3VhZ2U6IFwic2VsZWN0I2xhbmd1YWdlXCIsXG5cdFx0c3ViamVjdExhYmVsOiBcIi5zdWJqZWN0LWxhYmVsXCIsXG5cdFx0c3ViamVjdDogXCJzZWxlY3Qjc3ViamVjdFwiLFxuXHRcdHN0dWR5WWVhckxhYmVsOiBcIi5zdHVkeS15ZWFyLWxhYmVsXCIsXG5cdFx0c3R1ZHlZZWFyOiBcInNlbGVjdCNzdHVkeVllYXJcIixcblx0XHR0aXRsZTogXCJpbnB1dCN0aXRsZVwiLFxuXHRcdGRlc2NyaXB0aW9uOiBcInRleHRhcmVhI2Rlc2NyaXB0aW9uXCIsXG5cblx0XHRmaWxlOiBcIi5kZGZjLWZpbGUtaW5wdXRcIixcblxuXHRcdGZsYXNoQ2FyZERlY2tGb3JtOiBcImRpdi5mbGFzaC1jYXJkLWRlY2stZm9ybVwiLFxuXHRcdGZsYXNoQ2FyZERlY2tGaWxlQ2hvb3NlcjogXCJkaXYuZmxhc2gtY2FyZC1kZWNrLWZpbGUtY2hvb3NlclwiLFxuXHRcdGZsYXNoQ2FyZFVwbG9hZDogXCJkaXYuZmxhc2gtY2FyZC11cGxvYWRcIixcblx0XHRzaG93Rmxhc2hDYXJkVXBsb2FkOiBcImlucHV0I3Nob3ctZmxhc2gtY2FyZC11cGxvYWRcIixcblxuXHRcdGltYWdlRm9ybTogXCJkaXYuaW1hZ2UtZm9ybVwiLFxuXHRcdGltYWdlRmlsZUNob29zZXI6IFwiZGl2LmltYWdlLWZpbGUtY2hvb3NlclwiLFxuXG5cdFx0cGRmRm9ybTogXCJkaXYucGRmLWZvcm1cIixcblx0XHRwZGZGaWxlQ2hvb3NlcjogXCJkaXYucGRmLWZpbGUtY2hvb3NlclwiLFxuXG5cdFx0b2ZmaWNlRm9ybTogXCJkaXYub2ZmaWNlLWZvcm1cIixcblx0XHRvZmZpY2VGaWxlTGFiZWw6IFwiI29mZmljZS1maWxlLWxhYmVsXCIsXG5cdFx0b2ZmaWNlRmlsZUNob29zZXI6IFwiZGl2Lm9mZmljZS1maWxlLWNob29zZXJcIixcblxuXHRcdHRleHRGb3JtOiBcImRpdi50ZXh0LWZvcm1cIixcblx0XHR0ZXh0OiBcInRleHRhcmVhI3RleHRcIixcblxuXHRcdHVybEZvcm06IFwiZGl2LnVybC1mb3JtXCIsXG5cdFx0dXJsOiBcImlucHV0I3VybFwiLFxuXG5cdFx0dmlkZW9Gb3JtOiBcImRpdi52aWRlby1mb3JtXCIsXG5cdFx0dmlkZW9GaWxlQ2hvb3NlcjogXCJkaXYudmlkZW8tZmlsZS1jaG9vc2VyXCIsXG5cblx0XHRhdWRpb0Zvcm06IFwiZGl2LmF1ZGlvLWZvcm1cIixcblx0XHRhdWRpb0ZpbGVDaG9vc2VyOiBcImRpdi5hdWRpby1maWxlLWNob29zZXJcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNoYW5nZSBAdWkuY2F0ZWdvcnlcIjogXCJvbkNoYW5nZUNhdGVnb3J5XCIsXG5cdFx0XCJjaGFuZ2UgQHVpLnNob3dGbGFzaENhcmRVcGxvYWRcIjogXCJvbkZsYXNoQ2FyZFVwbG9hZENoYW5nZWRcIixcblx0XHRcImNoYW5nZSBAdWkudGl0bGVcIjogXCJvblRpdGxlRWRpdGVkXCIsXG5cdFx0XCJrZXl1cCBAdWkudGl0bGVcIjogXCJvblRpdGxlRWRpdGVkXCIsXG5cdH0sXG5cblx0YWN0aW9uczoge1xuXHRcdGNyZWF0ZTogXCJvblJlc291cmNlQ3JlYXRlZFwiLFxuXHRcdGNyZWF0ZUFub3RoZXI6IFwib25DcmVhdGVBbm90aGVyXCIsXG5cdFx0dXBkYXRlOiBcIm9uUmVzb3VyY2VVcGRhdGVkXCIsXG5cdH0sXG5cblx0ZXJyb3JNYXA6IHtcblx0XHRjYXRlZ29yeToge1xuXHRcdFx0YXR0cmFjdGlvbkVsZW1lbnQ6IFwiY2F0ZWdvcnlMYWJlbFwiLFxuXHRcdFx0cG9zaXRpb246IFwiYm90dG9tXCIsXG5cdFx0fSxcblx0XHRpbWFnZUZpbGVDaG9vc2VyOiB7XG5cdFx0XHRwb3NpdGlvbjogXCJ0b3BcIixcblx0XHRcdGNoYW5nZUVsZW1lbnQ6IFwiZmlsZVwiLFxuXHRcdH0sXG5cdFx0cGRmRmlsZUNob29zZXI6IHtcblx0XHRcdHBvc2l0aW9uOiBcInRvcFwiLFxuXHRcdFx0Y2hhbmdlRWxlbWVudDogXCJmaWxlXCIsXG5cdFx0fSxcblx0XHRvZmZpY2VGaWxlQ2hvb3Nlcjoge1xuXHRcdFx0cG9zaXRpb246IFwidG9wXCIsXG5cdFx0XHRjaGFuZ2VFbGVtZW50OiBcImZpbGVcIixcblx0XHR9LFxuXHRcdHRleHQ6IHtcblx0XHRcdHBvc2l0aW9uOiBcInRvcFwiLFxuXHRcdH0sXG5cdFx0dXJsOiB7XG5cdFx0XHRwb3NpdGlvbjogXCJ0b3BcIixcblx0XHR9LFxuXHRcdHZpZGVvRmlsZUNob29zZXI6IHtcblx0XHRcdHBvc2l0aW9uOiBcInRvcFwiLFxuXHRcdFx0Y2hhbmdlRWxlbWVudDogXCJmaWxlXCIsXG5cdFx0fSxcblx0XHRhdWRpb0ZpbGVDaG9vc2VyOiB7XG5cdFx0XHRwb3NpdGlvbjogXCJ0b3BcIixcblx0XHRcdGNoYW5nZUVsZW1lbnQ6IFwiZmlsZVwiLFxuXHRcdH0sXG5cdFx0bGFuZ3VhZ2U6IHtcblx0XHRcdGF0dHJhY3Rpb25FbGVtZW50OiBcImxhbmd1YWdlTGFiZWxcIixcblx0XHRcdHBvc2l0aW9uOiBcImJvdHRvbVwiLFxuXHRcdH0sXG5cdFx0c3ViamVjdDoge1xuXHRcdFx0YXR0cmFjdGlvbkVsZW1lbnQ6IFwic3ViamVjdExhYmVsXCIsXG5cdFx0XHRwb3NpdGlvbjogXCJib3R0b21cIixcblx0XHR9LFxuXHRcdHN0dWR5WWVhcjoge1xuXHRcdFx0YXR0cmFjdGlvbkVsZW1lbnQ6IFwic3R1ZHlZZWFyTGFiZWxcIixcblx0XHRcdHBvc2l0aW9uOiBcImJvdHRvbVwiLFxuXHRcdH0sXG5cdFx0dGl0bGU6IHtcblx0XHRcdHBvc2l0aW9uOiBcImJvdHRvbVwiLFxuXHRcdH0sXG5cdH0sXG5cblx0dGVtcGxhdGVDb250ZXh0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gXy5leHRlbmQoe1xuXHRcdFx0Y2F0ZWdvcnlMb2NrZWQ6ICgpID0+IHRoaXMubG9ja0NhdGVnb3J5LFxuXHRcdFx0ZWRpdGFibGU6ICgpID0+IHRoaXMuaXNFZGl0YWJsZSgpLFxuXHRcdFx0Zmxhc2hDYXJkc1R1dG9yaWFsVmlkZW9TcmM6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9oZWxwL0ZsYXNoY2FyZHMvRmxhc2hjYXJkcyUyMC0lMjBIb3clMjB0byUyMHVwbG9hZCUyMGZsYXNoY2FyZHMlMjB1c2luZyUyMGElMjBDU1YlMjBmaWxlLm1wNFwiLFxuXHRcdH0sIEJpZ01vZGFsLnByb3RvdHlwZS50ZW1wbGF0ZUNvbnRleHQuY2FsbCh0aGlzKSk7XG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdF8uYmluZEFsbCh0aGlzKTtcblxuXHRcdHRoaXMuc2VsZWN0ZWRGaWxlID0gdW5kZWZpbmVkO1xuXHRcdHRoaXMubG9ja0NhdGVnb3J5ID0gb3B0aW9ucy5sb2NrQ2F0ZWdvcnk7XG5cblx0XHR0aGlzLk9wdGlvbnMgPSB7XG5cdFx0XHRjbGFzc2VzOiBbXCJyZXNvdXJjZS1tb2RhbFwiXSxcblx0XHRcdHRlbXBsYXRlOiByZXF1aXJlKFwiLi90ZW1wbGF0ZXMvcmVzb3VyY2VNb2RhbC5udW5qXCIpLmNvbnRlbnQsXG5cdFx0XHRidXR0b25zOiB7XG5cdFx0XHRcdGNyZWF0ZToge1xuXHRcdFx0XHRcdHR5cGU6IFwiYWNjZXB0XCIsXG5cdFx0XHRcdFx0bGFiZWw6IFwiQ3JlYXRlICYgQ2xvc2VcIixcblx0XHRcdFx0XHRtb2RlOiBcImNyZWF0ZVwiLFxuXHRcdFx0XHRcdHNhdmU6IHRydWUsXG5cdFx0XHRcdFx0dmFsaWRhdGU6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGNyZWF0ZUFub3RoZXI6IHtcblx0XHRcdFx0XHR0eXBlOiBcImFjY2VwdFwiLFxuXHRcdFx0XHRcdGxhYmVsOiBcIkNyZWF0ZVwiLFxuXHRcdFx0XHRcdG1vZGU6IFwiY3JlYXRlXCIsXG5cdFx0XHRcdFx0c2F2ZTogdHJ1ZSxcblx0XHRcdFx0XHR2YWxpZGF0ZTogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0dXBkYXRlOiB7XG5cdFx0XHRcdFx0dHlwZTogXCJhY2NlcHRcIixcblx0XHRcdFx0XHRsYWJlbDogXCJVcGRhdGVcIixcblx0XHRcdFx0XHRtb2RlOiBcImVkaXRcIixcblx0XHRcdFx0XHRwZXJtaXNzaW9uOiB0aGlzLnBlcm1pc3Npb25Ub1VwZGF0ZS5iaW5kKHRoaXMpLFxuXHRcdFx0XHRcdHNhdmU6IHRydWUsXG5cdFx0XHRcdFx0dmFsaWRhdGU6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGNhbmNlbDoge1xuXHRcdFx0XHRcdHR5cGU6IFwiY2FuY2VsXCIsXG5cdFx0XHRcdFx0bGFiZWw6IFwiQ2FuY2VsXCIsXG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdFx0ZGF0YU5vdW46IFwicmVzb3VyY2VcIiArICh0aGlzLm1vZGVsLmlzTmV3KCkgPyBcIlwiIDogXCI6IFwiICsgdGhpcy5tb2RlbC5nZXQoXCJ0aXRsZVwiKSksXG5cdFx0XHRzaXplQ29uc3RyYWludHM6IHtcblx0XHRcdFx0bWluSGVpZ2h0OiBcIjYyMHB4XCIsXG5cdFx0XHRcdG1pbldpZHRoOiBcIjEyMDBweFwiLFxuXHRcdFx0fSxcblx0XHRcdGhvc3Q6IG9wdGlvbnMuaG9zdCxcblx0XHR9O1xuXG5cdFx0aWYgKG9wdGlvbnMuZGlzYWJsZUJhdGNoQ3JlYXRlKVxuXHRcdFx0ZGVsZXRlIHRoaXMuT3B0aW9ucy5idXR0b25zLmNyZWF0ZUFub3RoZXI7XG5cblx0XHR0aGlzLnVpID0gXy5leHRlbmQodGhpcy51aSwgQmlnTW9kYWwucHJvdG90eXBlLnVpKTtcblx0XHR0aGlzLmV2ZW50cyA9IF8uZXh0ZW5kKHRoaXMuZXZlbnRzLCBCaWdNb2RhbC5wcm90b3R5cGUuZXZlbnRzKTtcblxuXHRcdEJpZ01vZGFsLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyk7XG5cdH0sXG5cblx0cGVybWlzc2lvblRvVXBkYXRlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MucmVzb3VyY2VFZGl0aW5nO1xuXHR9LFxuXG5cdGlzRWRpdGFibGU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1vZGVsLmlzTmV3KCkgfHwgIXRoaXMubW9kZWwuaXNOZXcoKSAmJiByZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmFwaS5yZXNvdXJjZXMucHV0LCByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpKTtcblx0fSxcblxuXHRyZW5kZXJGb3JtOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBjYXRzID0gW1xuXHRcdFx0eyBrZXk6IFwiYXVkaW9cIiwgdmFsdWU6IFwiQXVkaW9cIiwgaW1hZ2U6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9pbWFnZXMvY29udGVudC9hbm5vdGF0aW9uX21wMy5wbmdcIiB9LFxuXHRcdFx0eyBrZXk6IFwiZmxhc2hjYXJkZGVja1wiLCB2YWx1ZTogXCJGbGFzaGNhcmQgRGVja1wiLCBpbWFnZTogc2V0dGluZ3MudXJsUm9vdCArIFwiL2ltYWdlcy9jb250ZW50L2Fubm90YXRpb25fZmxhc2hjYXJkcy5wbmdcIiB9LFxuXHRcdFx0eyBrZXk6IFwiZ29vZ2xlZHJpdmVcIiwgdmFsdWU6IFwiR29vZ2xlIERyaXZlXCIsIGltYWdlOiBzZXR0aW5ncy51cmxSb290ICsgXCIvaW1hZ2VzL2NvbnRlbnQvYW5ub3RhdGlvbl9nb29nbGVkcml2ZS5wbmdcIiB9LFxuXHRcdFx0eyBrZXk6IFwiaW1hZ2VcIiwgdmFsdWU6IFwiSW1hZ2VcIiwgaW1hZ2U6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9pbWFnZXMvY29udGVudC9hbm5vdGF0aW9uX2dyYXBoaWMucG5nXCIgfSxcblx0XHRcdHsga2V5OiBcIm9uZW5vdGVcIiwgdmFsdWU6IFwiT25lIE5vdGVcIiwgaW1hZ2U6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9pbWFnZXMvY29udGVudC9hbm5vdGF0aW9uX29uZW5vdGUucG5nXCIgfSxcblx0XHRcdHsga2V5OiBcInBkZlwiLCB2YWx1ZTogXCJQREZcIiwgaW1hZ2U6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9pbWFnZXMvY29udGVudC9hbm5vdGF0aW9uX3BkZi5wbmdcIiB9LFxuXHRcdFx0eyBrZXk6IFwidGV4dFwiLCB2YWx1ZTogXCJUZXh0XCIsIGltYWdlOiBzZXR0aW5ncy51cmxSb290ICsgXCIvaW1hZ2VzL2NvbnRlbnQvYW5ub3RhdGlvbl90ZXh0LnBuZ1wiIH0sXG5cdFx0XHR7IGtleTogXCJ1cmxcIiwgdmFsdWU6IFwiVVJMXCIsIGltYWdlOiBzZXR0aW5ncy51cmxSb290ICsgXCIvaW1hZ2VzL2NvbnRlbnQvYW5ub3RhdGlvbl91cmwucG5nXCIgfSxcblx0XHRcdHsga2V5OiBcInZpZGVvXCIsIHZhbHVlOiBcIlZpZGVvXCIsIGltYWdlOiBzZXR0aW5ncy51cmxSb290ICsgXCIvaW1hZ2VzL2NvbnRlbnQvYW5ub3RhdGlvbl92aWRlby5wbmdcIiB9LFxuXHRcdF07XG5cblx0XHRpZiAoc2V0dGluZ3Mub2ZmaWNlQ29udGVudCkge1xuXHRcdFx0Y2F0cy5wdXNoKHsga2V5OiBcImV4Y2VsXCIsIHZhbHVlOiBcIk1TIEV4Y2VsXCIsIGltYWdlOiBzZXR0aW5ncy51cmxSb290ICsgXCIvaW1hZ2VzL2NvbnRlbnQvYW5ub3RhdGlvbl9leGNlbC5wbmdcIiB9LFxuXHRcdFx0XHR7IGtleTogXCJwb3dlcnBvaW50XCIsIHZhbHVlOiBcIk1TIFBvd2VyUG9pbnRcIiwgaW1hZ2U6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9pbWFnZXMvY29udGVudC9hbm5vdGF0aW9uX3Bvd2VycG9pbnQucG5nXCIgfSxcblx0XHRcdFx0eyBrZXk6IFwid29yZFwiLCB2YWx1ZTogXCJNUyBXb3JkXCIsIGltYWdlOiBzZXR0aW5ncy51cmxSb290ICsgXCIvaW1hZ2VzL2NvbnRlbnQvYW5ub3RhdGlvbl93b3JkLnBuZ1wiIH0pO1xuXHRcdH1cblxuXHRcdF8uZWFjaChjYXRzLCB4ID0+IHtcblx0XHRcdGlmICh4LmtleSA9PT0gdGhpcy5tb2RlbC5nZXQoXCJjYXRlZ29yeVwiKSlcblx0XHRcdFx0eC5zZWxlY3RlZCA9IHRydWU7XG5cdFx0fSk7XG5cblx0XHRjb25zdCB0eXBlcyA9IG5ldyBTZWxlY3RyYSh7XG5cdFx0XHR3aWR0aDogXCIxMzBweFwiLFxuXHRcdFx0aXRlbXM6IGNhdHMsXG5cdFx0XHRpY29uczogdHJ1ZSxcblx0XHRcdGRkSG9zdDogdGhpcy5PcHRpb25zLmhvc3QsXG5cdFx0XHRwbGFjZWhvbGRlcjogXCJDaG9vc2UuLi5cIixcblx0XHRcdHNlYXJjaDogZmFsc2UsXG5cdFx0fSk7XG5cblx0XHR0eXBlcy5zaG93KHsgZWw6IHRoaXMudWkuY2F0ZWdvcnkgfSk7XG5cblx0XHRjb25zdCBsYW5ndWFnZSA9IG5ldyBTZWxlY3RyYSh7XG5cdFx0XHR3aWR0aDogXCIxMTVweFwiLFxuXHRcdFx0aXRlbXM6IF8ubWFwKHNldHRpbmdzLmxhbmd1YWdlTGlzdCwgeCA9PiAoeyBrZXk6IHgsIHZhbHVlOiB4LCBzZWxlY3RlZDogeCA9PT0gdGhpcy5tb2RlbC5nZXQoXCJsYW5ndWFnZVwiKSB9KSksXG5cdFx0XHRkZEhvc3Q6IHRoaXMuT3B0aW9ucy5ob3N0LFxuXHRcdFx0cGxhY2Vob2xkZXI6IFwiQ2hvb3NlLi4uXCIsXG5cdFx0XHRzZWFyY2g6IGZhbHNlLFxuXHRcdH0pO1xuXG5cdFx0bGFuZ3VhZ2Uuc2hvdyh7IGVsOiB0aGlzLnVpLmxhbmd1YWdlIH0pO1xuXG5cdFx0dGhpcy5zdWJqZWN0U2VsZWN0ID0gbmV3IFNlbGVjdHJhKHtcblx0XHRcdHdpZHRoOiBcIjMzMHB4XCIsXG5cdFx0XHRzZXJ2ZXI6IHtcblx0XHRcdFx0ZmV0Y2g6IGAke3NldHRpbmdzLnVybFJvb3R9L2FwaS8xLjAvZGF0YS9zdWJqZWN0c2AsXG5cdFx0XHRcdGRlbGF5TG9hZDogdHJ1ZSxcblx0XHRcdFx0a2V5OiBcInN1YmplY3RfaWRcIixcblx0XHRcdFx0dmFsdWU6IFwic3ViamVjdFwiLFxuXHRcdFx0XHRkZWZhdWx0OiB7XG5cdFx0XHRcdFx0a2V5OiB0aGlzLm1vZGVsLmdldChcInN1YmplY3RcIiksXG5cdFx0XHRcdFx0dmFsdWU6IHRoaXMubW9kZWwuZ2V0KFwic3ViamVjdF9uYW1lXCIpLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRwYWdlU2l6ZTogMjAsXG5cdFx0XHRcdGluZmluaXRlOiB0cnVlLFxuXHRcdFx0fSxcblx0XHRcdGRkSG9zdDogdGhpcy5PcHRpb25zLmhvc3QsXG5cdFx0XHRwbGFjZWhvbGRlcjogXCJObyBzdWJqZWN0IHNlbGVjdGVkXCIsXG5cdFx0fSk7XG5cblx0XHR0aGlzLnN1YmplY3RTZWxlY3Quc2hvdyh7IGVsOiB0aGlzLnVpLnN1YmplY3QgfSk7XG5cblx0XHRjb25zdCBncmFkZXMgPSBuZXcgU2VsZWN0cmEoe1xuXHRcdFx0d2lkdGg6IFwiMjAwcHhcIixcblx0XHRcdGl0ZW1zOiBfLnJlZHVjZShzZXR0aW5ncy5ncmFkZUxpc3QsIChzdW0sIG51bSwga2V5KSA9PiB7XG5cdFx0XHRcdHN1bVtrZXldID0gXy5yZWR1Y2UobnVtLnNvcnQoKGEsIGIpID0+IChcImxleGljYWxcIiBpbiBhID8gYS5sZXhpY2FsIDogYS5uYW1lKS50b1VwcGVyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoKFwibGV4aWNhbFwiIGluIGIgPyBiLmxleGljYWwgOiBiLm5hbWUpLnRvVXBwZXJDYXNlKCkpKSxcblx0XHRcdFx0XHQoc3VtMSwgbnVtMSkgPT4ge1xuXHRcdFx0XHRcdFx0c3VtMS5wdXNoKHsga2V5OiBudW0xLnZhbHVlLCB2YWx1ZTogbnVtMS5uYW1lLCBzZWxlY3RlZDogXy5pbmNsdWRlcyhfLmZsYXR0ZW4oW3RoaXMubW9kZWwuZ2V0KFwic3R1ZHlZZWFyXCIpXSksIG51bTEudmFsdWUpIH0pO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHN1bTE7XG5cdFx0XHRcdFx0fSwgW10pO1xuXHRcdFx0XHRyZXR1cm4gc3VtO1xuXHRcdFx0fSwge30pLFxuXHRcdFx0c2hvd0NhdGVnb3JpZXM6IHRydWUsXG5cdFx0XHRwbGFjZWhvbGRlcjogXCJDaG9vc2UuLi5cIixcblx0XHRcdGRkSG9zdDogdGhpcy5PcHRpb25zLmhvc3QsXG5cdFx0fSk7XG5cblx0XHRncmFkZXMuc2hvdyh7IGVsOiB0aGlzLnVpLnN0dWR5WWVhciB9KTtcblxuXHRcdGlmICghdGhpcy5tb2RlbC5pc05ldygpIHx8IHRoaXMubW9kZWwuaGFzKFwiY2F0ZWdvcnlcIikgJiYgdGhpcy5sb2NrQ2F0ZWdvcnkpXG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHsgdGhpcy5vbkNoYW5nZUNhdGVnb3J5KCk7IH0sIDEwKTtcblx0fSxcblxuXHRvbkZsYXNoQ2FyZFVwbG9hZENoYW5nZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLnVpLnNob3dGbGFzaENhcmRVcGxvYWQucHJvcChcImNoZWNrZWRcIikpXG5cdFx0XHR0aGlzLnNob3dGbGFzaENhcmRVcGxvYWQoKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLmhpZGVGbGFzaENhcmRVcGxvYWQoKTtcblx0fSxcblxuXHRoaWRlRmxhc2hDYXJkVXBsb2FkOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmZsYXNoQ2FyZERlY2tGaWxlQ2hvb3Nlci5hZGRDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0c2hvd0ZsYXNoQ2FyZFVwbG9hZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5mbGFzaENhcmREZWNrRmlsZUNob29zZXIucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdG9uVGl0bGVFZGl0ZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudGl0bGVFZGl0ZWQgPSB0cnVlO1xuXHR9LFxuXG5cdG9uRmlsZVNlbGVjdGVkOiBmdW5jdGlvbihmaWxlKSB7XG5cdFx0dGhpcy5zZWxlY3RlZEZpbGUgPSBmaWxlO1xuXG5cdFx0aWYgKCghdGhpcy50aXRsZUVkaXRlZCAmJiB0aGlzLm1vZGVsLmlzTmV3KCkpIHx8ICh0aGlzLnVpLnRpdGxlLnZhbCgpID09PSBcIlwiICYmICghdGhpcy5tb2RlbC5oYXMoXCJ0aXRsZVwiKSB8fCB0aGlzLm1vZGVsLmdldChcInRpdGxlXCIpID09PSBcIlwiKSkpXG5cdFx0XHR0aGlzLnVpLnRpdGxlLnZhbChmaWxlLm5hbWUucmVwbGFjZSgvXFwuW14vLl0rJC8sIFwiXCIpKTtcblx0fSxcblxuXHRvbkNoYW5nZUNhdGVnb3J5OiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5jdXJyZW50UmVzb3VyY2VGb3JtKSB7XG5cdFx0XHR0aGlzLmN1cnJlbnRSZXNvdXJjZUZvcm0uYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMudWkud2VsY29tZS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLnVpLmZvcm0ucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLmZpbGVDaG9vc2VyKSB7XG5cdFx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcodGhpcy5maWxlQ2hvb3Nlcik7XG5cdFx0XHR0aGlzLmZpbGVDaG9vc2VyLmRlc3Ryb3koKTtcblx0XHRcdHRoaXMuc2VsZWN0ZWRGaWxlID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHN3aXRjaCAodGhpcy51aS5jYXRlZ29yeS52YWwoKSkge1xuXHRcdFx0Y2FzZSBcImF1ZGlvXCI6XG5cdFx0XHRcdHRoaXMuZmlsZUNob29zZXIgPSBuZXcgRHJhZ0Ryb3BGaWxlQ2hvb3Nlcih7XG5cdFx0XHRcdFx0YWNjZXB0ZWRGaWxlVHlwZXM6IFtcIi5tcDNcIiwgXCJhdWRpby9tcGVnXCIsIFwiYXVkaW8vbXAzXCJdLFxuXHRcdFx0XHRcdGV4aXN0aW5nRmlsZTogdGhpcy5tb2RlbC5pc05ldygpID8gdW5kZWZpbmVkIDogdGhpcy5tb2RlbCxcblx0XHRcdFx0XHRoZWlnaHQ6IDIxMCxcblx0XHRcdFx0XHRsb2NrZWQ6ICEodGhpcy5wZXJtaXNzaW9uVG9VcGRhdGUoKSAmJiB0aGlzLmlzRWRpdGFibGUoKSksXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZmlsZUNob29zZXIsIFwic2VsZWN0ZWRcIiwgdGhpcy5vbkZpbGVTZWxlY3RlZC5iaW5kKHRoaXMpKTtcblx0XHRcdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiYXVkaW9GaWxlQ2hvb3NlclwiLCB0aGlzLmZpbGVDaG9vc2VyKTtcblxuXHRcdFx0XHR0aGlzLmN1cnJlbnRSZXNvdXJjZUZvcm0gPSB0aGlzLnVpLmF1ZGlvRm9ybTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJleGNlbFwiOlxuXHRcdFx0XHR0aGlzLmZpbGVDaG9vc2VyID0gbmV3IERyYWdEcm9wRmlsZUNob29zZXIoe1xuXHRcdFx0XHRcdGFjY2VwdGVkRmlsZVR5cGVzOiBbXCIueGxzXCIsIFwiLnhsc3hcIiwgXCJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWxcIiwgXCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldFwiXSxcblx0XHRcdFx0XHRleGlzdGluZ0ZpbGU6IHRoaXMubW9kZWwuaXNOZXcoKSA/IHVuZGVmaW5lZCA6IHRoaXMubW9kZWwsXG5cdFx0XHRcdFx0aGVpZ2h0OiAyMTAsXG5cdFx0XHRcdFx0bG9ja2VkOiAhKHRoaXMucGVybWlzc2lvblRvVXBkYXRlKCkgJiYgdGhpcy5pc0VkaXRhYmxlKCkpLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmZpbGVDaG9vc2VyLCBcInNlbGVjdGVkXCIsIHRoaXMub25GaWxlU2VsZWN0ZWQuYmluZCh0aGlzKSk7XG5cdFx0XHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcIm9mZmljZUZpbGVDaG9vc2VyXCIsIHRoaXMuZmlsZUNob29zZXIpO1xuXG5cdFx0XHRcdHRoaXMuY3VycmVudFJlc291cmNlRm9ybSA9IHRoaXMudWkub2ZmaWNlRm9ybTtcblx0XHRcdFx0dGhpcy51aS5vZmZpY2VGaWxlTGFiZWwudGV4dChcIk1pY3Jvc29mdCBFeGNlbCBmaWxlXCIpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcImZsYXNoY2FyZGRlY2tcIjpcblx0XHRcdFx0aWYgKHRoaXMubW9kZWwuaXNOZXcoKSkge1xuXHRcdFx0XHRcdHRoaXMuZmlsZUNob29zZXIgPSBuZXcgRHJhZ0Ryb3BGaWxlQ2hvb3Nlcih7XG5cdFx0XHRcdFx0XHRhY2NlcHRlZEZpbGVUeXBlczogW1wiLmNzdlwiLCBcInRleHQvY3N2XCIsIFwidGV4dC9wbGFpblwiXSxcblx0XHRcdFx0XHRcdGhlaWdodDogMjEwLFxuXHRcdFx0XHRcdFx0bG9ja2VkOiAhKHRoaXMucGVybWlzc2lvblRvVXBkYXRlKCkgJiYgdGhpcy5pc0VkaXRhYmxlKCkpLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHRoaXMubGlzdGVuVG8odGhpcy5maWxlQ2hvb3NlciwgXCJzZWxlY3RlZFwiLCB0aGlzLm9uRmlsZVNlbGVjdGVkLmJpbmQodGhpcykpO1xuXHRcdFx0XHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImZsYXNoQ2FyZERlY2tGaWxlQ2hvb3NlclwiLCB0aGlzLmZpbGVDaG9vc2VyKTtcblxuXHRcdFx0XHRcdHRoaXMudWkuZmxhc2hDYXJkVXBsb2FkLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHR0aGlzLnVpLmZsYXNoQ2FyZFVwbG9hZC5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLmN1cnJlbnRSZXNvdXJjZUZvcm0gPSB0aGlzLnVpLmZsYXNoQ2FyZERlY2tGb3JtO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcImdvb2dsZWRyaXZlXCI6XG5cdFx0XHRcdHRoaXMuY3VycmVudFJlc291cmNlRm9ybSA9IHRoaXMudWkudXJsRm9ybTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJpbWFnZVwiOlxuXHRcdFx0XHR0aGlzLmZpbGVDaG9vc2VyID0gbmV3IERyYWdEcm9wRmlsZUNob29zZXIoe1xuXHRcdFx0XHRcdGFjY2VwdGVkRmlsZVR5cGVzOiBbXCIuanBnXCIsIFwiLmpwZWdcIiwgXCIucG5nXCIsIFwiLmdpZlwiLCBcImltYWdlL2dpZlwiLCBcImltYWdlL2pwZWdcIiwgXCJpbWFnZS9wbmdcIiwgXCJpbWFnZS9naWZcIl0sXG5cdFx0XHRcdFx0ZXhpc3RpbmdGaWxlOiB0aGlzLm1vZGVsLmlzTmV3KCkgPyB1bmRlZmluZWQgOiB0aGlzLm1vZGVsLFxuXHRcdFx0XHRcdGhlaWdodDogMjEwLFxuXHRcdFx0XHRcdGxvY2tlZDogISh0aGlzLnBlcm1pc3Npb25Ub1VwZGF0ZSgpICYmIHRoaXMuaXNFZGl0YWJsZSgpKSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHRoaXMubGlzdGVuVG8odGhpcy5maWxlQ2hvb3NlciwgXCJzZWxlY3RlZFwiLCB0aGlzLm9uRmlsZVNlbGVjdGVkLmJpbmQodGhpcykpO1xuXHRcdFx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJpbWFnZUZpbGVDaG9vc2VyXCIsIHRoaXMuZmlsZUNob29zZXIpO1xuXG5cdFx0XHRcdHRoaXMuY3VycmVudFJlc291cmNlRm9ybSA9IHRoaXMudWkuaW1hZ2VGb3JtO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcIm9uZW5vdGVcIjpcblx0XHRcdFx0dGhpcy5jdXJyZW50UmVzb3VyY2VGb3JtID0gdGhpcy51aS51cmxGb3JtO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcInBkZlwiOlxuXHRcdFx0XHR0aGlzLmZpbGVDaG9vc2VyID0gbmV3IERyYWdEcm9wRmlsZUNob29zZXIoe1xuXHRcdFx0XHRcdGFjY2VwdGVkRmlsZVR5cGVzOiBbXCIucGRmXCIsIFwiYXBwbGljYXRpb24vcGRmXCJdLFxuXHRcdFx0XHRcdGV4aXN0aW5nRmlsZTogdGhpcy5tb2RlbC5pc05ldygpID8gdW5kZWZpbmVkIDogdGhpcy5tb2RlbCxcblx0XHRcdFx0XHRoZWlnaHQ6IDIxMCxcblx0XHRcdFx0XHRsb2NrZWQ6ICEodGhpcy5wZXJtaXNzaW9uVG9VcGRhdGUoKSAmJiB0aGlzLmlzRWRpdGFibGUoKSksXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZmlsZUNob29zZXIsIFwic2VsZWN0ZWRcIiwgdGhpcy5vbkZpbGVTZWxlY3RlZC5iaW5kKHRoaXMpKTtcblx0XHRcdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwicGRmRmlsZUNob29zZXJcIiwgdGhpcy5maWxlQ2hvb3Nlcik7XG5cblx0XHRcdFx0dGhpcy5jdXJyZW50UmVzb3VyY2VGb3JtID0gdGhpcy51aS5wZGZGb3JtO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcInBvd2VycG9pbnRcIjpcblx0XHRcdFx0dGhpcy5maWxlQ2hvb3NlciA9IG5ldyBEcmFnRHJvcEZpbGVDaG9vc2VyKHtcblx0XHRcdFx0XHRhY2NlcHRlZEZpbGVUeXBlczogW1wiLnBwdFwiLCBcIi5wcHR4XCIsIFwiLnBwc1wiLCBcIi5wcHN4XCIsXG5cdFx0XHRcdFx0XHRcImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50XCIsIFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnByZXNlbnRhdGlvbm1sLnByZXNlbnRhdGlvblwiLFxuXHRcdFx0XHRcdFx0XCJhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludFwiLCBcImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5zbGlkZXNob3dcIl0sXG5cdFx0XHRcdFx0ZXhpc3RpbmdGaWxlOiB0aGlzLm1vZGVsLmlzTmV3KCkgPyB1bmRlZmluZWQgOiB0aGlzLm1vZGVsLFxuXHRcdFx0XHRcdGhlaWdodDogMjEwLFxuXHRcdFx0XHRcdGxvY2tlZDogISh0aGlzLnBlcm1pc3Npb25Ub1VwZGF0ZSgpICYmIHRoaXMuaXNFZGl0YWJsZSgpKSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHRoaXMubGlzdGVuVG8odGhpcy5maWxlQ2hvb3NlciwgXCJzZWxlY3RlZFwiLCB0aGlzLm9uRmlsZVNlbGVjdGVkLmJpbmQodGhpcykpO1xuXHRcdFx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJvZmZpY2VGaWxlQ2hvb3NlclwiLCB0aGlzLmZpbGVDaG9vc2VyKTtcblxuXHRcdFx0XHR0aGlzLmN1cnJlbnRSZXNvdXJjZUZvcm0gPSB0aGlzLnVpLm9mZmljZUZvcm07XG5cdFx0XHRcdHRoaXMudWkub2ZmaWNlRmlsZUxhYmVsLnRleHQoXCJNaWNyb3NvZnQgUG93ZXJQb2ludCBmaWxlXCIpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcInRleHRcIjpcblx0XHRcdFx0dGhpcy5jdXJyZW50UmVzb3VyY2VGb3JtID0gdGhpcy51aS50ZXh0Rm9ybTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJ1cmxcIjpcblx0XHRcdFx0dGhpcy5jdXJyZW50UmVzb3VyY2VGb3JtID0gdGhpcy51aS51cmxGb3JtO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcInZpZGVvXCI6XG5cdFx0XHRcdHRoaXMuZmlsZUNob29zZXIgPSBuZXcgRHJhZ0Ryb3BGaWxlQ2hvb3Nlcih7XG5cdFx0XHRcdFx0YWNjZXB0ZWRGaWxlVHlwZXM6IFtcIi5tcDRcIiwgXCJ2aWRlby9tcDRcIl0sXG5cdFx0XHRcdFx0ZXhpc3RpbmdGaWxlOiB0aGlzLm1vZGVsLmlzTmV3KCkgPyB1bmRlZmluZWQgOiB0aGlzLm1vZGVsLFxuXHRcdFx0XHRcdGhlaWdodDogMjEwLFxuXHRcdFx0XHRcdGxvY2tlZDogISh0aGlzLnBlcm1pc3Npb25Ub1VwZGF0ZSgpICYmIHRoaXMuaXNFZGl0YWJsZSgpKSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHRoaXMubGlzdGVuVG8odGhpcy5maWxlQ2hvb3NlciwgXCJzZWxlY3RlZFwiLCB0aGlzLm9uRmlsZVNlbGVjdGVkLmJpbmQodGhpcykpO1xuXHRcdFx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJ2aWRlb0ZpbGVDaG9vc2VyXCIsIHRoaXMuZmlsZUNob29zZXIpO1xuXG5cdFx0XHRcdHRoaXMuY3VycmVudFJlc291cmNlRm9ybSA9IHRoaXMudWkudmlkZW9Gb3JtO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcIndvcmRcIjpcblx0XHRcdFx0dGhpcy5maWxlQ2hvb3NlciA9IG5ldyBEcmFnRHJvcEZpbGVDaG9vc2VyKHtcblx0XHRcdFx0XHRhY2NlcHRlZEZpbGVUeXBlczogW1wiLmRvY1wiLCBcIi5kb2N4XCIsIFwiYXBwbGljYXRpb24vbXN3b3JkXCIsIFwiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZG9jdW1lbnRcIl0sXG5cdFx0XHRcdFx0ZXhpc3RpbmdGaWxlOiB0aGlzLm1vZGVsLmlzTmV3KCkgPyB1bmRlZmluZWQgOiB0aGlzLm1vZGVsLFxuXHRcdFx0XHRcdGhlaWdodDogMjEwLFxuXHRcdFx0XHRcdGxvY2tlZDogISh0aGlzLnBlcm1pc3Npb25Ub1VwZGF0ZSgpICYmIHRoaXMuaXNFZGl0YWJsZSgpKSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHRoaXMubGlzdGVuVG8odGhpcy5maWxlQ2hvb3NlciwgXCJzZWxlY3RlZFwiLCB0aGlzLm9uRmlsZVNlbGVjdGVkLmJpbmQodGhpcykpO1xuXHRcdFx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJvZmZpY2VGaWxlQ2hvb3NlclwiLCB0aGlzLmZpbGVDaG9vc2VyKTtcblxuXHRcdFx0XHR0aGlzLmN1cnJlbnRSZXNvdXJjZUZvcm0gPSB0aGlzLnVpLm9mZmljZUZvcm07XG5cdFx0XHRcdHRoaXMudWkub2ZmaWNlRmlsZUxhYmVsLnRleHQoXCJNaWNyb3NvZnQgV29yZCBmaWxlXCIpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhpcy51aS53ZWxjb21lLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRcdFx0dGhpcy51aS5tYWlucm93LmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuY3VycmVudFJlc291cmNlRm9ybS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5tYWlucm93LnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRhc3NlbWJsZURhdGE6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGRhdGEgPSB7fTtcblxuXHRcdGRhdGEuYXR0cmlidXRlcyA9IHtcblx0XHRcdGNhdGVnb3J5OiB0aGlzLnVpLmNhdGVnb3J5LnZhbCgpLFxuXHRcdFx0bGFuZ3VhZ2U6IHRoaXMudWkubGFuZ3VhZ2UudmFsKCksXG5cdFx0XHRzdWJqZWN0OiBwYXJzZUludCh0aGlzLnVpLnN1YmplY3QudmFsKCksIDEwKSxcblx0XHRcdHN1YmplY3RfbmFtZTogdGhpcy5zdWJqZWN0U2VsZWN0LmdldFNlbGVjdGVkKCkuc3ViamVjdCxcblx0XHRcdHN0dWR5WWVhcjogdGhpcy51aS5zdHVkeVllYXIudmFsKCksXG5cdFx0XHR0aXRsZTogdGhpcy51aS50aXRsZS52YWwoKSxcblx0XHRcdGRlc2NyaXB0aW9uOiB0aGlzLnVpLmRlc2NyaXB0aW9uLnZhbCgpLFxuXHRcdH07XG5cblx0XHRkYXRhLmZpbGVzID0ge307XG5cblx0XHRzd2l0Y2ggKHRoaXMudWkuY2F0ZWdvcnkudmFsKCkpIHtcblx0XHRcdGNhc2UgXCJhdWRpb1wiOlxuXHRcdFx0Y2FzZSBcImV4Y2VsXCI6XG5cdFx0XHRjYXNlIFwicG93ZXJwb2ludFwiOlxuXHRcdFx0Y2FzZSBcIndvcmRcIjpcblx0XHRcdGNhc2UgXCJwZGZcIjpcblx0XHRcdGNhc2UgXCJ2aWRlb1wiOlxuXHRcdFx0Y2FzZSBcImltYWdlXCI6XG5cdFx0XHRcdGRhdGEuZmlsZXMuZmlsZSA9IHRoaXMuc2VsZWN0ZWRGaWxlO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcImZsYXNoY2FyZGRlY2tcIjpcblx0XHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRGaWxlKVxuXHRcdFx0XHRcdGRhdGEuZmlsZXMuZmlsZSA9IHRoaXMuc2VsZWN0ZWRGaWxlO1xuXG5cdFx0XHRcdGlmICghdGhpcy5tb2RlbC5oYXMoXCJmbGFzaENhcmRzXCIpIHx8IHRoaXMubW9kZWwuZ2V0KFwiZmxhc2hDYXJkc1wiKS5sZW5ndGggPT09IDApXG5cdFx0XHRcdFx0ZGF0YS5hdHRyaWJ1dGVzLmZsYXNoQ2FyZHMgPSBbXTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJnb29nbGVkcml2ZVwiOlxuXHRcdFx0XHRkYXRhLmF0dHJpYnV0ZXMuZ29vZ2xlZHJpdmUgPSB0aGlzLnVpLnVybC52YWwoKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJvbmVub3RlXCI6XG5cdFx0XHRcdGRhdGEuYXR0cmlidXRlcy5vbmVub3RlID0gdGhpcy51aS51cmwudmFsKCk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwidGV4dFwiOlxuXHRcdFx0XHRkYXRhLmF0dHJpYnV0ZXMudGV4dCA9IHRoaXMudWkudGV4dC52YWwoKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJ1cmxcIjpcblx0XHRcdFx0ZGF0YS5hdHRyaWJ1dGVzLnVybCA9IHRoaXMudWkudXJsLnZhbCgpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0Ly8gTm8gZGF0YSB0byBzZXRcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cdH0sXG5cblx0b25SZXNvdXJjZUNyZWF0ZWQ6IGZ1bmN0aW9uKHJlc3VsdCkge1xuXHRcdEFwcC50cmlnZ2VyKEFwcC5FdmVudHMuUmVzb3VyY2VDcmVhdGVkLCByZXN1bHQubW9kZWwpO1xuXHRcdHRoaXMuY3VycmVudFJlc291cmNlRm9ybSA9IG51bGw7XG5cdH0sXG5cblx0b25SZXNvdXJjZVVwZGF0ZWQ6IGZ1bmN0aW9uKHJlc3VsdCkge1xuXHRcdHJlc3VsdC5tb2RlbC5zZXQoe1xuXHRcdFx0dXBkYXRlZDogbW9tZW50KCkudW5peCgpLFxuXHRcdH0pO1xuXG5cdFx0QXBwLnRyaWdnZXIoQXBwLkV2ZW50cy5SZXNvdXJjZVVwZGF0ZWQsIHJlc3VsdC5tb2RlbCk7XG5cdH0sXG5cblx0b25DcmVhdGVBbm90aGVyOiBmdW5jdGlvbihyZXN1bHQpIHtcblx0XHR0aGlzLm9uUmVzb3VyY2VDcmVhdGVkKHJlc3VsdCk7XG5cblx0XHRyZXR1cm4gbmV3IFJlc291cmNlKHtcblx0XHRcdGxhbmd1YWdlOiByZXN1bHQubW9kZWwuZ2V0KFwibGFuZ3VhZ2VcIiksXG5cdFx0XHRzdHVkeVllYXI6IHJlc3VsdC5tb2RlbC5nZXQoXCJzdHVkeVllYXJcIiksXG5cdFx0XHRzdWJqZWN0OiByZXN1bHQubW9kZWwuZ2V0KFwic3ViamVjdFwiKSxcblx0XHRcdHN1YmplY3RfbmFtZTogcmVzdWx0Lm1vZGVsLmdldChcInN1YmplY3RfbmFtZVwiKSxcblx0XHR9KTtcblx0fSxcbn0pOyJdfQ==",
    "\"use strict\";\n\nvar _regenerator = require(\"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\nvar _ = require(\"lodash\");\nvar $ = require(\"jquery\");\nvar Backbone = require(\"backbone\");\nvar VirtualCollection = require(\"backbone.virtual-collection\");\n\nvar InfiniteCollection = require(\"./infiniteCollection\");\n\nvar Events = {\n\tCommands: {\n\t\tServerFetch: \"Events.Commands.ServerFetch\",\n\t\tClose: \"Events.Commands.Close\"\n\t},\n\tRequests: {\n\t\tRealWidth: \"Events.Requests.RealWidth\",\n\t\tValue: \"Events.Requests.Value\",\n\t\tDisabled: \"Events.Requests.Disabled\",\n\t\tCurrentSelection: \"Events.Requests.CurrentSelection\",\n\t\tClickability: \"Events.Requests.Clickability\"\n\t},\n\tValueChanged: \"Events.ValueChanged\"\n};\n\nvar ItemModel = Backbone.Model.extend({\n\tdefaults: {\n\t\teligible: true, // is the item eligible for selection under the current sub-selection\n\t\tlocked: false // if an item is locked, it cannot be removed from the list\n\t\t/*\tvalue: \"\",\t\t\t\t// the text that will get shown\n  \tcategories: [],\t\t\t// is this item associated with any categories?\n  \tselected: false,\t\t// is this item selected?\n  \timage: null,\t\t\t// does this item have a prefixing image?\n  \ticon: null,\t\t\t\t// does this item have a prefixing FA icon?\n  \ticonColour: \"red\",\t\t// what colour should the icon be, if present?\n  \tdesc: null,\t\t\t\t// some text that displays under the item, optionally\n  */ },\n\n\tidAttribute: \"key\"\n});\n\nvar ClientCollection = Backbone.PageableCollection.extend({\n\tmodel: ItemModel,\n\n\tmode: \"client\",\n\n\turl: function url() {\n\t\treturn this._url;\n\t},\n\n\tsetSearchTerms: _.noop\n});\n\n//----------------------------------------------------------------//\n\n\nvar BaseModel = Backbone.Model.extend({\n\tdefaults: {\n\t\tclickable: true, // is the element clickable?\n\n\t\tdisabled: false, // is this input disabled?\n\t\tmultiple: false, // allow multiple selections?\n\t\tmultiMax: 999999, // if in multi mode, how many selections max?\n\t\tsearch: true, // can users search?\n\t\tcheckboxes: false, // should items show checkboxes instead of changing colour?\n\t\twidth: null, // explicit width\n\t\tdeselection: true, // can users deselect values?\n\t\tsingleDeselect: false, // can the selection value of single dropdowns be wiped?\n\t\tflat: false, // render with a flat style to resemble inline text?\n\t\tmaxItems: 1000, // maximum number of items to show in the dropdown\n\t\ticons: false, // should icons be displayed for items?\n\t\tddHost: \"#modals\", // the DOM element that the dropdown will be attached to\n\t\tddHeight: 400, // height of dropdown box in pixels\n\t\tddWidth: null, // override width of the dropdown\n\t\tsort: true, // should the display sort alphabetically? Can also provide a function.\n\t\tcloseOnChoose: false, // close the dropdown when the selection is changed\n\t\titems: null, // the items to show by default\n\t\tsilent: true, // send an initial event for default items or not?\n\t\tshowCategories: false, // show categories if present?\n\t\tsortCategories: true, // use the alphabetical order of categories (for an array) or define a sort function\n\t\tplaceholder: false, /*\ta string or a function to use to determine the value to show as a placeholder if\n                      no values are selected. Options object is passed to the function. */\n\t\tlockedList: false, // if the list is locked, you can only add and remove items from the dropdown\n\t\tpreviewSelection: false, // show all selected items at the top of the box\n\t\teligibility: false, /* \tmust be a function. Will be given an array of the current selections, and\n                      one unselected item, and must return a boolean indicating if that item is\n                      selectable */\n\t\tautoOpenDropdown: false, // should the dropdown automatically open after render?\n\t\tvirtualBase: false /* make the base element virtual? It will not show in the DOM, and the dropdown\n                     will position itself based on the attachment element rather than the base.\n                     Clicks on the attachment element */\n\t\t/*\n  server: {\t\t\t\t\t// will we be doing fetches from the server?\n  \tfetch: null,\t\t\t// will load the data with XHR from this URL. Required.\n  \tparams: null,\t\t\t// an object, or function that is expected to return an object, of properties which will be included in the querystring of the fetch.\n  \tdelayLoad: true,\t\t// don't do an initial fetch from the server, only run on initial open\n  \tmap: null,\t\t\t\t// a mapping function to transform the data from the server before use\n  \tkey: null,\t\t\t\t// the name of the key field in the server data\n  \tvalue: null,\t\t\t// the name of the value field in the server data\n  \tdefault: {\t\t\t\t// show a value (or array of values) as preselected by default\n  \t\tkey: null,\t\t\t// key of the single default\n  \t\tvalue: null,\t\t// value of the single default\n  \t\tsilent: false,\t\t// don't send an event notifying about the new value(s)\n  \t\titems: [],\t\t\t// if you need to pass multiple defaults. Objects of the form { key: ..., value: ... }. Will use any key/value settings defined one level up.\n  \t\tfetch: null,\t\t// will load the defaults from this URL. Can also be an object, which will then be passed to jQuery's Ajax call verbatim.\n  \t\tparams: null,\t\t// an object, or function that is expected to return an object, of properties which will be included in the querystring of the default-fetch.\n  \t},\n  },\n  paging: {\t\t\t\t\t// should the results be paged?\n  \tpageSize: null, \t\t// how many items per page. Required.\n  \tinfinite: true,\t\t\t// should the system auto-show new items as you scroll past the end\n  },\n  allowCreation: {\t\t\t// allow unmatched search items to be added as dynamic new items\n  \tmode: \"nomatch\",\t\t// \"nomatch\": prompt to make an item if searching and can't find a match\n  \t\t\t\t\t\t\t// \"always\": add a fixed item to the bottom that can be clicked on to create an item\n  \tgetKey: null,\t\t\t// a function to calculate the key for the new item. Is given the text as input. Defaults to the text if not specified.\n  \tgetValue: null,\t\t\t// a function to calculate the value for the new item. Is given the text as input. Defaults to the text if not specified.\n  \tcallback: null,\t\t\t// if specified, will be invoked and must return a { key, value } object (plus additional properties)\n  \ttext: null,\t\t\t\t// custom text to display\n  \tserver: {\t\t\t\t// save the new item to the server\n  \t\tsaveFirst: true,\t// require the item to be successfully saved to the server before it is added to the dropdown.\n  \t\t\t\t\t\t\t// Else, the item will be immediately shown, and the save will run concurrently. If it fails, the item will be removed.\n  \t\tsave: null,\t\t\t// will save the data with XHR to this url. Can also be an object, which will then be passed to jQuery's Ajax call verbatim.\n  \t},\n  \thideOnClick: false,\t\t// hide the Selectra instance until we get an answer?\n  },\n  interactives: {\t\t\t\t// additional fixed options shown at the bottom for people to click on and do things\n  \tkey: {\t\t\t\t\t// each interactive needs a key identifier. This will be fired as an event \"interactive:key\" when clicked.\n  \t\ttext: null,\t\t\t// the text to show for the interactive\n  \t\tcallback: null,\t\t// the callback to invoke when the item is clicked. Optional.\n  \t},\n  }\n  */\n\t},\n\n\tvalidate: function validate(attrs) {\n\t\tif (\"server\" in attrs && !attrs.server.fetch) return \"You did not specify a fetch URL for server mode\";\n\n\t\tif (\"paging\" in attrs && !attrs.paging.pageSize) return \"You did not specify a page size for paging mode\";\n\t}\n});\n\nvar selectraFields = [\"items\", \"el\"];\nvar viewFields = [];\n\nvar resolveObject = function resolveObject(obj) {\n\tvar _this = this;\n\n\t_.each(obj, function () {\n\t\tvar _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee(value, key) {\n\t\t\treturn _regenerator2.default.wrap(function _callee$(_context) {\n\t\t\t\twhile (1) {\n\t\t\t\t\tswitch (_context.prev = _context.next) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tif (!_.isPlainObject(value)) {\n\t\t\t\t\t\t\t\t_context.next = 4;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tobj[key] = resolveObject(value);\n\t\t\t\t\t\t\t_context.next = 13;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\tif (!_.isFunction(value)) {\n\t\t\t\t\t\t\t\t_context.next = 10;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_context.next = 7;\n\t\t\t\t\t\t\treturn value();\n\n\t\t\t\t\t\tcase 7:\n\t\t\t\t\t\t\tobj[key] = _context.sent;\n\t\t\t\t\t\t\t_context.next = 13;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 10:\n\t\t\t\t\t\t\t_context.next = 12;\n\t\t\t\t\t\t\treturn value;\n\n\t\t\t\t\t\tcase 12:\n\t\t\t\t\t\t\tobj[key] = _context.sent;\n\n\t\t\t\t\t\tcase 13:\n\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\treturn _context.stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, _callee, _this);\n\t\t}));\n\n\t\treturn function (_x, _x2) {\n\t\t\treturn _ref.apply(this, arguments);\n\t\t};\n\t}());\n};\n\n//-------------------------------------------------------------------------//\n\n\nvar passThroughFields = [\"busChannel\", \"key\", \"value\", \"icons\", \"multiple\", \"checkboxes\", \"deselection\", \"lockedList\", \"ddWidth\", \"singleDeselect\", \"locked\", \"allowCreation\", \"interactives\"];\n\nvar DropdownItem = Backbone.Marionette.View.extend({\n\tclassName: function className() {\n\t\tvar classes = [\"dropdown-item\"];\n\n\t\tif (!this.model.get(\"eligible\")) classes.push(\"ineligible\");\n\n\t\treturn classes.join(\" \");\n\t},\n\n\ttemplate: require(\"./templates/selectra.nunj\").dropdownItem,\n\n\tui: {\n\t\tdescription: \".description\",\n\t\tvalue: \".value\",\n\t\tcheckbox: \"input[type='checkbox']\",\n\t\timage: \"span.image\"\n\t},\n\n\tevents: {\n\t\tclick: \"onClick\",\n\t\t\"click @ui.checkbox\": \"onCbClick\"\n\t},\n\n\tmodelEvents: {\n\t\t\"change:hidden\": \"toggleVisibility\",\n\t\tscrollIntoView: \"onScrollTo\",\n\t\t\"change:selected\": \"onSelectionChange\",\n\t\t\"change:eligible\": \"onEligibilityChange\",\n\t\t\"trigger:click\": \"onClick\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this2 = this;\n\n\t\treturn {\n\t\t\tkey: function key() {\n\t\t\t\treturn _this2.model.id;\n\t\t\t},\n\t\t\tvalue: function value() {\n\t\t\t\treturn _this2.model.get(_this2._options.get(\"value\"));\n\t\t\t},\n\t\t\ticons: function icons() {\n\t\t\t\treturn _this2._options.get(\"icons\");\n\t\t\t},\n\t\t\tcheckboxes: function checkboxes() {\n\t\t\t\treturn _this2._options.get(\"checkboxes\");\n\t\t\t},\n\t\t\tdeselection: function deselection() {\n\t\t\t\treturn _this2._options.get(\"deselection\") && !_this2.model.get(\"locked\");\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis._options = new Backbone.Model(options);\n\t},\n\n\tonCbClick: function onCbClick(evt) {\n\t\tevt.stopPropagation();\n\n\t\tthis.model.set({ cbClick: true });\n\n\t\tthis.onClick();\n\t},\n\n\tonClick: function onClick(evt) {\n\t\tif (evt) {\n\t\t\tevt.stopPropagation();\n\t\t\tevt.preventDefault();\n\t\t}\n\n\t\tif (!this.model.get(\"eligible\") || this.model.get(\"locked\")) return;\n\n\t\tvar bus = Backbone.Radio.channel(this._options.get(\"busChannel\"));\n\t\tvar clickable = bus.request(Events.Requests.Clickability);\n\n\t\tif (this._options.get(\"multiple\")) {\n\t\t\tif (!clickable && !this.model.get(\"selected\")) return;\n\n\t\t\tif (this.model.get(\"selected\") && !this._options.get(\"deselection\")) return;\n\t\t} else if (this.model.get(\"selected\")) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.model.set({ selected: !this.model.get(\"selected\") });\n\t},\n\n\tonSelectionChange: function onSelectionChange() {\n\t\tif (this._options.get(\"checkboxes\")) {\n\t\t\tif (this.model.get(\"cbClick\")) return this.model.unset(\"cbClick\");\n\n\t\t\tthis.ui.checkbox.prop(\"checked\", this.model.get(\"selected\"));\n\t\t} else {\n\t\t\tvar c = this._options.get(\"multiple\") ? \"selected-multi\" : \"selected\";\n\n\t\t\tif (this.model.get(\"selected\")) this.$el.addClass(c);else this.$el.removeClass(c);\n\t\t}\n\t},\n\n\tonRender: function onRender() {\n\t\t// Set an explicit width to allow ellipses to work\n\t\tvar bus = Backbone.Radio.channel(this._options.get(\"busChannel\"));\n\t\tvar w = Math.max(bus.request(Events.Requests.RealWidth), this._options.get(\"ddWidth\"));\n\n\t\tvar extraW = 5;\n\t\tif (this._options.get(\"icons\")) extraW += 27;\n\t\tif (this._options.get(\"checkboxes\")) extraW += 25;\n\n\t\tthis.ui.description.css({ width: w - extraW + \"px\" });\n\t\tthis.ui.value.css({ width: w - extraW + \"px\" });\n\n\t\tif (this.model.get(\"selected\") && !this._options.get(\"checkboxes\")) {\n\t\t\tvar c = this._options.get(\"multiple\") ? \"selected-multi\" : \"selected\";\n\t\t\tthis.$el.addClass(c);\n\t\t}\n\n\t\tif (this.model.get(\"image\") && this._options.get(\"icons\")) this.ui.image.css({ \"background-image\": \"url('\" + this.model.get(\"image\") + \"')\", \"background-size\": \"contain\" });\n\t},\n\n\ttoggleVisibility: function toggleVisibility() {\n\t\tif (this.model.get(\"hidden\")) this.$el.addClass(\"hide\");else this.$el.removeClass(\"hide\");\n\t},\n\n\tonScrollTo: function onScrollTo() {\n\t\tthis.$el.get(0).scrollIntoView();\n\t},\n\n\tonEligibilityChange: function onEligibilityChange() {\n\t\tif (this.model.get(\"eligible\")) this.$el.removeClass(\"ineligible\");else this.$el.addClass(\"ineligible\");\n\t}\n});\n\nvar DropdownSubset = Backbone.Marionette.CompositeView.extend({\n\tclassName: \"items\",\n\n\ttemplate: false,\n\n\tchildView: DropdownItem,\n\n\tchildViewOptions: function childViewOptions() {\n\t\treturn this.model.pick(passThroughFields);\n\t}\n});\n\nvar DropdownCategory = Backbone.Marionette.View.extend({\n\tclassName: \"dropdown-category\",\n\n\ttemplate: require(\"./templates/selectra.nunj\").dropdownCategory,\n\n\tcollectionEvents: {\n\t\t\"change:hidden\": \"onHiddenChange\"\n\t},\n\n\tmodelEvents: {\n\t\t\"change:hidden\": \"onExplicitHiddenChange\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis._options = new Backbone.Model(options);\n\n\t\tthis.collection = this.model.get(\"vcollection\");\n\n\t\tthis.bindEvents(this.collection, this.collectionEvents);\n\t},\n\n\tonRender: function onRender() {\n\t\tvar view = new DropdownSubset({\n\t\t\tcollection: this.collection,\n\t\t\tmodel: this._options\n\t\t});\n\n\t\tthis.$el.append(view.render().el);\n\t},\n\n\tonHiddenChange: function onHiddenChange() {\n\t\tvar bool = this.collection.some(function (x) {\n\t\t\treturn !x.get(\"hidden\");\n\t\t});\n\n\t\tif (bool) this.$el.removeClass(\"hide\");else this.$el.addClass(\"hide\");\n\t},\n\n\tonExplicitHiddenChange: function onExplicitHiddenChange() {\n\t\tvar h = this.model.get(\"hidden\");\n\n\t\tif (h) this.$el.addClass(\"hide\");else this.$el.removeClass(\"hide\");\n\n\t\tthis.collection.each(function (x) {\n\t\t\treturn x.set({ hidden: h });\n\t\t});\n\t}\n});\n\nvar Dropdown = Backbone.Marionette.CompositeView.extend({\n\tclassName: function className() {\n\t\tvar classes = [\"selectra-dropdown\"];\n\n\t\tif (this.model.get(\"flat\")) classes.push(\"selectra-flat\");\n\n\t\treturn classes.join(\" \");\n\t},\n\n\ttemplate: require(\"./templates/selectra.nunj\").dropdownHost,\n\n\tchildView: function childView(model) {\n\t\tif (model.get(\"isCategory\")) return DropdownCategory;\n\t\treturn DropdownItem;\n\t},\n\n\tchildViewContainer: \".container > .items\",\n\n\tchildViewOptions: function childViewOptions() {\n\t\treturn this.model.pick(passThroughFields);\n\t},\n\n\tui: {\n\t\tcontainer: \".container\",\n\t\tsearchBar: \".search\",\n\t\tsearchBox: \".search input\",\n\t\tspinner: \".spinner\",\n\t\titems: \".container > .items\",\n\t\tmaxItemLimit: \".max-item-limit\",\n\t\tsearchClearer: \".clearer\",\n\t\tselections: \".selections\",\n\t\tremover: \".remover\",\n\t\tdynamicAdd: \".dynamic-add\",\n\t\taddNew: \".add-new\",\n\t\tinteractive: \".interactive\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.searchBox\": \"onSearchClick\",\n\t\t\"input @ui.searchBox\": \"onSearchChange\",\n\t\t\"click @ui.searchClearer\": \"onSearchClearClick\",\n\t\t\"click @ui.remover\": \"clearFullSelection\",\n\t\t\"click @ui.dynamicAdd\": \"addDynamicItem\",\n\t\t\"click @ui.addNew\": \"addNewItem\",\n\t\t\"click @ui.interactive\": \"triggerInteractive\",\n\t\t\"keyup @ui.searchBox\": \"onSearchSelect\"\n\t},\n\n\tpagedCollectionEvents: {\n\t\trequest: \"onCollectionRequest\",\n\t\tsync: \"onCollectionSync\",\n\t\t\"change:selected\": \"onSelectionChange\"\n\t},\n\n\tcollectionEvents: {\n\t\t\"change:selected\": \"onSelectionChange\"\n\t},\n\n\tmodelEvents: {\n\t\t\"change:offset\": \"repositionDropdown\"\n\t},\n\n\tpreviewEvents: {\n\t\t\"change:selected\": \"onSelectionChange\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tvar _this3 = this;\n\n\t\tvar bus = Backbone.Radio.channel(this.model.get(\"busChannel\"));\n\t\tbus.reply(Events.Requests.Value, this.getValue.bind(this));\n\n\t\tthis.onScroll = this.onScroll.bind(this);\n\n\t\tthis.unbindEvents(this.collection, this.collectionEvents);\n\n\t\tthis.pageable = this.collection;\n\t\tif (this.collection.categories && this.collection.categories.length) {\n\t\t\tvar content = _.map(this.collection.categories, function (x) {\n\t\t\t\t// Find the items to show in this category\n\t\t\t\tvar items = new VirtualCollection(_this3.collection, {\n\t\t\t\t\tfilter: function filter(y) {\n\t\t\t\t\t\treturn !x && (!y.has(\"categories\") || !y.get(\"categories\").length) || _.includes(y.get(\"categories\") || [], x);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn new Backbone.Model({ isCategory: true, key: x, vcollection: items });\n\t\t\t});\n\t\t\tthis.collection = new Backbone.Collection(content, { model: this.pageable.model });\n\t\t} else {\n\t\t\tthis.collection = this.pageable.fullCollection;\n\t\t}\n\n\t\tif (this.model.get(\"previewSelection\")) {\n\t\t\tthis.previewCollection = new Backbone.Collection([], { model: this.pageable.model });\n\t\t\tthis.bindEvents(this.previewCollection, this.previewEvents);\n\t\t}\n\n\t\tthis.bindEvents(this.collection, this.collectionEvents);\n\t\tthis.bindEvents(this.pageable, this.pagedCollectionEvents);\n\t},\n\n\tgetValue: function getValue() {\n\t\tvar _this4 = this;\n\n\t\tvar options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n\t\tvar bus = Backbone.Radio.channel(this.model.get(\"busChannel\"));\n\t\tvar selection = _.flatten([bus.request(Events.Requests.CurrentSelection)]);\n\n\t\tif (!selection.length) return this.model.get(\"multiple\") ? [] : null;\n\n\t\tif (options.full) {\n\t\t\treturn this.model.get(\"multiple\") ? _.map(selection, function (x) {\n\t\t\t\treturn x.toJSON();\n\t\t\t}) : selection[0].toJSON();\n\t\t}\n\n\t\treturn this.model.get(\"multiple\") ? _.map(selection, function (x) {\n\t\t\treturn x.get(_this4.model.get(\"key\"));\n\t\t}) : selection[0].get(this.model.get(\"key\"));\n\t},\n\n\tonBeforeRender: function onBeforeRender() {\n\t\tif (this.model.get(\"server\")) {\n\t\t\tif (this.pageable.state.totalRecords === null) {\n\t\t\t\tif (this.model.get(\"server\").delayLoad) this.xhr = this.pageable.getFirstPage();\n\t\t\t} else {\n\t\t\t\t// eslint-disable-next-line no-sync\n\t\t\t\tthis.onCollectionSync();\n\t\t\t}\n\t\t}\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tif (this.xhr) this.xhr.abort();\n\t\tthis.xhr = null;\n\n\t\tthis.resetSearch(true);\n\t},\n\n\tonCollectionRequest: function onCollectionRequest() {\n\t\tthis.model.set({ fetching: true });\n\t\tif (this.ui.spinner.removeClass) {\n\t\t\tthis.ui.spinner.removeClass(\"hide\");\n\t\t\tthis.ui.searchBox.attr(\"disabled\", true);\n\t\t}\n\t},\n\n\tonCollectionSync: function onCollectionSync() {\n\t\tvar _this5 = this;\n\n\t\tthis.model.set({ fetching: false });\n\t\tif (this.ui.spinner.addClass) {\n\t\t\tthis.ui.spinner.addClass(\"hide\");\n\t\t\tthis.ui.searchBox.attr(\"disabled\", false);\n\t\t\tthis.ui.searchBox.focus();\n\n\t\t\tif (this.model.has(\"allowCreation\") && this.model.get(\"allowCreation\").mode === \"nomatch\" && this.pageable.length === 0) {\n\t\t\t\t// No items found; show creation option\n\t\t\t\tthis.ui.dynamicAdd.html(\"No match found. Click to add a new item <strong>\" + this.model.get(\"lastSearch\") + \"</strong>.\").removeClass(\"hide\");\n\t\t\t} else {\n\t\t\t\tthis.ui.dynamicAdd.addClass(\"hide\");\n\t\t\t}\n\n\t\t\tvar bus = Backbone.Radio.channel(this.model.get(\"busChannel\"));\n\t\t\tvar currentSelection = _.flatten([bus.request(Events.Requests.CurrentSelection)]);\n\n\t\t\tthis.syncUpdate = true;\n\n\t\t\t// Some of the items we fetched might be matches according to the already-selected items\n\t\t\t// (like if a search was done). Check if so and toggle them as needed.\n\t\t\t_.each(currentSelection, function (x) {\n\t\t\t\tif (!x) return;\n\n\t\t\t\tvar m = _this5.pageable.fullCollection.get(x.id);\n\t\t\t\tif (m) m.set({ selected: true, locked: x.get(\"locked\") });\n\t\t\t});\n\n\t\t\tthis.syncUpdate = false;\n\t\t}\n\t},\n\n\tonSelectionChange: function onSelectionChange(model) {\n\t\tvar _this6 = this;\n\n\t\tvar currentSelection = _.filter(this.pageable.fullCollection.models, function (x) {\n\t\t\treturn x.get(\"selected\");\n\t\t});\n\n\t\tif (this.previewCollection) {\n\t\t\tif (model.get(\"selected\")) this.previewCollection.add(model);\n\t\t}\n\n\t\tif (!this.model.get(\"multiple\") && model.get(\"selected\")) {\n\t\t\t_.each(currentSelection, function (x) {\n\t\t\t\tif (x.cid !== model.cid) {\n\t\t\t\t\tx.set({ selected: false });\n\t\t\t\t\tif (_this6.previewCollection) _this6.previewCollection.remove(x);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tvar eligible = this.model.get(\"eligibility\");\n\t\tif (eligible) {\n\t\t\t_.each(this.collection.models, function (x) {\n\t\t\t\tif (!x.get(\"selected\")) x.set({ eligible: eligible(currentSelection, x) });\n\t\t\t});\n\t\t}\n\n\t\tif (!this.syncUpdate) this.triggerSelectionChange(model);\n\t},\n\n\ttriggerSelectionChange: _.debounce(function (model) {\n\t\t/* eslint-disable no-invalid-this */\n\n\t\tthis.trigger(\"selection:change\", model);\n\n\t\t/* eslint-enable no-invalid-this */\n\t}, 10),\n\n\tonRender: function onRender() {\n\t\tif (this.model.get(\"search\")) this.ui.searchBar.removeClass(\"hide\");\n\n\t\tif (this.model.get(\"fetching\")) {\n\t\t\tthis.ui.spinner.removeClass(\"hide\");\n\t\t\tthis.ui.searchBox.attr(\"disabled\", true);\n\t\t} else {\n\t\t\tthis.ui.spinner.addClass(\"hide\");\n\t\t\tthis.ui.searchBox.attr(\"disabled\", false);\n\t\t}\n\n\t\t// If we need to render selected items\n\t\tif (this.model.get(\"previewSelection\")) {\n\t\t\tvar bus = Backbone.Radio.channel(this.model.get(\"busChannel\"));\n\t\t\tvar currentSelection = _.flatten([bus.request(Events.Requests.CurrentSelection)]);\n\t\t\tif (!currentSelection.length) return;\n\n\t\t\tthis.previewCollection.add(currentSelection);\n\n\t\t\tvar subset = new DropdownSubset({\n\t\t\t\tmodel: this.model,\n\t\t\t\tcollection: this.previewCollection\n\t\t\t});\n\n\t\t\tthis.ui.selections.append(subset.render().el);\n\t\t\tthis.ui.selections.removeClass(\"hide\");\n\t\t}\n\t},\n\n\tonAttach: function onAttach() {\n\t\tthis.ui.items.on(\"scroll\", this.onScroll);\n\n\t\tthis.repositionDropdown(true);\n\n\t\tvar model = _.first(this.collection.where({ selected: true }));\n\t\tif (model) {\n\t\t\tmodel.trigger(\"scrollIntoView\");\n\t\t\t// Then, scroll up a bit more so it's not right at the top of the window\n\t\t\tvar t = this.ui.items.get(0).scrollTop;\n\t\t\tthis.ui.items.get(0).scrollTop = t - 50;\n\t\t}\n\n\t\tvar server = this.model.get(\"server\");\n\t\tif (!server || !server.delayFetch) this.ui.searchBox.focus();\n\t},\n\n\ttriggerInteractive: function triggerInteractive(evt) {\n\t\tevt.stopPropagation();\n\n\t\tvar el = $(evt.currentTarget);\n\t\tvar i = el.data(\"ident\");\n\n\t\tvar interactives = this.model.get(\"interactives\");\n\n\t\tthis.trigger(\"interactive:\" + i);\n\n\t\tif (interactives[i].callback) interactives[i].callback();\n\t},\n\n\trepositionDropdown: function repositionDropdown(firstTime) {\n\t\tvar _this7 = this;\n\n\t\t// Check how much space we have to work with; we might need to shrink the container\n\t\t// or scroll upwards instead of down\n\t\tvar w = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n\t\tvar h = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n\t\tvar o = this.model.get(\"offset\");\n\t\tvar scrollSide = window.pageXOffset;\n\t\tvar prefH = this.model.get(\"ddHeight\");\n\t\tvar prefW = Math.max(200, this.model.get(\"ddWidth\") ? this.model.get(\"ddWidth\") : o.width);\n\n\t\tvar $ddHost = $(this.model.get(\"ddHost\"));\n\t\tvar bcr = $ddHost[0].getBoundingClientRect();\n\n\t\tvar sideways = function sideways() {\n\t\t\to.left = o.left - bcr.left + scrollSide;\n\t\t\t// If the preferred width is less than or equal to the element width, we don't need to do anything special\n\t\t\tif (prefW <= o.width) return [o.left, prefW];\n\n\t\t\t// If it is bigger, we need to see how much will fit. Start off with the total space available to the right.\n\t\t\tvar reduced = w - o.left - 10;\n\n\t\t\t// If the revised width is smaller than the min width, try the other side\n\t\t\tif (reduced < prefW) {\n\t\t\t\treduced = o.left - 10 + o.width;\n\t\t\t\t// If it fits into the left, put it there\n\t\t\t\tif (reduced > prefW) return [10, prefW];\n\n\t\t\t\t// There isn't enough space to the right OR left, so shrink it and show to the right\n\t\t\t\t// This can be improved by checking if there's more space available to the left and putting it there instead\n\t\t\t\treturn [o.left, w - o.left - 10];\n\t\t\t}\n\n\t\t\t// It fits into the right-hand side fine\n\t\t\treturn [o.left, prefW];\n\t\t};\n\n\t\tvar _sideways = sideways(),\n\t\t    _sideways2 = _slicedToArray(_sideways, 2),\n\t\t    left = _sideways2[0],\n\t\t    width = _sideways2[1];\n\n\t\tvar opts = {},\n\t\t    pClass = \"\",\n\t\t    cTop = void 0;\n\n\t\tif (h - o.top - o.height > prefH) {\n\t\t\t// Enough space below the element, show it there\n\t\t\topts = {\n\t\t\t\ttop: o.top + o.height - Math.abs(bcr.top) - (this.model.get(\"multiple\") ? this.model.get(\"flat\") ? 0 : 11 : 3) + \"px\",\n\t\t\t\t\"max-height\": prefH + \"px\"\n\t\t\t};\n\t\t\tcTop = -prefH;\n\t\t} else if (h - o.top - o.height < prefH && o.top > prefH) {\n\t\t\t// Not enough space below, but enough space above the element, show it there\n\t\t\topts = {\n\t\t\t\tbottom: h - o.top - Math.abs(bcr.top) - (this.model.get(\"multiple\") ? 4 : 2) + \"px\",\n\t\t\t\t\"max-height\": prefH + \"px\"\n\t\t\t};\n\t\t\tcTop = prefH;\n\t\t\tpClass = \"reverse\";\n\t\t}\n\t\t// Not enough space at the top OR bottom. Pick the biggest one and show it there.\n\t\telse if (h - o.top - o.height > o.top) {\n\t\t\t\t// Show it underneath\n\t\t\t\topts = {\n\t\t\t\t\ttop: o.top + o.height - Math.abs(bcr.top) - (this.model.get(\"multiple\") ? this.model.get(\"flat\") ? 0 : 11 : 3) + \"px\",\n\t\t\t\t\t\"max-height\": h - o.top - o.height - 10 + \"px\"\n\t\t\t\t};\n\t\t\t\tcTop = -(h - o.top - o.height - 10);\n\t\t\t} else {\n\t\t\t\t// Show it on top\n\t\t\t\topts = {\n\t\t\t\t\tbottom: h - o.top + Math.abs(bcr.top) - (this.model.get(\"multiple\") ? 4 : 2) + \"px\",\n\t\t\t\t\t\"max-height\": o.top - 10 + \"px\"\n\t\t\t\t};\n\t\t\t\tcTop = o.top - 10;\n\t\t\t\tpClass = \"reverse\";\n\t\t\t}\n\n\t\tthis.$el.css(_.extend(opts, {\n\t\t\tleft: left + \"px\",\n\t\t\twidth: width + \"px\"\n\t\t}));\n\n\t\tthis.model.set({ drawPosition: pClass });\n\n\t\t//Fix for IE11 display issues\n\t\tif (Boolean(window.MSInputMethodContext) && Boolean(document.documentMode)) this.$el.find(\".items\").css(\"max-height\", opts[\"max-height\"]);\n\n\t\tif (firstTime === true) this.ui.container.css({ top: cTop + \"px\", \"max-height\": opts[\"max-height\"] }).addClass(pClass);\n\n\t\tsetTimeout(function () {\n\t\t\tif (_this7.ui.container && _this7.ui.container.css) _this7.ui.container.css({ top: \"0px\" });\n\t\t}, 0);\n\t},\n\n\tonSearchClick: function onSearchClick(evt) {\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\t},\n\n\tonSearchChange: _.debounce(function () {\n\t\t/* eslint-disable no-invalid-this */\n\n\t\tvar search = _.toLower(_.trim(this.ui.searchBox.val()) || \"\");\n\t\tthis.model.set({ lastSearch: search });\n\n\t\tif (!search) return this.resetSearch();\n\n\t\tthis.ui.searchClearer.removeClass(\"hide\");\n\n\t\tvar valueField = this.model.get(\"value\");\n\n\t\t// Then, update the pageable collection links to include the filters\n\t\tif (this.model.get(\"server\")) return this.pageable.setSearchTerms(search);\n\n\t\tvar col = this.collection;\n\n\t\tif (this.model.get(\"showCategories\") && this.pageable.categories) {\n\t\t\t// Delegate the searching to each sub-collection\n\t\t\tcol = this.pageable.fullCollection;\n\t\t}\n\n\t\t// First, match on the items we've already downloaded\n\t\tvar matches = _.reject(col.models, function (x) {\n\t\t\treturn _.includes(_.toLower(x.get(valueField)), search) || _.includes(_.toLower(x.get(\"desc\")), search);\n\t\t});\n\n\t\t// Unhide any past searched items that are now matched\n\t\tvar unMatches = _.filter(col.models, function (x) {\n\t\t\treturn x.get(\"hidden\") && !_.find(matches, function (y) {\n\t\t\t\treturn y.cid === x.cid;\n\t\t\t});\n\t\t});\n\n\t\t_.each(unMatches, function (x) {\n\t\t\treturn x.set({ hidden: false });\n\t\t});\n\t\t_.each(matches, function (x) {\n\t\t\treturn x.set({ hidden: true });\n\t\t});\n\n\t\tif (this.model.has(\"allowCreation\") && matches.length === col.length) {\n\t\t\t// No items found; show creation option\n\t\t\tthis.ui.dynamicAdd.html(\"No match found. Click to add a new item <strong>\" + search + \"</strong>.\").removeClass(\"hide\");\n\t\t} else {\n\t\t\tthis.ui.dynamicAdd.addClass(\"hide\");\n\t\t}\n\n\t\t/* eslint-enable no-invalid-this */\n\t}, 400),\n\n\tonSearchClearClick: function onSearchClearClick(evt) {\n\t\tevt.stopPropagation();\n\n\t\tthis.ui.searchBox.val(\"\");\n\t\tthis.resetSearch();\n\t},\n\n\tonSearchSelect: function onSearchSelect(evt) {\n\t\tif (this.collection.length === 1 && evt.which === 13) {\n\t\t\tthis.collection.first().trigger(\"trigger:click\");\n\t\t\tthis.ui.searchBox.val(\"\");\n\t\t\tthis.resetSearch();\n\t\t}\n\t},\n\n\tresetSearch: function resetSearch(silent) {\n\t\tthis.pageable.setSearchTerms(null, silent);\n\n\t\tthis.model.unset(\"lastSearch\");\n\t\tthis.ui.searchClearer.addClass(\"hide\");\n\n\t\tif (!this.model.get(\"server\")) this.pageable.fullCollection.each(function (x) {\n\t\t\treturn x.set({ hidden: false });\n\t\t});\n\t},\n\n\tonScroll: _.throttle(function (evt) {\n\t\t/* eslint-disable no-invalid-this */\n\n\t\tvar scrollPos = evt.currentTarget.scrollTop + this.ui.items.height();\n\t\tvar height = evt.currentTarget.scrollHeight;\n\n\t\tif (scrollPos / height > 0.9 && !this.model.get(\"fetching\") && this.pageable.hasNextPage()) {\n\t\t\t// Show a little message so the user understands what's happening if we've hit max items\n\t\t\tif (this.collection.length >= this.model.get(\"maxItems\")) {\n\t\t\t\tthis.ui.maxItemLimit.removeClass(\"hide\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.pageable.getNextPage();\n\t\t} else {\n\t\t\tthis.ui.maxItemLimit.addClass(\"hide\");\n\t\t}\n\n\t\t/* eslint-enable no-invalid-this */\n\t}, 25),\n\n\tclearFullSelection: function clearFullSelection(e) {\n\t\te.stopPropagation();\n\n\t\tvar currentSelection = this.previewCollection.models;\n\n\t\tif (!currentSelection.length) return;\n\n\t\tif (!this.model.get(\"multiple\") && _.first(currentSelection).get(\"selected\")) {\n\t\t\t_.each(currentSelection, function (x) {\n\t\t\t\tif (x.cid !== _.first(currentSelection).cid) x.set({ selected: false }, { silent: true });\n\t\t\t});\n\t\t} else if (this.model.get(\"multiple\")) {\n\t\t\t_.each(currentSelection, function (x) {\n\t\t\t\treturn x.set({ selected: false });\n\t\t\t});\n\t\t}\n\n\t\tvar eligible = this.model.get(\"eligibility\");\n\t\tif (eligible) _.each(this.pageable.fullCollection.models, function (x) {\n\t\t\treturn x.set({ eligible: eligible(currentSelection, x) });\n\t\t});\n\n\t\tif (this.model.get(\"multiple\")) this.trigger(\"selection:change\", currentSelection);else this.trigger(\"selection:change\", _.first(currentSelection));\n\n\t\tthis.ui.selections.addClass(\"hide\");\n\t},\n\n\taddDynamicItem: function addDynamicItem() {\n\t\tvar _ref2;\n\n\t\tvar options = this.model.get(\"allowCreation\");\n\n\t\tvar key = options.getKey(this.model.get(\"lastSearch\"));\n\t\tvar value = options.getValue(this.model.get(\"lastSearch\"));\n\n\t\tvar M = this.collection.model;\n\t\tvar model = new M((_ref2 = {}, _defineProperty(_ref2, this.model.get(\"key\"), key), _defineProperty(_ref2, this.model.get(\"value\"), value), _defineProperty(_ref2, \"selected\", true), _ref2));\n\n\t\tthis._commonAdd(model, \"dynamic\");\n\t},\n\n\taddNewItem: function addNewItem(evt) {\n\t\tvar _this8 = this;\n\n\t\tevt.stopPropagation();\n\n\t\tif (this.model.get(\"addingItem\")) return;\n\n\t\tvar options = this.model.get(\"allowCreation\");\n\n\t\tthis.model.set({ addingItem: true });\n\n\t\tif (options.callback) {\n\t\t\tif (options.hideOnClick) this.$el.addClass(\"invisible\");\n\n\t\t\treturn options.callback(this, $(evt.currentTarget)).then(function (result) {\n\t\t\t\tif (options.hideOnClick) _this8.$el.removeClass(\"invisible\");\n\n\t\t\t\t_this8.model.set({ addingItem: false });\n\n\t\t\t\tif (!result) return;\n\n\t\t\t\tvar M = _this8.collection.model;\n\t\t\t\tvar model = new M(_.extend(result, { key: result[_this8.model.get(\"key\")], value: result[_this8.model.get(\"value\")] }));\n\n\t\t\t\treturn _this8._commonAdd(model, \"manual\");\n\t\t\t});\n\t\t}\n\t\tif (options && options.mode === \"nomatch\" && this.pageable.length === 0) {\n\t\t\t// No items found; show creation option\n\t\t\tthis.ui.dynamicAdd.html(\"No match found. Click to add a new item <strong>\" + this.model.get(\"lastSearch\") + \"</strong>.\").removeClass(\"hide\");\n\t\t} else {\n\t\t\tthis.ui.dynamicAdd.addClass(\"hide\");\n\t\t}\n\t},\n\n\t_commonAdd: function _commonAdd(model, type) {\n\t\tvar _this9 = this;\n\n\t\tvar addItem = function addItem() {\n\t\t\t// Add the item and move on\n\t\t\t_this9.collection.add(model);\n\n\t\t\tif (type === \"dynamic\") _this9.ui.dynamicAdd.addClass(\"hide\");\n\n\t\t\t_this9.onSelectionChange(model);\n\t\t};\n\n\t\tvar options = this.model.get(\"allowCreation\");\n\n\t\tif (!options.server) return addItem();\n\n\t\tif (options.server) {\n\t\t\t// We need to save the item to the server.\n\t\t\tvar fetch = options.server.save;\n\t\t\tif (!_.isPlainObject(fetch)) fetch = { url: fetch };\n\n\t\t\tif (!fetch.dataType) fetch.dataType = \"json\";\n\t\t\tif (!fetch.method) fetch.method = \"POST\";\n\t\t\tfetch.data = model.toJSON();\n\n\t\t\tif (options.server.params) {\n\t\t\t\tif (_.isFunction(options.server.params)) fetch.data = _.extend(fetch.data, options.server.params());else fetch.data = _.extend(fetch.data, options.server.params);\n\t\t\t}\n\n\t\t\tfetch.success = function (data) {\n\t\t\t\t_this9.model.set({ fetching: false });\n\n\t\t\t\t// Merge any data from the client\n\t\t\t\tmodel.set(data);\n\n\t\t\t\tif (options.server.saveFirst) addItem();\n\t\t\t};\n\n\t\t\tfetch.error = function () {\n\t\t\t\t_this9.model.set({ fetching: false });\n\n\t\t\t\tif (!options.server.saveFirst) {\n\t\t\t\t\tmodel.set({ selected: false });\n\t\t\t\t\t_this9.collection.remove(model);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tthis.model.set({ fetching: true });\n\t\t\tthis.xhr = $.ajax(fetch);\n\n\t\t\tif (!options.server.saveFirst) addItem();\n\t\t}\n\t}\n});\n\nvar MultiItem = Backbone.Marionette.View.extend({\n\tclassName: function className() {\n\t\tvar classes = [\"selectra-multi-item\"];\n\n\t\tif (this.options.lockedList) classes.push(\"selectra-multi-locked\");\n\n\t\treturn classes.join(\" \");\n\t},\n\n\ttemplate: require(\"./templates/selectra.nunj\").multiItem,\n\n\tevents: {\n\t\t\"click .closer\": \"onClose\",\n\t\tclick: \"onClick\"\n\t},\n\n\tmodelEvents: {\n\t\t\"change:ellipsis\": \"toggleEllipsis\",\n\t\tgenerateWidth: \"generateWidth\",\n\t\t\"change:noshow\": \"toggleVisibility\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this10 = this;\n\n\t\treturn {\n\t\t\tkey: function key() {\n\t\t\t\treturn _this10.model.id;\n\t\t\t},\n\t\t\tvalue: function value() {\n\t\t\t\treturn _this10.model.get(_this10._options.get(\"value\"));\n\t\t\t},\n\t\t\ticons: function icons() {\n\t\t\t\treturn _this10._options.get(\"icons\");\n\t\t\t},\n\t\t\tdeselectable: function deselectable() {\n\t\t\t\treturn !_this10._options.get(\"disabled\") && _this10._options.get(\"deselection\") && !_this10._options.get(\"lockedList\") && !_this10.model.get(\"locked\");\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis._options = new Backbone.Model(options);\n\t},\n\n\tonClick: function onClick(evt) {\n\t\tif (this._options.get(\"lockedList\")) return;\n\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\t},\n\n\tgenerateWidth: function generateWidth() {\n\t\tthis.model.set({ realWidth: this.$el.width() });\n\t},\n\n\tonClose: function onClose(evt) {\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\n\t\tvar bus = Backbone.Radio.channel(this._options.get(\"busChannel\"));\n\t\tvar disabled = bus.request(Events.Requests.Disabled);\n\t\tif (disabled) return;\n\n\t\tthis.model.set({ selected: false });\n\t},\n\n\ttoggleEllipsis: function toggleEllipsis() {\n\t\tif (this.model.get(\"ellipsis\")) this.$el.addClass(\"ellipsis\");else this.$el.removeClass(\"ellipsis\");\n\t},\n\n\ttoggleVisibility: function toggleVisibility() {\n\t\tif (this.model.get(\"noshow\")) this.$el.addClass(\"hide\");else this.$el.removeClass(\"hide\");\n\t}\n});\n\n//-------------------------------------------------------------------------//\n\n\nvar SingleBase = Backbone.Marionette.View.extend({\n\tclassName: function className() {\n\t\tvar classes = [\"selectra-host\"];\n\n\t\tif (this.model.get(\"flat\")) classes.push(\"selectra-flat\");\n\n\t\tif (this.model.get(\"disabled\")) classes.push(\"selectra-disabled\");\n\n\t\treturn classes.join(\" \");\n\t},\n\n\ttemplate: require(\"./templates/selectra.nunj\").singleBase,\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this11 = this;\n\n\t\treturn {\n\t\t\thasPlaceholder: function hasPlaceholder() {\n\t\t\t\treturn Boolean(_this11.model.get(\"placeholder\"));\n\t\t\t},\n\t\t\tplaceholder: function placeholder() {\n\t\t\t\tvar p = _this11.model.get(\"placeholder\");\n\n\t\t\t\tif (_.isFunction(p)) return p(_this11.model.toJSON());\n\n\t\t\t\treturn p;\n\t\t\t},\n\t\t\tsingleDeselect: function singleDeselect() {\n\t\t\t\treturn _this11.model.get(\"singleDeselect\");\n\t\t\t}\n\t\t};\n\t},\n\n\tevents: {\n\t\tclick: \"onClick\",\n\t\t\"click @ui.globalCloser\": \"onGlobalClose\"\n\t},\n\n\tui: {\n\t\tplaceholder: \".placeholder\",\n\t\ttext: \".text\",\n\t\theadImage: \".head-image\",\n\t\thead: \".head\",\n\t\tdropdown: \".selectra-dropdown\",\n\t\tglobalCloser: \".global-close\",\n\t\tdownArrow: \".fa-chevron-down\"\n\t},\n\n\tmodelEvents: {\n\t\t\"change:fetching\": \"onFetchChange\",\n\t\t\"change:disabled\": \"onDisabledChange\"\n\t},\n\n\tcollectionEvents: {\n\t\tsync: \"onCollectionSync\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tvar _this12 = this;\n\n\t\tthis._currentSelection = undefined;\n\n\t\tthis.mouseUpClickHandler = this.onMouseUp.bind(this);\n\n\t\tvar bus = Backbone.Radio.channel(this.model.get(\"busChannel\"));\n\t\tbus.reply(Events.Requests.RealWidth, function () {\n\t\t\treturn _this12.model.get(\"realWidth\");\n\t\t});\n\t\tbus.on(Events.Commands.Close, this.close.bind(this));\n\t\tbus.reply(Events.Requests.Clickability, function () {\n\t\t\treturn _this12.model.get(\"clickable\");\n\t\t});\n\t\tbus.reply(Events.Requests.CurrentSelection, function () {\n\t\t\treturn _this12._currentSelection || [];\n\t\t});\n\t\tbus.reply(Events.Requests.Disabled, function () {\n\t\t\treturn _this12.model.get(\"disabled\");\n\t\t});\n\n\t\tthis.listenTo(this, \"clear\", this.clear.bind(this));\n\t},\n\n\tclose: function close() {\n\t\t$(document).off(\"mouseup\", this.mouseUpClickHandler);\n\n\t\tif (this._dropdown) {\n\t\t\tthis._dropdown.destroy();\n\t\t\tthis._dropdown = undefined;\n\t\t\tthis.model.set({ fetching: false });\n\t\t\tthis.trigger(\"dropdown:closed\");\n\t\t}\n\n\t\tthis.$el.removeClass(\"selectra-expanded\");\n\t},\n\n\tonFetchChange: function onFetchChange() {\n\t\tif (this.model.get(\"fetching\")) {\n\t\t\tvar pre = this.model.get(\"disabled\");\n\t\t\tthis.model.set({ disabled: true, preDisabled: pre });\n\t\t} else if (!this.model.get(\"preDisabled\")) {\n\t\t\tthis.model.set({ disabled: false });\n\t\t\tthis.model.unset(\"preDisabled\");\n\t\t}\n\t},\n\n\tonDisabledChange: function onDisabledChange() {\n\t\tif (this.model.get(\"disabled\")) {\n\t\t\tthis.$el.addClass(\"disabled\");\n\t\t\tthis.ui.downArrow.addClass(\"hide\");\n\t\t} else {\n\t\t\tthis.$el.removeClass(\"disabled\");\n\t\t\tthis.ui.downArrow.removeClass(\"hide\");\n\t\t}\n\t},\n\n\tonValueChanged: function onValueChanged(value, data, suppress) {\n\t\tif (data === this._currentSelection) return;\n\n\t\tthis._currentSelection = data;\n\n\t\tif (this._input) {\n\t\t\tif (this.model.get(\"inputIsSelect\")) {\n\t\t\t\tif (value || value === 0) {\n\t\t\t\t\t$(\"option\", this._input).first().attr(\"value\", value).attr(\"selected\", true);\n\t\t\t\t} else {\n\t\t\t\t\t$(\"option\", this._input).first().attr(\"value\", \"\").attr(\"selected\", false);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis._input.val(data ? data.id : \"\");\n\t\t\t}\n\n\t\t\tif (!suppress) this._input.trigger(\"change\", data);\n\t\t}\n\n\t\tthis.$el.attr(\"title\", data ? data.get(this.model.get(\"value\")) : \"\");\n\t},\n\n\tonCollectionSync: function onCollectionSync() {\n\t\tvar _this13 = this;\n\n\t\tif (!this._default) return;\n\n\t\tvar _collection$filter = this.collection.filter(function (x) {\n\t\t\treturn x[_this13.model.get(\"key\")] === _this13._default.id;\n\t\t}),\n\t\t    _collection$filter2 = _slicedToArray(_collection$filter, 1),\n\t\t    exists = _collection$filter2[0];\n\n\t\tif (exists) exists.set({ selected: true });\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this14 = this;\n\n\t\t// Set an explicit width?\n\t\tif (this.model.get(\"width\")) this.$el.css({ width: this.model.get(\"width\") }).addClass(\"selectra-fixed\");else this.$el.css({ width: \"\" }).addClass(\"selectra-flex\");\n\n\t\t// Space for icons\n\t\tif (this.model.get(\"icons\")) this.ui.headImage.removeClass(\"hide\");else this.ui.headImage.addClass(\"hide\");\n\n\t\t// also listen for internal value changes to sync them up with the hidden element\n\t\tvar bus = Backbone.Radio.channel(this.model.get(\"busChannel\"));\n\t\tbus.on(Events.ValueChanged, this.onValueChanged.bind(this));\n\n\t\t// If there's a preselected item, select it\n\t\tvar selected = this.collection.where({ selected: true });\n\t\tif (selected[0]) this.onSelectionChange(selected[0], this.model.get(\"silent\"), true);\n\n\t\t// Did we get given a default selection from outside?\n\t\tif (this.model.get(\"server\") && this.model.get(\"server\").default) {\n\t\t\t// Do we need to fetch the defaults dynamically?\n\t\t\tif (this.model.get(\"server\").default.fetch) {\n\t\t\t\tvar fetch = this.model.get(\"server\").default.fetch;\n\t\t\t\tif (!_.isPlainObject(fetch)) fetch = { url: fetch, method: \"GET\" };\n\n\t\t\t\tvar params = this.model.get(\"server\").default.params;\n\t\t\t\tif (params && !fetch.data) {\n\t\t\t\t\tif (_.isFunction(params)) fetch.data = params();else fetch.data = params;\n\t\t\t\t}\n\n\t\t\t\tif (!fetch.dataType) fetch.dataType = \"json\";\n\n\t\t\t\tfetch.success = function (_d) {\n\t\t\t\t\tvar _$extend;\n\n\t\t\t\t\t_this14.model.set({ fetching: false });\n\n\t\t\t\t\tvar data = _d;\n\n\t\t\t\t\tif (_.isArray(data)) data = _.first(data);\n\n\t\t\t\t\tif (!data) return;\n\n\t\t\t\t\tif (!data.key && !(_this14.model.get(\"key\") in data) || !data.value && !(_this14.model.get(\"value\") in data)) return;\n\n\t\t\t\t\tvar props = _.extend(data, (_$extend = {\n\t\t\t\t\t\tselected: true\n\t\t\t\t\t}, _defineProperty(_$extend, _this14.model.get(\"key\"), data.key || data[_this14.model.get(\"key\")]), _defineProperty(_$extend, _this14.model.get(\"value\"), data.value || data[_this14.model.get(\"value\")]), _$extend));\n\n\t\t\t\t\t// eslint-disable-next-line new-cap\n\t\t\t\t\t_this14._default = new _this14.collection.model(props);\n\n\t\t\t\t\tvar _collection$filter3 = _this14.collection.filter(function (x) {\n\t\t\t\t\t\treturn x[_this14.model.get(\"key\")] === _this14._default.id;\n\t\t\t\t\t}),\n\t\t\t\t\t    _collection$filter4 = _slicedToArray(_collection$filter3, 1),\n\t\t\t\t\t    exists = _collection$filter4[0];\n\n\t\t\t\t\tif (exists) exists.set({ selected: true });\n\n\t\t\t\t\t_this14.onSelectionChange(_this14._default, _this14.model.get(\"server\").default.silent, true);\n\t\t\t\t};\n\n\t\t\t\tfetch.error = function () {\n\t\t\t\t\t_this14.model.set({ fetching: false });\n\n\t\t\t\t\t_this14.ui.spinner.addClass(\"hide\");\n\t\t\t\t};\n\n\t\t\t\tthis.xhr = $.ajax(fetch);\n\t\t\t\tthis.model.set({ fetching: true });\n\t\t\t} else if (this.model.get(\"server\").default.key && this.model.get(\"server\").default.value) {\n\t\t\t\tvar _props;\n\n\t\t\t\tvar props = (_props = {\n\t\t\t\t\tselected: true\n\t\t\t\t}, _defineProperty(_props, this.model.get(\"key\"), this.model.get(\"server\").default.key), _defineProperty(_props, this.model.get(\"value\"), this.model.get(\"server\").default.value), _props);\n\n\t\t\t\t// eslint-disable-next-line new-cap\n\t\t\t\tthis._default = new this.collection.model(props);\n\n\t\t\t\tvar _collection$filter5 = this.collection.filter(function (x) {\n\t\t\t\t\treturn x[_this14.model.get(\"key\")] === _this14._default.id;\n\t\t\t\t}),\n\t\t\t\t    _collection$filter6 = _slicedToArray(_collection$filter5, 1),\n\t\t\t\t    exists = _collection$filter6[0];\n\n\t\t\t\tif (exists) exists.set({ selected: true });\n\n\t\t\t\tthis.onSelectionChange(this._default, this.model.get(\"server\").default.silent);\n\t\t\t}\n\t\t}\n\n\t\tif (this.model.get(\"server\") && !this.model.get(\"server\").delayLoad && this.collection.state.totalRecords === null) this.collection.getFirstPage();\n\t},\n\n\tonClick: function onClick(evt) {\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\n\t\t// If we have any open views, close them\n\t\tif (this._dropdown) {\n\t\t\tthis.close();\n\t\t} else {\n\t\t\t// If we're disabled, do nothing\n\t\t\tif (this.model.get(\"disabled\") || this.model.get(\"fetching\")) return;\n\n\t\t\tvar location = this.$el;\n\n\t\t\tvar top = location.offset().top;\n\t\t\tif (this.model.get(\"virtualBase\")) {\n\t\t\t\tlocation = $(this._el);\n\t\t\t\ttop = location.offset().top + location.height();\n\t\t\t}\n\n\t\t\tvar left = location.offset().left + $(this.model.get(\"ddHost\"))[0].offsetLeft;\n\t\t\tvar w = location.width();\n\t\t\tvar h = location.height();\n\n\t\t\tthis.model.set({ offset: { left: left - window.pageXOffset, width: w, top: top - window.pageYOffset, height: h } });\n\n\t\t\tthis._dropdown = new Dropdown({\n\t\t\t\tcollection: this.collection,\n\t\t\t\tmodel: this.model\n\t\t\t});\n\n\t\t\tthis.listenTo(this._dropdown, \"selection:change\", this.onSelectionChange.bind(this));\n\n\t\t\t$(document).on(\"mouseup\", this.mouseUpClickHandler);\n\n\t\t\tthis.model.set({ realWidth: this.$el.width() });\n\n\t\t\t$(this.model.get(\"ddHost\")).append(this._dropdown.render().el);\n\t\t\tthis._dropdown.onAttach();\n\n\t\t\tthis.$el.addClass(\"selectra-expanded\");\n\t\t}\n\n\t\treturn false;\n\t},\n\n\tonMouseUp: function onMouseUp(e) {\n\t\tvar container = this.$el;\n\n\t\tif (!container.is(e.target) && container.has(e.target).length === 0) {\n\t\t\tif (this._dropdown) {\n\t\t\t\tvar modal = this._dropdown.$el;\n\t\t\t\tif (!modal.is(e.target) && modal.has(e.target).length === 0) this.close();\n\t\t\t} else {\n\t\t\t\tthis.close();\n\t\t\t}\n\t\t}\n\t},\n\n\tonSelectionChange: function onSelectionChange(model, suppress, defaultSelection) {\n\t\t// If this model is actually already selected, do nothing\n\t\t// This can occur if the selection is re-applied after eg. a search\n\t\tif (this._currentSelection && this._currentSelection.id === model.id && model.get(\"selected\")) return;\n\n\t\tif (this._currentSelection && this._currentSelection.id !== model.id && !model.get(\"selected\")) return;\n\n\t\tvar bus = Backbone.Radio.channel(this.model.get(\"busChannel\"));\n\n\t\t// Update the UI\n\t\tif (model.get(\"selected\")) {\n\t\t\tthis.ui.placeholder.addClass(\"hide\");\n\t\t\tthis.ui.text.text(model.get(this.model.get(\"value\"))).removeClass(\"hide\");\n\n\t\t\t// Maybe set the icon\n\t\t\tif (model.get(\"icon\")) {\n\t\t\t\tthis.ui.headImage.css({ \"background-image\": \"\" }).addClass(\"fal \" + model.get(\"icon\"));\n\t\t\t} else if (model.get(\"image\")) {\n\t\t\t\tthis.ui.headImage.css({\n\t\t\t\t\t\"background-image\": \"url('\" + model.get(\"image\") + \"')\",\n\t\t\t\t\t\"background-size\": \"contain\"\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.ui.globalCloser.removeClass(\"hide\");\n\n\t\t\tbus.trigger(Events.ValueChanged, model.id, model, suppress);\n\t\t} else {\n\t\t\tthis.ui.placeholder.removeClass(\"hide\");\n\t\t\tthis.ui.text.addClass(\"hide\");\n\n\t\t\tthis.ui.headImage.css({ \"background-image\": \"\" }).removeClass(\"fal \" + (model.get(\"icon\") || \"\"));\n\n\t\t\tthis.ui.globalCloser.addClass(\"hide\");\n\n\t\t\tbus.trigger(Events.ValueChanged, null, null, suppress);\n\t\t}\n\n\t\t// Close the chooser maybe\n\t\tif (this.model.get(\"closeOnChoose\") && !defaultSelection) this.close();\n\t},\n\n\tshow: function show() {\n\t\tvar options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n\t\t// Modeled roughly on Marionette's regions' \"show\"\n\t\tthis.bindUIElements();\n\n\t\t// Use any explicitly-provided element, else fall back to one provided before\n\t\tvar attachPoint = options.el || this._el;\n\n\t\tif (!attachPoint) throw new Error(\"No DOM location provided to Selectra\");\n\n\t\tif (_.isString(options) || options instanceof $) {\n\t\t\tattachPoint = options;\n\t\t\tattachPoint = $(attachPoint);\n\t\t}\n\n\t\t// If the attachment point is an input of some kind, we will steal it\n\t\t// to allow calling \"val()\" on the element later from client code\n\t\tif (attachPoint.is && attachPoint.is(\":input\")) {\n\t\t\tthis._input = attachPoint;\n\n\t\t\tif (this._input.is(\"select\")) this.model.set({ inputIsSelect: true });\n\n\t\t\tif (attachPoint.prop(\"disabled\")) this.model.set({ disabled: true });\n\t\t}\n\n\t\tif (this._input) {\n\t\t\t// Hide the input\n\t\t\tthis._input.css({ display: \"none\" });\n\t\t\t// Add a dummy option if needed\n\t\t\tif ($(\"option\", this._input).length === 0) this._input.append(\"<option value='' selected/>\");\n\n\t\t\t// And show Selectra\n\t\t\tattachPoint.after(this.render().el);\n\t\t} else if (attachPoint instanceof Backbone.Marionette.Region) {\n\t\t\tattachPoint.show(this);\n\t\t} else {\n\t\t\tattachPoint.append(this.render().el);\n\t\t}\n\t},\n\n\tgetValue: function getValue() {\n\t\tvar options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n\t\tvar bus = Backbone.Radio.channel(this.model.get(\"busChannel\"));\n\t\treturn bus.request(Events.Requests.Value, options);\n\t},\n\n\tval: function val() {\n\t\tvar options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n\t\treturn this.getValue(options);\n\t},\n\n\tgetSelected: function getSelected() {\n\t\tif (_.isUndefined(this._currentSelection)) return {};\n\n\t\treturn this._currentSelection ? this._currentSelection.toJSON() : {};\n\t},\n\n\tclear: function clear() {\n\t\tthis._currentSelection = null;\n\n\t\t// Close it if open\n\t\tvar bus = Backbone.Radio.channel(this.model.get(\"busChannel\"));\n\t\tbus.trigger(Events.Commands.Close);\n\n\t\t// Wipe all items from the current collection.\n\t\tif (this.collection.fullCollection) this.collection.fullCollection.reset([]);\n\n\t\tthis.collection.reset([]);\n\t},\n\n\tonGlobalClose: function onGlobalClose(evt) {\n\t\tevt.stopPropagation();\n\n\t\tif (this._currentSelection) {\n\t\t\tthis._currentSelection.set({ selected: false });\n\t\t\tthis.onSelectionChange(this._currentSelection);\n\t\t}\n\t}\n});\n\nvar MultiBase = Backbone.Marionette.CompositeView.extend({\n\tclassName: function className() {\n\t\tvar classes = [\"selectra-host\"];\n\n\t\tif (this.model.get(\"flat\")) classes.push(\"selectra-flat\");\n\n\t\tif (this.model.get(\"disabled\")) classes.push(\"selectra-disabled\");\n\n\t\treturn classes.join(\" \");\n\t},\n\n\ttemplate: require(\"./templates/selectra.nunj\").multiBase,\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this15 = this;\n\n\t\treturn {\n\t\t\thasPlaceholder: function hasPlaceholder() {\n\t\t\t\treturn Boolean(_this15.model.get(\"placeholder\"));\n\t\t\t},\n\t\t\tplaceholder: function placeholder() {\n\t\t\t\tvar p = _this15.model.get(\"placeholder\");\n\n\t\t\t\tif (_.isFunction(p)) return p(_this15.model.toJSON());\n\n\t\t\t\treturn p;\n\t\t\t}\n\t\t};\n\t},\n\n\tui: {\n\t\tplaceholder: \".placeholder\",\n\t\ttext: \".text\",\n\t\theadImage: \".head-image\",\n\t\thead: \".head\",\n\t\tdropdown: \".selectra-dropdown\",\n\t\titems: \".items\",\n\t\tspinner: \".spinner\"\n\t},\n\n\tchildView: MultiItem,\n\tchildViewContainer: \".items\",\n\n\tchildViewOptions: function childViewOptions() {\n\t\treturn this.model.pick(passThroughFields);\n\t},\n\n\tevents: {\n\t\tclick: \"onClick\"\n\t},\n\n\tmodelEvents: {\n\t\t\"change:fetching\": \"onFetchChange\",\n\t\t\"change:disabled\": \"onDisabledChange\"\n\t},\n\n\tcollectionEvents: {\n\t\t\"change:selected\": \"onChosenSelectedChange\",\n\t\t\"sync reset\": \"onCollectionSync\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tvar _this16 = this;\n\n\t\tthis._currentSelection = undefined;\n\n\t\tthis.mouseUpClickHandler = this.onMouseUp.bind(this);\n\n\t\tvar bus = Backbone.Radio.channel(this.model.get(\"busChannel\"));\n\t\tbus.reply(Events.Requests.RealWidth, function () {\n\t\t\treturn _this16.model.get(\"realWidth\");\n\t\t});\n\t\tbus.reply(Events.Requests.Disabled, function () {\n\t\t\treturn _this16.model.get(\"disabled\");\n\t\t});\n\t\tbus.reply(Events.Requests.Clickability, function () {\n\t\t\treturn _this16.model.get(\"clickable\");\n\t\t});\n\t\tbus.on(Events.Commands.Close, this.close.bind(this));\n\t\tbus.reply(Events.Requests.CurrentSelection, function () {\n\t\t\treturn _this16._currentSelection || [];\n\t\t});\n\n\t\tthis.listenTo(this, \"clear\", this.clear.bind(this));\n\n\t\tthis.unbindEvents(this.collection, this.collectionEvents);\n\t\tthis.pagedCollection = this.collection;\n\n\t\tvar opts = { model: this.pagedCollection.model };\n\t\t// Handle automatic sorting\n\t\tif (this.model.get(\"sort\")) {\n\t\t\tif (this.model.get(\"sort\") === true) {\n\t\t\t\tvar field = this.model.get(\"server\") ? this.model.get(\"server\").value : \"value\";\n\t\t\t\topts.comparator = field;\n\t\t\t} else {\n\t\t\t\topts.comparator = this.model.get(\"sort\");\n\t\t\t}\n\t\t}\n\n\t\t// We need to create another collection to only render selected items\n\t\tthis.collection = new Backbone.Collection(this.pagedCollection.filter(function (x) {\n\t\t\treturn x.get(\"selected\");\n\t\t}), opts);\n\t\tthis.bindEvents(this.collection, this.collectionEvents);\n\t},\n\n\tclose: function close() {\n\t\t$(document).off(\"mouseup\", this.mouseUpClickHandler);\n\n\t\tif (this._dropdown) {\n\t\t\tthis._dropdown.destroy();\n\t\t\tthis._dropdown = undefined;\n\t\t\tthis.model.set({ fetching: false });\n\t\t\tthis.trigger(\"dropdown:closed\");\n\t\t}\n\n\t\tthis.$el.removeClass(\"selectra-expanded\");\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tif (this.xhr) this.xhr.abort();\n\t\tthis.xhr = null;\n\t\tthis.trigger(\"destroying\");\n\t},\n\n\tonFetchChange: function onFetchChange() {\n\t\tif (this.model.get(\"fetching\")) {\n\t\t\tvar pre = this.model.get(\"disabled\");\n\t\t\tthis.model.set({ disabled: true, preDisabled: pre });\n\t\t} else if (!this.model.get(\"preDisabled\")) {\n\t\t\tthis.model.set({ disabled: false });\n\t\t\tthis.model.unset(\"preDisabled\");\n\t\t}\n\t},\n\n\tonDisabledChange: function onDisabledChange() {\n\t\tif (this.model.get(\"disabled\")) this.$el.addClass(\"disabled\");else this.$el.removeClass(\"disabled\");\n\t},\n\n\t// Handle potential dupe events from closing action\n\tonChosenSelectedChange: _.debounce(function (model) {\n\t\t/* eslint-disable no-invalid-this */\n\n\t\tif (!this.collection.contains(model)) return;\n\n\t\tthis.onSelectionChange(model);\n\n\t\t/* eslint-disable no-invalid-this */\n\t}, 10),\n\n\tonValueChanged: function onValueChanged(value, data, suppress) {\n\t\tvar _this17 = this;\n\n\t\tthis._currentSelection = data;\n\n\t\tif (this._input) {\n\t\t\tif (this.model.get(\"inputIsSelect\")) {\n\t\t\t\t// Generate the new elements and do a wholesale replacement of the select content\n\t\t\t\tvar elems = _.map(data, function (x) {\n\t\t\t\t\treturn \"<option selected value=\\\"\" + x.id + \"\\\">\" + x.get(_this17.model.get(\"val\")) + \"</option>\";\n\t\t\t\t});\n\n\t\t\t\tthis._input.html(elems.join(\"\"));\n\t\t\t}\n\n\t\t\tif (!suppress) this._input.trigger(\"change\", data);\n\t\t}\n\n\t\t// Trigger a change event on the view itself\n\t\tif (!suppress) this.trigger(\"change\", data);\n\t},\n\n\tonCollectionSync: function onCollectionSync() {\n\t\tvar _this18 = this;\n\n\t\tif (!this._default) return;\n\n\t\tvar exists = this.collection.filter(function (x) {\n\t\t\treturn _.some(_this18._default, function (y) {\n\t\t\t\treturn y.id === x[_this18.model.get(\"key\")];\n\t\t\t});\n\t\t});\n\t\t_.each(exists, function (x) {\n\t\t\treturn x.set({ selected: true });\n\t\t});\n\t},\n\n\tupdateFilters: function updateFilters(filters) {\n\t\t_.extend(this.pagedCollection._params, filters);\n\t\tthis.pagedCollection.regenerateLinks();\n\t},\n\n\trefetch: function refetch() {\n\t\tthis.collection.reset([]);\n\n\t\tthis.fetch();\n\t},\n\n\tfetch: function fetch() {\n\t\tvar _this19 = this;\n\n\t\t// Did we get given a default selection from outside?\n\t\tif (this.model.get(\"server\") && this.model.get(\"server\").default) {\n\t\t\tvar M = this.collection.model;\n\n\t\t\tvar getModel = function getModel(e) {\n\t\t\t\tvar _$extend2;\n\n\t\t\t\treturn new M(_.extend(e, (_$extend2 = {\n\t\t\t\t\tselected: true\n\t\t\t\t}, _defineProperty(_$extend2, _this19.model.get(\"key\"), e.key || e[_this19.model.get(\"key\")]), _defineProperty(_$extend2, _this19.model.get(\"value\"), e.value || e[_this19.model.get(\"value\")]), _$extend2)));\n\t\t\t};\n\n\t\t\tvar finish = function finish(models) {\n\t\t\t\t_this19._default = models;\n\n\t\t\t\tvar exists = _this19.collection.filter(function (x) {\n\t\t\t\t\treturn _.some(_this19._default, function (y) {\n\t\t\t\t\t\treturn y.id === x[_this19.model.get(\"key\")];\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\t_.each(exists, function (x) {\n\t\t\t\t\treturn x.set({ selected: true });\n\t\t\t\t});\n\n\t\t\t\t_this19.onSelectionChange(_this19._default, _this19.model.get(\"server\").default.silent, true);\n\t\t\t};\n\n\t\t\tvar models = null;\n\n\t\t\t// Do we need to fetch the defaults dynamically?\n\t\t\tif (this.model.get(\"server\").default.fetch) {\n\t\t\t\tvar fetch = this.model.get(\"server\").default.fetch;\n\t\t\t\tif (!_.isPlainObject(fetch)) fetch = { url: fetch, method: \"GET\" };\n\n\t\t\t\tvar params = this.model.get(\"server\").default.params;\n\t\t\t\tif (params && !fetch.data) {\n\t\t\t\t\tif (_.isFunction(params)) fetch.data = params();else fetch.data = params;\n\t\t\t\t}\n\n\t\t\t\tif (!fetch.dataType) fetch.dataType = \"json\";\n\n\t\t\t\tfetch.success = function (data) {\n\t\t\t\t\t_this19.model.set({ fetching: false });\n\n\t\t\t\t\tmodels = _.map(data, function (x) {\n\t\t\t\t\t\treturn getModel(x);\n\t\t\t\t\t});\n\n\t\t\t\t\tfinish(models);\n\t\t\t\t};\n\t\t\t\tfetch.error = function () {\n\t\t\t\t\t_this19.model.set({ fetching: false });\n\n\t\t\t\t\t_this19.ui.spinner.addClass(\"hide\");\n\t\t\t\t};\n\n\t\t\t\tthis.xhr = $.ajax(fetch);\n\t\t\t\tthis.model.set({ fetching: true });\n\t\t\t} else {\n\t\t\t\tif (this.model.get(\"server\").default.items) models = _.map(this.model.get(\"server\").default.items, function (x) {\n\t\t\t\t\treturn getModel(x);\n\t\t\t\t});else models = getModel(this.model.get(\"server\").default);\n\n\t\t\t\t// CompositeView doesn't listen for collection changes until after it's rendered\n\t\t\t\t// So delay the completion of the render for a tick to let that run.\n\t\t\t\tsetTimeout(function () {\n\t\t\t\t\tfinish(models);\n\t\t\t\t}, 0);\n\t\t\t}\n\t\t} else {\n\t\t\t// If there's preselected items, select it\n\t\t\tvar selected = this.collection.models;\n\n\t\t\tthis._default = selected;\n\n\t\t\tvar exists = this.collection.filter(function (x) {\n\t\t\t\treturn _.some(_this19._default, function (y) {\n\t\t\t\t\treturn y.id === x[_this19.model.get(\"key\")];\n\t\t\t\t});\n\t\t\t});\n\t\t\t_.each(exists, function (x) {\n\t\t\t\treturn x.set({ selected: true });\n\t\t\t});\n\n\t\t\tthis.onSelectionChange(this._default, this.model.get(\"silent\"), true);\n\n\t\t\tif (!selected.length) this.ui.placeholder.removeClass(\"hide\");\n\t\t}\n\n\t\tif (this.model.get(\"server\") && !this.model.get(\"server\").delayLoad && this.pagedCollection.state.totalRecords === null) this.pagedCollection.getFirstPage();\n\t},\n\n\tonRender: function onRender() {\n\t\t// Space for icons\n\t\tif (!this.model.get(\"icons\")) this.ui.head.addClass(\"hide\");\n\n\t\t// also listen for internal value changes to sync them up with the hidden element\n\t\tvar bus = Backbone.Radio.channel(this.model.get(\"busChannel\"));\n\t\tbus.on(Events.ValueChanged, this.onValueChanged.bind(this));\n\n\t\tthis.fetch();\n\t},\n\n\tonAttach: function onAttach() {\n\t\t// Set an explicit width?\n\t\tif (this.model.get(\"width\")) this.$el.css({ width: this.model.get(\"width\") }).addClass(\"selectra-fixed\");else if (this.model.get(\"flat\") && this.model.get(\"lockedList\")) this.$el.css({ width: Math.max(this.$el.width(), 100) }).addClass(\"selectra-fixed\");else this.$el.css({ width: \"\" }).addClass(\"selectra-flex\");\n\n\t\tif (this.model.get(\"autoOpenDropdown\")) this.onClick();\n\t},\n\n\tonClick: function onClick(evt) {\n\t\tif (evt) {\n\t\t\tevt.stopPropagation();\n\t\t\tevt.preventDefault();\n\t\t}\n\n\t\t// If we have any open views, close them\n\t\tif (this._dropdown) {\n\t\t\tthis.close();\n\t\t} else {\n\t\t\t// If we're disabled, do nothing\n\t\t\tif (this.model.get(\"disabled\") || this.model.get(\"fetching\")) return;\n\n\t\t\tvar location = this.$el;\n\n\t\t\tvar top = location.offset().top;\n\t\t\tif (this.model.get(\"virtualBase\")) {\n\t\t\t\tlocation = $(this._el);\n\t\t\t\ttop = location.offset().top + location.height();\n\t\t\t}\n\n\t\t\tvar left = location.offset().left + $(this.model.get(\"ddHost\"))[0].offsetLeft;\n\t\t\tvar w = location.width();\n\t\t\tvar h = location.height();\n\n\t\t\tthis.model.set({ offset: { left: left - window.pageXOffset, width: w, top: top - window.pageYOffset, height: h } });\n\n\t\t\tthis._dropdown = new Dropdown({\n\t\t\t\tcollection: this.pagedCollection,\n\t\t\t\tmodel: this.model\n\t\t\t});\n\n\t\t\tthis.listenTo(this._dropdown, \"selection:change\", this.onSelectionChange.bind(this));\n\n\t\t\t$(document).on(\"mouseup\", this.mouseUpClickHandler);\n\n\t\t\tthis.model.set({ realWidth: this.$el.width() });\n\n\t\t\t$(this.model.get(\"ddHost\")).append(this._dropdown.render().el);\n\t\t\tthis._dropdown.onAttach();\n\n\t\t\tthis.$el.addClass(\"selectra-expanded\");\n\t\t}\n\n\t\treturn false;\n\t},\n\n\trepositionDropdown: _.debounce(function () {\n\t\t/* eslint-disable no-invalid-this */\n\n\t\tif (!this._dropdown) return;\n\n\t\tvar location = this.$el;\n\n\t\tvar top = location.offset().top;\n\n\t\tif (this.model.get(\"virtualBase\")) {\n\t\t\tlocation = $(this._el);\n\t\t\ttop = location.offset().top + location.height();\n\t\t}\n\n\t\tvar left = location.offset().left + $(this.model.get(\"ddHost\"))[0].offsetLeft;\n\t\tvar w = location.width();\n\t\tvar h = location.height();\n\n\t\tthis.model.set({ offset: { left: left - window.pageXOffset, width: w, top: top - window.pageYOffset, height: h } });\n\n\t\t/* eslint-enable no-invalid-this */\n\t}, 10),\n\n\tonMouseUp: function onMouseUp(e) {\n\t\tvar container = this.$el;\n\n\t\tif (!container.is(e.target) && container.has(e.target).length === 0) {\n\t\t\tif (this._dropdown) {\n\t\t\t\tvar modal = this._dropdown.$el;\n\t\t\t\tif (!modal.is(e.target) && modal.has(e.target).length === 0) this.close();\n\t\t\t} else {\n\t\t\t\tthis.close();\n\t\t\t}\n\t\t}\n\t},\n\n\tpopulate: function populate(data) {\n\t\tvar _this20 = this;\n\n\t\tvar M = this.collection.model;\n\n\t\tvar getModel = function getModel(e) {\n\t\t\tvar _$extend3;\n\n\t\t\treturn new M(_.extend(e, (_$extend3 = {\n\t\t\t\tselected: true\n\t\t\t}, _defineProperty(_$extend3, _this20.model.get(\"key\"), e.key || e[_this20.model.get(\"key\")]), _defineProperty(_$extend3, _this20.model.get(\"value\"), e.value || e[_this20.model.get(\"value\")]), _$extend3)));\n\t\t};\n\n\t\tvar m = _.map(data, getModel);\n\n\t\tthis.onSelectionChange(m, true, false);\n\t},\n\n\tonSelectionChange: function onSelectionChange(models, suppress, defaultSelection) {\n\t\tvar _this21 = this;\n\n\t\tvar modelSet = _.flatten([models]);\n\n\t\tthis._currentSelection = models;\n\n\t\t_.each(modelSet, function (x) {\n\t\t\tif (x.get(\"selected\")) {\n\t\t\t\t_this21.collection.add(x);\n\t\t\t} else {\n\t\t\t\t_this21.collection.remove(x);\n\n\t\t\t\t// The model might have been fetched into the dropdown collection already\n\t\t\t\t// If so, flag it as unselected in there.\n\t\t\t\tvar m = _this21.pagedCollection.fullCollection.get(x.id);\n\t\t\t\tif (m) m.set({ selected: false });\n\t\t\t}\n\t\t});\n\n\t\tvar selection = this.collection.models;\n\n\t\tif (this.model.get(\"placeholder\")) {\n\t\t\tif (selection.length === 0) this.ui.placeholder.removeClass(\"hide\");else this.ui.placeholder.addClass(\"hide\");\n\t\t}\n\n\t\tvar eligible = this.model.get(\"eligibility\");\n\t\tif (eligible) {\n\t\t\t_.each(this.pagedCollection.models, function (x) {\n\t\t\t\tif (!x.get(\"selected\")) x.set({ eligible: eligible(selection, x) });\n\t\t\t});\n\t\t}\n\n\t\tvar bus = Backbone.Radio.channel(this.model.get(\"busChannel\"));\n\t\tbus.trigger(Events.ValueChanged, _.map(selection, function (x) {\n\t\t\treturn x.id;\n\t\t}), selection, suppress);\n\t\tif (this.model.get(\"virtualBase\")) this.trigger(Events.ValueChanged, selection);\n\n\t\tvar max = this.model.get(\"multiMax\");\n\t\tif (max > 0) this.model.set(\"clickable\", selection.length < max);\n\n\t\t// If we're in flat mode, set the new ellipsis carrier\n\t\tvar w = this.model.get(\"realWidth\") - 5;\n\n\t\tif (this.model.get(\"flat\") && selection.length && w) {\n\t\t\tvar carrier = this.collection.find({ ellipsis: true });\n\n\t\t\tvar wfinal = 0;\n\n\t\t\t// Iterate the selection in order until we've filled the element\n\t\t\t_.each(selection, function (e, i) {\n\t\t\t\tif (!e.has(\"realWidth\")) e.trigger(\"generateWidth\");\n\n\t\t\t\tif (wfinal < w) {\n\t\t\t\t\tvar len = e.get(\"realWidth\");\n\t\t\t\t\twfinal += len;\n\t\t\t\t\tif (i > 0) wfinal += 4;\n\n\t\t\t\t\tif (e.get(\"noshow\")) e.set({ noshow: false });\n\n\t\t\t\t\tif (wfinal >= w && carrier) carrier.set({ ellipsis: false });\n\t\t\t\t\tif (wfinal >= w && e) e.set({ ellipsis: true });\n\t\t\t\t} else {\n\t\t\t\t\te.set({ noshow: true });\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// Close the chooser maybe. Else, check if we need to reposition it.\n\t\tif (this.model.get(\"closeOnChoose\") && !defaultSelection) this.close();else this.repositionDropdown();\n\t},\n\n\t// Modeled roughly on Marionette's regions' \"show\"\n\tshow: function show() {\n\t\tvar _this22 = this;\n\n\t\tvar options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n\t\tthis.bindUIElements();\n\n\t\t// Use any explicitly-provided element, else fall back to one provided before\n\t\tvar attachPoint = options.el || this._el;\n\n\t\tif (!attachPoint) throw new Error(\"No DOM location provided to Selectra\");\n\n\t\tif (_.isString(options) || options instanceof $) {\n\t\t\tattachPoint = options;\n\t\t\tattachPoint = $(attachPoint);\n\t\t}\n\n\t\t// If the attachment point is an input of some kind, we will steal it\n\t\t// to allow calling \"val()\" on the element later from client code\n\t\tif (attachPoint.is && attachPoint.is(\":input\")) {\n\t\t\tthis._input = attachPoint;\n\t\t\tif (this._input.is(\"select\")) this.model.set({ inputIsSelect: true });\n\n\t\t\tif (attachPoint.prop(\"disabled\")) this.model.set({ disabled: true });\n\t\t\tif (attachPoint.is(\"select\")) {\n\t\t\t\tif (attachPoint.prop(\"multiple\")) this.model.set({ multiple: true });\n\t\t\t}\n\t\t}\n\n\t\t// If the base is virtual, don't actually add it to the DOM.\n\t\t// Render it and return it for later manipulation.\n\t\tif (this.model.get(\"virtualBase\")) {\n\t\t\tthis._el = attachPoint;\n\t\t\tvar ret = this.render();\n\t\t\tsetTimeout(function () {\n\t\t\t\treturn _this22.onAttach();\n\t\t\t}, 0);\n\t\t\treturn ret;\n\t\t}\n\n\t\tif (this._input) {\n\t\t\t// Hide the input\n\t\t\tthis._input.css({ display: \"none\" });\n\t\t\t// Add a dummy option if needed\n\t\t\t//if ($(\"option\", this._input).length === 0)\n\t\t\t//\tthis._input.append(\"<option value='' selected/>\");\n\n\t\t\t// And show Selectra\n\t\t\tattachPoint.after(this.render().el);\n\t\t\tsetTimeout(function () {\n\t\t\t\treturn _this22.onAttach();\n\t\t\t}, 0);\n\t\t} else if (attachPoint instanceof Backbone.Marionette.Region) {\n\t\t\tattachPoint.show(this);\n\t\t} else {\n\t\t\tattachPoint.append(this.render().el);\n\t\t\tsetTimeout(function () {\n\t\t\t\treturn _this22.onAttach();\n\t\t\t}, 0);\n\t\t}\n\t},\n\n\tgetValue: function getValue() {\n\t\tvar options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n\t\tvar bus = Backbone.Radio.channel(this.model.get(\"busChannel\"));\n\t\treturn bus.request(Events.Requests.Value, options);\n\t},\n\n\tval: function val() {\n\t\tvar options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n\t\treturn this.getValue(options);\n\t},\n\n\tgetSelected: function getSelected() {\n\t\tif (_.isUndefined(this._currentSelection)) return [];\n\n\t\treturn _.map(this._currentSelection || [], function (x) {\n\t\t\treturn x.toJSON();\n\t\t});\n\t},\n\n\tclear: function clear() {\n\t\tthis.collection.each(function (x) {\n\t\t\treturn x.set({ selected: false });\n\t\t});\n\t\tthis.onSelectionChange(this.collection.models, false);\n\n\t\tthis._currentSelection = [];\n\n\t\t// Close it if open\n\t\tvar bus = Backbone.Radio.channel(this.model.get(\"busChannel\"));\n\t\tbus.trigger(Events.Commands.Close);\n\n\t\t// Wipe all items from the current collection.\n\t\tif (this.collection.fullCollection) this.collection.fullCollection.reset([]);\n\n\t\tthis.collection.reset([]);\n\t}\n});\n\n//-------------------------------------------------------------------------//\n\n\nvar Selectra = function Selectra() {\n\tvar _this23 = this;\n\n\tvar options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n\tvar modelAttributes = _.omit(options, selectraFields, viewFields);\n\n\tmodelAttributes.busChannel = options.busChannel || \"selectra-\" + _.random(9007199254740990);\n\tmodelAttributes.key = options.server ? options.server.key || \"key\" : options.key || \"key\";\n\tmodelAttributes.value = options.server ? options.server.value || \"value\" : options.value || \"value\";\n\n\tif (modelAttributes.multiple) {\n\t\tif (modelAttributes.flat && !(\"lockedList\" in modelAttributes)) modelAttributes.lockedList = true;\n\t\tif (!(\"previewSelection\" in modelAttributes)) modelAttributes.previewSelection = false;\n\t} else {\n\t\tif (!modelAttributes.placeholder) modelAttributes.placeholder = \"< no value selected >\";\n\t\tif (modelAttributes.closeOnChoose !== false) modelAttributes.closeOnChoose = true;\n\t}\n\n\tvar serverDefaults = {\n\t\tdelayLoad: true\n\t};\n\n\tvar pagingDefaults = {\n\t\tinfinite: true\n\t};\n\n\tif (modelAttributes.server) modelAttributes.server = _.extend(serverDefaults, modelAttributes.server);\n\tif (modelAttributes.paging) modelAttributes.paging = _.extend(pagingDefaults, modelAttributes.paging);\n\n\tif (modelAttributes.allowCreation) {\n\t\tmodelAttributes.allowCreation.getKey = modelAttributes.allowCreation.getKey || _.identity;\n\t\tmodelAttributes.allowCreation.getValue = modelAttributes.allowCreation.getValue || _.identity;\n\t}\n\n\tthis.model = new BaseModel(modelAttributes);\n\n\tif (!this.model.isValid()) throw new Error(this.model.validationError);\n\n\tvar bootstrap = [];\n\tvar categories = [];\n\n\t// Couple ways to supply items to bootstrap the selection\n\t// If we're running in server mode, but delayed, then skip this.\n\tif (options.items && (!this.model.get(\"server\") || !this.model.get(\"server\").delayLoad)) {\n\t\tvar doItems = function doItems(arr) {\n\t\t\tvar set = _.compact(arr);\n\t\t\tif (_.some(set, function (x) {\n\t\t\t\treturn !_.isPlainObject(x);\n\t\t\t})) {\n\t\t\t\t// Array of primitives. The item value will be treated as the id.\n\t\t\t\treturn _.map(set, function (x) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkey: x,\n\t\t\t\t\t\tvalue: x\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn set;\n\t\t};\n\n\t\tif (_.isPlainObject(options.items)) {\n\t\t\t// Map of categories to items\n\t\t\t_.each(options.items, function (val, key) {\n\t\t\t\tif (key) categories.push(key);\n\n\t\t\t\tvar result = void 0;\n\t\t\t\tif (bootstrap.length + val.length > _this23.model.get(\"maxItems\")) result = _.take(_this23.model.get(\"maxItems\") - bootstrap.length, val);else result = val;\n\n\t\t\t\tvar i = _.map(doItems(result), function (x) {\n\t\t\t\t\tif (x.categories && !_.includes(x.categories, key)) x.categories.push(key);\n\n\t\t\t\t\tif (!x.categories) x.categories = [key];\n\n\t\t\t\t\treturn x;\n\t\t\t\t});\n\t\t\t\tbootstrap = bootstrap.concat(i);\n\t\t\t});\n\t\t} else {\n\t\t\tbootstrap = doItems(_.take(options.items, this.model.get(\"maxItems\")));\n\n\t\t\tcategories = _.uniq(_.compact(_.flatten(bootstrap.map(function (x) {\n\t\t\t\treturn x.categories;\n\t\t\t}))));\n\t\t}\n\t}\n\n\tif (this.model.get(\"server\")) {\n\t\tvar Model = ItemModel.extend({\n\t\t\tidAttribute: modelAttributes.key,\n\t\t\turlRoot: modelAttributes.modelUrlRoot\n\t\t});\n\n\t\t// Holds the items we're displaying\n\t\tthis.collection = new InfiniteCollection(_.take(bootstrap, this.model.get(\"maxItems\")), {\n\t\t\tstate: {\n\t\t\t\tpageSize: this.model.get(\"paging\") ? this.model.get(\"paging\").pageSize : 9999999\n\t\t\t},\n\t\t\turl: this.model.get(\"server\").fetch,\n\t\t\tmap: this.model.get(\"server\").map,\n\t\t\tparams: this.model.get(\"server\").params || null,\n\t\t\tmodel: Model\n\t\t});\n\t} else {\n\t\tif (!this.model.get(\"showCategories\")) categories = [];\n\n\t\tif (this.model.get(\"sortCategories\")) {\n\t\t\tif (this.model.get(\"sortCategories\") === true) categories = categories.sort();else categories = _.sortBy(categories, this.model.get(\"sortCategories\"));\n\t\t}\n\n\t\t// Holds the items we're displaying\n\t\tthis.collection = new ClientCollection(bootstrap, {\n\t\t\tstate: {\n\t\t\t\tpageSize: this.model.get(\"paging\") ? this.model.get(\"paging\").pageSize : 9999999\n\t\t\t}\n\t\t});\n\n\t\tthis.collection.categories = categories;\n\t}\n\n\tvar attachPoint = options.el;\n\n\tif (attachPoint) {\n\t\tif (_.isString(attachPoint) || attachPoint instanceof $) attachPoint = $(attachPoint);\n\n\t\t// Check for properties on the attachment element\n\t\tif (attachPoint.is && attachPoint.is(\":input\")) {\n\t\t\tif (attachPoint.prop(\"disabled\")) this.model.set({ disabled: true });\n\t\t\tif (attachPoint.is(\"select\") && attachPoint.prop(\"multiple\") && !this.model.get(\"multiple\")) {\n\t\t\t\tthis.model.set({ multiple: true });\n\t\t\t\t// We may have set these values earlier, before we knew this was a multiple element\n\t\t\t\t// Unset them here\n\t\t\t\tif (!options.placeholder) this.model.set({ placeholder: BaseModel.prototype.defaults.placeholder });\n\t\t\t\tif (options.closeOnChoose !== true) this.model.set({ closeOnChoose: BaseModel.prototype.defaults.closeOnChoose });\n\t\t\t}\n\t\t}\n\t}\n\n\t// Create the view now\n\tif (this.model.get(\"multiple\")) {\n\t\treturn new MultiBase({\n\t\t\thost: this,\n\t\t\tmodel: this.model,\n\t\t\tcollection: this.collection\n\t\t});\n\t}\n\n\treturn new SingleBase({\n\t\thost: this,\n\t\tmodel: this.model,\n\t\tcollection: this.collection\n\t});\n};\n\nSelectra.Events = Events;\nmodule.exports = Selectra;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNlbGVjdHJhLmpzIl0sIm5hbWVzIjpbIl8iLCJyZXF1aXJlIiwiJCIsIkJhY2tib25lIiwiVmlydHVhbENvbGxlY3Rpb24iLCJJbmZpbml0ZUNvbGxlY3Rpb24iLCJFdmVudHMiLCJDb21tYW5kcyIsIlNlcnZlckZldGNoIiwiQ2xvc2UiLCJSZXF1ZXN0cyIsIlJlYWxXaWR0aCIsIlZhbHVlIiwiRGlzYWJsZWQiLCJDdXJyZW50U2VsZWN0aW9uIiwiQ2xpY2thYmlsaXR5IiwiVmFsdWVDaGFuZ2VkIiwiSXRlbU1vZGVsIiwiTW9kZWwiLCJleHRlbmQiLCJkZWZhdWx0cyIsImVsaWdpYmxlIiwibG9ja2VkIiwiaWRBdHRyaWJ1dGUiLCJDbGllbnRDb2xsZWN0aW9uIiwiUGFnZWFibGVDb2xsZWN0aW9uIiwibW9kZWwiLCJtb2RlIiwidXJsIiwiX3VybCIsInNldFNlYXJjaFRlcm1zIiwibm9vcCIsIkJhc2VNb2RlbCIsImNsaWNrYWJsZSIsImRpc2FibGVkIiwibXVsdGlwbGUiLCJtdWx0aU1heCIsInNlYXJjaCIsImNoZWNrYm94ZXMiLCJ3aWR0aCIsImRlc2VsZWN0aW9uIiwic2luZ2xlRGVzZWxlY3QiLCJmbGF0IiwibWF4SXRlbXMiLCJpY29ucyIsImRkSG9zdCIsImRkSGVpZ2h0IiwiZGRXaWR0aCIsInNvcnQiLCJjbG9zZU9uQ2hvb3NlIiwiaXRlbXMiLCJzaWxlbnQiLCJzaG93Q2F0ZWdvcmllcyIsInNvcnRDYXRlZ29yaWVzIiwicGxhY2Vob2xkZXIiLCJsb2NrZWRMaXN0IiwicHJldmlld1NlbGVjdGlvbiIsImVsaWdpYmlsaXR5IiwiYXV0b09wZW5Ecm9wZG93biIsInZpcnR1YWxCYXNlIiwidmFsaWRhdGUiLCJhdHRycyIsInNlcnZlciIsImZldGNoIiwicGFnaW5nIiwicGFnZVNpemUiLCJzZWxlY3RyYUZpZWxkcyIsInZpZXdGaWVsZHMiLCJyZXNvbHZlT2JqZWN0Iiwib2JqIiwiZWFjaCIsInZhbHVlIiwia2V5IiwiaXNQbGFpbk9iamVjdCIsImlzRnVuY3Rpb24iLCJwYXNzVGhyb3VnaEZpZWxkcyIsIkRyb3Bkb3duSXRlbSIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiY2xhc3NOYW1lIiwiY2xhc3NlcyIsImdldCIsInB1c2giLCJqb2luIiwidGVtcGxhdGUiLCJkcm9wZG93bkl0ZW0iLCJ1aSIsImRlc2NyaXB0aW9uIiwiY2hlY2tib3giLCJpbWFnZSIsImV2ZW50cyIsImNsaWNrIiwibW9kZWxFdmVudHMiLCJzY3JvbGxJbnRvVmlldyIsInRlbXBsYXRlQ29udGV4dCIsImlkIiwiX29wdGlvbnMiLCJpbml0aWFsaXplIiwib3B0aW9ucyIsIm9uQ2JDbGljayIsImV2dCIsInN0b3BQcm9wYWdhdGlvbiIsInNldCIsImNiQ2xpY2siLCJvbkNsaWNrIiwicHJldmVudERlZmF1bHQiLCJidXMiLCJSYWRpbyIsImNoYW5uZWwiLCJyZXF1ZXN0Iiwic2VsZWN0ZWQiLCJvblNlbGVjdGlvbkNoYW5nZSIsInVuc2V0IiwicHJvcCIsImMiLCIkZWwiLCJhZGRDbGFzcyIsInJlbW92ZUNsYXNzIiwib25SZW5kZXIiLCJ3IiwiTWF0aCIsIm1heCIsImV4dHJhVyIsImNzcyIsInRvZ2dsZVZpc2liaWxpdHkiLCJvblNjcm9sbFRvIiwib25FbGlnaWJpbGl0eUNoYW5nZSIsIkRyb3Bkb3duU3Vic2V0IiwiQ29tcG9zaXRlVmlldyIsImNoaWxkVmlldyIsImNoaWxkVmlld09wdGlvbnMiLCJwaWNrIiwiRHJvcGRvd25DYXRlZ29yeSIsImRyb3Bkb3duQ2F0ZWdvcnkiLCJjb2xsZWN0aW9uRXZlbnRzIiwiY29sbGVjdGlvbiIsImJpbmRFdmVudHMiLCJ2aWV3IiwiYXBwZW5kIiwicmVuZGVyIiwiZWwiLCJvbkhpZGRlbkNoYW5nZSIsImJvb2wiLCJzb21lIiwieCIsIm9uRXhwbGljaXRIaWRkZW5DaGFuZ2UiLCJoIiwiaGlkZGVuIiwiRHJvcGRvd24iLCJkcm9wZG93bkhvc3QiLCJjaGlsZFZpZXdDb250YWluZXIiLCJjb250YWluZXIiLCJzZWFyY2hCYXIiLCJzZWFyY2hCb3giLCJzcGlubmVyIiwibWF4SXRlbUxpbWl0Iiwic2VhcmNoQ2xlYXJlciIsInNlbGVjdGlvbnMiLCJyZW1vdmVyIiwiZHluYW1pY0FkZCIsImFkZE5ldyIsImludGVyYWN0aXZlIiwicGFnZWRDb2xsZWN0aW9uRXZlbnRzIiwic3luYyIsInByZXZpZXdFdmVudHMiLCJyZXBseSIsImdldFZhbHVlIiwiYmluZCIsIm9uU2Nyb2xsIiwidW5iaW5kRXZlbnRzIiwicGFnZWFibGUiLCJjYXRlZ29yaWVzIiwibGVuZ3RoIiwiY29udGVudCIsIm1hcCIsImZpbHRlciIsInkiLCJoYXMiLCJpbmNsdWRlcyIsImlzQ2F0ZWdvcnkiLCJ2Y29sbGVjdGlvbiIsIkNvbGxlY3Rpb24iLCJmdWxsQ29sbGVjdGlvbiIsInByZXZpZXdDb2xsZWN0aW9uIiwic2VsZWN0aW9uIiwiZmxhdHRlbiIsImZ1bGwiLCJ0b0pTT04iLCJvbkJlZm9yZVJlbmRlciIsInN0YXRlIiwidG90YWxSZWNvcmRzIiwiZGVsYXlMb2FkIiwieGhyIiwiZ2V0Rmlyc3RQYWdlIiwib25Db2xsZWN0aW9uU3luYyIsIm9uQmVmb3JlRGVzdHJveSIsImFib3J0IiwicmVzZXRTZWFyY2giLCJvbkNvbGxlY3Rpb25SZXF1ZXN0IiwiZmV0Y2hpbmciLCJhdHRyIiwiZm9jdXMiLCJodG1sIiwiY3VycmVudFNlbGVjdGlvbiIsInN5bmNVcGRhdGUiLCJtIiwibW9kZWxzIiwiYWRkIiwiY2lkIiwicmVtb3ZlIiwidHJpZ2dlclNlbGVjdGlvbkNoYW5nZSIsImRlYm91bmNlIiwidHJpZ2dlciIsInN1YnNldCIsIm9uQXR0YWNoIiwib24iLCJyZXBvc2l0aW9uRHJvcGRvd24iLCJmaXJzdCIsIndoZXJlIiwidCIsInNjcm9sbFRvcCIsImRlbGF5RmV0Y2giLCJ0cmlnZ2VySW50ZXJhY3RpdmUiLCJjdXJyZW50VGFyZ2V0IiwiaSIsImRhdGEiLCJpbnRlcmFjdGl2ZXMiLCJjYWxsYmFjayIsImZpcnN0VGltZSIsImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50IiwiY2xpZW50V2lkdGgiLCJ3aW5kb3ciLCJpbm5lcldpZHRoIiwiY2xpZW50SGVpZ2h0IiwiaW5uZXJIZWlnaHQiLCJvIiwic2Nyb2xsU2lkZSIsInBhZ2VYT2Zmc2V0IiwicHJlZkgiLCJwcmVmVyIsIiRkZEhvc3QiLCJiY3IiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJzaWRld2F5cyIsImxlZnQiLCJyZWR1Y2VkIiwib3B0cyIsInBDbGFzcyIsImNUb3AiLCJ0b3AiLCJoZWlnaHQiLCJhYnMiLCJib3R0b20iLCJkcmF3UG9zaXRpb24iLCJCb29sZWFuIiwiTVNJbnB1dE1ldGhvZENvbnRleHQiLCJkb2N1bWVudE1vZGUiLCJmaW5kIiwic2V0VGltZW91dCIsIm9uU2VhcmNoQ2xpY2siLCJvblNlYXJjaENoYW5nZSIsInRvTG93ZXIiLCJ0cmltIiwidmFsIiwibGFzdFNlYXJjaCIsInZhbHVlRmllbGQiLCJjb2wiLCJtYXRjaGVzIiwicmVqZWN0IiwidW5NYXRjaGVzIiwib25TZWFyY2hDbGVhckNsaWNrIiwib25TZWFyY2hTZWxlY3QiLCJ3aGljaCIsInRocm90dGxlIiwic2Nyb2xsUG9zIiwic2Nyb2xsSGVpZ2h0IiwiaGFzTmV4dFBhZ2UiLCJnZXROZXh0UGFnZSIsImNsZWFyRnVsbFNlbGVjdGlvbiIsImUiLCJhZGREeW5hbWljSXRlbSIsImdldEtleSIsIk0iLCJfY29tbW9uQWRkIiwiYWRkTmV3SXRlbSIsImFkZGluZ0l0ZW0iLCJoaWRlT25DbGljayIsInRoZW4iLCJyZXN1bHQiLCJ0eXBlIiwiYWRkSXRlbSIsInNhdmUiLCJkYXRhVHlwZSIsIm1ldGhvZCIsInBhcmFtcyIsInN1Y2Nlc3MiLCJzYXZlRmlyc3QiLCJlcnJvciIsImFqYXgiLCJNdWx0aUl0ZW0iLCJtdWx0aUl0ZW0iLCJnZW5lcmF0ZVdpZHRoIiwiZGVzZWxlY3RhYmxlIiwicmVhbFdpZHRoIiwib25DbG9zZSIsInRvZ2dsZUVsbGlwc2lzIiwiU2luZ2xlQmFzZSIsInNpbmdsZUJhc2UiLCJoYXNQbGFjZWhvbGRlciIsInAiLCJ0ZXh0IiwiaGVhZEltYWdlIiwiaGVhZCIsImRyb3Bkb3duIiwiZ2xvYmFsQ2xvc2VyIiwiZG93bkFycm93IiwiX2N1cnJlbnRTZWxlY3Rpb24iLCJ1bmRlZmluZWQiLCJtb3VzZVVwQ2xpY2tIYW5kbGVyIiwib25Nb3VzZVVwIiwiY2xvc2UiLCJsaXN0ZW5UbyIsImNsZWFyIiwib2ZmIiwiX2Ryb3Bkb3duIiwiZGVzdHJveSIsIm9uRmV0Y2hDaGFuZ2UiLCJwcmUiLCJwcmVEaXNhYmxlZCIsIm9uRGlzYWJsZWRDaGFuZ2UiLCJvblZhbHVlQ2hhbmdlZCIsInN1cHByZXNzIiwiX2lucHV0IiwiX2RlZmF1bHQiLCJleGlzdHMiLCJkZWZhdWx0IiwiX2QiLCJpc0FycmF5IiwicHJvcHMiLCJsb2NhdGlvbiIsIm9mZnNldCIsIl9lbCIsIm9mZnNldExlZnQiLCJwYWdlWU9mZnNldCIsImlzIiwidGFyZ2V0IiwibW9kYWwiLCJkZWZhdWx0U2VsZWN0aW9uIiwic2hvdyIsImJpbmRVSUVsZW1lbnRzIiwiYXR0YWNoUG9pbnQiLCJFcnJvciIsImlzU3RyaW5nIiwiaW5wdXRJc1NlbGVjdCIsImRpc3BsYXkiLCJhZnRlciIsIlJlZ2lvbiIsImdldFNlbGVjdGVkIiwiaXNVbmRlZmluZWQiLCJyZXNldCIsIm9uR2xvYmFsQ2xvc2UiLCJNdWx0aUJhc2UiLCJtdWx0aUJhc2UiLCJwYWdlZENvbGxlY3Rpb24iLCJmaWVsZCIsImNvbXBhcmF0b3IiLCJvbkNob3NlblNlbGVjdGVkQ2hhbmdlIiwiY29udGFpbnMiLCJlbGVtcyIsInVwZGF0ZUZpbHRlcnMiLCJmaWx0ZXJzIiwiX3BhcmFtcyIsInJlZ2VuZXJhdGVMaW5rcyIsInJlZmV0Y2giLCJnZXRNb2RlbCIsImZpbmlzaCIsInBvcHVsYXRlIiwibW9kZWxTZXQiLCJjYXJyaWVyIiwiZWxsaXBzaXMiLCJ3ZmluYWwiLCJsZW4iLCJub3Nob3ciLCJyZXQiLCJTZWxlY3RyYSIsIm1vZGVsQXR0cmlidXRlcyIsIm9taXQiLCJidXNDaGFubmVsIiwicmFuZG9tIiwic2VydmVyRGVmYXVsdHMiLCJwYWdpbmdEZWZhdWx0cyIsImluZmluaXRlIiwiYWxsb3dDcmVhdGlvbiIsImlkZW50aXR5IiwiaXNWYWxpZCIsInZhbGlkYXRpb25FcnJvciIsImJvb3RzdHJhcCIsImRvSXRlbXMiLCJjb21wYWN0IiwiYXJyIiwidGFrZSIsImNvbmNhdCIsInVuaXEiLCJ1cmxSb290IiwibW9kZWxVcmxSb290Iiwic29ydEJ5IiwicHJvdG90eXBlIiwiaG9zdCIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsSUFBSUQsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNRSxXQUFXRixRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNRyxvQkFBb0JILFFBQVEsNkJBQVIsQ0FBMUI7O0FBRUEsSUFBTUkscUJBQXFCSixRQUFRLHNCQUFSLENBQTNCOztBQUVBLElBQU1LLFNBQVM7QUFDZEMsV0FBVTtBQUNUQyxlQUFhLDZCQURKO0FBRVRDLFNBQU87QUFGRSxFQURJO0FBS2RDLFdBQVU7QUFDVEMsYUFBVywyQkFERjtBQUVUQyxTQUFPLHVCQUZFO0FBR1RDLFlBQVUsMEJBSEQ7QUFJVEMsb0JBQWtCLGtDQUpUO0FBS1RDLGdCQUFjO0FBTEwsRUFMSTtBQVlkQyxlQUFjO0FBWkEsQ0FBZjs7QUFlQSxJQUFNQyxZQUFZZCxTQUFTZSxLQUFULENBQWVDLE1BQWYsQ0FBc0I7QUFDdkNDLFdBQVU7QUFDVEMsWUFBVSxJQURELEVBQ1M7QUFDbEJDLFVBQVEsS0FGQyxDQUVRO0FBQ2xCOzs7Ozs7O0lBSFUsRUFENkI7O0FBYXZDQyxjQUFhO0FBYjBCLENBQXRCLENBQWxCOztBQWdCQSxJQUFNQyxtQkFBbUJyQixTQUFTc0Isa0JBQVQsQ0FBNEJOLE1BQTVCLENBQW1DO0FBQzNETyxRQUFPVCxTQURvRDs7QUFHM0RVLE9BQU0sUUFIcUQ7O0FBSzNEQyxNQUFLLGVBQVc7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U0FBVixDQUFvQm5ZLFFBQXBCLENBQTZCNkIsYUFBOUMsRUFBZjtBQUNEO0FBQ0Q7QUFDRDs7QUFFRDtBQUNBLEtBQUksS0FBS3ZCLEtBQUwsQ0FBV3VELEdBQVgsQ0FBZSxVQUFmLENBQUosRUFBZ0M7QUFDL0IsU0FBTyxJQUFJeVIsU0FBSixDQUFjO0FBQ3BCOEMsU0FBTSxJQURjO0FBRXBCOVgsVUFBTyxLQUFLQSxLQUZRO0FBR3BCNkcsZUFBWSxLQUFLQTtBQUhHLEdBQWQsQ0FBUDtBQUtBOztBQUVELFFBQU8sSUFBSTRLLFVBQUosQ0FBZTtBQUNyQnFHLFFBQU0sSUFEZTtBQUVyQjlYLFNBQU8sS0FBS0EsS0FGUztBQUdyQjZHLGNBQVksS0FBS0E7QUFISSxFQUFmLENBQVA7QUFLQSxDQXZLRDs7QUF5S0EwUCxTQUFTM1gsTUFBVCxHQUFrQkEsTUFBbEI7QUFDQW1aLE9BQU9DLE9BQVAsR0FBaUJ6QixRQUFqQiIsImZpbGUiOiJzZWxlY3RyYS5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgVmlydHVhbENvbGxlY3Rpb24gPSByZXF1aXJlKFwiYmFja2JvbmUudmlydHVhbC1jb2xsZWN0aW9uXCIpO1xuXG5jb25zdCBJbmZpbml0ZUNvbGxlY3Rpb24gPSByZXF1aXJlKFwiLi9pbmZpbml0ZUNvbGxlY3Rpb25cIik7XG5cbmNvbnN0IEV2ZW50cyA9IHtcblx0Q29tbWFuZHM6IHtcblx0XHRTZXJ2ZXJGZXRjaDogXCJFdmVudHMuQ29tbWFuZHMuU2VydmVyRmV0Y2hcIixcblx0XHRDbG9zZTogXCJFdmVudHMuQ29tbWFuZHMuQ2xvc2VcIixcblx0fSxcblx0UmVxdWVzdHM6IHtcblx0XHRSZWFsV2lkdGg6IFwiRXZlbnRzLlJlcXVlc3RzLlJlYWxXaWR0aFwiLFxuXHRcdFZhbHVlOiBcIkV2ZW50cy5SZXF1ZXN0cy5WYWx1ZVwiLFxuXHRcdERpc2FibGVkOiBcIkV2ZW50cy5SZXF1ZXN0cy5EaXNhYmxlZFwiLFxuXHRcdEN1cnJlbnRTZWxlY3Rpb246IFwiRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRTZWxlY3Rpb25cIixcblx0XHRDbGlja2FiaWxpdHk6IFwiRXZlbnRzLlJlcXVlc3RzLkNsaWNrYWJpbGl0eVwiLFxuXHR9LFxuXHRWYWx1ZUNoYW5nZWQ6IFwiRXZlbnRzLlZhbHVlQ2hhbmdlZFwiLFxufTtcblxuY29uc3QgSXRlbU1vZGVsID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHtcblx0XHRlbGlnaWJsZTogdHJ1ZSxcdFx0XHQvLyBpcyB0aGUgaXRlbSBlbGlnaWJsZSBmb3Igc2VsZWN0aW9uIHVuZGVyIHRoZSBjdXJyZW50IHN1Yi1zZWxlY3Rpb25cblx0XHRsb2NrZWQ6IGZhbHNlLFx0XHRcdC8vIGlmIGFuIGl0ZW0gaXMgbG9ja2VkLCBpdCBjYW5ub3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0XG5cdC8qXHR2YWx1ZTogXCJcIixcdFx0XHRcdC8vIHRoZSB0ZXh0IHRoYXQgd2lsbCBnZXQgc2hvd25cblx0XHRjYXRlZ29yaWVzOiBbXSxcdFx0XHQvLyBpcyB0aGlzIGl0ZW0gYXNzb2NpYXRlZCB3aXRoIGFueSBjYXRlZ29yaWVzP1xuXHRcdHNlbGVjdGVkOiBmYWxzZSxcdFx0Ly8gaXMgdGhpcyBpdGVtIHNlbGVjdGVkP1xuXHRcdGltYWdlOiBudWxsLFx0XHRcdC8vIGRvZXMgdGhpcyBpdGVtIGhhdmUgYSBwcmVmaXhpbmcgaW1hZ2U/XG5cdFx0aWNvbjogbnVsbCxcdFx0XHRcdC8vIGRvZXMgdGhpcyBpdGVtIGhhdmUgYSBwcmVmaXhpbmcgRkEgaWNvbj9cblx0XHRpY29uQ29sb3VyOiBcInJlZFwiLFx0XHQvLyB3aGF0IGNvbG91ciBzaG91bGQgdGhlIGljb24gYmUsIGlmIHByZXNlbnQ/XG5cdFx0ZGVzYzogbnVsbCxcdFx0XHRcdC8vIHNvbWUgdGV4dCB0aGF0IGRpc3BsYXlzIHVuZGVyIHRoZSBpdGVtLCBvcHRpb25hbGx5XG5cdCovfSxcblxuXHRpZEF0dHJpYnV0ZTogXCJrZXlcIixcbn0pO1xuXG5jb25zdCBDbGllbnRDb2xsZWN0aW9uID0gQmFja2JvbmUuUGFnZWFibGVDb2xsZWN0aW9uLmV4dGVuZCh7XG5cdG1vZGVsOiBJdGVtTW9kZWwsXG5cblx0bW9kZTogXCJjbGllbnRcIixcblxuXHR1cmw6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLl91cmw7XG5cdH0sXG5cblx0c2V0U2VhcmNoVGVybXM6IF8ubm9vcCxcbn0pO1xuXG5cblxuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vL1xuXG5cblxuY29uc3QgQmFzZU1vZGVsID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHtcblx0XHRjbGlja2FibGU6IHRydWUsXHRcdFx0Ly8gaXMgdGhlIGVsZW1lbnQgY2xpY2thYmxlP1xuXG5cdFx0ZGlzYWJsZWQ6IGZhbHNlLFx0XHRcdC8vIGlzIHRoaXMgaW5wdXQgZGlzYWJsZWQ/XG5cdFx0bXVsdGlwbGU6IGZhbHNlLFx0XHRcdC8vIGFsbG93IG11bHRpcGxlIHNlbGVjdGlvbnM/XG5cdFx0bXVsdGlNYXg6IDk5OTk5OSxcdFx0XHQvLyBpZiBpbiBtdWx0aSBtb2RlLCBob3cgbWFueSBzZWxlY3Rpb25zIG1heD9cblx0XHRzZWFyY2g6IHRydWUsXHRcdFx0XHQvLyBjYW4gdXNlcnMgc2VhcmNoP1xuXHRcdGNoZWNrYm94ZXM6IGZhbHNlLFx0XHRcdC8vIHNob3VsZCBpdGVtcyBzaG93IGNoZWNrYm94ZXMgaW5zdGVhZCBvZiBjaGFuZ2luZyBjb2xvdXI/XG5cdFx0d2lkdGg6IG51bGwsXHRcdFx0XHQvLyBleHBsaWNpdCB3aWR0aFxuXHRcdGRlc2VsZWN0aW9uOiB0cnVlLFx0XHRcdC8vIGNhbiB1c2VycyBkZXNlbGVjdCB2YWx1ZXM/XG5cdFx0c2luZ2xlRGVzZWxlY3Q6IGZhbHNlLFx0XHQvLyBjYW4gdGhlIHNlbGVjdGlvbiB2YWx1ZSBvZiBzaW5nbGUgZHJvcGRvd25zIGJlIHdpcGVkP1xuXHRcdGZsYXQ6IGZhbHNlLFx0XHRcdFx0Ly8gcmVuZGVyIHdpdGggYSBmbGF0IHN0eWxlIHRvIHJlc2VtYmxlIGlubGluZSB0ZXh0P1xuXHRcdG1heEl0ZW1zOiAxMDAwLFx0XHRcdFx0Ly8gbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdG8gc2hvdyBpbiB0aGUgZHJvcGRvd25cblx0XHRpY29uczogZmFsc2UsXHRcdFx0XHQvLyBzaG91bGQgaWNvbnMgYmUgZGlzcGxheWVkIGZvciBpdGVtcz9cblx0XHRkZEhvc3Q6IFwiI21vZGFsc1wiLFx0XHRcdC8vIHRoZSBET00gZWxlbWVudCB0aGF0IHRoZSBkcm9wZG93biB3aWxsIGJlIGF0dGFjaGVkIHRvXG5cdFx0ZGRIZWlnaHQ6IDQwMCxcdFx0XHRcdC8vIGhlaWdodCBvZiBkcm9wZG93biBib3ggaW4gcGl4ZWxzXG5cdFx0ZGRXaWR0aDogbnVsbCxcdFx0XHRcdC8vIG92ZXJyaWRlIHdpZHRoIG9mIHRoZSBkcm9wZG93blxuXHRcdHNvcnQ6IHRydWUsXHRcdFx0XHRcdC8vIHNob3VsZCB0aGUgZGlzcGxheSBzb3J0IGFscGhhYmV0aWNhbGx5PyBDYW4gYWxzbyBwcm92aWRlIGEgZnVuY3Rpb24uXG5cdFx0Y2xvc2VPbkNob29zZTogZmFsc2UsXHRcdC8vIGNsb3NlIHRoZSBkcm9wZG93biB3aGVuIHRoZSBzZWxlY3Rpb24gaXMgY2hhbmdlZFxuXHRcdGl0ZW1zOiBudWxsLFx0XHRcdFx0Ly8gdGhlIGl0ZW1zIHRvIHNob3cgYnkgZGVmYXVsdFxuXHRcdHNpbGVudDogdHJ1ZSxcdFx0XHRcdC8vIHNlbmQgYW4gaW5pdGlhbCBldmVudCBmb3IgZGVmYXVsdCBpdGVtcyBvciBub3Q/XG5cdFx0c2hvd0NhdGVnb3JpZXM6IGZhbHNlLFx0XHQvLyBzaG93IGNhdGVnb3JpZXMgaWYgcHJlc2VudD9cblx0XHRzb3J0Q2F0ZWdvcmllczogdHJ1ZSxcdFx0Ly8gdXNlIHRoZSBhbHBoYWJldGljYWwgb3JkZXIgb2YgY2F0ZWdvcmllcyAoZm9yIGFuIGFycmF5KSBvciBkZWZpbmUgYSBzb3J0IGZ1bmN0aW9uXG5cdFx0cGxhY2Vob2xkZXI6IGZhbHNlLFx0XHRcdC8qXHRhIHN0cmluZyBvciBhIGZ1bmN0aW9uIHRvIHVzZSB0byBkZXRlcm1pbmUgdGhlIHZhbHVlIHRvIHNob3cgYXMgYSBwbGFjZWhvbGRlciBpZlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRubyB2YWx1ZXMgYXJlIHNlbGVjdGVkLiBPcHRpb25zIG9iamVjdCBpcyBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLiAqL1xuXHRcdGxvY2tlZExpc3Q6IGZhbHNlLFx0XHRcdC8vIGlmIHRoZSBsaXN0IGlzIGxvY2tlZCwgeW91IGNhbiBvbmx5IGFkZCBhbmQgcmVtb3ZlIGl0ZW1zIGZyb20gdGhlIGRyb3Bkb3duXG5cdFx0cHJldmlld1NlbGVjdGlvbjogZmFsc2UsXHQvLyBzaG93IGFsbCBzZWxlY3RlZCBpdGVtcyBhdCB0aGUgdG9wIG9mIHRoZSBib3hcblx0XHRlbGlnaWJpbGl0eTogZmFsc2UsXHRcdFx0LyogXHRtdXN0IGJlIGEgZnVuY3Rpb24uIFdpbGwgYmUgZ2l2ZW4gYW4gYXJyYXkgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9ucywgYW5kXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9uZSB1bnNlbGVjdGVkIGl0ZW0sIGFuZCBtdXN0IHJldHVybiBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGF0IGl0ZW0gaXNcblx0XHRcdFx0XHRcdFx0XHRcdFx0c2VsZWN0YWJsZSAqL1xuXHRcdGF1dG9PcGVuRHJvcGRvd246IGZhbHNlLFx0Ly8gc2hvdWxkIHRoZSBkcm9wZG93biBhdXRvbWF0aWNhbGx5IG9wZW4gYWZ0ZXIgcmVuZGVyP1xuXHRcdHZpcnR1YWxCYXNlOiBmYWxzZSxcdFx0XHQvKiBtYWtlIHRoZSBiYXNlIGVsZW1lbnQgdmlydHVhbD8gSXQgd2lsbCBub3Qgc2hvdyBpbiB0aGUgRE9NLCBhbmQgdGhlIGRyb3Bkb3duXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHdpbGwgcG9zaXRpb24gaXRzZWxmIGJhc2VkIG9uIHRoZSBhdHRhY2htZW50IGVsZW1lbnQgcmF0aGVyIHRoYW4gdGhlIGJhc2UuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdENsaWNrcyBvbiB0aGUgYXR0YWNobWVudCBlbGVtZW50ICovXG5cdFx0Lypcblx0XHRzZXJ2ZXI6IHtcdFx0XHRcdFx0Ly8gd2lsbCB3ZSBiZSBkb2luZyBmZXRjaGVzIGZyb20gdGhlIHNlcnZlcj9cblx0XHRcdGZldGNoOiBudWxsLFx0XHRcdC8vIHdpbGwgbG9hZCB0aGUgZGF0YSB3aXRoIFhIUiBmcm9tIHRoaXMgVVJMLiBSZXF1aXJlZC5cblx0XHRcdHBhcmFtczogbnVsbCxcdFx0XHQvLyBhbiBvYmplY3QsIG9yIGZ1bmN0aW9uIHRoYXQgaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIGFuIG9iamVjdCwgb2YgcHJvcGVydGllcyB3aGljaCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBxdWVyeXN0cmluZyBvZiB0aGUgZmV0Y2guXG5cdFx0XHRkZWxheUxvYWQ6IHRydWUsXHRcdC8vIGRvbid0IGRvIGFuIGluaXRpYWwgZmV0Y2ggZnJvbSB0aGUgc2VydmVyLCBvbmx5IHJ1biBvbiBpbml0aWFsIG9wZW5cblx0XHRcdG1hcDogbnVsbCxcdFx0XHRcdC8vIGEgbWFwcGluZyBmdW5jdGlvbiB0byB0cmFuc2Zvcm0gdGhlIGRhdGEgZnJvbSB0aGUgc2VydmVyIGJlZm9yZSB1c2Vcblx0XHRcdGtleTogbnVsbCxcdFx0XHRcdC8vIHRoZSBuYW1lIG9mIHRoZSBrZXkgZmllbGQgaW4gdGhlIHNlcnZlciBkYXRhXG5cdFx0XHR2YWx1ZTogbnVsbCxcdFx0XHQvLyB0aGUgbmFtZSBvZiB0aGUgdmFsdWUgZmllbGQgaW4gdGhlIHNlcnZlciBkYXRhXG5cdFx0XHRkZWZhdWx0OiB7XHRcdFx0XHQvLyBzaG93IGEgdmFsdWUgKG9yIGFycmF5IG9mIHZhbHVlcykgYXMgcHJlc2VsZWN0ZWQgYnkgZGVmYXVsdFxuXHRcdFx0XHRrZXk6IG51bGwsXHRcdFx0Ly8ga2V5IG9mIHRoZSBzaW5nbGUgZGVmYXVsdFxuXHRcdFx0XHR2YWx1ZTogbnVsbCxcdFx0Ly8gdmFsdWUgb2YgdGhlIHNpbmdsZSBkZWZhdWx0XG5cdFx0XHRcdHNpbGVudDogZmFsc2UsXHRcdC8vIGRvbid0IHNlbmQgYW4gZXZlbnQgbm90aWZ5aW5nIGFib3V0IHRoZSBuZXcgdmFsdWUocylcblx0XHRcdFx0aXRlbXM6IFtdLFx0XHRcdC8vIGlmIHlvdSBuZWVkIHRvIHBhc3MgbXVsdGlwbGUgZGVmYXVsdHMuIE9iamVjdHMgb2YgdGhlIGZvcm0geyBrZXk6IC4uLiwgdmFsdWU6IC4uLiB9LiBXaWxsIHVzZSBhbnkga2V5L3ZhbHVlIHNldHRpbmdzIGRlZmluZWQgb25lIGxldmVsIHVwLlxuXHRcdFx0XHRmZXRjaDogbnVsbCxcdFx0Ly8gd2lsbCBsb2FkIHRoZSBkZWZhdWx0cyBmcm9tIHRoaXMgVVJMLiBDYW4gYWxzbyBiZSBhbiBvYmplY3QsIHdoaWNoIHdpbGwgdGhlbiBiZSBwYXNzZWQgdG8galF1ZXJ5J3MgQWpheCBjYWxsIHZlcmJhdGltLlxuXHRcdFx0XHRwYXJhbXM6IG51bGwsXHRcdC8vIGFuIG9iamVjdCwgb3IgZnVuY3Rpb24gdGhhdCBpcyBleHBlY3RlZCB0byByZXR1cm4gYW4gb2JqZWN0LCBvZiBwcm9wZXJ0aWVzIHdoaWNoIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHF1ZXJ5c3RyaW5nIG9mIHRoZSBkZWZhdWx0LWZldGNoLlxuXHRcdFx0fSxcblx0XHR9LFxuXHRcdHBhZ2luZzoge1x0XHRcdFx0XHQvLyBzaG91bGQgdGhlIHJlc3VsdHMgYmUgcGFnZWQ/XG5cdFx0XHRwYWdlU2l6ZTogbnVsbCwgXHRcdC8vIGhvdyBtYW55IGl0ZW1zIHBlciBwYWdlLiBSZXF1aXJlZC5cblx0XHRcdGluZmluaXRlOiB0cnVlLFx0XHRcdC8vIHNob3VsZCB0aGUgc3lzdGVtIGF1dG8tc2hvdyBuZXcgaXRlbXMgYXMgeW91IHNjcm9sbCBwYXN0IHRoZSBlbmRcblx0XHR9LFxuXHRcdGFsbG93Q3JlYXRpb246IHtcdFx0XHQvLyBhbGxvdyB1bm1hdGNoZWQgc2VhcmNoIGl0ZW1zIHRvIGJlIGFkZGVkIGFzIGR5bmFtaWMgbmV3IGl0ZW1zXG5cdFx0XHRtb2RlOiBcIm5vbWF0Y2hcIixcdFx0Ly8gXCJub21hdGNoXCI6IHByb21wdCB0byBtYWtlIGFuIGl0ZW0gaWYgc2VhcmNoaW5nIGFuZCBjYW4ndCBmaW5kIGEgbWF0Y2hcblx0XHRcdFx0XHRcdFx0XHRcdC8vIFwiYWx3YXlzXCI6IGFkZCBhIGZpeGVkIGl0ZW0gdG8gdGhlIGJvdHRvbSB0aGF0IGNhbiBiZSBjbGlja2VkIG9uIHRvIGNyZWF0ZSBhbiBpdGVtXG5cdFx0XHRnZXRLZXk6IG51bGwsXHRcdFx0Ly8gYSBmdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIGtleSBmb3IgdGhlIG5ldyBpdGVtLiBJcyBnaXZlbiB0aGUgdGV4dCBhcyBpbnB1dC4gRGVmYXVsdHMgdG8gdGhlIHRleHQgaWYgbm90IHNwZWNpZmllZC5cblx0XHRcdGdldFZhbHVlOiBudWxsLFx0XHRcdC8vIGEgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSB2YWx1ZSBmb3IgdGhlIG5ldyBpdGVtLiBJcyBnaXZlbiB0aGUgdGV4dCBhcyBpbnB1dC4gRGVmYXVsdHMgdG8gdGhlIHRleHQgaWYgbm90IHNwZWNpZmllZC5cblx0XHRcdGNhbGxiYWNrOiBudWxsLFx0XHRcdC8vIGlmIHNwZWNpZmllZCwgd2lsbCBiZSBpbnZva2VkIGFuZCBtdXN0IHJldHVybiBhIHsga2V5LCB2YWx1ZSB9IG9iamVjdCAocGx1cyBhZGRpdGlvbmFsIHByb3BlcnRpZXMpXG5cdFx0XHR0ZXh0OiBudWxsLFx0XHRcdFx0Ly8gY3VzdG9tIHRleHQgdG8gZGlzcGxheVxuXHRcdFx0c2VydmVyOiB7XHRcdFx0XHQvLyBzYXZlIHRoZSBuZXcgaXRlbSB0byB0aGUgc2VydmVyXG5cdFx0XHRcdHNhdmVGaXJzdDogdHJ1ZSxcdC8vIHJlcXVpcmUgdGhlIGl0ZW0gdG8gYmUgc3VjY2Vzc2Z1bGx5IHNhdmVkIHRvIHRoZSBzZXJ2ZXIgYmVmb3JlIGl0IGlzIGFkZGVkIHRvIHRoZSBkcm9wZG93bi5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIEVsc2UsIHRoZSBpdGVtIHdpbGwgYmUgaW1tZWRpYXRlbHkgc2hvd24sIGFuZCB0aGUgc2F2ZSB3aWxsIHJ1biBjb25jdXJyZW50bHkuIElmIGl0IGZhaWxzLCB0aGUgaXRlbSB3aWxsIGJlIHJlbW92ZWQuXG5cdFx0XHRcdHNhdmU6IG51bGwsXHRcdFx0Ly8gd2lsbCBzYXZlIHRoZSBkYXRhIHdpdGggWEhSIHRvIHRoaXMgdXJsLiBDYW4gYWxzbyBiZSBhbiBvYmplY3QsIHdoaWNoIHdpbGwgdGhlbiBiZSBwYXNzZWQgdG8galF1ZXJ5J3MgQWpheCBjYWxsIHZlcmJhdGltLlxuXHRcdFx0fSxcblx0XHRcdGhpZGVPbkNsaWNrOiBmYWxzZSxcdFx0Ly8gaGlkZSB0aGUgU2VsZWN0cmEgaW5zdGFuY2UgdW50aWwgd2UgZ2V0IGFuIGFuc3dlcj9cblx0XHR9LFxuXHRcdGludGVyYWN0aXZlczoge1x0XHRcdFx0Ly8gYWRkaXRpb25hbCBmaXhlZCBvcHRpb25zIHNob3duIGF0IHRoZSBib3R0b20gZm9yIHBlb3BsZSB0byBjbGljayBvbiBhbmQgZG8gdGhpbmdzXG5cdFx0XHRrZXk6IHtcdFx0XHRcdFx0Ly8gZWFjaCBpbnRlcmFjdGl2ZSBuZWVkcyBhIGtleSBpZGVudGlmaWVyLiBUaGlzIHdpbGwgYmUgZmlyZWQgYXMgYW4gZXZlbnQgXCJpbnRlcmFjdGl2ZTprZXlcIiB3aGVuIGNsaWNrZWQuXG5cdFx0XHRcdHRleHQ6IG51bGwsXHRcdFx0Ly8gdGhlIHRleHQgdG8gc2hvdyBmb3IgdGhlIGludGVyYWN0aXZlXG5cdFx0XHRcdGNhbGxiYWNrOiBudWxsLFx0XHQvLyB0aGUgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIGl0ZW0gaXMgY2xpY2tlZC4gT3B0aW9uYWwuXG5cdFx0XHR9LFxuXHRcdH1cblx0XHQqL1xuXHR9LFxuXG5cdHZhbGlkYXRlOiBmdW5jdGlvbihhdHRycykge1xuXHRcdGlmIChcInNlcnZlclwiIGluIGF0dHJzICYmICFhdHRycy5zZXJ2ZXIuZmV0Y2gpXG5cdFx0XHRyZXR1cm4gXCJZb3UgZGlkIG5vdCBzcGVjaWZ5IGEgZmV0Y2ggVVJMIGZvciBzZXJ2ZXIgbW9kZVwiO1xuXG5cdFx0aWYgKFwicGFnaW5nXCIgaW4gYXR0cnMgJiYgIWF0dHJzLnBhZ2luZy5wYWdlU2l6ZSlcblx0XHRcdHJldHVybiBcIllvdSBkaWQgbm90IHNwZWNpZnkgYSBwYWdlIHNpemUgZm9yIHBhZ2luZyBtb2RlXCI7XG5cdH0sXG59KTtcblxuXG5jb25zdCBzZWxlY3RyYUZpZWxkcyA9IFtcIml0ZW1zXCIsIFwiZWxcIl07XG5jb25zdCB2aWV3RmllbGRzID0gW107XG5cbmNvbnN0IHJlc29sdmVPYmplY3QgPSBmdW5jdGlvbihvYmopIHtcblx0Xy5lYWNoKG9iaiwgYXN5bmMgKHZhbHVlLCBrZXkpID0+IHtcblx0XHRpZiAoXy5pc1BsYWluT2JqZWN0KHZhbHVlKSlcblx0XHRcdG9ialtrZXldID0gcmVzb2x2ZU9iamVjdCh2YWx1ZSk7XG5cdFx0ZWxzZSBpZiAoXy5pc0Z1bmN0aW9uKHZhbHVlKSlcblx0XHRcdG9ialtrZXldID0gYXdhaXQgdmFsdWUoKTtcblx0XHRlbHNlXG5cdFx0XHRvYmpba2V5XSA9IGF3YWl0IHZhbHVlO1xuXHR9KTtcbn07XG5cblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy9cblxuXG5jb25zdCBwYXNzVGhyb3VnaEZpZWxkcyA9IFtcImJ1c0NoYW5uZWxcIiwgXCJrZXlcIiwgXCJ2YWx1ZVwiLCBcImljb25zXCIsIFwibXVsdGlwbGVcIiwgXCJjaGVja2JveGVzXCIsIFwiZGVzZWxlY3Rpb25cIixcblx0XCJsb2NrZWRMaXN0XCIsIFwiZGRXaWR0aFwiLCBcInNpbmdsZURlc2VsZWN0XCIsIFwibG9ja2VkXCIsIFwiYWxsb3dDcmVhdGlvblwiLCBcImludGVyYWN0aXZlc1wiXTtcblxuY29uc3QgRHJvcGRvd25JdGVtID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgY2xhc3NlcyA9IFtcImRyb3Bkb3duLWl0ZW1cIl07XG5cblx0XHRpZiAoIXRoaXMubW9kZWwuZ2V0KFwiZWxpZ2libGVcIikpXG5cdFx0XHRjbGFzc2VzLnB1c2goXCJpbmVsaWdpYmxlXCIpO1xuXG5cdFx0cmV0dXJuIGNsYXNzZXMuam9pbihcIiBcIik7XG5cdH0sXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9zZWxlY3RyYS5udW5qXCIpLmRyb3Bkb3duSXRlbSxcblxuXHR1aToge1xuXHRcdGRlc2NyaXB0aW9uOiBcIi5kZXNjcmlwdGlvblwiLFxuXHRcdHZhbHVlOiBcIi52YWx1ZVwiLFxuXHRcdGNoZWNrYm94OiBcImlucHV0W3R5cGU9J2NoZWNrYm94J11cIixcblx0XHRpbWFnZTogXCJzcGFuLmltYWdlXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0Y2xpY2s6IFwib25DbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmNoZWNrYm94XCI6IFwib25DYkNsaWNrXCIsXG5cdH0sXG5cblx0bW9kZWxFdmVudHM6IHtcblx0XHRcImNoYW5nZTpoaWRkZW5cIjogXCJ0b2dnbGVWaXNpYmlsaXR5XCIsXG5cdFx0c2Nyb2xsSW50b1ZpZXc6IFwib25TY3JvbGxUb1wiLFxuXHRcdFwiY2hhbmdlOnNlbGVjdGVkXCI6IFwib25TZWxlY3Rpb25DaGFuZ2VcIixcblx0XHRcImNoYW5nZTplbGlnaWJsZVwiOiBcIm9uRWxpZ2liaWxpdHlDaGFuZ2VcIixcblx0XHRcInRyaWdnZXI6Y2xpY2tcIjogXCJvbkNsaWNrXCIsXG5cdH0sXG5cblx0dGVtcGxhdGVDb250ZXh0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0a2V5OiAoKSA9PiB0aGlzLm1vZGVsLmlkLFxuXHRcdFx0dmFsdWU6ICgpID0+IHRoaXMubW9kZWwuZ2V0KHRoaXMuX29wdGlvbnMuZ2V0KFwidmFsdWVcIikpLFxuXHRcdFx0aWNvbnM6ICgpID0+IHRoaXMuX29wdGlvbnMuZ2V0KFwiaWNvbnNcIiksXG5cdFx0XHRjaGVja2JveGVzOiAoKSA9PiB0aGlzLl9vcHRpb25zLmdldChcImNoZWNrYm94ZXNcIiksXG5cdFx0XHRkZXNlbGVjdGlvbjogKCkgPT4gdGhpcy5fb3B0aW9ucy5nZXQoXCJkZXNlbGVjdGlvblwiKSAmJiAhdGhpcy5tb2RlbC5nZXQoXCJsb2NrZWRcIiksXG5cdFx0fTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5fb3B0aW9ucyA9IG5ldyBCYWNrYm9uZS5Nb2RlbChvcHRpb25zKTtcblx0fSxcblxuXHRvbkNiQ2xpY2s6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdHRoaXMubW9kZWwuc2V0KHsgY2JDbGljazogdHJ1ZSB9KTtcblxuXHRcdHRoaXMub25DbGljaygpO1xuXHR9LFxuXG5cdG9uQ2xpY2s6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGlmIChldnQpIHtcblx0XHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5tb2RlbC5nZXQoXCJlbGlnaWJsZVwiKSB8fCB0aGlzLm1vZGVsLmdldChcImxvY2tlZFwiKSlcblx0XHRcdHJldHVybjtcblxuXHRcdGNvbnN0IGJ1cyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwodGhpcy5fb3B0aW9ucy5nZXQoXCJidXNDaGFubmVsXCIpKTtcblx0XHRjb25zdCBjbGlja2FibGUgPSBidXMucmVxdWVzdChFdmVudHMuUmVxdWVzdHMuQ2xpY2thYmlsaXR5KTtcblxuXHRcdGlmICh0aGlzLl9vcHRpb25zLmdldChcIm11bHRpcGxlXCIpKSB7XG5cdFx0XHRpZiAoIWNsaWNrYWJsZSAmJiAhdGhpcy5tb2RlbC5nZXQoXCJzZWxlY3RlZFwiKSlcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJzZWxlY3RlZFwiKSAmJiAhdGhpcy5fb3B0aW9ucy5nZXQoXCJkZXNlbGVjdGlvblwiKSlcblx0XHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRlbHNlIGlmICh0aGlzLm1vZGVsLmdldChcInNlbGVjdGVkXCIpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5tb2RlbC5zZXQoeyBzZWxlY3RlZDogIXRoaXMubW9kZWwuZ2V0KFwic2VsZWN0ZWRcIikgfSk7XG5cdH0sXG5cblx0b25TZWxlY3Rpb25DaGFuZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLl9vcHRpb25zLmdldChcImNoZWNrYm94ZXNcIikpIHtcblx0XHRcdGlmICh0aGlzLm1vZGVsLmdldChcImNiQ2xpY2tcIikpXG5cdFx0XHRcdHJldHVybiB0aGlzLm1vZGVsLnVuc2V0KFwiY2JDbGlja1wiKTtcblxuXHRcdFx0dGhpcy51aS5jaGVja2JveC5wcm9wKFwiY2hlY2tlZFwiLCB0aGlzLm1vZGVsLmdldChcInNlbGVjdGVkXCIpKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRjb25zdCBjID0gdGhpcy5fb3B0aW9ucy5nZXQoXCJtdWx0aXBsZVwiKSA/IFwic2VsZWN0ZWQtbXVsdGlcIiA6IFwic2VsZWN0ZWRcIjtcblxuXHRcdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwic2VsZWN0ZWRcIikpXG5cdFx0XHRcdHRoaXMuJGVsLmFkZENsYXNzKGMpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyhjKTtcblx0XHR9XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIFNldCBhbiBleHBsaWNpdCB3aWR0aCB0byBhbGxvdyBlbGxpcHNlcyB0byB3b3JrXG5cdFx0Y29uc3QgYnVzID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbCh0aGlzLl9vcHRpb25zLmdldChcImJ1c0NoYW5uZWxcIikpO1xuXHRcdGNvbnN0IHcgPSBNYXRoLm1heChidXMucmVxdWVzdChFdmVudHMuUmVxdWVzdHMuUmVhbFdpZHRoKSwgdGhpcy5fb3B0aW9ucy5nZXQoXCJkZFdpZHRoXCIpKTtcblxuXHRcdGxldCBleHRyYVcgPSA1O1xuXHRcdGlmICh0aGlzLl9vcHRpb25zLmdldChcImljb25zXCIpKVxuXHRcdFx0ZXh0cmFXICs9IDI3O1xuXHRcdGlmICh0aGlzLl9vcHRpb25zLmdldChcImNoZWNrYm94ZXNcIikpXG5cdFx0XHRleHRyYVcgKz0gMjU7XG5cblx0XHR0aGlzLnVpLmRlc2NyaXB0aW9uLmNzcyh7IHdpZHRoOiAodyAtIGV4dHJhVykgKyBcInB4XCIgfSk7XG5cdFx0dGhpcy51aS52YWx1ZS5jc3MoeyB3aWR0aDogKHcgLSBleHRyYVcpICsgXCJweFwiIH0pO1xuXG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwic2VsZWN0ZWRcIikgJiYgIXRoaXMuX29wdGlvbnMuZ2V0KFwiY2hlY2tib3hlc1wiKSkge1xuXHRcdFx0Y29uc3QgYyA9IHRoaXMuX29wdGlvbnMuZ2V0KFwibXVsdGlwbGVcIikgPyBcInNlbGVjdGVkLW11bHRpXCIgOiBcInNlbGVjdGVkXCI7XG5cdFx0XHR0aGlzLiRlbC5hZGRDbGFzcyhjKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJpbWFnZVwiKSAmJiB0aGlzLl9vcHRpb25zLmdldChcImljb25zXCIpKVxuXHRcdFx0dGhpcy51aS5pbWFnZS5jc3MoeyBcImJhY2tncm91bmQtaW1hZ2VcIjogXCJ1cmwoJ1wiICsgdGhpcy5tb2RlbC5nZXQoXCJpbWFnZVwiKSArIFwiJylcIiwgXCJiYWNrZ3JvdW5kLXNpemVcIjogXCJjb250YWluXCIgfSk7XG5cdH0sXG5cblx0dG9nZ2xlVmlzaWJpbGl0eTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwiaGlkZGVuXCIpKVxuXHRcdFx0dGhpcy4kZWwuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRvblNjcm9sbFRvOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC5nZXQoMCkuc2Nyb2xsSW50b1ZpZXcoKTtcblx0fSxcblxuXHRvbkVsaWdpYmlsaXR5Q2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJlbGlnaWJsZVwiKSlcblx0XHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKFwiaW5lbGlnaWJsZVwiKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcImluZWxpZ2libGVcIik7XG5cdH0sXG59KTtcblxuY29uc3QgRHJvcGRvd25TdWJzZXQgPSBCYWNrYm9uZS5NYXJpb25ldHRlLkNvbXBvc2l0ZVZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcIml0ZW1zXCIsXG5cblx0dGVtcGxhdGU6IGZhbHNlLFxuXG5cdGNoaWxkVmlldzogRHJvcGRvd25JdGVtLFxuXG5cdGNoaWxkVmlld09wdGlvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1vZGVsLnBpY2socGFzc1Rocm91Z2hGaWVsZHMpO1xuXHR9LFxufSk7XG5cbmNvbnN0IERyb3Bkb3duQ2F0ZWdvcnkgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImRyb3Bkb3duLWNhdGVnb3J5XCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9zZWxlY3RyYS5udW5qXCIpLmRyb3Bkb3duQ2F0ZWdvcnksXG5cblx0Y29sbGVjdGlvbkV2ZW50czoge1xuXHRcdFwiY2hhbmdlOmhpZGRlblwiOiBcIm9uSGlkZGVuQ2hhbmdlXCIsXG5cdH0sXG5cblx0bW9kZWxFdmVudHM6IHtcblx0XHRcImNoYW5nZTpoaWRkZW5cIjogXCJvbkV4cGxpY2l0SGlkZGVuQ2hhbmdlXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuX29wdGlvbnMgPSBuZXcgQmFja2JvbmUuTW9kZWwob3B0aW9ucyk7XG5cblx0XHR0aGlzLmNvbGxlY3Rpb24gPSB0aGlzLm1vZGVsLmdldChcInZjb2xsZWN0aW9uXCIpO1xuXG5cdFx0dGhpcy5iaW5kRXZlbnRzKHRoaXMuY29sbGVjdGlvbiwgdGhpcy5jb2xsZWN0aW9uRXZlbnRzKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgdmlldyA9IG5ldyBEcm9wZG93blN1YnNldCh7XG5cdFx0XHRjb2xsZWN0aW9uOiB0aGlzLmNvbGxlY3Rpb24sXG5cdFx0XHRtb2RlbDogdGhpcy5fb3B0aW9ucyxcblx0XHR9KTtcblxuXHRcdHRoaXMuJGVsLmFwcGVuZCh2aWV3LnJlbmRlcigpLmVsKTtcblx0fSxcblxuXHRvbkhpZGRlbkNoYW5nZTogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgYm9vbCA9IHRoaXMuY29sbGVjdGlvbi5zb21lKHggPT4gIXguZ2V0KFwiaGlkZGVuXCIpKTtcblxuXHRcdGlmIChib29sKVxuXHRcdFx0dGhpcy4kZWwucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuJGVsLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRvbkV4cGxpY2l0SGlkZGVuQ2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBoID0gdGhpcy5tb2RlbC5nZXQoXCJoaWRkZW5cIik7XG5cblx0XHRpZiAoaClcblx0XHRcdHRoaXMuJGVsLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cblx0XHR0aGlzLmNvbGxlY3Rpb24uZWFjaCh4ID0+IHguc2V0KHsgaGlkZGVuOiBoIH0pKTtcblx0fSxcbn0pO1xuXG5jb25zdCBEcm9wZG93biA9IEJhY2tib25lLk1hcmlvbmV0dGUuQ29tcG9zaXRlVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGNsYXNzZXMgPSBbXCJzZWxlY3RyYS1kcm9wZG93blwiXTtcblxuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcImZsYXRcIikpXG5cdFx0XHRjbGFzc2VzLnB1c2goXCJzZWxlY3RyYS1mbGF0XCIpO1xuXG5cdFx0cmV0dXJuIGNsYXNzZXMuam9pbihcIiBcIik7XG5cdH0sXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9zZWxlY3RyYS5udW5qXCIpLmRyb3Bkb3duSG9zdCxcblxuXHRjaGlsZFZpZXc6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0aWYgKG1vZGVsLmdldChcImlzQ2F0ZWdvcnlcIikpXG5cdFx0XHRyZXR1cm4gRHJvcGRvd25DYXRlZ29yeTtcblx0XHRyZXR1cm4gRHJvcGRvd25JdGVtO1xuXHR9LFxuXG5cdGNoaWxkVmlld0NvbnRhaW5lcjogXCIuY29udGFpbmVyID4gLml0ZW1zXCIsXG5cblx0Y2hpbGRWaWV3T3B0aW9uczogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubW9kZWwucGljayhwYXNzVGhyb3VnaEZpZWxkcyk7XG5cdH0sXG5cblx0dWk6IHtcblx0XHRjb250YWluZXI6IFwiLmNvbnRhaW5lclwiLFxuXHRcdHNlYXJjaEJhcjogXCIuc2VhcmNoXCIsXG5cdFx0c2VhcmNoQm94OiBcIi5zZWFyY2ggaW5wdXRcIixcblx0XHRzcGlubmVyOiBcIi5zcGlubmVyXCIsXG5cdFx0aXRlbXM6IFwiLmNvbnRhaW5lciA+IC5pdGVtc1wiLFxuXHRcdG1heEl0ZW1MaW1pdDogXCIubWF4LWl0ZW0tbGltaXRcIixcblx0XHRzZWFyY2hDbGVhcmVyOiBcIi5jbGVhcmVyXCIsXG5cdFx0c2VsZWN0aW9uczogXCIuc2VsZWN0aW9uc1wiLFxuXHRcdHJlbW92ZXI6IFwiLnJlbW92ZXJcIixcblx0XHRkeW5hbWljQWRkOiBcIi5keW5hbWljLWFkZFwiLFxuXHRcdGFkZE5ldzogXCIuYWRkLW5ld1wiLFxuXHRcdGludGVyYWN0aXZlOiBcIi5pbnRlcmFjdGl2ZVwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLnNlYXJjaEJveFwiOiBcIm9uU2VhcmNoQ2xpY2tcIixcblx0XHRcImlucHV0IEB1aS5zZWFyY2hCb3hcIjogXCJvblNlYXJjaENoYW5nZVwiLFxuXHRcdFwiY2xpY2sgQHVpLnNlYXJjaENsZWFyZXJcIjogXCJvblNlYXJjaENsZWFyQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5yZW1vdmVyXCI6IFwiY2xlYXJGdWxsU2VsZWN0aW9uXCIsXG5cdFx0XCJjbGljayBAdWkuZHluYW1pY0FkZFwiOiBcImFkZER5bmFtaWNJdGVtXCIsXG5cdFx0XCJjbGljayBAdWkuYWRkTmV3XCI6IFwiYWRkTmV3SXRlbVwiLFxuXHRcdFwiY2xpY2sgQHVpLmludGVyYWN0aXZlXCI6IFwidHJpZ2dlckludGVyYWN0aXZlXCIsXG5cdFx0XCJrZXl1cCBAdWkuc2VhcmNoQm94XCI6IFwib25TZWFyY2hTZWxlY3RcIixcblx0fSxcblxuXHRwYWdlZENvbGxlY3Rpb25FdmVudHM6IHtcblx0XHRyZXF1ZXN0OiBcIm9uQ29sbGVjdGlvblJlcXVlc3RcIixcblx0XHRzeW5jOiBcIm9uQ29sbGVjdGlvblN5bmNcIixcblx0XHRcImNoYW5nZTpzZWxlY3RlZFwiOiBcIm9uU2VsZWN0aW9uQ2hhbmdlXCIsXG5cdH0sXG5cblx0Y29sbGVjdGlvbkV2ZW50czoge1xuXHRcdFwiY2hhbmdlOnNlbGVjdGVkXCI6IFwib25TZWxlY3Rpb25DaGFuZ2VcIixcblx0fSxcblxuXHRtb2RlbEV2ZW50czoge1xuXHRcdFwiY2hhbmdlOm9mZnNldFwiOiBcInJlcG9zaXRpb25Ecm9wZG93blwiLFxuXHR9LFxuXG5cdHByZXZpZXdFdmVudHM6IHtcblx0XHRcImNoYW5nZTpzZWxlY3RlZFwiOiBcIm9uU2VsZWN0aW9uQ2hhbmdlXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgYnVzID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbCh0aGlzLm1vZGVsLmdldChcImJ1c0NoYW5uZWxcIikpO1xuXHRcdGJ1cy5yZXBseShFdmVudHMuUmVxdWVzdHMuVmFsdWUsIHRoaXMuZ2V0VmFsdWUuYmluZCh0aGlzKSk7XG5cblx0XHR0aGlzLm9uU2Nyb2xsID0gdGhpcy5vblNjcm9sbC5iaW5kKHRoaXMpO1xuXG5cdFx0dGhpcy51bmJpbmRFdmVudHModGhpcy5jb2xsZWN0aW9uLCB0aGlzLmNvbGxlY3Rpb25FdmVudHMpO1xuXG5cdFx0dGhpcy5wYWdlYWJsZSA9IHRoaXMuY29sbGVjdGlvbjtcblx0XHRpZiAodGhpcy5jb2xsZWN0aW9uLmNhdGVnb3JpZXMgJiYgdGhpcy5jb2xsZWN0aW9uLmNhdGVnb3JpZXMubGVuZ3RoKSB7XG5cdFx0XHRjb25zdCBjb250ZW50ID0gXy5tYXAodGhpcy5jb2xsZWN0aW9uLmNhdGVnb3JpZXMsIHggPT4ge1xuXHRcdFx0XHQvLyBGaW5kIHRoZSBpdGVtcyB0byBzaG93IGluIHRoaXMgY2F0ZWdvcnlcblx0XHRcdFx0Y29uc3QgaXRlbXMgPSBuZXcgVmlydHVhbENvbGxlY3Rpb24odGhpcy5jb2xsZWN0aW9uLCB7XG5cdFx0XHRcdFx0ZmlsdGVyOiB5ID0+ICgheCAmJiAoIXkuaGFzKFwiY2F0ZWdvcmllc1wiKSB8fCAheS5nZXQoXCJjYXRlZ29yaWVzXCIpLmxlbmd0aCkpIHx8IF8uaW5jbHVkZXMoKHkuZ2V0KFwiY2F0ZWdvcmllc1wiKSB8fCBbXSksIHgpLFxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRyZXR1cm4gbmV3IEJhY2tib25lLk1vZGVsKHsgaXNDYXRlZ29yeTogdHJ1ZSwga2V5OiB4LCB2Y29sbGVjdGlvbjogaXRlbXMgfSk7XG5cdFx0XHR9KTtcblx0XHRcdHRoaXMuY29sbGVjdGlvbiA9IG5ldyBCYWNrYm9uZS5Db2xsZWN0aW9uKGNvbnRlbnQsIHsgbW9kZWw6IHRoaXMucGFnZWFibGUubW9kZWwgfSk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5jb2xsZWN0aW9uID0gdGhpcy5wYWdlYWJsZS5mdWxsQ29sbGVjdGlvbjtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJwcmV2aWV3U2VsZWN0aW9uXCIpKSB7XG5cdFx0XHR0aGlzLnByZXZpZXdDb2xsZWN0aW9uID0gbmV3IEJhY2tib25lLkNvbGxlY3Rpb24oW10sIHsgbW9kZWw6IHRoaXMucGFnZWFibGUubW9kZWwgfSk7XG5cdFx0XHR0aGlzLmJpbmRFdmVudHModGhpcy5wcmV2aWV3Q29sbGVjdGlvbiwgdGhpcy5wcmV2aWV3RXZlbnRzKTtcblx0XHR9XG5cblx0XHR0aGlzLmJpbmRFdmVudHModGhpcy5jb2xsZWN0aW9uLCB0aGlzLmNvbGxlY3Rpb25FdmVudHMpO1xuXHRcdHRoaXMuYmluZEV2ZW50cyh0aGlzLnBhZ2VhYmxlLCB0aGlzLnBhZ2VkQ29sbGVjdGlvbkV2ZW50cyk7XG5cdH0sXG5cblx0Z2V0VmFsdWU6IGZ1bmN0aW9uKG9wdGlvbnMgPSB7fSkge1xuXHRcdGNvbnN0IGJ1cyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwodGhpcy5tb2RlbC5nZXQoXCJidXNDaGFubmVsXCIpKTtcblx0XHRjb25zdCBzZWxlY3Rpb24gPSBfLmZsYXR0ZW4oW2J1cy5yZXF1ZXN0KEV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50U2VsZWN0aW9uKV0pO1xuXG5cdFx0aWYgKCFzZWxlY3Rpb24ubGVuZ3RoKVxuXHRcdFx0cmV0dXJuIHRoaXMubW9kZWwuZ2V0KFwibXVsdGlwbGVcIikgPyBbXSA6IG51bGw7XG5cblx0XHRpZiAob3B0aW9ucy5mdWxsKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5tb2RlbC5nZXQoXCJtdWx0aXBsZVwiKSA/XG5cdFx0XHRcdF8ubWFwKHNlbGVjdGlvbiwgeCA9PiB4LnRvSlNPTigpKSA6XG5cdFx0XHRcdHNlbGVjdGlvblswXS50b0pTT04oKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5tb2RlbC5nZXQoXCJtdWx0aXBsZVwiKSA/XG5cdFx0XHRfLm1hcChzZWxlY3Rpb24sIHggPT4geC5nZXQodGhpcy5tb2RlbC5nZXQoXCJrZXlcIikpKSA6XG5cdFx0XHRzZWxlY3Rpb25bMF0uZ2V0KHRoaXMubW9kZWwuZ2V0KFwia2V5XCIpKTtcblx0fSxcblxuXHRvbkJlZm9yZVJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwic2VydmVyXCIpKSB7XG5cdFx0XHRpZiAodGhpcy5wYWdlYWJsZS5zdGF0ZS50b3RhbFJlY29yZHMgPT09IG51bGwpIHtcblx0XHRcdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwic2VydmVyXCIpLmRlbGF5TG9hZClcblx0XHRcdFx0XHR0aGlzLnhociA9IHRoaXMucGFnZWFibGUuZ2V0Rmlyc3RQYWdlKCk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXN5bmNcblx0XHRcdFx0dGhpcy5vbkNvbGxlY3Rpb25TeW5jKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMueGhyKVxuXHRcdFx0dGhpcy54aHIuYWJvcnQoKTtcblx0XHR0aGlzLnhociA9IG51bGw7XG5cblx0XHR0aGlzLnJlc2V0U2VhcmNoKHRydWUpO1xuXHR9LFxuXG5cdG9uQ29sbGVjdGlvblJlcXVlc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMubW9kZWwuc2V0KHsgZmV0Y2hpbmc6IHRydWUgfSk7XG5cdFx0aWYgKHRoaXMudWkuc3Bpbm5lci5yZW1vdmVDbGFzcykge1xuXHRcdFx0dGhpcy51aS5zcGlubmVyLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHRoaXMudWkuc2VhcmNoQm94LmF0dHIoXCJkaXNhYmxlZFwiLCB0cnVlKTtcblx0XHR9XG5cdH0sXG5cblx0b25Db2xsZWN0aW9uU3luYzogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5tb2RlbC5zZXQoeyBmZXRjaGluZzogZmFsc2UgfSk7XG5cdFx0aWYgKHRoaXMudWkuc3Bpbm5lci5hZGRDbGFzcykge1xuXHRcdFx0dGhpcy51aS5zcGlubmVyLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHRoaXMudWkuc2VhcmNoQm94LmF0dHIoXCJkaXNhYmxlZFwiLCBmYWxzZSk7XG5cdFx0XHR0aGlzLnVpLnNlYXJjaEJveC5mb2N1cygpO1xuXG5cdFx0XHRpZiAodGhpcy5tb2RlbC5oYXMoXCJhbGxvd0NyZWF0aW9uXCIpICYmIHRoaXMubW9kZWwuZ2V0KFwiYWxsb3dDcmVhdGlvblwiKS5tb2RlID09PSBcIm5vbWF0Y2hcIiAmJiB0aGlzLnBhZ2VhYmxlLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHQvLyBObyBpdGVtcyBmb3VuZDsgc2hvdyBjcmVhdGlvbiBvcHRpb25cblx0XHRcdFx0dGhpcy51aS5keW5hbWljQWRkLmh0bWwoYE5vIG1hdGNoIGZvdW5kLiBDbGljayB0byBhZGQgYSBuZXcgaXRlbSA8c3Ryb25nPiR7dGhpcy5tb2RlbC5nZXQoXCJsYXN0U2VhcmNoXCIpfTwvc3Ryb25nPi5gKS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0dGhpcy51aS5keW5hbWljQWRkLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgYnVzID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbCh0aGlzLm1vZGVsLmdldChcImJ1c0NoYW5uZWxcIikpO1xuXHRcdFx0Y29uc3QgY3VycmVudFNlbGVjdGlvbiA9IF8uZmxhdHRlbihbYnVzLnJlcXVlc3QoRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRTZWxlY3Rpb24pXSk7XG5cblx0XHRcdHRoaXMuc3luY1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdC8vIFNvbWUgb2YgdGhlIGl0ZW1zIHdlIGZldGNoZWQgbWlnaHQgYmUgbWF0Y2hlcyBhY2NvcmRpbmcgdG8gdGhlIGFscmVhZHktc2VsZWN0ZWQgaXRlbXNcblx0XHRcdC8vIChsaWtlIGlmIGEgc2VhcmNoIHdhcyBkb25lKS4gQ2hlY2sgaWYgc28gYW5kIHRvZ2dsZSB0aGVtIGFzIG5lZWRlZC5cblx0XHRcdF8uZWFjaChjdXJyZW50U2VsZWN0aW9uLCB4ID0+IHtcblx0XHRcdFx0aWYgKCF4KVxuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRjb25zdCBtID0gdGhpcy5wYWdlYWJsZS5mdWxsQ29sbGVjdGlvbi5nZXQoeC5pZCk7XG5cdFx0XHRcdGlmIChtKVxuXHRcdFx0XHRcdG0uc2V0KHsgc2VsZWN0ZWQ6IHRydWUsIGxvY2tlZDogeC5nZXQoXCJsb2NrZWRcIikgfSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5zeW5jVXBkYXRlID0gZmFsc2U7XG5cdFx0fVxuXHR9LFxuXG5cdG9uU2VsZWN0aW9uQ2hhbmdlOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdGNvbnN0IGN1cnJlbnRTZWxlY3Rpb24gPSBfLmZpbHRlcih0aGlzLnBhZ2VhYmxlLmZ1bGxDb2xsZWN0aW9uLm1vZGVscywgeCA9PiB4LmdldChcInNlbGVjdGVkXCIpKTtcblxuXHRcdGlmICh0aGlzLnByZXZpZXdDb2xsZWN0aW9uKSB7XG5cdFx0XHRpZiAobW9kZWwuZ2V0KFwic2VsZWN0ZWRcIikpXG5cdFx0XHRcdHRoaXMucHJldmlld0NvbGxlY3Rpb24uYWRkKG1vZGVsKTtcblx0XHR9XG5cblx0XHRpZiAoIXRoaXMubW9kZWwuZ2V0KFwibXVsdGlwbGVcIikgJiYgbW9kZWwuZ2V0KFwic2VsZWN0ZWRcIikpIHtcblx0XHRcdF8uZWFjaChjdXJyZW50U2VsZWN0aW9uLCB4ID0+IHtcblx0XHRcdFx0aWYgKHguY2lkICE9PSBtb2RlbC5jaWQpIHtcblx0XHRcdFx0XHR4LnNldCh7IHNlbGVjdGVkOiBmYWxzZSB9KTtcblx0XHRcdFx0XHRpZiAodGhpcy5wcmV2aWV3Q29sbGVjdGlvbilcblx0XHRcdFx0XHRcdHRoaXMucHJldmlld0NvbGxlY3Rpb24ucmVtb3ZlKHgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRjb25zdCBlbGlnaWJsZSA9IHRoaXMubW9kZWwuZ2V0KFwiZWxpZ2liaWxpdHlcIik7XG5cdFx0aWYgKGVsaWdpYmxlKSB7XG5cdFx0XHRfLmVhY2godGhpcy5jb2xsZWN0aW9uLm1vZGVscywgeCA9PiB7XG5cdFx0XHRcdGlmICgheC5nZXQoXCJzZWxlY3RlZFwiKSlcblx0XHRcdFx0XHR4LnNldCh7IGVsaWdpYmxlOiBlbGlnaWJsZShjdXJyZW50U2VsZWN0aW9uLCB4KSB9KTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5zeW5jVXBkYXRlKVxuXHRcdFx0dGhpcy50cmlnZ2VyU2VsZWN0aW9uQ2hhbmdlKG1vZGVsKTtcblx0fSxcblxuXHR0cmlnZ2VyU2VsZWN0aW9uQ2hhbmdlOiBfLmRlYm91bmNlKGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0LyogZXNsaW50LWRpc2FibGUgbm8taW52YWxpZC10aGlzICovXG5cblx0XHR0aGlzLnRyaWdnZXIoXCJzZWxlY3Rpb246Y2hhbmdlXCIsIG1vZGVsKTtcblxuXHRcdC8qIGVzbGludC1lbmFibGUgbm8taW52YWxpZC10aGlzICovXG5cdH0sIDEwKSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwic2VhcmNoXCIpKVxuXHRcdFx0dGhpcy51aS5zZWFyY2hCYXIucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwiZmV0Y2hpbmdcIikpIHtcblx0XHRcdHRoaXMudWkuc3Bpbm5lci5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR0aGlzLnVpLnNlYXJjaEJveC5hdHRyKFwiZGlzYWJsZWRcIiwgdHJ1ZSk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy51aS5zcGlubmVyLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHRoaXMudWkuc2VhcmNoQm94LmF0dHIoXCJkaXNhYmxlZFwiLCBmYWxzZSk7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgd2UgbmVlZCB0byByZW5kZXIgc2VsZWN0ZWQgaXRlbXNcblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJwcmV2aWV3U2VsZWN0aW9uXCIpKSB7XG5cdFx0XHRjb25zdCBidXMgPSBCYWNrYm9uZS5SYWRpby5jaGFubmVsKHRoaXMubW9kZWwuZ2V0KFwiYnVzQ2hhbm5lbFwiKSk7XG5cdFx0XHRjb25zdCBjdXJyZW50U2VsZWN0aW9uID0gXy5mbGF0dGVuKFtidXMucmVxdWVzdChFdmVudHMuUmVxdWVzdHMuQ3VycmVudFNlbGVjdGlvbildKTtcblx0XHRcdGlmICghY3VycmVudFNlbGVjdGlvbi5sZW5ndGgpXG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0dGhpcy5wcmV2aWV3Q29sbGVjdGlvbi5hZGQoY3VycmVudFNlbGVjdGlvbik7XG5cblx0XHRcdGNvbnN0IHN1YnNldCA9IG5ldyBEcm9wZG93blN1YnNldCh7XG5cdFx0XHRcdG1vZGVsOiB0aGlzLm1vZGVsLFxuXHRcdFx0XHRjb2xsZWN0aW9uOiB0aGlzLnByZXZpZXdDb2xsZWN0aW9uLFxuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMudWkuc2VsZWN0aW9ucy5hcHBlbmQoc3Vic2V0LnJlbmRlcigpLmVsKTtcblx0XHRcdHRoaXMudWkuc2VsZWN0aW9ucy5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0fVxuXHR9LFxuXG5cdG9uQXR0YWNoOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLml0ZW1zLm9uKFwic2Nyb2xsXCIsIHRoaXMub25TY3JvbGwpO1xuXG5cdFx0dGhpcy5yZXBvc2l0aW9uRHJvcGRvd24odHJ1ZSk7XG5cblx0XHRjb25zdCBtb2RlbCA9IF8uZmlyc3QodGhpcy5jb2xsZWN0aW9uLndoZXJlKHsgc2VsZWN0ZWQ6IHRydWUgfSkpO1xuXHRcdGlmIChtb2RlbCkge1xuXHRcdFx0bW9kZWwudHJpZ2dlcihcInNjcm9sbEludG9WaWV3XCIpO1xuXHRcdFx0Ly8gVGhlbiwgc2Nyb2xsIHVwIGEgYml0IG1vcmUgc28gaXQncyBub3QgcmlnaHQgYXQgdGhlIHRvcCBvZiB0aGUgd2luZG93XG5cdFx0XHRjb25zdCB0ID0gdGhpcy51aS5pdGVtcy5nZXQoMCkuc2Nyb2xsVG9wO1xuXHRcdFx0dGhpcy51aS5pdGVtcy5nZXQoMCkuc2Nyb2xsVG9wID0gdCAtIDUwO1xuXHRcdH1cblxuXHRcdGNvbnN0IHNlcnZlciA9IHRoaXMubW9kZWwuZ2V0KFwic2VydmVyXCIpO1xuXHRcdGlmICghc2VydmVyIHx8ICFzZXJ2ZXIuZGVsYXlGZXRjaClcblx0XHRcdHRoaXMudWkuc2VhcmNoQm94LmZvY3VzKCk7XG5cdH0sXG5cblx0dHJpZ2dlckludGVyYWN0aXZlOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRjb25zdCBlbCA9ICQoZXZ0LmN1cnJlbnRUYXJnZXQpO1xuXHRcdGNvbnN0IGkgPSBlbC5kYXRhKFwiaWRlbnRcIik7XG5cblx0XHRjb25zdCBpbnRlcmFjdGl2ZXMgPSB0aGlzLm1vZGVsLmdldChcImludGVyYWN0aXZlc1wiKTtcblxuXHRcdHRoaXMudHJpZ2dlcihgaW50ZXJhY3RpdmU6JHtpfWApO1xuXG5cdFx0aWYgKGludGVyYWN0aXZlc1tpXS5jYWxsYmFjaylcblx0XHRcdGludGVyYWN0aXZlc1tpXS5jYWxsYmFjaygpO1xuXHR9LFxuXG5cdHJlcG9zaXRpb25Ecm9wZG93bjogZnVuY3Rpb24oZmlyc3RUaW1lKSB7XG5cdFx0Ly8gQ2hlY2sgaG93IG11Y2ggc3BhY2Ugd2UgaGF2ZSB0byB3b3JrIHdpdGg7IHdlIG1pZ2h0IG5lZWQgdG8gc2hyaW5rIHRoZSBjb250YWluZXJcblx0XHQvLyBvciBzY3JvbGwgdXB3YXJkcyBpbnN0ZWFkIG9mIGRvd25cblx0XHRjb25zdCB3ID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTtcblx0XHRjb25zdCBoID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0IHx8IDApO1xuXHRcdGNvbnN0IG8gPSB0aGlzLm1vZGVsLmdldChcIm9mZnNldFwiKTtcblx0XHRjb25zdCBzY3JvbGxTaWRlID0gd2luZG93LnBhZ2VYT2Zmc2V0O1xuXHRcdGNvbnN0IHByZWZIID0gdGhpcy5tb2RlbC5nZXQoXCJkZEhlaWdodFwiKTtcblx0XHRjb25zdCBwcmVmVyA9IE1hdGgubWF4KDIwMCwgdGhpcy5tb2RlbC5nZXQoXCJkZFdpZHRoXCIpID8gdGhpcy5tb2RlbC5nZXQoXCJkZFdpZHRoXCIpIDogby53aWR0aCk7XG5cblx0XHRjb25zdCAkZGRIb3N0ID0gJCh0aGlzLm1vZGVsLmdldChcImRkSG9zdFwiKSk7XG5cdFx0Y29uc3QgYmNyID0gJGRkSG9zdFswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuXHRcdGNvbnN0IHNpZGV3YXlzID0gKCkgPT4ge1xuXHRcdFx0by5sZWZ0ID0gby5sZWZ0IC0gYmNyLmxlZnQgKyBzY3JvbGxTaWRlO1xuXHRcdFx0Ly8gSWYgdGhlIHByZWZlcnJlZCB3aWR0aCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGVsZW1lbnQgd2lkdGgsIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgc3BlY2lhbFxuXHRcdFx0aWYgKHByZWZXIDw9IG8ud2lkdGgpXG5cdFx0XHRcdHJldHVybiBbby5sZWZ0LCBwcmVmV107XG5cblx0XHRcdC8vIElmIGl0IGlzIGJpZ2dlciwgd2UgbmVlZCB0byBzZWUgaG93IG11Y2ggd2lsbCBmaXQuIFN0YXJ0IG9mZiB3aXRoIHRoZSB0b3RhbCBzcGFjZSBhdmFpbGFibGUgdG8gdGhlIHJpZ2h0LlxuXHRcdFx0bGV0IHJlZHVjZWQgPSB3IC0gby5sZWZ0IC0gMTA7XG5cblx0XHRcdC8vIElmIHRoZSByZXZpc2VkIHdpZHRoIGlzIHNtYWxsZXIgdGhhbiB0aGUgbWluIHdpZHRoLCB0cnkgdGhlIG90aGVyIHNpZGVcblx0XHRcdGlmIChyZWR1Y2VkIDwgcHJlZlcpIHtcblx0XHRcdFx0cmVkdWNlZCA9IG8ubGVmdCAtIDEwICsgby53aWR0aDtcblx0XHRcdFx0Ly8gSWYgaXQgZml0cyBpbnRvIHRoZSBsZWZ0LCBwdXQgaXQgdGhlcmVcblx0XHRcdFx0aWYgKHJlZHVjZWQgPiBwcmVmVylcblx0XHRcdFx0XHRyZXR1cm4gWzEwLCBwcmVmV107XG5cblx0XHRcdFx0Ly8gVGhlcmUgaXNuJ3QgZW5vdWdoIHNwYWNlIHRvIHRoZSByaWdodCBPUiBsZWZ0LCBzbyBzaHJpbmsgaXQgYW5kIHNob3cgdG8gdGhlIHJpZ2h0XG5cdFx0XHRcdC8vIFRoaXMgY2FuIGJlIGltcHJvdmVkIGJ5IGNoZWNraW5nIGlmIHRoZXJlJ3MgbW9yZSBzcGFjZSBhdmFpbGFibGUgdG8gdGhlIGxlZnQgYW5kIHB1dHRpbmcgaXQgdGhlcmUgaW5zdGVhZFxuXHRcdFx0XHRyZXR1cm4gW28ubGVmdCwgdyAtIG8ubGVmdCAtIDEwXTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSXQgZml0cyBpbnRvIHRoZSByaWdodC1oYW5kIHNpZGUgZmluZVxuXHRcdFx0cmV0dXJuIFtvLmxlZnQsIHByZWZXXTtcblx0XHR9O1xuXG5cdFx0Y29uc3QgW2xlZnQsIHdpZHRoXSA9IHNpZGV3YXlzKCk7XG5cblx0XHRsZXQgb3B0cyA9IHt9LCBwQ2xhc3MgPSBcIlwiLCBjVG9wO1xuXG5cdFx0aWYgKGggLSBvLnRvcCAtIG8uaGVpZ2h0ID4gcHJlZkgpIHtcblx0XHRcdC8vIEVub3VnaCBzcGFjZSBiZWxvdyB0aGUgZWxlbWVudCwgc2hvdyBpdCB0aGVyZVxuXHRcdFx0b3B0cyA9IHtcblx0XHRcdFx0dG9wOiAoby50b3AgKyBvLmhlaWdodCAtIE1hdGguYWJzKGJjci50b3ApIC0gKHRoaXMubW9kZWwuZ2V0KFwibXVsdGlwbGVcIikgPyAodGhpcy5tb2RlbC5nZXQoXCJmbGF0XCIpID8gMCA6IDExKSA6IDMpKSArIFwicHhcIixcblx0XHRcdFx0XCJtYXgtaGVpZ2h0XCI6IHByZWZIICsgXCJweFwiLFxuXHRcdFx0fTtcblx0XHRcdGNUb3AgPSAtcHJlZkg7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKGggLSBvLnRvcCAtIG8uaGVpZ2h0IDwgcHJlZkggJiYgby50b3AgPiBwcmVmSCkge1xuXHRcdFx0Ly8gTm90IGVub3VnaCBzcGFjZSBiZWxvdywgYnV0IGVub3VnaCBzcGFjZSBhYm92ZSB0aGUgZWxlbWVudCwgc2hvdyBpdCB0aGVyZVxuXHRcdFx0b3B0cyA9IHtcblx0XHRcdFx0Ym90dG9tOiAoaCAtIG8udG9wIC0gTWF0aC5hYnMoYmNyLnRvcCkgLSAodGhpcy5tb2RlbC5nZXQoXCJtdWx0aXBsZVwiKSA/IDQgOiAyKSkgKyBcInB4XCIsXG5cdFx0XHRcdFwibWF4LWhlaWdodFwiOiBwcmVmSCArIFwicHhcIixcblx0XHRcdH07XG5cdFx0XHRjVG9wID0gcHJlZkg7XG5cdFx0XHRwQ2xhc3MgPSBcInJldmVyc2VcIjtcblx0XHR9XG5cdFx0Ly8gTm90IGVub3VnaCBzcGFjZSBhdCB0aGUgdG9wIE9SIGJvdHRvbS4gUGljayB0aGUgYmlnZ2VzdCBvbmUgYW5kIHNob3cgaXQgdGhlcmUuXG5cdFx0ZWxzZSBpZiAoaCAtIG8udG9wIC0gby5oZWlnaHQgPiBvLnRvcCkge1xuXHRcdFx0Ly8gU2hvdyBpdCB1bmRlcm5lYXRoXG5cdFx0XHRvcHRzID0ge1xuXHRcdFx0XHR0b3A6IChvLnRvcCArIG8uaGVpZ2h0IC0gTWF0aC5hYnMoYmNyLnRvcCkgLSAodGhpcy5tb2RlbC5nZXQoXCJtdWx0aXBsZVwiKSA/ICh0aGlzLm1vZGVsLmdldChcImZsYXRcIikgPyAwIDogMTEpIDogMykpICsgXCJweFwiLFxuXHRcdFx0XHRcIm1heC1oZWlnaHRcIjogKGggLSBvLnRvcCAtIG8uaGVpZ2h0IC0gMTApICsgXCJweFwiLFxuXHRcdFx0fTtcblx0XHRcdGNUb3AgPSAtKGggLSBvLnRvcCAtIG8uaGVpZ2h0IC0gMTApO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdC8vIFNob3cgaXQgb24gdG9wXG5cdFx0XHRvcHRzID0ge1xuXHRcdFx0XHRib3R0b206IChoIC0gby50b3AgKyBNYXRoLmFicyhiY3IudG9wKSAtICh0aGlzLm1vZGVsLmdldChcIm11bHRpcGxlXCIpID8gNCA6IDIpKSArIFwicHhcIixcblx0XHRcdFx0XCJtYXgtaGVpZ2h0XCI6IChvLnRvcCAtIDEwKSArIFwicHhcIixcblx0XHRcdH07XG5cdFx0XHRjVG9wID0gKG8udG9wIC0gMTApO1xuXHRcdFx0cENsYXNzID0gXCJyZXZlcnNlXCI7XG5cdFx0fVxuXG5cdFx0dGhpcy4kZWwuY3NzKF8uZXh0ZW5kKG9wdHMsIHtcblx0XHRcdGxlZnQ6IGxlZnQgKyBcInB4XCIsXG5cdFx0XHR3aWR0aDogd2lkdGggKyBcInB4XCIsXG5cdFx0fSkpO1xuXG5cdFx0dGhpcy5tb2RlbC5zZXQoeyBkcmF3UG9zaXRpb246IHBDbGFzcyB9KTtcblxuXHRcdC8vRml4IGZvciBJRTExIGRpc3BsYXkgaXNzdWVzXG5cdFx0aWYgKEJvb2xlYW4od2luZG93Lk1TSW5wdXRNZXRob2RDb250ZXh0KSAmJiBCb29sZWFuKGRvY3VtZW50LmRvY3VtZW50TW9kZSkpXG5cdFx0XHR0aGlzLiRlbC5maW5kKFwiLml0ZW1zXCIpLmNzcyhcIm1heC1oZWlnaHRcIiwgb3B0c1tcIm1heC1oZWlnaHRcIl0pO1xuXG5cdFx0aWYgKGZpcnN0VGltZSA9PT0gdHJ1ZSlcblx0XHRcdHRoaXMudWkuY29udGFpbmVyLmNzcyh7IHRvcDogY1RvcCArIFwicHhcIiwgXCJtYXgtaGVpZ2h0XCI6IG9wdHNbXCJtYXgtaGVpZ2h0XCJdIH0pLmFkZENsYXNzKHBDbGFzcyk7XG5cblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdGlmICh0aGlzLnVpLmNvbnRhaW5lciAmJiB0aGlzLnVpLmNvbnRhaW5lci5jc3MpXG5cdFx0XHRcdHRoaXMudWkuY29udGFpbmVyLmNzcyh7IHRvcDogXCIwcHhcIiB9KTtcblx0XHR9LCAwKTtcblx0fSxcblxuXHRvblNlYXJjaENsaWNrOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0ZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cdH0sXG5cblx0b25TZWFyY2hDaGFuZ2U6IF8uZGVib3VuY2UoZnVuY3Rpb24oKSB7XG5cdFx0LyogZXNsaW50LWRpc2FibGUgbm8taW52YWxpZC10aGlzICovXG5cblx0XHRjb25zdCBzZWFyY2ggPSBfLnRvTG93ZXIoXy50cmltKHRoaXMudWkuc2VhcmNoQm94LnZhbCgpKSB8fCBcIlwiKTtcblx0XHR0aGlzLm1vZGVsLnNldCh7IGxhc3RTZWFyY2g6IHNlYXJjaCB9KTtcblxuXHRcdGlmICghc2VhcmNoKVxuXHRcdFx0cmV0dXJuIHRoaXMucmVzZXRTZWFyY2goKTtcblxuXHRcdHRoaXMudWkuc2VhcmNoQ2xlYXJlci5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cblx0XHRjb25zdCB2YWx1ZUZpZWxkID0gdGhpcy5tb2RlbC5nZXQoXCJ2YWx1ZVwiKTtcblxuXHRcdC8vIFRoZW4sIHVwZGF0ZSB0aGUgcGFnZWFibGUgY29sbGVjdGlvbiBsaW5rcyB0byBpbmNsdWRlIHRoZSBmaWx0ZXJzXG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwic2VydmVyXCIpKVxuXHRcdFx0cmV0dXJuIHRoaXMucGFnZWFibGUuc2V0U2VhcmNoVGVybXMoc2VhcmNoKTtcblxuXHRcdGxldCBjb2wgPSB0aGlzLmNvbGxlY3Rpb247XG5cblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJzaG93Q2F0ZWdvcmllc1wiKSAmJiB0aGlzLnBhZ2VhYmxlLmNhdGVnb3JpZXMpIHtcblx0XHRcdC8vIERlbGVnYXRlIHRoZSBzZWFyY2hpbmcgdG8gZWFjaCBzdWItY29sbGVjdGlvblxuXHRcdFx0Y29sID0gdGhpcy5wYWdlYWJsZS5mdWxsQ29sbGVjdGlvbjtcblx0XHR9XG5cblx0XHQvLyBGaXJzdCwgbWF0Y2ggb24gdGhlIGl0ZW1zIHdlJ3ZlIGFscmVhZHkgZG93bmxvYWRlZFxuXHRcdGNvbnN0IG1hdGNoZXMgPSBfLnJlamVjdChjb2wubW9kZWxzLCB4ID0+IF8uaW5jbHVkZXMoXy50b0xvd2VyKHguZ2V0KHZhbHVlRmllbGQpKSwgc2VhcmNoKSB8fCBfLmluY2x1ZGVzKF8udG9Mb3dlcih4LmdldChcImRlc2NcIikpLCBzZWFyY2gpKTtcblxuXHRcdC8vIFVuaGlkZSBhbnkgcGFzdCBzZWFyY2hlZCBpdGVtcyB0aGF0IGFyZSBub3cgbWF0Y2hlZFxuXHRcdGNvbnN0IHVuTWF0Y2hlcyA9IF8uZmlsdGVyKGNvbC5tb2RlbHMsIHggPT4geC5nZXQoXCJoaWRkZW5cIikgJiYgIV8uZmluZChtYXRjaGVzLCB5ID0+IHkuY2lkID09PSB4LmNpZCkpO1xuXG5cdFx0Xy5lYWNoKHVuTWF0Y2hlcywgeCA9PiB4LnNldCh7IGhpZGRlbjogZmFsc2UgfSkpO1xuXHRcdF8uZWFjaChtYXRjaGVzLCB4ID0+IHguc2V0KHsgaGlkZGVuOiB0cnVlIH0pKTtcblxuXHRcdGlmICh0aGlzLm1vZGVsLmhhcyhcImFsbG93Q3JlYXRpb25cIikgJiYgbWF0Y2hlcy5sZW5ndGggPT09IGNvbC5sZW5ndGgpIHtcblx0XHRcdC8vIE5vIGl0ZW1zIGZvdW5kOyBzaG93IGNyZWF0aW9uIG9wdGlvblxuXHRcdFx0dGhpcy51aS5keW5hbWljQWRkLmh0bWwoYE5vIG1hdGNoIGZvdW5kLiBDbGljayB0byBhZGQgYSBuZXcgaXRlbSA8c3Ryb25nPiR7c2VhcmNofTwvc3Ryb25nPi5gKS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy51aS5keW5hbWljQWRkLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR9XG5cblx0XHQvKiBlc2xpbnQtZW5hYmxlIG5vLWludmFsaWQtdGhpcyAqL1xuXHR9LCA0MDApLFxuXG5cdG9uU2VhcmNoQ2xlYXJDbGljazogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0dGhpcy51aS5zZWFyY2hCb3gudmFsKFwiXCIpO1xuXHRcdHRoaXMucmVzZXRTZWFyY2goKTtcblx0fSxcblxuXHRvblNlYXJjaFNlbGVjdDogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0aWYgKHRoaXMuY29sbGVjdGlvbi5sZW5ndGggPT09IDEgJiYgZXZ0LndoaWNoID09PSAxMykge1xuXHRcdFx0dGhpcy5jb2xsZWN0aW9uLmZpcnN0KCkudHJpZ2dlcihcInRyaWdnZXI6Y2xpY2tcIik7XG5cdFx0XHR0aGlzLnVpLnNlYXJjaEJveC52YWwoXCJcIik7XG5cdFx0XHR0aGlzLnJlc2V0U2VhcmNoKCk7XG5cdFx0fVxuXHR9LFxuXG5cdHJlc2V0U2VhcmNoOiBmdW5jdGlvbihzaWxlbnQpIHtcblx0XHR0aGlzLnBhZ2VhYmxlLnNldFNlYXJjaFRlcm1zKG51bGwsIHNpbGVudCk7XG5cblx0XHR0aGlzLm1vZGVsLnVuc2V0KFwibGFzdFNlYXJjaFwiKTtcblx0XHR0aGlzLnVpLnNlYXJjaENsZWFyZXIuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0aWYgKCF0aGlzLm1vZGVsLmdldChcInNlcnZlclwiKSlcblx0XHRcdHRoaXMucGFnZWFibGUuZnVsbENvbGxlY3Rpb24uZWFjaCh4ID0+IHguc2V0KHsgaGlkZGVuOiBmYWxzZSB9KSk7XG5cdH0sXG5cblx0b25TY3JvbGw6IF8udGhyb3R0bGUoZnVuY3Rpb24oZXZ0KSB7XG5cdFx0LyogZXNsaW50LWRpc2FibGUgbm8taW52YWxpZC10aGlzICovXG5cblx0XHRjb25zdCBzY3JvbGxQb3MgPSBldnQuY3VycmVudFRhcmdldC5zY3JvbGxUb3AgKyB0aGlzLnVpLml0ZW1zLmhlaWdodCgpO1xuXHRcdGNvbnN0IGhlaWdodCA9IGV2dC5jdXJyZW50VGFyZ2V0LnNjcm9sbEhlaWdodDtcblxuXHRcdGlmIChzY3JvbGxQb3MgLyBoZWlnaHQgPiAwLjkgJiYgIXRoaXMubW9kZWwuZ2V0KFwiZmV0Y2hpbmdcIikgJiYgdGhpcy5wYWdlYWJsZS5oYXNOZXh0UGFnZSgpKSB7XG5cdFx0XHQvLyBTaG93IGEgbGl0dGxlIG1lc3NhZ2Ugc28gdGhlIHVzZXIgdW5kZXJzdGFuZHMgd2hhdCdzIGhhcHBlbmluZyBpZiB3ZSd2ZSBoaXQgbWF4IGl0ZW1zXG5cdFx0XHRpZiAodGhpcy5jb2xsZWN0aW9uLmxlbmd0aCA+PSB0aGlzLm1vZGVsLmdldChcIm1heEl0ZW1zXCIpKSB7XG5cdFx0XHRcdHRoaXMudWkubWF4SXRlbUxpbWl0LnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnBhZ2VhYmxlLmdldE5leHRQYWdlKCk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy51aS5tYXhJdGVtTGltaXQuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblxuXHRcdC8qIGVzbGludC1lbmFibGUgbm8taW52YWxpZC10aGlzICovXG5cdH0sIDI1KSxcblxuXHRjbGVhckZ1bGxTZWxlY3Rpb246IGZ1bmN0aW9uKGUpIHtcblx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0Y29uc3QgY3VycmVudFNlbGVjdGlvbiA9IHRoaXMucHJldmlld0NvbGxlY3Rpb24ubW9kZWxzO1xuXG5cdFx0aWYgKCFjdXJyZW50U2VsZWN0aW9uLmxlbmd0aClcblx0XHRcdHJldHVybjtcblxuXHRcdGlmICghdGhpcy5tb2RlbC5nZXQoXCJtdWx0aXBsZVwiKSAmJiBfLmZpcnN0KGN1cnJlbnRTZWxlY3Rpb24pLmdldChcInNlbGVjdGVkXCIpKSB7XG5cdFx0XHRfLmVhY2goY3VycmVudFNlbGVjdGlvbiwgeCA9PiB7XG5cdFx0XHRcdGlmICh4LmNpZCAhPT0gXy5maXJzdChjdXJyZW50U2VsZWN0aW9uKS5jaWQpXG5cdFx0XHRcdFx0eC5zZXQoeyBzZWxlY3RlZDogZmFsc2UgfSwgeyBzaWxlbnQ6IHRydWUgfSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAodGhpcy5tb2RlbC5nZXQoXCJtdWx0aXBsZVwiKSkge1xuXHRcdFx0Xy5lYWNoKGN1cnJlbnRTZWxlY3Rpb24sIHggPT4geC5zZXQoeyBzZWxlY3RlZDogZmFsc2UgfSkpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGVsaWdpYmxlID0gdGhpcy5tb2RlbC5nZXQoXCJlbGlnaWJpbGl0eVwiKTtcblx0XHRpZiAoZWxpZ2libGUpXG5cdFx0XHRfLmVhY2godGhpcy5wYWdlYWJsZS5mdWxsQ29sbGVjdGlvbi5tb2RlbHMsIHggPT4geC5zZXQoeyBlbGlnaWJsZTogZWxpZ2libGUoY3VycmVudFNlbGVjdGlvbiwgeCkgfSkpO1xuXG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwibXVsdGlwbGVcIikpXG5cdFx0XHR0aGlzLnRyaWdnZXIoXCJzZWxlY3Rpb246Y2hhbmdlXCIsIGN1cnJlbnRTZWxlY3Rpb24pO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMudHJpZ2dlcihcInNlbGVjdGlvbjpjaGFuZ2VcIiwgXy5maXJzdChjdXJyZW50U2VsZWN0aW9uKSk7XG5cblx0XHR0aGlzLnVpLnNlbGVjdGlvbnMuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdGFkZER5bmFtaWNJdGVtOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBvcHRpb25zID0gdGhpcy5tb2RlbC5nZXQoXCJhbGxvd0NyZWF0aW9uXCIpO1xuXG5cdFx0Y29uc3Qga2V5ID0gb3B0aW9ucy5nZXRLZXkodGhpcy5tb2RlbC5nZXQoXCJsYXN0U2VhcmNoXCIpKTtcblx0XHRjb25zdCB2YWx1ZSA9IG9wdGlvbnMuZ2V0VmFsdWUodGhpcy5tb2RlbC5nZXQoXCJsYXN0U2VhcmNoXCIpKTtcblxuXHRcdGNvbnN0IE0gPSB0aGlzLmNvbGxlY3Rpb24ubW9kZWw7XG5cdFx0Y29uc3QgbW9kZWwgPSBuZXcgTSh7IFt0aGlzLm1vZGVsLmdldChcImtleVwiKV06IGtleSwgW3RoaXMubW9kZWwuZ2V0KFwidmFsdWVcIildOiB2YWx1ZSwgc2VsZWN0ZWQ6IHRydWUgfSk7XG5cblx0XHR0aGlzLl9jb21tb25BZGQobW9kZWwsIFwiZHluYW1pY1wiKTtcblx0fSxcblxuXHRhZGROZXdJdGVtOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJhZGRpbmdJdGVtXCIpKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0Y29uc3Qgb3B0aW9ucyA9IHRoaXMubW9kZWwuZ2V0KFwiYWxsb3dDcmVhdGlvblwiKTtcblxuXHRcdHRoaXMubW9kZWwuc2V0KHsgYWRkaW5nSXRlbTogdHJ1ZSB9KTtcblxuXHRcdGlmIChvcHRpb25zLmNhbGxiYWNrKSB7XG5cdFx0XHRpZiAob3B0aW9ucy5oaWRlT25DbGljaylcblx0XHRcdFx0dGhpcy4kZWwuYWRkQ2xhc3MoXCJpbnZpc2libGVcIik7XG5cblx0XHRcdHJldHVybiBvcHRpb25zLmNhbGxiYWNrKHRoaXMsICQoZXZ0LmN1cnJlbnRUYXJnZXQpKS50aGVuKHJlc3VsdCA9PiB7XG5cdFx0XHRcdGlmIChvcHRpb25zLmhpZGVPbkNsaWNrKVxuXHRcdFx0XHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKFwiaW52aXNpYmxlXCIpO1xuXG5cdFx0XHRcdHRoaXMubW9kZWwuc2V0KHsgYWRkaW5nSXRlbTogZmFsc2UgfSk7XG5cblx0XHRcdFx0aWYgKCFyZXN1bHQpXG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdGNvbnN0IE0gPSB0aGlzLmNvbGxlY3Rpb24ubW9kZWw7XG5cdFx0XHRcdGNvbnN0IG1vZGVsID0gbmV3IE0oXy5leHRlbmQocmVzdWx0LCB7IGtleTogcmVzdWx0W3RoaXMubW9kZWwuZ2V0KFwia2V5XCIpXSwgdmFsdWU6IHJlc3VsdFt0aGlzLm1vZGVsLmdldChcInZhbHVlXCIpXSB9KSk7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXMuX2NvbW1vbkFkZChtb2RlbCwgXCJtYW51YWxcIik7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0aWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5tb2RlID09PSBcIm5vbWF0Y2hcIiAmJiB0aGlzLnBhZ2VhYmxlLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0Ly8gTm8gaXRlbXMgZm91bmQ7IHNob3cgY3JlYXRpb24gb3B0aW9uXG5cdFx0XHR0aGlzLnVpLmR5bmFtaWNBZGQuaHRtbChgTm8gbWF0Y2ggZm91bmQuIENsaWNrIHRvIGFkZCBhIG5ldyBpdGVtIDxzdHJvbmc+JHt0aGlzLm1vZGVsLmdldChcImxhc3RTZWFyY2hcIil9PC9zdHJvbmc+LmApLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLnVpLmR5bmFtaWNBZGQuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblx0fSxcblxuXHRfY29tbW9uQWRkOiBmdW5jdGlvbihtb2RlbCwgdHlwZSkge1xuXHRcdGNvbnN0IGFkZEl0ZW0gPSAoKSA9PiB7XG5cdFx0XHQvLyBBZGQgdGhlIGl0ZW0gYW5kIG1vdmUgb25cblx0XHRcdHRoaXMuY29sbGVjdGlvbi5hZGQobW9kZWwpO1xuXG5cdFx0XHRpZiAodHlwZSA9PT0gXCJkeW5hbWljXCIpXG5cdFx0XHRcdHRoaXMudWkuZHluYW1pY0FkZC5hZGRDbGFzcyhcImhpZGVcIik7XG5cblx0XHRcdHRoaXMub25TZWxlY3Rpb25DaGFuZ2UobW9kZWwpO1xuXHRcdH07XG5cblx0XHRjb25zdCBvcHRpb25zID0gdGhpcy5tb2RlbC5nZXQoXCJhbGxvd0NyZWF0aW9uXCIpO1xuXG5cdFx0aWYgKCFvcHRpb25zLnNlcnZlcilcblx0XHRcdHJldHVybiBhZGRJdGVtKCk7XG5cblx0XHRpZiAob3B0aW9ucy5zZXJ2ZXIpIHtcblx0XHRcdC8vIFdlIG5lZWQgdG8gc2F2ZSB0aGUgaXRlbSB0byB0aGUgc2VydmVyLlxuXHRcdFx0bGV0IGZldGNoID0gb3B0aW9ucy5zZXJ2ZXIuc2F2ZTtcblx0XHRcdGlmICghXy5pc1BsYWluT2JqZWN0KGZldGNoKSlcblx0XHRcdFx0ZmV0Y2ggPSB7IHVybDogZmV0Y2ggfTtcblxuXHRcdFx0aWYgKCFmZXRjaC5kYXRhVHlwZSlcblx0XHRcdFx0ZmV0Y2guZGF0YVR5cGUgPSBcImpzb25cIjtcblx0XHRcdGlmICghZmV0Y2gubWV0aG9kKVxuXHRcdFx0XHRmZXRjaC5tZXRob2QgPSBcIlBPU1RcIjtcblx0XHRcdGZldGNoLmRhdGEgPSBtb2RlbC50b0pTT04oKTtcblxuXHRcdFx0aWYgKG9wdGlvbnMuc2VydmVyLnBhcmFtcykge1xuXHRcdFx0XHRpZiAoXy5pc0Z1bmN0aW9uKG9wdGlvbnMuc2VydmVyLnBhcmFtcykpXG5cdFx0XHRcdFx0ZmV0Y2guZGF0YSA9IF8uZXh0ZW5kKGZldGNoLmRhdGEsIG9wdGlvbnMuc2VydmVyLnBhcmFtcygpKTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdGZldGNoLmRhdGEgPSBfLmV4dGVuZChmZXRjaC5kYXRhLCBvcHRpb25zLnNlcnZlci5wYXJhbXMpO1xuXHRcdFx0fVxuXG5cdFx0XHRmZXRjaC5zdWNjZXNzID0gZGF0YSA9PiB7XG5cdFx0XHRcdHRoaXMubW9kZWwuc2V0KHsgZmV0Y2hpbmc6IGZhbHNlIH0pO1xuXG5cdFx0XHRcdC8vIE1lcmdlIGFueSBkYXRhIGZyb20gdGhlIGNsaWVudFxuXHRcdFx0XHRtb2RlbC5zZXQoZGF0YSk7XG5cblx0XHRcdFx0aWYgKG9wdGlvbnMuc2VydmVyLnNhdmVGaXJzdClcblx0XHRcdFx0XHRhZGRJdGVtKCk7XG5cdFx0XHR9O1xuXG5cdFx0XHRmZXRjaC5lcnJvciA9ICgpID0+IHtcblx0XHRcdFx0dGhpcy5tb2RlbC5zZXQoeyBmZXRjaGluZzogZmFsc2UgfSk7XG5cblx0XHRcdFx0aWYgKCFvcHRpb25zLnNlcnZlci5zYXZlRmlyc3QpIHtcblx0XHRcdFx0XHRtb2RlbC5zZXQoeyBzZWxlY3RlZDogZmFsc2UgfSk7XG5cdFx0XHRcdFx0dGhpcy5jb2xsZWN0aW9uLnJlbW92ZShtb2RlbCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRcdHRoaXMubW9kZWwuc2V0KHsgZmV0Y2hpbmc6IHRydWUgfSk7XG5cdFx0XHR0aGlzLnhociA9ICQuYWpheChmZXRjaCk7XG5cblx0XHRcdGlmICghb3B0aW9ucy5zZXJ2ZXIuc2F2ZUZpcnN0KVxuXHRcdFx0XHRhZGRJdGVtKCk7XG5cdFx0fVxuXHR9LFxufSk7XG5cbmNvbnN0IE11bHRpSXRlbSA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGNsYXNzZXMgPSBbXCJzZWxlY3RyYS1tdWx0aS1pdGVtXCJdO1xuXG5cdFx0aWYgKHRoaXMub3B0aW9ucy5sb2NrZWRMaXN0KVxuXHRcdFx0Y2xhc3Nlcy5wdXNoKFwic2VsZWN0cmEtbXVsdGktbG9ja2VkXCIpO1xuXG5cdFx0cmV0dXJuIGNsYXNzZXMuam9pbihcIiBcIik7XG5cdH0sXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9zZWxlY3RyYS5udW5qXCIpLm11bHRpSXRlbSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIC5jbG9zZXJcIjogXCJvbkNsb3NlXCIsXG5cdFx0Y2xpY2s6IFwib25DbGlja1wiLFxuXHR9LFxuXG5cdG1vZGVsRXZlbnRzOiB7XG5cdFx0XCJjaGFuZ2U6ZWxsaXBzaXNcIjogXCJ0b2dnbGVFbGxpcHNpc1wiLFxuXHRcdGdlbmVyYXRlV2lkdGg6IFwiZ2VuZXJhdGVXaWR0aFwiLFxuXHRcdFwiY2hhbmdlOm5vc2hvd1wiOiBcInRvZ2dsZVZpc2liaWxpdHlcIixcblx0fSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRrZXk6ICgpID0+IHRoaXMubW9kZWwuaWQsXG5cdFx0XHR2YWx1ZTogKCkgPT4gdGhpcy5tb2RlbC5nZXQodGhpcy5fb3B0aW9ucy5nZXQoXCJ2YWx1ZVwiKSksXG5cdFx0XHRpY29uczogKCkgPT4gdGhpcy5fb3B0aW9ucy5nZXQoXCJpY29uc1wiKSxcblx0XHRcdGRlc2VsZWN0YWJsZTogKCkgPT4gIXRoaXMuX29wdGlvbnMuZ2V0KFwiZGlzYWJsZWRcIikgJiYgdGhpcy5fb3B0aW9ucy5nZXQoXCJkZXNlbGVjdGlvblwiKSAmJlxuXHRcdFx0XHQhdGhpcy5fb3B0aW9ucy5nZXQoXCJsb2NrZWRMaXN0XCIpICYmICF0aGlzLm1vZGVsLmdldChcImxvY2tlZFwiKSxcblx0XHR9O1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLl9vcHRpb25zID0gbmV3IEJhY2tib25lLk1vZGVsKG9wdGlvbnMpO1xuXHR9LFxuXG5cdG9uQ2xpY2s6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGlmICh0aGlzLl9vcHRpb25zLmdldChcImxvY2tlZExpc3RcIikpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0ZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cdH0sXG5cblx0Z2VuZXJhdGVXaWR0aDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5tb2RlbC5zZXQoeyByZWFsV2lkdGg6IHRoaXMuJGVsLndpZHRoKCkgfSk7XG5cdH0sXG5cblx0b25DbG9zZTogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0Y29uc3QgYnVzID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbCh0aGlzLl9vcHRpb25zLmdldChcImJ1c0NoYW5uZWxcIikpO1xuXHRcdGNvbnN0IGRpc2FibGVkID0gYnVzLnJlcXVlc3QoRXZlbnRzLlJlcXVlc3RzLkRpc2FibGVkKTtcblx0XHRpZiAoZGlzYWJsZWQpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLm1vZGVsLnNldCh7IHNlbGVjdGVkOiBmYWxzZSB9KTtcblx0fSxcblxuXHR0b2dnbGVFbGxpcHNpczogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwiZWxsaXBzaXNcIikpXG5cdFx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcImVsbGlwc2lzXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKFwiZWxsaXBzaXNcIik7XG5cdH0sXG5cblx0dG9nZ2xlVmlzaWJpbGl0eTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwibm9zaG93XCIpKVxuXHRcdFx0dGhpcy4kZWwuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0fSxcbn0pO1xuXG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vXG5cblxuXG5cbmNvbnN0IFNpbmdsZUJhc2UgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBjbGFzc2VzID0gW1wic2VsZWN0cmEtaG9zdFwiXTtcblxuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcImZsYXRcIikpXG5cdFx0XHRjbGFzc2VzLnB1c2goXCJzZWxlY3RyYS1mbGF0XCIpO1xuXG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwiZGlzYWJsZWRcIikpXG5cdFx0XHRjbGFzc2VzLnB1c2goXCJzZWxlY3RyYS1kaXNhYmxlZFwiKTtcblxuXHRcdHJldHVybiBjbGFzc2VzLmpvaW4oXCIgXCIpO1xuXHR9LFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi90ZW1wbGF0ZXMvc2VsZWN0cmEubnVualwiKS5zaW5nbGVCYXNlLFxuXG5cdHRlbXBsYXRlQ29udGV4dDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGhhc1BsYWNlaG9sZGVyOiAoKSA9PiBCb29sZWFuKHRoaXMubW9kZWwuZ2V0KFwicGxhY2Vob2xkZXJcIikpLFxuXHRcdFx0cGxhY2Vob2xkZXI6ICgpID0+IHtcblx0XHRcdFx0Y29uc3QgcCA9IHRoaXMubW9kZWwuZ2V0KFwicGxhY2Vob2xkZXJcIik7XG5cblx0XHRcdFx0aWYgKF8uaXNGdW5jdGlvbihwKSlcblx0XHRcdFx0XHRyZXR1cm4gcCh0aGlzLm1vZGVsLnRvSlNPTigpKTtcblxuXHRcdFx0XHRyZXR1cm4gcDtcblx0XHRcdH0sXG5cdFx0XHRzaW5nbGVEZXNlbGVjdDogKCkgPT4gdGhpcy5tb2RlbC5nZXQoXCJzaW5nbGVEZXNlbGVjdFwiKSxcblx0XHR9O1xuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdGNsaWNrOiBcIm9uQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5nbG9iYWxDbG9zZXJcIjogXCJvbkdsb2JhbENsb3NlXCIsXG5cdH0sXG5cblx0dWk6IHtcblx0XHRwbGFjZWhvbGRlcjogXCIucGxhY2Vob2xkZXJcIixcblx0XHR0ZXh0OiBcIi50ZXh0XCIsXG5cdFx0aGVhZEltYWdlOiBcIi5oZWFkLWltYWdlXCIsXG5cdFx0aGVhZDogXCIuaGVhZFwiLFxuXHRcdGRyb3Bkb3duOiBcIi5zZWxlY3RyYS1kcm9wZG93blwiLFxuXHRcdGdsb2JhbENsb3NlcjogXCIuZ2xvYmFsLWNsb3NlXCIsXG5cdFx0ZG93bkFycm93OiBcIi5mYS1jaGV2cm9uLWRvd25cIixcblx0fSxcblxuXHRtb2RlbEV2ZW50czoge1xuXHRcdFwiY2hhbmdlOmZldGNoaW5nXCI6IFwib25GZXRjaENoYW5nZVwiLFxuXHRcdFwiY2hhbmdlOmRpc2FibGVkXCI6IFwib25EaXNhYmxlZENoYW5nZVwiLFxuXHR9LFxuXG5cdGNvbGxlY3Rpb25FdmVudHM6IHtcblx0XHRzeW5jOiBcIm9uQ29sbGVjdGlvblN5bmNcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLl9jdXJyZW50U2VsZWN0aW9uID0gdW5kZWZpbmVkO1xuXG5cdFx0dGhpcy5tb3VzZVVwQ2xpY2tIYW5kbGVyID0gdGhpcy5vbk1vdXNlVXAuYmluZCh0aGlzKTtcblxuXHRcdGNvbnN0IGJ1cyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwodGhpcy5tb2RlbC5nZXQoXCJidXNDaGFubmVsXCIpKTtcblx0XHRidXMucmVwbHkoRXZlbnRzLlJlcXVlc3RzLlJlYWxXaWR0aCwgKCkgPT4gdGhpcy5tb2RlbC5nZXQoXCJyZWFsV2lkdGhcIikpO1xuXHRcdGJ1cy5vbihFdmVudHMuQ29tbWFuZHMuQ2xvc2UsIHRoaXMuY2xvc2UuYmluZCh0aGlzKSk7XG5cdFx0YnVzLnJlcGx5KEV2ZW50cy5SZXF1ZXN0cy5DbGlja2FiaWxpdHksICgpID0+IHRoaXMubW9kZWwuZ2V0KFwiY2xpY2thYmxlXCIpKTtcblx0XHRidXMucmVwbHkoRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRTZWxlY3Rpb24sICgpID0+IHRoaXMuX2N1cnJlbnRTZWxlY3Rpb24gfHwgW10pO1xuXHRcdGJ1cy5yZXBseShFdmVudHMuUmVxdWVzdHMuRGlzYWJsZWQsICgpID0+IHRoaXMubW9kZWwuZ2V0KFwiZGlzYWJsZWRcIikpO1xuXG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLCBcImNsZWFyXCIsIHRoaXMuY2xlYXIuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0Y2xvc2U6IGZ1bmN0aW9uKCkge1xuXHRcdCQoZG9jdW1lbnQpLm9mZihcIm1vdXNldXBcIiwgdGhpcy5tb3VzZVVwQ2xpY2tIYW5kbGVyKTtcblxuXHRcdGlmICh0aGlzLl9kcm9wZG93bikge1xuXHRcdFx0dGhpcy5fZHJvcGRvd24uZGVzdHJveSgpO1xuXHRcdFx0dGhpcy5fZHJvcGRvd24gPSB1bmRlZmluZWQ7XG5cdFx0XHR0aGlzLm1vZGVsLnNldCh7IGZldGNoaW5nOiBmYWxzZSB9KTtcblx0XHRcdHRoaXMudHJpZ2dlcihcImRyb3Bkb3duOmNsb3NlZFwiKTtcblx0XHR9XG5cblx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyhcInNlbGVjdHJhLWV4cGFuZGVkXCIpO1xuXHR9LFxuXG5cdG9uRmV0Y2hDaGFuZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcImZldGNoaW5nXCIpKSB7XG5cdFx0XHRjb25zdCBwcmUgPSB0aGlzLm1vZGVsLmdldChcImRpc2FibGVkXCIpO1xuXHRcdFx0dGhpcy5tb2RlbC5zZXQoeyBkaXNhYmxlZDogdHJ1ZSwgcHJlRGlzYWJsZWQ6IHByZSB9KTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoIXRoaXMubW9kZWwuZ2V0KFwicHJlRGlzYWJsZWRcIikpIHtcblx0XHRcdHRoaXMubW9kZWwuc2V0KHsgZGlzYWJsZWQ6IGZhbHNlIH0pO1xuXHRcdFx0dGhpcy5tb2RlbC51bnNldChcInByZURpc2FibGVkXCIpO1xuXHRcdH1cblx0fSxcblxuXHRvbkRpc2FibGVkQ2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJkaXNhYmxlZFwiKSkge1xuXHRcdFx0dGhpcy4kZWwuYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblx0XHRcdHRoaXMudWkuZG93bkFycm93LmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xuXHRcdFx0dGhpcy51aS5kb3duQXJyb3cucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblx0fSxcblxuXHRvblZhbHVlQ2hhbmdlZDogZnVuY3Rpb24odmFsdWUsIGRhdGEsIHN1cHByZXNzKSB7XG5cdFx0aWYgKGRhdGEgPT09IHRoaXMuX2N1cnJlbnRTZWxlY3Rpb24pXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9jdXJyZW50U2VsZWN0aW9uID0gZGF0YTtcblxuXHRcdGlmICh0aGlzLl9pbnB1dCkge1xuXHRcdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwiaW5wdXRJc1NlbGVjdFwiKSkge1xuXHRcdFx0XHRpZiAodmFsdWUgfHwgdmFsdWUgPT09IDApIHtcblx0XHRcdFx0XHQkKFwib3B0aW9uXCIsIHRoaXMuX2lucHV0KVxuXHRcdFx0XHRcdFx0LmZpcnN0KClcblx0XHRcdFx0XHRcdC5hdHRyKFwidmFsdWVcIiwgdmFsdWUpXG5cdFx0XHRcdFx0XHQuYXR0cihcInNlbGVjdGVkXCIsIHRydWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdCQoXCJvcHRpb25cIiwgdGhpcy5faW5wdXQpXG5cdFx0XHRcdFx0XHQuZmlyc3QoKVxuXHRcdFx0XHRcdFx0LmF0dHIoXCJ2YWx1ZVwiLCBcIlwiKVxuXHRcdFx0XHRcdFx0LmF0dHIoXCJzZWxlY3RlZFwiLCBmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHR0aGlzLl9pbnB1dC52YWwoZGF0YSA/IGRhdGEuaWQgOiBcIlwiKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFzdXBwcmVzcylcblx0XHRcdFx0dGhpcy5faW5wdXQudHJpZ2dlcihcImNoYW5nZVwiLCBkYXRhKTtcblx0XHR9XG5cblx0XHR0aGlzLiRlbC5hdHRyKFwidGl0bGVcIiwgZGF0YSA/IGRhdGEuZ2V0KHRoaXMubW9kZWwuZ2V0KFwidmFsdWVcIikpIDogXCJcIik7XG5cdH0sXG5cblx0b25Db2xsZWN0aW9uU3luYzogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLl9kZWZhdWx0KVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0Y29uc3QgW2V4aXN0c10gPSB0aGlzLmNvbGxlY3Rpb24uZmlsdGVyKHggPT4geFt0aGlzLm1vZGVsLmdldChcImtleVwiKV0gPT09IHRoaXMuX2RlZmF1bHQuaWQpO1xuXHRcdGlmIChleGlzdHMpXG5cdFx0XHRleGlzdHMuc2V0KHsgc2VsZWN0ZWQ6IHRydWUgfSk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIFNldCBhbiBleHBsaWNpdCB3aWR0aD9cblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJ3aWR0aFwiKSlcblx0XHRcdHRoaXMuJGVsLmNzcyh7IHdpZHRoOiB0aGlzLm1vZGVsLmdldChcIndpZHRoXCIpIH0pLmFkZENsYXNzKFwic2VsZWN0cmEtZml4ZWRcIik7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy4kZWwuY3NzKHsgd2lkdGg6IFwiXCIgfSkuYWRkQ2xhc3MoXCJzZWxlY3RyYS1mbGV4XCIpO1xuXG5cdFx0Ly8gU3BhY2UgZm9yIGljb25zXG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwiaWNvbnNcIikpXG5cdFx0XHR0aGlzLnVpLmhlYWRJbWFnZS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy51aS5oZWFkSW1hZ2UuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0Ly8gYWxzbyBsaXN0ZW4gZm9yIGludGVybmFsIHZhbHVlIGNoYW5nZXMgdG8gc3luYyB0aGVtIHVwIHdpdGggdGhlIGhpZGRlbiBlbGVtZW50XG5cdFx0Y29uc3QgYnVzID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbCh0aGlzLm1vZGVsLmdldChcImJ1c0NoYW5uZWxcIikpO1xuXHRcdGJ1cy5vbihFdmVudHMuVmFsdWVDaGFuZ2VkLCB0aGlzLm9uVmFsdWVDaGFuZ2VkLmJpbmQodGhpcykpO1xuXG5cdFx0Ly8gSWYgdGhlcmUncyBhIHByZXNlbGVjdGVkIGl0ZW0sIHNlbGVjdCBpdFxuXHRcdGNvbnN0IHNlbGVjdGVkID0gdGhpcy5jb2xsZWN0aW9uLndoZXJlKHsgc2VsZWN0ZWQ6IHRydWUgfSk7XG5cdFx0aWYgKHNlbGVjdGVkWzBdKVxuXHRcdFx0dGhpcy5vblNlbGVjdGlvbkNoYW5nZShzZWxlY3RlZFswXSwgdGhpcy5tb2RlbC5nZXQoXCJzaWxlbnRcIiksIHRydWUpO1xuXG5cdFx0Ly8gRGlkIHdlIGdldCBnaXZlbiBhIGRlZmF1bHQgc2VsZWN0aW9uIGZyb20gb3V0c2lkZT9cblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJzZXJ2ZXJcIikgJiYgdGhpcy5tb2RlbC5nZXQoXCJzZXJ2ZXJcIikuZGVmYXVsdCkge1xuXHRcdFx0Ly8gRG8gd2UgbmVlZCB0byBmZXRjaCB0aGUgZGVmYXVsdHMgZHluYW1pY2FsbHk/XG5cdFx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJzZXJ2ZXJcIikuZGVmYXVsdC5mZXRjaCkge1xuXHRcdFx0XHRsZXQgZmV0Y2ggPSB0aGlzLm1vZGVsLmdldChcInNlcnZlclwiKS5kZWZhdWx0LmZldGNoO1xuXHRcdFx0XHRpZiAoIV8uaXNQbGFpbk9iamVjdChmZXRjaCkpXG5cdFx0XHRcdFx0ZmV0Y2ggPSB7IHVybDogZmV0Y2gsIG1ldGhvZDogXCJHRVRcIiB9O1xuXG5cdFx0XHRcdGNvbnN0IHBhcmFtcyA9IHRoaXMubW9kZWwuZ2V0KFwic2VydmVyXCIpLmRlZmF1bHQucGFyYW1zO1xuXHRcdFx0XHRpZiAocGFyYW1zICYmICFmZXRjaC5kYXRhKSB7XG5cdFx0XHRcdFx0aWYgKF8uaXNGdW5jdGlvbihwYXJhbXMpKVxuXHRcdFx0XHRcdFx0ZmV0Y2guZGF0YSA9IHBhcmFtcygpO1xuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdGZldGNoLmRhdGEgPSBwYXJhbXM7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIWZldGNoLmRhdGFUeXBlKVxuXHRcdFx0XHRcdGZldGNoLmRhdGFUeXBlID0gXCJqc29uXCI7XG5cblx0XHRcdFx0ZmV0Y2guc3VjY2VzcyA9IF9kID0+IHtcblx0XHRcdFx0XHR0aGlzLm1vZGVsLnNldCh7IGZldGNoaW5nOiBmYWxzZSB9KTtcblxuXHRcdFx0XHRcdGxldCBkYXRhID0gX2Q7XG5cblx0XHRcdFx0XHRpZiAoXy5pc0FycmF5KGRhdGEpKVxuXHRcdFx0XHRcdFx0ZGF0YSA9IF8uZmlyc3QoZGF0YSk7XG5cblx0XHRcdFx0XHRpZiAoIWRhdGEpXG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHRpZiAoKCFkYXRhLmtleSAmJiAhKHRoaXMubW9kZWwuZ2V0KFwia2V5XCIpIGluIGRhdGEpKSB8fCAoIWRhdGEudmFsdWUgJiYgISh0aGlzLm1vZGVsLmdldChcInZhbHVlXCIpIGluIGRhdGEpKSlcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdGNvbnN0IHByb3BzID0gXy5leHRlbmQoZGF0YSwge1xuXHRcdFx0XHRcdFx0c2VsZWN0ZWQ6IHRydWUsXG5cdFx0XHRcdFx0XHRbdGhpcy5tb2RlbC5nZXQoXCJrZXlcIildOiBkYXRhLmtleSB8fCBkYXRhW3RoaXMubW9kZWwuZ2V0KFwia2V5XCIpXSxcblx0XHRcdFx0XHRcdFt0aGlzLm1vZGVsLmdldChcInZhbHVlXCIpXTogZGF0YS52YWx1ZSB8fCBkYXRhW3RoaXMubW9kZWwuZ2V0KFwidmFsdWVcIildLFxuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5ldy1jYXBcblx0XHRcdFx0XHR0aGlzLl9kZWZhdWx0ID0gbmV3IHRoaXMuY29sbGVjdGlvbi5tb2RlbChwcm9wcyk7XG5cblx0XHRcdFx0XHRjb25zdCBbZXhpc3RzXSA9IHRoaXMuY29sbGVjdGlvbi5maWx0ZXIoeCA9PiB4W3RoaXMubW9kZWwuZ2V0KFwia2V5XCIpXSA9PT0gdGhpcy5fZGVmYXVsdC5pZCk7XG5cdFx0XHRcdFx0aWYgKGV4aXN0cylcblx0XHRcdFx0XHRcdGV4aXN0cy5zZXQoeyBzZWxlY3RlZDogdHJ1ZSB9KTtcblxuXHRcdFx0XHRcdHRoaXMub25TZWxlY3Rpb25DaGFuZ2UodGhpcy5fZGVmYXVsdCwgdGhpcy5tb2RlbC5nZXQoXCJzZXJ2ZXJcIikuZGVmYXVsdC5zaWxlbnQsIHRydWUpO1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdGZldGNoLmVycm9yID0gKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMubW9kZWwuc2V0KHsgZmV0Y2hpbmc6IGZhbHNlIH0pO1xuXG5cdFx0XHRcdFx0dGhpcy51aS5zcGlubmVyLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdFx0fTtcblxuXHRcdFx0XHR0aGlzLnhociA9ICQuYWpheChmZXRjaCk7XG5cdFx0XHRcdHRoaXMubW9kZWwuc2V0KHsgZmV0Y2hpbmc6IHRydWUgfSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmICh0aGlzLm1vZGVsLmdldChcInNlcnZlclwiKS5kZWZhdWx0LmtleSAmJiB0aGlzLm1vZGVsLmdldChcInNlcnZlclwiKS5kZWZhdWx0LnZhbHVlKSB7XG5cdFx0XHRcdGNvbnN0IHByb3BzID0ge1xuXHRcdFx0XHRcdHNlbGVjdGVkOiB0cnVlLFxuXHRcdFx0XHRcdFt0aGlzLm1vZGVsLmdldChcImtleVwiKV06IHRoaXMubW9kZWwuZ2V0KFwic2VydmVyXCIpLmRlZmF1bHQua2V5LFxuXHRcdFx0XHRcdFt0aGlzLm1vZGVsLmdldChcInZhbHVlXCIpXTogdGhpcy5tb2RlbC5nZXQoXCJzZXJ2ZXJcIikuZGVmYXVsdC52YWx1ZSxcblx0XHRcdFx0fTtcblxuXHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbmV3LWNhcFxuXHRcdFx0XHR0aGlzLl9kZWZhdWx0ID0gbmV3IHRoaXMuY29sbGVjdGlvbi5tb2RlbChwcm9wcyk7XG5cblx0XHRcdFx0Y29uc3QgW2V4aXN0c10gPSB0aGlzLmNvbGxlY3Rpb24uZmlsdGVyKHggPT4geFt0aGlzLm1vZGVsLmdldChcImtleVwiKV0gPT09IHRoaXMuX2RlZmF1bHQuaWQpO1xuXHRcdFx0XHRpZiAoZXhpc3RzKVxuXHRcdFx0XHRcdGV4aXN0cy5zZXQoeyBzZWxlY3RlZDogdHJ1ZSB9KTtcblxuXHRcdFx0XHR0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKHRoaXMuX2RlZmF1bHQsIHRoaXMubW9kZWwuZ2V0KFwic2VydmVyXCIpLmRlZmF1bHQuc2lsZW50KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJzZXJ2ZXJcIikgJiYgIXRoaXMubW9kZWwuZ2V0KFwic2VydmVyXCIpLmRlbGF5TG9hZCAmJiB0aGlzLmNvbGxlY3Rpb24uc3RhdGUudG90YWxSZWNvcmRzID09PSBudWxsKVxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uLmdldEZpcnN0UGFnZSgpO1xuXHR9LFxuXG5cdG9uQ2xpY2s6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRldnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdC8vIElmIHdlIGhhdmUgYW55IG9wZW4gdmlld3MsIGNsb3NlIHRoZW1cblx0XHRpZiAodGhpcy5fZHJvcGRvd24pIHtcblx0XHRcdHRoaXMuY2xvc2UoKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHQvLyBJZiB3ZSdyZSBkaXNhYmxlZCwgZG8gbm90aGluZ1xuXHRcdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwiZGlzYWJsZWRcIikgfHwgdGhpcy5tb2RlbC5nZXQoXCJmZXRjaGluZ1wiKSlcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRsZXQgbG9jYXRpb24gPSB0aGlzLiRlbDtcblxuXHRcdFx0bGV0IHRvcCA9IGxvY2F0aW9uLm9mZnNldCgpLnRvcDtcblx0XHRcdGlmICh0aGlzLm1vZGVsLmdldChcInZpcnR1YWxCYXNlXCIpKSB7XG5cdFx0XHRcdGxvY2F0aW9uID0gJCh0aGlzLl9lbCk7XG5cdFx0XHRcdHRvcCA9IGxvY2F0aW9uLm9mZnNldCgpLnRvcCArIGxvY2F0aW9uLmhlaWdodCgpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBsZWZ0ID0gbG9jYXRpb24ub2Zmc2V0KCkubGVmdCArICQodGhpcy5tb2RlbC5nZXQoXCJkZEhvc3RcIikpWzBdLm9mZnNldExlZnQ7XG5cdFx0XHRjb25zdCB3ID0gbG9jYXRpb24ud2lkdGgoKTtcblx0XHRcdGNvbnN0IGggPSBsb2NhdGlvbi5oZWlnaHQoKTtcblxuXHRcdFx0dGhpcy5tb2RlbC5zZXQoeyBvZmZzZXQ6IHsgbGVmdDogbGVmdCAtIHdpbmRvdy5wYWdlWE9mZnNldCwgd2lkdGg6IHcsIHRvcDogdG9wIC0gd2luZG93LnBhZ2VZT2Zmc2V0LCBoZWlnaHQ6IGggfSB9KTtcblxuXHRcdFx0dGhpcy5fZHJvcGRvd24gPSBuZXcgRHJvcGRvd24oe1xuXHRcdFx0XHRjb2xsZWN0aW9uOiB0aGlzLmNvbGxlY3Rpb24sXG5cdFx0XHRcdG1vZGVsOiB0aGlzLm1vZGVsLFxuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMubGlzdGVuVG8odGhpcy5fZHJvcGRvd24sIFwic2VsZWN0aW9uOmNoYW5nZVwiLCB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlLmJpbmQodGhpcykpO1xuXG5cdFx0XHQkKGRvY3VtZW50KS5vbihcIm1vdXNldXBcIiwgdGhpcy5tb3VzZVVwQ2xpY2tIYW5kbGVyKTtcblxuXHRcdFx0dGhpcy5tb2RlbC5zZXQoeyByZWFsV2lkdGg6IHRoaXMuJGVsLndpZHRoKCkgfSk7XG5cblx0XHRcdCQodGhpcy5tb2RlbC5nZXQoXCJkZEhvc3RcIikpLmFwcGVuZCh0aGlzLl9kcm9wZG93bi5yZW5kZXIoKS5lbCk7XG5cdFx0XHR0aGlzLl9kcm9wZG93bi5vbkF0dGFjaCgpO1xuXG5cdFx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcInNlbGVjdHJhLWV4cGFuZGVkXCIpO1xuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblxuXHRvbk1vdXNlVXA6IGZ1bmN0aW9uKGUpIHtcblx0XHRjb25zdCBjb250YWluZXIgPSB0aGlzLiRlbDtcblxuXHRcdGlmICghY29udGFpbmVyLmlzKGUudGFyZ2V0KSAmJiBjb250YWluZXIuaGFzKGUudGFyZ2V0KS5sZW5ndGggPT09IDApIHtcblx0XHRcdGlmICh0aGlzLl9kcm9wZG93bikge1xuXHRcdFx0XHRjb25zdCBtb2RhbCA9IHRoaXMuX2Ryb3Bkb3duLiRlbDtcblx0XHRcdFx0aWYgKCFtb2RhbC5pcyhlLnRhcmdldCkgJiYgbW9kYWwuaGFzKGUudGFyZ2V0KS5sZW5ndGggPT09IDApXG5cdFx0XHRcdFx0dGhpcy5jbG9zZSgpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHRoaXMuY2xvc2UoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0b25TZWxlY3Rpb25DaGFuZ2U6IGZ1bmN0aW9uKG1vZGVsLCBzdXBwcmVzcywgZGVmYXVsdFNlbGVjdGlvbikge1xuXHRcdC8vIElmIHRoaXMgbW9kZWwgaXMgYWN0dWFsbHkgYWxyZWFkeSBzZWxlY3RlZCwgZG8gbm90aGluZ1xuXHRcdC8vIFRoaXMgY2FuIG9jY3VyIGlmIHRoZSBzZWxlY3Rpb24gaXMgcmUtYXBwbGllZCBhZnRlciBlZy4gYSBzZWFyY2hcblx0XHRpZiAodGhpcy5fY3VycmVudFNlbGVjdGlvbiAmJiB0aGlzLl9jdXJyZW50U2VsZWN0aW9uLmlkID09PSBtb2RlbC5pZCAmJiBtb2RlbC5nZXQoXCJzZWxlY3RlZFwiKSlcblx0XHRcdHJldHVybjtcblxuXHRcdGlmICh0aGlzLl9jdXJyZW50U2VsZWN0aW9uICYmIHRoaXMuX2N1cnJlbnRTZWxlY3Rpb24uaWQgIT09IG1vZGVsLmlkICYmICFtb2RlbC5nZXQoXCJzZWxlY3RlZFwiKSlcblx0XHRcdHJldHVybjtcblxuXHRcdGNvbnN0IGJ1cyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwodGhpcy5tb2RlbC5nZXQoXCJidXNDaGFubmVsXCIpKTtcblxuXHRcdC8vIFVwZGF0ZSB0aGUgVUlcblx0XHRpZiAobW9kZWwuZ2V0KFwic2VsZWN0ZWRcIikpIHtcblx0XHRcdHRoaXMudWkucGxhY2Vob2xkZXIuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0dGhpcy51aS50ZXh0LnRleHQobW9kZWwuZ2V0KHRoaXMubW9kZWwuZ2V0KFwidmFsdWVcIikpKS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cblx0XHRcdC8vIE1heWJlIHNldCB0aGUgaWNvblxuXHRcdFx0aWYgKG1vZGVsLmdldChcImljb25cIikpIHtcblx0XHRcdFx0dGhpcy51aS5oZWFkSW1hZ2Vcblx0XHRcdFx0XHQuY3NzKHsgXCJiYWNrZ3JvdW5kLWltYWdlXCI6IFwiXCIgfSlcblx0XHRcdFx0XHQuYWRkQ2xhc3MoXCJmYWwgXCIgKyBtb2RlbC5nZXQoXCJpY29uXCIpKTtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKG1vZGVsLmdldChcImltYWdlXCIpKSB7XG5cdFx0XHRcdHRoaXMudWkuaGVhZEltYWdlXG5cdFx0XHRcdFx0LmNzcyh7XG5cdFx0XHRcdFx0XHRcImJhY2tncm91bmQtaW1hZ2VcIjogXCJ1cmwoJ1wiICsgbW9kZWwuZ2V0KFwiaW1hZ2VcIikgKyBcIicpXCIsXG5cdFx0XHRcdFx0XHRcImJhY2tncm91bmQtc2l6ZVwiOiBcImNvbnRhaW5cIixcblx0XHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy51aS5nbG9iYWxDbG9zZXIucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0XHRidXMudHJpZ2dlcihFdmVudHMuVmFsdWVDaGFuZ2VkLCBtb2RlbC5pZCwgbW9kZWwsIHN1cHByZXNzKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLnVpLnBsYWNlaG9sZGVyLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHRoaXMudWkudGV4dC5hZGRDbGFzcyhcImhpZGVcIik7XG5cblx0XHRcdHRoaXMudWkuaGVhZEltYWdlXG5cdFx0XHRcdC5jc3MoeyBcImJhY2tncm91bmQtaW1hZ2VcIjogXCJcIiB9KVxuXHRcdFx0XHQucmVtb3ZlQ2xhc3MoXCJmYWwgXCIgKyAobW9kZWwuZ2V0KFwiaWNvblwiKSB8fCBcIlwiKSk7XG5cblx0XHRcdHRoaXMudWkuZ2xvYmFsQ2xvc2VyLmFkZENsYXNzKFwiaGlkZVwiKTtcblxuXHRcdFx0YnVzLnRyaWdnZXIoRXZlbnRzLlZhbHVlQ2hhbmdlZCwgbnVsbCwgbnVsbCwgc3VwcHJlc3MpO1xuXHRcdH1cblxuXHRcdC8vIENsb3NlIHRoZSBjaG9vc2VyIG1heWJlXG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwiY2xvc2VPbkNob29zZVwiKSAmJiAhZGVmYXVsdFNlbGVjdGlvbilcblx0XHRcdHRoaXMuY2xvc2UoKTtcblx0fSxcblxuXHRzaG93OiBmdW5jdGlvbihvcHRpb25zID0ge30pIHtcblx0XHQvLyBNb2RlbGVkIHJvdWdobHkgb24gTWFyaW9uZXR0ZSdzIHJlZ2lvbnMnIFwic2hvd1wiXG5cdFx0dGhpcy5iaW5kVUlFbGVtZW50cygpO1xuXG5cdFx0Ly8gVXNlIGFueSBleHBsaWNpdGx5LXByb3ZpZGVkIGVsZW1lbnQsIGVsc2UgZmFsbCBiYWNrIHRvIG9uZSBwcm92aWRlZCBiZWZvcmVcblx0XHRsZXQgYXR0YWNoUG9pbnQgPSBvcHRpb25zLmVsIHx8IHRoaXMuX2VsO1xuXG5cdFx0aWYgKCFhdHRhY2hQb2ludClcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIk5vIERPTSBsb2NhdGlvbiBwcm92aWRlZCB0byBTZWxlY3RyYVwiKTtcblxuXHRcdGlmIChfLmlzU3RyaW5nKG9wdGlvbnMpIHx8IG9wdGlvbnMgaW5zdGFuY2VvZiAkKSB7XG5cdFx0XHRhdHRhY2hQb2ludCA9IG9wdGlvbnM7XG5cdFx0XHRhdHRhY2hQb2ludCA9ICQoYXR0YWNoUG9pbnQpO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZSBhdHRhY2htZW50IHBvaW50IGlzIGFuIGlucHV0IG9mIHNvbWUga2luZCwgd2Ugd2lsbCBzdGVhbCBpdFxuXHRcdC8vIHRvIGFsbG93IGNhbGxpbmcgXCJ2YWwoKVwiIG9uIHRoZSBlbGVtZW50IGxhdGVyIGZyb20gY2xpZW50IGNvZGVcblx0XHRpZiAoYXR0YWNoUG9pbnQuaXMgJiYgYXR0YWNoUG9pbnQuaXMoXCI6aW5wdXRcIikpIHtcblx0XHRcdHRoaXMuX2lucHV0ID0gYXR0YWNoUG9pbnQ7XG5cblx0XHRcdGlmICh0aGlzLl9pbnB1dC5pcyhcInNlbGVjdFwiKSlcblx0XHRcdFx0dGhpcy5tb2RlbC5zZXQoeyBpbnB1dElzU2VsZWN0OiB0cnVlIH0pO1xuXG5cdFx0XHRpZiAoYXR0YWNoUG9pbnQucHJvcChcImRpc2FibGVkXCIpKVxuXHRcdFx0XHR0aGlzLm1vZGVsLnNldCh7IGRpc2FibGVkOiB0cnVlIH0pO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9pbnB1dCkge1xuXHRcdFx0Ly8gSGlkZSB0aGUgaW5wdXRcblx0XHRcdHRoaXMuX2lucHV0LmNzcyh7IGRpc3BsYXk6IFwibm9uZVwiIH0pO1xuXHRcdFx0Ly8gQWRkIGEgZHVtbXkgb3B0aW9uIGlmIG5lZWRlZFxuXHRcdFx0aWYgKCQoXCJvcHRpb25cIiwgdGhpcy5faW5wdXQpLmxlbmd0aCA9PT0gMClcblx0XHRcdFx0dGhpcy5faW5wdXQuYXBwZW5kKFwiPG9wdGlvbiB2YWx1ZT0nJyBzZWxlY3RlZC8+XCIpO1xuXG5cdFx0XHQvLyBBbmQgc2hvdyBTZWxlY3RyYVxuXHRcdFx0YXR0YWNoUG9pbnQuYWZ0ZXIodGhpcy5yZW5kZXIoKS5lbCk7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKGF0dGFjaFBvaW50IGluc3RhbmNlb2YgQmFja2JvbmUuTWFyaW9uZXR0ZS5SZWdpb24pIHtcblx0XHRcdGF0dGFjaFBvaW50LnNob3codGhpcyk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0YXR0YWNoUG9pbnQuYXBwZW5kKHRoaXMucmVuZGVyKCkuZWwpO1xuXHRcdH1cblx0fSxcblxuXHRnZXRWYWx1ZTogZnVuY3Rpb24ob3B0aW9ucyA9IHt9KSB7XG5cdFx0Y29uc3QgYnVzID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbCh0aGlzLm1vZGVsLmdldChcImJ1c0NoYW5uZWxcIikpO1xuXHRcdHJldHVybiBidXMucmVxdWVzdChFdmVudHMuUmVxdWVzdHMuVmFsdWUsIG9wdGlvbnMpO1xuXHR9LFxuXG5cdHZhbDogZnVuY3Rpb24ob3B0aW9ucyA9IHt9KSB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VmFsdWUob3B0aW9ucyk7XG5cdH0sXG5cblx0Z2V0U2VsZWN0ZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdGlmIChfLmlzVW5kZWZpbmVkKHRoaXMuX2N1cnJlbnRTZWxlY3Rpb24pKVxuXHRcdFx0cmV0dXJuIHt9O1xuXG5cdFx0cmV0dXJuIHRoaXMuX2N1cnJlbnRTZWxlY3Rpb24gPyB0aGlzLl9jdXJyZW50U2VsZWN0aW9uLnRvSlNPTigpIDoge307XG5cdH0sXG5cblx0Y2xlYXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuX2N1cnJlbnRTZWxlY3Rpb24gPSBudWxsO1xuXG5cdFx0Ly8gQ2xvc2UgaXQgaWYgb3BlblxuXHRcdGNvbnN0IGJ1cyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwodGhpcy5tb2RlbC5nZXQoXCJidXNDaGFubmVsXCIpKTtcblx0XHRidXMudHJpZ2dlcihFdmVudHMuQ29tbWFuZHMuQ2xvc2UpO1xuXG5cdFx0Ly8gV2lwZSBhbGwgaXRlbXMgZnJvbSB0aGUgY3VycmVudCBjb2xsZWN0aW9uLlxuXHRcdGlmICh0aGlzLmNvbGxlY3Rpb24uZnVsbENvbGxlY3Rpb24pXG5cdFx0XHR0aGlzLmNvbGxlY3Rpb24uZnVsbENvbGxlY3Rpb24ucmVzZXQoW10pO1xuXG5cdFx0dGhpcy5jb2xsZWN0aW9uLnJlc2V0KFtdKTtcblx0fSxcblxuXHRvbkdsb2JhbENsb3NlOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRpZiAodGhpcy5fY3VycmVudFNlbGVjdGlvbikge1xuXHRcdFx0dGhpcy5fY3VycmVudFNlbGVjdGlvbi5zZXQoeyBzZWxlY3RlZDogZmFsc2UgfSk7XG5cdFx0XHR0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKHRoaXMuX2N1cnJlbnRTZWxlY3Rpb24pO1xuXHRcdH1cblx0fSxcbn0pO1xuXG5cbmNvbnN0IE11bHRpQmFzZSA9IEJhY2tib25lLk1hcmlvbmV0dGUuQ29tcG9zaXRlVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGNsYXNzZXMgPSBbXCJzZWxlY3RyYS1ob3N0XCJdO1xuXG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwiZmxhdFwiKSlcblx0XHRcdGNsYXNzZXMucHVzaChcInNlbGVjdHJhLWZsYXRcIik7XG5cblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJkaXNhYmxlZFwiKSlcblx0XHRcdGNsYXNzZXMucHVzaChcInNlbGVjdHJhLWRpc2FibGVkXCIpO1xuXG5cdFx0cmV0dXJuIGNsYXNzZXMuam9pbihcIiBcIik7XG5cdH0sXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9zZWxlY3RyYS5udW5qXCIpLm11bHRpQmFzZSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRoYXNQbGFjZWhvbGRlcjogKCkgPT4gQm9vbGVhbih0aGlzLm1vZGVsLmdldChcInBsYWNlaG9sZGVyXCIpKSxcblx0XHRcdHBsYWNlaG9sZGVyOiAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHAgPSB0aGlzLm1vZGVsLmdldChcInBsYWNlaG9sZGVyXCIpO1xuXG5cdFx0XHRcdGlmIChfLmlzRnVuY3Rpb24ocCkpXG5cdFx0XHRcdFx0cmV0dXJuIHAodGhpcy5tb2RlbC50b0pTT04oKSk7XG5cblx0XHRcdFx0cmV0dXJuIHA7XG5cdFx0XHR9LFxuXHRcdH07XG5cdH0sXG5cblx0dWk6IHtcblx0XHRwbGFjZWhvbGRlcjogXCIucGxhY2Vob2xkZXJcIixcblx0XHR0ZXh0OiBcIi50ZXh0XCIsXG5cdFx0aGVhZEltYWdlOiBcIi5oZWFkLWltYWdlXCIsXG5cdFx0aGVhZDogXCIuaGVhZFwiLFxuXHRcdGRyb3Bkb3duOiBcIi5zZWxlY3RyYS1kcm9wZG93blwiLFxuXHRcdGl0ZW1zOiBcIi5pdGVtc1wiLFxuXHRcdHNwaW5uZXI6IFwiLnNwaW5uZXJcIixcblx0fSxcblxuXHRjaGlsZFZpZXc6IE11bHRpSXRlbSxcblx0Y2hpbGRWaWV3Q29udGFpbmVyOiBcIi5pdGVtc1wiLFxuXG5cdGNoaWxkVmlld09wdGlvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1vZGVsLnBpY2socGFzc1Rocm91Z2hGaWVsZHMpO1xuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdGNsaWNrOiBcIm9uQ2xpY2tcIixcblx0fSxcblxuXHRtb2RlbEV2ZW50czoge1xuXHRcdFwiY2hhbmdlOmZldGNoaW5nXCI6IFwib25GZXRjaENoYW5nZVwiLFxuXHRcdFwiY2hhbmdlOmRpc2FibGVkXCI6IFwib25EaXNhYmxlZENoYW5nZVwiLFxuXHR9LFxuXG5cdGNvbGxlY3Rpb25FdmVudHM6IHtcblx0XHRcImNoYW5nZTpzZWxlY3RlZFwiOiBcIm9uQ2hvc2VuU2VsZWN0ZWRDaGFuZ2VcIixcblx0XHRcInN5bmMgcmVzZXRcIjogXCJvbkNvbGxlY3Rpb25TeW5jXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5fY3VycmVudFNlbGVjdGlvbiA9IHVuZGVmaW5lZDtcblxuXHRcdHRoaXMubW91c2VVcENsaWNrSGFuZGxlciA9IHRoaXMub25Nb3VzZVVwLmJpbmQodGhpcyk7XG5cblx0XHRjb25zdCBidXMgPSBCYWNrYm9uZS5SYWRpby5jaGFubmVsKHRoaXMubW9kZWwuZ2V0KFwiYnVzQ2hhbm5lbFwiKSk7XG5cdFx0YnVzLnJlcGx5KEV2ZW50cy5SZXF1ZXN0cy5SZWFsV2lkdGgsICgpID0+IHRoaXMubW9kZWwuZ2V0KFwicmVhbFdpZHRoXCIpKTtcblx0XHRidXMucmVwbHkoRXZlbnRzLlJlcXVlc3RzLkRpc2FibGVkLCAoKSA9PiB0aGlzLm1vZGVsLmdldChcImRpc2FibGVkXCIpKTtcblx0XHRidXMucmVwbHkoRXZlbnRzLlJlcXVlc3RzLkNsaWNrYWJpbGl0eSwgKCkgPT4gdGhpcy5tb2RlbC5nZXQoXCJjbGlja2FibGVcIikpO1xuXHRcdGJ1cy5vbihFdmVudHMuQ29tbWFuZHMuQ2xvc2UsIHRoaXMuY2xvc2UuYmluZCh0aGlzKSk7XG5cdFx0YnVzLnJlcGx5KEV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50U2VsZWN0aW9uLCAoKSA9PiB0aGlzLl9jdXJyZW50U2VsZWN0aW9uIHx8IFtdKTtcblxuXHRcdHRoaXMubGlzdGVuVG8odGhpcywgXCJjbGVhclwiLCB0aGlzLmNsZWFyLmJpbmQodGhpcykpO1xuXG5cdFx0dGhpcy51bmJpbmRFdmVudHModGhpcy5jb2xsZWN0aW9uLCB0aGlzLmNvbGxlY3Rpb25FdmVudHMpO1xuXHRcdHRoaXMucGFnZWRDb2xsZWN0aW9uID0gdGhpcy5jb2xsZWN0aW9uO1xuXG5cdFx0Y29uc3Qgb3B0cyA9IHsgbW9kZWw6IHRoaXMucGFnZWRDb2xsZWN0aW9uLm1vZGVsIH07XG5cdFx0Ly8gSGFuZGxlIGF1dG9tYXRpYyBzb3J0aW5nXG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwic29ydFwiKSkge1xuXHRcdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwic29ydFwiKSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRjb25zdCBmaWVsZCA9IHRoaXMubW9kZWwuZ2V0KFwic2VydmVyXCIpID8gdGhpcy5tb2RlbC5nZXQoXCJzZXJ2ZXJcIikudmFsdWUgOiBcInZhbHVlXCI7XG5cdFx0XHRcdG9wdHMuY29tcGFyYXRvciA9IGZpZWxkO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdG9wdHMuY29tcGFyYXRvciA9IHRoaXMubW9kZWwuZ2V0KFwic29ydFwiKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBXZSBuZWVkIHRvIGNyZWF0ZSBhbm90aGVyIGNvbGxlY3Rpb24gdG8gb25seSByZW5kZXIgc2VsZWN0ZWQgaXRlbXNcblx0XHR0aGlzLmNvbGxlY3Rpb24gPSBuZXcgQmFja2JvbmUuQ29sbGVjdGlvbih0aGlzLnBhZ2VkQ29sbGVjdGlvbi5maWx0ZXIoeCA9PiB4LmdldChcInNlbGVjdGVkXCIpKSwgb3B0cyk7XG5cdFx0dGhpcy5iaW5kRXZlbnRzKHRoaXMuY29sbGVjdGlvbiwgdGhpcy5jb2xsZWN0aW9uRXZlbnRzKTtcblx0fSxcblxuXHRjbG9zZTogZnVuY3Rpb24oKSB7XG5cdFx0JChkb2N1bWVudCkub2ZmKFwibW91c2V1cFwiLCB0aGlzLm1vdXNlVXBDbGlja0hhbmRsZXIpO1xuXG5cdFx0aWYgKHRoaXMuX2Ryb3Bkb3duKSB7XG5cdFx0XHR0aGlzLl9kcm9wZG93bi5kZXN0cm95KCk7XG5cdFx0XHR0aGlzLl9kcm9wZG93biA9IHVuZGVmaW5lZDtcblx0XHRcdHRoaXMubW9kZWwuc2V0KHsgZmV0Y2hpbmc6IGZhbHNlIH0pO1xuXHRcdFx0dGhpcy50cmlnZ2VyKFwiZHJvcGRvd246Y2xvc2VkXCIpO1xuXHRcdH1cblxuXHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKFwic2VsZWN0cmEtZXhwYW5kZWRcIik7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy54aHIpXG5cdFx0XHR0aGlzLnhoci5hYm9ydCgpO1xuXHRcdHRoaXMueGhyID0gbnVsbDtcblx0XHR0aGlzLnRyaWdnZXIoXCJkZXN0cm95aW5nXCIpO1xuXHR9LFxuXG5cdG9uRmV0Y2hDaGFuZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcImZldGNoaW5nXCIpKSB7XG5cdFx0XHRjb25zdCBwcmUgPSB0aGlzLm1vZGVsLmdldChcImRpc2FibGVkXCIpO1xuXHRcdFx0dGhpcy5tb2RlbC5zZXQoeyBkaXNhYmxlZDogdHJ1ZSwgcHJlRGlzYWJsZWQ6IHByZSB9KTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoIXRoaXMubW9kZWwuZ2V0KFwicHJlRGlzYWJsZWRcIikpIHtcblx0XHRcdHRoaXMubW9kZWwuc2V0KHsgZGlzYWJsZWQ6IGZhbHNlIH0pO1xuXHRcdFx0dGhpcy5tb2RlbC51bnNldChcInByZURpc2FibGVkXCIpO1xuXHRcdH1cblx0fSxcblxuXHRvbkRpc2FibGVkQ2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJkaXNhYmxlZFwiKSlcblx0XHRcdHRoaXMuJGVsLmFkZENsYXNzKFwiZGlzYWJsZWRcIik7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy4kZWwucmVtb3ZlQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblx0fSxcblxuXHQvLyBIYW5kbGUgcG90ZW50aWFsIGR1cGUgZXZlbnRzIGZyb20gY2xvc2luZyBhY3Rpb25cblx0b25DaG9zZW5TZWxlY3RlZENoYW5nZTogXy5kZWJvdW5jZShmdW5jdGlvbihtb2RlbCkge1xuXHRcdC8qIGVzbGludC1kaXNhYmxlIG5vLWludmFsaWQtdGhpcyAqL1xuXG5cdFx0aWYgKCF0aGlzLmNvbGxlY3Rpb24uY29udGFpbnMobW9kZWwpKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5vblNlbGVjdGlvbkNoYW5nZShtb2RlbCk7XG5cblx0XHQvKiBlc2xpbnQtZGlzYWJsZSBuby1pbnZhbGlkLXRoaXMgKi9cblx0fSwgMTApLFxuXG5cdG9uVmFsdWVDaGFuZ2VkOiBmdW5jdGlvbih2YWx1ZSwgZGF0YSwgc3VwcHJlc3MpIHtcblx0XHR0aGlzLl9jdXJyZW50U2VsZWN0aW9uID0gZGF0YTtcblxuXHRcdGlmICh0aGlzLl9pbnB1dCkge1xuXHRcdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwiaW5wdXRJc1NlbGVjdFwiKSkge1xuXHRcdFx0XHQvLyBHZW5lcmF0ZSB0aGUgbmV3IGVsZW1lbnRzIGFuZCBkbyBhIHdob2xlc2FsZSByZXBsYWNlbWVudCBvZiB0aGUgc2VsZWN0IGNvbnRlbnRcblx0XHRcdFx0Y29uc3QgZWxlbXMgPSBfLm1hcChkYXRhLCB4ID0+IGA8b3B0aW9uIHNlbGVjdGVkIHZhbHVlPVwiJHt4LmlkfVwiPiR7eC5nZXQodGhpcy5tb2RlbC5nZXQoXCJ2YWxcIikpfTwvb3B0aW9uPmApO1xuXG5cdFx0XHRcdHRoaXMuX2lucHV0Lmh0bWwoZWxlbXMuam9pbihcIlwiKSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghc3VwcHJlc3MpXG5cdFx0XHRcdHRoaXMuX2lucHV0LnRyaWdnZXIoXCJjaGFuZ2VcIiwgZGF0YSk7XG5cdFx0fVxuXG5cdFx0Ly8gVHJpZ2dlciBhIGNoYW5nZSBldmVudCBvbiB0aGUgdmlldyBpdHNlbGZcblx0XHRpZiAoIXN1cHByZXNzKVxuXHRcdFx0dGhpcy50cmlnZ2VyKFwiY2hhbmdlXCIsIGRhdGEpO1xuXHR9LFxuXG5cdG9uQ29sbGVjdGlvblN5bmM6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghdGhpcy5fZGVmYXVsdClcblx0XHRcdHJldHVybjtcblxuXHRcdGNvbnN0IGV4aXN0cyA9IHRoaXMuY29sbGVjdGlvbi5maWx0ZXIoeCA9PiBfLnNvbWUodGhpcy5fZGVmYXVsdCwgeSA9PiB5LmlkID09PSB4W3RoaXMubW9kZWwuZ2V0KFwia2V5XCIpXSkpO1xuXHRcdF8uZWFjaChleGlzdHMsIHggPT4geC5zZXQoeyBzZWxlY3RlZDogdHJ1ZSB9KSk7XG5cdH0sXG5cblx0dXBkYXRlRmlsdGVyczogZnVuY3Rpb24oZmlsdGVycykge1xuXHRcdF8uZXh0ZW5kKHRoaXMucGFnZWRDb2xsZWN0aW9uLl9wYXJhbXMsIGZpbHRlcnMpO1xuXHRcdHRoaXMucGFnZWRDb2xsZWN0aW9uLnJlZ2VuZXJhdGVMaW5rcygpO1xuXHR9LFxuXG5cdHJlZmV0Y2g6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY29sbGVjdGlvbi5yZXNldChbXSk7XG5cblx0XHR0aGlzLmZldGNoKCk7XG5cdH0sXG5cblx0ZmV0Y2g6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIERpZCB3ZSBnZXQgZ2l2ZW4gYSBkZWZhdWx0IHNlbGVjdGlvbiBmcm9tIG91dHNpZGU/XG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwic2VydmVyXCIpICYmIHRoaXMubW9kZWwuZ2V0KFwic2VydmVyXCIpLmRlZmF1bHQpIHtcblx0XHRcdGNvbnN0IE0gPSB0aGlzLmNvbGxlY3Rpb24ubW9kZWw7XG5cblx0XHRcdGNvbnN0IGdldE1vZGVsID0gZSA9PiBuZXcgTShfLmV4dGVuZChlLCB7XG5cdFx0XHRcdHNlbGVjdGVkOiB0cnVlLFxuXHRcdFx0XHRbdGhpcy5tb2RlbC5nZXQoXCJrZXlcIildOiBlLmtleSB8fCBlW3RoaXMubW9kZWwuZ2V0KFwia2V5XCIpXSxcblx0XHRcdFx0W3RoaXMubW9kZWwuZ2V0KFwidmFsdWVcIildOiBlLnZhbHVlIHx8IGVbdGhpcy5tb2RlbC5nZXQoXCJ2YWx1ZVwiKV0sXG5cdFx0XHR9KSk7XG5cblx0XHRcdGNvbnN0IGZpbmlzaCA9IG1vZGVscyA9PiB7XG5cdFx0XHRcdHRoaXMuX2RlZmF1bHQgPSBtb2RlbHM7XG5cblx0XHRcdFx0Y29uc3QgZXhpc3RzID0gdGhpcy5jb2xsZWN0aW9uLmZpbHRlcih4ID0+IF8uc29tZSh0aGlzLl9kZWZhdWx0LCB5ID0+IHkuaWQgPT09IHhbdGhpcy5tb2RlbC5nZXQoXCJrZXlcIildKSk7XG5cdFx0XHRcdF8uZWFjaChleGlzdHMsIHggPT4geC5zZXQoeyBzZWxlY3RlZDogdHJ1ZSB9KSk7XG5cblx0XHRcdFx0dGhpcy5vblNlbGVjdGlvbkNoYW5nZSh0aGlzLl9kZWZhdWx0LCB0aGlzLm1vZGVsLmdldChcInNlcnZlclwiKS5kZWZhdWx0LnNpbGVudCwgdHJ1ZSk7XG5cdFx0XHR9O1xuXG5cdFx0XHRsZXQgbW9kZWxzID0gbnVsbDtcblxuXHRcdFx0Ly8gRG8gd2UgbmVlZCB0byBmZXRjaCB0aGUgZGVmYXVsdHMgZHluYW1pY2FsbHk/XG5cdFx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJzZXJ2ZXJcIikuZGVmYXVsdC5mZXRjaCkge1xuXHRcdFx0XHRsZXQgZmV0Y2ggPSB0aGlzLm1vZGVsLmdldChcInNlcnZlclwiKS5kZWZhdWx0LmZldGNoO1xuXHRcdFx0XHRpZiAoIV8uaXNQbGFpbk9iamVjdChmZXRjaCkpXG5cdFx0XHRcdFx0ZmV0Y2ggPSB7IHVybDogZmV0Y2gsIG1ldGhvZDogXCJHRVRcIiB9O1xuXG5cdFx0XHRcdGNvbnN0IHBhcmFtcyA9IHRoaXMubW9kZWwuZ2V0KFwic2VydmVyXCIpLmRlZmF1bHQucGFyYW1zO1xuXHRcdFx0XHRpZiAocGFyYW1zICYmICFmZXRjaC5kYXRhKSB7XG5cdFx0XHRcdFx0aWYgKF8uaXNGdW5jdGlvbihwYXJhbXMpKVxuXHRcdFx0XHRcdFx0ZmV0Y2guZGF0YSA9IHBhcmFtcygpO1xuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdGZldGNoLmRhdGEgPSBwYXJhbXM7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIWZldGNoLmRhdGFUeXBlKVxuXHRcdFx0XHRcdGZldGNoLmRhdGFUeXBlID0gXCJqc29uXCI7XG5cblx0XHRcdFx0ZmV0Y2guc3VjY2VzcyA9IGRhdGEgPT4ge1xuXHRcdFx0XHRcdHRoaXMubW9kZWwuc2V0KHsgZmV0Y2hpbmc6IGZhbHNlIH0pO1xuXG5cdFx0XHRcdFx0bW9kZWxzID0gXy5tYXAoZGF0YSwgeCA9PiBnZXRNb2RlbCh4KSk7XG5cblx0XHRcdFx0XHRmaW5pc2gobW9kZWxzKTtcblx0XHRcdFx0fTtcblx0XHRcdFx0ZmV0Y2guZXJyb3IgPSAoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5tb2RlbC5zZXQoeyBmZXRjaGluZzogZmFsc2UgfSk7XG5cblx0XHRcdFx0XHR0aGlzLnVpLnNwaW5uZXIuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdHRoaXMueGhyID0gJC5hamF4KGZldGNoKTtcblx0XHRcdFx0dGhpcy5tb2RlbC5zZXQoeyBmZXRjaGluZzogdHJ1ZSB9KTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJzZXJ2ZXJcIikuZGVmYXVsdC5pdGVtcylcblx0XHRcdFx0XHRtb2RlbHMgPSBfLm1hcCh0aGlzLm1vZGVsLmdldChcInNlcnZlclwiKS5kZWZhdWx0Lml0ZW1zLCB4ID0+IGdldE1vZGVsKHgpKTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdG1vZGVscyA9IGdldE1vZGVsKHRoaXMubW9kZWwuZ2V0KFwic2VydmVyXCIpLmRlZmF1bHQpO1xuXG5cdFx0XHRcdC8vIENvbXBvc2l0ZVZpZXcgZG9lc24ndCBsaXN0ZW4gZm9yIGNvbGxlY3Rpb24gY2hhbmdlcyB1bnRpbCBhZnRlciBpdCdzIHJlbmRlcmVkXG5cdFx0XHRcdC8vIFNvIGRlbGF5IHRoZSBjb21wbGV0aW9uIG9mIHRoZSByZW5kZXIgZm9yIGEgdGljayB0byBsZXQgdGhhdCBydW4uXG5cdFx0XHRcdHNldFRpbWVvdXQoKCkgPT4geyBmaW5pc2gobW9kZWxzKTsgfSwgMCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0Ly8gSWYgdGhlcmUncyBwcmVzZWxlY3RlZCBpdGVtcywgc2VsZWN0IGl0XG5cdFx0XHRjb25zdCBzZWxlY3RlZCA9IHRoaXMuY29sbGVjdGlvbi5tb2RlbHM7XG5cblx0XHRcdHRoaXMuX2RlZmF1bHQgPSBzZWxlY3RlZDtcblxuXHRcdFx0Y29uc3QgZXhpc3RzID0gdGhpcy5jb2xsZWN0aW9uLmZpbHRlcih4ID0+IF8uc29tZSh0aGlzLl9kZWZhdWx0LCB5ID0+IHkuaWQgPT09IHhbdGhpcy5tb2RlbC5nZXQoXCJrZXlcIildKSk7XG5cdFx0XHRfLmVhY2goZXhpc3RzLCB4ID0+IHguc2V0KHsgc2VsZWN0ZWQ6IHRydWUgfSkpO1xuXG5cdFx0XHR0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKHRoaXMuX2RlZmF1bHQsIHRoaXMubW9kZWwuZ2V0KFwic2lsZW50XCIpLCB0cnVlKTtcblxuXHRcdFx0aWYgKCFzZWxlY3RlZC5sZW5ndGgpXG5cdFx0XHRcdHRoaXMudWkucGxhY2Vob2xkZXIucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcInNlcnZlclwiKSAmJiAhdGhpcy5tb2RlbC5nZXQoXCJzZXJ2ZXJcIikuZGVsYXlMb2FkICYmIHRoaXMucGFnZWRDb2xsZWN0aW9uLnN0YXRlLnRvdGFsUmVjb3JkcyA9PT0gbnVsbClcblx0XHRcdHRoaXMucGFnZWRDb2xsZWN0aW9uLmdldEZpcnN0UGFnZSgpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHQvLyBTcGFjZSBmb3IgaWNvbnNcblx0XHRpZiAoIXRoaXMubW9kZWwuZ2V0KFwiaWNvbnNcIikpXG5cdFx0XHR0aGlzLnVpLmhlYWQuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0Ly8gYWxzbyBsaXN0ZW4gZm9yIGludGVybmFsIHZhbHVlIGNoYW5nZXMgdG8gc3luYyB0aGVtIHVwIHdpdGggdGhlIGhpZGRlbiBlbGVtZW50XG5cdFx0Y29uc3QgYnVzID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbCh0aGlzLm1vZGVsLmdldChcImJ1c0NoYW5uZWxcIikpO1xuXHRcdGJ1cy5vbihFdmVudHMuVmFsdWVDaGFuZ2VkLCB0aGlzLm9uVmFsdWVDaGFuZ2VkLmJpbmQodGhpcykpO1xuXG5cdFx0dGhpcy5mZXRjaCgpO1xuXHR9LFxuXG5cdG9uQXR0YWNoOiBmdW5jdGlvbigpIHtcblx0XHQvLyBTZXQgYW4gZXhwbGljaXQgd2lkdGg/XG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwid2lkdGhcIikpXG5cdFx0XHR0aGlzLiRlbC5jc3MoeyB3aWR0aDogdGhpcy5tb2RlbC5nZXQoXCJ3aWR0aFwiKSB9KS5hZGRDbGFzcyhcInNlbGVjdHJhLWZpeGVkXCIpO1xuXHRcdGVsc2UgaWYgKHRoaXMubW9kZWwuZ2V0KFwiZmxhdFwiKSAmJiB0aGlzLm1vZGVsLmdldChcImxvY2tlZExpc3RcIikpXG5cdFx0XHR0aGlzLiRlbC5jc3MoeyB3aWR0aDogTWF0aC5tYXgodGhpcy4kZWwud2lkdGgoKSwgMTAwKSB9KS5hZGRDbGFzcyhcInNlbGVjdHJhLWZpeGVkXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuJGVsLmNzcyh7IHdpZHRoOiBcIlwiIH0pLmFkZENsYXNzKFwic2VsZWN0cmEtZmxleFwiKTtcblxuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcImF1dG9PcGVuRHJvcGRvd25cIikpXG5cdFx0XHR0aGlzLm9uQ2xpY2soKTtcblx0fSxcblxuXHRvbkNsaWNrOiBmdW5jdGlvbihldnQpIHtcblx0XHRpZiAoZXZ0KSB7XG5cdFx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRldnQucHJldmVudERlZmF1bHQoKTtcblx0XHR9XG5cblx0XHQvLyBJZiB3ZSBoYXZlIGFueSBvcGVuIHZpZXdzLCBjbG9zZSB0aGVtXG5cdFx0aWYgKHRoaXMuX2Ryb3Bkb3duKSB7XG5cdFx0XHR0aGlzLmNsb3NlKCk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0Ly8gSWYgd2UncmUgZGlzYWJsZWQsIGRvIG5vdGhpbmdcblx0XHRcdGlmICh0aGlzLm1vZGVsLmdldChcImRpc2FibGVkXCIpIHx8IHRoaXMubW9kZWwuZ2V0KFwiZmV0Y2hpbmdcIikpXG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0bGV0IGxvY2F0aW9uID0gdGhpcy4kZWw7XG5cblx0XHRcdGxldCB0b3AgPSBsb2NhdGlvbi5vZmZzZXQoKS50b3A7XG5cdFx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJ2aXJ0dWFsQmFzZVwiKSkge1xuXHRcdFx0XHRsb2NhdGlvbiA9ICQodGhpcy5fZWwpO1xuXHRcdFx0XHR0b3AgPSBsb2NhdGlvbi5vZmZzZXQoKS50b3AgKyBsb2NhdGlvbi5oZWlnaHQoKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgbGVmdCA9IGxvY2F0aW9uLm9mZnNldCgpLmxlZnQgKyAkKHRoaXMubW9kZWwuZ2V0KFwiZGRIb3N0XCIpKVswXS5vZmZzZXRMZWZ0O1xuXHRcdFx0Y29uc3QgdyA9IGxvY2F0aW9uLndpZHRoKCk7XG5cdFx0XHRjb25zdCBoID0gbG9jYXRpb24uaGVpZ2h0KCk7XG5cblx0XHRcdHRoaXMubW9kZWwuc2V0KHsgb2Zmc2V0OiB7IGxlZnQ6IGxlZnQgLSB3aW5kb3cucGFnZVhPZmZzZXQsIHdpZHRoOiB3LCB0b3A6IHRvcCAtIHdpbmRvdy5wYWdlWU9mZnNldCwgaGVpZ2h0OiBoIH0gfSk7XG5cblx0XHRcdHRoaXMuX2Ryb3Bkb3duID0gbmV3IERyb3Bkb3duKHtcblx0XHRcdFx0Y29sbGVjdGlvbjogdGhpcy5wYWdlZENvbGxlY3Rpb24sXG5cdFx0XHRcdG1vZGVsOiB0aGlzLm1vZGVsLFxuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMubGlzdGVuVG8odGhpcy5fZHJvcGRvd24sIFwic2VsZWN0aW9uOmNoYW5nZVwiLCB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlLmJpbmQodGhpcykpO1xuXG5cdFx0XHQkKGRvY3VtZW50KS5vbihcIm1vdXNldXBcIiwgdGhpcy5tb3VzZVVwQ2xpY2tIYW5kbGVyKTtcblxuXHRcdFx0dGhpcy5tb2RlbC5zZXQoeyByZWFsV2lkdGg6IHRoaXMuJGVsLndpZHRoKCkgfSk7XG5cblx0XHRcdCQodGhpcy5tb2RlbC5nZXQoXCJkZEhvc3RcIikpLmFwcGVuZCh0aGlzLl9kcm9wZG93bi5yZW5kZXIoKS5lbCk7XG5cdFx0XHR0aGlzLl9kcm9wZG93bi5vbkF0dGFjaCgpO1xuXG5cdFx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcInNlbGVjdHJhLWV4cGFuZGVkXCIpO1xuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fSxcblxuXHRyZXBvc2l0aW9uRHJvcGRvd246IF8uZGVib3VuY2UoZnVuY3Rpb24oKSB7XG5cdFx0LyogZXNsaW50LWRpc2FibGUgbm8taW52YWxpZC10aGlzICovXG5cblx0XHRpZiAoIXRoaXMuX2Ryb3Bkb3duKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0bGV0IGxvY2F0aW9uID0gdGhpcy4kZWw7XG5cblx0XHRsZXQgdG9wID0gbG9jYXRpb24ub2Zmc2V0KCkudG9wO1xuXG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwidmlydHVhbEJhc2VcIikpIHtcblx0XHRcdGxvY2F0aW9uID0gJCh0aGlzLl9lbCk7XG5cdFx0XHR0b3AgPSBsb2NhdGlvbi5vZmZzZXQoKS50b3AgKyBsb2NhdGlvbi5oZWlnaHQoKTtcblx0XHR9XG5cblx0XHRjb25zdCBsZWZ0ID0gbG9jYXRpb24ub2Zmc2V0KCkubGVmdCArICQodGhpcy5tb2RlbC5nZXQoXCJkZEhvc3RcIikpWzBdLm9mZnNldExlZnQ7XG5cdFx0Y29uc3QgdyA9IGxvY2F0aW9uLndpZHRoKCk7XG5cdFx0Y29uc3QgaCA9IGxvY2F0aW9uLmhlaWdodCgpO1xuXG5cdFx0dGhpcy5tb2RlbC5zZXQoeyBvZmZzZXQ6IHsgbGVmdDogbGVmdCAtIHdpbmRvdy5wYWdlWE9mZnNldCwgd2lkdGg6IHcsIHRvcDogdG9wIC0gd2luZG93LnBhZ2VZT2Zmc2V0LCBoZWlnaHQ6IGggfSB9KTtcblxuXHRcdC8qIGVzbGludC1lbmFibGUgbm8taW52YWxpZC10aGlzICovXG5cdH0sIDEwKSxcblxuXHRvbk1vdXNlVXA6IGZ1bmN0aW9uKGUpIHtcblx0XHRjb25zdCBjb250YWluZXIgPSB0aGlzLiRlbDtcblxuXHRcdGlmICghY29udGFpbmVyLmlzKGUudGFyZ2V0KSAmJiBjb250YWluZXIuaGFzKGUudGFyZ2V0KS5sZW5ndGggPT09IDApIHtcblx0XHRcdGlmICh0aGlzLl9kcm9wZG93bikge1xuXHRcdFx0XHRjb25zdCBtb2RhbCA9IHRoaXMuX2Ryb3Bkb3duLiRlbDtcblx0XHRcdFx0aWYgKCFtb2RhbC5pcyhlLnRhcmdldCkgJiYgbW9kYWwuaGFzKGUudGFyZ2V0KS5sZW5ndGggPT09IDApXG5cdFx0XHRcdFx0dGhpcy5jbG9zZSgpO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHRoaXMuY2xvc2UoKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0cG9wdWxhdGU6IGZ1bmN0aW9uKGRhdGEpIHtcblx0XHRjb25zdCBNID0gdGhpcy5jb2xsZWN0aW9uLm1vZGVsO1xuXG5cdFx0Y29uc3QgZ2V0TW9kZWwgPSBlID0+IG5ldyBNKF8uZXh0ZW5kKGUsIHtcblx0XHRcdHNlbGVjdGVkOiB0cnVlLFxuXHRcdFx0W3RoaXMubW9kZWwuZ2V0KFwia2V5XCIpXTogZS5rZXkgfHwgZVt0aGlzLm1vZGVsLmdldChcImtleVwiKV0sXG5cdFx0XHRbdGhpcy5tb2RlbC5nZXQoXCJ2YWx1ZVwiKV06IGUudmFsdWUgfHwgZVt0aGlzLm1vZGVsLmdldChcInZhbHVlXCIpXSxcblx0XHR9KSk7XG5cblx0XHRjb25zdCBtID0gXy5tYXAoZGF0YSwgZ2V0TW9kZWwpO1xuXG5cdFx0dGhpcy5vblNlbGVjdGlvbkNoYW5nZShtLCB0cnVlLCBmYWxzZSk7XG5cdH0sXG5cblx0b25TZWxlY3Rpb25DaGFuZ2U6IGZ1bmN0aW9uKG1vZGVscywgc3VwcHJlc3MsIGRlZmF1bHRTZWxlY3Rpb24pIHtcblx0XHRjb25zdCBtb2RlbFNldCA9IF8uZmxhdHRlbihbbW9kZWxzXSk7XG5cblx0XHR0aGlzLl9jdXJyZW50U2VsZWN0aW9uID0gbW9kZWxzO1xuXG5cdFx0Xy5lYWNoKG1vZGVsU2V0LCB4ID0+IHtcblx0XHRcdGlmICh4LmdldChcInNlbGVjdGVkXCIpKSB7XG5cdFx0XHRcdHRoaXMuY29sbGVjdGlvbi5hZGQoeCk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0dGhpcy5jb2xsZWN0aW9uLnJlbW92ZSh4KTtcblxuXHRcdFx0XHQvLyBUaGUgbW9kZWwgbWlnaHQgaGF2ZSBiZWVuIGZldGNoZWQgaW50byB0aGUgZHJvcGRvd24gY29sbGVjdGlvbiBhbHJlYWR5XG5cdFx0XHRcdC8vIElmIHNvLCBmbGFnIGl0IGFzIHVuc2VsZWN0ZWQgaW4gdGhlcmUuXG5cdFx0XHRcdGNvbnN0IG0gPSB0aGlzLnBhZ2VkQ29sbGVjdGlvbi5mdWxsQ29sbGVjdGlvbi5nZXQoeC5pZCk7XG5cdFx0XHRcdGlmIChtKVxuXHRcdFx0XHRcdG0uc2V0KHsgc2VsZWN0ZWQ6IGZhbHNlIH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Y29uc3Qgc2VsZWN0aW9uID0gdGhpcy5jb2xsZWN0aW9uLm1vZGVscztcblxuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcInBsYWNlaG9sZGVyXCIpKSB7XG5cdFx0XHRpZiAoc2VsZWN0aW9uLmxlbmd0aCA9PT0gMClcblx0XHRcdFx0dGhpcy51aS5wbGFjZWhvbGRlci5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMudWkucGxhY2Vob2xkZXIuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGVsaWdpYmxlID0gdGhpcy5tb2RlbC5nZXQoXCJlbGlnaWJpbGl0eVwiKTtcblx0XHRpZiAoZWxpZ2libGUpIHtcblx0XHRcdF8uZWFjaCh0aGlzLnBhZ2VkQ29sbGVjdGlvbi5tb2RlbHMsIHggPT4ge1xuXHRcdFx0XHRpZiAoIXguZ2V0KFwic2VsZWN0ZWRcIikpXG5cdFx0XHRcdFx0eC5zZXQoeyBlbGlnaWJsZTogZWxpZ2libGUoc2VsZWN0aW9uLCB4KSB9KTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGNvbnN0IGJ1cyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwodGhpcy5tb2RlbC5nZXQoXCJidXNDaGFubmVsXCIpKTtcblx0XHRidXMudHJpZ2dlcihFdmVudHMuVmFsdWVDaGFuZ2VkLCBfLm1hcChzZWxlY3Rpb24sIHggPT4geC5pZCksIHNlbGVjdGlvbiwgc3VwcHJlc3MpO1xuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcInZpcnR1YWxCYXNlXCIpKVxuXHRcdFx0dGhpcy50cmlnZ2VyKEV2ZW50cy5WYWx1ZUNoYW5nZWQsIHNlbGVjdGlvbik7XG5cblx0XHRjb25zdCBtYXggPSB0aGlzLm1vZGVsLmdldChcIm11bHRpTWF4XCIpO1xuXHRcdGlmIChtYXggPiAwKVxuXHRcdFx0dGhpcy5tb2RlbC5zZXQoXCJjbGlja2FibGVcIiwgc2VsZWN0aW9uLmxlbmd0aCA8IG1heCk7XG5cblx0XHQvLyBJZiB3ZSdyZSBpbiBmbGF0IG1vZGUsIHNldCB0aGUgbmV3IGVsbGlwc2lzIGNhcnJpZXJcblx0XHRjb25zdCB3ID0gdGhpcy5tb2RlbC5nZXQoXCJyZWFsV2lkdGhcIikgLSA1O1xuXG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwiZmxhdFwiKSAmJiBzZWxlY3Rpb24ubGVuZ3RoICYmIHcpIHtcblx0XHRcdGNvbnN0IGNhcnJpZXIgPSB0aGlzLmNvbGxlY3Rpb24uZmluZCh7IGVsbGlwc2lzOiB0cnVlIH0pO1xuXG5cdFx0XHRsZXQgd2ZpbmFsID0gMDtcblxuXHRcdFx0Ly8gSXRlcmF0ZSB0aGUgc2VsZWN0aW9uIGluIG9yZGVyIHVudGlsIHdlJ3ZlIGZpbGxlZCB0aGUgZWxlbWVudFxuXHRcdFx0Xy5lYWNoKHNlbGVjdGlvbiwgKGUsIGkpID0+IHtcblx0XHRcdFx0aWYgKCFlLmhhcyhcInJlYWxXaWR0aFwiKSlcblx0XHRcdFx0XHRlLnRyaWdnZXIoXCJnZW5lcmF0ZVdpZHRoXCIpO1xuXG5cdFx0XHRcdGlmICh3ZmluYWwgPCB3KSB7XG5cdFx0XHRcdFx0Y29uc3QgbGVuID0gZS5nZXQoXCJyZWFsV2lkdGhcIik7XG5cdFx0XHRcdFx0d2ZpbmFsICs9IGxlbjtcblx0XHRcdFx0XHRpZiAoaSA+IDApXG5cdFx0XHRcdFx0XHR3ZmluYWwgKz0gNDtcblxuXHRcdFx0XHRcdGlmIChlLmdldChcIm5vc2hvd1wiKSlcblx0XHRcdFx0XHRcdGUuc2V0KHsgbm9zaG93OiBmYWxzZSB9KTtcblxuXHRcdFx0XHRcdGlmICh3ZmluYWwgPj0gdyAmJiBjYXJyaWVyKVxuXHRcdFx0XHRcdFx0Y2Fycmllci5zZXQoeyBlbGxpcHNpczogZmFsc2UgfSk7XG5cdFx0XHRcdFx0aWYgKHdmaW5hbCA+PSB3ICYmIGUpXG5cdFx0XHRcdFx0XHRlLnNldCh7IGVsbGlwc2lzOiB0cnVlIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdGUuc2V0KHsgbm9zaG93OiB0cnVlIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHQvLyBDbG9zZSB0aGUgY2hvb3NlciBtYXliZS4gRWxzZSwgY2hlY2sgaWYgd2UgbmVlZCB0byByZXBvc2l0aW9uIGl0LlxuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcImNsb3NlT25DaG9vc2VcIikgJiYgIWRlZmF1bHRTZWxlY3Rpb24pXG5cdFx0XHR0aGlzLmNsb3NlKCk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5yZXBvc2l0aW9uRHJvcGRvd24oKTtcblx0fSxcblxuXHQvLyBNb2RlbGVkIHJvdWdobHkgb24gTWFyaW9uZXR0ZSdzIHJlZ2lvbnMnIFwic2hvd1wiXG5cdHNob3c6IGZ1bmN0aW9uKG9wdGlvbnMgPSB7fSkge1xuXHRcdHRoaXMuYmluZFVJRWxlbWVudHMoKTtcblxuXHRcdC8vIFVzZSBhbnkgZXhwbGljaXRseS1wcm92aWRlZCBlbGVtZW50LCBlbHNlIGZhbGwgYmFjayB0byBvbmUgcHJvdmlkZWQgYmVmb3JlXG5cdFx0bGV0IGF0dGFjaFBvaW50ID0gb3B0aW9ucy5lbCB8fCB0aGlzLl9lbDtcblxuXHRcdGlmICghYXR0YWNoUG9pbnQpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJObyBET00gbG9jYXRpb24gcHJvdmlkZWQgdG8gU2VsZWN0cmFcIik7XG5cblx0XHRpZiAoXy5pc1N0cmluZyhvcHRpb25zKSB8fCBvcHRpb25zIGluc3RhbmNlb2YgJCkge1xuXHRcdFx0YXR0YWNoUG9pbnQgPSBvcHRpb25zO1xuXHRcdFx0YXR0YWNoUG9pbnQgPSAkKGF0dGFjaFBvaW50KTtcblx0XHR9XG5cblx0XHQvLyBJZiB0aGUgYXR0YWNobWVudCBwb2ludCBpcyBhbiBpbnB1dCBvZiBzb21lIGtpbmQsIHdlIHdpbGwgc3RlYWwgaXRcblx0XHQvLyB0byBhbGxvdyBjYWxsaW5nIFwidmFsKClcIiBvbiB0aGUgZWxlbWVudCBsYXRlciBmcm9tIGNsaWVudCBjb2RlXG5cdFx0aWYgKGF0dGFjaFBvaW50LmlzICYmIGF0dGFjaFBvaW50LmlzKFwiOmlucHV0XCIpKSB7XG5cdFx0XHR0aGlzLl9pbnB1dCA9IGF0dGFjaFBvaW50O1xuXHRcdFx0aWYgKHRoaXMuX2lucHV0LmlzKFwic2VsZWN0XCIpKVxuXHRcdFx0XHR0aGlzLm1vZGVsLnNldCh7IGlucHV0SXNTZWxlY3Q6IHRydWUgfSk7XG5cblx0XHRcdGlmIChhdHRhY2hQb2ludC5wcm9wKFwiZGlzYWJsZWRcIikpXG5cdFx0XHRcdHRoaXMubW9kZWwuc2V0KHsgZGlzYWJsZWQ6IHRydWUgfSk7XG5cdFx0XHRpZiAoYXR0YWNoUG9pbnQuaXMoXCJzZWxlY3RcIikpIHtcblx0XHRcdFx0aWYgKGF0dGFjaFBvaW50LnByb3AoXCJtdWx0aXBsZVwiKSlcblx0XHRcdFx0XHR0aGlzLm1vZGVsLnNldCh7IG11bHRpcGxlOiB0cnVlIH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIElmIHRoZSBiYXNlIGlzIHZpcnR1YWwsIGRvbid0IGFjdHVhbGx5IGFkZCBpdCB0byB0aGUgRE9NLlxuXHRcdC8vIFJlbmRlciBpdCBhbmQgcmV0dXJuIGl0IGZvciBsYXRlciBtYW5pcHVsYXRpb24uXG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwidmlydHVhbEJhc2VcIikpIHtcblx0XHRcdHRoaXMuX2VsID0gYXR0YWNoUG9pbnQ7XG5cdFx0XHRjb25zdCByZXQgPSB0aGlzLnJlbmRlcigpO1xuXHRcdFx0c2V0VGltZW91dCgoKSA9PiB0aGlzLm9uQXR0YWNoKCksIDApO1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5faW5wdXQpIHtcblx0XHRcdC8vIEhpZGUgdGhlIGlucHV0XG5cdFx0XHR0aGlzLl9pbnB1dC5jc3MoeyBkaXNwbGF5OiBcIm5vbmVcIiB9KTtcblx0XHRcdC8vIEFkZCBhIGR1bW15IG9wdGlvbiBpZiBuZWVkZWRcblx0XHRcdC8vaWYgKCQoXCJvcHRpb25cIiwgdGhpcy5faW5wdXQpLmxlbmd0aCA9PT0gMClcblx0XHRcdC8vXHR0aGlzLl9pbnB1dC5hcHBlbmQoXCI8b3B0aW9uIHZhbHVlPScnIHNlbGVjdGVkLz5cIik7XG5cblx0XHRcdC8vIEFuZCBzaG93IFNlbGVjdHJhXG5cdFx0XHRhdHRhY2hQb2ludC5hZnRlcih0aGlzLnJlbmRlcigpLmVsKTtcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4gdGhpcy5vbkF0dGFjaCgpLCAwKTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoYXR0YWNoUG9pbnQgaW5zdGFuY2VvZiBCYWNrYm9uZS5NYXJpb25ldHRlLlJlZ2lvbikge1xuXHRcdFx0YXR0YWNoUG9pbnQuc2hvdyh0aGlzKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRhdHRhY2hQb2ludC5hcHBlbmQodGhpcy5yZW5kZXIoKS5lbCk7XG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHRoaXMub25BdHRhY2goKSwgMCk7XG5cdFx0fVxuXHR9LFxuXG5cdGdldFZhbHVlOiBmdW5jdGlvbihvcHRpb25zID0ge30pIHtcblx0XHRjb25zdCBidXMgPSBCYWNrYm9uZS5SYWRpby5jaGFubmVsKHRoaXMubW9kZWwuZ2V0KFwiYnVzQ2hhbm5lbFwiKSk7XG5cdFx0cmV0dXJuIGJ1cy5yZXF1ZXN0KEV2ZW50cy5SZXF1ZXN0cy5WYWx1ZSwgb3B0aW9ucyk7XG5cdH0sXG5cblx0dmFsOiBmdW5jdGlvbihvcHRpb25zID0ge30pIHtcblx0XHRyZXR1cm4gdGhpcy5nZXRWYWx1ZShvcHRpb25zKTtcblx0fSxcblxuXHRnZXRTZWxlY3RlZDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKF8uaXNVbmRlZmluZWQodGhpcy5fY3VycmVudFNlbGVjdGlvbikpXG5cdFx0XHRyZXR1cm4gW107XG5cblx0XHRyZXR1cm4gXy5tYXAodGhpcy5fY3VycmVudFNlbGVjdGlvbiB8fCBbXSwgeCA9PiB4LnRvSlNPTigpKTtcblx0fSxcblxuXHRjbGVhcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jb2xsZWN0aW9uLmVhY2goeCA9PiB4LnNldCh7IHNlbGVjdGVkOiBmYWxzZSB9KSk7XG5cdFx0dGhpcy5vblNlbGVjdGlvbkNoYW5nZSh0aGlzLmNvbGxlY3Rpb24ubW9kZWxzLCBmYWxzZSk7XG5cblx0XHR0aGlzLl9jdXJyZW50U2VsZWN0aW9uID0gW107XG5cblx0XHQvLyBDbG9zZSBpdCBpZiBvcGVuXG5cdFx0Y29uc3QgYnVzID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbCh0aGlzLm1vZGVsLmdldChcImJ1c0NoYW5uZWxcIikpO1xuXHRcdGJ1cy50cmlnZ2VyKEV2ZW50cy5Db21tYW5kcy5DbG9zZSk7XG5cblx0XHQvLyBXaXBlIGFsbCBpdGVtcyBmcm9tIHRoZSBjdXJyZW50IGNvbGxlY3Rpb24uXG5cdFx0aWYgKHRoaXMuY29sbGVjdGlvbi5mdWxsQ29sbGVjdGlvbilcblx0XHRcdHRoaXMuY29sbGVjdGlvbi5mdWxsQ29sbGVjdGlvbi5yZXNldChbXSk7XG5cblx0XHR0aGlzLmNvbGxlY3Rpb24ucmVzZXQoW10pO1xuXHR9LFxufSk7XG5cblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy9cblxuXG5cblxuY29uc3QgU2VsZWN0cmEgPSBmdW5jdGlvbihvcHRpb25zID0ge30pIHtcblx0Y29uc3QgbW9kZWxBdHRyaWJ1dGVzID0gXy5vbWl0KG9wdGlvbnMsIHNlbGVjdHJhRmllbGRzLCB2aWV3RmllbGRzKTtcblxuXHRtb2RlbEF0dHJpYnV0ZXMuYnVzQ2hhbm5lbCA9IG9wdGlvbnMuYnVzQ2hhbm5lbCB8fCBcInNlbGVjdHJhLVwiICsgXy5yYW5kb20oOTAwNzE5OTI1NDc0MDk5MCk7XG5cdG1vZGVsQXR0cmlidXRlcy5rZXkgPSBvcHRpb25zLnNlcnZlciA/IChvcHRpb25zLnNlcnZlci5rZXkgfHwgXCJrZXlcIikgOiAob3B0aW9ucy5rZXkgfHwgXCJrZXlcIik7XG5cdG1vZGVsQXR0cmlidXRlcy52YWx1ZSA9IG9wdGlvbnMuc2VydmVyID8gKG9wdGlvbnMuc2VydmVyLnZhbHVlIHx8IFwidmFsdWVcIikgOiAob3B0aW9ucy52YWx1ZSB8fCBcInZhbHVlXCIpO1xuXG5cdGlmIChtb2RlbEF0dHJpYnV0ZXMubXVsdGlwbGUpIHtcblx0XHRpZiAobW9kZWxBdHRyaWJ1dGVzLmZsYXQgJiYgIShcImxvY2tlZExpc3RcIiBpbiBtb2RlbEF0dHJpYnV0ZXMpKVxuXHRcdFx0bW9kZWxBdHRyaWJ1dGVzLmxvY2tlZExpc3QgPSB0cnVlO1xuXHRcdGlmICghKFwicHJldmlld1NlbGVjdGlvblwiIGluIG1vZGVsQXR0cmlidXRlcykpXG5cdFx0XHRtb2RlbEF0dHJpYnV0ZXMucHJldmlld1NlbGVjdGlvbiA9IGZhbHNlO1xuXHR9XG5cdGVsc2Uge1xuXHRcdGlmICghbW9kZWxBdHRyaWJ1dGVzLnBsYWNlaG9sZGVyKVxuXHRcdFx0bW9kZWxBdHRyaWJ1dGVzLnBsYWNlaG9sZGVyID0gXCI8IG5vIHZhbHVlIHNlbGVjdGVkID5cIjtcblx0XHRpZiAobW9kZWxBdHRyaWJ1dGVzLmNsb3NlT25DaG9vc2UgIT09IGZhbHNlKVxuXHRcdFx0bW9kZWxBdHRyaWJ1dGVzLmNsb3NlT25DaG9vc2UgPSB0cnVlO1xuXHR9XG5cblx0Y29uc3Qgc2VydmVyRGVmYXVsdHMgPSB7XG5cdFx0ZGVsYXlMb2FkOiB0cnVlLFxuXHR9O1xuXG5cdGNvbnN0IHBhZ2luZ0RlZmF1bHRzID0ge1xuXHRcdGluZmluaXRlOiB0cnVlLFxuXHR9O1xuXG5cdGlmIChtb2RlbEF0dHJpYnV0ZXMuc2VydmVyKVxuXHRcdG1vZGVsQXR0cmlidXRlcy5zZXJ2ZXIgPSBfLmV4dGVuZChzZXJ2ZXJEZWZhdWx0cywgbW9kZWxBdHRyaWJ1dGVzLnNlcnZlcik7XG5cdGlmIChtb2RlbEF0dHJpYnV0ZXMucGFnaW5nKVxuXHRcdG1vZGVsQXR0cmlidXRlcy5wYWdpbmcgPSBfLmV4dGVuZChwYWdpbmdEZWZhdWx0cywgbW9kZWxBdHRyaWJ1dGVzLnBhZ2luZyk7XG5cblx0aWYgKG1vZGVsQXR0cmlidXRlcy5hbGxvd0NyZWF0aW9uKSB7XG5cdFx0bW9kZWxBdHRyaWJ1dGVzLmFsbG93Q3JlYXRpb24uZ2V0S2V5ID0gbW9kZWxBdHRyaWJ1dGVzLmFsbG93Q3JlYXRpb24uZ2V0S2V5IHx8IF8uaWRlbnRpdHk7XG5cdFx0bW9kZWxBdHRyaWJ1dGVzLmFsbG93Q3JlYXRpb24uZ2V0VmFsdWUgPSBtb2RlbEF0dHJpYnV0ZXMuYWxsb3dDcmVhdGlvbi5nZXRWYWx1ZSB8fCBfLmlkZW50aXR5O1xuXHR9XG5cblx0dGhpcy5tb2RlbCA9IG5ldyBCYXNlTW9kZWwobW9kZWxBdHRyaWJ1dGVzKTtcblxuXHRpZiAoIXRoaXMubW9kZWwuaXNWYWxpZCgpKVxuXHRcdHRocm93IG5ldyBFcnJvcih0aGlzLm1vZGVsLnZhbGlkYXRpb25FcnJvcik7XG5cblx0bGV0IGJvb3RzdHJhcCA9IFtdO1xuXHRsZXQgY2F0ZWdvcmllcyA9IFtdO1xuXG5cdC8vIENvdXBsZSB3YXlzIHRvIHN1cHBseSBpdGVtcyB0byBib290c3RyYXAgdGhlIHNlbGVjdGlvblxuXHQvLyBJZiB3ZSdyZSBydW5uaW5nIGluIHNlcnZlciBtb2RlLCBidXQgZGVsYXllZCwgdGhlbiBza2lwIHRoaXMuXG5cdGlmIChvcHRpb25zLml0ZW1zICYmICghdGhpcy5tb2RlbC5nZXQoXCJzZXJ2ZXJcIikgfHwgIXRoaXMubW9kZWwuZ2V0KFwic2VydmVyXCIpLmRlbGF5TG9hZCkpIHtcblx0XHRjb25zdCBkb0l0ZW1zID0gYXJyID0+IHtcblx0XHRcdGNvbnN0IHNldCA9IF8uY29tcGFjdChhcnIpO1xuXHRcdFx0aWYgKF8uc29tZShzZXQsIHggPT4gIV8uaXNQbGFpbk9iamVjdCh4KSkpIHtcblx0XHRcdFx0Ly8gQXJyYXkgb2YgcHJpbWl0aXZlcy4gVGhlIGl0ZW0gdmFsdWUgd2lsbCBiZSB0cmVhdGVkIGFzIHRoZSBpZC5cblx0XHRcdFx0cmV0dXJuIF8ubWFwKHNldCwgeCA9PiAoe1xuXHRcdFx0XHRcdGtleTogeCxcblx0XHRcdFx0XHR2YWx1ZTogeCxcblx0XHRcdFx0fSkpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gc2V0O1xuXHRcdH07XG5cblx0XHRpZiAoXy5pc1BsYWluT2JqZWN0KG9wdGlvbnMuaXRlbXMpKSB7XG5cdFx0XHQvLyBNYXAgb2YgY2F0ZWdvcmllcyB0byBpdGVtc1xuXHRcdFx0Xy5lYWNoKG9wdGlvbnMuaXRlbXMsICh2YWwsIGtleSkgPT4ge1xuXHRcdFx0XHRpZiAoa2V5KVxuXHRcdFx0XHRcdGNhdGVnb3JpZXMucHVzaChrZXkpO1xuXG5cdFx0XHRcdGxldCByZXN1bHQ7XG5cdFx0XHRcdGlmIChib290c3RyYXAubGVuZ3RoICsgdmFsLmxlbmd0aCA+IHRoaXMubW9kZWwuZ2V0KFwibWF4SXRlbXNcIikpXG5cdFx0XHRcdFx0cmVzdWx0ID0gXy50YWtlKHRoaXMubW9kZWwuZ2V0KFwibWF4SXRlbXNcIikgLSBib290c3RyYXAubGVuZ3RoLCB2YWwpO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0cmVzdWx0ID0gdmFsO1xuXG5cdFx0XHRcdGNvbnN0IGkgPSBfLm1hcChkb0l0ZW1zKHJlc3VsdCksIHggPT4ge1xuXHRcdFx0XHRcdGlmICh4LmNhdGVnb3JpZXMgJiYgIV8uaW5jbHVkZXMoeC5jYXRlZ29yaWVzLCBrZXkpKVxuXHRcdFx0XHRcdFx0eC5jYXRlZ29yaWVzLnB1c2goa2V5KTtcblxuXHRcdFx0XHRcdGlmICgheC5jYXRlZ29yaWVzKVxuXHRcdFx0XHRcdFx0eC5jYXRlZ29yaWVzID0gW2tleV07XG5cblx0XHRcdFx0XHRyZXR1cm4geDtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdGJvb3RzdHJhcCA9IGJvb3RzdHJhcC5jb25jYXQoaSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRib290c3RyYXAgPSBkb0l0ZW1zKF8udGFrZShvcHRpb25zLml0ZW1zLCB0aGlzLm1vZGVsLmdldChcIm1heEl0ZW1zXCIpKSk7XG5cblx0XHRcdGNhdGVnb3JpZXMgPSBfLnVuaXEoXy5jb21wYWN0KF8uZmxhdHRlbihib290c3RyYXAubWFwKHggPT4geC5jYXRlZ29yaWVzKSkpKTtcblx0XHR9XG5cdH1cblxuXHRpZiAodGhpcy5tb2RlbC5nZXQoXCJzZXJ2ZXJcIikpIHtcblx0XHRjb25zdCBNb2RlbCA9IEl0ZW1Nb2RlbC5leHRlbmQoe1xuXHRcdFx0aWRBdHRyaWJ1dGU6IG1vZGVsQXR0cmlidXRlcy5rZXksXG5cdFx0XHR1cmxSb290OiBtb2RlbEF0dHJpYnV0ZXMubW9kZWxVcmxSb290LFxuXHRcdH0pO1xuXG5cdFx0Ly8gSG9sZHMgdGhlIGl0ZW1zIHdlJ3JlIGRpc3BsYXlpbmdcblx0XHR0aGlzLmNvbGxlY3Rpb24gPSBuZXcgSW5maW5pdGVDb2xsZWN0aW9uKF8udGFrZShib290c3RyYXAsIHRoaXMubW9kZWwuZ2V0KFwibWF4SXRlbXNcIikpLCB7XG5cdFx0XHRzdGF0ZToge1xuXHRcdFx0XHRwYWdlU2l6ZTogdGhpcy5tb2RlbC5nZXQoXCJwYWdpbmdcIikgPyB0aGlzLm1vZGVsLmdldChcInBhZ2luZ1wiKS5wYWdlU2l6ZSA6IDk5OTk5OTksXG5cdFx0XHR9LFxuXHRcdFx0dXJsOiB0aGlzLm1vZGVsLmdldChcInNlcnZlclwiKS5mZXRjaCxcblx0XHRcdG1hcDogdGhpcy5tb2RlbC5nZXQoXCJzZXJ2ZXJcIikubWFwLFxuXHRcdFx0cGFyYW1zOiB0aGlzLm1vZGVsLmdldChcInNlcnZlclwiKS5wYXJhbXMgfHwgbnVsbCxcblx0XHRcdG1vZGVsOiBNb2RlbCxcblx0XHR9KTtcblx0fVxuXHRlbHNlIHtcblx0XHRpZiAoIXRoaXMubW9kZWwuZ2V0KFwic2hvd0NhdGVnb3JpZXNcIikpXG5cdFx0XHRjYXRlZ29yaWVzID0gW107XG5cblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJzb3J0Q2F0ZWdvcmllc1wiKSkge1xuXHRcdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwic29ydENhdGVnb3JpZXNcIikgPT09IHRydWUpXG5cdFx0XHRcdGNhdGVnb3JpZXMgPSBjYXRlZ29yaWVzLnNvcnQoKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0Y2F0ZWdvcmllcyA9IF8uc29ydEJ5KGNhdGVnb3JpZXMsIHRoaXMubW9kZWwuZ2V0KFwic29ydENhdGVnb3JpZXNcIikpO1xuXHRcdH1cblxuXHRcdC8vIEhvbGRzIHRoZSBpdGVtcyB3ZSdyZSBkaXNwbGF5aW5nXG5cdFx0dGhpcy5jb2xsZWN0aW9uID0gbmV3IENsaWVudENvbGxlY3Rpb24oYm9vdHN0cmFwLCB7XG5cdFx0XHRzdGF0ZToge1xuXHRcdFx0XHRwYWdlU2l6ZTogdGhpcy5tb2RlbC5nZXQoXCJwYWdpbmdcIikgPyB0aGlzLm1vZGVsLmdldChcInBhZ2luZ1wiKS5wYWdlU2l6ZSA6IDk5OTk5OTksXG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5jb2xsZWN0aW9uLmNhdGVnb3JpZXMgPSBjYXRlZ29yaWVzO1xuXHR9XG5cblx0bGV0IGF0dGFjaFBvaW50ID0gb3B0aW9ucy5lbDtcblxuXHRpZiAoYXR0YWNoUG9pbnQpIHtcblx0XHRpZiAoXy5pc1N0cmluZyhhdHRhY2hQb2ludCkgfHwgYXR0YWNoUG9pbnQgaW5zdGFuY2VvZiAkKVxuXHRcdFx0YXR0YWNoUG9pbnQgPSAkKGF0dGFjaFBvaW50KTtcblxuXHRcdC8vIENoZWNrIGZvciBwcm9wZXJ0aWVzIG9uIHRoZSBhdHRhY2htZW50IGVsZW1lbnRcblx0XHRpZiAoYXR0YWNoUG9pbnQuaXMgJiYgYXR0YWNoUG9pbnQuaXMoXCI6aW5wdXRcIikpIHtcblx0XHRcdGlmIChhdHRhY2hQb2ludC5wcm9wKFwiZGlzYWJsZWRcIikpXG5cdFx0XHRcdHRoaXMubW9kZWwuc2V0KHsgZGlzYWJsZWQ6IHRydWUgfSk7XG5cdFx0XHRpZiAoYXR0YWNoUG9pbnQuaXMoXCJzZWxlY3RcIikgJiYgYXR0YWNoUG9pbnQucHJvcChcIm11bHRpcGxlXCIpICYmICF0aGlzLm1vZGVsLmdldChcIm11bHRpcGxlXCIpKSB7XG5cdFx0XHRcdHRoaXMubW9kZWwuc2V0KHsgbXVsdGlwbGU6IHRydWUgfSk7XG5cdFx0XHRcdC8vIFdlIG1heSBoYXZlIHNldCB0aGVzZSB2YWx1ZXMgZWFybGllciwgYmVmb3JlIHdlIGtuZXcgdGhpcyB3YXMgYSBtdWx0aXBsZSBlbGVtZW50XG5cdFx0XHRcdC8vIFVuc2V0IHRoZW0gaGVyZVxuXHRcdFx0XHRpZiAoIW9wdGlvbnMucGxhY2Vob2xkZXIpXG5cdFx0XHRcdFx0dGhpcy5tb2RlbC5zZXQoeyBwbGFjZWhvbGRlcjogQmFzZU1vZGVsLnByb3RvdHlwZS5kZWZhdWx0cy5wbGFjZWhvbGRlciB9KTtcblx0XHRcdFx0aWYgKG9wdGlvbnMuY2xvc2VPbkNob29zZSAhPT0gdHJ1ZSlcblx0XHRcdFx0XHR0aGlzLm1vZGVsLnNldCh7IGNsb3NlT25DaG9vc2U6IEJhc2VNb2RlbC5wcm90b3R5cGUuZGVmYXVsdHMuY2xvc2VPbkNob29zZSB9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBDcmVhdGUgdGhlIHZpZXcgbm93XG5cdGlmICh0aGlzLm1vZGVsLmdldChcIm11bHRpcGxlXCIpKSB7XG5cdFx0cmV0dXJuIG5ldyBNdWx0aUJhc2Uoe1xuXHRcdFx0aG9zdDogdGhpcyxcblx0XHRcdG1vZGVsOiB0aGlzLm1vZGVsLFxuXHRcdFx0Y29sbGVjdGlvbjogdGhpcy5jb2xsZWN0aW9uLFxuXHRcdH0pO1xuXHR9XG5cblx0cmV0dXJuIG5ldyBTaW5nbGVCYXNlKHtcblx0XHRob3N0OiB0aGlzLFxuXHRcdG1vZGVsOiB0aGlzLm1vZGVsLFxuXHRcdGNvbGxlY3Rpb246IHRoaXMuY29sbGVjdGlvbixcblx0fSk7XG59O1xuXG5TZWxlY3RyYS5FdmVudHMgPSBFdmVudHM7XG5tb2R1bGUuZXhwb3J0cyA9IFNlbGVjdHJhOyJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar _ = require(\"lodash\");\n\nvar Filter = require(\"./filter\");\nvar SimpleMenu = require(\"./simpleMenu\");\nvar InfiniteCollection = require(\"./infiniteCollection\");\n\nvar App = require(\"../index\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar FilterHost = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"filter-host-selector\",\n\n\tevents: {\n\t\tclick: \"toggleFilterList\"\n\t},\n\n\tgetTemplate: function getTemplate() {\n\t\treturn this.options.template || require(\"./templates/filterHost.nunj\").icon;\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tvar _this = this;\n\n\t\t_.bindAll(this);\n\n\t\tthis.options = options;\n\n\t\tthis.collection = new Backbone.Collection([], { model: Backbone.Model });\n\n\t\tthis.virtual = new Backbone.VirtualCollection(options.raw);\n\n\t\tthis.handlers = {};\n\t\tthis.filters = {};\n\t\tthis.externalFilters = {};\n\t\tthis.hasFilters = false;\n\t\tthis.filtersSynced = true;\n\t\tthis.serverParams = {};\n\t\tthis.baseUrl = options.raw.url;\n\n\t\t// infinite collections handle server params internally\n\t\tif (!(this.options.raw instanceof InfiniteCollection)) {\n\t\t\t// Wrap the collection's url fetch to append extra params\n\t\t\tthis.options.raw.url = function () {\n\t\t\t\tif (_.isFunction(_this.baseUrl)) _this.baseUrl = _this.baseUrl.call(_this.options.raw);\n\t\t\t\tvar url = _this.baseUrl;\n\n\t\t\t\tif (_.includes(url, \"?\")) url += \"&\";else url += \"?\";\n\n\t\t\t\turl += _.compact(_.map(_this.serverParams, function (v, k) {\n\t\t\t\t\tif (_.isArray(v) ? !v.length : !v) return null;\n\t\t\t\t\tif (_.isArray(v)) return _.map(v, function (x) {\n\t\t\t\t\t\treturn k + \"=\" + x;\n\t\t\t\t\t}).join(\"&\");\n\t\t\t\t\treturn k + \"=\" + v;\n\t\t\t\t})).join(\"&\");\n\n\t\t\t\treturn url;\n\t\t\t};\n\t\t}\n\n\t\tthis.listenTo(options.raw, \"reset\", this.refreshData);\n\n\t\tthis.listenTo(Filter.Events, \"menu:close\", this.hideFilterList.bind(this));\n\n\t\tthis.listenTo(radio, App.Events.PageChange, this.hideFilterList.bind(this));\n\n\t\t_.each(options.filters, this.addFilter.bind(this));\n\n\t\t_.each(options.externalFilters || [], this.addExternalFilter.bind(this));\n\n\t\tif (options.defaultFilters.length === options.filters.length) {\n\t\t\t// If all filters start off enabled, don't show the filter toggle\n\t\t\tthis.$el.addClass(\"hide\");\n\t\t}\n\n\t\tthis.host = options.host || \"body\";\n\n\t\tif (this.virtual.length) {\n\t\t\tthis.updateFilters();\n\t\t\tthis.refreshData();\n\t\t}\n\t},\n\n\tonDestroy: function onDestroy() {\n\t\tif (this.list) this.list.destroy();\n\t\tthis.removeAllFilters();\n\t},\n\n\tgetServerFilters: function getServerFilters() {\n\t\treturn this.serverParams;\n\t},\n\n\tenableDefaultFilters: function enableDefaultFilters() {\n\t\tvar _this2 = this;\n\n\t\t_.each(this.options.defaultFilters, function (item) {\n\t\t\t_this2.filterToggled(item, true);\n\t\t});\n\t},\n\n\thideFilterList: function hideFilterList() {\n\t\tif (this.list) this.list.destroy();\n\t},\n\n\thideAllFilterLists: function hideAllFilterLists() {\n\t\tif (this.list) this.list.destroy();\n\n\t\t_.each(this.filters, function (val) {\n\t\t\tif (val.view && val.view.closeMenu) val.view.closeMenu();\n\t\t});\n\t},\n\n\ttoggleFilterList: function toggleFilterList(evt) {\n\t\tvar _this3 = this;\n\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\n\t\tif (this.list && !this.list.isDestroyed()) {\n\t\t\tthis.stopListening(this.list, \"clicked closing\");\n\t\t\tthis.list.destroy();\n\t\t\tthis.$el.removeClass(\"active\");\n\t\t} else {\n\t\t\tFilter.Events.trigger(\"menu:close\");\n\n\t\t\tthis.list = new SimpleMenu({\n\t\t\t\tanchor: this.$el,\n\t\t\t\thost: this.host,\n\t\t\t\tstructure: [{\n\t\t\t\t\ttype: \"choose-many\",\n\t\t\t\t\tname: \"filters\",\n\t\t\t\t\telements: this.collection.map(function (item) {\n\t\t\t\t\t\treturn { text: item.get(\"label\"), id: item.get(\"name\"), selected: Boolean(item.get(\"selected\")) };\n\t\t\t\t\t})\n\t\t\t\t}]\n\t\t\t});\n\t\t\tthis.list.show();\n\n\t\t\tthis.listenTo(this.list, \"clicked\", this.filterToggled.bind(this));\n\t\t\tthis.listenTo(this.list, \"closing\", function () {\n\t\t\t\t_this3.$el.removeClass(\"active\");\n\t\t\t});\n\t\t\tthis.$el.addClass(\"active\");\n\t\t}\n\t},\n\n\taddFilter: function addFilter(filter) {\n\t\tif (filter.type === \"hidden\") {\n\t\t\tthis.filters[filter.name] = filter;\n\t\t\tvar resolver = filter.resolver || _.identity;\n\t\t\tthis.handlers[filter.name] = filter.handler.bind(this, _.map(filter.initialValue ? filter.initialValue() : [true], resolver));\n\t\t\tthis.filtersSynced = false;\n\t\t} else {\n\t\t\tthis.collection.add(filter);\n\t\t\tthis.filters[filter.name] = filter;\n\n\t\t\t// Default filter? enable it now\n\t\t\tif (_.includes(this.options.defaultFilters, filter.name)) this.filterToggled(filter.name, true);\n\t\t}\n\t},\n\n\tgetFilterValue: function getFilterValue(filterName) {\n\t\tthis.filters[filterName].view.model.get(\"value\");\n\t},\n\n\tsetFilterValue: function setFilterValue(filterName, value) {\n\t\tthis.filters[filterName].view.updateInputValue(value);\n\t},\n\n\taddExternalFilter: function addExternalFilter(filter) {\n\t\tthis.externalFilters[filter.name] = filter;\n\n\t\tvar resolver = filter.resolver || _.identity;\n\t\tthis.handlers[filter.name] = filter.handler.bind(this, _.map(filter.initialValue ? filter.initialValue() : [true], resolver));\n\t\tthis.filtersSynced = false;\n\n\t\tthis.listenTo(filter, \"change changed\", this.onFilterChange.bind(this, filter.name));\n\t},\n\n\tremoveFilter: _.noop,\n\n\tremoveExternalFilter: _.noop,\n\n\tfilterToggled: function filterToggled(name, enabled) {\n\t\tvar id = name.id || name;\n\n\t\tif (enabled) {\n\t\t\t// Add new filter\n\t\t\tvar opts = this.filters[id];\n\t\t\topts.enabled = opts.type === \"toggle\" ? true : Boolean(this.virtual.length);\n\t\t\topts.host = this.host;\n\t\t\tthis.filters[id].view = new Filter.Control(opts);\n\n\t\t\tif (opts.server) {\n\t\t\t\tvar resolver = opts.resolver || _.identity;\n\t\t\t\tvar val = _.map(opts.initialValue ? opts.initialValue() : [], resolver);\n\t\t\t\tthis.serverParams[id] = val;\n\t\t\t\tif (_.isArray(val) ? val.length : val) this.updateServerFilters(!this.virtual.length);\n\t\t\t} else if (opts.initialValue) {\n\t\t\t\tvar _resolver = opts.resolver || _.identity;\n\t\t\t\tthis.handlers[id] = this.filters[id].handler.bind(this, _.map(opts.initialValue ? opts.initialValue() : [true], _resolver));\n\t\t\t\tthis.filtersSynced = false;\n\t\t\t}\n\n\t\t\tthis.listenTo(Filter.Events, id + \":selected\", this.onFilterChange.bind(this, id));\n\n\t\t\tthis.collection.each(function (item) {\n\t\t\t\tif (item.get(\"name\") === id) item.set(\"selected\", true);\n\t\t\t});\n\n\t\t\tif (!this.filters[id].hidden && this.filters[id].show !== false) {\n\t\t\t\tif (this.filters[id].view.selectraView) this.filters[id].view.show(this.options.filterContainer);else this.options.filterContainer.append(this.filters[id].view.render().el);\n\t\t\t}\n\n\t\t\tthis.updateFilters();\n\t\t} else if (id in this.filters) {\n\t\t\tthis.filters[id].view.destroy();\n\t\t\tthis.stopListening(Filter.Events, id + \":selected\");\n\t\t\tthis.collection.each(function (item) {\n\t\t\t\tif (item.get(\"name\") === id) item.set(\"selected\", false);\n\t\t\t});\n\t\t\tdelete this.filters[id].view;\n\n\t\t\tif (this.filters[id].server) {\n\t\t\t\t// Remove the server sync information\n\t\t\t\tdelete this.serverParams[id];\n\t\t\t\tthis.updateServerFilters();\n\t\t\t}\n\n\t\t\tif (id in this.handlers || this.filters[id].server) {\n\t\t\t\tdelete this.handlers[id];\n\t\t\t\tthis.filtersSynced = false;\n\t\t\t}\n\n\t\t\tvar change = this.updateFilters();\n\t\t\tif (change) this.refreshData();\n\t\t\tthis.trigger(\"changed\", change);\n\t\t}\n\t},\n\n\tclearFilters: function clearFilters() {\n\t\tthis.removeAllFilters();\n\t\tthis.updateFilters();\n\t\tthis.refreshData();\n\t},\n\n\tresetFilters: function resetFilters() {\n\t\tthis.removeAllFilters();\n\n\t\t_.each(this.options.filters, this.addFilter.bind(this));\n\n\t\t_.each(this.options.externalFilters || [], this.addExternalFilter.bind(this));\n\n\t\tthis.updateFilters();\n\t\tthis.refreshData();\n\t},\n\n\tremoveAllFilters: function removeAllFilters() {\n\t\tvar _this4 = this;\n\n\t\tvar _loop = function _loop(id) {\n\t\t\tif (_this4.filters[id].view) _this4.filters[id].view.destroy();\n\n\t\t\t_this4.stopListening(Filter.Events, id + \":selected\");\n\t\t\t_this4.collection.each(function (item) {\n\t\t\t\tif (item.get(\"name\") === id) item.set(\"selected\", false);\n\t\t\t});\n\n\t\t\tdelete _this4.filters[id].view;\n\n\t\t\tif (_this4.filters[id].server) {\n\t\t\t\t// Remove the server sync information\n\t\t\t\tdelete _this4.serverParams[id];\n\t\t\t}\n\n\t\t\tif (id in _this4.handlers) {\n\t\t\t\tdelete _this4.handlers[id];\n\t\t\t\t_this4.filtersSynced = false;\n\t\t\t\t_this4.updateFilters();\n\t\t\t}\n\t\t};\n\n\t\tfor (var id in this.filters) {\n\t\t\t_loop(id);\n\t\t}\n\t},\n\n\tonFilterChange: function onFilterChange(name, selection) {\n\t\t// When the user changes a filter, update the filter function for the appropriate virtual collection.\n\t\t// Re-filters the collection and propagates changes into the main collection\n\n\t\tvar filter = name in this.filters ? this.filters[name] : this.externalFilters[name];\n\t\tvar resolver = filter.resolver || _.identity;\n\n\t\tif (selection.length) {\n\t\t\t// Update any potential server-side filters\n\t\t\tif (filter.server) {\n\t\t\t\t// Use flatten to ensure strings are not exploded\n\t\t\t\tthis.serverParams[name] = _.map(_.flatten([selection]), resolver);\n\t\t\t\tthis.updateServerFilters();\n\t\t\t} else {\n\t\t\t\tthis.handlers[name] = filter.handler.bind(this, _.map(selection, resolver));\n\t\t\t}\n\t\t} else {\n\t\t\tdelete this.handlers[name];\n\t\t\tthis.serverParams[name] = _.map(selection, resolver);\n\t\t\tif (filter.server) this.updateServerFilters();\n\t\t}\n\n\t\tthis.filtersSynced = false;\n\n\t\tvar change = this.updateFilters();\n\t\tif (change) this.refreshData();\n\t\tthis.trigger(\"changed\", change);\n\t},\n\n\tupdateServerFilters: function updateServerFilters(noFetch) {\n\t\tif (noFetch) return;\n\n\t\tif (this.xhr) this.xhr.abort();\n\n\t\tthis.fetcher();\n\t},\n\n\tfetcher: _.debounce(function () {\n\t\t/* eslint-disable no-invalid-this */\n\n\t\tif (this.options.raw instanceof InfiniteCollection) this.xhr = this.options.raw.setServerFilters(this.serverParams);else this.xhr = this.options.raw.getFirstPage({ reset: true });\n\n\t\t/* eslint-enable no-invalid-this */\n\t}, 10),\n\n\tupdateFilters: function updateFilters(force) {\n\t\tvar _this5 = this;\n\n\t\tif (this.filtersSynced && !force) return false;\n\n\t\tthis.filtersSynced = true;\n\n\t\tif (_.keys(this.handlers).length === 0) {\n\t\t\tif (this.hasFilters) {\n\t\t\t\tthis.virtual.updateFilter({});\n\t\t\t\tthis.filterToggle();\n\t\t\t\tthis.hasFilters = false;\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\tthis.hasFilters = true;\n\n\t\t// Update the filter for the virtual collection\n\t\tthis.virtual.updateFilter(function (model) {\n\t\t\treturn _.every(_this5.handlers, function (func) {\n\t\t\t\treturn func(model);\n\t\t\t});\n\t\t});\n\n\t\tthis.filterToggle();\n\n\t\treturn true;\n\t},\n\n\tfilterToggle: function filterToggle() {\n\t\tvar _this6 = this;\n\n\t\tif (!this.options.raw.length) return;\n\n\t\t_.each(this.filters, function (item) {\n\t\t\tif (item.view && item.view.toggle) item.view.toggle(_this6.options.raw.length, true);\n\t\t});\n\t},\n\n\trefreshData: function refreshData() {\n\t\t/*var col = this.options.paged instanceof Backbone.PageableCollection ? this.options.paged.fullCollection : this.options.paged;\n  \tcol.reset(this.virtual.models);\n  \tif(this.options.paged instanceof Backbone.PageableCollection) {\n  \tvar state = this.options.paged.state;\n  \tif(this.options.paged.length <= (state.currentPage - 1) * state.pageSize)\n  \t\tthis.options.paged.getFirstPage();\n  }*/\n\n\t\tthis.filterToggle();\n\t}\n});\n\nmodule.exports = FilterHost;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNlcnZlckZpbHRlck1hbmFnZXIuanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwiXyIsIkZpbHRlciIsIlNpbXBsZU1lbnUiLCJJbmZpbml0ZUNvbGxlY3Rpb24iLCJBcHAiLCJyYWRpbyIsIlJhZGlvIiwiY2hhbm5lbCIsIkZpbHRlckhvc3QiLCJNYXJpb25ldHRlIiwiVmlldyIsImV4dGVuZCIsInRhZ05hbWUiLCJjbGFzc05hbWUiLCJldmVudHMiLCJjbGljayIsImdldFRlbXBsYXRlIiwib3B0aW9ucyIsInRlbXBsYXRlIiwiaWNvbiIsImluaXRpYWxpemUiLCJiaW5kQWxsIiwiY29sbGVjdGlvbiIsIkNvbGxlY3Rpb24iLCJtb2RlbCIsIk1vZGVsIiwidmlydHVhbCIsIlZpcnR1YWxDb2xsZWN0aW9uIiwicmF3IiwiaGFuZGxlcnMiLCJmaWx0ZXJzIiwiZXh0ZXJuYWxGaWx0ZXJzIiwiaGFzRmlsdGVycyIsImZpbHRlcnNTeW5jZWQiLCJzZXJ2ZXJQYXJhbXMiLCJiYXNlVXJsIiwidXJsIiwiaXNGdW5jdGlvbiIsImNhbGwiLCJpbmNsdWRlcyIsImNvbXBhY3QiLCJtYXAiLCJ2IiwiayIsImlzQXJyYXkiLCJsZW5ndGgiLCJ4Iiwiam9pbiIsImxpc3RlblRvIiwicmVmcmVzaERhdGEiLCJFdmVudHMiLCJoaWRlRmlsdGVyTGlzdCIsImJpbmQiLCJQYWdlQ2hhbmdlIiwiZWFjaCIsImFkZEZpbHRlciIsImFkZEV4dGVybmFsRmlsdGVyIiwiZGVmYXVsdEZpbHRlcnMiLCIkZWwiLCJhZGRDbGFzcyIsImhvc3QiLCJ1cGRhdGVGaWx0ZXJzIiwib25EZXN0cm95IiwibGlzdCIsImRlc3Ryb3kiLCJyZW1vdmVBbGxGaWx0ZXJzIiwiZ2V0U2VydmVyRmlsdGVycyIsImVuYWJsZURlZmF1bHRGaWx0ZXJzIiwiZmlsdGVyVG9nZ2xlZCIsIml0ZW0iLCJoaWRlQWxsRmlsdGVyTGlzdHMiLCJ2YWwiLCJ2aWV3IiwiY2xvc2VNZW51IiwidG9nZ2xlRmlsdGVyTGlzdCIsImV2dCIsInN0b3BQcm9wYWdhdGlvbiIsInByZXZlbnREZWZhdWx0IiwiaXNEZXN0cm95ZWQiLCJzdG9wTGlzdGVuaW5nIiwicmVtb3ZlQ2xhc3MiLCJ0cmlnZ2VyIiwiYW5jaG9yIiwic3RydWN0dXJlIiwidHlwZSIsIm5hbWUiLCJlbGVtZW50cyIsInRleHQiLCJnZXQiLCJpZCIsInNlbGVjdGVkIiwiQm9vbGVhbiIsInNob3ciLCJmaWx0ZXIiLCJyZXNvbHZlciIsImlkZW50aXR5IiwiaGFuZGxlciIsImluaXRpYWxWYWx1ZSIsImFkZCIsImdldEZpbHRlclZhbHVlIiwiZmlsdGVyTmFtZSIsInNldEZpbHRlclZhbHVlIiwidmFsdWUiLCJ1cGRhdGVJbnB1dFZhbHVlIiwib25GaWx0ZXJDaGFuZ2UiLCJyZW1vdmVGaWx0ZXIiLCJub29wIiwicmVtb3ZlRXh0ZXJuYWxGaWx0ZXIiLCJlbmFibGVkIiwib3B0cyIsIkNvbnRyb2wiLCJzZXJ2ZXIiLCJ1cGRhdGVTZXJ2ZXJGaWx0ZXJzIiwic2V0IiwiaGlkZGVuIiwic2VsZWN0cmFWaWV3IiwiZmlsdGVyQ29udGFpbmVyIiwiYXBwZW5kIiwicmVuZGVyIiwiZWwiLCJjaGFuZ2UiLCJjbGVhckZpbHRlcnMiLCJyZXNldEZpbHRlcnMiLCJzZWxlY3Rpb24iLCJmbGF0dGVuIiwibm9GZXRjaCIsInhociIsImFib3J0IiwiZmV0Y2hlciIsImRlYm91bmNlIiwic2V0U2VydmVyRmlsdGVycyIsImdldEZpcnN0UGFnZSIsInJlc2V0IiwiZm9yY2UiLCJrZXlzIiwidXBkYXRlRmlsdGVyIiwiZmlsdGVyVG9nZ2xlIiwiZXZlcnkiLCJmdW5jIiwidG9nZ2xlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUMsSUFBSUQsUUFBUSxRQUFSLENBQVY7O0FBRUEsSUFBTUUsU0FBU0YsUUFBUSxVQUFSLENBQWY7QUFDQSxJQUFNRyxhQUFhSCxRQUFR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LENBQVEsT0FBSzVHLFFBQWIsRUFBdUI7QUFBQSxXQUFRNkcsS0FBS2xILEtBQUwsQ0FBUjtBQUFBLElBQXZCLENBQVQ7QUFBQSxHQUExQjs7QUFFQSxPQUFLZ0gsWUFBTDs7QUFFQSxTQUFPLElBQVA7QUFDQSxFQTVXaUQ7O0FBOFdsREEsZUFBYyx3QkFBVztBQUFBOztBQUN4QixNQUFJLENBQUMsS0FBS3ZILE9BQUwsQ0FBYVcsR0FBYixDQUFpQmlCLE1BQXRCLEVBQ0M7O0FBRUQ3QyxJQUFFc0QsSUFBRixDQUFPLEtBQUt4QixPQUFaLEVBQXFCLGdCQUFRO0FBQzVCLE9BQUl1QyxLQUFLRyxJQUFMLElBQWFILEtBQUtHLElBQUwsQ0FBVW1FLE1BQTNCLEVBQ0N0RSxLQUFLRyxJQUFMLENBQVVtRSxNQUFWLENBQWlCLE9BQUsxSCxPQUFMLENBQWFXLEdBQWIsQ0FBaUJpQixNQUFsQyxFQUEwQyxJQUExQztBQUNELEdBSEQ7QUFJQSxFQXRYaUQ7O0FBd1hsREksY0FBYSx1QkFBVztBQUN2Qjs7Ozs7Ozs7QUFVQSxPQUFLdUYsWUFBTDtBQUNBO0FBcFlpRCxDQUFoQyxDQUFuQjs7QUF1WUFJLE9BQU9DLE9BQVAsR0FBaUJySSxVQUFqQiIsImZpbGUiOiJzZXJ2ZXJGaWx0ZXJNYW5hZ2VyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuXG5jb25zdCBGaWx0ZXIgPSByZXF1aXJlKFwiLi9maWx0ZXJcIik7XG5jb25zdCBTaW1wbGVNZW51ID0gcmVxdWlyZShcIi4vc2ltcGxlTWVudVwiKTtcbmNvbnN0IEluZmluaXRlQ29sbGVjdGlvbiA9IHJlcXVpcmUoXCIuL2luZmluaXRlQ29sbGVjdGlvblwiKTtcblxuY29uc3QgQXBwID0gcmVxdWlyZShcIi4uL2luZGV4XCIpO1xuXG5jb25zdCByYWRpbyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJnbG9iYWxcIik7XG5cbmNvbnN0IEZpbHRlckhvc3QgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogXCJkaXZcIixcblx0Y2xhc3NOYW1lOiBcImZpbHRlci1ob3N0LXNlbGVjdG9yXCIsXG5cblx0ZXZlbnRzOiB7XG5cdFx0Y2xpY2s6IFwidG9nZ2xlRmlsdGVyTGlzdFwiLFxuXHR9LFxuXG5cdGdldFRlbXBsYXRlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5vcHRpb25zLnRlbXBsYXRlIHx8IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9maWx0ZXJIb3N0Lm51bmpcIikuaWNvbjtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0Xy5iaW5kQWxsKHRoaXMpO1xuXG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuXHRcdHRoaXMuY29sbGVjdGlvbiA9IG5ldyBCYWNrYm9uZS5Db2xsZWN0aW9uKFtdLCB7IG1vZGVsOiBCYWNrYm9uZS5Nb2RlbCB9KTtcblxuXHRcdHRoaXMudmlydHVhbCA9IG5ldyBCYWNrYm9uZS5WaXJ0dWFsQ29sbGVjdGlvbihvcHRpb25zLnJhdyk7XG5cblx0XHR0aGlzLmhhbmRsZXJzID0ge307XG5cdFx0dGhpcy5maWx0ZXJzID0ge307XG5cdFx0dGhpcy5leHRlcm5hbEZpbHRlcnMgPSB7fTtcblx0XHR0aGlzLmhhc0ZpbHRlcnMgPSBmYWxzZTtcblx0XHR0aGlzLmZpbHRlcnNTeW5jZWQgPSB0cnVlO1xuXHRcdHRoaXMuc2VydmVyUGFyYW1zID0ge307XG5cdFx0dGhpcy5iYXNlVXJsID0gb3B0aW9ucy5yYXcudXJsO1xuXG5cdFx0Ly8gaW5maW5pdGUgY29sbGVjdGlvbnMgaGFuZGxlIHNlcnZlciBwYXJhbXMgaW50ZXJuYWxseVxuXHRcdGlmICghKHRoaXMub3B0aW9ucy5yYXcgaW5zdGFuY2VvZiBJbmZpbml0ZUNvbGxlY3Rpb24pKSB7XG5cdFx0XHQvLyBXcmFwIHRoZSBjb2xsZWN0aW9uJ3MgdXJsIGZldGNoIHRvIGFwcGVuZCBleHRyYSBwYXJhbXNcblx0XHRcdHRoaXMub3B0aW9ucy5yYXcudXJsID0gKCkgPT4ge1xuXHRcdFx0XHRpZiAoXy5pc0Z1bmN0aW9uKHRoaXMuYmFzZVVybCkpXG5cdFx0XHRcdFx0dGhpcy5iYXNlVXJsID0gdGhpcy5iYXNlVXJsLmNhbGwodGhpcy5vcHRpb25zLnJhdyk7XG5cdFx0XHRcdGxldCB1cmwgPSB0aGlzLmJhc2VVcmw7XG5cblx0XHRcdFx0aWYgKF8uaW5jbHVkZXModXJsLCBcIj9cIikpXG5cdFx0XHRcdFx0dXJsICs9IFwiJlwiO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dXJsICs9IFwiP1wiO1xuXG5cdFx0XHRcdHVybCArPSBfLmNvbXBhY3QoXy5tYXAodGhpcy5zZXJ2ZXJQYXJhbXMsICh2LCBrKSA9PiB7XG5cdFx0XHRcdFx0aWYgKF8uaXNBcnJheSh2KSA/ICF2Lmxlbmd0aCA6ICF2KVxuXHRcdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdFx0aWYgKF8uaXNBcnJheSh2KSlcblx0XHRcdFx0XHRcdHJldHVybiBfLm1hcCh2LCB4ID0+IGsgKyBcIj1cIiArIHgpLmpvaW4oXCImXCIpO1xuXHRcdFx0XHRcdHJldHVybiBrICsgXCI9XCIgKyB2O1xuXHRcdFx0XHR9KSkuam9pbihcIiZcIik7XG5cblx0XHRcdFx0cmV0dXJuIHVybDtcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0dGhpcy5saXN0ZW5UbyhvcHRpb25zLnJhdywgXCJyZXNldFwiLCB0aGlzLnJlZnJlc2hEYXRhKTtcblxuXHRcdHRoaXMubGlzdGVuVG8oRmlsdGVyLkV2ZW50cywgXCJtZW51OmNsb3NlXCIsIHRoaXMuaGlkZUZpbHRlckxpc3QuYmluZCh0aGlzKSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHJhZGlvLCBBcHAuRXZlbnRzLlBhZ2VDaGFuZ2UsIHRoaXMuaGlkZUZpbHRlckxpc3QuYmluZCh0aGlzKSk7XG5cblx0XHRfLmVhY2gob3B0aW9ucy5maWx0ZXJzLCB0aGlzLmFkZEZpbHRlci5iaW5kKHRoaXMpKTtcblxuXHRcdF8uZWFjaChvcHRpb25zLmV4dGVybmFsRmlsdGVycyB8fCBbXSwgdGhpcy5hZGRFeHRlcm5hbEZpbHRlci5iaW5kKHRoaXMpKTtcblxuXHRcdGlmIChvcHRpb25zLmRlZmF1bHRGaWx0ZXJzLmxlbmd0aCA9PT0gb3B0aW9ucy5maWx0ZXJzLmxlbmd0aCkge1xuXHRcdFx0Ly8gSWYgYWxsIGZpbHRlcnMgc3RhcnQgb2ZmIGVuYWJsZWQsIGRvbid0IHNob3cgdGhlIGZpbHRlciB0b2dnbGVcblx0XHRcdHRoaXMuJGVsLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR9XG5cblx0XHR0aGlzLmhvc3QgPSBvcHRpb25zLmhvc3QgfHwgXCJib2R5XCI7XG5cblx0XHRpZiAodGhpcy52aXJ0dWFsLmxlbmd0aCkge1xuXHRcdFx0dGhpcy51cGRhdGVGaWx0ZXJzKCk7XG5cdFx0XHR0aGlzLnJlZnJlc2hEYXRhKCk7XG5cdFx0fVxuXHR9LFxuXG5cdG9uRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMubGlzdClcblx0XHRcdHRoaXMubGlzdC5kZXN0cm95KCk7XG5cdFx0dGhpcy5yZW1vdmVBbGxGaWx0ZXJzKCk7XG5cdH0sXG5cblx0Z2V0U2VydmVyRmlsdGVyczogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuc2VydmVyUGFyYW1zO1xuXHR9LFxuXG5cdGVuYWJsZURlZmF1bHRGaWx0ZXJzOiBmdW5jdGlvbigpIHtcblx0XHRfLmVhY2godGhpcy5vcHRpb25zLmRlZmF1bHRGaWx0ZXJzLCBpdGVtID0+IHtcblx0XHRcdHRoaXMuZmlsdGVyVG9nZ2xlZChpdGVtLCB0cnVlKTtcblx0XHR9KTtcblx0fSxcblxuXHRoaWRlRmlsdGVyTGlzdDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMubGlzdClcblx0XHRcdHRoaXMubGlzdC5kZXN0cm95KCk7XG5cdH0sXG5cblx0aGlkZUFsbEZpbHRlckxpc3RzOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5saXN0KVxuXHRcdFx0dGhpcy5saXN0LmRlc3Ryb3koKTtcblxuXHRcdF8uZWFjaCh0aGlzLmZpbHRlcnMsIHZhbCA9PiB7XG5cdFx0XHRpZiAodmFsLnZpZXcgJiYgdmFsLnZpZXcuY2xvc2VNZW51KVxuXHRcdFx0XHR2YWwudmlldy5jbG9zZU1lbnUoKTtcblx0XHR9KTtcblx0fSxcblxuXHR0b2dnbGVGaWx0ZXJMaXN0OiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0ZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRpZiAodGhpcy5saXN0ICYmICF0aGlzLmxpc3QuaXNEZXN0cm95ZWQoKSkge1xuXHRcdFx0dGhpcy5zdG9wTGlzdGVuaW5nKHRoaXMubGlzdCwgXCJjbGlja2VkIGNsb3NpbmdcIik7XG5cdFx0XHR0aGlzLmxpc3QuZGVzdHJveSgpO1xuXHRcdFx0dGhpcy4kZWwucmVtb3ZlQ2xhc3MoXCJhY3RpdmVcIik7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0RmlsdGVyLkV2ZW50cy50cmlnZ2VyKFwibWVudTpjbG9zZVwiKTtcblxuXHRcdFx0dGhpcy5saXN0ID0gbmV3IFNpbXBsZU1lbnUoe1xuXHRcdFx0XHRhbmNob3I6IHRoaXMuJGVsLFxuXHRcdFx0XHRob3N0OiB0aGlzLmhvc3QsXG5cdFx0XHRcdHN0cnVjdHVyZTogW3tcblx0XHRcdFx0XHR0eXBlOiBcImNob29zZS1tYW55XCIsXG5cdFx0XHRcdFx0bmFtZTogXCJmaWx0ZXJzXCIsXG5cdFx0XHRcdFx0ZWxlbWVudHM6IHRoaXMuY29sbGVjdGlvbi5tYXAoaXRlbSA9PiAoeyB0ZXh0OiBpdGVtLmdldChcImxhYmVsXCIpLCBpZDogaXRlbS5nZXQoXCJuYW1lXCIpLCBzZWxlY3RlZDogQm9vbGVhbihpdGVtLmdldChcInNlbGVjdGVkXCIpKSB9KSksXG5cdFx0XHRcdH1dLFxuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLmxpc3Quc2hvdygpO1xuXG5cdFx0XHR0aGlzLmxpc3RlblRvKHRoaXMubGlzdCwgXCJjbGlja2VkXCIsIHRoaXMuZmlsdGVyVG9nZ2xlZC5iaW5kKHRoaXMpKTtcblx0XHRcdHRoaXMubGlzdGVuVG8odGhpcy5saXN0LCBcImNsb3NpbmdcIiwgKCkgPT4geyB0aGlzLiRlbC5yZW1vdmVDbGFzcyhcImFjdGl2ZVwiKTsgfSk7XG5cdFx0XHR0aGlzLiRlbC5hZGRDbGFzcyhcImFjdGl2ZVwiKTtcblx0XHR9XG5cdH0sXG5cblx0YWRkRmlsdGVyOiBmdW5jdGlvbihmaWx0ZXIpIHtcblx0XHRpZiAoZmlsdGVyLnR5cGUgPT09IFwiaGlkZGVuXCIpIHtcblx0XHRcdHRoaXMuZmlsdGVyc1tmaWx0ZXIubmFtZV0gPSBmaWx0ZXI7XG5cdFx0XHRjb25zdCByZXNvbHZlciA9IGZpbHRlci5yZXNvbHZlciB8fCBfLmlkZW50aXR5O1xuXHRcdFx0dGhpcy5oYW5kbGVyc1tmaWx0ZXIubmFtZV0gPSBmaWx0ZXIuaGFuZGxlci5iaW5kKHRoaXMsIF8ubWFwKGZpbHRlci5pbml0aWFsVmFsdWUgPyBmaWx0ZXIuaW5pdGlhbFZhbHVlKCkgOiBbdHJ1ZV0sIHJlc29sdmVyKSk7XG5cdFx0XHR0aGlzLmZpbHRlcnNTeW5jZWQgPSBmYWxzZTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLmNvbGxlY3Rpb24uYWRkKGZpbHRlcik7XG5cdFx0XHR0aGlzLmZpbHRlcnNbZmlsdGVyLm5hbWVdID0gZmlsdGVyO1xuXG5cdFx0XHQvLyBEZWZhdWx0IGZpbHRlcj8gZW5hYmxlIGl0IG5vd1xuXHRcdFx0aWYgKF8uaW5jbHVkZXModGhpcy5vcHRpb25zLmRlZmF1bHRGaWx0ZXJzLCBmaWx0ZXIubmFtZSkpXG5cdFx0XHRcdHRoaXMuZmlsdGVyVG9nZ2xlZChmaWx0ZXIubmFtZSwgdHJ1ZSk7XG5cdFx0fVxuXHR9LFxuXG5cdGdldEZpbHRlclZhbHVlOiBmdW5jdGlvbihmaWx0ZXJOYW1lKSB7XG5cdFx0dGhpcy5maWx0ZXJzW2ZpbHRlck5hbWVdLnZpZXcubW9kZWwuZ2V0KFwidmFsdWVcIik7XG5cdH0sXG5cblx0c2V0RmlsdGVyVmFsdWU6IGZ1bmN0aW9uKGZpbHRlck5hbWUsIHZhbHVlKSB7XG5cdFx0dGhpcy5maWx0ZXJzW2ZpbHRlck5hbWVdLnZpZXcudXBkYXRlSW5wdXRWYWx1ZSh2YWx1ZSk7XG5cdH0sXG5cblx0YWRkRXh0ZXJuYWxGaWx0ZXI6IGZ1bmN0aW9uKGZpbHRlcikge1xuXHRcdHRoaXMuZXh0ZXJuYWxGaWx0ZXJzW2ZpbHRlci5uYW1lXSA9IGZpbHRlcjtcblxuXHRcdGNvbnN0IHJlc29sdmVyID0gZmlsdGVyLnJlc29sdmVyIHx8IF8uaWRlbnRpdHk7XG5cdFx0dGhpcy5oYW5kbGVyc1tmaWx0ZXIubmFtZV0gPSBmaWx0ZXIuaGFuZGxlci5iaW5kKHRoaXMsIF8ubWFwKGZpbHRlci5pbml0aWFsVmFsdWUgPyBmaWx0ZXIuaW5pdGlhbFZhbHVlKCkgOiBbdHJ1ZV0sIHJlc29sdmVyKSk7XG5cdFx0dGhpcy5maWx0ZXJzU3luY2VkID0gZmFsc2U7XG5cblx0XHR0aGlzLmxpc3RlblRvKGZpbHRlciwgXCJjaGFuZ2UgY2hhbmdlZFwiLCB0aGlzLm9uRmlsdGVyQ2hhbmdlLmJpbmQodGhpcywgZmlsdGVyLm5hbWUpKTtcblx0fSxcblxuXHRyZW1vdmVGaWx0ZXI6IF8ubm9vcCxcblxuXHRyZW1vdmVFeHRlcm5hbEZpbHRlcjogXy5ub29wLFxuXG5cdGZpbHRlclRvZ2dsZWQ6IGZ1bmN0aW9uKG5hbWUsIGVuYWJsZWQpIHtcblx0XHRjb25zdCBpZCA9IG5hbWUuaWQgfHwgbmFtZTtcblxuXHRcdGlmIChlbmFibGVkKSB7XG5cdFx0XHQvLyBBZGQgbmV3IGZpbHRlclxuXHRcdFx0Y29uc3Qgb3B0cyA9IHRoaXMuZmlsdGVyc1tpZF07XG5cdFx0XHRvcHRzLmVuYWJsZWQgPSBvcHRzLnR5cGUgPT09IFwidG9nZ2xlXCIgPyB0cnVlIDogQm9vbGVhbih0aGlzLnZpcnR1YWwubGVuZ3RoKTtcblx0XHRcdG9wdHMuaG9zdCA9IHRoaXMuaG9zdDtcblx0XHRcdHRoaXMuZmlsdGVyc1tpZF0udmlldyA9IG5ldyBGaWx0ZXIuQ29udHJvbChvcHRzKTtcblxuXHRcdFx0aWYgKG9wdHMuc2VydmVyKSB7XG5cdFx0XHRcdGNvbnN0IHJlc29sdmVyID0gb3B0cy5yZXNvbHZlciB8fCBfLmlkZW50aXR5O1xuXHRcdFx0XHRjb25zdCB2YWwgPSBfLm1hcChvcHRzLmluaXRpYWxWYWx1ZSA/IG9wdHMuaW5pdGlhbFZhbHVlKCkgOiBbXSwgcmVzb2x2ZXIpO1xuXHRcdFx0XHR0aGlzLnNlcnZlclBhcmFtc1tpZF0gPSB2YWw7XG5cdFx0XHRcdGlmIChfLmlzQXJyYXkodmFsKSA/IHZhbC5sZW5ndGggOiB2YWwpXG5cdFx0XHRcdFx0dGhpcy51cGRhdGVTZXJ2ZXJGaWx0ZXJzKCF0aGlzLnZpcnR1YWwubGVuZ3RoKTtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKG9wdHMuaW5pdGlhbFZhbHVlKSB7XG5cdFx0XHRcdGNvbnN0IHJlc29sdmVyID0gb3B0cy5yZXNvbHZlciB8fCBfLmlkZW50aXR5O1xuXHRcdFx0XHR0aGlzLmhhbmRsZXJzW2lkXSA9IHRoaXMuZmlsdGVyc1tpZF0uaGFuZGxlci5iaW5kKHRoaXMsIF8ubWFwKG9wdHMuaW5pdGlhbFZhbHVlID8gb3B0cy5pbml0aWFsVmFsdWUoKSA6IFt0cnVlXSwgcmVzb2x2ZXIpKTtcblx0XHRcdFx0dGhpcy5maWx0ZXJzU3luY2VkID0gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubGlzdGVuVG8oRmlsdGVyLkV2ZW50cywgaWQgKyBcIjpzZWxlY3RlZFwiLCB0aGlzLm9uRmlsdGVyQ2hhbmdlLmJpbmQodGhpcywgaWQpKTtcblxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uLmVhY2goaXRlbSA9PiB7XG5cdFx0XHRcdGlmIChpdGVtLmdldChcIm5hbWVcIikgPT09IGlkKVxuXHRcdFx0XHRcdGl0ZW0uc2V0KFwic2VsZWN0ZWRcIiwgdHJ1ZSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0aWYgKCF0aGlzLmZpbHRlcnNbaWRdLmhpZGRlbiAmJiB0aGlzLmZpbHRlcnNbaWRdLnNob3cgIT09IGZhbHNlKSB7XG5cdFx0XHRcdGlmICh0aGlzLmZpbHRlcnNbaWRdLnZpZXcuc2VsZWN0cmFWaWV3KVxuXHRcdFx0XHRcdHRoaXMuZmlsdGVyc1tpZF0udmlldy5zaG93KHRoaXMub3B0aW9ucy5maWx0ZXJDb250YWluZXIpO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dGhpcy5vcHRpb25zLmZpbHRlckNvbnRhaW5lci5hcHBlbmQodGhpcy5maWx0ZXJzW2lkXS52aWV3LnJlbmRlcigpLmVsKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy51cGRhdGVGaWx0ZXJzKCk7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKGlkIGluIHRoaXMuZmlsdGVycykge1xuXHRcdFx0dGhpcy5maWx0ZXJzW2lkXS52aWV3LmRlc3Ryb3koKTtcblx0XHRcdHRoaXMuc3RvcExpc3RlbmluZyhGaWx0ZXIuRXZlbnRzLCBpZCArIFwiOnNlbGVjdGVkXCIpO1xuXHRcdFx0dGhpcy5jb2xsZWN0aW9uLmVhY2goaXRlbSA9PiB7XG5cdFx0XHRcdGlmIChpdGVtLmdldChcIm5hbWVcIikgPT09IGlkKVxuXHRcdFx0XHRcdGl0ZW0uc2V0KFwic2VsZWN0ZWRcIiwgZmFsc2UpO1xuXHRcdFx0fSk7XG5cdFx0XHRkZWxldGUgdGhpcy5maWx0ZXJzW2lkXS52aWV3O1xuXG5cdFx0XHRpZiAodGhpcy5maWx0ZXJzW2lkXS5zZXJ2ZXIpIHtcblx0XHRcdFx0Ly8gUmVtb3ZlIHRoZSBzZXJ2ZXIgc3luYyBpbmZvcm1hdGlvblxuXHRcdFx0XHRkZWxldGUgdGhpcy5zZXJ2ZXJQYXJhbXNbaWRdO1xuXHRcdFx0XHR0aGlzLnVwZGF0ZVNlcnZlckZpbHRlcnMoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGlkIGluIHRoaXMuaGFuZGxlcnMgfHwgdGhpcy5maWx0ZXJzW2lkXS5zZXJ2ZXIpIHtcblx0XHRcdFx0ZGVsZXRlIHRoaXMuaGFuZGxlcnNbaWRdO1xuXHRcdFx0XHR0aGlzLmZpbHRlcnNTeW5jZWQgPSBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY2hhbmdlID0gdGhpcy51cGRhdGVGaWx0ZXJzKCk7XG5cdFx0XHRpZiAoY2hhbmdlKVxuXHRcdFx0XHR0aGlzLnJlZnJlc2hEYXRhKCk7XG5cdFx0XHR0aGlzLnRyaWdnZXIoXCJjaGFuZ2VkXCIsIGNoYW5nZSk7XG5cdFx0fVxuXHR9LFxuXG5cdGNsZWFyRmlsdGVyczogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5yZW1vdmVBbGxGaWx0ZXJzKCk7XG5cdFx0dGhpcy51cGRhdGVGaWx0ZXJzKCk7XG5cdFx0dGhpcy5yZWZyZXNoRGF0YSgpO1xuXHR9LFxuXG5cdHJlc2V0RmlsdGVyczogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5yZW1vdmVBbGxGaWx0ZXJzKCk7XG5cblx0XHRfLmVhY2godGhpcy5vcHRpb25zLmZpbHRlcnMsIHRoaXMuYWRkRmlsdGVyLmJpbmQodGhpcykpO1xuXG5cdFx0Xy5lYWNoKHRoaXMub3B0aW9ucy5leHRlcm5hbEZpbHRlcnMgfHwgW10sIHRoaXMuYWRkRXh0ZXJuYWxGaWx0ZXIuYmluZCh0aGlzKSk7XG5cblx0XHR0aGlzLnVwZGF0ZUZpbHRlcnMoKTtcblx0XHR0aGlzLnJlZnJlc2hEYXRhKCk7XG5cdH0sXG5cblx0cmVtb3ZlQWxsRmlsdGVyczogZnVuY3Rpb24oKSB7XG5cdFx0Zm9yKGNvbnN0IGlkIGluIHRoaXMuZmlsdGVycykge1xuXHRcdFx0aWYgKHRoaXMuZmlsdGVyc1tpZF0udmlldylcblx0XHRcdFx0dGhpcy5maWx0ZXJzW2lkXS52aWV3LmRlc3Ryb3koKTtcblxuXHRcdFx0dGhpcy5zdG9wTGlzdGVuaW5nKEZpbHRlci5FdmVudHMsIGlkICsgXCI6c2VsZWN0ZWRcIik7XG5cdFx0XHR0aGlzLmNvbGxlY3Rpb24uZWFjaChpdGVtID0+IHtcblx0XHRcdFx0aWYgKGl0ZW0uZ2V0KFwibmFtZVwiKSA9PT0gaWQpXG5cdFx0XHRcdFx0aXRlbS5zZXQoXCJzZWxlY3RlZFwiLCBmYWxzZSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0ZGVsZXRlIHRoaXMuZmlsdGVyc1tpZF0udmlldztcblxuXHRcdFx0aWYgKHRoaXMuZmlsdGVyc1tpZF0uc2VydmVyKSB7XG5cdFx0XHRcdC8vIFJlbW92ZSB0aGUgc2VydmVyIHN5bmMgaW5mb3JtYXRpb25cblx0XHRcdFx0ZGVsZXRlIHRoaXMuc2VydmVyUGFyYW1zW2lkXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGlkIGluIHRoaXMuaGFuZGxlcnMpIHtcblx0XHRcdFx0ZGVsZXRlIHRoaXMuaGFuZGxlcnNbaWRdO1xuXHRcdFx0XHR0aGlzLmZpbHRlcnNTeW5jZWQgPSBmYWxzZTtcblx0XHRcdFx0dGhpcy51cGRhdGVGaWx0ZXJzKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdG9uRmlsdGVyQ2hhbmdlOiBmdW5jdGlvbihuYW1lLCBzZWxlY3Rpb24pIHtcblx0XHQvLyBXaGVuIHRoZSB1c2VyIGNoYW5nZXMgYSBmaWx0ZXIsIHVwZGF0ZSB0aGUgZmlsdGVyIGZ1bmN0aW9uIGZvciB0aGUgYXBwcm9wcmlhdGUgdmlydHVhbCBjb2xsZWN0aW9uLlxuXHRcdC8vIFJlLWZpbHRlcnMgdGhlIGNvbGxlY3Rpb24gYW5kIHByb3BhZ2F0ZXMgY2hhbmdlcyBpbnRvIHRoZSBtYWluIGNvbGxlY3Rpb25cblxuXHRcdGNvbnN0IGZpbHRlciA9IG5hbWUgaW4gdGhpcy5maWx0ZXJzID8gdGhpcy5maWx0ZXJzW25hbWVdIDogdGhpcy5leHRlcm5hbEZpbHRlcnNbbmFtZV07XG5cdFx0Y29uc3QgcmVzb2x2ZXIgPSBmaWx0ZXIucmVzb2x2ZXIgfHwgXy5pZGVudGl0eTtcblxuXHRcdGlmIChzZWxlY3Rpb24ubGVuZ3RoKSB7XG5cdFx0XHQvLyBVcGRhdGUgYW55IHBvdGVudGlhbCBzZXJ2ZXItc2lkZSBmaWx0ZXJzXG5cdFx0XHRpZiAoZmlsdGVyLnNlcnZlcikge1xuXHRcdFx0XHQvLyBVc2UgZmxhdHRlbiB0byBlbnN1cmUgc3RyaW5ncyBhcmUgbm90IGV4cGxvZGVkXG5cdFx0XHRcdHRoaXMuc2VydmVyUGFyYW1zW25hbWVdID0gXy5tYXAoXy5mbGF0dGVuKFtzZWxlY3Rpb25dKSwgcmVzb2x2ZXIpO1xuXHRcdFx0XHR0aGlzLnVwZGF0ZVNlcnZlckZpbHRlcnMoKTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHR0aGlzLmhhbmRsZXJzW25hbWVdID0gZmlsdGVyLmhhbmRsZXIuYmluZCh0aGlzLCBfLm1hcChzZWxlY3Rpb24sIHJlc29sdmVyKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0ZGVsZXRlIHRoaXMuaGFuZGxlcnNbbmFtZV07XG5cdFx0XHR0aGlzLnNlcnZlclBhcmFtc1tuYW1lXSA9IF8ubWFwKHNlbGVjdGlvbiwgcmVzb2x2ZXIpO1xuXHRcdFx0aWYgKGZpbHRlci5zZXJ2ZXIpXG5cdFx0XHRcdHRoaXMudXBkYXRlU2VydmVyRmlsdGVycygpO1xuXHRcdH1cblxuXHRcdHRoaXMuZmlsdGVyc1N5bmNlZCA9IGZhbHNlO1xuXG5cdFx0Y29uc3QgY2hhbmdlID0gdGhpcy51cGRhdGVGaWx0ZXJzKCk7XG5cdFx0aWYgKGNoYW5nZSlcblx0XHRcdHRoaXMucmVmcmVzaERhdGEoKTtcblx0XHR0aGlzLnRyaWdnZXIoXCJjaGFuZ2VkXCIsIGNoYW5nZSk7XG5cdH0sXG5cblx0dXBkYXRlU2VydmVyRmlsdGVyczogZnVuY3Rpb24obm9GZXRjaCkge1xuXHRcdGlmIChub0ZldGNoKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0aWYgKHRoaXMueGhyKVxuXHRcdFx0dGhpcy54aHIuYWJvcnQoKTtcblxuXHRcdHRoaXMuZmV0Y2hlcigpO1xuXHR9LFxuXG5cdGZldGNoZXI6IF8uZGVib3VuY2UoZnVuY3Rpb24oKSB7XG5cdFx0LyogZXNsaW50LWRpc2FibGUgbm8taW52YWxpZC10aGlzICovXG5cblx0XHRpZiAodGhpcy5vcHRpb25zLnJhdyBpbnN0YW5jZW9mIEluZmluaXRlQ29sbGVjdGlvbilcblx0XHRcdHRoaXMueGhyID0gdGhpcy5vcHRpb25zLnJhdy5zZXRTZXJ2ZXJGaWx0ZXJzKHRoaXMuc2VydmVyUGFyYW1zKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnhociA9IHRoaXMub3B0aW9ucy5yYXcuZ2V0Rmlyc3RQYWdlKHsgcmVzZXQ6IHRydWUgfSk7XG5cblx0XHQvKiBlc2xpbnQtZW5hYmxlIG5vLWludmFsaWQtdGhpcyAqL1xuXHR9LCAxMCksXG5cblx0dXBkYXRlRmlsdGVyczogZnVuY3Rpb24oZm9yY2UpIHtcblx0XHRpZiAodGhpcy5maWx0ZXJzU3luY2VkICYmICFmb3JjZSlcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdHRoaXMuZmlsdGVyc1N5bmNlZCA9IHRydWU7XG5cblx0XHRpZiAoXy5rZXlzKHRoaXMuaGFuZGxlcnMpLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0aWYgKHRoaXMuaGFzRmlsdGVycykge1xuXHRcdFx0XHR0aGlzLnZpcnR1YWwudXBkYXRlRmlsdGVyKHt9KTtcblx0XHRcdFx0dGhpcy5maWx0ZXJUb2dnbGUoKTtcblx0XHRcdFx0dGhpcy5oYXNGaWx0ZXJzID0gZmFsc2U7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dGhpcy5oYXNGaWx0ZXJzID0gdHJ1ZTtcblxuXHRcdC8vIFVwZGF0ZSB0aGUgZmlsdGVyIGZvciB0aGUgdmlydHVhbCBjb2xsZWN0aW9uXG5cdFx0dGhpcy52aXJ0dWFsLnVwZGF0ZUZpbHRlcihtb2RlbCA9PiBfLmV2ZXJ5KHRoaXMuaGFuZGxlcnMsIGZ1bmMgPT4gZnVuYyhtb2RlbCkpKTtcblxuXHRcdHRoaXMuZmlsdGVyVG9nZ2xlKCk7XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHRmaWx0ZXJUb2dnbGU6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghdGhpcy5vcHRpb25zLnJhdy5sZW5ndGgpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRfLmVhY2godGhpcy5maWx0ZXJzLCBpdGVtID0+IHtcblx0XHRcdGlmIChpdGVtLnZpZXcgJiYgaXRlbS52aWV3LnRvZ2dsZSlcblx0XHRcdFx0aXRlbS52aWV3LnRvZ2dsZSh0aGlzLm9wdGlvbnMucmF3Lmxlbmd0aCwgdHJ1ZSk7XG5cdFx0fSk7XG5cdH0sXG5cblx0cmVmcmVzaERhdGE6IGZ1bmN0aW9uKCkge1xuXHRcdC8qdmFyIGNvbCA9IHRoaXMub3B0aW9ucy5wYWdlZCBpbnN0YW5jZW9mIEJhY2tib25lLlBhZ2VhYmxlQ29sbGVjdGlvbiA/IHRoaXMub3B0aW9ucy5wYWdlZC5mdWxsQ29sbGVjdGlvbiA6IHRoaXMub3B0aW9ucy5wYWdlZDtcblxuXHRcdGNvbC5yZXNldCh0aGlzLnZpcnR1YWwubW9kZWxzKTtcblxuXHRcdGlmKHRoaXMub3B0aW9ucy5wYWdlZCBpbnN0YW5jZW9mIEJhY2tib25lLlBhZ2VhYmxlQ29sbGVjdGlvbikge1xuXHRcdFx0dmFyIHN0YXRlID0gdGhpcy5vcHRpb25zLnBhZ2VkLnN0YXRlO1xuXHRcdFx0aWYodGhpcy5vcHRpb25zLnBhZ2VkLmxlbmd0aCA8PSAoc3RhdGUuY3VycmVudFBhZ2UgLSAxKSAqIHN0YXRlLnBhZ2VTaXplKVxuXHRcdFx0XHR0aGlzLm9wdGlvbnMucGFnZWQuZ2V0Rmlyc3RQYWdlKCk7XG5cdFx0fSovXG5cblx0XHR0aGlzLmZpbHRlclRvZ2dsZSgpO1xuXHR9LFxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRmlsdGVySG9zdDsiXX0=",
    "\"use strict\";\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar Backbone = require(\"backbone\");\nvar Backgrid = require(\"backgrid\");\nvar moment = require(\"moment\");\nvar momentDurationSetup = require(\"moment-duration-format\");\nmomentDurationSetup(moment);\nrequire(\"backgrid.moment-cell\");\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nrequire(\"backgrid-paginator\");\nvar ServerFilterManager = require(\"./serverFilterManager\");\nvar Selectra = require(\"./selectra\");\nvar tippy = require(\"tippy.js\").default;\n\nvar Grid = function Grid(opts) {\n\t_.extend(this, Backbone.Events);\n\n\tif (!(opts.collection instanceof Backbone.PageableCollection)) throw new Error(\"Must pass a PageableCollection to ServerGrid constructor\");\n\n\tthis.collection = opts.collection;\n\n\tthis.opts = opts;\n\n\tthis.regenerate();\n\n\tif (opts.el) {\n\t\t//this.el = opts.el;\n\t\t//this.$el = $(opts.el);\n\t\tthis.overlay = $(\"<div class='grid-overlay'><span class='spinner-icon spinner-red'/> Fetching data...</div>\");\n\t\topts.el.append(this.grid.render().el);\n\t\topts.el.append(this.overlay);\n\t}\n\n\tif (opts.counter) this.listenTo(this.collection, \"sync reset add remove\", this.updateCounter.bind(this));\n\n\tif (!opts.noLoad && !opts.waitForFilters) this.collection.getFirstPage({ reset: true });\n\n\tif (opts.paging) opts.paging.element.append(this.paging().render().el);\n};\n\nexports = module.exports = Grid;\n\nGrid.prototype.updateCounter = function () {\n\tif (!this.collection.state.totalRecords) return this.opts.counter.element.text(\"No data found\");\n\n\tvar pageStart = (this.collection.state.currentPage - 1) * this.collection.state.pageSize + 1;\n\tvar pageEnd = this.collection.state.currentPage * this.collection.state.pageSize;\n\tif (pageEnd > this.collection.state.totalRecords) pageEnd = this.collection.state.totalRecords;\n\n\tif (_.isFunction(this.opts.counter.template)) return this.opts.counter.element.text(this.opts.counter.template(this.collection));\n\n\tthis.opts.counter.element.text(this.opts.counter.template.replace(/\\$start/, pageStart).replace(/\\$end/, pageEnd).replace(/\\$total/, this.collection.state.totalRecords).toLocaleString());\n\n\tif (this.opts.total) this.opts.total.element.text(this.opts.total.template.replace(/\\$sumtotal/, this.collection.state.sumTotal).toLocaleString());\n};\n\nGrid.ButtonCell = function (options) {\n\treturn Backgrid.Cell.extend({\n\t\ttemplate: _.template(\"<button class=\\\"\" + (options.class || \"\") + \"\\\"><%=text%></button>\"),\n\t\tinitialize: function initialize() {\n\t\t\tvar _this = this;\n\n\t\t\tthis.listenTo(this.model, \"buttoncell:disable\", function () {\n\t\t\t\t$(\"button\", _this.el).attr(\"disabled\", true);\n\t\t\t});\n\n\t\t\tthis.listenTo(this.model, \"buttoncell:enable\", function () {\n\t\t\t\t$(\"button\", _this.el).attr(\"disabled\", false);\n\t\t\t});\n\n\t\t\tfor (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n\t\t\t\targs[_key] = arguments[_key];\n\t\t\t}\n\n\t\t\tBackgrid.Cell.prototype.initialize.apply(this, args);\n\t\t},\n\t\tevents: {\n\t\t\t\"click button\": \"clicked\"\n\t\t},\n\t\tclicked: function clicked(e) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\n\t\t\tthis.model.trigger(\"buttoncell:clicked\", options.id, this.model);\n\t\t},\n\t\trender: function render() {\n\t\t\tthis.el.innerHTML = _.isFunction(options.text) ? options.text.call(this.model) : this.template({ text: options.text });\n\t\t\tthis.delegateEvents();\n\n\t\t\treturn this;\n\t\t}\n\t});\n};\n\nvar SelectraFormatter = _.noop;\nSelectraFormatter.prototype = new Backgrid.CellFormatter();\n_.extend(SelectraFormatter.prototype, {\n\tfromRaw: function fromRaw(rawValue) {\n\t\treturn _.isArray(rawValue) ? rawValue : rawValue === null ? [] : [rawValue];\n\t}\n});\n\nvar SelectraCellEditor = Backgrid.CellEditor.extend({\n\ttagName: \"input\",\n\n\tevents: {\n\t\tblur: \"close\",\n\t\tkeydown: \"close\"\n\t},\n\n\tsetOptions: function setOptions(selectraOptions) {\n\t\tthis.selectraOptions = selectraOptions;\n\t},\n\n\tsetMultiple: function setMultiple(multiple) {\n\t\tthis.multiple = multiple;\n\t\tthis.$el.prop(\"multiple\", multiple);\n\t},\n\n\trender: function render() {\n\t\tvar _this2 = this;\n\n\t\tvar selectraOptions = _.result(this, \"selectraOptions\");\n\t\tvar val = this.model.get(this.column.get(\"name\"));\n\n\t\tif (selectraOptions.server) {\n\t\t\tvar key = selectraOptions.server.key || \"key\";\n\t\t\tvar value = selectraOptions.server.value || \"value\";\n\n\t\t\tif (this.model.has(key) && this.model.has(value)) {\n\t\t\t\tselectraOptions.server.default = {\n\t\t\t\t\tkey: this.model.get(key),\n\t\t\t\t\tvalue: this.model.get(value)\n\t\t\t\t};\n\t\t\t} else if (selectraOptions.server.key === selectraOptions.server.value && val) {\n\t\t\t\tselectraOptions.server.default = {\n\t\t\t\t\tkey: val,\n\t\t\t\t\tvalue: val\n\t\t\t\t};\n\t\t\t}\n\t\t} else if (!_.isEmpty(selectraOptions.items) && !selectraOptions.server) {\n\t\t\t_.each(selectraOptions.items, function (i) {\n\t\t\t\ti.selected = _this2.multiple ? _.some(val, function (v) {\n\t\t\t\t\treturn v === i.key;\n\t\t\t\t}) : i.key === val;\n\t\t\t});\n\t\t}\n\n\t\tthis.select = new Selectra(selectraOptions);\n\n\t\tthis.select.show({ el: $(this.el) });\n\n\t\t// Fixed width for CSV import page\n\t\tvar btn = $(\"<button type=\\\"button\\\" class=\\\"button tiny\\\" style='display: inline-block'>Save</button>\");\n\t\t$(btn).on(\"click\", this.buttonClose.bind(this));\n\t\t$(this.el).parent().append(btn);\n\n\t\tthis.delegateEvents();\n\n\t\treturn this;\n\t},\n\n\tsave: function save() {\n\t\tvar _this3 = this;\n\n\t\tvar val = this.select.getSelected();\n\t\tvar result = void 0;\n\n\t\tif (this.multiple) result = _.map(val, function (v) {\n\t\t\treturn v[_this3.select.model.get(\"key\")];\n\t\t});else result = val[this.select.model.get(\"key\")];\n\n\t\tvar set = _defineProperty({}, this.column.get(\"name\"), result);\n\n\t\tif (this.select.model.has(\"server\")) {\n\t\t\tset[this.select.model.get(\"key\")] = val[this.select.model.get(\"key\")];\n\t\t\tset[this.select.model.get(\"value\")] = result;\n\t\t}\n\n\t\tthis.model.set(set);\n\t},\n\n\tbuttonClose: function buttonClose(evt) {\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\n\t\tthis.select.destroy();\n\n\t\tthis.close(new Event(\"blur\"));\n\t},\n\n\tclose: function close(e) {\n\t\tvar model = this.model;\n\t\tvar column = this.column;\n\t\tvar command = new Backgrid.Command(e);\n\t\tif (command.cancel()) {\n\t\t\te.stopPropagation();\n\t\t\tmodel.trigger(\"backgrid:edited\", model, column, new Backgrid.Command(e));\n\t\t} else if (command.save() || command.moveLeft() || command.moveRight() || command.moveUp() || command.moveDown() || e.type === \"blur\") {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tthis.save(e);\n\t\t\tmodel.trigger(\"backgrid:edited\", model, column, new Backgrid.Command(e));\n\t\t}\n\t}\n\n});\n\nGrid.SelectraCell = Backgrid.Cell.extend({\n\tclassName: \"selectra-cell\",\n\n\teditor: SelectraCellEditor,\n\n\tmultiple: false,\n\n\tformatter: SelectraFormatter,\n\n\toptions: undefined,\n\n\tinitialize: function initialize() {\n\t\tvar _this4 = this;\n\n\t\tfor (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n\t\t\targs[_key2] = arguments[_key2];\n\t\t}\n\n\t\tGrid.SelectraCell.__super__.initialize.apply(this, args);\n\t\tthis.listenTo(this.model, \"backgrid:edit\", function (model, column, cell, editor) {\n\t\t\tif (column.get(\"name\") === _this4.column.get(\"name\")) {\n\t\t\t\teditor.setOptions(_this4.options);\n\t\t\t\teditor.setMultiple(_this4.options.multiple);\n\t\t\t}\n\t\t});\n\t},\n\n\trender: function render() {\n\t\tthis.$el.empty();\n\n\t\tvar val = this.model.get(this.column.get(\"name\"));\n\n\t\tif (_.isArray(val)) val = _.join(val, \", \");\n\n\t\tvar rawData = this.formatter.fromRaw(val, this.model);\n\n\t\tthis.$el.append(rawData);\n\n\t\tthis.delegateEvents();\n\n\t\treturn this;\n\t}\n});\n\nGrid.HTMLCell = Backgrid.Cell.extend({\n\trender: function render() {\n\t\tthis.el.innerHTML = this.model.get(this.column.get(\"name\"));\n\n\t\tif ($(\"span\", this.el).get(0)) {\n\t\t\ttippy($(\"span\", this.el).get(0), {\n\t\t\t\ttheme: \"black\",\n\t\t\t\tplacement: \"bottom\",\n\t\t\t\tdelay: 500,\n\t\t\t\tcontent: $(\"span\", this.el).attr(\"title\")\n\t\t\t});\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\nGrid.DurationCell = Backgrid.Cell.extend({\n\trender: function render() {\n\t\tvar perp = this.model.get(\"perpetual\");\n\t\tif (perp) {\n\t\t\tthis.el.innerHTML = \"Perpetual\";\n\t\t} else {\n\t\t\tvar val = this.model.get(this.column.get(\"name\"));\n\t\t\tif (val) {\n\t\t\t\tvar d = moment.duration(val);\n\t\t\t\tif (d < 0) this.el.innerHTML = \"Expired\";else this.el.innerHTML = d.format(\"y[y] M[mo] d[d] h[h] m[m] s[s]\", { trim: \"both\" });\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\nGrid.VersionCell = Backgrid.Cell.extend({\n\trender: function render() {\n\t\tvar val = this.model.get(this.column.get(\"name\"));\n\t\tif (!val) return this;\n\n\t\tvar final = Math.floor(val);\n\t\tif (val % 1) final += \".\" + (val % 1).toFixed(4).substring(2).replace(/^[^1-9]+(.+?$)/, \"$1\");\n\n\t\tthis.el.innerHTML = final;\n\n\t\treturn this;\n\t}\n});\n\nGrid.BooleanIconCell = Backgrid.Cell.extend({\n\ttemplate: _.template(\"<a class='fal <%=icon%>' style='color: <%=colour%>'></a>\"),\n\n\trender: function render() {\n\t\tvar data = {};\n\t\tif (this.model.get(this.column.get(\"name\"))) data = { icon: \"fa-check\", colour: this.falseColour || \"green\" };else data = { icon: \"fa-times\", colour: this.falseColour || \"red\" };\n\n\t\tthis.el.innerHTML = this.template(data);\n\t\tthis.el.style.textAlign = \"center\";\n\t\treturn this;\n\t}\n});\n\nGrid.BooleanCircleCell = Backgrid.Cell.extend({\n\ttemplate: _.template(\"<a class='fal <%=icon%>' style='color: <%=colour%>'></a>\"),\n\n\trender: function render() {\n\t\tvar data = {};\n\t\tif (this.model.get(this.column.get(\"name\"))) data = { icon: \"fa-check\", colour: this.falseColour || \"#333\" };else data = { icon: \"\", colour: this.falseColour || \"#777\" };\n\n\t\tthis.el.innerHTML = this.template(data);\n\t\tthis.el.style.textAlign = \"center\";\n\t\treturn this;\n\t}\n});\n\nGrid.CheckboxCell = Backgrid.Cell.extend({\n\ttemplate: _.template(\"<input type='checkbox' <%=selected%>'>\"),\n\tclassName: \"selectable renderable centered hide\",\n\tevents: {\n\t\t\"change :checkbox\": \"onChange\",\n\t\tclick: \"enterEditMode\"\n\t},\n\n\t/**\n  * Initializer. If the underlying model triggers a `select` event, this cell\n  * will change its checked value according to the event's `selected` value.\n  *\n  * @param {Object} options\n  * @param {Backgrid.Column} options.column\n  * @param {Backbone.Model} options.model\n  */\n\tinitialize: function initialize(options) {\n\t\tvar _this5 = this;\n\n\t\tthis.column = options.column;\n\t\tif (!(this.column instanceof Backgrid.Column)) this.column = new Backgrid.Column(this.column);\n\n\t\tthis.model.set(\"checked\", false);\n\t\tthis.listenTo(this.model, \"backgrid:select\", function (model, checked) {\n\t\t\t_this5.$el.find(\":checkbox\").prop(\"checked\", checked).change();\n\t\t\t_this5.setSelected(checked);\n\t\t\t_this5.model.set(\"checked\", checked);\n\t\t});\n\n\t\tthis.listenTo(this.model.collection, {\n\t\t\tsync: this.fetchEnd.bind(this)\n\t\t});\n\t},\n\n\tfetchEnd: function fetchEnd() {\n\t\tthis.model.set(\"checked\", this.$el.find(\":checkbox\").prop(\"checked\"));\n\t\tthis.setSelected(this.$el.find(\":checkbox\").prop(\"checked\"));\n\t},\n\n\t/**\n  * Renders the checkbox.\n  */\n\trender: function render() {\n\t\tvar state = { selected: false };\n\t\tthis.$el.empty().append('<input tabindex=\"-1\" type=\"checkbox\" />');\n\t\tthis.model.trigger(\"backgrid:isSelected\", this.model, state);\n\t\tif (state.selected) this.$el.find(\":checkbox\").prop(\"checked\", \"checked\").trigger(\"change\");\n\n\t\tthis.delegateEvents();\n\t\treturn this;\n\t},\n\n\t/**\n  * Focuses the checkbox.\n  */\n\tenterEditMode: function enterEditMode(e) {\n\t\tvar $checkbox = this.$el.find(\":checkbox\").focus();\n\t\tif ($checkbox[0] !== e.target) $checkbox.prop(\"checked\", !$checkbox.prop(\"checked\")).change();\n\t\te.stopPropagation();\n\t},\n\n\t/**\n  * Unfocuses the checkbox.\n  */\n\texitEditMode: function exitEditMode() {\n\t\tthis.$el.find(\":checkbox\").blur();\n\t},\n\n\t/**\n  * When the checkbox's value changes, this method will trigger a Backbone\n  * `backgrid:selected` event with a reference of the model and the\n  * checkbox's `checked` value.\n  */\n\tonChange: function onChange(e) {\n\t\tthis.model.trigger(\"backgrid:selected\", this.model, $(e.target).prop(\"checked\"));\n\t\tthis.setSelected($(e.target).prop(\"checked\"));\n\t},\n\n\tsetSelected: function setSelected(selected) {\n\t\tif (selected) this.$el.parent().addClass(\"selected\");else this.$el.parent().removeClass(\"selected\");\n\t}\n});\n\nGrid.SelectAllHeaderCell = Backgrid.HeaderCell.extend({\n\ttemplate: _.template(\"<input type='checkbox' data-select>\"),\n\tclassName: \"selectable renderable hide\",\n\n\tevents: {\n\t\t//change: \"onSelect\",\n\t\t\"click [data-select]\": \"onSelect\",\n\t\t\"click [data-select-all]\": \"onSelectAll\",\n\t\t\"click [data-select-none]\": \"onSelectNone\",\n\t\t\"click [data-select-all-visible]\": \"onSelectViable\"\n\t},\n\n\t/**\n  * Initializer.\n  * Subscribers on events listening\n  *\n  * @param {Object} options\n  * @param {Backgrid.Column} options.column\n  * @param {Backbone.Collection} options.collection\n  */\n\tinitialize: function initialize(options) {\n\t\tthis.collection.selectedModelsCollection = new Backbone.Collection();\n\n\t\tthis.column = options.column;\n\t\tif (!(this.column instanceof Backgrid.Column)) this.column = new Backgrid.Column(this.column);\n\n\t\tthis.selectedModels = {};\n\t\tthis.removedModels = {};\n\t\tthis.pageSelectedModels = {};\n\t\tthis.currentPage = 1;\n\t\tthis.filterChange = false;\n\n\t\tthis.initialState();\n\t\tthis.listenTo(this.collection, {\n\t\t\trequest: this.fetchStart.bind(this),\n\t\t\tsync: this.fetchEnd.bind(this),\n\t\t\terror: this.fetchError.bind(this),\n\t\t\tremove: this.removeModel.bind(this),\n\t\t\tupdateState: this.initialState.bind(this),\n\t\t\t\"backgrid:selected\": this.selectModel.bind(this),\n\t\t\t\"backgrid:selectAll\": this.selectAll.bind(this),\n\t\t\t\"backgrid:selectAllVisible\": this.selectAllVisible.bind(this),\n\t\t\t\"backgrid:selectNone\": this.selectNone.bind(this),\n\n\t\t\t\"backgrid:isSelected\": this.isSelected.bind(this),\n\t\t\t\"backgrid:getSelected\": this.getSelected.bind(this),\n\t\t\t\"filter:change\": this.onFilterChange.bind(this)\n\t\t});\n\t},\n\n\tonFilterChange: function onFilterChange() {\n\t\tthis.filterChange = true;\n\t},\n\n\tisSelected: function isSelected(model, obj) {\n\t\tif ($.isPlainObject(obj)) obj.selected = this.isSelectedModel(model);\n\t},\n\n\tgetSelected: function getSelected(obj) {\n\t\tif ($.isEmptyObject(obj)) {\n\t\t\tobj.selected = _.keys(this.selectedModels);\n\t\t\tobj.inset = this.inset;\n\t\t}\n\t},\n\n\trender: function render() {\n\t\tthis.el.innerHTML = this.template();\n\t\tthis.el.style.textAlign = \"center\";\n\t\treturn this;\n\t},\n\n\t/**\n  * Resets selection to initial conditions\n  *  - clear selected models set\n  *  - reset set type in-set/not-in-set\n  * @param {boolean=} inset flag of in-set/not-in-set mode\n  */\n\tinitialState: function initialState(inset) {\n\t\tvar _this6 = this;\n\n\t\tif (!this.pageSelectedModels[this.currentPage]) this.pageSelectedModels[this.currentPage] = {};\n\n\t\t// Check collection for selected models and add them to this.pageSelectedModels[this.currentPage]\n\t\t_.each(this.collection.models, function (model) {\n\t\t\tif (model.get(\"checked\")) _this6.pageSelectedModels[_this6.currentPage][model.id || model.cid] = model;\n\t\t});\n\n\t\t// Remove model from selectedModels if it is not in collection\n\t\tif (this.collection.state.currentPage === 1 && this.filterChange) {\n\t\t\tthis.filterChange = false;\n\t\t\tthis.selectNone();\n\t\t\tthis.collection.selectedModelsCollection.reset(_.filter(this.collection.selectedModelsCollection.models, function (model) {\n\t\t\t\tif (model) {\n\t\t\t\t\tif (_.includes(_.map(_this6.collection.models, function (m) {\n\t\t\t\t\t\treturn m.get(\"_id\");\n\t\t\t\t\t}), model.get(\"_id\"))) return true;\n\n\t\t\t\t\tmodel.set(\"checked\", false);\n\t\t\t\t\t_this6.removeModel(model);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}));\n\t\t\tthis.removeDuplicateSelectModels();\n\n\t\t\tthis.selectedModels = {};\n\t\t\t_.each(this.collection.selectedModelsCollection.models, function (model) {\n\t\t\t\t_this6.selectedModels[model.id || model.cid] = model;\n\t\t\t});\n\t\t}\n\n\t\tthis.inset = _.isUndefined(inset) ? true : inset;\n\t\tthis.updateState();\n\t},\n\n\t/**\n  * Updates state of selection (three states a checkbox: checked, unchecked, or indeterminate)\n  */\n\tupdateState: function updateState() {\n\t\tvar $checkbox = this.$(\"[type=checkbox]\");\n\n\t\tif (_.isEmpty(this.pageSelectedModels[this.currentPage]) && !(_.intersection(_.values(this.selectedModels), this.collection.models).length > 0)) {\n\t\t\t$checkbox.prop(\"indeterminate\", false);\n\t\t\t$checkbox.prop(\"checked\", !this.inset);\n\t\t} else if (_.values(this.pageSelectedModels[this.currentPage]).length === this.collection.length) {\n\t\t\t$checkbox.prop(\"indeterminate\", false);\n\t\t\t$checkbox.prop(\"checked\", true);\n\t\t} else {\n\t\t\t$checkbox.prop(\"indeterminate\", true);\n\t\t\t$checkbox.prop(\"checked\", true);\n\t\t}\n\t},\n\n\t/**\n  * Gets selection state\n  *\n  * @returns {{selectedModels: *, inset: boolean}}\n  */\n\tgetSelectionState: function getSelectionState() {\n\t\treturn {\n\t\t\tpageSelectedModels: this.pageSelectedModels,\n\t\t\tselectedModels: this.selectedModels,\n\t\t\tinset: this.inset\n\t\t};\n\t},\n\n\t/**\n  * Checks if passed model have to be marked as selected\n  *\n  * @param {Backbone.Model} model\n  * @returns {boolean}\n  */\n\tisSelectedModel: function isSelectedModel(model) {\n\t\treturn _.has(this.selectedModels, model.id || model.cid);\n\t},\n\n\t/**\n  * Removes model from selected models set\n  *\n  * @param {Backbone.Model} model\n  */\n\tremoveModel: function removeModel(model) {\n\t\tif (!model) return;\n\t\tdelete this.selectedModels[model.id || model.cid];\n\t\tdelete this.pageSelectedModels[this.currentPage][model.id || model.cid];\n\t\tthis.removedModels[model.id || model.cid] = model;\n\t\tthis.updateState();\n\t\tthis.updateSelectedModels();\n\t},\n\n\t/**\n  * Adds/removes model to/from selected models set\n  *\n  * @param {Backbone.Model} model\n  * @param {boolean} selected\n  */\n\tselectModel: function selectModel(model, selected) {\n\t\tif (selected) {\n\t\t\tthis.selectedModels[model.id || model.cid] = model;\n\t\t\tthis.pageSelectedModels[this.currentPage][model.id || model.cid] = model;\n\t\t\tthis.updateState();\n\t\t} else {\n\t\t\tthis.removeModel(model);\n\t\t}\n\t\tthis.updateSelectedModels();\n\t},\n\n\t/**\n  * Performs selection of all possible models:\n  *  - reset to initial state\n  *  - change type of set type as not-inset\n  *  - marks all models in collection as selected\n  *  start to collect models which have to be excluded\n  */\n\tselectAll: function selectAll() {\n\t\tthis.initialState(false);\n\t\tthis._markSelected(true);\n\t},\n\n\t/**\n  * Reset selection of all possible models:\n  *  - reset to initial state\n  *  - change type of set type as inset\n  *  - marks all models in collection as not selected\n  *  start to collect models which have to be included\n  */\n\tselectNone: function selectNone() {\n\t\tthis.initialState();\n\t\tthis._markSelected(false);\n\t\tthis.collection.selectedModelsCollection.reset([]);\n\t},\n\n\t/**\n  * Performs selection of all visible models:\n  *  - if necessary reset to initial state\n  *  - marks all models in collection as selected\n  */\n\tselectAllVisible: function selectAllVisible() {\n\t\tif (!this.inset) this.initialState();\n\t\tthis._markSelected(true);\n\t},\n\n\t/**\n  * Marks all models in collection as selected/not selected\n  *\n  * @param {boolean} selected\n  * @private\n  */\n\t_markSelected: function _markSelected(selected) {\n\t\tthis.collection.each(function (model) {\n\t\t\tmodel.trigger(\"backgrid:select\", model, selected);\n\t\t});\n\t},\n\n\t/**\n  * Handles click on checkbox selectAll/selectNone\n  *\n  * @param {jQuery.Event} e\n  */\n\tonSelect: function onSelect(e) {\n\t\tif (this.inset && _.isEmpty(this.pageSelectedModels[this.currentPage]) === this.inset) this.collection.trigger(\"backgrid:selectAll\");else this.collection.trigger(\"backgrid:selectNone\");\n\n\t\tif ($(e.target).is(\":checkbox\")) e.stopPropagation();\n\t},\n\n\t/**\n  * Handles click on selectAll button\n  *\n  * @param {jQuery.Event} e\n  */\n\tonSelectAll: function onSelectAll(e) {\n\t\tthis.collection.trigger(\"backgrid:selectAll\");\n\t\te.preventDefault();\n\t},\n\n\t/**\n  * Handles click on selectAllVisible button\n  *\n  * @param {jQuery.Event}e\n  */\n\tonSelectViable: function onSelectViable(e) {\n\t\tthis.collection.trigger(\"backgrid:selectAllVisible\");\n\t\te.preventDefault();\n\t},\n\n\t/**\n  * Handles click on selectNone button\n  *\n  * @param {jQuery.Event}e\n  */\n\tonSelectNone: function onSelectNone(e) {\n\t\tthis.collection.trigger(\"backgrid:selectNone\");\n\t\te.preventDefault();\n\t},\n\n\tfetchStart: function fetchStart(param) {\n\t\tthis.currentPage = param.state && param.state.currentPage ? param.state.currentPage : 1;\n\t\tthis.updateSelectedModels();\n\t},\n\n\tfetchEnd: function fetchEnd() {\n\t\tthis.initialState();\n\t},\n\n\tfetchError: function fetchError(collection, error) {\n\t\tconsole.error(error);\n\t\talert(error.responseJSON.detail);\n\t},\n\n\tupdateSelectedModels: function updateSelectedModels() {\n\t\tthis.collection.selectedModelsCollection.add(_.values(this.selectedModels));\n\t\tthis.collection.selectedModelsCollection.remove(_.values(this.removedModels));\n\n\t\t// Remove duplicates from selectedModels\n\t\tthis.removeDuplicateSelectModels();\n\t\tthis.removedModels = {};\n\t},\n\n\tremoveDuplicateSelectModels: function removeDuplicateSelectModels() {\n\t\tthis.collection.selectedModelsCollection.reset(_.uniqBy(this.collection.selectedModelsCollection.models, function (model) {\n\t\t\treturn model.get(\"_id\");\n\t\t}));\n\t}\n});\n\nGrid.MomentCell = Backgrid.Extension.MomentCell;\n\nGrid.ToolbarCell = function (options) {\n\tvar _generateTooltips = function _generateTooltips(model) {\n\t\tvar html = _.map(options.tooltips, function (item) {\n\t\t\tif (!item.filter || item.filter(model)) return \"<a title='\" + item.title + \"' data-name='\" + (item.data || item.title).toLowerCase().replace(/\\s/g, \"\") + \"' class='fal \" + item.icon + \"'></a>\";\n\t\t\treturn \"\";\n\t\t});\n\t\treturn html.join(\"\");\n\t};\n\n\tvar state = void 0;\n\n\treturn Backgrid.Cell.extend({\n\t\ttemplate: _.template(\"<div class='toolbar-host fal fa-cog hide'>&nbsp;<span class='fal fa-caret-down hide' style='font-size:0.8rem'/></div>\"),\n\t\ttemplateClean: _.template(\"<div>&nbsp;</div>\"),\n\t\tevents: {\n\t\t\ttoolbarItemClick: \"clicked\"\n\t\t},\n\t\tinitialize: function initialize() {\n\t\t\tthis.listenTo(this.model, \"change\", function () {\n\t\t\t\t//this.generateTooltips();\n\t\t\t\tstate = null;\n\t\t\t});\n\n\t\t\tfor (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n\t\t\t\targs[_key3] = arguments[_key3];\n\t\t\t}\n\n\t\t\tBackgrid.Cell.prototype.initialize.apply(this, args);\n\t\t},\n\t\tclicked: function clicked(evt, item) {\n\t\t\tthis.model.trigger(\"toolbar:click:\" + $(item).data(\"name\"), this.model);\n\t\t},\n\t\tgenerateTooltips: function generateTooltips() {\n\t\t\tvar _this7 = this;\n\n\t\t\ttry {\n\t\t\t\t$(\"div.toolbar-host\", this.el).toolbar(\"remove\");\n\t\t\t} catch (e) {\n\t\t\t\t// Do nothing\n\t\t\t}\n\n\t\t\tvar tt = _generateTooltips(this.model);\n\t\t\tif (!tt) {\n\t\t\t\t$(\"span\", this.el).remove();\n\t\t\t\t$(\"div\", this.el).removeClass(\"toolbar-host fal fa-cog\");\n\t\t\t\treturn this;\n\t\t\t}\n\n\t\t\t$(\"div.toolbar-host\", this.el).toolbar({\n\t\t\t\thideOnClick: true,\n\t\t\t\tcontent: $(\"<div>\" + tt + \"</div>\"),\n\t\t\t\tposition: \"bottom\",\n\t\t\t\tevent: \"click\",\n\t\t\t\tstyle: \"dark\",\n\t\t\t\tanimation: \"standard\"\n\t\t\t}).on(\"toolbarShown\", function () {\n\t\t\t\tif (state && !state.is($(\"div.toolbar-host\", _this7.el))) state.trigger(\"click\");\n\t\t\t\tstate = $(\"div.toolbar-host\", _this7.el);\n\t\t\t}).on(\"toolbarHidden\", function () {\n\t\t\t\tstate = null;\n\t\t\t});\n\t\t\treturn true;\n\t\t},\n\t\trender: function render() {\n\t\t\tvar _this8 = this;\n\n\t\t\tif (state) state.toolbar(\"remove\");\n\t\t\tstate = null;\n\n\t\t\tif (options.tooltips && _.some(options.tooltips, function (t) {\n\t\t\t\treturn !t.filter || t.filter(_this8.model);\n\t\t\t})) this.el.innerHTML = this.template({});else this.el.innerHTML = this.templateClean({});\n\n\t\t\tif (this.generateTooltips() !== true) $(\".hide\", this.el).removeClass(\"hide\");\n\n\t\t\tthis.delegateEvents();\n\t\t\treturn this;\n\t\t},\n\t\tremove: function remove() {\n\t\t\tif (state) state.toolbar(\"remove\");\n\t\t\tstate = null;\n\n\t\t\tfor (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n\t\t\t\targs[_key4] = arguments[_key4];\n\t\t\t}\n\n\t\t\tBackgrid.Cell.prototype.remove.apply(this, args);\n\t\t}\n\t});\n};\n\nGrid.stringSort = function (model, col) {\n\treturn model && model.has(col) ? (model.get(col) || \"\").toLowerCase() : \"\";\n};\n\nGrid.prototype.regenerate = function () {\n\tvar _this9 = this;\n\n\tvar selectedRow = void 0;\n\n\t// eslint-disable-next-line consistent-this\n\tvar grid = this;\n\n\tvar row = Backgrid.Row.extend({\n\t\thighlightColor: \"#DBF2FF\",\n\n\t\tevents: {\n\t\t\tclick: \"click\",\n\t\t\tmouseover: \"rowFocused\",\n\t\t\tmouseout: \"rowLostFocus\"\n\t\t},\n\t\tinitialize: function initialize() {\n\t\t\tfor (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n\t\t\t\targs[_key5] = arguments[_key5];\n\t\t\t}\n\n\t\t\tBackgrid.Row.prototype.initialize.apply(this, args);\n\n\t\t\tthis.listenTo(this.model, \"grid:render\", this.render.bind(this));\n\t\t\tthis.listenTo(this.model, \"grid:colour\", this.setColour.bind(this));\n\t\t},\n\t\trender: function render() {\n\t\t\tfor (var _len6 = arguments.length, args = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {\n\t\t\t\targs[_key6] = arguments[_key6];\n\t\t\t}\n\n\t\t\tBackgrid.Row.prototype.render.apply(this, args);\n\n\t\t\tif (grid.opts.clickable) $(this.el).addClass(\"row-clickable\");\n\n\t\t\tthis.setColour();\n\n\t\t\tthis.model.trigger(\"grid:rendered\");\n\t\t\tif (selectedRow === this) $(\".toolbar-host, .fa-caret-down\", this.el).removeClass(\"hide\");\n\n\t\t\treturn this;\n\t\t},\n\t\trowFocused: function rowFocused() {\n\t\t\tif (selectedRow !== this) {\n\t\t\t\t$(\".toolbar-host, .fa-caret-down\", this.el).removeClass(\"hide\");\n\t\t\t\tif (!grid.opts.noHighlight && !this.model.colour) this.el.style.backgroundColor = this.highlightColor;\n\t\t\t}\n\t\t},\n\t\trowLostFocus: function rowLostFocus() {\n\t\t\tif (selectedRow !== this) {\n\t\t\t\t$(\".toolbar-host, .fa-caret-down\", this.el).addClass(\"hide\");\n\t\t\t\tif (!grid.opts.noHighlight && !this.model.colour) this.el.style.backgroundColor = this.model.colour || \"\";\n\t\t\t}\n\t\t},\n\t\tsetColour: function setColour(col) {\n\t\t\tif (col) this.model.colour = col;else if (col === null) this.model.colour = \"\";\n\t\t\tthis.el.style.backgroundColor = this.model.colour;\n\t\t},\n\t\tclick: function click(evt) {\n\t\t\tevt.stopPropagation();\n\n\t\t\tif (selectedRow) selectedRow.unselect();\n\t\t\t// eslint-disable-next-line consistent-this\n\t\t\tselectedRow = this;\n\n\t\t\t$(\".toolbar-host, .fa-caret-down\", this.el).removeClass(\"hide\");\n\t\t\tif (!grid.opts.noHighlight) this.el.style.backgroundColor = this.highlightColor;\n\n\t\t\tif (evt.target.nodeName !== \"TD\" && (!evt.target.offsetParent || !evt.target.offsetParent.classList.contains(\"skip\"))) {\n\t\t\t\tthis.model.trigger(\"row:customclick\", this.model, evt);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (grid.opts.clickable) grid.trigger(\"row:clicked\", this.model);\n\t\t},\n\n\t\tunselect: function unselect() {\n\t\t\t$(\".toolbar-host, .fa-caret-down\", this.el).addClass(\"hide\");\n\t\t\tif (!grid.opts.noHighlight) this.el.style.backgroundColor = this.model.colour || \"\";\n\t\t}\n\t});\n\n\tthis.grid = new Backgrid.Grid({\n\t\trow: row,\n\t\tcolumns: this.opts.columns,\n\t\tcollection: this.collection,\n\t\temptyText: function emptyText() {\n\t\t\tif (_this9.collection.fetching) return \"<span class='spinner-icon spinner-small'></span> Fetching data...\";\n\t\t\treturn \"There is nothing to show\";\n\t\t}\n\t});\n\n\tthis.listenTo(this.grid, \"before:destroy\", this.destroy.bind(this));\n\n\tthis.listenTo(this.collection, \"reset\", function () {\n\t\t_this9.collection.fetching = false;\n\t\t_this9.trigger(\"reset\");\n\t});\n\n\tthis.listenTo(this.collection, \"request\", function (item) {\n\t\tif (\"attributes\" in item)\n\t\t\t// Single-item fetch, don't re-render\n\t\t\treturn;\n\n\t\t_this9.collection.fetching = true;\n\t\tif (_this9.collection.length) _this9.overlay.css({ opacity: \"0.8\", \"pointer-events\": \"all\" });else _this9.grid.body.render();\n\t});\n\n\tthis.listenTo(this.collection, \"sync\", function (item, resp) {\n\t\t// Update tooltips\n\t\ttippy(\"table.backgrid td.string-cell[data-tippy-content]\", {\n\t\t\ttheme: \"black\",\n\t\t\tanimation: \"fade\",\n\t\t\tplacement: \"top\",\n\t\t\tarrow: true,\n\t\t\tdelay: [1000, 10],\n\t\t\tmaxWidth: 900\n\t\t});\n\n\t\tif (resp.ok)\n\t\t\t// Single-item fetch, don't re-render the grid\n\t\t\treturn;\n\n\t\t_this9.collection.fetching = false;\n\t\t_this9.overlay.css({ opacity: \"0\", \"pointer-events\": \"none\" });\n\t\tif (!_this9.collection.length) _this9.grid.body.render();\n\t});\n\n\tthis.listenTo(this.collection, \"remove\", function () {\n\t\t_this9.collection.fetching = false;\n\t\tif (!_this9.collection.length) _this9.grid.body.render();\n\t});\n\n\tthis.listenTo(this.collection.fullCollection, \"add\", function () {\n\t\t_this9.collection.fetching = false;\n\t\tif (!_this9.collection.length) _this9.grid.body.render();else if (_this9.collection.state.currentPage < _this9.collection.state.totalPages) _this9.collection.getPage(_this9.collection.state.totalPages);\n\t});\n};\n\nGrid.prototype.destroy = function (arg1) {\n\tif (this.filter) this.filter.destroy();\n\n\tif (!arg1 && this.grid) this.grid.remove();\n};\n\nGrid.prototype.paging = function () {\n\tthis.paginator = new Backgrid.Extension.Paginator({\n\t\tcollection: this.collection,\n\t\tgoBackFirstOnSort: false\n\t});\n\n\treturn this.paginator;\n};\n\nGrid.prototype.filter = function (opts) {\n\tthis.filter = new ServerFilterManager({\n\t\traw: this.collection,\n\t\tfilterContainer: opts.filterContainer,\n\t\tfilters: opts.filters || [],\n\t\tdefaultFilters: opts.defaultFilters || []\n\t});\n\n\tif (this.opts.waitForFilters) this.collection.getFirstPage({ reset: true });\n\n\treturn this.filter;\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNlcnZlckdyaWQuanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwiQmFja2dyaWQiLCJtb21lbnQiLCJtb21lbnREdXJhdGlvblNldHVwIiwiJCIsIl8iLCJTZXJ2ZXJGaWx0ZXJNYW5hZ2VyIiwiU2VsZWN0cmEiLCJ0aXBweSIsImRlZmF1bHQiLCJHcmlkIiwib3B0cyIsImV4dGVuZCIsIkV2ZW50cyIsImNvbGxlY3Rpb24iLCJQYWdlYWJsZUNvbGxlY3Rpb24iLCJFcnJvciIsInJlZ2VuZXJhdGUiLCJlbCIsIm92ZXJsYXkiLCJhcHBlbmQiLCJncmlkIiwicmVuZGVyIiwiY291bnRlciIsImxpc3RlblRvIiwidXBkYXRlQ291bnRlciIsImJpbmQiLCJub0xvYWQiLCJ3YWl0Rm9yRmlsdGVycyIsImdldEZpcnN0UGFnZSIsInJlc2V0IiwicGFnaW5nIiwiZWxlbWVudCIsImV4cG9ydHMiLCJtb2R1bGUiLCJwcm90b3R5cGUiLCJzdGF0ZSIsInRvdGFsUmVjb3JkcyIsInRleHQiLCJwYWdlU3RhcnQiLCJjdXJyZW50UGFnZSIsInBhZ2VTaXplIiwicGFnZUVuZCIsImlzRnVuY3Rpb24iLCJ0ZW1wbGF0ZSIsInJlcGxhY2UiLCJ0b0xvY2FsZVN0cmluZyIsInRvdGFsIiwic3VtVG90YWwiLCJCdXR0b25DZWxsIiwib3B0aW9ucyIsIkNlbGwiLCJjbGFzcyIsImluaXRpYWxpemUiLCJtb2RlbCIsImF0dHIiLCJhcmdzIiwiYXBwbHkiLCJldmVudHMiLCJjbGlja2VkIiwiZSIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwidHJpZ2dlciIsImlkIiwiaW5uZXJIVE1MIiwiY2FsbCIsImRlbGVnYXRlRXZlbnRzIiwiU2VsZWN0cmFGb3JtYXR0ZXIiLCJub29wIiwiQ2VsbEZvcm1hdHRlciIsImZyb21SYXciLCJyYXdWYWx1ZSIsImlzQXJyYXkiLCJTZWxlY3RyYUNlbGxFZGl0b3IiLCJDZWxsRWRpdG9yIiwidGFnTmFtZSIsImJsdXIiLCJrZXlkb3duIiwic2V0T3B0aW9ucyIsInNlbGVjdHJhT3B0aW9ucyIsInNldE11bHRpcGxlIiwibXVsdGlwbGUiLCIkZWwiLCJwcm9wIiwicmVzdWx0IiwidmFsIiwiZ2V0IiwiY29sdW1uIiwic2VydmVyIiwia2V5IiwidmFsdWUiLCJoYXMiLCJpc0VtcHR5IiwiaXRlbXMiLCJlYWNoIiwiaSIsInNlbGVjdGVkIiwic29tZSIsInYiLCJzZWxlY3QiLCJzaG93IiwiYnRuIiwib24iLCJidXR0b25DbG9zZSIsInBhcmVudCIsInNhdmUiLCJnZXRTZWxlY3RlZCIsIm1hcCIsInNldCIsImV2dCIsImRlc3Ryb3kiLCJjbG9zZSIsIkV2ZW50IiwiY29tbWFuZCIsIkNvbW1hbmQiLCJjYW5jZWwiLCJtb3ZlTGVmdCIsIm1vdmVSaWdodCIsIm1vdmVVcCIsIm1vdmVEb3duIiwidHlwZSIsIlNlbGVjdHJhQ2VsbCIsImNsYXNzTmFtZSIsImVkaXRvciIsImZvcm1hdHRlciIsInVuZGVmaW5lZCIsIl9fc3VwZXJfXyIsImNlbGwiLCJlbXB0eSIsImpvaW4iLCJyYXdEYXRhIiwiSFRNTENlbGwiLCJ0aGVtZSIsInBsYWNlbWVudCIsImRlbGF5IiwiY29udGVudCIsIkR1cmF0aW9uQ2VsbCIsInBlcnAiLCJkIiwiZHVyYXRpb24iLCJmb3JtYXQiLCJ0cmltIiwiVmVyc2lvbkNlbGwiLCJmaW5hbCIsIk1hdGgiLCJmbG9vciIsInRvRml4ZWQiLCJzdWJzdHJpbmciLCJCb29sZWFuSWNvbkNlbGwiLCJkYXRhIiwiaWNvbiIsImNvbG91ciIsImZhbHNlQ29sb3VyIiwic3R5bGUiLCJ0ZXh0QWxpZ24iLCJCb29sZWFuQ2lyY2xlQ2VsbCIsIkNoZWNrYm94Q2VsbCIsImNsaWNrIiwiQ29sdW1uIiwiY2hlY2tlZCIsImZpbmQiLCJjaGFuZ2UiLCJzZXRTZWxlY3RlZCIsInN5bmMiLCJmZXRjaEVuZCIsImVudGVyRWRpdE1vZGUiLCIkY2hlY2tib3giLCJmb2N1cyIsInRhcmdldCIsImV4aXRFZGl0TW9kZSIsIm9uQ2hhbmdlIiwiYWRkQ2xhc3MiLCJyZW1vdmVDbGFzcyIsIlNlbGVjdEFsbEhlYWRlckNlbGwiLCJIZWFkZXJDZWxsIiwic2VsZWN0ZWRNb2RlbHNDb2xsZWN0aW9uIiwiQ29sbGVjdGlvbiIsInNlbGVjdGVkTW9kZWxzIiwicmVtb3ZlZE1vZGVscyIsInBhZ2VTZWxlY3RlZE1vZGVscyIsImZpbHRlckNoYW5nZSIsImluaXRpYWxTdGF0ZSIsInJlcXVlc3QiLCJmZXRjaFN0YXJ0IiwiZXJyb3IiLCJmZXRjaEVycm9yIiwicmVtb3ZlIiwicmVtb3ZlTW9kZWwiLCJ1cGRhdGVTdGF0ZSIsInNlbGVjdE1vZGVsIiwic2VsZWN0QWxsIiwic2VsZWN0QWxsVmlzaWJsZSIsInNlbGVjdE5vbmUiLCJpc1NlbGVjdGVkIiwib25GaWx0ZXJDaGFuZ2UiLCJvYmoiLCJpc1BsYWluT2JqZWN0IiwiaXNTZWxlY3RlZE1vZGVsIiwiaXNFbXB0eU9iamVjdCIsImtleXMiLCJpbnNldCIsIm1vZGVscyIsImNpZCIsImZpbHRlciIsImluY2x1ZGVzIiwibSIsInJlbW92ZUR1cGxpY2F0ZVNlbGVjdE1vZGVscyIsImlzVW5kZWZpbmVkIiwiaW50ZXJzZWN0aW9uIiwidmFsdWVzIiwibGVuZ3RoIiwiZ2V0U2VsZWN0aW9uU3RhdGUiLCJ1cGRhdGVTZWxlY3RlZE1vZGVscyIsIl9tYXJrU2VsZWN0ZWQiLCJvblNlbGVjdCIsImlzIiwib25TZWxlY3RBbGwiLCJvblNlbGVjdFZpYWJsZSIsIm9uU2VsZWN0Tm9uZSIsInBhcmFtIiwiY29uc29sZSIsImFsZXJ0IiwicmVzcG9uc2VKU09OIiwiZGV0YWlsIiwiYWRkIiwidW5pcUJ5IiwiTW9tZW50Q2VsbCIsIkV4dGVuc2lvbiIsIlRvb2xiYXJDZWxsIiwiZ2VuZXJhdGVUb29sdGlwcyIsImh0bWwiLCJ0b29sdGlwcyIsIml0ZW0iLCJ0aXRsZSIsInRvTG93ZXJDYXNlIiwidGVtcGxhdGVDbGVhbiIsInRvb2xiYXJJdGVtQ2xpY2siLCJ0b29sYmFyIiwidHQiLCJoaWRlT25DbGljayIsInBvc2l0aW9uIiwiZXZlbnQiLCJhbmltYXRpb24iLCJ0Iiwic3RyaW5nU29ydCIsImNvbCIsInNlbGVjdGVkUm93Iiwicm93IiwiUm93IiwiaGlnaGxpZ2h0Q29sb3IiLCJtb3VzZW92ZXIiLCJtb3VzZW91dCIsInNldENvbG91ciIsImNsaWNrYWJsZSIsInJvd0ZvY3VzZWQiLCJub0hpZ2hsaWdodCIsImJhY2tncm91bmRDb2xvciIsInJvd0xvc3RGb2N1cyIsInVuc2VsZWN0Iiwibm9kZU5hbWUiLCJvZmZzZXRQYXJlbnQiLCJjbGFzc0xpc3QiLCJjb250YWlucyIsImNvbHVtbnMiLCJlbXB0eVRleHQiLCJmZXRjaGluZyIsImNzcyIsIm9wYWNpdHkiLCJib2R5IiwicmVzcCIsImFycm93IiwibWF4V2lkdGgiLCJvayIsImZ1bGxDb2xsZWN0aW9uIiwidG90YWxQYWdlcyIsImdldFBhZ2UiLCJhcmcxIiwicGFnaW5hdG9yIiwiUGFnaW5hdG9yIiwiZ29CYWNrRmlyc3RPblNvcnQiLCJyYXciLCJmaWx0ZXJDb250YWluZXIiLCJmaWx0ZXJzIiwiZGVmYXVsdEZpbHRlcnMiXSwibWFwcGluZ3MiOiJBQUFBOzs7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUMsV0FBV0QsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUUsU0FBU0YsUUFBUSxRQUFSLENBQWY7QUFDQSxJQUFNRyxzQkFBc0JILFFBQVEsd0JBQVIsQ0FBNUI7QUFDQUcsb0JBQW9CRCxNQUFwQjtBQUNBRixRQUFRLHNCQUFSO0FBQ0EsSUFBTUksSUFBSUosUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNSyxJQUFJTCxRQUFRLFFBQVIsQ0FBVjtBQUNBQSxRQUFRLG9CQUFSO0FBQ0EsSUFBTU0sc0JBQXNCTixRQUFRLHVCQUFSLENBQTVCO0FBQ0EsSUFBTU8sV0FBV1AsUUFBUSxZQUFSLENBQWpCO0FBQ0EsSUFBTVEsUUFBUVIsUUFBUSxVQUFSLEVBQW9CUyxPQUFsQzs7QUFFQSxJQUFNQyxPQUFPLFNBQVBB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SUFBRCxJQUFTLEtBQUtoUSxJQUFsQixFQUNDLEtBQUtBLElBQUwsQ0FBVXNLLE1BQVY7QUFDRCxDQU5EOztBQVFBakwsS0FBS3lCLFNBQUwsQ0FBZUosTUFBZixHQUF3QixZQUFXO0FBQ2xDLE1BQUt1UCxTQUFMLEdBQWlCLElBQUlyUixTQUFTbU8sU0FBVCxDQUFtQm1ELFNBQXZCLENBQWlDO0FBQ2pEelEsY0FBWSxLQUFLQSxVQURnQztBQUVqRDBRLHFCQUFtQjtBQUY4QixFQUFqQyxDQUFqQjs7QUFLQSxRQUFPLEtBQUtGLFNBQVo7QUFDQSxDQVBEOztBQVNBNVEsS0FBS3lCLFNBQUwsQ0FBZXlLLE1BQWYsR0FBd0IsVUFBU2pNLElBQVQsRUFBZTtBQUN0QyxNQUFLaU0sTUFBTCxHQUFjLElBQUl0TSxtQkFBSixDQUF3QjtBQUNyQ21SLE9BQUssS0FBSzNRLFVBRDJCO0FBRXJDNFEsbUJBQWlCL1EsS0FBSytRLGVBRmU7QUFHckNDLFdBQVNoUixLQUFLZ1IsT0FBTCxJQUFnQixFQUhZO0FBSXJDQyxrQkFBZ0JqUixLQUFLaVIsY0FBTCxJQUF1QjtBQUpGLEVBQXhCLENBQWQ7O0FBT0EsS0FBSSxLQUFLalIsSUFBTCxDQUFVaUIsY0FBZCxFQUNDLEtBQUtkLFVBQUwsQ0FBZ0JlLFlBQWhCLENBQTZCLEVBQUVDLE9BQU8sSUFBVCxFQUE3Qjs7QUFFRCxRQUFPLEtBQUs4SyxNQUFaO0FBQ0EsQ0FaRCIsImZpbGUiOiJzZXJ2ZXJHcmlkLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IEJhY2tncmlkID0gcmVxdWlyZShcImJhY2tncmlkXCIpO1xuY29uc3QgbW9tZW50ID0gcmVxdWlyZShcIm1vbWVudFwiKTtcbmNvbnN0IG1vbWVudER1cmF0aW9uU2V0dXAgPSByZXF1aXJlKFwibW9tZW50LWR1cmF0aW9uLWZvcm1hdFwiKTtcbm1vbWVudER1cmF0aW9uU2V0dXAobW9tZW50KTtcbnJlcXVpcmUoXCJiYWNrZ3JpZC5tb21lbnQtY2VsbFwiKTtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5yZXF1aXJlKFwiYmFja2dyaWQtcGFnaW5hdG9yXCIpO1xuY29uc3QgU2VydmVyRmlsdGVyTWFuYWdlciA9IHJlcXVpcmUoXCIuL3NlcnZlckZpbHRlck1hbmFnZXJcIik7XG5jb25zdCBTZWxlY3RyYSA9IHJlcXVpcmUoXCIuL3NlbGVjdHJhXCIpO1xuY29uc3QgdGlwcHkgPSByZXF1aXJlKFwidGlwcHkuanNcIikuZGVmYXVsdDtcblxuY29uc3QgR3JpZCA9IGZ1bmN0aW9uKG9wdHMpIHtcblx0Xy5leHRlbmQodGhpcywgQmFja2JvbmUuRXZlbnRzKTtcblxuXHRpZiAoIShvcHRzLmNvbGxlY3Rpb24gaW5zdGFuY2VvZiBCYWNrYm9uZS5QYWdlYWJsZUNvbGxlY3Rpb24pKVxuXHRcdHRocm93IG5ldyBFcnJvcihcIk11c3QgcGFzcyBhIFBhZ2VhYmxlQ29sbGVjdGlvbiB0byBTZXJ2ZXJHcmlkIGNvbnN0cnVjdG9yXCIpO1xuXG5cdHRoaXMuY29sbGVjdGlvbiA9IG9wdHMuY29sbGVjdGlvbjtcblxuXHR0aGlzLm9wdHMgPSBvcHRzO1xuXG5cdHRoaXMucmVnZW5lcmF0ZSgpO1xuXG5cdGlmIChvcHRzLmVsKSB7XG5cdFx0Ly90aGlzLmVsID0gb3B0cy5lbDtcblx0XHQvL3RoaXMuJGVsID0gJChvcHRzLmVsKTtcblx0XHR0aGlzLm92ZXJsYXkgPSAkKFwiPGRpdiBjbGFzcz0nZ3JpZC1vdmVybGF5Jz48c3BhbiBjbGFzcz0nc3Bpbm5lci1pY29uIHNwaW5uZXItcmVkJy8+IEZldGNoaW5nIGRhdGEuLi48L2Rpdj5cIik7XG5cdFx0b3B0cy5lbC5hcHBlbmQodGhpcy5ncmlkLnJlbmRlcigpLmVsKTtcblx0XHRvcHRzLmVsLmFwcGVuZCh0aGlzLm92ZXJsYXkpO1xuXHR9XG5cblx0aWYgKG9wdHMuY291bnRlcilcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuY29sbGVjdGlvbiwgXCJzeW5jIHJlc2V0IGFkZCByZW1vdmVcIiwgdGhpcy51cGRhdGVDb3VudGVyLmJpbmQodGhpcykpO1xuXG5cdGlmICghb3B0cy5ub0xvYWQgJiYgIW9wdHMud2FpdEZvckZpbHRlcnMpXG5cdFx0dGhpcy5jb2xsZWN0aW9uLmdldEZpcnN0UGFnZSh7IHJlc2V0OiB0cnVlIH0pO1xuXG5cdGlmIChvcHRzLnBhZ2luZylcblx0XHRvcHRzLnBhZ2luZy5lbGVtZW50LmFwcGVuZCh0aGlzLnBhZ2luZygpLnJlbmRlcigpLmVsKTtcbn07XG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IEdyaWQ7XG5cbkdyaWQucHJvdG90eXBlLnVwZGF0ZUNvdW50ZXIgPSBmdW5jdGlvbigpIHtcblx0aWYgKCF0aGlzLmNvbGxlY3Rpb24uc3RhdGUudG90YWxSZWNvcmRzKVxuXHRcdHJldHVybiB0aGlzLm9wdHMuY291bnRlci5lbGVtZW50LnRleHQoXCJObyBkYXRhIGZvdW5kXCIpO1xuXG5cdGNvbnN0IHBhZ2VTdGFydCA9ICgoKHRoaXMuY29sbGVjdGlvbi5zdGF0ZS5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5jb2xsZWN0aW9uLnN0YXRlLnBhZ2VTaXplKSArIDEpO1xuXHRsZXQgcGFnZUVuZCA9ICgodGhpcy5jb2xsZWN0aW9uLnN0YXRlLmN1cnJlbnRQYWdlKSAqIHRoaXMuY29sbGVjdGlvbi5zdGF0ZS5wYWdlU2l6ZSk7XG5cdGlmIChwYWdlRW5kID4gdGhpcy5jb2xsZWN0aW9uLnN0YXRlLnRvdGFsUmVjb3Jkcylcblx0XHRwYWdlRW5kID0gdGhpcy5jb2xsZWN0aW9uLnN0YXRlLnRvdGFsUmVjb3JkcztcblxuXHRpZiAoXy5pc0Z1bmN0aW9uKHRoaXMub3B0cy5jb3VudGVyLnRlbXBsYXRlKSlcblx0XHRyZXR1cm4gdGhpcy5vcHRzLmNvdW50ZXIuZWxlbWVudC50ZXh0KHRoaXMub3B0cy5jb3VudGVyLnRlbXBsYXRlKHRoaXMuY29sbGVjdGlvbikpO1xuXG5cdHRoaXMub3B0cy5jb3VudGVyLmVsZW1lbnQudGV4dCh0aGlzLm9wdHMuY291bnRlci50ZW1wbGF0ZVxuXHRcdC5yZXBsYWNlKC9cXCRzdGFydC8sIHBhZ2VTdGFydClcblx0XHQucmVwbGFjZSgvXFwkZW5kLywgcGFnZUVuZClcblx0XHQucmVwbGFjZSgvXFwkdG90YWwvLCB0aGlzLmNvbGxlY3Rpb24uc3RhdGUudG90YWxSZWNvcmRzKS50b0xvY2FsZVN0cmluZygpKTtcblxuXHRpZiAodGhpcy5vcHRzLnRvdGFsKVxuXHRcdHRoaXMub3B0cy50b3RhbC5lbGVtZW50LnRleHQodGhpcy5vcHRzLnRvdGFsLnRlbXBsYXRlLnJlcGxhY2UoL1xcJHN1bXRvdGFsLywgdGhpcy5jb2xsZWN0aW9uLnN0YXRlLnN1bVRvdGFsKS50b0xvY2FsZVN0cmluZygpKTtcbn07XG5cbkdyaWQuQnV0dG9uQ2VsbCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0cmV0dXJuIEJhY2tncmlkLkNlbGwuZXh0ZW5kKHtcblx0XHR0ZW1wbGF0ZTogXy50ZW1wbGF0ZShcIjxidXR0b24gY2xhc3M9XFxcIlwiICsgKG9wdGlvbnMuY2xhc3MgfHwgXCJcIikgKyBcIlxcXCI+PCU9dGV4dCU+PC9idXR0b24+XCIpLFxuXHRcdGluaXRpYWxpemU6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcblx0XHRcdHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwgXCJidXR0b25jZWxsOmRpc2FibGVcIiwgKCkgPT4ge1xuXHRcdFx0XHQkKFwiYnV0dG9uXCIsIHRoaXMuZWwpLmF0dHIoXCJkaXNhYmxlZFwiLCB0cnVlKTtcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsIFwiYnV0dG9uY2VsbDplbmFibGVcIiwgKCkgPT4ge1xuXHRcdFx0XHQkKFwiYnV0dG9uXCIsIHRoaXMuZWwpLmF0dHIoXCJkaXNhYmxlZFwiLCBmYWxzZSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0QmFja2dyaWQuQ2VsbC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzLCBhcmdzKTtcblx0XHR9LFxuXHRcdGV2ZW50czoge1xuXHRcdFx0XCJjbGljayBidXR0b25cIjogXCJjbGlja2VkXCIsXG5cdFx0fSxcblx0XHRjbGlja2VkOiBmdW5jdGlvbihlKSB7XG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0XHR0aGlzLm1vZGVsLnRyaWdnZXIoXCJidXR0b25jZWxsOmNsaWNrZWRcIiwgb3B0aW9ucy5pZCwgdGhpcy5tb2RlbCk7XG5cdFx0fSxcblx0XHRyZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dGhpcy5lbC5pbm5lckhUTUwgPSBfLmlzRnVuY3Rpb24ob3B0aW9ucy50ZXh0KSA/IG9wdGlvbnMudGV4dC5jYWxsKHRoaXMubW9kZWwpIDogdGhpcy50ZW1wbGF0ZSh7IHRleHQ6IG9wdGlvbnMudGV4dCB9KTtcblx0XHRcdHRoaXMuZGVsZWdhdGVFdmVudHMoKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fSxcblx0fSk7XG59O1xuXG5jb25zdCBTZWxlY3RyYUZvcm1hdHRlciA9IF8ubm9vcDtcblNlbGVjdHJhRm9ybWF0dGVyLnByb3RvdHlwZSA9IG5ldyBCYWNrZ3JpZC5DZWxsRm9ybWF0dGVyKCk7XG5fLmV4dGVuZChTZWxlY3RyYUZvcm1hdHRlci5wcm90b3R5cGUsIHtcblx0ZnJvbVJhdzogZnVuY3Rpb24ocmF3VmFsdWUpIHtcblx0XHRyZXR1cm4gXy5pc0FycmF5KHJhd1ZhbHVlKSA/IHJhd1ZhbHVlIDogcmF3VmFsdWUgPT09IG51bGwgPyBbXSA6IFtyYXdWYWx1ZV07XG5cdH0sXG59KTtcblxuY29uc3QgU2VsZWN0cmFDZWxsRWRpdG9yID0gQmFja2dyaWQuQ2VsbEVkaXRvci5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImlucHV0XCIsXG5cblx0ZXZlbnRzOiB7XG5cdFx0Ymx1cjogXCJjbG9zZVwiLFxuXHRcdGtleWRvd246IFwiY2xvc2VcIixcblx0fSxcblxuXHRzZXRPcHRpb25zOiBmdW5jdGlvbihzZWxlY3RyYU9wdGlvbnMpIHtcblx0XHR0aGlzLnNlbGVjdHJhT3B0aW9ucyA9IHNlbGVjdHJhT3B0aW9ucztcblx0fSxcblxuXHRzZXRNdWx0aXBsZTogZnVuY3Rpb24obXVsdGlwbGUpIHtcblx0XHR0aGlzLm11bHRpcGxlID0gbXVsdGlwbGU7XG5cdFx0dGhpcy4kZWwucHJvcChcIm11bHRpcGxlXCIsIG11bHRpcGxlKTtcblx0fSxcblxuXHRyZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHNlbGVjdHJhT3B0aW9ucyA9IF8ucmVzdWx0KHRoaXMsIFwic2VsZWN0cmFPcHRpb25zXCIpO1xuXHRcdGNvbnN0IHZhbCA9IHRoaXMubW9kZWwuZ2V0KHRoaXMuY29sdW1uLmdldChcIm5hbWVcIikpO1xuXG5cdFx0aWYgKHNlbGVjdHJhT3B0aW9ucy5zZXJ2ZXIpIHtcblx0XHRcdGNvbnN0IGtleSA9IHNlbGVjdHJhT3B0aW9ucy5zZXJ2ZXIua2V5IHx8IFwia2V5XCI7XG5cdFx0XHRjb25zdCB2YWx1ZSA9IHNlbGVjdHJhT3B0aW9ucy5zZXJ2ZXIudmFsdWUgfHwgXCJ2YWx1ZVwiO1xuXG5cdFx0XHRpZiAodGhpcy5tb2RlbC5oYXMoa2V5KSAmJiB0aGlzLm1vZGVsLmhhcyh2YWx1ZSkpIHtcblx0XHRcdFx0c2VsZWN0cmFPcHRpb25zLnNlcnZlci5kZWZhdWx0ID0ge1xuXHRcdFx0XHRcdGtleTogdGhpcy5tb2RlbC5nZXQoa2V5KSxcblx0XHRcdFx0XHR2YWx1ZTogdGhpcy5tb2RlbC5nZXQodmFsdWUpLFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZiAoc2VsZWN0cmFPcHRpb25zLnNlcnZlci5rZXkgPT09IHNlbGVjdHJhT3B0aW9ucy5zZXJ2ZXIudmFsdWUgJiYgdmFsKSB7XG5cdFx0XHRcdHNlbGVjdHJhT3B0aW9ucy5zZXJ2ZXIuZGVmYXVsdCA9IHtcblx0XHRcdFx0XHRrZXk6IHZhbCxcblx0XHRcdFx0XHR2YWx1ZTogdmFsLFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRlbHNlIGlmICghXy5pc0VtcHR5KHNlbGVjdHJhT3B0aW9ucy5pdGVtcykgJiYgIXNlbGVjdHJhT3B0aW9ucy5zZXJ2ZXIpIHtcblx0XHRcdF8uZWFjaChzZWxlY3RyYU9wdGlvbnMuaXRlbXMsIGkgPT4geyBpLnNlbGVjdGVkID0gdGhpcy5tdWx0aXBsZSA/IF8uc29tZSh2YWwsIHYgPT4gdiA9PT0gaS5rZXkpIDogaS5rZXkgPT09IHZhbDsgfSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5zZWxlY3QgPSBuZXcgU2VsZWN0cmEoc2VsZWN0cmFPcHRpb25zKTtcblxuXHRcdHRoaXMuc2VsZWN0LnNob3coeyBlbDogJCh0aGlzLmVsKSB9KTtcblxuXHRcdC8vIEZpeGVkIHdpZHRoIGZvciBDU1YgaW1wb3J0IHBhZ2Vcblx0XHRjb25zdCBidG4gPSAkKFwiPGJ1dHRvbiB0eXBlPVxcXCJidXR0b25cXFwiIGNsYXNzPVxcXCJidXR0b24gdGlueVxcXCIgc3R5bGU9J2Rpc3BsYXk6IGlubGluZS1ibG9jayc+U2F2ZTwvYnV0dG9uPlwiKTtcblx0XHQkKGJ0bikub24oXCJjbGlja1wiLCB0aGlzLmJ1dHRvbkNsb3NlLmJpbmQodGhpcykpO1xuXHRcdCQodGhpcy5lbCkucGFyZW50KCkuYXBwZW5kKGJ0bik7XG5cblx0XHR0aGlzLmRlbGVnYXRlRXZlbnRzKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRzYXZlOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCB2YWwgPSB0aGlzLnNlbGVjdC5nZXRTZWxlY3RlZCgpO1xuXHRcdGxldCByZXN1bHQ7XG5cblx0XHRpZiAodGhpcy5tdWx0aXBsZSlcblx0XHRcdHJlc3VsdCA9IF8ubWFwKHZhbCwgdiA9PiB2W3RoaXMuc2VsZWN0Lm1vZGVsLmdldChcImtleVwiKV0pO1xuXHRcdGVsc2Vcblx0XHRcdHJlc3VsdCA9IHZhbFt0aGlzLnNlbGVjdC5tb2RlbC5nZXQoXCJrZXlcIildO1xuXG5cdFx0Y29uc3Qgc2V0ID0ge1xuXHRcdFx0W3RoaXMuY29sdW1uLmdldChcIm5hbWVcIildOiByZXN1bHQsXG5cdFx0fTtcblxuXHRcdGlmICh0aGlzLnNlbGVjdC5tb2RlbC5oYXMoXCJzZXJ2ZXJcIikpIHtcblx0XHRcdHNldFt0aGlzLnNlbGVjdC5tb2RlbC5nZXQoXCJrZXlcIildID0gdmFsW3RoaXMuc2VsZWN0Lm1vZGVsLmdldChcImtleVwiKV07XG5cdFx0XHRzZXRbdGhpcy5zZWxlY3QubW9kZWwuZ2V0KFwidmFsdWVcIildID0gcmVzdWx0O1xuXHRcdH1cblxuXHRcdHRoaXMubW9kZWwuc2V0KHNldCk7XG5cdH0sXG5cblx0YnV0dG9uQ2xvc2U6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRldnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdHRoaXMuc2VsZWN0LmRlc3Ryb3koKTtcblxuXHRcdHRoaXMuY2xvc2UobmV3IEV2ZW50KFwiYmx1clwiKSk7XG5cdH0sXG5cblx0Y2xvc2U6IGZ1bmN0aW9uKGUpIHtcblx0XHRjb25zdCBtb2RlbCA9IHRoaXMubW9kZWw7XG5cdFx0Y29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW47XG5cdFx0Y29uc3QgY29tbWFuZCA9IG5ldyBCYWNrZ3JpZC5Db21tYW5kKGUpO1xuXHRcdGlmIChjb21tYW5kLmNhbmNlbCgpKSB7XG5cdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0bW9kZWwudHJpZ2dlcihcImJhY2tncmlkOmVkaXRlZFwiLCBtb2RlbCwgY29sdW1uLCBuZXcgQmFja2dyaWQuQ29tbWFuZChlKSk7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKGNvbW1hbmQuc2F2ZSgpIHx8IGNvbW1hbmQubW92ZUxlZnQoKSB8fCBjb21tYW5kLm1vdmVSaWdodCgpIHx8XG5cdFx0XHRjb21tYW5kLm1vdmVVcCgpIHx8IGNvbW1hbmQubW92ZURvd24oKSB8fCBlLnR5cGUgPT09IFwiYmx1clwiKSB7XG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0dGhpcy5zYXZlKGUpO1xuXHRcdFx0bW9kZWwudHJpZ2dlcihcImJhY2tncmlkOmVkaXRlZFwiLCBtb2RlbCwgY29sdW1uLCBuZXcgQmFja2dyaWQuQ29tbWFuZChlKSk7XG5cdFx0fVxuXHR9LFxuXG59KTtcblxuR3JpZC5TZWxlY3RyYUNlbGwgPSBCYWNrZ3JpZC5DZWxsLmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJzZWxlY3RyYS1jZWxsXCIsXG5cblx0ZWRpdG9yOiBTZWxlY3RyYUNlbGxFZGl0b3IsXG5cblx0bXVsdGlwbGU6IGZhbHNlLFxuXG5cdGZvcm1hdHRlcjogU2VsZWN0cmFGb3JtYXR0ZXIsXG5cblx0b3B0aW9uczogdW5kZWZpbmVkLFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcblx0XHRHcmlkLlNlbGVjdHJhQ2VsbC5fX3N1cGVyX18uaW5pdGlhbGl6ZS5hcHBseSh0aGlzLCBhcmdzKTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsIFwiYmFja2dyaWQ6ZWRpdFwiLCAobW9kZWwsIGNvbHVtbiwgY2VsbCwgZWRpdG9yKSA9PiB7XG5cdFx0XHRpZiAoY29sdW1uLmdldChcIm5hbWVcIikgPT09IHRoaXMuY29sdW1uLmdldChcIm5hbWVcIikpIHtcblx0XHRcdFx0ZWRpdG9yLnNldE9wdGlvbnModGhpcy5vcHRpb25zKTtcblx0XHRcdFx0ZWRpdG9yLnNldE11bHRpcGxlKHRoaXMub3B0aW9ucy5tdWx0aXBsZSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0sXG5cblx0cmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC5lbXB0eSgpO1xuXG5cdFx0bGV0IHZhbCA9IHRoaXMubW9kZWwuZ2V0KHRoaXMuY29sdW1uLmdldChcIm5hbWVcIikpO1xuXG5cdFx0aWYgKF8uaXNBcnJheSh2YWwpKVxuXHRcdFx0dmFsID0gXy5qb2luKHZhbCwgXCIsIFwiKTtcblxuXHRcdGNvbnN0IHJhd0RhdGEgPSB0aGlzLmZvcm1hdHRlci5mcm9tUmF3KHZhbCwgdGhpcy5tb2RlbCk7XG5cblx0XHR0aGlzLiRlbC5hcHBlbmQocmF3RGF0YSk7XG5cblx0XHR0aGlzLmRlbGVnYXRlRXZlbnRzKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcbn0pO1xuXG5cbkdyaWQuSFRNTENlbGwgPSBCYWNrZ3JpZC5DZWxsLmV4dGVuZCh7XG5cdHJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5lbC5pbm5lckhUTUwgPSB0aGlzLm1vZGVsLmdldCh0aGlzLmNvbHVtbi5nZXQoXCJuYW1lXCIpKTtcblxuXHRcdGlmICgkKFwic3BhblwiLCB0aGlzLmVsKS5nZXQoMCkpIHtcblx0XHRcdHRpcHB5KCQoXCJzcGFuXCIsIHRoaXMuZWwpLmdldCgwKSwge1xuXHRcdFx0XHR0aGVtZTogXCJibGFja1wiLFxuXHRcdFx0XHRwbGFjZW1lbnQ6IFwiYm90dG9tXCIsXG5cdFx0XHRcdGRlbGF5OiA1MDAsXG5cdFx0XHRcdGNvbnRlbnQ6ICQoXCJzcGFuXCIsIHRoaXMuZWwpLmF0dHIoXCJ0aXRsZVwiKSxcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxufSk7XG5cbkdyaWQuRHVyYXRpb25DZWxsID0gQmFja2dyaWQuQ2VsbC5leHRlbmQoe1xuXHRyZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHBlcnAgPSB0aGlzLm1vZGVsLmdldChcInBlcnBldHVhbFwiKTtcblx0XHRpZiAocGVycCkge1xuXHRcdFx0dGhpcy5lbC5pbm5lckhUTUwgPSBcIlBlcnBldHVhbFwiO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGNvbnN0IHZhbCA9IHRoaXMubW9kZWwuZ2V0KHRoaXMuY29sdW1uLmdldChcIm5hbWVcIikpO1xuXHRcdFx0aWYgKHZhbCkge1xuXHRcdFx0XHRjb25zdCBkID0gbW9tZW50LmR1cmF0aW9uKHZhbCk7XG5cdFx0XHRcdGlmIChkIDwgMClcblx0XHRcdFx0XHR0aGlzLmVsLmlubmVySFRNTCA9IFwiRXhwaXJlZFwiO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dGhpcy5lbC5pbm5lckhUTUwgPSBkLmZvcm1hdChcInlbeV0gTVttb10gZFtkXSBoW2hdIG1bbV0gc1tzXVwiLCB7IHRyaW06IFwiYm90aFwiIH0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxufSk7XG5cbkdyaWQuVmVyc2lvbkNlbGwgPSBCYWNrZ3JpZC5DZWxsLmV4dGVuZCh7XG5cdHJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgdmFsID0gdGhpcy5tb2RlbC5nZXQodGhpcy5jb2x1bW4uZ2V0KFwibmFtZVwiKSk7XG5cdFx0aWYgKCF2YWwpXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdGxldCBmaW5hbCA9IE1hdGguZmxvb3IodmFsKTtcblx0XHRpZiAodmFsICUgMSlcblx0XHRcdGZpbmFsICs9IFwiLlwiICsgKHZhbCAlIDEpLnRvRml4ZWQoNCkuc3Vic3RyaW5nKDIpLnJlcGxhY2UoL15bXjEtOV0rKC4rPyQpLywgXCIkMVwiKTtcblxuXHRcdHRoaXMuZWwuaW5uZXJIVE1MID0gZmluYWw7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcbn0pO1xuXG5cbkdyaWQuQm9vbGVhbkljb25DZWxsID0gQmFja2dyaWQuQ2VsbC5leHRlbmQoe1xuXHR0ZW1wbGF0ZTogXy50ZW1wbGF0ZShcIjxhIGNsYXNzPSdmYWwgPCU9aWNvbiU+JyBzdHlsZT0nY29sb3I6IDwlPWNvbG91ciU+Jz48L2E+XCIpLFxuXG5cdHJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0bGV0IGRhdGEgPSB7fTtcblx0XHRpZiAodGhpcy5tb2RlbC5nZXQodGhpcy5jb2x1bW4uZ2V0KFwibmFtZVwiKSkpXG5cdFx0XHRkYXRhID0geyBpY29uOiBcImZhLWNoZWNrXCIsIGNvbG91cjogdGhpcy5mYWxzZUNvbG91ciB8fCBcImdyZWVuXCIgfTtcblx0XHRlbHNlXG5cdFx0XHRkYXRhID0geyBpY29uOiBcImZhLXRpbWVzXCIsIGNvbG91cjogdGhpcy5mYWxzZUNvbG91ciB8fCBcInJlZFwiIH07XG5cblx0XHR0aGlzLmVsLmlubmVySFRNTCA9IHRoaXMudGVtcGxhdGUoZGF0YSk7XG5cdFx0dGhpcy5lbC5zdHlsZS50ZXh0QWxpZ24gPSBcImNlbnRlclwiO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxufSk7XG5cbkdyaWQuQm9vbGVhbkNpcmNsZUNlbGwgPSBCYWNrZ3JpZC5DZWxsLmV4dGVuZCh7XG5cdHRlbXBsYXRlOiBfLnRlbXBsYXRlKFwiPGEgY2xhc3M9J2ZhbCA8JT1pY29uJT4nIHN0eWxlPSdjb2xvcjogPCU9Y29sb3VyJT4nPjwvYT5cIiksXG5cblx0cmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRsZXQgZGF0YSA9IHt9O1xuXHRcdGlmICh0aGlzLm1vZGVsLmdldCh0aGlzLmNvbHVtbi5nZXQoXCJuYW1lXCIpKSlcblx0XHRcdGRhdGEgPSB7IGljb246IFwiZmEtY2hlY2tcIiwgY29sb3VyOiB0aGlzLmZhbHNlQ29sb3VyIHx8IFwiIzMzM1wiIH07XG5cdFx0ZWxzZVxuXHRcdFx0ZGF0YSA9IHsgaWNvbjogXCJcIiwgY29sb3VyOiB0aGlzLmZhbHNlQ29sb3VyIHx8IFwiIzc3N1wiIH07XG5cblx0XHR0aGlzLmVsLmlubmVySFRNTCA9IHRoaXMudGVtcGxhdGUoZGF0YSk7XG5cdFx0dGhpcy5lbC5zdHlsZS50ZXh0QWxpZ24gPSBcImNlbnRlclwiO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxufSk7XG5cbkdyaWQuQ2hlY2tib3hDZWxsID0gQmFja2dyaWQuQ2VsbC5leHRlbmQoe1xuXHR0ZW1wbGF0ZTogXy50ZW1wbGF0ZShcIjxpbnB1dCB0eXBlPSdjaGVja2JveCcgPCU9c2VsZWN0ZWQlPic+XCIpLFxuXHRjbGFzc05hbWU6IFwic2VsZWN0YWJsZSByZW5kZXJhYmxlIGNlbnRlcmVkIGhpZGVcIixcblx0ZXZlbnRzOiB7XG5cdFx0XCJjaGFuZ2UgOmNoZWNrYm94XCI6IFwib25DaGFuZ2VcIixcblx0XHRjbGljazogXCJlbnRlckVkaXRNb2RlXCIsXG5cdH0sXG5cblx0LyoqXG5cdCAqIEluaXRpYWxpemVyLiBJZiB0aGUgdW5kZXJseWluZyBtb2RlbCB0cmlnZ2VycyBhIGBzZWxlY3RgIGV2ZW50LCB0aGlzIGNlbGxcblx0ICogd2lsbCBjaGFuZ2UgaXRzIGNoZWNrZWQgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBldmVudCdzIGBzZWxlY3RlZGAgdmFsdWUuXG5cdCAqXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG5cdCAqIEBwYXJhbSB7QmFja2dyaWQuQ29sdW1ufSBvcHRpb25zLmNvbHVtblxuXHQgKiBAcGFyYW0ge0JhY2tib25lLk1vZGVsfSBvcHRpb25zLm1vZGVsXG5cdCAqL1xuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5jb2x1bW4gPSBvcHRpb25zLmNvbHVtbjtcblx0XHRpZiAoISh0aGlzLmNvbHVtbiBpbnN0YW5jZW9mIEJhY2tncmlkLkNvbHVtbikpXG5cdFx0XHR0aGlzLmNvbHVtbiA9IG5ldyBCYWNrZ3JpZC5Db2x1bW4odGhpcy5jb2x1bW4pO1xuXG5cdFx0dGhpcy5tb2RlbC5zZXQoXCJjaGVja2VkXCIsIGZhbHNlKTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsIFwiYmFja2dyaWQ6c2VsZWN0XCIsIChtb2RlbCwgY2hlY2tlZCkgPT4ge1xuXHRcdFx0dGhpcy4kZWwuZmluZChcIjpjaGVja2JveFwiKS5wcm9wKFwiY2hlY2tlZFwiLCBjaGVja2VkKS5jaGFuZ2UoKTtcblx0XHRcdHRoaXMuc2V0U2VsZWN0ZWQoY2hlY2tlZCk7XG5cdFx0XHR0aGlzLm1vZGVsLnNldChcImNoZWNrZWRcIiwgY2hlY2tlZCk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwuY29sbGVjdGlvbiwge1xuXHRcdFx0c3luYzogdGhpcy5mZXRjaEVuZC5iaW5kKHRoaXMpLFxuXHRcdH0pO1xuXHR9LFxuXG5cdGZldGNoRW5kOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm1vZGVsLnNldChcImNoZWNrZWRcIiwgdGhpcy4kZWwuZmluZChcIjpjaGVja2JveFwiKS5wcm9wKFwiY2hlY2tlZFwiKSk7XG5cdFx0dGhpcy5zZXRTZWxlY3RlZCh0aGlzLiRlbC5maW5kKFwiOmNoZWNrYm94XCIpLnByb3AoXCJjaGVja2VkXCIpKTtcblx0fSxcblxuXHQvKipcblx0ICogUmVuZGVycyB0aGUgY2hlY2tib3guXG5cdCAqL1xuXHRyZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHN0YXRlID0geyBzZWxlY3RlZDogZmFsc2UgfTtcblx0XHR0aGlzLiRlbC5lbXB0eSgpLmFwcGVuZCgnPGlucHV0IHRhYmluZGV4PVwiLTFcIiB0eXBlPVwiY2hlY2tib3hcIiAvPicpO1xuXHRcdHRoaXMubW9kZWwudHJpZ2dlcihcImJhY2tncmlkOmlzU2VsZWN0ZWRcIiwgdGhpcy5tb2RlbCwgc3RhdGUpO1xuXHRcdGlmIChzdGF0ZS5zZWxlY3RlZClcblx0XHRcdHRoaXMuJGVsLmZpbmQoXCI6Y2hlY2tib3hcIikucHJvcChcImNoZWNrZWRcIiwgXCJjaGVja2VkXCIpLnRyaWdnZXIoXCJjaGFuZ2VcIik7XG5cblx0XHR0aGlzLmRlbGVnYXRlRXZlbnRzKCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0LyoqXG5cdCAqIEZvY3VzZXMgdGhlIGNoZWNrYm94LlxuXHQgKi9cblx0ZW50ZXJFZGl0TW9kZTogZnVuY3Rpb24oZSkge1xuXHRcdGNvbnN0ICRjaGVja2JveCA9IHRoaXMuJGVsLmZpbmQoXCI6Y2hlY2tib3hcIikuZm9jdXMoKTtcblx0XHRpZiAoJGNoZWNrYm94WzBdICE9PSBlLnRhcmdldClcblx0XHRcdCRjaGVja2JveC5wcm9wKFwiY2hlY2tlZFwiLCAhJGNoZWNrYm94LnByb3AoXCJjaGVja2VkXCIpKS5jaGFuZ2UoKTtcblx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBVbmZvY3VzZXMgdGhlIGNoZWNrYm94LlxuXHQgKi9cblx0ZXhpdEVkaXRNb2RlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC5maW5kKFwiOmNoZWNrYm94XCIpLmJsdXIoKTtcblx0fSxcblxuXHQvKipcblx0ICogV2hlbiB0aGUgY2hlY2tib3gncyB2YWx1ZSBjaGFuZ2VzLCB0aGlzIG1ldGhvZCB3aWxsIHRyaWdnZXIgYSBCYWNrYm9uZVxuXHQgKiBgYmFja2dyaWQ6c2VsZWN0ZWRgIGV2ZW50IHdpdGggYSByZWZlcmVuY2Ugb2YgdGhlIG1vZGVsIGFuZCB0aGVcblx0ICogY2hlY2tib3gncyBgY2hlY2tlZGAgdmFsdWUuXG5cdCAqL1xuXHRvbkNoYW5nZTogZnVuY3Rpb24oZSkge1xuXHRcdHRoaXMubW9kZWwudHJpZ2dlcihcImJhY2tncmlkOnNlbGVjdGVkXCIsIHRoaXMubW9kZWwsICQoZS50YXJnZXQpLnByb3AoXCJjaGVja2VkXCIpKTtcblx0XHR0aGlzLnNldFNlbGVjdGVkKCQoZS50YXJnZXQpLnByb3AoXCJjaGVja2VkXCIpKTtcblx0fSxcblxuXHRzZXRTZWxlY3RlZDogZnVuY3Rpb24oc2VsZWN0ZWQpIHtcblx0XHRpZiAoc2VsZWN0ZWQpXG5cdFx0XHR0aGlzLiRlbC5wYXJlbnQoKS5hZGRDbGFzcyhcInNlbGVjdGVkXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuJGVsLnBhcmVudCgpLnJlbW92ZUNsYXNzKFwic2VsZWN0ZWRcIik7XG5cdH0sXG59KTtcblxuR3JpZC5TZWxlY3RBbGxIZWFkZXJDZWxsID0gQmFja2dyaWQuSGVhZGVyQ2VsbC5leHRlbmQoe1xuXHR0ZW1wbGF0ZTogXy50ZW1wbGF0ZShcIjxpbnB1dCB0eXBlPSdjaGVja2JveCcgZGF0YS1zZWxlY3Q+XCIpLFxuXHRjbGFzc05hbWU6IFwic2VsZWN0YWJsZSByZW5kZXJhYmxlIGhpZGVcIixcblxuXHRldmVudHM6IHtcblx0XHQvL2NoYW5nZTogXCJvblNlbGVjdFwiLFxuXHRcdFwiY2xpY2sgW2RhdGEtc2VsZWN0XVwiOiBcIm9uU2VsZWN0XCIsXG5cdFx0XCJjbGljayBbZGF0YS1zZWxlY3QtYWxsXVwiOiBcIm9uU2VsZWN0QWxsXCIsXG5cdFx0XCJjbGljayBbZGF0YS1zZWxlY3Qtbm9uZV1cIjogXCJvblNlbGVjdE5vbmVcIixcblx0XHRcImNsaWNrIFtkYXRhLXNlbGVjdC1hbGwtdmlzaWJsZV1cIjogXCJvblNlbGVjdFZpYWJsZVwiLFxuXHR9LFxuXG5cdC8qKlxuXHQgKiBJbml0aWFsaXplci5cblx0ICogU3Vic2NyaWJlcnMgb24gZXZlbnRzIGxpc3RlbmluZ1xuXHQgKlxuXHQgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuXHQgKiBAcGFyYW0ge0JhY2tncmlkLkNvbHVtbn0gb3B0aW9ucy5jb2x1bW5cblx0ICogQHBhcmFtIHtCYWNrYm9uZS5Db2xsZWN0aW9ufSBvcHRpb25zLmNvbGxlY3Rpb25cblx0ICovXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLmNvbGxlY3Rpb24uc2VsZWN0ZWRNb2RlbHNDb2xsZWN0aW9uID0gbmV3IEJhY2tib25lLkNvbGxlY3Rpb24oKTtcblxuXHRcdHRoaXMuY29sdW1uID0gb3B0aW9ucy5jb2x1bW47XG5cdFx0aWYgKCEodGhpcy5jb2x1bW4gaW5zdGFuY2VvZiBCYWNrZ3JpZC5Db2x1bW4pKVxuXHRcdFx0dGhpcy5jb2x1bW4gPSBuZXcgQmFja2dyaWQuQ29sdW1uKHRoaXMuY29sdW1uKTtcblxuXHRcdHRoaXMuc2VsZWN0ZWRNb2RlbHMgPSB7fTtcblx0XHR0aGlzLnJlbW92ZWRNb2RlbHMgPSB7fTtcblx0XHR0aGlzLnBhZ2VTZWxlY3RlZE1vZGVscyA9IHt9O1xuXHRcdHRoaXMuY3VycmVudFBhZ2UgPSAxO1xuXHRcdHRoaXMuZmlsdGVyQ2hhbmdlID0gZmFsc2U7XG5cblx0XHR0aGlzLmluaXRpYWxTdGF0ZSgpO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5jb2xsZWN0aW9uLCB7XG5cdFx0XHRyZXF1ZXN0OiB0aGlzLmZldGNoU3RhcnQuYmluZCh0aGlzKSxcblx0XHRcdHN5bmM6IHRoaXMuZmV0Y2hFbmQuYmluZCh0aGlzKSxcblx0XHRcdGVycm9yOiB0aGlzLmZldGNoRXJyb3IuYmluZCh0aGlzKSxcblx0XHRcdHJlbW92ZTogdGhpcy5yZW1vdmVNb2RlbC5iaW5kKHRoaXMpLFxuXHRcdFx0dXBkYXRlU3RhdGU6IHRoaXMuaW5pdGlhbFN0YXRlLmJpbmQodGhpcyksXG5cdFx0XHRcImJhY2tncmlkOnNlbGVjdGVkXCI6IHRoaXMuc2VsZWN0TW9kZWwuYmluZCh0aGlzKSxcblx0XHRcdFwiYmFja2dyaWQ6c2VsZWN0QWxsXCI6IHRoaXMuc2VsZWN0QWxsLmJpbmQodGhpcyksXG5cdFx0XHRcImJhY2tncmlkOnNlbGVjdEFsbFZpc2libGVcIjogdGhpcy5zZWxlY3RBbGxWaXNpYmxlLmJpbmQodGhpcyksXG5cdFx0XHRcImJhY2tncmlkOnNlbGVjdE5vbmVcIjogdGhpcy5zZWxlY3ROb25lLmJpbmQodGhpcyksXG5cblx0XHRcdFwiYmFja2dyaWQ6aXNTZWxlY3RlZFwiOiB0aGlzLmlzU2VsZWN0ZWQuYmluZCh0aGlzKSxcblx0XHRcdFwiYmFja2dyaWQ6Z2V0U2VsZWN0ZWRcIjogdGhpcy5nZXRTZWxlY3RlZC5iaW5kKHRoaXMpLFxuXHRcdFx0XCJmaWx0ZXI6Y2hhbmdlXCI6IHRoaXMub25GaWx0ZXJDaGFuZ2UuYmluZCh0aGlzKSxcblx0XHR9KTtcblx0fSxcblxuXHRvbkZpbHRlckNoYW5nZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5maWx0ZXJDaGFuZ2UgPSB0cnVlO1xuXHR9LFxuXG5cdGlzU2VsZWN0ZWQ6IGZ1bmN0aW9uKG1vZGVsLCBvYmopIHtcblx0XHRpZiAoJC5pc1BsYWluT2JqZWN0KG9iaikpXG5cdFx0XHRvYmouc2VsZWN0ZWQgPSB0aGlzLmlzU2VsZWN0ZWRNb2RlbChtb2RlbCk7XG5cdH0sXG5cblx0Z2V0U2VsZWN0ZWQ6IGZ1bmN0aW9uKG9iaikge1xuXHRcdGlmICgkLmlzRW1wdHlPYmplY3Qob2JqKSkge1xuXHRcdFx0b2JqLnNlbGVjdGVkID0gXy5rZXlzKHRoaXMuc2VsZWN0ZWRNb2RlbHMpO1xuXHRcdFx0b2JqLmluc2V0ID0gdGhpcy5pbnNldDtcblx0XHR9XG5cdH0sXG5cblx0cmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmVsLmlubmVySFRNTCA9IHRoaXMudGVtcGxhdGUoKTtcblx0XHR0aGlzLmVsLnN0eWxlLnRleHRBbGlnbiA9IFwiY2VudGVyXCI7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJlc2V0cyBzZWxlY3Rpb24gdG8gaW5pdGlhbCBjb25kaXRpb25zXG5cdCAqICAtIGNsZWFyIHNlbGVjdGVkIG1vZGVscyBzZXRcblx0ICogIC0gcmVzZXQgc2V0IHR5cGUgaW4tc2V0L25vdC1pbi1zZXRcblx0ICogQHBhcmFtIHtib29sZWFuPX0gaW5zZXQgZmxhZyBvZiBpbi1zZXQvbm90LWluLXNldCBtb2RlXG5cdCAqL1xuXHRpbml0aWFsU3RhdGU6IGZ1bmN0aW9uKGluc2V0KSB7XG5cdFx0aWYgKCF0aGlzLnBhZ2VTZWxlY3RlZE1vZGVsc1t0aGlzLmN1cnJlbnRQYWdlXSlcblx0XHRcdHRoaXMucGFnZVNlbGVjdGVkTW9kZWxzW3RoaXMuY3VycmVudFBhZ2VdID0ge307XG5cblx0XHQvLyBDaGVjayBjb2xsZWN0aW9uIGZvciBzZWxlY3RlZCBtb2RlbHMgYW5kIGFkZCB0aGVtIHRvIHRoaXMucGFnZVNlbGVjdGVkTW9kZWxzW3RoaXMuY3VycmVudFBhZ2VdXG5cdFx0Xy5lYWNoKHRoaXMuY29sbGVjdGlvbi5tb2RlbHMsIG1vZGVsID0+IHtcblx0XHRcdGlmIChtb2RlbC5nZXQoXCJjaGVja2VkXCIpKVxuXHRcdFx0XHR0aGlzLnBhZ2VTZWxlY3RlZE1vZGVsc1t0aGlzLmN1cnJlbnRQYWdlXVttb2RlbC5pZCB8fCBtb2RlbC5jaWRdID0gbW9kZWw7XG5cdFx0fSk7XG5cblx0XHQvLyBSZW1vdmUgbW9kZWwgZnJvbSBzZWxlY3RlZE1vZGVscyBpZiBpdCBpcyBub3QgaW4gY29sbGVjdGlvblxuXHRcdGlmICh0aGlzLmNvbGxlY3Rpb24uc3RhdGUuY3VycmVudFBhZ2UgPT09IDEgJiYgdGhpcy5maWx0ZXJDaGFuZ2UpIHtcblx0XHRcdHRoaXMuZmlsdGVyQ2hhbmdlID0gZmFsc2U7XG5cdFx0XHR0aGlzLnNlbGVjdE5vbmUoKTtcblx0XHRcdHRoaXMuY29sbGVjdGlvbi5zZWxlY3RlZE1vZGVsc0NvbGxlY3Rpb24ucmVzZXQoXy5maWx0ZXIodGhpcy5jb2xsZWN0aW9uLnNlbGVjdGVkTW9kZWxzQ29sbGVjdGlvbi5tb2RlbHMsIG1vZGVsID0+IHtcblx0XHRcdFx0aWYgKG1vZGVsKSB7XG5cdFx0XHRcdFx0aWYgKF8uaW5jbHVkZXMoXy5tYXAodGhpcy5jb2xsZWN0aW9uLm1vZGVscywgbSA9PiBtLmdldChcIl9pZFwiKSksIG1vZGVsLmdldChcIl9pZFwiKSkpXG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHRcdFx0XHRcdG1vZGVsLnNldChcImNoZWNrZWRcIiwgZmFsc2UpO1xuXHRcdFx0XHRcdHRoaXMucmVtb3ZlTW9kZWwobW9kZWwpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH0pKTtcblx0XHRcdHRoaXMucmVtb3ZlRHVwbGljYXRlU2VsZWN0TW9kZWxzKCk7XG5cblx0XHRcdHRoaXMuc2VsZWN0ZWRNb2RlbHMgPSB7fTtcblx0XHRcdF8uZWFjaCh0aGlzLmNvbGxlY3Rpb24uc2VsZWN0ZWRNb2RlbHNDb2xsZWN0aW9uLm1vZGVscywgbW9kZWwgPT4ge1xuXHRcdFx0XHR0aGlzLnNlbGVjdGVkTW9kZWxzW21vZGVsLmlkIHx8IG1vZGVsLmNpZF0gPSBtb2RlbDtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHRoaXMuaW5zZXQgPSBfLmlzVW5kZWZpbmVkKGluc2V0KSA/IHRydWUgOiBpbnNldDtcblx0XHR0aGlzLnVwZGF0ZVN0YXRlKCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgc3RhdGUgb2Ygc2VsZWN0aW9uICh0aHJlZSBzdGF0ZXMgYSBjaGVja2JveDogY2hlY2tlZCwgdW5jaGVja2VkLCBvciBpbmRldGVybWluYXRlKVxuXHQgKi9cblx0dXBkYXRlU3RhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0ICRjaGVja2JveCA9IHRoaXMuJChcIlt0eXBlPWNoZWNrYm94XVwiKTtcblxuXHRcdGlmIChfLmlzRW1wdHkodGhpcy5wYWdlU2VsZWN0ZWRNb2RlbHNbdGhpcy5jdXJyZW50UGFnZV0pICYmICEoXy5pbnRlcnNlY3Rpb24oXy52YWx1ZXModGhpcy5zZWxlY3RlZE1vZGVscyksIHRoaXMuY29sbGVjdGlvbi5tb2RlbHMpLmxlbmd0aCA+IDApKSB7XG5cdFx0XHQkY2hlY2tib3gucHJvcChcImluZGV0ZXJtaW5hdGVcIiwgZmFsc2UpO1xuXHRcdFx0JGNoZWNrYm94LnByb3AoXCJjaGVja2VkXCIsICF0aGlzLmluc2V0KTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoXy52YWx1ZXModGhpcy5wYWdlU2VsZWN0ZWRNb2RlbHNbdGhpcy5jdXJyZW50UGFnZV0pLmxlbmd0aCA9PT0gdGhpcy5jb2xsZWN0aW9uLmxlbmd0aCkge1xuXHRcdFx0JGNoZWNrYm94LnByb3AoXCJpbmRldGVybWluYXRlXCIsIGZhbHNlKTtcblx0XHRcdCRjaGVja2JveC5wcm9wKFwiY2hlY2tlZFwiLCB0cnVlKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHQkY2hlY2tib3gucHJvcChcImluZGV0ZXJtaW5hdGVcIiwgdHJ1ZSk7XG5cdFx0XHQkY2hlY2tib3gucHJvcChcImNoZWNrZWRcIiwgdHJ1ZSk7XG5cdFx0fVxuXHR9LFxuXG5cdC8qKlxuXHQgKiBHZXRzIHNlbGVjdGlvbiBzdGF0ZVxuXHQgKlxuXHQgKiBAcmV0dXJucyB7e3NlbGVjdGVkTW9kZWxzOiAqLCBpbnNldDogYm9vbGVhbn19XG5cdCAqL1xuXHRnZXRTZWxlY3Rpb25TdGF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHBhZ2VTZWxlY3RlZE1vZGVsczogdGhpcy5wYWdlU2VsZWN0ZWRNb2RlbHMsXG5cdFx0XHRzZWxlY3RlZE1vZGVsczogdGhpcy5zZWxlY3RlZE1vZGVscyxcblx0XHRcdGluc2V0OiB0aGlzLmluc2V0LFxuXHRcdH07XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBwYXNzZWQgbW9kZWwgaGF2ZSB0byBiZSBtYXJrZWQgYXMgc2VsZWN0ZWRcblx0ICpcblx0ICogQHBhcmFtIHtCYWNrYm9uZS5Nb2RlbH0gbW9kZWxcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqL1xuXHRpc1NlbGVjdGVkTW9kZWw6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0cmV0dXJuIF8uaGFzKHRoaXMuc2VsZWN0ZWRNb2RlbHMsIG1vZGVsLmlkIHx8IG1vZGVsLmNpZCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgbW9kZWwgZnJvbSBzZWxlY3RlZCBtb2RlbHMgc2V0XG5cdCAqXG5cdCAqIEBwYXJhbSB7QmFja2JvbmUuTW9kZWx9IG1vZGVsXG5cdCAqL1xuXHRyZW1vdmVNb2RlbDogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRpZiAoIW1vZGVsKVxuXHRcdFx0cmV0dXJuO1xuXHRcdGRlbGV0ZSB0aGlzLnNlbGVjdGVkTW9kZWxzW21vZGVsLmlkIHx8IG1vZGVsLmNpZF07XG5cdFx0ZGVsZXRlIHRoaXMucGFnZVNlbGVjdGVkTW9kZWxzW3RoaXMuY3VycmVudFBhZ2VdW21vZGVsLmlkIHx8IG1vZGVsLmNpZF07XG5cdFx0dGhpcy5yZW1vdmVkTW9kZWxzW21vZGVsLmlkIHx8IG1vZGVsLmNpZF0gPSBtb2RlbDtcblx0XHR0aGlzLnVwZGF0ZVN0YXRlKCk7XG5cdFx0dGhpcy51cGRhdGVTZWxlY3RlZE1vZGVscygpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBBZGRzL3JlbW92ZXMgbW9kZWwgdG8vZnJvbSBzZWxlY3RlZCBtb2RlbHMgc2V0XG5cdCAqXG5cdCAqIEBwYXJhbSB7QmFja2JvbmUuTW9kZWx9IG1vZGVsXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gc2VsZWN0ZWRcblx0ICovXG5cdHNlbGVjdE1vZGVsOiBmdW5jdGlvbihtb2RlbCwgc2VsZWN0ZWQpIHtcblx0XHRpZiAoc2VsZWN0ZWQpIHtcblx0XHRcdHRoaXMuc2VsZWN0ZWRNb2RlbHNbbW9kZWwuaWQgfHwgbW9kZWwuY2lkXSA9IG1vZGVsO1xuXHRcdFx0dGhpcy5wYWdlU2VsZWN0ZWRNb2RlbHNbdGhpcy5jdXJyZW50UGFnZV1bbW9kZWwuaWQgfHwgbW9kZWwuY2lkXSA9IG1vZGVsO1xuXHRcdFx0dGhpcy51cGRhdGVTdGF0ZSgpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMucmVtb3ZlTW9kZWwobW9kZWwpO1xuXHRcdH1cblx0XHR0aGlzLnVwZGF0ZVNlbGVjdGVkTW9kZWxzKCk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIFBlcmZvcm1zIHNlbGVjdGlvbiBvZiBhbGwgcG9zc2libGUgbW9kZWxzOlxuXHQgKiAgLSByZXNldCB0byBpbml0aWFsIHN0YXRlXG5cdCAqICAtIGNoYW5nZSB0eXBlIG9mIHNldCB0eXBlIGFzIG5vdC1pbnNldFxuXHQgKiAgLSBtYXJrcyBhbGwgbW9kZWxzIGluIGNvbGxlY3Rpb24gYXMgc2VsZWN0ZWRcblx0ICogIHN0YXJ0IHRvIGNvbGxlY3QgbW9kZWxzIHdoaWNoIGhhdmUgdG8gYmUgZXhjbHVkZWRcblx0ICovXG5cdHNlbGVjdEFsbDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5pbml0aWFsU3RhdGUoZmFsc2UpO1xuXHRcdHRoaXMuX21hcmtTZWxlY3RlZCh0cnVlKTtcblx0fSxcblxuXHQvKipcblx0ICogUmVzZXQgc2VsZWN0aW9uIG9mIGFsbCBwb3NzaWJsZSBtb2RlbHM6XG5cdCAqICAtIHJlc2V0IHRvIGluaXRpYWwgc3RhdGVcblx0ICogIC0gY2hhbmdlIHR5cGUgb2Ygc2V0IHR5cGUgYXMgaW5zZXRcblx0ICogIC0gbWFya3MgYWxsIG1vZGVscyBpbiBjb2xsZWN0aW9uIGFzIG5vdCBzZWxlY3RlZFxuXHQgKiAgc3RhcnQgdG8gY29sbGVjdCBtb2RlbHMgd2hpY2ggaGF2ZSB0byBiZSBpbmNsdWRlZFxuXHQgKi9cblx0c2VsZWN0Tm9uZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5pbml0aWFsU3RhdGUoKTtcblx0XHR0aGlzLl9tYXJrU2VsZWN0ZWQoZmFsc2UpO1xuXHRcdHRoaXMuY29sbGVjdGlvbi5zZWxlY3RlZE1vZGVsc0NvbGxlY3Rpb24ucmVzZXQoW10pO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBQZXJmb3JtcyBzZWxlY3Rpb24gb2YgYWxsIHZpc2libGUgbW9kZWxzOlxuXHQgKiAgLSBpZiBuZWNlc3NhcnkgcmVzZXQgdG8gaW5pdGlhbCBzdGF0ZVxuXHQgKiAgLSBtYXJrcyBhbGwgbW9kZWxzIGluIGNvbGxlY3Rpb24gYXMgc2VsZWN0ZWRcblx0ICovXG5cdHNlbGVjdEFsbFZpc2libGU6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghdGhpcy5pbnNldClcblx0XHRcdHRoaXMuaW5pdGlhbFN0YXRlKCk7XG5cdFx0dGhpcy5fbWFya1NlbGVjdGVkKHRydWUpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBNYXJrcyBhbGwgbW9kZWxzIGluIGNvbGxlY3Rpb24gYXMgc2VsZWN0ZWQvbm90IHNlbGVjdGVkXG5cdCAqXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gc2VsZWN0ZWRcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9tYXJrU2VsZWN0ZWQ6IGZ1bmN0aW9uKHNlbGVjdGVkKSB7XG5cdFx0dGhpcy5jb2xsZWN0aW9uLmVhY2gobW9kZWwgPT4ge1xuXHRcdFx0bW9kZWwudHJpZ2dlcihcImJhY2tncmlkOnNlbGVjdFwiLCBtb2RlbCwgc2VsZWN0ZWQpO1xuXHRcdH0pO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIGNsaWNrIG9uIGNoZWNrYm94IHNlbGVjdEFsbC9zZWxlY3ROb25lXG5cdCAqXG5cdCAqIEBwYXJhbSB7alF1ZXJ5LkV2ZW50fSBlXG5cdCAqL1xuXHRvblNlbGVjdDogZnVuY3Rpb24oZSkge1xuXHRcdGlmICh0aGlzLmluc2V0ICYmIF8uaXNFbXB0eSh0aGlzLnBhZ2VTZWxlY3RlZE1vZGVsc1t0aGlzLmN1cnJlbnRQYWdlXSkgPT09IHRoaXMuaW5zZXQpXG5cdFx0XHR0aGlzLmNvbGxlY3Rpb24udHJpZ2dlcihcImJhY2tncmlkOnNlbGVjdEFsbFwiKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLmNvbGxlY3Rpb24udHJpZ2dlcihcImJhY2tncmlkOnNlbGVjdE5vbmVcIik7XG5cblx0XHRpZiAoJChlLnRhcmdldCkuaXMoXCI6Y2hlY2tib3hcIikpXG5cdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIGNsaWNrIG9uIHNlbGVjdEFsbCBidXR0b25cblx0ICpcblx0ICogQHBhcmFtIHtqUXVlcnkuRXZlbnR9IGVcblx0ICovXG5cdG9uU2VsZWN0QWxsOiBmdW5jdGlvbihlKSB7XG5cdFx0dGhpcy5jb2xsZWN0aW9uLnRyaWdnZXIoXCJiYWNrZ3JpZDpzZWxlY3RBbGxcIik7XG5cdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIGNsaWNrIG9uIHNlbGVjdEFsbFZpc2libGUgYnV0dG9uXG5cdCAqXG5cdCAqIEBwYXJhbSB7alF1ZXJ5LkV2ZW50fWVcblx0ICovXG5cdG9uU2VsZWN0VmlhYmxlOiBmdW5jdGlvbihlKSB7XG5cdFx0dGhpcy5jb2xsZWN0aW9uLnRyaWdnZXIoXCJiYWNrZ3JpZDpzZWxlY3RBbGxWaXNpYmxlXCIpO1xuXHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0fSxcblxuXHQvKipcblx0ICogSGFuZGxlcyBjbGljayBvbiBzZWxlY3ROb25lIGJ1dHRvblxuXHQgKlxuXHQgKiBAcGFyYW0ge2pRdWVyeS5FdmVudH1lXG5cdCAqL1xuXHRvblNlbGVjdE5vbmU6IGZ1bmN0aW9uKGUpIHtcblx0XHR0aGlzLmNvbGxlY3Rpb24udHJpZ2dlcihcImJhY2tncmlkOnNlbGVjdE5vbmVcIik7XG5cdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHR9LFxuXG5cdGZldGNoU3RhcnQ6IGZ1bmN0aW9uKHBhcmFtKSB7XG5cdFx0dGhpcy5jdXJyZW50UGFnZSA9IHBhcmFtLnN0YXRlICYmIHBhcmFtLnN0YXRlLmN1cnJlbnRQYWdlID8gcGFyYW0uc3RhdGUuY3VycmVudFBhZ2UgOiAxO1xuXHRcdHRoaXMudXBkYXRlU2VsZWN0ZWRNb2RlbHMoKTtcblx0fSxcblxuXHRmZXRjaEVuZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5pbml0aWFsU3RhdGUoKTtcblx0fSxcblxuXHRmZXRjaEVycm9yOiBmdW5jdGlvbihjb2xsZWN0aW9uLCBlcnJvcikge1xuXHRcdGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuXHRcdGFsZXJ0KGVycm9yLnJlc3BvbnNlSlNPTi5kZXRhaWwpO1xuXHR9LFxuXG5cdHVwZGF0ZVNlbGVjdGVkTW9kZWxzOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmNvbGxlY3Rpb24uc2VsZWN0ZWRNb2RlbHNDb2xsZWN0aW9uLmFkZChfLnZhbHVlcyh0aGlzLnNlbGVjdGVkTW9kZWxzKSk7XG5cdFx0dGhpcy5jb2xsZWN0aW9uLnNlbGVjdGVkTW9kZWxzQ29sbGVjdGlvbi5yZW1vdmUoXy52YWx1ZXModGhpcy5yZW1vdmVkTW9kZWxzKSk7XG5cblx0XHQvLyBSZW1vdmUgZHVwbGljYXRlcyBmcm9tIHNlbGVjdGVkTW9kZWxzXG5cdFx0dGhpcy5yZW1vdmVEdXBsaWNhdGVTZWxlY3RNb2RlbHMoKTtcblx0XHR0aGlzLnJlbW92ZWRNb2RlbHMgPSB7fTtcblx0fSxcblxuXHRyZW1vdmVEdXBsaWNhdGVTZWxlY3RNb2RlbHM6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY29sbGVjdGlvbi5zZWxlY3RlZE1vZGVsc0NvbGxlY3Rpb24ucmVzZXQoXy51bmlxQnkodGhpcy5jb2xsZWN0aW9uLnNlbGVjdGVkTW9kZWxzQ29sbGVjdGlvbi5tb2RlbHMsIG1vZGVsID0+IG1vZGVsLmdldChcIl9pZFwiKSkpO1xuXHR9LFxufSk7XG5cbkdyaWQuTW9tZW50Q2VsbCA9IEJhY2tncmlkLkV4dGVuc2lvbi5Nb21lbnRDZWxsO1xuXG5HcmlkLlRvb2xiYXJDZWxsID0gZnVuY3Rpb24ob3B0aW9ucykge1xuXHRjb25zdCBnZW5lcmF0ZVRvb2x0aXBzID0gZnVuY3Rpb24obW9kZWwpIHtcblx0XHRjb25zdCBodG1sID0gXy5tYXAob3B0aW9ucy50b29sdGlwcywgaXRlbSA9PiB7XG5cdFx0XHRpZiAoIWl0ZW0uZmlsdGVyIHx8IGl0ZW0uZmlsdGVyKG1vZGVsKSlcblx0XHRcdFx0cmV0dXJuIFwiPGEgdGl0bGU9J1wiICsgaXRlbS50aXRsZSArIFwiJyBkYXRhLW5hbWU9J1wiICsgKGl0ZW0uZGF0YSB8fCBpdGVtLnRpdGxlKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xccy9nLCBcIlwiKSArIFwiJyBjbGFzcz0nZmFsIFwiICsgaXRlbS5pY29uICsgXCInPjwvYT5cIjtcblx0XHRcdHJldHVybiBcIlwiO1xuXHRcdH0pO1xuXHRcdHJldHVybiBodG1sLmpvaW4oXCJcIik7XG5cdH07XG5cblx0bGV0IHN0YXRlO1xuXG5cdHJldHVybiBCYWNrZ3JpZC5DZWxsLmV4dGVuZCh7XG5cdFx0dGVtcGxhdGU6IF8udGVtcGxhdGUoXCI8ZGl2IGNsYXNzPSd0b29sYmFyLWhvc3QgZmFsIGZhLWNvZyBoaWRlJz4mbmJzcDs8c3BhbiBjbGFzcz0nZmFsIGZhLWNhcmV0LWRvd24gaGlkZScgc3R5bGU9J2ZvbnQtc2l6ZTowLjhyZW0nLz48L2Rpdj5cIiksXG5cdFx0dGVtcGxhdGVDbGVhbjogXy50ZW1wbGF0ZShcIjxkaXY+Jm5ic3A7PC9kaXY+XCIpLFxuXHRcdGV2ZW50czoge1xuXHRcdFx0dG9vbGJhckl0ZW1DbGljazogXCJjbGlja2VkXCIsXG5cdFx0fSxcblx0XHRpbml0aWFsaXplOiBmdW5jdGlvbiguLi5hcmdzKSB7XG5cdFx0XHR0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsIFwiY2hhbmdlXCIsICgpID0+IHtcblx0XHRcdFx0Ly90aGlzLmdlbmVyYXRlVG9vbHRpcHMoKTtcblx0XHRcdFx0c3RhdGUgPSBudWxsO1xuXHRcdFx0fSk7XG5cblx0XHRcdEJhY2tncmlkLkNlbGwucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcywgYXJncyk7XG5cdFx0fSxcblx0XHRjbGlja2VkOiBmdW5jdGlvbihldnQsIGl0ZW0pIHtcblx0XHRcdHRoaXMubW9kZWwudHJpZ2dlcihcInRvb2xiYXI6Y2xpY2s6XCIgKyAkKGl0ZW0pLmRhdGEoXCJuYW1lXCIpLCB0aGlzLm1vZGVsKTtcblx0XHR9LFxuXHRcdGdlbmVyYXRlVG9vbHRpcHM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0JChcImRpdi50b29sYmFyLWhvc3RcIiwgdGhpcy5lbCkudG9vbGJhcihcInJlbW92ZVwiKTtcblx0XHRcdH1cblx0XHRcdGNhdGNoIChlKSB7XG5cdFx0XHRcdC8vIERvIG5vdGhpbmdcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgdHQgPSBnZW5lcmF0ZVRvb2x0aXBzKHRoaXMubW9kZWwpO1xuXHRcdFx0aWYgKCF0dCkge1xuXHRcdFx0XHQkKFwic3BhblwiLCB0aGlzLmVsKS5yZW1vdmUoKTtcblx0XHRcdFx0JChcImRpdlwiLCB0aGlzLmVsKS5yZW1vdmVDbGFzcyhcInRvb2xiYXItaG9zdCBmYWwgZmEtY29nXCIpO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblxuXHRcdFx0JChcImRpdi50b29sYmFyLWhvc3RcIiwgdGhpcy5lbCkudG9vbGJhcih7XG5cdFx0XHRcdGhpZGVPbkNsaWNrOiB0cnVlLFxuXHRcdFx0XHRjb250ZW50OiAkKFwiPGRpdj5cIiArIHR0ICsgXCI8L2Rpdj5cIiksXG5cdFx0XHRcdHBvc2l0aW9uOiBcImJvdHRvbVwiLFxuXHRcdFx0XHRldmVudDogXCJjbGlja1wiLFxuXHRcdFx0XHRzdHlsZTogXCJkYXJrXCIsXG5cdFx0XHRcdGFuaW1hdGlvbjogXCJzdGFuZGFyZFwiLFxuXHRcdFx0fSkub24oXCJ0b29sYmFyU2hvd25cIiwgKCkgPT4ge1xuXHRcdFx0XHRpZiAoc3RhdGUgJiYgIXN0YXRlLmlzKCQoXCJkaXYudG9vbGJhci1ob3N0XCIsIHRoaXMuZWwpKSlcblx0XHRcdFx0XHRzdGF0ZS50cmlnZ2VyKFwiY2xpY2tcIik7XG5cdFx0XHRcdHN0YXRlID0gJChcImRpdi50b29sYmFyLWhvc3RcIiwgdGhpcy5lbCk7XG5cdFx0XHR9KS5vbihcInRvb2xiYXJIaWRkZW5cIiwgKCkgPT4ge1xuXHRcdFx0XHRzdGF0ZSA9IG51bGw7XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cdFx0cmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRcdGlmIChzdGF0ZSlcblx0XHRcdFx0c3RhdGUudG9vbGJhcihcInJlbW92ZVwiKTtcblx0XHRcdHN0YXRlID0gbnVsbDtcblxuXHRcdFx0aWYgKG9wdGlvbnMudG9vbHRpcHMgJiYgXy5zb21lKG9wdGlvbnMudG9vbHRpcHMsIHQgPT4gIXQuZmlsdGVyIHx8IHQuZmlsdGVyKHRoaXMubW9kZWwpKSlcblx0XHRcdFx0dGhpcy5lbC5pbm5lckhUTUwgPSB0aGlzLnRlbXBsYXRlKHt9KTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5lbC5pbm5lckhUTUwgPSB0aGlzLnRlbXBsYXRlQ2xlYW4oe30pO1xuXG5cdFx0XHRpZiAodGhpcy5nZW5lcmF0ZVRvb2x0aXBzKCkgIT09IHRydWUpXG5cdFx0XHRcdCQoXCIuaGlkZVwiLCB0aGlzLmVsKS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cblx0XHRcdHRoaXMuZGVsZWdhdGVFdmVudHMoKTtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH0sXG5cdFx0cmVtb3ZlOiBmdW5jdGlvbiguLi5hcmdzKSB7XG5cdFx0XHRpZiAoc3RhdGUpXG5cdFx0XHRcdHN0YXRlLnRvb2xiYXIoXCJyZW1vdmVcIik7XG5cdFx0XHRzdGF0ZSA9IG51bGw7XG5cblx0XHRcdEJhY2tncmlkLkNlbGwucHJvdG90eXBlLnJlbW92ZS5hcHBseSh0aGlzLCBhcmdzKTtcblx0XHR9LFxuXHR9KTtcbn07XG5cbkdyaWQuc3RyaW5nU29ydCA9IGZ1bmN0aW9uKG1vZGVsLCBjb2wpIHtcblx0cmV0dXJuIG1vZGVsICYmIG1vZGVsLmhhcyhjb2wpID8gKG1vZGVsLmdldChjb2wpIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCkgOiBcIlwiO1xufTtcblxuR3JpZC5wcm90b3R5cGUucmVnZW5lcmF0ZSA9IGZ1bmN0aW9uKCkge1xuXHRsZXQgc2VsZWN0ZWRSb3c7XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtdGhpc1xuXHRjb25zdCBncmlkID0gdGhpcztcblxuXHRjb25zdCByb3cgPSBCYWNrZ3JpZC5Sb3cuZXh0ZW5kKHtcblx0XHRoaWdobGlnaHRDb2xvcjogXCIjREJGMkZGXCIsXG5cblx0XHRldmVudHM6IHtcblx0XHRcdGNsaWNrOiBcImNsaWNrXCIsXG5cdFx0XHRtb3VzZW92ZXI6IFwicm93Rm9jdXNlZFwiLFxuXHRcdFx0bW91c2VvdXQ6IFwicm93TG9zdEZvY3VzXCIsXG5cdFx0fSxcblx0XHRpbml0aWFsaXplOiBmdW5jdGlvbiguLi5hcmdzKSB7XG5cdFx0XHRCYWNrZ3JpZC5Sb3cucHJvdG90eXBlLmluaXRpYWxpemUuYXBwbHkodGhpcywgYXJncyk7XG5cblx0XHRcdHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwgXCJncmlkOnJlbmRlclwiLCB0aGlzLnJlbmRlci5iaW5kKHRoaXMpKTtcblx0XHRcdHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwgXCJncmlkOmNvbG91clwiLCB0aGlzLnNldENvbG91ci5iaW5kKHRoaXMpKTtcblx0XHR9LFxuXHRcdHJlbmRlcjogZnVuY3Rpb24oLi4uYXJncykge1xuXHRcdFx0QmFja2dyaWQuUm93LnByb3RvdHlwZS5yZW5kZXIuYXBwbHkodGhpcywgYXJncyk7XG5cblx0XHRcdGlmIChncmlkLm9wdHMuY2xpY2thYmxlKVxuXHRcdFx0XHQkKHRoaXMuZWwpLmFkZENsYXNzKFwicm93LWNsaWNrYWJsZVwiKTtcblxuXHRcdFx0dGhpcy5zZXRDb2xvdXIoKTtcblxuXHRcdFx0dGhpcy5tb2RlbC50cmlnZ2VyKFwiZ3JpZDpyZW5kZXJlZFwiKTtcblx0XHRcdGlmIChzZWxlY3RlZFJvdyA9PT0gdGhpcylcblx0XHRcdFx0JChcIi50b29sYmFyLWhvc3QsIC5mYS1jYXJldC1kb3duXCIsIHRoaXMuZWwpLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fSxcblx0XHRyb3dGb2N1c2VkOiBmdW5jdGlvbigpIHtcblx0XHRcdGlmIChzZWxlY3RlZFJvdyAhPT0gdGhpcykge1xuXHRcdFx0XHQkKFwiLnRvb2xiYXItaG9zdCwgLmZhLWNhcmV0LWRvd25cIiwgdGhpcy5lbCkucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0XHRpZiAoIWdyaWQub3B0cy5ub0hpZ2hsaWdodCAmJiAhdGhpcy5tb2RlbC5jb2xvdXIpXG5cdFx0XHRcdFx0dGhpcy5lbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmhpZ2hsaWdodENvbG9yO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0cm93TG9zdEZvY3VzOiBmdW5jdGlvbigpIHtcblx0XHRcdGlmIChzZWxlY3RlZFJvdyAhPT0gdGhpcykge1xuXHRcdFx0XHQkKFwiLnRvb2xiYXItaG9zdCwgLmZhLWNhcmV0LWRvd25cIiwgdGhpcy5lbCkuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0XHRpZiAoIWdyaWQub3B0cy5ub0hpZ2hsaWdodCAmJiAhdGhpcy5tb2RlbC5jb2xvdXIpXG5cdFx0XHRcdFx0dGhpcy5lbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLm1vZGVsLmNvbG91ciB8fCBcIlwiO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0c2V0Q29sb3VyOiBmdW5jdGlvbihjb2wpIHtcblx0XHRcdGlmIChjb2wpXG5cdFx0XHRcdHRoaXMubW9kZWwuY29sb3VyID0gY29sO1xuXHRcdFx0ZWxzZSBpZiAoY29sID09PSBudWxsKVxuXHRcdFx0XHR0aGlzLm1vZGVsLmNvbG91ciA9IFwiXCI7XG5cdFx0XHR0aGlzLmVsLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMubW9kZWwuY29sb3VyO1xuXHRcdH0sXG5cdFx0Y2xpY2s6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0XHRpZiAoc2VsZWN0ZWRSb3cpXG5cdFx0XHRcdHNlbGVjdGVkUm93LnVuc2VsZWN0KCk7XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC10aGlzXG5cdFx0XHRzZWxlY3RlZFJvdyA9IHRoaXM7XG5cblx0XHRcdCQoXCIudG9vbGJhci1ob3N0LCAuZmEtY2FyZXQtZG93blwiLCB0aGlzLmVsKS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHRpZiAoIWdyaWQub3B0cy5ub0hpZ2hsaWdodClcblx0XHRcdFx0dGhpcy5lbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB0aGlzLmhpZ2hsaWdodENvbG9yO1xuXG5cdFx0XHRpZiAoZXZ0LnRhcmdldC5ub2RlTmFtZSAhPT0gXCJURFwiICYmICghZXZ0LnRhcmdldC5vZmZzZXRQYXJlbnQgfHwgIWV2dC50YXJnZXQub2Zmc2V0UGFyZW50LmNsYXNzTGlzdC5jb250YWlucyhcInNraXBcIikpKSB7XG5cdFx0XHRcdHRoaXMubW9kZWwudHJpZ2dlcihcInJvdzpjdXN0b21jbGlja1wiLCB0aGlzLm1vZGVsLCBldnQpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmIChncmlkLm9wdHMuY2xpY2thYmxlKVxuXHRcdFx0XHRncmlkLnRyaWdnZXIoXCJyb3c6Y2xpY2tlZFwiLCB0aGlzLm1vZGVsKTtcblx0XHR9LFxuXG5cdFx0dW5zZWxlY3Q6IGZ1bmN0aW9uKCkge1xuXHRcdFx0JChcIi50b29sYmFyLWhvc3QsIC5mYS1jYXJldC1kb3duXCIsIHRoaXMuZWwpLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdGlmICghZ3JpZC5vcHRzLm5vSGlnaGxpZ2h0KVxuXHRcdFx0XHR0aGlzLmVsLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMubW9kZWwuY29sb3VyIHx8IFwiXCI7XG5cdFx0fSxcblx0fSk7XG5cblx0dGhpcy5ncmlkID0gbmV3IEJhY2tncmlkLkdyaWQoe1xuXHRcdHJvdzogcm93LFxuXHRcdGNvbHVtbnM6IHRoaXMub3B0cy5jb2x1bW5zLFxuXHRcdGNvbGxlY3Rpb246IHRoaXMuY29sbGVjdGlvbixcblx0XHRlbXB0eVRleHQ6ICgpID0+IHtcblx0XHRcdGlmICh0aGlzLmNvbGxlY3Rpb24uZmV0Y2hpbmcpXG5cdFx0XHRcdHJldHVybiBcIjxzcGFuIGNsYXNzPSdzcGlubmVyLWljb24gc3Bpbm5lci1zbWFsbCc+PC9zcGFuPiBGZXRjaGluZyBkYXRhLi4uXCI7XG5cdFx0XHRyZXR1cm4gXCJUaGVyZSBpcyBub3RoaW5nIHRvIHNob3dcIjtcblx0XHR9LFxuXHR9KTtcblxuXHR0aGlzLmxpc3RlblRvKHRoaXMuZ3JpZCwgXCJiZWZvcmU6ZGVzdHJveVwiLCB0aGlzLmRlc3Ryb3kuYmluZCh0aGlzKSk7XG5cblx0dGhpcy5saXN0ZW5Ubyh0aGlzLmNvbGxlY3Rpb24sIFwicmVzZXRcIiwgKCkgPT4ge1xuXHRcdHRoaXMuY29sbGVjdGlvbi5mZXRjaGluZyA9IGZhbHNlO1xuXHRcdHRoaXMudHJpZ2dlcihcInJlc2V0XCIpO1xuXHR9KTtcblxuXHR0aGlzLmxpc3RlblRvKHRoaXMuY29sbGVjdGlvbiwgXCJyZXF1ZXN0XCIsIGl0ZW0gPT4ge1xuXHRcdGlmIChcImF0dHJpYnV0ZXNcIiBpbiBpdGVtKVxuXHRcdFx0Ly8gU2luZ2xlLWl0ZW0gZmV0Y2gsIGRvbid0IHJlLXJlbmRlclxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5jb2xsZWN0aW9uLmZldGNoaW5nID0gdHJ1ZTtcblx0XHRpZiAodGhpcy5jb2xsZWN0aW9uLmxlbmd0aClcblx0XHRcdHRoaXMub3ZlcmxheS5jc3MoeyBvcGFjaXR5OiBcIjAuOFwiLCBcInBvaW50ZXItZXZlbnRzXCI6IFwiYWxsXCIgfSk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5ncmlkLmJvZHkucmVuZGVyKCk7XG5cdH0pO1xuXG5cdHRoaXMubGlzdGVuVG8odGhpcy5jb2xsZWN0aW9uLCBcInN5bmNcIiwgKGl0ZW0sIHJlc3ApID0+IHtcblx0XHQvLyBVcGRhdGUgdG9vbHRpcHNcblx0XHR0aXBweShcInRhYmxlLmJhY2tncmlkIHRkLnN0cmluZy1jZWxsW2RhdGEtdGlwcHktY29udGVudF1cIiwge1xuXHRcdFx0dGhlbWU6IFwiYmxhY2tcIixcblx0XHRcdGFuaW1hdGlvbjogXCJmYWRlXCIsXG5cdFx0XHRwbGFjZW1lbnQ6IFwidG9wXCIsXG5cdFx0XHRhcnJvdzogdHJ1ZSxcblx0XHRcdGRlbGF5OiBbMTAwMCwgMTBdLFxuXHRcdFx0bWF4V2lkdGg6IDkwMCxcblx0XHR9KTtcblxuXHRcdGlmIChyZXNwLm9rKVxuXHRcdFx0Ly8gU2luZ2xlLWl0ZW0gZmV0Y2gsIGRvbid0IHJlLXJlbmRlciB0aGUgZ3JpZFxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5jb2xsZWN0aW9uLmZldGNoaW5nID0gZmFsc2U7XG5cdFx0dGhpcy5vdmVybGF5LmNzcyh7IG9wYWNpdHk6IFwiMFwiLCBcInBvaW50ZXItZXZlbnRzXCI6IFwibm9uZVwiIH0pO1xuXHRcdGlmICghdGhpcy5jb2xsZWN0aW9uLmxlbmd0aClcblx0XHRcdHRoaXMuZ3JpZC5ib2R5LnJlbmRlcigpO1xuXHR9KTtcblxuXHR0aGlzLmxpc3RlblRvKHRoaXMuY29sbGVjdGlvbiwgXCJyZW1vdmVcIiwgKCkgPT4ge1xuXHRcdHRoaXMuY29sbGVjdGlvbi5mZXRjaGluZyA9IGZhbHNlO1xuXHRcdGlmICghdGhpcy5jb2xsZWN0aW9uLmxlbmd0aClcblx0XHRcdHRoaXMuZ3JpZC5ib2R5LnJlbmRlcigpO1xuXHR9KTtcblxuXHR0aGlzLmxpc3RlblRvKHRoaXMuY29sbGVjdGlvbi5mdWxsQ29sbGVjdGlvbiwgXCJhZGRcIiwgKCkgPT4ge1xuXHRcdHRoaXMuY29sbGVjdGlvbi5mZXRjaGluZyA9IGZhbHNlO1xuXHRcdGlmICghdGhpcy5jb2xsZWN0aW9uLmxlbmd0aClcblx0XHRcdHRoaXMuZ3JpZC5ib2R5LnJlbmRlcigpO1xuXHRcdGVsc2UgaWYgKHRoaXMuY29sbGVjdGlvbi5zdGF0ZS5jdXJyZW50UGFnZSA8IHRoaXMuY29sbGVjdGlvbi5zdGF0ZS50b3RhbFBhZ2VzKVxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uLmdldFBhZ2UodGhpcy5jb2xsZWN0aW9uLnN0YXRlLnRvdGFsUGFnZXMpO1xuXHR9KTtcbn07XG5cbkdyaWQucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbihhcmcxKSB7XG5cdGlmICh0aGlzLmZpbHRlcilcblx0XHR0aGlzLmZpbHRlci5kZXN0cm95KCk7XG5cblx0aWYgKCFhcmcxICYmIHRoaXMuZ3JpZClcblx0XHR0aGlzLmdyaWQucmVtb3ZlKCk7XG59O1xuXG5HcmlkLnByb3RvdHlwZS5wYWdpbmcgPSBmdW5jdGlvbigpIHtcblx0dGhpcy5wYWdpbmF0b3IgPSBuZXcgQmFja2dyaWQuRXh0ZW5zaW9uLlBhZ2luYXRvcih7XG5cdFx0Y29sbGVjdGlvbjogdGhpcy5jb2xsZWN0aW9uLFxuXHRcdGdvQmFja0ZpcnN0T25Tb3J0OiBmYWxzZSxcblx0fSk7XG5cblx0cmV0dXJuIHRoaXMucGFnaW5hdG9yO1xufTtcblxuR3JpZC5wcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24ob3B0cykge1xuXHR0aGlzLmZpbHRlciA9IG5ldyBTZXJ2ZXJGaWx0ZXJNYW5hZ2VyKHtcblx0XHRyYXc6IHRoaXMuY29sbGVjdGlvbixcblx0XHRmaWx0ZXJDb250YWluZXI6IG9wdHMuZmlsdGVyQ29udGFpbmVyLFxuXHRcdGZpbHRlcnM6IG9wdHMuZmlsdGVycyB8fCBbXSxcblx0XHRkZWZhdWx0RmlsdGVyczogb3B0cy5kZWZhdWx0RmlsdGVycyB8fCBbXSxcblx0fSk7XG5cblx0aWYgKHRoaXMub3B0cy53YWl0Rm9yRmlsdGVycylcblx0XHR0aGlzLmNvbGxlY3Rpb24uZ2V0Rmlyc3RQYWdlKHsgcmVzZXQ6IHRydWUgfSk7XG5cblx0cmV0dXJuIHRoaXMuZmlsdGVyO1xufTsiXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\n\nvar App = require(\"../index\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar Bus = _.extend({}, Backbone.Events);\n\nvar MenuItem = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"simple-menu-item\",\n\ttemplate: require(\"./templates/simpleMenu.nunj\").item,\n\n\tui: {\n\t\tcheck: \"div.check\"\n\t},\n\n\tevents: {\n\t\tclick: \"clicked\"\n\t},\n\n\tmodelEvents: {\n\t\tselect: \"setSelected\"\n\t},\n\n\tclicked: function clicked(evt) {\n\t\tevt.stopPropagation();\n\n\t\tthis.model.trigger(\"clicked\", {\n\t\t\tset: this.model.get(\"set\"),\n\t\t\tdisjoint: Boolean(this.model.get(\"disjoint\")),\n\t\t\tid: this.model.get(\"id\")\n\t\t}, this.model.has(\"set\") ? !this.model.get(\"selected\") : true);\n\n\t\tif (this.model.get(\"closeOnClick\")) return this.model.trigger(\"menu:close\");\n\n\t\tif (this.model.get(\"selected\") && this.model.get(\"disjoint\")) return;\n\n\t\tthis.setSelected(!this.model.get(\"selected\"));\n\t},\n\n\tsetSelected: function setSelected(enabled, noBroadcast) {\n\t\tthis.model.set(\"selected\", enabled);\n\n\t\tif (this.model.get(\"selected\")) this.ui.check.addClass(\"fas\").removeClass(\"fal\");else this.ui.check.removeClass(\"fas\").addClass(\"fal\");\n\n\t\tif (!noBroadcast && this.model.get(\"disjoint\")) this.model.collection.trigger(\"untoggle\", this.model.get(\"set\"), this.model.get(\"id\"));\n\t}\n});\n\nmodule.exports = Backbone.Marionette.CollectionView.extend({\n\ttagName: \"div\",\n\tclassName: \"simple-menu-list\",\n\n\tchildView: MenuItem,\n\n\tcollectionEvents: {\n\t\tclicked: \"clicked\",\n\t\t\"menu:close\": \"onMenuClose\",\n\t\tuntoggle: \"untoggle\"\n\t},\n\n\tinitialize: function initialize(o) {\n\t\tvar _this = this;\n\n\t\tvar options = o || {};\n\n\t\tif (!options.anchor) throw new Error(\"You must supply an anchor element when defining a simple menu\");\n\n\t\tthis.generateCollection(options.structure);\n\n\t\tthis.anchor = options.anchor;\n\t\tthis.side = options.side || \"right\";\n\t\tthis.nextTo = Boolean(options.nextTo);\n\t\tthis.persist = Boolean(options.persist);\n\t\tthis.clickRoot = options.clickRoot ? $(options.clickRoot) : $(document);\n\n\t\tthis.host = $(options.host);\n\t\tif (!this.host.length) this.host = $(\"body\");\n\n\t\tthis.boundDestroy = this.persist ? function () {\n\t\t\t_this.$el.hide();\n\t\t} : this.destroy.bind(this);\n\n\t\tthis.listenTo(radio, App.Events.PageChange, this.boundDestroy);\n\t},\n\n\tonDestroy: function onDestroy() {\n\t\tthis.remove();\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.clickRoot.off(\"click\", this.boundDestroy);\n\t\tthis.trigger(\"closing\");\n\t},\n\n\tshow: function show() {\n\t\tif (this._isRendered) {\n\t\t\tthis.$el.show();\n\t\t\treturn this;\n\t\t}\n\n\t\tthis.host.append(this.render().el);\n\n\t\t// Reposition me\n\t\tvar left = 0;\n\t\tif (this.nextTo) {\n\t\t\tthis.$el.css({ top: this.anchor.offset().top });\n\t\t\tleft += this.anchor.outerWidth(false) + 5;\n\t\t} else {\n\t\t\tthis.$el.css({ top: this.anchor.offset().top + this.anchor.outerHeight() });\n\t\t}\n\n\t\tif (this.side === \"right\") this.$el.css({ left: this.anchor.offset().left + left });else this.$el.css({ left: this.anchor.offset().left + this.anchor.outerWidth(false) - this.$el.width() });\n\n\t\tthis.clickRoot.on(\"click\", this.boundDestroy);\n\n\t\tBus.trigger(\"menu:created\");\n\t\tthis.listenTo(Bus, \"menu:created\", this.boundDestroy);\n\n\t\treturn this;\n\t},\n\n\tclicked: function clicked(name, enabled) {\n\t\tthis.trigger(\"clicked\", name, enabled);\n\t\tif (name.set) this.trigger(\"clicked:\" + name.set, name, enabled);\n\t\tthis.trigger(\"clicked:\" + (name.set ? name.set + \":\" : \"\") + name.id, name, enabled);\n\t},\n\n\tonMenuClose: function onMenuClose() {\n\t\tthis.boundDestroy();\n\t},\n\n\tuntoggle: function untoggle(set, id) {\n\t\tthis.collection.each(function (model) {\n\t\t\tif (id === model.get(\"id\")) return;\n\n\t\t\tif (set !== model.get(\"set\")) return;\n\n\t\t\tmodel.trigger(\"select\", false, true);\n\t\t});\n\t},\n\n\tgenerateCollection: function generateCollection(elems) {\n\t\tvar chooseMany = function (obj) {\n\t\t\tvar _this2 = this;\n\n\t\t\treturn _.map(obj.elements, function (item) {\n\t\t\t\tvar ret = { text: item.text, id: item.id, set: obj.name, selected: Boolean(item.selected), icon: item.icon, closeOnClick: Boolean(item.closeOnClick) || Boolean(obj.closeOnClick) };\n\t\t\t\tif (item.elements) ret.elements = _this2.generateCollection(item.elements);\n\t\t\t\treturn ret;\n\t\t\t});\n\t\t}.bind(this);\n\n\t\tvar chooseOne = function (obj) {\n\t\t\tvar _this3 = this;\n\n\t\t\tvar ret = [];\n\t\t\tif (obj.title) ret.push({ text: obj.title, heading: true });\n\n\t\t\tret = ret.concat(_.map(obj.elements, function (item) {\n\t\t\t\tvar ret2 = {\n\t\t\t\t\ttext: item.text,\n\t\t\t\t\tid: item.id,\n\t\t\t\t\tset: obj.name,\n\t\t\t\t\tdisjoint: true,\n\t\t\t\t\tselected: Boolean(item.selected),\n\t\t\t\t\ticon: item.icon,\n\t\t\t\t\tcloseOnClick: Boolean(item.closeOnClick) || Boolean(obj.closeOnClick)\n\t\t\t\t};\n\n\t\t\t\tif (item.elements) ret2.elements = _this3.generateCollection(item.elements);\n\t\t\t\treturn ret2;\n\t\t\t}));\n\n\t\t\treturn ret;\n\t\t}.bind(this);\n\n\t\tvar clickable = function (obj) {\n\t\t\tvar _this4 = this;\n\n\t\t\treturn _.map(obj.elements, function (item) {\n\t\t\t\tvar ret = {\n\t\t\t\t\ttext: item.text,\n\t\t\t\t\tid: item.id,\n\t\t\t\t\tselected: Boolean(item.selected),\n\t\t\t\t\ticon: item.icon,\n\t\t\t\t\tcloseOnClick: Boolean(item.closeOnClick) || Boolean(obj.closeOnClick)\n\t\t\t\t};\n\n\t\t\t\tif (item.elements) ret.elements = _this4.generateCollection(item.elements);\n\t\t\t\treturn ret;\n\t\t\t});\n\t\t}.bind(this);\n\n\t\tvar elements = _.flatMap(elems, function (val) {\n\t\t\tif (!val.type) return clickable(val);else if (val.type === \"choose-many\") return chooseMany(val);else if (val.type === \"choose-one\") return chooseOne(val);\n\t\t\treturn [];\n\t\t});\n\n\t\tthis.collection = new Backbone.Collection(elements);\n\n\t\tthis.bindEvents(this.collection, this.collectionEvents);\n\t},\n\n\ttoggle: function toggle(name, _toggle) {\n\t\tvar elem = _.find(this.collection.models, function (item) {\n\t\t\treturn (!name.set || item.set === name.set) && item.id === name.id;\n\t\t});\n\t\tif (!elem) return;\n\n\t\telem.trigger(\"select\", _toggle);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNpbXBsZU1lbnUuanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwiJCIsIl8iLCJBcHAiLCJyYWRpbyIsIlJhZGlvIiwiY2hhbm5lbCIsIkJ1cyIsImV4dGVuZCIsIkV2ZW50cyIsIk1lbnVJdGVtIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJ0YWdOYW1lIiwiY2xhc3NOYW1lIiwidGVtcGxhdGUiLCJpdGVtIiwidWkiLCJjaGVjayIsImV2ZW50cyIsImNsaWNrIiwibW9kZWxFdmVudHMiLCJzZWxlY3QiLCJjbGlja2VkIiwiZXZ0Iiwic3RvcFByb3BhZ2F0aW9uIiwibW9kZWwiLCJ0cmlnZ2VyIiwic2V0IiwiZ2V0IiwiZGlzam9pbnQiLCJCb29sZWFuIiwiaWQiLCJoYXMiLCJzZXRTZWxlY3RlZCIsImVuYWJsZWQiLCJub0Jyb2FkY2FzdCIsImFkZENsYXNzIiwicmVtb3ZlQ2xhc3MiLCJjb2xsZWN0aW9uIiwibW9kdWxlIiwiZXhwb3J0cyIsIkNvbGxlY3Rpb25WaWV3IiwiY2hpbGRWaWV3IiwiY29sbGVjdGlvbkV2ZW50cyIsInVudG9nZ2xlIiwiaW5pdGlhbGl6ZSIsIm8iLCJvcHRpb25zIiwiYW5jaG9yIiwiRXJyb3IiLCJnZW5lcmF0ZUNvbGxlY3Rpb24iLCJzdHJ1Y3R1cmUiLCJzaWRlIiwibmV4dFRvIiwicGVyc2lzdCIsImNsaWNrUm9vdCIsImRvY3VtZW50IiwiaG9zdCIsImxlbmd0aCIsImJvdW5kRGVzdHJveSIsIiRlbCIsImhpZGUiLCJkZXN0cm95IiwiYmluZCIsImxpc3RlblRvIiwiUGFnZUNoYW5nZSIsIm9uRGVzdHJveSIsInJlbW92ZSIsIm9uQmVmb3JlRGVzdHJveSIsIm9mZiIsInNob3ciLCJfaXNSZW5kZXJlZCIsImFwcGVuZCIsInJlbmRlciIsImVsIiwibGVmdCIsImNzcyIsInRvcCIsIm9mZnNldCIsIm91dGVyV2lkdGgiLCJvdXRlckhlaWdodCIsIndpZHRoIiwib24iLCJuYW1lIiwib25NZW51Q2xvc2UiLCJlYWNoIiwiZWxlbXMiLCJjaG9vc2VNYW55Iiwib2JqIiwibWFwIiwiZWxlbWVudHMiLCJyZXQiLCJ0ZXh0Iiwic2VsZWN0ZWQiLCJpY29uIiwiY2xvc2VPbkNsaWNrIiwiY2hvb3NlT25lIiwidGl0bGUiLCJwdXNoIiwiaGVhZGluZyIsImNvbmNhdCIsInJldDIiLCJjbGlja2FibGUiLCJmbGF0TWFwIiwidmFsIiwidHlwZSIsIkNvbGxlY3Rpb24iLCJiaW5kRXZlbnRzIiwidG9nZ2xlIiwiZWxlbSIsImZpbmQiLCJtb2RlbHMiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1DLElBQUlELFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUUsSUFBSUYsUUFBUSxRQUFSLENBQVY7O0FBRUEsSUFBTUcsTUFBTUgsUUFBUSxVQUFSLENBQVo7O0FBRUEsSUFBTUksUUFBUUwsU0FBU00sS0FBVCxDQUFlQyxPQUFmLENBQXVCLFFBQXZCLENBQWQ7O0FBRUEsSUFBTUMsTUFBTUwsRUFBRU0sTUFBRixDQUFTLEVBQVQsRUFBYVQsU0FBU1UsTUFBdEIsQ0FBWjs7QUFFQSxJQUFNQyxXQUFXWCxTQUFTWSxVQUFULENBQW9CQyxJQUFwQixDQUF5QkosTUFBekIsQ0FBZ0M7QUFDaERLLFVBQVMsS0FEdUM7QUFFaERDLFlBQVcsa0JBRnFDO0FBR2hEQyxXQUFVZixRQUFRLDZCQUFSLEVBQXVDZ0IsSUFIRDs7QUFLaERDLEtBQUk7QUFDSEMsU0FBTztBQURKLEVBTDRDOztBQVNoREMsU0FBUTtBQUNQQyxTQUFPO0FBREEsRUFUd0M7O0FBYWhEQyxjQUFhO0FBQ1pDLFVBQVE7QUFESSxFQWJtQzs7QUFpQmhEQyxVQUFTLGlCQUFTQyxHQUFULEVBQWM7QUFDdEJBLE1BQUlDLGVBQUo7O0FBRUEsT0FBS0MsS0FBTCxDQUFXQyxPQUFYLENBQW1CLFNBQW5CLEVBQThCO0FBQzdCQyxRQUFLLEtBQUtGLEtBQUwsQ0FBV0csR0FBWCxDQUFlLEtBQWYsQ0FEd0I7QUFFN0JD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WCxJQWRXLENBQWxCOztBQWdCQSxNQUFNMkIsV0FBV3pGLEVBQUVzRyxPQUFGLENBQVVqQixLQUFWLEVBQWlCLGVBQU87QUFDeEMsT0FBSSxDQUFDa0IsSUFBSUMsSUFBVCxFQUNDLE9BQU9ILFVBQVVFLEdBQVYsQ0FBUCxDQURELEtBRUssSUFBSUEsSUFBSUMsSUFBSixLQUFhLGFBQWpCLEVBQ0osT0FBT2xCLFdBQVdpQixHQUFYLENBQVAsQ0FESSxLQUVBLElBQUlBLElBQUlDLElBQUosS0FBYSxZQUFqQixFQUNKLE9BQU9ULFVBQVVRLEdBQVYsQ0FBUDtBQUNELFVBQU8sRUFBUDtBQUNBLEdBUmdCLENBQWpCOztBQVVBLE9BQUtsRSxVQUFMLEdBQWtCLElBQUl4QyxTQUFTNEcsVUFBYixDQUF3QmhCLFFBQXhCLENBQWxCOztBQUVBLE9BQUtpQixVQUFMLENBQWdCLEtBQUtyRSxVQUFyQixFQUFpQyxLQUFLSyxnQkFBdEM7QUFDQSxFQS9KeUQ7O0FBaUsxRGlFLFNBQVEsZ0JBQVN6QixJQUFULEVBQWV5QixPQUFmLEVBQXVCO0FBQzlCLE1BQU1DLE9BQU81RyxFQUFFNkcsSUFBRixDQUFPLEtBQUt4RSxVQUFMLENBQWdCeUUsTUFBdkIsRUFBK0I7QUFBQSxVQUFRLENBQUMsQ0FBQzVCLEtBQUt4RCxHQUFOLElBQWFaLEtBQUtZLEdBQUwsS0FBYXdELEtBQUt4RCxHQUFoQyxLQUF3Q1osS0FBS2dCLEVBQUwsS0FBWW9ELEtBQUtwRCxFQUFqRTtBQUFBLEdBQS9CLENBQWI7QUFDQSxNQUFJLENBQUM4RSxJQUFMLEVBQ0M7O0FBRURBLE9BQUtuRixPQUFMLENBQWEsUUFBYixFQUF1QmtGLE9BQXZCO0FBQ0E7QUF2S3lELENBQTFDLENBQWpCIiwiZmlsZSI6InNpbXBsZU1lbnUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcblxuY29uc3QgQXBwID0gcmVxdWlyZShcIi4uL2luZGV4XCIpO1xuXG5jb25zdCByYWRpbyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJnbG9iYWxcIik7XG5cbmNvbnN0IEJ1cyA9IF8uZXh0ZW5kKHt9LCBCYWNrYm9uZS5FdmVudHMpO1xuXG5jb25zdCBNZW51SXRlbSA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwic2ltcGxlLW1lbnUtaXRlbVwiLFxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4vdGVtcGxhdGVzL3NpbXBsZU1lbnUubnVualwiKS5pdGVtLFxuXG5cdHVpOiB7XG5cdFx0Y2hlY2s6IFwiZGl2LmNoZWNrXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0Y2xpY2s6IFwiY2xpY2tlZFwiLFxuXHR9LFxuXG5cdG1vZGVsRXZlbnRzOiB7XG5cdFx0c2VsZWN0OiBcInNldFNlbGVjdGVkXCIsXG5cdH0sXG5cblx0Y2xpY2tlZDogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0dGhpcy5tb2RlbC50cmlnZ2VyKFwiY2xpY2tlZFwiLCB7XG5cdFx0XHRzZXQ6IHRoaXMubW9kZWwuZ2V0KFwic2V0XCIpLFxuXHRcdFx0ZGlzam9pbnQ6IEJvb2xlYW4odGhpcy5tb2RlbC5nZXQoXCJkaXNqb2ludFwiKSksXG5cdFx0XHRpZDogdGhpcy5tb2RlbC5nZXQoXCJpZFwiKSxcblx0XHR9LCB0aGlzLm1vZGVsLmhhcyhcInNldFwiKSA/ICF0aGlzLm1vZGVsLmdldChcInNlbGVjdGVkXCIpIDogdHJ1ZSk7XG5cblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJjbG9zZU9uQ2xpY2tcIikpXG5cdFx0XHRyZXR1cm4gdGhpcy5tb2RlbC50cmlnZ2VyKFwibWVudTpjbG9zZVwiKTtcblxuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcInNlbGVjdGVkXCIpICYmIHRoaXMubW9kZWwuZ2V0KFwiZGlzam9pbnRcIikpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLnNldFNlbGVjdGVkKCF0aGlzLm1vZGVsLmdldChcInNlbGVjdGVkXCIpKTtcblx0fSxcblxuXHRzZXRTZWxlY3RlZDogZnVuY3Rpb24oZW5hYmxlZCwgbm9Ccm9hZGNhc3QpIHtcblx0XHR0aGlzLm1vZGVsLnNldChcInNlbGVjdGVkXCIsIGVuYWJsZWQpO1xuXG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwic2VsZWN0ZWRcIikpXG5cdFx0XHR0aGlzLnVpLmNoZWNrLmFkZENsYXNzKFwiZmFzXCIpLnJlbW92ZUNsYXNzKFwiZmFsXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMudWkuY2hlY2sucmVtb3ZlQ2xhc3MoXCJmYXNcIikuYWRkQ2xhc3MoXCJmYWxcIik7XG5cblx0XHRpZiAoIW5vQnJvYWRjYXN0ICYmIHRoaXMubW9kZWwuZ2V0KFwiZGlzam9pbnRcIikpXG5cdFx0XHR0aGlzLm1vZGVsLmNvbGxlY3Rpb24udHJpZ2dlcihcInVudG9nZ2xlXCIsIHRoaXMubW9kZWwuZ2V0KFwic2V0XCIpLCB0aGlzLm1vZGVsLmdldChcImlkXCIpKTtcblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuQ29sbGVjdGlvblZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogXCJkaXZcIixcblx0Y2xhc3NOYW1lOiBcInNpbXBsZS1tZW51LWxpc3RcIixcblxuXHRjaGlsZFZpZXc6IE1lbnVJdGVtLFxuXG5cdGNvbGxlY3Rpb25FdmVudHM6IHtcblx0XHRjbGlja2VkOiBcImNsaWNrZWRcIixcblx0XHRcIm1lbnU6Y2xvc2VcIjogXCJvbk1lbnVDbG9zZVwiLFxuXHRcdHVudG9nZ2xlOiBcInVudG9nZ2xlXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24obykge1xuXHRcdGNvbnN0IG9wdGlvbnMgPSBvIHx8IHt9O1xuXG5cdFx0aWYgKCFvcHRpb25zLmFuY2hvcilcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIllvdSBtdXN0IHN1cHBseSBhbiBhbmNob3IgZWxlbWVudCB3aGVuIGRlZmluaW5nIGEgc2ltcGxlIG1lbnVcIik7XG5cblx0XHR0aGlzLmdlbmVyYXRlQ29sbGVjdGlvbihvcHRpb25zLnN0cnVjdHVyZSk7XG5cblx0XHR0aGlzLmFuY2hvciA9IG9wdGlvbnMuYW5jaG9yO1xuXHRcdHRoaXMuc2lkZSA9IG9wdGlvbnMuc2lkZSB8fCBcInJpZ2h0XCI7XG5cdFx0dGhpcy5uZXh0VG8gPSBCb29sZWFuKG9wdGlvbnMubmV4dFRvKTtcblx0XHR0aGlzLnBlcnNpc3QgPSBCb29sZWFuKG9wdGlvbnMucGVyc2lzdCk7XG5cdFx0dGhpcy5jbGlja1Jvb3QgPSBvcHRpb25zLmNsaWNrUm9vdCA/ICQob3B0aW9ucy5jbGlja1Jvb3QpIDogJChkb2N1bWVudCk7XG5cblx0XHR0aGlzLmhvc3QgPSAkKG9wdGlvbnMuaG9zdCk7XG5cdFx0aWYgKCF0aGlzLmhvc3QubGVuZ3RoKVxuXHRcdFx0dGhpcy5ob3N0ID0gJChcImJvZHlcIik7XG5cblx0XHR0aGlzLmJvdW5kRGVzdHJveSA9IHRoaXMucGVyc2lzdCA/ICgpID0+IHsgdGhpcy4kZWwuaGlkZSgpOyB9IDogdGhpcy5kZXN0cm95LmJpbmQodGhpcyk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHJhZGlvLCBBcHAuRXZlbnRzLlBhZ2VDaGFuZ2UsIHRoaXMuYm91bmREZXN0cm95KTtcblx0fSxcblxuXHRvbkRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMucmVtb3ZlKCk7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmNsaWNrUm9vdC5vZmYoXCJjbGlja1wiLCB0aGlzLmJvdW5kRGVzdHJveSk7XG5cdFx0dGhpcy50cmlnZ2VyKFwiY2xvc2luZ1wiKTtcblx0fSxcblxuXHRzaG93OiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5faXNSZW5kZXJlZCkge1xuXHRcdFx0dGhpcy4kZWwuc2hvdygpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0dGhpcy5ob3N0LmFwcGVuZCh0aGlzLnJlbmRlcigpLmVsKTtcblxuXHRcdC8vIFJlcG9zaXRpb24gbWVcblx0XHRsZXQgbGVmdCA9IDA7XG5cdFx0aWYgKHRoaXMubmV4dFRvKSB7XG5cdFx0XHR0aGlzLiRlbC5jc3MoeyB0b3A6IHRoaXMuYW5jaG9yLm9mZnNldCgpLnRvcCB9KTtcblx0XHRcdGxlZnQgKz0gdGhpcy5hbmNob3Iub3V0ZXJXaWR0aChmYWxzZSkgKyA1O1xuXHRcdH1cblx0XHRlbHNlIHsgdGhpcy4kZWwuY3NzKHsgdG9wOiB0aGlzLmFuY2hvci5vZmZzZXQoKS50b3AgKyB0aGlzLmFuY2hvci5vdXRlckhlaWdodCgpIH0pOyB9XG5cblx0XHRpZiAodGhpcy5zaWRlID09PSBcInJpZ2h0XCIpXG5cdFx0XHR0aGlzLiRlbC5jc3MoeyBsZWZ0OiB0aGlzLmFuY2hvci5vZmZzZXQoKS5sZWZ0ICsgbGVmdCB9KTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLiRlbC5jc3MoeyBsZWZ0OiB0aGlzLmFuY2hvci5vZmZzZXQoKS5sZWZ0ICsgdGhpcy5hbmNob3Iub3V0ZXJXaWR0aChmYWxzZSkgLSB0aGlzLiRlbC53aWR0aCgpIH0pO1xuXG5cdFx0dGhpcy5jbGlja1Jvb3Qub24oXCJjbGlja1wiLCB0aGlzLmJvdW5kRGVzdHJveSk7XG5cblx0XHRCdXMudHJpZ2dlcihcIm1lbnU6Y3JlYXRlZFwiKTtcblx0XHR0aGlzLmxpc3RlblRvKEJ1cywgXCJtZW51OmNyZWF0ZWRcIiwgdGhpcy5ib3VuZERlc3Ryb3kpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0Y2xpY2tlZDogZnVuY3Rpb24obmFtZSwgZW5hYmxlZCkge1xuXHRcdHRoaXMudHJpZ2dlcihcImNsaWNrZWRcIiwgbmFtZSwgZW5hYmxlZCk7XG5cdFx0aWYgKG5hbWUuc2V0KVxuXHRcdFx0dGhpcy50cmlnZ2VyKFwiY2xpY2tlZDpcIiArIG5hbWUuc2V0LCBuYW1lLCBlbmFibGVkKTtcblx0XHR0aGlzLnRyaWdnZXIoXCJjbGlja2VkOlwiICsgKG5hbWUuc2V0ID8gbmFtZS5zZXQgKyBcIjpcIiA6IFwiXCIpICsgbmFtZS5pZCwgbmFtZSwgZW5hYmxlZCk7XG5cdH0sXG5cblx0b25NZW51Q2xvc2U6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuYm91bmREZXN0cm95KCk7XG5cdH0sXG5cblx0dW50b2dnbGU6IGZ1bmN0aW9uKHNldCwgaWQpIHtcblx0XHR0aGlzLmNvbGxlY3Rpb24uZWFjaChtb2RlbCA9PiB7XG5cdFx0XHRpZiAoaWQgPT09IG1vZGVsLmdldChcImlkXCIpKVxuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdGlmIChzZXQgIT09IG1vZGVsLmdldChcInNldFwiKSlcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRtb2RlbC50cmlnZ2VyKFwic2VsZWN0XCIsIGZhbHNlLCB0cnVlKTtcblx0XHR9KTtcblx0fSxcblxuXHRnZW5lcmF0ZUNvbGxlY3Rpb246IGZ1bmN0aW9uKGVsZW1zKSB7XG5cdFx0Y29uc3QgY2hvb3NlTWFueSA9IGZ1bmN0aW9uKG9iaikge1xuXHRcdFx0cmV0dXJuIF8ubWFwKG9iai5lbGVtZW50cywgaXRlbSA9PiB7XG5cdFx0XHRcdGNvbnN0IHJldCA9IHsgdGV4dDogaXRlbS50ZXh0LCBpZDogaXRlbS5pZCwgc2V0OiBvYmoubmFtZSwgc2VsZWN0ZWQ6IEJvb2xlYW4oaXRlbS5zZWxlY3RlZCksIGljb246IGl0ZW0uaWNvbiwgY2xvc2VPbkNsaWNrOiBCb29sZWFuKGl0ZW0uY2xvc2VPbkNsaWNrKSB8fCBCb29sZWFuKG9iai5jbG9zZU9uQ2xpY2spIH07XG5cdFx0XHRcdGlmIChpdGVtLmVsZW1lbnRzKVxuXHRcdFx0XHRcdHJldC5lbGVtZW50cyA9IHRoaXMuZ2VuZXJhdGVDb2xsZWN0aW9uKGl0ZW0uZWxlbWVudHMpO1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fSk7XG5cdFx0fS5iaW5kKHRoaXMpO1xuXG5cdFx0Y29uc3QgY2hvb3NlT25lID0gZnVuY3Rpb24ob2JqKSB7XG5cdFx0XHRsZXQgcmV0ID0gW107XG5cdFx0XHRpZiAob2JqLnRpdGxlKVxuXHRcdFx0XHRyZXQucHVzaCh7IHRleHQ6IG9iai50aXRsZSwgaGVhZGluZzogdHJ1ZSB9KTtcblxuXHRcdFx0cmV0ID0gcmV0LmNvbmNhdChfLm1hcChvYmouZWxlbWVudHMsIGl0ZW0gPT4ge1xuXHRcdFx0XHRjb25zdCByZXQyID0ge1xuXHRcdFx0XHRcdHRleHQ6IGl0ZW0udGV4dCxcblx0XHRcdFx0XHRpZDogaXRlbS5pZCxcblx0XHRcdFx0XHRzZXQ6IG9iai5uYW1lLFxuXHRcdFx0XHRcdGRpc2pvaW50OiB0cnVlLFxuXHRcdFx0XHRcdHNlbGVjdGVkOiBCb29sZWFuKGl0ZW0uc2VsZWN0ZWQpLFxuXHRcdFx0XHRcdGljb246IGl0ZW0uaWNvbixcblx0XHRcdFx0XHRjbG9zZU9uQ2xpY2s6IEJvb2xlYW4oaXRlbS5jbG9zZU9uQ2xpY2spIHx8IEJvb2xlYW4ob2JqLmNsb3NlT25DbGljayksXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0aWYgKGl0ZW0uZWxlbWVudHMpXG5cdFx0XHRcdFx0cmV0Mi5lbGVtZW50cyA9IHRoaXMuZ2VuZXJhdGVDb2xsZWN0aW9uKGl0ZW0uZWxlbWVudHMpO1xuXHRcdFx0XHRyZXR1cm4gcmV0Mjtcblx0XHRcdH0pKTtcblxuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9LmJpbmQodGhpcyk7XG5cblx0XHRjb25zdCBjbGlja2FibGUgPSBmdW5jdGlvbihvYmopIHtcblx0XHRcdHJldHVybiBfLm1hcChvYmouZWxlbWVudHMsIGl0ZW0gPT4ge1xuXHRcdFx0XHRjb25zdCByZXQgPSB7XG5cdFx0XHRcdFx0dGV4dDogaXRlbS50ZXh0LFxuXHRcdFx0XHRcdGlkOiBpdGVtLmlkLFxuXHRcdFx0XHRcdHNlbGVjdGVkOiBCb29sZWFuKGl0ZW0uc2VsZWN0ZWQpLFxuXHRcdFx0XHRcdGljb246IGl0ZW0uaWNvbixcblx0XHRcdFx0XHRjbG9zZU9uQ2xpY2s6IEJvb2xlYW4oaXRlbS5jbG9zZU9uQ2xpY2spIHx8IEJvb2xlYW4ob2JqLmNsb3NlT25DbGljayksXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0aWYgKGl0ZW0uZWxlbWVudHMpXG5cdFx0XHRcdFx0cmV0LmVsZW1lbnRzID0gdGhpcy5nZW5lcmF0ZUNvbGxlY3Rpb24oaXRlbS5lbGVtZW50cyk7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9KTtcblx0XHR9LmJpbmQodGhpcyk7XG5cblx0XHRjb25zdCBlbGVtZW50cyA9IF8uZmxhdE1hcChlbGVtcywgdmFsID0+IHtcblx0XHRcdGlmICghdmFsLnR5cGUpXG5cdFx0XHRcdHJldHVybiBjbGlja2FibGUodmFsKTtcblx0XHRcdGVsc2UgaWYgKHZhbC50eXBlID09PSBcImNob29zZS1tYW55XCIpXG5cdFx0XHRcdHJldHVybiBjaG9vc2VNYW55KHZhbCk7XG5cdFx0XHRlbHNlIGlmICh2YWwudHlwZSA9PT0gXCJjaG9vc2Utb25lXCIpXG5cdFx0XHRcdHJldHVybiBjaG9vc2VPbmUodmFsKTtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9KTtcblxuXHRcdHRoaXMuY29sbGVjdGlvbiA9IG5ldyBCYWNrYm9uZS5Db2xsZWN0aW9uKGVsZW1lbnRzKTtcblxuXHRcdHRoaXMuYmluZEV2ZW50cyh0aGlzLmNvbGxlY3Rpb24sIHRoaXMuY29sbGVjdGlvbkV2ZW50cyk7XG5cdH0sXG5cblx0dG9nZ2xlOiBmdW5jdGlvbihuYW1lLCB0b2dnbGUpIHtcblx0XHRjb25zdCBlbGVtID0gXy5maW5kKHRoaXMuY29sbGVjdGlvbi5tb2RlbHMsIGl0ZW0gPT4gKCFuYW1lLnNldCB8fCBpdGVtLnNldCA9PT0gbmFtZS5zZXQpICYmIGl0ZW0uaWQgPT09IG5hbWUuaWQpO1xuXHRcdGlmICghZWxlbSlcblx0XHRcdHJldHVybjtcblxuXHRcdGVsZW0udHJpZ2dlcihcInNlbGVjdFwiLCB0b2dnbGUpO1xuXHR9LFxufSk7XG4iXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\n\nvar Modal = Backbone.Marionette.View.extend({\n\ttemplate: require(\"./templates/smallModal.nunj\"),\n\n\tclassName: \"small-modal\",\n\n\tevents: {\n\t\t\"click button.ok\": \"ok\",\n\t\t\"click button.cancel\": \"cancel\",\n\t\t\"click @ui.error\": \"hideError\"\n\t},\n\n\tui: {\n\t\tok: \"button.ok\",\n\t\tcancel: \"button.cancel\",\n\t\tsubMessage: \"span.sub-message\",\n\t\tspinner: \".spinner-icon.main\",\n\t\tanother: \"input[name='another']\",\n\t\tbody: \"div.modal-body\",\n\t\terror: \"div.modal-error\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tvar defaultBody = \"<div style='width: 100%; text-align: center'><span class='spinner spinner-icon spinner-small centre'/> Loading</div>\";\n\n\t\tthis.options = options;\n\t\tif (this.options.className) this.className = this.options.className;\n\n\t\tthis.host = options.host || \"#modals\";\n\n\t\tthis.model = new Backbone.Model({\n\t\t\ttitle: options.title,\n\t\t\tbody: options.body || defaultBody,\n\t\t\thasBody: Boolean(options.body),\n\t\t\tcustomOK: options.customOK,\n\t\t\tcustomCancel: options.customCancel,\n\t\t\taddAnother: options.addAnother,\n\t\t\tcustomButtons: options.customButtons || [],\n\t\t\thideButtons: options.hideButtons || [],\n\t\t\twarning: Boolean(options.warning)\n\t\t});\n\n\t\t_.each(this.model.get(\"customButtons\"), this.bindCustomButton.bind(this));\n\n\t\tthis.undelegateEvents();\n\t\tthis.delegateEvents();\n\t},\n\n\tbindCustomButton: function bindCustomButton(button) {\n\t\tthis.events[\"click button.\" + button.id] = \"triggerCustomButton\";\n\t},\n\n\ttriggerCustomButton: function triggerCustomButton(evt) {\n\t\tthis.trigger(\"button:\" + $(evt.currentTarget).data(\"id\"), $(evt.currentTarget).data(\"id\"));\n\t},\n\n\thideError: function hideError() {\n\t\tthis.ui.error.addClass(\"hide\");\n\t},\n\n\tshow: function show() {\n\t\t$(\".modal-container\", $(this.host)).append(this.render().el);\n\t},\n\n\tsetBody: function setBody(newBody) {\n\t\tthis.model.set({ body: newBody, hasBody: true });\n\t\tthis.render();\n\t},\n\n\tsetTitle: function setTitle(title) {\n\t\tthis.model.set({ title: title });\n\t\tthis.render();\n\t},\n\n\tsetOKText: function setOKText(text) {\n\t\tthis.model.set({ customOK: text });\n\t\tthis.ui.ok.html(text);\n\t\treturn this;\n\t},\n\n\tsetPersistence: function setPersistence(val) {\n\t\tthis.options.persist = val;\n\t},\n\n\thideButton: function hideButton(str) {\n\t\tif (this.model.has(\"hideButtons\")) this.model.set({ hideButtons: this.model.get(\"hideButtons\").concat(str) });else this.model.set({ hideButtons: [str] });\n\t},\n\n\tshowButtons: function showButtons() {\n\t\t$(\"button\", this.el).removeClass(\"hide\");\n\t\treturn this;\n\t},\n\n\tenableButtons: function enableButtons() {\n\t\t$(\"button\", this.el).attr(\"disabled\", false);\n\t\treturn this;\n\t},\n\n\thideSpinner: function hideSpinner() {\n\t\tthis.ui.spinner.addClass(\"hide\");\n\t\treturn this;\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this = this;\n\n\t\t// Render a background\n\t\t$(\".modal-element\", $(this.host)).removeClass(\"hide\");\n\t\t$(\"body\").addClass(\"hide-overflow\");\n\n\t\tif (this.options.classNames) this.$el.addClass(this.options.classNames);\n\n\t\t// If there's any other modals visible right now, hide them, and restore it after\n\t\tthis.dunked = $.map($(\".modal-container\", $(this.host)).children(), function (item) {\n\t\t\tif ($(item).is(_this.$el)) return;\n\t\t\t$(item).addClass(\"hide\");\n\t\t\treturn $(item).getPath();\n\t\t});\n\n\t\tthis.trigger(\"rendered\", this);\n\t},\n\n\tonDestroy: function onDestroy() {\n\t\t// Clean up the background\n\t\tif (this.dunked && this.dunked.length === 0) {\n\t\t\t$(\".modal-element\", $(this.host)).addClass(\"hide\");\n\t\t\t$(\"body\").removeClass(\"hide-overflow\");\n\t\t}\n\n\t\tif (this.dunked) {\n\t\t\t_.each(this.dunked, function (item) {\n\t\t\t\tif (!item) return;\n\t\t\t\tvar el = $(item);\n\t\t\t\tif (el && el.length) el.removeClass(\"hide\");\n\t\t\t});\n\t\t}\n\t},\n\n\tok: function ok() {\n\t\tthis.ui.subMessage.addClass(\"hide\");\n\n\t\tvar another = this.ui.another.prop(\"checked\");\n\n\t\tif (this.options.persist) {\n\t\t\tthis.ui.spinner.removeClass(\"hide\");\n\t\t\t$(\"button\", this.el).attr(\"disabled\", true);\n\n\t\t\tthis.trigger(\"button:ok\", this, { another: another });\n\t\t} else {\n\t\t\tthis.destroy();\n\t\t\tthis.trigger(\"button:ok\", this, { another: another });\n\t\t}\n\t},\n\n\tcancel: function cancel() {\n\t\tthis.destroy();\n\t\tthis.trigger(\"button:cancel\", this);\n\t},\n\n\tshowError: function showError(text) {\n\t\tif (!this.ui.body.scrollTop) return;\n\t\t$(\".modal-error\", this.el).text(text).removeClass(\"hide\");\n\t\t$(\".spinner-icon.main\", this.el).addClass(\"hide\");\n\t\t$(\"button\", this.el).attr(\"disabled\", false);\n\t\tthis.ui.body.scrollTop(9999);\n\t},\n\n\tshowSubMessage: function showSubMessage(text, isWarning) {\n\t\tthis.ui.subMessage.text(text).removeClass(\"hide warning\");\n\t\tif (isWarning) this.ui.subMessage.addClass(\"warning\");\n\t}\n});\n\nmodule.exports = Modal;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNtYWxsTW9kYWwuanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwiJCIsIl8iLCJNb2RhbCIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiZXh0ZW5kIiwidGVtcGxhdGUiLCJjbGFzc05hbWUiLCJldmVudHMiLCJ1aSIsIm9rIiwiY2FuY2VsIiwic3ViTWVzc2FnZSIsInNwaW5uZXIiLCJhbm90aGVyIiwiYm9keSIsImVycm9yIiwiaW5pdGlhbGl6ZSIsIm9wdGlvbnMiLCJkZWZhdWx0Qm9keSIsImhvc3QiLCJtb2RlbCIsIk1vZGVsIiwidGl0bGUiLCJoYXNCb2R5IiwiQm9vbGVhbiIsImN1c3RvbU9LIiwiY3VzdG9tQ2FuY2VsIiwiYWRkQW5vdGhlciIsImN1c3RvbUJ1dHRvbnMiLCJoaWRlQnV0dG9ucyIsIndhcm5pbmciLCJlYWNoIiwiZ2V0IiwiYmluZEN1c3RvbUJ1dHRvbiIsImJpbmQiLCJ1bmRlbGVnYXRlRXZlbnRzIiwiZGVsZWdhdGVFdmVudHMiLCJidXR0b24iLCJpZCIsInRyaWdnZXJDdXN0b21CdXR0b24iLCJldnQiLCJ0cmlnZ2VyIiwiY3VycmVudFRhcmdldCIsImRhdGEiLCJoaWRlRXJyb3IiLCJhZGRDbGFzcyIsInNob3ciLCJhcHBlbmQiLCJyZW5kZXIiLCJlbCIsInNldEJvZHkiLCJuZXdCb2R5Iiwic2V0Iiwic2V0VGl0bGUiLCJzZXRPS1RleHQiLCJ0ZXh0IiwiaHRtbCIsInNldFBlcnNpc3RlbmNlIiwidmFsIiwicGVyc2lzdCIsImhpZGVCdXR0b24iLCJzdHIiLCJoYXMiLCJjb25jYXQiLCJzaG93QnV0dG9ucyIsInJlbW92ZUNsYXNzIiwiZW5hYmxlQnV0dG9ucyIsImF0dHIiLCJoaWRlU3Bpbm5lciIsIm9uUmVuZGVyIiwiY2xhc3NOYW1lcyIsIiRlbCIsImR1bmtlZCIsIm1hcCIsImNoaWxkcmVuIiwiaXRlbSIsImlzIiwiZ2V0UGF0aCIsIm9uRGVzdHJveSIsImxlbmd0aCIsInByb3AiLCJkZXN0cm95Iiwic2hvd0Vycm9yIiwic2Nyb2xsVG9wIiwic2hvd1N1Yk1lc3NhZ2UiLCJpc1dhcm5pbmciLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1FLElBQUlGLFFBQVEsUUFBUixDQUFWOztBQUVBLElBQU1HLFFBQVFKLFNBQVNLLFVBQVQsQ0FBb0JDLElBQXBCLENBQXlCQyxNQUF6QixDQUFnQztBQUM3Q0MsV0FBVVAsUUFBUSw2QkFBUixDQURtQzs7QUFHN0NRLFlBQVcsYUFIa0M7O0FBSzdDQyxTQUFRO0FBQ1AscUJBQW1CLElBRFo7QUFFUCx5QkFBdUIsUUFGaEI7QUFHUCxxQkFBbUI7QUFIWixFQUxxQzs7QUFXN0NDLEtBQUk7QUFDSEMsTUFBSSxXQUREO0FBRUhDLFVBQVEsZUFGTDtBQUdIQyxjQUFZLGtCQUhUO0FBSUhDLFdBQVMsb0JBSk47QUFLSEMsV0FBUyx1QkFMTjtBQU1IQyxRQUFNLGdCQU5IO0FBT0hDLFNBQU87QUFQSixFQVh5Qzs7QUFxQjdDQyxhQUFZLG9CQUFTQyxPQUFULEVBQWtCO0FBQzdCLE1BQU1DLGNBQWMsc0hBQXBCOztBQUVBLE9BQUtELE9BQUwsR0FBZUEsT0FBZjtBQUNBLE1BQUksS0FBS0EsT0FBTCxDQUFhWCxTQUFqQixFQUNDLEtBQUtBLFNBQUwsR0FBaUIsS0FBS1csT0FBTCxDQUFhWCxTQUE5Qjs7QUFFRCxPQUFLYSxJQUFMLEdBQVlGLFFBQVFFLElBQVIsSUFBZ0IsU0FBNUI7O0FBRUEsT0FBS0MsS0FBTCxHQUFhLElBQUl2QixTQUFTd0IsS0FBYixDQUFtQjtBQUMvQkMsVUFBT0wsUUFBUUssS0FEZ0I7QUFFL0JSLFNBQU1HLFFBQVFILElBQVIsSUFBZ0JJLFdBRlM7QUFHL0JLLFlBQVNDLFFBQVFQLFFBQVFILElBQWhCLENBSHNCO0FBSS9CVyxhQUFVUixRQUFRUSxRQUphO0FBSy9CQyxpQkFBY1QsUUFBUVMsWUFM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SUFBUixDQUFhcUUsU0FBbEIsRUFDQztBQUNEcEYsSUFBRSxjQUFGLEVBQWtCLEtBQUtrRCxFQUF2QixFQUEyQk0sSUFBM0IsQ0FBZ0NBLElBQWhDLEVBQXNDVSxXQUF0QyxDQUFrRCxNQUFsRDtBQUNBbEUsSUFBRSxvQkFBRixFQUF3QixLQUFLa0QsRUFBN0IsRUFBaUNKLFFBQWpDLENBQTBDLE1BQTFDO0FBQ0E5QyxJQUFFLFFBQUYsRUFBWSxLQUFLa0QsRUFBakIsRUFBcUJrQixJQUFyQixDQUEwQixVQUExQixFQUFzQyxLQUF0QztBQUNBLE9BQUszRCxFQUFMLENBQVFNLElBQVIsQ0FBYXFFLFNBQWIsQ0FBdUIsSUFBdkI7QUFDQSxFQTVLNEM7O0FBOEs3Q0MsaUJBQWdCLHdCQUFTN0IsSUFBVCxFQUFlOEIsU0FBZixFQUEwQjtBQUN6QyxPQUFLN0UsRUFBTCxDQUFRRyxVQUFSLENBQW1CNEMsSUFBbkIsQ0FBd0JBLElBQXhCLEVBQThCVSxXQUE5QixDQUEwQyxjQUExQztBQUNBLE1BQUlvQixTQUFKLEVBQ0MsS0FBSzdFLEVBQUwsQ0FBUUcsVUFBUixDQUFtQmtDLFFBQW5CLENBQTRCLFNBQTVCO0FBQ0Q7QUFsTDRDLENBQWhDLENBQWQ7O0FBcUxBeUMsT0FBT0MsT0FBUCxHQUFpQnRGLEtBQWpCIiwiZmlsZSI6InNtYWxsTW9kYWwuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcblxuY29uc3QgTW9kYWwgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9zbWFsbE1vZGFsLm51bmpcIiksXG5cblx0Y2xhc3NOYW1lOiBcInNtYWxsLW1vZGFsXCIsXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBidXR0b24ub2tcIjogXCJva1wiLFxuXHRcdFwiY2xpY2sgYnV0dG9uLmNhbmNlbFwiOiBcImNhbmNlbFwiLFxuXHRcdFwiY2xpY2sgQHVpLmVycm9yXCI6IFwiaGlkZUVycm9yXCIsXG5cdH0sXG5cblx0dWk6IHtcblx0XHRvazogXCJidXR0b24ub2tcIixcblx0XHRjYW5jZWw6IFwiYnV0dG9uLmNhbmNlbFwiLFxuXHRcdHN1Yk1lc3NhZ2U6IFwic3Bhbi5zdWItbWVzc2FnZVwiLFxuXHRcdHNwaW5uZXI6IFwiLnNwaW5uZXItaWNvbi5tYWluXCIsXG5cdFx0YW5vdGhlcjogXCJpbnB1dFtuYW1lPSdhbm90aGVyJ11cIixcblx0XHRib2R5OiBcImRpdi5tb2RhbC1ib2R5XCIsXG5cdFx0ZXJyb3I6IFwiZGl2Lm1vZGFsLWVycm9yXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdGNvbnN0IGRlZmF1bHRCb2R5ID0gXCI8ZGl2IHN0eWxlPSd3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogY2VudGVyJz48c3BhbiBjbGFzcz0nc3Bpbm5lciBzcGlubmVyLWljb24gc3Bpbm5lci1zbWFsbCBjZW50cmUnLz4gTG9hZGluZzwvZGl2PlwiO1xuXG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucztcblx0XHRpZiAodGhpcy5vcHRpb25zLmNsYXNzTmFtZSlcblx0XHRcdHRoaXMuY2xhc3NOYW1lID0gdGhpcy5vcHRpb25zLmNsYXNzTmFtZTtcblxuXHRcdHRoaXMuaG9zdCA9IG9wdGlvbnMuaG9zdCB8fCBcIiNtb2RhbHNcIjtcblxuXHRcdHRoaXMubW9kZWwgPSBuZXcgQmFja2JvbmUuTW9kZWwoe1xuXHRcdFx0dGl0bGU6IG9wdGlvbnMudGl0bGUsXG5cdFx0XHRib2R5OiBvcHRpb25zLmJvZHkgfHwgZGVmYXVsdEJvZHksXG5cdFx0XHRoYXNCb2R5OiBCb29sZWFuKG9wdGlvbnMuYm9keSksXG5cdFx0XHRjdXN0b21PSzogb3B0aW9ucy5jdXN0b21PSyxcblx0XHRcdGN1c3RvbUNhbmNlbDogb3B0aW9ucy5jdXN0b21DYW5jZWwsXG5cdFx0XHRhZGRBbm90aGVyOiBvcHRpb25zLmFkZEFub3RoZXIsXG5cdFx0XHRjdXN0b21CdXR0b25zOiBvcHRpb25zLmN1c3RvbUJ1dHRvbnMgfHwgW10sXG5cdFx0XHRoaWRlQnV0dG9uczogb3B0aW9ucy5oaWRlQnV0dG9ucyB8fCBbXSxcblx0XHRcdHdhcm5pbmc6IEJvb2xlYW4ob3B0aW9ucy53YXJuaW5nKSxcblx0XHR9KTtcblxuXHRcdF8uZWFjaCh0aGlzLm1vZGVsLmdldChcImN1c3RvbUJ1dHRvbnNcIiksIHRoaXMuYmluZEN1c3RvbUJ1dHRvbi5iaW5kKHRoaXMpKTtcblxuXHRcdHRoaXMudW5kZWxlZ2F0ZUV2ZW50cygpO1xuXHRcdHRoaXMuZGVsZWdhdGVFdmVudHMoKTtcblx0fSxcblxuXHRiaW5kQ3VzdG9tQnV0dG9uOiBmdW5jdGlvbihidXR0b24pIHtcblx0XHR0aGlzLmV2ZW50c1tcImNsaWNrIGJ1dHRvbi5cIiArIGJ1dHRvbi5pZF0gPSBcInRyaWdnZXJDdXN0b21CdXR0b25cIjtcblx0fSxcblxuXHR0cmlnZ2VyQ3VzdG9tQnV0dG9uOiBmdW5jdGlvbihldnQpIHtcblx0XHR0aGlzLnRyaWdnZXIoXCJidXR0b246XCIgKyAkKGV2dC5jdXJyZW50VGFyZ2V0KS5kYXRhKFwiaWRcIiksICQoZXZ0LmN1cnJlbnRUYXJnZXQpLmRhdGEoXCJpZFwiKSk7XG5cdH0sXG5cblx0aGlkZUVycm9yOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmVycm9yLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRzaG93OiBmdW5jdGlvbigpIHtcblx0XHQkKFwiLm1vZGFsLWNvbnRhaW5lclwiLCAkKHRoaXMuaG9zdCkpLmFwcGVuZCh0aGlzLnJlbmRlcigpLmVsKTtcblx0fSxcblxuXHRzZXRCb2R5OiBmdW5jdGlvbihuZXdCb2R5KSB7XG5cdFx0dGhpcy5tb2RlbC5zZXQoeyBib2R5OiBuZXdCb2R5LCBoYXNCb2R5OiB0cnVlIH0pO1xuXHRcdHRoaXMucmVuZGVyKCk7XG5cdH0sXG5cblx0c2V0VGl0bGU6IGZ1bmN0aW9uKHRpdGxlKSB7XG5cdFx0dGhpcy5tb2RlbC5zZXQoeyB0aXRsZTogdGl0bGUgfSk7XG5cdFx0dGhpcy5yZW5kZXIoKTtcblx0fSxcblxuXHRzZXRPS1RleHQ6IGZ1bmN0aW9uKHRleHQpIHtcblx0XHR0aGlzLm1vZGVsLnNldCh7IGN1c3RvbU9LOiB0ZXh0IH0pO1xuXHRcdHRoaXMudWkub2suaHRtbCh0ZXh0KTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRzZXRQZXJzaXN0ZW5jZTogZnVuY3Rpb24odmFsKSB7XG5cdFx0dGhpcy5vcHRpb25zLnBlcnNpc3QgPSB2YWw7XG5cdH0sXG5cblx0aGlkZUJ1dHRvbjogZnVuY3Rpb24oc3RyKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwuaGFzKFwiaGlkZUJ1dHRvbnNcIikpXG5cdFx0XHR0aGlzLm1vZGVsLnNldCh7IGhpZGVCdXR0b25zOiB0aGlzLm1vZGVsLmdldChcImhpZGVCdXR0b25zXCIpLmNvbmNhdChzdHIpIH0pO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMubW9kZWwuc2V0KHsgaGlkZUJ1dHRvbnM6IFtzdHJdIH0pO1xuXHR9LFxuXG5cdHNob3dCdXR0b25zOiBmdW5jdGlvbigpIHtcblx0XHQkKFwiYnV0dG9uXCIsIHRoaXMuZWwpLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRlbmFibGVCdXR0b25zOiBmdW5jdGlvbigpIHtcblx0XHQkKFwiYnV0dG9uXCIsIHRoaXMuZWwpLmF0dHIoXCJkaXNhYmxlZFwiLCBmYWxzZSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0aGlkZVNwaW5uZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkuc3Bpbm5lci5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIFJlbmRlciBhIGJhY2tncm91bmRcblx0XHQkKFwiLm1vZGFsLWVsZW1lbnRcIiwgJCh0aGlzLmhvc3QpKS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0JChcImJvZHlcIikuYWRkQ2xhc3MoXCJoaWRlLW92ZXJmbG93XCIpO1xuXG5cdFx0aWYgKHRoaXMub3B0aW9ucy5jbGFzc05hbWVzKVxuXHRcdFx0dGhpcy4kZWwuYWRkQ2xhc3ModGhpcy5vcHRpb25zLmNsYXNzTmFtZXMpO1xuXG5cdFx0Ly8gSWYgdGhlcmUncyBhbnkgb3RoZXIgbW9kYWxzIHZpc2libGUgcmlnaHQgbm93LCBoaWRlIHRoZW0sIGFuZCByZXN0b3JlIGl0IGFmdGVyXG5cdFx0dGhpcy5kdW5rZWQgPSAkLm1hcCgkKFwiLm1vZGFsLWNvbnRhaW5lclwiLCAkKHRoaXMuaG9zdCkpLmNoaWxkcmVuKCksIGl0ZW0gPT4ge1xuXHRcdFx0aWYgKCQoaXRlbSkuaXModGhpcy4kZWwpKVxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHQkKGl0ZW0pLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHJldHVybiAkKGl0ZW0pLmdldFBhdGgoKTtcblx0XHR9KTtcblxuXHRcdHRoaXMudHJpZ2dlcihcInJlbmRlcmVkXCIsIHRoaXMpO1xuXHR9LFxuXG5cdG9uRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gQ2xlYW4gdXAgdGhlIGJhY2tncm91bmRcblx0XHRpZiAodGhpcy5kdW5rZWQgJiYgdGhpcy5kdW5rZWQubGVuZ3RoID09PSAwKSB7XG5cdFx0XHQkKFwiLm1vZGFsLWVsZW1lbnRcIiwgJCh0aGlzLmhvc3QpKS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHQkKFwiYm9keVwiKS5yZW1vdmVDbGFzcyhcImhpZGUtb3ZlcmZsb3dcIik7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuZHVua2VkKSB7XG5cdFx0XHRfLmVhY2godGhpcy5kdW5rZWQsIGl0ZW0gPT4ge1xuXHRcdFx0XHRpZiAoIWl0ZW0pXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRjb25zdCBlbCA9ICQoaXRlbSk7XG5cdFx0XHRcdGlmIChlbCAmJiBlbC5sZW5ndGgpXG5cdFx0XHRcdFx0ZWwucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdG9rOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLnN1Yk1lc3NhZ2UuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0Y29uc3QgYW5vdGhlciA9IHRoaXMudWkuYW5vdGhlci5wcm9wKFwiY2hlY2tlZFwiKTtcblxuXHRcdGlmICh0aGlzLm9wdGlvbnMucGVyc2lzdCkge1xuXHRcdFx0dGhpcy51aS5zcGlubmVyLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRcdCQoXCJidXR0b25cIiwgdGhpcy5lbCkuYXR0cihcImRpc2FibGVkXCIsIHRydWUpO1xuXG5cdFx0XHR0aGlzLnRyaWdnZXIoXCJidXR0b246b2tcIiwgdGhpcywgeyBhbm90aGVyOiBhbm90aGVyIH0pO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMuZGVzdHJveSgpO1xuXHRcdFx0dGhpcy50cmlnZ2VyKFwiYnV0dG9uOm9rXCIsIHRoaXMsIHsgYW5vdGhlcjogYW5vdGhlciB9KTtcblx0XHR9XG5cdH0sXG5cblx0Y2FuY2VsOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmRlc3Ryb3koKTtcblx0XHR0aGlzLnRyaWdnZXIoXCJidXR0b246Y2FuY2VsXCIsIHRoaXMpO1xuXHR9LFxuXG5cdHNob3dFcnJvcjogZnVuY3Rpb24odGV4dCkge1xuXHRcdGlmICghdGhpcy51aS5ib2R5LnNjcm9sbFRvcClcblx0XHRcdHJldHVybjtcblx0XHQkKFwiLm1vZGFsLWVycm9yXCIsIHRoaXMuZWwpLnRleHQodGV4dCkucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdCQoXCIuc3Bpbm5lci1pY29uLm1haW5cIiwgdGhpcy5lbCkuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdCQoXCJidXR0b25cIiwgdGhpcy5lbCkuYXR0cihcImRpc2FibGVkXCIsIGZhbHNlKTtcblx0XHR0aGlzLnVpLmJvZHkuc2Nyb2xsVG9wKDk5OTkpO1xuXHR9LFxuXG5cdHNob3dTdWJNZXNzYWdlOiBmdW5jdGlvbih0ZXh0LCBpc1dhcm5pbmcpIHtcblx0XHR0aGlzLnVpLnN1Yk1lc3NhZ2UudGV4dCh0ZXh0KS5yZW1vdmVDbGFzcyhcImhpZGUgd2FybmluZ1wiKTtcblx0XHRpZiAoaXNXYXJuaW5nKVxuXHRcdFx0dGhpcy51aS5zdWJNZXNzYWdlLmFkZENsYXNzKFwid2FybmluZ1wiKTtcblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1vZGFsOyJdfQ==",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"status-view\",\n\n\tgetTemplate: function getTemplate() {\n\t\tvar result = null;\n\n\t\tswitch (this.options.type) {\n\t\t\tcase \"busy\":\n\t\t\tcase \"loading\":\n\t\t\t\tresult = require(\"./templates/statusView.nunj\").loading;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tresult = require(\"./templates/statusView.nunj\").blank;\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn result;\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tmessage: this.options.message === undefined ? \"Please stand by...\" : this.options.message\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\t},\n\n\tshow: function show() {\n\t\tthis.host = this.options.host || \"#modals\";\n\t\tthis.isModal = true;\n\n\t\t$(\".modal-container\", $(this.host)).append(this.render().$el);\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this = this;\n\n\t\tif (this.isModal) {\n\t\t\tthis.$el.addClass(\"status-view-modal\");\n\t\t\tthis.$el.removeClass(\"status-view\");\n\n\t\t\t$(\".modal-element\", $(this.host)).removeClass(\"hide\");\n\t\t\t$(\"body\").addClass(\"hide-overflow\");\n\n\t\t\t// If there are any other modals visible right now, hide them, and restore them after\n\t\t\tthis.dunked = $.map($(\".modal-container\", $(this.host)).children(), function (item) {\n\t\t\t\tif ($(item).is(_this.$el)) return;\n\n\t\t\t\t$(item).addClass(\"hide\");\n\t\t\t\treturn $(item).getPath();\n\t\t\t});\n\t\t}\n\t},\n\n\tonDestroy: function onDestroy() {\n\t\tif (this.isModal) {\n\t\t\t// Clean up the background\n\t\t\tif (this.dunked && this.dunked.length === 0) {\n\t\t\t\t$(\".modal-element\", $(this.host)).addClass(\"hide\");\n\t\t\t\t$(\"body\").removeClass(\"hide-overflow\");\n\t\t\t}\n\n\t\t\tif (this.dunked) {\n\t\t\t\t_.each(this.dunked, function (item) {\n\t\t\t\t\tif (!item) return;\n\n\t\t\t\t\tvar el = $(item);\n\n\t\t\t\t\tif (el && el.length) el.removeClass(\"hide\");\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN0YXR1c1ZpZXcuanMiXSwibmFtZXMiOlsiJCIsInJlcXVpcmUiLCJfIiwiQmFja2JvbmUiLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJleHRlbmQiLCJjbGFzc05hbWUiLCJnZXRUZW1wbGF0ZSIsInJlc3VsdCIsIm9wdGlvbnMiLCJ0eXBlIiwibG9hZGluZyIsImJsYW5rIiwidGVtcGxhdGVDb250ZXh0IiwibWVzc2FnZSIsInVuZGVmaW5lZCIsImluaXRpYWxpemUiLCJzaG93IiwiaG9zdCIsImlzTW9kYWwiLCJhcHBlbmQiLCJyZW5kZXIiLCIkZWwiLCJvblJlbmRlciIsImFkZENsYXNzIiwicmVtb3ZlQ2xhc3MiLCJkdW5rZWQiLCJtYXAiLCJjaGlsZHJlbiIsIml0ZW0iLCJpcyIsImdldFBhdGgiLCJvbkRlc3Ryb3kiLCJsZW5ndGgiLCJlYWNoIiwiZWwiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsSUFBSUQsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNRSxXQUFXRixRQUFRLFVBQVIsQ0FBakI7O0FBRUFHLE9BQU9DLE9BQVAsR0FBaUJGLFNBQVNHLFVBQVQsQ0FBb0JDLElBQXBCLENBQXlCQyxNQUF6QixDQUFnQztBQUNoREMsWUFBVyxhQURxQzs7QUFHaERDLGNBQWEsdUJBQVc7QUFDdkIsTUFBSUMsU0FBUyxJQUFiOztBQUVBLFVBQVEsS0FBS0MsT0FBTCxDQUFhQyxJQUFyQjtBQUNDLFFBQUssTUFBTDtBQUNBLFFBQUssU0FBTDtBQUNDRixhQUFTVixRQUFRLDZCQUFSLEVBQXVDYSxPQUFoRDtBQUNBOztBQUVEO0FBQ0NILGFBQVNWLFFBQVEsNkJBQVIsRUFBdUNjLEtBQWhEO0FBQ0E7QUFSRjs7QUFXQSxTQUFPSixNQUFQO0FBQ0EsRUFsQitDOztBQW9CaERLLGtCQUFpQiwyQkFBVztBQUMzQixTQUFPO0FBQ05DLFlBQVMsS0FBS0wsT0FBTCxDQUFhSyxPQUFiLEtBQXlCQyxTQUF6QixHQUFxQyxvQkFBckMsR0FBNEQsS0FBS04sT0FBTCxDQUFhSztBQUQ1RSxHQUFQO0FBR0EsRUF4QitDOztBQTBCaERFLGFBQVksb0JBQVNQLE9BQVQsRUFBa0I7QUFDN0IsT0FBS0EsT0FBTCxHQUFlQSxPQUFmO0FBQ0EsRUE1QitDOztBQThCaERRLE9BQU0sZ0JBQVc7QUFDaEIsT0FBS0MsSUFBTCxHQUFZLEtBQUtULE9BQUwsQ0FBYVMsSUFBYixJQUFxQixTQUFqQztBQUNBLE9BQUtDLE9BQUwsR0FBZSxJQUFmOztBQUVBdEIsSUFBRSxrQkFBRixFQUFzQkEsRUFBRSxLQUFLcUIsSUFBUCxDQUF0QixFQUFvQ0UsTUFBcEMsQ0FBMkMsS0FBS0MsTUFBTCxHQUFjQyxHQUF6RDtBQUNBLEVBbkMrQzs7QUFxQ2hEQyxXQUFVLG9CQUFXO0FBQUE7O0FBQ3BCLE1BQUksS0FBS0osT0FBVCxFQUFrQjtBQUNqQixRQUFLRyxHQUFMLENBQVNFLFFBQVQsQ0FBa0IsbUJBQWxCO0FBQ0EsUUFBS0YsR0FBTCxDQUFTRyxXQUFULENBQXFCLGFBQXJCOztBQUVBNUIsS0FBRSxnQkFBRixFQUFvQkEsRUFBRSxLQUFLcUIsSUFBUCxDQUFwQixFQUFrQ08sV0FBbEMsQ0FBOEMsTUFBOUM7QUFDQTVCLEtBQUUsTUFBRixFQUFVMkIsUUFBVixDQUFtQixlQUFuQjs7QUFFQTtBQUNBLFFBQUtFLE1BQUwsR0FBYzdCLEVBQUU4QixHQUFGLENBQU05QixFQUFFLGtCQUFGLEVBQXNCQSxFQUFFLEtBQUtxQixJQUFQLENBQXRCLEVBQW9DVSxRQUFwQyxFQUFOLEVBQXNELGdCQUFRO0FBQzNFLFFBQUkvQixFQUFFZ0MsSUFBRixFQUFRQyxFQUFSLENBQVcsTUFBS1IsR0FBaEIsQ0FBSixFQUNDOztBQUVEekIsTUFBRWdDLElBQUYsRUFBUUwsUUFBUixDQUFpQixNQUFqQjtBQUNBLFdBQU8zQixFQUFFZ0MsSUFBRixFQUFRRSxPQUFSLEVBQVA7QUFDQSxJQU5hLENBQWQ7QUFPQTtBQUNELEVBdEQrQzs7QUF3RGhEQyxZQUFXLHFCQUFXO0FBQ3JCLE1BQUksS0FBS2IsT0FBVCxFQUFrQjtBQUNqQjtBQUNBLE9BQUksS0FBS08sTUFBTCxJQUFlLEtBQUtBLE1BQUwsQ0FBWU8sTUFBWixLQUF1QixDQUExQyxFQUE2QztBQUM1Q3BDLE1BQUUsZ0JBQUYsRUFBb0JBLEVBQUUsS0FBS3FCLElBQVAsQ0FBcEIsRUFBa0NNLFFBQWxDLENBQTJDLE1BQTNDO0FBQ0EzQixNQUFFLE1BQUYsRUFBVTRCLFdBQVYsQ0FBc0IsZUFBdEI7QUFDQTs7QUFFRCxPQUFJLEtBQUtDLE1BQVQsRUFBaUI7QUFDaEIzQixNQUFFbUMsSUFBRixDQUFPLEtBQUtSLE1BQVosRUFBb0IsZ0JBQVE7QUFDM0IsU0FBSSxDQUFDRyxJQUFMLEVBQ0M7O0FBRUQsU0FBTU0sS0FBS3RDLEVBQUVnQyxJQUFGLENBQVg7O0FBRUEsU0FBSU0sTUFBTUEsR0FBR0YsTUFBYixFQUNDRSxHQUFHVixXQUFILENBQWUsTUFBZjtBQUNELEtBUkQ7QUFTQTtBQUNEO0FBQ0Q7QUE1RStDLENBQWhDLENBQWpCIiwiZmlsZSI6InN0YXR1c1ZpZXcuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInN0YXR1cy12aWV3XCIsXG5cblx0Z2V0VGVtcGxhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdGxldCByZXN1bHQgPSBudWxsO1xuXG5cdFx0c3dpdGNoICh0aGlzLm9wdGlvbnMudHlwZSkge1xuXHRcdFx0Y2FzZSBcImJ1c3lcIjpcblx0XHRcdGNhc2UgXCJsb2FkaW5nXCI6XG5cdFx0XHRcdHJlc3VsdCA9IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9zdGF0dXNWaWV3Lm51bmpcIikubG9hZGluZztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJlc3VsdCA9IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9zdGF0dXNWaWV3Lm51bmpcIikuYmxhbms7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG5cblx0dGVtcGxhdGVDb250ZXh0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bWVzc2FnZTogdGhpcy5vcHRpb25zLm1lc3NhZ2UgPT09IHVuZGVmaW5lZCA/IFwiUGxlYXNlIHN0YW5kIGJ5Li4uXCIgOiB0aGlzLm9wdGlvbnMubWVzc2FnZSxcblx0XHR9O1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXHR9LFxuXG5cdHNob3c6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuaG9zdCA9IHRoaXMub3B0aW9ucy5ob3N0IHx8IFwiI21vZGFsc1wiO1xuXHRcdHRoaXMuaXNNb2RhbCA9IHRydWU7XG5cblx0XHQkKFwiLm1vZGFsLWNvbnRhaW5lclwiLCAkKHRoaXMuaG9zdCkpLmFwcGVuZCh0aGlzLnJlbmRlcigpLiRlbCk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLmlzTW9kYWwpIHtcblx0XHRcdHRoaXMuJGVsLmFkZENsYXNzKFwic3RhdHVzLXZpZXctbW9kYWxcIik7XG5cdFx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyhcInN0YXR1cy12aWV3XCIpO1xuXG5cdFx0XHQkKFwiLm1vZGFsLWVsZW1lbnRcIiwgJCh0aGlzLmhvc3QpKS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHQkKFwiYm9keVwiKS5hZGRDbGFzcyhcImhpZGUtb3ZlcmZsb3dcIik7XG5cblx0XHRcdC8vIElmIHRoZXJlIGFyZSBhbnkgb3RoZXIgbW9kYWxzIHZpc2libGUgcmlnaHQgbm93LCBoaWRlIHRoZW0sIGFuZCByZXN0b3JlIHRoZW0gYWZ0ZXJcblx0XHRcdHRoaXMuZHVua2VkID0gJC5tYXAoJChcIi5tb2RhbC1jb250YWluZXJcIiwgJCh0aGlzLmhvc3QpKS5jaGlsZHJlbigpLCBpdGVtID0+IHtcblx0XHRcdFx0aWYgKCQoaXRlbSkuaXModGhpcy4kZWwpKVxuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHQkKGl0ZW0pLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdFx0cmV0dXJuICQoaXRlbSkuZ2V0UGF0aCgpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdG9uRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuaXNNb2RhbCkge1xuXHRcdFx0Ly8gQ2xlYW4gdXAgdGhlIGJhY2tncm91bmRcblx0XHRcdGlmICh0aGlzLmR1bmtlZCAmJiB0aGlzLmR1bmtlZC5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0JChcIi5tb2RhbC1lbGVtZW50XCIsICQodGhpcy5ob3N0KSkuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0XHQkKFwiYm9keVwiKS5yZW1vdmVDbGFzcyhcImhpZGUtb3ZlcmZsb3dcIik7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmR1bmtlZCkge1xuXHRcdFx0XHRfLmVhY2godGhpcy5kdW5rZWQsIGl0ZW0gPT4ge1xuXHRcdFx0XHRcdGlmICghaXRlbSlcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdGNvbnN0IGVsID0gJChpdGVtKTtcblxuXHRcdFx0XHRcdGlmIChlbCAmJiBlbC5sZW5ndGgpXG5cdFx0XHRcdFx0XHRlbC5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcbn0pO1xuIl19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"switch-layout\",\n\n\ttemplate: require(\"./templates/switch.nunj\"),\n\n\tui: {\n\t\tlabel: \".switch-label\",\n\t\tlabelContainer: \".switch-label-container\",\n\t\tselector: \".switch-selector\"\n\t},\n\n\tevents: {\n\t\tclick: \"onClick\",\n\t\t\"transitionend @ui.selector\": \"onTransitionEnd\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\n\t\tif (this.options.eventChannel && this.options.eventPrefix) {\n\t\t\tthis.listenTo(Backbone.Radio.channel(this.options.eventChannel), this.options.eventPrefix + \":change:off\", this.turnOff.bind(this));\n\t\t\tthis.listenTo(Backbone.Radio.channel(this.options.eventChannel), this.options.eventPrefix + \":change:on\", this.turnOn.bind(this));\n\t\t}\n\t},\n\n\tonRender: function onRender() {\n\t\tif (this.options.on) {\n\t\t\tthis.turnOn();\n\t\t\tthis.setOnState();\n\t\t} else {\n\t\t\tthis.turnOff();\n\t\t\tthis.setOffState();\n\t\t}\n\n\t\tthis.showLabel();\n\t},\n\n\tonClick: function onClick() {\n\t\tif (this.isOn()) this.turnOff();else this.turnOn();\n\t},\n\n\tonTransitionEnd: function onTransitionEnd() {\n\t\tvar state = void 0;\n\n\t\tif (this.ui.labelContainer.hasClass(\"on\")) {\n\t\t\tthis.setOffState();\n\t\t\tstate = \"off\";\n\t\t} else {\n\t\t\tthis.setOnState();\n\t\t\tstate = \"on\";\n\t\t}\n\n\t\tthis.showLabel();\n\n\t\tif (this.options.eventChannel) Backbone.Radio.channel(this.options.eventChannel).trigger((this.options.eventPrefix || \"switch\") + \":changed:\" + state);\n\t},\n\n\thideLabel: function hideLabel() {\n\t\tthis.ui.label.addClass(\"hide\");\n\t\tthis.ui.label.addClass(\"fade\");\n\t},\n\n\tshowLabel: function showLabel() {\n\t\tthis.ui.label.removeClass(\"hide\");\n\t\tthis.ui.label.removeClass(\"fade\");\n\t},\n\n\tisOn: function isOn() {\n\t\treturn this.ui.selector.hasClass(\"on\");\n\t},\n\n\tshowOffLabel: function showOffLabel() {\n\t\tthis.ui.label.text(this.options.offLabel);\n\t},\n\n\tshowOnLabel: function showOnLabel() {\n\t\tthis.ui.label.text(this.options.onLabel);\n\t},\n\n\tsetOffState: function setOffState() {\n\t\tthis.ui.labelContainer.removeClass(\"on\");\n\t\tthis.showOffLabel();\n\t},\n\n\tsetOnState: function setOnState() {\n\t\tthis.ui.labelContainer.addClass(\"on\");\n\t\tthis.showOnLabel();\n\t},\n\n\tturnOff: function turnOff() {\n\t\tthis.hideLabel();\n\t\tthis.ui.selector.removeClass(\"on\");\n\t},\n\n\tturnOn: function turnOn() {\n\t\tthis.hideLabel();\n\t\tthis.ui.selector.addClass(\"on\");\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInN3aXRjaC5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJleHRlbmQiLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsInVpIiwibGFiZWwiLCJsYWJlbENvbnRhaW5lciIsInNlbGVjdG9yIiwiZXZlbnRzIiwiY2xpY2siLCJpbml0aWFsaXplIiwib3B0aW9ucyIsImV2ZW50Q2hhbm5lbCIsImV2ZW50UHJlZml4IiwibGlzdGVuVG8iLCJSYWRpbyIsImNoYW5uZWwiLCJ0dXJuT2ZmIiwiYmluZCIsInR1cm5PbiIsIm9uUmVuZGVyIiwib24iLCJzZXRPblN0YXRlIiwic2V0T2ZmU3RhdGUiLCJzaG93TGFiZWwiLCJvbkNsaWNrIiwiaXNPbiIsIm9uVHJhbnNpdGlvbkVuZCIsInN0YXRlIiwiaGFzQ2xhc3MiLCJ0cmlnZ2VyIiwiaGlkZUxhYmVsIiwiYWRkQ2xhc3MiLCJyZW1vdmVDbGFzcyIsInNob3dPZmZMYWJlbCIsInRleHQiLCJvZmZMYWJlbCIsInNob3dPbkxhYmVsIiwib25MYWJlbCJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCOztBQUVBQyxPQUFPQyxPQUFQLEdBQWlCSCxTQUFTSSxVQUFULENBQW9CQyxJQUFwQixDQUF5QkMsTUFBekIsQ0FBZ0M7QUFDaERDLFlBQVcsZUFEcUM7O0FBR2hEQyxXQUFVUCxRQUFRLHlCQUFSLENBSHNDOztBQUtoRFEsS0FBSTtBQUNIQyxTQUFPLGVBREo7QUFFSEMsa0JBQWdCLHlCQUZiO0FBR0hDLFlBQVU7QUFIUCxFQUw0Qzs7QUFXaERDLFNBQVE7QUFDUEMsU0FBTyxTQURBO0FBRVAsZ0NBQThCO0FBRnZCLEVBWHdDOztBQWdCaERDLGFBQVksb0JBQVNDLE9BQVQsRUFBa0I7QUFDN0IsT0FBS0EsT0FBTCxHQUFlQSxPQUFmOztBQUVBLE1BQUksS0FBS0EsT0FBTCxDQUFhQyxZQUFi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dkIsQ0FBZ0MsSUFBaEM7QUFDQSxPQUFLSyxXQUFMO0FBQ0EsRUE3RitDOztBQStGaERwQixVQUFTLG1CQUFXO0FBQ25CLE9BQUtjLFNBQUw7QUFDQSxPQUFLM0IsRUFBTCxDQUFRRyxRQUFSLENBQWlCMEIsV0FBakIsQ0FBNkIsSUFBN0I7QUFDQSxFQWxHK0M7O0FBb0doRGQsU0FBUSxrQkFBVztBQUNsQixPQUFLWSxTQUFMO0FBQ0EsT0FBSzNCLEVBQUwsQ0FBUUcsUUFBUixDQUFpQnlCLFFBQWpCLENBQTBCLElBQTFCO0FBQ0E7QUF2RytDLENBQWhDLENBQWpCIiwiZmlsZSI6InN3aXRjaC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJzd2l0Y2gtbGF5b3V0XCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuL3RlbXBsYXRlcy9zd2l0Y2gubnVualwiKSxcblxuXHR1aToge1xuXHRcdGxhYmVsOiBcIi5zd2l0Y2gtbGFiZWxcIixcblx0XHRsYWJlbENvbnRhaW5lcjogXCIuc3dpdGNoLWxhYmVsLWNvbnRhaW5lclwiLFxuXHRcdHNlbGVjdG9yOiBcIi5zd2l0Y2gtc2VsZWN0b3JcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRjbGljazogXCJvbkNsaWNrXCIsXG5cdFx0XCJ0cmFuc2l0aW9uZW5kIEB1aS5zZWxlY3RvclwiOiBcIm9uVHJhbnNpdGlvbkVuZFwiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG5cdFx0aWYgKHRoaXMub3B0aW9ucy5ldmVudENoYW5uZWwgJiYgdGhpcy5vcHRpb25zLmV2ZW50UHJlZml4KSB7XG5cdFx0XHR0aGlzLmxpc3RlblRvKEJhY2tib25lLlJhZGlvLmNoYW5uZWwodGhpcy5vcHRpb25zLmV2ZW50Q2hhbm5lbCksIHRoaXMub3B0aW9ucy5ldmVudFByZWZpeCArIFwiOmNoYW5nZTpvZmZcIiwgdGhpcy50dXJuT2ZmLmJpbmQodGhpcykpO1xuXHRcdFx0dGhpcy5saXN0ZW5UbyhCYWNrYm9uZS5SYWRpby5jaGFubmVsKHRoaXMub3B0aW9ucy5ldmVudENoYW5uZWwpLCB0aGlzLm9wdGlvbnMuZXZlbnRQcmVmaXggKyBcIjpjaGFuZ2U6b25cIiwgdGhpcy50dXJuT24uYmluZCh0aGlzKSk7XG5cdFx0fVxuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5vcHRpb25zLm9uKSB7XG5cdFx0XHR0aGlzLnR1cm5PbigpO1xuXHRcdFx0dGhpcy5zZXRPblN0YXRlKCk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy50dXJuT2ZmKCk7XG5cdFx0XHR0aGlzLnNldE9mZlN0YXRlKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5zaG93TGFiZWwoKTtcblx0fSxcblxuXHRvbkNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5pc09uKCkpXG5cdFx0XHR0aGlzLnR1cm5PZmYoKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnR1cm5PbigpO1xuXHR9LFxuXG5cdG9uVHJhbnNpdGlvbkVuZDogZnVuY3Rpb24oKSB7XG5cdFx0bGV0IHN0YXRlO1xuXG5cdFx0aWYgKHRoaXMudWkubGFiZWxDb250YWluZXIuaGFzQ2xhc3MoXCJvblwiKSkge1xuXHRcdFx0dGhpcy5zZXRPZmZTdGF0ZSgpO1xuXHRcdFx0c3RhdGUgPSBcIm9mZlwiO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMuc2V0T25TdGF0ZSgpO1xuXHRcdFx0c3RhdGUgPSBcIm9uXCI7XG5cdFx0fVxuXG5cdFx0dGhpcy5zaG93TGFiZWwoKTtcblxuXHRcdGlmICh0aGlzLm9wdGlvbnMuZXZlbnRDaGFubmVsKVxuXHRcdFx0QmFja2JvbmUuUmFkaW8uY2hhbm5lbCh0aGlzLm9wdGlvbnMuZXZlbnRDaGFubmVsKS50cmlnZ2VyKCh0aGlzLm9wdGlvbnMuZXZlbnRQcmVmaXggfHwgXCJzd2l0Y2hcIikgKyBcIjpjaGFuZ2VkOlwiICsgc3RhdGUpO1xuXHR9LFxuXG5cdGhpZGVMYWJlbDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5sYWJlbC5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5sYWJlbC5hZGRDbGFzcyhcImZhZGVcIik7XG5cdH0sXG5cblx0c2hvd0xhYmVsOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLmxhYmVsLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLmxhYmVsLnJlbW92ZUNsYXNzKFwiZmFkZVwiKTtcblx0fSxcblxuXHRpc09uOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy51aS5zZWxlY3Rvci5oYXNDbGFzcyhcIm9uXCIpO1xuXHR9LFxuXG5cdHNob3dPZmZMYWJlbDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5sYWJlbC50ZXh0KHRoaXMub3B0aW9ucy5vZmZMYWJlbCk7XG5cdH0sXG5cblx0c2hvd09uTGFiZWw6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkubGFiZWwudGV4dCh0aGlzLm9wdGlvbnMub25MYWJlbCk7XG5cdH0sXG5cblx0c2V0T2ZmU3RhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkubGFiZWxDb250YWluZXIucmVtb3ZlQ2xhc3MoXCJvblwiKTtcblx0XHR0aGlzLnNob3dPZmZMYWJlbCgpO1xuXHR9LFxuXG5cdHNldE9uU3RhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkubGFiZWxDb250YWluZXIuYWRkQ2xhc3MoXCJvblwiKTtcblx0XHR0aGlzLnNob3dPbkxhYmVsKCk7XG5cdH0sXG5cblx0dHVybk9mZjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5oaWRlTGFiZWwoKTtcblx0XHR0aGlzLnVpLnNlbGVjdG9yLnJlbW92ZUNsYXNzKFwib25cIik7XG5cdH0sXG5cblx0dHVybk9uOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmhpZGVMYWJlbCgpO1xuXHRcdHRoaXMudWkuc2VsZWN0b3IuYWRkQ2xhc3MoXCJvblwiKTtcblx0fSxcbn0pO1xuIl19",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar section_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"accord-head\\\">\\n\\t\\t<span class=\\\"fal \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"icon\"), env.opts.autoescape);\noutput += \"\\\"></span>\\n\\t\\t<span class=\\\"text\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"title\"), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t<span class=\\\"count\\\">0</span>\\n\\t</div>\\n\\t<div class=\\\"accord-wrapper\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar section_oldRoot = section_obj.root;\nsection_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tsection_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar block_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"title\"), env.opts.autoescape);\noutput += \"\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar block_oldRoot = block_obj.root;\nblock_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tblock_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"section\": new nunjucks.Template( {obj: section_obj, type: \"code\"}, env),\t\"block\": new nunjucks.Template( {obj: block_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar button_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t\";\nif(!runtime.contextOrFrameLookup(context, frame, \"separator\")) {\noutput += \"\\n\\t\\t<span class=\\\"fal \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"glyph\"), env.opts.autoescape);\noutput += \" glyph\\\" />\";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"label\")?\"&nbsp;\":\"\"), env.opts.autoescape);\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"label\")?runtime.contextOrFrameLookup(context, frame, \"label\"):\"\"), env.opts.autoescape);\noutput += \"\\n\\t\\t<div class=\\\"spinner hide\\\">\\n\\t\\t\\t<span class=\\\"fal fa-cog fa-spin\\\" />\\n\\t\\t</div>\\n\\t\";\n;\n}\noutput += \"\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar button_oldRoot = button_obj.root;\nbutton_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tbutton_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"button\": new nunjucks.Template( {obj: button_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"action-title-region left\\\">\\n</div>\\n\\n<div class=\\\"action-toolbar-region right\\\">\\n</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<span class=\\\"action-title-glyph fal \";\noutput += runtime.suppressValue((lineno = 0, colno = 42, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"glyph\"), \"glyph\", context, [])), env.opts.autoescape);\noutput += \"\\\"/><span class=\\\"action-title-text\\\">&nbsp;\";\noutput += runtime.suppressValue((lineno = 0, colno = 92, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"title\"), \"title\", context, [])), env.opts.autoescape);\noutput += \"</span>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar content_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"modal-title\\\">\\n\\t\\t<span class=\\\"fal fa-cloud-upload\\\"/> Import Assessment</span>\\n\\t</div>\\n\\n\\t<div class=\\\"modal-body\\\">\\n\\t\\t<div class=\\\"row form-container\\\">\\n\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t<div class=\\\"import-form\\\">\\n\\t\\t\\t\\t\\t<label>Select the file that contains the assessment to import:\\n\\t\\t\\t\\t\\t\\t<input type=\\\"file\\\" id=\\\"assessment-file\\\" accept=\\\".gz\\\">\\n\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div class=\\\"import-result hide\\\">\\n\\t\\t\\t\\t  <span class=\\\"import-result-message\\\">Import complete.</span>\\n\\n\\t\\t\\t\\t\\t<span>The following assessment was added:</span>\\n\\n\\t\\t\\t\\t\\t<table class=\\\"assessment-metadata\\\">\\n\\t\\t\\t\\t\\t\\t<tr>\\n\\t\\t\\t\\t\\t\\t\\t<td class=\\\"assessment-metadata-label\\\">Title:</td>\\n\\t\\t\\t\\t\\t\\t\\t<td class=\\\"assessment-metadata-value assessment-metadata-title\\\"></td>\\n\\t\\t\\t\\t\\t\\t</tr>\\n\\t\\t\\t\\t\\t\\t<tr>\\n\\t\\t\\t\\t\\t\\t\\t<td class=\\\"assessment-metadata-label\\\">Language:</td>\\n\\t\\t\\t\\t\\t\\t\\t<td class=\\\"assessment-metadata-value assessment-metadata-language\\\"></td>\\n\\t\\t\\t\\t\\t\\t</tr>\\n\\t\\t\\t\\t\\t\\t<tr>\\n\\t\\t\\t\\t\\t\\t\\t<td class=\\\"assessment-metadata-label\\\">Subject:</td>\\n\\t\\t\\t\\t\\t\\t\\t<td class=\\\"assessment-metadata-value assessment-metadata-subject\\\"></td>\\n\\t\\t\\t\\t\\t\\t</tr>\\n\\t\\t\\t\\t\\t\\t<tr>\\n\\t\\t\\t\\t\\t\\t\\t<td class=\\\"assessment-metadata-label\\\">Grade:</td>\\n\\t\\t\\t\\t\\t\\t\\t<td class=\\\"assessment-metadata-value assessment-metadata-grade\\\"></td>\\n\\t\\t\\t\\t\\t\\t</tr>\\n\\t\\t\\t\\t\\t</table>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"modal-footer left\\\">\\n\\t\\t<button type=\\\"button\\\" class=\\\"button success import\\\">Import</button>&nbsp;&nbsp;&nbsp;&nbsp;\\n\\t\\t<button type=\\\"button\\\" class=\\\"button secondary cancel\\\">Cancel</button>&nbsp;&nbsp;&nbsp;&nbsp;\\n\\t\\t<button type=\\\"button\\\" class=\\\"button secondary close hide\\\">Close</button>&nbsp;&nbsp;&nbsp;&nbsp;\\n\\n\\t\\t<span class=\\\"spinner-icon spinner-small spinner-working hide\\\"/>\\n\\t\\t<span class=\\\"message hide\\\"></span>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar content_oldRoot = content_obj.root;\ncontent_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcontent_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"content\": new nunjucks.Template( {obj: content_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar content_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\n\\t<div class=\\\"assessment-basis assessment-basis-simple\\\">\\n\\t\\t<div class=\\\"assessment-basis-panel metadata-panel\\\">\\n\\t\\t\\t<p class=\\\"section-title\\\"><span>Metadata</span></p>\\n\\n\\t\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t\\t<span class=\\\"title-label\\\">Title</span>\\n\\t\\t\\t\\t\\t\\t<input type=\\\"text\\\" name=\\\"title\\\" placeholder=\\\"A title to identify this assessment in Educator Console\\\" value=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"title\"), env.opts.autoescape);\noutput += \"\\\"/>\\n\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div class=\\\"large-12 columns\\\"><label>Description\\n\\t\\t\\t\\t\\t<textarea name=\\\"desc\\\" rows=\\\"3\\\" placeholder=\\\"An optional description to explain the purpose of the assessment\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"description\"), env.opts.autoescape);\noutput += \"</textarea>\\n\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t\\t<span class=\\\"subject-label\\\">Subject</span>\\n\\n\\t\\t\\t\\t\\t\\t<input name=\\\"subject\\\"/>\\n\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t\\t<span class=\\\"studyYear-label\\\">Grade</span>\\n\\n\\t\\t\\t\\t\\t\\t<select name=\\\"studyYear\\\" data-placeholder=\\\"Choose\\\">\\n\\t\\t\\t\\t\\t\\t\\t<option value=\\\"\\\"></option>\\n\\t\\t\\t\\t\\t\\t\\t\";\nframe = frame.push();\nvar t_3 = runtime.contextOrFrameLookup(context, frame, \"gradeList\");\nif(t_3) {var t_1;\nif(runtime.isArray(t_3)) {\nvar t_2 = t_3.length;\nfor(t_1=0; t_1 < t_3.length; t_1++) {\nvar t_4 = t_3[t_1][0]\nframe.set(\"key\", t_3[t_1][0]);\nvar t_5 = t_3[t_1][1]\nframe.set(\"gradeSet\", t_3[t_1][1]);\nframe.set(\"loop.index\", t_1 + 1);\nframe.set(\"loop.index0\", t_1);\nframe.set(\"loop.revindex\", t_2 - t_1);\nframe.set(\"loop.revindex0\", t_2 - t_1 - 1);\nframe.set(\"loop.first\", t_1 === 0);\nframe.set(\"loop.last\", t_1 === t_2 - 1);\nframe.set(\"loop.length\", t_2);\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t\\t<optgroup label=\\\"\";\noutput += runtime.suppressValue(t_4, env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t\\t\\t\\t\\t\\t\";\nframe = frame.push();\nvar t_8 = t_5;\nif(t_8) {var t_7 = t_8.length;\nfor(var t_6=0; t_6 < t_8.length; t_6++) {\nvar t_9 = t_8[t_6];\nframe.set(\"gr\", t_9);\nframe.set(\"loop.index\", t_6 + 1);\nframe.set(\"loop.index0\", t_6);\nframe.set(\"loop.revindex\", t_7 - t_6);\nframe.set(\"loop.revindex0\", t_7 - t_6 - 1);\nframe.set(\"loop.first\", t_6 === 0);\nframe.set(\"loop.last\", t_6 === t_7 - 1);\nframe.set(\"loop.length\", t_7);\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<option value=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_9),\"value\"), env.opts.autoescape);\noutput += \"\\\" \";\noutput += runtime.suppressValue((runtime.memberLookup((t_9),\"value\") == runtime.contextOrFrameLookup(context, frame, \"studyYear\")?\"selected\":\"\"), env.opts.autoescape);\noutput += \">\";\noutput += runtime.suppressValue(runtime.memberLookup((t_9),\"name\"), env.opts.autoescape);\noutput += \"</option>\\n\\t\\t\\t\\t\\t\\t\\t\\t\";\n;\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t\\t</optgroup>\\n\\t\\t\\t\\t\\t\\t\\t\";\n;\n}\n} else {\nt_1 = -1;\nvar t_2 = runtime.keys(t_3).length;\nfor(var t_10 in t_3) {\nt_1++;\nvar t_11 = t_3[t_10];\nframe.set(\"key\", t_10);\nframe.set(\"gradeSet\", t_11);\nframe.set(\"loop.index\", t_1 + 1);\nframe.set(\"loop.index0\", t_1);\nframe.set(\"loop.revindex\", t_2 - t_1);\nframe.set(\"loop.revindex0\", t_2 - t_1 - 1);\nframe.set(\"loop.first\", t_1 === 0);\nframe.set(\"loop.last\", t_1 === t_2 - 1);\nframe.set(\"loop.length\", t_2);\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t\\t<optgroup label=\\\"\";\noutput += runtime.suppressValue(t_10, env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t\\t\\t\\t\\t\\t\";\nframe = frame.push();\nvar t_14 = t_11;\nif(t_14) {var t_13 = t_14.length;\nfor(var t_12=0; t_12 < t_14.length; t_12++) {\nvar t_15 = t_14[t_12];\nframe.set(\"gr\", t_15);\nframe.set(\"loop.index\", t_12 + 1);\nframe.set(\"loop.index0\", t_12);\nframe.set(\"loop.revindex\", t_13 - t_12);\nframe.set(\"loop.revindex0\", t_13 - t_12 - 1);\nframe.set(\"loop.first\", t_12 === 0);\nframe.set(\"loop.last\", t_12 === t_13 - 1);\nframe.set(\"loop.length\", t_13);\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<option value=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_15),\"value\"), env.opts.autoescape);\noutput += \"\\\" \";\noutput += runtime.suppressValue((runtime.memberLookup((t_15),\"value\") == runtime.contextOrFrameLookup(context, frame, \"studyYear\")?\"selected\":\"\"), env.opts.autoescape);\noutput += \">\";\noutput += runtime.suppressValue(runtime.memberLookup((t_15),\"name\"), env.opts.autoescape);\noutput += \"</option>\\n\\t\\t\\t\\t\\t\\t\\t\\t\";\n;\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t\\t</optgroup>\\n\\t\\t\\t\\t\\t\\t\\t\";\n;\n}\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t\\t\\t\\t\\t</select>\\n\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div class=\\\"large-12 columns\\\"><label>Language</label>\\n\\n\\t\\t\\t\\t\\t<select name=\\\"language\\\" data-placeholder=\\\"Choose\\\">\\n\\t\\t\\t\\t\\t\\t<option value=\\\"\\\"></option>\\n\\t\\t\\t\\t\\t\\t\";\nframe = frame.push();\nvar t_18 = runtime.contextOrFrameLookup(context, frame, \"languageList\");\nif(t_18) {var t_17 = t_18.length;\nfor(var t_16=0; t_16 < t_18.length; t_16++) {\nvar t_19 = t_18[t_16];\nframe.set(\"item\", t_19);\nframe.set(\"loop.index\", t_16 + 1);\nframe.set(\"loop.index0\", t_16);\nframe.set(\"loop.revindex\", t_17 - t_16);\nframe.set(\"loop.revindex0\", t_17 - t_16 - 1);\nframe.set(\"loop.first\", t_16 === 0);\nframe.set(\"loop.last\", t_16 === t_17 - 1);\nframe.set(\"loop.length\", t_17);\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t<option value=\\\"\";\noutput += runtime.suppressValue(t_19, env.opts.autoescape);\noutput += \"\\\" \";\noutput += runtime.suppressValue(((t_19 == runtime.contextOrFrameLookup(context, frame, \"language\"))?\"selected\":\"\"), env.opts.autoescape);\noutput += \" >\";\noutput += runtime.suppressValue(t_19, env.opts.autoescape);\noutput += \"</option>\\n\\t\\t\\t\\t\\t\\t\";\n;\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t\\t\\t\\t</select>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<br/>\\n\\t\\t\\t<p class=\\\"section-title\\\"><span>Settings</span></p>\\n\\n\\t\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\\t<div class=\\\"large-6 columns\\\"><label>Include feedback in questions\\n\\t\\t\\t\\t\\t<div class=\\\"switch radius\\\">\\n\\t\\t\\t\\t\\t\\t<input id=\\\"feedback\\\" type=\\\"checkbox\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"feedback\")?\"checked\":\"\"), env.opts.autoescape);\noutput += \">\\n\\t\\t\\t\\t\\t\\t<label for=\\\"feedback\\\"></label>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"assessment-basis-panel control-panel\\\">\\n\\t\\t\\t<p class=\\\"section-title\\\"><span>Instructions</span></p>\\n\\n\\t\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t\\t<p class=\\\"message create-message\\\">Create a new assessment by completing the form on the left and then clicking on the button below to begin adding questions.</p>\\n\\n\\t\\t\\t\\t\\t<p class=\\\"message must-clone-message hide\\\">This assessment is currently used in <strong>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"uses\"), env.opts.autoescape);\noutput += \"</strong> place\";\noutput += runtime.suppressValue(((runtime.contextOrFrameLookup(context, frame, \"uses\") > 1)?\"s\":\"\"), env.opts.autoescape);\noutput += \", for which marks might be received. To prevent the loss of those marks, this assessment must be cloned and a new title must be chosen. A new title will automatically be generated for you or you may specify a new title now.</p>\\n\\t\\t\\t\\t\\t<p class=\\\"message is-clone-message hide\\\">This assessment is a new instance of an existing assessment. Edit the new assessment's metadata on the left and then click on the button below to begin editing and adding questions.</p>\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"button-container\\\">\\n\\t\\t\\t\\t\\t\\t<input type=\\\"button\\\" class=\\\"button add-edit-questions\\\" value=\\\"Begin adding questions\\\"/>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"assessment-basis-panel assessment-panel hide\\\">\\n\\t\\t\\t<div class=\\\"topArea\\\">\\n\\t\\t\\t\\t\";\nif(!runtime.contextOrFrameLookup(context, frame, \"previewMode\")) {\noutput += \"\\n\\t\\t\\t\\t<span class=\\\"fal fa-bars menuToggle\\\"/>\\n\\t\\t\\t\\t<div class=\\\"optionToggle invisible\\\"><span class=\\\"fal fa-cog\\\"/> Options</div>\\n\\t\\t\\t\\t<div class=\\\"infoHost\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"buttonBlock question-num-block hide\\\" >Q<span class=\\\"question-number\\\">1</span></div>\\n\\t\\t\\t\\t\\t<div class=\\\"buttonBlock mark-block hide\\\" >Marks: <span class=\\\"question-mark\\\">0</span></div>\\n\\t\\t\\t\\t\\t<div class=\\\"buttonBlock total-block\\\">Total: <span class=\\\"total-mark\\\">0</span></div>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t<div class=\\\"preview\\\"><span class=\\\"fal fa-chevron-circle-right\\\"/> Preview</div>\\n\\t\\t\\t\\t<div class=\\\"sliderHost hide\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"ranger\\\">\\n\\t\\t\\t\\t\\t\\t<input type=\\\"range\\\" name=\\\"slider\\\" min=\\\"1\\\" value=\\\"1\\\" max=\\\"1\\\"/>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t\\t<div class=\\\"count\\\">\\n\\t\\t\\t\\t\\t\\t<input type=\\\"number\\\" id=\\\"page-input\\\" value=\\\"\\\" min=\\\"1\\\" /> / <span class=\\\"total\\\"></span>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t<div class=\\\"actionHost hide\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"delete\\\"><span class=\\\"fal fa-trash-alt\\\"/>&nbsp;Delete Question</div>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"previewMode\")) {\noutput += \"\\n\\t\\t\\t\\t<div class=\\\"infoHost\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"buttonBlock question-num-block\\\" >Q<span class=\\\"question-number\\\">1</span></div>\\n\\t\\t\\t\\t\\t<div class=\\\"buttonBlock mark-block\\\" >Marks: <span class=\\\"question-mark\\\">0</span></div>\\n\\t\\t\\t\\t\\t<div class=\\\"buttonBlock total-block\\\">Total: <span class=\\\"total-mark\\\">0</span></div>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"assessment-area\\\">\\n\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar content_oldRoot = content_obj.root;\ncontent_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcontent_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar questionTypes_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"clearfix top-bit\\\">\\n\\t\\t<div class=\\\"left\\\">Pick the type of question you want to create for question \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"total\"), env.opts.autoescape);\noutput += \":</div><div class=\\\"right\\\"><span class=\\\"fal fa-undo\\\"/> No, I don't want to add a question</div>\\n\\t</div>\\n\\n\\t<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"large-4 columns block\\\">\\n\\t\\t\\t<div data-type=\\\"1.1\\\">\\n\\t\\t\\t\\t<h4><img src=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"urlRoot\"), env.opts.autoescape);\noutput += \"/images/multiplemultiple.png\\\" width=\\\"48\\\"/>&nbsp;<strong>Choose many</strong></h4>\\n\\t\\t\\t\\t<h6><em>Multiple options, multiple answers</em></h6>\\n\\t\\t\\t\\t<p>Learners can choose one or more options from multiple answers.</p>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-4 columns block\\\">\\n\\t\\t\\t<div data-type=\\\"1.2\\\">\\n\\t\\t\\t\\t<h4><img src=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"urlRoot\"), env.opts.autoescape);\noutput += \"/images/multiple.png\\\" width=\\\"48\\\"/>&nbsp;<strong>Choose one of many</strong></h4>\\n\\t\\t\\t\\t<h6><em>Multiple options, single answer</em></h6>\\n\\t\\t\\t\\t<p>Learners must choose exactly one option from multiple answers.</p>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-4 columns block end\\\">\\n\\t\\t\\t<div data-type=\\\"1.3\\\">\\n\\t\\t\\t\\t<h4><img src=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"urlRoot\"), env.opts.autoescape);\noutput += \"/images/trueorfalse.png\\\" width=\\\"48\\\"/>&nbsp;<strong>Choose one of two</strong></h4>\\n\\t\\t\\t\\t<h6><em>Two options, single answer</em></h6>\\n\\t\\t\\t\\t<p>Learners must choose one of two options as the answer.</p>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"large-4 columns block\\\">\\n\\t\\t\\t<div data-type=\\\"2\\\">\\n\\t\\t\\t\\t<h4><img src=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"urlRoot\"), env.opts.autoescape);\noutput += \"/images/paragraph.png\\\" width=\\\"48\\\"/>&nbsp;<strong>Paragraph response</strong></h4>\\n\\t\\t\\t\\t<p>Learners can type in a freeform answer. Educators can review the responses in Educator Console.</p>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-4 columns block\\\">\\n\\t\\t\\t<div data-type=\\\"3\\\">\\n\\t\\t\\t\\t<h4><img src=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"urlRoot\"), env.opts.autoescape);\noutput += \"/images/columns.png\\\" width=\\\"48\\\"/>&nbsp;<strong>Match the options</strong></h4>\\n\\t\\t\\t\\t<p>Learners must match up a column of questions with a column of answers.</p>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-4 columns block end\\\">\\n\\t\\t\\t<div data-type=\\\"4\\\">\\n\\t\\t\\t\\t<h4><img src=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"urlRoot\"), env.opts.autoescape);\noutput += \"/images/blanks.png\\\" width=\\\"48\\\"/>&nbsp;<strong>Fill in the blanks</strong></h4>\\n\\t\\t\\t\\t<p>Learners must fill in blanks in an otherwise complete statement.</p>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar questionTypes_oldRoot = questionTypes_obj.root;\nquestionTypes_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tquestionTypes_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar questionMarkup_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"question-errors hide\\\">\\n\\t\\t<div class=\\\"detail\\\"></div>\\n\\t\\t<div class=\\\"close fal fa-times\\\"></div>\\n\\t</div>\\n\\t<section id=\\\"iago-assessment\\\">\\n\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t<div class=\\\"columns-12\\\">\\n\\t\\t\\t\\t<div class=\\\"heading\\\" id=\\\"iago-question\\\">\\n\\t\\t\\t\\t\\t<span id=\\\"iago-heading-text\\\" class=\\\"iago-editable\\\" contenteditable=\\\"true\\\"></span>\\n\\t\\t\\t\\t\\t<span id=\\\"iago-question-feedback\\\">\\n\\t\\t\\t\\t\\t\\t<span id=\\\"iago-question-feedback-text\\\"></span>\\n\\t\\t\\t\\t\\t</span>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t<div class=\\\"heading-image\\\" id=\\\"iago-question-image\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"image-placeholder\\\">Click to add an optional image to the title</div>\\n\\t\\t\\t\\t\\t<div class=\\\"delete-image hide\\\" title=\\\"Delete heading image\\\"><span class=\\\"fal fa-trash-alt\\\"/></div>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n        <div class=\\\"row\\\" style=\\\"display:none\\\">\\n            <div class=\\\"columns-12\\\">\\n                <div class=\\\"heading\\\" id=\\\"iago-question\\\">\\n                    <span id=\\\"iago-heading-text\\\" class=\\\"iago-editable\\\"></span>\\n                    <span id=\\\"iago-question-feedback\\\">\\n                        <span id=\\\"iago-question-feedback-text\\\"></span>\\n                    </span>\\n                </div>\\n                <div class=\\\"heading-image\\\" id=\\\"iago-question-image\\\"></div>\\n            </div>\\n        </div>\\n\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t<div class=\\\"columns-12\\\">\\n\\t\\t\\t\\t<div id=\\\"iago-help-content\\\">\\n\\t\\t\\t\\t\\t<span id=\\\"iago-help-content-text\\\"></span>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t<div class=\\\"columns-12\\\">\\n\\t\\t\\t\\t<div class=\\\"question-content\\\" id=\\\"iago-question-content\\\">\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t<div class=\\\"columns-12\\\">\\n\\t\\t\\t\\t<div class=\\\"progress-bar\\\">\\n\\t\\t\\t\\t\\t<span id=\\\"iago-progress-done\\\"></span>\\n\\t\\t\\t\\t\\t<span id=\\\"iago-progress-left\\\"></span>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"row buttons-container\\\">\\n\\t\\t\\t<div class=\\\"columns-6\\\">\\n\\t\\t\\t\\t<div id=\\\"iago-previous-question\\\" class=\\\"button direction-button left-button\\\" style=\\\"display:none\\\"></div>\\n\\t\\t\\t\\t<div id=\\\"iago-start-question\\\" class=\\\"button direction-button left-button\\\" style=\\\"display:none\\\"></div>\\n\\t\\t\\t\\t<div id=\\\"iago-restart-question\\\" class=\\\"button direction-button left-button\\\" style=\\\"display:none\\\"></div>\\n\\t\\t\\t</div>\\n\\t\\t\\t<div class=\\\"columns-6\\\">\\n\\t\\t\\t\\t<div id=\\\"iago-next-question\\\" class=\\\"button direction-button right-button\\\" style=\\\"display:none\\\"></div>\\n\\t\\t\\t\\t<div id=\\\"iago-complete-question\\\" class=\\\"button direction-button right-button\\\" style=\\\"display:none\\\"></div>\\n\\t\\t\\t\\t<div id=\\\"iago-feedback-question\\\" class=\\\"button direction-button right-button\\\" style=\\\"display:none\\\"></div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"row progress-container\\\" style=\\\"display:none\\\">\\n\\t\\t\\t<div class=\\\"columns-12\\\">\\n\\t\\t\\t\\t<div class=\\\"progress-items\\\">\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</section>\\n\\t<section id=\\\"iago-code-prompt\\\" style=\\\"display:none\\\">\\n\\n\\t</section>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar questionMarkup_oldRoot = questionMarkup_obj.root;\nquestionMarkup_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tquestionMarkup_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"content\": new nunjucks.Template( {obj: content_obj, type: \"code\"}, env),\t\"questionTypes\": new nunjucks.Template( {obj: questionTypes_obj, type: \"code\"}, env),\t\"questionMarkup\": new nunjucks.Template( {obj: questionMarkup_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar editor_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"modal-title\\\"><span class='fal fa-list-ol'/> Assessment Settings</div>\\n\\n\\t<div class=\\\"modal-body\\\">\\n\\t\\t<div class=\\\"inputs\\\">\\n\\t\\t\\t<h4>General Options</h3>\\n\\n\\t\\t\\t<div>\\n\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t<input type=\\\"checkbox\\\" name=\\\"chkSave\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"serverSave\") || runtime.contextOrFrameLookup(context, frame, \"isNew\")?\"checked\":\"\"), env.opts.autoescape);\noutput += \"> Save assessment marks to the server\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"name \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"serverSave\") || runtime.contextOrFrameLookup(context, frame, \"isNew\")?\"\":\"hide\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t\\t\\tGive this copy of the assessment a unique name so that you can find the marks easily later.\\n\\t\\t\\t\\t\\t\\t\\t<input type=\\\"text\\\" name=\\\"instanceName\\\" placeholder=\\\"Unique instance name\\\" value=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"title\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div>\\n\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t<input type=\\\"checkbox\\\" name=\\\"chkCode\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"requireCode\")?\"checked\":\"\"), env.opts.autoescape);\noutput += \"> Require learners to enter a unique code to start this assessment instance\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"codeShow hide\\\">\\n\\t\\t\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t\\t\\tYou will need to enter this code to start the assessment. The code is not case sensitive.\\n\\t\\t\\t\\t\\t\\t\\t<div class=\\\"code-show\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"code\"), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"activation \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"noTime\")?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t\\t<div>\\n\\t\\t\\t\\t\\tMake this assessment visible &nbsp;\\n\\t\\t\\t\\t\\t<select name=\\\"activationType\\\">\\n\\t\\t\\t\\t\\t\\t<option value=\\\"immediate\\\">immediately</option>\\n\\t\\t\\t\\t\\t\\t<option value=\\\"specific\\\">at a specific time:</option>\\n\\t\\t\\t\\t\\t</select>\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div class=\\\"times hide\\\">\\n\\t\\t\\t\\t\\t<input type=\\\"text\\\" class=\\\"datetime\\\" id=\\\"startDate\\\" placeholder=\\\"date\\\" readonly>\\n\\t\\t\\t\\t\\t<input type=\\\"text\\\" class=\\\"datetime\\\" id=\\\"startTime\\\" placeholder=\\\"time\\\">\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div>\\n\\t\\t\\t\\t<h4>Options for Surveys</h3>\\n\\n\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t<input type=\\\"checkbox\\\" name=\\\"chkDisableRandomization\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"disableRandomization\")?\"checked\":\"\"), env.opts.autoescape);\noutput += \"> Disable randomisation of questions and answers on devices\\n\\t\\t\\t\\t</label>\\n\\n\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t<input type=\\\"checkbox\\\" name=\\\"chkHideCompleteButtons\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"hideCompleteButtons\")?\"checked\":\"\"), env.opts.autoescape);\noutput += \"> Hide button to try the assessment again\\n\\t\\t\\t\\t</label>\\n\\n\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t<input type=\\\"checkbox\\\" name=\\\"chkDisableResult\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"disableResult\")?\"checked\":\"\"), env.opts.autoescape);\noutput += \"> Disable displaying of the assessment mark\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"modal-footer left\\\">\\n\\t\\t<button class=\\\"button save success\\\">OK</button>&nbsp;&nbsp;&nbsp;&nbsp;\\n\\t\\t<button class=\\\"button skip secondary\\\">Cancel</button>&nbsp;&nbsp;&nbsp;&nbsp;\\n\\t\\t<span class=\\\"message hide\\\"></span>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar editor_oldRoot = editor_obj.root;\neditor_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\teditor_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"editor\": new nunjucks.Template( {obj: editor_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"modal-title\\\">\\n\\t\";\nif((lineno = 1, colno = 17, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isModeCreate\"), \"isModeCreate\", context, []))) {\noutput += \"\\n\\t\\t\";\nvar t_1;\nt_1 = (lineno = 2, colno = 29, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"createIcon\"), \"createIcon\", context, []));\nframe.set(\"modalIcon\", t_1, true);\nif(frame.topLevel) {\ncontext.setVariable(\"modalIcon\", t_1);\n}\nif(frame.topLevel) {\ncontext.addExport(\"modalIcon\", t_1);\n}\noutput += \"\\n\\t\\t\";\nvar t_2;\nt_2 = (lineno = 3, colno = 30, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"createVerb\"), \"createVerb\", context, [true])) + \" \" + (lineno = 3, colno = 53, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"dataNoun\"), \"dataNoun\", context, [true]));\nframe.set(\"modalTitle\", t_2, true);\nif(frame.topLevel) {\ncontext.setVariable(\"modalTitle\", t_2);\n}\nif(frame.topLevel) {\ncontext.addExport(\"modalTitle\", t_2);\n}\noutput += \"\\n\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t\";\nvar t_3;\nt_3 = (lineno = 5, colno = 27, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editIcon\"), \"editIcon\", context, []));\nframe.set(\"modalIcon\", t_3, true);\nif(frame.topLevel) {\ncontext.setVariable(\"modalIcon\", t_3);\n}\nif(frame.topLevel) {\ncontext.addExport(\"modalIcon\", t_3);\n}\noutput += \"\\n\\t\\t\";\nvar t_4;\nt_4 = (lineno = 6, colno = 28, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editVerb\"), \"editVerb\", context, [true])) + \" \" + (lineno = 6, colno = 51, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"dataNoun\"), \"dataNoun\", context, [true]));\nframe.set(\"modalTitle\", t_4, true);\nif(frame.topLevel) {\ncontext.setVariable(\"modalTitle\", t_4);\n}\nif(frame.topLevel) {\ncontext.addExport(\"modalTitle\", t_4);\n}\noutput += \"\\n\\t\";\n;\n}\noutput += \"\\n\\n\\t<span class=\\\"fal \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"modalIcon\"), env.opts.autoescape);\noutput += \"\\\"/> \";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"modalTitle\")), env.opts.autoescape);\noutput += \"\\n</div>\\n\\n<div class=\\\"modal-body\\\">\\n\\t<div class=\\\"form-container\\\">\\n\\n\\t</div>\\n\\n\\t<div class=\\\"confirmation-container hide\\\">\\n\\t\\t<div class=\\\"confirmation\\\">\\n\\t\\t\\t<div class=\\\"confirmation-message-container\\\">\\n\\t\\t\\t\\t<span class=\\\"confirmation-message\\\"></span>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"confirmation-button-container\\\">\\n\\t\\t\\t\\t<span class=\\\"confirmation-question\\\"></span>\\n\\t\\t\\t\\t<button type=\\\"button\\\" class=\\\"button alert confirmation-yes\\\">Yes</button>\\n\\t\\t\\t\\t<button type=\\\"button\\\" class=\\\"button secondary confirmation-no\\\">No</button>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"status-container\\\">\\n\\t\\t<span class=\\\"spinner-icon hide\\\"/>\\n\\t\\t<span class=\\\"status-message status-message-loading hide\\\">&nbsp;&nbsp;Loading, one moment...</span>\\n\\t\\t<span class=\\\"status-message status-message-saving hide\\\">&nbsp;&nbsp;Saving your changes...</span>\\n\\t\\t<span class=\\\"status-message status-message-deleting hide\\\">&nbsp;&nbsp;&nbsp;Deleting, please stand by...</span>\\n\\t\\t<span class=\\\"status-message status-message-working hide\\\">&nbsp;&nbsp;&nbsp;Working, please be patient...</span>\\n\\n\\t\\t<span class=\\\"status-message status-message-success hide\\\">Save successful! Closing...</span>\\n\\t</div>\\n\\n\\t<div class=\\\"error-container\\\"></div>\\n</div>\\n\\n<div class=\\\"modal-footer left\\\">\\n</div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar bookChooser_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"ops-bar\\\">\\n\\t\\t<div class=\\\"filters\\\">\\n\\t\\t</div>\\n\\t\\t<div class=\\\"counter\\\"></div>\\n\\t</div>\\n\\t<div class=\\\"overlay\\\"></div>\\n\\n\\t<div id=\\\"searchResults\\\"></div>\\n\\t<div class=\\\"pagination\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar bookChooser_oldRoot = bookChooser_obj.root;\nbookChooser_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tbookChooser_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"bookChooser\": new nunjucks.Template( {obj: bookChooser_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"book\\\">\\n\\t<div class=\\\"bookflag\\\">\\n\\t\\t<div class=\\\"flag\\\"></div>\\n\\t\\t<div class=\\\"text\\\">\\n\\t\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"format\") == \"mpub\") {\noutput += \"\\n\\t\\t\\t\\tEPUB\\n\\t\\t\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t\\t\\tPDF\\n\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t</div>\\n\\t</div>\\n\\t<div class=\\\"container\\\">\\n\\t\\t<div class=\\\"bookImg\\\" data-replace >\\n\\t\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"years\") == runtime.contextOrFrameLookup(context, frame, \"null\")) {\noutput += \"\\n\\t\\t\\t\\t\";\nvar t_1;\nt_1 = false;\nframe.set(\"prevYear\", t_1, true);\nif(frame.topLevel) {\ncontext.setVariable(\"prevYear\", t_1);\n}\nif(frame.topLevel) {\ncontext.addExport(\"prevYear\", t_1);\n}\noutput += \"\\n\\t\\t\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t\\t\\t\";\nvar t_2;\nt_2 = !(env.getFilter(\"contains\").call(context, runtime.contextOrFrameLookup(context, frame, \"years\"),runtime.contextOrFrameLookup(context, frame, \"currentYear\")));\nframe.set(\"prevYear\", t_2, true);\nif(frame.topLevel) {\ncontext.setVariable(\"prevYear\", t_2);\n}\nif(frame.topLevel) {\ncontext.addExport(\"prevYear\", t_2);\n}\noutput += \"\\n\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"prevYear\")) {\noutput += \"\\n\\t\\t\\t\\t<div class=\\\"previousYear\\\">Previous Year</div>\\n\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t<div class=\\\"info\\\">\\n\\t\\t\\t\\t<div class=\\\"title \";\noutput += runtime.suppressValue((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"years\")),\"length\") > 0?\"hasChosenYears\":\"\"), env.opts.autoescape);\noutput += \" bookTooltip\\\" data-title=\\\"\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"title\")), env.opts.autoescape);\noutput += \"\\\"><p>\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"title\")), env.opts.autoescape);\noutput += \"</p></div>\\n\\t\\t\\t\\t<div>\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"isbn\")), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t\\t<div>\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"language\")), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t\\t\";\nif(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"years\")),\"length\") > 0) {\noutput += \"\\n\\t\\t\\t\\t\\t<div class=\\\"chosenYears bookTooltip\\\" data-title=\\\"\";\noutput += runtime.suppressValue((lineno = 26, colno = 65, runtime.callWrap(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"years\")),\"join\"), \"years[\\\"join\\\"]\", context, [\", \"])), env.opts.autoescape);\noutput += \"\\\"><p>Chosen for: \";\noutput += runtime.suppressValue((lineno = 26, colno = 100, runtime.callWrap(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"years\")),\"join\"), \"years[\\\"join\\\"]\", context, [\", \"])), env.opts.autoescape);\noutput += \"</p></div>\\n\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"imgPlaceholder\\\" data-replace style=\\\"background-image: url(\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"urlRoot\"), env.opts.autoescape);\noutput += \"/images/cover_not_available_copy__b-w.png);\\\">\\n\\t\\t</div>\\n\\t\\t<div class=\\\"titleContainer bookTooltip bottom-title\\\" data-title=\\\"\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"title\")), env.opts.autoescape);\noutput += \"\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"title\")), env.opts.autoescape);\noutput += \"</div>\\n\\t</div>\\n</div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar listItem_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<td class=\\\"\";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"hasError\")?\"has-error\":\"\"), env.opts.autoescape);\noutput += \"\\\" title=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"errorMessage\"), env.opts.autoescape);\noutput += \"\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"title\"), env.opts.autoescape);\noutput += \"\\n\\t\\t<div class=\\\"upload-progress\\\"><div class=\\\"progress-bar\\\"></div></div>\\n\\t</td>\\n\\t<td class=\\\"category \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"category\") == \"unknown\"?\"has-error\":\"\"), env.opts.autoescape);\noutput += \"\\\" title=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"errorMessage\"), env.opts.autoescape);\noutput += \"\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"category\"), env.opts.autoescape);\noutput += \"</td>\\n\\t<td class=\\\"fileSize \";\noutput += runtime.suppressValue((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"errorsArray\")),\"length\") > 0?\"has-error\":\"\"), env.opts.autoescape);\noutput += \"\\\" title=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"errorMessage\"), env.opts.autoescape);\noutput += \"\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"fileSize\"), env.opts.autoescape);\noutput += \"</td>\\n\\t<td>\\n\\t\\t<button type=\\\"button\\\" class=\\\"button small alert cancel \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"hasError\")?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\" title=\\\"Cancel/Remove\\\">\\n\\t\\t\\t<span class=\\\"fa-times-circle fas cancel-icon\\\"/> Remove\\n\\t\\t</button>\\n\\t\\t<button type=\\\"button\\\" class=\\\"button small success completed hide\\\" title=\\\"Upload Completed\\\">\\n\\t\\t\\t<span class=\\\"fa-check fas completed-icon\\\"/> Completed\\n\\t\\t</button>\\n\\t\\t<button type=\\\"button\\\" class=\\\"button small alert error \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"hasError\")?\"\":\"hide\"), env.opts.autoescape);\noutput += \"\\\" title=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"errorMessage\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t<span class=\\\"fa-exclamation-triangle fas\\\"/> Error\\n\\t\\t</button>\\n\\t</td>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar listItem_oldRoot = listItem_obj.root;\nlistItem_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlistItem_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar wizard_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<h5 id=\\\"resourceError\\\"></h5>\\n\\t<div id=\\\"loading\\\" class=\\\"\";\noutput += runtime.suppressValue((!runtime.contextOrFrameLookup(context, frame, \"loading\")?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t<i class='fas fa-spinner fa-spin'></i>\\n\\t</div>\\n\\n\\t<div id=\\\"file-chooser\\\" class=\\\"hide\\\">\\n\\t\\t<div class=\\\"file-chooser-region\\\">\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div id=\\\"confirm\\\" class=\\\"hide\\\">\\n\\t\\t<h3>Do you want to add these files as resources?</h3>\\n\\t\\t<div class=\\\"list-container\\\">\\n\\t\\t\\t<table class=\\\"confirm-list-header hide\\\">\\n\\t\\t\\t\\t<thead>\\n\\t\\t\\t\\t\\t<tr><th>File Name</th><th>File Type</th><th>Size</th><th>Remove</th></tr>\\n\\t\\t\\t\\t</thead>\\n\\t\\t\\t</table>\\n\\t\\t\\t<table class=\\\"confirm-list\\\">\\n\\t\\t\\t</table>\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar wizard_oldRoot = wizard_obj.root;\nwizard_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\twizard_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar container_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div id=\\\"resourceContainer\\\">\\n\\t\\t<div id=\\\"resourceHeader\\\">\\n\\t\\t\\t<div id=\\\"resourceImportControls\\\">\\n\\t\\t\\t\\t<label class=\\\"choose-files active\\\">Choose Files</label>\\n\\t\\t\\t\\t<label class=\\\"confirm\\\">Confirm</label>\\n\\t\\t\\t</div>\\n\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar container_oldRoot = container_obj.root;\ncontainer_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcontainer_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"listItem\": new nunjucks.Template( {obj: listItem_obj, type: \"code\"}, env),\t\"wizard\": new nunjucks.Template( {obj: wizard_obj, type: \"code\"}, env),\t\"container\": new nunjucks.Template( {obj: container_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar week_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t\";\nframe = frame.push();\nvar t_3 = runtime.contextOrFrameLookup(context, frame, \"days\");\nif(t_3) {var t_2 = t_3.length;\nfor(var t_1=0; t_1 < t_3.length; t_1++) {\nvar t_4 = t_3[t_1];\nframe.set(\"day\", t_4);\nframe.set(\"loop.index\", t_1 + 1);\nframe.set(\"loop.index0\", t_1);\nframe.set(\"loop.revindex\", t_2 - t_1);\nframe.set(\"loop.revindex0\", t_2 - t_1 - 1);\nframe.set(\"loop.first\", t_1 === 0);\nframe.set(\"loop.last\", t_1 === t_2 - 1);\nframe.set(\"loop.length\", t_2);\noutput += \"\\n\\t\\t<div class=\\\"cal-back-day \";\noutput += runtime.suppressValue(((runtime.memberLookup((t_4),\"excluded\"))?\"excluded\":\"\"), env.opts.autoescape);\noutput += \" \";\noutput += runtime.suppressValue(((runtime.memberLookup((t_4),\"clickable\") && !runtime.memberLookup((t_4),\"excluded\"))?\"clickable\":\"\"), env.opts.autoescape);\noutput += \" \";\noutput += runtime.suppressValue(((runtime.memberLookup((t_4),\"highlighted\") && !runtime.memberLookup((t_4),\"excluded\"))?\"highlighted\":\"\"), env.opts.autoescape);\noutput += \"\\\" data-day=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_4),\"date\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t<span class=\\\"day-date\\\">\";\noutput += runtime.suppressValue(runtime.memberLookup((t_4),\"date\"), env.opts.autoescape);\noutput += \"</span>\\n\\n\\t\\t\\t\";\nif(runtime.memberLookup((t_4),\"marked\")) {\noutput += \"\\n\\t\\t\\t\\t<div class=\\\"mark-container\\\">\\n\\t\\t\\t\\t\\t<span class=\\\"fal fa-circle day-mark\\\" />\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t</div>\\n\\t\";\n;\n}\n}\nframe = frame.pop();\noutput += \"\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar week_oldRoot = week_obj.root;\nweek_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tweek_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar header_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"navigator-container\\\">\\n\\t\\t<div class=\\\"navigator-button-container\\\">\\n\\t\\t\\t<span class=\\\"fal fa-chevron-circle-left navigator-button navigator-button-left\\\" />\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"title-container\\\">\\n\\t\\t\\t<span class=\\\"month-title\\\"></span>\\n\\t\\t\\t<span class=\\\"year-title\\\"></span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"navigator-button-container\\\">\\n\\t\\t\\t<span class=\\\"fal fa-chevron-circle-right navigator-button navigator-button-right\\\" />\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"weekday-container\\\">\\n\\t\\t\";\nframe = frame.push();\nvar t_3 = runtime.contextOrFrameLookup(context, frame, \"weekDays\");\nif(t_3) {var t_2 = t_3.length;\nfor(var t_1=0; t_1 < t_3.length; t_1++) {\nvar t_4 = t_3[t_1];\nframe.set(\"day\", t_4);\nframe.set(\"loop.index\", t_1 + 1);\nframe.set(\"loop.index0\", t_1);\nframe.set(\"loop.revindex\", t_2 - t_1);\nframe.set(\"loop.revindex0\", t_2 - t_1 - 1);\nframe.set(\"loop.first\", t_1 === 0);\nframe.set(\"loop.last\", t_1 === t_2 - 1);\nframe.set(\"loop.length\", t_2);\noutput += \"\\n\\t\\t\\t<div class=\\\"calback-weekday\\\">\\n\\t\\t\\t\\t<span>\";\noutput += runtime.suppressValue(t_4, env.opts.autoescape);\noutput += \"</span>\\n\\t\\t\\t</div>\\n\\t\\t\";\n;\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar header_oldRoot = header_obj.root;\nheader_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\theader_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar layout_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"header-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"body-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar layout_oldRoot = layout_obj.root;\nlayout_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlayout_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"week\": new nunjucks.Template( {obj: week_obj, type: \"code\"}, env),\t\"header\": new nunjucks.Template( {obj: header_obj, type: \"code\"}, env),\t\"layout\": new nunjucks.Template( {obj: layout_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar layout_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"card-region-container\\\">\\n\\t\\t<div class=\\\"card-region card-region-one\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"card-region card-region-two card-region-off-screen-right\\\">\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"card-navigator-container\\\">\\n\\t\\t<div class=\\\"card-navigator\\\">\\n\\t\\t\\t<span class=\\\"card-navigator-previous fal fa-chevron-left disabled\\\" title=\\\"Previous card\\\" />\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"card-navigator\\\">\\n\\t\\t\\t<span class=\\\"card-navigator-cancel fal fa-times\\\" title=\\\"Cancel\\\" />\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"card-navigator\\\">\\n\\t\\t\\t<span class=\\\"card-navigator-next fal fa-chevron-right\\\" title=\\\"Next card\\\" />\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar layout_oldRoot = layout_obj.root;\nlayout_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlayout_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"layout\": new nunjucks.Template( {obj: layout_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"modal-title\\\"><span class=\\\"fal fa-list-ul\\\"/> Changelog for \";\noutput += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"model\")),\"title\"), env.opts.autoescape);\noutput += \"</div>\\n<div class=\\\"modal-body\\\">\\n\\t\";\nif(!runtime.contextOrFrameLookup(context, frame, \"items\")) {\noutput += \"\\n\\t\\t<div style=\\\"margin: 0 auto; width: 100%; text-align: center;\\\">\\n\\t\\t\\t<span class=\\\"spinner-icon spinner-small\\\"/> Loading...\\n\\t\\t</div>\\n\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t\";\nif(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"items\")),\"length\") == 0) {\noutput += \"\\n\\t\\t\\t<div class=\\\"changelog-empty\\\">No change history found</div>\\n\\t\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t\\t<label class=\\\"search-box\\\">\\n\\t\\t\\t\\t<div class=\\\"fal fa-search\\\"></div>\\n\\t\\t\\t\\t<input type=\\\"text\\\" placeholder=\\\"Search...\\\" required name=\\\"searchText\\\" value=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"searchText\"), env.opts.autoescape);\noutput += \"\\\"/>\\n\\t\\t\\t\\t<div class=\\\"input-overlay fal fa-times\\\" title=\\\"Clear field\\\"/>\\n\\t\\t\\t</label>\\n\\n\\t\\t\\t\";\nframe = frame.push();\nvar t_3 = runtime.contextOrFrameLookup(context, frame, \"items\");\nif(t_3) {var t_2 = t_3.length;\nfor(var t_1=0; t_1 < t_3.length; t_1++) {\nvar t_4 = t_3[t_1];\nframe.set(\"row\", t_4);\nframe.set(\"loop.index\", t_1 + 1);\nframe.set(\"loop.index0\", t_1);\nframe.set(\"loop.revindex\", t_2 - t_1);\nframe.set(\"loop.revindex0\", t_2 - t_1 - 1);\nframe.set(\"loop.first\", t_1 === 0);\nframe.set(\"loop.last\", t_1 === t_2 - 1);\nframe.set(\"loop.length\", t_2);\noutput += \"\\n\\t\\t\\t\\t<div class=\\\"item\\\" data-full=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_4),\"datum\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"when\\\">\";\noutput += runtime.suppressValue((lineno = 18, colno = 31, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"fromNow\"), \"fromNow\", context, [runtime.memberLookup((t_4),\"datum\")])), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t\\t\\t<div class=\\\"who\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, (runtime.memberLookup((t_4),\"user\") || \"SYSTEM\")), env.opts.autoescape);\noutput += \" \";\noutput += runtime.suppressValue((!runtime.memberLookup((t_4),\"impersonator\")?\"\":(\" (impersonated by \" + (env.getFilter(\"escape\").call(context, runtime.memberLookup((t_4),\"impersonator\"))) + \")\")), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t\\t\\t<div class=\\\"title\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.memberLookup((t_4),\"reason\")), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t\\t\\t\";\nif(runtime.memberLookup((t_4),\"changes\")) {\noutput += \"\\n\\t\\t\\t\\t\\t\\t<div class=\\\"detail\\\">\\n\\t\\t\\t\\t\\t\\t\\t\";\nframe = frame.push();\nvar t_7 = runtime.memberLookup((t_4),\"changes\");\nif(t_7) {var t_5;\nif(runtime.isArray(t_7)) {\nvar t_6 = t_7.length;\nfor(t_5=0; t_5 < t_7.length; t_5++) {\nvar t_8 = t_7[t_5][0]\nframe.set(\"key\", t_7[t_5][0]);\nvar t_9 = t_7[t_5][1]\nframe.set(\"val\", t_7[t_5][1]);\nframe.set(\"loop.index\", t_5 + 1);\nframe.set(\"loop.index0\", t_5);\nframe.set(\"loop.revindex\", t_6 - t_5);\nframe.set(\"loop.revindex0\", t_6 - t_5 - 1);\nframe.set(\"loop.first\", t_5 === 0);\nframe.set(\"loop.last\", t_5 === t_6 - 1);\nframe.set(\"loop.length\", t_6);\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t\\t<strong>\";\noutput += runtime.suppressValue(t_8, env.opts.autoescape);\noutput += \"</strong>: <code>\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, env.getFilter(\"dumpIfObject\").call(context, runtime.memberLookup((t_9),\"old\"))), env.opts.autoescape);\noutput += \"</code> ➔ <code>\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, env.getFilter(\"dumpIfObject\").call(context, runtime.memberLookup((t_9),\"new\"))), env.opts.autoescape);\noutput += \"</code><br/>\\n\\t\\t\\t\\t\\t\\t\\t\";\n;\n}\n} else {\nt_5 = -1;\nvar t_6 = runtime.keys(t_7).length;\nfor(var t_10 in t_7) {\nt_5++;\nvar t_11 = t_7[t_10];\nframe.set(\"key\", t_10);\nframe.set(\"val\", t_11);\nframe.set(\"loop.index\", t_5 + 1);\nframe.set(\"loop.index0\", t_5);\nframe.set(\"loop.revindex\", t_6 - t_5);\nframe.set(\"loop.revindex0\", t_6 - t_5 - 1);\nframe.set(\"loop.first\", t_5 === 0);\nframe.set(\"loop.last\", t_5 === t_6 - 1);\nframe.set(\"loop.length\", t_6);\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t\\t<strong>\";\noutput += runtime.suppressValue(t_10, env.opts.autoescape);\noutput += \"</strong>: <code>\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, env.getFilter(\"dumpIfObject\").call(context, runtime.memberLookup((t_11),\"old\"))), env.opts.autoescape);\noutput += \"</code> ➔ <code>\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, env.getFilter(\"dumpIfObject\").call(context, runtime.memberLookup((t_11),\"new\"))), env.opts.autoescape);\noutput += \"</code><br/>\\n\\t\\t\\t\\t\\t\\t\\t\";\n;\n}\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\";\n;\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t\";\n;\n}\noutput += \"\\n\\t\";\n;\n}\noutput += \"\\n\\t<div class=\\\"modal-error hide\\\"></div>\\n</div>\\n<div class=\\\"modal-footer\\\">\\n\\t<button class=\\\"button success ok\\\">OK</button>\\n</div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar invalidDisplay_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span class=\\\"fal fa-ban ddfc-icon\\\"/>\\n\\n\\t<p class=\\\"ddfc-display-text\\\">\\n\\t\\tInvalid file type\\n\\t</p>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar invalidDisplay_oldRoot = invalidDisplay_obj.root;\ninvalidDisplay_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tinvalidDisplay_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar labelDisplay_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span class=\\\"fal fa-cloud-upload ddfc-icon\\\"/>\\n\\n\\t<p class=\\\"ddfc-display-text\\\">\\n\\t\\tClick inside this box to choose a file\\n\\t</p>\\n\\n\\t<p class=\\\"ddfc-display-text\\\">\\n\\t\\t<strong>OR</strong>\\n\\t</p>\\n\\n\\t<p class=\\\"ddfc-display-text\\\">\\n\\t\\tdrag and drop a file into this box\\n\\t</p>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar labelDisplay_oldRoot = labelDisplay_obj.root;\nlabelDisplay_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlabelDisplay_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar lockedDisplay_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span class=\\\"fal fa-ban ddfc-icon\\\"/>\\n\\n\\t<p class=\\\"ddfc-display-text\\\">\\n\\t\\tYou may not upload a new file\\n\\t</p>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar lockedDisplay_oldRoot = lockedDisplay_obj.root;\nlockedDisplay_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlockedDisplay_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar fileDisplay_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"ddfc-metadata\\\">\\n\\t\\t\";\nif((lineno = 2, colno = 20, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isDownloadable\"), \"isDownloadable\", context, []))) {\noutput += \"\\n\\t\\t\\t<p class=\\\"ddfc-display-text ddfc-download-text\\\">\\n\\t\\t\\t\\tClick inside this box to choose a different file or drag and drop a new file into this box.\\n\\t\\t\\t</p>\\n\\t\\t\";\n;\n}\noutput += \"\\n\\n\\t\\t<div class=\\\"ddfc-file\\\">\\n\\t\\t\\t<div class=\\\"ddfc-file-icon \";\noutput += runtime.suppressValue((lineno = 9, colno = 47, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"getFileTypeClass\"), \"getFileTypeClass\", context, [])), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<span class=\\\"ddfc-file-path\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, (lineno = 12, colno = 44, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"getFileName\"), \"getFileName\", context, []))), env.opts.autoescape);\noutput += \"</span>\\n\\n\\t\\t\\t\";\nif((lineno = 14, colno = 21, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isDownloadable\"), \"isDownloadable\", context, []))) {\noutput += \"\\n\\t\\t\\t\\t<div class=\\\"ddfc-button-backdrop\\\">\\n\\t\\t\\t\\t\\t<span class=\\\"fal fa-cloud-download ddfc-download-button\\\"/>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t</div>\\n\\n\\t\\t<span class=\\\"ddfc-metadata-row\\\">Size:&nbsp;\";\noutput += runtime.suppressValue((lineno = 21, colno = 57, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"getFileSize\"), \"getFileSize\", context, [])), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t<span class=\\\"ddfc-metadata-row\\\">Last modified:&nbsp;\";\noutput += runtime.suppressValue((lineno = 22, colno = 78, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"getFileModificationDate\"), \"getFileModificationDate\", context, [])), env.opts.autoescape);\noutput += \"</span>\\n\\t</div>\\n\\n\\t\";\nif((lineno = 25, colno = 12, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isImage\"), \"isImage\", context, []))) {\noutput += \"\\n\\t\\t<div class=\\\"ddfc-image\\\">\\n\\t\\t\\t<img class=\\\"ddfc-image-thumbnail\\\">\\n\\t\\t\\t</img>\\n\\t\\t</div>\\n\\t\";\n;\n}\noutput += \"\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar fileDisplay_oldRoot = fileDisplay_obj.root;\nfileDisplay_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tfileDisplay_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar filesDisplay_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"ddfc-metadata\\\">\\n\\t\\t<h2>Files selected</h2>\\n\\t\\t<ul>\\n\\t\\t\";\nframe = frame.push();\nvar t_3 = (lineno = 4, colno = 23, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"getFiles\"), \"getFiles\", context, []));\nif(t_3) {var t_2 = t_3.length;\nfor(var t_1=0; t_1 < t_3.length; t_1++) {\nvar t_4 = t_3[t_1];\nframe.set(\"file\", t_4);\nframe.set(\"loop.index\", t_1 + 1);\nframe.set(\"loop.index0\", t_1);\nframe.set(\"loop.revindex\", t_2 - t_1);\nframe.set(\"loop.revindex0\", t_2 - t_1 - 1);\nframe.set(\"loop.first\", t_1 === 0);\nframe.set(\"loop.last\", t_1 === t_2 - 1);\nframe.set(\"loop.length\", t_2);\noutput += \"\\n\\t\\t\\t<li>\";\noutput += runtime.suppressValue(runtime.memberLookup((t_4),\"name\"), env.opts.autoescape);\noutput += \"</li>\\n\\t\\t\";\n;\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t</ul>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar filesDisplay_oldRoot = filesDisplay_obj.root;\nfilesDisplay_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tfilesDisplay_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar layout_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<input type=\\\"file\\\" class=\\\"ddfc-file-input\\\" accept=\\\"\";\noutput += runtime.suppressValue((lineno = 1, colno = 73, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"getAcceptedFileTypes\"), \"getAcceptedFileTypes\", context, [])), env.opts.autoescape);\noutput += \"\\\">\\n\\n\\t<div class=\\\"ddfc-display-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar layout_oldRoot = layout_obj.root;\nlayout_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlayout_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"invalidDisplay\": new nunjucks.Template( {obj: invalidDisplay_obj, type: \"code\"}, env),\t\"labelDisplay\": new nunjucks.Template( {obj: labelDisplay_obj, type: \"code\"}, env),\t\"lockedDisplay\": new nunjucks.Template( {obj: lockedDisplay_obj, type: \"code\"}, env),\t\"fileDisplay\": new nunjucks.Template( {obj: fileDisplay_obj, type: \"code\"}, env),\t\"filesDisplay\": new nunjucks.Template( {obj: filesDisplay_obj, type: \"code\"}, env),\t\"layout\": new nunjucks.Template( {obj: layout_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar layout_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"error-view-header\\\">\\n\\t\\t<span class=\\\"error-glyph\\\">&nbsp;</span>\\n\\t\\t<span class=\\\"fal fa-meh error-glyph\\\">&nbsp;</span>\\n\\t\\t<span class=\\\"error-title\\\">Ah, oops...</span>\\n\\n\\t\\t<span class=\\\"fal fa-times close-button hide\\\" title=\\\"Close error\\\"></span>\\n\\t</div>\\n\\n\\t<div class=\\\"error-view-body\\\">\\n\\t\\t<div class=\\\"error-message-container\\\">\\n\\t\\t\\t<span class=\\\"error-message\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"message\"), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"error-view-footer\\\">\\n\\t\\t<div class=\\\"error-details-container\\\">\\n\\t\\t\\t<div class=\\\"error-details-header\\\">\\n\\t\\t\\t\\t<div class=\\\"error-details-button self-help-button\\\">\\n\\t\\t\\t\\t\\t<span class=\\\"fal fa-life-saver error-details-button-icon error-details-button-icon-self-help\\\"></span>\\n\\t\\t\\t\\t\\t<span class=\\\"error-details-button-label\\\">&nbsp;What can I do?</span>\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div class=\\\"error-details-button details-button\\\">\\n\\t\\t\\t\\t\\t<span class=\\\"fal fa-wrench error-details-button-icon error-details-button-icon-details\\\"></span>\\n\\t\\t\\t\\t\\t<span class=\\\"error-details-button-label\\\">&nbsp;View details</span>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"error-details-panel self-help hide\\\">\\n\\t\\t\\t\\tThe error may be temporary. Please try the following:<br/>\\n\\t\\t\\t\\t<ol>\\n\\t\\t\\t\\t\\t<li>Check your WiFi/Internet connection.</li>\\n\\t\\t\\t\\t\\t<li>If you were filling in a form, close this error and try repeating the desired action.</li>\\n\\t\\t\\t\\t\\t<li>If nothing else works, try refreshing the page.</li>\\n\\t\\t\\t\\t</ol>\\n\\t\\t\\t\\tIf the error continues to occur, then please contact your local ITSI support consultant.\\n\\t\\t\\t\\t<br/><br/>\\n\\t\\t\\t\\tA report of this error was also automatically sent to ITSI.<br/><br/>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"error-details-panel error-details hide\\\">\\n\\t\\t\\t\\t\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"details\"), env.opts.autoescape);\noutput += \"\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar layout_oldRoot = layout_obj.root;\nlayout_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlayout_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"layout\": new nunjucks.Template( {obj: layout_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar content_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<label>Title\\n\\t\\t\\t\\t<input type=\\\"text\\\" id=\\\"title\\\" value=\\\"\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"title\")), env.opts.autoescape);\noutput += \"\\\"/>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<label>Description\\n\\t\\t\\t\\t<textarea id=\\\"description\\\" rows=\\\"4\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"desc\"), env.opts.autoescape);\noutput += \"</textarea>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<label>Location\\n\\t\\t\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t\\t\\t<select id=\\\"location\\\" data-placeholder=\\\"Choose an existing location or start typing to create a new one\\\">\\n\\t\\t\\t\\t\\t\\t</select>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns period\\\">\\n\\t\\t\\t<div class=\\\"row collapse\\\">\\n\\t\\t\\t\\t<div class=\\\"large-3 columns\\\">\\n\\t\\t\\t\\t\\t<label>from</label>\\n\\t\\t\\t\\t\\t<input type=\\\"text\\\" class=\\\"datetime\\\" id=\\\"start-date\\\" placeholder=\\\"date\\\" readonly>\\n\\t\\t\\t\\t\\t<input type=\\\"text\\\" class=\\\"datetime\\\" id=\\\"start-time\\\" placeholder=\\\"time\\\">\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div class=\\\"large-3 columns\\\">\\n\\t\\t\\t\\t\\t<label>to</label>\\n\\t\\t\\t\\t\\t<input type=\\\"text\\\" class=\\\"datetime\\\" id=\\\"end-date\\\" placeholder=\\\"date\\\" readonly>\\n\\t\\t\\t\\t\\t<input type=\\\"text\\\" class=\\\"datetime\\\" id=\\\"end-time\\\" placeholder=\\\"time\\\">\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t<div class=\\\"large-1 columns\\\">\\n\\t\\t\\t\\t\\t<label>&nbsp;</label>\\n\\t\\t\\t\\t\\t<label class=\\\"inlined\\\"><input type=\\\"checkbox\\\" id=\\\"all-day\\\"> All day</label>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns occurence\\\">\\n\\t\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\\t<div class=\\\"large-3 columns\\\">\\n\\t\\t\\t\\t\\t<label>repetition\\n\\t\\t\\t\\t\\t\\t<div class=\\\"row collapse\\\">\\n\\t\\t\\t\\t\\t\\t\\t<div class=\\\"large-8 columns\\\">\\n\\t\\t\\t\\t\\t\\t\\t\\t<select id=\\\"gap\\\">\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<option value=\\\"once\\\" selected>only occurs once</option>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<option value=\\\"day\\\">repeats daily</option>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<option value=\\\"weekday\\\">repeats on weekdays</option>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<option value=\\\"week\\\">repeats weekly</option>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<option value=\\\"month\\\">repeats monthly</option>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<option value=\\\"year\\\">repeats annually</option>\\n\\t\\t\\t\\t\\t\\t\\t\\t</select>\\n\\t\\t\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div class=\\\"large-2 columns repeat-frequency hide\\\">\\n\\t\\t\\t\\t\\t<label>every\\n\\t\\t\\t\\t\\t\\t<div class=\\\"row collapse\\\">\\n\\t\\t\\t\\t\\t\\t\\t<div class=\\\"large-7 columns\\\">\\n\\t\\t\\t\\t\\t\\t\\t\\t<input type=\\\"number\\\" id=\\\"interval\\\" min=\\\"1\\\" max=\\\"30\\\" value=\\\"1\\\"/>\\n\\t\\t\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t\\t\\t\\t<div class=\\\"large-5 columns\\\">\\n\\t\\t\\t\\t\\t\\t\\t\\t<span class=\\\"postfix interval-label\\\">days</span>\\n\\t\\t\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div class=\\\"large-7 columns weekly-repeat hide\\\">\\n\\t\\t\\t\\t\\t<label>on days\\n\\t\\t\\t\\t\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\\t\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t\\t\\t\\t\\t<select id=\\\"repeat-week-days\\\" multiple data-placeholder=\\\"Select at least one day\\\">\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<option value=\\\"\\\" selected></option>\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<option value=\\\"0\\\">Sun</option>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<option value=\\\"1\\\">Mon</option>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<option value=\\\"2\\\">Tue</option>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<option value=\\\"3\\\">Wed</option>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<option value=\\\"4\\\">Thurs</option>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<option value=\\\"5\\\">Fri</option>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<option value=\\\"6\\\">Sat</option>\\n\\t\\t\\t\\t\\t\\t\\t\\t</select>\\n\\t\\t\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div class=\\\"large-7 columns monthly-repeat hide\\\">\\n\\t\\t\\t\\t\\t<label>repeat by\\n\\t\\t\\t\\t\\t\\t<div class=\\\"row collapse\\\">\\n\\t\\t\\t\\t\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t\\t\\t\\t\\t<select id=\\\"repeat-month-type\\\">\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<option value=\\\"dayofmonth\\\" \";\noutput += runtime.suppressValue(((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"repeatOpts\")),\"monthStyle\") == \"dayofmonth\")?\"selected\":\"\"), env.opts.autoescape);\noutput += \">day of the month</option>\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<option value=\\\"dayofweek\\\" \";\noutput += runtime.suppressValue(((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"repeatOpts\")),\"monthStyle\") == \"dayofweek\")?\"selected\":\"\"), env.opts.autoescape);\noutput += \">day of the week</option>\\n\\t\\t\\t\\t\\t\\t\\t\\t</select>\\n\\n\\t\\t\\t\\t\\t\\t\\t\\t<span class=\\\"monthly-repeat-label\\\"></span>\\n\\t\\t\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div class=\\\"large-1 columns\\\">\\n\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns repeat-end hide\\\">\\n\\t\\t\\t<label>until\\n\\t\\t\\t\\t<div class=\\\"row collapse\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"large-2 columns\\\">\\n\\t\\t\\t\\t\\t\\t<select id=\\\"until\\\">\\n\\t\\t\\t\\t\\t\\t\\t<option value=\\\"date\\\">date</option>\\n\\t\\t\\t\\t\\t\\t\\t<option value=\\\"instances\\\">after occurrences</option>\\n\\t\\t\\t\\t\\t\\t</select>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t\\t<div class=\\\"large-2 columns\\\">\\n\\t\\t\\t\\t\\t\\t<input type=\\\"text\\\" class=\\\"datetime\\\" id=\\\"until-date\\\" readonly>\\n\\t\\t\\t\\t\\t\\t<input type=\\\"number\\\" class=\\\"integer-input hide\\\" id=\\\"until-count\\\">\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t\\t<div class=\\\"large-8 columns\\\"></div>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns info repeat hide\\\">\\n\\t\\t\\t<span class=\\\"fal fa-info-circle\\\"></span>\\n\\t\\t\\t<span>Events will repeat a maximum of 350 times.</span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns audience\\\">\\n\\t\\t\\t<label>for\\n\\t\\t\\t\\t<div class=\\\"row collapse\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"large-11 columns\\\">\\n\\t\\t\\t\\t\\t\\t<select id=\\\"audience\\\" multiple data-placeholder=\\\"Who else can see this event?\\\">\\n\\t\\t\\t\\t\\t\\t</select>\\n\\t\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t\\t<div class=\\\"large-1 columns\\\">\\n\\t\\t\\t\\t\\t\\t<label class=\\\"right inlined \";\noutput += runtime.suppressValue(((env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"calendar\")),\"all\")))?\"\":\"hide\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t\\t\\t\\t\\t<input type=\\\"checkbox\\\" id=\\\"everyone\\\"> Everyone\\n\\t\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns info audience\\\">\\n\\t\\t\\t<span class=\\\"fal fa-info-circle\\\"></span>\\n\\t\\t\\t<span>You can always see an event that you create, even if you don't give anyone else permission to see it.</span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<label class=\\\"sub-calendar-label\\\">sub-calendar</label>\\n\\n\\t\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t\\t<select id=\\\"tags\\\" data-placeholder=\\\"Choose a sub-calendar to add this event to, or start typing to add a new one\\\">\\n\\n\\t\\t\\t\\t\\t</select>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns info sub-calendar\\\">\\n\\t\\t\\t<span class=\\\"fal fa-info-circle\\\"></span>\\n\\t\\t\\t<span>Sub-calendars appear on devices as categories, which people can toggle on and off as they wish.</span>\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar content_oldRoot = content_obj.root;\ncontent_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcontent_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"content\": new nunjucks.Template( {obj: content_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"date-filter-container date-filter-\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"name\"), env.opts.autoescape);\noutput += \"\\\">\\n  <div class=\\\"row collapse\\\">\\n    <div class=\\\"small-3 large-3 columns\\\">\\n      <span class=\\\"prefix\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"title\"), env.opts.autoescape);\noutput += \"</span>\\n    </div>\\n    <div class=\\\"small-9 large-9 columns\\\">\\n      <input type=\\\"text\\\" readonly>\\n    </div>\\n  </div>\\n</div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"date-filter-container date-filter-\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"name\"), env.opts.autoescape);\noutput += \"\\\">\\n  <div class=\\\"row collapse\\\">\\n\\t<div class=\\\"small-3 large-3 columns\\\">\\n\\t\\t<span class=\\\"prefix\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"title\"), env.opts.autoescape);\noutput += \"</span>\\n\\t</div>\\n\\t<div class=\\\"small-9 large-9 columns\\\">\\n\\t\\t<input type=\\\"text\\\" class=\\\"date\\\">\\n\\t\\t<input type=\\\"text\\\" class=\\\"time\\\">\\n\\t</div>\\n  </div>\\n</div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"text-filter-container\\\">\\n\\t<div class=\\\"fal fa-search\\\"/>\\n\\t<input type=\\\"text\\\" class=\\\"text-filter-input\\\" placeholder=\\\"\";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"minLength\") == \"\"?\"Type search query...\":runtime.contextOrFrameLookup(context, frame, \"minLength\") + \" or more characters...\"), env.opts.autoescape);\noutput += \"\\\" value=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"value\"), env.opts.autoescape);\noutput += \"\\\"></input>\\n\\t<div class=\\\"fal fa-times hide\\\"/>\\n</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \" <span style=\\\"font-family: 'Open Sans Regular'; font-weight: normal;\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"label\"), env.opts.autoescape);\noutput += \"</span>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar blankFilter_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span class=\\\"filter-label\\\">¯\\\\_(ツ)_/¯</span>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar blankFilter_oldRoot = blankFilter_obj.root;\nblankFilter_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tblankFilter_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar textFilter_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"fal fa-search search-glyph\\\" />\\n\\t\\t<input type=\\\"text\\\" class=\\\"text-filter-input\\\" placeholder=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"defaultText\"), env.opts.autoescape);\noutput += \"\\\"></input>\\n  <div class=\\\"fal fa-times button-clear hide\\\" />\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar textFilter_oldRoot = textFilter_obj.root;\ntextFilter_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\ttextFilter_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar filter_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"filter-back-filter-region\\\" />\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar filter_oldRoot = filter_obj.root;\nfilter_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tfilter_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar container_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"filter-back-filter-containers-region\\\" />\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar container_oldRoot = container_obj.root;\ncontainer_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcontainer_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"blankFilter\": new nunjucks.Template( {obj: blankFilter_obj, type: \"code\"}, env),\t\"textFilter\": new nunjucks.Template( {obj: textFilter_obj, type: \"code\"}, env),\t\"filter\": new nunjucks.Template( {obj: filter_obj, type: \"code\"}, env),\t\"container\": new nunjucks.Template( {obj: container_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar icon_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"fal fa-tasks\\\"/>&nbsp;&nbsp;Filter&nbsp;&nbsp;<span class=\\\"fal fa-angle-down bold\\\"/></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar icon_oldRoot = icon_obj.root;\nicon_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\ticon_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"icon\": new nunjucks.Template( {obj: icon_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"body\\\">\\n\\t<div class=\\\"loader\\\"><span class=\\\"spinner-icon spinner\\\"/> Loading flashcards...</div>\\n</div>\\n<div class=\\\"footer\\\"><button class=\\\"button secondary\\\">Close Preview</button></div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar value_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"grid-back-cell-\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"align\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\";\nif((lineno = 2, colno = 18, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isActionCell\"), \"isActionCell\", context, []))) {\noutput += \"\\n\\t\\t\\t<div class=\\\"grid-back-action-toolbar-button fal fa-cog\\\">\\n\\t\\t\\t</div>\\n\\t\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t\\t\";\nif((lineno = 6, colno = 18, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"escapeValue\"), \"escapeValue\", context, []))) {\noutput += \"\\n\\t\\t\\t\\t\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, (lineno = 7, colno = 10, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"value\"), \"value\", context, []))), env.opts.autoescape);\noutput += \"\\n\\t\\t\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t\\t\\t\";\noutput += runtime.suppressValue((lineno = 9, colno = 10, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"value\"), \"value\", context, [])), env.opts.autoescape);\noutput += \"\\n\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\";\n;\n}\noutput += \"\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar value_oldRoot = value_obj.root;\nvalue_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tvalue_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar label_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"grid-back-cell-\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"align\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t<div class=\\\"grid-back-label\\\">\\n\\t\\t\\t\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"value\"), env.opts.autoescape);\noutput += \"\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"grid-back-label-control-container\\\">\\n\\t\\t\\t<span class=\\\"fal fa-sort icon-sort \";\noutput += runtime.suppressValue((((lineno = 7, colno = 54, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"sortable\"), \"sortable\", context, [])))?\"\":\"hide\"), env.opts.autoescape);\noutput += \"\\\" />\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar label_oldRoot = label_obj.root;\nlabel_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlabel_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar grid_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"grid-back-controls\\\">\\n\\t\\t<div class=\\\"grid-back-filter-container\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"grid-back-counter-container\\\">\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<table class=\\\"grid-back-table\\\">\\n\\t</table>\\n\\n\\t<div class=\\\"grid-back-navigator-container\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar grid_oldRoot = grid_obj.root;\ngrid_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tgrid_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar pageButton_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span class=\\\"grid-back-page-button-label\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"label\"), env.opts.autoescape);\noutput += \"</span>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar pageButton_oldRoot = pageButton_obj.root;\npageButton_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tpageButton_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar navigator_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"button-container\\\">\\n\\t\\t<div class=\\\"grid-back-button grid-back-fast-previous\\\" title=\\\"First Page\\\">\\n\\t\\t\\t<span class=\\\"fal fa-angle-double-left\\\"></span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"grid-back-button grid-back-previous\\\" title=\\\"Previous Page\\\">\\n\\t\\t\\t<span class=\\\"fal fa-angle-left\\\"></span>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"page-button-container\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"button-container\\\">\\n\\t\\t<div class=\\\"grid-back-button grid-back-next\\\" title=\\\"Next Page\\\">\\n\\t\\t\\t<span class=\\\"fal fa-angle-right\\\"></span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"grid-back-button grid-back-fast-next\\\" title=\\\"Last Page\\\">\\n\\t\\t\\t<span class=\\\"fal fa-angle-double-right\\\"></span>\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar navigator_oldRoot = navigator_obj.root;\nnavigator_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tnavigator_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"value\": new nunjucks.Template( {obj: value_obj, type: \"code\"}, env),\t\"label\": new nunjucks.Template( {obj: label_obj, type: \"code\"}, env),\t\"grid\": new nunjucks.Template( {obj: grid_obj, type: \"code\"}, env),\t\"pageButton\": new nunjucks.Template( {obj: pageButton_obj, type: \"code\"}, env),\t\"navigator\": new nunjucks.Template( {obj: navigator_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar LearningPathChooser_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<p class=\\\"chooser-label\\\">Choose a learning path to work with</p>\\n\\n\\t<p class=\\\"alsoResources\\\">\\n\\t\\t<label><input type=\\\"checkbox\\\" name=\\\"content\\\"> Also clone the content in the learning path</label>\\n\\t\\t<label><input type=\\\"checkbox\\\" name=\\\"tags\\\"> Also clone the tags in the learning path</label>\\n\\t</p>\\n\\n\\t<select name=\\\"groups\\\"></select>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar LearningPathChooser_oldRoot = LearningPathChooser_obj.root;\nLearningPathChooser_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tLearningPathChooser_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar learningPathSelector_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"learningPath-filter-region\\\">\\n\\t\\t<div class=\\\"filters\\\">\\n\\t\\t</div>\\n\\t\\t<div class=\\\"counter\\\"></div>\\n\\t</div>\\n\\t<div class=\\\"overlay\\\"></div>\\n\\n\\t<div class=\\\"learningPath-grid-region result\\\"></div>\\n\\t<div class=\\\"pagination\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar learningPathSelector_oldRoot = learningPathSelector_obj.root;\nlearningPathSelector_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlearningPathSelector_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar layout_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"learningPath-selector-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar layout_oldRoot = layout_obj.root;\nlayout_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlayout_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"LearningPathChooser\": new nunjucks.Template( {obj: LearningPathChooser_obj, type: \"code\"}, env),\t\"learningPathSelector\": new nunjucks.Template( {obj: learningPathSelector_obj, type: \"code\"}, env),\t\"layout\": new nunjucks.Template( {obj: layout_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"learningPath\\\">\\n\\t<div class=\\\"container\\\">\\n\\t\\t<div class=\\\"learningPathBlock\\\" style=\\\"background-color: \";\noutput += runtime.suppressValue(env.getFilter(\"stringToBgRGBAColorLight\").call(context, runtime.contextOrFrameLookup(context, frame, \"code\")), env.opts.autoescape);\noutput += \"; color: \";\noutput += runtime.suppressValue(env.getFilter(\"stringToTextHexColor\").call(context, runtime.contextOrFrameLookup(context, frame, \"code\")), env.opts.autoescape);\noutput += \";\\\">\\n      <div class=\\\"learningPathTab\\\" style=\\\"background-color: \";\noutput += runtime.suppressValue(env.getFilter(\"stringToBgRGBAColor\").call(context, runtime.contextOrFrameLookup(context, frame, \"code\")), env.opts.autoescape);\noutput += \";\\\"/>\\n\\t\\t\\t<div class=\\\"learningPathName learningPathTooltip\\\" data-title=\\\"\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"name\")), env.opts.autoescape);\noutput += \"\\\" >\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"name\")), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t<div class=\\\"info\\\">\\n\\t\\t\\t\\t<table>\\n\\t\\t\\t\\t\\t<tr><td><div class=\\\"info-text learningPathTooltip\\\" data-title=\\\"\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"name\")), env.opts.autoescape);\noutput += \"\\\" >\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"name\")), env.opts.autoescape);\noutput += \"</div></td></tr>\\n\\t\\t\\t\\t</table>\\n\\t\\t\\t</div>\\n\\t\\t\\t<div class=\\\"hasContent \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"hasData\")?\"fas fa-copy\":\"\"), env.opts.autoescape);\noutput += \"\\\" data-title=\\\"This learning path has content\\\"></div>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"titleContainer\\\">\\n\\t\\t\\t<div class=\\\"learningPathTooltip\\\" data-title=\\\"\";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"subject\")?env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"subject\")):\"None\"), env.opts.autoescape);\noutput += \"\\\">Subject: \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"subject\")?env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"subject\")):\"None\"), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t<div class=\\\"learningPathTooltip\\\" data-title=\\\"\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"grade\")), env.opts.autoescape);\noutput += \"\\\">Study Year: \";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"grade\")), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t</div>\\n\\t</div>\\n</div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\nif(runtime.contextOrFrameLookup(context, frame, \"image\")) {\noutput += \"\\n\\t<img src=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"image\"), env.opts.autoescape);\noutput += \"\\\">\\n\";\n;\n}\nelse {\nif(runtime.contextOrFrameLookup(context, frame, \"video\")) {\noutput += \"\\n\\t<video controls src=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"video\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t</video>\\n\";\n;\n}\nelse {\noutput += \"\\n\\t<span>Unsupported content.</span>\\n\";\n;\n}\n;\n}\noutput += \"\\n\\n<div class=\\\"light-box-close-message light-box-close-message-faded\\\">\\n\\t<span>Click outside of the \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"image\")?\"image\":((runtime.contextOrFrameLookup(context, frame, \"video\")?\"video\":\"box\"))), env.opts.autoescape);\noutput += \" to close</span>\\n</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar header_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"title\"), env.opts.autoescape);\noutput += \"</span>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar header_oldRoot = header_obj.root;\nheader_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\theader_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar footer_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"mk-footer-navigation-container-left\\\">\\n\\t\\t<div class=\\\"mk-footer-button mk-navigate \";\noutput += runtime.suppressValue((((lineno = 2, colno = 61, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"showButton\"), \"showButton\", context, [\"navigationButtonPrevious\"])))?\"\":\"transparent\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t<span class=\\\"fal fa-arrow-circle-left\\\" title=\\\"Previous page\\\" />\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t\";\nif(((lineno = 7, colno = 16, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"showButton\"), \"showButton\", context, [\"yesButton\"])))) {\noutput += \"\\n\\t\\t<div class=\\\"mk-footer-button mk-yes\\\">\\n\\t\\t\\t<span>Yes</span>\\n\\t\\t</div>\\n\\t\";\n;\n}\noutput += \"\\n\\n\\t\";\nif(((lineno = 13, colno = 16, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"showButton\"), \"showButton\", context, [\"noButton\"])))) {\noutput += \"\\n\\t\\t<div class=\\\"mk-footer-button mk-no\\\">\\n\\t\\t\\t<span>No</span>\\n\\t\\t</div>\\n\\t\";\n;\n}\noutput += \"\\n\\n\\t\";\nif(((lineno = 19, colno = 16, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"showButton\"), \"showButton\", context, [\"acceptButton\"])))) {\noutput += \"\\n\\t\\t<div class=\\\"mk-footer-button mk-accept\\\">\\n\\t\\t\\t<span>Accept</span>\\n\\t\\t</div>\\n\\t\";\n;\n}\noutput += \"\\n\\n\\t\";\nif(((lineno = 25, colno = 16, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"showButton\"), \"showButton\", context, [\"cancelButton\"])))) {\noutput += \"\\n\\t\\t<div class=\\\"mk-footer-button mk-cancel\\\">\\n\\t\\t\\t<span>Cancel</span>\\n\\t\\t</div>\\n\\t\";\n;\n}\noutput += \"\\n\\n\\t\";\nif(((lineno = 31, colno = 16, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"showButton\"), \"showButton\", context, [\"closeButton\"])))) {\noutput += \"\\n\\t\\t<div class=\\\"mk-footer-button mk-close\\\">\\n\\t\\t\\t<span>Close</span>\\n\\t\\t</div>\\n\\t\";\n;\n}\noutput += \"\\n\\n\\t<div class=\\\"mk-footer-navigation-container-right\\\">\\n\\t\\t<div class=\\\"mk-footer-button mk-navigate \";\noutput += runtime.suppressValue((((lineno = 38, colno = 61, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"showButton\"), \"showButton\", context, [\"navigationButtonNext\"])))?\"\":\"transparent\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t<span class=\\\"fal fa-arrow-circle-right\\\" title=\\\"Next page\\\" />\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar footer_oldRoot = footer_obj.root;\nfooter_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tfooter_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar page_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"mk-page-header-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"mk-page-body-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"mk-page-footer-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar page_oldRoot = page_obj.root;\npage_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tpage_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar host_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"mk-host-page-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar host_oldRoot = host_obj.root;\nhost_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\thost_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"header\": new nunjucks.Template( {obj: header_obj, type: \"code\"}, env),\t\"footer\": new nunjucks.Template( {obj: footer_obj, type: \"code\"}, env),\t\"page\": new nunjucks.Template( {obj: page_obj, type: \"code\"}, env),\t\"host\": new nunjucks.Template( {obj: host_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar content_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"meta-data\\\">\\n\\t\\t<label class=\\\"category-label\\\">\\n\\t\\t\\t<span>Type</span>\\n\\t\\t\\t<select id=\\\"category\\\" data-placeholder=\\\"Choose\\\" \";\noutput += runtime.suppressValue(((lineno = 4, colno = 63, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isNew\"), \"isNew\", context, [])) && !(lineno = 4, colno = 88, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"categoryLocked\"), \"categoryLocked\", context, []))?\"\":\"disabled\"), env.opts.autoescape);\noutput += \">\\n\\t\\t\\t</select>\\n\\t\\t</label>\\n\\n\\t\\t<label class=\\\"language-label\\\">\\n\\t\\t\\t<span>Language</span>\\n\\t\\t\\t<select id=\\\"language\\\" data-placeholder=\\\"Choose\\\" \";\noutput += runtime.suppressValue((!(lineno = 10, colno = 78, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, [])) || (!(lineno = 10, colno = 94, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isNew\"), \"isNew\", context, [])) && !runtime.contextOrFrameLookup(context, frame, \"resourceEditing\"))?\"disabled\":\"\"), env.opts.autoescape);\noutput += \">\\n\\t\\t\\t</select>\\n\\t\\t</label>\\n\\n\\t\\t<label class=\\\"subject-label\\\">\\n\\t\\t\\t<span>Subject</span>\\n\\t\\t\\t<select id=\\\"subject\\\" data-placeholder=\\\"Choose\\\" \";\noutput += runtime.suppressValue((!(lineno = 16, colno = 77, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, [])) || (!(lineno = 16, colno = 93, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isNew\"), \"isNew\", context, [])) && !runtime.contextOrFrameLookup(context, frame, \"resourceEditing\"))?\"disabled\":\"\"), env.opts.autoescape);\noutput += \">\\n\\t\\t\\t</select>\\n\\t\\t</label>\\n\\n\\t\\t<label class=\\\"study-year-label\\\">\\n\\t\\t\\t<span>Year of Study</span>\\n\\t\\t\\t<select id=\\\"studyYear\\\" data-placeholder=\\\"Choose\\\" \";\noutput += runtime.suppressValue((!(lineno = 22, colno = 79, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, [])) || (!(lineno = 22, colno = 95, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isNew\"), \"isNew\", context, [])) && !runtime.contextOrFrameLookup(context, frame, \"resourceEditing\"))?\"disabled\":\"\"), env.opts.autoescape);\noutput += \">\\n\\t\\t\\t</select>\\n\\t\\t</label>\\n\\t</div>\\n\\n\\t<div class=\\\"inline-message\\\">\\n\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"inlineSuccessMessage\")) {\noutput += \"\\n\\t\\t\\t\";\nvar t_1;\nt_1 = \"greenText fal fa-check\";\nframe.set(\"class\", t_1, true);\nif(frame.topLevel) {\ncontext.setVariable(\"class\", t_1);\n}\nif(frame.topLevel) {\ncontext.addExport(\"class\", t_1);\n}\noutput += \"\\n\\t\\t\\t\";\nvar t_2;\nt_2 = runtime.contextOrFrameLookup(context, frame, \"inlineSuccessMessage\");\nframe.set(\"message\", t_2, true);\nif(frame.topLevel) {\ncontext.setVariable(\"message\", t_2);\n}\nif(frame.topLevel) {\ncontext.addExport(\"message\", t_2);\n}\noutput += \"\\n\\t\\t\";\n;\n}\nelse {\nif(runtime.contextOrFrameLookup(context, frame, \"inlineErrorMessage\")) {\noutput += \"\\n\\t\\t\\t\";\nvar t_3;\nt_3 = \"\";\nframe.set(\"class\", t_3, true);\nif(frame.topLevel) {\ncontext.setVariable(\"class\", t_3);\n}\nif(frame.topLevel) {\ncontext.addExport(\"class\", t_3);\n}\noutput += \"\\n\\t\\t\\t\";\nvar t_4;\nt_4 = runtime.contextOrFrameLookup(context, frame, \"inlineErrorMessage\");\nframe.set(\"message\", t_4, true);\nif(frame.topLevel) {\ncontext.setVariable(\"message\", t_4);\n}\nif(frame.topLevel) {\ncontext.addExport(\"message\", t_4);\n}\noutput += \"\\n\\t\\t\";\n;\n}\n;\n}\noutput += \"\\n\\n\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"inlineSuccessMessage\") || runtime.contextOrFrameLookup(context, frame, \"inlineErrorMessage\")) {\noutput += \"\\n\\t\\t\\t<span class=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"class\"), env.opts.autoescape);\noutput += \"\\\"/>&nbsp;&nbsp;\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"message\")), env.opts.autoescape);\noutput += \"\\n\\t\\t\";\n;\n}\noutput += \"\\n\\t</div>\\n\\n\\t<div class=\\\"welcome \";\noutput += runtime.suppressValue(((lineno = 41, colno = 33, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isNew\"), \"isNew\", context, []))?\"\":\"hide\"), env.opts.autoescape);\noutput += \" \\\">\\n\\t\\t<span>Choose a resource type above to begin</span>\\n\\t</div>\\n\\n\\t<div class=\\\"row mainrow hide\\\">\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<label>Title\\n\\t\\t\\t\\t\";\nif((lineno = 48, colno = 16, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, [])) && ((lineno = 48, colno = 29, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isNew\"), \"isNew\", context, [])) || runtime.contextOrFrameLookup(context, frame, \"resourceEditing\"))) {\noutput += \"\\n\\t\\t\\t\\t\\t<input type=\\\"text\\\" id=\\\"title\\\" value=\\\"\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"title\")), env.opts.autoescape);\noutput += \"\\\" placeholder=\\\"Title for the resource\\\">\\n\\t\\t\\t\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t\\t\\t\\t<div class=\\\"textual bold\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"title\")), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<label>Description\\n\\t\\t\\t\\t\";\nif((lineno = 58, colno = 16, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, [])) && ((lineno = 58, colno = 29, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isNew\"), \"isNew\", context, [])) || runtime.contextOrFrameLookup(context, frame, \"resourceEditing\"))) {\noutput += \"\\n\\t\\t\\t\\t\\t<textarea id=\\\"description\\\" rows=\\\"3\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"description\"), env.opts.autoescape);\noutput += \"</textarea>\\n\\t\\t\\t\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t\\t\\t\\t<div class=\\\"textual bold\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"description\")), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns flash-card-deck-form hide\\\">\\n\\t\\t\\t<div class=\\\"flash-card-upload\\\">\\n\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t<input id=\\\"show-flash-card-upload\\\" type=\\\"checkbox\\\">\\n\\t\\t\\t\\t\\tUpload flashcards via CSV now\\n\\t\\t\\t\\t</label>\\n\\n\\t\\t\\t\\t<div>\\n\\t\\t\\t\\t\\t<a class=\\\"download-link\\\" href=\\\"data:text/csv;charset=UTF-8,sep%3D%09%0Afront%09back%0AFront%20of%20first%20flashcard...%09Back%20of%20first%20flashcard...\\\" download=\\\"flashcard-template.csv\\\">Download a blank flashcard CSV template</a>&nbsp;&nbsp;&nbsp;or&nbsp;&nbsp;&nbsp;<a class=\\\"download-link\\\" href=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"flashCardsTutorialVideoSrc\"), env.opts.autoescape);\noutput += \"\\\">Watch a tutorial video</a>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"flash-card-deck-file-chooser hide\\\">\\n\\t\\t\\t\\t<label>Flashcard CSV File</label>\\n\\t\\t\\t\\t<div class=\\\"flash-card-deck-file-chooser-region\\\">\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns image-form hide\\\">\\n\\t\\t\\t<div class=\\\"image-file-chooser\\\">\\n\\t\\t\\t\\t<label>Image</label>\\n\\t\\t\\t\\t<div class=\\\"image-file-chooser-region\\\">\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\\t<div class=\\\"large-12 columns greeninfo\\\">\\n\\t\\t\\t\\t\\t<span class=\\\"fal fa-info-circle\\\"/> Size limit: \";\noutput += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"maxFileSize\")),\"image\"), env.opts.autoescape);\noutput += \"MB\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns pdf-form hide\\\">\\n\\t\\t\\t<div class=\\\"pdf-file-chooser\\\">\\n\\t\\t\\t\\t<label>PDF</label>\\n\\t\\t\\t\\t<div class=\\\"pdf-file-chooser-region\\\">\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\\t<div class=\\\"large-12 columns greeninfo\\\">\\n\\t\\t\\t\\t\\t<span class=\\\"fal fa-info-circle\\\"/> Size limit: \";\noutput += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"maxFileSize\")),\"pdf\"), env.opts.autoescape);\noutput += \"MB\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns office-form hide\\\">\\n\\t\\t\\t<div class=\\\"office-file-chooser\\\">\\n\\t\\t\\t\\t<label id=\\\"office-file-label\\\">Microsoft Office file</label>\\n\\t\\t\\t\\t<div class=\\\"office-file-chooser-region\\\">\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\\t<div class=\\\"large-12 columns greeninfo\\\">\\n\\t\\t\\t\\t\\t<span class=\\\"fal fa-info-circle\\\"/> Size limits: Word (\";\noutput += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"maxFileSize\")),\"word\"), env.opts.autoescape);\noutput += \"MB), Excel (\";\noutput += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"maxFileSize\")),\"excel\"), env.opts.autoescape);\noutput += \"MB), Powerpoint (\";\noutput += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"maxFileSize\")),\"powerpoint\"), env.opts.autoescape);\noutput += \"MB)\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns text-form hide\\\">\\n\\t\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t\\t<label>Text\\n\\t\\t\\t\\t\\t\\t\";\nif((lineno = 128, colno = 18, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, [])) && ((lineno = 128, colno = 31, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isNew\"), \"isNew\", context, [])) || runtime.contextOrFrameLookup(context, frame, \"resourceEditing\"))) {\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t<textarea id=\\\"text\\\" rows=\\\"4\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"text\"), env.opts.autoescape);\noutput += \"</textarea>\\n\\t\\t\\t\\t\\t\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t<div class=\\\"textual\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"text\")), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\\t<div class=\\\"large-12 columns info\\\">\\n\\t\\t\\t\\t\\t<span class=\\\"fal fa-info-circle\\\"/> All formatting will be stripped from text when it is submitted. If you are copying this text from Microsoft Word and you wish to preserve the formatting (such as columns, underlining, bold, colours, etc), then please upload the file as an <em>MS Word</em> instead.\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns url-form hide\\\">\\n\\t\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t\\t<label>URL\\n\\t\\t\\t\\t\\t\\t\";\nif((lineno = 148, colno = 18, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, [])) && ((lineno = 148, colno = 31, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isNew\"), \"isNew\", context, [])) || runtime.contextOrFrameLookup(context, frame, \"resourceEditing\"))) {\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t<input type=\\\"text\\\" id=\\\"url\\\" value=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"url\"), env.opts.autoescape);\noutput += \"\\\"/>\\n\\t\\t\\t\\t\\t\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t<div class=\\\"textual\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"url\")), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\\t<div class=\\\"large-12 columns info\\\">\\n\\t\\t\\t\\t\\t<span class=\\\"fal fa-info-circle\\\"/> To ensure that URLs can be opened automatically on all device types, please ensure they start with <strong>http://</strong> or <strong>https://</strong>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns video-form hide\\\">\\n\\t\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"video-file-chooser\\\">\\n\\t\\t\\t\\t\\t\\t<label>Video</label>\\n\\t\\t\\t\\t\\t\\t<div class=\\\"video-file-chooser-region\\\">\\n\\t\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\\t<div class=\\\"large-12 columns greeninfo\\\">\\n\\t\\t\\t\\t\\t<span class=\\\"fal fa-info-circle\\\"/> Please note: devices can only play videos in the MP4 format. Size limit: \";\noutput += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"maxFileSize\")),\"video\"), env.opts.autoescape);\noutput += \"MB\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns audio-form hide\\\">\\n\\t\\t\\t<div class=\\\"audio-file-chooser\\\">\\n\\t\\t\\t\\t<label>MP3</label>\\n\\t\\t\\t\\t<div class=\\\"audio-file-chooser-region\\\">\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\\t<div class=\\\"large-12 columns greeninfo\\\">\\n\\t\\t\\t\\t\\t<span class=\\\"fal fa-info-circle\\\"/> Please note: devices can only play audio in the MP3 format. Size limit: \";\noutput += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"maxFileSize\")),\"audio\"), env.opts.autoescape);\noutput += \"MB\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar content_oldRoot = content_obj.root;\ncontent_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcontent_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"content\": new nunjucks.Template( {obj: content_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar singleBase_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"selectra-single\\\">\\n\\t\\t<span class=\\\"head\\\">\\n\\t\\t\\t<span class=\\\"head-image fa\\\"/>\\n\\t\\t</span>\\n\\t\\t<span class=\\\"elements\\\">\\n\\t\\t\\t<span class=\\\"placeholder\\\">\";\noutput += runtime.suppressValue((lineno = 6, colno = 41, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"placeholder\"), \"placeholder\", context, [])), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t\\t<span class=\\\"text hide\\\"></span>\\n\\t\\t</span>\\n\\t\\t<span class=\\\"tail\\\">\\n\\t\\t\\t\";\nif((lineno = 10, colno = 21, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"singleDeselect\"), \"singleDeselect\", context, []))) {\noutput += \"\\n\\t\\t\\t\\t<span class=\\\"global-close hide fal fa-times-circle\\\"/>\\n\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t<span class=\\\"fal fa-chevron-down \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"disabled\")?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\"/>\\n\\t\\t</span>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar singleBase_oldRoot = singleBase_obj.root;\nsingleBase_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tsingleBase_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar multiBase_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"selectra-multi\\\">\\n\\t\\t<!--<div class=\\\"spinner hide\\\"><span class=\\\"spinner-icon spinner-small\\\"/> Fetching...</div>-->\\n\\t\\t<div class=\\\"placeholder hide\\\">\";\noutput += runtime.suppressValue((lineno = 3, colno = 44, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"placeholder\"), \"placeholder\", context, [])), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t<div class=\\\"items\\\"></div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar multiBase_oldRoot = multiBase_obj.root;\nmultiBase_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmultiBase_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar multiItem_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"closer fal fa-times-circle \";\noutput += runtime.suppressValue(((lineno = 1, colno = 59, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"deselectable\"), \"deselectable\", context, []))?\"\":\"hide\"), env.opts.autoescape);\noutput += \"\\\"></div>\\n\\t<div class=\\\"text\\\" title=\\\"\";\noutput += runtime.suppressValue((lineno = 2, colno = 32, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"value\"), \"value\", context, [])), env.opts.autoescape);\noutput += \"\\\">\\n\\t\";\nif((lineno = 3, colno = 10, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"icons\"), \"icons\", context, [])) && runtime.contextOrFrameLookup(context, frame, \"icon\")) {\noutput += \"\\n\\t\\t<span class=\\\"fa \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"icon\"), env.opts.autoescape);\noutput += \"\\\"/>\\n\\t\";\n;\n}\noutput += \"\\n\\t\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, (lineno = 6, colno = 7, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"value\"), \"value\", context, []))), env.opts.autoescape);\noutput += \"</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar multiItem_oldRoot = multiItem_obj.root;\nmultiItem_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmultiItem_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar dropdownHost_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"container\\\">\\n\\t\\t<div class=\\\"chosen hide\\\"></div>\\n\\t\\t<div class=\\\"search hide\\\">\\n\\t\\t\\t<!-- \\\"zax\\\" is not a valid input type. This ensures we do not inherit the aggressive styles of Foundation. -->\\n\\t\\t\\t<input type=\\\"zax\\\"><div class=\\\"search-icon fal fa-search\\\"/></input>\\n\\t\\t\\t<div class=\\\"spinner hide\\\"><span class=\\\"spinner-icon spinner-small\\\"/> Fetching...</div>\\n\\t\\t\\t<div class=\\\"clearer hide\\\"><span class=\\\"fal fa-times\\\" title=\\\"Clear search\\\"/></div>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"max-item-limit hide\\\"><span class=\\\"fal fa-exclamation-circle\\\"/> There are more items, but they cannot be shown automatically. Please search instead.</div>\\n\\t\\t<div class=\\\"items\\\">\\n\\t\\t\\t<div class=\\\"selections hide\\\">\\n\\t\\t\\t\\t<div class=\\\"remover\\\">Clear selected items</div>\\n\\t\\t\\t</div>\\n\\t\\t\\t<div class=\\\"dynamic-add hide\\\"></div>\\n\\t\\t</div>\\n\\t\\t\";\nif(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"allowCreation\")),\"mode\") == \"always\" || runtime.contextOrFrameLookup(context, frame, \"interactives\")) {\noutput += \"\\n\\t\\t\\t<div class=\\\"padded-bottom\\\"></div>\\n\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\";\nif(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"allowCreation\")),\"mode\") == \"always\") {\noutput += \"\\n\\t\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"donePadding\")) {\noutput += \"\\n\\t\\t\\t\\t<div class=\\\"padded-separator\\\"></div>\\n\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t\";\nvar t_1;\nt_1 = true;\nframe.set(\"donePadding\", t_1, true);\nif(frame.topLevel) {\ncontext.setVariable(\"donePadding\", t_1);\n}\nif(frame.topLevel) {\ncontext.addExport(\"donePadding\", t_1);\n}\noutput += \"\\n\\t\\t\\t<div class=\\\"add-new\\\">\\n\\t\\t\\t\\t\";\noutput += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"allowCreation\")),\"text\") || \"Click to add a new item\", env.opts.autoescape);\noutput += \"\\n\\t\\t\\t</div>\\n\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"interactives\")) {\noutput += \"\\n\\t\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"donePadding\")) {\noutput += \"\\n\\t\\t\\t\\t<div class=\\\"padded-separator\\\"></div>\\n\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t\";\nvar t_2;\nt_2 = true;\nframe.set(\"donePadding\", t_2, true);\nif(frame.topLevel) {\ncontext.setVariable(\"donePadding\", t_2);\n}\nif(frame.topLevel) {\ncontext.addExport(\"donePadding\", t_2);\n}\noutput += \"\\n\\t\\t\\t\";\nframe = frame.push();\nvar t_5 = runtime.contextOrFrameLookup(context, frame, \"interactives\");\nif(t_5) {var t_3;\nif(runtime.isArray(t_5)) {\nvar t_4 = t_5.length;\nfor(t_3=0; t_3 < t_5.length; t_3++) {\nvar t_6 = t_5[t_3][0]\nframe.set(\"key\", t_5[t_3][0]);\nvar t_7 = t_5[t_3][1]\nframe.set(\"item\", t_5[t_3][1]);\nframe.set(\"loop.index\", t_3 + 1);\nframe.set(\"loop.index0\", t_3);\nframe.set(\"loop.revindex\", t_4 - t_3);\nframe.set(\"loop.revindex0\", t_4 - t_3 - 1);\nframe.set(\"loop.first\", t_3 === 0);\nframe.set(\"loop.last\", t_3 === t_4 - 1);\nframe.set(\"loop.length\", t_4);\noutput += \"\\n\\t\\t\\t\\t<div class=\\\"interactive\\\" data-ident=\\\"\";\noutput += runtime.suppressValue(t_6, env.opts.autoescape);\noutput += \"\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.memberLookup((t_7),\"text\")), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t\";\n;\n}\n} else {\nt_3 = -1;\nvar t_4 = runtime.keys(t_5).length;\nfor(var t_8 in t_5) {\nt_3++;\nvar t_9 = t_5[t_8];\nframe.set(\"key\", t_8);\nframe.set(\"item\", t_9);\nframe.set(\"loop.index\", t_3 + 1);\nframe.set(\"loop.index0\", t_3);\nframe.set(\"loop.revindex\", t_4 - t_3);\nframe.set(\"loop.revindex0\", t_4 - t_3 - 1);\nframe.set(\"loop.first\", t_3 === 0);\nframe.set(\"loop.last\", t_3 === t_4 - 1);\nframe.set(\"loop.length\", t_4);\noutput += \"\\n\\t\\t\\t\\t<div class=\\\"interactive\\\" data-ident=\\\"\";\noutput += runtime.suppressValue(t_8, env.opts.autoescape);\noutput += \"\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.memberLookup((t_9),\"text\")), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t\";\n;\n}\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t\";\n;\n}\noutput += \"\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar dropdownHost_oldRoot = dropdownHost_obj.root;\ndropdownHost_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tdropdownHost_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar dropdownCategory_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span class=\\\"cat-name\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"key\")), env.opts.autoescape);\noutput += \"</span>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar dropdownCategory_oldRoot = dropdownCategory_obj.root;\ndropdownCategory_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tdropdownCategory_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar dropdownItem_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t\";\nif((lineno = 1, colno = 15, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"checkboxes\"), \"checkboxes\", context, []))) {\noutput += \"\\n\\t\\t<input type=\\\"checkbox\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"selected\")?\"checked\":\"\"), env.opts.autoescape);\noutput += \"></input>\\n\\t\";\n;\n}\noutput += \"\\n\\n\\t\";\nif((lineno = 5, colno = 10, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"icons\"), \"icons\", context, []))) {\noutput += \"\\n\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"icon\")) {\noutput += \"\\n\\t\\t\\t<span class=\\\"fa \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"icon\"), env.opts.autoescape);\noutput += \"\\\"/>\\n\\t\\t\";\n;\n}\nelse {\nif(runtime.contextOrFrameLookup(context, frame, \"image\")) {\noutput += \"\\n\\t\\t\\t<span class=\\\"image\\\"/>\\n\\t\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t\\t<span class=\\\"fa-filler\\\" style=\\\"background-color: #\";\noutput += runtime.suppressValue(env.getFilter(\"replace\").call(context, runtime.contextOrFrameLookup(context, frame, \"colour\"),\"#\",\"\"), env.opts.autoescape);\noutput += \"\\\"/>\\n\\t\\t\";\n;\n}\n;\n}\noutput += \"\\n\\t\";\n;\n}\noutput += \"\\n\\n\\t<span class=\\\"textual\\\">\\n\\t\\t<div class=\\\"value\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, (lineno = 16, colno = 27, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"value\"), \"value\", context, []))), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"desc\")) {\noutput += \"\\n\\t\\t\\t<div class=\\\"description\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"desc\")), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\";\n;\n}\noutput += \"\\n\\t</span>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar dropdownItem_oldRoot = dropdownItem_obj.root;\ndropdownItem_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tdropdownItem_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar expanded_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar expanded_oldRoot = expanded_obj.root;\nexpanded_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\texpanded_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"singleBase\": new nunjucks.Template( {obj: singleBase_obj, type: \"code\"}, env),\t\"multiBase\": new nunjucks.Template( {obj: multiBase_obj, type: \"code\"}, env),\t\"multiItem\": new nunjucks.Template( {obj: multiItem_obj, type: \"code\"}, env),\t\"dropdownHost\": new nunjucks.Template( {obj: dropdownHost_obj, type: \"code\"}, env),\t\"dropdownCategory\": new nunjucks.Template( {obj: dropdownCategory_obj, type: \"code\"}, env),\t\"dropdownItem\": new nunjucks.Template( {obj: dropdownItem_obj, type: \"code\"}, env),\t\"expanded\": new nunjucks.Template( {obj: expanded_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar item_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\";\nif(runtime.contextOrFrameLookup(context, frame, \"heading\")) {\noutput += \"\\n\\t<div class=\\\"simple-menu-heading\\\">\\n\\t\\t<div class=\\\"name\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"text\"), env.opts.autoescape);\noutput += \"</div>\\n\\t</div>\\n\";\n;\n}\nelse {\noutput += \"\\n\\t<div class=\\\"simple-menu-element\\\">\\n\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"set\")) {\noutput += \" <div class=\\\"check fa-circle \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"selected\")?\"fas\":\"fal\"), env.opts.autoescape);\noutput += \"\\\"></div> \";\n;\n}\noutput += \"\\n\\n\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"icon\")) {\noutput += \" <div class=\\\"icon fal \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"icon\"), env.opts.autoescape);\noutput += \"\\\"></div> \";\n;\n}\noutput += \"\\n\\n\\t\\t<div class=\\\"name\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"text\"), env.opts.autoescape);\noutput += \"</div>\\n\\t</div>\\n\";\n;\n}\noutput += \"\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar item_oldRoot = item_obj.root;\nitem_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\titem_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"item\": new nunjucks.Template( {obj: item_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\nvar macro_t_1 = runtime.makeMacro(\n[], \n[], \nfunction (kwargs) {\nframe = frame.push();\nkwargs = kwargs || {};\nif (kwargs.hasOwnProperty(\"caller\")) {\nframe.set(\"caller\", kwargs.caller); }\nvar t_2 = \"\";t_2 += \"\\n\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"addAnother\")) {\nt_2 += \"<label class=\\\"inline\\\"><input type=\\\"checkbox\\\" name=\\\"another\\\"> Create another</label>&nbsp;&nbsp;\";\n;\n}\nt_2 += \"\\n\\t<button type=\\\"button\\\" class=\\\"button basic ok \";\nt_2 += runtime.suppressValue((!runtime.contextOrFrameLookup(context, frame, \"warning\")?\"success\":\"alert\"), env.opts.autoescape);\nt_2 += \" \";\nt_2 += runtime.suppressValue((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"hideButtons\")),\"length\") == 0 || ((lineno = 2, colno = 140, runtime.callWrap(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"hideButtons\")),\"indexOf\"), \"hideButtons[\\\"indexOf\\\"]\", context, [\"ok\"])) == -1)?\"\":\"hide\"), env.opts.autoescape);\nt_2 += \"\\\">\";\nt_2 += runtime.suppressValue((!runtime.contextOrFrameLookup(context, frame, \"customOK\")?\"OK\":runtime.contextOrFrameLookup(context, frame, \"customOK\")), env.opts.autoescape);\nt_2 += \"</button>&nbsp;&nbsp;&nbsp;&nbsp;\\n\\t\";\nif(!runtime.contextOrFrameLookup(context, frame, \"hideButtons\") || (lineno = 3, colno = 43, runtime.callWrap(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"hideButtons\")),\"indexOf\"), \"hideButtons[\\\"indexOf\\\"]\", context, [\"cancel\"])) == -1) {\nt_2 += \"<button type=\\\"button\\\" class=\\\"button basic cancel secondary\\\">\";\nt_2 += runtime.suppressValue((!runtime.contextOrFrameLookup(context, frame, \"customCancel\")?\"Cancel\":runtime.contextOrFrameLookup(context, frame, \"customCancel\")), env.opts.autoescape);\nt_2 += \"</button>\";\n;\n}\nt_2 += \"\\n\\t&nbsp;&nbsp;&nbsp;&nbsp;<span class=\\\"spinner-icon hide main\\\"/> <span class=\\\"sub-message hide\\\"></span>\\n\";\n;\nframe = frame.pop();\nreturn new runtime.SafeString(t_2);\n});\ncontext.addExport(\"mainButtons\");\ncontext.setVariable(\"mainButtons\", macro_t_1);\noutput += \"\\n\\n\";\nvar macro_t_3 = runtime.makeMacro(\n[], \n[], \nfunction (kwargs) {\nframe = frame.push();\nkwargs = kwargs || {};\nif (kwargs.hasOwnProperty(\"caller\")) {\nframe.set(\"caller\", kwargs.caller); }\nvar t_4 = \"\";t_4 += \"\\n\\t\";\nframe = frame.push();\nvar t_7 = runtime.contextOrFrameLookup(context, frame, \"customButtons\");\nif(t_7) {var t_6 = t_7.length;\nfor(var t_5=0; t_5 < t_7.length; t_5++) {\nvar t_8 = t_7[t_5];\nframe.set(\"button\", t_8);\nframe.set(\"loop.index\", t_5 + 1);\nframe.set(\"loop.index0\", t_5);\nframe.set(\"loop.revindex\", t_6 - t_5);\nframe.set(\"loop.revindex0\", t_6 - t_5 - 1);\nframe.set(\"loop.first\", t_5 === 0);\nframe.set(\"loop.last\", t_5 === t_6 - 1);\nframe.set(\"loop.length\", t_6);\nt_4 += \"\\n\\t\\t<button type=\\\"button\\\" class=\\\"button basic \";\nt_4 += runtime.suppressValue((!runtime.memberLookup((t_8),\"type\")?\"secondary\":runtime.memberLookup((t_8),\"type\")), env.opts.autoescape);\nt_4 += \" \";\nt_4 += runtime.suppressValue(runtime.memberLookup((t_8),\"id\"), env.opts.autoescape);\nt_4 += \"\\\" data-id=\\\"\";\nt_4 += runtime.suppressValue(runtime.memberLookup((t_8),\"id\"), env.opts.autoescape);\nt_4 += \"\\\">\";\nt_4 += runtime.suppressValue(runtime.memberLookup((t_8),\"name\"), env.opts.autoescape);\nt_4 += \"</button>\\n\\t\";\n;\n}\n}\nframe = frame.pop();\nt_4 += \"\\n\";\n;\nframe = frame.pop();\nreturn new runtime.SafeString(t_4);\n});\ncontext.addExport(\"custButtons\");\ncontext.setVariable(\"custButtons\", macro_t_3);\noutput += \"\\n\\n<div class=\\\"modal-title \";\noutput += runtime.suppressValue((!runtime.contextOrFrameLookup(context, frame, \"warning\")?\"\":\"modal-warning\"), env.opts.autoescape);\noutput += \"\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"title\"), env.opts.autoescape);\noutput += \"</div>\\n<div class=\\\"modal-body\\\">\\n\\t\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"body\"), env.opts.autoescape);\noutput += \"\\n\\t<div class=\\\"modal-error hide\\\"></div>\\n</div>\\n<div class=\\\"modal-footer\\\">\\n\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"hasBody\")) {\noutput += \"\\n\\t\\t\";\nif(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"customButtons\")),\"length\")) {\noutput += \"\\n\\t\\t\\t<div class=\\\"modal-footer-left\\\"> \";\noutput += runtime.suppressValue((lineno = 21, colno = 47, runtime.callWrap(macro_t_3, \"custButtons\", context, [])), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t<div class=\\\"modal-footer-right\\\">\";\noutput += runtime.suppressValue((lineno = 22, colno = 47, runtime.callWrap(macro_t_1, \"mainButtons\", context, [])), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t\\t<div/>\\n\\t\\t\\t<div class=\\\"modal-footer-main\\\"> \";\noutput += runtime.suppressValue((lineno = 25, colno = 47, runtime.callWrap(macro_t_1, \"mainButtons\", context, [])), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t<div/>\\n\\t\\t\";\n;\n}\noutput += \"\\n\\t\";\n;\n}\noutput += \"\\n</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar blank_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar blank_oldRoot = blank_obj.root;\nblank_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tblank_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar loading_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span class=\\\"spinner-icon\\\" />\\n\\t\";\nif(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"message\")),\"length\") > 0) {\noutput += \"\\n\\t\\t<span>&nbsp;&nbsp;\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"message\"), env.opts.autoescape);\noutput += \"</span>\\n\\t\";\n;\n}\noutput += \"\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar loading_oldRoot = loading_obj.root;\nloading_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tloading_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"blank\": new nunjucks.Template( {obj: blank_obj, type: \"code\"}, env),\t\"loading\": new nunjucks.Template( {obj: loading_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"switch-selector\\\">\\n</div>\\n\\n<div class=\\\"switch-label-container\\\">\\n\\t<span class=\\\"switch-label\\\"></span>\\n</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar LoginView = require(\"./views/main\");\n\nvar Module = module.exports = new Backbone.Marionette.Application();\n\nvar radio = Backbone.Radio.channel(\"global\");\n\n// Add intra-module routing\nModule.routing = function (App) {\n\tModule.Router = {\n\t\troutes: {\n\t\t\t\"\": \"loginRoot\"\n\t\t},\n\n\t\tloginRoot: function loginRoot() {\n\t\t\tif (radio.request(App.Events.Requests.IsAuthenticated)) return this.navigate(\"/\", { trigger: true, replace: true });\n\n\t\t\tApp.loadView(new LoginView());\n\t\t}\n\t};\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIkxvZ2luVmlldyIsIk1vZHVsZSIsIm1vZHVsZSIsImV4cG9ydHMiLCJNYXJpb25ldHRlIiwiQXBwbGljYXRpb24iLCJyYWRpbyIsIlJhZGlvIiwiY2hhbm5lbCIsInJvdXRpbmciLCJSb3V0ZXIiLCJyb3V0ZXMiLCJsb2dpblJvb3QiLCJyZXF1ZXN0IiwiQXBwIiwiRXZlbnRzIiwiUmVxdWVzdHMiLCJJc0F1dGhlbnRpY2F0ZWQiLCJuYXZpZ2F0ZSIsInRyaWdnZXIiLCJyZXBsYWNlIiwibG9hZFZpZXciXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjs7QUFFQSxJQUFNQyxZQUFZRCxRQUFRLGNBQVIsQ0FBbEI7O0FBRUEsSUFBTUUsU0FBU0MsT0FBT0MsT0FBUCxHQUFpQixJQUFJTCxTQUFTTSxVQUFULENBQW9CQyxXQUF4QixFQUFoQzs7QUFFQSxJQUFNQyxRQUFRUixTQUFTUyxLQUFULENBQWVDLE9BQWYsQ0FBdUIsUUFBdkIsQ0FBZDs7QUFFQTtBQUNBUCxPQUFPUSxPQUFQLEdBQWlCLGVBQU87QUFDdkJSLFFBQU9TLE1BQVAsR0FBZ0I7QUFDZkMsVUFBUTtBQUNQLE9BQUk7QUFERyxHQURPOztBQUtmQyxhQUFXLHFCQUFXO0FBQ3JCLE9BQUlOLE1BQU1PLE9BQU4sQ0FBY0MsSUFBSUMsTUFBSixDQUFXQyxRQUFYLENBQW9CQyxlQUFsQyxDQUFKLEVBQ0MsT0FBTyxLQUFLQyxRQUFMLENBQWMsR0FBZCxFQUFtQixFQUFFQyxTQUFTLElBQVgsRUFBaUJDLFNBQVMsSUFBMUIsRUFBbkIsQ0FBUDs7QUFFRE4sT0FBSU8sUUFBSixDQUFhLElBQUlyQixTQUFKLEVBQWI7QUFDQTtBQVZjLEVBQWhCO0FBWUEsQ0FiRCIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5cbmNvbnN0IExvZ2luVmlldyA9IHJlcXVpcmUoXCIuL3ZpZXdzL21haW5cIik7XG5cbmNvbnN0IE1vZHVsZSA9IG1vZHVsZS5leHBvcnRzID0gbmV3IEJhY2tib25lLk1hcmlvbmV0dGUuQXBwbGljYXRpb24oKTtcblxuY29uc3QgcmFkaW8gPSBCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZ2xvYmFsXCIpO1xuXG4vLyBBZGQgaW50cmEtbW9kdWxlIHJvdXRpbmdcbk1vZHVsZS5yb3V0aW5nID0gQXBwID0+IHtcblx0TW9kdWxlLlJvdXRlciA9IHtcblx0XHRyb3V0ZXM6IHtcblx0XHRcdFwiXCI6IFwibG9naW5Sb290XCIsXG5cdFx0fSxcblxuXHRcdGxvZ2luUm9vdDogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAocmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLklzQXV0aGVudGljYXRlZCkpXG5cdFx0XHRcdHJldHVybiB0aGlzLm5hdmlnYXRlKFwiL1wiLCB7IHRyaWdnZXI6IHRydWUsIHJlcGxhY2U6IHRydWUgfSk7XG5cblx0XHRcdEFwcC5sb2FkVmlldyhuZXcgTG9naW5WaWV3KCkpO1xuXHRcdH0sXG5cdH07XG59O1xuIl19",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"login-block\\\">\\n\\t\";\nif(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"auth\")),\"itsi\")) {\noutput += \"\\n\\t<form>\\n\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t<div class=\\\"large-12 medium-12 small-12 columns\\\">\\n\\t\\t\\t\\t<h1 class=\\\"server-name\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"serverName\")), env.opts.autoescape);\noutput += \"</h1>\\n\\t\\t\\t</div>\\n\\t\\t\\t<div class=\\\"large-12 medium-12 small-12 columns\\\">\\n\\t\\t\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"handoff\")) {\noutput += \"\\n\\t\\t\\t\\t\\t<h5 class=\\\"handoff\\\"><strong>\";\noutput += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"handoffMap\")),runtime.contextOrFrameLookup(context, frame, \"handoff\")), env.opts.autoescape);\noutput += \"</strong> has asked you to log in before you can proceed.<br/><br/>\\n\\n\\t\\t\\t\\t\\tYou will automatically be redirected back to your previous page after successfully logging in.</h5>\\n\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t<h5>Please enter your login details below. Note that all details are case sensitive.</h5>\\n\\t\\t\\t</div>\\n\\t\\t\\t<div class=\\\"large-12 medium-12 small-12 columns\\\">\\n\\t\\t\\t\\t<label>Username\\n\\t\\t\\t\\t\\t<input type=\\\"text\\\" role=\\\"username\\\" name=\\\"username\\\"/>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"large-12 medium-12 small-12 columns\\\">\\n\\t\\t\\t\\t<label>Password\\n\\t\\t\\t\\t\\t<input type=\\\"password\\\" role=\\\"password\\\" name=\\\"password\\\" />\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"large-12 medium-12 small-12 columns login-btn-container\\\">\\n\\t\\t\\t\\t<input type=\\\"submit\\\" value=\\\"Log In\\\" class=\\\"button\\\"/> <span class=\\\"spinner-icon hide\\\"></span> <span class=\\\"info-text\\\"></span>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</form>\\n\\t\";\n;\n}\noutput += \"\\n\\n\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"someOAuth\")) {\noutput += \"\\n\\t\\t<div class=\\\"oauth\\\">\\n\\t\\t\\t<span class=\\\"or\\\">or</span>\\n\\n\\t\\t\\t\";\nif(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"auth\")),\"google\")),\"enabled\")) {\noutput += \"\\n\\t\\t\\t<a href=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"urlRoot\"), env.opts.autoescape);\noutput += \"/auth/google\\\" class=\\\"google-btn\\\">\\n\\t\\t\\t\\t<button class=\\\"loginBtn loginBtn--google\\\">\\n\\t\\t\\t\\t  <span class=\\\"fab fa-google\\\"/>  Log in with Google\\n\\t\\t\\t\\t</button>\\n\\t\\t\\t</a>\\n\\t\\t\\t\";\n;\n}\noutput += \"\\n\\n\\t\\t\\t\";\nif(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"auth\")),\"microsoft\")),\"enabled\")) {\noutput += \"\\n\\t\\t\\t<a href=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"urlRoot\"), env.opts.autoescape);\noutput += \"/auth/microsoft\\\" class=\\\"microsoft-btn\\\">\\n\\t\\t\\t\\t<button class=\\\"loginBtn loginBtn--microsoft\\\">\\n\\t\\t\\t\\t  <span class=\\\"fab fa-microsoft\\\"/> Log in with Microsoft\\n\\t\\t\\t\\t</button>\\n\\t\\t\\t</a>\\n\\t\\t\\t\";\n;\n}\noutput += \"\\n\\n\\t\\t\\t\";\nif(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"auth\")),\"facebook\")),\"enabled\")) {\noutput += \"\\n\\t\\t\\t<a href=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"urlRoot\"), env.opts.autoescape);\noutput += \"/auth/facebook\\\" class=\\\"facebook-btn\\\">\\n\\t\\t\\t\\t<button class=\\\"loginBtn loginBtn--facebook\\\">\\n\\t\\t\\t\\t  <span class=\\\"fab fa-facebook\\\"/> Log in with Facebook\\n\\t\\t\\t\\t</button>\\n\\t\\t\\t</a>\\n\\t\\t\\t\";\n;\n}\noutput += \"\\n\\n\\t\\t\\t\";\nif(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"auth\")),\"custom\")),\"enabled\")) {\noutput += \"\\n\\t\\t\\t<a href=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"urlRoot\"), env.opts.autoescape);\noutput += \"/auth/custom\\\" class=\\\"custom-btn\\\">\\n\\t\\t\\t\\t<button class=\\\"loginBtn loginBtn--custom\\\">\\n\\t\\t\\t\\t  <span class=\\\"fas fa-user\\\"/>  Log in with \";\noutput += runtime.suppressValue(runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"auth\")),\"custom\")),\"name\"), env.opts.autoescape);\noutput += \"\\n\\t\\t\\t\\t</button>\\n\\t\\t\\t</a>\\n\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t</div>\\n\\t\";\n;\n}\noutput += \"\\n</div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar Backbone = require(\"backbone\");\nvar _ = require(\"lodash\");\n\nvar App = require(\"../../index\");\n\nvar radio = Backbone.Radio.channel(\"global\");\nvar settings = require(\"app-settings\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"content login-content\",\n\n\ttemplate: require(\"../templates/main.nunj\"),\n\n\tevents: {\n\t\t\"click @ui.button\": \"login\",\n\t\t\"click @ui.forgotPass\": \"forgotPassword\",\n\t\t\"click @ui.token\": \"giveToken\"\n\t},\n\n\tui: {\n\t\tusername: \"input[role='username']\",\n\t\tpassword: \"input[role='password']\",\n\t\tbutton: \"input[type='submit']\",\n\t\tinfo: \"span.info-text\",\n\t\tspinner: \"span.spinner-icon\",\n\t\tforgotPass: \"a.forgot-password\",\n\t\ttoken: \"a.password-token\",\n\t\toauth: \"div.oauth\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tauth: settings.auth,\n\t\t\tsomeOAuth: _.reduce(settings.auth, function (sum, num, k) {\n\t\t\t\tif (k !== \"itsi\" && k !== \"ldap\" && num.enabled) return true;return sum;\n\t\t\t}, false),\n\t\t\thandoff: window.localStorage.getItem(\"handoff\"),\n\t\t\thandoffMap: {\n\t\t\t\trealtime: \"CAM\",\n\t\t\t\tanswers: \"Analytics\",\n\t\t\t\tmonitor: \"CAM\",\n\t\t\t\tresourcestore: \"Resource Store\",\n\t\t\t\t\"analytics-beta\": \"Analytics\",\n\t\t\t\tanalytics: \"Analytics\",\n\t\t\t\tlessons: \"Digital Lessons\",\n\t\t\t\t\"insights.it.si\": \"miEbooks Insights\",\n\t\t\t\t\"insights.myitsi.com\": \"miEbooks Insights\",\n\t\t\t\t\"lessons.myitsi.com\": \"Digital Lessons\",\n\t\t\t\t\"insights.dev.it.si\": \"miEbooks Insights (Dev)\"\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.listenTo(radio, App.Events.LoginSuccess, this.success.bind(this));\n\t\tthis.listenTo(radio, App.Events.LoginFailure, this.failure.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\tif (window.localStorage.getItem(\"handoff\")) {\n\t\t\t// If this is a handoff, change the logo\n\t\t\t$(\"div.logo-host\", document).get(0).classList.forEach(function (x) {\n\t\t\t\tif (x !== \"logo-host\") $(\"div.logo-host\", document).removeClass(x);\n\t\t\t});\n\n\t\t\t$(\"div.logo-host\", document).addClass(window.localStorage.getItem(\"handoff\").replace(/\\./g, \"-\"));\n\t\t} else {\n\t\t\t// Display the footer if this isn't a handoff\n\t\t\t$(\"footer\", document).removeClass(\"hide\");\n\t\t}\n\n\t\tthis.ui.username.focus();\n\n\t\tvar qs = require(\"querystring\").parse((window.location.search || \" \").slice(1));\n\n\t\tif (qs.username) this.ui.username.val(qs.username);\n\t\tif (qs.password) this.ui.password.val(qs.password);\n\n\t\tif (qs.autoLogin) this.ui.button.click();\n\n\t\tif (qs.error) this.ui.info.addClass(\"error\").text(\"Login failed: \" + qs.error);\n\t},\n\n\tlogin: function login(evt) {\n\t\tevt.preventDefault();\n\n\t\tradio.trigger(App.Events.Commands.Login, { username: this.ui.username.val(), password: this.ui.password.val(), handoff: Boolean(window.localStorage.getItem(\"handoff\")) });\n\t\tthis.ui.button.attr(\"disabled\", true);\n\n\t\tthis.ui.spinner.removeClass(\"hide\");\n\t\tthis.ui.button.addClass(\"hide\");\n\n\t\tthis.ui.info.removeClass(\"error\").text(\"Logging in...\");\n\n\t\t//If there is a handoff stored in localStorage, remove it\n\t\tif (window.localStorage.getItem(\"handoff\")) window.localStorage.removeItem(\"handoff\");\n\t},\n\n\tsuccess: function success() {\n\t\tradio.trigger(App.Events.Commands.Navigate, null);\n\t},\n\n\tfailure: function failure(err) {\n\t\tthis.ui.spinner.addClass(\"hide\");\n\t\tthis.ui.info.addClass(\"error\").text(\"Login failed: \" + (err.detail || err.info));\n\t\tthis.ui.button.attr(\"disabled\", false);\n\n\t\tthis.ui.button.removeClass(\"hide\");\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\t// Hide the footer before we leave this page\n\t\t$(\"footer\", document).addClass(\"hide\");\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1haW4uanMiXSwibmFtZXMiOlsiJCIsInJlcXVpcmUiLCJCYWNrYm9uZSIsIl8iLCJBcHAiLCJyYWRpbyIsIlJhZGlvIiwiY2hhbm5lbCIsInNldHRpbmdzIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiZXh0ZW5kIiwidGFnTmFtZSIsImNsYXNzTmFtZSIsInRlbXBsYXRlIiwiZXZlbnRzIiwidWkiLCJ1c2VybmFtZSIsInBhc3N3b3JkIiwiYnV0dG9uIiwiaW5mbyIsInNwaW5uZXIiLCJmb3Jnb3RQYXNzIiwidG9rZW4iLCJvYXV0aCIsInRlbXBsYXRlQ29udGV4dCIsImF1dGgiLCJzb21lT0F1dGgiLCJyZWR1Y2UiLCJzdW0iLCJudW0iLCJrIiwiZW5hYmxlZCIsImhhbmRvZmYiLCJ3aW5kb3ciLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwiaGFuZG9mZk1hcCIsInJlYWx0aW1lIiwiYW5zd2VycyIsIm1vbml0b3IiLCJyZXNvdXJjZXN0b3JlIiwiYW5hbHl0aWNzIiwibGVzc29ucyIsImluaXRpYWxpemUiLCJsaXN0ZW5UbyIsIkV2ZW50cyIsIkxvZ2luU3VjY2VzcyIsInN1Y2Nlc3MiLCJiaW5kIiwiTG9naW5GYWlsdXJlIiwiZmFpbHVyZSIsIm9uUmVuZGVyIiwiZG9jdW1lbnQiLCJnZXQiLCJjbGFzc0xpc3QiLCJmb3JFYWNoIiwieCIsInJlbW92ZUNsYXNzIiwiYWRkQ2xhc3MiLCJyZXBsYWNlIiwiZm9jdXMiLCJxcyIsInBhcnNlIiwibG9jYXRpb24iLCJzZWFyY2giLCJzbGljZSIsInZhbCIsImF1dG9Mb2dpbiIsImNsaWNrIiwiZXJyb3IiLCJ0ZXh0IiwibG9naW4iLCJldnQiLCJwcmV2ZW50RGVmYXVsdCIsInRyaWdnZXIiLCJDb21tYW5kcyIsIkxvZ2luIiwiQm9vbGVhbiIsImF0dHIiLCJyZW1vdmVJdGVtIiwiTmF2aWdhdGUiLCJlcnIiLCJkZXRhaWwiLCJvbkJlZm9yZURlc3Ryb3kiXSwibWFwcGluZ3Mi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aWxlIjoibWFpbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuXG5jb25zdCBBcHAgPSByZXF1aXJlKFwiLi4vLi4vaW5kZXhcIik7XG5cbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogXCJkaXZcIixcblx0Y2xhc3NOYW1lOiBcImNvbnRlbnQgbG9naW4tY29udGVudFwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL21haW4ubnVualwiKSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5idXR0b25cIjogXCJsb2dpblwiLFxuXHRcdFwiY2xpY2sgQHVpLmZvcmdvdFBhc3NcIjogXCJmb3Jnb3RQYXNzd29yZFwiLFxuXHRcdFwiY2xpY2sgQHVpLnRva2VuXCI6IFwiZ2l2ZVRva2VuXCIsXG5cdH0sXG5cblx0dWk6IHtcblx0XHR1c2VybmFtZTogXCJpbnB1dFtyb2xlPSd1c2VybmFtZSddXCIsXG5cdFx0cGFzc3dvcmQ6IFwiaW5wdXRbcm9sZT0ncGFzc3dvcmQnXVwiLFxuXHRcdGJ1dHRvbjogXCJpbnB1dFt0eXBlPSdzdWJtaXQnXVwiLFxuXHRcdGluZm86IFwic3Bhbi5pbmZvLXRleHRcIixcblx0XHRzcGlubmVyOiBcInNwYW4uc3Bpbm5lci1pY29uXCIsXG5cdFx0Zm9yZ290UGFzczogXCJhLmZvcmdvdC1wYXNzd29yZFwiLFxuXHRcdHRva2VuOiBcImEucGFzc3dvcmQtdG9rZW5cIixcblx0XHRvYXV0aDogXCJkaXYub2F1dGhcIixcblx0fSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRhdXRoOiBzZXR0aW5ncy5hdXRoLFxuXHRcdFx0c29tZU9BdXRoOiBfLnJlZHVjZShzZXR0aW5ncy5hdXRoLCAoc3VtLCBudW0sIGspID0+IHsgaWYgKGsgIT09IFwiaXRzaVwiICYmIGsgIT09IFwibGRhcFwiICYmIG51bS5lbmFibGVkKSByZXR1cm4gdHJ1ZTsgcmV0dXJuIHN1bTsgfSwgZmFsc2UpLFxuXHRcdFx0aGFuZG9mZjogd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGFuZG9mZlwiKSxcblx0XHRcdGhhbmRvZmZNYXA6IHtcblx0XHRcdFx0cmVhbHRpbWU6IFwiQ0FNXCIsXG5cdFx0XHRcdGFuc3dlcnM6IFwiQW5hbHl0aWNzXCIsXG5cdFx0XHRcdG1vbml0b3I6IFwiQ0FNXCIsXG5cdFx0XHRcdHJlc291cmNlc3RvcmU6IFwiUmVzb3VyY2UgU3RvcmVcIixcblx0XHRcdFx0XCJhbmFseXRpY3MtYmV0YVwiOiBcIkFuYWx5dGljc1wiLFxuXHRcdFx0XHRhbmFseXRpY3M6IFwiQW5hbHl0aWNzXCIsXG5cdFx0XHRcdGxlc3NvbnM6IFwiRGlnaXRhbCBMZXNzb25zXCIsXG5cdFx0XHRcdFwiaW5zaWdodHMuaXQuc2lcIjogXCJtaUVib29rcyBJbnNpZ2h0c1wiLFxuXHRcdFx0XHRcImluc2lnaHRzLm15aXRzaS5jb21cIjogXCJtaUVib29rcyBJbnNpZ2h0c1wiLFxuXHRcdFx0XHRcImxlc3NvbnMubXlpdHNpLmNvbVwiOiBcIkRpZ2l0YWwgTGVzc29uc1wiLFxuXHRcdFx0XHRcImluc2lnaHRzLmRldi5pdC5zaVwiOiBcIm1pRWJvb2tzIEluc2lnaHRzIChEZXYpXCIsXG5cdFx0XHR9LFxuXHRcdH07XG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5saXN0ZW5UbyhyYWRpbywgQXBwLkV2ZW50cy5Mb2dpblN1Y2Nlc3MsIHRoaXMuc3VjY2Vzcy5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKHJhZGlvLCBBcHAuRXZlbnRzLkxvZ2luRmFpbHVyZSwgdGhpcy5mYWlsdXJlLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRpZiAod2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGFuZG9mZlwiKSkge1xuXHRcdFx0Ly8gSWYgdGhpcyBpcyBhIGhhbmRvZmYsIGNoYW5nZSB0aGUgbG9nb1xuXHRcdFx0JChcImRpdi5sb2dvLWhvc3RcIiwgZG9jdW1lbnQpLmdldCgwKS5jbGFzc0xpc3QuZm9yRWFjaCh4ID0+IHtcblx0XHRcdFx0aWYgKHggIT09IFwibG9nby1ob3N0XCIpXG5cdFx0XHRcdFx0JChcImRpdi5sb2dvLWhvc3RcIiwgZG9jdW1lbnQpLnJlbW92ZUNsYXNzKHgpO1xuXHRcdFx0fSk7XG5cblx0XHRcdCQoXCJkaXYubG9nby1ob3N0XCIsIGRvY3VtZW50KS5hZGRDbGFzcyh3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJoYW5kb2ZmXCIpLnJlcGxhY2UoL1xcLi9nLCBcIi1cIikpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdC8vIERpc3BsYXkgdGhlIGZvb3RlciBpZiB0aGlzIGlzbid0IGEgaGFuZG9mZlxuXHRcdFx0JChcImZvb3RlclwiLCBkb2N1bWVudCkucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblxuXHRcdHRoaXMudWkudXNlcm5hbWUuZm9jdXMoKTtcblxuXHRcdGNvbnN0IHFzID0gcmVxdWlyZShcInF1ZXJ5c3RyaW5nXCIpLnBhcnNlKCh3aW5kb3cubG9jYXRpb24uc2VhcmNoIHx8IFwiIFwiKS5zbGljZSgxKSk7XG5cblx0XHRpZiAocXMudXNlcm5hbWUpXG5cdFx0XHR0aGlzLnVpLnVzZXJuYW1lLnZhbChxcy51c2VybmFtZSk7XG5cdFx0aWYgKHFzLnBhc3N3b3JkKVxuXHRcdFx0dGhpcy51aS5wYXNzd29yZC52YWwocXMucGFzc3dvcmQpO1xuXG5cdFx0aWYgKHFzLmF1dG9Mb2dpbilcblx0XHRcdHRoaXMudWkuYnV0dG9uLmNsaWNrKCk7XG5cblx0XHRpZiAocXMuZXJyb3IpXG5cdFx0XHR0aGlzLnVpLmluZm8uYWRkQ2xhc3MoXCJlcnJvclwiKS50ZXh0KFwiTG9naW4gZmFpbGVkOiBcIiArIChxcy5lcnJvcikpO1xuXHR9LFxuXG5cdGxvZ2luOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5Mb2dpbiwgeyB1c2VybmFtZTogdGhpcy51aS51c2VybmFtZS52YWwoKSwgcGFzc3dvcmQ6IHRoaXMudWkucGFzc3dvcmQudmFsKCksIGhhbmRvZmY6IEJvb2xlYW4od2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiaGFuZG9mZlwiKSkgfSk7XG5cdFx0dGhpcy51aS5idXR0b24uYXR0cihcImRpc2FibGVkXCIsIHRydWUpO1xuXG5cdFx0dGhpcy51aS5zcGlubmVyLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLmJ1dHRvbi5hZGRDbGFzcyhcImhpZGVcIik7XG5cblx0XHR0aGlzLnVpLmluZm8ucmVtb3ZlQ2xhc3MoXCJlcnJvclwiKS50ZXh0KFwiTG9nZ2luZyBpbi4uLlwiKTtcblxuXHRcdC8vSWYgdGhlcmUgaXMgYSBoYW5kb2ZmIHN0b3JlZCBpbiBsb2NhbFN0b3JhZ2UsIHJlbW92ZSBpdFxuXHRcdGlmICh3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJoYW5kb2ZmXCIpKVxuXHRcdFx0d2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFwiaGFuZG9mZlwiKTtcblx0fSxcblxuXHRzdWNjZXNzOiBmdW5jdGlvbigpIHtcblx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuTmF2aWdhdGUsIG51bGwpO1xuXHR9LFxuXG5cdGZhaWx1cmU6IGZ1bmN0aW9uKGVycikge1xuXHRcdHRoaXMudWkuc3Bpbm5lci5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5pbmZvLmFkZENsYXNzKFwiZXJyb3JcIikudGV4dChcIkxvZ2luIGZhaWxlZDogXCIgKyAoZXJyLmRldGFpbCB8fCBlcnIuaW5mbykpO1xuXHRcdHRoaXMudWkuYnV0dG9uLmF0dHIoXCJkaXNhYmxlZFwiLCBmYWxzZSk7XG5cblx0XHR0aGlzLnVpLmJ1dHRvbi5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHQvLyBIaWRlIHRoZSBmb290ZXIgYmVmb3JlIHdlIGxlYXZlIHRoaXMgcGFnZVxuXHRcdCQoXCJmb290ZXJcIiwgZG9jdW1lbnQpLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0fSxcbn0pOyJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar DeviceBindings = require(\"./views/deviceBindings\");\nvar ExceptionConsole = require(\"./views/exceptionConsole/layout\");\nvar Newsletter = require(\"./views/newsletter\");\nvar Reports = require(\"./views/reports\");\nvar UserRoleViewer = require(\"./views/userRoleViewer\");\nvar SessionViewer = require(\"./views/sessions\");\nvar GreyLabeling = require(\"./views/greyLabeling\");\nvar ServicesViewer = require(\"./views/services\");\nvar Tranches = require(\"./views/manageTokens\");\nvar Licenses = require(\"./views/manageLicenses\");\n\nvar Module = module.exports = new Backbone.Marionette.Application();\n\n// Add intra-module routing\nModule.routing = function (App) {\n\tModule.Router = {\n\t\troutes: {\n\t\t\tdataDownload: \"dataDownload\",\n\t\t\t\"device-binding\": \"bindings\",\n\t\t\texceptionConsole: \"exceptionConsole\",\n\t\t\tnewsletter: \"newsletter\",\n\t\t\t\"reports(/:report)\": \"reports\",\n\t\t\tuserRoleViewer: \"userRoleViewer\",\n\t\t\tsessions: \"sessions\",\n\t\t\tgreyLabeling: \"greyLabeling\",\n\t\t\tservices: \"services\",\n\t\t\ttokens: \"tokens\",\n\t\t\tlicenses: \"licenses\"\n\t\t},\n\n\t\tbindings: function bindings() {\n\t\t\tApp.loadView(new DeviceBindings());\n\t\t},\n\n\t\tnewsletter: function newsletter() {\n\t\t\tApp.loadView(new Newsletter());\n\t\t},\n\n\t\treports: function reports(report) {\n\t\t\tApp.loadView(new Reports({ report: report }));\n\t\t},\n\n\t\texceptionConsole: function exceptionConsole() {\n\t\t\tApp.loadView(new ExceptionConsole());\n\t\t},\n\n\t\tuserRoleViewer: function userRoleViewer() {\n\t\t\tApp.loadView(new UserRoleViewer());\n\t\t},\n\n\t\tsessions: function sessions() {\n\t\t\tApp.loadView(new SessionViewer());\n\t\t},\n\n\t\tgreyLabeling: function greyLabeling() {\n\t\t\tApp.loadView(new GreyLabeling());\n\t\t},\n\n\t\tservices: function services() {\n\t\t\tApp.loadView(new ServicesViewer());\n\t\t},\n\n\t\ttokens: function tokens() {\n\t\t\tApp.loadView(new Tranches());\n\t\t},\n\n\t\tlicenses: function licenses() {\n\t\t\tApp.loadView(new Licenses());\n\t\t}\n\t};\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIkRldmljZUJpbmRpbmdzIiwiRXhjZXB0aW9uQ29uc29sZSIsIk5ld3NsZXR0ZXIiLCJSZXBvcnRzIiwiVXNlclJvbGVWaWV3ZXIiLCJTZXNzaW9uVmlld2VyIiwiR3JleUxhYmVsaW5nIiwiU2VydmljZXNWaWV3ZXIiLCJUcmFuY2hlcyIsIkxpY2Vuc2VzIiwiTW9kdWxlIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1hcmlvbmV0dGUiLCJBcHBsaWNhdGlvbiIsInJvdXRpbmciLCJSb3V0ZXIiLCJyb3V0ZXMiLCJkYXRhRG93bmxvYWQiLCJleGNlcHRpb25Db25zb2xlIiwibmV3c2xldHRlciIsInVzZXJSb2xlVmlld2VyIiwic2Vzc2lvbnMiLCJncmV5TGFiZWxpbmciLCJzZXJ2aWNlcyIsInRva2VucyIsImxpY2Vuc2VzIiwiYmluZGluZ3MiLCJBcHAiLCJsb2FkVmlldyIsInJlcG9ydHMiLCJyZXBvcnQiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjs7QUFFQSxJQUFNQyxpQkFBaUJELFFBQVEsd0JBQVIsQ0FBdkI7QUFDQSxJQUFNRSxtQkFBbUJGLFFBQVEsaUNBQVIsQ0FBekI7QUFDQSxJQUFNRyxhQUFhSCxRQUFRLG9CQUFSLENBQW5CO0FBQ0EsSUFBTUksVUFBVUosUUFBUSxpQkFBUixDQUFoQjtBQUNBLElBQU1LLGlCQUFpQkwsUUFBUSx3QkFBUixDQUF2QjtBQUNBLElBQU1NLGdCQUFnQk4sUUFBUSxrQkFBUixDQUF0QjtBQUNBLElBQU1PLGVBQWVQLFFBQVEsc0JBQVIsQ0FBckI7QUFDQSxJQUFNUSxpQkFBaUJSLFFBQVEsa0JBQVIsQ0FBdkI7QUFDQSxJQUFNUyxXQUFXVCxRQUFRLHNCQUFSLENBQWpCO0FBQ0EsSUFBTVUsV0FBV1YsUUFBUSx3QkFBUixDQUFqQjs7QUFFQSxJQUFNVyxTQUFTQyxPQUFPQyxPQUFQLEdBQWlCLElBQUlkLFNBQVNlLFVBQVQsQ0FBb0JDLFdBQXhCLEVBQWhDOztBQUVBO0FBQ0FKLE9BQU9LLE9BQVAsR0FBaUIsZUFBTztBQUN2QkwsUUFBT00sTUFBUCxHQUFnQjtBQUNmQyxVQUFRO0FBQ1BDLGlCQUFjLGNBRFA7QUFFUCxxQkFBa0IsVUFGWDtBQUdQQyxxQkFBa0Isa0JBSFg7QUFJUEMsZUFBWSxZQUpMO0FBS1Asd0JBQXFCLFNBTGQ7QUFNUEMsbUJBQWdCLGdCQU5UO0FBT1BDLGFBQVUsVUFQSDtBQVFQQyxpQkFBYyxjQVJQO0FBU1BDLGFBQVUsVUFUSDtBQVVQQyxXQUFRLFFBVkQ7QUFXUEMsYUFBVTtBQVhILEdBRE87O0FBZWZDLFlBQVUsb0JBQVc7QUFDcEJDLE9BQUlDLFFBQUosQ0FBYSxJQUFJN0IsY0FBSixFQUFiO0FBQ0EsR0FqQmM7O0FBbUJmb0IsY0FBWSxzQkFBVztBQUN0QlEsT0FBSUMsUUFBSixDQUFhLElBQUkzQixVQUFKLEVBQWI7QUFDQSxHQXJCYzs7QUF1QmY0QixXQUFTLGlCQUFTQyxNQUFULEVBQWlCO0FBQ3pCSCxPQUFJQyxRQUFKLENBQWEsSUFBSTFCLE9BQUosQ0FBWSxFQUFFNEIsUUFBUUEsTUFBVixFQUFaLENBQWI7QUFDQSxHQXpCYzs7QUEyQmZaLG9CQUFrQiw0QkFBVztBQUM1QlMsT0FBSUMsUUFBSixDQUFhLElBQUk1QixnQkFBSixFQUFiO0FBQ0EsR0E3QmM7O0FBK0Jmb0Isa0JBQWdCLDBCQUFXO0FBQzFCTyxPQUFJQyxRQUFKLENBQWEsSUFBSXpCLGNBQUosRUFBYjtBQUNBLEdBakNjOztBQW1DZmtCLFlBQVUsb0JBQVc7QUFDcEJNLE9BQUlDLFFBQUosQ0FBYSxJQUFJeEIsYUFBSixFQUFiO0FBQ0EsR0FyQ2M7O0FBdUNma0IsZ0JBQWMsd0JBQVc7QUFDeEJLLE9BQUlDLFFBQUosQ0FBYSxJQUFJdkIsWUFBSixFQUFiO0FBQ0EsR0F6Q2M7O0FBMkNma0IsWUFBVSxvQkFBVztBQUNwQkksT0FBSUMsUUFBSixDQUFhLElBQUl0QixjQUFKLEVBQWI7QUFDQSxHQTdDYzs7QUErQ2ZrQixVQUFRLGtCQUFXO0FBQ2xCRyxPQUFJQyxRQUFKLENBQWEsSUFBSXJCLFFBQUosRUFBYjtBQUNBLEdBakRjOztBQW1EZmtCLFlBQVUsb0JBQVc7QUFDcEJFLE9BQUlDLFFBQUosQ0FBYSxJQUFJcEIsUUFBSixFQUFiO0FBQ0E7QUFyRGMsRUFBaEI7QUF1REEsQ0F4REQiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuXG5jb25zdCBEZXZpY2VCaW5kaW5ncyA9IHJlcXVpcmUoXCIuL3ZpZXdzL2RldmljZUJpbmRpbmdzXCIpO1xuY29uc3QgRXhjZXB0aW9uQ29uc29sZSA9IHJlcXVpcmUoXCIuL3ZpZXdzL2V4Y2VwdGlvbkNvbnNvbGUvbGF5b3V0XCIpO1xuY29uc3QgTmV3c2xldHRlciA9IHJlcXVpcmUoXCIuL3ZpZXdzL25ld3NsZXR0ZXJcIik7XG5jb25zdCBSZXBvcnRzID0gcmVxdWlyZShcIi4vdmlld3MvcmVwb3J0c1wiKTtcbmNvbnN0IFVzZXJSb2xlVmlld2VyID0gcmVxdWlyZShcIi4vdmlld3MvdXNlclJvbGVWaWV3ZXJcIik7XG5jb25zdCBTZXNzaW9uVmlld2VyID0gcmVxdWlyZShcIi4vdmlld3Mvc2Vzc2lvbnNcIik7XG5jb25zdCBHcmV5TGFiZWxpbmcgPSByZXF1aXJlKFwiLi92aWV3cy9ncmV5TGFiZWxpbmdcIik7XG5jb25zdCBTZXJ2aWNlc1ZpZXdlciA9IHJlcXVpcmUoXCIuL3ZpZXdzL3NlcnZpY2VzXCIpO1xuY29uc3QgVHJhbmNoZXMgPSByZXF1aXJlKFwiLi92aWV3cy9tYW5hZ2VUb2tlbnNcIik7XG5jb25zdCBMaWNlbnNlcyA9IHJlcXVpcmUoXCIuL3ZpZXdzL21hbmFnZUxpY2Vuc2VzXCIpO1xuXG5jb25zdCBNb2R1bGUgPSBtb2R1bGUuZXhwb3J0cyA9IG5ldyBCYWNrYm9uZS5NYXJpb25ldHRlLkFwcGxpY2F0aW9uKCk7XG5cbi8vIEFkZCBpbnRyYS1tb2R1bGUgcm91dGluZ1xuTW9kdWxlLnJvdXRpbmcgPSBBcHAgPT4ge1xuXHRNb2R1bGUuUm91dGVyID0ge1xuXHRcdHJvdXRlczoge1xuXHRcdFx0ZGF0YURvd25sb2FkOiBcImRhdGFEb3dubG9hZFwiLFxuXHRcdFx0XCJkZXZpY2UtYmluZGluZ1wiOiBcImJpbmRpbmdzXCIsXG5cdFx0XHRleGNlcHRpb25Db25zb2xlOiBcImV4Y2VwdGlvbkNvbnNvbGVcIixcblx0XHRcdG5ld3NsZXR0ZXI6IFwibmV3c2xldHRlclwiLFxuXHRcdFx0XCJyZXBvcnRzKC86cmVwb3J0KVwiOiBcInJlcG9ydHNcIixcblx0XHRcdHVzZXJSb2xlVmlld2VyOiBcInVzZXJSb2xlVmlld2VyXCIsXG5cdFx0XHRzZXNzaW9uczogXCJzZXNzaW9uc1wiLFxuXHRcdFx0Z3JleUxhYmVsaW5nOiBcImdyZXlMYWJlbGluZ1wiLFxuXHRcdFx0c2VydmljZXM6IFwic2VydmljZXNcIixcblx0XHRcdHRva2VuczogXCJ0b2tlbnNcIixcblx0XHRcdGxpY2Vuc2VzOiBcImxpY2Vuc2VzXCIsXG5cdFx0fSxcblxuXHRcdGJpbmRpbmdzOiBmdW5jdGlvbigpIHtcblx0XHRcdEFwcC5sb2FkVmlldyhuZXcgRGV2aWNlQmluZGluZ3MoKSk7XG5cdFx0fSxcblxuXHRcdG5ld3NsZXR0ZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0QXBwLmxvYWRWaWV3KG5ldyBOZXdzbGV0dGVyKCkpO1xuXHRcdH0sXG5cblx0XHRyZXBvcnRzOiBmdW5jdGlvbihyZXBvcnQpIHtcblx0XHRcdEFwcC5sb2FkVmlldyhuZXcgUmVwb3J0cyh7IHJlcG9ydDogcmVwb3J0IH0pKTtcblx0XHR9LFxuXG5cdFx0ZXhjZXB0aW9uQ29uc29sZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRBcHAubG9hZFZpZXcobmV3IEV4Y2VwdGlvbkNvbnNvbGUoKSk7XG5cdFx0fSxcblxuXHRcdHVzZXJSb2xlVmlld2VyOiBmdW5jdGlvbigpIHtcblx0XHRcdEFwcC5sb2FkVmlldyhuZXcgVXNlclJvbGVWaWV3ZXIoKSk7XG5cdFx0fSxcblxuXHRcdHNlc3Npb25zOiBmdW5jdGlvbigpIHtcblx0XHRcdEFwcC5sb2FkVmlldyhuZXcgU2Vzc2lvblZpZXdlcigpKTtcblx0XHR9LFxuXG5cdFx0Z3JleUxhYmVsaW5nOiBmdW5jdGlvbigpIHtcblx0XHRcdEFwcC5sb2FkVmlldyhuZXcgR3JleUxhYmVsaW5nKCkpO1xuXHRcdH0sXG5cblx0XHRzZXJ2aWNlczogZnVuY3Rpb24oKSB7XG5cdFx0XHRBcHAubG9hZFZpZXcobmV3IFNlcnZpY2VzVmlld2VyKCkpO1xuXHRcdH0sXG5cblx0XHR0b2tlbnM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0QXBwLmxvYWRWaWV3KG5ldyBUcmFuY2hlcygpKTtcblx0XHR9LFxuXG5cdFx0bGljZW5zZXM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0QXBwLmxvYWRWaWV3KG5ldyBMaWNlbnNlcygpKTtcblx0XHR9LFxuXHR9O1xufTsiXX0=",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\n\nmodule.exports = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"_id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/services\";\n\t},\n\n\tcomputeds: {\n\t\tserviceChanged: function serviceChanged() {\n\t\t\treturn this.get(\"updated\") || this.get(\"createdDate\");\n\t\t}\n\t},\n\n\tvalidate: function validate(attrs) {\n\t\tvar ret = {};\n\n\t\tif (!attrs.title || !_.trim(attrs.title)) ret.title = \"No title provided\";\n\n\t\tif (!attrs.url || !_.trim(attrs.url)) ret.url = \"No url provided\";\n\n\t\tif (_.keys(ret).length > 0) return ret;\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNlcnZpY2VNb2RlbC5qcyJdLCJuYW1lcyI6WyJfIiwicmVxdWlyZSIsIkJhY2tib25lIiwic2V0dGluZ3MiLCJtb2R1bGUiLCJleHBvcnRzIiwiRXBveHkiLCJNb2RlbCIsImV4dGVuZCIsImlkQXR0cmlidXRlIiwidXJsUm9vdCIsImNvbXB1dGVkcyIsInNlcnZpY2VDaGFuZ2VkIiwiZ2V0IiwidmFsaWRhdGUiLCJhdHRycyIsInJldCIsInRpdGxlIiwidHJpbSIsInVybCIsImtleXMiLCJsZW5ndGgiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsV0FBV0QsUUFBUSxVQUFSLENBQWpCOztBQUVBLElBQU1FLFdBQVdGLFFBQVEsY0FBUixDQUFqQjs7QUFFQUcsT0FBT0MsT0FBUCxHQUFpQkgsU0FBU0ksS0FBVCxDQUFlQyxLQUFmLENBQXFCQyxNQUFyQixDQUE0QjtBQUM1Q0MsY0FBYSxLQUQrQjs7QUFHNUNDLFVBQVMsbUJBQVc7QUFDbkIsU0FBT1AsU0FBU08sT0FBVCxHQUFtQixtQkFBMUI7QUFDQSxFQUwyQzs7QUFPNUNDLFlBQVc7QUFDVkMsa0JBQWdCLDBCQUFXO0FBQzFCLFVBQU8sS0FBS0MsR0FBTCxDQUFTLFNBQVQsS0FBdUIsS0FBS0EsR0FBTCxDQUFTLGFBQVQsQ0FBOUI7QUFDQTtBQUhTLEVBUGlDOztBQWE1Q0MsV0FBVSxrQkFBU0MsS0FBVCxFQUFnQjtBQUN6QixNQUFNQyxNQUFNLEVBQVo7O0FBRUEsTUFBSSxDQUFDRCxNQUFNRSxLQUFQLElBQWdCLENBQUNqQixFQUFFa0IsSUFBRixDQUFPSCxNQUFNRSxLQUFiLENBQXJCLEVBQ0NELElBQUlDLEtBQUosR0FBWSxtQkFBWjs7QUFFRCxNQUFJLENBQUNGLE1BQU1JLEdBQVAsSUFBYyxDQUFDbkIsRUFBRWtCLElBQUYsQ0FBT0gsTUFBTUksR0FBYixDQUFuQixFQUNDSCxJQUFJRyxHQUFKLEdBQVUsaUJBQVY7O0FBRUQsTUFBSW5CLEVBQUVvQixJQUFGLENBQU9KLEdBQVAsRUFBWUssTUFBWixHQUFxQixDQUF6QixFQUNDLE9BQU9MLEdBQVA7QUFDRDtBQXhCMkMsQ0FBNUIsQ0FBakIiLCJmaWxlIjoic2VydmljZU1vZGVsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuRXBveHkuTW9kZWwuZXh0ZW5kKHtcblx0aWRBdHRyaWJ1dGU6IFwiX2lkXCIsXG5cblx0dXJsUm9vdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3NlcnZpY2VzXCI7XG5cdH0sXG5cblx0Y29tcHV0ZWRzOiB7XG5cdFx0c2VydmljZUNoYW5nZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0KFwidXBkYXRlZFwiKSB8fCB0aGlzLmdldChcImNyZWF0ZWREYXRlXCIpO1xuXHRcdH0sXG5cdH0sXG5cblx0dmFsaWRhdGU6IGZ1bmN0aW9uKGF0dHJzKSB7XG5cdFx0Y29uc3QgcmV0ID0ge307XG5cblx0XHRpZiAoIWF0dHJzLnRpdGxlIHx8ICFfLnRyaW0oYXR0cnMudGl0bGUpKVxuXHRcdFx0cmV0LnRpdGxlID0gXCJObyB0aXRsZSBwcm92aWRlZFwiO1xuXG5cdFx0aWYgKCFhdHRycy51cmwgfHwgIV8udHJpbShhdHRycy51cmwpKVxuXHRcdFx0cmV0LnVybCA9IFwiTm8gdXJsIHByb3ZpZGVkXCI7XG5cblx0XHRpZiAoXy5rZXlzKHJldCkubGVuZ3RoID4gMClcblx0XHRcdHJldHVybiByZXQ7XG5cdH0sXG59KTtcbiJdfQ==",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"header\\\">\\n\\t<h4 class=\\\"title left\\\"><span class=\\\"fal fa-book\\\"/>&nbsp;Device Bindings</h4>\\n\\n\\t<div class=\\\"actions\\\">\\n\\t\\t<!--<div class=\\\"operations fal fa-cog\\\"> Operations</div>-->\\n\\t\\t<div class=\\\"downloadList\\\"><span class=\\\"fal fa-cloud-download\\\"/> Download CSV</div>\\n\\t</div>\\n</div>\\n\\n<div class=\\\"ops-bar\\\">\\n\\t<div class=\\\"filters\\\"></div>\\n\\t<div class=\\\"counter\\\"></div>\\n</div>\\n\\n<div class=\\\"grid\\\"></div>\\n\\n<div class=\\\"paging\\\"></div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar userCheckDetails_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span class=\\\"exception-list-item-detail-label\\\">User:&nbsp;</span>\\n\\t<span class=\\\"exception-list-item-link user-link\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"user\"), env.opts.autoescape);\noutput += \"</span>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar userCheckDetails_oldRoot = userCheckDetails_obj.root;\nuserCheckDetails_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tuserCheckDetails_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar exceptionListItemDescription_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"exception-list-item-description\\\">\\n\\t\\t<span class=\\\"exception-list-item-detail-label\\\">Description</span>\\n\\t\\t<p>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"description\"), env.opts.autoescape);\noutput += \"</p>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar exceptionListItemDescription_oldRoot = exceptionListItemDescription_obj.root;\nexceptionListItemDescription_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\texceptionListItemDescription_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar exceptionListItem_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"exception-list-item-brief\\\">\\n\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"severity\") == \"critical\") {\noutput += \"\\n\\t\\t\\t<span class=\\\"fal fa-minus-circle exception-list-item-glyph exception-list-item-glyph-critical\\\" />\\n\\t\\t\";\n;\n}\nelse {\nif(runtime.contextOrFrameLookup(context, frame, \"severity\") == \"warning\") {\noutput += \"\\n\\t\\t\\t<span class=\\\"fal fa-exclamation-triangle exception-list-item-glyph exception-list-item-glyph-warning\\\" />\\n\\t\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t\\t<span class=\\\"fal fa-info-circle exception-list-item-glyph exception-list-item-glyph-info\\\" />\\n\\t\\t\";\n;\n}\n;\n}\noutput += \"\\n\\n\\t\\t<span class=\\\"exception-list-item-label\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"title\"), env.opts.autoescape);\noutput += \"</span>\\n\\n\\t\\t<div class=\\\"exception-list-item-button-container\\\">\\n\\t\\t\\t<span class=\\\"fal fa-reply exception-list-item-button-close hide\\\" />\\n\\t\\t\\t<span class=\\\"fal fa-check exception-list-item-button-validate hide\\\" />\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"details-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"description-region\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar exceptionListItem_oldRoot = exceptionListItem_obj.root;\nexceptionListItem_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\texceptionListItem_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar console_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"status-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"display-region hide\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar console_oldRoot = console_obj.root;\nconsole_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tconsole_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar header_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div>\\n\\t\\t<h4 class=\\\"title left\\\"><span class=\\\"fal fa-lightbulb-o\\\"/>&nbsp;Exception Console</h4>\\n\\t</div>\\n\\n\\t<div class=\\\"action-region right\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar header_oldRoot = header_obj.root;\nheader_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\theader_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar glyphUsers_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"exception-console-glyph glyph-users\\\">\\n\\t\\t<div class=\\\"exception-console-glyph-ring\\\">\\n\\t\\t\\t<span class=\\\"fal fa-users\\\" />\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar glyphUsers_oldRoot = glyphUsers_obj.root;\nglyphUsers_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tglyphUsers_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar glyphBooks_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"exception-console-glyph glyph-books\\\">\\n\\t\\t<div class=\\\"exception-console-glyph-ring\\\">\\n\\t\\t\\t<span class=\\\"fal fa-book\\\" />\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar glyphBooks_oldRoot = glyphBooks_obj.root;\nglyphBooks_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tglyphBooks_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar glyphContent_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"exception-console-glyph glyph-content\\\">\\n\\t\\t<div class=\\\"exception-console-glyph-ring\\\">\\n\\t\\t\\t<span class=\\\"fal fa-cubes\\\" />\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar glyphContent_oldRoot = glyphContent_obj.root;\nglyphContent_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tglyphContent_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar glyphDevices_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"exception-console-glyph glyph-devices\\\">\\n\\t\\t<div class=\\\"exception-console-glyph-ring\\\">\\n\\t\\t\\t<span class=\\\"fal fa-tablet\\\" />\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar glyphDevices_oldRoot = glyphDevices_obj.root;\nglyphDevices_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tglyphDevices_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar menu_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"exception-console-menu-item-container\\\">\\n\\t\\t<div class=\\\"exception-console-menu-item menu-item-users\\\">\\n\\t\\t\\t<div class=\\\"exception-console-menu-item-ring\\\">\\n\\t\\t\\t\\t<span class=\\\"fal fa-users\\\" />\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<span class=\\\"exception-console-menu-item-label\\\">Users and Groups</span>\\n\\t</div>\\n\\n\\t<div class=\\\"exception-console-menu-item-container\\\">\\n\\t\\t<div class=\\\"exception-console-menu-item menu-item-books\\\">\\n\\t\\t\\t<div class=\\\"exception-console-menu-item-ring\\\">\\n\\t\\t\\t\\t<span class=\\\"fal fa-book\\\" />\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<span class=\\\"exception-console-menu-item-label\\\">Books</span>\\n\\t</div>\\n\\n\\t<div class=\\\"exception-console-menu-item-container\\\">\\n\\t\\t<div class=\\\"exception-console-menu-item menu-item-content\\\">\\n\\t\\t\\t<div class=\\\"exception-console-menu-item-ring\\\">\\n\\t\\t\\t\\t<span class=\\\"fal fa-cubes\\\" />\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<span class=\\\"exception-console-menu-item-label\\\">Content</span>\\n\\t</div>\\n\\n\\t<div class=\\\"exception-console-menu-item-container\\\">\\n\\t\\t<div class=\\\"exception-console-menu-item menu-item-devices\\\">\\n\\t\\t\\t<div class=\\\"exception-console-menu-item-ring\\\">\\n\\t\\t\\t\\t<span class=\\\"fal fa-tablet\\\" />\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\n\\t\\t<span class=\\\"exception-console-menu-item-label\\\">Devices</span>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar menu_oldRoot = menu_obj.root;\nmenu_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmenu_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar layout_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"glyph-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"header-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"menu-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"display-region hide\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar layout_oldRoot = layout_obj.root;\nlayout_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlayout_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"userCheckDetails\": new nunjucks.Template( {obj: userCheckDetails_obj, type: \"code\"}, env),\t\"exceptionListItemDescription\": new nunjucks.Template( {obj: exceptionListItemDescription_obj, type: \"code\"}, env),\t\"exceptionListItem\": new nunjucks.Template( {obj: exceptionListItem_obj, type: \"code\"}, env),\t\"console\": new nunjucks.Template( {obj: console_obj, type: \"code\"}, env),\t\"header\": new nunjucks.Template( {obj: header_obj, type: \"code\"}, env),\t\"glyphUsers\": new nunjucks.Template( {obj: glyphUsers_obj, type: \"code\"}, env),\t\"glyphBooks\": new nunjucks.Template( {obj: glyphBooks_obj, type: \"code\"}, env),\t\"glyphContent\": new nunjucks.Template( {obj: glyphContent_obj, type: \"code\"}, env),\t\"glyphDevices\": new nunjucks.Template( {obj: glyphDevices_obj, type: \"code\"}, env),\t\"menu\": new nunjucks.Template( {obj: menu_obj, type: \"code\"}, env),\t\"layout\": new nunjucks.Template( {obj: layout_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar editor_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"grey-labeling-form-panel\\\">\\n\\t\\t<div class=\\\"warn\\\"><span class=\\\"fal fa-info-circle\\\"></span> Images only accepted in (PNG, JPG and JPEG) formats</div>\\n\\t\\t<div class=\\\"grey-labeling-row drawer-top-logo\\\">\\n\\t\\t\\t<div class=\\\"grey-labeling-label\\\">1. Drawer Top Logo</div>\\n\\t\\t\\t<div class=\\\"grey-labeling-value\\\">\\n\\t\\t\\t\\t<span class=\\\"fal fa-times-circle close \";\noutput += runtime.suppressValue((!runtime.contextOrFrameLookup(context, frame, \"drawerTop\")?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\" title=\\\"Delete Drawer Top Logo\\\" data-type=\\\"file\\\" data-attr=\\\"drawerTop\\\"></span>\\n\\t\\t\\t\\t\";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"drawerTop\")?\"<img src=\\\"\" + runtime.contextOrFrameLookup(context, frame, \"drawerTop\") + \"\\\"/>\":\"<img src=\\\"\\\" class=\\\"hide\\\" />\"), env.opts.autoescape);\noutput += \"\\n\\t\\t\\t</div><br>\\n\\t\\t\\t<button type=\\\"button\\\" class=\\\"button drawer-top-logo-btn\\\">Change Logo</button>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"grey-labeling-row loading-image\\\">\\n\\t\\t\\t<div class=\\\"grey-labeling-label\\\">2. Loading Image</div>\\n\\t\\t\\t<div class=\\\"grey-labeling-value\\\">\\n\\t\\t\\t\\t<span class=\\\"fal fa-times-circle close  \";\noutput += runtime.suppressValue((!runtime.contextOrFrameLookup(context, frame, \"loadingImage\")?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\" title=\\\"Delete Loading Image\\\" data-type=\\\"file\\\" data-attr=\\\"loadingImage\\\"></span>\\n\\t\\t\\t\\t\";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"loadingImage\")?\"<img src=\\\"\" + runtime.contextOrFrameLookup(context, frame, \"loadingImage\") + \"\\\"/>\":\"<img src=\\\"\\\" class=\\\"hide\\\" />\"), env.opts.autoescape);\noutput += \"\\n\\t\\t\\t</div><br>\\n\\t\\t\\t<button type=\\\"button\\\" class=\\\"button loading-image-btn\\\">Change Image</button>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"grey-labeling-row powered-by-logo\\\">\\n\\t\\t\\t<div class=\\\"grey-labeling-label\\\">3. Powered by Logo</div>\\n\\t\\t\\t<div class=\\\"grey-labeling-value\\\">\\n\\t\\t\\t\\t<span class=\\\"fal fa-times-circle close  \";\noutput += runtime.suppressValue((!runtime.contextOrFrameLookup(context, frame, \"poweredBy\")?\"hide\":\"\"), env.opts.autoescape);\noutput += \"\\\" title=\\\"Delete Powered by Logo\\\" data-type=\\\"file\\\" data-attr=\\\"poweredBy\\\"></span>\\n\\t\\t\\t\\t\";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"poweredBy\")?\"<img src=\\\"\" + runtime.contextOrFrameLookup(context, frame, \"poweredBy\") + \"\\\"/>\":\"<img src=\\\"\\\" class=\\\"hide\\\" />\"), env.opts.autoescape);\noutput += \"\\n\\t\\t\\t</div><br>\\n\\t\\t\\t<button type=\\\"button\\\" class=\\\"button powered-by-logo-btn\\\">Change Logo</button>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"grey-labeling-row header-bar-color\\\">\\n\\t\\t\\t<div class=\\\"grey-labeling-label\\\">4. Header Bar Color</div>\\n\\t\\t\\t<div class=\\\"grey-labeling-value display-inline\\\">\\n\\t\\t\\t\\t<span class=\\\"fal fa-times-circle close  \";\noutput += runtime.suppressValue((!runtime.contextOrFrameLookup(context, frame, \"headerBarColor\")?\"hide\":\"\"), env.opts.autoescape);\noutput += \" close-alt\\\" title=\\\"Delete Header Bar Color\\\" data-attr=\\\"headerBarColor\\\"></span>\\n\\t\\t\\t\\t\";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"headerBarColor\")?\"<span class=\\\"val\\\">\" + runtime.contextOrFrameLookup(context, frame, \"headerBarColor\") + \"</span><div class=\\\"color\\\" style=\\\"background: \" + runtime.contextOrFrameLookup(context, frame, \"headerBarColor\") + \";\\\"></div>\":\"<span class=\\\"val\\\"></span><div class=\\\"color\\\" />\"), env.opts.autoescape);\noutput += \"\\n\\t\\t\\t</div><br>\\n\\t\\t\\t<button type=\\\"button\\\" class=\\\"button header-bar-color-btn\\\">Change Value</button>\\n\\t\\t</div>\\n\\t</div>\\n\\t<div class=\\\"grey-labeling-map\\\"></div>\\n\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar editor_oldRoot = editor_obj.root;\neditor_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\teditor_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar layout_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"header-region hide\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"status-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"editor-region hide\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"grey-labeling-success-result-panel hide\\\">\\n\\t\\t<span></span>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar layout_oldRoot = layout_obj.root;\nlayout_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlayout_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar deleteConfirmation_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"action-buttons\\\">\\n\\t\\t<span class=\\\"fal fa-check yes\\\"></span><span class=\\\"fal fa-times no\\\"></span>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar deleteConfirmation_oldRoot = deleteConfirmation_obj.root;\ndeleteConfirmation_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tdeleteConfirmation_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"editor\": new nunjucks.Template( {obj: editor_obj, type: \"code\"}, env),\t\"layout\": new nunjucks.Template( {obj: layout_obj, type: \"code\"}, env),\t\"deleteConfirmation\": new nunjucks.Template( {obj: deleteConfirmation_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar importModal_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"modal-title\\\">\\n\\t\\t<span class=\\\"fal fa-cloud-upload\\\"/></span>\\n\\t\\t<span class=\\\"title\\\"></span>\\n\\t</div>\\n\\n\\t<div class=\\\"modal-body\\\">\\n\\t\\t<div class=\\\"row form-container\\\">\\n\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t<div class=\\\"upload-form\\\">\\n\\t\\t\\t\\t\\t<input type=\\\"text\\\" name=\\\"headerBarColor\\\" placeholder=\\\"headerBarColor\\\" class=\\\"hide\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"image-file-chooser hide\\\"></div>\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div class=\\\"result\\\">\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"modal-footer left\\\">\\n\\t\\t<button type=\\\"button\\\" class=\\\"button secondary cancel\\\">Cancel</button>&nbsp;&nbsp;&nbsp;&nbsp;\\n\\t\\t<button type=\\\"button\\\" class=\\\"button success save\\\">Save</button>&nbsp;&nbsp;&nbsp;&nbsp;\\n\\n\\t\\t<span class=\\\"spinner-icon spinner-small spinner-working hide\\\"/>\\n\\t\\t<span class=\\\"message hide\\\"></span>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar importModal_oldRoot = importModal_obj.root;\nimportModal_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\timportModal_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"importModal\": new nunjucks.Template( {obj: importModal_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"modal-title\\\"><span class=\\\"fal fa-list-ul\\\"/> Changelog for \";\noutput += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"model\")),\"name\"), env.opts.autoescape);\noutput += \"</div>\\n<div class=\\\"modal-body\\\">\\n\\t\";\nif(!runtime.contextOrFrameLookup(context, frame, \"items\")) {\noutput += \"\\n\\t\\t<div style=\\\"margin: 0 auto; width: 100%; text-align: center;\\\">\\n\\t\\t\\t<span class=\\\"spinner-icon spinner-small\\\"/> Loading...\\n\\t\\t</div>\\n\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t<label class=\\\"search-box\\\">\\n\\t\\t\\t<div class=\\\"fal fa-search\\\"></div>\\n\\t\\t\\t<input type=\\\"text\\\" placeholder=\\\"Search...\\\" required name=\\\"searchText\\\" value=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"searchText\"), env.opts.autoescape);\noutput += \"\\\"/>\\n\\t\\t\\t<div class=\\\"input-overlay fal fa-times\\\" title=\\\"Clear field\\\"/>\\n\\t\\t</label>\\n\\n\\t\\t\";\nif(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"items\")),\"length\") == 0) {\noutput += \"\\n\\t\\t\\t<div>There is nothing to show</div>\\n\\t\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t\\t\";\nframe = frame.push();\nvar t_3 = runtime.contextOrFrameLookup(context, frame, \"items\");\nif(t_3) {var t_2 = t_3.length;\nfor(var t_1=0; t_1 < t_3.length; t_1++) {\nvar t_4 = t_3[t_1];\nframe.set(\"row\", t_4);\nframe.set(\"loop.index\", t_1 + 1);\nframe.set(\"loop.index0\", t_1);\nframe.set(\"loop.revindex\", t_2 - t_1);\nframe.set(\"loop.revindex0\", t_2 - t_1 - 1);\nframe.set(\"loop.first\", t_1 === 0);\nframe.set(\"loop.last\", t_1 === t_2 - 1);\nframe.set(\"loop.length\", t_2);\noutput += \"\\n\\t\\t\\t\\t<div class=\\\"item\\\" data-full=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_4),\"datum\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"when\\\">\";\noutput += runtime.suppressValue((lineno = 18, colno = 31, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"fromNow\"), \"fromNow\", context, [runtime.memberLookup((t_4),\"datum\")])), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t\\t\\t<div class=\\\"who\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, (runtime.memberLookup((t_4),\"user\") || \"SYSTEM\")), env.opts.autoescape);\noutput += \" \";\noutput += runtime.suppressValue((!runtime.memberLookup((t_4),\"impersonator\")?\"\":(\" (impersonated by \" + (env.getFilter(\"escape\").call(context, runtime.memberLookup((t_4),\"impersonator\"))) + \")\")), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t\\t\\t<div class=\\\"title\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.memberLookup((t_4),\"action\")), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t\\t\\t<div class=\\\"meta\\\">\\n\\t\\t\\t\\t\\t\\t\";\nif(runtime.memberLookup((t_4),\"target\")) {\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t<div><span class=\\\"fas fa-arrow-right\\\"/> User: \";\noutput += runtime.suppressValue(runtime.memberLookup((t_4),\"target\"), env.opts.autoescape);\noutput += \" [<code>\";\noutput += runtime.suppressValue(runtime.memberLookup((t_4),\"target_username\"), env.opts.autoescape);\noutput += \"</code>]</div>\\n\\t\\t\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t\\t\\t\";\nif(runtime.memberLookup((t_4),\"group_name\")) {\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t<div><span class=\\\"fas fa-arrow-right\\\"/> Group: \";\noutput += runtime.suppressValue(runtime.memberLookup((t_4),\"group_name\"), env.opts.autoescape);\noutput += \" [<code>\";\noutput += runtime.suppressValue(runtime.memberLookup((t_4),\"group_code\"), env.opts.autoescape);\noutput += \"</code>]</div>\\n\\t\\t\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t\\t\";\nif(runtime.memberLookup((t_4),\"changes\")) {\noutput += \"\\n\\t\\t\\t\\t\\t\\t<div class=\\\"detail\\\">\\n\\t\\t\\t\\t\\t\\t\\t\";\nframe = frame.push();\nvar t_7 = runtime.memberLookup((t_4),\"changes\");\nif(t_7) {var t_5;\nif(runtime.isArray(t_7)) {\nvar t_6 = t_7.length;\nfor(t_5=0; t_5 < t_7.length; t_5++) {\nvar t_8 = t_7[t_5][0]\nframe.set(\"key\", t_7[t_5][0]);\nvar t_9 = t_7[t_5][1]\nframe.set(\"val\", t_7[t_5][1]);\nframe.set(\"loop.index\", t_5 + 1);\nframe.set(\"loop.index0\", t_5);\nframe.set(\"loop.revindex\", t_6 - t_5);\nframe.set(\"loop.revindex0\", t_6 - t_5 - 1);\nframe.set(\"loop.first\", t_5 === 0);\nframe.set(\"loop.last\", t_5 === t_6 - 1);\nframe.set(\"loop.length\", t_6);\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t\\t<strong>\";\noutput += runtime.suppressValue(t_8, env.opts.autoescape);\noutput += \"</strong>: <code>\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, env.getFilter(\"dumpIfObject\").call(context, runtime.memberLookup((t_9),\"old\"))), env.opts.autoescape);\noutput += \"</code> ➔ <code>\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, env.getFilter(\"dumpIfObject\").call(context, runtime.memberLookup((t_9),\"new\"))), env.opts.autoescape);\noutput += \"</code><br/>\\n\\t\\t\\t\\t\\t\\t\\t\";\n;\n}\n} else {\nt_5 = -1;\nvar t_6 = runtime.keys(t_7).length;\nfor(var t_10 in t_7) {\nt_5++;\nvar t_11 = t_7[t_10];\nframe.set(\"key\", t_10);\nframe.set(\"val\", t_11);\nframe.set(\"loop.index\", t_5 + 1);\nframe.set(\"loop.index0\", t_5);\nframe.set(\"loop.revindex\", t_6 - t_5);\nframe.set(\"loop.revindex0\", t_6 - t_5 - 1);\nframe.set(\"loop.first\", t_5 === 0);\nframe.set(\"loop.last\", t_5 === t_6 - 1);\nframe.set(\"loop.length\", t_6);\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t\\t<strong>\";\noutput += runtime.suppressValue(t_10, env.opts.autoescape);\noutput += \"</strong>: <code>\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, env.getFilter(\"dumpIfObject\").call(context, runtime.memberLookup((t_11),\"old\"))), env.opts.autoescape);\noutput += \"</code> ➔ <code>\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, env.getFilter(\"dumpIfObject\").call(context, runtime.memberLookup((t_11),\"new\"))), env.opts.autoescape);\noutput += \"</code><br/>\\n\\t\\t\\t\\t\\t\\t\\t\";\n;\n}\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\";\n;\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t\";\n;\n}\noutput += \"\\n\\t\";\n;\n}\noutput += \"\\n\\t<div class=\\\"modal-error hide\\\"></div>\\n</div>\\n<div class=\\\"modal-footer\\\">\\n\\t<button class=\\\"button success ok\\\">OK</button>\\n</div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"header\\\">\\n\\t<h4 class=\\\"title left\\\"><span class=\\\"fal fa-file-certificate\\\"/>&nbsp;Manage Licenses</h4>\\n\\t<div class=\\\"actions\\\">\\n\\t\\t<div class=\\\"downloadList\\\"><span class=\\\"fal fa-cloud-download\\\"/> Downloads</div>\\n\\t</div>\\n</div>\\n\\n<div class=\\\"ops-bar\\\">\\n\\t<div class=\\\"filters\\\"></div>\\n\\t<div class=\\\"counter\\\"></div>\\n</div>\\n\\n<div class=\\\"grid\\\"></div>\\n\\n<div class=\\\"paging\\\"></div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"header\\\">\\n\\t<h4 class=\\\"title left\\\"><span class=\\\"fal fa-ticket-alt\\\"/>&nbsp;License Tokens</h4>\\n\\t<div class=\\\"actions\\\">\\n\\t\\t<div class=\\\"activate\\\"><span class=\\\"fal fa-plus\\\"/> Activate Token</div>\\n\\t\\t<div class=\\\"downloadList\\\"><span class=\\\"fal fa-cloud-download\\\"/> Downloads</div>\\n\\t</div>\\n</div>\\n\\n<div class=\\\"ops-bar\\\">\\n\\t<div class=\\\"filters\\\"></div>\\n\\t<div class=\\\"counter\\\"></div>\\n</div>\\n\\n<div class=\\\"grid\\\"></div>\\n\\n<div class=\\\"paging\\\"></div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"header\\\">\\n\\t<h4 class=\\\"title left\\\"><span class=\\\"fal fa-newspaper-o\\\"/>&nbsp;Newsletter</h4>\\n</div>\\n\\n<div class=\\\"current block\\\"><span class=\\\"spinner-icon spinner-small\\\"/> Loading...</div>\\n\\n<div class=\\\"new hide\\\">\\n<br/>\\n<p>Upload new newsletter (must be PDF): <input type=\\\"file\\\" name=\\\"pdf\\\"/></p>\\n<p class=\\\"error\\\"></p>\\n<input type=\\\"button\\\" class=\\\"button small\\\" value=\\\"Upload Newsletter\\\"/> <span class=\\\"spinner-icon spinner-small hide\\\"/>\\n</div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"header\\\">\\n\\t\\t<h4 class=\\\"title left\\\"><span class=\\\"fal fa-flag\\\"/>&nbsp;Reports</h4>\\n\\t</div>\\n\\n\\t<div class=\\\"host\\\">\\n\\t\\t<div class=\\\"sidebar\\\">\\n\\t\\t\\t\";\nif((env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"reports\")),\"systemGroupChanges\"))) || (env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"reports\")),\"userGroupChanges\"))) || (env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"reports\")),\"bookGroupChanges\"))) || (env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"reports\")),\"latestUnlocks\"))) || (env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"reports\")),\"allUnlocks\")))) {\noutput += \"\\n\\t\\t\\t<div class=\\\"group\\\">\\n\\t\\t\\t\\t<span>Billing related</span>\\n\\t\\t\\t\\t\";\nif((env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"reports\")),\"systemGroupChanges\")))) {\noutput += \"<div class=\\\"item group-change-unity\\\" data-report=\\\"system-groups\\\">Group changes for EC</div>\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t\";\nif((env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"reports\")),\"userGroupChanges\")))) {\noutput += \"<div class=\\\"item group-change-users\\\" data-report=\\\"user-groups\\\">Group changes for users</div>\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t\";\nif((env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"reports\")),\"bookGroupChanges\")))) {\noutput += \"<div class=\\\"item group-change-books\\\" data-report=\\\"book-groups\\\">Group changes for books</div>\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t\";\nif((env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"reports\")),\"licenseChanges\")))) {\noutput += \"<div class=\\\"item license-changes\\\" data-report=\\\"license-changes\\\">License changes</div>\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t\";\nif((env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"reports\")),\"latestUnlocks\")))) {\noutput += \"<div class=\\\"item latest-unlocks\\\" data-report=\\\"latest-unlocks\\\">Latest unlocks</div>\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t\";\nif((env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"reports\")),\"allUnlocks\")))) {\noutput += \"<div class=\\\"item all-unlocks\\\" data-report=\\\"all-unlocks\\\">All unlocks</div>\";\n;\n}\noutput += \"\\n\\t\\t\\t</div>\\n\\t\\t\\t\";\n;\n}\noutput += \"\\n\\n\\t\\t\\t\";\nif((env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"reports\")),\"learnerBooksPerGrade\"))) || (env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"reports\")),\"validBooksPerUser\"))) || (env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"reports\")),\"groupsPerUser\"))) || (env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"reports\")),\"resourcesCreated\"))) || (env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"reports\")),\"resourcesUsed\"))) || (env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"reports\")),\"appVersions\")))) {\noutput += \"\\n\\t\\t\\t<div class=\\\"group\\\">\\n\\t\\t\\t\\t<span>Data Tables</span>\\n\\t\\t\\t\\t\";\nif((env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"reports\")),\"learnerBooksPerGrade\")))) {\noutput += \"<div class=\\\"item learner-books-grade\\\" data-report=\\\"learner-books\\\">Learners with books per grade</div>\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t\";\nif((env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"reports\")),\"validBooksPerUser\")))) {\noutput += \"<div class=\\\"item valid-books-person\\\" data-report=\\\"valid-books\\\">Valid books allocated per person</div>\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t\";\nif((env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"reports\")),\"groupsPerUser\")))) {\noutput += \"<div class=\\\"item groups-person\\\" data-report=\\\"groups\\\">Groups allocated per person</div>\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t\";\nif((env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"reports\")),\"resourcesCreated\")))) {\noutput += \"<div class=\\\"item resources-created\\\" data-report=\\\"resources-created\\\">Resources created</div>\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t\";\nif((env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"reports\")),\"booksRequirePurchasing\"))) && runtime.contextOrFrameLookup(context, frame, \"bookTokenMode\")) {\noutput += \"<div class=\\\"item user-book-purchases\\\" data-report=\\\"user-book-purchases\\\">Books that require purchasing</div>\";\n;\n}\noutput += \"\\n\\t\\t\\t</div>\\n\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"main\\\"><h3>Choose a report to the left</h3></div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar validBooks_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"header\\\">\\n\\t\\t<h4 class=\\\"title left\\\">Valid books allocated per person</h4>\\n\\n\\t\\t<div class=\\\"actions\\\">\\n\\t\\t\\t<div class=\\\"downloadList\\\"><span class=\\\"fal fa-cloud-download\\\"/> Downloads</div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"ops-bar\\\">\\n\\t\\t<div class=\\\"filters\\\"></div>\\n\\t\\t<div class=\\\"counter\\\"></div>\\n\\t</div>\\n\\n\\t<div class=\\\"grid\\\"></div>\\n\\n\\t<div class=\\\"paging\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar validBooks_oldRoot = validBooks_obj.root;\nvalidBooks_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tvalidBooks_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar allUnlocks_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<h4>All Unlocks</h4>\\n\\n\\t<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"large-3 columns\\\">Start Date</div>\\n\\t\\t<div class=\\\"large-9 columns\\\"><label>The report will only include data from this date onwards (inclusive)<input type=\\\"text\\\" name=\\\"startDate\\\" readonly value=\\\"1 November \";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"year\"), env.opts.autoescape);\noutput += \"\\\"/></label></div>\\n\\t</div>\\n\\n\\t<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"large-3 columns\\\">End Date</div>\\n\\t\\t<div class=\\\"large-9 columns\\\"><label>The report will only include data from before this date (inclusive)<input type=\\\"text\\\" name=\\\"endDate\\\" readonly/></label></div>\\n\\t</div>\\n\\n\\t<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"large-12 columns\\\"><input type=\\\"button\\\" class=\\\"button\\\" value=\\\"Download Report\\\"/></div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar allUnlocks_oldRoot = allUnlocks_obj.root;\nallUnlocks_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tallUnlocks_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar learnerBooks_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"header\\\">\\n\\t\\t<h4 class=\\\"title left\\\">Learners with books per grade</h4>\\n\\n\\t\\t<div class=\\\"actions\\\">\\n\\t\\t\\t<div class=\\\"downloadList\\\"><span class=\\\"fal fa-cloud-download\\\"/> Downloads</div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"ops-bar\\\">\\n\\t\\t<div class=\\\"filters\\\"></div>\\n\\t\\t<div class=\\\"counter\\\"></div>\\n\\t</div>\\n\\n\\t<div class=\\\"grid\\\"></div>\\n\\n\\t<div class=\\\"paging\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar learnerBooks_oldRoot = learnerBooks_obj.root;\nlearnerBooks_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlearnerBooks_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar groups_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"header\\\">\\n\\t\\t<h4 class=\\\"title left\\\">Groups allocated per person</h4>\\n\\n\\t\\t<div class=\\\"actions\\\">\\n\\t\\t\\t<div class=\\\"downloadList\\\"><span class=\\\"fal fa-cloud-download\\\"/> Downloads</div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"ops-bar\\\">\\n\\t\\t<div class=\\\"filters\\\"></div>\\n\\t\\t<div class=\\\"counter\\\"></div>\\n\\t</div>\\n\\n\\t<div class=\\\"grid\\\"></div>\\n\\n\\t<div class=\\\"paging\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar groups_oldRoot = groups_obj.root;\ngroups_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tgroups_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar resourcesCreated_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"header\\\">\\n\\t\\t<h4 class=\\\"title left\\\">Resources created <span class=\\\"total\\\"></span></h4>\\n\\n\\t\\t<div class=\\\"actions\\\">\\n\\t\\t\\t<div class=\\\"downloadList\\\"><span class=\\\"fal fa-cloud-download\\\"/> Downloads</div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"ops-bar\\\">\\n\\t\\t<div class=\\\"filters\\\"></div>\\n\\t\\t<div class=\\\"counter\\\"></div>\\n\\t</div>\\n\\n\\t<div class=\\\"grid\\\"></div>\\n\\n\\t<div class=\\\"paging\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar resourcesCreated_oldRoot = resourcesCreated_obj.root;\nresourcesCreated_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tresourcesCreated_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar appVersions_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"header\\\">\\n\\t\\t<h4 class=\\\"title left\\\">App versions in use</h4>\\n\\n\\t\\t<div class=\\\"actions\\\">\\n\\t\\t\\t<div class=\\\"downloadList\\\"><span class=\\\"fal fa-cloud-download\\\"/> Downloads</div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"ops-bar\\\">\\n\\t\\t<div class=\\\"filters\\\"></div>\\n\\t\\t<div class=\\\"counter\\\"></div>\\n\\t</div>\\n\\n\\t<div class=\\\"grid\\\"></div>\\n\\n\\t<div class=\\\"paging\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar appVersions_oldRoot = appVersions_obj.root;\nappVersions_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tappVersions_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar latestUnlocks_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"header\\\">\\n\\t\\t<h4 class=\\\"title left\\\">Latest unlocks</h4>\\n\\n\\t\\t<div class=\\\"actions\\\">\\n\\t\\t\\t<div class=\\\"downloadList\\\"><span class=\\\"fal fa-cloud-download\\\"/> Downloads</div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"ops-bar\\\">\\n\\t\\t<div class=\\\"filters\\\"></div>\\n\\t\\t<div class=\\\"counter\\\"></div>\\n\\t</div>\\n\\n\\t<div class=\\\"grid\\\"></div>\\n\\n\\t<div class=\\\"paging\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar latestUnlocks_oldRoot = latestUnlocks_obj.root;\nlatestUnlocks_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlatestUnlocks_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar systemGroups_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"header\\\">\\n\\t\\t<h4 class=\\\"title left\\\">System group changes</h4>\\n\\n\\t\\t<div class=\\\"actions\\\">\\n\\t\\t\\t<div class=\\\"downloadList\\\"><span class=\\\"fal fa-cloud-download\\\"/> Downloads</div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"ops-bar\\\">\\n\\t\\t<div class=\\\"filters\\\"></div>\\n\\t\\t<div class=\\\"counter\\\"></div>\\n\\t</div>\\n\\n\\t<div class=\\\"grid\\\"></div>\\n\\n\\t<div class=\\\"paging\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar systemGroups_oldRoot = systemGroups_obj.root;\nsystemGroups_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tsystemGroups_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar userGroups_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"header\\\">\\n\\t\\t<h4 class=\\\"title left\\\">User group changes</h4>\\n\\n\\t\\t<div class=\\\"actions\\\">\\n\\t\\t\\t<div class=\\\"downloadList\\\"><span class=\\\"fal fa-cloud-download\\\"/> Downloads</div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"ops-bar\\\">\\n\\t\\t<div class=\\\"filters\\\"></div>\\n\\t\\t<div class=\\\"counter\\\"></div>\\n\\t</div>\\n\\n\\t<div class=\\\"grid\\\"></div>\\n\\n\\t<div class=\\\"paging\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar userGroups_oldRoot = userGroups_obj.root;\nuserGroups_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tuserGroups_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar bookGroups_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"header\\\">\\n\\t\\t<h4 class=\\\"title left\\\">Book group changes</h4>\\n\\n\\t\\t<div class=\\\"actions\\\">\\n\\t\\t\\t<div class=\\\"downloadList\\\"><span class=\\\"fal fa-cloud-download\\\"/> Downloads</div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"ops-bar\\\">\\n\\t\\t<div class=\\\"filters\\\"></div>\\n\\t\\t<div class=\\\"counter\\\"></div>\\n\\t</div>\\n\\n\\t<div class=\\\"grid\\\"></div>\\n\\n\\t<div class=\\\"paging\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar bookGroups_oldRoot = bookGroups_obj.root;\nbookGroups_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tbookGroups_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar userBookPurchases_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"header\\\">\\n\\t\\t<h4 class=\\\"title left\\\">Books that require purchasing</h4>\\n\\n\\t\\t<div class=\\\"actions\\\">\\n\\t\\t\\t<div class=\\\"downloadList\\\"><span class=\\\"fal fa-cloud-download\\\"/> Downloads</div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"ops-bar\\\">\\n\\t\\t<div class=\\\"filters\\\"></div>\\n\\t\\t<div class=\\\"counter\\\"></div>\\n\\t</div>\\n\\n\\t<div class=\\\"grid\\\"></div>\\n\\n\\t<div class=\\\"paging\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar userBookPurchases_oldRoot = userBookPurchases_obj.root;\nuserBookPurchases_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tuserBookPurchases_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar licenseChanges_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"header\\\">\\n\\t\\t<h4 class=\\\"title left\\\">License changes</h4>\\n\\n\\t\\t<div class=\\\"actions\\\">\\n\\t\\t\\t<div class=\\\"downloadList\\\"><span class=\\\"fal fa-cloud-download\\\"/> Downloads</div>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"ops-bar\\\">\\n\\t\\t<div class=\\\"filters\\\"></div>\\n\\t\\t<div class=\\\"counter\\\"></div>\\n\\t</div>\\n\\n\\t<div class=\\\"grid\\\"></div>\\n\\n\\t<div class=\\\"paging\\\"></div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar licenseChanges_oldRoot = licenseChanges_obj.root;\nlicenseChanges_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlicenseChanges_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"main\": new nunjucks.Template( {obj: main_obj, type: \"code\"}, env),\t\"validBooks\": new nunjucks.Template( {obj: validBooks_obj, type: \"code\"}, env),\t\"allUnlocks\": new nunjucks.Template( {obj: allUnlocks_obj, type: \"code\"}, env),\t\"learnerBooks\": new nunjucks.Template( {obj: learnerBooks_obj, type: \"code\"}, env),\t\"groups\": new nunjucks.Template( {obj: groups_obj, type: \"code\"}, env),\t\"resourcesCreated\": new nunjucks.Template( {obj: resourcesCreated_obj, type: \"code\"}, env),\t\"appVersions\": new nunjucks.Template( {obj: appVersions_obj, type: \"code\"}, env),\t\"latestUnlocks\": new nunjucks.Template( {obj: latestUnlocks_obj, type: \"code\"}, env),\t\"systemGroups\": new nunjucks.Template( {obj: systemGroups_obj, type: \"code\"}, env),\t\"userGroups\": new nunjucks.Template( {obj: userGroups_obj, type: \"code\"}, env),\t\"bookGroups\": new nunjucks.Template( {obj: bookGroups_obj, type: \"code\"}, env),\t\"userBookPurchases\": new nunjucks.Template( {obj: userBookPurchases_obj, type: \"code\"}, env),\t\"licenseChanges\": new nunjucks.Template( {obj: licenseChanges_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar content_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"service-metadatas\\\">\\n\\t\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t\\t<span class=\\\"title-label\\\">Title</span>\\n\\t\\t\\t\\t\\t\\t<input type=\\\"text\\\" name=\\\"title\\\" placeholder=\\\"Title\\\" value=\\\"\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"title\")), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t\\t<span class=\\\"url-label\\\">URL</span>\\n\\t\\t\\t\\t\\t\\t<input type=\\\"text\\\" name=\\\"url\\\" placeholder=\\\"URL\\\" value=\\\"\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"url\")), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t\\t<input type=\\\"checkbox\\\" name=\\\"openInternally\\\" \";\noutput += runtime.suppressValue(((lineno = 20, colno = 70, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isNew\"), \"isNew\", context, [])) || runtime.contextOrFrameLookup(context, frame, \"open_internally\")?\"checked\":\"\"), env.opts.autoescape);\noutput += \">\\n\\t\\t\\t\\t\\t\\tOpen Internally\\n\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"service-cover-image-chooser imageChooser\\\">\\n\\t\\t\\t<div class=\\\"service-cover-image\\\"></div>\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar content_oldRoot = content_obj.root;\ncontent_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcontent_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"content\": new nunjucks.Template( {obj: content_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"header\\\">\\n\\t<h4 class=\\\"title left\\\"><span class=\\\"fal fa-cloud\\\"/>&nbsp;Learning Tools</h4>\\n\\t<div class=\\\"actions\\\">\\n\\t\\t\";\nif((env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"api\")),\"services\")),\"post\")))) {\noutput += \"\\n\\t\\t\\t<div class=\\\"addServiceIcon\\\"><span class=\\\"fal fa-plus\\\"/> Learning Tool</div>\\n\\t\\t\";\n;\n}\noutput += \"\\n\\t</div>\\n</div>\\n\\n<div class=\\\"ops-bar\\\">\\n\\t<div class=\\\"filters\\\"></div>\\n\\t<div class=\\\"counter\\\"></div>\\n</div>\\n\\n<div class=\\\"grid\\\"></div>\\n\\n<div class=\\\"paging\\\"></div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"header\\\">\\n\\t<h4 class=\\\"title left\\\"><span class=\\\"fal fa-signal\\\"/>&nbsp;Sessions</h4>\\n\\t<!--<div class=\\\"actions\\\">\\n\\t\\t<div class=\\\"upload\\\"><span class=\\\"fa fa-cloud-upload\\\"/> Upload Choices Manually</div>\\n\\t</div>-->\\n</div>\\n\\n<div class=\\\"ops-bar\\\">\\n\\t<div class=\\\"filters\\\"></div>\\n\\t<div class=\\\"counter\\\"></div>\\n</div>\\n\\n<div class=\\\"grid\\\"></div>\\n\\n<div class=\\\"paging\\\"></div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"modal-title\\\"><span class=\\\"fal fa-list-ul\\\"/> Changelog for \";\noutput += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"model\")),\"name\"), env.opts.autoescape);\noutput += \"</div>\\n<div class=\\\"modal-body\\\">\\n\\t\";\nif(!runtime.contextOrFrameLookup(context, frame, \"items\")) {\noutput += \"\\n\\t\\t<div style=\\\"margin: 0 auto; width: 100%; text-align: center;\\\">\\n\\t\\t\\t<span class=\\\"spinner-icon spinner-small\\\"/> Loading...\\n\\t\\t</div>\\n\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t<label class=\\\"search-box\\\">\\n\\t\\t\\t<div class=\\\"fal fa-search\\\"></div>\\n\\t\\t\\t<input type=\\\"text\\\" placeholder=\\\"Search...\\\" required name=\\\"searchText\\\" value=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"searchText\"), env.opts.autoescape);\noutput += \"\\\"/>\\n\\t\\t\\t<div class=\\\"input-overlay fal fa-times\\\" title=\\\"Clear field\\\"/>\\n\\t\\t</label>\\n\\n\\t\\t\";\nif(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"items\")),\"length\") == 0) {\noutput += \"\\n\\t\\t\\t<div>There is nothing to show</div>\\n\\t\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t\\t\";\nframe = frame.push();\nvar t_3 = runtime.contextOrFrameLookup(context, frame, \"items\");\nif(t_3) {var t_2 = t_3.length;\nfor(var t_1=0; t_1 < t_3.length; t_1++) {\nvar t_4 = t_3[t_1];\nframe.set(\"row\", t_4);\nframe.set(\"loop.index\", t_1 + 1);\nframe.set(\"loop.index0\", t_1);\nframe.set(\"loop.revindex\", t_2 - t_1);\nframe.set(\"loop.revindex0\", t_2 - t_1 - 1);\nframe.set(\"loop.first\", t_1 === 0);\nframe.set(\"loop.last\", t_1 === t_2 - 1);\nframe.set(\"loop.length\", t_2);\noutput += \"\\n\\t\\t\\t\\t<div class=\\\"item\\\" data-full=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_4),\"datum\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"when\\\">\";\noutput += runtime.suppressValue((lineno = 18, colno = 31, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"fromNow\"), \"fromNow\", context, [runtime.memberLookup((t_4),\"datum\")])), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t\\t\\t<div class=\\\"who\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, (runtime.memberLookup((t_4),\"user\") || \"SYSTEM\")), env.opts.autoescape);\noutput += \" \";\noutput += runtime.suppressValue((!runtime.memberLookup((t_4),\"impersonator\")?\"\":(\" (impersonated by \" + (env.getFilter(\"escape\").call(context, runtime.memberLookup((t_4),\"impersonator\"))) + \")\")), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t\\t\\t<div class=\\\"title\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.memberLookup((t_4),\"action\")), env.opts.autoescape);\noutput += \"</div>\\n\\t\\t\\t\\t\\t<div class=\\\"meta\\\">\\n\\t\\t\\t\\t\\t\\t\";\nif(runtime.memberLookup((t_4),\"target\")) {\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t<div><span class=\\\"fas fa-arrow-right\\\"/> User: \";\noutput += runtime.suppressValue(runtime.memberLookup((t_4),\"target\"), env.opts.autoescape);\noutput += \" [<code>\";\noutput += runtime.suppressValue(runtime.memberLookup((t_4),\"target_username\"), env.opts.autoescape);\noutput += \"</code>]</div>\\n\\t\\t\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t\\t\\t\";\nif(runtime.memberLookup((t_4),\"group_name\")) {\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t<div><span class=\\\"fas fa-arrow-right\\\"/> Group: \";\noutput += runtime.suppressValue(runtime.memberLookup((t_4),\"group_name\"), env.opts.autoescape);\noutput += \" [<code>\";\noutput += runtime.suppressValue(runtime.memberLookup((t_4),\"group_code\"), env.opts.autoescape);\noutput += \"</code>]</div>\\n\\t\\t\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t\\t\";\nif(runtime.memberLookup((t_4),\"changes\")) {\noutput += \"\\n\\t\\t\\t\\t\\t\\t<div class=\\\"detail\\\">\\n\\t\\t\\t\\t\\t\\t\\t\";\nframe = frame.push();\nvar t_7 = runtime.memberLookup((t_4),\"changes\");\nif(t_7) {var t_5;\nif(runtime.isArray(t_7)) {\nvar t_6 = t_7.length;\nfor(t_5=0; t_5 < t_7.length; t_5++) {\nvar t_8 = t_7[t_5][0]\nframe.set(\"key\", t_7[t_5][0]);\nvar t_9 = t_7[t_5][1]\nframe.set(\"val\", t_7[t_5][1]);\nframe.set(\"loop.index\", t_5 + 1);\nframe.set(\"loop.index0\", t_5);\nframe.set(\"loop.revindex\", t_6 - t_5);\nframe.set(\"loop.revindex0\", t_6 - t_5 - 1);\nframe.set(\"loop.first\", t_5 === 0);\nframe.set(\"loop.last\", t_5 === t_6 - 1);\nframe.set(\"loop.length\", t_6);\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t\\t<strong>\";\noutput += runtime.suppressValue(t_8, env.opts.autoescape);\noutput += \"</strong>: <code>\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, env.getFilter(\"dumpIfObject\").call(context, runtime.memberLookup((t_9),\"old\"))), env.opts.autoescape);\noutput += \"</code> ➔ <code>\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, env.getFilter(\"dumpIfObject\").call(context, runtime.memberLookup((t_9),\"new\"))), env.opts.autoescape);\noutput += \"</code><br/>\\n\\t\\t\\t\\t\\t\\t\\t\";\n;\n}\n} else {\nt_5 = -1;\nvar t_6 = runtime.keys(t_7).length;\nfor(var t_10 in t_7) {\nt_5++;\nvar t_11 = t_7[t_10];\nframe.set(\"key\", t_10);\nframe.set(\"val\", t_11);\nframe.set(\"loop.index\", t_5 + 1);\nframe.set(\"loop.index0\", t_5);\nframe.set(\"loop.revindex\", t_6 - t_5);\nframe.set(\"loop.revindex0\", t_6 - t_5 - 1);\nframe.set(\"loop.first\", t_5 === 0);\nframe.set(\"loop.last\", t_5 === t_6 - 1);\nframe.set(\"loop.length\", t_6);\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t\\t<strong>\";\noutput += runtime.suppressValue(t_10, env.opts.autoescape);\noutput += \"</strong>: <code>\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, env.getFilter(\"dumpIfObject\").call(context, runtime.memberLookup((t_11),\"old\"))), env.opts.autoescape);\noutput += \"</code> ➔ <code>\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, env.getFilter(\"dumpIfObject\").call(context, runtime.memberLookup((t_11),\"new\"))), env.opts.autoescape);\noutput += \"</code><br/>\\n\\t\\t\\t\\t\\t\\t\\t\";\n;\n}\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\";\n;\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t\";\n;\n}\noutput += \"\\n\\t\";\n;\n}\noutput += \"\\n\\t<div class=\\\"modal-error hide\\\"></div>\\n</div>\\n<div class=\\\"modal-footer\\\">\\n\\t<button class=\\\"button success ok\\\">OK</button>\\n</div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar accessMatrixValue_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span class=\\\"fal \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"hasAccess\")?\"fa-check\":\"\"), env.opts.autoescape);\noutput += \"\\\" />\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar accessMatrixValue_oldRoot = accessMatrixValue_obj.root;\naccessMatrixValue_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\taccessMatrixValue_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar permissionListItem_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"name\"), env.opts.autoescape);\noutput += \"</span>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar permissionListItem_oldRoot = permissionListItem_obj.root;\npermissionListItem_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tpermissionListItem_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar roleListItem_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"name\"), env.opts.autoescape);\noutput += \"</span>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar roleListItem_oldRoot = roleListItem_obj.root;\nroleListItem_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\troleListItem_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar grid_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"header-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"body-container\\\">\\n\\t\\t<div class=\\\"role-region\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"value-region\\\">\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar grid_oldRoot = grid_obj.root;\ngrid_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tgrid_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar layout_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"status-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"header-region hide\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"content-region hide\\\">\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar layout_oldRoot = layout_obj.root;\nlayout_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlayout_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"accessMatrixValue\": new nunjucks.Template( {obj: accessMatrixValue_obj, type: \"code\"}, env),\t\"permissionListItem\": new nunjucks.Template( {obj: permissionListItem_obj, type: \"code\"}, env),\t\"roleListItem\": new nunjucks.Template( {obj: roleListItem_obj, type: \"code\"}, env),\t\"grid\": new nunjucks.Template( {obj: grid_obj, type: \"code\"}, env),\t\"layout\": new nunjucks.Template( {obj: layout_obj, type: \"code\"}, env),};\n",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar $ = require(\"jquery\");\n\nvar App = require(\"../../index\");\nvar settings = require(\"app-settings\");\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar SmallModal = require(\"../../lib/smallModal\");\nvar ServerGrid = require(\"../../lib/serverGrid\");\nvar gradeMap = require(\"../../lib/gradeMap\");\n\nvar DeviceBindingModel = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"binding_id\",\n\n\tcomputeds: {\n\t\tbookGrade: function bookGrade() {\n\t\t\treturn _.map(this.get(\"grade\"), function (x) {\n\t\t\t\treturn gradeMap.codeToHumanValue(x);\n\t\t\t}).join(\", \");\n\t\t}\n\t}\n});\n\nvar Collection = Backbone.PageableCollection.extend({\n\tmodel: DeviceBindingModel,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/devices/bindings?paged=true\";\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"content device-bindings-editor\",\n\n\ttemplate: require(\"../templates/deviceBindings.nunj\"),\n\n\tui: {\n\t\tgrid: \".grid\",\n\t\tpaging: \".paging\",\n\t\tcounter: \".counter\",\n\t\tfilters: \".filters\",\n\t\tdownload: \".downloadList\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.download\": \"onActionDownload\"\n\t},\n\n\tcollectionEvents: {\n\t\t\"toolbar:click:delete\": \"deleteBindings\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.deviceBindingCollection = options.deviceBindingCollection;\n\t\tthis.eventBus = options.eventBus;\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"firstname\", label: \"First Name\", cell: \"string\", editable: false }, { name: \"surname\", label: \"Surname\", cell: \"string\", editable: false }, { name: \"username\", label: \"Username\", cell: \"string\", editable: false }, { name: \"device\", label: \"Device\", cell: \"string\", editable: false }, { name: \"title\", label: \"Title\", cell: \"string\", editable: false }, { name: \"language\", label: \"Language\", cell: \"string\", editable: false }, { name: \"subject\", label: \"Subject\", cell: \"string\", editable: false }, { name: \"bookGrade\", label: \"Study Year\", cell: \"string\", editable: false }, { name: \"isbn\", label: \"ISBN\", cell: \"string\", editable: false }, { name: \"publisher\", label: \"Publisher\", cell: \"string\", editable: false }, { name: \"created\", label: \"Created\", editable: false, cell: ServerGrid.MomentCell.extend({\n\t\t\t\tmodelInUnixTimestamp: true,\n\t\t\t\tdisplayFormat: \"DD MMM YYYY, HH:mm a\",\n\t\t\t\tdisplayInUTC: false\n\t\t\t}) }, { label: \"Actions\", cell: new ServerGrid.ToolbarCell({ tooltips: [{ title: \"Delete\", icon: \"fa-trash-alt\", data: \"delete\" }] }), editable: false, sortable: false }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new Collection(),\n\t\t\tclickable: true,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counter,\n\t\t\t\ttemplate: \"Bindings $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tthis.bindEvents(this.grid.collection, this.collectionEvents);\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar languageFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"languageFilter\",\n\t\t\tlabel: \"Language\",\n\t\t\tcategories: [{ items: settings.languageList }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar subjectFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"subjectFilter\",\n\t\t\tlabel: \"Subject\",\n\t\t\tserver: {\n\t\t\t\tkey: \"subject_id\",\n\t\t\t\tvalue: \"subject\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/subjects\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\n\t\tvar gradeFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"gradeFilter\",\n\t\t\tlabel: \"Year of Study\",\n\t\t\tserver: true,\n\t\t\tcategories: _.map(settings.gradeList, function (val, key) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: key,\n\t\t\t\t\titems: _.reduce(val.sort(function (a, b) {\n\t\t\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t\t\t}), function (sum, num) {\n\t\t\t\t\t\tsum.push({ name: num.value, label: num.name });return sum;\n\t\t\t\t\t}, [])\n\t\t\t\t};\n\t\t\t})\n\t\t};\n\n\t\tvar pubFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"pubFilter\",\n\t\t\tlabel: \"Publisher\",\n\t\t\tserver: {\n\t\t\t\tkey: \"publisher_id\",\n\t\t\t\tvalue: \"fullname\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/publishers?dummy=false\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\n\t\tvar filterList = [textFilter, languageFilter, subjectFilter, gradeFilter, pubFilter];\n\n\t\tthis.ui.filters.prepend(this.grid.filter({ filterContainer: this.ui.filters, filters: filterList, defaultFilters: [\"textFilter\"] }).render().el);\n\t},\n\n\tdeleteBindings: function deleteBindings(model) {\n\t\tvar _this = this;\n\n\t\tthis.modal = new SmallModal({\n\t\t\tpersist: true,\n\t\t\twarning: true,\n\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Delete Bindings: \" + model.get(\"firstname\") + \" \" + model.get(\"surname\") + \" (\" + model.get(\"username\") + \")\",\n\t\t\tbody: \"<p>Deleting this binding will delete ALL bindings for this user, not just the single binding you selected.</p><p>Are you sure you wish to continue?</p>\"\n\t\t});\n\n\t\tthis.modal.on(\"button:ok\", function () {\n\t\t\t$.ajax({\n\t\t\t\turl: settings.urlRoot + \"/api/1.0/devices/bindings/\" + encodeURIComponent(model.get(\"person\")),\n\t\t\t\tmethod: \"DELETE\",\n\t\t\t\tsuccess: _this.onDeleteSuccess.bind(_this, model),\n\t\t\t\terror: _this.onDeleteError.bind(_this)\n\t\t\t});\n\t\t});\n\n\t\tthis.modal.show();\n\t},\n\n\tonDeleteSuccess: function onDeleteSuccess(deviceBindingModel) {\n\t\tthis.modal.destroy();\n\n\t\t// Remove all other rows that were created by the same user\n\t\tvar modelsToRemove = this.grid.collection.filter(function (model) {\n\t\t\treturn model.get(\"person\") === deviceBindingModel.get(\"person\");\n\t\t});\n\n\t\tthis.grid.collection.remove(modelsToRemove);\n\n\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\tcontent: \"All bindings for \" + deviceBindingModel.get(\"firstname\") + \" \" + deviceBindingModel.get(\"surname\") + \" successfully deleted\",\n\t\t\ticon: \"fa-trash-alt\",\n\t\t\ticonColour: \"red\"\n\t\t});\n\t},\n\n\tonDeleteError: function onDeleteError(deviceBindingModel, response) {\n\t\tvar answer = App.parseResponse(response);\n\n\t\tthis.modal.showError(\"Deletion failed: \" + (answer.detail || answer.info));\n\t},\n\n\tonActionDownload: function onActionDownload() {\n\t\twindow.open(settings.urlRoot + \"/api/1.0/devices/bindings?format=csv\");\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(this.eventBus);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRldmljZUJpbmRpbmdzLmpzIl0sIm5hbWVzIjpbIl8iLCJyZXF1aXJlIiwiQmFja2JvbmUiLCIkIiwiQXBwIiwic2V0dGluZ3MiLCJyYWRpbyIsIlJhZGlvIiwiY2hhbm5lbCIsIlNtYWxsTW9kYWwiLCJTZXJ2ZXJHcmlkIiwiZ3JhZGVNYXAiLCJEZXZpY2VCaW5kaW5nTW9kZWwiLCJFcG94eSIsIk1vZGVsIiwiZXh0ZW5kIiwiaWRBdHRyaWJ1dGUiLCJjb21wdXRlZHMiLCJib29rR3JhZGUiLCJtYXAiLCJnZXQiLCJjb2RlVG9IdW1hblZhbHVlIiwieCIsImpvaW4iLCJDb2xsZWN0aW9uIiwiUGFnZWFibGVDb2xsZWN0aW9uIiwibW9kZWwiLCJ1cmwiLCJ1cmxSb290Iiwic3RhdGUiLCJwYWdlU2l6ZSIsIm1vZGUiLCJxdWVyeVBhcmFtcyIsInNvcnRLZXkiLCJwYXJzZVN0YXRlIiwicmVzcCIsInRvdGFsUmVjb3JkcyIsInRvdGFsIiwicGFyc2VSZWNvcmRzIiwicm93cyIsIm1vZHVsZSIsImV4cG9ydHMiLCJNYXJpb25ldHRlIiwiVmlldyIsImNsYXNzTmFtZSIsInRlbXBsYXRlIiwidWkiLCJncmlkIiwicGFnaW5nIiwiY291bnRlciIsImZpbHRlcnMiLCJkb3dubG9hZCIsImV2ZW50cyIsImNvbGxlY3Rpb25FdmVudHMiLCJpbml0aWFsaXplIiwib3B0aW9ucyIsImRldmljZUJpbmRpbmdDb2xsZWN0aW9uIiwiZXZlbnRCdXMiLCJvblJlbmRlciIsImNvbHVtbnMiLCJuYW1lIiwibGFiZWwiLCJjZWxsIiwiZWRpdGFibGUiLCJNb21lbnRDZWxsIiwibW9kZWxJblVuaXhUaW1lc3RhbXAiLCJkaXNwbGF5Rm9ybWF0IiwiZGlzcGxheUluVVRDIiwiVG9vbGJhckNlbGwiLCJ0b29sdGlwcyIsInRpdGxlIiwiaWNvbiIsImRhdGEiLCJzb3J0YWJsZSIsImVsIiwiY29sbGVjdGlvbiIsImNsaWNrYWJsZSIsImVsZW1lbnQiLCJiaW5kRXZlbnRzIiwidGV4dEZpbHRlciIsInR5cGUiLCJkZWJvdW5jZSIsInNlcnZlciIsImxhbmd1YWdlRmlsdGVyIiwiY2F0ZWdvcmllcyIsIml0ZW1zIiwibGFuZ3VhZ2VMaXN0Iiwic3ViamVjdEZpbHRlciIsImtleSIsInZhbHVlIiwiZmV0Y2giLCJpbmZpbml0ZSIsImdyYWRlRmlsdGVyIiwiZ3JhZGVMaXN0IiwidmFsIiwicmVkdWNlIiwic29ydCIsImEiLCJiIiwibGV4aWNhbCIsInRvVXBwZXJDYXNlIiwibG9jYWxlQ29tcGFyZSIsInN1bSIsIm51bSIsInB1c2giLCJwdWJGaWx0ZXIiLCJmaWx0ZXJMaXN0IiwicHJlcGVuZCIsImZpbHRlciIsImZpbHRlckNvbnRhaW5lciIsImRlZmF1bHRGaWx0ZXJzIiwicmVuZGVyIiwiZGVsZXRlQmluZGluZ3MiLCJtb2RhbCIsInBlcnNpc3QiLCJ3YXJuaW5nIiwiYm9keSIsIm9uIiwiYWpheCIsImVuY29kZVVSSUNvbXBvbmVudCIsIm1ldGhvZCIsInN1Y2Nlc3MiLCJvbkRlbGV0ZVN1Y2Nlc3MiLCJiaW5kIiwiZXJyb3IiLCJvbkRlbGV0ZUVycm9yIiwic2hvdyIsImRldmljZUJpbmRpbmdNb2RlbCIsImRlc3Ryb3kiLCJtb2RlbHNUb1JlbW92ZSIsInJlbW92ZSIsInRyaWdnZXIiLCJFdmVudHMiLCJDb21tYW5kcyIsIlRvYXN0IiwiY29udGVudCIsImljb25Db2xvdXIiLCJyZXNwb25zZSIsImFuc3dlciIsInBhcnNlUmVzcG9uc2UiLCJzaG93RXJyb3IiLCJkZXRhaWwiLCJpbmZvIiwib25BY3Rpb25Eb3dubG9hZCIsIndpbmRvdyIsIm9wZW4iLCJvbkJlZm9yZURlc3Ryb3kiLCJzdG9wTGlzdGVuaW5nIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLFdBQVdELFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1FLElBQUlGLFFBQVEsUUFBUixDQUFWOztBQUVBLElBQU1HLE1BQU1ILFFBQVEsYUFBUixDQUFa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ckIsQ0FBNEJELGNBQTVCOztBQUVBM0gsUUFBTTZILE9BQU4sQ0FBYy9ILElBQUlnSSxNQUFKLENBQVdDLFFBQVgsQ0FBb0JDLEtBQWxDLEVBQXlDO0FBQ3hDQyxZQUFTLHNCQUFzQlIsbUJBQW1CM0csR0FBbkIsQ0FBdUIsV0FBdkIsQ0FBdEIsR0FBNEQsR0FBNUQsR0FDUjJHLG1CQUFtQjNHLEdBQW5CLENBQXVCLFNBQXZCLENBRFEsR0FDNEIsdUJBRkc7QUFHeENtRCxTQUFNLGNBSGtDO0FBSXhDaUUsZUFBWTtBQUo0QixHQUF6QztBQU1BLEVBcksrQzs7QUF1S2hEWCxnQkFBZSx1QkFBU0Usa0JBQVQsRUFBNkJVLFFBQTdCLEVBQXVDO0FBQ3JELE1BQU1DLFNBQVN0SSxJQUFJdUksYUFBSixDQUFrQkYsUUFBbEIsQ0FBZjs7QUFFQSxPQUFLeEIsS0FBTCxDQUFXMkIsU0FBWCxDQUFxQix1QkFBdUJGLE9BQU9HLE1BQVAsSUFBaUJILE9BQU9JLElBQS9DLENBQXJCO0FBQ0EsRUEzSytDOztBQTZLaERDLG1CQUFrQiw0QkFBVztBQUM1QkMsU0FBT0MsSUFBUCxDQUFZNUksU0FBU3VCLE9BQVQsR0FBbUIsc0NBQS9CO0FBQ0EsRUEvSytDOztBQWlMaERzSCxrQkFBaUIsMkJBQVc7QUFDM0IsT0FBS0MsYUFBTCxDQUFtQixLQUFLMUYsUUFBeEI7QUFDQTtBQW5MK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoiZGV2aWNlQmluZGluZ3MuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcblxuY29uc3QgQXBwID0gcmVxdWlyZShcIi4uLy4uL2luZGV4XCIpO1xuY29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuY29uc3QgcmFkaW8gPSBCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZ2xvYmFsXCIpO1xuXG5jb25zdCBTbWFsbE1vZGFsID0gcmVxdWlyZShcIi4uLy4uL2xpYi9zbWFsbE1vZGFsXCIpO1xuY29uc3QgU2VydmVyR3JpZCA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc2VydmVyR3JpZFwiKTtcbmNvbnN0IGdyYWRlTWFwID0gcmVxdWlyZShcIi4uLy4uL2xpYi9ncmFkZU1hcFwiKTtcblxuY29uc3QgRGV2aWNlQmluZGluZ01vZGVsID0gQmFja2JvbmUuRXBveHkuTW9kZWwuZXh0ZW5kKHtcblx0aWRBdHRyaWJ1dGU6IFwiYmluZGluZ19pZFwiLFxuXG5cdGNvbXB1dGVkczoge1xuXHRcdGJvb2tHcmFkZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gXy5tYXAodGhpcy5nZXQoXCJncmFkZVwiKSwgeCA9PiBncmFkZU1hcC5jb2RlVG9IdW1hblZhbHVlKHgpKS5qb2luKFwiLCBcIik7XG5cdFx0fSxcblx0fSxcbn0pO1xuXG5jb25zdCBDb2xsZWN0aW9uID0gQmFja2JvbmUuUGFnZWFibGVDb2xsZWN0aW9uLmV4dGVuZCh7XG5cdG1vZGVsOiBEZXZpY2VCaW5kaW5nTW9kZWwsXG5cblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvZGV2aWNlcy9iaW5kaW5ncz9wYWdlZD10cnVlXCI7XG5cdH0sXG5cblx0c3RhdGU6IHtcblx0XHRwYWdlU2l6ZTogMzAsXG5cdH0sXG5cdG1vZGU6IFwic2VydmVyXCIsXG5cblx0cXVlcnlQYXJhbXM6IHtcblx0XHRwYWdlU2l6ZTogXCJwYWdlU2l6ZVwiLFxuXHRcdHNvcnRLZXk6IFwic29ydEJ5XCIsXG5cdH0sXG5cblx0cGFyc2VTdGF0ZTogZnVuY3Rpb24ocmVzcCkge1xuXHRcdHJldHVybiB7IHRvdGFsUmVjb3JkczogcmVzcC50b3RhbCB9O1xuXHR9LFxuXG5cdHBhcnNlUmVjb3JkczogZnVuY3Rpb24ocmVzcCkge1xuXHRcdHJldHVybiByZXNwLnJvd3M7XG5cdH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImNvbnRlbnQgZGV2aWNlLWJpbmRpbmdzLWVkaXRvclwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2RldmljZUJpbmRpbmdzLm51bmpcIiksXG5cblx0dWk6IHtcblx0XHRncmlkOiBcIi5ncmlkXCIsXG5cdFx0cGFnaW5nOiBcIi5wYWdpbmdcIixcblx0XHRjb3VudGVyOiBcIi5jb3VudGVyXCIsXG5cdFx0ZmlsdGVyczogXCIuZmlsdGVyc1wiLFxuXHRcdGRvd25sb2FkOiBcIi5kb3dubG9hZExpc3RcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5kb3dubG9hZFwiOiBcIm9uQWN0aW9uRG93bmxvYWRcIixcblx0fSxcblxuXHRjb2xsZWN0aW9uRXZlbnRzOiB7XG5cdFx0XCJ0b29sYmFyOmNsaWNrOmRlbGV0ZVwiOiBcImRlbGV0ZUJpbmRpbmdzXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuZGV2aWNlQmluZGluZ0NvbGxlY3Rpb24gPSBvcHRpb25zLmRldmljZUJpbmRpbmdDb2xsZWN0aW9uO1xuXHRcdHRoaXMuZXZlbnRCdXMgPSBvcHRpb25zLmV2ZW50QnVzO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBjb2x1bW5zID0gW1xuXHRcdFx0eyBuYW1lOiBcImZpcnN0bmFtZVwiLCBsYWJlbDogXCJGaXJzdCBOYW1lXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcInN1cm5hbWVcIiwgbGFiZWw6IFwiU3VybmFtZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJ1c2VybmFtZVwiLCBsYWJlbDogXCJVc2VybmFtZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJkZXZpY2VcIiwgbGFiZWw6IFwiRGV2aWNlXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcInRpdGxlXCIsIGxhYmVsOiBcIlRpdGxlXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImxhbmd1YWdlXCIsIGxhYmVsOiBcIkxhbmd1YWdlXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcInN1YmplY3RcIiwgbGFiZWw6IFwiU3ViamVjdFwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJib29rR3JhZGVcIiwgbGFiZWw6IFwiU3R1ZHkgWWVhclwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJpc2JuXCIsIGxhYmVsOiBcIklTQk5cIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwicHVibGlzaGVyXCIsIGxhYmVsOiBcIlB1Ymxpc2hlclwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJjcmVhdGVkXCIsIGxhYmVsOiBcIkNyZWF0ZWRcIiwgZWRpdGFibGU6IGZhbHNlLCBjZWxsOiBTZXJ2ZXJHcmlkLk1vbWVudENlbGwuZXh0ZW5kKHtcblx0XHRcdFx0bW9kZWxJblVuaXhUaW1lc3RhbXA6IHRydWUsXG5cdFx0XHRcdGRpc3BsYXlGb3JtYXQ6IFwiREQgTU1NIFlZWVksIEhIOm1tIGFcIixcblx0XHRcdFx0ZGlzcGxheUluVVRDOiBmYWxzZSxcblx0XHRcdH0pIH0sXG5cdFx0XHR7IGxhYmVsOiBcIkFjdGlvbnNcIiwgY2VsbDogbmV3IFNlcnZlckdyaWQuVG9vbGJhckNlbGwoeyB0b29sdGlwczogW1xuXHRcdFx0XHR7IHRpdGxlOiBcIkRlbGV0ZVwiLCBpY29uOiBcImZhLXRyYXNoLWFsdFwiLCBkYXRhOiBcImRlbGV0ZVwiIH0sXG5cdFx0XHRdIH0pLCBlZGl0YWJsZTogZmFsc2UsIHNvcnRhYmxlOiBmYWxzZSB9LFxuXHRcdF07XG5cblx0XHR0aGlzLmdyaWQgPSBuZXcgU2VydmVyR3JpZCh7XG5cdFx0XHRlbDogdGhpcy51aS5ncmlkLFxuXHRcdFx0Y29sdW1uczogY29sdW1ucyxcblx0XHRcdGNvbGxlY3Rpb246IG5ldyBDb2xsZWN0aW9uKCksXG5cdFx0XHRjbGlja2FibGU6IHRydWUsXG5cdFx0XHRjb3VudGVyOiB7XG5cdFx0XHRcdGVsZW1lbnQ6IHRoaXMudWkuY291bnRlcixcblx0XHRcdFx0dGVtcGxhdGU6IFwiQmluZGluZ3MgJHN0YXJ0IC0gJGVuZCBvZiAkdG90YWxcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5wYWdpbmcsXG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5iaW5kRXZlbnRzKHRoaXMuZ3JpZC5jb2xsZWN0aW9uLCB0aGlzLmNvbGxlY3Rpb25FdmVudHMpO1xuXG5cdFx0Y29uc3QgdGV4dEZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwidGV4dFwiLFxuXHRcdFx0bmFtZTogXCJ0ZXh0RmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJUZXh0IFNlYXJjaFwiLFxuXHRcdFx0ZGVib3VuY2U6IDIwMCxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgbGFuZ3VhZ2VGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcImxhbmd1YWdlRmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJMYW5ndWFnZVwiLFxuXHRcdFx0Y2F0ZWdvcmllczogW1xuXHRcdFx0XHR7IGl0ZW1zOiBzZXR0aW5ncy5sYW5ndWFnZUxpc3QgfSxcblx0XHRcdF0sXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdGNvbnN0IHN1YmplY3RGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcInN1YmplY3RGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlN1YmplY3RcIixcblx0XHRcdHNlcnZlcjoge1xuXHRcdFx0XHRrZXk6IFwic3ViamVjdF9pZFwiLFxuXHRcdFx0XHR2YWx1ZTogXCJzdWJqZWN0XCIsXG5cdFx0XHRcdGZldGNoOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9kYXRhL3N1YmplY3RzXCIsXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdHBhZ2VTaXplOiAzMCxcblx0XHRcdFx0aW5maW5pdGU6IHRydWUsXG5cdFx0XHR9LFxuXHRcdH07XG5cblx0XHRjb25zdCBncmFkZUZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiaXRlbWl6ZWRcIixcblx0XHRcdG5hbWU6IFwiZ3JhZGVGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlllYXIgb2YgU3R1ZHlcIixcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHRcdGNhdGVnb3JpZXM6IF8ubWFwKHNldHRpbmdzLmdyYWRlTGlzdCwgKHZhbCwga2V5KSA9PiAoe1xuXHRcdFx0XHRsYWJlbDoga2V5LFxuXHRcdFx0XHRpdGVtczogXy5yZWR1Y2UodmFsLnNvcnQoKGEsIGIpID0+IChcImxleGljYWxcIiBpbiBhID8gYS5sZXhpY2FsIDogYS5uYW1lKS50b1VwcGVyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoKFwibGV4aWNhbFwiIGluIGIgPyBiLmxleGljYWwgOiBiLm5hbWUpLnRvVXBwZXJDYXNlKCkpKSxcblx0XHRcdFx0XHQoc3VtLCBudW0pID0+IHsgc3VtLnB1c2goeyBuYW1lOiBudW0udmFsdWUsIGxhYmVsOiBudW0ubmFtZSB9KTsgcmV0dXJuIHN1bTsgfSwgW10pLFxuXHRcdFx0fSkpLFxuXHRcdH07XG5cblx0XHRjb25zdCBwdWJGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcInB1YkZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiUHVibGlzaGVyXCIsXG5cdFx0XHRzZXJ2ZXI6IHtcblx0XHRcdFx0a2V5OiBcInB1Ymxpc2hlcl9pZFwiLFxuXHRcdFx0XHR2YWx1ZTogXCJmdWxsbmFtZVwiLFxuXHRcdFx0XHRmZXRjaDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvZGF0YS9wdWJsaXNoZXJzP2R1bW15PWZhbHNlXCIsXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdHBhZ2VTaXplOiAzMCxcblx0XHRcdFx0aW5maW5pdGU6IHRydWUsXG5cdFx0XHR9LFxuXHRcdH07XG5cblx0XHRjb25zdCBmaWx0ZXJMaXN0ID0gW3RleHRGaWx0ZXIsIGxhbmd1YWdlRmlsdGVyLCBzdWJqZWN0RmlsdGVyLCBncmFkZUZpbHRlciwgcHViRmlsdGVyXTtcblxuXHRcdHRoaXMudWkuZmlsdGVycy5wcmVwZW5kKHRoaXMuZ3JpZC5maWx0ZXIoeyBmaWx0ZXJDb250YWluZXI6IHRoaXMudWkuZmlsdGVycywgZmlsdGVyczogZmlsdGVyTGlzdCwgZGVmYXVsdEZpbHRlcnM6IFtcInRleHRGaWx0ZXJcIl0gfSkucmVuZGVyKCkuZWwpO1xuXHR9LFxuXG5cdGRlbGV0ZUJpbmRpbmdzOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdHRoaXMubW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHRwZXJzaXN0OiB0cnVlLFxuXHRcdFx0d2FybmluZzogdHJ1ZSxcblx0XHRcdHRpdGxlOiBcIjxzcGFuIGNsYXNzPSdmYWwgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUnLz4gRGVsZXRlIEJpbmRpbmdzOiBcIiArXG5cdFx0XHRcdG1vZGVsLmdldChcImZpcnN0bmFtZVwiKSArIFwiIFwiICsgbW9kZWwuZ2V0KFwic3VybmFtZVwiKSArIFwiIChcIiArIG1vZGVsLmdldChcInVzZXJuYW1lXCIpICsgXCIpXCIsXG5cdFx0XHRib2R5OiBcIjxwPkRlbGV0aW5nIHRoaXMgYmluZGluZyB3aWxsIGRlbGV0ZSBBTEwgYmluZGluZ3MgZm9yIHRoaXMgdXNlciwgbm90IGp1c3QgdGhlIHNpbmdsZSBiaW5kaW5nIHlvdSBzZWxlY3RlZC48L3A+PHA+QXJlIHlvdSBzdXJlIHlvdSB3aXNoIHRvIGNvbnRpbnVlPzwvcD5cIixcblx0XHR9KTtcblxuXHRcdHRoaXMubW9kYWwub24oXCJidXR0b246b2tcIiwgKCkgPT4ge1xuXHRcdFx0JC5hamF4KHtcblx0XHRcdFx0dXJsOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9kZXZpY2VzL2JpbmRpbmdzL1wiICsgZW5jb2RlVVJJQ29tcG9uZW50KG1vZGVsLmdldChcInBlcnNvblwiKSksXG5cdFx0XHRcdG1ldGhvZDogXCJERUxFVEVcIixcblx0XHRcdFx0c3VjY2VzczogdGhpcy5vbkRlbGV0ZVN1Y2Nlc3MuYmluZCh0aGlzLCBtb2RlbCksXG5cdFx0XHRcdGVycm9yOiB0aGlzLm9uRGVsZXRlRXJyb3IuYmluZCh0aGlzKSxcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5tb2RhbC5zaG93KCk7XG5cdH0sXG5cblx0b25EZWxldGVTdWNjZXNzOiBmdW5jdGlvbihkZXZpY2VCaW5kaW5nTW9kZWwpIHtcblx0XHR0aGlzLm1vZGFsLmRlc3Ryb3koKTtcblxuXHRcdC8vIFJlbW92ZSBhbGwgb3RoZXIgcm93cyB0aGF0IHdlcmUgY3JlYXRlZCBieSB0aGUgc2FtZSB1c2VyXG5cdFx0Y29uc3QgbW9kZWxzVG9SZW1vdmUgPSB0aGlzLmdyaWQuY29sbGVjdGlvbi5maWx0ZXIobW9kZWwgPT5cblx0XHRcdG1vZGVsLmdldChcInBlcnNvblwiKSA9PT0gZGV2aWNlQmluZGluZ01vZGVsLmdldChcInBlcnNvblwiKSk7XG5cblx0XHR0aGlzLmdyaWQuY29sbGVjdGlvbi5yZW1vdmUobW9kZWxzVG9SZW1vdmUpO1xuXG5cdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7XG5cdFx0XHRjb250ZW50OiBcIkFsbCBiaW5kaW5ncyBmb3IgXCIgKyBkZXZpY2VCaW5kaW5nTW9kZWwuZ2V0KFwiZmlyc3RuYW1lXCIpICsgXCIgXCIgK1xuXHRcdFx0XHRkZXZpY2VCaW5kaW5nTW9kZWwuZ2V0KFwic3VybmFtZVwiKSArIFwiIHN1Y2Nlc3NmdWxseSBkZWxldGVkXCIsXG5cdFx0XHRpY29uOiBcImZhLXRyYXNoLWFsdFwiLFxuXHRcdFx0aWNvbkNvbG91cjogXCJyZWRcIixcblx0XHR9KTtcblx0fSxcblxuXHRvbkRlbGV0ZUVycm9yOiBmdW5jdGlvbihkZXZpY2VCaW5kaW5nTW9kZWwsIHJlc3BvbnNlKSB7XG5cdFx0Y29uc3QgYW5zd2VyID0gQXBwLnBhcnNlUmVzcG9uc2UocmVzcG9uc2UpO1xuXG5cdFx0dGhpcy5tb2RhbC5zaG93RXJyb3IoXCJEZWxldGlvbiBmYWlsZWQ6IFwiICsgKGFuc3dlci5kZXRhaWwgfHwgYW5zd2VyLmluZm8pKTtcblx0fSxcblxuXHRvbkFjdGlvbkRvd25sb2FkOiBmdW5jdGlvbigpIHtcblx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9kZXZpY2VzL2JpbmRpbmdzP2Zvcm1hdD1jc3ZcIik7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcodGhpcy5ldmVudEJ1cyk7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar Promise = require(\"bluebird\");\nvar raygun = require(\"raygun\");\n\nvar settings = require(\"app-settings\");\n\nvar BookModel = require(\"../../../books/bookModel\");\n\nvar BookCollection = Backbone.Collection.extend({\n\tmodel: BookModel,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/epubs\";\n\t}\n});\n\nmodule.exports = function () {\n\t_.extend(this, {\n\t\tinitialize: function initialize(options) {\n\t\t\tvar _this = this;\n\n\t\t\tthis.eventBus = options.eventBus;\n\n\t\t\t// Retrieve the data needed to perform the various checks\n\t\t\tvar collections = [new BookCollection().lazyFetch()];\n\n\t\t\tPromise.all(collections).spread(function (books) {\n\t\t\t\t_this.books = books;\n\n\t\t\t\t_this.eventBus.trigger(\"checks:ready\");\n\t\t\t}).catch(function (error) {\n\t\t\t\t_this.eventBus.trigger(\"checks:error\", error);\n\t\t\t\tif (!settings.debug || settings.reportErrors) raygun(\"send\", error);\n\t\t\t});\n\t\t},\n\n\t\trun: function run() {\n\t\t\tthis.eventBus.trigger(\"checks:complete\");\n\t\t}\n\t});\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJvb2tDaGVja3MuanMiXSwibmFtZXMiOlsiXyIsInJlcXVpcmUiLCJCYWNrYm9uZSIsIlByb21pc2UiLCJyYXlndW4iLCJzZXR0aW5ncyIsIkJvb2tNb2RlbCIsIkJvb2tDb2xsZWN0aW9uIiwiQ29sbGVjdGlvbiIsImV4dGVuZCIsIm1vZGVsIiwidXJsIiwidXJsUm9vdCIsIm1vZHVsZSIsImV4cG9ydHMiLCJpbml0aWFsaXplIiwib3B0aW9ucyIsImV2ZW50QnVzIiwiY29sbGVjdGlvbnMiLCJsYXp5RmV0Y2giLCJhbGwiLCJzcHJlYWQiLCJib29rcyIsInRyaWdnZXIiLCJjYXRjaCIsImVycm9yIiwiZGVidWciLCJyZXBvcnRFcnJvcnMiLCJydW4iXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsV0FBV0QsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUUsVUFBVUYsUUFBUSxVQUFSLENBQWhCO0FBQ0EsSUFBTUcsU0FBU0gsUUFBUSxRQUFSLENBQWY7O0FBRUEsSUFBTUksV0FBV0osUUFBUSxjQUFSLENBQWpCOztBQUVBLElBQU1LLFlBQVlMLFFBQVEsMEJBQVIsQ0FBbEI7O0FBRUEsSUFBTU0saUJBQWlCTCxTQUFTTSxVQUFULENBQW9CQyxNQUFwQixDQUEyQjtBQUNqREMsUUFBT0osU0FEMEM7O0FBR2pESyxNQUFLLGVBQVc7QUFDZixTQUFPTixTQUFTTyxPQUFULEdBQW1CLGdCQUExQjtBQUNBO0FBTGdELENBQTNCLENBQXZCOztBQVFBQyxPQUFPQyxPQUFQLEdBQWlCLFlBQVc7QUFDM0JkLEdBQUVTLE1BQUYsQ0FBUyxJQUFULEVBQWU7QUFDZE0sY0FBWSxvQkFBU0MsT0FBVCxFQUFrQjtBQUFBOztBQUM3QixRQUFLQyxRQUFMLEdBQWdCRCxRQUFRQyxRQUF4Qjs7QUFFQTtBQUNBLE9BQU1DLGNBQWMsQ0FBQyxJQUFJWCxjQUFKLEdBQXFCWSxTQUFyQixFQUFELENBQXBCOztBQUVBaEIsV0FBUWlCLEdBQVIsQ0FBWUYsV0FBWixFQUF5QkcsTUFBekIsQ0FBZ0MsaUJBQVM7QUFDeEMsVUFBS0MsS0FBTCxHQUFhQSxLQUFiOztBQUVBLFVBQUtMLFFBQUwsQ0FBY00sT0FBZCxDQUFzQixjQUF0QjtBQUNBLElBSkQsRUFJR0MsS0FKSCxDQUlTLGlCQUFTO0FBQ2pCLFVBQUtQLFFBQUwsQ0FBY00sT0FBZCxDQUFzQixjQUF0QixFQUFzQ0UsS0FBdEM7QUFDQSxRQUFJLENBQUNwQixTQUFTcUIsS0FBVixJQUFtQnJCLFNBQVNzQixZQUFoQyxFQUNDdkIsT0FBTyxNQUFQLEVBQWVxQixLQUFmO0FBQ0QsSUFSRDtBQVNBLEdBaEJhOztBQWtCZEcsT0FBSyxlQUFXO0FBQ2YsUUFBS1gsUUFBTCxDQUFjTSxPQUFkLENBQXNCLGlCQUF0QjtBQUNBO0FBcEJhLEVBQWY7QUFzQkEsQ0F2QkQiLCJmaWxlIjoiYm9va0NoZWNrcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IFByb21pc2UgPSByZXF1aXJlKFwiYmx1ZWJpcmRcIik7XG5jb25zdCByYXlndW4gPSByZXF1aXJlKFwicmF5Z3VuXCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IEJvb2tNb2RlbCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9ib29rcy9ib29rTW9kZWxcIik7XG5cbmNvbnN0IEJvb2tDb2xsZWN0aW9uID0gQmFja2JvbmUuQ29sbGVjdGlvbi5leHRlbmQoe1xuXHRtb2RlbDogQm9va01vZGVsLFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2VwdWJzXCI7XG5cdH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcblx0Xy5leHRlbmQodGhpcywge1xuXHRcdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHRcdHRoaXMuZXZlbnRCdXMgPSBvcHRpb25zLmV2ZW50QnVzO1xuXG5cdFx0XHQvLyBSZXRyaWV2ZSB0aGUgZGF0YSBuZWVkZWQgdG8gcGVyZm9ybSB0aGUgdmFyaW91cyBjaGVja3Ncblx0XHRcdGNvbnN0IGNvbGxlY3Rpb25zID0gW25ldyBCb29rQ29sbGVjdGlvbigpLmxhenlGZXRjaCgpXTtcblxuXHRcdFx0UHJvbWlzZS5hbGwoY29sbGVjdGlvbnMpLnNwcmVhZChib29rcyA9PiB7XG5cdFx0XHRcdHRoaXMuYm9va3MgPSBib29rcztcblxuXHRcdFx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJjaGVja3M6cmVhZHlcIik7XG5cdFx0XHR9KS5jYXRjaChlcnJvciA9PiB7XG5cdFx0XHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImNoZWNrczplcnJvclwiLCBlcnJvcik7XG5cdFx0XHRcdGlmICghc2V0dGluZ3MuZGVidWcgfHwgc2V0dGluZ3MucmVwb3J0RXJyb3JzKVxuXHRcdFx0XHRcdHJheWd1bihcInNlbmRcIiwgZXJyb3IpO1xuXHRcdFx0fSk7XG5cdFx0fSxcblxuXHRcdHJ1bjogZnVuY3Rpb24oKSB7XG5cdFx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJjaGVja3M6Y29tcGxldGVcIik7XG5cdFx0fSxcblx0fSk7XG59O1xuIl19",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar Promise = require(\"bluebird\");\nvar raygun = require(\"raygun\");\n\nvar settings = require(\"app-settings\");\n\nvar ResourceModel = require(\"../../../content/models/manager/resourceModel\");\n\nvar ResourceCollection = Backbone.Collection.extend({\n\tmodel: ResourceModel,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/resources?own=true\";\n\t}\n});\n\nmodule.exports = function () {\n\t_.extend(this, {\n\t\tinitialize: function initialize(options) {\n\t\t\tvar _this = this;\n\n\t\t\tthis.eventBus = options.eventBus;\n\n\t\t\t// Retrieve the data needed to perform the various checks\n\t\t\tvar collections = [new ResourceCollection().lazyFetch()];\n\n\t\t\tPromise.all(collections).spread(function (resources) {\n\t\t\t\t_this.resources = resources;\n\n\t\t\t\t_this.eventBus.trigger(\"checks:ready\");\n\t\t\t}).catch(function (error) {\n\t\t\t\t_this.eventBus.trigger(\"checks:error\", error);\n\t\t\t\tif (!settings.debug || settings.reportErrors) raygun(\"send\", error);\n\t\t\t});\n\t\t},\n\n\t\trun: function run() {\n\t\t\tthis.eventBus.trigger(\"checks:complete\");\n\t\t}\n\t});\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbnRlbnRDaGVja3MuanMiXSwibmFtZXMiOlsiXyIsInJlcXVpcmUiLCJCYWNrYm9uZSIsIlByb21pc2UiLCJyYXlndW4iLCJzZXR0aW5ncyIsIlJlc291cmNlTW9kZWwiLCJSZXNvdXJjZUNvbGxlY3Rpb24iLCJDb2xsZWN0aW9uIiwiZXh0ZW5kIiwibW9kZWwiLCJ1cmwiLCJ1cmxSb290IiwibW9kdWxlIiwiZXhwb3J0cyIsImluaXRpYWxpemUiLCJvcHRpb25zIiwiZXZlbnRCdXMiLCJjb2xsZWN0aW9ucyIsImxhenlGZXRjaCIsImFsbCIsInNwcmVhZCIsInJlc291cmNlcyIsInRyaWdnZXIiLCJjYXRjaCIsImVycm9yIiwiZGVidWciLCJyZXBvcnRFcnJvcnMiLCJydW4iXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsV0FBV0QsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUUsVUFBVUYsUUFBUSxVQUFSLENBQWhCO0FBQ0EsSUFBTUcsU0FBU0gsUUFBUSxRQUFSLENBQWY7O0FBRUEsSUFBTUksV0FBV0osUUFBUSxjQUFSLENBQWpCOztBQUVBLElBQU1LLGdCQUFnQkwsUUFBUSwrQ0FBUixDQUF0Qjs7QUFFQSxJQUFNTSxxQkFBcUJMLFNBQVNNLFVBQVQsQ0FBb0JDLE1BQXBCLENBQTJCO0FBQ3JEQyxRQUFPSixhQUQ4Qzs7QUFHckRLLE1BQUssZUFBVztBQUNmLFNBQU9OLFNBQVNPLE9BQVQsR0FBbUIsNkJBQTFCO0FBQ0E7QUFMb0QsQ0FBM0IsQ0FBM0I7O0FBUUFDLE9BQU9DLE9BQVAsR0FBaUIsWUFBVztBQUMzQmQsR0FBRVMsTUFBRixDQUFTLElBQVQsRUFBZTtBQUNkTSxjQUFZLG9CQUFTQyxPQUFULEVBQWtCO0FBQUE7O0FBQzdCLFFBQUtDLFFBQUwsR0FBZ0JELFFBQVFDLFFBQXhCOztBQUVBO0FBQ0EsT0FBTUMsY0FBYyxDQUFDLElBQUlYLGtCQUFKLEdBQXlCWSxTQUF6QixFQUFELENBQXBCOztBQUVBaEIsV0FBUWlCLEdBQVIsQ0FBWUYsV0FBWixFQUF5QkcsTUFBekIsQ0FBZ0MscUJBQWE7QUFDNUMsVUFBS0MsU0FBTCxHQUFpQkEsU0FBakI7O0FBRUEsVUFBS0wsUUFBTCxDQUFjTSxPQUFkLENBQXNCLGNBQXRCO0FBQ0EsSUFKRCxFQUlHQyxLQUpILENBSVMsaUJBQVM7QUFDakIsVUFBS1AsUUFBTCxDQUFjTSxPQUFkLENBQXNCLGNBQXRCLEVBQXNDRSxLQUF0QztBQUNBLFFBQUksQ0FBQ3BCLFNBQVNxQixLQUFWLElBQW1CckIsU0FBU3NCLFlBQWhDLEVBQ0N2QixPQUFPLE1BQVAsRUFBZXFCLEtBQWY7QUFDRCxJQVJEO0FBU0EsR0FoQmE7O0FBa0JkRyxPQUFLLGVBQVc7QUFDZixRQUFLWCxRQUFMLENBQWNNLE9BQWQsQ0FBc0IsaUJBQXRCO0FBQ0E7QUFwQmEsRUFBZjtBQXNCQSxDQXZCRCIsImZpbGUiOiJjb250ZW50Q2hlY2tzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgUHJvbWlzZSA9IHJlcXVpcmUoXCJibHVlYmlyZFwiKTtcbmNvbnN0IHJheWd1biA9IHJlcXVpcmUoXCJyYXlndW5cIik7XG5cbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxuY29uc3QgUmVzb3VyY2VNb2RlbCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9jb250ZW50L21vZGVscy9tYW5hZ2VyL3Jlc291cmNlTW9kZWxcIik7XG5cbmNvbnN0IFJlc291cmNlQ29sbGVjdGlvbiA9IEJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IFJlc291cmNlTW9kZWwsXG5cblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvcmVzb3VyY2VzP293bj10cnVlXCI7XG5cdH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcblx0Xy5leHRlbmQodGhpcywge1xuXHRcdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHRcdHRoaXMuZXZlbnRCdXMgPSBvcHRpb25zLmV2ZW50QnVzO1xuXG5cdFx0XHQvLyBSZXRyaWV2ZSB0aGUgZGF0YSBuZWVkZWQgdG8gcGVyZm9ybSB0aGUgdmFyaW91cyBjaGVja3Ncblx0XHRcdGNvbnN0IGNvbGxlY3Rpb25zID0gW25ldyBSZXNvdXJjZUNvbGxlY3Rpb24oKS5sYXp5RmV0Y2goKV07XG5cblx0XHRcdFByb21pc2UuYWxsKGNvbGxlY3Rpb25zKS5zcHJlYWQocmVzb3VyY2VzID0+IHtcblx0XHRcdFx0dGhpcy5yZXNvdXJjZXMgPSByZXNvdXJjZXM7XG5cblx0XHRcdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwiY2hlY2tzOnJlYWR5XCIpO1xuXHRcdFx0fSkuY2F0Y2goZXJyb3IgPT4ge1xuXHRcdFx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJjaGVja3M6ZXJyb3JcIiwgZXJyb3IpO1xuXHRcdFx0XHRpZiAoIXNldHRpbmdzLmRlYnVnIHx8IHNldHRpbmdzLnJlcG9ydEVycm9ycylcblx0XHRcdFx0XHRyYXlndW4oXCJzZW5kXCIsIGVycm9yKTtcblx0XHRcdH0pO1xuXHRcdH0sXG5cblx0XHRydW46IGZ1bmN0aW9uKCkge1xuXHRcdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwiY2hlY2tzOmNvbXBsZXRlXCIpO1xuXHRcdH0sXG5cdH0pO1xufTtcbiJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nmodule.exports = Backbone.Model.extend({\n\tdefaults: {}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV4Y2VwdGlvbk1vZGVsLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIm1vZHVsZSIsImV4cG9ydHMiLCJNb2RlbCIsImV4dGVuZCIsImRlZmF1bHRzIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7O0FBRUFDLE9BQU9DLE9BQVAsR0FBaUJILFNBQVNJLEtBQVQsQ0FBZUMsTUFBZixDQUFzQjtBQUN0Q0MsV0FBVTtBQUQ0QixDQUF0QixDQUFqQiIsImZpbGUiOiJleGNlcHRpb25Nb2RlbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHt9LFxufSk7XG4iXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar _ = require(\"lodash\");\n\nvar App = require(\"../../../index\");\n\nvar ActionToolbar = require(\"../../../lib/actionToolbar\");\nvar ErrorView = require(\"../../../lib/errorView\");\nvar StatusView = require(\"../../../lib/statusView\");\n\nvar BookChecks = require(\"./bookChecks\");\nvar ContentChecks = require(\"./contentChecks\");\nvar UserChecks = require(\"./userChecks\");\nvar UserModal = require(\"../../../users/views/userModal\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar UserCheckDetails = Backbone.Marionette.View.extend({\n\tclassName: \"exception-list-item-details\",\n\n\ttemplate: require(\"../../templates/exceptionConsole/layout.nunj\").userCheckDetails,\n\n\tui: {\n\t\tuserLink: \".user-link\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.userLink\": \"onUserLinkClick\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.checks = options.checks;\n\t},\n\n\tonUserLinkClick: function onUserLinkClick() {\n\t\tvar _this = this;\n\n\t\tvar groups = this.checks.getGroups();\n\t\tvar users = this.checks.getUsers();\n\t\tvar userModel = _.find(users.models, function (user) {\n\t\t\treturn user.get(\"_id\") === _this.model.get(\"userIdentifier\");\n\t\t});\n\n\t\tvar modal = new UserModal({\n\t\t\tmodel: userModel,\n\t\t\tgroups: groups.toJSON(),\n\t\t\tusers: users\n\t\t});\n\n\t\tmodal.show({\n\t\t\tcreate: _.noop,\n\t\t\tcreateAnother: _.noop,\n\t\t\tupdate: function update(result) {\n\t\t\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\t\t\tcontent: \"User <strong>\" + result.model.get(\"firstname\") + \" \" + result.model.get(\"surname\") + \"</strong> successfully updated\"\n\t\t\t\t});\n\n\t\t\t\t_this.checks.recheck(_this.model);\n\t\t\t}\n\t\t});\n\t}\n});\n\nvar ExceptionListItemDescription = Backbone.Marionette.View.extend({\n\tclassName: \"exception-list-item-description\",\n\n\ttemplate: require(\"../../templates/exceptionConsole/layout.nunj\").exceptionListItemDescription\n});\n\nvar ExceptionListItem = Backbone.Marionette.View.extend({\n\tclassName: \"exception-list-item\",\n\n\ttemplate: require(\"../../templates/exceptionConsole/layout.nunj\").exceptionListItem,\n\n\tregions: {\n\t\tdetails: \".details-region\",\n\t\tdescription: \".description-region\"\n\t},\n\n\tui: {\n\t\tbuttonClose: \".exception-list-item-button-close\",\n\t\tbuttonValidate: \".exception-list-item-button-validate\"\n\t},\n\n\tevents: {\n\t\tclick: \"onClick\",\n\t\t\"click @ui.buttonClose\": \"onButtonCloseClick\",\n\t\t\"click @ui.buttonValidate\": \"onButtonValidateClick\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.checks = options.checks;\n\t\tthis.eventBus = options.eventBus;\n\t\tthis.showDetails = options.showDetails;\n\t},\n\n\tonRender: function onRender() {\n\t\tif (this.showDetails) {\n\t\t\tvar detailView = null;\n\n\t\t\tif (this.model.has(\"user\")) {\n\t\t\t\tdetailView = new UserCheckDetails({\n\t\t\t\t\tchecks: this.checks,\n\t\t\t\t\tmodel: this.model\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (detailView) this.showChildView(\"details\", detailView);\n\n\t\t\tthis.showChildView(\"description\", new ExceptionListItemDescription({ model: this.model }));\n\n\t\t\tthis.ui.buttonClose.removeClass(\"hide\");\n\t\t\tthis.ui.buttonValidate.removeClass(\"hide\");\n\t\t} else {\n\t\t\tthis.$el.addClass(\"clickable\");\n\t\t\tthis.ui.buttonClose.addClass(\"hide\");\n\t\t\tthis.ui.buttonValidate.addClass(\"hide\");\n\t\t}\n\t},\n\n\tonClick: function onClick() {\n\t\tif (!this.showDetails) this.eventBus.trigger(\"exception:show\", this.model);\n\t},\n\n\tonButtonCloseClick: function onButtonCloseClick() {\n\t\tthis.eventBus.trigger(\"exception:show\", this.model);\n\t},\n\n\tonButtonValidateClick: function onButtonValidateClick() {\n\t\tthis.eventBus.trigger(\"exception:validate\", this.model);\n\t}\n});\n\nvar ExceptionList = Backbone.Marionette.CollectionView.extend({\n\tclassName: \"exception-list\",\n\n\tchildView: ExceptionListItem,\n\n\tchildViewOptions: function childViewOptions() {\n\t\treturn {\n\t\t\tchecks: this.checks,\n\t\t\teventBus: this.eventBus\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.checks = options.checks;\n\t\tthis.eventBus = options.eventBus;\n\t}\n});\n\nvar Console = Backbone.Marionette.View.extend({\n\tclassName: \"exception-console-view\",\n\n\ttemplate: require(\"../../templates/exceptionConsole/layout.nunj\").console,\n\n\tregions: {\n\t\tdisplay: \".display-region\",\n\t\tstatus: \".status-region\"\n\t},\n\n\tui: {\n\t\tdisplayRegion: \".display-region\",\n\t\tstatusRegion: \".status-region\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.eventBus = options.eventBus;\n\t\tthis.checks = options.checks;\n\n\t\tthis.exceptionCollection = new Backbone.Collection();\n\n\t\tthis.listenTo(this.eventBus, \"checks:ready\", this.onChecksReady.bind(this));\n\t\tthis.listenTo(this.eventBus, \"checks:error\", this.onChecksError.bind(this));\n\t\tthis.listenTo(this.eventBus, \"checks:exception\", this.onChecksException.bind(this));\n\t\tthis.listenTo(this.eventBus, \"checks:complete\", this.onChecksComplete.bind(this));\n\n\t\tthis.listenTo(this.eventBus, \"exception:show\", this.showException.bind(this));\n\t\tthis.listenTo(this.eventBus, \"exception:fixed\", this.onExceptionFixed.bind(this));\n\t\tthis.listenTo(this.eventBus, \"exception:validate\", this.onExceptionValidated.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.renderLoadingStatus();\n\n\t\tthis.checks.initialize({ eventBus: this.eventBus });\n\t},\n\n\trenderLoadingStatus: function renderLoadingStatus() {\n\t\tthis.showChildView(\"status\", new StatusView({\n\t\t\tmessage: \"Performing checks. This may take a while...\",\n\t\t\ttype: \"loading\"\n\t\t}));\n\t},\n\n\trenderError: function renderError(error) {\n\t\tthis.showChildView(\"status\", new ErrorView({ fetchError: error }));\n\t},\n\n\trenderPage: function renderPage() {\n\t\tthis.ui.statusRegion.addClass(\"hide\");\n\t\tthis.ui.displayRegion.removeClass(\"hide\");\n\n\t\tthis.exceptionList = new ExceptionList({\n\t\t\tchecks: this.checks,\n\t\t\tcollection: this.exceptionCollection,\n\t\t\teventBus: this.eventBus\n\t\t});\n\t\tthis.showChildView(\"display\", this.exceptionList);\n\n\t\tthis.eventBus.trigger(\"console:show\");\n\t},\n\n\tonChecksReady: function onChecksReady() {\n\t\tthis.checks.run();\n\t},\n\n\tonChecksError: function onChecksError(error) {\n\t\tthis.renderError(error);\n\t},\n\n\tonChecksException: function onChecksException(exceptionModel) {\n\t\tthis.exceptionCollection.add(exceptionModel);\n\t},\n\n\tonChecksComplete: function onChecksComplete() {\n\t\tthis.renderPage();\n\t},\n\n\tshowException: function showException(exceptionModel) {\n\t\tif (this.showingException) {\n\t\t\tthis.showChildView(\"display\", this.exceptionList);\n\t\t\tthis.showingException = false;\n\t\t} else {\n\t\t\tthis.showChildView(\"display\", new ExceptionListItem({\n\t\t\t\tchecks: this.checks,\n\t\t\t\teventBus: this.eventBus,\n\t\t\t\tmodel: exceptionModel,\n\t\t\t\tshowDetails: true\n\t\t\t}), { preventDestroy: true });\n\t\t\tthis.showingException = true;\n\t\t}\n\t},\n\n\tonExceptionFixed: function onExceptionFixed(exceptionModel) {\n\t\tthis.exceptionCollection.remove(exceptionModel);\n\t\tthis.eventBus.trigger(\"exception:show\");\n\t},\n\n\tonExceptionValidated: function onExceptionValidated(exceptionModel) {\n\t\tthis.exceptionCollection.remove(exceptionModel);\n\t\tthis.eventBus.trigger(\"exception:show\");\n\t}\n});\n\nvar Header = Backbone.Marionette.View.extend({\n\tclassName: \"exception-console-header\",\n\n\ttemplate: require(\"../../templates/exceptionConsole/layout.nunj\").header,\n\n\tregions: {\n\t\taction: \".action-region\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.eventBus = options.eventBus;\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.listenTo(this.eventBus, \"console:back\", this.onConsoleBack.bind(this));\n\t\tthis.listenTo(this.eventBus, \"console:show\", this.onConsoleShow.bind(this));\n\t},\n\n\tonConsoleBack: function onConsoleBack() {\n\t\tthis.hideToolbar();\n\t},\n\n\tonConsoleShow: function onConsoleShow() {\n\t\tthis.showToolbar();\n\t},\n\n\tshowToolbar: function showToolbar() {\n\t\tvar _this2 = this;\n\n\t\tthis.toolbar = new ActionToolbar({\n\t\t\tactions: [{\n\t\t\t\tglyph: \"fa-reply\",\n\t\t\t\tname: \"back\",\n\t\t\t\ttooltip: \"Back\"\n\t\t\t}]\n\t\t});\n\n\t\tthis.listenTo(this.toolbar, \"back\", function () {\n\t\t\t_this2.eventBus.trigger(\"console:back\");\n\t\t});\n\n\t\tthis.showChildView(\"action\", this.toolbar);\n\t},\n\n\thideToolbar: function hideToolbar() {\n\t\tif (this.getRegion(\"action\") && this.getRegion(\"action\").hasView()) {\n\t\t\tthis.stopListening(this.toolbar);\n\t\t\tthis.getRegion(\"action\").reset();\n\t\t}\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.hideToolbar();\n\n\t\tthis.stopListening(this.eventBus);\n\t}\n});\n\nvar Glyph = Backbone.Marionette.View.extend({\n\tclassName: \"exception-console-glyph\",\n\n\tgetTemplate: function getTemplate() {\n\t\treturn require(\"../../templates/exceptionConsole/layout.nunj\")[\"glyph\" + this.glyph];\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.glyph = options.glyph;\n\t}\n});\n\nvar Menu = Backbone.Marionette.View.extend({\n\tclassName: \"exception-console-menu\",\n\n\ttemplate: require(\"../../templates/exceptionConsole/layout.nunj\").menu,\n\n\tui: {\n\t\titemUsers: \".menu-item-users\",\n\t\titemBooks: \".menu-item-books\",\n\t\titemContent: \".menu-item-content\",\n\t\titemDevices: \".menu-item-devices\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.itemUsers\": \"onItemUsersClick\",\n\t\t\"click @ui.itemBooks\": \"onItemBooksClick\",\n\t\t\"click @ui.itemContent\": \"onItemContentClick\",\n\t\t\"click @ui.itemDevices\": \"onItemDevicesClick\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.eventBus = options.eventBus;\n\t},\n\n\tonItemUsersClick: function onItemUsersClick() {\n\t\tthis.eventBus.trigger(\"console:users:show\");\n\t},\n\n\tonItemBooksClick: function onItemBooksClick() {\n\t\tthis.eventBus.trigger(\"console:books:show\");\n\t},\n\n\tonItemContentClick: function onItemContentClick() {\n\t\tthis.eventBus.trigger(\"console:content:show\");\n\t},\n\n\tonItemDevicesClick: function onItemDevicesClick() {\n\t\tthis.eventBus.trigger(\"console:devices:show\");\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"content exception-console\",\n\n\ttemplate: require(\"../../templates/exceptionConsole/layout.nunj\").layout,\n\n\tregions: {\n\t\tdisplay: \".display-region\",\n\t\tglyph: \".glyph-region\",\n\t\theader: \".header-region\",\n\t\tmenu: \".menu-region\"\n\t},\n\n\tui: {\n\t\tdisplayRegion: \".display-region\",\n\t\tglyphRegion: \".glyph-region\",\n\t\theaderRegion: \".header-region\",\n\t\tmenuRegion: \".menu-region\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.eventBus = new Backbone.Marionette.Application();\n\n\t\tthis.listenTo(this.eventBus, \"console:back\", this.closeConsole.bind(this));\n\n\t\tthis.listenTo(this.eventBus, \"console:users:show\", this.showUsersConsole.bind(this));\n\t\tthis.listenTo(this.eventBus, \"console:books:show\", this.showBooksConsole.bind(this));\n\t\tthis.listenTo(this.eventBus, \"console:content:show\", this.showContentConsole.bind(this));\n\t\tthis.listenTo(this.eventBus, \"console:devices:show\", this.showDevicesConsole.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.header = new Header({ eventBus: this.eventBus });\n\t\tthis.showChildView(\"header\", this.header);\n\n\t\tthis.menu = new Menu({ eventBus: this.eventBus });\n\t\tthis.showChildView(\"menu\", this.menu);\n\t},\n\n\tshowUsersConsole: function showUsersConsole() {\n\t\tthis.ui.menuRegion.addClass(\"hide\");\n\n\t\tthis.showChildView(\"glyph\", new Glyph({ glyph: \"Users\" }));\n\n\t\tthis.showConsole(new Console({\n\t\t\tchecks: new UserChecks(),\n\t\t\teventBus: this.eventBus\n\t\t}));\n\t},\n\n\tshowBooksConsole: function showBooksConsole() {\n\t\tthis.ui.menuRegion.addClass(\"hide\");\n\n\t\tthis.showChildView(\"glyph\", new Glyph({ glyph: \"Books\" }));\n\n\t\tthis.showConsole(new Console({\n\t\t\tchecks: new BookChecks(),\n\t\t\teventBus: this.eventBus\n\t\t}));\n\t},\n\n\tshowContentConsole: function showContentConsole() {\n\t\tthis.ui.menuRegion.addClass(\"hide\");\n\n\t\tthis.showChildView(\"glyph\", new Glyph({ glyph: \"Content\" }));\n\n\t\tthis.showConsole(new Console({\n\t\t\tchecks: new ContentChecks(),\n\t\t\teventBus: this.eventBus\n\t\t}));\n\t},\n\n\tshowDevicesConsole: function showDevicesConsole() {\n\t\tthis.ui.menuRegion.addClass(\"hide\");\n\n\t\tthis.showChildView(\"glyph\", new Glyph({ glyph: \"Devices\" }));\n\n\t\tthis.showConsole(new Console({ eventBus: this.eventBus }));\n\t},\n\n\tshowConsole: function showConsole(console) {\n\t\tthis.console = console;\n\t\tthis.showChildView(\"display\", this.console);\n\t\tthis.ui.displayRegion.removeClass(\"hide\");\n\t},\n\n\tcloseConsole: function closeConsole() {\n\t\tthis.getRegion(\"display\").reset();\n\t\tthis.getRegion(\"glyph\").reset();\n\n\t\tthis.ui.displayRegion.addClass(\"hide\");\n\t\tthis.ui.menuRegion.removeClass(\"hide\");\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(this.eventBus);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxheW91dC5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCJfIiwiQXBwIiwiQWN0aW9uVG9vbGJhciIsIkVycm9yVmlldyIsIlN0YXR1c1ZpZXciLCJCb29rQ2hlY2tzIiwiQ29udGVudENoZWNrcyIsIlVzZXJDaGVja3MiLCJVc2VyTW9kYWwiLCJyYWRpbyIsIlJhZGlvIiwiY2hhbm5lbCIsIlVzZXJDaGVja0RldGFpbHMiLCJNYXJpb25ldHRlIiwiVmlldyIsImV4dGVuZCIsImNsYXNzTmFtZSIsInRlbXBsYXRlIiwidXNlckNoZWNrRGV0YWlscyIsInVpIiwidXNlckxpbmsiLCJldmVudHMiLCJpbml0aWFsaXplIiwib3B0aW9ucyIsImNoZWNrcyIsIm9uVXNlckxpbmtDbGljayIsImdyb3VwcyIsImdldEdyb3VwcyIsInVzZXJzIiwiZ2V0VXNlcnMiLCJ1c2VyTW9kZWwiLCJmaW5kIiwibW9kZWxzIiwidXNlciIsImdldCIsIm1vZGVsIiwibW9kYWwiLCJ0b0pTT04iLCJzaG93IiwiY3JlYXRlIiwibm9vcCIsImNyZWF0ZUFub3RoZXIiLCJ1cGRhdGUiLCJ0cmlnZ2VyIiwiRXZlbnRzIiwiQ29tbWFuZHMiLCJUb2FzdCIsImNvbnRlbnQiLCJyZXN1bHQiLCJyZWNoZWNrIiwiRXhjZXB0aW9uTGlzdEl0ZW1EZXNjcmlwdGlvbiIsImV4Y2VwdGlvbkxpc3RJdGVtRGVzY3JpcHRpb24iLCJFeGNlcHRpb25MaXN0SXRlbSIsImV4Y2VwdGlvbkxpc3RJdGVtIiwicmVnaW9ucyIsImRldGFpbHMiLCJkZXNjcmlwdGlvbiIsImJ1dHRvbkNsb3NlIiwiYnV0dG9uVmFsaWRhdGUiLCJjbGljayIsImV2ZW50QnVzIiwic2hvd0RldGFpbHMiLCJvblJlbmRlciIsImRldGFpbFZpZXciLCJoYXMiLCJzaG93Q2hpbGRWaWV3IiwicmVtb3ZlQ2xhc3MiLCIkZWwiLCJhZGRDbGFzcyIsIm9uQ2xpY2siLCJvbkJ1dHRvbkNsb3NlQ2xpY2siLCJvbkJ1dHRvblZhbGlkYXRlQ2xpY2siLCJFeGNlcHRpb25MaXN0IiwiQ29sbGVjdGlvblZpZXciLCJjaGlsZFZpZXciLCJjaGlsZFZpZXdPcHRpb25zIiwiQ29uc29sZSIsImNvbnNvbGUiLCJkaXNwbGF5Iiwic3RhdHVzIiwiZGlzcGxheVJlZ2lvbiIsInN0YXR1c1JlZ2lvbiIsImV4Y2VwdGlvbkNvbGxlY3Rpb24iLCJDb2xsZWN0aW9uIiwibGlzdGVuVG8iLCJvbkNoZWNrc1JlYWR5IiwiYmluZCIsIm9uQ2hlY2tzRXJyb3IiLCJvbkNoZWNrc0V4Y2VwdGlvbiIsIm9uQ2hlY2tzQ29tcGxldGUiLCJzaG93RXhjZXB0aW9uIiwib25FeGNlcHRpb25GaXhlZCIsIm9uRXhjZXB0aW9uVmFsaWRhdGVkIiwicmVuZGVyTG9hZGluZ1N0YXR1cyIsIm1lc3NhZ2UiLCJ0eXBlIiwicmVuZGVyRXJyb3IiLCJlcnJvciIsImZldGNoRXJyb3IiLCJyZW5kZXJQYWdlIiwiZXhjZXB0aW9uTGlzdCIsImNvbGxlY3Rpb24iLCJydW4iLCJleGNlcHRpb25Nb2RlbCIsImFkZCIsInNob3dpbmdFeGNlcHRpb24iLCJwcmV2ZW50RGVzdHJveSIsInJlbW92ZSIsIkhlYWRlciIsImhlYWRlciIsImFjdGlvbiIsIm9uQ29uc29sZUJhY2siLCJvbkNvbnNvbGVTaG93IiwiaGlkZVRvb2xiYXIiLCJzaG93VG9vbGJhciIsInRvb2xiYXIiLCJhY3Rpb25zIiwiZ2x5cGgiLCJuYW1lIiwidG9vbHRpcCIsImdldFJlZ2lvbiIsImhhc1ZpZXciLCJzdG9wTGlzdGVuaW5nIiwicmVzZXQiLCJvbkJlZm9yZURlc3Ryb3kiLCJHbHlwaCIsImdldFRlbXBsYXRlIiwiTWVudSIsIm1lbnUiLCJpdGVtVXNlcnMiLCJpdGVtQm9va3MiLCJpdGVtQ29udGVudCIsIml0ZW1EZXZpY2VzIiwib25JdGVtVXNlcnNDbGljayIsIm9uSXRlbUJvb2tzQ2xpY2siLCJvbkl0ZW1Db250ZW50Q2xpY2siLCJvbkl0ZW1EZXZpY2VzQ2xpY2siLCJtb2R1bGUiLCJleHBvcnRzIiwibGF5b3V0IiwiZ2x5cGhSZWdpb24iLCJoZWFkZXJSZWdpb24iLCJtZW51UmVnaW9uIiwiQXBwbGljYXRpb24iLCJjbG9zZUNvbnNvbGUiLCJzaG93VXNlcnNDb25zb2xlIiwic2hvd0Jvb2tzQ29uc29sZSIsInNob3dDb250ZW50Q29uc29sZSIsInNob3dEZXZpY2VzQ29uc29sZSIsInNob3dDb25zb2xlIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjs7QUFFQSxJQUFNRSxNQUFNRixRQUFRLGdCQUFSLENBQVo7O0FBRUEsSUFBTUcsZ0JBQWdCSCxRQUFRLDRCQUFSLENBQXRCO0FBQ0EsSUFBTUksWUFBWUosUUFBUSx3QkFBUixDQUFsQjtBQUNBLElBQU1LLGFBQWFMLFFBQVEseUJBQVIsQ0FBbkI7O0FBRUEsSUFBTU0sYUFBYU4sUUFBUSxjQUFSLENBQW5CO0FBQ0EsSUFBTU8sZ0JBQWdCUCxRQUFRLGlCQUFSLENBQXRCO0FBQ0EsSUFBTVEsYUFBYVIsUUFBUSxjQUFSLENBQW5CO0FBQ0EsSUFBTVMsWUFBWVQsUUFBUSxnQ0FBUixDQUFsQjs7QUFFQSxJQUFNVSxRQUFRWCxTQUFTWSxLQUFULENBQWVDLE9BQWYsQ0FBdUIsUUFBdkIsQ0FBZDs7QUFFQSxJQUFNQyxtQkFBbUJkLFNBQVNlLFVBQVQsQ0FBb0JDLElBQXBCLENBQXlCQyxNQUF6QixDQUFnQztBQUN4REMsWUFBVyw2QkFENkM7O0FBR3hEQyxXQUFVbEIsUUFBUSw4Q0FBUixFQUF3RG1CLGdCQUhWOztBQUt4REMsS0FBSTtBQUNIQyxZQUFVO0FBRFAsRUFMb0Q7O0FBU3hEQyxTQUFRO0FBQ1Asd0JBQXNCO0FBRGYsRUFUZ0Q7O0FBYXhEQyxhQUFZLG9CQUFTQyxPQUFULEVBQWtCO0FBQzdCLE9BQUtDLE1BQUwsR0FBY0QsUUFBUUMsTUFBdEI7QUFDQSxFQWZ1RDs7QUFpQnhEQyxrQkFBaUIsMkJBQVc7QUFBQTs7QUFDM0Is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WSxPQUFuQztBQUNBLE9BQUsxRCxFQUFMLENBQVE2RCxhQUFSLENBQXNCZCxXQUF0QixDQUFrQyxNQUFsQztBQUNBLEVBbkYrQzs7QUFxRmhEOEUsZUFBYyx3QkFBVztBQUN4QixPQUFLeEIsU0FBTCxDQUFlLFNBQWYsRUFBMEJHLEtBQTFCO0FBQ0EsT0FBS0gsU0FBTCxDQUFlLE9BQWYsRUFBd0JHLEtBQXhCOztBQUVBLE9BQUt4RyxFQUFMLENBQVE2RCxhQUFSLENBQXNCWixRQUF0QixDQUErQixNQUEvQjtBQUNBLE9BQUtqRCxFQUFMLENBQVEySCxVQUFSLENBQW1CNUUsV0FBbkIsQ0FBK0IsTUFBL0I7QUFDQSxFQTNGK0M7O0FBNkZoRDBELGtCQUFpQiwyQkFBVztBQUMzQixPQUFLRixhQUFMLENBQW1CLEtBQUs5RCxRQUF4QjtBQUNBO0FBL0YrQyxDQUFoQyxDQUFqQiIsImZpbGUiOiJsYXlvdXQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5cbmNvbnN0IEFwcCA9IHJlcXVpcmUoXCIuLi8uLi8uLi9pbmRleFwiKTtcblxuY29uc3QgQWN0aW9uVG9vbGJhciA9IHJlcXVpcmUoXCIuLi8uLi8uLi9saWIvYWN0aW9uVG9vbGJhclwiKTtcbmNvbnN0IEVycm9yVmlldyA9IHJlcXVpcmUoXCIuLi8uLi8uLi9saWIvZXJyb3JWaWV3XCIpO1xuY29uc3QgU3RhdHVzVmlldyA9IHJlcXVpcmUoXCIuLi8uLi8uLi9saWIvc3RhdHVzVmlld1wiKTtcblxuY29uc3QgQm9va0NoZWNrcyA9IHJlcXVpcmUoXCIuL2Jvb2tDaGVja3NcIik7XG5jb25zdCBDb250ZW50Q2hlY2tzID0gcmVxdWlyZShcIi4vY29udGVudENoZWNrc1wiKTtcbmNvbnN0IFVzZXJDaGVja3MgPSByZXF1aXJlKFwiLi91c2VyQ2hlY2tzXCIpO1xuY29uc3QgVXNlck1vZGFsID0gcmVxdWlyZShcIi4uLy4uLy4uL3VzZXJzL3ZpZXdzL3VzZXJNb2RhbFwiKTtcblxuY29uc3QgcmFkaW8gPSBCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZ2xvYmFsXCIpO1xuXG5jb25zdCBVc2VyQ2hlY2tEZXRhaWxzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJleGNlcHRpb24tbGlzdC1pdGVtLWRldGFpbHNcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9leGNlcHRpb25Db25zb2xlL2xheW91dC5udW5qXCIpLnVzZXJDaGVja0RldGFpbHMsXG5cblx0dWk6IHtcblx0XHR1c2VyTGluazogXCIudXNlci1saW5rXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkudXNlckxpbmtcIjogXCJvblVzZXJMaW5rQ2xpY2tcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5jaGVja3MgPSBvcHRpb25zLmNoZWNrcztcblx0fSxcblxuXHRvblVzZXJMaW5rQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGdyb3VwcyA9IHRoaXMuY2hlY2tzLmdldEdyb3VwcygpO1xuXHRcdGNvbnN0IHVzZXJzID0gdGhpcy5jaGVja3MuZ2V0VXNlcnMoKTtcblx0XHRjb25zdCB1c2VyTW9kZWwgPSBfLmZpbmQodXNlcnMubW9kZWxzLCB1c2VyID0+IHVzZXIuZ2V0KFwiX2lkXCIpID09PSB0aGlzLm1vZGVsLmdldChcInVzZXJJZGVudGlmaWVyXCIpKTtcblxuXHRcdGNvbnN0IG1vZGFsID0gbmV3IFVzZXJNb2RhbCh7XG5cdFx0XHRtb2RlbDogdXNlck1vZGVsLFxuXHRcdFx0Z3JvdXBzOiBncm91cHMudG9KU09OKCksXG5cdFx0XHR1c2VyczogdXNlcnMsXG5cdFx0fSk7XG5cblx0XHRtb2RhbC5zaG93KHtcblx0XHRcdGNyZWF0ZTogXy5ub29wLFxuXHRcdFx0Y3JlYXRlQW5vdGhlcjogXy5ub29wLFxuXHRcdFx0dXBkYXRlOiByZXN1bHQgPT4ge1xuXHRcdFx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuVG9hc3QsIHtcblx0XHRcdFx0XHRjb250ZW50OiBcIlVzZXIgPHN0cm9uZz5cIiArIHJlc3VsdC5tb2RlbC5nZXQoXCJmaXJzdG5hbWVcIikgKyBcIiBcIiArIHJlc3VsdC5tb2RlbC5nZXQoXCJzdXJuYW1lXCIpICsgXCI8L3N0cm9uZz4gc3VjY2Vzc2Z1bGx5IHVwZGF0ZWRcIixcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0dGhpcy5jaGVja3MucmVjaGVjayh0aGlzLm1vZGVsKTtcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH0sXG59KTtcblxuY29uc3QgRXhjZXB0aW9uTGlzdEl0ZW1EZXNjcmlwdGlvbiA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZXhjZXB0aW9uLWxpc3QtaXRlbS1kZXNjcmlwdGlvblwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2V4Y2VwdGlvbkNvbnNvbGUvbGF5b3V0Lm51bmpcIikuZXhjZXB0aW9uTGlzdEl0ZW1EZXNjcmlwdGlvbixcbn0pO1xuXG5jb25zdCBFeGNlcHRpb25MaXN0SXRlbSA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZXhjZXB0aW9uLWxpc3QtaXRlbVwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2V4Y2VwdGlvbkNvbnNvbGUvbGF5b3V0Lm51bmpcIikuZXhjZXB0aW9uTGlzdEl0ZW0sXG5cblx0cmVnaW9uczoge1xuXHRcdGRldGFpbHM6IFwiLmRldGFpbHMtcmVnaW9uXCIsXG5cdFx0ZGVzY3JpcHRpb246IFwiLmRlc2NyaXB0aW9uLXJlZ2lvblwiLFxuXHR9LFxuXG5cdHVpOiB7XG5cdFx0YnV0dG9uQ2xvc2U6IFwiLmV4Y2VwdGlvbi1saXN0LWl0ZW0tYnV0dG9uLWNsb3NlXCIsXG5cdFx0YnV0dG9uVmFsaWRhdGU6IFwiLmV4Y2VwdGlvbi1saXN0LWl0ZW0tYnV0dG9uLXZhbGlkYXRlXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0Y2xpY2s6IFwib25DbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmJ1dHRvbkNsb3NlXCI6IFwib25CdXR0b25DbG9zZUNsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkuYnV0dG9uVmFsaWRhdGVcIjogXCJvbkJ1dHRvblZhbGlkYXRlQ2xpY2tcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5jaGVja3MgPSBvcHRpb25zLmNoZWNrcztcblx0XHR0aGlzLmV2ZW50QnVzID0gb3B0aW9ucy5ldmVudEJ1cztcblx0XHR0aGlzLnNob3dEZXRhaWxzID0gb3B0aW9ucy5zaG93RGV0YWlscztcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuc2hvd0RldGFpbHMpIHtcblx0XHRcdGxldCBkZXRhaWxWaWV3ID0gbnVsbDtcblxuXHRcdFx0aWYgKHRoaXMubW9kZWwuaGFzKFwidXNlclwiKSkge1xuXHRcdFx0XHRkZXRhaWxWaWV3ID0gbmV3IFVzZXJDaGVja0RldGFpbHMoe1xuXHRcdFx0XHRcdGNoZWNrczogdGhpcy5jaGVja3MsXG5cdFx0XHRcdFx0bW9kZWw6IHRoaXMubW9kZWwsXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZGV0YWlsVmlldylcblx0XHRcdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiZGV0YWlsc1wiLCBkZXRhaWxWaWV3KTtcblxuXHRcdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiZGVzY3JpcHRpb25cIiwgbmV3IEV4Y2VwdGlvbkxpc3RJdGVtRGVzY3JpcHRpb24oeyBtb2RlbDogdGhpcy5tb2RlbCB9KSk7XG5cblx0XHRcdHRoaXMudWkuYnV0dG9uQ2xvc2UucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0dGhpcy51aS5idXR0b25WYWxpZGF0ZS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy4kZWwuYWRkQ2xhc3MoXCJjbGlja2FibGVcIik7XG5cdFx0XHR0aGlzLnVpLmJ1dHRvbkNsb3NlLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdHRoaXMudWkuYnV0dG9uVmFsaWRhdGUuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdH1cblx0fSxcblxuXHRvbkNsaWNrOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIXRoaXMuc2hvd0RldGFpbHMpXG5cdFx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJleGNlcHRpb246c2hvd1wiLCB0aGlzLm1vZGVsKTtcblx0fSxcblxuXHRvbkJ1dHRvbkNsb3NlQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImV4Y2VwdGlvbjpzaG93XCIsIHRoaXMubW9kZWwpO1xuXHR9LFxuXG5cdG9uQnV0dG9uVmFsaWRhdGVDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwiZXhjZXB0aW9uOnZhbGlkYXRlXCIsIHRoaXMubW9kZWwpO1xuXHR9LFxufSk7XG5cbmNvbnN0IEV4Y2VwdGlvbkxpc3QgPSBCYWNrYm9uZS5NYXJpb25ldHRlLkNvbGxlY3Rpb25WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJleGNlcHRpb24tbGlzdFwiLFxuXG5cdGNoaWxkVmlldzogRXhjZXB0aW9uTGlzdEl0ZW0sXG5cblx0Y2hpbGRWaWV3T3B0aW9uczogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGNoZWNrczogdGhpcy5jaGVja3MsXG5cdFx0XHRldmVudEJ1czogdGhpcy5ldmVudEJ1cyxcblx0XHR9O1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLmNoZWNrcyA9IG9wdGlvbnMuY2hlY2tzO1xuXHRcdHRoaXMuZXZlbnRCdXMgPSBvcHRpb25zLmV2ZW50QnVzO1xuXHR9LFxufSk7XG5cbmNvbnN0IENvbnNvbGUgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImV4Y2VwdGlvbi1jb25zb2xlLXZpZXdcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9leGNlcHRpb25Db25zb2xlL2xheW91dC5udW5qXCIpLmNvbnNvbGUsXG5cblx0cmVnaW9uczoge1xuXHRcdGRpc3BsYXk6IFwiLmRpc3BsYXktcmVnaW9uXCIsXG5cdFx0c3RhdHVzOiBcIi5zdGF0dXMtcmVnaW9uXCIsXG5cdH0sXG5cblx0dWk6IHtcblx0XHRkaXNwbGF5UmVnaW9uOiBcIi5kaXNwbGF5LXJlZ2lvblwiLFxuXHRcdHN0YXR1c1JlZ2lvbjogXCIuc3RhdHVzLXJlZ2lvblwiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLmV2ZW50QnVzID0gb3B0aW9ucy5ldmVudEJ1cztcblx0XHR0aGlzLmNoZWNrcyA9IG9wdGlvbnMuY2hlY2tzO1xuXG5cdFx0dGhpcy5leGNlcHRpb25Db2xsZWN0aW9uID0gbmV3IEJhY2tib25lLkNvbGxlY3Rpb24oKTtcblxuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJjaGVja3M6cmVhZHlcIiwgdGhpcy5vbkNoZWNrc1JlYWR5LmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJjaGVja3M6ZXJyb3JcIiwgdGhpcy5vbkNoZWNrc0Vycm9yLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJjaGVja3M6ZXhjZXB0aW9uXCIsIHRoaXMub25DaGVja3NFeGNlcHRpb24uYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmV2ZW50QnVzLCBcImNoZWNrczpjb21wbGV0ZVwiLCB0aGlzLm9uQ2hlY2tzQ29tcGxldGUuYmluZCh0aGlzKSk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwiZXhjZXB0aW9uOnNob3dcIiwgdGhpcy5zaG93RXhjZXB0aW9uLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJleGNlcHRpb246Zml4ZWRcIiwgdGhpcy5vbkV4Y2VwdGlvbkZpeGVkLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJleGNlcHRpb246dmFsaWRhdGVcIiwgdGhpcy5vbkV4Y2VwdGlvblZhbGlkYXRlZC5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5yZW5kZXJMb2FkaW5nU3RhdHVzKCk7XG5cblx0XHR0aGlzLmNoZWNrcy5pbml0aWFsaXplKHsgZXZlbnRCdXM6IHRoaXMuZXZlbnRCdXMgfSk7XG5cdH0sXG5cblx0cmVuZGVyTG9hZGluZ1N0YXR1czogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwic3RhdHVzXCIsIG5ldyBTdGF0dXNWaWV3KHtcblx0XHRcdG1lc3NhZ2U6IFwiUGVyZm9ybWluZyBjaGVja3MuIFRoaXMgbWF5IHRha2UgYSB3aGlsZS4uLlwiLFxuXHRcdFx0dHlwZTogXCJsb2FkaW5nXCIsXG5cdFx0fSkpO1xuXHR9LFxuXG5cdHJlbmRlckVycm9yOiBmdW5jdGlvbihlcnJvcikge1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcInN0YXR1c1wiLCBuZXcgRXJyb3JWaWV3KHsgZmV0Y2hFcnJvcjogZXJyb3IgfSkpO1xuXHR9LFxuXG5cdHJlbmRlclBhZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkuc3RhdHVzUmVnaW9uLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLmRpc3BsYXlSZWdpb24ucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0dGhpcy5leGNlcHRpb25MaXN0ID0gbmV3IEV4Y2VwdGlvbkxpc3Qoe1xuXHRcdFx0Y2hlY2tzOiB0aGlzLmNoZWNrcyxcblx0XHRcdGNvbGxlY3Rpb246IHRoaXMuZXhjZXB0aW9uQ29sbGVjdGlvbixcblx0XHRcdGV2ZW50QnVzOiB0aGlzLmV2ZW50QnVzLFxuXHRcdH0pO1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImRpc3BsYXlcIiwgdGhpcy5leGNlcHRpb25MaXN0KTtcblxuXHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImNvbnNvbGU6c2hvd1wiKTtcblx0fSxcblxuXHRvbkNoZWNrc1JlYWR5OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmNoZWNrcy5ydW4oKTtcblx0fSxcblxuXHRvbkNoZWNrc0Vycm9yOiBmdW5jdGlvbihlcnJvcikge1xuXHRcdHRoaXMucmVuZGVyRXJyb3IoZXJyb3IpO1xuXHR9LFxuXG5cdG9uQ2hlY2tzRXhjZXB0aW9uOiBmdW5jdGlvbihleGNlcHRpb25Nb2RlbCkge1xuXHRcdHRoaXMuZXhjZXB0aW9uQ29sbGVjdGlvbi5hZGQoZXhjZXB0aW9uTW9kZWwpO1xuXHR9LFxuXG5cdG9uQ2hlY2tzQ29tcGxldGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMucmVuZGVyUGFnZSgpO1xuXHR9LFxuXG5cdHNob3dFeGNlcHRpb246IGZ1bmN0aW9uKGV4Y2VwdGlvbk1vZGVsKSB7XG5cdFx0aWYgKHRoaXMuc2hvd2luZ0V4Y2VwdGlvbikge1xuXHRcdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiZGlzcGxheVwiLCB0aGlzLmV4Y2VwdGlvbkxpc3QpO1xuXHRcdFx0dGhpcy5zaG93aW5nRXhjZXB0aW9uID0gZmFsc2U7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiZGlzcGxheVwiLCBuZXcgRXhjZXB0aW9uTGlzdEl0ZW0oe1xuXHRcdFx0XHRjaGVja3M6IHRoaXMuY2hlY2tzLFxuXHRcdFx0XHRldmVudEJ1czogdGhpcy5ldmVudEJ1cyxcblx0XHRcdFx0bW9kZWw6IGV4Y2VwdGlvbk1vZGVsLFxuXHRcdFx0XHRzaG93RGV0YWlsczogdHJ1ZSxcblx0XHRcdH0pLCB7IHByZXZlbnREZXN0cm95OiB0cnVlIH0pO1xuXHRcdFx0dGhpcy5zaG93aW5nRXhjZXB0aW9uID0gdHJ1ZTtcblx0XHR9XG5cdH0sXG5cblx0b25FeGNlcHRpb25GaXhlZDogZnVuY3Rpb24oZXhjZXB0aW9uTW9kZWwpIHtcblx0XHR0aGlzLmV4Y2VwdGlvbkNvbGxlY3Rpb24ucmVtb3ZlKGV4Y2VwdGlvbk1vZGVsKTtcblx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJleGNlcHRpb246c2hvd1wiKTtcblx0fSxcblxuXHRvbkV4Y2VwdGlvblZhbGlkYXRlZDogZnVuY3Rpb24oZXhjZXB0aW9uTW9kZWwpIHtcblx0XHR0aGlzLmV4Y2VwdGlvbkNvbGxlY3Rpb24ucmVtb3ZlKGV4Y2VwdGlvbk1vZGVsKTtcblx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJleGNlcHRpb246c2hvd1wiKTtcblx0fSxcbn0pO1xuXG5jb25zdCBIZWFkZXIgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImV4Y2VwdGlvbi1jb25zb2xlLWhlYWRlclwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2V4Y2VwdGlvbkNvbnNvbGUvbGF5b3V0Lm51bmpcIikuaGVhZGVyLFxuXG5cdHJlZ2lvbnM6IHtcblx0XHRhY3Rpb246IFwiLmFjdGlvbi1yZWdpb25cIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5ldmVudEJ1cyA9IG9wdGlvbnMuZXZlbnRCdXM7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJjb25zb2xlOmJhY2tcIiwgdGhpcy5vbkNvbnNvbGVCYWNrLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJjb25zb2xlOnNob3dcIiwgdGhpcy5vbkNvbnNvbGVTaG93LmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdG9uQ29uc29sZUJhY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuaGlkZVRvb2xiYXIoKTtcblx0fSxcblxuXHRvbkNvbnNvbGVTaG93OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnNob3dUb29sYmFyKCk7XG5cdH0sXG5cblx0c2hvd1Rvb2xiYXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudG9vbGJhciA9IG5ldyBBY3Rpb25Ub29sYmFyKHtcblx0XHRcdGFjdGlvbnM6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGdseXBoOiBcImZhLXJlcGx5XCIsXG5cdFx0XHRcdFx0bmFtZTogXCJiYWNrXCIsXG5cdFx0XHRcdFx0dG9vbHRpcDogXCJCYWNrXCIsXG5cdFx0XHRcdH0sXG5cdFx0XHRdLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLnRvb2xiYXIsIFwiYmFja1wiLCAoKSA9PiB7XG5cdFx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJjb25zb2xlOmJhY2tcIik7XG5cdFx0fSk7XG5cblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJhY3Rpb25cIiwgdGhpcy50b29sYmFyKTtcblx0fSxcblxuXHRoaWRlVG9vbGJhcjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuZ2V0UmVnaW9uKFwiYWN0aW9uXCIpICYmIHRoaXMuZ2V0UmVnaW9uKFwiYWN0aW9uXCIpLmhhc1ZpZXcoKSkge1xuXHRcdFx0dGhpcy5zdG9wTGlzdGVuaW5nKHRoaXMudG9vbGJhcik7XG5cdFx0XHR0aGlzLmdldFJlZ2lvbihcImFjdGlvblwiKS5yZXNldCgpO1xuXHRcdH1cblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuaGlkZVRvb2xiYXIoKTtcblxuXHRcdHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLmV2ZW50QnVzKTtcblx0fSxcbn0pO1xuXG5jb25zdCBHbHlwaCA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZXhjZXB0aW9uLWNvbnNvbGUtZ2x5cGhcIixcblxuXHRnZXRUZW1wbGF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHJlcXVpcmUoXCIuLi8uLi90ZW1wbGF0ZXMvZXhjZXB0aW9uQ29uc29sZS9sYXlvdXQubnVualwiKVtcImdseXBoXCIgKyB0aGlzLmdseXBoXTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5nbHlwaCA9IG9wdGlvbnMuZ2x5cGg7XG5cdH0sXG59KTtcblxuY29uc3QgTWVudSA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZXhjZXB0aW9uLWNvbnNvbGUtbWVudVwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vLi4vdGVtcGxhdGVzL2V4Y2VwdGlvbkNvbnNvbGUvbGF5b3V0Lm51bmpcIikubWVudSxcblxuXHR1aToge1xuXHRcdGl0ZW1Vc2VyczogXCIubWVudS1pdGVtLXVzZXJzXCIsXG5cdFx0aXRlbUJvb2tzOiBcIi5tZW51LWl0ZW0tYm9va3NcIixcblx0XHRpdGVtQ29udGVudDogXCIubWVudS1pdGVtLWNvbnRlbnRcIixcblx0XHRpdGVtRGV2aWNlczogXCIubWVudS1pdGVtLWRldmljZXNcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5pdGVtVXNlcnNcIjogXCJvbkl0ZW1Vc2Vyc0NsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkuaXRlbUJvb2tzXCI6IFwib25JdGVtQm9va3NDbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLml0ZW1Db250ZW50XCI6IFwib25JdGVtQ29udGVudENsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkuaXRlbURldmljZXNcIjogXCJvbkl0ZW1EZXZpY2VzQ2xpY2tcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5ldmVudEJ1cyA9IG9wdGlvbnMuZXZlbnRCdXM7XG5cdH0sXG5cblx0b25JdGVtVXNlcnNDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwiY29uc29sZTp1c2VyczpzaG93XCIpO1xuXHR9LFxuXG5cdG9uSXRlbUJvb2tzQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImNvbnNvbGU6Ym9va3M6c2hvd1wiKTtcblx0fSxcblxuXHRvbkl0ZW1Db250ZW50Q2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImNvbnNvbGU6Y29udGVudDpzaG93XCIpO1xuXHR9LFxuXG5cdG9uSXRlbURldmljZXNDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwiY29uc29sZTpkZXZpY2VzOnNob3dcIik7XG5cdH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImNvbnRlbnQgZXhjZXB0aW9uLWNvbnNvbGVcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uLy4uL3RlbXBsYXRlcy9leGNlcHRpb25Db25zb2xlL2xheW91dC5udW5qXCIpLmxheW91dCxcblxuXHRyZWdpb25zOiB7XG5cdFx0ZGlzcGxheTogXCIuZGlzcGxheS1yZWdpb25cIixcblx0XHRnbHlwaDogXCIuZ2x5cGgtcmVnaW9uXCIsXG5cdFx0aGVhZGVyOiBcIi5oZWFkZXItcmVnaW9uXCIsXG5cdFx0bWVudTogXCIubWVudS1yZWdpb25cIixcblx0fSxcblxuXHR1aToge1xuXHRcdGRpc3BsYXlSZWdpb246IFwiLmRpc3BsYXktcmVnaW9uXCIsXG5cdFx0Z2x5cGhSZWdpb246IFwiLmdseXBoLXJlZ2lvblwiLFxuXHRcdGhlYWRlclJlZ2lvbjogXCIuaGVhZGVyLXJlZ2lvblwiLFxuXHRcdG1lbnVSZWdpb246IFwiLm1lbnUtcmVnaW9uXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5ldmVudEJ1cyA9IG5ldyBCYWNrYm9uZS5NYXJpb25ldHRlLkFwcGxpY2F0aW9uKCk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwiY29uc29sZTpiYWNrXCIsIHRoaXMuY2xvc2VDb25zb2xlLmJpbmQodGhpcykpO1xuXG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmV2ZW50QnVzLCBcImNvbnNvbGU6dXNlcnM6c2hvd1wiLCB0aGlzLnNob3dVc2Vyc0NvbnNvbGUuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmV2ZW50QnVzLCBcImNvbnNvbGU6Ym9va3M6c2hvd1wiLCB0aGlzLnNob3dCb29rc0NvbnNvbGUuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmV2ZW50QnVzLCBcImNvbnNvbGU6Y29udGVudDpzaG93XCIsIHRoaXMuc2hvd0NvbnRlbnRDb25zb2xlLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJjb25zb2xlOmRldmljZXM6c2hvd1wiLCB0aGlzLnNob3dEZXZpY2VzQ29uc29sZS5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5oZWFkZXIgPSBuZXcgSGVhZGVyKHsgZXZlbnRCdXM6IHRoaXMuZXZlbnRCdXMgfSk7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiaGVhZGVyXCIsIHRoaXMuaGVhZGVyKTtcblxuXHRcdHRoaXMubWVudSA9IG5ldyBNZW51KHsgZXZlbnRCdXM6IHRoaXMuZXZlbnRCdXMgfSk7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwibWVudVwiLCB0aGlzLm1lbnUpO1xuXHR9LFxuXG5cdHNob3dVc2Vyc0NvbnNvbGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkubWVudVJlZ2lvbi5hZGRDbGFzcyhcImhpZGVcIik7XG5cblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJnbHlwaFwiLCBuZXcgR2x5cGgoeyBnbHlwaDogXCJVc2Vyc1wiIH0pKTtcblxuXHRcdHRoaXMuc2hvd0NvbnNvbGUobmV3IENvbnNvbGUoe1xuXHRcdFx0Y2hlY2tzOiBuZXcgVXNlckNoZWNrcygpLFxuXHRcdFx0ZXZlbnRCdXM6IHRoaXMuZXZlbnRCdXMsXG5cdFx0fSkpO1xuXHR9LFxuXG5cdHNob3dCb29rc0NvbnNvbGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkubWVudVJlZ2lvbi5hZGRDbGFzcyhcImhpZGVcIik7XG5cblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJnbHlwaFwiLCBuZXcgR2x5cGgoeyBnbHlwaDogXCJCb29rc1wiIH0pKTtcblxuXHRcdHRoaXMuc2hvd0NvbnNvbGUobmV3IENvbnNvbGUoe1xuXHRcdFx0Y2hlY2tzOiBuZXcgQm9va0NoZWNrcygpLFxuXHRcdFx0ZXZlbnRCdXM6IHRoaXMuZXZlbnRCdXMsXG5cdFx0fSkpO1xuXHR9LFxuXG5cdHNob3dDb250ZW50Q29uc29sZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5tZW51UmVnaW9uLmFkZENsYXNzKFwiaGlkZVwiKTtcblxuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImdseXBoXCIsIG5ldyBHbHlwaCh7IGdseXBoOiBcIkNvbnRlbnRcIiB9KSk7XG5cblx0XHR0aGlzLnNob3dDb25zb2xlKG5ldyBDb25zb2xlKHtcblx0XHRcdGNoZWNrczogbmV3IENvbnRlbnRDaGVja3MoKSxcblx0XHRcdGV2ZW50QnVzOiB0aGlzLmV2ZW50QnVzLFxuXHRcdH0pKTtcblx0fSxcblxuXHRzaG93RGV2aWNlc0NvbnNvbGU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkubWVudVJlZ2lvbi5hZGRDbGFzcyhcImhpZGVcIik7XG5cblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJnbHlwaFwiLCBuZXcgR2x5cGgoeyBnbHlwaDogXCJEZXZpY2VzXCIgfSkpO1xuXG5cdFx0dGhpcy5zaG93Q29uc29sZShuZXcgQ29uc29sZSh7IGV2ZW50QnVzOiB0aGlzLmV2ZW50QnVzIH0pKTtcblx0fSxcblxuXHRzaG93Q29uc29sZTogZnVuY3Rpb24oY29uc29sZSkge1xuXHRcdHRoaXMuY29uc29sZSA9IGNvbnNvbGU7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiZGlzcGxheVwiLCB0aGlzLmNvbnNvbGUpO1xuXHRcdHRoaXMudWkuZGlzcGxheVJlZ2lvbi5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0Y2xvc2VDb25zb2xlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmdldFJlZ2lvbihcImRpc3BsYXlcIikucmVzZXQoKTtcblx0XHR0aGlzLmdldFJlZ2lvbihcImdseXBoXCIpLnJlc2V0KCk7XG5cblx0XHR0aGlzLnVpLmRpc3BsYXlSZWdpb24uYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkubWVudVJlZ2lvbi5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcodGhpcy5ldmVudEJ1cyk7XG5cdH0sXG59KTtcbiJdfQ==",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\nvar Promise = require(\"bluebird\");\nvar raygun = require(\"raygun\");\n\nvar settings = require(\"app-settings\");\n\nvar ExceptionModel = require(\"./exceptionModel\");\nvar GroupModel = require(\"../../../groups/views/groupModel\");\nvar UserModel = require(\"../../../users/userModel\");\n\n// -----------------------------------------------------------------------------\n// Groups\n// -----------------------------------------------------------------------------\n\nvar GroupCollection = Backbone.Collection.extend({\n\tmodel: GroupModel,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/groups?fullData=1\";\n\t}\n});\n\n// -----------------------------------------------------------------------------\n// Users\n// -----------------------------------------------------------------------------\n\nvar UserCollection = Backbone.Collection.extend({\n\tmodel: UserModel,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/users?schoolTypes=true\";\n\t}\n});\n\n// -----------------------------------------------------------------------------\n// Student App Analytics\n// -----------------------------------------------------------------------------\n\nvar StudentAppModel = Backbone.Model.extend({\n\tdefaults: {}\n});\n\nvar StudentAppCollection = Backbone.Collection.extend({\n\tmodel: StudentAppModel,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/analytics/apps/students\";\n\t}\n});\n\n// -----------------------------------------------------------------------------\n// Controller\n// -----------------------------------------------------------------------------\n\nmodule.exports = function () {\n\t_.extend(this, {\n\t\tinitialize: function initialize(options) {\n\t\t\tvar _this = this;\n\n\t\t\tthis.eventBus = options.eventBus;\n\n\t\t\t// Retrieve the data needed to perform the various checks\n\t\t\tvar collections = [new GroupCollection().lazyFetch(), new UserCollection().lazyFetch(), new StudentAppCollection().lazyFetch()];\n\n\t\t\tPromise.all(collections).spread(function (groups, users, studentApps) {\n\t\t\t\t_this.groupCollection = groups;\n\t\t\t\t_this.userCollection = users;\n\n\t\t\t\t_this.studentAppCollection = studentApps;\n\n\t\t\t\t_this.currentTime = moment();\n\n\t\t\t\t_this.checks = [_this.hasAtLeastOneGroup.bind(_this), _this.seenRecently.bind(_this)];\n\n\t\t\t\t_this.eventBus.trigger(\"checks:ready\");\n\t\t\t}).catch(function (error) {\n\t\t\t\t_this.eventBus.trigger(\"checks:error\", error);\n\t\t\t\tif (!settings.debug || settings.reportErrors) raygun(\"send\", error);\n\t\t\t});\n\t\t},\n\n\t\tgetGroups: function getGroups() {\n\t\t\treturn this.groupCollection;\n\t\t},\n\n\t\tgetUsers: function getUsers() {\n\t\t\treturn this.userCollection;\n\t\t},\n\n\t\trun: function run() {\n\t\t\tvar _this2 = this;\n\n\t\t\t// Check users\n\t\t\tthis.userCollection.each(function (userModel) {\n\t\t\t\t_.each(_this2.checks, function (check, index) {\n\t\t\t\t\tcheck(index, userModel);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tthis.eventBus.trigger(\"checks:complete\");\n\t\t},\n\n\t\trecheck: function recheck(exceptionModel) {\n\t\t\tvar userToCheck = _.find(this.userCollection.models, function (user) {\n\t\t\t\treturn user.get(\"_id\") === exceptionModel.get(\"userIdentifier\");\n\t\t\t});\n\n\t\t\tif (userToCheck) this.checks[exceptionModel.get(\"check\")](null, userToCheck, exceptionModel);\n\t\t},\n\n\t\thasAtLeastOneGroup: function hasAtLeastOneGroup(index, userModel, exceptionModel) {\n\t\t\tvar role = \"\";\n\n\t\t\tif (userModel.has(\"roles\")) {\n\t\t\t\tif (_.includes(userModel.get(\"roles\"), \"teacher\")) role = \"teacher\";else if (_.includes(userModel.get(\"roles\"), \"student\")) role = \"student\";\n\t\t\t}\n\n\t\t\tif (role.length > 0 && (!userModel.has(\"groups\") || userModel.get(\"groups\").length === 0)) {\n\t\t\t\tthis.eventBus.trigger(\"checks:exception\", exceptionModel ? exceptionModel : new ExceptionModel({\n\t\t\t\t\tcheck: index,\n\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\tuser: userModel.get(\"firstname\") + \" \" + userModel.get(\"surname\") + \" (\" + userModel.get(\"username\") + \")\",\n\t\t\t\t\tuserIdentifier: userModel.get(\"_id\"),\n\t\t\t\t\ttitle: \"A \" + role + \", \" + userModel.get(\"firstname\") + \" \" + userModel.get(\"surname\") + \", is not a member of any groups.\",\n\t\t\t\t\tdescription: \"While it is not necessary that every user be a member of a group, \" + \"such a user will not have access to any books or content that have been assigned \" + \"to specific groups. Furthermore, such a user might also not be able to see certain \" + \"calendar events and will not be visible in any attendance registers.\"\n\t\t\t\t}));\n\t\t\t} else if (exceptionModel) {\n\t\t\t\tthis.eventBus.trigger(\"exception:fixed\", exceptionModel);\n\t\t\t}\n\t\t},\n\n\t\tseenRecently: function seenRecently(index, userModel, exceptionModel) {\n\t\t\t// Rule parameters\n\t\t\tvar MAX_IDLE_DAYS = 10;\n\n\t\t\t// Rule check\n\t\t\tvar dataModel = _.find(this.studentAppCollection.models, function (s) {\n\t\t\t\treturn s.get(\"username\") === userModel.get(\"username\");\n\t\t\t});\n\n\t\t\tif (dataModel) {\n\t\t\t\tvar role = \"\";\n\n\t\t\t\tif (userModel.has(\"roles\")) {\n\t\t\t\t\tif (_.includes(userModel.get(\"roles\"), \"teacher\")) role = \"teacher\";else if (_.includes(userModel.get(\"roles\"), \"student\")) role = \"student\";\n\t\t\t\t}\n\n\t\t\t\tvar lastSeen = moment(dataModel.get(\"timestamp\"));\n\t\t\t\tvar duration = moment.duration(this.currentTime.diff(lastSeen));\n\n\t\t\t\tif (duration.asDays() > MAX_IDLE_DAYS) {\n\t\t\t\t\tthis.eventBus.trigger(\"checks:exception\", exceptionModel ? exceptionModel : new ExceptionModel({\n\t\t\t\t\t\tcheck: index,\n\t\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\t\tuser: userModel.get(\"firstname\") + \" \" + userModel.get(\"surname\") + \" (\" + userModel.get(\"username\") + \")\",\n\t\t\t\t\t\tuserIdentifier: userModel.get(\"_id\"),\n\t\t\t\t\t\ttitle: \"A \" + role + \", \" + userModel.get(\"firstname\") + \" \" + userModel.get(\"surname\") + \", has not been seen online in \" + Math.floor(duration.asDays()) + \" days.\",\n\t\t\t\t\t\tdescription: \"This user last logged into the mobile app on \" + lastSeen.format(\"YYYY-MM-DD\") + \".\"\n\t\t\t\t\t}));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInVzZXJDaGVja3MuanMiXSwibmFtZXMiOlsiXyIsInJlcXVpcmUiLCJCYWNrYm9uZSIsIm1vbWVudCIsIlByb21pc2UiLCJyYXlndW4iLCJzZXR0aW5ncyIsIkV4Y2VwdGlvbk1vZGVsIiwiR3JvdXBNb2RlbCIsIlVzZXJNb2RlbCIsIkdyb3VwQ29sbGVjdGlvbiIsIkNvbGxlY3Rpb24iLCJleHRlbmQiLCJtb2RlbCIsInVybCIsInVybFJvb3QiLCJVc2VyQ29sbGVjdGlvbiIsIlN0dWRlbnRBcHBNb2RlbCIsIk1vZGVsIiwiZGVmYXVsdHMiLCJTdHVkZW50QXBwQ29sbGVjdGlvbiIsIm1vZHVsZSIsImV4cG9ydHMiLCJpbml0aWFsaXplIiwib3B0aW9ucyIsImV2ZW50QnVzIiwiY29sbGVjdGlvbnMiLCJsYXp5RmV0Y2giLCJhbGwiLCJzcHJlYWQiLCJncm91cHMiLCJ1c2VycyIsInN0dWRlbnRBcHBzIiwiZ3JvdXBDb2xsZWN0aW9uIiwidXNlckNvbGxlY3Rpb24iLCJzdHVkZW50QXBwQ29sbGVjdGlvbiIsImN1cnJlbnRUaW1lIiwiY2hlY2tzIiwiaGFzQXRMZWFzdE9uZUdyb3VwIiwiYmluZCIsInNlZW5SZWNlbnRseSIsInRyaWdnZXIiLCJjYXRjaCIsImVycm9yIiwiZGVidWciLCJyZXBvcnRFcnJvcnMiLCJnZXRHcm91cHMiLCJnZXRVc2VycyIsInJ1biIsImVhY2giLCJjaGVjayIsImluZGV4IiwidXNlck1vZGVsIiwicmVjaGVjayIsImV4Y2VwdGlvbk1vZGVsIiwidXNlclRvQ2hlY2siLCJmaW5kIiwibW9kZWxzIiwidXNlciIsImdldCIsInJvbGUiLCJoYXMiLCJpbmNsdWRlcyIsImxlbmd0aCIsInNldmVyaXR5IiwidXNlcklkZW50aWZpZXIiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwiTUFYX0lETEVfREFZUyIsImRhdGFNb2RlbCIsInMiLCJsYXN0U2VlbiIsImR1cmF0aW9uIiwiZGlmZiIsImFzRGF5cyIsIk1hdGgiLCJmbG9vciIsImZv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QUFjLFdBQWQsQ0FBckIsR0FBa0QsR0FBbEQsR0FBd0RQLFVBQVVPLEdBQVYsQ0FBYyxTQUFkLENBQXhELEdBQ04sZ0NBRE0sR0FDNkJnQixLQUFLQyxLQUFMLENBQVdKLFNBQVNFLE1BQVQsRUFBWCxDQUQ3QixHQUM2RCxRQU4wQjtBQU85RlAsbUJBQWEsa0RBQWtESSxTQUFTTSxNQUFULENBQWdCLFlBQWhCLENBQWxELEdBQWtGO0FBUEQsTUFBbkIsQ0FBNUU7QUFTQTtBQUNEO0FBQ0Q7QUF2SGEsRUFBZjtBQXlIQSxDQTFIRCIsImZpbGUiOiJ1c2VyQ2hlY2tzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgbW9tZW50ID0gcmVxdWlyZShcIm1vbWVudFwiKTtcbmNvbnN0IFByb21pc2UgPSByZXF1aXJlKFwiYmx1ZWJpcmRcIik7XG5jb25zdCByYXlndW4gPSByZXF1aXJlKFwicmF5Z3VuXCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IEV4Y2VwdGlvbk1vZGVsID0gcmVxdWlyZShcIi4vZXhjZXB0aW9uTW9kZWxcIik7XG5jb25zdCBHcm91cE1vZGVsID0gcmVxdWlyZShcIi4uLy4uLy4uL2dyb3Vwcy92aWV3cy9ncm91cE1vZGVsXCIpO1xuY29uc3QgVXNlck1vZGVsID0gcmVxdWlyZShcIi4uLy4uLy4uL3VzZXJzL3VzZXJNb2RlbFwiKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEdyb3Vwc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgR3JvdXBDb2xsZWN0aW9uID0gQmFja2JvbmUuQ29sbGVjdGlvbi5leHRlbmQoe1xuXHRtb2RlbDogR3JvdXBNb2RlbCxcblxuXHR1cmw6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9ncm91cHM/ZnVsbERhdGE9MVwiO1xuXHR9LFxufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBVc2Vyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgVXNlckNvbGxlY3Rpb24gPSBCYWNrYm9uZS5Db2xsZWN0aW9uLmV4dGVuZCh7XG5cdG1vZGVsOiBVc2VyTW9kZWwsXG5cblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvdXNlcnM/c2Nob29sVHlwZXM9dHJ1ZVwiO1xuXHR9LFxufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdHVkZW50IEFwcCBBbmFseXRpY3Ncbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IFN0dWRlbnRBcHBNb2RlbCA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7fSxcbn0pO1xuXG5jb25zdCBTdHVkZW50QXBwQ29sbGVjdGlvbiA9IEJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IFN0dWRlbnRBcHBNb2RlbCxcblxuXHR1cmw6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9hbmFseXRpY3MvYXBwcy9zdHVkZW50c1wiO1xuXHR9LFxufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb250cm9sbGVyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuXHRfLmV4dGVuZCh0aGlzLCB7XG5cdFx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdFx0dGhpcy5ldmVudEJ1cyA9IG9wdGlvbnMuZXZlbnRCdXM7XG5cblx0XHRcdC8vIFJldHJpZXZlIHRoZSBkYXRhIG5lZWRlZCB0byBwZXJmb3JtIHRoZSB2YXJpb3VzIGNoZWNrc1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbnMgPSBbXG5cdFx0XHRcdG5ldyBHcm91cENvbGxlY3Rpb24oKS5sYXp5RmV0Y2goKSxcblx0XHRcdFx0bmV3IFVzZXJDb2xsZWN0aW9uKCkubGF6eUZldGNoKCksXG5cblx0XHRcdFx0bmV3IFN0dWRlbnRBcHBDb2xsZWN0aW9uKCkubGF6eUZldGNoKCksXG5cdFx0XHRdO1xuXG5cdFx0XHRQcm9taXNlLmFsbChjb2xsZWN0aW9ucykuc3ByZWFkKChncm91cHMsIHVzZXJzLCBzdHVkZW50QXBwcykgPT4ge1xuXHRcdFx0XHR0aGlzLmdyb3VwQ29sbGVjdGlvbiA9IGdyb3Vwcztcblx0XHRcdFx0dGhpcy51c2VyQ29sbGVjdGlvbiA9IHVzZXJzO1xuXG5cdFx0XHRcdHRoaXMuc3R1ZGVudEFwcENvbGxlY3Rpb24gPSBzdHVkZW50QXBwcztcblxuXHRcdFx0XHR0aGlzLmN1cnJlbnRUaW1lID0gbW9tZW50KCk7XG5cblx0XHRcdFx0dGhpcy5jaGVja3MgPSBbXG5cdFx0XHRcdFx0dGhpcy5oYXNBdExlYXN0T25lR3JvdXAuYmluZCh0aGlzKSxcblx0XHRcdFx0XHR0aGlzLnNlZW5SZWNlbnRseS5iaW5kKHRoaXMpLFxuXHRcdFx0XHRdO1xuXG5cdFx0XHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImNoZWNrczpyZWFkeVwiKTtcblx0XHRcdH0pLmNhdGNoKGVycm9yID0+IHtcblx0XHRcdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwiY2hlY2tzOmVycm9yXCIsIGVycm9yKTtcblx0XHRcdFx0aWYgKCFzZXR0aW5ncy5kZWJ1ZyB8fCBzZXR0aW5ncy5yZXBvcnRFcnJvcnMpXG5cdFx0XHRcdFx0cmF5Z3VuKFwic2VuZFwiLCBlcnJvcik7XG5cdFx0XHR9KTtcblx0XHR9LFxuXG5cdFx0Z2V0R3JvdXBzOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLmdyb3VwQ29sbGVjdGlvbjtcblx0XHR9LFxuXG5cdFx0Z2V0VXNlcnM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMudXNlckNvbGxlY3Rpb247XG5cdFx0fSxcblxuXHRcdHJ1bjogZnVuY3Rpb24oKSB7XG5cdFx0XHQvLyBDaGVjayB1c2Vyc1xuXHRcdFx0dGhpcy51c2VyQ29sbGVjdGlvbi5lYWNoKHVzZXJNb2RlbCA9PiB7XG5cdFx0XHRcdF8uZWFjaCh0aGlzLmNoZWNrcywgKGNoZWNrLCBpbmRleCkgPT4ge1xuXHRcdFx0XHRcdGNoZWNrKGluZGV4LCB1c2VyTW9kZWwpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJjaGVja3M6Y29tcGxldGVcIik7XG5cdFx0fSxcblxuXHRcdHJlY2hlY2s6IGZ1bmN0aW9uKGV4Y2VwdGlvbk1vZGVsKSB7XG5cdFx0XHRjb25zdCB1c2VyVG9DaGVjayA9IF8uZmluZCh0aGlzLnVzZXJDb2xsZWN0aW9uLm1vZGVscywgdXNlciA9PiB1c2VyLmdldChcIl9pZFwiKSA9PT0gZXhjZXB0aW9uTW9kZWwuZ2V0KFwidXNlcklkZW50aWZpZXJcIikpO1xuXG5cdFx0XHRpZiAodXNlclRvQ2hlY2spXG5cdFx0XHRcdHRoaXMuY2hlY2tzW2V4Y2VwdGlvbk1vZGVsLmdldChcImNoZWNrXCIpXShudWxsLCB1c2VyVG9DaGVjaywgZXhjZXB0aW9uTW9kZWwpO1xuXHRcdH0sXG5cblx0XHRoYXNBdExlYXN0T25lR3JvdXA6IGZ1bmN0aW9uKGluZGV4LCB1c2VyTW9kZWwsIGV4Y2VwdGlvbk1vZGVsKSB7XG5cdFx0XHRsZXQgcm9sZSA9IFwiXCI7XG5cblx0XHRcdGlmICh1c2VyTW9kZWwuaGFzKFwicm9sZXNcIikpIHtcblx0XHRcdFx0aWYgKF8uaW5jbHVkZXModXNlck1vZGVsLmdldChcInJvbGVzXCIpLCBcInRlYWNoZXJcIikpXG5cdFx0XHRcdFx0cm9sZSA9IFwidGVhY2hlclwiO1xuXHRcdFx0XHRlbHNlIGlmIChfLmluY2x1ZGVzKHVzZXJNb2RlbC5nZXQoXCJyb2xlc1wiKSwgXCJzdHVkZW50XCIpKVxuXHRcdFx0XHRcdHJvbGUgPSBcInN0dWRlbnRcIjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHJvbGUubGVuZ3RoID4gMCAmJiAoIXVzZXJNb2RlbC5oYXMoXCJncm91cHNcIikgfHwgdXNlck1vZGVsLmdldChcImdyb3Vwc1wiKS5sZW5ndGggPT09IDApKSB7XG5cdFx0XHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImNoZWNrczpleGNlcHRpb25cIiwgZXhjZXB0aW9uTW9kZWwgPyBleGNlcHRpb25Nb2RlbCA6IG5ldyBFeGNlcHRpb25Nb2RlbCh7XG5cdFx0XHRcdFx0Y2hlY2s6IGluZGV4LFxuXHRcdFx0XHRcdHNldmVyaXR5OiBcIndhcm5pbmdcIixcblx0XHRcdFx0XHR1c2VyOiB1c2VyTW9kZWwuZ2V0KFwiZmlyc3RuYW1lXCIpICsgXCIgXCIgKyB1c2VyTW9kZWwuZ2V0KFwic3VybmFtZVwiKSArIFwiIChcIiArIHVzZXJNb2RlbC5nZXQoXCJ1c2VybmFtZVwiKSArIFwiKVwiLFxuXHRcdFx0XHRcdHVzZXJJZGVudGlmaWVyOiB1c2VyTW9kZWwuZ2V0KFwiX2lkXCIpLFxuXHRcdFx0XHRcdHRpdGxlOiBcIkEgXCIgKyByb2xlICsgXCIsIFwiICsgdXNlck1vZGVsLmdldChcImZpcnN0bmFtZVwiKSArIFwiIFwiICsgdXNlck1vZGVsLmdldChcInN1cm5hbWVcIikgKyBcIiwgaXMgbm90IGEgbWVtYmVyIG9mIGFueSBncm91cHMuXCIsXG5cdFx0XHRcdFx0ZGVzY3JpcHRpb246IFwiV2hpbGUgaXQgaXMgbm90IG5lY2Vzc2FyeSB0aGF0IGV2ZXJ5IHVzZXIgYmUgYSBtZW1iZXIgb2YgYSBncm91cCwgXCIgK1xuXHRcdFx0XHRcdFx0XCJzdWNoIGEgdXNlciB3aWxsIG5vdCBoYXZlIGFjY2VzcyB0byBhbnkgYm9va3Mgb3IgY29udGVudCB0aGF0IGhhdmUgYmVlbiBhc3NpZ25lZCBcIiArXG5cdFx0XHRcdFx0XHRcInRvIHNwZWNpZmljIGdyb3Vwcy4gRnVydGhlcm1vcmUsIHN1Y2ggYSB1c2VyIG1pZ2h0IGFsc28gbm90IGJlIGFibGUgdG8gc2VlIGNlcnRhaW4gXCIgK1xuXHRcdFx0XHRcdFx0XCJjYWxlbmRhciBldmVudHMgYW5kIHdpbGwgbm90IGJlIHZpc2libGUgaW4gYW55IGF0dGVuZGFuY2UgcmVnaXN0ZXJzLlwiLFxuXHRcdFx0XHR9KSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmIChleGNlcHRpb25Nb2RlbCkge1xuXHRcdFx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJleGNlcHRpb246Zml4ZWRcIiwgZXhjZXB0aW9uTW9kZWwpO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRzZWVuUmVjZW50bHk6IGZ1bmN0aW9uKGluZGV4LCB1c2VyTW9kZWwsIGV4Y2VwdGlvbk1vZGVsKSB7XG5cdFx0XHQvLyBSdWxlIHBhcmFtZXRlcnNcblx0XHRcdGNvbnN0IE1BWF9JRExFX0RBWVMgPSAxMDtcblxuXHRcdFx0Ly8gUnVsZSBjaGVja1xuXHRcdFx0Y29uc3QgZGF0YU1vZGVsID0gXy5maW5kKHRoaXMuc3R1ZGVudEFwcENvbGxlY3Rpb24ubW9kZWxzLCBzID0+IHMuZ2V0KFwidXNlcm5hbWVcIikgPT09IHVzZXJNb2RlbC5nZXQoXCJ1c2VybmFtZVwiKSk7XG5cblx0XHRcdGlmIChkYXRhTW9kZWwpIHtcblx0XHRcdFx0bGV0IHJvbGUgPSBcIlwiO1xuXG5cdFx0XHRcdGlmICh1c2VyTW9kZWwuaGFzKFwicm9sZXNcIikpIHtcblx0XHRcdFx0XHRpZiAoXy5pbmNsdWRlcyh1c2VyTW9kZWwuZ2V0KFwicm9sZXNcIiksIFwidGVhY2hlclwiKSlcblx0XHRcdFx0XHRcdHJvbGUgPSBcInRlYWNoZXJcIjtcblx0XHRcdFx0XHRlbHNlIGlmIChfLmluY2x1ZGVzKHVzZXJNb2RlbC5nZXQoXCJyb2xlc1wiKSwgXCJzdHVkZW50XCIpKVxuXHRcdFx0XHRcdFx0cm9sZSA9IFwic3R1ZGVudFwiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgbGFzdFNlZW4gPSBtb21lbnQoZGF0YU1vZGVsLmdldChcInRpbWVzdGFtcFwiKSk7XG5cdFx0XHRcdGNvbnN0IGR1cmF0aW9uID0gbW9tZW50LmR1cmF0aW9uKHRoaXMuY3VycmVudFRpbWUuZGlmZihsYXN0U2VlbikpO1xuXG5cdFx0XHRcdGlmIChkdXJhdGlvbi5hc0RheXMoKSA+IE1BWF9JRExFX0RBWVMpIHtcblx0XHRcdFx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJjaGVja3M6ZXhjZXB0aW9uXCIsIGV4Y2VwdGlvbk1vZGVsID8gZXhjZXB0aW9uTW9kZWwgOiBuZXcgRXhjZXB0aW9uTW9kZWwoe1xuXHRcdFx0XHRcdFx0Y2hlY2s6IGluZGV4LFxuXHRcdFx0XHRcdFx0c2V2ZXJpdHk6IFwid2FybmluZ1wiLFxuXHRcdFx0XHRcdFx0dXNlcjogdXNlck1vZGVsLmdldChcImZpcnN0bmFtZVwiKSArIFwiIFwiICsgdXNlck1vZGVsLmdldChcInN1cm5hbWVcIikgKyBcIiAoXCIgKyB1c2VyTW9kZWwuZ2V0KFwidXNlcm5hbWVcIikgKyBcIilcIixcblx0XHRcdFx0XHRcdHVzZXJJZGVudGlmaWVyOiB1c2VyTW9kZWwuZ2V0KFwiX2lkXCIpLFxuXHRcdFx0XHRcdFx0dGl0bGU6IFwiQSBcIiArIHJvbGUgKyBcIiwgXCIgKyB1c2VyTW9kZWwuZ2V0KFwiZmlyc3RuYW1lXCIpICsgXCIgXCIgKyB1c2VyTW9kZWwuZ2V0KFwic3VybmFtZVwiKSArXG5cdFx0XHRcdFx0XHRcdFwiLCBoYXMgbm90IGJlZW4gc2VlbiBvbmxpbmUgaW4gXCIgKyBNYXRoLmZsb29yKGR1cmF0aW9uLmFzRGF5cygpKSArIFwiIGRheXMuXCIsXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvbjogXCJUaGlzIHVzZXIgbGFzdCBsb2dnZWQgaW50byB0aGUgbW9iaWxlIGFwcCBvbiBcIiArIGxhc3RTZWVuLmZvcm1hdChcIllZWVktTU0tRERcIikgKyBcIi5cIixcblx0XHRcdFx0XHR9KSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHR9KTtcbn07XG4iXX0=",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar Backbone = require(\"backbone\");\nvar _ = require(\"lodash\");\n\nvar App = require(\"../../index\");\nvar radio = Backbone.Radio.channel(\"global\");\nvar rester = require(\"rester\");\n\nvar ActionHeader = require(\"../../lib/actionHeader\");\nvar ActionTitle = require(\"../../lib/actionTitle\");\nvar GreyLabelingModal = require(\"./greyLabelingModal\");\nvar GreyLabelingsModel = require(\"./greyLabelingModel\");\nvar ErrorView = require(\"../../lib/errorView\");\nvar StatusView = require(\"../../lib/statusView\");\nvar SmallModal = require(\"../../lib/smallModal\");\n\nvar Header = ActionHeader.extend({\n\ttitleView: function titleView() {\n\t\treturn ActionTitle;\n\t},\n\n\tonTitleReady: function onTitleReady() {\n\t\tthis.eventBus.trigger(\"action-title:change-glyph\", \"fa-mobile\");\n\t\tthis.eventBus.trigger(\"action-title:change-title\", \"miEbooks Grey Labeling\");\n\t}\n});\n\nvar Editor = Backbone.Marionette.View.extend({\n\tclassName: \"grey-labeling-editor\",\n\n\ttemplate: require(\"../templates/greyLabeling.nunj\").editor,\n\n\tregions: {\n\t\tmodalContainer: \".modal-container\"\n\t},\n\n\tui: {\n\t\tresultPanel: \".grey-labeling-result-panel\",\n\n\t\tdrawerTop: \".drawer-top-logo img\",\n\t\tloadingImage: \".loading-image img\",\n\t\tpoweredBy: \".powered-by-logo img\",\n\t\theaderBarColor: \".header-bar-color .grey-labeling-value\",\n\n\t\tdrawerTopBtn: \".drawer-top-logo-btn\",\n\t\tloadingImageBtn: \".loading-image-btn\",\n\t\tpoweredByBtn: \".powered-by-logo-btn\",\n\t\theaderBarColorBtn: \".header-bar-color-btn\",\n\n\t\tdrawerTopDelete: \".drawer-top-logo .close\",\n\t\tloadingImageDelete: \".loading-image .close\",\n\t\tpoweredByDelete: \".powered-by-logo .close\",\n\t\theaderBarColorDelete: \".header-bar-color .close\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.drawerTopBtn\": \"onDrawerToplogoClick\",\n\t\t\"click @ui.loadingImageBtn\": \"onLoadingImageClick\",\n\t\t\"click @ui.poweredByBtn\": \"onPoweredbylogoClick\",\n\t\t\"click @ui.headerBarColorBtn\": \"onHeaderBarColorClick\",\n\n\t\t\"click @ui.drawerTopDelete\": \"onDeleteClick\",\n\t\t\"click @ui.loadingImageDelete\": \"onDeleteClick\",\n\t\t\"click @ui.poweredByDelete\": \"onDeleteClick\",\n\t\t\"click @ui.headerBarColorDelete\": \"onDeleteClick\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this = this;\n\n\t\treturn {\n\t\t\tisDataChanged: function isDataChanged() {\n\t\t\t\treturn _this.dataChanged;\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.eventBus = options.eventBus;\n\t\tthis.valueModel = new GreyLabelingsModel();\n\t\tthis.dataChanged = false;\n\t},\n\n\tsetDataChanged: function setDataChanged(changed) {\n\t\tthis.dataChanged = changed;\n\n\t\tif (changed) this.eventBus.trigger(\"editor:data-changed\");\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this2 = this;\n\n\t\tif (this.dataChanged) {\n\t\t\t_.forOwn(this.valueModel.attributes, function (value, key) {\n\t\t\t\t//Set new file values\n\t\t\t\tif (_.isString(value)) {\n\t\t\t\t\t_this2.ui[key].attr(\"src\", value);\n\t\t\t\t\t_this2.ui[key].removeClass(\"hide\");\n\t\t\t\t}\n\n\t\t\t\tif (key === \"headerBarColor\") {\n\t\t\t\t\t_this2.ui[key].find(\"span.val\").text(value);\n\t\t\t\t\t_this2.ui[key].find(\"div\").css(\"background\", value);\n\t\t\t\t}\n\n\t\t\t\t// View the delete button\n\t\t\t\t_this2.ui[key].parent().find(\".close\").removeClass(\"hide\");\n\t\t\t});\n\t\t}\n\t},\n\n\tfilterDelete: function filterDelete() {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tif (!rester.hasAccess(rester.p.api.features.greyLabeling.delete, user)) return false;\n\n\t\treturn true;\n\t},\n\n\tfilterEdit: function filterEdit() {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tif (!rester.hasAccess(rester.p.api.features.greyLabeling.post, user)) return false;\n\n\t\treturn true;\n\t},\n\n\tonDrawerToplogoClick: function onDrawerToplogoClick() {\n\t\tthis.editFile(\"drawerTop\", \"Drawer Top logo\");\n\t},\n\n\tonLoadingImageClick: function onLoadingImageClick() {\n\t\tthis.editFile(\"loadingImage\", \"Loading Image\");\n\t},\n\n\tonPoweredbylogoClick: function onPoweredbylogoClick() {\n\t\tthis.editFile(\"poweredBy\", \"Powered by logo\");\n\t},\n\n\tonHeaderBarColorClick: function onHeaderBarColorClick() {\n\t\tthis.editValue(\"headerBarColor\", \"Header Bar Color\");\n\t},\n\n\tonDeleteClick: function onDeleteClick(event) {\n\t\tvar _this3 = this;\n\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\n\t\tif (!this.filterDelete()) return;\n\n\t\tvar target = $(event.currentTarget);\n\t\tthis.deleteModel = new GreyLabelingsModel({ id: target.data(\"attr\") });\n\n\t\tthis.delModal = new SmallModal({\n\t\t\tpersist: true,\n\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Delete Grey Label: \" + _.replace(target.attr(\"title\"), \"Delete \", \"\"),\n\t\t\tbody: \"<p>Are you sure you want to delete this grey label?</p>\",\n\t\t\twarning: true\n\t\t});\n\t\tthis.delModal.on(\"button:ok\", function () {\n\t\t\t_this3.deleteModel.destroy({ wait: true, success: _this3.deletionSuccess.bind(_this3), error: _this3.deletionError.bind(_this3) });\n\t\t});\n\n\t\tthis.delModal.show();\n\t},\n\n\tdeletionSuccess: function deletionSuccess(model) {\n\t\tthis.delModal.destroy();\n\n\t\tvar fileAttributes = [\"drawerTop\", \"loadingImage\", \"poweredBy\"];\n\t\tif (_.includes(fileAttributes, model.get(\"id\"))) {\n\t\t\tthis.ui[model.get(\"id\")].attr(\"src\", \"\");\n\t\t\tthis.ui[model.get(\"id\")].addClass(\"hide\");\n\t\t}\n\n\t\tif (model.get(\"id\") === \"headerBarColor\") {\n\t\t\tthis.ui[model.get(\"id\")].find(\"span.val\").text(\"\");\n\t\t\tthis.ui[model.get(\"id\")].find(\"div\").css(\"background\", \"none\");\n\t\t}\n\n\t\tthis.ui[model.get(\"id\")].parent().find(\".close\").addClass(\"hide\");\n\n\t\tradio.trigger(App.Events.Commands.Toast, { content: \"Grey Label \" + model.get(\"id\") + \" successfully deleted\", icon: \"fa-trash-alt\", iconColour: \"red\" });\n\t},\n\n\tdeletionError: function deletionError(model, xhr) {\n\t\tvar answer = App.parseResponse(xhr);\n\t\tthis.delModal.showError(\"Deletion failed: \" + (answer.detail || answer.info));\n\t},\n\n\teditFile: function editFile(modelAttribute, type) {\n\t\tvar _this4 = this;\n\n\t\tvar modal = new GreyLabelingModal({\n\t\t\tmodel: this.valueModel,\n\t\t\tinputType: \"file\",\n\t\t\tmodelAttribute: modelAttribute,\n\t\t\ttitle: \"Select the file for \" + type,\n\t\t\ttype: type\n\t\t});\n\n\t\tthis.listenTo(modal, \"save\", function (model) {\n\t\t\t_this4.valueModel.set(modelAttribute, model.get(modelAttribute));\n\n\t\t\t_this4.dataChanged = true;\n\t\t\t_this4.render();\n\n\t\t\t_this4.stopListening(modal);\n\t\t});\n\n\t\tthis.listenTo(modal, \"cancel\", function () {\n\t\t\t_this4.valueModel.unset(modelAttribute);\n\n\t\t\t_this4.stopListening(modal);\n\t\t});\n\n\t\tmodal.show();\n\t},\n\n\teditValue: function editValue(modelAttribute, type) {\n\t\tvar _this5 = this;\n\n\t\tvar modal = new GreyLabelingModal({\n\t\t\tmodel: this.valueModel,\n\t\t\tmodelAttribute: modelAttribute,\n\t\t\tinputType: \"text\",\n\t\t\ttitle: \"Enter the <b>hexadecimal</b> value for \" + type,\n\t\t\ttype: type\n\t\t});\n\n\t\tthis.listenTo(modal, \"save\", function (model) {\n\t\t\tvar greyLabel = _this5.model.get(modelAttribute);\n\t\t\tgreyLabel = _.trim(model.get(modelAttribute));\n\n\t\t\t_this5.valueModel.set(modelAttribute, greyLabel);\n\n\t\t\t_this5.dataChanged = true;\n\t\t\t_this5.render();\n\n\t\t\t_this5.stopListening(modal);\n\t\t});\n\n\t\tthis.listenTo(modal, \"cancel\", function () {\n\t\t\t_this5.valueModel.unset(modelAttribute);\n\n\t\t\t_this5.stopListening(modal);\n\t\t});\n\n\t\tmodal.show();\n\t},\n\n\tonSaveSuccess: function onSaveSuccess() {\n\t\tthis.valueModel.clear({ silent: true });\n\t\tthis.dataChanged = false;\n\n\t\tthis.eventBus.trigger(\"editor:saved\");\n\t\tradio.trigger(App.Events.Commands.Toast, { content: \"Grey Label successfully saved\", icon: \"fa-save\", iconColour: \"red\" });\n\t},\n\n\tonSaveError: function onSaveError(model, response) {\n\t\tthis.eventBus.trigger(\"editor:saved\", response);\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"grey-labeling-layout content\",\n\n\ttemplate: require(\"../templates/greyLabeling.nunj\").layout,\n\n\tregions: {\n\t\teditor: \".editor-region\",\n\t\theader: \".header-region\",\n\t\tstatus: \".status-region\"\n\t},\n\n\tui: {\n\t\teditorRegion: \".editor-region\",\n\t\theaderRegion: \".header-region\",\n\t\tstatusRegion: \".status-region\",\n\n\t\tsaveSuccessResultPanel: \".grey-labeling-success-result-panel\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.eventBus = new Backbone.Marionette.Object();\n\n\t\tthis.listenTo(this.eventBus, \"editor:data-changed\", this.onEditorDataChanged.bind(this));\n\t\tthis.listenTo(this.eventBus, \"editor:saving\", this.onEditorSaving.bind(this));\n\t\tthis.listenTo(this.eventBus, \"editor:saved\", this.onEditorSaved.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.renderLoadingStatus();\n\n\t\tthis.greyLabelingModel = new GreyLabelingsModel();\n\t\tthis.greyLabelingModel.fetch({\n\t\t\tsuccess: this.onFetchSuccess.bind(this),\n\t\t\terror: this.onFetchError.bind(this)\n\t\t});\n\t},\n\n\tonFetchSuccess: function onFetchSuccess() {\n\t\tthis.renderPage();\n\t},\n\n\tonFetchError: function onFetchError(model, response) {\n\t\tthis.renderError(response);\n\t},\n\n\trenderLoadingStatus: function renderLoadingStatus() {\n\t\tthis.getRegion(\"status\").empty();\n\t\tthis.showChildView(\"status\", new StatusView({\n\t\t\tmessage: \"Loading...\",\n\t\t\ttype: \"busy\"\n\t\t}));\n\t},\n\n\trenderSavingStatus: function renderSavingStatus() {\n\t\tthis.getRegion(\"status\").empty();\n\t\tthis.showChildView(\"status\", new StatusView({\n\t\t\tmessage: \"Saving...\",\n\t\t\ttype: \"busy\"\n\t\t}));\n\t},\n\n\trenderError: function renderError(error) {\n\t\tthis.getRegion(\"status\").empty();\n\t\tthis.showChildView(\"status\", new ErrorView({ fetchError: error }));\n\t},\n\n\trenderPage: function renderPage() {\n\t\tthis.ui.statusRegion.addClass(\"hide\");\n\t\tthis.ui.headerRegion.removeClass(\"hide\");\n\t\tthis.ui.editorRegion.removeClass(\"hide\");\n\n\t\tthis.header = new Header({ eventBus: this.eventBus });\n\t\tthis.showChildView(\"header\", this.header);\n\t\tthis.editor = new Editor({\n\t\t\teventBus: this.eventBus,\n\t\t\tmodel: this.greyLabelingModel\n\t\t});\n\t\tthis.showChildView(\"editor\", this.editor);\n\t},\n\n\tonEditorDataChanged: function onEditorDataChanged() {\n\t\tif (!this.saveSuccessResultPanel.hasClass(\"hide\")) this.saveSuccessResultPanel.addClass(\"hide\");\n\t},\n\n\tonEditorSaving: function onEditorSaving() {\n\t\tthis.renderSavingStatus();\n\n\t\tthis.ui.saveSuccessResultPanel.addClass(\"hide\");\n\t\tthis.ui.editorRegion.addClass(\"hide\");\n\t\tthis.ui.statusRegion.removeClass(\"hide\");\n\t},\n\n\tonEditorSaved: function onEditorSaved(errorResponse) {\n\t\tif (errorResponse) {\n\t\t\tthis.renderError(errorResponse);\n\t\t} else {\n\t\t\tthis.ui.statusRegion.addClass(\"hide\");\n\t\t\tthis.ui.editorRegion.removeClass(\"hide\");\n\t\t\tthis.ui.saveSuccessResultPanel.removeClass(\"hide\");\n\t\t}\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImdyZXlMYWJlbGluZy5qcyJdLCJuYW1lcyI6WyIkIiwicmVxdWlyZSIsIkJhY2tib25lIiwiXyIsIkFwcCIsInJhZGlvIiwiUmFkaW8iLCJjaGFubmVsIiwicmVzdGVyIiwiQWN0aW9uSGVhZGVyIiwiQWN0aW9uVGl0bGUiLCJHcmV5TGFiZWxpbmdNb2RhbCIsIkdyZXlMYWJlbGluZ3NNb2RlbCIsIkVycm9yVmlldyIsIlN0YXR1c1ZpZXciLCJTbWFsbE1vZGFsIiwiSGVhZGVyIiwiZXh0ZW5kIiwidGl0bGVWaWV3Iiwib25UaXRsZVJlYWR5IiwiZXZlbnRCdXMiLCJ0cmlnZ2VyIiwiRWRpdG9yIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsImVkaXRvciIsInJlZ2lvbnMiLCJtb2RhbENvbnRhaW5lciIsInVpIiwicmVzdWx0UGFuZWwiLCJkcmF3ZXJUb3AiLCJsb2FkaW5nSW1hZ2UiLCJwb3dlcmVkQnkiLCJoZWFkZXJCYXJDb2xvciIsImRyYXdlclRvcEJ0biIsImxvYWRpbmdJbWFnZUJ0biIsInBvd2VyZWRCeUJ0biIsImhlYWRlckJhckNvbG9yQnRuIiwiZHJhd2VyVG9wRGVsZXRlIiwibG9hZGluZ0ltYWdlRGVsZXRlIiwicG93ZXJlZEJ5RGVsZXRlIiwiaGVhZGVyQmFyQ29sb3JEZWxldGUiLCJldmVudHMiLCJ0ZW1wbGF0ZUNvbnRleHQiLCJpc0RhdGFDaGFuZ2VkIiwiZGF0YUNoYW5nZWQiLCJpbml0aWFsaXplIiwib3B0aW9ucyIsInZhbHVlTW9kZWwiLCJzZXREYXRhQ2hhbmdlZCIsImNoYW5nZWQiLCJvblJlbmRlciIsImZvck93biIsImF0dHJpYnV0ZXMiLCJ2YWx1ZSIsImtleSIsImlzU3RyaW5nIiwiYXR0ciIsInJlbW92ZUNsYXNzIiwiZmluZCIsInRleHQiLCJjc3MiLCJwYXJlbnQiLCJmaWx0ZXJEZWxldGUiLCJ1c2VyIiwicmVxdWVzdCIsIkV2ZW50cyIsIlJlcXVlc3RzIiwiQ3VycmVudFVzZXIiLCJoYXNBY2Nlc3MiLCJwIiwiYXBpIiwiZmVhdHVyZXMiLCJncmV5TGFiZWxpbmciLCJkZWxldGUiLCJmaWx0ZXJFZGl0IiwicG9zdCIsIm9uRHJhd2VyVG9wbG9nb0NsaWNrIiwiZWRpdEZpbGUiLCJvbkxvYWRpbmdJbWFnZUNsaWNrIiwib25Qb3dlcmVkYnlsb2dvQ2xpY2siLCJvbkhlYWRlckJhckNvbG9yQ2xpY2siLCJlZGl0VmFsdWUiLCJvbkRlbGV0ZUNsaWNrIiwiZXZlbnQiLCJzdG9wUHJvcGFnYXRpb24iLCJwcmV2ZW50RGVmYXVsdCIsInRhcmdldCIsImN1cnJlbnRUYXJnZXQiLCJkZWxldGVNb2RlbCIsImlkIiwiZGF0YSIsImRlbE1vZGFsIiwicGVyc2lzdCIsInRpdGxlIiwicmVwbGFjZSIsImJvZHkiLCJ3YXJuaW5nIiwib24iLCJkZXN0cm95Iiwid2FpdCIsInN1Y2Nlc3MiLCJkZWxldGlvblN1Y2Nlc3MiLCJiaW5kIiwiZXJyb3IiLCJkZWxldGlvbkVycm9yIiwic2hvdyIsIm1vZGVsIiwiZmlsZUF0dHJpYnV0ZXMiLCJpbmNsdWRlcyIsImdldCIsImFkZENsYXNzIiwiQ29tbWFuZHMiLCJUb2FzdCIsImNvbnRlbnQiLCJpY29uIiwiaWNvbkNvbG91ciIsInhociIsImFuc3dlciIsInBhcnNlUmVzcG9uc2UiLCJzaG93RXJyb3IiLCJkZXRhaWwiLCJpbmZvIiwibW9kZWxBdHRyaWJ1dGUiLCJ0eXBlIiwibW9kYWwiLCJpbnB1dFR5cGUiLCJsaXN0ZW5UbyIsInNldCIsInJlbmRlciIsInN0b3BMaXN0ZW5pbmciLCJ1bnNldCIsImdyZXlMYWJlbCIsInRyaW0iLCJvblNhdmVTdWNjZXNzIiwiY2xlYXIiLCJzaWxlbnQiLCJvblNhdmVFcnJvciIsInJlc3BvbnNlIiwibW9kdWxlIiwiZXhwb3J0cyIsImxheW91dCIsImhlYWRlciIsInN0YXR1cyIsImVkaXRvclJlZ2lvbiIsImhlYWRlclJlZ2lvbiIsInN0YXR1c1JlZ2lvbiIsInNhdmVTdWNjZXNzUmVzdWx0UGFuZWwiLCJPYmplY3QiLCJvbkVkaXRvckRhdGFDaGFuZ2VkIiwib25FZGl0b3JTYXZpbmciLCJvbkVkaXRvclNhdmVkIiwicmVuZGVyTG9hZGluZ1N0YXR1cyIsImdyZXlMYWJlbGluZ01vZGVsIiwiZmV0Y2giLCJvbkZldGNoU3VjY2VzcyIsIm9uRmV0Y2hFcnJvciIsInJlbmRlclBhZ2UiLCJyZW5kZXJFcnJvciIsImdldFJlZ2lvbiIsImVtcHR5Iiwic2hvd0NoaWxkVmlldyIsIm1lc3NhZ2UiLCJyZW5kZXJTYXZpbmdTdGF0dXMiLCJmZXRjaEVycm9yIiwiaGFzQ2xhc3MiLCJlcnJvclJlc3BvbnNlIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLFdBQVdELFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1FLElBQUlGLFFBQVEsUUFBUixDQUFWOztBQUVBLElBQU1HLE1BQU1ILFFBQVEsYUFBUixDQUFaO0FBQ0EsSUFBTUksUUFBUUgsU0FBU0ksS0FBVCxDQUFlQyxPQUFmLENBQXVCLFFBQXZCLENBQWQ7QUFDQSxJQUFNQyxTQUFTUCxRQUFRLFFBQVIsQ0FBZjs7QUFFQSxJQUFNUSxlQUFlUixRQUFRLHdCQUFSLENBQXJCO0FBQ0EsSUFBTVMsY0FBY1QsUUFBUSx1QkFBUixDQUFwQjtBQUNBLElBQU1VLG9CQUFvQlYsUUFBUSxxQkFBUixDQUExQjtBQUNBLElBQU1XLHFCQUFxQlgsUUFBUSxxQkFBUixDQUEzQjtBQUNBLElBQU1ZLFlBQVlaLFFBQVEscUJBQVIsQ0FBbEI7QUFDQSxJQUFNYSxhQUFhYixRQUFRLHNCQUFSLENBQW5CO0FBQ0EsSUFBTWMsYUFBYWQsUUFBUSxzQkFBUixDQUFuQjs7QUFFQSxJQUFNZSxTQUFTUCxhQUFhUSxNQUFiLENBQW9CO0FBQ2xDQyxZQUFXLHFCQUFXO0FBQ3JCLFNBQU9SLFdBQVA7QUFDQSxFQUhpQzs7QUFLbENTLGVBQWMsd0JBQVc7QUFDeEIsT0FBS0MsUUFBTCxDQUFjQyxPQUFkLENBQXNCLDJCQUF0QixFQUFt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NkIsS0FBS3hJLE1BQWxDO0FBQ0EsRUE5RStDOztBQWdGaEQ0SCxzQkFBcUIsK0JBQVc7QUFDL0IsTUFBSSxDQUFDLEtBQUtGLHNCQUFMLENBQTRCa0IsUUFBNUIsQ0FBcUMsTUFBckMsQ0FBTCxFQUNDLEtBQUtsQixzQkFBTCxDQUE0QnBDLFFBQTVCLENBQXFDLE1BQXJDO0FBQ0QsRUFuRitDOztBQXFGaER1QyxpQkFBZ0IsMEJBQVc7QUFDMUIsT0FBS2Esa0JBQUw7O0FBRUEsT0FBS3ZJLEVBQUwsQ0FBUXVILHNCQUFSLENBQStCcEMsUUFBL0IsQ0FBd0MsTUFBeEM7QUFDQSxPQUFLbkYsRUFBTCxDQUFRb0gsWUFBUixDQUFxQmpDLFFBQXJCLENBQThCLE1BQTlCO0FBQ0EsT0FBS25GLEVBQUwsQ0FBUXNILFlBQVIsQ0FBcUJ4RixXQUFyQixDQUFpQyxNQUFqQztBQUNBLEVBM0YrQzs7QUE2RmhENkYsZ0JBQWUsdUJBQVNlLGFBQVQsRUFBd0I7QUFDdEMsTUFBSUEsYUFBSixFQUFtQjtBQUNsQixRQUFLUixXQUFMLENBQWlCUSxhQUFqQjtBQUNBLEdBRkQsTUFHSztBQUNKLFFBQUsxSSxFQUFMLENBQVFzSCxZQUFSLENBQXFCbkMsUUFBckIsQ0FBOEIsTUFBOUI7QUFDQSxRQUFLbkYsRUFBTCxDQUFRb0gsWUFBUixDQUFxQnRGLFdBQXJCLENBQWlDLE1BQWpDO0FBQ0EsUUFBSzlCLEVBQUwsQ0FBUXVILHNCQUFSLENBQStCekYsV0FBL0IsQ0FBMkMsTUFBM0M7QUFDQTtBQUNEO0FBdEcrQyxDQUFoQyxDQUFqQiIsImZpbGUiOiJncmV5TGFiZWxpbmcuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcblxuY29uc3QgQXBwID0gcmVxdWlyZShcIi4uLy4uL2luZGV4XCIpO1xuY29uc3QgcmFkaW8gPSBCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZ2xvYmFsXCIpO1xuY29uc3QgcmVzdGVyID0gcmVxdWlyZShcInJlc3RlclwiKTtcblxuY29uc3QgQWN0aW9uSGVhZGVyID0gcmVxdWlyZShcIi4uLy4uL2xpYi9hY3Rpb25IZWFkZXJcIik7XG5jb25zdCBBY3Rpb25UaXRsZSA9IHJlcXVpcmUoXCIuLi8uLi9saWIvYWN0aW9uVGl0bGVcIik7XG5jb25zdCBHcmV5TGFiZWxpbmdNb2RhbCA9IHJlcXVpcmUoXCIuL2dyZXlMYWJlbGluZ01vZGFsXCIpO1xuY29uc3QgR3JleUxhYmVsaW5nc01vZGVsID0gcmVxdWlyZShcIi4vZ3JleUxhYmVsaW5nTW9kZWxcIik7XG5jb25zdCBFcnJvclZpZXcgPSByZXF1aXJlKFwiLi4vLi4vbGliL2Vycm9yVmlld1wiKTtcbmNvbnN0IFN0YXR1c1ZpZXcgPSByZXF1aXJlKFwiLi4vLi4vbGliL3N0YXR1c1ZpZXdcIik7XG5jb25zdCBTbWFsbE1vZGFsID0gcmVxdWlyZShcIi4uLy4uL2xpYi9zbWFsbE1vZGFsXCIpO1xuXG5jb25zdCBIZWFkZXIgPSBBY3Rpb25IZWFkZXIuZXh0ZW5kKHtcblx0dGl0bGVWaWV3OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gQWN0aW9uVGl0bGU7XG5cdH0sXG5cblx0b25UaXRsZVJlYWR5OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJhY3Rpb24tdGl0bGU6Y2hhbmdlLWdseXBoXCIsIFwiZmEtbW9iaWxlXCIpO1xuXHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImFjdGlvbi10aXRsZTpjaGFuZ2UtdGl0bGVcIiwgXCJtaUVib29rcyBHcmV5IExhYmVsaW5nXCIpO1xuXHR9LFxufSk7XG5cbmNvbnN0IEVkaXRvciA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZ3JleS1sYWJlbGluZy1lZGl0b3JcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9ncmV5TGFiZWxpbmcubnVualwiKS5lZGl0b3IsXG5cblx0cmVnaW9uczoge1xuXHRcdG1vZGFsQ29udGFpbmVyOiBcIi5tb2RhbC1jb250YWluZXJcIixcblx0fSxcblxuXHR1aToge1xuXHRcdHJlc3VsdFBhbmVsOiBcIi5ncmV5LWxhYmVsaW5nLXJlc3VsdC1wYW5lbFwiLFxuXG5cdFx0ZHJhd2VyVG9wOiBcIi5kcmF3ZXItdG9wLWxvZ28gaW1nXCIsXG5cdFx0bG9hZGluZ0ltYWdlOiBcIi5sb2FkaW5nLWltYWdlIGltZ1wiLFxuXHRcdHBvd2VyZWRCeTogXCIucG93ZXJlZC1ieS1sb2dvIGltZ1wiLFxuXHRcdGhlYWRlckJhckNvbG9yOiBcIi5oZWFkZXItYmFyLWNvbG9yIC5ncmV5LWxhYmVsaW5nLXZhbHVlXCIsXG5cblx0XHRkcmF3ZXJUb3BCdG46IFwiLmRyYXdlci10b3AtbG9nby1idG5cIixcblx0XHRsb2FkaW5nSW1hZ2VCdG46IFwiLmxvYWRpbmctaW1hZ2UtYnRuXCIsXG5cdFx0cG93ZXJlZEJ5QnRuOiBcIi5wb3dlcmVkLWJ5LWxvZ28tYnRuXCIsXG5cdFx0aGVhZGVyQmFyQ29sb3JCdG46IFwiLmhlYWRlci1iYXItY29sb3ItYnRuXCIsXG5cblx0XHRkcmF3ZXJUb3BEZWxldGU6IFwiLmRyYXdlci10b3AtbG9nbyAuY2xvc2VcIixcblx0XHRsb2FkaW5nSW1hZ2VEZWxldGU6IFwiLmxvYWRpbmctaW1hZ2UgLmNsb3NlXCIsXG5cdFx0cG93ZXJlZEJ5RGVsZXRlOiBcIi5wb3dlcmVkLWJ5LWxvZ28gLmNsb3NlXCIsXG5cdFx0aGVhZGVyQmFyQ29sb3JEZWxldGU6IFwiLmhlYWRlci1iYXItY29sb3IgLmNsb3NlXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkuZHJhd2VyVG9wQnRuXCI6IFwib25EcmF3ZXJUb3Bsb2dvQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5sb2FkaW5nSW1hZ2VCdG5cIjogXCJvbkxvYWRpbmdJbWFnZUNsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkucG93ZXJlZEJ5QnRuXCI6IFwib25Qb3dlcmVkYnlsb2dvQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5oZWFkZXJCYXJDb2xvckJ0blwiOiBcIm9uSGVhZGVyQmFyQ29sb3JDbGlja1wiLFxuXG5cdFx0XCJjbGljayBAdWkuZHJhd2VyVG9wRGVsZXRlXCI6IFwib25EZWxldGVDbGlja1wiLFxuXHRcdFwiY2xpY2sgQHVpLmxvYWRpbmdJbWFnZURlbGV0ZVwiOiBcIm9uRGVsZXRlQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5wb3dlcmVkQnlEZWxldGVcIjogXCJvbkRlbGV0ZUNsaWNrXCIsXG5cdFx0XCJjbGljayBAdWkuaGVhZGVyQmFyQ29sb3JEZWxldGVcIjogXCJvbkRlbGV0ZUNsaWNrXCIsXG5cdH0sXG5cblx0dGVtcGxhdGVDb250ZXh0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aXNEYXRhQ2hhbmdlZDogKCkgPT4gdGhpcy5kYXRhQ2hhbmdlZCxcblx0XHR9O1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLmV2ZW50QnVzID0gb3B0aW9ucy5ldmVudEJ1cztcblx0XHR0aGlzLnZhbHVlTW9kZWwgPSBuZXcgR3JleUxhYmVsaW5nc01vZGVsKCk7XG5cdFx0dGhpcy5kYXRhQ2hhbmdlZCA9IGZhbHNlO1xuXHR9LFxuXG5cdHNldERhdGFDaGFuZ2VkOiBmdW5jdGlvbihjaGFuZ2VkKSB7XG5cdFx0dGhpcy5kYXRhQ2hhbmdlZCA9IGNoYW5nZWQ7XG5cblx0XHRpZiAoY2hhbmdlZClcblx0XHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImVkaXRvcjpkYXRhLWNoYW5nZWRcIik7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLmRhdGFDaGFuZ2VkKSB7XG5cdFx0XHRfLmZvck93bih0aGlzLnZhbHVlTW9kZWwuYXR0cmlidXRlcywgKHZhbHVlLCBrZXkpID0+IHtcblx0XHRcdFx0Ly9TZXQgbmV3IGZpbGUgdmFsdWVzXG5cdFx0XHRcdGlmIChfLmlzU3RyaW5nKHZhbHVlKSkge1xuXHRcdFx0XHRcdHRoaXMudWlba2V5XS5hdHRyKFwic3JjXCIsIHZhbHVlKTtcblx0XHRcdFx0XHR0aGlzLnVpW2tleV0ucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGtleSA9PT0gXCJoZWFkZXJCYXJDb2xvclwiKSB7XG5cdFx0XHRcdFx0dGhpcy51aVtrZXldLmZpbmQoXCJzcGFuLnZhbFwiKS50ZXh0KHZhbHVlKTtcblx0XHRcdFx0XHR0aGlzLnVpW2tleV0uZmluZChcImRpdlwiKS5jc3MoXCJiYWNrZ3JvdW5kXCIsIHZhbHVlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFZpZXcgdGhlIGRlbGV0ZSBidXR0b25cblx0XHRcdFx0dGhpcy51aVtrZXldLnBhcmVudCgpLmZpbmQoXCIuY2xvc2VcIikucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdGZpbHRlckRlbGV0ZTogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgdXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cblx0XHRpZiAoIXJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAuYXBpLmZlYXR1cmVzLmdyZXlMYWJlbGluZy5kZWxldGUsIHVzZXIpKVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cblx0ZmlsdGVyRWRpdDogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgdXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cblx0XHRpZiAoIXJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAuYXBpLmZlYXR1cmVzLmdyZXlMYWJlbGluZy5wb3N0LCB1c2VyKSlcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdG9uRHJhd2VyVG9wbG9nb0NsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmVkaXRGaWxlKFwiZHJhd2VyVG9wXCIsIFwiRHJhd2VyIFRvcCBsb2dvXCIpO1xuXHR9LFxuXG5cdG9uTG9hZGluZ0ltYWdlQ2xpY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZWRpdEZpbGUoXCJsb2FkaW5nSW1hZ2VcIiwgXCJMb2FkaW5nIEltYWdlXCIpO1xuXHR9LFxuXG5cdG9uUG93ZXJlZGJ5bG9nb0NsaWNrOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmVkaXRGaWxlKFwicG93ZXJlZEJ5XCIsIFwiUG93ZXJlZCBieSBsb2dvXCIpO1xuXHR9LFxuXG5cdG9uSGVhZGVyQmFyQ29sb3JDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5lZGl0VmFsdWUoXCJoZWFkZXJCYXJDb2xvclwiLCBcIkhlYWRlciBCYXIgQ29sb3JcIik7XG5cdH0sXG5cblx0b25EZWxldGVDbGljazogZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0aWYgKCF0aGlzLmZpbHRlckRlbGV0ZSgpKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0Y29uc3QgdGFyZ2V0ID0gJChldmVudC5jdXJyZW50VGFyZ2V0KTtcblx0XHR0aGlzLmRlbGV0ZU1vZGVsID0gbmV3IEdyZXlMYWJlbGluZ3NNb2RlbCh7IGlkOiB0YXJnZXQuZGF0YShcImF0dHJcIikgfSk7XG5cblx0XHR0aGlzLmRlbE1vZGFsID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0cGVyc2lzdDogdHJ1ZSxcblx0XHRcdHRpdGxlOiBcIjxzcGFuIGNsYXNzPSdmYWwgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUnLz4gRGVsZXRlIEdyZXkgTGFiZWw6IFwiICsgXy5yZXBsYWNlKHRhcmdldC5hdHRyKFwidGl0bGVcIiksIFwiRGVsZXRlIFwiLCBcIlwiKSxcblx0XHRcdGJvZHk6IFwiPHA+QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGdyZXkgbGFiZWw/PC9wPlwiLFxuXHRcdFx0d2FybmluZzogdHJ1ZSxcblx0XHR9KTtcblx0XHR0aGlzLmRlbE1vZGFsLm9uKFwiYnV0dG9uOm9rXCIsICgpID0+IHtcblx0XHRcdHRoaXMuZGVsZXRlTW9kZWwuZGVzdHJveSh7IHdhaXQ6IHRydWUsIHN1Y2Nlc3M6IHRoaXMuZGVsZXRpb25TdWNjZXNzLmJpbmQodGhpcyksIGVycm9yOiB0aGlzLmRlbGV0aW9uRXJyb3IuYmluZCh0aGlzKSB9KTtcblx0XHR9KTtcblxuXHRcdHRoaXMuZGVsTW9kYWwuc2hvdygpO1xuXHR9LFxuXG5cdGRlbGV0aW9uU3VjY2VzczogZnVuY3Rpb24obW9kZWwpIHtcblx0XHR0aGlzLmRlbE1vZGFsLmRlc3Ryb3koKTtcblxuXHRcdGNvbnN0IGZpbGVBdHRyaWJ1dGVzID0gW1wiZHJhd2VyVG9wXCIsIFwibG9hZGluZ0ltYWdlXCIsIFwicG93ZXJlZEJ5XCJdO1xuXHRcdGlmIChfLmluY2x1ZGVzKGZpbGVBdHRyaWJ1dGVzLCBtb2RlbC5nZXQoXCJpZFwiKSkpIHtcblx0XHRcdHRoaXMudWlbbW9kZWwuZ2V0KFwiaWRcIildLmF0dHIoXCJzcmNcIiwgXCJcIik7XG5cdFx0XHR0aGlzLnVpW21vZGVsLmdldChcImlkXCIpXS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0fVxuXG5cdFx0aWYgKG1vZGVsLmdldChcImlkXCIpID09PSBcImhlYWRlckJhckNvbG9yXCIpIHtcblx0XHRcdHRoaXMudWlbbW9kZWwuZ2V0KFwiaWRcIildLmZpbmQoXCJzcGFuLnZhbFwiKS50ZXh0KFwiXCIpO1xuXHRcdFx0dGhpcy51aVttb2RlbC5nZXQoXCJpZFwiKV0uZmluZChcImRpdlwiKS5jc3MoXCJiYWNrZ3JvdW5kXCIsIFwibm9uZVwiKTtcblx0XHR9XG5cblx0XHR0aGlzLnVpW21vZGVsLmdldChcImlkXCIpXS5wYXJlbnQoKS5maW5kKFwiLmNsb3NlXCIpLmFkZENsYXNzKFwiaGlkZVwiKTtcblxuXHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5Ub2FzdCwgeyBjb250ZW50OiBcIkdyZXkgTGFiZWwgXCIgKyBtb2RlbC5nZXQoXCJpZFwiKSArIFwiIHN1Y2Nlc3NmdWxseSBkZWxldGVkXCIsIGljb246IFwiZmEtdHJhc2gtYWx0XCIsIGljb25Db2xvdXI6IFwicmVkXCIgfSk7XG5cdH0sXG5cblx0ZGVsZXRpb25FcnJvcjogZnVuY3Rpb24obW9kZWwsIHhocikge1xuXHRcdGNvbnN0IGFuc3dlciA9IEFwcC5wYXJzZVJlc3BvbnNlKHhocik7XG5cdFx0dGhpcy5kZWxNb2RhbC5zaG93RXJyb3IoXCJEZWxldGlvbiBmYWlsZWQ6IFwiICsgKGFuc3dlci5kZXRhaWwgfHwgYW5zd2VyLmluZm8pKTtcblx0fSxcblxuXHRlZGl0RmlsZTogZnVuY3Rpb24obW9kZWxBdHRyaWJ1dGUsIHR5cGUpIHtcblx0XHRjb25zdCBtb2RhbCA9IG5ldyBHcmV5TGFiZWxpbmdNb2RhbCh7XG5cdFx0XHRtb2RlbDogdGhpcy52YWx1ZU1vZGVsLFxuXHRcdFx0aW5wdXRUeXBlOiBcImZpbGVcIixcblx0XHRcdG1vZGVsQXR0cmlidXRlOiBtb2RlbEF0dHJpYnV0ZSxcblx0XHRcdHRpdGxlOiBcIlNlbGVjdCB0aGUgZmlsZSBmb3IgXCIgKyB0eXBlLFxuXHRcdFx0dHlwZTogdHlwZSxcblx0XHR9KTtcblxuXHRcdHRoaXMubGlzdGVuVG8obW9kYWwsIFwic2F2ZVwiLCBtb2RlbCA9PiB7XG5cdFx0XHR0aGlzLnZhbHVlTW9kZWwuc2V0KG1vZGVsQXR0cmlidXRlLCBtb2RlbC5nZXQobW9kZWxBdHRyaWJ1dGUpKTtcblxuXHRcdFx0dGhpcy5kYXRhQ2hhbmdlZCA9IHRydWU7XG5cdFx0XHR0aGlzLnJlbmRlcigpO1xuXG5cdFx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcobW9kYWwpO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5saXN0ZW5Ubyhtb2RhbCwgXCJjYW5jZWxcIiwgKCkgPT4ge1xuXHRcdFx0dGhpcy52YWx1ZU1vZGVsLnVuc2V0KG1vZGVsQXR0cmlidXRlKTtcblxuXHRcdFx0dGhpcy5zdG9wTGlzdGVuaW5nKG1vZGFsKTtcblx0XHR9KTtcblxuXHRcdG1vZGFsLnNob3coKTtcblx0fSxcblxuXHRlZGl0VmFsdWU6IGZ1bmN0aW9uKG1vZGVsQXR0cmlidXRlLCB0eXBlKSB7XG5cdFx0Y29uc3QgbW9kYWwgPSBuZXcgR3JleUxhYmVsaW5nTW9kYWwoe1xuXHRcdFx0bW9kZWw6IHRoaXMudmFsdWVNb2RlbCxcblx0XHRcdG1vZGVsQXR0cmlidXRlOiBtb2RlbEF0dHJpYnV0ZSxcblx0XHRcdGlucHV0VHlwZTogXCJ0ZXh0XCIsXG5cdFx0XHR0aXRsZTogXCJFbnRlciB0aGUgPGI+aGV4YWRlY2ltYWw8L2I+IHZhbHVlIGZvciBcIiArIHR5cGUsXG5cdFx0XHR0eXBlOiB0eXBlLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5saXN0ZW5Ubyhtb2RhbCwgXCJzYXZlXCIsIG1vZGVsID0+IHtcblx0XHRcdGxldCBncmV5TGFiZWwgPSB0aGlzLm1vZGVsLmdldChtb2RlbEF0dHJpYnV0ZSk7XG5cdFx0XHRncmV5TGFiZWwgPSBfLnRyaW0obW9kZWwuZ2V0KG1vZGVsQXR0cmlidXRlKSk7XG5cblx0XHRcdHRoaXMudmFsdWVNb2RlbC5zZXQobW9kZWxBdHRyaWJ1dGUsIGdyZXlMYWJlbCk7XG5cblx0XHRcdHRoaXMuZGF0YUNoYW5nZWQgPSB0cnVlO1xuXHRcdFx0dGhpcy5yZW5kZXIoKTtcblxuXHRcdFx0dGhpcy5zdG9wTGlzdGVuaW5nKG1vZGFsKTtcblx0XHR9KTtcblxuXHRcdHRoaXMubGlzdGVuVG8obW9kYWwsIFwiY2FuY2VsXCIsICgpID0+IHtcblx0XHRcdHRoaXMudmFsdWVNb2RlbC51bnNldChtb2RlbEF0dHJpYnV0ZSk7XG5cblx0XHRcdHRoaXMuc3RvcExpc3RlbmluZyhtb2RhbCk7XG5cdFx0fSk7XG5cblx0XHRtb2RhbC5zaG93KCk7XG5cdH0sXG5cblx0b25TYXZlU3VjY2VzczogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy52YWx1ZU1vZGVsLmNsZWFyKHsgc2lsZW50OiB0cnVlIH0pO1xuXHRcdHRoaXMuZGF0YUNoYW5nZWQgPSBmYWxzZTtcblxuXHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImVkaXRvcjpzYXZlZFwiKTtcblx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuVG9hc3QsIHsgY29udGVudDogXCJHcmV5IExhYmVsIHN1Y2Nlc3NmdWxseSBzYXZlZFwiLCBpY29uOiBcImZhLXNhdmVcIiwgaWNvbkNvbG91cjogXCJyZWRcIiB9KTtcblx0fSxcblxuXHRvblNhdmVFcnJvcjogZnVuY3Rpb24obW9kZWwsIHJlc3BvbnNlKSB7XG5cdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwiZWRpdG9yOnNhdmVkXCIsIHJlc3BvbnNlKTtcblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiZ3JleS1sYWJlbGluZy1sYXlvdXQgY29udGVudFwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL2dyZXlMYWJlbGluZy5udW5qXCIpLmxheW91dCxcblxuXHRyZWdpb25zOiB7XG5cdFx0ZWRpdG9yOiBcIi5lZGl0b3ItcmVnaW9uXCIsXG5cdFx0aGVhZGVyOiBcIi5oZWFkZXItcmVnaW9uXCIsXG5cdFx0c3RhdHVzOiBcIi5zdGF0dXMtcmVnaW9uXCIsXG5cdH0sXG5cblx0dWk6IHtcblx0XHRlZGl0b3JSZWdpb246IFwiLmVkaXRvci1yZWdpb25cIixcblx0XHRoZWFkZXJSZWdpb246IFwiLmhlYWRlci1yZWdpb25cIixcblx0XHRzdGF0dXNSZWdpb246IFwiLnN0YXR1cy1yZWdpb25cIixcblxuXHRcdHNhdmVTdWNjZXNzUmVzdWx0UGFuZWw6IFwiLmdyZXktbGFiZWxpbmctc3VjY2Vzcy1yZXN1bHQtcGFuZWxcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmV2ZW50QnVzID0gbmV3IEJhY2tib25lLk1hcmlvbmV0dGUuT2JqZWN0KCk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwiZWRpdG9yOmRhdGEtY2hhbmdlZFwiLCB0aGlzLm9uRWRpdG9yRGF0YUNoYW5nZWQuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmV2ZW50QnVzLCBcImVkaXRvcjpzYXZpbmdcIiwgdGhpcy5vbkVkaXRvclNhdmluZy5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZXZlbnRCdXMsIFwiZWRpdG9yOnNhdmVkXCIsIHRoaXMub25FZGl0b3JTYXZlZC5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5yZW5kZXJMb2FkaW5nU3RhdHVzKCk7XG5cblx0XHR0aGlzLmdyZXlMYWJlbGluZ01vZGVsID0gbmV3IEdyZXlMYWJlbGluZ3NNb2RlbCgpO1xuXHRcdHRoaXMuZ3JleUxhYmVsaW5nTW9kZWwuZmV0Y2goe1xuXHRcdFx0c3VjY2VzczogdGhpcy5vbkZldGNoU3VjY2Vzcy5iaW5kKHRoaXMpLFxuXHRcdFx0ZXJyb3I6IHRoaXMub25GZXRjaEVycm9yLmJpbmQodGhpcyksXG5cdFx0fSk7XG5cdH0sXG5cblx0b25GZXRjaFN1Y2Nlc3M6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMucmVuZGVyUGFnZSgpO1xuXHR9LFxuXG5cdG9uRmV0Y2hFcnJvcjogZnVuY3Rpb24obW9kZWwsIHJlc3BvbnNlKSB7XG5cdFx0dGhpcy5yZW5kZXJFcnJvcihyZXNwb25zZSk7XG5cdH0sXG5cblx0cmVuZGVyTG9hZGluZ1N0YXR1czogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5nZXRSZWdpb24oXCJzdGF0dXNcIikuZW1wdHkoKTtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJzdGF0dXNcIiwgbmV3IFN0YXR1c1ZpZXcoe1xuXHRcdFx0bWVzc2FnZTogXCJMb2FkaW5nLi4uXCIsXG5cdFx0XHR0eXBlOiBcImJ1c3lcIixcblx0XHR9KSk7XG5cdH0sXG5cblx0cmVuZGVyU2F2aW5nU3RhdHVzOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmdldFJlZ2lvbihcInN0YXR1c1wiKS5lbXB0eSgpO1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcInN0YXR1c1wiLCBuZXcgU3RhdHVzVmlldyh7XG5cdFx0XHRtZXNzYWdlOiBcIlNhdmluZy4uLlwiLFxuXHRcdFx0dHlwZTogXCJidXN5XCIsXG5cdFx0fSkpO1xuXHR9LFxuXG5cdHJlbmRlckVycm9yOiBmdW5jdGlvbihlcnJvcikge1xuXHRcdHRoaXMuZ2V0UmVnaW9uKFwic3RhdHVzXCIpLmVtcHR5KCk7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwic3RhdHVzXCIsIG5ldyBFcnJvclZpZXcoeyBmZXRjaEVycm9yOiBlcnJvciB9KSk7XG5cdH0sXG5cblx0cmVuZGVyUGFnZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5zdGF0dXNSZWdpb24uYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkuaGVhZGVyUmVnaW9uLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLmVkaXRvclJlZ2lvbi5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cblx0XHR0aGlzLmhlYWRlciA9IG5ldyBIZWFkZXIoeyBldmVudEJ1czogdGhpcy5ldmVudEJ1cyB9KTtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJoZWFkZXJcIiwgdGhpcy5oZWFkZXIpO1xuXHRcdHRoaXMuZWRpdG9yID0gbmV3IEVkaXRvcih7XG5cdFx0XHRldmVudEJ1czogdGhpcy5ldmVudEJ1cyxcblx0XHRcdG1vZGVsOiB0aGlzLmdyZXlMYWJlbGluZ01vZGVsLFxuXHRcdH0pO1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcImVkaXRvclwiLCB0aGlzLmVkaXRvcik7XG5cdH0sXG5cblx0b25FZGl0b3JEYXRhQ2hhbmdlZDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLnNhdmVTdWNjZXNzUmVzdWx0UGFuZWwuaGFzQ2xhc3MoXCJoaWRlXCIpKVxuXHRcdFx0dGhpcy5zYXZlU3VjY2Vzc1Jlc3VsdFBhbmVsLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRvbkVkaXRvclNhdmluZzogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5yZW5kZXJTYXZpbmdTdGF0dXMoKTtcblxuXHRcdHRoaXMudWkuc2F2ZVN1Y2Nlc3NSZXN1bHRQYW5lbC5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5lZGl0b3JSZWdpb24uYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkuc3RhdHVzUmVnaW9uLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRvbkVkaXRvclNhdmVkOiBmdW5jdGlvbihlcnJvclJlc3BvbnNlKSB7XG5cdFx0aWYgKGVycm9yUmVzcG9uc2UpIHtcblx0XHRcdHRoaXMucmVuZGVyRXJyb3IoZXJyb3JSZXNwb25zZSk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0dGhpcy51aS5zdGF0dXNSZWdpb24uYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0dGhpcy51aS5lZGl0b3JSZWdpb24ucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0dGhpcy51aS5zYXZlU3VjY2Vzc1Jlc3VsdFBhbmVsLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR9XG5cdH0sXG59KTtcbiJdfQ==",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar NProgress = require(\"nprogress\");\nvar ImageChooser = require(\"../../lib/imageChooser\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"content-import-modal\",\n\n\ttemplate: require(\"../templates/greyLabelingModal.nunj\").importModal,\n\n\tregions: {\n\t\tfileInput: \"div.image-file-chooser-region\"\n\t},\n\n\tui: {\n\t\tform: \"div.form\",\n\t\tsaveButton: \"button.save\",\n\t\tcancelButton: \"button.cancel\",\n\t\tmessage: \"span.message\",\n\t\tworkingSpinner: \"span.spinner-working\",\n\t\ttitle: \"span.title\",\n\n\t\tuploadForm: \".upload-form\",\n\t\tresult: \".result\",\n\n\t\tfileInput: \".image-file-chooser\",\n\t\theaderBarColor: \"input[name='headerBarColor']\"\n\t},\n\n\tevents: {\n\t\tclick: \"onClick\",\n\t\t\"click @ui.saveButton\": \"onSave\",\n\t\t\"click @ui.cancelButton\": \"onCancel\",\n\t\t\"change @ui.fileInput\": \"onFileChanged\"\n\t},\n\terrorMap: {\n\t\tfileInput: {\n\t\t\tposition: \"bottom\"\n\t\t},\n\t\theaderBarColor: {\n\t\t\tposition: \"bottom\"\n\t\t}\n\t},\n\tmodelEvents: {\n\t\t\"upload:progress\": \"onUploadProgress\",\n\t\tinvalid: \"validationFail\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.host = options.host || \"#modals\";\n\t\tthis.model = options.model;\n\t\tthis.inputType = options.inputType;\n\t\tthis.title = options.title;\n\t\tthis.modelAttribute = options.modelAttribute;\n\t\tthis.type = options.type;\n\t},\n\n\tshow: function show() {\n\t\t$(\".modal-container\", $(this.host)).append(this.render().el);\n\t\tvar imageSizes = void 0;\n\n\t\tswitch (this.type) {\n\t\t\tcase \"Drawer Top logo\":\n\t\t\t\timageSizes = {\n\t\t\t\t\tmaxHeight: 150,\n\t\t\t\t\tmaxWidth: 150\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\tcase \"Loading Image\":\n\t\t\t\timageSizes = {\n\t\t\t\t\tmaxHeight: 256,\n\t\t\t\t\tmaxWidth: 256\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\tcase \"Powered by logo\":\n\t\t\t\timageSizes = {\n\t\t\t\t\tmaxHeight: 150,\n\t\t\t\t\tmaxWidth: 300\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\timageSizes = {};\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.imageChooser = ImageChooser.create($(\".image-file-chooser\", this.el), _.merge(imageSizes, {\n\t\t\ttranscode: true,\n\t\t\ttypes: [\"image/bmp\", \"image/jpg\", \"image/jpeg\", \"image/png\", \"image/tiff\", \"image/webp\", \"image/raw\", \"image/tif\"]\n\t\t}));\n\t},\n\n\tonRender: function onRender() {\n\t\t// Render a background\n\t\t$(\".modal-element\", $(this.host)).removeClass(\"hide\");\n\t\t$(\"body\").addClass(\"hide-overflow\");\n\n\t\tif (this.inputType === \"text\") this.ui.headerBarColor.removeClass(\"hide\");else this.ui.fileInput.removeClass(\"hide\");\n\n\t\tthis.ui.title.html(this.title);\n\t},\n\n\tonDestroy: function onDestroy() {\n\t\t// Clean up the background\n\t\t$(\".modal-element\", $(this.host)).addClass(\"hide\");\n\t\t$(\"body\").removeClass(\"hide-overflow\");\n\t},\n\n\tbase64toFile: function base64toFile(base64, filename) {\n\t\tif (!base64) return [];\n\t\tvar arr = base64.split(\",\");\n\t\tvar mime = arr[0].match(/:(.*?);/)[1];\n\t\tvar bstr = window.atob(arr[1]);\n\n\t\tvar n = bstr.length;\n\t\tvar u8arr = new Uint8Array(n);\n\t\twhile (n--) {\n\t\t\tu8arr[n] = bstr.charCodeAt(n);\n\t\t} // eslint-disable-next-line no-undef\n\t\treturn new File([u8arr], filename, { type: mime });\n\t},\n\n\tgetFile: function getFile() {\n\t\treturn this.base64toFile(this.imageChooser.getImage(), _.replace(this.type, \" \", \"\") + \".png\");\n\t},\n\n\tonClick: function onClick(event) {\n\t\tevent.stopPropagation();\n\t},\n\n\tonFileChanged: function onFileChanged() {\n\t\tif (this.getFile()) {\n\t\t\tthis.ui.saveButton.prop(\"disabled\", false);\n\t\t\tthis.ui.saveButton.removeClass(\"disabled\");\n\t\t} else {\n\t\t\tthis.ui.saveButton.prop(\"disabled\", true);\n\t\t\tthis.ui.saveButton.addClass(\"disabled\");\n\t\t}\n\t},\n\n\tonSave: function onSave() {\n\t\t// Set the file\n\t\tif (this.inputType === \"text\") this.model.set(\"headerBarColor\", this.ui.headerBarColor.val());else this.model.set(this.modelAttribute, this.getFile());\n\t\tif (this.model.isValid()) {\n\t\t\t// Disable the modal buttons\n\t\t\tthis.setUIBusy();\n\n\t\t\t// Configure and start the progress bar\n\t\t\tNProgress.configure({\n\t\t\t\tparent: $(\".modal-footer\", this.$el).getPath(),\n\t\t\t\tshowSpinner: false,\n\t\t\t\ttrickle: true,\n\t\t\t\tminimum: 0.0\n\t\t\t}).start(0.0);\n\n\t\t\t// Save the model, uploading the file\n\t\t\tthis.xhr = this.model.binarySave(null, {\n\t\t\t\tdata: this.model.attributes,\n\t\t\t\tvalidate: false,\n\t\t\t\twait: true,\n\t\t\t\tsuccess: this.onSaveSuccess.bind(this),\n\t\t\t\terror: this.onSaveError.bind(this)\n\t\t\t});\n\t\t}\n\t},\n\n\tonSaveSuccess: function onSaveSuccess(result) {\n\t\tthis.xhr = null;\n\n\t\tNProgress.set(1.0);\n\t\tthis.setUIReady();\n\n\t\tthis.destroy();\n\t\tthis.trigger(\"save\", result);\n\t},\n\n\tonSaveError: function onSaveError(model, response) {\n\t\tthis.xhr = null;\n\n\t\tNProgress.set(1.0);\n\t\tthis.setUIReady();\n\n\t\tvar answer = {};\n\n\t\ttry {\n\t\t\tanswer = JSON.parse(response.responseText);\n\t\t} catch (error) {\n\t\t\tanswer.detail = (response.status === 0 ? \"Connection error\" : response.statusText) + \" (code \" + response.status + \")\";\n\t\t}\n\n\t\tthis.ui.message.text(\"Error importing user content: \" + answer.detail || answer.info).removeClass(\"hide\");\n\t},\n\n\tonCancel: function onCancel() {\n\t\tif (this.xhr) this.xhr.abort();\n\n\t\tthis.destroy();\n\t\tthis.trigger(\"cancel\");\n\t},\n\n\tsetUIBusy: function setUIBusy() {\n\t\tthis.ui.saveButton.addClass(\"disabled\");\n\t\tthis.ui.workingSpinner.removeClass(\"hide\");\n\n\t\tthis.ui.message.addClass(\"hide\");\n\t},\n\n\tsetUIReady: function setUIReady() {\n\t\tthis.ui.saveButton.removeClass(\"disabled\");\n\t\tthis.ui.workingSpinner.addClass(\"hide\");\n\t},\n\n\tonUploadProgress: function onUploadProgress(percentage) {\n\t\tNProgress.set(percentage / 100);\n\t},\n\n\tvalidationFail: function validationFail() {\n\t\tvar _this = this;\n\n\t\tthis.clearError();\n\t\tthis.setUIReady();\n\t\t_.forOwn(this.model.validationError, function (message) {\n\t\t\t_this.displayError(message, _this.ui.result);\n\t\t});\n\t},\n\n\tdisplayError: function displayError(message, element) {\n\t\telement.append(\"<span class='error'>\" + message + \"</span>\");\n\t\tthis.ui.fileInput.on(\"change\", this.clearError.bind(this));\n\t\tthis.ui.headerBarColor.on(\"change keyup\", this.clearError.bind(this));\n\t},\n\n\tclearError: function clearError() {\n\t\tthis.ui.result.find(\".error\").remove();\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImdyZXlMYWJlbGluZ01vZGFsLmpzIl0sIm5hbWVzIjpbIiQiLCJyZXF1aXJlIiwiXyIsIkJhY2tib25lIiwiTlByb2dyZXNzIiwiSW1hZ2VDaG9vc2VyIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiZXh0ZW5kIiwiY2xhc3NOYW1lIiwidGVtcGxhdGUiLCJpbXBvcnRNb2RhbCIsInJlZ2lvbnMiLCJmaWxlSW5wdXQiLCJ1aSIsImZvcm0iLCJzYXZlQnV0dG9uIiwiY2FuY2VsQnV0dG9uIiwibWVzc2FnZSIsIndvcmtpbmdTcGlubmVyIiwidGl0bGUiLCJ1cGxvYWRGb3JtIiwicmVzdWx0IiwiaGVhZGVyQmFyQ29sb3IiLCJldmVudHMiLCJjbGljayIsImVycm9yTWFwIiwicG9zaXRpb24iLCJtb2RlbEV2ZW50cyIsImludmFsaWQiLCJpbml0aWFsaXplIiwib3B0aW9ucyIsImhvc3QiLCJtb2RlbCIsImlucHV0VHlwZSIsIm1vZGVsQXR0cmlidXRlIiwidHlwZSIsInNob3ciLCJhcHBlbmQiLCJyZW5kZXIiLCJlbCIsImltYWdlU2l6ZXMiLCJtYXhIZWlnaHQiLCJtYXhXaWR0aCIsImltYWdlQ2hvb3NlciIsImNyZWF0ZSIsIm1lcmdlIiwidHJhbnNjb2RlIiwidHlwZXMiLCJvblJlbmRlciIsInJlbW92ZUNsYXNzIiwiYWRkQ2xhc3MiLCJodG1sIiwib25EZXN0cm95IiwiYmFzZTY0dG9GaWxlIiwiYmFzZTY0IiwiZmlsZW5hbWUiLCJhcnIiLCJzcGxpdCIsIm1pbWUiLCJtYXRjaCIsImJzdHIiLCJ3aW5kb3ciLCJhdG9iIiwibiIsImxlbmd0aCIsInU4YXJyIiwiVWludDhBcnJheSIsImNoYXJDb2RlQXQiLCJGaWxlIiwiZ2V0RmlsZSIsImdldEltYWdlIiwicmVwbGFjZSIsIm9uQ2xpY2siLCJldmVudCIsInN0b3BQcm9wYWdhdGlvbiIsIm9uRmlsZUNoYW5nZWQiLCJwcm9wIiwib25TYXZlIiwic2V0IiwidmFsIiwiaXNWYWxpZCIsInNldFVJQnVzeSIsImNvbmZpZ3VyZSIsInBhcmVudCIsIiRlbCIsImdldFBhdGgiLCJzaG93U3Bpbm5lciIsInRyaWNrbGUiLCJtaW5pbXVtIiwic3RhcnQiLCJ4aHIiLCJiaW5hcnlTYXZlIiwiZGF0YSIsImF0dHJpYnV0ZXMiLCJ2YWxpZGF0ZSIsIndhaXQiLCJzdWNjZXNzIiwib25TYXZlU3VjY2VzcyIsImJpbmQiLCJlcnJvciIsIm9uU2F2ZUVycm9yIiwic2V0VUlSZWFkeSIsImRlc3Ryb3kiLCJ0cmlnZ2VyIiwicmVzcG9uc2UiLCJhbnN3ZXIiLCJKU09OIiwicGFyc2UiLCJyZXNwb25zZVRleHQiLCJkZXRhaWwiLCJzdGF0dXMiLCJzdGF0dXNUZXh0IiwidGV4dCIsImluZm8iLCJvbkNhbmNlbCIsImFib3J0Iiwib25VcGxvYWRQcm9ncmVzcyIsInBlcmNlbnRhZ2UiLCJ2YWxpZGF0aW9uRmFpbCIsImNsZWFyRXJyb3IiLCJmb3JPd24iLCJ2YWxpZGF0aW9uRXJyb3IiLCJkaXNwbGF5RXJyb3IiLCJlbGVtZW50Iiwib24iLCJmaW5kIiwicmVtb3ZlIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLElBQUlELFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUUsV0FBV0YsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUcsWUFBWUgsUUFBUSxXQUFSLENBQWxCO0FBQ0EsSUFBTUksZUFBZUosUUFBUSx3QkFBUixDQUFyQjs7QUFFQUssT0FBT0MsT0FBUCxHQUFpQkosU0FBU0ssVUFBVCxDQUFvQkMsSUFBcEIsQ0FBeUJDLE1BQXpCLENBQWdDO0FBQ2hEQyxZQUFXLHNCQURxQzs7QUFHaERDLFdBQVVYLFFBQVEscUNBQVIsRUFBK0NZLFdBSFQ7O0FBS2hEQyxVQUFTO0FBQ1JDLGFBQVc7QUFESCxFQUx1Qzs7QUFTaERDLEtBQUk7QUFDSEMsUUFBTSxVQURIO0FBRUhDLGNBQVksYUFGVDtBQUdIQyxnQkFBYyxlQUhYO0FBSUhD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d0csSUFBZixDQUFvQixRQUFwQixFQUE4QkMsTUFBOUI7QUFDQTtBQTVPK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoiZ3JleUxhYmVsaW5nTW9kYWwuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IE5Qcm9ncmVzcyA9IHJlcXVpcmUoXCJucHJvZ3Jlc3NcIik7XG5jb25zdCBJbWFnZUNob29zZXIgPSByZXF1aXJlKFwiLi4vLi4vbGliL2ltYWdlQ2hvb3NlclwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImNvbnRlbnQtaW1wb3J0LW1vZGFsXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvZ3JleUxhYmVsaW5nTW9kYWwubnVualwiKS5pbXBvcnRNb2RhbCxcblxuXHRyZWdpb25zOiB7XG5cdFx0ZmlsZUlucHV0OiBcImRpdi5pbWFnZS1maWxlLWNob29zZXItcmVnaW9uXCIsXG5cdH0sXG5cblx0dWk6IHtcblx0XHRmb3JtOiBcImRpdi5mb3JtXCIsXG5cdFx0c2F2ZUJ1dHRvbjogXCJidXR0b24uc2F2ZVwiLFxuXHRcdGNhbmNlbEJ1dHRvbjogXCJidXR0b24uY2FuY2VsXCIsXG5cdFx0bWVzc2FnZTogXCJzcGFuLm1lc3NhZ2VcIixcblx0XHR3b3JraW5nU3Bpbm5lcjogXCJzcGFuLnNwaW5uZXItd29ya2luZ1wiLFxuXHRcdHRpdGxlOiBcInNwYW4udGl0bGVcIixcblxuXHRcdHVwbG9hZEZvcm06IFwiLnVwbG9hZC1mb3JtXCIsXG5cdFx0cmVzdWx0OiBcIi5yZXN1bHRcIixcblxuXHRcdGZpbGVJbnB1dDogXCIuaW1hZ2UtZmlsZS1jaG9vc2VyXCIsXG5cdFx0aGVhZGVyQmFyQ29sb3I6IFwiaW5wdXRbbmFtZT0naGVhZGVyQmFyQ29sb3InXVwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdGNsaWNrOiBcIm9uQ2xpY2tcIixcblx0XHRcImNsaWNrIEB1aS5zYXZlQnV0dG9uXCI6IFwib25TYXZlXCIsXG5cdFx0XCJjbGljayBAdWkuY2FuY2VsQnV0dG9uXCI6IFwib25DYW5jZWxcIixcblx0XHRcImNoYW5nZSBAdWkuZmlsZUlucHV0XCI6IFwib25GaWxlQ2hhbmdlZFwiLFxuXHR9LFxuXHRlcnJvck1hcDoge1xuXHRcdGZpbGVJbnB1dDoge1xuXHRcdFx0cG9zaXRpb246IFwiYm90dG9tXCIsXG5cdFx0fSxcblx0XHRoZWFkZXJCYXJDb2xvcjoge1xuXHRcdFx0cG9zaXRpb246IFwiYm90dG9tXCIsXG5cdFx0fSxcblx0fSxcblx0bW9kZWxFdmVudHM6IHtcblx0XHRcInVwbG9hZDpwcm9ncmVzc1wiOiBcIm9uVXBsb2FkUHJvZ3Jlc3NcIixcblx0XHRpbnZhbGlkOiBcInZhbGlkYXRpb25GYWlsXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuaG9zdCA9IG9wdGlvbnMuaG9zdCB8fCBcIiNtb2RhbHNcIjtcblx0XHR0aGlzLm1vZGVsID0gb3B0aW9ucy5tb2RlbDtcblx0XHR0aGlzLmlucHV0VHlwZSA9IG9wdGlvbnMuaW5wdXRUeXBlO1xuXHRcdHRoaXMudGl0bGUgPSBvcHRpb25zLnRpdGxlO1xuXHRcdHRoaXMubW9kZWxBdHRyaWJ1dGUgPSBvcHRpb25zLm1vZGVsQXR0cmlidXRlO1xuXHRcdHRoaXMudHlwZSA9IG9wdGlvbnMudHlwZTtcblx0fSxcblxuXHRzaG93OiBmdW5jdGlvbigpIHtcblx0XHQkKFwiLm1vZGFsLWNvbnRhaW5lclwiLCAkKHRoaXMuaG9zdCkpLmFwcGVuZCh0aGlzLnJlbmRlcigpLmVsKTtcblx0XHRsZXQgaW1hZ2VTaXplcztcblxuXHRcdHN3aXRjaCAodGhpcy50eXBlKSB7XG5cdFx0XHRjYXNlIFwiRHJhd2VyIFRvcCBsb2dvXCI6XG5cdFx0XHRcdGltYWdlU2l6ZXMgPSB7XG5cdFx0XHRcdFx0bWF4SGVpZ2h0OiAxNTAsXG5cdFx0XHRcdFx0bWF4V2lkdGg6IDE1MCxcblx0XHRcdFx0fTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIFwiTG9hZGluZyBJbWFnZVwiOlxuXHRcdFx0XHRpbWFnZVNpemVzID0ge1xuXHRcdFx0XHRcdG1heEhlaWdodDogMjU2LFxuXHRcdFx0XHRcdG1heFdpZHRoOiAyNTYsXG5cdFx0XHRcdH07XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBcIlBvd2VyZWQgYnkgbG9nb1wiOlxuXHRcdFx0XHRpbWFnZVNpemVzID0ge1xuXHRcdFx0XHRcdG1heEhlaWdodDogMTUwLFxuXHRcdFx0XHRcdG1heFdpZHRoOiAzMDAsXG5cdFx0XHRcdH07XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0aW1hZ2VTaXplcyA9IHt9O1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHR0aGlzLmltYWdlQ2hvb3NlciA9IEltYWdlQ2hvb3Nlci5jcmVhdGUoJChcIi5pbWFnZS1maWxlLWNob29zZXJcIiwgdGhpcy5lbCksIF8ubWVyZ2UoaW1hZ2VTaXplcywge1xuXHRcdFx0dHJhbnNjb2RlOiB0cnVlLFxuXHRcdFx0dHlwZXM6IFtcImltYWdlL2JtcFwiLCBcImltYWdlL2pwZ1wiLCBcImltYWdlL2pwZWdcIiwgXCJpbWFnZS9wbmdcIiwgXCJpbWFnZS90aWZmXCIsIFwiaW1hZ2Uvd2VicFwiLCBcImltYWdlL3Jhd1wiLCBcImltYWdlL3RpZlwiXSxcblx0XHR9KSk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIFJlbmRlciBhIGJhY2tncm91bmRcblx0XHQkKFwiLm1vZGFsLWVsZW1lbnRcIiwgJCh0aGlzLmhvc3QpKS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0JChcImJvZHlcIikuYWRkQ2xhc3MoXCJoaWRlLW92ZXJmbG93XCIpO1xuXG5cdFx0aWYgKHRoaXMuaW5wdXRUeXBlID09PSBcInRleHRcIilcblx0XHRcdHRoaXMudWkuaGVhZGVyQmFyQ29sb3IucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMudWkuZmlsZUlucHV0LnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblxuXHRcdHRoaXMudWkudGl0bGUuaHRtbCh0aGlzLnRpdGxlKTtcblx0fSxcblxuXHRvbkRlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIENsZWFuIHVwIHRoZSBiYWNrZ3JvdW5kXG5cdFx0JChcIi5tb2RhbC1lbGVtZW50XCIsICQodGhpcy5ob3N0KSkuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdCQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKFwiaGlkZS1vdmVyZmxvd1wiKTtcblx0fSxcblxuXHRiYXNlNjR0b0ZpbGU6IGZ1bmN0aW9uKGJhc2U2NCwgZmlsZW5hbWUpIHtcblx0XHRpZiAoIWJhc2U2NClcblx0XHRcdHJldHVybiBbXTtcblx0XHRjb25zdCBhcnIgPSBiYXNlNjQuc3BsaXQoXCIsXCIpO1xuXHRcdGNvbnN0IG1pbWUgPSBhcnJbMF0ubWF0Y2goLzooLio/KTsvKVsxXTtcblx0XHRjb25zdCBic3RyID0gd2luZG93LmF0b2IoYXJyWzFdKTtcblxuXHRcdGxldCBuID0gYnN0ci5sZW5ndGg7XG5cdFx0Y29uc3QgdThhcnIgPSBuZXcgVWludDhBcnJheShuKTtcblx0XHR3aGlsZShuLS0pXG5cdFx0XHR1OGFycltuXSA9IGJzdHIuY2hhckNvZGVBdChuKTtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcblx0XHRyZXR1cm4gbmV3IEZpbGUoW3U4YXJyXSwgZmlsZW5hbWUsIHsgdHlwZTogbWltZSB9KTtcblx0fSxcblxuXHRnZXRGaWxlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5iYXNlNjR0b0ZpbGUodGhpcy5pbWFnZUNob29zZXIuZ2V0SW1hZ2UoKSwgXy5yZXBsYWNlKHRoaXMudHlwZSwgXCIgXCIsIFwiXCIpICsgXCIucG5nXCIpO1xuXHR9LFxuXG5cdG9uQ2xpY2s6IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH0sXG5cblx0b25GaWxlQ2hhbmdlZDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuZ2V0RmlsZSgpKSB7XG5cdFx0XHR0aGlzLnVpLnNhdmVCdXR0b24ucHJvcChcImRpc2FibGVkXCIsIGZhbHNlKTtcblx0XHRcdHRoaXMudWkuc2F2ZUJ1dHRvbi5yZW1vdmVDbGFzcyhcImRpc2FibGVkXCIpO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMudWkuc2F2ZUJ1dHRvbi5wcm9wKFwiZGlzYWJsZWRcIiwgdHJ1ZSk7XG5cdFx0XHR0aGlzLnVpLnNhdmVCdXR0b24uYWRkQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblx0XHR9XG5cdH0sXG5cblx0b25TYXZlOiBmdW5jdGlvbigpIHtcblx0XHQvLyBTZXQgdGhlIGZpbGVcblx0XHRpZiAodGhpcy5pbnB1dFR5cGUgPT09IFwidGV4dFwiKVxuXHRcdFx0dGhpcy5tb2RlbC5zZXQoXCJoZWFkZXJCYXJDb2xvclwiLCB0aGlzLnVpLmhlYWRlckJhckNvbG9yLnZhbCgpKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLm1vZGVsLnNldCh0aGlzLm1vZGVsQXR0cmlidXRlLCB0aGlzLmdldEZpbGUoKSk7XG5cdFx0aWYgKHRoaXMubW9kZWwuaXNWYWxpZCgpKSB7XG5cdFx0XHQvLyBEaXNhYmxlIHRoZSBtb2RhbCBidXR0b25zXG5cdFx0XHR0aGlzLnNldFVJQnVzeSgpO1xuXG5cdFx0XHQvLyBDb25maWd1cmUgYW5kIHN0YXJ0IHRoZSBwcm9ncmVzcyBiYXJcblx0XHRcdE5Qcm9ncmVzcy5jb25maWd1cmUoe1xuXHRcdFx0XHRwYXJlbnQ6ICQoXCIubW9kYWwtZm9vdGVyXCIsIHRoaXMuJGVsKS5nZXRQYXRoKCksXG5cdFx0XHRcdHNob3dTcGlubmVyOiBmYWxzZSxcblx0XHRcdFx0dHJpY2tsZTogdHJ1ZSxcblx0XHRcdFx0bWluaW11bTogMC4wLFxuXHRcdFx0fSkuc3RhcnQoMC4wKTtcblxuXHRcdFx0Ly8gU2F2ZSB0aGUgbW9kZWwsIHVwbG9hZGluZyB0aGUgZmlsZVxuXHRcdFx0dGhpcy54aHIgPSB0aGlzLm1vZGVsLmJpbmFyeVNhdmUobnVsbCwge1xuXHRcdFx0XHRkYXRhOiB0aGlzLm1vZGVsLmF0dHJpYnV0ZXMsXG5cdFx0XHRcdHZhbGlkYXRlOiBmYWxzZSxcblx0XHRcdFx0d2FpdDogdHJ1ZSxcblx0XHRcdFx0c3VjY2VzczogdGhpcy5vblNhdmVTdWNjZXNzLmJpbmQodGhpcyksXG5cdFx0XHRcdGVycm9yOiB0aGlzLm9uU2F2ZUVycm9yLmJpbmQodGhpcyksXG5cdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0b25TYXZlU3VjY2VzczogZnVuY3Rpb24ocmVzdWx0KSB7XG5cdFx0dGhpcy54aHIgPSBudWxsO1xuXG5cdFx0TlByb2dyZXNzLnNldCgxLjApO1xuXHRcdHRoaXMuc2V0VUlSZWFkeSgpO1xuXG5cdFx0dGhpcy5kZXN0cm95KCk7XG5cdFx0dGhpcy50cmlnZ2VyKFwic2F2ZVwiLCByZXN1bHQpO1xuXHR9LFxuXG5cdG9uU2F2ZUVycm9yOiBmdW5jdGlvbihtb2RlbCwgcmVzcG9uc2UpIHtcblx0XHR0aGlzLnhociA9IG51bGw7XG5cblx0XHROUHJvZ3Jlc3Muc2V0KDEuMCk7XG5cdFx0dGhpcy5zZXRVSVJlYWR5KCk7XG5cblx0XHRsZXQgYW5zd2VyID0ge307XG5cblx0XHR0cnkge1xuXHRcdFx0YW5zd2VyID0gSlNPTi5wYXJzZShyZXNwb25zZS5yZXNwb25zZVRleHQpO1xuXHRcdH1cblx0XHRjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGFuc3dlci5kZXRhaWwgPSAocmVzcG9uc2Uuc3RhdHVzID09PSAwID8gXCJDb25uZWN0aW9uIGVycm9yXCIgOiByZXNwb25zZS5zdGF0dXNUZXh0KSArIFwiIChjb2RlIFwiICsgcmVzcG9uc2Uuc3RhdHVzICsgXCIpXCI7XG5cdFx0fVxuXG5cdFx0dGhpcy51aS5tZXNzYWdlLnRleHQoXCJFcnJvciBpbXBvcnRpbmcgdXNlciBjb250ZW50OiBcIiArIGFuc3dlci5kZXRhaWwgfHwgYW5zd2VyLmluZm8pLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRvbkNhbmNlbDogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMueGhyKVxuXHRcdFx0dGhpcy54aHIuYWJvcnQoKTtcblxuXHRcdHRoaXMuZGVzdHJveSgpO1xuXHRcdHRoaXMudHJpZ2dlcihcImNhbmNlbFwiKTtcblx0fSxcblxuXHRzZXRVSUJ1c3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkuc2F2ZUJ1dHRvbi5hZGRDbGFzcyhcImRpc2FibGVkXCIpO1xuXHRcdHRoaXMudWkud29ya2luZ1NwaW5uZXIucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0dGhpcy51aS5tZXNzYWdlLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRzZXRVSVJlYWR5OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLnNhdmVCdXR0b24ucmVtb3ZlQ2xhc3MoXCJkaXNhYmxlZFwiKTtcblx0XHR0aGlzLnVpLndvcmtpbmdTcGlubmVyLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRvblVwbG9hZFByb2dyZXNzOiBmdW5jdGlvbihwZXJjZW50YWdlKSB7XG5cdFx0TlByb2dyZXNzLnNldChwZXJjZW50YWdlIC8gMTAwKTtcblx0fSxcblxuXHR2YWxpZGF0aW9uRmFpbDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jbGVhckVycm9yKCk7XG5cdFx0dGhpcy5zZXRVSVJlYWR5KCk7XG5cdFx0Xy5mb3JPd24odGhpcy5tb2RlbC52YWxpZGF0aW9uRXJyb3IsIG1lc3NhZ2UgPT4ge1xuXHRcdFx0dGhpcy5kaXNwbGF5RXJyb3IobWVzc2FnZSwgdGhpcy51aS5yZXN1bHQpO1xuXHRcdH0pO1xuXHR9LFxuXG5cdGRpc3BsYXlFcnJvcjogZnVuY3Rpb24obWVzc2FnZSwgZWxlbWVudCkge1xuXHRcdGVsZW1lbnQuYXBwZW5kKFwiPHNwYW4gY2xhc3M9J2Vycm9yJz5cIiArIG1lc3NhZ2UgKyBcIjwvc3Bhbj5cIik7XG5cdFx0dGhpcy51aS5maWxlSW5wdXQub24oXCJjaGFuZ2VcIiwgdGhpcy5jbGVhckVycm9yLmJpbmQodGhpcykpO1xuXHRcdHRoaXMudWkuaGVhZGVyQmFyQ29sb3Iub24oXCJjaGFuZ2Uga2V5dXBcIiwgdGhpcy5jbGVhckVycm9yLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdGNsZWFyRXJyb3I6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkucmVzdWx0LmZpbmQoXCIuZXJyb3JcIikucmVtb3ZlKCk7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\n\nvar settings = require(\"app-settings\");\n\nmodule.exports = Backbone.Model.extend({\n\tdefaults: {},\n\tidAttribute: \"id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/features/greyLabeling\";\n\t},\n\n\tupload: function upload(_attrs, _options) {\n\t\tvar options = _options;\n\t\tvar attrs = _attrs;\n\n\t\tif (_options === null) {\n\t\t\toptions = _attrs;\n\t\t\tattrs = null;\n\t\t}\n\n\t\treturn this.binarySave(attrs, _.extend({ wait: true }, options));\n\t},\n\n\tvalidate: function validate(attributes) {\n\t\tvar errors = {};\n\t\tvar validExtensions = [\"png\", \"jpg\", \"jpeg\"];\n\n\t\tif (!attributes.drawerTop && !attributes.loadingImage && !attributes.poweredBy && !attributes.headerBarColor) errors.value = \"A file or value is required.\";else if (attributes.drawerTop && !_.isString(attributes.drawerTop)) _.extend(errors, this.validateFile(attributes.drawerTop.name, validExtensions, \"drawerTop\"));else if (attributes.loadingImage && !_.isString(attributes.loadingImage)) _.extend(errors, this.validateFile(attributes.loadingImage.name, validExtensions, \"loadingImage\"));else if (attributes.poweredBy && !_.isString(attributes.poweredBy)) _.extend(errors, this.validateFile(attributes.poweredBy.name, validExtensions, \"poweredBy\"));else if (attributes.headerBarColor) _.extend(errors, this.validateColor(attributes.headerBarColor, \"headerBarColor\"));\n\n\t\tif (_.keys(errors).length > 0) return errors;\n\t},\n\n\tvalidateFile: function validateFile(fileName, validExtensions, errorKey) {\n\t\tvar errors = {};\n\n\t\tvar acceptedExtensions = _.flatten([validExtensions]);\n\t\tvar extension = fileName.toLowerCase().split(\".\");\n\t\textension = extension[extension.length - 1];\n\n\t\tif (!_.some(acceptedExtensions, function (x) {\n\t\t\treturn x === extension;\n\t\t})) errors[errorKey] = \"The selected file must have one of these extensions: \" + acceptedExtensions.join(\", \");\n\n\t\treturn errors;\n\t},\n\n\tvalidateColor: function validateColor(color, errorKey) {\n\t\t/*\n  \t^ match beginning\n  \t# a hash\n  \t[a-f0-9] any letter from a-f and 0-9\n  \t{6} or {3} the previous group appears exactly 3 or 6 times\n  \t$ match end\n  \ti ignore case\n  */\n\t\tvar errors = {};\n\t\tvar isOk = /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(color);\n\t\tif (!isOk) errors[errorKey] = \"The color specified must be a valid hexadecimal.\";\n\n\t\treturn errors;\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImdyZXlMYWJlbGluZ01vZGVsLmpzIl0sIm5hbWVzIjpbIl8iLCJyZXF1aXJlIiwiQmFja2JvbmUiLCJzZXR0aW5ncyIsIm1vZHVsZSIsImV4cG9ydHMiLCJNb2RlbCIsImV4dGVuZCIsImRlZmF1bHRzIiwiaWRBdHRyaWJ1dGUiLCJ1cmxSb290IiwidXBsb2FkIiwiX2F0dHJzIiwiX29wdGlvbnMiLCJvcHRpb25zIiwiYXR0cnMiLCJiaW5hcnlTYXZlIiwid2FpdCIsInZhbGlkYXRlIiwiYXR0cmlidXRlcyIsImVycm9ycyIsInZhbGlkRXh0ZW5zaW9ucyIsImRyYXdlclRvcCIsImxvYWRpbmdJbWFnZSIsInBvd2VyZWRCeSIsImhlYWRlckJhckNvbG9yIiwidmFsdWUiLCJpc1N0cmluZyIsInZhbGlkYXRlRmlsZSIsIm5hbWUiLCJ2YWxpZGF0ZUNvbG9yIiwia2V5cyIsImxlbmd0aCIsImZpbGVOYW1lIiwiZXJyb3JLZXkiLCJhY2NlcHRlZEV4dGVuc2lvbnMiLCJmbGF0dGVuIiwiZXh0ZW5zaW9uIiwidG9Mb3dlckNhc2UiLCJzcGxpdCIsInNvbWUiLCJ4Iiwiam9pbiIsImNvbG9yIiwiaXNPayIsInRlc3QiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsV0FBV0QsUUFBUSxVQUFSLENBQWpCOztBQUVBLElBQU1FLFdBQVdGLFFBQVEsY0FBUixDQUFqQjs7QUFFQUcsT0FBT0MsT0FBUCxHQUFpQkgsU0FBU0ksS0FBVCxDQUFlQyxNQUFmLENBQXNCO0FBQ3RDQyxXQUFVLEVBRDRCO0FBRXRDQyxjQUFhLElBRnlCOztBQUl0Q0MsVUFBUyxtQkFBVztBQUNuQixTQUFPUCxTQUFTTyxPQUFULEdBQW1CLGdDQUExQjtBQUNBLEVBTnFDOztBQVF0Q0MsU0FBUSxnQkFBU0MsTUFBVCxFQUFpQkMsUUFBakIsRUFBMkI7QUFDbEMsTUFBSUMsVUFBVUQsUUFBZDtBQUNBLE1BQUlFLFFBQVFILE1BQVo7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Q0E7QUFuRXFDLENBQXRCLENBQWpCIiwiZmlsZSI6ImdyZXlMYWJlbGluZ01vZGVsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHt9LFxuXHRpZEF0dHJpYnV0ZTogXCJpZFwiLFxuXG5cdHVybFJvb3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9mZWF0dXJlcy9ncmV5TGFiZWxpbmdcIjtcblx0fSxcblxuXHR1cGxvYWQ6IGZ1bmN0aW9uKF9hdHRycywgX29wdGlvbnMpIHtcblx0XHRsZXQgb3B0aW9ucyA9IF9vcHRpb25zO1xuXHRcdGxldCBhdHRycyA9IF9hdHRycztcblxuXHRcdGlmIChfb3B0aW9ucyA9PT0gbnVsbCkge1xuXHRcdFx0b3B0aW9ucyA9IF9hdHRycztcblx0XHRcdGF0dHJzID0gbnVsbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5iaW5hcnlTYXZlKGF0dHJzLCBfLmV4dGVuZCh7IHdhaXQ6IHRydWUgfSwgb3B0aW9ucykpO1xuXHR9LFxuXG5cdHZhbGlkYXRlOiBmdW5jdGlvbihhdHRyaWJ1dGVzKSB7XG5cdFx0Y29uc3QgZXJyb3JzID0ge307XG5cdFx0Y29uc3QgdmFsaWRFeHRlbnNpb25zID0gW1wicG5nXCIsIFwianBnXCIsIFwianBlZ1wiXTtcblxuXHRcdGlmICghYXR0cmlidXRlcy5kcmF3ZXJUb3AgJiYgIWF0dHJpYnV0ZXMubG9hZGluZ0ltYWdlICYmICFhdHRyaWJ1dGVzLnBvd2VyZWRCeSAmJiAhYXR0cmlidXRlcy5oZWFkZXJCYXJDb2xvcilcblx0XHRcdGVycm9ycy52YWx1ZSA9IFwiQSBmaWxlIG9yIHZhbHVlIGlzIHJlcXVpcmVkLlwiO1xuXHRcdGVsc2UgaWYgKGF0dHJpYnV0ZXMuZHJhd2VyVG9wICYmICFfLmlzU3RyaW5nKGF0dHJpYnV0ZXMuZHJhd2VyVG9wKSlcblx0XHRcdF8uZXh0ZW5kKGVycm9ycywgdGhpcy52YWxpZGF0ZUZpbGUoYXR0cmlidXRlcy5kcmF3ZXJUb3AubmFtZSwgdmFsaWRFeHRlbnNpb25zLCBcImRyYXdlclRvcFwiKSk7XG5cdFx0ZWxzZSBpZiAoYXR0cmlidXRlcy5sb2FkaW5nSW1hZ2UgJiYgIV8uaXNTdHJpbmcoYXR0cmlidXRlcy5sb2FkaW5nSW1hZ2UpKVxuXHRcdFx0Xy5leHRlbmQoZXJyb3JzLCB0aGlzLnZhbGlkYXRlRmlsZShhdHRyaWJ1dGVzLmxvYWRpbmdJbWFnZS5uYW1lLCB2YWxpZEV4dGVuc2lvbnMsIFwibG9hZGluZ0ltYWdlXCIpKTtcblx0XHRlbHNlIGlmIChhdHRyaWJ1dGVzLnBvd2VyZWRCeSAmJiAhXy5pc1N0cmluZyhhdHRyaWJ1dGVzLnBvd2VyZWRCeSkpXG5cdFx0XHRfLmV4dGVuZChlcnJvcnMsIHRoaXMudmFsaWRhdGVGaWxlKGF0dHJpYnV0ZXMucG93ZXJlZEJ5Lm5hbWUsIHZhbGlkRXh0ZW5zaW9ucywgXCJwb3dlcmVkQnlcIikpO1xuXHRcdGVsc2UgaWYgKGF0dHJpYnV0ZXMuaGVhZGVyQmFyQ29sb3IpXG5cdFx0XHRfLmV4dGVuZChlcnJvcnMsIHRoaXMudmFsaWRhdGVDb2xvcihhdHRyaWJ1dGVzLmhlYWRlckJhckNvbG9yLCBcImhlYWRlckJhckNvbG9yXCIpKTtcblxuXHRcdGlmIChfLmtleXMoZXJyb3JzKS5sZW5ndGggPiAwKVxuXHRcdFx0cmV0dXJuIGVycm9ycztcblx0fSxcblxuXHR2YWxpZGF0ZUZpbGU6IGZ1bmN0aW9uKGZpbGVOYW1lLCB2YWxpZEV4dGVuc2lvbnMsIGVycm9yS2V5KSB7XG5cdFx0Y29uc3QgZXJyb3JzID0ge307XG5cblx0XHRjb25zdCBhY2NlcHRlZEV4dGVuc2lvbnMgPSBfLmZsYXR0ZW4oW3ZhbGlkRXh0ZW5zaW9uc10pO1xuXHRcdGxldCBleHRlbnNpb24gPSBmaWxlTmFtZS50b0xvd2VyQ2FzZSgpLnNwbGl0KFwiLlwiKTtcblx0XHRleHRlbnNpb24gPSBleHRlbnNpb25bZXh0ZW5zaW9uLmxlbmd0aCAtIDFdO1xuXG5cdFx0aWYgKCFfLnNvbWUoYWNjZXB0ZWRFeHRlbnNpb25zLCB4ID0+IHggPT09IGV4dGVuc2lvbikpXG5cdFx0XHRlcnJvcnNbZXJyb3JLZXldID0gXCJUaGUgc2VsZWN0ZWQgZmlsZSBtdXN0IGhhdmUgb25lIG9mIHRoZXNlIGV4dGVuc2lvbnM6IFwiICsgYWNjZXB0ZWRFeHRlbnNpb25zLmpvaW4oXCIsIFwiKTtcblxuXHRcdHJldHVybiBlcnJvcnM7XG5cdH0sXG5cblx0dmFsaWRhdGVDb2xvcjogZnVuY3Rpb24oY29sb3IsIGVycm9yS2V5KSB7XG5cdFx0Lypcblx0XHRcdF4gbWF0Y2ggYmVnaW5uaW5nXG5cdFx0XHQjIGEgaGFzaFxuXHRcdFx0W2EtZjAtOV0gYW55IGxldHRlciBmcm9tIGEtZiBhbmQgMC05XG5cdFx0XHR7Nn0gb3IgezN9IHRoZSBwcmV2aW91cyBncm91cCBhcHBlYXJzIGV4YWN0bHkgMyBvciA2IHRpbWVzXG5cdFx0XHQkIG1hdGNoIGVuZFxuXHRcdFx0aSBpZ25vcmUgY2FzZVxuXHRcdCovXG5cdFx0Y29uc3QgZXJyb3JzID0ge307XG5cdFx0Y29uc3QgaXNPayA9ICgvKF4jWzAtOUEtRl17Nn0kKXwoXiNbMC05QS1GXXszfSQpL2kpLnRlc3QoY29sb3IpO1xuXHRcdGlmICghaXNPaylcblx0XHRcdGVycm9yc1tlcnJvcktleV0gPSBcIlRoZSBjb2xvciBzcGVjaWZpZWQgbXVzdCBiZSBhIHZhbGlkIGhleGFkZWNpbWFsLlwiO1xuXG5cdFx0cmV0dXJuIGVycm9ycztcblx0fSxcbn0pO1xuIl19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar moment = require(\"moment\");\n\nvar settings = require(\"app-settings\");\n\nvar Actions = Backbone.Collection.extend({\n\tinitialize: function initialize(models, options) {\n\t\tthis.identifier = options.identifier;\n\t},\n\tmodel: Backbone.Model,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/tokens/tranches/licenses/\" + this.identifier + \"/changes\";\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttemplate: require(\"../templates/licenseChanges.nunj\"),\n\n\tclassName: \"changelog-modal\",\n\n\tui: {\n\t\titem: \".item\",\n\t\tsearch: \"input\",\n\t\toverlay: \"div.input-overlay\"\n\t},\n\n\tevents: {\n\t\t\"click button.ok\": \"skip\",\n\t\t\"mouseover @ui.item\": \"showFullDate\",\n\t\t\"mouseout @ui.item\": \"hideFullDate\",\n\t\t\"input @ui.search\": \"search\",\n\n\t\t\"click label @ui.overlay\": \"clearBox\"\n\t},\n\n\tcollectionEvents: {\n\t\treset: \"render\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tfromNow: function fromNow(dt) {\n\t\t\t\treturn moment.unix(dt).utc().format(\"DD MMM YYYY, HH:mm a\");\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.host = options.host || \"#modals\";\n\n\t\tthis.items = new Actions([], {\n\t\t\tidentifier: this.model.get(\"tranche_license_id\")\n\t\t});\n\n\t\tthis.collection = new Backbone.VirtualCollection(this.items, {});\n\n\t\tthis.bindEvents(this.collection, this.collectionEvents);\n\n\t\tthis.xhr = this.items.fetch({ reset: true });\n\t},\n\n\tserializeData: function serializeData() {\n\t\treturn {\n\t\t\titems: this.collection ? this.collection.toJSON() : undefined,\n\t\t\tmodel: this.model.toJSON(),\n\t\t\tsearchText: this.searchText || \"\"\n\t\t};\n\t},\n\n\tclearBox: function clearBox(evt) {\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\n\t\tvar el = $(evt.currentTarget);\n\t\tthis.ui.overlay.addClass(\"hide\");\n\t\tel.siblings(\"input\").val(\"\");\n\t\tthis.search();\n\t},\n\n\tshow: function show() {\n\t\t$(\".modal-container\", $(this.host)).append(this.render().el);\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this = this;\n\n\t\t// Render a background\n\t\t$(\".modal-element\", $(this.host)).removeClass(\"hide\");\n\t\t$(\"body\").addClass(\"hide-overflow\");\n\n\t\tif (this.options.classNames) this.$el.addClass(this.options.classNames);\n\n\t\t// If there's any other modals visible right now, hide them, and restore it after\n\t\tthis.dunked = $.map($(\".modal-container\", $(this.host)).children(), function (item) {\n\t\t\tif ($(item).is(_this.$el)) return;\n\t\t\t$(item).addClass(\"hide\");\n\t\t\treturn $(item).getPath();\n\t\t});\n\n\t\tthis.trigger(\"rendered\", this);\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tif (this.xhr) this.xhr.abort();\n\t},\n\n\tonDestroy: function onDestroy() {\n\t\t// Clean up the background\n\t\tif (this.dunked && this.dunked.length === 0) {\n\t\t\t$(\".modal-element\", $(this.host)).addClass(\"hide\");\n\t\t\t$(\"body\").removeClass(\"hide-overflow\");\n\t\t}\n\n\t\tif (this.dunked) {\n\t\t\t_.each(this.dunked, function (item) {\n\t\t\t\tif (!item) return;\n\t\t\t\tvar el = $(item);\n\t\t\t\tif (el && el.length) el.removeClass(\"hide\");\n\t\t\t});\n\t\t}\n\t},\n\n\tskip: function skip() {\n\t\tthis.trigger(\"action\", \"skip\");\n\t\tthis.destroy();\n\t},\n\n\tsearch: _.debounce(function () {\n\t\tvar _this2 = this;\n\n\t\t/* eslint-disable no-invalid-this */\n\n\t\tthis.searchText = _.trim(this.ui.search.val() || \"\").toLowerCase();\n\t\tif (!this.searchText) {\n\t\t\tthis.collection.updateFilter({});\n\t\t\tthis.render();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.collection.updateFilter(function (x) {\n\t\t\treturn _.every(_this2.searchText.split(\" \"), function (y) {\n\t\t\t\treturn _.includes(x.get(\"action\").toLowerCase(), y) || x.get(\"user\") && _.includes(x.get(\"user\").toLowerCase(), y);\n\t\t\t});\n\t\t});\n\n\t\tthis.render();\n\t\tthis.delegateEvents();\n\n\t\tthis.ui.search.focus();\n\n\t\t/* eslint-enable no-invalid-this */\n\t}, 500)\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpY2Vuc2VDaGFuZ2VzLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIiQiLCJfIiwibW9tZW50Iiwic2V0dGluZ3MiLCJBY3Rpb25zIiwiQ29sbGVjdGlvbiIsImV4dGVuZCIsImluaXRpYWxpemUiLCJtb2RlbHMiLCJvcHRpb25zIiwiaWRlbnRpZmllciIsIm1vZGVsIiwiTW9kZWwiLCJ1cmwiLCJ1cmxSb290IiwibW9kdWxlIiwiZXhwb3J0cyIsIk1hcmlvbmV0dGUiLCJWaWV3IiwidGVtcGxhdGUiLCJjbGFzc05hbWUiLCJ1aSIsIml0ZW0iLCJzZWFyY2giLCJvdmVybGF5IiwiZXZlbnRzIiwiY29sbGVjdGlvbkV2ZW50cyIsInJlc2V0IiwidGVtcGxhdGVDb250ZXh0IiwiZnJvbU5vdyIsImR0IiwidW5peCIsInV0YyIsImZvcm1hdCIsImhvc3QiLCJpdGVtcyIsImdldCIsImNvbGxlY3Rpb24iLCJWaXJ0dWFsQ29sbGVjdGlvbiIsImJpbmRFdmVudHMiLCJ4aHIiLCJmZXRjaCIsInNlcmlhbGl6ZURhdGEiLCJ0b0pTT04iLCJ1bmRlZmluZWQiLCJzZWFyY2hUZXh0IiwiY2xlYXJCb3giLCJldnQiLCJzdG9wUHJvcGFnYXRpb24iLCJwcmV2ZW50RGVmYXVsdCIsImVsIiwiY3VycmVudFRhcmdldCIsImFkZENsYXNzIiwic2libGluZ3MiLCJ2YWwiLCJzaG93IiwiYXBwZW5kIiwicmVuZGVyIiwib25SZW5kZXIiLCJyZW1vdmVDbGFzcyIsImNsYXNzTmFtZXMiLCIkZWwiLCJkdW5rZWQiLCJtYXAiLCJjaGlsZHJlbiIsImlzIiwiZ2V0UGF0aCIsInRyaWdnZXIiLCJvbkJlZm9yZURlc3Ryb3kiLCJhYm9ydCIsIm9uRGVzdHJveSIsImxlbmd0aCIsImVhY2giLCJza2lwIiwiZGVzdHJveSIsImRlYm91bmNlIiwidHJpbSIsInRvTG93ZXJDYXNlIiwidXBkYXRlRmlsdGVyIiwiZXZlcnkiLCJzcGxpdCIsImluY2x1ZGVzIiwieCIsInki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Q00sQ0FBMUMsQ0FBRCxJQUFtREQsRUFBRTlDLEdBQUYsQ0FBTSxNQUFOLEtBQWlCbkMsRUFBRWdGLFFBQUYsQ0FBV0MsRUFBRTlDLEdBQUYsQ0FBTSxNQUFOLEVBQWN5QyxXQUFkLEVBQVgsRUFBd0NNLENBQXhDLENBREM7QUFBQSxJQUFwQyxDQUFMO0FBQUEsR0FBN0I7O0FBR0EsT0FBSzFCLE1BQUw7QUFDQSxPQUFLMkIsY0FBTDs7QUFFQSxPQUFLL0QsRUFBTCxDQUFRRSxNQUFSLENBQWU4RCxLQUFmOztBQUVBO0FBQ0EsRUFuQk8sRUFtQkwsR0FuQks7QUFuSHdDLENBQWhDLENBQWpCIiwiZmlsZSI6ImxpY2Vuc2VDaGFuZ2VzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBtb21lbnQgPSByZXF1aXJlKFwibW9tZW50XCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IEFjdGlvbnMgPSBCYWNrYm9uZS5Db2xsZWN0aW9uLmV4dGVuZCh7XG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG1vZGVscywgb3B0aW9ucykge1xuXHRcdHRoaXMuaWRlbnRpZmllciA9IG9wdGlvbnMuaWRlbnRpZmllcjtcblx0fSxcblx0bW9kZWw6IEJhY2tib25lLk1vZGVsLFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3Rva2Vucy90cmFuY2hlcy9saWNlbnNlcy9cIiArIHRoaXMuaWRlbnRpZmllciArIFwiL2NoYW5nZXNcIjtcblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9saWNlbnNlQ2hhbmdlcy5udW5qXCIpLFxuXG5cdGNsYXNzTmFtZTogXCJjaGFuZ2Vsb2ctbW9kYWxcIixcblxuXHR1aToge1xuXHRcdGl0ZW06IFwiLml0ZW1cIixcblx0XHRzZWFyY2g6IFwiaW5wdXRcIixcblx0XHRvdmVybGF5OiBcImRpdi5pbnB1dC1vdmVybGF5XCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBidXR0b24ub2tcIjogXCJza2lwXCIsXG5cdFx0XCJtb3VzZW92ZXIgQHVpLml0ZW1cIjogXCJzaG93RnVsbERhdGVcIixcblx0XHRcIm1vdXNlb3V0IEB1aS5pdGVtXCI6IFwiaGlkZUZ1bGxEYXRlXCIsXG5cdFx0XCJpbnB1dCBAdWkuc2VhcmNoXCI6IFwic2VhcmNoXCIsXG5cblx0XHRcImNsaWNrIGxhYmVsIEB1aS5vdmVybGF5XCI6IFwiY2xlYXJCb3hcIixcblx0fSxcblxuXHRjb2xsZWN0aW9uRXZlbnRzOiB7XG5cdFx0cmVzZXQ6IFwicmVuZGVyXCIsXG5cdH0sXG5cblx0dGVtcGxhdGVDb250ZXh0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0ZnJvbU5vdzogZnVuY3Rpb24oZHQpIHtcblx0XHRcdFx0cmV0dXJuIG1vbWVudC51bml4KGR0KS51dGMoKS5mb3JtYXQoXCJERCBNTU0gWVlZWSwgSEg6bW0gYVwiKTtcblx0XHRcdH0sXG5cdFx0fTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5ob3N0ID0gb3B0aW9ucy5ob3N0IHx8IFwiI21vZGFsc1wiO1xuXG5cdFx0dGhpcy5pdGVtcyA9IG5ldyBBY3Rpb25zKFtdLCB7XG5cdFx0XHRpZGVudGlmaWVyOiB0aGlzLm1vZGVsLmdldChcInRyYW5jaGVfbGljZW5zZV9pZFwiKSxcblx0XHR9KTtcblxuXHRcdHRoaXMuY29sbGVjdGlvbiA9IG5ldyBCYWNrYm9uZS5WaXJ0dWFsQ29sbGVjdGlvbih0aGlzLml0ZW1zLCB7fSk7XG5cblx0XHR0aGlzLmJpbmRFdmVudHModGhpcy5jb2xsZWN0aW9uLCB0aGlzLmNvbGxlY3Rpb25FdmVudHMpO1xuXG5cdFx0dGhpcy54aHIgPSB0aGlzLml0ZW1zLmZldGNoKHsgcmVzZXQ6IHRydWUgfSk7XG5cdH0sXG5cblx0c2VyaWFsaXplRGF0YTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGl0ZW1zOiB0aGlzLmNvbGxlY3Rpb24gPyB0aGlzLmNvbGxlY3Rpb24udG9KU09OKCkgOiB1bmRlZmluZWQsXG5cdFx0XHRtb2RlbDogdGhpcy5tb2RlbC50b0pTT04oKSxcblx0XHRcdHNlYXJjaFRleHQ6IHRoaXMuc2VhcmNoVGV4dCB8fCBcIlwiLFxuXHRcdH07XG5cdH0sXG5cblx0Y2xlYXJCb3g6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRldnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdGNvbnN0IGVsID0gJChldnQuY3VycmVudFRhcmdldCk7XG5cdFx0dGhpcy51aS5vdmVybGF5LmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRlbC5zaWJsaW5ncyhcImlucHV0XCIpLnZhbChcIlwiKTtcblx0XHR0aGlzLnNlYXJjaCgpO1xuXHR9LFxuXG5cdHNob3c6IGZ1bmN0aW9uKCkge1xuXHRcdCQoXCIubW9kYWwtY29udGFpbmVyXCIsICQodGhpcy5ob3N0KSkuYXBwZW5kKHRoaXMucmVuZGVyKCkuZWwpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHQvLyBSZW5kZXIgYSBiYWNrZ3JvdW5kXG5cdFx0JChcIi5tb2RhbC1lbGVtZW50XCIsICQodGhpcy5ob3N0KSkucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdCQoXCJib2R5XCIpLmFkZENsYXNzKFwiaGlkZS1vdmVyZmxvd1wiKTtcblxuXHRcdGlmICh0aGlzLm9wdGlvbnMuY2xhc3NOYW1lcylcblx0XHRcdHRoaXMuJGVsLmFkZENsYXNzKHRoaXMub3B0aW9ucy5jbGFzc05hbWVzKTtcblxuXHRcdC8vIElmIHRoZXJlJ3MgYW55IG90aGVyIG1vZGFscyB2aXNpYmxlIHJpZ2h0IG5vdywgaGlkZSB0aGVtLCBhbmQgcmVzdG9yZSBpdCBhZnRlclxuXHRcdHRoaXMuZHVua2VkID0gJC5tYXAoJChcIi5tb2RhbC1jb250YWluZXJcIiwgJCh0aGlzLmhvc3QpKS5jaGlsZHJlbigpLCBpdGVtID0+IHtcblx0XHRcdGlmICgkKGl0ZW0pLmlzKHRoaXMuJGVsKSlcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0JChpdGVtKS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHRyZXR1cm4gJChpdGVtKS5nZXRQYXRoKCk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLnRyaWdnZXIoXCJyZW5kZXJlZFwiLCB0aGlzKTtcblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLnhocilcblx0XHRcdHRoaXMueGhyLmFib3J0KCk7XG5cdH0sXG5cblx0b25EZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHQvLyBDbGVhbiB1cCB0aGUgYmFja2dyb3VuZFxuXHRcdGlmICh0aGlzLmR1bmtlZCAmJiB0aGlzLmR1bmtlZC5sZW5ndGggPT09IDApIHtcblx0XHRcdCQoXCIubW9kYWwtZWxlbWVudFwiLCAkKHRoaXMuaG9zdCkpLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdCQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKFwiaGlkZS1vdmVyZmxvd1wiKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5kdW5rZWQpIHtcblx0XHRcdF8uZWFjaCh0aGlzLmR1bmtlZCwgaXRlbSA9PiB7XG5cdFx0XHRcdGlmICghaXRlbSlcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdGNvbnN0IGVsID0gJChpdGVtKTtcblx0XHRcdFx0aWYgKGVsICYmIGVsLmxlbmd0aClcblx0XHRcdFx0XHRlbC5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0c2tpcDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy50cmlnZ2VyKFwiYWN0aW9uXCIsIFwic2tpcFwiKTtcblx0XHR0aGlzLmRlc3Ryb3koKTtcblx0fSxcblxuXHRzZWFyY2g6IF8uZGVib3VuY2UoZnVuY3Rpb24oKSB7XG5cdFx0LyogZXNsaW50LWRpc2FibGUgbm8taW52YWxpZC10aGlzICovXG5cblx0XHR0aGlzLnNlYXJjaFRleHQgPSBfLnRyaW0odGhpcy51aS5zZWFyY2gudmFsKCkgfHwgXCJcIikudG9Mb3dlckNhc2UoKTtcblx0XHRpZiAoIXRoaXMuc2VhcmNoVGV4dCkge1xuXHRcdFx0dGhpcy5jb2xsZWN0aW9uLnVwZGF0ZUZpbHRlcih7fSk7XG5cdFx0XHR0aGlzLnJlbmRlcigpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuY29sbGVjdGlvbi51cGRhdGVGaWx0ZXIoeCA9PiBfLmV2ZXJ5KHRoaXMuc2VhcmNoVGV4dC5zcGxpdChcIiBcIiksIHkgPT5cblx0XHRcdChfLmluY2x1ZGVzKHguZ2V0KFwiYWN0aW9uXCIpLnRvTG93ZXJDYXNlKCksIHkpKSB8fCAoeC5nZXQoXCJ1c2VyXCIpICYmIF8uaW5jbHVkZXMoeC5nZXQoXCJ1c2VyXCIpLnRvTG93ZXJDYXNlKCksIHkpKSkpO1xuXG5cdFx0dGhpcy5yZW5kZXIoKTtcblx0XHR0aGlzLmRlbGVnYXRlRXZlbnRzKCk7XG5cblx0XHR0aGlzLnVpLnNlYXJjaC5mb2N1cygpO1xuXG5cdFx0LyogZXNsaW50LWVuYWJsZSBuby1pbnZhbGlkLXRoaXMgKi9cblx0fSwgNTAwKSxcbn0pOyJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar $ = require(\"jquery\");\nvar moment = require(\"moment\");\nvar rester = require(\"rester\");\nvar qs = require(\"querystring\");\nvar _ = require(\"lodash\");\n\nvar App = require(\"../../index\");\n\nvar ServerGrid = require(\"../../lib/serverGrid\");\nvar settings = require(\"app-settings\");\nvar SmallModal = require(\"../../lib/smallModal\");\nvar Selectra = require(\"../../lib/selectra\");\nvar SimpleMenu = require(\"../../lib/simpleMenu\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar Changelog = require(\"./licenseChanges\");\n\nvar Model = Backbone.Epoxy.Model.extend({\n\tdefaults: {},\n\tidAttribute: \"tranche_license_id\",\n\n\tcomputeds: {\n\t\tassignments_left: function assignments_left() {\n\t\t\tif (this.get(\"startdate\")) return this.get(\"transfers_left\");\n\t\t\treturn this.get(\"transfers_left\") + 1;\n\t\t}\n\t},\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/tokens/tranches/\" + this.get(\"tranche\") + \"/licenses\";\n\t}\n});\n\nvar Collection = Backbone.PageableCollection.extend({\n\tmodel: Model,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/tokens/tranches/licenses\";\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"content tranche-licenses\",\n\n\ttemplate: require(\"../templates/manageLicenses.nunj\"),\n\n\tui: {\n\t\tfilterBar: \".ops-bar .filters\",\n\t\tcounter: \".ops-bar .counter\",\n\t\tpaging: \".paging\",\n\t\tgrid: \"div.grid\",\n\t\tdownloadList: \"div.downloadList\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.downloadList\": \"showDownloads\"\n\t},\n\n\tcollectionEvents: {\n\t\t\"toolbar:click:unassign\": \"unassign\",\n\t\t\"toolbar:click:transfer\": \"transfer\",\n\t\t\"toolbar:click:assign\": \"assign\",\n\t\t\"toolbar:click:changelog\": \"changelog\"\n\t},\n\n\tshowDownloads: function showDownloads(evt) {\n\t\tevt.stopPropagation();\n\n\t\tvar list = new SimpleMenu({\n\t\t\tanchor: this.ui.downloadList,\n\t\t\tside: \"left\",\n\t\t\tstructure: [{ closeOnClick: true, elements: [{ text: \"Export list of licenses\", id: \"licenses\" }] }]\n\t\t});\n\t\tlist.show();\n\n\t\tthis.listenTo(list, \"clicked:licenses\", this.downloadList.bind(this));\n\t},\n\n\tdownloadList: function downloadList() {\n\t\tvar params = this.grid.filter.getServerFilters();\n\t\twindow.open(settings.urlRoot + \"/api/1.0/tokens/tranches/licenses/lists/licenses?\" + qs.stringify(params));\n\t},\n\n\tfilterUnassign: function filterUnassign(model) {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\treturn !settings.fcClient && !model.get(\"revoked\") && model.get(\"taken\") && !model.get(\"expired\") && model.get(\"book_id\") && rester.hasAccess(rester.p.api.tokens.tranches.licenses.delete, user) && !settings.fcClient;\n\t},\n\n\tfilterTransfer: function filterTransfer(model) {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\treturn !settings.fcClient && model.get(\"taken\") && !model.get(\"revoked\") && !model.get(\"expired\") && (model.get(\"transfers_left\") || settings.ignoreTransferLimitUntil > moment().unix() || _.intersection(model.get(\"owner_roles\"), [\"teacher\", \"facilitator\"]).length) && model.get(\"book_id\") && rester.hasAccess(rester.p.api.tokens.tranches.licenses.license.transfer.post, user);\n\t},\n\n\tfilterAssign: function filterAssign(model) {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tif (settings.fcClient) return;\n\n\t\treturn _.intersection(model.get(\"old_roles\"), [\"teacher\", \"facilitator\"]).length || !model.get(\"revoked\") && !model.get(\"taken\") && !model.get(\"expired\") && model.get(\"book_id\") && (!model.get(\"startdate\") || model.get(\"transfers_left\") || settings.ignoreTransferLimitUntil > moment().unix() || _.intersection(model.get(\"owner_roles\"), [\"teacher\", \"facilitator\"]).length) && rester.hasAccess(rester.p.api.tokens.tranches.licenses.license.assign.post, user);\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"title\", label: \"Product\", cell: \"string\", editable: false, tooltip: \"title\" }, { name: \"instance_code\", label: \"License\", cell: \"string\", editable: false }, { name: \"book\", label: \"Universal ID\", cell: \"string\", editable: false }, { name: \"username\", label: \"Username\", cell: \"string\", editable: false }, { name: \"startdate\", label: \"Start Date\", cell: ServerGrid.MomentCell.extend({\n\t\t\t\tdisplayFormat: \"DD MMM YYYY, HH:mm:ss a\",\n\t\t\t\tdisplayInUTC: false\n\t\t\t}), editable: false }, { name: \"expires\", label: \"Expiry\", cell: ServerGrid.MomentCell.extend({\n\t\t\t\tdisplayFormat: \"DD MMM YYYY, HH:mm:ss a\",\n\t\t\t\tdisplayInUTC: false\n\t\t\t}), editable: false }, { name: \"group_count\", label: \"Group Count\", cell: \"string\", editable: false }, { name: \"duration\", label: \"Duration\", cell: ServerGrid.DurationCell.extend({}), editable: false }, { name: \"grace\", label: \"Grace Period\", cell: ServerGrid.DurationCell.extend({}), editable: false }, { name: \"assignments_left\", label: \"Assignments Left\", cell: \"string\", editable: false }, { name: \"taken\", label: \"In Use\", cell: ServerGrid.BooleanIconCell.extend({}), editable: false }, { name: \"revoked\", label: \"Revoked\", cell: ServerGrid.BooleanIconCell.extend({}), editable: false }, { label: \"Actions\", cell: new ServerGrid.ToolbarCell({ tooltips: [{ title: \"Changelog\", icon: \"fa-list-ul\" }, { title: \"Unassign\", icon: \"fa-times\", filter: this.filterUnassign.bind(this) }, { title: \"Transfer\", icon: \"fa-random\", filter: this.filterTransfer.bind(this) }, { title: \"Assign\", icon: \"fa-share\", filter: this.filterAssign.bind(this) }] }), editable: false, sortable: false }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new Collection(),\n\t\t\tclickable: false,\n\t\t\twaitForFilters: true,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counter,\n\t\t\t\ttemplate: \"Tokens $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tthis.bindEvents(this.grid.collection, this.collectionEvents);\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar userFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"userFilter\",\n\t\t\tlabel: \"Users\",\n\t\t\tserver: {\n\t\t\t\tkey: \"user_id\",\n\t\t\t\tvalue: \"name\",\n\t\t\t\tfetch: settings.urlRoot + \"/acacia/users/getUsersList\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\n\t\tvar bookFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"bookFilter\",\n\t\t\tlabel: \"Books\",\n\t\t\tserver: {\n\t\t\t\tkey: \"book_id\",\n\t\t\t\tvalue: \"title\",\n\t\t\t\tfetch: settings.urlRoot + \"/acacia/books/getSelectraBooks\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\n\t\tvar groupFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"groupFilter\",\n\t\t\tlabel: \"Groups\",\n\t\t\tserver: {\n\t\t\t\tkey: \"group_id\",\n\t\t\t\tvalue: \"name\",\n\t\t\t\tfetch: settings.urlRoot + \"/acacia/groups/getSelectraGroups\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\n\t\tvar hideRevokedLicenses = {\n\t\t\ttype: \"toggle\",\n\t\t\tname: \"hideRevokedLicenses\",\n\t\t\tlabel: \"Hide revoked licenses\",\n\t\t\tserver: true,\n\t\t\tinitialValue: function initialValue() {\n\t\t\t\treturn [false];\n\t\t\t}\n\t\t};\n\n\t\tvar hideAssignedLicenses = {\n\t\t\ttype: \"toggle\",\n\t\t\tname: \"hideAssignedLicenses\",\n\t\t\tlabel: \"Hide assigned licenses\",\n\t\t\tserver: true,\n\t\t\tinitialValue: function initialValue() {\n\t\t\t\treturn [false];\n\t\t\t}\n\t\t};\n\n\t\tvar filterList = [textFilter, userFilter, bookFilter, groupFilter, hideRevokedLicenses, hideAssignedLicenses];\n\n\t\tthis.ui.filterBar.prepend(this.grid.filter({\n\t\t\tfilterContainer: this.ui.filterBar,\n\t\t\tfilters: filterList,\n\t\t\tdefaultFilters: [\"textFilter\", \"userFilter\", \"bookFilter\", \"groupFilter\", \"hideRevokedLicenses\", \"hideAssignedLicenses\"]\n\t\t}).render().el);\n\t},\n\n\tassign: function assign(model) {\n\t\tvar _this = this;\n\n\t\tvar msg = \"<p>Please choose the person to assign this license to.</p>\\n\\t\\t\\t<p><select/></p>\";\n\n\t\tif (model.get(\"startdate\") === null) {\n\t\t\tmsg += \"<p>Assigning this license for the first time will begin the license lifetime. The license will then expire on\\n\\t\\t\\t<strong>\" + moment().add(moment.duration(model.get(\"duration\"))).add(moment.duration(model.get(\"grace\"))).format(\"MMMM Do YYYY, HH:mm a\") + \"</strong>\\n\\t\\t\\t <em>whether or not it continues to be used</em>.\";\n\t\t}\n\n\t\tthis.modal = new SmallModal({\n\t\t\ttitle: \"<span class='fal fa-share'/> Assign Token\",\n\t\t\tbody: msg,\n\t\t\tpersist: true\n\t\t});\n\n\t\tvar onlyTeacher = !model.get(\"transfers_left\") && _.intersection(model.get(\"owner_roles\"), [\"teacher\", \"facilitator\"]).length && !(settings.ignoreTransferLimitUntil > moment().unix());\n\n\t\tvar user = new Selectra({\n\t\t\tserver: {\n\t\t\t\tfetch: settings.urlRoot + \"/acacia/users/getUsersList?skipRestricted=true&onlyTeacher=\" + onlyTeacher,\n\t\t\t\tdelayLoad: true,\n\t\t\t\tmap: function map(x) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkey: x.user_id,\n\t\t\t\t\t\tvalue: x.firstname + \" \" + x.surname + \" (\" + x.username + \")\"\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 20,\n\t\t\t\tinfinite: true\n\t\t\t},\n\t\t\tplaceholder: \"Choose a user to assign this token to\",\n\t\t\tddHost: \".modal-container\"\n\t\t});\n\n\t\tthis.modal.on(\"button:ok\", function () {\n\t\t\tif (!user.val()) return _this.modal.showError(\"You must choose a user to assign the license to\");\n\n\t\t\t$.ajax({\n\t\t\t\tmethod: \"POST\",\n\t\t\t\turl: settings.urlRoot + \"/api/1.0/tokens/tranches/licenses/\" + model.id + \"/assign\",\n\t\t\t\tdata: {\n\t\t\t\t\tuser: user.val()\n\t\t\t\t},\n\t\t\t\tsuccess: _this.assignSuccess.bind(_this, model),\n\t\t\t\terror: _this.assignError.bind(_this, model)\n\t\t\t});\n\t\t});\n\n\t\tthis.modal.show();\n\n\t\tuser.show({ el: $(\"select\", this.modal.$el) });\n\t},\n\n\tassignSuccess: function assignSuccess(model, data) {\n\t\tthis.modal.destroy();\n\n\t\tmodel.set(data);\n\t\tmodel.trigger(\"grid:render\");\n\t},\n\n\tassignError: function assignError(model, xhr) {\n\t\tvar answer = App.parseResponse(xhr);\n\t\tthis.modal.showError(\"Assign failed: \" + (answer.detail || answer.info));\n\t},\n\n\ttransfer: function transfer(model) {\n\t\tvar _this2 = this;\n\n\t\tvar msg = \"<p>Please choose the person to transfer this license to.</p>\\n\\t\\t\\t<p><select/></p>\";\n\n\t\tthis.modal = new SmallModal({\n\t\t\ttitle: \"<span class='fal fa-share'/> Transfer Token\",\n\t\t\tbody: msg,\n\t\t\tpersist: true\n\t\t});\n\n\t\tvar onlyTeacher = !model.get(\"transfers_left\") && _.intersection(model.get(\"owner_roles\"), [\"teacher\", \"facilitator\"]).length && !(settings.ignoreTransferLimitUntil > moment().unix());\n\n\t\tvar user = new Selectra({\n\t\t\tserver: {\n\t\t\t\tfetch: settings.urlRoot + \"/acacia/users/getUsersList?skipRestricted=true&onlyTeacher=\" + onlyTeacher,\n\t\t\t\tdelayLoad: true,\n\t\t\t\tmap: function map(x) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tkey: x.user_id,\n\t\t\t\t\t\tvalue: x.firstname + \" \" + x.surname + \" (\" + x.username + \")\"\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 20,\n\t\t\t\tinfinite: true\n\t\t\t},\n\t\t\tplaceholder: \"Choose a user to transfer this token to\",\n\t\t\tddHost: \".modal-container\"\n\t\t});\n\n\t\tthis.modal.on(\"button:ok\", function () {\n\t\t\tif (!user.val()) return _this2.modal.showError(\"You must choose a user to transfer the license to\");\n\n\t\t\t$.ajax({\n\t\t\t\tmethod: \"POST\",\n\t\t\t\turl: settings.urlRoot + \"/api/1.0/tokens/tranches/licenses/\" + model.id + \"/transfer\",\n\t\t\t\tdata: {\n\t\t\t\t\tuser: user.val()\n\t\t\t\t},\n\t\t\t\tsuccess: _this2.assignSuccess.bind(_this2, model),\n\t\t\t\terror: _this2.assignError.bind(_this2, model)\n\t\t\t});\n\t\t});\n\n\t\tthis.modal.show();\n\n\t\tuser.show({ el: $(\"select\", this.modal.$el) });\n\t},\n\n\ttransferSuccess: function transferSuccess(model, data) {\n\t\tthis.modal.destroy();\n\n\t\tmodel.set(data);\n\t\tmodel.trigger(\"grid:render\");\n\t},\n\n\ttransferError: function transferError(model, xhr) {\n\t\tvar answer = App.parseResponse(xhr);\n\t\tthis.modal.showError(\"Transfer failed: \" + (answer.detail || answer.info));\n\t},\n\n\tunassign: function unassign(model) {\n\t\tvar _this3 = this;\n\n\t\tthis.modal = new SmallModal({\n\t\t\twarning: true,\n\t\t\ttitle: \"<span class='fal fa-remove'/> Unassign Token\",\n\t\t\tbody: \"<p>Are you sure you want to unassign this token? It will be removed from the person using it.</p>\\n\\t\\t\\t\\t<p>If there are no transfers left for this license, you will not be able to re-assign it to anyone in future.</p>\",\n\t\t\tpersist: true\n\t\t});\n\n\t\tthis.modal.on(\"button:ok\", function () {\n\t\t\t$.ajax({\n\t\t\t\tmethod: \"DELETE\",\n\t\t\t\turl: settings.urlRoot + \"/api/1.0/tokens/tranches/licenses/\" + model.id,\n\t\t\t\tsuccess: _this3.unassignSuccess.bind(_this3, model),\n\t\t\t\terror: _this3.unassignError.bind(_this3, model)\n\t\t\t});\n\t\t});\n\n\t\tthis.modal.show();\n\t},\n\n\tunassignSuccess: function unassignSuccess(model, data) {\n\t\tthis.modal.destroy();\n\n\t\tmodel.set(data);\n\t\tmodel.trigger(\"grid:render\");\n\t},\n\n\tunassignError: function unassignError(model, xhr) {\n\t\tvar answer = App.parseResponse(xhr);\n\t\tthis.modal.showError(\"Unassignment failed: \" + (answer.detail || answer.info));\n\t},\n\n\tchangelog: function changelog(model) {\n\t\tvar changelog = new Changelog({ model: model });\n\n\t\tchangelog.show();\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1hbmFnZUxpY2Vuc2VzLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIiQiLCJtb21lbnQiLCJyZXN0ZXIiLCJxcyIsIl8iLCJBcHAiLCJTZXJ2ZXJHcmlkIiwic2V0dGluZ3MiLCJTbWFsbE1vZGFsIiwiU2VsZWN0cmEiLCJTaW1wbGVNZW51IiwicmFkaW8iLCJSYWRpbyIsImNoYW5uZWwiLCJDaGFuZ2Vsb2ciLCJNb2RlbCIsIkVwb3h5IiwiZXh0ZW5kIiwiZGVmYXVsdHMiLCJpZEF0dHJpYnV0ZSIsImNvbXB1dGVkcyIsImFzc2lnbm1lbnRzX2xlZnQiLCJnZXQiLCJ1cmxSb290IiwiQ29sbGVjdGlvbiIsIlBhZ2VhYmxlQ29sbGVjdGlvbiIsIm1vZGVsIiwidXJsIiwic3RhdGUiLCJwYWdlU2l6ZSIsIm1vZGUiLCJxdWVyeVBhcmFtcyIsInNvcnRLZXkiLCJwYXJzZVN0YXRlIiwicmVzcCIsInRvdGFsUmVjb3JkcyIsInRvdGFsIiwicGFyc2VSZWNvcmRzIiwicm93cyIsIm1vZHVsZSIsImV4cG9ydHMiLCJNYXJpb25ldHRlIiwiVmlldyIsInRhZ05hbWUiLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsInVpIiwiZmlsdGVyQmFyIiwiY291bnRlciIsInBhZ2luZyIsImdyaWQiLCJkb3dubG9hZExpc3QiLCJldmVudHMiLCJjb2xsZWN0aW9uRXZlbnRzIiwic2hvd0Rvd25sb2FkcyIsImV2dCIsInN0b3BQcm9wYWdhdGlvbiIsImxpc3QiLCJhbmNob3IiLCJzaWRlIiwic3RydWN0dXJlIiwiY2xvc2VPbkNsaWNrIiwiZWxlbWVudHMiLCJ0ZXh0IiwiaWQiLCJzaG93IiwibGlzdGVuVG8iLCJiaW5kIiwicGFyYW1zIiwiZmlsdGVyIiwiZ2V0U2VydmVyRmlsdGVycyIsIndpbmRvdyIsIm9wZW4iLCJzdHJpbmdpZnkiLCJmaWx0ZXJVbmFzc2lnbiIsInVzZXIiLCJyZXF1ZXN0IiwiRXZlbnRzIiwiUmVxdWVzdHMiLCJDdXJyZW50VXNlciIsImZjQ2xpZW50IiwiaGFzQWNjZXNzIiwicCIsImFwaSIsInRva2VucyIsInRyYW5jaGVzIiwibGljZW5zZXMiLCJkZWxldGUiLCJmaWx0ZXJUcmFuc2ZlciIsImlnbm9yZVRyYW5zZmVyTGltaXRVbnRpbCIsInVuaXgiLCJpbnRlcnNlY3Rpb24iLCJsZW5ndGgiLCJsaWNlbnNlIiwidHJhbnNmZXIiLCJwb3N0IiwiZmlsdGVyQXNzaWduIiwiYXNzaWduIiwib25SZW5kZXIiLCJjb2x1bW5zIiwibmFtZSIsImxhYmVsIiwiY2VsbCIsImVkaXRhYmxlIiwidG9vbHRpcCIsIk1vbWVudENlbGwiLCJkaXNwbGF5Rm9ybWF0IiwiZGlzcGxheUluVVRDIiwiRHVyYXRpb25DZWxsIiwiQm9vbGVhbkljb25DZWxsIiwiVG9vbGJhckNlbGwiLCJ0b29sdGlwcyIsInRpdGxlIiwiaWNvbiIsInNvcnRhYmxlIiwiZWwiLCJjb2xsZWN0aW9uIiwiY2xpY2thYmxlIiwid2FpdEZvckZpbHRlcnMiLCJlbGVtZW50IiwiYmluZEV2ZW50cyIsInRleHRGaWx0ZXIiLCJ0eXBlIiwiZGVib3VuY2UiLCJzZXJ2ZXIiLCJ1c2VyRmlsdGVyIiwia2V5IiwidmFsdWUiLCJmZXRjaCIsImluZmluaXRlIiwiYm9va0ZpbHRlciIsImdyb3VwRmlsdGVyIiwiaGlkZVJldm9rZWRMaWNlbnNlcyIsImluaXRpYWxWYWx1ZSIsImhpZGVBc3NpZ25lZExpY2Vuc2VzIiwiZmlsdGVyTGlzdCIsInByZXBlbmQiLCJmaWx0ZXJDb250YWluZXIiLCJmaWx0ZXJzIiwiZGVmYXVsdEZpbHRlcnMiLCJyZW5kZXIiLCJtc2ciLCJhZGQiLCJkdXJhdGlvbiIsImZvcm1hdCIsIm1vZGFsIiwiYm9keSIsInBlcnNpc3QiLCJvbmx5VGVhY2hlciIsImRlbGF5TG9hZCIsIm1hcCIsIngiLCJ1c2VyX2lkIiwiZmlyc3RuYW1lIiwic3VybmFtZSIsInVzZXJuYW1lIiwicGxhY2Vob2xkZXIiLCJkZEhvc3QiLCJvbiIsInZhbCIsInNob3dFcnJvciIsImFqYXgiLCJtZXRob2QiLCJkYXRhIiwic3VjY2VzcyIsImFzc2lnblN1Y2Nlc3MiLCJlcnJvciIsImFzc2lnbkVycm9yIiwiJGVsIiwiZGVzdHJveSIsInNldCIsInRyaWdnZXIiLCJ4aHIiLCJhbnN3ZXIiLCJwYXJzZVJlc3BvbnNlIiwiZGV0YWlsIiwiaW5mbyIsInRyYW5zZmVyU3VjY2VzcyIsInRyYW5zZmVyRXJyb3IiLCJ1bmFzc2lnbiIsIndhcm5pbmciLCJ1bmFzc2lnblN1Y2Nlc3MiLCJ1bmFzc2lnbkVycm9yIiwiY2hhbmdlbG9nIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1FLFNBQVNGLFFBQVEsUUFBUixDQUFmO0FBQ0EsSUFBTUcsU0FBU0gsUUFBUSxRQUFSLENBQWY7QUFDQSxJQUFNSSxLQUFLSixRQUFRLGFBQVIsQ0FBWDtBQUNBLElBQU1LLElBQUlMLFFBQVEsUUFBUixDQUFWOztBQUVBLElBQU1NLE1BQU1OLFFBQVEsYUFBUixDQUFaOztBQUVBLElBQU1PLGFBQWFQLFFBQVEsc0JBQVIsQ0FBbkI7QUFDQSxJQUFNUSxXQUFXUixRQUFRLGNBQVIsQ0FBakI7QUFDQSxJQUFNUyxhQUFhVCxRQUFRLHNCQUFSLENBQW5CO0FBQ0EsSUFBTVUsV0FBV1YsUUFBUSxvQkFBUixDQUFqQjtBQUNBLElBQU1XLGFBQWFYLFFBQVEsc0JBQVIsQ0FBbkI7O0FBRUEsSUFBTVksUUFBUWIsU0FBU2MsS0FBVCxDQUFlQyxPQUFmLENBQXVCLFFBQXZCLENBQWQ7O0FBRUEsSUFBTUMsWUFBWWYsUUFBUSxrQkFBUixDQUFsQjs7QUFFQSxJQUFNZ0IsUUFBUWpCLFNBQVNrQixLQUFULENBQWVELEtBQWYsQ0FBcUJFLE1BQXJCLENBQTRCO0FBQ3pDQyxXQUFVLEVBRCtCO0FBRXpDQyxjQUFhLG9CQUY0Qjs7QUFJekNDLFlBQVc7QUFDVkMsb0JBQWtCLDRCQUFXO0FBQzVCLE9BQUksS0FBS0Ms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QyxZQUFRLFFBREY7QUFFTnZJLFNBQVFwQixTQUFTZ0IsT0FBakIsMENBQTZERyxNQUFNc0MsRUFGN0Q7QUFHTm9HLGFBQVMsT0FBS2lCLGVBQUwsQ0FBcUJsSCxJQUFyQixDQUEwQixNQUExQixFQUFnQ3pDLEtBQWhDLENBSEg7QUFJTjRJLFdBQU8sT0FBS2dCLGFBQUwsQ0FBbUJuSCxJQUFuQixDQUF3QixNQUF4QixFQUE4QnpDLEtBQTlCO0FBSkQsSUFBUDtBQU1BLEdBUEQ7O0FBU0EsT0FBS3VILEtBQUwsQ0FBV2hGLElBQVg7QUFDQSxFQXpWK0M7O0FBMlZoRG9ILGtCQUFpQix5QkFBUzNKLEtBQVQsRUFBZ0J5SSxJQUFoQixFQUFzQjtBQUN0QyxPQUFLbEIsS0FBTCxDQUFXd0IsT0FBWDs7QUFFQS9JLFFBQU1nSixHQUFOLENBQVVQLElBQVY7QUFDQXpJLFFBQU1pSixPQUFOLENBQWMsYUFBZDtBQUNBLEVBaFcrQzs7QUFrV2hEVyxnQkFBZSx1QkFBUzVKLEtBQVQsRUFBZ0JrSixHQUFoQixFQUFxQjtBQUNuQyxNQUFNQyxTQUFTeEssSUFBSXlLLGFBQUosQ0FBa0JGLEdBQWxCLENBQWY7QUFDQSxPQUFLM0IsS0FBTCxDQUFXZSxTQUFYLENBQXFCLDJCQUEyQmEsT0FBT0UsTUFBUCxJQUFpQkYsT0FBT0csSUFBbkQsQ0FBckI7QUFDQSxFQXJXK0M7O0FBdVdoRE8sWUFBVyxtQkFBUzdKLEtBQVQsRUFBZ0I7QUFDMUIsTUFBTTZKLFlBQVksSUFBSXpLLFNBQUosQ0FBYyxFQUFFWSxZQUFGLEVBQWQsQ0FBbEI7O0FBRUE2SixZQUFVdEgsSUFBVjtBQUNBO0FBM1crQyxDQUFoQyxDQUFqQiIsImZpbGUiOiJtYW5hZ2VMaWNlbnNlcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbmNvbnN0IG1vbWVudCA9IHJlcXVpcmUoXCJtb21lbnRcIik7XG5jb25zdCByZXN0ZXIgPSByZXF1aXJlKFwicmVzdGVyXCIpO1xuY29uc3QgcXMgPSByZXF1aXJlKFwicXVlcnlzdHJpbmdcIik7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcblxuY29uc3QgQXBwID0gcmVxdWlyZShcIi4uLy4uL2luZGV4XCIpO1xuXG5jb25zdCBTZXJ2ZXJHcmlkID0gcmVxdWlyZShcIi4uLy4uL2xpYi9zZXJ2ZXJHcmlkXCIpO1xuY29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuY29uc3QgU21hbGxNb2RhbCA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc21hbGxNb2RhbFwiKTtcbmNvbnN0IFNlbGVjdHJhID0gcmVxdWlyZShcIi4uLy4uL2xpYi9zZWxlY3RyYVwiKTtcbmNvbnN0IFNpbXBsZU1lbnUgPSByZXF1aXJlKFwiLi4vLi4vbGliL3NpbXBsZU1lbnVcIik7XG5cbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcblxuY29uc3QgQ2hhbmdlbG9nID0gcmVxdWlyZShcIi4vbGljZW5zZUNoYW5nZXNcIik7XG5cbmNvbnN0IE1vZGVsID0gQmFja2JvbmUuRXBveHkuTW9kZWwuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHt9LFxuXHRpZEF0dHJpYnV0ZTogXCJ0cmFuY2hlX2xpY2Vuc2VfaWRcIixcblxuXHRjb21wdXRlZHM6IHtcblx0XHRhc3NpZ25tZW50c19sZWZ0OiBmdW5jdGlvbigpIHtcblx0XHRcdGlmICh0aGlzLmdldChcInN0YXJ0ZGF0ZVwiKSlcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0KFwidHJhbnNmZXJzX2xlZnRcIik7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXQoXCJ0cmFuc2ZlcnNfbGVmdFwiKSArIDE7XG5cdFx0fSxcblx0fSxcblxuXHR1cmxSb290OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvdG9rZW5zL3RyYW5jaGVzL1wiICsgdGhpcy5nZXQoXCJ0cmFuY2hlXCIpICsgXCIvbGljZW5zZXNcIjtcblx0fSxcbn0pO1xuXG5jb25zdCBDb2xsZWN0aW9uID0gQmFja2JvbmUuUGFnZWFibGVDb2xsZWN0aW9uLmV4dGVuZCh7XG5cdG1vZGVsOiBNb2RlbCxcblxuXHR1cmw6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC90b2tlbnMvdHJhbmNoZXMvbGljZW5zZXNcIjtcblx0fSxcblxuXHRzdGF0ZToge1xuXHRcdHBhZ2VTaXplOiAzMCxcblx0fSxcblx0bW9kZTogXCJzZXJ2ZXJcIixcblxuXHRxdWVyeVBhcmFtczoge1xuXHRcdHBhZ2VTaXplOiBcInBhZ2VTaXplXCIsXG5cdFx0c29ydEtleTogXCJzb3J0QnlcIixcblx0fSxcblxuXHRwYXJzZVN0YXRlOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0cmV0dXJuIHsgdG90YWxSZWNvcmRzOiByZXNwLnRvdGFsIH07XG5cdH0sXG5cblx0cGFyc2VSZWNvcmRzOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0cmV0dXJuIHJlc3Aucm93cztcblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwiY29udGVudCB0cmFuY2hlLWxpY2Vuc2VzXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvbWFuYWdlTGljZW5zZXMubnVualwiKSxcblxuXHR1aToge1xuXHRcdGZpbHRlckJhcjogXCIub3BzLWJhciAuZmlsdGVyc1wiLFxuXHRcdGNvdW50ZXI6IFwiLm9wcy1iYXIgLmNvdW50ZXJcIixcblx0XHRwYWdpbmc6IFwiLnBhZ2luZ1wiLFxuXHRcdGdyaWQ6IFwiZGl2LmdyaWRcIixcblx0XHRkb3dubG9hZExpc3Q6IFwiZGl2LmRvd25sb2FkTGlzdFwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmRvd25sb2FkTGlzdFwiOiBcInNob3dEb3dubG9hZHNcIixcblx0fSxcblxuXHRjb2xsZWN0aW9uRXZlbnRzOiB7XG5cdFx0XCJ0b29sYmFyOmNsaWNrOnVuYXNzaWduXCI6IFwidW5hc3NpZ25cIixcblx0XHRcInRvb2xiYXI6Y2xpY2s6dHJhbnNmZXJcIjogXCJ0cmFuc2ZlclwiLFxuXHRcdFwidG9vbGJhcjpjbGljazphc3NpZ25cIjogXCJhc3NpZ25cIixcblx0XHRcInRvb2xiYXI6Y2xpY2s6Y2hhbmdlbG9nXCI6IFwiY2hhbmdlbG9nXCIsXG5cdH0sXG5cblx0c2hvd0Rvd25sb2FkczogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0Y29uc3QgbGlzdCA9IG5ldyBTaW1wbGVNZW51KHtcblx0XHRcdGFuY2hvcjogdGhpcy51aS5kb3dubG9hZExpc3QsXG5cdFx0XHRzaWRlOiBcImxlZnRcIixcblx0XHRcdHN0cnVjdHVyZTogW1xuXHRcdFx0XHR7IGNsb3NlT25DbGljazogdHJ1ZSwgZWxlbWVudHM6IFtcblx0XHRcdFx0XHR7IHRleHQ6IFwiRXhwb3J0IGxpc3Qgb2YgbGljZW5zZXNcIiwgaWQ6IFwibGljZW5zZXNcIiB9LFxuXHRcdFx0XHRdIH0sXG5cdFx0XHRdLFxuXHRcdH0pO1xuXHRcdGxpc3Quc2hvdygpO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhsaXN0LCBcImNsaWNrZWQ6bGljZW5zZXNcIiwgdGhpcy5kb3dubG9hZExpc3QuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0ZG93bmxvYWRMaXN0OiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBwYXJhbXMgPSB0aGlzLmdyaWQuZmlsdGVyLmdldFNlcnZlckZpbHRlcnMoKTtcblx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC90b2tlbnMvdHJhbmNoZXMvbGljZW5zZXMvbGlzdHMvbGljZW5zZXM/XCIgKyBxcy5zdHJpbmdpZnkocGFyYW1zKSk7XG5cdH0sXG5cblx0ZmlsdGVyVW5hc3NpZ246IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0Y29uc3QgdXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cblx0XHRyZXR1cm4gIXNldHRpbmdzLmZjQ2xpZW50ICYmICFtb2RlbC5nZXQoXCJyZXZva2VkXCIpICYmIG1vZGVsLmdldChcInRha2VuXCIpICYmICFtb2RlbC5nZXQoXCJleHBpcmVkXCIpICYmIG1vZGVsLmdldChcImJvb2tfaWRcIikgJiZcblx0XHRcdHJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAuYXBpLnRva2Vucy50cmFuY2hlcy5saWNlbnNlcy5kZWxldGUsIHVzZXIpICYmICFzZXR0aW5ncy5mY0NsaWVudDtcblx0fSxcblxuXHRmaWx0ZXJUcmFuc2ZlcjogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRjb25zdCB1c2VyID0gcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblxuXHRcdHJldHVybiAhc2V0dGluZ3MuZmNDbGllbnQgJiYgbW9kZWwuZ2V0KFwidGFrZW5cIikgJiYgIW1vZGVsLmdldChcInJldm9rZWRcIikgJiYgIW1vZGVsLmdldChcImV4cGlyZWRcIikgJiZcblx0XHRcdChtb2RlbC5nZXQoXCJ0cmFuc2ZlcnNfbGVmdFwiKSB8fCBzZXR0aW5ncy5pZ25vcmVUcmFuc2ZlckxpbWl0VW50aWwgPiBtb21lbnQoKS51bml4KCkgfHwgXy5pbnRlcnNlY3Rpb24obW9kZWwuZ2V0KFwib3duZXJfcm9sZXNcIiksIFtcInRlYWNoZXJcIiwgXCJmYWNpbGl0YXRvclwiXSkubGVuZ3RoKSAmJlxuXHRcdFx0bW9kZWwuZ2V0KFwiYm9va19pZFwiKSAmJiByZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmFwaS50b2tlbnMudHJhbmNoZXMubGljZW5zZXMubGljZW5zZS50cmFuc2Zlci5wb3N0LCB1c2VyKTtcblx0fSxcblxuXHRmaWx0ZXJBc3NpZ246IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0Y29uc3QgdXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cblx0XHRpZiAoc2V0dGluZ3MuZmNDbGllbnQpXG5cdFx0XHRyZXR1cm47XG5cblxuXHRcdHJldHVybiBfLmludGVyc2VjdGlvbihtb2RlbC5nZXQoXCJvbGRfcm9sZXNcIiksIFtcInRlYWNoZXJcIiwgXCJmYWNpbGl0YXRvclwiXSkubGVuZ3RoIHx8XG5cdFx0XHQoIW1vZGVsLmdldChcInJldm9rZWRcIikgJiYgIW1vZGVsLmdldChcInRha2VuXCIpICYmICFtb2RlbC5nZXQoXCJleHBpcmVkXCIpICYmIG1vZGVsLmdldChcImJvb2tfaWRcIikgJiYgKCFtb2RlbC5nZXQoXCJzdGFydGRhdGVcIikgfHxcblx0XHRcdG1vZGVsLmdldChcInRyYW5zZmVyc19sZWZ0XCIpIHx8IHNldHRpbmdzLmlnbm9yZVRyYW5zZmVyTGltaXRVbnRpbCA+IG1vbWVudCgpLnVuaXgoKSB8fCBfLmludGVyc2VjdGlvbihtb2RlbC5nZXQoXCJvd25lcl9yb2xlc1wiKSwgW1widGVhY2hlclwiLCBcImZhY2lsaXRhdG9yXCJdKS5sZW5ndGgpICYmXG5cdFx0XHRyZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmFwaS50b2tlbnMudHJhbmNoZXMubGljZW5zZXMubGljZW5zZS5hc3NpZ24ucG9zdCwgdXNlcikpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBjb2x1bW5zID0gW1xuXHRcdFx0eyBuYW1lOiBcInRpdGxlXCIsIGxhYmVsOiBcIlByb2R1Y3RcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlLCB0b29sdGlwOiBcInRpdGxlXCIgfSxcblx0XHRcdHsgbmFtZTogXCJpbnN0YW5jZV9jb2RlXCIsIGxhYmVsOiBcIkxpY2Vuc2VcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiYm9va1wiLCBsYWJlbDogXCJVbml2ZXJzYWwgSURcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwidXNlcm5hbWVcIiwgbGFiZWw6IFwiVXNlcm5hbWVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwic3RhcnRkYXRlXCIsIGxhYmVsOiBcIlN0YXJ0IERhdGVcIiwgY2VsbDogU2VydmVyR3JpZC5Nb21lbnRDZWxsLmV4dGVuZCh7XG5cdFx0XHRcdGRpc3BsYXlGb3JtYXQ6IFwiREQgTU1NIFlZWVksIEhIOm1tOnNzIGFcIixcblx0XHRcdFx0ZGlzcGxheUluVVRDOiBmYWxzZSxcblx0XHRcdH0pLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJleHBpcmVzXCIsIGxhYmVsOiBcIkV4cGlyeVwiLCBjZWxsOiBTZXJ2ZXJHcmlkLk1vbWVudENlbGwuZXh0ZW5kKHtcblx0XHRcdFx0ZGlzcGxheUZvcm1hdDogXCJERCBNTU0gWVlZWSwgSEg6bW06c3MgYVwiLFxuXHRcdFx0XHRkaXNwbGF5SW5VVEM6IGZhbHNlLFxuXHRcdFx0fSksIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImdyb3VwX2NvdW50XCIsIGxhYmVsOiBcIkdyb3VwIENvdW50XCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImR1cmF0aW9uXCIsIGxhYmVsOiBcIkR1cmF0aW9uXCIsIGNlbGw6IFNlcnZlckdyaWQuRHVyYXRpb25DZWxsLmV4dGVuZCh7fSksIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImdyYWNlXCIsIGxhYmVsOiBcIkdyYWNlIFBlcmlvZFwiLCBjZWxsOiBTZXJ2ZXJHcmlkLkR1cmF0aW9uQ2VsbC5leHRlbmQoe30pLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJhc3NpZ25tZW50c19sZWZ0XCIsIGxhYmVsOiBcIkFzc2lnbm1lbnRzIExlZnRcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwidGFrZW5cIiwgbGFiZWw6IFwiSW4gVXNlXCIsIGNlbGw6IFNlcnZlckdyaWQuQm9vbGVhbkljb25DZWxsLmV4dGVuZCh7fSksIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcInJldm9rZWRcIiwgbGFiZWw6IFwiUmV2b2tlZFwiLCBjZWxsOiBTZXJ2ZXJHcmlkLkJvb2xlYW5JY29uQ2VsbC5leHRlbmQoe30pLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbGFiZWw6IFwiQWN0aW9uc1wiLCBjZWxsOiBuZXcgU2VydmVyR3JpZC5Ub29sYmFyQ2VsbCh7IHRvb2x0aXBzOiBbXG5cdFx0XHRcdHsgdGl0bGU6IFwiQ2hhbmdlbG9nXCIsIGljb246IFwiZmEtbGlzdC11bFwiIH0sXG5cdFx0XHRcdHsgdGl0bGU6IFwiVW5hc3NpZ25cIiwgaWNvbjogXCJmYS10aW1lc1wiLCBmaWx0ZXI6IHRoaXMuZmlsdGVyVW5hc3NpZ24uYmluZCh0aGlzKSB9LFxuXHRcdFx0XHR7IHRpdGxlOiBcIlRyYW5zZmVyXCIsIGljb246IFwiZmEtcmFuZG9tXCIsIGZpbHRlcjogdGhpcy5maWx0ZXJUcmFuc2Zlci5iaW5kKHRoaXMpIH0sXG5cdFx0XHRcdHsgdGl0bGU6IFwiQXNzaWduXCIsIGljb246IFwiZmEtc2hhcmVcIiwgZmlsdGVyOiB0aGlzLmZpbHRlckFzc2lnbi5iaW5kKHRoaXMpIH0sXG5cdFx0XHRdIH0pLCBlZGl0YWJsZTogZmFsc2UsIHNvcnRhYmxlOiBmYWxzZSB9LFxuXHRcdF07XG5cblx0XHR0aGlzLmdyaWQgPSBuZXcgU2VydmVyR3JpZCh7XG5cdFx0XHRlbDogdGhpcy51aS5ncmlkLFxuXHRcdFx0Y29sdW1uczogY29sdW1ucyxcblx0XHRcdGNvbGxlY3Rpb246IG5ldyBDb2xsZWN0aW9uKCksXG5cdFx0XHRjbGlja2FibGU6IGZhbHNlLFxuXHRcdFx0d2FpdEZvckZpbHRlcnM6IHRydWUsXG5cdFx0XHRjb3VudGVyOiB7XG5cdFx0XHRcdGVsZW1lbnQ6IHRoaXMudWkuY291bnRlcixcblx0XHRcdFx0dGVtcGxhdGU6IFwiVG9rZW5zICRzdGFydCAtICRlbmQgb2YgJHRvdGFsXCIsXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdGVsZW1lbnQ6IHRoaXMudWkucGFnaW5nLFxuXHRcdFx0fSxcblx0XHR9KTtcblxuXHRcdHRoaXMuYmluZEV2ZW50cyh0aGlzLmdyaWQuY29sbGVjdGlvbiwgdGhpcy5jb2xsZWN0aW9uRXZlbnRzKTtcblxuXHRcdGNvbnN0IHRleHRGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcInRleHRcIixcblx0XHRcdG5hbWU6IFwidGV4dEZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiVGV4dCBTZWFyY2hcIixcblx0XHRcdGRlYm91bmNlOiAyMDAsXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdGNvbnN0IHVzZXJGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcInVzZXJGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlVzZXJzXCIsXG5cdFx0XHRzZXJ2ZXI6IHtcblx0XHRcdFx0a2V5OiBcInVzZXJfaWRcIixcblx0XHRcdFx0dmFsdWU6IFwibmFtZVwiLFxuXHRcdFx0XHRmZXRjaDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FjYWNpYS91c2Vycy9nZXRVc2Vyc0xpc3RcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0cGFnZVNpemU6IDMwLFxuXHRcdFx0XHRpbmZpbml0ZTogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0fTtcblxuXHRcdGNvbnN0IGJvb2tGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcImJvb2tGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIkJvb2tzXCIsXG5cdFx0XHRzZXJ2ZXI6IHtcblx0XHRcdFx0a2V5OiBcImJvb2tfaWRcIixcblx0XHRcdFx0dmFsdWU6IFwidGl0bGVcIixcblx0XHRcdFx0ZmV0Y2g6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hY2FjaWEvYm9va3MvZ2V0U2VsZWN0cmFCb29rc1wiLFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRwYWdlU2l6ZTogMzAsXG5cdFx0XHRcdGluZmluaXRlOiB0cnVlLFxuXHRcdFx0fSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgZ3JvdXBGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcImdyb3VwRmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJHcm91cHNcIixcblx0XHRcdHNlcnZlcjoge1xuXHRcdFx0XHRrZXk6IFwiZ3JvdXBfaWRcIixcblx0XHRcdFx0dmFsdWU6IFwibmFtZVwiLFxuXHRcdFx0XHRmZXRjaDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FjYWNpYS9ncm91cHMvZ2V0U2VsZWN0cmFHcm91cHNcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0cGFnZVNpemU6IDMwLFxuXHRcdFx0XHRpbmZpbml0ZTogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0fTtcblxuXHRcdGNvbnN0IGhpZGVSZXZva2VkTGljZW5zZXMgPSB7XG5cdFx0XHR0eXBlOiBcInRvZ2dsZVwiLFxuXHRcdFx0bmFtZTogXCJoaWRlUmV2b2tlZExpY2Vuc2VzXCIsXG5cdFx0XHRsYWJlbDogXCJIaWRlIHJldm9rZWQgbGljZW5zZXNcIixcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHRcdGluaXRpYWxWYWx1ZTogKCkgPT4gW2ZhbHNlXSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgaGlkZUFzc2lnbmVkTGljZW5zZXMgPSB7XG5cdFx0XHR0eXBlOiBcInRvZ2dsZVwiLFxuXHRcdFx0bmFtZTogXCJoaWRlQXNzaWduZWRMaWNlbnNlc1wiLFxuXHRcdFx0bGFiZWw6IFwiSGlkZSBhc3NpZ25lZCBsaWNlbnNlc1wiLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdFx0aW5pdGlhbFZhbHVlOiAoKSA9PiBbZmFsc2VdLFxuXHRcdH07XG5cblx0XHRjb25zdCBmaWx0ZXJMaXN0ID0gW3RleHRGaWx0ZXIsIHVzZXJGaWx0ZXIsIGJvb2tGaWx0ZXIsIGdyb3VwRmlsdGVyLCBoaWRlUmV2b2tlZExpY2Vuc2VzLCBoaWRlQXNzaWduZWRMaWNlbnNlc107XG5cblx0XHR0aGlzLnVpLmZpbHRlckJhci5wcmVwZW5kKHRoaXMuZ3JpZC5maWx0ZXIoe1xuXHRcdFx0ZmlsdGVyQ29udGFpbmVyOiB0aGlzLnVpLmZpbHRlckJhcixcblx0XHRcdGZpbHRlcnM6IGZpbHRlckxpc3QsXG5cdFx0XHRkZWZhdWx0RmlsdGVyczogW1widGV4dEZpbHRlclwiLCBcInVzZXJGaWx0ZXJcIiwgXCJib29rRmlsdGVyXCIsIFwiZ3JvdXBGaWx0ZXJcIiwgXCJoaWRlUmV2b2tlZExpY2Vuc2VzXCIsIFwiaGlkZUFzc2lnbmVkTGljZW5zZXNcIl0sXG5cdFx0fSkucmVuZGVyKCkuZWwpO1xuXHR9LFxuXG5cdGFzc2lnbjogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRsZXQgbXNnID0gYDxwPlBsZWFzZSBjaG9vc2UgdGhlIHBlcnNvbiB0byBhc3NpZ24gdGhpcyBsaWNlbnNlIHRvLjwvcD5cblx0XHRcdDxwPjxzZWxlY3QvPjwvcD5gO1xuXG5cdFx0aWYgKG1vZGVsLmdldChcInN0YXJ0ZGF0ZVwiKSA9PT0gbnVsbCkge1xuXHRcdFx0bXNnICs9IGA8cD5Bc3NpZ25pbmcgdGhpcyBsaWNlbnNlIGZvciB0aGUgZmlyc3QgdGltZSB3aWxsIGJlZ2luIHRoZSBsaWNlbnNlIGxpZmV0aW1lLiBUaGUgbGljZW5zZSB3aWxsIHRoZW4gZXhwaXJlIG9uXG5cdFx0XHQ8c3Ryb25nPiR7bW9tZW50KCkuYWRkKG1vbWVudC5kdXJhdGlvbihtb2RlbC5nZXQoXCJkdXJhdGlvblwiKSkpLmFkZChtb21lbnQuZHVyYXRpb24obW9kZWwuZ2V0KFwiZ3JhY2VcIikpKS5mb3JtYXQoXCJNTU1NIERvIFlZWVksIEhIOm1tIGFcIil9PC9zdHJvbmc+XG5cdFx0XHQgPGVtPndoZXRoZXIgb3Igbm90IGl0IGNvbnRpbnVlcyB0byBiZSB1c2VkPC9lbT4uYDtcblx0XHR9XG5cblx0XHR0aGlzLm1vZGFsID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0dGl0bGU6IFwiPHNwYW4gY2xhc3M9J2ZhbCBmYS1zaGFyZScvPiBBc3NpZ24gVG9rZW5cIixcblx0XHRcdGJvZHk6IG1zZyxcblx0XHRcdHBlcnNpc3Q6IHRydWUsXG5cdFx0fSk7XG5cblx0XHRjb25zdCBvbmx5VGVhY2hlciA9ICFtb2RlbC5nZXQoXCJ0cmFuc2ZlcnNfbGVmdFwiKSAmJiBfLmludGVyc2VjdGlvbihtb2RlbC5nZXQoXCJvd25lcl9yb2xlc1wiKSwgW1widGVhY2hlclwiLCBcImZhY2lsaXRhdG9yXCJdKS5sZW5ndGggJiYgIShzZXR0aW5ncy5pZ25vcmVUcmFuc2ZlckxpbWl0VW50aWwgPiBtb21lbnQoKS51bml4KCkpO1xuXG5cdFx0Y29uc3QgdXNlciA9IG5ldyBTZWxlY3RyYSh7XG5cdFx0XHRzZXJ2ZXI6IHtcblx0XHRcdFx0ZmV0Y2g6IGAke3NldHRpbmdzLnVybFJvb3R9L2FjYWNpYS91c2Vycy9nZXRVc2Vyc0xpc3Q/c2tpcFJlc3RyaWN0ZWQ9dHJ1ZSZvbmx5VGVhY2hlcj0ke29ubHlUZWFjaGVyfWAsXG5cdFx0XHRcdGRlbGF5TG9hZDogdHJ1ZSxcblx0XHRcdFx0bWFwOiB4ID0+ICh7XG5cdFx0XHRcdFx0a2V5OiB4LnVzZXJfaWQsXG5cdFx0XHRcdFx0dmFsdWU6IHguZmlyc3RuYW1lICsgXCIgXCIgKyB4LnN1cm5hbWUgKyBcIiAoXCIgKyB4LnVzZXJuYW1lICsgXCIpXCIsXG5cdFx0XHRcdH0pLFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRwYWdlU2l6ZTogMjAsXG5cdFx0XHRcdGluZmluaXRlOiB0cnVlLFxuXHRcdFx0fSxcblx0XHRcdHBsYWNlaG9sZGVyOiBcIkNob29zZSBhIHVzZXIgdG8gYXNzaWduIHRoaXMgdG9rZW4gdG9cIixcblx0XHRcdGRkSG9zdDogXCIubW9kYWwtY29udGFpbmVyXCIsXG5cdFx0fSk7XG5cblx0XHR0aGlzLm1vZGFsLm9uKFwiYnV0dG9uOm9rXCIsICgpID0+IHtcblx0XHRcdGlmICghdXNlci52YWwoKSlcblx0XHRcdFx0cmV0dXJuIHRoaXMubW9kYWwuc2hvd0Vycm9yKFwiWW91IG11c3QgY2hvb3NlIGEgdXNlciB0byBhc3NpZ24gdGhlIGxpY2Vuc2UgdG9cIik7XG5cblx0XHRcdCQuYWpheCh7XG5cdFx0XHRcdG1ldGhvZDogXCJQT1NUXCIsXG5cdFx0XHRcdHVybDogYCR7c2V0dGluZ3MudXJsUm9vdH0vYXBpLzEuMC90b2tlbnMvdHJhbmNoZXMvbGljZW5zZXMvJHttb2RlbC5pZH0vYXNzaWduYCxcblx0XHRcdFx0ZGF0YToge1xuXHRcdFx0XHRcdHVzZXI6IHVzZXIudmFsKCksXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHN1Y2Nlc3M6IHRoaXMuYXNzaWduU3VjY2Vzcy5iaW5kKHRoaXMsIG1vZGVsKSxcblx0XHRcdFx0ZXJyb3I6IHRoaXMuYXNzaWduRXJyb3IuYmluZCh0aGlzLCBtb2RlbCksXG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdHRoaXMubW9kYWwuc2hvdygpO1xuXG5cdFx0dXNlci5zaG93KHsgZWw6ICQoXCJzZWxlY3RcIiwgdGhpcy5tb2RhbC4kZWwpIH0pO1xuXHR9LFxuXG5cdGFzc2lnblN1Y2Nlc3M6IGZ1bmN0aW9uKG1vZGVsLCBkYXRhKSB7XG5cdFx0dGhpcy5tb2RhbC5kZXN0cm95KCk7XG5cblx0XHRtb2RlbC5zZXQoZGF0YSk7XG5cdFx0bW9kZWwudHJpZ2dlcihcImdyaWQ6cmVuZGVyXCIpO1xuXHR9LFxuXG5cdGFzc2lnbkVycm9yOiBmdW5jdGlvbihtb2RlbCwgeGhyKSB7XG5cdFx0Y29uc3QgYW5zd2VyID0gQXBwLnBhcnNlUmVzcG9uc2UoeGhyKTtcblx0XHR0aGlzLm1vZGFsLnNob3dFcnJvcihcIkFzc2lnbiBmYWlsZWQ6IFwiICsgKGFuc3dlci5kZXRhaWwgfHwgYW5zd2VyLmluZm8pKTtcblx0fSxcblxuXHR0cmFuc2ZlcjogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRjb25zdCBtc2cgPSBgPHA+UGxlYXNlIGNob29zZSB0aGUgcGVyc29uIHRvIHRyYW5zZmVyIHRoaXMgbGljZW5zZSB0by48L3A+XG5cdFx0XHQ8cD48c2VsZWN0Lz48L3A+YDtcblxuXHRcdHRoaXMubW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmFsIGZhLXNoYXJlJy8+IFRyYW5zZmVyIFRva2VuXCIsXG5cdFx0XHRib2R5OiBtc2csXG5cdFx0XHRwZXJzaXN0OiB0cnVlLFxuXHRcdH0pO1xuXG5cdFx0Y29uc3Qgb25seVRlYWNoZXIgPSAhbW9kZWwuZ2V0KFwidHJhbnNmZXJzX2xlZnRcIikgJiYgXy5pbnRlcnNlY3Rpb24obW9kZWwuZ2V0KFwib3duZXJfcm9sZXNcIiksIFtcInRlYWNoZXJcIiwgXCJmYWNpbGl0YXRvclwiXSkubGVuZ3RoICYmICEoc2V0dGluZ3MuaWdub3JlVHJhbnNmZXJMaW1pdFVudGlsID4gbW9tZW50KCkudW5peCgpKTtcblxuXHRcdGNvbnN0IHVzZXIgPSBuZXcgU2VsZWN0cmEoe1xuXHRcdFx0c2VydmVyOiB7XG5cdFx0XHRcdGZldGNoOiBgJHtzZXR0aW5ncy51cmxSb290fS9hY2FjaWEvdXNlcnMvZ2V0VXNlcnNMaXN0P3NraXBSZXN0cmljdGVkPXRydWUmb25seVRlYWNoZXI9JHtvbmx5VGVhY2hlcn1gLFxuXHRcdFx0XHRkZWxheUxvYWQ6IHRydWUsXG5cdFx0XHRcdG1hcDogeCA9PiAoe1xuXHRcdFx0XHRcdGtleTogeC51c2VyX2lkLFxuXHRcdFx0XHRcdHZhbHVlOiB4LmZpcnN0bmFtZSArIFwiIFwiICsgeC5zdXJuYW1lICsgXCIgKFwiICsgeC51c2VybmFtZSArIFwiKVwiLFxuXHRcdFx0XHR9KSxcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0cGFnZVNpemU6IDIwLFxuXHRcdFx0XHRpbmZpbml0ZTogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0XHRwbGFjZWhvbGRlcjogXCJDaG9vc2UgYSB1c2VyIHRvIHRyYW5zZmVyIHRoaXMgdG9rZW4gdG9cIixcblx0XHRcdGRkSG9zdDogXCIubW9kYWwtY29udGFpbmVyXCIsXG5cdFx0fSk7XG5cblx0XHR0aGlzLm1vZGFsLm9uKFwiYnV0dG9uOm9rXCIsICgpID0+IHtcblx0XHRcdGlmICghdXNlci52YWwoKSlcblx0XHRcdFx0cmV0dXJuIHRoaXMubW9kYWwuc2hvd0Vycm9yKFwiWW91IG11c3QgY2hvb3NlIGEgdXNlciB0byB0cmFuc2ZlciB0aGUgbGljZW5zZSB0b1wiKTtcblxuXHRcdFx0JC5hamF4KHtcblx0XHRcdFx0bWV0aG9kOiBcIlBPU1RcIixcblx0XHRcdFx0dXJsOiBgJHtzZXR0aW5ncy51cmxSb290fS9hcGkvMS4wL3Rva2Vucy90cmFuY2hlcy9saWNlbnNlcy8ke21vZGVsLmlkfS90cmFuc2ZlcmAsXG5cdFx0XHRcdGRhdGE6IHtcblx0XHRcdFx0XHR1c2VyOiB1c2VyLnZhbCgpLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRzdWNjZXNzOiB0aGlzLmFzc2lnblN1Y2Nlc3MuYmluZCh0aGlzLCBtb2RlbCksXG5cdFx0XHRcdGVycm9yOiB0aGlzLmFzc2lnbkVycm9yLmJpbmQodGhpcywgbW9kZWwpLFxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLm1vZGFsLnNob3coKTtcblxuXHRcdHVzZXIuc2hvdyh7IGVsOiAkKFwic2VsZWN0XCIsIHRoaXMubW9kYWwuJGVsKSB9KTtcblx0fSxcblxuXHR0cmFuc2ZlclN1Y2Nlc3M6IGZ1bmN0aW9uKG1vZGVsLCBkYXRhKSB7XG5cdFx0dGhpcy5tb2RhbC5kZXN0cm95KCk7XG5cblx0XHRtb2RlbC5zZXQoZGF0YSk7XG5cdFx0bW9kZWwudHJpZ2dlcihcImdyaWQ6cmVuZGVyXCIpO1xuXHR9LFxuXG5cdHRyYW5zZmVyRXJyb3I6IGZ1bmN0aW9uKG1vZGVsLCB4aHIpIHtcblx0XHRjb25zdCBhbnN3ZXIgPSBBcHAucGFyc2VSZXNwb25zZSh4aHIpO1xuXHRcdHRoaXMubW9kYWwuc2hvd0Vycm9yKFwiVHJhbnNmZXIgZmFpbGVkOiBcIiArIChhbnN3ZXIuZGV0YWlsIHx8IGFuc3dlci5pbmZvKSk7XG5cdH0sXG5cblx0dW5hc3NpZ246IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0dGhpcy5tb2RhbCA9IG5ldyBTbWFsbE1vZGFsKHtcblx0XHRcdHdhcm5pbmc6IHRydWUsXG5cdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmFsIGZhLXJlbW92ZScvPiBVbmFzc2lnbiBUb2tlblwiLFxuXHRcdFx0Ym9keTogYDxwPkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byB1bmFzc2lnbiB0aGlzIHRva2VuPyBJdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgcGVyc29uIHVzaW5nIGl0LjwvcD5cblx0XHRcdFx0PHA+SWYgdGhlcmUgYXJlIG5vIHRyYW5zZmVycyBsZWZ0IGZvciB0aGlzIGxpY2Vuc2UsIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIHJlLWFzc2lnbiBpdCB0byBhbnlvbmUgaW4gZnV0dXJlLjwvcD5gLFxuXHRcdFx0cGVyc2lzdDogdHJ1ZSxcblx0XHR9KTtcblxuXHRcdHRoaXMubW9kYWwub24oXCJidXR0b246b2tcIiwgKCkgPT4ge1xuXHRcdFx0JC5hamF4KHtcblx0XHRcdFx0bWV0aG9kOiBcIkRFTEVURVwiLFxuXHRcdFx0XHR1cmw6IGAke3NldHRpbmdzLnVybFJvb3R9L2FwaS8xLjAvdG9rZW5zL3RyYW5jaGVzL2xpY2Vuc2VzLyR7bW9kZWwuaWR9YCxcblx0XHRcdFx0c3VjY2VzczogdGhpcy51bmFzc2lnblN1Y2Nlc3MuYmluZCh0aGlzLCBtb2RlbCksXG5cdFx0XHRcdGVycm9yOiB0aGlzLnVuYXNzaWduRXJyb3IuYmluZCh0aGlzLCBtb2RlbCksXG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdHRoaXMubW9kYWwuc2hvdygpO1xuXHR9LFxuXG5cdHVuYXNzaWduU3VjY2VzczogZnVuY3Rpb24obW9kZWwsIGRhdGEpIHtcblx0XHR0aGlzLm1vZGFsLmRlc3Ryb3koKTtcblxuXHRcdG1vZGVsLnNldChkYXRhKTtcblx0XHRtb2RlbC50cmlnZ2VyKFwiZ3JpZDpyZW5kZXJcIik7XG5cdH0sXG5cblx0dW5hc3NpZ25FcnJvcjogZnVuY3Rpb24obW9kZWwsIHhocikge1xuXHRcdGNvbnN0IGFuc3dlciA9IEFwcC5wYXJzZVJlc3BvbnNlKHhocik7XG5cdFx0dGhpcy5tb2RhbC5zaG93RXJyb3IoXCJVbmFzc2lnbm1lbnQgZmFpbGVkOiBcIiArIChhbnN3ZXIuZGV0YWlsIHx8IGFuc3dlci5pbmZvKSk7XG5cdH0sXG5cblx0Y2hhbmdlbG9nOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdGNvbnN0IGNoYW5nZWxvZyA9IG5ldyBDaGFuZ2Vsb2coeyBtb2RlbCB9KTtcblxuXHRcdGNoYW5nZWxvZy5zaG93KCk7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar rester = require(\"rester\");\nvar qs = require(\"querystring\");\n\nvar App = require(\"../../index\");\n\nvar ServerGrid = require(\"../../lib/serverGrid\");\nvar settings = require(\"app-settings\");\nvar gradeMap = require(\"../../lib/gradeMap\");\nvar SimpleMenu = require(\"../../lib/simpleMenu\");\nvar SmallModal = require(\"../../lib/smallModal\");\nvar Selectra = require(\"../../lib/selectra\");\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar TokenModel = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"_id\",\n\n\turlRoot: function urlRoot() {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\t\treturn settings.urlRoot + \"/api/1.0/users/\" + encodeURIComponent(user.username) + \"/tokens\";\n\t}\n});\n\nvar Changelog = require(\"./trancheChanges\");\n\nvar Model = Backbone.Epoxy.Model.extend({\n\tdefaults: {},\n\tidAttribute: \"tranche_token_id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/tokens/tranches\";\n\t},\n\n\tcomputeds: {\n\t\tgroupCount: function groupCount() {\n\t\t\treturn this.get(\"groups\").length;\n\t\t},\n\t\tactivated: function activated() {\n\t\t\treturn !this.get(\"deactivated\");\n\t\t}\n\t}\n});\n\nvar Collection = Backbone.PageableCollection.extend({\n\tmodel: Model,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/tokens/tranches\";\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"content tranche-tokens\",\n\n\ttemplate: require(\"../templates/manageTokens.nunj\"),\n\n\tui: {\n\t\tfilterBar: \".ops-bar .filters\",\n\t\tcounter: \".ops-bar .counter\",\n\t\tdownloadList: \"div.downloadList\",\n\t\tuploader: \".upload\",\n\t\tpaging: \".paging\",\n\t\tgrid: \"div.grid\",\n\n\t\tadd: \"div.activate\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.add\": \"addToken\",\n\t\t\"click @ui.downloadList\": \"showDownloads\"\n\t},\n\n\tcollectionEvents: {\n\t\t\"toolbar:click:deactivate\": \"deactivateToken\",\n\t\t\"toolbar:click:activate\": \"activateToken\",\n\t\t\"toolbar:click:changelog\": \"changelog\"\n\t},\n\n\tshowDownloads: function showDownloads(evt) {\n\t\tevt.stopPropagation();\n\n\t\tvar list = new SimpleMenu({\n\t\t\tanchor: this.ui.downloadList,\n\t\t\tside: \"left\",\n\t\t\tstructure: [{ closeOnClick: true, elements: [{ text: \"Export list of tokens\", id: \"tokens\" }, { text: \"Export token summary\", id: \"summary\" }, { text: \"Export required licenses\", id: \"required\" }] }]\n\t\t});\n\t\tlist.show();\n\n\t\tthis.listenTo(list, \"clicked:tokens\", this.downloadList.bind(this));\n\t\tthis.listenTo(list, \"clicked:summary\", this.downloadSummary.bind(this));\n\t\tthis.listenTo(list, \"clicked:required\", this.downloadRequired.bind(this));\n\t},\n\n\tfilterDeactivate: function filterDeactivate(model) {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\treturn !settings.fcClient && !model.get(\"deactivated\") && !model.get(\"revoked\") && model.get(\"book_id\") && rester.hasAccess(rester.p.tranches.deactivate, user) && rester.hasAccess(rester.p.api.tokens.tranches.activation.delete, user);\n\t},\n\n\tfilterActivate: function filterActivate(model) {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\treturn !settings.fcClient && model.get(\"deactivated\") && !model.get(\"revoked\") && model.get(\"book_id\") && rester.hasAccess(rester.p.api.tokens.tranches.activation.put, user);\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"title\", label: \"Product\", cell: \"string\", editable: false, tooltip: \"title\" }, { name: \"book\", label: \"Universal ID\", cell: \"string\", editable: false }, { name: \"isbn\", label: \"ISBN\", cell: \"string\", editable: false }, { name: \"created\", label: \"Created\", cell: ServerGrid.MomentCell.extend({\n\t\t\t\tmodelInUnixTimestamp: true,\n\t\t\t\tdisplayFormat: \"DD MMM YYYY, HH:mm:ss a\",\n\t\t\t\tdisplayInUTC: false\n\t\t\t}), editable: false }, { name: \"groupCount\", label: \"Groups\", cell: \"string\", editable: false }, { name: \"revoked\", label: \"Revoked?\", cell: ServerGrid.BooleanIconCell.extend({}), editable: false }, { name: \"activated\", label: \"Activated?\", cell: ServerGrid.BooleanIconCell.extend({}), editable: false }, { name: \"active_licenses\", label: \"Licenses\", cell: \"string\", editable: false }, { name: \"in_use\", label: \"# In Use\", cell: \"string\", editable: false }, { name: \"expired\", label: \"# Expired\", cell: \"string\", editable: false }, { name: \"owned\", label: \"# Owned\", cell: \"string\", editable: false }, { name: \"consumed\", label: \"# Consumed\", cell: \"string\", editable: false }, { name: \"duration\", label: \"Duration\", cell: ServerGrid.DurationCell.extend({}), editable: false }, { name: \"grace\", label: \"Grace Period\", cell: ServerGrid.DurationCell.extend({}), editable: false }, { label: \"Actions\", cell: new ServerGrid.ToolbarCell({ tooltips: [{ title: \"Changelog\", icon: \"fa-list-ul\" }, { title: \"Deactivate\", icon: \"fa-times-circle\", filter: this.filterDeactivate.bind(this) }, { title: \"Activate\", icon: \"fa-check-circle\", filter: this.filterActivate.bind(this) }] }), editable: false, sortable: false }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new Collection(),\n\t\t\tclickable: true,\n\t\t\twaitForFilters: true,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counter,\n\t\t\t\ttemplate: \"Tokens $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tthis.bindEvents(this.grid.collection, this.collectionEvents);\n\n\t\tthis.listenTo(this.grid, \"row:clicked\", this.assignToGroup.bind(this));\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar hideUsedTokens = {\n\t\t\ttype: \"toggle\",\n\t\t\tname: \"hideUsedTokens\",\n\t\t\tlabel: \"Hide used tokens\",\n\t\t\tserver: true,\n\t\t\tinitialValue: function initialValue() {\n\t\t\t\treturn [true];\n\t\t\t}\n\t\t};\n\n\t\tvar hideRevokedTokens = {\n\t\t\ttype: \"toggle\",\n\t\t\tname: \"hideRevokedTokens\",\n\t\t\tlabel: \"Hide revoked tokens\",\n\t\t\tserver: true,\n\t\t\tinitialValue: function initialValue() {\n\t\t\t\treturn [true];\n\t\t\t}\n\t\t};\n\n\t\tvar hideExpiredTokens = {\n\t\t\ttype: \"toggle\",\n\t\t\tname: \"hideExpiredTokens\",\n\t\t\tlabel: \"Hide expired tokens\",\n\t\t\tserver: true,\n\t\t\tinitialValue: function initialValue() {\n\t\t\t\treturn [true];\n\t\t\t}\n\t\t};\n\n\t\tvar languageFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"languageFilter\",\n\t\t\tlabel: \"Language\",\n\t\t\tcategories: [{ items: settings.languageList }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar subjectFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"subjectFilter\",\n\t\t\tlabel: \"Subject\",\n\t\t\tserver: {\n\t\t\t\tkey: \"subject_id\",\n\t\t\t\tvalue: \"subject\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/subjects\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\n\t\tvar gradeFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"gradeFilter\",\n\t\t\tlabel: \"Year of Study\",\n\t\t\tserver: true,\n\t\t\tcategories: _.map(settings.gradeList, function (val, key) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: key,\n\t\t\t\t\titems: _.reduce(val.sort(function (a, b) {\n\t\t\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t\t\t}), function (sum, num) {\n\t\t\t\t\t\tsum.push({ name: num.value, label: num.name });return sum;\n\t\t\t\t\t}, [])\n\t\t\t\t};\n\t\t\t})\n\t\t};\n\n\t\tvar formatFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"formatFilter\",\n\t\t\tlabel: \"Format\",\n\t\t\tcategories: [{ items: { mpdf: \"PDF\", mpub: \"EPUB\" } }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar pubFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"pubFilter\",\n\t\t\tlabel: \"Publisher\",\n\t\t\tserver: {\n\t\t\t\tkey: \"publisher_id\",\n\t\t\t\tvalue: \"fullname\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/publishers?dummy=false&active=true\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\n\t\tvar filterList = [textFilter, hideUsedTokens, hideRevokedTokens, hideExpiredTokens, languageFilter, subjectFilter, gradeFilter, formatFilter, pubFilter];\n\n\t\tthis.ui.filterBar.prepend(this.grid.filter({\n\t\t\tfilterContainer: this.ui.filterBar,\n\t\t\tfilters: filterList,\n\t\t\tdefaultFilters: [\"textFilter\", \"hideUsedTokens\", \"hideRevokedTokens\", \"hideExpiredTokens\"]\n\t\t}).render().el);\n\t},\n\n\tdeactivateToken: function deactivateToken(model) {\n\t\tvar _this = this;\n\n\t\tthis.modal = new SmallModal({\n\t\t\twarning: true,\n\t\t\ttitle: \"<span class='fal fa-times'/> Deactivate Token\",\n\t\t\tbody: \"<p>This will deactivate the chosen token. Deactivated tokens and all associated licenses will not be usable.</p>\",\n\t\t\tpersist: true\n\t\t});\n\n\t\tthis.modal.on(\"button:ok\", function () {\n\t\t\t$.ajax({\n\t\t\t\tmethod: \"DELETE\",\n\t\t\t\turl: settings.urlRoot + \"/api/1.0/tokens/tranches/activation/\" + model.get(\"_id\"),\n\t\t\t\tsuccess: _this.deactivationSuccess.bind(_this, model),\n\t\t\t\terror: _this.deactivationError.bind(_this, model)\n\t\t\t});\n\t\t});\n\n\t\tthis.modal.show();\n\t},\n\n\tdeactivationSuccess: function deactivationSuccess(model) {\n\t\tthis.modal.destroy();\n\n\t\tmodel.set({ deactivated: true });\n\t\tmodel.initComputeds();\n\t\tmodel.trigger(\"grid:render\");\n\t},\n\n\tdeactivationError: function deactivationError(model, xhr) {\n\t\tvar answer = App.parseResponse(xhr);\n\t\tthis.modal.showError(\"Deactivation failed: \" + (answer.detail || answer.info));\n\t},\n\n\tactivateToken: function activateToken(model) {\n\t\tvar _this2 = this;\n\n\t\tthis.modal = new SmallModal({\n\t\t\ttitle: \"<span class='fal fa-check'/> Activate Token\",\n\t\t\tbody: \"<p>This will activate the chosen token.</p>\",\n\t\t\tpersist: true\n\t\t});\n\n\t\tthis.modal.on(\"button:ok\", function () {\n\t\t\t$.ajax({\n\t\t\t\tmethod: \"PUT\",\n\t\t\t\turl: settings.urlRoot + \"/api/1.0/tokens/tranches/activation/\" + model.get(\"_id\"),\n\t\t\t\tsuccess: _this2.activationSuccess.bind(_this2, model),\n\t\t\t\terror: _this2.activationError.bind(_this2, model)\n\t\t\t});\n\t\t});\n\n\t\tthis.modal.show();\n\t},\n\n\tactivationSuccess: function activationSuccess(model) {\n\t\tthis.modal.destroy();\n\n\t\tmodel.set({ deactivated: false });\n\t\tmodel.initComputeds();\n\t\tmodel.trigger(\"grid:render\");\n\t},\n\n\tactivationError: function activationError(model, xhr) {\n\t\tvar answer = App.parseResponse(xhr);\n\t\tthis.modal.showError(\"Deactivation failed: \" + (answer.detail || answer.info));\n\t},\n\n\tassignToGroup: function assignToGroup(model) {\n\t\tvar _this3 = this;\n\n\t\tif (settings.fcClient || model.get(\"deactivated\") || !model.get(\"book_id\")) return;\n\n\t\tthis.modal = new SmallModal({\n\t\t\ttitle: \"<span class='fal fa-share'/> Change Group Assignment\",\n\t\t\tbody: (model.get(\"revoked\") ? \"<p><strong>This token is revoked; it no longer has any effect, and cannot be edited either.\\n\\t\\t\\t\\tFields are shown for reference purposes only.</strong></p>\" : \"\") + \"\\n\\t\\t\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t\\t\\t<label>Book name</label>\\n\\t\\t\\t\\t\\t\\t<div class=\\\"pre-title\\\"><strong>\" + model.get(\"title\") + \"</strong></div><br/>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"large-3 columns\\\">\\n\\t\\t\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t\\t\\tPublisher\\n\\t\\t\\t\\t\\t\\t\\t<div class=\\\"textual bold\\\">\" + (model.get(\"publisher\") || \"(unknown)\") + \"</div>\\n\\t\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t\\t<div class=\\\"large-3 columns\\\">\\n\\t\\t\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t\\t\\tSubject\\n\\t\\t\\t\\t\\t\\t\\t<div class=\\\"textual bold\\\">\" + model.get(\"subject\") + \"</div>\\n\\t\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t\\t<div class=\\\"large-3 columns\\\">\\n\\t\\t\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t\\t\\tYear of Study\\n\\t\\t\\t\\t\\t\\t\\t<div class=\\\"textual bold\\\">\" + gradeMap.codeToHumanValue(model.get(\"grade\")) + \"</div>\\n\\t\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t\\t</div>\\n\\n\\t\\t\\t\\t\\t<div class=\\\"large-3 columns\\\">\\n\\t\\t\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t\\t\\tISBN\\n\\t\\t\\t\\t\\t\\t\\t<div class=\\\"textual bold\\\">\" + model.get(\"isbn\") + \"</div>\\n\\t\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t<hr>\\n\\t\\t\\t\\t<p>Assigning this token to one or more group will give out licenses to all the members of the groups until all available licenses are consumed,\\n\\t\\t\\t\\tor all members of the group have a license.</p>\\n\\t\\t\\t\\t<p><select \" + (model.get(\"revoked\") ? \"disabled\" : \"\") + \"/></p>\\n\\t\\t\\t\\t<p>Limit the number of licenses that will be auto-issued at a time to this number:\\n\\t\\t\\t\\t\\t<input type=\\\"number\\\" \" + (model.get(\"revoked\") ? \"disabled\" : \"\") + \" value=\\\"\" + model.get(\"licenseLimit\") + \"\\\" min=\\\"0\\\" max=\\\"999999999\\\"\\n\\t\\t\\t\\t\\t\\tname=\\\"licenseLimit\\\" placeholder=\\\"License Assignation Limit\\\"></p>\\n\\t\\t\\t\\t<p>If a user already has a token, or has personally bought the book, they will not be assigned a new one.</p>\",\n\t\t\tpersist: true,\n\t\t\thideButtons: model.get(\"revoked\") ? [\"cancel\"] : []\n\t\t});\n\n\t\tvar group = new Selectra({\n\t\t\tmultiple: true,\n\t\t\tserver: {\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/groups\",\n\t\t\t\tdelayLoad: true,\n\t\t\t\tkey: \"group_id\",\n\t\t\t\tvalue: \"name\",\n\t\t\t\tdefault: {\n\t\t\t\t\tfetch: settings.urlRoot + \"/acacia/tranches/\" + model.id + \"/groups\"\n\t\t\t\t},\n\t\t\t\tparams: {\n\t\t\t\t\textendedName: true\n\t\t\t\t}\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 20,\n\t\t\t\tinfinite: true\n\t\t\t},\n\t\t\tplaceholder: \"Choose the groups to assign this token to\",\n\t\t\tddHost: \".modal-container\"\n\t\t});\n\n\t\tthis.modal.on(\"button:ok\", function () {\n\t\t\tif (model.get(\"revoked\")) return _this3.modal.destroy();\n\n\t\t\tvar g = _.map(group.getSelected() || [], function (x) {\n\t\t\t\treturn x.group_id;\n\t\t\t});\n\t\t\tif (!g.length) g = \"[]\";\n\n\t\t\tvar c = parseInt($(\"input[type='number']\", _this3.modal.el).val(), 10);\n\n\t\t\tvar data = { groups: g };\n\t\t\tif (c || c === 0) data.cutoff = c;\n\n\t\t\t$.ajax({\n\t\t\t\tmethod: \"PUT\",\n\t\t\t\turl: settings.urlRoot + \"/api/1.0/tokens/tranches/\" + model.get(\"_id\") + \"/groups/assign\",\n\t\t\t\tdata: data,\n\t\t\t\tsuccess: _this3.assignSuccess.bind(_this3, model),\n\t\t\t\terror: _this3.assignError.bind(_this3, model)\n\t\t\t});\n\t\t});\n\n\t\tthis.modal.show();\n\n\t\tgroup.show({ el: $(\"select\", this.modal.$el) });\n\t},\n\n\tassignSuccess: function assignSuccess(model, data) {\n\t\tthis.modal.destroy();\n\n\t\tmodel.set(data);\n\t\tmodel.initComputeds();\n\t\tmodel.trigger(\"grid:render\");\n\t},\n\n\tassignError: function assignError(model, xhr) {\n\t\tvar answer = App.parseResponse(xhr);\n\t\tthis.modal.showError(\"Assignation failed: \" + (answer.detail || answer.info));\n\t},\n\n\tchangelog: function changelog(model) {\n\t\tvar changelog = new Changelog({ model: model });\n\n\t\tchangelog.show();\n\t},\n\n\tdownloadList: function downloadList() {\n\t\tvar params = this.grid.filter.getServerFilters();\n\t\twindow.open(settings.urlRoot + \"/api/1.0/tokens/tranches/lists/tokens?\" + qs.stringify(params));\n\t},\n\n\tdownloadSummary: function downloadSummary() {\n\t\t//const params = this.grid.filter.getServerFilters();\n\t\twindow.open(settings.urlRoot + \"/api/1.0/tokens/tranches/lists/summary\");\n\t},\n\n\tdownloadRequired: function downloadRequired() {\n\t\t//const params = this.grid.filter.getServerFilters();\n\t\twindow.open(settings.urlRoot + \"/api/1.0/tokens/tranches/lists/required\");\n\t},\n\n\taddToken: function addToken(evt) {\n\t\tvar _this4 = this;\n\n\t\tevt.stopPropagation();\n\n\t\tvar modal = new SmallModal({\n\t\t\ttitle: \"<span class='fal fa-key'/> Activate A New Token\",\n\t\t\tbody: \"<p>Enter the token below.</p><p><textarea rows='8'></textarea></p>\",\n\t\t\tpersist: true\n\t\t});\n\n\t\tvar tokenSuccess = function tokenSuccess() {\n\t\t\tmodal.destroy();\n\t\t};\n\n\t\tvar tokenError = function tokenError(model, xhr) {\n\t\t\tvar answer = App.parseResponse(xhr);\n\t\t\treturn modal.enableButtons().hideSpinner().showError(answer.detail || answer.info);\n\t\t};\n\n\t\tmodal.on(\"button:ok\", function () {\n\t\t\tvar token = $(\"textarea\", modal.el).val();\n\t\t\tif (!token) return modal.enableButtons().hideSpinner().showError(\"No token provided\");\n\n\t\t\tvar model = new TokenModel({ token: token });\n\n\t\t\tmodel.save(null, { wait: true, success: tokenSuccess.bind(_this4), error: tokenError.bind(_this4) });\n\t\t});\n\n\t\tmodal.show();\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1hbmFnZVRva2Vucy5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCIkIiwiXyIsInJlc3RlciIsInFzIiwiQXBwIiwiU2VydmVyR3JpZCIsInNldHRpbmdzIiwiZ3JhZGVNYXAiLCJTaW1wbGVNZW51IiwiU21hbGxNb2RhbCIsIlNlbGVjdHJhIiwicmFkaW8iLCJSYWRpbyIsImNoYW5uZWwiLCJUb2tlbk1vZGVsIiwiRXBveHkiLCJNb2RlbCIsImV4dGVuZCIsImlkQXR0cmlidXRlIiwidXJsUm9vdCIsInVzZXIiLCJyZXF1ZXN0IiwiRXZlbnRzIiwiUmVxdWVzdHMiLCJDdXJyZW50VXNlciIsImVuY29kZVVSSUNvbXBvbmVudCIsInVzZXJuYW1lIiwiQ2hhbmdlbG9nIiwiZGVmYXVsdHMiLCJjb21wdXRlZHMiLCJncm91cENvdW50IiwiZ2V0IiwibGVuZ3RoIiwiYWN0aXZhdGVkIiwiQ29sbGVjdGlvbiIsIlBhZ2VhYmxlQ29sbGVjdGlvbiIsIm1vZGVsIiwidXJsIiwic3RhdGUiLCJwYWdlU2l6ZSIsIm1vZGUiLCJxdWVyeVBhcmFtcyIsInNvcnRLZXkiLCJwYXJzZVN0YXRlIiwicmVzcCIsInRvdGFsUmVjb3JkcyIsInRvdGFsIiwicGFyc2VSZWNvcmRzIiwicm93cyIsIm1vZHVsZSIsImV4cG9ydHMiLCJNYXJpb25ldHRlIiwiVmlldyIsInRhZ05hbWUiLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsInVpIiwiZmlsdGVyQmFyIiwiY291bnRlciIsImRvd25sb2FkTGlzdCIsInVwbG9hZGVyIiwicGFnaW5nIiwiZ3JpZCIsImFkZCIsImV2ZW50cyIsImNvbGxlY3Rpb25FdmVudHMiLCJzaG93RG93bmxvYWRzIiwiZXZ0Iiwic3RvcFByb3BhZ2F0aW9uIiwibGlzdCIsImFuY2hvciIsInNpZGUiLCJzdHJ1Y3R1cmUiLCJjbG9zZU9uQ2xpY2siLCJlbGVtZW50cyIsInRleHQiLCJpZCIsInNob3ciLCJsaXN0ZW5UbyIsImJpbmQiLCJkb3dubG9hZFN1bW1hcnkiLCJkb3dubG9hZFJlcXVpcmVkIiwiZmlsdGVyRGVhY3RpdmF0ZSIsImZjQ2xpZW50IiwiaGFzQWNjZXNzIiwicCIsInRyYW5jaGVzIiwiZGVhY3RpdmF0ZSIsImFwaSIsInRva2VucyIsImFjdGl2YXRpb24iLCJkZWxldGUiLCJmaWx0ZXJBY3RpdmF0ZSIsInB1dCIsIm9uUmVuZGVyIiwiY29sdW1ucyIsIm5hbWUiLCJsYWJlbCIsImNlbGwiLCJlZGl0YWJsZSIsInRvb2x0aXAiLCJNb21lbnRDZWxsIiwibW9kZWxJblVuaXhUaW1lc3RhbXAiLCJkaXNwbGF5Rm9ybWF0IiwiZGlzcGxheUluVVRDIiwiQm9vbGVhbkljb25DZWxsIiwiRHVyYXRpb25DZWxsIiwiVG9vbGJhckNlbGwiLCJ0b29sdGlwcyIsInRpdGxlIiwiaWNvbiIsImZpbHRlciIsInNvcnRhYmxlIiwiZWwiLCJjb2xsZWN0aW9uIiwiY2xpY2thYmxlIiwid2FpdEZvckZpbHRlcnMiLCJlbGVtZW50IiwiYmluZEV2ZW50cyIsImFzc2lnblRvR3JvdXAiLCJ0ZXh0RmlsdGVyIiwidHlwZSIsImRlYm91bmNlIiwic2VydmVyIiwiaGlkZVVzZWRUb2tlbnMiLCJpbml0aWFsVmFsdWUiLCJoaWRlUmV2b2tlZFRva2VucyIsImhpZGVFeHBpcmVkVG9rZW5zIiwibGFuZ3VhZ2VGaWx0ZXIiLCJjYXRlZ29yaWVzIiwiaXRlbXMiLCJsYW5ndWFnZUxpc3QiLCJzdWJqZWN0RmlsdGVyIiwia2V5IiwidmFsdWUiLCJmZXRjaCIsImluZmluaXRlIiwiZ3JhZGVGaWx0ZXIiLCJtYXAiLCJncmFkZUxpc3QiLCJ2YWwiLCJyZWR1Y2UiLCJzb3J0IiwiYSIsImIiLCJsZXhpY2FsIiwidG9VcHBlckNhc2UiLCJsb2NhbGVDb21wYXJlIiwic3VtIiwibnVtIiwicHVzaCIsImZvcm1hdEZpbHRlciIsIm1wZGYiLCJtcHViIiwicHViRmlsdGVyIiwiZmlsdGVyTGlzdCIsInByZXBlbmQiLCJmaWx0ZXJDb250YWluZXIiLCJmaWx0ZXJzIiwiZGVmYXVsdEZpbHRlcnMiLCJyZW5kZXIiLCJkZWFjdGl2YXRlVG9rZW4iLCJtb2RhbCIsIndhcm5pbmciLCJib2R5IiwicGVyc2lzdCIsIm9uIiwiYWpheCIsIm1ldGhvZCIsInN1Y2Nlc3MiLCJkZWFjdGl2YXRpb25TdWNjZXNzIiwiZXJyb3IiLCJkZWFjdGl2YXRpb25FcnJvciIsImRlc3Ryb3kiLCJzZXQiLCJkZWFjdGl2YXRlZCIsImluaXRDb21wdXRlZHMiLCJ0cmlnZ2VyIiwieGhyIiwiYW5zd2VyIiwicGFyc2VSZXNwb25zZSIsInNob3dFcnJvciIsImRldGFpbCIsImluZm8iLCJhY3RpdmF0ZVRva2VuIiwiYWN0aXZhdGlvblN1Y2Nlc3MiLCJhY3RpdmF0aW9uRXJyb3IiLCJjb2RlVG9IdW1hblZhbHVlIiwiaGlkZUJ1dHRvbnMiLCJncm91cCIsIm11bHRpcGxlIiwiZGVsYXlMb2FkIiwiZGVmYXVsdCIsInBhcmFtcyIsImV4dGVuZGVkTmFtZSIsInBsYWNlaG9sZGVyIiwiZGRIb3N0IiwiZyIsImdldFNlbGVjdGVkIiwieCIsImdyb3VwX2lkIiwiYyIsInBhcnNlSW50IiwiZGF0YSIsImdyb3VwcyIsImN1dG9mZiIsImFzc2lnblN1Y2Nlc3MiLCJhc3NpZ25FcnJvciIsIiRlbCIsImNoYW5nZWxvZyIsImdldFNlcnZlckZpbHRlcnMiLCJ3aW5kb3ciLCJvcGVuIiwic3RyaW5naWZ5IiwiYWRkVG9rZW4iLCJ0b2tlblN1Y2Nlc3MiLCJ0b2tlbkVycm9yIiwiZW5hYmxlQnV0dG9ucyIsImhpZGVTcGlubmVyIiwidG9rZW4iLCJzYXZlIiwid2FpdCJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUMsSUFBSUQsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNRSxJQUFJRixRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1HLFNBQVNILFFBQVEsUUFBUixDQUFmO0FBQ0EsSUFBTUksS0FBS0osUUFBUSxhQUFSLENBQVg7O0FBRUEsSUFBTUssTUFBTUwsUUFBUSxhQUFSLENBQVo7O0FBRUEsSUFBTU0sYUFBYU4sUUFBUSxzQkFBUixDQUFuQjtBQUNBLElBQU1PLFdBQVdQLFFBQVEsY0FBUixDQUFqQjtBQUNBLElBQU1RLFdBQVdSLFFBQVEsb0JBQVIsQ0FBakI7QUFDQSxJQUFNUyxhQUFhVCxRQUFRLHNCQUFSLENBQW5CO0FBQ0EsSUFBTVUsYUFBYVYsUUFBUSxzQkFBUixDQUFuQjtBQUNBLElBQU1XLFdBQVdYLFFBQVEsb0JBQVIsQ0FBakI7QUFDQSxJQUFNWSxRQUFRYixTQUFTYyxLQUFULENBQWVDLE9BQWYsQ0FBdUIsUUFBdkIsQ0FBZDs7QUFFQSxJQUFNQyxhQUFhaEIsU0FBU2lCLEtBQVQsQ0FBZUMsS0FBZixDQUFxQkMsTUFBckIsQ0FBNEI7QUFDOUNDLGNBQWEsS0FEaUM7O0FBRzlDQyxVQUFTLG1CQUFXO0FBQ25CLE1BQU1DLE9BQU9ULE1BQU1VLE9BQU4sQ0FBY2pCLElBQUlrQixNQUFKLENBQVdDLFFBQVgsQ0FBb0JDLFdBQWxDLENBQWI7QUFDQSxTQUFPbEIsU0FBU2EsT0FBVCxHQUFtQixpQkFBbkIsR0FBdUNNLG1CQUFtQkwsS0FBS00sUUFBeEIsQ0FBdkMsR0FBMkUsU0FBbEY7QUFDQTtBQU42QyxDQUE1QixDQUFuQjs7QUFTQSxJQUFNQyxZQUFZNUIsUUFBUSxrQkFBUixDQUFsQjs7QUFFQSxJQUFNaUIsUUFBUWxCLFNBQVNpQixLQUFULENBQWVDLEtBQWYsQ0FBcUJDLE1BQXJCLENBQTRCO0FBQ3pDVyxXQUFVLEVBRCtCO0FBRXpDVixjQUFhLGtCQUY0Qjs7QUFJekNDLFVBQVMsbUJBQVc7QUFDbkIsU0FBT2IsU0FBU2EsT0FBVCxHQUFtQiwwQkFBMUI7QUFDQSxFQU53Qzs7QUFRekNVLFlBQVc7QUFDVkMsY0FBWSxzQkFBVztBQUN0QixVQUFPLEtBQUtDLEdBQUwsQ0FBUyxRQUFULEVBQW1CQyxNQUExQjtBQUNBLEdBSFM7QUFJVkMsYUFBVyxxQkFBVztBQUNyQixVQUFPLENBQUMsS0FBS0YsR0FBTCxDQUFTLGFBQVQsQ0FBUjtBQUNBO0FBTlM7QUFSOEIsQ0FBNUIsQ0FBZDs7QUFrQkEsSUFBTUcsYUFBYXBDLFNBQVNxQyxrQkFBVCxDQUE0QmxCLE1BQTVCLENBQW1DO0FBQ3JEbUIsUUFBT3BCLEtBRDhDOztBQUdyRHFCLE1BQUssZUFBVztBQUNmLFNBQU8vQixTQUFTYSxPQUFULEdBQW1CLDBCQUExQjtBQUNBLEVBTG9EOztBQU9yRG1CLFFBQU87QUFDTkMsWUFBVTtBQURKLEVBUDhDO0FBVXJEQyxPQUFNLFFBVitDOztBQVlyREMsY0FBYTtBQUNaRixZQUFVLFVBREU7QUFFWkcsV0FBUztBQUZHLEVBWndDOztBQWlCckRDLGFBQVksb0JBQVNDLElBQVQsRUFBZTtBQUMxQixTQUFPLEVBQUVDLGNBQWNELEtBQUtFLEtBQXJCLEVBQVA7QUFDQSxFQW5Cb0Q7O0FBcUJyREMsZUFBYyxzQkFBU0gsSUFBVCxFQUFlO0FBQzVCLFNBQU9BLEtBQUtJLElBQVo7QUFDQTtBQXZCb0QsQ0FBbkMsQ0FBbkI7O0FBMEJBQyxPQUFPQyxPQUFQLEdBQWlCcEQsU0FBU3FELFVBQVQsQ0FBb0JDLElBQXBCLENBQXlCbkMsTUFBekIsQ0FBZ0M7QUFDaERvQyxVQUFTLEtBRHVDO0FBRWhEQyxZQUFXLHdCQUZxQzs7QUFJaERDLFdBQVV4RCxRQUFRLGdDQUFSLENBSnNDOztBQU1oRHlELEtBQUk7QUFDSEMsYUFBVyxtQkFEUjtBQUVIQyxXQUFTLG1CQUZOO0FBR0hDLGdCQUFjLGtCQUhYO0FBSUhDLFlBQVUsU0FKUDtBQUtIQyxVQUFRLFNBTEw7QUFNSEMsUUFBTSxVQU5IOztBQVFIQyxPQUFLO0FBUkYsRUFONEM7O0FBaUJoREMsU0FBUTtBQUNQLG1CQUFpQixVQURWO0FBRVAsNEJBQTBCO0FBRm5CLEVBakJ3Qzs7QUFzQmhEQyxtQkFBa0I7QUFDakIsOEJBQTRCLGlCQURYO0FBRWpCLDRCQUEwQixlQUZUO0FBR2pCLDZCQUEyQjtBQUhWLEVBdEI4Qjs7QUE0QmhEQyxnQkFBZSx1QkFBU0MsR0FBVCxFQUFjO0FBQzVCQSxNQUFJQyxlQUFKOztBQUVBLE1BQU1DLE9BQU8sSUFBSTdELFVBQUosQ0FBZTtBQUMzQjhELFdBQVEsS0FBS2QsRUFBTCxDQUFRRyxZQURXO0FBRTNCWSxTQUFNLE1BRnFCO0FBRzNCQyxjQUFXLENBQ1YsRUFBRUMsY0FBYyxJQUFoQixFQUFzQkMsVUFBVSxDQUMvQixFQUFFQyxNQUFNLHVCQUFSLEVBQWlDQyxJQUFJLFFBQXJDLEVBRCtCLEVBRS9CLEVBQUVELE1BQU0sc0JBQVIsRUFBZ0NDLElBQUksU0FBcEMsRUFGK0IsRUFHL0IsRUFBRUQsTUFBTSwwQkFBUixFQUFvQ0MsSUFBSSxVQUF4QyxFQUgrQixDQUFoQyxFQURVO0FBSGdCLEdBQWYsQ0FBYjtBQVdBUCxPQUFLUSxJQUFMOztBQUVBLE9BQUtDLFFBQUwsQ0FBY1QsSUFBZCxFQUFvQixnQkFBcEIsRUFBc0MsS0FBS1YsWUFBTCxDQUFrQm9CLElBQWxCLENBQXVCLElBQXZCLENBQXRDO0FBQ0EsT0FBS0QsUUFBTCxDQUFjVCxJQUFkLEVBQW9CLGlCQUFwQixFQUF1QyxLQUFLVyxlQUFMLENBQXFCRCxJQUFyQixDQUEwQixJQUExQixDQUF2QztBQUNBLE9BQUtELFFBQUwsQ0FBY1QsSUFBZCxFQUFvQixrQkFBcEIsRUFBd0MsS0FBS1ksZ0JBQUwsQ0FBc0JGLElBQXRCLENBQTJCLElBQTNCLENBQXhDO0FBQ0EsRUEvQytDOztBQWlEaERHLG1CQUFrQiwwQkFBUzlDLEtBQVQsRUFBZ0I7QUFDakMsTUFBTWhCLE9BQU9ULE1BQU1VLE9BQU4sQ0FBY2pCLElBQUlrQixNQUFKLENBQVdDLFFBQVgsQ0FBb0JDLFdBQWxDLENBQWI7O0FBRUEsU0FBTyxDQUFDbEIsU0FBUzZFLFFBQVYsSUFBc0IsQ0FBQy9DLE1BQU1MLEdBQU4sQ0FBVSxhQUFWLENBQXZCLElBQW1ELENBQUNLLE1BQU1MLEdBQU4sQ0FBVSxTQUFWLENBQXBELElBQTRFSyxNQUFNTCxHQUFOLENBQVUsU0FBVixDQUE1RSxJQUFvRzdCLE9BQU9rRixTQUFQLENBQWlCbEYsT0FBT21GLENBQVAsQ0FBU0MsUUFBVCxDQUFrQkMsVUFBbkMsRUFBK0NuRSxJQUEvQyxDQUFwRyxJQUNObEIsT0FBT2tGLFNBQVAsQ0FBaUJsRixPQUFPbUYsQ0FBUCxDQUFTRyxHQUFULENBQWFDLE1BQWIsQ0FBb0JILFFBQXBCLENBQTZCSSxVQUE3QixDQUF3Q0MsTUFBekQsRUFBaUV2RSxJQUFqRSxDQUREO0FBRUEsRUF0RCtDOztBQXdEaER3RSxpQkFBZ0Isd0JBQVN4RCxLQUFULEVBQWdCO0FBQy9CLE1BQU1oQixPQUFPVCxNQUFNVSxPQUFOLENBQWNqQixJQUFJa0IsTUFBSixDQUFXQyxRQUFYLENBQW9CQyxXQUFsQyxDQUFiOztBQUVBLFNBQU8sQ0FBQ2xCLFNBQVM2RSxRQUFWLElBQXNCL0MsTUFBTUwsR0FBTixDQUFVLGFBQVYsQ0FBdEIsSUFBa0QsQ0FBQ0ssTUFBTUwsR0FBTixDQUFVLFNBQVYsQ0FBbkQsSUFBMkVLLE1BQU1MLEdBQU4sQ0FBVSxTQUFWLENBQTNFLElBQW1HN0IsT0FBT2tGLFNBQVAsQ0FBaUJsRixPQUFPbUYsQ0FBUCxDQUFTRyxHQUFULENBQWFDLE1BQWIsQ0FBb0JILFFBQXBCLENBQTZCSSxVQUE3QixDQUF3Q0csR0FBekQsRUFBOER6RSxJQUE5RCxDQUExRztBQUNBLEVBNUQrQzs7QUE4RGhEMEUsV0FBVSxvQkFBVztBQUNwQixNQUFNQyxVQUFVLENBQ2YsRUFBRUMsTUFBTSxPQUFSLEVBQWlCQyxPQUFPLFNBQXhCLEVBQW1DQyxNQUFNLFFBQXpDLEVBQW1EQyxVQUFVLEtBQTdELEVBQW9FQyxTQUFTLE9BQTdFLEVBRGUsRUFFZixFQUFFSixNQUFNLE1BQVIsRUFBZ0JDLE9BQU8sY0FBdkIsRUFBdUNDLE1BQU0sUUFBN0MsRUFBdURDLFVBQVUsS0FBakUsRUFGZSxFQUdmLEVBQUVILE1BQU0sTUFBUixFQUFnQkMsT0FBTyxNQUF2QixFQUErQkMsTUFBTSxRQUFyQyxFQUErQ0MsVUFBVSxLQUF6RCxFQUhlLEVBSWYsRUFBRUgsTUFBTSxTQUFSLEVBQW1CQyxPQUFPLFNBQTFCLEVBQXFDQyxNQUFNN0YsV0FBV2dHLFVBQVgsQ0FBc0JwRixNQUF0QixDQUE2QjtBQUN2RXFGLDBCQUFzQixJQURpRDtBQUV2RUMsbUJBQWUseUJBRndEO0FBR3ZFQyxrQkFBYztBQUh5RCxJQUE3QixDQUEzQyxFQUlJTCxVQUFVLEtBSmQsRUFKZSxFQVNmLEVBQUVILE1BQU0sWUFBUixFQUFzQkMsT0FBTyxRQUE3QixFQUF1Q0MsTUFBTSxRQUE3QyxFQUF1REMsVUFBVSxLQUFqRSxFQVRlLEVBVWYsRUFBRUgsTUFBTSxTQUFSLEVBQW1CQyxPQUFPLFVBQTFCLEVBQXNDQyxNQUFNN0YsV0FBV29HLGVBQVgsQ0FBMkJ4RixNQUEzQixDQUFrQyxFQUFsQyxDQUE1QyxFQUFtRmtGLFVBQVUsS0FBN0YsRUFWZSxFQVdmLEVBQUVILE1BQU0sV0FBUixFQUFxQkMsT0FBTyxZQUE1QixFQUEwQ0MsTUFBTTdGLFdBQVdvRyxlQUFYLENBQTJCeEYsTUFBM0IsQ0FBa0MsRUFBbEMsQ0FBaEQsRUFBdUZrRixVQUFVLEtBQWpHLEVBWGUsRUFZZixFQUFFSCxNQUFNLGlCQUFSLEVBQTJCQyxPQUFPLFVBQWxDLEVBQThDQyxNQUFNLFFBQXBELEVBQThEQyxVQUFVLEtBQXhFLEVBWmUsRUFhZixFQUFFSCxNQUFNLFFBQVIsRUFBa0JDLE9BQU8sVUFBekIsRUFBcUNDLE1BQU0sUUFBM0MsRUFBcURDLFVBQVUsS0FBL0QsRUFiZSxFQWNmLEVBQUVILE1BQU0sU0FBUixFQUFtQkMsT0FBTyxXQUExQixFQUF1Q0MsTUFBTSxRQUE3QyxFQUF1REMsVUFBVSxLQUFqRSxFQWRlLEVBZWYsRUFBRUgsTUFBTSxPQUFSLEVBQWlCQyxPQUFPLFNBQXhCLEVBQW1DQyxNQUFNLFFBQXpDLEVBQW1EQyxVQUFVLEtBQTdELEVBZmUsRUFnQmYsRUFBRUgsTUFBTSxVQUFSLEVBQW9CQyxPQUFPLFlBQTNCLEVBQXlDQyxNQUFNLFFBQS9DLEVBQXlEQyxVQUFVLEtBQW5FLEVBaEJlLEVBaUJmLEVBQUVILE1BQU0sVUFBUixFQUFvQkMsT0FBTyxVQUEzQixFQUF1Q0MsTUFBTTdGLFdBQVdxRyxZQUFYLENBQXdCekYsTUFBeEIsQ0FBK0IsRUFBL0IsQ0FBN0MsRUFBaUZrRixVQUFVLEtBQTNGLEVBakJlLEVBa0JmLEVBQUVILE1BQU0sT0FBUixFQUFpQkMsT0FBTyxjQUF4QixFQUF3Q0MsTUFBTTdGLFdBQVdxRyxZQUFYLENBQXdCekYsTUFBeEIsQ0FBK0IsRUFBL0IsQ0FBOUMsRUFBa0ZrRixVQUFVLEtBQTVGLEVBbEJlLEVBbUJmLEVBQUVGLE9BQU8sU0FBVCxFQUFvQkMsTUFBTSxJQUFJN0YsV0FBV3NHLFdBQWYsQ0FBMkIsRUFBRUMsVUFBVSxDQUNoRSxFQUFFQyxPQUFPLFdBQVQsRUFBc0JDLE1BQU0sWUFBNUIsRUFEZ0UsRUFFaEUsRUFBRUQsT0FBTyxZQUFULEVBQXVCQyxNQUFNLGlCQUE3QixFQUFnREMsUUFBUSxLQUFLN0IsZ0JBQUwsQ0FBc0JILElBQXRCLENBQTJCLElBQTNCLENBQXhELEVBRmdFLEVBR2hFLEVBQUU4QixPQUFPLFVBQVQsRUFBcUJDLE1BQU0saUJBQTNCLEVBQThDQyxRQUFRLEtBQUtuQixjQUFMLENBQW9CYixJQUFwQixDQUF5QixJQUF6QixDQUF0RCxFQUhnRSxDQUFaLEVBQTNCLENBQTFCLEVBSU1vQixVQUFVLEtBSmhCLEVBSXVCYSxVQUFVLEtBSmpDLEVBbkJlLENBQWhCOztBQTBCQSxPQUFLbEQsSUFBTCxHQUFZLElBQUl6RCxVQUFKLENBQWU7QUFDMUI0RyxPQUFJLEtBQUt6RCxFQUFMLENBQVFNLElBRGM7QUFFMUJpQyxZQUFTQSxPQUZpQjtBQUcxQm1CLGVBQVksSUFBSWhGLFVBQUosRUFIYztBQUkxQmlGLGNBQVcsSUFKZTtBQUsxQkMsbUJBQWdCLElBTFU7QUFNMUIxRCxZQUFTO0FBQ1IyRCxhQUFTLEtBQUs3RCxFQUFMLENBQVFFLE9BRFQ7QUFFUkgsY0FBVTtBQUZGLElBTmlCO0FBVTFCTSxXQUFRO0FBQ1B3RCxhQUFTLEtBQUs3RCxFQUFMLENBQVFLO0FBRFY7QUFWa0IsR0FBZixDQUFaOztBQWVBLE9BQUt5RCxVQUFMLENBQWdCLEtBQUt4RCxJQUFMLENBQVVvRCxVQUExQixFQUFzQyxLQUFLakQsZ0JBQTNDOztBQUVBLE9BQUthLFFBQUwsQ0FBYyxLQUFLaEIsSUFBbkIsRUFBeUIsYUFBekIsRUFBd0MsS0FBS3lELGFBQUwsQ0FBbUJ4QyxJQUFuQixDQUF3QixJQUF4QixDQUF4Qzs7QUFHQSxNQUFNeUMsYUFBYTtBQUNsQkMsU0FBTSxNQURZO0FBRWxCekIsU0FBTSxZQUZZO0FBR2xCQyxVQUFPLGFBSFc7QUFJbEJ5QixhQUFVLEdBSlE7QUFLbEJDLFdBQVE7QUFMVSxHQUFuQjs7QUFRQSxNQUFNQyxpQkFBaUI7QUFDdEJILFNBQU0sUUFEZ0I7QUFFdEJ6QixTQUFNLGdCQUZnQjtBQUd0QkMsVUFBTyxrQkFIZTtBQUl0QjBCLFdBQVEsSUFKYztBQUt0QkUsaUJBQWM7QUFBQSxXQUFNLENBQUMsSUFBRCxDQUFOO0FBQUE7QUFMUSxHQUF2Qjs7QUFRQSxNQUFNQyxvQkFBb0I7QUFDekJMLFNBQU0sUUFEbUI7QUFFekJ6QixTQUFNLG1CQUZtQjtBQUd6QkMsVUFBTyxxQkFIa0I7QUFJekIwQixXQUFRLElBSmlCO0FBS3pCRSxpQkFBYztBQUFBLFdBQU0sQ0FBQyxJQUFELENBQU47QUFBQTtBQUxXLEdBQTFCOztBQVFBLE1BQU1FLG9CQUFvQjtBQUN6Qk4sU0FBTSxRQURtQjtBQUV6QnpCLFNBQU0sbUJBRm1CO0FBR3pCQyxVQUFPLHFCQUhrQjtBQUl6QjBCLFdBQVEsSUFKaUI7QUFLekJFLGlCQUFjO0FBQUEsV0FBTSxDQUFDLElBQUQsQ0FBTjtBQUFBO0FBTFcsR0FBMUI7O0FBUUEsTUFBTUcsaUJBQWlCO0FBQ3RCUCxTQUFNLFVBRGdCO0FBRXRCekIsU0FBTSxnQkFGZ0I7QUFHdEJDLFVBQU8sVUFIZTtBQUl0QmdDLGVBQVksQ0FDWCxFQUFFQyxPQUFPNUgsU0FBUzZILFlBQWxCLEVBRFcsQ0FKVTtBQU90QlIsV0FBUTtBQVBjLEdBQXZCOztBQVVBLE1BQU1TLGdCQUFnQjtBQUNyQlgsU0FBTSxVQURlO0FBRXJCekIsU0FBTSxlQUZlO0FBR3JCQyxVQUFPLFNBSGM7QUFJckIwQixXQUFRO0FBQ1BVLFNBQUssWUFERTtBQUVQQyxXQUFPLFNBRkE7QUFHUEMsV0FBT2pJLFNBQVNhLE9BQVQsR0FBbUI7QUFIbkIsSUFKYTtBQVNyQjBDLFdBQVE7QUFDUHRCLGNBQVUsRUFESDtBQUVQaUcsY0FBVTtBQUZIO0FBVGEsR0FBdEI7O0FBZUEsTUFBTUMsY0FBYztBQUNuQmhCLFNBQU0sVUFEYTtBQUVuQnpCLFNBQU0sYUFGYTtBQUduQkMsVUFBTyxlQUhZO0FBSW5CMEIsV0FBUSxJQUpXO0FBS25CTSxlQUFZaEksRUFBRXlJLEdBQUYsQ0FBTXBJLFNBQVNxSSxTQUFmLEVBQTBCLFVBQUNDLEdBQUQsRUFBTVAsR0FBTjtBQUFBLFdBQWU7QUFDcERwQyxZQUFPb0MsR0FENkM7QUFFcERILFlBQU9qSSxFQUFFNEksTUFBRixDQUFTRCxJQUFJRSxJQUFKLENBQVMsVUFBQ0MsQ0FBRCxFQUFJQyxDQUFKO0FBQUEsYUFBVSxDQUFDLGFBQWFELENBQWIsR0FBaUJBLEVBQUVFLE9BQW5CLEdBQTZCRixFQUFFL0MsSUFBaEMsRUFBc0NrRCxXQUF0QyxHQUFvREMsYUFBcEQsQ0FBa0UsQ0FBQyxhQUFhSCxDQUFiLEdBQWlCQSxFQUFFQyxPQUFuQixHQUE2QkQsRUFBRWhELElBQWhDLEVBQXNDa0QsV0FBdEMsRUFBbEUsQ0FBVjtBQUFBLE1BQVQsQ0FBVCxFQUNOLFVBQUNFLEdBQUQsRUFBTUMsR0FBTixFQUFjO0FBQUVELFVBQUlFLElBQUosQ0FBUyxFQUFFdEQsTUFBTXFELElBQUlmLEtBQVosRUFBbUJyQyxPQUFPb0QsSUFBSXJELElBQTlCLEVBQVQsRUFBZ0QsT0FBT29ELEdBQVA7QUFBYSxNQUR2RSxFQUN5RSxFQUR6RTtBQUY2QyxLQUFmO0FBQUEsSUFBMUI7QUFMTyxHQUFwQjs7QUFZQSxNQUFNRyxlQUFlO0FBQ3BCOUIsU0FBTSxVQURjO0FBRXBCekIsU0FBTSxjQUZjO0FBR3BCQyxVQUFPLFFBSGE7QUFJcEJnQyxlQUFZLENBQ1gsRUFBRUMsT0FBTyxFQUFFc0IsTUFBTSxLQUFSLEVBQWVDLE1BQU0sTUFBckIsRUFBVCxFQURXLENBSlE7QUFPcEI5QixXQUFRO0FBUFksR0FBckI7O0FBVUEsTUFBTStCLFlBQVk7QUFDakJqQyxTQUFNLFVBRFc7QUFFakJ6QixTQUFNLFdBRlc7QUFHakJDLFVBQU8sV0FIVTtBQUlqQjBCLFdBQVE7QUFDUFUsU0FBSyxjQURFO0FBRVBDLFdBQU8sVUFGQTtBQUdQQyxXQUFPakksU0FBU2EsT0FBVCxHQUFtQjtBQUhuQixJQUpTO0FBU2pCMEMsV0FBUTtBQUNQdEIsY0FBVSxFQURIO0FBRVBpRyxjQUFVO0FBRkg7QUFUUyxHQUFsQjs7QUFlQSxNQUFNbUIsYUFBYSxDQUFDbkMsVUFBRCxFQUFhSSxjQUFiLEVBQTZCRSxpQkFBN0IsRUFBZ0RDLGlCQUFoRCxFQUFtRUMsY0FBbkUsRUFBbUZJLGFBQW5GLEVBQWtHSyxXQUFsRyxFQUErR2MsWUFBL0csRUFBNkhHLFNBQTdILENBQW5COztBQUVBLE9BQUtsRyxFQUFMLENBQVFDLFNBQVIsQ0FBa0JtRyxPQUFsQixDQUEwQixLQUFLOUYsSUFBTCxDQUFVaUQsTUFBVixDQUFpQjtBQUMxQzhDLG9CQUFpQixLQUFLckcsRUFBTCxDQUFRQyxTQURpQjtBQUUxQ3FHLFlBQVNILFVBRmlDO0FBRzFDSSxtQkFBZ0IsQ0FBQyxZQUFELEVBQWUsZ0JBQWYsRUFBaUMsbUJBQWpDLEVBQXNELG1CQUF0RDtBQUgwQixHQUFqQixFQUl2QkMsTUFKdUIsR0FJZC9DLEVBSlo7QUFLQSxFQWxOK0M7O0FBb05oRGdELGtCQUFpQix5QkFBUzdILEtBQVQsRUFBZ0I7QUFBQTs7QUFDaEMsT0FBSzhILEtBQUwsR0FBYSxJQUFJekosVUFBSixDQUFlO0FBQzNCMEosWUFBUyxJQURrQjtBQUUzQnRELFVBQU8sK0NBRm9CO0FBRzNCdUQsU0FBTSxrSEFIcUI7QUFJM0JDLFlBQVM7QUFKa0IsR0FBZixDQUFiOztBQU9BLE9BQUtILEtBQUwsQ0FBV0ksRUFBWCxDQUFjLFdBQWQsRUFBMkIsWUFBTTtBQUNoQ3RLLEtBQUV1SyxJQUFGLENBQU87QUFDTkMsWUFBUSxRQURGO0FBRU5uSSxTQUFLL0IsU0FBU2EsT0FBVCxHQUFtQixzQ0FBbkIsR0FBNERpQixNQUFNTCxHQUFOLENBQVUsS0FBVixDQUYzRDtBQUdOMEksYUFBUyxNQUFLQyxtQkFBTCxDQUF5QjNGLElBQXpCLENBQThCLEtBQTlCLEVBQW9DM0MsS0FBcEMsQ0FISDtBQUlOdUksV0FBTyxNQUFLQyxpQkFBTCxDQUF1QjdGLElBQXZCLENBQTRCLEtBQTVCLEVBQWtDM0MsS0FBbEM7QUFKRCxJQUFQO0FBTUEsR0FQRDs7QUFTQSxPQUFLOEgsS0FBTCxDQUFXckYsSUFBWDtBQUNBLEVBdE8rQzs7QUF3T2hENkYsc0JBQXFCLDZCQUFTdEksS0FBVCxFQUFnQjtBQUNwQyxPQUFLOEgsS0FBTCxDQUFXVyxPQUFYOztBQUVBekksUUFBTTBJLEdBQU4sQ0FBVSxFQUFFQyxhQUFhLElBQWYsRUFBVjtBQUNBM0ksUUFBTTRJLGFBQU47QUFDQTVJLFFBQU02SSxPQUFOLENBQWMsYUFBZDtBQUNBLEVBOU8rQzs7QUFnUGhETCxvQkFBbUIsMkJBQVN4SSxLQUFULEVBQWdCOEksR0FBaEIsRUFBcUI7QUFDdkMsTUFBTUMsU0FBUy9LLElBQUlnTCxhQUFKLENBQWtCRixHQUFsQixDQUFmO0FBQ0EsT0FBS2hCLEtBQUwsQ0FBV21CLFNBQVgsQ0FBcUIsMkJBQTJCRixPQUFPRyxNQUFQLElBQWlCSCxPQUFPSSxJQUFuRCxDQUFyQjtBQUNBLEVBblArQzs7QUFxUGhEQyxnQkFBZSx1QkFBU3BKLEtBQVQsRUFBZ0I7QUFBQTs7QUFDOUIsT0FBSzhILEtBQUwsR0FBYSxJQUFJekosVUFBSixDQUFlO0FBQzNCb0csVUFBTyw2Q0FEb0I7QUFFM0J1RCxTQUFNLDZDQUZxQjtBQUczQkMsWUFBUztBQUhrQixHQUFmLENBQWI7O0FBTUEsT0FBS0gsS0FBTCxDQUFXSSxFQUFYLENBQWMsV0FBZCxFQUEyQixZQUFNO0FBQ2hDdEssS0FBRXVLLElBQUYsQ0FBTztBQUNOQyxZQUFRLEtBREY7QUFFTm5JLFNBQUsvQixTQUFTYSxPQUFULEdBQW1CLHNDQUFuQixHQUE0RGlCLE1BQU1MLEdBQU4sQ0FBVSxLQUFWLENBRjNEO0FBR04wSSxhQUFTLE9BQUtnQixpQkFBTCxDQUF1QjFHLElBQXZCLENBQTRCLE1BQTVCLEVBQWtDM0MsS0FBbEMsQ0FISDtBQUlOdUksV0FBTyxPQUFLZSxlQUFMLENBQXFCM0csSUFBckIsQ0FBMEIsTUFBMUIsRUFBZ0MzQyxLQUFoQztBQUpELElBQVA7QUFNQSxHQVBEOztBQVNBLE9BQUs4SCxLQUFMLENBQVdyRixJQUFYO0FBQ0EsRUF0UStDOztBQXdRaEQ0RyxvQkFBbUIsMkJBQVNySixLQUFULEVBQWdCO0FBQ2xDLE9BQUs4SCxLQUFMLENBQVdXLE9BQVg7O0FBRUF6SSxRQUFNMEksR0FBTixDQUFVLEVBQUVDLGFBQWEsS0FBZixFQUFWO0FBQ0EzSSxRQUFNNEksYUFBTjtBQUNBNUksUUFBTTZJLE9BQU4sQ0FBYyxhQUFkO0FBQ0EsRUE5UStDOztBQWdSaERTLGtCQUFpQix5QkFBU3RKLEtBQVQsRUFBZ0I4SSxHQUFoQixFQUFxQjtBQUNyQyxNQUFNQyxTQUFTL0ssSUFBSWdMLGFBQUosQ0FBa0JGLEdBQWxCLENBQWY7QUFDQSxPQUFLaEIsS0FBTCxDQUFXbUIsU0FBWCxDQUFxQiwyQkFBMkJGLE9BQU9HLE1BQVAsSUFBaUJILE9BQU9JLElBQW5ELENBQXJCO0FBQ0EsRUFuUitDOztBQXFSaERoRSxnQkFBZSx1QkFBU25GLEtBQVQsRUFBZ0I7QUFBQTs7QUFDOUIsTUFBSTlCLFNBQVM2RSxRQUFULElBQXFCL0MsTUFBTUwsR0FBTixDQUFVLGFBQVYsQ0FBckIsSUFBaUQsQ0FBQ0ssTUFBTUwsR0FBTixDQUFVLFNBQVYsQ0FBdEQsRUFDQzs7QUFFRCxPQUFLbUksS0FBTCxHQUFhLElBQUl6SixVQUFKLENBQWU7QUFDM0JvRyxVQUFPLHNEQURvQjtBQUUzQnVELFVBQVNoSSxNQUFNTCxHQUFOLENBQVUsU0FBVix3S0FDc0QsRUFEL0QsdUtBS29DSyxNQUFNTCxHQUFOLENBQVUsT0FBVixDQUxwQyxtT0FhZ0NLLE1BQU1MLEdBQU4sQ0FBVSxXQUFWLEtBQTBCLFdBYjFELDRMQW9CZ0NLLE1BQU1MLEdBQU4sQ0FBVSxTQUFWLENBcEJoQyxpTUEyQmdDeEIsU0FBU29MLGdCQUFULENBQTBCdkosTUFBTUwsR0FBTixDQUFVLE9BQVYsQ0FBMUIsQ0EzQmhDLHdMQWtDZ0NLLE1BQU1MLEdBQU4sQ0FBVSxNQUFWLENBbENoQyw0VEF5Q2NLLE1BQU1MLEdBQU4sQ0FBVSxTQUFWLElBQXVCLFVBQXZCLEdBQW9DLEVBekNsRCwrSUEyQ3lCSyxNQUFNTCxHQUFOLENBQVUsU0FBVixJQUF1QixVQUF2QixHQUFvQyxFQTNDN0Qsa0JBMkMwRUssTUFBTUwsR0FBTixDQUFVLGNBQVYsQ0EzQzFFLDRPQUYyQjtBQWdEM0JzSSxZQUFTLElBaERrQjtBQWlEM0J1QixnQkFBY3hKLE1BQU1MLEdBQU4sQ0FBVSxTQUFWLElBQXVCLENBQUMsUUFBRCxDQUF2QixHQUFvQztBQWpEdkIsR0FBZixDQUFiOztBQW9EQSxNQUFNOEosUUFBUSxJQUFJbkwsUUFBSixDQUFhO0FBQzFCb0wsYUFBVSxJQURnQjtBQUUxQm5FLFdBQVE7QUFDUFksV0FBVWpJLFNBQVNhLE9BQW5CLG9CQURPO0FBRVA0SyxlQUFXLElBRko7QUFHUDFELFNBQUssVUFIRTtBQUlQQyxXQUFPLE1BSkE7QUFLUDBELGFBQVM7QUFDUnpELFlBQVVqSSxTQUFTYSxPQUFuQix5QkFBOENpQixNQUFNd0MsRUFBcEQ7QUFEUSxLQUxGO0FBUVBxSCxZQUFRO0FBQ1BDLG1CQUFjO0FBRFA7QUFSRCxJQUZrQjtBQWMxQnJJLFdBQVE7QUFDUHRCLGNBQVUsRUFESDtBQUVQaUcsY0FBVTtBQUZILElBZGtCO0FBa0IxQjJELGdCQUFhLDJDQWxCYTtBQW1CMUJDLFdBQVE7QUFuQmtCLEdBQWIsQ0FBZDs7QUFzQkEsT0FBS2xDLEtBQUwsQ0FBV0ksRUFBWCxDQUFjLFdBQWQsRUFBMkIsWUFBTTtBQUNoQyxPQUFJbEksTUFBTUwsR0FBTixDQUFVLFNBQVYsQ0FBSixFQUNDLE9BQU8sT0FBS21JLEtBQUwsQ0FBV1csT0FBWCxFQUFQOztBQUVELE9BQUl3QixJQUFJcE0sRUFBRXlJLEdBQUYsQ0FBTW1ELE1BQU1TLFdBQU4sTUFBdUIsRUFBN0IsRUFBaUM7QUFBQSxXQUFLQyxFQUFFQyxRQUFQO0FBQUEsSUFBakMsQ0FBUjtBQUNBLE9BQUksQ0FBQ0gsRUFBRXJLLE1BQVAsRUFDQ3FLLElBQUksSUFBSjs7QUFFRCxPQUFNSSxJQUFJQyxTQUFTMU0sRUFBRSxzQkFBRixFQUEwQixPQUFLa0ssS0FBTCxDQUFXakQsRUFBckMsRUFBeUMyQixHQUF6QyxFQUFULEVBQXlELEVBQXpELENBQVY7O0FBRUEsT0FBTStELE9BQU8sRUFBRUMsUUFBUVAsQ0FBVixFQUFiO0FBQ0EsT0FBSUksS0FBS0EsTUFBTSxDQUFmLEVBQ0NFLEtBQUtFLE1BQUwsR0FBY0osQ0FBZDs7QUFFRHpNLEtBQUV1SyxJQUFGLENBQU87QUFDTkMsWUFBUSxLQURGO0FBRU5uSSxTQUFRL0IsU0FBU2EsT0FBakIsaUNBQW9EaUIsTUFBTUwsR0FBTixDQUFVLEtBQVYsQ0FBcEQsbUJBRk07QUFHTjRLLGNBSE07QUFJTmxDLGFBQVMsT0FBS3FDLGFBQUwsQ0FBbUIvSCxJQUFuQixDQUF3QixNQUF4QixFQUE4QjNDLEtBQTlCLENBSkg7QUFLTnVJLFdBQU8sT0FBS29DLFdBQUwsQ0FBaUJoSSxJQUFqQixDQUFzQixNQUF0QixFQUE0QjNDLEtBQTVCO0FBTEQsSUFBUDtBQU9BLEdBckJEOztBQXVCQSxPQUFLOEgsS0FBTCxDQUFXckYsSUFBWDs7QUFFQWdILFFBQU1oSCxJQUFOLENBQVcsRUFBRW9DLElBQUlqSCxFQUFFLFFBQUYsRUFBWSxLQUFLa0ssS0FBTCxDQUFXOEMsR0FBdkIsQ0FBTixFQUFYO0FBQ0EsRUE3WCtDOztBQStYaERGLGdCQUFlLHVCQUFTMUssS0FBVCxFQUFnQnVLLElBQWhCLEVBQXNCO0FBQ3BDLE9BQUt6QyxLQUFMLENBQVdXLE9BQVg7O0FBRUF6SSxRQUFNMEksR0FBTixDQUFVNkIsSUFBVjtBQUNBdkssUUFBTTRJLGFBQU47QUFDQTVJLFFBQU02SSxPQUFOLENBQWMsYUFBZDtBQUNBLEVBclkrQzs7QUF1WWhEOEIsY0FBYSxxQkFBUzNLLEtBQVQsRUFBZ0I4SSxHQUFoQixFQUFxQjtBQUNqQyxNQUFNQyxTQUFTL0ssSUFBSWdMLGFBQUosQ0FBa0JGLEdBQWxCLENBQWY7QUFDQSxPQUFLaEIsS0FBTCxDQUFXbUIsU0FBWCxDQUFxQiwwQkFBMEJGLE9BQU9HLE1BQVAsSUFBaUJILE9BQU9JLElBQWxELENBQXJCO0FBQ0EsRUExWStDOztBQTRZaEQwQixZQUFXLG1CQUFTN0ssS0FBVCxFQUFnQjtBQUMxQixNQUFNNkssWUFBWSxJQUFJdEwsU0FBSixDQUFjLEVBQUVTLFlBQUYsRUFBZCxDQUFsQjs7QUFFQTZLLFlBQVVwSSxJQUFWO0FBQ0EsRUFoWitDOztBQWtaaERsQixlQUFjLHdCQUFXO0FBQ3hCLE1BQU1zSSxTQUFTLEtBQUtuSSxJQUFMLENBQVVpRCxNQUFWLENBQWlCbUcsZ0JBQWpCLEVBQWY7QUFDQUMsU0FBT0MsSUFBUCxDQUFZOU0sU0FBU2EsT0FBVCxHQUFtQix3Q0FBbkIsR0FBOERoQixHQUFHa04sU0FBSCxDQUFhcEIsTUFBYixDQUExRTtBQUNBLEVBclorQzs7QUF1WmhEakgsa0JBQWlCLDJCQUFXO0FBQzNCO0FBQ0FtSSxTQUFPQyxJQUFQLENBQVk5TSxTQUFTYSxPQUFULEdBQW1CLHdDQUEvQjtBQUNBLEVBMVorQzs7QUE0WmhEOEQsbUJBQWtCLDRCQUFXO0FBQzVCO0FBQ0FrSSxTQUFPQyxJQUFQLENBQVk5TSxTQUFTYSxPQUFULEdBQW1CLHlDQUEvQjtBQUNBLEVBL1orQzs7QUFpYWhEbU0sV0FBVSxrQkFBU25KLEdBQVQsRUFBYztBQUFBOztBQUN2QkEsTUFBSUMsZUFBSjs7QUFFQSxNQUFNOEYsUUFBUSxJQUFJekosVUFBSixDQUFlO0FBQzVCb0csVUFBTyxpREFEcUI7QUFFNUJ1RCxTQUFNLG9FQUZzQjtBQUc1QkMsWUFBUztBQUhtQixHQUFmLENBQWQ7O0FBTUEsTUFBTWtELGVBQWUsU0FBZkEsWUFBZSxHQUFNO0FBQzFCckQsU0FBTVcsT0FBTjtBQUNBLEdBRkQ7O0FBSUEsTUFBTTJDLGFBQWEsU0FBYkEsVUFBYSxDQUFDcEwsS0FBRCxFQUFROEksR0FBUixFQUFnQjtBQUNsQyxPQUFNQyxTQUFTL0ssSUFBSWdMLGFBQUosQ0FBa0JGLEdBQWxCLENBQWY7QUFDQSxVQUFPaEIsTUFBTXVELGFBQU4sR0FBc0JDLFdBQXRCLEdBQW9DckMsU0FBcEMsQ0FBOENGLE9BQU9HLE1BQVAsSUFBaUJILE9BQU9JLElBQXRFLENBQVA7QUFDQSxHQUhEOztBQUtBckIsUUFBTUksRUFBTixDQUFTLFdBQVQsRUFBc0IsWUFBTTtBQUMzQixPQUFNcUQsUUFBUTNOLEVBQUUsVUFBRixFQUFja0ssTUFBTWpELEVBQXBCLEVBQXdCMkIsR0FBeEIsRUFBZDtBQUNBLE9BQUksQ0FBQytFLEtBQUwsRUFDQyxPQUFPekQsTUFBTXVELGFBQU4sR0FBc0JDLFdBQXRCLEdBQW9DckMsU0FBcEMsQ0FBOEMsbUJBQTlDLENBQVA7O0FBRUQsT0FBTWpKLFFBQVEsSUFBSXRCLFVBQUosQ0FBZSxFQUFFNk0sT0FBT0EsS0FBVCxFQUFmLENBQWQ7O0FBRUF2TCxTQUFNd0wsSUFBTixDQUFXLElBQVgsRUFBaUIsRUFBRUMsTUFBTSxJQUFSLEVBQWNwRCxTQUFTOEMsYUFBYXhJLElBQWIsQ0FBa0IsTUFBbEIsQ0FBdkIsRUFBZ0Q0RixPQUFPNkMsV0FBV3pJLElBQVgsQ0FBZ0IsTUFBaEIsQ0FBdkQsRUFBakI7QUFDQSxHQVJEOztBQVVBbUYsUUFBTXJGLElBQU47QUFDQTtBQTliK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoibWFuYWdlVG9rZW5zLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCByZXN0ZXIgPSByZXF1aXJlKFwicmVzdGVyXCIpO1xuY29uc3QgcXMgPSByZXF1aXJlKFwicXVlcnlzdHJpbmdcIik7XG5cbmNvbnN0IEFwcCA9IHJlcXVpcmUoXCIuLi8uLi9pbmRleFwiKTtcblxuY29uc3QgU2VydmVyR3JpZCA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc2VydmVyR3JpZFwiKTtcbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcbmNvbnN0IGdyYWRlTWFwID0gcmVxdWlyZShcIi4uLy4uL2xpYi9ncmFkZU1hcFwiKTtcbmNvbnN0IFNpbXBsZU1lbnUgPSByZXF1aXJlKFwiLi4vLi4vbGliL3NpbXBsZU1lbnVcIik7XG5jb25zdCBTbWFsbE1vZGFsID0gcmVxdWlyZShcIi4uLy4uL2xpYi9zbWFsbE1vZGFsXCIpO1xuY29uc3QgU2VsZWN0cmEgPSByZXF1aXJlKFwiLi4vLi4vbGliL3NlbGVjdHJhXCIpO1xuY29uc3QgcmFkaW8gPSBCYWNrYm9uZS5SYWRpby5jaGFubmVsKFwiZ2xvYmFsXCIpO1xuXG5jb25zdCBUb2tlbk1vZGVsID0gQmFja2JvbmUuRXBveHkuTW9kZWwuZXh0ZW5kKHtcblx0aWRBdHRyaWJ1dGU6IFwiX2lkXCIsXG5cblx0dXJsUm9vdDogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgdXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3VzZXJzL1wiICsgZW5jb2RlVVJJQ29tcG9uZW50KHVzZXIudXNlcm5hbWUpICsgXCIvdG9rZW5zXCI7XG5cdH0sXG59KTtcblxuY29uc3QgQ2hhbmdlbG9nID0gcmVxdWlyZShcIi4vdHJhbmNoZUNoYW5nZXNcIik7XG5cbmNvbnN0IE1vZGVsID0gQmFja2JvbmUuRXBveHkuTW9kZWwuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHt9LFxuXHRpZEF0dHJpYnV0ZTogXCJ0cmFuY2hlX3Rva2VuX2lkXCIsXG5cblx0dXJsUm9vdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3Rva2Vucy90cmFuY2hlc1wiO1xuXHR9LFxuXG5cdGNvbXB1dGVkczoge1xuXHRcdGdyb3VwQ291bnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0KFwiZ3JvdXBzXCIpLmxlbmd0aDtcblx0XHR9LFxuXHRcdGFjdGl2YXRlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gIXRoaXMuZ2V0KFwiZGVhY3RpdmF0ZWRcIik7XG5cdFx0fSxcblx0fSxcbn0pO1xuXG5jb25zdCBDb2xsZWN0aW9uID0gQmFja2JvbmUuUGFnZWFibGVDb2xsZWN0aW9uLmV4dGVuZCh7XG5cdG1vZGVsOiBNb2RlbCxcblxuXHR1cmw6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC90b2tlbnMvdHJhbmNoZXNcIjtcblx0fSxcblxuXHRzdGF0ZToge1xuXHRcdHBhZ2VTaXplOiAzMCxcblx0fSxcblx0bW9kZTogXCJzZXJ2ZXJcIixcblxuXHRxdWVyeVBhcmFtczoge1xuXHRcdHBhZ2VTaXplOiBcInBhZ2VTaXplXCIsXG5cdFx0c29ydEtleTogXCJzb3J0QnlcIixcblx0fSxcblxuXHRwYXJzZVN0YXRlOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0cmV0dXJuIHsgdG90YWxSZWNvcmRzOiByZXNwLnRvdGFsIH07XG5cdH0sXG5cblx0cGFyc2VSZWNvcmRzOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0cmV0dXJuIHJlc3Aucm93cztcblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwiY29udGVudCB0cmFuY2hlLXRva2Vuc1wiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL21hbmFnZVRva2Vucy5udW5qXCIpLFxuXG5cdHVpOiB7XG5cdFx0ZmlsdGVyQmFyOiBcIi5vcHMtYmFyIC5maWx0ZXJzXCIsXG5cdFx0Y291bnRlcjogXCIub3BzLWJhciAuY291bnRlclwiLFxuXHRcdGRvd25sb2FkTGlzdDogXCJkaXYuZG93bmxvYWRMaXN0XCIsXG5cdFx0dXBsb2FkZXI6IFwiLnVwbG9hZFwiLFxuXHRcdHBhZ2luZzogXCIucGFnaW5nXCIsXG5cdFx0Z3JpZDogXCJkaXYuZ3JpZFwiLFxuXG5cdFx0YWRkOiBcImRpdi5hY3RpdmF0ZVwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmFkZFwiOiBcImFkZFRva2VuXCIsXG5cdFx0XCJjbGljayBAdWkuZG93bmxvYWRMaXN0XCI6IFwic2hvd0Rvd25sb2Fkc1wiLFxuXHR9LFxuXG5cdGNvbGxlY3Rpb25FdmVudHM6IHtcblx0XHRcInRvb2xiYXI6Y2xpY2s6ZGVhY3RpdmF0ZVwiOiBcImRlYWN0aXZhdGVUb2tlblwiLFxuXHRcdFwidG9vbGJhcjpjbGljazphY3RpdmF0ZVwiOiBcImFjdGl2YXRlVG9rZW5cIixcblx0XHRcInRvb2xiYXI6Y2xpY2s6Y2hhbmdlbG9nXCI6IFwiY2hhbmdlbG9nXCIsXG5cdH0sXG5cblx0c2hvd0Rvd25sb2FkczogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0Y29uc3QgbGlzdCA9IG5ldyBTaW1wbGVNZW51KHtcblx0XHRcdGFuY2hvcjogdGhpcy51aS5kb3dubG9hZExpc3QsXG5cdFx0XHRzaWRlOiBcImxlZnRcIixcblx0XHRcdHN0cnVjdHVyZTogW1xuXHRcdFx0XHR7IGNsb3NlT25DbGljazogdHJ1ZSwgZWxlbWVudHM6IFtcblx0XHRcdFx0XHR7IHRleHQ6IFwiRXhwb3J0IGxpc3Qgb2YgdG9rZW5zXCIsIGlkOiBcInRva2Vuc1wiIH0sXG5cdFx0XHRcdFx0eyB0ZXh0OiBcIkV4cG9ydCB0b2tlbiBzdW1tYXJ5XCIsIGlkOiBcInN1bW1hcnlcIiB9LFxuXHRcdFx0XHRcdHsgdGV4dDogXCJFeHBvcnQgcmVxdWlyZWQgbGljZW5zZXNcIiwgaWQ6IFwicmVxdWlyZWRcIiB9LFxuXHRcdFx0XHRdIH0sXG5cdFx0XHRdLFxuXHRcdH0pO1xuXHRcdGxpc3Quc2hvdygpO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhsaXN0LCBcImNsaWNrZWQ6dG9rZW5zXCIsIHRoaXMuZG93bmxvYWRMaXN0LmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8obGlzdCwgXCJjbGlja2VkOnN1bW1hcnlcIiwgdGhpcy5kb3dubG9hZFN1bW1hcnkuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5saXN0ZW5UbyhsaXN0LCBcImNsaWNrZWQ6cmVxdWlyZWRcIiwgdGhpcy5kb3dubG9hZFJlcXVpcmVkLmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdGZpbHRlckRlYWN0aXZhdGU6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0Y29uc3QgdXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cblx0XHRyZXR1cm4gIXNldHRpbmdzLmZjQ2xpZW50ICYmICFtb2RlbC5nZXQoXCJkZWFjdGl2YXRlZFwiKSAmJiAhbW9kZWwuZ2V0KFwicmV2b2tlZFwiKSAmJiBtb2RlbC5nZXQoXCJib29rX2lkXCIpICYmIHJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAudHJhbmNoZXMuZGVhY3RpdmF0ZSwgdXNlcikgJiZcblx0XHRcdHJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAuYXBpLnRva2Vucy50cmFuY2hlcy5hY3RpdmF0aW9uLmRlbGV0ZSwgdXNlcik7XG5cdH0sXG5cblx0ZmlsdGVyQWN0aXZhdGU6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0Y29uc3QgdXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cblx0XHRyZXR1cm4gIXNldHRpbmdzLmZjQ2xpZW50ICYmIG1vZGVsLmdldChcImRlYWN0aXZhdGVkXCIpICYmICFtb2RlbC5nZXQoXCJyZXZva2VkXCIpICYmIG1vZGVsLmdldChcImJvb2tfaWRcIikgJiYgcmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5hcGkudG9rZW5zLnRyYW5jaGVzLmFjdGl2YXRpb24ucHV0LCB1c2VyKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgY29sdW1ucyA9IFtcblx0XHRcdHsgbmFtZTogXCJ0aXRsZVwiLCBsYWJlbDogXCJQcm9kdWN0XCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSwgdG9vbHRpcDogXCJ0aXRsZVwiIH0sXG5cdFx0XHR7IG5hbWU6IFwiYm9va1wiLCBsYWJlbDogXCJVbml2ZXJzYWwgSURcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiaXNiblwiLCBsYWJlbDogXCJJU0JOXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImNyZWF0ZWRcIiwgbGFiZWw6IFwiQ3JlYXRlZFwiLCBjZWxsOiBTZXJ2ZXJHcmlkLk1vbWVudENlbGwuZXh0ZW5kKHtcblx0XHRcdFx0bW9kZWxJblVuaXhUaW1lc3RhbXA6IHRydWUsXG5cdFx0XHRcdGRpc3BsYXlGb3JtYXQ6IFwiREQgTU1NIFlZWVksIEhIOm1tOnNzIGFcIixcblx0XHRcdFx0ZGlzcGxheUluVVRDOiBmYWxzZSxcblx0XHRcdH0pLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJncm91cENvdW50XCIsIGxhYmVsOiBcIkdyb3Vwc1wiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJyZXZva2VkXCIsIGxhYmVsOiBcIlJldm9rZWQ/XCIsIGNlbGw6IFNlcnZlckdyaWQuQm9vbGVhbkljb25DZWxsLmV4dGVuZCh7fSksIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImFjdGl2YXRlZFwiLCBsYWJlbDogXCJBY3RpdmF0ZWQ/XCIsIGNlbGw6IFNlcnZlckdyaWQuQm9vbGVhbkljb25DZWxsLmV4dGVuZCh7fSksIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImFjdGl2ZV9saWNlbnNlc1wiLCBsYWJlbDogXCJMaWNlbnNlc1wiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJpbl91c2VcIiwgbGFiZWw6IFwiIyBJbiBVc2VcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiZXhwaXJlZFwiLCBsYWJlbDogXCIjIEV4cGlyZWRcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwib3duZWRcIiwgbGFiZWw6IFwiIyBPd25lZFwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJjb25zdW1lZFwiLCBsYWJlbDogXCIjIENvbnN1bWVkXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImR1cmF0aW9uXCIsIGxhYmVsOiBcIkR1cmF0aW9uXCIsIGNlbGw6IFNlcnZlckdyaWQuRHVyYXRpb25DZWxsLmV4dGVuZCh7fSksIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImdyYWNlXCIsIGxhYmVsOiBcIkdyYWNlIFBlcmlvZFwiLCBjZWxsOiBTZXJ2ZXJHcmlkLkR1cmF0aW9uQ2VsbC5leHRlbmQoe30pLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbGFiZWw6IFwiQWN0aW9uc1wiLCBjZWxsOiBuZXcgU2VydmVyR3JpZC5Ub29sYmFyQ2VsbCh7IHRvb2x0aXBzOiBbXG5cdFx0XHRcdHsgdGl0bGU6IFwiQ2hhbmdlbG9nXCIsIGljb246IFwiZmEtbGlzdC11bFwiIH0sXG5cdFx0XHRcdHsgdGl0bGU6IFwiRGVhY3RpdmF0ZVwiLCBpY29uOiBcImZhLXRpbWVzLWNpcmNsZVwiLCBmaWx0ZXI6IHRoaXMuZmlsdGVyRGVhY3RpdmF0ZS5iaW5kKHRoaXMpIH0sXG5cdFx0XHRcdHsgdGl0bGU6IFwiQWN0aXZhdGVcIiwgaWNvbjogXCJmYS1jaGVjay1jaXJjbGVcIiwgZmlsdGVyOiB0aGlzLmZpbHRlckFjdGl2YXRlLmJpbmQodGhpcykgfSxcblx0XHRcdF0gfSksIGVkaXRhYmxlOiBmYWxzZSwgc29ydGFibGU6IGZhbHNlIH0sXG5cdFx0XTtcblxuXHRcdHRoaXMuZ3JpZCA9IG5ldyBTZXJ2ZXJHcmlkKHtcblx0XHRcdGVsOiB0aGlzLnVpLmdyaWQsXG5cdFx0XHRjb2x1bW5zOiBjb2x1bW5zLFxuXHRcdFx0Y29sbGVjdGlvbjogbmV3IENvbGxlY3Rpb24oKSxcblx0XHRcdGNsaWNrYWJsZTogdHJ1ZSxcblx0XHRcdHdhaXRGb3JGaWx0ZXJzOiB0cnVlLFxuXHRcdFx0Y291bnRlcjoge1xuXHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLmNvdW50ZXIsXG5cdFx0XHRcdHRlbXBsYXRlOiBcIlRva2VucyAkc3RhcnQgLSAkZW5kIG9mICR0b3RhbFwiLFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLnBhZ2luZyxcblx0XHRcdH0sXG5cdFx0fSk7XG5cblx0XHR0aGlzLmJpbmRFdmVudHModGhpcy5ncmlkLmNvbGxlY3Rpb24sIHRoaXMuY29sbGVjdGlvbkV2ZW50cyk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZ3JpZCwgXCJyb3c6Y2xpY2tlZFwiLCB0aGlzLmFzc2lnblRvR3JvdXAuYmluZCh0aGlzKSk7XG5cblxuXHRcdGNvbnN0IHRleHRGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcInRleHRcIixcblx0XHRcdG5hbWU6IFwidGV4dEZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiVGV4dCBTZWFyY2hcIixcblx0XHRcdGRlYm91bmNlOiAyMDAsXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdGNvbnN0IGhpZGVVc2VkVG9rZW5zID0ge1xuXHRcdFx0dHlwZTogXCJ0b2dnbGVcIixcblx0XHRcdG5hbWU6IFwiaGlkZVVzZWRUb2tlbnNcIixcblx0XHRcdGxhYmVsOiBcIkhpZGUgdXNlZCB0b2tlbnNcIixcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHRcdGluaXRpYWxWYWx1ZTogKCkgPT4gW3RydWVdLFxuXHRcdH07XG5cblx0XHRjb25zdCBoaWRlUmV2b2tlZFRva2VucyA9IHtcblx0XHRcdHR5cGU6IFwidG9nZ2xlXCIsXG5cdFx0XHRuYW1lOiBcImhpZGVSZXZva2VkVG9rZW5zXCIsXG5cdFx0XHRsYWJlbDogXCJIaWRlIHJldm9rZWQgdG9rZW5zXCIsXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0XHRpbml0aWFsVmFsdWU6ICgpID0+IFt0cnVlXSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgaGlkZUV4cGlyZWRUb2tlbnMgPSB7XG5cdFx0XHR0eXBlOiBcInRvZ2dsZVwiLFxuXHRcdFx0bmFtZTogXCJoaWRlRXhwaXJlZFRva2Vuc1wiLFxuXHRcdFx0bGFiZWw6IFwiSGlkZSBleHBpcmVkIHRva2Vuc1wiLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdFx0aW5pdGlhbFZhbHVlOiAoKSA9PiBbdHJ1ZV0sXG5cdFx0fTtcblxuXHRcdGNvbnN0IGxhbmd1YWdlRmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJsYW5ndWFnZUZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiTGFuZ3VhZ2VcIixcblx0XHRcdGNhdGVnb3JpZXM6IFtcblx0XHRcdFx0eyBpdGVtczogc2V0dGluZ3MubGFuZ3VhZ2VMaXN0IH0sXG5cdFx0XHRdLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdH07XG5cblx0XHRjb25zdCBzdWJqZWN0RmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJzdWJqZWN0RmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJTdWJqZWN0XCIsXG5cdFx0XHRzZXJ2ZXI6IHtcblx0XHRcdFx0a2V5OiBcInN1YmplY3RfaWRcIixcblx0XHRcdFx0dmFsdWU6IFwic3ViamVjdFwiLFxuXHRcdFx0XHRmZXRjaDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvZGF0YS9zdWJqZWN0c1wiLFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRwYWdlU2l6ZTogMzAsXG5cdFx0XHRcdGluZmluaXRlOiB0cnVlLFxuXHRcdFx0fSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgZ3JhZGVGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcImdyYWRlRmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJZZWFyIG9mIFN0dWR5XCIsXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0XHRjYXRlZ29yaWVzOiBfLm1hcChzZXR0aW5ncy5ncmFkZUxpc3QsICh2YWwsIGtleSkgPT4gKHtcblx0XHRcdFx0bGFiZWw6IGtleSxcblx0XHRcdFx0aXRlbXM6IF8ucmVkdWNlKHZhbC5zb3J0KChhLCBiKSA9PiAoXCJsZXhpY2FsXCIgaW4gYSA/IGEubGV4aWNhbCA6IGEubmFtZSkudG9VcHBlckNhc2UoKS5sb2NhbGVDb21wYXJlKChcImxleGljYWxcIiBpbiBiID8gYi5sZXhpY2FsIDogYi5uYW1lKS50b1VwcGVyQ2FzZSgpKSksXG5cdFx0XHRcdFx0KHN1bSwgbnVtKSA9PiB7IHN1bS5wdXNoKHsgbmFtZTogbnVtLnZhbHVlLCBsYWJlbDogbnVtLm5hbWUgfSk7IHJldHVybiBzdW07IH0sIFtdKSxcblx0XHRcdH0pKSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgZm9ybWF0RmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJmb3JtYXRGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIkZvcm1hdFwiLFxuXHRcdFx0Y2F0ZWdvcmllczogW1xuXHRcdFx0XHR7IGl0ZW1zOiB7IG1wZGY6IFwiUERGXCIsIG1wdWI6IFwiRVBVQlwiIH0gfSxcblx0XHRcdF0sXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdGNvbnN0IHB1YkZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiaXRlbWl6ZWRcIixcblx0XHRcdG5hbWU6IFwicHViRmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJQdWJsaXNoZXJcIixcblx0XHRcdHNlcnZlcjoge1xuXHRcdFx0XHRrZXk6IFwicHVibGlzaGVyX2lkXCIsXG5cdFx0XHRcdHZhbHVlOiBcImZ1bGxuYW1lXCIsXG5cdFx0XHRcdGZldGNoOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9kYXRhL3B1Ymxpc2hlcnM/ZHVtbXk9ZmFsc2UmYWN0aXZlPXRydWVcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0cGFnZVNpemU6IDMwLFxuXHRcdFx0XHRpbmZpbml0ZTogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0fTtcblxuXHRcdGNvbnN0IGZpbHRlckxpc3QgPSBbdGV4dEZpbHRlciwgaGlkZVVzZWRUb2tlbnMsIGhpZGVSZXZva2VkVG9rZW5zLCBoaWRlRXhwaXJlZFRva2VucywgbGFuZ3VhZ2VGaWx0ZXIsIHN1YmplY3RGaWx0ZXIsIGdyYWRlRmlsdGVyLCBmb3JtYXRGaWx0ZXIsIHB1YkZpbHRlcl07XG5cblx0XHR0aGlzLnVpLmZpbHRlckJhci5wcmVwZW5kKHRoaXMuZ3JpZC5maWx0ZXIoe1xuXHRcdFx0ZmlsdGVyQ29udGFpbmVyOiB0aGlzLnVpLmZpbHRlckJhcixcblx0XHRcdGZpbHRlcnM6IGZpbHRlckxpc3QsXG5cdFx0XHRkZWZhdWx0RmlsdGVyczogW1widGV4dEZpbHRlclwiLCBcImhpZGVVc2VkVG9rZW5zXCIsIFwiaGlkZVJldm9rZWRUb2tlbnNcIiwgXCJoaWRlRXhwaXJlZFRva2Vuc1wiXSxcblx0XHR9KS5yZW5kZXIoKS5lbCk7XG5cdH0sXG5cblx0ZGVhY3RpdmF0ZVRva2VuOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdHRoaXMubW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHR3YXJuaW5nOiB0cnVlLFxuXHRcdFx0dGl0bGU6IFwiPHNwYW4gY2xhc3M9J2ZhbCBmYS10aW1lcycvPiBEZWFjdGl2YXRlIFRva2VuXCIsXG5cdFx0XHRib2R5OiBcIjxwPlRoaXMgd2lsbCBkZWFjdGl2YXRlIHRoZSBjaG9zZW4gdG9rZW4uIERlYWN0aXZhdGVkIHRva2VucyBhbmQgYWxsIGFzc29jaWF0ZWQgbGljZW5zZXMgd2lsbCBub3QgYmUgdXNhYmxlLjwvcD5cIixcblx0XHRcdHBlcnNpc3Q6IHRydWUsXG5cdFx0fSk7XG5cblx0XHR0aGlzLm1vZGFsLm9uKFwiYnV0dG9uOm9rXCIsICgpID0+IHtcblx0XHRcdCQuYWpheCh7XG5cdFx0XHRcdG1ldGhvZDogXCJERUxFVEVcIixcblx0XHRcdFx0dXJsOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC90b2tlbnMvdHJhbmNoZXMvYWN0aXZhdGlvbi9cIiArIG1vZGVsLmdldChcIl9pZFwiKSxcblx0XHRcdFx0c3VjY2VzczogdGhpcy5kZWFjdGl2YXRpb25TdWNjZXNzLmJpbmQodGhpcywgbW9kZWwpLFxuXHRcdFx0XHRlcnJvcjogdGhpcy5kZWFjdGl2YXRpb25FcnJvci5iaW5kKHRoaXMsIG1vZGVsKSxcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5tb2RhbC5zaG93KCk7XG5cdH0sXG5cblx0ZGVhY3RpdmF0aW9uU3VjY2VzczogZnVuY3Rpb24obW9kZWwpIHtcblx0XHR0aGlzLm1vZGFsLmRlc3Ryb3koKTtcblxuXHRcdG1vZGVsLnNldCh7IGRlYWN0aXZhdGVkOiB0cnVlIH0pO1xuXHRcdG1vZGVsLmluaXRDb21wdXRlZHMoKTtcblx0XHRtb2RlbC50cmlnZ2VyKFwiZ3JpZDpyZW5kZXJcIik7XG5cdH0sXG5cblx0ZGVhY3RpdmF0aW9uRXJyb3I6IGZ1bmN0aW9uKG1vZGVsLCB4aHIpIHtcblx0XHRjb25zdCBhbnN3ZXIgPSBBcHAucGFyc2VSZXNwb25zZSh4aHIpO1xuXHRcdHRoaXMubW9kYWwuc2hvd0Vycm9yKFwiRGVhY3RpdmF0aW9uIGZhaWxlZDogXCIgKyAoYW5zd2VyLmRldGFpbCB8fCBhbnN3ZXIuaW5mbykpO1xuXHR9LFxuXG5cdGFjdGl2YXRlVG9rZW46IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0dGhpcy5tb2RhbCA9IG5ldyBTbWFsbE1vZGFsKHtcblx0XHRcdHRpdGxlOiBcIjxzcGFuIGNsYXNzPSdmYWwgZmEtY2hlY2snLz4gQWN0aXZhdGUgVG9rZW5cIixcblx0XHRcdGJvZHk6IFwiPHA+VGhpcyB3aWxsIGFjdGl2YXRlIHRoZSBjaG9zZW4gdG9rZW4uPC9wPlwiLFxuXHRcdFx0cGVyc2lzdDogdHJ1ZSxcblx0XHR9KTtcblxuXHRcdHRoaXMubW9kYWwub24oXCJidXR0b246b2tcIiwgKCkgPT4ge1xuXHRcdFx0JC5hamF4KHtcblx0XHRcdFx0bWV0aG9kOiBcIlBVVFwiLFxuXHRcdFx0XHR1cmw6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3Rva2Vucy90cmFuY2hlcy9hY3RpdmF0aW9uL1wiICsgbW9kZWwuZ2V0KFwiX2lkXCIpLFxuXHRcdFx0XHRzdWNjZXNzOiB0aGlzLmFjdGl2YXRpb25TdWNjZXNzLmJpbmQodGhpcywgbW9kZWwpLFxuXHRcdFx0XHRlcnJvcjogdGhpcy5hY3RpdmF0aW9uRXJyb3IuYmluZCh0aGlzLCBtb2RlbCksXG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdHRoaXMubW9kYWwuc2hvdygpO1xuXHR9LFxuXG5cdGFjdGl2YXRpb25TdWNjZXNzOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdHRoaXMubW9kYWwuZGVzdHJveSgpO1xuXG5cdFx0bW9kZWwuc2V0KHsgZGVhY3RpdmF0ZWQ6IGZhbHNlIH0pO1xuXHRcdG1vZGVsLmluaXRDb21wdXRlZHMoKTtcblx0XHRtb2RlbC50cmlnZ2VyKFwiZ3JpZDpyZW5kZXJcIik7XG5cdH0sXG5cblx0YWN0aXZhdGlvbkVycm9yOiBmdW5jdGlvbihtb2RlbCwgeGhyKSB7XG5cdFx0Y29uc3QgYW5zd2VyID0gQXBwLnBhcnNlUmVzcG9uc2UoeGhyKTtcblx0XHR0aGlzLm1vZGFsLnNob3dFcnJvcihcIkRlYWN0aXZhdGlvbiBmYWlsZWQ6IFwiICsgKGFuc3dlci5kZXRhaWwgfHwgYW5zd2VyLmluZm8pKTtcblx0fSxcblxuXHRhc3NpZ25Ub0dyb3VwOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdGlmIChzZXR0aW5ncy5mY0NsaWVudCB8fCBtb2RlbC5nZXQoXCJkZWFjdGl2YXRlZFwiKSB8fCAhbW9kZWwuZ2V0KFwiYm9va19pZFwiKSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMubW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmFsIGZhLXNoYXJlJy8+IENoYW5nZSBHcm91cCBBc3NpZ25tZW50XCIsXG5cdFx0XHRib2R5OiBgJHttb2RlbC5nZXQoXCJyZXZva2VkXCIpID8gYDxwPjxzdHJvbmc+VGhpcyB0b2tlbiBpcyByZXZva2VkOyBpdCBubyBsb25nZXIgaGFzIGFueSBlZmZlY3QsIGFuZCBjYW5ub3QgYmUgZWRpdGVkIGVpdGhlci5cblx0XHRcdFx0RmllbGRzIGFyZSBzaG93biBmb3IgcmVmZXJlbmNlIHB1cnBvc2VzIG9ubHkuPC9zdHJvbmc+PC9wPmAgOiBcIlwifVxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwicm93XCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImxhcmdlLTEyIGNvbHVtbnNcIj5cblx0XHRcdFx0XHRcdDxsYWJlbD5Cb29rIG5hbWU8L2xhYmVsPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInByZS10aXRsZVwiPjxzdHJvbmc+JHttb2RlbC5nZXQoXCJ0aXRsZVwiKX08L3N0cm9uZz48L2Rpdj48YnIvPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwicm93XCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImxhcmdlLTMgY29sdW1uc1wiPlxuXHRcdFx0XHRcdFx0PGxhYmVsPlxuXHRcdFx0XHRcdFx0XHRQdWJsaXNoZXJcblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInRleHR1YWwgYm9sZFwiPiR7bW9kZWwuZ2V0KFwicHVibGlzaGVyXCIpIHx8IFwiKHVua25vd24pXCJ9PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2xhYmVsPlxuXHRcdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImxhcmdlLTMgY29sdW1uc1wiPlxuXHRcdFx0XHRcdFx0PGxhYmVsPlxuXHRcdFx0XHRcdFx0XHRTdWJqZWN0XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZXh0dWFsIGJvbGRcIj4ke21vZGVsLmdldChcInN1YmplY3RcIil9PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2xhYmVsPlxuXHRcdFx0XHRcdDwvZGl2PlxuXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImxhcmdlLTMgY29sdW1uc1wiPlxuXHRcdFx0XHRcdFx0PGxhYmVsPlxuXHRcdFx0XHRcdFx0XHRZZWFyIG9mIFN0dWR5XG5cdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0ZXh0dWFsIGJvbGRcIj4ke2dyYWRlTWFwLmNvZGVUb0h1bWFuVmFsdWUobW9kZWwuZ2V0KFwiZ3JhZGVcIikpfTwvZGl2PlxuXHRcdFx0XHRcdFx0PC9sYWJlbD5cblx0XHRcdFx0XHQ8L2Rpdj5cblxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJsYXJnZS0zIGNvbHVtbnNcIj5cblx0XHRcdFx0XHRcdDxsYWJlbD5cblx0XHRcdFx0XHRcdFx0SVNCTlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGV4dHVhbCBib2xkXCI+JHttb2RlbC5nZXQoXCJpc2JuXCIpfTwvZGl2PlxuXHRcdFx0XHRcdFx0PC9sYWJlbD5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDxocj5cblx0XHRcdFx0PHA+QXNzaWduaW5nIHRoaXMgdG9rZW4gdG8gb25lIG9yIG1vcmUgZ3JvdXAgd2lsbCBnaXZlIG91dCBsaWNlbnNlcyB0byBhbGwgdGhlIG1lbWJlcnMgb2YgdGhlIGdyb3VwcyB1bnRpbCBhbGwgYXZhaWxhYmxlIGxpY2Vuc2VzIGFyZSBjb25zdW1lZCxcblx0XHRcdFx0b3IgYWxsIG1lbWJlcnMgb2YgdGhlIGdyb3VwIGhhdmUgYSBsaWNlbnNlLjwvcD5cblx0XHRcdFx0PHA+PHNlbGVjdCAke21vZGVsLmdldChcInJldm9rZWRcIikgPyBcImRpc2FibGVkXCIgOiBcIlwifS8+PC9wPlxuXHRcdFx0XHQ8cD5MaW1pdCB0aGUgbnVtYmVyIG9mIGxpY2Vuc2VzIHRoYXQgd2lsbCBiZSBhdXRvLWlzc3VlZCBhdCBhIHRpbWUgdG8gdGhpcyBudW1iZXI6XG5cdFx0XHRcdFx0PGlucHV0IHR5cGU9XCJudW1iZXJcIiAke21vZGVsLmdldChcInJldm9rZWRcIikgPyBcImRpc2FibGVkXCIgOiBcIlwifSB2YWx1ZT1cIiR7bW9kZWwuZ2V0KFwibGljZW5zZUxpbWl0XCIpfVwiIG1pbj1cIjBcIiBtYXg9XCI5OTk5OTk5OTlcIlxuXHRcdFx0XHRcdFx0bmFtZT1cImxpY2Vuc2VMaW1pdFwiIHBsYWNlaG9sZGVyPVwiTGljZW5zZSBBc3NpZ25hdGlvbiBMaW1pdFwiPjwvcD5cblx0XHRcdFx0PHA+SWYgYSB1c2VyIGFscmVhZHkgaGFzIGEgdG9rZW4sIG9yIGhhcyBwZXJzb25hbGx5IGJvdWdodCB0aGUgYm9vaywgdGhleSB3aWxsIG5vdCBiZSBhc3NpZ25lZCBhIG5ldyBvbmUuPC9wPmAsXG5cdFx0XHRwZXJzaXN0OiB0cnVlLFxuXHRcdFx0aGlkZUJ1dHRvbnM6IChtb2RlbC5nZXQoXCJyZXZva2VkXCIpID8gW1wiY2FuY2VsXCJdIDogW10pLFxuXHRcdH0pO1xuXG5cdFx0Y29uc3QgZ3JvdXAgPSBuZXcgU2VsZWN0cmEoe1xuXHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRzZXJ2ZXI6IHtcblx0XHRcdFx0ZmV0Y2g6IGAke3NldHRpbmdzLnVybFJvb3R9L2FwaS8xLjAvZ3JvdXBzYCxcblx0XHRcdFx0ZGVsYXlMb2FkOiB0cnVlLFxuXHRcdFx0XHRrZXk6IFwiZ3JvdXBfaWRcIixcblx0XHRcdFx0dmFsdWU6IFwibmFtZVwiLFxuXHRcdFx0XHRkZWZhdWx0OiB7XG5cdFx0XHRcdFx0ZmV0Y2g6IGAke3NldHRpbmdzLnVybFJvb3R9L2FjYWNpYS90cmFuY2hlcy8ke21vZGVsLmlkfS9ncm91cHNgLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRwYXJhbXM6IHtcblx0XHRcdFx0XHRleHRlbmRlZE5hbWU6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdHBhZ2VTaXplOiAyMCxcblx0XHRcdFx0aW5maW5pdGU6IHRydWUsXG5cdFx0XHR9LFxuXHRcdFx0cGxhY2Vob2xkZXI6IFwiQ2hvb3NlIHRoZSBncm91cHMgdG8gYXNzaWduIHRoaXMgdG9rZW4gdG9cIixcblx0XHRcdGRkSG9zdDogXCIubW9kYWwtY29udGFpbmVyXCIsXG5cdFx0fSk7XG5cblx0XHR0aGlzLm1vZGFsLm9uKFwiYnV0dG9uOm9rXCIsICgpID0+IHtcblx0XHRcdGlmIChtb2RlbC5nZXQoXCJyZXZva2VkXCIpKVxuXHRcdFx0XHRyZXR1cm4gdGhpcy5tb2RhbC5kZXN0cm95KCk7XG5cblx0XHRcdGxldCBnID0gXy5tYXAoZ3JvdXAuZ2V0U2VsZWN0ZWQoKSB8fCBbXSwgeCA9PiB4Lmdyb3VwX2lkKTtcblx0XHRcdGlmICghZy5sZW5ndGgpXG5cdFx0XHRcdGcgPSBcIltdXCI7XG5cblx0XHRcdGNvbnN0IGMgPSBwYXJzZUludCgkKFwiaW5wdXRbdHlwZT0nbnVtYmVyJ11cIiwgdGhpcy5tb2RhbC5lbCkudmFsKCksIDEwKTtcblxuXHRcdFx0Y29uc3QgZGF0YSA9IHsgZ3JvdXBzOiBnIH07XG5cdFx0XHRpZiAoYyB8fCBjID09PSAwKVxuXHRcdFx0XHRkYXRhLmN1dG9mZiA9IGM7XG5cblx0XHRcdCQuYWpheCh7XG5cdFx0XHRcdG1ldGhvZDogXCJQVVRcIixcblx0XHRcdFx0dXJsOiBgJHtzZXR0aW5ncy51cmxSb290fS9hcGkvMS4wL3Rva2Vucy90cmFuY2hlcy8ke21vZGVsLmdldChcIl9pZFwiKX0vZ3JvdXBzL2Fzc2lnbmAsXG5cdFx0XHRcdGRhdGEsXG5cdFx0XHRcdHN1Y2Nlc3M6IHRoaXMuYXNzaWduU3VjY2Vzcy5iaW5kKHRoaXMsIG1vZGVsKSxcblx0XHRcdFx0ZXJyb3I6IHRoaXMuYXNzaWduRXJyb3IuYmluZCh0aGlzLCBtb2RlbCksXG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdHRoaXMubW9kYWwuc2hvdygpO1xuXG5cdFx0Z3JvdXAuc2hvdyh7IGVsOiAkKFwic2VsZWN0XCIsIHRoaXMubW9kYWwuJGVsKSB9KTtcblx0fSxcblxuXHRhc3NpZ25TdWNjZXNzOiBmdW5jdGlvbihtb2RlbCwgZGF0YSkge1xuXHRcdHRoaXMubW9kYWwuZGVzdHJveSgpO1xuXG5cdFx0bW9kZWwuc2V0KGRhdGEpO1xuXHRcdG1vZGVsLmluaXRDb21wdXRlZHMoKTtcblx0XHRtb2RlbC50cmlnZ2VyKFwiZ3JpZDpyZW5kZXJcIik7XG5cdH0sXG5cblx0YXNzaWduRXJyb3I6IGZ1bmN0aW9uKG1vZGVsLCB4aHIpIHtcblx0XHRjb25zdCBhbnN3ZXIgPSBBcHAucGFyc2VSZXNwb25zZSh4aHIpO1xuXHRcdHRoaXMubW9kYWwuc2hvd0Vycm9yKFwiQXNzaWduYXRpb24gZmFpbGVkOiBcIiArIChhbnN3ZXIuZGV0YWlsIHx8IGFuc3dlci5pbmZvKSk7XG5cdH0sXG5cblx0Y2hhbmdlbG9nOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdGNvbnN0IGNoYW5nZWxvZyA9IG5ldyBDaGFuZ2Vsb2coeyBtb2RlbCB9KTtcblxuXHRcdGNoYW5nZWxvZy5zaG93KCk7XG5cdH0sXG5cblx0ZG93bmxvYWRMaXN0OiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBwYXJhbXMgPSB0aGlzLmdyaWQuZmlsdGVyLmdldFNlcnZlckZpbHRlcnMoKTtcblx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC90b2tlbnMvdHJhbmNoZXMvbGlzdHMvdG9rZW5zP1wiICsgcXMuc3RyaW5naWZ5KHBhcmFtcykpO1xuXHR9LFxuXG5cdGRvd25sb2FkU3VtbWFyeTogZnVuY3Rpb24oKSB7XG5cdFx0Ly9jb25zdCBwYXJhbXMgPSB0aGlzLmdyaWQuZmlsdGVyLmdldFNlcnZlckZpbHRlcnMoKTtcblx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC90b2tlbnMvdHJhbmNoZXMvbGlzdHMvc3VtbWFyeVwiKTtcblx0fSxcblxuXHRkb3dubG9hZFJlcXVpcmVkOiBmdW5jdGlvbigpIHtcblx0XHQvL2NvbnN0IHBhcmFtcyA9IHRoaXMuZ3JpZC5maWx0ZXIuZ2V0U2VydmVyRmlsdGVycygpO1xuXHRcdHdpbmRvdy5vcGVuKHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3Rva2Vucy90cmFuY2hlcy9saXN0cy9yZXF1aXJlZFwiKTtcblx0fSxcblxuXHRhZGRUb2tlbjogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0Y29uc3QgbW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmFsIGZhLWtleScvPiBBY3RpdmF0ZSBBIE5ldyBUb2tlblwiLFxuXHRcdFx0Ym9keTogXCI8cD5FbnRlciB0aGUgdG9rZW4gYmVsb3cuPC9wPjxwPjx0ZXh0YXJlYSByb3dzPSc4Jz48L3RleHRhcmVhPjwvcD5cIixcblx0XHRcdHBlcnNpc3Q6IHRydWUsXG5cdFx0fSk7XG5cblx0XHRjb25zdCB0b2tlblN1Y2Nlc3MgPSAoKSA9PiB7XG5cdFx0XHRtb2RhbC5kZXN0cm95KCk7XG5cdFx0fTtcblxuXHRcdGNvbnN0IHRva2VuRXJyb3IgPSAobW9kZWwsIHhocikgPT4ge1xuXHRcdFx0Y29uc3QgYW5zd2VyID0gQXBwLnBhcnNlUmVzcG9uc2UoeGhyKTtcblx0XHRcdHJldHVybiBtb2RhbC5lbmFibGVCdXR0b25zKCkuaGlkZVNwaW5uZXIoKS5zaG93RXJyb3IoYW5zd2VyLmRldGFpbCB8fCBhbnN3ZXIuaW5mbyk7XG5cdFx0fTtcblxuXHRcdG1vZGFsLm9uKFwiYnV0dG9uOm9rXCIsICgpID0+IHtcblx0XHRcdGNvbnN0IHRva2VuID0gJChcInRleHRhcmVhXCIsIG1vZGFsLmVsKS52YWwoKTtcblx0XHRcdGlmICghdG9rZW4pXG5cdFx0XHRcdHJldHVybiBtb2RhbC5lbmFibGVCdXR0b25zKCkuaGlkZVNwaW5uZXIoKS5zaG93RXJyb3IoXCJObyB0b2tlbiBwcm92aWRlZFwiKTtcblxuXHRcdFx0Y29uc3QgbW9kZWwgPSBuZXcgVG9rZW5Nb2RlbCh7IHRva2VuOiB0b2tlbiB9KTtcblxuXHRcdFx0bW9kZWwuc2F2ZShudWxsLCB7IHdhaXQ6IHRydWUsIHN1Y2Nlc3M6IHRva2VuU3VjY2Vzcy5iaW5kKHRoaXMpLCBlcnJvcjogdG9rZW5FcnJvci5iaW5kKHRoaXMpIH0pO1xuXHRcdH0pO1xuXG5cdFx0bW9kYWwuc2hvdygpO1xuXHR9LFxufSk7Il19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar _ = require(\"lodash\");\nvar settings = require(\"app-settings\");\n\nvar App = require(\"../../index\");\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar NewsletterName = Backbone.Model.extend({\n\tdefaults: {},\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/newsletter/name\";\n\t}\n});\n\nvar Newsletter = Backbone.Model.extend({\n\tdefaults: {},\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/newsletter\";\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"content newsletter\",\n\n\ttemplate: require(\"../templates/newsletter.nunj\"),\n\n\tui: {\n\t\tcurrentName: \"div.current\",\n\t\tnewFile: \"div.new\",\n\t\tuploader: \"input[type='button']\",\n\t\tpdf: \"input[type='file']\",\n\t\tuploadError: \"p.error\",\n\t\tspinner: \".spinner-icon\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.uploader\": \"doUpload\"\n\t},\n\n\tsave: function save() {\n\t\tif (this.ui.apk.get(0).files.length > 0) this.model.setFile(\"apk\", this.ui.apk.get(0).files[0]);\n\n\t\tthis.ui.saveButton.attr(\"disabled\", true);\n\t\tthis.ui.working.removeClass(\"hide\");\n\t\tthis.model.upload({ ios: _.trim(this.ui.ios.val()), windows: _.trim(this.ui.win.val()) }, { success: this.saveSuccess.bind(this), error: this.saveError.bind(this) });\n\t},\n\n\tsaveSuccess: function saveSuccess() {\n\t\tthis.ui.saveButton.attr(\"disabled\", false);\n\t\tthis.ui.working.addClass(\"hide\");\n\n\t\tthis.ui.apk.get(0).value = null;\n\t},\n\n\tsaveError: function saveError() {\n\t\tif (!this.ui.saveButton.attr) return;\n\t\tthis.ui.saveButton.attr(\"disabled\", false);\n\t\tthis.ui.working.addClass(\"hide\");\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tif (this.xhr) {\n\t\t\tthis.xhr.abort();\n\t\t\tthis.xhr = null;\n\t\t}\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.name = new NewsletterName();\n\t\tthis.name.fetch({ success: this.nameSuccess.bind(this), error: this.nameError.bind(this) });\n\t},\n\n\tnameSuccess: function nameSuccess() {\n\t\tif (!this.ui.currentName.html) return;\n\n\t\tif (this.name.get(\"name\") === \"\") this.ui.currentName.html(\"There is currently no active newsletter\");else this.ui.currentName.html(\"Current newsletter: <a href='\" + settings.urlRoot + \"/api/1.0/newsletter/download'>\" + this.name.get(\"name\") + \"</a>\");\n\n\t\tthis.ui.newFile.removeClass(\"hide\");\n\t},\n\n\tnameError: function nameError() {\n\t\tif (!this.ui.currentName.html) return;\n\t\tthis.ui.currentName.html(\"There was an error checking the current newsletter!\");\n\t},\n\n\tdoUpload: function doUpload(evt) {\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\n\t\tif (this.ui.pdf.get(0).files.length === 0) return this.ui.uploadError.text(\"No file was selected\");\n\n\t\tvar name = this.ui.pdf.get(0).files[0].name;\n\t\tvar ext = name.split(\".\").pop();\n\t\tif (!ext || ext.toLowerCase() !== \"pdf\") return this.ui.uploadError.text(\"That file does not appear to be a PDF\");\n\n\t\tthis.model = new Newsletter();\n\t\tthis.model.setFile(\"apk\", this.ui.pdf.get(0).files[0]);\n\n\t\tthis.ui.uploader.attr(\"disabled\", true);\n\t\tthis.ui.spinner.removeClass(\"hide\");\n\t\tthis.xhr = this.model.binarySave(null, _.extend({ wait: true, data: {} }, { success: this.onSaveSuccess.bind(this), error: this.onSaveError.bind(this) }));\n\t},\n\n\tonSaveSuccess: function onSaveSuccess() {\n\t\tthis.ui.uploader.attr(\"disabled\", false);\n\t\tthis.ui.pdf.get(0).value = null;\n\t\tthis.ui.spinner.addClass(\"hide\");\n\t\tradio.trigger(App.Events.Commands.Toast, { content: \"Newsletter successfully updated\" });\n\n\t\tthis.ui.currentName.html(\"Current newsletter: <a href='\" + settings.urlRoot + \"/api/1.0/newsletter/download'>\" + this.model.get(\"name\") + \"</a>\");\n\t},\n\n\tonSaveError: function onSaveError(model, xhr) {\n\t\tthis.ui.uploader.attr(\"disabled\", false);\n\t\tthis.ui.spinner.addClass(\"hide\");\n\t\tvar answer = App.parseResponse(xhr);\n\t\talert(\"Error saving news newsletter: \" + (answer.detail || answer.info));\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5ld3NsZXR0ZXIuanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwiXyIsInNldHRpbmdzIiwiQXBwIiwicmFkaW8iLCJSYWRpbyIsImNoYW5uZWwiLCJOZXdzbGV0dGVyTmFtZSIsIk1vZGVsIiwiZXh0ZW5kIiwiZGVmYXVsdHMiLCJ1cmwiLCJ1cmxSb290IiwiTmV3c2xldHRlciIsIm1vZHVsZSIsImV4cG9ydHMiLCJNYXJpb25ldHRlIiwiVmlldyIsInRhZ05hbWUiLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsInVpIiwiY3VycmVudE5hbWUiLCJuZXdGaWxlIiwidXBsb2FkZXIiLCJwZGYiLCJ1cGxvYWRFcnJvciIsInNwaW5uZXIiLCJldmVudHMiLCJzYXZlIiwiYXBrIiwiZ2V0IiwiZmlsZXMiLCJsZW5ndGgiLCJtb2RlbCIsInNldEZpbGUiLCJzYXZlQnV0dG9uIiwiYXR0ciIsIndvcmtpbmciLCJyZW1vdmVDbGFzcyIsInVwbG9hZCIsImlvcyIsInRyaW0iLCJ2YWwiLCJ3aW5kb3dzIiwid2luIiwic3VjY2VzcyIsInNhdmVTdWNjZXNzIiwiYmluZCIsImVycm9yIiwic2F2ZUVycm9yIiwiYWRkQ2xhc3MiLCJ2YWx1ZSIsIm9uQmVmb3JlRGVzdHJveSIsInhociIsImFib3J0Iiwib25SZW5kZXIiLCJuYW1lIiwiZmV0Y2giLCJuYW1lU3VjY2VzcyIsIm5hbWVFcnJvciIsImh0bWwiLCJkb1VwbG9hZCIsImV2dCIsInN0b3BQcm9wYWdhdGlvbiIsInByZXZlbnREZWZhdWx0IiwidGV4dCIsImV4dCIsInNwbGl0IiwicG9wIiwidG9Mb3dlckNhc2UiLCJiaW5hcnlTYXZlIiwid2FpdCIsImRhdGEiLCJvblNhdmVTdWNjZXNzIiwib25TYXZlRXJyb3IiLCJ0cmlnZ2VyIiwiRXZlbnRzIiwiQ29tbWFuZHMiLCJUb2FzdCIsImNvbnRlbnQiLCJhbnN3ZXIiLCJwYXJzZVJlc3BvbnNlIiwiYWxlcnQiLCJkZXRhaWwiLCJpbmZvIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1FLFdBQVdGLFFBQVEsY0FBUixDQUFqQjs7QUFFQSxJQUFNRyxNQUFNSCxRQUFRLGFBQVIsQ0FBWjtBQUNBLElBQU1JLFFBQVFMLFNBQVNNLEtBQVQsQ0FBZUMsT0FBZixDQUF1QixRQUF2QixDQUFkOztBQUVBLElBQU1DLGlCQUFpQlIsU0FBU1MsS0FBVCxDQUFlQyxNQUFmLENBQXNCO0FBQzVDQyxXQUFVLEVBRGtDOztBQUc1Q0MsTUFBSyxlQUFXO0FBQ2YsU0FBT1QsU0FBU1UsT0FBVCxHQUFtQiwwQkFBMUI7QUFDQTtBQUwyQyxDQUF0QixDQUF2Qjs7QUFRQSxJQUFNQyxhQUFhZCxTQUFTUyxLQUFULENBQWVDLE1BQWYsQ0FBc0I7QUFDeENDLFdBQVUsRUFEOEI7O0FBR3hDQyxNQUFLLGVBQVc7QUFDZixTQUFPVCxTQUFTVSxPQUFULEdBQW1CLHFCQUExQjtBQUNBO0FBTHVDLENBQXRCLENBQW5COztBQVFBRSxPQUFPQyxPQUFQLEdBQWlCaEIsU0FBU2lCLFVBQVQsQ0FBb0JDLElBQXBCLENBQXlCUixNQUF6QixDQUFnQztBQUNoRFMsVUFBUyxLQUR1QztBQUVoREMsWUFBVyxvQkFGcUM7O0FBSWhEQyxXQUFVcEIsUUFBUSw4QkFBUixDQUpzQzs7QUFNaERxQixLQUFJO0FBQ0hDLGVBQWEsYUFEVjtBQUVIQyxXQUFTLFNBRk47QUFHSEMsWUFBVSxzQkFIUDtBQUlIQyxPQUFLLG9CQUpGO0FBS0hDLGVBQWEsU0FMVjtBQU1IQyxXQUFTO0FBTk4sRUFONEM7O0FBZWhEQyxTQUFRO0FBQ1Asd0JBQXNCO0FBRGYsRUFmd0M7O0FBbUJoREMsT0FBTSxnQkFBVztBQUNoQixNQUFJLEtBQUtSLEVBQUwsQ0FBUVMsR0FBUixDQUFZQyxHQUFaLENBQWdCLENBQWhCLEVBQW1CQyxLQUFuQixDQUF5QkMsTUFBekIsR0FBa0MsQ0FBdEMsRUFDQyxLQUFLQyxLQUFMLENBQVdDLE9BQVgsQ0FBbUIsS0FBbkIsRUFBMEIsS0FBS2QsRUFBTCxDQUFRUyxHQUFSLENBQVlDLEdBQVosQ0FBZ0IsQ0FBaEIsRUFBbUJDLEtBQW5CLENBQXlCLENBQXpCLENBQTFCOztBQUVELE9BQUtYLEVBQUwsQ0FBUWUsVUFBUixDQUFtQkMsSUFBbkIsQ0FBd0IsVUFBeEIsRUFBb0MsSUFBcEM7QUFDQSxPQUFLaEIsRUFBTCxDQUFRaUIsT0FBUixDQUFnQkMsV0FBaEIsQ0FBNEIsTUFBNUI7QUFDQSxPQUFLTCxLQUFMLENBQVdNLE1BQVgsQ0FBa0IsRUFBRUMsS0FBS3hDLEVBQUV5QyxJQUFGLENBQU8sS0FBS3JCLEVBQUwsQ0FBUW9CLEdBQVIsQ0FBWUUsR0FBWixFQUFQLENBQVAsRUFBa0NDLFNBQVMzQyxFQUFFeUMsSUFBRixDQUFPLEtBQUtyQixFQUFMLENBQVF3QixHQUFSLENBQVlGLEdBQVosRUFBUCxDQUEzQyxFQUFsQixFQUEwRixFQUFFRyxTQUFTLEtBQUtDLFdBQUwsQ0FBaUJDLElBQWpCLENBQXNCLElBQXRCLENBQVgsRUFBd0NDLE9BQU8sS0FBS0MsU0FBTCxDQUFlRixJQUFmLENBQW9CLElBQXBCLENBQS9DLEVBQTFGO0FBQ0EsRUExQitDOztBQTRCaERELGNBQWEsdUJBQVc7QUFDdkIsT0FBSzFCLEVBQUwsQ0FBUWUsVUFBUixDQUFtQkMsSUFBbkIsQ0FBd0IsVUFBeEIsRUFBb0MsS0FBcEM7QUFDQSxPQUFLaEIsRUFBTCxDQUFRaUIsT0FBUixDQUFnQmEsUUFBaEIsQ0FBeUIsTUFBekI7O0FBRUEsT0FBSzlCLEVBQUwsQ0FBUVMsR0FBUixDQUFZQyxHQUFaLENBQWdCLENBQWhCLEVBQW1CcUIsS0FBbkIsR0FBMkIsSUFBM0I7QUFDQSxFQWpDK0M7O0FBbUNoREYsWUFBVyxxQkFBVztBQUNyQixNQUFJLENBQUMsS0FBSzdCLEVBQUwsQ0FBUWUsVUFBUixDQUFtQkMsSUFBeEIsRUFDQztBQUNELE9BQUtoQixFQUFMLENBQVFlLFVBQVIsQ0FBbUJDLElBQW5CLENBQXdCLFVBQXhCLEVBQW9DLEtBQXBDO0FBQ0EsT0FBS2hCLEVBQUwsQ0FBUWlCLE9BQVIsQ0FBZ0JhLFFBQWhCLENBQXlCLE1BQXpCO0FBQ0EsRUF4QytDOztBQTBDaERFLGtCQUFpQiwyQkFBVztBQUMzQixNQUFJLEtBQUtDLEdBQVQsRUFBYztBQUNiLFFBQUtBLEdBQUwsQ0FBU0MsS0FBVDtBQUNBLFFBQUtELEdBQUwsR0FBVyxJQUFYO0FBQ0E7QUFDRCxFQS9DK0M7O0FBaURoREUsV0FBVSxvQkFBVztBQUNwQixPQUFLQyxJQUFMLEdBQVksSUFBSWxELGNBQUosRUFBWjtBQUNBLE9BQUtrRCxJQUFMLENBQVVDLEtBQVYsQ0FBZ0IsRUFBRVosU0FBUyxLQUFLYSxXQUFMLENBQWlCWCxJQUFqQixDQUFzQixJQUF0QixDQUFYLEVBQXdDQyxPQUFPLEtBQUtXLFNBQUwsQ0FBZVosSUFBZixDQUFvQixJQUFwQixDQUEvQyxFQUFoQjtBQUNBLEVBcEQrQzs7QUFzRGhEVyxjQUFhLHVCQUFXO0FBQ3ZCLE1BQUksQ0FBQyxLQUFLdEMsRUFBTCxDQUFRQyxXQUFSLENBQW9CdUMsSUFBekIsRUFDQzs7QUFFRCxNQUFJLEtBQUtKLElBQUwsQ0FBVTFCLEdBQVYsQ0FBYyxNQUFkLE1BQTBCLEVBQTlCLEVBQ0MsS0FBS1YsRUFBTCxDQUFRQyxXQUFSLENBQW9CdUMsSUFBcEIsQ0FBeUIseUNBQXpCLEVBREQsS0FHQyxLQUFLeEMsRUFBTCxDQUFRQyxXQUFSLENBQW9CdUMsSUFBcEIsQ0FBeUIsa0NBQWtDM0QsU0FBU1UsT0FBM0MsR0FBcUQsZ0NBQXJELEdBQXdGLEtBQUs2QyxJQUFMLENBQVUxQixHQUFWLENBQWMsTUFBZCxDQUF4RixHQUFnSCxNQUF6STs7QUFFRCxPQUFLVixFQUFMLENBQVFFLE9BQVIsQ0FBZ0JnQixXQUFoQixDQUE0QixNQUE1QjtBQUNBLEVBaEUrQzs7QUFrRWhEcUIsWUFBVyxxQkFBVztBQUNyQixNQUFJLENBQUMsS0FBS3ZDLEVBQUwsQ0FBUUMsV0FBUixDQUFvQnVDLElBQXpCLEVBQ0M7QUFDRCxPQUFLeEMsRUFBTCxDQUFRQyxXQUFSLENBQW9CdUMsSUFBcEIsQ0FBeUIscURBQXpCO0FBQ0EsRUF0RStDOztBQXdFaERDLFdBQVUsa0JBQVNDLEdBQVQsRUFBYztBQUN2QkEsTUFBSUMsZUFBSjtBQUNBRCxNQUFJRSxjQUFKOztBQUVBLE1BQUksS0FBSzVDLEVBQUwsQ0FBUUksR0FBUixDQUFZTSxHQUFaLENBQWdCLENBQWhCLEVBQW1CQyxLQUFuQixDQUF5QkMsTUFBekIsS0FBb0MsQ0FBeEMsRUFDQyxPQUFPLEtBQUtaLEVBQUwsQ0FBUUssV0FBUixDQUFvQndDLElBQXBCLENBQXlCLHNCQUF6QixDQUFQOztBQUVELE1BQU1ULE9BQU8sS0FBS3BDLEVBQUwsQ0FBUUksR0FBUixDQUFZTSxHQUFaLENBQWdCLENBQWhCLEVBQW1CQyxLQUFuQixDQUF5QixDQUF6QixFQUE0QnlCLElBQXpDO0FBQ0EsTUFBTVUsTUFBTVYsS0FBS1csS0FBTCxDQUFXLEdBQVgsRUFBZ0JDLEdBQWhCLEVBQVo7QUFDQSxNQUFJLENBQUNGLEdBQUQsSUFBUUEsSUFBSUcsV0FBSixPQUFzQixLQUFsQyxFQUNDLE9BQU8sS0FBS2pELEVBQUwsQ0FBUUssV0FBUixDQUFvQndDLElBQXBCLENBQXlCLHVDQUF6QixDQUFQOztBQUVELE9BQUtoQyxLQUFMLEdBQWEsSUFBSXJCLFVBQUosRUFBYjtBQUNBLE9BQUtxQixLQUFMLENBQVdDLE9BQVgsQ0FBbUIsS0FBbkIsRUFBMEIsS0FBS2QsRUFBTCxDQUFRSSxHQUFSLENBQVlNLEdBQVosQ0FBZ0IsQ0FBaEIsRUFBbUJDLEtBQW5CLENBQXlCLENBQXpCLENBQTFCOztBQUVBLE9BQUtYLEVBQUwsQ0FBUUcsUUFBUixDQUFpQmEsSUFBakIsQ0FBc0IsVUFBdEIsRUFBa0MsSUFBbEM7QUFDQSxPQUFLaEIsRUFBTCxDQUFRTSxPQUFSLENBQWdCWSxXQUFoQixDQUE0QixNQUE1QjtBQUNBLE9BQUtlLEdBQUwsR0FBVyxLQUFLcEIsS0FBTCxDQUFXcUMsVUFBWCxDQUFzQixJQUF0QixFQUE0QnRFLEVBQUVRLE1BQUYsQ0FBUyxFQUFFK0QsTUFBTSxJQUFSLEVBQWNDLE1BQU0sRUFBcEIsRUFBVCxFQUFtQyxFQUFFM0IsU0FBUyxLQUFLNEIsYUFBTCxDQUFtQjFCLElBQW5CLENBQXdCLElBQXhCLENBQVgsRUFBMENDLE9BQU8sS0FBSzBCLFdBQUwsQ0FBaUIzQixJQUFqQixDQUFzQixJQUF0QixDQUFqRCxFQUFuQyxDQUE1QixDQUFYO0FBQ0EsRUExRitDOztBQTRGaEQwQixnQkFBZSx5QkFBVztBQUN6QixPQUFLckQsRUFBTCxDQUFRRyxRQUFSLENBQWlCYSxJQUFqQixDQUFzQixVQUF0QixFQUFrQyxLQUFsQztBQUNBLE9BQUtoQixFQUFMLENBQVFJLEdBQVIsQ0FBWU0sR0FBWixDQUFnQixDQUFoQixFQUFtQnFCLEtBQW5CLEdBQTJCLElBQTNCO0FBQ0EsT0FBSy9CLEVBQUwsQ0FBUU0sT0FBUixDQUFnQndCLFFBQWhCLENBQXlCLE1BQXpCO0FBQ0EvQyxRQUFNd0UsT0FBTixDQUFjekUsSUFBSTBFLE1BQUosQ0FBV0MsUUFBWCxDQUFvQkMsS0FBbEMsRUFBeUMsRUFBRUMsU0FBUyxpQ0FBWCxFQUF6Qzs7QUFFQSxPQUFLM0QsRUFBTCxDQUFRQyxXQUFSLENBQW9CdUMsSUFBcEIsQ0FBeUIsa0NBQWtDM0QsU0FBU1UsT0FBM0MsR0FBcUQsZ0NBQXJELEdBQXdGLEtBQUtzQixLQUFMLENBQVdILEdBQVgsQ0FBZSxNQUFmLENBQXhGLEdBQWlILE1BQTFJO0FBQ0EsRUFuRytDOztBQXFHaEQ0QyxjQUFhLHFCQUFTekMsS0FBVCxFQUFnQm9CLEdBQWhCLEVBQXFCO0FBQ2pDLE9BQUtqQyxFQUFMLENBQVFHLFFBQVIsQ0FBaUJhLElBQWpCLENBQXNCLFVBQXRCLEVBQWtDLEtBQWxDO0FBQ0EsT0FBS2hCLEVBQUwsQ0FBUU0sT0FBUixDQUFnQndCLFFBQWhCLENBQXlCLE1BQXpCO0FBQ0EsTUFBTThCLFNBQVM5RSxJQUFJK0UsYUFBSixDQUFrQjVCLEdBQWxCLENBQWY7QUFDQTZCLFFBQU0sb0NBQW9DRixPQUFPRyxNQUFQLElBQWlCSCxPQUFPSSxJQUE1RCxDQUFOO0FBQ0E7QUExRytDLENBQWhDLENBQWpCIiwiZmlsZSI6Im5ld3NsZXR0ZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IEFwcCA9IHJlcXVpcmUoXCIuLi8uLi9pbmRleFwiKTtcbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcblxuY29uc3QgTmV3c2xldHRlck5hbWUgPSBCYWNrYm9uZS5Nb2RlbC5leHRlbmQoe1xuXHRkZWZhdWx0czoge30sXG5cblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvbmV3c2xldHRlci9uYW1lXCI7XG5cdH0sXG59KTtcblxuY29uc3QgTmV3c2xldHRlciA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7fSxcblxuXHR1cmw6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9uZXdzbGV0dGVyXCI7XG5cdH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogXCJkaXZcIixcblx0Y2xhc3NOYW1lOiBcImNvbnRlbnQgbmV3c2xldHRlclwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL25ld3NsZXR0ZXIubnVualwiKSxcblxuXHR1aToge1xuXHRcdGN1cnJlbnROYW1lOiBcImRpdi5jdXJyZW50XCIsXG5cdFx0bmV3RmlsZTogXCJkaXYubmV3XCIsXG5cdFx0dXBsb2FkZXI6IFwiaW5wdXRbdHlwZT0nYnV0dG9uJ11cIixcblx0XHRwZGY6IFwiaW5wdXRbdHlwZT0nZmlsZSddXCIsXG5cdFx0dXBsb2FkRXJyb3I6IFwicC5lcnJvclwiLFxuXHRcdHNwaW5uZXI6IFwiLnNwaW5uZXItaWNvblwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLnVwbG9hZGVyXCI6IFwiZG9VcGxvYWRcIixcblx0fSxcblxuXHRzYXZlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy51aS5hcGsuZ2V0KDApLmZpbGVzLmxlbmd0aCA+IDApXG5cdFx0XHR0aGlzLm1vZGVsLnNldEZpbGUoXCJhcGtcIiwgdGhpcy51aS5hcGsuZ2V0KDApLmZpbGVzWzBdKTtcblxuXHRcdHRoaXMudWkuc2F2ZUJ1dHRvbi5hdHRyKFwiZGlzYWJsZWRcIiwgdHJ1ZSk7XG5cdFx0dGhpcy51aS53b3JraW5nLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLm1vZGVsLnVwbG9hZCh7IGlvczogXy50cmltKHRoaXMudWkuaW9zLnZhbCgpKSwgd2luZG93czogXy50cmltKHRoaXMudWkud2luLnZhbCgpKSB9LCB7IHN1Y2Nlc3M6IHRoaXMuc2F2ZVN1Y2Nlc3MuYmluZCh0aGlzKSwgZXJyb3I6IHRoaXMuc2F2ZUVycm9yLmJpbmQodGhpcykgfSk7XG5cdH0sXG5cblx0c2F2ZVN1Y2Nlc3M6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkuc2F2ZUJ1dHRvbi5hdHRyKFwiZGlzYWJsZWRcIiwgZmFsc2UpO1xuXHRcdHRoaXMudWkud29ya2luZy5hZGRDbGFzcyhcImhpZGVcIik7XG5cblx0XHR0aGlzLnVpLmFway5nZXQoMCkudmFsdWUgPSBudWxsO1xuXHR9LFxuXG5cdHNhdmVFcnJvcjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLnVpLnNhdmVCdXR0b24uYXR0cilcblx0XHRcdHJldHVybjtcblx0XHR0aGlzLnVpLnNhdmVCdXR0b24uYXR0cihcImRpc2FibGVkXCIsIGZhbHNlKTtcblx0XHR0aGlzLnVpLndvcmtpbmcuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMueGhyKSB7XG5cdFx0XHR0aGlzLnhoci5hYm9ydCgpO1xuXHRcdFx0dGhpcy54aHIgPSBudWxsO1xuXHRcdH1cblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5uYW1lID0gbmV3IE5ld3NsZXR0ZXJOYW1lKCk7XG5cdFx0dGhpcy5uYW1lLmZldGNoKHsgc3VjY2VzczogdGhpcy5uYW1lU3VjY2Vzcy5iaW5kKHRoaXMpLCBlcnJvcjogdGhpcy5uYW1lRXJyb3IuYmluZCh0aGlzKSB9KTtcblx0fSxcblxuXHRuYW1lU3VjY2VzczogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLnVpLmN1cnJlbnROYW1lLmh0bWwpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRpZiAodGhpcy5uYW1lLmdldChcIm5hbWVcIikgPT09IFwiXCIpXG5cdFx0XHR0aGlzLnVpLmN1cnJlbnROYW1lLmh0bWwoXCJUaGVyZSBpcyBjdXJyZW50bHkgbm8gYWN0aXZlIG5ld3NsZXR0ZXJcIik7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy51aS5jdXJyZW50TmFtZS5odG1sKFwiQ3VycmVudCBuZXdzbGV0dGVyOiA8YSBocmVmPSdcIiArIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL25ld3NsZXR0ZXIvZG93bmxvYWQnPlwiICsgdGhpcy5uYW1lLmdldChcIm5hbWVcIikgKyBcIjwvYT5cIik7XG5cblx0XHR0aGlzLnVpLm5ld0ZpbGUucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHR9LFxuXG5cdG5hbWVFcnJvcjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLnVpLmN1cnJlbnROYW1lLmh0bWwpXG5cdFx0XHRyZXR1cm47XG5cdFx0dGhpcy51aS5jdXJyZW50TmFtZS5odG1sKFwiVGhlcmUgd2FzIGFuIGVycm9yIGNoZWNraW5nIHRoZSBjdXJyZW50IG5ld3NsZXR0ZXIhXCIpO1xuXHR9LFxuXG5cdGRvVXBsb2FkOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0ZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRpZiAodGhpcy51aS5wZGYuZ2V0KDApLmZpbGVzLmxlbmd0aCA9PT0gMClcblx0XHRcdHJldHVybiB0aGlzLnVpLnVwbG9hZEVycm9yLnRleHQoXCJObyBmaWxlIHdhcyBzZWxlY3RlZFwiKTtcblxuXHRcdGNvbnN0IG5hbWUgPSB0aGlzLnVpLnBkZi5nZXQoMCkuZmlsZXNbMF0ubmFtZTtcblx0XHRjb25zdCBleHQgPSBuYW1lLnNwbGl0KFwiLlwiKS5wb3AoKTtcblx0XHRpZiAoIWV4dCB8fCBleHQudG9Mb3dlckNhc2UoKSAhPT0gXCJwZGZcIilcblx0XHRcdHJldHVybiB0aGlzLnVpLnVwbG9hZEVycm9yLnRleHQoXCJUaGF0IGZpbGUgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgUERGXCIpO1xuXG5cdFx0dGhpcy5tb2RlbCA9IG5ldyBOZXdzbGV0dGVyKCk7XG5cdFx0dGhpcy5tb2RlbC5zZXRGaWxlKFwiYXBrXCIsIHRoaXMudWkucGRmLmdldCgwKS5maWxlc1swXSk7XG5cblx0XHR0aGlzLnVpLnVwbG9hZGVyLmF0dHIoXCJkaXNhYmxlZFwiLCB0cnVlKTtcblx0XHR0aGlzLnVpLnNwaW5uZXIucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMueGhyID0gdGhpcy5tb2RlbC5iaW5hcnlTYXZlKG51bGwsIF8uZXh0ZW5kKHsgd2FpdDogdHJ1ZSwgZGF0YToge30gfSwgeyBzdWNjZXNzOiB0aGlzLm9uU2F2ZVN1Y2Nlc3MuYmluZCh0aGlzKSwgZXJyb3I6IHRoaXMub25TYXZlRXJyb3IuYmluZCh0aGlzKSB9KSk7XG5cdH0sXG5cblx0b25TYXZlU3VjY2VzczogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS51cGxvYWRlci5hdHRyKFwiZGlzYWJsZWRcIiwgZmFsc2UpO1xuXHRcdHRoaXMudWkucGRmLmdldCgwKS52YWx1ZSA9IG51bGw7XG5cdFx0dGhpcy51aS5zcGlubmVyLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuVG9hc3QsIHsgY29udGVudDogXCJOZXdzbGV0dGVyIHN1Y2Nlc3NmdWxseSB1cGRhdGVkXCIgfSk7XG5cblx0XHR0aGlzLnVpLmN1cnJlbnROYW1lLmh0bWwoXCJDdXJyZW50IG5ld3NsZXR0ZXI6IDxhIGhyZWY9J1wiICsgc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvbmV3c2xldHRlci9kb3dubG9hZCc+XCIgKyB0aGlzLm1vZGVsLmdldChcIm5hbWVcIikgKyBcIjwvYT5cIik7XG5cdH0sXG5cblx0b25TYXZlRXJyb3I6IGZ1bmN0aW9uKG1vZGVsLCB4aHIpIHtcblx0XHR0aGlzLnVpLnVwbG9hZGVyLmF0dHIoXCJkaXNhYmxlZFwiLCBmYWxzZSk7XG5cdFx0dGhpcy51aS5zcGlubmVyLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRjb25zdCBhbnN3ZXIgPSBBcHAucGFyc2VSZXNwb25zZSh4aHIpO1xuXHRcdGFsZXJ0KFwiRXJyb3Igc2F2aW5nIG5ld3MgbmV3c2xldHRlcjogXCIgKyAoYW5zd2VyLmRldGFpbCB8fCBhbnN3ZXIuaW5mbykpO1xuXHR9LFxufSk7Il19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar moment = require(\"moment\");\nvar pikaday = require(\"pikaday\");\nvar qs = require(\"querystring\");\n\nvar App = require(\"../../index\");\nvar gradeMap = require(\"../../lib/gradeMap\");\nvar Grid = require(\"../../lib/grid\");\nvar ServerGrid = require(\"../../lib/serverGrid\");\nvar settings = require(\"app-settings\");\nvar SimpleMenu = require(\"../../lib/simpleMenu\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar Page = {};\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"content system-reports\",\n\n\ttemplate: require(\"../templates/reports.nunj\").main,\n\n\tregions: {\n\t\tmain: \".main\"\n\t},\n\n\tui: {\n\t\treport: \".group .item\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.report\": \"loadReport\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tbookTokenMode: settings.bookTokenMode\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.report = options.report;\n\t},\n\n\tonRender: function onRender() {\n\t\tif (this.report) this.showChildView(\"main\", new Page[_.camelCase(this.report)]());\n\t},\n\n\tloadReport: function loadReport(evt) {\n\t\tvar report = $(evt.currentTarget).data(\"report\");\n\n\t\tif (report) {\n\t\t\tthis.showChildView(\"main\", new Page[_.camelCase(report)]());\n\t\t\tradio.trigger(App.Events.Commands.Navigate, \"/system/reports/\" + report, { trigger: false });\n\t\t}\n\t}\n});\n\n//_____________________________________________________________\n\n\nPage.allUnlocks = Backbone.Marionette.View.extend({\n\tclassName: \"report all-unlocks\",\n\ttemplate: require(\"../templates/reports.nunj\").allUnlocks,\n\n\tui: {\n\t\tstartDate: \"input[name='startDate']\",\n\t\tendDate: \"input[name='endDate']\",\n\t\tcutoff: \"input[name='cutoff']\",\n\n\t\tdownload: \"input[type='button']\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.download\": \"download\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tyear: moment().year() - 1\n\t\t};\n\t},\n\n\tonRender: function onRender() {\n\t\t// eslint-disable-next-line new-cap, no-new\n\t\tnew pikaday({\n\t\t\tfield: this.ui.startDate.get(0),\n\t\t\tformat: \"DD MMMM YYYY\",\n\t\t\tsetDefaultDate: true,\n\t\t\tminDate: moment(\"01 January 2015\", \"DD MMMM YYYY\").toDate(),\n\t\t\tmaxDate: moment().toDate()\n\t\t});\n\n\t\t// eslint-disable-next-line new-cap, no-new\n\t\tnew pikaday({\n\t\t\tfield: this.ui.endDate.get(0),\n\t\t\tformat: \"DD MMMM YYYY\",\n\t\t\tminDate: moment(\"01 January 2015\", \"DD MMMM YYYY\").toDate(),\n\t\t\tmaxDate: moment().toDate()\n\t\t});\n\t},\n\n\tdownload: function download() {\n\t\tvar url = [];\n\t\tif (this.ui.startDate.val()) {\n\t\t\tvar start = moment(this.ui.startDate.val(), \"DD MMMM YYYY\");\n\t\t\turl.push(\"startyear=\" + start.year());\n\t\t\turl.push(\"startmonth=\" + (start.month() + 1));\n\t\t\turl.push(\"startday=\" + start.date());\n\t\t}\n\n\t\tif (this.ui.endDate.val()) {\n\t\t\tvar end = moment(this.ui.endDate.val(), \"DD MMMM YYYY\");\n\t\t\turl.push(\"endyear=\" + end.year());\n\t\t\turl.push(\"endmonth=\" + (end.month() + 1));\n\t\t\turl.push(\"endday=\" + end.date());\n\t\t}\n\n\t\twindow.open(settings.urlRoot + \"/api/1.0/reports/allUnlocks?\" + url.join(\"&\"));\n\t}\n});\n\n//_____________________________________________________________\n\n\nvar LearnerBooks_Model = Backbone.Epoxy.Model.extend({});\n\nvar LearnerBooks_Collection = Backbone.PageableCollection.extend({\n\tmodel: LearnerBooks_Model,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/reports/learnerBooksPerGrade?paged=true\";\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nPage.learnerBooks = Backbone.Marionette.View.extend({\n\tclassName: \"report learner-books\",\n\ttemplate: require(\"../templates/reports.nunj\").learnerBooks,\n\n\tui: {\n\t\tcounter: \".ops-bar .counter\",\n\t\tfilters: \".ops-bar .filters\",\n\t\tdownloadList: \".downloadList\",\n\t\toperations: \".operations\",\n\t\tpaging: \".paging\",\n\t\tgrid: \"div.grid\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.downloadList\": \"showDownloads\"\n\t},\n\n\tshowDownloads: function showDownloads(evt) {\n\t\tevt.stopPropagation();\n\n\t\tvar list = new SimpleMenu({\n\t\t\tanchor: this.ui.downloadList,\n\t\t\tside: \"left\",\n\t\t\tstructure: [{ closeOnClick: true, elements: [{ text: \"Download as CSV\", id: \"books\" }] }]\n\t\t});\n\t\tlist.show();\n\n\t\tthis.listenTo(list, \"clicked:books\", this.downloadList.bind(this));\n\t},\n\n\tdownloadList: function downloadList() {\n\t\twindow.open(settings.urlRoot + \"/api/1.0/reports/learnerBooksPerGrade?format=csv\");\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"total_books\", label: \"Books Count\", cell: \"string\", editable: false, sortable: false }, { name: \"grade\", label: \"Grade\", cell: \"string\", editable: false, sortable: false }, { name: \"users_with_books\", label: \"Students w/ Books\", cell: \"string\", editable: false, sortable: false }, { name: \"total_users\", label: \"Total Students\", cell: \"string\", editable: false, sortable: false }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new LearnerBooks_Collection(),\n\t\t\tclickable: false,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counter,\n\t\t\t\ttemplate: \"Rows $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\t}\n});\n\n//_____________________________________________________________\n\n\nvar ValidBooks_Model = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"ident\",\n\tcomputeds: {\n\t\tbookGrades: function bookGrades() {\n\t\t\treturn gradeMap.codeToHumanValue(this.get(\"metadata\").grade);\n\t\t},\n\t\tuserNames: function userNames() {\n\t\t\treturn this.get(\"firstname\") + \" \" + this.get(\"surname\");\n\t\t},\n\t\tbookTitle: function bookTitle() {\n\t\t\treturn this.get(\"metadata\").title;\n\t\t},\n\t\tbookISBN: function bookISBN() {\n\t\t\treturn this.get(\"metadata\").isbn;\n\t\t},\n\t\tbookSubject: function bookSubject() {\n\t\t\treturn this.get(\"metadata\").subject;\n\t\t},\n\t\tbookPublisher: function bookPublisher() {\n\t\t\treturn this.get(\"metadata\").publisher;\n\t\t}\n\t}\n});\n\nvar ValidBooks_Collection = Backbone.PageableCollection.extend({\n\tmodel: ValidBooks_Model,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/reports/validBooksPerUser?paged=true\";\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\ttotalPages: null,\n\t\ttotalRecords: null,\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nPage.validBooks = Backbone.Marionette.View.extend({\n\tclassName: \"report valid-books\",\n\ttemplate: require(\"../templates/reports.nunj\").validBooks,\n\n\tui: {\n\t\tcounter: \".ops-bar .counter\",\n\t\tfilters: \".ops-bar .filters\",\n\t\tdownloadList: \".downloadList\",\n\t\toperations: \".operations\",\n\t\tpaging: \".paging\",\n\t\tgrid: \"div.grid\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.downloadList\": \"showDownloads\"\n\t},\n\n\tshowDownloads: function showDownloads(evt) {\n\t\tevt.stopPropagation();\n\n\t\tvar list = new SimpleMenu({\n\t\t\tanchor: this.ui.downloadList,\n\t\t\tside: \"left\",\n\t\t\tstructure: [{ closeOnClick: true, elements: [{ text: \"Download as CSV\", id: \"books\" }] }]\n\t\t});\n\t\tlist.show();\n\n\t\tthis.listenTo(list, \"clicked:books\", this.downloadList.bind(this));\n\t},\n\n\tdownloadList: function downloadList() {\n\t\tvar params = this.grid.filter.getServerFilters();\n\t\tparams.format = \"csv\";\n\n\t\twindow.open(settings.urlRoot + \"/api/1.0/reports/validBooksPerUser?\" + qs.stringify(params));\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"username\", label: \"Username\", cell: \"string\", editable: false }, { name: \"userNames\", label: \"Name\", cell: \"string\", editable: false }, { name: \"title\", label: \"Title\", cell: \"string\", editable: false }, { name: \"isbn\", label: \"ISBN\", cell: \"string\", editable: false }, { name: \"publisher\", label: \"Publisher\", cell: \"string\", editable: false }, { name: \"subject\", label: \"Subject\", cell: \"string\", editable: false }, { name: \"bookGrades\", label: \"Study Year\", cell: \"string\", editable: false }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new ValidBooks_Collection(),\n\t\t\tclickable: false,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counter,\n\t\t\t\ttemplate: \"Rows $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar subjectFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"subjectFilter\",\n\t\t\tlabel: \"Subject\",\n\t\t\tserver: {\n\t\t\t\tkey: \"subject_id\",\n\t\t\t\tvalue: \"subject\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/subjects\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\n\t\tvar gradeFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"gradeFilter\",\n\t\t\tlabel: \"Year of Study\",\n\t\t\tserver: true,\n\t\t\tcategories: _.map(settings.gradeList, function (val, key) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: key,\n\t\t\t\t\titems: _.reduce(val.sort(function (a, b) {\n\t\t\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t\t\t}), function (sum, num) {\n\t\t\t\t\t\tsum.push({ name: num.value, label: num.name });return sum;\n\t\t\t\t\t}, [])\n\t\t\t\t};\n\t\t\t})\n\t\t};\n\n\t\tvar pubFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"pubFilter\",\n\t\t\tlabel: \"Publisher\",\n\t\t\tserver: {\n\t\t\t\tkey: \"publisher_id\",\n\t\t\t\tvalue: \"fullname\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/publishers?dummy=false\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\n\t\tvar yearFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"yearFilter\",\n\t\t\tlabel: \"Year\",\n\t\t\tcategories: [{ items: _.range(2014, moment().year() + 2) }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar filterList = [textFilter, subjectFilter, gradeFilter, pubFilter, yearFilter];\n\n\t\tthis.ui.filters.prepend(this.grid.filter({ filterContainer: this.ui.filters, filters: filterList, defaultFilters: [\"textFilter\"] }).render().el);\n\t}\n});\n\nvar Groups_Model = Backbone.Epoxy.Model.extend({\n\tcomputeds: {\n\t\tuserType: function userType() {\n\t\t\tif (_.includes(this.get(\"roles\"), \"student\")) return \"Student\";\n\t\t\tif (_.includes(this.get(\"roles\"), \"teacher\")) return \"Educator\";\n\t\t\treturn \"Other\";\n\t\t},\n\t\tuserGrade: function userGrade() {\n\t\t\tif (!this.get(\"grade\")) return \"-\";\n\n\t\t\treturn gradeMap.codeToHumanValue(this.get(\"grade\"));\n\t\t},\n\t\tgroupGrade: function groupGrade() {\n\t\t\tif (!this.get(\"group_grade\")) return \"-\";\n\n\t\t\treturn gradeMap.codeToHumanValue(this.get(\"group_grade\"));\n\t\t},\n\t\tgroupType: function groupType() {\n\t\t\tif (this.get(\"system_group\")) return \"System Group\";\n\t\t\tif (this.get(\"global_group\")) return \"Global Group\";\n\t\t\treturn \"Custom Group\";\n\t\t}\n\t}\n});\n\nvar Groups_Collection = Backbone.PageableCollection.extend({\n\tmodel: Groups_Model,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/reports/groupsPerUser?paged=true\";\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nPage.groups = Backbone.Marionette.View.extend({\n\tclassName: \"report groups\",\n\ttemplate: require(\"../templates/reports.nunj\").groups,\n\n\tui: {\n\t\tcounter: \".ops-bar .counter\",\n\t\tfilters: \".ops-bar .filters\",\n\t\tdownloadList: \".downloadList\",\n\t\toperations: \".operations\",\n\t\tgrid: \"div.grid\",\n\t\tpaging: \".paging\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.downloadList\": \"showDownloads\"\n\t},\n\n\tshowDownloads: function showDownloads(evt) {\n\t\tevt.stopPropagation();\n\n\t\tvar list = new SimpleMenu({\n\t\t\tanchor: this.ui.downloadList,\n\t\t\tside: \"left\",\n\t\t\tstructure: [{ closeOnClick: true, elements: [{ text: \"Download as CSV\", id: \"books\" }] }]\n\t\t});\n\t\tlist.show();\n\n\t\tthis.listenTo(list, \"clicked:books\", this.downloadList.bind(this));\n\t},\n\n\tdownloadList: function downloadList() {\n\t\tvar params = this.grid.filter.getServerFilters();\n\t\tparams.format = \"csv\";\n\n\t\twindow.open(settings.urlRoot + \"/api/1.0/reports/groupsPerUser?\" + qs.stringify(params));\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"username\", label: \"Username\", cell: \"string\", editable: false }, { name: \"firstname\", label: \"First Name\", cell: \"string\", editable: false }, { name: \"surname\", label: \"Surname\", cell: \"string\", editable: false }, { name: \"userGrade\", label: \"User Grade\", cell: \"string\", editable: false }, { name: \"userType\", label: \"User Type\", cell: \"string\", editable: false }, { name: \"code\", label: \"Group Code\", cell: \"string\", editable: false }, { name: \"name\", label: \"Group Name\", cell: \"string\", editable: false }, { name: \"groupGrade\", label: \"Group Grade\", cell: \"string\", editable: false }, { name: \"groupType\", label: \"Group Type\", cell: \"string\", editable: false }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new Groups_Collection(),\n\t\t\tclickable: false,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counter,\n\t\t\t\ttemplate: \"Rows $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar languageFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"languageFilter\",\n\t\t\tlabel: \"Language\",\n\t\t\tcategories: [{ items: settings.languageList }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar subjectFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"subjectFilter\",\n\t\t\tlabel: \"Subject\",\n\t\t\tserver: {\n\t\t\t\tkey: \"subject_id\",\n\t\t\t\tvalue: \"subject\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/subjects\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\n\t\tvar gradeFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"gradeFilter\",\n\t\t\tlabel: \"Year of Study\",\n\t\t\tserver: true,\n\t\t\tcategories: _.map(settings.gradeList, function (val, key) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: key,\n\t\t\t\t\titems: _.reduce(val.sort(function (a, b) {\n\t\t\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t\t\t}), function (sum, num) {\n\t\t\t\t\t\tsum.push({ name: num.value, label: num.name });return sum;\n\t\t\t\t\t}, [])\n\t\t\t\t};\n\t\t\t})\n\t\t};\n\n\t\tvar yearFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"yearFilter\",\n\t\t\tlabel: \"Year\",\n\t\t\tcategories: [{ items: _.range(2014, moment().year() + 2) }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar rolesFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"rolesFilter\",\n\t\t\tlabel: \"Roles\",\n\t\t\tcategories: [{\n\t\t\t\titems: _.fromPairs(_.compact(_.map(settings.roles, function (val, key) {\n\t\t\t\t\tif (key === \"*\") return;\n\t\t\t\t\treturn [key, val.name];\n\t\t\t\t})))\n\t\t\t}],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar filterList = [textFilter, languageFilter, subjectFilter, gradeFilter, yearFilter, rolesFilter];\n\n\t\tthis.ui.filters.prepend(this.grid.filter({ filterContainer: this.ui.filters, filters: filterList, defaultFilters: [\"textFilter\"] }).render().el);\n\t}\n});\n\n//_____________________________________________________________\n\n\nvar ResourcesCreated_Model = Backbone.Epoxy.Model.extend({});\n\nvar ResourcesCreated_Collection = Backbone.PageableCollection.extend({\n\tmodel: ResourcesCreated_Model,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/reports/resourcesCreated?paged=true\";\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nPage.resourcesCreated = Backbone.Marionette.View.extend({\n\tclassName: \"report groups\",\n\ttemplate: require(\"../templates/reports.nunj\").resourcesCreated,\n\n\tui: {\n\t\tcounter: \".ops-bar .counter\",\n\t\tfilters: \".ops-bar .filters\",\n\t\tdownloadList: \".downloadList\",\n\t\toperations: \".operations\",\n\t\tpaging: \".paging\",\n\n\t\ttotal: \".header .title .total\",\n\t\tgrid: \"div.grid\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.downloadList\": \"showDownloads\"\n\t},\n\n\tshowDownloads: function showDownloads(evt) {\n\t\tevt.stopPropagation();\n\n\t\tvar list = new SimpleMenu({\n\t\t\tanchor: this.ui.downloadList,\n\t\t\tside: \"left\",\n\t\t\tstructure: [{ closeOnClick: true, elements: [{ text: \"Download as CSV\", id: \"books\" }] }]\n\t\t});\n\t\tlist.show();\n\n\t\tthis.listenTo(list, \"clicked:books\", this.downloadList.bind(this));\n\t},\n\n\tdownloadList: function downloadList() {\n\t\tvar params = this.grid.filter.getServerFilters();\n\t\tparams.format = \"csv\";\n\n\t\twindow.open(settings.urlRoot + \"/api/1.0/reports/resourcesCreated?\" + qs.stringify(params));\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"username\", label: \"Username\", cell: \"string\", editable: false }, { name: \"firstname\", label: \"First Name\", cell: \"string\", editable: false }, { name: \"surname\", label: \"Surname\", cell: \"string\", editable: false }, { name: \"type\", label: \"Type\", cell: \"string\", editable: false }, { name: \"created\", label: \"Created\", cell: \"string\", editable: false }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new ResourcesCreated_Collection(),\n\t\t\tclickable: false,\n\t\t\twaitForFilters: true,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counter,\n\t\t\t\ttemplate: \"Rows $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tvar searchFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar startFilter = {\n\t\t\ttype: \"date\",\n\t\t\tname: \"start\",\n\t\t\tlabel: \"Since\",\n\t\t\tserver: true,\n\t\t\tinitialValue: function initialValue() {\n\t\t\t\treturn [App.currentYear({ unix: true })];\n\t\t\t}\n\t\t};\n\n\t\tvar endFilter = {\n\t\t\ttype: \"date\",\n\t\t\tname: \"end\",\n\t\t\tlabel: \"Until\",\n\t\t\tserver: true,\n\t\t\tinitialValue: function initialValue() {\n\t\t\t\treturn [moment().unix()];\n\t\t\t}\n\t\t};\n\n\t\tvar filterList = [searchFilter, startFilter, endFilter];\n\n\t\tthis.filter = this.grid.filter({ filterContainer: this.ui.filters, filters: filterList, defaultFilters: [\"textFilter\", \"start\", \"end\"] });\n\t\tthis.ui.filters.prepend(this.filter.render().el);\n\t}\n});\n\n//______________________________________________________________\n\n\nvar AppVersions_Model = Backbone.Epoxy.Model.extend({});\n\nvar AppVersions_Collection = Backbone.Collection.extend({\n\tmodel: AppVersions_Model,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/reports/appVersions\";\n\t}\n});\n\nPage.appVersions = Backbone.Marionette.View.extend({\n\tclassName: \"report app-versions\",\n\ttemplate: require(\"../templates/reports.nunj\").appVersions,\n\n\tui: {\n\t\tcounter: \".ops-bar .counter\",\n\t\tfilters: \".ops-bar .filters\",\n\t\tdownloadList: \".downloadList\",\n\t\toperations: \".operations\",\n\t\tpaging: \".paging\",\n\t\tgrid: \"div.grid\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.downloadList\": \"showDownloads\"\n\t},\n\n\tshowDownloads: function showDownloads(evt) {\n\t\tevt.stopPropagation();\n\n\t\tvar list = new SimpleMenu({\n\t\t\tanchor: this.ui.downloadList,\n\t\t\tside: \"left\",\n\t\t\tstructure: [{ closeOnClick: true, elements: [{ text: \"Download as CSV\", id: \"books\" }] }]\n\t\t});\n\t\tlist.show();\n\n\t\tthis.listenTo(list, \"clicked:books\", this.downloadList.bind(this));\n\t},\n\n\tdownloadList: function downloadList() {\n\t\twindow.open(settings.urlRoot + \"/api/1.0/reports/appVersions?format=csv\");\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"username\", label: \"Username\", cell: \"string\", editable: false }, { name: \"firstname\", label: \"First Name\", cell: \"string\", editable: false }, { name: \"surname\", label: \"Surname\", cell: \"string\", editable: false }, { name: \"grade\", label: \"Grade\", cell: \"string\", editable: false }, { name: \"roles\", label: \"Roles\", cell: \"string\", editable: false }, { name: \"platform\", label: \"Platform\", cell: \"string\", editable: false }, { name: \"version\", label: \"Version\", cell: \"string\", editable: false }, { name: \"timestamp\", label: \"Last Seen\", cell: Grid.MomentCell.extend({\n\t\t\t\tmodelInUnixTimestamp: true,\n\t\t\t\tdisplayFormat: \"DD MMM YYYY, HH:mm a\",\n\t\t\t\tdisplayInUTC: false\n\t\t\t}) }];\n\n\t\tthis.grid = new Grid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new AppVersions_Collection(),\n\t\t\tclickable: false,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counter,\n\t\t\t\ttemplate: \"Rows $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tvar searchFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textSearch\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\thandler: function handler(selection, model) {\n\t\t\t\treturn _.every(selection, function (s) {\n\t\t\t\t\treturn _.some([\"username\", \"firstname\", \"surname\"], function (col) {\n\t\t\t\t\t\tif (!col) return false;\n\t\t\t\t\t\tvar val = model.get(col);\n\t\t\t\t\t\tif (!val) return false;\n\t\t\t\t\t\tval = val.toString().toLowerCase();\n\t\t\t\t\t\treturn _.includes(val, s);\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tvar gradeFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"userGrade\",\n\t\t\tlabel: \"Year of Study\",\n\t\t\tcategories: _.map(settings.gradeList, function (val, key) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: key,\n\t\t\t\t\titems: _.reduce(val.sort(function (a, b) {\n\t\t\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t\t\t}), function (sum, num) {\n\t\t\t\t\t\tsum.push({ name: num.value, label: num.name });return sum;\n\t\t\t\t\t}, [])\n\t\t\t\t};\n\t\t\t}),\n\t\t\tresolver: function resolver(item) {\n\t\t\t\tfor (var key in settings.gradeList) {\n\t\t\t\t\tvar x = _.find(settings.gradeList[key], function (val) {\n\t\t\t\t\t\treturn val.value === item;\n\t\t\t\t\t});\n\t\t\t\t\tif (x) return x;\n\t\t\t\t}\n\t\t\t\treturn item;\n\t\t\t},\n\t\t\thandler: function handler(selection, model) {\n\t\t\t\tvar g = model.has(\"grade\") ? model.get(\"grade\") : -1;\n\t\t\t\tif (!_.isArray(g)) g = [g, parseInt(g, 10)];\n\n\t\t\t\treturn _.some(selection, function (item) {\n\t\t\t\t\treturn _.includes(g, item.value);\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\tvar rolesFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"rolesFilter\",\n\t\t\tlabel: \"Roles\",\n\t\t\tcategories: [{\n\t\t\t\titems: _.fromPairs(_.compact(_.map(settings.roles, function (val, key) {\n\t\t\t\t\tif (key === \"*\") return;\n\t\t\t\t\treturn [key, val.name];\n\t\t\t\t})))\n\t\t\t}],\n\t\t\thandler: function handler(selection, model) {\n\t\t\t\treturn _.intersection(selection, _.invokeMap(model.get(\"roles\").split(\",\"), String.prototype.toLowerCase)).length > 0;\n\t\t\t}\n\t\t};\n\n\t\tvar filterList = [searchFilter, gradeFilter, rolesFilter];\n\n\t\tthis.ui.filters.prepend(this.grid.filter({ filterContainer: this.ui.filters, filters: filterList, defaultFilters: [\"textSearch\", \"userGrade\", \"rolesFilter\"] }).render().el);\n\t}\n});\n\n//______________________________________________________________\n\n\nvar LatestUnlocks_Model = Backbone.Epoxy.Model.extend({\n\tcomputeds: {\n\t\tbookTitle: function bookTitle() {\n\t\t\tvar b = this.get(\"metadata\");\n\t\t\treturn b ? b.title : \"\";\n\t\t},\n\t\tbookPublisher: function bookPublisher() {\n\t\t\tvar b = this.get(\"metadata\");\n\t\t\treturn b ? b.publisher : \"\";\n\t\t},\n\t\tbookSubject: function bookSubject() {\n\t\t\tvar b = this.get(\"metadata\");\n\t\t\treturn b ? b.subject : \"\";\n\t\t},\n\t\tbookGrade: function bookGrade() {\n\t\t\tvar b = this.get(\"metadata\");\n\t\t\treturn b ? gradeMap.codeToHumanValue(b.grade) : \"\";\n\t\t}\n\t}\n});\n\nvar LatestUnlocks_Collection = Backbone.PageableCollection.extend({\n\tmodel: LatestUnlocks_Model,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/reports/latestUnlocks?paged=true\";\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nPage.latestUnlocks = Backbone.Marionette.View.extend({\n\tclassName: \"report latest-unlocks\",\n\ttemplate: require(\"../templates/reports.nunj\").latestUnlocks,\n\n\tui: {\n\t\tcounter: \".ops-bar .counter\",\n\t\tfilters: \".ops-bar .filters\",\n\t\tdownloadList: \".downloadList\",\n\t\toperations: \".operations\",\n\t\tpaging: \".paging\",\n\t\tgrid: \"div.grid\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.downloadList\": \"showDownloads\"\n\t},\n\n\tshowDownloads: function showDownloads(evt) {\n\t\tevt.stopPropagation();\n\n\t\tvar list = new SimpleMenu({\n\t\t\tanchor: this.ui.downloadList,\n\t\t\tside: \"left\",\n\t\t\tstructure: [{ closeOnClick: true, elements: [{ text: \"Download as CSV\", id: \"books\" }] }]\n\t\t});\n\t\tlist.show();\n\n\t\tthis.listenTo(list, \"clicked:books\", this.downloadList.bind(this));\n\t},\n\n\tdownloadList: function downloadList() {\n\t\tvar params = this.grid.filter.getServerFilters();\n\t\tparams.format = \"csv\";\n\n\t\twindow.open(settings.urlRoot + \"/api/1.0/reports/latestUnlocks?\" + qs.stringify(params));\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"username\", label: \"Username\", cell: \"string\", editable: false }, { name: \"bookTitle\", label: \"Title\", cell: \"string\", editable: false }, { name: \"bookPublisher\", label: \"Publisher\", cell: \"string\", editable: false }, { name: \"bookSubject\", label: \"Subject\", cell: \"string\", editable: false }, { name: \"bookGrade\", label: \"Grade\", cell: \"string\", editable: false }, { name: \"created\", label: \"Date\", editable: false, cell: ServerGrid.MomentCell.extend({\n\t\t\t\tmodelInUnixTimestamp: true,\n\t\t\t\tdisplayFormat: \"DD MMM YYYY, HH:mm a\",\n\t\t\t\tdisplayInUTC: false\n\t\t\t}) }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new LatestUnlocks_Collection(),\n\t\t\tclickable: false,\n\t\t\twaitForFilters: true,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counter,\n\t\t\t\ttemplate: \"Rows $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar startFilter = {\n\t\t\ttype: \"dateTime\",\n\t\t\tname: \"start\",\n\t\t\tlabel: \"Since\",\n\t\t\tserver: true,\n\t\t\tinitialValue: function initialValue() {\n\t\t\t\treturn [moment().subtract(1, \"month\").startOf(\"day\").unix()];\n\t\t\t}\n\t\t};\n\n\t\tvar languageFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"languageFilter\",\n\t\t\tlabel: \"Language\",\n\t\t\tcategories: [{ items: settings.languageList }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar subjectFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"subjectFilter\",\n\t\t\tlabel: \"Subject\",\n\t\t\tserver: {\n\t\t\t\tkey: \"subject_id\",\n\t\t\t\tvalue: \"subject\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/subjects\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\n\t\tvar gradeFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"gradeFilter\",\n\t\t\tlabel: \"Year of Study\",\n\t\t\tserver: true,\n\t\t\tcategories: _.map(settings.gradeList, function (val, key) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: key,\n\t\t\t\t\titems: _.reduce(val.sort(function (a, b) {\n\t\t\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t\t\t}), function (sum, num) {\n\t\t\t\t\t\tsum.push({ name: num.value, label: num.name });return sum;\n\t\t\t\t\t}, [])\n\t\t\t\t};\n\t\t\t})\n\t\t};\n\n\t\tvar filterList = [textFilter, startFilter, languageFilter, subjectFilter, gradeFilter];\n\n\t\tthis.filter = this.grid.filter({ filterContainer: this.ui.filters, filters: filterList, defaultFilters: [\"textFilter\", \"start\"] });\n\t\tthis.ui.filters.prepend(this.filter.render().el);\n\t}\n});\n\n//_____________________________________________________________\n\n\nvar SystemGroups_Model = Backbone.Epoxy.Model.extend({\n\tcomputeds: {\n\t\tchange: function change() {\n\t\t\treturn this.get(\"added\") && !_.includes(this.get(\"reason\"), \"deleted\") ? \"Added\" : \"Removed\";\n\t\t},\n\t\tuserName: function userName() {\n\t\t\tif (this.get(\"creator_id\") === 0) return \"SYSTEM\";\n\t\t\treturn this.get(\"user\");\n\t\t}\n\t}\n});\n\nvar SystemGroups_Collection = Backbone.PageableCollection.extend({\n\tmodel: SystemGroups_Model,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/reports/systemGroupChanges?paged=true\";\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nPage.systemGroups = Backbone.Marionette.View.extend({\n\tclassName: \"report unity-groups\",\n\ttemplate: require(\"../templates/reports.nunj\").systemGroups,\n\n\tui: {\n\t\tcounter: \".ops-bar .counter\",\n\t\tfilters: \".ops-bar .filters\",\n\t\tdownloadList: \".downloadList\",\n\t\toperations: \".operations\",\n\t\tpaging: \".paging\",\n\t\tgrid: \"div.grid\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.downloadList\": \"showDownloads\"\n\t},\n\n\tshowDownloads: function showDownloads(evt) {\n\t\tevt.stopPropagation();\n\n\t\tvar list = new SimpleMenu({\n\t\t\tanchor: this.ui.downloadList,\n\t\t\tside: \"left\",\n\t\t\tstructure: [{ closeOnClick: true, elements: [{ text: \"Download as CSV\", id: \"books\" }] }]\n\t\t});\n\t\tlist.show();\n\n\t\tthis.listenTo(list, \"clicked:books\", this.downloadList.bind(this));\n\t},\n\n\tdownloadList: function downloadList() {\n\t\tvar params = this.grid.filter.getServerFilters();\n\t\tparams.format = \"csv\";\n\n\t\twindow.open(settings.urlRoot + \"/api/1.0/reports/systemGroupChanges?\" + qs.stringify(params));\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"code\", label: \"Code\", cell: \"string\", editable: false }, { name: \"name\", label: \"Group Name\", cell: \"string\", editable: false }, { name: \"userName\", label: \"User\", cell: \"string\", editable: false }, { name: \"impersonator\", label: \"Impersonator\", cell: \"string\", editable: false }, { name: \"change\", label: \"Action\", cell: \"string\", editable: false }, { name: \"reason\", label: \"Reason\", cell: \"string\", editable: false }, { name: \"created\", label: \"Date\", editable: false, cell: Grid.MomentCell.extend({\n\t\t\t\tmodelInUnixTimestamp: true,\n\t\t\t\tdisplayFormat: \"DD MMM YYYY, HH:mm a\",\n\t\t\t\tdisplayInUTC: false\n\t\t\t}) }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new SystemGroups_Collection(),\n\t\t\tclickable: false,\n\t\t\twaitForFilters: true,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counter,\n\t\t\t\ttemplate: \"Rows $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar startFilter = {\n\t\t\ttype: \"dateTime\",\n\t\t\tname: \"start\",\n\t\t\tlabel: \"Since\",\n\t\t\tserver: true,\n\t\t\tinitialValue: function initialValue() {\n\t\t\t\treturn [moment().subtract(1, \"month\").startOf(\"day\").unix()];\n\t\t\t}\n\t\t};\n\n\t\tvar filterList = [textFilter, startFilter];\n\n\t\tthis.filter = this.grid.filter({ filterContainer: this.ui.filters, filters: filterList, defaultFilters: [\"textFilter\", \"start\"] });\n\t\tthis.ui.filters.prepend(this.filter.render().el);\n\t}\n});\n\n//_____________________________________________________________\n\n\nvar UserGroups_Model = Backbone.Epoxy.Model.extend({\n\tcomputeds: {\n\t\tuserName: function userName() {\n\t\t\tif (this.get(\"creator_id\") === 0) return \"SYSTEM\";\n\t\t\treturn this.get(\"user\");\n\t\t},\n\t\tchange: function change() {\n\t\t\treturn this.get(\"added\") ? \"Added\" : \"Removed\";\n\t\t}\n\t}\n});\n\nvar UserGroups_Collection = Backbone.PageableCollection.extend({\n\tmodel: UserGroups_Model,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/reports/userGroupChanges?paged=true\";\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nPage.userGroups = Backbone.Marionette.View.extend({\n\tclassName: \"report user-groups\",\n\ttemplate: require(\"../templates/reports.nunj\").userGroups,\n\n\tui: {\n\t\tcounter: \".ops-bar .counter\",\n\t\tfilters: \".ops-bar .filters\",\n\t\tdownloadList: \".downloadList\",\n\t\toperations: \".operations\",\n\t\tpaging: \".paging\",\n\t\tgrid: \"div.grid\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.downloadList\": \"showDownloads\"\n\t},\n\n\tshowDownloads: function showDownloads(evt) {\n\t\tevt.stopPropagation();\n\n\t\tvar list = new SimpleMenu({\n\t\t\tanchor: this.ui.downloadList,\n\t\t\tside: \"left\",\n\t\t\tstructure: [{ closeOnClick: true, elements: [{ text: \"Download as CSV\", id: \"books\" }] }]\n\t\t});\n\t\tlist.show();\n\n\t\tthis.listenTo(list, \"clicked:books\", this.downloadList.bind(this));\n\t},\n\n\tdownloadList: function downloadList() {\n\t\tvar params = this.filter.getServerFilters();\n\t\tparams.format = \"csv\";\n\n\t\twindow.open(settings.urlRoot + \"/api/1.0/reports/userGroupChanges?\" + qs.stringify(params));\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"code\", label: \"Code\", cell: \"string\", editable: false }, { name: \"name\", label: \"Group Name\", cell: \"string\", editable: false }, { name: \"username\", label: \"Username\", cell: \"string\", editable: false }, { name: \"firstname\", label: \"First Name\", cell: \"string\", editable: false }, { name: \"surname\", label: \"Surname\", cell: \"string\", editable: false }, { name: \"userName\", label: \"Changed By\", cell: \"string\", editable: false }, { name: \"impersonator\", label: \"Impersonator\", cell: \"string\", editable: false }, { name: \"change\", label: \"Action\", cell: \"string\", editable: false }, { name: \"reason\", label: \"Reason\", cell: \"string\", editable: false }, { name: \"created\", label: \"Date\", editable: false, cell: Grid.MomentCell.extend({\n\t\t\t\tmodelInUnixTimestamp: true,\n\t\t\t\tdisplayFormat: \"DD MMM YYYY, HH:mm a\",\n\t\t\t\tdisplayInUTC: false\n\t\t\t}) }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new UserGroups_Collection(),\n\t\t\tclickable: false,\n\t\t\twaitForFilters: true,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counter,\n\t\t\t\ttemplate: \"Rows $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar languageFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"languageFilter\",\n\t\t\tlabel: \"Language\",\n\t\t\tcategories: [{ items: settings.languageList }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar subjectFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"subjectFilter\",\n\t\t\tlabel: \"Subject\",\n\t\t\tserver: {\n\t\t\t\tkey: \"subject_id\",\n\t\t\t\tvalue: \"subject\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/subjects\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\n\t\tvar gradeFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"gradeFilter\",\n\t\t\tlabel: \"Year of Study\",\n\t\t\tserver: true,\n\t\t\tcategories: _.map(settings.gradeList, function (val, key) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: key,\n\t\t\t\t\titems: _.reduce(val.sort(function (a, b) {\n\t\t\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t\t\t}), function (sum, num) {\n\t\t\t\t\t\tsum.push({ name: num.value, label: num.name });return sum;\n\t\t\t\t\t}, [])\n\t\t\t\t};\n\t\t\t})\n\t\t};\n\n\t\tvar yearFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"yearFilter\",\n\t\t\tlabel: \"Year\",\n\t\t\tcategories: [{ items: _.range(2014, moment().year() + 2) }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar startFilter = {\n\t\t\ttype: \"dateTime\",\n\t\t\tname: \"start\",\n\t\t\tlabel: \"Since\",\n\t\t\tserver: true,\n\t\t\tinitialValue: function initialValue() {\n\t\t\t\treturn [moment().subtract(1, \"month\").startOf(\"day\").unix()];\n\t\t\t}\n\t\t};\n\n\t\tvar filterList = [textFilter, startFilter, languageFilter, subjectFilter, gradeFilter, yearFilter];\n\n\t\tthis.filter = this.grid.filter({ filterContainer: this.ui.filters, filters: filterList, defaultFilters: [\"textFilter\", \"start\"] });\n\t\tthis.ui.filters.prepend(this.filter.render().el);\n\t}\n});\n\n//_____________________________________________________________\n\n\nvar BookGroups_Model = Backbone.Epoxy.Model.extend({\n\tcomputeds: {\n\t\tuserName: function userName() {\n\t\t\tif (this.get(\"creator_id\") === 0) return \"SYSTEM\";\n\t\t\treturn this.get(\"user\");\n\t\t},\n\t\tchange: function change() {\n\t\t\treturn this.get(\"added\") ? \"Added\" : \"Removed\";\n\t\t}\n\t}\n});\n\nvar BookGroups_Collection = Backbone.PageableCollection.extend({\n\tmodel: BookGroups_Model,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/reports/bookGroupChanges?paged=true\";\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nPage.bookGroups = Backbone.Marionette.View.extend({\n\tclassName: \"report book-groups\",\n\ttemplate: require(\"../templates/reports.nunj\").bookGroups,\n\n\tui: {\n\t\tcounter: \".ops-bar .counter\",\n\t\tfilters: \".ops-bar .filters\",\n\t\tdownloadList: \".downloadList\",\n\t\toperations: \".operations\",\n\t\tpaging: \".paging\",\n\t\tgrid: \"div.grid\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.downloadList\": \"showDownloads\"\n\t},\n\n\tshowDownloads: function showDownloads(evt) {\n\t\tevt.stopPropagation();\n\n\t\tvar list = new SimpleMenu({\n\t\t\tanchor: this.ui.downloadList,\n\t\t\tside: \"left\",\n\t\t\tstructure: [{ closeOnClick: true, elements: [{ text: \"Download as CSV\", id: \"books\" }] }]\n\t\t});\n\t\tlist.show();\n\n\t\tthis.listenTo(list, \"clicked:books\", this.downloadList.bind(this));\n\t},\n\n\tdownloadList: function downloadList() {\n\t\tvar params = this.filter.getServerFilters();\n\t\tparams.format = \"csv\";\n\n\t\twindow.open(settings.urlRoot + \"/api/1.0/reports/bookGroupChanges?\" + qs.stringify(params));\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"title\", label: \"Book\", cell: \"string\", editable: false }, { name: \"isbn\", label: \"ISBN\", cell: \"string\", editable: false }, { name: \"name\", label: \"Group\", cell: \"string\", editable: false }, { name: \"userName\", label: \"Changed By\", cell: \"string\", editable: false }, { name: \"impersonator\", label: \"Impersonator\", cell: \"string\", editable: false }, { name: \"change\", label: \"Action\", cell: \"string\", editable: false }, { name: \"reason\", label: \"Reason\", cell: \"string\", editable: false }, { name: \"created\", label: \"Date\", editable: false, cell: Grid.MomentCell.extend({\n\t\t\t\tmodelInUnixTimestamp: true,\n\t\t\t\tdisplayFormat: \"DD MMM YYYY, HH:mm a\",\n\t\t\t\tdisplayInUTC: false\n\t\t\t}) }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new BookGroups_Collection(),\n\t\t\tclickable: false,\n\t\t\twaitForFilters: true,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counter,\n\t\t\t\ttemplate: \"Rows $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar languageFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"languageFilter\",\n\t\t\tlabel: \"Language\",\n\t\t\tcategories: [{ items: settings.languageList }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar subjectFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"subjectFilter\",\n\t\t\tlabel: \"Subject\",\n\t\t\tserver: {\n\t\t\t\tkey: \"subject_id\",\n\t\t\t\tvalue: \"subject\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/subjects\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\n\t\tvar gradeFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"gradeFilter\",\n\t\t\tlabel: \"Year of Study\",\n\t\t\tserver: true,\n\t\t\tcategories: _.map(settings.gradeList, function (val, key) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: key,\n\t\t\t\t\titems: _.reduce(val.sort(function (a, b) {\n\t\t\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t\t\t}), function (sum, num) {\n\t\t\t\t\t\tsum.push({ name: num.value, label: num.name });return sum;\n\t\t\t\t\t}, [])\n\t\t\t\t};\n\t\t\t})\n\t\t};\n\n\t\tvar yearFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"yearFilter\",\n\t\t\tlabel: \"Year\",\n\t\t\tcategories: [{ items: _.range(2014, moment().year() + 2) }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar startFilter = {\n\t\t\ttype: \"dateTime\",\n\t\t\tname: \"start\",\n\t\t\tlabel: \"Since\",\n\t\t\tserver: true,\n\t\t\tinitialValue: function initialValue() {\n\t\t\t\treturn [moment().subtract(1, \"month\").startOf(\"day\").unix()];\n\t\t\t}\n\t\t};\n\n\t\tvar filterList = [textFilter, startFilter, languageFilter, subjectFilter, gradeFilter, yearFilter];\n\n\t\tthis.filter = this.grid.filter({ filterContainer: this.ui.filters, filters: filterList, defaultFilters: [\"textFilter\", \"start\"] });\n\t\tthis.ui.filters.prepend(this.filter.render().el);\n\t}\n});\n\n//_________________________________________________________________---\n\n\nvar UserBookPurchases_Model = Backbone.Epoxy.Model.extend({\n\tcomputeds: {\n\t\tuserType: function userType() {\n\t\t\tif (_.includes(this.get(\"roles\"), \"student\")) return \"Student\";\n\t\t\tif (_.includes(this.get(\"roles\"), \"teacher\")) return \"Educator\";\n\t\t\treturn \"Other\";\n\t\t},\n\t\tuserGrade: function userGrade() {\n\t\t\tif (!this.get(\"grade\")) return \"-\";\n\n\t\t\treturn gradeMap.codeToHumanValue(this.get(\"grade\"));\n\t\t},\n\t\tgroupGrade: function groupGrade() {\n\t\t\tif (!this.get(\"group_grade\")) return \"-\";\n\n\t\t\treturn gradeMap.codeToHumanValue(this.get(\"group_grade\"));\n\t\t},\n\t\tgroupType: function groupType() {\n\t\t\tif (this.get(\"system_group\")) return \"System Group\";\n\t\t\tif (this.get(\"global_group\")) return \"Global Group\";\n\t\t\treturn \"Custom Group\";\n\t\t}\n\t}\n});\n\nvar UserBookPurchases_Collection = Backbone.PageableCollection.extend({\n\tmodel: UserBookPurchases_Model,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/reports/missingUserBookPurchases?paged=true\";\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nPage.userBookPurchases = Backbone.Marionette.View.extend({\n\tclassName: \"report user-book-purchases\",\n\ttemplate: require(\"../templates/reports.nunj\").userBookPurchases,\n\n\tui: {\n\t\tcounter: \".ops-bar .counter\",\n\t\tfilters: \".ops-bar .filters\",\n\t\tdownloadList: \".downloadList\",\n\t\toperations: \".operations\",\n\t\tgrid: \"div.grid\",\n\t\tpaging: \".paging\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.downloadList\": \"showDownloads\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tif (!settings.bookTokenMode) {\n\t\t\tradio.trigger(App.Events.Commands.Navigate, \"/\");\n\t\t\treturn false;\n\t\t}\n\t},\n\n\tshowDownloads: function showDownloads(evt) {\n\t\tevt.stopPropagation();\n\n\t\tvar list = new SimpleMenu({\n\t\t\tanchor: this.ui.downloadList,\n\t\t\tside: \"left\",\n\t\t\tstructure: [{ closeOnClick: true, elements: [{ text: \"Download as CSV\", id: \"books\" }] }]\n\t\t});\n\t\tlist.show();\n\n\t\tthis.listenTo(list, \"clicked:books\", this.downloadList.bind(this));\n\t},\n\n\tdownloadList: function downloadList() {\n\t\tvar params = this.grid.filter.getServerFilters();\n\t\tparams.format = \"csv\";\n\n\t\twindow.open(settings.urlRoot + \"/api/1.0/reports/missingUserBookPurchases?\" + qs.stringify(params));\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"username\", label: \"Username\", cell: \"string\", editable: false }, { name: \"firstname\", label: \"First Name\", cell: \"string\", editable: false }, { name: \"surname\", label: \"Surname\", cell: \"string\", editable: false }, { name: \"userGrade\", label: \"User Grade\", cell: \"string\", editable: false }, { name: \"bookName\", label: \"Book Name\", cell: \"string\", editable: false }, { name: \"isbn\", label: \"ISBN\", cell: \"string\", editable: false }, { name: \"groupName\", label: \"Group Name\", cell: \"string\", editable: false }, { name: \"year\", label: \"Group Year\", cell: \"string\", editable: false }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new UserBookPurchases_Collection(),\n\t\t\tclickable: false,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counter,\n\t\t\t\ttemplate: \"Rows $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar subjectFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"subjectFilter\",\n\t\t\tlabel: \"Subject\",\n\t\t\tserver: {\n\t\t\t\tkey: \"subject_id\",\n\t\t\t\tvalue: \"subject\",\n\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/subjects\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t}\n\t\t};\n\n\t\tvar gradeFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"gradeFilter\",\n\t\t\tlabel: \"Year of Study\",\n\t\t\tserver: true,\n\t\t\tcategories: _.map(settings.gradeList, function (val, key) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: key,\n\t\t\t\t\titems: _.reduce(val.sort(function (a, b) {\n\t\t\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t\t\t}), function (sum, num) {\n\t\t\t\t\t\tsum.push({ name: num.value, label: num.name });return sum;\n\t\t\t\t\t}, [])\n\t\t\t\t};\n\t\t\t})\n\t\t};\n\n\t\tvar yearFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"yearFilter\",\n\t\t\tlabel: \"Group Year\",\n\t\t\tcategories: [{ items: _.range(2014, moment().year() + 2) }],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar rolesFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"rolesFilter\",\n\t\t\tlabel: \"Roles\",\n\t\t\tcategories: [{\n\t\t\t\titems: _.fromPairs(_.compact(_.map(settings.roles, function (val, key) {\n\t\t\t\t\tif (key === \"*\") return;\n\t\t\t\t\treturn [key, val.name];\n\t\t\t\t})))\n\t\t\t}],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar filterList = [textFilter, subjectFilter, gradeFilter, yearFilter, rolesFilter];\n\n\t\tthis.ui.filters.prepend(this.grid.filter({ filterContainer: this.ui.filters, filters: filterList, defaultFilters: [\"textFilter\", \"yearFilter\"] }).render().el);\n\t}\n});\n\n//-----------------------------------\n\nvar LicenseChanges_Model = Backbone.Epoxy.Model.extend({\n\tcomputeds: {\n\t\tuserName: function userName() {\n\t\t\tif (this.get(\"creator_id\") === 0) return \"SYSTEM\";\n\t\t\treturn this.get(\"user\");\n\t\t},\n\t\tinstance: function instance() {\n\t\t\tif (this.get(\"instance_code\")[0] === \"P\") return moment.duration(this.get(\"instance_code\")).format(\"y[y] M[mo] d[d] h[h] m[m] s[s]\", { trim: \"both\" });\n\t\t\treturn this.get(\"instance_code\");\n\t\t}\n\t}\n});\n\nvar LicenseChanges_Collection = Backbone.PageableCollection.extend({\n\tmodel: LicenseChanges_Model,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/reports/licenseChanges?paged=true\";\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nPage.licenseChanges = Backbone.Marionette.View.extend({\n\tclassName: \"report book-groups\",\n\ttemplate: require(\"../templates/reports.nunj\").licenseChanges,\n\n\tui: {\n\t\tcounter: \".ops-bar .counter\",\n\t\tfilters: \".ops-bar .filters\",\n\t\tdownloadList: \".downloadList\",\n\t\toperations: \".operations\",\n\t\tpaging: \".paging\",\n\t\tgrid: \"div.grid\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.downloadList\": \"showDownloads\"\n\t},\n\n\tshowDownloads: function showDownloads(evt) {\n\t\tevt.stopPropagation();\n\n\t\tvar list = new SimpleMenu({\n\t\t\tanchor: this.ui.downloadList,\n\t\t\tside: \"left\",\n\t\t\tstructure: [{ closeOnClick: true, elements: [{ text: \"Download as CSV\", id: \"licenses\" }] }]\n\t\t});\n\t\tlist.show();\n\n\t\tthis.listenTo(list, \"clicked:licenses\", this.downloadList.bind(this));\n\t},\n\n\tdownloadList: function downloadList() {\n\t\tvar params = this.filter.getServerFilters();\n\t\tparams.format = \"csv\";\n\n\t\twindow.open(settings.urlRoot + \"/api/1.0/reports/licenseChanges?\" + qs.stringify(params));\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"instance\", label: \"Tranche / License\", cell: \"string\", editable: false }, { name: \"title\", label: \"Book Title\", cell: \"string\", editable: false }, { name: \"isbn\", label: \"Book ISBN\", cell: \"string\", editable: false }, { name: \"creator\", label: \"Changed By\", cell: \"string\", editable: false }, { name: \"impersonator\", label: \"Impersonator\", cell: \"string\", editable: false }, { name: \"target_user\", label: \"Target User\", cell: \"string\", editable: false }, { name: \"group\", label: \"Group\", cell: \"string\", editable: false }, { name: \"action\", label: \"Action\", cell: \"string\", editable: false }, { name: \"created\", label: \"Date\", editable: false, cell: Grid.MomentCell.extend({\n\t\t\t\tmodelInUnixTimestamp: true,\n\t\t\t\tdisplayFormat: \"DD MMM YYYY, HH:mm a\",\n\t\t\t\tdisplayInUTC: false\n\t\t\t}) }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new LicenseChanges_Collection(),\n\t\t\tclickable: false,\n\t\t\twaitForFilters: true,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counter,\n\t\t\t\ttemplate: \"Rows $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar startFilter = {\n\t\t\ttype: \"dateTime\",\n\t\t\tname: \"start\",\n\t\t\tlabel: \"Since\",\n\t\t\tserver: true,\n\t\t\tinitialValue: function initialValue() {\n\t\t\t\treturn [moment().subtract(1, \"month\").startOf(\"day\").unix()];\n\t\t\t}\n\t\t};\n\n\t\tvar filterList = [textFilter, startFilter];\n\n\t\tthis.filter = this.grid.filter({ filterContainer: this.ui.filters, filters: filterList, defaultFilters: [\"textFilter\", \"start\"] });\n\t\tthis.ui.filters.prepend(this.filter.render().el);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJlcG9ydHMuanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwiJCIsIl8iLCJtb21lbnQiLCJwaWthZGF5IiwicXMiLCJBcHAiLCJncmFkZU1hcCIsIkdyaWQiLCJTZXJ2ZXJHcmlkIiwic2V0dGluZ3MiLCJTaW1wbGVNZW51IiwicmFkaW8iLCJSYWRpbyIsImNoYW5uZWwiLCJQYWdlIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiZXh0ZW5kIiwidGFnTmFtZSIsImNsYXNzTmFtZSIsInRlbXBsYXRlIiwibWFpbiIsInJlZ2lvbnMiLCJ1aSIsInJlcG9ydCIsImV2ZW50cyIsInRlbXBsYXRlQ29udGV4dCIsImJvb2tUb2tlbk1vZGUiLCJpbml0aWFsaXplIiwib3B0aW9ucyIsIm9uUmVuZGVyIiwic2hvd0NoaWxkVmlldyIsImNhbWVsQ2FzZSIsImxvYWRSZXBvcnQiLCJldnQiLCJjdXJyZW50VGFyZ2V0IiwiZGF0YSIsInRyaWdnZXIiLCJFdmVudHMiLCJDb21tYW5kcyIsIk5hdmlnYXRlIiwiYWxsVW5sb2NrcyIsInN0YXJ0RGF0ZSIsImVuZERhdGUiLCJjdXRvZmYiLCJkb3dubG9hZCIsInllYXIiLCJmaWVsZCIsImdldCIsImZvcm1hdCIsInNldERlZmF1bHREYXRlIiwibWluRGF0ZSIsInRvRGF0ZSIsIm1heERhdGUiLCJ1cmwiLCJ2YWwiLCJzdGFydCIsInB1c2giLCJtb250aCIsImRhdGUiLCJlbmQiLCJ3aW5kb3ciLCJvcGVuIiwidXJsUm9vdCIsImpvaW4iLCJMZWFybmVyQm9va3NfTW9kZWwiLCJFcG94eSIsIk1vZGVsIiwiTGVhcm5lckJvb2tzX0NvbGxlY3Rpb24iLCJQYWdlYWJsZUNvbGxlY3Rpb24iLCJtb2RlbCIsInN0YXRlIiwicGFnZVNpemUiLCJtb2RlIiwicXVlcnlQYXJhbXMiLCJzb3J0S2V5IiwicGFyc2VTdGF0ZSIsInJlc3AiLCJ0b3RhbFJlY29yZHMiLCJ0b3RhbCIsInBhcnNlUmVjb3JkcyIsInJvd3MiLCJsZWFybmVyQm9va3MiLCJjb3VudGVyIiwiZmlsdGVycyIsImRvd25sb2FkTGlzdCIsIm9wZXJhdGlvbnMiLCJwYWdpbmciLCJncmlkIiwic2hvd0Rvd25sb2FkcyIsInN0b3BQcm9wYWdhdGlvbiIsImxpc3QiLCJhbmNob3IiLCJzaWRlIiwic3RydWN0dXJlIiwiY2xvc2VPbkNsaWNrIiwiZWxlbWVudHMiLCJ0ZXh0IiwiaWQiLCJzaG93IiwibGlzdGVuVG8iLCJiaW5kIiwiY29sdW1ucyIsIm5hbWUiLCJsYWJlbCIsImNlbGwiLCJlZGl0YWJsZSIsInNvcnRhYmxlIiwiZWwiLCJjb2xsZWN0aW9uIiwiY2xpY2thYmxlIiwiZWxlbWVudCIsIlZhbGlkQm9va3NfTW9kZWwiLCJpZEF0dHJpYnV0ZSIsImNvbXB1dGVkcyIsImJvb2tHcmFkZXMiLCJjb2RlVG9IdW1hblZhbHVlIiwiZ3JhZGUiLCJ1c2VyTmFtZXMiLCJib29rVGl0bGUiLCJ0aXRsZSIsImJvb2tJU0JOIiwiaXNibiIsImJvb2tTdWJqZWN0Iiwic3ViamVjdCIsImJvb2tQdWJsaXNoZXIiLCJwdWJsaXNoZXIiLCJWYWxpZEJvb2tzX0NvbGxlY3Rpb24iLCJ0b3RhbFBhZ2VzIiwidmFsaWRCb29rcyIsInBhcmFtcyIsImZpbHRlciIsImdldFNlcnZlckZpbHRlcnMiLCJzdHJpbmdpZnkiLCJ0ZXh0RmlsdGVyIiwidHlwZSIsImRlYm91bmNlIiwic2VydmVyIiwic3ViamVjdEZpbHRlciIsImtleSIsInZhbHVlIiwiZmV0Y2giLCJpbmZpbml0ZSIsImdyYWRlRmlsdGVyIiwiY2F0ZWdvcmllcyIsIm1hcCIsImdyYWRlTGlzdCIsIml0ZW1zIiwicmVkdWNlIiwic29ydCIsImEiLCJiIiwibGV4aWNhbCIsInRvVXBwZXJDYXNlIiwibG9jYWxlQ29tcGFyZSIsInN1bSIsIm51bSIsInB1YkZpbHRlciIsInllYXJGaWx0ZXIiLCJyYW5nZSIsImZpbHRlckxpc3QiLCJwcmVwZW5kIiwiZmlsdGVyQ29udGFpbmVyIiwiZGVmYXVsdEZpbHRlcnMiLCJyZW5kZXIiLCJHcm91cHNfTW9kZWwiLCJ1c2VyVHlwZSIsImluY2x1ZGVzIiwidXNlckdyYWRlIiwiZ3JvdXBHcmFkZSIsImdyb3VwVHlwZSIsIkdyb3Vwc19Db2xsZWN0aW9uIiwiZ3JvdXBzIiwibGFuZ3VhZ2VGaWx0ZXIiLCJsYW5ndWFnZUxpc3QiLCJyb2xlc0ZpbHRlciIsImZyb21QYWlycyIsImNvbXBhY3QiLCJyb2xlcyIsIlJlc291cmNlc0NyZWF0ZWRfTW9kZWwiLCJSZXNvdXJjZXNDcmVhdGVkX0NvbGxlY3Rpb24iLCJyZXNvdXJjZXNDcmVhdGVkIiwid2FpdEZvckZpbHRlcnMiLCJzZWFyY2hGaWx0ZXIiLCJzdGFydEZpbHRlciIsImluaXRpYWxWYWx1ZSIsImN1cnJlbnRZZWFyIiwidW5peCIsImVuZEZpbHRlciIsIkFwcFZlcnNpb25zX01vZGVsIiwiQXBwVmVyc2lvbnNfQ29sbGVjdGlvbiIsIkNvbGxlY3Rpb24iLCJhcHBWZXJzaW9ucyIsIk1vbWVudENlbGwiLCJtb2RlbEluVW5peFRpbWVzdGFtcCIsImRpc3BsYXlGb3JtYXQiLCJkaXNwbGF5SW5VVEMiLCJoYW5kbGVyIiwic2VsZWN0aW9uIiwiZXZlcnkiLCJzb21lIiwiY29sIiwidG9TdHJpbmciLCJ0b0xvd2VyQ2FzZSIsInMiLCJyZXNvbHZlciIsIml0ZW0iLCJ4IiwiZmluZCIsImciLCJoYXMiLCJpc0FycmF5IiwicGFyc2VJbnQiLCJpbnRlcnNlY3Rpb24iLCJpbnZva2VNYXAiLCJzcGxpdCIsIlN0cmluZyIsInByb3RvdHlwZSIsImxlbmd0aCIsIkxhdGVzdFVubG9ja3NfTW9kZWwiLCJib29rR3JhZGUiLCJMYXRlc3RVbmxvY2tzX0NvbGxlY3Rpb24iLCJsYXRlc3RVbmxvY2tzIiwic3VidHJhY3QiLCJzdGFydE9mIiwiU3lzdGVtR3JvdXBzX01vZGVsIiwiY2hhbmdlIiwidXNlck5hbWUiLCJTeXN0ZW1Hcm91cHNfQ29sbGVjdGlvbiIsInN5c3RlbUdyb3VwcyIsIlVzZXJHcm91cHNfTW9kZWwiLCJVc2VyR3JvdXBzX0NvbGxlY3Rpb24iLCJ1c2VyR3JvdXBzIiwiQm9va0dyb3Vwc19Nb2RlbCIsIkJvb2tHcm91cHNfQ29sbGVjdGlvbiIsImJvb2tHcm91cHMiLCJVc2VyQm9va1B1cmNoYXNlc19Nb2RlbCIsIlVzZXJCb29rUHVyY2hhc2VzX0NvbGxlY3Rpb24iLCJ1c2VyQm9va1B1cmNoYXNlcyIsIkxpY2Vuc2VDaGFuZ2VzX01vZGVsIiwiaW5zdGFuY2UiLCJkdXJhdGlvbiIsInRyaW0iLCJMaWNlbnNlQ2hhbmdlc19Db2xsZWN0aW9uIiwibGljZW5zZUNoYW5nZXMiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1DLElBQUlELFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUUsSUFBSUYsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNRyxTQUFTSCxRQUFRLFFBQVIsQ0FBZjtBQUNBLElBQU1JLFVBQVVKLFFBQVEsU0FBUixDQUFoQjtBQUNBLElBQU1LLEtBQUtMLFFBQVEsYUFBUixDQUFYOztBQUVBLElBQU1NLE1BQU1OLFFBQVEsYUFBUixDQUFaO0FBQ0EsSUFBTU8sV0FBV1AsUUFBUSxvQkFBUixDQUFqQjtBQUNBLElBQU1RLE9BQU9SLFFBQVEsZ0JBQVIsQ0FBYjtBQUNBLElBQU1TLGFBQWFULFFBQVEsc0JBQVIsQ0FBbkI7QUFDQSxJQUFNVSxXQUFXVixRQUFRLGNBQVIsQ0FBakI7QUFDQSxJQUFNVyxhQUFhWCxRQUFRLHNCQUFSLENBQW5COztBQUVBLElBQU1ZLFFBQVFiLFNBQVNjLEtBQVQsQ0FBZUMsT0FBZixDQUF1QixRQUF2QixDQUFkOztBQUVBLElBQU1DLE9BQU8sRUFBYjs7QUFFQUMsT0FBT0MsT0FBUCxHQUFpQmxCLFNBQVNtQixVQUFULENBQW9CQyxJQUFwQixDQUF5QkMsTUFBekIsQ0FBZ0M7QUFDaERDLFVBQVMsS0FEdUM7QUFFaERDLFlBQVcsd0JBRnFDOztBQUloREMsV0FBVXZCLFFBQVEsMkJBQVIsRUFB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QUxVLEdBQW5COztBQVFBLE1BQU0rQyxjQUFjO0FBQ25CakQsU0FBTSxVQURhO0FBRW5CaEMsU0FBTSxPQUZhO0FBR25CQyxVQUFPLE9BSFk7QUFJbkJpQyxXQUFRLElBSlc7QUFLbkJnRCxpQkFBYyx3QkFBVztBQUN4QixXQUFPLENBQUN6TCxTQUFTK04sUUFBVCxDQUFrQixDQUFsQixFQUFxQixPQUFyQixFQUE4QkMsT0FBOUIsQ0FBc0MsS0FBdEMsRUFBNkNyQyxJQUE3QyxFQUFELENBQVA7QUFDQTtBQVBrQixHQUFwQjs7QUFVQSxNQUFNM0IsYUFBYSxDQUFDMUIsVUFBRCxFQUFha0QsV0FBYixDQUFuQjs7QUFFQSxPQUFLckQsTUFBTCxHQUFjLEtBQUszQyxJQUFMLENBQVUyQyxNQUFWLENBQWlCLEVBQUUrQixpQkFBaUIsS0FBSzNJLEVBQUwsQ0FBUTZELE9BQTNCLEVBQW9DQSxTQUFTNEUsVUFBN0MsRUFBeURHLGdCQUFnQixDQUFDLFlBQUQsRUFBZSxPQUFmLENBQXpFLEVBQWpCLENBQWQ7QUFDQSxPQUFLNUksRUFBTCxDQUFRNkQsT0FBUixDQUFnQjZFLE9BQWhCLENBQXdCLEtBQUs5QixNQUFMLENBQVlpQyxNQUFaLEdBQXFCeEQsRUFBN0M7QUFDQTtBQS9Gb0QsQ0FBaEMsQ0FBdEIiLCJmaWxlIjoicmVwb3J0cy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgbW9tZW50ID0gcmVxdWlyZShcIm1vbWVudFwiKTtcbmNvbnN0IHBpa2FkYXkgPSByZXF1aXJlKFwicGlrYWRheVwiKTtcbmNvbnN0IHFzID0gcmVxdWlyZShcInF1ZXJ5c3RyaW5nXCIpO1xuXG5jb25zdCBBcHAgPSByZXF1aXJlKFwiLi4vLi4vaW5kZXhcIik7XG5jb25zdCBncmFkZU1hcCA9IHJlcXVpcmUoXCIuLi8uLi9saWIvZ3JhZGVNYXBcIik7XG5jb25zdCBHcmlkID0gcmVxdWlyZShcIi4uLy4uL2xpYi9ncmlkXCIpO1xuY29uc3QgU2VydmVyR3JpZCA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc2VydmVyR3JpZFwiKTtcbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcbmNvbnN0IFNpbXBsZU1lbnUgPSByZXF1aXJlKFwiLi4vLi4vbGliL3NpbXBsZU1lbnVcIik7XG5cbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcblxuY29uc3QgUGFnZSA9IHt9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwiY29udGVudCBzeXN0ZW0tcmVwb3J0c1wiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL3JlcG9ydHMubnVualwiKS5tYWluLFxuXG5cdHJlZ2lvbnM6IHtcblx0XHRtYWluOiBcIi5tYWluXCIsXG5cdH0sXG5cblx0dWk6IHtcblx0XHRyZXBvcnQ6IFwiLmdyb3VwIC5pdGVtXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkucmVwb3J0XCI6IFwibG9hZFJlcG9ydFwiLFxuXHR9LFxuXG5cdHRlbXBsYXRlQ29udGV4dDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGJvb2tUb2tlbk1vZGU6IHNldHRpbmdzLmJvb2tUb2tlbk1vZGUsXG5cdFx0fTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5yZXBvcnQgPSBvcHRpb25zLnJlcG9ydDtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMucmVwb3J0KVxuXHRcdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwibWFpblwiLCBuZXcgUGFnZVtfLmNhbWVsQ2FzZSh0aGlzLnJlcG9ydCldKCkpO1xuXHR9LFxuXG5cdGxvYWRSZXBvcnQ6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGNvbnN0IHJlcG9ydCA9ICQoZXZ0LmN1cnJlbnRUYXJnZXQpLmRhdGEoXCJyZXBvcnRcIik7XG5cblx0XHRpZiAocmVwb3J0KSB7XG5cdFx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJtYWluXCIsIG5ldyBQYWdlW18uY2FtZWxDYXNlKHJlcG9ydCldKCkpO1xuXHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLk5hdmlnYXRlLCBcIi9zeXN0ZW0vcmVwb3J0cy9cIiArIHJlcG9ydCwgeyB0cmlnZ2VyOiBmYWxzZSB9KTtcblx0XHR9XG5cdH0sXG59KTtcblxuXG4vL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19cblxuXG5QYWdlLmFsbFVubG9ja3MgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInJlcG9ydCBhbGwtdW5sb2Nrc1wiLFxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9yZXBvcnRzLm51bmpcIikuYWxsVW5sb2NrcyxcblxuXHR1aToge1xuXHRcdHN0YXJ0RGF0ZTogXCJpbnB1dFtuYW1lPSdzdGFydERhdGUnXVwiLFxuXHRcdGVuZERhdGU6IFwiaW5wdXRbbmFtZT0nZW5kRGF0ZSddXCIsXG5cdFx0Y3V0b2ZmOiBcImlucHV0W25hbWU9J2N1dG9mZiddXCIsXG5cblx0XHRkb3dubG9hZDogXCJpbnB1dFt0eXBlPSdidXR0b24nXVwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmRvd25sb2FkXCI6IFwiZG93bmxvYWRcIixcblx0fSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHR5ZWFyOiBtb21lbnQoKS55ZWFyKCkgLSAxLFxuXHRcdH07XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwLCBuby1uZXdcblx0XHRuZXcgcGlrYWRheSh7XG5cdFx0XHRmaWVsZDogdGhpcy51aS5zdGFydERhdGUuZ2V0KDApLFxuXHRcdFx0Zm9ybWF0OiBcIkREIE1NTU0gWVlZWVwiLFxuXHRcdFx0c2V0RGVmYXVsdERhdGU6IHRydWUsXG5cdFx0XHRtaW5EYXRlOiBtb21lbnQoXCIwMSBKYW51YXJ5IDIwMTVcIiwgXCJERCBNTU1NIFlZWVlcIikudG9EYXRlKCksXG5cdFx0XHRtYXhEYXRlOiBtb21lbnQoKS50b0RhdGUoKSxcblx0XHR9KTtcblxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwLCBuby1uZXdcblx0XHRuZXcgcGlrYWRheSh7XG5cdFx0XHRmaWVsZDogdGhpcy51aS5lbmREYXRlLmdldCgwKSxcblx0XHRcdGZvcm1hdDogXCJERCBNTU1NIFlZWVlcIixcblx0XHRcdG1pbkRhdGU6IG1vbWVudChcIjAxIEphbnVhcnkgMjAxNVwiLCBcIkREIE1NTU0gWVlZWVwiKS50b0RhdGUoKSxcblx0XHRcdG1heERhdGU6IG1vbWVudCgpLnRvRGF0ZSgpLFxuXHRcdH0pO1xuXHR9LFxuXG5cdGRvd25sb2FkOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCB1cmwgPSBbXTtcblx0XHRpZiAodGhpcy51aS5zdGFydERhdGUudmFsKCkpIHtcblx0XHRcdGNvbnN0IHN0YXJ0ID0gbW9tZW50KHRoaXMudWkuc3RhcnREYXRlLnZhbCgpLCBcIkREIE1NTU0gWVlZWVwiKTtcblx0XHRcdHVybC5wdXNoKFwic3RhcnR5ZWFyPVwiICsgc3RhcnQueWVhcigpKTtcblx0XHRcdHVybC5wdXNoKFwic3RhcnRtb250aD1cIiArIChzdGFydC5tb250aCgpICsgMSkpO1xuXHRcdFx0dXJsLnB1c2goXCJzdGFydGRheT1cIiArIHN0YXJ0LmRhdGUoKSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMudWkuZW5kRGF0ZS52YWwoKSkge1xuXHRcdFx0Y29uc3QgZW5kID0gbW9tZW50KHRoaXMudWkuZW5kRGF0ZS52YWwoKSwgXCJERCBNTU1NIFlZWVlcIik7XG5cdFx0XHR1cmwucHVzaChcImVuZHllYXI9XCIgKyBlbmQueWVhcigpKTtcblx0XHRcdHVybC5wdXNoKFwiZW5kbW9udGg9XCIgKyAoZW5kLm1vbnRoKCkgKyAxKSk7XG5cdFx0XHR1cmwucHVzaChcImVuZGRheT1cIiArIGVuZC5kYXRlKCkpO1xuXHRcdH1cblxuXHRcdHdpbmRvdy5vcGVuKHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3JlcG9ydHMvYWxsVW5sb2Nrcz9cIiArIHVybC5qb2luKFwiJlwiKSk7XG5cdH0sXG59KTtcblxuXG4vL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19cblxuXG5jb25zdCBMZWFybmVyQm9va3NfTW9kZWwgPSBCYWNrYm9uZS5FcG94eS5Nb2RlbC5leHRlbmQoe30pO1xuXG5jb25zdCBMZWFybmVyQm9va3NfQ29sbGVjdGlvbiA9IEJhY2tib25lLlBhZ2VhYmxlQ29sbGVjdGlvbi5leHRlbmQoe1xuXHRtb2RlbDogTGVhcm5lckJvb2tzX01vZGVsLFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3JlcG9ydHMvbGVhcm5lckJvb2tzUGVyR3JhZGU/cGFnZWQ9dHJ1ZVwiO1xuXHR9LFxuXG5cdHN0YXRlOiB7XG5cdFx0cGFnZVNpemU6IDMwLFxuXHR9LFxuXHRtb2RlOiBcInNlcnZlclwiLFxuXG5cdHF1ZXJ5UGFyYW1zOiB7XG5cdFx0cGFnZVNpemU6IFwicGFnZVNpemVcIixcblx0XHRzb3J0S2V5OiBcInNvcnRCeVwiLFxuXHR9LFxuXG5cdHBhcnNlU3RhdGU6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRyZXR1cm4geyB0b3RhbFJlY29yZHM6IHJlc3AudG90YWwgfTtcblx0fSxcblxuXHRwYXJzZVJlY29yZHM6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRyZXR1cm4gcmVzcC5yb3dzO1xuXHR9LFxufSk7XG5cblBhZ2UubGVhcm5lckJvb2tzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJyZXBvcnQgbGVhcm5lci1ib29rc1wiLFxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9yZXBvcnRzLm51bmpcIikubGVhcm5lckJvb2tzLFxuXG5cdHVpOiB7XG5cdFx0Y291bnRlcjogXCIub3BzLWJhciAuY291bnRlclwiLFxuXHRcdGZpbHRlcnM6IFwiLm9wcy1iYXIgLmZpbHRlcnNcIixcblx0XHRkb3dubG9hZExpc3Q6IFwiLmRvd25sb2FkTGlzdFwiLFxuXHRcdG9wZXJhdGlvbnM6IFwiLm9wZXJhdGlvbnNcIixcblx0XHRwYWdpbmc6IFwiLnBhZ2luZ1wiLFxuXHRcdGdyaWQ6IFwiZGl2LmdyaWRcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5kb3dubG9hZExpc3RcIjogXCJzaG93RG93bmxvYWRzXCIsXG5cdH0sXG5cblx0c2hvd0Rvd25sb2FkczogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0Y29uc3QgbGlzdCA9IG5ldyBTaW1wbGVNZW51KHtcblx0XHRcdGFuY2hvcjogdGhpcy51aS5kb3dubG9hZExpc3QsXG5cdFx0XHRzaWRlOiBcImxlZnRcIixcblx0XHRcdHN0cnVjdHVyZTogW1xuXHRcdFx0XHR7IGNsb3NlT25DbGljazogdHJ1ZSwgZWxlbWVudHM6IFtcblx0XHRcdFx0XHR7IHRleHQ6IFwiRG93bmxvYWQgYXMgQ1NWXCIsIGlkOiBcImJvb2tzXCIgfSxcblx0XHRcdFx0XSB9LFxuXHRcdFx0XSxcblx0XHR9KTtcblx0XHRsaXN0LnNob3coKTtcblxuXHRcdHRoaXMubGlzdGVuVG8obGlzdCwgXCJjbGlja2VkOmJvb2tzXCIsIHRoaXMuZG93bmxvYWRMaXN0LmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdGRvd25sb2FkTGlzdDogZnVuY3Rpb24oKSB7XG5cdFx0d2luZG93Lm9wZW4oc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvcmVwb3J0cy9sZWFybmVyQm9va3NQZXJHcmFkZT9mb3JtYXQ9Y3N2XCIpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBjb2x1bW5zID0gW1xuXHRcdFx0eyBuYW1lOiBcInRvdGFsX2Jvb2tzXCIsIGxhYmVsOiBcIkJvb2tzIENvdW50XCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSwgc29ydGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiZ3JhZGVcIiwgbGFiZWw6IFwiR3JhZGVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlLCBzb3J0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJ1c2Vyc193aXRoX2Jvb2tzXCIsIGxhYmVsOiBcIlN0dWRlbnRzIHcvIEJvb2tzXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSwgc29ydGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwidG90YWxfdXNlcnNcIiwgbGFiZWw6IFwiVG90YWwgU3R1ZGVudHNcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlLCBzb3J0YWJsZTogZmFsc2UgfSxcblx0XHRdO1xuXG5cdFx0dGhpcy5ncmlkID0gbmV3IFNlcnZlckdyaWQoe1xuXHRcdFx0ZWw6IHRoaXMudWkuZ3JpZCxcblx0XHRcdGNvbHVtbnM6IGNvbHVtbnMsXG5cdFx0XHRjb2xsZWN0aW9uOiBuZXcgTGVhcm5lckJvb2tzX0NvbGxlY3Rpb24oKSxcblx0XHRcdGNsaWNrYWJsZTogZmFsc2UsXG5cdFx0XHRjb3VudGVyOiB7XG5cdFx0XHRcdGVsZW1lbnQ6IHRoaXMudWkuY291bnRlcixcblx0XHRcdFx0dGVtcGxhdGU6IFwiUm93cyAkc3RhcnQgLSAkZW5kIG9mICR0b3RhbFwiLFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLnBhZ2luZyxcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH0sXG59KTtcblxuXG4vL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19cblxuXG5cbmNvbnN0IFZhbGlkQm9va3NfTW9kZWwgPSBCYWNrYm9uZS5FcG94eS5Nb2RlbC5leHRlbmQoe1xuXHRpZEF0dHJpYnV0ZTogXCJpZGVudFwiLFxuXHRjb21wdXRlZHM6IHtcblx0XHRib29rR3JhZGVzOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBncmFkZU1hcC5jb2RlVG9IdW1hblZhbHVlKHRoaXMuZ2V0KFwibWV0YWRhdGFcIikuZ3JhZGUpO1xuXHRcdH0sXG5cdFx0dXNlck5hbWVzOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLmdldChcImZpcnN0bmFtZVwiKSArIFwiIFwiICsgdGhpcy5nZXQoXCJzdXJuYW1lXCIpO1xuXHRcdH0sXG5cdFx0Ym9va1RpdGxlOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLmdldChcIm1ldGFkYXRhXCIpLnRpdGxlO1xuXHRcdH0sXG5cdFx0Ym9va0lTQk46IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0KFwibWV0YWRhdGFcIikuaXNibjtcblx0XHR9LFxuXHRcdGJvb2tTdWJqZWN0OiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLmdldChcIm1ldGFkYXRhXCIpLnN1YmplY3Q7XG5cdFx0fSxcblx0XHRib29rUHVibGlzaGVyOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLmdldChcIm1ldGFkYXRhXCIpLnB1Ymxpc2hlcjtcblx0XHR9LFxuXHR9LFxufSk7XG5cbmNvbnN0IFZhbGlkQm9va3NfQ29sbGVjdGlvbiA9IEJhY2tib25lLlBhZ2VhYmxlQ29sbGVjdGlvbi5leHRlbmQoe1xuXHRtb2RlbDogVmFsaWRCb29rc19Nb2RlbCxcblxuXHR1cmw6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9yZXBvcnRzL3ZhbGlkQm9va3NQZXJVc2VyP3BhZ2VkPXRydWVcIjtcblx0fSxcblxuXHRzdGF0ZToge1xuXHRcdHBhZ2VTaXplOiAzMCxcblx0fSxcblx0bW9kZTogXCJzZXJ2ZXJcIixcblxuXHRxdWVyeVBhcmFtczoge1xuXHRcdHBhZ2VTaXplOiBcInBhZ2VTaXplXCIsXG5cdFx0dG90YWxQYWdlczogbnVsbCxcblx0XHR0b3RhbFJlY29yZHM6IG51bGwsXG5cdFx0c29ydEtleTogXCJzb3J0QnlcIixcblx0fSxcblxuXHRwYXJzZVN0YXRlOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0cmV0dXJuIHsgdG90YWxSZWNvcmRzOiByZXNwLnRvdGFsIH07XG5cdH0sXG5cblx0cGFyc2VSZWNvcmRzOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0cmV0dXJuIHJlc3Aucm93cztcblx0fSxcbn0pO1xuXG5QYWdlLnZhbGlkQm9va3MgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInJlcG9ydCB2YWxpZC1ib29rc1wiLFxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9yZXBvcnRzLm51bmpcIikudmFsaWRCb29rcyxcblxuXHR1aToge1xuXHRcdGNvdW50ZXI6IFwiLm9wcy1iYXIgLmNvdW50ZXJcIixcblx0XHRmaWx0ZXJzOiBcIi5vcHMtYmFyIC5maWx0ZXJzXCIsXG5cdFx0ZG93bmxvYWRMaXN0OiBcIi5kb3dubG9hZExpc3RcIixcblx0XHRvcGVyYXRpb25zOiBcIi5vcGVyYXRpb25zXCIsXG5cdFx0cGFnaW5nOiBcIi5wYWdpbmdcIixcblx0XHRncmlkOiBcImRpdi5ncmlkXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkuZG93bmxvYWRMaXN0XCI6IFwic2hvd0Rvd25sb2Fkc1wiLFxuXHR9LFxuXG5cdHNob3dEb3dubG9hZHM6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGNvbnN0IGxpc3QgPSBuZXcgU2ltcGxlTWVudSh7XG5cdFx0XHRhbmNob3I6IHRoaXMudWkuZG93bmxvYWRMaXN0LFxuXHRcdFx0c2lkZTogXCJsZWZ0XCIsXG5cdFx0XHRzdHJ1Y3R1cmU6IFtcblx0XHRcdFx0eyBjbG9zZU9uQ2xpY2s6IHRydWUsIGVsZW1lbnRzOiBbXG5cdFx0XHRcdFx0eyB0ZXh0OiBcIkRvd25sb2FkIGFzIENTVlwiLCBpZDogXCJib29rc1wiIH0sXG5cdFx0XHRcdF0gfSxcblx0XHRcdF0sXG5cdFx0fSk7XG5cdFx0bGlzdC5zaG93KCk7XG5cblx0XHR0aGlzLmxpc3RlblRvKGxpc3QsIFwiY2xpY2tlZDpib29rc1wiLCB0aGlzLmRvd25sb2FkTGlzdC5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRkb3dubG9hZExpc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHBhcmFtcyA9IHRoaXMuZ3JpZC5maWx0ZXIuZ2V0U2VydmVyRmlsdGVycygpO1xuXHRcdHBhcmFtcy5mb3JtYXQgPSBcImNzdlwiO1xuXG5cdFx0d2luZG93Lm9wZW4oc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvcmVwb3J0cy92YWxpZEJvb2tzUGVyVXNlcj9cIiArIHFzLnN0cmluZ2lmeShwYXJhbXMpKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgY29sdW1ucyA9IFtcblx0XHRcdHsgbmFtZTogXCJ1c2VybmFtZVwiLCBsYWJlbDogXCJVc2VybmFtZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJ1c2VyTmFtZXNcIiwgbGFiZWw6IFwiTmFtZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJ0aXRsZVwiLCBsYWJlbDogXCJUaXRsZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJpc2JuXCIsIGxhYmVsOiBcIklTQk5cIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwicHVibGlzaGVyXCIsIGxhYmVsOiBcIlB1Ymxpc2hlclwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJzdWJqZWN0XCIsIGxhYmVsOiBcIlN1YmplY3RcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiYm9va0dyYWRlc1wiLCBsYWJlbDogXCJTdHVkeSBZZWFyXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdF07XG5cblx0XHR0aGlzLmdyaWQgPSBuZXcgU2VydmVyR3JpZCh7XG5cdFx0XHRlbDogdGhpcy51aS5ncmlkLFxuXHRcdFx0Y29sdW1uczogY29sdW1ucyxcblx0XHRcdGNvbGxlY3Rpb246IG5ldyBWYWxpZEJvb2tzX0NvbGxlY3Rpb24oKSxcblx0XHRcdGNsaWNrYWJsZTogZmFsc2UsXG5cdFx0XHRjb3VudGVyOiB7XG5cdFx0XHRcdGVsZW1lbnQ6IHRoaXMudWkuY291bnRlcixcblx0XHRcdFx0dGVtcGxhdGU6IFwiUm93cyAkc3RhcnQgLSAkZW5kIG9mICR0b3RhbFwiLFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLnBhZ2luZyxcblx0XHRcdH0sXG5cdFx0fSk7XG5cblx0XHRjb25zdCB0ZXh0RmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJ0ZXh0XCIsXG5cdFx0XHRuYW1lOiBcInRleHRGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlRleHQgU2VhcmNoXCIsXG5cdFx0XHRkZWJvdW5jZTogMjAwLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdH07XG5cblx0XHRjb25zdCBzdWJqZWN0RmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJzdWJqZWN0RmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJTdWJqZWN0XCIsXG5cdFx0XHRzZXJ2ZXI6IHtcblx0XHRcdFx0a2V5OiBcInN1YmplY3RfaWRcIixcblx0XHRcdFx0dmFsdWU6IFwic3ViamVjdFwiLFxuXHRcdFx0XHRmZXRjaDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvZGF0YS9zdWJqZWN0c1wiLFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRwYWdlU2l6ZTogMzAsXG5cdFx0XHRcdGluZmluaXRlOiB0cnVlLFxuXHRcdFx0fSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgZ3JhZGVGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcImdyYWRlRmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJZZWFyIG9mIFN0dWR5XCIsXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0XHRjYXRlZ29yaWVzOiBfLm1hcChzZXR0aW5ncy5ncmFkZUxpc3QsICh2YWwsIGtleSkgPT4gKHtcblx0XHRcdFx0bGFiZWw6IGtleSxcblx0XHRcdFx0aXRlbXM6IF8ucmVkdWNlKHZhbC5zb3J0KChhLCBiKSA9PiAoXCJsZXhpY2FsXCIgaW4gYSA/IGEubGV4aWNhbCA6IGEubmFtZSkudG9VcHBlckNhc2UoKS5sb2NhbGVDb21wYXJlKChcImxleGljYWxcIiBpbiBiID8gYi5sZXhpY2FsIDogYi5uYW1lKS50b1VwcGVyQ2FzZSgpKSksXG5cdFx0XHRcdFx0KHN1bSwgbnVtKSA9PiB7IHN1bS5wdXNoKHsgbmFtZTogbnVtLnZhbHVlLCBsYWJlbDogbnVtLm5hbWUgfSk7IHJldHVybiBzdW07IH0sIFtdKSxcblx0XHRcdH0pKSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgcHViRmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJwdWJGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlB1Ymxpc2hlclwiLFxuXHRcdFx0c2VydmVyOiB7XG5cdFx0XHRcdGtleTogXCJwdWJsaXNoZXJfaWRcIixcblx0XHRcdFx0dmFsdWU6IFwiZnVsbG5hbWVcIixcblx0XHRcdFx0ZmV0Y2g6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2RhdGEvcHVibGlzaGVycz9kdW1teT1mYWxzZVwiLFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRwYWdlU2l6ZTogMzAsXG5cdFx0XHRcdGluZmluaXRlOiB0cnVlLFxuXHRcdFx0fSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgeWVhckZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiaXRlbWl6ZWRcIixcblx0XHRcdG5hbWU6IFwieWVhckZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiWWVhclwiLFxuXHRcdFx0Y2F0ZWdvcmllczogW1xuXHRcdFx0XHR7IGl0ZW1zOiBfLnJhbmdlKDIwMTQsIG1vbWVudCgpLnllYXIoKSArIDIpIH0sXG5cdFx0XHRdLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdH07XG5cblx0XHRjb25zdCBmaWx0ZXJMaXN0ID0gW3RleHRGaWx0ZXIsIHN1YmplY3RGaWx0ZXIsIGdyYWRlRmlsdGVyLCBwdWJGaWx0ZXIsIHllYXJGaWx0ZXJdO1xuXG5cdFx0dGhpcy51aS5maWx0ZXJzLnByZXBlbmQodGhpcy5ncmlkLmZpbHRlcih7IGZpbHRlckNvbnRhaW5lcjogdGhpcy51aS5maWx0ZXJzLCBmaWx0ZXJzOiBmaWx0ZXJMaXN0LCBkZWZhdWx0RmlsdGVyczogW1widGV4dEZpbHRlclwiXSB9KS5yZW5kZXIoKS5lbCk7XG5cdH0sXG59KTtcblxuXG5cblxuXG5jb25zdCBHcm91cHNfTW9kZWwgPSBCYWNrYm9uZS5FcG94eS5Nb2RlbC5leHRlbmQoe1xuXHRjb21wdXRlZHM6IHtcblx0XHR1c2VyVHlwZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoXy5pbmNsdWRlcyh0aGlzLmdldChcInJvbGVzXCIpLCBcInN0dWRlbnRcIikpXG5cdFx0XHRcdHJldHVybiBcIlN0dWRlbnRcIjtcblx0XHRcdGlmIChfLmluY2x1ZGVzKHRoaXMuZ2V0KFwicm9sZXNcIiksIFwidGVhY2hlclwiKSlcblx0XHRcdFx0cmV0dXJuIFwiRWR1Y2F0b3JcIjtcblx0XHRcdHJldHVybiBcIk90aGVyXCI7XG5cdFx0fSxcblx0XHR1c2VyR3JhZGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCF0aGlzLmdldChcImdyYWRlXCIpKVxuXHRcdFx0XHRyZXR1cm4gXCItXCI7XG5cblx0XHRcdHJldHVybiBncmFkZU1hcC5jb2RlVG9IdW1hblZhbHVlKHRoaXMuZ2V0KFwiZ3JhZGVcIikpO1xuXHRcdH0sXG5cdFx0Z3JvdXBHcmFkZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIXRoaXMuZ2V0KFwiZ3JvdXBfZ3JhZGVcIikpXG5cdFx0XHRcdHJldHVybiBcIi1cIjtcblxuXHRcdFx0cmV0dXJuIGdyYWRlTWFwLmNvZGVUb0h1bWFuVmFsdWUodGhpcy5nZXQoXCJncm91cF9ncmFkZVwiKSk7XG5cdFx0fSxcblx0XHRncm91cFR5cGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKHRoaXMuZ2V0KFwic3lzdGVtX2dyb3VwXCIpKVxuXHRcdFx0XHRyZXR1cm4gXCJTeXN0ZW0gR3JvdXBcIjtcblx0XHRcdGlmICh0aGlzLmdldChcImdsb2JhbF9ncm91cFwiKSlcblx0XHRcdFx0cmV0dXJuIFwiR2xvYmFsIEdyb3VwXCI7XG5cdFx0XHRyZXR1cm4gXCJDdXN0b20gR3JvdXBcIjtcblx0XHR9LFxuXHR9LFxufSk7XG5cbmNvbnN0IEdyb3Vwc19Db2xsZWN0aW9uID0gQmFja2JvbmUuUGFnZWFibGVDb2xsZWN0aW9uLmV4dGVuZCh7XG5cdG1vZGVsOiBHcm91cHNfTW9kZWwsXG5cblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvcmVwb3J0cy9ncm91cHNQZXJVc2VyP3BhZ2VkPXRydWVcIjtcblx0fSxcblxuXHRzdGF0ZToge1xuXHRcdHBhZ2VTaXplOiAzMCxcblx0fSxcblx0bW9kZTogXCJzZXJ2ZXJcIixcblxuXHRxdWVyeVBhcmFtczoge1xuXHRcdHBhZ2VTaXplOiBcInBhZ2VTaXplXCIsXG5cdFx0c29ydEtleTogXCJzb3J0QnlcIixcblx0fSxcblxuXHRwYXJzZVN0YXRlOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0cmV0dXJuIHsgdG90YWxSZWNvcmRzOiByZXNwLnRvdGFsIH07XG5cdH0sXG5cblx0cGFyc2VSZWNvcmRzOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0cmV0dXJuIHJlc3Aucm93cztcblx0fSxcbn0pO1xuXG5QYWdlLmdyb3VwcyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwicmVwb3J0IGdyb3Vwc1wiLFxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9yZXBvcnRzLm51bmpcIikuZ3JvdXBzLFxuXG5cdHVpOiB7XG5cdFx0Y291bnRlcjogXCIub3BzLWJhciAuY291bnRlclwiLFxuXHRcdGZpbHRlcnM6IFwiLm9wcy1iYXIgLmZpbHRlcnNcIixcblx0XHRkb3dubG9hZExpc3Q6IFwiLmRvd25sb2FkTGlzdFwiLFxuXHRcdG9wZXJhdGlvbnM6IFwiLm9wZXJhdGlvbnNcIixcblx0XHRncmlkOiBcImRpdi5ncmlkXCIsXG5cdFx0cGFnaW5nOiBcIi5wYWdpbmdcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5kb3dubG9hZExpc3RcIjogXCJzaG93RG93bmxvYWRzXCIsXG5cdH0sXG5cblx0c2hvd0Rvd25sb2FkczogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0Y29uc3QgbGlzdCA9IG5ldyBTaW1wbGVNZW51KHtcblx0XHRcdGFuY2hvcjogdGhpcy51aS5kb3dubG9hZExpc3QsXG5cdFx0XHRzaWRlOiBcImxlZnRcIixcblx0XHRcdHN0cnVjdHVyZTogW1xuXHRcdFx0XHR7IGNsb3NlT25DbGljazogdHJ1ZSwgZWxlbWVudHM6IFtcblx0XHRcdFx0XHR7IHRleHQ6IFwiRG93bmxvYWQgYXMgQ1NWXCIsIGlkOiBcImJvb2tzXCIgfSxcblx0XHRcdFx0XSB9LFxuXHRcdFx0XSxcblx0XHR9KTtcblx0XHRsaXN0LnNob3coKTtcblxuXHRcdHRoaXMubGlzdGVuVG8obGlzdCwgXCJjbGlja2VkOmJvb2tzXCIsIHRoaXMuZG93bmxvYWRMaXN0LmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdGRvd25sb2FkTGlzdDogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgcGFyYW1zID0gdGhpcy5ncmlkLmZpbHRlci5nZXRTZXJ2ZXJGaWx0ZXJzKCk7XG5cdFx0cGFyYW1zLmZvcm1hdCA9IFwiY3N2XCI7XG5cblx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9yZXBvcnRzL2dyb3Vwc1BlclVzZXI/XCIgKyBxcy5zdHJpbmdpZnkocGFyYW1zKSk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGNvbHVtbnMgPSBbXG5cdFx0XHR7IG5hbWU6IFwidXNlcm5hbWVcIiwgbGFiZWw6IFwiVXNlcm5hbWVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiZmlyc3RuYW1lXCIsIGxhYmVsOiBcIkZpcnN0IE5hbWVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwic3VybmFtZVwiLCBsYWJlbDogXCJTdXJuYW1lXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcInVzZXJHcmFkZVwiLCBsYWJlbDogXCJVc2VyIEdyYWRlXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcInVzZXJUeXBlXCIsIGxhYmVsOiBcIlVzZXIgVHlwZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJjb2RlXCIsIGxhYmVsOiBcIkdyb3VwIENvZGVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwibmFtZVwiLCBsYWJlbDogXCJHcm91cCBOYW1lXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImdyb3VwR3JhZGVcIiwgbGFiZWw6IFwiR3JvdXAgR3JhZGVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiZ3JvdXBUeXBlXCIsIGxhYmVsOiBcIkdyb3VwIFR5cGVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XTtcblxuXHRcdHRoaXMuZ3JpZCA9IG5ldyBTZXJ2ZXJHcmlkKHtcblx0XHRcdGVsOiB0aGlzLnVpLmdyaWQsXG5cdFx0XHRjb2x1bW5zOiBjb2x1bW5zLFxuXHRcdFx0Y29sbGVjdGlvbjogbmV3IEdyb3Vwc19Db2xsZWN0aW9uKCksXG5cdFx0XHRjbGlja2FibGU6IGZhbHNlLFxuXHRcdFx0Y291bnRlcjoge1xuXHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLmNvdW50ZXIsXG5cdFx0XHRcdHRlbXBsYXRlOiBcIlJvd3MgJHN0YXJ0IC0gJGVuZCBvZiAkdG90YWxcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5wYWdpbmcsXG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0Y29uc3QgdGV4dEZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwidGV4dFwiLFxuXHRcdFx0bmFtZTogXCJ0ZXh0RmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJUZXh0IFNlYXJjaFwiLFxuXHRcdFx0ZGVib3VuY2U6IDIwMCxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgbGFuZ3VhZ2VGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcImxhbmd1YWdlRmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJMYW5ndWFnZVwiLFxuXHRcdFx0Y2F0ZWdvcmllczogW1xuXHRcdFx0XHR7IGl0ZW1zOiBzZXR0aW5ncy5sYW5ndWFnZUxpc3QgfSxcblx0XHRcdF0sXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdGNvbnN0IHN1YmplY3RGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcInN1YmplY3RGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlN1YmplY3RcIixcblx0XHRcdHNlcnZlcjoge1xuXHRcdFx0XHRrZXk6IFwic3ViamVjdF9pZFwiLFxuXHRcdFx0XHR2YWx1ZTogXCJzdWJqZWN0XCIsXG5cdFx0XHRcdGZldGNoOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9kYXRhL3N1YmplY3RzXCIsXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdHBhZ2VTaXplOiAzMCxcblx0XHRcdFx0aW5maW5pdGU6IHRydWUsXG5cdFx0XHR9LFxuXHRcdH07XG5cblx0XHRjb25zdCBncmFkZUZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiaXRlbWl6ZWRcIixcblx0XHRcdG5hbWU6IFwiZ3JhZGVGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlllYXIgb2YgU3R1ZHlcIixcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHRcdGNhdGVnb3JpZXM6IF8ubWFwKHNldHRpbmdzLmdyYWRlTGlzdCwgKHZhbCwga2V5KSA9PiAoe1xuXHRcdFx0XHRsYWJlbDoga2V5LFxuXHRcdFx0XHRpdGVtczogXy5yZWR1Y2UodmFsLnNvcnQoKGEsIGIpID0+IChcImxleGljYWxcIiBpbiBhID8gYS5sZXhpY2FsIDogYS5uYW1lKS50b1VwcGVyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoKFwibGV4aWNhbFwiIGluIGIgPyBiLmxleGljYWwgOiBiLm5hbWUpLnRvVXBwZXJDYXNlKCkpKSxcblx0XHRcdFx0XHQoc3VtLCBudW0pID0+IHsgc3VtLnB1c2goeyBuYW1lOiBudW0udmFsdWUsIGxhYmVsOiBudW0ubmFtZSB9KTsgcmV0dXJuIHN1bTsgfSwgW10pLFxuXHRcdFx0fSkpLFxuXHRcdH07XG5cblx0XHRjb25zdCB5ZWFyRmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJ5ZWFyRmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJZZWFyXCIsXG5cdFx0XHRjYXRlZ29yaWVzOiBbXG5cdFx0XHRcdHsgaXRlbXM6IF8ucmFuZ2UoMjAxNCwgbW9tZW50KCkueWVhcigpICsgMikgfSxcblx0XHRcdF0sXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdGNvbnN0IHJvbGVzRmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJyb2xlc0ZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiUm9sZXNcIixcblx0XHRcdGNhdGVnb3JpZXM6IFt7XG5cdFx0XHRcdGl0ZW1zOiBfLmZyb21QYWlycyhfLmNvbXBhY3QoXy5tYXAoc2V0dGluZ3Mucm9sZXMsICh2YWwsIGtleSkgPT4ge1xuXHRcdFx0XHRcdGlmIChrZXkgPT09IFwiKlwiKVxuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdHJldHVybiBba2V5LCB2YWwubmFtZV07XG5cdFx0XHRcdH0pKSksXG5cdFx0XHR9XSxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgZmlsdGVyTGlzdCA9IFt0ZXh0RmlsdGVyLCBsYW5ndWFnZUZpbHRlciwgc3ViamVjdEZpbHRlciwgZ3JhZGVGaWx0ZXIsIHllYXJGaWx0ZXIsIHJvbGVzRmlsdGVyXTtcblxuXHRcdHRoaXMudWkuZmlsdGVycy5wcmVwZW5kKHRoaXMuZ3JpZC5maWx0ZXIoeyBmaWx0ZXJDb250YWluZXI6IHRoaXMudWkuZmlsdGVycywgZmlsdGVyczogZmlsdGVyTGlzdCwgZGVmYXVsdEZpbHRlcnM6IFtcInRleHRGaWx0ZXJcIl0gfSkucmVuZGVyKCkuZWwpO1xuXHR9LFxufSk7XG5cblxuLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXG5cblxuY29uc3QgUmVzb3VyY2VzQ3JlYXRlZF9Nb2RlbCA9IEJhY2tib25lLkVwb3h5Lk1vZGVsLmV4dGVuZCh7XG59KTtcblxuY29uc3QgUmVzb3VyY2VzQ3JlYXRlZF9Db2xsZWN0aW9uID0gQmFja2JvbmUuUGFnZWFibGVDb2xsZWN0aW9uLmV4dGVuZCh7XG5cdG1vZGVsOiBSZXNvdXJjZXNDcmVhdGVkX01vZGVsLFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3JlcG9ydHMvcmVzb3VyY2VzQ3JlYXRlZD9wYWdlZD10cnVlXCI7XG5cdH0sXG5cblx0c3RhdGU6IHtcblx0XHRwYWdlU2l6ZTogMzAsXG5cdH0sXG5cdG1vZGU6IFwic2VydmVyXCIsXG5cblx0cXVlcnlQYXJhbXM6IHtcblx0XHRwYWdlU2l6ZTogXCJwYWdlU2l6ZVwiLFxuXHRcdHNvcnRLZXk6IFwic29ydEJ5XCIsXG5cdH0sXG5cblx0cGFyc2VTdGF0ZTogZnVuY3Rpb24ocmVzcCkge1xuXHRcdHJldHVybiB7IHRvdGFsUmVjb3JkczogcmVzcC50b3RhbCB9O1xuXHR9LFxuXG5cdHBhcnNlUmVjb3JkczogZnVuY3Rpb24ocmVzcCkge1xuXHRcdHJldHVybiByZXNwLnJvd3M7XG5cdH0sXG59KTtcblxuUGFnZS5yZXNvdXJjZXNDcmVhdGVkID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJyZXBvcnQgZ3JvdXBzXCIsXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL3JlcG9ydHMubnVualwiKS5yZXNvdXJjZXNDcmVhdGVkLFxuXG5cdHVpOiB7XG5cdFx0Y291bnRlcjogXCIub3BzLWJhciAuY291bnRlclwiLFxuXHRcdGZpbHRlcnM6IFwiLm9wcy1iYXIgLmZpbHRlcnNcIixcblx0XHRkb3dubG9hZExpc3Q6IFwiLmRvd25sb2FkTGlzdFwiLFxuXHRcdG9wZXJhdGlvbnM6IFwiLm9wZXJhdGlvbnNcIixcblx0XHRwYWdpbmc6IFwiLnBhZ2luZ1wiLFxuXG5cdFx0dG90YWw6IFwiLmhlYWRlciAudGl0bGUgLnRvdGFsXCIsXG5cdFx0Z3JpZDogXCJkaXYuZ3JpZFwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmRvd25sb2FkTGlzdFwiOiBcInNob3dEb3dubG9hZHNcIixcblx0fSxcblxuXHRzaG93RG93bmxvYWRzOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRjb25zdCBsaXN0ID0gbmV3IFNpbXBsZU1lbnUoe1xuXHRcdFx0YW5jaG9yOiB0aGlzLnVpLmRvd25sb2FkTGlzdCxcblx0XHRcdHNpZGU6IFwibGVmdFwiLFxuXHRcdFx0c3RydWN0dXJlOiBbXG5cdFx0XHRcdHsgY2xvc2VPbkNsaWNrOiB0cnVlLCBlbGVtZW50czogW1xuXHRcdFx0XHRcdHsgdGV4dDogXCJEb3dubG9hZCBhcyBDU1ZcIiwgaWQ6IFwiYm9va3NcIiB9LFxuXHRcdFx0XHRdIH0sXG5cdFx0XHRdLFxuXHRcdH0pO1xuXHRcdGxpc3Quc2hvdygpO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhsaXN0LCBcImNsaWNrZWQ6Ym9va3NcIiwgdGhpcy5kb3dubG9hZExpc3QuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0ZG93bmxvYWRMaXN0OiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBwYXJhbXMgPSB0aGlzLmdyaWQuZmlsdGVyLmdldFNlcnZlckZpbHRlcnMoKTtcblx0XHRwYXJhbXMuZm9ybWF0ID0gXCJjc3ZcIjtcblxuXHRcdHdpbmRvdy5vcGVuKHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3JlcG9ydHMvcmVzb3VyY2VzQ3JlYXRlZD9cIiArIHFzLnN0cmluZ2lmeShwYXJhbXMpKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgY29sdW1ucyA9IFtcblx0XHRcdHsgbmFtZTogXCJ1c2VybmFtZVwiLCBsYWJlbDogXCJVc2VybmFtZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJmaXJzdG5hbWVcIiwgbGFiZWw6IFwiRmlyc3QgTmFtZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJzdXJuYW1lXCIsIGxhYmVsOiBcIlN1cm5hbWVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwidHlwZVwiLCBsYWJlbDogXCJUeXBlXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImNyZWF0ZWRcIiwgbGFiZWw6IFwiQ3JlYXRlZFwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRdO1xuXG5cdFx0dGhpcy5ncmlkID0gbmV3IFNlcnZlckdyaWQoe1xuXHRcdFx0ZWw6IHRoaXMudWkuZ3JpZCxcblx0XHRcdGNvbHVtbnM6IGNvbHVtbnMsXG5cdFx0XHRjb2xsZWN0aW9uOiBuZXcgUmVzb3VyY2VzQ3JlYXRlZF9Db2xsZWN0aW9uKCksXG5cdFx0XHRjbGlja2FibGU6IGZhbHNlLFxuXHRcdFx0d2FpdEZvckZpbHRlcnM6IHRydWUsXG5cdFx0XHRjb3VudGVyOiB7XG5cdFx0XHRcdGVsZW1lbnQ6IHRoaXMudWkuY291bnRlcixcblx0XHRcdFx0dGVtcGxhdGU6IFwiUm93cyAkc3RhcnQgLSAkZW5kIG9mICR0b3RhbFwiLFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLnBhZ2luZyxcblx0XHRcdH0sXG5cdFx0fSk7XG5cblx0XHRjb25zdCBzZWFyY2hGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcInRleHRcIixcblx0XHRcdG5hbWU6IFwidGV4dEZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiVGV4dCBTZWFyY2hcIixcblx0XHRcdGRlYm91bmNlOiAyMDAsXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdGNvbnN0IHN0YXJ0RmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJkYXRlXCIsXG5cdFx0XHRuYW1lOiBcInN0YXJ0XCIsXG5cdFx0XHRsYWJlbDogXCJTaW5jZVwiLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdFx0aW5pdGlhbFZhbHVlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIFtBcHAuY3VycmVudFllYXIoeyB1bml4OiB0cnVlIH0pXTtcblx0XHRcdH0sXG5cdFx0fTtcblxuXHRcdGNvbnN0IGVuZEZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiZGF0ZVwiLFxuXHRcdFx0bmFtZTogXCJlbmRcIixcblx0XHRcdGxhYmVsOiBcIlVudGlsXCIsXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0XHRpbml0aWFsVmFsdWU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gW21vbWVudCgpLnVuaXgoKV07XG5cdFx0XHR9LFxuXHRcdH07XG5cblx0XHRjb25zdCBmaWx0ZXJMaXN0ID0gW3NlYXJjaEZpbHRlciwgc3RhcnRGaWx0ZXIsIGVuZEZpbHRlcl07XG5cblx0XHR0aGlzLmZpbHRlciA9IHRoaXMuZ3JpZC5maWx0ZXIoeyBmaWx0ZXJDb250YWluZXI6IHRoaXMudWkuZmlsdGVycywgZmlsdGVyczogZmlsdGVyTGlzdCwgZGVmYXVsdEZpbHRlcnM6IFtcInRleHRGaWx0ZXJcIiwgXCJzdGFydFwiLCBcImVuZFwiXSB9KTtcblx0XHR0aGlzLnVpLmZpbHRlcnMucHJlcGVuZCh0aGlzLmZpbHRlci5yZW5kZXIoKS5lbCk7XG5cdH0sXG59KTtcblxuXG5cbi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19cblxuXG5jb25zdCBBcHBWZXJzaW9uc19Nb2RlbCA9IEJhY2tib25lLkVwb3h5Lk1vZGVsLmV4dGVuZCh7XG59KTtcblxuY29uc3QgQXBwVmVyc2lvbnNfQ29sbGVjdGlvbiA9IEJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IEFwcFZlcnNpb25zX01vZGVsLFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3JlcG9ydHMvYXBwVmVyc2lvbnNcIjtcblx0fSxcbn0pO1xuXG5QYWdlLmFwcFZlcnNpb25zID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJyZXBvcnQgYXBwLXZlcnNpb25zXCIsXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL3JlcG9ydHMubnVualwiKS5hcHBWZXJzaW9ucyxcblxuXHR1aToge1xuXHRcdGNvdW50ZXI6IFwiLm9wcy1iYXIgLmNvdW50ZXJcIixcblx0XHRmaWx0ZXJzOiBcIi5vcHMtYmFyIC5maWx0ZXJzXCIsXG5cdFx0ZG93bmxvYWRMaXN0OiBcIi5kb3dubG9hZExpc3RcIixcblx0XHRvcGVyYXRpb25zOiBcIi5vcGVyYXRpb25zXCIsXG5cdFx0cGFnaW5nOiBcIi5wYWdpbmdcIixcblx0XHRncmlkOiBcImRpdi5ncmlkXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkuZG93bmxvYWRMaXN0XCI6IFwic2hvd0Rvd25sb2Fkc1wiLFxuXHR9LFxuXG5cdHNob3dEb3dubG9hZHM6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGNvbnN0IGxpc3QgPSBuZXcgU2ltcGxlTWVudSh7XG5cdFx0XHRhbmNob3I6IHRoaXMudWkuZG93bmxvYWRMaXN0LFxuXHRcdFx0c2lkZTogXCJsZWZ0XCIsXG5cdFx0XHRzdHJ1Y3R1cmU6IFtcblx0XHRcdFx0eyBjbG9zZU9uQ2xpY2s6IHRydWUsIGVsZW1lbnRzOiBbXG5cdFx0XHRcdFx0eyB0ZXh0OiBcIkRvd25sb2FkIGFzIENTVlwiLCBpZDogXCJib29rc1wiIH0sXG5cdFx0XHRcdF0gfSxcblx0XHRcdF0sXG5cdFx0fSk7XG5cdFx0bGlzdC5zaG93KCk7XG5cblx0XHR0aGlzLmxpc3RlblRvKGxpc3QsIFwiY2xpY2tlZDpib29rc1wiLCB0aGlzLmRvd25sb2FkTGlzdC5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRkb3dubG9hZExpc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHdpbmRvdy5vcGVuKHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3JlcG9ydHMvYXBwVmVyc2lvbnM/Zm9ybWF0PWNzdlwiKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgY29sdW1ucyA9IFtcblx0XHRcdHsgbmFtZTogXCJ1c2VybmFtZVwiLCBsYWJlbDogXCJVc2VybmFtZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJmaXJzdG5hbWVcIiwgbGFiZWw6IFwiRmlyc3QgTmFtZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJzdXJuYW1lXCIsIGxhYmVsOiBcIlN1cm5hbWVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiZ3JhZGVcIiwgbGFiZWw6IFwiR3JhZGVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwicm9sZXNcIiwgbGFiZWw6IFwiUm9sZXNcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwicGxhdGZvcm1cIiwgbGFiZWw6IFwiUGxhdGZvcm1cIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwidmVyc2lvblwiLCBsYWJlbDogXCJWZXJzaW9uXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcInRpbWVzdGFtcFwiLCBsYWJlbDogXCJMYXN0IFNlZW5cIiwgY2VsbDogR3JpZC5Nb21lbnRDZWxsLmV4dGVuZCh7XG5cdFx0XHRcdG1vZGVsSW5Vbml4VGltZXN0YW1wOiB0cnVlLFxuXHRcdFx0XHRkaXNwbGF5Rm9ybWF0OiBcIkREIE1NTSBZWVlZLCBISDptbSBhXCIsXG5cdFx0XHRcdGRpc3BsYXlJblVUQzogZmFsc2UsXG5cdFx0XHR9KSB9LFxuXHRcdF07XG5cblx0XHR0aGlzLmdyaWQgPSBuZXcgR3JpZCh7XG5cdFx0XHRlbDogdGhpcy51aS5ncmlkLFxuXHRcdFx0Y29sdW1uczogY29sdW1ucyxcblx0XHRcdGNvbGxlY3Rpb246IG5ldyBBcHBWZXJzaW9uc19Db2xsZWN0aW9uKCksXG5cdFx0XHRjbGlja2FibGU6IGZhbHNlLFxuXHRcdFx0Y291bnRlcjoge1xuXHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLmNvdW50ZXIsXG5cdFx0XHRcdHRlbXBsYXRlOiBcIlJvd3MgJHN0YXJ0IC0gJGVuZCBvZiAkdG90YWxcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5wYWdpbmcsXG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0Y29uc3Qgc2VhcmNoRmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJ0ZXh0XCIsXG5cdFx0XHRuYW1lOiBcInRleHRTZWFyY2hcIixcblx0XHRcdGxhYmVsOiBcIlRleHQgU2VhcmNoXCIsXG5cdFx0XHRkZWJvdW5jZTogMjAwLFxuXHRcdFx0aGFuZGxlcjogZnVuY3Rpb24oc2VsZWN0aW9uLCBtb2RlbCkge1xuXHRcdFx0XHRyZXR1cm4gXy5ldmVyeShzZWxlY3Rpb24sIHMgPT4gXy5zb21lKFtcInVzZXJuYW1lXCIsIFwiZmlyc3RuYW1lXCIsIFwic3VybmFtZVwiXSwgY29sID0+IHtcblx0XHRcdFx0XHRpZiAoIWNvbClcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRsZXQgdmFsID0gbW9kZWwuZ2V0KGNvbCk7XG5cdFx0XHRcdFx0aWYgKCF2YWwpXG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0dmFsID0gdmFsLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0XHRyZXR1cm4gXy5pbmNsdWRlcyh2YWwsIHMpO1xuXHRcdFx0XHR9KSk7XG5cdFx0XHR9LFxuXHRcdH07XG5cblx0XHRjb25zdCBncmFkZUZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiaXRlbWl6ZWRcIixcblx0XHRcdG5hbWU6IFwidXNlckdyYWRlXCIsXG5cdFx0XHRsYWJlbDogXCJZZWFyIG9mIFN0dWR5XCIsXG5cdFx0XHRjYXRlZ29yaWVzOiBfLm1hcChzZXR0aW5ncy5ncmFkZUxpc3QsICh2YWwsIGtleSkgPT4gKHtcblx0XHRcdFx0bGFiZWw6IGtleSxcblx0XHRcdFx0aXRlbXM6IF8ucmVkdWNlKHZhbC5zb3J0KChhLCBiKSA9PiAoXCJsZXhpY2FsXCIgaW4gYSA/IGEubGV4aWNhbCA6IGEubmFtZSkudG9VcHBlckNhc2UoKS5sb2NhbGVDb21wYXJlKChcImxleGljYWxcIiBpbiBiID8gYi5sZXhpY2FsIDogYi5uYW1lKS50b1VwcGVyQ2FzZSgpKSksXG5cdFx0XHRcdFx0KHN1bSwgbnVtKSA9PiB7IHN1bS5wdXNoKHsgbmFtZTogbnVtLnZhbHVlLCBsYWJlbDogbnVtLm5hbWUgfSk7IHJldHVybiBzdW07IH0sIFtdKSxcblx0XHRcdH0pKSxcblx0XHRcdHJlc29sdmVyOiBmdW5jdGlvbihpdGVtKSB7XG5cdFx0XHRcdGZvcihjb25zdCBrZXkgaW4gc2V0dGluZ3MuZ3JhZGVMaXN0KSB7XG5cdFx0XHRcdFx0Y29uc3QgeCA9IF8uZmluZChzZXR0aW5ncy5ncmFkZUxpc3Rba2V5XSwgdmFsID0+IHZhbC52YWx1ZSA9PT0gaXRlbSk7XG5cdFx0XHRcdFx0aWYgKHgpXG5cdFx0XHRcdFx0XHRyZXR1cm4geDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gaXRlbTtcblx0XHRcdH0sXG5cdFx0XHRoYW5kbGVyOiBmdW5jdGlvbihzZWxlY3Rpb24sIG1vZGVsKSB7XG5cdFx0XHRcdGxldCBnID0gbW9kZWwuaGFzKFwiZ3JhZGVcIikgPyBtb2RlbC5nZXQoXCJncmFkZVwiKSA6IC0xO1xuXHRcdFx0XHRpZiAoIV8uaXNBcnJheShnKSlcblx0XHRcdFx0XHRnID0gW2csIHBhcnNlSW50KGcsIDEwKV07XG5cblx0XHRcdFx0cmV0dXJuIF8uc29tZShzZWxlY3Rpb24sIGl0ZW0gPT4gXy5pbmNsdWRlcyhnLCBpdGVtLnZhbHVlKSk7XG5cdFx0XHR9LFxuXHRcdH07XG5cblx0XHRjb25zdCByb2xlc0ZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiaXRlbWl6ZWRcIixcblx0XHRcdG5hbWU6IFwicm9sZXNGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlJvbGVzXCIsXG5cdFx0XHRjYXRlZ29yaWVzOiBbe1xuXHRcdFx0XHRpdGVtczogXy5mcm9tUGFpcnMoXy5jb21wYWN0KF8ubWFwKHNldHRpbmdzLnJvbGVzLCAodmFsLCBrZXkpID0+IHtcblx0XHRcdFx0XHRpZiAoa2V5ID09PSBcIipcIilcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRyZXR1cm4gW2tleSwgdmFsLm5hbWVdO1xuXHRcdFx0XHR9KSkpLFxuXHRcdFx0fV0sXG5cdFx0XHRoYW5kbGVyOiBmdW5jdGlvbihzZWxlY3Rpb24sIG1vZGVsKSB7XG5cdFx0XHRcdHJldHVybiBfLmludGVyc2VjdGlvbihzZWxlY3Rpb24sIF8uaW52b2tlTWFwKG1vZGVsLmdldChcInJvbGVzXCIpLnNwbGl0KFwiLFwiKSwgU3RyaW5nLnByb3RvdHlwZS50b0xvd2VyQ2FzZSkpLmxlbmd0aCA+IDA7XG5cdFx0XHR9LFxuXHRcdH07XG5cblx0XHRjb25zdCBmaWx0ZXJMaXN0ID0gW3NlYXJjaEZpbHRlciwgZ3JhZGVGaWx0ZXIsIHJvbGVzRmlsdGVyXTtcblxuXHRcdHRoaXMudWkuZmlsdGVycy5wcmVwZW5kKHRoaXMuZ3JpZC5maWx0ZXIoeyBmaWx0ZXJDb250YWluZXI6IHRoaXMudWkuZmlsdGVycywgZmlsdGVyczogZmlsdGVyTGlzdCwgZGVmYXVsdEZpbHRlcnM6IFtcInRleHRTZWFyY2hcIiwgXCJ1c2VyR3JhZGVcIiwgXCJyb2xlc0ZpbHRlclwiXSB9KS5yZW5kZXIoKS5lbCk7XG5cdH0sXG59KTtcblxuXG4vL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXG5cblxuY29uc3QgTGF0ZXN0VW5sb2Nrc19Nb2RlbCA9IEJhY2tib25lLkVwb3h5Lk1vZGVsLmV4dGVuZCh7XG5cdGNvbXB1dGVkczoge1xuXHRcdGJvb2tUaXRsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb25zdCBiID0gdGhpcy5nZXQoXCJtZXRhZGF0YVwiKTtcblx0XHRcdHJldHVybiBiID8gYi50aXRsZSA6IFwiXCI7XG5cdFx0fSxcblx0XHRib29rUHVibGlzaGVyOiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbnN0IGIgPSB0aGlzLmdldChcIm1ldGFkYXRhXCIpO1xuXHRcdFx0cmV0dXJuIGIgPyBiLnB1Ymxpc2hlciA6IFwiXCI7XG5cdFx0fSxcblx0XHRib29rU3ViamVjdDogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb25zdCBiID0gdGhpcy5nZXQoXCJtZXRhZGF0YVwiKTtcblx0XHRcdHJldHVybiBiID8gYi5zdWJqZWN0IDogXCJcIjtcblx0XHR9LFxuXHRcdGJvb2tHcmFkZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb25zdCBiID0gdGhpcy5nZXQoXCJtZXRhZGF0YVwiKTtcblx0XHRcdHJldHVybiBiID8gZ3JhZGVNYXAuY29kZVRvSHVtYW5WYWx1ZShiLmdyYWRlKSA6IFwiXCI7XG5cdFx0fSxcblx0fSxcbn0pO1xuXG5jb25zdCBMYXRlc3RVbmxvY2tzX0NvbGxlY3Rpb24gPSBCYWNrYm9uZS5QYWdlYWJsZUNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IExhdGVzdFVubG9ja3NfTW9kZWwsXG5cblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvcmVwb3J0cy9sYXRlc3RVbmxvY2tzP3BhZ2VkPXRydWVcIjtcblx0fSxcblxuXHRzdGF0ZToge1xuXHRcdHBhZ2VTaXplOiAzMCxcblx0fSxcblx0bW9kZTogXCJzZXJ2ZXJcIixcblxuXHRxdWVyeVBhcmFtczoge1xuXHRcdHBhZ2VTaXplOiBcInBhZ2VTaXplXCIsXG5cdFx0c29ydEtleTogXCJzb3J0QnlcIixcblx0fSxcblxuXHRwYXJzZVN0YXRlOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0cmV0dXJuIHsgdG90YWxSZWNvcmRzOiByZXNwLnRvdGFsIH07XG5cdH0sXG5cblx0cGFyc2VSZWNvcmRzOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0cmV0dXJuIHJlc3Aucm93cztcblx0fSxcbn0pO1xuXG5QYWdlLmxhdGVzdFVubG9ja3MgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInJlcG9ydCBsYXRlc3QtdW5sb2Nrc1wiLFxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9yZXBvcnRzLm51bmpcIikubGF0ZXN0VW5sb2NrcyxcblxuXHR1aToge1xuXHRcdGNvdW50ZXI6IFwiLm9wcy1iYXIgLmNvdW50ZXJcIixcblx0XHRmaWx0ZXJzOiBcIi5vcHMtYmFyIC5maWx0ZXJzXCIsXG5cdFx0ZG93bmxvYWRMaXN0OiBcIi5kb3dubG9hZExpc3RcIixcblx0XHRvcGVyYXRpb25zOiBcIi5vcGVyYXRpb25zXCIsXG5cdFx0cGFnaW5nOiBcIi5wYWdpbmdcIixcblx0XHRncmlkOiBcImRpdi5ncmlkXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkuZG93bmxvYWRMaXN0XCI6IFwic2hvd0Rvd25sb2Fkc1wiLFxuXHR9LFxuXG5cdHNob3dEb3dubG9hZHM6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGNvbnN0IGxpc3QgPSBuZXcgU2ltcGxlTWVudSh7XG5cdFx0XHRhbmNob3I6IHRoaXMudWkuZG93bmxvYWRMaXN0LFxuXHRcdFx0c2lkZTogXCJsZWZ0XCIsXG5cdFx0XHRzdHJ1Y3R1cmU6IFtcblx0XHRcdFx0eyBjbG9zZU9uQ2xpY2s6IHRydWUsIGVsZW1lbnRzOiBbXG5cdFx0XHRcdFx0eyB0ZXh0OiBcIkRvd25sb2FkIGFzIENTVlwiLCBpZDogXCJib29rc1wiIH0sXG5cdFx0XHRcdF0gfSxcblx0XHRcdF0sXG5cdFx0fSk7XG5cdFx0bGlzdC5zaG93KCk7XG5cblx0XHR0aGlzLmxpc3RlblRvKGxpc3QsIFwiY2xpY2tlZDpib29rc1wiLCB0aGlzLmRvd25sb2FkTGlzdC5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRkb3dubG9hZExpc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHBhcmFtcyA9IHRoaXMuZ3JpZC5maWx0ZXIuZ2V0U2VydmVyRmlsdGVycygpO1xuXHRcdHBhcmFtcy5mb3JtYXQgPSBcImNzdlwiO1xuXG5cdFx0d2luZG93Lm9wZW4oc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvcmVwb3J0cy9sYXRlc3RVbmxvY2tzP1wiICsgcXMuc3RyaW5naWZ5KHBhcmFtcykpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBjb2x1bW5zID0gW1xuXHRcdFx0eyBuYW1lOiBcInVzZXJuYW1lXCIsIGxhYmVsOiBcIlVzZXJuYW1lXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImJvb2tUaXRsZVwiLCBsYWJlbDogXCJUaXRsZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJib29rUHVibGlzaGVyXCIsIGxhYmVsOiBcIlB1Ymxpc2hlclwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJib29rU3ViamVjdFwiLCBsYWJlbDogXCJTdWJqZWN0XCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImJvb2tHcmFkZVwiLCBsYWJlbDogXCJHcmFkZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJjcmVhdGVkXCIsIGxhYmVsOiBcIkRhdGVcIiwgZWRpdGFibGU6IGZhbHNlLCBjZWxsOiBTZXJ2ZXJHcmlkLk1vbWVudENlbGwuZXh0ZW5kKHtcblx0XHRcdFx0bW9kZWxJblVuaXhUaW1lc3RhbXA6IHRydWUsXG5cdFx0XHRcdGRpc3BsYXlGb3JtYXQ6IFwiREQgTU1NIFlZWVksIEhIOm1tIGFcIixcblx0XHRcdFx0ZGlzcGxheUluVVRDOiBmYWxzZSxcblx0XHRcdH0pIH0sXG5cdFx0XTtcblxuXHRcdHRoaXMuZ3JpZCA9IG5ldyBTZXJ2ZXJHcmlkKHtcblx0XHRcdGVsOiB0aGlzLnVpLmdyaWQsXG5cdFx0XHRjb2x1bW5zOiBjb2x1bW5zLFxuXHRcdFx0Y29sbGVjdGlvbjogbmV3IExhdGVzdFVubG9ja3NfQ29sbGVjdGlvbigpLFxuXHRcdFx0Y2xpY2thYmxlOiBmYWxzZSxcblx0XHRcdHdhaXRGb3JGaWx0ZXJzOiB0cnVlLFxuXHRcdFx0Y291bnRlcjoge1xuXHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLmNvdW50ZXIsXG5cdFx0XHRcdHRlbXBsYXRlOiBcIlJvd3MgJHN0YXJ0IC0gJGVuZCBvZiAkdG90YWxcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5wYWdpbmcsXG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0Y29uc3QgdGV4dEZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwidGV4dFwiLFxuXHRcdFx0bmFtZTogXCJ0ZXh0RmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJUZXh0IFNlYXJjaFwiLFxuXHRcdFx0ZGVib3VuY2U6IDIwMCxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3Qgc3RhcnRGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcImRhdGVUaW1lXCIsXG5cdFx0XHRuYW1lOiBcInN0YXJ0XCIsXG5cdFx0XHRsYWJlbDogXCJTaW5jZVwiLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdFx0aW5pdGlhbFZhbHVlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIFttb21lbnQoKS5zdWJ0cmFjdCgxLCBcIm1vbnRoXCIpLnN0YXJ0T2YoXCJkYXlcIikudW5peCgpXTtcblx0XHRcdH0sXG5cdFx0fTtcblxuXHRcdGNvbnN0IGxhbmd1YWdlRmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJsYW5ndWFnZUZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiTGFuZ3VhZ2VcIixcblx0XHRcdGNhdGVnb3JpZXM6IFtcblx0XHRcdFx0eyBpdGVtczogc2V0dGluZ3MubGFuZ3VhZ2VMaXN0IH0sXG5cdFx0XHRdLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdH07XG5cblx0XHRjb25zdCBzdWJqZWN0RmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJzdWJqZWN0RmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJTdWJqZWN0XCIsXG5cdFx0XHRzZXJ2ZXI6IHtcblx0XHRcdFx0a2V5OiBcInN1YmplY3RfaWRcIixcblx0XHRcdFx0dmFsdWU6IFwic3ViamVjdFwiLFxuXHRcdFx0XHRmZXRjaDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvZGF0YS9zdWJqZWN0c1wiLFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRwYWdlU2l6ZTogMzAsXG5cdFx0XHRcdGluZmluaXRlOiB0cnVlLFxuXHRcdFx0fSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgZ3JhZGVGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcImdyYWRlRmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJZZWFyIG9mIFN0dWR5XCIsXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0XHRjYXRlZ29yaWVzOiBfLm1hcChzZXR0aW5ncy5ncmFkZUxpc3QsICh2YWwsIGtleSkgPT4gKHtcblx0XHRcdFx0bGFiZWw6IGtleSxcblx0XHRcdFx0aXRlbXM6IF8ucmVkdWNlKHZhbC5zb3J0KChhLCBiKSA9PiAoXCJsZXhpY2FsXCIgaW4gYSA/IGEubGV4aWNhbCA6IGEubmFtZSkudG9VcHBlckNhc2UoKS5sb2NhbGVDb21wYXJlKChcImxleGljYWxcIiBpbiBiID8gYi5sZXhpY2FsIDogYi5uYW1lKS50b1VwcGVyQ2FzZSgpKSksXG5cdFx0XHRcdFx0KHN1bSwgbnVtKSA9PiB7IHN1bS5wdXNoKHsgbmFtZTogbnVtLnZhbHVlLCBsYWJlbDogbnVtLm5hbWUgfSk7IHJldHVybiBzdW07IH0sIFtdKSxcblx0XHRcdH0pKSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgZmlsdGVyTGlzdCA9IFt0ZXh0RmlsdGVyLCBzdGFydEZpbHRlciwgbGFuZ3VhZ2VGaWx0ZXIsIHN1YmplY3RGaWx0ZXIsIGdyYWRlRmlsdGVyXTtcblxuXHRcdHRoaXMuZmlsdGVyID0gdGhpcy5ncmlkLmZpbHRlcih7IGZpbHRlckNvbnRhaW5lcjogdGhpcy51aS5maWx0ZXJzLCBmaWx0ZXJzOiBmaWx0ZXJMaXN0LCBkZWZhdWx0RmlsdGVyczogW1widGV4dEZpbHRlclwiLCBcInN0YXJ0XCJdIH0pO1xuXHRcdHRoaXMudWkuZmlsdGVycy5wcmVwZW5kKHRoaXMuZmlsdGVyLnJlbmRlcigpLmVsKTtcblx0fSxcbn0pO1xuXG5cbi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1xuXG5cbmNvbnN0IFN5c3RlbUdyb3Vwc19Nb2RlbCA9IEJhY2tib25lLkVwb3h5Lk1vZGVsLmV4dGVuZCh7XG5cdGNvbXB1dGVkczoge1xuXHRcdGNoYW5nZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXQoXCJhZGRlZFwiKSAmJiAhXy5pbmNsdWRlcyh0aGlzLmdldChcInJlYXNvblwiKSwgXCJkZWxldGVkXCIpID8gXCJBZGRlZFwiIDogXCJSZW1vdmVkXCI7XG5cdFx0fSxcblx0XHR1c2VyTmFtZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAodGhpcy5nZXQoXCJjcmVhdG9yX2lkXCIpID09PSAwKVxuXHRcdFx0XHRyZXR1cm4gXCJTWVNURU1cIjtcblx0XHRcdHJldHVybiB0aGlzLmdldChcInVzZXJcIik7XG5cdFx0fSxcblx0fSxcbn0pO1xuXG5jb25zdCBTeXN0ZW1Hcm91cHNfQ29sbGVjdGlvbiA9IEJhY2tib25lLlBhZ2VhYmxlQ29sbGVjdGlvbi5leHRlbmQoe1xuXHRtb2RlbDogU3lzdGVtR3JvdXBzX01vZGVsLFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3JlcG9ydHMvc3lzdGVtR3JvdXBDaGFuZ2VzP3BhZ2VkPXRydWVcIjtcblx0fSxcblxuXHRzdGF0ZToge1xuXHRcdHBhZ2VTaXplOiAzMCxcblx0fSxcblx0bW9kZTogXCJzZXJ2ZXJcIixcblxuXHRxdWVyeVBhcmFtczoge1xuXHRcdHBhZ2VTaXplOiBcInBhZ2VTaXplXCIsXG5cdFx0c29ydEtleTogXCJzb3J0QnlcIixcblx0fSxcblxuXHRwYXJzZVN0YXRlOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0cmV0dXJuIHsgdG90YWxSZWNvcmRzOiByZXNwLnRvdGFsIH07XG5cdH0sXG5cblx0cGFyc2VSZWNvcmRzOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0cmV0dXJuIHJlc3Aucm93cztcblx0fSxcbn0pO1xuXG5QYWdlLnN5c3RlbUdyb3VwcyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwicmVwb3J0IHVuaXR5LWdyb3Vwc1wiLFxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9yZXBvcnRzLm51bmpcIikuc3lzdGVtR3JvdXBzLFxuXG5cdHVpOiB7XG5cdFx0Y291bnRlcjogXCIub3BzLWJhciAuY291bnRlclwiLFxuXHRcdGZpbHRlcnM6IFwiLm9wcy1iYXIgLmZpbHRlcnNcIixcblx0XHRkb3dubG9hZExpc3Q6IFwiLmRvd25sb2FkTGlzdFwiLFxuXHRcdG9wZXJhdGlvbnM6IFwiLm9wZXJhdGlvbnNcIixcblx0XHRwYWdpbmc6IFwiLnBhZ2luZ1wiLFxuXHRcdGdyaWQ6IFwiZGl2LmdyaWRcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5kb3dubG9hZExpc3RcIjogXCJzaG93RG93bmxvYWRzXCIsXG5cdH0sXG5cblx0c2hvd0Rvd25sb2FkczogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0ZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0Y29uc3QgbGlzdCA9IG5ldyBTaW1wbGVNZW51KHtcblx0XHRcdGFuY2hvcjogdGhpcy51aS5kb3dubG9hZExpc3QsXG5cdFx0XHRzaWRlOiBcImxlZnRcIixcblx0XHRcdHN0cnVjdHVyZTogW1xuXHRcdFx0XHR7IGNsb3NlT25DbGljazogdHJ1ZSwgZWxlbWVudHM6IFtcblx0XHRcdFx0XHR7IHRleHQ6IFwiRG93bmxvYWQgYXMgQ1NWXCIsIGlkOiBcImJvb2tzXCIgfSxcblx0XHRcdFx0XSB9LFxuXHRcdFx0XSxcblx0XHR9KTtcblx0XHRsaXN0LnNob3coKTtcblxuXHRcdHRoaXMubGlzdGVuVG8obGlzdCwgXCJjbGlja2VkOmJvb2tzXCIsIHRoaXMuZG93bmxvYWRMaXN0LmJpbmQodGhpcykpO1xuXHR9LFxuXG5cdGRvd25sb2FkTGlzdDogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgcGFyYW1zID0gdGhpcy5ncmlkLmZpbHRlci5nZXRTZXJ2ZXJGaWx0ZXJzKCk7XG5cdFx0cGFyYW1zLmZvcm1hdCA9IFwiY3N2XCI7XG5cblx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9yZXBvcnRzL3N5c3RlbUdyb3VwQ2hhbmdlcz9cIiArIHFzLnN0cmluZ2lmeShwYXJhbXMpKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgY29sdW1ucyA9IFtcblx0XHRcdHsgbmFtZTogXCJjb2RlXCIsIGxhYmVsOiBcIkNvZGVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwibmFtZVwiLCBsYWJlbDogXCJHcm91cCBOYW1lXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcInVzZXJOYW1lXCIsIGxhYmVsOiBcIlVzZXJcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiaW1wZXJzb25hdG9yXCIsIGxhYmVsOiBcIkltcGVyc29uYXRvclwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJjaGFuZ2VcIiwgbGFiZWw6IFwiQWN0aW9uXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcInJlYXNvblwiLCBsYWJlbDogXCJSZWFzb25cIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiY3JlYXRlZFwiLCBsYWJlbDogXCJEYXRlXCIsIGVkaXRhYmxlOiBmYWxzZSwgY2VsbDogR3JpZC5Nb21lbnRDZWxsLmV4dGVuZCh7XG5cdFx0XHRcdG1vZGVsSW5Vbml4VGltZXN0YW1wOiB0cnVlLFxuXHRcdFx0XHRkaXNwbGF5Rm9ybWF0OiBcIkREIE1NTSBZWVlZLCBISDptbSBhXCIsXG5cdFx0XHRcdGRpc3BsYXlJblVUQzogZmFsc2UsXG5cdFx0XHR9KSB9LFxuXHRcdF07XG5cblx0XHR0aGlzLmdyaWQgPSBuZXcgU2VydmVyR3JpZCh7XG5cdFx0XHRlbDogdGhpcy51aS5ncmlkLFxuXHRcdFx0Y29sdW1uczogY29sdW1ucyxcblx0XHRcdGNvbGxlY3Rpb246IG5ldyBTeXN0ZW1Hcm91cHNfQ29sbGVjdGlvbigpLFxuXHRcdFx0Y2xpY2thYmxlOiBmYWxzZSxcblx0XHRcdHdhaXRGb3JGaWx0ZXJzOiB0cnVlLFxuXHRcdFx0Y291bnRlcjoge1xuXHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLmNvdW50ZXIsXG5cdFx0XHRcdHRlbXBsYXRlOiBcIlJvd3MgJHN0YXJ0IC0gJGVuZCBvZiAkdG90YWxcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5wYWdpbmcsXG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0Y29uc3QgdGV4dEZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwidGV4dFwiLFxuXHRcdFx0bmFtZTogXCJ0ZXh0RmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJUZXh0IFNlYXJjaFwiLFxuXHRcdFx0ZGVib3VuY2U6IDIwMCxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3Qgc3RhcnRGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcImRhdGVUaW1lXCIsXG5cdFx0XHRuYW1lOiBcInN0YXJ0XCIsXG5cdFx0XHRsYWJlbDogXCJTaW5jZVwiLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdFx0aW5pdGlhbFZhbHVlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIFttb21lbnQoKS5zdWJ0cmFjdCgxLCBcIm1vbnRoXCIpLnN0YXJ0T2YoXCJkYXlcIikudW5peCgpXTtcblx0XHRcdH0sXG5cdFx0fTtcblxuXHRcdGNvbnN0IGZpbHRlckxpc3QgPSBbdGV4dEZpbHRlciwgc3RhcnRGaWx0ZXJdO1xuXG5cdFx0dGhpcy5maWx0ZXIgPSB0aGlzLmdyaWQuZmlsdGVyKHsgZmlsdGVyQ29udGFpbmVyOiB0aGlzLnVpLmZpbHRlcnMsIGZpbHRlcnM6IGZpbHRlckxpc3QsIGRlZmF1bHRGaWx0ZXJzOiBbXCJ0ZXh0RmlsdGVyXCIsIFwic3RhcnRcIl0gfSk7XG5cdFx0dGhpcy51aS5maWx0ZXJzLnByZXBlbmQodGhpcy5maWx0ZXIucmVuZGVyKCkuZWwpO1xuXHR9LFxufSk7XG5cblxuLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXG5cblxuY29uc3QgVXNlckdyb3Vwc19Nb2RlbCA9IEJhY2tib25lLkVwb3h5Lk1vZGVsLmV4dGVuZCh7XG5cdGNvbXB1dGVkczoge1xuXHRcdHVzZXJOYW1lOiBmdW5jdGlvbigpIHtcblx0XHRcdGlmICh0aGlzLmdldChcImNyZWF0b3JfaWRcIikgPT09IDApXG5cdFx0XHRcdHJldHVybiBcIlNZU1RFTVwiO1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0KFwidXNlclwiKTtcblx0XHR9LFxuXHRcdGNoYW5nZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXQoXCJhZGRlZFwiKSA/IFwiQWRkZWRcIiA6IFwiUmVtb3ZlZFwiO1xuXHRcdH0sXG5cdH0sXG59KTtcblxuY29uc3QgVXNlckdyb3Vwc19Db2xsZWN0aW9uID0gQmFja2JvbmUuUGFnZWFibGVDb2xsZWN0aW9uLmV4dGVuZCh7XG5cdG1vZGVsOiBVc2VyR3JvdXBzX01vZGVsLFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3JlcG9ydHMvdXNlckdyb3VwQ2hhbmdlcz9wYWdlZD10cnVlXCI7XG5cdH0sXG5cblx0c3RhdGU6IHtcblx0XHRwYWdlU2l6ZTogMzAsXG5cdH0sXG5cdG1vZGU6IFwic2VydmVyXCIsXG5cblx0cXVlcnlQYXJhbXM6IHtcblx0XHRwYWdlU2l6ZTogXCJwYWdlU2l6ZVwiLFxuXHRcdHNvcnRLZXk6IFwic29ydEJ5XCIsXG5cdH0sXG5cblx0cGFyc2VTdGF0ZTogZnVuY3Rpb24ocmVzcCkge1xuXHRcdHJldHVybiB7IHRvdGFsUmVjb3JkczogcmVzcC50b3RhbCB9O1xuXHR9LFxuXG5cdHBhcnNlUmVjb3JkczogZnVuY3Rpb24ocmVzcCkge1xuXHRcdHJldHVybiByZXNwLnJvd3M7XG5cdH0sXG59KTtcblxuUGFnZS51c2VyR3JvdXBzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJyZXBvcnQgdXNlci1ncm91cHNcIixcblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvcmVwb3J0cy5udW5qXCIpLnVzZXJHcm91cHMsXG5cblx0dWk6IHtcblx0XHRjb3VudGVyOiBcIi5vcHMtYmFyIC5jb3VudGVyXCIsXG5cdFx0ZmlsdGVyczogXCIub3BzLWJhciAuZmlsdGVyc1wiLFxuXHRcdGRvd25sb2FkTGlzdDogXCIuZG93bmxvYWRMaXN0XCIsXG5cdFx0b3BlcmF0aW9uczogXCIub3BlcmF0aW9uc1wiLFxuXHRcdHBhZ2luZzogXCIucGFnaW5nXCIsXG5cdFx0Z3JpZDogXCJkaXYuZ3JpZFwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmRvd25sb2FkTGlzdFwiOiBcInNob3dEb3dubG9hZHNcIixcblx0fSxcblxuXHRzaG93RG93bmxvYWRzOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRjb25zdCBsaXN0ID0gbmV3IFNpbXBsZU1lbnUoe1xuXHRcdFx0YW5jaG9yOiB0aGlzLnVpLmRvd25sb2FkTGlzdCxcblx0XHRcdHNpZGU6IFwibGVmdFwiLFxuXHRcdFx0c3RydWN0dXJlOiBbXG5cdFx0XHRcdHsgY2xvc2VPbkNsaWNrOiB0cnVlLCBlbGVtZW50czogW1xuXHRcdFx0XHRcdHsgdGV4dDogXCJEb3dubG9hZCBhcyBDU1ZcIiwgaWQ6IFwiYm9va3NcIiB9LFxuXHRcdFx0XHRdIH0sXG5cdFx0XHRdLFxuXHRcdH0pO1xuXHRcdGxpc3Quc2hvdygpO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhsaXN0LCBcImNsaWNrZWQ6Ym9va3NcIiwgdGhpcy5kb3dubG9hZExpc3QuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0ZG93bmxvYWRMaXN0OiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBwYXJhbXMgPSB0aGlzLmZpbHRlci5nZXRTZXJ2ZXJGaWx0ZXJzKCk7XG5cdFx0cGFyYW1zLmZvcm1hdCA9IFwiY3N2XCI7XG5cblx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9yZXBvcnRzL3VzZXJHcm91cENoYW5nZXM/XCIgKyBxcy5zdHJpbmdpZnkocGFyYW1zKSk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGNvbHVtbnMgPSBbXG5cdFx0XHR7IG5hbWU6IFwiY29kZVwiLCBsYWJlbDogXCJDb2RlXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcIm5hbWVcIiwgbGFiZWw6IFwiR3JvdXAgTmFtZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJ1c2VybmFtZVwiLCBsYWJlbDogXCJVc2VybmFtZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJmaXJzdG5hbWVcIiwgbGFiZWw6IFwiRmlyc3QgTmFtZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJzdXJuYW1lXCIsIGxhYmVsOiBcIlN1cm5hbWVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwidXNlck5hbWVcIiwgbGFiZWw6IFwiQ2hhbmdlZCBCeVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJpbXBlcnNvbmF0b3JcIiwgbGFiZWw6IFwiSW1wZXJzb25hdG9yXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImNoYW5nZVwiLCBsYWJlbDogXCJBY3Rpb25cIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwicmVhc29uXCIsIGxhYmVsOiBcIlJlYXNvblwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJjcmVhdGVkXCIsIGxhYmVsOiBcIkRhdGVcIiwgZWRpdGFibGU6IGZhbHNlLCBjZWxsOiBHcmlkLk1vbWVudENlbGwuZXh0ZW5kKHtcblx0XHRcdFx0bW9kZWxJblVuaXhUaW1lc3RhbXA6IHRydWUsXG5cdFx0XHRcdGRpc3BsYXlGb3JtYXQ6IFwiREQgTU1NIFlZWVksIEhIOm1tIGFcIixcblx0XHRcdFx0ZGlzcGxheUluVVRDOiBmYWxzZSxcblx0XHRcdH0pIH0sXG5cdFx0XTtcblxuXHRcdHRoaXMuZ3JpZCA9IG5ldyBTZXJ2ZXJHcmlkKHtcblx0XHRcdGVsOiB0aGlzLnVpLmdyaWQsXG5cdFx0XHRjb2x1bW5zOiBjb2x1bW5zLFxuXHRcdFx0Y29sbGVjdGlvbjogbmV3IFVzZXJHcm91cHNfQ29sbGVjdGlvbigpLFxuXHRcdFx0Y2xpY2thYmxlOiBmYWxzZSxcblx0XHRcdHdhaXRGb3JGaWx0ZXJzOiB0cnVlLFxuXHRcdFx0Y291bnRlcjoge1xuXHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLmNvdW50ZXIsXG5cdFx0XHRcdHRlbXBsYXRlOiBcIlJvd3MgJHN0YXJ0IC0gJGVuZCBvZiAkdG90YWxcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5wYWdpbmcsXG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0Y29uc3QgdGV4dEZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwidGV4dFwiLFxuXHRcdFx0bmFtZTogXCJ0ZXh0RmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJUZXh0IFNlYXJjaFwiLFxuXHRcdFx0ZGVib3VuY2U6IDIwMCxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgbGFuZ3VhZ2VGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcImxhbmd1YWdlRmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJMYW5ndWFnZVwiLFxuXHRcdFx0Y2F0ZWdvcmllczogW1xuXHRcdFx0XHR7IGl0ZW1zOiBzZXR0aW5ncy5sYW5ndWFnZUxpc3QgfSxcblx0XHRcdF0sXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdGNvbnN0IHN1YmplY3RGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcInN1YmplY3RGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlN1YmplY3RcIixcblx0XHRcdHNlcnZlcjoge1xuXHRcdFx0XHRrZXk6IFwic3ViamVjdF9pZFwiLFxuXHRcdFx0XHR2YWx1ZTogXCJzdWJqZWN0XCIsXG5cdFx0XHRcdGZldGNoOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9kYXRhL3N1YmplY3RzXCIsXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdHBhZ2VTaXplOiAzMCxcblx0XHRcdFx0aW5maW5pdGU6IHRydWUsXG5cdFx0XHR9LFxuXHRcdH07XG5cblx0XHRjb25zdCBncmFkZUZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiaXRlbWl6ZWRcIixcblx0XHRcdG5hbWU6IFwiZ3JhZGVGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlllYXIgb2YgU3R1ZHlcIixcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHRcdGNhdGVnb3JpZXM6IF8ubWFwKHNldHRpbmdzLmdyYWRlTGlzdCwgKHZhbCwga2V5KSA9PiAoe1xuXHRcdFx0XHRsYWJlbDoga2V5LFxuXHRcdFx0XHRpdGVtczogXy5yZWR1Y2UodmFsLnNvcnQoKGEsIGIpID0+IChcImxleGljYWxcIiBpbiBhID8gYS5sZXhpY2FsIDogYS5uYW1lKS50b1VwcGVyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoKFwibGV4aWNhbFwiIGluIGIgPyBiLmxleGljYWwgOiBiLm5hbWUpLnRvVXBwZXJDYXNlKCkpKSxcblx0XHRcdFx0XHQoc3VtLCBudW0pID0+IHsgc3VtLnB1c2goeyBuYW1lOiBudW0udmFsdWUsIGxhYmVsOiBudW0ubmFtZSB9KTsgcmV0dXJuIHN1bTsgfSwgW10pLFxuXHRcdFx0fSkpLFxuXHRcdH07XG5cblx0XHRjb25zdCB5ZWFyRmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJ5ZWFyRmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJZZWFyXCIsXG5cdFx0XHRjYXRlZ29yaWVzOiBbXG5cdFx0XHRcdHsgaXRlbXM6IF8ucmFuZ2UoMjAxNCwgbW9tZW50KCkueWVhcigpICsgMikgfSxcblx0XHRcdF0sXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdGNvbnN0IHN0YXJ0RmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJkYXRlVGltZVwiLFxuXHRcdFx0bmFtZTogXCJzdGFydFwiLFxuXHRcdFx0bGFiZWw6IFwiU2luY2VcIixcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHRcdGluaXRpYWxWYWx1ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBbbW9tZW50KCkuc3VidHJhY3QoMSwgXCJtb250aFwiKS5zdGFydE9mKFwiZGF5XCIpLnVuaXgoKV07XG5cdFx0XHR9LFxuXHRcdH07XG5cblx0XHRjb25zdCBmaWx0ZXJMaXN0ID0gW3RleHRGaWx0ZXIsIHN0YXJ0RmlsdGVyLCBsYW5ndWFnZUZpbHRlciwgc3ViamVjdEZpbHRlciwgZ3JhZGVGaWx0ZXIsIHllYXJGaWx0ZXJdO1xuXG5cdFx0dGhpcy5maWx0ZXIgPSB0aGlzLmdyaWQuZmlsdGVyKHsgZmlsdGVyQ29udGFpbmVyOiB0aGlzLnVpLmZpbHRlcnMsIGZpbHRlcnM6IGZpbHRlckxpc3QsIGRlZmF1bHRGaWx0ZXJzOiBbXCJ0ZXh0RmlsdGVyXCIsIFwic3RhcnRcIl0gfSk7XG5cdFx0dGhpcy51aS5maWx0ZXJzLnByZXBlbmQodGhpcy5maWx0ZXIucmVuZGVyKCkuZWwpO1xuXHR9LFxufSk7XG5cblxuLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXG5cblxuY29uc3QgQm9va0dyb3Vwc19Nb2RlbCA9IEJhY2tib25lLkVwb3h5Lk1vZGVsLmV4dGVuZCh7XG5cdGNvbXB1dGVkczoge1xuXHRcdHVzZXJOYW1lOiBmdW5jdGlvbigpIHtcblx0XHRcdGlmICh0aGlzLmdldChcImNyZWF0b3JfaWRcIikgPT09IDApXG5cdFx0XHRcdHJldHVybiBcIlNZU1RFTVwiO1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0KFwidXNlclwiKTtcblx0XHR9LFxuXHRcdGNoYW5nZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXQoXCJhZGRlZFwiKSA/IFwiQWRkZWRcIiA6IFwiUmVtb3ZlZFwiO1xuXHRcdH0sXG5cdH0sXG59KTtcblxuY29uc3QgQm9va0dyb3Vwc19Db2xsZWN0aW9uID0gQmFja2JvbmUuUGFnZWFibGVDb2xsZWN0aW9uLmV4dGVuZCh7XG5cdG1vZGVsOiBCb29rR3JvdXBzX01vZGVsLFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3JlcG9ydHMvYm9va0dyb3VwQ2hhbmdlcz9wYWdlZD10cnVlXCI7XG5cdH0sXG5cblx0c3RhdGU6IHtcblx0XHRwYWdlU2l6ZTogMzAsXG5cdH0sXG5cdG1vZGU6IFwic2VydmVyXCIsXG5cblx0cXVlcnlQYXJhbXM6IHtcblx0XHRwYWdlU2l6ZTogXCJwYWdlU2l6ZVwiLFxuXHRcdHNvcnRLZXk6IFwic29ydEJ5XCIsXG5cdH0sXG5cblx0cGFyc2VTdGF0ZTogZnVuY3Rpb24ocmVzcCkge1xuXHRcdHJldHVybiB7IHRvdGFsUmVjb3JkczogcmVzcC50b3RhbCB9O1xuXHR9LFxuXG5cdHBhcnNlUmVjb3JkczogZnVuY3Rpb24ocmVzcCkge1xuXHRcdHJldHVybiByZXNwLnJvd3M7XG5cdH0sXG59KTtcblxuUGFnZS5ib29rR3JvdXBzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJyZXBvcnQgYm9vay1ncm91cHNcIixcblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvcmVwb3J0cy5udW5qXCIpLmJvb2tHcm91cHMsXG5cblx0dWk6IHtcblx0XHRjb3VudGVyOiBcIi5vcHMtYmFyIC5jb3VudGVyXCIsXG5cdFx0ZmlsdGVyczogXCIub3BzLWJhciAuZmlsdGVyc1wiLFxuXHRcdGRvd25sb2FkTGlzdDogXCIuZG93bmxvYWRMaXN0XCIsXG5cdFx0b3BlcmF0aW9uczogXCIub3BlcmF0aW9uc1wiLFxuXHRcdHBhZ2luZzogXCIucGFnaW5nXCIsXG5cdFx0Z3JpZDogXCJkaXYuZ3JpZFwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmRvd25sb2FkTGlzdFwiOiBcInNob3dEb3dubG9hZHNcIixcblx0fSxcblxuXHRzaG93RG93bmxvYWRzOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRjb25zdCBsaXN0ID0gbmV3IFNpbXBsZU1lbnUoe1xuXHRcdFx0YW5jaG9yOiB0aGlzLnVpLmRvd25sb2FkTGlzdCxcblx0XHRcdHNpZGU6IFwibGVmdFwiLFxuXHRcdFx0c3RydWN0dXJlOiBbXG5cdFx0XHRcdHsgY2xvc2VPbkNsaWNrOiB0cnVlLCBlbGVtZW50czogW1xuXHRcdFx0XHRcdHsgdGV4dDogXCJEb3dubG9hZCBhcyBDU1ZcIiwgaWQ6IFwiYm9va3NcIiB9LFxuXHRcdFx0XHRdIH0sXG5cdFx0XHRdLFxuXHRcdH0pO1xuXHRcdGxpc3Quc2hvdygpO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhsaXN0LCBcImNsaWNrZWQ6Ym9va3NcIiwgdGhpcy5kb3dubG9hZExpc3QuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0ZG93bmxvYWRMaXN0OiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBwYXJhbXMgPSB0aGlzLmZpbHRlci5nZXRTZXJ2ZXJGaWx0ZXJzKCk7XG5cdFx0cGFyYW1zLmZvcm1hdCA9IFwiY3N2XCI7XG5cblx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9yZXBvcnRzL2Jvb2tHcm91cENoYW5nZXM/XCIgKyBxcy5zdHJpbmdpZnkocGFyYW1zKSk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGNvbHVtbnMgPSBbXG5cdFx0XHR7IG5hbWU6IFwidGl0bGVcIiwgbGFiZWw6IFwiQm9va1wiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJpc2JuXCIsIGxhYmVsOiBcIklTQk5cIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwibmFtZVwiLCBsYWJlbDogXCJHcm91cFwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJ1c2VyTmFtZVwiLCBsYWJlbDogXCJDaGFuZ2VkIEJ5XCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImltcGVyc29uYXRvclwiLCBsYWJlbDogXCJJbXBlcnNvbmF0b3JcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiY2hhbmdlXCIsIGxhYmVsOiBcIkFjdGlvblwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJyZWFzb25cIiwgbGFiZWw6IFwiUmVhc29uXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImNyZWF0ZWRcIiwgbGFiZWw6IFwiRGF0ZVwiLCBlZGl0YWJsZTogZmFsc2UsIGNlbGw6IEdyaWQuTW9tZW50Q2VsbC5leHRlbmQoe1xuXHRcdFx0XHRtb2RlbEluVW5peFRpbWVzdGFtcDogdHJ1ZSxcblx0XHRcdFx0ZGlzcGxheUZvcm1hdDogXCJERCBNTU0gWVlZWSwgSEg6bW0gYVwiLFxuXHRcdFx0XHRkaXNwbGF5SW5VVEM6IGZhbHNlLFxuXHRcdFx0fSkgfSxcblx0XHRdO1xuXG5cdFx0dGhpcy5ncmlkID0gbmV3IFNlcnZlckdyaWQoe1xuXHRcdFx0ZWw6IHRoaXMudWkuZ3JpZCxcblx0XHRcdGNvbHVtbnM6IGNvbHVtbnMsXG5cdFx0XHRjb2xsZWN0aW9uOiBuZXcgQm9va0dyb3Vwc19Db2xsZWN0aW9uKCksXG5cdFx0XHRjbGlja2FibGU6IGZhbHNlLFxuXHRcdFx0d2FpdEZvckZpbHRlcnM6IHRydWUsXG5cdFx0XHRjb3VudGVyOiB7XG5cdFx0XHRcdGVsZW1lbnQ6IHRoaXMudWkuY291bnRlcixcblx0XHRcdFx0dGVtcGxhdGU6IFwiUm93cyAkc3RhcnQgLSAkZW5kIG9mICR0b3RhbFwiLFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLnBhZ2luZyxcblx0XHRcdH0sXG5cdFx0fSk7XG5cblx0XHRjb25zdCB0ZXh0RmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJ0ZXh0XCIsXG5cdFx0XHRuYW1lOiBcInRleHRGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlRleHQgU2VhcmNoXCIsXG5cdFx0XHRkZWJvdW5jZTogMjAwLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdH07XG5cblx0XHRjb25zdCBsYW5ndWFnZUZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiaXRlbWl6ZWRcIixcblx0XHRcdG5hbWU6IFwibGFuZ3VhZ2VGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIkxhbmd1YWdlXCIsXG5cdFx0XHRjYXRlZ29yaWVzOiBbXG5cdFx0XHRcdHsgaXRlbXM6IHNldHRpbmdzLmxhbmd1YWdlTGlzdCB9LFxuXHRcdFx0XSxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3Qgc3ViamVjdEZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiaXRlbWl6ZWRcIixcblx0XHRcdG5hbWU6IFwic3ViamVjdEZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiU3ViamVjdFwiLFxuXHRcdFx0c2VydmVyOiB7XG5cdFx0XHRcdGtleTogXCJzdWJqZWN0X2lkXCIsXG5cdFx0XHRcdHZhbHVlOiBcInN1YmplY3RcIixcblx0XHRcdFx0ZmV0Y2g6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2RhdGEvc3ViamVjdHNcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0cGFnZVNpemU6IDMwLFxuXHRcdFx0XHRpbmZpbml0ZTogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0fTtcblxuXHRcdGNvbnN0IGdyYWRlRmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJncmFkZUZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiWWVhciBvZiBTdHVkeVwiLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdFx0Y2F0ZWdvcmllczogXy5tYXAoc2V0dGluZ3MuZ3JhZGVMaXN0LCAodmFsLCBrZXkpID0+ICh7XG5cdFx0XHRcdGxhYmVsOiBrZXksXG5cdFx0XHRcdGl0ZW1zOiBfLnJlZHVjZSh2YWwuc29ydCgoYSwgYikgPT4gKFwibGV4aWNhbFwiIGluIGEgPyBhLmxleGljYWwgOiBhLm5hbWUpLnRvVXBwZXJDYXNlKCkubG9jYWxlQ29tcGFyZSgoXCJsZXhpY2FsXCIgaW4gYiA/IGIubGV4aWNhbCA6IGIubmFtZSkudG9VcHBlckNhc2UoKSkpLFxuXHRcdFx0XHRcdChzdW0sIG51bSkgPT4geyBzdW0ucHVzaCh7IG5hbWU6IG51bS52YWx1ZSwgbGFiZWw6IG51bS5uYW1lIH0pOyByZXR1cm4gc3VtOyB9LCBbXSksXG5cdFx0XHR9KSksXG5cdFx0fTtcblxuXHRcdGNvbnN0IHllYXJGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcInllYXJGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlllYXJcIixcblx0XHRcdGNhdGVnb3JpZXM6IFtcblx0XHRcdFx0eyBpdGVtczogXy5yYW5nZSgyMDE0LCBtb21lbnQoKS55ZWFyKCkgKyAyKSB9LFxuXHRcdFx0XSxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3Qgc3RhcnRGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcImRhdGVUaW1lXCIsXG5cdFx0XHRuYW1lOiBcInN0YXJ0XCIsXG5cdFx0XHRsYWJlbDogXCJTaW5jZVwiLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdFx0aW5pdGlhbFZhbHVlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIFttb21lbnQoKS5zdWJ0cmFjdCgxLCBcIm1vbnRoXCIpLnN0YXJ0T2YoXCJkYXlcIikudW5peCgpXTtcblx0XHRcdH0sXG5cdFx0fTtcblxuXHRcdGNvbnN0IGZpbHRlckxpc3QgPSBbdGV4dEZpbHRlciwgc3RhcnRGaWx0ZXIsIGxhbmd1YWdlRmlsdGVyLCBzdWJqZWN0RmlsdGVyLCBncmFkZUZpbHRlciwgeWVhckZpbHRlcl07XG5cblx0XHR0aGlzLmZpbHRlciA9IHRoaXMuZ3JpZC5maWx0ZXIoeyBmaWx0ZXJDb250YWluZXI6IHRoaXMudWkuZmlsdGVycywgZmlsdGVyczogZmlsdGVyTGlzdCwgZGVmYXVsdEZpbHRlcnM6IFtcInRleHRGaWx0ZXJcIiwgXCJzdGFydFwiXSB9KTtcblx0XHR0aGlzLnVpLmZpbHRlcnMucHJlcGVuZCh0aGlzLmZpbHRlci5yZW5kZXIoKS5lbCk7XG5cdH0sXG59KTtcblxuXG4vL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLS0tXG5cblxuY29uc3QgVXNlckJvb2tQdXJjaGFzZXNfTW9kZWwgPSBCYWNrYm9uZS5FcG94eS5Nb2RlbC5leHRlbmQoe1xuXHRjb21wdXRlZHM6IHtcblx0XHR1c2VyVHlwZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoXy5pbmNsdWRlcyh0aGlzLmdldChcInJvbGVzXCIpLCBcInN0dWRlbnRcIikpXG5cdFx0XHRcdHJldHVybiBcIlN0dWRlbnRcIjtcblx0XHRcdGlmIChfLmluY2x1ZGVzKHRoaXMuZ2V0KFwicm9sZXNcIiksIFwidGVhY2hlclwiKSlcblx0XHRcdFx0cmV0dXJuIFwiRWR1Y2F0b3JcIjtcblx0XHRcdHJldHVybiBcIk90aGVyXCI7XG5cdFx0fSxcblx0XHR1c2VyR3JhZGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCF0aGlzLmdldChcImdyYWRlXCIpKVxuXHRcdFx0XHRyZXR1cm4gXCItXCI7XG5cblx0XHRcdHJldHVybiBncmFkZU1hcC5jb2RlVG9IdW1hblZhbHVlKHRoaXMuZ2V0KFwiZ3JhZGVcIikpO1xuXHRcdH0sXG5cdFx0Z3JvdXBHcmFkZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIXRoaXMuZ2V0KFwiZ3JvdXBfZ3JhZGVcIikpXG5cdFx0XHRcdHJldHVybiBcIi1cIjtcblxuXHRcdFx0cmV0dXJuIGdyYWRlTWFwLmNvZGVUb0h1bWFuVmFsdWUodGhpcy5nZXQoXCJncm91cF9ncmFkZVwiKSk7XG5cdFx0fSxcblx0XHRncm91cFR5cGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKHRoaXMuZ2V0KFwic3lzdGVtX2dyb3VwXCIpKVxuXHRcdFx0XHRyZXR1cm4gXCJTeXN0ZW0gR3JvdXBcIjtcblx0XHRcdGlmICh0aGlzLmdldChcImdsb2JhbF9ncm91cFwiKSlcblx0XHRcdFx0cmV0dXJuIFwiR2xvYmFsIEdyb3VwXCI7XG5cdFx0XHRyZXR1cm4gXCJDdXN0b20gR3JvdXBcIjtcblx0XHR9LFxuXHR9LFxufSk7XG5cbmNvbnN0IFVzZXJCb29rUHVyY2hhc2VzX0NvbGxlY3Rpb24gPSBCYWNrYm9uZS5QYWdlYWJsZUNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IFVzZXJCb29rUHVyY2hhc2VzX01vZGVsLFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3JlcG9ydHMvbWlzc2luZ1VzZXJCb29rUHVyY2hhc2VzP3BhZ2VkPXRydWVcIjtcblx0fSxcblxuXHRzdGF0ZToge1xuXHRcdHBhZ2VTaXplOiAzMCxcblx0fSxcblx0bW9kZTogXCJzZXJ2ZXJcIixcblxuXHRxdWVyeVBhcmFtczoge1xuXHRcdHBhZ2VTaXplOiBcInBhZ2VTaXplXCIsXG5cdFx0c29ydEtleTogXCJzb3J0QnlcIixcblx0fSxcblxuXHRwYXJzZVN0YXRlOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0cmV0dXJuIHsgdG90YWxSZWNvcmRzOiByZXNwLnRvdGFsIH07XG5cdH0sXG5cblx0cGFyc2VSZWNvcmRzOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0cmV0dXJuIHJlc3Aucm93cztcblx0fSxcbn0pO1xuXG5QYWdlLnVzZXJCb29rUHVyY2hhc2VzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJyZXBvcnQgdXNlci1ib29rLXB1cmNoYXNlc1wiLFxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9yZXBvcnRzLm51bmpcIikudXNlckJvb2tQdXJjaGFzZXMsXG5cblx0dWk6IHtcblx0XHRjb3VudGVyOiBcIi5vcHMtYmFyIC5jb3VudGVyXCIsXG5cdFx0ZmlsdGVyczogXCIub3BzLWJhciAuZmlsdGVyc1wiLFxuXHRcdGRvd25sb2FkTGlzdDogXCIuZG93bmxvYWRMaXN0XCIsXG5cdFx0b3BlcmF0aW9uczogXCIub3BlcmF0aW9uc1wiLFxuXHRcdGdyaWQ6IFwiZGl2LmdyaWRcIixcblx0XHRwYWdpbmc6IFwiLnBhZ2luZ1wiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmRvd25sb2FkTGlzdFwiOiBcInNob3dEb3dubG9hZHNcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIXNldHRpbmdzLmJvb2tUb2tlbk1vZGUpIHtcblx0XHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0ZSwgXCIvXCIpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fSxcblxuXHRzaG93RG93bmxvYWRzOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRjb25zdCBsaXN0ID0gbmV3IFNpbXBsZU1lbnUoe1xuXHRcdFx0YW5jaG9yOiB0aGlzLnVpLmRvd25sb2FkTGlzdCxcblx0XHRcdHNpZGU6IFwibGVmdFwiLFxuXHRcdFx0c3RydWN0dXJlOiBbXG5cdFx0XHRcdHsgY2xvc2VPbkNsaWNrOiB0cnVlLCBlbGVtZW50czogW1xuXHRcdFx0XHRcdHsgdGV4dDogXCJEb3dubG9hZCBhcyBDU1ZcIiwgaWQ6IFwiYm9va3NcIiB9LFxuXHRcdFx0XHRdIH0sXG5cdFx0XHRdLFxuXHRcdH0pO1xuXHRcdGxpc3Quc2hvdygpO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhsaXN0LCBcImNsaWNrZWQ6Ym9va3NcIiwgdGhpcy5kb3dubG9hZExpc3QuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0ZG93bmxvYWRMaXN0OiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBwYXJhbXMgPSB0aGlzLmdyaWQuZmlsdGVyLmdldFNlcnZlckZpbHRlcnMoKTtcblx0XHRwYXJhbXMuZm9ybWF0ID0gXCJjc3ZcIjtcblxuXHRcdHdpbmRvdy5vcGVuKHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3JlcG9ydHMvbWlzc2luZ1VzZXJCb29rUHVyY2hhc2VzP1wiICsgcXMuc3RyaW5naWZ5KHBhcmFtcykpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBjb2x1bW5zID0gW1xuXHRcdFx0eyBuYW1lOiBcInVzZXJuYW1lXCIsIGxhYmVsOiBcIlVzZXJuYW1lXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImZpcnN0bmFtZVwiLCBsYWJlbDogXCJGaXJzdCBOYW1lXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcInN1cm5hbWVcIiwgbGFiZWw6IFwiU3VybmFtZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJ1c2VyR3JhZGVcIiwgbGFiZWw6IFwiVXNlciBHcmFkZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJib29rTmFtZVwiLCBsYWJlbDogXCJCb29rIE5hbWVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiaXNiblwiLCBsYWJlbDogXCJJU0JOXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImdyb3VwTmFtZVwiLCBsYWJlbDogXCJHcm91cCBOYW1lXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcInllYXJcIiwgbGFiZWw6IFwiR3JvdXAgWWVhclwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRdO1xuXG5cdFx0dGhpcy5ncmlkID0gbmV3IFNlcnZlckdyaWQoe1xuXHRcdFx0ZWw6IHRoaXMudWkuZ3JpZCxcblx0XHRcdGNvbHVtbnM6IGNvbHVtbnMsXG5cdFx0XHRjb2xsZWN0aW9uOiBuZXcgVXNlckJvb2tQdXJjaGFzZXNfQ29sbGVjdGlvbigpLFxuXHRcdFx0Y2xpY2thYmxlOiBmYWxzZSxcblx0XHRcdGNvdW50ZXI6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5jb3VudGVyLFxuXHRcdFx0XHR0ZW1wbGF0ZTogXCJSb3dzICRzdGFydCAtICRlbmQgb2YgJHRvdGFsXCIsXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdGVsZW1lbnQ6IHRoaXMudWkucGFnaW5nLFxuXHRcdFx0fSxcblx0XHR9KTtcblxuXHRcdGNvbnN0IHRleHRGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcInRleHRcIixcblx0XHRcdG5hbWU6IFwidGV4dEZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiVGV4dCBTZWFyY2hcIixcblx0XHRcdGRlYm91bmNlOiAyMDAsXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdGNvbnN0IHN1YmplY3RGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcIml0ZW1pemVkXCIsXG5cdFx0XHRuYW1lOiBcInN1YmplY3RGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlN1YmplY3RcIixcblx0XHRcdHNlcnZlcjoge1xuXHRcdFx0XHRrZXk6IFwic3ViamVjdF9pZFwiLFxuXHRcdFx0XHR2YWx1ZTogXCJzdWJqZWN0XCIsXG5cdFx0XHRcdGZldGNoOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9kYXRhL3N1YmplY3RzXCIsXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdHBhZ2VTaXplOiAzMCxcblx0XHRcdFx0aW5maW5pdGU6IHRydWUsXG5cdFx0XHR9LFxuXHRcdH07XG5cblx0XHRjb25zdCBncmFkZUZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiaXRlbWl6ZWRcIixcblx0XHRcdG5hbWU6IFwiZ3JhZGVGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlllYXIgb2YgU3R1ZHlcIixcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHRcdGNhdGVnb3JpZXM6IF8ubWFwKHNldHRpbmdzLmdyYWRlTGlzdCwgKHZhbCwga2V5KSA9PiAoe1xuXHRcdFx0XHRsYWJlbDoga2V5LFxuXHRcdFx0XHRpdGVtczogXy5yZWR1Y2UodmFsLnNvcnQoKGEsIGIpID0+IChcImxleGljYWxcIiBpbiBhID8gYS5sZXhpY2FsIDogYS5uYW1lKS50b1VwcGVyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoKFwibGV4aWNhbFwiIGluIGIgPyBiLmxleGljYWwgOiBiLm5hbWUpLnRvVXBwZXJDYXNlKCkpKSxcblx0XHRcdFx0XHQoc3VtLCBudW0pID0+IHsgc3VtLnB1c2goeyBuYW1lOiBudW0udmFsdWUsIGxhYmVsOiBudW0ubmFtZSB9KTsgcmV0dXJuIHN1bTsgfSwgW10pLFxuXHRcdFx0fSkpLFxuXHRcdH07XG5cblx0XHRjb25zdCB5ZWFyRmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJ5ZWFyRmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJHcm91cCBZZWFyXCIsXG5cdFx0XHRjYXRlZ29yaWVzOiBbXG5cdFx0XHRcdHsgaXRlbXM6IF8ucmFuZ2UoMjAxNCwgbW9tZW50KCkueWVhcigpICsgMikgfSxcblx0XHRcdF0sXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdGNvbnN0IHJvbGVzRmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJyb2xlc0ZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiUm9sZXNcIixcblx0XHRcdGNhdGVnb3JpZXM6IFt7XG5cdFx0XHRcdGl0ZW1zOiBfLmZyb21QYWlycyhfLmNvbXBhY3QoXy5tYXAoc2V0dGluZ3Mucm9sZXMsICh2YWwsIGtleSkgPT4ge1xuXHRcdFx0XHRcdGlmIChrZXkgPT09IFwiKlwiKVxuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdHJldHVybiBba2V5LCB2YWwubmFtZV07XG5cdFx0XHRcdH0pKSksXG5cdFx0XHR9XSxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgZmlsdGVyTGlzdCA9IFt0ZXh0RmlsdGVyLCBzdWJqZWN0RmlsdGVyLCBncmFkZUZpbHRlciwgeWVhckZpbHRlciwgcm9sZXNGaWx0ZXJdO1xuXG5cdFx0dGhpcy51aS5maWx0ZXJzLnByZXBlbmQodGhpcy5ncmlkLmZpbHRlcih7IGZpbHRlckNvbnRhaW5lcjogdGhpcy51aS5maWx0ZXJzLCBmaWx0ZXJzOiBmaWx0ZXJMaXN0LCBkZWZhdWx0RmlsdGVyczogW1widGV4dEZpbHRlclwiLCBcInllYXJGaWx0ZXJcIl0gfSkucmVuZGVyKCkuZWwpO1xuXHR9LFxufSk7XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgTGljZW5zZUNoYW5nZXNfTW9kZWwgPSBCYWNrYm9uZS5FcG94eS5Nb2RlbC5leHRlbmQoe1xuXHRjb21wdXRlZHM6IHtcblx0XHR1c2VyTmFtZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAodGhpcy5nZXQoXCJjcmVhdG9yX2lkXCIpID09PSAwKVxuXHRcdFx0XHRyZXR1cm4gXCJTWVNURU1cIjtcblx0XHRcdHJldHVybiB0aGlzLmdldChcInVzZXJcIik7XG5cdFx0fSxcblx0XHRpbnN0YW5jZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAodGhpcy5nZXQoXCJpbnN0YW5jZV9jb2RlXCIpWzBdID09PSBcIlBcIilcblx0XHRcdFx0cmV0dXJuIG1vbWVudC5kdXJhdGlvbih0aGlzLmdldChcImluc3RhbmNlX2NvZGVcIikpLmZvcm1hdChcInlbeV0gTVttb10gZFtkXSBoW2hdIG1bbV0gc1tzXVwiLCB7IHRyaW06IFwiYm90aFwiIH0pO1xuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0KFwiaW5zdGFuY2VfY29kZVwiKTtcblx0XHR9LFxuXHR9LFxufSk7XG5cblxuY29uc3QgTGljZW5zZUNoYW5nZXNfQ29sbGVjdGlvbiA9IEJhY2tib25lLlBhZ2VhYmxlQ29sbGVjdGlvbi5leHRlbmQoe1xuXHRtb2RlbDogTGljZW5zZUNoYW5nZXNfTW9kZWwsXG5cblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvcmVwb3J0cy9saWNlbnNlQ2hhbmdlcz9wYWdlZD10cnVlXCI7XG5cdH0sXG5cblx0c3RhdGU6IHtcblx0XHRwYWdlU2l6ZTogMzAsXG5cdH0sXG5cdG1vZGU6IFwic2VydmVyXCIsXG5cblx0cXVlcnlQYXJhbXM6IHtcblx0XHRwYWdlU2l6ZTogXCJwYWdlU2l6ZVwiLFxuXHRcdHNvcnRLZXk6IFwic29ydEJ5XCIsXG5cdH0sXG5cblx0cGFyc2VTdGF0ZTogZnVuY3Rpb24ocmVzcCkge1xuXHRcdHJldHVybiB7IHRvdGFsUmVjb3JkczogcmVzcC50b3RhbCB9O1xuXHR9LFxuXG5cdHBhcnNlUmVjb3JkczogZnVuY3Rpb24ocmVzcCkge1xuXHRcdHJldHVybiByZXNwLnJvd3M7XG5cdH0sXG59KTtcblxuUGFnZS5saWNlbnNlQ2hhbmdlcyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwicmVwb3J0IGJvb2stZ3JvdXBzXCIsXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL3JlcG9ydHMubnVualwiKS5saWNlbnNlQ2hhbmdlcyxcblxuXHR1aToge1xuXHRcdGNvdW50ZXI6IFwiLm9wcy1iYXIgLmNvdW50ZXJcIixcblx0XHRmaWx0ZXJzOiBcIi5vcHMtYmFyIC5maWx0ZXJzXCIsXG5cdFx0ZG93bmxvYWRMaXN0OiBcIi5kb3dubG9hZExpc3RcIixcblx0XHRvcGVyYXRpb25zOiBcIi5vcGVyYXRpb25zXCIsXG5cdFx0cGFnaW5nOiBcIi5wYWdpbmdcIixcblx0XHRncmlkOiBcImRpdi5ncmlkXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkuZG93bmxvYWRMaXN0XCI6IFwic2hvd0Rvd25sb2Fkc1wiLFxuXHR9LFxuXG5cdHNob3dEb3dubG9hZHM6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGNvbnN0IGxpc3QgPSBuZXcgU2ltcGxlTWVudSh7XG5cdFx0XHRhbmNob3I6IHRoaXMudWkuZG93bmxvYWRMaXN0LFxuXHRcdFx0c2lkZTogXCJsZWZ0XCIsXG5cdFx0XHRzdHJ1Y3R1cmU6IFtcblx0XHRcdFx0eyBjbG9zZU9uQ2xpY2s6IHRydWUsIGVsZW1lbnRzOiBbXG5cdFx0XHRcdFx0eyB0ZXh0OiBcIkRvd25sb2FkIGFzIENTVlwiLCBpZDogXCJsaWNlbnNlc1wiIH0sXG5cdFx0XHRcdF0gfSxcblx0XHRcdF0sXG5cdFx0fSk7XG5cdFx0bGlzdC5zaG93KCk7XG5cblx0XHR0aGlzLmxpc3RlblRvKGxpc3QsIFwiY2xpY2tlZDpsaWNlbnNlc1wiLCB0aGlzLmRvd25sb2FkTGlzdC5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHRkb3dubG9hZExpc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHBhcmFtcyA9IHRoaXMuZmlsdGVyLmdldFNlcnZlckZpbHRlcnMoKTtcblx0XHRwYXJhbXMuZm9ybWF0ID0gXCJjc3ZcIjtcblxuXHRcdHdpbmRvdy5vcGVuKHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3JlcG9ydHMvbGljZW5zZUNoYW5nZXM/XCIgKyBxcy5zdHJpbmdpZnkocGFyYW1zKSk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGNvbHVtbnMgPSBbXG5cdFx0XHR7IG5hbWU6IFwiaW5zdGFuY2VcIiwgbGFiZWw6IFwiVHJhbmNoZSAvIExpY2Vuc2VcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwidGl0bGVcIiwgbGFiZWw6IFwiQm9vayBUaXRsZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJpc2JuXCIsIGxhYmVsOiBcIkJvb2sgSVNCTlwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJjcmVhdG9yXCIsIGxhYmVsOiBcIkNoYW5nZWQgQnlcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiaW1wZXJzb25hdG9yXCIsIGxhYmVsOiBcIkltcGVyc29uYXRvclwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJ0YXJnZXRfdXNlclwiLCBsYWJlbDogXCJUYXJnZXQgVXNlclwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJncm91cFwiLCBsYWJlbDogXCJHcm91cFwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJhY3Rpb25cIiwgbGFiZWw6IFwiQWN0aW9uXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImNyZWF0ZWRcIiwgbGFiZWw6IFwiRGF0ZVwiLCBlZGl0YWJsZTogZmFsc2UsIGNlbGw6IEdyaWQuTW9tZW50Q2VsbC5leHRlbmQoe1xuXHRcdFx0XHRtb2RlbEluVW5peFRpbWVzdGFtcDogdHJ1ZSxcblx0XHRcdFx0ZGlzcGxheUZvcm1hdDogXCJERCBNTU0gWVlZWSwgSEg6bW0gYVwiLFxuXHRcdFx0XHRkaXNwbGF5SW5VVEM6IGZhbHNlLFxuXHRcdFx0fSkgfSxcblx0XHRdO1xuXG5cdFx0dGhpcy5ncmlkID0gbmV3IFNlcnZlckdyaWQoe1xuXHRcdFx0ZWw6IHRoaXMudWkuZ3JpZCxcblx0XHRcdGNvbHVtbnM6IGNvbHVtbnMsXG5cdFx0XHRjb2xsZWN0aW9uOiBuZXcgTGljZW5zZUNoYW5nZXNfQ29sbGVjdGlvbigpLFxuXHRcdFx0Y2xpY2thYmxlOiBmYWxzZSxcblx0XHRcdHdhaXRGb3JGaWx0ZXJzOiB0cnVlLFxuXHRcdFx0Y291bnRlcjoge1xuXHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLmNvdW50ZXIsXG5cdFx0XHRcdHRlbXBsYXRlOiBcIlJvd3MgJHN0YXJ0IC0gJGVuZCBvZiAkdG90YWxcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5wYWdpbmcsXG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0Y29uc3QgdGV4dEZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwidGV4dFwiLFxuXHRcdFx0bmFtZTogXCJ0ZXh0RmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJUZXh0IFNlYXJjaFwiLFxuXHRcdFx0ZGVib3VuY2U6IDIwMCxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3Qgc3RhcnRGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcImRhdGVUaW1lXCIsXG5cdFx0XHRuYW1lOiBcInN0YXJ0XCIsXG5cdFx0XHRsYWJlbDogXCJTaW5jZVwiLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdFx0aW5pdGlhbFZhbHVlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIFttb21lbnQoKS5zdWJ0cmFjdCgxLCBcIm1vbnRoXCIpLnN0YXJ0T2YoXCJkYXlcIikudW5peCgpXTtcblx0XHRcdH0sXG5cdFx0fTtcblxuXHRcdGNvbnN0IGZpbHRlckxpc3QgPSBbdGV4dEZpbHRlciwgc3RhcnRGaWx0ZXJdO1xuXG5cdFx0dGhpcy5maWx0ZXIgPSB0aGlzLmdyaWQuZmlsdGVyKHsgZmlsdGVyQ29udGFpbmVyOiB0aGlzLnVpLmZpbHRlcnMsIGZpbHRlcnM6IGZpbHRlckxpc3QsIGRlZmF1bHRGaWx0ZXJzOiBbXCJ0ZXh0RmlsdGVyXCIsIFwic3RhcnRcIl0gfSk7XG5cdFx0dGhpcy51aS5maWx0ZXJzLnByZXBlbmQodGhpcy5maWx0ZXIucmVuZGVyKCkuZWwpO1xuXHR9LFxufSk7Il19",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar rester = require(\"rester\");\nvar Backbone = require(\"backbone\");\nvar settings = require(\"app-settings\");\n\nvar BigModal = require(\"../../lib/bigModal\");\nvar ImageChooser = require(\"../../lib/imageChooser\");\nvar App = require(\"../../index\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nmodule.exports = BigModal.extend({\n\tui: {\n\t\ttitle: \"input[name='title']\",\n\t\turl: \"input[name='url']\",\n\t\topenInternally: \"input[name='openInternally']\",\n\t\trestricted: \"input[name='restricted']\",\n\t\trolesLabel: \".roles-label\",\n\t\tcover: \".service-cover-image\"\n\t},\n\n\tevents: {},\n\n\terrorMap: {\n\t\ttitle: {\n\t\t\tattractionElement: \"title\",\n\t\t\tposition: \"right\"\n\t\t},\n\t\turl: {\n\t\t\tattractionElement: \"url\",\n\t\t\tposition: \"right\"\n\t\t}\n\t},\n\n\tinitialize: function initialize() {\n\t\t_.bindAll(this);\n\n\t\tthis.Options = {\n\t\t\ttemplate: require(\"../templates/serviceModal.nunj\").content,\n\t\t\tbuttons: {\n\t\t\t\tcreate: {\n\t\t\t\t\ttype: \"accept\",\n\t\t\t\t\tlabel: \"Create\",\n\t\t\t\t\tmode: \"create\",\n\t\t\t\t\tpermission: this.permissionToCreate.bind(this),\n\t\t\t\t\tsave: true,\n\t\t\t\t\tvalidate: true\n\t\t\t\t},\n\t\t\t\tupdate: {\n\t\t\t\t\ttype: \"accept\",\n\t\t\t\t\tlabel: \"Update\",\n\t\t\t\t\tmode: \"edit\",\n\t\t\t\t\tpermission: this.permissionToUpdate.bind(this),\n\t\t\t\t\tsave: true,\n\t\t\t\t\tvalidate: true\n\t\t\t\t},\n\t\t\t\tcancel: {\n\t\t\t\t\ttype: \"cancel\",\n\t\t\t\t\tlabel: \"Cancel\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tdataNoun: \"learning tool\" + (this.model && this.model.isNew() ? \"\" : \": \" + this.model.get(\"title\")),\n\t\t\tclasses: [\"service-edit-modal\"]\n\t\t};\n\n\t\tthis.ui = _.extend(this.ui, BigModal.prototype.ui);\n\t\tthis.events = _.extend(this.events, BigModal.prototype.events);\n\n\t\tBigModal.prototype.initialize.call(this);\n\t},\n\n\trenderForm: function renderForm() {\n\t\tvar _this = this;\n\n\t\tsetTimeout(function () {\n\t\t\t_this.coverImage = ImageChooser.create($(\".service-cover-image\", _this.el), {\n\t\t\t\ttranscode: true,\n\t\t\t\tmaxHeight: 360,\n\t\t\t\tmaxWidth: 240\n\t\t\t});\n\n\t\t\tif (_this.model.get(\"icon\") && _this.model.get(\"icon\") !== \"default\") _this.coverImage.setImage(settings.urlRoot + _this.model.get(\"icon\"));\n\t\t}, 50);\n\t},\n\n\tpermissionToCreate: function permissionToCreate() {\n\t\treturn rester.hasAccess(rester.p.api.services.post, radio.request(App.Events.Requests.CurrentUser));\n\t},\n\n\tpermissionToUpdate: function permissionToUpdate() {\n\t\treturn rester.hasAccess(rester.p.api.services.put, radio.request(App.Events.Requests.CurrentUser));\n\t},\n\n\tserializeData: function serializeData() {\n\t\treturn this.model.toJSON({ computed: true });\n\t},\n\n\tassembleData: function assembleData() {\n\t\tvar attributes = {\n\t\t\ttitle: this.ui.title.val(),\n\t\t\turl: this.ui.url.val(),\n\t\t\topenInternally: this.ui.openInternally.prop(\"checked\")\n\t\t};\n\n\t\tvar img = this.coverImage && this.coverImage.getImage();\n\t\tif (img && this.coverImage.set && !_.startsWith(img, \"/\")) attributes.cover = img.slice(img.indexOf(\",\") + 1);\n\n\t\treturn {\n\t\t\tattributes: attributes\n\t\t};\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNlcnZpY2VNb2RhbC5qcyJdLCJuYW1lcyI6WyIkIiwicmVxdWlyZSIsIl8iLCJyZXN0ZXIiLCJCYWNrYm9uZSIsInNldHRpbmdzIiwiQmlnTW9kYWwiLCJJbWFnZUNob29zZXIiLCJBcHAiLCJyYWRpbyIsIlJhZGlvIiwiY2hhbm5lbCIsIm1vZHVsZSIsImV4cG9ydHMiLCJleHRlbmQiLCJ1aSIsInRpdGxlIiwidXJsIiwib3BlbkludGVybmFsbHkiLCJyZXN0cmljdGVkIiwicm9sZXNMYWJlbCIsImNvdmVyIiwiZXZlbnRzIiwiZXJyb3JNYXAiLCJhdHRyYWN0aW9uRWxlbWVudCIsInBvc2l0aW9uIiwiaW5pdGlhbGl6ZSIsImJpbmRBbGwiLCJPcHRpb25zIiwidGVtcGxhdGUiLCJjb250ZW50IiwiYnV0dG9ucyIsImNyZWF0ZSIsInR5cGUiLCJsYWJlbCIsIm1vZGUiLCJwZXJtaXNzaW9uIiwicGVybWlzc2lvblRvQ3JlYXRlIiwiYmluZCIsInNhdmUiLCJ2YWxpZGF0ZSIsInVwZGF0ZSIsInBlcm1pc3Npb25Ub1VwZGF0ZSIsImNhbmNlbCIsImRhdGFOb3VuIiwibW9kZWwiLCJpc05ldyIsImdldCIsImNsYXNzZXMiLCJwcm90b3R5cGUiLCJjYWxsIiwicmVuZGVyRm9ybSIsInNldFRpbWVvdXQiLCJjb3ZlckltYWdlIiwiZWwiLCJ0cmFuc2NvZGUiLCJtYXhIZWlnaHQiLCJtYXhXaWR0aCIsInNldEltYWdlIiwidXJsUm9vdCIsImhhc0FjY2VzcyIsInAiLCJhcGkiLCJzZXJ2aWNlcyIsInBvc3QiLCJyZXF1ZXN0IiwiRXZlbnRzIiwiUmVxdWVzdHMiLCJDdXJyZW50VXNlciIsInB1dCIsInNlcmlhbGl6ZURhdGEiLCJ0b0pTT04iLCJjb21wdXRlZCIsImFzc2VtYmxlRGF0YSIsImF0dHJpYnV0ZXMiLCJ2YWwiLCJwcm9wIiwiaW1nIiwiZ2V0SW1hZ2UiLCJzZXQiLCJzdGFydHNXaXRoIiwic2xpY2UiLCJpbmRleE9mIl0sIm1hcHBpbmdzIjoiQUFB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TyxLQUFLeEIsVUFBTCxDQUFnQjBCLEdBQXZCLElBQThCLENBQUM3RSxFQUFFOEUsVUFBRixDQUFhSCxHQUFiLEVBQWtCLEdBQWxCLENBQW5DLEVBQ0NILFdBQVdyRCxLQUFYLEdBQW1Cd0QsSUFBSUksS0FBSixDQUFVSixJQUFJSyxPQUFKLENBQVksR0FBWixJQUFtQixDQUE3QixDQUFuQjs7QUFFRCxTQUFPO0FBQ05SLGVBQVlBO0FBRE4sR0FBUDtBQUdBO0FBbkcrQixDQUFoQixDQUFqQiIsImZpbGUiOiJzZXJ2aWNlTW9kYWwuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCByZXN0ZXIgPSByZXF1aXJlKFwicmVzdGVyXCIpO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IEJpZ01vZGFsID0gcmVxdWlyZShcIi4uLy4uL2xpYi9iaWdNb2RhbFwiKTtcbmNvbnN0IEltYWdlQ2hvb3NlciA9IHJlcXVpcmUoXCIuLi8uLi9saWIvaW1hZ2VDaG9vc2VyXCIpO1xuY29uc3QgQXBwID0gcmVxdWlyZShcIi4uLy4uL2luZGV4XCIpO1xuXG5jb25zdCByYWRpbyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJnbG9iYWxcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmlnTW9kYWwuZXh0ZW5kKHtcblx0dWk6IHtcblx0XHR0aXRsZTogXCJpbnB1dFtuYW1lPSd0aXRsZSddXCIsXG5cdFx0dXJsOiBcImlucHV0W25hbWU9J3VybCddXCIsXG5cdFx0b3BlbkludGVybmFsbHk6IFwiaW5wdXRbbmFtZT0nb3BlbkludGVybmFsbHknXVwiLFxuXHRcdHJlc3RyaWN0ZWQ6IFwiaW5wdXRbbmFtZT0ncmVzdHJpY3RlZCddXCIsXG5cdFx0cm9sZXNMYWJlbDogXCIucm9sZXMtbGFiZWxcIixcblx0XHRjb3ZlcjogXCIuc2VydmljZS1jb3Zlci1pbWFnZVwiLFxuXHR9LFxuXG5cdGV2ZW50czoge30sXG5cblx0ZXJyb3JNYXA6IHtcblx0XHR0aXRsZToge1xuXHRcdFx0YXR0cmFjdGlvbkVsZW1lbnQ6IFwidGl0bGVcIixcblx0XHRcdHBvc2l0aW9uOiBcInJpZ2h0XCIsXG5cdFx0fSxcblx0XHR1cmw6IHtcblx0XHRcdGF0dHJhY3Rpb25FbGVtZW50OiBcInVybFwiLFxuXHRcdFx0cG9zaXRpb246IFwicmlnaHRcIixcblx0XHR9LFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdF8uYmluZEFsbCh0aGlzKTtcblxuXHRcdHRoaXMuT3B0aW9ucyA9IHtcblx0XHRcdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL3NlcnZpY2VNb2RhbC5udW5qXCIpLmNvbnRlbnQsXG5cdFx0XHRidXR0b25zOiB7XG5cdFx0XHRcdGNyZWF0ZToge1xuXHRcdFx0XHRcdHR5cGU6IFwiYWNjZXB0XCIsXG5cdFx0XHRcdFx0bGFiZWw6IFwiQ3JlYXRlXCIsXG5cdFx0XHRcdFx0bW9kZTogXCJjcmVhdGVcIixcblx0XHRcdFx0XHRwZXJtaXNzaW9uOiB0aGlzLnBlcm1pc3Npb25Ub0NyZWF0ZS5iaW5kKHRoaXMpLFxuXHRcdFx0XHRcdHNhdmU6IHRydWUsXG5cdFx0XHRcdFx0dmFsaWRhdGU6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHVwZGF0ZToge1xuXHRcdFx0XHRcdHR5cGU6IFwiYWNjZXB0XCIsXG5cdFx0XHRcdFx0bGFiZWw6IFwiVXBkYXRlXCIsXG5cdFx0XHRcdFx0bW9kZTogXCJlZGl0XCIsXG5cdFx0XHRcdFx0cGVybWlzc2lvbjogdGhpcy5wZXJtaXNzaW9uVG9VcGRhdGUuYmluZCh0aGlzKSxcblx0XHRcdFx0XHRzYXZlOiB0cnVlLFxuXHRcdFx0XHRcdHZhbGlkYXRlOiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRjYW5jZWw6IHtcblx0XHRcdFx0XHR0eXBlOiBcImNhbmNlbFwiLFxuXHRcdFx0XHRcdGxhYmVsOiBcIkNhbmNlbFwiLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHRcdGRhdGFOb3VuOiBcImxlYXJuaW5nIHRvb2xcIiArICh0aGlzLm1vZGVsICYmIHRoaXMubW9kZWwuaXNOZXcoKSA/IFwiXCIgOiBcIjogXCIgKyB0aGlzLm1vZGVsLmdldChcInRpdGxlXCIpKSxcblx0XHRcdGNsYXNzZXM6IFtcInNlcnZpY2UtZWRpdC1tb2RhbFwiXSxcblx0XHR9O1xuXG5cdFx0dGhpcy51aSA9IF8uZXh0ZW5kKHRoaXMudWksIEJpZ01vZGFsLnByb3RvdHlwZS51aSk7XG5cdFx0dGhpcy5ldmVudHMgPSBfLmV4dGVuZCh0aGlzLmV2ZW50cywgQmlnTW9kYWwucHJvdG90eXBlLmV2ZW50cyk7XG5cblx0XHRCaWdNb2RhbC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMpO1xuXHR9LFxuXG5cdHJlbmRlckZvcm06IGZ1bmN0aW9uKCkge1xuXHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0dGhpcy5jb3ZlckltYWdlID0gSW1hZ2VDaG9vc2VyLmNyZWF0ZSgkKFwiLnNlcnZpY2UtY292ZXItaW1hZ2VcIiwgdGhpcy5lbCksIHtcblx0XHRcdFx0dHJhbnNjb2RlOiB0cnVlLFxuXHRcdFx0XHRtYXhIZWlnaHQ6IDM2MCxcblx0XHRcdFx0bWF4V2lkdGg6IDI0MCxcblx0XHRcdH0pO1xuXG5cdFx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJpY29uXCIpICYmIHRoaXMubW9kZWwuZ2V0KFwiaWNvblwiKSAhPT0gXCJkZWZhdWx0XCIpXG5cdFx0XHRcdHRoaXMuY292ZXJJbWFnZS5zZXRJbWFnZShzZXR0aW5ncy51cmxSb290ICsgdGhpcy5tb2RlbC5nZXQoXCJpY29uXCIpKTtcblx0XHR9LCA1MCk7XG5cdH0sXG5cblx0cGVybWlzc2lvblRvQ3JlYXRlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gcmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5hcGkuc2VydmljZXMucG9zdCwgcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKSk7XG5cdH0sXG5cblx0cGVybWlzc2lvblRvVXBkYXRlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gcmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5hcGkuc2VydmljZXMucHV0LCByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpKTtcblx0fSxcblxuXHRzZXJpYWxpemVEYXRhOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tb2RlbC50b0pTT04oeyBjb21wdXRlZDogdHJ1ZSB9KTtcblx0fSxcblxuXHRhc3NlbWJsZURhdGE6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSB7XG5cdFx0XHR0aXRsZTogdGhpcy51aS50aXRsZS52YWwoKSxcblx0XHRcdHVybDogdGhpcy51aS51cmwudmFsKCksXG5cdFx0XHRvcGVuSW50ZXJuYWxseTogdGhpcy51aS5vcGVuSW50ZXJuYWxseS5wcm9wKFwiY2hlY2tlZFwiKSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgaW1nID0gdGhpcy5jb3ZlckltYWdlICYmIHRoaXMuY292ZXJJbWFnZS5nZXRJbWFnZSgpO1xuXHRcdGlmIChpbWcgJiYgdGhpcy5jb3ZlckltYWdlLnNldCAmJiAhXy5zdGFydHNXaXRoKGltZywgXCIvXCIpKVxuXHRcdFx0YXR0cmlidXRlcy5jb3ZlciA9IGltZy5zbGljZShpbWcuaW5kZXhPZihcIixcIikgKyAxKTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRhdHRyaWJ1dGVzOiBhdHRyaWJ1dGVzLFxuXHRcdH07XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar rester = require(\"rester\");\nvar _ = require(\"lodash\");\n\nvar App = require(\"../../index\");\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar ServerGrid = require(\"../../lib/serverGrid\");\nvar settings = require(\"app-settings\");\nvar SmallModal = require(\"../../lib/smallModal\");\nvar SimpleMenu = require(\"../../lib/simpleMenu\");\nvar ChangelogModal = require(\"../../lib/changelogModal\");\n\nvar ServiceModal = require(\"./serviceModal\");\nvar ServiceModel = require(\"../serviceModel\");\n\nvar Collection = Backbone.PageableCollection.extend({\n\tmodel: ServiceModel,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/services?paged=true\";\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"content service-manager\",\n\n\ttemplate: require(\"../templates/services.nunj\"),\n\n\tui: {\n\t\tfilterBar: \".ops-bar .filters\",\n\t\tcounterBar: \".ops-bar .counter\",\n\t\taddServiceIcon: \".addServiceIcon\",\n\t\tpaging: \".paging\",\n\t\tgrid: \"div.grid\"\n\t},\n\n\tcollectionEvents: {\n\t\t\"toolbar:click:delete\": \"deleteService\",\n\t\t\"toolbar:click:edit\": \"addEditService\",\n\t\t\"toolbar:click:changelog\": \"changelog\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.addServiceIcon\": \"addEditService\",\n\t\t\"click @ui.download\": \"showDownloads\"\n\t},\n\n\tshowDownloads: function showDownloads(evt) {\n\t\tevt.stopPropagation();\n\n\t\tvar list = new SimpleMenu({\n\t\t\tanchor: this.ui.download,\n\t\t\tside: \"left\",\n\t\t\tstructure: [{ closeOnClick: true, elements: [{ text: \"Export list of services\", id: \"services\" }] }]\n\t\t});\n\t\tlist.show();\n\n\t\tthis.listenTo(list, \"clicked:services\", this.downloadList.bind(this));\n\t},\n\n\tdownloadList: function downloadList() {\n\t\twindow.open(settings.urlRoot + \"/api/1.0/services/lists/services\");\n\t},\n\n\taddEditService: function addEditService(model) {\n\t\tvar _this = this;\n\n\t\tif (model && _.isFunction(model.get) && model.get(\"global\")) {\n\t\t\treturn radio.trigger(App.Events.Commands.Toast, {\n\t\t\t\tcontent: \"Unable to edit global service.\",\n\t\t\t\ticon: \"fa-times\",\n\t\t\t\ticonColour: \"red\"\n\t\t\t});\n\t\t}\n\n\t\tvar modal = new ServiceModal({\n\t\t\tmodel: model && model.id ? model : new ServiceModel()\n\t\t});\n\n\t\tmodal.show({\n\t\t\tcreate: function create(result) {\n\t\t\t\t_this.grid.collection.getFirstPage();\n\t\t\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\t\t\tcontent: \"New Learning Tool \" + result.model.get(\"title\") + \" successfully created\"\n\t\t\t\t});\n\t\t\t},\n\t\t\tupdate: function update(result) {\n\t\t\t\tresult.model.trigger(\"grid:render\");\n\n\t\t\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\t\t\tcontent: \"Learning Tool \" + result.model.get(\"title\") + \" successfully updated\"\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t},\n\n\tfilterDetails: function filterDetails() {\n\t\tvar currentUser = radio.request(App.Events.Requests.CurrentUser);\n\n\t\treturn rester.hasAccess(rester.p.api.groups.get, currentUser) && rester.hasAccess(rester.p.services.all, currentUser);\n\t},\n\n\tfilterDelete: function filterDelete(model) {\n\t\tvar currentUser = radio.request(App.Events.Requests.CurrentUser);\n\t\tif (!rester.hasAccess(rester.p.api.services.delete, currentUser) || model.get(\"global\")) return false;\n\n\t\treturn true;\n\t},\n\n\tfilterEdit: function filterEdit(model) {\n\t\tvar currentUser = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tif (!rester.hasAccess(rester.p.api.services.put, currentUser) || model.get(\"global\")) return false;\n\n\t\treturn true;\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"title\", label: \"Title\", cell: \"string\", editable: false }, { name: \"url\", label: \"URL\", cell: \"string\", editable: false }, { name: \"open_internally\", label: \"Open Internally\", cell: ServerGrid.BooleanIconCell.extend({}), editable: false }, { name: \"serviceChanged\", label: \"Last Changed\", editable: false, cell: ServerGrid.MomentCell.extend({\n\t\t\t\tmodelInUnixTimestamp: true,\n\t\t\t\tdisplayFormat: \"DD MMM YYYY, HH:mm a\",\n\t\t\t\tdisplayInUTC: false\n\t\t\t}) },\n\t\t//{ name: \"publisherName\", label: \"Publisher\", cell: \"string\", editable: false },\n\t\t//{ name: \"global\", label: \"Global\", editable: false, cell: ServerGrid.BooleanIconCell.extend({}) },\n\t\t{ label: \"Actions\", cell: new ServerGrid.ToolbarCell({ tooltips: [{ title: \"Changelog\", icon: \"fa-list-ul\" }, { title: \"Edit\", icon: \"fa-edit\", filter: this.filterEdit.bind(this) }, { title: \"Delete\", icon: \"fa-trash-alt\", filter: this.filterDelete.bind(this) }] }), editable: false, sortable: false }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new Collection(),\n\t\t\tclickable: true,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counterBar,\n\t\t\t\ttemplate: \"Learning Tools $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tthis.bindEvents(this.grid.collection, this.collectionEvents);\n\n\t\tthis.listenTo(this.grid, \"row:clicked\", this.addEditService.bind(this));\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tthis.ui.filterBar.prepend(this.grid.filter({\n\t\t\tfilterContainer: this.ui.filterBar,\n\t\t\tfilters: [textFilter],\n\t\t\tdefaultFilters: [\"textFilter\"]\n\t\t}).render().el);\n\t},\n\n\tdeleteService: function deleteService(model) {\n\t\tvar _this2 = this;\n\n\t\tthis.delModal = new SmallModal({\n\t\t\tpersist: true,\n\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Delete Learning Tool: \" + model.get(\"title\").replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t}),\n\t\t\tbody: \"<p>Are you sure you want to delete this learning tool?</p>\",\n\t\t\twarning: true\n\t\t});\n\t\tthis.delModal.on(\"button:ok\", function () {\n\t\t\tmodel.destroy({ wait: true, success: _this2.deletionSuccess.bind(_this2), error: _this2.deletionError.bind(_this2) });\n\t\t});\n\n\t\tthis.delModal.show();\n\t},\n\n\tdeletionSuccess: function deletionSuccess(model) {\n\t\tthis.delModal.destroy();\n\t\tradio.trigger(App.Events.Commands.Toast, { content: \"Learning Tool \" + model.get(\"title\") + \" successfully deleted\", icon: \"fa-trash-alt\", iconColour: \"red\" });\n\t},\n\n\tdeletionError: function deletionError(model, xhr) {\n\t\tvar answer = App.parseResponse(xhr);\n\t\tthis.delModal.showError(\"Deletion failed: \" + (answer.detail || answer.info));\n\t},\n\n\tchangelog: function changelog(model) {\n\t\tvar mod = new Backbone.Model({\n\t\t\ttitle: model.get(\"servicename\"),\n\t\t\tidentifier: model.get(\"service_id\"),\n\t\t\tcategory: \"service\"\n\t\t});\n\n\t\tvar modal = new ChangelogModal({ model: mod });\n\n\t\tmodal.show();\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNlcnZpY2VzLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsInJlc3RlciIsIl8iLCJBcHAiLCJyYWRpbyIsIlJhZGlvIiwiY2hhbm5lbCIsIlNlcnZlckdyaWQiLCJzZXR0aW5ncyIsIlNtYWxsTW9kYWwiLCJTaW1wbGVNZW51IiwiQ2hhbmdlbG9nTW9kYWwiLCJTZXJ2aWNlTW9kYWwiLCJTZXJ2aWNlTW9kZWwiLCJDb2xsZWN0aW9uIiwiUGFnZWFibGVDb2xsZWN0aW9uIiwiZXh0ZW5kIiwibW9kZWwiLCJ1cmwiLCJ1cmxSb290Iiwic3RhdGUiLCJwYWdlU2l6ZSIsIm1vZGUiLCJxdWVyeVBhcmFtcyIsInNvcnRLZXkiLCJwYXJzZVN0YXRlIiwicmVzcCIsInRvdGFsUmVjb3JkcyIsInRvdGFsIiwicGFyc2VSZWNvcmRzIiwicm93cyIsIm1vZHVsZSIsImV4cG9ydHMiLCJNYXJpb25ldHRlIiwiVmlldyIsInRhZ05hbWUiLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsInVpIiwiZmlsdGVyQmFyIiwiY291bnRlckJhciIsImFkZFNlcnZpY2VJY29uIiwicGFnaW5nIiwiZ3JpZCIsImNvbGxlY3Rpb25FdmVudHMiLCJldmVudHMiLCJzaG93RG93bmxvYWRzIiwiZXZ0Iiwic3RvcFByb3BhZ2F0aW9uIiwibGlzdCIsImFuY2hvciIsImRvd25sb2FkIiwic2lkZSIsInN0cnVjdHVyZSIsImNsb3NlT25DbGljayIsImVsZW1lbnRzIiwidGV4dCIsImlkIiwic2hvdyIsImxpc3RlblRvIiwiZG93bmxvYWRMaXN0IiwiYmluZCIsIndpbmRvdyIsIm9wZW4iLCJhZGRFZGl0U2VydmljZSIsImlzRnVuY3Rpb24iLCJnZXQiLCJ0cmlnZ2VyIiwiRXZlbnRzIiwiQ29tbWFuZHMiLCJUb2FzdCIsImNvbnRlbnQiLCJpY29uIiwiaWNvbkNvbG91ciIsIm1vZGFsIiwiY3JlYXRlIiwiY29sbGVjdGlvbiIsImdldEZpcnN0UGFnZSIsInJlc3VsdCIsInVwZGF0ZSIsImZpbHRlckRldGFpbHMiLCJjdXJyZW50VXNlciIsInJlcXVlc3QiLCJSZXF1ZXN0cyIsIkN1cnJlbnRVc2VyIiwiaGFzQWNjZXNzIiwicCIsImFwaSIsImdyb3VwcyIsInNlcnZpY2VzIiwiYWxsIiwiZmlsdGVyRGVsZXRlIiwiZGVsZXRlIiwiZmlsdGVyRWRpdCIsInB1dCIsIm9uUmVuZGVyIiwiY29sdW1ucyIsIm5hbWUiLCJsYWJlbCIsImNlbGwiLCJlZGl0YWJsZSIsIkJvb2xlYW5JY29uQ2VsbCIsIk1vbWVudENlbGwiLCJtb2RlbEluVW5peFRpbWVzdGFtcCIsImRpc3BsYXlGb3JtYXQiLCJkaXNwbGF5SW5VVEMiLCJUb29sYmFyQ2VsbCIsInRvb2x0aXBzIiwidGl0bGUiLCJmaWx0ZXIiLCJzb3J0YWJsZSIsImVsIiwiY2xpY2thYmxlIiwiY291bnRlciIsImVsZW1lbnQiLCJiaW5kRXZlbnRzIiwidGV4dEZpbHRlciIsInR5cGUiLCJkZWJvdW5jZSIsInNlcnZlciIsInByZXBlbmQiLCJmaWx0ZXJDb250YWluZXIiLCJmaWx0ZXJzIiwiZGVmYXVsdEZpbHRlcnMiLCJyZW5kZXIiLCJkZWxldGVTZXJ2aWNlIiwiZGVsTW9kYWwiLCJwZXJzaXN0IiwicmVwbGFjZSIsIngiLCJjaGFyQ29kZUF0IiwiYm9keSIsIndhcm5pbmciLCJvbiIsImRlc3Ryb3kiLCJ3YWl0Iiwic3VjY2VzcyIsImRlbGV0aW9uU3VjY2VzcyIsImVycm9yIiwiZGVsZXRpb25FcnJvciIsInhociIsImFuc3dlciIsInBhcnNlUmVzcG9uc2UiLCJzaG93RXJyb3IiLCJkZXRhaWwiLCJpbmZvIiwiY2hhbmdlbG9nIiwibW9kIiwiTW9kZWwiLCJpZGVudGlmaWVyIiwiY2F0ZWdvcnkiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1DLFNBQVNELFFBQVEsUUFBUixDQUFmO0FBQ0EsSUFBTUUsSUFBSUYsUUFBUSxRQUFSLENBQVY7O0FBRUEsSUFBTUcsTUFBTUgsUUFBUSxhQUFSLENBQVo7QUFDQSxJQUFNSSxRQUFRTCxTQUFTTSxLQUFULENBQWVDLE9BQWYsQ0FBdUIsUUFBdkIsQ0FBZDs7QUFFQSxJQUFNQyxhQUFhUCxRQUFRLHNCQUFSLENBQW5CO0FBQ0EsSUFBTVEsV0FBV1IsUUFBUSxjQUFSLENBQWpCO0FBQ0EsSUFBTVMsYUFBYVQsUUFBUSxzQkFBUixDQUFuQjtBQUNBLElBQU1VLGFBQWFWLFFBQVEsc0JBQVIsQ0FBbkI7QUFDQSxJQUFNVyxpQkFBaUJYLFFBQVEsMEJBQVIsQ0FBdkI7O0FBRUEsSUFBTVksZUFBZVosUUFBUSxnQkFBUixDQUFyQjtBQUNBLElBQU1hLGVBQWViLFFBQVEsaUJBQVIsQ0FBckI7O0FBRUEsSUFBTWMsYUFBYWYsU0FBU2dCLGtCQUFULENBQTRCQyxNQUE1QixDQUFtQztBQUNyREMsUUFBT0osWUFEOEM7O0FBR3JESyxNQUFLLGVBQVc7QUFDZixTQUFPVixTQUFTVyxPQUFULEdBQW1CLDhCQUExQjtBQUNBLEVBTG9EOztBQU9yREMsUUFBTztBQUNOQyxZQUFVO0FBREosRUFQOEM7QUFVckRDLE9BQU0sUUFWK0M7O0FBWXJEQyxjQUFhO0FBQ1pGLFlBQVUsVUFERTtBQUVaRyxXQUFTO0FBRkcsRUFad0M7O0FBaUJyREMsYUFBWSxvQkFBU0MsSUFBVCxFQUFlO0FBQzFCLFNBQU8sRUFBRUMsY0FBY0QsS0FBS0UsS0FBckIsRUFBUDtBQUNBLEVBbkJvRDs7QUFxQnJEQyxlQUFjLHNCQUFTSCxJQUFULEVBQWU7QUFDNUIsU0FBT0EsS0FBS0ksSUFBWjtBQUNBO0FBdkJvRCxDQUFuQyxDQUFuQjs7QUEwQkFDLE9BQU9DLE9BQVAsR0FBaUJqQyxTQUFTa0MsVUFBVCxDQUFvQkMsSUFBcEIsQ0FBeUJsQixNQUF6QixDQUFnQztBQUNoRG1CLFVBQVMsS0FEdUM7QUFFaERDLFlBQVcseUJBRnFDOztBQUloREMsV0FBVXJDLFFBQVEsNEJBQVIsQ0FKc0M7O0FBTWhEc0MsS0FBSTtBQUNIQyxhQUFXLG1CQURSO0FBRUhDLGNBQVksbUJBRlQ7QUFHSEMsa0JBQWdCLGlCQUhiO0FBSUhDLFVBQVEsU0FKTDtBQUtIQyxRQUFNO0FBTEgsRUFONEM7O0FBY2hEQyxtQkFBa0I7QUFDakIsMEJBQXdCLGVBRFA7QUFFakIsd0JBQXNCLGdCQUZMO0FBR2pCLDZCQUEyQjtBQUhWLEVBZDhCOztBQW9CaERDLFNBQVE7QUFDUCw4QkFBNEIsZ0JBRHJCO0FBRVAsd0JBQXNCO0FBRmYsRUFwQndDOztBQXlCaERDLGdCQUFlLHVCQUFTQyxHQUFULEVBQWM7QUFDNUJBLE1BQUlDLGVBQUo7O0FBRUEsTUFBTUMsT0FBTyxJQUFJdkMsVUFBSixDQUFlO0FBQzNCd0MsV0FBUSxLQUFLWixFQUFMLENBQVFhLFFBRFc7QUFFM0JDLFNBQU0sTUFGcUI7QUFHM0JDLGNBQVcsQ0FDVixFQUFFQyxjQUFjLElBQWhCLEVBQXNCQyxVQUFVLENBQy9CLEVBQUVDLE1BQU0seUJBQVIsRUFBbUNDLElBQUksVUFBdkMsRUFEK0IsQ0FBaEMsRUFEVTtBQUhnQixHQUFmLENBQWI7QUFTQVIsT0FBS1MsSUFBTDs7QUFFQSxPQUFLQyxRQUFMLENBQWNWLElBQWQsRUFBb0Isa0JBQXBCLEVBQXdDLEtBQUtXLFlBQUwsQ0FBa0JDLElBQWxCLENBQXVCLElBQXZCLENBQXhDO0FBQ0EsRUF4QytDOztBQTBDaERELGVBQWMsd0JBQVc7QUFDeEJFLFNBQU9DLElBQVAsQ0FBWXZELFNBQVNXLE9BQVQsR0FBbUIsa0NBQS9CO0FBQ0EsRUE1QytDOztBQThDaEQ2QyxpQkFBZ0Isd0JBQVMvQyxLQUFULEVBQWdCO0FBQUE7O0FBQy9CLE1BQUlBLFNBQVNmLEVBQUUrRCxVQUFGLENBQWFoRCxNQUFNaUQsR0FBbkIsQ0FBVCxJQUFvQ2pELE1BQU1pRCxHQUFOLENBQVUsUUFBVixDQUF4QyxFQUE2RDtBQUM1RCxVQUFPOUQsTUFBTStELE9BQU4sQ0FBY2hFLElBQUlpRSxNQUFKLENBQVdDLFFBQVgsQ0FBb0JDLEtBQWxDLEVBQXlDO0FBQy9DQyxhQUFTLGdDQURzQztBQUUvQ0MsVUFBTSxVQUZ5QztBQUcvQ0MsZ0JBQVk7QUFIbUMsSUFBekMsQ0FBUDtBQUtBOztBQUVELE1BQU1DLFFBQVEsSUFBSTlELFlBQUosQ0FBaUI7QUFDOUJLLFVBQU9BLFNBQVNBLE1BQU13QyxFQUFmLEdBQW9CeEMsS0FBcEIsR0FBNEIsSUFBSUosWUFBSjtBQURMLEdBQWpCLENBQWQ7O0FBSUE2RCxRQUFNaEIsSUFBTixDQUFXO0FBQ1ZpQixXQUFRLHdCQUFVO0FBQ2pCLFVBQUtoQyxJQUFMLENBQVVpQyxVQUFWLENBQXFCQyxZQUFyQjtBQUNBekUsVUFBTStELE9BQU4sQ0FBY2hFLElBQUlpRSxNQUFKLENBQVdDLFFBQVgsQ0FBb0JDLEtBQWxDLEVBQXlDO0FBQ3hDQyxjQUFTLHVCQUF1Qk8sT0FBTzdELEtBQVAsQ0FBYWlELEdBQWIsQ0FBaUIsT0FBakIsQ0FBdkIsR0FBbUQ7QUFEcEIsS0FBekM7QUFHQSxJQU5TO0FBT1ZhLFdBQVEsd0JBQVU7QUFDakJELFdBQU83RCxLQUFQLENBQWFrRCxPQUFiLENBQXFCLGFBQXJCOztBQUVBL0QsVUFBTStELE9BQU4sQ0FBY2hFLElBQUlpRSxNQUFKLENBQVdDLFFBQVgsQ0FBb0JDLEtBQWxDLEVBQXlDO0FBQ3hDQyxjQUFTLG1CQUFtQk8sT0FBTzdELEtBQVAsQ0FBYWlELEdBQWIsQ0FBaUIsT0FBakIsQ0FBbkIsR0FBK0M7QUFEaEIsS0FBekM7QUFHQTtBQWJTLEdBQVg7QUFlQSxFQTFFK0M7O0FBNEVoRGMsZ0JBQWUseUJBQVc7QUFDekIsTUFBTUMsY0FBYzdFLE1BQU04RSxPQUFOLENBQWMvRSxJQUFJaUUsTUFBSixDQUFXZSxRQUFYLENBQW9CQyxXQUFsQyxDQUFwQjs7QUFFQSxTQUFPbkYsT0FBT29GLFNBQVAsQ0FBaUJwRixPQUFPcUYsQ0FBUCxDQUFTQyxHQUFULENBQWFDLE1BQWIsQ0FBb0J0QixHQUFyQyxFQUEwQ2UsV0FBMUMsS0FBMERoRixPQUFPb0YsU0FBUCxDQUFpQnBGLE9BQU9xRixDQUFQLENBQVNHLFFBQVQsQ0FBa0JDLEdBQW5DLEVBQXdDVCxXQUF4QyxDQUFqRTtBQUNBLEVBaEYrQzs7QUFrRmhEVSxlQUFjLHNCQUFTMUUsS0FBVCxFQUFnQjtBQUM3QixNQUFNZ0UsY0FBYzdFLE1BQU04RSxPQUFOLENBQWMvRSxJQUFJaUUsTUFBSixDQUFXZSxRQUFYLENBQW9CQyxXQUFsQyxDQUFwQjtBQUNBLE1BQUksQ0FBQ25GLE9BQU9vRixTQUFQLENBQWlCcEYsT0FBT3FGLENBQVAsQ0FBU0MsR0FBVCxDQUFhRSxRQUFiLENBQXNCRyxNQUF2QyxFQUErQ1gsV0FBL0MsQ0FBRCxJQUFnRWhFLE1BQU1pRCxHQUFOLENBQVUsUUFBVixDQUFwRSxFQUNDLE9BQU8sS0FBUDs7QUFFRCxTQUFPLElBQVA7QUFDQSxFQXhGK0M7O0FBMEZoRDJCLGFBQVksb0JBQVM1RSxLQUFULEVBQWdCO0FBQzNCLE1BQU1nRSxjQUFjN0UsTUFBTThFLE9BQU4sQ0FBYy9FLElBQUlpRSxNQUFKLENBQVdlLFFBQVgsQ0FBb0JDLFdBQWxDLENBQXBCOztBQUVBLE1BQUksQ0FBQ25GLE9BQU9vRixTQUFQLENBQWlCcEYsT0FBT3FGLENBQVAsQ0FBU0MsR0FBVCxDQUFhRSxRQUFiLENBQXNCSyxHQUF2QyxFQUE0Q2IsV0FBNUMsQ0FBRCxJQUE2RGhFLE1BQU1pRCxHQUFOLENBQVUsUUFBVixDQUFqRSxFQUNDLE9BQU8sS0FBUDs7QUFFRCxTQUFPLElBQVA7QUFDQSxFQWpHK0M7O0FBbUdoRDZCLFdBQVUsb0JBQVc7QUFDcEIsTUFBTUMsVUFBVSxDQUNmLEVBQUVDLE1BQU0sT0FBUixFQUFpQkMsT0FBTyxPQUF4QixFQUFpQ0MsTUFBTSxRQUF2QyxFQUFpREMsVUFBVSxLQUEzRCxFQURlLEVBRWYsRUFBRUgsTUFBTSxLQUFSLEVBQWVDLE9BQU8sS0FBdEIsRUFBNkJDLE1BQU0sUUFBbkMsRUFBNkNDLFVBQVUsS0FBdkQsRUFGZSxFQUdmLEVBQUVILE1BQU0saUJBQVIsRUFBMkJDLE9BQU8saUJBQWxDLEVBQXFEQyxNQUFNNUYsV0FBVzhGLGVBQVgsQ0FBMkJyRixNQUEzQixDQUFrQyxFQUFsQyxDQUEzRCxFQUFrR29GLFVBQVUsS0FBNUcsRUFIZSxFQUlmLEVBQUVILE1BQU0sZ0JBQVIsRUFBMEJDLE9BQU8sY0FBakMsRUFBaURFLFVBQVUsS0FBM0QsRUFBa0VELE1BQU01RixXQUFXK0YsVUFBWCxDQUFzQnRGLE1BQXRCLENBQTZCO0FBQ3BHdUYsMEJBQXNCLElBRDhFO0FBRXBHQyxtQkFBZSxzQkFGcUY7QUFHcEdDLGtCQUFjO0FBSHNGLElBQTdCLENBQXhFLEVBSmU7QUFTZjtBQUNBO0FBQ0EsSUFBRVAsT0FBTyxTQUFULEVBQW9CQyxNQUFNLElBQUk1RixXQUFXbUcsV0FBZixDQUEyQixFQUFFQyxVQUFVLENBQ2hFLEVBQUVDLE9BQU8sV0FBVCxFQUFzQnBDLE1BQU0sWUFBNUIsRUFEZ0UsRUFFaEUsRUFBRW9DLE9BQU8sTUFBVCxFQUFpQnBDLE1BQU0sU0FBdkIsRUFBa0NxQyxRQUFRLEtBQUtoQixVQUFMLENBQWdCaEMsSUFBaEIsQ0FBcUIsSUFBckIsQ0FBMUMsRUFGZ0UsRUFHaEUsRUFBRStDLE9BQU8sUUFBVCxFQUFtQnBDLE1BQU0sY0FBekIsRUFBeUNxQyxRQUFRLEtBQUtsQixZQUFMLENBQWtCOUIsSUFBbEIsQ0FBdUIsSUFBdkIsQ0FBakQsRUFIZ0UsQ0FBWixFQUEzQixDQUExQixFQUlNdUMsVUFBVSxLQUpoQixFQUl1QlUsVUFBVSxLQUpqQyxFQVhlLENBQWhCOztBQWtCQSxPQUFLbkUsSUFBTCxHQUFZLElBQUlwQyxVQUFKLENBQWU7QUFDMUJ3RyxPQUFJLEtBQUt6RSxFQUFMLENBQVFLLElBRGM7QUFFMUJxRCxZQUFTQSxPQUZpQjtBQUcxQnBCLGVBQVksSUFBSTlELFVBQUosRUFIYztBQUkxQmtHLGNBQVcsSUFKZTtBQUsxQkMsWUFBUztBQUNSQyxhQUFTLEtBQUs1RSxFQUFMLENBQVFFLFVBRFQ7QUFFUkgsY0FBVTtBQUZGLElBTGlCO0FBUzFCSyxXQUFRO0FBQ1B3RSxhQUFTLEtBQUs1RSxFQUFMLENBQVFJO0FBRFY7QUFUa0IsR0FBZixDQUFaOztBQWNBLE9BQUt5RSxVQUFMLENBQWdCLEtBQUt4RSxJQUFMLENBQVVpQyxVQUExQixFQUFzQyxLQUFLaEMsZ0JBQTNDOztBQUVBLE9BQUtlLFFBQUwsQ0FBYyxLQUFLaEIsSUFBbkIsRUFBeUIsYUFBekIsRUFBd0MsS0FBS3FCLGNBQUwsQ0FBb0JILElBQXBCLENBQXlCLElBQXpCLENBQXhDOztBQUVBLE1BQU11RCxhQUFhO0FBQ2xCQyxTQUFNLE1BRFk7QUFFbEJwQixTQUFNLFlBRlk7QUFHbEJDLFVBQU8sYUFIVztBQUlsQm9CLGFBQVUsR0FKUTtBQUtsQkMsV0FBUTtBQUxVLEdBQW5COztBQVFBLE9BQUtqRixFQUFMLENBQVFDLFNBQVIsQ0FBa0JpRixPQUFsQixDQUEwQixLQUFLN0UsSUFBTCxDQUFVa0UsTUFBVixDQUFpQjtBQUMxQ1ksb0JBQWlCLEtBQUtuRixFQUFMLENBQVFDLFNBRGlCO0FBRTFDbUYsWUFBUyxDQUFDTixVQUFELENBRmlDO0FBRzFDTyxtQkFBZ0IsQ0FBQyxZQUFEO0FBSDBCLEdBQWpCLEVBSXZCQyxNQUp1QixHQUlkYixFQUpaO0FBS0EsRUFySitDOztBQXVKaERjLGdCQUFlLHVCQUFTNUcsS0FBVCxFQUFnQjtBQUFBOztBQUM5QixPQUFLNkcsUUFBTCxHQUFnQixJQUFJckgsVUFBSixDQUFlO0FBQzlCc0gsWUFBUyxJQURxQjtBQUU5Qm5CLFVBQU8sdUVBQXdFM0YsTUFBTWlELEdBQU4sQ0FBVSxPQUFWLENBQUQsQ0FBcUI4RCxPQUFyQixDQUE2QixlQUE3QixFQUE4QztBQUFBLFdBQUssT0FBT0MsRUFBRUMsVUFBRixDQUFhLENBQWIsQ0FBUCxHQUF5QixHQUE5QjtBQUFBLElBQTlDLENBRmhEO0FBRzlCQyxTQUFNLDREQUh3QjtBQUk5QkMsWUFBUztBQUpxQixHQUFmLENBQWhCO0FBTUEsT0FBS04sUUFBTCxDQUFjTyxFQUFkLENBQWlCLFdBQWpCLEVBQThCLFlBQU07QUFDbkNwSCxTQUFNcUgsT0FBTixDQUFjLEVBQUVDLE1BQU0sSUFBUixFQUFjQyxTQUFTLE9BQUtDLGVBQUwsQ0FBcUI1RSxJQUFyQixDQUEwQixNQUExQixDQUF2QixFQUF3RDZFLE9BQU8sT0FBS0MsYUFBTCxDQUFtQjlFLElBQW5CLENBQXdCLE1BQXhCLENBQS9ELEVBQWQ7QUFDQSxHQUZEOztBQUlBLE9BQUtpRSxRQUFMLENBQWNwRSxJQUFkO0FBQ0EsRUFuSytDOztBQXFLaEQrRSxrQkFBaUIseUJBQVN4SCxLQUFULEVBQWdCO0FBQ2hDLE9BQUs2RyxRQUFMLENBQWNRLE9BQWQ7QUFDQWxJLFFBQU0rRCxPQUFOLENBQWNoRSxJQUFJaUUsTUFBSixDQUFXQyxRQUFYLENBQW9CQyxLQUFsQyxFQUF5QyxFQUFFQyxTQUFTLG1CQUFtQnRELE1BQU1pRCxHQUFOLENBQVUsT0FBVixDQUFuQixHQUF3Qyx1QkFBbkQsRUFBNEVNLE1BQU0sY0FBbEYsRUFBa0dDLFlBQVksS0FBOUcsRUFBekM7QUFDQSxFQXhLK0M7O0FBMEtoRGtFLGdCQUFlLHVCQUFTMUgsS0FBVCxFQUFnQjJILEdBQWhCLEVBQXFCO0FBQ25DLE1BQU1DLFNBQVMxSSxJQUFJMkksYUFBSixDQUFrQkYsR0FBbEIsQ0FBZjtBQUNBLE9BQUtkLFFBQUwsQ0FBY2lCLFNBQWQsQ0FBd0IsdUJBQXVCRixPQUFPRyxNQUFQLElBQWlCSCxPQUFPSSxJQUEvQyxDQUF4QjtBQUNBLEVBN0srQzs7QUErS2hEQyxZQUFXLG1CQUFTakksS0FBVCxFQUFnQjtBQUMxQixNQUFNa0ksTUFBTSxJQUFJcEosU0FBU3FKLEtBQWIsQ0FBbUI7QUFDOUJ4QyxVQUFPM0YsTUFBTWlELEdBQU4sQ0FBVSxhQUFWLENBRHVCO0FBRTlCbUYsZUFBWXBJLE1BQU1pRCxHQUFOLENBQVUsWUFBVixDQUZrQjtBQUc5Qm9GLGFBQVU7QUFIb0IsR0FBbkIsQ0FBWjs7QUFNQSxNQUFNNUUsUUFBUSxJQUFJL0QsY0FBSixDQUFtQixFQUFFTSxPQUFPa0ksR0FBVCxFQUFuQixDQUFkOztBQUVBekUsUUFBTWhCLElBQU47QUFDQTtBQXpMK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoic2VydmljZXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgcmVzdGVyID0gcmVxdWlyZShcInJlc3RlclwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuXG5jb25zdCBBcHAgPSByZXF1aXJlKFwiLi4vLi4vaW5kZXhcIik7XG5jb25zdCByYWRpbyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJnbG9iYWxcIik7XG5cbmNvbnN0IFNlcnZlckdyaWQgPSByZXF1aXJlKFwiLi4vLi4vbGliL3NlcnZlckdyaWRcIik7XG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5jb25zdCBTbWFsbE1vZGFsID0gcmVxdWlyZShcIi4uLy4uL2xpYi9zbWFsbE1vZGFsXCIpO1xuY29uc3QgU2ltcGxlTWVudSA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc2ltcGxlTWVudVwiKTtcbmNvbnN0IENoYW5nZWxvZ01vZGFsID0gcmVxdWlyZShcIi4uLy4uL2xpYi9jaGFuZ2Vsb2dNb2RhbFwiKTtcblxuY29uc3QgU2VydmljZU1vZGFsID0gcmVxdWlyZShcIi4vc2VydmljZU1vZGFsXCIpO1xuY29uc3QgU2VydmljZU1vZGVsID0gcmVxdWlyZShcIi4uL3NlcnZpY2VNb2RlbFwiKTtcblxuY29uc3QgQ29sbGVjdGlvbiA9IEJhY2tib25lLlBhZ2VhYmxlQ29sbGVjdGlvbi5leHRlbmQoe1xuXHRtb2RlbDogU2VydmljZU1vZGVsLFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3NlcnZpY2VzP3BhZ2VkPXRydWVcIjtcblx0fSxcblxuXHRzdGF0ZToge1xuXHRcdHBhZ2VTaXplOiAzMCxcblx0fSxcblx0bW9kZTogXCJzZXJ2ZXJcIixcblxuXHRxdWVyeVBhcmFtczoge1xuXHRcdHBhZ2VTaXplOiBcInBhZ2VTaXplXCIsXG5cdFx0c29ydEtleTogXCJzb3J0QnlcIixcblx0fSxcblxuXHRwYXJzZVN0YXRlOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0cmV0dXJuIHsgdG90YWxSZWNvcmRzOiByZXNwLnRvdGFsIH07XG5cdH0sXG5cblx0cGFyc2VSZWNvcmRzOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0cmV0dXJuIHJlc3Aucm93cztcblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwiY29udGVudCBzZXJ2aWNlLW1hbmFnZXJcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9zZXJ2aWNlcy5udW5qXCIpLFxuXG5cdHVpOiB7XG5cdFx0ZmlsdGVyQmFyOiBcIi5vcHMtYmFyIC5maWx0ZXJzXCIsXG5cdFx0Y291bnRlckJhcjogXCIub3BzLWJhciAuY291bnRlclwiLFxuXHRcdGFkZFNlcnZpY2VJY29uOiBcIi5hZGRTZXJ2aWNlSWNvblwiLFxuXHRcdHBhZ2luZzogXCIucGFnaW5nXCIsXG5cdFx0Z3JpZDogXCJkaXYuZ3JpZFwiLFxuXHR9LFxuXG5cdGNvbGxlY3Rpb25FdmVudHM6IHtcblx0XHRcInRvb2xiYXI6Y2xpY2s6ZGVsZXRlXCI6IFwiZGVsZXRlU2VydmljZVwiLFxuXHRcdFwidG9vbGJhcjpjbGljazplZGl0XCI6IFwiYWRkRWRpdFNlcnZpY2VcIixcblx0XHRcInRvb2xiYXI6Y2xpY2s6Y2hhbmdlbG9nXCI6IFwiY2hhbmdlbG9nXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkuYWRkU2VydmljZUljb25cIjogXCJhZGRFZGl0U2VydmljZVwiLFxuXHRcdFwiY2xpY2sgQHVpLmRvd25sb2FkXCI6IFwic2hvd0Rvd25sb2Fkc1wiLFxuXHR9LFxuXG5cdHNob3dEb3dubG9hZHM6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGNvbnN0IGxpc3QgPSBuZXcgU2ltcGxlTWVudSh7XG5cdFx0XHRhbmNob3I6IHRoaXMudWkuZG93bmxvYWQsXG5cdFx0XHRzaWRlOiBcImxlZnRcIixcblx0XHRcdHN0cnVjdHVyZTogW1xuXHRcdFx0XHR7IGNsb3NlT25DbGljazogdHJ1ZSwgZWxlbWVudHM6IFtcblx0XHRcdFx0XHR7IHRleHQ6IFwiRXhwb3J0IGxpc3Qgb2Ygc2VydmljZXNcIiwgaWQ6IFwic2VydmljZXNcIiB9LFxuXHRcdFx0XHRdIH0sXG5cdFx0XHRdLFxuXHRcdH0pO1xuXHRcdGxpc3Quc2hvdygpO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhsaXN0LCBcImNsaWNrZWQ6c2VydmljZXNcIiwgdGhpcy5kb3dubG9hZExpc3QuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0ZG93bmxvYWRMaXN0OiBmdW5jdGlvbigpIHtcblx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9zZXJ2aWNlcy9saXN0cy9zZXJ2aWNlc1wiKTtcblx0fSxcblxuXHRhZGRFZGl0U2VydmljZTogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRpZiAobW9kZWwgJiYgXy5pc0Z1bmN0aW9uKG1vZGVsLmdldCkgJiYgbW9kZWwuZ2V0KFwiZ2xvYmFsXCIpKSB7XG5cdFx0XHRyZXR1cm4gcmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7XG5cdFx0XHRcdGNvbnRlbnQ6IFwiVW5hYmxlIHRvIGVkaXQgZ2xvYmFsIHNlcnZpY2UuXCIsXG5cdFx0XHRcdGljb246IFwiZmEtdGltZXNcIixcblx0XHRcdFx0aWNvbkNvbG91cjogXCJyZWRcIixcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1vZGFsID0gbmV3IFNlcnZpY2VNb2RhbCh7XG5cdFx0XHRtb2RlbDogbW9kZWwgJiYgbW9kZWwuaWQgPyBtb2RlbCA6IG5ldyBTZXJ2aWNlTW9kZWwoKSxcblx0XHR9KTtcblxuXHRcdG1vZGFsLnNob3coe1xuXHRcdFx0Y3JlYXRlOiByZXN1bHQgPT4ge1xuXHRcdFx0XHR0aGlzLmdyaWQuY29sbGVjdGlvbi5nZXRGaXJzdFBhZ2UoKTtcblx0XHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7XG5cdFx0XHRcdFx0Y29udGVudDogXCJOZXcgTGVhcm5pbmcgVG9vbCBcIiArIHJlc3VsdC5tb2RlbC5nZXQoXCJ0aXRsZVwiKSArIFwiIHN1Y2Nlc3NmdWxseSBjcmVhdGVkXCIsXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdHVwZGF0ZTogcmVzdWx0ID0+IHtcblx0XHRcdFx0cmVzdWx0Lm1vZGVsLnRyaWdnZXIoXCJncmlkOnJlbmRlclwiKTtcblxuXHRcdFx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuVG9hc3QsIHtcblx0XHRcdFx0XHRjb250ZW50OiBcIkxlYXJuaW5nIFRvb2wgXCIgKyByZXN1bHQubW9kZWwuZ2V0KFwidGl0bGVcIikgKyBcIiBzdWNjZXNzZnVsbHkgdXBkYXRlZFwiLFxuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH0sXG5cblx0ZmlsdGVyRGV0YWlsczogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgY3VycmVudFVzZXIgPSByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpO1xuXG5cdFx0cmV0dXJuIHJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAuYXBpLmdyb3Vwcy5nZXQsIGN1cnJlbnRVc2VyKSAmJiByZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLnNlcnZpY2VzLmFsbCwgY3VycmVudFVzZXIpO1xuXHR9LFxuXG5cdGZpbHRlckRlbGV0ZTogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRjb25zdCBjdXJyZW50VXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cdFx0aWYgKCFyZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmFwaS5zZXJ2aWNlcy5kZWxldGUsIGN1cnJlbnRVc2VyKSB8fCBtb2RlbC5nZXQoXCJnbG9iYWxcIikpXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHRmaWx0ZXJFZGl0OiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdGNvbnN0IGN1cnJlbnRVc2VyID0gcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblxuXHRcdGlmICghcmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5hcGkuc2VydmljZXMucHV0LCBjdXJyZW50VXNlcikgfHwgbW9kZWwuZ2V0KFwiZ2xvYmFsXCIpKVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGNvbHVtbnMgPSBbXG5cdFx0XHR7IG5hbWU6IFwidGl0bGVcIiwgbGFiZWw6IFwiVGl0bGVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwidXJsXCIsIGxhYmVsOiBcIlVSTFwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJvcGVuX2ludGVybmFsbHlcIiwgbGFiZWw6IFwiT3BlbiBJbnRlcm5hbGx5XCIsIGNlbGw6IFNlcnZlckdyaWQuQm9vbGVhbkljb25DZWxsLmV4dGVuZCh7fSksIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcInNlcnZpY2VDaGFuZ2VkXCIsIGxhYmVsOiBcIkxhc3QgQ2hhbmdlZFwiLCBlZGl0YWJsZTogZmFsc2UsIGNlbGw6IFNlcnZlckdyaWQuTW9tZW50Q2VsbC5leHRlbmQoe1xuXHRcdFx0XHRtb2RlbEluVW5peFRpbWVzdGFtcDogdHJ1ZSxcblx0XHRcdFx0ZGlzcGxheUZvcm1hdDogXCJERCBNTU0gWVlZWSwgSEg6bW0gYVwiLFxuXHRcdFx0XHRkaXNwbGF5SW5VVEM6IGZhbHNlLFxuXHRcdFx0fSkgfSxcblx0XHRcdC8veyBuYW1lOiBcInB1Ymxpc2hlck5hbWVcIiwgbGFiZWw6IFwiUHVibGlzaGVyXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0Ly97IG5hbWU6IFwiZ2xvYmFsXCIsIGxhYmVsOiBcIkdsb2JhbFwiLCBlZGl0YWJsZTogZmFsc2UsIGNlbGw6IFNlcnZlckdyaWQuQm9vbGVhbkljb25DZWxsLmV4dGVuZCh7fSkgfSxcblx0XHRcdHsgbGFiZWw6IFwiQWN0aW9uc1wiLCBjZWxsOiBuZXcgU2VydmVyR3JpZC5Ub29sYmFyQ2VsbCh7IHRvb2x0aXBzOiBbXG5cdFx0XHRcdHsgdGl0bGU6IFwiQ2hhbmdlbG9nXCIsIGljb246IFwiZmEtbGlzdC11bFwiIH0sXG5cdFx0XHRcdHsgdGl0bGU6IFwiRWRpdFwiLCBpY29uOiBcImZhLWVkaXRcIiwgZmlsdGVyOiB0aGlzLmZpbHRlckVkaXQuYmluZCh0aGlzKSB9LFxuXHRcdFx0XHR7IHRpdGxlOiBcIkRlbGV0ZVwiLCBpY29uOiBcImZhLXRyYXNoLWFsdFwiLCBmaWx0ZXI6IHRoaXMuZmlsdGVyRGVsZXRlLmJpbmQodGhpcykgfSxcblx0XHRcdF0gfSksIGVkaXRhYmxlOiBmYWxzZSwgc29ydGFibGU6IGZhbHNlIH0sXG5cdFx0XTtcblxuXHRcdHRoaXMuZ3JpZCA9IG5ldyBTZXJ2ZXJHcmlkKHtcblx0XHRcdGVsOiB0aGlzLnVpLmdyaWQsXG5cdFx0XHRjb2x1bW5zOiBjb2x1bW5zLFxuXHRcdFx0Y29sbGVjdGlvbjogbmV3IENvbGxlY3Rpb24oKSxcblx0XHRcdGNsaWNrYWJsZTogdHJ1ZSxcblx0XHRcdGNvdW50ZXI6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5jb3VudGVyQmFyLFxuXHRcdFx0XHR0ZW1wbGF0ZTogXCJMZWFybmluZyBUb29scyAkc3RhcnQgLSAkZW5kIG9mICR0b3RhbFwiLFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLnBhZ2luZyxcblx0XHRcdH0sXG5cdFx0fSk7XG5cblx0XHR0aGlzLmJpbmRFdmVudHModGhpcy5ncmlkLmNvbGxlY3Rpb24sIHRoaXMuY29sbGVjdGlvbkV2ZW50cyk7XG5cblx0XHR0aGlzLmxpc3RlblRvKHRoaXMuZ3JpZCwgXCJyb3c6Y2xpY2tlZFwiLCB0aGlzLmFkZEVkaXRTZXJ2aWNlLmJpbmQodGhpcykpO1xuXG5cdFx0Y29uc3QgdGV4dEZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwidGV4dFwiLFxuXHRcdFx0bmFtZTogXCJ0ZXh0RmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJUZXh0IFNlYXJjaFwiLFxuXHRcdFx0ZGVib3VuY2U6IDIwMCxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0dGhpcy51aS5maWx0ZXJCYXIucHJlcGVuZCh0aGlzLmdyaWQuZmlsdGVyKHtcblx0XHRcdGZpbHRlckNvbnRhaW5lcjogdGhpcy51aS5maWx0ZXJCYXIsXG5cdFx0XHRmaWx0ZXJzOiBbdGV4dEZpbHRlcl0sXG5cdFx0XHRkZWZhdWx0RmlsdGVyczogW1widGV4dEZpbHRlclwiXSxcblx0XHR9KS5yZW5kZXIoKS5lbCk7XG5cdH0sXG5cblx0ZGVsZXRlU2VydmljZTogZnVuY3Rpb24obW9kZWwpIHtcblx0XHR0aGlzLmRlbE1vZGFsID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0cGVyc2lzdDogdHJ1ZSxcblx0XHRcdHRpdGxlOiBcIjxzcGFuIGNsYXNzPSdmYWwgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUnLz4gRGVsZXRlIExlYXJuaW5nIFRvb2w6IFwiICsgKG1vZGVsLmdldChcInRpdGxlXCIpKS5yZXBsYWNlKC9bXFwmXFw8XFw+XFwnXFxcIl0vZywgeCA9PiBcIiYjXCIgKyB4LmNoYXJDb2RlQXQoMCkgKyBcIjtcIiksXG5cdFx0XHRib2R5OiBcIjxwPkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBsZWFybmluZyB0b29sPzwvcD5cIixcblx0XHRcdHdhcm5pbmc6IHRydWUsXG5cdFx0fSk7XG5cdFx0dGhpcy5kZWxNb2RhbC5vbihcImJ1dHRvbjpva1wiLCAoKSA9PiB7XG5cdFx0XHRtb2RlbC5kZXN0cm95KHsgd2FpdDogdHJ1ZSwgc3VjY2VzczogdGhpcy5kZWxldGlvblN1Y2Nlc3MuYmluZCh0aGlzKSwgZXJyb3I6IHRoaXMuZGVsZXRpb25FcnJvci5iaW5kKHRoaXMpIH0pO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5kZWxNb2RhbC5zaG93KCk7XG5cdH0sXG5cblx0ZGVsZXRpb25TdWNjZXNzOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdHRoaXMuZGVsTW9kYWwuZGVzdHJveSgpO1xuXHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5Ub2FzdCwgeyBjb250ZW50OiBcIkxlYXJuaW5nIFRvb2wgXCIgKyBtb2RlbC5nZXQoXCJ0aXRsZVwiKSArIFwiIHN1Y2Nlc3NmdWxseSBkZWxldGVkXCIsIGljb246IFwiZmEtdHJhc2gtYWx0XCIsIGljb25Db2xvdXI6IFwicmVkXCIgfSk7XG5cdH0sXG5cblx0ZGVsZXRpb25FcnJvcjogZnVuY3Rpb24obW9kZWwsIHhocikge1xuXHRcdGNvbnN0IGFuc3dlciA9IEFwcC5wYXJzZVJlc3BvbnNlKHhocik7XG5cdFx0dGhpcy5kZWxNb2RhbC5zaG93RXJyb3IoXCJEZWxldGlvbiBmYWlsZWQ6IFwiICsgKGFuc3dlci5kZXRhaWwgfHwgYW5zd2VyLmluZm8pKTtcblx0fSxcblxuXHRjaGFuZ2Vsb2c6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0Y29uc3QgbW9kID0gbmV3IEJhY2tib25lLk1vZGVsKHtcblx0XHRcdHRpdGxlOiBtb2RlbC5nZXQoXCJzZXJ2aWNlbmFtZVwiKSxcblx0XHRcdGlkZW50aWZpZXI6IG1vZGVsLmdldChcInNlcnZpY2VfaWRcIiksXG5cdFx0XHRjYXRlZ29yeTogXCJzZXJ2aWNlXCIsXG5cdFx0fSk7XG5cblx0XHRjb25zdCBtb2RhbCA9IG5ldyBDaGFuZ2Vsb2dNb2RhbCh7IG1vZGVsOiBtb2QgfSk7XG5cblx0XHRtb2RhbC5zaG93KCk7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar App = require(\"../../index\");\n\nvar gradeMap = require(\"../../lib/gradeMap\");\n\nvar ServerGrid = require(\"../../lib/serverGrid\");\nvar settings = require(\"app-settings\");\nvar SmallModal = require(\"../../lib/smallModal\");\n\nvar Model = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"session_id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/login/sessions\";\n\t},\n\n\tcomputeds: {\n\t\tisLoaded: function isLoaded() {\n\t\t\treturn this.has(\"_id\");\n\t\t},\n\t\tbookGrade: function bookGrade() {\n\t\t\treturn gradeMap.codeToHumanValue(this.get(\"grade\"));\n\t\t}\n\t}\n});\n\nvar Collection = Backbone.PageableCollection.extend({\n\tmodel: Model,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/login/sessions?grid=true\";\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"content active-sessions\",\n\n\ttemplate: require(\"../templates/sessions.nunj\"),\n\n\tui: {\n\t\tfilterBar: \".ops-bar .filters\",\n\t\tcounter: \".ops-bar .counter\",\n\t\tuploader: \".upload\",\n\t\tpaging: \".paging\",\n\t\tgrid: \"div.grid\"\n\t},\n\n\tcollectionEvents: {\n\t\t\"toolbar:click:blacklist\": \"revokeToken\"\n\t},\n\n\tfilterRevoke: function filterRevoke(model) {\n\t\treturn !model.get(\"revoked\");\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"ip\", label: \"IP\", cell: \"string\", editable: false }, { name: \"username\", label: \"Username\", cell: \"string\", editable: false }, { name: \"created\", label: \"Created\", cell: ServerGrid.MomentCell.extend({\n\t\t\t\tmodelInUnixTimestamp: true,\n\t\t\t\tdisplayFormat: \"DD MMM YYYY, HH:mm:ss a\",\n\t\t\t\tdisplayInUTC: false\n\t\t\t}), editable: false }, { name: \"expires\", label: \"Expires\", cell: ServerGrid.MomentCell.extend({\n\t\t\t\tmodelInUnixTimestamp: true,\n\t\t\t\tdisplayFormat: \"DD MMM YYYY, HH:mm:ss a\",\n\t\t\t\tdisplayInUTC: false\n\t\t\t}), editable: false }, { name: \"impersonating\", label: \"Impersonating?\", cell: \"string\", editable: false }, { name: \"perpetual\", label: \"Forever?\", cell: ServerGrid.BooleanIconCell.extend({}), editable: false }, { name: \"transient\", label: \"Transient?\", cell: ServerGrid.BooleanIconCell.extend({}), editable: false }, { name: \"oauth\", label: \"OAuth?\", cell: ServerGrid.BooleanIconCell.extend({}), editable: false }, { name: \"logout\", label: \"Logout\", cell: ServerGrid.BooleanIconCell.extend({}), editable: false }, { name: \"renewals\", label: \"Renewals\", cell: \"string\", editable: false }, { name: \"last_renewal\", label: \"Last Renewal\", cell: ServerGrid.MomentCell.extend({\n\t\t\t\tmodelInUnixTimestamp: true,\n\t\t\t\tdisplayFormat: \"DD MMM YYYY, HH:mm:ss a\",\n\t\t\t\tdisplayInUTC: false\n\t\t\t}), editable: false }, { name: \"active\", label: \"Active?\", cell: ServerGrid.BooleanIconCell.extend({}), editable: false }, { name: \"blacklisted\", label: \"Blacklisted?\", cell: ServerGrid.BooleanIconCell.extend({}), editable: false }, { label: \"Actions\", cell: new ServerGrid.ToolbarCell({ tooltips: [{ title: \"Blacklist\", icon: \"fa-times\", filter: this.filterRevoke.bind(this) }] }), editable: false, sortable: false }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new Collection(),\n\t\t\tclickable: false,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counter,\n\t\t\t\ttemplate: \"Sessions $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tthis.bindEvents(this.grid.collection, this.collectionEvents);\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar filterList = [textFilter];\n\n\t\tthis.ui.filterBar.prepend(this.grid.filter({\n\t\t\tfilterContainer: this.ui.filterBar,\n\t\t\tfilters: filterList,\n\t\t\tdefaultFilters: [\"textFilter\"]\n\t\t}).render().el);\n\t},\n\n\trevokeToken: function revokeToken(model) {\n\t\tvar _this = this;\n\n\t\tthis.modal = new SmallModal({\n\t\t\twarning: true,\n\t\t\ttitle: \"<span class='fal fa-times'/> Blacklist Active Sessions: \" + model.get(\"username\"),\n\t\t\tbody: \"<p>This will blacklist all active sessions for the named user. They will be forced to log in again manually on all locations, including the apps.</p>\",\n\t\t\tpersist: true\n\t\t});\n\n\t\tthis.modal.on(\"button:ok\", function () {\n\t\t\tmodel.destroy({\n\t\t\t\turl: settings.urlRoot + \"/api/1.0/login/sessions/\" + model.id,\n\t\t\t\twait: true,\n\t\t\t\tsuccess: _this.revocationSuccess.bind(_this),\n\t\t\t\terror: _this.revocationError.bind(_this)\n\t\t\t});\n\t\t});\n\n\t\tthis.modal.show();\n\t},\n\n\trevocationSuccess: function revocationSuccess(model, data) {\n\t\tthis.modal.destroy();\n\n\t\tif (data.doLogout) {\n\t\t\t// Current user revoked\n\t\t\twindow.location.href = settings.urlRoot + \"/login\";\n\t\t\treturn;\n\t\t}\n\n\t\tthis.grid.collection.getFirstPage();\n\t},\n\n\trevocationError: function revocationError(model, xhr) {\n\t\tvar answer = App.parseResponse(xhr);\n\t\tthis.modal.showError(\"Revocation failed: \" + (answer.detail || answer.info));\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNlc3Npb25zLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIkFwcCIsImdyYWRlTWFwIiwiU2VydmVyR3JpZCIsInNldHRpbmdzIiwiU21hbGxNb2RhbCIsIk1vZGVsIiwiRXBveHkiLCJleHRlbmQiLCJpZEF0dHJpYnV0ZSIsInVybFJvb3QiLCJjb21wdXRlZHMiLCJpc0xvYWRlZCIsImhhcyIsImJvb2tHcmFkZSIsImNvZGVUb0h1bWFuVmFsdWUiLCJnZXQiLCJDb2xsZWN0aW9uIiwiUGFnZWFibGVDb2xsZWN0aW9uIiwibW9kZWwiLCJ1cmwiLCJzdGF0ZSIsInBhZ2VTaXplIiwibW9kZSIsInF1ZXJ5UGFyYW1zIiwic29ydEtleSIsInBhcnNlU3RhdGUiLCJyZXNwIiwidG90YWxSZWNvcmRzIiwidG90YWwiLCJwYXJzZVJlY29yZHMiLCJyb3dzIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1hcmlvbmV0dGUiLCJWaWV3IiwidGFnTmFtZSIsImNsYXNzTmFtZSIsInRlbXBsYXRlIiwidWkiLCJmaWx0ZXJCYXIiLCJjb3VudGVyIiwidXBsb2FkZXIiLCJwYWdpbmciLCJncmlkIiwiY29sbGVjdGlvbkV2ZW50cyIsImZpbHRlclJldm9rZSIsIm9uUmVuZGVyIiwiY29sdW1ucyIsIm5hbWUiLCJsYWJlbCIsImNlbGwiLCJlZGl0YWJsZSIsIk1vbWVudENlbGwiLCJtb2RlbEluVW5peFRpbWVzdGFtcCIsImRpc3BsYXlGb3JtYXQiLCJkaXNwbGF5SW5VVEMiLCJCb29sZWFuSWNvbkNlbGwiLCJUb29sYmFyQ2VsbCIsInRvb2x0aXBzIiwidGl0bGUiLCJpY29uIiwiZmlsdGVyIiwiYmluZCIsInNvcnRhYmxlIiwiZWwiLCJjb2xsZWN0aW9uIiwiY2xpY2thYmxlIiwiZWxlbWVudCIsImJpbmRFdmVudHMiLCJ0ZXh0RmlsdGVyIiwidHlwZSIsImRlYm91bmNlIiwic2VydmVyIiwiZmlsdGVyTGlzdCIsInByZXBlbmQiLCJmaWx0ZXJDb250YWluZXIiLCJmaWx0ZXJzIiwiZGVmYXVsdEZpbHRlcnMiLCJyZW5kZXIiLCJyZXZva2VUb2tlbiIsIm1vZGFsIiwid2FybmluZyIsImJvZHkiLCJwZXJzaXN0Iiwib24iLCJkZXN0cm95IiwiaWQiLCJ3YWl0Iiwic3VjY2VzcyIsInJldm9jYXRpb25TdWNjZXNzIiwiZXJyb3IiLCJyZXZvY2F0aW9uRXJyb3IiLCJzaG93IiwiZGF0YSIsImRvTG9nb3V0Iiwid2luZG93IiwibG9jYXRpb24iLCJocmVmIiwiZ2V0Rmlyc3RQYWdlIiwieGhyIiwiYW5zd2VyIiwicGFyc2VSZXNwb25zZSIsInNob3dFcnJvciIsImRldGFpbCIsImluZm8iXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjs7QUFFQSxJQUFNQyxNQUFNRCxRQUFRLGFBQVIsQ0FBWjs7QUFFQSxJQUFNRSxXQUFXRixRQUFRLG9CQUFSLENBQWpCOztBQUVBLElBQU1HLGFBQWFILFFBQVEsc0JBQVIsQ0FBbkI7QUFDQSxJQUFNSSxXQUFXSixRQUFRLGNBQVIsQ0FBakI7QUFDQSxJQUFNSyxhQUFhTCxRQUFRLHNCQUFSLENBQW5COztBQUVBLElBQU1NLFFBQVFQLFNBQVNRLEtBQVQsQ0FBZUQsS0FBZixDQUFxQkUsTUFBckIsQ0FBNEI7QUFDekNDLGNBQWEsWUFENEI7O0FBR3pDQyxVQUFTLG1CQUFXO0FBQ25CLFNBQU9OLFNBQVNNLE9BQVQsR0FBbUIseUJBQTFCO0FBQ0EsRUFMd0M7O0FBT3pDQyxZQUFXO0FBQ1ZDLFlBQVUsb0JBQVc7QUFDcEIsVUFBTyxLQUFLQyxHQUFMLENBQVMsS0FBVCxDQUFQO0FBQ0EsR0FIUztBQUlWQyxhQUFXLHFCQUFXO0FBQ3JCLFVBQU9aLFNBQVNhLGdCQUFULENBQTBCLEtBQUtDLEdBQUwsQ0FBUyxPQUFULENBQTFCLENBQVA7QUFDQTtBQU5TO0FBUDhCLENBQTVCLENBQWQ7O0FBaUJBLElBQU1DLGFBQWFsQixTQUFTbUIsa0JBQVQsQ0FBNEJWLE1BQTVCLENBQW1DO0FBQ3JE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RSxFQUQ5QztBQUViQyxVQUFNLElBRk87QUFHYkMsYUFBUyxNQUFLQyxpQkFBTCxDQUF1QjNCLElBQXZCLENBQTRCLEtBQTVCLENBSEk7QUFJYjRCLFdBQU8sTUFBS0MsZUFBTCxDQUFxQjdCLElBQXJCLENBQTBCLEtBQTFCO0FBSk0sSUFBZDtBQU1BLEdBUEQ7O0FBU0EsT0FBS2tCLEtBQUwsQ0FBV1ksSUFBWDtBQUNBLEVBekcrQzs7QUEyR2hESCxvQkFBbUIsMkJBQVN2RSxLQUFULEVBQWdCMkUsSUFBaEIsRUFBc0I7QUFDeEMsT0FBS2IsS0FBTCxDQUFXSyxPQUFYOztBQUVBLE1BQUlRLEtBQUtDLFFBQVQsRUFBbUI7QUFDbEI7QUFDQUMsVUFBT0MsUUFBUCxDQUFnQkMsSUFBaEIsR0FBdUI5RixTQUFTTSxPQUFULEdBQW1CLFFBQTFDO0FBQ0E7QUFDQTs7QUFFRCxPQUFLa0MsSUFBTCxDQUFVc0IsVUFBVixDQUFxQmlDLFlBQXJCO0FBQ0EsRUFySCtDOztBQXVIaERQLGtCQUFpQix5QkFBU3pFLEtBQVQsRUFBZ0JpRixHQUFoQixFQUFxQjtBQUNyQyxNQUFNQyxTQUFTcEcsSUFBSXFHLGFBQUosQ0FBa0JGLEdBQWxCLENBQWY7QUFDQSxPQUFLbkIsS0FBTCxDQUFXc0IsU0FBWCxDQUFxQix5QkFBeUJGLE9BQU9HLE1BQVAsSUFBaUJILE9BQU9JLElBQWpELENBQXJCO0FBQ0E7QUExSCtDLENBQWhDLENBQWpCIiwiZmlsZSI6InNlc3Npb25zLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcblxuY29uc3QgQXBwID0gcmVxdWlyZShcIi4uLy4uL2luZGV4XCIpO1xuXG5jb25zdCBncmFkZU1hcCA9IHJlcXVpcmUoXCIuLi8uLi9saWIvZ3JhZGVNYXBcIik7XG5cbmNvbnN0IFNlcnZlckdyaWQgPSByZXF1aXJlKFwiLi4vLi4vbGliL3NlcnZlckdyaWRcIik7XG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5jb25zdCBTbWFsbE1vZGFsID0gcmVxdWlyZShcIi4uLy4uL2xpYi9zbWFsbE1vZGFsXCIpO1xuXG5jb25zdCBNb2RlbCA9IEJhY2tib25lLkVwb3h5Lk1vZGVsLmV4dGVuZCh7XG5cdGlkQXR0cmlidXRlOiBcInNlc3Npb25faWRcIixcblxuXHR1cmxSb290OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvbG9naW4vc2Vzc2lvbnNcIjtcblx0fSxcblxuXHRjb21wdXRlZHM6IHtcblx0XHRpc0xvYWRlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5oYXMoXCJfaWRcIik7XG5cdFx0fSxcblx0XHRib29rR3JhZGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIGdyYWRlTWFwLmNvZGVUb0h1bWFuVmFsdWUodGhpcy5nZXQoXCJncmFkZVwiKSk7XG5cdFx0fSxcblx0fSxcbn0pO1xuXG5jb25zdCBDb2xsZWN0aW9uID0gQmFja2JvbmUuUGFnZWFibGVDb2xsZWN0aW9uLmV4dGVuZCh7XG5cdG1vZGVsOiBNb2RlbCxcblxuXHR1cmw6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9sb2dpbi9zZXNzaW9ucz9ncmlkPXRydWVcIjtcblx0fSxcblxuXHRzdGF0ZToge1xuXHRcdHBhZ2VTaXplOiAzMCxcblx0fSxcblx0bW9kZTogXCJzZXJ2ZXJcIixcblxuXHRxdWVyeVBhcmFtczoge1xuXHRcdHBhZ2VTaXplOiBcInBhZ2VTaXplXCIsXG5cdFx0c29ydEtleTogXCJzb3J0QnlcIixcblx0fSxcblxuXHRwYXJzZVN0YXRlOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0cmV0dXJuIHsgdG90YWxSZWNvcmRzOiByZXNwLnRvdGFsIH07XG5cdH0sXG5cblx0cGFyc2VSZWNvcmRzOiBmdW5jdGlvbihyZXNwKSB7XG5cdFx0cmV0dXJuIHJlc3Aucm93cztcblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0YWdOYW1lOiBcImRpdlwiLFxuXHRjbGFzc05hbWU6IFwiY29udGVudCBhY3RpdmUtc2Vzc2lvbnNcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9zZXNzaW9ucy5udW5qXCIpLFxuXG5cdHVpOiB7XG5cdFx0ZmlsdGVyQmFyOiBcIi5vcHMtYmFyIC5maWx0ZXJzXCIsXG5cdFx0Y291bnRlcjogXCIub3BzLWJhciAuY291bnRlclwiLFxuXHRcdHVwbG9hZGVyOiBcIi51cGxvYWRcIixcblx0XHRwYWdpbmc6IFwiLnBhZ2luZ1wiLFxuXHRcdGdyaWQ6IFwiZGl2LmdyaWRcIixcblx0fSxcblxuXHRjb2xsZWN0aW9uRXZlbnRzOiB7XG5cdFx0XCJ0b29sYmFyOmNsaWNrOmJsYWNrbGlzdFwiOiBcInJldm9rZVRva2VuXCIsXG5cdH0sXG5cblx0ZmlsdGVyUmV2b2tlOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdHJldHVybiAhbW9kZWwuZ2V0KFwicmV2b2tlZFwiKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgY29sdW1ucyA9IFtcblx0XHRcdHsgbmFtZTogXCJpcFwiLCBsYWJlbDogXCJJUFwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJ1c2VybmFtZVwiLCBsYWJlbDogXCJVc2VybmFtZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJjcmVhdGVkXCIsIGxhYmVsOiBcIkNyZWF0ZWRcIiwgY2VsbDogU2VydmVyR3JpZC5Nb21lbnRDZWxsLmV4dGVuZCh7XG5cdFx0XHRcdG1vZGVsSW5Vbml4VGltZXN0YW1wOiB0cnVlLFxuXHRcdFx0XHRkaXNwbGF5Rm9ybWF0OiBcIkREIE1NTSBZWVlZLCBISDptbTpzcyBhXCIsXG5cdFx0XHRcdGRpc3BsYXlJblVUQzogZmFsc2UsXG5cdFx0XHR9KSwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiZXhwaXJlc1wiLCBsYWJlbDogXCJFeHBpcmVzXCIsIGNlbGw6IFNlcnZlckdyaWQuTW9tZW50Q2VsbC5leHRlbmQoe1xuXHRcdFx0XHRtb2RlbEluVW5peFRpbWVzdGFtcDogdHJ1ZSxcblx0XHRcdFx0ZGlzcGxheUZvcm1hdDogXCJERCBNTU0gWVlZWSwgSEg6bW06c3MgYVwiLFxuXHRcdFx0XHRkaXNwbGF5SW5VVEM6IGZhbHNlLFxuXHRcdFx0fSksIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImltcGVyc29uYXRpbmdcIiwgbGFiZWw6IFwiSW1wZXJzb25hdGluZz9cIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwicGVycGV0dWFsXCIsIGxhYmVsOiBcIkZvcmV2ZXI/XCIsIGNlbGw6IFNlcnZlckdyaWQuQm9vbGVhbkljb25DZWxsLmV4dGVuZCh7fSksIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcInRyYW5zaWVudFwiLCBsYWJlbDogXCJUcmFuc2llbnQ/XCIsIGNlbGw6IFNlcnZlckdyaWQuQm9vbGVhbkljb25DZWxsLmV4dGVuZCh7fSksIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcIm9hdXRoXCIsIGxhYmVsOiBcIk9BdXRoP1wiLCBjZWxsOiBTZXJ2ZXJHcmlkLkJvb2xlYW5JY29uQ2VsbC5leHRlbmQoe30pLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJsb2dvdXRcIiwgbGFiZWw6IFwiTG9nb3V0XCIsIGNlbGw6IFNlcnZlckdyaWQuQm9vbGVhbkljb25DZWxsLmV4dGVuZCh7fSksIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcInJlbmV3YWxzXCIsIGxhYmVsOiBcIlJlbmV3YWxzXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImxhc3RfcmVuZXdhbFwiLCBsYWJlbDogXCJMYXN0IFJlbmV3YWxcIiwgY2VsbDogU2VydmVyR3JpZC5Nb21lbnRDZWxsLmV4dGVuZCh7XG5cdFx0XHRcdG1vZGVsSW5Vbml4VGltZXN0YW1wOiB0cnVlLFxuXHRcdFx0XHRkaXNwbGF5Rm9ybWF0OiBcIkREIE1NTSBZWVlZLCBISDptbTpzcyBhXCIsXG5cdFx0XHRcdGRpc3BsYXlJblVUQzogZmFsc2UsXG5cdFx0XHR9KSwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiYWN0aXZlXCIsIGxhYmVsOiBcIkFjdGl2ZT9cIiwgY2VsbDogU2VydmVyR3JpZC5Cb29sZWFuSWNvbkNlbGwuZXh0ZW5kKHt9KSwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiYmxhY2tsaXN0ZWRcIiwgbGFiZWw6IFwiQmxhY2tsaXN0ZWQ/XCIsIGNlbGw6IFNlcnZlckdyaWQuQm9vbGVhbkljb25DZWxsLmV4dGVuZCh7fSksIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBsYWJlbDogXCJBY3Rpb25zXCIsIGNlbGw6IG5ldyBTZXJ2ZXJHcmlkLlRvb2xiYXJDZWxsKHsgdG9vbHRpcHM6IFtcblx0XHRcdFx0eyB0aXRsZTogXCJCbGFja2xpc3RcIiwgaWNvbjogXCJmYS10aW1lc1wiLCBmaWx0ZXI6IHRoaXMuZmlsdGVyUmV2b2tlLmJpbmQodGhpcykgfSxcblx0XHRcdF0gfSksIGVkaXRhYmxlOiBmYWxzZSwgc29ydGFibGU6IGZhbHNlIH0sXG5cdFx0XTtcblxuXHRcdHRoaXMuZ3JpZCA9IG5ldyBTZXJ2ZXJHcmlkKHtcblx0XHRcdGVsOiB0aGlzLnVpLmdyaWQsXG5cdFx0XHRjb2x1bW5zOiBjb2x1bW5zLFxuXHRcdFx0Y29sbGVjdGlvbjogbmV3IENvbGxlY3Rpb24oKSxcblx0XHRcdGNsaWNrYWJsZTogZmFsc2UsXG5cdFx0XHRjb3VudGVyOiB7XG5cdFx0XHRcdGVsZW1lbnQ6IHRoaXMudWkuY291bnRlcixcblx0XHRcdFx0dGVtcGxhdGU6IFwiU2Vzc2lvbnMgJHN0YXJ0IC0gJGVuZCBvZiAkdG90YWxcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5wYWdpbmcsXG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5iaW5kRXZlbnRzKHRoaXMuZ3JpZC5jb2xsZWN0aW9uLCB0aGlzLmNvbGxlY3Rpb25FdmVudHMpO1xuXG5cdFx0Y29uc3QgdGV4dEZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwidGV4dFwiLFxuXHRcdFx0bmFtZTogXCJ0ZXh0RmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJUZXh0IFNlYXJjaFwiLFxuXHRcdFx0ZGVib3VuY2U6IDIwMCxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgZmlsdGVyTGlzdCA9IFt0ZXh0RmlsdGVyXTtcblxuXHRcdHRoaXMudWkuZmlsdGVyQmFyLnByZXBlbmQodGhpcy5ncmlkLmZpbHRlcih7XG5cdFx0XHRmaWx0ZXJDb250YWluZXI6IHRoaXMudWkuZmlsdGVyQmFyLFxuXHRcdFx0ZmlsdGVyczogZmlsdGVyTGlzdCxcblx0XHRcdGRlZmF1bHRGaWx0ZXJzOiBbXCJ0ZXh0RmlsdGVyXCJdLFxuXHRcdH0pLnJlbmRlcigpLmVsKTtcblx0fSxcblxuXHRyZXZva2VUb2tlbjogZnVuY3Rpb24obW9kZWwpIHtcblx0XHR0aGlzLm1vZGFsID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0d2FybmluZzogdHJ1ZSxcblx0XHRcdHRpdGxlOiBcIjxzcGFuIGNsYXNzPSdmYWwgZmEtdGltZXMnLz4gQmxhY2tsaXN0IEFjdGl2ZSBTZXNzaW9uczogXCIgKyBtb2RlbC5nZXQoXCJ1c2VybmFtZVwiKSxcblx0XHRcdGJvZHk6IFwiPHA+VGhpcyB3aWxsIGJsYWNrbGlzdCBhbGwgYWN0aXZlIHNlc3Npb25zIGZvciB0aGUgbmFtZWQgdXNlci4gVGhleSB3aWxsIGJlIGZvcmNlZCB0byBsb2cgaW4gYWdhaW4gbWFudWFsbHkgb24gYWxsIGxvY2F0aW9ucywgaW5jbHVkaW5nIHRoZSBhcHBzLjwvcD5cIixcblx0XHRcdHBlcnNpc3Q6IHRydWUsXG5cdFx0fSk7XG5cblx0XHR0aGlzLm1vZGFsLm9uKFwiYnV0dG9uOm9rXCIsICgpID0+IHtcblx0XHRcdG1vZGVsLmRlc3Ryb3koe1xuXHRcdFx0XHR1cmw6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2xvZ2luL3Nlc3Npb25zL1wiICsgbW9kZWwuaWQsXG5cdFx0XHRcdHdhaXQ6IHRydWUsXG5cdFx0XHRcdHN1Y2Nlc3M6IHRoaXMucmV2b2NhdGlvblN1Y2Nlc3MuYmluZCh0aGlzKSxcblx0XHRcdFx0ZXJyb3I6IHRoaXMucmV2b2NhdGlvbkVycm9yLmJpbmQodGhpcyksXG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdHRoaXMubW9kYWwuc2hvdygpO1xuXHR9LFxuXG5cdHJldm9jYXRpb25TdWNjZXNzOiBmdW5jdGlvbihtb2RlbCwgZGF0YSkge1xuXHRcdHRoaXMubW9kYWwuZGVzdHJveSgpO1xuXG5cdFx0aWYgKGRhdGEuZG9Mb2dvdXQpIHtcblx0XHRcdC8vIEN1cnJlbnQgdXNlciByZXZva2VkXG5cdFx0XHR3aW5kb3cubG9jYXRpb24uaHJlZiA9IHNldHRpbmdzLnVybFJvb3QgKyBcIi9sb2dpblwiO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuZ3JpZC5jb2xsZWN0aW9uLmdldEZpcnN0UGFnZSgpO1xuXHR9LFxuXG5cdHJldm9jYXRpb25FcnJvcjogZnVuY3Rpb24obW9kZWwsIHhocikge1xuXHRcdGNvbnN0IGFuc3dlciA9IEFwcC5wYXJzZVJlc3BvbnNlKHhocik7XG5cdFx0dGhpcy5tb2RhbC5zaG93RXJyb3IoXCJSZXZvY2F0aW9uIGZhaWxlZDogXCIgKyAoYW5zd2VyLmRldGFpbCB8fCBhbnN3ZXIuaW5mbykpO1xuXHR9LFxufSk7Il19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar moment = require(\"moment\");\n\nvar settings = require(\"app-settings\");\n\nvar Actions = Backbone.Collection.extend({\n\tinitialize: function initialize(models, options) {\n\t\tthis.identifier = options.identifier;\n\t},\n\tmodel: Backbone.Model,\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/tokens/tranches/\" + this.identifier + \"/changes\";\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttemplate: require(\"../templates/trancheChanges.nunj\"),\n\n\tclassName: \"changelog-modal\",\n\n\tui: {\n\t\titem: \".item\",\n\t\tsearch: \"input\",\n\t\toverlay: \"div.input-overlay\"\n\t},\n\n\tevents: {\n\t\t\"click button.ok\": \"skip\",\n\t\t\"mouseover @ui.item\": \"showFullDate\",\n\t\t\"mouseout @ui.item\": \"hideFullDate\",\n\t\t\"input @ui.search\": \"search\",\n\n\t\t\"click label @ui.overlay\": \"clearBox\"\n\t},\n\n\tcollectionEvents: {\n\t\treset: \"render\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\treturn {\n\t\t\tfromNow: function fromNow(dt) {\n\t\t\t\treturn moment.unix(dt).utc().format(\"DD MMM YYYY, HH:mm a\");\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.host = options.host || \"#modals\";\n\n\t\tthis.items = new Actions([], {\n\t\t\tidentifier: this.model.get(\"tranche_token_id\")\n\t\t});\n\n\t\tthis.collection = new Backbone.VirtualCollection(this.items, {});\n\n\t\tthis.bindEvents(this.collection, this.collectionEvents);\n\n\t\tthis.xhr = this.items.fetch({ reset: true });\n\t},\n\n\tserializeData: function serializeData() {\n\t\treturn {\n\t\t\titems: this.collection ? this.collection.toJSON() : undefined,\n\t\t\tmodel: this.model.toJSON(),\n\t\t\tsearchText: this.searchText || \"\"\n\t\t};\n\t},\n\n\tclearBox: function clearBox(evt) {\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\n\t\tvar el = $(evt.currentTarget);\n\t\tthis.ui.overlay.addClass(\"hide\");\n\t\tel.siblings(\"input\").val(\"\");\n\t\tthis.search();\n\t},\n\n\tshow: function show() {\n\t\t$(\".modal-container\", $(this.host)).append(this.render().el);\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this = this;\n\n\t\t// Render a background\n\t\t$(\".modal-element\", $(this.host)).removeClass(\"hide\");\n\t\t$(\"body\").addClass(\"hide-overflow\");\n\n\t\tif (this.options.classNames) this.$el.addClass(this.options.classNames);\n\n\t\t// If there's any other modals visible right now, hide them, and restore it after\n\t\tthis.dunked = $.map($(\".modal-container\", $(this.host)).children(), function (item) {\n\t\t\tif ($(item).is(_this.$el)) return;\n\t\t\t$(item).addClass(\"hide\");\n\t\t\treturn $(item).getPath();\n\t\t});\n\n\t\tthis.trigger(\"rendered\", this);\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tif (this.xhr) this.xhr.abort();\n\t},\n\n\tonDestroy: function onDestroy() {\n\t\t// Clean up the background\n\t\tif (this.dunked && this.dunked.length === 0) {\n\t\t\t$(\".modal-element\", $(this.host)).addClass(\"hide\");\n\t\t\t$(\"body\").removeClass(\"hide-overflow\");\n\t\t}\n\n\t\tif (this.dunked) {\n\t\t\t_.each(this.dunked, function (item) {\n\t\t\t\tif (!item) return;\n\t\t\t\tvar el = $(item);\n\t\t\t\tif (el && el.length) el.removeClass(\"hide\");\n\t\t\t});\n\t\t}\n\t},\n\n\tskip: function skip() {\n\t\tthis.trigger(\"action\", \"skip\");\n\t\tthis.destroy();\n\t},\n\n\tsearch: _.debounce(function () {\n\t\tvar _this2 = this;\n\n\t\t/* eslint-disable no-invalid-this */\n\n\t\tthis.searchText = _.trim(this.ui.search.val() || \"\").toLowerCase();\n\t\tif (!this.searchText) {\n\t\t\tthis.collection.updateFilter({});\n\t\t\tthis.render();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.collection.updateFilter(function (x) {\n\t\t\treturn _.every(_this2.searchText.split(\" \"), function (y) {\n\t\t\t\treturn _.includes(x.get(\"action\").toLowerCase(), y) || x.get(\"user\") && _.includes(x.get(\"user\").toLowerCase(), y);\n\t\t\t});\n\t\t});\n\n\t\tthis.render();\n\t\tthis.delegateEvents();\n\n\t\tthis.ui.search.focus();\n\n\t\t/* eslint-enable no-invalid-this */\n\t}, 500)\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRyYW5jaGVDaGFuZ2VzLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIiQiLCJfIiwibW9tZW50Iiwic2V0dGluZ3MiLCJBY3Rpb25zIiwiQ29sbGVjdGlvbiIsImV4dGVuZCIsImluaXRpYWxpemUiLCJtb2RlbHMiLCJvcHRpb25zIiwiaWRlbnRpZmllciIsIm1vZGVsIiwiTW9kZWwiLCJ1cmwiLCJ1cmxSb290IiwibW9kdWxlIiwiZXhwb3J0cyIsIk1hcmlvbmV0dGUiLCJWaWV3IiwidGVtcGxhdGUiLCJjbGFzc05hbWUiLCJ1aSIsIml0ZW0iLCJzZWFyY2giLCJvdmVybGF5IiwiZXZlbnRzIiwiY29sbGVjdGlvbkV2ZW50cyIsInJlc2V0IiwidGVtcGxhdGVDb250ZXh0IiwiZnJvbU5vdyIsImR0IiwidW5peCIsInV0YyIsImZvcm1hdCIsImhvc3QiLCJpdGVtcyIsImdldCIsImNvbGxlY3Rpb24iLCJWaXJ0dWFsQ29sbGVjdGlvbiIsImJpbmRFdmVudHMiLCJ4aHIiLCJmZXRjaCIsInNlcmlhbGl6ZURhdGEiLCJ0b0pTT04iLCJ1bmRlZmluZWQiLCJzZWFyY2hUZXh0IiwiY2xlYXJCb3giLCJldnQiLCJzdG9wUHJvcGFnYXRpb24iLCJwcmV2ZW50RGVmYXVsdCIsImVsIiwiY3VycmVudFRhcmdldCIsImFkZENsYXNzIiwic2libGluZ3MiLCJ2YWwiLCJzaG93IiwiYXBwZW5kIiwicmVuZGVyIiwib25SZW5kZXIiLCJyZW1vdmVDbGFzcyIsImNsYXNzTmFtZXMiLCIkZWwiLCJkdW5rZWQiLCJtYXAiLCJjaGlsZHJlbiIsImlzIiwiZ2V0UGF0aCIsInRyaWdnZXIiLCJvbkJlZm9yZURlc3Ryb3kiLCJhYm9ydCIsIm9uRGVzdHJveSIsImxlbmd0aCIsImVhY2giLCJza2lwIiwiZGVzdHJveSIsImRlYm91bmNlIiwidHJpbSIsInRvTG93ZXJDYXNlIiwidXBkYXRlRmlsdGVyIiwiZXZlcnkiLCJzcGxpdCIsImluY2x1ZGVzIiwieCIsInki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Q00sQ0FBMUMsQ0FBRCxJQUFtREQsRUFBRTlDLEdBQUYsQ0FBTSxNQUFOLEtBQWlCbkMsRUFBRWdGLFFBQUYsQ0FBV0MsRUFBRTlDLEdBQUYsQ0FBTSxNQUFOLEVBQWN5QyxXQUFkLEVBQVgsRUFBd0NNLENBQXhDLENBREM7QUFBQSxJQUFwQyxDQUFMO0FBQUEsR0FBN0I7O0FBR0EsT0FBSzFCLE1BQUw7QUFDQSxPQUFLMkIsY0FBTDs7QUFFQSxPQUFLL0QsRUFBTCxDQUFRRSxNQUFSLENBQWU4RCxLQUFmOztBQUVBO0FBQ0EsRUFuQk8sRUFtQkwsR0FuQks7QUFuSHdDLENBQWhDLENBQWpCIiwiZmlsZSI6InRyYW5jaGVDaGFuZ2VzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5jb25zdCBtb21lbnQgPSByZXF1aXJlKFwibW9tZW50XCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IEFjdGlvbnMgPSBCYWNrYm9uZS5Db2xsZWN0aW9uLmV4dGVuZCh7XG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG1vZGVscywgb3B0aW9ucykge1xuXHRcdHRoaXMuaWRlbnRpZmllciA9IG9wdGlvbnMuaWRlbnRpZmllcjtcblx0fSxcblx0bW9kZWw6IEJhY2tib25lLk1vZGVsLFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3Rva2Vucy90cmFuY2hlcy9cIiArIHRoaXMuaWRlbnRpZmllciArIFwiL2NoYW5nZXNcIjtcblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy90cmFuY2hlQ2hhbmdlcy5udW5qXCIpLFxuXG5cdGNsYXNzTmFtZTogXCJjaGFuZ2Vsb2ctbW9kYWxcIixcblxuXHR1aToge1xuXHRcdGl0ZW06IFwiLml0ZW1cIixcblx0XHRzZWFyY2g6IFwiaW5wdXRcIixcblx0XHRvdmVybGF5OiBcImRpdi5pbnB1dC1vdmVybGF5XCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBidXR0b24ub2tcIjogXCJza2lwXCIsXG5cdFx0XCJtb3VzZW92ZXIgQHVpLml0ZW1cIjogXCJzaG93RnVsbERhdGVcIixcblx0XHRcIm1vdXNlb3V0IEB1aS5pdGVtXCI6IFwiaGlkZUZ1bGxEYXRlXCIsXG5cdFx0XCJpbnB1dCBAdWkuc2VhcmNoXCI6IFwic2VhcmNoXCIsXG5cblx0XHRcImNsaWNrIGxhYmVsIEB1aS5vdmVybGF5XCI6IFwiY2xlYXJCb3hcIixcblx0fSxcblxuXHRjb2xsZWN0aW9uRXZlbnRzOiB7XG5cdFx0cmVzZXQ6IFwicmVuZGVyXCIsXG5cdH0sXG5cblx0dGVtcGxhdGVDb250ZXh0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0ZnJvbU5vdzogZnVuY3Rpb24oZHQpIHtcblx0XHRcdFx0cmV0dXJuIG1vbWVudC51bml4KGR0KS51dGMoKS5mb3JtYXQoXCJERCBNTU0gWVlZWSwgSEg6bW0gYVwiKTtcblx0XHRcdH0sXG5cdFx0fTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5ob3N0ID0gb3B0aW9ucy5ob3N0IHx8IFwiI21vZGFsc1wiO1xuXG5cdFx0dGhpcy5pdGVtcyA9IG5ldyBBY3Rpb25zKFtdLCB7XG5cdFx0XHRpZGVudGlmaWVyOiB0aGlzLm1vZGVsLmdldChcInRyYW5jaGVfdG9rZW5faWRcIiksXG5cdFx0fSk7XG5cblx0XHR0aGlzLmNvbGxlY3Rpb24gPSBuZXcgQmFja2JvbmUuVmlydHVhbENvbGxlY3Rpb24odGhpcy5pdGVtcywge30pO1xuXG5cdFx0dGhpcy5iaW5kRXZlbnRzKHRoaXMuY29sbGVjdGlvbiwgdGhpcy5jb2xsZWN0aW9uRXZlbnRzKTtcblxuXHRcdHRoaXMueGhyID0gdGhpcy5pdGVtcy5mZXRjaCh7IHJlc2V0OiB0cnVlIH0pO1xuXHR9LFxuXG5cdHNlcmlhbGl6ZURhdGE6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRpdGVtczogdGhpcy5jb2xsZWN0aW9uID8gdGhpcy5jb2xsZWN0aW9uLnRvSlNPTigpIDogdW5kZWZpbmVkLFxuXHRcdFx0bW9kZWw6IHRoaXMubW9kZWwudG9KU09OKCksXG5cdFx0XHRzZWFyY2hUZXh0OiB0aGlzLnNlYXJjaFRleHQgfHwgXCJcIixcblx0XHR9O1xuXHR9LFxuXG5cdGNsZWFyQm94OiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0ZXZ0LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRjb25zdCBlbCA9ICQoZXZ0LmN1cnJlbnRUYXJnZXQpO1xuXHRcdHRoaXMudWkub3ZlcmxheS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0ZWwuc2libGluZ3MoXCJpbnB1dFwiKS52YWwoXCJcIik7XG5cdFx0dGhpcy5zZWFyY2goKTtcblx0fSxcblxuXHRzaG93OiBmdW5jdGlvbigpIHtcblx0XHQkKFwiLm1vZGFsLWNvbnRhaW5lclwiLCAkKHRoaXMuaG9zdCkpLmFwcGVuZCh0aGlzLnJlbmRlcigpLmVsKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gUmVuZGVyIGEgYmFja2dyb3VuZFxuXHRcdCQoXCIubW9kYWwtZWxlbWVudFwiLCAkKHRoaXMuaG9zdCkpLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHQkKFwiYm9keVwiKS5hZGRDbGFzcyhcImhpZGUtb3ZlcmZsb3dcIik7XG5cblx0XHRpZiAodGhpcy5vcHRpb25zLmNsYXNzTmFtZXMpXG5cdFx0XHR0aGlzLiRlbC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuY2xhc3NOYW1lcyk7XG5cblx0XHQvLyBJZiB0aGVyZSdzIGFueSBvdGhlciBtb2RhbHMgdmlzaWJsZSByaWdodCBub3csIGhpZGUgdGhlbSwgYW5kIHJlc3RvcmUgaXQgYWZ0ZXJcblx0XHR0aGlzLmR1bmtlZCA9ICQubWFwKCQoXCIubW9kYWwtY29udGFpbmVyXCIsICQodGhpcy5ob3N0KSkuY2hpbGRyZW4oKSwgaXRlbSA9PiB7XG5cdFx0XHRpZiAoJChpdGVtKS5pcyh0aGlzLiRlbCkpXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdCQoaXRlbSkuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0cmV0dXJuICQoaXRlbSkuZ2V0UGF0aCgpO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy50cmlnZ2VyKFwicmVuZGVyZWRcIiwgdGhpcyk7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy54aHIpXG5cdFx0XHR0aGlzLnhoci5hYm9ydCgpO1xuXHR9LFxuXG5cdG9uRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gQ2xlYW4gdXAgdGhlIGJhY2tncm91bmRcblx0XHRpZiAodGhpcy5kdW5rZWQgJiYgdGhpcy5kdW5rZWQubGVuZ3RoID09PSAwKSB7XG5cdFx0XHQkKFwiLm1vZGFsLWVsZW1lbnRcIiwgJCh0aGlzLmhvc3QpKS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHQkKFwiYm9keVwiKS5yZW1vdmVDbGFzcyhcImhpZGUtb3ZlcmZsb3dcIik7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuZHVua2VkKSB7XG5cdFx0XHRfLmVhY2godGhpcy5kdW5rZWQsIGl0ZW0gPT4ge1xuXHRcdFx0XHRpZiAoIWl0ZW0pXG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRjb25zdCBlbCA9ICQoaXRlbSk7XG5cdFx0XHRcdGlmIChlbCAmJiBlbC5sZW5ndGgpXG5cdFx0XHRcdFx0ZWwucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdHNraXA6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudHJpZ2dlcihcImFjdGlvblwiLCBcInNraXBcIik7XG5cdFx0dGhpcy5kZXN0cm95KCk7XG5cdH0sXG5cblx0c2VhcmNoOiBfLmRlYm91bmNlKGZ1bmN0aW9uKCkge1xuXHRcdC8qIGVzbGludC1kaXNhYmxlIG5vLWludmFsaWQtdGhpcyAqL1xuXG5cdFx0dGhpcy5zZWFyY2hUZXh0ID0gXy50cmltKHRoaXMudWkuc2VhcmNoLnZhbCgpIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCk7XG5cdFx0aWYgKCF0aGlzLnNlYXJjaFRleHQpIHtcblx0XHRcdHRoaXMuY29sbGVjdGlvbi51cGRhdGVGaWx0ZXIoe30pO1xuXHRcdFx0dGhpcy5yZW5kZXIoKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLmNvbGxlY3Rpb24udXBkYXRlRmlsdGVyKHggPT4gXy5ldmVyeSh0aGlzLnNlYXJjaFRleHQuc3BsaXQoXCIgXCIpLCB5ID0+XG5cdFx0XHQoXy5pbmNsdWRlcyh4LmdldChcImFjdGlvblwiKS50b0xvd2VyQ2FzZSgpLCB5KSkgfHwgKHguZ2V0KFwidXNlclwiKSAmJiBfLmluY2x1ZGVzKHguZ2V0KFwidXNlclwiKS50b0xvd2VyQ2FzZSgpLCB5KSkpKTtcblxuXHRcdHRoaXMucmVuZGVyKCk7XG5cdFx0dGhpcy5kZWxlZ2F0ZUV2ZW50cygpO1xuXG5cdFx0dGhpcy51aS5zZWFyY2guZm9jdXMoKTtcblxuXHRcdC8qIGVzbGludC1lbmFibGUgbm8taW52YWxpZC10aGlzICovXG5cdH0sIDUwMCksXG59KTsiXX0=",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar rester = require(\"rester\");\n\nvar settings = require(\"app-settings\");\n\nvar ActionHeader = require(\"../../lib/actionHeader\");\nvar ActionTitle = require(\"../../lib/actionTitle\");\nvar ErrorView = require(\"../../lib/errorView\");\nvar StatusView = require(\"../../lib/statusView\");\n\n// ----------------------------------------------------------------------------\n// Data\n// ----------------------------------------------------------------------------\nvar RoleModel = Backbone.Model.extend({\n\tdefaults: {}\n});\n\nvar RoleCollection = Backbone.Collection.extend({\n\tmodel: RoleModel\n});\n\nvar PermissionModel = Backbone.Model.extend({\n\tdefaults: {}\n});\n\nvar PermissionCollection = Backbone.Collection.extend({\n\tmodel: PermissionModel\n});\n\nvar AccessValueModel = Backbone.Model.extend({\n\tdefaults: {}\n});\n\nvar AccessValueCollection = Backbone.Collection.extend({\n\tmodel: AccessValueModel\n});\n\nvar AccessRowModel = Backbone.Model.extend({\n\tdefaults: {}\n});\n\nvar AccessRowCollection = Backbone.Collection.extend({\n\tmodel: AccessRowModel\n});\n\n// ----------------------------------------------------------------------------\n// Access List\n// ----------------------------------------------------------------------------\nvar AccessMatrixValue = Backbone.Marionette.View.extend({\n\tclassName: \"access-matrix-value\",\n\n\ttemplate: require(\"../templates/userRoleViewer.nunj\").accessMatrixValue\n});\n\nvar AccessMatrixRow = Backbone.Marionette.CollectionView.extend({\n\tclassName: \"access-matrix-row\",\n\n\tchildView: AccessMatrixValue,\n\n\tchildViewOptions: function childViewOptions() {\n\t\treturn {\n\t\t\tcollection: this.collection\n\t\t};\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.collection = new AccessValueCollection(this.model.get(\"accessValues\"));\n\t}\n});\n\nvar AccessMatrix = Backbone.Marionette.CollectionView.extend({\n\tclassName: \"user-role-viewer-access-matrix\",\n\n\tchildView: AccessMatrixRow,\n\n\tevents: {\n\t\tscroll: \"onScroll\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.eventBus = options.eventBus;\n\t},\n\n\tonScroll: function onScroll() {\n\t\tthis.eventBus.trigger(\"accessMatrix:scroll\", {\n\t\t\tscrollTop: this.$el.get(0).scrollTop,\n\t\t\tscrollLeft: this.$el.get(0).scrollLeft\n\t\t});\n\t}\n});\n\n// ----------------------------------------------------------------------------\n// Permission List\n// ----------------------------------------------------------------------------\nvar PermissionListItem = Backbone.Marionette.View.extend({\n\tclassName: \"permission-list-item\",\n\n\ttemplate: require(\"../templates/userRoleViewer.nunj\").permissionListItem\n});\n\nvar PermissionList = Backbone.Marionette.CollectionView.extend({\n\tclassName: \"user-role-viewer-permission-list\",\n\n\tchildView: PermissionListItem,\n\n\tinitialize: function initialize(options) {\n\t\tthis.eventBus = options.eventBus;\n\n\t\tthis.listenTo(this.eventBus, \"accessMatrix:scroll\", this.onAccessMatrixScroll.bind(this));\n\t},\n\n\tonAccessMatrixScroll: function onAccessMatrixScroll(scrollOffset) {\n\t\tthis.$el.get(0).scrollLeft = scrollOffset.scrollLeft;\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(this.eventBus);\n\t}\n});\n\n// ----------------------------------------------------------------------------\n// Role List\n// ----------------------------------------------------------------------------\nvar RoleListItem = Backbone.Marionette.View.extend({\n\tclassName: \"role-list-item\",\n\n\ttemplate: require(\"../templates/userRoleViewer.nunj\").roleListItem\n});\n\nvar RoleList = Backbone.Marionette.CollectionView.extend({\n\tclassName: \"user-role-viewer-role-list\",\n\n\tchildView: RoleListItem,\n\n\tinitialize: function initialize(options) {\n\t\tthis.eventBus = options.eventBus;\n\n\t\tthis.listenTo(this.eventBus, \"accessMatrix:scroll\", this.onAccessMatrixScroll.bind(this));\n\t},\n\n\tonAccessMatrixScroll: function onAccessMatrixScroll(scrollOffset) {\n\t\tthis.$el.get(0).scrollTop = scrollOffset.scrollTop;\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.stopListening(this.eventBus);\n\t}\n});\n\n// ----------------------------------------------------------------------------\n// Grid\n// ----------------------------------------------------------------------------\nvar Grid = Backbone.Marionette.View.extend({\n\tclassName: \"user-role-viewer-grid\",\n\n\ttemplate: require(\"../templates/userRoleViewer.nunj\").grid,\n\n\tregions: {\n\t\theader: \".header-region\",\n\t\trole: \".role-region\",\n\t\tvalue: \".value-region\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.accessRowCollection = options.accessRowCollection;\n\t\tthis.eventBus = options.eventBus;\n\t\tthis.permissionCollection = options.permissionCollection;\n\t\tthis.roleCollection = options.roleCollection;\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.permissionList = new PermissionList({\n\t\t\tcollection: this.permissionCollection,\n\t\t\teventBus: this.eventBus\n\t\t});\n\t\tthis.showChildView(\"header\", this.permissionList);\n\n\t\tthis.roleList = new RoleList({\n\t\t\tcollection: this.roleCollection,\n\t\t\teventBus: this.eventBus\n\t\t});\n\t\tthis.showChildView(\"role\", this.roleList);\n\n\t\tthis.accessMatrix = new AccessMatrix({\n\t\t\tcollection: this.accessRowCollection,\n\t\t\teventBus: this.eventBus\n\t\t});\n\t\tthis.showChildView(\"value\", this.accessMatrix);\n\t}\n});\n\n// ----------------------------------------------------------------------------\n// Header\n// ----------------------------------------------------------------------------\nvar Header = ActionHeader.extend({\n\ttitleView: function titleView() {\n\t\treturn ActionTitle;\n\t},\n\n\tonTitleReady: function onTitleReady() {\n\t\tthis.eventBus.trigger(\"action-title:change-glyph\", \"fa-users\");\n\t\tthis.eventBus.trigger(\"action-title:change-title\", \"User Role Viewer\");\n\t}\n});\n\n// ----------------------------------------------------------------------------\n// Controller\n// ----------------------------------------------------------------------------\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"content user-role-viewer\",\n\n\ttemplate: require(\"../templates/userRoleViewer.nunj\").layout,\n\n\tregions: {\n\t\tstatus: \".status-region\",\n\t\theader: \".header-region\",\n\t\tcontent: \".content-region\"\n\t},\n\n\tui: {\n\t\tstatusRegion: \".status-region\",\n\t\theaderRegion: \".header-region\",\n\t\tcontentRegion: \".content-region\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.eventBus = new Backbone.Marionette.Object();\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this = this;\n\n\t\t$(\"footer\", document).addClass(\"hide\");\n\n\t\tthis.renderLoadingStatus();\n\n\t\tthis.roleCollection = new RoleCollection(_.flatMap(settings.roles, function (r, k) {\n\t\t\tvar result = [];\n\n\t\t\tif (k !== \"*\") {\n\t\t\t\tresult = {\n\t\t\t\t\tid: k,\n\t\t\t\t\tname: r.name,\n\t\t\t\t\tpermissions: r.permissions\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}));\n\n\t\tvar extractPermissions = function extractPermissions(permissions, prefix) {\n\t\t\treturn _.map(permissions, function (s, k) {\n\t\t\t\tvar name = prefix === undefined ? k : prefix + \".\" + k;\n\t\t\t\treturn s === \"\" ? [{ name: name }] : extractPermissions(s, name);\n\t\t\t});\n\t\t};\n\n\t\tthis.permissionCollection = new PermissionCollection(_.flattenDeep(extractPermissions(settings.permissions)));\n\t\tthis.permissionCollection.comparator = \"name\";\n\t\tthis.permissionCollection.sort();\n\n\t\tthis.accessRowCollection = new AccessRowCollection();\n\n\t\tthis.roleCollection.each(function (roleModel) {\n\t\t\tvar accessValues = [];\n\n\t\t\t_this.permissionCollection.each(function (permissionModel) {\n\t\t\t\tvar abstractUser = {\n\t\t\t\t\troles: [roleModel.get(\"id\")]\n\t\t\t\t};\n\n\t\t\t\taccessValues.push({\n\t\t\t\t\thasAccess: rester.hasAccess(permissionModel.get(\"name\"), abstractUser)\n\t\t\t\t});\n\t\t\t});\n\n\t\t\t_this.accessRowCollection.add({ accessValues: accessValues });\n\t\t});\n\n\t\tthis.renderPage();\n\t},\n\n\trenderLoadingStatus: function renderLoadingStatus() {\n\t\tthis.showChildView(\"status\", new StatusView({ type: \"loading\" }));\n\t},\n\n\trenderError: function renderError(error) {\n\t\tthis.showChildView(\"status\", new ErrorView({ fetchError: error }));\n\t},\n\n\trenderPage: function renderPage() {\n\t\tthis.ui.statusRegion.addClass(\"hide\");\n\t\tthis.ui.headerRegion.removeClass(\"hide\");\n\t\tthis.ui.contentRegion.removeClass(\"hide\");\n\n\t\t// Create the header\n\t\tthis.header = new Header({ eventBus: this.eventBus });\n\t\tthis.showChildView(\"header\", this.header);\n\n\t\t// Create the grid\n\t\tthis.grid = new Grid({\n\t\t\taccessRowCollection: this.accessRowCollection,\n\t\t\teventBus: this.eventBus,\n\t\t\tpermissionCollection: this.permissionCollection,\n\t\t\troleCollection: this.roleCollection\n\t\t});\n\t\tthis.showChildView(\"content\", this.grid);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInVzZXJSb2xlVmlld2VyLmpzIl0sIm5hbWVzIjpbIiQiLCJyZXF1aXJlIiwiXyIsIkJhY2tib25lIiwicmVzdGVyIiwic2V0dGluZ3MiLCJBY3Rpb25IZWFkZXIiLCJBY3Rpb25UaXRsZSIsIkVycm9yVmlldyIsIlN0YXR1c1ZpZXciLCJSb2xlTW9kZWwiLCJNb2RlbCIsImV4dGVuZCIsImRlZmF1bHRzIiwiUm9sZUNvbGxlY3Rpb24iLCJDb2xsZWN0aW9uIiwibW9kZWwiLCJQZXJtaXNzaW9uTW9kZWwiLCJQZXJtaXNzaW9uQ29sbGVjdGlvbiIsIkFjY2Vzc1ZhbHVlTW9kZWwiLCJBY2Nlc3NWYWx1ZUNvbGxlY3Rpb24iLCJBY2Nlc3NSb3dNb2RlbCIsIkFjY2Vzc1Jvd0NvbGxlY3Rpb24iLCJBY2Nlc3NNYXRyaXhWYWx1ZSIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiY2xhc3NOYW1lIiwidGVtcGxhdGUiLCJhY2Nlc3NNYXRyaXhWYWx1ZSIsIkFjY2Vzc01hdHJpeFJvdyIsIkNvbGxlY3Rpb25WaWV3IiwiY2hpbGRWaWV3IiwiY2hpbGRWaWV3T3B0aW9ucyIsImNvbGxlY3Rpb24iLCJpbml0aWFsaXplIiwiZ2V0IiwiQWNjZXNzTWF0cml4IiwiZXZlbnRzIiwic2Nyb2xsIiwib3B0aW9ucyIsImV2ZW50QnVzIiwib25TY3JvbGwiLCJ0cmlnZ2VyIiwic2Nyb2xsVG9wIiwiJGVsIiwic2Nyb2xsTGVmdCIsIlBlcm1pc3Npb25MaXN0SXRlbSIsInBlcm1pc3Npb25MaXN0SXRlbSIsIlBlcm1pc3Npb25MaXN0IiwibGlzdGVuVG8iLCJvbkFjY2Vzc01hdHJpeFNjcm9sbCIsImJpbmQiLCJzY3JvbGxPZmZzZXQiLCJvbkJlZm9yZURlc3Ryb3kiLCJzdG9wTGlzdGVuaW5nIiwiUm9sZUxpc3RJdGVtIiwicm9sZUxpc3RJdGVtIiwiUm9sZUxpc3QiLCJHcmlkIiwiZ3JpZCIsInJlZ2lvbnMiLCJoZWFkZXIiLCJyb2xlIiwidmFsdWUiLCJhY2Nlc3NSb3dDb2xsZWN0aW9uIiwicGVybWlzc2lvbkNvbGxlY3Rpb24iLCJyb2xlQ29sbGVjdGlvbiIsIm9uUmVuZGVyIiwicGVybWlzc2lvbkxpc3QiLCJzaG93Q2hpbGRWaWV3Iiwicm9sZUxpc3QiLCJhY2Nlc3NNYXRyaXgiLCJIZWFkZXIiLCJ0aXRsZVZpZXciLCJvblRpdGxlUmVhZHkiLCJtb2R1bGUiLCJleHBvcnRzIiwibGF5b3V0Iiwic3RhdHVzIiwiY29udGVudCIsInVpIiwic3RhdHVzUmVnaW9uIiwiaGVhZGVyUmVnaW9uIiwiY29udGVudFJlZ2lvbiIsIk9iamVjdCIsImRvY3VtZW50IiwiYWRkQ2xhc3MiLCJyZW5kZXJMb2FkaW5nU3RhdHVzIiwiZmxhdE1hcCIsInJvbGVzIiwiciIsImsiLCJyZXN1bHQiLCJpZCIsIm5hbWUiLCJwZXJtaXNzaW9ucyIsImV4dHJhY3RQZXJtaXNzaW9ucyIsInByZWZpeCIsIm1hcCIsInMiLCJ1bmRlZmluZWQiLCJmbGF0dGVuRGVlcCIsImNvbXBhcmF0b3IiLCJzb3J0IiwiZWFjaCIsImFjY2Vzc1ZhbHVlcyIsImFic3RyYWN0VXNlciIsInJvbGVNb2RlbCIsInB1c2giLCJoYXNBY2Nlc3MiLCJwZXJtaXNzaW9uTW9kZWwiLCJhZGQiLCJyZW5kZXJQYWdlIiwidHlwZSIsInJlbmRlckVycm9yIiwiZXJyb3IiLCJmZXRjaEVycm9yIiwicmVtb3ZlQ2xhc3MiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsSUFBSUQsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNRSxXQUFXRixRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNRyxTQUFTSCxRQUFRLFFBQVIsQ0FBZjs7QUFFQSxJQUFNSSxXQUFXSixRQUFRLGNBQVIsQ0FBakI7O0FBRUEsSUFBTUssZUFBZUwsUUFBUSx3QkFBUixDQUFyQjtBQUNBLElBQU1NLGNBQWNOLFFBQVEsdUJBQVIsQ0FBcEI7QUFDQSxJQUFNTyxZQUFZUCxRQUFRLHFCQUFSLENBQWxCO0FBQ0Es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QkFETjtBQUVwQnhCLGFBQVUsS0FBS0EsUUFGSztBQUdwQnlCLHlCQUFzQixLQUFLQSxvQkFIUDtBQUlwQkMsbUJBQWdCLEtBQUtBO0FBSkQsR0FBVCxDQUFaO0FBTUEsT0FBS0csYUFBTCxDQUFtQixTQUFuQixFQUE4QixLQUFLVixJQUFuQztBQUNBO0FBakcrQyxDQUFoQyxDQUFqQiIsImZpbGUiOiJ1c2VyUm9sZVZpZXdlci5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgcmVzdGVyID0gcmVxdWlyZShcInJlc3RlclwiKTtcblxuY29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuXG5jb25zdCBBY3Rpb25IZWFkZXIgPSByZXF1aXJlKFwiLi4vLi4vbGliL2FjdGlvbkhlYWRlclwiKTtcbmNvbnN0IEFjdGlvblRpdGxlID0gcmVxdWlyZShcIi4uLy4uL2xpYi9hY3Rpb25UaXRsZVwiKTtcbmNvbnN0IEVycm9yVmlldyA9IHJlcXVpcmUoXCIuLi8uLi9saWIvZXJyb3JWaWV3XCIpO1xuY29uc3QgU3RhdHVzVmlldyA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc3RhdHVzVmlld1wiKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRGF0YVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuY29uc3QgUm9sZU1vZGVsID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHt9LFxufSk7XG5cbmNvbnN0IFJvbGVDb2xsZWN0aW9uID0gQmFja2JvbmUuQ29sbGVjdGlvbi5leHRlbmQoe1xuXHRtb2RlbDogUm9sZU1vZGVsLFxufSk7XG5cbmNvbnN0IFBlcm1pc3Npb25Nb2RlbCA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7fSxcbn0pO1xuXG5jb25zdCBQZXJtaXNzaW9uQ29sbGVjdGlvbiA9IEJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IFBlcm1pc3Npb25Nb2RlbCxcbn0pO1xuXG5jb25zdCBBY2Nlc3NWYWx1ZU1vZGVsID0gQmFja2JvbmUuTW9kZWwuZXh0ZW5kKHtcblx0ZGVmYXVsdHM6IHt9LFxufSk7XG5cbmNvbnN0IEFjY2Vzc1ZhbHVlQ29sbGVjdGlvbiA9IEJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IEFjY2Vzc1ZhbHVlTW9kZWwsXG59KTtcblxuY29uc3QgQWNjZXNzUm93TW9kZWwgPSBCYWNrYm9uZS5Nb2RlbC5leHRlbmQoe1xuXHRkZWZhdWx0czoge30sXG59KTtcblxuY29uc3QgQWNjZXNzUm93Q29sbGVjdGlvbiA9IEJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IEFjY2Vzc1Jvd01vZGVsLFxufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEFjY2VzcyBMaXN0XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5jb25zdCBBY2Nlc3NNYXRyaXhWYWx1ZSA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiYWNjZXNzLW1hdHJpeC12YWx1ZVwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL3VzZXJSb2xlVmlld2VyLm51bmpcIikuYWNjZXNzTWF0cml4VmFsdWUsXG59KTtcblxuY29uc3QgQWNjZXNzTWF0cml4Um93ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5Db2xsZWN0aW9uVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiYWNjZXNzLW1hdHJpeC1yb3dcIixcblxuXHRjaGlsZFZpZXc6IEFjY2Vzc01hdHJpeFZhbHVlLFxuXG5cdGNoaWxkVmlld09wdGlvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRjb2xsZWN0aW9uOiB0aGlzLmNvbGxlY3Rpb24sXG5cdFx0fTtcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmNvbGxlY3Rpb24gPSBuZXcgQWNjZXNzVmFsdWVDb2xsZWN0aW9uKHRoaXMubW9kZWwuZ2V0KFwiYWNjZXNzVmFsdWVzXCIpKTtcblx0fSxcbn0pO1xuXG5jb25zdCBBY2Nlc3NNYXRyaXggPSBCYWNrYm9uZS5NYXJpb25ldHRlLkNvbGxlY3Rpb25WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJ1c2VyLXJvbGUtdmlld2VyLWFjY2Vzcy1tYXRyaXhcIixcblxuXHRjaGlsZFZpZXc6IEFjY2Vzc01hdHJpeFJvdyxcblxuXHRldmVudHM6IHtcblx0XHRzY3JvbGw6IFwib25TY3JvbGxcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5ldmVudEJ1cyA9IG9wdGlvbnMuZXZlbnRCdXM7XG5cdH0sXG5cblx0b25TY3JvbGw6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZXZlbnRCdXMudHJpZ2dlcihcImFjY2Vzc01hdHJpeDpzY3JvbGxcIiwge1xuXHRcdFx0c2Nyb2xsVG9wOiB0aGlzLiRlbC5nZXQoMCkuc2Nyb2xsVG9wLFxuXHRcdFx0c2Nyb2xsTGVmdDogdGhpcy4kZWwuZ2V0KDApLnNjcm9sbExlZnQsXG5cdFx0fSk7XG5cdH0sXG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUGVybWlzc2lvbiBMaXN0XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5jb25zdCBQZXJtaXNzaW9uTGlzdEl0ZW0gPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInBlcm1pc3Npb24tbGlzdC1pdGVtXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvdXNlclJvbGVWaWV3ZXIubnVualwiKS5wZXJtaXNzaW9uTGlzdEl0ZW0sXG59KTtcblxuY29uc3QgUGVybWlzc2lvbkxpc3QgPSBCYWNrYm9uZS5NYXJpb25ldHRlLkNvbGxlY3Rpb25WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJ1c2VyLXJvbGUtdmlld2VyLXBlcm1pc3Npb24tbGlzdFwiLFxuXG5cdGNoaWxkVmlldzogUGVybWlzc2lvbkxpc3RJdGVtLFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLmV2ZW50QnVzID0gb3B0aW9ucy5ldmVudEJ1cztcblxuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJhY2Nlc3NNYXRyaXg6c2Nyb2xsXCIsIHRoaXMub25BY2Nlc3NNYXRyaXhTY3JvbGwuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0b25BY2Nlc3NNYXRyaXhTY3JvbGw6IGZ1bmN0aW9uKHNjcm9sbE9mZnNldCkge1xuXHRcdHRoaXMuJGVsLmdldCgwKS5zY3JvbGxMZWZ0ID0gc2Nyb2xsT2Zmc2V0LnNjcm9sbExlZnQ7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcodGhpcy5ldmVudEJ1cyk7XG5cdH0sXG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUm9sZSBMaXN0XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5jb25zdCBSb2xlTGlzdEl0ZW0gPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInJvbGUtbGlzdC1pdGVtXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvdXNlclJvbGVWaWV3ZXIubnVualwiKS5yb2xlTGlzdEl0ZW0sXG59KTtcblxuY29uc3QgUm9sZUxpc3QgPSBCYWNrYm9uZS5NYXJpb25ldHRlLkNvbGxlY3Rpb25WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJ1c2VyLXJvbGUtdmlld2VyLXJvbGUtbGlzdFwiLFxuXG5cdGNoaWxkVmlldzogUm9sZUxpc3RJdGVtLFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLmV2ZW50QnVzID0gb3B0aW9ucy5ldmVudEJ1cztcblxuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ldmVudEJ1cywgXCJhY2Nlc3NNYXRyaXg6c2Nyb2xsXCIsIHRoaXMub25BY2Nlc3NNYXRyaXhTY3JvbGwuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0b25BY2Nlc3NNYXRyaXhTY3JvbGw6IGZ1bmN0aW9uKHNjcm9sbE9mZnNldCkge1xuXHRcdHRoaXMuJGVsLmdldCgwKS5zY3JvbGxUb3AgPSBzY3JvbGxPZmZzZXQuc2Nyb2xsVG9wO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zdG9wTGlzdGVuaW5nKHRoaXMuZXZlbnRCdXMpO1xuXHR9LFxufSk7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEdyaWRcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbmNvbnN0IEdyaWQgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInVzZXItcm9sZS12aWV3ZXItZ3JpZFwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL3VzZXJSb2xlVmlld2VyLm51bmpcIikuZ3JpZCxcblxuXHRyZWdpb25zOiB7XG5cdFx0aGVhZGVyOiBcIi5oZWFkZXItcmVnaW9uXCIsXG5cdFx0cm9sZTogXCIucm9sZS1yZWdpb25cIixcblx0XHR2YWx1ZTogXCIudmFsdWUtcmVnaW9uXCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdHRoaXMuYWNjZXNzUm93Q29sbGVjdGlvbiA9IG9wdGlvbnMuYWNjZXNzUm93Q29sbGVjdGlvbjtcblx0XHR0aGlzLmV2ZW50QnVzID0gb3B0aW9ucy5ldmVudEJ1cztcblx0XHR0aGlzLnBlcm1pc3Npb25Db2xsZWN0aW9uID0gb3B0aW9ucy5wZXJtaXNzaW9uQ29sbGVjdGlvbjtcblx0XHR0aGlzLnJvbGVDb2xsZWN0aW9uID0gb3B0aW9ucy5yb2xlQ29sbGVjdGlvbjtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5wZXJtaXNzaW9uTGlzdCA9IG5ldyBQZXJtaXNzaW9uTGlzdCh7XG5cdFx0XHRjb2xsZWN0aW9uOiB0aGlzLnBlcm1pc3Npb25Db2xsZWN0aW9uLFxuXHRcdFx0ZXZlbnRCdXM6IHRoaXMuZXZlbnRCdXMsXG5cdFx0fSk7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiaGVhZGVyXCIsIHRoaXMucGVybWlzc2lvbkxpc3QpO1xuXG5cdFx0dGhpcy5yb2xlTGlzdCA9IG5ldyBSb2xlTGlzdCh7XG5cdFx0XHRjb2xsZWN0aW9uOiB0aGlzLnJvbGVDb2xsZWN0aW9uLFxuXHRcdFx0ZXZlbnRCdXM6IHRoaXMuZXZlbnRCdXMsXG5cdFx0fSk7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwicm9sZVwiLCB0aGlzLnJvbGVMaXN0KTtcblxuXHRcdHRoaXMuYWNjZXNzTWF0cml4ID0gbmV3IEFjY2Vzc01hdHJpeCh7XG5cdFx0XHRjb2xsZWN0aW9uOiB0aGlzLmFjY2Vzc1Jvd0NvbGxlY3Rpb24sXG5cdFx0XHRldmVudEJ1czogdGhpcy5ldmVudEJ1cyxcblx0XHR9KTtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJ2YWx1ZVwiLCB0aGlzLmFjY2Vzc01hdHJpeCk7XG5cdH0sXG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSGVhZGVyXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5jb25zdCBIZWFkZXIgPSBBY3Rpb25IZWFkZXIuZXh0ZW5kKHtcblx0dGl0bGVWaWV3OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gQWN0aW9uVGl0bGU7XG5cdH0sXG5cblx0b25UaXRsZVJlYWR5OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJhY3Rpb24tdGl0bGU6Y2hhbmdlLWdseXBoXCIsIFwiZmEtdXNlcnNcIik7XG5cdFx0dGhpcy5ldmVudEJ1cy50cmlnZ2VyKFwiYWN0aW9uLXRpdGxlOmNoYW5nZS10aXRsZVwiLCBcIlVzZXIgUm9sZSBWaWV3ZXJcIik7XG5cdH0sXG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29udHJvbGxlclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImNvbnRlbnQgdXNlci1yb2xlLXZpZXdlclwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL3VzZXJSb2xlVmlld2VyLm51bmpcIikubGF5b3V0LFxuXG5cdHJlZ2lvbnM6IHtcblx0XHRzdGF0dXM6IFwiLnN0YXR1cy1yZWdpb25cIixcblx0XHRoZWFkZXI6IFwiLmhlYWRlci1yZWdpb25cIixcblx0XHRjb250ZW50OiBcIi5jb250ZW50LXJlZ2lvblwiLFxuXHR9LFxuXG5cdHVpOiB7XG5cdFx0c3RhdHVzUmVnaW9uOiBcIi5zdGF0dXMtcmVnaW9uXCIsXG5cdFx0aGVhZGVyUmVnaW9uOiBcIi5oZWFkZXItcmVnaW9uXCIsXG5cdFx0Y29udGVudFJlZ2lvbjogXCIuY29udGVudC1yZWdpb25cIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmV2ZW50QnVzID0gbmV3IEJhY2tib25lLk1hcmlvbmV0dGUuT2JqZWN0KCk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdCQoXCJmb290ZXJcIiwgZG9jdW1lbnQpLmFkZENsYXNzKFwiaGlkZVwiKTtcblxuXHRcdHRoaXMucmVuZGVyTG9hZGluZ1N0YXR1cygpO1xuXG5cdFx0dGhpcy5yb2xlQ29sbGVjdGlvbiA9IG5ldyBSb2xlQ29sbGVjdGlvbihfLmZsYXRNYXAoc2V0dGluZ3Mucm9sZXMsIChyLCBrKSA9PiB7XG5cdFx0XHRsZXQgcmVzdWx0ID0gW107XG5cblx0XHRcdGlmIChrICE9PSBcIipcIikge1xuXHRcdFx0XHRyZXN1bHQgPSB7XG5cdFx0XHRcdFx0aWQ6IGssXG5cdFx0XHRcdFx0bmFtZTogci5uYW1lLFxuXHRcdFx0XHRcdHBlcm1pc3Npb25zOiByLnBlcm1pc3Npb25zLFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH0pKTtcblxuXHRcdGNvbnN0IGV4dHJhY3RQZXJtaXNzaW9ucyA9IGZ1bmN0aW9uKHBlcm1pc3Npb25zLCBwcmVmaXgpIHtcblx0XHRcdHJldHVybiBfLm1hcChwZXJtaXNzaW9ucywgKHMsIGspID0+IHtcblx0XHRcdFx0Y29uc3QgbmFtZSA9IHByZWZpeCA9PT0gdW5kZWZpbmVkID8gayA6IHByZWZpeCArIFwiLlwiICsgaztcblx0XHRcdFx0cmV0dXJuIHMgPT09IFwiXCIgPyBbeyBuYW1lOiBuYW1lIH1dIDogZXh0cmFjdFBlcm1pc3Npb25zKHMsIG5hbWUpO1xuXHRcdFx0fSk7XG5cdFx0fTtcblxuXHRcdHRoaXMucGVybWlzc2lvbkNvbGxlY3Rpb24gPSBuZXcgUGVybWlzc2lvbkNvbGxlY3Rpb24oXy5mbGF0dGVuRGVlcChleHRyYWN0UGVybWlzc2lvbnMoc2V0dGluZ3MucGVybWlzc2lvbnMpKSk7XG5cdFx0dGhpcy5wZXJtaXNzaW9uQ29sbGVjdGlvbi5jb21wYXJhdG9yID0gXCJuYW1lXCI7XG5cdFx0dGhpcy5wZXJtaXNzaW9uQ29sbGVjdGlvbi5zb3J0KCk7XG5cblx0XHR0aGlzLmFjY2Vzc1Jvd0NvbGxlY3Rpb24gPSBuZXcgQWNjZXNzUm93Q29sbGVjdGlvbigpO1xuXG5cdFx0dGhpcy5yb2xlQ29sbGVjdGlvbi5lYWNoKHJvbGVNb2RlbCA9PiB7XG5cdFx0XHRjb25zdCBhY2Nlc3NWYWx1ZXMgPSBbXTtcblxuXHRcdFx0dGhpcy5wZXJtaXNzaW9uQ29sbGVjdGlvbi5lYWNoKHBlcm1pc3Npb25Nb2RlbCA9PiB7XG5cdFx0XHRcdGNvbnN0IGFic3RyYWN0VXNlciA9IHtcblx0XHRcdFx0XHRyb2xlczogW3JvbGVNb2RlbC5nZXQoXCJpZFwiKV0sXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0YWNjZXNzVmFsdWVzLnB1c2goe1xuXHRcdFx0XHRcdGhhc0FjY2VzczogcmVzdGVyLmhhc0FjY2VzcyhwZXJtaXNzaW9uTW9kZWwuZ2V0KFwibmFtZVwiKSwgYWJzdHJhY3RVc2VyKSxcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5hY2Nlc3NSb3dDb2xsZWN0aW9uLmFkZCh7IGFjY2Vzc1ZhbHVlczogYWNjZXNzVmFsdWVzIH0pO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5yZW5kZXJQYWdlKCk7XG5cdH0sXG5cblx0cmVuZGVyTG9hZGluZ1N0YXR1czogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwic3RhdHVzXCIsIG5ldyBTdGF0dXNWaWV3KHsgdHlwZTogXCJsb2FkaW5nXCIgfSkpO1xuXHR9LFxuXG5cdHJlbmRlckVycm9yOiBmdW5jdGlvbihlcnJvcikge1xuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcInN0YXR1c1wiLCBuZXcgRXJyb3JWaWV3KHsgZmV0Y2hFcnJvcjogZXJyb3IgfSkpO1xuXHR9LFxuXG5cdHJlbmRlclBhZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudWkuc3RhdHVzUmVnaW9uLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLmhlYWRlclJlZ2lvbi5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5jb250ZW50UmVnaW9uLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblxuXHRcdC8vIENyZWF0ZSB0aGUgaGVhZGVyXG5cdFx0dGhpcy5oZWFkZXIgPSBuZXcgSGVhZGVyKHsgZXZlbnRCdXM6IHRoaXMuZXZlbnRCdXMgfSk7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwiaGVhZGVyXCIsIHRoaXMuaGVhZGVyKTtcblxuXHRcdC8vIENyZWF0ZSB0aGUgZ3JpZFxuXHRcdHRoaXMuZ3JpZCA9IG5ldyBHcmlkKHtcblx0XHRcdGFjY2Vzc1Jvd0NvbGxlY3Rpb246IHRoaXMuYWNjZXNzUm93Q29sbGVjdGlvbixcblx0XHRcdGV2ZW50QnVzOiB0aGlzLmV2ZW50QnVzLFxuXHRcdFx0cGVybWlzc2lvbkNvbGxlY3Rpb246IHRoaXMucGVybWlzc2lvbkNvbGxlY3Rpb24sXG5cdFx0XHRyb2xlQ29sbGVjdGlvbjogdGhpcy5yb2xlQ29sbGVjdGlvbixcblx0XHR9KTtcblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJjb250ZW50XCIsIHRoaXMuZ3JpZCk7XG5cdH0sXG59KTtcbiJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar UploadView = require(\"./views/index\");\n\nvar Module = module.exports = new Backbone.Marionette.Application();\n\n// Add intra-module routing\nModule.routing = function (App) {\n\tModule.Router = {\n\t\troutes: {\n\t\t\t\"\": \"overview\",\n\t\t\toverview: \"overview\",\n\t\t\tproblems: \"problems\",\n\t\t\tusers: \"users\",\n\t\t\terrors: \"errors\",\n\t\t\twarnings: \"warnings\",\n\t\t\tgroups: \"groups\",\n\t\t\tuploads: \"uploads\",\n\t\t\trelations: \"relations\"\n\t\t},\n\n\t\toverview: function overview() {\n\t\t\tApp.unloadView();\n\n\t\t\tApp.loadView(new UploadView({ section: \"overview\" }));\n\t\t},\n\n\t\tproblems: function problems() {\n\t\t\tApp.unloadView();\n\n\t\t\tApp.loadView(new UploadView({ section: \"problems\" }));\n\t\t},\n\n\t\tusers: function users() {\n\t\t\tApp.unloadView();\n\n\t\t\tApp.loadView(new UploadView({ section: \"users\" }));\n\t\t},\n\n\t\terrors: function errors() {\n\t\t\tApp.unloadView();\n\n\t\t\tApp.loadView(new UploadView({ section: \"errors\" }));\n\t\t},\n\n\t\twarnings: function warnings() {\n\t\t\tApp.unloadView();\n\n\t\t\tApp.loadView(new UploadView({ section: \"warnings\" }));\n\t\t},\n\n\t\tgroups: function groups() {\n\t\t\tApp.unloadView();\n\n\t\t\tApp.loadView(new UploadView({ section: \"groups\" }));\n\t\t},\n\n\t\tuploads: function uploads() {\n\t\t\tApp.unloadView();\n\n\t\t\tApp.loadView(new UploadView({ section: \"uploads\" }));\n\t\t},\n\n\t\trelations: function relations() {\n\t\t\tApp.unloadView();\n\n\t\t\tApp.loadView(new UploadView({ section: \"relations\" }));\n\t\t}\n\t};\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIlVwbG9hZFZpZXciLCJNb2R1bGUiLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIkFwcGxpY2F0aW9uIiwicm91dGluZyIsIlJvdXRlciIsInJvdXRlcyIsIm92ZXJ2aWV3IiwicHJvYmxlbXMiLCJ1c2VycyIsImVycm9ycyIsIndhcm5pbmdzIiwiZ3JvdXBzIiwidXBsb2FkcyIsInJlbGF0aW9ucyIsIkFwcCIsInVubG9hZFZpZXciLCJsb2FkVmlldyIsInNlY3Rpb24iXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjs7QUFFQSxJQUFNQyxhQUFhRCxRQUFRLGVBQVIsQ0FBbkI7O0FBRUEsSUFBTUUsU0FBU0MsT0FBT0MsT0FBUCxHQUFpQixJQUFJTCxTQUFTTSxVQUFULENBQW9CQyxXQUF4QixFQUFoQzs7QUFFQTtBQUNBSixPQUFPSyxPQUFQLEdBQWlCLGVBQU87QUFDdkJMLFFBQU9NLE1BQVAsR0FBZ0I7QUFDZkMsVUFBUTtBQUNQLE9BQUksVUFERztBQUVQQyxhQUFVLFVBRkg7QUFHUEMsYUFBVSxVQUhIO0FBSVBDLFVBQU8sT0FKQTtBQUtQQyxXQUFRLFFBTEQ7QUFNUEMsYUFBVSxVQU5IO0FBT1BDLFdBQVEsUUFQRDtBQVFQQyxZQUFTLFNBUkY7QUFTUEMsY0FBVztBQVRKLEdBRE87O0FBYWZQLFlBQVUsb0JBQVc7QUFDcEJRLE9BQUlDLFVBQUo7O0FBRUFELE9BQUlFLFFBQUosQ0FBYSxJQUFJbkIsVUFBSixDQUFlLEVBQUVvQixTQUFTLFVBQVgsRUFBZixDQUFiO0FBQ0EsR0FqQmM7O0FBbUJmVixZQUFVLG9CQUFXO0FBQ3BCTyxPQUFJQyxVQUFKOztBQUVBRCxPQUFJRSxRQUFKLENBQWEsSUFBSW5CLFVBQUosQ0FBZSxFQUFFb0IsU0FBUyxVQUFYLEVBQWYsQ0FBYjtBQUNBLEdBdkJjOztBQXlCZlQsU0FBTyxpQkFBVztBQUNqQk0sT0FBSUMsVUFBSjs7QUFFQUQsT0FBSUUsUUFBSixDQUFhLElBQUluQixVQUFKLENBQWUsRUFBRW9CLFNBQVMsT0FBWCxFQUFmLENBQWI7QUFDQSxHQTdCYzs7QUErQmZSLFVBQVEsa0JBQVc7QUFDbEJLLE9BQUlDLFVBQUo7O0FBRUFELE9BQUlFLFFBQUosQ0FBYSxJQUFJbkIsVUFBSixDQUFlLEVBQUVvQixTQUFTLFFBQVgsRUFBZixDQUFiO0FBQ0EsR0FuQ2M7O0FBcUNmUCxZQUFVLG9CQUFXO0FBQ3BCSSxPQUFJQyxVQUFKOztBQUVBRCxPQUFJRSxRQUFKLENBQWEsSUFBSW5CLFVBQUosQ0FBZSxFQUFFb0IsU0FBUyxVQUFYLEVBQWYsQ0FBYjtBQUNBLEdBekNjOztBQTJDZk4sVUFBUSxrQkFBVztBQUNsQkcsT0FBSUMsVUFBSjs7QUFFQUQsT0FBSUUsUUFBSixDQUFhLElBQUluQixVQUFKLENBQWUsRUFBRW9CLFNBQVMsUUFBWCxFQUFmLENBQWI7QUFDQSxHQS9DYzs7QUFpRGZMLFdBQVMsbUJBQVc7QUFDbkJFLE9BQUlDLFVBQUo7O0FBRUFELE9BQUlFLFFBQUosQ0FBYSxJQUFJbkIsVUFBSixDQUFlLEVBQUVvQixTQUFTLFNBQVgsRUFBZixDQUFiO0FBQ0EsR0FyRGM7O0FBdURmSixhQUFXLHFCQUFXO0FBQ3JCQyxPQUFJQyxVQUFKOztBQUVBRCxPQUFJRSxRQUFKLENBQWEsSUFBSW5CLFVBQUosQ0FBZSxFQUFFb0IsU0FBUyxXQUFYLEVBQWYsQ0FBYjtBQUNBO0FBM0RjLEVBQWhCO0FBNkRBLENBOUREIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcblxuY29uc3QgVXBsb2FkVmlldyA9IHJlcXVpcmUoXCIuL3ZpZXdzL2luZGV4XCIpO1xuXG5jb25zdCBNb2R1bGUgPSBtb2R1bGUuZXhwb3J0cyA9IG5ldyBCYWNrYm9uZS5NYXJpb25ldHRlLkFwcGxpY2F0aW9uKCk7XG5cbi8vIEFkZCBpbnRyYS1tb2R1bGUgcm91dGluZ1xuTW9kdWxlLnJvdXRpbmcgPSBBcHAgPT4ge1xuXHRNb2R1bGUuUm91dGVyID0ge1xuXHRcdHJvdXRlczoge1xuXHRcdFx0XCJcIjogXCJvdmVydmlld1wiLFxuXHRcdFx0b3ZlcnZpZXc6IFwib3ZlcnZpZXdcIixcblx0XHRcdHByb2JsZW1zOiBcInByb2JsZW1zXCIsXG5cdFx0XHR1c2VyczogXCJ1c2Vyc1wiLFxuXHRcdFx0ZXJyb3JzOiBcImVycm9yc1wiLFxuXHRcdFx0d2FybmluZ3M6IFwid2FybmluZ3NcIixcblx0XHRcdGdyb3VwczogXCJncm91cHNcIixcblx0XHRcdHVwbG9hZHM6IFwidXBsb2Fkc1wiLFxuXHRcdFx0cmVsYXRpb25zOiBcInJlbGF0aW9uc1wiLFxuXHRcdH0sXG5cblx0XHRvdmVydmlldzogZnVuY3Rpb24oKSB7XG5cdFx0XHRBcHAudW5sb2FkVmlldygpO1xuXG5cdFx0XHRBcHAubG9hZFZpZXcobmV3IFVwbG9hZFZpZXcoeyBzZWN0aW9uOiBcIm92ZXJ2aWV3XCIgfSkpO1xuXHRcdH0sXG5cblx0XHRwcm9ibGVtczogZnVuY3Rpb24oKSB7XG5cdFx0XHRBcHAudW5sb2FkVmlldygpO1xuXG5cdFx0XHRBcHAubG9hZFZpZXcobmV3IFVwbG9hZFZpZXcoeyBzZWN0aW9uOiBcInByb2JsZW1zXCIgfSkpO1xuXHRcdH0sXG5cblx0XHR1c2VyczogZnVuY3Rpb24oKSB7XG5cdFx0XHRBcHAudW5sb2FkVmlldygpO1xuXG5cdFx0XHRBcHAubG9hZFZpZXcobmV3IFVwbG9hZFZpZXcoeyBzZWN0aW9uOiBcInVzZXJzXCIgfSkpO1xuXHRcdH0sXG5cblx0XHRlcnJvcnM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0QXBwLnVubG9hZFZpZXcoKTtcblxuXHRcdFx0QXBwLmxvYWRWaWV3KG5ldyBVcGxvYWRWaWV3KHsgc2VjdGlvbjogXCJlcnJvcnNcIiB9KSk7XG5cdFx0fSxcblxuXHRcdHdhcm5pbmdzOiBmdW5jdGlvbigpIHtcblx0XHRcdEFwcC51bmxvYWRWaWV3KCk7XG5cblx0XHRcdEFwcC5sb2FkVmlldyhuZXcgVXBsb2FkVmlldyh7IHNlY3Rpb246IFwid2FybmluZ3NcIiB9KSk7XG5cdFx0fSxcblxuXHRcdGdyb3VwczogZnVuY3Rpb24oKSB7XG5cdFx0XHRBcHAudW5sb2FkVmlldygpO1xuXG5cdFx0XHRBcHAubG9hZFZpZXcobmV3IFVwbG9hZFZpZXcoeyBzZWN0aW9uOiBcImdyb3Vwc1wiIH0pKTtcblx0XHR9LFxuXG5cdFx0dXBsb2FkczogZnVuY3Rpb24oKSB7XG5cdFx0XHRBcHAudW5sb2FkVmlldygpO1xuXG5cdFx0XHRBcHAubG9hZFZpZXcobmV3IFVwbG9hZFZpZXcoeyBzZWN0aW9uOiBcInVwbG9hZHNcIiB9KSk7XG5cdFx0fSxcblxuXHRcdHJlbGF0aW9uczogZnVuY3Rpb24oKSB7XG5cdFx0XHRBcHAudW5sb2FkVmlldygpO1xuXG5cdFx0XHRBcHAubG9hZFZpZXcobmV3IFVwbG9hZFZpZXcoeyBzZWN0aW9uOiBcInJlbGF0aW9uc1wiIH0pKTtcblx0XHR9LFxuXHR9O1xufTsiXX0=",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"header\\\">\\n\\t<h4 class=\\\"title\\\"><span id=\\\"header-counter\\\">0</span>&nbsp;Queue Errors</h4>\\n</div>\\n\\n<div class=\\\"ops-bar\\\">\\n\\t<div class=\\\"filters\\\"></div>\\n\\t<div class=\\\"counter\\\"></div>\\n</div>\\n\\n<div class=\\\"grid\\\"></div>\\n\\n<div class=\\\"paging\\\"></div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"header\\\">\\n\\t<h4 class=\\\"title\\\">Groups</h4>\\n\\t<div class=\\\"actions\\\">\\n\\t\\t<div class=\\\"submit\\\">Submit</div>\\n\\t\\t<div class=\\\"reset\\\">Reset</div>\\n\\t</div>\\n</div>\\n\\n\\n<div class=\\\"ops-bar\\\">\\n\\t<div class=\\\"filters\\\"></div>\\n\\t<div class=\\\"counter\\\"></div>\\n</div>\\n\\n<div class=\\\"grid\\\"></div>\\n\\n<div class=\\\"paging\\\"></div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar content_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\n\\t\\t<div class=\\\"row summary-container\\\">\\n\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t<p>You are about to upload the following changes:</p>\\n\\n\\t\\t\\t\\t<label><input type=\\\"checkbox\\\" id=\\\"noGroupDel\\\" checked> No group deletions</label>\\n\\n\\t\\t\\t\\t<table class=\\\"statistics\\\">\\n\\t\\t\\t\\t\\t<tr>\\n\\t\\t\\t\\t\\t\\t<td><span class=\\\"change-type-label\\\">User additions: </span></td>\\n\\t\\t\\t\\t\\t\\t<td><span class=\\\"change-type-value user-additions\\\"></span></td>\\n\\t\\t\\t\\t\\t</tr>\\n\\t\\t\\t\\t\\t<tr>\\n\\t\\t\\t\\t\\t\\t<td><span class=\\\"change-type-label\\\">Group additions: </span></td>\\n\\t\\t\\t\\t\\t\\t<td><span class=\\\"change-type-value group-additions\\\"></span></td>\\n\\t\\t\\t\\t\\t</tr>\\n\\t\\t\\t\\t\\t<tr>\\n\\t\\t\\t\\t\\t\\t<td><span class=\\\"change-type-label\\\">Relation additions: </span></td>\\n\\t\\t\\t\\t\\t\\t<td><span class=\\\"change-type-value relation-additions\\\"></span></td>\\n\\t\\t\\t\\t\\t</tr>\\n\\t\\t\\t\\t\\t<tr>\\n\\t\\t\\t\\t\\t\\t<td><span class=\\\"change-type-label\\\">User deletions: </span></td>\\n\\t\\t\\t\\t\\t\\t<td><span class=\\\"change-type-value user-deletions\\\"></span></td>\\n\\t\\t\\t\\t\\t</tr>\\n\\t\\t\\t\\t\\t<tr>\\n\\t\\t\\t\\t\\t\\t<td><span class=\\\"change-type-label\\\">Group deletions: </span></td>\\n\\t\\t\\t\\t\\t\\t<td><span class=\\\"change-type-value group-deletions\\\"></span></td>\\n\\t\\t\\t\\t\\t</tr>\\n\\t\\t\\t\\t\\t<tr>\\n\\t\\t\\t\\t\\t\\t<td><span class=\\\"change-type-label\\\">Relation deletions: </span></td>\\n\\t\\t\\t\\t\\t\\t<td><span class=\\\"change-type-value relation-deletions\\\"></span></td>\\n\\t\\t\\t\\t\\t</tr>\\n\\t\\t\\t\\t\\t<tr>\\n\\t\\t\\t\\t\\t\\t<td><span class=\\\"change-type-label\\\">User updates: </span></td>\\n\\t\\t\\t\\t\\t\\t<td><span class=\\\"change-type-value user-updates\\\"></span></td>\\n\\t\\t\\t\\t\\t</tr>\\n\\t\\t\\t\\t\\t<tr>\\n\\t\\t\\t\\t\\t\\t<td><span class=\\\"change-type-label\\\">Group updates: </span></td>\\n\\t\\t\\t\\t\\t\\t<td><span class=\\\"change-type-value group-updates\\\"></span></td>\\n\\t\\t\\t\\t\\t</tr>\\n\\t\\t\\t\\t</table>\\n\\n\\t\\t\\t\\t<p>Select Submit to action all changes, or Cancel to continue adding CSV files.</p>\\n\\t\\t\\t</div>\\n\\t\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar content_oldRoot = content_obj.root;\ncontent_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcontent_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"content\": new nunjucks.Template( {obj: content_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<!--<div class=\\\"header\\\">\\n\\t<h4 class=\\\"title left\\\"><span class=\\\"fas fa-cloud-upload-alt\\\"></span>&nbsp;CSV Imports</h4>\\n</div>-->\\n\\n<div id=\\\"upload-wrapper\\\">\\n\\t<div class=\\\"upload-menu\\\">\\n\\t\\t<input type=\\\"file\\\" multiple=\\\"multiple\\\" class=\\\"upload-input hide\\\"></input>\\n\\t\\t<div class=\\\"nav-item nav-upload\\\"><span class=\\\"text\\\">Add CSVs</span> <span class=\\\"fas fa-plus\\\"/></div>\\n\\n\\t\\t<div class=\\\"nav-item nav-overview\\\">\\n\\t\\t\\t<span class=\\\"text\\\">Overview</span>\\n\\t\\t\\t<span class=\\\"fas fa-desktop\\\"/>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"nav-item nav-uploads\\\"><span class=\\\"text\\\">Current Uploads</span>\\n\\t\\t\\t<span class=\\\"counters\\\">\\n\\t\\t\\t\\t<span class=\\\"count good hide\\\"></span>\\n\\t\\t\\t\\t<span class=\\\"fas fa-cloud-upload-alt\\\"/>\\n\\t\\t\\t</span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"nav-item nav-problems\\\"><span class=\\\"text\\\">Problems</span>\\n\\t\\t\\t<span class=\\\"counters\\\">\\n\\t\\t\\t\\t<span class=\\\"count bad hide\\\"></span>\\n\\t\\t\\t\\t<span class=\\\"fas fa-exclamation-circle\\\"/>\\n\\t\\t\\t</span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"nav-item-spacer\\\"></div>\\n\\n\\t\\t<div class=\\\"nav-item nav-users\\\">\\n\\t\\t\\t<span class=\\\"text\\\">Users</span>\\n\\t\\t\\t<span class=\\\"counters\\\">\\n\\t\\t\\t\\t<span class=\\\"count good hide\\\"></span>\\n\\t\\t\\t\\t<span class=\\\"fas fa-users\\\"/>\\n\\t\\t\\t</span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"nav-item nav-groups\\\">\\n\\t\\t\\t<span class=\\\"text\\\">Groups</span>\\n\\t\\t\\t<span class=\\\"counters\\\">\\n\\t\\t\\t\\t<span class=\\\"count good hide\\\"></span>\\n\\t\\t\\t\\t<span class=\\\"fas fa-th\\\"/>\\n\\t\\t\\t</span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"nav-item nav-relations\\\">\\n\\t\\t\\t<span class=\\\"text\\\">Book/Group Allocations</span>\\n\\t\\t\\t<span class=\\\"counters\\\">\\n\\t\\t\\t\\t<span class=\\\"count good hide\\\"></span>\\n\\t\\t\\t\\t<span class=\\\"fas fa-link\\\"/>\\n\\t\\t\\t</span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"nav-item nav-warnings\\\">\\n\\t\\t\\t<span class=\\\"text\\\">Warnings</span>\\n\\t\\t\\t<span class=\\\"counters\\\">\\n\\t\\t\\t\\t<span class=\\\"count warning hide\\\"></span>\\n\\t\\t\\t\\t<span class=\\\"fas fa-exclamation-triangle\\\"/>\\n\\t\\t\\t</span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"nav-item nav-errors\\\">\\n\\t\\t\\t<span class=\\\"text\\\">Errors</span>\\n\\t\\t\\t<span class=\\\"counters\\\">\\n\\t\\t\\t\\t<span class=\\\"count bad hide\\\"></span>\\n\\t\\t\\t\\t<span class=\\\"fas fa-bomb\\\"/>\\n\\t\\t\\t</span>\\n\\t\\t</div>\\n\\n\\t\\t<!--<div class=\\\"nav-item-spacer\\\"></div>-->\\n\\n\\n\\n\\t\\t<div class=\\\"expander\\\">\\n\\t\\t\\t<span class=\\\"fa fa-chevron-left\\\"/>\\n\\t\\t\\t<span class=\\\"fa fa-chevron-right\\\"/>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"upload-items\\\"></div>\\n\\n\\t<div class=\\\"uploadtron\\\">\\n\\t</div>\\n</div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div id=\\\"drag-drop\\\">\\n\\t<h3>Import CSVs</h3>\\n\\n\\t<p>You can upload CSVs by dragging and dropping files anywhere into this area, or by selecting the \\\"Add CSVs\\\" button on the left.</p>\\n\\n\\t<h4>Drag and drop files here</h4>\\n</div>\\n\\n<div id=\\\"templates\\\">\\n\\t<h4>Download CSV templates</h4>\\n\\n\\t<p>Upload users: download template <a href=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"urlRoot\"), env.opts.autoescape);\noutput += \"/files/usersImportExample.csv\\\">here</a>.</p>\\n\\n\\t<p>Add Groups: download template <a href=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"urlRoot\"), env.opts.autoescape);\noutput += \"/files/groupsImportExample.csv\\\">here</a>.</p>\\n\\n\\t<p>Add/remove users from groups: download template <a href=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"urlRoot\"), env.opts.autoescape);\noutput += \"/files/userGroupsImportExample.csv\\\">here</a>.</p>\\n\\n\\t<p>Book allocations: download template <a href=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"urlRoot\"), env.opts.autoescape);\noutput += \"/files/bookGroupsImportExample.csv\\\">here</a>.</p>\\n</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"problem\\\">\\n\\t<div class=\\\"name\\\"><img src=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"urlRoot\"), env.opts.autoescape);\noutput += \"/images/\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"baseFormat\"), env.opts.autoescape);\noutput += \".png\\\" width=\\\"32px\\\" height=\\\"32px\\\"/>&nbsp;\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"filename\"), env.opts.autoescape);\noutput += \"</div>\\n\\n\\t<div class=\\\"title\\\"><span class=\\\"fa fa-question-circle\\\"/> What happened?</div>\\n\\t<p>\";\noutput += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"error\")),\"detail\") || runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"error\")),\"info\") || runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"error\")),\"message\"), env.opts.autoescape);\noutput += \"</p>\\n\\n\\t<div class=\\\"title\\\"><span class=\\\"fa fa-question-circle\\\"/> What can I do?</div>\\n\\t<p>\\n\\t\\t<button name=\\\"retry\\\" class=\\\"button small\\\">Try Again</button>&nbsp;&nbsp;\\n\\t\\t<button class=\\\"button alert small\\\" name=\\\"skip\\\">Skip</button>\\n\\t</p>\\n\\n</div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"title\\\">Problems</div>\\n\\n\";\nif(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"items\")),\"length\") > 0) {\noutput += \"\\n\\t<p>Choose an item on the left to see why the upload failed, and options to resolve it.</p>\\n\";\n;\n}\nelse {\noutput += \"\\n\\t<p>Hooray! No unresolved problems.</p>\\n\";\n;\n}\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"header\\\">\\n\\t<h4 class=\\\"title\\\">Book / Group allocations</h4>\\n\\t<div class=\\\"actions\\\">\\n\\t\\t<div class=\\\"submit\\\">Submit</div>\\n\\t\\t<div class=\\\"reset\\\">Reset</div>\\n\\t</div>\\n</div>\\n\\n\\n<div class=\\\"ops-bar\\\">\\n\\t<div class=\\\"filters\\\"></div>\\n\\t<div class=\\\"counter\\\"></div>\\n</div>\\n\\n<div class=\\\"grid\\\"></div>\\n\\n<div class=\\\"paging\\\"></div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\nif(runtime.contextOrFrameLookup(context, frame, \"error\")) {\noutput += \"\\n\\t<span class=\\\"icon fa fa-exclamation-circle erra\\\"/>\\n\";\n;\n}\nelse {\nif(runtime.contextOrFrameLookup(context, frame, \"parsing\")) {\noutput += \"\\n\\t<span class=\\\"icon parsing\\\"/>\\n\";\n;\n}\nelse {\nif(!runtime.contextOrFrameLookup(context, frame, \"parsed\")) {\noutput += \"\\n\\t<span class=\\\"icon fa fa-circle-o unparsed\\\"/>\\n\";\n;\n}\nelse {\nif(!runtime.contextOrFrameLookup(context, frame, \"reviewed\")) {\noutput += \"\\n\\t<span class=\\\"icon fa fa-circle unreviewed\\\"/>\\n\";\n;\n}\nelse {\nif(runtime.contextOrFrameLookup(context, frame, \"uploading\")) {\noutput += \"\\n\\t<span class=\\\"icon uploading\\\"><span class=\\\"spinner-icon spinner-small\\\"/></span>\\n\";\n;\n}\nelse {\noutput += \"\\n\\t<span class=\\\"icon fa fa-circle-o pending\\\"/>\\n\";\n;\n}\n;\n}\n;\n}\n;\n}\n;\n}\noutput += \"\\n\\n<img src=\\\"\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"urlRoot\"), env.opts.autoescape);\noutput += \"/images/\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"baseFormat\"), env.opts.autoescape);\noutput += \".png\\\" style=\\\"width: 22px; height: 22px\\\">\\n\";\nif(runtime.contextOrFrameLookup(context, frame, \"warnings\") && runtime.contextOrFrameLookup(context, frame, \"warnings\") > 0) {\noutput += \"\\n\\t<span class=\\\"warnings\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"warnings\"), env.opts.autoescape);\noutput += \"</span>\\n\";\n;\n}\noutput += \"\\n<span class=\\\"title\\\">\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"filename\"), env.opts.autoescape);\noutput += \"</span>\\n<div class=\\\"remover fa fa-times-circle\\\" title=\\\"Remove\\\"/>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\nif(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"model\")),\"viewType\") == \"standard\") {\noutput += \"\\n\\t<span class=\\\"heading\\\">\";\noutput += runtime.suppressValue((lineno = 1, colno = 35, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"filterNames\"), \"filterNames\", context, [])), env.opts.autoescape);\noutput += \"</span>\\n\\t<span class=\\\"options fa fa-gear\\\"/>\\n\";\n;\n}\nelse {\nif(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"model\")),\"viewType\") == \"error\") {\noutput += \"\\n\\t<span class=\\\"heading\\\">Unresolved problems</span>\\n\";\n;\n}\n;\n}\noutput += \"\\n\\n<span class=\\\"hidden \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"filteredItems\") != runtime.contextOrFrameLookup(context, frame, \"totalItems\") && runtime.contextOrFrameLookup(context, frame, \"totalItems\") > 0?\"\":\"hide\"), env.opts.autoescape);\noutput += \"\\\">+\";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"totalItems\") - runtime.contextOrFrameLookup(context, frame, \"filteredItems\")), env.opts.autoescape);\noutput += \" filtered item\";\noutput += runtime.suppressValue(((runtime.contextOrFrameLookup(context, frame, \"totalItems\") - runtime.contextOrFrameLookup(context, frame, \"filteredItems\")) == 0?\"s\":\"\"), env.opts.autoescape);\noutput += \" (click to show)</span>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"header\\\">\\n\\t<h4 class=\\\"title\\\"><span id=\\\"header-counter\\\">0</span>&nbsp;Current upload(s)</h4>\\n</div>\\n\\n<div class=\\\"ops-bar\\\">\\n\\t<div class=\\\"filters\\\"></div>\\n\\t<div class=\\\"counter\\\"></div>\\n</div>\\n\\n<div class=\\\"grid\\\"></div>\\n\\n<div class=\\\"paging\\\"></div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"header\\\">\\n\\t<h4 class=\\\"title\\\">Users</h4>\\n\\t<div class=\\\"actions\\\">\\n\\t\\t<div class=\\\"submit\\\">Submit</div>\\n\\t\\t<div class=\\\"reset\\\">Reset</div>\\n\\t</div>\\n</div>\\n\\n\\n<div class=\\\"ops-bar\\\">\\n\\t<div class=\\\"filters\\\"></div>\\n\\t<div class=\\\"counter\\\"></div>\\n</div>\\n\\n<div class=\\\"grid\\\"></div>\\n\\n<div class=\\\"paging\\\"></div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"header\\\">\\n\\t<h4 class=\\\"title\\\"><span id=\\\"header-counter\\\">0</span>&nbsp;Queue Warnings</h4>\\n</div>\\n\\n<div class=\\\"ops-bar\\\">\\n\\t<div class=\\\"filters\\\"></div>\\n\\t<div class=\\\"counter\\\"></div>\\n</div>\\n\\n<div class=\\\"grid\\\"></div>\\n\\n<div class=\\\"paging\\\"></div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nmodule.exports = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"import_id\"\n\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVycm9yTW9kZWwuanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwibW9kdWxlIiwiZXhwb3J0cyIsIkVwb3h5IiwiTW9kZWwiLCJleHRlbmQiLCJpZEF0dHJpYnV0ZSJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCOztBQUVBQyxPQUFPQyxPQUFQLEdBQWlCSCxTQUFTSSxLQUFULENBQWVDLEtBQWYsQ0FBcUJDLE1BQXJCLENBQTRCO0FBQzVDQyxjQUFhOztBQUQrQixDQUE1QixDQUFqQiIsImZpbGUiOiJlcnJvck1vZGVsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5FcG94eS5Nb2RlbC5leHRlbmQoe1xuXHRpZEF0dHJpYnV0ZTogXCJpbXBvcnRfaWRcIixcblxufSk7Il19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar $ = require(\"jquery\");\n\nvar Grid = require(\"../../lib/grid\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"import-errors\",\n\n\tui: {\n\t\theaderCounter: \"#header-counter\",\n\t\tfilterBar: \".ops-bar .filters\",\n\t\tcounterBar: \".ops-bar .counter\",\n\t\tgrid: \"div.grid\",\n\n\t\tretry: \"button.retry\"\n\t},\n\n\tcollectionEvents: {\n\t\tadd: \"modelAdd\",\n\t\tchange: \"modelChange\",\n\t\tremove: \"modelRemove\",\n\t\tsync: \"updateCounter\"\n\t},\n\n\titemEvents: {\n\t\t//\"sync reset\": \"updateCounter\",\n\t\t\"row:customclick\": \"retry\"\n\t},\n\n\ttemplate: require(\"../templates/errors.nunj\"),\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tif (this.grid) this.grid.destroy();\n\t},\n\n\tupdateCounter: function updateCounter() {\n\t\tif (!this.items) {\n\t\t\tthis.ui.headerCounter.text(\"0\");\n\t\t\treturn;\n\t\t}\n\t\tvar pageStart = (this.items.state.currentPage - 1) * this.items.state.pageSize + 1;\n\t\tvar pageEnd = this.items.state.currentPage * this.items.state.pageSize;\n\t\tif (pageEnd > this.items.state.totalRecords) pageEnd = this.items.state.totalRecords;\n\n\t\tvar text = \"Errors \" + (this.items.state.totalRecords === 0 ? 0 : pageStart) + \" - \" + pageEnd + \" of \" + (this.items.state.totalRecords || 0).toLocaleString();\n\t\tif (this.items.state.totalRecords === null) text = \"No errors\";\n\n\t\tthis.ui.headerCounter.text(this.items.state.totalRecords);\n\n\t\tthis.ui.counterBar.text(text);\n\t},\n\n\tonAttach: function onAttach() {\n\t\tvar columns = [{ name: \"message\", label: \"Error\", cell: \"string\", editable: false }];\n\n\t\tthis.grid = new Grid({ el: this.ui.grid, columns: columns, collection: this.collection, pageSize: 15, noLoad: true });\n\n\t\tthis.collection.run = true;\n\n\t\tthis.items = this.grid.collection;\n\n\t\tthis.bindEvents(this.items, this.itemEvents);\n\n\t\tthis.ui.filterBar.prepend(this.grid.filter({\n\t\t\tfilterContainer: this.ui.filterBar,\n\t\t\tfilters: [],\n\t\t\tdefaultFilters: []\n\t\t}).render().el);\n\n\t\t$(\".paging\", this.el).append(this.grid.paging().render().el);\n\n\t\tthis.updateCounter();\n\t},\n\n\tmodelAdd: function modelAdd(model) {\n\t\tthis.items.fullCollection.add(model);\n\n\t\tthis.updateCounter();\n\t},\n\n\tmodelChange: function modelChange(model) {\n\t\tif (model.get(\"ignore\")) return this.items.fullCollection.remove(model);\n\n\t\t//this.items.fullCollection.set(model);\n\t\tthis.updateCounter();\n\t},\n\n\tmodelRemove: function modelRemove(model) {\n\t\tif (!this.items) return;\n\t\tthis.items.fullCollection.remove(model);\n\t\tthis.updateCounter();\n\t},\n\n\tretry: function retry(model, evt) {\n\t\tvar el = $(evt.target);\n\t\tvar retry = el.hasClass(\"retry\");\n\t\tvar ignore = el.hasClass(\"ignore\");\n\t\tmodel.save({ queued: retry, ignore: ignore, pending: true, failed: null, state: 0 });\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVycm9ycy5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCIkIiwiR3JpZCIsIm1vZHVsZSIsImV4cG9ydHMiLCJNYXJpb25ldHRlIiwiVmlldyIsImV4dGVuZCIsImNsYXNzTmFtZSIsInVpIiwiaGVhZGVyQ291bnRlciIsImZpbHRlckJhciIsImNvdW50ZXJCYXIiLCJncmlkIiwicmV0cnkiLCJjb2xsZWN0aW9uRXZlbnRzIiwiYWRkIiwiY2hhbmdlIiwicmVtb3ZlIiwic3luYyIsIml0ZW1FdmVudHMiLCJ0ZW1wbGF0ZSIsIm9uQmVmb3JlRGVzdHJveSIsImRlc3Ryb3kiLCJ1cGRhdGVDb3VudGVyIiwiaXRlbXMiLCJ0ZXh0IiwicGFnZVN0YXJ0Iiwic3RhdGUiLCJjdXJyZW50UGFnZSIsInBhZ2VTaXplIiwicGFnZUVuZCIsInRvdGFsUmVjb3JkcyIsInRvTG9jYWxlU3RyaW5nIiwib25BdHRhY2giLCJjb2x1bW5zIiwibmFtZSIsImxhYmVsIiwiY2VsbCIsImVkaXRhYmxlIiwiZWwiLCJjb2xsZWN0aW9uIiwibm9Mb2FkIiwicnVuIiwiYmluZEV2ZW50cyIsInByZXBlbmQiLCJmaWx0ZXIiLCJmaWx0ZXJDb250YWluZXIiLCJmaWx0ZXJzIiwiZGVmYXVsdEZpbHRlcnMiLCJyZW5kZXIiLCJhcHBlbmQiLCJwYWdpbmciLCJtb2RlbEFkZCIsIm1vZGVsIiwiZnVsbENvbGxlY3Rpb24iLCJtb2RlbENoYW5nZSIsImdldCIsIm1vZGVsUmVtb3ZlIiwiZXZ0IiwidGFyZ2V0IiwiaGFzQ2xhc3MiLCJpZ25vcmUiLCJzYXZlIiwicXVldWVkIiwicGVuZGluZyIsImZhaWxlZCJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUMsSUFBSUQsUUFBUSxRQUFSLENBQVY7O0FBRUEsSUFBTUUsT0FBT0YsUUFBUSxnQkFBUixDQUFiOztBQUVBRyxPQUFPQyxPQUFQLEdBQWlCTCxTQUFTTSxV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ekIsRUFBaUNHLFNBQVMsSUFBMUMsRUFBZ0RDLFFBQVEsSUFBeEQsRUFBOER0QyxPQUFPLENBQXJFLEVBQVg7QUFDQTtBQXBHK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0ICQgPSByZXF1aXJlKFwianF1ZXJ5XCIpO1xuXG5jb25zdCBHcmlkID0gcmVxdWlyZShcIi4uLy4uL2xpYi9ncmlkXCIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwiaW1wb3J0LWVycm9yc1wiLFxuXG5cdHVpOiB7XG5cdFx0aGVhZGVyQ291bnRlcjogXCIjaGVhZGVyLWNvdW50ZXJcIixcblx0XHRmaWx0ZXJCYXI6IFwiLm9wcy1iYXIgLmZpbHRlcnNcIixcblx0XHRjb3VudGVyQmFyOiBcIi5vcHMtYmFyIC5jb3VudGVyXCIsXG5cdFx0Z3JpZDogXCJkaXYuZ3JpZFwiLFxuXG5cdFx0cmV0cnk6IFwiYnV0dG9uLnJldHJ5XCIsXG5cdH0sXG5cblx0Y29sbGVjdGlvbkV2ZW50czoge1xuXHRcdGFkZDogXCJtb2RlbEFkZFwiLFxuXHRcdGNoYW5nZTogXCJtb2RlbENoYW5nZVwiLFxuXHRcdHJlbW92ZTogXCJtb2RlbFJlbW92ZVwiLFxuXHRcdHN5bmM6IFwidXBkYXRlQ291bnRlclwiLFxuXHR9LFxuXG5cdGl0ZW1FdmVudHM6IHtcblx0XHQvL1wic3luYyByZXNldFwiOiBcInVwZGF0ZUNvdW50ZXJcIixcblx0XHRcInJvdzpjdXN0b21jbGlja1wiOiBcInJldHJ5XCIsXG5cdH0sXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvZXJyb3JzLm51bmpcIiksXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5ncmlkKVxuXHRcdFx0dGhpcy5ncmlkLmRlc3Ryb3koKTtcblx0fSxcblxuXHR1cGRhdGVDb3VudGVyOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIXRoaXMuaXRlbXMpIHtcblx0XHRcdHRoaXMudWkuaGVhZGVyQ291bnRlci50ZXh0KFwiMFwiKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgcGFnZVN0YXJ0ID0gKCgodGhpcy5pdGVtcy5zdGF0ZS5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5pdGVtcy5zdGF0ZS5wYWdlU2l6ZSkgKyAxKTtcblx0XHRsZXQgcGFnZUVuZCA9ICgodGhpcy5pdGVtcy5zdGF0ZS5jdXJyZW50UGFnZSkgKiB0aGlzLml0ZW1zLnN0YXRlLnBhZ2VTaXplKTtcblx0XHRpZiAocGFnZUVuZCA+IHRoaXMuaXRlbXMuc3RhdGUudG90YWxSZWNvcmRzKVxuXHRcdFx0cGFnZUVuZCA9IHRoaXMuaXRlbXMuc3RhdGUudG90YWxSZWNvcmRzO1xuXG5cdFx0bGV0IHRleHQgPSBcIkVycm9ycyBcIiArICh0aGlzLml0ZW1zLnN0YXRlLnRvdGFsUmVjb3JkcyA9PT0gMCA/IDAgOiBwYWdlU3RhcnQpICsgXCIgLSBcIiArIHBhZ2VFbmQgKyBcIiBvZiBcIiArICh0aGlzLml0ZW1zLnN0YXRlLnRvdGFsUmVjb3JkcyB8fCAwKS50b0xvY2FsZVN0cmluZygpO1xuXHRcdGlmICh0aGlzLml0ZW1zLnN0YXRlLnRvdGFsUmVjb3JkcyA9PT0gbnVsbClcblx0XHRcdHRleHQgPSBcIk5vIGVycm9yc1wiO1xuXG5cdFx0dGhpcy51aS5oZWFkZXJDb3VudGVyLnRleHQodGhpcy5pdGVtcy5zdGF0ZS50b3RhbFJlY29yZHMpO1xuXG5cdFx0dGhpcy51aS5jb3VudGVyQmFyLnRleHQodGV4dCk7XG5cdH0sXG5cblx0b25BdHRhY2g6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGNvbHVtbnMgPSBbXG5cdFx0XHR7IG5hbWU6IFwibWVzc2FnZVwiLCBsYWJlbDogXCJFcnJvclwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRdO1xuXG5cdFx0dGhpcy5ncmlkID0gbmV3IEdyaWQoeyBlbDogdGhpcy51aS5ncmlkLCBjb2x1bW5zOiBjb2x1bW5zLCBjb2xsZWN0aW9uOiB0aGlzLmNvbGxlY3Rpb24sIHBhZ2VTaXplOiAxNSwgbm9Mb2FkOiB0cnVlIH0pO1xuXG5cdFx0dGhpcy5jb2xsZWN0aW9uLnJ1biA9IHRydWU7XG5cblx0XHR0aGlzLml0ZW1zID0gdGhpcy5ncmlkLmNvbGxlY3Rpb247XG5cblx0XHR0aGlzLmJpbmRFdmVudHModGhpcy5pdGVtcywgdGhpcy5pdGVtRXZlbnRzKTtcblxuXHRcdHRoaXMudWkuZmlsdGVyQmFyLnByZXBlbmQodGhpcy5ncmlkLmZpbHRlcih7XG5cdFx0XHRmaWx0ZXJDb250YWluZXI6IHRoaXMudWkuZmlsdGVyQmFyLFxuXHRcdFx0ZmlsdGVyczogW10sXG5cdFx0XHRkZWZhdWx0RmlsdGVyczogW10sXG5cdFx0fSkucmVuZGVyKCkuZWwpO1xuXG5cdFx0JChcIi5wYWdpbmdcIiwgdGhpcy5lbCkuYXBwZW5kKHRoaXMuZ3JpZC5wYWdpbmcoKS5yZW5kZXIoKS5lbCk7XG5cblx0XHR0aGlzLnVwZGF0ZUNvdW50ZXIoKTtcblx0fSxcblxuXHRtb2RlbEFkZDogZnVuY3Rpb24obW9kZWwpIHtcblx0XHR0aGlzLml0ZW1zLmZ1bGxDb2xsZWN0aW9uLmFkZChtb2RlbCk7XG5cblx0XHR0aGlzLnVwZGF0ZUNvdW50ZXIoKTtcblx0fSxcblxuXHRtb2RlbENoYW5nZTogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRpZiAobW9kZWwuZ2V0KFwiaWdub3JlXCIpKVxuXHRcdFx0cmV0dXJuIHRoaXMuaXRlbXMuZnVsbENvbGxlY3Rpb24ucmVtb3ZlKG1vZGVsKTtcblxuXHRcdC8vdGhpcy5pdGVtcy5mdWxsQ29sbGVjdGlvbi5zZXQobW9kZWwpO1xuXHRcdHRoaXMudXBkYXRlQ291bnRlcigpO1xuXHR9LFxuXG5cdG1vZGVsUmVtb3ZlOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdGlmICghdGhpcy5pdGVtcylcblx0XHRcdHJldHVybjtcblx0XHR0aGlzLml0ZW1zLmZ1bGxDb2xsZWN0aW9uLnJlbW92ZShtb2RlbCk7XG5cdFx0dGhpcy51cGRhdGVDb3VudGVyKCk7XG5cdH0sXG5cblx0cmV0cnk6IGZ1bmN0aW9uKG1vZGVsLCBldnQpIHtcblx0XHRjb25zdCBlbCA9ICQoZXZ0LnRhcmdldCk7XG5cdFx0Y29uc3QgcmV0cnkgPSBlbC5oYXNDbGFzcyhcInJldHJ5XCIpO1xuXHRcdGNvbnN0IGlnbm9yZSA9IGVsLmhhc0NsYXNzKFwiaWdub3JlXCIpO1xuXHRcdG1vZGVsLnNhdmUoeyBxdWV1ZWQ6IHJldHJ5LCBpZ25vcmU6IGlnbm9yZSwgcGVuZGluZzogdHJ1ZSwgZmFpbGVkOiBudWxsLCBzdGF0ZTogMCB9KTtcblx0fSxcbn0pOyJdfQ==",
    "\"use strict\";\n\nvar _regenerator = require(\"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\nvar Backbone = require(\"backbone\");\nvar moment = require(\"moment\");\nvar _ = require(\"lodash\");\n\nvar settings = require(\"app-settings\");\n\nvar App = require(\"../../index\");\nvar ServerGrid = require(\"../../lib/serverGrid\");\nvar SmallModal = require(\"../../lib/smallModal\");\n\nvar Group = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"import_id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/imports\";\n\t},\n\n\tcomputeds: {\n\t\thtmlState: function htmlState() {\n\t\t\tvar state = void 0;\n\t\t\tif (_.startsWith(this.get(\"action\"), \"add\")) state = \"add\";else if (_.startsWith(this.get(\"action\"), \"update\")) state = \"update\";else if (_.startsWith(this.get(\"action\"), \"delete\")) state = \"delete\";\n\n\t\t\treturn \"<span class='\" + state + \"'></span>\";\n\t\t}\n\t}\n});\n\nvar Groups = Backbone.PageableCollection.extend({\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/imports?type=group\";\n\t},\n\n\tmodel: Group,\n\n\tstate: {\n\t\tpageSize: 15\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\ttotalPages: null,\n\t\ttotalRecords: null,\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"groups-import\",\n\n\tui: {\n\t\tfilterBar: \".ops-bar .filters\",\n\t\tcounterBar: \".ops-bar .counter\",\n\t\tgrid: \"div.grid\",\n\t\tpaging: \".paging\",\n\n\t\treset: \".actions div.reset\",\n\t\tsubmit: \".actions div.submit\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.reset\": \"resetQueue\",\n\t\t\"click @ui.submit\": \"submitQueue\"\n\t},\n\n\tcollectionEvents: {\n\t\t\"toolbar:click:delete\": \"deleteItem\"\n\t},\n\n\ttemplate: require(\"../templates/groups.nunj\"),\n\n\tinitialize: function initialize() {\n\t\tthis.collection = new Groups();\n\n\t\tthis.bindEvents(this.collection, this.collectionEvents);\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tif (this.grid) this.grid.destroy();\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"htmlState\", label: \"State\", cell: ServerGrid.HTMLCell.extend({}), editable: false }, { name: \"code\", label: \"Code\", cell: \"string\", editable: false }, { name: \"name\", label: \"Name\", cell: \"string\", editable: true }, { name: \"year\", label: \"Year\", cell: ServerGrid.SelectraCell.extend({\n\t\t\t\toptions: {\n\t\t\t\t\titems: _.map(_.range(2017, moment().year() + 2), function (y) {\n\t\t\t\t\t\treturn { key: y, value: y };\n\t\t\t\t\t}),\n\t\t\t\t\twidth: \"100px\"\n\t\t\t\t}\n\t\t\t}), editable: true }, { name: \"language\", label: \"Language\", cell: ServerGrid.SelectraCell.extend({\n\t\t\t\toptions: {\n\t\t\t\t\titems: _.map(settings.languageList, function (x) {\n\t\t\t\t\t\treturn { key: x, value: x };\n\t\t\t\t\t}),\n\t\t\t\t\twidth: \"200px\"\n\t\t\t\t}\n\t\t\t}), editable: true }, { name: \"subject\", label: \"Subject\", cell: ServerGrid.SelectraCell.extend({\n\t\t\t\toptions: {\n\t\t\t\t\tserver: {\n\t\t\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/subjects\",\n\t\t\t\t\t\tdelayLoad: true,\n\t\t\t\t\t\tkey: \"subject\",\n\t\t\t\t\t\tvalue: \"subject\"\n\t\t\t\t\t},\n\t\t\t\t\tpaging: {\n\t\t\t\t\t\tpageSize: 20,\n\t\t\t\t\t\tinfinite: true\n\t\t\t\t\t},\n\t\t\t\t\twidth: \"200px\"\n\t\t\t\t}\n\t\t\t}), editable: true }, { name: \"grade\", label: \"Grade\", cell: ServerGrid.SelectraCell.extend({\n\t\t\t\toptions: {\n\t\t\t\t\titems: _.reduce(settings.gradeList, function (sum, num, key) {\n\t\t\t\t\t\tsum[key] = _.reduce(num.sort(function (a, b) {\n\t\t\t\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t\t\t\t}), function (sum1, num1) {\n\t\t\t\t\t\t\tsum1.push({ key: num1.value, value: num1.name });return sum1;\n\t\t\t\t\t\t}, []);\n\n\t\t\t\t\t\treturn sum;\n\t\t\t\t\t}, {}),\n\t\t\t\t\twidth: \"100px\"\n\t\t\t\t}\n\t\t\t}), editable: true }, { label: \"Actions\", cell: new ServerGrid.ToolbarCell({ tooltips: [{ title: \"Delete\", icon: \"fa-trash-alt\", data: \"delete\" }] }), editable: false, sortable: false }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.paging,\n\t\t\tcolumns: columns,\n\t\t\tcollection: this.collection,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counterBar,\n\t\t\t\ttemplate: \"Queued groups $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tthis.items = this.grid.collection;\n\n\t\tthis.listenTo(this.grid.collection, \"change\", this.handleEdit.bind(this));\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar filtars = [textFilter];\n\t\tvar defFilters = [\"textFilter\"];\n\n\t\tthis.ui.filterBar.prepend(this.grid.filter({\n\t\t\tfilterContainer: this.ui.filterBar,\n\t\t\tfilters: filtars,\n\t\t\tdefaultFilters: defFilters\n\t\t}).render().el);\n\t},\n\n\thandleEdit: function () {\n\t\tvar _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee(model) {\n\t\t\tvar dataKeys, updatedData;\n\t\t\treturn _regenerator2.default.wrap(function _callee$(_context) {\n\t\t\t\twhile (1) {\n\t\t\t\t\tswitch (_context.prev = _context.next) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tdataKeys = _.keys(model.get(\"data\"));\n\t\t\t\t\t\t\tupdatedData = {};\n\n\n\t\t\t\t\t\t\t_.each(dataKeys, function (key) {\n\t\t\t\t\t\t\t\tupdatedData[key] = model.get(key) || \"\";\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t_context.next = 5;\n\t\t\t\t\t\t\treturn model.save({ data: updatedData, action: model.get(\"action\") }, { patch: true });\n\n\t\t\t\t\t\tcase 5:\n\t\t\t\t\t\t\tthis.trigger(\"state:refresh\");\n\n\t\t\t\t\t\tcase 6:\n\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\treturn _context.stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, _callee, this);\n\t\t}));\n\n\t\tfunction handleEdit(_x) {\n\t\t\treturn _ref.apply(this, arguments);\n\t\t}\n\n\t\treturn handleEdit;\n\t}(),\n\n\tdeleteItem: function deleteItem(model) {\n\t\tvar _this = this;\n\n\t\tthis.delModal = new SmallModal({\n\t\t\tpersist: true,\n\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Remove Queued Group: \" + (model.get(\"code\") || model.get(\"name\")),\n\t\t\tbody: \"<p>Are you sure you want to remove this queued group?</p>\",\n\t\t\twarning: true\n\t\t});\n\t\tthis.delModal.on(\"button:ok\", function () {\n\t\t\tmodel.destroy({ wait: true, success: _this.deletionSuccess.bind(_this), error: _this.deletionError.bind(_this) });\n\t\t});\n\n\t\tthis.delModal.show();\n\t},\n\n\tdeletionSuccess: function deletionSuccess() {\n\t\tthis.delModal.destroy();\n\t\tthis.trigger(\"state:refresh\");\n\t},\n\n\tdeletionError: function deletionError(model, xhr) {\n\t\tvar answer = App.parseResponse(xhr);\n\t\tthis.delModal.showError(\"Deletion failed: \" + (answer.detail || answer.info));\n\t},\n\n\tresetQueue: function resetQueue() {\n\t\tthis.trigger(\"queue:reset\", this);\n\t},\n\n\tsubmitQueue: function submitQueue() {\n\t\tthis.trigger(\"queue:submit\", this);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImdyb3Vwcy5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCJtb21lbnQiLCJfIiwic2V0dGluZ3MiLCJBcHAiLCJTZXJ2ZXJHcmlkIiwiU21hbGxNb2RhbCIsIkdyb3VwIiwiRXBveHkiLCJNb2RlbCIsImV4dGVuZCIsImlkQXR0cmlidXRlIiwidXJsUm9vdCIsImNvbXB1dGVkcyIsImh0bWxTdGF0ZSIsInN0YXRlIiwic3RhcnRzV2l0aCIsImdldCIsIkdyb3VwcyIsIlBhZ2VhYmxlQ29sbGVjdGlvbiIsInVybCIsIm1vZGVsIiwicGFnZVNpemUiLCJtb2RlIiwicXVlcnlQYXJhbXMiLCJ0b3RhbFBhZ2VzIiwidG90YWxSZWNvcmRzIiwic29ydEtleSIsInBhcnNlU3RhdGUiLCJyZXNwIiwidG90YWwiLCJwYXJzZVJlY29yZHMiLCJyb3dzIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiY2xhc3NOYW1lIiwidWkiLCJmaWx0ZXJCYXIiLCJjb3VudGVyQmFyIiwiZ3JpZCIsInBhZ2luZyIsInJlc2V0Iiwic3VibWl0IiwiZXZlbnRzIiwiY29sbGVjdGlvbkV2ZW50cyIsInRlbXBsYXRlIiwiaW5pdGlhbGl6ZSIsImNvbGxlY3Rpb24iLCJiaW5kRXZlbnRzIiwib25CZWZvcmVEZXN0cm95IiwiZGVzdHJveSIsIm9uUmVuZGVyIiwiY29sdW1ucyIsIm5hbWUiLCJsYWJlbCIsImNlbGwiLCJIVE1MQ2VsbCIsImVkaXRhYmxlIiwiU2VsZWN0cmFDZWxsIiwib3B0aW9ucyIsIml0ZW1zIiwibWFwIiwicmFuZ2UiLCJ5ZWFyIiwia2V5IiwieSIsInZhbHVlIiwid2lkdGgiLCJsYW5ndWFnZUxpc3QiLCJ4Iiwic2VydmVyIiwiZmV0Y2giLCJkZWxheUxvYWQiLCJpbmZpbml0ZSIsInJlZHVjZSIsImdyYWRlTGlzdCIsInN1bSIsIm51bSIsInNvcnQiLCJhIiwiYiIsImxleGljYWwiLCJ0b1VwcGVyQ2FzZSIsImxvY2FsZUNvbXBhcmUiLCJzdW0xIiwibnVtMSIsInB1c2giLCJUb29sYmFyQ2VsbCIsInRvb2x0aXBzIiwidGl0bGUiLCJpY29uIiwiZGF0YSIsInNvcnRhYmxlIiwiZWwiLCJjb3VudGVyIiwiZWxlbWVudCIsImxpc3RlblRvIiwiaGFuZGxlRWRpdCIsImJpbmQiLCJ0ZXh0RmlsdGVyIiwidHlwZSIsImRlYm91bmNlIiwiZmlsdGFycyIsImRlZkZpbHRlcnMiLCJwcmVwZW5kIiwiZmlsdGVyIiwiZmlsdGVyQ29udGFpbmVyIiwiZmlsdGVycyIsImRlZmF1bHRGaWx0ZXJzIiwicmVuZGVyIiwiZGF0YUtleXMiLCJrZXlzIiwidXBkYXRlZERhdGEiLCJlYWNoIiwic2F2ZSIsImFjdGlvbiIsInBhdGNoIiwidHJpZ2dlciIsImRlbGV0ZUl0ZW0iLCJkZWxNb2RhbCIsInBlcnNpc3QiLCJib2R5Iiwid2FybmluZyIsIm9uIiwid2FpdCIsInN1Y2Nlc3MiLCJkZWxldGlvblN1Y2Nlc3MiLCJlcnJvciIsImRlbGV0aW9uRXJyb3IiLCJzaG93IiwieGhyIiwiYW5zd2VyIiwicGFyc2VSZXNwb25zZSIsInNob3dFcnJvciIsImRldGFpbCIsImluZm8iLCJyZXNldFF1ZXVlIiwic3VibWl0UXVldWUiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUMsU0FBU0QsUUFBUSxRQUFSLENBQWY7QUFDQSxJQUFNRSxJQUFJRixRQUFRLFFBQVIsQ0FBVjs7QUFFQSxJQUFNRyxXQUFXSCxRQUFRLGNBQVIsQ0FBakI7O0FBRUEsSUFBTUksTUFBTUosUUFBUSxhQUFSLENBQVo7QUFDQSxJQUFNSyxhQUFhTCxRQUFRLHNCQUFSLENBQW5CO0FBQ0EsSUFBTU0sYUFBYU4sUUFBUSxzQkFBUixDQUFuQjs7QUFFQSxJQUFNTyxRQUFRUixTQUFTUyxLQUFULENBQWVDLEtBQWYsQ0FBcUJDLE1BQXJCLENBQTRCO0FBQ3pDQyxjQUFhLFdBRDRCOztBQUd6Q0MsVUFBUyxt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QkFBZSx1QkFBUzdHLEtBQVQsRUFBZ0IrRyxHQUFoQixFQUFxQjtBQUNuQyxNQUFNQyxTQUFTakksSUFBSWtJLGFBQUosQ0FBa0JGLEdBQWxCLENBQWY7QUFDQSxPQUFLWCxRQUFMLENBQWNjLFNBQWQsQ0FBd0IsdUJBQXVCRixPQUFPRyxNQUFQLElBQWlCSCxPQUFPSSxJQUEvQyxDQUF4QjtBQUNBLEVBekorQzs7QUEySmhEQyxhQUFZLHNCQUFXO0FBQ3RCLE9BQUtuQixPQUFMLENBQWEsYUFBYixFQUE0QixJQUE1QjtBQUNBLEVBN0orQzs7QUErSmhEb0IsY0FBYSx1QkFBVztBQUN2QixPQUFLcEIsT0FBTCxDQUFhLGNBQWIsRUFBNkIsSUFBN0I7QUFDQTtBQWpLK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoiZ3JvdXBzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IG1vbWVudCA9IHJlcXVpcmUoXCJtb21lbnRcIik7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcblxuY29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuXG5jb25zdCBBcHAgPSByZXF1aXJlKFwiLi4vLi4vaW5kZXhcIik7XG5jb25zdCBTZXJ2ZXJHcmlkID0gcmVxdWlyZShcIi4uLy4uL2xpYi9zZXJ2ZXJHcmlkXCIpO1xuY29uc3QgU21hbGxNb2RhbCA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc21hbGxNb2RhbFwiKTtcblxuY29uc3QgR3JvdXAgPSBCYWNrYm9uZS5FcG94eS5Nb2RlbC5leHRlbmQoe1xuXHRpZEF0dHJpYnV0ZTogXCJpbXBvcnRfaWRcIixcblxuXHR1cmxSb290OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvaW1wb3J0c1wiO1xuXHR9LFxuXG5cdGNvbXB1dGVkczoge1xuXHRcdGh0bWxTdGF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRsZXQgc3RhdGU7XG5cdFx0XHRpZiAoXy5zdGFydHNXaXRoKHRoaXMuZ2V0KFwiYWN0aW9uXCIpLCBcImFkZFwiKSlcblx0XHRcdFx0c3RhdGUgPSBcImFkZFwiO1xuXHRcdFx0ZWxzZSBpZiAoXy5zdGFydHNXaXRoKHRoaXMuZ2V0KFwiYWN0aW9uXCIpLCBcInVwZGF0ZVwiKSlcblx0XHRcdFx0c3RhdGUgPSBcInVwZGF0ZVwiO1xuXHRcdFx0ZWxzZSBpZiAoXy5zdGFydHNXaXRoKHRoaXMuZ2V0KFwiYWN0aW9uXCIpLCBcImRlbGV0ZVwiKSlcblx0XHRcdFx0c3RhdGUgPSBcImRlbGV0ZVwiO1xuXG5cdFx0XHRyZXR1cm4gYDxzcGFuIGNsYXNzPScke3N0YXRlfSc+PC9zcGFuPmA7XG5cdFx0fSxcblx0fSxcbn0pO1xuXG5jb25zdCBHcm91cHMgPSBCYWNrYm9uZS5QYWdlYWJsZUNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvaW1wb3J0cz90eXBlPWdyb3VwXCI7XG5cdH0sXG5cblx0bW9kZWw6IEdyb3VwLFxuXG5cdHN0YXRlOiB7XG5cdFx0cGFnZVNpemU6IDE1LFxuXHR9LFxuXHRtb2RlOiBcInNlcnZlclwiLFxuXG5cdHF1ZXJ5UGFyYW1zOiB7XG5cdFx0cGFnZVNpemU6IFwicGFnZVNpemVcIixcblx0XHR0b3RhbFBhZ2VzOiBudWxsLFxuXHRcdHRvdGFsUmVjb3JkczogbnVsbCxcblx0XHRzb3J0S2V5OiBcInNvcnRCeVwiLFxuXHR9LFxuXG5cdHBhcnNlU3RhdGU6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRyZXR1cm4geyB0b3RhbFJlY29yZHM6IHJlc3AudG90YWwgfTtcblx0fSxcblxuXHRwYXJzZVJlY29yZHM6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRyZXR1cm4gcmVzcC5yb3dzO1xuXHR9LFxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJncm91cHMtaW1wb3J0XCIsXG5cblx0dWk6IHtcblx0XHRmaWx0ZXJCYXI6IFwiLm9wcy1iYXIgLmZpbHRlcnNcIixcblx0XHRjb3VudGVyQmFyOiBcIi5vcHMtYmFyIC5jb3VudGVyXCIsXG5cdFx0Z3JpZDogXCJkaXYuZ3JpZFwiLFxuXHRcdHBhZ2luZzogXCIucGFnaW5nXCIsXG5cblx0XHRyZXNldDogXCIuYWN0aW9ucyBkaXYucmVzZXRcIixcblx0XHRzdWJtaXQ6IFwiLmFjdGlvbnMgZGl2LnN1Ym1pdFwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLnJlc2V0XCI6IFwicmVzZXRRdWV1ZVwiLFxuXHRcdFwiY2xpY2sgQHVpLnN1Ym1pdFwiOiBcInN1Ym1pdFF1ZXVlXCIsXG5cdH0sXG5cblx0Y29sbGVjdGlvbkV2ZW50czoge1xuXHRcdFwidG9vbGJhcjpjbGljazpkZWxldGVcIjogXCJkZWxldGVJdGVtXCIsXG5cdH0sXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvZ3JvdXBzLm51bmpcIiksXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jb2xsZWN0aW9uID0gbmV3IEdyb3VwcygpO1xuXG5cdFx0dGhpcy5iaW5kRXZlbnRzKHRoaXMuY29sbGVjdGlvbiwgdGhpcy5jb2xsZWN0aW9uRXZlbnRzKTtcblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLmdyaWQpXG5cdFx0XHR0aGlzLmdyaWQuZGVzdHJveSgpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBjb2x1bW5zID0gW1xuXHRcdFx0eyBuYW1lOiBcImh0bWxTdGF0ZVwiLCBsYWJlbDogXCJTdGF0ZVwiLCBjZWxsOiBTZXJ2ZXJHcmlkLkhUTUxDZWxsLmV4dGVuZCh7fSksIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImNvZGVcIiwgbGFiZWw6IFwiQ29kZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJuYW1lXCIsIGxhYmVsOiBcIk5hbWVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IHRydWUgfSxcblx0XHRcdHsgbmFtZTogXCJ5ZWFyXCIsIGxhYmVsOiBcIlllYXJcIiwgY2VsbDogU2VydmVyR3JpZC5TZWxlY3RyYUNlbGwuZXh0ZW5kKHtcblx0XHRcdFx0b3B0aW9uczoge1xuXHRcdFx0XHRcdGl0ZW1zOiBfLm1hcChfLnJhbmdlKDIwMTcsIG1vbWVudCgpLnllYXIoKSArIDIpLCB5ID0+ICh7IGtleTogeSwgdmFsdWU6IHkgfSkpLFxuXHRcdFx0XHRcdHdpZHRoOiBcIjEwMHB4XCIsXG5cdFx0XHRcdH0sXG5cdFx0XHR9KSwgZWRpdGFibGU6IHRydWUgfSxcblx0XHRcdHsgbmFtZTogXCJsYW5ndWFnZVwiLCBsYWJlbDogXCJMYW5ndWFnZVwiLCBjZWxsOiBTZXJ2ZXJHcmlkLlNlbGVjdHJhQ2VsbC5leHRlbmQoe1xuXHRcdFx0XHRvcHRpb25zOiB7XG5cdFx0XHRcdFx0aXRlbXM6IF8ubWFwKHNldHRpbmdzLmxhbmd1YWdlTGlzdCwgeCA9PiAoeyBrZXk6IHgsIHZhbHVlOiB4IH0pKSxcblx0XHRcdFx0XHR3aWR0aDogXCIyMDBweFwiLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSksIGVkaXRhYmxlOiB0cnVlIH0sXG5cdFx0XHR7IG5hbWU6IFwic3ViamVjdFwiLCBsYWJlbDogXCJTdWJqZWN0XCIsIGNlbGw6IFNlcnZlckdyaWQuU2VsZWN0cmFDZWxsLmV4dGVuZCh7XG5cdFx0XHRcdG9wdGlvbnM6IHtcblx0XHRcdFx0XHRzZXJ2ZXI6IHtcblx0XHRcdFx0XHRcdGZldGNoOiBgJHtzZXR0aW5ncy51cmxSb290fS9hcGkvMS4wL2RhdGEvc3ViamVjdHNgLFxuXHRcdFx0XHRcdFx0ZGVsYXlMb2FkOiB0cnVlLFxuXHRcdFx0XHRcdFx0a2V5OiBcInN1YmplY3RcIixcblx0XHRcdFx0XHRcdHZhbHVlOiBcInN1YmplY3RcIixcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRcdFx0cGFnZVNpemU6IDIwLFxuXHRcdFx0XHRcdFx0aW5maW5pdGU6IHRydWUsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR3aWR0aDogXCIyMDBweFwiLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSksIGVkaXRhYmxlOiB0cnVlIH0sXG5cdFx0XHR7IG5hbWU6IFwiZ3JhZGVcIiwgbGFiZWw6IFwiR3JhZGVcIiwgY2VsbDogU2VydmVyR3JpZC5TZWxlY3RyYUNlbGwuZXh0ZW5kKHtcblx0XHRcdFx0b3B0aW9uczoge1xuXHRcdFx0XHRcdGl0ZW1zOiBfLnJlZHVjZShzZXR0aW5ncy5ncmFkZUxpc3QsIChzdW0sIG51bSwga2V5KSA9PiB7XG5cdFx0XHRcdFx0XHRzdW1ba2V5XSA9IF8ucmVkdWNlKG51bS5zb3J0KChhLCBiKSA9PiAoXCJsZXhpY2FsXCIgaW4gYSA/IGEubGV4aWNhbCA6IGEubmFtZSkudG9VcHBlckNhc2UoKS5sb2NhbGVDb21wYXJlKChcImxleGljYWxcIiBpbiBiID8gYi5sZXhpY2FsIDogYi5uYW1lKS50b1VwcGVyQ2FzZSgpKSksXG5cdFx0XHRcdFx0XHRcdChzdW0xLCBudW0xKSA9PiB7IHN1bTEucHVzaCh7IGtleTogbnVtMS52YWx1ZSwgdmFsdWU6IG51bTEubmFtZSB9KTsgcmV0dXJuIHN1bTE7IH0sIFtdKTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIHN1bTtcblx0XHRcdFx0XHR9LCB7fSksXG5cdFx0XHRcdFx0d2lkdGg6IFwiMTAwcHhcIixcblx0XHRcdFx0fSxcblx0XHRcdH0pLCBlZGl0YWJsZTogdHJ1ZSB9LFxuXHRcdFx0eyBsYWJlbDogXCJBY3Rpb25zXCIsIGNlbGw6IG5ldyBTZXJ2ZXJHcmlkLlRvb2xiYXJDZWxsKHsgdG9vbHRpcHM6IFtcblx0XHRcdFx0eyB0aXRsZTogXCJEZWxldGVcIiwgaWNvbjogXCJmYS10cmFzaC1hbHRcIiwgZGF0YTogXCJkZWxldGVcIiB9LFxuXHRcdFx0XSB9KSwgZWRpdGFibGU6IGZhbHNlLCBzb3J0YWJsZTogZmFsc2UgfSxcblx0XHRdO1xuXG5cdFx0dGhpcy5ncmlkID0gbmV3IFNlcnZlckdyaWQoe1xuXHRcdFx0ZWw6IHRoaXMudWkucGFnaW5nLFxuXHRcdFx0Y29sdW1uczogY29sdW1ucyxcblx0XHRcdGNvbGxlY3Rpb246IHRoaXMuY29sbGVjdGlvbixcblx0XHRcdGNvdW50ZXI6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5jb3VudGVyQmFyLFxuXHRcdFx0XHR0ZW1wbGF0ZTogXCJRdWV1ZWQgZ3JvdXBzICRzdGFydCAtICRlbmQgb2YgJHRvdGFsXCIsXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdGVsZW1lbnQ6IHRoaXMudWkucGFnaW5nLFxuXHRcdFx0fSxcblx0XHR9KTtcblxuXHRcdHRoaXMuaXRlbXMgPSB0aGlzLmdyaWQuY29sbGVjdGlvbjtcblxuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ncmlkLmNvbGxlY3Rpb24sIFwiY2hhbmdlXCIsIHRoaXMuaGFuZGxlRWRpdC5iaW5kKHRoaXMpKTtcblxuXHRcdGNvbnN0IHRleHRGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcInRleHRcIixcblx0XHRcdG5hbWU6IFwidGV4dEZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiVGV4dCBTZWFyY2hcIixcblx0XHRcdGRlYm91bmNlOiAyMDAsXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdGNvbnN0IGZpbHRhcnMgPSBbdGV4dEZpbHRlcl07XG5cdFx0Y29uc3QgZGVmRmlsdGVycyA9IFtcInRleHRGaWx0ZXJcIl07XG5cblx0XHR0aGlzLnVpLmZpbHRlckJhci5wcmVwZW5kKHRoaXMuZ3JpZC5maWx0ZXIoe1xuXHRcdFx0ZmlsdGVyQ29udGFpbmVyOiB0aGlzLnVpLmZpbHRlckJhcixcblx0XHRcdGZpbHRlcnM6IGZpbHRhcnMsXG5cdFx0XHRkZWZhdWx0RmlsdGVyczogZGVmRmlsdGVycyxcblx0XHR9KS5yZW5kZXIoKS5lbCk7XG5cdH0sXG5cblx0aGFuZGxlRWRpdDogYXN5bmMgZnVuY3Rpb24obW9kZWwpIHtcblx0XHRjb25zdCBkYXRhS2V5cyA9IF8ua2V5cyhtb2RlbC5nZXQoXCJkYXRhXCIpKTtcblx0XHRjb25zdCB1cGRhdGVkRGF0YSA9IHt9O1xuXG5cdFx0Xy5lYWNoKGRhdGFLZXlzLCBrZXkgPT4ge1xuXHRcdFx0dXBkYXRlZERhdGFba2V5XSA9IG1vZGVsLmdldChrZXkpIHx8IFwiXCI7XG5cdFx0fSk7XG5cblx0XHRhd2FpdCBtb2RlbC5zYXZlKHsgZGF0YTogdXBkYXRlZERhdGEsIGFjdGlvbjogbW9kZWwuZ2V0KFwiYWN0aW9uXCIpIH0sIHsgcGF0Y2g6IHRydWUgfSk7XG5cdFx0dGhpcy50cmlnZ2VyKFwic3RhdGU6cmVmcmVzaFwiKTtcblx0fSxcblxuXG5cdGRlbGV0ZUl0ZW06IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0dGhpcy5kZWxNb2RhbCA9IG5ldyBTbWFsbE1vZGFsKHtcblx0XHRcdHBlcnNpc3Q6IHRydWUsXG5cdFx0XHR0aXRsZTogYDxzcGFuIGNsYXNzPSdmYWwgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUnLz4gUmVtb3ZlIFF1ZXVlZCBHcm91cDogJHttb2RlbC5nZXQoXCJjb2RlXCIpIHx8IG1vZGVsLmdldChcIm5hbWVcIil9YCxcblx0XHRcdGJvZHk6IFwiPHA+QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlbW92ZSB0aGlzIHF1ZXVlZCBncm91cD88L3A+XCIsXG5cdFx0XHR3YXJuaW5nOiB0cnVlLFxuXHRcdH0pO1xuXHRcdHRoaXMuZGVsTW9kYWwub24oXCJidXR0b246b2tcIiwgKCkgPT4ge1xuXHRcdFx0bW9kZWwuZGVzdHJveSh7IHdhaXQ6IHRydWUsIHN1Y2Nlc3M6IHRoaXMuZGVsZXRpb25TdWNjZXNzLmJpbmQodGhpcyksIGVycm9yOiB0aGlzLmRlbGV0aW9uRXJyb3IuYmluZCh0aGlzKSB9KTtcblx0XHR9KTtcblxuXHRcdHRoaXMuZGVsTW9kYWwuc2hvdygpO1xuXHR9LFxuXG5cdGRlbGV0aW9uU3VjY2VzczogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5kZWxNb2RhbC5kZXN0cm95KCk7XG5cdFx0dGhpcy50cmlnZ2VyKFwic3RhdGU6cmVmcmVzaFwiKTtcblx0fSxcblxuXHRkZWxldGlvbkVycm9yOiBmdW5jdGlvbihtb2RlbCwgeGhyKSB7XG5cdFx0Y29uc3QgYW5zd2VyID0gQXBwLnBhcnNlUmVzcG9uc2UoeGhyKTtcblx0XHR0aGlzLmRlbE1vZGFsLnNob3dFcnJvcihcIkRlbGV0aW9uIGZhaWxlZDogXCIgKyAoYW5zd2VyLmRldGFpbCB8fCBhbnN3ZXIuaW5mbykpO1xuXHR9LFxuXG5cdHJlc2V0UXVldWU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudHJpZ2dlcihcInF1ZXVlOnJlc2V0XCIsIHRoaXMpO1xuXHR9LFxuXG5cdHN1Ym1pdFF1ZXVlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnRyaWdnZXIoXCJxdWV1ZTpzdWJtaXRcIiwgdGhpcyk7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar _regenerator = require(\"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\nvar Backbone = require(\"backbone\");\nvar _ = require(\"lodash\");\nvar $ = require(\"jquery\");\nvar settings = require(\"app-settings\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar BigModal = require(\"../../lib/bigModal\");\nvar Errors = require(\"../../lib/errors.js\");\nvar App = require(\"../../index\");\n\nmodule.exports = BigModal.extend({\n\tui: {\n\t\tbuttonUpload: \"button.upload\",\n\t\tnoGroupDel: \"#noGroupDel\",\n\n\t\tuserAdditions: \"span.user-additions\",\n\t\tgroupAdditions: \"span.group-additions\",\n\t\trelationAdditions: \"span.relation-additions\",\n\t\tuserDeletions: \"span.user-deletions\",\n\t\tgroupDeletions: \"span.group-deletions\",\n\t\trelationDeletions: \"span.relation-deletions\",\n\t\tuserUpdates: \"span.user-updates\",\n\t\tgroupUpdates: \"span.group-updates\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonUpload\": \"onUpload\"\n\t},\n\n\tactions: {\n\t\taccept: \"onAccept\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\t_.bindAll(this);\n\n\t\tthis.userAdds = options.userAdds;\n\t\tthis.userUpdates = options.userUpdates;\n\t\tthis.userDeletes = options.userDeletes;\n\n\t\tthis.groupAdds = options.groupAdds;\n\t\tthis.groupUpdates = options.groupUpdates;\n\t\tthis.groupDeletes = options.groupDeletes;\n\n\t\tthis.relationAdds = options.relationAdds;\n\t\tthis.relationDeletes = options.relationDeletes;\n\n\t\tthis.currentImportView = options.currentView;\n\t\tthis.importInstance = options.importInstance;\n\t\tthis.websocketId = options.websocketId;\n\t\tthis.processing = options.processing;\n\n\t\tthis.Options = {\n\t\t\tpreventCancel: options.preventCancel,\n\t\t\tclasses: [\"import-modal\"],\n\t\t\ttemplate: require(\"../templates/importModal.nunj\").content,\n\t\t\tbuttons: {\n\t\t\t\tclose: {\n\t\t\t\t\ttype: \"cancel\",\n\t\t\t\t\tlabel: \"Cancel\"\n\t\t\t\t},\n\t\t\t\tok: {\n\t\t\t\t\ttype: \"accept\",\n\t\t\t\t\tlabel: \"Submit\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tcreateIcon: \"fa-cloud-upload\",\n\t\t\tcreateVerb: \"upload\",\n\t\t\tsizeConstraints: {\n\t\t\t\tminWidth: \"50vw\"\n\t\t\t}\n\t\t};\n\n\t\tthis.ui = _.extend(this.ui, BigModal.prototype.ui);\n\t\tthis.events = _.extend(this.events, BigModal.prototype.events);\n\n\t\tthis.on(\"processing\", this.updateValues.bind(this));\n\t\tthis.on(\"error\", this.processingError.bind(this));\n\t\tthis.on(\"processingFinished\", this.processingFinished.bind(this));\n\n\t\tBigModal.prototype.initialize.call(this);\n\t},\n\n\trenderForm: function renderForm() {\n\t\tthis.totalChanges = 0;\n\n\t\tthis.ui.userAdditions.text(this.userAdds);\n\t\tthis.ui.groupAdditions.text(this.groupAdds);\n\t\tthis.ui.relationAdditions.text(this.relationAdds);\n\t\tthis.ui.userDeletions.text(this.userDeletes);\n\t\tthis.ui.groupDeletions.text(this.groupDeletes);\n\t\tthis.ui.relationDeletions.text(this.relationDeletes);\n\t\tthis.ui.userUpdates.text(this.userUpdates);\n\t\tthis.ui.groupUpdates.text(this.groupUpdates);\n\n\t\tif (this.processing) _.delay(_.bind(this.startProcessingFeedback, this), 100);\n\t},\n\n\tonAccept: function () {\n\t\tvar _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee() {\n\t\t\tvar _this = this;\n\n\t\t\treturn _regenerator2.default.wrap(function _callee$(_context) {\n\t\t\t\twhile (1) {\n\t\t\t\t\tswitch (_context.prev = _context.next) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tthis.startProcessingFeedback();\n\n\t\t\t\t\t\t\t$.ajax({\n\t\t\t\t\t\t\t\ttype: \"POST\",\n\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\tdeleteGroups: this.ui.noGroupDel.is(\":checked\") ? \"0\" : \"1\",\n\t\t\t\t\t\t\t\t\twebsocketId: this.websocketId\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\turl: settings.urlRoot + \"/api/1.0/imports/queue/submit\",\n\t\t\t\t\t\t\t\terror: function error(xhr) {\n\t\t\t\t\t\t\t\t\tvar answer = App.parseResponse(xhr);\n\t\t\t\t\t\t\t\t\tradio.trigger(App.Events.Commands.Toast, { icon: \"fa-times\", iconColour: \"red\", content: answer.detail || answer.info });\n\t\t\t\t\t\t\t\t\t_this.close();\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tsuccess: _.noop\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\treturn _context.stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, _callee, this);\n\t\t}));\n\n\t\tfunction onAccept() {\n\t\t\treturn _ref.apply(this, arguments);\n\t\t}\n\n\t\treturn onAccept;\n\t}(),\n\n\tstartProcessingFeedback: function startProcessingFeedback() {\n\t\tthis.setStatusBusy(\"saving\");\n\t\tthis.initializeProgressBar();\n\t\tthis.ui.confirmationDeclineButton.prop(\"disabled\", true);\n\t},\n\n\tprocessingFinished: function processingFinished() {\n\t\tradio.trigger(App.Events.Commands.Toast, { content: \"Queue successfully submitted and processed.\" });\n\t\tthis.importInstance.refreshQueueSummary();\n\t\tthis.importInstance.uploadCollection.reset([]);\n\t\tthis.importInstance.refreshCounters();\n\n\t\tif (this.currentImportView) this.currentImportView.collection.fetch();\n\n\t\tthis.close();\n\t},\n\n\tupdateValues: function updateValues(message) {\n\t\tthis.setSavingStatus(\"Processing \" + message.type + \"(s), finished \" + message.done + \" of \" + message.count);\n\t\tthis.setProgress(message.totalDone / message.totalCount);\n\t},\n\n\tprocessingError: function processingError(message) {\n\t\tthis.showError(new Errors.Model({\n\t\t\ttitle: \"Error submitting queue\",\n\t\t\tmessage: message.error,\n\t\t\tresponse: {\n\t\t\t\tstatus: 500\n\t\t\t}\n\t\t}));\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImltcG9ydE1vZGFsLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIl8iLCIkIiwic2V0dGluZ3MiLCJyYWRpbyIsIlJhZGlvIiwiY2hhbm5lbCIsIkJpZ01vZGFsIiwiRXJyb3JzIiwiQXBwIiwibW9kdWxlIiwiZXhwb3J0cyIsImV4dGVuZCIsInVpIiwiYnV0dG9uVXBsb2FkIiwibm9Hcm91cERlbCIsInVzZXJBZGRpdGlvbnMiLCJncm91cEFkZGl0aW9ucyIsInJlbGF0aW9uQWRkaXRpb25zIiwidXNlckRlbGV0aW9ucyIsImdyb3VwRGVsZXRpb25zIiwicmVsYXRpb25EZWxldGlvbnMiLCJ1c2VyVXBkYXRlcyIsImdyb3VwVXBkYXRlcyIsImV2ZW50cyIsImFjdGlvbnMiLCJhY2NlcHQiLCJpbml0aWFsaXplIiwib3B0aW9ucyIsImJpbmRBbGwiLCJ1c2VyQWRkcyIsInVzZXJEZWxldGVzIiwiZ3JvdXBBZGRzIiwiZ3JvdXBEZWxldGVzIiwicmVsYXRpb25BZGRzIiwicmVsYXRpb25EZWxldGVzIiwiY3VycmVudEltcG9ydFZpZXciLCJjdXJyZW50VmlldyIsImltcG9ydEluc3RhbmNlIiwid2Vic29ja2V0SWQiLCJwcm9jZXNzaW5nIiwiT3B0aW9ucyIsInByZXZlbnRDYW5jZWwiLCJjbGFzc2VzIiwidGVtcGxhdGUiLCJjb250ZW50IiwiYnV0dG9ucyIsImNsb3NlIiwidHlwZSIsImxhYmVsIiwib2siLCJjcmVhdGVJY29uIiwiY3JlYXRlVmVyYiIsInNpemVDb25zdHJhaW50cyIsIm1pbldpZHRoIiwicHJvdG90eXBlIiwib24iLCJ1cGRhdGVWYWx1ZXMiLCJiaW5kIiwicHJvY2Vzc2luZ0Vycm9yIiwicHJvY2Vzc2luZ0ZpbmlzaGVkIiwiY2FsbCIsInJlbmRlckZvcm0iLCJ0b3RhbENoYW5nZXMiLCJ0ZXh0IiwiZGVsYXkiLCJzdGFydFByb2Nlc3NpbmdGZWVkYmFjayIsIm9uQWNjZXB0IiwiYWpheCIsImRhdGEiLCJkZWxldGVHcm91cHMiLCJpcyIsInVybCIsInVybFJvb3QiLCJlcnJvciIsImFuc3dlciIsInBhcnNlUmVzcG9uc2UiLCJ4aHIiLCJ0cmlnZ2VyIiwiRXZlbnRzIiwiQ29tbWFuZHMiLCJUb2FzdCIsImljb24iLCJpY29uQ29sb3VyIiwiZGV0YWlsIiwiaW5mbyIsInN1Y2Nlc3MiLCJub29wIiwic2V0U3RhdHVzQnVzeSIsImluaXRpYWxpemVQcm9ncmVzc0JhciIsImNvbmZpcm1hdGlvbkRlY2xpbmVCdXR0b24iLCJwcm9wIiwicmVmcmVzaFF1ZXVlU3VtbWFyeSIsInVwbG9hZENvbGxlY3Rpb24iLCJyZXNldCIsInJlZnJlc2hDb3VudGVycyIsImNvbGxlY3Rpb24iLCJmZXRjaCIsIm1lc3NhZ2UiLCJzZXRTYXZpbmdTdGF0dXMiLCJkb25lIiwiY291bnQiLCJzZXRQcm9ncmVzcyIsInRvdGFsRG9uZSIsInRvdGFsQ291bnQiLCJzaG93RXJyb3IiLCJNb2RlbCIsInRpdGxlIiwicmVzcG9uc2UiLCJzdGF0dXMiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUMsSUFBSUQsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNRSxJQUFJRixRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1HLFdBQVdILFFBQVEsY0FBUixDQUFqQjs7QUFFQSxJQUFNSSxRQUFRTCxTQUFTTSxLQUFULENBQWVDLE9BQWYsQ0FBdUIsUUFBdkIsQ0FBZDs7QUFFQSxJQUFNQyxXQUFXUCxRQUFRLG9CQUFSLENBQWpCO0FBQ0EsSUFBTVEsU0FBU1IsUUFBUSxxQkFBUixDQUFmO0FBQ0EsSUFBTVMsTUFBTVQsUUFBUSxhQUFSLENBQVo7O0FBRUFVLE9BQU9DLE9BQVAsR0FBaUJKLFNBQVNLLE1BQVQsQ0FBZ0I7QUFDaENDLEtBQUk7QUFDSEMsZ0JBQWMsZUFEWDtBQUVIQyxjQUFZLGFBRlQ7O0FBSUhDLGlCQUFlLHFCQUpaO0FBS0hDLGtCQUFnQixzQkFMYjtBQU1IQyxxQkFB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Iiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcblxuY29uc3QgQmlnTW9kYWwgPSByZXF1aXJlKFwiLi4vLi4vbGliL2JpZ01vZGFsXCIpO1xuY29uc3QgRXJyb3JzID0gcmVxdWlyZShcIi4uLy4uL2xpYi9lcnJvcnMuanNcIik7XG5jb25zdCBBcHAgPSByZXF1aXJlKFwiLi4vLi4vaW5kZXhcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmlnTW9kYWwuZXh0ZW5kKHtcblx0dWk6IHtcblx0XHRidXR0b25VcGxvYWQ6IFwiYnV0dG9uLnVwbG9hZFwiLFxuXHRcdG5vR3JvdXBEZWw6IFwiI25vR3JvdXBEZWxcIixcblxuXHRcdHVzZXJBZGRpdGlvbnM6IFwic3Bhbi51c2VyLWFkZGl0aW9uc1wiLFxuXHRcdGdyb3VwQWRkaXRpb25zOiBcInNwYW4uZ3JvdXAtYWRkaXRpb25zXCIsXG5cdFx0cmVsYXRpb25BZGRpdGlvbnM6IFwic3Bhbi5yZWxhdGlvbi1hZGRpdGlvbnNcIixcblx0XHR1c2VyRGVsZXRpb25zOiBcInNwYW4udXNlci1kZWxldGlvbnNcIixcblx0XHRncm91cERlbGV0aW9uczogXCJzcGFuLmdyb3VwLWRlbGV0aW9uc1wiLFxuXHRcdHJlbGF0aW9uRGVsZXRpb25zOiBcInNwYW4ucmVsYXRpb24tZGVsZXRpb25zXCIsXG5cdFx0dXNlclVwZGF0ZXM6IFwic3Bhbi51c2VyLXVwZGF0ZXNcIixcblx0XHRncm91cFVwZGF0ZXM6IFwic3Bhbi5ncm91cC11cGRhdGVzXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkuYnV0dG9uVXBsb2FkXCI6IFwib25VcGxvYWRcIixcblx0fSxcblxuXHRhY3Rpb25zOiB7XG5cdFx0YWNjZXB0OiBcIm9uQWNjZXB0XCIsXG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuXHRcdF8uYmluZEFsbCh0aGlzKTtcblxuXHRcdHRoaXMudXNlckFkZHMgPSBvcHRpb25zLnVzZXJBZGRzO1xuXHRcdHRoaXMudXNlclVwZGF0ZXMgPSBvcHRpb25zLnVzZXJVcGRhdGVzO1xuXHRcdHRoaXMudXNlckRlbGV0ZXMgPSBvcHRpb25zLnVzZXJEZWxldGVzO1xuXG5cdFx0dGhpcy5ncm91cEFkZHMgPSBvcHRpb25zLmdyb3VwQWRkcztcblx0XHR0aGlzLmdyb3VwVXBkYXRlcyA9IG9wdGlvbnMuZ3JvdXBVcGRhdGVzO1xuXHRcdHRoaXMuZ3JvdXBEZWxldGVzID0gb3B0aW9ucy5ncm91cERlbGV0ZXM7XG5cblx0XHR0aGlzLnJlbGF0aW9uQWRkcyA9IG9wdGlvbnMucmVsYXRpb25BZGRzO1xuXHRcdHRoaXMucmVsYXRpb25EZWxldGVzID0gb3B0aW9ucy5yZWxhdGlvbkRlbGV0ZXM7XG5cblx0XHR0aGlzLmN1cnJlbnRJbXBvcnRWaWV3ID0gb3B0aW9ucy5jdXJyZW50Vmlldztcblx0XHR0aGlzLmltcG9ydEluc3RhbmNlID0gb3B0aW9ucy5pbXBvcnRJbnN0YW5jZTtcblx0XHR0aGlzLndlYnNvY2tldElkID0gb3B0aW9ucy53ZWJzb2NrZXRJZDtcblx0XHR0aGlzLnByb2Nlc3NpbmcgPSBvcHRpb25zLnByb2Nlc3Npbmc7XG5cblx0XHR0aGlzLk9wdGlvbnMgPSB7XG5cdFx0XHRwcmV2ZW50Q2FuY2VsOiBvcHRpb25zLnByZXZlbnRDYW5jZWwsXG5cdFx0XHRjbGFzc2VzOiBbXCJpbXBvcnQtbW9kYWxcIl0sXG5cdFx0XHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9pbXBvcnRNb2RhbC5udW5qXCIpLmNvbnRlbnQsXG5cdFx0XHRidXR0b25zOiB7XG5cdFx0XHRcdGNsb3NlOiB7XG5cdFx0XHRcdFx0dHlwZTogXCJjYW5jZWxcIixcblx0XHRcdFx0XHRsYWJlbDogXCJDYW5jZWxcIixcblx0XHRcdFx0fSxcblx0XHRcdFx0b2s6IHtcblx0XHRcdFx0XHR0eXBlOiBcImFjY2VwdFwiLFxuXHRcdFx0XHRcdGxhYmVsOiBcIlN1Ym1pdFwiLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHRcdGNyZWF0ZUljb246IFwiZmEtY2xvdWQtdXBsb2FkXCIsXG5cdFx0XHRjcmVhdGVWZXJiOiBcInVwbG9hZFwiLFxuXHRcdFx0c2l6ZUNvbnN0cmFpbnRzOiB7XG5cdFx0XHRcdG1pbldpZHRoOiBcIjUwdndcIixcblx0XHRcdH0sXG5cdFx0fTtcblxuXHRcdHRoaXMudWkgPSBfLmV4dGVuZCh0aGlzLnVpLCBCaWdNb2RhbC5wcm90b3R5cGUudWkpO1xuXHRcdHRoaXMuZXZlbnRzID0gXy5leHRlbmQodGhpcy5ldmVudHMsIEJpZ01vZGFsLnByb3RvdHlwZS5ldmVudHMpO1xuXG5cdFx0dGhpcy5vbihcInByb2Nlc3NpbmdcIiwgdGhpcy51cGRhdGVWYWx1ZXMuYmluZCh0aGlzKSk7XG5cdFx0dGhpcy5vbihcImVycm9yXCIsIHRoaXMucHJvY2Vzc2luZ0Vycm9yLmJpbmQodGhpcykpO1xuXHRcdHRoaXMub24oXCJwcm9jZXNzaW5nRmluaXNoZWRcIiwgdGhpcy5wcm9jZXNzaW5nRmluaXNoZWQuYmluZCh0aGlzKSk7XG5cblx0XHRCaWdNb2RhbC5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMpO1xuXHR9LFxuXG5cdHJlbmRlckZvcm06IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudG90YWxDaGFuZ2VzID0gMDtcblxuXHRcdHRoaXMudWkudXNlckFkZGl0aW9ucy50ZXh0KHRoaXMudXNlckFkZHMpO1xuXHRcdHRoaXMudWkuZ3JvdXBBZGRpdGlvbnMudGV4dCh0aGlzLmdyb3VwQWRkcyk7XG5cdFx0dGhpcy51aS5yZWxhdGlvbkFkZGl0aW9ucy50ZXh0KHRoaXMucmVsYXRpb25BZGRzKTtcblx0XHR0aGlzLnVpLnVzZXJEZWxldGlvbnMudGV4dCh0aGlzLnVzZXJEZWxldGVzKTtcblx0XHR0aGlzLnVpLmdyb3VwRGVsZXRpb25zLnRleHQodGhpcy5ncm91cERlbGV0ZXMpO1xuXHRcdHRoaXMudWkucmVsYXRpb25EZWxldGlvbnMudGV4dCh0aGlzLnJlbGF0aW9uRGVsZXRlcyk7XG5cdFx0dGhpcy51aS51c2VyVXBkYXRlcy50ZXh0KHRoaXMudXNlclVwZGF0ZXMpO1xuXHRcdHRoaXMudWkuZ3JvdXBVcGRhdGVzLnRleHQodGhpcy5ncm91cFVwZGF0ZXMpO1xuXG5cdFx0aWYgKHRoaXMucHJvY2Vzc2luZylcblx0XHRcdF8uZGVsYXkoXy5iaW5kKHRoaXMuc3RhcnRQcm9jZXNzaW5nRmVlZGJhY2ssIHRoaXMpLCAxMDApO1xuXHR9LFxuXG5cdG9uQWNjZXB0OiBhc3luYyBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnN0YXJ0UHJvY2Vzc2luZ0ZlZWRiYWNrKCk7XG5cblx0XHQkLmFqYXgoe1xuXHRcdFx0dHlwZTogXCJQT1NUXCIsXG5cdFx0XHRkYXRhOiB7XG5cdFx0XHRcdGRlbGV0ZUdyb3VwczogdGhpcy51aS5ub0dyb3VwRGVsLmlzKFwiOmNoZWNrZWRcIikgPyBcIjBcIiA6IFwiMVwiLFxuXHRcdFx0XHR3ZWJzb2NrZXRJZDogdGhpcy53ZWJzb2NrZXRJZCxcblx0XHRcdH0sXG5cdFx0XHR1cmw6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2ltcG9ydHMvcXVldWUvc3VibWl0XCIsXG5cdFx0XHRlcnJvcjogeGhyID0+IHtcblx0XHRcdFx0Y29uc3QgYW5zd2VyID0gQXBwLnBhcnNlUmVzcG9uc2UoeGhyKTtcblx0XHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7IGljb246IFwiZmEtdGltZXNcIiwgaWNvbkNvbG91cjogXCJyZWRcIiwgY29udGVudDogYW5zd2VyLmRldGFpbCB8fCBhbnN3ZXIuaW5mbyB9KTtcblx0XHRcdFx0dGhpcy5jbG9zZSgpO1xuXHRcdFx0fSxcblx0XHRcdHN1Y2Nlc3M6IF8ubm9vcCxcblx0XHR9KTtcblx0fSxcblxuXHRzdGFydFByb2Nlc3NpbmdGZWVkYmFjazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5zZXRTdGF0dXNCdXN5KFwic2F2aW5nXCIpO1xuXHRcdHRoaXMuaW5pdGlhbGl6ZVByb2dyZXNzQmFyKCk7XG5cdFx0dGhpcy51aS5jb25maXJtYXRpb25EZWNsaW5lQnV0dG9uLnByb3AoXCJkaXNhYmxlZFwiLCB0cnVlKTtcblx0fSxcblxuXHRwcm9jZXNzaW5nRmluaXNoZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5Ub2FzdCwgeyBjb250ZW50OiBcIlF1ZXVlIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgYW5kIHByb2Nlc3NlZC5cIiB9KTtcblx0XHR0aGlzLmltcG9ydEluc3RhbmNlLnJlZnJlc2hRdWV1ZVN1bW1hcnkoKTtcblx0XHR0aGlzLmltcG9ydEluc3RhbmNlLnVwbG9hZENvbGxlY3Rpb24ucmVzZXQoW10pO1xuXHRcdHRoaXMuaW1wb3J0SW5zdGFuY2UucmVmcmVzaENvdW50ZXJzKCk7XG5cblx0XHRpZiAodGhpcy5jdXJyZW50SW1wb3J0Vmlldylcblx0XHRcdHRoaXMuY3VycmVudEltcG9ydFZpZXcuY29sbGVjdGlvbi5mZXRjaCgpO1xuXG5cdFx0dGhpcy5jbG9zZSgpO1xuXHR9LFxuXG5cdHVwZGF0ZVZhbHVlczogZnVuY3Rpb24obWVzc2FnZSkge1xuXHRcdHRoaXMuc2V0U2F2aW5nU3RhdHVzKGBQcm9jZXNzaW5nICR7bWVzc2FnZS50eXBlfShzKSwgZmluaXNoZWQgJHttZXNzYWdlLmRvbmV9IG9mICR7bWVzc2FnZS5jb3VudH1gKTtcblx0XHR0aGlzLnNldFByb2dyZXNzKG1lc3NhZ2UudG90YWxEb25lIC8gbWVzc2FnZS50b3RhbENvdW50KTtcblx0fSxcblxuXHRwcm9jZXNzaW5nRXJyb3I6IGZ1bmN0aW9uKG1lc3NhZ2UpIHtcblx0XHR0aGlzLnNob3dFcnJvcihuZXcgRXJyb3JzLk1vZGVsKHtcblx0XHRcdHRpdGxlOiBcIkVycm9yIHN1Ym1pdHRpbmcgcXVldWVcIixcblx0XHRcdG1lc3NhZ2U6IG1lc3NhZ2UuZXJyb3IsXG5cdFx0XHRyZXNwb25zZToge1xuXHRcdFx0XHRzdGF0dXM6IDUwMCxcblx0XHRcdH0sXG5cdFx0fSkpO1xuXHR9LFxufSk7XG4iXX0=",
    "\"use strict\";\n\nvar _radioEvents;\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar Backbone = require(\"backbone\");\nvar _ = require(\"lodash\");\nvar VirtualCollection = require(\"backbone.virtual-collection\");\nvar path = require(\"path\");\nvar $ = require(\"jquery\");\nvar Promise = require(\"bluebird\");\n\nvar settings = require(\"app-settings\");\n\nvar Overview = require(\"./overview\");\nvar Problems = require(\"./problems\");\nvar Relations = require(\"./relations\");\nvar Uploads = require(\"./uploads\");\nvar Errors = require(\"./errors\");\nvar Warnings = require(\"./warnings\");\nvar Users = require(\"./users\");\nvar Groups = require(\"./groups\");\nvar UploadModel = require(\"./uploadModel\");\nvar ErrorModel = require(\"./errorModel\");\nvar ImportModal = require(\"./importModal\");\n\nvar UploadList = require(\"./uploadList\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar Page = require(\"./pageBus\");\n\nvar SmallModal = require(\"../../lib/smallModal\");\n\nvar App = require(\"../../index\");\n\nvar UploadCollection = Backbone.Collection.extend({\n\tmodel: UploadModel\n});\nvar ErrorCollection = Backbone.Collection.extend({\n\tmodel: ErrorModel\n});\nvar WarningCollection = Backbone.Collection.extend({\n\tmodel: ErrorModel\n});\n\nvar FileDragger = {\n\tnoop: function noop(evt) {\n\t\tevt.preventDefault();\n\t\tevt.stopPropagation();\n\t},\n\n\tfileChosen: function fileChosen(evt) {\n\t\tvar _this = this;\n\n\t\tvar list = [];\n\n\t\t_.each(evt.currentTarget.files, function (item) {\n\t\t\tif (_this.filterFiles(item)) list.push(item);else radio.trigger(App.Events.Commands.Toast, { content: \"That file type is not supported\" });\n\t\t});\n\n\t\tthis.processList(list);\n\n\t\tthis.ui.fileInput.val(null);\n\t},\n\n\tfileDropped: function fileDropped(evt) {\n\t\tvar _this2 = this;\n\n\t\tevt.stopPropagation();\n\t\tevt.preventDefault();\n\n\t\tvar list = [];\n\n\t\t_.each(evt.originalEvent.dataTransfer.files, function (item) {\n\t\t\tif (_this2.filterFiles(item)) list.push(item);else radio.trigger(App.Events.Commands.Toast, { content: \"That file type is not supported\" });\n\t\t});\n\n\t\tthis.processList(list);\n\t},\n\n\tprocessList: function processList(list) {\n\t\tvar csvs = _.filter(list, function (x) {\n\t\t\treturn _.includes([\"csv\"], _.last(x.name.split(\".\")).toLowerCase());\n\t\t});\n\n\t\t_.each(csvs, this.appendChosenFile.bind(this));\n\n\t\tthis.loadUploads();\n\n\t\tthis.refreshCounters();\n\t},\n\n\tchooseFiles: function chooseFiles(evt) {\n\t\tevt.stopPropagation();\n\t\tthis.ui.fileInput.get(0).click();\n\t},\n\n\tappendChosenFile: function appendChosenFile(item) {\n\t\tvar model = new UploadModel({\n\t\t\tfilename: path.basename(item.name, path.extname(item.name)),\n\t\t\tbaseFormat: (path.extname(item.name) || \" \").slice(1).toLowerCase(),\n\t\t\tsize: item.size,\n\t\t\tid: item.name + \".\" + item.size,\n\t\t\tfile: item\n\t\t});\n\n\t\tif (this.uploadCollection.get(model.id)) return radio.trigger(App.Events.Commands.Toast, { content: \"That file was already added\" });\n\n\t\tthis.uploadCollection.add(model);\n\t},\n\n\tfilterFiles: function filterFiles(file) {\n\t\treturn _.includes([\"csv\"], _.last(file.name.split(\".\")).toLowerCase());\n\t}\n};\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"csv-upload-manager full-content\",\n\n\ttemplate: require(\"../templates/index.nunj\"),\n\n\tui: {\n\t\tfileInput: \".upload-input\",\n\n\t\texpander: \".expander\",\n\t\tnav: \".upload-menu\",\n\t\tuploadList: \".upload-items\",\n\t\tuploadtron: \".uploadtron\",\n\n\t\tactivatableLinks: \".nav-item\",\n\t\tuploadNav: \".nav-upload\",\n\t\toverviewNav: \".nav-overview\",\n\t\trelationsNav: \".nav-relations\",\n\t\trelationsCount: \".nav-relations .count\",\n\t\tusersNav: \".nav-users\",\n\t\tusersCount: \".nav-users .count\",\n\t\tgroupsNav: \".nav-groups\",\n\t\tgroupsCount: \".nav-groups .count\",\n\t\tproblemNav: \".nav-problems\",\n\t\tproblemCount: \".nav-problems .count\",\n\t\tuploadsNav: \".nav-uploads\",\n\t\tuploadsCount: \".nav-uploads .count\",\n\t\terrorsNav: \".nav-errors\",\n\t\terrorsCount: \".nav-errors .count\",\n\t\twarningsNav: \".nav-warnings\",\n\t\twarningsCount: \".nav-warnings .count\"\n\n\t},\n\n\tevents: {\n\t\t\"click @ui.uploadNav\": \"chooseFiles\",\n\t\t\"change @ui.fileInput\": \"fileChosen\",\n\n\t\t\"dragenter @ui.uploadtron\": \"noop\",\n\t\t\"dragover @ui.uploadtron\": \"noop\",\n\t\t\"drop @ui.uploadtron\": \"fileDropped\",\n\n\t\t\"click @ui.expander\": \"toggleSidebar\",\n\n\t\t\"click @ui.overviewNav\": \"loadOverview\",\n\t\t\"click @ui.problemNav\": \"loadProblems\",\n\t\t\"click @ui.usersNav\": \"loadUsers\",\n\t\t\"click @ui.errorsNav\": \"loadErrors\",\n\t\t\"click @ui.warningsNav\": \"loadWarnings\",\n\t\t\"click @ui.relationsNav\": \"loadRelations\",\n\t\t\"click @ui.groupsNav\": \"loadGroups\",\n\t\t\"click @ui.uploadsNav\": \"loadUploads\"\n\t},\n\n\tregions: {\n\t\tmain: \".uploadtron\"\n\t},\n\n\tcollectionEvents: {\n\t\t\"add change remove\": \"itemChanged\"\n\t},\n\n\tradioEvents: (_radioEvents = {}, _defineProperty(_radioEvents, App.Events.WebsocketConnected, \"wsConnected\"), _defineProperty(_radioEvents, App.Events.WebsocketDisconnected, \"wsDisconnected\"), _defineProperty(_radioEvents, App.Events.WebsocketMessage, \"wsMessage\"), _radioEvents),\n\n\tinitialize: function initialize(options) {\n\t\tthis.options = options;\n\n\t\t_.extend(this, FileDragger);\n\t\tthis.delegateEvents();\n\n\t\tthis.uploadCollection = new UploadCollection();\n\t\tthis.bindEvents(this.uploadCollection, this.collectionEvents);\n\n\t\tthis.uploadItemSubset = new VirtualCollection(this.uploadCollection);\n\t\tthis.queueErrors = new ErrorCollection();\n\t\tthis.queueWarnings = new WarningCollection();\n\n\t\tthis.listenTo(Page, Page.Events.UploadItemClick, this.jumpedToItem.bind(this));\n\n\t\tthis.activeView = \"\";\n\n\t\tthis.publisherKeyCache = {};\n\n\t\t// eslint-disable-next-line no-undef\n\t\tthis.parser = new Worker(\"./parser.js\");\n\n\t\tthis.parser.addEventListener(\"message\", this.parserResponse.bind(this));\n\n\t\tthis.parser.addEventListener(\"error\", this.parserResponse.bind(this));\n\n\t\t// Fetch some server-side settings\n\t\tvar urlPieces = window.location.href.split(\"/\");\n\n\t\twhile (!urlPieces[3]) {\n\t\t\turlPieces.splice(3, 1);\n\t\t} // Give the parser some basic information\n\t\tthis.parser.postMessage({ settings: settings, url: urlPieces[3] && urlPieces[3] === \"empathy\" ? \"/\" + urlPieces[3] : \"\", origin: window.location.origin });\n\n\t\tthis.initiateParsablesCheck();\n\n\t\t// The websocket might already be connected before we listen for the connection event\n\t\tif (App.ws.isConnected) this.wsConnected();\n\n\t\tthis.bindEvents(radio, this.radioEvents);\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.parser.terminate();\n\t\tradio.trigger(App.Events.Commands.NavigationPrompt, null);\n\t},\n\n\tparserResponse: function parserResponse(e) {\n\t\tvar model = this.uploadCollection.find(function (x) {\n\t\t\treturn x.get(\"parsing\");\n\t\t});\n\t\tif (!model) throw new Error(\"Unable to find parsing item\");\n\n\t\tif (_.isError(e.data) || e.data.isError) {\n\t\t\tmodel.set({ parsing: false, error: new Error(e.data.message), state: \"Error\" });\n\t\t\tthis.refreshCounters();\n\t\t\treturn this.initiateParsablesCheck();\n\t\t}\n\n\t\tswitch (model.get(\"type\")) {\n\t\t\tcase \"csv\":\n\t\t\t\tmodel.set({ parsing: false, parsed: true, csvData: e.data, state: \"Awaiting upload...\" });\n\t\t\t\tthis.initiateParsablesCheck();\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"Unknown parse response\");\n\t\t}\n\t},\n\n\tinitiateParsablesCheck: function initiateParsablesCheck() {\n\t\tsetTimeout(this.checkForParsables.bind(this), 1000);\n\t},\n\n\tcheckForParsables: function checkForParsables() {\n\t\t// If there's an explicit item we need to parse, jump straight to that\n\t\tif (this.parsableOverride) {\n\t\t\tvar p = this.uploadCollection.get(this.parsableOverride);\n\t\t\tthis.parsableOverride = null;\n\n\t\t\tif (p && !p.get(\"parsing\") && !p.get(\"error\") && !p.get(\"parsed\")) return this.parse(p);\n\t\t}\n\n\t\t// Else, look for a parsable\n\t\tvar p2 = this.uploadCollection.find(function (x) {\n\t\t\treturn !x.get(\"parsed\") && !x.get(\"error\");\n\t\t});\n\t\tif (p2) return this.parse(p2);\n\n\t\tif (this.uploadCollection.find(function (x) {\n\t\t\treturn x.get(\"parsed\") && !x.get(\"error\") && !x.get(\"uploading\");\n\t\t})) this.checkForUploadables();\n\n\t\tthis.initiateParsablesCheck();\n\t},\n\n\tparse: function parse(model) {\n\t\tswitch (model.get(\"baseFormat\")) {\n\t\t\tcase \"csv\":\n\t\t\t\tthis.genericParse(model);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"Unable to parse unknown file type: \" + model.get(\"baseFormat\"));\n\t\t}\n\t},\n\n\trefreshCounters: function refreshCounters() {\n\t\tvar uploadCount = this.uploadCollection.length;\n\t\tif (uploadCount) this.ui.uploadsCount.text(uploadCount).removeClass(\"hide\");else this.ui.uploadsCount.addClass(\"hide\");\n\n\t\tvar errors = this.uploadCollection.filter(function (x) {\n\t\t\treturn x.get(\"error\");\n\t\t});\n\n\t\tif (errors.length > 0) this.ui.problemCount.text(errors.length).removeClass(\"hide\");else this.ui.problemCount.addClass(\"hide\");\n\t},\n\n\tgenericParse: function genericParse(model) {\n\t\tmodel.set({ parsing: true, state: \"Parsing\" });\n\n\t\tthis.parser.postMessage(model.get(\"file\"));\n\t},\n\n\tabortParsing: function abortParsing() {\n\t\tthis.parser.postMessage(\"abort\");\n\n\t\tthis.checkForParsables();\n\t},\n\n\tjumpedToItem: function jumpedToItem(model) {\n\t\tif (model.get(\"parsing\") || model.get(\"parsed\")) {\n\t\t\tdelete this.parsableOverride;\n\t\t\treturn;\n\t\t}\n\n\t\tthis.parsableOverride = model.id;\n\t},\n\n\tcheckForUploadables: function checkForUploadables() {\n\t\tvar _this3 = this;\n\n\t\tvar up = this.uploadCollection.find(function (x) {\n\t\t\treturn x.get(\"parsed\") && !x.get(\"error\") && !x.get(\"uploaded\");\n\t\t});\n\t\tif (!up) return;\n\n\t\t// Listen to some events\n\t\tthis.listenTo(up, \"upload:progress\", this.uploadProgress.bind(this));\n\t\tthis.listenTo(up, \"upload:complete\", this.uploadComplete.bind(this));\n\t\tthis.listenTo(up, \"error\", this.uploadError.bind(this));\n\n\t\tPromise.try(function () {\n\t\t\tup.set({ uploading: true });\n\t\t\tup.upload({}, function (x) {\n\t\t\t\tif (_.isError(x)) {\n\t\t\t\t\tup.set({ uploading: false, error: x });\n\t\t\t\t\tthrow x;\n\t\t\t\t}\n\n\t\t\t\t_this3.xhr = x;\n\t\t\t});\n\t\t}).catch(function (e) {\n\t\t\t_this3.stopListening(up);\n\n\t\t\tif (e) up.set({ uploading: false, error: e });\n\t\t});\n\t},\n\n\tuploadProgress: function uploadProgress(offset) {\n\t\tthis.progress.setProgress(offset / 100.0);\n\t},\n\n\tuploadComplete: function uploadComplete(model) {\n\t\tthis.stopListening(model);\n\n\t\tif (this.xhr) {\n\t\t\tthis.xhr.abort();\n\t\t\tdelete this.xhr;\n\t\t}\n\n\t\tif (this.progress) {\n\t\t\tthis.progress.remove();\n\t\t\tdelete this.progress;\n\t\t}\n\t\tthis.refreshQueueSummary();\n\t},\n\n\tuploadError: function uploadError(model, xhr) {\n\t\tthis.stopListening(model);\n\n\t\tif (this.xhr) {\n\t\t\tthis.xhr.abort();\n\t\t\tdelete this.xhr;\n\t\t}\n\n\t\tif (this.progress) {\n\t\t\tthis.progress.remove();\n\t\t\tdelete this.progress;\n\t\t}\n\n\t\tmodel.set({ error: App.parseResponse(xhr), uploading: false, active: false, state: \"Error\" });\n\t},\n\n\twsConnected: function wsConnected() {\n\t\tvar _this4 = this;\n\n\t\tvar completeConnection = function completeConnection() {\n\t\t\t_this4.wsConnected = true;\n\t\t\t_this4.wsConnectToUserRoom();\n\t\t};\n\n\t\treturn App.ws.getID().then(function (id) {\n\t\t\t_this4.websocketId = id;\n\t\t\treturn completeConnection();\n\t\t});\n\t},\n\n\twsDisconnected: function wsDisconnected() {\n\t\tthis.wsConnected = false;\n\t},\n\n\twsMessage: function wsMessage(message) {\n\t\tif (message.csvImports) {\n\t\t\tif (message.csvProcessing && message.error) this.importModal.trigger(\"error\", message);else if (message.csvProcessing && this.importModal && !message.processingFinished) this.importModal.trigger(\"processing\", message);else if (message.csvProcessing && !this.importModal && this.queueSummaryData) this.submitQueue(this.getChildView(\"main\"), true);else if (message.csvImports && message.processingFinished) this.importModal.trigger(\"processingFinished\");\n\t\t}\n\t},\n\n\twsConnectToUserRoom: function wsConnectToUserRoom() {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tApp.ws.websocket.write({\n\t\t\tcsvImports: true,\n\t\t\taction: \"join\",\n\t\t\tuser: user.user_id,\n\t\t\troom: user._id\n\t\t});\n\t},\n\n\ttoggleSidebar: function toggleSidebar() {\n\t\tthis.ui.nav.toggleClass(\"collapsed\");\n\t},\n\n\tshowUploadView: function showUploadView() {\n\t\tvar _this5 = this;\n\n\t\tvar items = this.uploadCollection.filter(function (x) {\n\t\t\treturn x.get(\"type\") === _this5.activeView && !x.get(\"error\");\n\t\t});\n\n\t\tif (items.length && !this.ui.nav.hasClass(\"collapsed\")) {\n\t\t\tthis.ui.nav.addClass(\"collapsed\");\n\t\t\tthis.navAutoClosed = true;\n\t\t}\n\n\t\tthis.uploadList.standardView();\n\n\t\tif (items.length) {\n\t\t\tthis.uploadList.expand();\n\t\t} else {\n\t\t\tthis.uploadList.collapse();\n\t\t\tif (this.navAutoClosed) this.ui.nav.removeClass(\"collapsed\");\n\t\t}\n\t},\n\n\tshowErrorView: function showErrorView() {\n\t\tvar items = this.uploadCollection.filter(function (x) {\n\t\t\treturn x.get(\"error\");\n\t\t});\n\n\t\tthis.uploadList.errorView();\n\n\t\tif (items.length) this.uploadList.expand();\n\t},\n\n\thideUploadView: function hideUploadView() {\n\t\tif (this.ui.nav.hasClass(\"collapsed\") && this.navAutoClosed) {\n\t\t\tthis.ui.nav.removeClass(\"collapsed\");\n\t\t\tthis.navAutoClosed = false;\n\t\t}\n\n\t\tthis.uploadList.collapse();\n\t},\n\n\trefreshSession: function refreshSession() {\n\t\t$.ajax(settings.urlRoot + \"/api/1.0/login/refresh\", {\n\t\t\tsuccess: _.noop,\n\t\t\tfail: _.noop\n\t\t});\n\t},\n\n\titemChanged: function itemChanged() {\n\t\tvar errors = this.uploadCollection.filter(function (x) {\n\t\t\treturn x.get(\"error\");\n\t\t});\n\t\tif (this.activeView === \"problem\") {\n\t\t\tif (errors.length === 1) this.showErrorView();\n\n\t\t\tif (errors.length === 0) this.hideUploadView();\n\t\t}\n\n\t\tthis.refreshCounters();\n\t},\n\n\tonRender: function onRender() {\n\t\t$(\"footer\", document).removeClass(\"hide\");\n\n\t\tthis.uploadList = new UploadList({ el: this.ui.uploadList, collection: this.uploadItemSubset }).render();\n\n\t\tswitch (this.options.section) {\n\t\t\tcase \"overview\":\n\t\t\t\tthis.loadOverview();\n\t\t\t\tbreak;\n\n\t\t\tcase \"users\":\n\t\t\t\tthis.loadUsers();\n\t\t\t\tbreak;\n\n\t\t\tcase \"groups\":\n\t\t\t\tthis.loadGroups();\n\t\t\t\tbreak;\n\n\t\t\tcase \"problems\":\n\t\t\t\tthis.loadProblems();\n\t\t\t\tbreak;\n\n\t\t\tcase \"uploads\":\n\t\t\t\tthis.loadUploads();\n\t\t\t\tbreak;\n\n\t\t\tcase \"relations\":\n\t\t\t\tthis.loadRelations();\n\t\t\t\tbreak;\n\n\t\t\tcase \"errors\":\n\t\t\t\tthis.loadErrors();\n\t\t\t\tbreak;\n\n\t\t\tcase \"warnings\":\n\t\t\t\tthis.loadWarnings();\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthis.loadOverview();\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.refreshQueueSummary();\n\t},\n\n\tsetActiveLink: function setActiveLink(link) {\n\t\tthis.ui.activatableLinks.removeClass(\"active\");\n\t\tlink.addClass(\"active\");\n\t},\n\n\tloadOverview: function loadOverview() {\n\t\tradio.trigger(App.Events.Commands.Navigate, \"/uploads/overview\", { trigger: false, replace: true, suppressNavigationWarning: true });\n\t\tthis.uploadList.unselectAll();\n\n\t\tthis.activeView = \"overview\";\n\t\tthis.setActiveLink(this.ui.overviewNav);\n\t\tthis.hideUploadView();\n\n\t\tthis.showChildView(\"main\", new Overview({ collection: this.uploadCollection }));\n\t},\n\n\tloadErrors: function loadErrors() {\n\t\tradio.trigger(App.Events.Commands.Navigate, \"/uploads/errors\", { trigger: false, replace: true, suppressNavigationWarning: true });\n\t\tthis.uploadList.unselectAll();\n\n\t\tthis.activeView = \"errors\";\n\t\tthis.setActiveLink(this.ui.errorsNav);\n\t\tthis.hideUploadView();\n\n\t\tthis.showChildView(\"main\", new Errors({ collection: this.queueErrors }));\n\t},\n\n\tloadWarnings: function loadWarnings() {\n\t\tradio.trigger(App.Events.Commands.Navigate, \"/uploads/warnings\", { trigger: false, replace: true, suppressNavigationWarning: true });\n\t\tthis.uploadList.unselectAll();\n\n\t\tthis.activeView = \"warnings\";\n\t\tthis.setActiveLink(this.ui.warningsNav);\n\t\tthis.hideUploadView();\n\n\t\tthis.showChildView(\"main\", new Warnings({ collection: this.queueWarnings }));\n\t},\n\n\tloadProblems: function loadProblems() {\n\t\tradio.trigger(App.Events.Commands.Navigate, \"/uploads/problems\", { trigger: false, replace: true, suppressNavigationWarning: true });\n\t\tthis.uploadList.unselectAll();\n\n\t\tthis.uploadItemSubset.updateFilter(function (x) {\n\t\t\treturn x.get(\"error\");\n\t\t});\n\n\t\tthis.activeView = \"problem\";\n\t\tthis.setActiveLink(this.ui.problemNav);\n\t\tthis.showErrorView();\n\n\t\tthis.showChildView(\"main\", new Problems({ collection: this.uploadItemSubset }));\n\t},\n\n\tloadUsers: function loadUsers() {\n\t\tradio.trigger(App.Events.Commands.Navigate, \"/uploads/users\", { trigger: false, replace: true, suppressNavigationWarning: true });\n\n\t\tthis.activeView = \"users\";\n\t\tthis.setActiveLink(this.ui.usersNav);\n\t\tthis.showUploadView();\n\n\t\tvar usersView = new Users();\n\t\tthis.listenTo(usersView, \"state:refresh\", this.refreshQueueSummary);\n\t\tthis.listenTo(usersView, \"queue:submit\", this.submitQueue);\n\t\tthis.listenTo(usersView, \"queue:reset\", this.resetQueue);\n\n\t\tthis.showChildView(\"main\", usersView);\n\t},\n\n\tloadRelations: function loadRelations() {\n\t\tradio.trigger(App.Events.Commands.Navigate, \"/uploads/relations\", { trigger: false, replace: true, suppressNavigationWarning: true });\n\n\t\tthis.activeView = \"relations\";\n\t\tthis.setActiveLink(this.ui.relationsNav);\n\t\tthis.showUploadView();\n\n\t\tvar relationsView = new Relations();\n\t\tthis.showChildView(\"main\", new Relations());\n\t\tthis.listenTo(relationsView, \"state:refresh\", this.refreshQueueSummary);\n\t\tthis.listenTo(relationsView, \"queue:submit\", this.submitQueue);\n\t\tthis.listenTo(relationsView, \"queue:reset\", this.resetQueue);\n\n\t\tthis.showChildView(\"main\", relationsView);\n\t},\n\n\tloadGroups: function loadGroups() {\n\t\tradio.trigger(App.Events.Commands.Navigate, \"/uploads/groups\", { trigger: false, replace: true, suppressNavigationWarning: true });\n\n\t\tthis.activeView = \"groups\";\n\t\tthis.setActiveLink(this.ui.groupsNav);\n\t\tthis.showUploadView();\n\n\t\tvar groupsView = new Groups();\n\t\tthis.listenTo(groupsView, \"state:refresh\", this.refreshQueueSummary);\n\t\tthis.listenTo(groupsView, \"queue:submit\", this.submitQueue);\n\t\tthis.listenTo(groupsView, \"queue:reset\", this.resetQueue);\n\n\t\tthis.showChildView(\"main\", groupsView);\n\t},\n\n\tloadUploads: function loadUploads() {\n\t\tradio.trigger(App.Events.Commands.Navigate, \"/uploads/uploads\", { trigger: false, replace: true, suppressNavigationWarning: true });\n\t\tthis.uploadList.unselectAll();\n\n\t\tthis.activeView = \"uploads\";\n\t\tthis.setActiveLink(this.ui.uploadsNav);\n\t\tthis.hideUploadView();\n\n\t\tthis.showChildView(\"main\", new Uploads({ collection: this.uploadCollection }));\n\t},\n\n\trefreshQueueSummary: function refreshQueueSummary() {\n\t\tvar _this6 = this;\n\n\t\tif (this.summaryReq) this.summaryReq.abort();\n\n\t\tvar spinner = \"<span class=\\\"spinner-icon spinner-small\\\"/>\";\n\t\tthis.ui.usersCount.html(spinner).removeClass(\"hide\");\n\t\tthis.ui.groupsCount.html(spinner).removeClass(\"hide\");\n\t\tthis.ui.relationsCount.html(spinner).removeClass(\"hide\");\n\t\tthis.ui.errorsCount.html(spinner).removeClass(\"hide\");\n\t\tthis.ui.warningsCount.html(spinner).removeClass(\"hide\");\n\n\t\tthis.summaryReq = $.ajax({\n\t\t\ttype: \"GET\",\n\t\t\turl: settings.urlRoot + \"/api/1.0/imports/queue/summary\",\n\t\t\tsuccess: function success(data) {\n\t\t\t\t_this6.queueSummaryData = data;\n\t\t\t\t_this6.ui.usersCount.text(data.usersCount)[data.usersCount ? \"removeClass\" : \"addClass\"](\"hide\");\n\t\t\t\t_this6.ui.groupsCount.text(data.groupsCount)[data.groupsCount ? \"removeClass\" : \"addClass\"](\"hide\");\n\t\t\t\t_this6.ui.relationsCount.text(data.relationsCount)[data.relationsCount ? \"removeClass\" : \"addClass\"](\"hide\");\n\t\t\t\t_this6.ui.errorsCount.text(data.errors.length > 100 ? \"100+\" : data.errors.length)[data.errors.length ? \"removeClass\" : \"addClass\"](\"hide\");\n\t\t\t\t_this6.ui.warningsCount.text(data.warnings.length > 100 ? \"100+\" : data.warnings.length)[data.warnings.length ? \"removeClass\" : \"addClass\"](\"hide\");\n\n\t\t\t\t_this6.queueErrors.reset(data.errors);\n\t\t\t\t_this6.queueWarnings.reset(data.warnings);\n\n\t\t\t\t_this6.summaryReq = null;\n\t\t\t},\n\t\t\terror: function error(e) {\n\t\t\t\t_this6.queueSummaryData = null;\n\t\t\t\t_this6.trigger(\"error\", _this6, e);\n\t\t\t\t_this6.summaryReq = null;\n\t\t\t}\n\t\t});\n\t},\n\n\tsubmitQueue: function submitQueue(view, processing) {\n\t\t//Cleanup events\n\t\tthis.unbindEvents(radio, this.radioEvents);\n\t\tthis.bindEvents(radio, this.radioEvents);\n\n\t\tif (!this.queueSummaryData || this.queueSummaryData.queueEmpty) return radio.trigger(App.Events.Commands.Toast, { icon: \"fa-times\", iconColour: \"red\", content: \"Import queue is empty.\" });\n\n\t\tif (this.queueErrors.length) return radio.trigger(App.Events.Commands.Toast, { icon: \"fa-times\", iconColour: \"red\", content: \"Resolve errors before submitting\" });\n\n\t\tthis.importModal = new ImportModal({\n\t\t\tuserAdds: this.queueSummaryData.userAdditions,\n\t\t\tuserUpdates: this.queueSummaryData.userUpdates,\n\t\t\tuserDeletes: this.queueSummaryData.userDeletions,\n\t\t\tgroupAdds: this.queueSummaryData.groupAdditions,\n\t\t\tgroupUpdates: this.queueSummaryData.groupUpdates,\n\t\t\tgroupDeletes: this.queueSummaryData.groupDeletions,\n\t\t\trelationAdds: this.queueSummaryData.relationAdditions,\n\t\t\trelationDeletes: this.queueSummaryData.relationDeletions,\n\t\t\tcurrentView: view,\n\t\t\timportInstance: this,\n\t\t\twebsocketId: this.websocketId,\n\t\t\tpreventCancel: true,\n\t\t\tprocessing: processing\n\t\t});\n\n\t\tthis.importModal.show();\n\t},\n\n\tresetQueue: function resetQueue(view) {\n\t\tvar _this7 = this;\n\n\t\tif (!this.queueSummaryData || this.queueSummaryData.queueEmpty) return radio.trigger(App.Events.Commands.Toast, { icon: \"fa-times\", iconColour: \"red\", content: \"Import queue is empty.\" });\n\n\t\tthis.resetModal = new SmallModal({\n\t\t\tpersist: true,\n\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Reset queue?\",\n\t\t\tbody: \"<p>Are you sure you want to reset the queue and clear all items?</p>\",\n\t\t\twarning: true\n\t\t});\n\t\tthis.resetModal.on(\"button:ok\", function () {\n\t\t\t$.ajax({\n\t\t\t\ttype: \"POST\",\n\t\t\t\turl: settings.urlRoot + \"/api/1.0/imports/queue/reset\",\n\t\t\t\terror: function error(xhr) {\n\t\t\t\t\tvar answer = App.parseResponse(xhr);\n\t\t\t\t\tradio.trigger(App.Events.Commands.Toast, { icon: \"fa-times\", iconColour: \"red\", content: answer.detail || answer.info });\n\t\t\t\t\t_this7.resetModal.destroy();\n\t\t\t\t},\n\t\t\t\tsuccess: function success() {\n\t\t\t\t\tradio.trigger(App.Events.Commands.Toast, { content: \"Queue reset\" });\n\t\t\t\t\t_this7.refreshQueueSummary();\n\t\t\t\t\t_this7.resetModal.destroy();\n\t\t\t\t\t_this7.uploadCollection.reset([]);\n\t\t\t\t\t_this7.refreshCounters();\n\t\t\t\t\tview.collection.fetch();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tthis.resetModal.show();\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIl8iLCJWaXJ0dWFsQ29sbGVjdGlvbiIsInBhdGgiLCIkIiwiUHJvbWlzZSIsInNldHRpbmdzIiwiT3ZlcnZpZXciLCJQcm9ibGVtcyIsIlJlbGF0aW9ucyIsIlVwbG9hZHMiLCJFcnJvcnMiLCJXYXJuaW5ncyIsIlVzZXJzIiwiR3JvdXBzIiwiVXBsb2FkTW9kZWwiLCJFcnJvck1vZGVsIiwiSW1wb3J0TW9kYWwiLCJVcGxvYWRMaXN0IiwicmFkaW8iLCJSYWRpbyIsImNoYW5uZWwiLCJQYWdlIiwiU21hbGxNb2RhbCIsIkFwcCIsIlVwbG9hZENvbGxlY3Rpb24iLCJDb2xsZWN0aW9uIiwiZXh0ZW5kIiwibW9kZWwiLCJFcnJvckNvbGxlY3Rpb24iLCJXYXJuaW5nQ29sbGVjdGlvbiIsIkZpbGVEcmFnZ2VyIiwibm9vcCIsImV2dCIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwiZmlsZUNob3NlbiIsImxpc3QiLCJlYWNoIiwiY3VycmVudFRhcmdldCIsImZpbGVzIiwiZmlsdGVyRmlsZXMiLCJpdGVtIiwicHVzaCIsInRyaWdnZXIiLCJFdmVudHMiLCJDb21tYW5kcyIsIlRvYXN0IiwiY29udGVudCIsInByb2Nlc3NMaXN0IiwidWkiLCJmaWxlSW5wdXQiLCJ2YWwiLCJmaWxlRHJvcHBlZCIsIm9yaWdpbmFsRXZlbnQiLCJkYXRhVHJhbnNmZXIiLCJjc3ZzIiwiZmlsdGVyIiwiaW5jbHVkZXMiLCJsYXN0IiwieCIsIm5hbWUiLCJzcGxpdCIsInRvTG93ZXJDYXNlIiwiYXBwZW5kQ2hvc2VuRmlsZSIsImJpbmQiLCJsb2FkVXBsb2FkcyIsInJlZnJlc2hDb3VudGVycyIsImNob29zZUZpbGVzIiwiZ2V0IiwiY2xpY2siLCJmaWxlbmFtZSIsImJhc2VuYW1lIiwiZXh0bmFtZSIsImJhc2VGb3JtYXQiLCJzbGljZSIsInNpemUiLCJpZCIsImZpbGUiLCJ1cGxvYWRDb2xsZWN0aW9uIiwiYWRkIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiY2xhc3NOYW1lIiwidGVtcGxhdGUiLCJleHBhbmRlciIsIm5hdiIsInVwbG9hZExpc3QiLCJ1cGxvYWR0cm9uIiwiYWN0aXZhdGFibGVMaW5rcyIsInVwbG9hZE5hdiIsIm92ZXJ2aWV3TmF2IiwicmVsYXRpb25zTmF2IiwicmVsYXRpb25zQ291bnQiLCJ1c2Vyc05hdiIsInVzZXJzQ291bnQiLCJncm91cHNOYXYiLCJncm91cHNDb3VudCIsInByb2JsZW1OYXYiLCJwcm9ibGVtQ291bnQiLCJ1cGxvYWRzTmF2IiwidXBsb2Fkc0NvdW50IiwiZXJyb3JzTmF2IiwiZXJyb3JzQ291bnQiLCJ3YXJuaW5nc05hdiIsIndhcm5pbmdzQ291bnQiLCJldmVudHMiLCJyZWdpb25zIiwibWFpbiIsImNvbGxlY3Rpb25FdmVudHMiLCJyYWRpb0V2ZW50cyIsIldlYnNvY2tldENvbm5lY3RlZCIsIldlYnNvY2tldERpc2Nvbm5lY3RlZCIsIldlYnNvY2tldE1lc3NhZ2UiLCJpbml0aWFsaXplIiwib3B0aW9ucyIsImRlbGVnYXRlRXZlbnRzIiwiYmluZEV2ZW50cyIsInVwbG9hZEl0ZW1TdWJzZXQiLCJxdWV1ZUVycm9ycyIsInF1ZXVlV2FybmluZ3MiLCJsaXN0ZW5UbyIsIlVwbG9hZEl0ZW1DbGljayIsImp1bXBlZFRvSXRlbSIsImFjdGl2ZVZpZXciLCJwdWJsaXNoZXJLZXlDYWNoZSIsInBhcnNlciIsIldvcmtlciIsImFkZEV2ZW50TGlzdGVuZXIiLCJwYXJzZXJSZXNwb25zZSIsInVybFBpZWNlcyIsIndpbmRvdyIsImxvY2F0aW9uIiwiaHJlZiIsInNwbGljZSIsInBvc3RNZXNzYWdlIiwidXJsIiwib3JpZ2luIiwiaW5pdGlhdGVQYXJzYWJsZXNDaGVjayIsIndzIiwiaXNDb25uZWN0ZWQiLCJ3c0Nvbm5lY3RlZCIsIm9uQmVmb3JlRGVzdHJveSIsInRlcm1pbmF0ZSIsIk5hdmlnYXRpb25Qcm9tcHQiLCJlIiwiZmluZCIsIkVycm9yIiwiaXNFcnJvciIsImRhdGEiLCJzZXQiLCJwYXJzaW5nIiwiZXJyb3IiLCJtZXNzYWdlIiwic3RhdGUiLCJwYXJzZWQiLCJjc3ZEYXRhIiwic2V0VGltZW91dCIsImNoZWNrRm9yUGFyc2FibGVzIiwicGFyc2FibGVPdmVycmlkZSIsInAiLCJwYXJzZSIsInAyIiwiY2hlY2tGb3JVcGxvYWRhYmxlcyIsImdlbmVyaWNQYXJzZSIsInVwbG9hZENvdW50IiwibGVuZ3RoIiwidGV4dCIsInJlbW92ZUNsYXNzIiwiYWRkQ2xhc3MiLCJlcnJvcnMiLCJhYm9ydFBhcnNpbmciLCJ1cCIsInVwbG9hZFByb2dyZXNzIiwidXBsb2FkQ29tcGxldGUiLCJ1cGxvYWRFcnJvciIsInRyeSIsInVwbG9hZGluZyIsInVwbG9hZCIsInhociIsImNhdGNoIiwic3RvcExpc3RlbmluZyIsIm9mZnNldCIsInByb2dyZXNzIiwic2V0UHJvZ3Jlc3MiLCJhYm9ydCIsInJlbW92ZSIsInJlZnJlc2hRdWV1ZVN1bW1hcnkiLCJwYXJzZVJlc3BvbnNlIiwiYWN0aXZlIiwiY29tcGxldGVDb25uZWN0aW9uIiwid3NDb25uZWN0VG9Vc2VyUm9vbSIsImdldElEIiwidGhlbiIsIndlYnNvY2tldElkIiwid3NEaXNjb25uZWN0ZWQiLCJ3c01lc3NhZ2UiLCJjc3ZJbXBvcnRzIiwiY3N2UHJvY2Vzc2luZyIsImltcG9ydE1vZGFsIiwicHJvY2Vzc2luZ0ZpbmlzaGVkIiwicXVldWVTdW1tYXJ5RGF0YSIsInN1Ym1pdFF1ZXVlIiwiZ2V0Q2hpbGRWaWV3IiwidXNlciIsInJlcXVlc3QiLCJSZXF1ZXN0cyIsIkN1cnJlbnRVc2VyIiwid2Vic29ja2V0Iiwid3JpdGUiLCJhY3Rpb24iLCJ1c2VyX2lkIiwicm9vbSIsIl9pZCIsInRvZ2dsZVNpZGViYXIiLCJ0b2dnbGVDbGFzcyIsInNob3dVcGxvYWRWaWV3IiwiaXRlbXMiLCJoYXNDbGFzcyIsIm5hdkF1dG9DbG9zZWQiLCJzdGFuZGFyZFZpZXciLCJleHBhbmQiLCJjb2xsYXBzZSIsInNob3dFcnJvclZpZXciLCJlcnJvclZpZXciLCJoaWRlVXBsb2FkVmlldyIsInJlZnJlc2hTZXNzaW9uIiwiYWpheCIsInVybFJvb3QiLCJzdWNjZXNzIiwiZmFpbCIsIml0ZW1DaGFuZ2VkIiwib25SZW5kZXIiLCJkb2N1bWVudCIsImVsIiwiY29sbGVjdGlvbiIsInJlbmRlciIsInNlY3Rpb24iLCJsb2FkT3ZlcnZpZXciLCJsb2FkVXNlcnMiLCJsb2FkR3JvdXBzIiwibG9hZFByb2JsZW1zIiwibG9hZFJlbGF0aW9ucyIsImxvYWRFcnJvcnMiLCJsb2FkV2FybmluZ3MiLCJzZXRBY3RpdmVMaW5rIiwibGluayIsIk5hdmlnYXRlIiwicmVwbGFjZSIsInN1cHByZXNzTmF2aWdhdGlvbldhcm5pbmciLCJ1bnNlbGVjdEFsbCIsInNob3dDaGlsZFZpZXciLCJ1cGRhdGVGaWx0ZXIiLCJ1c2Vyc1ZpZXciLCJyZXNldFF1ZXVlIiwicmVsYXRpb25zVmlldyIsImdyb3Vwc1ZpZXciLCJzdW1tYXJ5UmVxIiwic3Bpbm5lciIsImh0bWwiLCJ0eXBlIiwid2FybmluZ3MiLCJyZXNldCIsInZpZXciLCJwcm9jZXNzaW5nIiwidW5iaW5kRXZlbnRzIiwicXVldWVFbXB0eSIsImljb24iLCJpY29uQ29sb3VyIiwidXNlckFkZHMiLCJ1c2VyQWRkaXRpb25zIiwidXNlclVwZGF0ZXMiLCJ1c2VyRGVsZXRlcyIsInVzZXJEZWxldGlvbnMiLCJncm91cEFkZHMiLCJncm91cEFkZGl0aW9ucyIsImdyb3VwVXBkYXRlcyIsImdyb3VwRGVsZXRlcyIsImdyb3VwRGVsZXRpb25zIiwicmVsYXRpb25BZGRzIiwicmVsYXRpb25BZGRpdGlvbnMiLCJyZWxhdGlvbkRlbGV0ZXMiLCJyZWxhdGlvbkRlbGV0aW9ucyIsImN1cnJlbnRWaWV3IiwiaW1wb3J0SW5zdGFuY2UiLCJwcmV2ZW50Q2FuY2VsIiwic2hvdyIsInJlc2V0TW9kYWwiLCJwZXJzaXN0IiwidGl0bGUiLCJib2R5Iiwid2FybmluZyIs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QixJQUFJcUIsTUFBSixDQUFXQyxRQUFYLENBQW9CQyxLQUFsQyxFQUF5QyxFQUFFOE4sTUFBTSxVQUFSLEVBQW9CQyxZQUFZLEtBQWhDLEVBQXVDOU4sU0FBU3VQLE9BQU9DLE1BQVAsSUFBaUJELE9BQU9FLElBQXhFLEVBQXpDO0FBQ0EsWUFBS1IsVUFBTCxDQUFnQlMsT0FBaEI7QUFDQSxLQVBLO0FBUU5uRSxhQUFTLG1CQUFNO0FBQ2RwTixXQUFNeUIsT0FBTixDQUFjcEIsSUFBSXFCLE1BQUosQ0FBV0MsUUFBWCxDQUFvQkMsS0FBbEMsRUFBeUMsRUFBRUMsU0FBUyxhQUFYLEVBQXpDO0FBQ0EsWUFBSzZJLG1CQUFMO0FBQ0EsWUFBS29HLFVBQUwsQ0FBZ0JTLE9BQWhCO0FBQ0EsWUFBSzNOLGdCQUFMLENBQXNCeUwsS0FBdEIsQ0FBNEIsRUFBNUI7QUFDQSxZQUFLck0sZUFBTDtBQUNBc00sVUFBSzVCLFVBQUwsQ0FBZ0I4RCxLQUFoQjtBQUNBO0FBZkssSUFBUDtBQWlCQSxHQWxCRDs7QUFvQkEsT0FBS1YsVUFBTCxDQUFnQkQsSUFBaEI7QUFDQTtBQS9tQitDLENBQWhDLENBQWpCIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgVmlydHVhbENvbGxlY3Rpb24gPSByZXF1aXJlKFwiYmFja2JvbmUudmlydHVhbC1jb2xsZWN0aW9uXCIpO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBQcm9taXNlID0gcmVxdWlyZShcImJsdWViaXJkXCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IE92ZXJ2aWV3ID0gcmVxdWlyZShcIi4vb3ZlcnZpZXdcIik7XG5jb25zdCBQcm9ibGVtcyA9IHJlcXVpcmUoXCIuL3Byb2JsZW1zXCIpO1xuY29uc3QgUmVsYXRpb25zID0gcmVxdWlyZShcIi4vcmVsYXRpb25zXCIpO1xuY29uc3QgVXBsb2FkcyA9IHJlcXVpcmUoXCIuL3VwbG9hZHNcIik7XG5jb25zdCBFcnJvcnMgPSByZXF1aXJlKFwiLi9lcnJvcnNcIik7XG5jb25zdCBXYXJuaW5ncyA9IHJlcXVpcmUoXCIuL3dhcm5pbmdzXCIpO1xuY29uc3QgVXNlcnMgPSByZXF1aXJlKFwiLi91c2Vyc1wiKTtcbmNvbnN0IEdyb3VwcyA9IHJlcXVpcmUoXCIuL2dyb3Vwc1wiKTtcbmNvbnN0IFVwbG9hZE1vZGVsID0gcmVxdWlyZShcIi4vdXBsb2FkTW9kZWxcIik7XG5jb25zdCBFcnJvck1vZGVsID0gcmVxdWlyZShcIi4vZXJyb3JNb2RlbFwiKTtcbmNvbnN0IEltcG9ydE1vZGFsID0gcmVxdWlyZShcIi4vaW1wb3J0TW9kYWxcIik7XG5cbmNvbnN0IFVwbG9hZExpc3QgPSByZXF1aXJlKFwiLi91cGxvYWRMaXN0XCIpO1xuXG5jb25zdCByYWRpbyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJnbG9iYWxcIik7XG5cbmNvbnN0IFBhZ2UgPSByZXF1aXJlKFwiLi9wYWdlQnVzXCIpO1xuXG5jb25zdCBTbWFsbE1vZGFsID0gcmVxdWlyZShcIi4uLy4uL2xpYi9zbWFsbE1vZGFsXCIpO1xuXG5jb25zdCBBcHAgPSByZXF1aXJlKFwiLi4vLi4vaW5kZXhcIik7XG5cbmNvbnN0IFVwbG9hZENvbGxlY3Rpb24gPSBCYWNrYm9uZS5Db2xsZWN0aW9uLmV4dGVuZCh7XG5cdG1vZGVsOiBVcGxvYWRNb2RlbCxcbn0pO1xuY29uc3QgRXJyb3JDb2xsZWN0aW9uID0gQmFja2JvbmUuQ29sbGVjdGlvbi5leHRlbmQoe1xuXHRtb2RlbDogRXJyb3JNb2RlbCxcbn0pO1xuY29uc3QgV2FybmluZ0NvbGxlY3Rpb24gPSBCYWNrYm9uZS5Db2xsZWN0aW9uLmV4dGVuZCh7XG5cdG1vZGVsOiBFcnJvck1vZGVsLFxufSk7XG5cbmNvbnN0IEZpbGVEcmFnZ2VyID0ge1xuXHRub29wOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQucHJldmVudERlZmF1bHQoKTtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH0sXG5cblx0ZmlsZUNob3NlbjogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0Y29uc3QgbGlzdCA9IFtdO1xuXG5cdFx0Xy5lYWNoKGV2dC5jdXJyZW50VGFyZ2V0LmZpbGVzLCBpdGVtID0+IHtcblx0XHRcdGlmICh0aGlzLmZpbHRlckZpbGVzKGl0ZW0pKVxuXHRcdFx0XHRsaXN0LnB1c2goaXRlbSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5Ub2FzdCwgeyBjb250ZW50OiBcIlRoYXQgZmlsZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWRcIiB9KTtcblx0XHR9KTtcblxuXHRcdHRoaXMucHJvY2Vzc0xpc3QobGlzdCk7XG5cblx0XHR0aGlzLnVpLmZpbGVJbnB1dC52YWwobnVsbCk7XG5cdH0sXG5cblx0ZmlsZURyb3BwZWQ6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRldnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdGNvbnN0IGxpc3QgPSBbXTtcblxuXHRcdF8uZWFjaChldnQub3JpZ2luYWxFdmVudC5kYXRhVHJhbnNmZXIuZmlsZXMsIGl0ZW0gPT4ge1xuXHRcdFx0aWYgKHRoaXMuZmlsdGVyRmlsZXMoaXRlbSkpXG5cdFx0XHRcdGxpc3QucHVzaChpdGVtKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7IGNvbnRlbnQ6IFwiVGhhdCBmaWxlIHR5cGUgaXMgbm90IHN1cHBvcnRlZFwiIH0pO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5wcm9jZXNzTGlzdChsaXN0KTtcblx0fSxcblxuXHRwcm9jZXNzTGlzdDogZnVuY3Rpb24obGlzdCkge1xuXHRcdGNvbnN0IGNzdnMgPSBfLmZpbHRlcihsaXN0LCB4ID0+IF8uaW5jbHVkZXMoW1wiY3N2XCJdLCBfLmxhc3QoeC5uYW1lLnNwbGl0KFwiLlwiKSkudG9Mb3dlckNhc2UoKSkpO1xuXG5cdFx0Xy5lYWNoKGNzdnMsIHRoaXMuYXBwZW5kQ2hvc2VuRmlsZS5iaW5kKHRoaXMpKTtcblxuXHRcdHRoaXMubG9hZFVwbG9hZHMoKTtcblxuXHRcdHRoaXMucmVmcmVzaENvdW50ZXJzKCk7XG5cdH0sXG5cblx0Y2hvb3NlRmlsZXM6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHR0aGlzLnVpLmZpbGVJbnB1dC5nZXQoMCkuY2xpY2soKTtcblx0fSxcblxuXHRhcHBlbmRDaG9zZW5GaWxlOiBmdW5jdGlvbihpdGVtKSB7XG5cdFx0Y29uc3QgbW9kZWwgPSBuZXcgVXBsb2FkTW9kZWwoe1xuXHRcdFx0ZmlsZW5hbWU6IHBhdGguYmFzZW5hbWUoaXRlbS5uYW1lLCBwYXRoLmV4dG5hbWUoaXRlbS5uYW1lKSksXG5cdFx0XHRiYXNlRm9ybWF0OiAocGF0aC5leHRuYW1lKGl0ZW0ubmFtZSkgfHwgXCIgXCIpLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCksXG5cdFx0XHRzaXplOiBpdGVtLnNpemUsXG5cdFx0XHRpZDogaXRlbS5uYW1lICsgXCIuXCIgKyBpdGVtLnNpemUsXG5cdFx0XHRmaWxlOiBpdGVtLFxuXHRcdH0pO1xuXG5cdFx0aWYgKHRoaXMudXBsb2FkQ29sbGVjdGlvbi5nZXQobW9kZWwuaWQpKVxuXHRcdFx0cmV0dXJuIHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5Ub2FzdCwgeyBjb250ZW50OiBcIlRoYXQgZmlsZSB3YXMgYWxyZWFkeSBhZGRlZFwiIH0pO1xuXG5cdFx0dGhpcy51cGxvYWRDb2xsZWN0aW9uLmFkZChtb2RlbCk7XG5cdH0sXG5cblx0ZmlsdGVyRmlsZXM6IGZ1bmN0aW9uKGZpbGUpIHtcblx0XHRyZXR1cm4gXy5pbmNsdWRlcyhbXCJjc3ZcIl0sIF8ubGFzdChmaWxlLm5hbWUuc3BsaXQoXCIuXCIpKS50b0xvd2VyQ2FzZSgpKTtcblx0fSxcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJjc3YtdXBsb2FkLW1hbmFnZXIgZnVsbC1jb250ZW50XCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvaW5kZXgubnVualwiKSxcblxuXHR1aToge1xuXHRcdGZpbGVJbnB1dDogXCIudXBsb2FkLWlucHV0XCIsXG5cblx0XHRleHBhbmRlcjogXCIuZXhwYW5kZXJcIixcblx0XHRuYXY6IFwiLnVwbG9hZC1tZW51XCIsXG5cdFx0dXBsb2FkTGlzdDogXCIudXBsb2FkLWl0ZW1zXCIsXG5cdFx0dXBsb2FkdHJvbjogXCIudXBsb2FkdHJvblwiLFxuXG5cdFx0YWN0aXZhdGFibGVMaW5rczogXCIubmF2LWl0ZW1cIixcblx0XHR1cGxvYWROYXY6IFwiLm5hdi11cGxvYWRcIixcblx0XHRvdmVydmlld05hdjogXCIubmF2LW92ZXJ2aWV3XCIsXG5cdFx0cmVsYXRpb25zTmF2OiBcIi5uYXYtcmVsYXRpb25zXCIsXG5cdFx0cmVsYXRpb25zQ291bnQ6IFwiLm5hdi1yZWxhdGlvbnMgLmNvdW50XCIsXG5cdFx0dXNlcnNOYXY6IFwiLm5hdi11c2Vyc1wiLFxuXHRcdHVzZXJzQ291bnQ6IFwiLm5hdi11c2VycyAuY291bnRcIixcblx0XHRncm91cHNOYXY6IFwiLm5hdi1ncm91cHNcIixcblx0XHRncm91cHNDb3VudDogXCIubmF2LWdyb3VwcyAuY291bnRcIixcblx0XHRwcm9ibGVtTmF2OiBcIi5uYXYtcHJvYmxlbXNcIixcblx0XHRwcm9ibGVtQ291bnQ6IFwiLm5hdi1wcm9ibGVtcyAuY291bnRcIixcblx0XHR1cGxvYWRzTmF2OiBcIi5uYXYtdXBsb2Fkc1wiLFxuXHRcdHVwbG9hZHNDb3VudDogXCIubmF2LXVwbG9hZHMgLmNvdW50XCIsXG5cdFx0ZXJyb3JzTmF2OiBcIi5uYXYtZXJyb3JzXCIsXG5cdFx0ZXJyb3JzQ291bnQ6IFwiLm5hdi1lcnJvcnMgLmNvdW50XCIsXG5cdFx0d2FybmluZ3NOYXY6IFwiLm5hdi13YXJuaW5nc1wiLFxuXHRcdHdhcm5pbmdzQ291bnQ6IFwiLm5hdi13YXJuaW5ncyAuY291bnRcIixcblxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLnVwbG9hZE5hdlwiOiBcImNob29zZUZpbGVzXCIsXG5cdFx0XCJjaGFuZ2UgQHVpLmZpbGVJbnB1dFwiOiBcImZpbGVDaG9zZW5cIixcblxuXHRcdFwiZHJhZ2VudGVyIEB1aS51cGxvYWR0cm9uXCI6IFwibm9vcFwiLFxuXHRcdFwiZHJhZ292ZXIgQHVpLnVwbG9hZHRyb25cIjogXCJub29wXCIsXG5cdFx0XCJkcm9wIEB1aS51cGxvYWR0cm9uXCI6IFwiZmlsZURyb3BwZWRcIixcblxuXHRcdFwiY2xpY2sgQHVpLmV4cGFuZGVyXCI6IFwidG9nZ2xlU2lkZWJhclwiLFxuXG5cdFx0XCJjbGljayBAdWkub3ZlcnZpZXdOYXZcIjogXCJsb2FkT3ZlcnZpZXdcIixcblx0XHRcImNsaWNrIEB1aS5wcm9ibGVtTmF2XCI6IFwibG9hZFByb2JsZW1zXCIsXG5cdFx0XCJjbGljayBAdWkudXNlcnNOYXZcIjogXCJsb2FkVXNlcnNcIixcblx0XHRcImNsaWNrIEB1aS5lcnJvcnNOYXZcIjogXCJsb2FkRXJyb3JzXCIsXG5cdFx0XCJjbGljayBAdWkud2FybmluZ3NOYXZcIjogXCJsb2FkV2FybmluZ3NcIixcblx0XHRcImNsaWNrIEB1aS5yZWxhdGlvbnNOYXZcIjogXCJsb2FkUmVsYXRpb25zXCIsXG5cdFx0XCJjbGljayBAdWkuZ3JvdXBzTmF2XCI6IFwibG9hZEdyb3Vwc1wiLFxuXHRcdFwiY2xpY2sgQHVpLnVwbG9hZHNOYXZcIjogXCJsb2FkVXBsb2Fkc1wiLFxuXHR9LFxuXG5cdHJlZ2lvbnM6IHtcblx0XHRtYWluOiBcIi51cGxvYWR0cm9uXCIsXG5cdH0sXG5cblx0Y29sbGVjdGlvbkV2ZW50czoge1xuXHRcdFwiYWRkIGNoYW5nZSByZW1vdmVcIjogXCJpdGVtQ2hhbmdlZFwiLFxuXHR9LFxuXG5cdHJhZGlvRXZlbnRzOiB7XG5cdFx0W0FwcC5FdmVudHMuV2Vic29ja2V0Q29ubmVjdGVkXTogXCJ3c0Nvbm5lY3RlZFwiLFxuXHRcdFtBcHAuRXZlbnRzLldlYnNvY2tldERpc2Nvbm5lY3RlZF06IFwid3NEaXNjb25uZWN0ZWRcIixcblx0XHRbQXBwLkV2ZW50cy5XZWJzb2NrZXRNZXNzYWdlXTogXCJ3c01lc3NhZ2VcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuXHRcdF8uZXh0ZW5kKHRoaXMsIEZpbGVEcmFnZ2VyKTtcblx0XHR0aGlzLmRlbGVnYXRlRXZlbnRzKCk7XG5cblx0XHR0aGlzLnVwbG9hZENvbGxlY3Rpb24gPSBuZXcgVXBsb2FkQ29sbGVjdGlvbigpO1xuXHRcdHRoaXMuYmluZEV2ZW50cyh0aGlzLnVwbG9hZENvbGxlY3Rpb24sIHRoaXMuY29sbGVjdGlvbkV2ZW50cyk7XG5cblx0XHR0aGlzLnVwbG9hZEl0ZW1TdWJzZXQgPSBuZXcgVmlydHVhbENvbGxlY3Rpb24odGhpcy51cGxvYWRDb2xsZWN0aW9uKTtcblx0XHR0aGlzLnF1ZXVlRXJyb3JzID0gbmV3IEVycm9yQ29sbGVjdGlvbigpO1xuXHRcdHRoaXMucXVldWVXYXJuaW5ncyA9IG5ldyBXYXJuaW5nQ29sbGVjdGlvbigpO1xuXG5cdFx0dGhpcy5saXN0ZW5UbyhQYWdlLCBQYWdlLkV2ZW50cy5VcGxvYWRJdGVtQ2xpY2ssIHRoaXMuanVtcGVkVG9JdGVtLmJpbmQodGhpcykpO1xuXG5cdFx0dGhpcy5hY3RpdmVWaWV3ID0gXCJcIjtcblxuXHRcdHRoaXMucHVibGlzaGVyS2V5Q2FjaGUgPSB7fTtcblxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuXHRcdHRoaXMucGFyc2VyID0gbmV3IFdvcmtlcihcIi4vcGFyc2VyLmpzXCIpO1xuXG5cdFx0dGhpcy5wYXJzZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgdGhpcy5wYXJzZXJSZXNwb25zZS5iaW5kKHRoaXMpKTtcblxuXHRcdHRoaXMucGFyc2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCB0aGlzLnBhcnNlclJlc3BvbnNlLmJpbmQodGhpcykpO1xuXG5cdFx0Ly8gRmV0Y2ggc29tZSBzZXJ2ZXItc2lkZSBzZXR0aW5nc1xuXHRcdGNvbnN0IHVybFBpZWNlcyA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KFwiL1wiKTtcblxuXHRcdHdoaWxlKCF1cmxQaWVjZXNbM10pXG5cdFx0XHR1cmxQaWVjZXMuc3BsaWNlKDMsIDEpO1xuXG5cdFx0Ly8gR2l2ZSB0aGUgcGFyc2VyIHNvbWUgYmFzaWMgaW5mb3JtYXRpb25cblx0XHR0aGlzLnBhcnNlci5wb3N0TWVzc2FnZSh7IHNldHRpbmdzOiBzZXR0aW5ncywgdXJsOiAodXJsUGllY2VzWzNdICYmIHVybFBpZWNlc1szXSA9PT0gXCJlbXBhdGh5XCIgPyBcIi9cIiArIHVybFBpZWNlc1szXSA6IFwiXCIpLCBvcmlnaW46IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gfSk7XG5cblx0XHR0aGlzLmluaXRpYXRlUGFyc2FibGVzQ2hlY2soKTtcblxuXHRcdC8vIFRoZSB3ZWJzb2NrZXQgbWlnaHQgYWxyZWFkeSBiZSBjb25uZWN0ZWQgYmVmb3JlIHdlIGxpc3RlbiBmb3IgdGhlIGNvbm5lY3Rpb24gZXZlbnRcblx0XHRpZiAoQXBwLndzLmlzQ29ubmVjdGVkKVxuXHRcdFx0dGhpcy53c0Nvbm5lY3RlZCgpO1xuXG5cdFx0dGhpcy5iaW5kRXZlbnRzKHJhZGlvLCB0aGlzLnJhZGlvRXZlbnRzKTtcblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMucGFyc2VyLnRlcm1pbmF0ZSgpO1xuXHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0aW9uUHJvbXB0LCBudWxsKTtcblx0fSxcblxuXHRwYXJzZXJSZXNwb25zZTogZnVuY3Rpb24oZSkge1xuXHRcdGNvbnN0IG1vZGVsID0gdGhpcy51cGxvYWRDb2xsZWN0aW9uLmZpbmQoeCA9PiB4LmdldChcInBhcnNpbmdcIikpO1xuXHRcdGlmICghbW9kZWwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gZmluZCBwYXJzaW5nIGl0ZW1cIik7XG5cblx0XHRpZiAoXy5pc0Vycm9yKGUuZGF0YSkgfHwgZS5kYXRhLmlzRXJyb3IpIHtcblx0XHRcdG1vZGVsLnNldCh7IHBhcnNpbmc6IGZhbHNlLCBlcnJvcjogbmV3IEVycm9yKGUuZGF0YS5tZXNzYWdlKSwgc3RhdGU6IFwiRXJyb3JcIiB9KTtcblx0XHRcdHRoaXMucmVmcmVzaENvdW50ZXJzKCk7XG5cdFx0XHRyZXR1cm4gdGhpcy5pbml0aWF0ZVBhcnNhYmxlc0NoZWNrKCk7XG5cdFx0fVxuXG5cdFx0c3dpdGNoIChtb2RlbC5nZXQoXCJ0eXBlXCIpKSB7XG5cdFx0XHRjYXNlIFwiY3N2XCI6XG5cdFx0XHRcdG1vZGVsLnNldCh7IHBhcnNpbmc6IGZhbHNlLCBwYXJzZWQ6IHRydWUsIGNzdkRhdGE6IGUuZGF0YSwgc3RhdGU6IFwiQXdhaXRpbmcgdXBsb2FkLi4uXCIgfSk7XG5cdFx0XHRcdHRoaXMuaW5pdGlhdGVQYXJzYWJsZXNDaGVjaygpO1xuXHRcdFx0XHRicmVhaztcblxuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHBhcnNlIHJlc3BvbnNlXCIpO1xuXHRcdH1cblx0fSxcblxuXHRpbml0aWF0ZVBhcnNhYmxlc0NoZWNrOiBmdW5jdGlvbigpIHtcblx0XHRzZXRUaW1lb3V0KHRoaXMuY2hlY2tGb3JQYXJzYWJsZXMuYmluZCh0aGlzKSwgMTAwMCk7XG5cdH0sXG5cblx0Y2hlY2tGb3JQYXJzYWJsZXM6IGZ1bmN0aW9uKCkge1xuXHRcdC8vIElmIHRoZXJlJ3MgYW4gZXhwbGljaXQgaXRlbSB3ZSBuZWVkIHRvIHBhcnNlLCBqdW1wIHN0cmFpZ2h0IHRvIHRoYXRcblx0XHRpZiAodGhpcy5wYXJzYWJsZU92ZXJyaWRlKSB7XG5cdFx0XHRjb25zdCBwID0gdGhpcy51cGxvYWRDb2xsZWN0aW9uLmdldCh0aGlzLnBhcnNhYmxlT3ZlcnJpZGUpO1xuXHRcdFx0dGhpcy5wYXJzYWJsZU92ZXJyaWRlID0gbnVsbDtcblxuXHRcdFx0aWYgKHAgJiYgIXAuZ2V0KFwicGFyc2luZ1wiKSAmJiAhcC5nZXQoXCJlcnJvclwiKSAmJiAhcC5nZXQoXCJwYXJzZWRcIikpXG5cdFx0XHRcdHJldHVybiB0aGlzLnBhcnNlKHApO1xuXHRcdH1cblxuXHRcdC8vIEVsc2UsIGxvb2sgZm9yIGEgcGFyc2FibGVcblx0XHRjb25zdCBwMiA9IHRoaXMudXBsb2FkQ29sbGVjdGlvbi5maW5kKHggPT4gIXguZ2V0KFwicGFyc2VkXCIpICYmICF4LmdldChcImVycm9yXCIpKTtcblx0XHRpZiAocDIpXG5cdFx0XHRyZXR1cm4gdGhpcy5wYXJzZShwMik7XG5cblx0XHRpZiAodGhpcy51cGxvYWRDb2xsZWN0aW9uLmZpbmQoeCA9PiB4LmdldChcInBhcnNlZFwiKSAmJiAheC5nZXQoXCJlcnJvclwiKSAmJiAheC5nZXQoXCJ1cGxvYWRpbmdcIikpKVxuXHRcdFx0dGhpcy5jaGVja0ZvclVwbG9hZGFibGVzKCk7XG5cblx0XHR0aGlzLmluaXRpYXRlUGFyc2FibGVzQ2hlY2soKTtcblx0fSxcblxuXHRwYXJzZTogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRzd2l0Y2ggKG1vZGVsLmdldChcImJhc2VGb3JtYXRcIikpIHtcblx0XHRcdGNhc2UgXCJjc3ZcIjpcblx0XHRcdFx0dGhpcy5nZW5lcmljUGFyc2UobW9kZWwpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIlVuYWJsZSB0byBwYXJzZSB1bmtub3duIGZpbGUgdHlwZTogXCIgKyBtb2RlbC5nZXQoXCJiYXNlRm9ybWF0XCIpKTtcblx0XHR9XG5cdH0sXG5cblx0cmVmcmVzaENvdW50ZXJzOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCB1cGxvYWRDb3VudCA9IHRoaXMudXBsb2FkQ29sbGVjdGlvbi5sZW5ndGg7XG5cdFx0aWYgKHVwbG9hZENvdW50KVxuXHRcdFx0dGhpcy51aS51cGxvYWRzQ291bnQudGV4dCh1cGxvYWRDb3VudCkucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMudWkudXBsb2Fkc0NvdW50LmFkZENsYXNzKFwiaGlkZVwiKTtcblxuXHRcdGNvbnN0IGVycm9ycyA9IHRoaXMudXBsb2FkQ29sbGVjdGlvbi5maWx0ZXIoeCA9PiB4LmdldChcImVycm9yXCIpKTtcblxuXHRcdGlmIChlcnJvcnMubGVuZ3RoID4gMClcblx0XHRcdHRoaXMudWkucHJvYmxlbUNvdW50LnRleHQoZXJyb3JzLmxlbmd0aCkucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMudWkucHJvYmxlbUNvdW50LmFkZENsYXNzKFwiaGlkZVwiKTtcblx0fSxcblxuXHRnZW5lcmljUGFyc2U6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0bW9kZWwuc2V0KHsgcGFyc2luZzogdHJ1ZSwgc3RhdGU6IFwiUGFyc2luZ1wiIH0pO1xuXG5cdFx0dGhpcy5wYXJzZXIucG9zdE1lc3NhZ2UobW9kZWwuZ2V0KFwiZmlsZVwiKSk7XG5cdH0sXG5cblx0YWJvcnRQYXJzaW5nOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnBhcnNlci5wb3N0TWVzc2FnZShcImFib3J0XCIpO1xuXG5cdFx0dGhpcy5jaGVja0ZvclBhcnNhYmxlcygpO1xuXHR9LFxuXG5cdGp1bXBlZFRvSXRlbTogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRpZiAobW9kZWwuZ2V0KFwicGFyc2luZ1wiKSB8fCBtb2RlbC5nZXQoXCJwYXJzZWRcIikpIHtcblx0XHRcdGRlbGV0ZSB0aGlzLnBhcnNhYmxlT3ZlcnJpZGU7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5wYXJzYWJsZU92ZXJyaWRlID0gbW9kZWwuaWQ7XG5cdH0sXG5cblx0Y2hlY2tGb3JVcGxvYWRhYmxlczogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgdXAgPSB0aGlzLnVwbG9hZENvbGxlY3Rpb24uZmluZCh4ID0+IHguZ2V0KFwicGFyc2VkXCIpICYmICF4LmdldChcImVycm9yXCIpICYmICF4LmdldChcInVwbG9hZGVkXCIpKTtcblx0XHRpZiAoIXVwKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0Ly8gTGlzdGVuIHRvIHNvbWUgZXZlbnRzXG5cdFx0dGhpcy5saXN0ZW5Ubyh1cCwgXCJ1cGxvYWQ6cHJvZ3Jlc3NcIiwgdGhpcy51cGxvYWRQcm9ncmVzcy5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKHVwLCBcInVwbG9hZDpjb21wbGV0ZVwiLCB0aGlzLnVwbG9hZENvbXBsZXRlLmJpbmQodGhpcykpO1xuXHRcdHRoaXMubGlzdGVuVG8odXAsIFwiZXJyb3JcIiwgdGhpcy51cGxvYWRFcnJvci5iaW5kKHRoaXMpKTtcblxuXHRcdFByb21pc2UudHJ5KCgpID0+IHtcblx0XHRcdHVwLnNldCh7IHVwbG9hZGluZzogdHJ1ZSB9KTtcblx0XHRcdHVwLnVwbG9hZCh7fSwgeCA9PiB7XG5cdFx0XHRcdGlmIChfLmlzRXJyb3IoeCkpIHtcblx0XHRcdFx0XHR1cC5zZXQoeyB1cGxvYWRpbmc6IGZhbHNlLCBlcnJvcjogeCB9KTtcblx0XHRcdFx0XHR0aHJvdyB4O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy54aHIgPSB4O1xuXHRcdFx0fSk7XG5cdFx0fSkuY2F0Y2goZSA9PiB7XG5cdFx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcodXApO1xuXG5cdFx0XHRpZiAoZSlcblx0XHRcdFx0dXAuc2V0KHsgdXBsb2FkaW5nOiBmYWxzZSwgZXJyb3I6IGUgfSk7XG5cdFx0fSk7XG5cdH0sXG5cblx0dXBsb2FkUHJvZ3Jlc3M6IGZ1bmN0aW9uKG9mZnNldCkge1xuXHRcdHRoaXMucHJvZ3Jlc3Muc2V0UHJvZ3Jlc3Mob2Zmc2V0IC8gMTAwLjApO1xuXHR9LFxuXG5cdHVwbG9hZENvbXBsZXRlOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdHRoaXMuc3RvcExpc3RlbmluZyhtb2RlbCk7XG5cblx0XHRpZiAodGhpcy54aHIpIHtcblx0XHRcdHRoaXMueGhyLmFib3J0KCk7XG5cdFx0XHRkZWxldGUgdGhpcy54aHI7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMucHJvZ3Jlc3MpIHtcblx0XHRcdHRoaXMucHJvZ3Jlc3MucmVtb3ZlKCk7XG5cdFx0XHRkZWxldGUgdGhpcy5wcm9ncmVzcztcblx0XHR9XG5cdFx0dGhpcy5yZWZyZXNoUXVldWVTdW1tYXJ5KCk7XG5cdH0sXG5cblx0dXBsb2FkRXJyb3I6IGZ1bmN0aW9uKG1vZGVsLCB4aHIpIHtcblx0XHR0aGlzLnN0b3BMaXN0ZW5pbmcobW9kZWwpO1xuXG5cdFx0aWYgKHRoaXMueGhyKSB7XG5cdFx0XHR0aGlzLnhoci5hYm9ydCgpO1xuXHRcdFx0ZGVsZXRlIHRoaXMueGhyO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnByb2dyZXNzKSB7XG5cdFx0XHR0aGlzLnByb2dyZXNzLnJlbW92ZSgpO1xuXHRcdFx0ZGVsZXRlIHRoaXMucHJvZ3Jlc3M7XG5cdFx0fVxuXG5cdFx0bW9kZWwuc2V0KHsgZXJyb3I6IEFwcC5wYXJzZVJlc3BvbnNlKHhociksIHVwbG9hZGluZzogZmFsc2UsIGFjdGl2ZTogZmFsc2UsIHN0YXRlOiBcIkVycm9yXCIgfSk7XG5cdH0sXG5cblx0d3NDb25uZWN0ZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGNvbXBsZXRlQ29ubmVjdGlvbiA9ICgpID0+IHtcblx0XHRcdHRoaXMud3NDb25uZWN0ZWQgPSB0cnVlO1xuXHRcdFx0dGhpcy53c0Nvbm5lY3RUb1VzZXJSb29tKCk7XG5cdFx0fTtcblxuXHRcdHJldHVybiBBcHAud3MuZ2V0SUQoKS50aGVuKGlkID0+IHtcblx0XHRcdHRoaXMud2Vic29ja2V0SWQgPSBpZDtcblx0XHRcdHJldHVybiBjb21wbGV0ZUNvbm5lY3Rpb24oKTtcblx0XHR9KTtcblx0fSxcblxuXHR3c0Rpc2Nvbm5lY3RlZDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy53c0Nvbm5lY3RlZCA9IGZhbHNlO1xuXHR9LFxuXG5cdHdzTWVzc2FnZTogZnVuY3Rpb24obWVzc2FnZSkge1xuXHRcdGlmIChtZXNzYWdlLmNzdkltcG9ydHMpIHtcblx0XHRcdGlmIChtZXNzYWdlLmNzdlByb2Nlc3NpbmcgJiYgbWVzc2FnZS5lcnJvcilcblx0XHRcdFx0dGhpcy5pbXBvcnRNb2RhbC50cmlnZ2VyKFwiZXJyb3JcIiwgbWVzc2FnZSk7XG5cdFx0XHRlbHNlIGlmIChtZXNzYWdlLmNzdlByb2Nlc3NpbmcgJiYgdGhpcy5pbXBvcnRNb2RhbCAmJiAhbWVzc2FnZS5wcm9jZXNzaW5nRmluaXNoZWQpXG5cdFx0XHRcdHRoaXMuaW1wb3J0TW9kYWwudHJpZ2dlcihcInByb2Nlc3NpbmdcIiwgbWVzc2FnZSk7XG5cdFx0XHRlbHNlIGlmIChtZXNzYWdlLmNzdlByb2Nlc3NpbmcgJiYgIXRoaXMuaW1wb3J0TW9kYWwgJiYgdGhpcy5xdWV1ZVN1bW1hcnlEYXRhKVxuXHRcdFx0XHR0aGlzLnN1Ym1pdFF1ZXVlKHRoaXMuZ2V0Q2hpbGRWaWV3KFwibWFpblwiKSwgdHJ1ZSk7XG5cdFx0XHRlbHNlIGlmIChtZXNzYWdlLmNzdkltcG9ydHMgJiYgbWVzc2FnZS5wcm9jZXNzaW5nRmluaXNoZWQpXG5cdFx0XHRcdHRoaXMuaW1wb3J0TW9kYWwudHJpZ2dlcihcInByb2Nlc3NpbmdGaW5pc2hlZFwiKTtcblx0XHR9XG5cdH0sXG5cblx0d3NDb25uZWN0VG9Vc2VyUm9vbTogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgdXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cblx0XHRBcHAud3Mud2Vic29ja2V0LndyaXRlKHtcblx0XHRcdGNzdkltcG9ydHM6IHRydWUsXG5cdFx0XHRhY3Rpb246IFwiam9pblwiLFxuXHRcdFx0dXNlcjogdXNlci51c2VyX2lkLFxuXHRcdFx0cm9vbTogdXNlci5faWQsXG5cdFx0fSk7XG5cdH0sXG5cblx0dG9nZ2xlU2lkZWJhcjogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy51aS5uYXYudG9nZ2xlQ2xhc3MoXCJjb2xsYXBzZWRcIik7XG5cdH0sXG5cblx0c2hvd1VwbG9hZFZpZXc6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGl0ZW1zID0gdGhpcy51cGxvYWRDb2xsZWN0aW9uLmZpbHRlcih4ID0+IHguZ2V0KFwidHlwZVwiKSA9PT0gdGhpcy5hY3RpdmVWaWV3ICYmICF4LmdldChcImVycm9yXCIpKTtcblxuXHRcdGlmIChpdGVtcy5sZW5ndGggJiYgIXRoaXMudWkubmF2Lmhhc0NsYXNzKFwiY29sbGFwc2VkXCIpKSB7XG5cdFx0XHR0aGlzLnVpLm5hdi5hZGRDbGFzcyhcImNvbGxhcHNlZFwiKTtcblx0XHRcdHRoaXMubmF2QXV0b0Nsb3NlZCA9IHRydWU7XG5cdFx0fVxuXG5cdFx0dGhpcy51cGxvYWRMaXN0LnN0YW5kYXJkVmlldygpO1xuXG5cdFx0aWYgKGl0ZW1zLmxlbmd0aCkgeyB0aGlzLnVwbG9hZExpc3QuZXhwYW5kKCk7IH1cblx0XHRlbHNlIHtcblx0XHRcdHRoaXMudXBsb2FkTGlzdC5jb2xsYXBzZSgpO1xuXHRcdFx0aWYgKHRoaXMubmF2QXV0b0Nsb3NlZClcblx0XHRcdFx0dGhpcy51aS5uYXYucmVtb3ZlQ2xhc3MoXCJjb2xsYXBzZWRcIik7XG5cdFx0fVxuXHR9LFxuXG5cdHNob3dFcnJvclZpZXc6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGl0ZW1zID0gdGhpcy51cGxvYWRDb2xsZWN0aW9uLmZpbHRlcih4ID0+IHguZ2V0KFwiZXJyb3JcIikpO1xuXG5cdFx0dGhpcy51cGxvYWRMaXN0LmVycm9yVmlldygpO1xuXG5cdFx0aWYgKGl0ZW1zLmxlbmd0aClcblx0XHRcdHRoaXMudXBsb2FkTGlzdC5leHBhbmQoKTtcblx0fSxcblxuXHRoaWRlVXBsb2FkVmlldzogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMudWkubmF2Lmhhc0NsYXNzKFwiY29sbGFwc2VkXCIpICYmIHRoaXMubmF2QXV0b0Nsb3NlZCkge1xuXHRcdFx0dGhpcy51aS5uYXYucmVtb3ZlQ2xhc3MoXCJjb2xsYXBzZWRcIik7XG5cdFx0XHR0aGlzLm5hdkF1dG9DbG9zZWQgPSBmYWxzZTtcblx0XHR9XG5cblx0XHR0aGlzLnVwbG9hZExpc3QuY29sbGFwc2UoKTtcblx0fSxcblxuXHRyZWZyZXNoU2Vzc2lvbjogZnVuY3Rpb24oKSB7XG5cdFx0JC5hamF4KHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2xvZ2luL3JlZnJlc2hcIiwge1xuXHRcdFx0c3VjY2VzczogXy5ub29wLFxuXHRcdFx0ZmFpbDogXy5ub29wLFxuXHRcdH0pO1xuXHR9LFxuXG5cdGl0ZW1DaGFuZ2VkOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBlcnJvcnMgPSB0aGlzLnVwbG9hZENvbGxlY3Rpb24uZmlsdGVyKHggPT4geC5nZXQoXCJlcnJvclwiKSk7XG5cdFx0aWYgKHRoaXMuYWN0aXZlVmlldyA9PT0gXCJwcm9ibGVtXCIpIHtcblx0XHRcdGlmIChlcnJvcnMubGVuZ3RoID09PSAxKVxuXHRcdFx0XHR0aGlzLnNob3dFcnJvclZpZXcoKTtcblxuXHRcdFx0aWYgKGVycm9ycy5sZW5ndGggPT09IDApXG5cdFx0XHRcdHRoaXMuaGlkZVVwbG9hZFZpZXcoKTtcblx0XHR9XG5cblx0XHR0aGlzLnJlZnJlc2hDb3VudGVycygpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHQkKFwiZm9vdGVyXCIsIGRvY3VtZW50KS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cblx0XHR0aGlzLnVwbG9hZExpc3QgPSBuZXcgVXBsb2FkTGlzdCh7IGVsOiB0aGlzLnVpLnVwbG9hZExpc3QsIGNvbGxlY3Rpb246IHRoaXMudXBsb2FkSXRlbVN1YnNldCB9KS5yZW5kZXIoKTtcblxuXHRcdHN3aXRjaCAodGhpcy5vcHRpb25zLnNlY3Rpb24pIHtcblx0XHRcdGNhc2UgXCJvdmVydmlld1wiOlxuXHRcdFx0XHR0aGlzLmxvYWRPdmVydmlldygpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcInVzZXJzXCI6XG5cdFx0XHRcdHRoaXMubG9hZFVzZXJzKCk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwiZ3JvdXBzXCI6XG5cdFx0XHRcdHRoaXMubG9hZEdyb3VwcygpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcInByb2JsZW1zXCI6XG5cdFx0XHRcdHRoaXMubG9hZFByb2JsZW1zKCk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwidXBsb2Fkc1wiOlxuXHRcdFx0XHR0aGlzLmxvYWRVcGxvYWRzKCk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFwicmVsYXRpb25zXCI6XG5cdFx0XHRcdHRoaXMubG9hZFJlbGF0aW9ucygpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBcImVycm9yc1wiOlxuXHRcdFx0XHR0aGlzLmxvYWRFcnJvcnMoKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgXCJ3YXJuaW5nc1wiOlxuXHRcdFx0XHR0aGlzLmxvYWRXYXJuaW5ncygpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhpcy5sb2FkT3ZlcnZpZXcoKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXG5cdFx0dGhpcy5yZWZyZXNoUXVldWVTdW1tYXJ5KCk7XG5cdH0sXG5cblx0c2V0QWN0aXZlTGluazogZnVuY3Rpb24obGluaykge1xuXHRcdHRoaXMudWkuYWN0aXZhdGFibGVMaW5rcy5yZW1vdmVDbGFzcyhcImFjdGl2ZVwiKTtcblx0XHRsaW5rLmFkZENsYXNzKFwiYWN0aXZlXCIpO1xuXHR9LFxuXG5cdGxvYWRPdmVydmlldzogZnVuY3Rpb24oKSB7XG5cdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLk5hdmlnYXRlLCBcIi91cGxvYWRzL292ZXJ2aWV3XCIsIHsgdHJpZ2dlcjogZmFsc2UsIHJlcGxhY2U6IHRydWUsIHN1cHByZXNzTmF2aWdhdGlvbldhcm5pbmc6IHRydWUgfSk7XG5cdFx0dGhpcy51cGxvYWRMaXN0LnVuc2VsZWN0QWxsKCk7XG5cblx0XHR0aGlzLmFjdGl2ZVZpZXcgPSBcIm92ZXJ2aWV3XCI7XG5cdFx0dGhpcy5zZXRBY3RpdmVMaW5rKHRoaXMudWkub3ZlcnZpZXdOYXYpO1xuXHRcdHRoaXMuaGlkZVVwbG9hZFZpZXcoKTtcblxuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcIm1haW5cIiwgbmV3IE92ZXJ2aWV3KHsgY29sbGVjdGlvbjogdGhpcy51cGxvYWRDb2xsZWN0aW9uIH0pKTtcblx0fSxcblxuXHRsb2FkRXJyb3JzOiBmdW5jdGlvbigpIHtcblx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuTmF2aWdhdGUsIFwiL3VwbG9hZHMvZXJyb3JzXCIsIHsgdHJpZ2dlcjogZmFsc2UsIHJlcGxhY2U6IHRydWUsIHN1cHByZXNzTmF2aWdhdGlvbldhcm5pbmc6IHRydWUgfSk7XG5cdFx0dGhpcy51cGxvYWRMaXN0LnVuc2VsZWN0QWxsKCk7XG5cblx0XHR0aGlzLmFjdGl2ZVZpZXcgPSBcImVycm9yc1wiO1xuXHRcdHRoaXMuc2V0QWN0aXZlTGluayh0aGlzLnVpLmVycm9yc05hdik7XG5cdFx0dGhpcy5oaWRlVXBsb2FkVmlldygpO1xuXG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwibWFpblwiLCBuZXcgRXJyb3JzKHsgY29sbGVjdGlvbjogdGhpcy5xdWV1ZUVycm9ycyB9KSk7XG5cdH0sXG5cblx0bG9hZFdhcm5pbmdzOiBmdW5jdGlvbigpIHtcblx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuTmF2aWdhdGUsIFwiL3VwbG9hZHMvd2FybmluZ3NcIiwgeyB0cmlnZ2VyOiBmYWxzZSwgcmVwbGFjZTogdHJ1ZSwgc3VwcHJlc3NOYXZpZ2F0aW9uV2FybmluZzogdHJ1ZSB9KTtcblx0XHR0aGlzLnVwbG9hZExpc3QudW5zZWxlY3RBbGwoKTtcblxuXHRcdHRoaXMuYWN0aXZlVmlldyA9IFwid2FybmluZ3NcIjtcblx0XHR0aGlzLnNldEFjdGl2ZUxpbmsodGhpcy51aS53YXJuaW5nc05hdik7XG5cdFx0dGhpcy5oaWRlVXBsb2FkVmlldygpO1xuXG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwibWFpblwiLCBuZXcgV2FybmluZ3MoeyBjb2xsZWN0aW9uOiB0aGlzLnF1ZXVlV2FybmluZ3MgfSkpO1xuXHR9LFxuXG5cdGxvYWRQcm9ibGVtczogZnVuY3Rpb24oKSB7XG5cdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLk5hdmlnYXRlLCBcIi91cGxvYWRzL3Byb2JsZW1zXCIsIHsgdHJpZ2dlcjogZmFsc2UsIHJlcGxhY2U6IHRydWUsIHN1cHByZXNzTmF2aWdhdGlvbldhcm5pbmc6IHRydWUgfSk7XG5cdFx0dGhpcy51cGxvYWRMaXN0LnVuc2VsZWN0QWxsKCk7XG5cblx0XHR0aGlzLnVwbG9hZEl0ZW1TdWJzZXQudXBkYXRlRmlsdGVyKHggPT4geC5nZXQoXCJlcnJvclwiKSk7XG5cblx0XHR0aGlzLmFjdGl2ZVZpZXcgPSBcInByb2JsZW1cIjtcblx0XHR0aGlzLnNldEFjdGl2ZUxpbmsodGhpcy51aS5wcm9ibGVtTmF2KTtcblx0XHR0aGlzLnNob3dFcnJvclZpZXcoKTtcblxuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcIm1haW5cIiwgbmV3IFByb2JsZW1zKHsgY29sbGVjdGlvbjogdGhpcy51cGxvYWRJdGVtU3Vic2V0IH0pKTtcblx0fSxcblxuXHRsb2FkVXNlcnM6IGZ1bmN0aW9uKCkge1xuXHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0ZSwgXCIvdXBsb2Fkcy91c2Vyc1wiLCB7IHRyaWdnZXI6IGZhbHNlLCByZXBsYWNlOiB0cnVlLCBzdXBwcmVzc05hdmlnYXRpb25XYXJuaW5nOiB0cnVlIH0pO1xuXG5cdFx0dGhpcy5hY3RpdmVWaWV3ID0gXCJ1c2Vyc1wiO1xuXHRcdHRoaXMuc2V0QWN0aXZlTGluayh0aGlzLnVpLnVzZXJzTmF2KTtcblx0XHR0aGlzLnNob3dVcGxvYWRWaWV3KCk7XG5cblx0XHRjb25zdCB1c2Vyc1ZpZXcgPSBuZXcgVXNlcnMoKTtcblx0XHR0aGlzLmxpc3RlblRvKHVzZXJzVmlldywgXCJzdGF0ZTpyZWZyZXNoXCIsIHRoaXMucmVmcmVzaFF1ZXVlU3VtbWFyeSk7XG5cdFx0dGhpcy5saXN0ZW5Ubyh1c2Vyc1ZpZXcsIFwicXVldWU6c3VibWl0XCIsIHRoaXMuc3VibWl0UXVldWUpO1xuXHRcdHRoaXMubGlzdGVuVG8odXNlcnNWaWV3LCBcInF1ZXVlOnJlc2V0XCIsIHRoaXMucmVzZXRRdWV1ZSk7XG5cblx0XHR0aGlzLnNob3dDaGlsZFZpZXcoXCJtYWluXCIsIHVzZXJzVmlldyk7XG5cdH0sXG5cblx0bG9hZFJlbGF0aW9uczogZnVuY3Rpb24oKSB7XG5cdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLk5hdmlnYXRlLCBcIi91cGxvYWRzL3JlbGF0aW9uc1wiLCB7IHRyaWdnZXI6IGZhbHNlLCByZXBsYWNlOiB0cnVlLCBzdXBwcmVzc05hdmlnYXRpb25XYXJuaW5nOiB0cnVlIH0pO1xuXG5cdFx0dGhpcy5hY3RpdmVWaWV3ID0gXCJyZWxhdGlvbnNcIjtcblx0XHR0aGlzLnNldEFjdGl2ZUxpbmsodGhpcy51aS5yZWxhdGlvbnNOYXYpO1xuXHRcdHRoaXMuc2hvd1VwbG9hZFZpZXcoKTtcblxuXHRcdGNvbnN0IHJlbGF0aW9uc1ZpZXcgPSBuZXcgUmVsYXRpb25zKCk7XG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwibWFpblwiLCBuZXcgUmVsYXRpb25zKCkpO1xuXHRcdHRoaXMubGlzdGVuVG8ocmVsYXRpb25zVmlldywgXCJzdGF0ZTpyZWZyZXNoXCIsIHRoaXMucmVmcmVzaFF1ZXVlU3VtbWFyeSk7XG5cdFx0dGhpcy5saXN0ZW5UbyhyZWxhdGlvbnNWaWV3LCBcInF1ZXVlOnN1Ym1pdFwiLCB0aGlzLnN1Ym1pdFF1ZXVlKTtcblx0XHR0aGlzLmxpc3RlblRvKHJlbGF0aW9uc1ZpZXcsIFwicXVldWU6cmVzZXRcIiwgdGhpcy5yZXNldFF1ZXVlKTtcblxuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcIm1haW5cIiwgcmVsYXRpb25zVmlldyk7XG5cdH0sXG5cblx0bG9hZEdyb3VwczogZnVuY3Rpb24oKSB7XG5cdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLk5hdmlnYXRlLCBcIi91cGxvYWRzL2dyb3Vwc1wiLCB7IHRyaWdnZXI6IGZhbHNlLCByZXBsYWNlOiB0cnVlLCBzdXBwcmVzc05hdmlnYXRpb25XYXJuaW5nOiB0cnVlIH0pO1xuXG5cdFx0dGhpcy5hY3RpdmVWaWV3ID0gXCJncm91cHNcIjtcblx0XHR0aGlzLnNldEFjdGl2ZUxpbmsodGhpcy51aS5ncm91cHNOYXYpO1xuXHRcdHRoaXMuc2hvd1VwbG9hZFZpZXcoKTtcblxuXHRcdGNvbnN0IGdyb3Vwc1ZpZXcgPSBuZXcgR3JvdXBzKCk7XG5cdFx0dGhpcy5saXN0ZW5Ubyhncm91cHNWaWV3LCBcInN0YXRlOnJlZnJlc2hcIiwgdGhpcy5yZWZyZXNoUXVldWVTdW1tYXJ5KTtcblx0XHR0aGlzLmxpc3RlblRvKGdyb3Vwc1ZpZXcsIFwicXVldWU6c3VibWl0XCIsIHRoaXMuc3VibWl0UXVldWUpO1xuXHRcdHRoaXMubGlzdGVuVG8oZ3JvdXBzVmlldywgXCJxdWV1ZTpyZXNldFwiLCB0aGlzLnJlc2V0UXVldWUpO1xuXG5cdFx0dGhpcy5zaG93Q2hpbGRWaWV3KFwibWFpblwiLCBncm91cHNWaWV3KTtcblx0fSxcblxuXHRsb2FkVXBsb2FkczogZnVuY3Rpb24oKSB7XG5cdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLk5hdmlnYXRlLCBcIi91cGxvYWRzL3VwbG9hZHNcIiwgeyB0cmlnZ2VyOiBmYWxzZSwgcmVwbGFjZTogdHJ1ZSwgc3VwcHJlc3NOYXZpZ2F0aW9uV2FybmluZzogdHJ1ZSB9KTtcblx0XHR0aGlzLnVwbG9hZExpc3QudW5zZWxlY3RBbGwoKTtcblxuXHRcdHRoaXMuYWN0aXZlVmlldyA9IFwidXBsb2Fkc1wiO1xuXHRcdHRoaXMuc2V0QWN0aXZlTGluayh0aGlzLnVpLnVwbG9hZHNOYXYpO1xuXHRcdHRoaXMuaGlkZVVwbG9hZFZpZXcoKTtcblxuXHRcdHRoaXMuc2hvd0NoaWxkVmlldyhcIm1haW5cIiwgbmV3IFVwbG9hZHMoeyBjb2xsZWN0aW9uOiB0aGlzLnVwbG9hZENvbGxlY3Rpb24gfSkpO1xuXHR9LFxuXG5cdHJlZnJlc2hRdWV1ZVN1bW1hcnk6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLnN1bW1hcnlSZXEpXG5cdFx0XHR0aGlzLnN1bW1hcnlSZXEuYWJvcnQoKTtcblxuXHRcdGNvbnN0IHNwaW5uZXIgPSBcIjxzcGFuIGNsYXNzPVxcXCJzcGlubmVyLWljb24gc3Bpbm5lci1zbWFsbFxcXCIvPlwiO1xuXHRcdHRoaXMudWkudXNlcnNDb3VudC5odG1sKHNwaW5uZXIpLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLmdyb3Vwc0NvdW50Lmh0bWwoc3Bpbm5lcikucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdHRoaXMudWkucmVsYXRpb25zQ291bnQuaHRtbChzcGlubmVyKS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5lcnJvcnNDb3VudC5odG1sKHNwaW5uZXIpLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLndhcm5pbmdzQ291bnQuaHRtbChzcGlubmVyKS5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cblx0XHR0aGlzLnN1bW1hcnlSZXEgPSAkLmFqYXgoe1xuXHRcdFx0dHlwZTogXCJHRVRcIixcblx0XHRcdHVybDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvaW1wb3J0cy9xdWV1ZS9zdW1tYXJ5XCIsXG5cdFx0XHRzdWNjZXNzOiBkYXRhID0+IHtcblx0XHRcdFx0dGhpcy5xdWV1ZVN1bW1hcnlEYXRhID0gZGF0YTtcblx0XHRcdFx0dGhpcy51aS51c2Vyc0NvdW50LnRleHQoZGF0YS51c2Vyc0NvdW50KVtkYXRhLnVzZXJzQ291bnQgPyBcInJlbW92ZUNsYXNzXCIgOiBcImFkZENsYXNzXCJdKFwiaGlkZVwiKTtcblx0XHRcdFx0dGhpcy51aS5ncm91cHNDb3VudC50ZXh0KGRhdGEuZ3JvdXBzQ291bnQpW2RhdGEuZ3JvdXBzQ291bnQgPyBcInJlbW92ZUNsYXNzXCIgOiBcImFkZENsYXNzXCJdKFwiaGlkZVwiKTtcblx0XHRcdFx0dGhpcy51aS5yZWxhdGlvbnNDb3VudC50ZXh0KGRhdGEucmVsYXRpb25zQ291bnQpW2RhdGEucmVsYXRpb25zQ291bnQgPyBcInJlbW92ZUNsYXNzXCIgOiBcImFkZENsYXNzXCJdKFwiaGlkZVwiKTtcblx0XHRcdFx0dGhpcy51aS5lcnJvcnNDb3VudC50ZXh0KGRhdGEuZXJyb3JzLmxlbmd0aCA+IDEwMCA/IFwiMTAwK1wiIDogZGF0YS5lcnJvcnMubGVuZ3RoKVtkYXRhLmVycm9ycy5sZW5ndGggPyBcInJlbW92ZUNsYXNzXCIgOiBcImFkZENsYXNzXCJdKFwiaGlkZVwiKTtcblx0XHRcdFx0dGhpcy51aS53YXJuaW5nc0NvdW50LnRleHQoZGF0YS53YXJuaW5ncy5sZW5ndGggPiAxMDAgPyBcIjEwMCtcIiA6IGRhdGEud2FybmluZ3MubGVuZ3RoKVtkYXRhLndhcm5pbmdzLmxlbmd0aCA/IFwicmVtb3ZlQ2xhc3NcIiA6IFwiYWRkQ2xhc3NcIl0oXCJoaWRlXCIpO1xuXG5cdFx0XHRcdHRoaXMucXVldWVFcnJvcnMucmVzZXQoZGF0YS5lcnJvcnMpO1xuXHRcdFx0XHR0aGlzLnF1ZXVlV2FybmluZ3MucmVzZXQoZGF0YS53YXJuaW5ncyk7XG5cblx0XHRcdFx0dGhpcy5zdW1tYXJ5UmVxID0gbnVsbDtcblx0XHRcdH0sXG5cdFx0XHRlcnJvcjogZSA9PiB7XG5cdFx0XHRcdHRoaXMucXVldWVTdW1tYXJ5RGF0YSA9IG51bGw7XG5cdFx0XHRcdHRoaXMudHJpZ2dlcihcImVycm9yXCIsIHRoaXMsIGUpO1xuXHRcdFx0XHR0aGlzLnN1bW1hcnlSZXEgPSBudWxsO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fSxcblxuXHRzdWJtaXRRdWV1ZTogZnVuY3Rpb24odmlldywgcHJvY2Vzc2luZykge1xuXHRcdC8vQ2xlYW51cCBldmVudHNcblx0XHR0aGlzLnVuYmluZEV2ZW50cyhyYWRpbywgdGhpcy5yYWRpb0V2ZW50cyk7XG5cdFx0dGhpcy5iaW5kRXZlbnRzKHJhZGlvLCB0aGlzLnJhZGlvRXZlbnRzKTtcblxuXHRcdGlmICghdGhpcy5xdWV1ZVN1bW1hcnlEYXRhIHx8IHRoaXMucXVldWVTdW1tYXJ5RGF0YS5xdWV1ZUVtcHR5KVxuXHRcdFx0cmV0dXJuIHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5Ub2FzdCwgeyBpY29uOiBcImZhLXRpbWVzXCIsIGljb25Db2xvdXI6IFwicmVkXCIsIGNvbnRlbnQ6IFwiSW1wb3J0IHF1ZXVlIGlzIGVtcHR5LlwiIH0pO1xuXG5cdFx0aWYgKHRoaXMucXVldWVFcnJvcnMubGVuZ3RoKVxuXHRcdFx0cmV0dXJuIHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5Ub2FzdCwgeyBpY29uOiBcImZhLXRpbWVzXCIsIGljb25Db2xvdXI6IFwicmVkXCIsIGNvbnRlbnQ6IFwiUmVzb2x2ZSBlcnJvcnMgYmVmb3JlIHN1Ym1pdHRpbmdcIiB9KTtcblxuXHRcdHRoaXMuaW1wb3J0TW9kYWwgPSBuZXcgSW1wb3J0TW9kYWwoe1xuXHRcdFx0dXNlckFkZHM6IHRoaXMucXVldWVTdW1tYXJ5RGF0YS51c2VyQWRkaXRpb25zLFxuXHRcdFx0dXNlclVwZGF0ZXM6IHRoaXMucXVldWVTdW1tYXJ5RGF0YS51c2VyVXBkYXRlcyxcblx0XHRcdHVzZXJEZWxldGVzOiB0aGlzLnF1ZXVlU3VtbWFyeURhdGEudXNlckRlbGV0aW9ucyxcblx0XHRcdGdyb3VwQWRkczogdGhpcy5xdWV1ZVN1bW1hcnlEYXRhLmdyb3VwQWRkaXRpb25zLFxuXHRcdFx0Z3JvdXBVcGRhdGVzOiB0aGlzLnF1ZXVlU3VtbWFyeURhdGEuZ3JvdXBVcGRhdGVzLFxuXHRcdFx0Z3JvdXBEZWxldGVzOiB0aGlzLnF1ZXVlU3VtbWFyeURhdGEuZ3JvdXBEZWxldGlvbnMsXG5cdFx0XHRyZWxhdGlvbkFkZHM6IHRoaXMucXVldWVTdW1tYXJ5RGF0YS5yZWxhdGlvbkFkZGl0aW9ucyxcblx0XHRcdHJlbGF0aW9uRGVsZXRlczogdGhpcy5xdWV1ZVN1bW1hcnlEYXRhLnJlbGF0aW9uRGVsZXRpb25zLFxuXHRcdFx0Y3VycmVudFZpZXc6IHZpZXcsXG5cdFx0XHRpbXBvcnRJbnN0YW5jZTogdGhpcyxcblx0XHRcdHdlYnNvY2tldElkOiB0aGlzLndlYnNvY2tldElkLFxuXHRcdFx0cHJldmVudENhbmNlbDogdHJ1ZSxcblx0XHRcdHByb2Nlc3NpbmcsXG5cdFx0fSk7XG5cblx0XHR0aGlzLmltcG9ydE1vZGFsLnNob3coKTtcblx0fSxcblxuXHRyZXNldFF1ZXVlOiBmdW5jdGlvbih2aWV3KSB7XG5cdFx0aWYgKCF0aGlzLnF1ZXVlU3VtbWFyeURhdGEgfHwgdGhpcy5xdWV1ZVN1bW1hcnlEYXRhLnF1ZXVlRW1wdHkpXG5cdFx0XHRyZXR1cm4gcmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7IGljb246IFwiZmEtdGltZXNcIiwgaWNvbkNvbG91cjogXCJyZWRcIiwgY29udGVudDogXCJJbXBvcnQgcXVldWUgaXMgZW1wdHkuXCIgfSk7XG5cblx0XHR0aGlzLnJlc2V0TW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHRwZXJzaXN0OiB0cnVlLFxuXHRcdFx0dGl0bGU6IFwiPHNwYW4gY2xhc3M9J2ZhbCBmYS1leGNsYW1hdGlvbi10cmlhbmdsZScvPiBSZXNldCBxdWV1ZT9cIixcblx0XHRcdGJvZHk6IFwiPHA+QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHJlc2V0IHRoZSBxdWV1ZSBhbmQgY2xlYXIgYWxsIGl0ZW1zPzwvcD5cIixcblx0XHRcdHdhcm5pbmc6IHRydWUsXG5cdFx0fSk7XG5cdFx0dGhpcy5yZXNldE1vZGFsLm9uKFwiYnV0dG9uOm9rXCIsICgpID0+IHtcblx0XHRcdCQuYWpheCh7XG5cdFx0XHRcdHR5cGU6IFwiUE9TVFwiLFxuXHRcdFx0XHR1cmw6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL2ltcG9ydHMvcXVldWUvcmVzZXRcIixcblx0XHRcdFx0ZXJyb3I6IHhociA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgYW5zd2VyID0gQXBwLnBhcnNlUmVzcG9uc2UoeGhyKTtcblx0XHRcdFx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuVG9hc3QsIHsgaWNvbjogXCJmYS10aW1lc1wiLCBpY29uQ29sb3VyOiBcInJlZFwiLCBjb250ZW50OiBhbnN3ZXIuZGV0YWlsIHx8IGFuc3dlci5pbmZvIH0pO1xuXHRcdFx0XHRcdHRoaXMucmVzZXRNb2RhbC5kZXN0cm95KCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHN1Y2Nlc3M6ICgpID0+IHtcblx0XHRcdFx0XHRyYWRpby50cmlnZ2VyKEFwcC5FdmVudHMuQ29tbWFuZHMuVG9hc3QsIHsgY29udGVudDogXCJRdWV1ZSByZXNldFwiIH0pO1xuXHRcdFx0XHRcdHRoaXMucmVmcmVzaFF1ZXVlU3VtbWFyeSgpO1xuXHRcdFx0XHRcdHRoaXMucmVzZXRNb2RhbC5kZXN0cm95KCk7XG5cdFx0XHRcdFx0dGhpcy51cGxvYWRDb2xsZWN0aW9uLnJlc2V0KFtdKTtcblx0XHRcdFx0XHR0aGlzLnJlZnJlc2hDb3VudGVycygpO1xuXHRcdFx0XHRcdHZpZXcuY29sbGVjdGlvbi5mZXRjaCgpO1xuXHRcdFx0XHR9LFxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cblx0XHR0aGlzLnJlc2V0TW9kYWwuc2hvdygpO1xuXHR9LFxufSk7Il19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"upload-overview\",\n\n\ttemplate: require(\"../templates/overview.nunj\")\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm92ZXJ2aWV3LmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIm1vZHVsZSIsImV4cG9ydHMiLCJNYXJpb25ldHRlIiwiVmlldyIsImV4dGVuZCIsImNsYXNzTmFtZSIsInRlbXBsYXRlIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7O0FBRUFDLE9BQU9DLE9BQVAsR0FBaUJILFNBQVNJLFVBQVQsQ0FBb0JDLElBQXBCLENBQXlCQyxNQUF6QixDQUFnQztBQUNoREMsWUFBVyxpQkFEcUM7O0FBR2hEQyxXQUFVUCxRQUFRLDRCQUFSO0FBSHNDLENBQWhDLENBQWpCIiwiZmlsZSI6Im92ZXJ2aWV3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInVwbG9hZC1vdmVydmlld1wiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL292ZXJ2aWV3Lm51bmpcIiksXG59KTsiXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar Page = new Backbone.Marionette.Application();\n\nPage.Events = {\n\tUploadItemClick: \"Page.Events.UploadItemClick\"\n};\n\nmodule.exports = Page;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBhZ2VCdXMuanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwiUGFnZSIsIk1hcmlvbmV0dGUiLCJBcHBsaWNhdGlvbiIsIkV2ZW50cyIsIlVwbG9hZEl0ZW1DbGljayIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjs7QUFFQSxJQUFNQyxPQUFPLElBQUlGLFNBQVNHLFVBQVQsQ0FBb0JDLFdBQXhCLEVBQWI7O0FBRUFGLEtBQUtHLE1BQUwsR0FBYztBQUNiQyxrQkFBaUI7QUFESixDQUFkOztBQUlBQyxPQUFPQyxPQUFQLEdBQWlCTixJQUFqQiIsImZpbGUiOiJwYWdlQnVzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcblxuY29uc3QgUGFnZSA9IG5ldyBCYWNrYm9uZS5NYXJpb25ldHRlLkFwcGxpY2F0aW9uKCk7XG5cblBhZ2UuRXZlbnRzID0ge1xuXHRVcGxvYWRJdGVtQ2xpY2s6IFwiUGFnZS5FdmVudHMuVXBsb2FkSXRlbUNsaWNrXCIsXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBhZ2U7Il19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar _ = require(\"lodash\");\n\nvar Page = require(\"./pageBus\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"upload-problems\",\n\n\tui: {\n\t\tretry: \"button[name='retry']\",\n\t\tskip: \"button[name='skip']\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.retry\": \"retry\",\n\t\t\"click @ui.skip\": \"skip\"\n\t},\n\n\tmodelEvents: {\n\t\tremove: \"close\"\n\t},\n\n\tcollectionEvents: {\n\t\t\"add remove\": \"collectionChange\"\n\t},\n\n\tgetTemplate: function getTemplate() {\n\t\tif (this.model) return require(\"../templates/problem-template.nunj\");\n\t\treturn require(\"../templates/problems.nunj\");\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.listenTo(Page, Page.Events.UploadItemClick, this.activateItem.bind(this));\n\n\t\tthis.TooltipElements = [];\n\t},\n\n\tserializeData: function serializeData() {\n\t\tif (this.model) return _.extend(this.model.toJSON({ computed: true }), { items: this.collection.toJSON({ computed: true }) });\n\t\treturn { items: this.collection.toJSON({ computed: true }) };\n\t},\n\n\tclose: function close(model) {\n\t\tif (!this.model || model.id !== this.model.id) return;\n\n\t\tthis.unbindEvents(this.model, this.modelEvents);\n\t\tdelete this.model;\n\t\tthis.render();\n\t},\n\n\tactivateItem: function activateItem(model) {\n\t\tthis.model = model;\n\t\tthis.bindEvents(this.model, this.modelEvents);\n\n\t\tthis.render();\n\t},\n\n\tcollectionChange: function collectionChange() {\n\t\tif (!this.model) this.render();\n\t},\n\n\tretry: function retry() {\n\t\tthis.model.set({ active: false });\n\t\tthis.model.unset(\"error\");\n\t\tthis.close(this.model);\n\t},\n\n\tskip: function skip() {\n\t\tthis.model.collection.remove(this.model);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInByb2JsZW1zLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIl8iLCJQYWdlIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiZXh0ZW5kIiwiY2xhc3NOYW1lIiwidWkiLCJyZXRyeSIsInNraXAiLCJldmVudHMiLCJtb2RlbEV2ZW50cyIsInJlbW92ZSIsImNvbGxlY3Rpb25FdmVudHMiLCJnZXRUZW1wbGF0ZSIsIm1vZGVsIiwiaW5pdGlhbGl6ZSIsImxpc3RlblRvIiwiRXZlbnRzIiwiVXBsb2FkSXRlbUNsaWNrIiwiYWN0aXZhdGVJdGVtIiwiYmluZCIsIlRvb2x0aXBFbGVtZW50cyIsInNlcmlhbGl6ZURhdGEiLCJ0b0pTT04iLCJjb21wdXRlZCIsIml0ZW1zIiwiY29sbGVjdGlvbiIsImNsb3NlIiwiaWQiLCJ1bmJpbmRFdmVudHMiLCJyZW5kZXIiLCJiaW5kRXZlbnRzIiwiY29sbGVjdGlvbkNoYW5nZSIsInNldCIsImFjdGl2ZSIsInVuc2V0Il0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjs7QUFFQSxJQUFNRSxPQUFPRixRQUFRLFdBQVIsQ0FBYjs7QUFFQUcsT0FBT0MsT0FBUCxHQUFpQkwsU0FBU00sVUFBVCxDQUFvQkMsSUFBcEIsQ0FBeUJDLE1BQXpCLENBQWdDO0FBQ2hEQyxZQUFXLGlCQURxQzs7QUFHaERDLEtBQUk7QUFDSEMsU0FBTyxzQkFESjtBQUVIQyxRQUFNO0FBRkgsRUFINEM7O0FBUWhEQyxTQUFRO0FBQ1AscUJBQW1CLE9BRFo7QUFFUCxvQkFBa0I7QUFGWCxFQVJ3Qzs7QUFhaERDLGNBQWE7QUFDWkMsVUFBUTtBQURJLEVBYm1DOztBQWlCaERDLG1CQUFrQjtBQUNqQixnQkFBYztBQURHLEVBakI4Qjs7QUFxQmhEQyxjQUFhLHVCQUFXO0FBQ3ZCLE1BQUksS0FBS0MsS0FBVCxFQUNDLE9BQU9qQixRQUFRLG9DQUFSLENBQVA7QUFDRCxTQUFPQSxRQUFRLDRCQUFSLENBQVA7QUFDQSxFQXpCK0M7O0FBMkJoRGtCLGFBQVksc0JBQVc7QUFDdEIsT0FBS0MsUUFBTCxDQUFjakIsSUFBZCxFQUFvQkEsS0FBS2tCLE1BQUwsQ0FBWUMsZUFBaEMsRUFBaUQsS0FBS0MsWUFBTCxDQUFrQkMsSUFBbEIsQ0FBdUIsSUFBdkIsQ0FBakQ7O0FBRUEsT0FBS0MsZUFBTCxHQUF1QixFQUF2QjtBQUNBLEVBL0IrQzs7QUFpQ2hEQyxnQkFBZSx5QkFBVztBQUN6QixNQUFJLEtBQUtSLEtBQVQsRUFDQyxPQUFPaEIsRUFBRU0sTUFBRixDQUFTLEtBQUtVLEtBQUwsQ0FBV1MsTUFBWCxDQUFrQixFQUFFQyxVQUFVLElBQVosRUFBbEIsQ0FBVCxFQUFnRCxFQUFFQyxPQUFPLEtBQUtDLFVBQUwsQ0FBZ0JILE1BQWhCLENBQXVCLEVBQUVDLFVBQVUsSUFBWixFQUF2QixDQUFULEVBQWhELENBQVA7QUFDRCxTQUFPLEVBQUVDLE9BQU8sS0FBS0MsVUFBTCxDQUFnQkgsTUFBaEIsQ0FBdUIsRUFBRUMsVUFBVSxJQUFaLEVBQXZCLENBQVQsRUFBUDtBQUNBLEVBckMrQzs7QUF1Q2hERyxRQUFPLGVBQVNiLEtBQVQsRUFBZ0I7QUFDdEIsTUFBSSxDQUFDLEtBQUtBLEtBQU4sSUFBZUEsTUFBTWMsRUFBTixLQUFhLEtBQUtkLEtBQUwsQ0FBV2MsRUFBM0MsRUFDQzs7QUFFRCxPQUFLQyxZQUFMLENBQWtCLEtBQUtmLEtBQXZCLEVBQThCLEtBQUtKLFdBQW5DO0FBQ0EsU0FBTyxLQUFLSSxLQUFaO0FBQ0EsT0FBS2dCLE1BQUw7QUFDQSxFQTlDK0M7O0FBZ0RoRFgsZUFBYyxzQkFBU0wsS0FBVCxFQUFnQjtBQUM3QixPQUFLQSxLQUFMLEdBQWFBLEtBQWI7QUFDQSxPQUFLaUIsVUFBTCxDQUFnQixLQUFLakIsS0FBckIsRUFBNEIsS0FBS0osV0FBakM7O0FBRUEsT0FBS29CLE1BQUw7QUFDQSxFQXJEK0M7O0FBdURoREUsbUJBQWtCLDRCQUFXO0FBQzVCLE1BQUksQ0FBQyxLQUFLbEIsS0FBVixFQUNDLEtBQUtnQixNQUFMO0FBQ0QsRUExRCtDOztBQTREaER2QixRQUFPLGlCQUFXO0FBQ2pCLE9BQUtPLEtBQUwsQ0FBV21CLEdBQVgsQ0FBZSxFQUFFQyxRQUFRLEtBQVYsRUFBZjtBQUNBLE9BQUtwQixLQUFMLENBQVdxQixLQUFYLENBQWlCLE9BQWpCO0FBQ0EsT0FBS1IsS0FBTCxDQUFXLEtBQUtiLEtBQWhCO0FBQ0EsRUFoRStDOztBQWtFaEROLE9BQU0sZ0JBQVc7QUFDaEIsT0FBS00sS0FBTCxDQUFXWSxVQUFYLENBQXNCZixNQUF0QixDQUE2QixLQUFLRyxLQUFsQztBQUNBO0FBcEUrQyxDQUFoQyxDQUFqQiIsImZpbGUiOiJwcm9ibGVtcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcblxuY29uc3QgUGFnZSA9IHJlcXVpcmUoXCIuL3BhZ2VCdXNcIik7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJ1cGxvYWQtcHJvYmxlbXNcIixcblxuXHR1aToge1xuXHRcdHJldHJ5OiBcImJ1dHRvbltuYW1lPSdyZXRyeSddXCIsXG5cdFx0c2tpcDogXCJidXR0b25bbmFtZT0nc2tpcCddXCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkucmV0cnlcIjogXCJyZXRyeVwiLFxuXHRcdFwiY2xpY2sgQHVpLnNraXBcIjogXCJza2lwXCIsXG5cdH0sXG5cblx0bW9kZWxFdmVudHM6IHtcblx0XHRyZW1vdmU6IFwiY2xvc2VcIixcblx0fSxcblxuXHRjb2xsZWN0aW9uRXZlbnRzOiB7XG5cdFx0XCJhZGQgcmVtb3ZlXCI6IFwiY29sbGVjdGlvbkNoYW5nZVwiLFxuXHR9LFxuXG5cdGdldFRlbXBsYXRlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5tb2RlbClcblx0XHRcdHJldHVybiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL3Byb2JsZW0tdGVtcGxhdGUubnVualwiKTtcblx0XHRyZXR1cm4gcmVxdWlyZShcIi4uL3RlbXBsYXRlcy9wcm9ibGVtcy5udW5qXCIpO1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMubGlzdGVuVG8oUGFnZSwgUGFnZS5FdmVudHMuVXBsb2FkSXRlbUNsaWNrLCB0aGlzLmFjdGl2YXRlSXRlbS5iaW5kKHRoaXMpKTtcblxuXHRcdHRoaXMuVG9vbHRpcEVsZW1lbnRzID0gW107XG5cdH0sXG5cblx0c2VyaWFsaXplRGF0YTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwpXG5cdFx0XHRyZXR1cm4gXy5leHRlbmQodGhpcy5tb2RlbC50b0pTT04oeyBjb21wdXRlZDogdHJ1ZSB9KSwgeyBpdGVtczogdGhpcy5jb2xsZWN0aW9uLnRvSlNPTih7IGNvbXB1dGVkOiB0cnVlIH0pIH0pO1xuXHRcdHJldHVybiB7IGl0ZW1zOiB0aGlzLmNvbGxlY3Rpb24udG9KU09OKHsgY29tcHV0ZWQ6IHRydWUgfSkgfTtcblx0fSxcblxuXHRjbG9zZTogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRpZiAoIXRoaXMubW9kZWwgfHwgbW9kZWwuaWQgIT09IHRoaXMubW9kZWwuaWQpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLnVuYmluZEV2ZW50cyh0aGlzLm1vZGVsLCB0aGlzLm1vZGVsRXZlbnRzKTtcblx0XHRkZWxldGUgdGhpcy5tb2RlbDtcblx0XHR0aGlzLnJlbmRlcigpO1xuXHR9LFxuXG5cdGFjdGl2YXRlSXRlbTogZnVuY3Rpb24obW9kZWwpIHtcblx0XHR0aGlzLm1vZGVsID0gbW9kZWw7XG5cdFx0dGhpcy5iaW5kRXZlbnRzKHRoaXMubW9kZWwsIHRoaXMubW9kZWxFdmVudHMpO1xuXG5cdFx0dGhpcy5yZW5kZXIoKTtcblx0fSxcblxuXHRjb2xsZWN0aW9uQ2hhbmdlOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIXRoaXMubW9kZWwpXG5cdFx0XHR0aGlzLnJlbmRlcigpO1xuXHR9LFxuXG5cdHJldHJ5OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm1vZGVsLnNldCh7IGFjdGl2ZTogZmFsc2UgfSk7XG5cdFx0dGhpcy5tb2RlbC51bnNldChcImVycm9yXCIpO1xuXHRcdHRoaXMuY2xvc2UodGhpcy5tb2RlbCk7XG5cdH0sXG5cblx0c2tpcDogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5tb2RlbC5jb2xsZWN0aW9uLnJlbW92ZSh0aGlzLm1vZGVsKTtcblx0fSxcbn0pOyJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar _ = require(\"lodash\");\n\nvar settings = require(\"app-settings\");\n\nvar App = require(\"../../index\");\nvar ServerGrid = require(\"../../lib/serverGrid\");\nvar SmallModal = require(\"../../lib/smallModal\");\n\nvar Relation = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"import_id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/imports\";\n\t},\n\n\tcomputeds: {\n\t\thtmlState: function htmlState() {\n\t\t\tvar state = void 0;\n\t\t\tif (_.startsWith(this.get(\"action\"), \"add\")) state = \"add\";else if (_.startsWith(this.get(\"action\"), \"update\")) state = \"update\";else if (_.startsWith(this.get(\"action\"), \"delete\")) state = \"delete\";\n\n\t\t\treturn \"<span class='\" + state + \"'></span>\";\n\t\t}\n\t}\n});\n\nvar Relations = Backbone.PageableCollection.extend({\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/imports?type=relation\";\n\t},\n\n\tmodel: Relation,\n\n\tstate: {\n\t\tpageSize: 15\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\ttotalPages: null,\n\t\ttotalRecords: null,\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\t_.each(resp.rows, function (r) {\n\t\t\tif (r.username && r.username.length) {\n\t\t\t\tr.identifier = r.username;\n\t\t\t\tr.allocationType = \"User\";\n\t\t\t} else if (r.book && r.book.length) {\n\t\t\t\tr.identifier = r.book;\n\t\t\t\tr.allocationType = \"Book\";\n\t\t\t}\n\t\t});\n\n\t\treturn resp.rows;\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"relations-import\",\n\n\tui: {\n\t\tfilterBar: \".ops-bar .filters\",\n\t\tcounterBar: \".ops-bar .counter\",\n\t\tgrid: \"div.grid\",\n\t\tpaging: \".paging\",\n\n\t\treset: \".actions div.reset\",\n\t\tsubmit: \".actions div.submit\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.reset\": \"resetQueue\",\n\t\t\"click @ui.submit\": \"submitQueue\"\n\t},\n\n\tcollectionEvents: {\n\t\t\"toolbar:click:delete\": \"deleteItem\"\n\t},\n\n\ttemplate: require(\"../templates/relations.nunj\"),\n\n\tinitialize: function initialize() {\n\t\tthis.collection = new Relations();\n\n\t\tthis.bindEvents(this.collection, this.collectionEvents);\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tif (this.grid) this.grid.destroy();\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"htmlState\", label: \"State\", cell: ServerGrid.HTMLCell.extend({}), editable: false }, { name: \"allocationType\", label: \"Type\", cell: \"string\", editable: false }, { name: \"identifier\", label: \"ID\", cell: \"string\", editable: false }, { name: \"group\", label: \"Group\", cell: \"string\", editable: false }, { label: \"Actions\", cell: new ServerGrid.ToolbarCell({ tooltips: [{ title: \"Delete\", icon: \"fa-trash-alt\", data: \"delete\" }] }), editable: false, sortable: false }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.paging,\n\t\t\tcolumns: columns,\n\t\t\tcollection: this.collection,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counterBar,\n\t\t\t\ttemplate: \"Queued allocations $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tthis.items = this.grid.collection;\n\n\t\tthis.bindEvents(this.items, this.itemEvents);\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar filtars = [textFilter];\n\t\tvar defFilters = [\"textFilter\"];\n\n\t\tthis.ui.filterBar.prepend(this.grid.filter({\n\t\t\tfilterContainer: this.ui.filterBar,\n\t\t\tfilters: filtars,\n\t\t\tdefaultFilters: defFilters\n\t\t}).render().el);\n\t},\n\n\tdeleteItem: function deleteItem(model) {\n\t\tvar _this = this;\n\n\t\tthis.delModal = new SmallModal({\n\t\t\tpersist: true,\n\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Remove Queued Allocation: \" + model.get(\"allocationType\") + \"</span>\",\n\t\t\tbody: \"<p>Are you sure you want to remove this queued allocation?</p>\",\n\t\t\twarning: true\n\t\t});\n\t\tthis.delModal.on(\"button:ok\", function () {\n\t\t\tmodel.destroy({ wait: true, success: _this.deletionSuccess.bind(_this), error: _this.deletionError.bind(_this) });\n\t\t});\n\n\t\tthis.delModal.show();\n\t},\n\n\tdeletionSuccess: function deletionSuccess() {\n\t\tthis.delModal.destroy();\n\t\tthis.trigger(\"state:refresh\");\n\t},\n\n\tdeletionError: function deletionError(model, xhr) {\n\t\tvar answer = App.parseResponse(xhr);\n\t\tthis.delModal.showError(\"Deletion failed: \" + (answer.detail || answer.info));\n\t},\n\n\tresetQueue: function resetQueue() {\n\t\tthis.trigger(\"queue:reset\", this);\n\t},\n\n\tsubmitQueue: function submitQueue() {\n\t\tthis.trigger(\"queue:submit\", this);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJlbGF0aW9ucy5qcyJdLCJuYW1lcyI6WyJCYWNrYm9uZSIsInJlcXVpcmUiLCJfIiwic2V0dGluZ3MiLCJBcHAiLCJTZXJ2ZXJHcmlkIiwiU21hbGxNb2RhbCIsIlJlbGF0aW9uIiwiRXBveHkiLCJNb2RlbCIsImV4dGVuZCIsImlkQXR0cmlidXRlIiwidXJsUm9vdCIsImNvbXB1dGVkcyIsImh0bWxTdGF0ZSIsInN0YXRlIiwic3RhcnRzV2l0aCIsImdldCIsIlJlbGF0aW9ucyIsIlBhZ2VhYmxlQ29sbGVjdGlvbiIsInVybCIsIm1vZGVsIiwicGFnZVNpemUiLCJtb2RlIiwicXVlcnlQYXJhbXMiLCJ0b3RhbFBhZ2VzIiwidG90YWxSZWNvcmRzIiwic29ydEtleSIsInBhcnNlU3RhdGUiLCJyZXNwIiwidG90YWwiLCJwYXJzZVJlY29yZHMiLCJlYWNoIiwicm93cyIsInIiLCJ1c2VybmFtZSIsImxlbmd0aCIsImlkZW50aWZpZXIiLCJhbGxvY2F0aW9uVHlwZSIsImJvb2siLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJjbGFzc05hbWUiLCJ1aSIsImZpbHRlckJhciIsImNvdW50ZXJCYXIiLCJncmlkIiwicGFnaW5nIiwicmVzZXQiLCJzdWJtaXQiLCJldmVudHMiLCJjb2xsZWN0aW9uRXZlbnRzIiwidGVtcGxhdGUiLCJpbml0aWFsaXplIiwiY29sbGVjdGlvbiIsImJpbmRFdmVudHMiLCJvbkJlZm9yZURlc3Ryb3kiLCJkZXN0cm95Iiwib25SZW5kZXIiLCJjb2x1bW5zIiwibmFtZSIsImxhYmVsIiwiY2VsbCIsIkhUTUxDZWxsIiwiZWRpdGFibGUiLCJUb29sYmFyQ2VsbCIsInRvb2x0aXBzIiwidGl0bGUiLCJpY29uIiwiZGF0YSIsInNvcnRhYmxlIiwiZWwiLCJjb3VudGVyIiwiZWxlbWVudCIsIml0ZW1zIiwiaXRlbUV2ZW50cyIsInRleHRGaWx0ZXIiLCJ0eXBlIiwiZGVib3VuY2UiLCJzZXJ2ZXIiLCJmaWx0YXJzIiwiZGVmRmlsdGVycyIsInByZXBlbmQiLCJmaWx0ZXIiLCJmaWx0ZXJDb250YWluZXIiLCJmaWx0ZXJzIiwiZGVmYXVsdEZpbHRlcnMiLCJyZW5kZXIiLCJkZWxldGVJdGVtIiwiZGVsTW9kYWwiLCJwZXJzaXN0IiwiYm9keSIsIndhcm5pbmciLCJvbiIsIndhaXQiLCJzdWNjZXNzIiwiZGVsZXRpb25TdWNjZXNzIiwiYmluZCIsImVycm9yIiwiZGVsZXRpb25FcnJvciIsInNob3ciLCJ0cmlnZ2VyIiwieGhyIiwiYW5zd2VyIiwicGFyc2VSZXNwb25zZSIsInNob3dFcnJvciIsImRldGFpbCIsImluZm8iLCJyZXNldFF1ZXVlIiwic3VibWl0UXVldWUiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1DLElBQUlELFFBQVEsUUFBUixDQUFWOztBQUVBLElBQU1FLFdBQVdGLFFBQVEsY0FBUixDQUFqQjs7QUFFQSxJQUFNRyxNQUFNSCxRQUFRLGFBQVIsQ0FBWjtBQUNBLElBQU1JLGFBQWFKLFFBQVEsc0JBQVIsQ0FBbkI7QUFDQSxJQUFNSyxhQUFhTCxRQUFRLHNCQUFSLENBQW5COztBQUVBLElBQU1NLFdBQVdQLFNBQVNRLEtBQVQsQ0FBZUMsS0FBZixDQUFxQkMsTUFBckIsQ0FBNEI7QUFDNUNDLGNBQWEsV0FEK0I7O0FBRzVDQyxVQUFTLG1CQUFXO0FBQ25CLFNBQU9ULFNBQVNTLE9BQVQsR0FBbUIsa0JBQTFCO0FBQ0EsRUFMMkM7O0FBTzVDQyxZQUFXO0FBQ1ZDLGFBQVcscUJBQVc7QUFDckIsT0FBSUMsY0FBSjtBQUNBLE9BQUliLEVBQUVjLFVBQUYsQ0FBYSxLQUFLQyxHQUFMLENBQVMsUUFBVCxDQUFiLEVBQWlDLEtBQWpDLENBQUosRUFDQ0YsUUFBUSxLQUFSLENBREQsS0FFSyxJQUFJYixFQUFFYyxVQUFGLENBQWEsS0FBS0MsR0FBTCxDQUFTLFFBQVQsQ0FBYixFQUFpQyxRQUFqQyxDQUFKLEVBQ0pGLFFBQVEsUUFBUixD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QUwsQ0FBYSxjQUFiLEVBQTZCLElBQTdCO0FBQ0E7QUEvRytDLENBQWhDLENBQWpCIiwiZmlsZSI6InJlbGF0aW9ucy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcblxuY29uc3Qgc2V0dGluZ3MgPSByZXF1aXJlKFwiYXBwLXNldHRpbmdzXCIpO1xuXG5jb25zdCBBcHAgPSByZXF1aXJlKFwiLi4vLi4vaW5kZXhcIik7XG5jb25zdCBTZXJ2ZXJHcmlkID0gcmVxdWlyZShcIi4uLy4uL2xpYi9zZXJ2ZXJHcmlkXCIpO1xuY29uc3QgU21hbGxNb2RhbCA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc21hbGxNb2RhbFwiKTtcblxuY29uc3QgUmVsYXRpb24gPSBCYWNrYm9uZS5FcG94eS5Nb2RlbC5leHRlbmQoe1xuXHRpZEF0dHJpYnV0ZTogXCJpbXBvcnRfaWRcIixcblxuXHR1cmxSb290OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvaW1wb3J0c1wiO1xuXHR9LFxuXG5cdGNvbXB1dGVkczoge1xuXHRcdGh0bWxTdGF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRsZXQgc3RhdGU7XG5cdFx0XHRpZiAoXy5zdGFydHNXaXRoKHRoaXMuZ2V0KFwiYWN0aW9uXCIpLCBcImFkZFwiKSlcblx0XHRcdFx0c3RhdGUgPSBcImFkZFwiO1xuXHRcdFx0ZWxzZSBpZiAoXy5zdGFydHNXaXRoKHRoaXMuZ2V0KFwiYWN0aW9uXCIpLCBcInVwZGF0ZVwiKSlcblx0XHRcdFx0c3RhdGUgPSBcInVwZGF0ZVwiO1xuXHRcdFx0ZWxzZSBpZiAoXy5zdGFydHNXaXRoKHRoaXMuZ2V0KFwiYWN0aW9uXCIpLCBcImRlbGV0ZVwiKSlcblx0XHRcdFx0c3RhdGUgPSBcImRlbGV0ZVwiO1xuXG5cdFx0XHRyZXR1cm4gYDxzcGFuIGNsYXNzPScke3N0YXRlfSc+PC9zcGFuPmA7XG5cdFx0fSxcblx0fSxcbn0pO1xuXG5jb25zdCBSZWxhdGlvbnMgPSBCYWNrYm9uZS5QYWdlYWJsZUNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvaW1wb3J0cz90eXBlPXJlbGF0aW9uXCI7XG5cdH0sXG5cblx0bW9kZWw6IFJlbGF0aW9uLFxuXG5cdHN0YXRlOiB7XG5cdFx0cGFnZVNpemU6IDE1LFxuXHR9LFxuXHRtb2RlOiBcInNlcnZlclwiLFxuXG5cdHF1ZXJ5UGFyYW1zOiB7XG5cdFx0cGFnZVNpemU6IFwicGFnZVNpemVcIixcblx0XHR0b3RhbFBhZ2VzOiBudWxsLFxuXHRcdHRvdGFsUmVjb3JkczogbnVsbCxcblx0XHRzb3J0S2V5OiBcInNvcnRCeVwiLFxuXHR9LFxuXG5cdHBhcnNlU3RhdGU6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRyZXR1cm4geyB0b3RhbFJlY29yZHM6IHJlc3AudG90YWwgfTtcblx0fSxcblxuXHRwYXJzZVJlY29yZHM6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRfLmVhY2gocmVzcC5yb3dzLCByID0+IHtcblx0XHRcdGlmIChyLnVzZXJuYW1lICYmIHIudXNlcm5hbWUubGVuZ3RoKSB7XG5cdFx0XHRcdHIuaWRlbnRpZmllciA9IHIudXNlcm5hbWU7XG5cdFx0XHRcdHIuYWxsb2NhdGlvblR5cGUgPSBcIlVzZXJcIjtcblx0XHRcdH1cblx0XHRcdGVsc2UgaWYgKHIuYm9vayAmJiByLmJvb2subGVuZ3RoKSB7XG5cdFx0XHRcdHIuaWRlbnRpZmllciA9IHIuYm9vaztcblx0XHRcdFx0ci5hbGxvY2F0aW9uVHlwZSA9IFwiQm9va1wiO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHJlc3Aucm93cztcblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwicmVsYXRpb25zLWltcG9ydFwiLFxuXG5cdHVpOiB7XG5cdFx0ZmlsdGVyQmFyOiBcIi5vcHMtYmFyIC5maWx0ZXJzXCIsXG5cdFx0Y291bnRlckJhcjogXCIub3BzLWJhciAuY291bnRlclwiLFxuXHRcdGdyaWQ6IFwiZGl2LmdyaWRcIixcblx0XHRwYWdpbmc6IFwiLnBhZ2luZ1wiLFxuXG5cdFx0cmVzZXQ6IFwiLmFjdGlvbnMgZGl2LnJlc2V0XCIsXG5cdFx0c3VibWl0OiBcIi5hY3Rpb25zIGRpdi5zdWJtaXRcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5yZXNldFwiOiBcInJlc2V0UXVldWVcIixcblx0XHRcImNsaWNrIEB1aS5zdWJtaXRcIjogXCJzdWJtaXRRdWV1ZVwiLFxuXHR9LFxuXG5cdGNvbGxlY3Rpb25FdmVudHM6IHtcblx0XHRcInRvb2xiYXI6Y2xpY2s6ZGVsZXRlXCI6IFwiZGVsZXRlSXRlbVwiLFxuXHR9LFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL3JlbGF0aW9ucy5udW5qXCIpLFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY29sbGVjdGlvbiA9IG5ldyBSZWxhdGlvbnMoKTtcblxuXHRcdHRoaXMuYmluZEV2ZW50cyh0aGlzLmNvbGxlY3Rpb24sIHRoaXMuY29sbGVjdGlvbkV2ZW50cyk7XG5cdH0sXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5ncmlkKVxuXHRcdFx0dGhpcy5ncmlkLmRlc3Ryb3koKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgY29sdW1ucyA9IFtcblx0XHRcdHsgbmFtZTogXCJodG1sU3RhdGVcIiwgbGFiZWw6IFwiU3RhdGVcIiwgY2VsbDogU2VydmVyR3JpZC5IVE1MQ2VsbC5leHRlbmQoe30pLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJhbGxvY2F0aW9uVHlwZVwiLCBsYWJlbDogXCJUeXBlXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImlkZW50aWZpZXJcIiwgbGFiZWw6IFwiSURcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiZ3JvdXBcIiwgbGFiZWw6IFwiR3JvdXBcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IGxhYmVsOiBcIkFjdGlvbnNcIiwgY2VsbDogbmV3IFNlcnZlckdyaWQuVG9vbGJhckNlbGwoeyB0b29sdGlwczogW1xuXHRcdFx0XHR7IHRpdGxlOiBcIkRlbGV0ZVwiLCBpY29uOiBcImZhLXRyYXNoLWFsdFwiLCBkYXRhOiBcImRlbGV0ZVwiIH0sXG5cdFx0XHRdIH0pLCBlZGl0YWJsZTogZmFsc2UsIHNvcnRhYmxlOiBmYWxzZSB9LFxuXHRcdF07XG5cblx0XHR0aGlzLmdyaWQgPSBuZXcgU2VydmVyR3JpZCh7XG5cdFx0XHRlbDogdGhpcy51aS5wYWdpbmcsXG5cdFx0XHRjb2x1bW5zOiBjb2x1bW5zLFxuXHRcdFx0Y29sbGVjdGlvbjogdGhpcy5jb2xsZWN0aW9uLFxuXHRcdFx0Y291bnRlcjoge1xuXHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLmNvdW50ZXJCYXIsXG5cdFx0XHRcdHRlbXBsYXRlOiBcIlF1ZXVlZCBhbGxvY2F0aW9ucyAkc3RhcnQgLSAkZW5kIG9mICR0b3RhbFwiLFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLnBhZ2luZyxcblx0XHRcdH0sXG5cdFx0fSk7XG5cblx0XHR0aGlzLml0ZW1zID0gdGhpcy5ncmlkLmNvbGxlY3Rpb247XG5cblx0XHR0aGlzLmJpbmRFdmVudHModGhpcy5pdGVtcywgdGhpcy5pdGVtRXZlbnRzKTtcblxuXHRcdGNvbnN0IHRleHRGaWx0ZXIgPSB7XG5cdFx0XHR0eXBlOiBcInRleHRcIixcblx0XHRcdG5hbWU6IFwidGV4dEZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiVGV4dCBTZWFyY2hcIixcblx0XHRcdGRlYm91bmNlOiAyMDAsXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdGNvbnN0IGZpbHRhcnMgPSBbdGV4dEZpbHRlcl07XG5cdFx0Y29uc3QgZGVmRmlsdGVycyA9IFtcInRleHRGaWx0ZXJcIl07XG5cblx0XHR0aGlzLnVpLmZpbHRlckJhci5wcmVwZW5kKHRoaXMuZ3JpZC5maWx0ZXIoe1xuXHRcdFx0ZmlsdGVyQ29udGFpbmVyOiB0aGlzLnVpLmZpbHRlckJhcixcblx0XHRcdGZpbHRlcnM6IGZpbHRhcnMsXG5cdFx0XHRkZWZhdWx0RmlsdGVyczogZGVmRmlsdGVycyxcblx0XHR9KS5yZW5kZXIoKS5lbCk7XG5cdH0sXG5cblx0ZGVsZXRlSXRlbTogZnVuY3Rpb24obW9kZWwpIHtcblx0XHR0aGlzLmRlbE1vZGFsID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0cGVyc2lzdDogdHJ1ZSxcblx0XHRcdHRpdGxlOiBgPHNwYW4gY2xhc3M9J2ZhbCBmYS1leGNsYW1hdGlvbi10cmlhbmdsZScvPiBSZW1vdmUgUXVldWVkIEFsbG9jYXRpb246ICR7bW9kZWwuZ2V0KFwiYWxsb2NhdGlvblR5cGVcIil9PC9zcGFuPmAsXG5cdFx0XHRib2R5OiBcIjxwPkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZW1vdmUgdGhpcyBxdWV1ZWQgYWxsb2NhdGlvbj88L3A+XCIsXG5cdFx0XHR3YXJuaW5nOiB0cnVlLFxuXHRcdH0pO1xuXHRcdHRoaXMuZGVsTW9kYWwub24oXCJidXR0b246b2tcIiwgKCkgPT4ge1xuXHRcdFx0bW9kZWwuZGVzdHJveSh7IHdhaXQ6IHRydWUsIHN1Y2Nlc3M6IHRoaXMuZGVsZXRpb25TdWNjZXNzLmJpbmQodGhpcyksIGVycm9yOiB0aGlzLmRlbGV0aW9uRXJyb3IuYmluZCh0aGlzKSB9KTtcblx0XHR9KTtcblxuXHRcdHRoaXMuZGVsTW9kYWwuc2hvdygpO1xuXHR9LFxuXG5cdGRlbGV0aW9uU3VjY2VzczogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5kZWxNb2RhbC5kZXN0cm95KCk7XG5cdFx0dGhpcy50cmlnZ2VyKFwic3RhdGU6cmVmcmVzaFwiKTtcblx0fSxcblxuXHRkZWxldGlvbkVycm9yOiBmdW5jdGlvbihtb2RlbCwgeGhyKSB7XG5cdFx0Y29uc3QgYW5zd2VyID0gQXBwLnBhcnNlUmVzcG9uc2UoeGhyKTtcblx0XHR0aGlzLmRlbE1vZGFsLnNob3dFcnJvcihcIkRlbGV0aW9uIGZhaWxlZDogXCIgKyAoYW5zd2VyLmRldGFpbCB8fCBhbnN3ZXIuaW5mbykpO1xuXHR9LFxuXG5cdHJlc2V0UXVldWU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudHJpZ2dlcihcInF1ZXVlOnJlc2V0XCIsIHRoaXMpO1xuXHR9LFxuXG5cdHN1Ym1pdFF1ZXVlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnRyaWdnZXIoXCJxdWV1ZTpzdWJtaXRcIiwgdGhpcyk7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar SimpleMenu = require(\"../../lib/simpleMenu\");\nvar SmallModal = require(\"../../lib/smallModal\");\n\nvar Page = require(\"./pageBus\");\n\nvar Item = Backbone.Marionette.View.extend({\n\tclassName: \"upload-item\",\n\n\ttemplate: require(\"../templates/upload-item.nunj\"),\n\n\tui: {\n\t\tremover: \".remover\"\n\t},\n\n\tevents: {\n\t\tclick: \"clicked\",\n\t\t\"click @ui.remover\": \"close\"\n\t},\n\n\tmodelEvents: {\n\t\t\"change:active\": \"setActive\",\n\t\tchange: \"render\"\n\t},\n\n\tinitialize: function initialize() {\n\t\tthis.listenTo(Page, Page.Events.UploadItemClick, this.toggleTaggedStatus.bind(this));\n\t},\n\n\tonRender: function onRender() {\n\t\tif (this.model.get(\"active\")) this.$el.addClass(\"active\");\n\t},\n\n\ttoggleTaggedStatus: function toggleTaggedStatus(model) {\n\t\tif (model.id === this.model.id) return;\n\n\t\tthis.model.unset(\"active\");\n\t\tthis.$el.removeClass(\"active\");\n\t},\n\n\tsetActive: function setActive() {\n\t\tif (this.model.get(\"active\")) this.$el.addClass(\"active\");else this.$el.removeClass(\"active\");\n\t},\n\n\tclicked: function clicked() {\n\t\tPage.trigger(Page.Events.UploadItemClick, this.model);\n\n\t\tthis.model.set({ active: true });\n\t},\n\n\tclose: function close(evt) {\n\t\tvar _this = this;\n\n\t\tif (evt.stopPropagation) evt.stopPropagation();\n\n\t\tif (this.model.get(\"uploading\")) {\n\t\t\t// Warn the user first\n\t\t\tvar modal = new SmallModal({\n\t\t\t\ttitle: \"<span class='fa fa-exclamation-triangle'/> Cancel Upload\",\n\t\t\t\twarn: true,\n\t\t\t\tbody: \"Are you sure you wish to cancel the upload of this item?\"\n\t\t\t});\n\n\t\t\tmodal.on(\"button:ok\", function () {\n\t\t\t\t_this.model.collection.remove(_this.model);\n\t\t\t});\n\n\t\t\tmodal.show();\n\t\t} else {\n\t\t\tthis.model.collection.remove(this.model);\n\t\t}\n\t}\n});\n\nmodule.exports = Backbone.Marionette.CompositeView.extend({\n\ttemplate: require(\"../templates/upload-list.nunj\"),\n\n\tchildView: Item,\n\n\tui: {\n\t\toptions: \".options\",\n\t\theading: \".heading\",\n\n\t\thidden: \".hidden\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.options\": \"showOptions\",\n\t\t\"click @ui.hidden\": \"unhideAll\"\n\t},\n\n\tmodelEvents: {\n\t\t\"change:collapsed change:viewType\": \"render\"\n\t},\n\n\tcollectionEvents: {\n\t\t\"change:reviewed change:parsing\": \"changed\"\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this2 = this;\n\n\t\treturn {\n\t\t\tfilterNames: function filterNames() {\n\t\t\t\tvar str = \"\";\n\t\t\t\tif (_this2.model.get(\"unreviewed\")) str += \"Unreviewed\";\n\t\t\t\tif (str && _this2.model.get(\"queued\")) str += \" and queued\";\n\t\t\t\tif (!str && _this2.model.get(\"queued\")) str += \"Queued\";\n\t\t\t\tif (str) str += \" items\";\n\n\t\t\t\tif (!str) str = \"[ no filters selected ]\";\n\n\t\t\t\treturn str;\n\t\t\t}\n\t\t};\n\t},\n\n\tinitialize: function initialize() {\n\t\tvar _this3 = this;\n\n\t\tthis.model = new Backbone.Model({\n\t\t\tunreviewed: true,\n\t\t\tqueued: true,\n\t\t\tviewType: \"standard\",\n\t\t\tcollapsed: true\n\t\t});\n\n\t\tthis.bindEvents(this.model, this.modelEvents);\n\n\t\tthis.originalCollection = this.collection;\n\t\tthis.collection = new Backbone.VirtualCollection(this.collection);\n\n\t\tthis.collection.updateFilter(function (x) {\n\t\t\treturn _this3.model.get(\"unreviewed\") && !x.get(\"reviewed\") || _this3.model.get(\"queued\") && x.get(\"reviewed\");\n\t\t});\n\n\t\tthis.bindEvents(this.collection, this.collectionEvents);\n\t},\n\n\tserializeData: function serializeData() {\n\t\treturn {\n\t\t\tmodel: this.model.toJSON(),\n\t\t\tfilteredItems: this.collection.length,\n\t\t\ttotalItems: this.originalCollection.length\n\t\t};\n\t},\n\n\tstandardView: function standardView() {\n\t\tthis.model.set({ viewType: \"standard\" });\n\n\t\tthis.changed();\n\t},\n\n\terrorView: function errorView() {\n\t\tthis.model.set({ viewType: \"error\" });\n\n\t\tthis.changed();\n\t},\n\n\texpand: function expand() {\n\t\tthis.model.set({ collapsed: false });\n\t},\n\n\tcollapse: function collapse() {\n\t\tif (!this.model.get(\"collapsed\")) this.model.set({ collapsed: true });\n\t},\n\n\tonRender: function onRender() {\n\t\tthis.$el.removeClass(\"error standard\").addClass(this.model.get(\"viewType\"));\n\n\t\tif (this.model.get(\"collapsed\")) this.$el.addClass(\"collapsed\");else this.$el.removeClass(\"collapsed\");\n\t},\n\n\tshowOptions: function showOptions(evt) {\n\t\tevt.stopPropagation();\n\n\t\tvar menu = new SimpleMenu({\n\t\t\tanchor: this.ui.options,\n\t\t\tside: \"right\",\n\t\t\tstructure: [{ type: \"choose-many\", name: \"filters\", elements: [{ text: \"Show unreviewed items\", id: \"unreviewed\", selected: this.model.get(\"unreviewed\") }, { text: \"Show queued items\", id: \"queued\", selected: this.model.get(\"queued\") }] }]\n\t\t});\n\n\t\tmenu.show();\n\n\t\tthis.listenTo(menu, \"clicked\", this.toggleOption.bind(this));\n\t},\n\n\tunhideAll: function unhideAll() {\n\t\tthis.model.set({ unreviewed: true, queued: true });\n\t\tthis.changed();\n\t},\n\n\tchanged: function changed() {\n\t\tvar _this4 = this;\n\n\t\tthis.collection.updateFilter(function (x) {\n\t\t\treturn _this4.model.get(\"unreviewed\") && !x.get(\"reviewed\") || _this4.model.get(\"queued\") && x.get(\"reviewed\");\n\t\t});\n\t\tthis.render();\n\t},\n\n\ttoggleOption: function toggleOption(name, enabled) {\n\t\tthis.model.set(name.id, enabled);\n\n\t\tthis.changed();\n\t},\n\n\tunselectAll: function unselectAll() {\n\t\tthis.collection.each(function (x) {\n\t\t\treturn x.set({ active: false });\n\t\t});\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInVwbG9hZExpc3QuanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwiU2ltcGxlTWVudSIsIlNtYWxsTW9kYWwiLCJQYWdlIiwiSXRlbSIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiZXh0ZW5kIiwiY2xhc3NOYW1lIiwidGVtcGxhdGUiLCJ1aSIsInJlbW92ZXIiLCJldmVudHMiLCJjbGljayIsIm1vZGVsRXZlbnRzIiwiY2hhbmdlIiwiaW5pdGlhbGl6ZSIsImxpc3RlblRvIiwiRXZlbnRzIiwiVXBsb2FkSXRlbUNsaWNrIiwidG9nZ2xlVGFnZ2VkU3RhdHVzIiwiYmluZCIsIm9uUmVuZGVyIiwibW9kZWwiLCJnZXQiLCIkZWwiLCJhZGRDbGFzcyIsImlkIiwidW5zZXQiLCJyZW1vdmVDbGFzcyIsInNldEFjdGl2ZSIsImNsaWNrZWQiLCJ0cmlnZ2VyIiwic2V0IiwiYWN0aXZlIiwiY2xvc2UiLCJldnQiLCJzdG9wUHJvcGFnYXRpb24iLCJtb2RhbCIsInRpdGxlIiwid2FybiIsImJvZHkiLCJvbiIsImNvbGxlY3Rpb24iLCJyZW1vdmUiLCJzaG93IiwibW9kdWxlIiwiZXhwb3J0cyIsIkNvbXBvc2l0ZVZpZXciLCJjaGlsZFZpZXciLCJvcHRpb25zIiwiaGVhZGluZyIsImhpZGRlbiIsImNvbGxlY3Rpb25FdmVudHMiLCJ0ZW1wbGF0ZUNvbnRleHQiLCJmaWx0ZXJOYW1lcyIsInN0ciIsIk1vZGVsIiwidW5yZXZpZXdlZCIsInF1ZXVlZCIsInZpZXdUeXBlIiwiY29sbGFwc2VkIiwiYmluZEV2ZW50cyIsIm9yaWdpbmFsQ29sbGVjdGlvbiIsIlZpcnR1YWxDb2xsZWN0aW9uIiwidXBkYXRlRmlsdGVyIiwieCIsInNlcmlhbGl6ZURhdGEiLCJ0b0pTT04iLCJmaWx0ZXJlZEl0ZW1zIiwibGVuZ3RoIiwidG90YWxJdGVtcyIsInN0YW5kYXJkVmlldyIsImNoYW5nZWQiLCJlcnJvclZpZXciLCJleHBhbmQiLCJjb2xsYXBzZSIsInNob3dPcHRpb25zIiwibWVudSIsImFuY2hvciIsInNpZGUiLCJzdHJ1Y3R1cmUiLCJ0eXBlIiwibmFtZSIsImVsZW1lbnRzIiwidGV4dCIsInNlbGVjdGVkIiwidG9nZ2xlT3B0aW9uIiwidW5oaWRlQWxsIiwicmVuZGVyIiwiZW5hYmxlZCIsInVuc2VsZWN0QWxsIiwiZWFjaCJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCOztBQUVBLElBQU1DLGFBQWFELFFBQVEsc0JBQVIsQ0FBbkI7QUFDQSxJQUFNRSxhQUFhRixRQUFRLHNCQUFSLENBQW5COztBQUVBLElBQU1HLE9BQU9ILFFBQVEsV0FBUixDQUFiOztBQUVBLElBQU1JLE9BQU9MLFNBQVNNLFVBQVQsQ0FBb0JDLElBQXBCLENBQXlCQyxNQUF6QixDQUFnQztBQUM1Q0MsWUFBVyxhQURpQzs7QUFHNUNDLFdBQVVULFFBQVEsK0JBQVIsQ0FIa0M7O0FBSzVDVSxLQUFJO0FBQ0hDLFdBQVM7QUFETixFQUx3Qzs7QUFTNUNDLFNBQVE7QUFDUEMsU0FBTyxTQURBO0FBRVAsdUJBQXFCO0FBRmQsRUFUb0M7O0FBYzVDQyxjQUFhO0FBQ1osbUJBQWlCLFdBREw7QUFFWkMsVUFBUTtBQUZJLEVBZCtCOztBQW1CNUNDLGFBQVksc0JBQVc7QUFDdEIsT0FBS0MsUUFBTCxDQUFjZCxJQUFkLEVBQW9CQSxLQUFLZSxNQUFMLENBQVlDLGVBQWhDLEVBQWlELEtBQUtDLGtCQUFMLENBQXdCQyxJQUF4QixDQUE2QixJQUE3QixDQUFqRDtBQUNBLEVBckIyQzs7QUF1QjVDQyxXQUFVLG9CQUFXO0FBQ3BCLE1BQUksS0FBS0MsS0FBTCxDQUFXQyxHQUFYLENBQWUsUUFBZixDQUFKLEVBQ0MsS0FBS0MsR0FBTCxDQUFTQyxRQUFULENBQWtCLFFBQWxCO0FBQ0QsRUExQjJDOztBQTRCNUNOLHFCQUFvQiw0QkFBU0csS0FBVCxFQUFnQjtBQUNuQyxNQUFJQSxNQUFNSSxFQUFOLEtBQWEsS0FBS0osS0FBTCxDQUFXSSxFQUE1QixFQUNDOztB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QixJQUF2QixDQUEvQjtBQUNBLEVBdkh3RDs7QUF5SHpEbUUsWUFBVyxxQkFBVztBQUNyQixPQUFLakUsS0FBTCxDQUFXVSxHQUFYLENBQWUsRUFBRXlCLFlBQVksSUFBZCxFQUFvQkMsUUFBUSxJQUE1QixFQUFmO0FBQ0EsT0FBS2MsT0FBTDtBQUNBLEVBNUh3RDs7QUE4SHpEQSxVQUFTLG1CQUFXO0FBQUE7O0FBQ25CLE9BQUs5QixVQUFMLENBQWdCc0IsWUFBaEIsQ0FBNkI7QUFBQSxVQUFLLE9BQUsxQyxLQUFMLENBQVdDLEdBQVgsQ0FBZSxZQUFmLEtBQWdDLENBQUMwQyxFQUFFMUMsR0FBRixDQUFNLFVBQU4sQ0FBakMsSUFBc0QsT0FBS0QsS0FBTCxDQUFXQyxHQUFYLENBQWUsUUFBZixLQUE0QjBDLEVBQUUxQyxHQUFGLENBQU0sVUFBTixDQUF2RjtBQUFBLEdBQTdCO0FBQ0EsT0FBS2lFLE1BQUw7QUFDQSxFQWpJd0Q7O0FBbUl6REYsZUFBYyxzQkFBU0osSUFBVCxFQUFlTyxPQUFmLEVBQXdCO0FBQ3JDLE9BQUtuRSxLQUFMLENBQVdVLEdBQVgsQ0FBZWtELEtBQUt4RCxFQUFwQixFQUF3QitELE9BQXhCOztBQUVBLE9BQUtqQixPQUFMO0FBQ0EsRUF2SXdEOztBQXlJekRrQixjQUFhLHVCQUFXO0FBQ3ZCLE9BQUtoRCxVQUFMLENBQWdCaUQsSUFBaEIsQ0FBcUI7QUFBQSxVQUFLMUIsRUFBRWpDLEdBQUYsQ0FBTSxFQUFFQyxRQUFRLEtBQVYsRUFBTixDQUFMO0FBQUEsR0FBckI7QUFDQTtBQTNJd0QsQ0FBekMsQ0FBakIiLCJmaWxlIjoidXBsb2FkTGlzdC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5cbmNvbnN0IFNpbXBsZU1lbnUgPSByZXF1aXJlKFwiLi4vLi4vbGliL3NpbXBsZU1lbnVcIik7XG5jb25zdCBTbWFsbE1vZGFsID0gcmVxdWlyZShcIi4uLy4uL2xpYi9zbWFsbE1vZGFsXCIpO1xuXG5jb25zdCBQYWdlID0gcmVxdWlyZShcIi4vcGFnZUJ1c1wiKTtcblxuY29uc3QgSXRlbSA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwidXBsb2FkLWl0ZW1cIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy91cGxvYWQtaXRlbS5udW5qXCIpLFxuXG5cdHVpOiB7XG5cdFx0cmVtb3ZlcjogXCIucmVtb3ZlclwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdGNsaWNrOiBcImNsaWNrZWRcIixcblx0XHRcImNsaWNrIEB1aS5yZW1vdmVyXCI6IFwiY2xvc2VcIixcblx0fSxcblxuXHRtb2RlbEV2ZW50czoge1xuXHRcdFwiY2hhbmdlOmFjdGl2ZVwiOiBcInNldEFjdGl2ZVwiLFxuXHRcdGNoYW5nZTogXCJyZW5kZXJcIixcblx0fSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmxpc3RlblRvKFBhZ2UsIFBhZ2UuRXZlbnRzLlVwbG9hZEl0ZW1DbGljaywgdGhpcy50b2dnbGVUYWdnZWRTdGF0dXMuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0b25SZW5kZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLm1vZGVsLmdldChcImFjdGl2ZVwiKSlcblx0XHRcdHRoaXMuJGVsLmFkZENsYXNzKFwiYWN0aXZlXCIpO1xuXHR9LFxuXG5cdHRvZ2dsZVRhZ2dlZFN0YXR1czogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRpZiAobW9kZWwuaWQgPT09IHRoaXMubW9kZWwuaWQpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLm1vZGVsLnVuc2V0KFwiYWN0aXZlXCIpO1xuXHRcdHRoaXMuJGVsLnJlbW92ZUNsYXNzKFwiYWN0aXZlXCIpO1xuXHR9LFxuXG5cdHNldEFjdGl2ZTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwiYWN0aXZlXCIpKVxuXHRcdFx0dGhpcy4kZWwuYWRkQ2xhc3MoXCJhY3RpdmVcIik7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy4kZWwucmVtb3ZlQ2xhc3MoXCJhY3RpdmVcIik7XG5cdH0sXG5cblx0Y2xpY2tlZDogZnVuY3Rpb24oKSB7XG5cdFx0UGFnZS50cmlnZ2VyKFBhZ2UuRXZlbnRzLlVwbG9hZEl0ZW1DbGljaywgdGhpcy5tb2RlbCk7XG5cblx0XHR0aGlzLm1vZGVsLnNldCh7IGFjdGl2ZTogdHJ1ZSB9KTtcblx0fSxcblxuXHRjbG9zZTogZnVuY3Rpb24oZXZ0KSB7XG5cdFx0aWYgKGV2dC5zdG9wUHJvcGFnYXRpb24pXG5cdFx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRpZiAodGhpcy5tb2RlbC5nZXQoXCJ1cGxvYWRpbmdcIikpIHtcblx0XHRcdC8vIFdhcm4gdGhlIHVzZXIgZmlyc3Rcblx0XHRcdGNvbnN0IG1vZGFsID0gbmV3IFNtYWxsTW9kYWwoe1xuXHRcdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmEgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUnLz4gQ2FuY2VsIFVwbG9hZFwiLFxuXHRcdFx0XHR3YXJuOiB0cnVlLFxuXHRcdFx0XHRib2R5OiBcIkFyZSB5b3Ugc3VyZSB5b3Ugd2lzaCB0byBjYW5jZWwgdGhlIHVwbG9hZCBvZiB0aGlzIGl0ZW0/XCIsXG5cdFx0XHR9KTtcblxuXHRcdFx0bW9kYWwub24oXCJidXR0b246b2tcIiwgKCkgPT4ge1xuXHRcdFx0XHR0aGlzLm1vZGVsLmNvbGxlY3Rpb24ucmVtb3ZlKHRoaXMubW9kZWwpO1xuXHRcdFx0fSk7XG5cblx0XHRcdG1vZGFsLnNob3coKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHR0aGlzLm1vZGVsLmNvbGxlY3Rpb24ucmVtb3ZlKHRoaXMubW9kZWwpO1xuXHRcdH1cblx0fSxcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhY2tib25lLk1hcmlvbmV0dGUuQ29tcG9zaXRlVmlldy5leHRlbmQoe1xuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy91cGxvYWQtbGlzdC5udW5qXCIpLFxuXG5cdGNoaWxkVmlldzogSXRlbSxcblxuXHR1aToge1xuXHRcdG9wdGlvbnM6IFwiLm9wdGlvbnNcIixcblx0XHRoZWFkaW5nOiBcIi5oZWFkaW5nXCIsXG5cblx0XHRoaWRkZW46IFwiLmhpZGRlblwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLm9wdGlvbnNcIjogXCJzaG93T3B0aW9uc1wiLFxuXHRcdFwiY2xpY2sgQHVpLmhpZGRlblwiOiBcInVuaGlkZUFsbFwiLFxuXHR9LFxuXG5cdG1vZGVsRXZlbnRzOiB7XG5cdFx0XCJjaGFuZ2U6Y29sbGFwc2VkIGNoYW5nZTp2aWV3VHlwZVwiOiBcInJlbmRlclwiLFxuXHR9LFxuXG5cdGNvbGxlY3Rpb25FdmVudHM6IHtcblx0XHRcImNoYW5nZTpyZXZpZXdlZCBjaGFuZ2U6cGFyc2luZ1wiOiBcImNoYW5nZWRcIixcblx0fSxcblxuXHR0ZW1wbGF0ZUNvbnRleHQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRmaWx0ZXJOYW1lczogKCkgPT4ge1xuXHRcdFx0XHRsZXQgc3RyID0gXCJcIjtcblx0XHRcdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwidW5yZXZpZXdlZFwiKSlcblx0XHRcdFx0XHRzdHIgKz0gXCJVbnJldmlld2VkXCI7XG5cdFx0XHRcdGlmIChzdHIgJiYgdGhpcy5tb2RlbC5nZXQoXCJxdWV1ZWRcIikpXG5cdFx0XHRcdFx0c3RyICs9IFwiIGFuZCBxdWV1ZWRcIjtcblx0XHRcdFx0aWYgKCFzdHIgJiYgdGhpcy5tb2RlbC5nZXQoXCJxdWV1ZWRcIikpXG5cdFx0XHRcdFx0c3RyICs9IFwiUXVldWVkXCI7XG5cdFx0XHRcdGlmIChzdHIpXG5cdFx0XHRcdFx0c3RyICs9IFwiIGl0ZW1zXCI7XG5cblx0XHRcdFx0aWYgKCFzdHIpXG5cdFx0XHRcdFx0c3RyID0gXCJbIG5vIGZpbHRlcnMgc2VsZWN0ZWQgXVwiO1xuXG5cdFx0XHRcdHJldHVybiBzdHI7XG5cdFx0XHR9LFxuXHRcdH07XG5cdH0sXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5tb2RlbCA9IG5ldyBCYWNrYm9uZS5Nb2RlbCh7XG5cdFx0XHR1bnJldmlld2VkOiB0cnVlLFxuXHRcdFx0cXVldWVkOiB0cnVlLFxuXHRcdFx0dmlld1R5cGU6IFwic3RhbmRhcmRcIixcblx0XHRcdGNvbGxhcHNlZDogdHJ1ZSxcblx0XHR9KTtcblxuXHRcdHRoaXMuYmluZEV2ZW50cyh0aGlzLm1vZGVsLCB0aGlzLm1vZGVsRXZlbnRzKTtcblxuXHRcdHRoaXMub3JpZ2luYWxDb2xsZWN0aW9uID0gdGhpcy5jb2xsZWN0aW9uO1xuXHRcdHRoaXMuY29sbGVjdGlvbiA9IG5ldyBCYWNrYm9uZS5WaXJ0dWFsQ29sbGVjdGlvbih0aGlzLmNvbGxlY3Rpb24pO1xuXG5cdFx0dGhpcy5jb2xsZWN0aW9uLnVwZGF0ZUZpbHRlcih4ID0+IHRoaXMubW9kZWwuZ2V0KFwidW5yZXZpZXdlZFwiKSAmJiAheC5nZXQoXCJyZXZpZXdlZFwiKSB8fCB0aGlzLm1vZGVsLmdldChcInF1ZXVlZFwiKSAmJiB4LmdldChcInJldmlld2VkXCIpKTtcblxuXHRcdHRoaXMuYmluZEV2ZW50cyh0aGlzLmNvbGxlY3Rpb24sIHRoaXMuY29sbGVjdGlvbkV2ZW50cyk7XG5cdH0sXG5cblx0c2VyaWFsaXplRGF0YTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG1vZGVsOiB0aGlzLm1vZGVsLnRvSlNPTigpLFxuXHRcdFx0ZmlsdGVyZWRJdGVtczogdGhpcy5jb2xsZWN0aW9uLmxlbmd0aCxcblx0XHRcdHRvdGFsSXRlbXM6IHRoaXMub3JpZ2luYWxDb2xsZWN0aW9uLmxlbmd0aCxcblx0XHR9O1xuXHR9LFxuXG5cdHN0YW5kYXJkVmlldzogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5tb2RlbC5zZXQoeyB2aWV3VHlwZTogXCJzdGFuZGFyZFwiIH0pO1xuXG5cdFx0dGhpcy5jaGFuZ2VkKCk7XG5cdH0sXG5cblx0ZXJyb3JWaWV3OiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLm1vZGVsLnNldCh7IHZpZXdUeXBlOiBcImVycm9yXCIgfSk7XG5cblx0XHR0aGlzLmNoYW5nZWQoKTtcblx0fSxcblxuXHRleHBhbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMubW9kZWwuc2V0KHsgY29sbGFwc2VkOiBmYWxzZSB9KTtcblx0fSxcblxuXHRjb2xsYXBzZTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLm1vZGVsLmdldChcImNvbGxhcHNlZFwiKSlcblx0XHRcdHRoaXMubW9kZWwuc2V0KHsgY29sbGFwc2VkOiB0cnVlIH0pO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLiRlbC5yZW1vdmVDbGFzcyhcImVycm9yIHN0YW5kYXJkXCIpLmFkZENsYXNzKHRoaXMubW9kZWwuZ2V0KFwidmlld1R5cGVcIikpO1xuXG5cdFx0aWYgKHRoaXMubW9kZWwuZ2V0KFwiY29sbGFwc2VkXCIpKVxuXHRcdFx0dGhpcy4kZWwuYWRkQ2xhc3MoXCJjb2xsYXBzZWRcIik7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy4kZWwucmVtb3ZlQ2xhc3MoXCJjb2xsYXBzZWRcIik7XG5cdH0sXG5cblx0c2hvd09wdGlvbnM6IGZ1bmN0aW9uKGV2dCkge1xuXHRcdGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcblxuXHRcdGNvbnN0IG1lbnUgPSBuZXcgU2ltcGxlTWVudSh7XG5cdFx0XHRhbmNob3I6IHRoaXMudWkub3B0aW9ucyxcblx0XHRcdHNpZGU6IFwicmlnaHRcIixcblx0XHRcdHN0cnVjdHVyZTogW1xuXHRcdFx0XHR7IHR5cGU6IFwiY2hvb3NlLW1hbnlcIiwgbmFtZTogXCJmaWx0ZXJzXCIsIGVsZW1lbnRzOiBbXG5cdFx0XHRcdFx0eyB0ZXh0OiBcIlNob3cgdW5yZXZpZXdlZCBpdGVtc1wiLCBpZDogXCJ1bnJldmlld2VkXCIsIHNlbGVjdGVkOiB0aGlzLm1vZGVsLmdldChcInVucmV2aWV3ZWRcIikgfSxcblx0XHRcdFx0XHR7IHRleHQ6IFwiU2hvdyBxdWV1ZWQgaXRlbXNcIiwgaWQ6IFwicXVldWVkXCIsIHNlbGVjdGVkOiB0aGlzLm1vZGVsLmdldChcInF1ZXVlZFwiKSB9LFxuXHRcdFx0XHRdIH0sXG5cdFx0XHRdLFxuXHRcdH0pO1xuXG5cdFx0bWVudS5zaG93KCk7XG5cblx0XHR0aGlzLmxpc3RlblRvKG1lbnUsIFwiY2xpY2tlZFwiLCB0aGlzLnRvZ2dsZU9wdGlvbi5iaW5kKHRoaXMpKTtcblx0fSxcblxuXHR1bmhpZGVBbGw6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMubW9kZWwuc2V0KHsgdW5yZXZpZXdlZDogdHJ1ZSwgcXVldWVkOiB0cnVlIH0pO1xuXHRcdHRoaXMuY2hhbmdlZCgpO1xuXHR9LFxuXG5cdGNoYW5nZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY29sbGVjdGlvbi51cGRhdGVGaWx0ZXIoeCA9PiB0aGlzLm1vZGVsLmdldChcInVucmV2aWV3ZWRcIikgJiYgIXguZ2V0KFwicmV2aWV3ZWRcIikgfHwgdGhpcy5tb2RlbC5nZXQoXCJxdWV1ZWRcIikgJiYgeC5nZXQoXCJyZXZpZXdlZFwiKSk7XG5cdFx0dGhpcy5yZW5kZXIoKTtcblx0fSxcblxuXHR0b2dnbGVPcHRpb246IGZ1bmN0aW9uKG5hbWUsIGVuYWJsZWQpIHtcblx0XHR0aGlzLm1vZGVsLnNldChuYW1lLmlkLCBlbmFibGVkKTtcblxuXHRcdHRoaXMuY2hhbmdlZCgpO1xuXHR9LFxuXG5cdHVuc2VsZWN0QWxsOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmNvbGxlY3Rpb24uZWFjaCh4ID0+IHguc2V0KHsgYWN0aXZlOiBmYWxzZSB9KSk7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar _regenerator = require(\"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\nvar Backbone = require(\"backbone\");\nvar _ = require(\"lodash\");\nvar $ = require(\"jquery\");\n\nvar settings = require(\"app-settings\");\n\nmodule.exports = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"id\",\n\n\turlRoot: function urlRoot() {\n\t\tswitch (this.get(\"type\")) {\n\t\t\tcase \"csv\":\n\t\t\t\treturn settings.urlRoot + \"/api/1.0/imports\";\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"Cannot determine URL for unknown type\");\n\t\t}\n\t},\n\n\tdefaults: {\n\t\tparsing: false,\n\t\tparsed: false,\n\t\treviewed: false,\n\t\tuploading: false,\n\t\tuploaded: false,\n\t\terror: null,\n\t\tstate: \"Awaiting processing...\"\n\t},\n\n\tcomputeds: {\n\t\ttype: function type() {\n\t\t\tswitch ((this.get(\"baseFormat\") || \"\").toLowerCase()) {\n\t\t\t\tcase \"csv\":\n\t\t\t\t\treturn \"csv\";\n\t\t\t\tdefault:\n\t\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\t},\n\n\tisNew: _.constant(true),\n\n\tupload: function upload(options, cb) {\n\t\tswitch (this.get(\"type\")) {\n\t\t\tcase \"csv\":\n\t\t\t\treturn this.uploadCsv(options, cb);\n\t\t\tdefault:\n\t\t\t\treturn cb(new Error(\"Unable to upload unknown type\"));\n\t\t}\n\t},\n\n\tuploadCsv: function () {\n\t\tvar _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee(options, cb) {\n\t\t\tvar _this = this;\n\n\t\t\treturn _regenerator2.default.wrap(function _callee$(_context) {\n\t\t\t\twhile (1) {\n\t\t\t\t\tswitch (_context.prev = _context.next) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tthis.set({ state: \"Uploading\" });\n\n\t\t\t\t\t\t\t$.ajax({\n\t\t\t\t\t\t\t\t/*xhr: function() {\n        \tconst xhr = new window.XMLHttpRequest();\n        \txhr.upload.addEventListener(\"progress\", evt => {\n        \t\tif (evt.lengthComputable) {\n        \t\t\t//const percentComplete = evt.loaded / evt.total;\n        \t\t\t//Do something with upload progress here\n        \t\t}\n        \t}, false);\n        \t\treturn xhr;\n        },*/\n\t\t\t\t\t\t\t\ttype: \"POST\",\n\t\t\t\t\t\t\t\turl: settings.urlRoot + \"/api/1.0/imports\",\n\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\tdataSet: [{\n\t\t\t\t\t\t\t\t\t\tcompressed: true,\n\t\t\t\t\t\t\t\t\t\tdata: this.get(\"csvData\")\n\t\t\t\t\t\t\t\t\t}]\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tsuccess: function success() {\n\t\t\t\t\t\t\t\t\t_this.set({ state: \"Uploaded\", uploaded: true });\n\t\t\t\t\t\t\t\t\t_this.trigger(\"upload:complete\");\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\terror: function error(e) {\n\t\t\t\t\t\t\t\t\t_this.trigger(\"error\", _this, e);\n\t\t\t\t\t\t\t\t\tcb(e);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\treturn _context.stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, _callee, this);\n\t\t}));\n\n\t\tfunction uploadCsv(_x, _x2) {\n\t\t\treturn _ref.apply(this, arguments);\n\t\t}\n\n\t\treturn uploadCsv;\n\t}(),\n\n\tvalidate: function validate(attrs) {\n\t\tswitch (this.get(\"type\")) {\n\t\t\tcase \"metadata\":\n\t\t\t\treturn this.validateMetadata(attrs);\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"Cannot validate unknown type\");\n\t\t}\n\t},\n\n\tvalidateMetadata: function validateMetadata(attrs) {\n\t\tif (attrs.warnings > 0) return attrs.warnings;\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInVwbG9hZE1vZGVsLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIl8iLCIkIiwic2V0dGluZ3MiLCJtb2R1bGUiLCJleHBvcnRzIiwiRXBveHkiLCJNb2RlbCIsImV4dGVuZCIsImlkQXR0cmlidXRlIiwidXJsUm9vdCIsImdldCIsIkVycm9yIiwiZGVmYXVsdHMiLCJwYXJzaW5nIiwicGFyc2VkIiwicmV2aWV3ZWQiLCJ1cGxvYWRpbmciLCJ1cGxvYWRlZCIsImVycm9yIiwic3RhdGUiLCJjb21wdXRlZHMiLCJ0eXBlIiwidG9Mb3dlckNhc2UiLCJpc05ldyIsImNvbnN0YW50IiwidXBsb2FkIiwib3B0aW9ucyIsImNiIiwidXBsb2FkQ3N2Iiwic2V0IiwiYWpheCIsInVybCIsImRhdGEiLCJkYXRhU2V0IiwiY29tcHJlc3NlZCIsInN1Y2Nlc3MiLCJ0cmlnZ2VyIiwiZSIsInZhbGlkYXRlIiwiYXR0cnMiLCJ2YWxpZGF0ZU1ldGFkYXRhIiwid2FybmluZ3MiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUMsSUFBSUQsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNRSxJQUFJRixRQUFRLFFBQVIsQ0FBVjs7QUFFQSxJQUFNRyxXQUFXSCxRQUFRLGNBQVIsQ0FBakI7O0FBRUFJLE9BQU9DLE9BQVAsR0FBaUJOLFNBQVNPLEtBQVQsQ0FBZUMsS0FBZixDQUFxQkMsTUFBckIsQ0FBNEI7QUFDNUNDLGNBQWEsSUFEK0I7O0FBRzVDQyxVQUFTLG1CQUFXO0FBQ25CLFVBQVEsS0FBS0MsR0FBTCxDQUFTLE1BQVQsQ0FBUjtBQUNDLFFBQUssS0FBTDtBQUNDLFdBQU9SLFNBQVNPLE9BQVQsR0FBbUIsa0JBQTFCO0FBQ0Q7QUFDQyxVQUFNLElBQUlFLEtBQUosQ0FBVSx1Q0FBVixDQUFOO0FBSkY7QUFNQSxFQVYyQzs7QUFZNUNDLFdBQVU7QUFDVEMsV0FBUyxLQURBO0FBRVRDLFVBQVEsS0FGQztBQUdUQyxZQUFVLEtBSEQ7QUFJVEMsYUFBVyxLQUpGO0FBS1RDLFlBQVUsS0FMRDtBQU1UQyxTQUFPLElBTkU7QUFPVEMsU0FBTztBQVBFLEVBWmtDOztBQXNCNUNDLFlBQVc7QUFDVkMsUUFBTSxnQkFBVztBQUNoQixXQUFRLENBQUMsS0FBS1gsR0FBTCxDQUFTLFlBQVQsS0FBMEIsRUFBM0IsRUFBK0JZLFdBQS9CLEVBQVI7QUFDQyxTQUFLLEtBQUw7QUFDQyxZQUFPLEtBQVA7QUFDRDtBQUNDLFlBQU8sSUFBUDtBQUpGO0FBTUE7QUFSUyxFQXRCaUM7O0FBaUM1Q0MsUUFBT3ZCLEVBQUV3QixRQUFGLENBQVcsSUFBWCxDQWpDcUM7O0FBbUM1Q0MsU0FBUSxnQkFBU0MsT0FBVCxFQUFrQkMsRUFBbEIsRUFBc0I7QUFDN0IsVUFBUSxLQUFLakIsR0FBTCxDQUFTLE1BQVQsQ0FBUjtBQUNDLFFBQUssS0FBTDtBQUNDLFdBQU8sS0FBS2tCLFNBQUwsQ0FBZUYsT0FBZixFQUF3QkMsRUFBeEIsQ0FBUDtBQUNEO0FBQ0MsV0FBT0EsR0FBRyxJQUFJaEIsS0FBSixDQUFVLCtCQUFWLENBQUgsQ0FBUDtBQUpGO0FBTUEsRUExQzJDOztBQTRDNUNpQjtBQUFBLHdFQUFXLGlCQUFlRixPQUFmLEVBQXdCQyxFQUF4QjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ1YsWUFBS0UsR0FBTCxDQUFTLEVBQUVWLE9BQU8sV0FBVCxFQUFUOztBQUVBbEIsU0FBRTZCLElBQUYsQ0FBTztBQUNOOzs7Ozs7Ozs7O0FBV0FULGNBQU0sTUFaQTtBQWFOVSxhQUFLN0IsU0FBU08sT0FBVCxHQUFtQixrQkFibEI7QUFjTnVCLGNBQU07QUFDTEMsa0JBQVMsQ0FDUjtBQUNDQyxzQkFBWSxJQURiO0FBRUNGLGdCQUFNLEtBQUt0QixHQUFMLENBQVMsU0FBVDtBQUZQLFVBRFE7QUFESixTQWRBO0FBc0JOeUIsaUJBQVMsbUJBQU07QUFDZCxlQUFLTixHQUFMLENBQVMsRUFBRVYsT0FBTyxVQUFULEVBQXFCRixVQUFVLElBQS9CLEVBQVQ7QUFDQSxlQUFLbUIsT0FBTCxDQUFhLGlCQUFiO0FBQ0EsU0F6Qks7QUEwQk5sQixlQUFPLGtCQUFLO0FBQ1gsZUFBS2tCLE9BQUwsQ0FBYSxPQUFiLEVBQXNCLEtBQXRCLEVBQTRCQyxDQUE1QjtBQUNBVixZQUFHVSxDQUFIO0FBQ0E7QUE3QkssUUFBUDs7QUFIVTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxHQUFYOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLElBNUM0Qzs7QUFnRjVDQyxXQUFVLGtCQUFTQyxLQUFULEVBQWdCO0FBQ3pCLFVBQVEsS0FBSzdCLEdBQUwsQ0FBUyxNQUFULENBQVI7QUFDQyxRQUFLLFVBQUw7QUFDQyxXQUFPLEtBQUs4QixnQkFBTCxDQUFzQkQsS0FBdEIsQ0FBUDtBQUNEO0FBQ0MsVUFBTSxJQUFJNUIsS0FBSixDQUFVLDhCQUFWLENBQU47QUFKRjtBQU1BLEVBdkYyQzs7QUF5RjVDNkIsbUJBQWtCLDBCQUFTRCxLQUFULEVBQWdCO0FBQ2pDLE1BQUlBLE1BQU1FLFFBQU4sR0FBaUIsQ0FBckIsRUFDQyxPQUFPRixNQUFNRSxRQUFiO0FBQ0Q7QUE1RjJDLENBQTVCLENBQWpCIiwiZmlsZSI6InVwbG9hZE1vZGVsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5cbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5FcG94eS5Nb2RlbC5leHRlbmQoe1xuXHRpZEF0dHJpYnV0ZTogXCJpZFwiLFxuXG5cdHVybFJvb3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHN3aXRjaCAodGhpcy5nZXQoXCJ0eXBlXCIpKSB7XG5cdFx0XHRjYXNlIFwiY3N2XCI6XG5cdFx0XHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9pbXBvcnRzXCI7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZGV0ZXJtaW5lIFVSTCBmb3IgdW5rbm93biB0eXBlXCIpO1xuXHRcdH1cblx0fSxcblxuXHRkZWZhdWx0czoge1xuXHRcdHBhcnNpbmc6IGZhbHNlLFxuXHRcdHBhcnNlZDogZmFsc2UsXG5cdFx0cmV2aWV3ZWQ6IGZhbHNlLFxuXHRcdHVwbG9hZGluZzogZmFsc2UsXG5cdFx0dXBsb2FkZWQ6IGZhbHNlLFxuXHRcdGVycm9yOiBudWxsLFxuXHRcdHN0YXRlOiBcIkF3YWl0aW5nIHByb2Nlc3NpbmcuLi5cIixcblx0fSxcblxuXHRjb21wdXRlZHM6IHtcblx0XHR0eXBlOiBmdW5jdGlvbigpIHtcblx0XHRcdHN3aXRjaCAoKHRoaXMuZ2V0KFwiYmFzZUZvcm1hdFwiKSB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpKSB7XG5cdFx0XHRcdGNhc2UgXCJjc3ZcIjpcblx0XHRcdFx0XHRyZXR1cm4gXCJjc3ZcIjtcblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHR9LFxuXHR9LFxuXG5cdGlzTmV3OiBfLmNvbnN0YW50KHRydWUpLFxuXG5cdHVwbG9hZDogZnVuY3Rpb24ob3B0aW9ucywgY2IpIHtcblx0XHRzd2l0Y2ggKHRoaXMuZ2V0KFwidHlwZVwiKSkge1xuXHRcdFx0Y2FzZSBcImNzdlwiOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy51cGxvYWRDc3Yob3B0aW9ucywgY2IpO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGNiKG5ldyBFcnJvcihcIlVuYWJsZSB0byB1cGxvYWQgdW5rbm93biB0eXBlXCIpKTtcblx0XHR9XG5cdH0sXG5cblx0dXBsb2FkQ3N2OiBhc3luYyBmdW5jdGlvbihvcHRpb25zLCBjYikge1xuXHRcdHRoaXMuc2V0KHsgc3RhdGU6IFwiVXBsb2FkaW5nXCIgfSk7XG5cblx0XHQkLmFqYXgoe1xuXHRcdFx0Lyp4aHI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRjb25zdCB4aHIgPSBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7XG5cdFx0XHRcdHhoci51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcihcInByb2dyZXNzXCIsIGV2dCA9PiB7XG5cdFx0XHRcdFx0aWYgKGV2dC5sZW5ndGhDb21wdXRhYmxlKSB7XG5cdFx0XHRcdFx0XHQvL2NvbnN0IHBlcmNlbnRDb21wbGV0ZSA9IGV2dC5sb2FkZWQgLyBldnQudG90YWw7XG5cdFx0XHRcdFx0XHQvL0RvIHNvbWV0aGluZyB3aXRoIHVwbG9hZCBwcm9ncmVzcyBoZXJlXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LCBmYWxzZSk7XG5cblx0XHRcdFx0cmV0dXJuIHhocjtcblx0XHRcdH0sKi9cblx0XHRcdHR5cGU6IFwiUE9TVFwiLFxuXHRcdFx0dXJsOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9pbXBvcnRzXCIsXG5cdFx0XHRkYXRhOiB7XG5cdFx0XHRcdGRhdGFTZXQ6IFtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRjb21wcmVzc2VkOiB0cnVlLFxuXHRcdFx0XHRcdFx0ZGF0YTogdGhpcy5nZXQoXCJjc3ZEYXRhXCIpLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdF0sXG5cdFx0XHR9LFxuXHRcdFx0c3VjY2VzczogKCkgPT4ge1xuXHRcdFx0XHR0aGlzLnNldCh7IHN0YXRlOiBcIlVwbG9hZGVkXCIsIHVwbG9hZGVkOiB0cnVlIH0pO1xuXHRcdFx0XHR0aGlzLnRyaWdnZXIoXCJ1cGxvYWQ6Y29tcGxldGVcIik7XG5cdFx0XHR9LFxuXHRcdFx0ZXJyb3I6IGUgPT4ge1xuXHRcdFx0XHR0aGlzLnRyaWdnZXIoXCJlcnJvclwiLCB0aGlzLCBlKTtcblx0XHRcdFx0Y2IoZSk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9LFxuXG5cdHZhbGlkYXRlOiBmdW5jdGlvbihhdHRycykge1xuXHRcdHN3aXRjaCAodGhpcy5nZXQoXCJ0eXBlXCIpKSB7XG5cdFx0XHRjYXNlIFwibWV0YWRhdGFcIjpcblx0XHRcdFx0cmV0dXJuIHRoaXMudmFsaWRhdGVNZXRhZGF0YShhdHRycyk7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgdmFsaWRhdGUgdW5rbm93biB0eXBlXCIpO1xuXHRcdH1cblx0fSxcblxuXHR2YWxpZGF0ZU1ldGFkYXRhOiBmdW5jdGlvbihhdHRycykge1xuXHRcdGlmIChhdHRycy53YXJuaW5ncyA+IDApXG5cdFx0XHRyZXR1cm4gYXR0cnMud2FybmluZ3M7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar $ = require(\"jquery\");\n\nvar Grid = require(\"../../lib/grid\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"import-uploads\",\n\n\tui: {\n\t\theaderCounter: \"#header-counter\",\n\t\tfilterBar: \".ops-bar .filters\",\n\t\tcounterBar: \".ops-bar .counter\",\n\t\tgrid: \"div.grid\",\n\n\t\tretry: \"button.retry\"\n\t},\n\n\tcollectionEvents: {\n\t\tadd: \"modelAdd\",\n\t\tchange: \"modelChange\",\n\t\tremove: \"modelRemove\",\n\t\tsync: \"updateCounter\"\n\t},\n\n\titemEvents: {\n\t\t//\"sync reset\": \"updateCounter\",\n\t\t\"row:customclick\": \"retry\"\n\t},\n\n\ttemplate: require(\"../templates/uploads.nunj\"),\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tif (this.grid) this.grid.destroy();\n\t},\n\n\tupdateCounter: function updateCounter() {\n\t\tif (!this.items) {\n\t\t\tthis.ui.headerCounter.text(\"0\");\n\t\t\treturn;\n\t\t}\n\t\tvar pageStart = (this.items.state.currentPage - 1) * this.items.state.pageSize + 1;\n\t\tvar pageEnd = this.items.state.currentPage * this.items.state.pageSize;\n\t\tif (pageEnd > this.items.state.totalRecords) pageEnd = this.items.state.totalRecords;\n\n\t\tvar text = \"Uploads queue \" + (this.items.state.totalRecords === 0 ? 0 : pageStart) + \" - \" + pageEnd + \" of \" + (this.items.state.totalRecords || 0).toLocaleString();\n\t\tif (this.items.state.totalRecords === null) text = \"No items queued for upload\";\n\n\t\tthis.ui.headerCounter.text(this.items.state.totalRecords);\n\n\t\tthis.ui.counterBar.text(text);\n\t},\n\n\tonAttach: function onAttach() {\n\t\tvar columns = [{ name: \"filename\", label: \"File name\", cell: \"string\", editable: false }, { name: \"state\", label: \"State\", cell: \"string\", editable: false }, { name: \"\", label: \"\", cell: \"string\", editable: false }, { name: \"\", label: \"\", cell: \"string\", editable: false }];\n\n\t\tthis.grid = new Grid({ el: this.ui.grid, columns: columns, collection: this.collection, pageSize: 15, noLoad: true });\n\n\t\tthis.collection.run = true;\n\n\t\tthis.items = this.grid.collection;\n\n\t\tthis.bindEvents(this.items, this.itemEvents);\n\n\t\tthis.ui.filterBar.prepend(this.grid.filter({\n\t\t\tfilterContainer: this.ui.filterBar,\n\t\t\tfilters: [],\n\t\t\tdefaultFilters: []\n\t\t}).render().el);\n\n\t\t$(\".paging\", this.el).append(this.grid.paging().render().el);\n\n\t\tthis.updateCounter();\n\t},\n\n\tmodelAdd: function modelAdd(model) {\n\t\tthis.items.fullCollection.add(model);\n\n\t\tthis.updateCounter();\n\t},\n\n\tmodelChange: function modelChange(model) {\n\t\tif (model.get(\"ignore\")) return this.items.fullCollection.remove(model);\n\n\t\t//this.items.fullCollection.set(model);\n\t\tthis.updateCounter();\n\t},\n\n\tmodelRemove: function modelRemove(model) {\n\t\tif (!this.items) return;\n\t\tthis.items.fullCollection.remove(model);\n\t\tthis.updateCounter();\n\t},\n\n\tretry: function retry(model, evt) {\n\t\tvar el = $(evt.target);\n\t\tvar retry = el.hasClass(\"retry\");\n\t\tvar ignore = el.hasClass(\"ignore\");\n\t\tmodel.save({ queued: retry, ignore: ignore, pending: true, failed: null, state: 0 });\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInVwbG9hZHMuanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwiJCIsIkdyaWQiLCJtb2R1bGUiLCJleHBvcnRzIiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJleHRlbmQiLCJjbGFzc05hbWUiLCJ1aSIsImhlYWRlckNvdW50ZXIiLCJmaWx0ZXJCYXIiLCJjb3VudGVyQmFyIiwiZ3JpZCIsInJldHJ5IiwiY29sbGVjdGlvbkV2ZW50cyIsImFkZCIsImNoYW5nZSIsInJlbW92ZSIsInN5bmMiLCJpdGVtRXZlbnRzIiwidGVtcGxhdGUiLCJvbkJlZm9yZURlc3Ryb3kiLCJkZXN0cm95IiwidXBkYXRlQ291bnRlciIsIml0ZW1zIiwidGV4dCIsInBhZ2VTdGFydCIsInN0YXRlIiwiY3VycmVudFBhZ2UiLCJwYWdlU2l6ZSIsInBhZ2VFbmQiLCJ0b3RhbFJlY29yZHMiLCJ0b0xvY2FsZVN0cmluZyIsIm9uQXR0YWNoIiwiY29sdW1ucyIsIm5hbWUiLCJsYWJlbCIsImNlbGwiLCJlZGl0YWJsZSIsImVsIiwiY29sbGVjdGlvbiIsIm5vTG9hZCIsInJ1biIsImJpbmRFdmVudHMiLCJwcmVwZW5kIiwiZmlsdGVyIiwiZmlsdGVyQ29udGFpbmVyIiwiZmlsdGVycyIsImRlZmF1bHRGaWx0ZXJzIiwicmVuZGVyIiwiYXBwZW5kIiwicGFnaW5nIiwibW9kZWxBZGQiLCJtb2RlbCIsImZ1bGxDb2xsZWN0aW9uIiwibW9kZWxDaGFuZ2UiLCJnZXQiLCJtb2RlbFJlbW92ZSIsImV2dCIsInRhcmdldCIsImhhc0NsYXNzIiwiaWdub3JlIiwic2F2ZSIsInF1ZXVlZCIsInBlbmRpbmciLCJmYWlsZWQiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLFdBQVdDLFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1DLElBQUlELFFBQVEsUUFBUixDQUFWOztBQUVBLElBQU1FLE9BQU9GLFFBQVEsZ0JBQVIsQ0FBYjs7QUFFQUcsT0FBT0MsT0FBUCxHQUFpQkwsU0FBU00s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RUFoRytDOztBQWtHaERWLFFBQU8sZUFBU3dDLEtBQVQsRUFBZ0JLLEdBQWhCLEVBQXFCO0FBQzNCLE1BQU1uQixLQUFLdkMsRUFBRTBELElBQUlDLE1BQU4sQ0FBWDtBQUNBLE1BQU05QyxRQUFRMEIsR0FBR3FCLFFBQUgsQ0FBWSxPQUFaLENBQWQ7QUFDQSxNQUFNQyxTQUFTdEIsR0FBR3FCLFFBQUgsQ0FBWSxRQUFaLENBQWY7QUFDQVAsUUFBTVMsSUFBTixDQUFXLEVBQUVDLFFBQVFsRCxLQUFWLEVBQWlCZ0QsUUFBUUEsTUFBekIsRUFBaUNHLFNBQVMsSUFBMUMsRUFBZ0RDLFFBQVEsSUFBeEQsRUFBOER0QyxPQUFPLENBQXJFLEVBQVg7QUFDQTtBQXZHK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoidXBsb2Fkcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcblxuY29uc3QgR3JpZCA9IHJlcXVpcmUoXCIuLi8uLi9saWIvZ3JpZFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImltcG9ydC11cGxvYWRzXCIsXG5cblx0dWk6IHtcblx0XHRoZWFkZXJDb3VudGVyOiBcIiNoZWFkZXItY291bnRlclwiLFxuXHRcdGZpbHRlckJhcjogXCIub3BzLWJhciAuZmlsdGVyc1wiLFxuXHRcdGNvdW50ZXJCYXI6IFwiLm9wcy1iYXIgLmNvdW50ZXJcIixcblx0XHRncmlkOiBcImRpdi5ncmlkXCIsXG5cblx0XHRyZXRyeTogXCJidXR0b24ucmV0cnlcIixcblx0fSxcblxuXHRjb2xsZWN0aW9uRXZlbnRzOiB7XG5cdFx0YWRkOiBcIm1vZGVsQWRkXCIsXG5cdFx0Y2hhbmdlOiBcIm1vZGVsQ2hhbmdlXCIsXG5cdFx0cmVtb3ZlOiBcIm1vZGVsUmVtb3ZlXCIsXG5cdFx0c3luYzogXCJ1cGRhdGVDb3VudGVyXCIsXG5cdH0sXG5cblx0aXRlbUV2ZW50czoge1xuXHRcdC8vXCJzeW5jIHJlc2V0XCI6IFwidXBkYXRlQ291bnRlclwiLFxuXHRcdFwicm93OmN1c3RvbWNsaWNrXCI6IFwicmV0cnlcIixcblx0fSxcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy91cGxvYWRzLm51bmpcIiksXG5cblx0b25CZWZvcmVEZXN0cm95OiBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5ncmlkKVxuXHRcdFx0dGhpcy5ncmlkLmRlc3Ryb3koKTtcblx0fSxcblxuXHR1cGRhdGVDb3VudGVyOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoIXRoaXMuaXRlbXMpIHtcblx0XHRcdHRoaXMudWkuaGVhZGVyQ291bnRlci50ZXh0KFwiMFwiKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgcGFnZVN0YXJ0ID0gKCgodGhpcy5pdGVtcy5zdGF0ZS5jdXJyZW50UGFnZSAtIDEpICogdGhpcy5pdGVtcy5zdGF0ZS5wYWdlU2l6ZSkgKyAxKTtcblx0XHRsZXQgcGFnZUVuZCA9ICgodGhpcy5pdGVtcy5zdGF0ZS5jdXJyZW50UGFnZSkgKiB0aGlzLml0ZW1zLnN0YXRlLnBhZ2VTaXplKTtcblx0XHRpZiAocGFnZUVuZCA+IHRoaXMuaXRlbXMuc3RhdGUudG90YWxSZWNvcmRzKVxuXHRcdFx0cGFnZUVuZCA9IHRoaXMuaXRlbXMuc3RhdGUudG90YWxSZWNvcmRzO1xuXG5cdFx0bGV0IHRleHQgPSBcIlVwbG9hZHMgcXVldWUgXCIgKyAodGhpcy5pdGVtcy5zdGF0ZS50b3RhbFJlY29yZHMgPT09IDAgPyAwIDogcGFnZVN0YXJ0KSArIFwiIC0gXCIgKyBwYWdlRW5kICsgXCIgb2YgXCIgKyAodGhpcy5pdGVtcy5zdGF0ZS50b3RhbFJlY29yZHMgfHwgMCkudG9Mb2NhbGVTdHJpbmcoKTtcblx0XHRpZiAodGhpcy5pdGVtcy5zdGF0ZS50b3RhbFJlY29yZHMgPT09IG51bGwpXG5cdFx0XHR0ZXh0ID0gXCJObyBpdGVtcyBxdWV1ZWQgZm9yIHVwbG9hZFwiO1xuXG5cdFx0dGhpcy51aS5oZWFkZXJDb3VudGVyLnRleHQodGhpcy5pdGVtcy5zdGF0ZS50b3RhbFJlY29yZHMpO1xuXG5cdFx0dGhpcy51aS5jb3VudGVyQmFyLnRleHQodGV4dCk7XG5cdH0sXG5cblx0b25BdHRhY2g6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGNvbHVtbnMgPSBbXG5cdFx0XHR7IG5hbWU6IFwiZmlsZW5hbWVcIiwgbGFiZWw6IFwiRmlsZSBuYW1lXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcInN0YXRlXCIsIGxhYmVsOiBcIlN0YXRlXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcIlwiLCBsYWJlbDogXCJcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiXCIsIGxhYmVsOiBcIlwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRdO1xuXG5cdFx0dGhpcy5ncmlkID0gbmV3IEdyaWQoeyBlbDogdGhpcy51aS5ncmlkLCBjb2x1bW5zOiBjb2x1bW5zLCBjb2xsZWN0aW9uOiB0aGlzLmNvbGxlY3Rpb24sIHBhZ2VTaXplOiAxNSwgbm9Mb2FkOiB0cnVlIH0pO1xuXG5cdFx0dGhpcy5jb2xsZWN0aW9uLnJ1biA9IHRydWU7XG5cblx0XHR0aGlzLml0ZW1zID0gdGhpcy5ncmlkLmNvbGxlY3Rpb247XG5cblx0XHR0aGlzLmJpbmRFdmVudHModGhpcy5pdGVtcywgdGhpcy5pdGVtRXZlbnRzKTtcblxuXHRcdHRoaXMudWkuZmlsdGVyQmFyLnByZXBlbmQodGhpcy5ncmlkLmZpbHRlcih7XG5cdFx0XHRmaWx0ZXJDb250YWluZXI6IHRoaXMudWkuZmlsdGVyQmFyLFxuXHRcdFx0ZmlsdGVyczogW10sXG5cdFx0XHRkZWZhdWx0RmlsdGVyczogW10sXG5cdFx0fSkucmVuZGVyKCkuZWwpO1xuXG5cdFx0JChcIi5wYWdpbmdcIiwgdGhpcy5lbCkuYXBwZW5kKHRoaXMuZ3JpZC5wYWdpbmcoKS5yZW5kZXIoKS5lbCk7XG5cblx0XHR0aGlzLnVwZGF0ZUNvdW50ZXIoKTtcblx0fSxcblxuXHRtb2RlbEFkZDogZnVuY3Rpb24obW9kZWwpIHtcblx0XHR0aGlzLml0ZW1zLmZ1bGxDb2xsZWN0aW9uLmFkZChtb2RlbCk7XG5cblx0XHR0aGlzLnVwZGF0ZUNvdW50ZXIoKTtcblx0fSxcblxuXHRtb2RlbENoYW5nZTogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRpZiAobW9kZWwuZ2V0KFwiaWdub3JlXCIpKVxuXHRcdFx0cmV0dXJuIHRoaXMuaXRlbXMuZnVsbENvbGxlY3Rpb24ucmVtb3ZlKG1vZGVsKTtcblxuXHRcdC8vdGhpcy5pdGVtcy5mdWxsQ29sbGVjdGlvbi5zZXQobW9kZWwpO1xuXHRcdHRoaXMudXBkYXRlQ291bnRlcigpO1xuXHR9LFxuXG5cdG1vZGVsUmVtb3ZlOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdGlmICghdGhpcy5pdGVtcylcblx0XHRcdHJldHVybjtcblx0XHR0aGlzLml0ZW1zLmZ1bGxDb2xsZWN0aW9uLnJlbW92ZShtb2RlbCk7XG5cdFx0dGhpcy51cGRhdGVDb3VudGVyKCk7XG5cdH0sXG5cblx0cmV0cnk6IGZ1bmN0aW9uKG1vZGVsLCBldnQpIHtcblx0XHRjb25zdCBlbCA9ICQoZXZ0LnRhcmdldCk7XG5cdFx0Y29uc3QgcmV0cnkgPSBlbC5oYXNDbGFzcyhcInJldHJ5XCIpO1xuXHRcdGNvbnN0IGlnbm9yZSA9IGVsLmhhc0NsYXNzKFwiaWdub3JlXCIpO1xuXHRcdG1vZGVsLnNhdmUoeyBxdWV1ZWQ6IHJldHJ5LCBpZ25vcmU6IGlnbm9yZSwgcGVuZGluZzogdHJ1ZSwgZmFpbGVkOiBudWxsLCBzdGF0ZTogMCB9KTtcblx0fSxcbn0pOyJdfQ==",
    "\"use strict\";\n\nvar _regenerator = require(\"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\nvar Backbone = require(\"backbone\");\nvar _ = require(\"lodash\");\n\nvar settings = require(\"app-settings\");\n\nvar App = require(\"../../index\");\nvar ServerGrid = require(\"../../lib/serverGrid\");\nvar SmallModal = require(\"../../lib/smallModal\");\n\nvar User = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"import_id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/imports\";\n\t},\n\n\tcomputeds: {\n\t\thtmlState: function htmlState() {\n\t\t\tvar state = void 0;\n\t\t\tif (_.startsWith(this.get(\"action\"), \"add\")) state = \"add\";else if (_.startsWith(this.get(\"action\"), \"update\")) state = \"update\";else if (_.startsWith(this.get(\"action\"), \"delete\")) state = \"delete\";\n\n\t\t\treturn \"<span class='\" + state + \"'></span>\";\n\t\t}\n\t}\n});\n\nvar Users = Backbone.PageableCollection.extend({\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/imports?type=user\";\n\t},\n\n\tmodel: User,\n\n\tstate: {\n\t\tpageSize: 15\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\ttotalPages: null,\n\t\ttotalRecords: null,\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"users-import\",\n\n\tui: {\n\t\tfilterBar: \".ops-bar .filters\",\n\t\tcounterBar: \".ops-bar .counter\",\n\t\tgrid: \"div.grid\",\n\t\tpaging: \".paging\",\n\n\t\treset: \".actions div.reset\",\n\t\tsubmit: \".actions div.submit\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.reset\": \"resetQueue\",\n\t\t\"click @ui.submit\": \"submitQueue\"\n\t},\n\n\tcollectionEvents: {\n\t\t\"toolbar:click:delete\": \"deleteItem\"\n\t},\n\n\ttemplate: require(\"../templates/users.nunj\"),\n\n\tinitialize: function initialize() {\n\t\tthis.collection = new Users();\n\n\t\tthis.bindEvents(this.collection, this.collectionEvents);\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tif (this.grid) this.grid.destroy();\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"htmlState\", label: \"State\", cell: ServerGrid.HTMLCell.extend({}), editable: false }, { name: \"roles\", label: \"Type\", cell: ServerGrid.SelectraCell.extend({\n\t\t\t\toptions: {\n\t\t\t\t\tplaceholder: \"No roles selected\",\n\t\t\t\t\tmultiple: true,\n\t\t\t\t\twidth: \"200px\",\n\t\t\t\t\titems: _.compact(_.map(settings.roles, function (x, key) {\n\t\t\t\t\t\tif (key !== \"*\") return { key: key, value: x.name, categories: [x.name] };\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t})),\n\t\t\t\t\teligibility: function eligibility(selection, item) {\n\t\t\t\t\t\tif (!(item.get(\"key\") in settings.roles)) return true;\n\n\t\t\t\t\t\tif (_.some(selection, function (x) {\n\t\t\t\t\t\t\treturn x.get(\"key\") in settings.roles && _.intersection(settings.roles[x.get(\"key\")].exclusivity, settings.roles[item.get(\"key\")].exclusivity).length > 0;\n\t\t\t\t\t\t})) return false;\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}), editable: true }, { name: \"username\", label: \"Username\", cell: \"string\", editable: false }, { name: \"firstname\", label: \"First Name\", cell: \"string\", editable: true }, { name: \"surname\", label: \"Surname\", cell: \"string\", editable: true }, { name: \"email\", label: \"Email\", cell: \"string\", editable: true }, { name: \"grade\", label: \"Grade\", cell: ServerGrid.SelectraCell.extend({\n\t\t\t\toptions: {\n\t\t\t\t\titems: _.reduce(settings.gradeList, function (sum, num, key) {\n\t\t\t\t\t\tsum[key] = _.reduce(num.sort(function (a, b) {\n\t\t\t\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t\t\t\t}), function (sum1, num1) {\n\t\t\t\t\t\t\tsum1.push({ key: num1.value, value: num1.name });return sum1;\n\t\t\t\t\t\t}, []);\n\n\t\t\t\t\t\treturn sum;\n\t\t\t\t\t}, {}),\n\t\t\t\t\twidth: \"300px\"\n\t\t\t\t}\n\t\t\t}), editable: true }, { name: \"enabled\", label: \"Enabled\", cell: \"boolean\", editable: true }, { label: \"Actions\", cell: new ServerGrid.ToolbarCell({ tooltips: [{ title: \"Delete\", icon: \"fa-trash-alt\", data: \"delete\" }] }), editable: false, sortable: false }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.paging,\n\t\t\tcolumns: columns,\n\t\t\tcollection: this.collection,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counterBar,\n\t\t\t\ttemplate: \"Queued users $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tthis.items = this.grid.collection;\n\n\t\tthis.listenTo(this.grid.collection, \"change\", this.handleEdit.bind(this));\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar filtars = [textFilter];\n\t\tvar defFilters = [\"textFilter\"];\n\n\t\tthis.ui.filterBar.prepend(this.grid.filter({\n\t\t\tfilterContainer: this.ui.filterBar,\n\t\t\tfilters: filtars,\n\t\t\tdefaultFilters: defFilters\n\t\t}).render().el);\n\t},\n\n\thandleEdit: function () {\n\t\tvar _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee(model) {\n\t\t\tvar dataKeys, updatedData;\n\t\t\treturn _regenerator2.default.wrap(function _callee$(_context) {\n\t\t\t\twhile (1) {\n\t\t\t\t\tswitch (_context.prev = _context.next) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\tdataKeys = _.keys(model.get(\"data\"));\n\t\t\t\t\t\t\tupdatedData = {};\n\n\n\t\t\t\t\t\t\t_.each(dataKeys, function (key) {\n\t\t\t\t\t\t\t\tupdatedData[key] = model.get(key) || \"\";\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t_context.next = 5;\n\t\t\t\t\t\t\treturn model.save({ data: updatedData, action: model.get(\"action\") }, { patch: true });\n\n\t\t\t\t\t\tcase 5:\n\t\t\t\t\t\t\tthis.trigger(\"state:refresh\");\n\n\t\t\t\t\t\tcase 6:\n\t\t\t\t\t\tcase \"end\":\n\t\t\t\t\t\t\treturn _context.stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, _callee, this);\n\t\t}));\n\n\t\tfunction handleEdit(_x) {\n\t\t\treturn _ref.apply(this, arguments);\n\t\t}\n\n\t\treturn handleEdit;\n\t}(),\n\n\tdeleteItem: function deleteItem(model) {\n\t\tvar _this = this;\n\n\t\tthis.delModal = new SmallModal({\n\t\t\tpersist: true,\n\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Remove Queued User: \" + (model.get(\"firstname\") + \" \" + model.get(\"surname\")).replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t}),\n\t\t\tbody: \"<p>Are you sure you want to remove this queued user?</p>\",\n\t\t\twarning: true\n\t\t});\n\t\tthis.delModal.on(\"button:ok\", function () {\n\t\t\tmodel.destroy({ wait: true, success: _this.deletionSuccess.bind(_this), error: _this.deletionError.bind(_this) });\n\t\t});\n\n\t\tthis.delModal.show();\n\t},\n\n\tdeletionSuccess: function deletionSuccess() {\n\t\tthis.delModal.destroy();\n\t\tthis.trigger(\"state:refresh\");\n\t},\n\n\tdeletionError: function deletionError(model, xhr) {\n\t\tvar answer = App.parseResponse(xhr);\n\t\tthis.delModal.showError(\"Deletion failed: \" + (answer.detail || answer.info));\n\t},\n\n\tresetQueue: function resetQueue() {\n\t\tthis.trigger(\"queue:reset\", this);\n\t},\n\n\tsubmitQueue: function submitQueue() {\n\t\tthis.trigger(\"queue:submit\", this);\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInVzZXJzLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIl8iLCJzZXR0aW5ncyIsIkFwcCIsIlNlcnZlckdyaWQiLCJTbWFsbE1vZGFsIiwiVXNlciIsIkVwb3h5IiwiTW9kZWwiLCJleHRlbmQiLCJpZEF0dHJpYnV0ZSIsInVybFJvb3QiLCJjb21wdXRlZHMiLCJodG1sU3RhdGUiLCJzdGF0ZSIsInN0YXJ0c1dpdGgiLCJnZXQiLCJVc2VycyIsIlBhZ2VhYmxlQ29sbGVjdGlvbiIsInVybCIsIm1vZGVsIiwicGFnZVNpemUiLCJtb2RlIiwicXVlcnlQYXJhbXMiLCJ0b3RhbFBhZ2VzIiwidG90YWxSZWNvcmRzIiwic29ydEtleSIsInBhcnNlU3RhdGUiLCJyZXNwIiwidG90YWwiLCJwYXJzZVJlY29yZHMiLCJyb3dzIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiY2xhc3NOYW1lIiwidWkiLCJmaWx0ZXJCYXIiLCJjb3VudGVyQmFyIiwiZ3JpZCIsInBhZ2luZyIsInJlc2V0Iiwic3VibWl0IiwiZXZlbnRzIiwiY29sbGVjdGlvbkV2ZW50cyIsInRlbXBsYXRlIiwiaW5pdGlhbGl6ZSIsImNvbGxlY3Rpb24iLCJiaW5kRXZlbnRzIiwib25CZWZvcmVEZXN0cm95IiwiZGVzdHJveSIsIm9uUmVuZGVyIiwiY29sdW1ucyIsIm5hbWUiLCJsYWJlbCIsImNlbGwiLCJIVE1MQ2VsbCIsImVkaXRhYmxlIiwiU2VsZWN0cmFDZWxsIiwib3B0aW9ucyIsInBsYWNlaG9sZGVyIiwibXVsdGlwbGUiLCJ3aWR0aCIsIml0ZW1zIiwiY29tcGFjdCIsIm1hcCIsInJvbGVzIiwieCIsImtleSIsInZhbHVlIiwiY2F0ZWdvcmllcyIsImVsaWdpYmlsaXR5Iiwic2VsZWN0aW9uIiwiaXRlbSIsInNvbWUiLCJpbnRlcnNlY3Rpb24iLCJleGNsdXNpdml0eSIsImxlbmd0aCIsInJlZHVjZSIsImdyYWRlTGlzdCIsInN1bSIsIm51bSIsInNvcnQiLCJhIiwiYiIsImxleGljYWwiLCJ0b1VwcGVyQ2FzZSIsImxvY2FsZUNvbXBhcmUiLCJzdW0xIiwibnVtMSIsInB1c2giLCJUb29sYmFyQ2VsbCIsInRvb2x0aXBzIiwidGl0bGUiLCJpY29uIiwiZGF0YSIsInNvcnRhYmxlIiwiZWwiLCJjb3VudGVyIiwiZWxlbWVudCIsImxpc3RlblRvIiwiaGFuZGxlRWRpdCIsImJpbmQiLCJ0ZXh0RmlsdGVyIiwidHlwZSIsImRlYm91bmNlIiwic2VydmVyIiwiZmlsdGFycyIsImRlZkZpbHRlcnMiLCJwcmVwZW5kIiwiZmlsdGVyIiwiZmlsdGVyQ29udGFpbmVyIiwiZmlsdGVycyIsImRlZmF1bHRGaWx0ZXJzIiwicmVuZGVyIiwiZGF0YUtleXMiLCJrZXlzIiwidXBkYXRlZERhdGEiLCJlYWNoIiwic2F2ZSIsImFjdGlvbiIsInBhdGNoIiwidHJpZ2dlciIsImRlbGV0ZUl0ZW0iLCJkZWxNb2RhbCIsInBlcnNpc3QiLCJyZXBsYWNlIiwiY2hhckNvZGVBdCIsImJvZHkiLCJ3YXJuaW5nIiwib24iLCJ3YWl0Iiwic3VjY2VzcyIsImRlbGV0aW9uU3VjY2VzcyIsImVycm9yIiwiZGVsZXRpb25FcnJvciIsInNob3ciLCJ4aHIiLCJhbnN3ZXIiLCJwYXJzZVJlc3BvbnNlIiwic2hvd0Vycm9yIiwiZGV0YWlsIiwiaW5mbyIsInJlc2V0UXVldWUiLCJzdWJtaXRRdWV1ZSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjs7QUFFQSxJQUFNRSxXQUFXRixRQUFRLGNBQVIsQ0FBakI7O0FBRUEsSUFBTUcsTUFBTUgsUUFBUSxhQUFSLENBQVo7QUFDQSxJQUFNSSxhQUFhSixRQUFRLHNCQUFSLENBQW5CO0FBQ0EsSUFBTUssYUFBYUwsUUFBUSxzQkFBUixDQUFuQjs7QUFFQSxJQUFNTSxPQUFPUCxTQUFTUSxLQUFULENBQWVDLEtBQWYsQ0FB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SDZCO0FBSTlCQyxTQUFNLDBEQUp3QjtBQUs5QkMsWUFBUztBQUxxQixHQUFmLENBQWhCO0FBT0EsT0FBS0wsUUFBTCxDQUFjTSxFQUFkLENBQWlCLFdBQWpCLEVBQThCLFlBQU07QUFDbkMvRyxTQUFNK0IsT0FBTixDQUFjLEVBQUVpRixNQUFNLElBQVIsRUFBY0MsU0FBUyxNQUFLQyxlQUFMLENBQXFCL0IsSUFBckIsQ0FBMEIsS0FBMUIsQ0FBdkIsRUFBd0RnQyxPQUFPLE1BQUtDLGFBQUwsQ0FBbUJqQyxJQUFuQixDQUF3QixLQUF4QixDQUEvRCxFQUFkO0FBQ0EsR0FGRDs7QUFJQSxPQUFLc0IsUUFBTCxDQUFjWSxJQUFkO0FBQ0EsRUEzSStDOztBQTZJaERILGtCQUFpQiwyQkFBVztBQUMzQixPQUFLVCxRQUFMLENBQWMxRSxPQUFkO0FBQ0EsT0FBS3dFLE9BQUwsQ0FBYSxlQUFiO0FBQ0EsRUFoSitDOztBQWtKaERhLGdCQUFlLHVCQUFTcEgsS0FBVCxFQUFnQnNILEdBQWhCLEVBQXFCO0FBQ25DLE1BQU1DLFNBQVN4SSxJQUFJeUksYUFBSixDQUFrQkYsR0FBbEIsQ0FBZjtBQUNBLE9BQUtiLFFBQUwsQ0FBY2dCLFNBQWQsQ0FBd0IsdUJBQXVCRixPQUFPRyxNQUFQLElBQWlCSCxPQUFPSSxJQUEvQyxDQUF4QjtBQUNBLEVBckorQzs7QUF1SmhEQyxhQUFZLHNCQUFXO0FBQ3RCLE9BQUtyQixPQUFMLENBQWEsYUFBYixFQUE0QixJQUE1QjtBQUNBLEVBekorQzs7QUEySmhEc0IsY0FBYSx1QkFBVztBQUN2QixPQUFLdEIsT0FBTCxDQUFhLGNBQWIsRUFBNkIsSUFBN0I7QUFDQTtBQTdKK0MsQ0FBaEMsQ0FBakIiLCJmaWxlIjoidXNlcnMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IEJhY2tib25lID0gcmVxdWlyZShcImJhY2tib25lXCIpO1xuY29uc3QgXyA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5cbmNvbnN0IHNldHRpbmdzID0gcmVxdWlyZShcImFwcC1zZXR0aW5nc1wiKTtcblxuY29uc3QgQXBwID0gcmVxdWlyZShcIi4uLy4uL2luZGV4XCIpO1xuY29uc3QgU2VydmVyR3JpZCA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc2VydmVyR3JpZFwiKTtcbmNvbnN0IFNtYWxsTW9kYWwgPSByZXF1aXJlKFwiLi4vLi4vbGliL3NtYWxsTW9kYWxcIik7XG5cbmNvbnN0IFVzZXIgPSBCYWNrYm9uZS5FcG94eS5Nb2RlbC5leHRlbmQoe1xuXHRpZEF0dHJpYnV0ZTogXCJpbXBvcnRfaWRcIixcblxuXHR1cmxSb290OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvaW1wb3J0c1wiO1xuXHR9LFxuXG5cdGNvbXB1dGVkczoge1xuXHRcdGh0bWxTdGF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRsZXQgc3RhdGU7XG5cdFx0XHRpZiAoXy5zdGFydHNXaXRoKHRoaXMuZ2V0KFwiYWN0aW9uXCIpLCBcImFkZFwiKSlcblx0XHRcdFx0c3RhdGUgPSBcImFkZFwiO1xuXHRcdFx0ZWxzZSBpZiAoXy5zdGFydHNXaXRoKHRoaXMuZ2V0KFwiYWN0aW9uXCIpLCBcInVwZGF0ZVwiKSlcblx0XHRcdFx0c3RhdGUgPSBcInVwZGF0ZVwiO1xuXHRcdFx0ZWxzZSBpZiAoXy5zdGFydHNXaXRoKHRoaXMuZ2V0KFwiYWN0aW9uXCIpLCBcImRlbGV0ZVwiKSlcblx0XHRcdFx0c3RhdGUgPSBcImRlbGV0ZVwiO1xuXG5cdFx0XHRyZXR1cm4gYDxzcGFuIGNsYXNzPScke3N0YXRlfSc+PC9zcGFuPmA7XG5cdFx0fSxcblx0fSxcbn0pO1xuXG5jb25zdCBVc2VycyA9IEJhY2tib25lLlBhZ2VhYmxlQ29sbGVjdGlvbi5leHRlbmQoe1xuXHR1cmw6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9pbXBvcnRzP3R5cGU9dXNlclwiO1xuXHR9LFxuXG5cdG1vZGVsOiBVc2VyLFxuXG5cdHN0YXRlOiB7XG5cdFx0cGFnZVNpemU6IDE1LFxuXHR9LFxuXHRtb2RlOiBcInNlcnZlclwiLFxuXG5cdHF1ZXJ5UGFyYW1zOiB7XG5cdFx0cGFnZVNpemU6IFwicGFnZVNpemVcIixcblx0XHR0b3RhbFBhZ2VzOiBudWxsLFxuXHRcdHRvdGFsUmVjb3JkczogbnVsbCxcblx0XHRzb3J0S2V5OiBcInNvcnRCeVwiLFxuXHR9LFxuXG5cdHBhcnNlU3RhdGU6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRyZXR1cm4geyB0b3RhbFJlY29yZHM6IHJlc3AudG90YWwgfTtcblx0fSxcblxuXHRwYXJzZVJlY29yZHM6IGZ1bmN0aW9uKHJlc3ApIHtcblx0XHRyZXR1cm4gcmVzcC5yb3dzO1xuXHR9LFxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJ1c2Vycy1pbXBvcnRcIixcblxuXHR1aToge1xuXHRcdGZpbHRlckJhcjogXCIub3BzLWJhciAuZmlsdGVyc1wiLFxuXHRcdGNvdW50ZXJCYXI6IFwiLm9wcy1iYXIgLmNvdW50ZXJcIixcblx0XHRncmlkOiBcImRpdi5ncmlkXCIsXG5cdFx0cGFnaW5nOiBcIi5wYWdpbmdcIixcblxuXHRcdHJlc2V0OiBcIi5hY3Rpb25zIGRpdi5yZXNldFwiLFxuXHRcdHN1Ym1pdDogXCIuYWN0aW9ucyBkaXYuc3VibWl0XCIsXG5cdH0sXG5cblx0ZXZlbnRzOiB7XG5cdFx0XCJjbGljayBAdWkucmVzZXRcIjogXCJyZXNldFF1ZXVlXCIsXG5cdFx0XCJjbGljayBAdWkuc3VibWl0XCI6IFwic3VibWl0UXVldWVcIixcblx0fSxcblxuXHRjb2xsZWN0aW9uRXZlbnRzOiB7XG5cdFx0XCJ0b29sYmFyOmNsaWNrOmRlbGV0ZVwiOiBcImRlbGV0ZUl0ZW1cIixcblx0fSxcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy91c2Vycy5udW5qXCIpLFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuY29sbGVjdGlvbiA9IG5ldyBVc2VycygpO1xuXG5cdFx0dGhpcy5iaW5kRXZlbnRzKHRoaXMuY29sbGVjdGlvbiwgdGhpcy5jb2xsZWN0aW9uRXZlbnRzKTtcblx0fSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLmdyaWQpXG5cdFx0XHR0aGlzLmdyaWQuZGVzdHJveSgpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBjb2x1bW5zID0gW1xuXHRcdFx0eyBuYW1lOiBcImh0bWxTdGF0ZVwiLCBsYWJlbDogXCJTdGF0ZVwiLCBjZWxsOiBTZXJ2ZXJHcmlkLkhUTUxDZWxsLmV4dGVuZCh7fSksIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcInJvbGVzXCIsIGxhYmVsOiBcIlR5cGVcIiwgY2VsbDogU2VydmVyR3JpZC5TZWxlY3RyYUNlbGwuZXh0ZW5kKHtcblx0XHRcdFx0b3B0aW9uczoge1xuXHRcdFx0XHRcdHBsYWNlaG9sZGVyOiBcIk5vIHJvbGVzIHNlbGVjdGVkXCIsXG5cdFx0XHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRcdFx0d2lkdGg6IFwiMjAwcHhcIixcblx0XHRcdFx0XHRpdGVtczogXy5jb21wYWN0KF8ubWFwKHNldHRpbmdzLnJvbGVzLCAoeCwga2V5KSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoa2V5ICE9PSBcIipcIilcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHsga2V5LCB2YWx1ZTogeC5uYW1lLCBjYXRlZ29yaWVzOiBbeC5uYW1lXSB9O1xuXHRcdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdFx0fSkpLFxuXHRcdFx0XHRcdGVsaWdpYmlsaXR5OiBmdW5jdGlvbihzZWxlY3Rpb24sIGl0ZW0pIHtcblx0XHRcdFx0XHRcdGlmICghKGl0ZW0uZ2V0KFwia2V5XCIpIGluIHNldHRpbmdzLnJvbGVzKSlcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cblx0XHRcdFx0XHRcdGlmIChfLnNvbWUoc2VsZWN0aW9uLCB4ID0+IHguZ2V0KFwia2V5XCIpIGluIHNldHRpbmdzLnJvbGVzICYmIF8uaW50ZXJzZWN0aW9uKHNldHRpbmdzLnJvbGVzW3guZ2V0KFwia2V5XCIpXS5leGNsdXNpdml0eSwgc2V0dGluZ3Mucm9sZXNbaXRlbS5nZXQoXCJrZXlcIildLmV4Y2x1c2l2aXR5KS5sZW5ndGggPiAwKSlcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdH0pLCBlZGl0YWJsZTogdHJ1ZSB9LFxuXHRcdFx0eyBuYW1lOiBcInVzZXJuYW1lXCIsIGxhYmVsOiBcIlVzZXJuYW1lXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcImZpcnN0bmFtZVwiLCBsYWJlbDogXCJGaXJzdCBOYW1lXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiB0cnVlIH0sXG5cdFx0XHR7IG5hbWU6IFwic3VybmFtZVwiLCBsYWJlbDogXCJTdXJuYW1lXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiB0cnVlIH0sXG5cdFx0XHR7IG5hbWU6IFwiZW1haWxcIiwgbGFiZWw6IFwiRW1haWxcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IHRydWUgfSxcblx0XHRcdHsgbmFtZTogXCJncmFkZVwiLCBsYWJlbDogXCJHcmFkZVwiLCBjZWxsOiBTZXJ2ZXJHcmlkLlNlbGVjdHJhQ2VsbC5leHRlbmQoe1xuXHRcdFx0XHRvcHRpb25zOiB7XG5cdFx0XHRcdFx0aXRlbXM6IF8ucmVkdWNlKHNldHRpbmdzLmdyYWRlTGlzdCwgKHN1bSwgbnVtLCBrZXkpID0+IHtcblx0XHRcdFx0XHRcdHN1bVtrZXldID0gXy5yZWR1Y2UobnVtLnNvcnQoKGEsIGIpID0+IChcImxleGljYWxcIiBpbiBhID8gYS5sZXhpY2FsIDogYS5uYW1lKS50b1VwcGVyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoKFwibGV4aWNhbFwiIGluIGIgPyBiLmxleGljYWwgOiBiLm5hbWUpLnRvVXBwZXJDYXNlKCkpKSxcblx0XHRcdFx0XHRcdFx0KHN1bTEsIG51bTEpID0+IHsgc3VtMS5wdXNoKHsga2V5OiBudW0xLnZhbHVlLCB2YWx1ZTogbnVtMS5uYW1lIH0pOyByZXR1cm4gc3VtMTsgfSwgW10pO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gc3VtO1xuXHRcdFx0XHRcdH0sIHt9KSxcblx0XHRcdFx0XHR3aWR0aDogXCIzMDBweFwiLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSksIGVkaXRhYmxlOiB0cnVlIH0sXG5cdFx0XHR7IG5hbWU6IFwiZW5hYmxlZFwiLCBsYWJlbDogXCJFbmFibGVkXCIsIGNlbGw6IFwiYm9vbGVhblwiLCBlZGl0YWJsZTogdHJ1ZSB9LFxuXHRcdFx0eyBsYWJlbDogXCJBY3Rpb25zXCIsIGNlbGw6IG5ldyBTZXJ2ZXJHcmlkLlRvb2xiYXJDZWxsKHsgdG9vbHRpcHM6IFtcblx0XHRcdFx0eyB0aXRsZTogXCJEZWxldGVcIiwgaWNvbjogXCJmYS10cmFzaC1hbHRcIiwgZGF0YTogXCJkZWxldGVcIiB9LFxuXHRcdFx0XSB9KSwgZWRpdGFibGU6IGZhbHNlLCBzb3J0YWJsZTogZmFsc2UgfSxcblx0XHRdO1xuXG5cdFx0dGhpcy5ncmlkID0gbmV3IFNlcnZlckdyaWQoe1xuXHRcdFx0ZWw6IHRoaXMudWkucGFnaW5nLFxuXHRcdFx0Y29sdW1uczogY29sdW1ucyxcblx0XHRcdGNvbGxlY3Rpb246IHRoaXMuY29sbGVjdGlvbixcblx0XHRcdGNvdW50ZXI6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5jb3VudGVyQmFyLFxuXHRcdFx0XHR0ZW1wbGF0ZTogXCJRdWV1ZWQgdXNlcnMgJHN0YXJ0IC0gJGVuZCBvZiAkdG90YWxcIixcblx0XHRcdH0sXG5cdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0ZWxlbWVudDogdGhpcy51aS5wYWdpbmcsXG5cdFx0XHR9LFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5pdGVtcyA9IHRoaXMuZ3JpZC5jb2xsZWN0aW9uO1xuXG5cdFx0dGhpcy5saXN0ZW5Ubyh0aGlzLmdyaWQuY29sbGVjdGlvbiwgXCJjaGFuZ2VcIiwgdGhpcy5oYW5kbGVFZGl0LmJpbmQodGhpcykpO1xuXG5cdFx0Y29uc3QgdGV4dEZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwidGV4dFwiLFxuXHRcdFx0bmFtZTogXCJ0ZXh0RmlsdGVyXCIsXG5cdFx0XHRsYWJlbDogXCJUZXh0IFNlYXJjaFwiLFxuXHRcdFx0ZGVib3VuY2U6IDIwMCxcblx0XHRcdHNlcnZlcjogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0Y29uc3QgZmlsdGFycyA9IFt0ZXh0RmlsdGVyXTtcblx0XHRjb25zdCBkZWZGaWx0ZXJzID0gW1widGV4dEZpbHRlclwiXTtcblxuXHRcdHRoaXMudWkuZmlsdGVyQmFyLnByZXBlbmQodGhpcy5ncmlkLmZpbHRlcih7XG5cdFx0XHRmaWx0ZXJDb250YWluZXI6IHRoaXMudWkuZmlsdGVyQmFyLFxuXHRcdFx0ZmlsdGVyczogZmlsdGFycyxcblx0XHRcdGRlZmF1bHRGaWx0ZXJzOiBkZWZGaWx0ZXJzLFxuXHRcdH0pLnJlbmRlcigpLmVsKTtcblx0fSxcblxuXHRoYW5kbGVFZGl0OiBhc3luYyBmdW5jdGlvbihtb2RlbCkge1xuXHRcdGNvbnN0IGRhdGFLZXlzID0gXy5rZXlzKG1vZGVsLmdldChcImRhdGFcIikpO1xuXHRcdGNvbnN0IHVwZGF0ZWREYXRhID0ge307XG5cblx0XHRfLmVhY2goZGF0YUtleXMsIGtleSA9PiB7XG5cdFx0XHR1cGRhdGVkRGF0YVtrZXldID0gbW9kZWwuZ2V0KGtleSkgfHwgXCJcIjtcblx0XHR9KTtcblxuXHRcdGF3YWl0IG1vZGVsLnNhdmUoeyBkYXRhOiB1cGRhdGVkRGF0YSwgYWN0aW9uOiBtb2RlbC5nZXQoXCJhY3Rpb25cIikgfSwgeyBwYXRjaDogdHJ1ZSB9KTtcblx0XHR0aGlzLnRyaWdnZXIoXCJzdGF0ZTpyZWZyZXNoXCIpO1xuXHR9LFxuXG5cdGRlbGV0ZUl0ZW06IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0dGhpcy5kZWxNb2RhbCA9IG5ldyBTbWFsbE1vZGFsKHtcblx0XHRcdHBlcnNpc3Q6IHRydWUsXG5cdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmFsIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJy8+IFJlbW92ZSBRdWV1ZWQgVXNlcjogXCIgK1xuXHRcdFx0XHQobW9kZWwuZ2V0KFwiZmlyc3RuYW1lXCIpICsgXCIgXCIgKyBtb2RlbC5nZXQoXCJzdXJuYW1lXCIpKS5yZXBsYWNlKC9bXFwmXFw8XFw+XFwnXFxcIl0vZywgeCA9PiBcIiYjXCIgKyB4LmNoYXJDb2RlQXQoMCkgKyBcIjtcIiksXG5cdFx0XHRib2R5OiBcIjxwPkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZW1vdmUgdGhpcyBxdWV1ZWQgdXNlcj88L3A+XCIsXG5cdFx0XHR3YXJuaW5nOiB0cnVlLFxuXHRcdH0pO1xuXHRcdHRoaXMuZGVsTW9kYWwub24oXCJidXR0b246b2tcIiwgKCkgPT4ge1xuXHRcdFx0bW9kZWwuZGVzdHJveSh7IHdhaXQ6IHRydWUsIHN1Y2Nlc3M6IHRoaXMuZGVsZXRpb25TdWNjZXNzLmJpbmQodGhpcyksIGVycm9yOiB0aGlzLmRlbGV0aW9uRXJyb3IuYmluZCh0aGlzKSB9KTtcblx0XHR9KTtcblxuXHRcdHRoaXMuZGVsTW9kYWwuc2hvdygpO1xuXHR9LFxuXG5cdGRlbGV0aW9uU3VjY2VzczogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5kZWxNb2RhbC5kZXN0cm95KCk7XG5cdFx0dGhpcy50cmlnZ2VyKFwic3RhdGU6cmVmcmVzaFwiKTtcblx0fSxcblxuXHRkZWxldGlvbkVycm9yOiBmdW5jdGlvbihtb2RlbCwgeGhyKSB7XG5cdFx0Y29uc3QgYW5zd2VyID0gQXBwLnBhcnNlUmVzcG9uc2UoeGhyKTtcblx0XHR0aGlzLmRlbE1vZGFsLnNob3dFcnJvcihcIkRlbGV0aW9uIGZhaWxlZDogXCIgKyAoYW5zd2VyLmRldGFpbCB8fCBhbnN3ZXIuaW5mbykpO1xuXHR9LFxuXG5cdHJlc2V0UXVldWU6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMudHJpZ2dlcihcInF1ZXVlOnJlc2V0XCIsIHRoaXMpO1xuXHR9LFxuXG5cdHN1Ym1pdFF1ZXVlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnRyaWdnZXIoXCJxdWV1ZTpzdWJtaXRcIiwgdGhpcyk7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar $ = require(\"jquery\");\n\nvar Grid = require(\"../../lib/grid\");\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"import-warnings\",\n\n\tui: {\n\t\theaderCounter: \"#header-counter\",\n\t\tfilterBar: \".ops-bar .filters\",\n\t\tcounterBar: \".ops-bar .counter\",\n\t\tgrid: \"div.grid\",\n\n\t\tretry: \"button.retry\"\n\t},\n\n\tcollectionEvents: {\n\t\tadd: \"modelAdd\",\n\t\tchange: \"modelChange\",\n\t\tremove: \"modelRemove\",\n\t\tsync: \"updateCounter\"\n\t},\n\n\titemEvents: {\n\t\t//\"sync reset\": \"updateCounter\",\n\t\t\"row:customclick\": \"retry\"\n\t},\n\n\ttemplate: require(\"../templates/warnings.nunj\"),\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tif (this.grid) this.grid.destroy();\n\t},\n\n\tupdateCounter: function updateCounter() {\n\t\tif (!this.items) {\n\t\t\tthis.ui.headerCounter.text(\"0\");\n\t\t\treturn;\n\t\t}\n\t\tvar pageStart = (this.items.state.currentPage - 1) * this.items.state.pageSize + 1;\n\t\tvar pageEnd = this.items.state.currentPage * this.items.state.pageSize;\n\t\tif (pageEnd > this.items.state.totalRecords) pageEnd = this.items.state.totalRecords;\n\n\t\tvar text = \"Queue warnings \" + (this.items.state.totalRecords === 0 ? 0 : pageStart) + \" - \" + pageEnd + \" of \" + (this.items.state.totalRecords || 0).toLocaleString();\n\t\tif (this.items.state.totalRecords === null) text = \"No warnings\";\n\n\t\tthis.ui.headerCounter.text(this.items.state.totalRecords);\n\n\t\tthis.ui.counterBar.text(text);\n\t},\n\n\tonAttach: function onAttach() {\n\t\tvar columns = [{ name: \"message\", label: \"Warnings\", cell: \"string\", editable: false }];\n\n\t\tthis.grid = new Grid({ el: this.ui.grid, columns: columns, collection: this.collection, pageSize: 15, noLoad: true });\n\n\t\tthis.collection.run = true;\n\n\t\tthis.items = this.grid.collection;\n\n\t\tthis.bindEvents(this.items, this.itemEvents);\n\n\t\tthis.ui.filterBar.prepend(this.grid.filter({\n\t\t\tfilterContainer: this.ui.filterBar,\n\t\t\tfilters: [],\n\t\t\tdefaultFilters: []\n\t\t}).render().el);\n\n\t\t$(\".paging\", this.el).append(this.grid.paging().render().el);\n\n\t\tthis.updateCounter();\n\t},\n\n\tmodelAdd: function modelAdd(model) {\n\t\tthis.items.fullCollection.add(model);\n\n\t\tthis.updateCounter();\n\t},\n\n\tmodelChange: function modelChange(model) {\n\t\tif (model.get(\"ignore\")) return this.items.fullCollection.remove(model);\n\n\t\t//this.items.fullCollection.set(model);\n\t\tthis.updateCounter();\n\t},\n\n\tmodelRemove: function modelRemove(model) {\n\t\tif (!this.items) return;\n\t\tthis.items.fullCollection.remove(model);\n\t\tthis.updateCounter();\n\t},\n\n\tretry: function retry(model, evt) {\n\t\tvar el = $(evt.target);\n\t\tvar retry = el.hasClass(\"retry\");\n\t\tvar ignore = el.hasClass(\"ignore\");\n\t\tmodel.save({ queued: retry, ignore: ignore, pending: true, failed: null, state: 0 });\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndhcm5pbmdzLmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIiQiLCJHcmlkIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1hcmlvbmV0dGUiLCJWaWV3IiwiZXh0ZW5kIiwiY2xhc3NOYW1lIiwidWkiLCJoZWFkZXJDb3VudGVyIiwiZmlsdGVyQmFyIiwiY291bnRlckJhciIsImdyaWQiLCJyZXRyeSIsImNvbGxlY3Rpb25FdmVudHMiLCJhZGQiLCJjaGFuZ2UiLCJyZW1vdmUiLCJzeW5jIiwiaXRlbUV2ZW50cyIsInRlbXBsYXRlIiwib25CZWZvcmVEZXN0cm95IiwiZGVzdHJveSIsInVwZGF0ZUNvdW50ZXIiLCJpdGVtcyIsInRleHQiLCJwYWdlU3RhcnQiLCJzdGF0ZSIsImN1cnJlbnRQYWdlIiwicGFnZVNpemUiLCJwYWdlRW5kIiwidG90YWxSZWNvcmRzIiwidG9Mb2NhbGVTdHJpbmciLCJvbkF0dGFjaCIsImNvbHVtbnMiLCJuYW1lIiwibGFiZWwiLCJjZWxsIiwiZWRpdGFibGUiLCJlbCIsImNvbGxlY3Rpb24iLCJub0xvYWQiLCJydW4iLCJiaW5kRXZlbnRzIiwicHJlcGVuZCIsImZpbHRlciIsImZpbHRlckNvbnRhaW5lciIsImZpbHRlcnMiLCJkZWZhdWx0RmlsdGVycyIsInJlbmRlciIsImFwcGVuZCIsInBhZ2luZyIsIm1vZGVsQWRkIiwibW9kZWwiLCJmdWxsQ29sbGVjdGlvbiIsIm1vZGVsQ2hhbmdlIiwiZ2V0IiwibW9kZWxSZW1vdmUiLCJldnQiLCJ0YXJnZXQiLCJoYXNDbGFzcyIsImlnbm9yZSIsInNhdmUiLCJxdWV1ZWQiLCJwZW5kaW5nIiwiZmFpbGVkIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7QUFDQSxJQUFNQyxJQUFJRCxRQUFRLFFBQVIsQ0FBVjs7QUFFQSxJQUFNRSxPQUFPRixRQUFRLGdCQUFSLENBQWI7O0FBRUFHLE9BQU9DLE9BQVAsR0FBaUJMLFNBQVNNLFVBQVQsQ0FBb0JDLElBQXBCLENBQXlCQyxNQUF6QixDQUFnQztBQUNoREMsWUFBVyxpQkFEcUM7O0FBR2hEQyxLQUFJO0FBQ0hDLGlCQUFlLGlCQURaO0FBRUhDLGFBQVcsbUJBRlI7QUFHSEMsY0FBWSxtQkFIVDtBQUlIQyxRQUFNLFVBSkg7O0FBTUhDLFNBQU87QUFOSixFQUg0Qzs7QUFZaERDLG1CQUFrQjtBQUNqQkMsT0FBSyxVQURZO0FBRWpCQyxVQUFRLGFBRlM7QUFHakJDLFVBQVEsYUFIUztBQUlqQkMsUUFBTTtBQUpXLEVBWjhCOztBQW1CaERDLGFBQVk7QUFDWDtBQUNBLHFCQUFtQjtBQUZSLEVBbkJvQzs7QUF3QmhEQyxXQUFVckIsUUFBUSw0QkFBUixDQXhCc0M7O0FBMEJoRHNCLGtCQUFpQiwyQkFBVztBQUMzQixNQUFJLEtBQUtULElBQVQsRUFDQyxLQUFLQSxJQUFMLENBQVVVLE9BQVY7QUFDRCxFQTdCK0M7O0FBK0JoREMsZ0JBQWUseUJBQVc7QUFDekIsTUFBSSxDQUFDLEtBQUtDLEtBQVYsRUFBaUI7QUFDaEIsUUFBS2hCLEVBQUwsQ0FBUUMsYUFBUixDQUFzQmdCLElBQXRCLENBQTJCLEdBQTNCO0FBQ0E7QUFDQTtBQUNELE1BQU1DLFlBQWMsQ0FBQyxLQUFLRixLQUFMLENBQVdHLEtBQVgsQ0FBaUJDLFdBQWpCLEdBQStCLENBQWhDLElBQXFDLEtBQUtKLEtBQUwsQ0FBV0csS0FBWCxDQUFpQkUsUUFBdkQsR0FBbUUsQ0FBdEY7QUFDQSxNQUFJQyxVQUFZLEtBQUtOLEtBQUwsQ0FBV0csS0FBWCxDQUFpQkMsV0FBbEIsR0FBaUMsS0FBS0osS0FBTCxDQUFXRyxLQUFYLENBQWlCRSxRQUFqRTtBQUNBLE1BQUlDLFVBQVUsS0FBS04sS0FBTCxDQUFXRyxLQUFYLENBQWlCSSxZQUEvQixFQUNDRCxVQUFVLEtBQUtOLEtBQUwsQ0FBV0csS0FBWCxDQUFpQkksWUFBM0I7O0FBRUQsTUFBSU4sT0FBTyxxQkFBcUIsS0FBS0QsS0FBTCxDQUFXRyxLQUFYLENBQWlCSSxZQUFqQixLQUFrQyxDQUFsQyxHQUFzQyxDQUF0QyxHQUEwQ0wsU0FBL0QsSUFBNEUsS0FBNUUsR0FBb0ZJLE9BQXBGLEdBQThGLE1BQTlGLEdBQXVHLENBQUMsS0FBS04sS0FBTCxDQUFXRyxLQUFYLENBQWlCSSxZQUFqQixJQUFpQyxDQUFsQyxFQUFxQ0MsY0FBckMsRUFBbEg7QUFDQSxNQUFJLEtBQUtSLEtBQUwsQ0FBV0csS0FBWCxDQUFpQkksWUFBakIsS0FBa0MsSUFBdEMsRUFDQ04sT0FBTyxhQUFQOztBQUVELE9BQUtqQixFQUFMLENBQVFDLGFBQVIsQ0FBc0JnQixJQUF0QixDQUEyQixLQUFLRCxLQUFMLENBQVdHLEtBQVgsQ0FBaUJJLFlBQTVDOztBQUVBLE9BQUt2QixFQUFMLENBQVFHLFVBQVIsQ0FBbUJjLElBQW5CLENBQXdCQSxJQUF4QjtBQUNBLEVBaEQrQzs7QUFrRGhEUSxXQUFVLG9CQUFXO0FBQ3BCLE1BQU1DLFVBQVUsQ0FDZixFQUFFQyxNQUFNLFNBQVIsRUFBbUJDLE9BQU8sVUFBMUIsRUFBc0NDLE1BQU0sUUFBNUMsRUFBc0RDLFVBQVUsS0FBaEUsRUFEZSxDQUFoQjs7QUFJQSxPQUFLMUIsSUFBTCxHQUFZLElBQUlYLElBQUosQ0FBUyxFQUFFc0MsSUFBSSxLQUFLL0IsRUFBTCxDQUFRSSxJQUFkLEVBQW9Cc0IsU0FBU0EsT0FBN0IsRUFBc0NNLFlBQVksS0FBS0EsVUFBdkQsRUFBbUVYLFVBQVUsRUFBN0UsRUFBaUZZLFFBQVEsSUFBekYsRUFBVCxDQUFaOztBQUVBLE9BQUtELFVBQUwsQ0FBZ0JFLEdBQWhCLEdBQXNCLElBQXRCOztBQUVBLE9BQUtsQixLQUFMLEdBQWEsS0FBS1osSUFBTCxDQUFVNEIsVUFBdkI7O0FBRUEsT0FBS0csVUFBTCxDQUFnQixLQUFLbkIsS0FBckIsRUFBNEIsS0FBS0wsVUFBakM7O0FBRUEsT0FBS1gsRUFBTCxDQUFRRSxTQUFSLENBQWtCa0MsT0FBbEIsQ0FBMEIsS0FBS2hDLElBQUwsQ0FBVWlDLE1BQVYsQ0FBaUI7QUFDMUNDLG9CQUFpQixLQUFLdEMsRUFBTCxDQUFRRSxTQURpQjtBQUUxQ3FDLFlBQVMsRUFGaUM7QUFHMUNDLG1CQUFnQjtBQUgwQixHQUFqQixFQUl2QkMsTUFKdUIsR0FJZFYsRUFKWjs7QUFNQXZDLElBQUUsU0FBRixFQUFhLEtBQUt1QyxFQUFsQixFQUFzQlcsTUFBdEIsQ0FBNkIsS0FBS3RDLElBQUwsQ0FBVXVDLE1BQVYsR0FBbUJGLE1BQW5CLEdBQTRCVixFQUF6RDs7QUFFQSxPQUFLaEIsYUFBTDtBQUNBLEVBeEUrQzs7QUEwRWhENkIsV0FBVSxrQkFBU0MsS0FBVCxFQUFnQjtBQUN6QixPQUFLN0IsS0FBTCxDQUFXOEIsY0FBWCxDQUEwQnZDLEdBQTFCLENBQThCc0MsS0FBOUI7O0FBRUEsT0FBSzlCLGFBQUw7QUFDQSxFQTlFK0M7O0FBZ0ZoRGdDLGNBQWEscUJBQVNGLEtBQVQsRUFBZ0I7QUFDNUIsTUFBSUEsTUFBTUcsR0FBTixDQUFVLFFBQVYsQ0FBSixFQUNDLE9BQU8sS0FBS2hDLEtBQUwsQ0FBVzhCLGNBQVgsQ0FBMEJyQyxNQUExQixDQUFpQ29DLEtBQWpDLENBQVA7O0FBRUQ7QUFDQSxPQUFLOUIsYUFBTDtBQUNBLEVBdEYrQzs7QUF3RmhEa0MsY0FBYSxxQkFBU0osS0FBVCxFQUFnQjtBQUM1QixNQUFJLENBQUMsS0FBSzdCLEtBQVYsRUFDQztBQUNELE9BQUtBLEtBQUwsQ0FBVzhCLGNBQVgsQ0FBMEJyQyxNQUExQixDQUFpQ29DLEtBQWpDO0FBQ0EsT0FBSzlCLGFBQUw7QUFDQSxFQTdGK0M7O0FBK0ZoRFYsUUFBTyxlQUFTd0MsS0FBVCxFQUFnQkssR0FBaEIsRUFBcUI7QUFDM0IsTUFBTW5CLEtBQUt2QyxFQUFFMEQsSUFBSUMsTUFBTixDQUFYO0FBQ0EsTUFBTTlDLFFBQVEwQixHQUFHcUIsUUFBSCxDQUFZLE9BQVosQ0FBZDtBQUNBLE1BQU1DLFNBQVN0QixHQUFHcUIsUUFBSCxDQUFZLFFBQVosQ0FBZjtBQUNBUCxRQUFNUyxJQUFOLENBQVcsRUFBRUMsUUFBUWxELEtBQVYsRUFBaUJnRCxRQUFRQSxNQUF6QixFQUFpQ0csU0FBUyxJQUExQyxFQUFnREMsUUFBUSxJQUF4RCxFQUE4RHRDLE9BQU8sQ0FBckUsRUFBWDtBQUNBO0FBcEcrQyxDQUFoQyxDQUFqQiIsImZpbGUiOiJ3YXJuaW5ncy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcblxuY29uc3QgR3JpZCA9IHJlcXVpcmUoXCIuLi8uLi9saWIvZ3JpZFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcImltcG9ydC13YXJuaW5nc1wiLFxuXG5cdHVpOiB7XG5cdFx0aGVhZGVyQ291bnRlcjogXCIjaGVhZGVyLWNvdW50ZXJcIixcblx0XHRmaWx0ZXJCYXI6IFwiLm9wcy1iYXIgLmZpbHRlcnNcIixcblx0XHRjb3VudGVyQmFyOiBcIi5vcHMtYmFyIC5jb3VudGVyXCIsXG5cdFx0Z3JpZDogXCJkaXYuZ3JpZFwiLFxuXG5cdFx0cmV0cnk6IFwiYnV0dG9uLnJldHJ5XCIsXG5cdH0sXG5cblx0Y29sbGVjdGlvbkV2ZW50czoge1xuXHRcdGFkZDogXCJtb2RlbEFkZFwiLFxuXHRcdGNoYW5nZTogXCJtb2RlbENoYW5nZVwiLFxuXHRcdHJlbW92ZTogXCJtb2RlbFJlbW92ZVwiLFxuXHRcdHN5bmM6IFwidXBkYXRlQ291bnRlclwiLFxuXHR9LFxuXG5cdGl0ZW1FdmVudHM6IHtcblx0XHQvL1wic3luYyByZXNldFwiOiBcInVwZGF0ZUNvdW50ZXJcIixcblx0XHRcInJvdzpjdXN0b21jbGlja1wiOiBcInJldHJ5XCIsXG5cdH0sXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvd2FybmluZ3MubnVualwiKSxcblxuXHRvbkJlZm9yZURlc3Ryb3k6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICh0aGlzLmdyaWQpXG5cdFx0XHR0aGlzLmdyaWQuZGVzdHJveSgpO1xuXHR9LFxuXG5cdHVwZGF0ZUNvdW50ZXI6IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghdGhpcy5pdGVtcykge1xuXHRcdFx0dGhpcy51aS5oZWFkZXJDb3VudGVyLnRleHQoXCIwXCIpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBwYWdlU3RhcnQgPSAoKCh0aGlzLml0ZW1zLnN0YXRlLmN1cnJlbnRQYWdlIC0gMSkgKiB0aGlzLml0ZW1zLnN0YXRlLnBhZ2VTaXplKSArIDEpO1xuXHRcdGxldCBwYWdlRW5kID0gKCh0aGlzLml0ZW1zLnN0YXRlLmN1cnJlbnRQYWdlKSAqIHRoaXMuaXRlbXMuc3RhdGUucGFnZVNpemUpO1xuXHRcdGlmIChwYWdlRW5kID4gdGhpcy5pdGVtcy5zdGF0ZS50b3RhbFJlY29yZHMpXG5cdFx0XHRwYWdlRW5kID0gdGhpcy5pdGVtcy5zdGF0ZS50b3RhbFJlY29yZHM7XG5cblx0XHRsZXQgdGV4dCA9IFwiUXVldWUgd2FybmluZ3MgXCIgKyAodGhpcy5pdGVtcy5zdGF0ZS50b3RhbFJlY29yZHMgPT09IDAgPyAwIDogcGFnZVN0YXJ0KSArIFwiIC0gXCIgKyBwYWdlRW5kICsgXCIgb2YgXCIgKyAodGhpcy5pdGVtcy5zdGF0ZS50b3RhbFJlY29yZHMgfHwgMCkudG9Mb2NhbGVTdHJpbmcoKTtcblx0XHRpZiAodGhpcy5pdGVtcy5zdGF0ZS50b3RhbFJlY29yZHMgPT09IG51bGwpXG5cdFx0XHR0ZXh0ID0gXCJObyB3YXJuaW5nc1wiO1xuXG5cdFx0dGhpcy51aS5oZWFkZXJDb3VudGVyLnRleHQodGhpcy5pdGVtcy5zdGF0ZS50b3RhbFJlY29yZHMpO1xuXG5cdFx0dGhpcy51aS5jb3VudGVyQmFyLnRleHQodGV4dCk7XG5cdH0sXG5cblx0b25BdHRhY2g6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGNvbHVtbnMgPSBbXG5cdFx0XHR7IG5hbWU6IFwibWVzc2FnZVwiLCBsYWJlbDogXCJXYXJuaW5nc1wiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRdO1xuXG5cdFx0dGhpcy5ncmlkID0gbmV3IEdyaWQoeyBlbDogdGhpcy51aS5ncmlkLCBjb2x1bW5zOiBjb2x1bW5zLCBjb2xsZWN0aW9uOiB0aGlzLmNvbGxlY3Rpb24sIHBhZ2VTaXplOiAxNSwgbm9Mb2FkOiB0cnVlIH0pO1xuXG5cdFx0dGhpcy5jb2xsZWN0aW9uLnJ1biA9IHRydWU7XG5cblx0XHR0aGlzLml0ZW1zID0gdGhpcy5ncmlkLmNvbGxlY3Rpb247XG5cblx0XHR0aGlzLmJpbmRFdmVudHModGhpcy5pdGVtcywgdGhpcy5pdGVtRXZlbnRzKTtcblxuXHRcdHRoaXMudWkuZmlsdGVyQmFyLnByZXBlbmQodGhpcy5ncmlkLmZpbHRlcih7XG5cdFx0XHRmaWx0ZXJDb250YWluZXI6IHRoaXMudWkuZmlsdGVyQmFyLFxuXHRcdFx0ZmlsdGVyczogW10sXG5cdFx0XHRkZWZhdWx0RmlsdGVyczogW10sXG5cdFx0fSkucmVuZGVyKCkuZWwpO1xuXG5cdFx0JChcIi5wYWdpbmdcIiwgdGhpcy5lbCkuYXBwZW5kKHRoaXMuZ3JpZC5wYWdpbmcoKS5yZW5kZXIoKS5lbCk7XG5cblx0XHR0aGlzLnVwZGF0ZUNvdW50ZXIoKTtcblx0fSxcblxuXHRtb2RlbEFkZDogZnVuY3Rpb24obW9kZWwpIHtcblx0XHR0aGlzLml0ZW1zLmZ1bGxDb2xsZWN0aW9uLmFkZChtb2RlbCk7XG5cblx0XHR0aGlzLnVwZGF0ZUNvdW50ZXIoKTtcblx0fSxcblxuXHRtb2RlbENoYW5nZTogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRpZiAobW9kZWwuZ2V0KFwiaWdub3JlXCIpKVxuXHRcdFx0cmV0dXJuIHRoaXMuaXRlbXMuZnVsbENvbGxlY3Rpb24ucmVtb3ZlKG1vZGVsKTtcblxuXHRcdC8vdGhpcy5pdGVtcy5mdWxsQ29sbGVjdGlvbi5zZXQobW9kZWwpO1xuXHRcdHRoaXMudXBkYXRlQ291bnRlcigpO1xuXHR9LFxuXG5cdG1vZGVsUmVtb3ZlOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdGlmICghdGhpcy5pdGVtcylcblx0XHRcdHJldHVybjtcblx0XHR0aGlzLml0ZW1zLmZ1bGxDb2xsZWN0aW9uLnJlbW92ZShtb2RlbCk7XG5cdFx0dGhpcy51cGRhdGVDb3VudGVyKCk7XG5cdH0sXG5cblx0cmV0cnk6IGZ1bmN0aW9uKG1vZGVsLCBldnQpIHtcblx0XHRjb25zdCBlbCA9ICQoZXZ0LnRhcmdldCk7XG5cdFx0Y29uc3QgcmV0cnkgPSBlbC5oYXNDbGFzcyhcInJldHJ5XCIpO1xuXHRcdGNvbnN0IGlnbm9yZSA9IGVsLmhhc0NsYXNzKFwiaWdub3JlXCIpO1xuXHRcdG1vZGVsLnNhdmUoeyBxdWV1ZWQ6IHJldHJ5LCBpZ25vcmU6IGlnbm9yZSwgcGVuZGluZzogdHJ1ZSwgZmFpbGVkOiBudWxsLCBzdGF0ZTogMCB9KTtcblx0fSxcbn0pOyJdfQ==",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\n\nvar ManageUserView = require(\"./views/usermanage\");\n\nvar Module = module.exports = new Backbone.Marionette.Application();\n\n// Add intra-module routing\nModule.routing = function (App) {\n\tModule.Router = {\n\t\troutes: {\n\t\t\tmanage: \"manageUsers\"\n\t\t},\n\n\t\tmanageUsers: function manageUsers() {\n\t\t\t//\t\t\tApp.loadView(new UserManager());\n\t\t\tApp.loadView(new ManageUserView());\n\t\t}\n\t};\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbIkJhY2tib25lIiwicmVxdWlyZSIsIk1hbmFnZVVzZXJWaWV3IiwiTW9kdWxlIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1hcmlvbmV0dGUiLCJBcHBsaWNhdGlvbiIsInJvdXRpbmciLCJSb3V0ZXIiLCJyb3V0ZXMiLCJtYW5hZ2UiLCJtYW5hZ2VVc2VycyIsIkFwcCIsImxvYWRWaWV3Il0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxXQUFXQyxRQUFRLFVBQVIsQ0FBakI7O0FBRUEsSUFBTUMsaUJBQWlCRCxRQUFRLG9CQUFSLENBQXZCOztBQUVBLElBQU1FLFNBQVNDLE9BQU9DLE9BQVAsR0FBaUIsSUFBSUwsU0FBU00sVUFBVCxDQUFvQkMsV0FBeEIsRUFBaEM7O0FBRUE7QUFDQUosT0FBT0ssT0FBUCxHQUFpQixlQUFPO0FBQ3ZCTCxRQUFPTSxNQUFQLEdBQWdCO0FBQ2ZDLFVBQVE7QUFDUEMsV0FBUTtBQURELEdBRE87O0FBS2ZDLGVBQWEsdUJBQVc7QUFDdkI7QUFDQUMsT0FBSUMsUUFBSixDQUFhLElBQUlaLGNBQUosRUFBYjtBQUNBO0FBUmMsRUFBaEI7QUFVQSxDQVhEIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcblxuY29uc3QgTWFuYWdlVXNlclZpZXcgPSByZXF1aXJlKFwiLi92aWV3cy91c2VybWFuYWdlXCIpO1xuXG5jb25zdCBNb2R1bGUgPSBtb2R1bGUuZXhwb3J0cyA9IG5ldyBCYWNrYm9uZS5NYXJpb25ldHRlLkFwcGxpY2F0aW9uKCk7XG5cbi8vIEFkZCBpbnRyYS1tb2R1bGUgcm91dGluZ1xuTW9kdWxlLnJvdXRpbmcgPSBBcHAgPT4ge1xuXHRNb2R1bGUuUm91dGVyID0ge1xuXHRcdHJvdXRlczoge1xuXHRcdFx0bWFuYWdlOiBcIm1hbmFnZVVzZXJzXCIsXG5cdFx0fSxcblxuXHRcdG1hbmFnZVVzZXJzOiBmdW5jdGlvbigpIHtcblx0XHRcdC8vXHRcdFx0QXBwLmxvYWRWaWV3KG5ldyBVc2VyTWFuYWdlcigpKTtcblx0XHRcdEFwcC5sb2FkVmlldyhuZXcgTWFuYWdlVXNlclZpZXcoKSk7XG5cdFx0fSxcblx0fTtcbn07Il19",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar information_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"information-profile\\\">\\n\\t\\t<div class=\\\"profile-icon\\\">\\n\\t\\t\\t<span class=\\\"fal fa-user-circle\\\"/>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"profile-names\\\">\\n\\t\\t\\t<span class=\\\"profile-names-real\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"firstname\")), env.opts.autoescape);\noutput += \"&nbsp;\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"surname\")), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t\\t<span class=\\\"profile-names-user\\\">(\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"username\")), env.opts.autoescape);\noutput += \")</span>\\n\\t\\t\\t<span class=\\\"profile-email\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"email\")), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"profile-roles\\\">\\n\\t\\t\\t<span>\";\noutput += runtime.suppressValue(runtime.contextOrFrameLookup(context, frame, \"userGrade\"), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar information_oldRoot = information_obj.root;\ninformation_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tinformation_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar groupListEmpty_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span>User is not a member of any group.</span>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar groupListEmpty_oldRoot = groupListEmpty_obj.root;\ngroupListEmpty_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tgroupListEmpty_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar groupListItem_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t\";\nif((!runtime.contextOrFrameLookup(context, frame, \"private\"))) {\noutput += \"\\n\\t\\t<span class=\\\"fal fa-users-class global-group-list-glyph\\\" />\\n\\t\";\n;\n}\noutput += \"\\n\\n\\t<span class=\\\"\";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"private\")?\"custom-group-indent-level-1\":\"\"), env.opts.autoescape);\noutput += \"\\\">\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"name\")), env.opts.autoescape);\noutput += \"</span>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar groupListItem_oldRoot = groupListItem_obj.root;\ngroupListItem_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tgroupListItem_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar bookListEmpty_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span>User does not have any books.</span>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar bookListEmpty_oldRoot = bookListEmpty_obj.root;\nbookListEmpty_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tbookListEmpty_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar bookListItem_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<span>\";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"title\")?runtime.contextOrFrameLookup(context, frame, \"title\"):env.getFilter(\"escape\").call(context, runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"metadata\")),\"title\"))), env.opts.autoescape);\noutput += \"</span>\\n\\n\\t<div class=\\\"user-details-book-list-item-metadata\\\">\\n\\t\\t<span>ISBN:&nbsp;\";\noutput += runtime.suppressValue(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"metadata\")),\"isbn\"), env.opts.autoescape);\noutput += \"</span>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar bookListItem_oldRoot = bookListItem_obj.root;\nbookListItem_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tbookListItem_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar layout_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"button-close\\\">\\n\\t\\t<span class=\\\"fal fa-times\\\"/>\\n\\t</div>\\n\\n\\t<div class=\\\"status-region\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"information-region hide\\\">\\n\\t</div>\\n\\n\\t<div class=\\\"list-header-container hide\\\">\\n\\t\\t<div>\\n\\t\\t\\t<span>Groups</span>\\n\\t\\t</div>\\n\\n\\t\\t<div>\\n\\t\\t\\t<span>Books</span>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\t<div class=\\\"list-container hide\\\">\\n\\t\\t<div class=\\\"group-region\\\">\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"book-region\\\">\\n\\t\\t</div>\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar layout_oldRoot = layout_obj.root;\nlayout_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tlayout_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"information\": new nunjucks.Template( {obj: information_obj, type: \"code\"}, env),\t\"groupListEmpty\": new nunjucks.Template( {obj: groupListEmpty_obj, type: \"code\"}, env),\t\"groupListItem\": new nunjucks.Template( {obj: groupListItem_obj, type: \"code\"}, env),\t\"bookListEmpty\": new nunjucks.Template( {obj: bookListEmpty_obj, type: \"code\"}, env),\t\"bookListItem\": new nunjucks.Template( {obj: bookListItem_obj, type: \"code\"}, env),\t\"layout\": new nunjucks.Template( {obj: layout_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar content_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t\";\nvar t_1;\nt_1 = !(lineno = 1, colno = 24, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isNew\"), \"isNew\", context, [])) && ((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"externalSync\")),\"students\") == \"rw\" && (lineno = 1, colno = 80, runtime.callWrap(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"roles\")),\"indexOf\"), \"roles[\\\"indexOf\\\"]\", context, [\"student\"])) > -1) || (runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"externalSync\")),\"teachers\") == \"rw\" && (lineno = 1, colno = 149, runtime.callWrap(runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"roles\")),\"indexOf\"), \"roles[\\\"indexOf\\\"]\", context, [\"teacher\"])) > -1));\nframe.set(\"locked\", t_1, true);\nif(frame.topLevel) {\ncontext.setVariable(\"locked\", t_1);\n}\nif(frame.topLevel) {\ncontext.addExport(\"locked\", t_1);\n}\noutput += \"\\n\\n\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"locked\")) {\noutput += \"\\n\\t\\t<p class=\\\"inline\\\">Some fields are locked due to external sync behaviour.</p>\\n\\t\";\n;\n}\noutput += \"\\n\\n\\t\";\nif(!(lineno = 7, colno = 14, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isNew\"), \"isNew\", context, [])) && (lineno = 7, colno = 30, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"wrongSalt\"), \"wrongSalt\", context, []))) {\noutput += \"\\n\\t\\t\";\nif(runtime.contextOrFrameLookup(context, frame, \"userDataSource\") == \"moodle\") {\noutput += \"\\n\\t\\t\\t<p class=\\\"inline error\\\">THIS USER'S MOODLE SALT IS WRONG. FIX THIS IN MYSQL.</p>\\n\\t\\t\";\n;\n}\nelse {\noutput += \"\\n\\t\\t\\t<p class=\\\"inline error\\\">This user has an invalid salt, but Moodle is not the data source. Change or reset the user's password to fix this.</p>\\n\\t\\t\";\n;\n}\noutput += \"\\n\\t\";\n;\n}\noutput += \"\\n\\n\\t<div class=\\\"row\\\">\\n\\t\\t<div class=\\\"large-4 columns\\\">\\n\\t\\t\\t<label>\\n\\t\\t\\t\\t<input type=\\\"checkbox\\\" name=\\\"enabled\\\" \";\noutput += runtime.suppressValue(((lineno = 18, colno = 61, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isNew\"), \"isNew\", context, [])) || runtime.contextOrFrameLookup(context, frame, \"enabled\")?\"checked\":\"\"), env.opts.autoescape);\noutput += \" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"locked\") || !(lineno = 18, colno = 121, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, []))?\"disabled\":\"\"), env.opts.autoescape);\noutput += \">\\n\\t\\t\\t\\tEnabled\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\t\\t<div class=\\\"large-4 columns\\\">\\n\\t\\t\\t<label>\\n\\t\\t\\t\\t<input type=\\\"checkbox\\\" name=\\\"restricted\\\" \";\noutput += runtime.suppressValue((((lineno = 24, colno = 65, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isNew\"), \"isNew\", context, [])) && runtime.contextOrFrameLookup(context, frame, \"restrictByDefault\")) || runtime.contextOrFrameLookup(context, frame, \"restricted\")?\"checked\":\"\"), env.opts.autoescape);\noutput += \" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"locked\") || !(lineno = 24, colno = 151, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, []))?\"disabled\":\"\"), env.opts.autoescape);\noutput += \">\\n\\t\\t\\t\\tRestricted\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<label>\\n\\t\\t\\t\\t<span class=\\\"roles-label\\\">Account Roles</span><br/>\\n\\t\\t\\t\\t<select multiple name=\\\"roles\\\"/>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t\";\nframe = frame.push();\nvar t_4 = runtime.contextOrFrameLookup(context, frame, \"grantList\");\nif(t_4) {var t_2;\nif(runtime.isArray(t_4)) {\nvar t_3 = t_4.length;\nfor(t_2=0; t_2 < t_4.length; t_2++) {\nvar t_5 = t_4[t_2][0]\nframe.set(\"key\", t_4[t_2][0]);\nvar t_6 = t_4[t_2][1]\nframe.set(\"grant\", t_4[t_2][1]);\nframe.set(\"loop.index\", t_2 + 1);\nframe.set(\"loop.index0\", t_2);\nframe.set(\"loop.revindex\", t_3 - t_2);\nframe.set(\"loop.revindex0\", t_3 - t_2 - 1);\nframe.set(\"loop.first\", t_2 === 0);\nframe.set(\"loop.last\", t_2 === t_3 - 1);\nframe.set(\"loop.length\", t_3);\noutput += \"\\n\\t\\t\\t<div class=\\\"large-12 columns \";\noutput += runtime.suppressValue(runtime.memberLookup((t_6),\"grant\"), env.opts.autoescape);\noutput += \"-all \";\noutput += runtime.suppressValue(((lineno = 37, colno = 73, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"hasFullGrantRole\"), \"hasFullGrantRole\", context, [t_5]))?\"\":\"hide\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t<div class=\\\"textual\\\">\";\noutput += runtime.suppressValue(runtime.memberLookup((t_6),\"name\"), env.opts.autoescape);\noutput += \": <strong>Full Access</strong></div>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t\";\nif((lineno = 43, colno = 23, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isGrantPermitted\"), \"isGrantPermitted\", context, [t_5]))) {\noutput += \"\\n\\t\\t\\t\\t<div class=\\\"large-12 columns \";\noutput += runtime.suppressValue(runtime.memberLookup((t_6),\"grant\"), env.opts.autoescape);\noutput += \" \";\noutput += runtime.suppressValue(((lineno = 44, colno = 66, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"hasGrantRole\"), \"hasGrantRole\", context, [t_5])) && !(lineno = 44, colno = 96, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"hasFullGrantRole\"), \"hasFullGrantRole\", context, [t_5]))?\"\":\"hide\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t\\t<span class=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_6),\"grant\"), env.opts.autoescape);\noutput += \"-label\\\">\";\noutput += runtime.suppressValue(runtime.memberLookup((t_6),\"name\"), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t\\t\\t\\t\\t<select name=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_6),\"grant\"), env.opts.autoescape);\noutput += \"\\\" multiple class=\\\"select-grant\\\"/>\\n\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\";\n;\n}\nelse {\nif((lineno = 50, colno = 21, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"hasGrantRole\"), \"hasGrantRole\", context, [t_5]))) {\noutput += \"\\n\\t\\t\\t\\t<div class=\\\"large-12 columns \";\noutput += runtime.suppressValue(runtime.memberLookup((t_6),\"grant\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t\\t<span class=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_6),\"grant\"), env.opts.autoescape);\noutput += \"-label\\\">\";\noutput += runtime.suppressValue(runtime.memberLookup((t_6),\"name\"), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t\\t\\t\\t\\t<select name=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_6),\"grant\"), env.opts.autoescape);\noutput += \"\\\" multiple class=\\\"select-grant\\\" disabled/>\\n\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\";\n;\n}\n;\n}\noutput += \"\\n\\t\\t\";\n;\n}\n} else {\nt_2 = -1;\nvar t_3 = runtime.keys(t_4).length;\nfor(var t_7 in t_4) {\nt_2++;\nvar t_8 = t_4[t_7];\nframe.set(\"key\", t_7);\nframe.set(\"grant\", t_8);\nframe.set(\"loop.index\", t_2 + 1);\nframe.set(\"loop.index0\", t_2);\nframe.set(\"loop.revindex\", t_3 - t_2);\nframe.set(\"loop.revindex0\", t_3 - t_2 - 1);\nframe.set(\"loop.first\", t_2 === 0);\nframe.set(\"loop.last\", t_2 === t_3 - 1);\nframe.set(\"loop.length\", t_3);\noutput += \"\\n\\t\\t\\t<div class=\\\"large-12 columns \";\noutput += runtime.suppressValue(runtime.memberLookup((t_8),\"grant\"), env.opts.autoescape);\noutput += \"-all \";\noutput += runtime.suppressValue(((lineno = 37, colno = 73, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"hasFullGrantRole\"), \"hasFullGrantRole\", context, [t_7]))?\"\":\"hide\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t<div class=\\\"textual\\\">\";\noutput += runtime.suppressValue(runtime.memberLookup((t_8),\"name\"), env.opts.autoescape);\noutput += \": <strong>Full Access</strong></div>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t\";\nif((lineno = 43, colno = 23, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isGrantPermitted\"), \"isGrantPermitted\", context, [t_7]))) {\noutput += \"\\n\\t\\t\\t\\t<div class=\\\"large-12 columns \";\noutput += runtime.suppressValue(runtime.memberLookup((t_8),\"grant\"), env.opts.autoescape);\noutput += \" \";\noutput += runtime.suppressValue(((lineno = 44, colno = 66, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"hasGrantRole\"), \"hasGrantRole\", context, [t_7])) && !(lineno = 44, colno = 96, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"hasFullGrantRole\"), \"hasFullGrantRole\", context, [t_7]))?\"\":\"hide\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t\\t<span class=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_8),\"grant\"), env.opts.autoescape);\noutput += \"-label\\\">\";\noutput += runtime.suppressValue(runtime.memberLookup((t_8),\"name\"), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t\\t\\t\\t\\t<select name=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_8),\"grant\"), env.opts.autoescape);\noutput += \"\\\" multiple class=\\\"select-grant\\\"/>\\n\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\";\n;\n}\nelse {\nif((lineno = 50, colno = 21, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"hasGrantRole\"), \"hasGrantRole\", context, [t_7]))) {\noutput += \"\\n\\t\\t\\t\\t<div class=\\\"large-12 columns \";\noutput += runtime.suppressValue(runtime.memberLookup((t_8),\"grant\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t\\t<span class=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_8),\"grant\"), env.opts.autoescape);\noutput += \"-label\\\">\";\noutput += runtime.suppressValue(runtime.memberLookup((t_8),\"name\"), env.opts.autoescape);\noutput += \"</span>\\n\\t\\t\\t\\t\\t\\t<select name=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_8),\"grant\"), env.opts.autoescape);\noutput += \"\\\" multiple class=\\\"select-grant\\\" disabled/>\\n\\t\\t\\t\\t\\t</label>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t\";\n;\n}\n;\n}\noutput += \"\\n\\t\\t\";\n;\n}\n}\n}\nframe = frame.pop();\noutput += \"\\n\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<label>\\n\\t\\t\\t\\t<span class=\\\"username-label\\\">Username</span>\\n\\t\\t\\t\\t<div class=\\\"relative\\\">\\n\\t\\t\\t\\t\\t<input type=\\\"text\\\" name=\\\"username\\\" placeholder=\\\"Username\\\" value=\\\"\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"username\")), env.opts.autoescape);\noutput += \"\\\" \";\noutput += runtime.suppressValue((!(lineno = 64, colno = 113, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isNew\"), \"isNew\", context, []))?\"readonly\":\"\"), env.opts.autoescape);\noutput += \">\\n\\t\\t\\t\\t\\t<div class=\\\"input-overlay username-spinner hide\\\" title=\\\"Checking existence...\\\"><span class=\\\"spinner-icon spinner-small\\\"/></div>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<label>\\n\\t\\t\\t\\t<span class=\\\"firstname-label\\\">First Name</span>\\n\\t\\t\\t\\t<input type=\\\"text\\\" name=\\\"firstname\\\" placeholder=\\\"First name\\\" value=\\\"\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"firstname\")), env.opts.autoescape);\noutput += \"\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"locked\") || !(lineno = 73, colno = 129, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, []))?\"readonly\":\"\"), env.opts.autoescape);\noutput += \">\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<label>\\n\\t\\t\\t\\t<span class=\\\"surname-label\\\">Surname</span>\\n\\t\\t\\t\\t<input type=\\\"text\\\" name=\\\"surname\\\" placeholder=\\\"Surname\\\" value=\\\"\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"surname\")), env.opts.autoescape);\noutput += \"\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"locked\") || !(lineno = 80, colno = 122, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, []))?\"readonly\":\"\"), env.opts.autoescape);\noutput += \">\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns grade hide\\\">\\n\\t\\t\\t<label>\\n\\t\\t\\t\\tGrade\\n\\t\\t\\t\\t<div class=\\\"row\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t\\t\\t<select name=\\\"grade\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"locked\") || !(lineno = 89, colno = 64, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, []))?\"disabled\":\"\"), env.opts.autoescape);\noutput += \">\\n\\t\\t\\t\\t\\t\\t\";\nframe = frame.push();\nvar t_11 = runtime.contextOrFrameLookup(context, frame, \"gradeList\");\nif(t_11) {var t_9;\nif(runtime.isArray(t_11)) {\nvar t_10 = t_11.length;\nfor(t_9=0; t_9 < t_11.length; t_9++) {\nvar t_12 = t_11[t_9][0]\nframe.set(\"key\", t_11[t_9][0]);\nvar t_13 = t_11[t_9][1]\nframe.set(\"gradeSet\", t_11[t_9][1]);\nframe.set(\"loop.index\", t_9 + 1);\nframe.set(\"loop.index0\", t_9);\nframe.set(\"loop.revindex\", t_10 - t_9);\nframe.set(\"loop.revindex0\", t_10 - t_9 - 1);\nframe.set(\"loop.first\", t_9 === 0);\nframe.set(\"loop.last\", t_9 === t_10 - 1);\nframe.set(\"loop.length\", t_10);\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t<optgroup label=\\\"\";\noutput += runtime.suppressValue(t_12, env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t\\t\\t\\t\\t\";\nframe = frame.push();\nvar t_16 = t_13;\nif(t_16) {var t_15 = t_16.length;\nfor(var t_14=0; t_14 < t_16.length; t_14++) {\nvar t_17 = t_16[t_14];\nframe.set(\"gr\", t_17);\nframe.set(\"loop.index\", t_14 + 1);\nframe.set(\"loop.index0\", t_14);\nframe.set(\"loop.revindex\", t_15 - t_14);\nframe.set(\"loop.revindex0\", t_15 - t_14 - 1);\nframe.set(\"loop.first\", t_14 === 0);\nframe.set(\"loop.last\", t_14 === t_15 - 1);\nframe.set(\"loop.length\", t_15);\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t\\t<option value=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_17),\"value\"), env.opts.autoescape);\noutput += \"\\\" \";\noutput += runtime.suppressValue((runtime.memberLookup((t_17),\"value\") == runtime.contextOrFrameLookup(context, frame, \"grade\")?\"selected\":\"\"), env.opts.autoescape);\noutput += \">\";\noutput += runtime.suppressValue(runtime.memberLookup((t_17),\"name\"), env.opts.autoescape);\noutput += \"</option>\\n\\t\\t\\t\\t\\t\\t\\t\";\n;\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t</optgroup>\\n\\t\\t\\t\\t\\t\\t\";\n;\n}\n} else {\nt_9 = -1;\nvar t_10 = runtime.keys(t_11).length;\nfor(var t_18 in t_11) {\nt_9++;\nvar t_19 = t_11[t_18];\nframe.set(\"key\", t_18);\nframe.set(\"gradeSet\", t_19);\nframe.set(\"loop.index\", t_9 + 1);\nframe.set(\"loop.index0\", t_9);\nframe.set(\"loop.revindex\", t_10 - t_9);\nframe.set(\"loop.revindex0\", t_10 - t_9 - 1);\nframe.set(\"loop.first\", t_9 === 0);\nframe.set(\"loop.last\", t_9 === t_10 - 1);\nframe.set(\"loop.length\", t_10);\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t<optgroup label=\\\"\";\noutput += runtime.suppressValue(t_18, env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t\\t\\t\\t\\t\";\nframe = frame.push();\nvar t_22 = t_19;\nif(t_22) {var t_21 = t_22.length;\nfor(var t_20=0; t_20 < t_22.length; t_20++) {\nvar t_23 = t_22[t_20];\nframe.set(\"gr\", t_23);\nframe.set(\"loop.index\", t_20 + 1);\nframe.set(\"loop.index0\", t_20);\nframe.set(\"loop.revindex\", t_21 - t_20);\nframe.set(\"loop.revindex0\", t_21 - t_20 - 1);\nframe.set(\"loop.first\", t_20 === 0);\nframe.set(\"loop.last\", t_20 === t_21 - 1);\nframe.set(\"loop.length\", t_21);\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t\\t<option value=\\\"\";\noutput += runtime.suppressValue(runtime.memberLookup((t_23),\"value\"), env.opts.autoescape);\noutput += \"\\\" \";\noutput += runtime.suppressValue((runtime.memberLookup((t_23),\"value\") == runtime.contextOrFrameLookup(context, frame, \"grade\")?\"selected\":\"\"), env.opts.autoescape);\noutput += \">\";\noutput += runtime.suppressValue(runtime.memberLookup((t_23),\"name\"), env.opts.autoescape);\noutput += \"</option>\\n\\t\\t\\t\\t\\t\\t\\t\";\n;\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t\\t\\t\\t\\t\\t</optgroup>\\n\\t\\t\\t\\t\\t\\t\";\n;\n}\n}\n}\nframe = frame.pop();\noutput += \"\\n\\t\\t\\t\\t\\t\\t</select>\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<label>\\n\\t\\t\\t\\t<span class=\\\"email-label\\\">Email</span>\\n\\t\\t\\t\\t<div class=\\\"relative\\\">\\n\\t\\t\\t\\t\\t<input type=\\\"text\\\" name=\\\"email\\\" placeholder=\\\"Email address\\\" value=\\\"\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"email\")), env.opts.autoescape);\noutput += \"\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"locked\") || !(lineno = 107, colno = 123, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, []))?\"readonly\":\"\"), env.opts.autoescape);\noutput += \" autocomplete=\\\"new-password\\\">\\n\\t\\t\\t\\t\\t<div class=\\\"input-overlay email-spinner hide\\\" title=\\\"Checking existence...\\\"><span class=\\\"spinner-icon spinner-small\\\"/></div>\\n\\t\\t\\t\\t</div>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t\";\nif(!(lineno = 113, colno = 15, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isNew\"), \"isNew\", context, [])) && runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"externalSync\")),\"userGroupAllocations\") == \"rw\") {\noutput += \"\\n\\t\\t\\t<div class=\\\"large-12 columns groups\\\">\\n\\t\\t\\t\\t<label>Groups Locked By External Sync<br/>\\n\\t\\t\\t\\t\\t<select name=\\\"locked-groups\\\" data-placeholder=\\\"Groups assigned to this person\\\" multiple disabled></select>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\t\\t\";\n;\n}\noutput += \"\\n\\n\\t\\t\";\nif((lineno = 121, colno = 11, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isNew\"), \"isNew\", context, [])) || runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"externalSync\")),\"userGroupAllocations\") != \"rw\" || runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"externalSync\")),\"groupYearExclusions\")),\"length\")) {\noutput += \"\\n\\t\\t<div class=\\\"large-12 columns hide groups\\\">\\n\\t\\t\\t<label for=\\\"groups\\\">Global Groups&nbsp;&nbsp;[ <input type=\\\"checkbox\\\" name=\\\"current_year_groups\\\" checked> Show only this year's groups ]<br/>\\n\\t\\t\\t\\t<select name=\\\"groups\\\" id=\\\"groups\\\" multiple \";\noutput += runtime.suppressValue((!(lineno = 124, colno = 74, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, []))?\"disabled\":\"\"), env.opts.autoescape);\noutput += \"></select>\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\t\\t\";\n;\n}\noutput += \"\\n\\n\\t\\t\";\nif((lineno = 129, colno = 21, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"corporateClient\"), \"corporateClient\", context, []))) {\noutput += \"\\n\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t<span class=\\\"courseEnrolled-label\\\">Course Enrolled</span>\\n\\t\\t\\t\\t\\t<div class=\\\"relative\\\">\\n\\t\\t\\t\\t\\t\\t<input type=\\\"text\\\" name=\\\"courseEnrolled\\\" placeholder=\\\"Course Enrolled\\\" value=\\\"\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"courseEnrolled\")), env.opts.autoescape);\noutput += \"\\\" >\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t<span class=\\\"dateOfBirth-label\\\">Date Of Birth</span>\\n\\t\\t\\t\\t\\t<div class=\\\"relative\\\">\\n\\t\\t\\t\\t\\t\\t<input type=\\\"text\\\" name=\\\"dateOfBirth\\\" placeholder=\\\"Date Of Birth\\\" value=\\\"\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"dateOfBirth\")), env.opts.autoescape);\noutput += \"\\\" >\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t<span class=\\\"billingAddress-label\\\">Billing Address</span>\\n\\t\\t\\t\\t\\t<div class=\\\"relative\\\">\\n\\t\\t\\t\\t\\t\\t<input type=\\\"text\\\" name=\\\"billingAddress\\\" placeholder=\\\"Billing Address\\\" value=\\\"\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"billingAddress\")), env.opts.autoescape);\noutput += \"\\\" >\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t<span class=\\\"country-label\\\">Country</span>\\n\\t\\t\\t\\t\\t<div class=\\\"relative\\\">\\n\\t\\t\\t\\t\\t\\t<input type=\\\"text\\\" name=\\\"country\\\" placeholder=\\\"Country\\\" value=\\\"\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"country\")), env.opts.autoescape);\noutput += \"\\\" >\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t<span class=\\\"emergencyContact-label\\\">Emergency Contact</span>\\n\\t\\t\\t\\t\\t<div class=\\\"relative\\\">\\n\\t\\t\\t\\t\\t\\t<input type=\\\"text\\\" name=\\\"emergencyContact\\\" placeholder=\\\"emergencyContact\\\" value=\\\"\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"emergencyContact\")), env.opts.autoescape);\noutput += \"\\\" >\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\n\\t\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t\\t<label>\\n\\t\\t\\t\\t\\t<span class=\\\"emergencyRelation-label\\\">Emergency Contact Relation</span>\\n\\t\\t\\t\\t\\t<div class=\\\"relative\\\">\\n\\t\\t\\t\\t\\t\\t<input type=\\\"text\\\" name=\\\"emergencyRelation\\\" placeholder=\\\"Relation of the emergency contact no\\\" value=\\\"\";\noutput += runtime.suppressValue(env.getFilter(\"escape\").call(context, runtime.contextOrFrameLookup(context, frame, \"emergencyRelation\")), env.opts.autoescape);\noutput += \"\\\" >\\n\\t\\t\\t\\t\\t</div>\\n\\t\\t\\t\\t</label>\\n\\t\\t\\t</div>\\n\\t\\t\";\n;\n}\noutput += \"\\n\\n\\t\\t\";\nif(!(lineno = 185, colno = 15, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isNew\"), \"isNew\", context, []))) {\noutput += \"\\n\\t\\t<div class=\\\"large-12 columns\\\">\\n\\t\\t\\t<label>\\n\\t\\t\\t\\t<input type=\\\"checkbox\\\" name=\\\"newPassword\\\" \";\noutput += runtime.suppressValue((runtime.contextOrFrameLookup(context, frame, \"locked\") || !(lineno = 188, colno = 83, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"editable\"), \"editable\", context, []))?\"disabled\":\"\"), env.opts.autoescape);\noutput += \">\\n\\t\\t\\t\\tSet New Password\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\t\\t\";\n;\n}\noutput += \"\\n\\n\\t\\t<div class=\\\"large-12 columns \";\noutput += runtime.suppressValue((!(lineno = 194, colno = 59, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isNew\"), \"isNew\", context, []))?\"hide newPass\":\"\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t<label>\\n\\t\\t\\t\\t<span class=\\\"password-label\\\">Password</span>\\n\\t\\t\\t\\t<input type=\\\"text\\\" style=\\\"display: none;\\\" />\\n\\t\\t\\t\\t<input type=\\\"password\\\" style=\\\"display: none;\\\" />\\n\\t\\t\\t\\t<input type=\\\"password\\\" name=\\\"password\\\" placeholder=\\\"Password\\\" autocomplete=\\\"new-password\\\">\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\n\\t\\t<div class=\\\"large-12 columns \";\noutput += runtime.suppressValue((!(lineno = 203, colno = 59, runtime.callWrap(runtime.contextOrFrameLookup(context, frame, \"isNew\"), \"isNew\", context, []))?\"hide newPass\":\"\"), env.opts.autoescape);\noutput += \"\\\">\\n\\t\\t\\t<label>\\n\\t\\t\\t\\t<span class=\\\"password2-label\\\">Confirm Password</span>\\n\\t\\t\\t\\t<input type=\\\"password\\\" name=\\\"password2\\\" placeholder=\\\"Confirm password\\\">\\n\\t\\t\\t</label>\\n\\t\\t</div>\\n\\t</div>\\n\\n\\n\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar content_oldRoot = content_obj.root;\ncontent_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tcontent_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nvar placeholder_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"\\n\\t<div class=\\\"modal-title\\\">Loading...</div>\\n\\t<div class=\\\"modal-body\\\">\\n\\t\\t<div class=\\\"spinner-icon spinner-small\\\"/> Fetching user data\\n\\t</div>\\n\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar placeholder_oldRoot = placeholder_obj.root;\nplaceholder_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tplaceholder_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = {\n\t\"content\": new nunjucks.Template( {obj: content_obj, type: \"code\"}, env),\t\"placeholder\": new nunjucks.Template( {obj: placeholder_obj, type: \"code\"}, env),};\n",
    "var nunjucks = require( \"nunjucks\" );\nvar env = nunjucks.env || new nunjucks.Environment();env.opts.autoescape = false;\nvar main_obj = (function () {function root(env, context, frame, runtime, cb) {\nvar lineno = null;\nvar colno = null;\nvar output = \"\";\ntry {\nvar parentTemplate = null;\noutput += \"<div class=\\\"header\\\">\\n\\t<h4 class=\\\"title left\\\"><span class=\\\"fal fa-users\\\"/>&nbsp;User Accounts</h4>\\n\\t<div class=\\\"actions\\\">\\n\\t\\t\";\nif((env.getFilter(\"hasAccess\").call(context, runtime.memberLookup((runtime.memberLookup((runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"permissions\")),\"api\")),\"users\")),\"post\")))) {\noutput += \"\\n\\t\\t\\t<div \";\noutput += runtime.suppressValue((!runtime.memberLookup((runtime.contextOrFrameLookup(context, frame, \"settings\")),\"fcClient\")?\"disabled\":\"\"), env.opts.autoescape);\noutput += \" class=\\\"add-user\\\"><span class=\\\"fal fa-plus\\\"/> Add User</div>\\n\\t\\t\";\n;\n}\noutput += \"\\n\\t\\t<div class=\\\"download\\\"><span class=\\\"fal fa-cloud-download\\\"/> Downloads</div>\\n\\t</div>\\n</div>\\n\\n<div class=\\\"ops-bar\\\">\\n\\t<div class=\\\"filters\\\"></div>\\n\\t<div class=\\\"counter\\\"></div>\\n</div>\\n\\n<div class=\\\"grid\\\"></div>\\n\\n<div class=\\\"paging\\\"></div>\";\nif(parentTemplate) {\nparentTemplate.rootRenderFunc(env, context, frame, runtime, cb);\n} else {\ncb(null, output);\n}\n;\n} catch (e) {\n  cb(runtime.handleError(e, lineno, colno));\n}\n}\nreturn {\nroot: root\n};\n})();\nvar main_oldRoot = main_obj.root;\nmain_obj.root = function( env, context, frame, runtime, cb ) {\n\tvar oldGetTemplate = env.getTemplate;\n\tenv.getTemplate = function( name, ec, parentName, cb ) {\n\t\tif( typeof ec === \"function\" ) {\n\t\t\tcb = ec;\n\t\t\tec = false;\n\t\t}\n\t\tvar _require = function(name) {\n\t\t\ttry {\n\t\t\t\treturn require(name);\n\t\t\t} catch (e) {\n\t\t\t\tif ( frame.get( \"_require\" ) ) return frame.get( \"_require\" )( name )\n\t\t\t}\n\t\t};\n\t\tvar tmpl = _require( name );\n\t\tframe.set( \"_require\", _require );\n\t\tif( ec ) tmpl.compile();\n\t\tcb( null, tmpl );\n\t};\tmain_oldRoot( env, context, frame, runtime, function( err, res ) {\n\t\tenv.getTemplate = oldGetTemplate;\n\t\tcb( err, res );\n\t} );\n};\nmodule.exports = new nunjucks.Template( {obj: main_obj, type: \"code\"}, env );\n",
    "\"use strict\";\n\nvar _ = require(\"lodash\");\nvar Backbone = require(\"backbone\");\nvar rester = require(\"rester\");\n\nvar settings = require(\"app-settings\");\n\nvar gradeMap = require(\"../lib/gradeMap\");\n\nmodule.exports = Backbone.Epoxy.Model.extend({\n\tidAttribute: \"_id\",\n\n\turlRoot: function urlRoot() {\n\t\treturn settings.urlRoot + \"/api/1.0/users\";\n\t},\n\n\tcomputeds: {\n\t\tuserGrade: function userGrade() {\n\t\t\treturn this.has(\"grade\") ? gradeMap.codeToHumanValue(this.get(\"grade\"), { lexical: true }) : \"\";\n\t\t},\n\n\t\tuserName: function userName() {\n\t\t\treturn this.get(\"firstname\") + \" \" + this.get(\"surname\");\n\t\t},\n\n\t\tsource: function source() {\n\t\t\tswitch (this.get(\"dataSource\")) {\n\t\t\t\tcase \"hermes\":\n\t\t\t\t\treturn \"Hermes\";\n\t\t\t\tcase \"moodle\":\n\t\t\t\t\treturn \"Moodle\";\n\t\t\t\tdefault:\n\t\t\t\t\treturn \"EC\";\n\t\t\t}\n\t\t},\n\n\t\tuserRoles: function userRoles() {\n\t\t\treturn _.flatMap(this.get(\"roles\"), function (x) {\n\t\t\t\treturn x in settings.roles ? settings.roles[x].name : [];\n\t\t\t}).join(\",\");\n\t\t}\n\t},\n\n\tvalidate: function validate(attrs) {\n\t\tvar ret = {};\n\n\t\tif (!attrs.roles || !attrs.roles.length) ret.roles = \"No roles chosen\";else if (attrs.roles && _.some(_.groupBy(_.flatMap(attrs.roles, function (x) {\n\t\t\treturn (settings.roles[x] || {}).exclusivity || [];\n\t\t})), function (val) {\n\t\t\treturn val.length > 1;\n\t\t})) ret.roles = \"Two or more of your chosen roles are mutually exclusive\";\n\n\t\t// Warn about roles that violate externalSync\n\t\tvar oldRoles = this.get(\"roles\") || [];\n\t\tif (attrs.roles) {\n\t\t\t// eslint-disable-next-line no-sync\n\t\t\tif (!_.includes(oldRoles, \"student\") && _.includes(attrs.roles, \"student\") && settings.externalSync.students === \"rw\") ret.roles = \"Cannot create new students because of external sync behaviour\";\n\t\t\t// eslint-disable-next-line no-sync\n\t\t\telse if (!_.includes(oldRoles, \"teacher\") && _.includes(attrs.roles, \"teacher\") && settings.externalSync.teachers === \"rw\") ret.roles = \"Cannot create new teachers because of external sync behaviour\";\n\t\t}\n\n\t\tif (!attrs.username || !_.trim(attrs.username)) ret.username = \"No username provided\";\n\n\t\tif (!attrs.firstname || !_.trim(attrs.firstname)) ret.firstname = \"No first name provided\";\n\n\t\tif (!attrs.surname || !_.trim(attrs.surname)) ret.surname = \"No surname provided\";\n\n\t\tif (attrs.email && !/\\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}\\b/.test(attrs.email)) ret.email = \"Email is not valid\";\n\n\t\tif (this.isNew() || attrs.changePassword) {\n\t\t\tif (!attrs.password || !_.trim(attrs.password)) ret.password = \"No valid password provided\";else if (attrs.password && attrs.password !== attrs.password2) ret.password2 = \"Passwords do not match\";\n\t\t}\n\n\t\tvar user = { roles: attrs.roles || [] };\n\t\tvar grantList = [];\n\t\tfor (var key in rester.g) {\n\t\t\tif (rester.hasAccess(rester.p.grants.main[key], user, true)) grantList.push(key);\n\t\t}\n\n\t\t_.each(grantList, function (item) {\n\t\t\tif (!attrs.grants || !attrs.grants[item]) ret[item] = \"You must choose at least one value\";\n\t\t});\n\n\t\tif (_.keys(ret).length > 0) return ret;\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInVzZXJNb2RlbC5qcyJdLCJuYW1lcyI6WyJfIiwicmVxdWlyZSIsIkJhY2tib25lIiwicmVzdGVyIiwic2V0dGluZ3MiLCJncmFkZU1hcCIsIm1vZHVsZSIsImV4cG9ydHMiLCJFcG94eSIsIk1vZGVsIiwiZXh0ZW5kIiwiaWRBdHRyaWJ1dGUiLCJ1cmxSb290IiwiY29tcHV0ZWRzIiwidXNlckdyYWRlIiwiaGFzIiwiY29kZVRvSHVtYW5WYWx1ZSIsImdldCIsImxleGljYWwiLCJ1c2VyTmFtZSIsInNvdXJjZSIsInVzZXJSb2xlcyIsImZsYXRNYXAiLCJ4Iiwicm9sZXMiLCJuYW1lIiwiam9pbiIsInZhbGlkYXRlIiwiYXR0cnMiLCJyZXQiLCJsZW5ndGgiLCJzb21lIiwiZ3JvdXBCeSIsImV4Y2x1c2l2aXR5IiwidmFsIiwib2xkUm9sZXMiLCJpbmNsdWRlcyIsImV4dGVybmFsU3luYyIsInN0dWRlbnRzIiwidGVhY2hlcnMiLCJ1c2VybmFtZSIsInRyaW0iLCJmaXJzdG5hbWUiLCJzdXJuYW1lIiwiZW1haWwiLCJ0ZXN0IiwiaXNOZXciLCJjaGFuZ2VQYXNzd29yZCIsInBhc3N3b3JkIiwicGFzc3dvcmQyIiwidXNlciIsImdyYW50TGlzdCIsImtleSIsImciLCJoYXNBY2Nlc3MiLCJwIiwiZ3JhbnRzIiwibWFpbiIsInB1c2giLCJlYWNoIiwiaXRlbSIsImtleXMiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsV0FBV0QsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUUsU0FBU0YsUUFBUSxRQUFSLENBQWY7O0FBRUEsSUFBTUcsV0FBV0gsUUFBUSxjQUFSLENBQWpCOztBQUVBLElBQU1JLFdBQVdKLFFBQVEsaUJBQVIsQ0FBakI7O0FBRUFLLE9BQU9DLE9BQVAsR0FBaUJMLFNBQVNNLEtBQVQsQ0FBZUMsS0FBZixDQUFxQkMsTUFBckIsQ0FBNEI7QUFDNUNDLGNBQWEsS0FEK0I7O0FBRzVDQyxVQUFTLG1CQUFXO0FBQ25CLFNBQU9SLFNBQVNRLE9BQVQsR0FBbUIsZ0JBQTFCO0FBQ0EsRUFMMkM7O0FBTzVDQyxZQUFXO0FBQ1ZDLGFBQVcscUJBQVc7QUFDckIsVUFBTyxLQUFLQyxHQUFMLENBQVMsT0FBVCxJQUFvQlYsU0FBU1csZ0JBQVQsQ0FBMEIsS0FBS0MsR0FBTCxDQUFTLE9BQVQsQ0FBMUIsRUFBNkMsRUFBRUMsU0FBUyxJQUFYLEVBQTdDLENBQXBCLEdBQXNGLEVBQTdGO0FBQ0EsR0FIUzs7QUFLVkMsWUFBVSxvQkFBVztBQUNwQixVQUFPLEtBQUtGLEdBQUwsQ0FBUyxXQUFULElBQXdCLEdBQXhCLEdBQThCLEtBQUtBLEdBQUwsQ0FBUyxTQUFULENBQXJDO0FBQ0EsR0FQUzs7QUFTVkcsVUFBUSxrQkFBVztBQUNsQixXQUFRLEtBQUtILEdBQUwsQ0FBUyxZQUFULENBQVI7QUFDQyxTQUFLLFFBQUw7QUFBZSxZQUFPLFFBQVA7QUFDZixTQUFLLFFBQUw7QUFBZSxZQUFPLFFBQVA7QUFDZjtBQUFTLFlBQU8sSUFBUDtBQUhWO0FBS0EsR0FmUzs7QUFpQlZJLGFBQVcscUJBQVc7QUFDckIsVUFBT3JCLEVBQUVzQixPQUFGLENBQVUsS0FBS0wsR0FBTCxDQUFTLE9BQVQsQ0FBVixFQUE2QjtBQUFBLFdBQU1NLEtBQUtuQixTQUFTb0IsS0FBZCxHQUFzQnBCLFNBQVNvQixLQUFULENBQWVELENBQWYsRUFBa0JFLElBQXhDLEdBQStDLEVBQXJEO0FBQUEsSUFBN0IsRUFBdUZDLElBQXZGLENBQTRGLEdBQTVGLENBQVA7QUFDQTtBQW5CUyxFQVBpQzs7QUE2QjVDQyxXQUFVLGtCQUFTQyxLQUFULEVBQWdCO0FBQ3pCLE1BQU1DLE1BQU0sRUFBWjs7QUFFQSxNQUFJLENBQUNELE1BQU1KLEtBQVAsSUFBZ0IsQ0FBQ0ksTUFBTUosS0FBTixDQUFZTSxNQUFqQyxFQUNDRCxJQUFJTCxLQUFKLEdBQVksaUJBQVosQ0FERCxLQUVLLElBQUlJLE1BQU1KLEtBQU4sSUFBZXhCLEVBQUUrQixJQUFGLENBQU8vQixFQUFFZ0MsT0FBRixDQUFVaEMsRUFBRXNCLE9BQUYsQ0FBVU0sTUFBTUosS0FBaEIsRUFBdUI7QUFBQSxVQUFLLENBQUNwQixTQUFTb0IsS0FBVCxDQUFlRCxDQUFmLEtBQXFCLEVBQXRCLEVBQTBCVSxXQUExQixJQUF5QyxFQUE5QztBQUFBLEdBQXZCLENBQVYsQ0FBUCxFQUE0RjtBQUFBLFVBQU9DLElBQUlKLE1BQUosR0FBYSxDQUFwQjtBQUFBLEdBQTVGLENBQW5CLEVBQ0pELElBQUlMLEtBQUosR0FBWSx5REFBWjs7QUFFRDtBQUNBLE1BQU1XLFdBQVcsS0FBS2xCLEdBQUwsQ0FBUyxPQUFULEtBQXFCLEVBQXRDO0FBQ0EsTUFBSVcsTUFBTUosS0FBVixFQUFpQjtBQUNoQjtBQUNBLE9BQUksQ0FBQ3hCLEVBQUVvQyxRQUFGLENBQVdELFFBQVgsRUFBcUIsU0FBckIsQ0FBRCxJQUFvQ25DLEVBQUVvQyxRQUFGLENBQVdSLE1BQU1KLEtBQWpCLEVBQXdCLFNBQXhCLENBQXBDLElBQTBFcEIsU0FBU2lDLFlBQVQsQ0FBc0JDLFFBQXRCLEtBQW1DLElBQWpILEVBQ0NULElBQUlMLEtBQUosR0FBWSwrREFBWjtBQUNEO0FBRkEsUUFHSyxJQUFJLENBQUN4QixFQUFFb0MsUUFBRixDQUFXRCxRQUFYLEVBQXFCLFNBQXJCLENBQUQsSUFBb0NuQyxFQUFFb0MsUUFBRixDQUFXUixNQUFNSixLQUFqQixFQUF3QixTQUF4QixDQUFwQyxJQUEwRXBCLFNBQVNpQyxZQUFULENBQXNCRSxRQUF0QixLQUFtQyxJQUFqSCxFQUNKVixJQUFJTCxLQUFKLEdBQVksK0RBQVo7QUFDRDs7QUFFRCxNQUFJLENBQUNJLE1BQU1ZLFFBQVAsSUFBbUIsQ0FBQ3hDLEVBQUV5QyxJQUFGLENBQU9iLE1BQU1ZLFFBQWIsQ0FBeEIsRUFDQ1gsSUFBSVcsUUFBSixHQUFlLHNCQUFmOztBQUVELE1BQUksQ0FBQ1osTUFBTWMsU0FBUCxJQUFvQixDQUFDMUMsRUFBRXlDLElBQUYsQ0FBT2IsTUFBTWMsU0FBYixDQUF6QixFQUNDYixJQUFJYSxTQUFKLEdBQWdCLHdCQUFoQjs7QUFFRCxNQUFJLENBQUNkLE1BQU1lLE9BQVAsSUFBa0IsQ0FBQzNDLEVBQUV5QyxJQUFGLENBQU9iLE1BQU1lLE9BQWIsQ0FBdkIsRUFDQ2QsSUFBSWMsT0FBSixHQUFjLHFCQUFkOztBQUVELE1BQUlmLE1BQU1nQixLQUFOLElBQWUsQ0FBRSxxREFBRCxDQUF3REMsSUFBeEQsQ0FBNkRqQixNQUFNZ0IsS0FBbkUsQ0FBcEIsRUFDQ2YsSUFBSWUsS0FBSixHQUFZLG9CQUFaOztBQUVELE1BQUksS0FBS0UsS0FBTCxNQUFnQmxCLE1BQU1tQixjQUExQixFQUEwQztBQUN6QyxPQUFJLENBQUNuQixNQUFNb0IsUUFBUCxJQUFtQixDQUFDaEQsRUFBRXlDLElBQUYsQ0FBT2IsTUFBTW9CLFFBQWIsQ0FBeEIsRUFDQ25CLElBQUltQixRQUFKLEdBQWUsNEJBQWYsQ0FERCxLQUVLLElBQUlwQixNQUFNb0IsUUFBTixJQUFrQnBCLE1BQU1vQixRQUFOLEtBQW1CcEIsTUFBTXFCLFNBQS9DLEVBQ0pwQixJQUFJb0IsU0FBSixHQUFnQix3QkFBaEI7QUFDRDs7QUFFRCxNQUFNQyxPQUFPLEVBQUUxQixPQUFPSSxNQUFNSixLQUFOLElBQWUsRUFBeEIsRUFBYjtBQUNBLE1BQU0yQixZQUFZLEVBQWxCO0FBQ0EsT0FBSSxJQUFNQyxHQUFWLElBQWlCakQsT0FBT2tELENBQXhCLEVBQTJCO0FBQzFCLE9BQUlsRCxPQUFPbUQsU0FBUCxDQUFpQm5ELE9BQU9vRCxDQUFQLENBQVNDLE1BQVQsQ0FBZ0JDLElBQWhCLENBQXFCTCxHQUFyQixDQUFqQixFQUE0Q0YsSUFBNUMsRUFBa0QsSUFBbEQsQ0FBSixFQUNDQyxVQUFVTyxJQUFWLENBQWVOLEdBQWY7QUFDRDs7QUFFRHBELElBQUUyRCxJQUFGLENBQU9SLFNBQVAsRUFBa0IsZ0JBQVE7QUFDekIsT0FBSSxDQUFDdkIsTUFBTTRCLE1BQVAsSUFBaUIsQ0FBQzVCLE1BQU00QixNQUFOLENBQWFJLElBQWIsQ0FBdEIsRUFDQy9CLElBQUkrQixJQUFKLElBQVksb0NBQVo7QUFDRCxHQUhEOztBQUtBLE1BQUk1RCxFQUFFNkQsSUFBRixDQUFPaEMsR0FBUCxFQUFZQyxNQUFaLEdBQXFCLENBQXpCLEVBQ0MsT0FBT0QsR0FBUDtBQUNEO0FBakYyQyxDQUE1QixDQUFqQiIsImZpbGUiOiJ1c2VyTW9kZWwuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG5jb25zdCByZXN0ZXIgPSByZXF1aXJlKFwicmVzdGVyXCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IGdyYWRlTWFwID0gcmVxdWlyZShcIi4uL2xpYi9ncmFkZU1hcFwiKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5FcG94eS5Nb2RlbC5leHRlbmQoe1xuXHRpZEF0dHJpYnV0ZTogXCJfaWRcIixcblxuXHR1cmxSb290OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvdXNlcnNcIjtcblx0fSxcblxuXHRjb21wdXRlZHM6IHtcblx0XHR1c2VyR3JhZGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuaGFzKFwiZ3JhZGVcIikgPyBncmFkZU1hcC5jb2RlVG9IdW1hblZhbHVlKHRoaXMuZ2V0KFwiZ3JhZGVcIiksIHsgbGV4aWNhbDogdHJ1ZSB9KSA6IFwiXCI7XG5cdFx0fSxcblxuXHRcdHVzZXJOYW1lOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0aGlzLmdldChcImZpcnN0bmFtZVwiKSArIFwiIFwiICsgdGhpcy5nZXQoXCJzdXJuYW1lXCIpO1xuXHRcdH0sXG5cblx0XHRzb3VyY2U6IGZ1bmN0aW9uKCkge1xuXHRcdFx0c3dpdGNoICh0aGlzLmdldChcImRhdGFTb3VyY2VcIikpIHtcblx0XHRcdFx0Y2FzZSBcImhlcm1lc1wiOiByZXR1cm4gXCJIZXJtZXNcIjtcblx0XHRcdFx0Y2FzZSBcIm1vb2RsZVwiOiByZXR1cm4gXCJNb29kbGVcIjtcblx0XHRcdFx0ZGVmYXVsdDogcmV0dXJuIFwiRUNcIjtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0dXNlclJvbGVzOiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBfLmZsYXRNYXAodGhpcy5nZXQoXCJyb2xlc1wiKSwgeCA9PiAoeCBpbiBzZXR0aW5ncy5yb2xlcyA/IHNldHRpbmdzLnJvbGVzW3hdLm5hbWUgOiBbXSkpLmpvaW4oXCIsXCIpO1xuXHRcdH0sXG5cdH0sXG5cblx0dmFsaWRhdGU6IGZ1bmN0aW9uKGF0dHJzKSB7XG5cdFx0Y29uc3QgcmV0ID0ge307XG5cblx0XHRpZiAoIWF0dHJzLnJvbGVzIHx8ICFhdHRycy5yb2xlcy5sZW5ndGgpXG5cdFx0XHRyZXQucm9sZXMgPSBcIk5vIHJvbGVzIGNob3NlblwiO1xuXHRcdGVsc2UgaWYgKGF0dHJzLnJvbGVzICYmIF8uc29tZShfLmdyb3VwQnkoXy5mbGF0TWFwKGF0dHJzLnJvbGVzLCB4ID0+IChzZXR0aW5ncy5yb2xlc1t4XSB8fCB7fSkuZXhjbHVzaXZpdHkgfHwgW10pKSwgdmFsID0+IHZhbC5sZW5ndGggPiAxKSlcblx0XHRcdHJldC5yb2xlcyA9IFwiVHdvIG9yIG1vcmUgb2YgeW91ciBjaG9zZW4gcm9sZXMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZVwiO1xuXG5cdFx0Ly8gV2FybiBhYm91dCByb2xlcyB0aGF0IHZpb2xhdGUgZXh0ZXJuYWxTeW5jXG5cdFx0Y29uc3Qgb2xkUm9sZXMgPSB0aGlzLmdldChcInJvbGVzXCIpIHx8IFtdO1xuXHRcdGlmIChhdHRycy5yb2xlcykge1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXN5bmNcblx0XHRcdGlmICghXy5pbmNsdWRlcyhvbGRSb2xlcywgXCJzdHVkZW50XCIpICYmIF8uaW5jbHVkZXMoYXR0cnMucm9sZXMsIFwic3R1ZGVudFwiKSAmJiBzZXR0aW5ncy5leHRlcm5hbFN5bmMuc3R1ZGVudHMgPT09IFwicndcIilcblx0XHRcdFx0cmV0LnJvbGVzID0gXCJDYW5ub3QgY3JlYXRlIG5ldyBzdHVkZW50cyBiZWNhdXNlIG9mIGV4dGVybmFsIHN5bmMgYmVoYXZpb3VyXCI7XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc3luY1xuXHRcdFx0ZWxzZSBpZiAoIV8uaW5jbHVkZXMob2xkUm9sZXMsIFwidGVhY2hlclwiKSAmJiBfLmluY2x1ZGVzKGF0dHJzLnJvbGVzLCBcInRlYWNoZXJcIikgJiYgc2V0dGluZ3MuZXh0ZXJuYWxTeW5jLnRlYWNoZXJzID09PSBcInJ3XCIpXG5cdFx0XHRcdHJldC5yb2xlcyA9IFwiQ2Fubm90IGNyZWF0ZSBuZXcgdGVhY2hlcnMgYmVjYXVzZSBvZiBleHRlcm5hbCBzeW5jIGJlaGF2aW91clwiO1xuXHRcdH1cblxuXHRcdGlmICghYXR0cnMudXNlcm5hbWUgfHwgIV8udHJpbShhdHRycy51c2VybmFtZSkpXG5cdFx0XHRyZXQudXNlcm5hbWUgPSBcIk5vIHVzZXJuYW1lIHByb3ZpZGVkXCI7XG5cblx0XHRpZiAoIWF0dHJzLmZpcnN0bmFtZSB8fCAhXy50cmltKGF0dHJzLmZpcnN0bmFtZSkpXG5cdFx0XHRyZXQuZmlyc3RuYW1lID0gXCJObyBmaXJzdCBuYW1lIHByb3ZpZGVkXCI7XG5cblx0XHRpZiAoIWF0dHJzLnN1cm5hbWUgfHwgIV8udHJpbShhdHRycy5zdXJuYW1lKSlcblx0XHRcdHJldC5zdXJuYW1lID0gXCJObyBzdXJuYW1lIHByb3ZpZGVkXCI7XG5cblx0XHRpZiAoYXR0cnMuZW1haWwgJiYgISgvXFxiW2EtekEtWjAtOS5fJSstXStAW2EtekEtWjAtOS4tXStcXC5bYS16QS1aXXsyLDZ9XFxiLykudGVzdChhdHRycy5lbWFpbCkpXG5cdFx0XHRyZXQuZW1haWwgPSBcIkVtYWlsIGlzIG5vdCB2YWxpZFwiO1xuXG5cdFx0aWYgKHRoaXMuaXNOZXcoKSB8fCBhdHRycy5jaGFuZ2VQYXNzd29yZCkge1xuXHRcdFx0aWYgKCFhdHRycy5wYXNzd29yZCB8fCAhXy50cmltKGF0dHJzLnBhc3N3b3JkKSlcblx0XHRcdFx0cmV0LnBhc3N3b3JkID0gXCJObyB2YWxpZCBwYXNzd29yZCBwcm92aWRlZFwiO1xuXHRcdFx0ZWxzZSBpZiAoYXR0cnMucGFzc3dvcmQgJiYgYXR0cnMucGFzc3dvcmQgIT09IGF0dHJzLnBhc3N3b3JkMilcblx0XHRcdFx0cmV0LnBhc3N3b3JkMiA9IFwiUGFzc3dvcmRzIGRvIG5vdCBtYXRjaFwiO1xuXHRcdH1cblxuXHRcdGNvbnN0IHVzZXIgPSB7IHJvbGVzOiBhdHRycy5yb2xlcyB8fCBbXSB9O1xuXHRcdGNvbnN0IGdyYW50TGlzdCA9IFtdO1xuXHRcdGZvcihjb25zdCBrZXkgaW4gcmVzdGVyLmcpIHtcblx0XHRcdGlmIChyZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmdyYW50cy5tYWluW2tleV0sIHVzZXIsIHRydWUpKVxuXHRcdFx0XHRncmFudExpc3QucHVzaChrZXkpO1xuXHRcdH1cblxuXHRcdF8uZWFjaChncmFudExpc3QsIGl0ZW0gPT4ge1xuXHRcdFx0aWYgKCFhdHRycy5ncmFudHMgfHwgIWF0dHJzLmdyYW50c1tpdGVtXSlcblx0XHRcdFx0cmV0W2l0ZW1dID0gXCJZb3UgbXVzdCBjaG9vc2UgYXQgbGVhc3Qgb25lIHZhbHVlXCI7XG5cdFx0fSk7XG5cblx0XHRpZiAoXy5rZXlzKHJldCkubGVuZ3RoID4gMClcblx0XHRcdHJldHVybiByZXQ7XG5cdH0sXG59KTsiXX0=",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar Backbone = require(\"backbone\");\nvar Promise = require(\"bluebird\");\nvar raygun = require(\"raygun\");\n\nvar settings = require(\"app-settings\");\n\nvar ErrorView = require(\"../../lib/errorView\");\nvar StatusView = require(\"../../lib/statusView\");\n\nvar GroupCollection = Backbone.Collection.extend({\n\tmodel: Backbone.Model,\n\n\tinitialize: function initialize(models, options) {\n\t\tthis.user = options.user;\n\t},\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/users/\" + encodeURIComponent(this.user) + \"/enrolment?withPrivate=true\";\n\t}\n});\n\nvar BookModel = Backbone.Model.extend({\n\tdefaults: {},\n\n\tidAttribute: \"_id\"\n});\n\nvar BookCollection = Backbone.Collection.extend({\n\tmodel: BookModel,\n\n\tinitialize: function initialize(models, options) {\n\t\tthis.user = options.user;\n\t},\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/api/1.0/users/\" + this.user + \"/books\";\n\t}\n});\n\nvar InformationView = Backbone.Marionette.View.extend({\n\tclassName: \"user-details-information\",\n\n\ttemplate: require(\"../templates/userDetails.nunj\").information,\n\n\tserializeData: function serializeData() {\n\t\treturn this.model.toJSON({ computed: true });\n\t}\n});\n\nvar GroupListEmpty = Backbone.Marionette.View.extend({\n\tclassName: \"user-details-list-empty\",\n\n\ttemplate: require(\"../templates/userDetails.nunj\").groupListEmpty\n});\n\nvar GroupListItem = Backbone.Marionette.View.extend({\n\tclassName: \"user-details-list-item\",\n\n\ttemplate: require(\"../templates/userDetails.nunj\").groupListItem\n});\n\nvar GroupList = Backbone.Marionette.CollectionView.extend({\n\tclassName: \"user-details-list\",\n\n\tchildView: GroupListItem,\n\n\temptyView: GroupListEmpty,\n\n\tinitialize: function initialize(options) {\n\t\tthis.collection = options.groupCollection;\n\t}\n});\n\nvar BookListEmpty = Backbone.Marionette.View.extend({\n\tclassName: \"user-details-list-empty\",\n\n\ttemplate: require(\"../templates/userDetails.nunj\").bookListEmpty\n});\n\nvar BookListItem = Backbone.Marionette.View.extend({\n\tclassName: \"user-details-list-item user-details-book-list-item\",\n\n\ttemplate: require(\"../templates/userDetails.nunj\").bookListItem\n});\n\nvar BookList = Backbone.Marionette.CollectionView.extend({\n\tclassName: \"user-details-list\",\n\n\tchildView: BookListItem,\n\n\temptyView: BookListEmpty\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\tclassName: \"user-details-view\",\n\n\ttemplate: require(\"../templates/userDetails.nunj\").layout,\n\n\tregions: {\n\t\tstatus: \".status-region\",\n\t\tinformation: \".information-region\",\n\t\tgroup: \".group-region\",\n\t\tbook: \".book-region\"\n\t},\n\n\tui: {\n\t\tbuttonClose: \".button-close\",\n\t\tstatusRegion: \".status-region\",\n\t\tinformationRegion: \".information-region\",\n\t\tlistHeaderContainer: \".list-header-container\",\n\t\tlistContainer: \".list-container\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.buttonClose\": \"onButtonCloseClick\"\n\t},\n\n\tinitialize: function initialize(options) {\n\t\tthis.eventBus = options.eventBus;\n\t\tthis.userModel = options.userModel;\n\n\t\tthis.host = $(\"#modals\");\n\t},\n\n\tshow: function show() {\n\t\t$(\".modal-container\", this.host).append(this.render().$el);\n\t},\n\n\tclose: function close() {\n\t\tthis.eventBus.trigger(\"userDetails:close\");\n\t\tthis.destroy();\n\t},\n\n\tonRender: function onRender() {\n\t\tvar _this = this;\n\n\t\t// Show the modal background\n\t\t$(\".modal-element\", this.host).removeClass(\"hide\");\n\t\t$(\"body\").addClass(\"hide-overflow\");\n\n\t\t// The modal itself should allow clicks to propagate so that menus in the\n\t\t// modal will be hidden correctly. However, everything underneath the modal\n\t\t// should be unaffected by clicks\n\t\tthis.host.on(\"click\", function (event) {\n\t\t\treturn event.stopPropagation();\n\t\t}, this);\n\n\t\tthis.renderLoadingStatus();\n\n\t\tvar collections = [new BookCollection([], { user: this.userModel.get(\"username\") }).lazyFetch(), new GroupCollection([], { user: this.userModel.get(\"username\") }).lazyFetch()];\n\n\t\tPromise.all(collections).spread(function (bookCollection, groupCollection) {\n\t\t\t_this.userBookCollection = bookCollection;\n\t\t\t_this.groupCollection = groupCollection;\n\n\t\t\t_this.renderPage();\n\t\t}).catch(function (error) {\n\t\t\t_this.renderError(error);\n\n\t\t\tif (!settings.debug || settings.reportErrors) raygun(\"send\", error);\n\t\t});\n\t},\n\n\trenderLoadingStatus: function renderLoadingStatus() {\n\t\tthis.getRegion(\"status\").show(new StatusView({ type: \"loading\" }));\n\t},\n\n\trenderError: function renderError(error) {\n\t\tthis.getRegion(\"status\").show(new ErrorView({ fetchError: error }));\n\t},\n\n\trenderPage: function renderPage() {\n\t\tthis.ui.statusRegion.addClass(\"hide\");\n\t\tthis.ui.informationRegion.removeClass(\"hide\");\n\t\tthis.ui.listHeaderContainer.removeClass(\"hide\");\n\t\tthis.ui.listContainer.removeClass(\"hide\");\n\n\t\tthis.getRegion(\"information\").show(new InformationView({ model: this.userModel }));\n\n\t\tthis.getRegion(\"group\").show(new GroupList({\n\t\t\tgroupCollection: this.groupCollection,\n\t\t\tuserModel: this.userModel\n\t\t}));\n\n\t\tthis.getRegion(\"book\").show(new BookList({ collection: this.userBookCollection }));\n\t},\n\n\tonButtonCloseClick: function onButtonCloseClick() {\n\t\tthis.close();\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tthis.host.off(\"click\");\n\t},\n\n\tonDestroy: function onDestroy() {\n\t\tthis.host.off(\"click\");\n\n\t\t$(\".modal-element\", this.host).addClass(\"hide\");\n\t\t$(\"body\").removeClass(\"hide-overflow\");\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInVzZXJEZXRhaWxzLmpzIl0sIm5hbWVzIjpbIiQiLCJyZXF1aXJlIiwiQmFja2JvbmUiLCJQcm9taXNlIiwicmF5Z3VuIiwic2V0dGluZ3MiLCJFcnJvclZpZXciLCJTdGF0dXNWaWV3IiwiR3JvdXBDb2xsZWN0aW9uIiwiQ29sbGVjdGlvbiIsImV4dGVuZCIsIm1vZGVsIiwiTW9kZWwiLCJpbml0aWFsaXplIiwibW9kZWxzIiwib3B0aW9ucyIsInVzZXIiLCJ1cmwiLCJ1cmxSb290IiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiQm9va01vZGVsIiwiZGVmYXVsdHMiLCJpZEF0dHJpYnV0ZSIsIkJvb2tDb2xsZWN0aW9uIiwiSW5mb3JtYXRpb25WaWV3IiwiTWFyaW9uZXR0ZSIsIlZpZXciLCJjbGFzc05hbWUiLCJ0ZW1wbGF0ZSIsImluZm9ybWF0aW9uIiwic2VyaWFsaXplRGF0YSIsInRvSlNPTiIsImNvbXB1dGVkIiwiR3JvdXBMaXN0RW1wdHkiLCJncm91cExpc3RFbXB0eSIsIkdyb3VwTGlzdEl0ZW0iLCJncm91cExpc3RJdGVtIiwiR3JvdXBMaXN0IiwiQ29sbGVjdGlvblZpZXciLCJjaGlsZFZpZXciLCJlbXB0eVZpZXciLCJjb2xsZWN0aW9uIiwiZ3JvdXBDb2xsZWN0aW9uIiwiQm9va0xpc3RFbXB0eSIsImJvb2tMaXN0RW1wdHkiLCJCb29rTGlzdEl0ZW0iLCJib29rTGlzdEl0ZW0iLCJCb29rTGlzdCIsIm1vZHVsZSIsImV4cG9ydHMiLCJsYXlvdXQiLCJyZWdpb25zIiwic3RhdHVzIiwiZ3JvdXAiLCJib29rIiwidWkiLCJidXR0b25DbG9zZSIsInN0YXR1c1JlZ2lvbiIsImluZm9ybWF0aW9uUmVnaW9uIiwibGlzdEhlYWRlckNvbnRhaW5lciIsImxpc3RDb250YWluZXIiLCJldmVudHMiLCJldmVudEJ1cyIsInVzZXJNb2RlbCIsImhvc3QiLCJzaG93IiwiYXBwZW5kIiwicmVuZGVyIiwiJGVsIiwiY2xvc2UiLCJ0cmlnZ2VyIiwiZGVzdHJveSIsIm9uUmVuZGVyIiwicmVtb3ZlQ2xhc3MiLCJhZGRDbGFzcyIsIm9uIiwiZXZlbnQiLCJzdG9wUHJvcGFnYXRpb24iLCJyZW5kZXJMb2FkaW5nU3RhdHVzIiwiY29sbGVjdGlvbnMiLCJnZXQiLCJsYXp5RmV0Y2giLCJhbGwiLCJzcHJlYWQiLCJib29rQ29sbGVjdGlvbiIsInVzZXJCb29rQ29sbGVjdGlvbiIsInJlbmRlclBhZ2UiLCJjYXRjaCIsInJlbmRlckVycm9yIiwiZXJyb3IiLCJkZWJ1ZyIsInJlcG9ydEVycm9ycyIsImdldFJlZ2lvbiIsInR5cGUiLCJmZXRjaEVycm9yIiwib25CdXR0b25DbG9zZUNsaWNrIiwib25CZWZvcmVEZXN0cm95Iiwib2ZmIiwib25EZXN0cm95Il0sIm1hcHBpbmdzIjoiQUFBQTs7QUFDQSxJQUFNQSxJQUFJQyxRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1DLFdBQVdELFFBQVEsVUFBUixDQUFqQjtBQUNBLElBQU1FLFVBQVVGLFFBQVEsVUFBUixDQUFoQjtBQUNBLElBQU1HLFNBQVNILFFBQVEsUUFBUixDQUFmOztBQUVBLElBQU1JLFdBQVdKLFFBQVEsY0FBUixDQUFqQjs7QUFFQSxJQUFNSyxZQUFZTCxRQUFRLHFCQUFSLENBQWxCO0FBQ0EsSUFBTU0sYUFBYU4sUUFBUSxzQkFBUixDQUFuQjs7QUFFQSxJQUFNTyxrQkFBa0JOLFNBQVNPLFVBQVQsQ0FBb0JDLE1BQXBCLENBQTJCO0FBQ2xEQyxRQUFPVCxTQUFTVSxLQURrQzs7QUFHbERDLGFBQVksb0JBQVNDLE1BQVQsRUFBaUJDLE9BQWpCLEVBQTBCO0FBQ3JDLE9BQUtDLElBQUwsR0FBWUQsUUFBUUMsSUFBcEI7QUFDQSxFQUxpRDs7QUFPbERDLE1BQUssZUFBVztBQUNmLFNBQU9aLFNBQVNhLE9BQVQsR0FBbUIsaUJBQW5CLEdBQXVDQyxtQkFBbUIsS0FBS0gsSUFBeEIsQ0FBdkMsR0FBdUUsNkJBQTlFO0FBQ0E7QUFUaUQsQ0FBM0IsQ0FBeEI7O0FBWUEsSUFBTUksWUFBWWxCLFNBQVNVLEtBQVQs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RWIsT0FBTyxLQUFLb0QsU0FBZCxFQUFwQixDQUFuQzs7QUFFQSxPQUFLNkIsU0FBTCxDQUFlLE9BQWYsRUFBd0IzQixJQUF4QixDQUE2QixJQUFJNUIsU0FBSixDQUFjO0FBQzFDSyxvQkFBaUIsS0FBS0EsZUFEb0I7QUFFMUNxQixjQUFXLEtBQUtBO0FBRjBCLEdBQWQsQ0FBN0I7O0FBS0EsT0FBSzZCLFNBQUwsQ0FBZSxNQUFmLEVBQXVCM0IsSUFBdkIsQ0FBNEIsSUFBSWxCLFFBQUosQ0FBYSxFQUFFTixZQUFZLEtBQUs0QyxrQkFBbkIsRUFBYixDQUE1QjtBQUNBLEVBNUYrQzs7QUE4RmhEVSxxQkFBb0IsOEJBQVc7QUFDOUIsT0FBSzFCLEtBQUw7QUFDQSxFQWhHK0M7O0FBa0doRDJCLGtCQUFpQiwyQkFBVztBQUMzQixPQUFLaEMsSUFBTCxDQUFVaUMsR0FBVixDQUFjLE9BQWQ7QUFDQSxFQXBHK0M7O0FBc0doREMsWUFBVyxxQkFBVztBQUNyQixPQUFLbEMsSUFBTCxDQUFVaUMsR0FBVixDQUFjLE9BQWQ7O0FBRUFqRyxJQUFFLGdCQUFGLEVBQW9CLEtBQUtnRSxJQUF6QixFQUErQlUsUUFBL0IsQ0FBd0MsTUFBeEM7QUFDQTFFLElBQUUsTUFBRixFQUFVeUUsV0FBVixDQUFzQixlQUF0QjtBQUNBO0FBM0crQyxDQUFoQyxDQUFqQiIsImZpbGUiOiJ1c2VyRGV0YWlscy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IFByb21pc2UgPSByZXF1aXJlKFwiYmx1ZWJpcmRcIik7XG5jb25zdCByYXlndW4gPSByZXF1aXJlKFwicmF5Z3VuXCIpO1xuXG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IEVycm9yVmlldyA9IHJlcXVpcmUoXCIuLi8uLi9saWIvZXJyb3JWaWV3XCIpO1xuY29uc3QgU3RhdHVzVmlldyA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc3RhdHVzVmlld1wiKTtcblxuY29uc3QgR3JvdXBDb2xsZWN0aW9uID0gQmFja2JvbmUuQ29sbGVjdGlvbi5leHRlbmQoe1xuXHRtb2RlbDogQmFja2JvbmUuTW9kZWwsXG5cblx0aW5pdGlhbGl6ZTogZnVuY3Rpb24obW9kZWxzLCBvcHRpb25zKSB7XG5cdFx0dGhpcy51c2VyID0gb3B0aW9ucy51c2VyO1xuXHR9LFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3VzZXJzL1wiICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMudXNlcikgKyBcIi9lbnJvbG1lbnQ/d2l0aFByaXZhdGU9dHJ1ZVwiO1xuXHR9LFxufSk7XG5cbmNvbnN0IEJvb2tNb2RlbCA9IEJhY2tib25lLk1vZGVsLmV4dGVuZCh7XG5cdGRlZmF1bHRzOiB7fSxcblxuXHRpZEF0dHJpYnV0ZTogXCJfaWRcIixcbn0pO1xuXG5jb25zdCBCb29rQ29sbGVjdGlvbiA9IEJhY2tib25lLkNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IEJvb2tNb2RlbCxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihtb2RlbHMsIG9wdGlvbnMpIHtcblx0XHR0aGlzLnVzZXIgPSBvcHRpb25zLnVzZXI7XG5cdH0sXG5cblx0dXJsOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvdXNlcnMvXCIgKyB0aGlzLnVzZXIgKyBcIi9ib29rc1wiO1xuXHR9LFxufSk7XG5cbmNvbnN0IEluZm9ybWF0aW9uVmlldyA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwidXNlci1kZXRhaWxzLWluZm9ybWF0aW9uXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvdXNlckRldGFpbHMubnVualwiKS5pbmZvcm1hdGlvbixcblxuXHRzZXJpYWxpemVEYXRhOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tb2RlbC50b0pTT04oeyBjb21wdXRlZDogdHJ1ZSB9KTtcblx0fSxcbn0pO1xuXG5jb25zdCBHcm91cExpc3RFbXB0eSA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwidXNlci1kZXRhaWxzLWxpc3QtZW1wdHlcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy91c2VyRGV0YWlscy5udW5qXCIpLmdyb3VwTGlzdEVtcHR5LFxufSk7XG5cbmNvbnN0IEdyb3VwTGlzdEl0ZW0gPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInVzZXItZGV0YWlscy1saXN0LWl0ZW1cIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy91c2VyRGV0YWlscy5udW5qXCIpLmdyb3VwTGlzdEl0ZW0sXG59KTtcblxuY29uc3QgR3JvdXBMaXN0ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5Db2xsZWN0aW9uVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwidXNlci1kZXRhaWxzLWxpc3RcIixcblxuXHRjaGlsZFZpZXc6IEdyb3VwTGlzdEl0ZW0sXG5cblx0ZW1wdHlWaWV3OiBHcm91cExpc3RFbXB0eSxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihvcHRpb25zKSB7XG5cdFx0dGhpcy5jb2xsZWN0aW9uID0gb3B0aW9ucy5ncm91cENvbGxlY3Rpb247XG5cdH0sXG59KTtcblxuY29uc3QgQm9va0xpc3RFbXB0eSA9IEJhY2tib25lLk1hcmlvbmV0dGUuVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwidXNlci1kZXRhaWxzLWxpc3QtZW1wdHlcIixcblxuXHR0ZW1wbGF0ZTogcmVxdWlyZShcIi4uL3RlbXBsYXRlcy91c2VyRGV0YWlscy5udW5qXCIpLmJvb2tMaXN0RW1wdHksXG59KTtcblxuY29uc3QgQm9va0xpc3RJdGVtID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5WaWV3LmV4dGVuZCh7XG5cdGNsYXNzTmFtZTogXCJ1c2VyLWRldGFpbHMtbGlzdC1pdGVtIHVzZXItZGV0YWlscy1ib29rLWxpc3QtaXRlbVwiLFxuXG5cdHRlbXBsYXRlOiByZXF1aXJlKFwiLi4vdGVtcGxhdGVzL3VzZXJEZXRhaWxzLm51bmpcIikuYm9va0xpc3RJdGVtLFxufSk7XG5cbmNvbnN0IEJvb2tMaXN0ID0gQmFja2JvbmUuTWFyaW9uZXR0ZS5Db2xsZWN0aW9uVmlldy5leHRlbmQoe1xuXHRjbGFzc05hbWU6IFwidXNlci1kZXRhaWxzLWxpc3RcIixcblxuXHRjaGlsZFZpZXc6IEJvb2tMaXN0SXRlbSxcblxuXHRlbXB0eVZpZXc6IEJvb2tMaXN0RW1wdHksXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0Y2xhc3NOYW1lOiBcInVzZXItZGV0YWlscy12aWV3XCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvdXNlckRldGFpbHMubnVualwiKS5sYXlvdXQsXG5cblx0cmVnaW9uczoge1xuXHRcdHN0YXR1czogXCIuc3RhdHVzLXJlZ2lvblwiLFxuXHRcdGluZm9ybWF0aW9uOiBcIi5pbmZvcm1hdGlvbi1yZWdpb25cIixcblx0XHRncm91cDogXCIuZ3JvdXAtcmVnaW9uXCIsXG5cdFx0Ym9vazogXCIuYm9vay1yZWdpb25cIixcblx0fSxcblxuXHR1aToge1xuXHRcdGJ1dHRvbkNsb3NlOiBcIi5idXR0b24tY2xvc2VcIixcblx0XHRzdGF0dXNSZWdpb246IFwiLnN0YXR1cy1yZWdpb25cIixcblx0XHRpbmZvcm1hdGlvblJlZ2lvbjogXCIuaW5mb3JtYXRpb24tcmVnaW9uXCIsXG5cdFx0bGlzdEhlYWRlckNvbnRhaW5lcjogXCIubGlzdC1oZWFkZXItY29udGFpbmVyXCIsXG5cdFx0bGlzdENvbnRhaW5lcjogXCIubGlzdC1jb250YWluZXJcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImNsaWNrIEB1aS5idXR0b25DbG9zZVwiOiBcIm9uQnV0dG9uQ2xvc2VDbGlja1wiLFxuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKG9wdGlvbnMpIHtcblx0XHR0aGlzLmV2ZW50QnVzID0gb3B0aW9ucy5ldmVudEJ1cztcblx0XHR0aGlzLnVzZXJNb2RlbCA9IG9wdGlvbnMudXNlck1vZGVsO1xuXG5cdFx0dGhpcy5ob3N0ID0gJChcIiNtb2RhbHNcIik7XG5cdH0sXG5cblx0c2hvdzogZnVuY3Rpb24oKSB7XG5cdFx0JChcIi5tb2RhbC1jb250YWluZXJcIiwgdGhpcy5ob3N0KS5hcHBlbmQodGhpcy5yZW5kZXIoKS4kZWwpO1xuXHR9LFxuXG5cdGNsb3NlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmV2ZW50QnVzLnRyaWdnZXIoXCJ1c2VyRGV0YWlsczpjbG9zZVwiKTtcblx0XHR0aGlzLmRlc3Ryb3koKTtcblx0fSxcblxuXHRvblJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0Ly8gU2hvdyB0aGUgbW9kYWwgYmFja2dyb3VuZFxuXHRcdCQoXCIubW9kYWwtZWxlbWVudFwiLCB0aGlzLmhvc3QpLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHQkKFwiYm9keVwiKS5hZGRDbGFzcyhcImhpZGUtb3ZlcmZsb3dcIik7XG5cblx0XHQvLyBUaGUgbW9kYWwgaXRzZWxmIHNob3VsZCBhbGxvdyBjbGlja3MgdG8gcHJvcGFnYXRlIHNvIHRoYXQgbWVudXMgaW4gdGhlXG5cdFx0Ly8gbW9kYWwgd2lsbCBiZSBoaWRkZW4gY29ycmVjdGx5LiBIb3dldmVyLCBldmVyeXRoaW5nIHVuZGVybmVhdGggdGhlIG1vZGFsXG5cdFx0Ly8gc2hvdWxkIGJlIHVuYWZmZWN0ZWQgYnkgY2xpY2tzXG5cdFx0dGhpcy5ob3N0Lm9uKFwiY2xpY2tcIiwgZXZlbnQgPT4gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCksIHRoaXMpO1xuXG5cdFx0dGhpcy5yZW5kZXJMb2FkaW5nU3RhdHVzKCk7XG5cblx0XHRjb25zdCBjb2xsZWN0aW9ucyA9IFtcblx0XHRcdG5ldyBCb29rQ29sbGVjdGlvbihbXSwgeyB1c2VyOiB0aGlzLnVzZXJNb2RlbC5nZXQoXCJ1c2VybmFtZVwiKSB9KS5sYXp5RmV0Y2goKSxcblx0XHRcdG5ldyBHcm91cENvbGxlY3Rpb24oW10sIHsgdXNlcjogdGhpcy51c2VyTW9kZWwuZ2V0KFwidXNlcm5hbWVcIikgfSkubGF6eUZldGNoKCksXG5cdFx0XTtcblxuXHRcdFByb21pc2UuYWxsKGNvbGxlY3Rpb25zKS5zcHJlYWQoKGJvb2tDb2xsZWN0aW9uLCBncm91cENvbGxlY3Rpb24pID0+IHtcblx0XHRcdHRoaXMudXNlckJvb2tDb2xsZWN0aW9uID0gYm9va0NvbGxlY3Rpb247XG5cdFx0XHR0aGlzLmdyb3VwQ29sbGVjdGlvbiA9IGdyb3VwQ29sbGVjdGlvbjtcblxuXHRcdFx0dGhpcy5yZW5kZXJQYWdlKCk7XG5cdFx0fSkuY2F0Y2goZXJyb3IgPT4ge1xuXHRcdFx0dGhpcy5yZW5kZXJFcnJvcihlcnJvcik7XG5cblx0XHRcdGlmICghc2V0dGluZ3MuZGVidWcgfHwgc2V0dGluZ3MucmVwb3J0RXJyb3JzKVxuXHRcdFx0XHRyYXlndW4oXCJzZW5kXCIsIGVycm9yKTtcblx0XHR9KTtcblx0fSxcblxuXHRyZW5kZXJMb2FkaW5nU3RhdHVzOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmdldFJlZ2lvbihcInN0YXR1c1wiKS5zaG93KG5ldyBTdGF0dXNWaWV3KHsgdHlwZTogXCJsb2FkaW5nXCIgfSkpO1xuXHR9LFxuXG5cdHJlbmRlckVycm9yOiBmdW5jdGlvbihlcnJvcikge1xuXHRcdHRoaXMuZ2V0UmVnaW9uKFwic3RhdHVzXCIpLnNob3cobmV3IEVycm9yVmlldyh7IGZldGNoRXJyb3I6IGVycm9yIH0pKTtcblx0fSxcblxuXHRyZW5kZXJQYWdlOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLnVpLnN0YXR1c1JlZ2lvbi5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5pbmZvcm1hdGlvblJlZ2lvbi5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0dGhpcy51aS5saXN0SGVhZGVyQ29udGFpbmVyLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHR0aGlzLnVpLmxpc3RDb250YWluZXIucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0dGhpcy5nZXRSZWdpb24oXCJpbmZvcm1hdGlvblwiKS5zaG93KG5ldyBJbmZvcm1hdGlvblZpZXcoeyBtb2RlbDogdGhpcy51c2VyTW9kZWwgfSkpO1xuXG5cdFx0dGhpcy5nZXRSZWdpb24oXCJncm91cFwiKS5zaG93KG5ldyBHcm91cExpc3Qoe1xuXHRcdFx0Z3JvdXBDb2xsZWN0aW9uOiB0aGlzLmdyb3VwQ29sbGVjdGlvbixcblx0XHRcdHVzZXJNb2RlbDogdGhpcy51c2VyTW9kZWwsXG5cdFx0fSkpO1xuXG5cdFx0dGhpcy5nZXRSZWdpb24oXCJib29rXCIpLnNob3cobmV3IEJvb2tMaXN0KHsgY29sbGVjdGlvbjogdGhpcy51c2VyQm9va0NvbGxlY3Rpb24gfSkpO1xuXHR9LFxuXG5cdG9uQnV0dG9uQ2xvc2VDbGljazogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5jbG9zZSgpO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5ob3N0Lm9mZihcImNsaWNrXCIpO1xuXHR9LFxuXG5cdG9uRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5ob3N0Lm9mZihcImNsaWNrXCIpO1xuXG5cdFx0JChcIi5tb2RhbC1lbGVtZW50XCIsIHRoaXMuaG9zdCkuYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdCQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKFwiaGlkZS1vdmVyZmxvd1wiKTtcblx0fSxcbn0pO1xuIl19",
    "\"use strict\";\n\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\nvar moment = require(\"moment\");\nvar rester = require(\"rester\");\nvar Backbone = require(\"backbone\");\n// This needs to be here to fix IE11. Don't remove.\n// No I don't know either. It's stupid.\n// eslint-disable-next-line no-unused-vars\nvar Promise = require(\"bluebird\");\n\nvar App = require(\"../../index\");\nvar settings = require(\"app-settings\");\n\nvar BigModal = require(\"../../lib/bigModal\");\nvar UserModel = require(\"../userModel\");\nvar Selectra = require(\"../../lib/selectra\");\nvar Pikaday = require(\"pikaday\");\n\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar InternalGroups = Backbone.Collection.extend({\n\tmodel: Backbone.Model,\n\n\tinitialize: function initialize(models, opts) {\n\t\tthis.username = encodeURIComponent(opts.username);\n\t},\n\n\turl: function url() {\n\t\treturn settings.urlRoot + \"/acacia/users/\" + this.username + \"/oldYearGroups\";\n\t}\n});\n\nmodule.exports = BigModal.extend({\n\tui: {\n\t\tenabled: \"input[name='enabled']\",\n\t\trestricted: \"input[name='restricted']\",\n\t\trolesLabel: \".roles-label\",\n\t\troles: \"select[name='roles']\",\n\t\tusernameLabel: \".username-label\",\n\t\tusername: \"input[name='username']\",\n\t\temailLabel: \".email-label\",\n\t\temail: \"input[name='email']\",\n\t\tfirstnameLabel: \".firstname-label\",\n\t\tfirstname: \"input[name='firstname']\",\n\t\tsurnameLabel: \".surname-label\",\n\t\tsurname: \"input[name='surname']\",\n\t\tpasswordLabel: \".password-label\",\n\t\tpassword: \"input[name='password']\",\n\t\tpassword2Label: \".password2-label\",\n\t\tpassword2: \"input[name='password2']\",\n\t\tgrade: \"select[name='grade']\",\n\t\tgradeBlock: \"div.grade\",\n\t\tgroups: \"select[name='groups']\",\n\t\tgroupBlock: \"div.groups\",\n\t\tlockedGroups: \"select[name='locked-groups']\",\n\t\tthisYearGroups: \"input[name='current_year_groups']\",\n\n\t\tparentsLabel: \".parents-label\",\n\t\tparents: \"select[name='parents']\",\n\t\tpublishersLabel: \".publishers-label\",\n\t\tpublishers: \"select[name='publishers']\",\n\t\thodsLabel: \".hods-label\",\n\t\thods: \"select[name='hods']\",\n\n\t\tnewPassword: \"input[name='newPassword']\",\n\t\tcourseEnrolledLabel: \".courseEnrolled-label\",\n\t\tcourseEnrolled: \"input[name='courseEnrolled']\",\n\t\tdateOfBirthLabel: \".dateOfBirth-label\",\n\t\tdateOfBirth: \"input[name='dateOfBirth']\",\n\t\tbillingAddressLabel: \".billingAddress-label\",\n\t\tbillingAddress: \"input[name='billingAddress']\",\n\t\tcountryLabel: \".country-label\",\n\t\tcountry: \"input[name='country']\",\n\t\temergencyContactLabel: \".emergencyContact-label\",\n\t\temergencyContact: \"input[name='emergencyContact']\",\n\t\temergencyRelationLabel: \".emergencyRelation-label\",\n\t\temergencyRelation: \"input[name='emergencyRelation']\",\n\n\t\tusernameSpinner: \"div.username-spinner\",\n\t\temailSpinner: \"div.email-spinner\"\n\t},\n\n\tevents: {\n\t\t\"keydown @ui.username\": \"clearUsernameValidationError\",\n\t\t\"keydown @ui.email\": \"clearEmailValidationError\",\n\t\t\"keyup @ui.username\": \"checkUniqueUsername\",\n\t\t\"keyup @ui.email\": \"checkUniqueEmail\",\n\t\t\"change @ui.roles\": \"accountChange\",\n\t\t\"change @ui.newPassword\": \"newPassword\",\n\t\t\"change @ui.thisYearGroups\": \"onChangeThisYearFilter\"\n\t},\n\n\tactions: {\n\t\tcreateAnother: \"onCreateAnother\"\n\t},\n\n\terrorMap: {\n\t\troles: {\n\t\t\tattractionElement: \"rolesLabel\",\n\t\t\tposition: \"right\"\n\t\t},\n\t\tusername: {\n\t\t\tattractionElement: \"usernameLabel\",\n\t\t\tposition: \"right\"\n\t\t},\n\t\tfirstname: {\n\t\t\tattractionElement: \"firstnameLabel\",\n\t\t\tposition: \"right\"\n\t\t},\n\t\thods: {\n\t\t\tattractionElement: \"hodsLabel\",\n\t\t\tposition: \"right\"\n\t\t},\n\t\tsurname: {\n\t\t\tattractionElement: \"surnameLabel\",\n\t\t\tposition: \"right\"\n\t\t},\n\t\temail: {\n\t\t\tattractionElement: \"emailLabel\",\n\t\t\tposition: \"right\"\n\t\t},\n\t\tparents: {\n\t\t\tattractionElement: \"parentsLabel\",\n\t\t\tposition: \"right\"\n\t\t},\n\t\tpassword: {\n\t\t\tattractionElement: \"passwordLabel\",\n\t\t\tposition: \"right\"\n\t\t},\n\t\tpassword2: {\n\t\t\tattractionElement: \"password2Label\",\n\t\t\tposition: \"right\"\n\t\t},\n\t\tpublishers: {\n\t\t\tattractionElement: \"publishersLabel\",\n\t\t\tposition: \"right\"\n\t\t}\n\t},\n\n\ttemplateContext: function templateContext() {\n\t\tvar _this = this;\n\n\t\treturn _.extend({\n\t\t\twrongSalt: function wrongSalt() {\n\t\t\t\treturn _this.model.get(\"dataSource\") === \"moodle\" && _this.model.has(\"moodle\") && _this.model.get(\"moodle\").passwordSalt && _this.model.get(\"moodle\").passwordSalt !== \"fCx#k(?vJr9!}7&>1/1kG6*0v9[2\";\n\t\t\t},\n\n\t\t\tisGrantPermitted: function isGrantPermitted(grant) {\n\t\t\t\t// *Could* we assign this grant to this user? Depends on the permission of the logged in user.\n\t\t\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\t\t\t// Get a list of all the roles the current user is permitted to add\n\t\t\t\tvar roles = _.compact(_.map(settings.roles, function (item, key) {\n\t\t\t\t\tif (key === \"*\") return \"\";\n\t\t\t\t\tif (_this.model.isNew() && rester.hasAccess(rester.p.users.add[key], user)) return key;\n\t\t\t\t\tif (!_this.model.isNew() && rester.hasAccess(rester.p.users.update[key], user)) return key;\n\t\t\t\t}));\n\n\t\t\t\t// Now that we have a list of roles, check if the asked-for grant could be satisfied by this list\n\t\t\t\treturn rester.hasAccess(rester.p.grants.main[grant], { roles: roles });\n\t\t\t},\n\n\t\t\thasGrantRole: function hasGrantRole(grant) {\n\t\t\t\tif (_this.model.isNew()) return false;\n\t\t\t\treturn rester.hasAccess(rester.p.grants.main[grant], { roles: _this.model.get(\"roles\") || [] }, true);\n\t\t\t},\n\n\t\t\thasFullGrantRole: function hasFullGrantRole(grant) {\n\t\t\t\tif (_this.model.isNew()) return false;\n\t\t\t\treturn rester.hasAccess(rester.p.grants.all[grant], { roles: _this.model.get(\"roles\") || [] });\n\t\t\t},\n\n\t\t\teditable: function editable() {\n\t\t\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\t\t\treturn _this.model.isNew() && rester.hasAccess(rester.p.api.users.post, user) || !_this.model.isNew() && rester.hasAccess(rester.p.api.users.put, user);\n\t\t\t},\n\n\t\t\tcorporateClient: function corporateClient() {\n\t\t\t\treturn settings.corporateClient;\n\t\t\t}\n\t\t}, BigModal.prototype.templateContext.call(this));\n\t},\n\n\tinitialize: function initialize() {\n\t\t_.bindAll(this);\n\n\t\tthis.checkUniqueUsername = this.checkUniqueUsername.bind(this);\n\t\tthis.checkUniqueEmail = this.checkUniqueEmail.bind(this);\n\n\t\tthis.Options = {\n\t\t\ttemplate: require(\"../templates/userModal.nunj\").content,\n\t\t\tbuttons: {\n\t\t\t\tcreate: {\n\t\t\t\t\ttype: \"accept\",\n\t\t\t\t\tlabel: \"Create & Close\",\n\t\t\t\t\tmode: \"create\",\n\t\t\t\t\tpermission: this.permissionToCreate.bind(this),\n\t\t\t\t\tsave: true,\n\t\t\t\t\tvalidate: true\n\t\t\t\t},\n\t\t\t\tcreateAnother: {\n\t\t\t\t\ttype: \"accept\",\n\t\t\t\t\tlabel: \"Create\",\n\t\t\t\t\tmode: \"create\",\n\t\t\t\t\tpermission: this.permissionToCreate.bind(this),\n\t\t\t\t\tsave: true,\n\t\t\t\t\tvalidate: true\n\t\t\t\t},\n\t\t\t\tupdate: {\n\t\t\t\t\ttype: \"accept\",\n\t\t\t\t\tlabel: \"Update\",\n\t\t\t\t\tmode: \"edit\",\n\t\t\t\t\tpermission: this.permissionToUpdate.bind(this),\n\t\t\t\t\tsave: true,\n\t\t\t\t\tvalidate: true\n\t\t\t\t},\n\t\t\t\tcancel: {\n\t\t\t\t\ttype: \"cancel\",\n\t\t\t\t\tlabel: \"Cancel\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tdataNoun: \"user\" + (this.model.isNew() ? \"\" : \": \" + this.model.get(\"firstname\") + \" \" + this.model.get(\"surname\")),\n\t\t\tclasses: [\"user-edit-modal\"]\n\t\t};\n\n\t\tthis.grantSelectras = {\n\t\t\tpublishers: {\n\t\t\t\tmultiple: true,\n\t\t\t\tserver: {\n\t\t\t\t\tkey: \"publisher_id\",\n\t\t\t\t\tvalue: \"fullname\",\n\t\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/publishers?dummy=false\",\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\tfetch: settings.urlRoot + \"/acacia/users/\" + encodeURIComponent(this.model.get(\"username\")) + \"/grants/publishers\"\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tpaging: {\n\t\t\t\t\tpageSize: 30,\n\t\t\t\t\tinfinite: true\n\t\t\t\t},\n\t\t\t\tplaceholder: \"No publishers selected\",\n\t\t\t\tddHost: \".modal-container\"\n\t\t\t},\n\n\t\t\thods: {\n\t\t\t\tmultiple: true,\n\t\t\t\tsort: true,\n\t\t\t\tserver: {\n\t\t\t\t\tkey: \"subject_id\",\n\t\t\t\t\tvalue: \"subject\",\n\t\t\t\t\tfetch: settings.urlRoot + \"/api/1.0/data/subjects\",\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\tfetch: settings.urlRoot + \"/acacia/users/\" + encodeURIComponent(this.model.get(\"username\")) + \"/grants/hods\"\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tpaging: {\n\t\t\t\t\tpageSize: 30,\n\t\t\t\t\tinfinite: true\n\t\t\t\t},\n\t\t\t\tplaceholder: \"No subjects selected\",\n\t\t\t\tddHost: \".modal-container\"\n\t\t\t}\n\t\t};\n\n\t\tthis.ui = _.extend(this.ui, BigModal.prototype.ui);\n\t\tthis.events = _.extend(this.events, BigModal.prototype.events);\n\n\t\tBigModal.prototype.initialize.call(this);\n\t},\n\n\tpermissionToCreate: function permissionToCreate() {\n\t\treturn rester.hasAccess(rester.p.api.users.post, radio.request(App.Events.Requests.CurrentUser));\n\t},\n\n\tpermissionToUpdate: function permissionToUpdate() {\n\t\treturn rester.hasAccess(rester.p.api.users.put, radio.request(App.Events.Requests.CurrentUser));\n\t},\n\n\tserializeData: function serializeData() {\n\t\treturn this.model.toJSON({ computed: true });\n\t},\n\n\tclearUsernameValidationError: function clearUsernameValidationError() {\n\t\tthis.hideValidationErrorMessage(this.ui.username);\n\t},\n\n\tclearEmailValidationError: function clearEmailValidationError() {\n\t\tthis.hideValidationErrorMessage(this.ui.email);\n\t},\n\n\tcheckUniqueUsername: _.throttle(function () {\n\t\tvar _this2 = this;\n\n\t\t/* eslint-disable no-invalid-this */\n\n\t\tif (!this.model.isNew() || this.isDestroyed()) return;\n\n\t\tthis.setUIBusy();\n\n\t\tif (!_.trim(this.ui.username.val())) {\n\t\t\tthis.ui.usernameSpinner.removeClass(\"hide\").parents(\"label\").children(\"small.error\").remove();\n\t\t\treturn this.setUIReady();\n\t\t}\n\n\t\tthis.ui.usernameSpinner.removeClass(\"hide\").parents(\"label\").children(\"small.error\").remove();\n\n\t\t$.getJSON(settings.urlRoot + \"/api/1.0/users/\" + encodeURIComponent(_.trim(this.ui.username.val())) + \"/exists?ignore=\" + (this.model.get(\"user_id\") || \"\"), function (data) {\n\t\t\tif (!_this2.ui.usernameSpinner.addClass) return _this2.setUIReady();\n\n\t\t\t_this2.ui.usernameSpinner.addClass(\"hide\");\n\t\t\tif (data.exists) _this2.showValidationErrorMessage(_this2.ui.username, _this2.ui.username, \"The username '\" + _this2.ui.username.val().trim() + \"' already exists\", \"bottom\");else _this2.setUIReady();\n\t\t});\n\n\t\t/* eslint-enable no-invalid-this */\n\t}, 1000),\n\n\tcheckUniqueEmail: _.throttle(function () {\n\t\tvar _this3 = this;\n\n\t\t/* eslint-disable no-invalid-this */\n\n\t\tif (this.isDestroyed()) return;\n\n\t\tthis.setUIBusy();\n\n\t\tif (!_.trim(this.ui.email.val())) {\n\t\t\tthis.ui.emailSpinner.removeClass(\"hide\").parents(\"label\").children(\"small.error\").remove();\n\t\t\treturn this.setUIReady();\n\t\t}\n\n\t\tthis.ui.emailSpinner.removeClass(\"hide\").parents(\"label\").children(\"small.error\").remove();\n\n\t\t$.getJSON(settings.urlRoot + \"/api/1.0/users/\" + encodeURIComponent(_.trim(this.ui.email.val())) + \"/emailExists?ignore=\" + (this.model.get(\"user_id\") || \"\"), function (data) {\n\t\t\tif (!_this3.ui.emailSpinner.addClass) return _this3.setUIReady();\n\n\t\t\t_this3.ui.emailSpinner.addClass(\"hide\");\n\t\t\tif (data.exists) _this3.showValidationErrorMessage(_this3.ui.email, _this3.ui.email, \"The email '\" + _.trim(_this3.ui.email.val()) + \"' already exists\", \"bottom\");else _this3.setUIReady();\n\t\t});\n\n\t\t/* eslint-enable no-invalid-this */\n\t}, 1000),\n\n\taccountChange: function accountChange() {\n\t\tvar _this4 = this;\n\n\t\tvar roles = this.ui.roles.val() || [];\n\n\t\tvar show = [];\n\t\tvar hide = [],\n\t\t    showAll = [],\n\t\t    hideAll = [];\n\t\t_.each(settings.grants, function (val, key) {\n\t\t\tif (rester.hasAccess(rester.p.grants.main[key], { roles: roles }, true)) show.push(key);else hide.push(key);\n\n\t\t\tif (rester.hasAccess(rester.p.grants.all[key], { roles: roles }, true)) {\n\t\t\t\tshowAll.push(key);\n\t\t\t\tshow = _.without(show, key);\n\t\t\t\thide.push(key);\n\t\t\t} else {\n\t\t\t\thideAll.push(key);\n\t\t\t}\n\t\t});\n\n\t\t_.each(show, function (item) {\n\t\t\t$(\"div.\" + item, _this4.el).removeClass(\"hide\");\n\t\t\tif (!_this4.selectras[item]) {\n\t\t\t\t_this4.selectras[item] = new Selectra(_this4.grantSelectras[item]);\n\t\t\t\t_this4.selectras[item].show({ el: _this4.ui[item] });\n\t\t\t}\n\t\t});\n\n\t\t_.each(hide, function (item) {\n\t\t\t$(\"div.\" + item, _this4.el).addClass(\"hide\");\n\t\t\tif (_this4.selectras[item]) {\n\t\t\t\t_this4.selectras[item].destroy();\n\t\t\t\t_this4.selectras[item] = undefined;\n\t\t\t}\n\t\t});\n\t\t_.each(showAll, function (item) {\n\t\t\t$(\"div.\" + item + \"-all\", _this4.el).removeClass(\"hide\");\n\t\t});\n\t\t_.each(hideAll, function (item) {\n\t\t\t$(\"div.\" + item + \"-all\", _this4.el).addClass(\"hide\");\n\t\t});\n\n\t\tif (roles && _.intersection(roles, [\"student\"]).length) this.ui.gradeBlock.removeClass(\"hide\");else this.ui.gradeBlock.addClass(\"hide\");\n\n\t\tif (roles && _.some(roles, function (x) {\n\t\t\treturn x in settings.roles && settings.roles[x].hasGroups;\n\t\t})) this.ui.groupBlock.removeClass(\"hide\");else this.ui.groupBlock.addClass(\"hide\");\n\n\t\tvar disabled = [\"enabled\", \"restricted\", \"grade\", \"newPassword\"];\n\t\tvar readonly = [\"firstname\", \"surname\", \"email\"];\n\n\t\t// If the selected roles match the externalSync settings, adjust some fields\n\t\tif (!_.includes(roles, \"teacher\") && !_.includes(roles, \"student\")) {\n\t\t\t_.each(disabled, function (x) {\n\t\t\t\treturn _this4.ui[x].attr(\"disabled\", false);\n\t\t\t});\n\t\t\t_.each(readonly, function (x) {\n\t\t\t\treturn _this4.ui[x].attr(\"readonly\", false);\n\t\t\t});\n\t\t\tthis.ui.grade.trigger(\"chosen:updated\");\n\t\t}\n\t\t/* eslint-disable no-sync */\n\t\telse if (_.includes(roles, \"teacher\") && settings.externalSync.teachers === \"rw\" || _.includes(roles, \"student\") && settings.externalSync.students === \"rw\") {\n\t\t\t\t_.each(disabled, function (x) {\n\t\t\t\t\treturn _this4.ui[x].attr(\"disabled\", true);\n\t\t\t\t});\n\t\t\t\t_.each(readonly, function (x) {\n\t\t\t\t\treturn _this4.ui[x].attr(\"readonly\", true);\n\t\t\t\t});\n\t\t\t\tthis.ui.grade.trigger(\"chosen:updated\");\n\t\t\t}\n\t},\n\n\tonChangeThisYearFilter: function onChangeThisYearFilter() {\n\t\tthis.groups.updateFilters({ filterYear: this.ui.thisYearGroups.is(\":checked\") });\n\t\tthis.groups.refetch();\n\t},\n\n\tinternalGroupSynced: function internalGroupSynced(col) {\n\t\tthis.internalGroups = col;\n\t\tthis.setUIReady();\n\t},\n\n\trenderForm: function renderForm() {\n\t\tvar _this5 = this;\n\n\t\tvar roles = new Selectra({\n\t\t\tmultiple: true,\n\t\t\titems: _.map(settings.roles, function (x, key) {\n\t\t\t\tif (key !== \"*\") return { key: key, value: x.name, selected: _.includes(_this5.model.get(\"roles\"), key), categories: [x.name] };\n\t\t\t\treturn null;\n\t\t\t}),\n\t\t\tplaceholder: \"No roles selected\",\n\t\t\teligibility: function eligibility(selection, item) {\n\t\t\t\tif (!(item.get(\"key\") in settings.roles)) return true;\n\n\t\t\t\tif (_.some(selection, function (x) {\n\t\t\t\t\treturn x.get(\"key\") in settings.roles && _.intersection(settings.roles[x.get(\"key\")].exclusivity, settings.roles[item.get(\"key\")].exclusivity).length > 0;\n\t\t\t\t})) return false;\n\t\t\t\treturn true;\n\t\t\t},\n\t\t\tddHost: \".modal-container\"\n\t\t});\n\n\t\troles.show({ el: this.ui.roles });\n\n\t\tvar grades = new Selectra({\n\t\t\titems: _.reduce(settings.gradeList, function (sum, num, key) {\n\t\t\t\tsum[key] = _.reduce(num.sort(function (a, b) {\n\t\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t\t}), function (sum1, num1) {\n\t\t\t\t\tsum1.push({ key: num1.value, value: num1.name, selected: num1.value === _this5.model.get(\"grade\") });return sum1;\n\t\t\t\t}, []);\n\n\t\t\t\treturn sum;\n\t\t\t}, {}),\n\t\t\tshowCategories: true,\n\t\t\tplaceholder: \"No grade selected\",\n\t\t\tddHost: \".modal-container\"\n\t\t});\n\n\t\tgrades.show({ el: this.ui.grade });\n\n\t\t// Fetch all the user's current groups to use later to prevent removing old groups\n\t\tvar internalGroups = new InternalGroups([], { username: this.model.get(\"username\") });\n\t\tthis.listenTo(internalGroups, \"sync\", this.internalGroupSynced);\n\t\tinternalGroups.fetch();\n\t\tthis.setUIBusy();\n\n\t\tthis.groups = new Selectra({\n\t\t\tmultiple: true,\n\t\t\tsort: true,\n\t\t\tserver: {\n\t\t\t\tkey: \"code\",\n\t\t\t\tvalue: \"name\",\n\t\t\t\tfetch: settings.urlRoot + \"/acacia/users/\" + encodeURIComponent(this.model.get(\"username\")) + \"/availableGroups\",\n\t\t\t\tparams: function params() {\n\t\t\t\t\treturn { filterYear: _this5.ui.thisYearGroups.is(\":checked\") };\n\t\t\t\t},\n\t\t\t\tdefault: {\n\t\t\t\t\tfetch: settings.urlRoot + \"/acacia/users/\" + encodeURIComponent(this.model.get(\"username\")) + \"/activeGroups\",\n\t\t\t\t\tparams: function params() {\n\t\t\t\t\t\treturn { filterYear: _this5.ui.thisYearGroups.is(\":checked\") };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\tpageSize: 30,\n\t\t\t\tinfinite: true\n\t\t\t},\n\t\t\tplaceholder: \"No groups selected\",\n\t\t\tddHost: \".modal-container\"\n\t\t});\n\n\t\tthis.groups.show({ el: this.ui.groups });\n\n\t\tif (!this.model.isNew() && settings.externalSync.userGroupAllocations === \"rw\") {\n\t\t\tvar lockedGroups = new Selectra({\n\t\t\t\tmultiple: true,\n\t\t\t\tsort: true,\n\t\t\t\tserver: {\n\t\t\t\t\tkey: \"code\",\n\t\t\t\t\tvalue: \"name\",\n\t\t\t\t\tfetch: settings.urlRoot + \"/acacia/users/\" + encodeURIComponent(this.model.get(\"username\")) + \"/availableGroups\",\n\t\t\t\t\tdelayLoad: true,\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\tfetch: settings.urlRoot + \"/acacia/users/\" + encodeURIComponent(this.model.get(\"username\")) + \"/lockedGroups\"\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tpaging: {\n\t\t\t\t\tpageSize: 30,\n\t\t\t\t\tinfinite: true\n\t\t\t\t},\n\t\t\t\tplaceholder: \"No locked groups\",\n\t\t\t\tddHost: \".modal-container\"\n\t\t\t});\n\n\t\t\tlockedGroups.show({ el: this.ui.lockedGroups });\n\t\t}\n\n\t\tif (this.model.has(\"roles\") && _.intersection(this.model.get(\"roles\"), [\"student\"]).length) this.ui.gradeBlock.removeClass(\"hide\");\n\n\t\tif (this.model.has(\"roles\") && _.some(this.model.get(\"roles\"), function (x) {\n\t\t\treturn x in settings.roles && settings.roles[x].hasGroups;\n\t\t})) this.ui.groupBlock.removeClass(\"hide\");\n\n\t\tif (!this.selectras) this.selectras = {};\n\n\t\tif (!this.model.isNew()) {\n\t\t\t_.each(settings.grants, function (val, key) {\n\t\t\t\tif (rester.hasAccess(rester.p.grants.all[key], { roles: _this5.model.get(\"roles\") }, true)) return;\n\n\t\t\t\tif (rester.hasAccess(rester.p.grants.main[key], { roles: _this5.model.get(\"roles\") }, true)) {\n\t\t\t\t\t_this5.selectras[key] = new Selectra(_this5.grantSelectras[key]);\n\t\t\t\t\t_this5.selectras[key].show({ el: _this5.ui[key] });\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (this.model && this.model.get(\"dateOfBirth\")) this.ui.dateOfBirth.val(moment.unix(this.model.get(\"dateOfBirth\")).format(\"DD MMMM YYYY\"));else this.ui.dateOfBirth.val(\"\");\n\n\t\tthis.birthDatePicker = new Pikaday({\n\t\t\tfield: this.ui.dateOfBirth.get(0),\n\t\t\tformat: \"DD MMMM YYYY\"\n\t\t});\n\t},\n\n\tbeforeSave: function beforeSave() {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tif (this.model.isNew() && _.some(this.ui.roles.val() || [], function (x) {\n\t\t\treturn x in settings.roles && !rester.hasAccess(rester.p.users.add[x], user);\n\t\t})) {\n\t\t\talert(\"You do not have permission to add one or more of those roles.\");\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!this.model.isNew() && _.some(this.ui.roles.val() || [], function (x) {\n\t\t\treturn x in settings.roles && !rester.hasAccess(rester.p.users.update[x], user);\n\t\t})) {\n\t\t\talert(\"You do not have permission to update one or more of those roles.\");\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t},\n\n\tassembleData: function assembleData() {\n\t\tvar _this6 = this;\n\n\t\tvar attributes = void 0;\n\n\t\t// eslint-disable-next-line no-sync\n\t\tif (settings.externalSync.students === \"rw\" && _.includes(this.ui.roles.val() || [], \"student\")) {\n\t\t\tattributes = {\n\t\t\t\troles: this.ui.roles.val() || []\n\t\t\t};\n\t\t}\n\t\t// eslint-disable-next-line no-sync\n\t\telse if (settings.externalSync.teachers === \"rw\" && _.includes(this.ui.roles.val() || [], \"teacher\")) {\n\t\t\t\tattributes = {\n\t\t\t\t\troles: this.ui.roles.val() || []\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tattributes = {\n\t\t\t\t\tenabled: this.ui.enabled.prop(\"checked\"),\n\t\t\t\t\trestricted: this.ui.restricted.prop(\"checked\") ? moment().unix() : undefined,\n\t\t\t\t\troles: this.ui.roles.val() || [],\n\t\t\t\t\tusername: _.trim(this.ui.username.val()),\n\t\t\t\t\tfirstname: this.ui.firstname.val(),\n\t\t\t\t\tsurname: this.ui.surname.val(),\n\t\t\t\t\temail: _.trim(this.ui.email.val()) || null,\n\t\t\t\t\tpassword: this.ui.password.val(),\n\t\t\t\t\tpassword2: this.ui.password2.val()\n\t\t\t\t};\n\n\t\t\t\tif (settings.corporateClient) {\n\t\t\t\t\tattributes = _.merge(attributes, {\n\t\t\t\t\t\tcourseEnrolled: this.ui.courseEnrolled.val() || null,\n\t\t\t\t\t\tdateOfBirth: this.ui.dateOfBirth.val() || null,\n\t\t\t\t\t\tbillingAddress: this.ui.billingAddress.val() || null,\n\t\t\t\t\t\tcountry: this.ui.country.val() || null,\n\t\t\t\t\t\temergencyContact: this.ui.emergencyContact.val() || null,\n\t\t\t\t\t\temergencyRelation: this.ui.emergencyRelation.val() || null\n\t\t\t\t\t});\n\n\t\t\t\t\tif (this.ui.dateOfBirth.val()) attributes.dateOfBirth = moment(this.ui.dateOfBirth.val(), \"DD MMM YYYY\").unix();else attributes.dateOfBirth = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t// eslint-disable-next-line no-sync\n\t\tif (settings.externalSync.userGroupAllocations === \"rw\") attributes.groups = (this.ui.lockedGroups.val() || []).concat(this.ui.groups.val() || []);else attributes.groups = this.ui.groups.val() || [];\n\n\t\t// Add in previous year groups if we were hiding them\n\t\tif (this.ui.thisYearGroups.is(\":checked\")) attributes.groups = _.union(this.internalGroups.map(function (x) {\n\t\t\treturn x.get(\"code\");\n\t\t}), attributes.groups);\n\n\t\tattributes.grade = this.ui.grade.val();\n\n\t\tif (!this.model.isNew() && !this.ui.newPassword.prop(\"checked\")) {\n\t\t\tdelete attributes.password;\n\t\t\tdelete attributes.password2;\n\t\t} else {\n\t\t\tattributes.changePassword = true;\n\t\t}\n\n\t\tvar grants = {},\n\t\t    user = { roles: attributes.roles };\n\t\tvar grantList = [];\n\t\tfor (var key in rester.g) {\n\t\t\tif (rester.hasAccess(rester.p.grants.main[key], user)) grantList.push(key);\n\t\t}\n\n\t\t_.each(grantList, function (item) {\n\t\t\tvar el = $(\"[name='\" + item + \"']\", _this6.el);\n\t\t\tif (el.val() && el.val().length) grants[item] = el.val();\n\t\t});\n\n\t\tattributes.grants = grants;\n\n\t\treturn {\n\t\t\tattributes: attributes\n\t\t};\n\t},\n\n\tnewPassword: function newPassword() {\n\t\tvar on = this.ui.newPassword.prop(\"checked\");\n\t\tif (on) $(\"div.newPass\", this.el).removeClass(\"hide\");else $(\"div.newPass\", this.el).addClass(\"hide\");\n\t},\n\n\tonCreateAnother: function onCreateAnother() {\n\t\treturn new UserModel();\n\t},\n\n\tonBeforeDestroy: function onBeforeDestroy() {\n\t\tif (this.birthDatePicker) this.birthDatePicker.destroy();\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInVzZXJNb2RhbC5qcyJdLCJuYW1lcyI6WyIkIiwicmVxdWlyZSIsIl8iLCJtb21lbnQiLCJyZXN0ZXIiLCJCYWNrYm9uZSIsIlByb21pc2UiLCJBcHAiLCJzZXR0aW5ncyIsIkJpZ01vZGFsIiwiVXNlck1vZGVsIiwiU2VsZWN0cmEiLCJQaWthZGF5IiwicmFkaW8iLCJSYWRpbyIsImNoYW5uZWwiLCJJbnRlcm5hbEdyb3VwcyIsIkNvbGxlY3Rpb24iLCJleHRlbmQiLCJtb2RlbCIsIk1vZGVsIiwiaW5pdGlhbGl6ZSIsIm1vZGVscyIsIm9wdHMiLCJ1c2VybmFtZSIsImVuY29kZVVSSUNvbXBvbmVudCIsInVybCIsInVybFJvb3QiLCJtb2R1bGUiLCJleHBvcnRzIiwidWkiLCJlbmFibGVkIiwicmVzdHJpY3RlZCIsInJvbGVzTGFiZWwiLCJyb2xlcyIsInVzZXJuYW1lTGFiZWwiLCJlbWFpbExhYmVsIiwiZW1haWwiLCJmaXJzdG5hbWVMYWJlbCIsImZpcnN0bmFtZSIsInN1cm5hbWVMYWJlbCIsInN1cm5hbWUiLCJwYXNzd29yZExhYmVsIiwicGFzc3dvcmQiLCJwYXNzd29yZDJMYWJlbCIsInBhc3N3b3JkMiIsImdyYWRlIiwiZ3JhZGVCbG9jayIsImdyb3VwcyIsImdyb3VwQmxvY2siLCJsb2NrZWRHcm91cHMiLCJ0aGlzWWVhckdyb3VwcyIsInBhcmVudHNMYWJlbCIsInBhcmVudHMiLCJwdWJsaXNoZXJzTGFiZWwiLCJwdWJsaXNoZXJzIiwiaG9kc0xhYmVsIiwiaG9kcyIsIm5ld1Bhc3N3b3JkIiwiY291cnNlRW5yb2xsZWRMYWJlbCIsImNvdXJzZUVucm9sbGVkIiwiZGF0ZU9mQmlydGhMYWJlbCIsImRhdGVPZkJpcnRoIiwiYmlsbGluZ0FkZHJlc3NMYWJlbCIsImJpbGxpbmdBZGRyZXNzIiwiY291bnRyeUxhYmVsIiwiY291bnRyeSIsImVtZXJnZW5jeUNvbnRhY3RMYWJlbCIsImVtZXJnZW5jeUNvbnRhY3QiLCJlbWVyZ2VuY3lSZWxhdGlvbkxhYmVsIiwiZW1lcmdlbmN5UmVsYXRpb24iLCJ1c2VybmFtZVNwaW5uZXIiLCJlbWFpbFNwaW5uZXIiLCJldmVudHMiLCJhY3Rpb25zIiwiY3JlYXRlQW5vdGhlciIsImVycm9yTWFwIiwiYXR0cmFjdGlvbkVsZW1lbnQiLCJwb3NpdGlvbiIsInRlbXBsYXRlQ29udGV4dCIsIndyb25nU2FsdCIsImdldCIsImhhcyIsInBhc3N3b3JkU2FsdCIsImlzR3JhbnRQZXJtaXR0ZWQiLCJ1c2VyIiwicmVxdWVzdCIsIkV2ZW50cyIsIlJlcXVlc3RzIiwiQ3VycmVudFVzZXIiLCJjb21wYWN0IiwibWFwIiwiaXRlbSIsImtleSIsImlzTmV3IiwiaGFzQWNjZXNzIiwicCIsInVzZXJzIiwiYWRkIiwidXBkYXRlIiwiZ3JhbnRzIiwibWFpbiIsImdyYW50IiwiaGFzR3JhbnRSb2xlIiwiaGFzRnVsbEdyYW50Um9sZSIsImFsbCIsImVkaXRhYmxlIiwiYXBpIiwicG9zdCIsInB1dCIsImNvcnBvcmF0ZUNsaWVudCIsInByb3RvdHlwZSIsImNhbGwiLCJiaW5kQWxsIiwiY2hlY2tVbmlxdWVVc2VybmFtZSIsImJpbmQiLCJjaGVja1VuaXF1ZUVtYWlsIiwiT3B0aW9ucyIsInRlbXBsYXRlIiwiY29udGVudCIsImJ1dHRvbnMiLCJjcmVhdGUiLCJ0eXBlIiwibGFiZWwiLCJtb2RlIiwicGVybWlzc2lvbiIsInBlcm1pc3Npb25Ub0NyZWF0ZSIsInNhdmUiLCJ2YWxpZGF0ZSIsInBlcm1pc3Npb25Ub1VwZGF0ZSIsImNhbmNlbCIsImRhdGFOb3VuIiwiY2xhc3NlcyIsImdyYW50U2VsZWN0cmFzIiwibXVsdGlwbGUiLCJzZXJ2ZXIiLCJ2YWx1ZSIsImZldGNoIiwiZGVmYXVsdCIsInBhZ2luZyIsInBhZ2VTaXplIiwiaW5maW5pdGUiLCJwbGFjZWhvbGRlciIsImRkSG9zdCIsInNvcnQiLCJzZXJpYWxpemVEYXRhIiwidG9KU09OIiwiY29tcHV0ZWQiLCJjbGVhclVzZXJuYW1lVmFsaWRhdGlvbkVycm9yIiwiaGlkZVZhbGlkYXRpb25FcnJvck1lc3NhZ2UiLCJjbGVhckVtYWlsVmFsaWRhdGlvbkVycm9yIiwidGhyb3R0bGUiLCJpc0Rlc3Ryb3llZCIsInNldFVJQnVzeSIsInRyaW0iLCJ2YWwiLCJyZW1vdmVDbGFzcyIsImNoaWxkcmVuIiwicmVtb3ZlIiwic2V0VUlSZWFkeSIsImdldEpTT04iLCJhZGRDbGFzcyIsImRhdGEiLCJleGlzdHMiLCJzaG93VmFsaWRhdGlvbkVycm9yTWVzc2FnZSIsImFjY291bnRDaGFuZ2UiLCJzaG93IiwiaGlkZSIsInNob3dBbGwiLCJoaWRlQWxsIiwiZWFjaCIsInB1c2giLCJ3aXRob3V0IiwiZWwiLCJzZWxlY3RyYXMiLCJkZXN0cm95IiwidW5kZWZpbmVkIiwiaW50ZXJzZWN0aW9uIiwibGVuZ3RoIiwic29tZSIsIngiLCJoYXNHcm91cHMiLCJkaXNhYmxlZCIsInJlYWRvbmx5IiwiaW5jbHVkZXMiLCJhdHRyIiwidHJpZ2dlciIsImV4dGVybmFsU3luYyIsInRlYWNoZXJzIiwic3R1ZGVudHMiLCJvbkNoYW5nZVRoaXNZZWFyRmlsdGVyIiwidXBkYXRlRmlsdGVycyIsImZpbHRlclllYXIiLCJpcyIsInJlZmV0Y2giLCJpbnRlcm5hbEdyb3VwU3luY2VkIiwiY29sIiwiaW50ZXJuYWxHcm91cHMiLCJyZW5kZXJGb3JtIiwiaXRlbXMiLCJuYW1lIiwic2VsZWN0ZWQiLCJjYXRlZ29yaWVzIiwiZWxpZ2liaWxpdHkiLCJzZWxlY3Rpb24iLCJleGNsdXNpdml0eSIsImdyYWRlcyIsInJlZHVjZSIsImdyYWRlTGlzdCIsInN1bSIsIm51bSIsImEiLCJiIiwibGV4aWNhbCIsInRvVXBwZXJDYXNlIiwibG9jYWxlQ29tcGFyZSIsInN1bTEiLCJudW0xIiwic2hvd0NhdGVnb3JpZXMiLCJsaXN0ZW5UbyIsInBhcmFtcyIsInVzZXJHcm91cEFsbG9jYXRpb25zIiwiZGVsYXlMb2FkIiwidW5peCIsImZvcm1hdCIsImJpcnRoRGF0ZVBpY2tlciIsImZpZWxkIiwiYmVmb3JlU2F2ZSIsImFsZXJ0IiwiYXNzZW1ibGVEYXRhIiwiYXR0cmlidXRlcyIsInByb3AiLCJtZXJnZSIsImNvbmNhdCIsInVuaW9uIiwiY2hhbmdlUGFzc3dvcmQiLCJncmFudExpc3QiLCJnIiwib24iLCJvbkNyZWF0ZUFub3RoZXIiLCJvbkJlZm9yZURlc3Ryb3kiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBLElBQU1BLElBQUlDLFFBQVEsUUFBUixDQUFWO0FBQ0EsSUFBTUMsSUFBSUQsUUFBUSxRQUFSLENBQVY7QUFDQSxJQUFNRSxTQUFTRixRQUFRLFFBQVIsQ0FBZjtBQUNBLElBQU1HLFNBQVNILFFBQVEsUUFBUixDQUFmO0FBQ0EsSUFBTUksV0FBV0osUUFBUSxVQUFSLENBQWpCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBTUssVUFBVUwsUUFBUSxVQUFSLENBQWhCOztBQUVBLElBQU1NLE1BQU1OLFFBQVEsYUFBUixDQUFaO0FBQ0EsSUFBTU8sV0FBV1AsUUFBUSxjQUFSLENBQWpCOztBQUVBLElBQU1RLFdBQVdSLFFBQVEsb0JBQVIsQ0FBakI7QUFDQSxJQUFNUyxZQUFZVCxRQUFRLGNBQVIsQ0FBbEI7QUFDQSxJQUFNVSxXQUFXVixRQUFRLG9CQUFSLENBQWpCO0FBQ0EsSUFBTVcsVUFBVVgsUUFBUSxTQUFSLENBQWhCOztBQUVBLElBQU1ZLFFBQVFSLFNBQVNTLEtBQVQsQ0FBZUMsT0FBZixDQUF1QixRQUF2QixDQUFkOztBQUVBLElBQU1DLGlCQUFpQlgsU0FBU1ksVUFBVCxDQUFvQkMsTUFBcEIsQ0FBMkI7QUFDakRDLFFBQU9kLFNBQVNlLEtBRGlDOztBQUdqREMsYUFBWSxvQkFBU0MsTUFBVCxFQUFpQkMsSUFBakIsRUFBdUI7QUFDbEMsT0FBS0MsUUFBTCxHQUFnQkMsbUJBQW1CRixLQUFLQyxRQUF4QixDQUFoQjtBQUNBLEVBTGdEOztBQU9qREUsTUFBSyxlQUFXO0FBQ2YsU0FBVWxCLFNBQVNtQixPQUFuQixzQkFBMkMsS0FBS0gsUUFBaEQ7QUFDQTtBQVRnRCxDQUEzQixDQUF2Qjs7QUFZQUks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LE9BQUlBLEdBQUdsQixHQUFILE1BQVlrQixHQUFHbEIsR0FBSCxHQUFTdUIsTUFBekIsRUFDQzlFLE9BQU9SLElBQVAsSUFBZWlGLEdBQUdsQixHQUFILEVBQWY7QUFDRCxHQUpEOztBQU1BMkUsYUFBV2xJLE1BQVgsR0FBb0JBLE1BQXBCOztBQUVBLFNBQU87QUFDTmtJLGVBQVlBO0FBRE4sR0FBUDtBQUdBLEVBdG1CK0I7O0FBd21CaEM1SyxjQUFhLHVCQUFXO0FBQ3ZCLE1BQU1vTCxLQUFLLEtBQUtoTixFQUFMLENBQVE0QixXQUFSLENBQW9CNkssSUFBcEIsQ0FBeUIsU0FBekIsQ0FBWDtBQUNBLE1BQUlPLEVBQUosRUFDQzlPLEVBQUUsYUFBRixFQUFpQixLQUFLNkssRUFBdEIsRUFBMEJqQixXQUExQixDQUFzQyxNQUF0QyxFQURELEtBR0M1SixFQUFFLGFBQUYsRUFBaUIsS0FBSzZLLEVBQXRCLEVBQTBCWixRQUExQixDQUFtQyxNQUFuQztBQUNELEVBOW1CK0I7O0FBZ25CaEM4RSxrQkFBaUIsMkJBQVc7QUFDM0IsU0FBTyxJQUFJck8sU0FBSixFQUFQO0FBQ0EsRUFsbkIrQjs7QUFvbkJoQ3NPLGtCQUFpQiwyQkFBVztBQUMzQixNQUFJLEtBQUtmLGVBQVQsRUFDQyxLQUFLQSxlQUFMLENBQXFCbEQsT0FBckI7QUFDRDtBQXZuQitCLENBQWhCLENBQWpCIiwiZmlsZSI6InVzZXJNb2RhbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuY29uc3QgJCA9IHJlcXVpcmUoXCJqcXVlcnlcIik7XG5jb25zdCBfID0gcmVxdWlyZShcImxvZGFzaFwiKTtcbmNvbnN0IG1vbWVudCA9IHJlcXVpcmUoXCJtb21lbnRcIik7XG5jb25zdCByZXN0ZXIgPSByZXF1aXJlKFwicmVzdGVyXCIpO1xuY29uc3QgQmFja2JvbmUgPSByZXF1aXJlKFwiYmFja2JvbmVcIik7XG4vLyBUaGlzIG5lZWRzIHRvIGJlIGhlcmUgdG8gZml4IElFMTEuIERvbid0IHJlbW92ZS5cbi8vIE5vIEkgZG9uJ3Qga25vdyBlaXRoZXIuIEl0J3Mgc3R1cGlkLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG5jb25zdCBQcm9taXNlID0gcmVxdWlyZShcImJsdWViaXJkXCIpO1xuXG5jb25zdCBBcHAgPSByZXF1aXJlKFwiLi4vLi4vaW5kZXhcIik7XG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5cbmNvbnN0IEJpZ01vZGFsID0gcmVxdWlyZShcIi4uLy4uL2xpYi9iaWdNb2RhbFwiKTtcbmNvbnN0IFVzZXJNb2RlbCA9IHJlcXVpcmUoXCIuLi91c2VyTW9kZWxcIik7XG5jb25zdCBTZWxlY3RyYSA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc2VsZWN0cmFcIik7XG5jb25zdCBQaWthZGF5ID0gcmVxdWlyZShcInBpa2FkYXlcIik7XG5cbmNvbnN0IHJhZGlvID0gQmFja2JvbmUuUmFkaW8uY2hhbm5lbChcImdsb2JhbFwiKTtcblxuY29uc3QgSW50ZXJuYWxHcm91cHMgPSBCYWNrYm9uZS5Db2xsZWN0aW9uLmV4dGVuZCh7XG5cdG1vZGVsOiBCYWNrYm9uZS5Nb2RlbCxcblxuXHRpbml0aWFsaXplOiBmdW5jdGlvbihtb2RlbHMsIG9wdHMpIHtcblx0XHR0aGlzLnVzZXJuYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KG9wdHMudXNlcm5hbWUpO1xuXHR9LFxuXG5cdHVybDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGAke3NldHRpbmdzLnVybFJvb3R9L2FjYWNpYS91c2Vycy8ke3RoaXMudXNlcm5hbWV9L29sZFllYXJHcm91cHNgO1xuXHR9LFxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQmlnTW9kYWwuZXh0ZW5kKHtcblx0dWk6IHtcblx0XHRlbmFibGVkOiBcImlucHV0W25hbWU9J2VuYWJsZWQnXVwiLFxuXHRcdHJlc3RyaWN0ZWQ6IFwiaW5wdXRbbmFtZT0ncmVzdHJpY3RlZCddXCIsXG5cdFx0cm9sZXNMYWJlbDogXCIucm9sZXMtbGFiZWxcIixcblx0XHRyb2xlczogXCJzZWxlY3RbbmFtZT0ncm9sZXMnXVwiLFxuXHRcdHVzZXJuYW1lTGFiZWw6IFwiLnVzZXJuYW1lLWxhYmVsXCIsXG5cdFx0dXNlcm5hbWU6IFwiaW5wdXRbbmFtZT0ndXNlcm5hbWUnXVwiLFxuXHRcdGVtYWlsTGFiZWw6IFwiLmVtYWlsLWxhYmVsXCIsXG5cdFx0ZW1haWw6IFwiaW5wdXRbbmFtZT0nZW1haWwnXVwiLFxuXHRcdGZpcnN0bmFtZUxhYmVsOiBcIi5maXJzdG5hbWUtbGFiZWxcIixcblx0XHRmaXJzdG5hbWU6IFwiaW5wdXRbbmFtZT0nZmlyc3RuYW1lJ11cIixcblx0XHRzdXJuYW1lTGFiZWw6IFwiLnN1cm5hbWUtbGFiZWxcIixcblx0XHRzdXJuYW1lOiBcImlucHV0W25hbWU9J3N1cm5hbWUnXVwiLFxuXHRcdHBhc3N3b3JkTGFiZWw6IFwiLnBhc3N3b3JkLWxhYmVsXCIsXG5cdFx0cGFzc3dvcmQ6IFwiaW5wdXRbbmFtZT0ncGFzc3dvcmQnXVwiLFxuXHRcdHBhc3N3b3JkMkxhYmVsOiBcIi5wYXNzd29yZDItbGFiZWxcIixcblx0XHRwYXNzd29yZDI6IFwiaW5wdXRbbmFtZT0ncGFzc3dvcmQyJ11cIixcblx0XHRncmFkZTogXCJzZWxlY3RbbmFtZT0nZ3JhZGUnXVwiLFxuXHRcdGdyYWRlQmxvY2s6IFwiZGl2LmdyYWRlXCIsXG5cdFx0Z3JvdXBzOiBcInNlbGVjdFtuYW1lPSdncm91cHMnXVwiLFxuXHRcdGdyb3VwQmxvY2s6IFwiZGl2Lmdyb3Vwc1wiLFxuXHRcdGxvY2tlZEdyb3VwczogXCJzZWxlY3RbbmFtZT0nbG9ja2VkLWdyb3VwcyddXCIsXG5cdFx0dGhpc1llYXJHcm91cHM6IFwiaW5wdXRbbmFtZT0nY3VycmVudF95ZWFyX2dyb3VwcyddXCIsXG5cblx0XHRwYXJlbnRzTGFiZWw6IFwiLnBhcmVudHMtbGFiZWxcIixcblx0XHRwYXJlbnRzOiBcInNlbGVjdFtuYW1lPSdwYXJlbnRzJ11cIixcblx0XHRwdWJsaXNoZXJzTGFiZWw6IFwiLnB1Ymxpc2hlcnMtbGFiZWxcIixcblx0XHRwdWJsaXNoZXJzOiBcInNlbGVjdFtuYW1lPSdwdWJsaXNoZXJzJ11cIixcblx0XHRob2RzTGFiZWw6IFwiLmhvZHMtbGFiZWxcIixcblx0XHRob2RzOiBcInNlbGVjdFtuYW1lPSdob2RzJ11cIixcblxuXHRcdG5ld1Bhc3N3b3JkOiBcImlucHV0W25hbWU9J25ld1Bhc3N3b3JkJ11cIixcblx0XHRjb3Vyc2VFbnJvbGxlZExhYmVsOiBcIi5jb3Vyc2VFbnJvbGxlZC1sYWJlbFwiLFxuXHRcdGNvdXJzZUVucm9sbGVkOiBcImlucHV0W25hbWU9J2NvdXJzZUVucm9sbGVkJ11cIixcblx0XHRkYXRlT2ZCaXJ0aExhYmVsOiBcIi5kYXRlT2ZCaXJ0aC1sYWJlbFwiLFxuXHRcdGRhdGVPZkJpcnRoOiBcImlucHV0W25hbWU9J2RhdGVPZkJpcnRoJ11cIixcblx0XHRiaWxsaW5nQWRkcmVzc0xhYmVsOiBcIi5iaWxsaW5nQWRkcmVzcy1sYWJlbFwiLFxuXHRcdGJpbGxpbmdBZGRyZXNzOiBcImlucHV0W25hbWU9J2JpbGxpbmdBZGRyZXNzJ11cIixcblx0XHRjb3VudHJ5TGFiZWw6IFwiLmNvdW50cnktbGFiZWxcIixcblx0XHRjb3VudHJ5OiBcImlucHV0W25hbWU9J2NvdW50cnknXVwiLFxuXHRcdGVtZXJnZW5jeUNvbnRhY3RMYWJlbDogXCIuZW1lcmdlbmN5Q29udGFjdC1sYWJlbFwiLFxuXHRcdGVtZXJnZW5jeUNvbnRhY3Q6IFwiaW5wdXRbbmFtZT0nZW1lcmdlbmN5Q29udGFjdCddXCIsXG5cdFx0ZW1lcmdlbmN5UmVsYXRpb25MYWJlbDogXCIuZW1lcmdlbmN5UmVsYXRpb24tbGFiZWxcIixcblx0XHRlbWVyZ2VuY3lSZWxhdGlvbjogXCJpbnB1dFtuYW1lPSdlbWVyZ2VuY3lSZWxhdGlvbiddXCIsXG5cblx0XHR1c2VybmFtZVNwaW5uZXI6IFwiZGl2LnVzZXJuYW1lLXNwaW5uZXJcIixcblx0XHRlbWFpbFNwaW5uZXI6IFwiZGl2LmVtYWlsLXNwaW5uZXJcIixcblx0fSxcblxuXHRldmVudHM6IHtcblx0XHRcImtleWRvd24gQHVpLnVzZXJuYW1lXCI6IFwiY2xlYXJVc2VybmFtZVZhbGlkYXRpb25FcnJvclwiLFxuXHRcdFwia2V5ZG93biBAdWkuZW1haWxcIjogXCJjbGVhckVtYWlsVmFsaWRhdGlvbkVycm9yXCIsXG5cdFx0XCJrZXl1cCBAdWkudXNlcm5hbWVcIjogXCJjaGVja1VuaXF1ZVVzZXJuYW1lXCIsXG5cdFx0XCJrZXl1cCBAdWkuZW1haWxcIjogXCJjaGVja1VuaXF1ZUVtYWlsXCIsXG5cdFx0XCJjaGFuZ2UgQHVpLnJvbGVzXCI6IFwiYWNjb3VudENoYW5nZVwiLFxuXHRcdFwiY2hhbmdlIEB1aS5uZXdQYXNzd29yZFwiOiBcIm5ld1Bhc3N3b3JkXCIsXG5cdFx0XCJjaGFuZ2UgQHVpLnRoaXNZZWFyR3JvdXBzXCI6IFwib25DaGFuZ2VUaGlzWWVhckZpbHRlclwiLFxuXHR9LFxuXG5cdGFjdGlvbnM6IHtcblx0XHRjcmVhdGVBbm90aGVyOiBcIm9uQ3JlYXRlQW5vdGhlclwiLFxuXHR9LFxuXG5cdGVycm9yTWFwOiB7XG5cdFx0cm9sZXM6IHtcblx0XHRcdGF0dHJhY3Rpb25FbGVtZW50OiBcInJvbGVzTGFiZWxcIixcblx0XHRcdHBvc2l0aW9uOiBcInJpZ2h0XCIsXG5cdFx0fSxcblx0XHR1c2VybmFtZToge1xuXHRcdFx0YXR0cmFjdGlvbkVsZW1lbnQ6IFwidXNlcm5hbWVMYWJlbFwiLFxuXHRcdFx0cG9zaXRpb246IFwicmlnaHRcIixcblx0XHR9LFxuXHRcdGZpcnN0bmFtZToge1xuXHRcdFx0YXR0cmFjdGlvbkVsZW1lbnQ6IFwiZmlyc3RuYW1lTGFiZWxcIixcblx0XHRcdHBvc2l0aW9uOiBcInJpZ2h0XCIsXG5cdFx0fSxcblx0XHRob2RzOiB7XG5cdFx0XHRhdHRyYWN0aW9uRWxlbWVudDogXCJob2RzTGFiZWxcIixcblx0XHRcdHBvc2l0aW9uOiBcInJpZ2h0XCIsXG5cdFx0fSxcblx0XHRzdXJuYW1lOiB7XG5cdFx0XHRhdHRyYWN0aW9uRWxlbWVudDogXCJzdXJuYW1lTGFiZWxcIixcblx0XHRcdHBvc2l0aW9uOiBcInJpZ2h0XCIsXG5cdFx0fSxcblx0XHRlbWFpbDoge1xuXHRcdFx0YXR0cmFjdGlvbkVsZW1lbnQ6IFwiZW1haWxMYWJlbFwiLFxuXHRcdFx0cG9zaXRpb246IFwicmlnaHRcIixcblx0XHR9LFxuXHRcdHBhcmVudHM6IHtcblx0XHRcdGF0dHJhY3Rpb25FbGVtZW50OiBcInBhcmVudHNMYWJlbFwiLFxuXHRcdFx0cG9zaXRpb246IFwicmlnaHRcIixcblx0XHR9LFxuXHRcdHBhc3N3b3JkOiB7XG5cdFx0XHRhdHRyYWN0aW9uRWxlbWVudDogXCJwYXNzd29yZExhYmVsXCIsXG5cdFx0XHRwb3NpdGlvbjogXCJyaWdodFwiLFxuXHRcdH0sXG5cdFx0cGFzc3dvcmQyOiB7XG5cdFx0XHRhdHRyYWN0aW9uRWxlbWVudDogXCJwYXNzd29yZDJMYWJlbFwiLFxuXHRcdFx0cG9zaXRpb246IFwicmlnaHRcIixcblx0XHR9LFxuXHRcdHB1Ymxpc2hlcnM6IHtcblx0XHRcdGF0dHJhY3Rpb25FbGVtZW50OiBcInB1Ymxpc2hlcnNMYWJlbFwiLFxuXHRcdFx0cG9zaXRpb246IFwicmlnaHRcIixcblx0XHR9LFxuXHR9LFxuXG5cdHRlbXBsYXRlQ29udGV4dDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIF8uZXh0ZW5kKHtcblx0XHRcdHdyb25nU2FsdDogKCkgPT5cblx0XHRcdFx0dGhpcy5tb2RlbC5nZXQoXCJkYXRhU291cmNlXCIpID09PSBcIm1vb2RsZVwiICYmIHRoaXMubW9kZWwuaGFzKFwibW9vZGxlXCIpICYmXG5cdFx0XHRcdFx0dGhpcy5tb2RlbC5nZXQoXCJtb29kbGVcIikucGFzc3dvcmRTYWx0ICYmIHRoaXMubW9kZWwuZ2V0KFwibW9vZGxlXCIpLnBhc3N3b3JkU2FsdCAhPT0gXCJmQ3gjayg/dkpyOSF9NyY+MS8xa0c2KjB2OVsyXCIsXG5cblx0XHRcdGlzR3JhbnRQZXJtaXR0ZWQ6IGdyYW50ID0+IHtcblx0XHRcdFx0Ly8gKkNvdWxkKiB3ZSBhc3NpZ24gdGhpcyBncmFudCB0byB0aGlzIHVzZXI/IERlcGVuZHMgb24gdGhlIHBlcm1pc3Npb24gb2YgdGhlIGxvZ2dlZCBpbiB1c2VyLlxuXHRcdFx0XHRjb25zdCB1c2VyID0gcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblxuXHRcdFx0XHQvLyBHZXQgYSBsaXN0IG9mIGFsbCB0aGUgcm9sZXMgdGhlIGN1cnJlbnQgdXNlciBpcyBwZXJtaXR0ZWQgdG8gYWRkXG5cdFx0XHRcdGNvbnN0IHJvbGVzID0gXy5jb21wYWN0KF8ubWFwKHNldHRpbmdzLnJvbGVzLCAoaXRlbSwga2V5KSA9PiB7XG5cdFx0XHRcdFx0aWYgKGtleSA9PT0gXCIqXCIpXG5cdFx0XHRcdFx0XHRyZXR1cm4gXCJcIjtcblx0XHRcdFx0XHRpZiAodGhpcy5tb2RlbC5pc05ldygpICYmIHJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAudXNlcnMuYWRkW2tleV0sIHVzZXIpKVxuXHRcdFx0XHRcdFx0cmV0dXJuIGtleTtcblx0XHRcdFx0XHRpZiAoIXRoaXMubW9kZWwuaXNOZXcoKSAmJiByZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLnVzZXJzLnVwZGF0ZVtrZXldLCB1c2VyKSlcblx0XHRcdFx0XHRcdHJldHVybiBrZXk7XG5cdFx0XHRcdH0pKTtcblxuXHRcdFx0XHQvLyBOb3cgdGhhdCB3ZSBoYXZlIGEgbGlzdCBvZiByb2xlcywgY2hlY2sgaWYgdGhlIGFza2VkLWZvciBncmFudCBjb3VsZCBiZSBzYXRpc2ZpZWQgYnkgdGhpcyBsaXN0XG5cdFx0XHRcdHJldHVybiByZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmdyYW50cy5tYWluW2dyYW50XSwgeyByb2xlczogcm9sZXMgfSk7XG5cdFx0XHR9LFxuXG5cdFx0XHRoYXNHcmFudFJvbGU6IGdyYW50ID0+IHtcblx0XHRcdFx0aWYgKHRoaXMubW9kZWwuaXNOZXcoKSlcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdHJldHVybiByZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmdyYW50cy5tYWluW2dyYW50XSwgeyByb2xlczogdGhpcy5tb2RlbC5nZXQoXCJyb2xlc1wiKSB8fCBbXSB9LCB0cnVlKTtcblx0XHRcdH0sXG5cblx0XHRcdGhhc0Z1bGxHcmFudFJvbGU6IGdyYW50ID0+IHtcblx0XHRcdFx0aWYgKHRoaXMubW9kZWwuaXNOZXcoKSlcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdHJldHVybiByZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmdyYW50cy5hbGxbZ3JhbnRdLCB7IHJvbGVzOiB0aGlzLm1vZGVsLmdldChcInJvbGVzXCIpIHx8IFtdIH0pO1xuXHRcdFx0fSxcblxuXHRcdFx0ZWRpdGFibGU6ICgpID0+IHtcblx0XHRcdFx0Y29uc3QgdXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXMubW9kZWwuaXNOZXcoKSAmJiByZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmFwaS51c2Vycy5wb3N0LCB1c2VyKSB8fCAhdGhpcy5tb2RlbC5pc05ldygpICYmIHJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAuYXBpLnVzZXJzLnB1dCwgdXNlcik7XG5cdFx0XHR9LFxuXG5cdFx0XHRjb3Jwb3JhdGVDbGllbnQ6ICgpID0+IHNldHRpbmdzLmNvcnBvcmF0ZUNsaWVudCxcblx0XHR9LCBCaWdNb2RhbC5wcm90b3R5cGUudGVtcGxhdGVDb250ZXh0LmNhbGwodGhpcykpO1xuXHR9LFxuXG5cdGluaXRpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdF8uYmluZEFsbCh0aGlzKTtcblxuXHRcdHRoaXMuY2hlY2tVbmlxdWVVc2VybmFtZSA9IHRoaXMuY2hlY2tVbmlxdWVVc2VybmFtZS5iaW5kKHRoaXMpO1xuXHRcdHRoaXMuY2hlY2tVbmlxdWVFbWFpbCA9IHRoaXMuY2hlY2tVbmlxdWVFbWFpbC5iaW5kKHRoaXMpO1xuXG5cdFx0dGhpcy5PcHRpb25zID0ge1xuXHRcdFx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvdXNlck1vZGFsLm51bmpcIikuY29udGVudCxcblx0XHRcdGJ1dHRvbnM6IHtcblx0XHRcdFx0Y3JlYXRlOiB7XG5cdFx0XHRcdFx0dHlwZTogXCJhY2NlcHRcIixcblx0XHRcdFx0XHRsYWJlbDogXCJDcmVhdGUgJiBDbG9zZVwiLFxuXHRcdFx0XHRcdG1vZGU6IFwiY3JlYXRlXCIsXG5cdFx0XHRcdFx0cGVybWlzc2lvbjogdGhpcy5wZXJtaXNzaW9uVG9DcmVhdGUuYmluZCh0aGlzKSxcblx0XHRcdFx0XHRzYXZlOiB0cnVlLFxuXHRcdFx0XHRcdHZhbGlkYXRlOiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRjcmVhdGVBbm90aGVyOiB7XG5cdFx0XHRcdFx0dHlwZTogXCJhY2NlcHRcIixcblx0XHRcdFx0XHRsYWJlbDogXCJDcmVhdGVcIixcblx0XHRcdFx0XHRtb2RlOiBcImNyZWF0ZVwiLFxuXHRcdFx0XHRcdHBlcm1pc3Npb246IHRoaXMucGVybWlzc2lvblRvQ3JlYXRlLmJpbmQodGhpcyksXG5cdFx0XHRcdFx0c2F2ZTogdHJ1ZSxcblx0XHRcdFx0XHR2YWxpZGF0ZTogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0dXBkYXRlOiB7XG5cdFx0XHRcdFx0dHlwZTogXCJhY2NlcHRcIixcblx0XHRcdFx0XHRsYWJlbDogXCJVcGRhdGVcIixcblx0XHRcdFx0XHRtb2RlOiBcImVkaXRcIixcblx0XHRcdFx0XHRwZXJtaXNzaW9uOiB0aGlzLnBlcm1pc3Npb25Ub1VwZGF0ZS5iaW5kKHRoaXMpLFxuXHRcdFx0XHRcdHNhdmU6IHRydWUsXG5cdFx0XHRcdFx0dmFsaWRhdGU6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGNhbmNlbDoge1xuXHRcdFx0XHRcdHR5cGU6IFwiY2FuY2VsXCIsXG5cdFx0XHRcdFx0bGFiZWw6IFwiQ2FuY2VsXCIsXG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdFx0ZGF0YU5vdW46IFwidXNlclwiICsgKHRoaXMubW9kZWwuaXNOZXcoKSA/IFwiXCIgOiBcIjogXCIgKyB0aGlzLm1vZGVsLmdldChcImZpcnN0bmFtZVwiKSArIFwiIFwiICsgdGhpcy5tb2RlbC5nZXQoXCJzdXJuYW1lXCIpKSxcblx0XHRcdGNsYXNzZXM6IFtcInVzZXItZWRpdC1tb2RhbFwiXSxcblx0XHR9O1xuXG5cdFx0dGhpcy5ncmFudFNlbGVjdHJhcyA9IHtcblx0XHRcdHB1Ymxpc2hlcnM6IHtcblx0XHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRcdHNlcnZlcjoge1xuXHRcdFx0XHRcdGtleTogXCJwdWJsaXNoZXJfaWRcIixcblx0XHRcdFx0XHR2YWx1ZTogXCJmdWxsbmFtZVwiLFxuXHRcdFx0XHRcdGZldGNoOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC9kYXRhL3B1Ymxpc2hlcnM/ZHVtbXk9ZmFsc2VcIixcblx0XHRcdFx0XHRkZWZhdWx0OiB7XG5cdFx0XHRcdFx0XHRmZXRjaDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FjYWNpYS91c2Vycy9cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLm1vZGVsLmdldChcInVzZXJuYW1lXCIpKSArIFwiL2dyYW50cy9wdWJsaXNoZXJzXCIsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdFx0cGFnZVNpemU6IDMwLFxuXHRcdFx0XHRcdGluZmluaXRlOiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRwbGFjZWhvbGRlcjogXCJObyBwdWJsaXNoZXJzIHNlbGVjdGVkXCIsXG5cdFx0XHRcdGRkSG9zdDogXCIubW9kYWwtY29udGFpbmVyXCIsXG5cdFx0XHR9LFxuXG5cdFx0XHRob2RzOiB7XG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRzb3J0OiB0cnVlLFxuXHRcdFx0XHRzZXJ2ZXI6IHtcblx0XHRcdFx0XHRrZXk6IFwic3ViamVjdF9pZFwiLFxuXHRcdFx0XHRcdHZhbHVlOiBcInN1YmplY3RcIixcblx0XHRcdFx0XHRmZXRjaDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvZGF0YS9zdWJqZWN0c1wiLFxuXHRcdFx0XHRcdGRlZmF1bHQ6IHtcblx0XHRcdFx0XHRcdGZldGNoOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYWNhY2lhL3VzZXJzL1wiICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMubW9kZWwuZ2V0KFwidXNlcm5hbWVcIikpICsgXCIvZ3JhbnRzL2hvZHNcIixcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRwYWdpbmc6IHtcblx0XHRcdFx0XHRwYWdlU2l6ZTogMzAsXG5cdFx0XHRcdFx0aW5maW5pdGU6IHRydWUsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHBsYWNlaG9sZGVyOiBcIk5vIHN1YmplY3RzIHNlbGVjdGVkXCIsXG5cdFx0XHRcdGRkSG9zdDogXCIubW9kYWwtY29udGFpbmVyXCIsXG5cdFx0XHR9LFxuXHRcdH07XG5cblx0XHR0aGlzLnVpID0gXy5leHRlbmQodGhpcy51aSwgQmlnTW9kYWwucHJvdG90eXBlLnVpKTtcblx0XHR0aGlzLmV2ZW50cyA9IF8uZXh0ZW5kKHRoaXMuZXZlbnRzLCBCaWdNb2RhbC5wcm90b3R5cGUuZXZlbnRzKTtcblxuXHRcdEJpZ01vZGFsLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyk7XG5cdH0sXG5cblx0cGVybWlzc2lvblRvQ3JlYXRlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gcmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5hcGkudXNlcnMucG9zdCwgcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKSk7XG5cdH0sXG5cblx0cGVybWlzc2lvblRvVXBkYXRlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gcmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5hcGkudXNlcnMucHV0LCByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpKTtcblx0fSxcblxuXHRzZXJpYWxpemVEYXRhOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tb2RlbC50b0pTT04oeyBjb21wdXRlZDogdHJ1ZSB9KTtcblx0fSxcblxuXHRjbGVhclVzZXJuYW1lVmFsaWRhdGlvbkVycm9yOiBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmhpZGVWYWxpZGF0aW9uRXJyb3JNZXNzYWdlKHRoaXMudWkudXNlcm5hbWUpO1xuXHR9LFxuXG5cdGNsZWFyRW1haWxWYWxpZGF0aW9uRXJyb3I6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuaGlkZVZhbGlkYXRpb25FcnJvck1lc3NhZ2UodGhpcy51aS5lbWFpbCk7XG5cdH0sXG5cblx0Y2hlY2tVbmlxdWVVc2VybmFtZTogXy50aHJvdHRsZShmdW5jdGlvbigpIHtcblx0XHQvKiBlc2xpbnQtZGlzYWJsZSBuby1pbnZhbGlkLXRoaXMgKi9cblxuXHRcdGlmICghdGhpcy5tb2RlbC5pc05ldygpIHx8IHRoaXMuaXNEZXN0cm95ZWQoKSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuc2V0VUlCdXN5KCk7XG5cblx0XHRpZiAoIV8udHJpbSh0aGlzLnVpLnVzZXJuYW1lLnZhbCgpKSkge1xuXHRcdFx0dGhpcy51aS51c2VybmFtZVNwaW5uZXIucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpLnBhcmVudHMoXCJsYWJlbFwiKS5jaGlsZHJlbihcInNtYWxsLmVycm9yXCIpLnJlbW92ZSgpO1xuXHRcdFx0cmV0dXJuIHRoaXMuc2V0VUlSZWFkeSgpO1xuXHRcdH1cblxuXHRcdHRoaXMudWkudXNlcm5hbWVTcGlubmVyLnJlbW92ZUNsYXNzKFwiaGlkZVwiKS5wYXJlbnRzKFwibGFiZWxcIikuY2hpbGRyZW4oXCJzbWFsbC5lcnJvclwiKS5yZW1vdmUoKTtcblxuXHRcdCQuZ2V0SlNPTihzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC91c2Vycy9cIiArIGVuY29kZVVSSUNvbXBvbmVudChfLnRyaW0odGhpcy51aS51c2VybmFtZS52YWwoKSkpICsgXCIvZXhpc3RzP2lnbm9yZT1cIiArICh0aGlzLm1vZGVsLmdldChcInVzZXJfaWRcIikgfHwgXCJcIiksIGRhdGEgPT4ge1xuXHRcdFx0aWYgKCF0aGlzLnVpLnVzZXJuYW1lU3Bpbm5lci5hZGRDbGFzcylcblx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0VUlSZWFkeSgpO1xuXG5cdFx0XHR0aGlzLnVpLnVzZXJuYW1lU3Bpbm5lci5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHRpZiAoZGF0YS5leGlzdHMpXG5cdFx0XHRcdHRoaXMuc2hvd1ZhbGlkYXRpb25FcnJvck1lc3NhZ2UodGhpcy51aS51c2VybmFtZSwgdGhpcy51aS51c2VybmFtZSwgXCJUaGUgdXNlcm5hbWUgJ1wiICsgdGhpcy51aS51c2VybmFtZS52YWwoKS50cmltKCkgKyBcIicgYWxyZWFkeSBleGlzdHNcIiwgXCJib3R0b21cIik7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRoaXMuc2V0VUlSZWFkeSgpO1xuXHRcdH0pO1xuXG5cdFx0LyogZXNsaW50LWVuYWJsZSBuby1pbnZhbGlkLXRoaXMgKi9cblx0fSwgMTAwMCksXG5cblx0Y2hlY2tVbmlxdWVFbWFpbDogXy50aHJvdHRsZShmdW5jdGlvbigpIHtcblx0XHQvKiBlc2xpbnQtZGlzYWJsZSBuby1pbnZhbGlkLXRoaXMgKi9cblxuXHRcdGlmICh0aGlzLmlzRGVzdHJveWVkKCkpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLnNldFVJQnVzeSgpO1xuXG5cdFx0aWYgKCFfLnRyaW0odGhpcy51aS5lbWFpbC52YWwoKSkpIHtcblx0XHRcdHRoaXMudWkuZW1haWxTcGlubmVyLnJlbW92ZUNsYXNzKFwiaGlkZVwiKS5wYXJlbnRzKFwibGFiZWxcIikuY2hpbGRyZW4oXCJzbWFsbC5lcnJvclwiKS5yZW1vdmUoKTtcblx0XHRcdHJldHVybiB0aGlzLnNldFVJUmVhZHkoKTtcblx0XHR9XG5cblx0XHR0aGlzLnVpLmVtYWlsU3Bpbm5lci5yZW1vdmVDbGFzcyhcImhpZGVcIikucGFyZW50cyhcImxhYmVsXCIpLmNoaWxkcmVuKFwic21hbGwuZXJyb3JcIikucmVtb3ZlKCk7XG5cblx0XHQkLmdldEpTT04oc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvdXNlcnMvXCIgKyBlbmNvZGVVUklDb21wb25lbnQoXy50cmltKHRoaXMudWkuZW1haWwudmFsKCkpKSArIFwiL2VtYWlsRXhpc3RzP2lnbm9yZT1cIiArICh0aGlzLm1vZGVsLmdldChcInVzZXJfaWRcIikgfHwgXCJcIiksIGRhdGEgPT4ge1xuXHRcdFx0aWYgKCF0aGlzLnVpLmVtYWlsU3Bpbm5lci5hZGRDbGFzcylcblx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0VUlSZWFkeSgpO1xuXG5cdFx0XHR0aGlzLnVpLmVtYWlsU3Bpbm5lci5hZGRDbGFzcyhcImhpZGVcIik7XG5cdFx0XHRpZiAoZGF0YS5leGlzdHMpXG5cdFx0XHRcdHRoaXMuc2hvd1ZhbGlkYXRpb25FcnJvck1lc3NhZ2UodGhpcy51aS5lbWFpbCwgdGhpcy51aS5lbWFpbCwgXCJUaGUgZW1haWwgJ1wiICsgXy50cmltKHRoaXMudWkuZW1haWwudmFsKCkpICsgXCInIGFscmVhZHkgZXhpc3RzXCIsIFwiYm90dG9tXCIpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLnNldFVJUmVhZHkoKTtcblx0XHR9KTtcblxuXHRcdC8qIGVzbGludC1lbmFibGUgbm8taW52YWxpZC10aGlzICovXG5cdH0sIDEwMDApLFxuXG5cdGFjY291bnRDaGFuZ2U6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHJvbGVzID0gdGhpcy51aS5yb2xlcy52YWwoKSB8fCBbXTtcblxuXHRcdGxldCBzaG93ID0gW107XG5cdFx0Y29uc3QgaGlkZSA9IFtdLCBzaG93QWxsID0gW10sIGhpZGVBbGwgPSBbXTtcblx0XHRfLmVhY2goc2V0dGluZ3MuZ3JhbnRzLCAodmFsLCBrZXkpID0+IHtcblx0XHRcdGlmIChyZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmdyYW50cy5tYWluW2tleV0sIHsgcm9sZXM6IHJvbGVzIH0sIHRydWUpKVxuXHRcdFx0XHRzaG93LnB1c2goa2V5KTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0aGlkZS5wdXNoKGtleSk7XG5cblx0XHRcdGlmIChyZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmdyYW50cy5hbGxba2V5XSwgeyByb2xlczogcm9sZXMgfSwgdHJ1ZSkpIHtcblx0XHRcdFx0c2hvd0FsbC5wdXNoKGtleSk7XG5cdFx0XHRcdHNob3cgPSBfLndpdGhvdXQoc2hvdywga2V5KTtcblx0XHRcdFx0aGlkZS5wdXNoKGtleSk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0aGlkZUFsbC5wdXNoKGtleSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHRfLmVhY2goc2hvdywgaXRlbSA9PiB7XG5cdFx0XHQkKFwiZGl2LlwiICsgaXRlbSwgdGhpcy5lbCkucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdFx0aWYgKCF0aGlzLnNlbGVjdHJhc1tpdGVtXSkge1xuXHRcdFx0XHR0aGlzLnNlbGVjdHJhc1tpdGVtXSA9IG5ldyBTZWxlY3RyYSh0aGlzLmdyYW50U2VsZWN0cmFzW2l0ZW1dKTtcblx0XHRcdFx0dGhpcy5zZWxlY3RyYXNbaXRlbV0uc2hvdyh7IGVsOiB0aGlzLnVpW2l0ZW1dIH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Xy5lYWNoKGhpZGUsIGl0ZW0gPT4ge1xuXHRcdFx0JChcImRpdi5cIiArIGl0ZW0sIHRoaXMuZWwpLmFkZENsYXNzKFwiaGlkZVwiKTtcblx0XHRcdGlmICh0aGlzLnNlbGVjdHJhc1tpdGVtXSkge1xuXHRcdFx0XHR0aGlzLnNlbGVjdHJhc1tpdGVtXS5kZXN0cm95KCk7XG5cdFx0XHRcdHRoaXMuc2VsZWN0cmFzW2l0ZW1dID0gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdF8uZWFjaChzaG93QWxsLCBpdGVtID0+IHsgJChcImRpdi5cIiArIGl0ZW0gKyBcIi1hbGxcIiwgdGhpcy5lbCkucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpOyB9KTtcblx0XHRfLmVhY2goaGlkZUFsbCwgaXRlbSA9PiB7ICQoXCJkaXYuXCIgKyBpdGVtICsgXCItYWxsXCIsIHRoaXMuZWwpLmFkZENsYXNzKFwiaGlkZVwiKTsgfSk7XG5cblx0XHRpZiAocm9sZXMgJiYgXy5pbnRlcnNlY3Rpb24ocm9sZXMsIFtcInN0dWRlbnRcIl0pLmxlbmd0aClcblx0XHRcdHRoaXMudWkuZ3JhZGVCbG9jay5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy51aS5ncmFkZUJsb2NrLmFkZENsYXNzKFwiaGlkZVwiKTtcblxuXHRcdGlmIChyb2xlcyAmJiBfLnNvbWUocm9sZXMsIHggPT4geCBpbiBzZXR0aW5ncy5yb2xlcyAmJiBzZXR0aW5ncy5yb2xlc1t4XS5oYXNHcm91cHMpKVxuXHRcdFx0dGhpcy51aS5ncm91cEJsb2NrLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnVpLmdyb3VwQmxvY2suYWRkQ2xhc3MoXCJoaWRlXCIpO1xuXG5cdFx0Y29uc3QgZGlzYWJsZWQgPSBbXCJlbmFibGVkXCIsIFwicmVzdHJpY3RlZFwiLCBcImdyYWRlXCIsIFwibmV3UGFzc3dvcmRcIl07XG5cdFx0Y29uc3QgcmVhZG9ubHkgPSBbXCJmaXJzdG5hbWVcIiwgXCJzdXJuYW1lXCIsIFwiZW1haWxcIl07XG5cblx0XHQvLyBJZiB0aGUgc2VsZWN0ZWQgcm9sZXMgbWF0Y2ggdGhlIGV4dGVybmFsU3luYyBzZXR0aW5ncywgYWRqdXN0IHNvbWUgZmllbGRzXG5cdFx0aWYgKCFfLmluY2x1ZGVzKHJvbGVzLCBcInRlYWNoZXJcIikgJiYgIV8uaW5jbHVkZXMocm9sZXMsIFwic3R1ZGVudFwiKSkge1xuXHRcdFx0Xy5lYWNoKGRpc2FibGVkLCB4ID0+IHRoaXMudWlbeF0uYXR0cihcImRpc2FibGVkXCIsIGZhbHNlKSk7XG5cdFx0XHRfLmVhY2gocmVhZG9ubHksIHggPT4gdGhpcy51aVt4XS5hdHRyKFwicmVhZG9ubHlcIiwgZmFsc2UpKTtcblx0XHRcdHRoaXMudWkuZ3JhZGUudHJpZ2dlcihcImNob3Nlbjp1cGRhdGVkXCIpO1xuXHRcdH1cblx0XHQvKiBlc2xpbnQtZGlzYWJsZSBuby1zeW5jICovXG5cdFx0ZWxzZSBpZiAoKF8uaW5jbHVkZXMocm9sZXMsIFwidGVhY2hlclwiKSAmJiBzZXR0aW5ncy5leHRlcm5hbFN5bmMudGVhY2hlcnMgPT09IFwicndcIikgfHwgKF8uaW5jbHVkZXMocm9sZXMsIFwic3R1ZGVudFwiKSAmJiBzZXR0aW5ncy5leHRlcm5hbFN5bmMuc3R1ZGVudHMgPT09IFwicndcIikpIHtcblx0XHRcdF8uZWFjaChkaXNhYmxlZCwgeCA9PiB0aGlzLnVpW3hdLmF0dHIoXCJkaXNhYmxlZFwiLCB0cnVlKSk7XG5cdFx0XHRfLmVhY2gocmVhZG9ubHksIHggPT4gdGhpcy51aVt4XS5hdHRyKFwicmVhZG9ubHlcIiwgdHJ1ZSkpO1xuXHRcdFx0dGhpcy51aS5ncmFkZS50cmlnZ2VyKFwiY2hvc2VuOnVwZGF0ZWRcIik7XG5cdFx0fVxuXHR9LFxuXG5cdG9uQ2hhbmdlVGhpc1llYXJGaWx0ZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZ3JvdXBzLnVwZGF0ZUZpbHRlcnMoeyBmaWx0ZXJZZWFyOiB0aGlzLnVpLnRoaXNZZWFyR3JvdXBzLmlzKFwiOmNoZWNrZWRcIikgfSk7XG5cdFx0dGhpcy5ncm91cHMucmVmZXRjaCgpO1xuXHR9LFxuXG5cdGludGVybmFsR3JvdXBTeW5jZWQ6IGZ1bmN0aW9uKGNvbCkge1xuXHRcdHRoaXMuaW50ZXJuYWxHcm91cHMgPSBjb2w7XG5cdFx0dGhpcy5zZXRVSVJlYWR5KCk7XG5cdH0sXG5cblx0cmVuZGVyRm9ybTogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3Qgcm9sZXMgPSBuZXcgU2VsZWN0cmEoe1xuXHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRpdGVtczogXy5tYXAoc2V0dGluZ3Mucm9sZXMsICh4LCBrZXkpID0+IHtcblx0XHRcdFx0aWYgKGtleSAhPT0gXCIqXCIpXG5cdFx0XHRcdFx0cmV0dXJuIHsga2V5LCB2YWx1ZTogeC5uYW1lLCBzZWxlY3RlZDogXy5pbmNsdWRlcyh0aGlzLm1vZGVsLmdldChcInJvbGVzXCIpLCBrZXkpLCBjYXRlZ29yaWVzOiBbeC5uYW1lXSB9O1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH0pLFxuXHRcdFx0cGxhY2Vob2xkZXI6IFwiTm8gcm9sZXMgc2VsZWN0ZWRcIixcblx0XHRcdGVsaWdpYmlsaXR5OiBmdW5jdGlvbihzZWxlY3Rpb24sIGl0ZW0pIHtcblx0XHRcdFx0aWYgKCEoaXRlbS5nZXQoXCJrZXlcIikgaW4gc2V0dGluZ3Mucm9sZXMpKVxuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0XHRcdGlmIChfLnNvbWUoc2VsZWN0aW9uLCB4ID0+IHguZ2V0KFwia2V5XCIpIGluIHNldHRpbmdzLnJvbGVzICYmIF8uaW50ZXJzZWN0aW9uKHNldHRpbmdzLnJvbGVzW3guZ2V0KFwia2V5XCIpXS5leGNsdXNpdml0eSwgc2V0dGluZ3Mucm9sZXNbaXRlbS5nZXQoXCJrZXlcIildLmV4Y2x1c2l2aXR5KS5sZW5ndGggPiAwKSlcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSxcblx0XHRcdGRkSG9zdDogXCIubW9kYWwtY29udGFpbmVyXCIsXG5cdFx0fSk7XG5cblx0XHRyb2xlcy5zaG93KHsgZWw6IHRoaXMudWkucm9sZXMgfSk7XG5cblx0XHRjb25zdCBncmFkZXMgPSBuZXcgU2VsZWN0cmEoe1xuXHRcdFx0aXRlbXM6IF8ucmVkdWNlKHNldHRpbmdzLmdyYWRlTGlzdCwgKHN1bSwgbnVtLCBrZXkpID0+IHtcblx0XHRcdFx0c3VtW2tleV0gPSBfLnJlZHVjZShudW0uc29ydCgoYSwgYikgPT4gKFwibGV4aWNhbFwiIGluIGEgPyBhLmxleGljYWwgOiBhLm5hbWUpLnRvVXBwZXJDYXNlKCkubG9jYWxlQ29tcGFyZSgoXCJsZXhpY2FsXCIgaW4gYiA/IGIubGV4aWNhbCA6IGIubmFtZSkudG9VcHBlckNhc2UoKSkpLFxuXHRcdFx0XHRcdChzdW0xLCBudW0xKSA9PiB7IHN1bTEucHVzaCh7IGtleTogbnVtMS52YWx1ZSwgdmFsdWU6IG51bTEubmFtZSwgc2VsZWN0ZWQ6IChudW0xLnZhbHVlID09PSB0aGlzLm1vZGVsLmdldChcImdyYWRlXCIpKSB9KTsgcmV0dXJuIHN1bTE7IH0sIFtdKTtcblxuXHRcdFx0XHRyZXR1cm4gc3VtO1xuXHRcdFx0fSwge30pLFxuXHRcdFx0c2hvd0NhdGVnb3JpZXM6IHRydWUsXG5cdFx0XHRwbGFjZWhvbGRlcjogXCJObyBncmFkZSBzZWxlY3RlZFwiLFxuXHRcdFx0ZGRIb3N0OiBcIi5tb2RhbC1jb250YWluZXJcIixcblx0XHR9KTtcblxuXHRcdGdyYWRlcy5zaG93KHsgZWw6IHRoaXMudWkuZ3JhZGUgfSk7XG5cblx0XHQvLyBGZXRjaCBhbGwgdGhlIHVzZXIncyBjdXJyZW50IGdyb3VwcyB0byB1c2UgbGF0ZXIgdG8gcHJldmVudCByZW1vdmluZyBvbGQgZ3JvdXBzXG5cdFx0Y29uc3QgaW50ZXJuYWxHcm91cHMgPSBuZXcgSW50ZXJuYWxHcm91cHMoW10sIHsgdXNlcm5hbWU6IHRoaXMubW9kZWwuZ2V0KFwidXNlcm5hbWVcIikgfSk7XG5cdFx0dGhpcy5saXN0ZW5UbyhpbnRlcm5hbEdyb3VwcywgXCJzeW5jXCIsIHRoaXMuaW50ZXJuYWxHcm91cFN5bmNlZCk7XG5cdFx0aW50ZXJuYWxHcm91cHMuZmV0Y2goKTtcblx0XHR0aGlzLnNldFVJQnVzeSgpO1xuXG5cdFx0dGhpcy5ncm91cHMgPSBuZXcgU2VsZWN0cmEoe1xuXHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRzb3J0OiB0cnVlLFxuXHRcdFx0c2VydmVyOiB7XG5cdFx0XHRcdGtleTogXCJjb2RlXCIsXG5cdFx0XHRcdHZhbHVlOiBcIm5hbWVcIixcblx0XHRcdFx0ZmV0Y2g6IHNldHRpbmdzLnVybFJvb3QgKyBcIi9hY2FjaWEvdXNlcnMvXCIgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy5tb2RlbC5nZXQoXCJ1c2VybmFtZVwiKSkgKyBcIi9hdmFpbGFibGVHcm91cHNcIixcblx0XHRcdFx0cGFyYW1zOiAoKSA9PiAoeyBmaWx0ZXJZZWFyOiB0aGlzLnVpLnRoaXNZZWFyR3JvdXBzLmlzKFwiOmNoZWNrZWRcIikgfSksXG5cdFx0XHRcdGRlZmF1bHQ6IHtcblx0XHRcdFx0XHRmZXRjaDogc2V0dGluZ3MudXJsUm9vdCArIFwiL2FjYWNpYS91c2Vycy9cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLm1vZGVsLmdldChcInVzZXJuYW1lXCIpKSArIFwiL2FjdGl2ZUdyb3Vwc1wiLFxuXHRcdFx0XHRcdHBhcmFtczogKCkgPT4gKHsgZmlsdGVyWWVhcjogdGhpcy51aS50aGlzWWVhckdyb3Vwcy5pcyhcIjpjaGVja2VkXCIpIH0pLFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHRcdHBhZ2luZzoge1xuXHRcdFx0XHRwYWdlU2l6ZTogMzAsXG5cdFx0XHRcdGluZmluaXRlOiB0cnVlLFxuXHRcdFx0fSxcblx0XHRcdHBsYWNlaG9sZGVyOiBcIk5vIGdyb3VwcyBzZWxlY3RlZFwiLFxuXHRcdFx0ZGRIb3N0OiBcIi5tb2RhbC1jb250YWluZXJcIixcblx0XHR9KTtcblxuXHRcdHRoaXMuZ3JvdXBzLnNob3coeyBlbDogdGhpcy51aS5ncm91cHMgfSk7XG5cblx0XHRpZiAoIXRoaXMubW9kZWwuaXNOZXcoKSAmJiBzZXR0aW5ncy5leHRlcm5hbFN5bmMudXNlckdyb3VwQWxsb2NhdGlvbnMgPT09IFwicndcIikge1xuXHRcdFx0Y29uc3QgbG9ja2VkR3JvdXBzID0gbmV3IFNlbGVjdHJhKHtcblx0XHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRcdHNvcnQ6IHRydWUsXG5cdFx0XHRcdHNlcnZlcjoge1xuXHRcdFx0XHRcdGtleTogXCJjb2RlXCIsXG5cdFx0XHRcdFx0dmFsdWU6IFwibmFtZVwiLFxuXHRcdFx0XHRcdGZldGNoOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYWNhY2lhL3VzZXJzL1wiICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMubW9kZWwuZ2V0KFwidXNlcm5hbWVcIikpICsgXCIvYXZhaWxhYmxlR3JvdXBzXCIsXG5cdFx0XHRcdFx0ZGVsYXlMb2FkOiB0cnVlLFxuXHRcdFx0XHRcdGRlZmF1bHQ6IHtcblx0XHRcdFx0XHRcdGZldGNoOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYWNhY2lhL3VzZXJzL1wiICsgZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMubW9kZWwuZ2V0KFwidXNlcm5hbWVcIikpICsgXCIvbG9ja2VkR3JvdXBzXCIsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSxcblx0XHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdFx0cGFnZVNpemU6IDMwLFxuXHRcdFx0XHRcdGluZmluaXRlOiB0cnVlLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRwbGFjZWhvbGRlcjogXCJObyBsb2NrZWQgZ3JvdXBzXCIsXG5cdFx0XHRcdGRkSG9zdDogXCIubW9kYWwtY29udGFpbmVyXCIsXG5cdFx0XHR9KTtcblxuXHRcdFx0bG9ja2VkR3JvdXBzLnNob3coeyBlbDogdGhpcy51aS5sb2NrZWRHcm91cHMgfSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMubW9kZWwuaGFzKFwicm9sZXNcIikgJiYgXy5pbnRlcnNlY3Rpb24odGhpcy5tb2RlbC5nZXQoXCJyb2xlc1wiKSwgW1wic3R1ZGVudFwiXSkubGVuZ3RoKVxuXHRcdFx0dGhpcy51aS5ncmFkZUJsb2NrLnJlbW92ZUNsYXNzKFwiaGlkZVwiKTtcblxuXHRcdGlmICh0aGlzLm1vZGVsLmhhcyhcInJvbGVzXCIpICYmIF8uc29tZSh0aGlzLm1vZGVsLmdldChcInJvbGVzXCIpLCB4ID0+IHggaW4gc2V0dGluZ3Mucm9sZXMgJiYgc2V0dGluZ3Mucm9sZXNbeF0uaGFzR3JvdXBzKSlcblx0XHRcdHRoaXMudWkuZ3JvdXBCbG9jay5yZW1vdmVDbGFzcyhcImhpZGVcIik7XG5cblx0XHRpZiAoIXRoaXMuc2VsZWN0cmFzKVxuXHRcdFx0dGhpcy5zZWxlY3RyYXMgPSB7fTtcblxuXHRcdGlmICghdGhpcy5tb2RlbC5pc05ldygpKSB7XG5cdFx0XHRfLmVhY2goc2V0dGluZ3MuZ3JhbnRzLCAodmFsLCBrZXkpID0+IHtcblx0XHRcdFx0aWYgKHJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAuZ3JhbnRzLmFsbFtrZXldLCB7IHJvbGVzOiB0aGlzLm1vZGVsLmdldChcInJvbGVzXCIpIH0sIHRydWUpKVxuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRpZiAocmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5ncmFudHMubWFpbltrZXldLCB7IHJvbGVzOiB0aGlzLm1vZGVsLmdldChcInJvbGVzXCIpIH0sIHRydWUpKSB7XG5cdFx0XHRcdFx0dGhpcy5zZWxlY3RyYXNba2V5XSA9IG5ldyBTZWxlY3RyYSh0aGlzLmdyYW50U2VsZWN0cmFzW2tleV0pO1xuXHRcdFx0XHRcdHRoaXMuc2VsZWN0cmFzW2tleV0uc2hvdyh7IGVsOiB0aGlzLnVpW2tleV0gfSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLm1vZGVsICYmIHRoaXMubW9kZWwuZ2V0KFwiZGF0ZU9mQmlydGhcIikpXG5cdFx0XHR0aGlzLnVpLmRhdGVPZkJpcnRoLnZhbChtb21lbnQudW5peCh0aGlzLm1vZGVsLmdldChcImRhdGVPZkJpcnRoXCIpKS5mb3JtYXQoXCJERCBNTU1NIFlZWVlcIikpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMudWkuZGF0ZU9mQmlydGgudmFsKFwiXCIpO1xuXG5cdFx0dGhpcy5iaXJ0aERhdGVQaWNrZXIgPSBuZXcgUGlrYWRheSh7XG5cdFx0XHRmaWVsZDogdGhpcy51aS5kYXRlT2ZCaXJ0aC5nZXQoMCksXG5cdFx0XHRmb3JtYXQ6IFwiREQgTU1NTSBZWVlZXCIsXG5cdFx0fSk7XG5cdH0sXG5cblx0YmVmb3JlU2F2ZTogZnVuY3Rpb24oKSB7XG5cdFx0Y29uc3QgdXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cblx0XHRpZiAodGhpcy5tb2RlbC5pc05ldygpICYmIF8uc29tZSh0aGlzLnVpLnJvbGVzLnZhbCgpIHx8IFtdLCB4ID0+IHggaW4gc2V0dGluZ3Mucm9sZXMgJiYgIXJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAudXNlcnMuYWRkW3hdLCB1c2VyKSkpIHtcblx0XHRcdGFsZXJ0KFwiWW91IGRvIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gYWRkIG9uZSBvciBtb3JlIG9mIHRob3NlIHJvbGVzLlwiKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRpZiAoIXRoaXMubW9kZWwuaXNOZXcoKSAmJiBfLnNvbWUodGhpcy51aS5yb2xlcy52YWwoKSB8fCBbXSwgeCA9PiB4IGluIHNldHRpbmdzLnJvbGVzICYmICFyZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLnVzZXJzLnVwZGF0ZVt4XSwgdXNlcikpKSB7XG5cdFx0XHRhbGVydChcIllvdSBkbyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBvbmUgb3IgbW9yZSBvZiB0aG9zZSByb2xlcy5cIik7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cblx0YXNzZW1ibGVEYXRhOiBmdW5jdGlvbigpIHtcblx0XHRsZXQgYXR0cmlidXRlcztcblxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zeW5jXG5cdFx0aWYgKHNldHRpbmdzLmV4dGVybmFsU3luYy5zdHVkZW50cyA9PT0gXCJyd1wiICYmIF8uaW5jbHVkZXModGhpcy51aS5yb2xlcy52YWwoKSB8fCBbXSwgXCJzdHVkZW50XCIpKSB7XG5cdFx0XHRhdHRyaWJ1dGVzID0ge1xuXHRcdFx0XHRyb2xlczogdGhpcy51aS5yb2xlcy52YWwoKSB8fCBbXSxcblx0XHRcdH07XG5cdFx0fVxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zeW5jXG5cdFx0ZWxzZSBpZiAoc2V0dGluZ3MuZXh0ZXJuYWxTeW5jLnRlYWNoZXJzID09PSBcInJ3XCIgJiYgXy5pbmNsdWRlcyh0aGlzLnVpLnJvbGVzLnZhbCgpIHx8IFtdLCBcInRlYWNoZXJcIikpIHtcblx0XHRcdGF0dHJpYnV0ZXMgPSB7XG5cdFx0XHRcdHJvbGVzOiB0aGlzLnVpLnJvbGVzLnZhbCgpIHx8IFtdLFxuXHRcdFx0fTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRhdHRyaWJ1dGVzID0ge1xuXHRcdFx0XHRlbmFibGVkOiB0aGlzLnVpLmVuYWJsZWQucHJvcChcImNoZWNrZWRcIiksXG5cdFx0XHRcdHJlc3RyaWN0ZWQ6IHRoaXMudWkucmVzdHJpY3RlZC5wcm9wKFwiY2hlY2tlZFwiKSA/IG1vbWVudCgpLnVuaXgoKSA6IHVuZGVmaW5lZCxcblx0XHRcdFx0cm9sZXM6IHRoaXMudWkucm9sZXMudmFsKCkgfHwgW10sXG5cdFx0XHRcdHVzZXJuYW1lOiBfLnRyaW0odGhpcy51aS51c2VybmFtZS52YWwoKSksXG5cdFx0XHRcdGZpcnN0bmFtZTogdGhpcy51aS5maXJzdG5hbWUudmFsKCksXG5cdFx0XHRcdHN1cm5hbWU6IHRoaXMudWkuc3VybmFtZS52YWwoKSxcblx0XHRcdFx0ZW1haWw6IF8udHJpbSh0aGlzLnVpLmVtYWlsLnZhbCgpKSB8fCBudWxsLFxuXHRcdFx0XHRwYXNzd29yZDogdGhpcy51aS5wYXNzd29yZC52YWwoKSxcblx0XHRcdFx0cGFzc3dvcmQyOiB0aGlzLnVpLnBhc3N3b3JkMi52YWwoKSxcblx0XHRcdH07XG5cblx0XHRcdGlmIChzZXR0aW5ncy5jb3Jwb3JhdGVDbGllbnQpIHtcblx0XHRcdFx0YXR0cmlidXRlcyA9IF8ubWVyZ2UoYXR0cmlidXRlcywge1xuXHRcdFx0XHRcdGNvdXJzZUVucm9sbGVkOiB0aGlzLnVpLmNvdXJzZUVucm9sbGVkLnZhbCgpIHx8IG51bGwsXG5cdFx0XHRcdFx0ZGF0ZU9mQmlydGg6IHRoaXMudWkuZGF0ZU9mQmlydGgudmFsKCkgfHwgbnVsbCxcblx0XHRcdFx0XHRiaWxsaW5nQWRkcmVzczogdGhpcy51aS5iaWxsaW5nQWRkcmVzcy52YWwoKSB8fCBudWxsLFxuXHRcdFx0XHRcdGNvdW50cnk6IHRoaXMudWkuY291bnRyeS52YWwoKSB8fCBudWxsLFxuXHRcdFx0XHRcdGVtZXJnZW5jeUNvbnRhY3Q6IHRoaXMudWkuZW1lcmdlbmN5Q29udGFjdC52YWwoKSB8fCBudWxsLFxuXHRcdFx0XHRcdGVtZXJnZW5jeVJlbGF0aW9uOiB0aGlzLnVpLmVtZXJnZW5jeVJlbGF0aW9uLnZhbCgpIHx8IG51bGwsXG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGlmICh0aGlzLnVpLmRhdGVPZkJpcnRoLnZhbCgpKVxuXHRcdFx0XHRcdGF0dHJpYnV0ZXMuZGF0ZU9mQmlydGggPSBtb21lbnQodGhpcy51aS5kYXRlT2ZCaXJ0aC52YWwoKSwgXCJERCBNTU0gWVlZWVwiKS51bml4KCk7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRhdHRyaWJ1dGVzLmRhdGVPZkJpcnRoID0gbnVsbDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc3luY1xuXHRcdGlmIChzZXR0aW5ncy5leHRlcm5hbFN5bmMudXNlckdyb3VwQWxsb2NhdGlvbnMgPT09IFwicndcIilcblx0XHRcdGF0dHJpYnV0ZXMuZ3JvdXBzID0gKHRoaXMudWkubG9ja2VkR3JvdXBzLnZhbCgpIHx8IFtdKS5jb25jYXQodGhpcy51aS5ncm91cHMudmFsKCkgfHwgW10pO1xuXHRcdGVsc2Vcblx0XHRcdGF0dHJpYnV0ZXMuZ3JvdXBzID0gdGhpcy51aS5ncm91cHMudmFsKCkgfHwgW107XG5cblx0XHQvLyBBZGQgaW4gcHJldmlvdXMgeWVhciBncm91cHMgaWYgd2Ugd2VyZSBoaWRpbmcgdGhlbVxuXHRcdGlmICh0aGlzLnVpLnRoaXNZZWFyR3JvdXBzLmlzKFwiOmNoZWNrZWRcIikpXG5cdFx0XHRhdHRyaWJ1dGVzLmdyb3VwcyA9IF8udW5pb24odGhpcy5pbnRlcm5hbEdyb3Vwcy5tYXAoeCA9PiB4LmdldChcImNvZGVcIikpLCBhdHRyaWJ1dGVzLmdyb3Vwcyk7XG5cblx0XHRhdHRyaWJ1dGVzLmdyYWRlID0gdGhpcy51aS5ncmFkZS52YWwoKTtcblxuXHRcdGlmICghdGhpcy5tb2RlbC5pc05ldygpICYmICF0aGlzLnVpLm5ld1Bhc3N3b3JkLnByb3AoXCJjaGVja2VkXCIpKSB7XG5cdFx0XHRkZWxldGUgYXR0cmlidXRlcy5wYXNzd29yZDtcblx0XHRcdGRlbGV0ZSBhdHRyaWJ1dGVzLnBhc3N3b3JkMjtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRhdHRyaWJ1dGVzLmNoYW5nZVBhc3N3b3JkID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRjb25zdCBncmFudHMgPSB7fSwgdXNlciA9IHsgcm9sZXM6IGF0dHJpYnV0ZXMucm9sZXMgfTtcblx0XHRjb25zdCBncmFudExpc3QgPSBbXTtcblx0XHRmb3IoY29uc3Qga2V5IGluIHJlc3Rlci5nKSB7XG5cdFx0XHRpZiAocmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5ncmFudHMubWFpbltrZXldLCB1c2VyKSlcblx0XHRcdFx0Z3JhbnRMaXN0LnB1c2goa2V5KTtcblx0XHR9XG5cblx0XHRfLmVhY2goZ3JhbnRMaXN0LCBpdGVtID0+IHtcblx0XHRcdGNvbnN0IGVsID0gJChcIltuYW1lPSdcIiArIGl0ZW0gKyBcIiddXCIsIHRoaXMuZWwpO1xuXHRcdFx0aWYgKGVsLnZhbCgpICYmIGVsLnZhbCgpLmxlbmd0aClcblx0XHRcdFx0Z3JhbnRzW2l0ZW1dID0gZWwudmFsKCk7XG5cdFx0fSk7XG5cblx0XHRhdHRyaWJ1dGVzLmdyYW50cyA9IGdyYW50cztcblxuXHRcdHJldHVybiB7XG5cdFx0XHRhdHRyaWJ1dGVzOiBhdHRyaWJ1dGVzLFxuXHRcdH07XG5cdH0sXG5cblx0bmV3UGFzc3dvcmQ6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IG9uID0gdGhpcy51aS5uZXdQYXNzd29yZC5wcm9wKFwiY2hlY2tlZFwiKTtcblx0XHRpZiAob24pXG5cdFx0XHQkKFwiZGl2Lm5ld1Bhc3NcIiwgdGhpcy5lbCkucmVtb3ZlQ2xhc3MoXCJoaWRlXCIpO1xuXHRcdGVsc2Vcblx0XHRcdCQoXCJkaXYubmV3UGFzc1wiLCB0aGlzLmVsKS5hZGRDbGFzcyhcImhpZGVcIik7XG5cdH0sXG5cblx0b25DcmVhdGVBbm90aGVyOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gbmV3IFVzZXJNb2RlbCgpO1xuXHR9LFxuXG5cdG9uQmVmb3JlRGVzdHJveTogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuYmlydGhEYXRlUGlja2VyKVxuXHRcdFx0dGhpcy5iaXJ0aERhdGVQaWNrZXIuZGVzdHJveSgpO1xuXHR9LFxufSk7Il19",
    "\"use strict\";\n\nvar Backbone = require(\"backbone\");\nvar rester = require(\"rester\");\nvar $ = require(\"jquery\");\nvar _ = require(\"lodash\");\n\nvar App = require(\"../../index\");\nvar radio = Backbone.Radio.channel(\"global\");\n\nvar ServerGrid = require(\"../../lib/serverGrid\");\nvar settings = require(\"app-settings\");\nvar SmallModal = require(\"../../lib/smallModal\");\nvar SimpleMenu = require(\"../../lib/simpleMenu\");\nvar ChangelogModal = require(\"../../lib/changelogModal\");\n\nvar UserDetails = require(\"./userDetails\");\nvar UserModal = require(\"./userModal\");\nvar UserModel = require(\"../userModel\");\n\nvar Collection = Backbone.PageableCollection.extend({\n\tmodel: UserModel,\n\n\turl: function url() {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\t\tif (rester.hasAccess(rester.p.users.get.all, user)) return settings.urlRoot + \"/api/1.0/users?paged=true\";\n\t\treturn settings.urlRoot + \"/api/1.0/users?paged=true&schoolTypes=true\";\n\t},\n\n\tstate: {\n\t\tpageSize: 30\n\t},\n\tmode: \"server\",\n\n\tqueryParams: {\n\t\tpageSize: \"pageSize\",\n\t\tsortKey: \"sortBy\"\n\t},\n\n\tparseState: function parseState(resp) {\n\t\treturn { totalRecords: resp.total };\n\t},\n\n\tparseRecords: function parseRecords(resp) {\n\t\treturn resp.rows;\n\t}\n});\n\nmodule.exports = Backbone.Marionette.View.extend({\n\ttagName: \"div\",\n\tclassName: \"content user-manager\",\n\n\ttemplate: require(\"../templates/usermanage.nunj\"),\n\n\tui: {\n\t\tfilterBar: \".ops-bar .filters\",\n\t\tcounterBar: \".ops-bar .counter\",\n\t\taddUserIcon: \".add-user\",\n\t\tdownload: \"div.download\",\n\t\tpaging: \".paging\",\n\t\tgrid: \"div.grid\"\n\t},\n\n\tcollectionEvents: {\n\t\t\"toolbar:click:details\": \"viewUserDetails\",\n\t\t\"toolbar:click:delete\": \"deleteUser\",\n\t\t\"toolbar:click:edit\": \"addEditUser\",\n\t\t\"toolbar:click:changelog\": \"changelog\",\n\t\t\"toolbar:click:flush\": \"flushBookCache\",\n\t\t\"toolbar:click:impersonate\": \"impersonateUser\"\n\t},\n\n\tevents: {\n\t\t\"click @ui.addUserIcon\": \"addEditUser\",\n\t\t\"click @ui.download\": \"showDownloads\"\n\t},\n\n\tshowDownloads: function showDownloads(evt) {\n\t\tevt.stopPropagation();\n\n\t\tvar list = new SimpleMenu({\n\t\t\tanchor: this.ui.download,\n\t\t\tside: \"left\",\n\t\t\tstructure: [{ closeOnClick: true, elements: [{ text: \"Export list of users\", id: \"users\" }, { text: \"Export list of user groups (compatible with CSV Imports)\", id: \"userGroupsForImport\" }] }]\n\t\t});\n\t\tlist.show();\n\n\t\tthis.listenTo(list, \"clicked:users\", this.downloadList.bind(this));\n\t\tthis.listenTo(list, \"clicked:userGroupsForImport\", this.downloadGroupListForImport.bind(this));\n\t},\n\n\tdownloadList: function downloadList() {\n\t\twindow.open(settings.urlRoot + \"/api/1.0/users/lists/users\");\n\t},\n\n\tdownloadGroupListForImport: function downloadGroupListForImport() {\n\t\twindow.open(settings.urlRoot + \"/api/1.0/users/lists/userGroupsCompatCSV\");\n\t},\n\n\taddEditUser: function addEditUser(model) {\n\t\tvar _this = this;\n\n\t\tvar modal = new UserModal({\n\t\t\tmodel: model && model.id ? model : new UserModel()\n\t\t});\n\n\t\tif (!settings.fcClient) {\n\t\t\tmodal.show({\n\t\t\t\tcreate: function create(result) {\n\t\t\t\t\t_this.grid.collection.getFirstPage();\n\t\t\t\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\t\t\t\tcontent: \"New user \" + result.model.get(\"firstname\") + \" \" + result.model.get(\"surname\") + \" successfully created\"\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tcreateAnother: function createAnother() {\n\t\t\t\t\t_this.grid.collection.getFirstPage();\n\t\t\t\t},\n\t\t\t\tupdate: function update(result) {\n\t\t\t\t\tresult.model.trigger(\"grid:render\");\n\n\t\t\t\t\tradio.trigger(App.Events.Commands.Toast, {\n\t\t\t\t\t\tcontent: \"User \" + result.model.get(\"firstname\") + \" \" + result.model.get(\"surname\") + \" successfully updated\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t},\n\n\tfilterDetails: function filterDetails() {\n\t\tvar currentUser = radio.request(App.Events.Requests.CurrentUser);\n\n\t\treturn rester.hasAccess(rester.p.api.groups.get, currentUser) && rester.hasAccess(rester.p.users.books.all, currentUser);\n\t},\n\n\tfilterDelete: function filterDelete(model) {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\t\tif (model.id === user._id || !rester.hasAccess(rester.p.api.users.delete, user) || settings.fcClient) return false;\n\n\t\t// eslint-disable-next-line no-sync\n\t\tif (settings.externalSync.students === \"rw\" && _.includes(model.get(\"roles\"), \"student\") && settings.userDataSource && model.get(\"dataSource\") === settings.userDataSource) return false;\n\n\t\t// eslint-disable-next-line no-sync\n\t\tif (settings.externalSync.teachers === \"rw\" && _.includes(model.get(\"roles\"), \"teacher\") && settings.userDataSource && model.get(\"dataSource\") === settings.userDataSource) return false;\n\n\t\treturn _.every(model.get(\"roles\"), function (key) {\n\t\t\treturn key in settings.roles && rester.hasAccess(rester.p.users.delete[key], user);\n\t\t});\n\t},\n\n\tfilterEdit: function filterEdit() {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\tif (!rester.hasAccess(rester.p.api.users.put, user) || settings.fcClient) return false;\n\n\t\treturn true;\n\t},\n\n\tfilterImpersonate: function filterImpersonate(model) {\n\t\tvar user = radio.request(App.Events.Requests.CurrentUser);\n\n\t\treturn model.id !== user._id && rester.hasAccess(rester.p.impersonate, user);\n\t},\n\n\tonRender: function onRender() {\n\t\tvar columns = [{ name: \"username\", label: \"Username\", cell: \"string\", editable: false }, { name: \"userName\", label: \"Name\", cell: \"string\", editable: false }, { name: \"created\", label: \"Created\", editable: false, cell: ServerGrid.MomentCell.extend({\n\t\t\t\tmodelInUnixTimestamp: true,\n\t\t\t\tdisplayFormat: \"DD MMM YYYY, HH:mm a\",\n\t\t\t\tdisplayInUTC: false\n\t\t\t}) }, { name: \"source\", label: \"Source\", cell: \"string\", editable: false }, { name: \"numGroups\", label: \"Group Count\", cell: \"string\", editable: false }, { name: \"userGrade\", label: \"Grade\", cell: \"string\", editable: false }, { name: \"userRoles\", label: \"Roles\", cell: \"string\", editable: false }, { name: \"enabled\", label: \"Enabled\", editable: false, cell: ServerGrid.BooleanIconCell.extend({}) }, { name: \"restricted\", label: \"Restricted\", editable: false, cell: ServerGrid.BooleanIconCell.extend({}) }, { label: \"Actions\", cell: new ServerGrid.ToolbarCell({ tooltips: [{ title: \"Changelog\", icon: \"fa-list-ul\" }, { title: \"Details\", icon: \"fa-eye\", filter: this.filterDetails.bind(this) }, { title: \"Edit\", icon: \"fa-edit\", filter: this.filterEdit.bind(this) }, { title: \"Impersonate\", icon: \"fa-user-secret\", filter: this.filterImpersonate.bind(this) }, { title: \"Wipe E-Books Cache\", icon: \"fa-eraser\", data: \"flush\" }, { title: \"Delete\", icon: \"fa-trash-alt\", filter: this.filterDelete.bind(this) }] }), editable: false, sortable: false }];\n\n\t\tthis.grid = new ServerGrid({\n\t\t\tel: this.ui.grid,\n\t\t\tcolumns: columns,\n\t\t\tcollection: new Collection(),\n\t\t\tclickable: true,\n\t\t\tcounter: {\n\t\t\t\telement: this.ui.counterBar,\n\t\t\t\ttemplate: \"Users $start - $end of $total\"\n\t\t\t},\n\t\t\tpaging: {\n\t\t\t\telement: this.ui.paging\n\t\t\t}\n\t\t});\n\n\t\tthis.bindEvents(this.grid.collection, this.collectionEvents);\n\n\t\tthis.listenTo(this.grid, \"row:clicked\", this.addEditUser.bind(this));\n\n\t\tvar textFilter = {\n\t\t\ttype: \"text\",\n\t\t\tname: \"textFilter\",\n\t\t\tlabel: \"Text Search\",\n\t\t\tdebounce: 200,\n\t\t\tserver: true\n\t\t};\n\n\t\tvar rolesFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"rolesFilter\",\n\t\t\tlabel: \"Roles\",\n\t\t\tcategories: [{\n\t\t\t\titems: _.fromPairs(_.compact(_.map(settings.roles, function (val, key) {\n\t\t\t\t\tif (key === \"*\") return;\n\t\t\t\t\treturn [key, val.name];\n\t\t\t\t})))\n\t\t\t}],\n\t\t\tserver: true\n\t\t};\n\n\t\tvar gradeFilter = {\n\t\t\ttype: \"itemized\",\n\t\t\tname: \"gradeFilter\",\n\t\t\tlabel: \"Year of Study\",\n\t\t\tcategories: _.map(settings.gradeList, function (val, key) {\n\t\t\t\treturn {\n\t\t\t\t\tlabel: key,\n\t\t\t\t\titems: _.reduce(val.sort(function (a, b) {\n\t\t\t\t\t\treturn (\"lexical\" in a ? a.lexical : a.name).toUpperCase().localeCompare((\"lexical\" in b ? b.lexical : b.name).toUpperCase());\n\t\t\t\t\t}), function (sum, num) {\n\t\t\t\t\t\tsum.push({ name: num.value, label: num.name });return sum;\n\t\t\t\t\t}, [])\n\t\t\t\t};\n\t\t\t}),\n\t\t\tserver: true\n\t\t};\n\n\t\tthis.ui.filterBar.prepend(this.grid.filter({\n\t\t\tfilterContainer: this.ui.filterBar,\n\t\t\tfilters: [textFilter, rolesFilter, gradeFilter],\n\t\t\tdefaultFilters: [\"textFilter\", \"rolesFilter\", \"gradeFilter\"]\n\t\t}).render().el);\n\t},\n\n\tisFcClient: function isFcClient() {\n\t\treturn settings.fcClient;\n\t},\n\n\tviewUserDetails: function viewUserDetails(model) {\n\t\tvar _this2 = this;\n\n\t\tthis.userDetails = new UserDetails({\n\t\t\teventBus: this,\n\t\t\tuserModel: model\n\t\t});\n\n\t\tthis.on(\"userDetails:close\", function () {\n\t\t\t_this2.off(\"userDetails:close\");\n\t\t}, this);\n\n\t\tthis.userDetails.show();\n\t},\n\n\tdeleteUser: function deleteUser(model) {\n\t\tvar _this3 = this;\n\n\t\tthis.delModal = new SmallModal({\n\t\t\tpersist: true,\n\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Delete User: \" + (model.get(\"firstname\") + \" \" + model.get(\"surname\")).replace(/[\\&\\<\\>\\'\\\"]/g, function (x) {\n\t\t\t\treturn \"&#\" + x.charCodeAt(0) + \";\";\n\t\t\t}),\n\t\t\tbody: \"<p>Are you sure you want to delete this user?</p>\",\n\t\t\twarning: true\n\t\t});\n\t\tthis.delModal.on(\"button:ok\", function () {\n\t\t\tmodel.destroy({ wait: true, success: _this3.deletionSuccess.bind(_this3), error: _this3.deletionError.bind(_this3) });\n\t\t});\n\n\t\tif (!settings.fcClient) this.delModal.show();\n\t},\n\n\tdeletionSuccess: function deletionSuccess(model) {\n\t\tthis.delModal.destroy();\n\t\tradio.trigger(App.Events.Commands.Toast, { content: \"User \" + model.get(\"firstname\") + \" \" + model.get(\"surname\") + \" successfully deleted\", icon: \"fa-trash-alt\", iconColour: \"red\" });\n\t},\n\n\tdeletionError: function deletionError(model, xhr) {\n\t\tvar answer = App.parseResponse(xhr);\n\t\tthis.delModal.showError(\"Deletion failed: \" + (answer.detail || answer.info));\n\t},\n\n\timpersonateUser: function impersonateUser(model) {\n\t\tradio.trigger(App.Events.Commands.Navigate, \"/admin/impersonate/\" + model.get(\"username\"));\n\t},\n\n\tchangelog: function changelog(model) {\n\t\tvar mod = new Backbone.Model({\n\t\t\ttitle: model.get(\"username\"),\n\t\t\tidentifier: model.get(\"user_id\"),\n\t\t\tcategory: \"user\"\n\t\t});\n\n\t\tvar modal = new ChangelogModal({ model: mod });\n\n\t\tmodal.show();\n\t},\n\n\tflushBookCache: function flushBookCache(model) {\n\t\tvar _this4 = this;\n\n\t\tif (!model) return;\n\n\t\tthis.flushModal = new SmallModal({\n\t\t\tpersist: true,\n\t\t\twarning: true,\n\t\t\ttitle: \"<span class='fal fa-exclamation-triangle'/> Book Cache Flush Confirmation\",\n\t\t\tbody: \"<p>This will flush the cached list of books for this user. The user will see the precise list of books that they really have access to.</p>\"\n\t\t});\n\n\t\tthis.flushModal.on(\"button:ok\", function () {\n\t\t\t$.ajax({\n\t\t\t\tmethod: \"DELETE\",\n\t\t\t\turl: settings.urlRoot + \"/api/1.0/users/\" + encodeURIComponent(model.get(\"username\")) + \"/flush/delete\",\n\t\t\t\tsuccess: _this4.flushSuccess.bind(_this4, model),\n\t\t\t\terror: _this4.flushError.bind(_this4)\n\t\t\t});\n\t\t});\n\n\t\tthis.flushModal.show();\n\t},\n\n\tflushSuccess: function flushSuccess(model) {\n\t\tradio.trigger(App.Events.Commands.Toast, { icon: \"fa-trash-alt\", colour: \"red\", content: \"User \" + model.get(\"username\") + \" successfully flushed\" });\n\t\tthis.flushModal.destroy();\n\t},\n\n\tflushError: function flushError(model, xhr) {\n\t\tvar answer = App.parseResponse(xhr);\n\t\tthis.flushModal.showError(\"Flush failed: \" + (answer.detail || answer.info));\n\t}\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInVzZXJtYW5hZ2UuanMiXSwibmFtZXMiOlsiQmFja2JvbmUiLCJyZXF1aXJlIiwicmVzdGVyIiwiJCIsIl8iLCJBcHAiLCJyYWRpbyIsIlJhZGlvIiwiY2hhbm5lbCIsIlNlcnZlckdyaWQiLCJzZXR0aW5ncyIsIlNtYWxsTW9kYWwiLCJTaW1wbGVNZW51IiwiQ2hhbmdlbG9nTW9kYWwiLCJVc2VyRGV0YWlscyIsIlVzZXJNb2RhbCIsIlVzZXJNb2RlbCIsIkNvbGxlY3Rpb24iLCJQYWdlYWJsZUNvbGxlY3Rpb24iLCJleHRlbmQiLCJtb2RlbCIsInVybCIsInVzZXIiLCJyZXF1ZXN0IiwiRXZlbnRzIiwiUmVxdWVzdHMiLCJDdXJyZW50VXNlciIsImhhc0FjY2VzcyIsInAiLCJ1c2VycyIsImdldCIsImFsbCIsInVybFJvb3QiLCJzdGF0ZSIsInBhZ2VTaXplIiwibW9kZSIsInF1ZXJ5UGFyYW1zIiwic29ydEtleSIsInBhcnNlU3RhdGUiLCJyZXNwIiwidG90YWxSZWNvcmRzIiwidG90YWwiLCJwYXJzZVJlY29yZHMiLCJyb3dzIiwibW9kdWxlIiwiZXhwb3J0cyIsIk1hcmlvbmV0dGUiLCJWaWV3IiwidGFnTmFtZSIsImNsYXNzTmFtZSIsInRlbXBsYXRlIiwidWkiLCJmaWx0ZXJCYXIiLCJjb3VudGVyQmFyIiwiYWRkVXNlckljb24iLCJkb3dubG9hZCIsInBhZ2luZyIsImdyaWQiLCJjb2xsZWN0aW9uRXZlbnRzIiwiZXZlbnRzIiwic2hvd0Rvd25sb2FkcyIsImV2dCIsInN0b3BQcm9wYWdhdGlvbiIsImxpc3QiLCJhbmNob3IiLCJzaWRlIiwic3RydWN0dXJlIiwiY2xvc2VPbkNsaWNrIiwiZWxlbWVudHMiLCJ0ZXh0IiwiaWQiLCJzaG93IiwibGlzdGVuVG8iLCJkb3dubG9hZExpc3QiLCJiaW5kIiwiZG93bmxvYWRHcm91cExpc3RGb3JJbXBvcnQiLCJ3aW5kb3ciLCJvcGVuIiwiYWRkRWRpdFVzZXIiLCJtb2RhbCIsImZjQ2xpZW50IiwiY3JlYXRlIiwiY29sbGVjdGlvbiIsImdldEZpcnN0UGFnZSIsInRyaWdnZXIiLCJDb21tYW5kcyIsIlRvYXN0IiwiY29udGVudCIsInJlc3VsdCIsImNyZWF0ZUFub3RoZXIiLCJ1cGRhdGUiLCJmaWx0ZXJEZXRhaWxzIiwiY3VycmVudFVzZXIiLCJhcGkiLCJncm91cHMiLCJib29rcyIsImZpbHRlckRlbGV0ZSIsIl9pZCIsImRlbGV0ZSIsImV4dGVybmFsU3luYyIsInN0dWRlbnRzIiwiaW5jbHVkZXMiLCJ1c2VyRGF0YVNvdXJjZSIsInRlYWNoZXJzIiwiZXZlcnkiLCJrZXkiLCJyb2xlcyIsImZpbHRlckVkaXQiLCJwdXQiLCJmaWx0ZXJJbXBlcnNvbmF0ZSIsImltcGVyc29uYXRlIiwib25SZW5kZXIiLCJjb2x1bW5zIiwibmFtZSIsImxhYmVsIiwiY2VsbCIsImVkaXRhYmxlIiwiTW9tZW50Q2VsbCIsIm1vZGVsSW5Vbml4VGltZXN0YW1wIiwiZGlzcGxheUZvcm1hdCIsImRpc3BsYXlJblVUQyIsIkJvb2xlYW5JY29uQ2VsbCIsIlRvb2xiYXJDZWxsIiwidG9vbHRpcHMiLCJ0aXRsZSIsImljb24iLCJmaWx0ZXIiLCJkYXRhIiwic29ydGFibGUiLCJlbCIsImNsaWNrYWJsZSIsImNvdW50ZXIiLCJlbGVtZW50IiwiYmluZEV2ZW50cyIsInRleHRGaWx0ZXIiLCJ0eXBlIiwiZGVib3VuY2UiLCJzZXJ2ZXIiLCJyb2xlc0ZpbHRlciIsImNhdGVnb3JpZXMiLCJpdGVtcyIsImZyb21QYWlycyIsImNvbXBhY3QiLCJtYXAiLCJ2YWwiLCJncmFkZUZpbHRlciIsImdyYWRlTGlzdCIsInJlZHVjZSIsInNvcnQiLCJhIiwiYiIsImxleGljYWwiLCJ0b1VwcGVyQ2FzZSIsImxvY2FsZUNvbXBhcmUiLCJzdW0iLCJudW0iLCJwdXNoIiwidmFsdWUiLCJwcmVwZW5kIiwiZmlsdGVyQ29udGFpbmVyIiwiZmlsdGVycyIsImRlZmF1bHRGaWx0ZXJzIiwicmVuZGVyIiwiaXNGY0NsaWVudCIsInZpZXdVc2VyRGV0YWlscyIsInVzZXJEZXRhaWxzIiwiZXZlbnRCdXMiLCJ1c2VyTW9kZWwiLCJvbiIsIm9mZiIsImRlbGV0ZVVzZXIiLCJkZWxNb2RhbCIsInBlcnNpc3QiLCJyZXBsYWNlIiwieCIsImNoYXJDb2RlQXQiLCJib2R5Iiwid2FybmluZyIsImRlc3Ryb3kiLCJ3YWl0Iiwic3VjY2VzcyIsImRlbGV0aW9uU3VjY2VzcyIsImVycm9yIiwiZGVsZXRpb25FcnJvciIsImljb25Db2xvdXIiLCJ4aHIiLCJhbnN3ZXIiLCJwYXJzZVJlc3BvbnNlIiwic2hvd0Vycm9yIiwiZGV0YWlsIiwiaW5mbyIsImltcGVyc29uYXRlVXNlciIsIk5hdmlnYXRlIiwiY2hhbmdlbG9nIiwibW9kIiwiTW9kZWwiLCJpZGVudGlmaWVyIiwiY2F0ZWdvcnkiLCJmbHVzaEJvb2tDYWNoZSIsImZsdXNoTW9kYWwiLCJhamF4IiwibWV0aG9kIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiZmx1c2hTdWNjZXNzIiwiZmx1c2hFcnJvciIsImNvbG91ciJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0EsSUFBTUEsV0FBV0MsUUFBUSxVQUFSLENBQWpCO0FBQ0EsSUFBTUMsU0FBU0QsUUFBUSxRQUFSLENBQWY7QUFDQSxJQUFNRSxJQUFJRixRQUFRLFFBQVIsQ0FBVjtBQUNBLElBQU1HLElBQUlILFFBQVEsUUFBUixDQUFWOztBQUVBLElBQU1JLE1BQU1KLFFBQVEsYUFBUixDQUFaO0FBQ0EsSUFBTUssUUFBUU4sU0FBU08sS0FBVCxDQUFlQyxPQUFmLENBQXVCLFFBQXZCLENBQWQ7O0FBRUEsSUFBTUMsYUFBYVIsUUFBUSxzQkFBUixDQUFuQjtBQUNBLElBQU1TLFdBQVdULFFBQVEsY0FBUixDQUFqQjtBQUNBLElBQU1VLGFBQWFWLFFBQVEsc0JBQVIsQ0FBbkI7QUFDQSxJQUFNVyxhQUFhWCxRQUFRLHNCQUFSLENBQW5CO0FBQ0EsSUFBTVksaUJBQWlCWixRQUFRLDBCQUFSLENBQXZCOztBQUVBLElBQU1hLGNBQWNiLFFBQVEsZUFBUixDQUFwQjtB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LE9BQUt1QixVQUFMLENBQWdCL0IsRUFBaEIsQ0FBbUIsV0FBbkIsRUFBZ0MsWUFBTTtBQUNyQ3JLLEtBQUVxTSxJQUFGLENBQU87QUFDTkMsWUFBUSxRQURGO0FBRU5wTCxTQUFLWCxTQUFTc0IsT0FBVCxHQUFtQixpQkFBbkIsR0FBdUMwSyxtQkFBbUJ0TCxNQUFNVSxHQUFOLENBQVUsVUFBVixDQUFuQixDQUF2QyxHQUFtRixlQUZsRjtBQUdOc0osYUFBUyxPQUFLdUIsWUFBTCxDQUFrQmpJLElBQWxCLENBQXVCLE1BQXZCLEVBQTZCdEQsS0FBN0IsQ0FISDtBQUlOa0ssV0FBTyxPQUFLc0IsVUFBTCxDQUFnQmxJLElBQWhCLENBQXFCLE1BQXJCO0FBSkQsSUFBUDtBQU1BLEdBUEQ7O0FBU0EsT0FBSzZILFVBQUwsQ0FBZ0JoSSxJQUFoQjtBQUNBLEVBM1IrQzs7QUE2UmhEb0ksZUFBYyxzQkFBU3ZMLEtBQVQsRUFBZ0I7QUFDN0JkLFFBQU04RSxPQUFOLENBQWMvRSxJQUFJbUIsTUFBSixDQUFXNkQsUUFBWCxDQUFvQkMsS0FBbEMsRUFBeUMsRUFBRXVDLE1BQU0sY0FBUixFQUF3QmdGLFFBQVEsS0FBaEMsRUFBdUN0SCxTQUFTLFVBQVVuRSxNQUFNVSxHQUFOLENBQVUsVUFBVixDQUFWLEdBQWtDLHVCQUFsRixFQUF6QztBQUNBLE9BQUt5SyxVQUFMLENBQWdCckIsT0FBaEI7QUFDQSxFQWhTK0M7O0FBa1NoRDBCLGFBQVksb0JBQVN4TCxLQUFULEVBQWdCcUssR0FBaEIsRUFBcUI7QUFDaEMsTUFBTUMsU0FBU3JMLElBQUlzTCxhQUFKLENBQWtCRixHQUFsQixDQUFmO0FBQ0EsT0FBS2MsVUFBTCxDQUFnQlgsU0FBaEIsQ0FBMEIsb0JBQW9CRixPQUFPRyxNQUFQLElBQWlCSCxPQUFPSSxJQUE1QyxDQUExQjtBQUNBO0FBclMrQyxDQUFoQyxDQUFqQiIsImZpbGUiOiJ1c2VybWFuYWdlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBCYWNrYm9uZSA9IHJlcXVpcmUoXCJiYWNrYm9uZVwiKTtcbmNvbnN0IHJlc3RlciA9IHJlcXVpcmUoXCJyZXN0ZXJcIik7XG5jb25zdCAkID0gcmVxdWlyZShcImpxdWVyeVwiKTtcbmNvbnN0IF8gPSByZXF1aXJlKFwibG9kYXNoXCIpO1xuXG5jb25zdCBBcHAgPSByZXF1aXJlKFwiLi4vLi4vaW5kZXhcIik7XG5jb25zdCByYWRpbyA9IEJhY2tib25lLlJhZGlvLmNoYW5uZWwoXCJnbG9iYWxcIik7XG5cbmNvbnN0IFNlcnZlckdyaWQgPSByZXF1aXJlKFwiLi4vLi4vbGliL3NlcnZlckdyaWRcIik7XG5jb25zdCBzZXR0aW5ncyA9IHJlcXVpcmUoXCJhcHAtc2V0dGluZ3NcIik7XG5jb25zdCBTbWFsbE1vZGFsID0gcmVxdWlyZShcIi4uLy4uL2xpYi9zbWFsbE1vZGFsXCIpO1xuY29uc3QgU2ltcGxlTWVudSA9IHJlcXVpcmUoXCIuLi8uLi9saWIvc2ltcGxlTWVudVwiKTtcbmNvbnN0IENoYW5nZWxvZ01vZGFsID0gcmVxdWlyZShcIi4uLy4uL2xpYi9jaGFuZ2Vsb2dNb2RhbFwiKTtcblxuY29uc3QgVXNlckRldGFpbHMgPSByZXF1aXJlKFwiLi91c2VyRGV0YWlsc1wiKTtcbmNvbnN0IFVzZXJNb2RhbCA9IHJlcXVpcmUoXCIuL3VzZXJNb2RhbFwiKTtcbmNvbnN0IFVzZXJNb2RlbCA9IHJlcXVpcmUoXCIuLi91c2VyTW9kZWxcIik7XG5cbmNvbnN0IENvbGxlY3Rpb24gPSBCYWNrYm9uZS5QYWdlYWJsZUNvbGxlY3Rpb24uZXh0ZW5kKHtcblx0bW9kZWw6IFVzZXJNb2RlbCxcblxuXHR1cmw6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IHVzZXIgPSByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpO1xuXHRcdGlmIChyZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLnVzZXJzLmdldC5hbGwsIHVzZXIpKVxuXHRcdFx0cmV0dXJuIHNldHRpbmdzLnVybFJvb3QgKyBcIi9hcGkvMS4wL3VzZXJzP3BhZ2VkPXRydWVcIjtcblx0XHRyZXR1cm4gc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvdXNlcnM/cGFnZWQ9dHJ1ZSZzY2hvb2xUeXBlcz10cnVlXCI7XG5cdH0sXG5cblx0c3RhdGU6IHtcblx0XHRwYWdlU2l6ZTogMzAsXG5cdH0sXG5cdG1vZGU6IFwic2VydmVyXCIsXG5cblx0cXVlcnlQYXJhbXM6IHtcblx0XHRwYWdlU2l6ZTogXCJwYWdlU2l6ZVwiLFxuXHRcdHNvcnRLZXk6IFwic29ydEJ5XCIsXG5cdH0sXG5cblx0cGFyc2VTdGF0ZTogZnVuY3Rpb24ocmVzcCkge1xuXHRcdHJldHVybiB7IHRvdGFsUmVjb3JkczogcmVzcC50b3RhbCB9O1xuXHR9LFxuXG5cdHBhcnNlUmVjb3JkczogZnVuY3Rpb24ocmVzcCkge1xuXHRcdHJldHVybiByZXNwLnJvd3M7XG5cdH0sXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYWNrYm9uZS5NYXJpb25ldHRlLlZpZXcuZXh0ZW5kKHtcblx0dGFnTmFtZTogXCJkaXZcIixcblx0Y2xhc3NOYW1lOiBcImNvbnRlbnQgdXNlci1tYW5hZ2VyXCIsXG5cblx0dGVtcGxhdGU6IHJlcXVpcmUoXCIuLi90ZW1wbGF0ZXMvdXNlcm1hbmFnZS5udW5qXCIpLFxuXG5cdHVpOiB7XG5cdFx0ZmlsdGVyQmFyOiBcIi5vcHMtYmFyIC5maWx0ZXJzXCIsXG5cdFx0Y291bnRlckJhcjogXCIub3BzLWJhciAuY291bnRlclwiLFxuXHRcdGFkZFVzZXJJY29uOiBcIi5hZGQtdXNlclwiLFxuXHRcdGRvd25sb2FkOiBcImRpdi5kb3dubG9hZFwiLFxuXHRcdHBhZ2luZzogXCIucGFnaW5nXCIsXG5cdFx0Z3JpZDogXCJkaXYuZ3JpZFwiLFxuXHR9LFxuXG5cdGNvbGxlY3Rpb25FdmVudHM6IHtcblx0XHRcInRvb2xiYXI6Y2xpY2s6ZGV0YWlsc1wiOiBcInZpZXdVc2VyRGV0YWlsc1wiLFxuXHRcdFwidG9vbGJhcjpjbGljazpkZWxldGVcIjogXCJkZWxldGVVc2VyXCIsXG5cdFx0XCJ0b29sYmFyOmNsaWNrOmVkaXRcIjogXCJhZGRFZGl0VXNlclwiLFxuXHRcdFwidG9vbGJhcjpjbGljazpjaGFuZ2Vsb2dcIjogXCJjaGFuZ2Vsb2dcIixcblx0XHRcInRvb2xiYXI6Y2xpY2s6Zmx1c2hcIjogXCJmbHVzaEJvb2tDYWNoZVwiLFxuXHRcdFwidG9vbGJhcjpjbGljazppbXBlcnNvbmF0ZVwiOiBcImltcGVyc29uYXRlVXNlclwiLFxuXHR9LFxuXG5cdGV2ZW50czoge1xuXHRcdFwiY2xpY2sgQHVpLmFkZFVzZXJJY29uXCI6IFwiYWRkRWRpdFVzZXJcIixcblx0XHRcImNsaWNrIEB1aS5kb3dubG9hZFwiOiBcInNob3dEb3dubG9hZHNcIixcblx0fSxcblxuXHRzaG93RG93bmxvYWRzOiBmdW5jdGlvbihldnQpIHtcblx0XHRldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRjb25zdCBsaXN0ID0gbmV3IFNpbXBsZU1lbnUoe1xuXHRcdFx0YW5jaG9yOiB0aGlzLnVpLmRvd25sb2FkLFxuXHRcdFx0c2lkZTogXCJsZWZ0XCIsXG5cdFx0XHRzdHJ1Y3R1cmU6IFtcblx0XHRcdFx0eyBjbG9zZU9uQ2xpY2s6IHRydWUsIGVsZW1lbnRzOiBbXG5cdFx0XHRcdFx0eyB0ZXh0OiBcIkV4cG9ydCBsaXN0IG9mIHVzZXJzXCIsIGlkOiBcInVzZXJzXCIgfSxcblx0XHRcdFx0XHR7IHRleHQ6IFwiRXhwb3J0IGxpc3Qgb2YgdXNlciBncm91cHMgKGNvbXBhdGlibGUgd2l0aCBDU1YgSW1wb3J0cylcIiwgaWQ6IFwidXNlckdyb3Vwc0ZvckltcG9ydFwiIH0sXG5cdFx0XHRcdF0gfSxcblx0XHRcdF0sXG5cdFx0fSk7XG5cdFx0bGlzdC5zaG93KCk7XG5cblx0XHR0aGlzLmxpc3RlblRvKGxpc3QsIFwiY2xpY2tlZDp1c2Vyc1wiLCB0aGlzLmRvd25sb2FkTGlzdC5iaW5kKHRoaXMpKTtcblx0XHR0aGlzLmxpc3RlblRvKGxpc3QsIFwiY2xpY2tlZDp1c2VyR3JvdXBzRm9ySW1wb3J0XCIsIHRoaXMuZG93bmxvYWRHcm91cExpc3RGb3JJbXBvcnQuYmluZCh0aGlzKSk7XG5cdH0sXG5cblx0ZG93bmxvYWRMaXN0OiBmdW5jdGlvbigpIHtcblx0XHR3aW5kb3cub3BlbihzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC91c2Vycy9saXN0cy91c2Vyc1wiKTtcblx0fSxcblxuXHRkb3dubG9hZEdyb3VwTGlzdEZvckltcG9ydDogZnVuY3Rpb24oKSB7XG5cdFx0d2luZG93Lm9wZW4oc2V0dGluZ3MudXJsUm9vdCArIFwiL2FwaS8xLjAvdXNlcnMvbGlzdHMvdXNlckdyb3Vwc0NvbXBhdENTVlwiKTtcblx0fSxcblxuXHRhZGRFZGl0VXNlcjogZnVuY3Rpb24obW9kZWwpIHtcblx0XHRjb25zdCBtb2RhbCA9IG5ldyBVc2VyTW9kYWwoe1xuXHRcdFx0bW9kZWw6IG1vZGVsICYmIG1vZGVsLmlkID8gbW9kZWwgOiBuZXcgVXNlck1vZGVsKCksXG5cdFx0fSk7XG5cblx0XHRpZiAoIXNldHRpbmdzLmZjQ2xpZW50KSB7XG5cdFx0XHRtb2RhbC5zaG93KHtcblx0XHRcdFx0Y3JlYXRlOiByZXN1bHQgPT4ge1xuXHRcdFx0XHRcdHRoaXMuZ3JpZC5jb2xsZWN0aW9uLmdldEZpcnN0UGFnZSgpO1xuXHRcdFx0XHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5Ub2FzdCwge1xuXHRcdFx0XHRcdFx0Y29udGVudDogXCJOZXcgdXNlciBcIiArIHJlc3VsdC5tb2RlbC5nZXQoXCJmaXJzdG5hbWVcIikgKyBcIiBcIiArIHJlc3VsdC5tb2RlbC5nZXQoXCJzdXJuYW1lXCIpICsgXCIgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWRcIixcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0Y3JlYXRlQW5vdGhlcjogKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuZ3JpZC5jb2xsZWN0aW9uLmdldEZpcnN0UGFnZSgpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR1cGRhdGU6IHJlc3VsdCA9PiB7XG5cdFx0XHRcdFx0cmVzdWx0Lm1vZGVsLnRyaWdnZXIoXCJncmlkOnJlbmRlclwiKTtcblxuXHRcdFx0XHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5Ub2FzdCwge1xuXHRcdFx0XHRcdFx0Y29udGVudDogXCJVc2VyIFwiICsgcmVzdWx0Lm1vZGVsLmdldChcImZpcnN0bmFtZVwiKSArIFwiIFwiICsgcmVzdWx0Lm1vZGVsLmdldChcInN1cm5hbWVcIikgKyBcIiBzdWNjZXNzZnVsbHkgdXBkYXRlZFwiLFxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9LFxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9LFxuXG5cdGZpbHRlckRldGFpbHM6IGZ1bmN0aW9uKCkge1xuXHRcdGNvbnN0IGN1cnJlbnRVc2VyID0gcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblxuXHRcdHJldHVybiByZXN0ZXIuaGFzQWNjZXNzKHJlc3Rlci5wLmFwaS5ncm91cHMuZ2V0LCBjdXJyZW50VXNlcikgJiYgcmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC51c2Vycy5ib29rcy5hbGwsIGN1cnJlbnRVc2VyKTtcblx0fSxcblxuXHRmaWx0ZXJEZWxldGU6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0Y29uc3QgdXNlciA9IHJhZGlvLnJlcXVlc3QoQXBwLkV2ZW50cy5SZXF1ZXN0cy5DdXJyZW50VXNlcik7XG5cdFx0aWYgKG1vZGVsLmlkID09PSB1c2VyLl9pZCB8fCAhcmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5hcGkudXNlcnMuZGVsZXRlLCB1c2VyKSB8fCBzZXR0aW5ncy5mY0NsaWVudClcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zeW5jXG5cdFx0aWYgKHNldHRpbmdzLmV4dGVybmFsU3luYy5zdHVkZW50cyA9PT0gXCJyd1wiICYmIF8uaW5jbHVkZXMobW9kZWwuZ2V0KFwicm9sZXNcIiksIFwic3R1ZGVudFwiKSAmJiBzZXR0aW5ncy51c2VyRGF0YVNvdXJjZSAmJiBtb2RlbC5nZXQoXCJkYXRhU291cmNlXCIpID09PSBzZXR0aW5ncy51c2VyRGF0YVNvdXJjZSlcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zeW5jXG5cdFx0aWYgKHNldHRpbmdzLmV4dGVybmFsU3luYy50ZWFjaGVycyA9PT0gXCJyd1wiICYmIF8uaW5jbHVkZXMobW9kZWwuZ2V0KFwicm9sZXNcIiksIFwidGVhY2hlclwiKSAmJiBzZXR0aW5ncy51c2VyRGF0YVNvdXJjZSAmJiBtb2RlbC5nZXQoXCJkYXRhU291cmNlXCIpID09PSBzZXR0aW5ncy51c2VyRGF0YVNvdXJjZSlcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdHJldHVybiBfLmV2ZXJ5KG1vZGVsLmdldChcInJvbGVzXCIpLCBrZXkgPT4ga2V5IGluIHNldHRpbmdzLnJvbGVzICYmIHJlc3Rlci5oYXNBY2Nlc3MocmVzdGVyLnAudXNlcnMuZGVsZXRlW2tleV0sIHVzZXIpKTtcblx0fSxcblxuXHRmaWx0ZXJFZGl0OiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCB1c2VyID0gcmFkaW8ucmVxdWVzdChBcHAuRXZlbnRzLlJlcXVlc3RzLkN1cnJlbnRVc2VyKTtcblxuXHRcdGlmICghcmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5hcGkudXNlcnMucHV0LCB1c2VyKSB8fCBzZXR0aW5ncy5mY0NsaWVudClcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdGZpbHRlckltcGVyc29uYXRlOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdGNvbnN0IHVzZXIgPSByYWRpby5yZXF1ZXN0KEFwcC5FdmVudHMuUmVxdWVzdHMuQ3VycmVudFVzZXIpO1xuXG5cdFx0cmV0dXJuIChtb2RlbC5pZCAhPT0gdXNlci5faWQgJiYgcmVzdGVyLmhhc0FjY2VzcyhyZXN0ZXIucC5pbXBlcnNvbmF0ZSwgdXNlcikpO1xuXHR9LFxuXG5cdG9uUmVuZGVyOiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBjb2x1bW5zID0gW1xuXHRcdFx0eyBuYW1lOiBcInVzZXJuYW1lXCIsIGxhYmVsOiBcIlVzZXJuYW1lXCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcInVzZXJOYW1lXCIsIGxhYmVsOiBcIk5hbWVcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiY3JlYXRlZFwiLCBsYWJlbDogXCJDcmVhdGVkXCIsIGVkaXRhYmxlOiBmYWxzZSwgY2VsbDogU2VydmVyR3JpZC5Nb21lbnRDZWxsLmV4dGVuZCh7XG5cdFx0XHRcdG1vZGVsSW5Vbml4VGltZXN0YW1wOiB0cnVlLFxuXHRcdFx0XHRkaXNwbGF5Rm9ybWF0OiBcIkREIE1NTSBZWVlZLCBISDptbSBhXCIsXG5cdFx0XHRcdGRpc3BsYXlJblVUQzogZmFsc2UsXG5cdFx0XHR9KSB9LFxuXHRcdFx0eyBuYW1lOiBcInNvdXJjZVwiLCBsYWJlbDogXCJTb3VyY2VcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwibnVtR3JvdXBzXCIsIGxhYmVsOiBcIkdyb3VwIENvdW50XCIsIGNlbGw6IFwic3RyaW5nXCIsIGVkaXRhYmxlOiBmYWxzZSB9LFxuXHRcdFx0eyBuYW1lOiBcInVzZXJHcmFkZVwiLCBsYWJlbDogXCJHcmFkZVwiLCBjZWxsOiBcInN0cmluZ1wiLCBlZGl0YWJsZTogZmFsc2UgfSxcblx0XHRcdHsgbmFtZTogXCJ1c2VyUm9sZXNcIiwgbGFiZWw6IFwiUm9sZXNcIiwgY2VsbDogXCJzdHJpbmdcIiwgZWRpdGFibGU6IGZhbHNlIH0sXG5cdFx0XHR7IG5hbWU6IFwiZW5hYmxlZFwiLCBsYWJlbDogXCJFbmFibGVkXCIsIGVkaXRhYmxlOiBmYWxzZSwgY2VsbDogU2VydmVyR3JpZC5Cb29sZWFuSWNvbkNlbGwuZXh0ZW5kKHt9KSB9LFxuXHRcdFx0eyBuYW1lOiBcInJlc3RyaWN0ZWRcIiwgbGFiZWw6IFwiUmVzdHJpY3RlZFwiLCBlZGl0YWJsZTogZmFsc2UsIGNlbGw6IFNlcnZlckdyaWQuQm9vbGVhbkljb25DZWxsLmV4dGVuZCh7fSkgfSxcblx0XHRcdHsgbGFiZWw6IFwiQWN0aW9uc1wiLCBjZWxsOiBuZXcgU2VydmVyR3JpZC5Ub29sYmFyQ2VsbCh7IHRvb2x0aXBzOiBbXG5cdFx0XHRcdHsgdGl0bGU6IFwiQ2hhbmdlbG9nXCIsIGljb246IFwiZmEtbGlzdC11bFwiIH0sXG5cdFx0XHRcdHsgdGl0bGU6IFwiRGV0YWlsc1wiLCBpY29uOiBcImZhLWV5ZVwiLCBmaWx0ZXI6IHRoaXMuZmlsdGVyRGV0YWlscy5iaW5kKHRoaXMpIH0sXG5cdFx0XHRcdHsgdGl0bGU6IFwiRWRpdFwiLCBpY29uOiBcImZhLWVkaXRcIiwgZmlsdGVyOiB0aGlzLmZpbHRlckVkaXQuYmluZCh0aGlzKSB9LFxuXHRcdFx0XHR7IHRpdGxlOiBcIkltcGVyc29uYXRlXCIsIGljb246IFwiZmEtdXNlci1zZWNyZXRcIiwgZmlsdGVyOiB0aGlzLmZpbHRlckltcGVyc29uYXRlLmJpbmQodGhpcykgfSxcblx0XHRcdFx0eyB0aXRsZTogXCJXaXBlIEUtQm9va3MgQ2FjaGVcIiwgaWNvbjogXCJmYS1lcmFzZXJcIiwgZGF0YTogXCJmbHVzaFwiIH0sXG5cdFx0XHRcdHsgdGl0bGU6IFwiRGVsZXRlXCIsIGljb246IFwiZmEtdHJhc2gtYWx0XCIsIGZpbHRlcjogdGhpcy5maWx0ZXJEZWxldGUuYmluZCh0aGlzKSB9LFxuXHRcdFx0XSB9KSwgZWRpdGFibGU6IGZhbHNlLCBzb3J0YWJsZTogZmFsc2UgfSxcblx0XHRdO1xuXG5cdFx0dGhpcy5ncmlkID0gbmV3IFNlcnZlckdyaWQoe1xuXHRcdFx0ZWw6IHRoaXMudWkuZ3JpZCxcblx0XHRcdGNvbHVtbnM6IGNvbHVtbnMsXG5cdFx0XHRjb2xsZWN0aW9uOiBuZXcgQ29sbGVjdGlvbigpLFxuXHRcdFx0Y2xpY2thYmxlOiB0cnVlLFxuXHRcdFx0Y291bnRlcjoge1xuXHRcdFx0XHRlbGVtZW50OiB0aGlzLnVpLmNvdW50ZXJCYXIsXG5cdFx0XHRcdHRlbXBsYXRlOiBcIlVzZXJzICRzdGFydCAtICRlbmQgb2YgJHRvdGFsXCIsXG5cdFx0XHR9LFxuXHRcdFx0cGFnaW5nOiB7XG5cdFx0XHRcdGVsZW1lbnQ6IHRoaXMudWkucGFnaW5nLFxuXHRcdFx0fSxcblx0XHR9KTtcblxuXHRcdHRoaXMuYmluZEV2ZW50cyh0aGlzLmdyaWQuY29sbGVjdGlvbiwgdGhpcy5jb2xsZWN0aW9uRXZlbnRzKTtcblxuXHRcdHRoaXMubGlzdGVuVG8odGhpcy5ncmlkLCBcInJvdzpjbGlja2VkXCIsIHRoaXMuYWRkRWRpdFVzZXIuYmluZCh0aGlzKSk7XG5cblx0XHRjb25zdCB0ZXh0RmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJ0ZXh0XCIsXG5cdFx0XHRuYW1lOiBcInRleHRGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlRleHQgU2VhcmNoXCIsXG5cdFx0XHRkZWJvdW5jZTogMjAwLFxuXHRcdFx0c2VydmVyOiB0cnVlLFxuXHRcdH07XG5cblx0XHRjb25zdCByb2xlc0ZpbHRlciA9IHtcblx0XHRcdHR5cGU6IFwiaXRlbWl6ZWRcIixcblx0XHRcdG5hbWU6IFwicm9sZXNGaWx0ZXJcIixcblx0XHRcdGxhYmVsOiBcIlJvbGVzXCIsXG5cdFx0XHRjYXRlZ29yaWVzOiBbe1xuXHRcdFx0XHRpdGVtczogXy5mcm9tUGFpcnMoXy5jb21wYWN0KF8ubWFwKHNldHRpbmdzLnJvbGVzLCAodmFsLCBrZXkpID0+IHtcblx0XHRcdFx0XHRpZiAoa2V5ID09PSBcIipcIilcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRyZXR1cm4gW2tleSwgdmFsLm5hbWVdO1xuXHRcdFx0XHR9KSkpLFxuXHRcdFx0fV0sXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdGNvbnN0IGdyYWRlRmlsdGVyID0ge1xuXHRcdFx0dHlwZTogXCJpdGVtaXplZFwiLFxuXHRcdFx0bmFtZTogXCJncmFkZUZpbHRlclwiLFxuXHRcdFx0bGFiZWw6IFwiWWVhciBvZiBTdHVkeVwiLFxuXHRcdFx0Y2F0ZWdvcmllczogXy5tYXAoc2V0dGluZ3MuZ3JhZGVMaXN0LCAodmFsLCBrZXkpID0+ICh7XG5cdFx0XHRcdGxhYmVsOiBrZXksXG5cdFx0XHRcdGl0ZW1zOiBfLnJlZHVjZSh2YWwuc29ydCgoYSwgYikgPT4gKFwibGV4aWNhbFwiIGluIGEgPyBhLmxleGljYWwgOiBhLm5hbWUpLnRvVXBwZXJDYXNlKCkubG9jYWxlQ29tcGFyZSgoXCJsZXhpY2FsXCIgaW4gYiA/IGIubGV4aWNhbCA6IGIubmFtZSkudG9VcHBlckNhc2UoKSkpLFxuXHRcdFx0XHRcdChzdW0sIG51bSkgPT4geyBzdW0ucHVzaCh7IG5hbWU6IG51bS52YWx1ZSwgbGFiZWw6IG51bS5uYW1lIH0pOyByZXR1cm4gc3VtOyB9LCBbXSksXG5cdFx0XHR9KSksXG5cdFx0XHRzZXJ2ZXI6IHRydWUsXG5cdFx0fTtcblxuXHRcdHRoaXMudWkuZmlsdGVyQmFyLnByZXBlbmQodGhpcy5ncmlkLmZpbHRlcih7XG5cdFx0XHRmaWx0ZXJDb250YWluZXI6IHRoaXMudWkuZmlsdGVyQmFyLFxuXHRcdFx0ZmlsdGVyczogW3RleHRGaWx0ZXIsIHJvbGVzRmlsdGVyLCBncmFkZUZpbHRlcl0sXG5cdFx0XHRkZWZhdWx0RmlsdGVyczogW1widGV4dEZpbHRlclwiLCBcInJvbGVzRmlsdGVyXCIsIFwiZ3JhZGVGaWx0ZXJcIl0sXG5cdFx0fSkucmVuZGVyKCkuZWwpO1xuXHR9LFxuXG5cdGlzRmNDbGllbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzZXR0aW5ncy5mY0NsaWVudDtcblx0fSxcblxuXHR2aWV3VXNlckRldGFpbHM6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0dGhpcy51c2VyRGV0YWlscyA9IG5ldyBVc2VyRGV0YWlscyh7XG5cdFx0XHRldmVudEJ1czogdGhpcyxcblx0XHRcdHVzZXJNb2RlbDogbW9kZWwsXG5cdFx0fSk7XG5cblx0XHR0aGlzLm9uKFwidXNlckRldGFpbHM6Y2xvc2VcIiwgKCkgPT4ge1xuXHRcdFx0dGhpcy5vZmYoXCJ1c2VyRGV0YWlsczpjbG9zZVwiKTtcblx0XHR9LCB0aGlzKTtcblxuXHRcdHRoaXMudXNlckRldGFpbHMuc2hvdygpO1xuXHR9LFxuXG5cdGRlbGV0ZVVzZXI6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0dGhpcy5kZWxNb2RhbCA9IG5ldyBTbWFsbE1vZGFsKHtcblx0XHRcdHBlcnNpc3Q6IHRydWUsXG5cdFx0XHR0aXRsZTogXCI8c3BhbiBjbGFzcz0nZmFsIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJy8+IERlbGV0ZSBVc2VyOiBcIiArIChtb2RlbC5nZXQoXCJmaXJzdG5hbWVcIikgKyBcIiBcIiArIG1vZGVsLmdldChcInN1cm5hbWVcIikpLnJlcGxhY2UoL1tcXCZcXDxcXD5cXCdcXFwiXS9nLCB4ID0+IFwiJiNcIiArIHguY2hhckNvZGVBdCgwKSArIFwiO1wiKSxcblx0XHRcdGJvZHk6IFwiPHA+QXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIHVzZXI/PC9wPlwiLFxuXHRcdFx0d2FybmluZzogdHJ1ZSxcblx0XHR9KTtcblx0XHR0aGlzLmRlbE1vZGFsLm9uKFwiYnV0dG9uOm9rXCIsICgpID0+IHtcblx0XHRcdG1vZGVsLmRlc3Ryb3koeyB3YWl0OiB0cnVlLCBzdWNjZXNzOiB0aGlzLmRlbGV0aW9uU3VjY2Vzcy5iaW5kKHRoaXMpLCBlcnJvcjogdGhpcy5kZWxldGlvbkVycm9yLmJpbmQodGhpcykgfSk7XG5cdFx0fSk7XG5cblx0XHRpZiAoIXNldHRpbmdzLmZjQ2xpZW50KVxuXHRcdFx0dGhpcy5kZWxNb2RhbC5zaG93KCk7XG5cdH0sXG5cblx0ZGVsZXRpb25TdWNjZXNzOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdHRoaXMuZGVsTW9kYWwuZGVzdHJveSgpO1xuXHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5Ub2FzdCwgeyBjb250ZW50OiBcIlVzZXIgXCIgKyBtb2RlbC5nZXQoXCJmaXJzdG5hbWVcIikgKyBcIiBcIiArIG1vZGVsLmdldChcInN1cm5hbWVcIikgKyBcIiBzdWNjZXNzZnVsbHkgZGVsZXRlZFwiLCBpY29uOiBcImZhLXRyYXNoLWFsdFwiLCBpY29uQ29sb3VyOiBcInJlZFwiIH0pO1xuXHR9LFxuXG5cdGRlbGV0aW9uRXJyb3I6IGZ1bmN0aW9uKG1vZGVsLCB4aHIpIHtcblx0XHRjb25zdCBhbnN3ZXIgPSBBcHAucGFyc2VSZXNwb25zZSh4aHIpO1xuXHRcdHRoaXMuZGVsTW9kYWwuc2hvd0Vycm9yKFwiRGVsZXRpb24gZmFpbGVkOiBcIiArIChhbnN3ZXIuZGV0YWlsIHx8IGFuc3dlci5pbmZvKSk7XG5cdH0sXG5cblx0aW1wZXJzb25hdGVVc2VyOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdHJhZGlvLnRyaWdnZXIoQXBwLkV2ZW50cy5Db21tYW5kcy5OYXZpZ2F0ZSwgXCIvYWRtaW4vaW1wZXJzb25hdGUvXCIgKyBtb2RlbC5nZXQoXCJ1c2VybmFtZVwiKSk7XG5cdH0sXG5cblx0Y2hhbmdlbG9nOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdGNvbnN0IG1vZCA9IG5ldyBCYWNrYm9uZS5Nb2RlbCh7XG5cdFx0XHR0aXRsZTogbW9kZWwuZ2V0KFwidXNlcm5hbWVcIiksXG5cdFx0XHRpZGVudGlmaWVyOiBtb2RlbC5nZXQoXCJ1c2VyX2lkXCIpLFxuXHRcdFx0Y2F0ZWdvcnk6IFwidXNlclwiLFxuXHRcdH0pO1xuXG5cdFx0Y29uc3QgbW9kYWwgPSBuZXcgQ2hhbmdlbG9nTW9kYWwoeyBtb2RlbDogbW9kIH0pO1xuXG5cdFx0bW9kYWwuc2hvdygpO1xuXHR9LFxuXG5cdGZsdXNoQm9va0NhY2hlOiBmdW5jdGlvbihtb2RlbCkge1xuXHRcdGlmICghbW9kZWwpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLmZsdXNoTW9kYWwgPSBuZXcgU21hbGxNb2RhbCh7XG5cdFx0XHRwZXJzaXN0OiB0cnVlLFxuXHRcdFx0d2FybmluZzogdHJ1ZSxcblx0XHRcdHRpdGxlOiBcIjxzcGFuIGNsYXNzPSdmYWwgZmEtZXhjbGFtYXRpb24tdHJpYW5nbGUnLz4gQm9vayBDYWNoZSBGbHVzaCBDb25maXJtYXRpb25cIixcblx0XHRcdGJvZHk6IFwiPHA+VGhpcyB3aWxsIGZsdXNoIHRoZSBjYWNoZWQgbGlzdCBvZiBib29rcyBmb3IgdGhpcyB1c2VyLiBUaGUgdXNlciB3aWxsIHNlZSB0aGUgcHJlY2lzZSBsaXN0IG9mIGJvb2tzIHRoYXQgdGhleSByZWFsbHkgaGF2ZSBhY2Nlc3MgdG8uPC9wPlwiLFxuXHRcdH0pO1xuXG5cdFx0dGhpcy5mbHVzaE1vZGFsLm9uKFwiYnV0dG9uOm9rXCIsICgpID0+IHtcblx0XHRcdCQuYWpheCh7XG5cdFx0XHRcdG1ldGhvZDogXCJERUxFVEVcIixcblx0XHRcdFx0dXJsOiBzZXR0aW5ncy51cmxSb290ICsgXCIvYXBpLzEuMC91c2Vycy9cIiArIGVuY29kZVVSSUNvbXBvbmVudChtb2RlbC5nZXQoXCJ1c2VybmFtZVwiKSkgKyBcIi9mbHVzaC9kZWxldGVcIixcblx0XHRcdFx0c3VjY2VzczogdGhpcy5mbHVzaFN1Y2Nlc3MuYmluZCh0aGlzLCBtb2RlbCksXG5cdFx0XHRcdGVycm9yOiB0aGlzLmZsdXNoRXJyb3IuYmluZCh0aGlzKSxcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5mbHVzaE1vZGFsLnNob3coKTtcblx0fSxcblxuXHRmbHVzaFN1Y2Nlc3M6IGZ1bmN0aW9uKG1vZGVsKSB7XG5cdFx0cmFkaW8udHJpZ2dlcihBcHAuRXZlbnRzLkNvbW1hbmRzLlRvYXN0LCB7IGljb246IFwiZmEtdHJhc2gtYWx0XCIsIGNvbG91cjogXCJyZWRcIiwgY29udGVudDogXCJVc2VyIFwiICsgbW9kZWwuZ2V0KFwidXNlcm5hbWVcIikgKyBcIiBzdWNjZXNzZnVsbHkgZmx1c2hlZFwiIH0pO1xuXHRcdHRoaXMuZmx1c2hNb2RhbC5kZXN0cm95KCk7XG5cdH0sXG5cblx0Zmx1c2hFcnJvcjogZnVuY3Rpb24obW9kZWwsIHhocikge1xuXHRcdGNvbnN0IGFuc3dlciA9IEFwcC5wYXJzZVJlc3BvbnNlKHhocik7XG5cdFx0dGhpcy5mbHVzaE1vZGFsLnNob3dFcnJvcihcIkZsdXNoIGZhaWxlZDogXCIgKyAoYW5zd2VyLmRldGFpbCB8fCBhbnN3ZXIuaW5mbykpO1xuXHR9LFxufSk7Il19",
    "\"use strict\";\n/* flatpickr v4.5.2, @license MIT */\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n(function (global, factory) {\n  (typeof exports === 'undefined' ? 'undefined' : _typeof(exports)) === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : global.flatpickr = factory();\n})(undefined, function () {\n  'use strict';\n\n  var pad = function pad(number) {\n    return (\"0\" + number).slice(-2);\n  };\n  var int = function int(bool) {\n    return bool === true ? 1 : 0;\n  };\n  function debounce(func, wait, immediate) {\n    if (immediate === void 0) {\n      immediate = false;\n    }\n\n    var timeout;\n    return function () {\n      var context = this,\n          args = arguments;\n      timeout !== null && clearTimeout(timeout);\n      timeout = window.setTimeout(function () {\n        timeout = null;\n        if (!immediate) func.apply(context, args);\n      }, wait);\n      if (immediate && !timeout) func.apply(context, args);\n    };\n  }\n  var arrayify = function arrayify(obj) {\n    return obj instanceof Array ? obj : [obj];\n  };\n\n  var do_nothing = function do_nothing() {\n    return undefined;\n  };\n\n  var monthToStr = function monthToStr(monthNumber, shorthand, locale) {\n    return locale.months[shorthand ? \"shorthand\" : \"longhand\"][monthNumber];\n  };\n  var revFormat = {\n    D: do_nothing,\n    F: function F(dateObj, monthName, locale) {\n      dateObj.setMonth(locale.months.longhand.indexOf(monthName));\n    },\n    G: function G(dateObj, hour) {\n      dateObj.setHours(parseFloat(hour));\n    },\n    H: function H(dateObj, hour) {\n      dateObj.setHours(parseFloat(hour));\n    },\n    J: function J(dateObj, day) {\n      dateObj.setDate(parseFloat(day));\n    },\n    K: function K(dateObj, amPM, locale) {\n      dateObj.setHours(dateObj.getHours() % 12 + 12 * int(new RegExp(locale.amPM[1], \"i\").test(amPM)));\n    },\n    M: function M(dateObj, shortMonth, locale) {\n      dateObj.setMonth(locale.months.shorthand.indexOf(shortMonth));\n    },\n    S: function S(dateObj, seconds) {\n      dateObj.setSeconds(parseFloat(seconds));\n    },\n    U: function U(_, unixSeconds) {\n      return new Date(parseFloat(unixSeconds) * 1000);\n    },\n    W: function W(dateObj, weekNum) {\n      var weekNumber = parseInt(weekNum);\n      return new Date(dateObj.getFullYear(), 0, 2 + (weekNumber - 1) * 7, 0, 0, 0, 0);\n    },\n    Y: function Y(dateObj, year) {\n      dateObj.setFullYear(parseFloat(year));\n    },\n    Z: function Z(_, ISODate) {\n      return new Date(ISODate);\n    },\n    d: function d(dateObj, day) {\n      dateObj.setDate(parseFloat(day));\n    },\n    h: function h(dateObj, hour) {\n      dateObj.setHours(parseFloat(hour));\n    },\n    i: function i(dateObj, minutes) {\n      dateObj.setMinutes(parseFloat(minutes));\n    },\n    j: function j(dateObj, day) {\n      dateObj.setDate(parseFloat(day));\n    },\n    l: do_nothing,\n    m: function m(dateObj, month) {\n      dateObj.setMonth(parseFloat(month) - 1);\n    },\n    n: function n(dateObj, month) {\n      dateObj.setMonth(parseFloat(month) - 1);\n    },\n    s: function s(dateObj, seconds) {\n      dateObj.setSeconds(parseFloat(seconds));\n    },\n    w: do_nothing,\n    y: function y(dateObj, year) {\n      dateObj.setFullYear(2000 + parseFloat(year));\n    }\n  };\n  var tokenRegex = {\n    D: \"(\\\\w+)\",\n    F: \"(\\\\w+)\",\n    G: \"(\\\\d\\\\d|\\\\d)\",\n    H: \"(\\\\d\\\\d|\\\\d)\",\n    J: \"(\\\\d\\\\d|\\\\d)\\\\w+\",\n    K: \"\",\n    M: \"(\\\\w+)\",\n    S: \"(\\\\d\\\\d|\\\\d)\",\n    U: \"(.+)\",\n    W: \"(\\\\d\\\\d|\\\\d)\",\n    Y: \"(\\\\d{4})\",\n    Z: \"(.+)\",\n    d: \"(\\\\d\\\\d|\\\\d)\",\n    h: \"(\\\\d\\\\d|\\\\d)\",\n    i: \"(\\\\d\\\\d|\\\\d)\",\n    j: \"(\\\\d\\\\d|\\\\d)\",\n    l: \"(\\\\w+)\",\n    m: \"(\\\\d\\\\d|\\\\d)\",\n    n: \"(\\\\d\\\\d|\\\\d)\",\n    s: \"(\\\\d\\\\d|\\\\d)\",\n    w: \"(\\\\d\\\\d|\\\\d)\",\n    y: \"(\\\\d{2})\"\n  };\n  var formats = {\n    Z: function Z(date) {\n      return date.toISOString();\n    },\n    D: function D(date, locale, options) {\n      return locale.weekdays.shorthand[formats.w(date, locale, options)];\n    },\n    F: function F(date, locale, options) {\n      return monthToStr(formats.n(date, locale, options) - 1, false, locale);\n    },\n    G: function G(date, locale, options) {\n      return pad(formats.h(date, locale, options));\n    },\n    H: function H(date) {\n      return pad(date.getHours());\n    },\n    J: function J(date, locale) {\n      return locale.ordinal !== undefined ? date.getDate() + locale.ordinal(date.getDate()) : date.getDate();\n    },\n    K: function K(date, locale) {\n      return locale.amPM[int(date.getHours() > 11)];\n    },\n    M: function M(date, locale) {\n      return monthToStr(date.getMonth(), true, locale);\n    },\n    S: function S(date) {\n      return pad(date.getSeconds());\n    },\n    U: function U(date) {\n      return date.getTime() / 1000;\n    },\n    W: function W(date, _, options) {\n      return options.getWeek(date);\n    },\n    Y: function Y(date) {\n      return date.getFullYear();\n    },\n    d: function d(date) {\n      return pad(date.getDate());\n    },\n    h: function h(date) {\n      return date.getHours() % 12 ? date.getHours() % 12 : 12;\n    },\n    i: function i(date) {\n      return pad(date.getMinutes());\n    },\n    j: function j(date) {\n      return date.getDate();\n    },\n    l: function l(date, locale) {\n      return locale.weekdays.longhand[date.getDay()];\n    },\n    m: function m(date) {\n      return pad(date.getMonth() + 1);\n    },\n    n: function n(date) {\n      return date.getMonth() + 1;\n    },\n    s: function s(date) {\n      return date.getSeconds();\n    },\n    w: function w(date) {\n      return date.getDay();\n    },\n    y: function y(date) {\n      return String(date.getFullYear()).substring(2);\n    }\n  };\n\n  var english = {\n    weekdays: {\n      shorthand: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n      longhand: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"]\n    },\n    months: {\n      shorthand: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\n      longhand: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"]\n    },\n    daysInMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],\n    firstDayOfWeek: 0,\n    ordinal: function ordinal(nth) {\n      var s = nth % 100;\n      if (s > 3 && s < 21) return \"th\";\n\n      switch (s % 10) {\n        case 1:\n          return \"st\";\n\n        case 2:\n          return \"nd\";\n\n        case 3:\n          return \"rd\";\n\n        default:\n          return \"th\";\n      }\n    },\n    rangeSeparator: \" to \",\n    weekAbbreviation: \"Wk\",\n    scrollTitle: \"Scroll to increment\",\n    toggleTitle: \"Click to toggle\",\n    amPM: [\"AM\", \"PM\"],\n    yearAriaLabel: \"Year\"\n  };\n\n  var createDateFormatter = function createDateFormatter(_ref) {\n    var _ref$config = _ref.config,\n        config = _ref$config === void 0 ? defaults : _ref$config,\n        _ref$l10n = _ref.l10n,\n        l10n = _ref$l10n === void 0 ? english : _ref$l10n;\n    return function (dateObj, frmt, overrideLocale) {\n      var locale = overrideLocale || l10n;\n\n      if (config.formatDate !== undefined) {\n        return config.formatDate(dateObj, frmt, locale);\n      }\n\n      return frmt.split(\"\").map(function (c, i, arr) {\n        return formats[c] && arr[i - 1] !== \"\\\\\" ? formats[c](dateObj, locale, config) : c !== \"\\\\\" ? c : \"\";\n      }).join(\"\");\n    };\n  };\n  var createDateParser = function createDateParser(_ref2) {\n    var _ref2$config = _ref2.config,\n        config = _ref2$config === void 0 ? defaults : _ref2$config,\n        _ref2$l10n = _ref2.l10n,\n        l10n = _ref2$l10n === void 0 ? english : _ref2$l10n;\n    return function (date, givenFormat, timeless, customLocale) {\n      if (date !== 0 && !date) return undefined;\n      var locale = customLocale || l10n;\n      var parsedDate;\n      var date_orig = date;\n      if (date instanceof Date) parsedDate = new Date(date.getTime());else if (typeof date !== \"string\" && date.toFixed !== undefined) parsedDate = new Date(date);else if (typeof date === \"string\") {\n        var format = givenFormat || (config || defaults).dateFormat;\n        var datestr = String(date).trim();\n\n        if (datestr === \"today\") {\n          parsedDate = new Date();\n          timeless = true;\n        } else if (/Z$/.test(datestr) || /GMT$/.test(datestr)) parsedDate = new Date(date);else if (config && config.parseDate) parsedDate = config.parseDate(date, format);else {\n          parsedDate = !config || !config.noCalendar ? new Date(new Date().getFullYear(), 0, 1, 0, 0, 0, 0) : new Date(new Date().setHours(0, 0, 0, 0));\n          var matched,\n              ops = [];\n\n          for (var i = 0, matchIndex = 0, regexStr = \"\"; i < format.length; i++) {\n            var token = format[i];\n            var isBackSlash = token === \"\\\\\";\n            var escaped = format[i - 1] === \"\\\\\" || isBackSlash;\n\n            if (tokenRegex[token] && !escaped) {\n              regexStr += tokenRegex[token];\n              var match = new RegExp(regexStr).exec(date);\n\n              if (match && (matched = true)) {\n                ops[token !== \"Y\" ? \"push\" : \"unshift\"]({\n                  fn: revFormat[token],\n                  val: match[++matchIndex]\n                });\n              }\n            } else if (!isBackSlash) regexStr += \".\";\n\n            ops.forEach(function (_ref3) {\n              var fn = _ref3.fn,\n                  val = _ref3.val;\n              return parsedDate = fn(parsedDate, val, locale) || parsedDate;\n            });\n          }\n\n          parsedDate = matched ? parsedDate : undefined;\n        }\n      }\n\n      if (!(parsedDate instanceof Date && !isNaN(parsedDate.getTime()))) {\n        config.errorHandler(new Error(\"Invalid date provided: \" + date_orig));\n        return undefined;\n      }\n\n      if (timeless === true) parsedDate.setHours(0, 0, 0, 0);\n      return parsedDate;\n    };\n  };\n  function compareDates(date1, date2, timeless) {\n    if (timeless === void 0) {\n      timeless = true;\n    }\n\n    if (timeless !== false) {\n      return new Date(date1.getTime()).setHours(0, 0, 0, 0) - new Date(date2.getTime()).setHours(0, 0, 0, 0);\n    }\n\n    return date1.getTime() - date2.getTime();\n  }\n  var getWeek = function getWeek(givenDate) {\n    var date = new Date(givenDate.getTime());\n    date.setHours(0, 0, 0, 0);\n    date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7);\n    var week1 = new Date(date.getFullYear(), 0, 4);\n    return 1 + Math.round(((date.getTime() - week1.getTime()) / 86400000 - 3 + (week1.getDay() + 6) % 7) / 7);\n  };\n  var isBetween = function isBetween(ts, ts1, ts2) {\n    return ts > Math.min(ts1, ts2) && ts < Math.max(ts1, ts2);\n  };\n  var duration = {\n    DAY: 86400000\n  };\n\n  var HOOKS = [\"onChange\", \"onClose\", \"onDayCreate\", \"onDestroy\", \"onKeyDown\", \"onMonthChange\", \"onOpen\", \"onParseConfig\", \"onReady\", \"onValueUpdate\", \"onYearChange\", \"onPreCalendarPosition\"];\n  var defaults = {\n    _disable: [],\n    _enable: [],\n    allowInput: false,\n    altFormat: \"F j, Y\",\n    altInput: false,\n    altInputClass: \"form-control input\",\n    animate: (typeof window === 'undefined' ? 'undefined' : _typeof(window)) === \"object\" && window.navigator.userAgent.indexOf(\"MSIE\") === -1,\n    ariaDateFormat: \"F j, Y\",\n    clickOpens: true,\n    closeOnSelect: true,\n    conjunction: \", \",\n    dateFormat: \"Y-m-d\",\n    defaultHour: 12,\n    defaultMinute: 0,\n    defaultSeconds: 0,\n    disable: [],\n    disableMobile: false,\n    enable: [],\n    enableSeconds: false,\n    enableTime: false,\n    errorHandler: function errorHandler(err) {\n      return typeof console !== \"undefined\" && console.warn(err);\n    },\n    getWeek: getWeek,\n    hourIncrement: 1,\n    ignoredFocusElements: [],\n    inline: false,\n    locale: \"default\",\n    minuteIncrement: 5,\n    mode: \"single\",\n    nextArrow: \"<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M13.207 8.472l-7.854 7.854-0.707-0.707 7.146-7.146-7.146-7.148 0.707-0.707 7.854 7.854z' /></svg>\",\n    noCalendar: false,\n    now: new Date(),\n    onChange: [],\n    onClose: [],\n    onDayCreate: [],\n    onDestroy: [],\n    onKeyDown: [],\n    onMonthChange: [],\n    onOpen: [],\n    onParseConfig: [],\n    onReady: [],\n    onValueUpdate: [],\n    onYearChange: [],\n    onPreCalendarPosition: [],\n    plugins: [],\n    position: \"auto\",\n    positionElement: undefined,\n    prevArrow: \"<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M5.207 8.471l7.146 7.147-0.707 0.707-7.853-7.854 7.854-7.853 0.707 0.707-7.147 7.146z' /></svg>\",\n    shorthandCurrentMonth: false,\n    showMonths: 1,\n    static: false,\n    time_24hr: false,\n    weekNumbers: false,\n    wrap: false\n  };\n\n  function toggleClass(elem, className, bool) {\n    if (bool === true) return elem.classList.add(className);\n    elem.classList.remove(className);\n  }\n  function createElement(tag, className, content) {\n    var e = window.document.createElement(tag);\n    className = className || \"\";\n    content = content || \"\";\n    e.className = className;\n    if (content !== undefined) e.textContent = content;\n    return e;\n  }\n  function clearNode(node) {\n    while (node.firstChild) {\n      node.removeChild(node.firstChild);\n    }\n  }\n  function findParent(node, condition) {\n    if (condition(node)) return node;else if (node.parentNode) return findParent(node.parentNode, condition);\n    return undefined;\n  }\n  function createNumberInput(inputClassName, opts) {\n    var wrapper = createElement(\"div\", \"numInputWrapper\"),\n        numInput = createElement(\"input\", \"numInput \" + inputClassName),\n        arrowUp = createElement(\"span\", \"arrowUp\"),\n        arrowDown = createElement(\"span\", \"arrowDown\");\n    numInput.type = \"text\";\n    numInput.pattern = \"\\\\d*\";\n    if (opts !== undefined) for (var key in opts) {\n      numInput.setAttribute(key, opts[key]);\n    }\n    wrapper.appendChild(numInput);\n    wrapper.appendChild(arrowUp);\n    wrapper.appendChild(arrowDown);\n    return wrapper;\n  }\n\n  if (typeof Object.assign !== \"function\") {\n    Object.assign = function (target) {\n      if (!target) {\n        throw TypeError(\"Cannot convert undefined or null to object\");\n      }\n\n      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n        args[_key - 1] = arguments[_key];\n      }\n\n      var _loop = function _loop() {\n        var source = args[_i];\n\n        if (source) {\n          Object.keys(source).forEach(function (key) {\n            return target[key] = source[key];\n          });\n        }\n      };\n\n      for (var _i = 0; _i < args.length; _i++) {\n        _loop();\n      }\n\n      return target;\n    };\n  }\n\n  var DEBOUNCED_CHANGE_MS = 300;\n\n  function FlatpickrInstance(element, instanceConfig) {\n    var self = {\n      config: Object.assign({}, flatpickr.defaultConfig),\n      l10n: english\n    };\n    self.parseDate = createDateParser({\n      config: self.config,\n      l10n: self.l10n\n    });\n    self._handlers = [];\n    self._bind = bind;\n    self._setHoursFromDate = setHoursFromDate;\n    self._positionCalendar = positionCalendar;\n    self.changeMonth = changeMonth;\n    self.changeYear = changeYear;\n    self.clear = clear;\n    self.close = close;\n    self._createElement = createElement;\n    self.destroy = destroy;\n    self.isEnabled = isEnabled;\n    self.jumpToDate = jumpToDate;\n    self.open = open;\n    self.redraw = redraw;\n    self.set = set;\n    self.setDate = setDate;\n    self.toggle = toggle;\n\n    function setupHelperFunctions() {\n      self.utils = {\n        getDaysInMonth: function getDaysInMonth(month, yr) {\n          if (month === void 0) {\n            month = self.currentMonth;\n          }\n\n          if (yr === void 0) {\n            yr = self.currentYear;\n          }\n\n          if (month === 1 && (yr % 4 === 0 && yr % 100 !== 0 || yr % 400 === 0)) return 29;\n          return self.l10n.daysInMonth[month];\n        }\n      };\n    }\n\n    function init() {\n      self.element = self.input = element;\n      self.isOpen = false;\n      parseConfig();\n      setupLocale();\n      setupInputs();\n      setupDates();\n      setupHelperFunctions();\n      if (!self.isMobile) build();\n      bindEvents();\n\n      if (self.selectedDates.length || self.config.noCalendar) {\n        if (self.config.enableTime) {\n          setHoursFromDate(self.config.noCalendar ? self.latestSelectedDateObj || self.config.minDate : undefined);\n        }\n\n        updateValue(false);\n      }\n\n      setCalendarWidth();\n      self.showTimeInput = self.selectedDates.length > 0 || self.config.noCalendar;\n      var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n\n      if (!self.isMobile && isSafari) {\n        positionCalendar();\n      }\n\n      triggerEvent(\"onReady\");\n    }\n\n    function bindToInstance(fn) {\n      return fn.bind(self);\n    }\n\n    function setCalendarWidth() {\n      var config = self.config;\n      if (config.weekNumbers === false && config.showMonths === 1) return;else if (config.noCalendar !== true) {\n        window.requestAnimationFrame(function () {\n          self.calendarContainer.style.visibility = \"hidden\";\n          self.calendarContainer.style.display = \"block\";\n\n          if (self.daysContainer !== undefined) {\n            var daysWidth = (self.days.offsetWidth + 1) * config.showMonths;\n            self.daysContainer.style.width = daysWidth + \"px\";\n            self.calendarContainer.style.width = daysWidth + (self.weekWrapper !== undefined ? self.weekWrapper.offsetWidth : 0) + \"px\";\n            self.calendarContainer.style.removeProperty(\"visibility\");\n            self.calendarContainer.style.removeProperty(\"display\");\n          }\n        });\n      }\n    }\n\n    function updateTime(e) {\n      if (self.selectedDates.length === 0) return;\n\n      if (e !== undefined && e.type !== \"blur\") {\n        timeWrapper(e);\n      }\n\n      var prevValue = self._input.value;\n      setHoursFromInputs();\n      updateValue();\n\n      if (self._input.value !== prevValue) {\n        self._debouncedChange();\n      }\n    }\n\n    function ampm2military(hour, amPM) {\n      return hour % 12 + 12 * int(amPM === self.l10n.amPM[1]);\n    }\n\n    function military2ampm(hour) {\n      switch (hour % 24) {\n        case 0:\n        case 12:\n          return 12;\n\n        default:\n          return hour % 12;\n      }\n    }\n\n    function setHoursFromInputs() {\n      if (self.hourElement === undefined || self.minuteElement === undefined) return;\n      var hours = (parseInt(self.hourElement.value.slice(-2), 10) || 0) % 24,\n          minutes = (parseInt(self.minuteElement.value, 10) || 0) % 60,\n          seconds = self.secondElement !== undefined ? (parseInt(self.secondElement.value, 10) || 0) % 60 : 0;\n\n      if (self.amPM !== undefined) {\n        hours = ampm2military(hours, self.amPM.textContent);\n      }\n\n      var limitMinHours = self.config.minTime !== undefined || self.config.minDate && self.minDateHasTime && self.latestSelectedDateObj && compareDates(self.latestSelectedDateObj, self.config.minDate, true) === 0;\n      var limitMaxHours = self.config.maxTime !== undefined || self.config.maxDate && self.maxDateHasTime && self.latestSelectedDateObj && compareDates(self.latestSelectedDateObj, self.config.maxDate, true) === 0;\n\n      if (limitMaxHours) {\n        var maxTime = self.config.maxTime !== undefined ? self.config.maxTime : self.config.maxDate;\n        hours = Math.min(hours, maxTime.getHours());\n        if (hours === maxTime.getHours()) minutes = Math.min(minutes, maxTime.getMinutes());\n        if (minutes === maxTime.getMinutes()) seconds = Math.min(seconds, maxTime.getSeconds());\n      }\n\n      if (limitMinHours) {\n        var minTime = self.config.minTime !== undefined ? self.config.minTime : self.config.minDate;\n        hours = Math.max(hours, minTime.getHours());\n        if (hours === minTime.getHours()) minutes = Math.max(minutes, minTime.getMinutes());\n        if (minutes === minTime.getMinutes()) seconds = Math.max(seconds, minTime.getSeconds());\n      }\n\n      setHours(hours, minutes, seconds);\n    }\n\n    function setHoursFromDate(dateObj) {\n      var date = dateObj || self.latestSelectedDateObj;\n      if (date) setHours(date.getHours(), date.getMinutes(), date.getSeconds());\n    }\n\n    function setDefaultHours() {\n      var hours = self.config.defaultHour;\n      var minutes = self.config.defaultMinute;\n      var seconds = self.config.defaultSeconds;\n\n      if (self.config.minDate !== undefined) {\n        var min_hr = self.config.minDate.getHours();\n        var min_minutes = self.config.minDate.getMinutes();\n        hours = Math.max(hours, min_hr);\n        if (hours === min_hr) minutes = Math.max(min_minutes, minutes);\n        if (hours === min_hr && minutes === min_minutes) seconds = self.config.minDate.getSeconds();\n      }\n\n      if (self.config.maxDate !== undefined) {\n        var max_hr = self.config.maxDate.getHours();\n        var max_minutes = self.config.maxDate.getMinutes();\n        hours = Math.min(hours, max_hr);\n        if (hours === max_hr) minutes = Math.min(max_minutes, minutes);\n        if (hours === max_hr && minutes === max_minutes) seconds = self.config.maxDate.getSeconds();\n      }\n\n      setHours(hours, minutes, seconds);\n    }\n\n    function setHours(hours, minutes, seconds) {\n      if (self.latestSelectedDateObj !== undefined) {\n        self.latestSelectedDateObj.setHours(hours % 24, minutes, seconds || 0, 0);\n      }\n\n      if (!self.hourElement || !self.minuteElement || self.isMobile) return;\n      self.hourElement.value = pad(!self.config.time_24hr ? (12 + hours) % 12 + 12 * int(hours % 12 === 0) : hours);\n      self.minuteElement.value = pad(minutes);\n      if (self.amPM !== undefined) self.amPM.textContent = self.l10n.amPM[int(hours >= 12)];\n      if (self.secondElement !== undefined) self.secondElement.value = pad(seconds);\n    }\n\n    function onYearInput(event) {\n      var year = parseInt(event.target.value) + (event.delta || 0);\n\n      if (year / 1000 > 1 || event.key === \"Enter\" && !/[^\\d]/.test(year.toString())) {\n        changeYear(year);\n      }\n    }\n\n    function bind(element, event, handler, options) {\n      if (event instanceof Array) return event.forEach(function (ev) {\n        return bind(element, ev, handler, options);\n      });\n      if (element instanceof Array) return element.forEach(function (el) {\n        return bind(el, event, handler, options);\n      });\n      element.addEventListener(event, handler, options);\n\n      self._handlers.push({\n        element: element,\n        event: event,\n        handler: handler,\n        options: options\n      });\n    }\n\n    function onClick(handler) {\n      return function (evt) {\n        evt.which === 1 && handler(evt);\n      };\n    }\n\n    function triggerChange() {\n      triggerEvent(\"onChange\");\n    }\n\n    function bindEvents() {\n      if (self.config.wrap) {\n        [\"open\", \"close\", \"toggle\", \"clear\"].forEach(function (evt) {\n          Array.prototype.forEach.call(self.element.querySelectorAll(\"[data-\" + evt + \"]\"), function (el) {\n            return bind(el, \"click\", self[evt]);\n          });\n        });\n      }\n\n      if (self.isMobile) {\n        setupMobile();\n        return;\n      }\n\n      var debouncedResize = debounce(onResize, 50);\n      self._debouncedChange = debounce(triggerChange, DEBOUNCED_CHANGE_MS);\n      if (self.daysContainer && !/iPhone|iPad|iPod/i.test(navigator.userAgent)) bind(self.daysContainer, \"mouseover\", function (e) {\n        if (self.config.mode === \"range\") onMouseOver(e.target);\n      });\n      bind(window.document.body, \"keydown\", onKeyDown);\n      if (!self.config.static) bind(self._input, \"keydown\", onKeyDown);\n      if (!self.config.inline && !self.config.static) bind(window, \"resize\", debouncedResize);\n      if (window.ontouchstart !== undefined) bind(window.document, \"click\", documentClick);else bind(window.document, \"mousedown\", onClick(documentClick));\n      bind(window.document, \"focus\", documentClick, {\n        capture: true\n      });\n\n      if (self.config.clickOpens === true) {\n        bind(self._input, \"focus\", self.open);\n        bind(self._input, \"mousedown\", onClick(self.open));\n      }\n\n      if (self.daysContainer !== undefined) {\n        bind(self.monthNav, \"mousedown\", onClick(onMonthNavClick));\n        bind(self.monthNav, [\"keyup\", \"increment\"], onYearInput);\n        bind(self.daysContainer, \"mousedown\", onClick(selectDate));\n      }\n\n      if (self.timeContainer !== undefined && self.minuteElement !== undefined && self.hourElement !== undefined) {\n        var selText = function selText(e) {\n          return e.target.select();\n        };\n\n        bind(self.timeContainer, [\"increment\"], updateTime);\n        bind(self.timeContainer, \"blur\", updateTime, {\n          capture: true\n        });\n        bind(self.timeContainer, \"mousedown\", onClick(timeIncrement));\n        bind([self.hourElement, self.minuteElement], [\"focus\", \"click\"], selText);\n        if (self.secondElement !== undefined) bind(self.secondElement, \"focus\", function () {\n          return self.secondElement && self.secondElement.select();\n        });\n\n        if (self.amPM !== undefined) {\n          bind(self.amPM, \"mousedown\", onClick(function (e) {\n            updateTime(e);\n            triggerChange();\n          }));\n        }\n      }\n    }\n\n    function jumpToDate(jumpDate) {\n      var jumpTo = jumpDate !== undefined ? self.parseDate(jumpDate) : self.latestSelectedDateObj || (self.config.minDate && self.config.minDate > self.now ? self.config.minDate : self.config.maxDate && self.config.maxDate < self.now ? self.config.maxDate : self.now);\n\n      try {\n        if (jumpTo !== undefined) {\n          self.currentYear = jumpTo.getFullYear();\n          self.currentMonth = jumpTo.getMonth();\n        }\n      } catch (e) {\n        e.message = \"Invalid date supplied: \" + jumpTo;\n        self.config.errorHandler(e);\n      }\n\n      self.redraw();\n    }\n\n    function timeIncrement(e) {\n      if (~e.target.className.indexOf(\"arrow\")) incrementNumInput(e, e.target.classList.contains(\"arrowUp\") ? 1 : -1);\n    }\n\n    function incrementNumInput(e, delta, inputElem) {\n      var target = e && e.target;\n      var input = inputElem || target && target.parentNode && target.parentNode.firstChild;\n      var event = createEvent(\"increment\");\n      event.delta = delta;\n      input && input.dispatchEvent(event);\n    }\n\n    function build() {\n      var fragment = window.document.createDocumentFragment();\n      self.calendarContainer = createElement(\"div\", \"flatpickr-calendar\");\n      self.calendarContainer.tabIndex = -1;\n\n      if (!self.config.noCalendar) {\n        fragment.appendChild(buildMonthNav());\n        self.innerContainer = createElement(\"div\", \"flatpickr-innerContainer\");\n\n        if (self.config.weekNumbers) {\n          var _buildWeeks = buildWeeks(),\n              weekWrapper = _buildWeeks.weekWrapper,\n              weekNumbers = _buildWeeks.weekNumbers;\n\n          self.innerContainer.appendChild(weekWrapper);\n          self.weekNumbers = weekNumbers;\n          self.weekWrapper = weekWrapper;\n        }\n\n        self.rContainer = createElement(\"div\", \"flatpickr-rContainer\");\n        self.rContainer.appendChild(buildWeekdays());\n\n        if (!self.daysContainer) {\n          self.daysContainer = createElement(\"div\", \"flatpickr-days\");\n          self.daysContainer.tabIndex = -1;\n        }\n\n        buildDays();\n        self.rContainer.appendChild(self.daysContainer);\n        self.innerContainer.appendChild(self.rContainer);\n        fragment.appendChild(self.innerContainer);\n      }\n\n      if (self.config.enableTime) {\n        fragment.appendChild(buildTime());\n      }\n\n      toggleClass(self.calendarContainer, \"rangeMode\", self.config.mode === \"range\");\n      toggleClass(self.calendarContainer, \"animate\", self.config.animate === true);\n      toggleClass(self.calendarContainer, \"multiMonth\", self.config.showMonths > 1);\n      self.calendarContainer.appendChild(fragment);\n      var customAppend = self.config.appendTo !== undefined && self.config.appendTo.nodeType !== undefined;\n\n      if (self.config.inline || self.config.static) {\n        self.calendarContainer.classList.add(self.config.inline ? \"inline\" : \"static\");\n\n        if (self.config.inline) {\n          if (!customAppend && self.element.parentNode) self.element.parentNode.insertBefore(self.calendarContainer, self._input.nextSibling);else if (self.config.appendTo !== undefined) self.config.appendTo.appendChild(self.calendarContainer);\n        }\n\n        if (self.config.static) {\n          var wrapper = createElement(\"div\", \"flatpickr-wrapper\");\n          if (self.element.parentNode) self.element.parentNode.insertBefore(wrapper, self.element);\n          wrapper.appendChild(self.element);\n          if (self.altInput) wrapper.appendChild(self.altInput);\n          wrapper.appendChild(self.calendarContainer);\n        }\n      }\n\n      if (!self.config.static && !self.config.inline) (self.config.appendTo !== undefined ? self.config.appendTo : window.document.body).appendChild(self.calendarContainer);\n    }\n\n    function createDay(className, date, dayNumber, i) {\n      var dateIsEnabled = isEnabled(date, true),\n          dayElement = createElement(\"span\", \"flatpickr-day \" + className, date.getDate().toString());\n      dayElement.dateObj = date;\n      dayElement.$i = i;\n      dayElement.setAttribute(\"aria-label\", self.formatDate(date, self.config.ariaDateFormat));\n\n      if (className.indexOf(\"hidden\") === -1 && compareDates(date, self.now) === 0) {\n        self.todayDateElem = dayElement;\n        dayElement.classList.add(\"today\");\n        dayElement.setAttribute(\"aria-current\", \"date\");\n      }\n\n      if (dateIsEnabled) {\n        dayElement.tabIndex = -1;\n\n        if (isDateSelected(date)) {\n          dayElement.classList.add(\"selected\");\n          self.selectedDateElem = dayElement;\n\n          if (self.config.mode === \"range\") {\n            toggleClass(dayElement, \"startRange\", self.selectedDates[0] && compareDates(date, self.selectedDates[0], true) === 0);\n            toggleClass(dayElement, \"endRange\", self.selectedDates[1] && compareDates(date, self.selectedDates[1], true) === 0);\n            if (className === \"nextMonthDay\") dayElement.classList.add(\"inRange\");\n          }\n        }\n      } else {\n        dayElement.classList.add(\"disabled\");\n      }\n\n      if (self.config.mode === \"range\") {\n        if (isDateInRange(date) && !isDateSelected(date)) dayElement.classList.add(\"inRange\");\n      }\n\n      if (self.weekNumbers && self.config.showMonths === 1 && className !== \"prevMonthDay\" && dayNumber % 7 === 1) {\n        self.weekNumbers.insertAdjacentHTML(\"beforeend\", \"<span class='flatpickr-day'>\" + self.config.getWeek(date) + \"</span>\");\n      }\n\n      triggerEvent(\"onDayCreate\", dayElement);\n      return dayElement;\n    }\n\n    function focusOnDayElem(targetNode) {\n      targetNode.focus();\n      if (self.config.mode === \"range\") onMouseOver(targetNode);\n    }\n\n    function getFirstAvailableDay(delta) {\n      var startMonth = delta > 0 ? 0 : self.config.showMonths - 1;\n      var endMonth = delta > 0 ? self.config.showMonths : -1;\n\n      for (var m = startMonth; m != endMonth; m += delta) {\n        var month = self.daysContainer.children[m];\n        var startIndex = delta > 0 ? 0 : month.children.length - 1;\n        var endIndex = delta > 0 ? month.children.length : -1;\n\n        for (var i = startIndex; i != endIndex; i += delta) {\n          var c = month.children[i];\n          if (c.className.indexOf(\"hidden\") === -1 && isEnabled(c.dateObj)) return c;\n        }\n      }\n\n      return undefined;\n    }\n\n    function getNextAvailableDay(current, delta) {\n      var givenMonth = current.className.indexOf(\"Month\") === -1 ? current.dateObj.getMonth() : self.currentMonth;\n      var endMonth = delta > 0 ? self.config.showMonths : -1;\n      var loopDelta = delta > 0 ? 1 : -1;\n\n      for (var m = givenMonth - self.currentMonth; m != endMonth; m += loopDelta) {\n        var month = self.daysContainer.children[m];\n        var startIndex = givenMonth - self.currentMonth === m ? current.$i + delta : delta < 0 ? month.children.length - 1 : 0;\n        var numMonthDays = month.children.length;\n\n        for (var i = startIndex; i >= 0 && i < numMonthDays && i != (delta > 0 ? numMonthDays : -1); i += loopDelta) {\n          var c = month.children[i];\n          if (c.className.indexOf(\"hidden\") === -1 && isEnabled(c.dateObj) && Math.abs(current.$i - i) >= Math.abs(delta)) return focusOnDayElem(c);\n        }\n      }\n\n      self.changeMonth(loopDelta);\n      focusOnDay(getFirstAvailableDay(loopDelta), 0);\n      return undefined;\n    }\n\n    function focusOnDay(current, offset) {\n      var dayFocused = isInView(document.activeElement || document.body);\n      var startElem = current !== undefined ? current : dayFocused ? document.activeElement : self.selectedDateElem !== undefined && isInView(self.selectedDateElem) ? self.selectedDateElem : self.todayDateElem !== undefined && isInView(self.todayDateElem) ? self.todayDateElem : getFirstAvailableDay(offset > 0 ? 1 : -1);\n      if (startElem === undefined) return self._input.focus();\n      if (!dayFocused) return focusOnDayElem(startElem);\n      getNextAvailableDay(startElem, offset);\n    }\n\n    function buildMonthDays(year, month) {\n      var firstOfMonth = (new Date(year, month, 1).getDay() - self.l10n.firstDayOfWeek + 7) % 7;\n      var prevMonthDays = self.utils.getDaysInMonth((month - 1 + 12) % 12);\n      var daysInMonth = self.utils.getDaysInMonth(month),\n          days = window.document.createDocumentFragment(),\n          isMultiMonth = self.config.showMonths > 1,\n          prevMonthDayClass = isMultiMonth ? \"prevMonthDay hidden\" : \"prevMonthDay\",\n          nextMonthDayClass = isMultiMonth ? \"nextMonthDay hidden\" : \"nextMonthDay\";\n      var dayNumber = prevMonthDays + 1 - firstOfMonth,\n          dayIndex = 0;\n\n      for (; dayNumber <= prevMonthDays; dayNumber++, dayIndex++) {\n        days.appendChild(createDay(prevMonthDayClass, new Date(year, month - 1, dayNumber), dayNumber, dayIndex));\n      }\n\n      for (dayNumber = 1; dayNumber <= daysInMonth; dayNumber++, dayIndex++) {\n        days.appendChild(createDay(\"\", new Date(year, month, dayNumber), dayNumber, dayIndex));\n      }\n\n      for (var dayNum = daysInMonth + 1; dayNum <= 42 - firstOfMonth && (self.config.showMonths === 1 || dayIndex % 7 !== 0); dayNum++, dayIndex++) {\n        days.appendChild(createDay(nextMonthDayClass, new Date(year, month + 1, dayNum % daysInMonth), dayNum, dayIndex));\n      }\n\n      var dayContainer = createElement(\"div\", \"dayContainer\");\n      dayContainer.appendChild(days);\n      return dayContainer;\n    }\n\n    function buildDays() {\n      if (self.daysContainer === undefined) {\n        return;\n      }\n\n      clearNode(self.daysContainer);\n      if (self.weekNumbers) clearNode(self.weekNumbers);\n      var frag = document.createDocumentFragment();\n\n      for (var i = 0; i < self.config.showMonths; i++) {\n        var d = new Date(self.currentYear, self.currentMonth, 1);\n        d.setMonth(self.currentMonth + i);\n        frag.appendChild(buildMonthDays(d.getFullYear(), d.getMonth()));\n      }\n\n      self.daysContainer.appendChild(frag);\n      self.days = self.daysContainer.firstChild;\n\n      if (self.config.mode === \"range\" && self.selectedDates.length === 1) {\n        onMouseOver();\n      }\n    }\n\n    function buildMonth() {\n      var container = createElement(\"div\", \"flatpickr-month\");\n      var monthNavFragment = window.document.createDocumentFragment();\n      var monthElement = createElement(\"span\", \"cur-month\");\n      var yearInput = createNumberInput(\"cur-year\", {\n        tabindex: \"-1\"\n      });\n      var yearElement = yearInput.getElementsByTagName(\"input\")[0];\n      yearElement.setAttribute(\"aria-label\", self.l10n.yearAriaLabel);\n      if (self.config.minDate) yearElement.setAttribute(\"data-min\", self.config.minDate.getFullYear().toString());\n\n      if (self.config.maxDate) {\n        yearElement.setAttribute(\"data-max\", self.config.maxDate.getFullYear().toString());\n        yearElement.disabled = !!self.config.minDate && self.config.minDate.getFullYear() === self.config.maxDate.getFullYear();\n      }\n\n      var currentMonth = createElement(\"div\", \"flatpickr-current-month\");\n      currentMonth.appendChild(monthElement);\n      currentMonth.appendChild(yearInput);\n      monthNavFragment.appendChild(currentMonth);\n      container.appendChild(monthNavFragment);\n      return {\n        container: container,\n        yearElement: yearElement,\n        monthElement: monthElement\n      };\n    }\n\n    function buildMonths() {\n      clearNode(self.monthNav);\n      self.monthNav.appendChild(self.prevMonthNav);\n\n      for (var m = self.config.showMonths; m--;) {\n        var month = buildMonth();\n        self.yearElements.push(month.yearElement);\n        self.monthElements.push(month.monthElement);\n        self.monthNav.appendChild(month.container);\n      }\n\n      self.monthNav.appendChild(self.nextMonthNav);\n    }\n\n    function buildMonthNav() {\n      self.monthNav = createElement(\"div\", \"flatpickr-months\");\n      self.yearElements = [];\n      self.monthElements = [];\n      self.prevMonthNav = createElement(\"span\", \"flatpickr-prev-month\");\n      self.prevMonthNav.innerHTML = self.config.prevArrow;\n      self.nextMonthNav = createElement(\"span\", \"flatpickr-next-month\");\n      self.nextMonthNav.innerHTML = self.config.nextArrow;\n      buildMonths();\n      Object.defineProperty(self, \"_hidePrevMonthArrow\", {\n        get: function get() {\n          return self.__hidePrevMonthArrow;\n        },\n        set: function set(bool) {\n          if (self.__hidePrevMonthArrow !== bool) {\n            toggleClass(self.prevMonthNav, \"disabled\", bool);\n            self.__hidePrevMonthArrow = bool;\n          }\n        }\n      });\n      Object.defineProperty(self, \"_hideNextMonthArrow\", {\n        get: function get() {\n          return self.__hideNextMonthArrow;\n        },\n        set: function set(bool) {\n          if (self.__hideNextMonthArrow !== bool) {\n            toggleClass(self.nextMonthNav, \"disabled\", bool);\n            self.__hideNextMonthArrow = bool;\n          }\n        }\n      });\n      self.currentYearElement = self.yearElements[0];\n      updateNavigationCurrentMonth();\n      return self.monthNav;\n    }\n\n    function buildTime() {\n      self.calendarContainer.classList.add(\"hasTime\");\n      if (self.config.noCalendar) self.calendarContainer.classList.add(\"noCalendar\");\n      self.timeContainer = createElement(\"div\", \"flatpickr-time\");\n      self.timeContainer.tabIndex = -1;\n      var separator = createElement(\"span\", \"flatpickr-time-separator\", \":\");\n      var hourInput = createNumberInput(\"flatpickr-hour\");\n      self.hourElement = hourInput.getElementsByTagName(\"input\")[0];\n      var minuteInput = createNumberInput(\"flatpickr-minute\");\n      self.minuteElement = minuteInput.getElementsByTagName(\"input\")[0];\n      self.hourElement.tabIndex = self.minuteElement.tabIndex = -1;\n      self.hourElement.value = pad(self.latestSelectedDateObj ? self.latestSelectedDateObj.getHours() : self.config.time_24hr ? self.config.defaultHour : military2ampm(self.config.defaultHour));\n      self.minuteElement.value = pad(self.latestSelectedDateObj ? self.latestSelectedDateObj.getMinutes() : self.config.defaultMinute);\n      self.hourElement.setAttribute(\"data-step\", self.config.hourIncrement.toString());\n      self.minuteElement.setAttribute(\"data-step\", self.config.minuteIncrement.toString());\n      self.hourElement.setAttribute(\"data-min\", self.config.time_24hr ? \"0\" : \"1\");\n      self.hourElement.setAttribute(\"data-max\", self.config.time_24hr ? \"23\" : \"12\");\n      self.minuteElement.setAttribute(\"data-min\", \"0\");\n      self.minuteElement.setAttribute(\"data-max\", \"59\");\n      self.timeContainer.appendChild(hourInput);\n      self.timeContainer.appendChild(separator);\n      self.timeContainer.appendChild(minuteInput);\n      if (self.config.time_24hr) self.timeContainer.classList.add(\"time24hr\");\n\n      if (self.config.enableSeconds) {\n        self.timeContainer.classList.add(\"hasSeconds\");\n        var secondInput = createNumberInput(\"flatpickr-second\");\n        self.secondElement = secondInput.getElementsByTagName(\"input\")[0];\n        self.secondElement.value = pad(self.latestSelectedDateObj ? self.latestSelectedDateObj.getSeconds() : self.config.defaultSeconds);\n        self.secondElement.setAttribute(\"data-step\", self.minuteElement.getAttribute(\"data-step\"));\n        self.secondElement.setAttribute(\"data-min\", self.minuteElement.getAttribute(\"data-min\"));\n        self.secondElement.setAttribute(\"data-max\", self.minuteElement.getAttribute(\"data-max\"));\n        self.timeContainer.appendChild(createElement(\"span\", \"flatpickr-time-separator\", \":\"));\n        self.timeContainer.appendChild(secondInput);\n      }\n\n      if (!self.config.time_24hr) {\n        self.amPM = createElement(\"span\", \"flatpickr-am-pm\", self.l10n.amPM[int((self.latestSelectedDateObj ? self.hourElement.value : self.config.defaultHour) > 11)]);\n        self.amPM.title = self.l10n.toggleTitle;\n        self.amPM.tabIndex = -1;\n        self.timeContainer.appendChild(self.amPM);\n      }\n\n      return self.timeContainer;\n    }\n\n    function buildWeekdays() {\n      if (!self.weekdayContainer) self.weekdayContainer = createElement(\"div\", \"flatpickr-weekdays\");else clearNode(self.weekdayContainer);\n\n      for (var i = self.config.showMonths; i--;) {\n        var container = createElement(\"div\", \"flatpickr-weekdaycontainer\");\n        self.weekdayContainer.appendChild(container);\n      }\n\n      updateWeekdays();\n      return self.weekdayContainer;\n    }\n\n    function updateWeekdays() {\n      var firstDayOfWeek = self.l10n.firstDayOfWeek;\n      var weekdays = self.l10n.weekdays.shorthand.concat();\n\n      if (firstDayOfWeek > 0 && firstDayOfWeek < weekdays.length) {\n        weekdays = weekdays.splice(firstDayOfWeek, weekdays.length).concat(weekdays.splice(0, firstDayOfWeek));\n      }\n\n      for (var i = self.config.showMonths; i--;) {\n        self.weekdayContainer.children[i].innerHTML = \"\\n      <span class=flatpickr-weekday>\\n        \" + weekdays.join(\"</span><span class=flatpickr-weekday>\") + \"\\n      </span>\\n      \";\n      }\n    }\n\n    function buildWeeks() {\n      self.calendarContainer.classList.add(\"hasWeeks\");\n      var weekWrapper = createElement(\"div\", \"flatpickr-weekwrapper\");\n      weekWrapper.appendChild(createElement(\"span\", \"flatpickr-weekday\", self.l10n.weekAbbreviation));\n      var weekNumbers = createElement(\"div\", \"flatpickr-weeks\");\n      weekWrapper.appendChild(weekNumbers);\n      return {\n        weekWrapper: weekWrapper,\n        weekNumbers: weekNumbers\n      };\n    }\n\n    function changeMonth(value, is_offset) {\n      if (is_offset === void 0) {\n        is_offset = true;\n      }\n\n      var delta = is_offset ? value : value - self.currentMonth;\n      if (delta < 0 && self._hidePrevMonthArrow === true || delta > 0 && self._hideNextMonthArrow === true) return;\n      self.currentMonth += delta;\n\n      if (self.currentMonth < 0 || self.currentMonth > 11) {\n        self.currentYear += self.currentMonth > 11 ? 1 : -1;\n        self.currentMonth = (self.currentMonth + 12) % 12;\n        triggerEvent(\"onYearChange\");\n      }\n\n      buildDays();\n      triggerEvent(\"onMonthChange\");\n      updateNavigationCurrentMonth();\n    }\n\n    function clear(triggerChangeEvent) {\n      if (triggerChangeEvent === void 0) {\n        triggerChangeEvent = true;\n      }\n\n      self.input.value = \"\";\n      if (self.altInput !== undefined) self.altInput.value = \"\";\n      if (self.mobileInput !== undefined) self.mobileInput.value = \"\";\n      self.selectedDates = [];\n      self.latestSelectedDateObj = undefined;\n      self.showTimeInput = false;\n\n      if (self.config.enableTime === true) {\n        setDefaultHours();\n      }\n\n      self.redraw();\n      if (triggerChangeEvent) triggerEvent(\"onChange\");\n    }\n\n    function close() {\n      self.isOpen = false;\n\n      if (!self.isMobile) {\n        self.calendarContainer.classList.remove(\"open\");\n\n        self._input.classList.remove(\"active\");\n      }\n\n      triggerEvent(\"onClose\");\n    }\n\n    function destroy() {\n      if (self.config !== undefined) triggerEvent(\"onDestroy\");\n\n      for (var i = self._handlers.length; i--;) {\n        var h = self._handlers[i];\n        h.element.removeEventListener(h.event, h.handler, h.options);\n      }\n\n      self._handlers = [];\n\n      if (self.mobileInput) {\n        if (self.mobileInput.parentNode) self.mobileInput.parentNode.removeChild(self.mobileInput);\n        self.mobileInput = undefined;\n      } else if (self.calendarContainer && self.calendarContainer.parentNode) {\n        if (self.config.static && self.calendarContainer.parentNode) {\n          var wrapper = self.calendarContainer.parentNode;\n          wrapper.lastChild && wrapper.removeChild(wrapper.lastChild);\n\n          if (wrapper.parentNode) {\n            while (wrapper.firstChild) {\n              wrapper.parentNode.insertBefore(wrapper.firstChild, wrapper);\n            }\n\n            wrapper.parentNode.removeChild(wrapper);\n          }\n        } else self.calendarContainer.parentNode.removeChild(self.calendarContainer);\n      }\n\n      if (self.altInput) {\n        self.input.type = \"text\";\n        if (self.altInput.parentNode) self.altInput.parentNode.removeChild(self.altInput);\n        delete self.altInput;\n      }\n\n      if (self.input) {\n        self.input.type = self.input._type;\n        self.input.classList.remove(\"flatpickr-input\");\n        self.input.removeAttribute(\"readonly\");\n        self.input.value = \"\";\n      }\n\n      [\"_showTimeInput\", \"latestSelectedDateObj\", \"_hideNextMonthArrow\", \"_hidePrevMonthArrow\", \"__hideNextMonthArrow\", \"__hidePrevMonthArrow\", \"isMobile\", \"isOpen\", \"selectedDateElem\", \"minDateHasTime\", \"maxDateHasTime\", \"days\", \"daysContainer\", \"_input\", \"_positionElement\", \"innerContainer\", \"rContainer\", \"monthNav\", \"todayDateElem\", \"calendarContainer\", \"weekdayContainer\", \"prevMonthNav\", \"nextMonthNav\", \"currentMonthElement\", \"currentYearElement\", \"navigationCurrentMonth\", \"selectedDateElem\", \"config\"].forEach(function (k) {\n        try {\n          delete self[k];\n        } catch (_) {}\n      });\n    }\n\n    function isCalendarElem(elem) {\n      if (self.config.appendTo && self.config.appendTo.contains(elem)) return true;\n      return self.calendarContainer.contains(elem);\n    }\n\n    function documentClick(e) {\n      if (self.isOpen && !self.config.inline) {\n        var isCalendarElement = isCalendarElem(e.target);\n        var isInput = e.target === self.input || e.target === self.altInput || self.element.contains(e.target) || e.path && e.path.indexOf && (~e.path.indexOf(self.input) || ~e.path.indexOf(self.altInput));\n        var lostFocus = e.type === \"blur\" ? isInput && e.relatedTarget && !isCalendarElem(e.relatedTarget) : !isInput && !isCalendarElement;\n        var isIgnored = !self.config.ignoredFocusElements.some(function (elem) {\n          return elem.contains(e.target);\n        });\n\n        if (lostFocus && isIgnored) {\n          self.close();\n\n          if (self.config.mode === \"range\" && self.selectedDates.length === 1) {\n            self.clear(false);\n            self.redraw();\n          }\n        }\n      }\n    }\n\n    function changeYear(newYear) {\n      if (!newYear || self.config.minDate && newYear < self.config.minDate.getFullYear() || self.config.maxDate && newYear > self.config.maxDate.getFullYear()) return;\n      var newYearNum = newYear,\n          isNewYear = self.currentYear !== newYearNum;\n      self.currentYear = newYearNum || self.currentYear;\n\n      if (self.config.maxDate && self.currentYear === self.config.maxDate.getFullYear()) {\n        self.currentMonth = Math.min(self.config.maxDate.getMonth(), self.currentMonth);\n      } else if (self.config.minDate && self.currentYear === self.config.minDate.getFullYear()) {\n        self.currentMonth = Math.max(self.config.minDate.getMonth(), self.currentMonth);\n      }\n\n      if (isNewYear) {\n        self.redraw();\n        triggerEvent(\"onYearChange\");\n      }\n    }\n\n    function isEnabled(date, timeless) {\n      if (timeless === void 0) {\n        timeless = true;\n      }\n\n      var dateToCheck = self.parseDate(date, undefined, timeless);\n      if (self.config.minDate && dateToCheck && compareDates(dateToCheck, self.config.minDate, timeless !== undefined ? timeless : !self.minDateHasTime) < 0 || self.config.maxDate && dateToCheck && compareDates(dateToCheck, self.config.maxDate, timeless !== undefined ? timeless : !self.maxDateHasTime) > 0) return false;\n      if (self.config.enable.length === 0 && self.config.disable.length === 0) return true;\n      if (dateToCheck === undefined) return false;\n      var bool = self.config.enable.length > 0,\n          array = bool ? self.config.enable : self.config.disable;\n\n      for (var i = 0, d; i < array.length; i++) {\n        d = array[i];\n        if (typeof d === \"function\" && d(dateToCheck)) return bool;else if (d instanceof Date && dateToCheck !== undefined && d.getTime() === dateToCheck.getTime()) return bool;else if (typeof d === \"string\" && dateToCheck !== undefined) {\n          var parsed = self.parseDate(d, undefined, true);\n          return parsed && parsed.getTime() === dateToCheck.getTime() ? bool : !bool;\n        } else if ((typeof d === 'undefined' ? 'undefined' : _typeof(d)) === \"object\" && dateToCheck !== undefined && d.from && d.to && dateToCheck.getTime() >= d.from.getTime() && dateToCheck.getTime() <= d.to.getTime()) return bool;\n      }\n\n      return !bool;\n    }\n\n    function isInView(elem) {\n      if (self.daysContainer !== undefined) return elem.className.indexOf(\"hidden\") === -1 && self.daysContainer.contains(elem);\n      return false;\n    }\n\n    function onKeyDown(e) {\n      var isInput = e.target === self._input;\n      var allowInput = self.config.allowInput;\n      var allowKeydown = self.isOpen && (!allowInput || !isInput);\n      var allowInlineKeydown = self.config.inline && isInput && !allowInput;\n\n      if (e.keyCode === 13 && isInput) {\n        if (allowInput) {\n          self.setDate(self._input.value, true, e.target === self.altInput ? self.config.altFormat : self.config.dateFormat);\n          return e.target.blur();\n        } else self.open();\n      } else if (isCalendarElem(e.target) || allowKeydown || allowInlineKeydown) {\n        var isTimeObj = !!self.timeContainer && self.timeContainer.contains(e.target);\n\n        switch (e.keyCode) {\n          case 13:\n            if (isTimeObj) updateTime();else selectDate(e);\n            break;\n\n          case 27:\n            e.preventDefault();\n            focusAndClose();\n            break;\n\n          case 8:\n          case 46:\n            if (isInput && !self.config.allowInput) {\n              e.preventDefault();\n              self.clear();\n            }\n\n            break;\n\n          case 37:\n          case 39:\n            if (!isTimeObj) {\n              e.preventDefault();\n\n              if (self.daysContainer !== undefined && (allowInput === false || isInView(document.activeElement))) {\n                var _delta = e.keyCode === 39 ? 1 : -1;\n\n                if (!e.ctrlKey) focusOnDay(undefined, _delta);else {\n                  changeMonth(_delta);\n                  focusOnDay(getFirstAvailableDay(1), 0);\n                }\n              }\n            } else if (self.hourElement) self.hourElement.focus();\n\n            break;\n\n          case 38:\n          case 40:\n            e.preventDefault();\n            var delta = e.keyCode === 40 ? 1 : -1;\n\n            if (self.daysContainer && e.target.$i !== undefined) {\n              if (e.ctrlKey) {\n                changeYear(self.currentYear - delta);\n                focusOnDay(getFirstAvailableDay(1), 0);\n              } else if (!isTimeObj) focusOnDay(undefined, delta * 7);\n            } else if (self.config.enableTime) {\n              if (!isTimeObj && self.hourElement) self.hourElement.focus();\n              updateTime(e);\n\n              self._debouncedChange();\n            }\n\n            break;\n\n          case 9:\n            if (!isTimeObj) {\n              self.element.focus();\n              break;\n            }\n\n            var elems = [self.hourElement, self.minuteElement, self.secondElement, self.amPM].filter(function (x) {\n              return x;\n            });\n            var i = elems.indexOf(e.target);\n\n            if (i !== -1) {\n              var target = elems[i + (e.shiftKey ? -1 : 1)];\n\n              if (target !== undefined) {\n                e.preventDefault();\n                target.focus();\n              } else {\n                self.element.focus();\n              }\n            }\n\n            break;\n\n          default:\n            break;\n        }\n      }\n\n      if (self.amPM !== undefined && e.target === self.amPM) {\n        switch (e.key) {\n          case self.l10n.amPM[0].charAt(0):\n          case self.l10n.amPM[0].charAt(0).toLowerCase():\n            self.amPM.textContent = self.l10n.amPM[0];\n            setHoursFromInputs();\n            updateValue();\n            break;\n\n          case self.l10n.amPM[1].charAt(0):\n          case self.l10n.amPM[1].charAt(0).toLowerCase():\n            self.amPM.textContent = self.l10n.amPM[1];\n            setHoursFromInputs();\n            updateValue();\n            break;\n        }\n      }\n\n      triggerEvent(\"onKeyDown\", e);\n    }\n\n    function onMouseOver(elem) {\n      if (self.selectedDates.length !== 1 || elem && (!elem.classList.contains(\"flatpickr-day\") || elem.classList.contains(\"disabled\"))) return;\n      var hoverDate = elem ? elem.dateObj.getTime() : self.days.firstElementChild.dateObj.getTime(),\n          initialDate = self.parseDate(self.selectedDates[0], undefined, true).getTime(),\n          rangeStartDate = Math.min(hoverDate, self.selectedDates[0].getTime()),\n          rangeEndDate = Math.max(hoverDate, self.selectedDates[0].getTime()),\n          lastDate = self.daysContainer.lastChild.lastChild.dateObj.getTime();\n      var containsDisabled = false;\n      var minRange = 0,\n          maxRange = 0;\n\n      for (var t = rangeStartDate; t < lastDate; t += duration.DAY) {\n        if (!isEnabled(new Date(t), true)) {\n          containsDisabled = containsDisabled || t > rangeStartDate && t < rangeEndDate;\n          if (t < initialDate && (!minRange || t > minRange)) minRange = t;else if (t > initialDate && (!maxRange || t < maxRange)) maxRange = t;\n        }\n      }\n\n      for (var m = 0; m < self.config.showMonths; m++) {\n        var month = self.daysContainer.children[m];\n        var prevMonth = self.daysContainer.children[m - 1];\n\n        var _loop = function _loop(i, l) {\n          var dayElem = month.children[i],\n              date = dayElem.dateObj;\n          var timestamp = date.getTime();\n          var outOfRange = minRange > 0 && timestamp < minRange || maxRange > 0 && timestamp > maxRange;\n\n          if (outOfRange) {\n            dayElem.classList.add(\"notAllowed\");\n            [\"inRange\", \"startRange\", \"endRange\"].forEach(function (c) {\n              dayElem.classList.remove(c);\n            });\n            return \"continue\";\n          } else if (containsDisabled && !outOfRange) return \"continue\";\n\n          [\"startRange\", \"inRange\", \"endRange\", \"notAllowed\"].forEach(function (c) {\n            dayElem.classList.remove(c);\n          });\n\n          if (elem !== undefined) {\n            elem.classList.add(hoverDate < self.selectedDates[0].getTime() ? \"startRange\" : \"endRange\");\n\n            if (month.contains(elem) || !(m > 0 && prevMonth && prevMonth.lastChild.dateObj.getTime() >= timestamp)) {\n              if (initialDate < hoverDate && timestamp === initialDate) dayElem.classList.add(\"startRange\");else if (initialDate > hoverDate && timestamp === initialDate) dayElem.classList.add(\"endRange\");\n              if (timestamp >= minRange && (maxRange === 0 || timestamp <= maxRange) && isBetween(timestamp, initialDate, hoverDate)) dayElem.classList.add(\"inRange\");\n            }\n          }\n        };\n\n        for (var i = 0, l = month.children.length; i < l; i++) {\n          var _ret = _loop(i, l);\n\n          if (_ret === \"continue\") continue;\n        }\n      }\n    }\n\n    function onResize() {\n      if (self.isOpen && !self.config.static && !self.config.inline) positionCalendar();\n    }\n\n    function open(e, positionElement) {\n      if (positionElement === void 0) {\n        positionElement = self._positionElement;\n      }\n\n      if (self.isMobile === true) {\n        if (e) {\n          e.preventDefault();\n          e.target && e.target.blur();\n        }\n\n        if (self.mobileInput !== undefined) {\n          self.mobileInput.focus();\n          self.mobileInput.click();\n        }\n\n        triggerEvent(\"onOpen\");\n        return;\n      }\n\n      if (self._input.disabled || self.config.inline) return;\n      var wasOpen = self.isOpen;\n      self.isOpen = true;\n\n      if (!wasOpen) {\n        self.calendarContainer.classList.add(\"open\");\n\n        self._input.classList.add(\"active\");\n\n        triggerEvent(\"onOpen\");\n        positionCalendar(positionElement);\n      }\n\n      if (self.config.enableTime === true && self.config.noCalendar === true) {\n        if (self.selectedDates.length === 0) {\n          self.setDate(self.config.minDate !== undefined ? new Date(self.config.minDate.getTime()) : new Date(), false);\n          setDefaultHours();\n          updateValue();\n        }\n\n        if (self.config.allowInput === false && (e === undefined || !self.timeContainer.contains(e.relatedTarget))) {\n          setTimeout(function () {\n            return self.hourElement.select();\n          }, 50);\n        }\n      }\n    }\n\n    function minMaxDateSetter(type) {\n      return function (date) {\n        var dateObj = self.config[\"_\" + type + \"Date\"] = self.parseDate(date, self.config.dateFormat);\n        var inverseDateObj = self.config[\"_\" + (type === \"min\" ? \"max\" : \"min\") + \"Date\"];\n\n        if (dateObj !== undefined) {\n          self[type === \"min\" ? \"minDateHasTime\" : \"maxDateHasTime\"] = dateObj.getHours() > 0 || dateObj.getMinutes() > 0 || dateObj.getSeconds() > 0;\n        }\n\n        if (self.selectedDates) {\n          self.selectedDates = self.selectedDates.filter(function (d) {\n            return isEnabled(d);\n          });\n          if (!self.selectedDates.length && type === \"min\") setHoursFromDate(dateObj);\n          updateValue();\n        }\n\n        if (self.daysContainer) {\n          redraw();\n          if (dateObj !== undefined) self.currentYearElement[type] = dateObj.getFullYear().toString();else self.currentYearElement.removeAttribute(type);\n          self.currentYearElement.disabled = !!inverseDateObj && dateObj !== undefined && inverseDateObj.getFullYear() === dateObj.getFullYear();\n        }\n      };\n    }\n\n    function parseConfig() {\n      var boolOpts = [\"wrap\", \"weekNumbers\", \"allowInput\", \"clickOpens\", \"time_24hr\", \"enableTime\", \"noCalendar\", \"altInput\", \"shorthandCurrentMonth\", \"inline\", \"static\", \"enableSeconds\", \"disableMobile\"];\n      var userConfig = Object.assign({}, instanceConfig, JSON.parse(JSON.stringify(element.dataset || {})));\n      var formats$$1 = {};\n      self.config.parseDate = userConfig.parseDate;\n      self.config.formatDate = userConfig.formatDate;\n      Object.defineProperty(self.config, \"enable\", {\n        get: function get() {\n          return self.config._enable;\n        },\n        set: function set(dates) {\n          self.config._enable = parseDateRules(dates);\n        }\n      });\n      Object.defineProperty(self.config, \"disable\", {\n        get: function get() {\n          return self.config._disable;\n        },\n        set: function set(dates) {\n          self.config._disable = parseDateRules(dates);\n        }\n      });\n      var timeMode = userConfig.mode === \"time\";\n\n      if (!userConfig.dateFormat && (userConfig.enableTime || timeMode)) {\n        formats$$1.dateFormat = userConfig.noCalendar || timeMode ? \"H:i\" + (userConfig.enableSeconds ? \":S\" : \"\") : flatpickr.defaultConfig.dateFormat + \" H:i\" + (userConfig.enableSeconds ? \":S\" : \"\");\n      }\n\n      if (userConfig.altInput && (userConfig.enableTime || timeMode) && !userConfig.altFormat) {\n        formats$$1.altFormat = userConfig.noCalendar || timeMode ? \"h:i\" + (userConfig.enableSeconds ? \":S K\" : \" K\") : flatpickr.defaultConfig.altFormat + (\" h:i\" + (userConfig.enableSeconds ? \":S\" : \"\") + \" K\");\n      }\n\n      Object.defineProperty(self.config, \"minDate\", {\n        get: function get() {\n          return self.config._minDate;\n        },\n        set: minMaxDateSetter(\"min\")\n      });\n      Object.defineProperty(self.config, \"maxDate\", {\n        get: function get() {\n          return self.config._maxDate;\n        },\n        set: minMaxDateSetter(\"max\")\n      });\n\n      var minMaxTimeSetter = function minMaxTimeSetter(type) {\n        return function (val) {\n          self.config[type === \"min\" ? \"_minTime\" : \"_maxTime\"] = self.parseDate(val, \"H:i\");\n        };\n      };\n\n      Object.defineProperty(self.config, \"minTime\", {\n        get: function get() {\n          return self.config._minTime;\n        },\n        set: minMaxTimeSetter(\"min\")\n      });\n      Object.defineProperty(self.config, \"maxTime\", {\n        get: function get() {\n          return self.config._maxTime;\n        },\n        set: minMaxTimeSetter(\"max\")\n      });\n\n      if (userConfig.mode === \"time\") {\n        self.config.noCalendar = true;\n        self.config.enableTime = true;\n      }\n\n      Object.assign(self.config, formats$$1, userConfig);\n\n      for (var i = 0; i < boolOpts.length; i++) {\n        self.config[boolOpts[i]] = self.config[boolOpts[i]] === true || self.config[boolOpts[i]] === \"true\";\n      }\n\n      HOOKS.filter(function (hook) {\n        return self.config[hook] !== undefined;\n      }).forEach(function (hook) {\n        self.config[hook] = arrayify(self.config[hook] || []).map(bindToInstance);\n      });\n      self.isMobile = !self.config.disableMobile && !self.config.inline && self.config.mode === \"single\" && !self.config.disable.length && !self.config.enable.length && !self.config.weekNumbers && /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n\n      for (var _i = 0; _i < self.config.plugins.length; _i++) {\n        var pluginConf = self.config.plugins[_i](self) || {};\n\n        for (var key in pluginConf) {\n          if (HOOKS.indexOf(key) > -1) {\n            self.config[key] = arrayify(pluginConf[key]).map(bindToInstance).concat(self.config[key]);\n          } else if (typeof userConfig[key] === \"undefined\") self.config[key] = pluginConf[key];\n        }\n      }\n\n      triggerEvent(\"onParseConfig\");\n    }\n\n    function setupLocale() {\n      if (_typeof(self.config.locale) !== \"object\" && typeof flatpickr.l10ns[self.config.locale] === \"undefined\") self.config.errorHandler(new Error(\"flatpickr: invalid locale \" + self.config.locale));\n      self.l10n = Object.assign({}, flatpickr.l10ns.default, _typeof(self.config.locale) === \"object\" ? self.config.locale : self.config.locale !== \"default\" ? flatpickr.l10ns[self.config.locale] : undefined);\n      tokenRegex.K = \"(\" + self.l10n.amPM[0] + \"|\" + self.l10n.amPM[1] + \"|\" + self.l10n.amPM[0].toLowerCase() + \"|\" + self.l10n.amPM[1].toLowerCase() + \")\";\n      self.formatDate = createDateFormatter(self);\n      self.parseDate = createDateParser({\n        config: self.config,\n        l10n: self.l10n\n      });\n    }\n\n    function positionCalendar(customPositionElement) {\n      if (self.calendarContainer === undefined) return;\n      triggerEvent(\"onPreCalendarPosition\");\n      var positionElement = customPositionElement || self._positionElement;\n      var calendarHeight = Array.prototype.reduce.call(self.calendarContainer.children, function (acc, child) {\n        return acc + child.offsetHeight;\n      }, 0),\n          calendarWidth = self.calendarContainer.offsetWidth,\n          configPos = self.config.position.split(\" \"),\n          configPosVertical = configPos[0],\n          configPosHorizontal = configPos.length > 1 ? configPos[1] : null,\n          inputBounds = positionElement.getBoundingClientRect(),\n          distanceFromBottom = window.innerHeight - inputBounds.bottom,\n          showOnTop = configPosVertical === \"above\" || configPosVertical !== \"below\" && distanceFromBottom < calendarHeight && inputBounds.top > calendarHeight;\n      var top = window.pageYOffset + inputBounds.top + (!showOnTop ? positionElement.offsetHeight + 2 : -calendarHeight - 2);\n      toggleClass(self.calendarContainer, \"arrowTop\", !showOnTop);\n      toggleClass(self.calendarContainer, \"arrowBottom\", showOnTop);\n      if (self.config.inline) return;\n      var left = window.pageXOffset + inputBounds.left - (configPosHorizontal != null && configPosHorizontal === \"center\" ? (calendarWidth - inputBounds.width) / 2 : 0);\n      var right = window.document.body.offsetWidth - inputBounds.right;\n      var rightMost = left + calendarWidth > window.document.body.offsetWidth;\n      toggleClass(self.calendarContainer, \"rightMost\", rightMost);\n      if (self.config.static) return;\n      self.calendarContainer.style.top = top + \"px\";\n\n      if (!rightMost) {\n        self.calendarContainer.style.left = left + \"px\";\n        self.calendarContainer.style.right = \"auto\";\n      } else {\n        self.calendarContainer.style.left = \"auto\";\n        self.calendarContainer.style.right = right + \"px\";\n      }\n    }\n\n    function redraw() {\n      if (self.config.noCalendar || self.isMobile) return;\n      updateNavigationCurrentMonth();\n      buildDays();\n    }\n\n    function focusAndClose() {\n      self._input.focus();\n\n      if (window.navigator.userAgent.indexOf(\"MSIE\") !== -1 || navigator.msMaxTouchPoints !== undefined) {\n        setTimeout(self.close, 0);\n      } else {\n        self.close();\n      }\n    }\n\n    function selectDate(e) {\n      e.preventDefault();\n      e.stopPropagation();\n\n      var isSelectable = function isSelectable(day) {\n        return day.classList && day.classList.contains(\"flatpickr-day\") && !day.classList.contains(\"disabled\") && !day.classList.contains(\"notAllowed\");\n      };\n\n      var t = findParent(e.target, isSelectable);\n      if (t === undefined) return;\n      var target = t;\n      var selectedDate = self.latestSelectedDateObj = new Date(target.dateObj.getTime());\n      var shouldChangeMonth = (selectedDate.getMonth() < self.currentMonth || selectedDate.getMonth() > self.currentMonth + self.config.showMonths - 1) && self.config.mode !== \"range\";\n      self.selectedDateElem = target;\n      if (self.config.mode === \"single\") self.selectedDates = [selectedDate];else if (self.config.mode === \"multiple\") {\n        var selectedIndex = isDateSelected(selectedDate);\n        if (selectedIndex) self.selectedDates.splice(parseInt(selectedIndex), 1);else self.selectedDates.push(selectedDate);\n      } else if (self.config.mode === \"range\") {\n        if (self.selectedDates.length === 2) self.clear(false);\n        self.selectedDates.push(selectedDate);\n        if (compareDates(selectedDate, self.selectedDates[0], true) !== 0) self.selectedDates.sort(function (a, b) {\n          return a.getTime() - b.getTime();\n        });\n      }\n      setHoursFromInputs();\n\n      if (shouldChangeMonth) {\n        var isNewYear = self.currentYear !== selectedDate.getFullYear();\n        self.currentYear = selectedDate.getFullYear();\n        self.currentMonth = selectedDate.getMonth();\n        if (isNewYear) triggerEvent(\"onYearChange\");\n        triggerEvent(\"onMonthChange\");\n      }\n\n      updateNavigationCurrentMonth();\n      buildDays();\n      updateValue();\n      if (self.config.enableTime) setTimeout(function () {\n        return self.showTimeInput = true;\n      }, 50);\n      if (!shouldChangeMonth && self.config.mode !== \"range\" && self.config.showMonths === 1) focusOnDayElem(target);else self.selectedDateElem && self.selectedDateElem.focus();\n      if (self.hourElement !== undefined) setTimeout(function () {\n        return self.hourElement !== undefined && self.hourElement.select();\n      }, 451);\n\n      if (self.config.closeOnSelect) {\n        var single = self.config.mode === \"single\" && !self.config.enableTime;\n        var range = self.config.mode === \"range\" && self.selectedDates.length === 2 && !self.config.enableTime;\n\n        if (single || range) {\n          focusAndClose();\n        }\n      }\n\n      triggerChange();\n    }\n\n    var CALLBACKS = {\n      locale: [setupLocale, updateWeekdays],\n      showMonths: [buildMonths, setCalendarWidth, buildWeekdays]\n    };\n\n    function set(option, value) {\n      if (option !== null && (typeof option === 'undefined' ? 'undefined' : _typeof(option)) === \"object\") Object.assign(self.config, option);else {\n        self.config[option] = value;\n        if (CALLBACKS[option] !== undefined) CALLBACKS[option].forEach(function (x) {\n          return x();\n        });else if (HOOKS.indexOf(option) > -1) self.config[option] = arrayify(value);\n      }\n      self.redraw();\n      jumpToDate();\n      updateValue(false);\n    }\n\n    function setSelectedDate(inputDate, format) {\n      var dates = [];\n      if (inputDate instanceof Array) dates = inputDate.map(function (d) {\n        return self.parseDate(d, format);\n      });else if (inputDate instanceof Date || typeof inputDate === \"number\") dates = [self.parseDate(inputDate, format)];else if (typeof inputDate === \"string\") {\n        switch (self.config.mode) {\n          case \"single\":\n          case \"time\":\n            dates = [self.parseDate(inputDate, format)];\n            break;\n\n          case \"multiple\":\n            dates = inputDate.split(self.config.conjunction).map(function (date) {\n              return self.parseDate(date, format);\n            });\n            break;\n\n          case \"range\":\n            dates = inputDate.split(self.l10n.rangeSeparator).map(function (date) {\n              return self.parseDate(date, format);\n            });\n            break;\n\n          default:\n            break;\n        }\n      } else self.config.errorHandler(new Error(\"Invalid date supplied: \" + JSON.stringify(inputDate)));\n      self.selectedDates = dates.filter(function (d) {\n        return d instanceof Date && isEnabled(d, false);\n      });\n      if (self.config.mode === \"range\") self.selectedDates.sort(function (a, b) {\n        return a.getTime() - b.getTime();\n      });\n    }\n\n    function setDate(date, triggerChange, format) {\n      if (triggerChange === void 0) {\n        triggerChange = false;\n      }\n\n      if (format === void 0) {\n        format = self.config.dateFormat;\n      }\n\n      if (date !== 0 && !date || date instanceof Array && date.length === 0) return self.clear(triggerChange);\n      setSelectedDate(date, format);\n      self.showTimeInput = self.selectedDates.length > 0;\n      self.latestSelectedDateObj = self.selectedDates[0];\n      self.redraw();\n      jumpToDate();\n      setHoursFromDate();\n      updateValue(triggerChange);\n      if (triggerChange) triggerEvent(\"onChange\");\n    }\n\n    function parseDateRules(arr) {\n      return arr.slice().map(function (rule) {\n        if (typeof rule === \"string\" || typeof rule === \"number\" || rule instanceof Date) {\n          return self.parseDate(rule, undefined, true);\n        } else if (rule && (typeof rule === 'undefined' ? 'undefined' : _typeof(rule)) === \"object\" && rule.from && rule.to) return {\n          from: self.parseDate(rule.from, undefined),\n          to: self.parseDate(rule.to, undefined)\n        };\n\n        return rule;\n      }).filter(function (x) {\n        return x;\n      });\n    }\n\n    function setupDates() {\n      self.selectedDates = [];\n      self.now = self.parseDate(self.config.now) || new Date();\n      var preloadedDate = self.config.defaultDate || ((self.input.nodeName === \"INPUT\" || self.input.nodeName === \"TEXTAREA\") && self.input.placeholder && self.input.value === self.input.placeholder ? null : self.input.value);\n      if (preloadedDate) setSelectedDate(preloadedDate, self.config.dateFormat);\n      var initialDate = self.selectedDates.length > 0 ? self.selectedDates[0] : self.config.minDate && self.config.minDate.getTime() > self.now.getTime() ? self.config.minDate : self.config.maxDate && self.config.maxDate.getTime() < self.now.getTime() ? self.config.maxDate : self.now;\n      self.currentYear = initialDate.getFullYear();\n      self.currentMonth = initialDate.getMonth();\n      if (self.selectedDates.length > 0) self.latestSelectedDateObj = self.selectedDates[0];\n      if (self.config.minTime !== undefined) self.config.minTime = self.parseDate(self.config.minTime, \"H:i\");\n      if (self.config.maxTime !== undefined) self.config.maxTime = self.parseDate(self.config.maxTime, \"H:i\");\n      self.minDateHasTime = !!self.config.minDate && (self.config.minDate.getHours() > 0 || self.config.minDate.getMinutes() > 0 || self.config.minDate.getSeconds() > 0);\n      self.maxDateHasTime = !!self.config.maxDate && (self.config.maxDate.getHours() > 0 || self.config.maxDate.getMinutes() > 0 || self.config.maxDate.getSeconds() > 0);\n      Object.defineProperty(self, \"showTimeInput\", {\n        get: function get() {\n          return self._showTimeInput;\n        },\n        set: function set(bool) {\n          self._showTimeInput = bool;\n          if (self.calendarContainer) toggleClass(self.calendarContainer, \"showTimeInput\", bool);\n          self.isOpen && positionCalendar();\n        }\n      });\n    }\n\n    function setupInputs() {\n      self.input = self.config.wrap ? element.querySelector(\"[data-input]\") : element;\n\n      if (!self.input) {\n        self.config.errorHandler(new Error(\"Invalid input element specified\"));\n        return;\n      }\n\n      self.input._type = self.input.type;\n      self.input.type = \"text\";\n      self.input.classList.add(\"flatpickr-input\");\n      self._input = self.input;\n\n      if (self.config.altInput) {\n        self.altInput = createElement(self.input.nodeName, self.input.className + \" \" + self.config.altInputClass);\n        self._input = self.altInput;\n        self.altInput.placeholder = self.input.placeholder;\n        self.altInput.disabled = self.input.disabled;\n        self.altInput.required = self.input.required;\n        self.altInput.tabIndex = self.input.tabIndex;\n        self.altInput.type = \"text\";\n        self.input.setAttribute(\"type\", \"hidden\");\n        if (!self.config.static && self.input.parentNode) self.input.parentNode.insertBefore(self.altInput, self.input.nextSibling);\n      }\n\n      if (!self.config.allowInput) self._input.setAttribute(\"readonly\", \"readonly\");\n      self._positionElement = self.config.positionElement || self._input;\n    }\n\n    function setupMobile() {\n      var inputType = self.config.enableTime ? self.config.noCalendar ? \"time\" : \"datetime-local\" : \"date\";\n      self.mobileInput = createElement(\"input\", self.input.className + \" flatpickr-mobile\");\n      self.mobileInput.step = self.input.getAttribute(\"step\") || \"any\";\n      self.mobileInput.tabIndex = 1;\n      self.mobileInput.type = inputType;\n      self.mobileInput.disabled = self.input.disabled;\n      self.mobileInput.required = self.input.required;\n      self.mobileInput.placeholder = self.input.placeholder;\n      self.mobileFormatStr = inputType === \"datetime-local\" ? \"Y-m-d\\\\TH:i:S\" : inputType === \"date\" ? \"Y-m-d\" : \"H:i:S\";\n\n      if (self.selectedDates.length > 0) {\n        self.mobileInput.defaultValue = self.mobileInput.value = self.formatDate(self.selectedDates[0], self.mobileFormatStr);\n      }\n\n      if (self.config.minDate) self.mobileInput.min = self.formatDate(self.config.minDate, \"Y-m-d\");\n      if (self.config.maxDate) self.mobileInput.max = self.formatDate(self.config.maxDate, \"Y-m-d\");\n      self.input.type = \"hidden\";\n      if (self.altInput !== undefined) self.altInput.type = \"hidden\";\n\n      try {\n        if (self.input.parentNode) self.input.parentNode.insertBefore(self.mobileInput, self.input.nextSibling);\n      } catch (_a) {}\n\n      bind(self.mobileInput, \"change\", function (e) {\n        self.setDate(e.target.value, false, self.mobileFormatStr);\n        triggerEvent(\"onChange\");\n        triggerEvent(\"onClose\");\n      });\n    }\n\n    function toggle(e) {\n      if (self.isOpen === true) return self.close();\n      self.open(e);\n    }\n\n    function triggerEvent(event, data) {\n      if (self.config === undefined) return;\n      var hooks = self.config[event];\n\n      if (hooks !== undefined && hooks.length > 0) {\n        for (var i = 0; hooks[i] && i < hooks.length; i++) {\n          hooks[i](self.selectedDates, self.input.value, self, data);\n        }\n      }\n\n      if (event === \"onChange\") {\n        self.input.dispatchEvent(createEvent(\"change\"));\n        self.input.dispatchEvent(createEvent(\"input\"));\n      }\n    }\n\n    function createEvent(name) {\n      var e = document.createEvent(\"Event\");\n      e.initEvent(name, true, true);\n      return e;\n    }\n\n    function isDateSelected(date) {\n      for (var i = 0; i < self.selectedDates.length; i++) {\n        if (compareDates(self.selectedDates[i], date) === 0) return \"\" + i;\n      }\n\n      return false;\n    }\n\n    function isDateInRange(date) {\n      if (self.config.mode !== \"range\" || self.selectedDates.length < 2) return false;\n      return compareDates(date, self.selectedDates[0]) >= 0 && compareDates(date, self.selectedDates[1]) <= 0;\n    }\n\n    function updateNavigationCurrentMonth() {\n      if (self.config.noCalendar || self.isMobile || !self.monthNav) return;\n      self.yearElements.forEach(function (yearElement, i) {\n        var d = new Date(self.currentYear, self.currentMonth, 1);\n        d.setMonth(self.currentMonth + i);\n        self.monthElements[i].textContent = monthToStr(d.getMonth(), self.config.shorthandCurrentMonth, self.l10n) + \" \";\n        yearElement.value = d.getFullYear().toString();\n      });\n      self._hidePrevMonthArrow = self.config.minDate !== undefined && (self.currentYear === self.config.minDate.getFullYear() ? self.currentMonth <= self.config.minDate.getMonth() : self.currentYear < self.config.minDate.getFullYear());\n      self._hideNextMonthArrow = self.config.maxDate !== undefined && (self.currentYear === self.config.maxDate.getFullYear() ? self.currentMonth + 1 > self.config.maxDate.getMonth() : self.currentYear > self.config.maxDate.getFullYear());\n    }\n\n    function getDateStr(format) {\n      return self.selectedDates.map(function (dObj) {\n        return self.formatDate(dObj, format);\n      }).filter(function (d, i, arr) {\n        return self.config.mode !== \"range\" || self.config.enableTime || arr.indexOf(d) === i;\n      }).join(self.config.mode !== \"range\" ? self.config.conjunction : self.l10n.rangeSeparator);\n    }\n\n    function updateValue(triggerChange) {\n      if (triggerChange === void 0) {\n        triggerChange = true;\n      }\n\n      if (self.selectedDates.length === 0) return self.clear(triggerChange);\n\n      if (self.mobileInput !== undefined && self.mobileFormatStr) {\n        self.mobileInput.value = self.latestSelectedDateObj !== undefined ? self.formatDate(self.latestSelectedDateObj, self.mobileFormatStr) : \"\";\n      }\n\n      self.input.value = getDateStr(self.config.dateFormat);\n\n      if (self.altInput !== undefined) {\n        self.altInput.value = getDateStr(self.config.altFormat);\n      }\n\n      if (triggerChange !== false) triggerEvent(\"onValueUpdate\");\n    }\n\n    function onMonthNavClick(e) {\n      e.preventDefault();\n      var isPrevMonth = self.prevMonthNav.contains(e.target);\n      var isNextMonth = self.nextMonthNav.contains(e.target);\n\n      if (isPrevMonth || isNextMonth) {\n        changeMonth(isPrevMonth ? -1 : 1);\n      } else if (self.yearElements.indexOf(e.target) >= 0) {\n        e.target.select();\n      } else if (e.target.classList.contains(\"arrowUp\")) {\n        self.changeYear(self.currentYear + 1);\n      } else if (e.target.classList.contains(\"arrowDown\")) {\n        self.changeYear(self.currentYear - 1);\n      }\n    }\n\n    function timeWrapper(e) {\n      e.preventDefault();\n      var isKeyDown = e.type === \"keydown\",\n          input = e.target;\n\n      if (self.amPM !== undefined && e.target === self.amPM) {\n        self.amPM.textContent = self.l10n.amPM[int(self.amPM.textContent === self.l10n.amPM[0])];\n      }\n\n      var min = parseFloat(input.getAttribute(\"data-min\")),\n          max = parseFloat(input.getAttribute(\"data-max\")),\n          step = parseFloat(input.getAttribute(\"data-step\")),\n          curValue = parseInt(input.value, 10),\n          delta = e.delta || (isKeyDown ? e.which === 38 ? 1 : -1 : 0);\n      var newValue = curValue + step * delta;\n\n      if (typeof input.value !== \"undefined\" && input.value.length === 2) {\n        var isHourElem = input === self.hourElement,\n            isMinuteElem = input === self.minuteElement;\n\n        if (newValue < min) {\n          newValue = max + newValue + int(!isHourElem) + (int(isHourElem) && int(!self.amPM));\n          if (isMinuteElem) incrementNumInput(undefined, -1, self.hourElement);\n        } else if (newValue > max) {\n          newValue = input === self.hourElement ? newValue - max - int(!self.amPM) : min;\n          if (isMinuteElem) incrementNumInput(undefined, 1, self.hourElement);\n        }\n\n        if (self.amPM && isHourElem && (step === 1 ? newValue + curValue === 23 : Math.abs(newValue - curValue) > step)) {\n          self.amPM.textContent = self.l10n.amPM[int(self.amPM.textContent === self.l10n.amPM[0])];\n        }\n\n        input.value = pad(newValue);\n      }\n    }\n\n    init();\n    return self;\n  }\n\n  function _flatpickr(nodeList, config) {\n    var nodes = Array.prototype.slice.call(nodeList);\n    var instances = [];\n\n    for (var i = 0; i < nodes.length; i++) {\n      var node = nodes[i];\n\n      try {\n        if (node.getAttribute(\"data-fp-omit\") !== null) continue;\n\n        if (node._flatpickr !== undefined) {\n          node._flatpickr.destroy();\n\n          node._flatpickr = undefined;\n        }\n\n        node._flatpickr = FlatpickrInstance(node, config || {});\n        instances.push(node._flatpickr);\n      } catch (e) {\n        console.error(e);\n      }\n    }\n\n    return instances.length === 1 ? instances[0] : instances;\n  }\n\n  if (typeof HTMLElement !== \"undefined\") {\n    HTMLCollection.prototype.flatpickr = NodeList.prototype.flatpickr = function (config) {\n      return _flatpickr(this, config);\n    };\n\n    HTMLElement.prototype.flatpickr = function (config) {\n      return _flatpickr([this], config);\n    };\n  }\n\n  var flatpickr = function flatpickr(selector, config) {\n    if (selector instanceof NodeList) return _flatpickr(selector, config);else if (typeof selector === \"string\") return _flatpickr(window.document.querySelectorAll(selector), config);\n    return _flatpickr([selector], config);\n  };\n\n  flatpickr.defaultConfig = defaults;\n  flatpickr.l10ns = {\n    en: Object.assign({}, english),\n    default: Object.assign({}, english)\n  };\n\n  flatpickr.localize = function (l10n) {\n    flatpickr.l10ns.default = Object.assign({}, flatpickr.l10ns.default, l10n);\n  };\n\n  flatpickr.setDefaults = function (config) {\n    flatpickr.defaultConfig = Object.assign({}, flatpickr.defaultConfig, config);\n  };\n\n  flatpickr.parseDate = createDateParser({});\n  flatpickr.formatDate = createDateFormatter({});\n  flatpickr.compareDates = compareDates;\n\n  if (typeof jQuery !== \"undefined\") {\n    jQuery.fn.flatpickr = function (config) {\n      return _flatpickr(this, config);\n    };\n  }\n\n  Date.prototype.fp_incr = function (days) {\n    return new Date(this.getFullYear(), this.getMonth(), this.getDate() + (typeof days === \"string\" ? parseInt(days, 10) : days));\n  };\n\n  if (typeof window !== \"undefined\") {\n    window.flatpickr = flatpickr;\n  }\n\n  return flatpickr;\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZsYXRwaWNrci5qcyJdLCJuYW1lcyI6WyJnbG9iYWwiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsImRlZmluZSIsImFtZCIsImZsYXRwaWNrciIsInBhZCIsIm51bWJlciIsInNsaWNlIiwiaW50IiwiYm9vbCIsImRlYm91bmNlIiwiZnVuYyIsIndhaXQiLCJpbW1lZGlhdGUiLCJ0aW1lb3V0IiwiY29udGV4dCIsImFyZ3MiLCJhcmd1bWVudHMiLCJjbGVhclRpbWVvdXQiLCJ3aW5kb3ciLCJzZXRUaW1lb3V0IiwiYXBwbHkiLCJhcnJheWlmeSIsIm9iaiIsIkFycmF5IiwiZG9fbm90aGluZyIsInVuZGVmaW5lZCIsIm1vbnRoVG9TdHIiLCJtb250aE51bWJlciIsInNob3J0aGFuZCIsImxvY2FsZSIsIm1vbnRocyIsInJldkZvcm1hdCIsIkQiLCJGIiwiZGF0ZU9iaiIsIm1vbnRoTmFtZSIsInNldE1vbnRoIiwibG9uZ2hhbmQiLCJpbmRleE9mIiwiRyIsImhvdXIiLCJzZXRIb3VycyIsInBhcnNlRmxvYXQiLCJIIiwiSiIsImRheSIsInNldERhdGUiLCJLIiwiYW1QTSIsImdldEhvdXJzIiwiUmVnRXhwIiwidGVzdCIsIk0iLCJzaG9ydE1vbnRoIiwiUyIsInNlY29uZHMiLCJzZXRTZWNvbmRzIiwiVSIsIl8iLCJ1bml4U2Vjb25kcyIsIkRhdGUiLCJXIiwid2Vla051bSIsIndlZWtOdW1iZXIiLCJwYXJzZUludCIsImdldEZ1bGxZZWFyIiwiWSIsInllYXIiLCJzZXRGdWxsWWVhciIsIloiLCJJU09EYXRlIiwiZCIsImgiLCJpIiwibWludXRlcyIsInNldE1pbnV0ZXMiLCJqIiwibCIsIm0iLCJtb250aCIsIm4iLCJzIiwidyIsInkiLCJ0b2tlblJlZ2V4IiwiZm9ybWF0cyIsImRhdGUiLCJ0b0lTT1N0cmluZyIsIm9wdGlvbnMiLCJ3ZWVrZGF5cyIsIm9yZGluYWwiLCJnZXREYXRlIiwiZ2V0TW9udGgiLCJnZXRTZWNvbmRzIiwiZ2V0VGltZSIsImdldFdlZWsiLCJnZXRNaW51dGVzIiwiZ2V0RGF5IiwiU3RyaW5nIiwic3Vic3RyaW5nIiwiZW5nbGlzaCIsImRheXNJbk1vbnRoIiwiZmlyc3REYXlPZldlZWsiLCJudGgiLCJyYW5nZVNlcGFyYXRvciIsIndlZWtBYmJyZXZpYXRpb24iLCJzY3JvbGxUaXRsZSIsInRvZ2dsZVRpdGxlIiwieWVhckFyaWFMYWJlbCIsImNyZWF0ZURhdGVGb3JtYXR0ZXIiLCJfcmVmIiwiX3JlZiRjb25maWciLCJjb25maWciLCJkZWZhdWx0cyIsIl9yZWYkbDEwbiIsImwxMG4iLCJmcm10Iiwib3ZlcnJpZGVMb2NhbGUiLCJmb3JtYXREYXRlIiwic3BsaXQiLCJtYXAiLCJjIiwiYXJyIiwiam9pbiIsImNyZWF0ZURhdGVQYXJzZXIiLCJfcmVmMiIsIl9yZWYyJGNvbmZpZyIsIl9yZWYyJGwxMG4iLCJnaXZlbkZvcm1hdCIsInRpbWVsZXNzIiwiY3VzdG9tTG9jYWxlIiwicGFyc2VkRGF0ZSIsImRhdGVfb3JpZyIsInRvRml4ZWQiLCJmb3JtYXQiLCJkYXRlRm9ybWF0IiwiZGF0ZXN0ciIsInRyaW0iLCJwYXJzZURhdGUiLCJub0NhbGVuZGFyIiwibWF0Y2hlZCIsIm9wcyIsIm1hdGNoSW5kZXgiLCJyZWdleFN0ciIsImxlbmd0aCIsInRva2VuIiwiaXNCYWNrU2xhc2giLCJlc2NhcGVkIiwibWF0Y2giLCJleGVjIiwiZm4iLCJ2YWwiLCJmb3JFYWNoIiwiX3JlZjMiLCJpc05hTiIsImVycm9ySGFuZGxlciIsIkVycm9yIiwiY29tcGFyZURhdGVzIiwiZGF0ZTEiLCJkYXRlMiIsImdpdmVuRGF0ZSIsIndlZWsxIiwiTWF0aCIsInJvdW5kIiwiaXNCZXR3ZWVuIiwidHMiLCJ0czEiLCJ0czIiLCJtaW4iLCJtYXgiLCJkdXJhdGlvbiIsIkRBWSIsIkhPT0tTIiwiX2Rpc2FibGUiLCJfZW5hYmxlIiwiYWxsb3dJbnB1dCIsImFsdEZvcm1hdCIsImFsdElucHV0IiwiYWx0SW5wdXRDbGFzcyIsImFuaW1hdGUiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJhcmlhRGF0ZUZvcm1hdCIsImNsaWNrT3BlbnMiLCJjbG9zZU9uU2VsZWN0IiwiY29uanVuY3Rpb24iLCJkZWZhdWx0SG91ciIsImRlZmF1bHRNaW51dGUiLCJkZWZhdWx0U2Vjb25kcyIsImRpc2FibGUiLCJkaXNhYmxlTW9iaWxlIiwiZW5hYmxlIiwiZW5hYmxlU2Vjb25kcyIsImVuYWJsZVRpbWUiLCJlcnIiLCJjb25zb2xlIiwid2FybiIsImhvdXJJbmNyZW1lbnQiLCJpZ25vcmVkRm9jdXNFbGVtZW50cyIsImlubGluZSIsIm1pbnV0ZUluY3JlbWVudCIsIm1vZGUiLCJuZXh0QXJyb3ciLCJub3ciLCJvbkNoYW5nZSIsIm9uQ2xvc2UiLCJvbkRheUNyZWF0ZSIsIm9uRGVzdHJveSIsIm9uS2V5RG93biIsIm9uTW9udGhDaGFuZ2UiLCJvbk9wZW4iLCJvblBhcnNlQ29uZmlnIiwib25SZWFkeSIsIm9uVmFsdWVVcGRhdGUiLCJvblllYXJDaGFuZ2UiLCJvblByZUNhbGVuZGFyUG9zaXRpb24iLCJwbHVnaW5zIiwicG9zaXRpb24iLCJwb3NpdGlvbkVsZW1lbnQiLCJwcmV2QXJyb3ciLCJzaG9ydGhhbmRDdXJyZW50TW9udGgiLCJzaG93TW9udGhzIiwic3RhdGljIiwidGltZV8yNGhyIiwid2Vla051bWJlcnMiLCJ3cmFwIiwidG9nZ2xlQ2xhc3MiLCJlbGVtIiwiY2xhc3NOYW1lIiwiY2xhc3NMaXN0IiwiYWRkIiwicmVtb3ZlIiwiY3JlYXRlRWxlbWVudCIsInRhZyIsImNvbnRlbnQiLCJlIiwiZG9jdW1lbnQiLCJ0ZXh0Q29udGVudCIsImNsZWFyTm9kZSIsIm5vZGUiLCJmaXJzdENoaWxkIiwicmVtb3ZlQ2hpbGQiLCJmaW5kUGFyZW50IiwiY29uZGl0aW9uIiwicGFyZW50Tm9kZSIsImNyZWF0ZU51bWJlcklucHV0IiwiaW5wdXRDbGFzc05hbWUiLCJvcHRzIiwid3JhcHBlciIsIm51bUlucHV0IiwiYXJyb3dVcCIsImFycm93RG93biIsInR5cGUiLCJwYXR0ZXJuIiwia2V5Iiwic2V0QXR0cmlidXRlIiwiYXBwZW5kQ2hpbGQiLCJPYmplY3QiLCJhc3NpZ24iLCJ0YXJnZXQiLCJUeXBlRXJyb3IiLCJfbGVuIiwiX2tleSIsIl9sb29wIiwic291cmNlIiwiX2kiLCJrZXlzIiwiREVCT1VOQ0VEX0NIQU5HRV9NUyIsIkZsYXRwaWNrckluc3RhbmNlIiwiZWxlbWVudCIsImluc3RhbmNlQ29uZmlnIiwic2VsZiIsImRlZmF1bHRDb25maWciLCJfaGFuZGxlcnMiLCJfYmluZCIsImJpbmQiLCJfc2V0SG91cnNGcm9tRGF0ZSIsInNldEhvdXJzRnJvbURhdGUiLCJfcG9zaXRpb25DYWxlbmRhciIsInBvc2l0aW9uQ2FsZW5kYXIiLCJjaGFuZ2VNb250aCIsImNoYW5nZVllYXIiLCJjbGVhciIsImNsb3NlIiwiX2NyZWF0ZUVsZW1lbnQiLCJkZXN0cm95IiwiaXNFbmFibGVkIiwianVtcFRvRGF0ZSIsIm9wZW4iLCJyZWRyYXciLCJzZXQiLCJ0b2dnbGUiLCJzZXR1cEhlbHBlckZ1bmN0aW9ucyIsInV0aWxzIiwiZ2V0RGF5c0luTW9udGgiLCJ5ciIsImN1cnJlbnRNb250aCIsImN1cnJlbnRZZWFyIiwiaW5pdCIsImlucHV0IiwiaXNPcGVuIiwicGFyc2VDb25maWciLCJzZXR1cExvY2FsZSIsInNldHVwSW5wdXRzIiwic2V0dXBEYXRlcyIsImlzTW9iaWxlIiwiYnVpbGQiLCJiaW5kRXZlbnRzIiwic2VsZWN0ZWREYXRlcyIsImxhdGVzdFNlbGVjdGVkRGF0ZU9iaiIsIm1pbkRhdGUiLCJ1cGRhdGVWYWx1ZSIsInNldENhbGVuZGFyV2lkdGgiLCJzaG93VGltZUlucHV0IiwiaXNTYWZhcmkiLCJ0cmlnZ2VyRXZlbnQiLCJiaW5kVG9JbnN0YW5jZSIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImNhbGVuZGFyQ29udGFpbmVyIiwic3R5bGUiLCJ2aXNpYmlsaXR5IiwiZGlzcGxheSIsImRheXNDb250YWluZXIiLCJkYXlzV2lkdGgiLCJkYXlzIiwib2Zmc2V0V2lkdGgiLCJ3aWR0aCIsIndlZWtXcmFwcGVyIiwicmVtb3ZlUHJvcGVydHkiLCJ1cGRhdGVUaW1lIiwidGltZVdyYXBwZXIiLCJwcmV2VmFsdWUiLCJfaW5wdXQiLCJ2YWx1ZSIsInNldEhvdXJzRnJvbUlucHV0cyIsIl9kZWJvdW5jZWRDaGFuZ2UiLCJhbXBtMm1pbGl0YXJ5IiwibWlsaXRhcnkyYW1wbSIsImhvdXJFbGVtZW50IiwibWludXRlRWxlbWVudCIsImhvdXJzIiwic2Vjb25kRWxlbWVudCIsImxpbWl0TWluSG91cnMiLCJtaW5UaW1lIiwibWluRGF0ZUhhc1RpbWUiLCJsaW1pdE1heEhvdXJzIiwibWF4VGltZSIsIm1heERhdGUiLCJtYXhEYXRlSGFzVGltZSIsInNldERlZmF1bHRIb3VycyIsIm1pbl9ociIsIm1pbl9taW51dGVzIiwibWF4X2hyIiwibWF4X21pbnV0ZXMiLCJvblllYXJJbnB1dCIsImV2ZW50IiwiZGVsdGEiLCJ0b1N0cmluZyIsImhhbmRsZXIiLCJldiIsImVsIiwiYWRkRXZlbnRMaXN0ZW5lciIsInB1c2giLCJvbkNsaWNrIiwiZXZ0Iiwid2hpY2giLCJ0cmlnZ2VyQ2hhbmdlIiwicHJvdG90eXBlIiwiY2FsbCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJzZXR1cE1vYmlsZSIsImRlYm91bmNlZFJlc2l6ZSIsIm9uUmVzaXplIiwib25Nb3VzZU92ZXIiLCJib2R5Iiwib250b3VjaHN0YXJ0IiwiZG9jdW1lbnRDbGljayIsImNhcHR1cmUiLCJtb250aE5hdiIsIm9uTW9udGhOYXZDbGljayIsInNlbGVjdERhdGUiLCJ0aW1lQ29udGFpbmVyIiwic2VsVGV4dCIsInNlbGVjdCIsInRpbWVJbmNyZW1lbnQiLCJqdW1wRGF0ZSIsImp1bXBUbyIsIm1lc3NhZ2UiLCJpbmNyZW1lbnROdW1JbnB1dCIsImNvbnRhaW5zIiwiaW5wdXRFbGVtIiwiY3JlYXRlRXZlbnQiLCJkaXNwYXRjaEV2ZW50IiwiZnJhZ21lbnQiLCJjcmVhdGVEb2N1bWVudEZyYWdtZW50IiwidGFiSW5kZXgiLCJidWlsZE1vbnRoTmF2IiwiaW5uZXJDb250YWluZXIiLCJfYnVpbGRXZWVrcyIsImJ1aWxkV2Vla3MiLCJyQ29udGFpbmVyIiwiYnVpbGRXZWVrZGF5cyIsImJ1aWxkRGF5cyIsImJ1aWxkVGltZSIsImN1c3RvbUFwcGVuZCIsImFwcGVuZFRvIiwibm9kZVR5cGUiLCJpbnNlcnRCZWZvcmUiLCJuZXh0U2libGluZyIsImNyZWF0ZURheSIsImRheU51bWJlciIsImRhdGVJc0VuYWJsZWQiLCJkYXlFbGVtZW50IiwiJGkiLCJ0b2RheURhdGVFbGVtIiwiaXNEYXRlU2VsZWN0ZWQiLCJzZWxlY3RlZERhdGVFbGVtIiwiaXNEYXRlSW5SYW5nZSIsImluc2VydEFkamFjZW50SFRNTCIsImZvY3VzT25EYXlFbGVtIiwidGFyZ2V0Tm9kZSIsImZvY3VzIiwiZ2V0Rmlyc3RBdmFpbGFibGVEYXkiLCJzdGFydE1vbnRoIiwiZW5kTW9udGgiLCJjaGlsZHJlbiIsInN0YXJ0SW5kZXgiLCJlbmRJbmRleCIsImdldE5leHRBdmFpbGFibGVEYXkiLCJjdXJyZW50IiwiZ2l2ZW5Nb250aCIsImxvb3BEZWx0YSIsIm51bU1vbnRoRGF5cyIsImFicyIsImZvY3VzT25EYXkiLCJvZmZzZXQiLCJkYXlGb2N1c2VkIiwiaXNJblZpZXciLCJhY3RpdmVFbGVtZW50Iiwic3RhcnRFbGVtIiwiYnVpbGRNb250aERheXMiLCJmaXJzdE9mTW9udGgiLCJwcmV2TW9udGhEYXlzIiwiaXNNdWx0aU1vbnRoIiwicHJldk1vbnRoRGF5Q2xhc3MiLCJuZXh0TW9udGhEYXlDbGFzcyIsImRheUluZGV4IiwiZGF5TnVtIiwiZGF5Q29udGFpbmVyIiwiZnJhZyIsImJ1aWxkTW9udGgiLCJjb250YWluZXIiLCJtb250aE5hdkZyYWdtZW50IiwibW9udGhFbGVtZW50IiwieWVhcklucHV0IiwidGFiaW5kZXgiLCJ5ZWFyRWxlbWVudCIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiZGlzYWJsZWQiLCJidWlsZE1vbnRocyIsInByZXZNb250aE5hdiIsInllYXJFbGVtZW50cyIsIm1vbnRoRWxlbWVudHMiLCJuZXh0TW9udGhOYXYiLCJpbm5lckhUTUwiLCJkZWZpbmVQcm9wZXJ0eSIsImdldCIsIl9faGlkZVByZXZNb250aEFycm93IiwiX19oaWRlTmV4dE1vbnRoQXJyb3ciLCJjdXJyZW50WWVhckVsZW1lbnQiLCJ1cGRhdGVOYXZpZ2F0aW9uQ3VycmVudE1vbnRoIiwic2VwYXJhdG9yIiwiaG91cklucHV0IiwibWludXRlSW5wdXQiLCJzZWNvbmRJbnB1dCIsImdldEF0dHJpYnV0ZSIsInRpdGxlIiwid2Vla2RheUNvbnRhaW5lciIsInVwZGF0ZVdlZWtkYXlzIiwiY29uY2F0Iiwic3BsaWNlIiwiaXNfb2Zmc2V0IiwiX2hpZGVQcmV2TW9udGhBcnJvdyIsIl9oaWRlTmV4dE1vbnRoQXJyb3ciLCJ0cmlnZ2VyQ2hhbmdlRXZlbnQiLCJtb2JpbGVJbnB1dCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJsYXN0Q2hpbGQiLCJfdHlwZSIsInJlbW92ZUF0dHJpYnV0ZSIsImsiLCJpc0NhbGVuZGFyRWxlbSIsImlzQ2FsZW5kYXJFbGVtZW50IiwiaXNJbnB1dCIsInBhdGgiLCJsb3N0Rm9jdXMiLCJyZWxhdGVkVGFyZ2V0IiwiaXNJZ25vcmVkIiwic29tZSIsIm5ld1llYXIiLCJuZXdZZWFyTnVtIiwiaXNOZXdZZWFyIiwiZGF0ZVRvQ2hlY2siLCJhcnJheSIsInBhcnNlZCIsImZyb20iLCJ0byIsImFsbG93S2V5ZG93biIsImFsbG93SW5saW5lS2V5ZG93biIsImtleUNvZGUiLCJibHVyIiwiaXNUaW1lT2JqIiwicHJldmVudERlZmF1bHQiLCJmb2N1c0FuZENsb3NlIiwiX2RlbHRhIiwiY3RybEtleSIsImVsZW1zIiwiZmlsdGVyIiwieCIsInNoaWZ0S2V5IiwiY2hhckF0IiwidG9Mb3dlckNhc2UiLCJob3ZlckRhdGUiLCJmaXJzdEVsZW1lbnRDaGlsZCIsImluaXRpYWxEYXRlIiwicmFuZ2VTdGFydERhdGUiLCJyYW5nZUVuZERhdGUiLCJsYXN0RGF0ZSIsImNvbnRhaW5zRGlzYWJsZWQiLCJtaW5SYW5nZSIsIm1heFJhbmdlIiwidCIsInByZXZNb250aCIsImRheUVsZW0iLCJ0aW1lc3RhbXAiLCJvdXRPZlJhbmdlIiwiX3JldCIsIl9wb3NpdGlvbkVsZW1lbnQiLCJjbGljayIsIndhc09wZW4iLCJtaW5NYXhEYXRlU2V0dGVyIiwiaW52ZXJzZURhdGVPYmoiLCJib29sT3B0cyIsInVzZXJDb25maWciLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJkYXRhc2V0IiwiZm9ybWF0cyQkMSIsImRhdGVzIiwicGFyc2VEYXRlUnVsZXMiLCJ0aW1lTW9kZSIsIl9taW5EYXRlIiwiX21heERhdGUiLCJtaW5NYXhUaW1lU2V0dGVyIiwiX21pblRpbWUiLCJfbWF4VGltZSIsImhvb2siLCJwbHVnaW5Db25mIiwibDEwbnMiLCJkZWZhdWx0IiwiY3VzdG9tUG9zaXRpb25FbGVtZW50IiwiY2FsZW5kYXJIZWlnaHQiLCJyZWR1Y2UiLCJhY2MiLCJjaGlsZCIsIm9mZnNldEhlaWdodCIsImNhbGVuZGFyV2lkdGgiLCJjb25maWdQb3MiLCJjb25maWdQb3NWZXJ0aWNhbCIsImNvbmZpZ1Bvc0hvcml6b250YWwiLCJpbnB1dEJvdW5kcyIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImRpc3RhbmNlRnJvbUJvdHRvbSIsImlubmVySGVpZ2h0IiwiYm90dG9tIiwic2hvd09uVG9wIiwidG9wIiwicGFnZVlPZmZzZXQiLCJsZWZ0IiwicGFnZVhPZmZzZXQiLCJyaWdodCIsInJpZ2h0TW9zdCIsIm1zTWF4VG91Y2hQb2ludHMiLCJzdG9wUHJvcGFnYXRpb24iLCJpc1NlbGVjdGFibGUiLCJzZWxlY3RlZERhdGUiLCJzaG91bGRDaGFuZ2VNb250aCIsInNlbGVjdGVkSW5kZXgiLCJzb3J0IiwiYSIsImIiLCJzaW5nbGUiLCJyYW5nZSIsIkNBTExCQUNLUyIsIm9wdGlvbiIsInNldFNlbGVjdGVkRGF0ZSIsImlucHV0RGF0ZSIsInJ1bGUiLCJwcmVsb2FkZWREYXRlIiwiZGVmYXVsdERhdGUiLCJub2RlTmFtZSIsInBsYWNlaG9sZGVyIiwiX3Nob3dUaW1lSW5wdXQiLCJxdWVyeVNlbGVjdG9yIiwicmVxdWlyZWQiLCJpbnB1dFR5cGUiLCJzdGVwIiwibW9iaWxlRm9ybWF0U3RyIiwiZGVmYXVsdFZhbHVlIiwiX2EiLCJkYXRhIiwiaG9va3MiLCJuYW1lIiwiaW5pdEV2ZW50IiwiZ2V0RGF0ZVN0ciIsImRPYmoiLCJpc1ByZXZNb250aCIsImlzTmV4dE1vbnRoIiwiaXNLZXlEb3duIiwiY3VyVmFsdWUiLCJuZXdWYWx1ZSIsImlzSG91ckVsZW0iLCJpc01pbnV0ZUVsZW0iLCJfZmxhdHBpY2tyIiwibm9kZUxpc3QiLCJub2RlcyIsImluc3RhbmNlcyIsImVycm9yIiwiSFRNTEVsZW1lbnQiLCJIVE1MQ29sbGVjdGlvbiIsIk5vZGVMaXN0Iiwic2VsZWN0b3IiLCJlbiIsImxvY2FsaXplIiwic2V0RGVmYXVsdHMiLCJqUXVlcnkiLCJmcF9pbmNyIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOzs7O0FBQ0MsV0FBVUEsTUFBVixFQUFrQkMsT0FBbEIsRUFBMkI7QUFDeEIsVUFBT0MsT0FBUCx5Q0FBT0EsT0FBUCxPQUFtQixRQUFuQixJQUErQixPQUFPQyxNQUFQLEtBQWtCLFdBQWpELEdBQStEQSxPQUFPRCxPQUFQLEdBQWlCRCxTQUFoRixHQUNBLE9BQU9HLE1BQVAsS0FBa0IsVUFBbEIsSUFBZ0NBLE9BQU9DLEdBQXZDLEdBQTZDRCxPQUFPSCxPQUFQLENBQTdDLEdBQ0NELE9BQU9NLFNBQVAsR0FBbUJMLFNBRnBCO0FBR0gsQ0FKQSxhQUlRLFlBQVk7QUFBRTs7QUFFbkIsTUFBSU0sTUFBTSxTQUFTQSxHQUFULENBQWFDLE1BQWIsRUFBcUI7QUFDN0IsV0FBTyxDQUFDLE1BQU1BLE1BQVAsRUFBZUMsS0FBZixDQUFxQixDQUFDLENBQXRCLENBQVA7QUFDRCxHQUZEO0FBR0EsTUFBSUMsTUFBTSxTQUFTQSxHQUFULENBQWFDLElBQWIsRUFBbUI7QUFDM0IsV0FB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akIsQ0FBdEI7QUFDQXpILFlBQVVtSCxVQUFWLEdBQXVCVCxvQkFBb0IsRUFBcEIsQ0FBdkI7QUFDQTFHLFlBQVUwSixZQUFWLEdBQXlCQSxZQUF6Qjs7QUFFQSxNQUFJLE9BQU8rZCxNQUFQLEtBQWtCLFdBQXRCLEVBQW1DO0FBQ2pDQSxXQUFPdGUsRUFBUCxDQUFVbkosU0FBVixHQUFzQixVQUFVNkcsTUFBVixFQUFrQjtBQUN0QyxhQUFPZ2dCLFdBQVcsSUFBWCxFQUFpQmhnQixNQUFqQixDQUFQO0FBQ0QsS0FGRDtBQUdEOztBQUVEcEQsT0FBS21ULFNBQUwsQ0FBZThRLE9BQWYsR0FBeUIsVUFBVXpULElBQVYsRUFBZ0I7QUFDdkMsV0FBTyxJQUFJeFEsSUFBSixDQUFTLEtBQUtLLFdBQUwsRUFBVCxFQUE2QixLQUFLMkIsUUFBTCxFQUE3QixFQUE4QyxLQUFLRCxPQUFMLE1BQWtCLE9BQU95TyxJQUFQLEtBQWdCLFFBQWhCLEdBQTJCcFEsU0FBU29RLElBQVQsRUFBZSxFQUFmLENBQTNCLEdBQWdEQSxJQUFsRSxDQUE5QyxDQUFQO0FBQ0QsR0FGRDs7QUFJQSxNQUFJLE9BQU9sVCxNQUFQLEtBQWtCLFdBQXRCLEVBQW1DO0FBQ2pDQSxXQUFPZixTQUFQLEdBQW1CQSxTQUFuQjtBQUNEOztBQUVELFNBQU9BLFNBQVA7QUFFSCxDQTVuRUEsQ0FBRCIsImZpbGUiOiJmbGF0cGlja3IuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbi8qIGZsYXRwaWNrciB2NC41LjIsIEBsaWNlbnNlIE1JVCAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKSA6XG4gICAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgICAoZ2xvYmFsLmZsYXRwaWNrciA9IGZhY3RvcnkoKSk7XG59KHRoaXMsIChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBwYWQgPSBmdW5jdGlvbiBwYWQobnVtYmVyKSB7XG4gICAgICByZXR1cm4gKFwiMFwiICsgbnVtYmVyKS5zbGljZSgtMik7XG4gICAgfTtcbiAgICB2YXIgaW50ID0gZnVuY3Rpb24gaW50KGJvb2wpIHtcbiAgICAgIHJldHVybiBib29sID09PSB0cnVlID8gMSA6IDA7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBkZWJvdW5jZShmdW5jLCB3YWl0LCBpbW1lZGlhdGUpIHtcbiAgICAgIGlmIChpbW1lZGlhdGUgPT09IHZvaWQgMCkge1xuICAgICAgICBpbW1lZGlhdGUgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHRpbWVvdXQ7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMsXG4gICAgICAgICAgICBhcmdzID0gYXJndW1lbnRzO1xuICAgICAgICB0aW1lb3V0ICE9PSBudWxsICYmIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICBpZiAoIWltbWVkaWF0ZSkgZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgfSwgd2FpdCk7XG4gICAgICAgIGlmIChpbW1lZGlhdGUgJiYgIXRpbWVvdXQpIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICB9O1xuICAgIH1cbiAgICB2YXIgYXJyYXlpZnkgPSBmdW5jdGlvbiBhcnJheWlmeShvYmopIHtcbiAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBBcnJheSA/IG9iaiA6IFtvYmpdO1xuICAgIH07XG5cbiAgICB2YXIgZG9fbm90aGluZyA9IGZ1bmN0aW9uIGRvX25vdGhpbmcoKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICB2YXIgbW9udGhUb1N0ciA9IGZ1bmN0aW9uIG1vbnRoVG9TdHIobW9udGhOdW1iZXIsIHNob3J0aGFuZCwgbG9jYWxlKSB7XG4gICAgICByZXR1cm4gbG9jYWxlLm1vbnRoc1tzaG9ydGhhbmQgPyBcInNob3J0aGFuZFwiIDogXCJsb25naGFuZFwiXVttb250aE51bWJlcl07XG4gICAgfTtcbiAgICB2YXIgcmV2Rm9ybWF0ID0ge1xuICAgICAgRDogZG9fbm90aGluZyxcbiAgICAgIEY6IGZ1bmN0aW9uIEYoZGF0ZU9iaiwgbW9udGhOYW1lLCBsb2NhbGUpIHtcbiAgICAgICAgZGF0ZU9iai5zZXRNb250aChsb2NhbGUubW9udGhzLmxvbmdoYW5kLmluZGV4T2YobW9udGhOYW1lKSk7XG4gICAgICB9LFxuICAgICAgRzogZnVuY3Rpb24gRyhkYXRlT2JqLCBob3VyKSB7XG4gICAgICAgIGRhdGVPYmouc2V0SG91cnMocGFyc2VGbG9hdChob3VyKSk7XG4gICAgICB9LFxuICAgICAgSDogZnVuY3Rpb24gSChkYXRlT2JqLCBob3VyKSB7XG4gICAgICAgIGRhdGVPYmouc2V0SG91cnMocGFyc2VGbG9hdChob3VyKSk7XG4gICAgICB9LFxuICAgICAgSjogZnVuY3Rpb24gSihkYXRlT2JqLCBkYXkpIHtcbiAgICAgICAgZGF0ZU9iai5zZXREYXRlKHBhcnNlRmxvYXQoZGF5KSk7XG4gICAgICB9LFxuICAgICAgSzogZnVuY3Rpb24gSyhkYXRlT2JqLCBhbVBNLCBsb2NhbGUpIHtcbiAgICAgICAgZGF0ZU9iai5zZXRIb3VycyhkYXRlT2JqLmdldEhvdXJzKCkgJSAxMiArIDEyICogaW50KG5ldyBSZWdFeHAobG9jYWxlLmFtUE1bMV0sIFwiaVwiKS50ZXN0KGFtUE0pKSk7XG4gICAgICB9LFxuICAgICAgTTogZnVuY3Rpb24gTShkYXRlT2JqLCBzaG9ydE1vbnRoLCBsb2NhbGUpIHtcbiAgICAgICAgZGF0ZU9iai5zZXRNb250aChsb2NhbGUubW9udGhzLnNob3J0aGFuZC5pbmRleE9mKHNob3J0TW9udGgpKTtcbiAgICAgIH0sXG4gICAgICBTOiBmdW5jdGlvbiBTKGRhdGVPYmosIHNlY29uZHMpIHtcbiAgICAgICAgZGF0ZU9iai5zZXRTZWNvbmRzKHBhcnNlRmxvYXQoc2Vjb25kcykpO1xuICAgICAgfSxcbiAgICAgIFU6IGZ1bmN0aW9uIFUoXywgdW5peFNlY29uZHMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHBhcnNlRmxvYXQodW5peFNlY29uZHMpICogMTAwMCk7XG4gICAgICB9LFxuICAgICAgVzogZnVuY3Rpb24gVyhkYXRlT2JqLCB3ZWVrTnVtKSB7XG4gICAgICAgIHZhciB3ZWVrTnVtYmVyID0gcGFyc2VJbnQod2Vla051bSk7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShkYXRlT2JqLmdldEZ1bGxZZWFyKCksIDAsIDIgKyAod2Vla051bWJlciAtIDEpICogNywgMCwgMCwgMCwgMCk7XG4gICAgICB9LFxuICAgICAgWTogZnVuY3Rpb24gWShkYXRlT2JqLCB5ZWFyKSB7XG4gICAgICAgIGRhdGVPYmouc2V0RnVsbFllYXIocGFyc2VGbG9hdCh5ZWFyKSk7XG4gICAgICB9LFxuICAgICAgWjogZnVuY3Rpb24gWihfLCBJU09EYXRlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShJU09EYXRlKTtcbiAgICAgIH0sXG4gICAgICBkOiBmdW5jdGlvbiBkKGRhdGVPYmosIGRheSkge1xuICAgICAgICBkYXRlT2JqLnNldERhdGUocGFyc2VGbG9hdChkYXkpKTtcbiAgICAgIH0sXG4gICAgICBoOiBmdW5jdGlvbiBoKGRhdGVPYmosIGhvdXIpIHtcbiAgICAgICAgZGF0ZU9iai5zZXRIb3VycyhwYXJzZUZsb2F0KGhvdXIpKTtcbiAgICAgIH0sXG4gICAgICBpOiBmdW5jdGlvbiBpKGRhdGVPYmosIG1pbnV0ZXMpIHtcbiAgICAgICAgZGF0ZU9iai5zZXRNaW51dGVzKHBhcnNlRmxvYXQobWludXRlcykpO1xuICAgICAgfSxcbiAgICAgIGo6IGZ1bmN0aW9uIGooZGF0ZU9iaiwgZGF5KSB7XG4gICAgICAgIGRhdGVPYmouc2V0RGF0ZShwYXJzZUZsb2F0KGRheSkpO1xuICAgICAgfSxcbiAgICAgIGw6IGRvX25vdGhpbmcsXG4gICAgICBtOiBmdW5jdGlvbiBtKGRhdGVPYmosIG1vbnRoKSB7XG4gICAgICAgIGRhdGVPYmouc2V0TW9udGgocGFyc2VGbG9hdChtb250aCkgLSAxKTtcbiAgICAgIH0sXG4gICAgICBuOiBmdW5jdGlvbiBuKGRhdGVPYmosIG1vbnRoKSB7XG4gICAgICAgIGRhdGVPYmouc2V0TW9udGgocGFyc2VGbG9hdChtb250aCkgLSAxKTtcbiAgICAgIH0sXG4gICAgICBzOiBmdW5jdGlvbiBzKGRhdGVPYmosIHNlY29uZHMpIHtcbiAgICAgICAgZGF0ZU9iai5zZXRTZWNvbmRzKHBhcnNlRmxvYXQoc2Vjb25kcykpO1xuICAgICAgfSxcbiAgICAgIHc6IGRvX25vdGhpbmcsXG4gICAgICB5OiBmdW5jdGlvbiB5KGRhdGVPYmosIHllYXIpIHtcbiAgICAgICAgZGF0ZU9iai5zZXRGdWxsWWVhcigyMDAwICsgcGFyc2VGbG9hdCh5ZWFyKSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgdG9rZW5SZWdleCA9IHtcbiAgICAgIEQ6IFwiKFxcXFx3KylcIixcbiAgICAgIEY6IFwiKFxcXFx3KylcIixcbiAgICAgIEc6IFwiKFxcXFxkXFxcXGR8XFxcXGQpXCIsXG4gICAgICBIOiBcIihcXFxcZFxcXFxkfFxcXFxkKVwiLFxuICAgICAgSjogXCIoXFxcXGRcXFxcZHxcXFxcZClcXFxcdytcIixcbiAgICAgIEs6IFwiXCIsXG4gICAgICBNOiBcIihcXFxcdyspXCIsXG4gICAgICBTOiBcIihcXFxcZFxcXFxkfFxcXFxkKVwiLFxuICAgICAgVTogXCIoLispXCIsXG4gICAgICBXOiBcIihcXFxcZFxcXFxkfFxcXFxkKVwiLFxuICAgICAgWTogXCIoXFxcXGR7NH0pXCIsXG4gICAgICBaOiBcIiguKylcIixcbiAgICAgIGQ6IFwiKFxcXFxkXFxcXGR8XFxcXGQpXCIsXG4gICAgICBoOiBcIihcXFxcZFxcXFxkfFxcXFxkKVwiLFxuICAgICAgaTogXCIoXFxcXGRcXFxcZHxcXFxcZClcIixcbiAgICAgIGo6IFwiKFxcXFxkXFxcXGR8XFxcXGQpXCIsXG4gICAgICBsOiBcIihcXFxcdyspXCIsXG4gICAgICBtOiBcIihcXFxcZFxcXFxkfFxcXFxkKVwiLFxuICAgICAgbjogXCIoXFxcXGRcXFxcZHxcXFxcZClcIixcbiAgICAgIHM6IFwiKFxcXFxkXFxcXGR8XFxcXGQpXCIsXG4gICAgICB3OiBcIihcXFxcZFxcXFxkfFxcXFxkKVwiLFxuICAgICAgeTogXCIoXFxcXGR7Mn0pXCJcbiAgICB9O1xuICAgIHZhciBmb3JtYXRzID0ge1xuICAgICAgWjogZnVuY3Rpb24gWihkYXRlKSB7XG4gICAgICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKCk7XG4gICAgICB9LFxuICAgICAgRDogZnVuY3Rpb24gRChkYXRlLCBsb2NhbGUsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5cy5zaG9ydGhhbmRbZm9ybWF0cy53KGRhdGUsIGxvY2FsZSwgb3B0aW9ucyldO1xuICAgICAgfSxcbiAgICAgIEY6IGZ1bmN0aW9uIEYoZGF0ZSwgbG9jYWxlLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBtb250aFRvU3RyKGZvcm1hdHMubihkYXRlLCBsb2NhbGUsIG9wdGlvbnMpIC0gMSwgZmFsc2UsIGxvY2FsZSk7XG4gICAgICB9LFxuICAgICAgRzogZnVuY3Rpb24gRyhkYXRlLCBsb2NhbGUsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHBhZChmb3JtYXRzLmgoZGF0ZSwgbG9jYWxlLCBvcHRpb25zKSk7XG4gICAgICB9LFxuICAgICAgSDogZnVuY3Rpb24gSChkYXRlKSB7XG4gICAgICAgIHJldHVybiBwYWQoZGF0ZS5nZXRIb3VycygpKTtcbiAgICAgIH0sXG4gICAgICBKOiBmdW5jdGlvbiBKKGRhdGUsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLm9yZGluYWwgIT09IHVuZGVmaW5lZCA/IGRhdGUuZ2V0RGF0ZSgpICsgbG9jYWxlLm9yZGluYWwoZGF0ZS5nZXREYXRlKCkpIDogZGF0ZS5nZXREYXRlKCk7XG4gICAgICB9LFxuICAgICAgSzogZnVuY3Rpb24gSyhkYXRlLCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5hbVBNW2ludChkYXRlLmdldEhvdXJzKCkgPiAxMSldO1xuICAgICAgfSxcbiAgICAgIE06IGZ1bmN0aW9uIE0oZGF0ZSwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBtb250aFRvU3RyKGRhdGUuZ2V0TW9udGgoKSwgdHJ1ZSwgbG9jYWxlKTtcbiAgICAgIH0sXG4gICAgICBTOiBmdW5jdGlvbiBTKGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIHBhZChkYXRlLmdldFNlY29uZHMoKSk7XG4gICAgICB9LFxuICAgICAgVTogZnVuY3Rpb24gVShkYXRlKSB7XG4gICAgICAgIHJldHVybiBkYXRlLmdldFRpbWUoKSAvIDEwMDA7XG4gICAgICB9LFxuICAgICAgVzogZnVuY3Rpb24gVyhkYXRlLCBfLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiBvcHRpb25zLmdldFdlZWsoZGF0ZSk7XG4gICAgICB9LFxuICAgICAgWTogZnVuY3Rpb24gWShkYXRlKSB7XG4gICAgICAgIHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICB9LFxuICAgICAgZDogZnVuY3Rpb24gZChkYXRlKSB7XG4gICAgICAgIHJldHVybiBwYWQoZGF0ZS5nZXREYXRlKCkpO1xuICAgICAgfSxcbiAgICAgIGg6IGZ1bmN0aW9uIGgoZGF0ZSkge1xuICAgICAgICByZXR1cm4gZGF0ZS5nZXRIb3VycygpICUgMTIgPyBkYXRlLmdldEhvdXJzKCkgJSAxMiA6IDEyO1xuICAgICAgfSxcbiAgICAgIGk6IGZ1bmN0aW9uIGkoZGF0ZSkge1xuICAgICAgICByZXR1cm4gcGFkKGRhdGUuZ2V0TWludXRlcygpKTtcbiAgICAgIH0sXG4gICAgICBqOiBmdW5jdGlvbiBqKGRhdGUpIHtcbiAgICAgICAgcmV0dXJuIGRhdGUuZ2V0RGF0ZSgpO1xuICAgICAgfSxcbiAgICAgIGw6IGZ1bmN0aW9uIGwoZGF0ZSwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUud2Vla2RheXMubG9uZ2hhbmRbZGF0ZS5nZXREYXkoKV07XG4gICAgICB9LFxuICAgICAgbTogZnVuY3Rpb24gbShkYXRlKSB7XG4gICAgICAgIHJldHVybiBwYWQoZGF0ZS5nZXRNb250aCgpICsgMSk7XG4gICAgICB9LFxuICAgICAgbjogZnVuY3Rpb24gbihkYXRlKSB7XG4gICAgICAgIHJldHVybiBkYXRlLmdldE1vbnRoKCkgKyAxO1xuICAgICAgfSxcbiAgICAgIHM6IGZ1bmN0aW9uIHMoZGF0ZSkge1xuICAgICAgICByZXR1cm4gZGF0ZS5nZXRTZWNvbmRzKCk7XG4gICAgICB9LFxuICAgICAgdzogZnVuY3Rpb24gdyhkYXRlKSB7XG4gICAgICAgIHJldHVybiBkYXRlLmdldERheSgpO1xuICAgICAgfSxcbiAgICAgIHk6IGZ1bmN0aW9uIHkoZGF0ZSkge1xuICAgICAgICByZXR1cm4gU3RyaW5nKGRhdGUuZ2V0RnVsbFllYXIoKSkuc3Vic3RyaW5nKDIpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgZW5nbGlzaCA9IHtcbiAgICAgIHdlZWtkYXlzOiB7XG4gICAgICAgIHNob3J0aGFuZDogW1wiU3VuXCIsIFwiTW9uXCIsIFwiVHVlXCIsIFwiV2VkXCIsIFwiVGh1XCIsIFwiRnJpXCIsIFwiU2F0XCJdLFxuICAgICAgICBsb25naGFuZDogW1wiU3VuZGF5XCIsIFwiTW9uZGF5XCIsIFwiVHVlc2RheVwiLCBcIldlZG5lc2RheVwiLCBcIlRodXJzZGF5XCIsIFwiRnJpZGF5XCIsIFwiU2F0dXJkYXlcIl1cbiAgICAgIH0sXG4gICAgICBtb250aHM6IHtcbiAgICAgICAgc2hvcnRoYW5kOiBbXCJKYW5cIiwgXCJGZWJcIiwgXCJNYXJcIiwgXCJBcHJcIiwgXCJNYXlcIiwgXCJKdW5cIiwgXCJKdWxcIiwgXCJBdWdcIiwgXCJTZXBcIiwgXCJPY3RcIiwgXCJOb3ZcIiwgXCJEZWNcIl0sXG4gICAgICAgIGxvbmdoYW5kOiBbXCJKYW51YXJ5XCIsIFwiRmVicnVhcnlcIiwgXCJNYXJjaFwiLCBcIkFwcmlsXCIsIFwiTWF5XCIsIFwiSnVuZVwiLCBcIkp1bHlcIiwgXCJBdWd1c3RcIiwgXCJTZXB0ZW1iZXJcIiwgXCJPY3RvYmVyXCIsIFwiTm92ZW1iZXJcIiwgXCJEZWNlbWJlclwiXVxuICAgICAgfSxcbiAgICAgIGRheXNJbk1vbnRoOiBbMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMV0sXG4gICAgICBmaXJzdERheU9mV2VlazogMCxcbiAgICAgIG9yZGluYWw6IGZ1bmN0aW9uIG9yZGluYWwobnRoKSB7XG4gICAgICAgIHZhciBzID0gbnRoICUgMTAwO1xuICAgICAgICBpZiAocyA+IDMgJiYgcyA8IDIxKSByZXR1cm4gXCJ0aFwiO1xuXG4gICAgICAgIHN3aXRjaCAocyAlIDEwKSB7XG4gICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgcmV0dXJuIFwic3RcIjtcblxuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHJldHVybiBcIm5kXCI7XG5cbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICByZXR1cm4gXCJyZFwiO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBcInRoXCI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICByYW5nZVNlcGFyYXRvcjogXCIgdG8gXCIsXG4gICAgICB3ZWVrQWJicmV2aWF0aW9uOiBcIldrXCIsXG4gICAgICBzY3JvbGxUaXRsZTogXCJTY3JvbGwgdG8gaW5jcmVtZW50XCIsXG4gICAgICB0b2dnbGVUaXRsZTogXCJDbGljayB0byB0b2dnbGVcIixcbiAgICAgIGFtUE06IFtcIkFNXCIsIFwiUE1cIl0sXG4gICAgICB5ZWFyQXJpYUxhYmVsOiBcIlllYXJcIlxuICAgIH07XG5cbiAgICB2YXIgY3JlYXRlRGF0ZUZvcm1hdHRlciA9IGZ1bmN0aW9uIGNyZWF0ZURhdGVGb3JtYXR0ZXIoX3JlZikge1xuICAgICAgdmFyIF9yZWYkY29uZmlnID0gX3JlZi5jb25maWcsXG4gICAgICAgICAgY29uZmlnID0gX3JlZiRjb25maWcgPT09IHZvaWQgMCA/IGRlZmF1bHRzIDogX3JlZiRjb25maWcsXG4gICAgICAgICAgX3JlZiRsMTBuID0gX3JlZi5sMTBuLFxuICAgICAgICAgIGwxMG4gPSBfcmVmJGwxMG4gPT09IHZvaWQgMCA/IGVuZ2xpc2ggOiBfcmVmJGwxMG47XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGRhdGVPYmosIGZybXQsIG92ZXJyaWRlTG9jYWxlKSB7XG4gICAgICAgIHZhciBsb2NhbGUgPSBvdmVycmlkZUxvY2FsZSB8fCBsMTBuO1xuXG4gICAgICAgIGlmIChjb25maWcuZm9ybWF0RGF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbmZpZy5mb3JtYXREYXRlKGRhdGVPYmosIGZybXQsIGxvY2FsZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZnJtdC5zcGxpdChcIlwiKS5tYXAoZnVuY3Rpb24gKGMsIGksIGFycikge1xuICAgICAgICAgIHJldHVybiBmb3JtYXRzW2NdICYmIGFycltpIC0gMV0gIT09IFwiXFxcXFwiID8gZm9ybWF0c1tjXShkYXRlT2JqLCBsb2NhbGUsIGNvbmZpZykgOiBjICE9PSBcIlxcXFxcIiA/IGMgOiBcIlwiO1xuICAgICAgICB9KS5qb2luKFwiXCIpO1xuICAgICAgfTtcbiAgICB9O1xuICAgIHZhciBjcmVhdGVEYXRlUGFyc2VyID0gZnVuY3Rpb24gY3JlYXRlRGF0ZVBhcnNlcihfcmVmMikge1xuICAgICAgdmFyIF9yZWYyJGNvbmZpZyA9IF9yZWYyLmNvbmZpZyxcbiAgICAgICAgICBjb25maWcgPSBfcmVmMiRjb25maWcgPT09IHZvaWQgMCA/IGRlZmF1bHRzIDogX3JlZjIkY29uZmlnLFxuICAgICAgICAgIF9yZWYyJGwxMG4gPSBfcmVmMi5sMTBuLFxuICAgICAgICAgIGwxMG4gPSBfcmVmMiRsMTBuID09PSB2b2lkIDAgPyBlbmdsaXNoIDogX3JlZjIkbDEwbjtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZGF0ZSwgZ2l2ZW5Gb3JtYXQsIHRpbWVsZXNzLCBjdXN0b21Mb2NhbGUpIHtcbiAgICAgICAgaWYgKGRhdGUgIT09IDAgJiYgIWRhdGUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBsb2NhbGUgPSBjdXN0b21Mb2NhbGUgfHwgbDEwbjtcbiAgICAgICAgdmFyIHBhcnNlZERhdGU7XG4gICAgICAgIHZhciBkYXRlX29yaWcgPSBkYXRlO1xuICAgICAgICBpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHBhcnNlZERhdGUgPSBuZXcgRGF0ZShkYXRlLmdldFRpbWUoKSk7ZWxzZSBpZiAodHlwZW9mIGRhdGUgIT09IFwic3RyaW5nXCIgJiYgZGF0ZS50b0ZpeGVkICE9PSB1bmRlZmluZWQpIHBhcnNlZERhdGUgPSBuZXcgRGF0ZShkYXRlKTtlbHNlIGlmICh0eXBlb2YgZGF0ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHZhciBmb3JtYXQgPSBnaXZlbkZvcm1hdCB8fCAoY29uZmlnIHx8IGRlZmF1bHRzKS5kYXRlRm9ybWF0O1xuICAgICAgICAgIHZhciBkYXRlc3RyID0gU3RyaW5nKGRhdGUpLnRyaW0oKTtcblxuICAgICAgICAgIGlmIChkYXRlc3RyID09PSBcInRvZGF5XCIpIHtcbiAgICAgICAgICAgIHBhcnNlZERhdGUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgdGltZWxlc3MgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoL1okLy50ZXN0KGRhdGVzdHIpIHx8IC9HTVQkLy50ZXN0KGRhdGVzdHIpKSBwYXJzZWREYXRlID0gbmV3IERhdGUoZGF0ZSk7ZWxzZSBpZiAoY29uZmlnICYmIGNvbmZpZy5wYXJzZURhdGUpIHBhcnNlZERhdGUgPSBjb25maWcucGFyc2VEYXRlKGRhdGUsIGZvcm1hdCk7ZWxzZSB7XG4gICAgICAgICAgICBwYXJzZWREYXRlID0gIWNvbmZpZyB8fCAhY29uZmlnLm5vQ2FsZW5kYXIgPyBuZXcgRGF0ZShuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCksIDAsIDEsIDAsIDAsIDAsIDApIDogbmV3IERhdGUobmV3IERhdGUoKS5zZXRIb3VycygwLCAwLCAwLCAwKSk7XG4gICAgICAgICAgICB2YXIgbWF0Y2hlZCxcbiAgICAgICAgICAgICAgICBvcHMgPSBbXTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG1hdGNoSW5kZXggPSAwLCByZWdleFN0ciA9IFwiXCI7IGkgPCBmb3JtYXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgdmFyIHRva2VuID0gZm9ybWF0W2ldO1xuICAgICAgICAgICAgICB2YXIgaXNCYWNrU2xhc2ggPSB0b2tlbiA9PT0gXCJcXFxcXCI7XG4gICAgICAgICAgICAgIHZhciBlc2NhcGVkID0gZm9ybWF0W2kgLSAxXSA9PT0gXCJcXFxcXCIgfHwgaXNCYWNrU2xhc2g7XG5cbiAgICAgICAgICAgICAgaWYgKHRva2VuUmVnZXhbdG9rZW5dICYmICFlc2NhcGVkKSB7XG4gICAgICAgICAgICAgICAgcmVnZXhTdHIgKz0gdG9rZW5SZWdleFt0b2tlbl07XG4gICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gbmV3IFJlZ0V4cChyZWdleFN0cikuZXhlYyhkYXRlKTtcblxuICAgICAgICAgICAgICAgIGlmIChtYXRjaCAmJiAobWF0Y2hlZCA9IHRydWUpKSB7XG4gICAgICAgICAgICAgICAgICBvcHNbdG9rZW4gIT09IFwiWVwiID8gXCJwdXNoXCIgOiBcInVuc2hpZnRcIl0oe1xuICAgICAgICAgICAgICAgICAgICBmbjogcmV2Rm9ybWF0W3Rva2VuXSxcbiAgICAgICAgICAgICAgICAgICAgdmFsOiBtYXRjaFsrK21hdGNoSW5kZXhdXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzQmFja1NsYXNoKSByZWdleFN0ciArPSBcIi5cIjtcblxuICAgICAgICAgICAgICBvcHMuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjMpIHtcbiAgICAgICAgICAgICAgICB2YXIgZm4gPSBfcmVmMy5mbixcbiAgICAgICAgICAgICAgICAgICAgdmFsID0gX3JlZjMudmFsO1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZWREYXRlID0gZm4ocGFyc2VkRGF0ZSwgdmFsLCBsb2NhbGUpIHx8IHBhcnNlZERhdGU7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwYXJzZWREYXRlID0gbWF0Y2hlZCA/IHBhcnNlZERhdGUgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCEocGFyc2VkRGF0ZSBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKHBhcnNlZERhdGUuZ2V0VGltZSgpKSkpIHtcbiAgICAgICAgICBjb25maWcuZXJyb3JIYW5kbGVyKG5ldyBFcnJvcihcIkludmFsaWQgZGF0ZSBwcm92aWRlZDogXCIgKyBkYXRlX29yaWcpKTtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpbWVsZXNzID09PSB0cnVlKSBwYXJzZWREYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgICAgICByZXR1cm4gcGFyc2VkRGF0ZTtcbiAgICAgIH07XG4gICAgfTtcbiAgICBmdW5jdGlvbiBjb21wYXJlRGF0ZXMoZGF0ZTEsIGRhdGUyLCB0aW1lbGVzcykge1xuICAgICAgaWYgKHRpbWVsZXNzID09PSB2b2lkIDApIHtcbiAgICAgICAgdGltZWxlc3MgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGltZWxlc3MgIT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShkYXRlMS5nZXRUaW1lKCkpLnNldEhvdXJzKDAsIDAsIDAsIDApIC0gbmV3IERhdGUoZGF0ZTIuZ2V0VGltZSgpKS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRhdGUxLmdldFRpbWUoKSAtIGRhdGUyLmdldFRpbWUoKTtcbiAgICB9XG4gICAgdmFyIGdldFdlZWsgPSBmdW5jdGlvbiBnZXRXZWVrKGdpdmVuRGF0ZSkge1xuICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShnaXZlbkRhdGUuZ2V0VGltZSgpKTtcbiAgICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyAzIC0gKGRhdGUuZ2V0RGF5KCkgKyA2KSAlIDcpO1xuICAgICAgdmFyIHdlZWsxID0gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCAwLCA0KTtcbiAgICAgIHJldHVybiAxICsgTWF0aC5yb3VuZCgoKGRhdGUuZ2V0VGltZSgpIC0gd2VlazEuZ2V0VGltZSgpKSAvIDg2NDAwMDAwIC0gMyArICh3ZWVrMS5nZXREYXkoKSArIDYpICUgNykgLyA3KTtcbiAgICB9O1xuICAgIHZhciBpc0JldHdlZW4gPSBmdW5jdGlvbiBpc0JldHdlZW4odHMsIHRzMSwgdHMyKSB7XG4gICAgICByZXR1cm4gdHMgPiBNYXRoLm1pbih0czEsIHRzMikgJiYgdHMgPCBNYXRoLm1heCh0czEsIHRzMik7XG4gICAgfTtcbiAgICB2YXIgZHVyYXRpb24gPSB7XG4gICAgICBEQVk6IDg2NDAwMDAwXG4gICAgfTtcblxuICAgIHZhciBIT09LUyA9IFtcIm9uQ2hhbmdlXCIsIFwib25DbG9zZVwiLCBcIm9uRGF5Q3JlYXRlXCIsIFwib25EZXN0cm95XCIsIFwib25LZXlEb3duXCIsIFwib25Nb250aENoYW5nZVwiLCBcIm9uT3BlblwiLCBcIm9uUGFyc2VDb25maWdcIiwgXCJvblJlYWR5XCIsIFwib25WYWx1ZVVwZGF0ZVwiLCBcIm9uWWVhckNoYW5nZVwiLCBcIm9uUHJlQ2FsZW5kYXJQb3NpdGlvblwiXTtcbiAgICB2YXIgZGVmYXVsdHMgPSB7XG4gICAgICBfZGlzYWJsZTogW10sXG4gICAgICBfZW5hYmxlOiBbXSxcbiAgICAgIGFsbG93SW5wdXQ6IGZhbHNlLFxuICAgICAgYWx0Rm9ybWF0OiBcIkYgaiwgWVwiLFxuICAgICAgYWx0SW5wdXQ6IGZhbHNlLFxuICAgICAgYWx0SW5wdXRDbGFzczogXCJmb3JtLWNvbnRyb2wgaW5wdXRcIixcbiAgICAgIGFuaW1hdGU6IHR5cGVvZiB3aW5kb3cgPT09IFwib2JqZWN0XCIgJiYgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZihcIk1TSUVcIikgPT09IC0xLFxuICAgICAgYXJpYURhdGVGb3JtYXQ6IFwiRiBqLCBZXCIsXG4gICAgICBjbGlja09wZW5zOiB0cnVlLFxuICAgICAgY2xvc2VPblNlbGVjdDogdHJ1ZSxcbiAgICAgIGNvbmp1bmN0aW9uOiBcIiwgXCIsXG4gICAgICBkYXRlRm9ybWF0OiBcIlktbS1kXCIsXG4gICAgICBkZWZhdWx0SG91cjogMTIsXG4gICAgICBkZWZhdWx0TWludXRlOiAwLFxuICAgICAgZGVmYXVsdFNlY29uZHM6IDAsXG4gICAgICBkaXNhYmxlOiBbXSxcbiAgICAgIGRpc2FibGVNb2JpbGU6IGZhbHNlLFxuICAgICAgZW5hYmxlOiBbXSxcbiAgICAgIGVuYWJsZVNlY29uZHM6IGZhbHNlLFxuICAgICAgZW5hYmxlVGltZTogZmFsc2UsXG4gICAgICBlcnJvckhhbmRsZXI6IGZ1bmN0aW9uIGVycm9ySGFuZGxlcihlcnIpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBjb25zb2xlICE9PSBcInVuZGVmaW5lZFwiICYmIGNvbnNvbGUud2FybihlcnIpO1xuICAgICAgfSxcbiAgICAgIGdldFdlZWs6IGdldFdlZWssXG4gICAgICBob3VySW5jcmVtZW50OiAxLFxuICAgICAgaWdub3JlZEZvY3VzRWxlbWVudHM6IFtdLFxuICAgICAgaW5saW5lOiBmYWxzZSxcbiAgICAgIGxvY2FsZTogXCJkZWZhdWx0XCIsXG4gICAgICBtaW51dGVJbmNyZW1lbnQ6IDUsXG4gICAgICBtb2RlOiBcInNpbmdsZVwiLFxuICAgICAgbmV4dEFycm93OiBcIjxzdmcgdmVyc2lvbj0nMS4xJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHhtbG5zOnhsaW5rPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJyB2aWV3Qm94PScwIDAgMTcgMTcnPjxnPjwvZz48cGF0aCBkPSdNMTMuMjA3IDguNDcybC03Ljg1NCA3Ljg1NC0wLjcwNy0wLjcwNyA3LjE0Ni03LjE0Ni03LjE0Ni03LjE0OCAwLjcwNy0wLjcwNyA3Ljg1NCA3Ljg1NHonIC8+PC9zdmc+XCIsXG4gICAgICBub0NhbGVuZGFyOiBmYWxzZSxcbiAgICAgIG5vdzogbmV3IERhdGUoKSxcbiAgICAgIG9uQ2hhbmdlOiBbXSxcbiAgICAgIG9uQ2xvc2U6IFtdLFxuICAgICAgb25EYXlDcmVhdGU6IFtdLFxuICAgICAgb25EZXN0cm95OiBbXSxcbiAgICAgIG9uS2V5RG93bjogW10sXG4gICAgICBvbk1vbnRoQ2hhbmdlOiBbXSxcbiAgICAgIG9uT3BlbjogW10sXG4gICAgICBvblBhcnNlQ29uZmlnOiBbXSxcbiAgICAgIG9uUmVhZHk6IFtdLFxuICAgICAgb25WYWx1ZVVwZGF0ZTogW10sXG4gICAgICBvblllYXJDaGFuZ2U6IFtdLFxuICAgICAgb25QcmVDYWxlbmRhclBvc2l0aW9uOiBbXSxcbiAgICAgIHBsdWdpbnM6IFtdLFxuICAgICAgcG9zaXRpb246IFwiYXV0b1wiLFxuICAgICAgcG9zaXRpb25FbGVtZW50OiB1bmRlZmluZWQsXG4gICAgICBwcmV2QXJyb3c6IFwiPHN2ZyB2ZXJzaW9uPScxLjEnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycgeG1sbnM6eGxpbms9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnIHZpZXdCb3g9JzAgMCAxNyAxNyc+PGc+PC9nPjxwYXRoIGQ9J001LjIwNyA4LjQ3MWw3LjE0NiA3LjE0Ny0wLjcwNyAwLjcwNy03Ljg1My03Ljg1NCA3Ljg1NC03Ljg1MyAwLjcwNyAwLjcwNy03LjE0NyA3LjE0NnonIC8+PC9zdmc+XCIsXG4gICAgICBzaG9ydGhhbmRDdXJyZW50TW9udGg6IGZhbHNlLFxuICAgICAgc2hvd01vbnRoczogMSxcbiAgICAgIHN0YXRpYzogZmFsc2UsXG4gICAgICB0aW1lXzI0aHI6IGZhbHNlLFxuICAgICAgd2Vla051bWJlcnM6IGZhbHNlLFxuICAgICAgd3JhcDogZmFsc2VcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gdG9nZ2xlQ2xhc3MoZWxlbSwgY2xhc3NOYW1lLCBib29sKSB7XG4gICAgICBpZiAoYm9vbCA9PT0gdHJ1ZSkgcmV0dXJuIGVsZW0uY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICAgICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodGFnLCBjbGFzc05hbWUsIGNvbnRlbnQpIHtcbiAgICAgIHZhciBlID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcbiAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZSB8fCBcIlwiO1xuICAgICAgY29udGVudCA9IGNvbnRlbnQgfHwgXCJcIjtcbiAgICAgIGUuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgICAgaWYgKGNvbnRlbnQgIT09IHVuZGVmaW5lZCkgZS50ZXh0Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgICByZXR1cm4gZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xlYXJOb2RlKG5vZGUpIHtcbiAgICAgIHdoaWxlIChub2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgbm9kZS5yZW1vdmVDaGlsZChub2RlLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBmaW5kUGFyZW50KG5vZGUsIGNvbmRpdGlvbikge1xuICAgICAgaWYgKGNvbmRpdGlvbihub2RlKSkgcmV0dXJuIG5vZGU7ZWxzZSBpZiAobm9kZS5wYXJlbnROb2RlKSByZXR1cm4gZmluZFBhcmVudChub2RlLnBhcmVudE5vZGUsIGNvbmRpdGlvbik7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVOdW1iZXJJbnB1dChpbnB1dENsYXNzTmFtZSwgb3B0cykge1xuICAgICAgdmFyIHdyYXBwZXIgPSBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIFwibnVtSW5wdXRXcmFwcGVyXCIpLFxuICAgICAgICAgIG51bUlucHV0ID0gY3JlYXRlRWxlbWVudChcImlucHV0XCIsIFwibnVtSW5wdXQgXCIgKyBpbnB1dENsYXNzTmFtZSksXG4gICAgICAgICAgYXJyb3dVcCA9IGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIFwiYXJyb3dVcFwiKSxcbiAgICAgICAgICBhcnJvd0Rvd24gPSBjcmVhdGVFbGVtZW50KFwic3BhblwiLCBcImFycm93RG93blwiKTtcbiAgICAgIG51bUlucHV0LnR5cGUgPSBcInRleHRcIjtcbiAgICAgIG51bUlucHV0LnBhdHRlcm4gPSBcIlxcXFxkKlwiO1xuICAgICAgaWYgKG9wdHMgIT09IHVuZGVmaW5lZCkgZm9yICh2YXIga2V5IGluIG9wdHMpIHtcbiAgICAgICAgbnVtSW5wdXQuc2V0QXR0cmlidXRlKGtleSwgb3B0c1trZXldKTtcbiAgICAgIH1cbiAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQobnVtSW5wdXQpO1xuICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChhcnJvd1VwKTtcbiAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoYXJyb3dEb3duKTtcbiAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgT2JqZWN0LmFzc2lnbiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBPYmplY3QuYXNzaWduID0gZnVuY3Rpb24gKHRhcmdldCkge1xuICAgICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIkNhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKCkge1xuICAgICAgICAgIHZhciBzb3VyY2UgPSBhcmdzW19pXTtcblxuICAgICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHNvdXJjZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmdzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgIF9sb29wKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgREVCT1VOQ0VEX0NIQU5HRV9NUyA9IDMwMDtcblxuICAgIGZ1bmN0aW9uIEZsYXRwaWNrckluc3RhbmNlKGVsZW1lbnQsIGluc3RhbmNlQ29uZmlnKSB7XG4gICAgICB2YXIgc2VsZiA9IHtcbiAgICAgICAgY29uZmlnOiBPYmplY3QuYXNzaWduKHt9LCBmbGF0cGlja3IuZGVmYXVsdENvbmZpZyksXG4gICAgICAgIGwxMG46IGVuZ2xpc2hcbiAgICAgIH07XG4gICAgICBzZWxmLnBhcnNlRGF0ZSA9IGNyZWF0ZURhdGVQYXJzZXIoe1xuICAgICAgICBjb25maWc6IHNlbGYuY29uZmlnLFxuICAgICAgICBsMTBuOiBzZWxmLmwxMG5cbiAgICAgIH0pO1xuICAgICAgc2VsZi5faGFuZGxlcnMgPSBbXTtcbiAgICAgIHNlbGYuX2JpbmQgPSBiaW5kO1xuICAgICAgc2VsZi5fc2V0SG91cnNGcm9tRGF0ZSA9IHNldEhvdXJzRnJvbURhdGU7XG4gICAgICBzZWxmLl9wb3NpdGlvbkNhbGVuZGFyID0gcG9zaXRpb25DYWxlbmRhcjtcbiAgICAgIHNlbGYuY2hhbmdlTW9udGggPSBjaGFuZ2VNb250aDtcbiAgICAgIHNlbGYuY2hhbmdlWWVhciA9IGNoYW5nZVllYXI7XG4gICAgICBzZWxmLmNsZWFyID0gY2xlYXI7XG4gICAgICBzZWxmLmNsb3NlID0gY2xvc2U7XG4gICAgICBzZWxmLl9jcmVhdGVFbGVtZW50ID0gY3JlYXRlRWxlbWVudDtcbiAgICAgIHNlbGYuZGVzdHJveSA9IGRlc3Ryb3k7XG4gICAgICBzZWxmLmlzRW5hYmxlZCA9IGlzRW5hYmxlZDtcbiAgICAgIHNlbGYuanVtcFRvRGF0ZSA9IGp1bXBUb0RhdGU7XG4gICAgICBzZWxmLm9wZW4gPSBvcGVuO1xuICAgICAgc2VsZi5yZWRyYXcgPSByZWRyYXc7XG4gICAgICBzZWxmLnNldCA9IHNldDtcbiAgICAgIHNlbGYuc2V0RGF0ZSA9IHNldERhdGU7XG4gICAgICBzZWxmLnRvZ2dsZSA9IHRvZ2dsZTtcblxuICAgICAgZnVuY3Rpb24gc2V0dXBIZWxwZXJGdW5jdGlvbnMoKSB7XG4gICAgICAgIHNlbGYudXRpbHMgPSB7XG4gICAgICAgICAgZ2V0RGF5c0luTW9udGg6IGZ1bmN0aW9uIGdldERheXNJbk1vbnRoKG1vbnRoLCB5cikge1xuICAgICAgICAgICAgaWYgKG1vbnRoID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgbW9udGggPSBzZWxmLmN1cnJlbnRNb250aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHlyID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgeXIgPSBzZWxmLmN1cnJlbnRZZWFyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobW9udGggPT09IDEgJiYgKHlyICUgNCA9PT0gMCAmJiB5ciAlIDEwMCAhPT0gMCB8fCB5ciAlIDQwMCA9PT0gMCkpIHJldHVybiAyOTtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmwxMG4uZGF5c0luTW9udGhbbW9udGhdO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgICAgc2VsZi5lbGVtZW50ID0gc2VsZi5pbnB1dCA9IGVsZW1lbnQ7XG4gICAgICAgIHNlbGYuaXNPcGVuID0gZmFsc2U7XG4gICAgICAgIHBhcnNlQ29uZmlnKCk7XG4gICAgICAgIHNldHVwTG9jYWxlKCk7XG4gICAgICAgIHNldHVwSW5wdXRzKCk7XG4gICAgICAgIHNldHVwRGF0ZXMoKTtcbiAgICAgICAgc2V0dXBIZWxwZXJGdW5jdGlvbnMoKTtcbiAgICAgICAgaWYgKCFzZWxmLmlzTW9iaWxlKSBidWlsZCgpO1xuICAgICAgICBiaW5kRXZlbnRzKCk7XG5cbiAgICAgICAgaWYgKHNlbGYuc2VsZWN0ZWREYXRlcy5sZW5ndGggfHwgc2VsZi5jb25maWcubm9DYWxlbmRhcikge1xuICAgICAgICAgIGlmIChzZWxmLmNvbmZpZy5lbmFibGVUaW1lKSB7XG4gICAgICAgICAgICBzZXRIb3Vyc0Zyb21EYXRlKHNlbGYuY29uZmlnLm5vQ2FsZW5kYXIgPyBzZWxmLmxhdGVzdFNlbGVjdGVkRGF0ZU9iaiB8fCBzZWxmLmNvbmZpZy5taW5EYXRlIDogdW5kZWZpbmVkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB1cGRhdGVWYWx1ZShmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRDYWxlbmRhcldpZHRoKCk7XG4gICAgICAgIHNlbGYuc2hvd1RpbWVJbnB1dCA9IHNlbGYuc2VsZWN0ZWREYXRlcy5sZW5ndGggPiAwIHx8IHNlbGYuY29uZmlnLm5vQ2FsZW5kYXI7XG4gICAgICAgIHZhciBpc1NhZmFyaSA9IC9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5cbiAgICAgICAgaWYgKCFzZWxmLmlzTW9iaWxlICYmIGlzU2FmYXJpKSB7XG4gICAgICAgICAgcG9zaXRpb25DYWxlbmRhcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJpZ2dlckV2ZW50KFwib25SZWFkeVwiKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gYmluZFRvSW5zdGFuY2UoZm4pIHtcbiAgICAgICAgcmV0dXJuIGZuLmJpbmQoc2VsZik7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHNldENhbGVuZGFyV2lkdGgoKSB7XG4gICAgICAgIHZhciBjb25maWcgPSBzZWxmLmNvbmZpZztcbiAgICAgICAgaWYgKGNvbmZpZy53ZWVrTnVtYmVycyA9PT0gZmFsc2UgJiYgY29uZmlnLnNob3dNb250aHMgPT09IDEpIHJldHVybjtlbHNlIGlmIChjb25maWcubm9DYWxlbmRhciAhPT0gdHJ1ZSkge1xuICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VsZi5jYWxlbmRhckNvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcbiAgICAgICAgICAgIHNlbGYuY2FsZW5kYXJDb250YWluZXIuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcblxuICAgICAgICAgICAgaWYgKHNlbGYuZGF5c0NvbnRhaW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHZhciBkYXlzV2lkdGggPSAoc2VsZi5kYXlzLm9mZnNldFdpZHRoICsgMSkgKiBjb25maWcuc2hvd01vbnRocztcbiAgICAgICAgICAgICAgc2VsZi5kYXlzQ29udGFpbmVyLnN0eWxlLndpZHRoID0gZGF5c1dpZHRoICsgXCJweFwiO1xuICAgICAgICAgICAgICBzZWxmLmNhbGVuZGFyQ29udGFpbmVyLnN0eWxlLndpZHRoID0gZGF5c1dpZHRoICsgKHNlbGYud2Vla1dyYXBwZXIgIT09IHVuZGVmaW5lZCA/IHNlbGYud2Vla1dyYXBwZXIub2Zmc2V0V2lkdGggOiAwKSArIFwicHhcIjtcbiAgICAgICAgICAgICAgc2VsZi5jYWxlbmRhckNvbnRhaW5lci5zdHlsZS5yZW1vdmVQcm9wZXJ0eShcInZpc2liaWxpdHlcIik7XG4gICAgICAgICAgICAgIHNlbGYuY2FsZW5kYXJDb250YWluZXIuc3R5bGUucmVtb3ZlUHJvcGVydHkoXCJkaXNwbGF5XCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHVwZGF0ZVRpbWUoZSkge1xuICAgICAgICBpZiAoc2VsZi5zZWxlY3RlZERhdGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIGlmIChlICE9PSB1bmRlZmluZWQgJiYgZS50eXBlICE9PSBcImJsdXJcIikge1xuICAgICAgICAgIHRpbWVXcmFwcGVyKGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHByZXZWYWx1ZSA9IHNlbGYuX2lucHV0LnZhbHVlO1xuICAgICAgICBzZXRIb3Vyc0Zyb21JbnB1dHMoKTtcbiAgICAgICAgdXBkYXRlVmFsdWUoKTtcblxuICAgICAgICBpZiAoc2VsZi5faW5wdXQudmFsdWUgIT09IHByZXZWYWx1ZSkge1xuICAgICAgICAgIHNlbGYuX2RlYm91bmNlZENoYW5nZSgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGFtcG0ybWlsaXRhcnkoaG91ciwgYW1QTSkge1xuICAgICAgICByZXR1cm4gaG91ciAlIDEyICsgMTIgKiBpbnQoYW1QTSA9PT0gc2VsZi5sMTBuLmFtUE1bMV0pO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBtaWxpdGFyeTJhbXBtKGhvdXIpIHtcbiAgICAgICAgc3dpdGNoIChob3VyICUgMjQpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgIHJldHVybiAxMjtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gaG91ciAlIDEyO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHNldEhvdXJzRnJvbUlucHV0cygpIHtcbiAgICAgICAgaWYgKHNlbGYuaG91ckVsZW1lbnQgPT09IHVuZGVmaW5lZCB8fCBzZWxmLm1pbnV0ZUVsZW1lbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICB2YXIgaG91cnMgPSAocGFyc2VJbnQoc2VsZi5ob3VyRWxlbWVudC52YWx1ZS5zbGljZSgtMiksIDEwKSB8fCAwKSAlIDI0LFxuICAgICAgICAgICAgbWludXRlcyA9IChwYXJzZUludChzZWxmLm1pbnV0ZUVsZW1lbnQudmFsdWUsIDEwKSB8fCAwKSAlIDYwLFxuICAgICAgICAgICAgc2Vjb25kcyA9IHNlbGYuc2Vjb25kRWxlbWVudCAhPT0gdW5kZWZpbmVkID8gKHBhcnNlSW50KHNlbGYuc2Vjb25kRWxlbWVudC52YWx1ZSwgMTApIHx8IDApICUgNjAgOiAwO1xuXG4gICAgICAgIGlmIChzZWxmLmFtUE0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGhvdXJzID0gYW1wbTJtaWxpdGFyeShob3Vycywgc2VsZi5hbVBNLnRleHRDb250ZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsaW1pdE1pbkhvdXJzID0gc2VsZi5jb25maWcubWluVGltZSAhPT0gdW5kZWZpbmVkIHx8IHNlbGYuY29uZmlnLm1pbkRhdGUgJiYgc2VsZi5taW5EYXRlSGFzVGltZSAmJiBzZWxmLmxhdGVzdFNlbGVjdGVkRGF0ZU9iaiAmJiBjb21wYXJlRGF0ZXMoc2VsZi5sYXRlc3RTZWxlY3RlZERhdGVPYmosIHNlbGYuY29uZmlnLm1pbkRhdGUsIHRydWUpID09PSAwO1xuICAgICAgICB2YXIgbGltaXRNYXhIb3VycyA9IHNlbGYuY29uZmlnLm1heFRpbWUgIT09IHVuZGVmaW5lZCB8fCBzZWxmLmNvbmZpZy5tYXhEYXRlICYmIHNlbGYubWF4RGF0ZUhhc1RpbWUgJiYgc2VsZi5sYXRlc3RTZWxlY3RlZERhdGVPYmogJiYgY29tcGFyZURhdGVzKHNlbGYubGF0ZXN0U2VsZWN0ZWREYXRlT2JqLCBzZWxmLmNvbmZpZy5tYXhEYXRlLCB0cnVlKSA9PT0gMDtcblxuICAgICAgICBpZiAobGltaXRNYXhIb3Vycykge1xuICAgICAgICAgIHZhciBtYXhUaW1lID0gc2VsZi5jb25maWcubWF4VGltZSAhPT0gdW5kZWZpbmVkID8gc2VsZi5jb25maWcubWF4VGltZSA6IHNlbGYuY29uZmlnLm1heERhdGU7XG4gICAgICAgICAgaG91cnMgPSBNYXRoLm1pbihob3VycywgbWF4VGltZS5nZXRIb3VycygpKTtcbiAgICAgICAgICBpZiAoaG91cnMgPT09IG1heFRpbWUuZ2V0SG91cnMoKSkgbWludXRlcyA9IE1hdGgubWluKG1pbnV0ZXMsIG1heFRpbWUuZ2V0TWludXRlcygpKTtcbiAgICAgICAgICBpZiAobWludXRlcyA9PT0gbWF4VGltZS5nZXRNaW51dGVzKCkpIHNlY29uZHMgPSBNYXRoLm1pbihzZWNvbmRzLCBtYXhUaW1lLmdldFNlY29uZHMoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGltaXRNaW5Ib3Vycykge1xuICAgICAgICAgIHZhciBtaW5UaW1lID0gc2VsZi5jb25maWcubWluVGltZSAhPT0gdW5kZWZpbmVkID8gc2VsZi5jb25maWcubWluVGltZSA6IHNlbGYuY29uZmlnLm1pbkRhdGU7XG4gICAgICAgICAgaG91cnMgPSBNYXRoLm1heChob3VycywgbWluVGltZS5nZXRIb3VycygpKTtcbiAgICAgICAgICBpZiAoaG91cnMgPT09IG1pblRpbWUuZ2V0SG91cnMoKSkgbWludXRlcyA9IE1hdGgubWF4KG1pbnV0ZXMsIG1pblRpbWUuZ2V0TWludXRlcygpKTtcbiAgICAgICAgICBpZiAobWludXRlcyA9PT0gbWluVGltZS5nZXRNaW51dGVzKCkpIHNlY29uZHMgPSBNYXRoLm1heChzZWNvbmRzLCBtaW5UaW1lLmdldFNlY29uZHMoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRIb3Vycyhob3VycywgbWludXRlcywgc2Vjb25kcyk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHNldEhvdXJzRnJvbURhdGUoZGF0ZU9iaikge1xuICAgICAgICB2YXIgZGF0ZSA9IGRhdGVPYmogfHwgc2VsZi5sYXRlc3RTZWxlY3RlZERhdGVPYmo7XG4gICAgICAgIGlmIChkYXRlKSBzZXRIb3VycyhkYXRlLmdldEhvdXJzKCksIGRhdGUuZ2V0TWludXRlcygpLCBkYXRlLmdldFNlY29uZHMoKSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHNldERlZmF1bHRIb3VycygpIHtcbiAgICAgICAgdmFyIGhvdXJzID0gc2VsZi5jb25maWcuZGVmYXVsdEhvdXI7XG4gICAgICAgIHZhciBtaW51dGVzID0gc2VsZi5jb25maWcuZGVmYXVsdE1pbnV0ZTtcbiAgICAgICAgdmFyIHNlY29uZHMgPSBzZWxmLmNvbmZpZy5kZWZhdWx0U2Vjb25kcztcblxuICAgICAgICBpZiAoc2VsZi5jb25maWcubWluRGF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFyIG1pbl9ociA9IHNlbGYuY29uZmlnLm1pbkRhdGUuZ2V0SG91cnMoKTtcbiAgICAgICAgICB2YXIgbWluX21pbnV0ZXMgPSBzZWxmLmNvbmZpZy5taW5EYXRlLmdldE1pbnV0ZXMoKTtcbiAgICAgICAgICBob3VycyA9IE1hdGgubWF4KGhvdXJzLCBtaW5faHIpO1xuICAgICAgICAgIGlmIChob3VycyA9PT0gbWluX2hyKSBtaW51dGVzID0gTWF0aC5tYXgobWluX21pbnV0ZXMsIG1pbnV0ZXMpO1xuICAgICAgICAgIGlmIChob3VycyA9PT0gbWluX2hyICYmIG1pbnV0ZXMgPT09IG1pbl9taW51dGVzKSBzZWNvbmRzID0gc2VsZi5jb25maWcubWluRGF0ZS5nZXRTZWNvbmRzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsZi5jb25maWcubWF4RGF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFyIG1heF9ociA9IHNlbGYuY29uZmlnLm1heERhdGUuZ2V0SG91cnMoKTtcbiAgICAgICAgICB2YXIgbWF4X21pbnV0ZXMgPSBzZWxmLmNvbmZpZy5tYXhEYXRlLmdldE1pbnV0ZXMoKTtcbiAgICAgICAgICBob3VycyA9IE1hdGgubWluKGhvdXJzLCBtYXhfaHIpO1xuICAgICAgICAgIGlmIChob3VycyA9PT0gbWF4X2hyKSBtaW51dGVzID0gTWF0aC5taW4obWF4X21pbnV0ZXMsIG1pbnV0ZXMpO1xuICAgICAgICAgIGlmIChob3VycyA9PT0gbWF4X2hyICYmIG1pbnV0ZXMgPT09IG1heF9taW51dGVzKSBzZWNvbmRzID0gc2VsZi5jb25maWcubWF4RGF0ZS5nZXRTZWNvbmRzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRIb3Vycyhob3VycywgbWludXRlcywgc2Vjb25kcyk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHNldEhvdXJzKGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzKSB7XG4gICAgICAgIGlmIChzZWxmLmxhdGVzdFNlbGVjdGVkRGF0ZU9iaiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgc2VsZi5sYXRlc3RTZWxlY3RlZERhdGVPYmouc2V0SG91cnMoaG91cnMgJSAyNCwgbWludXRlcywgc2Vjb25kcyB8fCAwLCAwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2VsZi5ob3VyRWxlbWVudCB8fCAhc2VsZi5taW51dGVFbGVtZW50IHx8IHNlbGYuaXNNb2JpbGUpIHJldHVybjtcbiAgICAgICAgc2VsZi5ob3VyRWxlbWVudC52YWx1ZSA9IHBhZCghc2VsZi5jb25maWcudGltZV8yNGhyID8gKDEyICsgaG91cnMpICUgMTIgKyAxMiAqIGludChob3VycyAlIDEyID09PSAwKSA6IGhvdXJzKTtcbiAgICAgICAgc2VsZi5taW51dGVFbGVtZW50LnZhbHVlID0gcGFkKG1pbnV0ZXMpO1xuICAgICAgICBpZiAoc2VsZi5hbVBNICE9PSB1bmRlZmluZWQpIHNlbGYuYW1QTS50ZXh0Q29udGVudCA9IHNlbGYubDEwbi5hbVBNW2ludChob3VycyA+PSAxMildO1xuICAgICAgICBpZiAoc2VsZi5zZWNvbmRFbGVtZW50ICE9PSB1bmRlZmluZWQpIHNlbGYuc2Vjb25kRWxlbWVudC52YWx1ZSA9IHBhZChzZWNvbmRzKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gb25ZZWFySW5wdXQoZXZlbnQpIHtcbiAgICAgICAgdmFyIHllYXIgPSBwYXJzZUludChldmVudC50YXJnZXQudmFsdWUpICsgKGV2ZW50LmRlbHRhIHx8IDApO1xuXG4gICAgICAgIGlmICh5ZWFyIC8gMTAwMCA+IDEgfHwgZXZlbnQua2V5ID09PSBcIkVudGVyXCIgJiYgIS9bXlxcZF0vLnRlc3QoeWVhci50b1N0cmluZygpKSkge1xuICAgICAgICAgIGNoYW5nZVllYXIoeWVhcik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gYmluZChlbGVtZW50LCBldmVudCwgaGFuZGxlciwgb3B0aW9ucykge1xuICAgICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBBcnJheSkgcmV0dXJuIGV2ZW50LmZvckVhY2goZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgcmV0dXJuIGJpbmQoZWxlbWVudCwgZXYsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBBcnJheSkgcmV0dXJuIGVsZW1lbnQuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICByZXR1cm4gYmluZChlbCwgZXZlbnQsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBoYW5kbGVyLCBvcHRpb25zKTtcblxuICAgICAgICBzZWxmLl9oYW5kbGVycy5wdXNoKHtcbiAgICAgICAgICBlbGVtZW50OiBlbGVtZW50LFxuICAgICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgICBoYW5kbGVyOiBoYW5kbGVyLFxuICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIG9uQ2xpY2soaGFuZGxlcikge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICAgIGV2dC53aGljaCA9PT0gMSAmJiBoYW5kbGVyKGV2dCk7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHRyaWdnZXJDaGFuZ2UoKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChcIm9uQ2hhbmdlXCIpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBiaW5kRXZlbnRzKCkge1xuICAgICAgICBpZiAoc2VsZi5jb25maWcud3JhcCkge1xuICAgICAgICAgIFtcIm9wZW5cIiwgXCJjbG9zZVwiLCBcInRvZ2dsZVwiLCBcImNsZWFyXCJdLmZvckVhY2goZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChzZWxmLmVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltkYXRhLVwiICsgZXZ0ICsgXCJdXCIpLCBmdW5jdGlvbiAoZWwpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGJpbmQoZWwsIFwiY2xpY2tcIiwgc2VsZltldnRdKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbGYuaXNNb2JpbGUpIHtcbiAgICAgICAgICBzZXR1cE1vYmlsZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkZWJvdW5jZWRSZXNpemUgPSBkZWJvdW5jZShvblJlc2l6ZSwgNTApO1xuICAgICAgICBzZWxmLl9kZWJvdW5jZWRDaGFuZ2UgPSBkZWJvdW5jZSh0cmlnZ2VyQ2hhbmdlLCBERUJPVU5DRURfQ0hBTkdFX01TKTtcbiAgICAgICAgaWYgKHNlbGYuZGF5c0NvbnRhaW5lciAmJiAhL2lQaG9uZXxpUGFkfGlQb2QvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSBiaW5kKHNlbGYuZGF5c0NvbnRhaW5lciwgXCJtb3VzZW92ZXJcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICBpZiAoc2VsZi5jb25maWcubW9kZSA9PT0gXCJyYW5nZVwiKSBvbk1vdXNlT3ZlcihlLnRhcmdldCk7XG4gICAgICAgIH0pO1xuICAgICAgICBiaW5kKHdpbmRvdy5kb2N1bWVudC5ib2R5LCBcImtleWRvd25cIiwgb25LZXlEb3duKTtcbiAgICAgICAgaWYgKCFzZWxmLmNvbmZpZy5zdGF0aWMpIGJpbmQoc2VsZi5faW5wdXQsIFwia2V5ZG93blwiLCBvbktleURvd24pO1xuICAgICAgICBpZiAoIXNlbGYuY29uZmlnLmlubGluZSAmJiAhc2VsZi5jb25maWcuc3RhdGljKSBiaW5kKHdpbmRvdywgXCJyZXNpemVcIiwgZGVib3VuY2VkUmVzaXplKTtcbiAgICAgICAgaWYgKHdpbmRvdy5vbnRvdWNoc3RhcnQgIT09IHVuZGVmaW5lZCkgYmluZCh3aW5kb3cuZG9jdW1lbnQsIFwiY2xpY2tcIiwgZG9jdW1lbnRDbGljayk7ZWxzZSBiaW5kKHdpbmRvdy5kb2N1bWVudCwgXCJtb3VzZWRvd25cIiwgb25DbGljayhkb2N1bWVudENsaWNrKSk7XG4gICAgICAgIGJpbmQod2luZG93LmRvY3VtZW50LCBcImZvY3VzXCIsIGRvY3VtZW50Q2xpY2ssIHtcbiAgICAgICAgICBjYXB0dXJlOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChzZWxmLmNvbmZpZy5jbGlja09wZW5zID09PSB0cnVlKSB7XG4gICAgICAgICAgYmluZChzZWxmLl9pbnB1dCwgXCJmb2N1c1wiLCBzZWxmLm9wZW4pO1xuICAgICAgICAgIGJpbmQoc2VsZi5faW5wdXQsIFwibW91c2Vkb3duXCIsIG9uQ2xpY2soc2VsZi5vcGVuKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsZi5kYXlzQ29udGFpbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBiaW5kKHNlbGYubW9udGhOYXYsIFwibW91c2Vkb3duXCIsIG9uQ2xpY2sob25Nb250aE5hdkNsaWNrKSk7XG4gICAgICAgICAgYmluZChzZWxmLm1vbnRoTmF2LCBbXCJrZXl1cFwiLCBcImluY3JlbWVudFwiXSwgb25ZZWFySW5wdXQpO1xuICAgICAgICAgIGJpbmQoc2VsZi5kYXlzQ29udGFpbmVyLCBcIm1vdXNlZG93blwiLCBvbkNsaWNrKHNlbGVjdERhdGUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxmLnRpbWVDb250YWluZXIgIT09IHVuZGVmaW5lZCAmJiBzZWxmLm1pbnV0ZUVsZW1lbnQgIT09IHVuZGVmaW5lZCAmJiBzZWxmLmhvdXJFbGVtZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB2YXIgc2VsVGV4dCA9IGZ1bmN0aW9uIHNlbFRleHQoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGUudGFyZ2V0LnNlbGVjdCgpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBiaW5kKHNlbGYudGltZUNvbnRhaW5lciwgW1wiaW5jcmVtZW50XCJdLCB1cGRhdGVUaW1lKTtcbiAgICAgICAgICBiaW5kKHNlbGYudGltZUNvbnRhaW5lciwgXCJibHVyXCIsIHVwZGF0ZVRpbWUsIHtcbiAgICAgICAgICAgIGNhcHR1cmU6IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBiaW5kKHNlbGYudGltZUNvbnRhaW5lciwgXCJtb3VzZWRvd25cIiwgb25DbGljayh0aW1lSW5jcmVtZW50KSk7XG4gICAgICAgICAgYmluZChbc2VsZi5ob3VyRWxlbWVudCwgc2VsZi5taW51dGVFbGVtZW50XSwgW1wiZm9jdXNcIiwgXCJjbGlja1wiXSwgc2VsVGV4dCk7XG4gICAgICAgICAgaWYgKHNlbGYuc2Vjb25kRWxlbWVudCAhPT0gdW5kZWZpbmVkKSBiaW5kKHNlbGYuc2Vjb25kRWxlbWVudCwgXCJmb2N1c1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZi5zZWNvbmRFbGVtZW50ICYmIHNlbGYuc2Vjb25kRWxlbWVudC5zZWxlY3QoKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChzZWxmLmFtUE0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYmluZChzZWxmLmFtUE0sIFwibW91c2Vkb3duXCIsIG9uQ2xpY2soZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgdXBkYXRlVGltZShlKTtcbiAgICAgICAgICAgICAgdHJpZ2dlckNoYW5nZSgpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBqdW1wVG9EYXRlKGp1bXBEYXRlKSB7XG4gICAgICAgIHZhciBqdW1wVG8gPSBqdW1wRGF0ZSAhPT0gdW5kZWZpbmVkID8gc2VsZi5wYXJzZURhdGUoanVtcERhdGUpIDogc2VsZi5sYXRlc3RTZWxlY3RlZERhdGVPYmogfHwgKHNlbGYuY29uZmlnLm1pbkRhdGUgJiYgc2VsZi5jb25maWcubWluRGF0ZSA+IHNlbGYubm93ID8gc2VsZi5jb25maWcubWluRGF0ZSA6IHNlbGYuY29uZmlnLm1heERhdGUgJiYgc2VsZi5jb25maWcubWF4RGF0ZSA8IHNlbGYubm93ID8gc2VsZi5jb25maWcubWF4RGF0ZSA6IHNlbGYubm93KTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChqdW1wVG8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc2VsZi5jdXJyZW50WWVhciA9IGp1bXBUby5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgICAgc2VsZi5jdXJyZW50TW9udGggPSBqdW1wVG8uZ2V0TW9udGgoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBlLm1lc3NhZ2UgPSBcIkludmFsaWQgZGF0ZSBzdXBwbGllZDogXCIgKyBqdW1wVG87XG4gICAgICAgICAgc2VsZi5jb25maWcuZXJyb3JIYW5kbGVyKGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VsZi5yZWRyYXcoKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdGltZUluY3JlbWVudChlKSB7XG4gICAgICAgIGlmICh+ZS50YXJnZXQuY2xhc3NOYW1lLmluZGV4T2YoXCJhcnJvd1wiKSkgaW5jcmVtZW50TnVtSW5wdXQoZSwgZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiYXJyb3dVcFwiKSA/IDEgOiAtMSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGluY3JlbWVudE51bUlucHV0KGUsIGRlbHRhLCBpbnB1dEVsZW0pIHtcbiAgICAgICAgdmFyIHRhcmdldCA9IGUgJiYgZS50YXJnZXQ7XG4gICAgICAgIHZhciBpbnB1dCA9IGlucHV0RWxlbSB8fCB0YXJnZXQgJiYgdGFyZ2V0LnBhcmVudE5vZGUgJiYgdGFyZ2V0LnBhcmVudE5vZGUuZmlyc3RDaGlsZDtcbiAgICAgICAgdmFyIGV2ZW50ID0gY3JlYXRlRXZlbnQoXCJpbmNyZW1lbnRcIik7XG4gICAgICAgIGV2ZW50LmRlbHRhID0gZGVsdGE7XG4gICAgICAgIGlucHV0ICYmIGlucHV0LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgICAgdmFyIGZyYWdtZW50ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgICAgICAgc2VsZi5jYWxlbmRhckNvbnRhaW5lciA9IGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgXCJmbGF0cGlja3ItY2FsZW5kYXJcIik7XG4gICAgICAgIHNlbGYuY2FsZW5kYXJDb250YWluZXIudGFiSW5kZXggPSAtMTtcblxuICAgICAgICBpZiAoIXNlbGYuY29uZmlnLm5vQ2FsZW5kYXIpIHtcbiAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChidWlsZE1vbnRoTmF2KCkpO1xuICAgICAgICAgIHNlbGYuaW5uZXJDb250YWluZXIgPSBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIFwiZmxhdHBpY2tyLWlubmVyQ29udGFpbmVyXCIpO1xuXG4gICAgICAgICAgaWYgKHNlbGYuY29uZmlnLndlZWtOdW1iZXJzKSB7XG4gICAgICAgICAgICB2YXIgX2J1aWxkV2Vla3MgPSBidWlsZFdlZWtzKCksXG4gICAgICAgICAgICAgICAgd2Vla1dyYXBwZXIgPSBfYnVpbGRXZWVrcy53ZWVrV3JhcHBlcixcbiAgICAgICAgICAgICAgICB3ZWVrTnVtYmVycyA9IF9idWlsZFdlZWtzLndlZWtOdW1iZXJzO1xuXG4gICAgICAgICAgICBzZWxmLmlubmVyQ29udGFpbmVyLmFwcGVuZENoaWxkKHdlZWtXcmFwcGVyKTtcbiAgICAgICAgICAgIHNlbGYud2Vla051bWJlcnMgPSB3ZWVrTnVtYmVycztcbiAgICAgICAgICAgIHNlbGYud2Vla1dyYXBwZXIgPSB3ZWVrV3JhcHBlcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZWxmLnJDb250YWluZXIgPSBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIFwiZmxhdHBpY2tyLXJDb250YWluZXJcIik7XG4gICAgICAgICAgc2VsZi5yQ29udGFpbmVyLmFwcGVuZENoaWxkKGJ1aWxkV2Vla2RheXMoKSk7XG5cbiAgICAgICAgICBpZiAoIXNlbGYuZGF5c0NvbnRhaW5lcikge1xuICAgICAgICAgICAgc2VsZi5kYXlzQ29udGFpbmVyID0gY3JlYXRlRWxlbWVudChcImRpdlwiLCBcImZsYXRwaWNrci1kYXlzXCIpO1xuICAgICAgICAgICAgc2VsZi5kYXlzQ29udGFpbmVyLnRhYkluZGV4ID0gLTE7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnVpbGREYXlzKCk7XG4gICAgICAgICAgc2VsZi5yQ29udGFpbmVyLmFwcGVuZENoaWxkKHNlbGYuZGF5c0NvbnRhaW5lcik7XG4gICAgICAgICAgc2VsZi5pbm5lckNvbnRhaW5lci5hcHBlbmRDaGlsZChzZWxmLnJDb250YWluZXIpO1xuICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKHNlbGYuaW5uZXJDb250YWluZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbGYuY29uZmlnLmVuYWJsZVRpbWUpIHtcbiAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChidWlsZFRpbWUoKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0b2dnbGVDbGFzcyhzZWxmLmNhbGVuZGFyQ29udGFpbmVyLCBcInJhbmdlTW9kZVwiLCBzZWxmLmNvbmZpZy5tb2RlID09PSBcInJhbmdlXCIpO1xuICAgICAgICB0b2dnbGVDbGFzcyhzZWxmLmNhbGVuZGFyQ29udGFpbmVyLCBcImFuaW1hdGVcIiwgc2VsZi5jb25maWcuYW5pbWF0ZSA9PT0gdHJ1ZSk7XG4gICAgICAgIHRvZ2dsZUNsYXNzKHNlbGYuY2FsZW5kYXJDb250YWluZXIsIFwibXVsdGlNb250aFwiLCBzZWxmLmNvbmZpZy5zaG93TW9udGhzID4gMSk7XG4gICAgICAgIHNlbGYuY2FsZW5kYXJDb250YWluZXIuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpO1xuICAgICAgICB2YXIgY3VzdG9tQXBwZW5kID0gc2VsZi5jb25maWcuYXBwZW5kVG8gIT09IHVuZGVmaW5lZCAmJiBzZWxmLmNvbmZpZy5hcHBlbmRUby5ub2RlVHlwZSAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChzZWxmLmNvbmZpZy5pbmxpbmUgfHwgc2VsZi5jb25maWcuc3RhdGljKSB7XG4gICAgICAgICAgc2VsZi5jYWxlbmRhckNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKHNlbGYuY29uZmlnLmlubGluZSA/IFwiaW5saW5lXCIgOiBcInN0YXRpY1wiKTtcblxuICAgICAgICAgIGlmIChzZWxmLmNvbmZpZy5pbmxpbmUpIHtcbiAgICAgICAgICAgIGlmICghY3VzdG9tQXBwZW5kICYmIHNlbGYuZWxlbWVudC5wYXJlbnROb2RlKSBzZWxmLmVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2VsZi5jYWxlbmRhckNvbnRhaW5lciwgc2VsZi5faW5wdXQubmV4dFNpYmxpbmcpO2Vsc2UgaWYgKHNlbGYuY29uZmlnLmFwcGVuZFRvICE9PSB1bmRlZmluZWQpIHNlbGYuY29uZmlnLmFwcGVuZFRvLmFwcGVuZENoaWxkKHNlbGYuY2FsZW5kYXJDb250YWluZXIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzZWxmLmNvbmZpZy5zdGF0aWMpIHtcbiAgICAgICAgICAgIHZhciB3cmFwcGVyID0gY3JlYXRlRWxlbWVudChcImRpdlwiLCBcImZsYXRwaWNrci13cmFwcGVyXCIpO1xuICAgICAgICAgICAgaWYgKHNlbGYuZWxlbWVudC5wYXJlbnROb2RlKSBzZWxmLmVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUod3JhcHBlciwgc2VsZi5lbGVtZW50KTtcbiAgICAgICAgICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoc2VsZi5lbGVtZW50KTtcbiAgICAgICAgICAgIGlmIChzZWxmLmFsdElucHV0KSB3cmFwcGVyLmFwcGVuZENoaWxkKHNlbGYuYWx0SW5wdXQpO1xuICAgICAgICAgICAgd3JhcHBlci5hcHBlbmRDaGlsZChzZWxmLmNhbGVuZGFyQ29udGFpbmVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXNlbGYuY29uZmlnLnN0YXRpYyAmJiAhc2VsZi5jb25maWcuaW5saW5lKSAoc2VsZi5jb25maWcuYXBwZW5kVG8gIT09IHVuZGVmaW5lZCA/IHNlbGYuY29uZmlnLmFwcGVuZFRvIDogd2luZG93LmRvY3VtZW50LmJvZHkpLmFwcGVuZENoaWxkKHNlbGYuY2FsZW5kYXJDb250YWluZXIpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjcmVhdGVEYXkoY2xhc3NOYW1lLCBkYXRlLCBkYXlOdW1iZXIsIGkpIHtcbiAgICAgICAgdmFyIGRhdGVJc0VuYWJsZWQgPSBpc0VuYWJsZWQoZGF0ZSwgdHJ1ZSksXG4gICAgICAgICAgICBkYXlFbGVtZW50ID0gY3JlYXRlRWxlbWVudChcInNwYW5cIiwgXCJmbGF0cGlja3ItZGF5IFwiICsgY2xhc3NOYW1lLCBkYXRlLmdldERhdGUoKS50b1N0cmluZygpKTtcbiAgICAgICAgZGF5RWxlbWVudC5kYXRlT2JqID0gZGF0ZTtcbiAgICAgICAgZGF5RWxlbWVudC4kaSA9IGk7XG4gICAgICAgIGRheUVsZW1lbnQuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBzZWxmLmZvcm1hdERhdGUoZGF0ZSwgc2VsZi5jb25maWcuYXJpYURhdGVGb3JtYXQpKTtcblxuICAgICAgICBpZiAoY2xhc3NOYW1lLmluZGV4T2YoXCJoaWRkZW5cIikgPT09IC0xICYmIGNvbXBhcmVEYXRlcyhkYXRlLCBzZWxmLm5vdykgPT09IDApIHtcbiAgICAgICAgICBzZWxmLnRvZGF5RGF0ZUVsZW0gPSBkYXlFbGVtZW50O1xuICAgICAgICAgIGRheUVsZW1lbnQuY2xhc3NMaXN0LmFkZChcInRvZGF5XCIpO1xuICAgICAgICAgIGRheUVsZW1lbnQuc2V0QXR0cmlidXRlKFwiYXJpYS1jdXJyZW50XCIsIFwiZGF0ZVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRlSXNFbmFibGVkKSB7XG4gICAgICAgICAgZGF5RWxlbWVudC50YWJJbmRleCA9IC0xO1xuXG4gICAgICAgICAgaWYgKGlzRGF0ZVNlbGVjdGVkKGRhdGUpKSB7XG4gICAgICAgICAgICBkYXlFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJzZWxlY3RlZFwiKTtcbiAgICAgICAgICAgIHNlbGYuc2VsZWN0ZWREYXRlRWxlbSA9IGRheUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGlmIChzZWxmLmNvbmZpZy5tb2RlID09PSBcInJhbmdlXCIpIHtcbiAgICAgICAgICAgICAgdG9nZ2xlQ2xhc3MoZGF5RWxlbWVudCwgXCJzdGFydFJhbmdlXCIsIHNlbGYuc2VsZWN0ZWREYXRlc1swXSAmJiBjb21wYXJlRGF0ZXMoZGF0ZSwgc2VsZi5zZWxlY3RlZERhdGVzWzBdLCB0cnVlKSA9PT0gMCk7XG4gICAgICAgICAgICAgIHRvZ2dsZUNsYXNzKGRheUVsZW1lbnQsIFwiZW5kUmFuZ2VcIiwgc2VsZi5zZWxlY3RlZERhdGVzWzFdICYmIGNvbXBhcmVEYXRlcyhkYXRlLCBzZWxmLnNlbGVjdGVkRGF0ZXNbMV0sIHRydWUpID09PSAwKTtcbiAgICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSA9PT0gXCJuZXh0TW9udGhEYXlcIikgZGF5RWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiaW5SYW5nZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGF5RWxlbWVudC5jbGFzc0xpc3QuYWRkKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsZi5jb25maWcubW9kZSA9PT0gXCJyYW5nZVwiKSB7XG4gICAgICAgICAgaWYgKGlzRGF0ZUluUmFuZ2UoZGF0ZSkgJiYgIWlzRGF0ZVNlbGVjdGVkKGRhdGUpKSBkYXlFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJpblJhbmdlXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbGYud2Vla051bWJlcnMgJiYgc2VsZi5jb25maWcuc2hvd01vbnRocyA9PT0gMSAmJiBjbGFzc05hbWUgIT09IFwicHJldk1vbnRoRGF5XCIgJiYgZGF5TnVtYmVyICUgNyA9PT0gMSkge1xuICAgICAgICAgIHNlbGYud2Vla051bWJlcnMuaW5zZXJ0QWRqYWNlbnRIVE1MKFwiYmVmb3JlZW5kXCIsIFwiPHNwYW4gY2xhc3M9J2ZsYXRwaWNrci1kYXknPlwiICsgc2VsZi5jb25maWcuZ2V0V2VlayhkYXRlKSArIFwiPC9zcGFuPlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyaWdnZXJFdmVudChcIm9uRGF5Q3JlYXRlXCIsIGRheUVsZW1lbnQpO1xuICAgICAgICByZXR1cm4gZGF5RWxlbWVudDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZm9jdXNPbkRheUVsZW0odGFyZ2V0Tm9kZSkge1xuICAgICAgICB0YXJnZXROb2RlLmZvY3VzKCk7XG4gICAgICAgIGlmIChzZWxmLmNvbmZpZy5tb2RlID09PSBcInJhbmdlXCIpIG9uTW91c2VPdmVyKHRhcmdldE5vZGUpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBnZXRGaXJzdEF2YWlsYWJsZURheShkZWx0YSkge1xuICAgICAgICB2YXIgc3RhcnRNb250aCA9IGRlbHRhID4gMCA/IDAgOiBzZWxmLmNvbmZpZy5zaG93TW9udGhzIC0gMTtcbiAgICAgICAgdmFyIGVuZE1vbnRoID0gZGVsdGEgPiAwID8gc2VsZi5jb25maWcuc2hvd01vbnRocyA6IC0xO1xuXG4gICAgICAgIGZvciAodmFyIG0gPSBzdGFydE1vbnRoOyBtICE9IGVuZE1vbnRoOyBtICs9IGRlbHRhKSB7XG4gICAgICAgICAgdmFyIG1vbnRoID0gc2VsZi5kYXlzQ29udGFpbmVyLmNoaWxkcmVuW21dO1xuICAgICAgICAgIHZhciBzdGFydEluZGV4ID0gZGVsdGEgPiAwID8gMCA6IG1vbnRoLmNoaWxkcmVuLmxlbmd0aCAtIDE7XG4gICAgICAgICAgdmFyIGVuZEluZGV4ID0gZGVsdGEgPiAwID8gbW9udGguY2hpbGRyZW4ubGVuZ3RoIDogLTE7XG5cbiAgICAgICAgICBmb3IgKHZhciBpID0gc3RhcnRJbmRleDsgaSAhPSBlbmRJbmRleDsgaSArPSBkZWx0YSkge1xuICAgICAgICAgICAgdmFyIGMgPSBtb250aC5jaGlsZHJlbltpXTtcbiAgICAgICAgICAgIGlmIChjLmNsYXNzTmFtZS5pbmRleE9mKFwiaGlkZGVuXCIpID09PSAtMSAmJiBpc0VuYWJsZWQoYy5kYXRlT2JqKSkgcmV0dXJuIGM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZ2V0TmV4dEF2YWlsYWJsZURheShjdXJyZW50LCBkZWx0YSkge1xuICAgICAgICB2YXIgZ2l2ZW5Nb250aCA9IGN1cnJlbnQuY2xhc3NOYW1lLmluZGV4T2YoXCJNb250aFwiKSA9PT0gLTEgPyBjdXJyZW50LmRhdGVPYmouZ2V0TW9udGgoKSA6IHNlbGYuY3VycmVudE1vbnRoO1xuICAgICAgICB2YXIgZW5kTW9udGggPSBkZWx0YSA+IDAgPyBzZWxmLmNvbmZpZy5zaG93TW9udGhzIDogLTE7XG4gICAgICAgIHZhciBsb29wRGVsdGEgPSBkZWx0YSA+IDAgPyAxIDogLTE7XG5cbiAgICAgICAgZm9yICh2YXIgbSA9IGdpdmVuTW9udGggLSBzZWxmLmN1cnJlbnRNb250aDsgbSAhPSBlbmRNb250aDsgbSArPSBsb29wRGVsdGEpIHtcbiAgICAgICAgICB2YXIgbW9udGggPSBzZWxmLmRheXNDb250YWluZXIuY2hpbGRyZW5bbV07XG4gICAgICAgICAgdmFyIHN0YXJ0SW5kZXggPSBnaXZlbk1vbnRoIC0gc2VsZi5jdXJyZW50TW9udGggPT09IG0gPyBjdXJyZW50LiRpICsgZGVsdGEgOiBkZWx0YSA8IDAgPyBtb250aC5jaGlsZHJlbi5sZW5ndGggLSAxIDogMDtcbiAgICAgICAgICB2YXIgbnVtTW9udGhEYXlzID0gbW9udGguY2hpbGRyZW4ubGVuZ3RoO1xuXG4gICAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0SW5kZXg7IGkgPj0gMCAmJiBpIDwgbnVtTW9udGhEYXlzICYmIGkgIT0gKGRlbHRhID4gMCA/IG51bU1vbnRoRGF5cyA6IC0xKTsgaSArPSBsb29wRGVsdGEpIHtcbiAgICAgICAgICAgIHZhciBjID0gbW9udGguY2hpbGRyZW5baV07XG4gICAgICAgICAgICBpZiAoYy5jbGFzc05hbWUuaW5kZXhPZihcImhpZGRlblwiKSA9PT0gLTEgJiYgaXNFbmFibGVkKGMuZGF0ZU9iaikgJiYgTWF0aC5hYnMoY3VycmVudC4kaSAtIGkpID49IE1hdGguYWJzKGRlbHRhKSkgcmV0dXJuIGZvY3VzT25EYXlFbGVtKGMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGYuY2hhbmdlTW9udGgobG9vcERlbHRhKTtcbiAgICAgICAgZm9jdXNPbkRheShnZXRGaXJzdEF2YWlsYWJsZURheShsb29wRGVsdGEpLCAwKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZm9jdXNPbkRheShjdXJyZW50LCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIGRheUZvY3VzZWQgPSBpc0luVmlldyhkb2N1bWVudC5hY3RpdmVFbGVtZW50IHx8IGRvY3VtZW50LmJvZHkpO1xuICAgICAgICB2YXIgc3RhcnRFbGVtID0gY3VycmVudCAhPT0gdW5kZWZpbmVkID8gY3VycmVudCA6IGRheUZvY3VzZWQgPyBkb2N1bWVudC5hY3RpdmVFbGVtZW50IDogc2VsZi5zZWxlY3RlZERhdGVFbGVtICE9PSB1bmRlZmluZWQgJiYgaXNJblZpZXcoc2VsZi5zZWxlY3RlZERhdGVFbGVtKSA/IHNlbGYuc2VsZWN0ZWREYXRlRWxlbSA6IHNlbGYudG9kYXlEYXRlRWxlbSAhPT0gdW5kZWZpbmVkICYmIGlzSW5WaWV3KHNlbGYudG9kYXlEYXRlRWxlbSkgPyBzZWxmLnRvZGF5RGF0ZUVsZW0gOiBnZXRGaXJzdEF2YWlsYWJsZURheShvZmZzZXQgPiAwID8gMSA6IC0xKTtcbiAgICAgICAgaWYgKHN0YXJ0RWxlbSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gc2VsZi5faW5wdXQuZm9jdXMoKTtcbiAgICAgICAgaWYgKCFkYXlGb2N1c2VkKSByZXR1cm4gZm9jdXNPbkRheUVsZW0oc3RhcnRFbGVtKTtcbiAgICAgICAgZ2V0TmV4dEF2YWlsYWJsZURheShzdGFydEVsZW0sIG9mZnNldCk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGJ1aWxkTW9udGhEYXlzKHllYXIsIG1vbnRoKSB7XG4gICAgICAgIHZhciBmaXJzdE9mTW9udGggPSAobmV3IERhdGUoeWVhciwgbW9udGgsIDEpLmdldERheSgpIC0gc2VsZi5sMTBuLmZpcnN0RGF5T2ZXZWVrICsgNykgJSA3O1xuICAgICAgICB2YXIgcHJldk1vbnRoRGF5cyA9IHNlbGYudXRpbHMuZ2V0RGF5c0luTW9udGgoKG1vbnRoIC0gMSArIDEyKSAlIDEyKTtcbiAgICAgICAgdmFyIGRheXNJbk1vbnRoID0gc2VsZi51dGlscy5nZXREYXlzSW5Nb250aChtb250aCksXG4gICAgICAgICAgICBkYXlzID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcbiAgICAgICAgICAgIGlzTXVsdGlNb250aCA9IHNlbGYuY29uZmlnLnNob3dNb250aHMgPiAxLFxuICAgICAgICAgICAgcHJldk1vbnRoRGF5Q2xhc3MgPSBpc011bHRpTW9udGggPyBcInByZXZNb250aERheSBoaWRkZW5cIiA6IFwicHJldk1vbnRoRGF5XCIsXG4gICAgICAgICAgICBuZXh0TW9udGhEYXlDbGFzcyA9IGlzTXVsdGlNb250aCA/IFwibmV4dE1vbnRoRGF5IGhpZGRlblwiIDogXCJuZXh0TW9udGhEYXlcIjtcbiAgICAgICAgdmFyIGRheU51bWJlciA9IHByZXZNb250aERheXMgKyAxIC0gZmlyc3RPZk1vbnRoLFxuICAgICAgICAgICAgZGF5SW5kZXggPSAwO1xuXG4gICAgICAgIGZvciAoOyBkYXlOdW1iZXIgPD0gcHJldk1vbnRoRGF5czsgZGF5TnVtYmVyKyssIGRheUluZGV4KyspIHtcbiAgICAgICAgICBkYXlzLmFwcGVuZENoaWxkKGNyZWF0ZURheShwcmV2TW9udGhEYXlDbGFzcywgbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXlOdW1iZXIpLCBkYXlOdW1iZXIsIGRheUluZGV4KSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGRheU51bWJlciA9IDE7IGRheU51bWJlciA8PSBkYXlzSW5Nb250aDsgZGF5TnVtYmVyKyssIGRheUluZGV4KyspIHtcbiAgICAgICAgICBkYXlzLmFwcGVuZENoaWxkKGNyZWF0ZURheShcIlwiLCBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF5TnVtYmVyKSwgZGF5TnVtYmVyLCBkYXlJbmRleCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgZGF5TnVtID0gZGF5c0luTW9udGggKyAxOyBkYXlOdW0gPD0gNDIgLSBmaXJzdE9mTW9udGggJiYgKHNlbGYuY29uZmlnLnNob3dNb250aHMgPT09IDEgfHwgZGF5SW5kZXggJSA3ICE9PSAwKTsgZGF5TnVtKyssIGRheUluZGV4KyspIHtcbiAgICAgICAgICBkYXlzLmFwcGVuZENoaWxkKGNyZWF0ZURheShuZXh0TW9udGhEYXlDbGFzcywgbmV3IERhdGUoeWVhciwgbW9udGggKyAxLCBkYXlOdW0gJSBkYXlzSW5Nb250aCksIGRheU51bSwgZGF5SW5kZXgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBkYXlDb250YWluZXIgPSBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIFwiZGF5Q29udGFpbmVyXCIpO1xuICAgICAgICBkYXlDb250YWluZXIuYXBwZW5kQ2hpbGQoZGF5cyk7XG4gICAgICAgIHJldHVybiBkYXlDb250YWluZXI7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGJ1aWxkRGF5cygpIHtcbiAgICAgICAgaWYgKHNlbGYuZGF5c0NvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY2xlYXJOb2RlKHNlbGYuZGF5c0NvbnRhaW5lcik7XG4gICAgICAgIGlmIChzZWxmLndlZWtOdW1iZXJzKSBjbGVhck5vZGUoc2VsZi53ZWVrTnVtYmVycyk7XG4gICAgICAgIHZhciBmcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5jb25maWcuc2hvd01vbnRoczsgaSsrKSB7XG4gICAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZShzZWxmLmN1cnJlbnRZZWFyLCBzZWxmLmN1cnJlbnRNb250aCwgMSk7XG4gICAgICAgICAgZC5zZXRNb250aChzZWxmLmN1cnJlbnRNb250aCArIGkpO1xuICAgICAgICAgIGZyYWcuYXBwZW5kQ2hpbGQoYnVpbGRNb250aERheXMoZC5nZXRGdWxsWWVhcigpLCBkLmdldE1vbnRoKCkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGYuZGF5c0NvbnRhaW5lci5hcHBlbmRDaGlsZChmcmFnKTtcbiAgICAgICAgc2VsZi5kYXlzID0gc2VsZi5kYXlzQ29udGFpbmVyLmZpcnN0Q2hpbGQ7XG5cbiAgICAgICAgaWYgKHNlbGYuY29uZmlnLm1vZGUgPT09IFwicmFuZ2VcIiAmJiBzZWxmLnNlbGVjdGVkRGF0ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgb25Nb3VzZU92ZXIoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBidWlsZE1vbnRoKCkge1xuICAgICAgICB2YXIgY29udGFpbmVyID0gY3JlYXRlRWxlbWVudChcImRpdlwiLCBcImZsYXRwaWNrci1tb250aFwiKTtcbiAgICAgICAgdmFyIG1vbnRoTmF2RnJhZ21lbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICAgICAgICB2YXIgbW9udGhFbGVtZW50ID0gY3JlYXRlRWxlbWVudChcInNwYW5cIiwgXCJjdXItbW9udGhcIik7XG4gICAgICAgIHZhciB5ZWFySW5wdXQgPSBjcmVhdGVOdW1iZXJJbnB1dChcImN1ci15ZWFyXCIsIHtcbiAgICAgICAgICB0YWJpbmRleDogXCItMVwiXG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgeWVhckVsZW1lbnQgPSB5ZWFySW5wdXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJpbnB1dFwiKVswXTtcbiAgICAgICAgeWVhckVsZW1lbnQuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBzZWxmLmwxMG4ueWVhckFyaWFMYWJlbCk7XG4gICAgICAgIGlmIChzZWxmLmNvbmZpZy5taW5EYXRlKSB5ZWFyRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLW1pblwiLCBzZWxmLmNvbmZpZy5taW5EYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKSk7XG5cbiAgICAgICAgaWYgKHNlbGYuY29uZmlnLm1heERhdGUpIHtcbiAgICAgICAgICB5ZWFyRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLW1heFwiLCBzZWxmLmNvbmZpZy5tYXhEYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKSk7XG4gICAgICAgICAgeWVhckVsZW1lbnQuZGlzYWJsZWQgPSAhIXNlbGYuY29uZmlnLm1pbkRhdGUgJiYgc2VsZi5jb25maWcubWluRGF0ZS5nZXRGdWxsWWVhcigpID09PSBzZWxmLmNvbmZpZy5tYXhEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY3VycmVudE1vbnRoID0gY3JlYXRlRWxlbWVudChcImRpdlwiLCBcImZsYXRwaWNrci1jdXJyZW50LW1vbnRoXCIpO1xuICAgICAgICBjdXJyZW50TW9udGguYXBwZW5kQ2hpbGQobW9udGhFbGVtZW50KTtcbiAgICAgICAgY3VycmVudE1vbnRoLmFwcGVuZENoaWxkKHllYXJJbnB1dCk7XG4gICAgICAgIG1vbnRoTmF2RnJhZ21lbnQuYXBwZW5kQ2hpbGQoY3VycmVudE1vbnRoKTtcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKG1vbnRoTmF2RnJhZ21lbnQpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyLFxuICAgICAgICAgIHllYXJFbGVtZW50OiB5ZWFyRWxlbWVudCxcbiAgICAgICAgICBtb250aEVsZW1lbnQ6IG1vbnRoRWxlbWVudFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBidWlsZE1vbnRocygpIHtcbiAgICAgICAgY2xlYXJOb2RlKHNlbGYubW9udGhOYXYpO1xuICAgICAgICBzZWxmLm1vbnRoTmF2LmFwcGVuZENoaWxkKHNlbGYucHJldk1vbnRoTmF2KTtcblxuICAgICAgICBmb3IgKHZhciBtID0gc2VsZi5jb25maWcuc2hvd01vbnRoczsgbS0tOykge1xuICAgICAgICAgIHZhciBtb250aCA9IGJ1aWxkTW9udGgoKTtcbiAgICAgICAgICBzZWxmLnllYXJFbGVtZW50cy5wdXNoKG1vbnRoLnllYXJFbGVtZW50KTtcbiAgICAgICAgICBzZWxmLm1vbnRoRWxlbWVudHMucHVzaChtb250aC5tb250aEVsZW1lbnQpO1xuICAgICAgICAgIHNlbGYubW9udGhOYXYuYXBwZW5kQ2hpbGQobW9udGguY29udGFpbmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGYubW9udGhOYXYuYXBwZW5kQ2hpbGQoc2VsZi5uZXh0TW9udGhOYXYpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBidWlsZE1vbnRoTmF2KCkge1xuICAgICAgICBzZWxmLm1vbnRoTmF2ID0gY3JlYXRlRWxlbWVudChcImRpdlwiLCBcImZsYXRwaWNrci1tb250aHNcIik7XG4gICAgICAgIHNlbGYueWVhckVsZW1lbnRzID0gW107XG4gICAgICAgIHNlbGYubW9udGhFbGVtZW50cyA9IFtdO1xuICAgICAgICBzZWxmLnByZXZNb250aE5hdiA9IGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIFwiZmxhdHBpY2tyLXByZXYtbW9udGhcIik7XG4gICAgICAgIHNlbGYucHJldk1vbnRoTmF2LmlubmVySFRNTCA9IHNlbGYuY29uZmlnLnByZXZBcnJvdztcbiAgICAgICAgc2VsZi5uZXh0TW9udGhOYXYgPSBjcmVhdGVFbGVtZW50KFwic3BhblwiLCBcImZsYXRwaWNrci1uZXh0LW1vbnRoXCIpO1xuICAgICAgICBzZWxmLm5leHRNb250aE5hdi5pbm5lckhUTUwgPSBzZWxmLmNvbmZpZy5uZXh0QXJyb3c7XG4gICAgICAgIGJ1aWxkTW9udGhzKCk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxmLCBcIl9oaWRlUHJldk1vbnRoQXJyb3dcIiwge1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19oaWRlUHJldk1vbnRoQXJyb3c7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIHNldChib29sKSB7XG4gICAgICAgICAgICBpZiAoc2VsZi5fX2hpZGVQcmV2TW9udGhBcnJvdyAhPT0gYm9vbCkge1xuICAgICAgICAgICAgICB0b2dnbGVDbGFzcyhzZWxmLnByZXZNb250aE5hdiwgXCJkaXNhYmxlZFwiLCBib29sKTtcbiAgICAgICAgICAgICAgc2VsZi5fX2hpZGVQcmV2TW9udGhBcnJvdyA9IGJvb2w7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGYsIFwiX2hpZGVOZXh0TW9udGhBcnJvd1wiLCB7XG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fX2hpZGVOZXh0TW9udGhBcnJvdztcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNldDogZnVuY3Rpb24gc2V0KGJvb2wpIHtcbiAgICAgICAgICAgIGlmIChzZWxmLl9faGlkZU5leHRNb250aEFycm93ICE9PSBib29sKSB7XG4gICAgICAgICAgICAgIHRvZ2dsZUNsYXNzKHNlbGYubmV4dE1vbnRoTmF2LCBcImRpc2FibGVkXCIsIGJvb2wpO1xuICAgICAgICAgICAgICBzZWxmLl9faGlkZU5leHRNb250aEFycm93ID0gYm9vbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBzZWxmLmN1cnJlbnRZZWFyRWxlbWVudCA9IHNlbGYueWVhckVsZW1lbnRzWzBdO1xuICAgICAgICB1cGRhdGVOYXZpZ2F0aW9uQ3VycmVudE1vbnRoKCk7XG4gICAgICAgIHJldHVybiBzZWxmLm1vbnRoTmF2O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBidWlsZFRpbWUoKSB7XG4gICAgICAgIHNlbGYuY2FsZW5kYXJDb250YWluZXIuY2xhc3NMaXN0LmFkZChcImhhc1RpbWVcIik7XG4gICAgICAgIGlmIChzZWxmLmNvbmZpZy5ub0NhbGVuZGFyKSBzZWxmLmNhbGVuZGFyQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJub0NhbGVuZGFyXCIpO1xuICAgICAgICBzZWxmLnRpbWVDb250YWluZXIgPSBjcmVhdGVFbGVtZW50KFwiZGl2XCIsIFwiZmxhdHBpY2tyLXRpbWVcIik7XG4gICAgICAgIHNlbGYudGltZUNvbnRhaW5lci50YWJJbmRleCA9IC0xO1xuICAgICAgICB2YXIgc2VwYXJhdG9yID0gY3JlYXRlRWxlbWVudChcInNwYW5cIiwgXCJmbGF0cGlja3ItdGltZS1zZXBhcmF0b3JcIiwgXCI6XCIpO1xuICAgICAgICB2YXIgaG91cklucHV0ID0gY3JlYXRlTnVtYmVySW5wdXQoXCJmbGF0cGlja3ItaG91clwiKTtcbiAgICAgICAgc2VsZi5ob3VyRWxlbWVudCA9IGhvdXJJbnB1dC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImlucHV0XCIpWzBdO1xuICAgICAgICB2YXIgbWludXRlSW5wdXQgPSBjcmVhdGVOdW1iZXJJbnB1dChcImZsYXRwaWNrci1taW51dGVcIik7XG4gICAgICAgIHNlbGYubWludXRlRWxlbWVudCA9IG1pbnV0ZUlucHV0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaW5wdXRcIilbMF07XG4gICAgICAgIHNlbGYuaG91ckVsZW1lbnQudGFiSW5kZXggPSBzZWxmLm1pbnV0ZUVsZW1lbnQudGFiSW5kZXggPSAtMTtcbiAgICAgICAgc2VsZi5ob3VyRWxlbWVudC52YWx1ZSA9IHBhZChzZWxmLmxhdGVzdFNlbGVjdGVkRGF0ZU9iaiA/IHNlbGYubGF0ZXN0U2VsZWN0ZWREYXRlT2JqLmdldEhvdXJzKCkgOiBzZWxmLmNvbmZpZy50aW1lXzI0aHIgPyBzZWxmLmNvbmZpZy5kZWZhdWx0SG91ciA6IG1pbGl0YXJ5MmFtcG0oc2VsZi5jb25maWcuZGVmYXVsdEhvdXIpKTtcbiAgICAgICAgc2VsZi5taW51dGVFbGVtZW50LnZhbHVlID0gcGFkKHNlbGYubGF0ZXN0U2VsZWN0ZWREYXRlT2JqID8gc2VsZi5sYXRlc3RTZWxlY3RlZERhdGVPYmouZ2V0TWludXRlcygpIDogc2VsZi5jb25maWcuZGVmYXVsdE1pbnV0ZSk7XG4gICAgICAgIHNlbGYuaG91ckVsZW1lbnQuc2V0QXR0cmlidXRlKFwiZGF0YS1zdGVwXCIsIHNlbGYuY29uZmlnLmhvdXJJbmNyZW1lbnQudG9TdHJpbmcoKSk7XG4gICAgICAgIHNlbGYubWludXRlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXN0ZXBcIiwgc2VsZi5jb25maWcubWludXRlSW5jcmVtZW50LnRvU3RyaW5nKCkpO1xuICAgICAgICBzZWxmLmhvdXJFbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtbWluXCIsIHNlbGYuY29uZmlnLnRpbWVfMjRociA/IFwiMFwiIDogXCIxXCIpO1xuICAgICAgICBzZWxmLmhvdXJFbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtbWF4XCIsIHNlbGYuY29uZmlnLnRpbWVfMjRociA/IFwiMjNcIiA6IFwiMTJcIik7XG4gICAgICAgIHNlbGYubWludXRlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLW1pblwiLCBcIjBcIik7XG4gICAgICAgIHNlbGYubWludXRlRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLW1heFwiLCBcIjU5XCIpO1xuICAgICAgICBzZWxmLnRpbWVDb250YWluZXIuYXBwZW5kQ2hpbGQoaG91cklucHV0KTtcbiAgICAgICAgc2VsZi50aW1lQ29udGFpbmVyLmFwcGVuZENoaWxkKHNlcGFyYXRvcik7XG4gICAgICAgIHNlbGYudGltZUNvbnRhaW5lci5hcHBlbmRDaGlsZChtaW51dGVJbnB1dCk7XG4gICAgICAgIGlmIChzZWxmLmNvbmZpZy50aW1lXzI0aHIpIHNlbGYudGltZUNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwidGltZTI0aHJcIik7XG5cbiAgICAgICAgaWYgKHNlbGYuY29uZmlnLmVuYWJsZVNlY29uZHMpIHtcbiAgICAgICAgICBzZWxmLnRpbWVDb250YWluZXIuY2xhc3NMaXN0LmFkZChcImhhc1NlY29uZHNcIik7XG4gICAgICAgICAgdmFyIHNlY29uZElucHV0ID0gY3JlYXRlTnVtYmVySW5wdXQoXCJmbGF0cGlja3Itc2Vjb25kXCIpO1xuICAgICAgICAgIHNlbGYuc2Vjb25kRWxlbWVudCA9IHNlY29uZElucHV0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaW5wdXRcIilbMF07XG4gICAgICAgICAgc2VsZi5zZWNvbmRFbGVtZW50LnZhbHVlID0gcGFkKHNlbGYubGF0ZXN0U2VsZWN0ZWREYXRlT2JqID8gc2VsZi5sYXRlc3RTZWxlY3RlZERhdGVPYmouZ2V0U2Vjb25kcygpIDogc2VsZi5jb25maWcuZGVmYXVsdFNlY29uZHMpO1xuICAgICAgICAgIHNlbGYuc2Vjb25kRWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLXN0ZXBcIiwgc2VsZi5taW51dGVFbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtc3RlcFwiKSk7XG4gICAgICAgICAgc2VsZi5zZWNvbmRFbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtbWluXCIsIHNlbGYubWludXRlRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLW1pblwiKSk7XG4gICAgICAgICAgc2VsZi5zZWNvbmRFbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtbWF4XCIsIHNlbGYubWludXRlRWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLW1heFwiKSk7XG4gICAgICAgICAgc2VsZi50aW1lQ29udGFpbmVyLmFwcGVuZENoaWxkKGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIFwiZmxhdHBpY2tyLXRpbWUtc2VwYXJhdG9yXCIsIFwiOlwiKSk7XG4gICAgICAgICAgc2VsZi50aW1lQ29udGFpbmVyLmFwcGVuZENoaWxkKHNlY29uZElucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2VsZi5jb25maWcudGltZV8yNGhyKSB7XG4gICAgICAgICAgc2VsZi5hbVBNID0gY3JlYXRlRWxlbWVudChcInNwYW5cIiwgXCJmbGF0cGlja3ItYW0tcG1cIiwgc2VsZi5sMTBuLmFtUE1baW50KChzZWxmLmxhdGVzdFNlbGVjdGVkRGF0ZU9iaiA/IHNlbGYuaG91ckVsZW1lbnQudmFsdWUgOiBzZWxmLmNvbmZpZy5kZWZhdWx0SG91cikgPiAxMSldKTtcbiAgICAgICAgICBzZWxmLmFtUE0udGl0bGUgPSBzZWxmLmwxMG4udG9nZ2xlVGl0bGU7XG4gICAgICAgICAgc2VsZi5hbVBNLnRhYkluZGV4ID0gLTE7XG4gICAgICAgICAgc2VsZi50aW1lQ29udGFpbmVyLmFwcGVuZENoaWxkKHNlbGYuYW1QTSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2VsZi50aW1lQ29udGFpbmVyO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBidWlsZFdlZWtkYXlzKCkge1xuICAgICAgICBpZiAoIXNlbGYud2Vla2RheUNvbnRhaW5lcikgc2VsZi53ZWVrZGF5Q29udGFpbmVyID0gY3JlYXRlRWxlbWVudChcImRpdlwiLCBcImZsYXRwaWNrci13ZWVrZGF5c1wiKTtlbHNlIGNsZWFyTm9kZShzZWxmLndlZWtkYXlDb250YWluZXIpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSBzZWxmLmNvbmZpZy5zaG93TW9udGhzOyBpLS07KSB7XG4gICAgICAgICAgdmFyIGNvbnRhaW5lciA9IGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgXCJmbGF0cGlja3Itd2Vla2RheWNvbnRhaW5lclwiKTtcbiAgICAgICAgICBzZWxmLndlZWtkYXlDb250YWluZXIuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHVwZGF0ZVdlZWtkYXlzKCk7XG4gICAgICAgIHJldHVybiBzZWxmLndlZWtkYXlDb250YWluZXI7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHVwZGF0ZVdlZWtkYXlzKCkge1xuICAgICAgICB2YXIgZmlyc3REYXlPZldlZWsgPSBzZWxmLmwxMG4uZmlyc3REYXlPZldlZWs7XG4gICAgICAgIHZhciB3ZWVrZGF5cyA9IHNlbGYubDEwbi53ZWVrZGF5cy5zaG9ydGhhbmQuY29uY2F0KCk7XG5cbiAgICAgICAgaWYgKGZpcnN0RGF5T2ZXZWVrID4gMCAmJiBmaXJzdERheU9mV2VlayA8IHdlZWtkYXlzLmxlbmd0aCkge1xuICAgICAgICAgIHdlZWtkYXlzID0gd2Vla2RheXMuc3BsaWNlKGZpcnN0RGF5T2ZXZWVrLCB3ZWVrZGF5cy5sZW5ndGgpLmNvbmNhdCh3ZWVrZGF5cy5zcGxpY2UoMCwgZmlyc3REYXlPZldlZWspKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSBzZWxmLmNvbmZpZy5zaG93TW9udGhzOyBpLS07KSB7XG4gICAgICAgICAgc2VsZi53ZWVrZGF5Q29udGFpbmVyLmNoaWxkcmVuW2ldLmlubmVySFRNTCA9IFwiXFxuICAgICAgPHNwYW4gY2xhc3M9ZmxhdHBpY2tyLXdlZWtkYXk+XFxuICAgICAgICBcIiArIHdlZWtkYXlzLmpvaW4oXCI8L3NwYW4+PHNwYW4gY2xhc3M9ZmxhdHBpY2tyLXdlZWtkYXk+XCIpICsgXCJcXG4gICAgICA8L3NwYW4+XFxuICAgICAgXCI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gYnVpbGRXZWVrcygpIHtcbiAgICAgICAgc2VsZi5jYWxlbmRhckNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiaGFzV2Vla3NcIik7XG4gICAgICAgIHZhciB3ZWVrV3JhcHBlciA9IGNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwgXCJmbGF0cGlja3Itd2Vla3dyYXBwZXJcIik7XG4gICAgICAgIHdlZWtXcmFwcGVyLmFwcGVuZENoaWxkKGNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIFwiZmxhdHBpY2tyLXdlZWtkYXlcIiwgc2VsZi5sMTBuLndlZWtBYmJyZXZpYXRpb24pKTtcbiAgICAgICAgdmFyIHdlZWtOdW1iZXJzID0gY3JlYXRlRWxlbWVudChcImRpdlwiLCBcImZsYXRwaWNrci13ZWVrc1wiKTtcbiAgICAgICAgd2Vla1dyYXBwZXIuYXBwZW5kQ2hpbGQod2Vla051bWJlcnMpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHdlZWtXcmFwcGVyOiB3ZWVrV3JhcHBlcixcbiAgICAgICAgICB3ZWVrTnVtYmVyczogd2Vla051bWJlcnNcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gY2hhbmdlTW9udGgodmFsdWUsIGlzX29mZnNldCkge1xuICAgICAgICBpZiAoaXNfb2Zmc2V0ID09PSB2b2lkIDApIHtcbiAgICAgICAgICBpc19vZmZzZXQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRlbHRhID0gaXNfb2Zmc2V0ID8gdmFsdWUgOiB2YWx1ZSAtIHNlbGYuY3VycmVudE1vbnRoO1xuICAgICAgICBpZiAoZGVsdGEgPCAwICYmIHNlbGYuX2hpZGVQcmV2TW9udGhBcnJvdyA9PT0gdHJ1ZSB8fCBkZWx0YSA+IDAgJiYgc2VsZi5faGlkZU5leHRNb250aEFycm93ID09PSB0cnVlKSByZXR1cm47XG4gICAgICAgIHNlbGYuY3VycmVudE1vbnRoICs9IGRlbHRhO1xuXG4gICAgICAgIGlmIChzZWxmLmN1cnJlbnRNb250aCA8IDAgfHwgc2VsZi5jdXJyZW50TW9udGggPiAxMSkge1xuICAgICAgICAgIHNlbGYuY3VycmVudFllYXIgKz0gc2VsZi5jdXJyZW50TW9udGggPiAxMSA/IDEgOiAtMTtcbiAgICAgICAgICBzZWxmLmN1cnJlbnRNb250aCA9IChzZWxmLmN1cnJlbnRNb250aCArIDEyKSAlIDEyO1xuICAgICAgICAgIHRyaWdnZXJFdmVudChcIm9uWWVhckNoYW5nZVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1aWxkRGF5cygpO1xuICAgICAgICB0cmlnZ2VyRXZlbnQoXCJvbk1vbnRoQ2hhbmdlXCIpO1xuICAgICAgICB1cGRhdGVOYXZpZ2F0aW9uQ3VycmVudE1vbnRoKCk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGNsZWFyKHRyaWdnZXJDaGFuZ2VFdmVudCkge1xuICAgICAgICBpZiAodHJpZ2dlckNoYW5nZUV2ZW50ID09PSB2b2lkIDApIHtcbiAgICAgICAgICB0cmlnZ2VyQ2hhbmdlRXZlbnQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VsZi5pbnB1dC52YWx1ZSA9IFwiXCI7XG4gICAgICAgIGlmIChzZWxmLmFsdElucHV0ICE9PSB1bmRlZmluZWQpIHNlbGYuYWx0SW5wdXQudmFsdWUgPSBcIlwiO1xuICAgICAgICBpZiAoc2VsZi5tb2JpbGVJbnB1dCAhPT0gdW5kZWZpbmVkKSBzZWxmLm1vYmlsZUlucHV0LnZhbHVlID0gXCJcIjtcbiAgICAgICAgc2VsZi5zZWxlY3RlZERhdGVzID0gW107XG4gICAgICAgIHNlbGYubGF0ZXN0U2VsZWN0ZWREYXRlT2JqID0gdW5kZWZpbmVkO1xuICAgICAgICBzZWxmLnNob3dUaW1lSW5wdXQgPSBmYWxzZTtcblxuICAgICAgICBpZiAoc2VsZi5jb25maWcuZW5hYmxlVGltZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHNldERlZmF1bHRIb3VycygpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VsZi5yZWRyYXcoKTtcbiAgICAgICAgaWYgKHRyaWdnZXJDaGFuZ2VFdmVudCkgdHJpZ2dlckV2ZW50KFwib25DaGFuZ2VcIik7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGNsb3NlKCkge1xuICAgICAgICBzZWxmLmlzT3BlbiA9IGZhbHNlO1xuXG4gICAgICAgIGlmICghc2VsZi5pc01vYmlsZSkge1xuICAgICAgICAgIHNlbGYuY2FsZW5kYXJDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShcIm9wZW5cIik7XG5cbiAgICAgICAgICBzZWxmLl9pbnB1dC5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJpZ2dlckV2ZW50KFwib25DbG9zZVwiKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHNlbGYuY29uZmlnICE9PSB1bmRlZmluZWQpIHRyaWdnZXJFdmVudChcIm9uRGVzdHJveVwiKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gc2VsZi5faGFuZGxlcnMubGVuZ3RoOyBpLS07KSB7XG4gICAgICAgICAgdmFyIGggPSBzZWxmLl9oYW5kbGVyc1tpXTtcbiAgICAgICAgICBoLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihoLmV2ZW50LCBoLmhhbmRsZXIsIGgub3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICBzZWxmLl9oYW5kbGVycyA9IFtdO1xuXG4gICAgICAgIGlmIChzZWxmLm1vYmlsZUlucHV0KSB7XG4gICAgICAgICAgaWYgKHNlbGYubW9iaWxlSW5wdXQucGFyZW50Tm9kZSkgc2VsZi5tb2JpbGVJbnB1dC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHNlbGYubW9iaWxlSW5wdXQpO1xuICAgICAgICAgIHNlbGYubW9iaWxlSW5wdXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH0gZWxzZSBpZiAoc2VsZi5jYWxlbmRhckNvbnRhaW5lciAmJiBzZWxmLmNhbGVuZGFyQ29udGFpbmVyLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICBpZiAoc2VsZi5jb25maWcuc3RhdGljICYmIHNlbGYuY2FsZW5kYXJDb250YWluZXIucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdmFyIHdyYXBwZXIgPSBzZWxmLmNhbGVuZGFyQ29udGFpbmVyLnBhcmVudE5vZGU7XG4gICAgICAgICAgICB3cmFwcGVyLmxhc3RDaGlsZCAmJiB3cmFwcGVyLnJlbW92ZUNoaWxkKHdyYXBwZXIubGFzdENoaWxkKTtcblxuICAgICAgICAgICAgaWYgKHdyYXBwZXIucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICB3aGlsZSAod3JhcHBlci5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlci5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh3cmFwcGVyLmZpcnN0Q2hpbGQsIHdyYXBwZXIpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgd3JhcHBlci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHdyYXBwZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBzZWxmLmNhbGVuZGFyQ29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc2VsZi5jYWxlbmRhckNvbnRhaW5lcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsZi5hbHRJbnB1dCkge1xuICAgICAgICAgIHNlbGYuaW5wdXQudHlwZSA9IFwidGV4dFwiO1xuICAgICAgICAgIGlmIChzZWxmLmFsdElucHV0LnBhcmVudE5vZGUpIHNlbGYuYWx0SW5wdXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzZWxmLmFsdElucHV0KTtcbiAgICAgICAgICBkZWxldGUgc2VsZi5hbHRJbnB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxmLmlucHV0KSB7XG4gICAgICAgICAgc2VsZi5pbnB1dC50eXBlID0gc2VsZi5pbnB1dC5fdHlwZTtcbiAgICAgICAgICBzZWxmLmlucHV0LmNsYXNzTGlzdC5yZW1vdmUoXCJmbGF0cGlja3ItaW5wdXRcIik7XG4gICAgICAgICAgc2VsZi5pbnB1dC5yZW1vdmVBdHRyaWJ1dGUoXCJyZWFkb25seVwiKTtcbiAgICAgICAgICBzZWxmLmlucHV0LnZhbHVlID0gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIFtcIl9zaG93VGltZUlucHV0XCIsIFwibGF0ZXN0U2VsZWN0ZWREYXRlT2JqXCIsIFwiX2hpZGVOZXh0TW9udGhBcnJvd1wiLCBcIl9oaWRlUHJldk1vbnRoQXJyb3dcIiwgXCJfX2hpZGVOZXh0TW9udGhBcnJvd1wiLCBcIl9faGlkZVByZXZNb250aEFycm93XCIsIFwiaXNNb2JpbGVcIiwgXCJpc09wZW5cIiwgXCJzZWxlY3RlZERhdGVFbGVtXCIsIFwibWluRGF0ZUhhc1RpbWVcIiwgXCJtYXhEYXRlSGFzVGltZVwiLCBcImRheXNcIiwgXCJkYXlzQ29udGFpbmVyXCIsIFwiX2lucHV0XCIsIFwiX3Bvc2l0aW9uRWxlbWVudFwiLCBcImlubmVyQ29udGFpbmVyXCIsIFwickNvbnRhaW5lclwiLCBcIm1vbnRoTmF2XCIsIFwidG9kYXlEYXRlRWxlbVwiLCBcImNhbGVuZGFyQ29udGFpbmVyXCIsIFwid2Vla2RheUNvbnRhaW5lclwiLCBcInByZXZNb250aE5hdlwiLCBcIm5leHRNb250aE5hdlwiLCBcImN1cnJlbnRNb250aEVsZW1lbnRcIiwgXCJjdXJyZW50WWVhckVsZW1lbnRcIiwgXCJuYXZpZ2F0aW9uQ3VycmVudE1vbnRoXCIsIFwic2VsZWN0ZWREYXRlRWxlbVwiLCBcImNvbmZpZ1wiXS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRlbGV0ZSBzZWxmW2tdO1xuICAgICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBpc0NhbGVuZGFyRWxlbShlbGVtKSB7XG4gICAgICAgIGlmIChzZWxmLmNvbmZpZy5hcHBlbmRUbyAmJiBzZWxmLmNvbmZpZy5hcHBlbmRUby5jb250YWlucyhlbGVtKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBzZWxmLmNhbGVuZGFyQ29udGFpbmVyLmNvbnRhaW5zKGVsZW0pO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBkb2N1bWVudENsaWNrKGUpIHtcbiAgICAgICAgaWYgKHNlbGYuaXNPcGVuICYmICFzZWxmLmNvbmZpZy5pbmxpbmUpIHtcbiAgICAgICAgICB2YXIgaXNDYWxlbmRhckVsZW1lbnQgPSBpc0NhbGVuZGFyRWxlbShlLnRhcmdldCk7XG4gICAgICAgICAgdmFyIGlzSW5wdXQgPSBlLnRhcmdldCA9PT0gc2VsZi5pbnB1dCB8fCBlLnRhcmdldCA9PT0gc2VsZi5hbHRJbnB1dCB8fCBzZWxmLmVsZW1lbnQuY29udGFpbnMoZS50YXJnZXQpIHx8IGUucGF0aCAmJiBlLnBhdGguaW5kZXhPZiAmJiAofmUucGF0aC5pbmRleE9mKHNlbGYuaW5wdXQpIHx8IH5lLnBhdGguaW5kZXhPZihzZWxmLmFsdElucHV0KSk7XG4gICAgICAgICAgdmFyIGxvc3RGb2N1cyA9IGUudHlwZSA9PT0gXCJibHVyXCIgPyBpc0lucHV0ICYmIGUucmVsYXRlZFRhcmdldCAmJiAhaXNDYWxlbmRhckVsZW0oZS5yZWxhdGVkVGFyZ2V0KSA6ICFpc0lucHV0ICYmICFpc0NhbGVuZGFyRWxlbWVudDtcbiAgICAgICAgICB2YXIgaXNJZ25vcmVkID0gIXNlbGYuY29uZmlnLmlnbm9yZWRGb2N1c0VsZW1lbnRzLnNvbWUoZnVuY3Rpb24gKGVsZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtLmNvbnRhaW5zKGUudGFyZ2V0KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChsb3N0Rm9jdXMgJiYgaXNJZ25vcmVkKSB7XG4gICAgICAgICAgICBzZWxmLmNsb3NlKCk7XG5cbiAgICAgICAgICAgIGlmIChzZWxmLmNvbmZpZy5tb2RlID09PSBcInJhbmdlXCIgJiYgc2VsZi5zZWxlY3RlZERhdGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICBzZWxmLmNsZWFyKGZhbHNlKTtcbiAgICAgICAgICAgICAgc2VsZi5yZWRyYXcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gY2hhbmdlWWVhcihuZXdZZWFyKSB7XG4gICAgICAgIGlmICghbmV3WWVhciB8fCBzZWxmLmNvbmZpZy5taW5EYXRlICYmIG5ld1llYXIgPCBzZWxmLmNvbmZpZy5taW5EYXRlLmdldEZ1bGxZZWFyKCkgfHwgc2VsZi5jb25maWcubWF4RGF0ZSAmJiBuZXdZZWFyID4gc2VsZi5jb25maWcubWF4RGF0ZS5nZXRGdWxsWWVhcigpKSByZXR1cm47XG4gICAgICAgIHZhciBuZXdZZWFyTnVtID0gbmV3WWVhcixcbiAgICAgICAgICAgIGlzTmV3WWVhciA9IHNlbGYuY3VycmVudFllYXIgIT09IG5ld1llYXJOdW07XG4gICAgICAgIHNlbGYuY3VycmVudFllYXIgPSBuZXdZZWFyTnVtIHx8IHNlbGYuY3VycmVudFllYXI7XG5cbiAgICAgICAgaWYgKHNlbGYuY29uZmlnLm1heERhdGUgJiYgc2VsZi5jdXJyZW50WWVhciA9PT0gc2VsZi5jb25maWcubWF4RGF0ZS5nZXRGdWxsWWVhcigpKSB7XG4gICAgICAgICAgc2VsZi5jdXJyZW50TW9udGggPSBNYXRoLm1pbihzZWxmLmNvbmZpZy5tYXhEYXRlLmdldE1vbnRoKCksIHNlbGYuY3VycmVudE1vbnRoKTtcbiAgICAgICAgfSBlbHNlIGlmIChzZWxmLmNvbmZpZy5taW5EYXRlICYmIHNlbGYuY3VycmVudFllYXIgPT09IHNlbGYuY29uZmlnLm1pbkRhdGUuZ2V0RnVsbFllYXIoKSkge1xuICAgICAgICAgIHNlbGYuY3VycmVudE1vbnRoID0gTWF0aC5tYXgoc2VsZi5jb25maWcubWluRGF0ZS5nZXRNb250aCgpLCBzZWxmLmN1cnJlbnRNb250aCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNOZXdZZWFyKSB7XG4gICAgICAgICAgc2VsZi5yZWRyYXcoKTtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoXCJvblllYXJDaGFuZ2VcIik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gaXNFbmFibGVkKGRhdGUsIHRpbWVsZXNzKSB7XG4gICAgICAgIGlmICh0aW1lbGVzcyA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgdGltZWxlc3MgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRhdGVUb0NoZWNrID0gc2VsZi5wYXJzZURhdGUoZGF0ZSwgdW5kZWZpbmVkLCB0aW1lbGVzcyk7XG4gICAgICAgIGlmIChzZWxmLmNvbmZpZy5taW5EYXRlICYmIGRhdGVUb0NoZWNrICYmIGNvbXBhcmVEYXRlcyhkYXRlVG9DaGVjaywgc2VsZi5jb25maWcubWluRGF0ZSwgdGltZWxlc3MgIT09IHVuZGVmaW5lZCA/IHRpbWVsZXNzIDogIXNlbGYubWluRGF0ZUhhc1RpbWUpIDwgMCB8fCBzZWxmLmNvbmZpZy5tYXhEYXRlICYmIGRhdGVUb0NoZWNrICYmIGNvbXBhcmVEYXRlcyhkYXRlVG9DaGVjaywgc2VsZi5jb25maWcubWF4RGF0ZSwgdGltZWxlc3MgIT09IHVuZGVmaW5lZCA/IHRpbWVsZXNzIDogIXNlbGYubWF4RGF0ZUhhc1RpbWUpID4gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoc2VsZi5jb25maWcuZW5hYmxlLmxlbmd0aCA9PT0gMCAmJiBzZWxmLmNvbmZpZy5kaXNhYmxlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChkYXRlVG9DaGVjayA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHZhciBib29sID0gc2VsZi5jb25maWcuZW5hYmxlLmxlbmd0aCA+IDAsXG4gICAgICAgICAgICBhcnJheSA9IGJvb2wgPyBzZWxmLmNvbmZpZy5lbmFibGUgOiBzZWxmLmNvbmZpZy5kaXNhYmxlO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBkOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBkID0gYXJyYXlbaV07XG4gICAgICAgICAgaWYgKHR5cGVvZiBkID09PSBcImZ1bmN0aW9uXCIgJiYgZChkYXRlVG9DaGVjaykpIHJldHVybiBib29sO2Vsc2UgaWYgKGQgaW5zdGFuY2VvZiBEYXRlICYmIGRhdGVUb0NoZWNrICE9PSB1bmRlZmluZWQgJiYgZC5nZXRUaW1lKCkgPT09IGRhdGVUb0NoZWNrLmdldFRpbWUoKSkgcmV0dXJuIGJvb2w7ZWxzZSBpZiAodHlwZW9mIGQgPT09IFwic3RyaW5nXCIgJiYgZGF0ZVRvQ2hlY2sgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFyIHBhcnNlZCA9IHNlbGYucGFyc2VEYXRlKGQsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VkICYmIHBhcnNlZC5nZXRUaW1lKCkgPT09IGRhdGVUb0NoZWNrLmdldFRpbWUoKSA/IGJvb2wgOiAhYm9vbDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkID09PSBcIm9iamVjdFwiICYmIGRhdGVUb0NoZWNrICE9PSB1bmRlZmluZWQgJiYgZC5mcm9tICYmIGQudG8gJiYgZGF0ZVRvQ2hlY2suZ2V0VGltZSgpID49IGQuZnJvbS5nZXRUaW1lKCkgJiYgZGF0ZVRvQ2hlY2suZ2V0VGltZSgpIDw9IGQudG8uZ2V0VGltZSgpKSByZXR1cm4gYm9vbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhYm9vbDtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gaXNJblZpZXcoZWxlbSkge1xuICAgICAgICBpZiAoc2VsZi5kYXlzQ29udGFpbmVyICE9PSB1bmRlZmluZWQpIHJldHVybiBlbGVtLmNsYXNzTmFtZS5pbmRleE9mKFwiaGlkZGVuXCIpID09PSAtMSAmJiBzZWxmLmRheXNDb250YWluZXIuY29udGFpbnMoZWxlbSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gb25LZXlEb3duKGUpIHtcbiAgICAgICAgdmFyIGlzSW5wdXQgPSBlLnRhcmdldCA9PT0gc2VsZi5faW5wdXQ7XG4gICAgICAgIHZhciBhbGxvd0lucHV0ID0gc2VsZi5jb25maWcuYWxsb3dJbnB1dDtcbiAgICAgICAgdmFyIGFsbG93S2V5ZG93biA9IHNlbGYuaXNPcGVuICYmICghYWxsb3dJbnB1dCB8fCAhaXNJbnB1dCk7XG4gICAgICAgIHZhciBhbGxvd0lubGluZUtleWRvd24gPSBzZWxmLmNvbmZpZy5pbmxpbmUgJiYgaXNJbnB1dCAmJiAhYWxsb3dJbnB1dDtcblxuICAgICAgICBpZiAoZS5rZXlDb2RlID09PSAxMyAmJiBpc0lucHV0KSB7XG4gICAgICAgICAgaWYgKGFsbG93SW5wdXQpIHtcbiAgICAgICAgICAgIHNlbGYuc2V0RGF0ZShzZWxmLl9pbnB1dC52YWx1ZSwgdHJ1ZSwgZS50YXJnZXQgPT09IHNlbGYuYWx0SW5wdXQgPyBzZWxmLmNvbmZpZy5hbHRGb3JtYXQgOiBzZWxmLmNvbmZpZy5kYXRlRm9ybWF0KTtcbiAgICAgICAgICAgIHJldHVybiBlLnRhcmdldC5ibHVyKCk7XG4gICAgICAgICAgfSBlbHNlIHNlbGYub3BlbigpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzQ2FsZW5kYXJFbGVtKGUudGFyZ2V0KSB8fCBhbGxvd0tleWRvd24gfHwgYWxsb3dJbmxpbmVLZXlkb3duKSB7XG4gICAgICAgICAgdmFyIGlzVGltZU9iaiA9ICEhc2VsZi50aW1lQ29udGFpbmVyICYmIHNlbGYudGltZUNvbnRhaW5lci5jb250YWlucyhlLnRhcmdldCk7XG5cbiAgICAgICAgICBzd2l0Y2ggKGUua2V5Q29kZSkge1xuICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgaWYgKGlzVGltZU9iaikgdXBkYXRlVGltZSgpO2Vsc2Ugc2VsZWN0RGF0ZShlKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMjc6XG4gICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgZm9jdXNBbmRDbG9zZSgpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgY2FzZSA0NjpcbiAgICAgICAgICAgICAgaWYgKGlzSW5wdXQgJiYgIXNlbGYuY29uZmlnLmFsbG93SW5wdXQpIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgc2VsZi5jbGVhcigpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgMzc6XG4gICAgICAgICAgICBjYXNlIDM5OlxuICAgICAgICAgICAgICBpZiAoIWlzVGltZU9iaikge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgIGlmIChzZWxmLmRheXNDb250YWluZXIgIT09IHVuZGVmaW5lZCAmJiAoYWxsb3dJbnB1dCA9PT0gZmFsc2UgfHwgaXNJblZpZXcoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgX2RlbHRhID0gZS5rZXlDb2RlID09PSAzOSA/IDEgOiAtMTtcblxuICAgICAgICAgICAgICAgICAgaWYgKCFlLmN0cmxLZXkpIGZvY3VzT25EYXkodW5kZWZpbmVkLCBfZGVsdGEpO2Vsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VNb250aChfZGVsdGEpO1xuICAgICAgICAgICAgICAgICAgICBmb2N1c09uRGF5KGdldEZpcnN0QXZhaWxhYmxlRGF5KDEpLCAwKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZi5ob3VyRWxlbWVudCkgc2VsZi5ob3VyRWxlbWVudC5mb2N1cygpO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIDM4OlxuICAgICAgICAgICAgY2FzZSA0MDpcbiAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICB2YXIgZGVsdGEgPSBlLmtleUNvZGUgPT09IDQwID8gMSA6IC0xO1xuXG4gICAgICAgICAgICAgIGlmIChzZWxmLmRheXNDb250YWluZXIgJiYgZS50YXJnZXQuJGkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmIChlLmN0cmxLZXkpIHtcbiAgICAgICAgICAgICAgICAgIGNoYW5nZVllYXIoc2VsZi5jdXJyZW50WWVhciAtIGRlbHRhKTtcbiAgICAgICAgICAgICAgICAgIGZvY3VzT25EYXkoZ2V0Rmlyc3RBdmFpbGFibGVEYXkoMSksIDApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzVGltZU9iaikgZm9jdXNPbkRheSh1bmRlZmluZWQsIGRlbHRhICogNyk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZi5jb25maWcuZW5hYmxlVGltZSkge1xuICAgICAgICAgICAgICAgIGlmICghaXNUaW1lT2JqICYmIHNlbGYuaG91ckVsZW1lbnQpIHNlbGYuaG91ckVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVUaW1lKGUpO1xuXG4gICAgICAgICAgICAgICAgc2VsZi5fZGVib3VuY2VkQ2hhbmdlKCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICBpZiAoIWlzVGltZU9iaikge1xuICAgICAgICAgICAgICAgIHNlbGYuZWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgdmFyIGVsZW1zID0gW3NlbGYuaG91ckVsZW1lbnQsIHNlbGYubWludXRlRWxlbWVudCwgc2VsZi5zZWNvbmRFbGVtZW50LCBzZWxmLmFtUE1dLmZpbHRlcihmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdmFyIGkgPSBlbGVtcy5pbmRleE9mKGUudGFyZ2V0KTtcblxuICAgICAgICAgICAgICBpZiAoaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gZWxlbXNbaSArIChlLnNoaWZ0S2V5ID8gLTEgOiAxKV07XG5cbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgIHRhcmdldC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBzZWxmLmVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbGYuYW1QTSAhPT0gdW5kZWZpbmVkICYmIGUudGFyZ2V0ID09PSBzZWxmLmFtUE0pIHtcbiAgICAgICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgICAgICBjYXNlIHNlbGYubDEwbi5hbVBNWzBdLmNoYXJBdCgwKTpcbiAgICAgICAgICAgIGNhc2Ugc2VsZi5sMTBuLmFtUE1bMF0uY2hhckF0KDApLnRvTG93ZXJDYXNlKCk6XG4gICAgICAgICAgICAgIHNlbGYuYW1QTS50ZXh0Q29udGVudCA9IHNlbGYubDEwbi5hbVBNWzBdO1xuICAgICAgICAgICAgICBzZXRIb3Vyc0Zyb21JbnB1dHMoKTtcbiAgICAgICAgICAgICAgdXBkYXRlVmFsdWUoKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2Ugc2VsZi5sMTBuLmFtUE1bMV0uY2hhckF0KDApOlxuICAgICAgICAgICAgY2FzZSBzZWxmLmwxMG4uYW1QTVsxXS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKTpcbiAgICAgICAgICAgICAgc2VsZi5hbVBNLnRleHRDb250ZW50ID0gc2VsZi5sMTBuLmFtUE1bMV07XG4gICAgICAgICAgICAgIHNldEhvdXJzRnJvbUlucHV0cygpO1xuICAgICAgICAgICAgICB1cGRhdGVWYWx1ZSgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0cmlnZ2VyRXZlbnQoXCJvbktleURvd25cIiwgZSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIG9uTW91c2VPdmVyKGVsZW0pIHtcbiAgICAgICAgaWYgKHNlbGYuc2VsZWN0ZWREYXRlcy5sZW5ndGggIT09IDEgfHwgZWxlbSAmJiAoIWVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKFwiZmxhdHBpY2tyLWRheVwiKSB8fCBlbGVtLmNsYXNzTGlzdC5jb250YWlucyhcImRpc2FibGVkXCIpKSkgcmV0dXJuO1xuICAgICAgICB2YXIgaG92ZXJEYXRlID0gZWxlbSA/IGVsZW0uZGF0ZU9iai5nZXRUaW1lKCkgOiBzZWxmLmRheXMuZmlyc3RFbGVtZW50Q2hpbGQuZGF0ZU9iai5nZXRUaW1lKCksXG4gICAgICAgICAgICBpbml0aWFsRGF0ZSA9IHNlbGYucGFyc2VEYXRlKHNlbGYuc2VsZWN0ZWREYXRlc1swXSwgdW5kZWZpbmVkLCB0cnVlKS5nZXRUaW1lKCksXG4gICAgICAgICAgICByYW5nZVN0YXJ0RGF0ZSA9IE1hdGgubWluKGhvdmVyRGF0ZSwgc2VsZi5zZWxlY3RlZERhdGVzWzBdLmdldFRpbWUoKSksXG4gICAgICAgICAgICByYW5nZUVuZERhdGUgPSBNYXRoLm1heChob3ZlckRhdGUsIHNlbGYuc2VsZWN0ZWREYXRlc1swXS5nZXRUaW1lKCkpLFxuICAgICAgICAgICAgbGFzdERhdGUgPSBzZWxmLmRheXNDb250YWluZXIubGFzdENoaWxkLmxhc3RDaGlsZC5kYXRlT2JqLmdldFRpbWUoKTtcbiAgICAgICAgdmFyIGNvbnRhaW5zRGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFyIG1pblJhbmdlID0gMCxcbiAgICAgICAgICAgIG1heFJhbmdlID0gMDtcblxuICAgICAgICBmb3IgKHZhciB0ID0gcmFuZ2VTdGFydERhdGU7IHQgPCBsYXN0RGF0ZTsgdCArPSBkdXJhdGlvbi5EQVkpIHtcbiAgICAgICAgICBpZiAoIWlzRW5hYmxlZChuZXcgRGF0ZSh0KSwgdHJ1ZSkpIHtcbiAgICAgICAgICAgIGNvbnRhaW5zRGlzYWJsZWQgPSBjb250YWluc0Rpc2FibGVkIHx8IHQgPiByYW5nZVN0YXJ0RGF0ZSAmJiB0IDwgcmFuZ2VFbmREYXRlO1xuICAgICAgICAgICAgaWYgKHQgPCBpbml0aWFsRGF0ZSAmJiAoIW1pblJhbmdlIHx8IHQgPiBtaW5SYW5nZSkpIG1pblJhbmdlID0gdDtlbHNlIGlmICh0ID4gaW5pdGlhbERhdGUgJiYgKCFtYXhSYW5nZSB8fCB0IDwgbWF4UmFuZ2UpKSBtYXhSYW5nZSA9IHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgbSA9IDA7IG0gPCBzZWxmLmNvbmZpZy5zaG93TW9udGhzOyBtKyspIHtcbiAgICAgICAgICB2YXIgbW9udGggPSBzZWxmLmRheXNDb250YWluZXIuY2hpbGRyZW5bbV07XG4gICAgICAgICAgdmFyIHByZXZNb250aCA9IHNlbGYuZGF5c0NvbnRhaW5lci5jaGlsZHJlblttIC0gMV07XG5cbiAgICAgICAgICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChpLCBsKSB7XG4gICAgICAgICAgICB2YXIgZGF5RWxlbSA9IG1vbnRoLmNoaWxkcmVuW2ldLFxuICAgICAgICAgICAgICAgIGRhdGUgPSBkYXlFbGVtLmRhdGVPYmo7XG4gICAgICAgICAgICB2YXIgdGltZXN0YW1wID0gZGF0ZS5nZXRUaW1lKCk7XG4gICAgICAgICAgICB2YXIgb3V0T2ZSYW5nZSA9IG1pblJhbmdlID4gMCAmJiB0aW1lc3RhbXAgPCBtaW5SYW5nZSB8fCBtYXhSYW5nZSA+IDAgJiYgdGltZXN0YW1wID4gbWF4UmFuZ2U7XG5cbiAgICAgICAgICAgIGlmIChvdXRPZlJhbmdlKSB7XG4gICAgICAgICAgICAgIGRheUVsZW0uY2xhc3NMaXN0LmFkZChcIm5vdEFsbG93ZWRcIik7XG4gICAgICAgICAgICAgIFtcImluUmFuZ2VcIiwgXCJzdGFydFJhbmdlXCIsIFwiZW5kUmFuZ2VcIl0uZm9yRWFjaChmdW5jdGlvbiAoYykge1xuICAgICAgICAgICAgICAgIGRheUVsZW0uY2xhc3NMaXN0LnJlbW92ZShjKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiBcImNvbnRpbnVlXCI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5zRGlzYWJsZWQgJiYgIW91dE9mUmFuZ2UpIHJldHVybiBcImNvbnRpbnVlXCI7XG5cbiAgICAgICAgICAgIFtcInN0YXJ0UmFuZ2VcIiwgXCJpblJhbmdlXCIsIFwiZW5kUmFuZ2VcIiwgXCJub3RBbGxvd2VkXCJdLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgICAgICAgZGF5RWxlbS5jbGFzc0xpc3QucmVtb3ZlKGMpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChlbGVtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgZWxlbS5jbGFzc0xpc3QuYWRkKGhvdmVyRGF0ZSA8IHNlbGYuc2VsZWN0ZWREYXRlc1swXS5nZXRUaW1lKCkgPyBcInN0YXJ0UmFuZ2VcIiA6IFwiZW5kUmFuZ2VcIik7XG5cbiAgICAgICAgICAgICAgaWYgKG1vbnRoLmNvbnRhaW5zKGVsZW0pIHx8ICEobSA+IDAgJiYgcHJldk1vbnRoICYmIHByZXZNb250aC5sYXN0Q2hpbGQuZGF0ZU9iai5nZXRUaW1lKCkgPj0gdGltZXN0YW1wKSkge1xuICAgICAgICAgICAgICAgIGlmIChpbml0aWFsRGF0ZSA8IGhvdmVyRGF0ZSAmJiB0aW1lc3RhbXAgPT09IGluaXRpYWxEYXRlKSBkYXlFbGVtLmNsYXNzTGlzdC5hZGQoXCJzdGFydFJhbmdlXCIpO2Vsc2UgaWYgKGluaXRpYWxEYXRlID4gaG92ZXJEYXRlICYmIHRpbWVzdGFtcCA9PT0gaW5pdGlhbERhdGUpIGRheUVsZW0uY2xhc3NMaXN0LmFkZChcImVuZFJhbmdlXCIpO1xuICAgICAgICAgICAgICAgIGlmICh0aW1lc3RhbXAgPj0gbWluUmFuZ2UgJiYgKG1heFJhbmdlID09PSAwIHx8IHRpbWVzdGFtcCA8PSBtYXhSYW5nZSkgJiYgaXNCZXR3ZWVuKHRpbWVzdGFtcCwgaW5pdGlhbERhdGUsIGhvdmVyRGF0ZSkpIGRheUVsZW0uY2xhc3NMaXN0LmFkZChcImluUmFuZ2VcIik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBtb250aC5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBfcmV0ID0gX2xvb3AoaSwgbCk7XG5cbiAgICAgICAgICAgIGlmIChfcmV0ID09PSBcImNvbnRpbnVlXCIpIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBvblJlc2l6ZSgpIHtcbiAgICAgICAgaWYgKHNlbGYuaXNPcGVuICYmICFzZWxmLmNvbmZpZy5zdGF0aWMgJiYgIXNlbGYuY29uZmlnLmlubGluZSkgcG9zaXRpb25DYWxlbmRhcigpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBvcGVuKGUsIHBvc2l0aW9uRWxlbWVudCkge1xuICAgICAgICBpZiAocG9zaXRpb25FbGVtZW50ID09PSB2b2lkIDApIHtcbiAgICAgICAgICBwb3NpdGlvbkVsZW1lbnQgPSBzZWxmLl9wb3NpdGlvbkVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsZi5pc01vYmlsZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBlLnRhcmdldCAmJiBlLnRhcmdldC5ibHVyKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlbGYubW9iaWxlSW5wdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc2VsZi5tb2JpbGVJbnB1dC5mb2N1cygpO1xuICAgICAgICAgICAgc2VsZi5tb2JpbGVJbnB1dC5jbGljaygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRyaWdnZXJFdmVudChcIm9uT3BlblwiKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsZi5faW5wdXQuZGlzYWJsZWQgfHwgc2VsZi5jb25maWcuaW5saW5lKSByZXR1cm47XG4gICAgICAgIHZhciB3YXNPcGVuID0gc2VsZi5pc09wZW47XG4gICAgICAgIHNlbGYuaXNPcGVuID0gdHJ1ZTtcblxuICAgICAgICBpZiAoIXdhc09wZW4pIHtcbiAgICAgICAgICBzZWxmLmNhbGVuZGFyQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJvcGVuXCIpO1xuXG4gICAgICAgICAgc2VsZi5faW5wdXQuY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcblxuICAgICAgICAgIHRyaWdnZXJFdmVudChcIm9uT3BlblwiKTtcbiAgICAgICAgICBwb3NpdGlvbkNhbGVuZGFyKHBvc2l0aW9uRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VsZi5jb25maWcuZW5hYmxlVGltZSA9PT0gdHJ1ZSAmJiBzZWxmLmNvbmZpZy5ub0NhbGVuZGFyID09PSB0cnVlKSB7XG4gICAgICAgICAgaWYgKHNlbGYuc2VsZWN0ZWREYXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHNlbGYuc2V0RGF0ZShzZWxmLmNvbmZpZy5taW5EYXRlICE9PSB1bmRlZmluZWQgPyBuZXcgRGF0ZShzZWxmLmNvbmZpZy5taW5EYXRlLmdldFRpbWUoKSkgOiBuZXcgRGF0ZSgpLCBmYWxzZSk7XG4gICAgICAgICAgICBzZXREZWZhdWx0SG91cnMoKTtcbiAgICAgICAgICAgIHVwZGF0ZVZhbHVlKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHNlbGYuY29uZmlnLmFsbG93SW5wdXQgPT09IGZhbHNlICYmIChlID09PSB1bmRlZmluZWQgfHwgIXNlbGYudGltZUNvbnRhaW5lci5jb250YWlucyhlLnJlbGF0ZWRUYXJnZXQpKSkge1xuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBzZWxmLmhvdXJFbGVtZW50LnNlbGVjdCgpO1xuICAgICAgICAgICAgfSwgNTApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBtaW5NYXhEYXRlU2V0dGVyKHR5cGUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgICAgdmFyIGRhdGVPYmogPSBzZWxmLmNvbmZpZ1tcIl9cIiArIHR5cGUgKyBcIkRhdGVcIl0gPSBzZWxmLnBhcnNlRGF0ZShkYXRlLCBzZWxmLmNvbmZpZy5kYXRlRm9ybWF0KTtcbiAgICAgICAgICB2YXIgaW52ZXJzZURhdGVPYmogPSBzZWxmLmNvbmZpZ1tcIl9cIiArICh0eXBlID09PSBcIm1pblwiID8gXCJtYXhcIiA6IFwibWluXCIpICsgXCJEYXRlXCJdO1xuXG4gICAgICAgICAgaWYgKGRhdGVPYmogIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc2VsZlt0eXBlID09PSBcIm1pblwiID8gXCJtaW5EYXRlSGFzVGltZVwiIDogXCJtYXhEYXRlSGFzVGltZVwiXSA9IGRhdGVPYmouZ2V0SG91cnMoKSA+IDAgfHwgZGF0ZU9iai5nZXRNaW51dGVzKCkgPiAwIHx8IGRhdGVPYmouZ2V0U2Vjb25kcygpID4gMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc2VsZi5zZWxlY3RlZERhdGVzKSB7XG4gICAgICAgICAgICBzZWxmLnNlbGVjdGVkRGF0ZXMgPSBzZWxmLnNlbGVjdGVkRGF0ZXMuZmlsdGVyKGZ1bmN0aW9uIChkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBpc0VuYWJsZWQoZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghc2VsZi5zZWxlY3RlZERhdGVzLmxlbmd0aCAmJiB0eXBlID09PSBcIm1pblwiKSBzZXRIb3Vyc0Zyb21EYXRlKGRhdGVPYmopO1xuICAgICAgICAgICAgdXBkYXRlVmFsdWUoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc2VsZi5kYXlzQ29udGFpbmVyKSB7XG4gICAgICAgICAgICByZWRyYXcoKTtcbiAgICAgICAgICAgIGlmIChkYXRlT2JqICE9PSB1bmRlZmluZWQpIHNlbGYuY3VycmVudFllYXJFbGVtZW50W3R5cGVdID0gZGF0ZU9iai5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCk7ZWxzZSBzZWxmLmN1cnJlbnRZZWFyRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUodHlwZSk7XG4gICAgICAgICAgICBzZWxmLmN1cnJlbnRZZWFyRWxlbWVudC5kaXNhYmxlZCA9ICEhaW52ZXJzZURhdGVPYmogJiYgZGF0ZU9iaiAhPT0gdW5kZWZpbmVkICYmIGludmVyc2VEYXRlT2JqLmdldEZ1bGxZZWFyKCkgPT09IGRhdGVPYmouZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHBhcnNlQ29uZmlnKCkge1xuICAgICAgICB2YXIgYm9vbE9wdHMgPSBbXCJ3cmFwXCIsIFwid2Vla051bWJlcnNcIiwgXCJhbGxvd0lucHV0XCIsIFwiY2xpY2tPcGVuc1wiLCBcInRpbWVfMjRoclwiLCBcImVuYWJsZVRpbWVcIiwgXCJub0NhbGVuZGFyXCIsIFwiYWx0SW5wdXRcIiwgXCJzaG9ydGhhbmRDdXJyZW50TW9udGhcIiwgXCJpbmxpbmVcIiwgXCJzdGF0aWNcIiwgXCJlbmFibGVTZWNvbmRzXCIsIFwiZGlzYWJsZU1vYmlsZVwiXTtcbiAgICAgICAgdmFyIHVzZXJDb25maWcgPSBPYmplY3QuYXNzaWduKHt9LCBpbnN0YW5jZUNvbmZpZywgSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlbGVtZW50LmRhdGFzZXQgfHwge30pKSk7XG4gICAgICAgIHZhciBmb3JtYXRzJCQxID0ge307XG4gICAgICAgIHNlbGYuY29uZmlnLnBhcnNlRGF0ZSA9IHVzZXJDb25maWcucGFyc2VEYXRlO1xuICAgICAgICBzZWxmLmNvbmZpZy5mb3JtYXREYXRlID0gdXNlckNvbmZpZy5mb3JtYXREYXRlO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZi5jb25maWcsIFwiZW5hYmxlXCIsIHtcbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbmZpZy5fZW5hYmxlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc2V0OiBmdW5jdGlvbiBzZXQoZGF0ZXMpIHtcbiAgICAgICAgICAgIHNlbGYuY29uZmlnLl9lbmFibGUgPSBwYXJzZURhdGVSdWxlcyhkYXRlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGYuY29uZmlnLCBcImRpc2FibGVcIiwge1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29uZmlnLl9kaXNhYmxlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc2V0OiBmdW5jdGlvbiBzZXQoZGF0ZXMpIHtcbiAgICAgICAgICAgIHNlbGYuY29uZmlnLl9kaXNhYmxlID0gcGFyc2VEYXRlUnVsZXMoZGF0ZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHZhciB0aW1lTW9kZSA9IHVzZXJDb25maWcubW9kZSA9PT0gXCJ0aW1lXCI7XG5cbiAgICAgICAgaWYgKCF1c2VyQ29uZmlnLmRhdGVGb3JtYXQgJiYgKHVzZXJDb25maWcuZW5hYmxlVGltZSB8fCB0aW1lTW9kZSkpIHtcbiAgICAgICAgICBmb3JtYXRzJCQxLmRhdGVGb3JtYXQgPSB1c2VyQ29uZmlnLm5vQ2FsZW5kYXIgfHwgdGltZU1vZGUgPyBcIkg6aVwiICsgKHVzZXJDb25maWcuZW5hYmxlU2Vjb25kcyA/IFwiOlNcIiA6IFwiXCIpIDogZmxhdHBpY2tyLmRlZmF1bHRDb25maWcuZGF0ZUZvcm1hdCArIFwiIEg6aVwiICsgKHVzZXJDb25maWcuZW5hYmxlU2Vjb25kcyA/IFwiOlNcIiA6IFwiXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVzZXJDb25maWcuYWx0SW5wdXQgJiYgKHVzZXJDb25maWcuZW5hYmxlVGltZSB8fCB0aW1lTW9kZSkgJiYgIXVzZXJDb25maWcuYWx0Rm9ybWF0KSB7XG4gICAgICAgICAgZm9ybWF0cyQkMS5hbHRGb3JtYXQgPSB1c2VyQ29uZmlnLm5vQ2FsZW5kYXIgfHwgdGltZU1vZGUgPyBcImg6aVwiICsgKHVzZXJDb25maWcuZW5hYmxlU2Vjb25kcyA/IFwiOlMgS1wiIDogXCIgS1wiKSA6IGZsYXRwaWNrci5kZWZhdWx0Q29uZmlnLmFsdEZvcm1hdCArIChcIiBoOmlcIiArICh1c2VyQ29uZmlnLmVuYWJsZVNlY29uZHMgPyBcIjpTXCIgOiBcIlwiKSArIFwiIEtcIik7XG4gICAgICAgIH1cblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZi5jb25maWcsIFwibWluRGF0ZVwiLCB7XG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZi5jb25maWcuX21pbkRhdGU7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXQ6IG1pbk1heERhdGVTZXR0ZXIoXCJtaW5cIilcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxmLmNvbmZpZywgXCJtYXhEYXRlXCIsIHtcbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbmZpZy5fbWF4RGF0ZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNldDogbWluTWF4RGF0ZVNldHRlcihcIm1heFwiKVxuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgbWluTWF4VGltZVNldHRlciA9IGZ1bmN0aW9uIG1pbk1heFRpbWVTZXR0ZXIodHlwZSkge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICBzZWxmLmNvbmZpZ1t0eXBlID09PSBcIm1pblwiID8gXCJfbWluVGltZVwiIDogXCJfbWF4VGltZVwiXSA9IHNlbGYucGFyc2VEYXRlKHZhbCwgXCJIOmlcIik7XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZi5jb25maWcsIFwibWluVGltZVwiLCB7XG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZi5jb25maWcuX21pblRpbWU7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXQ6IG1pbk1heFRpbWVTZXR0ZXIoXCJtaW5cIilcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxmLmNvbmZpZywgXCJtYXhUaW1lXCIsIHtcbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbmZpZy5fbWF4VGltZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNldDogbWluTWF4VGltZVNldHRlcihcIm1heFwiKVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodXNlckNvbmZpZy5tb2RlID09PSBcInRpbWVcIikge1xuICAgICAgICAgIHNlbGYuY29uZmlnLm5vQ2FsZW5kYXIgPSB0cnVlO1xuICAgICAgICAgIHNlbGYuY29uZmlnLmVuYWJsZVRpbWUgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbihzZWxmLmNvbmZpZywgZm9ybWF0cyQkMSwgdXNlckNvbmZpZyk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib29sT3B0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHNlbGYuY29uZmlnW2Jvb2xPcHRzW2ldXSA9IHNlbGYuY29uZmlnW2Jvb2xPcHRzW2ldXSA9PT0gdHJ1ZSB8fCBzZWxmLmNvbmZpZ1tib29sT3B0c1tpXV0gPT09IFwidHJ1ZVwiO1xuICAgICAgICB9XG5cbiAgICAgICAgSE9PS1MuZmlsdGVyKGZ1bmN0aW9uIChob29rKSB7XG4gICAgICAgICAgcmV0dXJuIHNlbGYuY29uZmlnW2hvb2tdICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKGhvb2spIHtcbiAgICAgICAgICBzZWxmLmNvbmZpZ1tob29rXSA9IGFycmF5aWZ5KHNlbGYuY29uZmlnW2hvb2tdIHx8IFtdKS5tYXAoYmluZFRvSW5zdGFuY2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgc2VsZi5pc01vYmlsZSA9ICFzZWxmLmNvbmZpZy5kaXNhYmxlTW9iaWxlICYmICFzZWxmLmNvbmZpZy5pbmxpbmUgJiYgc2VsZi5jb25maWcubW9kZSA9PT0gXCJzaW5nbGVcIiAmJiAhc2VsZi5jb25maWcuZGlzYWJsZS5sZW5ndGggJiYgIXNlbGYuY29uZmlnLmVuYWJsZS5sZW5ndGggJiYgIXNlbGYuY29uZmlnLndlZWtOdW1iZXJzICYmIC9BbmRyb2lkfHdlYk9TfGlQaG9uZXxpUGFkfGlQb2R8QmxhY2tCZXJyeXxJRU1vYmlsZXxPcGVyYSBNaW5pL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcblxuICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgc2VsZi5jb25maWcucGx1Z2lucy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICB2YXIgcGx1Z2luQ29uZiA9IHNlbGYuY29uZmlnLnBsdWdpbnNbX2ldKHNlbGYpIHx8IHt9O1xuXG4gICAgICAgICAgZm9yICh2YXIga2V5IGluIHBsdWdpbkNvbmYpIHtcbiAgICAgICAgICAgIGlmIChIT09LUy5pbmRleE9mKGtleSkgPiAtMSkge1xuICAgICAgICAgICAgICBzZWxmLmNvbmZpZ1trZXldID0gYXJyYXlpZnkocGx1Z2luQ29uZltrZXldKS5tYXAoYmluZFRvSW5zdGFuY2UpLmNvbmNhdChzZWxmLmNvbmZpZ1trZXldKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHVzZXJDb25maWdba2V5XSA9PT0gXCJ1bmRlZmluZWRcIikgc2VsZi5jb25maWdba2V5XSA9IHBsdWdpbkNvbmZba2V5XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0cmlnZ2VyRXZlbnQoXCJvblBhcnNlQ29uZmlnXCIpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBzZXR1cExvY2FsZSgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZWxmLmNvbmZpZy5sb2NhbGUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIGZsYXRwaWNrci5sMTBuc1tzZWxmLmNvbmZpZy5sb2NhbGVdID09PSBcInVuZGVmaW5lZFwiKSBzZWxmLmNvbmZpZy5lcnJvckhhbmRsZXIobmV3IEVycm9yKFwiZmxhdHBpY2tyOiBpbnZhbGlkIGxvY2FsZSBcIiArIHNlbGYuY29uZmlnLmxvY2FsZSkpO1xuICAgICAgICBzZWxmLmwxMG4gPSBPYmplY3QuYXNzaWduKHt9LCBmbGF0cGlja3IubDEwbnMuZGVmYXVsdCwgdHlwZW9mIHNlbGYuY29uZmlnLmxvY2FsZSA9PT0gXCJvYmplY3RcIiA/IHNlbGYuY29uZmlnLmxvY2FsZSA6IHNlbGYuY29uZmlnLmxvY2FsZSAhPT0gXCJkZWZhdWx0XCIgPyBmbGF0cGlja3IubDEwbnNbc2VsZi5jb25maWcubG9jYWxlXSA6IHVuZGVmaW5lZCk7XG4gICAgICAgIHRva2VuUmVnZXguSyA9IFwiKFwiICsgc2VsZi5sMTBuLmFtUE1bMF0gKyBcInxcIiArIHNlbGYubDEwbi5hbVBNWzFdICsgXCJ8XCIgKyBzZWxmLmwxMG4uYW1QTVswXS50b0xvd2VyQ2FzZSgpICsgXCJ8XCIgKyBzZWxmLmwxMG4uYW1QTVsxXS50b0xvd2VyQ2FzZSgpICsgXCIpXCI7XG4gICAgICAgIHNlbGYuZm9ybWF0RGF0ZSA9IGNyZWF0ZURhdGVGb3JtYXR0ZXIoc2VsZik7XG4gICAgICAgIHNlbGYucGFyc2VEYXRlID0gY3JlYXRlRGF0ZVBhcnNlcih7XG4gICAgICAgICAgY29uZmlnOiBzZWxmLmNvbmZpZyxcbiAgICAgICAgICBsMTBuOiBzZWxmLmwxMG5cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHBvc2l0aW9uQ2FsZW5kYXIoY3VzdG9tUG9zaXRpb25FbGVtZW50KSB7XG4gICAgICAgIGlmIChzZWxmLmNhbGVuZGFyQ29udGFpbmVyID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgdHJpZ2dlckV2ZW50KFwib25QcmVDYWxlbmRhclBvc2l0aW9uXCIpO1xuICAgICAgICB2YXIgcG9zaXRpb25FbGVtZW50ID0gY3VzdG9tUG9zaXRpb25FbGVtZW50IHx8IHNlbGYuX3Bvc2l0aW9uRWxlbWVudDtcbiAgICAgICAgdmFyIGNhbGVuZGFySGVpZ2h0ID0gQXJyYXkucHJvdG90eXBlLnJlZHVjZS5jYWxsKHNlbGYuY2FsZW5kYXJDb250YWluZXIuY2hpbGRyZW4sIGZ1bmN0aW9uIChhY2MsIGNoaWxkKSB7XG4gICAgICAgICAgcmV0dXJuIGFjYyArIGNoaWxkLm9mZnNldEhlaWdodDtcbiAgICAgICAgfSwgMCksXG4gICAgICAgICAgICBjYWxlbmRhcldpZHRoID0gc2VsZi5jYWxlbmRhckNvbnRhaW5lci5vZmZzZXRXaWR0aCxcbiAgICAgICAgICAgIGNvbmZpZ1BvcyA9IHNlbGYuY29uZmlnLnBvc2l0aW9uLnNwbGl0KFwiIFwiKSxcbiAgICAgICAgICAgIGNvbmZpZ1Bvc1ZlcnRpY2FsID0gY29uZmlnUG9zWzBdLFxuICAgICAgICAgICAgY29uZmlnUG9zSG9yaXpvbnRhbCA9IGNvbmZpZ1Bvcy5sZW5ndGggPiAxID8gY29uZmlnUG9zWzFdIDogbnVsbCxcbiAgICAgICAgICAgIGlucHV0Qm91bmRzID0gcG9zaXRpb25FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFxuICAgICAgICAgICAgZGlzdGFuY2VGcm9tQm90dG9tID0gd2luZG93LmlubmVySGVpZ2h0IC0gaW5wdXRCb3VuZHMuYm90dG9tLFxuICAgICAgICAgICAgc2hvd09uVG9wID0gY29uZmlnUG9zVmVydGljYWwgPT09IFwiYWJvdmVcIiB8fCBjb25maWdQb3NWZXJ0aWNhbCAhPT0gXCJiZWxvd1wiICYmIGRpc3RhbmNlRnJvbUJvdHRvbSA8IGNhbGVuZGFySGVpZ2h0ICYmIGlucHV0Qm91bmRzLnRvcCA+IGNhbGVuZGFySGVpZ2h0O1xuICAgICAgICB2YXIgdG9wID0gd2luZG93LnBhZ2VZT2Zmc2V0ICsgaW5wdXRCb3VuZHMudG9wICsgKCFzaG93T25Ub3AgPyBwb3NpdGlvbkVsZW1lbnQub2Zmc2V0SGVpZ2h0ICsgMiA6IC1jYWxlbmRhckhlaWdodCAtIDIpO1xuICAgICAgICB0b2dnbGVDbGFzcyhzZWxmLmNhbGVuZGFyQ29udGFpbmVyLCBcImFycm93VG9wXCIsICFzaG93T25Ub3ApO1xuICAgICAgICB0b2dnbGVDbGFzcyhzZWxmLmNhbGVuZGFyQ29udGFpbmVyLCBcImFycm93Qm90dG9tXCIsIHNob3dPblRvcCk7XG4gICAgICAgIGlmIChzZWxmLmNvbmZpZy5pbmxpbmUpIHJldHVybjtcbiAgICAgICAgdmFyIGxlZnQgPSB3aW5kb3cucGFnZVhPZmZzZXQgKyBpbnB1dEJvdW5kcy5sZWZ0IC0gKGNvbmZpZ1Bvc0hvcml6b250YWwgIT0gbnVsbCAmJiBjb25maWdQb3NIb3Jpem9udGFsID09PSBcImNlbnRlclwiID8gKGNhbGVuZGFyV2lkdGggLSBpbnB1dEJvdW5kcy53aWR0aCkgLyAyIDogMCk7XG4gICAgICAgIHZhciByaWdodCA9IHdpbmRvdy5kb2N1bWVudC5ib2R5Lm9mZnNldFdpZHRoIC0gaW5wdXRCb3VuZHMucmlnaHQ7XG4gICAgICAgIHZhciByaWdodE1vc3QgPSBsZWZ0ICsgY2FsZW5kYXJXaWR0aCA+IHdpbmRvdy5kb2N1bWVudC5ib2R5Lm9mZnNldFdpZHRoO1xuICAgICAgICB0b2dnbGVDbGFzcyhzZWxmLmNhbGVuZGFyQ29udGFpbmVyLCBcInJpZ2h0TW9zdFwiLCByaWdodE1vc3QpO1xuICAgICAgICBpZiAoc2VsZi5jb25maWcuc3RhdGljKSByZXR1cm47XG4gICAgICAgIHNlbGYuY2FsZW5kYXJDb250YWluZXIuc3R5bGUudG9wID0gdG9wICsgXCJweFwiO1xuXG4gICAgICAgIGlmICghcmlnaHRNb3N0KSB7XG4gICAgICAgICAgc2VsZi5jYWxlbmRhckNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gbGVmdCArIFwicHhcIjtcbiAgICAgICAgICBzZWxmLmNhbGVuZGFyQ29udGFpbmVyLnN0eWxlLnJpZ2h0ID0gXCJhdXRvXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZi5jYWxlbmRhckNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gXCJhdXRvXCI7XG4gICAgICAgICAgc2VsZi5jYWxlbmRhckNvbnRhaW5lci5zdHlsZS5yaWdodCA9IHJpZ2h0ICsgXCJweFwiO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHJlZHJhdygpIHtcbiAgICAgICAgaWYgKHNlbGYuY29uZmlnLm5vQ2FsZW5kYXIgfHwgc2VsZi5pc01vYmlsZSkgcmV0dXJuO1xuICAgICAgICB1cGRhdGVOYXZpZ2F0aW9uQ3VycmVudE1vbnRoKCk7XG4gICAgICAgIGJ1aWxkRGF5cygpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBmb2N1c0FuZENsb3NlKCkge1xuICAgICAgICBzZWxmLl9pbnB1dC5mb2N1cygpO1xuXG4gICAgICAgIGlmICh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKFwiTVNJRVwiKSAhPT0gLTEgfHwgbmF2aWdhdG9yLm1zTWF4VG91Y2hQb2ludHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHNldFRpbWVvdXQoc2VsZi5jbG9zZSwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZi5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHNlbGVjdERhdGUoZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgdmFyIGlzU2VsZWN0YWJsZSA9IGZ1bmN0aW9uIGlzU2VsZWN0YWJsZShkYXkpIHtcbiAgICAgICAgICByZXR1cm4gZGF5LmNsYXNzTGlzdCAmJiBkYXkuY2xhc3NMaXN0LmNvbnRhaW5zKFwiZmxhdHBpY2tyLWRheVwiKSAmJiAhZGF5LmNsYXNzTGlzdC5jb250YWlucyhcImRpc2FibGVkXCIpICYmICFkYXkuY2xhc3NMaXN0LmNvbnRhaW5zKFwibm90QWxsb3dlZFwiKTtcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgdCA9IGZpbmRQYXJlbnQoZS50YXJnZXQsIGlzU2VsZWN0YWJsZSk7XG4gICAgICAgIGlmICh0ID09PSB1bmRlZmluZWQpIHJldHVybjtcbiAgICAgICAgdmFyIHRhcmdldCA9IHQ7XG4gICAgICAgIHZhciBzZWxlY3RlZERhdGUgPSBzZWxmLmxhdGVzdFNlbGVjdGVkRGF0ZU9iaiA9IG5ldyBEYXRlKHRhcmdldC5kYXRlT2JqLmdldFRpbWUoKSk7XG4gICAgICAgIHZhciBzaG91bGRDaGFuZ2VNb250aCA9IChzZWxlY3RlZERhdGUuZ2V0TW9udGgoKSA8IHNlbGYuY3VycmVudE1vbnRoIHx8IHNlbGVjdGVkRGF0ZS5nZXRNb250aCgpID4gc2VsZi5jdXJyZW50TW9udGggKyBzZWxmLmNvbmZpZy5zaG93TW9udGhzIC0gMSkgJiYgc2VsZi5jb25maWcubW9kZSAhPT0gXCJyYW5nZVwiO1xuICAgICAgICBzZWxmLnNlbGVjdGVkRGF0ZUVsZW0gPSB0YXJnZXQ7XG4gICAgICAgIGlmIChzZWxmLmNvbmZpZy5tb2RlID09PSBcInNpbmdsZVwiKSBzZWxmLnNlbGVjdGVkRGF0ZXMgPSBbc2VsZWN0ZWREYXRlXTtlbHNlIGlmIChzZWxmLmNvbmZpZy5tb2RlID09PSBcIm11bHRpcGxlXCIpIHtcbiAgICAgICAgICB2YXIgc2VsZWN0ZWRJbmRleCA9IGlzRGF0ZVNlbGVjdGVkKHNlbGVjdGVkRGF0ZSk7XG4gICAgICAgICAgaWYgKHNlbGVjdGVkSW5kZXgpIHNlbGYuc2VsZWN0ZWREYXRlcy5zcGxpY2UocGFyc2VJbnQoc2VsZWN0ZWRJbmRleCksIDEpO2Vsc2Ugc2VsZi5zZWxlY3RlZERhdGVzLnB1c2goc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgfSBlbHNlIGlmIChzZWxmLmNvbmZpZy5tb2RlID09PSBcInJhbmdlXCIpIHtcbiAgICAgICAgICBpZiAoc2VsZi5zZWxlY3RlZERhdGVzLmxlbmd0aCA9PT0gMikgc2VsZi5jbGVhcihmYWxzZSk7XG4gICAgICAgICAgc2VsZi5zZWxlY3RlZERhdGVzLnB1c2goc2VsZWN0ZWREYXRlKTtcbiAgICAgICAgICBpZiAoY29tcGFyZURhdGVzKHNlbGVjdGVkRGF0ZSwgc2VsZi5zZWxlY3RlZERhdGVzWzBdLCB0cnVlKSAhPT0gMCkgc2VsZi5zZWxlY3RlZERhdGVzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBhLmdldFRpbWUoKSAtIGIuZ2V0VGltZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHNldEhvdXJzRnJvbUlucHV0cygpO1xuXG4gICAgICAgIGlmIChzaG91bGRDaGFuZ2VNb250aCkge1xuICAgICAgICAgIHZhciBpc05ld1llYXIgPSBzZWxmLmN1cnJlbnRZZWFyICE9PSBzZWxlY3RlZERhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICBzZWxmLmN1cnJlbnRZZWFyID0gc2VsZWN0ZWREYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgc2VsZi5jdXJyZW50TW9udGggPSBzZWxlY3RlZERhdGUuZ2V0TW9udGgoKTtcbiAgICAgICAgICBpZiAoaXNOZXdZZWFyKSB0cmlnZ2VyRXZlbnQoXCJvblllYXJDaGFuZ2VcIik7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KFwib25Nb250aENoYW5nZVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHVwZGF0ZU5hdmlnYXRpb25DdXJyZW50TW9udGgoKTtcbiAgICAgICAgYnVpbGREYXlzKCk7XG4gICAgICAgIHVwZGF0ZVZhbHVlKCk7XG4gICAgICAgIGlmIChzZWxmLmNvbmZpZy5lbmFibGVUaW1lKSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZi5zaG93VGltZUlucHV0ID0gdHJ1ZTtcbiAgICAgICAgfSwgNTApO1xuICAgICAgICBpZiAoIXNob3VsZENoYW5nZU1vbnRoICYmIHNlbGYuY29uZmlnLm1vZGUgIT09IFwicmFuZ2VcIiAmJiBzZWxmLmNvbmZpZy5zaG93TW9udGhzID09PSAxKSBmb2N1c09uRGF5RWxlbSh0YXJnZXQpO2Vsc2Ugc2VsZi5zZWxlY3RlZERhdGVFbGVtICYmIHNlbGYuc2VsZWN0ZWREYXRlRWxlbS5mb2N1cygpO1xuICAgICAgICBpZiAoc2VsZi5ob3VyRWxlbWVudCAhPT0gdW5kZWZpbmVkKSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZi5ob3VyRWxlbWVudCAhPT0gdW5kZWZpbmVkICYmIHNlbGYuaG91ckVsZW1lbnQuc2VsZWN0KCk7XG4gICAgICAgIH0sIDQ1MSk7XG5cbiAgICAgICAgaWYgKHNlbGYuY29uZmlnLmNsb3NlT25TZWxlY3QpIHtcbiAgICAgICAgICB2YXIgc2luZ2xlID0gc2VsZi5jb25maWcubW9kZSA9PT0gXCJzaW5nbGVcIiAmJiAhc2VsZi5jb25maWcuZW5hYmxlVGltZTtcbiAgICAgICAgICB2YXIgcmFuZ2UgPSBzZWxmLmNvbmZpZy5tb2RlID09PSBcInJhbmdlXCIgJiYgc2VsZi5zZWxlY3RlZERhdGVzLmxlbmd0aCA9PT0gMiAmJiAhc2VsZi5jb25maWcuZW5hYmxlVGltZTtcblxuICAgICAgICAgIGlmIChzaW5nbGUgfHwgcmFuZ2UpIHtcbiAgICAgICAgICAgIGZvY3VzQW5kQ2xvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0cmlnZ2VyQ2hhbmdlKCk7XG4gICAgICB9XG5cbiAgICAgIHZhciBDQUxMQkFDS1MgPSB7XG4gICAgICAgIGxvY2FsZTogW3NldHVwTG9jYWxlLCB1cGRhdGVXZWVrZGF5c10sXG4gICAgICAgIHNob3dNb250aHM6IFtidWlsZE1vbnRocywgc2V0Q2FsZW5kYXJXaWR0aCwgYnVpbGRXZWVrZGF5c11cbiAgICAgIH07XG5cbiAgICAgIGZ1bmN0aW9uIHNldChvcHRpb24sIHZhbHVlKSB7XG4gICAgICAgIGlmIChvcHRpb24gIT09IG51bGwgJiYgdHlwZW9mIG9wdGlvbiA9PT0gXCJvYmplY3RcIikgT2JqZWN0LmFzc2lnbihzZWxmLmNvbmZpZywgb3B0aW9uKTtlbHNlIHtcbiAgICAgICAgICBzZWxmLmNvbmZpZ1tvcHRpb25dID0gdmFsdWU7XG4gICAgICAgICAgaWYgKENBTExCQUNLU1tvcHRpb25dICE9PSB1bmRlZmluZWQpIENBTExCQUNLU1tvcHRpb25dLmZvckVhY2goZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgICAgIHJldHVybiB4KCk7XG4gICAgICAgICAgfSk7ZWxzZSBpZiAoSE9PS1MuaW5kZXhPZihvcHRpb24pID4gLTEpIHNlbGYuY29uZmlnW29wdGlvbl0gPSBhcnJheWlmeSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZi5yZWRyYXcoKTtcbiAgICAgICAganVtcFRvRGF0ZSgpO1xuICAgICAgICB1cGRhdGVWYWx1ZShmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHNldFNlbGVjdGVkRGF0ZShpbnB1dERhdGUsIGZvcm1hdCkge1xuICAgICAgICB2YXIgZGF0ZXMgPSBbXTtcbiAgICAgICAgaWYgKGlucHV0RGF0ZSBpbnN0YW5jZW9mIEFycmF5KSBkYXRlcyA9IGlucHV0RGF0ZS5tYXAoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZURhdGUoZCwgZm9ybWF0KTtcbiAgICAgICAgfSk7ZWxzZSBpZiAoaW5wdXREYXRlIGluc3RhbmNlb2YgRGF0ZSB8fCB0eXBlb2YgaW5wdXREYXRlID09PSBcIm51bWJlclwiKSBkYXRlcyA9IFtzZWxmLnBhcnNlRGF0ZShpbnB1dERhdGUsIGZvcm1hdCldO2Vsc2UgaWYgKHR5cGVvZiBpbnB1dERhdGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBzd2l0Y2ggKHNlbGYuY29uZmlnLm1vZGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJzaW5nbGVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJ0aW1lXCI6XG4gICAgICAgICAgICAgIGRhdGVzID0gW3NlbGYucGFyc2VEYXRlKGlucHV0RGF0ZSwgZm9ybWF0KV07XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIFwibXVsdGlwbGVcIjpcbiAgICAgICAgICAgICAgZGF0ZXMgPSBpbnB1dERhdGUuc3BsaXQoc2VsZi5jb25maWcuY29uanVuY3Rpb24pLm1hcChmdW5jdGlvbiAoZGF0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlRGF0ZShkYXRlLCBmb3JtYXQpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgXCJyYW5nZVwiOlxuICAgICAgICAgICAgICBkYXRlcyA9IGlucHV0RGF0ZS5zcGxpdChzZWxmLmwxMG4ucmFuZ2VTZXBhcmF0b3IpLm1hcChmdW5jdGlvbiAoZGF0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlRGF0ZShkYXRlLCBmb3JtYXQpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHNlbGYuY29uZmlnLmVycm9ySGFuZGxlcihuZXcgRXJyb3IoXCJJbnZhbGlkIGRhdGUgc3VwcGxpZWQ6IFwiICsgSlNPTi5zdHJpbmdpZnkoaW5wdXREYXRlKSkpO1xuICAgICAgICBzZWxmLnNlbGVjdGVkRGF0ZXMgPSBkYXRlcy5maWx0ZXIoZnVuY3Rpb24gKGQpIHtcbiAgICAgICAgICByZXR1cm4gZCBpbnN0YW5jZW9mIERhdGUgJiYgaXNFbmFibGVkKGQsIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChzZWxmLmNvbmZpZy5tb2RlID09PSBcInJhbmdlXCIpIHNlbGYuc2VsZWN0ZWREYXRlcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgICAgcmV0dXJuIGEuZ2V0VGltZSgpIC0gYi5nZXRUaW1lKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBzZXREYXRlKGRhdGUsIHRyaWdnZXJDaGFuZ2UsIGZvcm1hdCkge1xuICAgICAgICBpZiAodHJpZ2dlckNoYW5nZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgdHJpZ2dlckNoYW5nZSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgZm9ybWF0ID0gc2VsZi5jb25maWcuZGF0ZUZvcm1hdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRlICE9PSAwICYmICFkYXRlIHx8IGRhdGUgaW5zdGFuY2VvZiBBcnJheSAmJiBkYXRlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHNlbGYuY2xlYXIodHJpZ2dlckNoYW5nZSk7XG4gICAgICAgIHNldFNlbGVjdGVkRGF0ZShkYXRlLCBmb3JtYXQpO1xuICAgICAgICBzZWxmLnNob3dUaW1lSW5wdXQgPSBzZWxmLnNlbGVjdGVkRGF0ZXMubGVuZ3RoID4gMDtcbiAgICAgICAgc2VsZi5sYXRlc3RTZWxlY3RlZERhdGVPYmogPSBzZWxmLnNlbGVjdGVkRGF0ZXNbMF07XG4gICAgICAgIHNlbGYucmVkcmF3KCk7XG4gICAgICAgIGp1bXBUb0RhdGUoKTtcbiAgICAgICAgc2V0SG91cnNGcm9tRGF0ZSgpO1xuICAgICAgICB1cGRhdGVWYWx1ZSh0cmlnZ2VyQ2hhbmdlKTtcbiAgICAgICAgaWYgKHRyaWdnZXJDaGFuZ2UpIHRyaWdnZXJFdmVudChcIm9uQ2hhbmdlXCIpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBwYXJzZURhdGVSdWxlcyhhcnIpIHtcbiAgICAgICAgcmV0dXJuIGFyci5zbGljZSgpLm1hcChmdW5jdGlvbiAocnVsZSkge1xuICAgICAgICAgIGlmICh0eXBlb2YgcnVsZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgcnVsZSA9PT0gXCJudW1iZXJcIiB8fCBydWxlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VEYXRlKHJ1bGUsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChydWxlICYmIHR5cGVvZiBydWxlID09PSBcIm9iamVjdFwiICYmIHJ1bGUuZnJvbSAmJiBydWxlLnRvKSByZXR1cm4ge1xuICAgICAgICAgICAgZnJvbTogc2VsZi5wYXJzZURhdGUocnVsZS5mcm9tLCB1bmRlZmluZWQpLFxuICAgICAgICAgICAgdG86IHNlbGYucGFyc2VEYXRlKHJ1bGUudG8sIHVuZGVmaW5lZClcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgcmV0dXJuIHJ1bGU7XG4gICAgICAgIH0pLmZpbHRlcihmdW5jdGlvbiAoeCkge1xuICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gc2V0dXBEYXRlcygpIHtcbiAgICAgICAgc2VsZi5zZWxlY3RlZERhdGVzID0gW107XG4gICAgICAgIHNlbGYubm93ID0gc2VsZi5wYXJzZURhdGUoc2VsZi5jb25maWcubm93KSB8fCBuZXcgRGF0ZSgpO1xuICAgICAgICB2YXIgcHJlbG9hZGVkRGF0ZSA9IHNlbGYuY29uZmlnLmRlZmF1bHREYXRlIHx8ICgoc2VsZi5pbnB1dC5ub2RlTmFtZSA9PT0gXCJJTlBVVFwiIHx8IHNlbGYuaW5wdXQubm9kZU5hbWUgPT09IFwiVEVYVEFSRUFcIikgJiYgc2VsZi5pbnB1dC5wbGFjZWhvbGRlciAmJiBzZWxmLmlucHV0LnZhbHVlID09PSBzZWxmLmlucHV0LnBsYWNlaG9sZGVyID8gbnVsbCA6IHNlbGYuaW5wdXQudmFsdWUpO1xuICAgICAgICBpZiAocHJlbG9hZGVkRGF0ZSkgc2V0U2VsZWN0ZWREYXRlKHByZWxvYWRlZERhdGUsIHNlbGYuY29uZmlnLmRhdGVGb3JtYXQpO1xuICAgICAgICB2YXIgaW5pdGlhbERhdGUgPSBzZWxmLnNlbGVjdGVkRGF0ZXMubGVuZ3RoID4gMCA/IHNlbGYuc2VsZWN0ZWREYXRlc1swXSA6IHNlbGYuY29uZmlnLm1pbkRhdGUgJiYgc2VsZi5jb25maWcubWluRGF0ZS5nZXRUaW1lKCkgPiBzZWxmLm5vdy5nZXRUaW1lKCkgPyBzZWxmLmNvbmZpZy5taW5EYXRlIDogc2VsZi5jb25maWcubWF4RGF0ZSAmJiBzZWxmLmNvbmZpZy5tYXhEYXRlLmdldFRpbWUoKSA8IHNlbGYubm93LmdldFRpbWUoKSA/IHNlbGYuY29uZmlnLm1heERhdGUgOiBzZWxmLm5vdztcbiAgICAgICAgc2VsZi5jdXJyZW50WWVhciA9IGluaXRpYWxEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIHNlbGYuY3VycmVudE1vbnRoID0gaW5pdGlhbERhdGUuZ2V0TW9udGgoKTtcbiAgICAgICAgaWYgKHNlbGYuc2VsZWN0ZWREYXRlcy5sZW5ndGggPiAwKSBzZWxmLmxhdGVzdFNlbGVjdGVkRGF0ZU9iaiA9IHNlbGYuc2VsZWN0ZWREYXRlc1swXTtcbiAgICAgICAgaWYgKHNlbGYuY29uZmlnLm1pblRpbWUgIT09IHVuZGVmaW5lZCkgc2VsZi5jb25maWcubWluVGltZSA9IHNlbGYucGFyc2VEYXRlKHNlbGYuY29uZmlnLm1pblRpbWUsIFwiSDppXCIpO1xuICAgICAgICBpZiAoc2VsZi5jb25maWcubWF4VGltZSAhPT0gdW5kZWZpbmVkKSBzZWxmLmNvbmZpZy5tYXhUaW1lID0gc2VsZi5wYXJzZURhdGUoc2VsZi5jb25maWcubWF4VGltZSwgXCJIOmlcIik7XG4gICAgICAgIHNlbGYubWluRGF0ZUhhc1RpbWUgPSAhIXNlbGYuY29uZmlnLm1pbkRhdGUgJiYgKHNlbGYuY29uZmlnLm1pbkRhdGUuZ2V0SG91cnMoKSA+IDAgfHwgc2VsZi5jb25maWcubWluRGF0ZS5nZXRNaW51dGVzKCkgPiAwIHx8IHNlbGYuY29uZmlnLm1pbkRhdGUuZ2V0U2Vjb25kcygpID4gMCk7XG4gICAgICAgIHNlbGYubWF4RGF0ZUhhc1RpbWUgPSAhIXNlbGYuY29uZmlnLm1heERhdGUgJiYgKHNlbGYuY29uZmlnLm1heERhdGUuZ2V0SG91cnMoKSA+IDAgfHwgc2VsZi5jb25maWcubWF4RGF0ZS5nZXRNaW51dGVzKCkgPiAwIHx8IHNlbGYuY29uZmlnLm1heERhdGUuZ2V0U2Vjb25kcygpID4gMCk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxmLCBcInNob3dUaW1lSW5wdXRcIiwge1xuICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Nob3dUaW1lSW5wdXQ7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIHNldChib29sKSB7XG4gICAgICAgICAgICBzZWxmLl9zaG93VGltZUlucHV0ID0gYm9vbDtcbiAgICAgICAgICAgIGlmIChzZWxmLmNhbGVuZGFyQ29udGFpbmVyKSB0b2dnbGVDbGFzcyhzZWxmLmNhbGVuZGFyQ29udGFpbmVyLCBcInNob3dUaW1lSW5wdXRcIiwgYm9vbCk7XG4gICAgICAgICAgICBzZWxmLmlzT3BlbiAmJiBwb3NpdGlvbkNhbGVuZGFyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gc2V0dXBJbnB1dHMoKSB7XG4gICAgICAgIHNlbGYuaW5wdXQgPSBzZWxmLmNvbmZpZy53cmFwID8gZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiW2RhdGEtaW5wdXRdXCIpIDogZWxlbWVudDtcblxuICAgICAgICBpZiAoIXNlbGYuaW5wdXQpIHtcbiAgICAgICAgICBzZWxmLmNvbmZpZy5lcnJvckhhbmRsZXIobmV3IEVycm9yKFwiSW52YWxpZCBpbnB1dCBlbGVtZW50IHNwZWNpZmllZFwiKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VsZi5pbnB1dC5fdHlwZSA9IHNlbGYuaW5wdXQudHlwZTtcbiAgICAgICAgc2VsZi5pbnB1dC50eXBlID0gXCJ0ZXh0XCI7XG4gICAgICAgIHNlbGYuaW5wdXQuY2xhc3NMaXN0LmFkZChcImZsYXRwaWNrci1pbnB1dFwiKTtcbiAgICAgICAgc2VsZi5faW5wdXQgPSBzZWxmLmlucHV0O1xuXG4gICAgICAgIGlmIChzZWxmLmNvbmZpZy5hbHRJbnB1dCkge1xuICAgICAgICAgIHNlbGYuYWx0SW5wdXQgPSBjcmVhdGVFbGVtZW50KHNlbGYuaW5wdXQubm9kZU5hbWUsIHNlbGYuaW5wdXQuY2xhc3NOYW1lICsgXCIgXCIgKyBzZWxmLmNvbmZpZy5hbHRJbnB1dENsYXNzKTtcbiAgICAgICAgICBzZWxmLl9pbnB1dCA9IHNlbGYuYWx0SW5wdXQ7XG4gICAgICAgICAgc2VsZi5hbHRJbnB1dC5wbGFjZWhvbGRlciA9IHNlbGYuaW5wdXQucGxhY2Vob2xkZXI7XG4gICAgICAgICAgc2VsZi5hbHRJbnB1dC5kaXNhYmxlZCA9IHNlbGYuaW5wdXQuZGlzYWJsZWQ7XG4gICAgICAgICAgc2VsZi5hbHRJbnB1dC5yZXF1aXJlZCA9IHNlbGYuaW5wdXQucmVxdWlyZWQ7XG4gICAgICAgICAgc2VsZi5hbHRJbnB1dC50YWJJbmRleCA9IHNlbGYuaW5wdXQudGFiSW5kZXg7XG4gICAgICAgICAgc2VsZi5hbHRJbnB1dC50eXBlID0gXCJ0ZXh0XCI7XG4gICAgICAgICAgc2VsZi5pbnB1dC5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsIFwiaGlkZGVuXCIpO1xuICAgICAgICAgIGlmICghc2VsZi5jb25maWcuc3RhdGljICYmIHNlbGYuaW5wdXQucGFyZW50Tm9kZSkgc2VsZi5pbnB1dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzZWxmLmFsdElucHV0LCBzZWxmLmlucHV0Lm5leHRTaWJsaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghc2VsZi5jb25maWcuYWxsb3dJbnB1dCkgc2VsZi5faW5wdXQuc2V0QXR0cmlidXRlKFwicmVhZG9ubHlcIiwgXCJyZWFkb25seVwiKTtcbiAgICAgICAgc2VsZi5fcG9zaXRpb25FbGVtZW50ID0gc2VsZi5jb25maWcucG9zaXRpb25FbGVtZW50IHx8IHNlbGYuX2lucHV0O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBzZXR1cE1vYmlsZSgpIHtcbiAgICAgICAgdmFyIGlucHV0VHlwZSA9IHNlbGYuY29uZmlnLmVuYWJsZVRpbWUgPyBzZWxmLmNvbmZpZy5ub0NhbGVuZGFyID8gXCJ0aW1lXCIgOiBcImRhdGV0aW1lLWxvY2FsXCIgOiBcImRhdGVcIjtcbiAgICAgICAgc2VsZi5tb2JpbGVJbnB1dCA9IGNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCBzZWxmLmlucHV0LmNsYXNzTmFtZSArIFwiIGZsYXRwaWNrci1tb2JpbGVcIik7XG4gICAgICAgIHNlbGYubW9iaWxlSW5wdXQuc3RlcCA9IHNlbGYuaW5wdXQuZ2V0QXR0cmlidXRlKFwic3RlcFwiKSB8fCBcImFueVwiO1xuICAgICAgICBzZWxmLm1vYmlsZUlucHV0LnRhYkluZGV4ID0gMTtcbiAgICAgICAgc2VsZi5tb2JpbGVJbnB1dC50eXBlID0gaW5wdXRUeXBlO1xuICAgICAgICBzZWxmLm1vYmlsZUlucHV0LmRpc2FibGVkID0gc2VsZi5pbnB1dC5kaXNhYmxlZDtcbiAgICAgICAgc2VsZi5tb2JpbGVJbnB1dC5yZXF1aXJlZCA9IHNlbGYuaW5wdXQucmVxdWlyZWQ7XG4gICAgICAgIHNlbGYubW9iaWxlSW5wdXQucGxhY2Vob2xkZXIgPSBzZWxmLmlucHV0LnBsYWNlaG9sZGVyO1xuICAgICAgICBzZWxmLm1vYmlsZUZvcm1hdFN0ciA9IGlucHV0VHlwZSA9PT0gXCJkYXRldGltZS1sb2NhbFwiID8gXCJZLW0tZFxcXFxUSDppOlNcIiA6IGlucHV0VHlwZSA9PT0gXCJkYXRlXCIgPyBcIlktbS1kXCIgOiBcIkg6aTpTXCI7XG5cbiAgICAgICAgaWYgKHNlbGYuc2VsZWN0ZWREYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc2VsZi5tb2JpbGVJbnB1dC5kZWZhdWx0VmFsdWUgPSBzZWxmLm1vYmlsZUlucHV0LnZhbHVlID0gc2VsZi5mb3JtYXREYXRlKHNlbGYuc2VsZWN0ZWREYXRlc1swXSwgc2VsZi5tb2JpbGVGb3JtYXRTdHIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbGYuY29uZmlnLm1pbkRhdGUpIHNlbGYubW9iaWxlSW5wdXQubWluID0gc2VsZi5mb3JtYXREYXRlKHNlbGYuY29uZmlnLm1pbkRhdGUsIFwiWS1tLWRcIik7XG4gICAgICAgIGlmIChzZWxmLmNvbmZpZy5tYXhEYXRlKSBzZWxmLm1vYmlsZUlucHV0Lm1heCA9IHNlbGYuZm9ybWF0RGF0ZShzZWxmLmNvbmZpZy5tYXhEYXRlLCBcIlktbS1kXCIpO1xuICAgICAgICBzZWxmLmlucHV0LnR5cGUgPSBcImhpZGRlblwiO1xuICAgICAgICBpZiAoc2VsZi5hbHRJbnB1dCAhPT0gdW5kZWZpbmVkKSBzZWxmLmFsdElucHV0LnR5cGUgPSBcImhpZGRlblwiO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHNlbGYuaW5wdXQucGFyZW50Tm9kZSkgc2VsZi5pbnB1dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzZWxmLm1vYmlsZUlucHV0LCBzZWxmLmlucHV0Lm5leHRTaWJsaW5nKTtcbiAgICAgICAgfSBjYXRjaCAoX2EpIHt9XG5cbiAgICAgICAgYmluZChzZWxmLm1vYmlsZUlucHV0LCBcImNoYW5nZVwiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIHNlbGYuc2V0RGF0ZShlLnRhcmdldC52YWx1ZSwgZmFsc2UsIHNlbGYubW9iaWxlRm9ybWF0U3RyKTtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoXCJvbkNoYW5nZVwiKTtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoXCJvbkNsb3NlXCIpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdG9nZ2xlKGUpIHtcbiAgICAgICAgaWYgKHNlbGYuaXNPcGVuID09PSB0cnVlKSByZXR1cm4gc2VsZi5jbG9zZSgpO1xuICAgICAgICBzZWxmLm9wZW4oZSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHRyaWdnZXJFdmVudChldmVudCwgZGF0YSkge1xuICAgICAgICBpZiAoc2VsZi5jb25maWcgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICB2YXIgaG9va3MgPSBzZWxmLmNvbmZpZ1tldmVudF07XG5cbiAgICAgICAgaWYgKGhvb2tzICE9PSB1bmRlZmluZWQgJiYgaG9va3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBob29rc1tpXSAmJiBpIDwgaG9va3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGhvb2tzW2ldKHNlbGYuc2VsZWN0ZWREYXRlcywgc2VsZi5pbnB1dC52YWx1ZSwgc2VsZiwgZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50ID09PSBcIm9uQ2hhbmdlXCIpIHtcbiAgICAgICAgICBzZWxmLmlucHV0LmRpc3BhdGNoRXZlbnQoY3JlYXRlRXZlbnQoXCJjaGFuZ2VcIikpO1xuICAgICAgICAgIHNlbGYuaW5wdXQuZGlzcGF0Y2hFdmVudChjcmVhdGVFdmVudChcImlucHV0XCIpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjcmVhdGVFdmVudChuYW1lKSB7XG4gICAgICAgIHZhciBlID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKTtcbiAgICAgICAgZS5pbml0RXZlbnQobmFtZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBpc0RhdGVTZWxlY3RlZChkYXRlKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZi5zZWxlY3RlZERhdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGNvbXBhcmVEYXRlcyhzZWxmLnNlbGVjdGVkRGF0ZXNbaV0sIGRhdGUpID09PSAwKSByZXR1cm4gXCJcIiArIGk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGlzRGF0ZUluUmFuZ2UoZGF0ZSkge1xuICAgICAgICBpZiAoc2VsZi5jb25maWcubW9kZSAhPT0gXCJyYW5nZVwiIHx8IHNlbGYuc2VsZWN0ZWREYXRlcy5sZW5ndGggPCAyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBjb21wYXJlRGF0ZXMoZGF0ZSwgc2VsZi5zZWxlY3RlZERhdGVzWzBdKSA+PSAwICYmIGNvbXBhcmVEYXRlcyhkYXRlLCBzZWxmLnNlbGVjdGVkRGF0ZXNbMV0pIDw9IDA7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIHVwZGF0ZU5hdmlnYXRpb25DdXJyZW50TW9udGgoKSB7XG4gICAgICAgIGlmIChzZWxmLmNvbmZpZy5ub0NhbGVuZGFyIHx8IHNlbGYuaXNNb2JpbGUgfHwgIXNlbGYubW9udGhOYXYpIHJldHVybjtcbiAgICAgICAgc2VsZi55ZWFyRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoeWVhckVsZW1lbnQsIGkpIHtcbiAgICAgICAgICB2YXIgZCA9IG5ldyBEYXRlKHNlbGYuY3VycmVudFllYXIsIHNlbGYuY3VycmVudE1vbnRoLCAxKTtcbiAgICAgICAgICBkLnNldE1vbnRoKHNlbGYuY3VycmVudE1vbnRoICsgaSk7XG4gICAgICAgICAgc2VsZi5tb250aEVsZW1lbnRzW2ldLnRleHRDb250ZW50ID0gbW9udGhUb1N0cihkLmdldE1vbnRoKCksIHNlbGYuY29uZmlnLnNob3J0aGFuZEN1cnJlbnRNb250aCwgc2VsZi5sMTBuKSArIFwiIFwiO1xuICAgICAgICAgIHllYXJFbGVtZW50LnZhbHVlID0gZC5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBzZWxmLl9oaWRlUHJldk1vbnRoQXJyb3cgPSBzZWxmLmNvbmZpZy5taW5EYXRlICE9PSB1bmRlZmluZWQgJiYgKHNlbGYuY3VycmVudFllYXIgPT09IHNlbGYuY29uZmlnLm1pbkRhdGUuZ2V0RnVsbFllYXIoKSA/IHNlbGYuY3VycmVudE1vbnRoIDw9IHNlbGYuY29uZmlnLm1pbkRhdGUuZ2V0TW9udGgoKSA6IHNlbGYuY3VycmVudFllYXIgPCBzZWxmLmNvbmZpZy5taW5EYXRlLmdldEZ1bGxZZWFyKCkpO1xuICAgICAgICBzZWxmLl9oaWRlTmV4dE1vbnRoQXJyb3cgPSBzZWxmLmNvbmZpZy5tYXhEYXRlICE9PSB1bmRlZmluZWQgJiYgKHNlbGYuY3VycmVudFllYXIgPT09IHNlbGYuY29uZmlnLm1heERhdGUuZ2V0RnVsbFllYXIoKSA/IHNlbGYuY3VycmVudE1vbnRoICsgMSA+IHNlbGYuY29uZmlnLm1heERhdGUuZ2V0TW9udGgoKSA6IHNlbGYuY3VycmVudFllYXIgPiBzZWxmLmNvbmZpZy5tYXhEYXRlLmdldEZ1bGxZZWFyKCkpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBnZXREYXRlU3RyKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gc2VsZi5zZWxlY3RlZERhdGVzLm1hcChmdW5jdGlvbiAoZE9iaikge1xuICAgICAgICAgIHJldHVybiBzZWxmLmZvcm1hdERhdGUoZE9iaiwgZm9ybWF0KTtcbiAgICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uIChkLCBpLCBhcnIpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZi5jb25maWcubW9kZSAhPT0gXCJyYW5nZVwiIHx8IHNlbGYuY29uZmlnLmVuYWJsZVRpbWUgfHwgYXJyLmluZGV4T2YoZCkgPT09IGk7XG4gICAgICAgIH0pLmpvaW4oc2VsZi5jb25maWcubW9kZSAhPT0gXCJyYW5nZVwiID8gc2VsZi5jb25maWcuY29uanVuY3Rpb24gOiBzZWxmLmwxMG4ucmFuZ2VTZXBhcmF0b3IpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiB1cGRhdGVWYWx1ZSh0cmlnZ2VyQ2hhbmdlKSB7XG4gICAgICAgIGlmICh0cmlnZ2VyQ2hhbmdlID09PSB2b2lkIDApIHtcbiAgICAgICAgICB0cmlnZ2VyQ2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzZWxmLnNlbGVjdGVkRGF0ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gc2VsZi5jbGVhcih0cmlnZ2VyQ2hhbmdlKTtcblxuICAgICAgICBpZiAoc2VsZi5tb2JpbGVJbnB1dCAhPT0gdW5kZWZpbmVkICYmIHNlbGYubW9iaWxlRm9ybWF0U3RyKSB7XG4gICAgICAgICAgc2VsZi5tb2JpbGVJbnB1dC52YWx1ZSA9IHNlbGYubGF0ZXN0U2VsZWN0ZWREYXRlT2JqICE9PSB1bmRlZmluZWQgPyBzZWxmLmZvcm1hdERhdGUoc2VsZi5sYXRlc3RTZWxlY3RlZERhdGVPYmosIHNlbGYubW9iaWxlRm9ybWF0U3RyKSA6IFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICBzZWxmLmlucHV0LnZhbHVlID0gZ2V0RGF0ZVN0cihzZWxmLmNvbmZpZy5kYXRlRm9ybWF0KTtcblxuICAgICAgICBpZiAoc2VsZi5hbHRJbnB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgc2VsZi5hbHRJbnB1dC52YWx1ZSA9IGdldERhdGVTdHIoc2VsZi5jb25maWcuYWx0Rm9ybWF0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0cmlnZ2VyQ2hhbmdlICE9PSBmYWxzZSkgdHJpZ2dlckV2ZW50KFwib25WYWx1ZVVwZGF0ZVwiKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gb25Nb250aE5hdkNsaWNrKGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB2YXIgaXNQcmV2TW9udGggPSBzZWxmLnByZXZNb250aE5hdi5jb250YWlucyhlLnRhcmdldCk7XG4gICAgICAgIHZhciBpc05leHRNb250aCA9IHNlbGYubmV4dE1vbnRoTmF2LmNvbnRhaW5zKGUudGFyZ2V0KTtcblxuICAgICAgICBpZiAoaXNQcmV2TW9udGggfHwgaXNOZXh0TW9udGgpIHtcbiAgICAgICAgICBjaGFuZ2VNb250aChpc1ByZXZNb250aCA/IC0xIDogMSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2VsZi55ZWFyRWxlbWVudHMuaW5kZXhPZihlLnRhcmdldCkgPj0gMCkge1xuICAgICAgICAgIGUudGFyZ2V0LnNlbGVjdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhcImFycm93VXBcIikpIHtcbiAgICAgICAgICBzZWxmLmNoYW5nZVllYXIoc2VsZi5jdXJyZW50WWVhciArIDEpO1xuICAgICAgICB9IGVsc2UgaWYgKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhcImFycm93RG93blwiKSkge1xuICAgICAgICAgIHNlbGYuY2hhbmdlWWVhcihzZWxmLmN1cnJlbnRZZWFyIC0gMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gdGltZVdyYXBwZXIoZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHZhciBpc0tleURvd24gPSBlLnR5cGUgPT09IFwia2V5ZG93blwiLFxuICAgICAgICAgICAgaW5wdXQgPSBlLnRhcmdldDtcblxuICAgICAgICBpZiAoc2VsZi5hbVBNICE9PSB1bmRlZmluZWQgJiYgZS50YXJnZXQgPT09IHNlbGYuYW1QTSkge1xuICAgICAgICAgIHNlbGYuYW1QTS50ZXh0Q29udGVudCA9IHNlbGYubDEwbi5hbVBNW2ludChzZWxmLmFtUE0udGV4dENvbnRlbnQgPT09IHNlbGYubDEwbi5hbVBNWzBdKV07XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbWluID0gcGFyc2VGbG9hdChpbnB1dC5nZXRBdHRyaWJ1dGUoXCJkYXRhLW1pblwiKSksXG4gICAgICAgICAgICBtYXggPSBwYXJzZUZsb2F0KGlucHV0LmdldEF0dHJpYnV0ZShcImRhdGEtbWF4XCIpKSxcbiAgICAgICAgICAgIHN0ZXAgPSBwYXJzZUZsb2F0KGlucHV0LmdldEF0dHJpYnV0ZShcImRhdGEtc3RlcFwiKSksXG4gICAgICAgICAgICBjdXJWYWx1ZSA9IHBhcnNlSW50KGlucHV0LnZhbHVlLCAxMCksXG4gICAgICAgICAgICBkZWx0YSA9IGUuZGVsdGEgfHwgKGlzS2V5RG93biA/IGUud2hpY2ggPT09IDM4ID8gMSA6IC0xIDogMCk7XG4gICAgICAgIHZhciBuZXdWYWx1ZSA9IGN1clZhbHVlICsgc3RlcCAqIGRlbHRhO1xuXG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQudmFsdWUgIT09IFwidW5kZWZpbmVkXCIgJiYgaW5wdXQudmFsdWUubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgdmFyIGlzSG91ckVsZW0gPSBpbnB1dCA9PT0gc2VsZi5ob3VyRWxlbWVudCxcbiAgICAgICAgICAgICAgaXNNaW51dGVFbGVtID0gaW5wdXQgPT09IHNlbGYubWludXRlRWxlbWVudDtcblxuICAgICAgICAgIGlmIChuZXdWYWx1ZSA8IG1pbikge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBtYXggKyBuZXdWYWx1ZSArIGludCghaXNIb3VyRWxlbSkgKyAoaW50KGlzSG91ckVsZW0pICYmIGludCghc2VsZi5hbVBNKSk7XG4gICAgICAgICAgICBpZiAoaXNNaW51dGVFbGVtKSBpbmNyZW1lbnROdW1JbnB1dCh1bmRlZmluZWQsIC0xLCBzZWxmLmhvdXJFbGVtZW50KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG5ld1ZhbHVlID4gbWF4KSB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IGlucHV0ID09PSBzZWxmLmhvdXJFbGVtZW50ID8gbmV3VmFsdWUgLSBtYXggLSBpbnQoIXNlbGYuYW1QTSkgOiBtaW47XG4gICAgICAgICAgICBpZiAoaXNNaW51dGVFbGVtKSBpbmNyZW1lbnROdW1JbnB1dCh1bmRlZmluZWQsIDEsIHNlbGYuaG91ckVsZW1lbnQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzZWxmLmFtUE0gJiYgaXNIb3VyRWxlbSAmJiAoc3RlcCA9PT0gMSA/IG5ld1ZhbHVlICsgY3VyVmFsdWUgPT09IDIzIDogTWF0aC5hYnMobmV3VmFsdWUgLSBjdXJWYWx1ZSkgPiBzdGVwKSkge1xuICAgICAgICAgICAgc2VsZi5hbVBNLnRleHRDb250ZW50ID0gc2VsZi5sMTBuLmFtUE1baW50KHNlbGYuYW1QTS50ZXh0Q29udGVudCA9PT0gc2VsZi5sMTBuLmFtUE1bMF0pXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpbnB1dC52YWx1ZSA9IHBhZChuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaW5pdCgpO1xuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gX2ZsYXRwaWNrcihub2RlTGlzdCwgY29uZmlnKSB7XG4gICAgICB2YXIgbm9kZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChub2RlTGlzdCk7XG4gICAgICB2YXIgaW5zdGFuY2VzID0gW107XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChub2RlLmdldEF0dHJpYnV0ZShcImRhdGEtZnAtb21pdFwiKSAhPT0gbnVsbCkgY29udGludWU7XG5cbiAgICAgICAgICBpZiAobm9kZS5fZmxhdHBpY2tyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5vZGUuX2ZsYXRwaWNrci5kZXN0cm95KCk7XG5cbiAgICAgICAgICAgIG5vZGUuX2ZsYXRwaWNrciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBub2RlLl9mbGF0cGlja3IgPSBGbGF0cGlja3JJbnN0YW5jZShub2RlLCBjb25maWcgfHwge30pO1xuICAgICAgICAgIGluc3RhbmNlcy5wdXNoKG5vZGUuX2ZsYXRwaWNrcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpbnN0YW5jZXMubGVuZ3RoID09PSAxID8gaW5zdGFuY2VzWzBdIDogaW5zdGFuY2VzO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgSFRNTEVsZW1lbnQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIEhUTUxDb2xsZWN0aW9uLnByb3RvdHlwZS5mbGF0cGlja3IgPSBOb2RlTGlzdC5wcm90b3R5cGUuZmxhdHBpY2tyID0gZnVuY3Rpb24gKGNvbmZpZykge1xuICAgICAgICByZXR1cm4gX2ZsYXRwaWNrcih0aGlzLCBjb25maWcpO1xuICAgICAgfTtcblxuICAgICAgSFRNTEVsZW1lbnQucHJvdG90eXBlLmZsYXRwaWNrciA9IGZ1bmN0aW9uIChjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIF9mbGF0cGlja3IoW3RoaXNdLCBjb25maWcpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgZmxhdHBpY2tyID0gZnVuY3Rpb24gZmxhdHBpY2tyKHNlbGVjdG9yLCBjb25maWcpIHtcbiAgICAgIGlmIChzZWxlY3RvciBpbnN0YW5jZW9mIE5vZGVMaXN0KSByZXR1cm4gX2ZsYXRwaWNrcihzZWxlY3RvciwgY29uZmlnKTtlbHNlIGlmICh0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIpIHJldHVybiBfZmxhdHBpY2tyKHdpbmRvdy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSwgY29uZmlnKTtcbiAgICAgIHJldHVybiBfZmxhdHBpY2tyKFtzZWxlY3Rvcl0sIGNvbmZpZyk7XG4gICAgfTtcblxuICAgIGZsYXRwaWNrci5kZWZhdWx0Q29uZmlnID0gZGVmYXVsdHM7XG4gICAgZmxhdHBpY2tyLmwxMG5zID0ge1xuICAgICAgZW46IE9iamVjdC5hc3NpZ24oe30sIGVuZ2xpc2gpLFxuICAgICAgZGVmYXVsdDogT2JqZWN0LmFzc2lnbih7fSwgZW5nbGlzaClcbiAgICB9O1xuXG4gICAgZmxhdHBpY2tyLmxvY2FsaXplID0gZnVuY3Rpb24gKGwxMG4pIHtcbiAgICAgIGZsYXRwaWNrci5sMTBucy5kZWZhdWx0ID0gT2JqZWN0LmFzc2lnbih7fSwgZmxhdHBpY2tyLmwxMG5zLmRlZmF1bHQsIGwxMG4pO1xuICAgIH07XG5cbiAgICBmbGF0cGlja3Iuc2V0RGVmYXVsdHMgPSBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICBmbGF0cGlja3IuZGVmYXVsdENvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIGZsYXRwaWNrci5kZWZhdWx0Q29uZmlnLCBjb25maWcpO1xuICAgIH07XG5cbiAgICBmbGF0cGlja3IucGFyc2VEYXRlID0gY3JlYXRlRGF0ZVBhcnNlcih7fSk7XG4gICAgZmxhdHBpY2tyLmZvcm1hdERhdGUgPSBjcmVhdGVEYXRlRm9ybWF0dGVyKHt9KTtcbiAgICBmbGF0cGlja3IuY29tcGFyZURhdGVzID0gY29tcGFyZURhdGVzO1xuXG4gICAgaWYgKHR5cGVvZiBqUXVlcnkgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGpRdWVyeS5mbi5mbGF0cGlja3IgPSBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgIHJldHVybiBfZmxhdHBpY2tyKHRoaXMsIGNvbmZpZyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIERhdGUucHJvdG90eXBlLmZwX2luY3IgPSBmdW5jdGlvbiAoZGF5cykge1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMuZ2V0RnVsbFllYXIoKSwgdGhpcy5nZXRNb250aCgpLCB0aGlzLmdldERhdGUoKSArICh0eXBlb2YgZGF5cyA9PT0gXCJzdHJpbmdcIiA/IHBhcnNlSW50KGRheXMsIDEwKSA6IGRheXMpKTtcbiAgICB9O1xuXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIHdpbmRvdy5mbGF0cGlja3IgPSBmbGF0cGlja3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZsYXRwaWNrcjtcblxufSkpKTtcbiJdfQ==",
    "\"use strict\";\n/* Copyright 2015 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.SimpleLinkService = exports.PDFLinkService = undefined;\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _ui_utils = require(\"./ui_utils.js\");\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * @typedef {Object} PDFLinkServiceOptions\n * @property {EventBus} eventBus - The application event bus.\n * @property {number} [externalLinkTarget] - Specifies the `target` attribute\n *   for external links. Must use one of the values from {LinkTarget}.\n *   Defaults to using no target.\n * @property {string} [externalLinkRel] - Specifies the `rel` attribute for\n *   external links. Defaults to stripping the referrer.\n */\n\n/**\n * Performs navigation functions inside PDF, such as opening specified page,\n * or destination.\n * @implements {IPDFLinkService}\n */\nvar PDFLinkService = function () {\n  /**\n   * @param {PDFLinkServiceOptions} options\n   */\n  function PDFLinkService() {\n    var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n        eventBus = _ref.eventBus,\n        _ref$externalLinkTarg = _ref.externalLinkTarget,\n        externalLinkTarget = _ref$externalLinkTarg === undefined ? null : _ref$externalLinkTarg,\n        _ref$externalLinkRel = _ref.externalLinkRel,\n        externalLinkRel = _ref$externalLinkRel === undefined ? null : _ref$externalLinkRel,\n        _ref$externalLinkEnab = _ref.externalLinkEnabled,\n        externalLinkEnabled = _ref$externalLinkEnab === undefined ? true : _ref$externalLinkEnab;\n\n    _classCallCheck(this, PDFLinkService);\n\n    this.eventBus = eventBus || (0, _ui_utils.getGlobalEventBus)();\n    this.externalLinkTarget = externalLinkTarget;\n    this.externalLinkRel = externalLinkRel;\n    this.externalLinkEnabled = externalLinkEnabled;\n\n    this.baseUrl = null;\n    this.pdfDocument = null;\n    this.pdfViewer = null;\n    this.pdfHistory = null;\n\n    this._pagesRefCache = null;\n  }\n\n  _createClass(PDFLinkService, [{\n    key: \"setDocument\",\n    value: function setDocument(pdfDocument) {\n      var baseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n      this.baseUrl = baseUrl;\n      this.pdfDocument = pdfDocument;\n      this._pagesRefCache = Object.create(null);\n    }\n  }, {\n    key: \"setViewer\",\n    value: function setViewer(pdfViewer) {\n      this.pdfViewer = pdfViewer;\n    }\n  }, {\n    key: \"setHistory\",\n    value: function setHistory(pdfHistory) {\n      this.pdfHistory = pdfHistory;\n    }\n\n    /**\n     * @type {number}\n     */\n\n  }, {\n    key: \"navigateTo\",\n\n\n    /**\n     * @param {string|Array} dest - The named, or explicit, PDF destination.\n     */\n    value: function navigateTo(dest) {\n      var _this = this;\n\n      var goToDestination = function goToDestination(_ref2) {\n        var namedDest = _ref2.namedDest,\n            explicitDest = _ref2.explicitDest;\n\n        // Dest array looks like that: <page-ref> </XYZ|/FitXXX> <args..>\n        var destRef = explicitDest[0];\n        var pageNumber = void 0;\n\n        if (destRef instanceof Object) {\n          pageNumber = _this._cachedPageNumber(destRef);\n\n          if (pageNumber === null) {\n            // Fetch the page reference if it's not yet available. This could\n            // only occur during loading, before all pages have been resolved.\n            _this.pdfDocument.getPageIndex(destRef).then(function (pageIndex) {\n              _this.cachePageRef(pageIndex + 1, destRef);\n              goToDestination({ namedDest: namedDest, explicitDest: explicitDest });\n            }).catch(function () {\n              console.error(\"PDFLinkService.navigateTo: \\\"\" + destRef + \"\\\" is not \" + (\"a valid page reference, for dest=\\\"\" + dest + \"\\\".\"));\n            });\n            return;\n          }\n        } else if (Number.isInteger(destRef)) {\n          pageNumber = destRef + 1;\n        } else {\n          console.error(\"PDFLinkService.navigateTo: \\\"\" + destRef + \"\\\" is not \" + (\"a valid destination reference, for dest=\\\"\" + dest + \"\\\".\"));\n          return;\n        }\n        if (!pageNumber || pageNumber < 1 || pageNumber > _this.pagesCount) {\n          console.error(\"PDFLinkService.navigateTo: \\\"\" + pageNumber + \"\\\" is not \" + (\"a valid page number, for dest=\\\"\" + dest + \"\\\".\"));\n          return;\n        }\n\n        if (_this.pdfHistory) {\n          // Update the browser history before scrolling the new destination into\n          // view, to be able to accurately capture the current document position.\n          _this.pdfHistory.pushCurrentPosition();\n          _this.pdfHistory.push({ namedDest: namedDest, explicitDest: explicitDest, pageNumber: pageNumber });\n        }\n\n        _this.pdfViewer.scrollPageIntoView({\n          pageNumber: pageNumber,\n          destArray: explicitDest\n        });\n      };\n\n      new Promise(function (resolve, reject) {\n        if (typeof dest === \"string\") {\n          _this.pdfDocument.getDestination(dest).then(function (destArray) {\n            resolve({\n              namedDest: dest,\n              explicitDest: destArray\n            });\n          });\n          return;\n        }\n        resolve({\n          namedDest: \"\",\n          explicitDest: dest\n        });\n      }).then(function (data) {\n        if (!Array.isArray(data.explicitDest)) {\n          console.error(\"PDFLinkService.navigateTo: \\\"\" + data.explicitDest + \"\\\" is\" + (\" not a valid destination array, for dest=\\\"\" + dest + \"\\\".\"));\n          return;\n        }\n        goToDestination(data);\n      });\n    }\n\n    /**\n     * @param {string|Array} dest - The PDF destination object.\n     * @returns {string} The hyperlink to the PDF object.\n     */\n\n  }, {\n    key: \"getDestinationHash\",\n    value: function getDestinationHash(dest) {\n      if (typeof dest === \"string\") {\n        return this.getAnchorUrl(\"#\" + escape(dest));\n      }\n      if (Array.isArray(dest)) {\n        var str = JSON.stringify(dest);\n        return this.getAnchorUrl(\"#\" + escape(str));\n      }\n      return this.getAnchorUrl(\"\");\n    }\n\n    /**\n     * Prefix the full url on anchor links to make sure that links are resolved\n     * relative to the current URL instead of the one defined in <base href>.\n     * @param {string} anchor The anchor hash, including the #.\n     * @returns {string} The hyperlink to the PDF object.\n     */\n\n  }, {\n    key: \"getAnchorUrl\",\n    value: function getAnchorUrl(anchor) {\n      return (this.baseUrl || \"\") + anchor;\n    }\n\n    /**\n     * @param {string} hash\n     */\n\n  }, {\n    key: \"setHash\",\n    value: function setHash(hash) {\n      var pageNumber = void 0,\n          dest = void 0;\n      if (hash.includes(\"=\")) {\n        var params = (0, _ui_utils.parseQueryString)(hash);\n        if (\"search\" in params) {\n          this.eventBus.dispatch(\"findfromurlhash\", {\n            source: this,\n            query: params[\"search\"].replace(/\"/g, \"\"),\n            phraseSearch: params[\"phrase\"] === \"true\"\n          });\n        }\n        // borrowing syntax from \"Parameters for Opening PDF Files\"\n        if (\"nameddest\" in params) {\n          this.navigateTo(params.nameddest);\n          return;\n        }\n        if (\"page\" in params) {\n          pageNumber = params.page | 0 || 1;\n        }\n        if (\"zoom\" in params) {\n          // Build the destination array.\n          var zoomArgs = params.zoom.split(\",\"); // scale,left,top\n          var zoomArg = zoomArgs[0];\n          var zoomArgNumber = parseFloat(zoomArg);\n\n          if (!zoomArg.includes(\"Fit\")) {\n            // If the zoomArg is a number, it has to get divided by 100. If it's\n            // a string, it should stay as it is.\n            dest = [null, { name: \"XYZ\" }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null, zoomArgs.length > 2 ? zoomArgs[2] | 0 : null, zoomArgNumber ? zoomArgNumber / 100 : zoomArg];\n          } else {\n            if (zoomArg === \"Fit\" || zoomArg === \"FitB\") {\n              dest = [null, { name: zoomArg }];\n            } else if (zoomArg === \"FitH\" || zoomArg === \"FitBH\" || zoomArg === \"FitV\" || zoomArg === \"FitBV\") {\n              dest = [null, { name: zoomArg }, zoomArgs.length > 1 ? zoomArgs[1] | 0 : null];\n            } else if (zoomArg === \"FitR\") {\n              if (zoomArgs.length !== 5) {\n                console.error('PDFLinkService.setHash: Not enough parameters for \"FitR\".');\n              } else {\n                dest = [null, { name: zoomArg }, zoomArgs[1] | 0, zoomArgs[2] | 0, zoomArgs[3] | 0, zoomArgs[4] | 0];\n              }\n            } else {\n              console.error(\"PDFLinkService.setHash: \\\"\" + zoomArg + \"\\\" is not \" + \"a valid zoom value.\");\n            }\n          }\n        }\n        if (dest) {\n          this.pdfViewer.scrollPageIntoView({\n            pageNumber: pageNumber || this.page,\n            destArray: dest,\n            allowNegativeOffset: true\n          });\n        } else if (pageNumber) {\n          this.page = pageNumber; // simple page\n        }\n        if (\"pagemode\" in params) {\n          this.eventBus.dispatch(\"pagemode\", {\n            source: this,\n            mode: params.pagemode\n          });\n        }\n      } else {\n        // Named (or explicit) destination.\n        dest = unescape(hash);\n        try {\n          dest = JSON.parse(dest);\n\n          if (!Array.isArray(dest)) {\n            // Avoid incorrectly rejecting a valid named destination, such as\n            // e.g. \"4.3\" or \"true\", because `JSON.parse` converted its type.\n            dest = dest.toString();\n          }\n        } catch (ex) {}\n\n        if (typeof dest === \"string\" || isValidExplicitDestination(dest)) {\n          this.navigateTo(dest);\n          return;\n        }\n        console.error(\"PDFLinkService.setHash: \\\"\" + unescape(hash) + \"\\\" is not \" + \"a valid destination.\");\n      }\n    }\n\n    /**\n     * @param {string} action\n     */\n\n  }, {\n    key: \"executeNamedAction\",\n    value: function executeNamedAction(action) {\n      // See PDF reference, table 8.45 - Named action\n      switch (action) {\n        case \"GoBack\":\n          if (this.pdfHistory) {\n            this.pdfHistory.back();\n          }\n          break;\n\n        case \"GoForward\":\n          if (this.pdfHistory) {\n            this.pdfHistory.forward();\n          }\n          break;\n\n        case \"NextPage\":\n          if (this.page < this.pagesCount) {\n            this.page++;\n          }\n          break;\n\n        case \"PrevPage\":\n          if (this.page > 1) {\n            this.page--;\n          }\n          break;\n\n        case \"LastPage\":\n          this.page = this.pagesCount;\n          break;\n\n        case \"FirstPage\":\n          this.page = 1;\n          break;\n\n        default:\n          break; // No action according to spec\n      }\n\n      this.eventBus.dispatch(\"namedaction\", {\n        source: this,\n        action: action\n      });\n    }\n\n    /**\n     * @param {number} pageNum - page number.\n     * @param {Object} pageRef - reference to the page.\n     */\n\n  }, {\n    key: \"cachePageRef\",\n    value: function cachePageRef(pageNum, pageRef) {\n      if (!pageRef) {\n        return;\n      }\n      var refStr = pageRef.gen === 0 ? pageRef.num + \"R\" : pageRef.num + \"R\" + pageRef.gen;\n      this._pagesRefCache[refStr] = pageNum;\n    }\n  }, {\n    key: \"_cachedPageNumber\",\n    value: function _cachedPageNumber(pageRef) {\n      var refStr = pageRef.gen === 0 ? pageRef.num + \"R\" : pageRef.num + \"R\" + pageRef.gen;\n      return this._pagesRefCache && this._pagesRefCache[refStr] || null;\n    }\n\n    /**\n     * @param {number} pageNumber\n     */\n\n  }, {\n    key: \"isPageVisible\",\n    value: function isPageVisible(pageNumber) {\n      return this.pdfViewer.isPageVisible(pageNumber);\n    }\n  }, {\n    key: \"pagesCount\",\n    get: function get() {\n      return this.pdfDocument ? this.pdfDocument.numPages : 0;\n    }\n\n    /**\n     * @type {number}\n     */\n\n  }, {\n    key: \"page\",\n    get: function get() {\n      return this.pdfViewer.currentPageNumber;\n    }\n\n    /**\n     * @param {number} value\n     */\n    ,\n    set: function set(value) {\n      this.pdfViewer.currentPageNumber = value;\n    }\n\n    /**\n     * @type {number}\n     */\n\n  }, {\n    key: \"rotation\",\n    get: function get() {\n      return this.pdfViewer.pagesRotation;\n    }\n\n    /**\n     * @param {number} value\n     */\n    ,\n    set: function set(value) {\n      this.pdfViewer.pagesRotation = value;\n    }\n  }]);\n\n  return PDFLinkService;\n}();\n\nfunction isValidExplicitDestination(dest) {\n  if (!Array.isArray(dest)) {\n    return false;\n  }\n  var destLength = dest.length;\n  if (destLength < 2) {\n    return false;\n  }\n  var page = dest[0];\n  if (!((typeof page === \"undefined\" ? \"undefined\" : _typeof(page)) === \"object\" && Number.isInteger(page.num) && Number.isInteger(page.gen)) && !(Number.isInteger(page) && page >= 0)) {\n    return false;\n  }\n  var zoom = dest[1];\n  if (!((typeof zoom === \"undefined\" ? \"undefined\" : _typeof(zoom)) === \"object\" && typeof zoom.name === \"string\")) {\n    return false;\n  }\n  var allowNull = true;\n  switch (zoom.name) {\n    case \"XYZ\":\n      if (destLength !== 5) {\n        return false;\n      }\n      break;\n    case \"Fit\":\n    case \"FitB\":\n      return destLength === 2;\n    case \"FitH\":\n    case \"FitBH\":\n    case \"FitV\":\n    case \"FitBV\":\n      if (destLength !== 3) {\n        return false;\n      }\n      break;\n    case \"FitR\":\n      if (destLength !== 6) {\n        return false;\n      }\n      allowNull = false;\n      break;\n    default:\n      return false;\n  }\n  for (var i = 2; i < destLength; i++) {\n    var param = dest[i];\n    if (!(typeof param === \"number\" || allowNull && param === null)) {\n      return false;\n    }\n  }\n  return true;\n}\n\n/**\n * @implements {IPDFLinkService}\n */\n\nvar SimpleLinkService = function () {\n  function SimpleLinkService() {\n    _classCallCheck(this, SimpleLinkService);\n\n    this.externalLinkTarget = null;\n    this.externalLinkRel = null;\n    this.externalLinkEnabled = true;\n  }\n\n  /**\n   * @type {number}\n   */\n\n\n  _createClass(SimpleLinkService, [{\n    key: \"navigateTo\",\n\n\n    /**\n     * @param dest - The PDF destination object.\n     */\n    value: function navigateTo(dest) {}\n\n    /**\n     * @param dest - The PDF destination object.\n     * @returns {string} The hyperlink to the PDF object.\n     */\n\n  }, {\n    key: \"getDestinationHash\",\n    value: function getDestinationHash(dest) {\n      return \"#\";\n    }\n\n    /**\n     * @param hash - The PDF parameters/hash.\n     * @returns {string} The hyperlink to the PDF object.\n     */\n\n  }, {\n    key: \"getAnchorUrl\",\n    value: function getAnchorUrl(hash) {\n      return \"#\";\n    }\n\n    /**\n     * @param {string} hash\n     */\n\n  }, {\n    key: \"setHash\",\n    value: function setHash(hash) {}\n\n    /**\n     * @param {string} action\n     */\n\n  }, {\n    key: \"executeNamedAction\",\n    value: function executeNamedAction(action) {}\n\n    /**\n     * @param {number} pageNum - page number.\n     * @param {Object} pageRef - reference to the page.\n     */\n\n  }, {\n    key: \"cachePageRef\",\n    value: function cachePageRef(pageNum, pageRef) {}\n\n    /**\n     * @param {number} pageNumber\n     */\n\n  }, {\n    key: \"isPageVisible\",\n    value: function isPageVisible(pageNumber) {\n      return true;\n    }\n  }, {\n    key: \"pagesCount\",\n    get: function get() {\n      return 0;\n    }\n\n    /**\n     * @type {number}\n     */\n\n  }, {\n    key: \"page\",\n    get: function get() {\n      return 0;\n    }\n\n    /**\n     * @param {number} value\n     */\n    ,\n    set: function set(value) {}\n\n    /**\n     * @type {number}\n     */\n\n  }, {\n    key: \"rotation\",\n    get: function get() {\n      return 0;\n    }\n\n    /**\n     * @param {number} value\n     */\n    ,\n    set: function set(value) {}\n  }]);\n\n  return SimpleLinkService;\n}();\n\nexports.PDFLinkService = PDFLinkService;\nexports.SimpleLinkService = SimpleLinkService;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBkZl9saW5rX3NlcnZpY2UuanMiXSwibmFtZXMiOlsiUERGTGlua1NlcnZpY2UiLCJldmVudEJ1cyIsImV4dGVybmFsTGlua1RhcmdldCIsImV4dGVybmFsTGlua1JlbCIsImV4dGVybmFsTGlua0VuYWJsZWQiLCJiYXNlVXJsIiwicGRmRG9jdW1lbnQiLCJwZGZWaWV3ZXIiLCJwZGZIaXN0b3J5IiwiX3BhZ2VzUmVmQ2FjaGUiLCJPYmplY3QiLCJjcmVhdGUiLCJkZXN0IiwiZ29Ub0Rlc3RpbmF0aW9uIiwibmFtZWREZXN0IiwiZXhwbGljaXREZXN0IiwiZGVzdFJlZiIsInBhZ2VOdW1iZXIiLCJfY2FjaGVkUGFnZU51bWJlciIsImdldFBhZ2VJbmRleCIsInRoZW4iLCJjYWNoZVBhZ2VSZWYiLCJwYWdlSW5kZXgiLCJjYXRjaCIsImNvbnNvbGUiLCJlcnJvciIsIk51bWJlciIsImlzSW50ZWdlciIsInBhZ2VzQ291bnQiLCJwdXNoQ3VycmVudFBvc2l0aW9uIiwicHVzaCIsInNjcm9sbFBhZ2VJbnRvVmlldyIsImRlc3RBcnJheSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZ2V0RGVzdGluYXRpb24iLCJBcnJheSIsImlzQXJyYXkiLCJkYXRhIiwiZ2V0QW5jaG9yVXJsIiwiZXNjYXBlIiwic3RyIiwiSlNPTiIsInN0cmluZ2lmeSIsImFuY2hvciIsImhhc2giLCJpbmNsdWRlcyIsInBhcmFtcyIsImRpc3BhdGNoIiwic291cmNlIiwicXVlcnkiLCJyZXBsYWNlIiwicGhyYXNlU2VhcmNoIiwibmF2aWdhdGVUbyIsIm5hbWVkZGVzdCIsInBhZ2UiLCJ6b29tQXJncyIsInpvb20iLCJzcGxpdCIsInpvb21BcmciLCJ6b29tQXJnTnVtYmVyIiwicGFyc2VGbG9hdCIsIm5hbWUiLCJsZW5ndGgiLCJhbGxvd05lZ2F0aXZlT2Zmc2V0IiwibW9kZSIsInBhZ2Vtb2RlIiwidW5lc2NhcGUiLCJwYXJzZSIsInRvU3RyaW5nIiwiZXgiLCJpc1ZhbGlkRXhwbGljaXREZXN0aW5hdGlvbiIsImFjdGlvbiIsImJhY2siLCJmb3J3YXJkIiwicGFnZU51bSIsInBhZ2VSZWYiLCJyZWZTdHIiLCJnZW4iLCJudW0iLCJpc1BhZ2VWaXNpYmxlIiwibnVtUGFnZXMiLCJjdXJyZW50UGFnZU51bWJlciIsInZhbHVlIiwicGFnZXNSb3RhdGlvbiIsImRlc3RMZW5ndGgiLCJhbGxvd051bGwiLCJpIiwicGFyYW0iLCJTaW1wbGVMaW5rU2VydmljZSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZUE7Ozs7QUFFQTs7Ozs7Ozs7OztBQVVBOzs7OztJQUtNQSxjO0FBQ0o7OztBQUdBLDRCQUtRO0FBQUEsbUZBQUosRUFBSTtBQUFBLFFBSk5DLFFBSU0sUUFKTkEsUUFJTTtBQUFBLHFDQUhOQyxrQkFHTTtBQUFBLFFBSE5BLGtCQUdNLHlDQUhlLElBR2Y7QUFBQSxvQ0FGTkMsZUFFTTtBQUFBLFFBRk5BLGVBRU0sd0NBRlksSUFFWjtBQUFBLHFDQUROQyxtQkFDTTtBQUFBLFFBRE5BLG1CQUNNLHlDQURnQixJQUNoQjs7QUFBQTs7QUFDTixTQUFLSCxRQUFMLEdBQWdCQSxZQUFZLGtDQUE1QjtBQUNBLFNBQUtDLGtCQUFMLEdBQTBCQSxrQkFBMUI7QUFDQSxTQUFLQyxlQUFMLEdBQXVCQSxlQUF2QjtBQUNBLFNBQUtDLG1CQUFMLEdBQTJCQSxtQkFBM0I7O0FBRUEsU0FBS0MsT0FBTCxHQUFlLElBQWY7QUFDQSxTQUFLQyxXQUFMLEdBQW1CLElBQW5CO0FBQ0EsU0FBS0MsU0FBTCxHQUFpQixJQUFqQjtBQUNBLFNBQUtDLFVBQUwsR0FBa0IsSUFBbEI7O0FBRUEsU0FBS0MsY0FBTCxHQUFzQixJQUF0QjtBQUNEOzs7O2dDQUVXSCxXLEVBQTZCO0FBQUEsVUFBaEJELE9BQWdCLHVFQUFOLElBQU07O0FBQ3ZDLFdBQUtBLE9BQUwsR0FBZUEsT0FBZjtBQUNBLFdBQUtDLFdBQUwsR0FBbUJBLFdBQW5CO0FBQ0EsV0FBS0csY0FBTCxH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aUIsUUFBakIsSUFBOEJGLGFBQWFFLFVBQVUsSUFBdkQsQ0FBSixFQUFtRTtBQUNqRSxhQUFPLEtBQVA7QUFDRDtBQUNGO0FBQ0QsU0FBTyxJQUFQO0FBQ0Q7O0FBRUQ7Ozs7SUFHTUMsaUI7QUFDSiwrQkFBYztBQUFBOztBQUNaLFNBQUt4RixrQkFBTCxHQUEwQixJQUExQjtBQUNBLFNBQUtDLGVBQUwsR0FBdUIsSUFBdkI7QUFDQSxTQUFLQyxtQkFBTCxHQUEyQixJQUEzQjtBQUNEOztBQUVEOzs7Ozs7Ozs7QUErQkE7OzsrQkFHV1EsSSxFQUFNLENBQUU7O0FBRW5COzs7Ozs7O3VDQUltQkEsSSxFQUFNO0FBQ3ZCLGFBQU8sR0FBUDtBQUNEOztBQUVEOzs7Ozs7O2lDQUlha0MsSSxFQUFNO0FBQ2pCLGFBQU8sR0FBUDtBQUNEOztBQUVEOzs7Ozs7NEJBR1FBLEksRUFBTSxDQUFFOztBQUVoQjs7Ozs7O3VDQUdtQjJCLE0sRUFBUSxDQUFFOztBQUU3Qjs7Ozs7OztpQ0FJYUcsTyxFQUFTQyxPLEVBQVMsQ0FBRTs7QUFFakM7Ozs7OztrQ0FHYzVELFUsRUFBWTtBQUN4QixhQUFPLElBQVA7QUFDRDs7O3dCQXRFZ0I7QUFDZixhQUFPLENBQVA7QUFDRDs7QUFFRDs7Ozs7O3dCQUdXO0FBQ1QsYUFBTyxDQUFQO0FBQ0Q7O0FBRUQ7Ozs7c0JBR1NtRSxLLEVBQU8sQ0FBRTs7QUFFbEI7Ozs7Ozt3QkFHZTtBQUNiLGFBQU8sQ0FBUDtBQUNEOztBQUVEOzs7O3NCQUdhQSxLLEVBQU8sQ0FBRTs7Ozs7O1FBK0NmcEYsYyxHQUFBQSxjO1FBQWdCMEYsaUIsR0FBQUEsaUIiLCJmaWxlIjoicGRmX2xpbmtfc2VydmljZS5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuLyogQ29weXJpZ2h0IDIwMTUgTW96aWxsYSBGb3VuZGF0aW9uXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGdldEdsb2JhbEV2ZW50QnVzLCBwYXJzZVF1ZXJ5U3RyaW5nIH0gZnJvbSBcIi4vdWlfdXRpbHMuanNcIjtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQREZMaW5rU2VydmljZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7RXZlbnRCdXN9IGV2ZW50QnVzIC0gVGhlIGFwcGxpY2F0aW9uIGV2ZW50IGJ1cy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZXh0ZXJuYWxMaW5rVGFyZ2V0XSAtIFNwZWNpZmllcyB0aGUgYHRhcmdldGAgYXR0cmlidXRlXG4gKiAgIGZvciBleHRlcm5hbCBsaW5rcy4gTXVzdCB1c2Ugb25lIG9mIHRoZSB2YWx1ZXMgZnJvbSB7TGlua1RhcmdldH0uXG4gKiAgIERlZmF1bHRzIHRvIHVzaW5nIG5vIHRhcmdldC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXh0ZXJuYWxMaW5rUmVsXSAtIFNwZWNpZmllcyB0aGUgYHJlbGAgYXR0cmlidXRlIGZvclxuICogICBleHRlcm5hbCBsaW5rcy4gRGVmYXVsdHMgdG8gc3RyaXBwaW5nIHRoZSByZWZlcnJlci5cbiAqL1xuXG4vKipcbiAqIFBlcmZvcm1zIG5hdmlnYXRpb24gZnVuY3Rpb25zIGluc2lkZSBQREYsIHN1Y2ggYXMgb3BlbmluZyBzcGVjaWZpZWQgcGFnZSxcbiAqIG9yIGRlc3RpbmF0aW9uLlxuICogQGltcGxlbWVudHMge0lQREZMaW5rU2VydmljZX1cbiAqL1xuY2xhc3MgUERGTGlua1NlcnZpY2Uge1xuICAvKipcbiAgICogQHBhcmFtIHtQREZMaW5rU2VydmljZU9wdGlvbnN9IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBldmVudEJ1cyxcbiAgICBleHRlcm5hbExpbmtUYXJnZXQgPSBudWxsLFxuICAgIGV4dGVybmFsTGlua1JlbCA9IG51bGwsXG4gICAgZXh0ZXJuYWxMaW5rRW5hYmxlZCA9IHRydWUsXG4gIH0gPSB7fSkge1xuICAgIHRoaXMuZXZlbnRCdXMgPSBldmVudEJ1cyB8fCBnZXRHbG9iYWxFdmVudEJ1cygpO1xuICAgIHRoaXMuZXh0ZXJuYWxMaW5rVGFyZ2V0ID0gZXh0ZXJuYWxMaW5rVGFyZ2V0O1xuICAgIHRoaXMuZXh0ZXJuYWxMaW5rUmVsID0gZXh0ZXJuYWxMaW5rUmVsO1xuICAgIHRoaXMuZXh0ZXJuYWxMaW5rRW5hYmxlZCA9IGV4dGVybmFsTGlua0VuYWJsZWQ7XG5cbiAgICB0aGlzLmJhc2VVcmwgPSBudWxsO1xuICAgIHRoaXMucGRmRG9jdW1lbnQgPSBudWxsO1xuICAgIHRoaXMucGRmVmlld2VyID0gbnVsbDtcbiAgICB0aGlzLnBkZkhpc3RvcnkgPSBudWxsO1xuXG4gICAgdGhpcy5fcGFnZXNSZWZDYWNoZSA9IG51bGw7XG4gIH1cblxuICBzZXREb2N1bWVudChwZGZEb2N1bWVudCwgYmFzZVVybCA9IG51bGwpIHtcbiAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsO1xuICAgIHRoaXMucGRmRG9jdW1lbnQgPSBwZGZEb2N1bWVudDtcbiAgICB0aGlzLl9wYWdlc1JlZkNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuXG4gIHNldFZpZXdlcihwZGZWaWV3ZXIpIHtcbiAgICB0aGlzLnBkZlZpZXdlciA9IHBkZlZpZXdlcjtcbiAgfVxuXG4gIHNldEhpc3RvcnkocGRmSGlzdG9yeSkge1xuICAgIHRoaXMucGRmSGlzdG9yeSA9IHBkZkhpc3Rvcnk7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBwYWdlc0NvdW50KCkge1xuICAgIHJldHVybiB0aGlzLnBkZkRvY3VtZW50ID8gdGhpcy5wZGZEb2N1bWVudC5udW1QYWdlcyA6IDA7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBwYWdlKCkge1xuICAgIHJldHVybiB0aGlzLnBkZlZpZXdlci5jdXJyZW50UGFnZU51bWJlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAgICovXG4gIHNldCBwYWdlKHZhbHVlKSB7XG4gICAgdGhpcy5wZGZWaWV3ZXIuY3VycmVudFBhZ2VOdW1iZXIgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHJvdGF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnBkZlZpZXdlci5wYWdlc1JvdGF0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICAgKi9cbiAgc2V0IHJvdGF0aW9uKHZhbHVlKSB7XG4gICAgdGhpcy5wZGZWaWV3ZXIucGFnZXNSb3RhdGlvbiA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5fSBkZXN0IC0gVGhlIG5hbWVkLCBvciBleHBsaWNpdCwgUERGIGRlc3RpbmF0aW9uLlxuICAgKi9cbiAgbmF2aWdhdGVUbyhkZXN0KSB7XG4gICAgY29uc3QgZ29Ub0Rlc3RpbmF0aW9uID0gKHsgbmFtZWREZXN0LCBleHBsaWNpdERlc3QgfSkgPT4ge1xuICAgICAgLy8gRGVzdCBhcnJheSBsb29rcyBsaWtlIHRoYXQ6IDxwYWdlLXJlZj4gPC9YWVp8L0ZpdFhYWD4gPGFyZ3MuLj5cbiAgICAgIGNvbnN0IGRlc3RSZWYgPSBleHBsaWNpdERlc3RbMF07XG4gICAgICBsZXQgcGFnZU51bWJlcjtcblxuICAgICAgaWYgKGRlc3RSZWYgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgICAgcGFnZU51bWJlciA9IHRoaXMuX2NhY2hlZFBhZ2VOdW1iZXIoZGVzdFJlZik7XG5cbiAgICAgICAgaWYgKHBhZ2VOdW1iZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBGZXRjaCB0aGUgcGFnZSByZWZlcmVuY2UgaWYgaXQncyBub3QgeWV0IGF2YWlsYWJsZS4gVGhpcyBjb3VsZFxuICAgICAgICAgIC8vIG9ubHkgb2NjdXIgZHVyaW5nIGxvYWRpbmcsIGJlZm9yZSBhbGwgcGFnZXMgaGF2ZSBiZWVuIHJlc29sdmVkLlxuICAgICAgICAgIHRoaXMucGRmRG9jdW1lbnRcbiAgICAgICAgICAgIC5nZXRQYWdlSW5kZXgoZGVzdFJlZilcbiAgICAgICAgICAgIC50aGVuKHBhZ2VJbmRleCA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuY2FjaGVQYWdlUmVmKHBhZ2VJbmRleCArIDEsIGRlc3RSZWYpO1xuICAgICAgICAgICAgICBnb1RvRGVzdGluYXRpb24oeyBuYW1lZERlc3QsIGV4cGxpY2l0RGVzdCB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgIGBQREZMaW5rU2VydmljZS5uYXZpZ2F0ZVRvOiBcIiR7ZGVzdFJlZn1cIiBpcyBub3QgYCArXG4gICAgICAgICAgICAgICAgICBgYSB2YWxpZCBwYWdlIHJlZmVyZW5jZSwgZm9yIGRlc3Q9XCIke2Rlc3R9XCIuYFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKE51bWJlci5pc0ludGVnZXIoZGVzdFJlZikpIHtcbiAgICAgICAgcGFnZU51bWJlciA9IGRlc3RSZWYgKyAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgUERGTGlua1NlcnZpY2UubmF2aWdhdGVUbzogXCIke2Rlc3RSZWZ9XCIgaXMgbm90IGAgK1xuICAgICAgICAgICAgYGEgdmFsaWQgZGVzdGluYXRpb24gcmVmZXJlbmNlLCBmb3IgZGVzdD1cIiR7ZGVzdH1cIi5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghcGFnZU51bWJlciB8fCBwYWdlTnVtYmVyIDwgMSB8fCBwYWdlTnVtYmVyID4gdGhpcy5wYWdlc0NvdW50KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYFBERkxpbmtTZXJ2aWNlLm5hdmlnYXRlVG86IFwiJHtwYWdlTnVtYmVyfVwiIGlzIG5vdCBgICtcbiAgICAgICAgICAgIGBhIHZhbGlkIHBhZ2UgbnVtYmVyLCBmb3IgZGVzdD1cIiR7ZGVzdH1cIi5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucGRmSGlzdG9yeSkge1xuICAgICAgICAvLyBVcGRhdGUgdGhlIGJyb3dzZXIgaGlzdG9yeSBiZWZvcmUgc2Nyb2xsaW5nIHRoZSBuZXcgZGVzdGluYXRpb24gaW50b1xuICAgICAgICAvLyB2aWV3LCB0byBiZSBhYmxlIHRvIGFjY3VyYXRlbHkgY2FwdHVyZSB0aGUgY3VycmVudCBkb2N1bWVudCBwb3NpdGlvbi5cbiAgICAgICAgdGhpcy5wZGZIaXN0b3J5LnB1c2hDdXJyZW50UG9zaXRpb24oKTtcbiAgICAgICAgdGhpcy5wZGZIaXN0b3J5LnB1c2goeyBuYW1lZERlc3QsIGV4cGxpY2l0RGVzdCwgcGFnZU51bWJlciB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wZGZWaWV3ZXIuc2Nyb2xsUGFnZUludG9WaWV3KHtcbiAgICAgICAgcGFnZU51bWJlcixcbiAgICAgICAgZGVzdEFycmF5OiBleHBsaWNpdERlc3QsXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBkZXN0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRoaXMucGRmRG9jdW1lbnQuZ2V0RGVzdGluYXRpb24oZGVzdCkudGhlbihkZXN0QXJyYXkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgbmFtZWREZXN0OiBkZXN0LFxuICAgICAgICAgICAgZXhwbGljaXREZXN0OiBkZXN0QXJyYXksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKHtcbiAgICAgICAgbmFtZWREZXN0OiBcIlwiLFxuICAgICAgICBleHBsaWNpdERlc3Q6IGRlc3QsXG4gICAgICB9KTtcbiAgICB9KS50aGVuKGRhdGEgPT4ge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEuZXhwbGljaXREZXN0KSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBQREZMaW5rU2VydmljZS5uYXZpZ2F0ZVRvOiBcIiR7ZGF0YS5leHBsaWNpdERlc3R9XCIgaXNgICtcbiAgICAgICAgICAgIGAgbm90IGEgdmFsaWQgZGVzdGluYXRpb24gYXJyYXksIGZvciBkZXN0PVwiJHtkZXN0fVwiLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZ29Ub0Rlc3RpbmF0aW9uKGRhdGEpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5fSBkZXN0IC0gVGhlIFBERiBkZXN0aW5hdGlvbiBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBoeXBlcmxpbmsgdG8gdGhlIFBERiBvYmplY3QuXG4gICAqL1xuICBnZXREZXN0aW5hdGlvbkhhc2goZGVzdCkge1xuICAgIGlmICh0eXBlb2YgZGVzdCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0QW5jaG9yVXJsKFwiI1wiICsgZXNjYXBlKGRlc3QpKTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGVzdCkpIHtcbiAgICAgIGNvbnN0IHN0ciA9IEpTT04uc3RyaW5naWZ5KGRlc3QpO1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0QW5jaG9yVXJsKFwiI1wiICsgZXNjYXBlKHN0cikpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRBbmNob3JVcmwoXCJcIik7XG4gIH1cblxuICAvKipcbiAgICogUHJlZml4IHRoZSBmdWxsIHVybCBvbiBhbmNob3IgbGlua3MgdG8gbWFrZSBzdXJlIHRoYXQgbGlua3MgYXJlIHJlc29sdmVkXG4gICAqIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IFVSTCBpbnN0ZWFkIG9mIHRoZSBvbmUgZGVmaW5lZCBpbiA8YmFzZSBocmVmPi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFuY2hvciBUaGUgYW5jaG9yIGhhc2gsIGluY2x1ZGluZyB0aGUgIy5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGh5cGVybGluayB0byB0aGUgUERGIG9iamVjdC5cbiAgICovXG4gIGdldEFuY2hvclVybChhbmNob3IpIHtcbiAgICByZXR1cm4gKHRoaXMuYmFzZVVybCB8fCBcIlwiKSArIGFuY2hvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGFzaFxuICAgKi9cbiAgc2V0SGFzaChoYXNoKSB7XG4gICAgbGV0IHBhZ2VOdW1iZXIsIGRlc3Q7XG4gICAgaWYgKGhhc2guaW5jbHVkZXMoXCI9XCIpKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBwYXJzZVF1ZXJ5U3RyaW5nKGhhc2gpO1xuICAgICAgaWYgKFwic2VhcmNoXCIgaW4gcGFyYW1zKSB7XG4gICAgICAgIHRoaXMuZXZlbnRCdXMuZGlzcGF0Y2goXCJmaW5kZnJvbXVybGhhc2hcIiwge1xuICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICBxdWVyeTogcGFyYW1zW1wic2VhcmNoXCJdLnJlcGxhY2UoL1wiL2csIFwiXCIpLFxuICAgICAgICAgIHBocmFzZVNlYXJjaDogcGFyYW1zW1wicGhyYXNlXCJdID09PSBcInRydWVcIixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvLyBib3Jyb3dpbmcgc3ludGF4IGZyb20gXCJQYXJhbWV0ZXJzIGZvciBPcGVuaW5nIFBERiBGaWxlc1wiXG4gICAgICBpZiAoXCJuYW1lZGRlc3RcIiBpbiBwYXJhbXMpIHtcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvKHBhcmFtcy5uYW1lZGRlc3QpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoXCJwYWdlXCIgaW4gcGFyYW1zKSB7XG4gICAgICAgIHBhZ2VOdW1iZXIgPSBwYXJhbXMucGFnZSB8IDAgfHwgMTtcbiAgICAgIH1cbiAgICAgIGlmIChcInpvb21cIiBpbiBwYXJhbXMpIHtcbiAgICAgICAgLy8gQnVpbGQgdGhlIGRlc3RpbmF0aW9uIGFycmF5LlxuICAgICAgICBjb25zdCB6b29tQXJncyA9IHBhcmFtcy56b29tLnNwbGl0KFwiLFwiKTsgLy8gc2NhbGUsbGVmdCx0b3BcbiAgICAgICAgY29uc3Qgem9vbUFyZyA9IHpvb21BcmdzWzBdO1xuICAgICAgICBjb25zdCB6b29tQXJnTnVtYmVyID0gcGFyc2VGbG9hdCh6b29tQXJnKTtcblxuICAgICAgICBpZiAoIXpvb21BcmcuaW5jbHVkZXMoXCJGaXRcIikpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgem9vbUFyZyBpcyBhIG51bWJlciwgaXQgaGFzIHRvIGdldCBkaXZpZGVkIGJ5IDEwMC4gSWYgaXQnc1xuICAgICAgICAgIC8vIGEgc3RyaW5nLCBpdCBzaG91bGQgc3RheSBhcyBpdCBpcy5cbiAgICAgICAgICBkZXN0ID0gW1xuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHsgbmFtZTogXCJYWVpcIiB9LFxuICAgICAgICAgICAgem9vbUFyZ3MubGVuZ3RoID4gMSA/IHpvb21BcmdzWzFdIHwgMCA6IG51bGwsXG4gICAgICAgICAgICB6b29tQXJncy5sZW5ndGggPiAyID8gem9vbUFyZ3NbMl0gfCAwIDogbnVsbCxcbiAgICAgICAgICAgIHpvb21BcmdOdW1iZXIgPyB6b29tQXJnTnVtYmVyIC8gMTAwIDogem9vbUFyZyxcbiAgICAgICAgICBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh6b29tQXJnID09PSBcIkZpdFwiIHx8IHpvb21BcmcgPT09IFwiRml0QlwiKSB7XG4gICAgICAgICAgICBkZXN0ID0gW251bGwsIHsgbmFtZTogem9vbUFyZyB9XTtcbiAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgem9vbUFyZyA9PT0gXCJGaXRIXCIgfHxcbiAgICAgICAgICAgIHpvb21BcmcgPT09IFwiRml0QkhcIiB8fFxuICAgICAgICAgICAgem9vbUFyZyA9PT0gXCJGaXRWXCIgfHxcbiAgICAgICAgICAgIHpvb21BcmcgPT09IFwiRml0QlZcIlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZGVzdCA9IFtcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgeyBuYW1lOiB6b29tQXJnIH0sXG4gICAgICAgICAgICAgIHpvb21BcmdzLmxlbmd0aCA+IDEgPyB6b29tQXJnc1sxXSB8IDAgOiBudWxsLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHpvb21BcmcgPT09IFwiRml0UlwiKSB7XG4gICAgICAgICAgICBpZiAoem9vbUFyZ3MubGVuZ3RoICE9PSA1KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgJ1BERkxpbmtTZXJ2aWNlLnNldEhhc2g6IE5vdCBlbm91Z2ggcGFyYW1ldGVycyBmb3IgXCJGaXRSXCIuJ1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGVzdCA9IFtcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIHsgbmFtZTogem9vbUFyZyB9LFxuICAgICAgICAgICAgICAgIHpvb21BcmdzWzFdIHwgMCxcbiAgICAgICAgICAgICAgICB6b29tQXJnc1syXSB8IDAsXG4gICAgICAgICAgICAgICAgem9vbUFyZ3NbM10gfCAwLFxuICAgICAgICAgICAgICAgIHpvb21BcmdzWzRdIHwgMCxcbiAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgYFBERkxpbmtTZXJ2aWNlLnNldEhhc2g6IFwiJHt6b29tQXJnfVwiIGlzIG5vdCBgICtcbiAgICAgICAgICAgICAgICBcImEgdmFsaWQgem9vbSB2YWx1ZS5cIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkZXN0KSB7XG4gICAgICAgIHRoaXMucGRmVmlld2VyLnNjcm9sbFBhZ2VJbnRvVmlldyh7XG4gICAgICAgICAgcGFnZU51bWJlcjogcGFnZU51bWJlciB8fCB0aGlzLnBhZ2UsXG4gICAgICAgICAgZGVzdEFycmF5OiBkZXN0LFxuICAgICAgICAgIGFsbG93TmVnYXRpdmVPZmZzZXQ6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChwYWdlTnVtYmVyKSB7XG4gICAgICAgIHRoaXMucGFnZSA9IHBhZ2VOdW1iZXI7IC8vIHNpbXBsZSBwYWdlXG4gICAgICB9XG4gICAgICBpZiAoXCJwYWdlbW9kZVwiIGluIHBhcmFtcykge1xuICAgICAgICB0aGlzLmV2ZW50QnVzLmRpc3BhdGNoKFwicGFnZW1vZGVcIiwge1xuICAgICAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgICAgICBtb2RlOiBwYXJhbXMucGFnZW1vZGUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOYW1lZCAob3IgZXhwbGljaXQpIGRlc3RpbmF0aW9uLlxuICAgICAgZGVzdCA9IHVuZXNjYXBlKGhhc2gpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZGVzdCA9IEpTT04ucGFyc2UoZGVzdCk7XG5cbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRlc3QpKSB7XG4gICAgICAgICAgLy8gQXZvaWQgaW5jb3JyZWN0bHkgcmVqZWN0aW5nIGEgdmFsaWQgbmFtZWQgZGVzdGluYXRpb24sIHN1Y2ggYXNcbiAgICAgICAgICAvLyBlLmcuIFwiNC4zXCIgb3IgXCJ0cnVlXCIsIGJlY2F1c2UgYEpTT04ucGFyc2VgIGNvbnZlcnRlZCBpdHMgdHlwZS5cbiAgICAgICAgICBkZXN0ID0gZGVzdC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChleCkge31cblxuICAgICAgaWYgKHR5cGVvZiBkZXN0ID09PSBcInN0cmluZ1wiIHx8IGlzVmFsaWRFeHBsaWNpdERlc3RpbmF0aW9uKGRlc3QpKSB7XG4gICAgICAgIHRoaXMubmF2aWdhdGVUbyhkZXN0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYFBERkxpbmtTZXJ2aWNlLnNldEhhc2g6IFwiJHt1bmVzY2FwZShoYXNoKX1cIiBpcyBub3QgYCArXG4gICAgICAgICAgXCJhIHZhbGlkIGRlc3RpbmF0aW9uLlwiXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uXG4gICAqL1xuICBleGVjdXRlTmFtZWRBY3Rpb24oYWN0aW9uKSB7XG4gICAgLy8gU2VlIFBERiByZWZlcmVuY2UsIHRhYmxlIDguNDUgLSBOYW1lZCBhY3Rpb25cbiAgICBzd2l0Y2ggKGFjdGlvbikge1xuICAgICAgY2FzZSBcIkdvQmFja1wiOlxuICAgICAgICBpZiAodGhpcy5wZGZIaXN0b3J5KSB7XG4gICAgICAgICAgdGhpcy5wZGZIaXN0b3J5LmJhY2soKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIkdvRm9yd2FyZFwiOlxuICAgICAgICBpZiAodGhpcy5wZGZIaXN0b3J5KSB7XG4gICAgICAgICAgdGhpcy5wZGZIaXN0b3J5LmZvcndhcmQoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIk5leHRQYWdlXCI6XG4gICAgICAgIGlmICh0aGlzLnBhZ2UgPCB0aGlzLnBhZ2VzQ291bnQpIHtcbiAgICAgICAgICB0aGlzLnBhZ2UrKztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIlByZXZQYWdlXCI6XG4gICAgICAgIGlmICh0aGlzLnBhZ2UgPiAxKSB7XG4gICAgICAgICAgdGhpcy5wYWdlLS07XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJMYXN0UGFnZVwiOlxuICAgICAgICB0aGlzLnBhZ2UgPSB0aGlzLnBhZ2VzQ291bnQ7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFwiRmlyc3RQYWdlXCI6XG4gICAgICAgIHRoaXMucGFnZSA9IDE7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhazsgLy8gTm8gYWN0aW9uIGFjY29yZGluZyB0byBzcGVjXG4gICAgfVxuXG4gICAgdGhpcy5ldmVudEJ1cy5kaXNwYXRjaChcIm5hbWVkYWN0aW9uXCIsIHtcbiAgICAgIHNvdXJjZTogdGhpcyxcbiAgICAgIGFjdGlvbixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZU51bSAtIHBhZ2UgbnVtYmVyLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFnZVJlZiAtIHJlZmVyZW5jZSB0byB0aGUgcGFnZS5cbiAgICovXG4gIGNhY2hlUGFnZVJlZihwYWdlTnVtLCBwYWdlUmVmKSB7XG4gICAgaWYgKCFwYWdlUmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlZlN0ciA9XG4gICAgICBwYWdlUmVmLmdlbiA9PT0gMCA/IGAke3BhZ2VSZWYubnVtfVJgIDogYCR7cGFnZVJlZi5udW19UiR7cGFnZVJlZi5nZW59YDtcbiAgICB0aGlzLl9wYWdlc1JlZkNhY2hlW3JlZlN0cl0gPSBwYWdlTnVtO1xuICB9XG5cbiAgX2NhY2hlZFBhZ2VOdW1iZXIocGFnZVJlZikge1xuICAgIGNvbnN0IHJlZlN0ciA9XG4gICAgICBwYWdlUmVmLmdlbiA9PT0gMCA/IGAke3BhZ2VSZWYubnVtfVJgIDogYCR7cGFnZVJlZi5udW19UiR7cGFnZVJlZi5nZW59YDtcbiAgICByZXR1cm4gKHRoaXMuX3BhZ2VzUmVmQ2FjaGUgJiYgdGhpcy5fcGFnZXNSZWZDYWNoZVtyZWZTdHJdKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlTnVtYmVyXG4gICAqL1xuICBpc1BhZ2VWaXNpYmxlKHBhZ2VOdW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5wZGZWaWV3ZXIuaXNQYWdlVmlzaWJsZShwYWdlTnVtYmVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1ZhbGlkRXhwbGljaXREZXN0aW5hdGlvbihkZXN0KSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShkZXN0KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBkZXN0TGVuZ3RoID0gZGVzdC5sZW5ndGg7XG4gIGlmIChkZXN0TGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBwYWdlID0gZGVzdFswXTtcbiAgaWYgKFxuICAgICEoXG4gICAgICB0eXBlb2YgcGFnZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgTnVtYmVyLmlzSW50ZWdlcihwYWdlLm51bSkgJiZcbiAgICAgIE51bWJlci5pc0ludGVnZXIocGFnZS5nZW4pXG4gICAgKSAmJlxuICAgICEoTnVtYmVyLmlzSW50ZWdlcihwYWdlKSAmJiBwYWdlID49IDApXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCB6b29tID0gZGVzdFsxXTtcbiAgaWYgKCEodHlwZW9mIHpvb20gPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHpvb20ubmFtZSA9PT0gXCJzdHJpbmdcIikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgbGV0IGFsbG93TnVsbCA9IHRydWU7XG4gIHN3aXRjaCAoem9vbS5uYW1lKSB7XG4gICAgY2FzZSBcIlhZWlwiOlxuICAgICAgaWYgKGRlc3RMZW5ndGggIT09IDUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIkZpdFwiOlxuICAgIGNhc2UgXCJGaXRCXCI6XG4gICAgICByZXR1cm4gZGVzdExlbmd0aCA9PT0gMjtcbiAgICBjYXNlIFwiRml0SFwiOlxuICAgIGNhc2UgXCJGaXRCSFwiOlxuICAgIGNhc2UgXCJGaXRWXCI6XG4gICAgY2FzZSBcIkZpdEJWXCI6XG4gICAgICBpZiAoZGVzdExlbmd0aCAhPT0gMykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiRml0UlwiOlxuICAgICAgaWYgKGRlc3RMZW5ndGggIT09IDYpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgYWxsb3dOdWxsID0gZmFsc2U7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAobGV0IGkgPSAyOyBpIDwgZGVzdExlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgcGFyYW0gPSBkZXN0W2ldO1xuICAgIGlmICghKHR5cGVvZiBwYXJhbSA9PT0gXCJudW1iZXJcIiB8fCAoYWxsb3dOdWxsICYmIHBhcmFtID09PSBudWxsKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQGltcGxlbWVudHMge0lQREZMaW5rU2VydmljZX1cbiAqL1xuY2xhc3MgU2ltcGxlTGlua1NlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmV4dGVybmFsTGlua1RhcmdldCA9IG51bGw7XG4gICAgdGhpcy5leHRlcm5hbExpbmtSZWwgPSBudWxsO1xuICAgIHRoaXMuZXh0ZXJuYWxMaW5rRW5hYmxlZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCBwYWdlc0NvdW50KCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgcGFnZSgpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAgICovXG4gIHNldCBwYWdlKHZhbHVlKSB7fVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0IHJvdGF0aW9uKCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICAgKi9cbiAgc2V0IHJvdGF0aW9uKHZhbHVlKSB7fVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gZGVzdCAtIFRoZSBQREYgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgKi9cbiAgbmF2aWdhdGVUbyhkZXN0KSB7fVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gZGVzdCAtIFRoZSBQREYgZGVzdGluYXRpb24gb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgaHlwZXJsaW5rIHRvIHRoZSBQREYgb2JqZWN0LlxuICAgKi9cbiAgZ2V0RGVzdGluYXRpb25IYXNoKGRlc3QpIHtcbiAgICByZXR1cm4gXCIjXCI7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGhhc2ggLSBUaGUgUERGIHBhcmFtZXRlcnMvaGFzaC5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGh5cGVybGluayB0byB0aGUgUERGIG9iamVjdC5cbiAgICovXG4gIGdldEFuY2hvclVybChoYXNoKSB7XG4gICAgcmV0dXJuIFwiI1wiO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoYXNoXG4gICAqL1xuICBzZXRIYXNoKGhhc2gpIHt9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb25cbiAgICovXG4gIGV4ZWN1dGVOYW1lZEFjdGlvbihhY3Rpb24pIHt9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlTnVtIC0gcGFnZSBudW1iZXIuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYWdlUmVmIC0gcmVmZXJlbmNlIHRvIHRoZSBwYWdlLlxuICAgKi9cbiAgY2FjaGVQYWdlUmVmKHBhZ2VOdW0sIHBhZ2VSZWYpIHt9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlTnVtYmVyXG4gICAqL1xuICBpc1BhZ2VWaXNpYmxlKHBhZ2VOdW1iZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG5leHBvcnQgeyBQREZMaW5rU2VydmljZSwgU2ltcGxlTGlua1NlcnZpY2UgfTsiXX0=",
    "\"use strict\";\n\n(function (root, factory) {\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine(['jquery'], function ($) {\n\t\t\treturn factory($);\n\t\t});\n\t} else if (typeof exports !== 'undefined') {\n\t\tvar $ = require('jquery');\n\t\tmodule.exports = factory($);\n\t} else {\n\t\tfactory(root.$);\n\t}\n})(undefined, function (jQuery) {\n\n\t/**\n  * Module dependencies\n  */\n\n\tvar requestAnimFrame = function () {\n\t\treturn window.requestAnimationFrame || window.webkitRequestAnimationFrame || function (callback) {\n\t\t\twindow.setTimeout(callback, 1000 / 60);\n\t\t};\n\t}().bind(window);\n\n\tfunction decouple(node, event, fn) {\n\t\tvar eve,\n\t\t    tracking = false;\n\n\t\tfunction captureEvent(e) {\n\t\t\teve = e;\n\t\t\ttrack();\n\t\t}\n\n\t\tfunction track() {\n\t\t\tif (!tracking) {\n\t\t\t\trequestAnimFrame(update);\n\t\t\t\ttracking = true;\n\t\t\t}\n\t\t}\n\n\t\tfunction update() {\n\t\t\tfn.call(node, eve);\n\t\t\ttracking = false;\n\t\t}\n\n\t\tnode.addEventListener(event, captureEvent, false);\n\n\t\treturn captureEvent;\n\t}\n\n\tvar _classCallCheck = function _classCallCheck(instance, Constructor) {\n\t\tif (!(instance instanceof Constructor)) {\n\t\t\tthrow new TypeError(\"Cannot call a class as a function\");\n\t\t}\n\t};\n\n\tvar Emitter = function () {\n\t\tfunction Emitter() {\n\t\t\t_classCallCheck(this, Emitter);\n\t\t}\n\n\t\t/**\n   * Adds a listener to the collection for the specified event.\n   * @memberof! Emitter.prototype\n   * @function\n   * @param {String} event - The event name.\n   * @param {Function} listener - A listener function to add.\n   * @returns {Object} Returns an instance of Emitter.\n   * @example\n   * // Add an event listener to \"foo\" event.\n   * emitter.on('foo', listener);\n   */\n\n\t\tEmitter.prototype.on = function on(event, listener) {\n\t\t\t// Use the current collection or create it.\n\t\t\tthis._eventCollection = this._eventCollection || {};\n\n\t\t\t// Use the current collection of an event or create it.\n\t\t\tthis._eventCollection[event] = this._eventCollection[event] || [];\n\n\t\t\t// Appends the listener into the collection of the given event\n\t\t\tthis._eventCollection[event].push(listener);\n\n\t\t\treturn this;\n\t\t};\n\n\t\t/**\n   * Adds a listener to the collection for the specified event that will be called only once.\n   * @memberof! Emitter.prototype\n   * @function\n   * @param {String} event - The event name.\n   * @param {Function} listener - A listener function to add.\n   * @returns {Object} Returns an instance of Emitter.\n   * @example\n   * // Will add an event handler to \"foo\" event once.\n   * emitter.once('foo', listener);\n   */\n\n\t\tEmitter.prototype.once = function once(event, listener) {\n\t\t\tvar self = this;\n\n\t\t\tfunction fn() {\n\t\t\t\tself.off(event, fn);\n\t\t\t\tlistener.apply(this, arguments);\n\t\t\t}\n\n\t\t\tfn.listener = listener;\n\n\t\t\tthis.on(event, fn);\n\n\t\t\treturn this;\n\t\t};\n\n\t\t/**\n   * Removes a listener from the collection for the specified event.\n   * @memberof! Emitter.prototype\n   * @function\n   * @param {String} event - The event name.\n   * @param {Function} listener - A listener function to remove.\n   * @returns {Object} Returns an instance of Emitter.\n   * @example\n   * // Remove a given listener.\n   * emitter.off('foo', listener);\n   */\n\n\t\tEmitter.prototype.off = function off(event, listener) {\n\n\t\t\tvar listeners = undefined;\n\n\t\t\t// Defines listeners value.\n\t\t\tif (!this._eventCollection || !(listeners = this._eventCollection[event])) {\n\t\t\t\treturn this;\n\t\t\t}\n\n\t\t\tlisteners.forEach(function (fn, i) {\n\t\t\t\tif (fn === listener || fn.listener === listener) {\n\t\t\t\t\t// Removes the given listener.\n\t\t\t\t\tlisteners.splice(i, 1);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Removes an empty event collection.\n\t\t\tif (listeners.length === 0) {\n\t\t\t\tdelete this._eventCollection[event];\n\t\t\t}\n\n\t\t\treturn this;\n\t\t};\n\n\t\t/**\n   * Execute each item in the listener collection in order with the specified data.\n   * @memberof! Emitter.prototype\n   * @function\n   * @param {String} event - The name of the event you want to emit.\n   * @param {...Object} data - Data to pass to the listeners.\n   * @returns {Object} Returns an instance of Emitter.\n   * @example\n   * // Emits the \"foo\" event with 'param1' and 'param2' as arguments.\n   * emitter.emit('foo', 'param1', 'param2');\n   */\n\n\t\tEmitter.prototype.emit = function emit(event) {\n\t\t\tvar _this = this;\n\n\t\t\tfor (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n\t\t\t\targs[_key - 1] = arguments[_key];\n\t\t\t}\n\n\t\t\tvar listeners = undefined;\n\n\t\t\t// Defines listeners value.\n\t\t\tif (!this._eventCollection || !(listeners = this._eventCollection[event])) {\n\t\t\t\treturn this;\n\t\t\t}\n\n\t\t\t// Clone listeners\n\t\t\tlisteners = listeners.slice(0);\n\n\t\t\tlisteners.forEach(function (fn) {\n\t\t\t\treturn fn.apply(_this, args);\n\t\t\t});\n\n\t\t\treturn this;\n\t\t};\n\n\t\treturn Emitter;\n\t}();\n\n\t/**\n  * Privates\n  */\n\tvar scrollTimeout;\n\tvar scrolling = false;\n\tvar doc = window.document;\n\tvar html = doc.documentElement;\n\tvar msPointerSupported = window.navigator.msPointerEnabled;\n\tvar touch = {\n\t\t'start': msPointerSupported ? 'MSPointerDown' : 'touchstart',\n\t\t'move': msPointerSupported ? 'MSPointerMove' : 'touchmove',\n\t\t'end': msPointerSupported ? 'MSPointerUp' : 'touchend'\n\t};\n\tvar prefix = function prefix() {\n\t\tvar regex = /^(Webkit|Khtml|Moz|ms|O)(?=[A-Z])/;\n\t\tvar styleDeclaration = doc.getElementsByTagName('script')[0].style;\n\t\tfor (var prop in styleDeclaration) {\n\t\t\tif (regex.test(prop)) {\n\t\t\t\treturn '-' + prop.match(regex)[0].toLowerCase() + '-';\n\t\t\t}\n\t\t}\n\t\t// Nothing found so far? Webkit does not enumerate over the CSS properties of the style object.\n\t\t// However (prop in style) returns the correct value, so we'll have to test for\n\t\t// the precence of a specific property\n\t\tif ('WebkitOpacity' in styleDeclaration) {\n\t\t\treturn '-webkit-';\n\t\t}\n\t\tif ('KhtmlOpacity' in styleDeclaration) {\n\t\t\treturn '-khtml-';\n\t\t}\n\t\treturn '';\n\t}();\n\n\tfunction extend(destination, from) {\n\t\tfor (var prop in from) {\n\t\t\tif (from[prop]) {\n\t\t\t\tdestination[prop] = from[prop];\n\t\t\t}\n\t\t}\n\t\treturn destination;\n\t}\n\n\tfunction inherits(child, uber) {\n\t\tchild.prototype = extend(child.prototype || {}, uber.prototype);\n\t}\n\n\tfunction hasIgnoredElements(el) {\n\t\twhile (el.parentNode) {\n\t\t\tif (el.getAttribute('data-slideout-ignore') !== null) {\n\t\t\t\treturn el;\n\t\t\t}\n\t\t\tel = el.parentNode;\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n  * Slideout constructor\n  */\n\tfunction Slideout(options) {\n\t\toptions = options || {};\n\n\t\t// Sets default values\n\t\tthis._startOffsetX = 0;\n\t\tthis._currentOffsetX = 0;\n\t\tthis._opening = false;\n\t\tthis._moved = false;\n\t\tthis._opened = false;\n\t\tthis._preventOpen = false;\n\n\t\t// Sets panel\n\t\tthis.panel = options.panel;\n\t\tthis.menu = options.menu;\n\n\t\t// Sets options\n\t\tthis._touch = options.touch === undefined ? true : options.touch && true;\n\t\tthis._side = options.side || 'left';\n\t\tthis._easing = options.fx || options.easing || 'ease';\n\t\tthis._duration = parseInt(options.duration, 10) || 300;\n\t\tthis._tolerance = parseInt(options.tolerance, 10) || 70;\n\t\tthis._padding = this._translateTo = parseInt(options.padding, 10) || 256;\n\t\tthis._orientation = this._side === 'right' ? -1 : 1;\n\t\tthis._translateTo *= this._orientation;\n\n\t\t// Sets  classnames\n\t\tif (!this.panel.classList.contains('slideout-panel')) {\n\t\t\tthis.panel.classList.add('slideout-panel');\n\t\t}\n\t\tif (!this.panel.classList.contains('slideout-panel-' + this._side)) {\n\t\t\tthis.panel.classList.add('slideout-panel-' + this._side);\n\t\t}\n\t\tif (!this.menu.classList.contains('slideout-menu')) {\n\t\t\tthis.menu.classList.add('slideout-menu');\n\t\t}\n\t\tif (!this.menu.classList.contains('slideout-menu-' + this._side)) {\n\t\t\tthis.menu.classList.add('slideout-menu-' + this._side);\n\t\t}\n\n\t\t// Init touch events\n\t\tif (this._touch) {\n\t\t\tthis._initTouchEvents();\n\t\t}\n\t}\n\n\t/**\n  * Inherits from Emitter\n  */\n\tinherits(Slideout, Emitter);\n\n\t/**\n  * Opens the slideout menu.\n  */\n\tSlideout.prototype.open = function () {\n\t\tvar self = this;\n\t\tthis.emit('beforeopen');\n\t\tif (!html.classList.contains('slideout-open')) {\n\t\t\thtml.classList.add('slideout-open');\n\t\t}\n\t\tthis._setTransition();\n\t\tthis._translateXTo(this._translateTo);\n\t\tthis._opened = true;\n\t\tsetTimeout(function () {\n\t\t\tself.panel.style.transition = self.panel.style['-webkit-transition'] = '';\n\t\t\tself.emit('open');\n\t\t}, this._duration + 50);\n\t\treturn this;\n\t};\n\n\t/**\n  * Closes slideout menu.\n  */\n\tSlideout.prototype.close = function () {\n\t\tvar self = this;\n\t\tif (!this.isOpen() && !this._opening) {\n\t\t\treturn this;\n\t\t}\n\t\tthis.emit('beforeclose');\n\t\tthis._setTransition();\n\t\tthis._translateXTo(0);\n\t\tthis._opened = false;\n\t\tsetTimeout(function () {\n\t\t\thtml.classList.remove('slideout-open');\n\t\t\tself.panel.style.transition = self.panel.style['-webkit-transition'] = self.panel.style[prefix + 'transform'] = self.panel.style.transform = '';\n\t\t\tself.emit('close');\n\t\t}, this._duration + 50);\n\t\treturn this;\n\t};\n\n\t/**\n  * Toggles (open/close) slideout menu.\n  */\n\tSlideout.prototype.toggle = function () {\n\t\treturn this.isOpen() ? this.close() : this.open();\n\t};\n\n\t/**\n  * Returns true if the slideout is currently open, and false if it is closed.\n  */\n\tSlideout.prototype.isOpen = function () {\n\t\treturn this._opened;\n\t};\n\n\t/**\n  * Translates panel and updates currentOffset with a given X point\n  */\n\tSlideout.prototype._translateXTo = function (translateX) {\n\t\tthis._currentOffsetX = translateX;\n\t\tthis.panel.style[prefix + 'transform'] = this.panel.style.transform = 'translateX(' + translateX + 'px)';\n\t\treturn this;\n\t};\n\n\t/**\n  * Set transition properties\n  */\n\tSlideout.prototype._setTransition = function () {\n\t\tthis.panel.style[prefix + 'transition'] = this.panel.style.transition = prefix + 'transform ' + this._duration + 'ms ' + this._easing;\n\t\treturn this;\n\t};\n\n\t/**\n  * Initializes touch event\n  */\n\tSlideout.prototype._initTouchEvents = function () {\n\t\tvar self = this;\n\n\t\t/**\n   * Decouple scroll event\n   */\n\t\tthis._onScrollFn = decouple(doc, 'scroll', function () {\n\t\t\tif (!self._moved) {\n\t\t\t\tclearTimeout(scrollTimeout);\n\t\t\t\tscrolling = true;\n\t\t\t\tscrollTimeout = setTimeout(function () {\n\t\t\t\t\tscrolling = false;\n\t\t\t\t}, 250);\n\t\t\t}\n\t\t});\n\n\t\t/**\n   * Prevents touchmove event if slideout is moving\n   */\n\t\tthis._preventMove = function (eve) {\n\t\t\tif (self._moved) {\n\t\t\t\teve.preventDefault();\n\t\t\t}\n\t\t};\n\n\t\tdoc.addEventListener(touch.move, this._preventMove);\n\n\t\t/**\n   * Resets values on touchstart\n   */\n\t\tthis._resetTouchFn = function (eve) {\n\t\t\tif (typeof eve.touches === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tself._moved = false;\n\t\t\tself._opening = false;\n\t\t\tself._startOffsetX = eve.touches[0].pageX;\n\t\t\tself._preventOpen = !self._touch || !self.isOpen() && self.menu.clientWidth !== 0;\n\t\t};\n\n\t\tthis.panel.addEventListener(touch.start, this._resetTouchFn);\n\n\t\t/**\n   * Resets values on touchcancel\n   */\n\t\tthis._onTouchCancelFn = function () {\n\t\t\tself._moved = false;\n\t\t\tself._opening = false;\n\t\t};\n\n\t\tthis.panel.addEventListener('touchcancel', this._onTouchCancelFn);\n\n\t\t/**\n   * Toggles slideout on touchend\n   */\n\t\tthis._onTouchEndFn = function () {\n\t\t\tif (self._moved) {\n\t\t\t\tself.emit('translateend');\n\t\t\t\tself._opening && Math.abs(self._currentOffsetX) > self._tolerance ? self.open() : self.close();\n\t\t\t}\n\t\t\tself._moved = false;\n\t\t};\n\n\t\tthis.panel.addEventListener(touch.end, this._onTouchEndFn);\n\n\t\t/**\n   * Translates panel on touchmove\n   */\n\t\tthis._onTouchMoveFn = function (eve) {\n\t\t\tif (scrolling || self._preventOpen || typeof eve.touches === 'undefined' || hasIgnoredElements(eve.target)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar dif_x = eve.touches[0].clientX - self._startOffsetX;\n\t\t\tvar translateX = self._currentOffsetX = dif_x;\n\n\t\t\tif (Math.abs(translateX) > self._padding) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (Math.abs(dif_x) > 20) {\n\n\t\t\t\tself._opening = true;\n\n\t\t\t\tvar oriented_dif_x = dif_x * self._orientation;\n\n\t\t\t\tif (self._opened && oriented_dif_x > 0 || !self._opened && oriented_dif_x < 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!self._moved) {\n\t\t\t\t\tself.emit('translatestart');\n\t\t\t\t}\n\n\t\t\t\tif (oriented_dif_x <= 0) {\n\t\t\t\t\ttranslateX = dif_x + self._padding * self._orientation;\n\t\t\t\t\tself._opening = false;\n\t\t\t\t}\n\n\t\t\t\tif (!(self._moved && html.classList.contains('slideout-open'))) {\n\t\t\t\t\thtml.classList.add('slideout-open');\n\t\t\t\t}\n\n\t\t\t\tself.panel.style[prefix + 'transform'] = self.panel.style.transform = 'translateX(' + translateX + 'px)';\n\t\t\t\tself.emit('translate', translateX);\n\t\t\t\tself._moved = true;\n\t\t\t}\n\t\t};\n\n\t\tthis.panel.addEventListener(touch.move, this._onTouchMoveFn);\n\n\t\treturn this;\n\t};\n\n\t/**\n  * Enable opening the slideout via touch events.\n  */\n\tSlideout.prototype.enableTouch = function () {\n\t\tthis._touch = true;\n\t\treturn this;\n\t};\n\n\t/**\n  * Disable opening the slideout via touch events.\n  */\n\tSlideout.prototype.disableTouch = function () {\n\t\tthis._touch = false;\n\t\treturn this;\n\t};\n\n\t/**\n  * Destroy an instance of slideout.\n  */\n\tSlideout.prototype.destroy = function () {\n\t\t// Close before clean\n\t\tthis.close();\n\n\t\t// Remove event listeners\n\t\tdoc.removeEventListener(touch.move, this._preventMove);\n\t\tthis.panel.removeEventListener(touch.start, this._resetTouchFn);\n\t\tthis.panel.removeEventListener('touchcancel', this._onTouchCancelFn);\n\t\tthis.panel.removeEventListener(touch.end, this._onTouchEndFn);\n\t\tthis.panel.removeEventListener(touch.move, this._onTouchMoveFn);\n\t\tdoc.removeEventListener('scroll', this._onScrollFn);\n\n\t\t// Remove methods\n\t\tthis.open = this.close = function () {};\n\n\t\t// Return the instance so it can be easily dereferenced\n\t\treturn this;\n\t};\n\n\t/**\n  * Expose Slideout\n  */\n\treturn Slideout;\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNsaWRlb3V0LmpzIl0sIm5hbWVzIjpbInJvb3QiLCJmYWN0b3J5IiwiZGVmaW5lIiwiYW1kIiwiJCIsImV4cG9ydHMiLCJyZXF1aXJlIiwibW9kdWxlIiwialF1ZXJ5IiwicmVxdWVzdEFuaW1GcmFtZSIsIndpbmRvdyIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsIndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSIsImNhbGxiYWNrIiwic2V0VGltZW91dCIsImJpbmQiLCJkZWNvdXBsZSIsIm5vZGUiLCJldmVudCIsImZuIiwiZXZlIiwidHJhY2tpbmciLCJjYXB0dXJlRXZlbnQiLCJlIiwidHJhY2siLCJ1cGRhdGUiLCJjYWxsIiwiYWRkRXZlbnRMaXN0ZW5lciIsIl9jbGFzc0NhbGxDaGVjayIsImluc3RhbmNlIiwiQ29uc3RydWN0b3IiLCJUeXBlRXJyb3IiLCJFbWl0dGVyIiwicHJvdG90eXBlIiwib24iLCJsaXN0ZW5lciIsIl9ldmVudENvbGxlY3Rpb24iLCJwdXNoIiwib25jZSIsInNlbGYiLCJvZmYiLCJhcHBseSIsImFyZ3VtZW50cyIsImxpc3RlbmVycyIsInVuZGVmaW5lZCIsImZvckVhY2giLCJpIiwic3BsaWNlIiwibGVuZ3RoIiwiZW1pdCIsIl90aGlzIiwiX2xlbiIsImFyZ3MiLCJBcnJheSIsIl9rZXkiLCJzbGljZSIsInNjcm9sbFRpbWVvdXQiLCJzY3JvbGxpbmciLCJkb2MiLCJkb2N1bWVudCIsImh0bWwiLCJkb2N1bWVudEVsZW1lbnQiLCJtc1BvaW50ZXJTdXBwb3J0ZWQiLCJuYXZpZ2F0b3IiLCJtc1BvaW50ZXJFbmFibGVkIiwidG91Y2giLCJwcmVmaXgiLCJyZWdleCIsInN0eWxlRGVjbGFyYXRpb24iLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsInN0eWxlIiwicHJvcCIsInRlc3QiLCJtYXRjaCIsInRvTG93ZXJDYXNlIiwiZXh0ZW5kIiwiZGVzdGluYXRpb24iLCJmcm9tIiwiaW5oZXJpdHMiLCJjaGlsZCIsInViZXIiLCJoYXNJZ25vcmVkRWxlbWVudHMiLCJlbCIsInBhcmVudE5vZGUiLCJnZXRBdHRyaWJ1dGUiLCJTbGlkZW91dCIsIm9wdGlvbnMiLCJfc3RhcnRPZmZzZXRYIiwiX2N1cnJlbnRPZmZzZXRYIiwiX29wZW5pbmciLCJfbW92ZWQiLCJfb3BlbmVkIiwiX3ByZXZlbnRPcGVuIiwicGFuZWwiLCJtZW51IiwiX3RvdWNoIiwiX3NpZGUiLCJzaWRlIiwiX2Vhc2luZyIsImZ4IiwiZWFzaW5nIiwiX2R1cmF0aW9uIiwicGFyc2VJbnQiLCJkdXJhdGlvbiIsIl90b2xlcmFuY2UiLCJ0b2xlcmFuY2UiLCJfcGFkZGluZyIsIl90cmFuc2xhdGVUbyIsInBhZGRpbmciLCJfb3JpZW50YXRpb24iLCJjbGFzc0xpc3QiLCJjb250YWlucyIsImFkZCIsIl9pbml0VG91Y2hFdmVudHMiLCJvcGVuIiwiX3NldFRyYW5zaXRpb24iLCJfdHJhbnNsYXRlWFRvIiwidHJhbnNpdGlvbiIsImNsb3NlIiwiaXNPcGVuIiwicmVtb3ZlIiwidHJhbnNmb3JtIiwidG9nZ2xlIiwidHJhbnNsYXRlWCIsIl9vblNjcm9sbEZuIiwiY2xlYXJUaW1lb3V0IiwiX3ByZXZlbnRNb3ZlIiwicHJldmVudERlZmF1bHQiLCJtb3ZlIiwiX3Jlc2V0VG91Y2hGbiIsInRvdWNoZXMiLCJwYWdlWCIsImNsaWVudFdpZHRoIiwic3RhcnQiLCJfb25Ub3VjaENhbmNlbEZuIiwiX29uVG91Y2hFbmRGbiIsIk1hdGgiLCJhYnMiLCJlbmQiLCJfb25Ub3VjaE1vdmVGbiIsInRhcmdldCIsImRpZl94IiwiY2xpZW50WCIsIm9yaWVudGVkX2RpZl94IiwiZW5hYmxlVG91Y2giLCJkaXNhYmxlVG91Y2giLCJkZXN0cm95IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBQ0MsV0FBU0EsSUFBVCxFQUFlQyxPQUFmLEVBQXdCO0FBQ3hCLEtBQUksT0FBT0MsTUFBUCxLQUFrQixVQUFsQixJQUFnQ0EsT0FBT0MsR0FBM0MsRUFBZ0Q7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QSxPQUFLMUMsS0FBTCxDQUFXc0QsbUJBQVgsQ0FBK0JsRixNQUFNK0QsSUFBckMsRUFBMkMsS0FBS1csY0FBaEQ7QUFDQWpGLE1BQUl5RixtQkFBSixDQUF3QixRQUF4QixFQUFrQyxLQUFLdkIsV0FBdkM7O0FBRUE7QUFDQSxPQUFLVixJQUFMLEdBQVksS0FBS0ksS0FBTCxHQUFhLFlBQVcsQ0FBRSxDQUF0Qzs7QUFFQTtBQUNBLFNBQU8sSUFBUDtBQUNBLEVBakJEOztBQW1CQTs7O0FBR0EsUUFBT2pDLFFBQVA7QUFFQSxDQXpoQkEsQ0FBRCIsImZpbGUiOiJzbGlkZW91dC5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuKGZ1bmN0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuXHRcdGRlZmluZShbJ2pxdWVyeSddLCBmdW5jdGlvbigkKSB7XG5cdFx0XHRyZXR1cm4gZmFjdG9yeSgkKTtcblx0XHR9KTtcblx0fSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0XHR2YXIgJCA9IHJlcXVpcmUoJ2pxdWVyeScpO1xuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgkKTtcblx0fSBlbHNlIHtcblx0XHRmYWN0b3J5KHJvb3QuJCk7XG5cdH1cbn0odGhpcywgZnVuY3Rpb24oalF1ZXJ5KSB7XG5cblxuXHQvKipcblx0ICogTW9kdWxlIGRlcGVuZGVuY2llc1xuXHQgKi9cblxuXHR2YXIgcmVxdWVzdEFuaW1GcmFtZSA9IChmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuXHRcdFx0d2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuXHRcdFx0ZnVuY3Rpb24oY2FsbGJhY2spIHtcblx0XHRcdFx0d2luZG93LnNldFRpbWVvdXQoY2FsbGJhY2ssIDEwMDAgLyA2MCk7XG5cdFx0XHR9O1xuXHR9KCkuYmluZCh3aW5kb3cpKTtcblxuXHRmdW5jdGlvbiBkZWNvdXBsZShub2RlLCBldmVudCwgZm4pIHtcblx0XHR2YXIgZXZlLFxuXHRcdFx0dHJhY2tpbmcgPSBmYWxzZTtcblxuXHRcdGZ1bmN0aW9uIGNhcHR1cmVFdmVudChlKSB7XG5cdFx0XHRldmUgPSBlO1xuXHRcdFx0dHJhY2soKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiB0cmFjaygpIHtcblx0XHRcdGlmICghdHJhY2tpbmcpIHtcblx0XHRcdFx0cmVxdWVzdEFuaW1GcmFtZSh1cGRhdGUpO1xuXHRcdFx0XHR0cmFja2luZyA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gdXBkYXRlKCkge1xuXHRcdFx0Zm4uY2FsbChub2RlLCBldmUpO1xuXHRcdFx0dHJhY2tpbmcgPSBmYWxzZTtcblx0XHR9XG5cblx0XHRub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGNhcHR1cmVFdmVudCwgZmFsc2UpO1xuXG5cdFx0cmV0dXJuIGNhcHR1cmVFdmVudDtcblx0fVxuXG5cdHZhciBfY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbihpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcblx0XHRpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcblx0XHR9XG5cdH07XG5cblx0dmFyIEVtaXR0ZXIgPSAoZnVuY3Rpb24oKSB7XG5cdFx0ZnVuY3Rpb24gRW1pdHRlcigpIHtcblx0XHRcdF9jbGFzc0NhbGxDaGVjayh0aGlzLCBFbWl0dGVyKTtcblx0XHR9XG5cblx0XHQvKipcblx0XHQgKiBBZGRzIGEgbGlzdGVuZXIgdG8gdGhlIGNvbGxlY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG5cdFx0ICogQG1lbWJlcm9mISBFbWl0dGVyLnByb3RvdHlwZVxuXHRcdCAqIEBmdW5jdGlvblxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBldmVudCAtIFRoZSBldmVudCBuYW1lLlxuXHRcdCAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIC0gQSBsaXN0ZW5lciBmdW5jdGlvbiB0byBhZGQuXG5cdFx0ICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBhbiBpbnN0YW5jZSBvZiBFbWl0dGVyLlxuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogLy8gQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRvIFwiZm9vXCIgZXZlbnQuXG5cdFx0ICogZW1pdHRlci5vbignZm9vJywgbGlzdGVuZXIpO1xuXHRcdCAqL1xuXG5cdFx0RW1pdHRlci5wcm90b3R5cGUub24gPSBmdW5jdGlvbiBvbihldmVudCwgbGlzdGVuZXIpIHtcblx0XHRcdC8vIFVzZSB0aGUgY3VycmVudCBjb2xsZWN0aW9uIG9yIGNyZWF0ZSBpdC5cblx0XHRcdHRoaXMuX2V2ZW50Q29sbGVjdGlvbiA9IHRoaXMuX2V2ZW50Q29sbGVjdGlvbiB8fCB7fTtcblxuXHRcdFx0Ly8gVXNlIHRoZSBjdXJyZW50IGNvbGxlY3Rpb24gb2YgYW4gZXZlbnQgb3IgY3JlYXRlIGl0LlxuXHRcdFx0dGhpcy5fZXZlbnRDb2xsZWN0aW9uW2V2ZW50XSA9IHRoaXMuX2V2ZW50Q29sbGVjdGlvbltldmVudF0gfHwgW107XG5cblx0XHRcdC8vIEFwcGVuZHMgdGhlIGxpc3RlbmVyIGludG8gdGhlIGNvbGxlY3Rpb24gb2YgdGhlIGdpdmVuIGV2ZW50XG5cdFx0XHR0aGlzLl9ldmVudENvbGxlY3Rpb25bZXZlbnRdLnB1c2gobGlzdGVuZXIpO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogQWRkcyBhIGxpc3RlbmVyIHRvIHRoZSBjb2xsZWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50IHRoYXQgd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlLlxuXHRcdCAqIEBtZW1iZXJvZiEgRW1pdHRlci5wcm90b3R5cGVcblx0XHQgKiBAZnVuY3Rpb25cblx0XHQgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnQgLSBUaGUgZXZlbnQgbmFtZS5cblx0XHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciAtIEEgbGlzdGVuZXIgZnVuY3Rpb24gdG8gYWRkLlxuXHRcdCAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgRW1pdHRlci5cblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIC8vIFdpbGwgYWRkIGFuIGV2ZW50IGhhbmRsZXIgdG8gXCJmb29cIiBldmVudCBvbmNlLlxuXHRcdCAqIGVtaXR0ZXIub25jZSgnZm9vJywgbGlzdGVuZXIpO1xuXHRcdCAqL1xuXG5cdFx0RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIG9uY2UoZXZlbnQsIGxpc3RlbmVyKSB7XG5cdFx0XHR2YXIgc2VsZiA9IHRoaXM7XG5cblx0XHRcdGZ1bmN0aW9uIGZuKCkge1xuXHRcdFx0XHRzZWxmLm9mZihldmVudCwgZm4pO1xuXHRcdFx0XHRsaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHRcdFx0fVxuXG5cdFx0XHRmbi5saXN0ZW5lciA9IGxpc3RlbmVyO1xuXG5cdFx0XHR0aGlzLm9uKGV2ZW50LCBmbik7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH07XG5cblx0XHQvKipcblx0XHQgKiBSZW1vdmVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgY29sbGVjdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBldmVudC5cblx0XHQgKiBAbWVtYmVyb2YhIEVtaXR0ZXIucHJvdG90eXBlXG5cdFx0ICogQGZ1bmN0aW9uXG5cdFx0ICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50IC0gVGhlIGV2ZW50IG5hbWUuXG5cdFx0ICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgLSBBIGxpc3RlbmVyIGZ1bmN0aW9uIHRvIHJlbW92ZS5cblx0XHQgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIEVtaXR0ZXIuXG5cdFx0ICogQGV4YW1wbGVcblx0XHQgKiAvLyBSZW1vdmUgYSBnaXZlbiBsaXN0ZW5lci5cblx0XHQgKiBlbWl0dGVyLm9mZignZm9vJywgbGlzdGVuZXIpO1xuXHRcdCAqL1xuXG5cdFx0RW1pdHRlci5wcm90b3R5cGUub2ZmID0gZnVuY3Rpb24gb2ZmKGV2ZW50LCBsaXN0ZW5lcikge1xuXG5cdFx0XHR2YXIgbGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuXG5cdFx0XHQvLyBEZWZpbmVzIGxpc3RlbmVycyB2YWx1ZS5cblx0XHRcdGlmICghdGhpcy5fZXZlbnRDb2xsZWN0aW9uIHx8ICEobGlzdGVuZXJzID0gdGhpcy5fZXZlbnRDb2xsZWN0aW9uW2V2ZW50XSkpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9XG5cblx0XHRcdGxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uKGZuLCBpKSB7XG5cdFx0XHRcdGlmIChmbiA9PT0gbGlzdGVuZXIgfHwgZm4ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG5cdFx0XHRcdFx0Ly8gUmVtb3ZlcyB0aGUgZ2l2ZW4gbGlzdGVuZXIuXG5cdFx0XHRcdFx0bGlzdGVuZXJzLnNwbGljZShpLCAxKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdC8vIFJlbW92ZXMgYW4gZW1wdHkgZXZlbnQgY29sbGVjdGlvbi5cblx0XHRcdGlmIChsaXN0ZW5lcnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzLl9ldmVudENvbGxlY3Rpb25bZXZlbnRdO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9O1xuXG5cdFx0LyoqXG5cdFx0ICogRXhlY3V0ZSBlYWNoIGl0ZW0gaW4gdGhlIGxpc3RlbmVyIGNvbGxlY3Rpb24gaW4gb3JkZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGRhdGEuXG5cdFx0ICogQG1lbWJlcm9mISBFbWl0dGVyLnByb3RvdHlwZVxuXHRcdCAqIEBmdW5jdGlvblxuXHRcdCAqIEBwYXJhbSB7U3RyaW5nfSBldmVudCAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB5b3Ugd2FudCB0byBlbWl0LlxuXHRcdCAqIEBwYXJhbSB7Li4uT2JqZWN0fSBkYXRhIC0gRGF0YSB0byBwYXNzIHRvIHRoZSBsaXN0ZW5lcnMuXG5cdFx0ICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBhbiBpbnN0YW5jZSBvZiBFbWl0dGVyLlxuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogLy8gRW1pdHMgdGhlIFwiZm9vXCIgZXZlbnQgd2l0aCAncGFyYW0xJyBhbmQgJ3BhcmFtMicgYXMgYXJndW1lbnRzLlxuXHRcdCAqIGVtaXR0ZXIuZW1pdCgnZm9vJywgJ3BhcmFtMScsICdwYXJhbTInKTtcblx0XHQgKi9cblxuXHRcdEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiBlbWl0KGV2ZW50KSB7XG5cdFx0XHR2YXIgX3RoaXMgPSB0aGlzO1xuXG5cdFx0XHRmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcblx0XHRcdFx0YXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG5cdFx0XHR9XG5cblx0XHRcdHZhciBsaXN0ZW5lcnMgPSB1bmRlZmluZWQ7XG5cblx0XHRcdC8vIERlZmluZXMgbGlzdGVuZXJzIHZhbHVlLlxuXHRcdFx0aWYgKCF0aGlzLl9ldmVudENvbGxlY3Rpb24gfHwgIShsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudENvbGxlY3Rpb25bZXZlbnRdKSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2xvbmUgbGlzdGVuZXJzXG5cdFx0XHRsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuc2xpY2UoMCk7XG5cblx0XHRcdGxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uKGZuKSB7XG5cdFx0XHRcdHJldHVybiBmbi5hcHBseShfdGhpcywgYXJncyk7XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fTtcblxuXHRcdHJldHVybiBFbWl0dGVyO1xuXHR9KSgpO1xuXG5cblx0LyoqXG5cdCAqIFByaXZhdGVzXG5cdCAqL1xuXHR2YXIgc2Nyb2xsVGltZW91dDtcblx0dmFyIHNjcm9sbGluZyA9IGZhbHNlO1xuXHR2YXIgZG9jID0gd2luZG93LmRvY3VtZW50O1xuXHR2YXIgaHRtbCA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG5cdHZhciBtc1BvaW50ZXJTdXBwb3J0ZWQgPSB3aW5kb3cubmF2aWdhdG9yLm1zUG9pbnRlckVuYWJsZWQ7XG5cdHZhciB0b3VjaCA9IHtcblx0XHQnc3RhcnQnOiBtc1BvaW50ZXJTdXBwb3J0ZWQgPyAnTVNQb2ludGVyRG93bicgOiAndG91Y2hzdGFydCcsXG5cdFx0J21vdmUnOiBtc1BvaW50ZXJTdXBwb3J0ZWQgPyAnTVNQb2ludGVyTW92ZScgOiAndG91Y2htb3ZlJyxcblx0XHQnZW5kJzogbXNQb2ludGVyU3VwcG9ydGVkID8gJ01TUG9pbnRlclVwJyA6ICd0b3VjaGVuZCdcblx0fTtcblx0dmFyIHByZWZpeCA9IChmdW5jdGlvbiBwcmVmaXgoKSB7XG5cdFx0dmFyIHJlZ2V4ID0gL14oV2Via2l0fEtodG1sfE1venxtc3xPKSg/PVtBLVpdKS87XG5cdFx0dmFyIHN0eWxlRGVjbGFyYXRpb24gPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpWzBdLnN0eWxlO1xuXHRcdGZvciAodmFyIHByb3AgaW4gc3R5bGVEZWNsYXJhdGlvbikge1xuXHRcdFx0aWYgKHJlZ2V4LnRlc3QocHJvcCkpIHtcblx0XHRcdFx0cmV0dXJuICctJyArIHByb3AubWF0Y2gocmVnZXgpWzBdLnRvTG93ZXJDYXNlKCkgKyAnLSc7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdC8vIE5vdGhpbmcgZm91bmQgc28gZmFyPyBXZWJraXQgZG9lcyBub3QgZW51bWVyYXRlIG92ZXIgdGhlIENTUyBwcm9wZXJ0aWVzIG9mIHRoZSBzdHlsZSBvYmplY3QuXG5cdFx0Ly8gSG93ZXZlciAocHJvcCBpbiBzdHlsZSkgcmV0dXJucyB0aGUgY29ycmVjdCB2YWx1ZSwgc28gd2UnbGwgaGF2ZSB0byB0ZXN0IGZvclxuXHRcdC8vIHRoZSBwcmVjZW5jZSBvZiBhIHNwZWNpZmljIHByb3BlcnR5XG5cdFx0aWYgKCdXZWJraXRPcGFjaXR5JyBpbiBzdHlsZURlY2xhcmF0aW9uKSB7XG5cdFx0XHRyZXR1cm4gJy13ZWJraXQtJztcblx0XHR9XG5cdFx0aWYgKCdLaHRtbE9wYWNpdHknIGluIHN0eWxlRGVjbGFyYXRpb24pIHtcblx0XHRcdHJldHVybiAnLWtodG1sLSc7XG5cdFx0fVxuXHRcdHJldHVybiAnJztcblx0fSgpKTtcblxuXHRmdW5jdGlvbiBleHRlbmQoZGVzdGluYXRpb24sIGZyb20pIHtcblx0XHRmb3IgKHZhciBwcm9wIGluIGZyb20pIHtcblx0XHRcdGlmIChmcm9tW3Byb3BdKSB7XG5cdFx0XHRcdGRlc3RpbmF0aW9uW3Byb3BdID0gZnJvbVtwcm9wXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGRlc3RpbmF0aW9uO1xuXHR9XG5cblx0ZnVuY3Rpb24gaW5oZXJpdHMoY2hpbGQsIHViZXIpIHtcblx0XHRjaGlsZC5wcm90b3R5cGUgPSBleHRlbmQoY2hpbGQucHJvdG90eXBlIHx8IHt9LCB1YmVyLnByb3RvdHlwZSk7XG5cdH1cblxuXHRmdW5jdGlvbiBoYXNJZ25vcmVkRWxlbWVudHMoZWwpIHtcblx0XHR3aGlsZSAoZWwucGFyZW50Tm9kZSkge1xuXHRcdFx0aWYgKGVsLmdldEF0dHJpYnV0ZSgnZGF0YS1zbGlkZW91dC1pZ25vcmUnKSAhPT0gbnVsbCkge1xuXHRcdFx0XHRyZXR1cm4gZWw7XG5cdFx0XHR9XG5cdFx0XHRlbCA9IGVsLnBhcmVudE5vZGU7XG5cdFx0fVxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNsaWRlb3V0IGNvbnN0cnVjdG9yXG5cdCAqL1xuXHRmdW5jdGlvbiBTbGlkZW91dChvcHRpb25zKSB7XG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0XHQvLyBTZXRzIGRlZmF1bHQgdmFsdWVzXG5cdFx0dGhpcy5fc3RhcnRPZmZzZXRYID0gMDtcblx0XHR0aGlzLl9jdXJyZW50T2Zmc2V0WCA9IDA7XG5cdFx0dGhpcy5fb3BlbmluZyA9IGZhbHNlO1xuXHRcdHRoaXMuX21vdmVkID0gZmFsc2U7XG5cdFx0dGhpcy5fb3BlbmVkID0gZmFsc2U7XG5cdFx0dGhpcy5fcHJldmVudE9wZW4gPSBmYWxzZTtcblxuXHRcdC8vIFNldHMgcGFuZWxcblx0XHR0aGlzLnBhbmVsID0gb3B0aW9ucy5wYW5lbDtcblx0XHR0aGlzLm1lbnUgPSBvcHRpb25zLm1lbnU7XG5cblx0XHQvLyBTZXRzIG9wdGlvbnNcblx0XHR0aGlzLl90b3VjaCA9IG9wdGlvbnMudG91Y2ggPT09IHVuZGVmaW5lZCA/IHRydWUgOiBvcHRpb25zLnRvdWNoICYmIHRydWU7XG5cdFx0dGhpcy5fc2lkZSA9IG9wdGlvbnMuc2lkZSB8fCAnbGVmdCc7XG5cdFx0dGhpcy5fZWFzaW5nID0gb3B0aW9ucy5meCB8fCBvcHRpb25zLmVhc2luZyB8fCAnZWFzZSc7XG5cdFx0dGhpcy5fZHVyYXRpb24gPSBwYXJzZUludChvcHRpb25zLmR1cmF0aW9uLCAxMCkgfHwgMzAwO1xuXHRcdHRoaXMuX3RvbGVyYW5jZSA9IHBhcnNlSW50KG9wdGlvbnMudG9sZXJhbmNlLCAxMCkgfHwgNzA7XG5cdFx0dGhpcy5fcGFkZGluZyA9IHRoaXMuX3RyYW5zbGF0ZVRvID0gcGFyc2VJbnQob3B0aW9ucy5wYWRkaW5nLCAxMCkgfHwgMjU2O1xuXHRcdHRoaXMuX29yaWVudGF0aW9uID0gdGhpcy5fc2lkZSA9PT0gJ3JpZ2h0JyA/IC0xIDogMTtcblx0XHR0aGlzLl90cmFuc2xhdGVUbyAqPSB0aGlzLl9vcmllbnRhdGlvbjtcblxuXHRcdC8vIFNldHMgIGNsYXNzbmFtZXNcblx0XHRpZiAoIXRoaXMucGFuZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbGlkZW91dC1wYW5lbCcpKSB7XG5cdFx0XHR0aGlzLnBhbmVsLmNsYXNzTGlzdC5hZGQoJ3NsaWRlb3V0LXBhbmVsJyk7XG5cdFx0fVxuXHRcdGlmICghdGhpcy5wYW5lbC5jbGFzc0xpc3QuY29udGFpbnMoJ3NsaWRlb3V0LXBhbmVsLScgKyB0aGlzLl9zaWRlKSkge1xuXHRcdFx0dGhpcy5wYW5lbC5jbGFzc0xpc3QuYWRkKCdzbGlkZW91dC1wYW5lbC0nICsgdGhpcy5fc2lkZSk7XG5cdFx0fVxuXHRcdGlmICghdGhpcy5tZW51LmNsYXNzTGlzdC5jb250YWlucygnc2xpZGVvdXQtbWVudScpKSB7XG5cdFx0XHR0aGlzLm1lbnUuY2xhc3NMaXN0LmFkZCgnc2xpZGVvdXQtbWVudScpO1xuXHRcdH1cblx0XHRpZiAoIXRoaXMubWVudS5jbGFzc0xpc3QuY29udGFpbnMoJ3NsaWRlb3V0LW1lbnUtJyArIHRoaXMuX3NpZGUpKSB7XG5cdFx0XHR0aGlzLm1lbnUuY2xhc3NMaXN0LmFkZCgnc2xpZGVvdXQtbWVudS0nICsgdGhpcy5fc2lkZSk7XG5cdFx0fVxuXG5cdFx0Ly8gSW5pdCB0b3VjaCBldmVudHNcblx0XHRpZiAodGhpcy5fdG91Y2gpIHtcblx0XHRcdHRoaXMuX2luaXRUb3VjaEV2ZW50cygpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBJbmhlcml0cyBmcm9tIEVtaXR0ZXJcblx0ICovXG5cdGluaGVyaXRzKFNsaWRlb3V0LCBFbWl0dGVyKTtcblxuXHQvKipcblx0ICogT3BlbnMgdGhlIHNsaWRlb3V0IG1lbnUuXG5cdCAqL1xuXHRTbGlkZW91dC5wcm90b3R5cGUub3BlbiA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBzZWxmID0gdGhpcztcblx0XHR0aGlzLmVtaXQoJ2JlZm9yZW9wZW4nKTtcblx0XHRpZiAoIWh0bWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzbGlkZW91dC1vcGVuJykpIHtcblx0XHRcdGh0bWwuY2xhc3NMaXN0LmFkZCgnc2xpZGVvdXQtb3BlbicpO1xuXHRcdH1cblx0XHR0aGlzLl9zZXRUcmFuc2l0aW9uKCk7XG5cdFx0dGhpcy5fdHJhbnNsYXRlWFRvKHRoaXMuX3RyYW5zbGF0ZVRvKTtcblx0XHR0aGlzLl9vcGVuZWQgPSB0cnVlO1xuXHRcdHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cdFx0XHRzZWxmLnBhbmVsLnN0eWxlLnRyYW5zaXRpb24gPSBzZWxmLnBhbmVsLnN0eWxlWyctd2Via2l0LXRyYW5zaXRpb24nXSA9ICcnO1xuXHRcdFx0c2VsZi5lbWl0KCdvcGVuJyk7XG5cdFx0fSwgdGhpcy5fZHVyYXRpb24gKyA1MCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cblx0LyoqXG5cdCAqIENsb3NlcyBzbGlkZW91dCBtZW51LlxuXHQgKi9cblx0U2xpZGVvdXQucHJvdG90eXBlLmNsb3NlID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHNlbGYgPSB0aGlzO1xuXHRcdGlmICghdGhpcy5pc09wZW4oKSAmJiAhdGhpcy5fb3BlbmluZykge1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdHRoaXMuZW1pdCgnYmVmb3JlY2xvc2UnKTtcblx0XHR0aGlzLl9zZXRUcmFuc2l0aW9uKCk7XG5cdFx0dGhpcy5fdHJhbnNsYXRlWFRvKDApO1xuXHRcdHRoaXMuX29wZW5lZCA9IGZhbHNlO1xuXHRcdHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cdFx0XHRodG1sLmNsYXNzTGlzdC5yZW1vdmUoJ3NsaWRlb3V0LW9wZW4nKTtcblx0XHRcdHNlbGYucGFuZWwuc3R5bGUudHJhbnNpdGlvbiA9IHNlbGYucGFuZWwuc3R5bGVbJy13ZWJraXQtdHJhbnNpdGlvbiddID0gc2VsZi5wYW5lbC5zdHlsZVtwcmVmaXggKyAndHJhbnNmb3JtJ10gPSBzZWxmLnBhbmVsLnN0eWxlLnRyYW5zZm9ybSA9ICcnO1xuXHRcdFx0c2VsZi5lbWl0KCdjbG9zZScpO1xuXHRcdH0sIHRoaXMuX2R1cmF0aW9uICsgNTApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBUb2dnbGVzIChvcGVuL2Nsb3NlKSBzbGlkZW91dCBtZW51LlxuXHQgKi9cblx0U2xpZGVvdXQucHJvdG90eXBlLnRvZ2dsZSA9IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmlzT3BlbigpID8gdGhpcy5jbG9zZSgpIDogdGhpcy5vcGVuKCk7XG5cdH07XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2xpZGVvdXQgaXMgY3VycmVudGx5IG9wZW4sIGFuZCBmYWxzZSBpZiBpdCBpcyBjbG9zZWQuXG5cdCAqL1xuXHRTbGlkZW91dC5wcm90b3R5cGUuaXNPcGVuID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuX29wZW5lZDtcblx0fTtcblxuXHQvKipcblx0ICogVHJhbnNsYXRlcyBwYW5lbCBhbmQgdXBkYXRlcyBjdXJyZW50T2Zmc2V0IHdpdGggYSBnaXZlbiBYIHBvaW50XG5cdCAqL1xuXHRTbGlkZW91dC5wcm90b3R5cGUuX3RyYW5zbGF0ZVhUbyA9IGZ1bmN0aW9uKHRyYW5zbGF0ZVgpIHtcblx0XHR0aGlzLl9jdXJyZW50T2Zmc2V0WCA9IHRyYW5zbGF0ZVg7XG5cdFx0dGhpcy5wYW5lbC5zdHlsZVtwcmVmaXggKyAndHJhbnNmb3JtJ10gPSB0aGlzLnBhbmVsLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVYKCcgKyB0cmFuc2xhdGVYICsgJ3B4KSc7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cblx0LyoqXG5cdCAqIFNldCB0cmFuc2l0aW9uIHByb3BlcnRpZXNcblx0ICovXG5cdFNsaWRlb3V0LnByb3RvdHlwZS5fc2V0VHJhbnNpdGlvbiA9IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMucGFuZWwuc3R5bGVbcHJlZml4ICsgJ3RyYW5zaXRpb24nXSA9IHRoaXMucGFuZWwuc3R5bGUudHJhbnNpdGlvbiA9IHByZWZpeCArICd0cmFuc2Zvcm0gJyArIHRoaXMuX2R1cmF0aW9uICsgJ21zICcgKyB0aGlzLl9lYXNpbmc7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cblx0LyoqXG5cdCAqIEluaXRpYWxpemVzIHRvdWNoIGV2ZW50XG5cdCAqL1xuXHRTbGlkZW91dC5wcm90b3R5cGUuX2luaXRUb3VjaEV2ZW50cyA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBzZWxmID0gdGhpcztcblxuXHRcdC8qKlxuXHRcdCAqIERlY291cGxlIHNjcm9sbCBldmVudFxuXHRcdCAqL1xuXHRcdHRoaXMuX29uU2Nyb2xsRm4gPSBkZWNvdXBsZShkb2MsICdzY3JvbGwnLCBmdW5jdGlvbigpIHtcblx0XHRcdGlmICghc2VsZi5fbW92ZWQpIHtcblx0XHRcdFx0Y2xlYXJUaW1lb3V0KHNjcm9sbFRpbWVvdXQpO1xuXHRcdFx0XHRzY3JvbGxpbmcgPSB0cnVlO1xuXHRcdFx0XHRzY3JvbGxUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRzY3JvbGxpbmcgPSBmYWxzZTtcblx0XHRcdFx0fSwgMjUwKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8qKlxuXHRcdCAqIFByZXZlbnRzIHRvdWNobW92ZSBldmVudCBpZiBzbGlkZW91dCBpcyBtb3Zpbmdcblx0XHQgKi9cblx0XHR0aGlzLl9wcmV2ZW50TW92ZSA9IGZ1bmN0aW9uKGV2ZSkge1xuXHRcdFx0aWYgKHNlbGYuX21vdmVkKSB7XG5cdFx0XHRcdGV2ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRkb2MuYWRkRXZlbnRMaXN0ZW5lcih0b3VjaC5tb3ZlLCB0aGlzLl9wcmV2ZW50TW92ZSk7XG5cblx0XHQvKipcblx0XHQgKiBSZXNldHMgdmFsdWVzIG9uIHRvdWNoc3RhcnRcblx0XHQgKi9cblx0XHR0aGlzLl9yZXNldFRvdWNoRm4gPSBmdW5jdGlvbihldmUpIHtcblx0XHRcdGlmICh0eXBlb2YgZXZlLnRvdWNoZXMgPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0c2VsZi5fbW92ZWQgPSBmYWxzZTtcblx0XHRcdHNlbGYuX29wZW5pbmcgPSBmYWxzZTtcblx0XHRcdHNlbGYuX3N0YXJ0T2Zmc2V0WCA9IGV2ZS50b3VjaGVzWzBdLnBhZ2VYO1xuXHRcdFx0c2VsZi5fcHJldmVudE9wZW4gPSAoIXNlbGYuX3RvdWNoIHx8ICghc2VsZi5pc09wZW4oKSAmJiBzZWxmLm1lbnUuY2xpZW50V2lkdGggIT09IDApKTtcblx0XHR9O1xuXG5cdFx0dGhpcy5wYW5lbC5hZGRFdmVudExpc3RlbmVyKHRvdWNoLnN0YXJ0LCB0aGlzLl9yZXNldFRvdWNoRm4pO1xuXG5cdFx0LyoqXG5cdFx0ICogUmVzZXRzIHZhbHVlcyBvbiB0b3VjaGNhbmNlbFxuXHRcdCAqL1xuXHRcdHRoaXMuX29uVG91Y2hDYW5jZWxGbiA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0c2VsZi5fbW92ZWQgPSBmYWxzZTtcblx0XHRcdHNlbGYuX29wZW5pbmcgPSBmYWxzZTtcblx0XHR9O1xuXG5cdFx0dGhpcy5wYW5lbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRoaXMuX29uVG91Y2hDYW5jZWxGbik7XG5cblx0XHQvKipcblx0XHQgKiBUb2dnbGVzIHNsaWRlb3V0IG9uIHRvdWNoZW5kXG5cdFx0ICovXG5cdFx0dGhpcy5fb25Ub3VjaEVuZEZuID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoc2VsZi5fbW92ZWQpIHtcblx0XHRcdFx0c2VsZi5lbWl0KCd0cmFuc2xhdGVlbmQnKTtcblx0XHRcdFx0KHNlbGYuX29wZW5pbmcgJiYgTWF0aC5hYnMoc2VsZi5fY3VycmVudE9mZnNldFgpID4gc2VsZi5fdG9sZXJhbmNlKSA/IHNlbGYub3BlbigpOiBzZWxmLmNsb3NlKCk7XG5cdFx0XHR9XG5cdFx0XHRzZWxmLl9tb3ZlZCA9IGZhbHNlO1xuXHRcdH07XG5cblx0XHR0aGlzLnBhbmVsLmFkZEV2ZW50TGlzdGVuZXIodG91Y2guZW5kLCB0aGlzLl9vblRvdWNoRW5kRm4pO1xuXG5cdFx0LyoqXG5cdFx0ICogVHJhbnNsYXRlcyBwYW5lbCBvbiB0b3VjaG1vdmVcblx0XHQgKi9cblx0XHR0aGlzLl9vblRvdWNoTW92ZUZuID0gZnVuY3Rpb24oZXZlKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdHNjcm9sbGluZyB8fFxuXHRcdFx0XHRzZWxmLl9wcmV2ZW50T3BlbiB8fFxuXHRcdFx0XHR0eXBlb2YgZXZlLnRvdWNoZXMgPT09ICd1bmRlZmluZWQnIHx8XG5cdFx0XHRcdGhhc0lnbm9yZWRFbGVtZW50cyhldmUudGFyZ2V0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGRpZl94ID0gZXZlLnRvdWNoZXNbMF0uY2xpZW50WCAtIHNlbGYuX3N0YXJ0T2Zmc2V0WDtcblx0XHRcdHZhciB0cmFuc2xhdGVYID0gc2VsZi5fY3VycmVudE9mZnNldFggPSBkaWZfeDtcblxuXHRcdFx0aWYgKE1hdGguYWJzKHRyYW5zbGF0ZVgpID4gc2VsZi5fcGFkZGluZykge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmIChNYXRoLmFicyhkaWZfeCkgPiAyMCkge1xuXG5cdFx0XHRcdHNlbGYuX29wZW5pbmcgPSB0cnVlO1xuXG5cdFx0XHRcdHZhciBvcmllbnRlZF9kaWZfeCA9IGRpZl94ICogc2VsZi5fb3JpZW50YXRpb247XG5cblx0XHRcdFx0aWYgKHNlbGYuX29wZW5lZCAmJiBvcmllbnRlZF9kaWZfeCA+IDAgfHwgIXNlbGYuX29wZW5lZCAmJiBvcmllbnRlZF9kaWZfeCA8IDApIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIXNlbGYuX21vdmVkKSB7XG5cdFx0XHRcdFx0c2VsZi5lbWl0KCd0cmFuc2xhdGVzdGFydCcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKG9yaWVudGVkX2RpZl94IDw9IDApIHtcblx0XHRcdFx0XHR0cmFuc2xhdGVYID0gZGlmX3ggKyBzZWxmLl9wYWRkaW5nICogc2VsZi5fb3JpZW50YXRpb247XG5cdFx0XHRcdFx0c2VsZi5fb3BlbmluZyA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCEoc2VsZi5fbW92ZWQgJiYgaHRtbC5jbGFzc0xpc3QuY29udGFpbnMoJ3NsaWRlb3V0LW9wZW4nKSkpIHtcblx0XHRcdFx0XHRodG1sLmNsYXNzTGlzdC5hZGQoJ3NsaWRlb3V0LW9wZW4nKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHNlbGYucGFuZWwuc3R5bGVbcHJlZml4ICsgJ3RyYW5zZm9ybSddID0gc2VsZi5wYW5lbC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWCgnICsgdHJhbnNsYXRlWCArICdweCknO1xuXHRcdFx0XHRzZWxmLmVtaXQoJ3RyYW5zbGF0ZScsIHRyYW5zbGF0ZVgpO1xuXHRcdFx0XHRzZWxmLl9tb3ZlZCA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdFx0dGhpcy5wYW5lbC5hZGRFdmVudExpc3RlbmVyKHRvdWNoLm1vdmUsIHRoaXMuX29uVG91Y2hNb3ZlRm4pO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH07XG5cblx0LyoqXG5cdCAqIEVuYWJsZSBvcGVuaW5nIHRoZSBzbGlkZW91dCB2aWEgdG91Y2ggZXZlbnRzLlxuXHQgKi9cblx0U2xpZGVvdXQucHJvdG90eXBlLmVuYWJsZVRvdWNoID0gZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5fdG91Y2ggPSB0cnVlO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBEaXNhYmxlIG9wZW5pbmcgdGhlIHNsaWRlb3V0IHZpYSB0b3VjaCBldmVudHMuXG5cdCAqL1xuXHRTbGlkZW91dC5wcm90b3R5cGUuZGlzYWJsZVRvdWNoID0gZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5fdG91Y2ggPSBmYWxzZTtcblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblxuXHQvKipcblx0ICogRGVzdHJveSBhbiBpbnN0YW5jZSBvZiBzbGlkZW91dC5cblx0ICovXG5cdFNsaWRlb3V0LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG5cdFx0Ly8gQ2xvc2UgYmVmb3JlIGNsZWFuXG5cdFx0dGhpcy5jbG9zZSgpO1xuXG5cdFx0Ly8gUmVtb3ZlIGV2ZW50IGxpc3RlbmVyc1xuXHRcdGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKHRvdWNoLm1vdmUsIHRoaXMuX3ByZXZlbnRNb3ZlKTtcblx0XHR0aGlzLnBhbmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIodG91Y2guc3RhcnQsIHRoaXMuX3Jlc2V0VG91Y2hGbik7XG5cdFx0dGhpcy5wYW5lbC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRoaXMuX29uVG91Y2hDYW5jZWxGbik7XG5cdFx0dGhpcy5wYW5lbC5yZW1vdmVFdmVudExpc3RlbmVyKHRvdWNoLmVuZCwgdGhpcy5fb25Ub3VjaEVuZEZuKTtcblx0XHR0aGlzLnBhbmVsLnJlbW92ZUV2ZW50TGlzdGVuZXIodG91Y2gubW92ZSwgdGhpcy5fb25Ub3VjaE1vdmVGbik7XG5cdFx0ZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuX29uU2Nyb2xsRm4pO1xuXG5cdFx0Ly8gUmVtb3ZlIG1ldGhvZHNcblx0XHR0aGlzLm9wZW4gPSB0aGlzLmNsb3NlID0gZnVuY3Rpb24oKSB7fTtcblxuXHRcdC8vIFJldHVybiB0aGUgaW5zdGFuY2Ugc28gaXQgY2FuIGJlIGVhc2lseSBkZXJlZmVyZW5jZWRcblx0XHRyZXR1cm4gdGhpcztcblx0fTtcblxuXHQvKipcblx0ICogRXhwb3NlIFNsaWRlb3V0XG5cdCAqL1xuXHRyZXR1cm4gU2xpZGVvdXQ7XG5cbn0pKTsiXX0=",
    "\"use strict\";\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n(function (root, factory) {\n    if (typeof define === 'function' && define.amd) {\n        define(['jquery'], function ($) {\n            return factory($);\n        });\n    } else if (typeof exports !== 'undefined') {\n        var $ = require('jquery');\n        module.exports = factory($);\n    } else {\n        factory(root.$);\n    }\n})(undefined, function (jQuery) {\n    /*\n     * A time picker for jQuery\n     *\n     * Dual licensed under the MIT and GPL licenses.\n     * Copyright (c) 2009 Anders Fajerson\n     * @name     timePicker\n     * @author   Anders Fajerson (http://perifer.se)\n     * @example  $(\"#mytime\").timePicker();\n     * @example  $(\"#mytime\").timePicker({step:30, startTime:\"15:00\", endTime:\"18:00\"});\n     *\n     * Based on timePicker by Sam Collet (http://www.texotela.co.uk/code/jquery/timepicker/)\n     *\n     * Options:\n     *   step: # of minutes to step the time by\n     *   startTime: beginning of the range of acceptable times\n     *   endTime: end of the range of acceptable times\n     *   separator: separator string to use between hours and minutes (e.g. ':')\n     *   show24Hours: use a 24-hour scheme\n     */\n\n    ;(function ($) {\n        $.fn.timePicker = function (options) {\n            // Build main options before element iteration\n            var settings = $.extend({}, $.fn.timePicker.defaults, options);\n\n            return this.each(function () {\n                $.timePicker(this, settings);\n            });\n        };\n\n        $.timePicker = function (elm, settings) {\n            var e = $(elm)[0];\n            return e.timePicker || (e.timePicker = new jQuery._timePicker(e, settings));\n        };\n\n        $.timePicker.version = '0.3';\n\n        $._timePicker = function (elm, settings) {\n\n            var tpOver = false;\n            var keyDown = false;\n            var startTime = timeToDate(settings.startTime, settings);\n            var endTime = timeToDate(settings.endTime, settings);\n            var selectedClass = \"selected\";\n            var selectedSelector = \"li.\" + selectedClass;\n\n            $(elm).attr('autocomplete', 'OFF'); // Disable browser autocomplete\n\n            var times = [];\n            var time = new Date(startTime); // Create a new date object.\n            while (time <= endTime) {\n                times[times.length] = formatTime(time, settings);\n                time = new Date(time.setMinutes(time.getMinutes() + settings.step));\n            }\n\n            var $tpDiv = $('<div class=\"time-picker' + (settings.show24Hours ? '' : ' time-picker-12hours') + '\"></div>');\n            var $tpList = $('<ul></ul>');\n\n            // Build the list.\n            for (var i = 0; i < times.length; i++) {\n                $tpList.append(\"<li>\" + times[i] + \"</li>\");\n            }\n            $tpDiv.append($tpList);\n            // Append the timPicker to the body and position it.\n            $tpDiv.appendTo('body').hide();\n\n            // Store the mouse state, used by the blur event. Use mouseover instead of\n            // mousedown since Opera fires blur before mousedown.\n            $tpDiv.mouseover(function () {\n                tpOver = true;\n            }).mouseout(function () {\n                tpOver = false;\n            });\n\n            $(\"li\", $tpList).mouseover(function () {\n                if (!keyDown) {\n                    $(selectedSelector, $tpDiv).removeClass(selectedClass);\n                    $(this).addClass(selectedClass);\n                }\n            }).mousedown(function () {\n                tpOver = true;\n            }).click(function () {\n                setTimeVal(elm, this, $tpDiv, settings);\n                tpOver = false;\n            });\n\n            var showPicker = function showPicker() {\n                if ($tpDiv.is(\":visible\")) {\n                    return false;\n                }\n                $(\"li\", $tpDiv).removeClass(selectedClass);\n\n                // Position\n                var elmOffset = $(elm).offset();\n                $tpDiv.css({ 'top': elmOffset.top + elm.offsetHeight, 'left': elmOffset.left });\n\n                // Show picker. This has to be done before scrollTop is set since that\n                // can't be done on hidden elements.\n                $tpDiv.show();\n\n                // Try to find a time in the list that matches the entered time.\n                var time = elm.value ? timeStringToDate(elm.value, settings) : startTime;\n                var startMin = startTime.getHours() * 60 + startTime.getMinutes();\n                var min = time.getHours() * 60 + time.getMinutes() - startMin;\n                var steps = Math.round(min / settings.step);\n                var roundTime = normaliseTime(new Date(0, 0, 0, 0, steps * settings.step + startMin, 0));\n                roundTime = startTime < roundTime && roundTime <= endTime ? roundTime : startTime;\n                var $matchedTime = $(\"li:contains(\" + formatTime(roundTime, settings) + \")\", $tpDiv);\n\n                if ($matchedTime.length) {\n                    $matchedTime.addClass(selectedClass);\n                    // Scroll to matched time.\n                    $tpDiv[0].scrollTop = $matchedTime[0].offsetTop;\n                }\n                return true;\n            };\n            // Attach to click as well as focus so timePicker can be shown again when\n            // clicking on the input when it already has focus.\n            $(elm).focus(showPicker).click(showPicker);\n            // Hide timepicker on blur\n            $(elm).blur(function () {\n                if (!tpOver) {\n                    $tpDiv.hide();\n                }\n            });\n            // Keypress doesn't repeat on Safari for non-text keys.\n            // Keydown doesn't repeat on Firefox and Opera on Mac.\n            // Using kepress for Opera and Firefox and keydown for the rest seems to\n            // work with up/down/enter/esc.\n            var event = navigator.userAgent.indexOf(\"opera\") >= 0 || navigator.userAgent.indexOf(\"mozilla\") >= 0 ? 'keypress' : 'keydown';\n            $(elm)[event](function (e) {\n                var $selected;\n                keyDown = true;\n                var top = $tpDiv[0].scrollTop;\n                switch (e.keyCode) {\n                    case 38:\n                        // Up arrow.\n                        // Just show picker if it's hidden.\n                        if (showPicker()) {\n                            return false;\n                        };\n                        $selected = $(selectedSelector, $tpList);\n                        var prev = $selected.prev().addClass(selectedClass)[0];\n                        if (prev) {\n                            $selected.removeClass(selectedClass);\n                            // Scroll item into view.\n                            if (prev.offsetTop < top) {\n                                $tpDiv[0].scrollTop = top - prev.offsetHeight;\n                            }\n                        } else {\n                            // Loop to next item.\n                            $selected.removeClass(selectedClass);\n                            prev = $(\"li:last\", $tpList).addClass(selectedClass)[0];\n                            $tpDiv[0].scrollTop = prev.offsetTop - prev.offsetHeight;\n                        }\n                        return false;\n                        break;\n                    case 40:\n                        // Down arrow, similar in behaviour to up arrow.\n                        if (showPicker()) {\n                            return false;\n                        };\n                        $selected = $(selectedSelector, $tpList);\n                        var next = $selected.next().addClass(selectedClass)[0];\n                        if (next) {\n                            $selected.removeClass(selectedClass);\n                            if (next.offsetTop + next.offsetHeight > top + $tpDiv[0].offsetHeight) {\n                                $tpDiv[0].scrollTop = top + next.offsetHeight;\n                            }\n                        } else {\n                            $selected.removeClass(selectedClass);\n                            next = $(\"li:first\", $tpList).addClass(selectedClass)[0];\n                            $tpDiv[0].scrollTop = 0;\n                        }\n                        return false;\n                        break;\n                    case 13:\n                        // Enter\n                        if ($tpDiv.is(\":visible\")) {\n                            var sel = $(selectedSelector, $tpList)[0];\n                            setTimeVal(elm, sel, $tpDiv, settings);\n                        }\n                        return false;\n                        break;\n                    case 27:\n                        // Esc\n                        $tpDiv.hide();\n                        return false;\n                        break;\n                }\n                return true;\n            });\n            $(elm).keyup(function (e) {\n                keyDown = false;\n            });\n            // Helper function to get an inputs current time as Date object.\n            // Returns a Date object.\n            this.getTime = function () {\n                return timeStringToDate(elm.value, settings);\n            };\n            // Helper function to set a time input.\n            // Takes a Date object or string.\n            this.setTime = function (time) {\n                elm.value = formatTime(timeToDate(time, settings), settings);\n                // Trigger element's change events.\n                $(elm).change();\n            };\n        }; // End fn;\n\n        // Plugin defaults.\n        $.fn.timePicker.defaults = {\n            step: 30,\n            startTime: new Date(0, 0, 0, 0, 0, 0),\n            endTime: new Date(0, 0, 0, 23, 30, 0),\n            separator: ':',\n            show24Hours: true\n        };\n\n        // Private functions.\n\n        function setTimeVal(elm, sel, $tpDiv, settings) {\n            // Update input field\n            elm.value = $(sel).text();\n            // Trigger element's change events.\n            $(elm).change();\n            // Hide picker\n            $tpDiv.hide();\n        }\n\n        function formatTime(time, settings) {\n            var h = time.getHours();\n            var hours = settings.show24Hours ? h : (h + 11) % 12 + 1;\n            var minutes = time.getMinutes();\n            return (settings.show24Hours ? formatNumber(hours) : hours) + settings.separator + formatNumber(minutes) + (settings.show24Hours ? '' : h < 12 ? ' AM' : ' PM');\n        }\n\n        function formatNumber(value) {\n            return (value < 10 ? '0' : '') + value;\n        }\n\n        function timeToDate(input, settings) {\n            return (typeof input === 'undefined' ? 'undefined' : _typeof(input)) == 'object' ? normaliseTime(input) : timeStringToDate(input, settings);\n        }\n\n        function timeStringToDate(input, settings) {\n            if (input) {\n                var array = input.split(settings.separator);\n                var hours = parseFloat(array[0]);\n                var minutes = parseFloat(array[1]);\n\n                // Convert AM/PM hour to 24-hour format.\n                if (!settings.show24Hours) {\n                    if (hours === 12 && input.indexOf('AM') !== -1) {\n                        hours = 0;\n                    } else if (hours !== 12 && input.indexOf('PM') !== -1) {\n                        hours += 12;\n                    }\n                }\n                var time = new Date(0, 0, 0, hours, minutes, 0);\n                return normaliseTime(time);\n            }\n            return null;\n        }\n\n        /* Normalise time object to a common date. */\n        function normaliseTime(time) {\n            time.setFullYear(2001);\n            time.setMonth(0);\n            time.setDate(0);\n            return time;\n        }\n    })(jQuery);\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRpbWVwaWNrZXIuanMiXSwibmFtZXMiOlsicm9vdCIsImZhY3RvcnkiLCJkZWZpbmUiLCJhbWQiLCIkIiwiZXhwb3J0cyIsInJlcXVpcmUiLCJtb2R1bGUiLCJqUXVlcnkiLCJmbiIsInRpbWVQaWNrZXIiLCJvcHRpb25zIiwic2V0dGluZ3MiLCJleHRlbmQiLCJkZWZhdWx0cyIsImVhY2giLCJlbG0iLCJlIiwiX3RpbWVQaWNrZXIiLCJ2ZXJzaW9uIiwidHBPdmVyIiwia2V5RG93biIsInN0YXJ0VGltZSIsInRpbWVUb0RhdGUiLCJlbmRUaW1lIiwic2VsZWN0ZWRDbGFzcyIsInNlbGVjdGVkU2VsZWN0b3IiLCJhdHRyIiwidGltZXMiLCJ0aW1lIiwiRGF0ZSIsImxlbmd0aCIsImZvcm1hdFRpbWUiLCJzZXRNaW51dGVzIiwiZ2V0TWludXRlcyIsInN0ZXAiLCIkdHBEaXYiLCJzaG93MjRIb3VycyIsIiR0cExpc3QiLCJpIiwiYXBwZW5kIiwiYXBwZW5kVG8iLCJoaWRlIiwibW91c2VvdmVyIiwibW91c2VvdXQiLCJyZW1vdmVDbGFzcyIsImFkZENsYXNzIiwibW91c2Vkb3duIiwiY2xpY2siLCJzZXRUaW1lVmFsIiwic2hvd1BpY2tlciIsImlzIiwiZWxtT2Zmc2V0Iiwib2Zmc2V0IiwiY3NzIiwidG9wIiwib2Zmc2V0SGVpZ2h0IiwibGVmdCIsInNob3ciLCJ2YWx1ZSIsInRpbWVTdHJpbmdUb0RhdGUiLCJzdGFydE1pbiIsImdldEhvdXJzIiwibWluIiwic3RlcHMiLCJNYXRoIiwicm91bmQiLCJyb3VuZFRpbWUiLCJub3JtYWxpc2VUaW1lIiwiJG1hdGNoZWRUaW1lIiwic2Nyb2xsVG9wIiwib2Zmc2V0VG9wIiwiZm9jdXMiLCJibHVyIiwiZXZlbnQiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJpbmRleE9mIiwiJHNlbGVjdGVkIiwia2V5Q29kZSIsInByZXYiLCJuZXh0Iiwic2VsIiwia2V5dXAiLCJnZXRUaW1lIiwic2V0VGltZSIsImNoYW5nZSIsInNlcGFyYXRvciIsInRleHQiLCJoIiwiaG91cnMiLCJtaW51dGVzIiwiZm9ybWF0TnVtYmVyIiwiaW5wdXQiLCJhcnJheSIsInNwbGl0IiwicGFyc2VGbG9hdCIsInNldEZ1bGxZZWFyIiwic2V0TW9udGgiLCJzZXREYXRlIl0sIm1hcHBpbmdzIjoiQUFBQTs7OztBQUNDLFdBQVNBLElBQVQsRUFBZUMsT0FBZixFQUF3QjtBQUN2QixRQUFJLE9BQU9DLE1BQVAsS0FBa0IsVUFBbEIsSUFBZ0NBLE9BQU9DLEdBQTNDLEVBQ0E7QUFDRUQsZUFBTyxDQUFDLFFBQUQsQ0FBUCxFQUFtQixVQUFTRSxDQUFULEVBQVk7QUFDN0IsbUJBQU9ILFFBQVFHLENBQVIsQ0FBUDtBQUNELFNBRkQ7QUFHRCxLQUxELE1BTUssSUFBSSxPQUFPQyxPQUFQLEtBQW1CLFdBQXZCLEVBQ0w7QUFDRSxZQUFJRCxJQUFJRSxRQUFRLFFBQVIsQ0FBUjtBQUNBQyxlQUFPRixPQUFQLEdBQWlCSixRQUFRRyxDQUFSLENBQWpCO0FBQ0QsS0FKSSxNQU1MO0FBQ0VILGdCQUFRRCxLQUFLSSxDQUFiO0FBQ0Q7QUFDRixDQWhCQSxhQWdCUSxVQUFTSSxNQUFULEVBQWlCO0FBQzFCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQSxLQUFDLENBQUMsVUFBVUosQ0FBVixFQUFhO0FBQ1hBLFVBQUVLLEVBQUYsQ0FBS0MsVUFBTCxHQUFrQixVQUFVQyxPQUFWLEVBQW1CO0FBQ2pDO0FBQ0EsZ0JBQUlDLFdBQVdSLEVBQUVTLE1BQUYsQ0FBUyxFQUFULEVBQWFULEVBQUVLLEVBQUYsQ0FBS0MsVUFBTCxDQUFnQkksUUFBN0IsRUFBdUNILE9BQXZDLENBQWY7O0FBRUEsbUJBQU8sS0FBS0ksSUFBTCxDQUFVLFlBQVk7QUFDekJYLGtCQUFFTSxVQUFGLENBQWEsSUFBYixFQUFtQkUsUUFBbkI7QUFDSCxhQUZNLENBQVA7QUFHSCxTQVBEOztBQVNBUixVQUFFTSxVQUFGLEdBQWUsVUFBVU0sR0FBVixFQUFlSixRQUFmLEVBQXlCO0FBQ3BDLGdC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c2Ugc3RyaWN0XCI7XG4oZnVuY3Rpb24ocm9vdCwgZmFjdG9yeSkge1xuICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuICB7XG4gICAgZGVmaW5lKFsnanF1ZXJ5J10sIGZ1bmN0aW9uKCQpIHtcbiAgICAgIHJldHVybiBmYWN0b3J5KCQpO1xuICAgIH0pO1xuICB9XG4gIGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJylcbiAge1xuICAgIHZhciAkID0gcmVxdWlyZSgnanF1ZXJ5Jyk7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCQpO1xuICB9XG4gIGVsc2UgXG4gIHtcbiAgICBmYWN0b3J5KHJvb3QuJCk7XG4gIH1cbn0gKHRoaXMsIGZ1bmN0aW9uKGpRdWVyeSkge1xuLypcbiAqIEEgdGltZSBwaWNrZXIgZm9yIGpRdWVyeVxuICpcbiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzLlxuICogQ29weXJpZ2h0IChjKSAyMDA5IEFuZGVycyBGYWplcnNvblxuICogQG5hbWUgICAgIHRpbWVQaWNrZXJcbiAqIEBhdXRob3IgICBBbmRlcnMgRmFqZXJzb24gKGh0dHA6Ly9wZXJpZmVyLnNlKVxuICogQGV4YW1wbGUgICQoXCIjbXl0aW1lXCIpLnRpbWVQaWNrZXIoKTtcbiAqIEBleGFtcGxlICAkKFwiI215dGltZVwiKS50aW1lUGlja2VyKHtzdGVwOjMwLCBzdGFydFRpbWU6XCIxNTowMFwiLCBlbmRUaW1lOlwiMTg6MDBcIn0pO1xuICpcbiAqIEJhc2VkIG9uIHRpbWVQaWNrZXIgYnkgU2FtIENvbGxldCAoaHR0cDovL3d3dy50ZXhvdGVsYS5jby51ay9jb2RlL2pxdWVyeS90aW1lcGlja2VyLylcbiAqXG4gKiBPcHRpb25zOlxuICogICBzdGVwOiAjIG9mIG1pbnV0ZXMgdG8gc3RlcCB0aGUgdGltZSBieVxuICogICBzdGFydFRpbWU6IGJlZ2lubmluZyBvZiB0aGUgcmFuZ2Ugb2YgYWNjZXB0YWJsZSB0aW1lc1xuICogICBlbmRUaW1lOiBlbmQgb2YgdGhlIHJhbmdlIG9mIGFjY2VwdGFibGUgdGltZXNcbiAqICAgc2VwYXJhdG9yOiBzZXBhcmF0b3Igc3RyaW5nIHRvIHVzZSBiZXR3ZWVuIGhvdXJzIGFuZCBtaW51dGVzIChlLmcuICc6JylcbiAqICAgc2hvdzI0SG91cnM6IHVzZSBhIDI0LWhvdXIgc2NoZW1lXG4gKi9cblxuOyhmdW5jdGlvbiAoJCkge1xuICAgICQuZm4udGltZVBpY2tlciA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICAgIC8vIEJ1aWxkIG1haW4gb3B0aW9ucyBiZWZvcmUgZWxlbWVudCBpdGVyYXRpb25cbiAgICAgICAgdmFyIHNldHRpbmdzID0gJC5leHRlbmQoe30sICQuZm4udGltZVBpY2tlci5kZWZhdWx0cywgb3B0aW9ucyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkLnRpbWVQaWNrZXIodGhpcywgc2V0dGluZ3MpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgJC50aW1lUGlja2VyID0gZnVuY3Rpb24gKGVsbSwgc2V0dGluZ3MpIHtcbiAgICAgICAgdmFyIGUgPSAkKGVsbSlbMF07XG4gICAgICAgIHJldHVybiBlLnRpbWVQaWNrZXIgfHwgKGUudGltZVBpY2tlciA9IG5ldyBqUXVlcnkuX3RpbWVQaWNrZXIoZSwgc2V0dGluZ3MpKTtcbiAgICB9O1xuXG4gICAgJC50aW1lUGlja2VyLnZlcnNpb24gPSAnMC4zJztcblxuICAgICQuX3RpbWVQaWNrZXIgPSBmdW5jdGlvbiAoZWxtLCBzZXR0aW5ncykge1xuXG4gICAgICAgIHZhciB0cE92ZXIgPSBmYWxzZTtcbiAgICAgICAgdmFyIGtleURvd24gPSBmYWxzZTtcbiAgICAgICAgdmFyIHN0YXJ0VGltZSA9IHRpbWVUb0RhdGUoc2V0dGluZ3Muc3RhcnRUaW1lLCBzZXR0aW5ncyk7XG4gICAgICAgIHZhciBlbmRUaW1lID0gdGltZVRvRGF0ZShzZXR0aW5ncy5lbmRUaW1lLCBzZXR0aW5ncyk7XG4gICAgICAgIHZhciBzZWxlY3RlZENsYXNzID0gXCJzZWxlY3RlZFwiO1xuICAgICAgICB2YXIgc2VsZWN0ZWRTZWxlY3RvciA9IFwibGkuXCIgKyBzZWxlY3RlZENsYXNzO1xuXG4gICAgICAgICQoZWxtKS5hdHRyKCdhdXRvY29tcGxldGUnLCAnT0ZGJyk7IC8vIERpc2FibGUgYnJvd3NlciBhdXRvY29tcGxldGVcblxuICAgICAgICB2YXIgdGltZXMgPSBbXTtcbiAgICAgICAgdmFyIHRpbWUgPSBuZXcgRGF0ZShzdGFydFRpbWUpOyAvLyBDcmVhdGUgYSBuZXcgZGF0ZSBvYmplY3QuXG4gICAgICAgIHdoaWxlICh0aW1lIDw9IGVuZFRpbWUpIHtcbiAgICAgICAgICAgIHRpbWVzW3RpbWVzLmxlbmd0aF0gPSBmb3JtYXRUaW1lKHRpbWUsIHNldHRpbmdzKTtcbiAgICAgICAgICAgIHRpbWUgPSBuZXcgRGF0ZSh0aW1lLnNldE1pbnV0ZXModGltZS5nZXRNaW51dGVzKCkgKyBzZXR0aW5ncy5zdGVwKSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgJHRwRGl2ID0gJCgnPGRpdiBjbGFzcz1cInRpbWUtcGlja2VyJyArIChzZXR0aW5ncy5zaG93MjRIb3VycyA/ICcnIDogJyB0aW1lLXBpY2tlci0xMmhvdXJzJykgKyAnXCI+PC9kaXY+Jyk7XG4gICAgICAgIHZhciAkdHBMaXN0ID0gJCgnPHVsPjwvdWw+Jyk7XG5cbiAgICAgICAgLy8gQnVpbGQgdGhlIGxpc3QuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGltZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICR0cExpc3QuYXBwZW5kKFwiPGxpPlwiICsgdGltZXNbaV0gKyBcIjwvbGk+XCIpO1xuICAgICAgICB9XG4gICAgICAgICR0cERpdi5hcHBlbmQoJHRwTGlzdCk7XG4gICAgICAgIC8vIEFwcGVuZCB0aGUgdGltUGlja2VyIHRvIHRoZSBib2R5IGFuZCBwb3NpdGlvbiBpdC5cbiAgICAgICAgJHRwRGl2LmFwcGVuZFRvKCdib2R5JykuaGlkZSgpO1xuXG4gICAgICAgIC8vIFN0b3JlIHRoZSBtb3VzZSBzdGF0ZSwgdXNlZCBieSB0aGUgYmx1ciBldmVudC4gVXNlIG1vdXNlb3ZlciBpbnN0ZWFkIG9mXG4gICAgICAgIC8vIG1vdXNlZG93biBzaW5jZSBPcGVyYSBmaXJlcyBibHVyIGJlZm9yZSBtb3VzZWRvd24uXG4gICAgICAgICR0cERpdi5tb3VzZW92ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdHBPdmVyID0gdHJ1ZTtcbiAgICAgICAgfSkubW91c2VvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdHBPdmVyID0gZmFsc2U7XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQoXCJsaVwiLCAkdHBMaXN0KS5tb3VzZW92ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFrZXlEb3duKSB7XG4gICAgICAgICAgICAgICAgJChzZWxlY3RlZFNlbGVjdG9yLCAkdHBEaXYpLnJlbW92ZUNsYXNzKHNlbGVjdGVkQ2xhc3MpO1xuICAgICAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3Moc2VsZWN0ZWRDbGFzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLm1vdXNlZG93bihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0cE92ZXIgPSB0cnVlO1xuICAgICAgICB9KS5jbGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZXRUaW1lVmFsKGVsbSwgdGhpcywgJHRwRGl2LCBzZXR0aW5ncyk7XG4gICAgICAgICAgICB0cE92ZXIgPSBmYWxzZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdmFyIHNob3dQaWNrZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoJHRwRGl2LmlzKFwiOnZpc2libGVcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAkKFwibGlcIiwgJHRwRGl2KS5yZW1vdmVDbGFzcyhzZWxlY3RlZENsYXNzKTtcblxuICAgICAgICAgICAgLy8gUG9zaXRpb25cbiAgICAgICAgICAgIHZhciBlbG1PZmZzZXQgPSAkKGVsbSkub2Zmc2V0KCk7XG4gICAgICAgICAgICAkdHBEaXYuY3NzKHsgJ3RvcCc6IGVsbU9mZnNldC50b3AgKyBlbG0ub2Zmc2V0SGVpZ2h0LCAnbGVmdCc6IGVsbU9mZnNldC5sZWZ0IH0pO1xuXG4gICAgICAgICAgICAvLyBTaG93IHBpY2tlci4gVGhpcyBoYXMgdG8gYmUgZG9uZSBiZWZvcmUgc2Nyb2xsVG9wIGlzIHNldCBzaW5jZSB0aGF0XG4gICAgICAgICAgICAvLyBjYW4ndCBiZSBkb25lIG9uIGhpZGRlbiBlbGVtZW50cy5cbiAgICAgICAgICAgICR0cERpdi5zaG93KCk7XG5cbiAgICAgICAgICAgIC8vIFRyeSB0byBmaW5kIGEgdGltZSBpbiB0aGUgbGlzdCB0aGF0IG1hdGNoZXMgdGhlIGVudGVyZWQgdGltZS5cbiAgICAgICAgICAgIHZhciB0aW1lID0gZWxtLnZhbHVlID8gdGltZVN0cmluZ1RvRGF0ZShlbG0udmFsdWUsIHNldHRpbmdzKSA6IHN0YXJ0VGltZTtcbiAgICAgICAgICAgIHZhciBzdGFydE1pbiA9IHN0YXJ0VGltZS5nZXRIb3VycygpICogNjAgKyBzdGFydFRpbWUuZ2V0TWludXRlcygpO1xuICAgICAgICAgICAgdmFyIG1pbiA9ICh0aW1lLmdldEhvdXJzKCkgKiA2MCArIHRpbWUuZ2V0TWludXRlcygpKSAtIHN0YXJ0TWluO1xuICAgICAgICAgICAgdmFyIHN0ZXBzID0gTWF0aC5yb3VuZChtaW4gLyBzZXR0aW5ncy5zdGVwKTtcbiAgICAgICAgICAgIHZhciByb3VuZFRpbWUgPSBub3JtYWxpc2VUaW1lKG5ldyBEYXRlKDAsIDAsIDAsIDAsIChzdGVwcyAqIHNldHRpbmdzLnN0ZXAgKyBzdGFydE1pbiksIDApKTtcbiAgICAgICAgICAgIHJvdW5kVGltZSA9IChzdGFydFRpbWUgPCByb3VuZFRpbWUgJiYgcm91bmRUaW1lIDw9IGVuZFRpbWUpID8gcm91bmRUaW1lIDogc3RhcnRUaW1lO1xuICAgICAgICAgICAgdmFyICRtYXRjaGVkVGltZSA9ICQoXCJsaTpjb250YWlucyhcIiArIGZvcm1hdFRpbWUocm91bmRUaW1lLCBzZXR0aW5ncykgKyBcIilcIiwgJHRwRGl2KTtcblxuICAgICAgICAgICAgaWYgKCRtYXRjaGVkVGltZS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAkbWF0Y2hlZFRpbWUuYWRkQ2xhc3Moc2VsZWN0ZWRDbGFzcyk7XG4gICAgICAgICAgICAgICAgLy8gU2Nyb2xsIHRvIG1hdGNoZWQgdGltZS5cbiAgICAgICAgICAgICAgICAkdHBEaXZbMF0uc2Nyb2xsVG9wID0gJG1hdGNoZWRUaW1lWzBdLm9mZnNldFRvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9O1xuICAgICAgICAvLyBBdHRhY2ggdG8gY2xpY2sgYXMgd2VsbCBhcyBmb2N1cyBzbyB0aW1lUGlja2VyIGNhbiBiZSBzaG93biBhZ2FpbiB3aGVuXG4gICAgICAgIC8vIGNsaWNraW5nIG9uIHRoZSBpbnB1dCB3aGVuIGl0IGFscmVhZHkgaGFzIGZvY3VzLlxuICAgICAgICAkKGVsbSkuZm9jdXMoc2hvd1BpY2tlcikuY2xpY2soc2hvd1BpY2tlcik7XG4gICAgICAgIC8vIEhpZGUgdGltZXBpY2tlciBvbiBibHVyXG4gICAgICAgICQoZWxtKS5ibHVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghdHBPdmVyKSB7XG4gICAgICAgICAgICAgICAgJHRwRGl2LmhpZGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEtleXByZXNzIGRvZXNuJ3QgcmVwZWF0IG9uIFNhZmFyaSBmb3Igbm9uLXRleHQga2V5cy5cbiAgICAgICAgLy8gS2V5ZG93biBkb2Vzbid0IHJlcGVhdCBvbiBGaXJlZm94IGFuZCBPcGVyYSBvbiBNYWMuXG4gICAgICAgIC8vIFVzaW5nIGtlcHJlc3MgZm9yIE9wZXJhIGFuZCBGaXJlZm94IGFuZCBrZXlkb3duIGZvciB0aGUgcmVzdCBzZWVtcyB0b1xuICAgICAgICAvLyB3b3JrIHdpdGggdXAvZG93bi9lbnRlci9lc2MuXG4gICAgICAgIHZhciBldmVudCA9IChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoXCJvcGVyYVwiKSA+PSAwIHx8IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZihcIm1vemlsbGFcIikgPj0gMCkgPyAna2V5cHJlc3MnIDogJ2tleWRvd24nO1xuICAgICAgICAkKGVsbSlbZXZlbnRdKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICB2YXIgJHNlbGVjdGVkO1xuICAgICAgICAgICAga2V5RG93biA9IHRydWU7XG4gICAgICAgICAgICB2YXIgdG9wID0gJHRwRGl2WzBdLnNjcm9sbFRvcDtcbiAgICAgICAgICAgIHN3aXRjaCAoZS5rZXlDb2RlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAzODogLy8gVXAgYXJyb3cuXG4gICAgICAgICAgICAgICAgICAgIC8vIEp1c3Qgc2hvdyBwaWNrZXIgaWYgaXQncyBoaWRkZW4uXG4gICAgICAgICAgICAgICAgICAgIGlmIChzaG93UGlja2VyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgJHNlbGVjdGVkID0gJChzZWxlY3RlZFNlbGVjdG9yLCAkdHBMaXN0KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByZXYgPSAkc2VsZWN0ZWQucHJldigpLmFkZENsYXNzKHNlbGVjdGVkQ2xhc3MpWzBdO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJldikge1xuICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGVjdGVkLnJlbW92ZUNsYXNzKHNlbGVjdGVkQ2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2Nyb2xsIGl0ZW0gaW50byB2aWV3LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYub2Zmc2V0VG9wIDwgdG9wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRwRGl2WzBdLnNjcm9sbFRvcCA9IHRvcCAtIHByZXYub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9vcCB0byBuZXh0IGl0ZW0uXG4gICAgICAgICAgICAgICAgICAgICAgICAkc2VsZWN0ZWQucmVtb3ZlQ2xhc3Moc2VsZWN0ZWRDbGFzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2ID0gJChcImxpOmxhc3RcIiwgJHRwTGlzdCkuYWRkQ2xhc3Moc2VsZWN0ZWRDbGFzcylbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAkdHBEaXZbMF0uc2Nyb2xsVG9wID0gcHJldi5vZmZzZXRUb3AgLSBwcmV2Lm9mZnNldEhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDA6IC8vIERvd24gYXJyb3csIHNpbWlsYXIgaW4gYmVoYXZpb3VyIHRvIHVwIGFycm93LlxuICAgICAgICAgICAgICAgICAgICBpZiAoc2hvd1BpY2tlcigpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICRzZWxlY3RlZCA9ICQoc2VsZWN0ZWRTZWxlY3RvciwgJHRwTGlzdCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gJHNlbGVjdGVkLm5leHQoKS5hZGRDbGFzcyhzZWxlY3RlZENsYXNzKVswXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICRzZWxlY3RlZC5yZW1vdmVDbGFzcyhzZWxlY3RlZENsYXNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Lm9mZnNldFRvcCArIG5leHQub2Zmc2V0SGVpZ2h0ID4gdG9wICsgJHRwRGl2WzBdLm9mZnNldEhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0cERpdlswXS5zY3JvbGxUb3AgPSB0b3AgKyBuZXh0Lm9mZnNldEhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICRzZWxlY3RlZC5yZW1vdmVDbGFzcyhzZWxlY3RlZENsYXNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSAkKFwibGk6Zmlyc3RcIiwgJHRwTGlzdCkuYWRkQ2xhc3Moc2VsZWN0ZWRDbGFzcylbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAkdHBEaXZbMF0uc2Nyb2xsVG9wID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTM6IC8vIEVudGVyXG4gICAgICAgICAgICAgICAgICAgIGlmICgkdHBEaXYuaXMoXCI6dmlzaWJsZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbCA9ICQoc2VsZWN0ZWRTZWxlY3RvciwgJHRwTGlzdClbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lVmFsKGVsbSwgc2VsLCAkdHBEaXYsIHNldHRpbmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjc6IC8vIEVzY1xuICAgICAgICAgICAgICAgICAgICAkdHBEaXYuaGlkZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICAkKGVsbSkua2V5dXAoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGtleURvd24gPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgYW4gaW5wdXRzIGN1cnJlbnQgdGltZSBhcyBEYXRlIG9iamVjdC5cbiAgICAgICAgLy8gUmV0dXJucyBhIERhdGUgb2JqZWN0LlxuICAgICAgICB0aGlzLmdldFRpbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGltZVN0cmluZ1RvRGF0ZShlbG0udmFsdWUsIHNldHRpbmdzKTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHNldCBhIHRpbWUgaW5wdXQuXG4gICAgICAgIC8vIFRha2VzIGEgRGF0ZSBvYmplY3Qgb3Igc3RyaW5nLlxuICAgICAgICB0aGlzLnNldFRpbWUgPSBmdW5jdGlvbiAodGltZSkge1xuICAgICAgICAgICAgZWxtLnZhbHVlID0gZm9ybWF0VGltZSh0aW1lVG9EYXRlKHRpbWUsIHNldHRpbmdzKSwgc2V0dGluZ3MpO1xuICAgICAgICAgICAgLy8gVHJpZ2dlciBlbGVtZW50J3MgY2hhbmdlIGV2ZW50cy5cbiAgICAgICAgICAgICQoZWxtKS5jaGFuZ2UoKTtcbiAgICAgICAgfTtcblxuICAgIH07IC8vIEVuZCBmbjtcblxuICAgIC8vIFBsdWdpbiBkZWZhdWx0cy5cbiAgICAkLmZuLnRpbWVQaWNrZXIuZGVmYXVsdHMgPSB7XG4gICAgICAgIHN0ZXA6IDMwLFxuICAgICAgICBzdGFydFRpbWU6IG5ldyBEYXRlKDAsIDAsIDAsIDAsIDAsIDApLFxuICAgICAgICBlbmRUaW1lOiBuZXcgRGF0ZSgwLCAwLCAwLCAyMywgMzAsIDApLFxuICAgICAgICBzZXBhcmF0b3I6ICc6JyxcbiAgICAgICAgc2hvdzI0SG91cnM6IHRydWVcbiAgICB9O1xuXG4gICAgLy8gUHJpdmF0ZSBmdW5jdGlvbnMuXG5cbiAgICBmdW5jdGlvbiBzZXRUaW1lVmFsKGVsbSwgc2VsLCAkdHBEaXYsIHNldHRpbmdzKSB7XG4gICAgICAgIC8vIFVwZGF0ZSBpbnB1dCBmaWVsZFxuICAgICAgICBlbG0udmFsdWUgPSAkKHNlbCkudGV4dCgpO1xuICAgICAgICAvLyBUcmlnZ2VyIGVsZW1lbnQncyBjaGFuZ2UgZXZlbnRzLlxuICAgICAgICAkKGVsbSkuY2hhbmdlKCk7XG4gICAgICAgIC8vIEhpZGUgcGlja2VyXG4gICAgICAgICR0cERpdi5oaWRlKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZm9ybWF0VGltZSh0aW1lLCBzZXR0aW5ncykge1xuICAgICAgICB2YXIgaCA9IHRpbWUuZ2V0SG91cnMoKTtcbiAgICAgICAgdmFyIGhvdXJzID0gc2V0dGluZ3Muc2hvdzI0SG91cnMgPyBoIDogKCgoaCArIDExKSAlIDEyKSArIDEpO1xuICAgICAgICB2YXIgbWludXRlcyA9IHRpbWUuZ2V0TWludXRlcygpO1xuICAgICAgICByZXR1cm4gKHNldHRpbmdzLnNob3cyNEhvdXJzID8gZm9ybWF0TnVtYmVyKGhvdXJzKSA6IGhvdXJzKSArIHNldHRpbmdzLnNlcGFyYXRvciArIGZvcm1hdE51bWJlcihtaW51dGVzKSArIChzZXR0aW5ncy5zaG93MjRIb3VycyA/ICcnIDogKChoIDwgMTIpID8gJyBBTScgOiAnIFBNJykpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZvcm1hdE51bWJlcih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gKHZhbHVlIDwgMTAgPyAnMCcgOiAnJykgKyB2YWx1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0aW1lVG9EYXRlKGlucHV0LCBzZXR0aW5ncykge1xuICAgICAgICByZXR1cm4gKHR5cGVvZiBpbnB1dCA9PSAnb2JqZWN0JykgPyBub3JtYWxpc2VUaW1lKGlucHV0KSA6IHRpbWVTdHJpbmdUb0RhdGUoaW5wdXQsIHNldHRpbmdzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0aW1lU3RyaW5nVG9EYXRlKGlucHV0LCBzZXR0aW5ncykge1xuICAgICAgICBpZiAoaW5wdXQpIHtcbiAgICAgICAgICAgIHZhciBhcnJheSA9IGlucHV0LnNwbGl0KHNldHRpbmdzLnNlcGFyYXRvcik7XG4gICAgICAgICAgICB2YXIgaG91cnMgPSBwYXJzZUZsb2F0KGFycmF5WzBdKTtcbiAgICAgICAgICAgIHZhciBtaW51dGVzID0gcGFyc2VGbG9hdChhcnJheVsxXSk7XG5cbiAgICAgICAgICAgIC8vIENvbnZlcnQgQU0vUE0gaG91ciB0byAyNC1ob3VyIGZvcm1hdC5cbiAgICAgICAgICAgIGlmICghc2V0dGluZ3Muc2hvdzI0SG91cnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoaG91cnMgPT09IDEyICYmIGlucHV0LmluZGV4T2YoJ0FNJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvdXJzID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaG91cnMgIT09IDEyICYmIGlucHV0LmluZGV4T2YoJ1BNJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvdXJzICs9IDEyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB0aW1lID0gbmV3IERhdGUoMCwgMCwgMCwgaG91cnMsIG1pbnV0ZXMsIDApO1xuICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGlzZVRpbWUodGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyogTm9ybWFsaXNlIHRpbWUgb2JqZWN0IHRvIGEgY29tbW9uIGRhdGUuICovXG4gICAgZnVuY3Rpb24gbm9ybWFsaXNlVGltZSh0aW1lKSB7XG4gICAgICAgIHRpbWUuc2V0RnVsbFllYXIoMjAwMSk7XG4gICAgICAgIHRpbWUuc2V0TW9udGgoMCk7XG4gICAgICAgIHRpbWUuc2V0RGF0ZSgwKTtcbiAgICAgICAgcmV0dXJuIHRpbWU7XG4gICAgfVxuXG59KShqUXVlcnkpO1xuXG59KSk7Il19",
    "\"use strict\";\n/* Copyright 2012 Mozilla Foundation\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.moveToEndOfArray = exports.waitOnEventOrTimeout = exports.WaitOnType = exports.animationStarted = exports.normalizeWheelEventDelta = exports.binarySearchFirstItem = exports.watchScroll = exports.scrollIntoView = exports.getOutputScale = exports.approximateFraction = exports.getPageSizeInches = exports.roundToDivide = exports.getVisibleElements = exports.backtrackBeforeAllVisibleElements = exports.parseQueryString = exports.noContextMenuHandler = exports.getPDFFileNameFromURL = exports.ProgressBar = exports.clamp = exports.getGlobalEventBus = exports.EventBus = exports.NullL10n = exports.SpreadMode = exports.ScrollMode = exports.TextLayerMode = exports.RendererType = exports.PresentationModeState = exports.isPortraitOrientation = exports.isValidSpreadMode = exports.isValidScrollMode = exports.isValidRotation = exports.VERTICAL_PADDING = exports.SCROLLBAR_PADDING = exports.MAX_AUTO_SCALE = exports.UNKNOWN_SCALE = exports.MAX_SCALE = exports.MIN_SCALE = exports.DEFAULT_SCALE = exports.DEFAULT_SCALE_VALUE = exports.CSS_UNITS = exports.AutoPrintRegExp = undefined;\n\nvar _regenerator = require(\"babel-runtime/regenerator\");\n\nvar _regenerator2 = _interopRequireDefault(_regenerator);\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\nvar CSS_UNITS = 96.0 / 72.0;\nvar DEFAULT_SCALE_VALUE = \"auto\";\nvar DEFAULT_SCALE = 1.0;\nvar MIN_SCALE = 0.1;\nvar MAX_SCALE = 10.0;\nvar UNKNOWN_SCALE = 0;\nvar MAX_AUTO_SCALE = 1.25;\nvar SCROLLBAR_PADDING = 40;\nvar VERTICAL_PADDING = 5;\n\nvar PresentationModeState = {\n  UNKNOWN: 0,\n  NORMAL: 1,\n  CHANGING: 2,\n  FULLSCREEN: 3\n};\n\nvar RendererType = {\n  CANVAS: \"canvas\",\n  SVG: \"svg\"\n};\n\nvar TextLayerMode = {\n  DISABLE: 0,\n  ENABLE: 1,\n  ENABLE_ENHANCE: 2\n};\n\nvar ScrollMode = {\n  UNKNOWN: -1,\n  VERTICAL: 0, // Default value.\n  HORIZONTAL: 1,\n  WRAPPED: 2\n};\n\nvar SpreadMode = {\n  UNKNOWN: -1,\n  NONE: 0, // Default value.\n  ODD: 1,\n  EVEN: 2\n};\n\n// Used by `PDFViewerApplication`, and by the API unit-tests.\nvar AutoPrintRegExp = /\\bprint\\s*\\(/;\n\n// Replaces {{arguments}} with their values.\nfunction formatL10nValue(text, args) {\n  if (!args) {\n    return text;\n  }\n  return text.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, function (all, name) {\n    return name in args ? args[name] : \"{{\" + name + \"}}\";\n  });\n}\n\n/**\n * No-op implementation of the localization service.\n * @implements {IL10n}\n */\nvar NullL10n = {\n  getLanguage: function () {\n    var _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee() {\n      return _regenerator2.default.wrap(function _callee$(_context) {\n        while (1) {\n          switch (_context.prev = _context.next) {\n            case 0:\n              return _context.abrupt(\"return\", \"en-us\");\n\n            case 1:\n            case \"end\":\n              return _context.stop();\n          }\n        }\n      }, _callee, this);\n    }));\n\n    function getLanguage() {\n      return _ref.apply(this, arguments);\n    }\n\n    return getLanguage;\n  }(),\n  getDirection: function () {\n    var _ref2 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee2() {\n      return _regenerator2.default.wrap(function _callee2$(_context2) {\n        while (1) {\n          switch (_context2.prev = _context2.next) {\n            case 0:\n              return _context2.abrupt(\"return\", \"ltr\");\n\n            case 1:\n            case \"end\":\n              return _context2.stop();\n          }\n        }\n      }, _callee2, this);\n    }));\n\n    function getDirection() {\n      return _ref2.apply(this, arguments);\n    }\n\n    return getDirection;\n  }(),\n  get: function () {\n    var _ref3 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee3(property, args, fallback) {\n      return _regenerator2.default.wrap(function _callee3$(_context3) {\n        while (1) {\n          switch (_context3.prev = _context3.next) {\n            case 0:\n              return _context3.abrupt(\"return\", formatL10nValue(fallback, args));\n\n            case 1:\n            case \"end\":\n              return _context3.stop();\n          }\n        }\n      }, _callee3, this);\n    }));\n\n    function get(_x, _x2, _x3) {\n      return _ref3.apply(this, arguments);\n    }\n\n    return get;\n  }(),\n  translate: function () {\n    var _ref4 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee4(element) {\n      return _regenerator2.default.wrap(function _callee4$(_context4) {\n        while (1) {\n          switch (_context4.prev = _context4.next) {\n            case 0:\n            case \"end\":\n              return _context4.stop();\n          }\n        }\n      }, _callee4, this);\n    }));\n\n    function translate(_x4) {\n      return _ref4.apply(this, arguments);\n    }\n\n    return translate;\n  }()\n};\n\n/**\n * Returns scale factor for the canvas. It makes sense for the HiDPI displays.\n * @returns {Object} The object with horizontal (sx) and vertical (sy)\n *                   scales. The scaled property is set to false if scaling is\n *                   not required, true otherwise.\n */\nfunction getOutputScale(ctx) {\n  var devicePixelRatio = window.devicePixelRatio || 1;\n  var backingStoreRatio = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1;\n  var pixelRatio = devicePixelRatio / backingStoreRatio;\n  return {\n    sx: pixelRatio,\n    sy: pixelRatio,\n    scaled: pixelRatio !== 1\n  };\n}\n\n/**\n * Scrolls specified element into view of its parent.\n * @param {Object} element - The element to be visible.\n * @param {Object} spot - An object with optional top and left properties,\n *   specifying the offset from the top left edge.\n * @param {boolean} skipOverflowHiddenElements - Ignore elements that have\n *   the CSS rule `overflow: hidden;` set. The default is false.\n */\nfunction scrollIntoView(element, spot) {\n  var skipOverflowHiddenElements = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n  // Assuming offsetParent is available (it's not available when viewer is in\n  // hidden iframe or object). We have to scroll: if the offsetParent is not set\n  // producing the error. See also animationStarted.\n  var parent = element.offsetParent;\n  if (!parent) {\n    console.error(\"offsetParent is not set -- cannot scroll\");\n    return;\n  }\n  var offsetY = element.offsetTop + element.clientTop;\n  var offsetX = element.offsetLeft + element.clientLeft;\n  while (parent.clientHeight === parent.scrollHeight && parent.clientWidth === parent.scrollWidth || skipOverflowHiddenElements && getComputedStyle(parent).overflow === \"hidden\") {\n    if (parent.dataset._scaleY) {\n      offsetY /= parent.dataset._scaleY;\n      offsetX /= parent.dataset._scaleX;\n    }\n    offsetY += parent.offsetTop;\n    offsetX += parent.offsetLeft;\n    parent = parent.offsetParent;\n    if (!parent) {\n      return; // no need to scroll\n    }\n  }\n  if (spot) {\n    if (spot.top !== undefined) {\n      offsetY += spot.top;\n    }\n    if (spot.left !== undefined) {\n      offsetX += spot.left;\n      parent.scrollLeft = offsetX;\n    }\n  }\n  parent.scrollTop = offsetY;\n}\n\n/**\n * Helper function to start monitoring the scroll event and converting them into\n * PDF.js friendly one: with scroll debounce and scroll direction.\n */\nfunction watchScroll(viewAreaElement, callback) {\n  var debounceScroll = function debounceScroll(evt) {\n    if (rAF) {\n      return;\n    }\n    // schedule an invocation of scroll for next animation frame.\n    rAF = window.requestAnimationFrame(function viewAreaElementScrolled() {\n      rAF = null;\n\n      var currentX = viewAreaElement.scrollLeft;\n      var lastX = state.lastX;\n      if (currentX !== lastX) {\n        state.right = currentX > lastX;\n      }\n      state.lastX = currentX;\n      var currentY = viewAreaElement.scrollTop;\n      var lastY = state.lastY;\n      if (currentY !== lastY) {\n        state.down = currentY > lastY;\n      }\n      state.lastY = currentY;\n      callback(state);\n    });\n  };\n\n  var state = {\n    right: true,\n    down: true,\n    lastX: viewAreaElement.scrollLeft,\n    lastY: viewAreaElement.scrollTop,\n    _eventHandler: debounceScroll\n  };\n\n  var rAF = null;\n  viewAreaElement.addEventListener(\"scroll\", debounceScroll, true);\n  return state;\n}\n\n/**\n * Helper function to parse query string (e.g. ?param1=value&parm2=...).\n */\nfunction parseQueryString(query) {\n  var parts = query.split(\"&\");\n  var params = Object.create(null);\n  for (var i = 0, ii = parts.length; i < ii; ++i) {\n    var param = parts[i].split(\"=\");\n    var key = param[0].toLowerCase();\n    var value = param.length > 1 ? param[1] : null;\n    params[decodeURIComponent(key)] = decodeURIComponent(value);\n  }\n  return params;\n}\n\n/**\n * Use binary search to find the index of the first item in a given array which\n * passes a given condition. The items are expected to be sorted in the sense\n * that if the condition is true for one item in the array, then it is also true\n * for all following items.\n *\n * @returns {number} Index of the first array element to pass the test,\n *                   or |items.length| if no such element exists.\n */\nfunction binarySearchFirstItem(items, condition) {\n  var minIndex = 0;\n  var maxIndex = items.length - 1;\n\n  if (items.length === 0 || !condition(items[maxIndex])) {\n    return items.length;\n  }\n  if (condition(items[minIndex])) {\n    return minIndex;\n  }\n\n  while (minIndex < maxIndex) {\n    var currentIndex = minIndex + maxIndex >> 1;\n    var currentItem = items[currentIndex];\n    if (condition(currentItem)) {\n      maxIndex = currentIndex;\n    } else {\n      minIndex = currentIndex + 1;\n    }\n  }\n  return minIndex; /* === maxIndex */\n}\n\n/**\n *  Approximates float number as a fraction using Farey sequence (max order\n *  of 8).\n *  @param {number} x - Positive float number.\n *  @returns {Array} Estimated fraction: the first array item is a numerator,\n *                   the second one is a denominator.\n */\nfunction approximateFraction(x) {\n  // Fast paths for int numbers or their inversions.\n  if (Math.floor(x) === x) {\n    return [x, 1];\n  }\n  var xinv = 1 / x;\n  var limit = 8;\n  if (xinv > limit) {\n    return [1, limit];\n  } else if (Math.floor(xinv) === xinv) {\n    return [1, xinv];\n  }\n\n  var x_ = x > 1 ? xinv : x;\n  // a/b and c/d are neighbours in Farey sequence.\n  var a = 0,\n      b = 1,\n      c = 1,\n      d = 1;\n  // Limiting search to order 8.\n  while (true) {\n    // Generating next term in sequence (order of q).\n    var p = a + c,\n        q = b + d;\n    if (q > limit) {\n      break;\n    }\n    if (x_ <= p / q) {\n      c = p;\n      d = q;\n    } else {\n      a = p;\n      b = q;\n    }\n  }\n  var result = void 0;\n  // Select closest of the neighbours to x.\n  if (x_ - a / b < c / d - x_) {\n    result = x_ === x ? [a, b] : [b, a];\n  } else {\n    result = x_ === x ? [c, d] : [d, c];\n  }\n  return result;\n}\n\nfunction roundToDivide(x, div) {\n  var r = x % div;\n  return r === 0 ? x : Math.round(x - r + div);\n}\n\n/**\n * Gets the size of the specified page, converted from PDF units to inches.\n * @param {Object} An Object containing the properties: {Array} `view`,\n *   {number} `userUnit`, and {number} `rotate`.\n * @returns {Object} An Object containing the properties: {number} `width`\n *   and {number} `height`, given in inches.\n */\nfunction getPageSizeInches(_ref5) {\n  var view = _ref5.view,\n      userUnit = _ref5.userUnit,\n      rotate = _ref5.rotate;\n\n  var _view = _slicedToArray(view, 4),\n      x1 = _view[0],\n      y1 = _view[1],\n      x2 = _view[2],\n      y2 = _view[3];\n  // We need to take the page rotation into account as well.\n\n\n  var changeOrientation = rotate % 180 !== 0;\n\n  var width = (x2 - x1) / 72 * userUnit;\n  var height = (y2 - y1) / 72 * userUnit;\n\n  return {\n    width: changeOrientation ? height : width,\n    height: changeOrientation ? width : height\n  };\n}\n\n/**\n * Helper function for getVisibleElements.\n *\n * @param {number} index - initial guess at the first visible element\n * @param {Array} views - array of pages, into which `index` is an index\n * @param {number} top - the top of the scroll pane\n * @returns {number} less than or equal to `index` that is definitely at or\n *   before the first visible element in `views`, but not by too much. (Usually,\n *   this will be the first element in the first partially visible row in\n *   `views`, although sometimes it goes back one row further.)\n */\nfunction backtrackBeforeAllVisibleElements(index, views, top) {\n  // binarySearchFirstItem's assumption is that the input is ordered, with only\n  // one index where the conditions flips from false to true: [false ...,\n  // true...]. With vertical scrolling and spreads, it is possible to have\n  // [false ..., true, false, true ...]. With wrapped scrolling we can have a\n  // similar sequence, with many more mixed true and false in the middle.\n  //\n  // So there is no guarantee that the binary search yields the index of the\n  // first visible element. It could have been any of the other visible elements\n  // that were preceded by a hidden element.\n\n  // Of course, if either this element or the previous (hidden) element is also\n  // the first element, there's nothing to worry about.\n  if (index < 2) {\n    return index;\n  }\n\n  // That aside, the possible cases are represented below.\n  //\n  //     ****  = fully hidden\n  //     A*B*  = mix of partially visible and/or hidden pages\n  //     CDEF  = fully visible\n  //\n  // (1) Binary search could have returned A, in which case we can stop.\n  // (2) Binary search could also have returned B, in which case we need to\n  // check the whole row.\n  // (3) Binary search could also have returned C, in which case we need to\n  // check the whole previous row.\n  //\n  // There's one other possibility:\n  //\n  //     ****  = fully hidden\n  //     ABCD  = mix of fully and/or partially visible pages\n  //\n  // (4) Binary search could only have returned A.\n\n  // Initially assume that we need to find the beginning of the current row\n  // (case 1, 2, or 4), which means finding a page that is above the current\n  // page's top. If the found page is partially visible, we're definitely not in\n  // case 3, and this assumption is correct.\n  var elt = views[index].div;\n  var pageTop = elt.offsetTop + elt.clientTop;\n\n  if (pageTop >= top) {\n    // The found page is fully visible, so we're actually either in case 3 or 4,\n    // and unfortunately we can't tell the difference between them without\n    // scanning the entire previous row, so we just conservatively assume that\n    // we do need to backtrack to that row. In both cases, the previous page is\n    // in the previous row, so use its top instead.\n    elt = views[index - 1].div;\n    pageTop = elt.offsetTop + elt.clientTop;\n  }\n\n  // Now we backtrack to the first page that still has its bottom below\n  // `pageTop`, which is the top of a page in the first visible row (unless\n  // we're in case 4, in which case it's the row before that).\n  // `index` is found by binary search, so the page at `index - 1` is\n  // invisible and we can start looking for potentially visible pages from\n  // `index - 2`. (However, if this loop terminates on its first iteration,\n  // which is the case when pages are stacked vertically, `index` should remain\n  // unchanged, so we use a distinct loop variable.)\n  for (var i = index - 2; i >= 0; --i) {\n    elt = views[i].div;\n    if (elt.offsetTop + elt.clientTop + elt.clientHeight <= pageTop) {\n      // We have reached the previous row, so stop now.\n      // This loop is expected to terminate relatively quickly because the\n      // number of pages per row is expected to be small.\n      break;\n    }\n    index = i;\n  }\n  return index;\n}\n\n/**\n * Generic helper to find out what elements are visible within a scroll pane.\n *\n * Well, pretty generic. There are some assumptions placed on the elements\n * referenced by `views`:\n *   - If `horizontal`, no left of any earlier element is to the right of the\n *     left of any later element.\n *   - Otherwise, `views` can be split into contiguous rows where, within a row,\n *     no top of any element is below the bottom of any other element, and\n *     between rows, no bottom of any element in an earlier row is below the\n *     top of any element in a later row.\n *\n * (Here, top, left, etc. all refer to the padding edge of the element in\n * question. For pages, that ends up being equivalent to the bounding box of the\n * rendering canvas. Earlier and later refer to index in `views`, not page\n * layout.)\n *\n * @param scrollEl {HTMLElement} - a container that can possibly scroll\n * @param views {Array} - objects with a `div` property that contains an\n *   HTMLElement, which should all be descendents of `scrollEl` satisfying the\n *   above layout assumptions\n * @param sortByVisibility {boolean} - if true, the returned elements are sorted\n *   in descending order of the percent of their padding box that is visible\n * @param horizontal {boolean} - if true, the elements are assumed to be laid\n *   out horizontally instead of vertically\n * @returns {Object} `{ first, last, views: [{ id, x, y, view, percent }] }`\n */\nfunction getVisibleElements(scrollEl, views) {\n  var sortByVisibility = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n  var horizontal = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n  var top = scrollEl.scrollTop,\n      bottom = top + scrollEl.clientHeight;\n  var left = scrollEl.scrollLeft,\n      right = left + scrollEl.clientWidth;\n\n  // Throughout this \"generic\" function, comments will assume we're working with\n  // PDF document pages, which is the most important and complex case. In this\n  // case, the visible elements we're actually interested is the page canvas,\n  // which is contained in a wrapper which adds no padding/border/margin, which\n  // is itself contained in `view.div` which adds no padding (but does add a\n  // border). So, as specified in this function's doc comment, this function\n  // does all of its work on the padding edge of the provided views, starting at\n  // offsetLeft/Top (which includes margin) and adding clientLeft/Top (which is\n  // the border). Adding clientWidth/Height gets us the bottom-right corner of\n  // the padding edge.\n  function isElementBottomAfterViewTop(view) {\n    var element = view.div;\n    var elementBottom = element.offsetTop + element.clientTop + element.clientHeight;\n    return elementBottom > top;\n  }\n  function isElementRightAfterViewLeft(view) {\n    var element = view.div;\n    var elementRight = element.offsetLeft + element.clientLeft + element.clientWidth;\n    return elementRight > left;\n  }\n\n  var visible = [],\n      numViews = views.length;\n  var firstVisibleElementInd = numViews === 0 ? 0 : binarySearchFirstItem(views, horizontal ? isElementRightAfterViewLeft : isElementBottomAfterViewTop);\n\n  // Please note the return value of the `binarySearchFirstItem` function when\n  // no valid element is found (hence the `firstVisibleElementInd` check below).\n  if (firstVisibleElementInd > 0 && firstVisibleElementInd < numViews && !horizontal) {\n    // In wrapped scrolling (or vertical scrolling with spreads), with some page\n    // sizes, isElementBottomAfterViewTop doesn't satisfy the binary search\n    // condition: there can be pages with bottoms above the view top between\n    // pages with bottoms below. This function detects and corrects that error;\n    // see it for more comments.\n    firstVisibleElementInd = backtrackBeforeAllVisibleElements(firstVisibleElementInd, views, top);\n  }\n\n  // lastEdge acts as a cutoff for us to stop looping, because we know all\n  // subsequent pages will be hidden.\n  //\n  // When using wrapped scrolling or vertical scrolling with spreads, we can't\n  // simply stop the first time we reach a page below the bottom of the view;\n  // the tops of subsequent pages on the same row could still be visible. In\n  // horizontal scrolling, we don't have that issue, so we can stop as soon as\n  // we pass `right`, without needing the code below that handles the -1 case.\n  var lastEdge = horizontal ? right : -1;\n\n  for (var i = firstVisibleElementInd; i < numViews; i++) {\n    var view = views[i],\n        element = view.div;\n    var currentWidth = element.offsetLeft + element.clientLeft;\n    var currentHeight = element.offsetTop + element.clientTop;\n    var viewWidth = element.clientWidth,\n        viewHeight = element.clientHeight;\n    var viewRight = currentWidth + viewWidth;\n    var viewBottom = currentHeight + viewHeight;\n\n    if (lastEdge === -1) {\n      // As commented above, this is only needed in non-horizontal cases.\n      // Setting lastEdge to the bottom of the first page that is partially\n      // visible ensures that the next page fully below lastEdge is on the\n      // next row, which has to be fully hidden along with all subsequent rows.\n      if (viewBottom >= bottom) {\n        lastEdge = viewBottom;\n      }\n    } else if ((horizontal ? currentWidth : currentHeight) > lastEdge) {\n      break;\n    }\n\n    if (viewBottom <= top || currentHeight >= bottom || viewRight <= left || currentWidth >= right) {\n      continue;\n    }\n\n    var hiddenHeight = Math.max(0, top - currentHeight) + Math.max(0, viewBottom - bottom);\n    var hiddenWidth = Math.max(0, left - currentWidth) + Math.max(0, viewRight - right);\n    var percent = (viewHeight - hiddenHeight) * (viewWidth - hiddenWidth) * 100 / viewHeight / viewWidth | 0;\n    visible.push({\n      id: view.id,\n      x: currentWidth,\n      y: currentHeight,\n      view: view,\n      percent: percent\n    });\n  }\n\n  var first = visible[0],\n      last = visible[visible.length - 1];\n\n  if (sortByVisibility) {\n    visible.sort(function (a, b) {\n      var pc = a.percent - b.percent;\n      if (Math.abs(pc) > 0.001) {\n        return -pc;\n      }\n      return a.id - b.id; // ensure stability\n    });\n  }\n  return { first: first, last: last, views: visible };\n}\n\n/**\n * Event handler to suppress context menu.\n */\nfunction noContextMenuHandler(evt) {\n  evt.preventDefault();\n}\n\nfunction isDataSchema(url) {\n  var i = 0;\n  var ii = url.length;\n  while (i < ii && url[i].trim() === \"\") {\n    i++;\n  }\n  return url.substring(i, i + 5).toLowerCase() === \"data:\";\n}\n\n/**\n * Returns the filename or guessed filename from the url (see issue 3455).\n * @param {string} url - The original PDF location.\n * @param {string} defaultFilename - The value returned if the filename is\n *   unknown, or the protocol is unsupported.\n * @returns {string} Guessed PDF filename.\n */\nfunction getPDFFileNameFromURL(url) {\n  var defaultFilename = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"document.pdf\";\n\n  if (typeof url !== \"string\") {\n    return defaultFilename;\n  }\n  if (isDataSchema(url)) {\n    console.warn(\"getPDFFileNameFromURL: \" + 'ignoring \"data:\" URL for performance reasons.');\n    return defaultFilename;\n  }\n  var reURI = /^(?:(?:[^:]+:)?\\/\\/[^\\/]+)?([^?#]*)(\\?[^#]*)?(#.*)?$/;\n  //            SCHEME        HOST         1.PATH  2.QUERY   3.REF\n  // Pattern to get last matching NAME.pdf\n  var reFilename = /[^\\/?#=]+\\.pdf\\b(?!.*\\.pdf\\b)/i;\n  var splitURI = reURI.exec(url);\n  var suggestedFilename = reFilename.exec(splitURI[1]) || reFilename.exec(splitURI[2]) || reFilename.exec(splitURI[3]);\n  if (suggestedFilename) {\n    suggestedFilename = suggestedFilename[0];\n    if (suggestedFilename.includes(\"%\")) {\n      // URL-encoded %2Fpath%2Fto%2Ffile.pdf should be file.pdf\n      try {\n        suggestedFilename = reFilename.exec(decodeURIComponent(suggestedFilename))[0];\n      } catch (ex) {\n        // Possible (extremely rare) errors:\n        // URIError \"Malformed URI\", e.g. for \"%AA.pdf\"\n        // TypeError \"null has no properties\", e.g. for \"%2F.pdf\"\n      }\n    }\n  }\n  return suggestedFilename || defaultFilename;\n}\n\nfunction normalizeWheelEventDelta(evt) {\n  var delta = Math.sqrt(evt.deltaX * evt.deltaX + evt.deltaY * evt.deltaY);\n  var angle = Math.atan2(evt.deltaY, evt.deltaX);\n  if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) {\n    // All that is left-up oriented has to change the sign.\n    delta = -delta;\n  }\n\n  var MOUSE_DOM_DELTA_PIXEL_MODE = 0;\n  var MOUSE_DOM_DELTA_LINE_MODE = 1;\n  var MOUSE_PIXELS_PER_LINE = 30;\n  var MOUSE_LINES_PER_PAGE = 30;\n\n  // Converts delta to per-page units\n  if (evt.deltaMode === MOUSE_DOM_DELTA_PIXEL_MODE) {\n    delta /= MOUSE_PIXELS_PER_LINE * MOUSE_LINES_PER_PAGE;\n  } else if (evt.deltaMode === MOUSE_DOM_DELTA_LINE_MODE) {\n    delta /= MOUSE_LINES_PER_PAGE;\n  }\n  return delta;\n}\n\nfunction isValidRotation(angle) {\n  return Number.isInteger(angle) && angle % 90 === 0;\n}\n\nfunction isValidScrollMode(mode) {\n  return Number.isInteger(mode) && Object.values(ScrollMode).includes(mode) && mode !== ScrollMode.UNKNOWN;\n}\n\nfunction isValidSpreadMode(mode) {\n  return Number.isInteger(mode) && Object.values(SpreadMode).includes(mode) && mode !== SpreadMode.UNKNOWN;\n}\n\nfunction isPortraitOrientation(size) {\n  return size.width <= size.height;\n}\n\nvar WaitOnType = {\n  EVENT: \"event\",\n  TIMEOUT: \"timeout\"\n};\n\n/**\n * @typedef {Object} WaitOnEventOrTimeoutParameters\n * @property {Object} target - The event target, can for example be:\n *   `window`, `document`, a DOM element, or an {EventBus} instance.\n * @property {string} name - The name of the event.\n * @property {number} delay - The delay, in milliseconds, after which the\n *   timeout occurs (if the event wasn't already dispatched).\n */\n\n/**\n * Allows waiting for an event or a timeout, whichever occurs first.\n * Can be used to ensure that an action always occurs, even when an event\n * arrives late or not at all.\n *\n * @param {WaitOnEventOrTimeoutParameters}\n * @returns {Promise} A promise that is resolved with a {WaitOnType} value.\n */\nfunction waitOnEventOrTimeout(_ref6) {\n  var target = _ref6.target,\n      name = _ref6.name,\n      _ref6$delay = _ref6.delay,\n      delay = _ref6$delay === undefined ? 0 : _ref6$delay;\n\n  return new Promise(function (resolve, reject) {\n    if ((typeof target === \"undefined\" ? \"undefined\" : _typeof(target)) !== \"object\" || !(name && typeof name === \"string\") || !(Number.isInteger(delay) && delay >= 0)) {\n      throw new Error(\"waitOnEventOrTimeout - invalid parameters.\");\n    }\n\n    function handler(type) {\n      if (target instanceof EventBus) {\n        target.off(name, eventHandler);\n      } else {\n        target.removeEventListener(name, eventHandler);\n      }\n\n      if (timeout) {\n        clearTimeout(timeout);\n      }\n      resolve(type);\n    }\n\n    var eventHandler = handler.bind(null, WaitOnType.EVENT);\n    if (target instanceof EventBus) {\n      target.on(name, eventHandler);\n    } else {\n      target.addEventListener(name, eventHandler);\n    }\n\n    var timeoutHandler = handler.bind(null, WaitOnType.TIMEOUT);\n    var timeout = setTimeout(timeoutHandler, delay);\n  });\n}\n\n/**\n * Promise that is resolved when DOM window becomes visible.\n */\nvar animationStarted = new Promise(function (resolve) {\n  if (typeof PDFJSDev !== \"undefined\" && PDFJSDev.test(\"LIB\") && typeof window === \"undefined\") {\n    // Prevent \"ReferenceError: window is not defined\" errors when running the\n    // unit-tests in Node.js/Travis.\n    setTimeout(resolve, 20);\n    return;\n  }\n  window.requestAnimationFrame(resolve);\n});\n\n/**\n * Simple event bus for an application. Listeners are attached using the\n * `on` and `off` methods. To raise an event, the `dispatch` method shall be\n * used.\n */\n\nvar EventBus = function () {\n  function EventBus() {\n    var _ref7 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n        _ref7$dispatchToDOM = _ref7.dispatchToDOM,\n        dispatchToDOM = _ref7$dispatchToDOM === undefined ? false : _ref7$dispatchToDOM;\n\n    _classCallCheck(this, EventBus);\n\n    this._listeners = Object.create(null);\n    this._dispatchToDOM = dispatchToDOM === true;\n  }\n\n  _createClass(EventBus, [{\n    key: \"on\",\n    value: function on(eventName, listener) {\n      var eventListeners = this._listeners[eventName];\n      if (!eventListeners) {\n        eventListeners = [];\n        this._listeners[eventName] = eventListeners;\n      }\n      eventListeners.push(listener);\n    }\n  }, {\n    key: \"off\",\n    value: function off(eventName, listener) {\n      var eventListeners = this._listeners[eventName];\n      var i = void 0;\n      if (!eventListeners || (i = eventListeners.indexOf(listener)) < 0) {\n        return;\n      }\n      eventListeners.splice(i, 1);\n    }\n  }, {\n    key: \"dispatch\",\n    value: function dispatch(eventName) {\n      var eventListeners = this._listeners[eventName];\n      if (!eventListeners || eventListeners.length === 0) {\n        if (this._dispatchToDOM) {\n          var _args5 = Array.prototype.slice.call(arguments, 1);\n          this._dispatchDOMEvent(eventName, _args5);\n        }\n        return;\n      }\n      // Passing all arguments after the eventName to the listeners.\n      var args = Array.prototype.slice.call(arguments, 1);\n      // Making copy of the listeners array in case if it will be modified\n      // during dispatch.\n      eventListeners.slice(0).forEach(function (listener) {\n        listener.apply(null, args);\n      });\n      if (this._dispatchToDOM) {\n        this._dispatchDOMEvent(eventName, args);\n      }\n    }\n\n    /**\n     * @private\n     */\n\n  }, {\n    key: \"_dispatchDOMEvent\",\n    value: function _dispatchDOMEvent(eventName) {\n      var args = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n      var details = Object.create(null);\n      if (args && args.length > 0) {\n        var obj = args[0];\n        for (var key in obj) {\n          var value = obj[key];\n          if (key === \"source\") {\n            if (value === window || value === document) {\n              return; // No need to re-dispatch (already) global events.\n            }\n            continue; // Ignore the `source` property.\n          }\n          details[key] = value;\n        }\n      }\n      var event = document.createEvent(\"CustomEvent\");\n      event.initCustomEvent(eventName, true, true, details);\n      document.dispatchEvent(event);\n    }\n  }]);\n\n  return EventBus;\n}();\n\nvar globalEventBus = null;\nfunction getGlobalEventBus() {\n  var dispatchToDOM = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n  if (!globalEventBus) {\n    globalEventBus = new EventBus({ dispatchToDOM: dispatchToDOM });\n  }\n  return globalEventBus;\n}\n\nfunction clamp(v, min, max) {\n  return Math.min(Math.max(v, min), max);\n}\n\nvar ProgressBar = function () {\n  function ProgressBar(id) {\n    var _ref8 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n        height = _ref8.height,\n        width = _ref8.width,\n        units = _ref8.units;\n\n    _classCallCheck(this, ProgressBar);\n\n    this.visible = true;\n\n    // Fetch the sub-elements for later.\n    this.div = document.querySelector(id + \" .progress\");\n    // Get the loading bar element, so it can be resized to fit the viewer.\n    this.bar = this.div.parentNode;\n\n    // Get options, with sensible defaults.\n    this.height = height || 100;\n    this.width = width || 100;\n    this.units = units || \"%\";\n\n    // Initialize heights.\n    this.div.style.height = this.height + this.units;\n    this.percent = 0;\n  }\n\n  _createClass(ProgressBar, [{\n    key: \"_updateBar\",\n    value: function _updateBar() {\n      if (this._indeterminate) {\n        this.div.classList.add(\"indeterminate\");\n        this.div.style.width = this.width + this.units;\n        return;\n      }\n\n      this.div.classList.remove(\"indeterminate\");\n      var progressSize = this.width * this._percent / 100;\n      this.div.style.width = progressSize + this.units;\n    }\n  }, {\n    key: \"setWidth\",\n    value: function setWidth(viewer) {\n      if (!viewer) {\n        return;\n      }\n      var container = viewer.parentNode;\n      var scrollbarWidth = container.offsetWidth - viewer.offsetWidth;\n      if (scrollbarWidth > 0) {\n        this.bar.setAttribute(\"style\", \"width: calc(100% - \" + scrollbarWidth + \"px);\");\n      }\n    }\n  }, {\n    key: \"hide\",\n    value: function hide() {\n      if (!this.visible) {\n        return;\n      }\n      this.visible = false;\n      this.bar.classList.add(\"hidden\");\n      document.body.classList.remove(\"loadingInProgress\");\n    }\n  }, {\n    key: \"show\",\n    value: function show() {\n      if (this.visible) {\n        return;\n      }\n      this.visible = true;\n      document.body.classList.add(\"loadingInProgress\");\n      this.bar.classList.remove(\"hidden\");\n    }\n  }, {\n    key: \"percent\",\n    get: function get() {\n      return this._percent;\n    },\n    set: function set(val) {\n      this._indeterminate = isNaN(val);\n      this._percent = clamp(val, 0, 100);\n      this._updateBar();\n    }\n  }]);\n\n  return ProgressBar;\n}();\n\n/**\n * Moves all elements of an array that satisfy condition to the end of the\n * array, preserving the order of the rest.\n */\n\n\nfunction moveToEndOfArray(arr, condition) {\n  var moved = [],\n      len = arr.length;\n  var write = 0;\n  for (var read = 0; read < len; ++read) {\n    if (condition(arr[read])) {\n      moved.push(arr[read]);\n    } else {\n      arr[write] = arr[read];\n      ++write;\n    }\n  }\n  for (var _read = 0; write < len; ++_read, ++write) {\n    arr[write] = moved[_read];\n  }\n}\n\nexports.AutoPrintRegExp = AutoPrintRegExp;\nexports.CSS_UNITS = CSS_UNITS;\nexports.DEFAULT_SCALE_VALUE = DEFAULT_SCALE_VALUE;\nexports.DEFAULT_SCALE = DEFAULT_SCALE;\nexports.MIN_SCALE = MIN_SCALE;\nexports.MAX_SCALE = MAX_SCALE;\nexports.UNKNOWN_SCALE = UNKNOWN_SCALE;\nexports.MAX_AUTO_SCALE = MAX_AUTO_SCALE;\nexports.SCROLLBAR_PADDING = SCROLLBAR_PADDING;\nexports.VERTICAL_PADDING = VERTICAL_PADDING;\nexports.isValidRotation = isValidRotation;\nexports.isValidScrollMode = isValidScrollMode;\nexports.isValidSpreadMode = isValidSpreadMode;\nexports.isPortraitOrientation = isPortraitOrientation;\nexports.PresentationModeState = PresentationModeState;\nexports.RendererType = RendererType;\nexports.TextLayerMode = TextLayerMode;\nexports.ScrollMode = ScrollMode;\nexports.SpreadMode = SpreadMode;\nexports.NullL10n = NullL10n;\nexports.EventBus = EventBus;\nexports.getGlobalEventBus = getGlobalEventBus;\nexports.clamp = clamp;\nexports.ProgressBar = ProgressBar;\nexports.getPDFFileNameFromURL = getPDFFileNameFromURL;\nexports.noContextMenuHandler = noContextMenuHandler;\nexports.parseQueryString = parseQueryString;\nexports.backtrackBeforeAllVisibleElements = backtrackBeforeAllVisibleElements;\nexports.getVisibleElements = getVisibleElements;\nexports.roundToDivide = roundToDivide;\nexports.getPageSizeInches = getPageSizeInches;\nexports.approximateFraction = approximateFraction;\nexports.getOutputScale = getOutputScale;\nexports.scrollIntoView = scrollIntoView;\nexports.watchScroll = watchScroll;\nexports.binarySearchFirstItem = binarySearchFirstItem;\nexports.normalizeWheelEventDelta = normalizeWheelEventDelta;\nexports.animationStarted = animationStarted;\nexports.WaitOnType = WaitOnType;\nexports.waitOnEventOrTimeout = waitOnEventOrTimeout;\nexports.moveToEndOfArray = moveToEndOfArray;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInVpX3V0aWxzLmpzIl0sIm5hbWVzIjpbIkNTU19VTklUUyIsIkRFRkFVTFRfU0NBTEVfVkFMVUUiLCJERUZBVUxUX1NDQUxFIiwiTUlOX1NDQUxFIiwiTUFYX1NDQUxFIiwiVU5LTk9XTl9TQ0FMRSIsIk1BWF9BVVRPX1NDQUxFIiwiU0NST0xMQkFSX1BBRERJTkciLCJWRVJUSUNBTF9QQURESU5HIiwiUHJlc2VudGF0aW9uTW9kZVN0YXRlIiwiVU5LTk9XTiIsIk5PUk1BTCIsIkNIQU5HSU5HIiwiRlVMTFNDUkVFTiIsIlJlbmRlcmVyVHlwZSIsIkNBTlZBUyIsIlNWRyIsIlRleHRMYXllck1vZGUiLCJESVNBQkxFIiwiRU5BQkxFIiwiRU5BQkxFX0VOSEFOQ0UiLCJTY3JvbGxNb2RlIiwiVkVSVElDQUwiLCJIT1JJWk9OVEFMIiwiV1JBUFBFRCIsIlNwcmVhZE1vZGUiLCJOT05FIiwiT0REIiwiRVZFTiIsIkF1dG9QcmludFJlZ0V4cCIsImZvcm1hdEwxMG5WYWx1ZSIsInRleHQiLCJhcmdzIiwicmVwbGFjZSIsImFsbCIsIm5hbWUiLCJOdWxsTDEwbiIsImdldExhbmd1YWdlIiwiZ2V0RGlyZWN0aW9uIiwiZ2V0IiwicHJvcGVydHkiLCJmYWxsYmFjayIsInRyYW5zbGF0ZSIsImVsZW1lbnQiLCJnZXRPdXRwdXRTY2FsZSIsImN0eCIsImRldmljZVBpeGVsUmF0aW8iLCJ3aW5kb3ciLCJiYWNraW5nU3RvcmVSYXRpbyIsIndlYmtpdEJhY2tpbmdTdG9yZVBpeGVsUmF0aW8iLCJtb3pCYWNraW5nU3RvcmVQaXhlbFJhdGlvIiwibXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvIiwib0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8iLCJiYWNraW5nU3RvcmVQaXhlbFJhdGlvIiwicGl4ZWxSYXRpbyIsInN4Iiwic3kiLCJzY2FsZWQiLCJzY3JvbGxJbnRvVmlldyIsInNwb3QiLCJza2lwT3ZlcmZsb3dIaWRkZW5FbGVtZW50cyIsInBhcmVudCIsIm9mZnNldFBhcmVudCIsImNvbnNvbGUiLCJlcnJvciIsIm9mZnNldFkiLCJvZmZzZXRUb3AiLCJjbGllbnRUb3AiLCJvZmZzZXRYIiwib2Zmc2V0TGVmdCIsImNsaWVudExlZnQiLCJjbGllbnRIZWlnaHQiLCJzY3JvbGxIZWlnaHQiLCJjbGllbnRXaWR0aCIsInNjcm9sbFdpZHRoIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsIm92ZXJmbG93IiwiZGF0YXNldCIsIl9zY2FsZVkiLCJfc2NhbGVYIiwidG9wIiwidW5kZWZpbmVkIiwibGVmdCIsInNjcm9sbExlZnQiLCJzY3JvbGxUb3AiLCJ3YXRjaFNjcm9sbCIsInZpZXdBcmVhRWxlbWVudCIsImNhbGxiYWNrIiwiZGVib3VuY2VTY3JvbGwiLCJldnQiLCJyQUYiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJ2aWV3QXJlYUVsZW1lbnRTY3JvbGxlZCIsImN1cnJlbnRYIiwibGFzdFgiLCJzdGF0ZSIsInJpZ2h0IiwiY3VycmVudFkiLCJsYXN0WSIsImRvd24iLCJfZXZlbnRIYW5kbGVyIiwiYWRkRXZlbnRMaXN0ZW5lciIsInBhcnNlUXVlcnlTdHJpbmciLCJxdWVyeSIsInBhcnRzIiwic3BsaXQiLCJwYXJhbXMiLCJPYmplY3QiLCJjcmVhdGUiLCJpIiwiaWkiLCJsZW5ndGgiLCJwYXJhbSIsImtleSIsInRvTG93ZXJDYXNlIiwidmFsdWUiLCJkZWNvZGVVUklDb21wb25lbnQiLCJiaW5hcnlTZWFyY2hGaXJzdEl0ZW0iLCJpdGVtcyIsImNvbmRpdGlvbiIsIm1pbkluZGV4IiwibWF4SW5kZXgiLCJjdXJyZW50SW5kZXgiLCJjdXJyZW50SXRlbSIsImFwcHJveGltYXRlRnJhY3Rpb24iLCJ4IiwiTWF0aCIsImZsb29yIiwieGludiIsImxpbWl0IiwieF8iLCJhIiwiYiIsImMiLCJkIiwicCIsInEiLCJyZXN1bHQiLCJyb3VuZFRvRGl2aWRlIiwiZGl2IiwiciIsInJvdW5kIiwiZ2V0UGFnZVNpemVJbmNoZXMiLCJ2aWV3IiwidXNlclVuaXQiLCJyb3RhdGUiLCJ4MSIsInkxIiwieDIiLCJ5MiIsImNoYW5nZU9yaWVudGF0aW9uIiwid2lkdGgiLCJoZWlnaHQiLCJiYWNrdHJhY2tCZWZvcmVBbGxWaXNpYmxlRWxlbWVudHMiLCJpbmRleCIsInZpZXdzIiwiZWx0IiwicGFnZVRvcCIsImdldFZpc2libGVFbGVtZW50cyIsInNjcm9sbEVsIiwic29ydEJ5VmlzaWJpbGl0eSIsImhvcml6b250YWwiLCJib3R0b20iLCJpc0VsZW1lbnRCb3R0b21BZnRlclZpZXdUb3AiLCJlbGVtZW50Qm90dG9tIiwiaXNFbGVtZW50UmlnaHRBZnRlclZpZXdMZWZ0IiwiZWxlbWVudFJpZ2h0IiwidmlzaWJsZSIsIm51bVZpZXdzIiwiZmlyc3RWaXNpYmxlRWxlbWVudEluZCIsImxhc3RFZGdlIiwiY3VycmVudFdpZHRoIiwiY3VycmVudEhlaWdodCIsInZpZXdXaWR0aCIsInZpZXdIZWlnaHQiLCJ2aWV3UmlnaHQiLCJ2aWV3Qm90dG9tIiwiaGlkZGVuSGVpZ2h0IiwibWF4IiwiaGlkZGVuV2lkdGgiLCJwZXJjZW50IiwicHVzaCIsImlkIiwieSIsImZpcnN0IiwibGFzdCIsInNvcnQiLCJwYyIsImFicyIsIm5vQ29udGV4dE1lbnVIYW5kbGVyIiwicHJldmVudERlZmF1bHQiLCJpc0RhdGFTY2hlbWEiLCJ1cmwiLCJ0cmltIiwic3Vic3RyaW5nIiwiZ2V0UERGRmlsZU5hbWVGcm9tVVJMIiwiZGVmYXVsdEZpbGVuYW1lIiwid2FybiIsInJlVVJJIiwicmVGaWxlbmFtZSIsInNwbGl0VVJJIiwiZXhlYyIsInN1Z2dlc3RlZEZpbGVuYW1lIiwiaW5jbHVkZXMiLCJleCIsIm5vcm1hbGl6ZVdoZWVsRXZlbnREZWx0YSIsImRlbHRhIiwic3FydCIsImRlbHRhWCIsImRlbHRhWSIsImFuZ2xlIiwiYXRhbjIiLCJQSSIsIk1PVVNFX0RPTV9ERUxUQV9QSVhFTF9NT0RFIiwiTU9VU0VfRE9NX0RFTFRBX0xJTkVfTU9ERSIsIk1PVVNFX1BJWEVMU19QRVJfTElORSIsIk1PVVNFX0xJTkVTX1BFUl9QQUdFIiwiZGVsdGFNb2RlIiwiaXNWYWxpZFJvdGF0aW9uIiwiTnVtYmVyIiwiaXNJbnRlZ2VyIiwiaXNWYWxpZFNjcm9sbE1vZGUiLCJtb2RlIiwidmFsdWVzIiwiaXNWYWxpZFNwcmVhZE1vZGUiLCJpc1BvcnRyYWl0T3JpZW50YXRpb24iLCJzaXplIiwiV2FpdE9uVHlwZSIsIkVWRU5UIiwiVElNRU9VVCIsIndhaXRPbkV2ZW50T3JUaW1lb3V0IiwidGFyZ2V0IiwiZGVsYXkiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIkVycm9yIiwiaGFuZGxlciIsInR5cGUiLCJFdmVudEJ1cyIsIm9mZiIsImV2ZW50SGFuZGxlciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJ0aW1lb3V0IiwiY2xlYXJUaW1lb3V0IiwiYmluZCIsIm9uIiwidGltZW91dEhhbmRsZXIiLCJzZXRUaW1lb3V0IiwiYW5pbWF0aW9uU3RhcnRlZCIsIlBERkpTRGV2IiwidGVzdCIsImRpc3BhdGNoVG9ET00iLCJfbGlzdGVuZXJzIiwiX2Rpc3BhdGNoVG9ET00iLCJldmVudE5hbWUiLCJsaXN0ZW5lciIsImV2ZW50TGlzdGVuZXJzIiwiaW5kZXhPZiIsInNwbGljZSIsIkFycmF5IiwicHJvdG90eXBlIiwic2xpY2UiLCJjYWxsIiwiYXJndW1lbnRzIiwiX2Rpc3BhdGNoRE9NRXZlbnQiLCJmb3JFYWNoIiwiYXBwbHkiLCJkZXRhaWxzIiwib2JqIiwiZG9jdW1lbnQiLCJldmVudCIsImNyZWF0ZUV2ZW50IiwiaW5pdEN1c3RvbUV2ZW50IiwiZGlzcGF0Y2hFdmVudCIsImdsb2JhbEV2ZW50QnVzIiwiZ2V0R2xvYmFsRXZlbnRCdXMiLCJjbGFtcCIsInYiLCJtaW4iLCJQcm9ncmVzc0JhciIsInVuaXRzIiwicXVlcnlTZWxlY3RvciIsImJhciIsInBhcmVudE5vZGUiLCJzdHlsZSIsIl9pbmRldGVybWluYXRlIiwiY2xhc3NMaXN0IiwiYWRkIiwicmVtb3ZlIiwicHJvZ3Jlc3NTaXplIiwiX3BlcmNlbnQiLCJ2aWV3ZXIiLCJjb250YWluZXIiLCJzY3JvbGxiYXJXaWR0aCIsIm9mZnNldFdpZHRoIiwic2V0QXR0cmlidXRlIiwiYm9keSIsInZhbCIsImlzTmFOIiwiX3VwZGF0ZUJhciIsIm1vdmVUb0VuZE9mQXJyYXkiLCJhcnIiLCJtb3ZlZCIsImxlbiIsIndyaXRlIiwicmVhZCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZUEsSUFBTUEsWUFBWSxPQUFPLElBQXpCO0FBQ0EsSUFBTUMsc0JBQXNCLE1BQTVCO0FBQ0EsSUFBTUMsZ0JBQWdCLEdBQXRCO0FBQ0EsSUFBTUMsWUFBWSxHQUFsQjtBQUNBLElBQU1DLFlBQVksSUFBbEI7QUFDQSxJQUFNQyxnQkFBZ0IsQ0FBdEI7QUFDQSxJQUFNQyxpQkFBaUIsSUFBdkI7QUFDQSxJQUFNQyxvQkFBb0IsRUFBMUI7QUFDQSxJQUFNQyxtQkFBbUIsQ0FBekI7O0FBRUEsSUFBTUMsd0JBQXdCO0FBQzVCQyxXQUFTLENBRG1CO0FBRTVCQyxVQUFRLENBRm9CO0FBRzVCQyxZQUFVLENBSGtCO0FBSTVCQyxjQUFZO0FBSmdCLENBQTlCOztBQU9BLElBQU1DLGVBQWU7QUFDbkJDLFVBQVEsUUFEVztBQUVuQkMsT0FBSztBQUZjLENBQXJCOztBQUtBLElBQU1DLGdCQUFnQjtBQUNwQkMsV0FBUyxDQURXO0FBRXBCQyxVQUFRLENBRlk7QUFHcEJDLGtCQUFnQjtBQUhJLENBQXRCOztBQU1BLElBQU1DLGFBQWE7QUFDakJYLFdBQVMsQ0FBQyxDQURPO0FBRWpCWSxZQUFVLENBRk8sRUFFSjtBQUNiQyxjQUFZLENBSEs7QUFJakJDLFdBQVM7QUFKUSxDQUFuQjs7QUFPQSxJQUFNQyxhQUFhO0FBQ2pCZixXQUFTLENBQUMsQ0FETztBQUVqQmdCLFFBQU0sQ0FGVyxFQUVSO0FBQ1RDLE9BQUssQ0FIWTtBQUlqQkMsUUFBTTtBQUpXLENBQW5COztBQU9BO0FBQ0EsSUFBTUMsa0JBQWtCLGNBQXhCOztBQUVBO0FBQ0EsU0FBU0MsZUFBVCxD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TixlLEdBQUFBLGU7UUFDQUcsaUIsR0FBQUEsaUI7UUFDQUcsaUIsR0FBQUEsaUI7UUFDQUMscUIsR0FBQUEscUI7UUFDQXhOLHFCLEdBQUFBLHFCO1FBQ0FLLFksR0FBQUEsWTtRQUNBRyxhLEdBQUFBLGE7UUFDQUksVSxHQUFBQSxVO1FBQ0FJLFUsR0FBQUEsVTtRQUNBVyxRLEdBQUFBLFE7UUFDQTJNLFEsR0FBQUEsUTtRQUNBcUMsaUIsR0FBQUEsaUI7UUFDQUMsSyxHQUFBQSxLO1FBQ0FHLFcsR0FBQUEsVztRQUNBckYscUIsR0FBQUEscUI7UUFDQU4sb0IsR0FBQUEsb0I7UUFDQXZGLGdCLEdBQUFBLGdCO1FBQ0FtRCxpQyxHQUFBQSxpQztRQUNBSyxrQixHQUFBQSxrQjtRQUNBcEIsYSxHQUFBQSxhO1FBQ0FJLGlCLEdBQUFBLGlCO1FBQ0FsQixtQixHQUFBQSxtQjtRQUNBaEYsYyxHQUFBQSxjO1FBQ0FjLGMsR0FBQUEsYztRQUNBMkIsVyxHQUFBQSxXO1FBQ0FnQyxxQixHQUFBQSxxQjtRQUNBd0Ysd0IsR0FBQUEsd0I7UUFDQTRDLGdCLEdBQUFBLGdCO1FBQ0F0QixVLEdBQUFBLFU7UUFDQUcsb0IsR0FBQUEsb0I7UUFDQXVFLGdCLEdBQUFBLGdCIiwiZmlsZSI6InVpX3V0aWxzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG4vKiBDb3B5cmlnaHQgMjAxMiBNb3ppbGxhIEZvdW5kYXRpb25cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuY29uc3QgQ1NTX1VOSVRTID0gOTYuMCAvIDcyLjA7XG5jb25zdCBERUZBVUxUX1NDQUxFX1ZBTFVFID0gXCJhdXRvXCI7XG5jb25zdCBERUZBVUxUX1NDQUxFID0gMS4wO1xuY29uc3QgTUlOX1NDQUxFID0gMC4xO1xuY29uc3QgTUFYX1NDQUxFID0gMTAuMDtcbmNvbnN0IFVOS05PV05fU0NBTEUgPSAwO1xuY29uc3QgTUFYX0FVVE9fU0NBTEUgPSAxLjI1O1xuY29uc3QgU0NST0xMQkFSX1BBRERJTkcgPSA0MDtcbmNvbnN0IFZFUlRJQ0FMX1BBRERJTkcgPSA1O1xuXG5jb25zdCBQcmVzZW50YXRpb25Nb2RlU3RhdGUgPSB7XG4gIFVOS05PV046IDAsXG4gIE5PUk1BTDogMSxcbiAgQ0hBTkdJTkc6IDIsXG4gIEZVTExTQ1JFRU46IDMsXG59O1xuXG5jb25zdCBSZW5kZXJlclR5cGUgPSB7XG4gIENBTlZBUzogXCJjYW52YXNcIixcbiAgU1ZHOiBcInN2Z1wiLFxufTtcblxuY29uc3QgVGV4dExheWVyTW9kZSA9IHtcbiAgRElTQUJMRTogMCxcbiAgRU5BQkxFOiAxLFxuICBFTkFCTEVfRU5IQU5DRTogMixcbn07XG5cbmNvbnN0IFNjcm9sbE1vZGUgPSB7XG4gIFVOS05PV046IC0xLFxuICBWRVJUSUNBTDogMCwgLy8gRGVmYXVsdCB2YWx1ZS5cbiAgSE9SSVpPTlRBTDogMSxcbiAgV1JBUFBFRDogMixcbn07XG5cbmNvbnN0IFNwcmVhZE1vZGUgPSB7XG4gIFVOS05PV046IC0xLFxuICBOT05FOiAwLCAvLyBEZWZhdWx0IHZhbHVlLlxuICBPREQ6IDEsXG4gIEVWRU46IDIsXG59O1xuXG4vLyBVc2VkIGJ5IGBQREZWaWV3ZXJBcHBsaWNhdGlvbmAsIGFuZCBieSB0aGUgQVBJIHVuaXQtdGVzdHMuXG5jb25zdCBBdXRvUHJpbnRSZWdFeHAgPSAvXFxicHJpbnRcXHMqXFwoLztcblxuLy8gUmVwbGFjZXMge3thcmd1bWVudHN9fSB3aXRoIHRoZWlyIHZhbHVlcy5cbmZ1bmN0aW9uIGZvcm1hdEwxMG5WYWx1ZSh0ZXh0LCBhcmdzKSB7XG4gIGlmICghYXJncykge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG4gIHJldHVybiB0ZXh0LnJlcGxhY2UoL1xce1xce1xccyooXFx3KylcXHMqXFx9XFx9L2csIChhbGwsIG5hbWUpID0+IHtcbiAgICByZXR1cm4gbmFtZSBpbiBhcmdzID8gYXJnc1tuYW1lXSA6IFwie3tcIiArIG5hbWUgKyBcIn19XCI7XG4gIH0pO1xufVxuXG4vKipcbiAqIE5vLW9wIGltcGxlbWVudGF0aW9uIG9mIHRoZSBsb2NhbGl6YXRpb24gc2VydmljZS5cbiAqIEBpbXBsZW1lbnRzIHtJTDEwbn1cbiAqL1xuY29uc3QgTnVsbEwxMG4gPSB7XG4gIGFzeW5jIGdldExhbmd1YWdlKCkge1xuICAgIHJldHVybiBcImVuLXVzXCI7XG4gIH0sXG5cbiAgYXN5bmMgZ2V0RGlyZWN0aW9uKCkge1xuICAgIHJldHVybiBcImx0clwiO1xuICB9LFxuXG4gIGFzeW5jIGdldChwcm9wZXJ0eSwgYXJncywgZmFsbGJhY2spIHtcbiAgICByZXR1cm4gZm9ybWF0TDEwblZhbHVlKGZhbGxiYWNrLCBhcmdzKTtcbiAgfSxcblxuICBhc3luYyB0cmFuc2xhdGUoZWxlbWVudCkge30sXG59O1xuXG4vKipcbiAqIFJldHVybnMgc2NhbGUgZmFjdG9yIGZvciB0aGUgY2FudmFzLiBJdCBtYWtlcyBzZW5zZSBmb3IgdGhlIEhpRFBJIGRpc3BsYXlzLlxuICogQHJldHVybnMge09iamVjdH0gVGhlIG9iamVjdCB3aXRoIGhvcml6b250YWwgKHN4KSBhbmQgdmVydGljYWwgKHN5KVxuICogICAgICAgICAgICAgICAgICAgc2NhbGVzLiBUaGUgc2NhbGVkIHByb3BlcnR5IGlzIHNldCB0byBmYWxzZSBpZiBzY2FsaW5nIGlzXG4gKiAgICAgICAgICAgICAgICAgICBub3QgcmVxdWlyZWQsIHRydWUgb3RoZXJ3aXNlLlxuICovXG5mdW5jdGlvbiBnZXRPdXRwdXRTY2FsZShjdHgpIHtcbiAgY29uc3QgZGV2aWNlUGl4ZWxSYXRpbyA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gIGNvbnN0IGJhY2tpbmdTdG9yZVJhdGlvID1cbiAgICBjdHgud2Via2l0QmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fFxuICAgIGN0eC5tb3pCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8XG4gICAgY3R4Lm1zQmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fFxuICAgIGN0eC5vQmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fFxuICAgIGN0eC5iYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8XG4gICAgMTtcbiAgY29uc3QgcGl4ZWxSYXRpbyA9IGRldmljZVBpeGVsUmF0aW8gLyBiYWNraW5nU3RvcmVSYXRpbztcbiAgcmV0dXJuIHtcbiAgICBzeDogcGl4ZWxSYXRpbyxcbiAgICBzeTogcGl4ZWxSYXRpbyxcbiAgICBzY2FsZWQ6IHBpeGVsUmF0aW8gIT09IDEsXG4gIH07XG59XG5cbi8qKlxuICogU2Nyb2xscyBzcGVjaWZpZWQgZWxlbWVudCBpbnRvIHZpZXcgb2YgaXRzIHBhcmVudC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gYmUgdmlzaWJsZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzcG90IC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uYWwgdG9wIGFuZCBsZWZ0IHByb3BlcnRpZXMsXG4gKiAgIHNwZWNpZnlpbmcgdGhlIG9mZnNldCBmcm9tIHRoZSB0b3AgbGVmdCBlZGdlLlxuICogQHBhcmFtIHtib29sZWFufSBza2lwT3ZlcmZsb3dIaWRkZW5FbGVtZW50cyAtIElnbm9yZSBlbGVtZW50cyB0aGF0IGhhdmVcbiAqICAgdGhlIENTUyBydWxlIGBvdmVyZmxvdzogaGlkZGVuO2Agc2V0LiBUaGUgZGVmYXVsdCBpcyBmYWxzZS5cbiAqL1xuZnVuY3Rpb24gc2Nyb2xsSW50b1ZpZXcoZWxlbWVudCwgc3BvdCwgc2tpcE92ZXJmbG93SGlkZGVuRWxlbWVudHMgPSBmYWxzZSkge1xuICAvLyBBc3N1bWluZyBvZmZzZXRQYXJlbnQgaXMgYXZhaWxhYmxlIChpdCdzIG5vdCBhdmFpbGFibGUgd2hlbiB2aWV3ZXIgaXMgaW5cbiAgLy8gaGlkZGVuIGlmcmFtZSBvciBvYmplY3QpLiBXZSBoYXZlIHRvIHNjcm9sbDogaWYgdGhlIG9mZnNldFBhcmVudCBpcyBub3Qgc2V0XG4gIC8vIHByb2R1Y2luZyB0aGUgZXJyb3IuIFNlZSBhbHNvIGFuaW1hdGlvblN0YXJ0ZWQuXG4gIGxldCBwYXJlbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudDtcbiAgaWYgKCFwYXJlbnQpIHtcbiAgICBjb25zb2xlLmVycm9yKFwib2Zmc2V0UGFyZW50IGlzIG5vdCBzZXQgLS0gY2Fubm90IHNjcm9sbFwiKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IG9mZnNldFkgPSBlbGVtZW50Lm9mZnNldFRvcCArIGVsZW1lbnQuY2xpZW50VG9wO1xuICBsZXQgb2Zmc2V0WCA9IGVsZW1lbnQub2Zmc2V0TGVmdCArIGVsZW1lbnQuY2xpZW50TGVmdDtcbiAgd2hpbGUgKFxuICAgIChwYXJlbnQuY2xpZW50SGVpZ2h0ID09PSBwYXJlbnQuc2Nyb2xsSGVpZ2h0ICYmXG4gICAgICBwYXJlbnQuY2xpZW50V2lkdGggPT09IHBhcmVudC5zY3JvbGxXaWR0aCkgfHxcbiAgICAoc2tpcE92ZXJmbG93SGlkZGVuRWxlbWVudHMgJiZcbiAgICAgIGdldENvbXB1dGVkU3R5bGUocGFyZW50KS5vdmVyZmxvdyA9PT0gXCJoaWRkZW5cIilcbiAgKSB7XG4gICAgaWYgKHBhcmVudC5kYXRhc2V0Ll9zY2FsZVkpIHtcbiAgICAgIG9mZnNldFkgLz0gcGFyZW50LmRhdGFzZXQuX3NjYWxlWTtcbiAgICAgIG9mZnNldFggLz0gcGFyZW50LmRhdGFzZXQuX3NjYWxlWDtcbiAgICB9XG4gICAgb2Zmc2V0WSArPSBwYXJlbnQub2Zmc2V0VG9wO1xuICAgIG9mZnNldFggKz0gcGFyZW50Lm9mZnNldExlZnQ7XG4gICAgcGFyZW50ID0gcGFyZW50Lm9mZnNldFBhcmVudDtcbiAgICBpZiAoIXBhcmVudCkge1xuICAgICAgcmV0dXJuOyAvLyBubyBuZWVkIHRvIHNjcm9sbFxuICAgIH1cbiAgfVxuICBpZiAoc3BvdCkge1xuICAgIGlmIChzcG90LnRvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvZmZzZXRZICs9IHNwb3QudG9wO1xuICAgIH1cbiAgICBpZiAoc3BvdC5sZWZ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG9mZnNldFggKz0gc3BvdC5sZWZ0O1xuICAgICAgcGFyZW50LnNjcm9sbExlZnQgPSBvZmZzZXRYO1xuICAgIH1cbiAgfVxuICBwYXJlbnQuc2Nyb2xsVG9wID0gb2Zmc2V0WTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gc3RhcnQgbW9uaXRvcmluZyB0aGUgc2Nyb2xsIGV2ZW50IGFuZCBjb252ZXJ0aW5nIHRoZW0gaW50b1xuICogUERGLmpzIGZyaWVuZGx5IG9uZTogd2l0aCBzY3JvbGwgZGVib3VuY2UgYW5kIHNjcm9sbCBkaXJlY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIHdhdGNoU2Nyb2xsKHZpZXdBcmVhRWxlbWVudCwgY2FsbGJhY2spIHtcbiAgY29uc3QgZGVib3VuY2VTY3JvbGwgPSBmdW5jdGlvbihldnQpIHtcbiAgICBpZiAockFGKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIHNjaGVkdWxlIGFuIGludm9jYXRpb24gb2Ygc2Nyb2xsIGZvciBuZXh0IGFuaW1hdGlvbiBmcmFtZS5cbiAgICByQUYgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uIHZpZXdBcmVhRWxlbWVudFNjcm9sbGVkKCkge1xuICAgICAgckFGID0gbnVsbDtcblxuICAgICAgY29uc3QgY3VycmVudFggPSB2aWV3QXJlYUVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICAgIGNvbnN0IGxhc3RYID0gc3RhdGUubGFzdFg7XG4gICAgICBpZiAoY3VycmVudFggIT09IGxhc3RYKSB7XG4gICAgICAgIHN0YXRlLnJpZ2h0ID0gY3VycmVudFggPiBsYXN0WDtcbiAgICAgIH1cbiAgICAgIHN0YXRlLmxhc3RYID0gY3VycmVudFg7XG4gICAgICBjb25zdCBjdXJyZW50WSA9IHZpZXdBcmVhRWxlbWVudC5zY3JvbGxUb3A7XG4gICAgICBjb25zdCBsYXN0WSA9IHN0YXRlLmxhc3RZO1xuICAgICAgaWYgKGN1cnJlbnRZICE9PSBsYXN0WSkge1xuICAgICAgICBzdGF0ZS5kb3duID0gY3VycmVudFkgPiBsYXN0WTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLmxhc3RZID0gY3VycmVudFk7XG4gICAgICBjYWxsYmFjayhzdGF0ZSk7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3Qgc3RhdGUgPSB7XG4gICAgcmlnaHQ6IHRydWUsXG4gICAgZG93bjogdHJ1ZSxcbiAgICBsYXN0WDogdmlld0FyZWFFbGVtZW50LnNjcm9sbExlZnQsXG4gICAgbGFzdFk6IHZpZXdBcmVhRWxlbWVudC5zY3JvbGxUb3AsXG4gICAgX2V2ZW50SGFuZGxlcjogZGVib3VuY2VTY3JvbGwsXG4gIH07XG5cbiAgbGV0IHJBRiA9IG51bGw7XG4gIHZpZXdBcmVhRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIGRlYm91bmNlU2Nyb2xsLCB0cnVlKTtcbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBwYXJzZSBxdWVyeSBzdHJpbmcgKGUuZy4gP3BhcmFtMT12YWx1ZSZwYXJtMj0uLi4pLlxuICovXG5mdW5jdGlvbiBwYXJzZVF1ZXJ5U3RyaW5nKHF1ZXJ5KSB7XG4gIGNvbnN0IHBhcnRzID0gcXVlcnkuc3BsaXQoXCImXCIpO1xuICBjb25zdCBwYXJhbXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBmb3IgKGxldCBpID0gMCwgaWkgPSBwYXJ0cy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7XG4gICAgY29uc3QgcGFyYW0gPSBwYXJ0c1tpXS5zcGxpdChcIj1cIik7XG4gICAgY29uc3Qga2V5ID0gcGFyYW1bMF0udG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCB2YWx1ZSA9IHBhcmFtLmxlbmd0aCA+IDEgPyBwYXJhbVsxXSA6IG51bGw7XG4gICAgcGFyYW1zW2RlY29kZVVSSUNvbXBvbmVudChrZXkpXSA9IGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHBhcmFtcztcbn1cblxuLyoqXG4gKiBVc2UgYmluYXJ5IHNlYXJjaCB0byBmaW5kIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgaXRlbSBpbiBhIGdpdmVuIGFycmF5IHdoaWNoXG4gKiBwYXNzZXMgYSBnaXZlbiBjb25kaXRpb24uIFRoZSBpdGVtcyBhcmUgZXhwZWN0ZWQgdG8gYmUgc29ydGVkIGluIHRoZSBzZW5zZVxuICogdGhhdCBpZiB0aGUgY29uZGl0aW9uIGlzIHRydWUgZm9yIG9uZSBpdGVtIGluIHRoZSBhcnJheSwgdGhlbiBpdCBpcyBhbHNvIHRydWVcbiAqIGZvciBhbGwgZm9sbG93aW5nIGl0ZW1zLlxuICpcbiAqIEByZXR1cm5zIHtudW1iZXJ9IEluZGV4IG9mIHRoZSBmaXJzdCBhcnJheSBlbGVtZW50IHRvIHBhc3MgdGhlIHRlc3QsXG4gKiAgICAgICAgICAgICAgICAgICBvciB8aXRlbXMubGVuZ3RofCBpZiBubyBzdWNoIGVsZW1lbnQgZXhpc3RzLlxuICovXG5mdW5jdGlvbiBiaW5hcnlTZWFyY2hGaXJzdEl0ZW0oaXRlbXMsIGNvbmRpdGlvbikge1xuICBsZXQgbWluSW5kZXggPSAwO1xuICBsZXQgbWF4SW5kZXggPSBpdGVtcy5sZW5ndGggLSAxO1xuXG4gIGlmIChpdGVtcy5sZW5ndGggPT09IDAgfHwgIWNvbmRpdGlvbihpdGVtc1ttYXhJbmRleF0pKSB7XG4gICAgcmV0dXJuIGl0ZW1zLmxlbmd0aDtcbiAgfVxuICBpZiAoY29uZGl0aW9uKGl0ZW1zW21pbkluZGV4XSkpIHtcbiAgICByZXR1cm4gbWluSW5kZXg7XG4gIH1cblxuICB3aGlsZSAobWluSW5kZXggPCBtYXhJbmRleCkge1xuICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IChtaW5JbmRleCArIG1heEluZGV4KSA+PiAxO1xuICAgIGNvbnN0IGN1cnJlbnRJdGVtID0gaXRlbXNbY3VycmVudEluZGV4XTtcbiAgICBpZiAoY29uZGl0aW9uKGN1cnJlbnRJdGVtKSkge1xuICAgICAgbWF4SW5kZXggPSBjdXJyZW50SW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1pbkluZGV4ID0gY3VycmVudEluZGV4ICsgMTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1pbkluZGV4OyAvKiA9PT0gbWF4SW5kZXggKi9cbn1cblxuLyoqXG4gKiAgQXBwcm94aW1hdGVzIGZsb2F0IG51bWJlciBhcyBhIGZyYWN0aW9uIHVzaW5nIEZhcmV5IHNlcXVlbmNlIChtYXggb3JkZXJcbiAqICBvZiA4KS5cbiAqICBAcGFyYW0ge251bWJlcn0geCAtIFBvc2l0aXZlIGZsb2F0IG51bWJlci5cbiAqICBAcmV0dXJucyB7QXJyYXl9IEVzdGltYXRlZCBmcmFjdGlvbjogdGhlIGZpcnN0IGFycmF5IGl0ZW0gaXMgYSBudW1lcmF0b3IsXG4gKiAgICAgICAgICAgICAgICAgICB0aGUgc2Vjb25kIG9uZSBpcyBhIGRlbm9taW5hdG9yLlxuICovXG5mdW5jdGlvbiBhcHByb3hpbWF0ZUZyYWN0aW9uKHgpIHtcbiAgLy8gRmFzdCBwYXRocyBmb3IgaW50IG51bWJlcnMgb3IgdGhlaXIgaW52ZXJzaW9ucy5cbiAgaWYgKE1hdGguZmxvb3IoeCkgPT09IHgpIHtcbiAgICByZXR1cm4gW3gsIDFdO1xuICB9XG4gIGNvbnN0IHhpbnYgPSAxIC8geDtcbiAgY29uc3QgbGltaXQgPSA4O1xuICBpZiAoeGludiA+IGxpbWl0KSB7XG4gICAgcmV0dXJuIFsxLCBsaW1pdF07XG4gIH0gZWxzZSBpZiAoTWF0aC5mbG9vcih4aW52KSA9PT0geGludikge1xuICAgIHJldHVybiBbMSwgeGludl07XG4gIH1cblxuICBjb25zdCB4XyA9IHggPiAxID8geGludiA6IHg7XG4gIC8vIGEvYiBhbmQgYy9kIGFyZSBuZWlnaGJvdXJzIGluIEZhcmV5IHNlcXVlbmNlLlxuICBsZXQgYSA9IDAsXG4gICAgYiA9IDEsXG4gICAgYyA9IDEsXG4gICAgZCA9IDE7XG4gIC8vIExpbWl0aW5nIHNlYXJjaCB0byBvcmRlciA4LlxuICB3aGlsZSAodHJ1ZSkge1xuICAgIC8vIEdlbmVyYXRpbmcgbmV4dCB0ZXJtIGluIHNlcXVlbmNlIChvcmRlciBvZiBxKS5cbiAgICBjb25zdCBwID0gYSArIGMsXG4gICAgICBxID0gYiArIGQ7XG4gICAgaWYgKHEgPiBsaW1pdCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmICh4XyA8PSBwIC8gcSkge1xuICAgICAgYyA9IHA7XG4gICAgICBkID0gcTtcbiAgICB9IGVsc2Uge1xuICAgICAgYSA9IHA7XG4gICAgICBiID0gcTtcbiAgICB9XG4gIH1cbiAgbGV0IHJlc3VsdDtcbiAgLy8gU2VsZWN0IGNsb3Nlc3Qgb2YgdGhlIG5laWdoYm91cnMgdG8geC5cbiAgaWYgKHhfIC0gYSAvIGIgPCBjIC8gZCAtIHhfKSB7XG4gICAgcmVzdWx0ID0geF8gPT09IHggPyBbYSwgYl0gOiBbYiwgYV07XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0geF8gPT09IHggPyBbYywgZF0gOiBbZCwgY107XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gcm91bmRUb0RpdmlkZSh4LCBkaXYpIHtcbiAgY29uc3QgciA9IHggJSBkaXY7XG4gIHJldHVybiByID09PSAwID8geCA6IE1hdGgucm91bmQoeCAtIHIgKyBkaXYpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHNpemUgb2YgdGhlIHNwZWNpZmllZCBwYWdlLCBjb252ZXJ0ZWQgZnJvbSBQREYgdW5pdHMgdG8gaW5jaGVzLlxuICogQHBhcmFtIHtPYmplY3R9IEFuIE9iamVjdCBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzOiB7QXJyYXl9IGB2aWV3YCxcbiAqICAge251bWJlcn0gYHVzZXJVbml0YCwgYW5kIHtudW1iZXJ9IGByb3RhdGVgLlxuICogQHJldHVybnMge09iamVjdH0gQW4gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIHByb3BlcnRpZXM6IHtudW1iZXJ9IGB3aWR0aGBcbiAqICAgYW5kIHtudW1iZXJ9IGBoZWlnaHRgLCBnaXZlbiBpbiBpbmNoZXMuXG4gKi9cbmZ1bmN0aW9uIGdldFBhZ2VTaXplSW5jaGVzKHsgdmlldywgdXNlclVuaXQsIHJvdGF0ZSB9KSB7XG4gIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSB2aWV3O1xuICAvLyBXZSBuZWVkIHRvIHRha2UgdGhlIHBhZ2Ugcm90YXRpb24gaW50byBhY2NvdW50IGFzIHdlbGwuXG4gIGNvbnN0IGNoYW5nZU9yaWVudGF0aW9uID0gcm90YXRlICUgMTgwICE9PSAwO1xuXG4gIGNvbnN0IHdpZHRoID0gKCh4MiAtIHgxKSAvIDcyKSAqIHVzZXJVbml0O1xuICBjb25zdCBoZWlnaHQgPSAoKHkyIC0geTEpIC8gNzIpICogdXNlclVuaXQ7XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogY2hhbmdlT3JpZW50YXRpb24gPyBoZWlnaHQgOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGNoYW5nZU9yaWVudGF0aW9uID8gd2lkdGggOiBoZWlnaHQsXG4gIH07XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIGZvciBnZXRWaXNpYmxlRWxlbWVudHMuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IC0gaW5pdGlhbCBndWVzcyBhdCB0aGUgZmlyc3QgdmlzaWJsZSBlbGVtZW50XG4gKiBAcGFyYW0ge0FycmF5fSB2aWV3cyAtIGFycmF5IG9mIHBhZ2VzLCBpbnRvIHdoaWNoIGBpbmRleGAgaXMgYW4gaW5kZXhcbiAqIEBwYXJhbSB7bnVtYmVyfSB0b3AgLSB0aGUgdG9wIG9mIHRoZSBzY3JvbGwgcGFuZVxuICogQHJldHVybnMge251bWJlcn0gbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGBpbmRleGAgdGhhdCBpcyBkZWZpbml0ZWx5IGF0IG9yXG4gKiAgIGJlZm9yZSB0aGUgZmlyc3QgdmlzaWJsZSBlbGVtZW50IGluIGB2aWV3c2AsIGJ1dCBub3QgYnkgdG9vIG11Y2guIChVc3VhbGx5LFxuICogICB0aGlzIHdpbGwgYmUgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGZpcnN0IHBhcnRpYWxseSB2aXNpYmxlIHJvdyBpblxuICogICBgdmlld3NgLCBhbHRob3VnaCBzb21ldGltZXMgaXQgZ29lcyBiYWNrIG9uZSByb3cgZnVydGhlci4pXG4gKi9cbmZ1bmN0aW9uIGJhY2t0cmFja0JlZm9yZUFsbFZpc2libGVFbGVtZW50cyhpbmRleCwgdmlld3MsIHRvcCkge1xuICAvLyBiaW5hcnlTZWFyY2hGaXJzdEl0ZW0ncyBhc3N1bXB0aW9uIGlzIHRoYXQgdGhlIGlucHV0IGlzIG9yZGVyZWQsIHdpdGggb25seVxuICAvLyBvbmUgaW5kZXggd2hlcmUgdGhlIGNvbmRpdGlvbnMgZmxpcHMgZnJvbSBmYWxzZSB0byB0cnVlOiBbZmFsc2UgLi4uLFxuICAvLyB0cnVlLi4uXS4gV2l0aCB2ZXJ0aWNhbCBzY3JvbGxpbmcgYW5kIHNwcmVhZHMsIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmVcbiAgLy8gW2ZhbHNlIC4uLiwgdHJ1ZSwgZmFsc2UsIHRydWUgLi4uXS4gV2l0aCB3cmFwcGVkIHNjcm9sbGluZyB3ZSBjYW4gaGF2ZSBhXG4gIC8vIHNpbWlsYXIgc2VxdWVuY2UsIHdpdGggbWFueSBtb3JlIG1peGVkIHRydWUgYW5kIGZhbHNlIGluIHRoZSBtaWRkbGUuXG4gIC8vXG4gIC8vIFNvIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBiaW5hcnkgc2VhcmNoIHlpZWxkcyB0aGUgaW5kZXggb2YgdGhlXG4gIC8vIGZpcnN0IHZpc2libGUgZWxlbWVudC4gSXQgY291bGQgaGF2ZSBiZWVuIGFueSBvZiB0aGUgb3RoZXIgdmlzaWJsZSBlbGVtZW50c1xuICAvLyB0aGF0IHdlcmUgcHJlY2VkZWQgYnkgYSBoaWRkZW4gZWxlbWVudC5cblxuICAvLyBPZiBjb3Vyc2UsIGlmIGVpdGhlciB0aGlzIGVsZW1lbnQgb3IgdGhlIHByZXZpb3VzIChoaWRkZW4pIGVsZW1lbnQgaXMgYWxzb1xuICAvLyB0aGUgZmlyc3QgZWxlbWVudCwgdGhlcmUncyBub3RoaW5nIHRvIHdvcnJ5IGFib3V0LlxuICBpZiAoaW5kZXggPCAyKSB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgLy8gVGhhdCBhc2lkZSwgdGhlIHBvc3NpYmxlIGNhc2VzIGFyZSByZXByZXNlbnRlZCBiZWxvdy5cbiAgLy9cbiAgLy8gICAgICoqKiogID0gZnVsbHkgaGlkZGVuXG4gIC8vICAgICBBKkIqICA9IG1peCBvZiBwYXJ0aWFsbHkgdmlzaWJsZSBhbmQvb3IgaGlkZGVuIHBhZ2VzXG4gIC8vICAgICBDREVGICA9IGZ1bGx5IHZpc2libGVcbiAgLy9cbiAgLy8gKDEpIEJpbmFyeSBzZWFyY2ggY291bGQgaGF2ZSByZXR1cm5lZCBBLCBpbiB3aGljaCBjYXNlIHdlIGNhbiBzdG9wLlxuICAvLyAoMikgQmluYXJ5IHNlYXJjaCBjb3VsZCBhbHNvIGhhdmUgcmV0dXJuZWQgQiwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIHRvXG4gIC8vIGNoZWNrIHRoZSB3aG9sZSByb3cuXG4gIC8vICgzKSBCaW5hcnkgc2VhcmNoIGNvdWxkIGFsc28gaGF2ZSByZXR1cm5lZCBDLCBpbiB3aGljaCBjYXNlIHdlIG5lZWQgdG9cbiAgLy8gY2hlY2sgdGhlIHdob2xlIHByZXZpb3VzIHJvdy5cbiAgLy9cbiAgLy8gVGhlcmUncyBvbmUgb3RoZXIgcG9zc2liaWxpdHk6XG4gIC8vXG4gIC8vICAgICAqKioqICA9IGZ1bGx5IGhpZGRlblxuICAvLyAgICAgQUJDRCAgPSBtaXggb2YgZnVsbHkgYW5kL29yIHBhcnRpYWxseSB2aXNpYmxlIHBhZ2VzXG4gIC8vXG4gIC8vICg0KSBCaW5hcnkgc2VhcmNoIGNvdWxkIG9ubHkgaGF2ZSByZXR1cm5lZCBBLlxuXG4gIC8vIEluaXRpYWxseSBhc3N1bWUgdGhhdCB3ZSBuZWVkIHRvIGZpbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCByb3dcbiAgLy8gKGNhc2UgMSwgMiwgb3IgNCksIHdoaWNoIG1lYW5zIGZpbmRpbmcgYSBwYWdlIHRoYXQgaXMgYWJvdmUgdGhlIGN1cnJlbnRcbiAgLy8gcGFnZSdzIHRvcC4gSWYgdGhlIGZvdW5kIHBhZ2UgaXMgcGFydGlhbGx5IHZpc2libGUsIHdlJ3JlIGRlZmluaXRlbHkgbm90IGluXG4gIC8vIGNhc2UgMywgYW5kIHRoaXMgYXNzdW1wdGlvbiBpcyBjb3JyZWN0LlxuICBsZXQgZWx0ID0gdmlld3NbaW5kZXhdLmRpdjtcbiAgbGV0IHBhZ2VUb3AgPSBlbHQub2Zmc2V0VG9wICsgZWx0LmNsaWVudFRvcDtcblxuICBpZiAocGFnZVRvcCA+PSB0b3ApIHtcbiAgICAvLyBUaGUgZm91bmQgcGFnZSBpcyBmdWxseSB2aXNpYmxlLCBzbyB3ZSdyZSBhY3R1YWxseSBlaXRoZXIgaW4gY2FzZSAzIG9yIDQsXG4gICAgLy8gYW5kIHVuZm9ydHVuYXRlbHkgd2UgY2FuJ3QgdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZW0gd2l0aG91dFxuICAgIC8vIHNjYW5uaW5nIHRoZSBlbnRpcmUgcHJldmlvdXMgcm93LCBzbyB3ZSBqdXN0IGNvbnNlcnZhdGl2ZWx5IGFzc3VtZSB0aGF0XG4gICAgLy8gd2UgZG8gbmVlZCB0byBiYWNrdHJhY2sgdG8gdGhhdCByb3cuIEluIGJvdGggY2FzZXMsIHRoZSBwcmV2aW91cyBwYWdlIGlzXG4gICAgLy8gaW4gdGhlIHByZXZpb3VzIHJvdywgc28gdXNlIGl0cyB0b3AgaW5zdGVhZC5cbiAgICBlbHQgPSB2aWV3c1tpbmRleCAtIDFdLmRpdjtcbiAgICBwYWdlVG9wID0gZWx0Lm9mZnNldFRvcCArIGVsdC5jbGllbnRUb3A7XG4gIH1cblxuICAvLyBOb3cgd2UgYmFja3RyYWNrIHRvIHRoZSBmaXJzdCBwYWdlIHRoYXQgc3RpbGwgaGFzIGl0cyBib3R0b20gYmVsb3dcbiAgLy8gYHBhZ2VUb3BgLCB3aGljaCBpcyB0aGUgdG9wIG9mIGEgcGFnZSBpbiB0aGUgZmlyc3QgdmlzaWJsZSByb3cgKHVubGVzc1xuICAvLyB3ZSdyZSBpbiBjYXNlIDQsIGluIHdoaWNoIGNhc2UgaXQncyB0aGUgcm93IGJlZm9yZSB0aGF0KS5cbiAgLy8gYGluZGV4YCBpcyBmb3VuZCBieSBiaW5hcnkgc2VhcmNoLCBzbyB0aGUgcGFnZSBhdCBgaW5kZXggLSAxYCBpc1xuICAvLyBpbnZpc2libGUgYW5kIHdlIGNhbiBzdGFydCBsb29raW5nIGZvciBwb3RlbnRpYWxseSB2aXNpYmxlIHBhZ2VzIGZyb21cbiAgLy8gYGluZGV4IC0gMmAuIChIb3dldmVyLCBpZiB0aGlzIGxvb3AgdGVybWluYXRlcyBvbiBpdHMgZmlyc3QgaXRlcmF0aW9uLFxuICAvLyB3aGljaCBpcyB0aGUgY2FzZSB3aGVuIHBhZ2VzIGFyZSBzdGFja2VkIHZlcnRpY2FsbHksIGBpbmRleGAgc2hvdWxkIHJlbWFpblxuICAvLyB1bmNoYW5nZWQsIHNvIHdlIHVzZSBhIGRpc3RpbmN0IGxvb3AgdmFyaWFibGUuKVxuICBmb3IgKGxldCBpID0gaW5kZXggLSAyOyBpID49IDA7IC0taSkge1xuICAgIGVsdCA9IHZpZXdzW2ldLmRpdjtcbiAgICBpZiAoZWx0Lm9mZnNldFRvcCArIGVsdC5jbGllbnRUb3AgKyBlbHQuY2xpZW50SGVpZ2h0IDw9IHBhZ2VUb3ApIHtcbiAgICAgIC8vIFdlIGhhdmUgcmVhY2hlZCB0aGUgcHJldmlvdXMgcm93LCBzbyBzdG9wIG5vdy5cbiAgICAgIC8vIFRoaXMgbG9vcCBpcyBleHBlY3RlZCB0byB0ZXJtaW5hdGUgcmVsYXRpdmVseSBxdWlja2x5IGJlY2F1c2UgdGhlXG4gICAgICAvLyBudW1iZXIgb2YgcGFnZXMgcGVyIHJvdyBpcyBleHBlY3RlZCB0byBiZSBzbWFsbC5cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpbmRleCA9IGk7XG4gIH1cbiAgcmV0dXJuIGluZGV4O1xufVxuXG4vKipcbiAqIEdlbmVyaWMgaGVscGVyIHRvIGZpbmQgb3V0IHdoYXQgZWxlbWVudHMgYXJlIHZpc2libGUgd2l0aGluIGEgc2Nyb2xsIHBhbmUuXG4gKlxuICogV2VsbCwgcHJldHR5IGdlbmVyaWMuIFRoZXJlIGFyZSBzb21lIGFzc3VtcHRpb25zIHBsYWNlZCBvbiB0aGUgZWxlbWVudHNcbiAqIHJlZmVyZW5jZWQgYnkgYHZpZXdzYDpcbiAqICAgLSBJZiBgaG9yaXpvbnRhbGAsIG5vIGxlZnQgb2YgYW55IGVhcmxpZXIgZWxlbWVudCBpcyB0byB0aGUgcmlnaHQgb2YgdGhlXG4gKiAgICAgbGVmdCBvZiBhbnkgbGF0ZXIgZWxlbWVudC5cbiAqICAgLSBPdGhlcndpc2UsIGB2aWV3c2AgY2FuIGJlIHNwbGl0IGludG8gY29udGlndW91cyByb3dzIHdoZXJlLCB3aXRoaW4gYSByb3csXG4gKiAgICAgbm8gdG9wIG9mIGFueSBlbGVtZW50IGlzIGJlbG93IHRoZSBib3R0b20gb2YgYW55IG90aGVyIGVsZW1lbnQsIGFuZFxuICogICAgIGJldHdlZW4gcm93cywgbm8gYm90dG9tIG9mIGFueSBlbGVtZW50IGluIGFuIGVhcmxpZXIgcm93IGlzIGJlbG93IHRoZVxuICogICAgIHRvcCBvZiBhbnkgZWxlbWVudCBpbiBhIGxhdGVyIHJvdy5cbiAqXG4gKiAoSGVyZSwgdG9wLCBsZWZ0LCBldGMuIGFsbCByZWZlciB0byB0aGUgcGFkZGluZyBlZGdlIG9mIHRoZSBlbGVtZW50IGluXG4gKiBxdWVzdGlvbi4gRm9yIHBhZ2VzLCB0aGF0IGVuZHMgdXAgYmVpbmcgZXF1aXZhbGVudCB0byB0aGUgYm91bmRpbmcgYm94IG9mIHRoZVxuICogcmVuZGVyaW5nIGNhbnZhcy4gRWFybGllciBhbmQgbGF0ZXIgcmVmZXIgdG8gaW5kZXggaW4gYHZpZXdzYCwgbm90IHBhZ2VcbiAqIGxheW91dC4pXG4gKlxuICogQHBhcmFtIHNjcm9sbEVsIHtIVE1MRWxlbWVudH0gLSBhIGNvbnRhaW5lciB0aGF0IGNhbiBwb3NzaWJseSBzY3JvbGxcbiAqIEBwYXJhbSB2aWV3cyB7QXJyYXl9IC0gb2JqZWN0cyB3aXRoIGEgYGRpdmAgcHJvcGVydHkgdGhhdCBjb250YWlucyBhblxuICogICBIVE1MRWxlbWVudCwgd2hpY2ggc2hvdWxkIGFsbCBiZSBkZXNjZW5kZW50cyBvZiBgc2Nyb2xsRWxgIHNhdGlzZnlpbmcgdGhlXG4gKiAgIGFib3ZlIGxheW91dCBhc3N1bXB0aW9uc1xuICogQHBhcmFtIHNvcnRCeVZpc2liaWxpdHkge2Jvb2xlYW59IC0gaWYgdHJ1ZSwgdGhlIHJldHVybmVkIGVsZW1lbnRzIGFyZSBzb3J0ZWRcbiAqICAgaW4gZGVzY2VuZGluZyBvcmRlciBvZiB0aGUgcGVyY2VudCBvZiB0aGVpciBwYWRkaW5nIGJveCB0aGF0IGlzIHZpc2libGVcbiAqIEBwYXJhbSBob3Jpem9udGFsIHtib29sZWFufSAtIGlmIHRydWUsIHRoZSBlbGVtZW50cyBhcmUgYXNzdW1lZCB0byBiZSBsYWlkXG4gKiAgIG91dCBob3Jpem9udGFsbHkgaW5zdGVhZCBvZiB2ZXJ0aWNhbGx5XG4gKiBAcmV0dXJucyB7T2JqZWN0fSBgeyBmaXJzdCwgbGFzdCwgdmlld3M6IFt7IGlkLCB4LCB5LCB2aWV3LCBwZXJjZW50IH1dIH1gXG4gKi9cbmZ1bmN0aW9uIGdldFZpc2libGVFbGVtZW50cyhcbiAgc2Nyb2xsRWwsXG4gIHZpZXdzLFxuICBzb3J0QnlWaXNpYmlsaXR5ID0gZmFsc2UsXG4gIGhvcml6b250YWwgPSBmYWxzZVxuKSB7XG4gIGNvbnN0IHRvcCA9IHNjcm9sbEVsLnNjcm9sbFRvcCxcbiAgICBib3R0b20gPSB0b3AgKyBzY3JvbGxFbC5jbGllbnRIZWlnaHQ7XG4gIGNvbnN0IGxlZnQgPSBzY3JvbGxFbC5zY3JvbGxMZWZ0LFxuICAgIHJpZ2h0ID0gbGVmdCArIHNjcm9sbEVsLmNsaWVudFdpZHRoO1xuXG4gIC8vIFRocm91Z2hvdXQgdGhpcyBcImdlbmVyaWNcIiBmdW5jdGlvbiwgY29tbWVudHMgd2lsbCBhc3N1bWUgd2UncmUgd29ya2luZyB3aXRoXG4gIC8vIFBERiBkb2N1bWVudCBwYWdlcywgd2hpY2ggaXMgdGhlIG1vc3QgaW1wb3J0YW50IGFuZCBjb21wbGV4IGNhc2UuIEluIHRoaXNcbiAgLy8gY2FzZSwgdGhlIHZpc2libGUgZWxlbWVudHMgd2UncmUgYWN0dWFsbHkgaW50ZXJlc3RlZCBpcyB0aGUgcGFnZSBjYW52YXMsXG4gIC8vIHdoaWNoIGlzIGNvbnRhaW5lZCBpbiBhIHdyYXBwZXIgd2hpY2ggYWRkcyBubyBwYWRkaW5nL2JvcmRlci9tYXJnaW4sIHdoaWNoXG4gIC8vIGlzIGl0c2VsZiBjb250YWluZWQgaW4gYHZpZXcuZGl2YCB3aGljaCBhZGRzIG5vIHBhZGRpbmcgKGJ1dCBkb2VzIGFkZCBhXG4gIC8vIGJvcmRlcikuIFNvLCBhcyBzcGVjaWZpZWQgaW4gdGhpcyBmdW5jdGlvbidzIGRvYyBjb21tZW50LCB0aGlzIGZ1bmN0aW9uXG4gIC8vIGRvZXMgYWxsIG9mIGl0cyB3b3JrIG9uIHRoZSBwYWRkaW5nIGVkZ2Ugb2YgdGhlIHByb3ZpZGVkIHZpZXdzLCBzdGFydGluZyBhdFxuICAvLyBvZmZzZXRMZWZ0L1RvcCAod2hpY2ggaW5jbHVkZXMgbWFyZ2luKSBhbmQgYWRkaW5nIGNsaWVudExlZnQvVG9wICh3aGljaCBpc1xuICAvLyB0aGUgYm9yZGVyKS4gQWRkaW5nIGNsaWVudFdpZHRoL0hlaWdodCBnZXRzIHVzIHRoZSBib3R0b20tcmlnaHQgY29ybmVyIG9mXG4gIC8vIHRoZSBwYWRkaW5nIGVkZ2UuXG4gIGZ1bmN0aW9uIGlzRWxlbWVudEJvdHRvbUFmdGVyVmlld1RvcCh2aWV3KSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHZpZXcuZGl2O1xuICAgIGNvbnN0IGVsZW1lbnRCb3R0b20gPVxuICAgICAgZWxlbWVudC5vZmZzZXRUb3AgKyBlbGVtZW50LmNsaWVudFRvcCArIGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIHJldHVybiBlbGVtZW50Qm90dG9tID4gdG9wO1xuICB9XG4gIGZ1bmN0aW9uIGlzRWxlbWVudFJpZ2h0QWZ0ZXJWaWV3TGVmdCh2aWV3KSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHZpZXcuZGl2O1xuICAgIGNvbnN0IGVsZW1lbnRSaWdodCA9XG4gICAgICBlbGVtZW50Lm9mZnNldExlZnQgKyBlbGVtZW50LmNsaWVudExlZnQgKyBlbGVtZW50LmNsaWVudFdpZHRoO1xuICAgIHJldHVybiBlbGVtZW50UmlnaHQgPiBsZWZ0O1xuICB9XG5cbiAgY29uc3QgdmlzaWJsZSA9IFtdLFxuICAgIG51bVZpZXdzID0gdmlld3MubGVuZ3RoO1xuICBsZXQgZmlyc3RWaXNpYmxlRWxlbWVudEluZCA9XG4gICAgbnVtVmlld3MgPT09IDBcbiAgICAgID8gMFxuICAgICAgOiBiaW5hcnlTZWFyY2hGaXJzdEl0ZW0oXG4gICAgICAgICAgdmlld3MsXG4gICAgICAgICAgaG9yaXpvbnRhbCA/IGlzRWxlbWVudFJpZ2h0QWZ0ZXJWaWV3TGVmdCA6IGlzRWxlbWVudEJvdHRvbUFmdGVyVmlld1RvcFxuICAgICAgICApO1xuXG4gIC8vIFBsZWFzZSBub3RlIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGBiaW5hcnlTZWFyY2hGaXJzdEl0ZW1gIGZ1bmN0aW9uIHdoZW5cbiAgLy8gbm8gdmFsaWQgZWxlbWVudCBpcyBmb3VuZCAoaGVuY2UgdGhlIGBmaXJzdFZpc2libGVFbGVtZW50SW5kYCBjaGVjayBiZWxvdykuXG4gIGlmIChcbiAgICBmaXJzdFZpc2libGVFbGVtZW50SW5kID4gMCAmJlxuICAgIGZpcnN0VmlzaWJsZUVsZW1lbnRJbmQgPCBudW1WaWV3cyAmJlxuICAgICFob3Jpem9udGFsXG4gICkge1xuICAgIC8vIEluIHdyYXBwZWQgc2Nyb2xsaW5nIChvciB2ZXJ0aWNhbCBzY3JvbGxpbmcgd2l0aCBzcHJlYWRzKSwgd2l0aCBzb21lIHBhZ2VcbiAgICAvLyBzaXplcywgaXNFbGVtZW50Qm90dG9tQWZ0ZXJWaWV3VG9wIGRvZXNuJ3Qgc2F0aXNmeSB0aGUgYmluYXJ5IHNlYXJjaFxuICAgIC8vIGNvbmRpdGlvbjogdGhlcmUgY2FuIGJlIHBhZ2VzIHdpdGggYm90dG9tcyBhYm92ZSB0aGUgdmlldyB0b3AgYmV0d2VlblxuICAgIC8vIHBhZ2VzIHdpdGggYm90dG9tcyBiZWxvdy4gVGhpcyBmdW5jdGlvbiBkZXRlY3RzIGFuZCBjb3JyZWN0cyB0aGF0IGVycm9yO1xuICAgIC8vIHNlZSBpdCBmb3IgbW9yZSBjb21tZW50cy5cbiAgICBmaXJzdFZpc2libGVFbGVtZW50SW5kID0gYmFja3RyYWNrQmVmb3JlQWxsVmlzaWJsZUVsZW1lbnRzKFxuICAgICAgZmlyc3RWaXNpYmxlRWxlbWVudEluZCxcbiAgICAgIHZpZXdzLFxuICAgICAgdG9wXG4gICAgKTtcbiAgfVxuXG4gIC8vIGxhc3RFZGdlIGFjdHMgYXMgYSBjdXRvZmYgZm9yIHVzIHRvIHN0b3AgbG9vcGluZywgYmVjYXVzZSB3ZSBrbm93IGFsbFxuICAvLyBzdWJzZXF1ZW50IHBhZ2VzIHdpbGwgYmUgaGlkZGVuLlxuICAvL1xuICAvLyBXaGVuIHVzaW5nIHdyYXBwZWQgc2Nyb2xsaW5nIG9yIHZlcnRpY2FsIHNjcm9sbGluZyB3aXRoIHNwcmVhZHMsIHdlIGNhbid0XG4gIC8vIHNpbXBseSBzdG9wIHRoZSBmaXJzdCB0aW1lIHdlIHJlYWNoIGEgcGFnZSBiZWxvdyB0aGUgYm90dG9tIG9mIHRoZSB2aWV3O1xuICAvLyB0aGUgdG9wcyBvZiBzdWJzZXF1ZW50IHBhZ2VzIG9uIHRoZSBzYW1lIHJvdyBjb3VsZCBzdGlsbCBiZSB2aXNpYmxlLiBJblxuICAvLyBob3Jpem9udGFsIHNjcm9sbGluZywgd2UgZG9uJ3QgaGF2ZSB0aGF0IGlzc3VlLCBzbyB3ZSBjYW4gc3RvcCBhcyBzb29uIGFzXG4gIC8vIHdlIHBhc3MgYHJpZ2h0YCwgd2l0aG91dCBuZWVkaW5nIHRoZSBjb2RlIGJlbG93IHRoYXQgaGFuZGxlcyB0aGUgLTEgY2FzZS5cbiAgbGV0IGxhc3RFZGdlID0gaG9yaXpvbnRhbCA/IHJpZ2h0IDogLTE7XG5cbiAgZm9yIChsZXQgaSA9IGZpcnN0VmlzaWJsZUVsZW1lbnRJbmQ7IGkgPCBudW1WaWV3czsgaSsrKSB7XG4gICAgY29uc3QgdmlldyA9IHZpZXdzW2ldLFxuICAgICAgZWxlbWVudCA9IHZpZXcuZGl2O1xuICAgIGNvbnN0IGN1cnJlbnRXaWR0aCA9IGVsZW1lbnQub2Zmc2V0TGVmdCArIGVsZW1lbnQuY2xpZW50TGVmdDtcbiAgICBjb25zdCBjdXJyZW50SGVpZ2h0ID0gZWxlbWVudC5vZmZzZXRUb3AgKyBlbGVtZW50LmNsaWVudFRvcDtcbiAgICBjb25zdCB2aWV3V2lkdGggPSBlbGVtZW50LmNsaWVudFdpZHRoLFxuICAgICAgdmlld0hlaWdodCA9IGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICAgIGNvbnN0IHZpZXdSaWdodCA9IGN1cnJlbnRXaWR0aCArIHZpZXdXaWR0aDtcbiAgICBjb25zdCB2aWV3Qm90dG9tID0gY3VycmVudEhlaWdodCArIHZpZXdIZWlnaHQ7XG5cbiAgICBpZiAobGFzdEVkZ2UgPT09IC0xKSB7XG4gICAgICAvLyBBcyBjb21tZW50ZWQgYWJvdmUsIHRoaXMgaXMgb25seSBuZWVkZWQgaW4gbm9uLWhvcml6b250YWwgY2FzZXMuXG4gICAgICAvLyBTZXR0aW5nIGxhc3RFZGdlIHRvIHRoZSBib3R0b20gb2YgdGhlIGZpcnN0IHBhZ2UgdGhhdCBpcyBwYXJ0aWFsbHlcbiAgICAgIC8vIHZpc2libGUgZW5zdXJlcyB0aGF0IHRoZSBuZXh0IHBhZ2UgZnVsbHkgYmVsb3cgbGFzdEVkZ2UgaXMgb24gdGhlXG4gICAgICAvLyBuZXh0IHJvdywgd2hpY2ggaGFzIHRvIGJlIGZ1bGx5IGhpZGRlbiBhbG9uZyB3aXRoIGFsbCBzdWJzZXF1ZW50IHJvd3MuXG4gICAgICBpZiAodmlld0JvdHRvbSA+PSBib3R0b20pIHtcbiAgICAgICAgbGFzdEVkZ2UgPSB2aWV3Qm90dG9tO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoKGhvcml6b250YWwgPyBjdXJyZW50V2lkdGggOiBjdXJyZW50SGVpZ2h0KSA+IGxhc3RFZGdlKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB2aWV3Qm90dG9tIDw9IHRvcCB8fFxuICAgICAgY3VycmVudEhlaWdodCA+PSBib3R0b20gfHxcbiAgICAgIHZpZXdSaWdodCA8PSBsZWZ0IHx8XG4gICAgICBjdXJyZW50V2lkdGggPj0gcmlnaHRcbiAgICApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGhpZGRlbkhlaWdodCA9XG4gICAgICBNYXRoLm1heCgwLCB0b3AgLSBjdXJyZW50SGVpZ2h0KSArIE1hdGgubWF4KDAsIHZpZXdCb3R0b20gLSBib3R0b20pO1xuICAgIGNvbnN0IGhpZGRlbldpZHRoID1cbiAgICAgIE1hdGgubWF4KDAsIGxlZnQgLSBjdXJyZW50V2lkdGgpICsgTWF0aC5tYXgoMCwgdmlld1JpZ2h0IC0gcmlnaHQpO1xuICAgIGNvbnN0IHBlcmNlbnQgPVxuICAgICAgKCgodmlld0hlaWdodCAtIGhpZGRlbkhlaWdodCkgKiAodmlld1dpZHRoIC0gaGlkZGVuV2lkdGgpICogMTAwKSAvXG4gICAgICAgIHZpZXdIZWlnaHQgL1xuICAgICAgICB2aWV3V2lkdGgpIHxcbiAgICAgIDA7XG4gICAgdmlzaWJsZS5wdXNoKHtcbiAgICAgIGlkOiB2aWV3LmlkLFxuICAgICAgeDogY3VycmVudFdpZHRoLFxuICAgICAgeTogY3VycmVudEhlaWdodCxcbiAgICAgIHZpZXcsXG4gICAgICBwZXJjZW50LFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgZmlyc3QgPSB2aXNpYmxlWzBdLFxuICAgIGxhc3QgPSB2aXNpYmxlW3Zpc2libGUubGVuZ3RoIC0gMV07XG5cbiAgaWYgKHNvcnRCeVZpc2liaWxpdHkpIHtcbiAgICB2aXNpYmxlLnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgICAgY29uc3QgcGMgPSBhLnBlcmNlbnQgLSBiLnBlcmNlbnQ7XG4gICAgICBpZiAoTWF0aC5hYnMocGMpID4gMC4wMDEpIHtcbiAgICAgICAgcmV0dXJuIC1wYztcbiAgICAgIH1cbiAgICAgIHJldHVybiBhLmlkIC0gYi5pZDsgLy8gZW5zdXJlIHN0YWJpbGl0eVxuICAgIH0pO1xuICB9XG4gIHJldHVybiB7IGZpcnN0LCBsYXN0LCB2aWV3czogdmlzaWJsZSB9O1xufVxuXG4vKipcbiAqIEV2ZW50IGhhbmRsZXIgdG8gc3VwcHJlc3MgY29udGV4dCBtZW51LlxuICovXG5mdW5jdGlvbiBub0NvbnRleHRNZW51SGFuZGxlcihldnQpIHtcbiAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG59XG5cbmZ1bmN0aW9uIGlzRGF0YVNjaGVtYSh1cmwpIHtcbiAgbGV0IGkgPSAwO1xuICBjb25zdCBpaSA9IHVybC5sZW5ndGg7XG4gIHdoaWxlIChpIDwgaWkgJiYgdXJsW2ldLnRyaW0oKSA9PT0gXCJcIikge1xuICAgIGkrKztcbiAgfVxuICByZXR1cm4gdXJsLnN1YnN0cmluZyhpLCBpICsgNSkudG9Mb3dlckNhc2UoKSA9PT0gXCJkYXRhOlwiO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGZpbGVuYW1lIG9yIGd1ZXNzZWQgZmlsZW5hbWUgZnJvbSB0aGUgdXJsIChzZWUgaXNzdWUgMzQ1NSkuXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIG9yaWdpbmFsIFBERiBsb2NhdGlvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkZWZhdWx0RmlsZW5hbWUgLSBUaGUgdmFsdWUgcmV0dXJuZWQgaWYgdGhlIGZpbGVuYW1lIGlzXG4gKiAgIHVua25vd24sIG9yIHRoZSBwcm90b2NvbCBpcyB1bnN1cHBvcnRlZC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IEd1ZXNzZWQgUERGIGZpbGVuYW1lLlxuICovXG5mdW5jdGlvbiBnZXRQREZGaWxlTmFtZUZyb21VUkwodXJsLCBkZWZhdWx0RmlsZW5hbWUgPSBcImRvY3VtZW50LnBkZlwiKSB7XG4gIGlmICh0eXBlb2YgdXJsICE9PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRGaWxlbmFtZTtcbiAgfVxuICBpZiAoaXNEYXRhU2NoZW1hKHVybCkpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBcImdldFBERkZpbGVOYW1lRnJvbVVSTDogXCIgK1xuICAgICAgICAnaWdub3JpbmcgXCJkYXRhOlwiIFVSTCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4nXG4gICAgKTtcbiAgICByZXR1cm4gZGVmYXVsdEZpbGVuYW1lO1xuICB9XG4gIGNvbnN0IHJlVVJJID0gL14oPzooPzpbXjpdKzopP1xcL1xcL1teXFwvXSspPyhbXj8jXSopKFxcP1teI10qKT8oIy4qKT8kLztcbiAgLy8gICAgICAgICAgICBTQ0hFTUUgICAgICAgIEhPU1QgICAgICAgICAxLlBBVEggIDIuUVVFUlkgICAzLlJFRlxuICAvLyBQYXR0ZXJuIHRvIGdldCBsYXN0IG1hdGNoaW5nIE5BTUUucGRmXG4gIGNvbnN0IHJlRmlsZW5hbWUgPSAvW15cXC8/Iz1dK1xcLnBkZlxcYig/IS4qXFwucGRmXFxiKS9pO1xuICBjb25zdCBzcGxpdFVSSSA9IHJlVVJJLmV4ZWModXJsKTtcbiAgbGV0IHN1Z2dlc3RlZEZpbGVuYW1lID1cbiAgICByZUZpbGVuYW1lLmV4ZWMoc3BsaXRVUklbMV0pIHx8XG4gICAgcmVGaWxlbmFtZS5leGVjKHNwbGl0VVJJWzJdKSB8fFxuICAgIHJlRmlsZW5hbWUuZXhlYyhzcGxpdFVSSVszXSk7XG4gIGlmIChzdWdnZXN0ZWRGaWxlbmFtZSkge1xuICAgIHN1Z2dlc3RlZEZpbGVuYW1lID0gc3VnZ2VzdGVkRmlsZW5hbWVbMF07XG4gICAgaWYgKHN1Z2dlc3RlZEZpbGVuYW1lLmluY2x1ZGVzKFwiJVwiKSkge1xuICAgICAgLy8gVVJMLWVuY29kZWQgJTJGcGF0aCUyRnRvJTJGZmlsZS5wZGYgc2hvdWxkIGJlIGZpbGUucGRmXG4gICAgICB0cnkge1xuICAgICAgICBzdWdnZXN0ZWRGaWxlbmFtZSA9IHJlRmlsZW5hbWUuZXhlYyhcbiAgICAgICAgICBkZWNvZGVVUklDb21wb25lbnQoc3VnZ2VzdGVkRmlsZW5hbWUpXG4gICAgICAgIClbMF07XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAvLyBQb3NzaWJsZSAoZXh0cmVtZWx5IHJhcmUpIGVycm9yczpcbiAgICAgICAgLy8gVVJJRXJyb3IgXCJNYWxmb3JtZWQgVVJJXCIsIGUuZy4gZm9yIFwiJUFBLnBkZlwiXG4gICAgICAgIC8vIFR5cGVFcnJvciBcIm51bGwgaGFzIG5vIHByb3BlcnRpZXNcIiwgZS5nLiBmb3IgXCIlMkYucGRmXCJcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN1Z2dlc3RlZEZpbGVuYW1lIHx8IGRlZmF1bHRGaWxlbmFtZTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplV2hlZWxFdmVudERlbHRhKGV2dCkge1xuICBsZXQgZGVsdGEgPSBNYXRoLnNxcnQoZXZ0LmRlbHRhWCAqIGV2dC5kZWx0YVggKyBldnQuZGVsdGFZICogZXZ0LmRlbHRhWSk7XG4gIGNvbnN0IGFuZ2xlID0gTWF0aC5hdGFuMihldnQuZGVsdGFZLCBldnQuZGVsdGFYKTtcbiAgaWYgKC0wLjI1ICogTWF0aC5QSSA8IGFuZ2xlICYmIGFuZ2xlIDwgMC43NSAqIE1hdGguUEkpIHtcbiAgICAvLyBBbGwgdGhhdCBpcyBsZWZ0LXVwIG9yaWVudGVkIGhhcyB0byBjaGFuZ2UgdGhlIHNpZ24uXG4gICAgZGVsdGEgPSAtZGVsdGE7XG4gIH1cblxuICBjb25zdCBNT1VTRV9ET01fREVMVEFfUElYRUxfTU9ERSA9IDA7XG4gIGNvbnN0IE1PVVNFX0RPTV9ERUxUQV9MSU5FX01PREUgPSAxO1xuICBjb25zdCBNT1VTRV9QSVhFTFNfUEVSX0xJTkUgPSAzMDtcbiAgY29uc3QgTU9VU0VfTElORVNfUEVSX1BBR0UgPSAzMDtcblxuICAvLyBDb252ZXJ0cyBkZWx0YSB0byBwZXItcGFnZSB1bml0c1xuICBpZiAoZXZ0LmRlbHRhTW9kZSA9PT0gTU9VU0VfRE9NX0RFTFRBX1BJWEVMX01PREUpIHtcbiAgICBkZWx0YSAvPSBNT1VTRV9QSVhFTFNfUEVSX0xJTkUgKiBNT1VTRV9MSU5FU19QRVJfUEFHRTtcbiAgfSBlbHNlIGlmIChldnQuZGVsdGFNb2RlID09PSBNT1VTRV9ET01fREVMVEFfTElORV9NT0RFKSB7XG4gICAgZGVsdGEgLz0gTU9VU0VfTElORVNfUEVSX1BBR0U7XG4gIH1cbiAgcmV0dXJuIGRlbHRhO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkUm90YXRpb24oYW5nbGUpIHtcbiAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIoYW5nbGUpICYmIGFuZ2xlICUgOTAgPT09IDA7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRTY3JvbGxNb2RlKG1vZGUpIHtcbiAgcmV0dXJuIChcbiAgICBOdW1iZXIuaXNJbnRlZ2VyKG1vZGUpICYmXG4gICAgT2JqZWN0LnZhbHVlcyhTY3JvbGxNb2RlKS5pbmNsdWRlcyhtb2RlKSAmJlxuICAgIG1vZGUgIT09IFNjcm9sbE1vZGUuVU5LTk9XTlxuICApO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkU3ByZWFkTW9kZShtb2RlKSB7XG4gIHJldHVybiAoXG4gICAgTnVtYmVyLmlzSW50ZWdlcihtb2RlKSAmJlxuICAgIE9iamVjdC52YWx1ZXMoU3ByZWFkTW9kZSkuaW5jbHVkZXMobW9kZSkgJiZcbiAgICBtb2RlICE9PSBTcHJlYWRNb2RlLlVOS05PV05cbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNQb3J0cmFpdE9yaWVudGF0aW9uKHNpemUpIHtcbiAgcmV0dXJuIHNpemUud2lkdGggPD0gc2l6ZS5oZWlnaHQ7XG59XG5cbmNvbnN0IFdhaXRPblR5cGUgPSB7XG4gIEVWRU5UOiBcImV2ZW50XCIsXG4gIFRJTUVPVVQ6IFwidGltZW91dFwiLFxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXYWl0T25FdmVudE9yVGltZW91dFBhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB0YXJnZXQgLSBUaGUgZXZlbnQgdGFyZ2V0LCBjYW4gZm9yIGV4YW1wbGUgYmU6XG4gKiAgIGB3aW5kb3dgLCBgZG9jdW1lbnRgLCBhIERPTSBlbGVtZW50LCBvciBhbiB7RXZlbnRCdXN9IGluc3RhbmNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gKiBAcHJvcGVydHkge251bWJlcn0gZGVsYXkgLSBUaGUgZGVsYXksIGluIG1pbGxpc2Vjb25kcywgYWZ0ZXIgd2hpY2ggdGhlXG4gKiAgIHRpbWVvdXQgb2NjdXJzIChpZiB0aGUgZXZlbnQgd2Fzbid0IGFscmVhZHkgZGlzcGF0Y2hlZCkuXG4gKi9cblxuLyoqXG4gKiBBbGxvd3Mgd2FpdGluZyBmb3IgYW4gZXZlbnQgb3IgYSB0aW1lb3V0LCB3aGljaGV2ZXIgb2NjdXJzIGZpcnN0LlxuICogQ2FuIGJlIHVzZWQgdG8gZW5zdXJlIHRoYXQgYW4gYWN0aW9uIGFsd2F5cyBvY2N1cnMsIGV2ZW4gd2hlbiBhbiBldmVudFxuICogYXJyaXZlcyBsYXRlIG9yIG5vdCBhdCBhbGwuXG4gKlxuICogQHBhcmFtIHtXYWl0T25FdmVudE9yVGltZW91dFBhcmFtZXRlcnN9XG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2l0aCBhIHtXYWl0T25UeXBlfSB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gd2FpdE9uRXZlbnRPclRpbWVvdXQoeyB0YXJnZXQsIG5hbWUsIGRlbGF5ID0gMCB9KSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgdGFyZ2V0ICE9PSBcIm9iamVjdFwiIHx8XG4gICAgICAhKG5hbWUgJiYgdHlwZW9mIG5hbWUgPT09IFwic3RyaW5nXCIpIHx8XG4gICAgICAhKE51bWJlci5pc0ludGVnZXIoZGVsYXkpICYmIGRlbGF5ID49IDApXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ3YWl0T25FdmVudE9yVGltZW91dCAtIGludmFsaWQgcGFyYW1ldGVycy5cIik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlcih0eXBlKSB7XG4gICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRXZlbnRCdXMpIHtcbiAgICAgICAgdGFyZ2V0Lm9mZihuYW1lLCBldmVudEhhbmRsZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgZXZlbnRIYW5kbGVyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZSh0eXBlKTtcbiAgICB9XG5cbiAgICBjb25zdCBldmVudEhhbmRsZXIgPSBoYW5kbGVyLmJpbmQobnVsbCwgV2FpdE9uVHlwZS5FVkVOVCk7XG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEV2ZW50QnVzKSB7XG4gICAgICB0YXJnZXQub24obmFtZSwgZXZlbnRIYW5kbGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIobmFtZSwgZXZlbnRIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBjb25zdCB0aW1lb3V0SGFuZGxlciA9IGhhbmRsZXIuYmluZChudWxsLCBXYWl0T25UeXBlLlRJTUVPVVQpO1xuICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KHRpbWVvdXRIYW5kbGVyLCBkZWxheSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIERPTSB3aW5kb3cgYmVjb21lcyB2aXNpYmxlLlxuICovXG5jb25zdCBhbmltYXRpb25TdGFydGVkID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSkge1xuICBpZiAoXG4gICAgdHlwZW9mIFBERkpTRGV2ICE9PSBcInVuZGVmaW5lZFwiICYmXG4gICAgUERGSlNEZXYudGVzdChcIkxJQlwiKSAmJlxuICAgIHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCJcbiAgKSB7XG4gICAgLy8gUHJldmVudCBcIlJlZmVyZW5jZUVycm9yOiB3aW5kb3cgaXMgbm90IGRlZmluZWRcIiBlcnJvcnMgd2hlbiBydW5uaW5nIHRoZVxuICAgIC8vIHVuaXQtdGVzdHMgaW4gTm9kZS5qcy9UcmF2aXMuXG4gICAgc2V0VGltZW91dChyZXNvbHZlLCAyMCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVzb2x2ZSk7XG59KTtcblxuLyoqXG4gKiBTaW1wbGUgZXZlbnQgYnVzIGZvciBhbiBhcHBsaWNhdGlvbi4gTGlzdGVuZXJzIGFyZSBhdHRhY2hlZCB1c2luZyB0aGVcbiAqIGBvbmAgYW5kIGBvZmZgIG1ldGhvZHMuIFRvIHJhaXNlIGFuIGV2ZW50LCB0aGUgYGRpc3BhdGNoYCBtZXRob2Qgc2hhbGwgYmVcbiAqIHVzZWQuXG4gKi9cbmNsYXNzIEV2ZW50QnVzIHtcbiAgY29uc3RydWN0b3IoeyBkaXNwYXRjaFRvRE9NID0gZmFsc2UgfSA9IHt9KSB7XG4gICAgdGhpcy5fbGlzdGVuZXJzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICB0aGlzLl9kaXNwYXRjaFRvRE9NID0gZGlzcGF0Y2hUb0RPTSA9PT0gdHJ1ZTtcbiAgfVxuXG4gIG9uKGV2ZW50TmFtZSwgbGlzdGVuZXIpIHtcbiAgICBsZXQgZXZlbnRMaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnNbZXZlbnROYW1lXTtcbiAgICBpZiAoIWV2ZW50TGlzdGVuZXJzKSB7XG4gICAgICBldmVudExpc3RlbmVycyA9IFtdO1xuICAgICAgdGhpcy5fbGlzdGVuZXJzW2V2ZW50TmFtZV0gPSBldmVudExpc3RlbmVycztcbiAgICB9XG4gICAgZXZlbnRMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gIH1cblxuICBvZmYoZXZlbnROYW1lLCBsaXN0ZW5lcikge1xuICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzW2V2ZW50TmFtZV07XG4gICAgbGV0IGk7XG4gICAgaWYgKCFldmVudExpc3RlbmVycyB8fCAoaSA9IGV2ZW50TGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpKSA8IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnRMaXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICB9XG5cbiAgZGlzcGF0Y2goZXZlbnROYW1lKSB7XG4gICAgY29uc3QgZXZlbnRMaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnNbZXZlbnROYW1lXTtcbiAgICBpZiAoIWV2ZW50TGlzdGVuZXJzIHx8IGV2ZW50TGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKHRoaXMuX2Rpc3BhdGNoVG9ET00pIHtcbiAgICAgICAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoRE9NRXZlbnQoZXZlbnROYW1lLCBhcmdzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gUGFzc2luZyBhbGwgYXJndW1lbnRzIGFmdGVyIHRoZSBldmVudE5hbWUgdG8gdGhlIGxpc3RlbmVycy5cbiAgICBjb25zdCBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAvLyBNYWtpbmcgY29weSBvZiB0aGUgbGlzdGVuZXJzIGFycmF5IGluIGNhc2UgaWYgaXQgd2lsbCBiZSBtb2RpZmllZFxuICAgIC8vIGR1cmluZyBkaXNwYXRjaC5cbiAgICBldmVudExpc3RlbmVycy5zbGljZSgwKS5mb3JFYWNoKGZ1bmN0aW9uKGxpc3RlbmVyKSB7XG4gICAgICBsaXN0ZW5lci5hcHBseShudWxsLCBhcmdzKTtcbiAgICB9KTtcbiAgICBpZiAodGhpcy5fZGlzcGF0Y2hUb0RPTSkge1xuICAgICAgdGhpcy5fZGlzcGF0Y2hET01FdmVudChldmVudE5hbWUsIGFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2Rpc3BhdGNoRE9NRXZlbnQoZXZlbnROYW1lLCBhcmdzID0gbnVsbCkge1xuICAgIGNvbnN0IGRldGFpbHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgIGlmIChhcmdzICYmIGFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgb2JqID0gYXJnc1swXTtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAgICAgICBpZiAoa2V5ID09PSBcInNvdXJjZVwiKSB7XG4gICAgICAgICAgaWYgKHZhbHVlID09PSB3aW5kb3cgfHwgdmFsdWUgPT09IGRvY3VtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIE5vIG5lZWQgdG8gcmUtZGlzcGF0Y2ggKGFscmVhZHkpIGdsb2JhbCBldmVudHMuXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlOyAvLyBJZ25vcmUgdGhlIGBzb3VyY2VgIHByb3BlcnR5LlxuICAgICAgICB9XG4gICAgICAgIGRldGFpbHNba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiQ3VzdG9tRXZlbnRcIik7XG4gICAgZXZlbnQuaW5pdEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgdHJ1ZSwgdHJ1ZSwgZGV0YWlscyk7XG4gICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gIH1cbn1cblxubGV0IGdsb2JhbEV2ZW50QnVzID0gbnVsbDtcbmZ1bmN0aW9uIGdldEdsb2JhbEV2ZW50QnVzKGRpc3BhdGNoVG9ET00gPSBmYWxzZSkge1xuICBpZiAoIWdsb2JhbEV2ZW50QnVzKSB7XG4gICAgZ2xvYmFsRXZlbnRCdXMgPSBuZXcgRXZlbnRCdXMoeyBkaXNwYXRjaFRvRE9NIH0pO1xuICB9XG4gIHJldHVybiBnbG9iYWxFdmVudEJ1cztcbn1cblxuZnVuY3Rpb24gY2xhbXAodiwgbWluLCBtYXgpIHtcbiAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KHYsIG1pbiksIG1heCk7XG59XG5cbmNsYXNzIFByb2dyZXNzQmFyIHtcbiAgY29uc3RydWN0b3IoaWQsIHsgaGVpZ2h0LCB3aWR0aCwgdW5pdHMgfSA9IHt9KSB7XG4gICAgdGhpcy52aXNpYmxlID0gdHJ1ZTtcblxuICAgIC8vIEZldGNoIHRoZSBzdWItZWxlbWVudHMgZm9yIGxhdGVyLlxuICAgIHRoaXMuZGl2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihpZCArIFwiIC5wcm9ncmVzc1wiKTtcbiAgICAvLyBHZXQgdGhlIGxvYWRpbmcgYmFyIGVsZW1lbnQsIHNvIGl0IGNhbiBiZSByZXNpemVkIHRvIGZpdCB0aGUgdmlld2VyLlxuICAgIHRoaXMuYmFyID0gdGhpcy5kaXYucGFyZW50Tm9kZTtcblxuICAgIC8vIEdldCBvcHRpb25zLCB3aXRoIHNlbnNpYmxlIGRlZmF1bHRzLlxuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0IHx8IDEwMDtcbiAgICB0aGlzLndpZHRoID0gd2lkdGggfHwgMTAwO1xuICAgIHRoaXMudW5pdHMgPSB1bml0cyB8fCBcIiVcIjtcblxuICAgIC8vIEluaXRpYWxpemUgaGVpZ2h0cy5cbiAgICB0aGlzLmRpdi5zdHlsZS5oZWlnaHQgPSB0aGlzLmhlaWdodCArIHRoaXMudW5pdHM7XG4gICAgdGhpcy5wZXJjZW50ID0gMDtcbiAgfVxuXG4gIF91cGRhdGVCYXIoKSB7XG4gICAgaWYgKHRoaXMuX2luZGV0ZXJtaW5hdGUpIHtcbiAgICAgIHRoaXMuZGl2LmNsYXNzTGlzdC5hZGQoXCJpbmRldGVybWluYXRlXCIpO1xuICAgICAgdGhpcy5kaXYuc3R5bGUud2lkdGggPSB0aGlzLndpZHRoICsgdGhpcy51bml0cztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRpdi5jbGFzc0xpc3QucmVtb3ZlKFwiaW5kZXRlcm1pbmF0ZVwiKTtcbiAgICBjb25zdCBwcm9ncmVzc1NpemUgPSAodGhpcy53aWR0aCAqIHRoaXMuX3BlcmNlbnQpIC8gMTAwO1xuICAgIHRoaXMuZGl2LnN0eWxlLndpZHRoID0gcHJvZ3Jlc3NTaXplICsgdGhpcy51bml0cztcbiAgfVxuXG4gIGdldCBwZXJjZW50KCkge1xuICAgIHJldHVybiB0aGlzLl9wZXJjZW50O1xuICB9XG5cbiAgc2V0IHBlcmNlbnQodmFsKSB7XG4gICAgdGhpcy5faW5kZXRlcm1pbmF0ZSA9IGlzTmFOKHZhbCk7XG4gICAgdGhpcy5fcGVyY2VudCA9IGNsYW1wKHZhbCwgMCwgMTAwKTtcbiAgICB0aGlzLl91cGRhdGVCYXIoKTtcbiAgfVxuXG4gIHNldFdpZHRoKHZpZXdlcikge1xuICAgIGlmICghdmlld2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHZpZXdlci5wYXJlbnROb2RlO1xuICAgIGNvbnN0IHNjcm9sbGJhcldpZHRoID0gY29udGFpbmVyLm9mZnNldFdpZHRoIC0gdmlld2VyLm9mZnNldFdpZHRoO1xuICAgIGlmIChzY3JvbGxiYXJXaWR0aCA+IDApIHtcbiAgICAgIHRoaXMuYmFyLnNldEF0dHJpYnV0ZShcbiAgICAgICAgXCJzdHlsZVwiLFxuICAgICAgICBcIndpZHRoOiBjYWxjKDEwMCUgLSBcIiArIHNjcm9sbGJhcldpZHRoICsgXCJweCk7XCJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaGlkZSgpIHtcbiAgICBpZiAoIXRoaXMudmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLmJhci5jbGFzc0xpc3QuYWRkKFwiaGlkZGVuXCIpO1xuICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZShcImxvYWRpbmdJblByb2dyZXNzXCIpO1xuICB9XG5cbiAgc2hvdygpIHtcbiAgICBpZiAodGhpcy52aXNpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKFwibG9hZGluZ0luUHJvZ3Jlc3NcIik7XG4gICAgdGhpcy5iYXIuY2xhc3NMaXN0LnJlbW92ZShcImhpZGRlblwiKTtcbiAgfVxufVxuXG4vKipcbiAqIE1vdmVzIGFsbCBlbGVtZW50cyBvZiBhbiBhcnJheSB0aGF0IHNhdGlzZnkgY29uZGl0aW9uIHRvIHRoZSBlbmQgb2YgdGhlXG4gKiBhcnJheSwgcHJlc2VydmluZyB0aGUgb3JkZXIgb2YgdGhlIHJlc3QuXG4gKi9cbmZ1bmN0aW9uIG1vdmVUb0VuZE9mQXJyYXkoYXJyLCBjb25kaXRpb24pIHtcbiAgY29uc3QgbW92ZWQgPSBbXSxcbiAgICBsZW4gPSBhcnIubGVuZ3RoO1xuICBsZXQgd3JpdGUgPSAwO1xuICBmb3IgKGxldCByZWFkID0gMDsgcmVhZCA8IGxlbjsgKytyZWFkKSB7XG4gICAgaWYgKGNvbmRpdGlvbihhcnJbcmVhZF0pKSB7XG4gICAgICBtb3ZlZC5wdXNoKGFycltyZWFkXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyclt3cml0ZV0gPSBhcnJbcmVhZF07XG4gICAgICArK3dyaXRlO1xuICAgIH1cbiAgfVxuICBmb3IgKGxldCByZWFkID0gMDsgd3JpdGUgPCBsZW47ICsrcmVhZCwgKyt3cml0ZSkge1xuICAgIGFyclt3cml0ZV0gPSBtb3ZlZFtyZWFkXTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBBdXRvUHJpbnRSZWdFeHAsXG4gIENTU19VTklUUyxcbiAgREVGQVVMVF9TQ0FMRV9WQUxVRSxcbiAgREVGQVVMVF9TQ0FMRSxcbiAgTUlOX1NDQUxFLFxuICBNQVhfU0NBTEUsXG4gIFVOS05PV05fU0NBTEUsXG4gIE1BWF9BVVRPX1NDQUxFLFxuICBTQ1JPTExCQVJfUEFERElORyxcbiAgVkVSVElDQUxfUEFERElORyxcbiAgaXNWYWxpZFJvdGF0aW9uLFxuICBpc1ZhbGlkU2Nyb2xsTW9kZSxcbiAgaXNWYWxpZFNwcmVhZE1vZGUsXG4gIGlzUG9ydHJhaXRPcmllbnRhdGlvbixcbiAgUHJlc2VudGF0aW9uTW9kZVN0YXRlLFxuICBSZW5kZXJlclR5cGUsXG4gIFRleHRMYXllck1vZGUsXG4gIFNjcm9sbE1vZGUsXG4gIFNwcmVhZE1vZGUsXG4gIE51bGxMMTBuLFxuICBFdmVudEJ1cyxcbiAgZ2V0R2xvYmFsRXZlbnRCdXMsXG4gIGNsYW1wLFxuICBQcm9ncmVzc0JhcixcbiAgZ2V0UERGRmlsZU5hbWVGcm9tVVJMLFxuICBub0NvbnRleHRNZW51SGFuZGxlcixcbiAgcGFyc2VRdWVyeVN0cmluZyxcbiAgYmFja3RyYWNrQmVmb3JlQWxsVmlzaWJsZUVsZW1lbnRzLCAvLyBvbmx5IGV4cG9ydGVkIGZvciB0ZXN0aW5nXG4gIGdldFZpc2libGVFbGVtZW50cyxcbiAgcm91bmRUb0RpdmlkZSxcbiAgZ2V0UGFnZVNpemVJbmNoZXMsXG4gIGFwcHJveGltYXRlRnJhY3Rpb24sXG4gIGdldE91dHB1dFNjYWxlLFxuICBzY3JvbGxJbnRvVmlldyxcbiAgd2F0Y2hTY3JvbGwsXG4gIGJpbmFyeVNlYXJjaEZpcnN0SXRlbSxcbiAgbm9ybWFsaXplV2hlZWxFdmVudERlbHRhLFxuICBhbmltYXRpb25TdGFydGVkLFxuICBXYWl0T25UeXBlLFxuICB3YWl0T25FdmVudE9yVGltZW91dCxcbiAgbW92ZVRvRW5kT2ZBcnJheSxcbn07Il19"
  ]
}