{"version":3,"sources":["jsdelivr-header.js","webpack://__auiPrototyping/node_modules/@atlassian/fancy-file-input/dist/fancy-file-input.js","webpack://__auiPrototyping/src/js/aui/i18n-stub.js","webpack://__auiPrototyping/src/js/jquery/jquery.moveto.js","webpack://__auiPrototyping/node_modules/backbone/backbone.js","webpack://__auiPrototyping/node_modules/jquery-ui/ui/data.js","webpack://__auiPrototyping/node_modules/jquery-ui/ui/keycode.js","webpack://__auiPrototyping/node_modules/jquery-ui/ui/plugin.js","webpack://__auiPrototyping/node_modules/jquery-ui/ui/scroll-parent.js","webpack://__auiPrototyping/node_modules/jquery-ui/ui/version.js","webpack://__auiPrototyping/node_modules/jquery-ui/ui/widget.js","webpack://__auiPrototyping/node_modules/jquery-ui/ui/widgets/datepicker.js","webpack://__auiPrototyping/node_modules/jquery-ui/ui/widgets/draggable.js","webpack://__auiPrototyping/node_modules/jquery-ui/ui/widgets/mouse.js","webpack://__auiPrototyping/node_modules/jquery-ui/ui/widgets/sortable.js","webpack://__auiPrototyping/node_modules/jquery.hotkeys/jquery.hotkeys.js","webpack://__auiPrototyping/node_modules/select2/select2.js","webpack://__auiPrototyping/node_modules/skatejs-template-html/dist/template-html.js","webpack://__auiPrototyping/node_modules/skatejs/lib/constants.js","webpack://__auiPrototyping/node_modules/skatejs/lib/data.js","webpack://__auiPrototyping/node_modules/skatejs/lib/document-observer.js","webpack://__auiPrototyping/node_modules/skatejs/lib/fix-ie-innerhtml.js","webpack://__auiPrototyping/node_modules/skatejs/lib/globals.js","webpack://__auiPrototyping/node_modules/skatejs/lib/lifecycle.js","webpack://__auiPrototyping/node_modules/skatejs/lib/mutation-observer.js","webpack://__auiPrototyping/node_modules/skatejs/lib/registry.js","webpack://__auiPrototyping/node_modules/skatejs/lib/skate.js","webpack://__auiPrototyping/node_modules/skatejs/lib/utils.js","webpack://__auiPrototyping/node_modules/skatejs/lib/version.js","webpack://__auiPrototyping/node_modules/tablesorter/jquery.tablesorter.js","webpack://__auiPrototyping/src/js-vendor/jquery/serializetoobject.js","webpack://__auiPrototyping/node_modules/underscore/underscore-node-f.cjs","webpack://__auiPrototyping/node_modules/underscore/underscore-node.cjs","webpack://__auiPrototyping/webpack/runtime/compat_get_default_export","webpack://__auiPrototyping/webpack/runtime/define_property_getters","webpack://__auiPrototyping/webpack/runtime/global","webpack://__auiPrototyping/webpack/runtime/has_own_property","webpack://__auiPrototyping/webpack/runtime/make_namespace_object","webpack://__auiPrototyping/src/js/aui/focus-manager.js","webpack://__auiPrototyping/src/js/aui/tooltip.js","webpack://__auiPrototyping/src/js/aui/internal/deprecation.ts","webpack://__auiPrototyping/src/js/aui/form-notification.js","webpack://__auiPrototyping/node_modules/dompurify/dist/purify.es.mjs","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/createPopper.js","webpack://__auiPrototyping/src/js/aui/blanket.js","webpack://__auiPrototyping/src/js/aui/internal/browser.js","webpack://__auiPrototyping/src/js/aui/unique-id.js","webpack://__auiPrototyping/src/js/aui/jquery.js","webpack://__auiPrototyping/src/js/aui/internal/globalize.js","webpack://__auiPrototyping/src/js/aui/forms/create-forms-component-body.js","webpack://__auiPrototyping/src/js/aui/internal/detect-children-change.js","webpack://__auiPrototyping/src/js/aui/forms.js","webpack://__auiPrototyping/src/js/aui/internal/log.js","webpack://__auiPrototyping/src/js/aui/forms/custom-checkbox.js","webpack://__auiPrototyping/src/js/aui/forms/custom-radio.js","webpack://__auiPrototyping/src/js/aui/format.js","webpack://__auiPrototyping/src/js/aui/version.js","webpack://__auiPrototyping/src/js/aui/event.js","webpack://__auiPrototyping/src/js/aui/escape-html.js","webpack://__auiPrototyping/src/js/aui/internal/animation.js","webpack://__auiPrototyping/src/js/aui/key-code.js","webpack://__auiPrototyping/src/js/aui/internal/amdify.js","webpack://__auiPrototyping/src/js/aui/internal/skate.js","webpack://__auiPrototyping/src/js/aui/internal/state.js","webpack://__auiPrototyping/src/js/aui/trigger.js","webpack://__auiPrototyping/src/js/aui/internal/widget.js","webpack://__auiPrototyping/src/js/aui/layer.js","webpack://__auiPrototyping/src/js/aui/layer-manager.js","webpack://__auiPrototyping/src/js/aui/params.js","webpack://__auiPrototyping/src/js/aui/populate-parameters.js","webpack://__auiPrototyping/src/js/aui/setup.js","webpack://__auiPrototyping/src/js/aui/to-init.js","webpack://__auiPrototyping/src/js/aui/i18n.js","webpack://__auiPrototyping/src/js/aui/internal/i18n/aui.js","webpack://__auiPrototyping/src/js/aui/avatar-badged.js","webpack://__auiPrototyping/src/js/aui/avatar.js","webpack://__auiPrototyping/src/js/aui/avatar-group.js","webpack://__auiPrototyping/src/js/aui/banner.js","webpack://__auiPrototyping/src/js/aui/spinner.js","webpack://__auiPrototyping/src/js/aui/button.js","webpack://__auiPrototyping/src/js/aui/close-button.js","webpack://__auiPrototyping/src/js/aui/dialog2.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/dom-utils/getWindow.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/utils/math.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/utils/userAgent.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/enums.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/modifiers/eventListeners.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/utils/getBasePlacement.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/utils/getVariation.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/utils/computeOffsets.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/modifiers/computeStyles.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/dom-utils/contains.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/utils/rectToClientRect.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/utils/expandToHashMap.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/utils/detectOverflow.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/utils/within.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/modifiers/hide.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/popper.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/modifiers/applyStyles.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/modifiers/offset.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/modifiers/flip.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/utils/getAltAxis.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/modifiers/arrow.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/utils/debounce.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/utils/mergeByName.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/utils/orderModifiers.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","webpack://__auiPrototyping/node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","webpack://__auiPrototyping/src/js/aui/internal/alignment.js","webpack://__auiPrototyping/src/js/aui/internal/elements.js","webpack://__auiPrototyping/src/js/aui/dropdown2.js","webpack://__auiPrototyping/src/js/aui/expander.js","webpack://__auiPrototyping/src/js/aui/messages.js","webpack://__auiPrototyping/src/js/aui/internal/a11y/focusable-query.js","webpack://__auiPrototyping/src/js/aui/flag.js","webpack://__auiPrototyping/src/js/aui/fancy-file-input.js","webpack://__auiPrototyping/src/js/aui/internal/enforcer.js","webpack://__auiPrototyping/src/js/aui/internal/constants.js","webpack://__auiPrototyping/src/js/aui/label.js","webpack://__auiPrototyping/src/js/aui/select2.js","webpack://__auiPrototyping/src/js/aui/spin.js","webpack://__auiPrototyping/src/js/aui/internal/select/option.js","webpack://__auiPrototyping/src/js/aui/progressive-data-set.js","webpack://__auiPrototyping/src/js/aui/internal/select/suggestion-model.js","webpack://__auiPrototyping/src/js/aui/internal/select/suggestions-model.js","webpack://__auiPrototyping/src/js/aui/internal/select/suggestions-view.js","webpack://__auiPrototyping/src/js/aui/select.js","webpack://__auiPrototyping/src/js/aui/internal/select/template.js","webpack://__auiPrototyping/src/js/aui/internal/attributes.js","webpack://__auiPrototyping/src/js/aui/toggle.js","webpack://__auiPrototyping/src/js/aui/inline-dialog2.js","webpack://__auiPrototyping/src/js/aui/navigation.js","webpack://__auiPrototyping/src/js/aui/progress-indicator.js","webpack://__auiPrototyping/src/js/aui/tables-sortable.js","webpack://__auiPrototyping/src/js/aui/internal/add-id.js","webpack://__auiPrototyping/src/js/aui/is-clipped.js","webpack://__auiPrototyping/src/js/aui/tabs.js","webpack://__auiPrototyping/src/js/aui/form-validation/validator-register.js","webpack://__auiPrototyping/src/js/aui/form-validation/basic-validators.js","webpack://__auiPrototyping/src/js/aui/form-validation.js","webpack://__auiPrototyping/src/js/aui/debounce.js","webpack://__auiPrototyping/src/js/aui/internal/header/create-header.js","webpack://__auiPrototyping/src/js/aui/header.js","webpack://__auiPrototyping/src/js/aui/header-async.js","webpack://__auiPrototyping/src/js/aui/date-picker.js","webpack://__auiPrototyping/src/js/aui/restful-table/class-names.js","webpack://__auiPrototyping/src/js/aui/restful-table/custom-create-view.js","webpack://__auiPrototyping/src/js/aui/restful-table/custom-edit-view.js","webpack://__auiPrototyping/src/js/aui/restful-table/custom-read-view.js","webpack://__auiPrototyping/src/js/aui/restful-table/data-keys.js","webpack://__auiPrototyping/src/js/aui/restful-table/event-names.js","webpack://__auiPrototyping/src/js/aui/restful-table/spinner.js","webpack://__auiPrototyping/src/js/aui/restful-table/edit-row.js","webpack://__auiPrototyping/src/js/aui/restful-table/event-handlers.js","webpack://__auiPrototyping/src/js/aui/internal/parse-json.js","webpack://__auiPrototyping/src/js/aui/restful-table/entry-model.js","webpack://__auiPrototyping/src/js/aui/restful-table/row.js","webpack://__auiPrototyping/src/js/aui/restful-table.js","webpack://__auiPrototyping/src/js/aui/clone.js","webpack://__auiPrototyping/src/js/aui/internal/has-touch.js","webpack://__auiPrototyping/src/js/aui/internal/deduplicateIDs.js","webpack://__auiPrototyping/src/js/aui/sidebar.js","webpack://__auiPrototyping/src/js/aui/internal/mediaQuery.js","webpack://__auiPrototyping/src/js/aui/internal/is-input.js","webpack://__auiPrototyping/src/js/aui/dialog.js","webpack://__auiPrototyping/src/js/aui/when-i-type.js","webpack://__auiPrototyping/aui.batch.prototyping.js"],"names":[],"mappings":"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AAS,KAAK,IAAS,KAAK,IAAS,KAAK,IAAS,KAAK,IAAS,KAAK,IAAS,KAAK,IAAS,KAAK,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,KAAK,IAAS,KAAK,IAAS,KAAK,IAAS,KAAK,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,KAAK,IAAS,KAAK,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,KAAK,IAAS,KAAK,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,KAAK,IAAS,KAAK,IAAS,KAAK,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,KAAK,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,KAAK,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,KAAK,IAAS,KAAK,IAAS,KAAK,IAAS,KAAK,IAAS,KAAK,IAAS,KAAK,IAAS,KAAK,IAAS,KAAK,IAAS,KAAK,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,KAAK,IAAS,KAAK,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,KAAK,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,KAAK,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,KAAK,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,KAAK,IAAS,KAAK,IAAS,KAAK,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,KAAK,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,IAAS,IAAI,I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","file":"/npm/@atlassian/aui@10.2.4/dist/aui/aui-prototyping.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.48.0.\n * Original file: /npm/@atlassian/aui@10.2.4/dist/aui/aui-prototyping.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/*! jQuery Fancy File Input plugin - v3.0.0 - 2026-02-11\n * Copyright (c) 2026 Atlassian Pty Ltd\n * Author: Atlassian Pty Ltd\n * License: Apache-2.0 */\n\n(function webpackUniversalModuleDefinition(root, factory) {\n\n      if(typeof exports === 'object' && typeof module === 'object') {\n          module.exports = factory(require(\"jquery\"));\n      }else if(typeof define === 'function' && define.amd) {\n          \n          define(\"FancyFileInput\", [\"jquery\"], factory);\n\n          } else if(typeof exports === 'object'){\n\n          \n      exports[\"FancyFileInput\"] = factory(require(\"jquery\"));\n\n      } else {\n\n          \n      root[\"FancyFileInput\"] = factory(root[\"jQuery\"]);\n      }\n\n      })(this, (__rspack_external__930) => {\n          return (() => {\nvar __webpack_modules__ = ({\n930(module) {\n\"use strict\";\nmodule.exports = __rspack_external__930;\n\n},\n\n});\n// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\n// Check if module is in cache\nvar cachedModule = __webpack_module_cache__[moduleId];\nif (cachedModule !== undefined) {\nreturn cachedModule.exports;\n}\n// Create a new module (and put it into the cache)\nvar module = (__webpack_module_cache__[moduleId] = {\nexports: {}\n});\n// Execute the module function\n__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n// Return the exports of the module\nreturn module.exports;\n\n}\n\nvar __webpack_exports__ = {};\n// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk.\n(() => {\n/**\n * --------------------------------------------------------------------\n * jQuery Fancy File Input plugin\n * Author: Atlassian Pty Ltd\n * Copyright © 2012 - 2016 Atlassian Pty Ltd. Licensed under the\n * Apache License, Version 2.0 (the \"License\"); you may not use this\n * file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0.\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\n * implied. See the License for the specific language governing\n * permissions and limitations under the License.\n * --------------------------------------------------------------------\n */\nconst $ = __webpack_require__(930);\n\nconst fakePathRegex = /^.*[\\\\\\/]/;\nconst multipleFileTextRegex = /\\{0\\}/gi;\n\nfunction FancyFileInput(el, options) {\n    const instance = $(el).data('FancyFileInput');\n    if (instance) {\n        return instance;\n    }\n    options = $.extend({}, FancyFileInput.defaults, options);\n    this.el = el;\n    this.$el = $(el);\n    this.$label = this.createLabel(options.buttonText);\n    this._addLabelText();\n    this.$clearButton = $('<button>', {\n        text: (this.$label.attr('data-ffi-clearButtonText') || options.clearButtonText),\n        'class': 'ffi-clear',\n        type: 'button',\n        'tabindex': '-1',\n    });\n    this.multipleFileTextPattern = this.$label.attr('data-ffi-multipleFileTextPattern') || options.multipleFileTextPattern;\n    this._eventNamespace = '.ffi';\n    this.CLASSES = {\n        disabled: 'is-disabled',\n        focused: 'is-focused',\n        active: 'is-active',\n        valid: 'is-valid',\n        invalid: 'is-invalid',\n    };\n    this[this.isDisabled() ? 'disable' : 'enable']();\n}\n\nFancyFileInput.defaults = {\n    buttonText: 'Browse\\u2026',\n    clearButtonText: 'Clear',\n    multipleFileTextPattern: '{0} files',\n};\n\nFancyFileInput.prototype._addLabelText = function attLabelText() {\n    const $associatedLabel = $('label[for=\"' + this.el.id + '\"]');\n    if ($associatedLabel.length) {\n        this.$el.attr('aria-label', $associatedLabel.text());\n    }\n};\n\nFancyFileInput.prototype.createLabel = function (buttonText) {\n    let $label = this.$el.parent('.ffi[data-ffi-button-text]');\n    if (!$label.length) {\n        $label = this.$el.wrap($('<label>', { 'class': 'ffi', 'data-ffi-button-text': buttonText })).parent();\n    }\n    return $label;\n};\n\nFancyFileInput.prototype.isDisabled = function () {\n    return this.$el.is(':disabled');\n};\n\nFancyFileInput.prototype.formatMultipleFileText = function (numFiles) {\n    return this.multipleFileTextPattern.replace(multipleFileTextRegex, numFiles);\n};\n\nFancyFileInput.prototype.bindEvents = function () {\n    this.$el\n        .on('invalid'   + this._eventNamespace, this.checkValidity.bind(this))\n        .on('change'    + this._eventNamespace, this.change.bind(this))\n        .on('keydown'   + this._eventNamespace, this.keydown.bind(this))\n        .on('mousedown' + this._eventNamespace, this.mousedown.bind(this))\n        .on('mouseup'   + this._eventNamespace, this.mouseup.bind(this))\n        .on('focus'     + this._eventNamespace, this.focus.bind(this))\n        .on('blur'      + this._eventNamespace, this.blur.bind(this));\n    this.$clearButton.on('click' + this._eventNamespace, this.clear.bind(this));\n};\n\nFancyFileInput.prototype.unbindEvents = function () {\n    this.$el.off(this._eventNamespace);\n    this.$clearButton.off(this._eventNamespace);\n};\n\nFancyFileInput.prototype.fireEvent = function (event) {\n    this.$el.trigger(event + this._eventNamespace);\n};\n\nFancyFileInput.prototype.enable = function () {\n    this.bindEvents();\n    this.$el.prop('disabled', false);\n    this.$label.removeClass(this.CLASSES.disabled);\n};\n\nFancyFileInput.prototype.disable = function () {\n    this.unbindEvents();\n    this.$el.prop('disabled', true);\n    this.$label.addClass(this.CLASSES.disabled);\n};\n\nFancyFileInput.prototype.clear = function () {\n    this.$el.wrap('<form>').closest('form').get(0).reset();\n    this.$el.unwrap();\n    this.el.value = '';\n    this.change();\n    return false;\n};\n\nFancyFileInput.prototype.focus = function () {\n    this.$label.addClass(this.CLASSES.focused);\n};\n\nFancyFileInput.prototype.blur = function () {\n    this.$label.removeClass(this.CLASSES.focused);\n};\n\nFancyFileInput.prototype.mousedown = function () {\n    this.$label.addClass(this.CLASSES.active);\n};\n\nFancyFileInput.prototype.mouseup = function () {\n    this.$label.removeClass(this.CLASSES.active);\n};\n\nFancyFileInput.prototype.keydown = function (e) {\n    const keyCode = e.which;\n    const BACKSPACE = 8;\n    const DELETE = 46;\n\n    if (keyCode === BACKSPACE || keyCode === DELETE) {\n        this.clear();\n        e.preventDefault();\n    }\n};\n\nFancyFileInput.prototype.checkValidity = function () {\n    if (!this.el.required) {\n        return;\n    }\n    const isInvalid = this.$el.is(':invalid');\n\n    this.$label.toggleClass(this.CLASSES.invalid, isInvalid).toggleClass(this.CLASSES.valid, !isInvalid);\n};\n\nFancyFileInput.prototype.change = function () {\n    let files;\n    let val = '';\n\n    this.checkValidity();\n\n    // multiple file selection\n    if (this.el.multiple && this.el.files.length > 1) {\n        files = this.formatMultipleFileText(this.el.files.length); // '5 files'\n    } else {\n        files = this.el.value; // 'README.txt'\n    }\n\n    if (files.length) {\n        val = files.replace(fakePathRegex, ''); // Strips off the C:\\fakepath nonsense\n        this.$clearButton.appendTo(this.$label);\n    } else {\n        this.$clearButton.detach();\n    }\n\n    this.$el.focus();\n    this.setFieldText(val);\n    this.fireEvent('value-changed');\n};\n\nFancyFileInput.prototype.setFieldText = function (text) {\n    const dataAttribute = 'data-ffi-value';\n    if (text.length) {\n        this.$label.attr(dataAttribute, text);\n        this.fireEvent('value-added');\n    } else {\n        this.$label.removeAttr(dataAttribute);\n        this.fireEvent('value-cleared');\n    }\n};\n\n$.fn.fancyFileInput = function (options) {\n    return this.each(function () {\n        const ffi = new FancyFileInput(this, options);\n        $(this).data('FancyFileInput', ffi);\n    });\n};\n\n})();\n\nreturn __webpack_exports__;\n})()\n\n});","console.debug('AUI import for WRM I18n not loaded');\n","/**\n *\n * @module Controls\n * @requires AJS, jQuery\n */\n\n/**\n * If not visible, moves the scroll position of the screen to the element\n *\n * <pre>\n * <strong>Usage:</strong>\n * jQuery(\"li.item\").moveTo();\n * </pre>\n *\n * This plugin also supports options as an argument.  The options\n * that can be defined are:\n * <ul>\n * <li>transition - if set to true will cause a smooth scrolling transition (false by default)</li>\n * <li>scrollOffset - defines an offset to scroll past the element to view in pixels such that\n * all of it can be viewed (35 pixels by default)</li>\n * </ul>\n *\n * @class moveTo\n * @constuctor moveTo\n * @namespace jQuery.fn\n * @param {Object} options\n */\njQuery.fn.moveTo = function (options) {\n    var defaults = {\n        transition: false,\n        scrollOffset: 35,\n    };\n\n    var opts = jQuery.extend(defaults, options);\n    var instance = this;\n    var topOffset = instance.offset().top;\n    var scrollTarget;\n\n    if (\n        (jQuery(window).scrollTop() + jQuery(window).height() - this.outerHeight() < topOffset ||\n            jQuery(window).scrollTop() + opts.scrollOffset > topOffset) &&\n        jQuery(window).height() > opts.scrollOffset\n    ) {\n        if (jQuery(window).scrollTop() + opts.scrollOffset > topOffset) {\n            //move up\n            scrollTarget =\n                topOffset - (jQuery(window).height() - this.outerHeight()) + opts.scrollOffset;\n        } else {\n            //move down\n            scrollTarget = topOffset - opts.scrollOffset;\n        }\n\n        if (!jQuery.fn.moveTo.animating && opts.transition) {\n            jQuery(document).trigger('moveToStarted', this);\n            jQuery.fn.moveTo.animating = true;\n            jQuery('html,body').animate(\n                {\n                    scrollTop: scrollTarget,\n                },\n                1000,\n                function () {\n                    jQuery(document).trigger('moveToFinished', instance);\n                    delete jQuery.fn.moveTo.animating;\n                }\n            );\n            return this;\n        } else {\n            var jQueryCache = jQuery('html, body');\n            if (jQueryCache.is(':animated')) {\n                jQueryCache.stop();\n                delete jQuery.fn.moveTo.animating;\n            }\n\n            jQuery(document).trigger('moveToStarted');\n            jQuery(window).scrollTop(scrollTarget);\n            //need to put a slight timeout for the moveToFinished event such that recipients of this event\n            //have time to act on it.\n            setTimeout(function () {\n                jQuery(document).trigger('moveToFinished', instance);\n            }, 100);\n            return this;\n        }\n    }\n    jQuery(document).trigger('moveToFinished', this);\n    return this;\n};\n","//     Backbone.js 1.6.0\n\n//     (c) 2010-2024 Jeremy Ashkenas and DocumentCloud\n//     Backbone may be freely distributed under the MIT license.\n//     For all details and documentation:\n//     http://backbonejs.org\n\n(function(factory) {\n\n  // Establish the root object, `window` (`self`) in the browser, or `global` on the server.\n  // We use `self` instead of `window` for `WebWorker` support.\n  var root = typeof self == 'object' && self.self === self && self ||\n            typeof global == 'object' && global.global === global && global;\n\n  // Set up Backbone appropriately for the environment. Start with AMD.\n  if (typeof define === 'function' && define.amd) {\n    define(['underscore', 'jquery', 'exports'], function(_, $, exports) {\n      // Export global even in AMD case in case this script is loaded with\n      // others that may still expect a global Backbone.\n      root.Backbone = factory(root, exports, _, $);\n    });\n\n  // Next for Node.js or CommonJS. jQuery may not be needed as a module.\n  } else if (typeof exports !== 'undefined') {\n    var _ = require('underscore'), $;\n    try { $ = require('jquery'); } catch (e) {}\n    factory(root, exports, _, $);\n\n  // Finally, as a browser global.\n  } else {\n    root.Backbone = factory(root, {}, root._, root.jQuery || root.Zepto || root.ender || root.$);\n  }\n\n})(function(root, Backbone, _, $) {\n\n  // Initial Setup\n  // -------------\n\n  // Save the previous value of the `Backbone` variable, so that it can be\n  // restored later on, if `noConflict` is used.\n  var previousBackbone = root.Backbone;\n\n  // Create a local reference to a common array method we'll want to use later.\n  var slice = Array.prototype.slice;\n\n  // Current version of the library. Keep in sync with `package.json`.\n  Backbone.VERSION = '1.6.0';\n\n  // For Backbone's purposes, jQuery, Zepto, Ender, or My Library (kidding) owns\n  // the `$` variable.\n  Backbone.$ = $;\n\n  // Runs Backbone.js in *noConflict* mode, returning the `Backbone` variable\n  // to its previous owner. Returns a reference to this Backbone object.\n  Backbone.noConflict = function() {\n    root.Backbone = previousBackbone;\n    return this;\n  };\n\n  // Turn on `emulateHTTP` to support legacy HTTP servers. Setting this option\n  // will fake `\"PATCH\"`, `\"PUT\"` and `\"DELETE\"` requests via the `_method` parameter and\n  // set a `X-Http-Method-Override` header.\n  Backbone.emulateHTTP = false;\n\n  // Turn on `emulateJSON` to support legacy servers that can't deal with direct\n  // `application/json` requests ... this will encode the body as\n  // `application/x-www-form-urlencoded` instead and will send the model in a\n  // form param named `model`.\n  Backbone.emulateJSON = false;\n\n  // Backbone.Events\n  // ---------------\n\n  // A module that can be mixed in to *any object* in order to provide it with\n  // a custom event channel. You may bind a callback to an event with `on` or\n  // remove with `off`; `trigger`-ing an event fires all callbacks in\n  // succession.\n  //\n  //     var object = {};\n  //     _.extend(object, Backbone.Events);\n  //     object.on('expand', function(){ alert('expanded'); });\n  //     object.trigger('expand');\n  //\n  var Events = Backbone.Events = {};\n\n  // Regular expression used to split event strings.\n  var eventSplitter = /\\s+/;\n\n  // A private global variable to share between listeners and listenees.\n  var _listening;\n\n  // Iterates over the standard `event, callback` (as well as the fancy multiple\n  // space-separated events `\"change blur\", callback` and jQuery-style event\n  // maps `{event: callback}`).\n  var eventsApi = function(iteratee, events, name, callback, opts) {\n    var i = 0, names;\n    if (name && typeof name === 'object') {\n      // Handle event maps.\n      if (callback !== void 0 && 'context' in opts && opts.context === void 0) opts.context = callback;\n      for (names = _.keys(name); i < names.length ; i++) {\n        events = eventsApi(iteratee, events, names[i], name[names[i]], opts);\n      }\n    } else if (name && eventSplitter.test(name)) {\n      // Handle space-separated event names by delegating them individually.\n      for (names = name.split(eventSplitter); i < names.length; i++) {\n        events = iteratee(events, names[i], callback, opts);\n      }\n    } else {\n      // Finally, standard events.\n      events = iteratee(events, name, callback, opts);\n    }\n    return events;\n  };\n\n  // Bind an event to a `callback` function. Passing `\"all\"` will bind\n  // the callback to all events fired.\n  Events.on = function(name, callback, context) {\n    this._events = eventsApi(onApi, this._events || {}, name, callback, {\n      context: context,\n      ctx: this,\n      listening: _listening\n    });\n\n    if (_listening) {\n      var listeners = this._listeners || (this._listeners = {});\n      listeners[_listening.id] = _listening;\n      // Allow the listening to use a counter, instead of tracking\n      // callbacks for library interop\n      _listening.interop = false;\n    }\n\n    return this;\n  };\n\n  // Inversion-of-control versions of `on`. Tell *this* object to listen to\n  // an event in another object... keeping track of what it's listening to\n  // for easier unbinding later.\n  Events.listenTo = function(obj, name, callback) {\n    if (!obj) return this;\n    var id = obj._listenId || (obj._listenId = _.uniqueId('l'));\n    var listeningTo = this._listeningTo || (this._listeningTo = {});\n    var listening = _listening = listeningTo[id];\n\n    // This object is not listening to any other events on `obj` yet.\n    // Setup the necessary references to track the listening callbacks.\n    if (!listening) {\n      this._listenId || (this._listenId = _.uniqueId('l'));\n      listening = _listening = listeningTo[id] = new Listening(this, obj);\n    }\n\n    // Bind callbacks on obj.\n    var error = tryCatchOn(obj, name, callback, this);\n    _listening = void 0;\n\n    if (error) throw error;\n    // If the target obj is not Backbone.Events, track events manually.\n    if (listening.interop) listening.on(name, callback);\n\n    return this;\n  };\n\n  // The reducing API that adds a callback to the `events` object.\n  var onApi = function(events, name, callback, options) {\n    if (callback) {\n      var handlers = events[name] || (events[name] = []);\n      var context = options.context, ctx = options.ctx, listening = options.listening;\n      if (listening) listening.count++;\n\n      handlers.push({callback: callback, context: context, ctx: context || ctx, listening: listening});\n    }\n    return events;\n  };\n\n  // An try-catch guarded #on function, to prevent poisoning the global\n  // `_listening` variable.\n  var tryCatchOn = function(obj, name, callback, context) {\n    try {\n      obj.on(name, callback, context);\n    } catch (e) {\n      return e;\n    }\n  };\n\n  // Remove one or many callbacks. If `context` is null, removes all\n  // callbacks with that function. If `callback` is null, removes all\n  // callbacks for the event. If `name` is null, removes all bound\n  // callbacks for all events.\n  Events.off = function(name, callback, context) {\n    if (!this._events) return this;\n    this._events = eventsApi(offApi, this._events, name, callback, {\n      context: context,\n      listeners: this._listeners\n    });\n\n    return this;\n  };\n\n  // Tell this object to stop listening to either specific events ... or\n  // to every object it's currently listening to.\n  Events.stopListening = function(obj, name, callback) {\n    var listeningTo = this._listeningTo;\n    if (!listeningTo) return this;\n\n    var ids = obj ? [obj._listenId] : _.keys(listeningTo);\n    for (var i = 0; i < ids.length; i++) {\n      var listening = listeningTo[ids[i]];\n\n      // If listening doesn't exist, this object is not currently\n      // listening to obj. Break out early.\n      if (!listening) break;\n\n      listening.obj.off(name, callback, this);\n      if (listening.interop) listening.off(name, callback);\n    }\n    if (_.isEmpty(listeningTo)) this._listeningTo = void 0;\n\n    return this;\n  };\n\n  // The reducing API that removes a callback from the `events` object.\n  var offApi = function(events, name, callback, options) {\n    if (!events) return;\n\n    var context = options.context, listeners = options.listeners;\n    var i = 0, names;\n\n    // Delete all event listeners and \"drop\" events.\n    if (!name && !context && !callback) {\n      for (names = _.keys(listeners); i < names.length; i++) {\n        listeners[names[i]].cleanup();\n      }\n      return;\n    }\n\n    names = name ? [name] : _.keys(events);\n    for (; i < names.length; i++) {\n      name = names[i];\n      var handlers = events[name];\n\n      // Bail out if there are no events stored.\n      if (!handlers) break;\n\n      // Find any remaining events.\n      var remaining = [];\n      for (var j = 0; j < handlers.length; j++) {\n        var handler = handlers[j];\n        if (\n          callback && callback !== handler.callback &&\n            callback !== handler.callback._callback ||\n              context && context !== handler.context\n        ) {\n          remaining.push(handler);\n        } else {\n          var listening = handler.listening;\n          if (listening) listening.off(name, callback);\n        }\n      }\n\n      // Replace events if there are any remaining.  Otherwise, clean up.\n      if (remaining.length) {\n        events[name] = remaining;\n      } else {\n        delete events[name];\n      }\n    }\n\n    return events;\n  };\n\n  // Bind an event to only be triggered a single time. After the first time\n  // the callback is invoked, its listener will be removed. If multiple events\n  // are passed in using the space-separated syntax, the handler will fire\n  // once for each event, not once for a combination of all events.\n  Events.once = function(name, callback, context) {\n    // Map the event into a `{event: once}` object.\n    var events = eventsApi(onceMap, {}, name, callback, this.off.bind(this));\n    if (typeof name === 'string' && context == null) callback = void 0;\n    return this.on(events, callback, context);\n  };\n\n  // Inversion-of-control versions of `once`.\n  Events.listenToOnce = function(obj, name, callback) {\n    // Map the event into a `{event: once}` object.\n    var events = eventsApi(onceMap, {}, name, callback, this.stopListening.bind(this, obj));\n    return this.listenTo(obj, events);\n  };\n\n  // Reduces the event callbacks into a map of `{event: onceWrapper}`.\n  // `offer` unbinds the `onceWrapper` after it has been called.\n  var onceMap = function(map, name, callback, offer) {\n    if (callback) {\n      var once = map[name] = _.once(function() {\n        offer(name, once);\n        callback.apply(this, arguments);\n      });\n      once._callback = callback;\n    }\n    return map;\n  };\n\n  // Trigger one or many events, firing all bound callbacks. Callbacks are\n  // passed the same arguments as `trigger` is, apart from the event name\n  // (unless you're listening on `\"all\"`, which will cause your callback to\n  // receive the true name of the event as the first argument).\n  Events.trigger = function(name) {\n    if (!this._events) return this;\n\n    var length = Math.max(0, arguments.length - 1);\n    var args = Array(length);\n    for (var i = 0; i < length; i++) args[i] = arguments[i + 1];\n\n    eventsApi(triggerApi, this._events, name, void 0, args);\n    return this;\n  };\n\n  // Handles triggering the appropriate event callbacks.\n  var triggerApi = function(objEvents, name, callback, args) {\n    if (objEvents) {\n      var events = objEvents[name];\n      var allEvents = objEvents.all;\n      if (events && allEvents) allEvents = allEvents.slice();\n      if (events) triggerEvents(events, args);\n      if (allEvents) triggerEvents(allEvents, [name].concat(args));\n    }\n    return objEvents;\n  };\n\n  // A difficult-to-believe, but optimized internal dispatch function for\n  // triggering events. Tries to keep the usual cases speedy (most internal\n  // Backbone events have 3 arguments).\n  var triggerEvents = function(events, args) {\n    var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2];\n    switch (args.length) {\n      case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return;\n      case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return;\n      case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return;\n      case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return;\n      default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args); return;\n    }\n  };\n\n  // A listening class that tracks and cleans up memory bindings\n  // when all callbacks have been offed.\n  var Listening = function(listener, obj) {\n    this.id = listener._listenId;\n    this.listener = listener;\n    this.obj = obj;\n    this.interop = true;\n    this.count = 0;\n    this._events = void 0;\n  };\n\n  Listening.prototype.on = Events.on;\n\n  // Offs a callback (or several).\n  // Uses an optimized counter if the listenee uses Backbone.Events.\n  // Otherwise, falls back to manual tracking to support events\n  // library interop.\n  Listening.prototype.off = function(name, callback) {\n    var cleanup;\n    if (this.interop) {\n      this._events = eventsApi(offApi, this._events, name, callback, {\n        context: void 0,\n        listeners: void 0\n      });\n      cleanup = !this._events;\n    } else {\n      this.count--;\n      cleanup = this.count === 0;\n    }\n    if (cleanup) this.cleanup();\n  };\n\n  // Cleans up memory bindings between the listener and the listenee.\n  Listening.prototype.cleanup = function() {\n    delete this.listener._listeningTo[this.obj._listenId];\n    if (!this.interop) delete this.obj._listeners[this.id];\n  };\n\n  // Aliases for backwards compatibility.\n  Events.bind   = Events.on;\n  Events.unbind = Events.off;\n\n  // Allow the `Backbone` object to serve as a global event bus, for folks who\n  // want global \"pubsub\" in a convenient place.\n  _.extend(Backbone, Events);\n\n  // Backbone.Model\n  // --------------\n\n  // Backbone **Models** are the basic data object in the framework --\n  // frequently representing a row in a table in a database on your server.\n  // A discrete chunk of data and a bunch of useful, related methods for\n  // performing computations and transformations on that data.\n\n  // Create a new model with the specified attributes. A client id (`cid`)\n  // is automatically generated and assigned for you.\n  var Model = Backbone.Model = function(attributes, options) {\n    var attrs = attributes || {};\n    options || (options = {});\n    this.preinitialize.apply(this, arguments);\n    this.cid = _.uniqueId(this.cidPrefix);\n    this.attributes = {};\n    if (options.collection) this.collection = options.collection;\n    if (options.parse) attrs = this.parse(attrs, options) || {};\n    var defaults = _.result(this, 'defaults');\n\n    // Just _.defaults would work fine, but the additional _.extends\n    // is in there for historical reasons. See #3843.\n    attrs = _.defaults(_.extend({}, defaults, attrs), defaults);\n\n    this.set(attrs, options);\n    this.changed = {};\n    this.initialize.apply(this, arguments);\n  };\n\n  // Attach all inheritable methods to the Model prototype.\n  _.extend(Model.prototype, Events, {\n\n    // A hash of attributes whose current and previous value differ.\n    changed: null,\n\n    // The value returned during the last failed validation.\n    validationError: null,\n\n    // The default name for the JSON `id` attribute is `\"id\"`. MongoDB and\n    // CouchDB users may want to set this to `\"_id\"`.\n    idAttribute: 'id',\n\n    // The prefix is used to create the client id which is used to identify models locally.\n    // You may want to override this if you're experiencing name clashes with model ids.\n    cidPrefix: 'c',\n\n    // preinitialize is an empty function by default. You can override it with a function\n    // or object.  preinitialize will run before any instantiation logic is run in the Model.\n    preinitialize: function(){},\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize: function(){},\n\n    // Return a copy of the model's `attributes` object.\n    toJSON: function(options) {\n      return _.clone(this.attributes);\n    },\n\n    // Proxy `Backbone.sync` by default -- but override this if you need\n    // custom syncing semantics for *this* particular model.\n    sync: function() {\n      return Backbone.sync.apply(this, arguments);\n    },\n\n    // Get the value of an attribute.\n    get: function(attr) {\n      return this.attributes[attr];\n    },\n\n    // Get the HTML-escaped value of an attribute.\n    escape: function(attr) {\n      return _.escape(this.get(attr));\n    },\n\n    // Returns `true` if the attribute contains a value that is not null\n    // or undefined.\n    has: function(attr) {\n      return this.get(attr) != null;\n    },\n\n    // Special-cased proxy to underscore's `_.matches` method.\n    matches: function(attrs) {\n      return !!_.iteratee(attrs, this)(this.attributes);\n    },\n\n    // Set a hash of model attributes on the object, firing `\"change\"`. This is\n    // the core primitive operation of a model, updating the data and notifying\n    // anyone who needs to know about the change in state. The heart of the beast.\n    set: function(key, val, options) {\n      if (key == null) return this;\n\n      // Handle both `\"key\", value` and `{key: value}` -style arguments.\n      var attrs;\n      if (typeof key === 'object') {\n        attrs = key;\n        options = val;\n      } else {\n        (attrs = {})[key] = val;\n      }\n\n      options || (options = {});\n\n      // Run validation.\n      if (!this._validate(attrs, options)) return false;\n\n      // Extract attributes and options.\n      var unset      = options.unset;\n      var silent     = options.silent;\n      var changes    = [];\n      var changing   = this._changing;\n      this._changing = true;\n\n      if (!changing) {\n        this._previousAttributes = _.clone(this.attributes);\n        this.changed = {};\n      }\n\n      var current = this.attributes;\n      var changed = this.changed;\n      var prev    = this._previousAttributes;\n\n      // For each `set` attribute, update or delete the current value.\n      for (var attr in attrs) {\n        val = attrs[attr];\n        if (!_.isEqual(current[attr], val)) changes.push(attr);\n        if (!_.isEqual(prev[attr], val)) {\n          changed[attr] = val;\n        } else {\n          delete changed[attr];\n        }\n        unset ? delete current[attr] : current[attr] = val;\n      }\n\n      // Update the `id`.\n      if (this.idAttribute in attrs) {\n        var prevId = this.id;\n        this.id = this.get(this.idAttribute);\n        this.trigger('changeId', this, prevId, options);\n      }\n\n      // Trigger all relevant attribute changes.\n      if (!silent) {\n        if (changes.length) this._pending = options;\n        for (var i = 0; i < changes.length; i++) {\n          this.trigger('change:' + changes[i], this, current[changes[i]], options);\n        }\n      }\n\n      // You might be wondering why there's a `while` loop here. Changes can\n      // be recursively nested within `\"change\"` events.\n      if (changing) return this;\n      if (!silent) {\n        while (this._pending) {\n          options = this._pending;\n          this._pending = false;\n          this.trigger('change', this, options);\n        }\n      }\n      this._pending = false;\n      this._changing = false;\n      return this;\n    },\n\n    // Remove an attribute from the model, firing `\"change\"`. `unset` is a noop\n    // if the attribute doesn't exist.\n    unset: function(attr, options) {\n      return this.set(attr, void 0, _.extend({}, options, {unset: true}));\n    },\n\n    // Clear all attributes on the model, firing `\"change\"`.\n    clear: function(options) {\n      var attrs = {};\n      for (var key in this.attributes) attrs[key] = void 0;\n      return this.set(attrs, _.extend({}, options, {unset: true}));\n    },\n\n    // Determine if the model has changed since the last `\"change\"` event.\n    // If you specify an attribute name, determine if that attribute has changed.\n    hasChanged: function(attr) {\n      if (attr == null) return !_.isEmpty(this.changed);\n      return _.has(this.changed, attr);\n    },\n\n    // Return an object containing all the attributes that have changed, or\n    // false if there are no changed attributes. Useful for determining what\n    // parts of a view need to be updated and/or what attributes need to be\n    // persisted to the server. Unset attributes will be set to undefined.\n    // You can also pass an attributes object to diff against the model,\n    // determining if there *would be* a change.\n    changedAttributes: function(diff) {\n      if (!diff) return this.hasChanged() ? _.clone(this.changed) : false;\n      var old = this._changing ? this._previousAttributes : this.attributes;\n      var changed = {};\n      var hasChanged;\n      for (var attr in diff) {\n        var val = diff[attr];\n        if (_.isEqual(old[attr], val)) continue;\n        changed[attr] = val;\n        hasChanged = true;\n      }\n      return hasChanged ? changed : false;\n    },\n\n    // Get the previous value of an attribute, recorded at the time the last\n    // `\"change\"` event was fired.\n    previous: function(attr) {\n      if (attr == null || !this._previousAttributes) return null;\n      return this._previousAttributes[attr];\n    },\n\n    // Get all of the attributes of the model at the time of the previous\n    // `\"change\"` event.\n    previousAttributes: function() {\n      return _.clone(this._previousAttributes);\n    },\n\n    // Fetch the model from the server, merging the response with the model's\n    // local attributes. Any changed attributes will trigger a \"change\" event.\n    fetch: function(options) {\n      options = _.extend({parse: true}, options);\n      var model = this;\n      var success = options.success;\n      options.success = function(resp) {\n        var serverAttrs = options.parse ? model.parse(resp, options) : resp;\n        if (!model.set(serverAttrs, options)) return false;\n        if (success) success.call(options.context, model, resp, options);\n        model.trigger('sync', model, resp, options);\n      };\n      wrapError(this, options);\n      return this.sync('read', this, options);\n    },\n\n    // Set a hash of model attributes, and sync the model to the server.\n    // If the server returns an attributes hash that differs, the model's\n    // state will be `set` again.\n    save: function(key, val, options) {\n      // Handle both `\"key\", value` and `{key: value}` -style arguments.\n      var attrs;\n      if (key == null || typeof key === 'object') {\n        attrs = key;\n        options = val;\n      } else {\n        (attrs = {})[key] = val;\n      }\n\n      options = _.extend({validate: true, parse: true}, options);\n      var wait = options.wait;\n\n      // If we're not waiting and attributes exist, save acts as\n      // `set(attr).save(null, opts)` with validation. Otherwise, check if\n      // the model will be valid when the attributes, if any, are set.\n      if (attrs && !wait) {\n        if (!this.set(attrs, options)) return false;\n      } else if (!this._validate(attrs, options)) {\n        return false;\n      }\n\n      // After a successful server-side save, the client is (optionally)\n      // updated with the server-side state.\n      var model = this;\n      var success = options.success;\n      var attributes = this.attributes;\n      options.success = function(resp) {\n        // Ensure attributes are restored during synchronous saves.\n        model.attributes = attributes;\n        var serverAttrs = options.parse ? model.parse(resp, options) : resp;\n        if (wait) serverAttrs = _.extend({}, attrs, serverAttrs);\n        if (serverAttrs && !model.set(serverAttrs, options)) return false;\n        if (success) success.call(options.context, model, resp, options);\n        model.trigger('sync', model, resp, options);\n      };\n      wrapError(this, options);\n\n      // Set temporary attributes if `{wait: true}` to properly find new ids.\n      if (attrs && wait) this.attributes = _.extend({}, attributes, attrs);\n\n      var method = this.isNew() ? 'create' : options.patch ? 'patch' : 'update';\n      if (method === 'patch' && !options.attrs) options.attrs = attrs;\n      var xhr = this.sync(method, this, options);\n\n      // Restore attributes.\n      this.attributes = attributes;\n\n      return xhr;\n    },\n\n    // Destroy this model on the server if it was already persisted.\n    // Optimistically removes the model from its collection, if it has one.\n    // If `wait: true` is passed, waits for the server to respond before removal.\n    destroy: function(options) {\n      options = options ? _.clone(options) : {};\n      var model = this;\n      var success = options.success;\n      var wait = options.wait;\n\n      var destroy = function() {\n        model.stopListening();\n        model.trigger('destroy', model, model.collection, options);\n      };\n\n      options.success = function(resp) {\n        if (wait) destroy();\n        if (success) success.call(options.context, model, resp, options);\n        if (!model.isNew()) model.trigger('sync', model, resp, options);\n      };\n\n      var xhr = false;\n      if (this.isNew()) {\n        _.defer(options.success);\n      } else {\n        wrapError(this, options);\n        xhr = this.sync('delete', this, options);\n      }\n      if (!wait) destroy();\n      return xhr;\n    },\n\n    // Default URL for the model's representation on the server -- if you're\n    // using Backbone's restful methods, override this to change the endpoint\n    // that will be called.\n    url: function() {\n      var base =\n        _.result(this, 'urlRoot') ||\n        _.result(this.collection, 'url') ||\n        urlError();\n      if (this.isNew()) return base;\n      var id = this.get(this.idAttribute);\n      return base.replace(/[^\\/]$/, '$&/') + encodeURIComponent(id);\n    },\n\n    // **parse** converts a response into the hash of attributes to be `set` on\n    // the model. The default implementation is just to pass the response along.\n    parse: function(resp, options) {\n      return resp;\n    },\n\n    // Create a new model with identical attributes to this one.\n    clone: function() {\n      return new this.constructor(this.attributes);\n    },\n\n    // A model is new if it has never been saved to the server, and lacks an id.\n    isNew: function() {\n      return !this.has(this.idAttribute);\n    },\n\n    // Check if the model is currently in a valid state.\n    isValid: function(options) {\n      return this._validate({}, _.extend({}, options, {validate: true}));\n    },\n\n    // Run validation against the next complete set of model attributes,\n    // returning `true` if all is well. Otherwise, fire an `\"invalid\"` event.\n    _validate: function(attrs, options) {\n      if (!options.validate || !this.validate) return true;\n      attrs = _.extend({}, this.attributes, attrs);\n      var error = this.validationError = this.validate(attrs, options) || null;\n      if (!error) return true;\n      this.trigger('invalid', this, error, _.extend(options, {validationError: error}));\n      return false;\n    }\n\n  });\n\n  // Backbone.Collection\n  // -------------------\n\n  // If models tend to represent a single row of data, a Backbone Collection is\n  // more analogous to a table full of data ... or a small slice or page of that\n  // table, or a collection of rows that belong together for a particular reason\n  // -- all of the messages in this particular folder, all of the documents\n  // belonging to this particular author, and so on. Collections maintain\n  // indexes of their models, both in order, and for lookup by `id`.\n\n  // Create a new **Collection**, perhaps to contain a specific type of `model`.\n  // If a `comparator` is specified, the Collection will maintain\n  // its models in sort order, as they're added and removed.\n  var Collection = Backbone.Collection = function(models, options) {\n    options || (options = {});\n    this.preinitialize.apply(this, arguments);\n    if (options.model) this.model = options.model;\n    if (options.comparator !== void 0) this.comparator = options.comparator;\n    this._reset();\n    this.initialize.apply(this, arguments);\n    if (models) this.reset(models, _.extend({silent: true}, options));\n  };\n\n  // Default options for `Collection#set`.\n  var setOptions = {add: true, remove: true, merge: true};\n  var addOptions = {add: true, remove: false};\n\n  // Splices `insert` into `array` at index `at`.\n  var splice = function(array, insert, at) {\n    at = Math.min(Math.max(at, 0), array.length);\n    var tail = Array(array.length - at);\n    var length = insert.length;\n    var i;\n    for (i = 0; i < tail.length; i++) tail[i] = array[i + at];\n    for (i = 0; i < length; i++) array[i + at] = insert[i];\n    for (i = 0; i < tail.length; i++) array[i + length + at] = tail[i];\n  };\n\n  // Define the Collection's inheritable methods.\n  _.extend(Collection.prototype, Events, {\n\n    // The default model for a collection is just a **Backbone.Model**.\n    // This should be overridden in most cases.\n    model: Model,\n\n\n    // preinitialize is an empty function by default. You can override it with a function\n    // or object.  preinitialize will run before any instantiation logic is run in the Collection.\n    preinitialize: function(){},\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize: function(){},\n\n    // The JSON representation of a Collection is an array of the\n    // models' attributes.\n    toJSON: function(options) {\n      return this.map(function(model) { return model.toJSON(options); });\n    },\n\n    // Proxy `Backbone.sync` by default.\n    sync: function() {\n      return Backbone.sync.apply(this, arguments);\n    },\n\n    // Add a model, or list of models to the set. `models` may be Backbone\n    // Models or raw JavaScript objects to be converted to Models, or any\n    // combination of the two.\n    add: function(models, options) {\n      return this.set(models, _.extend({merge: false}, options, addOptions));\n    },\n\n    // Remove a model, or a list of models from the set.\n    remove: function(models, options) {\n      options = _.extend({}, options);\n      var singular = !_.isArray(models);\n      models = singular ? [models] : models.slice();\n      var removed = this._removeModels(models, options);\n      if (!options.silent && removed.length) {\n        options.changes = {added: [], merged: [], removed: removed};\n        this.trigger('update', this, options);\n      }\n      return singular ? removed[0] : removed;\n    },\n\n    // Update a collection by `set`-ing a new list of models, adding new ones,\n    // removing models that are no longer present, and merging models that\n    // already exist in the collection, as necessary. Similar to **Model#set**,\n    // the core operation for updating the data contained by the collection.\n    set: function(models, options) {\n      if (models == null) return;\n\n      options = _.extend({}, setOptions, options);\n      if (options.parse && !this._isModel(models)) {\n        models = this.parse(models, options) || [];\n      }\n\n      var singular = !_.isArray(models);\n      models = singular ? [models] : models.slice();\n\n      var at = options.at;\n      if (at != null) at = +at;\n      if (at > this.length) at = this.length;\n      if (at < 0) at += this.length + 1;\n\n      var set = [];\n      var toAdd = [];\n      var toMerge = [];\n      var toRemove = [];\n      var modelMap = {};\n\n      var add = options.add;\n      var merge = options.merge;\n      var remove = options.remove;\n\n      var sort = false;\n      var sortable = this.comparator && at == null && options.sort !== false;\n      var sortAttr = _.isString(this.comparator) ? this.comparator : null;\n\n      // Turn bare objects into model references, and prevent invalid models\n      // from being added.\n      var model, i;\n      for (i = 0; i < models.length; i++) {\n        model = models[i];\n\n        // If a duplicate is found, prevent it from being added and\n        // optionally merge it into the existing model.\n        var existing = this.get(model);\n        if (existing) {\n          if (merge && model !== existing) {\n            var attrs = this._isModel(model) ? model.attributes : model;\n            if (options.parse) attrs = existing.parse(attrs, options);\n            existing.set(attrs, options);\n            toMerge.push(existing);\n            if (sortable && !sort) sort = existing.hasChanged(sortAttr);\n          }\n          if (!modelMap[existing.cid]) {\n            modelMap[existing.cid] = true;\n            set.push(existing);\n          }\n          models[i] = existing;\n\n        // If this is a new, valid model, push it to the `toAdd` list.\n        } else if (add) {\n          model = models[i] = this._prepareModel(model, options);\n          if (model) {\n            toAdd.push(model);\n            this._addReference(model, options);\n            modelMap[model.cid] = true;\n            set.push(model);\n          }\n        }\n      }\n\n      // Remove stale models.\n      if (remove) {\n        for (i = 0; i < this.length; i++) {\n          model = this.models[i];\n          if (!modelMap[model.cid]) toRemove.push(model);\n        }\n        if (toRemove.length) this._removeModels(toRemove, options);\n      }\n\n      // See if sorting is needed, update `length` and splice in new models.\n      var orderChanged = false;\n      var replace = !sortable && add && remove;\n      if (set.length && replace) {\n        orderChanged = this.length !== set.length || _.some(this.models, function(m, index) {\n          return m !== set[index];\n        });\n        this.models.length = 0;\n        splice(this.models, set, 0);\n        this.length = this.models.length;\n      } else if (toAdd.length) {\n        if (sortable) sort = true;\n        splice(this.models, toAdd, at == null ? this.length : at);\n        this.length = this.models.length;\n      }\n\n      // Silently sort the collection if appropriate.\n      if (sort) this.sort({silent: true});\n\n      // Unless silenced, it's time to fire all appropriate add/sort/update events.\n      if (!options.silent) {\n        for (i = 0; i < toAdd.length; i++) {\n          if (at != null) options.index = at + i;\n          model = toAdd[i];\n          model.trigger('add', model, this, options);\n        }\n        if (sort || orderChanged) this.trigger('sort', this, options);\n        if (toAdd.length || toRemove.length || toMerge.length) {\n          options.changes = {\n            added: toAdd,\n            removed: toRemove,\n            merged: toMerge\n          };\n          this.trigger('update', this, options);\n        }\n      }\n\n      // Return the added (or merged) model (or models).\n      return singular ? models[0] : models;\n    },\n\n    // When you have more items than you want to add or remove individually,\n    // you can reset the entire set with a new list of models, without firing\n    // any granular `add` or `remove` events. Fires `reset` when finished.\n    // Useful for bulk operations and optimizations.\n    reset: function(models, options) {\n      options = options ? _.clone(options) : {};\n      for (var i = 0; i < this.models.length; i++) {\n        this._removeReference(this.models[i], options);\n      }\n      options.previousModels = this.models;\n      this._reset();\n      models = this.add(models, _.extend({silent: true}, options));\n      if (!options.silent) this.trigger('reset', this, options);\n      return models;\n    },\n\n    // Add a model to the end of the collection.\n    push: function(model, options) {\n      return this.add(model, _.extend({at: this.length}, options));\n    },\n\n    // Remove a model from the end of the collection.\n    pop: function(options) {\n      var model = this.at(this.length - 1);\n      return this.remove(model, options);\n    },\n\n    // Add a model to the beginning of the collection.\n    unshift: function(model, options) {\n      return this.add(model, _.extend({at: 0}, options));\n    },\n\n    // Remove a model from the beginning of the collection.\n    shift: function(options) {\n      var model = this.at(0);\n      return this.remove(model, options);\n    },\n\n    // Slice out a sub-array of models from the collection.\n    slice: function() {\n      return slice.apply(this.models, arguments);\n    },\n\n    // Get a model from the set by id, cid, model object with id or cid\n    // properties, or an attributes object that is transformed through modelId.\n    get: function(obj) {\n      if (obj == null) return void 0;\n      return this._byId[obj] ||\n        this._byId[this.modelId(this._isModel(obj) ? obj.attributes : obj, obj.idAttribute)] ||\n        obj.cid && this._byId[obj.cid];\n    },\n\n    // Returns `true` if the model is in the collection.\n    has: function(obj) {\n      return this.get(obj) != null;\n    },\n\n    // Get the model at the given index.\n    at: function(index) {\n      if (index < 0) index += this.length;\n      return this.models[index];\n    },\n\n    // Return models with matching attributes. Useful for simple cases of\n    // `filter`.\n    where: function(attrs, first) {\n      return this[first ? 'find' : 'filter'](attrs);\n    },\n\n    // Return the first model with matching attributes. Useful for simple cases\n    // of `find`.\n    findWhere: function(attrs) {\n      return this.where(attrs, true);\n    },\n\n    // Force the collection to re-sort itself. You don't need to call this under\n    // normal circumstances, as the set will maintain sort order as each item\n    // is added.\n    sort: function(options) {\n      var comparator = this.comparator;\n      if (!comparator) throw new Error('Cannot sort a set without a comparator');\n      options || (options = {});\n\n      var length = comparator.length;\n      if (_.isFunction(comparator)) comparator = comparator.bind(this);\n\n      // Run sort based on type of `comparator`.\n      if (length === 1 || _.isString(comparator)) {\n        this.models = this.sortBy(comparator);\n      } else {\n        this.models.sort(comparator);\n      }\n      if (!options.silent) this.trigger('sort', this, options);\n      return this;\n    },\n\n    // Pluck an attribute from each model in the collection.\n    pluck: function(attr) {\n      return this.map(attr + '');\n    },\n\n    // Fetch the default set of models for this collection, resetting the\n    // collection when they arrive. If `reset: true` is passed, the response\n    // data will be passed through the `reset` method instead of `set`.\n    fetch: function(options) {\n      options = _.extend({parse: true}, options);\n      var success = options.success;\n      var collection = this;\n      options.success = function(resp) {\n        var method = options.reset ? 'reset' : 'set';\n        collection[method](resp, options);\n        if (success) success.call(options.context, collection, resp, options);\n        collection.trigger('sync', collection, resp, options);\n      };\n      wrapError(this, options);\n      return this.sync('read', this, options);\n    },\n\n    // Create a new instance of a model in this collection. Add the model to the\n    // collection immediately, unless `wait: true` is passed, in which case we\n    // wait for the server to agree.\n    create: function(model, options) {\n      options = options ? _.clone(options) : {};\n      var wait = options.wait;\n      model = this._prepareModel(model, options);\n      if (!model) return false;\n      if (!wait) this.add(model, options);\n      var collection = this;\n      var success = options.success;\n      options.success = function(m, resp, callbackOpts) {\n        if (wait) {\n          m.off('error', collection._forwardPristineError, collection);\n          collection.add(m, callbackOpts);\n        }\n        if (success) success.call(callbackOpts.context, m, resp, callbackOpts);\n      };\n      // In case of wait:true, our collection is not listening to any\n      // of the model's events yet, so it will not forward the error\n      // event. In this special case, we need to listen for it\n      // separately and handle the event just once.\n      // (The reason we don't need to do this for the sync event is\n      // in the success handler above: we add the model first, which\n      // causes the collection to listen, and then invoke the callback\n      // that triggers the event.)\n      if (wait) {\n        model.once('error', this._forwardPristineError, this);\n      }\n      model.save(null, options);\n      return model;\n    },\n\n    // **parse** converts a response into a list of models to be added to the\n    // collection. The default implementation is just to pass it through.\n    parse: function(resp, options) {\n      return resp;\n    },\n\n    // Create a new collection with an identical list of models as this one.\n    clone: function() {\n      return new this.constructor(this.models, {\n        model: this.model,\n        comparator: this.comparator\n      });\n    },\n\n    // Define how to uniquely identify models in the collection.\n    modelId: function(attrs, idAttribute) {\n      return attrs[idAttribute || this.model.prototype.idAttribute || 'id'];\n    },\n\n    // Get an iterator of all models in this collection.\n    values: function() {\n      return new CollectionIterator(this, ITERATOR_VALUES);\n    },\n\n    // Get an iterator of all model IDs in this collection.\n    keys: function() {\n      return new CollectionIterator(this, ITERATOR_KEYS);\n    },\n\n    // Get an iterator of all [ID, model] tuples in this collection.\n    entries: function() {\n      return new CollectionIterator(this, ITERATOR_KEYSVALUES);\n    },\n\n    // Private method to reset all internal state. Called when the collection\n    // is first initialized or reset.\n    _reset: function() {\n      this.length = 0;\n      this.models = [];\n      this._byId  = {};\n    },\n\n    // Prepare a hash of attributes (or other model) to be added to this\n    // collection.\n    _prepareModel: function(attrs, options) {\n      if (this._isModel(attrs)) {\n        if (!attrs.collection) attrs.collection = this;\n        return attrs;\n      }\n      options = options ? _.clone(options) : {};\n      options.collection = this;\n\n      var model;\n      if (this.model.prototype) {\n        model = new this.model(attrs, options);\n      } else {\n        // ES class methods didn't have prototype\n        model = this.model(attrs, options);\n      }\n\n      if (!model.validationError) return model;\n      this.trigger('invalid', this, model.validationError, options);\n      return false;\n    },\n\n    // Internal method called by both remove and set.\n    _removeModels: function(models, options) {\n      var removed = [];\n      for (var i = 0; i < models.length; i++) {\n        var model = this.get(models[i]);\n        if (!model) continue;\n\n        var index = this.indexOf(model);\n        this.models.splice(index, 1);\n        this.length--;\n\n        // Remove references before triggering 'remove' event to prevent an\n        // infinite loop. #3693\n        delete this._byId[model.cid];\n        var id = this.modelId(model.attributes, model.idAttribute);\n        if (id != null) delete this._byId[id];\n\n        if (!options.silent) {\n          options.index = index;\n          model.trigger('remove', model, this, options);\n        }\n\n        removed.push(model);\n        this._removeReference(model, options);\n      }\n      if (models.length > 0 && !options.silent) delete options.index;\n      return removed;\n    },\n\n    // Method for checking whether an object should be considered a model for\n    // the purposes of adding to the collection.\n    _isModel: function(model) {\n      return model instanceof Model;\n    },\n\n    // Internal method to create a model's ties to a collection.\n    _addReference: function(model, options) {\n      this._byId[model.cid] = model;\n      var id = this.modelId(model.attributes, model.idAttribute);\n      if (id != null) this._byId[id] = model;\n      model.on('all', this._onModelEvent, this);\n    },\n\n    // Internal method to sever a model's ties to a collection.\n    _removeReference: function(model, options) {\n      delete this._byId[model.cid];\n      var id = this.modelId(model.attributes, model.idAttribute);\n      if (id != null) delete this._byId[id];\n      if (this === model.collection) delete model.collection;\n      model.off('all', this._onModelEvent, this);\n    },\n\n    // Internal method called every time a model in the set fires an event.\n    // Sets need to update their indexes when models change ids. All other\n    // events simply proxy through. \"add\" and \"remove\" events that originate\n    // in other collections are ignored.\n    _onModelEvent: function(event, model, collection, options) {\n      if (model) {\n        if ((event === 'add' || event === 'remove') && collection !== this) return;\n        if (event === 'destroy') this.remove(model, options);\n        if (event === 'changeId') {\n          var prevId = this.modelId(model.previousAttributes(), model.idAttribute);\n          var id = this.modelId(model.attributes, model.idAttribute);\n          if (prevId != null) delete this._byId[prevId];\n          if (id != null) this._byId[id] = model;\n        }\n      }\n      this.trigger.apply(this, arguments);\n    },\n\n    // Internal callback method used in `create`. It serves as a\n    // stand-in for the `_onModelEvent` method, which is not yet bound\n    // during the `wait` period of the `create` call. We still want to\n    // forward any `'error'` event at the end of the `wait` period,\n    // hence a customized callback.\n    _forwardPristineError: function(model, collection, options) {\n      // Prevent double forward if the model was already in the\n      // collection before the call to `create`.\n      if (this.has(model)) return;\n      this._onModelEvent('error', model, collection, options);\n    }\n  });\n\n  // Defining an @@iterator method implements JavaScript's Iterable protocol.\n  // In modern ES2015 browsers, this value is found at Symbol.iterator.\n  /* global Symbol */\n  var $$iterator = typeof Symbol === 'function' && Symbol.iterator;\n  if ($$iterator) {\n    Collection.prototype[$$iterator] = Collection.prototype.values;\n  }\n\n  // CollectionIterator\n  // ------------------\n\n  // A CollectionIterator implements JavaScript's Iterator protocol, allowing the\n  // use of `for of` loops in modern browsers and interoperation between\n  // Backbone.Collection and other JavaScript functions and third-party libraries\n  // which can operate on Iterables.\n  var CollectionIterator = function(collection, kind) {\n    this._collection = collection;\n    this._kind = kind;\n    this._index = 0;\n  };\n\n  // This \"enum\" defines the three possible kinds of values which can be emitted\n  // by a CollectionIterator that correspond to the values(), keys() and entries()\n  // methods on Collection, respectively.\n  var ITERATOR_VALUES = 1;\n  var ITERATOR_KEYS = 2;\n  var ITERATOR_KEYSVALUES = 3;\n\n  // All Iterators should themselves be Iterable.\n  if ($$iterator) {\n    CollectionIterator.prototype[$$iterator] = function() {\n      return this;\n    };\n  }\n\n  CollectionIterator.prototype.next = function() {\n    if (this._collection) {\n\n      // Only continue iterating if the iterated collection is long enough.\n      if (this._index < this._collection.length) {\n        var model = this._collection.at(this._index);\n        this._index++;\n\n        // Construct a value depending on what kind of values should be iterated.\n        var value;\n        if (this._kind === ITERATOR_VALUES) {\n          value = model;\n        } else {\n          var id = this._collection.modelId(model.attributes, model.idAttribute);\n          if (this._kind === ITERATOR_KEYS) {\n            value = id;\n          } else { // ITERATOR_KEYSVALUES\n            value = [id, model];\n          }\n        }\n        return {value: value, done: false};\n      }\n\n      // Once exhausted, remove the reference to the collection so future\n      // calls to the next method always return done.\n      this._collection = void 0;\n    }\n\n    return {value: void 0, done: true};\n  };\n\n  // Backbone.View\n  // -------------\n\n  // Backbone Views are almost more convention than they are actual code. A View\n  // is simply a JavaScript object that represents a logical chunk of UI in the\n  // DOM. This might be a single item, an entire list, a sidebar or panel, or\n  // even the surrounding frame which wraps your whole app. Defining a chunk of\n  // UI as a **View** allows you to define your DOM events declaratively, without\n  // having to worry about render order ... and makes it easy for the view to\n  // react to specific changes in the state of your models.\n\n  // Creating a Backbone.View creates its initial element outside of the DOM,\n  // if an existing element is not provided...\n  var View = Backbone.View = function(options) {\n    this.cid = _.uniqueId('view');\n    this.preinitialize.apply(this, arguments);\n    _.extend(this, _.pick(options, viewOptions));\n    this._ensureElement();\n    this.initialize.apply(this, arguments);\n  };\n\n  // Cached regex to split keys for `delegate`.\n  var delegateEventSplitter = /^(\\S+)\\s*(.*)$/;\n\n  // List of view options to be set as properties.\n  var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName', 'events'];\n\n  // Set up all inheritable **Backbone.View** properties and methods.\n  _.extend(View.prototype, Events, {\n\n    // The default `tagName` of a View's element is `\"div\"`.\n    tagName: 'div',\n\n    // jQuery delegate for element lookup, scoped to DOM elements within the\n    // current view. This should be preferred to global lookups where possible.\n    $: function(selector) {\n      return this.$el.find(selector);\n    },\n\n    // preinitialize is an empty function by default. You can override it with a function\n    // or object.  preinitialize will run before any instantiation logic is run in the View\n    preinitialize: function(){},\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize: function(){},\n\n    // **render** is the core function that your view should override, in order\n    // to populate its element (`this.el`), with the appropriate HTML. The\n    // convention is for **render** to always return `this`.\n    render: function() {\n      return this;\n    },\n\n    // Remove this view by taking the element out of the DOM, and removing any\n    // applicable Backbone.Events listeners.\n    remove: function() {\n      this._removeElement();\n      this.stopListening();\n      return this;\n    },\n\n    // Remove this view's element from the document and all event listeners\n    // attached to it. Exposed for subclasses using an alternative DOM\n    // manipulation API.\n    _removeElement: function() {\n      this.$el.remove();\n    },\n\n    // Change the view's element (`this.el` property) and re-delegate the\n    // view's events on the new element.\n    setElement: function(element) {\n      this.undelegateEvents();\n      this._setElement(element);\n      this.delegateEvents();\n      return this;\n    },\n\n    // Creates the `this.el` and `this.$el` references for this view using the\n    // given `el`. `el` can be a CSS selector or an HTML string, a jQuery\n    // context or an element. Subclasses can override this to utilize an\n    // alternative DOM manipulation API and are only required to set the\n    // `this.el` property.\n    _setElement: function(el) {\n      this.$el = el instanceof Backbone.$ ? el : Backbone.$(el);\n      this.el = this.$el[0];\n    },\n\n    // Set callbacks, where `this.events` is a hash of\n    //\n    // *{\"event selector\": \"callback\"}*\n    //\n    //     {\n    //       'mousedown .title':  'edit',\n    //       'click .button':     'save',\n    //       'click .open':       function(e) { ... }\n    //     }\n    //\n    // pairs. Callbacks will be bound to the view, with `this` set properly.\n    // Uses event delegation for efficiency.\n    // Omitting the selector binds the event to `this.el`.\n    delegateEvents: function(events) {\n      events || (events = _.result(this, 'events'));\n      if (!events) return this;\n      this.undelegateEvents();\n      for (var key in events) {\n        var method = events[key];\n        if (!_.isFunction(method)) method = this[method];\n        if (!method) continue;\n        var match = key.match(delegateEventSplitter);\n        this.delegate(match[1], match[2], method.bind(this));\n      }\n      return this;\n    },\n\n    // Add a single event listener to the view's element (or a child element\n    // using `selector`). This only works for delegate-able events: not `focus`,\n    // `blur`, and not `change`, `submit`, and `reset` in Internet Explorer.\n    delegate: function(eventName, selector, listener) {\n      this.$el.on(eventName + '.delegateEvents' + this.cid, selector, listener);\n      return this;\n    },\n\n    // Clears all callbacks previously bound to the view by `delegateEvents`.\n    // You usually don't need to use this, but may wish to if you have multiple\n    // Backbone views attached to the same DOM element.\n    undelegateEvents: function() {\n      if (this.$el) this.$el.off('.delegateEvents' + this.cid);\n      return this;\n    },\n\n    // A finer-grained `undelegateEvents` for removing a single delegated event.\n    // `selector` and `listener` are both optional.\n    undelegate: function(eventName, selector, listener) {\n      this.$el.off(eventName + '.delegateEvents' + this.cid, selector, listener);\n      return this;\n    },\n\n    // Produces a DOM element to be assigned to your view. Exposed for\n    // subclasses using an alternative DOM manipulation API.\n    _createElement: function(tagName) {\n      return document.createElement(tagName);\n    },\n\n    // Ensure that the View has a DOM element to render into.\n    // If `this.el` is a string, pass it through `$()`, take the first\n    // matching element, and re-assign it to `el`. Otherwise, create\n    // an element from the `id`, `className` and `tagName` properties.\n    _ensureElement: function() {\n      if (!this.el) {\n        var attrs = _.extend({}, _.result(this, 'attributes'));\n        if (this.id) attrs.id = _.result(this, 'id');\n        if (this.className) attrs['class'] = _.result(this, 'className');\n        this.setElement(this._createElement(_.result(this, 'tagName')));\n        this._setAttributes(attrs);\n      } else {\n        this.setElement(_.result(this, 'el'));\n      }\n    },\n\n    // Set attributes from a hash on this view's element.  Exposed for\n    // subclasses using an alternative DOM manipulation API.\n    _setAttributes: function(attributes) {\n      this.$el.attr(attributes);\n    }\n\n  });\n\n  // Proxy Backbone class methods to Underscore functions, wrapping the model's\n  // `attributes` object or collection's `models` array behind the scenes.\n  //\n  // collection.filter(function(model) { return model.get('age') > 10 });\n  // collection.each(this.addView);\n  //\n  // `Function#apply` can be slow so we use the method's arg count, if we know it.\n  var addMethod = function(base, length, method, attribute) {\n    switch (length) {\n      case 1: return function() {\n        return base[method](this[attribute]);\n      };\n      case 2: return function(value) {\n        return base[method](this[attribute], value);\n      };\n      case 3: return function(iteratee, context) {\n        return base[method](this[attribute], cb(iteratee, this), context);\n      };\n      case 4: return function(iteratee, defaultVal, context) {\n        return base[method](this[attribute], cb(iteratee, this), defaultVal, context);\n      };\n      default: return function() {\n        var args = slice.call(arguments);\n        args.unshift(this[attribute]);\n        return base[method].apply(base, args);\n      };\n    }\n  };\n\n  var addUnderscoreMethods = function(Class, base, methods, attribute) {\n    _.each(methods, function(length, method) {\n      if (base[method]) Class.prototype[method] = addMethod(base, length, method, attribute);\n    });\n  };\n\n  // Support `collection.sortBy('attr')` and `collection.findWhere({id: 1})`.\n  var cb = function(iteratee, instance) {\n    if (_.isFunction(iteratee)) return iteratee;\n    if (_.isObject(iteratee) && !instance._isModel(iteratee)) return modelMatcher(iteratee);\n    if (_.isString(iteratee)) return function(model) { return model.get(iteratee); };\n    return iteratee;\n  };\n  var modelMatcher = function(attrs) {\n    var matcher = _.matches(attrs);\n    return function(model) {\n      return matcher(model.attributes);\n    };\n  };\n\n  // Underscore methods that we want to implement on the Collection.\n  // 90% of the core usefulness of Backbone Collections is actually implemented\n  // right here:\n  var collectionMethods = {forEach: 3, each: 3, map: 3, collect: 3, reduce: 0,\n    foldl: 0, inject: 0, reduceRight: 0, foldr: 0, find: 3, detect: 3, filter: 3,\n    select: 3, reject: 3, every: 3, all: 3, some: 3, any: 3, include: 3, includes: 3,\n    contains: 3, invoke: 0, max: 3, min: 3, toArray: 1, size: 1, first: 3,\n    head: 3, take: 3, initial: 3, rest: 3, tail: 3, drop: 3, last: 3,\n    without: 0, difference: 0, indexOf: 3, shuffle: 1, lastIndexOf: 3,\n    isEmpty: 1, chain: 1, sample: 3, partition: 3, groupBy: 3, countBy: 3,\n    sortBy: 3, indexBy: 3, findIndex: 3, findLastIndex: 3};\n\n\n  // Underscore methods that we want to implement on the Model, mapped to the\n  // number of arguments they take.\n  var modelMethods = {keys: 1, values: 1, pairs: 1, invert: 1, pick: 0,\n    omit: 0, chain: 1, isEmpty: 1};\n\n  // Mix in each Underscore method as a proxy to `Collection#models`.\n\n  _.each([\n    [Collection, collectionMethods, 'models'],\n    [Model, modelMethods, 'attributes']\n  ], function(config) {\n    var Base = config[0],\n        methods = config[1],\n        attribute = config[2];\n\n    Base.mixin = function(obj) {\n      var mappings = _.reduce(_.functions(obj), function(memo, name) {\n        memo[name] = 0;\n        return memo;\n      }, {});\n      addUnderscoreMethods(Base, obj, mappings, attribute);\n    };\n\n    addUnderscoreMethods(Base, _, methods, attribute);\n  });\n\n  // Backbone.sync\n  // -------------\n\n  // Override this function to change the manner in which Backbone persists\n  // models to the server. You will be passed the type of request, and the\n  // model in question. By default, makes a RESTful Ajax request\n  // to the model's `url()`. Some possible customizations could be:\n  //\n  // * Use `setTimeout` to batch rapid-fire updates into a single request.\n  // * Send up the models as XML instead of JSON.\n  // * Persist models via WebSockets instead of Ajax.\n  //\n  // Turn on `Backbone.emulateHTTP` in order to send `PUT` and `DELETE` requests\n  // as `POST`, with a `_method` parameter containing the true HTTP method,\n  // as well as all requests with the body as `application/x-www-form-urlencoded`\n  // instead of `application/json` with the model in a param named `model`.\n  // Useful when interfacing with server-side languages like **PHP** that make\n  // it difficult to read the body of `PUT` requests.\n  Backbone.sync = function(method, model, options) {\n    var type = methodMap[method];\n\n    // Default options, unless specified.\n    _.defaults(options || (options = {}), {\n      emulateHTTP: Backbone.emulateHTTP,\n      emulateJSON: Backbone.emulateJSON\n    });\n\n    // Default JSON-request options.\n    var params = {type: type, dataType: 'json'};\n\n    // Ensure that we have a URL.\n    if (!options.url) {\n      params.url = _.result(model, 'url') || urlError();\n    }\n\n    // Ensure that we have the appropriate request data.\n    if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) {\n      params.contentType = 'application/json';\n      params.data = JSON.stringify(options.attrs || model.toJSON(options));\n    }\n\n    // For older servers, emulate JSON by encoding the request into an HTML-form.\n    if (options.emulateJSON) {\n      params.contentType = 'application/x-www-form-urlencoded';\n      params.data = params.data ? {model: params.data} : {};\n    }\n\n    // For older servers, emulate HTTP by mimicking the HTTP method with `_method`\n    // And an `X-HTTP-Method-Override` header.\n    if (options.emulateHTTP && (type === 'PUT' || type === 'DELETE' || type === 'PATCH')) {\n      params.type = 'POST';\n      if (options.emulateJSON) params.data._method = type;\n      var beforeSend = options.beforeSend;\n      options.beforeSend = function(xhr) {\n        xhr.setRequestHeader('X-HTTP-Method-Override', type);\n        if (beforeSend) return beforeSend.apply(this, arguments);\n      };\n    }\n\n    // Don't process data on a non-GET request.\n    if (params.type !== 'GET' && !options.emulateJSON) {\n      params.processData = false;\n    }\n\n    // Pass along `textStatus` and `errorThrown` from jQuery.\n    var error = options.error;\n    options.error = function(xhr, textStatus, errorThrown) {\n      options.textStatus = textStatus;\n      options.errorThrown = errorThrown;\n      if (error) error.call(options.context, xhr, textStatus, errorThrown);\n    };\n\n    // Make the request, allowing the user to override any Ajax options.\n    var xhr = options.xhr = Backbone.ajax(_.extend(params, options));\n    model.trigger('request', model, xhr, options);\n    return xhr;\n  };\n\n  // Map from CRUD to HTTP for our default `Backbone.sync` implementation.\n  var methodMap = {\n    'create': 'POST',\n    'update': 'PUT',\n    'patch': 'PATCH',\n    'delete': 'DELETE',\n    'read': 'GET'\n  };\n\n  // Set the default implementation of `Backbone.ajax` to proxy through to `$`.\n  // Override this if you'd like to use a different library.\n  Backbone.ajax = function() {\n    return Backbone.$.ajax.apply(Backbone.$, arguments);\n  };\n\n  // Backbone.Router\n  // ---------------\n\n  // Routers map faux-URLs to actions, and fire events when routes are\n  // matched. Creating a new one sets its `routes` hash, if not set statically.\n  var Router = Backbone.Router = function(options) {\n    options || (options = {});\n    this.preinitialize.apply(this, arguments);\n    if (options.routes) this.routes = options.routes;\n    this._bindRoutes();\n    this.initialize.apply(this, arguments);\n  };\n\n  // Cached regular expressions for matching named param parts and splatted\n  // parts of route strings.\n  var optionalParam = /\\((.*?)\\)/g;\n  var namedParam    = /(\\(\\?)?:\\w+/g;\n  var splatParam    = /\\*\\w+/g;\n  var escapeRegExp  = /[\\-{}\\[\\]+?.,\\\\\\^$|#\\s]/g;\n\n  // Set up all inheritable **Backbone.Router** properties and methods.\n  _.extend(Router.prototype, Events, {\n\n    // preinitialize is an empty function by default. You can override it with a function\n    // or object.  preinitialize will run before any instantiation logic is run in the Router.\n    preinitialize: function(){},\n\n    // Initialize is an empty function by default. Override it with your own\n    // initialization logic.\n    initialize: function(){},\n\n    // Manually bind a single named route to a callback. For example:\n    //\n    //     this.route('search/:query/p:num', 'search', function(query, num) {\n    //       ...\n    //     });\n    //\n    route: function(route, name, callback) {\n      if (!_.isRegExp(route)) route = this._routeToRegExp(route);\n      if (_.isFunction(name)) {\n        callback = name;\n        name = '';\n      }\n      if (!callback) callback = this[name];\n      var router = this;\n      Backbone.history.route(route, function(fragment) {\n        var args = router._extractParameters(route, fragment);\n        if (router.execute(callback, args, name) !== false) {\n          router.trigger.apply(router, ['route:' + name].concat(args));\n          router.trigger('route', name, args);\n          Backbone.history.trigger('route', router, name, args);\n        }\n      });\n      return this;\n    },\n\n    // Execute a route handler with the provided parameters.  This is an\n    // excellent place to do pre-route setup or post-route cleanup.\n    execute: function(callback, args, name) {\n      if (callback) callback.apply(this, args);\n    },\n\n    // Simple proxy to `Backbone.history` to save a fragment into the history.\n    navigate: function(fragment, options) {\n      Backbone.history.navigate(fragment, options);\n      return this;\n    },\n\n    // Bind all defined routes to `Backbone.history`. We have to reverse the\n    // order of the routes here to support behavior where the most general\n    // routes can be defined at the bottom of the route map.\n    _bindRoutes: function() {\n      if (!this.routes) return;\n      this.routes = _.result(this, 'routes');\n      var route, routes = _.keys(this.routes);\n      while ((route = routes.pop()) != null) {\n        this.route(route, this.routes[route]);\n      }\n    },\n\n    // Convert a route string into a regular expression, suitable for matching\n    // against the current location hash.\n    _routeToRegExp: function(route) {\n      route = route.replace(escapeRegExp, '\\\\$&')\n      .replace(optionalParam, '(?:$1)?')\n      .replace(namedParam, function(match, optional) {\n        return optional ? match : '([^/?]+)';\n      })\n      .replace(splatParam, '([^?]*?)');\n      return new RegExp('^' + route + '(?:\\\\?([\\\\s\\\\S]*))?$');\n    },\n\n    // Given a route, and a URL fragment that it matches, return the array of\n    // extracted decoded parameters. Empty or unmatched parameters will be\n    // treated as `null` to normalize cross-browser behavior.\n    _extractParameters: function(route, fragment) {\n      var params = route.exec(fragment).slice(1);\n      return _.map(params, function(param, i) {\n        // Don't decode the search params.\n        if (i === params.length - 1) return param || null;\n        return param ? decodeURIComponent(param) : null;\n      });\n    }\n\n  });\n\n  // Backbone.History\n  // ----------------\n\n  // Handles cross-browser history management, based on either\n  // [pushState](http://diveintohtml5.info/history.html) and real URLs, or\n  // [onhashchange](https://developer.mozilla.org/en-US/docs/DOM/window.onhashchange)\n  // and URL fragments. If the browser supports neither (old IE, natch),\n  // falls back to polling.\n  var History = Backbone.History = function() {\n    this.handlers = [];\n    this.checkUrl = this.checkUrl.bind(this);\n\n    // Ensure that `History` can be used outside of the browser.\n    if (typeof window !== 'undefined') {\n      this.location = window.location;\n      this.history = window.history;\n    }\n  };\n\n  // Cached regex for stripping a leading hash/slash and trailing space.\n  var routeStripper = /^[#\\/]|\\s+$/g;\n\n  // Cached regex for stripping leading and trailing slashes.\n  var rootStripper = /^\\/+|\\/+$/g;\n\n  // Cached regex for stripping urls of hash.\n  var pathStripper = /#.*$/;\n\n  // Has the history handling already been started?\n  History.started = false;\n\n  // Set up all inheritable **Backbone.History** properties and methods.\n  _.extend(History.prototype, Events, {\n\n    // The default interval to poll for hash changes, if necessary, is\n    // twenty times a second.\n    interval: 50,\n\n    // Are we at the app root?\n    atRoot: function() {\n      var path = this.location.pathname.replace(/[^\\/]$/, '$&/');\n      return path === this.root && !this.getSearch();\n    },\n\n    // Does the pathname match the root?\n    matchRoot: function() {\n      var path = this.decodeFragment(this.location.pathname);\n      var rootPath = path.slice(0, this.root.length - 1) + '/';\n      return rootPath === this.root;\n    },\n\n    // Unicode characters in `location.pathname` are percent encoded so they're\n    // decoded for comparison. `%25` should not be decoded since it may be part\n    // of an encoded parameter.\n    decodeFragment: function(fragment) {\n      return decodeURI(fragment.replace(/%25/g, '%2525'));\n    },\n\n    // In IE6, the hash fragment and search params are incorrect if the\n    // fragment contains `?`.\n    getSearch: function() {\n      var match = this.location.href.replace(/#.*/, '').match(/\\?.+/);\n      return match ? match[0] : '';\n    },\n\n    // Gets the true hash value. Cannot use location.hash directly due to bug\n    // in Firefox where location.hash will always be decoded.\n    getHash: function(window) {\n      var match = (window || this).location.href.match(/#(.*)$/);\n      return match ? match[1] : '';\n    },\n\n    // Get the pathname and search params, without the root.\n    getPath: function() {\n      var path = this.decodeFragment(\n        this.location.pathname + this.getSearch()\n      ).slice(this.root.length - 1);\n      return path.charAt(0) === '/' ? path.slice(1) : path;\n    },\n\n    // Get the cross-browser normalized URL fragment from the path or hash.\n    getFragment: function(fragment) {\n      if (fragment == null) {\n        if (this._usePushState || !this._wantsHashChange) {\n          fragment = this.getPath();\n        } else {\n          fragment = this.getHash();\n        }\n      }\n      return fragment.replace(routeStripper, '');\n    },\n\n    // Start the hash change handling, returning `true` if the current URL matches\n    // an existing route, and `false` otherwise.\n    start: function(options) {\n      if (History.started) throw new Error('Backbone.history has already been started');\n      History.started = true;\n\n      // Figure out the initial configuration. Do we need an iframe?\n      // Is pushState desired ... is it available?\n      this.options          = _.extend({root: '/'}, this.options, options);\n      this.root             = this.options.root;\n      this._trailingSlash   = this.options.trailingSlash;\n      this._wantsHashChange = this.options.hashChange !== false;\n      this._hasHashChange   = 'onhashchange' in window && (document.documentMode === void 0 || document.documentMode > 7);\n      this._useHashChange   = this._wantsHashChange && this._hasHashChange;\n      this._wantsPushState  = !!this.options.pushState;\n      this._hasPushState    = !!(this.history && this.history.pushState);\n      this._usePushState    = this._wantsPushState && this._hasPushState;\n      this.fragment         = this.getFragment();\n\n      // Normalize root to always include a leading and trailing slash.\n      this.root = ('/' + this.root + '/').replace(rootStripper, '/');\n\n      // Transition from hashChange to pushState or vice versa if both are\n      // requested.\n      if (this._wantsHashChange && this._wantsPushState) {\n\n        // If we've started off with a route from a `pushState`-enabled\n        // browser, but we're currently in a browser that doesn't support it...\n        if (!this._hasPushState && !this.atRoot()) {\n          var rootPath = this.root.slice(0, -1) || '/';\n          this.location.replace(rootPath + '#' + this.getPath());\n          // Return immediately as browser will do redirect to new url\n          return true;\n\n        // Or if we've started out with a hash-based route, but we're currently\n        // in a browser where it could be `pushState`-based instead...\n        } else if (this._hasPushState && this.atRoot()) {\n          this.navigate(this.getHash(), {replace: true});\n        }\n\n      }\n\n      // Proxy an iframe to handle location events if the browser doesn't\n      // support the `hashchange` event, HTML5 history, or the user wants\n      // `hashChange` but not `pushState`.\n      if (!this._hasHashChange && this._wantsHashChange && !this._usePushState) {\n        this.iframe = document.createElement('iframe');\n        this.iframe.src = 'javascript:0';\n        this.iframe.style.display = 'none';\n        this.iframe.tabIndex = -1;\n        var body = document.body;\n        // Using `appendChild` will throw on IE < 9 if the document is not ready.\n        var iWindow = body.insertBefore(this.iframe, body.firstChild).contentWindow;\n        iWindow.document.open();\n        iWindow.document.close();\n        iWindow.location.hash = '#' + this.fragment;\n      }\n\n      // Add a cross-platform `addEventListener` shim for older browsers.\n      var addEventListener = window.addEventListener || function(eventName, listener) {\n        return attachEvent('on' + eventName, listener);\n      };\n\n      // Depending on whether we're using pushState or hashes, and whether\n      // 'onhashchange' is supported, determine how we check the URL state.\n      if (this._usePushState) {\n        addEventListener('popstate', this.checkUrl, false);\n      } else if (this._useHashChange && !this.iframe) {\n        addEventListener('hashchange', this.checkUrl, false);\n      } else if (this._wantsHashChange) {\n        this._checkUrlInterval = setInterval(this.checkUrl, this.interval);\n      }\n\n      if (!this.options.silent) return this.loadUrl();\n    },\n\n    // Disable Backbone.history, perhaps temporarily. Not useful in a real app,\n    // but possibly useful for unit testing Routers.\n    stop: function() {\n      // Add a cross-platform `removeEventListener` shim for older browsers.\n      var removeEventListener = window.removeEventListener || function(eventName, listener) {\n        return detachEvent('on' + eventName, listener);\n      };\n\n      // Remove window listeners.\n      if (this._usePushState) {\n        removeEventListener('popstate', this.checkUrl, false);\n      } else if (this._useHashChange && !this.iframe) {\n        removeEventListener('hashchange', this.checkUrl, false);\n      }\n\n      // Clean up the iframe if necessary.\n      if (this.iframe) {\n        document.body.removeChild(this.iframe);\n        this.iframe = null;\n      }\n\n      // Some environments will throw when clearing an undefined interval.\n      if (this._checkUrlInterval) clearInterval(this._checkUrlInterval);\n      History.started = false;\n    },\n\n    // Add a route to be tested when the fragment changes. Routes added later\n    // may override previous routes.\n    route: function(route, callback) {\n      this.handlers.unshift({route: route, callback: callback});\n    },\n\n    // Checks the current URL to see if it has changed, and if it has,\n    // calls `loadUrl`, normalizing across the hidden iframe.\n    checkUrl: function(e) {\n      var current = this.getFragment();\n\n      // If the user pressed the back button, the iframe's hash will have\n      // changed and we should use that for comparison.\n      if (current === this.fragment && this.iframe) {\n        current = this.getHash(this.iframe.contentWindow);\n      }\n\n      if (current === this.fragment) {\n        if (!this.matchRoot()) return this.notfound();\n        return false;\n      }\n      if (this.iframe) this.navigate(current);\n      this.loadUrl();\n    },\n\n    // Attempt to load the current URL fragment. If a route succeeds with a\n    // match, returns `true`. If no defined routes matches the fragment,\n    // returns `false`.\n    loadUrl: function(fragment) {\n      // If the root doesn't match, no routes can match either.\n      if (!this.matchRoot()) return this.notfound();\n      fragment = this.fragment = this.getFragment(fragment);\n      return _.some(this.handlers, function(handler) {\n        if (handler.route.test(fragment)) {\n          handler.callback(fragment);\n          return true;\n        }\n      }) || this.notfound();\n    },\n\n    // When no route could be matched, this method is called internally to\n    // trigger the `'notfound'` event. It returns `false` so that it can be used\n    // in tail position.\n    notfound: function() {\n      this.trigger('notfound');\n      return false;\n    },\n\n    // Save a fragment into the hash history, or replace the URL state if the\n    // 'replace' option is passed. You are responsible for properly URL-encoding\n    // the fragment in advance.\n    //\n    // The options object can contain `trigger: true` if you wish to have the\n    // route callback be fired (not usually desirable), or `replace: true`, if\n    // you wish to modify the current URL without adding an entry to the history.\n    navigate: function(fragment, options) {\n      if (!History.started) return false;\n      if (!options || options === true) options = {trigger: !!options};\n\n      // Normalize the fragment.\n      fragment = this.getFragment(fragment || '');\n\n      // Strip trailing slash on the root unless _trailingSlash is true\n      var rootPath = this.root;\n      if (!this._trailingSlash && (fragment === '' || fragment.charAt(0) === '?')) {\n        rootPath = rootPath.slice(0, -1) || '/';\n      }\n      var url = rootPath + fragment;\n\n      // Strip the fragment of the query and hash for matching.\n      fragment = fragment.replace(pathStripper, '');\n\n      // Decode for matching.\n      var decodedFragment = this.decodeFragment(fragment);\n\n      if (this.fragment === decodedFragment) return;\n      this.fragment = decodedFragment;\n\n      // If pushState is available, we use it to set the fragment as a real URL.\n      if (this._usePushState) {\n        this.history[options.replace ? 'replaceState' : 'pushState']({}, document.title, url);\n\n      // If hash changes haven't been explicitly disabled, update the hash\n      // fragment to store history.\n      } else if (this._wantsHashChange) {\n        this._updateHash(this.location, fragment, options.replace);\n        if (this.iframe && fragment !== this.getHash(this.iframe.contentWindow)) {\n          var iWindow = this.iframe.contentWindow;\n\n          // Opening and closing the iframe tricks IE7 and earlier to push a\n          // history entry on hash-tag change.  When replace is true, we don't\n          // want this.\n          if (!options.replace) {\n            iWindow.document.open();\n            iWindow.document.close();\n          }\n\n          this._updateHash(iWindow.location, fragment, options.replace);\n        }\n\n      // If you've told us that you explicitly don't want fallback hashchange-\n      // based history, then `navigate` becomes a page refresh.\n      } else {\n        return this.location.assign(url);\n      }\n      if (options.trigger) return this.loadUrl(fragment);\n    },\n\n    // Update the hash location, either replacing the current entry, or adding\n    // a new one to the browser history.\n    _updateHash: function(location, fragment, replace) {\n      if (replace) {\n        var href = location.href.replace(/(javascript:|#).*$/, '');\n        location.replace(href + '#' + fragment);\n      } else {\n        // Some browsers require that `hash` contains a leading #.\n        location.hash = '#' + fragment;\n      }\n    }\n\n  });\n\n  // Create the default Backbone.history.\n  Backbone.history = new History;\n\n  // Helpers\n  // -------\n\n  // Helper function to correctly set up the prototype chain for subclasses.\n  // Similar to `goog.inherits`, but uses a hash of prototype properties and\n  // class properties to be extended.\n  var extend = function(protoProps, staticProps) {\n    var parent = this;\n    var child;\n\n    // The constructor function for the new subclass is either defined by you\n    // (the \"constructor\" property in your `extend` definition), or defaulted\n    // by us to simply call the parent constructor.\n    if (protoProps && _.has(protoProps, 'constructor')) {\n      child = protoProps.constructor;\n    } else {\n      child = function(){ return parent.apply(this, arguments); };\n    }\n\n    // Add static properties to the constructor function, if supplied.\n    _.extend(child, parent, staticProps);\n\n    // Set the prototype chain to inherit from `parent`, without calling\n    // `parent`'s constructor function and add the prototype properties.\n    child.prototype = _.create(parent.prototype, protoProps);\n    child.prototype.constructor = child;\n\n    // Set a convenience property in case the parent's prototype is needed\n    // later.\n    child.__super__ = parent.prototype;\n\n    return child;\n  };\n\n  // Set up inheritance for the model, collection, router, view and history.\n  Model.extend = Collection.extend = Router.extend = View.extend = History.extend = extend;\n\n  // Throw an error when a URL is needed, and none is supplied.\n  var urlError = function() {\n    throw new Error('A \"url\" property or function must be specified');\n  };\n\n  // Wrap an optional error callback with a fallback error event.\n  var wrapError = function(model, options) {\n    var error = options.error;\n    options.error = function(resp) {\n      if (error) error.call(options.context, model, resp, options);\n      model.trigger('error', model, resp, options);\n    };\n  };\n\n  // Provide useful information when things go wrong. This method is not meant\n  // to be used directly; it merely provides the necessary introspection for the\n  // external `debugInfo` function.\n  Backbone._debug = function() {\n    return {root: root, _: _};\n  };\n\n  return Backbone;\n});\n","/*!\n * jQuery UI :data 1.14.1\n * https://jqueryui.com\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license.\n * https://jquery.org/license\n */\n\n//>>label: :data Selector\n//>>group: Core\n//>>description: Selects elements which have data stored under the specified key.\n//>>docs: https://api.jqueryui.com/data-selector/\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [ \"jquery\", \"./version\" ], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nreturn $.extend( $.expr.pseudos, {\n\tdata: $.expr.createPseudo( function( dataName ) {\n\t\treturn function( elem ) {\n\t\t\treturn !!$.data( elem, dataName );\n\t\t};\n\t} )\n} );\n} );\n","/*!\n * jQuery UI Keycode 1.14.1\n * https://jqueryui.com\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license.\n * https://jquery.org/license\n */\n\n//>>label: Keycode\n//>>group: Core\n//>>description: Provide keycodes as keynames\n//>>docs: https://api.jqueryui.com/jQuery.ui.keyCode/\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [ \"jquery\", \"./version\" ], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nreturn $.ui.keyCode = {\n\tBACKSPACE: 8,\n\tCOMMA: 188,\n\tDELETE: 46,\n\tDOWN: 40,\n\tEND: 35,\n\tENTER: 13,\n\tESCAPE: 27,\n\tHOME: 36,\n\tLEFT: 37,\n\tPAGE_DOWN: 34,\n\tPAGE_UP: 33,\n\tPERIOD: 190,\n\tRIGHT: 39,\n\tSPACE: 32,\n\tTAB: 9,\n\tUP: 38\n};\n\n} );\n","( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [ \"jquery\", \"./version\" ], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\n// $.ui.plugin is deprecated. Use $.widget() extensions instead.\nreturn $.ui.plugin = {\n\tadd: function( module, option, set ) {\n\t\tvar i,\n\t\t\tproto = $.ui[ module ].prototype;\n\t\tfor ( i in set ) {\n\t\t\tproto.plugins[ i ] = proto.plugins[ i ] || [];\n\t\t\tproto.plugins[ i ].push( [ option, set[ i ] ] );\n\t\t}\n\t},\n\tcall: function( instance, name, args, allowDisconnected ) {\n\t\tvar i,\n\t\t\tset = instance.plugins[ name ];\n\n\t\tif ( !set ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !allowDisconnected && ( !instance.element[ 0 ].parentNode ||\n\t\t\t\tinstance.element[ 0 ].parentNode.nodeType === 11 ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor ( i = 0; i < set.length; i++ ) {\n\t\t\tif ( instance.options[ set[ i ][ 0 ] ] ) {\n\t\t\t\tset[ i ][ 1 ].apply( instance.element, args );\n\t\t\t}\n\t\t}\n\t}\n};\n\n} );\n","/*!\n * jQuery UI Scroll Parent 1.14.1\n * https://jqueryui.com\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license.\n * https://jquery.org/license\n */\n\n//>>label: scrollParent\n//>>group: Core\n//>>description: Get the closest ancestor element that is scrollable.\n//>>docs: https://api.jqueryui.com/scrollParent/\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [ \"jquery\", \"./version\" ], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nreturn $.fn.scrollParent = function( includeHidden ) {\n\tvar position = this.css( \"position\" ),\n\t\texcludeStaticParent = position === \"absolute\",\n\t\toverflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,\n\t\tscrollParent = this.parents().filter( function() {\n\t\t\tvar parent = $( this );\n\t\t\tif ( excludeStaticParent && parent.css( \"position\" ) === \"static\" ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn overflowRegex.test( parent.css( \"overflow\" ) + parent.css( \"overflow-y\" ) +\n\t\t\t\tparent.css( \"overflow-x\" ) );\n\t\t} ).eq( 0 );\n\n\treturn position === \"fixed\" || !scrollParent.length ?\n\t\t$( this[ 0 ].ownerDocument || document ) :\n\t\tscrollParent;\n};\n\n} );\n","( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [ \"jquery\" ], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\n$.ui = $.ui || {};\n\nreturn $.ui.version = \"1.14.1\";\n\n} );\n","/*!\n * jQuery UI Widget 1.14.1\n * https://jqueryui.com\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license.\n * https://jquery.org/license\n */\n\n//>>label: Widget\n//>>group: Core\n//>>description: Provides a factory for creating stateful widgets with a common API.\n//>>docs: https://api.jqueryui.com/jQuery.widget/\n//>>demos: https://jqueryui.com/widget/\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [ \"jquery\", \"./version\" ], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nvar widgetUuid = 0;\nvar widgetHasOwnProperty = Array.prototype.hasOwnProperty;\nvar widgetSlice = Array.prototype.slice;\n\n$.cleanData = ( function( orig ) {\n\treturn function( elems ) {\n\t\tvar events, elem, i;\n\t\tfor ( i = 0; ( elem = elems[ i ] ) != null; i++ ) {\n\n\t\t\t// Only trigger remove when necessary to save time\n\t\t\tevents = $._data( elem, \"events\" );\n\t\t\tif ( events && events.remove ) {\n\t\t\t\t$( elem ).triggerHandler( \"remove\" );\n\t\t\t}\n\t\t}\n\t\torig( elems );\n\t};\n} )( $.cleanData );\n\n$.widget = function( name, base, prototype ) {\n\tvar existingConstructor, constructor, basePrototype;\n\n\t// ProxiedPrototype allows the provided prototype to remain unmodified\n\t// so that it can be used as a mixin for multiple widgets (#8876)\n\tvar proxiedPrototype = {};\n\n\tvar namespace = name.split( \".\" )[ 0 ];\n\tname = name.split( \".\" )[ 1 ];\n\tif ( name === \"__proto__\" || name === \"constructor\" ) {\n\t\treturn $.error( \"Invalid widget name: \" + name );\n\t}\n\tvar fullName = namespace + \"-\" + name;\n\n\tif ( !prototype ) {\n\t\tprototype = base;\n\t\tbase = $.Widget;\n\t}\n\n\tif ( Array.isArray( prototype ) ) {\n\t\tprototype = $.extend.apply( null, [ {} ].concat( prototype ) );\n\t}\n\n\t// Create selector for plugin\n\t$.expr.pseudos[ fullName.toLowerCase() ] = function( elem ) {\n\t\treturn !!$.data( elem, fullName );\n\t};\n\n\t$[ namespace ] = $[ namespace ] || {};\n\texistingConstructor = $[ namespace ][ name ];\n\tconstructor = $[ namespace ][ name ] = function( options, element ) {\n\n\t\t// Allow instantiation without \"new\" keyword\n\t\tif ( !this || !this._createWidget ) {\n\t\t\treturn new constructor( options, element );\n\t\t}\n\n\t\t// Allow instantiation without initializing for simple inheritance\n\t\t// must use \"new\" keyword (the code above always passes args)\n\t\tif ( arguments.length ) {\n\t\t\tthis._createWidget( options, element );\n\t\t}\n\t};\n\n\t// Extend with the existing constructor to carry over any static properties\n\t$.extend( constructor, existingConstructor, {\n\t\tversion: prototype.version,\n\n\t\t// Copy the object used to create the prototype in case we need to\n\t\t// redefine the widget later\n\t\t_proto: $.extend( {}, prototype ),\n\n\t\t// Track widgets that inherit from this widget in case this widget is\n\t\t// redefined after a widget inherits from it\n\t\t_childConstructors: []\n\t} );\n\n\tbasePrototype = new base();\n\n\t// We need to make the options hash a property directly on the new instance\n\t// otherwise we'll modify the options hash on the prototype that we're\n\t// inheriting from\n\tbasePrototype.options = $.widget.extend( {}, basePrototype.options );\n\t$.each( prototype, function( prop, value ) {\n\t\tif ( typeof value !== \"function\" ) {\n\t\t\tproxiedPrototype[ prop ] = value;\n\t\t\treturn;\n\t\t}\n\t\tproxiedPrototype[ prop ] = ( function() {\n\t\t\tfunction _super() {\n\t\t\t\treturn base.prototype[ prop ].apply( this, arguments );\n\t\t\t}\n\n\t\t\tfunction _superApply( args ) {\n\t\t\t\treturn base.prototype[ prop ].apply( this, args );\n\t\t\t}\n\n\t\t\treturn function() {\n\t\t\t\tvar __super = this._super;\n\t\t\t\tvar __superApply = this._superApply;\n\t\t\t\tvar returnValue;\n\n\t\t\t\tthis._super = _super;\n\t\t\t\tthis._superApply = _superApply;\n\n\t\t\t\treturnValue = value.apply( this, arguments );\n\n\t\t\t\tthis._super = __super;\n\t\t\t\tthis._superApply = __superApply;\n\n\t\t\t\treturn returnValue;\n\t\t\t};\n\t\t} )();\n\t} );\n\tconstructor.prototype = $.widget.extend( basePrototype, {\n\n\t\t// TODO: remove support for widgetEventPrefix\n\t\t// always use the name + a colon as the prefix, e.g., draggable:start\n\t\t// don't prefix for widgets that aren't DOM-based\n\t\twidgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name\n\t}, proxiedPrototype, {\n\t\tconstructor: constructor,\n\t\tnamespace: namespace,\n\t\twidgetName: name,\n\t\twidgetFullName: fullName\n\t} );\n\n\t// If this widget is being redefined then we need to find all widgets that\n\t// are inheriting from it and redefine all of them so that they inherit from\n\t// the new version of this widget. We're essentially trying to replace one\n\t// level in the prototype chain.\n\tif ( existingConstructor ) {\n\t\t$.each( existingConstructor._childConstructors, function( i, child ) {\n\t\t\tvar childPrototype = child.prototype;\n\n\t\t\t// Redefine the child widget using the same prototype that was\n\t\t\t// originally used, but inherit from the new version of the base\n\t\t\t$.widget( childPrototype.namespace + \".\" + childPrototype.widgetName, constructor,\n\t\t\t\tchild._proto );\n\t\t} );\n\n\t\t// Remove the list of existing child constructors from the old constructor\n\t\t// so the old child constructors can be garbage collected\n\t\tdelete existingConstructor._childConstructors;\n\t} else {\n\t\tbase._childConstructors.push( constructor );\n\t}\n\n\t$.widget.bridge( name, constructor );\n\n\treturn constructor;\n};\n\n$.widget.extend = function( target ) {\n\tvar input = widgetSlice.call( arguments, 1 );\n\tvar inputIndex = 0;\n\tvar inputLength = input.length;\n\tvar key;\n\tvar value;\n\n\tfor ( ; inputIndex < inputLength; inputIndex++ ) {\n\t\tfor ( key in input[ inputIndex ] ) {\n\t\t\tvalue = input[ inputIndex ][ key ];\n\t\t\tif ( widgetHasOwnProperty.call( input[ inputIndex ], key ) && value !== undefined ) {\n\n\t\t\t\t// Clone objects\n\t\t\t\tif ( $.isPlainObject( value ) ) {\n\t\t\t\t\ttarget[ key ] = $.isPlainObject( target[ key ] ) ?\n\t\t\t\t\t\t$.widget.extend( {}, target[ key ], value ) :\n\n\t\t\t\t\t\t// Don't extend strings, arrays, etc. with objects\n\t\t\t\t\t\t$.widget.extend( {}, value );\n\n\t\t\t\t// Copy everything else by reference\n\t\t\t\t} else {\n\t\t\t\t\ttarget[ key ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn target;\n};\n\n$.widget.bridge = function( name, object ) {\n\tvar fullName = object.prototype.widgetFullName || name;\n\t$.fn[ name ] = function( options ) {\n\t\tvar isMethodCall = typeof options === \"string\";\n\t\tvar args = widgetSlice.call( arguments, 1 );\n\t\tvar returnValue = this;\n\n\t\tif ( isMethodCall ) {\n\n\t\t\t// If this is an empty collection, we need to have the instance method\n\t\t\t// return undefined instead of the jQuery instance\n\t\t\tif ( !this.length && options === \"instance\" ) {\n\t\t\t\treturnValue = undefined;\n\t\t\t} else {\n\t\t\t\tthis.each( function() {\n\t\t\t\t\tvar methodValue;\n\t\t\t\t\tvar instance = $.data( this, fullName );\n\n\t\t\t\t\tif ( options === \"instance\" ) {\n\t\t\t\t\t\treturnValue = instance;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !instance ) {\n\t\t\t\t\t\treturn $.error( \"cannot call methods on \" + name +\n\t\t\t\t\t\t\t\" prior to initialization; \" +\n\t\t\t\t\t\t\t\"attempted to call method '\" + options + \"'\" );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( typeof instance[ options ] !== \"function\" ||\n\t\t\t\t\t\toptions.charAt( 0 ) === \"_\" ) {\n\t\t\t\t\t\treturn $.error( \"no such method '\" + options + \"' for \" + name +\n\t\t\t\t\t\t\t\" widget instance\" );\n\t\t\t\t\t}\n\n\t\t\t\t\tmethodValue = instance[ options ].apply( instance, args );\n\n\t\t\t\t\tif ( methodValue !== instance && methodValue !== undefined ) {\n\t\t\t\t\t\treturnValue = methodValue && methodValue.jquery ?\n\t\t\t\t\t\t\treturnValue.pushStack( methodValue.get() ) :\n\t\t\t\t\t\t\tmethodValue;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t} else {\n\n\t\t\t// Allow multiple hashes to be passed on init\n\t\t\tif ( args.length ) {\n\t\t\t\toptions = $.widget.extend.apply( null, [ options ].concat( args ) );\n\t\t\t}\n\n\t\t\tthis.each( function() {\n\t\t\t\tvar instance = $.data( this, fullName );\n\t\t\t\tif ( instance ) {\n\t\t\t\t\tinstance.option( options || {} );\n\t\t\t\t\tif ( instance._init ) {\n\t\t\t\t\t\tinstance._init();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t$.data( this, fullName, new object( options, this ) );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn returnValue;\n\t};\n};\n\n$.Widget = function( /* options, element */ ) {};\n$.Widget._childConstructors = [];\n\n$.Widget.prototype = {\n\twidgetName: \"widget\",\n\twidgetEventPrefix: \"\",\n\tdefaultElement: \"<div>\",\n\n\toptions: {\n\t\tclasses: {},\n\t\tdisabled: false,\n\n\t\t// Callbacks\n\t\tcreate: null\n\t},\n\n\t_createWidget: function( options, element ) {\n\t\telement = $( element || this.defaultElement || this )[ 0 ];\n\t\tthis.element = $( element );\n\t\tthis.uuid = widgetUuid++;\n\t\tthis.eventNamespace = \".\" + this.widgetName + this.uuid;\n\n\t\tthis.bindings = $();\n\t\tthis.hoverable = $();\n\t\tthis.focusable = $();\n\t\tthis.classesElementLookup = {};\n\n\t\tif ( element !== this ) {\n\t\t\t$.data( element, this.widgetFullName, this );\n\t\t\tthis._on( true, this.element, {\n\t\t\t\tremove: function( event ) {\n\t\t\t\t\tif ( event.target === element ) {\n\t\t\t\t\t\tthis.destroy();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t\tthis.document = $( element.style ?\n\n\t\t\t\t// Element within the document\n\t\t\t\telement.ownerDocument :\n\n\t\t\t\t// Element is window or document\n\t\t\t\telement.document || element );\n\t\t\tthis.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow );\n\t\t}\n\n\t\tthis.options = $.widget.extend( {},\n\t\t\tthis.options,\n\t\t\tthis._getCreateOptions(),\n\t\t\toptions );\n\n\t\tthis._create();\n\n\t\tif ( this.options.disabled ) {\n\t\t\tthis._setOptionDisabled( this.options.disabled );\n\t\t}\n\n\t\tthis._trigger( \"create\", null, this._getCreateEventData() );\n\t\tthis._init();\n\t},\n\n\t_getCreateOptions: function() {\n\t\treturn {};\n\t},\n\n\t_getCreateEventData: $.noop,\n\n\t_create: $.noop,\n\n\t_init: $.noop,\n\n\tdestroy: function() {\n\t\tvar that = this;\n\n\t\tthis._destroy();\n\t\t$.each( this.classesElementLookup, function( key, value ) {\n\t\t\tthat._removeClass( value, key );\n\t\t} );\n\n\t\t// We can probably remove the unbind calls in 2.0\n\t\t// all event bindings should go through this._on()\n\t\tthis.element\n\t\t\t.off( this.eventNamespace )\n\t\t\t.removeData( this.widgetFullName );\n\t\tthis.widget()\n\t\t\t.off( this.eventNamespace )\n\t\t\t.removeAttr( \"aria-disabled\" );\n\n\t\t// Clean up events and states\n\t\tthis.bindings.off( this.eventNamespace );\n\t},\n\n\t_destroy: $.noop,\n\n\twidget: function() {\n\t\treturn this.element;\n\t},\n\n\toption: function( key, value ) {\n\t\tvar options = key;\n\t\tvar parts;\n\t\tvar curOption;\n\t\tvar i;\n\n\t\tif ( arguments.length === 0 ) {\n\n\t\t\t// Don't return a reference to the internal hash\n\t\t\treturn $.widget.extend( {}, this.options );\n\t\t}\n\n\t\tif ( typeof key === \"string\" ) {\n\n\t\t\t// Handle nested keys, e.g., \"foo.bar\" => { foo: { bar: ___ } }\n\t\t\toptions = {};\n\t\t\tparts = key.split( \".\" );\n\t\t\tkey = parts.shift();\n\t\t\tif ( parts.length ) {\n\t\t\t\tcurOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );\n\t\t\t\tfor ( i = 0; i < parts.length - 1; i++ ) {\n\t\t\t\t\tcurOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};\n\t\t\t\t\tcurOption = curOption[ parts[ i ] ];\n\t\t\t\t}\n\t\t\t\tkey = parts.pop();\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn curOption[ key ] === undefined ? null : curOption[ key ];\n\t\t\t\t}\n\t\t\t\tcurOption[ key ] = value;\n\t\t\t} else {\n\t\t\t\tif ( arguments.length === 1 ) {\n\t\t\t\t\treturn this.options[ key ] === undefined ? null : this.options[ key ];\n\t\t\t\t}\n\t\t\t\toptions[ key ] = value;\n\t\t\t}\n\t\t}\n\n\t\tthis._setOptions( options );\n\n\t\treturn this;\n\t},\n\n\t_setOptions: function( options ) {\n\t\tvar key;\n\n\t\tfor ( key in options ) {\n\t\t\tthis._setOption( key, options[ key ] );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tif ( key === \"classes\" ) {\n\t\t\tthis._setOptionClasses( value );\n\t\t}\n\n\t\tthis.options[ key ] = value;\n\n\t\tif ( key === \"disabled\" ) {\n\t\t\tthis._setOptionDisabled( value );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_setOptionClasses: function( value ) {\n\t\tvar classKey, elements, currentElements;\n\n\t\tfor ( classKey in value ) {\n\t\t\tcurrentElements = this.classesElementLookup[ classKey ];\n\t\t\tif ( value[ classKey ] === this.options.classes[ classKey ] ||\n\t\t\t\t\t!currentElements ||\n\t\t\t\t\t!currentElements.length ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// We are doing this to create a new jQuery object because the _removeClass() call\n\t\t\t// on the next line is going to destroy the reference to the current elements being\n\t\t\t// tracked. We need to save a copy of this collection so that we can add the new classes\n\t\t\t// below.\n\t\t\telements = $( currentElements.get() );\n\t\t\tthis._removeClass( currentElements, classKey );\n\n\t\t\t// We don't use _addClass() here, because that uses this.options.classes\n\t\t\t// for generating the string of classes. We want to use the value passed in from\n\t\t\t// _setOption(), this is the new value of the classes option which was passed to\n\t\t\t// _setOption(). We pass this value directly to _classes().\n\t\t\telements.addClass( this._classes( {\n\t\t\t\telement: elements,\n\t\t\t\tkeys: classKey,\n\t\t\t\tclasses: value,\n\t\t\t\tadd: true\n\t\t\t} ) );\n\t\t}\n\t},\n\n\t_setOptionDisabled: function( value ) {\n\t\tthis._toggleClass( this.widget(), this.widgetFullName + \"-disabled\", null, !!value );\n\n\t\t// If the widget is becoming disabled, then nothing is interactive\n\t\tif ( value ) {\n\t\t\tthis._removeClass( this.hoverable, null, \"ui-state-hover\" );\n\t\t\tthis._removeClass( this.focusable, null, \"ui-state-focus\" );\n\t\t}\n\t},\n\n\tenable: function() {\n\t\treturn this._setOptions( { disabled: false } );\n\t},\n\n\tdisable: function() {\n\t\treturn this._setOptions( { disabled: true } );\n\t},\n\n\t_classes: function( options ) {\n\t\tvar full = [];\n\t\tvar that = this;\n\n\t\toptions = $.extend( {\n\t\t\telement: this.element,\n\t\t\tclasses: this.options.classes || {}\n\t\t}, options );\n\n\t\tfunction bindRemoveEvent() {\n\t\t\tvar nodesToBind = [];\n\n\t\t\toptions.element.each( function( _, element ) {\n\t\t\t\tvar isTracked = $.map( that.classesElementLookup, function( elements ) {\n\t\t\t\t\treturn elements;\n\t\t\t\t} )\n\t\t\t\t\t.some( function( elements ) {\n\t\t\t\t\t\treturn elements.is( element );\n\t\t\t\t\t} );\n\n\t\t\t\tif ( !isTracked ) {\n\t\t\t\t\tnodesToBind.push( element );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tthat._on( $( nodesToBind ), {\n\t\t\t\tremove: \"_untrackClassesElement\"\n\t\t\t} );\n\t\t}\n\n\t\tfunction processClassString( classes, checkOption ) {\n\t\t\tvar current, i;\n\t\t\tfor ( i = 0; i < classes.length; i++ ) {\n\t\t\t\tcurrent = that.classesElementLookup[ classes[ i ] ] || $();\n\t\t\t\tif ( options.add ) {\n\t\t\t\t\tbindRemoveEvent();\n\t\t\t\t\tcurrent = $( $.uniqueSort( current.get().concat( options.element.get() ) ) );\n\t\t\t\t} else {\n\t\t\t\t\tcurrent = $( current.not( options.element ).get() );\n\t\t\t\t}\n\t\t\t\tthat.classesElementLookup[ classes[ i ] ] = current;\n\t\t\t\tfull.push( classes[ i ] );\n\t\t\t\tif ( checkOption && options.classes[ classes[ i ] ] ) {\n\t\t\t\t\tfull.push( options.classes[ classes[ i ] ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( options.keys ) {\n\t\t\tprocessClassString( options.keys.match( /\\S+/g ) || [], true );\n\t\t}\n\t\tif ( options.extra ) {\n\t\t\tprocessClassString( options.extra.match( /\\S+/g ) || [] );\n\t\t}\n\n\t\treturn full.join( \" \" );\n\t},\n\n\t_untrackClassesElement: function( event ) {\n\t\tvar that = this;\n\t\t$.each( that.classesElementLookup, function( key, value ) {\n\t\t\tif ( $.inArray( event.target, value ) !== -1 ) {\n\t\t\t\tthat.classesElementLookup[ key ] = $( value.not( event.target ).get() );\n\t\t\t}\n\t\t} );\n\n\t\tthis._off( $( event.target ) );\n\t},\n\n\t_removeClass: function( element, keys, extra ) {\n\t\treturn this._toggleClass( element, keys, extra, false );\n\t},\n\n\t_addClass: function( element, keys, extra ) {\n\t\treturn this._toggleClass( element, keys, extra, true );\n\t},\n\n\t_toggleClass: function( element, keys, extra, add ) {\n\t\tadd = ( typeof add === \"boolean\" ) ? add : extra;\n\t\tvar shift = ( typeof element === \"string\" || element === null ),\n\t\t\toptions = {\n\t\t\t\textra: shift ? keys : extra,\n\t\t\t\tkeys: shift ? element : keys,\n\t\t\t\telement: shift ? this.element : element,\n\t\t\t\tadd: add\n\t\t\t};\n\t\toptions.element.toggleClass( this._classes( options ), add );\n\t\treturn this;\n\t},\n\n\t_on: function( suppressDisabledCheck, element, handlers ) {\n\t\tvar delegateElement;\n\t\tvar instance = this;\n\n\t\t// No suppressDisabledCheck flag, shuffle arguments\n\t\tif ( typeof suppressDisabledCheck !== \"boolean\" ) {\n\t\t\thandlers = element;\n\t\t\telement = suppressDisabledCheck;\n\t\t\tsuppressDisabledCheck = false;\n\t\t}\n\n\t\t// No element argument, shuffle and use this.element\n\t\tif ( !handlers ) {\n\t\t\thandlers = element;\n\t\t\telement = this.element;\n\t\t\tdelegateElement = this.widget();\n\t\t} else {\n\t\t\telement = delegateElement = $( element );\n\t\t\tthis.bindings = this.bindings.add( element );\n\t\t}\n\n\t\t$.each( handlers, function( event, handler ) {\n\t\t\tfunction handlerProxy() {\n\n\t\t\t\t// Allow widgets to customize the disabled handling\n\t\t\t\t// - disabled as an array instead of boolean\n\t\t\t\t// - disabled class as method for disabling individual parts\n\t\t\t\tif ( !suppressDisabledCheck &&\n\t\t\t\t\t\t( instance.options.disabled === true ||\n\t\t\t\t\t\t$( this ).hasClass( \"ui-state-disabled\" ) ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t\t.apply( instance, arguments );\n\t\t\t}\n\n\t\t\t// Copy the guid so direct unbinding works\n\t\t\tif ( typeof handler !== \"string\" ) {\n\t\t\t\thandlerProxy.guid = handler.guid =\n\t\t\t\t\thandler.guid || handlerProxy.guid || $.guid++;\n\t\t\t}\n\n\t\t\tvar match = event.match( /^([\\w:-]*)\\s*(.*)$/ );\n\t\t\tvar eventName = match[ 1 ] + instance.eventNamespace;\n\t\t\tvar selector = match[ 2 ];\n\n\t\t\tif ( selector ) {\n\t\t\t\tdelegateElement.on( eventName, selector, handlerProxy );\n\t\t\t} else {\n\t\t\t\telement.on( eventName, handlerProxy );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_off: function( element, eventName ) {\n\t\teventName = ( eventName || \"\" ).split( \" \" ).join( this.eventNamespace + \" \" ) +\n\t\t\tthis.eventNamespace;\n\t\telement.off( eventName );\n\n\t\t// Clear the stack to avoid memory leaks (#10056)\n\t\tthis.bindings = $( this.bindings.not( element ).get() );\n\t\tthis.focusable = $( this.focusable.not( element ).get() );\n\t\tthis.hoverable = $( this.hoverable.not( element ).get() );\n\t},\n\n\t_delay: function( handler, delay ) {\n\t\tfunction handlerProxy() {\n\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\n\t\t\t\t.apply( instance, arguments );\n\t\t}\n\t\tvar instance = this;\n\t\treturn setTimeout( handlerProxy, delay || 0 );\n\t},\n\n\t_hoverable: function( element ) {\n\t\tthis.hoverable = this.hoverable.add( element );\n\t\tthis._on( element, {\n\t\t\tmouseenter: function( event ) {\n\t\t\t\tthis._addClass( $( event.currentTarget ), null, \"ui-state-hover\" );\n\t\t\t},\n\t\t\tmouseleave: function( event ) {\n\t\t\t\tthis._removeClass( $( event.currentTarget ), null, \"ui-state-hover\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_focusable: function( element ) {\n\t\tthis.focusable = this.focusable.add( element );\n\t\tthis._on( element, {\n\t\t\tfocusin: function( event ) {\n\t\t\t\tthis._addClass( $( event.currentTarget ), null, \"ui-state-focus\" );\n\t\t\t},\n\t\t\tfocusout: function( event ) {\n\t\t\t\tthis._removeClass( $( event.currentTarget ), null, \"ui-state-focus\" );\n\t\t\t}\n\t\t} );\n\t},\n\n\t_trigger: function( type, event, data ) {\n\t\tvar prop, orig;\n\t\tvar callback = this.options[ type ];\n\n\t\tdata = data || {};\n\t\tevent = $.Event( event );\n\t\tevent.type = ( type === this.widgetEventPrefix ?\n\t\t\ttype :\n\t\t\tthis.widgetEventPrefix + type ).toLowerCase();\n\n\t\t// The original event may come from any element\n\t\t// so we need to reset the target on the new event\n\t\tevent.target = this.element[ 0 ];\n\n\t\t// Copy original event properties over to the new event\n\t\torig = event.originalEvent;\n\t\tif ( orig ) {\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tif ( !( prop in event ) ) {\n\t\t\t\t\tevent[ prop ] = orig[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.element.trigger( event, data );\n\t\treturn !( typeof callback === \"function\" &&\n\t\t\tcallback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false ||\n\t\t\tevent.isDefaultPrevented() );\n\t}\n};\n\n$.each( { show: \"fadeIn\", hide: \"fadeOut\" }, function( method, defaultEffect ) {\n\t$.Widget.prototype[ \"_\" + method ] = function( element, options, callback ) {\n\t\tif ( typeof options === \"string\" ) {\n\t\t\toptions = { effect: options };\n\t\t}\n\n\t\tvar hasOptions;\n\t\tvar effectName = !options ?\n\t\t\tmethod :\n\t\t\toptions === true || typeof options === \"number\" ?\n\t\t\t\tdefaultEffect :\n\t\t\t\toptions.effect || defaultEffect;\n\n\t\toptions = options || {};\n\t\tif ( typeof options === \"number\" ) {\n\t\t\toptions = { duration: options };\n\t\t} else if ( options === true ) {\n\t\t\toptions = {};\n\t\t}\n\n\t\thasOptions = !$.isEmptyObject( options );\n\t\toptions.complete = callback;\n\n\t\tif ( options.delay ) {\n\t\t\telement.delay( options.delay );\n\t\t}\n\n\t\tif ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {\n\t\t\telement[ method ]( options );\n\t\t} else if ( effectName !== method && element[ effectName ] ) {\n\t\t\telement[ effectName ]( options.duration, options.easing, callback );\n\t\t} else {\n\t\t\telement.queue( function( next ) {\n\t\t\t\t$( this )[ method ]();\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback.call( element[ 0 ] );\n\t\t\t\t}\n\t\t\t\tnext();\n\t\t\t} );\n\t\t}\n\t};\n} );\n\nreturn $.widget;\n\n} );\n","/* eslint-disable max-len, camelcase */\n/*!\n * jQuery UI Datepicker 1.14.1\n * https://jqueryui.com\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license.\n * https://jquery.org/license\n */\n\n//>>label: Datepicker\n//>>group: Widgets\n//>>description: Displays a calendar from an input or inline for selecting dates.\n//>>docs: https://api.jqueryui.com/datepicker/\n//>>demos: https://jqueryui.com/datepicker/\n//>>css.structure: ../../themes/base/core.css\n//>>css.structure: ../../themes/base/datepicker.css\n//>>css.theme: ../../themes/base/theme.css\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"../version\",\n\t\t\t\"../keycode\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\n$.extend( $.ui, { datepicker: { version: \"1.14.1\" } } );\n\nvar datepicker_instActive;\n\nfunction datepicker_getZindex( elem ) {\n\tvar position, value;\n\twhile ( elem.length && elem[ 0 ] !== document ) {\n\n\t\t// Ignore z-index if position is set to a value where z-index is ignored by the browser\n\t\t// This makes behavior of this function consistent across browsers\n\t\t// WebKit always returns auto if the element is positioned\n\t\tposition = elem.css( \"position\" );\n\t\tif ( position === \"absolute\" || position === \"relative\" || position === \"fixed\" ) {\n\n\t\t\t// IE returns 0 when zIndex is not specified\n\t\t\t// other browsers return a string\n\t\t\t// we ignore the case of nested elements with an explicit value of 0\n\t\t\t// <div style=\"z-index: -10;\"><div style=\"z-index: 0;\"></div></div>\n\t\t\tvalue = parseInt( elem.css( \"zIndex\" ), 10 );\n\t\t\tif ( !isNaN( value ) && value !== 0 ) {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t}\n\t\telem = elem.parent();\n\t}\n\n\treturn 0;\n}\n\n/* Date picker manager.\n   Use the singleton instance of this class, $.datepicker, to interact with the date picker.\n   Settings for (groups of) date pickers are maintained in an instance object,\n   allowing multiple different settings on the same page. */\n\nfunction Datepicker() {\n\tthis._curInst = null; // The current instance in use\n\tthis._keyEvent = false; // If the last event was a key event\n\tthis._disabledInputs = []; // List of date picker inputs that have been disabled\n\tthis._datepickerShowing = false; // True if the popup picker is showing , false if not\n\tthis._inDialog = false; // True if showing within a \"dialog\", false if not\n\tthis._mainDivId = \"ui-datepicker-div\"; // The ID of the main datepicker division\n\tthis._inlineClass = \"ui-datepicker-inline\"; // The name of the inline marker class\n\tthis._appendClass = \"ui-datepicker-append\"; // The name of the append marker class\n\tthis._triggerClass = \"ui-datepicker-trigger\"; // The name of the trigger marker class\n\tthis._dialogClass = \"ui-datepicker-dialog\"; // The name of the dialog marker class\n\tthis._disableClass = \"ui-datepicker-disabled\"; // The name of the disabled covering marker class\n\tthis._unselectableClass = \"ui-datepicker-unselectable\"; // The name of the unselectable cell marker class\n\tthis._currentClass = \"ui-datepicker-current-day\"; // The name of the current day marker class\n\tthis._dayOverClass = \"ui-datepicker-days-cell-over\"; // The name of the day hover marker class\n\tthis.regional = []; // Available regional settings, indexed by language code\n\tthis.regional[ \"\" ] = { // Default regional settings\n\t\tcloseText: \"Done\", // Display text for close link\n\t\tprevText: \"Prev\", // Display text for previous month link\n\t\tnextText: \"Next\", // Display text for next month link\n\t\tcurrentText: \"Today\", // Display text for current month link\n\t\tmonthNames: [ \"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n\t\t\t\"July\", \"August\", \"September\", \"October\", \"November\", \"December\" ], // Names of months for drop-down and formatting\n\t\tmonthNamesShort: [ \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\" ], // For formatting\n\t\tdayNames: [ \"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\" ], // For formatting\n\t\tdayNamesShort: [ \"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\" ], // For formatting\n\t\tdayNamesMin: [ \"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\" ], // Column headings for days starting at Sunday\n\t\tweekHeader: \"Wk\", // Column header for week of the year\n\t\tdateFormat: \"mm/dd/yy\", // See format options on parseDate\n\t\tfirstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...\n\t\tisRTL: false, // True if right-to-left language, false if left-to-right\n\t\tshowMonthAfterYear: false, // True if the year select precedes month, false for month then year\n\t\tyearSuffix: \"\", // Additional text to append to the year in the month headers,\n\t\tselectMonthLabel: \"Select month\", // Invisible label for month selector\n\t\tselectYearLabel: \"Select year\" // Invisible label for year selector\n\t};\n\tthis._defaults = { // Global defaults for all the date picker instances\n\t\tshowOn: \"focus\", // \"focus\" for popup on focus,\n\t\t\t// \"button\" for trigger button, or \"both\" for either\n\t\tshowAnim: \"fadeIn\", // Name of jQuery animation for popup\n\t\tshowOptions: {}, // Options for enhanced animations\n\t\tdefaultDate: null, // Used when field is blank: actual date,\n\t\t\t// +/-number for offset from today, null for today\n\t\tappendText: \"\", // Display text following the input box, e.g. showing the format\n\t\tbuttonText: \"...\", // Text for trigger button\n\t\tbuttonImage: \"\", // URL for trigger button image\n\t\tbuttonImageOnly: false, // True if the image appears alone, false if it appears on a button\n\t\thideIfNoPrevNext: false, // True to hide next/previous month links\n\t\t\t// if not applicable, false to just disable them\n\t\tnavigationAsDateFormat: false, // True if date formatting applied to prev/today/next links\n\t\tgotoCurrent: false, // True if today link goes back to current selection instead\n\t\tchangeMonth: false, // True if month can be selected directly, false if only prev/next\n\t\tchangeYear: false, // True if year can be selected directly, false if only prev/next\n\t\tyearRange: \"c-10:c+10\", // Range of years to display in drop-down,\n\t\t\t// either relative to today's year (-nn:+nn), relative to currently displayed year\n\t\t\t// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)\n\t\tshowOtherMonths: false, // True to show dates in other months, false to leave blank\n\t\tselectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable\n\t\tshowWeek: false, // True to show week of the year, false to not show it\n\t\tcalculateWeek: this.iso8601Week, // How to calculate the week of the year,\n\t\t\t// takes a Date and returns the number of the week for it\n\t\tshortYearCutoff: \"+10\", // Short year values < this are in the current century,\n\t\t\t// > this are in the previous century,\n\t\t\t// string value starting with \"+\" for current year + value\n\t\tminDate: null, // The earliest selectable date, or null for no limit\n\t\tmaxDate: null, // The latest selectable date, or null for no limit\n\t\tduration: \"fast\", // Duration of display/closure\n\t\tbeforeShowDay: null, // Function that takes a date and returns an array with\n\t\t\t// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or \"\",\n\t\t\t// [2] = cell title (optional), e.g. $.datepicker.noWeekends\n\t\tbeforeShow: null, // Function that takes an input field and\n\t\t\t// returns a set of custom settings for the date picker\n\t\tonSelect: null, // Define a callback function when a date is selected\n\t\tonChangeMonthYear: null, // Define a callback function when the month or year is changed\n\t\tonClose: null, // Define a callback function when the datepicker is closed\n\t\tonUpdateDatepicker: null, // Define a callback function when the datepicker is updated\n\t\tnumberOfMonths: 1, // Number of months to show at a time\n\t\tshowCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)\n\t\tstepMonths: 1, // Number of months to step back/forward\n\t\tstepBigMonths: 12, // Number of months to step back/forward for the big links\n\t\taltField: \"\", // Selector for an alternate field to store selected dates into\n\t\taltFormat: \"\", // The date format to use for the alternate field\n\t\tconstrainInput: true, // The input is constrained by the current date format\n\t\tshowButtonPanel: false, // True to show button panel, false to not show it\n\t\tautoSize: false, // True to size the input for the date format, false to leave as is\n\t\tdisabled: false // The initial disabled state\n\t};\n\t$.extend( this._defaults, this.regional[ \"\" ] );\n\tthis.regional.en = $.extend( true, {}, this.regional[ \"\" ] );\n\tthis.regional[ \"en-US\" ] = $.extend( true, {}, this.regional.en );\n\tthis.dpDiv = datepicker_bindHover( $( \"<div id='\" + this._mainDivId + \"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>\" ) );\n}\n\n$.extend( Datepicker.prototype, {\n\n\t/* Class name added to elements to indicate already configured with a date picker. */\n\tmarkerClassName: \"hasDatepicker\",\n\n\t//Keep track of the maximum number of rows displayed (see #7043)\n\tmaxRows: 4,\n\n\t// TODO rename to \"widget\" when switching to widget factory\n\t_widgetDatepicker: function() {\n\t\treturn this.dpDiv;\n\t},\n\n\t/* Override the default settings for all instances of the date picker.\n\t * @param  settings  object - the new settings to use as defaults (anonymous object)\n\t * @return the manager object\n\t */\n\tsetDefaults: function( settings ) {\n\t\tdatepicker_extendRemove( this._defaults, settings || {} );\n\t\treturn this;\n\t},\n\n\t/* Attach the date picker to a jQuery selection.\n\t * @param  target\telement - the target input field or division or span\n\t * @param  settings  object - the new settings to use for this date picker instance (anonymous)\n\t */\n\t_attachDatepicker: function( target, settings ) {\n\t\tvar nodeName, inline, inst;\n\t\tnodeName = target.nodeName.toLowerCase();\n\t\tinline = ( nodeName === \"div\" || nodeName === \"span\" );\n\t\tif ( !target.id ) {\n\t\t\tthis.uuid += 1;\n\t\t\ttarget.id = \"dp\" + this.uuid;\n\t\t}\n\t\tinst = this._newInst( $( target ), inline );\n\t\tinst.settings = $.extend( {}, settings || {} );\n\t\tif ( nodeName === \"input\" ) {\n\t\t\tthis._connectDatepicker( target, inst );\n\t\t} else if ( inline ) {\n\t\t\tthis._inlineDatepicker( target, inst );\n\t\t}\n\t},\n\n\t/* Create a new instance object. */\n\t_newInst: function( target, inline ) {\n\t\tvar id = target[ 0 ].id.replace( /([^A-Za-z0-9_\\-])/g, \"\\\\\\\\$1\" ); // escape jQuery meta chars\n\t\treturn { id: id, input: target, // associated target\n\t\t\tselectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection\n\t\t\tdrawMonth: 0, drawYear: 0, // month being drawn\n\t\t\tinline: inline, // is datepicker inline or not\n\t\t\tdpDiv: ( !inline ? this.dpDiv : // presentation div\n\t\t\tdatepicker_bindHover( $( \"<div class='\" + this._inlineClass + \" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>\" ) ) ) };\n\t},\n\n\t/* Attach the date picker to an input field. */\n\t_connectDatepicker: function( target, inst ) {\n\t\tvar input = $( target );\n\t\tinst.append = $( [] );\n\t\tinst.trigger = $( [] );\n\t\tif ( input.hasClass( this.markerClassName ) ) {\n\t\t\treturn;\n\t\t}\n\t\tthis._attachments( input, inst );\n\t\tinput.addClass( this.markerClassName ).on( \"keydown\", this._doKeyDown ).\n\t\t\ton( \"keypress\", this._doKeyPress ).on( \"keyup\", this._doKeyUp );\n\t\tthis._autoSize( inst );\n\t\t$.data( target, \"datepicker\", inst );\n\n\t\t//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)\n\t\tif ( inst.settings.disabled ) {\n\t\t\tthis._disableDatepicker( target );\n\t\t}\n\t},\n\n\t/* Make attachments based on settings. */\n\t_attachments: function( input, inst ) {\n\t\tvar showOn, buttonText, buttonImage,\n\t\t\tappendText = this._get( inst, \"appendText\" ),\n\t\t\tisRTL = this._get( inst, \"isRTL\" );\n\n\t\tif ( inst.append ) {\n\t\t\tinst.append.remove();\n\t\t}\n\t\tif ( appendText ) {\n\t\t\tinst.append = $( \"<span>\" )\n\t\t\t\t.addClass( this._appendClass )\n\t\t\t\t.text( appendText );\n\t\t\tinput[ isRTL ? \"before\" : \"after\" ]( inst.append );\n\t\t}\n\n\t\tinput.off( \"focus\", this._showDatepicker );\n\n\t\tif ( inst.trigger ) {\n\t\t\tinst.trigger.remove();\n\t\t}\n\n\t\tshowOn = this._get( inst, \"showOn\" );\n\t\tif ( showOn === \"focus\" || showOn === \"both\" ) { // pop-up date picker when in the marked field\n\t\t\tinput.on( \"focus\", this._showDatepicker );\n\t\t}\n\t\tif ( showOn === \"button\" || showOn === \"both\" ) { // pop-up date picker when button clicked\n\t\t\tbuttonText = this._get( inst, \"buttonText\" );\n\t\t\tbuttonImage = this._get( inst, \"buttonImage\" );\n\n\t\t\tif ( this._get( inst, \"buttonImageOnly\" ) ) {\n\t\t\t\tinst.trigger = $( \"<img>\" )\n\t\t\t\t\t.addClass( this._triggerClass )\n\t\t\t\t\t.attr( {\n\t\t\t\t\t\tsrc: buttonImage,\n\t\t\t\t\t\talt: buttonText,\n\t\t\t\t\t\ttitle: buttonText\n\t\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\tinst.trigger = $( \"<button type='button'>\" )\n\t\t\t\t\t.addClass( this._triggerClass );\n\t\t\t\tif ( buttonImage ) {\n\t\t\t\t\tinst.trigger.html(\n\t\t\t\t\t\t$( \"<img>\" )\n\t\t\t\t\t\t\t.attr( {\n\t\t\t\t\t\t\t\tsrc: buttonImage,\n\t\t\t\t\t\t\t\talt: buttonText,\n\t\t\t\t\t\t\t\ttitle: buttonText\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tinst.trigger.text( buttonText );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tinput[ isRTL ? \"before\" : \"after\" ]( inst.trigger );\n\t\t\tinst.trigger.on( \"click\", function() {\n\t\t\t\tif ( $.datepicker._datepickerShowing && $.datepicker._lastInput === input[ 0 ] ) {\n\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t} else if ( $.datepicker._datepickerShowing && $.datepicker._lastInput !== input[ 0 ] ) {\n\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t\t$.datepicker._showDatepicker( input[ 0 ] );\n\t\t\t\t} else {\n\t\t\t\t\t$.datepicker._showDatepicker( input[ 0 ] );\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t} );\n\t\t}\n\t},\n\n\t/* Apply the maximum length for the date format. */\n\t_autoSize: function( inst ) {\n\t\tif ( this._get( inst, \"autoSize\" ) && !inst.inline ) {\n\t\t\tvar findMax, max, maxI, i,\n\t\t\t\tdate = new Date( 2009, 12 - 1, 20 ), // Ensure double digits\n\t\t\t\tdateFormat = this._get( inst, \"dateFormat\" );\n\n\t\t\tif ( dateFormat.match( /[DM]/ ) ) {\n\t\t\t\tfindMax = function( names ) {\n\t\t\t\t\tmax = 0;\n\t\t\t\t\tmaxI = 0;\n\t\t\t\t\tfor ( i = 0; i < names.length; i++ ) {\n\t\t\t\t\t\tif ( names[ i ].length > max ) {\n\t\t\t\t\t\t\tmax = names[ i ].length;\n\t\t\t\t\t\t\tmaxI = i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn maxI;\n\t\t\t\t};\n\t\t\t\tdate.setMonth( findMax( this._get( inst, ( dateFormat.match( /MM/ ) ?\n\t\t\t\t\t\"monthNames\" : \"monthNamesShort\" ) ) ) );\n\t\t\t\tdate.setDate( findMax( this._get( inst, ( dateFormat.match( /DD/ ) ?\n\t\t\t\t\t\"dayNames\" : \"dayNamesShort\" ) ) ) + 20 - date.getDay() );\n\t\t\t}\n\t\t\tinst.input.attr( \"size\", this._formatDate( inst, date ).length );\n\t\t}\n\t},\n\n\t/* Attach an inline date picker to a div. */\n\t_inlineDatepicker: function( target, inst ) {\n\t\tvar divSpan = $( target );\n\t\tif ( divSpan.hasClass( this.markerClassName ) ) {\n\t\t\treturn;\n\t\t}\n\t\tdivSpan.addClass( this.markerClassName ).append( inst.dpDiv );\n\t\t$.data( target, \"datepicker\", inst );\n\t\tthis._setDate( inst, this._getDefaultDate( inst ), true );\n\t\tthis._updateDatepicker( inst );\n\t\tthis._updateAlternate( inst );\n\n\t\t//If disabled option is true, disable the datepicker before showing it (see ticket #5665)\n\t\tif ( inst.settings.disabled ) {\n\t\t\tthis._disableDatepicker( target );\n\t\t}\n\n\t\t// Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements\n\t\t// https://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height\n\t\tinst.dpDiv.css( \"display\", \"block\" );\n\t},\n\n\t/* Pop-up the date picker in a \"dialog\" box.\n\t * @param  input element - ignored\n\t * @param  date\tstring or Date - the initial date to display\n\t * @param  onSelect  function - the function to call when a date is selected\n\t * @param  settings  object - update the dialog date picker instance's settings (anonymous object)\n\t * @param  pos int[2] - coordinates for the dialog's position within the screen or\n\t *\t\t\t\t\tevent - with x/y coordinates or\n\t *\t\t\t\t\tleave empty for default (screen centre)\n\t * @return the manager object\n\t */\n\t_dialogDatepicker: function( input, date, onSelect, settings, pos ) {\n\t\tvar id, browserWidth, browserHeight, scrollX, scrollY,\n\t\t\tinst = this._dialogInst; // internal instance\n\n\t\tif ( !inst ) {\n\t\t\tthis.uuid += 1;\n\t\t\tid = \"dp\" + this.uuid;\n\t\t\tthis._dialogInput = $( \"<input type='text' id='\" + id +\n\t\t\t\t\"' style='position: absolute; top: -100px; width: 0px;'/>\" );\n\t\t\tthis._dialogInput.on( \"keydown\", this._doKeyDown );\n\t\t\t$( \"body\" ).append( this._dialogInput );\n\t\t\tinst = this._dialogInst = this._newInst( this._dialogInput, false );\n\t\t\tinst.settings = {};\n\t\t\t$.data( this._dialogInput[ 0 ], \"datepicker\", inst );\n\t\t}\n\t\tdatepicker_extendRemove( inst.settings, settings || {} );\n\t\tdate = ( date && date.constructor === Date ? this._formatDate( inst, date ) : date );\n\t\tthis._dialogInput.val( date );\n\n\t\tthis._pos = ( pos ? ( pos.length ? pos : [ pos.pageX, pos.pageY ] ) : null );\n\t\tif ( !this._pos ) {\n\t\t\tbrowserWidth = document.documentElement.clientWidth;\n\t\t\tbrowserHeight = document.documentElement.clientHeight;\n\t\t\tscrollX = document.documentElement.scrollLeft || document.body.scrollLeft;\n\t\t\tscrollY = document.documentElement.scrollTop || document.body.scrollTop;\n\t\t\tthis._pos = // should use actual width/height below\n\t\t\t\t[ ( browserWidth / 2 ) - 100 + scrollX, ( browserHeight / 2 ) - 150 + scrollY ];\n\t\t}\n\n\t\t// Move input on screen for focus, but hidden behind dialog\n\t\tthis._dialogInput.css( \"left\", ( this._pos[ 0 ] + 20 ) + \"px\" ).css( \"top\", this._pos[ 1 ] + \"px\" );\n\t\tinst.settings.onSelect = onSelect;\n\t\tthis._inDialog = true;\n\t\tthis.dpDiv.addClass( this._dialogClass );\n\t\tthis._showDatepicker( this._dialogInput[ 0 ] );\n\t\tif ( $.blockUI ) {\n\t\t\t$.blockUI( this.dpDiv );\n\t\t}\n\t\t$.data( this._dialogInput[ 0 ], \"datepicker\", inst );\n\t\treturn this;\n\t},\n\n\t/* Detach a datepicker from its control.\n\t * @param  target\telement - the target input field or division or span\n\t */\n\t_destroyDatepicker: function( target ) {\n\t\tvar nodeName,\n\t\t\t$target = $( target ),\n\t\t\tinst = $.data( target, \"datepicker\" );\n\n\t\tif ( !$target.hasClass( this.markerClassName ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnodeName = target.nodeName.toLowerCase();\n\t\t$.removeData( target, \"datepicker\" );\n\t\tif ( nodeName === \"input\" ) {\n\t\t\tinst.append.remove();\n\t\t\tinst.trigger.remove();\n\t\t\t$target.removeClass( this.markerClassName ).\n\t\t\t\toff( \"focus\", this._showDatepicker ).\n\t\t\t\toff( \"keydown\", this._doKeyDown ).\n\t\t\t\toff( \"keypress\", this._doKeyPress ).\n\t\t\t\toff( \"keyup\", this._doKeyUp );\n\t\t} else if ( nodeName === \"div\" || nodeName === \"span\" ) {\n\t\t\t$target.removeClass( this.markerClassName ).empty();\n\t\t}\n\n\t\t$.datepicker._hideDatepicker();\n\t\tif ( datepicker_instActive === inst ) {\n\t\t\tdatepicker_instActive = null;\n\t\t\tthis._curInst = null;\n\t\t}\n\t},\n\n\t/* Enable the date picker to a jQuery selection.\n\t * @param  target\telement - the target input field or division or span\n\t */\n\t_enableDatepicker: function( target ) {\n\t\tvar nodeName, inline,\n\t\t\t$target = $( target ),\n\t\t\tinst = $.data( target, \"datepicker\" );\n\n\t\tif ( !$target.hasClass( this.markerClassName ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnodeName = target.nodeName.toLowerCase();\n\t\tif ( nodeName === \"input\" ) {\n\t\t\ttarget.disabled = false;\n\t\t\tinst.trigger.filter( \"button\" ).\n\t\t\t\teach( function() {\n\t\t\t\t\tthis.disabled = false;\n\t\t\t\t} ).end().\n\t\t\t\tfilter( \"img\" ).css( { opacity: \"1.0\", cursor: \"\" } );\n\t\t} else if ( nodeName === \"div\" || nodeName === \"span\" ) {\n\t\t\tinline = $target.children( \".\" + this._inlineClass );\n\t\t\tinline.children().removeClass( \"ui-state-disabled\" );\n\t\t\tinline.find( \"select.ui-datepicker-month, select.ui-datepicker-year\" ).\n\t\t\t\tprop( \"disabled\", false );\n\t\t}\n\t\tthis._disabledInputs = $.map( this._disabledInputs,\n\n\t\t\t// Delete entry\n\t\t\tfunction( value ) {\n\t\t\t\treturn ( value === target ? null : value );\n\t\t\t} );\n\t},\n\n\t/* Disable the date picker to a jQuery selection.\n\t * @param  target\telement - the target input field or division or span\n\t */\n\t_disableDatepicker: function( target ) {\n\t\tvar nodeName, inline,\n\t\t\t$target = $( target ),\n\t\t\tinst = $.data( target, \"datepicker\" );\n\n\t\tif ( !$target.hasClass( this.markerClassName ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnodeName = target.nodeName.toLowerCase();\n\t\tif ( nodeName === \"input\" ) {\n\t\t\ttarget.disabled = true;\n\t\t\tinst.trigger.filter( \"button\" ).\n\t\t\t\teach( function() {\n\t\t\t\t\tthis.disabled = true;\n\t\t\t\t} ).end().\n\t\t\t\tfilter( \"img\" ).css( { opacity: \"0.5\", cursor: \"default\" } );\n\t\t} else if ( nodeName === \"div\" || nodeName === \"span\" ) {\n\t\t\tinline = $target.children( \".\" + this._inlineClass );\n\t\t\tinline.children().addClass( \"ui-state-disabled\" );\n\t\t\tinline.find( \"select.ui-datepicker-month, select.ui-datepicker-year\" ).\n\t\t\t\tprop( \"disabled\", true );\n\t\t}\n\t\tthis._disabledInputs = $.map( this._disabledInputs,\n\n\t\t\t// Delete entry\n\t\t\tfunction( value ) {\n\t\t\t\treturn ( value === target ? null : value );\n\t\t\t} );\n\t\tthis._disabledInputs[ this._disabledInputs.length ] = target;\n\t},\n\n\t/* Is the first field in a jQuery collection disabled as a datepicker?\n\t * @param  target\telement - the target input field or division or span\n\t * @return boolean - true if disabled, false if enabled\n\t */\n\t_isDisabledDatepicker: function( target ) {\n\t\tif ( !target ) {\n\t\t\treturn false;\n\t\t}\n\t\tfor ( var i = 0; i < this._disabledInputs.length; i++ ) {\n\t\t\tif ( this._disabledInputs[ i ] === target ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t},\n\n\t/* Retrieve the instance data for the target control.\n\t * @param  target  element - the target input field or division or span\n\t * @return  object - the associated instance data\n\t * @throws  error if a jQuery problem getting data\n\t */\n\t_getInst: function( target ) {\n\t\ttry {\n\t\t\treturn $.data( target, \"datepicker\" );\n\t\t} catch ( err ) {\n\t\t\tthrow \"Missing instance data for this datepicker\";\n\t\t}\n\t},\n\n\t/* Update or retrieve the settings for a date picker attached to an input field or division.\n\t * @param  target  element - the target input field or division or span\n\t * @param  name\tobject - the new settings to update or\n\t *\t\t\t\tstring - the name of the setting to change or retrieve,\n\t *\t\t\t\twhen retrieving also \"all\" for all instance settings or\n\t *\t\t\t\t\"defaults\" for all global defaults\n\t * @param  value   any - the new value for the setting\n\t *\t\t\t\t(omit if above is an object or to retrieve a value)\n\t */\n\t_optionDatepicker: function( target, name, value ) {\n\t\tvar settings, date, minDate, maxDate,\n\t\t\tinst = this._getInst( target );\n\n\t\tif ( arguments.length === 2 && typeof name === \"string\" ) {\n\t\t\treturn ( name === \"defaults\" ? $.extend( {}, $.datepicker._defaults ) :\n\t\t\t\t( inst ? ( name === \"all\" ? $.extend( {}, inst.settings ) :\n\t\t\t\tthis._get( inst, name ) ) : null ) );\n\t\t}\n\n\t\tsettings = name || {};\n\t\tif ( typeof name === \"string\" ) {\n\t\t\tsettings = {};\n\t\t\tsettings[ name ] = value;\n\t\t}\n\n\t\tif ( inst ) {\n\t\t\tif ( this._curInst === inst ) {\n\t\t\t\tthis._hideDatepicker();\n\t\t\t}\n\n\t\t\tdate = this._getDateDatepicker( target, true );\n\t\t\tminDate = this._getMinMaxDate( inst, \"min\" );\n\t\t\tmaxDate = this._getMinMaxDate( inst, \"max\" );\n\t\t\tdatepicker_extendRemove( inst.settings, settings );\n\n\t\t\t// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided\n\t\t\tif ( minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined ) {\n\t\t\t\tinst.settings.minDate = this._formatDate( inst, minDate );\n\t\t\t}\n\t\t\tif ( maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined ) {\n\t\t\t\tinst.settings.maxDate = this._formatDate( inst, maxDate );\n\t\t\t}\n\t\t\tif ( \"disabled\" in settings ) {\n\t\t\t\tif ( settings.disabled ) {\n\t\t\t\t\tthis._disableDatepicker( target );\n\t\t\t\t} else {\n\t\t\t\t\tthis._enableDatepicker( target );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._attachments( $( target ), inst );\n\t\t\tthis._autoSize( inst );\n\t\t\tthis._setDate( inst, date );\n\t\t\tthis._updateAlternate( inst );\n\t\t\tthis._updateDatepicker( inst );\n\t\t}\n\t},\n\n\t// Change method deprecated\n\t_changeDatepicker: function( target, name, value ) {\n\t\tthis._optionDatepicker( target, name, value );\n\t},\n\n\t/* Redraw the date picker attached to an input field or division.\n\t * @param  target  element - the target input field or division or span\n\t */\n\t_refreshDatepicker: function( target ) {\n\t\tvar inst = this._getInst( target );\n\t\tif ( inst ) {\n\t\t\tthis._updateDatepicker( inst );\n\t\t}\n\t},\n\n\t/* Set the dates for a jQuery selection.\n\t * @param  target element - the target input field or division or span\n\t * @param  date\tDate - the new date\n\t */\n\t_setDateDatepicker: function( target, date ) {\n\t\tvar inst = this._getInst( target );\n\t\tif ( inst ) {\n\t\t\tthis._setDate( inst, date );\n\t\t\tthis._updateDatepicker( inst );\n\t\t\tthis._updateAlternate( inst );\n\t\t}\n\t},\n\n\t/* Get the date(s) for the first entry in a jQuery selection.\n\t * @param  target element - the target input field or division or span\n\t * @param  noDefault boolean - true if no default date is to be used\n\t * @return Date - the current date\n\t */\n\t_getDateDatepicker: function( target, noDefault ) {\n\t\tvar inst = this._getInst( target );\n\t\tif ( inst && !inst.inline ) {\n\t\t\tthis._setDateFromField( inst, noDefault );\n\t\t}\n\t\treturn ( inst ? this._getDate( inst ) : null );\n\t},\n\n\t/* Handle keystrokes. */\n\t_doKeyDown: function( event ) {\n\t\tvar onSelect, dateStr, sel,\n\t\t\tinst = $.datepicker._getInst( event.target ),\n\t\t\thandled = true,\n\t\t\tisRTL = inst.dpDiv.is( \".ui-datepicker-rtl\" );\n\n\t\tinst._keyEvent = true;\n\t\tif ( $.datepicker._datepickerShowing ) {\n\t\t\tswitch ( event.keyCode ) {\n\t\t\t\tcase 9: $.datepicker._hideDatepicker();\n\t\t\t\t\t\thandled = false;\n\t\t\t\t\t\tbreak; // hide on tab out\n\t\t\t\tcase 13: sel = $( \"td.\" + $.datepicker._dayOverClass + \":not(.\" +\n\t\t\t\t\t\t\t\t\t$.datepicker._currentClass + \")\", inst.dpDiv );\n\t\t\t\t\t\tif ( sel[ 0 ] ) {\n\t\t\t\t\t\t\t$.datepicker._selectDay( event.target, inst.selectedMonth, inst.selectedYear, sel[ 0 ] );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tonSelect = $.datepicker._get( inst, \"onSelect\" );\n\t\t\t\t\t\tif ( onSelect ) {\n\t\t\t\t\t\t\tdateStr = $.datepicker._formatDate( inst );\n\n\t\t\t\t\t\t\t// Trigger custom callback\n\t\t\t\t\t\t\tonSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn false; // don't submit the form\n\t\t\t\tcase 27: $.datepicker._hideDatepicker();\n\t\t\t\t\t\tbreak; // hide on escape\n\t\t\t\tcase 33: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?\n\t\t\t\t\t\t\t-$.datepicker._get( inst, \"stepBigMonths\" ) :\n\t\t\t\t\t\t\t-$.datepicker._get( inst, \"stepMonths\" ) ), \"M\" );\n\t\t\t\t\t\tbreak; // previous month/year on page up/+ ctrl\n\t\t\t\tcase 34: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?\n\t\t\t\t\t\t\t+$.datepicker._get( inst, \"stepBigMonths\" ) :\n\t\t\t\t\t\t\t+$.datepicker._get( inst, \"stepMonths\" ) ), \"M\" );\n\t\t\t\t\t\tbreak; // next month/year on page down/+ ctrl\n\t\t\t\tcase 35: if ( event.ctrlKey || event.metaKey ) {\n\t\t\t\t\t\t\t$.datepicker._clearDate( event.target );\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\tbreak; // clear on ctrl or command +end\n\t\t\t\tcase 36: if ( event.ctrlKey || event.metaKey ) {\n\t\t\t\t\t\t\t$.datepicker._gotoToday( event.target );\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\tbreak; // current on ctrl or command +home\n\t\t\t\tcase 37: if ( event.ctrlKey || event.metaKey ) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate( event.target, ( isRTL ? +1 : -1 ), \"D\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\n\t\t\t\t\t\t// -1 day on ctrl or command +left\n\t\t\t\t\t\tif ( event.originalEvent.altKey ) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate( event.target, ( event.ctrlKey ?\n\t\t\t\t\t\t\t\t-$.datepicker._get( inst, \"stepBigMonths\" ) :\n\t\t\t\t\t\t\t\t-$.datepicker._get( inst, \"stepMonths\" ) ), \"M\" );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// next month/year on alt +left on Mac\n\t\t\t\t\t\tbreak;\n\t\t\t\tcase 38: if ( event.ctrlKey || event.metaKey ) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate( event.target, -7, \"D\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\tbreak; // -1 week on ctrl or command +up\n\t\t\t\tcase 39: if ( event.ctrlKey || event.metaKey ) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate( event.target, ( isRTL ? -1 : +1 ), \"D\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\n\t\t\t\t\t\t// +1 day on ctrl or command +right\n\t\t\t\t\t\tif ( event.originalEvent.altKey ) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate( event.target, ( event.ctrlKey ?\n\t\t\t\t\t\t\t\t+$.datepicker._get( inst, \"stepBigMonths\" ) :\n\t\t\t\t\t\t\t\t+$.datepicker._get( inst, \"stepMonths\" ) ), \"M\" );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// next month/year on alt +right\n\t\t\t\t\t\tbreak;\n\t\t\t\tcase 40: if ( event.ctrlKey || event.metaKey ) {\n\t\t\t\t\t\t\t$.datepicker._adjustDate( event.target, +7, \"D\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\n\t\t\t\t\t\tbreak; // +1 week on ctrl or command +down\n\t\t\t\tdefault: handled = false;\n\t\t\t}\n\t\t} else if ( event.keyCode === 36 && event.ctrlKey ) { // display the date picker on ctrl+home\n\t\t\t$.datepicker._showDatepicker( this );\n\t\t} else {\n\t\t\thandled = false;\n\t\t}\n\n\t\tif ( handled ) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t},\n\n\t/* Filter entered characters - based on date format. */\n\t_doKeyPress: function( event ) {\n\t\tvar chars, chr,\n\t\t\tinst = $.datepicker._getInst( event.target );\n\n\t\tif ( $.datepicker._get( inst, \"constrainInput\" ) ) {\n\t\t\tchars = $.datepicker._possibleChars( $.datepicker._get( inst, \"dateFormat\" ) );\n\t\t\tchr = String.fromCharCode( event.charCode == null ? event.keyCode : event.charCode );\n\t\t\treturn event.ctrlKey || event.metaKey || ( chr < \" \" || !chars || chars.indexOf( chr ) > -1 );\n\t\t}\n\t},\n\n\t/* Synchronise manual entry and field/alternate field. */\n\t_doKeyUp: function( event ) {\n\t\tvar date,\n\t\t\tinst = $.datepicker._getInst( event.target );\n\n\t\tif ( inst.input.val() !== inst.lastVal ) {\n\t\t\ttry {\n\t\t\t\tdate = $.datepicker.parseDate( $.datepicker._get( inst, \"dateFormat\" ),\n\t\t\t\t\t( inst.input ? inst.input.val() : null ),\n\t\t\t\t\t$.datepicker._getFormatConfig( inst ) );\n\n\t\t\t\tif ( date ) { // only if valid\n\t\t\t\t\t$.datepicker._setDateFromField( inst );\n\t\t\t\t\t$.datepicker._updateAlternate( inst );\n\t\t\t\t\t$.datepicker._updateDatepicker( inst );\n\t\t\t\t}\n\t\t\t} catch ( err ) {\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t},\n\n\t/* Pop-up the date picker for a given input field.\n\t * If false returned from beforeShow event handler do not show.\n\t * @param  input  element - the input field attached to the date picker or\n\t *\t\t\t\t\tevent - if triggered by focus\n\t */\n\t_showDatepicker: function( input ) {\n\t\tinput = input.target || input;\n\t\tif ( input.nodeName.toLowerCase() !== \"input\" ) { // find from button/image trigger\n\t\t\tinput = $( \"input\", input.parentNode )[ 0 ];\n\t\t}\n\n\t\tif ( $.datepicker._isDisabledDatepicker( input ) || $.datepicker._lastInput === input ) { // already here\n\t\t\treturn;\n\t\t}\n\n\t\tvar inst, beforeShow, beforeShowSettings, isFixed,\n\t\t\toffset, showAnim, duration;\n\n\t\tinst = $.datepicker._getInst( input );\n\t\tif ( $.datepicker._curInst && $.datepicker._curInst !== inst ) {\n\t\t\t$.datepicker._curInst.dpDiv.stop( true, true );\n\t\t\tif ( inst && $.datepicker._datepickerShowing ) {\n\t\t\t\t$.datepicker._hideDatepicker( $.datepicker._curInst.input[ 0 ] );\n\t\t\t}\n\t\t}\n\n\t\tbeforeShow = $.datepicker._get( inst, \"beforeShow\" );\n\t\tbeforeShowSettings = beforeShow ? beforeShow.apply( input, [ input, inst ] ) : {};\n\t\tif ( beforeShowSettings === false ) {\n\t\t\treturn;\n\t\t}\n\t\tdatepicker_extendRemove( inst.settings, beforeShowSettings );\n\n\t\tinst.lastVal = null;\n\t\t$.datepicker._lastInput = input;\n\t\t$.datepicker._setDateFromField( inst );\n\n\t\tif ( $.datepicker._inDialog ) { // hide cursor\n\t\t\tinput.value = \"\";\n\t\t}\n\t\tif ( !$.datepicker._pos ) { // position below input\n\t\t\t$.datepicker._pos = $.datepicker._findPos( input );\n\t\t\t$.datepicker._pos[ 1 ] += input.offsetHeight; // add the height\n\t\t}\n\n\t\tisFixed = false;\n\t\t$( input ).parents().each( function() {\n\t\t\tisFixed |= $( this ).css( \"position\" ) === \"fixed\";\n\t\t\treturn !isFixed;\n\t\t} );\n\n\t\toffset = { left: $.datepicker._pos[ 0 ], top: $.datepicker._pos[ 1 ] };\n\t\t$.datepicker._pos = null;\n\n\t\t//to avoid flashes on Firefox\n\t\tinst.dpDiv.empty();\n\n\t\t// determine sizing offscreen\n\t\tinst.dpDiv.css( { position: \"absolute\", display: \"block\", top: \"-1000px\" } );\n\t\t$.datepicker._updateDatepicker( inst );\n\n\t\t// fix width for dynamic number of date pickers\n\t\t// and adjust position before showing\n\t\toffset = $.datepicker._checkOffset( inst, offset, isFixed );\n\t\tinst.dpDiv.css( { position: ( $.datepicker._inDialog && $.blockUI ?\n\t\t\t\"static\" : ( isFixed ? \"fixed\" : \"absolute\" ) ), display: \"none\",\n\t\t\tleft: offset.left + \"px\", top: offset.top + \"px\" } );\n\n\t\tif ( !inst.inline ) {\n\t\t\tshowAnim = $.datepicker._get( inst, \"showAnim\" );\n\t\t\tduration = $.datepicker._get( inst, \"duration\" );\n\t\t\tinst.dpDiv.css( \"z-index\", datepicker_getZindex( $( input ) ) + 1 );\n\t\t\t$.datepicker._datepickerShowing = true;\n\n\t\t\tif ( $.effects && $.effects.effect[ showAnim ] ) {\n\t\t\t\tinst.dpDiv.show( showAnim, $.datepicker._get( inst, \"showOptions\" ), duration );\n\t\t\t} else {\n\t\t\t\tinst.dpDiv[ showAnim || \"show\" ]( showAnim ? duration : null );\n\t\t\t}\n\n\t\t\tif ( $.datepicker._shouldFocusInput( inst ) ) {\n\t\t\t\tinst.input.trigger( \"focus\" );\n\t\t\t}\n\n\t\t\t$.datepicker._curInst = inst;\n\t\t}\n\t},\n\n\t/* Generate the date picker content. */\n\t_updateDatepicker: function( inst ) {\n\t\tthis.maxRows = 4; //Reset the max number of rows being displayed (see #7043)\n\t\tdatepicker_instActive = inst; // for delegate hover events\n\t\tinst.dpDiv.empty().append( this._generateHTML( inst ) );\n\t\tthis._attachHandlers( inst );\n\n\t\tvar origyearshtml,\n\t\t\tnumMonths = this._getNumberOfMonths( inst ),\n\t\t\tcols = numMonths[ 1 ],\n\t\t\twidth = 17,\n\t\t\tactiveCell = inst.dpDiv.find( \".\" + this._dayOverClass + \" a\" ),\n\t\t\tonUpdateDatepicker = $.datepicker._get( inst, \"onUpdateDatepicker\" );\n\n\t\tif ( activeCell.length > 0 ) {\n\t\t\tdatepicker_handleMouseover.apply( activeCell.get( 0 ) );\n\t\t}\n\n\t\tinst.dpDiv.removeClass( \"ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4\" ).width( \"\" );\n\t\tif ( cols > 1 ) {\n\t\t\tinst.dpDiv.addClass( \"ui-datepicker-multi-\" + cols ).css( \"width\", ( width * cols ) + \"em\" );\n\t\t}\n\t\tinst.dpDiv[ ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ? \"add\" : \"remove\" ) +\n\t\t\t\"Class\" ]( \"ui-datepicker-multi\" );\n\t\tinst.dpDiv[ ( this._get( inst, \"isRTL\" ) ? \"add\" : \"remove\" ) +\n\t\t\t\"Class\" ]( \"ui-datepicker-rtl\" );\n\n\t\tif ( inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) {\n\t\t\tinst.input.trigger( \"focus\" );\n\t\t}\n\n\t\t// Deffered render of the years select (to avoid flashes on Firefox)\n\t\tif ( inst.yearshtml ) {\n\t\t\torigyearshtml = inst.yearshtml;\n\t\t\tsetTimeout( function() {\n\n\t\t\t\t//assure that inst.yearshtml didn't change.\n\t\t\t\tif ( origyearshtml === inst.yearshtml && inst.yearshtml ) {\n\t\t\t\t\tinst.dpDiv.find( \"select.ui-datepicker-year\" ).first().replaceWith( inst.yearshtml );\n\t\t\t\t}\n\t\t\t\torigyearshtml = inst.yearshtml = null;\n\t\t\t}, 0 );\n\t\t}\n\n\t\tif ( onUpdateDatepicker ) {\n\t\t\tonUpdateDatepicker.apply( ( inst.input ? inst.input[ 0 ] : null ), [ inst ] );\n\t\t}\n\t},\n\n\t_shouldFocusInput: function( inst ) {\n\t\treturn inst.input && inst.input.is( \":visible\" ) && !inst.input.is( \":disabled\" );\n\t},\n\n\t/* Check positioning to remain on screen. */\n\t_checkOffset: function( inst, offset, isFixed ) {\n\t\tvar dpWidth = inst.dpDiv.outerWidth(),\n\t\t\tdpHeight = inst.dpDiv.outerHeight(),\n\t\t\tinputWidth = inst.input ? inst.input.outerWidth() : 0,\n\t\t\tinputHeight = inst.input ? inst.input.outerHeight() : 0,\n\t\t\tviewWidth = document.documentElement.clientWidth + ( isFixed ? 0 : $( document ).scrollLeft() ),\n\t\t\tviewHeight = document.documentElement.clientHeight + ( isFixed ? 0 : $( document ).scrollTop() );\n\n\t\toffset.left -= ( this._get( inst, \"isRTL\" ) ? ( dpWidth - inputWidth ) : 0 );\n\t\toffset.left -= ( isFixed && offset.left === inst.input.offset().left ) ? $( document ).scrollLeft() : 0;\n\t\toffset.top -= ( isFixed && offset.top === ( inst.input.offset().top + inputHeight ) ) ? $( document ).scrollTop() : 0;\n\n\t\t// Now check if datepicker is showing outside window viewport - move to a better place if so.\n\t\toffset.left -= Math.min( offset.left, ( offset.left + dpWidth > viewWidth && viewWidth > dpWidth ) ?\n\t\t\tMath.abs( offset.left + dpWidth - viewWidth ) : 0 );\n\t\toffset.top -= Math.min( offset.top, ( offset.top + dpHeight > viewHeight && viewHeight > dpHeight ) ?\n\t\t\tMath.abs( dpHeight + inputHeight ) : 0 );\n\n\t\treturn offset;\n\t},\n\n\t/* Find an object's position on the screen. */\n\t_findPos: function( obj ) {\n\t\tvar position,\n\t\t\tinst = this._getInst( obj ),\n\t\t\tisRTL = this._get( inst, \"isRTL\" );\n\n\t\twhile ( obj && ( obj.type === \"hidden\" || obj.nodeType !== 1 || $.expr.pseudos.hidden( obj ) ) ) {\n\t\t\tobj = obj[ isRTL ? \"previousSibling\" : \"nextSibling\" ];\n\t\t}\n\n\t\tposition = $( obj ).offset();\n\t\treturn [ position.left, position.top ];\n\t},\n\n\t/* Hide the date picker from view.\n\t * @param  input  element - the input field attached to the date picker\n\t */\n\t_hideDatepicker: function( input ) {\n\t\tvar showAnim, duration, postProcess, onClose,\n\t\t\tinst = this._curInst;\n\n\t\tif ( !inst || ( input && inst !== $.data( input, \"datepicker\" ) ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( this._datepickerShowing ) {\n\t\t\tshowAnim = this._get( inst, \"showAnim\" );\n\t\t\tduration = this._get( inst, \"duration\" );\n\t\t\tpostProcess = function() {\n\t\t\t\t$.datepicker._tidyDialog( inst );\n\t\t\t};\n\n\t\t\tif ( $.effects && ( $.effects.effect[ showAnim ] ) ) {\n\t\t\t\tinst.dpDiv.hide( showAnim, $.datepicker._get( inst, \"showOptions\" ), duration, postProcess );\n\t\t\t} else {\n\t\t\t\tinst.dpDiv[ ( showAnim === \"slideDown\" ? \"slideUp\" :\n\t\t\t\t\t( showAnim === \"fadeIn\" ? \"fadeOut\" : \"hide\" ) ) ]( ( showAnim ? duration : null ), postProcess );\n\t\t\t}\n\n\t\t\tif ( !showAnim ) {\n\t\t\t\tpostProcess();\n\t\t\t}\n\t\t\tthis._datepickerShowing = false;\n\n\t\t\tonClose = this._get( inst, \"onClose\" );\n\t\t\tif ( onClose ) {\n\t\t\t\tonClose.apply( ( inst.input ? inst.input[ 0 ] : null ), [ ( inst.input ? inst.input.val() : \"\" ), inst ] );\n\t\t\t}\n\n\t\t\tthis._lastInput = null;\n\t\t\tif ( this._inDialog ) {\n\t\t\t\tthis._dialogInput.css( { position: \"absolute\", left: \"0\", top: \"-100px\" } );\n\t\t\t\tif ( $.blockUI ) {\n\t\t\t\t\t$.unblockUI();\n\t\t\t\t\t$( \"body\" ).append( this.dpDiv );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._inDialog = false;\n\t\t}\n\t},\n\n\t/* Tidy up after a dialog display. */\n\t_tidyDialog: function( inst ) {\n\t\tinst.dpDiv.removeClass( this._dialogClass ).off( \".ui-datepicker-calendar\" );\n\t},\n\n\t/* Close date picker if clicked elsewhere. */\n\t_checkExternalClick: function( event ) {\n\t\tif ( !$.datepicker._curInst ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar $target = $( event.target ),\n\t\t\tinst = $.datepicker._getInst( $target[ 0 ] );\n\n\t\tif ( ( ( $target[ 0 ].id !== $.datepicker._mainDivId &&\n\t\t\t\t$target.parents( \"#\" + $.datepicker._mainDivId ).length === 0 &&\n\t\t\t\t!$target.hasClass( $.datepicker.markerClassName ) &&\n\t\t\t\t!$target.closest( \".\" + $.datepicker._triggerClass ).length &&\n\t\t\t\t$.datepicker._datepickerShowing && !( $.datepicker._inDialog && $.blockUI ) ) ) ||\n\t\t\t( $target.hasClass( $.datepicker.markerClassName ) && $.datepicker._curInst !== inst ) ) {\n\t\t\t\t$.datepicker._hideDatepicker();\n\t\t}\n\t},\n\n\t/* Adjust one of the date sub-fields. */\n\t_adjustDate: function( id, offset, period ) {\n\t\tvar target = $( id ),\n\t\t\tinst = this._getInst( target[ 0 ] );\n\n\t\tif ( this._isDisabledDatepicker( target[ 0 ] ) ) {\n\t\t\treturn;\n\t\t}\n\t\tthis._adjustInstDate( inst, offset, period );\n\t\tthis._updateDatepicker( inst );\n\t},\n\n\t/* Action for current link. */\n\t_gotoToday: function( id ) {\n\t\tvar date,\n\t\t\ttarget = $( id ),\n\t\t\tinst = this._getInst( target[ 0 ] );\n\n\t\tif ( this._get( inst, \"gotoCurrent\" ) && inst.currentDay ) {\n\t\t\tinst.selectedDay = inst.currentDay;\n\t\t\tinst.drawMonth = inst.selectedMonth = inst.currentMonth;\n\t\t\tinst.drawYear = inst.selectedYear = inst.currentYear;\n\t\t} else {\n\t\t\tdate = new Date();\n\t\t\tinst.selectedDay = date.getDate();\n\t\t\tinst.drawMonth = inst.selectedMonth = date.getMonth();\n\t\t\tinst.drawYear = inst.selectedYear = date.getFullYear();\n\t\t}\n\t\tthis._notifyChange( inst );\n\t\tthis._adjustDate( target );\n\t},\n\n\t/* Action for selecting a new month/year. */\n\t_selectMonthYear: function( id, select, period ) {\n\t\tvar target = $( id ),\n\t\t\tinst = this._getInst( target[ 0 ] );\n\n\t\tinst[ \"selected\" + ( period === \"M\" ? \"Month\" : \"Year\" ) ] =\n\t\tinst[ \"draw\" + ( period === \"M\" ? \"Month\" : \"Year\" ) ] =\n\t\t\tparseInt( select.options[ select.selectedIndex ].value, 10 );\n\n\t\tthis._notifyChange( inst );\n\t\tthis._adjustDate( target );\n\t},\n\n\t/* Action for selecting a day. */\n\t_selectDay: function( id, month, year, td ) {\n\t\tvar inst,\n\t\t\ttarget = $( id );\n\n\t\tif ( $( td ).hasClass( this._unselectableClass ) || this._isDisabledDatepicker( target[ 0 ] ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tinst = this._getInst( target[ 0 ] );\n\t\tinst.selectedDay = inst.currentDay = parseInt( $( \"a\", td ).attr( \"data-date\" ) );\n\t\tinst.selectedMonth = inst.currentMonth = month;\n\t\tinst.selectedYear = inst.currentYear = year;\n\t\tthis._selectDate( id, this._formatDate( inst,\n\t\t\tinst.currentDay, inst.currentMonth, inst.currentYear ) );\n\t},\n\n\t/* Erase the input field and hide the date picker. */\n\t_clearDate: function( id ) {\n\t\tvar target = $( id );\n\t\tthis._selectDate( target, \"\" );\n\t},\n\n\t/* Update the input field with the selected date. */\n\t_selectDate: function( id, dateStr ) {\n\t\tvar onSelect,\n\t\t\ttarget = $( id ),\n\t\t\tinst = this._getInst( target[ 0 ] );\n\n\t\tdateStr = ( dateStr != null ? dateStr : this._formatDate( inst ) );\n\t\tif ( inst.input ) {\n\t\t\tinst.input.val( dateStr );\n\t\t}\n\t\tthis._updateAlternate( inst );\n\n\t\tonSelect = this._get( inst, \"onSelect\" );\n\t\tif ( onSelect ) {\n\t\t\tonSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] );  // trigger custom callback\n\t\t} else if ( inst.input ) {\n\t\t\tinst.input.trigger( \"change\" ); // fire the change event\n\t\t}\n\n\t\tif ( inst.inline ) {\n\t\t\tthis._updateDatepicker( inst );\n\t\t} else {\n\t\t\tthis._hideDatepicker();\n\t\t\tthis._lastInput = inst.input[ 0 ];\n\t\t\tif ( typeof( inst.input[ 0 ] ) !== \"object\" ) {\n\t\t\t\tinst.input.trigger( \"focus\" ); // restore focus\n\t\t\t}\n\t\t\tthis._lastInput = null;\n\t\t}\n\t},\n\n\t/* Update any alternate field to synchronise with the main field. */\n\t_updateAlternate: function( inst ) {\n\t\tvar altFormat, date, dateStr,\n\t\t\taltField = this._get( inst, \"altField\" );\n\n\t\tif ( altField ) { // update alternate field too\n\t\t\taltFormat = this._get( inst, \"altFormat\" ) || this._get( inst, \"dateFormat\" );\n\t\t\tdate = this._getDate( inst );\n\t\t\tdateStr = this.formatDate( altFormat, date, this._getFormatConfig( inst ) );\n\t\t\t$( document ).find( altField ).val( dateStr );\n\t\t}\n\t},\n\n\t/* Set as beforeShowDay function to prevent selection of weekends.\n\t * @param  date  Date - the date to customise\n\t * @return [boolean, string] - is this date selectable?, what is its CSS class?\n\t */\n\tnoWeekends: function( date ) {\n\t\tvar day = date.getDay();\n\t\treturn [ ( day > 0 && day < 6 ), \"\" ];\n\t},\n\n\t/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.\n\t * @param  date  Date - the date to get the week for\n\t * @return  number - the number of the week within the year that contains this date\n\t */\n\tiso8601Week: function( date ) {\n\t\tvar time,\n\t\t\tcheckDate = new Date( date.getTime() );\n\n\t\t// Find Thursday of this week starting on Monday\n\t\tcheckDate.setDate( checkDate.getDate() + 4 - ( checkDate.getDay() || 7 ) );\n\n\t\ttime = checkDate.getTime();\n\t\tcheckDate.setMonth( 0 ); // Compare with Jan 1\n\t\tcheckDate.setDate( 1 );\n\t\treturn Math.floor( Math.round( ( time - checkDate ) / 86400000 ) / 7 ) + 1;\n\t},\n\n\t/* Parse a string value into a date object.\n\t * See formatDate below for the possible formats.\n\t *\n\t * @param  format string - the expected format of the date\n\t * @param  value string - the date in the above format\n\t * @param  settings Object - attributes include:\n\t *\t\t\t\t\tshortYearCutoff  number - the cutoff year for determining the century (optional)\n\t *\t\t\t\t\tdayNamesShort\tstring[7] - abbreviated names of the days from Sunday (optional)\n\t *\t\t\t\t\tdayNames\t\tstring[7] - names of the days from Sunday (optional)\n\t *\t\t\t\t\tmonthNamesShort string[12] - abbreviated names of the months (optional)\n\t *\t\t\t\t\tmonthNames\t\tstring[12] - names of the months (optional)\n\t * @return  Date - the extracted date value or null if value is blank\n\t */\n\tparseDate: function( format, value, settings ) {\n\t\tif ( format == null || value == null ) {\n\t\t\tthrow \"Invalid arguments\";\n\t\t}\n\n\t\tvalue = ( typeof value === \"object\" ? value.toString() : value + \"\" );\n\t\tif ( value === \"\" ) {\n\t\t\treturn null;\n\t\t}\n\n\t\tvar iFormat, dim, extra,\n\t\t\tiValue = 0,\n\t\t\tshortYearCutoffTemp = ( settings ? settings.shortYearCutoff : null ) || this._defaults.shortYearCutoff,\n\t\t\tshortYearCutoff = ( typeof shortYearCutoffTemp !== \"string\" ? shortYearCutoffTemp :\n\t\t\t\tnew Date().getFullYear() % 100 + parseInt( shortYearCutoffTemp, 10 ) ),\n\t\t\tdayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,\n\t\t\tdayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,\n\t\t\tmonthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,\n\t\t\tmonthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,\n\t\t\tyear = -1,\n\t\t\tmonth = -1,\n\t\t\tday = -1,\n\t\t\tdoy = -1,\n\t\t\tliteral = false,\n\t\t\tdate,\n\n\t\t\t// Check whether a format character is doubled\n\t\t\tlookAhead = function( match ) {\n\t\t\t\tvar matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );\n\t\t\t\tif ( matches ) {\n\t\t\t\t\tiFormat++;\n\t\t\t\t}\n\t\t\t\treturn matches;\n\t\t\t},\n\n\t\t\t// Extract a number from the string value\n\t\t\tgetNumber = function( match ) {\n\t\t\t\tvar isDoubled = lookAhead( match ),\n\t\t\t\t\tsize = ( match === \"@\" ? 14 : ( match === \"!\" ? 20 :\n\t\t\t\t\t( match === \"y\" && isDoubled ? 4 : ( match === \"o\" ? 3 : 2 ) ) ) ),\n\t\t\t\t\tminSize = ( match === \"y\" ? size : 1 ),\n\t\t\t\t\tdigits = new RegExp( \"^\\\\d{\" + minSize + \",\" + size + \"}\" ),\n\t\t\t\t\tnum = value.substring( iValue ).match( digits );\n\t\t\t\tif ( !num ) {\n\t\t\t\t\tthrow \"Missing number at position \" + iValue;\n\t\t\t\t}\n\t\t\t\tiValue += num[ 0 ].length;\n\t\t\t\treturn parseInt( num[ 0 ], 10 );\n\t\t\t},\n\n\t\t\t// Extract a name from the string value and convert to an index\n\t\t\tgetName = function( match, shortNames, longNames ) {\n\t\t\t\tvar index = -1,\n\t\t\t\t\tnames = $.map( lookAhead( match ) ? longNames : shortNames, function( v, k ) {\n\t\t\t\t\t\treturn [ [ k, v ] ];\n\t\t\t\t\t} ).sort( function( a, b ) {\n\t\t\t\t\t\treturn -( a[ 1 ].length - b[ 1 ].length );\n\t\t\t\t\t} );\n\n\t\t\t\t$.each( names, function( i, pair ) {\n\t\t\t\t\tvar name = pair[ 1 ];\n\t\t\t\t\tif ( value.substr( iValue, name.length ).toLowerCase() === name.toLowerCase() ) {\n\t\t\t\t\t\tindex = pair[ 0 ];\n\t\t\t\t\t\tiValue += name.length;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tif ( index !== -1 ) {\n\t\t\t\t\treturn index + 1;\n\t\t\t\t} else {\n\t\t\t\t\tthrow \"Unknown name at position \" + iValue;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Confirm that a literal character matches the string value\n\t\t\tcheckLiteral = function() {\n\t\t\t\tif ( value.charAt( iValue ) !== format.charAt( iFormat ) ) {\n\t\t\t\t\tthrow \"Unexpected literal at position \" + iValue;\n\t\t\t\t}\n\t\t\t\tiValue++;\n\t\t\t};\n\n\t\tfor ( iFormat = 0; iFormat < format.length; iFormat++ ) {\n\t\t\tif ( literal ) {\n\t\t\t\tif ( format.charAt( iFormat ) === \"'\" && !lookAhead( \"'\" ) ) {\n\t\t\t\t\tliteral = false;\n\t\t\t\t} else {\n\t\t\t\t\tcheckLiteral();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tswitch ( format.charAt( iFormat ) ) {\n\t\t\t\t\tcase \"d\":\n\t\t\t\t\t\tday = getNumber( \"d\" );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"D\":\n\t\t\t\t\t\tgetName( \"D\", dayNamesShort, dayNames );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"o\":\n\t\t\t\t\t\tdoy = getNumber( \"o\" );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"m\":\n\t\t\t\t\t\tmonth = getNumber( \"m\" );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"M\":\n\t\t\t\t\t\tmonth = getName( \"M\", monthNamesShort, monthNames );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"y\":\n\t\t\t\t\t\tyear = getNumber( \"y\" );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"@\":\n\t\t\t\t\t\tdate = new Date( getNumber( \"@\" ) );\n\t\t\t\t\t\tyear = date.getFullYear();\n\t\t\t\t\t\tmonth = date.getMonth() + 1;\n\t\t\t\t\t\tday = date.getDate();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"!\":\n\t\t\t\t\t\tdate = new Date( ( getNumber( \"!\" ) - this._ticksTo1970 ) / 10000 );\n\t\t\t\t\t\tyear = date.getFullYear();\n\t\t\t\t\t\tmonth = date.getMonth() + 1;\n\t\t\t\t\t\tday = date.getDate();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"'\":\n\t\t\t\t\t\tif ( lookAhead( \"'\" ) ) {\n\t\t\t\t\t\t\tcheckLiteral();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tliteral = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tcheckLiteral();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( iValue < value.length ) {\n\t\t\textra = value.substr( iValue );\n\t\t\tif ( !/^\\s+/.test( extra ) ) {\n\t\t\t\tthrow \"Extra/unparsed characters found in date: \" + extra;\n\t\t\t}\n\t\t}\n\n\t\tif ( year === -1 ) {\n\t\t\tyear = new Date().getFullYear();\n\t\t} else if ( year < 100 ) {\n\t\t\tyear += new Date().getFullYear() - new Date().getFullYear() % 100 +\n\t\t\t\t( year <= shortYearCutoff ? 0 : -100 );\n\t\t}\n\n\t\tif ( doy > -1 ) {\n\t\t\tmonth = 1;\n\t\t\tday = doy;\n\t\t\tdo {\n\t\t\t\tdim = this._getDaysInMonth( year, month - 1 );\n\t\t\t\tif ( day <= dim ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tmonth++;\n\t\t\t\tday -= dim;\n\t\t\t} while ( true );\n\t\t}\n\n\t\tdate = this._daylightSavingAdjust( new Date( year, month - 1, day ) );\n\t\tif ( date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day ) {\n\t\t\tthrow \"Invalid date\"; // E.g. 31/02/00\n\t\t}\n\t\treturn date;\n\t},\n\n\t/* Standard date formats. */\n\tATOM: \"yy-mm-dd\", // RFC 3339 (ISO 8601)\n\tCOOKIE: \"D, dd M yy\",\n\tISO_8601: \"yy-mm-dd\",\n\tRFC_822: \"D, d M y\",\n\tRFC_850: \"DD, dd-M-y\",\n\tRFC_1036: \"D, d M y\",\n\tRFC_1123: \"D, d M yy\",\n\tRFC_2822: \"D, d M yy\",\n\tRSS: \"D, d M y\", // RFC 822\n\tTICKS: \"!\",\n\tTIMESTAMP: \"@\",\n\tW3C: \"yy-mm-dd\", // ISO 8601\n\n\t_ticksTo1970: ( ( ( 1970 - 1 ) * 365 + Math.floor( 1970 / 4 ) - Math.floor( 1970 / 100 ) +\n\t\tMath.floor( 1970 / 400 ) ) * 24 * 60 * 60 * 10000000 ),\n\n\t/* Format a date object into a string value.\n\t * The format can be combinations of the following:\n\t * d  - day of month (no leading zero)\n\t * dd - day of month (two digit)\n\t * o  - day of year (no leading zeros)\n\t * oo - day of year (three digit)\n\t * D  - day name short\n\t * DD - day name long\n\t * m  - month of year (no leading zero)\n\t * mm - month of year (two digit)\n\t * M  - month name short\n\t * MM - month name long\n\t * y  - year (two digit)\n\t * yy - year (four digit)\n\t * @ - Unix timestamp (ms since 01/01/1970)\n\t * ! - Windows ticks (100ns since 01/01/0001)\n\t * \"...\" - literal text\n\t * '' - single quote\n\t *\n\t * @param  format string - the desired format of the date\n\t * @param  date Date - the date value to format\n\t * @param  settings Object - attributes include:\n\t *\t\t\t\t\tdayNamesShort\tstring[7] - abbreviated names of the days from Sunday (optional)\n\t *\t\t\t\t\tdayNames\t\tstring[7] - names of the days from Sunday (optional)\n\t *\t\t\t\t\tmonthNamesShort string[12] - abbreviated names of the months (optional)\n\t *\t\t\t\t\tmonthNames\t\tstring[12] - names of the months (optional)\n\t * @return  string - the date in the above format\n\t */\n\tformatDate: function( format, date, settings ) {\n\t\tif ( !date ) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tvar iFormat,\n\t\t\tdayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort,\n\t\t\tdayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames,\n\t\t\tmonthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort,\n\t\t\tmonthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames,\n\n\t\t\t// Check whether a format character is doubled\n\t\t\tlookAhead = function( match ) {\n\t\t\t\tvar matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );\n\t\t\t\tif ( matches ) {\n\t\t\t\t\tiFormat++;\n\t\t\t\t}\n\t\t\t\treturn matches;\n\t\t\t},\n\n\t\t\t// Format a number, with leading zero if necessary\n\t\t\tformatNumber = function( match, value, len ) {\n\t\t\t\tvar num = \"\" + value;\n\t\t\t\tif ( lookAhead( match ) ) {\n\t\t\t\t\twhile ( num.length < len ) {\n\t\t\t\t\t\tnum = \"0\" + num;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn num;\n\t\t\t},\n\n\t\t\t// Format a name, short or long as requested\n\t\t\tformatName = function( match, value, shortNames, longNames ) {\n\t\t\t\treturn ( lookAhead( match ) ? longNames[ value ] : shortNames[ value ] );\n\t\t\t},\n\t\t\toutput = \"\",\n\t\t\tliteral = false;\n\n\t\tif ( date ) {\n\t\t\tfor ( iFormat = 0; iFormat < format.length; iFormat++ ) {\n\t\t\t\tif ( literal ) {\n\t\t\t\t\tif ( format.charAt( iFormat ) === \"'\" && !lookAhead( \"'\" ) ) {\n\t\t\t\t\t\tliteral = false;\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput += format.charAt( iFormat );\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tswitch ( format.charAt( iFormat ) ) {\n\t\t\t\t\t\tcase \"d\":\n\t\t\t\t\t\t\toutput += formatNumber( \"d\", date.getDate(), 2 );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"D\":\n\t\t\t\t\t\t\toutput += formatName( \"D\", date.getDay(), dayNamesShort, dayNames );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"o\":\n\t\t\t\t\t\t\toutput += formatNumber( \"o\",\n\t\t\t\t\t\t\t\tMath.round( ( new Date( date.getFullYear(), date.getMonth(), date.getDate() ).getTime() - new Date( date.getFullYear(), 0, 0 ).getTime() ) / 86400000 ), 3 );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"m\":\n\t\t\t\t\t\t\toutput += formatNumber( \"m\", date.getMonth() + 1, 2 );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"M\":\n\t\t\t\t\t\t\toutput += formatName( \"M\", date.getMonth(), monthNamesShort, monthNames );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"y\":\n\t\t\t\t\t\t\toutput += ( lookAhead( \"y\" ) ? date.getFullYear() :\n\t\t\t\t\t\t\t\t( date.getFullYear() % 100 < 10 ? \"0\" : \"\" ) + date.getFullYear() % 100 );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"@\":\n\t\t\t\t\t\t\toutput += date.getTime();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"!\":\n\t\t\t\t\t\t\toutput += date.getTime() * 10000 + this._ticksTo1970;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"'\":\n\t\t\t\t\t\t\tif ( lookAhead( \"'\" ) ) {\n\t\t\t\t\t\t\t\toutput += \"'\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tliteral = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\toutput += format.charAt( iFormat );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t},\n\n\t/* Extract all possible characters from the date format. */\n\t_possibleChars: function( format ) {\n\t\tvar iFormat,\n\t\t\tchars = \"\",\n\t\t\tliteral = false,\n\n\t\t\t// Check whether a format character is doubled\n\t\t\tlookAhead = function( match ) {\n\t\t\t\tvar matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match );\n\t\t\t\tif ( matches ) {\n\t\t\t\t\tiFormat++;\n\t\t\t\t}\n\t\t\t\treturn matches;\n\t\t\t};\n\n\t\tfor ( iFormat = 0; iFormat < format.length; iFormat++ ) {\n\t\t\tif ( literal ) {\n\t\t\t\tif ( format.charAt( iFormat ) === \"'\" && !lookAhead( \"'\" ) ) {\n\t\t\t\t\tliteral = false;\n\t\t\t\t} else {\n\t\t\t\t\tchars += format.charAt( iFormat );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tswitch ( format.charAt( iFormat ) ) {\n\t\t\t\t\tcase \"d\": case \"m\": case \"y\": case \"@\":\n\t\t\t\t\t\tchars += \"0123456789\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"D\": case \"M\":\n\t\t\t\t\t\treturn null; // Accept anything\n\t\t\t\t\tcase \"'\":\n\t\t\t\t\t\tif ( lookAhead( \"'\" ) ) {\n\t\t\t\t\t\t\tchars += \"'\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tliteral = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tchars += format.charAt( iFormat );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn chars;\n\t},\n\n\t/* Get a setting value, defaulting if necessary. */\n\t_get: function( inst, name ) {\n\t\treturn inst.settings[ name ] !== undefined ?\n\t\t\tinst.settings[ name ] : this._defaults[ name ];\n\t},\n\n\t/* Parse existing date and initialise date picker. */\n\t_setDateFromField: function( inst, noDefault ) {\n\t\tif ( inst.input.val() === inst.lastVal ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar dateFormat = this._get( inst, \"dateFormat\" ),\n\t\t\tdates = inst.lastVal = inst.input ? inst.input.val() : null,\n\t\t\tdefaultDate = this._getDefaultDate( inst ),\n\t\t\tdate = defaultDate,\n\t\t\tsettings = this._getFormatConfig( inst );\n\n\t\ttry {\n\t\t\tdate = this.parseDate( dateFormat, dates, settings ) || defaultDate;\n\t\t} catch ( event ) {\n\t\t\tdates = ( noDefault ? \"\" : dates );\n\t\t}\n\t\tinst.selectedDay = date.getDate();\n\t\tinst.drawMonth = inst.selectedMonth = date.getMonth();\n\t\tinst.drawYear = inst.selectedYear = date.getFullYear();\n\t\tinst.currentDay = ( dates ? date.getDate() : 0 );\n\t\tinst.currentMonth = ( dates ? date.getMonth() : 0 );\n\t\tinst.currentYear = ( dates ? date.getFullYear() : 0 );\n\t\tthis._adjustInstDate( inst );\n\t},\n\n\t/* Retrieve the default date shown on opening. */\n\t_getDefaultDate: function( inst ) {\n\t\treturn this._restrictMinMax( inst,\n\t\t\tthis._determineDate( inst, this._get( inst, \"defaultDate\" ), new Date() ) );\n\t},\n\n\t/* A date may be specified as an exact value or a relative one. */\n\t_determineDate: function( inst, date, defaultDate ) {\n\t\tvar offsetNumeric = function( offset ) {\n\t\t\t\tvar date = new Date();\n\t\t\t\tdate.setDate( date.getDate() + offset );\n\t\t\t\treturn date;\n\t\t\t},\n\t\t\toffsetString = function( offset ) {\n\t\t\t\ttry {\n\t\t\t\t\treturn $.datepicker.parseDate( $.datepicker._get( inst, \"dateFormat\" ),\n\t\t\t\t\t\toffset, $.datepicker._getFormatConfig( inst ) );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// Ignore\n\t\t\t\t}\n\n\t\t\t\tvar date = ( offset.toLowerCase().match( /^c/ ) ?\n\t\t\t\t\t$.datepicker._getDate( inst ) : null ) || new Date(),\n\t\t\t\t\tyear = date.getFullYear(),\n\t\t\t\t\tmonth = date.getMonth(),\n\t\t\t\t\tday = date.getDate(),\n\t\t\t\t\tpattern = /([+\\-]?[0-9]+)\\s*(d|D|w|W|m|M|y|Y)?/g,\n\t\t\t\t\tmatches = pattern.exec( offset );\n\n\t\t\t\twhile ( matches ) {\n\t\t\t\t\tswitch ( matches[ 2 ] || \"d\" ) {\n\t\t\t\t\t\tcase \"d\" : case \"D\" :\n\t\t\t\t\t\t\tday += parseInt( matches[ 1 ], 10 ); break;\n\t\t\t\t\t\tcase \"w\" : case \"W\" :\n\t\t\t\t\t\t\tday += parseInt( matches[ 1 ], 10 ) * 7; break;\n\t\t\t\t\t\tcase \"m\" : case \"M\" :\n\t\t\t\t\t\t\tmonth += parseInt( matches[ 1 ], 10 );\n\t\t\t\t\t\t\tday = Math.min( day, $.datepicker._getDaysInMonth( year, month ) );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"y\": case \"Y\" :\n\t\t\t\t\t\t\tyear += parseInt( matches[ 1 ], 10 );\n\t\t\t\t\t\t\tday = Math.min( day, $.datepicker._getDaysInMonth( year, month ) );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tmatches = pattern.exec( offset );\n\t\t\t\t}\n\t\t\t\treturn new Date( year, month, day );\n\t\t\t},\n\t\t\tnewDate = ( date == null || date === \"\" ? defaultDate : ( typeof date === \"string\" ? offsetString( date ) :\n\t\t\t\t( typeof date === \"number\" ? ( isNaN( date ) ? defaultDate : offsetNumeric( date ) ) : new Date( date.getTime() ) ) ) );\n\n\t\tnewDate = ( newDate && newDate.toString() === \"Invalid Date\" ? defaultDate : newDate );\n\t\tif ( newDate ) {\n\t\t\tnewDate.setHours( 0 );\n\t\t\tnewDate.setMinutes( 0 );\n\t\t\tnewDate.setSeconds( 0 );\n\t\t\tnewDate.setMilliseconds( 0 );\n\t\t}\n\t\treturn this._daylightSavingAdjust( newDate );\n\t},\n\n\t/* Handle switch to/from daylight saving.\n\t * Hours may be non-zero on daylight saving cut-over:\n\t * > 12 when midnight changeover, but then cannot generate\n\t * midnight datetime, so jump to 1AM, otherwise reset.\n\t * @param  date  (Date) the date to check\n\t * @return  (Date) the corrected date\n\t */\n\t_daylightSavingAdjust: function( date ) {\n\t\tif ( !date ) {\n\t\t\treturn null;\n\t\t}\n\t\tdate.setHours( date.getHours() > 12 ? date.getHours() + 2 : 0 );\n\t\treturn date;\n\t},\n\n\t/* Set the date(s) directly. */\n\t_setDate: function( inst, date, noChange ) {\n\t\tvar clear = !date,\n\t\t\torigMonth = inst.selectedMonth,\n\t\t\torigYear = inst.selectedYear,\n\t\t\tnewDate = this._restrictMinMax( inst, this._determineDate( inst, date, new Date() ) );\n\n\t\tinst.selectedDay = inst.currentDay = newDate.getDate();\n\t\tinst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();\n\t\tinst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();\n\t\tif ( ( origMonth !== inst.selectedMonth || origYear !== inst.selectedYear ) && !noChange ) {\n\t\t\tthis._notifyChange( inst );\n\t\t}\n\t\tthis._adjustInstDate( inst );\n\t\tif ( inst.input ) {\n\t\t\tinst.input.val( clear ? \"\" : this._formatDate( inst ) );\n\t\t}\n\t},\n\n\t/* Retrieve the date(s) directly. */\n\t_getDate: function( inst ) {\n\t\tvar startDate = ( !inst.currentYear || ( inst.input && inst.input.val() === \"\" ) ? null :\n\t\t\tthis._daylightSavingAdjust( new Date(\n\t\t\tinst.currentYear, inst.currentMonth, inst.currentDay ) ) );\n\t\t\treturn startDate;\n\t},\n\n\t/* Attach the onxxx handlers.  These are declared statically so\n\t * they work with static code transformers like Caja.\n\t */\n\t_attachHandlers: function( inst ) {\n\t\tvar stepMonths = this._get( inst, \"stepMonths\" ),\n\t\t\tid = \"#\" + inst.id.replace( /\\\\\\\\/g, \"\\\\\" );\n\t\tinst.dpDiv.find( \"[data-handler]\" ).map( function() {\n\t\t\tvar handler = {\n\t\t\t\tprev: function() {\n\t\t\t\t\t$.datepicker._adjustDate( id, -stepMonths, \"M\" );\n\t\t\t\t},\n\t\t\t\tnext: function() {\n\t\t\t\t\t$.datepicker._adjustDate( id, +stepMonths, \"M\" );\n\t\t\t\t},\n\t\t\t\thide: function() {\n\t\t\t\t\t$.datepicker._hideDatepicker();\n\t\t\t\t},\n\t\t\t\ttoday: function() {\n\t\t\t\t\t$.datepicker._gotoToday( id );\n\t\t\t\t},\n\t\t\t\tselectDay: function() {\n\t\t\t\t\t$.datepicker._selectDay( id, +this.getAttribute( \"data-month\" ), +this.getAttribute( \"data-year\" ), this );\n\t\t\t\t\treturn false;\n\t\t\t\t},\n\t\t\t\tselectMonth: function() {\n\t\t\t\t\t$.datepicker._selectMonthYear( id, this, \"M\" );\n\t\t\t\t\treturn false;\n\t\t\t\t},\n\t\t\t\tselectYear: function() {\n\t\t\t\t\t$.datepicker._selectMonthYear( id, this, \"Y\" );\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t};\n\t\t\t$( this ).on( this.getAttribute( \"data-event\" ), handler[ this.getAttribute( \"data-handler\" ) ] );\n\t\t} );\n\t},\n\n\t/* Generate the HTML for the current state of the date picker. */\n\t_generateHTML: function( inst ) {\n\t\tvar maxDraw, prevText, prev, nextText, next, currentText, gotoDate,\n\t\t\tcontrols, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,\n\t\t\tmonthNames, monthNamesShort, beforeShowDay, showOtherMonths,\n\t\t\tselectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,\n\t\t\tcornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,\n\t\t\tprintDate, dRow, tbody, daySettings, otherMonth, unselectable,\n\t\t\ttempDate = new Date(),\n\t\t\ttoday = this._daylightSavingAdjust(\n\t\t\t\tnew Date( tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate() ) ), // clear time\n\t\t\tisRTL = this._get( inst, \"isRTL\" ),\n\t\t\tshowButtonPanel = this._get( inst, \"showButtonPanel\" ),\n\t\t\thideIfNoPrevNext = this._get( inst, \"hideIfNoPrevNext\" ),\n\t\t\tnavigationAsDateFormat = this._get( inst, \"navigationAsDateFormat\" ),\n\t\t\tnumMonths = this._getNumberOfMonths( inst ),\n\t\t\tshowCurrentAtPos = this._get( inst, \"showCurrentAtPos\" ),\n\t\t\tstepMonths = this._get( inst, \"stepMonths\" ),\n\t\t\tisMultiMonth = ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ),\n\t\t\tcurrentDate = this._daylightSavingAdjust( ( !inst.currentDay ? new Date( 9999, 9, 9 ) :\n\t\t\t\tnew Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) ),\n\t\t\tminDate = this._getMinMaxDate( inst, \"min\" ),\n\t\t\tmaxDate = this._getMinMaxDate( inst, \"max\" ),\n\t\t\tdrawMonth = inst.drawMonth - showCurrentAtPos,\n\t\t\tdrawYear = inst.drawYear;\n\n\t\tif ( drawMonth < 0 ) {\n\t\t\tdrawMonth += 12;\n\t\t\tdrawYear--;\n\t\t}\n\t\tif ( maxDate ) {\n\t\t\tmaxDraw = this._daylightSavingAdjust( new Date( maxDate.getFullYear(),\n\t\t\t\tmaxDate.getMonth() - ( numMonths[ 0 ] * numMonths[ 1 ] ) + 1, maxDate.getDate() ) );\n\t\t\tmaxDraw = ( minDate && maxDraw < minDate ? minDate : maxDraw );\n\t\t\twhile ( this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 ) ) > maxDraw ) {\n\t\t\t\tdrawMonth--;\n\t\t\t\tif ( drawMonth < 0 ) {\n\t\t\t\t\tdrawMonth = 11;\n\t\t\t\t\tdrawYear--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tinst.drawMonth = drawMonth;\n\t\tinst.drawYear = drawYear;\n\n\t\tprevText = this._get( inst, \"prevText\" );\n\t\tprevText = ( !navigationAsDateFormat ? prevText : this.formatDate( prevText,\n\t\t\tthis._daylightSavingAdjust( new Date( drawYear, drawMonth - stepMonths, 1 ) ),\n\t\t\tthis._getFormatConfig( inst ) ) );\n\n\t\tif ( this._canAdjustMonth( inst, -1, drawYear, drawMonth ) ) {\n\t\t\tprev = $( \"<a>\" )\n\t\t\t\t.attr( {\n\t\t\t\t\t\"class\": \"ui-datepicker-prev ui-corner-all\",\n\t\t\t\t\t\"data-handler\": \"prev\",\n\t\t\t\t\t\"data-event\": \"click\",\n\t\t\t\t\ttitle: prevText\n\t\t\t\t} )\n\t\t\t\t.append(\n\t\t\t\t\t$( \"<span>\" )\n\t\t\t\t\t\t.addClass( \"ui-icon ui-icon-circle-triangle-\" +\n\t\t\t\t\t\t\t( isRTL ? \"e\" : \"w\" ) )\n\t\t\t\t\t\t.text( prevText )\n\t\t\t\t)[ 0 ].outerHTML;\n\t\t} else if ( hideIfNoPrevNext ) {\n\t\t\tprev = \"\";\n\t\t} else {\n\t\t\tprev = $( \"<a>\" )\n\t\t\t\t.attr( {\n\t\t\t\t\t\"class\": \"ui-datepicker-prev ui-corner-all ui-state-disabled\",\n\t\t\t\t\ttitle: prevText\n\t\t\t\t} )\n\t\t\t\t.append(\n\t\t\t\t\t$( \"<span>\" )\n\t\t\t\t\t\t.addClass( \"ui-icon ui-icon-circle-triangle-\" +\n\t\t\t\t\t\t\t( isRTL ? \"e\" : \"w\" ) )\n\t\t\t\t\t\t.text( prevText )\n\t\t\t\t)[ 0 ].outerHTML;\n\t\t}\n\n\t\tnextText = this._get( inst, \"nextText\" );\n\t\tnextText = ( !navigationAsDateFormat ? nextText : this.formatDate( nextText,\n\t\t\tthis._daylightSavingAdjust( new Date( drawYear, drawMonth + stepMonths, 1 ) ),\n\t\t\tthis._getFormatConfig( inst ) ) );\n\n\t\tif ( this._canAdjustMonth( inst, +1, drawYear, drawMonth ) ) {\n\t\t\tnext = $( \"<a>\" )\n\t\t\t\t.attr( {\n\t\t\t\t\t\"class\": \"ui-datepicker-next ui-corner-all\",\n\t\t\t\t\t\"data-handler\": \"next\",\n\t\t\t\t\t\"data-event\": \"click\",\n\t\t\t\t\ttitle: nextText\n\t\t\t\t} )\n\t\t\t\t.append(\n\t\t\t\t\t$( \"<span>\" )\n\t\t\t\t\t\t.addClass( \"ui-icon ui-icon-circle-triangle-\" +\n\t\t\t\t\t\t\t( isRTL ? \"w\" : \"e\" ) )\n\t\t\t\t\t\t.text( nextText )\n\t\t\t\t)[ 0 ].outerHTML;\n\t\t} else if ( hideIfNoPrevNext ) {\n\t\t\tnext = \"\";\n\t\t} else {\n\t\t\tnext = $( \"<a>\" )\n\t\t\t\t.attr( {\n\t\t\t\t\t\"class\": \"ui-datepicker-next ui-corner-all ui-state-disabled\",\n\t\t\t\t\ttitle: nextText\n\t\t\t\t} )\n\t\t\t\t.append(\n\t\t\t\t\t$( \"<span>\" )\n\t\t\t\t\t\t.attr( \"class\", \"ui-icon ui-icon-circle-triangle-\" +\n\t\t\t\t\t\t\t( isRTL ? \"w\" : \"e\" ) )\n\t\t\t\t\t\t.text( nextText )\n\t\t\t\t)[ 0 ].outerHTML;\n\t\t}\n\n\t\tcurrentText = this._get( inst, \"currentText\" );\n\t\tgotoDate = ( this._get( inst, \"gotoCurrent\" ) && inst.currentDay ? currentDate : today );\n\t\tcurrentText = ( !navigationAsDateFormat ? currentText :\n\t\t\tthis.formatDate( currentText, gotoDate, this._getFormatConfig( inst ) ) );\n\n\t\tcontrols = \"\";\n\t\tif ( !inst.inline ) {\n\t\t\tcontrols = $( \"<button>\" )\n\t\t\t\t.attr( {\n\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\"class\": \"ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all\",\n\t\t\t\t\t\"data-handler\": \"hide\",\n\t\t\t\t\t\"data-event\": \"click\"\n\t\t\t\t} )\n\t\t\t\t.text( this._get( inst, \"closeText\" ) )[ 0 ].outerHTML;\n\t\t}\n\n\t\tbuttonPanel = \"\";\n\t\tif ( showButtonPanel ) {\n\t\t\tbuttonPanel = $( \"<div class='ui-datepicker-buttonpane ui-widget-content'>\" )\n\t\t\t\t.append( isRTL ? controls : \"\" )\n\t\t\t\t.append( this._isInRange( inst, gotoDate ) ?\n\t\t\t\t\t$( \"<button>\" )\n\t\t\t\t\t\t.attr( {\n\t\t\t\t\t\t\ttype: \"button\",\n\t\t\t\t\t\t\t\"class\": \"ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all\",\n\t\t\t\t\t\t\t\"data-handler\": \"today\",\n\t\t\t\t\t\t\t\"data-event\": \"click\"\n\t\t\t\t\t\t} )\n\t\t\t\t\t\t.text( currentText ) :\n\t\t\t\t\t\"\" )\n\t\t\t\t.append( isRTL ? \"\" : controls )[ 0 ].outerHTML;\n\t\t}\n\n\t\tfirstDay = parseInt( this._get( inst, \"firstDay\" ), 10 );\n\t\tfirstDay = ( isNaN( firstDay ) ? 0 : firstDay );\n\n\t\tshowWeek = this._get( inst, \"showWeek\" );\n\t\tdayNames = this._get( inst, \"dayNames\" );\n\t\tdayNamesMin = this._get( inst, \"dayNamesMin\" );\n\t\tmonthNames = this._get( inst, \"monthNames\" );\n\t\tmonthNamesShort = this._get( inst, \"monthNamesShort\" );\n\t\tbeforeShowDay = this._get( inst, \"beforeShowDay\" );\n\t\tshowOtherMonths = this._get( inst, \"showOtherMonths\" );\n\t\tselectOtherMonths = this._get( inst, \"selectOtherMonths\" );\n\t\tdefaultDate = this._getDefaultDate( inst );\n\t\thtml = \"\";\n\n\t\tfor ( row = 0; row < numMonths[ 0 ]; row++ ) {\n\t\t\tgroup = \"\";\n\t\t\tthis.maxRows = 4;\n\t\t\tfor ( col = 0; col < numMonths[ 1 ]; col++ ) {\n\t\t\t\tselectedDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, inst.selectedDay ) );\n\t\t\t\tcornerClass = \" ui-corner-all\";\n\t\t\t\tcalender = \"\";\n\t\t\t\tif ( isMultiMonth ) {\n\t\t\t\t\tcalender += \"<div class='ui-datepicker-group\";\n\t\t\t\t\tif ( numMonths[ 1 ] > 1 ) {\n\t\t\t\t\t\tswitch ( col ) {\n\t\t\t\t\t\t\tcase 0: calender += \" ui-datepicker-group-first\";\n\t\t\t\t\t\t\t\tcornerClass = \" ui-corner-\" + ( isRTL ? \"right\" : \"left\" ); break;\n\t\t\t\t\t\t\tcase numMonths[ 1 ] - 1: calender += \" ui-datepicker-group-last\";\n\t\t\t\t\t\t\t\tcornerClass = \" ui-corner-\" + ( isRTL ? \"left\" : \"right\" ); break;\n\t\t\t\t\t\t\tdefault: calender += \" ui-datepicker-group-middle\"; cornerClass = \"\"; break;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcalender += \"'>\";\n\t\t\t\t}\n\t\t\t\tcalender += \"<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix\" + cornerClass + \"'>\" +\n\t\t\t\t\t( /all|left/.test( cornerClass ) && row === 0 ? ( isRTL ? next : prev ) : \"\" ) +\n\t\t\t\t\t( /all|right/.test( cornerClass ) && row === 0 ? ( isRTL ? prev : next ) : \"\" ) +\n\t\t\t\t\tthis._generateMonthYearHeader( inst, drawMonth, drawYear, minDate, maxDate,\n\t\t\t\t\trow > 0 || col > 0, monthNames, monthNamesShort ) + // draw month headers\n\t\t\t\t\t\"</div><table class='ui-datepicker-calendar'><thead>\" +\n\t\t\t\t\t\"<tr>\";\n\t\t\t\tthead = ( showWeek ? \"<th class='ui-datepicker-week-col'>\" + this._get( inst, \"weekHeader\" ) + \"</th>\" : \"\" );\n\t\t\t\tfor ( dow = 0; dow < 7; dow++ ) { // days of the week\n\t\t\t\t\tday = ( dow + firstDay ) % 7;\n\t\t\t\t\tthead += \"<th scope='col'\" + ( ( dow + firstDay + 6 ) % 7 >= 5 ? \" class='ui-datepicker-week-end'\" : \"\" ) + \">\" +\n\t\t\t\t\t\t\"<span title='\" + dayNames[ day ] + \"'>\" + dayNamesMin[ day ] + \"</span></th>\";\n\t\t\t\t}\n\t\t\t\tcalender += thead + \"</tr></thead><tbody>\";\n\t\t\t\tdaysInMonth = this._getDaysInMonth( drawYear, drawMonth );\n\t\t\t\tif ( drawYear === inst.selectedYear && drawMonth === inst.selectedMonth ) {\n\t\t\t\t\tinst.selectedDay = Math.min( inst.selectedDay, daysInMonth );\n\t\t\t\t}\n\t\t\t\tleadDays = ( this._getFirstDayOfMonth( drawYear, drawMonth ) - firstDay + 7 ) % 7;\n\t\t\t\tcurRows = Math.ceil( ( leadDays + daysInMonth ) / 7 ); // calculate the number of rows to generate\n\t\t\t\tnumRows = ( isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows ); //If multiple months, use the higher number of rows (see #7043)\n\t\t\t\tthis.maxRows = numRows;\n\t\t\t\tprintDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 - leadDays ) );\n\t\t\t\tfor ( dRow = 0; dRow < numRows; dRow++ ) { // create date picker rows\n\t\t\t\t\tcalender += \"<tr>\";\n\t\t\t\t\ttbody = ( !showWeek ? \"\" : \"<td class='ui-datepicker-week-col'>\" +\n\t\t\t\t\t\tthis._get( inst, \"calculateWeek\" )( printDate ) + \"</td>\" );\n\t\t\t\t\tfor ( dow = 0; dow < 7; dow++ ) { // create date picker days\n\t\t\t\t\t\tdaySettings = ( beforeShowDay ?\n\t\t\t\t\t\t\tbeforeShowDay.apply( ( inst.input ? inst.input[ 0 ] : null ), [ printDate ] ) : [ true, \"\" ] );\n\t\t\t\t\t\totherMonth = ( printDate.getMonth() !== drawMonth );\n\t\t\t\t\t\tunselectable = ( otherMonth && !selectOtherMonths ) || !daySettings[ 0 ] ||\n\t\t\t\t\t\t\t( minDate && printDate < minDate ) || ( maxDate && printDate > maxDate );\n\t\t\t\t\t\ttbody += \"<td class='\" +\n\t\t\t\t\t\t\t( ( dow + firstDay + 6 ) % 7 >= 5 ? \" ui-datepicker-week-end\" : \"\" ) + // highlight weekends\n\t\t\t\t\t\t\t( otherMonth ? \" ui-datepicker-other-month\" : \"\" ) + // highlight days from other months\n\t\t\t\t\t\t\t( ( printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent ) || // user pressed key\n\t\t\t\t\t\t\t( defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime() ) ?\n\n\t\t\t\t\t\t\t// or defaultDate is current printedDate and defaultDate is selectedDate\n\t\t\t\t\t\t\t\" \" + this._dayOverClass : \"\" ) + // highlight selected day\n\t\t\t\t\t\t\t( unselectable ? \" \" + this._unselectableClass + \" ui-state-disabled\" : \"\" ) +  // highlight unselectable days\n\t\t\t\t\t\t\t( otherMonth && !showOtherMonths ? \"\" : \" \" + daySettings[ 1 ] + // highlight custom dates\n\t\t\t\t\t\t\t( printDate.getTime() === currentDate.getTime() ? \" \" + this._currentClass : \"\" ) + // highlight selected day\n\t\t\t\t\t\t\t( printDate.getTime() === today.getTime() ? \" ui-datepicker-today\" : \"\" ) ) + \"'\" + // highlight today (if different)\n\t\t\t\t\t\t\t( ( !otherMonth || showOtherMonths ) && daySettings[ 2 ] ? \" title='\" + daySettings[ 2 ].replace( /'/g, \"&#39;\" ) + \"'\" : \"\" ) + // cell title\n\t\t\t\t\t\t\t( unselectable ? \"\" : \" data-handler='selectDay' data-event='click' data-month='\" + printDate.getMonth() + \"' data-year='\" + printDate.getFullYear() + \"'\" ) + \">\" + // actions\n\t\t\t\t\t\t\t( otherMonth && !showOtherMonths ? \"&#xa0;\" : // display for other months\n\t\t\t\t\t\t\t( unselectable ? \"<span class='ui-state-default'>\" + printDate.getDate() + \"</span>\" : \"<a class='ui-state-default\" +\n\t\t\t\t\t\t\t( printDate.getTime() === today.getTime() ? \" ui-state-highlight\" : \"\" ) +\n\t\t\t\t\t\t\t( printDate.getTime() === currentDate.getTime() ? \" ui-state-active\" : \"\" ) + // highlight selected day\n\t\t\t\t\t\t\t( otherMonth ? \" ui-priority-secondary\" : \"\" ) + // distinguish dates from other months\n\t\t\t\t\t\t\t\"' href='#' aria-current='\" + ( printDate.getTime() === currentDate.getTime() ? \"true\" : \"false\" ) + // mark date as selected for screen reader\n\t\t\t\t\t\t\t\"' data-date='\" + printDate.getDate() + // store date as data\n\t\t\t\t\t\t\t\"'>\" + printDate.getDate() + \"</a>\" ) ) + \"</td>\"; // display selectable date\n\t\t\t\t\t\tprintDate.setDate( printDate.getDate() + 1 );\n\t\t\t\t\t\tprintDate = this._daylightSavingAdjust( printDate );\n\t\t\t\t\t}\n\t\t\t\t\tcalender += tbody + \"</tr>\";\n\t\t\t\t}\n\t\t\t\tdrawMonth++;\n\t\t\t\tif ( drawMonth > 11 ) {\n\t\t\t\t\tdrawMonth = 0;\n\t\t\t\t\tdrawYear++;\n\t\t\t\t}\n\t\t\t\tcalender += \"</tbody></table>\" + ( isMultiMonth ? \"</div>\" +\n\t\t\t\t\t\t\t( ( numMonths[ 0 ] > 0 && col === numMonths[ 1 ] - 1 ) ? \"<div class='ui-datepicker-row-break'></div>\" : \"\" ) : \"\" );\n\t\t\t\tgroup += calender;\n\t\t\t}\n\t\t\thtml += group;\n\t\t}\n\t\thtml += buttonPanel;\n\t\tinst._keyEvent = false;\n\t\treturn html;\n\t},\n\n\t/* Generate the month and year header. */\n\t_generateMonthYearHeader: function( inst, drawMonth, drawYear, minDate, maxDate,\n\t\t\tsecondary, monthNames, monthNamesShort ) {\n\n\t\tvar inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,\n\t\t\tchangeMonth = this._get( inst, \"changeMonth\" ),\n\t\t\tchangeYear = this._get( inst, \"changeYear\" ),\n\t\t\tshowMonthAfterYear = this._get( inst, \"showMonthAfterYear\" ),\n\t\t\tselectMonthLabel = this._get( inst, \"selectMonthLabel\" ),\n\t\t\tselectYearLabel = this._get( inst, \"selectYearLabel\" ),\n\t\t\thtml = \"<div class='ui-datepicker-title'>\",\n\t\t\tmonthHtml = \"\";\n\n\t\t// Month selection\n\t\tif ( secondary || !changeMonth ) {\n\t\t\tmonthHtml += \"<span class='ui-datepicker-month'>\" + monthNames[ drawMonth ] + \"</span>\";\n\t\t} else {\n\t\t\tinMinYear = ( minDate && minDate.getFullYear() === drawYear );\n\t\t\tinMaxYear = ( maxDate && maxDate.getFullYear() === drawYear );\n\t\t\tmonthHtml += \"<select class='ui-datepicker-month' aria-label='\" + selectMonthLabel + \"' data-handler='selectMonth' data-event='change'>\";\n\t\t\tfor ( month = 0; month < 12; month++ ) {\n\t\t\t\tif ( ( !inMinYear || month >= minDate.getMonth() ) && ( !inMaxYear || month <= maxDate.getMonth() ) ) {\n\t\t\t\t\tmonthHtml += \"<option value='\" + month + \"'\" +\n\t\t\t\t\t\t( month === drawMonth ? \" selected='selected'\" : \"\" ) +\n\t\t\t\t\t\t\">\" + monthNamesShort[ month ] + \"</option>\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tmonthHtml += \"</select>\";\n\t\t}\n\n\t\tif ( !showMonthAfterYear ) {\n\t\t\thtml += monthHtml + ( secondary || !( changeMonth && changeYear ) ? \"&#xa0;\" : \"\" );\n\t\t}\n\n\t\t// Year selection\n\t\tif ( !inst.yearshtml ) {\n\t\t\tinst.yearshtml = \"\";\n\t\t\tif ( secondary || !changeYear ) {\n\t\t\t\thtml += \"<span class='ui-datepicker-year'>\" + drawYear + \"</span>\";\n\t\t\t} else {\n\n\t\t\t\t// determine range of years to display\n\t\t\t\tyears = this._get( inst, \"yearRange\" ).split( \":\" );\n\t\t\t\tthisYear = new Date().getFullYear();\n\t\t\t\tdetermineYear = function( value ) {\n\t\t\t\t\tvar year = ( value.match( /c[+\\-].*/ ) ? drawYear + parseInt( value.substring( 1 ), 10 ) :\n\t\t\t\t\t\t( value.match( /[+\\-].*/ ) ? thisYear + parseInt( value, 10 ) :\n\t\t\t\t\t\tparseInt( value, 10 ) ) );\n\t\t\t\t\treturn ( isNaN( year ) ? thisYear : year );\n\t\t\t\t};\n\t\t\t\tyear = determineYear( years[ 0 ] );\n\t\t\t\tendYear = Math.max( year, determineYear( years[ 1 ] || \"\" ) );\n\t\t\t\tyear = ( minDate ? Math.max( year, minDate.getFullYear() ) : year );\n\t\t\t\tendYear = ( maxDate ? Math.min( endYear, maxDate.getFullYear() ) : endYear );\n\t\t\t\tinst.yearshtml += \"<select class='ui-datepicker-year' aria-label='\" + selectYearLabel + \"' data-handler='selectYear' data-event='change'>\";\n\t\t\t\tfor ( ; year <= endYear; year++ ) {\n\t\t\t\t\tinst.yearshtml += \"<option value='\" + year + \"'\" +\n\t\t\t\t\t\t( year === drawYear ? \" selected='selected'\" : \"\" ) +\n\t\t\t\t\t\t\">\" + year + \"</option>\";\n\t\t\t\t}\n\t\t\t\tinst.yearshtml += \"</select>\";\n\n\t\t\t\thtml += inst.yearshtml;\n\t\t\t\tinst.yearshtml = null;\n\t\t\t}\n\t\t}\n\n\t\thtml += this._get( inst, \"yearSuffix\" );\n\t\tif ( showMonthAfterYear ) {\n\t\t\thtml += ( secondary || !( changeMonth && changeYear ) ? \"&#xa0;\" : \"\" ) + monthHtml;\n\t\t}\n\t\thtml += \"</div>\"; // Close datepicker_header\n\t\treturn html;\n\t},\n\n\t/* Adjust one of the date sub-fields. */\n\t_adjustInstDate: function( inst, offset, period ) {\n\t\tvar year = inst.selectedYear + ( period === \"Y\" ? offset : 0 ),\n\t\t\tmonth = inst.selectedMonth + ( period === \"M\" ? offset : 0 ),\n\t\t\tday = Math.min( inst.selectedDay, this._getDaysInMonth( year, month ) ) + ( period === \"D\" ? offset : 0 ),\n\t\t\tdate = this._restrictMinMax( inst, this._daylightSavingAdjust( new Date( year, month, day ) ) );\n\n\t\tinst.selectedDay = date.getDate();\n\t\tinst.drawMonth = inst.selectedMonth = date.getMonth();\n\t\tinst.drawYear = inst.selectedYear = date.getFullYear();\n\t\tif ( period === \"M\" || period === \"Y\" ) {\n\t\t\tthis._notifyChange( inst );\n\t\t}\n\t},\n\n\t/* Ensure a date is within any min/max bounds. */\n\t_restrictMinMax: function( inst, date ) {\n\t\tvar minDate = this._getMinMaxDate( inst, \"min\" ),\n\t\t\tmaxDate = this._getMinMaxDate( inst, \"max\" ),\n\t\t\tnewDate = ( minDate && date < minDate ? minDate : date );\n\t\treturn ( maxDate && newDate > maxDate ? maxDate : newDate );\n\t},\n\n\t/* Notify change of month/year. */\n\t_notifyChange: function( inst ) {\n\t\tvar onChange = this._get( inst, \"onChangeMonthYear\" );\n\t\tif ( onChange ) {\n\t\t\tonChange.apply( ( inst.input ? inst.input[ 0 ] : null ),\n\t\t\t\t[ inst.selectedYear, inst.selectedMonth + 1, inst ] );\n\t\t}\n\t},\n\n\t/* Determine the number of months to show. */\n\t_getNumberOfMonths: function( inst ) {\n\t\tvar numMonths = this._get( inst, \"numberOfMonths\" );\n\t\treturn ( numMonths == null ? [ 1, 1 ] : ( typeof numMonths === \"number\" ? [ 1, numMonths ] : numMonths ) );\n\t},\n\n\t/* Determine the current maximum date - ensure no time components are set. */\n\t_getMinMaxDate: function( inst, minMax ) {\n\t\treturn this._determineDate( inst, this._get( inst, minMax + \"Date\" ), null );\n\t},\n\n\t/* Find the number of days in a given month. */\n\t_getDaysInMonth: function( year, month ) {\n\t\treturn 32 - this._daylightSavingAdjust( new Date( year, month, 32 ) ).getDate();\n\t},\n\n\t/* Find the day of the week of the first of a month. */\n\t_getFirstDayOfMonth: function( year, month ) {\n\t\treturn new Date( year, month, 1 ).getDay();\n\t},\n\n\t/* Determines if we should allow a \"next/prev\" month display change. */\n\t_canAdjustMonth: function( inst, offset, curYear, curMonth ) {\n\t\tvar numMonths = this._getNumberOfMonths( inst ),\n\t\t\tdate = this._daylightSavingAdjust( new Date( curYear,\n\t\t\tcurMonth + ( offset < 0 ? offset : numMonths[ 0 ] * numMonths[ 1 ] ), 1 ) );\n\n\t\tif ( offset < 0 ) {\n\t\t\tdate.setDate( this._getDaysInMonth( date.getFullYear(), date.getMonth() ) );\n\t\t}\n\t\treturn this._isInRange( inst, date );\n\t},\n\n\t/* Is the given date in the accepted range? */\n\t_isInRange: function( inst, date ) {\n\t\tvar yearSplit, currentYear,\n\t\t\tminDate = this._getMinMaxDate( inst, \"min\" ),\n\t\t\tmaxDate = this._getMinMaxDate( inst, \"max\" ),\n\t\t\tminYear = null,\n\t\t\tmaxYear = null,\n\t\t\tyears = this._get( inst, \"yearRange\" );\n\t\t\tif ( years ) {\n\t\t\t\tyearSplit = years.split( \":\" );\n\t\t\t\tcurrentYear = new Date().getFullYear();\n\t\t\t\tminYear = parseInt( yearSplit[ 0 ], 10 );\n\t\t\t\tmaxYear = parseInt( yearSplit[ 1 ], 10 );\n\t\t\t\tif ( yearSplit[ 0 ].match( /[+\\-].*/ ) ) {\n\t\t\t\t\tminYear += currentYear;\n\t\t\t\t}\n\t\t\t\tif ( yearSplit[ 1 ].match( /[+\\-].*/ ) ) {\n\t\t\t\t\tmaxYear += currentYear;\n\t\t\t\t}\n\t\t\t}\n\n\t\treturn ( ( !minDate || date.getTime() >= minDate.getTime() ) &&\n\t\t\t( !maxDate || date.getTime() <= maxDate.getTime() ) &&\n\t\t\t( !minYear || date.getFullYear() >= minYear ) &&\n\t\t\t( !maxYear || date.getFullYear() <= maxYear ) );\n\t},\n\n\t/* Provide the configuration settings for formatting/parsing. */\n\t_getFormatConfig: function( inst ) {\n\t\tvar shortYearCutoff = this._get( inst, \"shortYearCutoff\" );\n\t\tshortYearCutoff = ( typeof shortYearCutoff !== \"string\" ? shortYearCutoff :\n\t\t\tnew Date().getFullYear() % 100 + parseInt( shortYearCutoff, 10 ) );\n\t\treturn { shortYearCutoff: shortYearCutoff,\n\t\t\tdayNamesShort: this._get( inst, \"dayNamesShort\" ), dayNames: this._get( inst, \"dayNames\" ),\n\t\t\tmonthNamesShort: this._get( inst, \"monthNamesShort\" ), monthNames: this._get( inst, \"monthNames\" ) };\n\t},\n\n\t/* Format the given date for display. */\n\t_formatDate: function( inst, day, month, year ) {\n\t\tif ( !day ) {\n\t\t\tinst.currentDay = inst.selectedDay;\n\t\t\tinst.currentMonth = inst.selectedMonth;\n\t\t\tinst.currentYear = inst.selectedYear;\n\t\t}\n\t\tvar date = ( day ? ( typeof day === \"object\" ? day :\n\t\t\tthis._daylightSavingAdjust( new Date( year, month, day ) ) ) :\n\t\t\tthis._daylightSavingAdjust( new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) );\n\t\treturn this.formatDate( this._get( inst, \"dateFormat\" ), date, this._getFormatConfig( inst ) );\n\t}\n} );\n\n/*\n * Bind hover events for datepicker elements.\n * Done via delegate so the binding only occurs once in the lifetime of the parent div.\n * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.\n */\nfunction datepicker_bindHover( dpDiv ) {\n\tvar selector = \"button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a\";\n\treturn dpDiv.on( \"mouseout\", selector, function() {\n\t\t\t$( this ).removeClass( \"ui-state-hover\" );\n\t\t\tif ( this.className.indexOf( \"ui-datepicker-prev\" ) !== -1 ) {\n\t\t\t\t$( this ).removeClass( \"ui-datepicker-prev-hover\" );\n\t\t\t}\n\t\t\tif ( this.className.indexOf( \"ui-datepicker-next\" ) !== -1 ) {\n\t\t\t\t$( this ).removeClass( \"ui-datepicker-next-hover\" );\n\t\t\t}\n\t\t} )\n\t\t.on( \"mouseover\", selector, datepicker_handleMouseover );\n}\n\nfunction datepicker_handleMouseover() {\n\tif ( !$.datepicker._isDisabledDatepicker( datepicker_instActive.inline ? datepicker_instActive.dpDiv.parent()[ 0 ] : datepicker_instActive.input[ 0 ] ) ) {\n\t\t$( this ).parents( \".ui-datepicker-calendar\" ).find( \"a\" ).removeClass( \"ui-state-hover\" );\n\t\t$( this ).addClass( \"ui-state-hover\" );\n\t\tif ( this.className.indexOf( \"ui-datepicker-prev\" ) !== -1 ) {\n\t\t\t$( this ).addClass( \"ui-datepicker-prev-hover\" );\n\t\t}\n\t\tif ( this.className.indexOf( \"ui-datepicker-next\" ) !== -1 ) {\n\t\t\t$( this ).addClass( \"ui-datepicker-next-hover\" );\n\t\t}\n\t}\n}\n\n/* jQuery extend now ignores nulls! */\nfunction datepicker_extendRemove( target, props ) {\n\t$.extend( target, props );\n\tfor ( var name in props ) {\n\t\tif ( props[ name ] == null ) {\n\t\t\ttarget[ name ] = props[ name ];\n\t\t}\n\t}\n\treturn target;\n}\n\n/* Invoke the datepicker functionality.\n   @param  options  string - a command, optionally followed by additional parameters or\n\t\t\t\t\tObject - settings for attaching new datepicker functionality\n   @return  jQuery object */\n$.fn.datepicker = function( options ) {\n\n\t/* Verify an empty collection wasn't passed - Fixes #6976 */\n\tif ( !this.length ) {\n\t\treturn this;\n\t}\n\n\t/* Initialise the date picker. */\n\tif ( !$.datepicker.initialized ) {\n\t\t$( document ).on( \"mousedown\", $.datepicker._checkExternalClick );\n\t\t$.datepicker.initialized = true;\n\t}\n\n\t/* Append datepicker main container to body if not exist. */\n\tif ( $( \"#\" + $.datepicker._mainDivId ).length === 0 ) {\n\t\t$( \"body\" ).append( $.datepicker.dpDiv );\n\t}\n\n\tvar otherArgs = Array.prototype.slice.call( arguments, 1 );\n\tif ( typeof options === \"string\" && ( options === \"isDisabled\" || options === \"getDate\" || options === \"widget\" ) ) {\n\t\treturn $.datepicker[ \"_\" + options + \"Datepicker\" ].\n\t\t\tapply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );\n\t}\n\tif ( options === \"option\" && arguments.length === 2 && typeof arguments[ 1 ] === \"string\" ) {\n\t\treturn $.datepicker[ \"_\" + options + \"Datepicker\" ].\n\t\t\tapply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );\n\t}\n\treturn this.each( function() {\n\t\tif ( typeof options === \"string\" ) {\n\t\t\t$.datepicker[ \"_\" + options + \"Datepicker\" ]\n\t\t\t\t.apply( $.datepicker, [ this ].concat( otherArgs ) );\n\t\t} else {\n\t\t\t$.datepicker._attachDatepicker( this, options );\n\t\t}\n\t} );\n};\n\n$.datepicker = new Datepicker(); // singleton instance\n$.datepicker.initialized = false;\n$.datepicker.uuid = new Date().getTime();\n$.datepicker.version = \"1.14.1\";\n\nreturn $.datepicker;\n\n} );\n","/*!\n * jQuery UI Draggable 1.14.1\n * https://jqueryui.com\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license.\n * https://jquery.org/license\n */\n\n//>>label: Draggable\n//>>group: Interactions\n//>>description: Enables dragging functionality for any element.\n//>>docs: https://api.jqueryui.com/draggable/\n//>>demos: https://jqueryui.com/draggable/\n//>>css.structure: ../../themes/base/draggable.css\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./mouse\",\n\t\t\t\"../data\",\n\t\t\t\"../plugin\",\n\t\t\t\"../scroll-parent\",\n\t\t\t\"../version\",\n\t\t\t\"../widget\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\n$.widget( \"ui.draggable\", $.ui.mouse, {\n\tversion: \"1.14.1\",\n\twidgetEventPrefix: \"drag\",\n\toptions: {\n\t\taddClasses: true,\n\t\tappendTo: \"parent\",\n\t\taxis: false,\n\t\tconnectToSortable: false,\n\t\tcontainment: false,\n\t\tcursor: \"auto\",\n\t\tcursorAt: false,\n\t\tgrid: false,\n\t\thandle: false,\n\t\thelper: \"original\",\n\t\tiframeFix: false,\n\t\topacity: false,\n\t\trefreshPositions: false,\n\t\trevert: false,\n\t\trevertDuration: 500,\n\t\tscope: \"default\",\n\t\tscroll: true,\n\t\tscrollSensitivity: 20,\n\t\tscrollSpeed: 20,\n\t\tsnap: false,\n\t\tsnapMode: \"both\",\n\t\tsnapTolerance: 20,\n\t\tstack: false,\n\t\tzIndex: false,\n\n\t\t// Callbacks\n\t\tdrag: null,\n\t\tstart: null,\n\t\tstop: null\n\t},\n\t_create: function() {\n\n\t\tif ( this.options.helper === \"original\" ) {\n\t\t\tthis._setPositionRelative();\n\t\t}\n\t\tif ( this.options.addClasses ) {\n\t\t\tthis._addClass( \"ui-draggable\" );\n\t\t}\n\t\tthis._setHandleClassName();\n\n\t\tthis._mouseInit();\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tthis._super( key, value );\n\t\tif ( key === \"handle\" ) {\n\t\t\tthis._removeHandleClassName();\n\t\t\tthis._setHandleClassName();\n\t\t}\n\t},\n\n\t_destroy: function() {\n\t\tif ( ( this.helper || this.element ).is( \".ui-draggable-dragging\" ) ) {\n\t\t\tthis.destroyOnClear = true;\n\t\t\treturn;\n\t\t}\n\t\tthis._removeHandleClassName();\n\t\tthis._mouseDestroy();\n\t},\n\n\t_mouseCapture: function( event ) {\n\t\tvar o = this.options;\n\n\t\t// Among others, prevent a drag on a resizable-handle\n\t\tif ( this.helper || o.disabled ||\n\t\t\t\t$( event.target ).closest( \".ui-resizable-handle\" ).length > 0 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t//Quit if we're not on a valid handle\n\t\tthis.handle = this._getHandle( event );\n\t\tif ( !this.handle ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tthis._blurActiveElement( event );\n\n\t\tthis._blockFrames( o.iframeFix === true ? \"iframe\" : o.iframeFix );\n\n\t\treturn true;\n\n\t},\n\n\t_blockFrames: function( selector ) {\n\t\tthis.iframeBlocks = this.document.find( selector ).map( function() {\n\t\t\tvar iframe = $( this );\n\n\t\t\treturn $( \"<div>\" )\n\t\t\t\t.css( \"position\", \"absolute\" )\n\t\t\t\t.appendTo( iframe.parent() )\n\t\t\t\t.outerWidth( iframe.outerWidth() )\n\t\t\t\t.outerHeight( iframe.outerHeight() )\n\t\t\t\t.offset( iframe.offset() )[ 0 ];\n\t\t} );\n\t},\n\n\t_unblockFrames: function() {\n\t\tif ( this.iframeBlocks ) {\n\t\t\tthis.iframeBlocks.remove();\n\t\t\tdelete this.iframeBlocks;\n\t\t}\n\t},\n\n\t_blurActiveElement: function( event ) {\n\t\tvar activeElement = this.document[ 0 ].activeElement,\n\t\t\ttarget = $( event.target );\n\n\t\t// Don't blur if the event occurred on an element that is within\n\t\t// the currently focused element\n\t\t// See #10527, #12472\n\t\tif ( target.closest( activeElement ).length ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Blur any element that currently has focus, see #4261\n\t\t$( activeElement ).trigger( \"blur\" );\n\t},\n\n\t_mouseStart: function( event ) {\n\n\t\tvar o = this.options;\n\n\t\t//Create and append the visible helper\n\t\tthis.helper = this._createHelper( event );\n\n\t\tthis._addClass( this.helper, \"ui-draggable-dragging\" );\n\n\t\t//Cache the helper size\n\t\tthis._cacheHelperProportions();\n\n\t\t//If ddmanager is used for droppables, set the global draggable\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.current = this;\n\t\t}\n\n\t\t/*\n\t\t * - Position generation -\n\t\t * This block generates everything position related - it's the core of draggables.\n\t\t */\n\n\t\t//Cache the margins of the original element\n\t\tthis._cacheMargins();\n\n\t\t//Store the helper's css position\n\t\tthis.cssPosition = this.helper.css( \"position\" );\n\t\tthis.scrollParent = this.helper.scrollParent( true );\n\t\tthis.offsetParent = this.helper.offsetParent();\n\t\tthis.hasFixedAncestor = this.helper.parents().filter( function() {\n\t\t\t\treturn $( this ).css( \"position\" ) === \"fixed\";\n\t\t\t} ).length > 0;\n\n\t\t//The element's absolute position on the page minus margins\n\t\tthis.positionAbs = this.element.offset();\n\t\tthis._refreshOffsets( event );\n\n\t\t//Generate the original position\n\t\tthis.originalPosition = this.position = this._generatePosition( event, false );\n\t\tthis.originalPageX = event.pageX;\n\t\tthis.originalPageY = event.pageY;\n\n\t\t//Adjust the mouse offset relative to the helper if \"cursorAt\" is supplied\n\t\tif ( o.cursorAt ) {\n\t\t\tthis._adjustOffsetFromHelper( o.cursorAt );\n\t\t}\n\n\t\t//Set a containment if given in the options\n\t\tthis._setContainment();\n\n\t\t//Trigger event + callbacks\n\t\tif ( this._trigger( \"start\", event ) === false ) {\n\t\t\tthis._clear();\n\t\t\treturn false;\n\t\t}\n\n\t\t//Recache the helper size\n\t\tthis._cacheHelperProportions();\n\n\t\t//Prepare the droppable offsets\n\t\tif ( $.ui.ddmanager && !o.dropBehaviour ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( this, event );\n\t\t}\n\n\t\t// Execute the drag once - this causes the helper not to be visible before getting its\n\t\t// correct position\n\t\tthis._mouseDrag( event, true );\n\n\t\t// If the ddmanager is used for droppables, inform the manager that dragging has started\n\t\t// (see #5003)\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.dragStart( this, event );\n\t\t}\n\n\t\treturn true;\n\t},\n\n\t_refreshOffsets: function( event ) {\n\t\tthis.offset = {\n\t\t\ttop: this.positionAbs.top - this.margins.top,\n\t\t\tleft: this.positionAbs.left - this.margins.left,\n\t\t\tscroll: false,\n\t\t\tparent: this._getParentOffset(),\n\t\t\trelative: this._getRelativeOffset()\n\t\t};\n\n\t\tthis.offset.click = {\n\t\t\tleft: event.pageX - this.offset.left,\n\t\t\ttop: event.pageY - this.offset.top\n\t\t};\n\t},\n\n\t_mouseDrag: function( event, noPropagation ) {\n\n\t\t// reset any necessary cached properties (see #5009)\n\t\tif ( this.hasFixedAncestor ) {\n\t\t\tthis.offset.parent = this._getParentOffset();\n\t\t}\n\n\t\t//Compute the helpers position\n\t\tthis.position = this._generatePosition( event, true );\n\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\n\n\t\t//Call plugins and callbacks and use the resulting position if something is returned\n\t\tif ( !noPropagation ) {\n\t\t\tvar ui = this._uiHash();\n\t\t\tif ( this._trigger( \"drag\", event, ui ) === false ) {\n\t\t\t\tthis._mouseUp( new $.Event( \"mouseup\", event ) );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthis.position = ui.position;\n\t\t}\n\n\t\tthis.helper[ 0 ].style.left = this.position.left + \"px\";\n\t\tthis.helper[ 0 ].style.top = this.position.top + \"px\";\n\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.drag( this, event );\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_mouseStop: function( event ) {\n\n\t\t//If we are using droppables, inform the manager about the drop\n\t\tvar that = this,\n\t\t\tdropped = false;\n\t\tif ( $.ui.ddmanager && !this.options.dropBehaviour ) {\n\t\t\tdropped = $.ui.ddmanager.drop( this, event );\n\t\t}\n\n\t\t//if a drop comes from outside (a sortable)\n\t\tif ( this.dropped ) {\n\t\t\tdropped = this.dropped;\n\t\t\tthis.dropped = false;\n\t\t}\n\n\t\tif ( ( this.options.revert === \"invalid\" && !dropped ) ||\n\t\t\t\t( this.options.revert === \"valid\" && dropped ) ||\n\t\t\t\tthis.options.revert === true || ( typeof this.options.revert === \"function\" &&\n\t\t\t\tthis.options.revert.call( this.element, dropped ) )\n\t\t) {\n\t\t\t$( this.helper ).animate(\n\t\t\t\tthis.originalPosition,\n\t\t\t\tparseInt( this.options.revertDuration, 10 ),\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( that._trigger( \"stop\", event ) !== false ) {\n\t\t\t\t\t\tthat._clear();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t);\n\t\t} else {\n\t\t\tif ( this._trigger( \"stop\", event ) !== false ) {\n\t\t\t\tthis._clear();\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\t_mouseUp: function( event ) {\n\t\tthis._unblockFrames();\n\n\t\t// If the ddmanager is used for droppables, inform the manager that dragging has stopped\n\t\t// (see #5003)\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.dragStop( this, event );\n\t\t}\n\n\t\t// Only need to focus if the event occurred on the draggable itself, see #10527\n\t\tif ( this.handleElement.is( event.target ) ) {\n\n\t\t\t// The interaction is over; whether or not the click resulted in a drag,\n\t\t\t// focus the element\n\t\t\tthis.element.trigger( \"focus\" );\n\t\t}\n\n\t\treturn $.ui.mouse.prototype._mouseUp.call( this, event );\n\t},\n\n\tcancel: function() {\n\n\t\tif ( this.helper.is( \".ui-draggable-dragging\" ) ) {\n\t\t\tthis._mouseUp( new $.Event( \"mouseup\", { target: this.element[ 0 ] } ) );\n\t\t} else {\n\t\t\tthis._clear();\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t_getHandle: function( event ) {\n\t\treturn this.options.handle ?\n\t\t\t!!$( event.target ).closest( this.element.find( this.options.handle ) ).length :\n\t\t\ttrue;\n\t},\n\n\t_setHandleClassName: function() {\n\t\tthis.handleElement = this.options.handle ?\n\t\t\tthis.element.find( this.options.handle ) : this.element;\n\t\tthis._addClass( this.handleElement, \"ui-draggable-handle\" );\n\t},\n\n\t_removeHandleClassName: function() {\n\t\tthis._removeClass( this.handleElement, \"ui-draggable-handle\" );\n\t},\n\n\t_createHelper: function( event ) {\n\n\t\tvar o = this.options,\n\t\t\thelperIsFunction = typeof o.helper === \"function\",\n\t\t\thelper = helperIsFunction ?\n\t\t\t\t$( o.helper.apply( this.element[ 0 ], [ event ] ) ) :\n\t\t\t\t( o.helper === \"clone\" ?\n\t\t\t\t\tthis.element.clone().removeAttr( \"id\" ) :\n\t\t\t\t\tthis.element );\n\n\t\tif ( !helper.parents( \"body\" ).length ) {\n\t\t\thelper.appendTo( ( o.appendTo === \"parent\" ?\n\t\t\t\tthis.element[ 0 ].parentNode :\n\t\t\t\to.appendTo ) );\n\t\t}\n\n\t\t// https://bugs.jqueryui.com/ticket/9446\n\t\t// a helper function can return the original element\n\t\t// which wouldn't have been set to relative in _create\n\t\tif ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) {\n\t\t\tthis._setPositionRelative();\n\t\t}\n\n\t\tif ( helper[ 0 ] !== this.element[ 0 ] &&\n\t\t\t\t!( /(fixed|absolute)/ ).test( helper.css( \"position\" ) ) ) {\n\t\t\thelper.css( \"position\", \"absolute\" );\n\t\t}\n\n\t\treturn helper;\n\n\t},\n\n\t_setPositionRelative: function() {\n\t\tif ( !( /^(?:r|a|f)/ ).test( this.element.css( \"position\" ) ) ) {\n\t\t\tthis.element[ 0 ].style.position = \"relative\";\n\t\t}\n\t},\n\n\t_adjustOffsetFromHelper: function( obj ) {\n\t\tif ( typeof obj === \"string\" ) {\n\t\t\tobj = obj.split( \" \" );\n\t\t}\n\t\tif ( Array.isArray( obj ) ) {\n\t\t\tobj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };\n\t\t}\n\t\tif ( \"left\" in obj ) {\n\t\t\tthis.offset.click.left = obj.left + this.margins.left;\n\t\t}\n\t\tif ( \"right\" in obj ) {\n\t\t\tthis.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;\n\t\t}\n\t\tif ( \"top\" in obj ) {\n\t\t\tthis.offset.click.top = obj.top + this.margins.top;\n\t\t}\n\t\tif ( \"bottom\" in obj ) {\n\t\t\tthis.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;\n\t\t}\n\t},\n\n\t_isRootNode: function( element ) {\n\t\treturn ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ];\n\t},\n\n\t_getParentOffset: function() {\n\n\t\t//Get the offsetParent and cache its position\n\t\tvar po = this.offsetParent.offset(),\n\t\t\tdocument = this.document[ 0 ];\n\n\t\t// This is a special case where we need to modify a offset calculated on start, since the\n\t\t// following happened:\n\t\t// 1. The position of the helper is absolute, so it's position is calculated based on the\n\t\t// next positioned parent\n\t\t// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't\n\t\t// the document, which means that the scroll is included in the initial calculation of the\n\t\t// offset of the parent, and never recalculated upon drag\n\t\tif ( this.cssPosition === \"absolute\" && this.scrollParent[ 0 ] !== document &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {\n\t\t\tpo.left += this.scrollParent.scrollLeft();\n\t\t\tpo.top += this.scrollParent.scrollTop();\n\t\t}\n\n\t\tif ( this._isRootNode( this.offsetParent[ 0 ] ) ) {\n\t\t\tpo = { top: 0, left: 0 };\n\t\t}\n\n\t\treturn {\n\t\t\ttop: po.top + ( parseInt( this.offsetParent.css( \"borderTopWidth\" ), 10 ) || 0 ),\n\t\t\tleft: po.left + ( parseInt( this.offsetParent.css( \"borderLeftWidth\" ), 10 ) || 0 )\n\t\t};\n\n\t},\n\n\t_getRelativeOffset: function() {\n\t\tif ( this.cssPosition !== \"relative\" ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\tvar p = this.element.position(),\n\t\t\tscrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );\n\n\t\treturn {\n\t\t\ttop: p.top - ( parseInt( this.helper.css( \"top\" ), 10 ) || 0 ) +\n\t\t\t\t( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ),\n\t\t\tleft: p.left - ( parseInt( this.helper.css( \"left\" ), 10 ) || 0 ) +\n\t\t\t\t( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 )\n\t\t};\n\n\t},\n\n\t_cacheMargins: function() {\n\t\tthis.margins = {\n\t\t\tleft: ( parseInt( this.element.css( \"marginLeft\" ), 10 ) || 0 ),\n\t\t\ttop: ( parseInt( this.element.css( \"marginTop\" ), 10 ) || 0 ),\n\t\t\tright: ( parseInt( this.element.css( \"marginRight\" ), 10 ) || 0 ),\n\t\t\tbottom: ( parseInt( this.element.css( \"marginBottom\" ), 10 ) || 0 )\n\t\t};\n\t},\n\n\t_cacheHelperProportions: function() {\n\t\tthis.helperProportions = {\n\t\t\twidth: this.helper.outerWidth(),\n\t\t\theight: this.helper.outerHeight()\n\t\t};\n\t},\n\n\t_setContainment: function() {\n\n\t\tvar isUserScrollable, c, ce,\n\t\t\to = this.options,\n\t\t\tdocument = this.document[ 0 ];\n\n\t\tthis.relativeContainer = null;\n\n\t\tif ( !o.containment ) {\n\t\t\tthis.containment = null;\n\t\t\treturn;\n\t\t}\n\n\t\tif ( o.containment === \"window\" ) {\n\t\t\tthis.containment = [\n\t\t\t\t$( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,\n\t\t\t\t$( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,\n\t\t\t\t$( window ).scrollLeft() + $( window ).width() -\n\t\t\t\t\tthis.helperProportions.width - this.margins.left,\n\t\t\t\t$( window ).scrollTop() +\n\t\t\t\t\t( $( window ).height() || document.body.parentNode.scrollHeight ) -\n\t\t\t\t\tthis.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t\treturn;\n\t\t}\n\n\t\tif ( o.containment === \"document\" ) {\n\t\t\tthis.containment = [\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\t$( document ).width() - this.helperProportions.width - this.margins.left,\n\t\t\t\t( $( document ).height() || document.body.parentNode.scrollHeight ) -\n\t\t\t\t\tthis.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t\treturn;\n\t\t}\n\n\t\tif ( o.containment.constructor === Array ) {\n\t\t\tthis.containment = o.containment;\n\t\t\treturn;\n\t\t}\n\n\t\tif ( o.containment === \"parent\" ) {\n\t\t\to.containment = this.helper[ 0 ].parentNode;\n\t\t}\n\n\t\tc = $( o.containment );\n\t\tce = c[ 0 ];\n\n\t\tif ( !ce ) {\n\t\t\treturn;\n\t\t}\n\n\t\tisUserScrollable = /(scroll|auto)/.test( c.css( \"overflow\" ) );\n\n\t\tthis.containment = [\n\t\t\t( parseInt( c.css( \"borderLeftWidth\" ), 10 ) || 0 ) +\n\t\t\t\t( parseInt( c.css( \"paddingLeft\" ), 10 ) || 0 ),\n\t\t\t( parseInt( c.css( \"borderTopWidth\" ), 10 ) || 0 ) +\n\t\t\t\t( parseInt( c.css( \"paddingTop\" ), 10 ) || 0 ),\n\t\t\t( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -\n\t\t\t\t( parseInt( c.css( \"borderRightWidth\" ), 10 ) || 0 ) -\n\t\t\t\t( parseInt( c.css( \"paddingRight\" ), 10 ) || 0 ) -\n\t\t\t\tthis.helperProportions.width -\n\t\t\t\tthis.margins.left -\n\t\t\t\tthis.margins.right,\n\t\t\t( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -\n\t\t\t\t( parseInt( c.css( \"borderBottomWidth\" ), 10 ) || 0 ) -\n\t\t\t\t( parseInt( c.css( \"paddingBottom\" ), 10 ) || 0 ) -\n\t\t\t\tthis.helperProportions.height -\n\t\t\t\tthis.margins.top -\n\t\t\t\tthis.margins.bottom\n\t\t];\n\t\tthis.relativeContainer = c;\n\t},\n\n\t_convertPositionTo: function( d, pos ) {\n\n\t\tif ( !pos ) {\n\t\t\tpos = this.position;\n\t\t}\n\n\t\tvar mod = d === \"absolute\" ? 1 : -1,\n\t\t\tscrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );\n\n\t\treturn {\n\t\t\ttop: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpos.top\t+\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.top * mod +\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.top * mod -\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.offset.scroll.top :\n\t\t\t\t\t( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod )\n\t\t\t),\n\t\t\tleft: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpos.left +\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.left * mod +\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.left * mod\t-\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.offset.scroll.left :\n\t\t\t\t\t( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_generatePosition: function( event, constrainPosition ) {\n\n\t\tvar containment, co, top, left,\n\t\t\to = this.options,\n\t\t\tscrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ),\n\t\t\tpageX = event.pageX,\n\t\t\tpageY = event.pageY;\n\n\t\t// Cache the scroll\n\t\tif ( !scrollIsRootNode || !this.offset.scroll ) {\n\t\t\tthis.offset.scroll = {\n\t\t\t\ttop: this.scrollParent.scrollTop(),\n\t\t\t\tleft: this.scrollParent.scrollLeft()\n\t\t\t};\n\t\t}\n\n\t\t/*\n\t\t * - Position constraining -\n\t\t * Constrain the position to a mix of grid, containment.\n\t\t */\n\n\t\t// If we are not dragging yet, we won't check for options\n\t\tif ( constrainPosition ) {\n\t\t\tif ( this.containment ) {\n\t\t\t\tif ( this.relativeContainer ) {\n\t\t\t\t\tco = this.relativeContainer.offset();\n\t\t\t\t\tcontainment = [\n\t\t\t\t\t\tthis.containment[ 0 ] + co.left,\n\t\t\t\t\t\tthis.containment[ 1 ] + co.top,\n\t\t\t\t\t\tthis.containment[ 2 ] + co.left,\n\t\t\t\t\t\tthis.containment[ 3 ] + co.top\n\t\t\t\t\t];\n\t\t\t\t} else {\n\t\t\t\t\tcontainment = this.containment;\n\t\t\t\t}\n\n\t\t\t\tif ( event.pageX - this.offset.click.left < containment[ 0 ] ) {\n\t\t\t\t\tpageX = containment[ 0 ] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif ( event.pageY - this.offset.click.top < containment[ 1 ] ) {\n\t\t\t\t\tpageY = containment[ 1 ] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t\tif ( event.pageX - this.offset.click.left > containment[ 2 ] ) {\n\t\t\t\t\tpageX = containment[ 2 ] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif ( event.pageY - this.offset.click.top > containment[ 3 ] ) {\n\t\t\t\t\tpageY = containment[ 3 ] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( o.grid ) {\n\n\t\t\t\t//Check for grid elements set to 0 to prevent divide by 0 error causing invalid\n\t\t\t\t// argument errors in IE (see ticket #6950)\n\t\t\t\ttop = o.grid[ 1 ] ? this.originalPageY + Math.round( ( pageY -\n\t\t\t\t\tthis.originalPageY ) / o.grid[ 1 ] ) * o.grid[ 1 ] : this.originalPageY;\n\t\t\t\tpageY = containment ? ( ( top - this.offset.click.top >= containment[ 1 ] ||\n\t\t\t\t\ttop - this.offset.click.top > containment[ 3 ] ) ?\n\t\t\t\t\t\ttop :\n\t\t\t\t\t\t( ( top - this.offset.click.top >= containment[ 1 ] ) ?\n\t\t\t\t\t\t\ttop - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) : top;\n\n\t\t\t\tleft = o.grid[ 0 ] ? this.originalPageX +\n\t\t\t\t\tMath.round( ( pageX - this.originalPageX ) / o.grid[ 0 ] ) * o.grid[ 0 ] :\n\t\t\t\t\tthis.originalPageX;\n\t\t\t\tpageX = containment ? ( ( left - this.offset.click.left >= containment[ 0 ] ||\n\t\t\t\t\tleft - this.offset.click.left > containment[ 2 ] ) ?\n\t\t\t\t\t\tleft :\n\t\t\t\t\t\t( ( left - this.offset.click.left >= containment[ 0 ] ) ?\n\t\t\t\t\t\t\tleft - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) : left;\n\t\t\t}\n\n\t\t\tif ( o.axis === \"y\" ) {\n\t\t\t\tpageX = this.originalPageX;\n\t\t\t}\n\n\t\t\tif ( o.axis === \"x\" ) {\n\t\t\t\tpageY = this.originalPageY;\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\ttop: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpageY -\n\n\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.click.top -\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.top -\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.top +\n\t\t\t\t( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.offset.scroll.top :\n\t\t\t\t\t( scrollIsRootNode ? 0 : this.offset.scroll.top ) )\n\t\t\t),\n\t\t\tleft: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpageX -\n\n\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.click.left -\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.left -\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.left +\n\t\t\t\t( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.offset.scroll.left :\n\t\t\t\t\t( scrollIsRootNode ? 0 : this.offset.scroll.left ) )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_clear: function() {\n\t\tthis._removeClass( this.helper, \"ui-draggable-dragging\" );\n\t\tif ( this.helper[ 0 ] !== this.element[ 0 ] && !this.cancelHelperRemoval ) {\n\t\t\tthis.helper.remove();\n\t\t}\n\t\tthis.helper = null;\n\t\tthis.cancelHelperRemoval = false;\n\t\tif ( this.destroyOnClear ) {\n\t\t\tthis.destroy();\n\t\t}\n\t},\n\n\t// From now on bulk stuff - mainly helpers\n\n\t_trigger: function( type, event, ui ) {\n\t\tui = ui || this._uiHash();\n\t\t$.ui.plugin.call( this, type, [ event, ui, this ], true );\n\n\t\t// Absolute position and offset (see #6884 ) have to be recalculated after plugins\n\t\tif ( /^(drag|start|stop)/.test( type ) ) {\n\t\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\n\t\t\tui.offset = this.positionAbs;\n\t\t}\n\t\treturn $.Widget.prototype._trigger.call( this, type, event, ui );\n\t},\n\n\tplugins: {},\n\n\t_uiHash: function() {\n\t\treturn {\n\t\t\thelper: this.helper,\n\t\t\tposition: this.position,\n\t\t\toriginalPosition: this.originalPosition,\n\t\t\toffset: this.positionAbs\n\t\t};\n\t}\n\n} );\n\n$.ui.plugin.add( \"draggable\", \"connectToSortable\", {\n\tstart: function( event, ui, draggable ) {\n\t\tvar uiSortable = $.extend( {}, ui, {\n\t\t\titem: draggable.element\n\t\t} );\n\n\t\tdraggable.sortables = [];\n\t\t$( draggable.options.connectToSortable ).each( function() {\n\t\t\tvar sortable = $( this ).sortable( \"instance\" );\n\n\t\t\tif ( sortable && !sortable.options.disabled ) {\n\t\t\t\tdraggable.sortables.push( sortable );\n\n\t\t\t\t// RefreshPositions is called at drag start to refresh the containerCache\n\t\t\t\t// which is used in drag. This ensures it's initialized and synchronized\n\t\t\t\t// with any changes that might have happened on the page since initialization.\n\t\t\t\tsortable.refreshPositions();\n\t\t\t\tsortable._trigger( \"activate\", event, uiSortable );\n\t\t\t}\n\t\t} );\n\t},\n\tstop: function( event, ui, draggable ) {\n\t\tvar uiSortable = $.extend( {}, ui, {\n\t\t\titem: draggable.element\n\t\t} );\n\n\t\tdraggable.cancelHelperRemoval = false;\n\n\t\t$.each( draggable.sortables, function() {\n\t\t\tvar sortable = this;\n\n\t\t\tif ( sortable.isOver ) {\n\t\t\t\tsortable.isOver = 0;\n\n\t\t\t\t// Allow this sortable to handle removing the helper\n\t\t\t\tdraggable.cancelHelperRemoval = true;\n\t\t\t\tsortable.cancelHelperRemoval = false;\n\n\t\t\t\t// Use _storedCSS To restore properties in the sortable,\n\t\t\t\t// as this also handles revert (#9675) since the draggable\n\t\t\t\t// may have modified them in unexpected ways (#8809)\n\t\t\t\tsortable._storedCSS = {\n\t\t\t\t\tposition: sortable.placeholder.css( \"position\" ),\n\t\t\t\t\ttop: sortable.placeholder.css( \"top\" ),\n\t\t\t\t\tleft: sortable.placeholder.css( \"left\" )\n\t\t\t\t};\n\n\t\t\t\tsortable._mouseStop( event );\n\n\t\t\t\t// Once drag has ended, the sortable should return to using\n\t\t\t\t// its original helper, not the shared helper from draggable\n\t\t\t\tsortable.options.helper = sortable.options._helper;\n\t\t\t} else {\n\n\t\t\t\t// Prevent this Sortable from removing the helper.\n\t\t\t\t// However, don't set the draggable to remove the helper\n\t\t\t\t// either as another connected Sortable may yet handle the removal.\n\t\t\t\tsortable.cancelHelperRemoval = true;\n\n\t\t\t\tsortable._trigger( \"deactivate\", event, uiSortable );\n\t\t\t}\n\t\t} );\n\t},\n\tdrag: function( event, ui, draggable ) {\n\t\t$.each( draggable.sortables, function() {\n\t\t\tvar innermostIntersecting = false,\n\t\t\t\tsortable = this;\n\n\t\t\t// Copy over variables that sortable's _intersectsWith uses\n\t\t\tsortable.positionAbs = draggable.positionAbs;\n\t\t\tsortable.helperProportions = draggable.helperProportions;\n\t\t\tsortable.offset.click = draggable.offset.click;\n\n\t\t\tif ( sortable._intersectsWith( sortable.containerCache ) ) {\n\t\t\t\tinnermostIntersecting = true;\n\n\t\t\t\t$.each( draggable.sortables, function() {\n\n\t\t\t\t\t// Copy over variables that sortable's _intersectsWith uses\n\t\t\t\t\tthis.positionAbs = draggable.positionAbs;\n\t\t\t\t\tthis.helperProportions = draggable.helperProportions;\n\t\t\t\t\tthis.offset.click = draggable.offset.click;\n\n\t\t\t\t\tif ( this !== sortable &&\n\t\t\t\t\t\t\tthis._intersectsWith( this.containerCache ) &&\n\t\t\t\t\t\t\t$.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) {\n\t\t\t\t\t\tinnermostIntersecting = false;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn innermostIntersecting;\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\tif ( innermostIntersecting ) {\n\n\t\t\t\t// If it intersects, we use a little isOver variable and set it once,\n\t\t\t\t// so that the move-in stuff gets fired only once.\n\t\t\t\tif ( !sortable.isOver ) {\n\t\t\t\t\tsortable.isOver = 1;\n\n\t\t\t\t\t// Store draggable's parent in case we need to reappend to it later.\n\t\t\t\t\tdraggable._parent = ui.helper.parent();\n\n\t\t\t\t\tsortable.currentItem = ui.helper\n\t\t\t\t\t\t.appendTo( sortable.element )\n\t\t\t\t\t\t.data( \"ui-sortable-item\", true );\n\n\t\t\t\t\t// Store helper option to later restore it\n\t\t\t\t\tsortable.options._helper = sortable.options.helper;\n\n\t\t\t\t\tsortable.options.helper = function() {\n\t\t\t\t\t\treturn ui.helper[ 0 ];\n\t\t\t\t\t};\n\n\t\t\t\t\t// Fire the start events of the sortable with our passed browser event,\n\t\t\t\t\t// and our own helper (so it doesn't create a new one)\n\t\t\t\t\tevent.target = sortable.currentItem[ 0 ];\n\t\t\t\t\tsortable._mouseCapture( event, true );\n\t\t\t\t\tsortable._mouseStart( event, true, true );\n\n\t\t\t\t\t// Because the browser event is way off the new appended portlet,\n\t\t\t\t\t// modify necessary variables to reflect the changes\n\t\t\t\t\tsortable.offset.click.top = draggable.offset.click.top;\n\t\t\t\t\tsortable.offset.click.left = draggable.offset.click.left;\n\t\t\t\t\tsortable.offset.parent.left -= draggable.offset.parent.left -\n\t\t\t\t\t\tsortable.offset.parent.left;\n\t\t\t\t\tsortable.offset.parent.top -= draggable.offset.parent.top -\n\t\t\t\t\t\tsortable.offset.parent.top;\n\n\t\t\t\t\tdraggable._trigger( \"toSortable\", event );\n\n\t\t\t\t\t// Inform draggable that the helper is in a valid drop zone,\n\t\t\t\t\t// used solely in the revert option to handle \"valid/invalid\".\n\t\t\t\t\tdraggable.dropped = sortable.element;\n\n\t\t\t\t\t// Need to refreshPositions of all sortables in the case that\n\t\t\t\t\t// adding to one sortable changes the location of the other sortables (#9675)\n\t\t\t\t\t$.each( draggable.sortables, function() {\n\t\t\t\t\t\tthis.refreshPositions();\n\t\t\t\t\t} );\n\n\t\t\t\t\t// Hack so receive/update callbacks work (mostly)\n\t\t\t\t\tdraggable.currentItem = draggable.element;\n\t\t\t\t\tsortable.fromOutside = draggable;\n\t\t\t\t}\n\n\t\t\t\tif ( sortable.currentItem ) {\n\t\t\t\t\tsortable._mouseDrag( event );\n\n\t\t\t\t\t// Copy the sortable's position because the draggable's can potentially reflect\n\t\t\t\t\t// a relative position, while sortable is always absolute, which the dragged\n\t\t\t\t\t// element has now become. (#8809)\n\t\t\t\t\tui.position = sortable.position;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// If it doesn't intersect with the sortable, and it intersected before,\n\t\t\t\t// we fake the drag stop of the sortable, but make sure it doesn't remove\n\t\t\t\t// the helper by using cancelHelperRemoval.\n\t\t\t\tif ( sortable.isOver ) {\n\n\t\t\t\t\tsortable.isOver = 0;\n\t\t\t\t\tsortable.cancelHelperRemoval = true;\n\n\t\t\t\t\t// Calling sortable's mouseStop would trigger a revert,\n\t\t\t\t\t// so revert must be temporarily false until after mouseStop is called.\n\t\t\t\t\tsortable.options._revert = sortable.options.revert;\n\t\t\t\t\tsortable.options.revert = false;\n\n\t\t\t\t\tsortable._trigger( \"out\", event, sortable._uiHash( sortable ) );\n\t\t\t\t\tsortable._mouseStop( event, true );\n\n\t\t\t\t\t// Restore sortable behaviors that were modfied\n\t\t\t\t\t// when the draggable entered the sortable area (#9481)\n\t\t\t\t\tsortable.options.revert = sortable.options._revert;\n\t\t\t\t\tsortable.options.helper = sortable.options._helper;\n\n\t\t\t\t\tif ( sortable.placeholder ) {\n\t\t\t\t\t\tsortable.placeholder.remove();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Restore and recalculate the draggable's offset considering the sortable\n\t\t\t\t\t// may have modified them in unexpected ways. (#8809, #10669)\n\t\t\t\t\tui.helper.appendTo( draggable._parent );\n\t\t\t\t\tdraggable._refreshOffsets( event );\n\t\t\t\t\tui.position = draggable._generatePosition( event, true );\n\n\t\t\t\t\tdraggable._trigger( \"fromSortable\", event );\n\n\t\t\t\t\t// Inform draggable that the helper is no longer in a valid drop zone\n\t\t\t\t\tdraggable.dropped = false;\n\n\t\t\t\t\t// Need to refreshPositions of all sortables just in case removing\n\t\t\t\t\t// from one sortable changes the location of other sortables (#9675)\n\t\t\t\t\t$.each( draggable.sortables, function() {\n\t\t\t\t\t\tthis.refreshPositions();\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t}\n} );\n\n$.ui.plugin.add( \"draggable\", \"cursor\", {\n\tstart: function( event, ui, instance ) {\n\t\tvar t = $( \"body\" ),\n\t\t\to = instance.options;\n\n\t\tif ( t.css( \"cursor\" ) ) {\n\t\t\to._cursor = t.css( \"cursor\" );\n\t\t}\n\t\tt.css( \"cursor\", o.cursor );\n\t},\n\tstop: function( event, ui, instance ) {\n\t\tvar o = instance.options;\n\t\tif ( o._cursor ) {\n\t\t\t$( \"body\" ).css( \"cursor\", o._cursor );\n\t\t}\n\t}\n} );\n\n$.ui.plugin.add( \"draggable\", \"opacity\", {\n\tstart: function( event, ui, instance ) {\n\t\tvar t = $( ui.helper ),\n\t\t\to = instance.options;\n\t\tif ( t.css( \"opacity\" ) ) {\n\t\t\to._opacity = t.css( \"opacity\" );\n\t\t}\n\t\tt.css( \"opacity\", o.opacity );\n\t},\n\tstop: function( event, ui, instance ) {\n\t\tvar o = instance.options;\n\t\tif ( o._opacity ) {\n\t\t\t$( ui.helper ).css( \"opacity\", o._opacity );\n\t\t}\n\t}\n} );\n\n$.ui.plugin.add( \"draggable\", \"scroll\", {\n\tstart: function( event, ui, i ) {\n\t\tif ( !i.scrollParentNotHidden ) {\n\t\t\ti.scrollParentNotHidden = i.helper.scrollParent( false );\n\t\t}\n\n\t\tif ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] &&\n\t\t\t\ti.scrollParentNotHidden[ 0 ].tagName !== \"HTML\" ) {\n\t\t\ti.overflowOffset = i.scrollParentNotHidden.offset();\n\t\t}\n\t},\n\tdrag: function( event, ui, i  ) {\n\n\t\tvar o = i.options,\n\t\t\tscrolled = false,\n\t\t\tscrollParent = i.scrollParentNotHidden[ 0 ],\n\t\t\tdocument = i.document[ 0 ];\n\n\t\tif ( scrollParent !== document && scrollParent.tagName !== \"HTML\" ) {\n\t\t\tif ( !o.axis || o.axis !== \"x\" ) {\n\t\t\t\tif ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;\n\t\t\t\t} else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) {\n\t\t\t\t\tscrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( !o.axis || o.axis !== \"y\" ) {\n\t\t\t\tif ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;\n\t\t\t\t} else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) {\n\t\t\t\t\tscrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( !o.axis || o.axis !== \"x\" ) {\n\t\t\t\tif ( event.pageY - $( document ).scrollTop() < o.scrollSensitivity ) {\n\t\t\t\t\tscrolled = $( document ).scrollTop( $( document ).scrollTop() - o.scrollSpeed );\n\t\t\t\t} else if ( $( window ).height() - ( event.pageY - $( document ).scrollTop() ) <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrolled = $( document ).scrollTop( $( document ).scrollTop() + o.scrollSpeed );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( !o.axis || o.axis !== \"y\" ) {\n\t\t\t\tif ( event.pageX - $( document ).scrollLeft() < o.scrollSensitivity ) {\n\t\t\t\t\tscrolled = $( document ).scrollLeft(\n\t\t\t\t\t\t$( document ).scrollLeft() - o.scrollSpeed\n\t\t\t\t\t);\n\t\t\t\t} else if ( $( window ).width() - ( event.pageX - $( document ).scrollLeft() ) <\n\t\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\t\tscrolled = $( document ).scrollLeft(\n\t\t\t\t\t\t$( document ).scrollLeft() + o.scrollSpeed\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tif ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( i, event );\n\t\t}\n\n\t}\n} );\n\n$.ui.plugin.add( \"draggable\", \"snap\", {\n\tstart: function( event, ui, i ) {\n\n\t\tvar o = i.options;\n\n\t\ti.snapElements = [];\n\n\t\t$( o.snap.constructor !== String ? ( o.snap.items || \":data(ui-draggable)\" ) : o.snap )\n\t\t\t.each( function() {\n\t\t\t\tvar $t = $( this ),\n\t\t\t\t\t$o = $t.offset();\n\t\t\t\tif ( this !== i.element[ 0 ] ) {\n\t\t\t\t\ti.snapElements.push( {\n\t\t\t\t\t\titem: this,\n\t\t\t\t\t\twidth: $t.outerWidth(), height: $t.outerHeight(),\n\t\t\t\t\t\ttop: $o.top, left: $o.left\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} );\n\n\t},\n\tdrag: function( event, ui, inst ) {\n\n\t\tvar ts, bs, ls, rs, l, r, t, b, i, first,\n\t\t\to = inst.options,\n\t\t\td = o.snapTolerance,\n\t\t\tx1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,\n\t\t\ty1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;\n\n\t\tfor ( i = inst.snapElements.length - 1; i >= 0; i-- ) {\n\n\t\t\tl = inst.snapElements[ i ].left - inst.margins.left;\n\t\t\tr = l + inst.snapElements[ i ].width;\n\t\t\tt = inst.snapElements[ i ].top - inst.margins.top;\n\t\t\tb = t + inst.snapElements[ i ].height;\n\n\t\t\tif ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d ||\n\t\t\t\t\t!$.contains( inst.snapElements[ i ].item.ownerDocument,\n\t\t\t\t\tinst.snapElements[ i ].item ) ) {\n\t\t\t\tif ( inst.snapElements[ i ].snapping ) {\n\t\t\t\t\tif ( inst.options.snap.release ) {\n\t\t\t\t\t\tinst.options.snap.release.call(\n\t\t\t\t\t\t\tinst.element,\n\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t$.extend( inst._uiHash(), { snapItem: inst.snapElements[ i ].item } )\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tinst.snapElements[ i ].snapping = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( o.snapMode !== \"inner\" ) {\n\t\t\t\tts = Math.abs( t - y2 ) <= d;\n\t\t\t\tbs = Math.abs( b - y1 ) <= d;\n\t\t\t\tls = Math.abs( l - x2 ) <= d;\n\t\t\t\trs = Math.abs( r - x1 ) <= d;\n\t\t\t\tif ( ts ) {\n\t\t\t\t\tui.position.top = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: t - inst.helperProportions.height,\n\t\t\t\t\t\tleft: 0\n\t\t\t\t\t} ).top;\n\t\t\t\t}\n\t\t\t\tif ( bs ) {\n\t\t\t\t\tui.position.top = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: b,\n\t\t\t\t\t\tleft: 0\n\t\t\t\t\t} ).top;\n\t\t\t\t}\n\t\t\t\tif ( ls ) {\n\t\t\t\t\tui.position.left = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tleft: l - inst.helperProportions.width\n\t\t\t\t\t} ).left;\n\t\t\t\t}\n\t\t\t\tif ( rs ) {\n\t\t\t\t\tui.position.left = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tleft: r\n\t\t\t\t\t} ).left;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfirst = ( ts || bs || ls || rs );\n\n\t\t\tif ( o.snapMode !== \"outer\" ) {\n\t\t\t\tts = Math.abs( t - y1 ) <= d;\n\t\t\t\tbs = Math.abs( b - y2 ) <= d;\n\t\t\t\tls = Math.abs( l - x1 ) <= d;\n\t\t\t\trs = Math.abs( r - x2 ) <= d;\n\t\t\t\tif ( ts ) {\n\t\t\t\t\tui.position.top = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: t,\n\t\t\t\t\t\tleft: 0\n\t\t\t\t\t} ).top;\n\t\t\t\t}\n\t\t\t\tif ( bs ) {\n\t\t\t\t\tui.position.top = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: b - inst.helperProportions.height,\n\t\t\t\t\t\tleft: 0\n\t\t\t\t\t} ).top;\n\t\t\t\t}\n\t\t\t\tif ( ls ) {\n\t\t\t\t\tui.position.left = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tleft: l\n\t\t\t\t\t} ).left;\n\t\t\t\t}\n\t\t\t\tif ( rs ) {\n\t\t\t\t\tui.position.left = inst._convertPositionTo( \"relative\", {\n\t\t\t\t\t\ttop: 0,\n\t\t\t\t\t\tleft: r - inst.helperProportions.width\n\t\t\t\t\t} ).left;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( !inst.snapElements[ i ].snapping && ( ts || bs || ls || rs || first ) ) {\n\t\t\t\tif ( inst.options.snap.snap ) {\n\t\t\t\t\tinst.options.snap.snap.call(\n\t\t\t\t\t\tinst.element,\n\t\t\t\t\t\tevent,\n\t\t\t\t\t\t$.extend( inst._uiHash(), {\n\t\t\t\t\t\t\tsnapItem: inst.snapElements[ i ].item\n\t\t\t\t\t\t} ) );\n\t\t\t\t}\n\t\t\t}\n\t\t\tinst.snapElements[ i ].snapping = ( ts || bs || ls || rs || first );\n\n\t\t}\n\n\t}\n} );\n\n$.ui.plugin.add( \"draggable\", \"stack\", {\n\tstart: function( event, ui, instance ) {\n\t\tvar min,\n\t\t\to = instance.options,\n\t\t\tgroup = $.makeArray( $( o.stack ) ).sort( function( a, b ) {\n\t\t\t\treturn ( parseInt( $( a ).css( \"zIndex\" ), 10 ) || 0 ) -\n\t\t\t\t\t( parseInt( $( b ).css( \"zIndex\" ), 10 ) || 0 );\n\t\t\t} );\n\n\t\tif ( !group.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\tmin = parseInt( $( group[ 0 ] ).css( \"zIndex\" ), 10 ) || 0;\n\t\t$( group ).each( function( i ) {\n\t\t\t$( this ).css( \"zIndex\", min + i );\n\t\t} );\n\t\tthis.css( \"zIndex\", ( min + group.length ) );\n\t}\n} );\n\n$.ui.plugin.add( \"draggable\", \"zIndex\", {\n\tstart: function( event, ui, instance ) {\n\t\tvar t = $( ui.helper ),\n\t\t\to = instance.options;\n\n\t\tif ( t.css( \"zIndex\" ) ) {\n\t\t\to._zIndex = t.css( \"zIndex\" );\n\t\t}\n\t\tt.css( \"zIndex\", o.zIndex );\n\t},\n\tstop: function( event, ui, instance ) {\n\t\tvar o = instance.options;\n\n\t\tif ( o._zIndex ) {\n\t\t\t$( ui.helper ).css( \"zIndex\", o._zIndex );\n\t\t}\n\t}\n} );\n\nreturn $.ui.draggable;\n\n} );\n","/*!\n * jQuery UI Mouse 1.14.1\n * https://jqueryui.com\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license.\n * https://jquery.org/license\n */\n\n//>>label: Mouse\n//>>group: Widgets\n//>>description: Abstracts mouse-based interactions to assist in creating certain widgets.\n//>>docs: https://api.jqueryui.com/mouse/\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"../version\",\n\t\t\t\"../widget\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nvar mouseHandled = false;\n$( document ).on( \"mouseup\", function() {\n\tmouseHandled = false;\n} );\n\nreturn $.widget( \"ui.mouse\", {\n\tversion: \"1.14.1\",\n\toptions: {\n\t\tcancel: \"input, textarea, button, select, option\",\n\t\tdistance: 1,\n\t\tdelay: 0\n\t},\n\t_mouseInit: function() {\n\t\tvar that = this;\n\n\t\tthis.element\n\t\t\t.on( \"mousedown.\" + this.widgetName, function( event ) {\n\t\t\t\treturn that._mouseDown( event );\n\t\t\t} )\n\t\t\t.on( \"click.\" + this.widgetName, function( event ) {\n\t\t\t\tif ( true === $.data( event.target, that.widgetName + \".preventClickEvent\" ) ) {\n\t\t\t\t\t$.removeData( event.target, that.widgetName + \".preventClickEvent\" );\n\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} );\n\n\t\tthis.started = false;\n\t},\n\n\t// TODO: make sure destroying one instance of mouse doesn't mess with\n\t// other instances of mouse\n\t_mouseDestroy: function() {\n\t\tthis.element.off( \".\" + this.widgetName );\n\t\tif ( this._mouseMoveDelegate ) {\n\t\t\tthis.document\n\t\t\t\t.off( \"mousemove.\" + this.widgetName, this._mouseMoveDelegate )\n\t\t\t\t.off( \"mouseup.\" + this.widgetName, this._mouseUpDelegate );\n\t\t}\n\t},\n\n\t_mouseDown: function( event ) {\n\n\t\t// don't let more than one widget handle mouseStart\n\t\tif ( mouseHandled ) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._mouseMoved = false;\n\n\t\t// We may have missed mouseup (out of window)\n\t\tif ( this._mouseStarted ) {\n\t\t\tthis._mouseUp( event );\n\t\t}\n\n\t\tthis._mouseDownEvent = event;\n\n\t\tvar that = this,\n\t\t\tbtnIsLeft = event.which === 1,\n\t\t\telIsCancel = typeof this.options.cancel === \"string\" ?\n\t\t\t\t$( event.target ).closest( this.options.cancel ).length :\n\t\t\t\tfalse;\n\t\tif ( !btnIsLeft || elIsCancel || !this._mouseCapture( event ) ) {\n\t\t\treturn true;\n\t\t}\n\n\t\tthis.mouseDelayMet = !this.options.delay;\n\t\tif ( !this.mouseDelayMet ) {\n\t\t\tthis._mouseDelayTimer = setTimeout( function() {\n\t\t\t\tthat.mouseDelayMet = true;\n\t\t\t}, this.options.delay );\n\t\t}\n\n\t\tif ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {\n\t\t\tthis._mouseStarted = ( this._mouseStart( event ) !== false );\n\t\t\tif ( !this._mouseStarted ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// Click event may never have fired (Gecko & Opera)\n\t\tif ( true === $.data( event.target, this.widgetName + \".preventClickEvent\" ) ) {\n\t\t\t$.removeData( event.target, this.widgetName + \".preventClickEvent\" );\n\t\t}\n\n\t\t// These delegates are required to keep context\n\t\tthis._mouseMoveDelegate = function( event ) {\n\t\t\treturn that._mouseMove( event );\n\t\t};\n\t\tthis._mouseUpDelegate = function( event ) {\n\t\t\treturn that._mouseUp( event );\n\t\t};\n\n\t\tthis.document\n\t\t\t.on( \"mousemove.\" + this.widgetName, this._mouseMoveDelegate )\n\t\t\t.on( \"mouseup.\" + this.widgetName, this._mouseUpDelegate );\n\n\t\tevent.preventDefault();\n\n\t\tmouseHandled = true;\n\t\treturn true;\n\t},\n\n\t_mouseMove: function( event ) {\n\n\t\t// Only check for mouseups outside the document if you've moved inside the document\n\t\t// at least once.\n\t\tif ( this._mouseMoved && !event.which ) {\n\n\t\t\t// Support: Safari <=8 - 9\n\t\t\t// Safari sets which to 0 if you press any of the following keys\n\t\t\t// during a drag (#14461)\n\t\t\tif ( event.originalEvent.altKey || event.originalEvent.ctrlKey ||\n\t\t\t\t\tevent.originalEvent.metaKey || event.originalEvent.shiftKey ) {\n\t\t\t\tthis.ignoreMissingWhich = true;\n\t\t\t} else if ( !this.ignoreMissingWhich ) {\n\t\t\t\treturn this._mouseUp( event );\n\t\t\t}\n\t\t}\n\n\t\tif ( event.which || event.button ) {\n\t\t\tthis._mouseMoved = true;\n\t\t}\n\n\t\tif ( this._mouseStarted ) {\n\t\t\tthis._mouseDrag( event );\n\t\t\treturn event.preventDefault();\n\t\t}\n\n\t\tif ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) {\n\t\t\tthis._mouseStarted =\n\t\t\t\t( this._mouseStart( this._mouseDownEvent, event ) !== false );\n\t\t\tif ( this._mouseStarted ) {\n\t\t\t\tthis._mouseDrag( event );\n\t\t\t} else {\n\t\t\t\tthis._mouseUp( event );\n\t\t\t}\n\t\t}\n\n\t\treturn !this._mouseStarted;\n\t},\n\n\t_mouseUp: function( event ) {\n\t\tthis.document\n\t\t\t.off( \"mousemove.\" + this.widgetName, this._mouseMoveDelegate )\n\t\t\t.off( \"mouseup.\" + this.widgetName, this._mouseUpDelegate );\n\n\t\tif ( this._mouseStarted ) {\n\t\t\tthis._mouseStarted = false;\n\n\t\t\tif ( event.target === this._mouseDownEvent.target ) {\n\t\t\t\t$.data( event.target, this.widgetName + \".preventClickEvent\", true );\n\t\t\t}\n\n\t\t\tthis._mouseStop( event );\n\t\t}\n\n\t\tif ( this._mouseDelayTimer ) {\n\t\t\tclearTimeout( this._mouseDelayTimer );\n\t\t\tdelete this._mouseDelayTimer;\n\t\t}\n\n\t\tthis.ignoreMissingWhich = false;\n\t\tmouseHandled = false;\n\t\tevent.preventDefault();\n\t},\n\n\t_mouseDistanceMet: function( event ) {\n\t\treturn ( Math.max(\n\t\t\t\tMath.abs( this._mouseDownEvent.pageX - event.pageX ),\n\t\t\t\tMath.abs( this._mouseDownEvent.pageY - event.pageY )\n\t\t\t) >= this.options.distance\n\t\t);\n\t},\n\n\t_mouseDelayMet: function( /* event */ ) {\n\t\treturn this.mouseDelayMet;\n\t},\n\n\t// These are placeholder methods, to be overriden by extending plugin\n\t_mouseStart: function( /* event */ ) {},\n\t_mouseDrag: function( /* event */ ) {},\n\t_mouseStop: function( /* event */ ) {},\n\t_mouseCapture: function( /* event */ ) {\n\t\treturn true;\n\t}\n} );\n\n} );\n","/*!\n * jQuery UI Sortable 1.14.1\n * https://jqueryui.com\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license.\n * https://jquery.org/license\n */\n\n//>>label: Sortable\n//>>group: Interactions\n//>>description: Enables items in a list to be sorted using the mouse.\n//>>docs: https://api.jqueryui.com/sortable/\n//>>demos: https://jqueryui.com/sortable/\n//>>css.structure: ../../themes/base/sortable.css\n\n( function( factory ) {\n\t\"use strict\";\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine( [\n\t\t\t\"jquery\",\n\t\t\t\"./mouse\",\n\t\t\t\"../data\",\n\t\t\t\"../scroll-parent\",\n\t\t\t\"../version\",\n\t\t\t\"../widget\"\n\t\t], factory );\n\t} else {\n\n\t\t// Browser globals\n\t\tfactory( jQuery );\n\t}\n} )( function( $ ) {\n\"use strict\";\n\nreturn $.widget( \"ui.sortable\", $.ui.mouse, {\n\tversion: \"1.14.1\",\n\twidgetEventPrefix: \"sort\",\n\tready: false,\n\toptions: {\n\t\tappendTo: \"parent\",\n\t\taxis: false,\n\t\tconnectWith: false,\n\t\tcontainment: false,\n\t\tcursor: \"auto\",\n\t\tcursorAt: false,\n\t\tdropOnEmpty: true,\n\t\tforcePlaceholderSize: false,\n\t\tforceHelperSize: false,\n\t\tgrid: false,\n\t\thandle: false,\n\t\thelper: \"original\",\n\t\titems: \"> *\",\n\t\topacity: false,\n\t\tplaceholder: false,\n\t\trevert: false,\n\t\tscroll: true,\n\t\tscrollSensitivity: 20,\n\t\tscrollSpeed: 20,\n\t\tscope: \"default\",\n\t\ttolerance: \"intersect\",\n\t\tzIndex: 1000,\n\n\t\t// Callbacks\n\t\tactivate: null,\n\t\tbeforeStop: null,\n\t\tchange: null,\n\t\tdeactivate: null,\n\t\tout: null,\n\t\tover: null,\n\t\treceive: null,\n\t\tremove: null,\n\t\tsort: null,\n\t\tstart: null,\n\t\tstop: null,\n\t\tupdate: null\n\t},\n\n\t_isOverAxis: function( x, reference, size ) {\n\t\treturn ( x >= reference ) && ( x < ( reference + size ) );\n\t},\n\n\t_isFloating: function( item ) {\n\t\treturn ( /left|right/ ).test( item.css( \"float\" ) ) ||\n\t\t\t( /inline|table-cell/ ).test( item.css( \"display\" ) );\n\t},\n\n\t_create: function() {\n\t\tthis.containerCache = {};\n\t\tthis._addClass( \"ui-sortable\" );\n\n\t\t//Get the items\n\t\tthis.refresh();\n\n\t\t//Let's determine the parent's offset\n\t\tthis.offset = this.element.offset();\n\n\t\t//Initialize mouse events for interaction\n\t\tthis._mouseInit();\n\n\t\tthis._setHandleClassName();\n\n\t\t//We're ready to go\n\t\tthis.ready = true;\n\n\t},\n\n\t_setOption: function( key, value ) {\n\t\tthis._super( key, value );\n\n\t\tif ( key === \"handle\" ) {\n\t\t\tthis._setHandleClassName();\n\t\t}\n\t},\n\n\t_setHandleClassName: function() {\n\t\tthis._removeClass( this.element.find( \".ui-sortable-handle\" ), \"ui-sortable-handle\" );\n        $.each( this.items, function() {\n            (this.instance.options.handle\n            \t? this.item.find( this.instance.options.handle )\n            \t: this.item\n            ).addClass('ui-sortable-handle');\n        });\n\t},\n\n\t_destroy: function() {\n\t\tthis._mouseDestroy();\n\n\t\tfor ( var i = this.items.length - 1; i >= 0; i-- ) {\n\t\t\tthis.items[ i ].item.removeData( this.widgetName + \"-item\" );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_mouseCapture: function( event, overrideHandle ) {\n\t\tvar currentItem = null,\n\t\t\tvalidHandle = false,\n\t\t\tthat = this;\n\n\t\tif ( this.reverting ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( this.options.disabled || this.options.type === \"static\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t//We have to refresh the items data once first\n\t\tthis._refreshItems( event );\n\n\t\t//Find out if the clicked node (or one of its parents) is a actual item in this.items\n\t\t$( event.target ).parents().each( function() {\n\t\t\tif ( $.data( this, that.widgetName + \"-item\" ) === that ) {\n\t\t\t\tcurrentItem = $( this );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} );\n\t\tif ( $.data( event.target, that.widgetName + \"-item\" ) === that ) {\n\t\t\tcurrentItem = $( event.target );\n\t\t}\n\n\t\tif ( !currentItem ) {\n\t\t\treturn false;\n\t\t}\n\t\tif ( this.options.handle && !overrideHandle ) {\n\t\t\t$( this.options.handle, currentItem ).find( \"*\" ).addBack().each( function() {\n\t\t\t\tif ( this === event.target ) {\n\t\t\t\t\tvalidHandle = true;\n\t\t\t\t}\n\t\t\t} );\n\t\t\tif ( !validHandle ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tthis.currentItem = currentItem;\n\t\tthis._removeCurrentsFromItems();\n\t\treturn true;\n\n\t},\n\n\t_mouseStart: function( event, overrideHandle, noActivation ) {\n\n\t\tvar i, body,\n\t\t\to = this.options;\n\n\t\tthis.currentContainer = this;\n\n\t\t//We only need to call refreshPositions, because the refreshItems call has been moved to\n\t\t// mouseCapture\n\t\tthis.refreshPositions();\n\n\t\t//Prepare the dragged items parent\n\t\tthis.appendTo = $( o.appendTo !== \"parent\" ?\n\t\t\t\to.appendTo :\n\t\t\t\tthis.currentItem.parent() );\n\n\t\t//Create and append the visible helper\n\t\tthis.helper = this._createHelper( event );\n\n\t\t//Cache the helper size\n\t\tthis._cacheHelperProportions();\n\n\t\t/*\n\t\t * - Position generation -\n\t\t * This block generates everything position related - it's the core of draggables.\n\t\t */\n\n\t\t//Cache the margins of the original element\n\t\tthis._cacheMargins();\n\n\t\t//The element's absolute position on the page minus margins\n\t\tthis.offset = this.currentItem.offset();\n\t\tthis.offset = {\n\t\t\ttop: this.offset.top - this.margins.top,\n\t\t\tleft: this.offset.left - this.margins.left\n\t\t};\n\n\t\t$.extend( this.offset, {\n\t\t\tclick: { //Where the click happened, relative to the element\n\t\t\t\tleft: event.pageX - this.offset.left,\n\t\t\t\ttop: event.pageY - this.offset.top\n\t\t\t},\n\n\t\t\t// This is a relative to absolute position minus the actual position calculation -\n\t\t\t// only used for relative positioned helper\n\t\t\trelative: this._getRelativeOffset()\n\t\t} );\n\n\t\t// After we get the helper offset, but before we get the parent offset we can\n\t\t// change the helper's position to absolute\n\t\t// TODO: Still need to figure out a way to make relative sorting possible\n\t\tthis.helper.css( \"position\", \"absolute\" );\n\t\tthis.cssPosition = this.helper.css( \"position\" );\n\n\t\t//Adjust the mouse offset relative to the helper if \"cursorAt\" is supplied\n\t\tif ( o.cursorAt ) {\n\t\t\tthis._adjustOffsetFromHelper( o.cursorAt );\n\t\t}\n\n\t\t//Cache the former DOM position\n\t\tthis.domPosition = {\n\t\t\tprev: this.currentItem.prev()[ 0 ],\n\t\t\tparent: this.currentItem.parent()[ 0 ]\n\t\t};\n\n\t\t// If the helper is not the original, hide the original so it's not playing any role during\n\t\t// the drag, won't cause anything bad this way\n\t\tif ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {\n\t\t\tthis.currentItem.hide();\n\t\t}\n\n\t\t//Create the placeholder\n\t\tthis._createPlaceholder();\n\n\t\t//Get the next scrolling parent\n\t\tthis.scrollParent = this.placeholder.scrollParent();\n\n\t\t$.extend( this.offset, {\n\t\t\tparent: this._getParentOffset()\n\t\t} );\n\n\t\t//Set a containment if given in the options\n\t\tif ( o.containment ) {\n\t\t\tthis._setContainment();\n\t\t}\n\n\t\tif ( o.cursor && o.cursor !== \"auto\" ) { // cursor option\n\t\t\tbody = this.document.find( \"body\" );\n\n\t\t\tthis._storedStylesheet =\n\t\t\t\t$( \"<style>*{ cursor: \" + o.cursor + \" !important; }</style>\" ).appendTo( body );\n\t\t}\n\n\t\t// We need to make sure to grab the zIndex before setting the\n\t\t// opacity, because setting the opacity to anything lower than 1\n\t\t// causes the zIndex to change from \"auto\" to 0.\n\t\tif ( o.zIndex ) { // zIndex option\n\t\t\tif ( this.helper.css( \"zIndex\" ) ) {\n\t\t\t\tthis._storedZIndex = this.helper.css( \"zIndex\" );\n\t\t\t}\n\t\t\tthis.helper.css( \"zIndex\", o.zIndex );\n\t\t}\n\n\t\tif ( o.opacity ) { // opacity option\n\t\t\tif ( this.helper.css( \"opacity\" ) ) {\n\t\t\t\tthis._storedOpacity = this.helper.css( \"opacity\" );\n\t\t\t}\n\t\t\tthis.helper.css( \"opacity\", o.opacity );\n\t\t}\n\n\t\t//Prepare scrolling\n\t\tif ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\tthis.scrollParent[ 0 ].tagName !== \"HTML\" ) {\n\t\t\tthis.overflowOffset = this.scrollParent.offset();\n\t\t}\n\n\t\t//Call callbacks\n\t\tthis._trigger( \"start\", event, this._uiHash() );\n\n\t\t//Recache the helper size\n\t\tif ( !this._preserveHelperProportions ) {\n\t\t\tthis._cacheHelperProportions();\n\t\t}\n\n\t\t//Post \"activate\" events to possible containers\n\t\tif ( !noActivation ) {\n\t\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tthis.containers[ i ]._trigger( \"activate\", event, this._uiHash( this ) );\n\t\t\t}\n\t\t}\n\n\t\t//Prepare possible droppables\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.current = this;\n\t\t}\n\n\t\tif ( $.ui.ddmanager && !o.dropBehaviour ) {\n\t\t\t$.ui.ddmanager.prepareOffsets( this, event );\n\t\t}\n\n\t\tthis.dragging = true;\n\n\t\tthis._addClass( this.helper, \"ui-sortable-helper\" );\n\n\t\t//Move the helper, if needed\n\t\tif ( !this.helper.parent().is( this.appendTo ) ) {\n\t\t\tthis.helper.detach().appendTo( this.appendTo );\n\n\t\t\t//Update position\n\t\t\tthis.offset.parent = this._getParentOffset();\n\t\t}\n\n\t\t//Generate the original position\n\t\tthis.position = this.originalPosition = this._generatePosition( event );\n\t\tthis.originalPageX = event.pageX;\n\t\tthis.originalPageY = event.pageY;\n\t\tthis.lastPositionAbs = this.positionAbs = this._convertPositionTo( \"absolute\" );\n\n\t\tthis._mouseDrag( event );\n\n\t\treturn true;\n\n\t},\n\n\t_scroll: function( event ) {\n\t\tvar o = this.options,\n\t\t\tscrolled = false;\n\n\t\tif ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\tthis.scrollParent[ 0 ].tagName !== \"HTML\" ) {\n\n\t\t\tif ( ( this.overflowOffset.top + this.scrollParent[ 0 ].offsetHeight ) -\n\t\t\t\t\tevent.pageY < o.scrollSensitivity ) {\n\t\t\t\tthis.scrollParent[ 0 ].scrollTop =\n\t\t\t\t\tscrolled = this.scrollParent[ 0 ].scrollTop + o.scrollSpeed;\n\t\t\t} else if ( event.pageY - this.overflowOffset.top < o.scrollSensitivity ) {\n\t\t\t\tthis.scrollParent[ 0 ].scrollTop =\n\t\t\t\t\tscrolled = this.scrollParent[ 0 ].scrollTop - o.scrollSpeed;\n\t\t\t}\n\n\t\t\tif ( ( this.overflowOffset.left + this.scrollParent[ 0 ].offsetWidth ) -\n\t\t\t\t\tevent.pageX < o.scrollSensitivity ) {\n\t\t\t\tthis.scrollParent[ 0 ].scrollLeft = scrolled =\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft + o.scrollSpeed;\n\t\t\t} else if ( event.pageX - this.overflowOffset.left < o.scrollSensitivity ) {\n\t\t\t\tthis.scrollParent[ 0 ].scrollLeft = scrolled =\n\t\t\t\t\tthis.scrollParent[ 0 ].scrollLeft - o.scrollSpeed;\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( event.pageY - this.document.scrollTop() < o.scrollSensitivity ) {\n\t\t\t\tscrolled = this.document.scrollTop( this.document.scrollTop() - o.scrollSpeed );\n\t\t\t} else if ( this.window.height() - ( event.pageY - this.document.scrollTop() ) <\n\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\tscrolled = this.document.scrollTop( this.document.scrollTop() + o.scrollSpeed );\n\t\t\t}\n\n\t\t\tif ( event.pageX - this.document.scrollLeft() < o.scrollSensitivity ) {\n\t\t\t\tscrolled = this.document.scrollLeft(\n\t\t\t\t\tthis.document.scrollLeft() - o.scrollSpeed\n\t\t\t\t);\n\t\t\t} else if ( this.window.width() - ( event.pageX - this.document.scrollLeft() ) <\n\t\t\t\t\to.scrollSensitivity ) {\n\t\t\t\tscrolled = this.document.scrollLeft(\n\t\t\t\t\tthis.document.scrollLeft() + o.scrollSpeed\n\t\t\t\t);\n\t\t\t}\n\n\t\t}\n\n\t\treturn scrolled;\n\t},\n\n\t_mouseDrag: function( event ) {\n\t\tvar i, item, itemElement, intersection,\n\t\t\to = this.options;\n\n\t\t//Compute the helpers position\n\t\tthis.position = this._generatePosition( event );\n\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\n\n\t\t//Set the helper position\n\t\tif ( !this.options.axis || this.options.axis !== \"y\" ) {\n\t\t\tthis.helper[ 0 ].style.left = this.position.left + \"px\";\n\t\t}\n\t\tif ( !this.options.axis || this.options.axis !== \"x\" ) {\n\t\t\tthis.helper[ 0 ].style.top = this.position.top + \"px\";\n\t\t}\n\n\t\t//Do scrolling\n\t\tif ( o.scroll ) {\n\t\t\tif ( this._scroll( event ) !== false ) {\n\n\t\t\t\t//Update item positions used in position checks\n\t\t\t\tthis._refreshItemPositions( true );\n\n\t\t\t\tif ( $.ui.ddmanager && !o.dropBehaviour ) {\n\t\t\t\t\t$.ui.ddmanager.prepareOffsets( this, event );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.dragDirection = {\n\t\t\tvertical: this._getDragVerticalDirection(),\n\t\t\thorizontal: this._getDragHorizontalDirection()\n\t\t};\n\n\t\t//Rearrange\n\t\tfor ( i = this.items.length - 1; i >= 0; i-- ) {\n\n\t\t\t//Cache variables and intersection, continue if no intersection\n\t\t\titem = this.items[ i ];\n\t\t\titemElement = item.item[ 0 ];\n\t\t\tintersection = this._intersectsWithPointer( item );\n\t\t\tif ( !intersection ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Only put the placeholder inside the current Container, skip all\n\t\t\t// items from other containers. This works because when moving\n\t\t\t// an item from one container to another the\n\t\t\t// currentContainer is switched before the placeholder is moved.\n\t\t\t//\n\t\t\t// Without this, moving items in \"sub-sortables\" can cause\n\t\t\t// the placeholder to jitter between the outer and inner container.\n\t\t\tif ( item.instance !== this.currentContainer ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Cannot intersect with itself\n\t\t\t// no useless actions that have been done before\n\t\t\t// no action if the item moved is the parent of the item checked\n\t\t\tif ( itemElement !== this.currentItem[ 0 ] &&\n\t\t\t\tthis.placeholder[ intersection === 1 ?\n\t\t\t\t\"next\" : \"prev\" ]()[ 0 ] !== itemElement &&\n\t\t\t\t!$.contains( this.placeholder[ 0 ], itemElement ) &&\n\t\t\t\t( this.options.type === \"semi-dynamic\" ?\n\t\t\t\t\t!$.contains( this.element[ 0 ], itemElement ) :\n\t\t\t\t\ttrue\n\t\t\t\t)\n\t\t\t) {\n\n\t\t\t\tthis.direction = intersection === 1 ? \"down\" : \"up\";\n\n\t\t\t\tif ( this.options.tolerance === \"pointer\" ||\n\t\t\t\t\t\tthis._intersectsWithSides( item ) ) {\n\t\t\t\t\tthis._rearrange( event, item );\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tthis._trigger( \"change\", event, this._uiHash() );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t//Post events to containers\n\t\tthis._contactContainers( event );\n\n\t\t//Interconnect with droppables\n\t\tif ( $.ui.ddmanager ) {\n\t\t\t$.ui.ddmanager.drag( this, event );\n\t\t}\n\n\t\t//Call callbacks\n\t\tthis._trigger( \"sort\", event, this._uiHash() );\n\n\t\tthis.lastPositionAbs = this.positionAbs;\n\t\treturn false;\n\n\t},\n\n\t_mouseStop: function( event, noPropagation ) {\n\n\t\tif ( !event ) {\n\t\t\treturn;\n\t\t}\n\n\t\t//If we are using droppables, inform the manager about the drop\n\t\tif ( $.ui.ddmanager && !this.options.dropBehaviour ) {\n\t\t\t$.ui.ddmanager.drop( this, event );\n\t\t}\n\n\t\tif ( this.options.revert ) {\n\t\t\tvar that = this,\n\t\t\t\tcur = this.placeholder.offset(),\n\t\t\t\taxis = this.options.axis,\n\t\t\t\tanimation = {};\n\n\t\t\tif ( !axis || axis === \"x\" ) {\n\t\t\t\tanimation.left = cur.left - this.offset.parent.left - this.margins.left +\n\t\t\t\t\t( this.offsetParent[ 0 ] === this.document[ 0 ].body ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tthis.offsetParent[ 0 ].scrollLeft\n\t\t\t\t\t);\n\t\t\t}\n\t\t\tif ( !axis || axis === \"y\" ) {\n\t\t\t\tanimation.top = cur.top - this.offset.parent.top - this.margins.top +\n\t\t\t\t\t( this.offsetParent[ 0 ] === this.document[ 0 ].body ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\tthis.offsetParent[ 0 ].scrollTop\n\t\t\t\t\t);\n\t\t\t}\n\t\t\tthis.reverting = true;\n\t\t\t$( this.helper ).animate(\n\t\t\t\tanimation,\n\t\t\t\tparseInt( this.options.revert, 10 ) || 500,\n\t\t\t\tfunction() {\n\t\t\t\t\tthat._clear( event );\n\t\t\t\t}\n\t\t\t);\n\t\t} else {\n\t\t\tthis._clear( event, noPropagation );\n\t\t}\n\n\t\treturn false;\n\n\t},\n\n\tcancel: function() {\n\n\t\tif ( this.dragging ) {\n\n\t\t\tthis._mouseUp( new $.Event( \"mouseup\", { target: null } ) );\n\n\t\t\tif ( this.options.helper === \"original\" ) {\n\t\t\t\tthis.currentItem.css( this._storedCSS );\n\t\t\t\tthis._removeClass( this.currentItem, \"ui-sortable-helper\" );\n\t\t\t} else {\n\t\t\t\tthis.currentItem.show();\n\t\t\t}\n\n\t\t\t//Post deactivating events to containers\n\t\t\tfor ( var i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tthis.containers[ i ]._trigger( \"deactivate\", null, this._uiHash( this ) );\n\t\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\t\tthis.containers[ i ]._trigger( \"out\", null, this._uiHash( this ) );\n\t\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.placeholder ) {\n\n\t\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,\n\t\t\t// it unbinds ALL events from the original node!\n\t\t\tif ( this.placeholder[ 0 ].parentNode ) {\n\t\t\t\tthis.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );\n\t\t\t}\n\t\t\tif ( this.options.helper !== \"original\" && this.helper &&\n\t\t\t\t\tthis.helper[ 0 ].parentNode ) {\n\t\t\t\tthis.helper.remove();\n\t\t\t}\n\n\t\t\t$.extend( this, {\n\t\t\t\thelper: null,\n\t\t\t\tdragging: false,\n\t\t\t\treverting: false,\n\t\t\t\t_noFinalSort: null\n\t\t\t} );\n\n\t\t\tif ( this.domPosition.prev ) {\n\t\t\t\t$( this.domPosition.prev ).after( this.currentItem );\n\t\t\t} else {\n\t\t\t\t$( this.domPosition.parent ).prepend( this.currentItem );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tserialize: function( o ) {\n\n\t\tvar items = this._getItemsAsjQuery( o && o.connected ),\n\t\t\tstr = [];\n\t\to = o || {};\n\n\t\t$( items ).each( function() {\n\t\t\tvar res = ( $( o.item || this ).attr( o.attribute || \"id\" ) || \"\" )\n\t\t\t\t.match( o.expression || ( /(.+)[\\-=_](.+)/ ) );\n\t\t\tif ( res ) {\n\t\t\t\tstr.push(\n\t\t\t\t\t( o.key || res[ 1 ] + \"[]\" ) +\n\t\t\t\t\t\"=\" + ( o.key && o.expression ? res[ 1 ] : res[ 2 ] ) );\n\t\t\t}\n\t\t} );\n\n\t\tif ( !str.length && o.key ) {\n\t\t\tstr.push( o.key + \"=\" );\n\t\t}\n\n\t\treturn str.join( \"&\" );\n\n\t},\n\n\ttoArray: function( o ) {\n\n\t\tvar items = this._getItemsAsjQuery( o && o.connected ),\n\t\t\tret = [];\n\n\t\to = o || {};\n\n\t\titems.each( function() {\n\t\t\tret.push( $( o.item || this ).attr( o.attribute || \"id\" ) || \"\" );\n\t\t} );\n\t\treturn ret;\n\n\t},\n\n\t/* Be careful with the following core functions */\n\t_intersectsWith: function( item ) {\n\n\t\tvar x1 = this.positionAbs.left,\n\t\t\tx2 = x1 + this.helperProportions.width,\n\t\t\ty1 = this.positionAbs.top,\n\t\t\ty2 = y1 + this.helperProportions.height,\n\t\t\tl = item.left,\n\t\t\tr = l + item.width,\n\t\t\tt = item.top,\n\t\t\tb = t + item.height,\n\t\t\tdyClick = this.offset.click.top,\n\t\t\tdxClick = this.offset.click.left,\n\t\t\tisOverElementHeight = ( this.options.axis === \"x\" ) || ( ( y1 + dyClick ) > t &&\n\t\t\t\t( y1 + dyClick ) < b ),\n\t\t\tisOverElementWidth = ( this.options.axis === \"y\" ) || ( ( x1 + dxClick ) > l &&\n\t\t\t\t( x1 + dxClick ) < r ),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth;\n\n\t\tif ( this.options.tolerance === \"pointer\" ||\n\t\t\tthis.options.forcePointerForContainers ||\n\t\t\t( this.options.tolerance !== \"pointer\" &&\n\t\t\t\tthis.helperProportions[ this.floating ? \"width\" : \"height\" ] >\n\t\t\t\titem[ this.floating ? \"width\" : \"height\" ] )\n\t\t) {\n\t\t\treturn isOverElement;\n\t\t} else {\n\n\t\t\treturn ( l < x1 + ( this.helperProportions.width / 2 ) && // Right Half\n\t\t\t\tx2 - ( this.helperProportions.width / 2 ) < r && // Left Half\n\t\t\t\tt < y1 + ( this.helperProportions.height / 2 ) && // Bottom Half\n\t\t\t\ty2 - ( this.helperProportions.height / 2 ) < b ); // Top Half\n\n\t\t}\n\t},\n\n\t_intersectsWithPointer: function( item ) {\n\t\tvar verticalDirection, horizontalDirection,\n\t\t\tisOverElementHeight = ( this.options.axis === \"x\" ) ||\n\t\t\t\tthis._isOverAxis(\n\t\t\t\t\tthis.positionAbs.top + this.offset.click.top, item.top, item.height ),\n\t\t\tisOverElementWidth = ( this.options.axis === \"y\" ) ||\n\t\t\t\tthis._isOverAxis(\n\t\t\t\t\tthis.positionAbs.left + this.offset.click.left, item.left, item.width ),\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth;\n\n\t\tif ( !isOverElement ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tverticalDirection = this.dragDirection.vertical;\n\t\thorizontalDirection = this.dragDirection.horizontal;\n\n\t\treturn this.floating ?\n\t\t\t( ( horizontalDirection === \"right\" || verticalDirection === \"down\" ) ? 2 : 1 ) :\n\t\t\t( verticalDirection && ( verticalDirection === \"down\" ? 2 : 1 ) );\n\n\t},\n\n\t_intersectsWithSides: function( item ) {\n\n\t\tvar isOverBottomHalf = this._isOverAxis( this.positionAbs.top +\n\t\t\t\tthis.offset.click.top, item.top + ( item.height / 2 ), item.height ),\n\t\t\tisOverRightHalf = this._isOverAxis( this.positionAbs.left +\n\t\t\t\tthis.offset.click.left, item.left + ( item.width / 2 ), item.width ),\n\t\t\tverticalDirection = this.dragDirection.vertical,\n\t\t\thorizontalDirection = this.dragDirection.horizontal;\n\n\t\tif ( this.floating && horizontalDirection ) {\n\t\t\treturn ( ( horizontalDirection === \"right\" && isOverRightHalf ) ||\n\t\t\t\t( horizontalDirection === \"left\" && !isOverRightHalf ) );\n\t\t} else {\n\t\t\treturn verticalDirection && ( ( verticalDirection === \"down\" && isOverBottomHalf ) ||\n\t\t\t\t( verticalDirection === \"up\" && !isOverBottomHalf ) );\n\t\t}\n\n\t},\n\n\t_getDragVerticalDirection: function() {\n\t\tvar delta = this.positionAbs.top - this.lastPositionAbs.top;\n\t\treturn delta !== 0 && ( delta > 0 ? \"down\" : \"up\" );\n\t},\n\n\t_getDragHorizontalDirection: function() {\n\t\tvar delta = this.positionAbs.left - this.lastPositionAbs.left;\n\t\treturn delta !== 0 && ( delta > 0 ? \"right\" : \"left\" );\n\t},\n\n\trefresh: function( event ) {\n\t\tthis._refreshItems( event );\n\t\tthis._setHandleClassName();\n\t\tthis.refreshPositions();\n\t\treturn this;\n\t},\n\n\t_connectWith: function() {\n\t\tvar options = this.options;\n\t\treturn options.connectWith.constructor === String ?\n\t\t\t[ options.connectWith ] :\n\t\t\toptions.connectWith;\n\t},\n\n\t_getItemsAsjQuery: function( connected ) {\n\n\t\tvar i, j, cur, inst,\n\t\t\titems = [],\n\t\t\tqueries = [],\n\t\t\tconnectWith = this._connectWith();\n\n\t\tif ( connectWith && connected ) {\n\t\t\tfor ( i = connectWith.length - 1; i >= 0; i-- ) {\n\t\t\t\tcur = $( connectWith[ i ], this.document[ 0 ] );\n\t\t\t\tfor ( j = cur.length - 1; j >= 0; j-- ) {\n\t\t\t\t\tinst = $.data( cur[ j ], this.widgetFullName );\n\t\t\t\t\tif ( inst && inst !== this && !inst.options.disabled ) {\n\t\t\t\t\t\tqueries.push( [ typeof inst.options.items === \"function\" ?\n\t\t\t\t\t\t\tinst.options.items.call( inst.element ) :\n\t\t\t\t\t\t\t$( inst.options.items, inst.element )\n\t\t\t\t\t\t\t\t.not( \".ui-sortable-helper\" )\n\t\t\t\t\t\t\t\t.not( \".ui-sortable-placeholder\" ), inst ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tqueries.push( [ typeof this.options.items === \"function\" ?\n\t\t\tthis.options.items\n\t\t\t\t.call( this.element, null, { options: this.options, item: this.currentItem } ) :\n\t\t\t$( this.options.items, this.element )\n\t\t\t\t.not( \".ui-sortable-helper\" )\n\t\t\t\t.not( \".ui-sortable-placeholder\" ), this ] );\n\n\t\tfunction addItems() {\n\t\t\titems.push( this );\n\t\t}\n\t\tfor ( i = queries.length - 1; i >= 0; i-- ) {\n\t\t\tqueries[ i ][ 0 ].each( addItems );\n\t\t}\n\n\t\treturn $( items );\n\n\t},\n\n\t_removeCurrentsFromItems: function() {\n\n\t\tvar list = this.currentItem.find( \":data(\" + this.widgetName + \"-item)\" );\n\n\t\tthis.items = $.grep( this.items, function( item ) {\n\t\t\tfor ( var j = 0; j < list.length; j++ ) {\n\t\t\t\tif ( list[ j ] === item.item[ 0 ] ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} );\n\n\t},\n\n\t_refreshItems: function( event ) {\n\n\t\tthis.items = [];\n\t\tthis.containers = [ this ];\n\n\t\tvar i, j, cur, inst, targetData, _queries, item, queriesLength,\n\t\t\titems = this.items,\n\t\t\tqueries = [ [ typeof this.options.items === \"function\" ?\n\t\t\t\tthis.options.items.call( this.element[ 0 ], event, { item: this.currentItem } ) :\n\t\t\t\t$( this.options.items, this.element ), this ] ],\n\t\t\tconnectWith = this._connectWith();\n\n\t\t//Shouldn't be run the first time through due to massive slow-down\n\t\tif ( connectWith && this.ready ) {\n\t\t\tfor ( i = connectWith.length - 1; i >= 0; i-- ) {\n\t\t\t\tcur = $( connectWith[ i ], this.document[ 0 ] );\n\t\t\t\tfor ( j = cur.length - 1; j >= 0; j-- ) {\n\t\t\t\t\tinst = $.data( cur[ j ], this.widgetFullName );\n\t\t\t\t\tif ( inst && inst !== this && !inst.options.disabled ) {\n\t\t\t\t\t\tqueries.push( [ typeof inst.options.items === \"function\" ?\n\t\t\t\t\t\t\tinst.options.items\n\t\t\t\t\t\t\t\t.call( inst.element[ 0 ], event, { item: this.currentItem } ) :\n\t\t\t\t\t\t\t$( inst.options.items, inst.element ), inst ] );\n\t\t\t\t\t\tthis.containers.push( inst );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor ( i = queries.length - 1; i >= 0; i-- ) {\n\t\t\ttargetData = queries[ i ][ 1 ];\n\t\t\t_queries = queries[ i ][ 0 ];\n\n\t\t\tfor ( j = 0, queriesLength = _queries.length; j < queriesLength; j++ ) {\n\t\t\t\titem = $( _queries[ j ] );\n\n\t\t\t\t// Data for target checking (mouse manager)\n\t\t\t\titem.data( this.widgetName + \"-item\", targetData );\n\n\t\t\t\titems.push( {\n\t\t\t\t\titem: item,\n\t\t\t\t\tinstance: targetData,\n\t\t\t\t\twidth: 0, height: 0,\n\t\t\t\t\tleft: 0, top: 0\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t},\n\n\t_refreshItemPositions: function( fast ) {\n\t\tvar i, item, t, p;\n\n\t\tfor ( i = this.items.length - 1; i >= 0; i-- ) {\n\t\t\titem = this.items[ i ];\n\n\t\t\t//We ignore calculating positions of all connected containers when we're not over them\n\t\t\tif ( this.currentContainer && item.instance !== this.currentContainer &&\n\t\t\t\t\titem.item[ 0 ] !== this.currentItem[ 0 ] ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tt = this.options.toleranceElement ?\n\t\t\t\t$( this.options.toleranceElement, item.item ) :\n\t\t\t\titem.item;\n\n\t\t\tif ( !fast ) {\n\t\t\t\titem.width = t.outerWidth();\n\t\t\t\titem.height = t.outerHeight();\n\t\t\t}\n\n\t\t\tp = t.offset();\n\t\t\titem.left = p.left;\n\t\t\titem.top = p.top;\n\t\t}\n\t},\n\n\trefreshPositions: function( fast ) {\n\n\t\t// Determine whether items are being displayed horizontally\n\t\tthis.floating = this.items.length ?\n\t\t\tthis.options.axis === \"x\" || this._isFloating( this.items[ 0 ].item ) :\n\t\t\tfalse;\n\n\t\t// This has to be redone because due to the item being moved out/into the offsetParent,\n\t\t// the offsetParent's position will change\n\t\tif ( this.offsetParent && this.helper ) {\n\t\t\tthis.offset.parent = this._getParentOffset();\n\t\t}\n\n\t\tthis._refreshItemPositions( fast );\n\n\t\tvar i, p;\n\n\t\tif ( this.options.custom && this.options.custom.refreshContainers ) {\n\t\t\tthis.options.custom.refreshContainers.call( this );\n\t\t} else {\n\t\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\t\tp = this.containers[ i ].element.offset();\n\t\t\t\tthis.containers[ i ].containerCache.left = p.left;\n\t\t\t\tthis.containers[ i ].containerCache.top = p.top;\n\t\t\t\tthis.containers[ i ].containerCache.width =\n\t\t\t\t\tthis.containers[ i ].element.outerWidth();\n\t\t\t\tthis.containers[ i ].containerCache.height =\n\t\t\t\t\tthis.containers[ i ].element.outerHeight();\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\t_createPlaceholder: function( that ) {\n\t\tthat = that || this;\n\t\tvar className, nodeName,\n\t\t\to = that.options;\n\n\t\tif ( !o.placeholder || o.placeholder.constructor === String ) {\n\t\t\tclassName = o.placeholder;\n\t\t\tnodeName = that.currentItem[ 0 ].nodeName.toLowerCase();\n\t\t\to.placeholder = {\n\t\t\t\telement: function() {\n\n\t\t\t\t\tvar element = $( \"<\" + nodeName + \">\", that.document[ 0 ] );\n\n\t\t\t\t\tthat._addClass( element, \"ui-sortable-placeholder\",\n\t\t\t\t\t\t\tclassName || that.currentItem[ 0 ].className )\n\t\t\t\t\t\t._removeClass( element, \"ui-sortable-helper\" );\n\n\t\t\t\t\tif ( nodeName === \"tbody\" ) {\n\t\t\t\t\t\tthat._createTrPlaceholder(\n\t\t\t\t\t\t\tthat.currentItem.find( \"tr\" ).eq( 0 ),\n\t\t\t\t\t\t\t$( \"<tr>\", that.document[ 0 ] ).appendTo( element )\n\t\t\t\t\t\t);\n\t\t\t\t\t} else if ( nodeName === \"tr\" ) {\n\t\t\t\t\t\tthat._createTrPlaceholder( that.currentItem, element );\n\t\t\t\t\t} else if ( nodeName === \"img\" ) {\n\t\t\t\t\t\telement.attr( \"src\", that.currentItem.attr( \"src\" ) );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !className ) {\n\t\t\t\t\t\telement.css( \"visibility\", \"hidden\" );\n\t\t\t\t\t}\n\n\t\t\t\t\treturn element;\n\t\t\t\t},\n\t\t\t\tupdate: function( container, p ) {\n\n\t\t\t\t\t// 1. If a className is set as 'placeholder option, we don't force sizes -\n\t\t\t\t\t// the class is responsible for that\n\t\t\t\t\t// 2. The option 'forcePlaceholderSize can be enabled to force it even if a\n\t\t\t\t\t// class name is specified\n\t\t\t\t\tif ( className && !o.forcePlaceholderSize ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// If the element doesn't have a actual height or width by itself (without\n\t\t\t\t\t// styles coming from a stylesheet), it receives the inline height and width\n\t\t\t\t\t// from the dragged item. Or, if it's a tbody or tr, it's going to have a height\n\t\t\t\t\t// anyway since we're populating them with <td>s above, but they're unlikely to\n\t\t\t\t\t// be the correct height on their own if the row heights are dynamic, so we'll\n\t\t\t\t\t// always assign the height of the dragged item given forcePlaceholderSize\n\t\t\t\t\t// is true.\n\t\t\t\t\tif ( !p.height() || ( o.forcePlaceholderSize &&\n\t\t\t\t\t\t\t( nodeName === \"tbody\" || nodeName === \"tr\" ) ) ) {\n\t\t\t\t\t\tp.height(\n\t\t\t\t\t\t\tthat.currentItem.innerHeight() -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingTop\" ) || 0, 10 ) -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingBottom\" ) || 0, 10 ) );\n\t\t\t\t\t}\n\t\t\t\t\tif ( !p.width() ) {\n\t\t\t\t\t\tp.width(\n\t\t\t\t\t\t\tthat.currentItem.innerWidth() -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingLeft\" ) || 0, 10 ) -\n\t\t\t\t\t\t\tparseInt( that.currentItem.css( \"paddingRight\" ) || 0, 10 ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t//Create the placeholder\n\t\tthat.placeholder = $( o.placeholder.element.call( that.element, that.currentItem ) );\n\n\t\t//Append it after the actual current item\n\t\tthat.currentItem.after( that.placeholder );\n\n\t\t//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)\n\t\to.placeholder.update( that, that.placeholder );\n\n\t},\n\n\t_createTrPlaceholder: function( sourceTr, targetTr ) {\n\t\tvar that = this;\n\n\t\tsourceTr.children().each( function() {\n\t\t\t$( \"<td>&#160;</td>\", that.document[ 0 ] )\n\t\t\t\t.attr( \"colspan\", $( this ).attr( \"colspan\" ) || 1 )\n\t\t\t\t.appendTo( targetTr );\n\t\t} );\n\t},\n\n\t_contactContainers: function( event ) {\n\t\tvar i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom,\n\t\t\tfloating, axis,\n\t\t\tinnermostContainer = null,\n\t\t\tinnermostIndex = null;\n\n\t\t// Get innermost container that intersects with item\n\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\n\t\t\t// Never consider a container that's located within the item itself\n\t\t\tif ( $.contains( this.currentItem[ 0 ], this.containers[ i ].element[ 0 ] ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( this._intersectsWith( this.containers[ i ].containerCache ) ) {\n\n\t\t\t\t// If we've already found a container and it's more \"inner\" than this, then continue\n\t\t\t\tif ( innermostContainer &&\n\t\t\t\t\t\t$.contains(\n\t\t\t\t\t\t\tthis.containers[ i ].element[ 0 ],\n\t\t\t\t\t\t\tinnermostContainer.element[ 0 ] ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tinnermostContainer = this.containers[ i ];\n\t\t\t\tinnermostIndex = i;\n\n\t\t\t} else {\n\n\t\t\t\t// container doesn't intersect. trigger \"out\" event if necessary\n\t\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\t\tthis.containers[ i ]._trigger( \"out\", event, this._uiHash( this ) );\n\t\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\n\t\t// If no intersecting containers found, return\n\t\tif ( !innermostContainer ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Move the item into the container if it's not there already\n\t\tif ( this.containers.length === 1 ) {\n\t\t\tif ( !this.containers[ innermostIndex ].containerCache.over ) {\n\t\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash( this ) );\n\t\t\t\tthis.containers[ innermostIndex ].containerCache.over = 1;\n\t\t\t}\n\t\t} else {\n\n\t\t\t// When entering a new container, we will find the item with the least distance and\n\t\t\t// append our item near it\n\t\t\tdist = 10000;\n\t\t\titemWithLeastDistance = null;\n\t\t\tfloating = innermostContainer.floating || this._isFloating( this.currentItem );\n\t\t\tposProperty = floating ? \"left\" : \"top\";\n\t\t\tsizeProperty = floating ? \"width\" : \"height\";\n\t\t\taxis = floating ? \"pageX\" : \"pageY\";\n\n\t\t\tfor ( j = this.items.length - 1; j >= 0; j-- ) {\n\t\t\t\tif ( !$.contains(\n\t\t\t\t\t\tthis.containers[ innermostIndex ].element[ 0 ], this.items[ j ].item[ 0 ] )\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif ( this.items[ j ].item[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tcur = this.items[ j ].item.offset()[ posProperty ];\n\t\t\t\tnearBottom = false;\n\t\t\t\tif ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {\n\t\t\t\t\tnearBottom = true;\n\t\t\t\t}\n\n\t\t\t\tif ( Math.abs( event[ axis ] - cur ) < dist ) {\n\t\t\t\t\tdist = Math.abs( event[ axis ] - cur );\n\t\t\t\t\titemWithLeastDistance = this.items[ j ];\n\t\t\t\t\tthis.direction = nearBottom ? \"up\" : \"down\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//Check if dropOnEmpty is enabled\n\t\t\tif ( !itemWithLeastDistance && !this.options.dropOnEmpty ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( this.currentContainer === this.containers[ innermostIndex ] ) {\n\t\t\t\tif ( !this.currentContainer.containerCache.over ) {\n\t\t\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash() );\n\t\t\t\t\tthis.currentContainer.containerCache.over = 1;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( itemWithLeastDistance ) {\n\t\t\t\tthis._rearrange( event, itemWithLeastDistance, null, true );\n\t\t\t} else {\n\t\t\t\tthis._rearrange( event, null, this.containers[ innermostIndex ].element, true );\n\t\t\t}\n\t\t\tthis._trigger( \"change\", event, this._uiHash() );\n\t\t\tthis.containers[ innermostIndex ]._trigger( \"change\", event, this._uiHash( this ) );\n\t\t\tthis.currentContainer = this.containers[ innermostIndex ];\n\n\t\t\t//Update the placeholder\n\t\t\tthis.options.placeholder.update( this.currentContainer, this.placeholder );\n\n\t\t\t//Update scrollParent\n\t\t\tthis.scrollParent = this.placeholder.scrollParent();\n\n\t\t\t//Update overflowOffset\n\t\t\tif ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t\tthis.scrollParent[ 0 ].tagName !== \"HTML\" ) {\n\t\t\t\tthis.overflowOffset = this.scrollParent.offset();\n\t\t\t}\n\n\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash( this ) );\n\t\t\tthis.containers[ innermostIndex ].containerCache.over = 1;\n\t\t}\n\n\t},\n\n\t_createHelper: function( event ) {\n\n\t\tvar o = this.options,\n\t\t\thelper = typeof o.helper === \"function\" ?\n\t\t\t\t$( o.helper.apply( this.element[ 0 ], [ event, this.currentItem ] ) ) :\n\t\t\t\t( o.helper === \"clone\" ? this.currentItem.clone() : this.currentItem );\n\n\t\t//Add the helper to the DOM if that didn't happen already\n\t\tif ( !helper.parents( \"body\" ).length ) {\n\t\t\tthis.appendTo[ 0 ].appendChild( helper[ 0 ] );\n\t\t}\n\n\t\tif ( helper[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\tthis._storedCSS = {\n\t\t\t\twidth: this.currentItem[ 0 ].style.width,\n\t\t\t\theight: this.currentItem[ 0 ].style.height,\n\t\t\t\tposition: this.currentItem.css( \"position\" ),\n\t\t\t\ttop: this.currentItem.css( \"top\" ),\n\t\t\t\tleft: this.currentItem.css( \"left\" )\n\t\t\t};\n\t\t}\n\n\t\tif ( !helper[ 0 ].style.width || o.forceHelperSize ) {\n\t\t\thelper.width( this.currentItem.width() );\n\t\t}\n\t\tif ( !helper[ 0 ].style.height || o.forceHelperSize ) {\n\t\t\thelper.height( this.currentItem.height() );\n\t\t}\n\n\t\treturn helper;\n\n\t},\n\n\t_adjustOffsetFromHelper: function( obj ) {\n\t\tif ( typeof obj === \"string\" ) {\n\t\t\tobj = obj.split( \" \" );\n\t\t}\n\t\tif ( Array.isArray( obj ) ) {\n\t\t\tobj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 };\n\t\t}\n\t\tif ( \"left\" in obj ) {\n\t\t\tthis.offset.click.left = obj.left + this.margins.left;\n\t\t}\n\t\tif ( \"right\" in obj ) {\n\t\t\tthis.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;\n\t\t}\n\t\tif ( \"top\" in obj ) {\n\t\t\tthis.offset.click.top = obj.top + this.margins.top;\n\t\t}\n\t\tif ( \"bottom\" in obj ) {\n\t\t\tthis.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;\n\t\t}\n\t},\n\n\t_getParentOffset: function() {\n\n\t\t//Get the offsetParent and cache its position\n\t\tthis.offsetParent = this.helper.offsetParent();\n\t\tvar po = this.offsetParent.offset();\n\n\t\t// This is a special case where we need to modify a offset calculated on start, since the\n\t\t// following happened:\n\t\t// 1. The position of the helper is absolute, so it's position is calculated based on the\n\t\t// next positioned parent\n\t\t// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't\n\t\t// the document, which means that the scroll is included in the initial calculation of the\n\t\t// offset of the parent, and never recalculated upon drag\n\t\tif ( this.cssPosition === \"absolute\" && this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {\n\t\t\tpo.left += this.scrollParent.scrollLeft();\n\t\t\tpo.top += this.scrollParent.scrollTop();\n\t\t}\n\n\t\t// This needs to be actually done for all browsers, since pageX/pageY includes\n\t\t// this information.\n\t\tif ( this.offsetParent[ 0 ] === this.document[ 0 ].body ) {\n\t\t\tpo = { top: 0, left: 0 };\n\t\t}\n\n\t\treturn {\n\t\t\ttop: po.top + ( parseInt( this.offsetParent.css( \"borderTopWidth\" ), 10 ) || 0 ),\n\t\t\tleft: po.left + ( parseInt( this.offsetParent.css( \"borderLeftWidth\" ), 10 ) || 0 )\n\t\t};\n\n\t},\n\n\t_getRelativeOffset: function() {\n\n\t\tif ( this.cssPosition === \"relative\" ) {\n\t\t\tvar p = this.currentItem.position();\n\t\t\treturn {\n\t\t\t\ttop: p.top - ( parseInt( this.helper.css( \"top\" ), 10 ) || 0 ) +\n\t\t\t\t\tthis.scrollParent.scrollTop(),\n\t\t\t\tleft: p.left - ( parseInt( this.helper.css( \"left\" ), 10 ) || 0 ) +\n\t\t\t\t\tthis.scrollParent.scrollLeft()\n\t\t\t};\n\t\t} else {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t},\n\n\t_cacheMargins: function() {\n\t\tthis.margins = {\n\t\t\tleft: ( parseInt( this.currentItem.css( \"marginLeft\" ), 10 ) || 0 ),\n\t\t\ttop: ( parseInt( this.currentItem.css( \"marginTop\" ), 10 ) || 0 )\n\t\t};\n\t},\n\n\t_cacheHelperProportions: function() {\n\t\tthis.helperProportions = {\n\t\t\twidth: this.helper.outerWidth(),\n\t\t\theight: this.helper.outerHeight()\n\t\t};\n\t},\n\n\t_setContainment: function() {\n\n\t\tvar ce, co, over,\n\t\t\to = this.options;\n\t\tif ( o.containment === \"parent\" ) {\n\t\t\to.containment = this.helper[ 0 ].parentNode;\n\t\t}\n\t\tif ( o.containment === \"document\" || o.containment === \"window\" ) {\n\t\t\tthis.containment = [\n\t\t\t\t0 - this.offset.relative.left - this.offset.parent.left,\n\t\t\t\t0 - this.offset.relative.top - this.offset.parent.top,\n\t\t\t\to.containment === \"document\" ?\n\t\t\t\t\tthis.document.width() :\n\t\t\t\t\tthis.window.width() - this.helperProportions.width - this.margins.left,\n\t\t\t\t( o.containment === \"document\" ?\n\t\t\t\t\t( this.document.height() || document.body.parentNode.scrollHeight ) :\n\t\t\t\t\tthis.window.height() || this.document[ 0 ].body.parentNode.scrollHeight\n\t\t\t\t) - this.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t\tif ( !( /^(document|window|parent)$/ ).test( o.containment ) ) {\n\t\t\tce = $( o.containment )[ 0 ];\n\t\t\tco = $( o.containment ).offset();\n\t\t\tover = ( $( ce ).css( \"overflow\" ) !== \"hidden\" );\n\n\t\t\tthis.containment = [\n\t\t\t\tco.left + ( parseInt( $( ce ).css( \"borderLeftWidth\" ), 10 ) || 0 ) +\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingLeft\" ), 10 ) || 0 ) - this.margins.left,\n\t\t\t\tco.top + ( parseInt( $( ce ).css( \"borderTopWidth\" ), 10 ) || 0 ) +\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingTop\" ), 10 ) || 0 ) - this.margins.top,\n\t\t\t\tco.left + ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"borderLeftWidth\" ), 10 ) || 0 ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingRight\" ), 10 ) || 0 ) -\n\t\t\t\t\tthis.helperProportions.width - this.margins.left,\n\t\t\t\tco.top + ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"borderTopWidth\" ), 10 ) || 0 ) -\n\t\t\t\t\t( parseInt( $( ce ).css( \"paddingBottom\" ), 10 ) || 0 ) -\n\t\t\t\t\tthis.helperProportions.height - this.margins.top\n\t\t\t];\n\t\t}\n\n\t},\n\n\t_convertPositionTo: function( d, pos ) {\n\n\t\tif ( !pos ) {\n\t\t\tpos = this.position;\n\t\t}\n\t\tvar mod = d === \"absolute\" ? 1 : -1,\n\t\t\tscroll = this.cssPosition === \"absolute\" &&\n\t\t\t\t!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?\n\t\t\t\t\tthis.offsetParent :\n\t\t\t\t\tthis.scrollParent,\n\t\t\tscrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );\n\n\t\treturn {\n\t\t\ttop: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpos.top\t+\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.top * mod +\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.top * mod -\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollTop() :\n\t\t\t\t\t( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod )\n\t\t\t),\n\t\t\tleft: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpos.left +\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.left * mod +\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.left * mod\t-\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 :\n\t\t\t\t\tscroll.scrollLeft() ) * mod )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_generatePosition: function( event ) {\n\n\t\tvar top, left,\n\t\t\to = this.options,\n\t\t\tpageX = event.pageX,\n\t\t\tpageY = event.pageY,\n\t\t\tscroll = this.cssPosition === \"absolute\" &&\n\t\t\t\t!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\t$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?\n\t\t\t\t\tthis.offsetParent :\n\t\t\t\t\tthis.scrollParent,\n\t\t\t\tscrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );\n\n\t\t// This is another very weird special case that only happens for relative elements:\n\t\t// 1. If the css position is relative\n\t\t// 2. and the scroll parent is the document or similar to the offset parent\n\t\t// we have to refresh the relative offset during the scroll so there are no jumps\n\t\tif ( this.cssPosition === \"relative\" && !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&\n\t\t\t\tthis.scrollParent[ 0 ] !== this.offsetParent[ 0 ] ) ) {\n\t\t\tthis.offset.relative = this._getRelativeOffset();\n\t\t}\n\n\t\t/*\n\t\t * - Position constraining -\n\t\t * Constrain the position to a mix of grid, containment.\n\t\t */\n\n\t\tif ( this.originalPosition ) { //If we are not dragging yet, we won't check for options\n\n\t\t\tif ( this.containment ) {\n\t\t\t\tif ( event.pageX - this.offset.click.left < this.containment[ 0 ] ) {\n\t\t\t\t\tpageX = this.containment[ 0 ] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif ( event.pageY - this.offset.click.top < this.containment[ 1 ] ) {\n\t\t\t\t\tpageY = this.containment[ 1 ] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t\tif ( event.pageX - this.offset.click.left > this.containment[ 2 ] ) {\n\t\t\t\t\tpageX = this.containment[ 2 ] + this.offset.click.left;\n\t\t\t\t}\n\t\t\t\tif ( event.pageY - this.offset.click.top > this.containment[ 3 ] ) {\n\t\t\t\t\tpageY = this.containment[ 3 ] + this.offset.click.top;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( o.grid ) {\n\t\t\t\ttop = this.originalPageY + Math.round( ( pageY - this.originalPageY ) /\n\t\t\t\t\to.grid[ 1 ] ) * o.grid[ 1 ];\n\t\t\t\tpageY = this.containment ?\n\t\t\t\t\t( ( top - this.offset.click.top >= this.containment[ 1 ] &&\n\t\t\t\t\t\ttop - this.offset.click.top <= this.containment[ 3 ] ) ?\n\t\t\t\t\t\t\ttop :\n\t\t\t\t\t\t\t( ( top - this.offset.click.top >= this.containment[ 1 ] ) ?\n\t\t\t\t\t\t\t\ttop - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) :\n\t\t\t\t\t\t\t\ttop;\n\n\t\t\t\tleft = this.originalPageX + Math.round( ( pageX - this.originalPageX ) /\n\t\t\t\t\to.grid[ 0 ] ) * o.grid[ 0 ];\n\t\t\t\tpageX = this.containment ?\n\t\t\t\t\t( ( left - this.offset.click.left >= this.containment[ 0 ] &&\n\t\t\t\t\t\tleft - this.offset.click.left <= this.containment[ 2 ] ) ?\n\t\t\t\t\t\t\tleft :\n\t\t\t\t\t\t\t( ( left - this.offset.click.left >= this.containment[ 0 ] ) ?\n\t\t\t\t\t\t\t\tleft - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) :\n\t\t\t\t\t\t\t\tleft;\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttop: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpageY -\n\n\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.click.top -\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.top -\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.top +\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollTop() :\n\t\t\t\t\t( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) )\n\t\t\t),\n\t\t\tleft: (\n\n\t\t\t\t// The absolute mouse position\n\t\t\t\tpageX -\n\n\t\t\t\t// Click offset (relative to the element)\n\t\t\t\tthis.offset.click.left -\n\n\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\n\t\t\t\tthis.offset.relative.left -\n\n\t\t\t\t// The offsetParent's offset without borders (offset + border)\n\t\t\t\tthis.offset.parent.left +\n\t\t\t\t( ( this.cssPosition === \"fixed\" ?\n\t\t\t\t\t-this.scrollParent.scrollLeft() :\n\t\t\t\t\tscrollIsRootNode ? 0 : scroll.scrollLeft() ) )\n\t\t\t)\n\t\t};\n\n\t},\n\n\t_rearrange: function( event, i, a, hardRefresh ) {\n\n\t\tif ( a ) {\n\t\t\ta[ 0 ].appendChild( this.placeholder[ 0 ] );\n\t\t} else {\n\t\t\ti.item[ 0 ].parentNode.insertBefore( this.placeholder[ 0 ],\n\t\t\t\t( this.direction === \"down\" ? i.item[ 0 ] : i.item[ 0 ].nextSibling ) );\n\t\t}\n\n\t\t//Various things done here to improve the performance:\n\t\t// 1. we create a setTimeout, that calls refreshPositions\n\t\t// 2. on the instance, we have a counter variable, that get's higher after every append\n\t\t// 3. on the local scope, we copy the counter variable, and check in the timeout,\n\t\t// if it's still the same\n\t\t// 4. this lets only the last addition to the timeout stack through\n\t\tthis.counter = this.counter ? ++this.counter : 1;\n\t\tvar counter = this.counter;\n\n\t\tthis._delay( function() {\n\t\t\tif ( counter === this.counter ) {\n\n\t\t\t\t//Precompute after each DOM insertion, NOT on mousemove\n\t\t\t\tthis.refreshPositions( !hardRefresh );\n\t\t\t}\n\t\t} );\n\n\t},\n\n\t_clear: function( event, noPropagation ) {\n\n\t\tthis.reverting = false;\n\n\t\t// We delay all events that have to be triggered to after the point where the placeholder\n\t\t// has been removed and everything else normalized again\n\t\tvar i,\n\t\t\tdelayedTriggers = [];\n\n\t\t// We first have to update the dom position of the actual currentItem\n\t\t// Note: don't do it if the current item is already removed (by a user), or it gets\n\t\t// reappended (see #4088)\n\t\tif ( !this._noFinalSort && this.currentItem.parent().length ) {\n\t\t\tthis.placeholder.before( this.currentItem );\n\t\t}\n\t\tthis._noFinalSort = null;\n\n\t\tif ( this.helper[ 0 ] === this.currentItem[ 0 ] ) {\n\t\t\tfor ( i in this._storedCSS ) {\n\t\t\t\tif ( this._storedCSS[ i ] === \"auto\" || this._storedCSS[ i ] === \"static\" ) {\n\t\t\t\t\tthis._storedCSS[ i ] = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.currentItem.css( this._storedCSS );\n\t\t\tthis._removeClass( this.currentItem, \"ui-sortable-helper\" );\n\t\t} else {\n\t\t\tthis.currentItem.show();\n\t\t}\n\n\t\tif ( this.fromOutside && !noPropagation ) {\n\t\t\tdelayedTriggers.push( function( event ) {\n\t\t\t\tthis._trigger( \"receive\", event, this._uiHash( this.fromOutside ) );\n\t\t\t} );\n\t\t}\n\t\tif ( ( this.fromOutside ||\n\t\t\t\tthis.domPosition.prev !==\n\t\t\t\tthis.currentItem.prev().not( \".ui-sortable-helper\" )[ 0 ] ||\n\t\t\t\tthis.domPosition.parent !== this.currentItem.parent()[ 0 ] ) && !noPropagation ) {\n\n\t\t\t// Trigger update callback if the DOM position has changed\n\t\t\tdelayedTriggers.push( function( event ) {\n\t\t\t\tthis._trigger( \"update\", event, this._uiHash() );\n\t\t\t} );\n\t\t}\n\n\t\t// Check if the items Container has Changed and trigger appropriate\n\t\t// events.\n\t\tif ( this !== this.currentContainer ) {\n\t\t\tif ( !noPropagation ) {\n\t\t\t\tdelayedTriggers.push( function( event ) {\n\t\t\t\t\tthis._trigger( \"remove\", event, this._uiHash() );\n\t\t\t\t} );\n\t\t\t\tdelayedTriggers.push( ( function( c ) {\n\t\t\t\t\treturn function( event ) {\n\t\t\t\t\t\tc._trigger( \"receive\", event, this._uiHash( this ) );\n\t\t\t\t\t};\n\t\t\t\t} ).call( this, this.currentContainer ) );\n\t\t\t\tdelayedTriggers.push( ( function( c ) {\n\t\t\t\t\treturn function( event ) {\n\t\t\t\t\t\tc._trigger( \"update\", event, this._uiHash( this ) );\n\t\t\t\t\t};\n\t\t\t\t} ).call( this, this.currentContainer ) );\n\t\t\t}\n\t\t}\n\n\t\t//Post events to containers\n\t\tfunction delayEvent( type, instance, container ) {\n\t\t\treturn function( event ) {\n\t\t\t\tcontainer._trigger( type, event, instance._uiHash( instance ) );\n\t\t\t};\n\t\t}\n\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\n\t\t\tif ( !noPropagation ) {\n\t\t\t\tdelayedTriggers.push( delayEvent( \"deactivate\", this, this.containers[ i ] ) );\n\t\t\t}\n\t\t\tif ( this.containers[ i ].containerCache.over ) {\n\t\t\t\tdelayedTriggers.push( delayEvent( \"out\", this, this.containers[ i ] ) );\n\t\t\t\tthis.containers[ i ].containerCache.over = 0;\n\t\t\t}\n\t\t}\n\n\t\t//Do what was originally in plugins\n\t\tif ( this._storedStylesheet ) {\n\t\t\tthis._storedStylesheet.remove();\n\t\t\tthis._storedStylesheet = null;\n\t\t}\n\t\tif ( this._storedOpacity ) {\n\t\t\tthis.helper.css( \"opacity\", this._storedOpacity );\n\t\t}\n\t\tif ( this._storedZIndex ) {\n\t\t\tthis.helper.css( \"zIndex\", this._storedZIndex === \"auto\" ? \"\" : this._storedZIndex );\n\t\t}\n\n\t\tthis.dragging = false;\n\n\t\tif ( !noPropagation ) {\n\t\t\tthis._trigger( \"beforeStop\", event, this._uiHash() );\n\t\t}\n\n\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately,\n\t\t// it unbinds ALL events from the original node!\n\t\tthis.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );\n\n\t\tif ( !this.cancelHelperRemoval ) {\n\t\t\tif ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {\n\t\t\t\tthis.helper.remove();\n\t\t\t}\n\t\t\tthis.helper = null;\n\t\t}\n\n\t\tif ( !noPropagation ) {\n\t\t\tfor ( i = 0; i < delayedTriggers.length; i++ ) {\n\n\t\t\t\t// Trigger all delayed events\n\t\t\t\tdelayedTriggers[ i ].call( this, event );\n\t\t\t}\n\t\t\tthis._trigger( \"stop\", event, this._uiHash() );\n\t\t}\n\n\t\tthis.fromOutside = false;\n\t\treturn !this.cancelHelperRemoval;\n\n\t},\n\n\t_trigger: function() {\n\t\tif ( $.Widget.prototype._trigger.apply( this, arguments ) === false ) {\n\t\t\tthis.cancel();\n\t\t}\n\t},\n\n\t_uiHash: function( _inst ) {\n\t\tvar inst = _inst || this;\n\t\treturn {\n\t\t\thelper: inst.helper,\n\t\t\tplaceholder: inst.placeholder || $( [] ),\n\t\t\tposition: inst.position,\n\t\t\toriginalPosition: inst.originalPosition,\n\t\t\toffset: inst.positionAbs,\n\t\t\titem: inst.currentItem,\n\t\t\tsender: _inst ? _inst.element : null\n\t\t};\n\t}\n\n} );\n\n} );\n","/*\n * Modified by Atlassian to allow chaining of keys\n *\n * jQuery Hotkeys Plugin\n * Copyright 2010, John Resig\n * Dual licensed under the MIT or GPL Version 2 licenses.\n *\n * Based upon the plugin by Tzury Bar Yochay:\n * http://github.com/tzuryby/hotkeys\n *\n * Original idea by:\n * Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/\n*/\n\n(function(jQuery){\n\n\tjQuery.hotkeys = {\n\t\tversion: \"0.8\",\n\n\t\tspecialKeys: {\n\t\t\t8: \"backspace\", 9: \"tab\", 13: \"return\", 16: \"shift\", 17: \"ctrl\", 18: \"alt\", 19: \"pause\",\n\t\t\t20: \"capslock\", 27: \"esc\", 32: \"space\", 33: \"pageup\", 34: \"pagedown\", 35: \"end\", 36: \"home\",\n\t\t\t37: \"left\", 38: \"up\", 39: \"right\", 40: \"down\", 45: \"insert\", 46: \"del\",\n\t\t\t91 : \"meta\",\n\t\t\t96: \"0\", 97: \"1\", 98: \"2\", 99: \"3\", 100: \"4\", 101: \"5\", 102: \"6\", 103: \"7\",\n\t\t\t104: \"8\", 105: \"9\", 106: \"*\", 107: \"+\", 109: \"-\", 110: \".\", 111 : \"/\",\n\t\t\t112: \"f1\", 113: \"f2\", 114: \"f3\", 115: \"f4\", 116: \"f5\", 117: \"f6\", 118: \"f7\", 119: \"f8\",\n\t\t\t120: \"f9\", 121: \"f10\", 122: \"f11\", 123: \"f12\", 144: \"numlock\", 145: \"scroll\",\n            188: \",\", 190: \".\", 191: \"/\", 224: \"meta\", 219: '[', 221: ']'\n\t\t},\n\n\t\t// These only work under Mac Gecko when using keypress (see http://unixpapa.com/js/key.html).\n\t\tkeypressKeys: [ \"<\", \">\", \"?\" ],\n\n\t\tshiftNums: {\n\t\t\t\"`\": \"~\", \"1\": \"!\", \"2\": \"@\", \"3\": \"#\", \"4\": \"$\", \"5\": \"%\", \"6\": \"^\", \"7\": \"&\",\n\t\t\t\"8\": \"*\", \"9\": \"(\", \"0\": \")\", \"-\": \"_\", \"=\": \"+\", \";\": \":\", \"'\": \"\\\"\", \",\": \"<\",\n\t\t\t\".\": \">\",  \"/\": \"?\",  \"\\\\\": \"|\"\n\t\t}\n\t};\n\n\tjQuery.each(jQuery.hotkeys.keypressKeys, function (_, key) {\n\t\tjQuery.hotkeys.shiftNums[ key ] = key;\n\t});\n\n\tfunction TimedNumber(timer) {\n\t\tthis.num = 0;\n\t\tthis.timer = timer > 0 ? timer : false;\n\t}\n\tTimedNumber.prototype.val = function () {\n\t\treturn this.num;\n\t};\n\tTimedNumber.prototype.inc = function () {\n\t\tif (this.timer) {\n\t\t\tclearTimeout(this.timeout);\n\t\t\tthis.timeout = setTimeout(TimedNumber.prototype.reset.bind(this), this.timer);\n\t\t}\n\t\tthis.num++;\n\t};\n\tTimedNumber.prototype.reset = function () {\n\t\tif (this.timer) {\n\t\t\tclearTimeout(this.timeout);\n\t\t}\n\t\tthis.num = 0;\n\t};\n\n\tfunction keyHandler( handleObj ) {\n\t\t// Only care when a possible input has been specified\n\t\tif ( !(jQuery.isPlainObject(handleObj.data) || Array.isArray(handleObj.data) || typeof handleObj.data === \"string\") ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar origHandler = handleObj.handler,\n\t\t\toptions = {\n\t\t\t\ttimer: 700,\n\t\t\t\tcombo: []\n\t\t\t};\n\n\t\t(function (data) {\n\t\t\tif (typeof data === 'string') {\n\t\t\t\toptions.combo = [ data ];\n\t\t\t} else if (Array.isArray(data)) {\n\t\t\t\toptions.combo = data;\n\t\t\t} else {\n\t\t\t\tjQuery.extend(options, data);\n\t\t\t}\n\t\t\toptions.combo = jQuery.map(options.combo, function (key) {\n\t\t\t\treturn key.toLowerCase();\n\t\t\t});\n\t\t})(handleObj.data);\n\n\t\thandleObj.index = new TimedNumber(options.timer);\n\t\thandleObj.handler = function( event ) {\n\t\t\t// Don't fire in text-accepting inputs that we didn't directly bind to\n\t\t\t// important to note that jQuery.fn.prop is only available on jquery 1.6+\n\t\t\tif ( this !== event.target && (/textarea|select|input/i.test( event.target.nodeName ) ||\n\t\t\t\tjQuery(event.target).prop('contenteditable') === 'true' )) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Keypress represents characters, not special keys\n\t\t\tvar special = event.type !== 'keypress' ? jQuery.hotkeys.specialKeys[ event.which ] : null,\n\t\t\t\tcharacter = String.fromCharCode( event.which ).toLowerCase(),\n\t\t\t\tkey, modif = \"\", possible = {};\n\n\t\t\t// check combinations (alt|ctrl|shift+anything)\n\t\t\tif ( event.altKey && special !== \"alt\" ) {\n\t\t\t\tmodif += \"alt+\";\n\t\t\t}\n\n\t\t\tif ( event.ctrlKey && special !== \"ctrl\" ) {\n\t\t\t\tmodif += \"ctrl+\";\n\t\t\t}\n\n\t\t\t// TODO: Need to make sure this works consistently across platforms\n\t\t\tif ( event.metaKey && !event.ctrlKey && special !== \"meta\" ) {\n\t\t\t\tmodif += \"meta+\";\n\t\t\t}\n\n\t\t\tif ( event.shiftKey && special !== \"shift\" ) {\n\t\t\t\tmodif += \"shift+\";\n\t\t\t}\n\n\t\t\t// Under Chrome and Safari, meta's keycode == '['s charcode\n\t\t\t// Even if they did type this key combo we could not use it because it is browser back in Chrome/Safari on OS X\n\t\t\tif (event.metaKey && character === '[') {\n\t\t\t\tcharacter = null;\n\t\t\t}\n\n\t\t\tif ( special ) {\n\t\t\t\tpossible[ modif + special ] = true;\n\t\t\t}\n\t\t\tif ( character ) {\n\t\t\t\tpossible[ modif + character ] = true;\n\t\t\t}\n\n\t\t\t// \"$\" can be specified as \"shift+4\" or \"$\"\n\t\t\tif ( /shift+/.test(modif) ) {\n\t\t\t\tpossible [ modif.replace('shift+', '') + jQuery.hotkeys.shiftNums[ (special || character) ] ] = true;\n\t\t\t}\n\n\t\t\tvar index = handleObj.index,\n\t\t\t\tcombo = options.combo;\n\n\t\t\tif ( pressed(combo[index.val()], possible) ) {\n\t\t\t\tif ( index.val() === combo.length - 1 ) {\n\t\t\t\t\tindex.reset();\n\t\t\t\t\treturn origHandler.apply(this, arguments);\n\t\t\t\t} else {\n\t\t\t\t\tindex.inc();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tindex.reset();\n\t\t\t\t// For mutli-key combinations, we might have restarted the key sequence.\n\t\t\t\tif ( pressed(combo[0], possible) ) {\n\t\t\t\t\tindex.inc();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\tfunction pressed(key, possible) {\n\t\tvar keys = key.split(' ');\n\t\tfor (var i = 0, len = keys.length; i < len; i++) {\n\t\t\tif ( possible[keys[i]] ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tjQuery.each([ \"keydown\", \"keyup\", \"keypress\" ], function() {\n\t\tjQuery.event.special[ this ] = { add: keyHandler };\n\t});\n\n})( jQuery );\n","/*\nCopyright 2012 Igor Vaynberg\n\nVersion: 3.5.4 Timestamp: Sun Aug 30 13:30:32 EDT 2015\n\nThis software is licensed under the Apache License, Version 2.0 (the \"Apache License\") or the GNU\nGeneral Public License version 2 (the \"GPL License\"). You may choose either license to govern your\nuse of this software only upon the condition that you accept all of the terms of either the Apache\nLicense or the GPL License.\n\nYou may obtain a copy of the Apache License and the GPL License at:\n\n    http://www.apache.org/licenses/LICENSE-2.0\n    http://www.gnu.org/licenses/gpl-2.0.html\n\nUnless required by applicable law or agreed to in writing, software distributed under the\nApache License or the GPL License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\nCONDITIONS OF ANY KIND, either express or implied. See the Apache License and the GPL License for\nthe specific language governing permissions and limitations under the Apache License and the GPL License.\n*/\n(function ($) {\n    if(typeof $.fn.each2 == \"undefined\") {\n        $.extend($.fn, {\n            /*\n            * 4-10 times faster .each replacement\n            * use it carefully, as it overrides jQuery context of element on each iteration\n            */\n            each2 : function (c) {\n                var j = $([0]), i = -1, l = this.length;\n                while (\n                    ++i < l\n                    && (j.context = j[0] = this[i])\n                    && c.call(j[0], i, j) !== false //\"this\"=DOM, i=index, j=jQuery object\n                );\n                return this;\n            }\n        });\n    }\n})(jQuery);\n\n(function ($, undefined) {\n    \"use strict\";\n    /*global document, window, jQuery, console */\n\n    if (window.Select2 !== undefined) {\n        return;\n    }\n\n    var AbstractSelect2, SingleSelect2, MultiSelect2, nextUid, sizer,\n        lastMousePosition={x:0,y:0}, $document, scrollBarDimensions,\n\n    KEY = {\n        TAB: 9,\n        ENTER: 13,\n        ESC: 27,\n        SPACE: 32,\n        LEFT: 37,\n        UP: 38,\n        RIGHT: 39,\n        DOWN: 40,\n        SHIFT: 16,\n        CTRL: 17,\n        ALT: 18,\n        PAGE_UP: 33,\n        PAGE_DOWN: 34,\n        HOME: 36,\n        END: 35,\n        BACKSPACE: 8,\n        DELETE: 46,\n        isArrow: function (k) {\n            k = k.which ? k.which : k;\n            switch (k) {\n            case KEY.LEFT:\n            case KEY.RIGHT:\n            case KEY.UP:\n            case KEY.DOWN:\n                return true;\n            }\n            return false;\n        },\n        isControl: function (e) {\n            var k = e.which;\n            switch (k) {\n            case KEY.SHIFT:\n            case KEY.CTRL:\n            case KEY.ALT:\n                return true;\n            }\n\n            if (e.metaKey) return true;\n\n            return false;\n        },\n        isFunctionKey: function (k) {\n            k = k.which ? k.which : k;\n            return k >= 112 && k <= 123;\n        }\n    },\n    MEASURE_SCROLLBAR_TEMPLATE = \"<div class='select2-measure-scrollbar'></div>\",\n\n    DIACRITICS = {\"\\u24B6\":\"A\",\"\\uFF21\":\"A\",\"\\u00C0\":\"A\",\"\\u00C1\":\"A\",\"\\u00C2\":\"A\",\"\\u1EA6\":\"A\",\"\\u1EA4\":\"A\",\"\\u1EAA\":\"A\",\"\\u1EA8\":\"A\",\"\\u00C3\":\"A\",\"\\u0100\":\"A\",\"\\u0102\":\"A\",\"\\u1EB0\":\"A\",\"\\u1EAE\":\"A\",\"\\u1EB4\":\"A\",\"\\u1EB2\":\"A\",\"\\u0226\":\"A\",\"\\u01E0\":\"A\",\"\\u00C4\":\"A\",\"\\u01DE\":\"A\",\"\\u1EA2\":\"A\",\"\\u00C5\":\"A\",\"\\u01FA\":\"A\",\"\\u01CD\":\"A\",\"\\u0200\":\"A\",\"\\u0202\":\"A\",\"\\u1EA0\":\"A\",\"\\u1EAC\":\"A\",\"\\u1EB6\":\"A\",\"\\u1E00\":\"A\",\"\\u0104\":\"A\",\"\\u023A\":\"A\",\"\\u2C6F\":\"A\",\"\\uA732\":\"AA\",\"\\u00C6\":\"AE\",\"\\u01FC\":\"AE\",\"\\u01E2\":\"AE\",\"\\uA734\":\"AO\",\"\\uA736\":\"AU\",\"\\uA738\":\"AV\",\"\\uA73A\":\"AV\",\"\\uA73C\":\"AY\",\"\\u24B7\":\"B\",\"\\uFF22\":\"B\",\"\\u1E02\":\"B\",\"\\u1E04\":\"B\",\"\\u1E06\":\"B\",\"\\u0243\":\"B\",\"\\u0182\":\"B\",\"\\u0181\":\"B\",\"\\u24B8\":\"C\",\"\\uFF23\":\"C\",\"\\u0106\":\"C\",\"\\u0108\":\"C\",\"\\u010A\":\"C\",\"\\u010C\":\"C\",\"\\u00C7\":\"C\",\"\\u1E08\":\"C\",\"\\u0187\":\"C\",\"\\u023B\":\"C\",\"\\uA73E\":\"C\",\"\\u24B9\":\"D\",\"\\uFF24\":\"D\",\"\\u1E0A\":\"D\",\"\\u010E\":\"D\",\"\\u1E0C\":\"D\",\"\\u1E10\":\"D\",\"\\u1E12\":\"D\",\"\\u1E0E\":\"D\",\"\\u0110\":\"D\",\"\\u018B\":\"D\",\"\\u018A\":\"D\",\"\\u0189\":\"D\",\"\\uA779\":\"D\",\"\\u01F1\":\"DZ\",\"\\u01C4\":\"DZ\",\"\\u01F2\":\"Dz\",\"\\u01C5\":\"Dz\",\"\\u24BA\":\"E\",\"\\uFF25\":\"E\",\"\\u00C8\":\"E\",\"\\u00C9\":\"E\",\"\\u00CA\":\"E\",\"\\u1EC0\":\"E\",\"\\u1EBE\":\"E\",\"\\u1EC4\":\"E\",\"\\u1EC2\":\"E\",\"\\u1EBC\":\"E\",\"\\u0112\":\"E\",\"\\u1E14\":\"E\",\"\\u1E16\":\"E\",\"\\u0114\":\"E\",\"\\u0116\":\"E\",\"\\u00CB\":\"E\",\"\\u1EBA\":\"E\",\"\\u011A\":\"E\",\"\\u0204\":\"E\",\"\\u0206\":\"E\",\"\\u1EB8\":\"E\",\"\\u1EC6\":\"E\",\"\\u0228\":\"E\",\"\\u1E1C\":\"E\",\"\\u0118\":\"E\",\"\\u1E18\":\"E\",\"\\u1E1A\":\"E\",\"\\u0190\":\"E\",\"\\u018E\":\"E\",\"\\u24BB\":\"F\",\"\\uFF26\":\"F\",\"\\u1E1E\":\"F\",\"\\u0191\":\"F\",\"\\uA77B\":\"F\",\"\\u24BC\":\"G\",\"\\uFF27\":\"G\",\"\\u01F4\":\"G\",\"\\u011C\":\"G\",\"\\u1E20\":\"G\",\"\\u011E\":\"G\",\"\\u0120\":\"G\",\"\\u01E6\":\"G\",\"\\u0122\":\"G\",\"\\u01E4\":\"G\",\"\\u0193\":\"G\",\"\\uA7A0\":\"G\",\"\\uA77D\":\"G\",\"\\uA77E\":\"G\",\"\\u24BD\":\"H\",\"\\uFF28\":\"H\",\"\\u0124\":\"H\",\"\\u1E22\":\"H\",\"\\u1E26\":\"H\",\"\\u021E\":\"H\",\"\\u1E24\":\"H\",\"\\u1E28\":\"H\",\"\\u1E2A\":\"H\",\"\\u0126\":\"H\",\"\\u2C67\":\"H\",\"\\u2C75\":\"H\",\"\\uA78D\":\"H\",\"\\u24BE\":\"I\",\"\\uFF29\":\"I\",\"\\u00CC\":\"I\",\"\\u00CD\":\"I\",\"\\u00CE\":\"I\",\"\\u0128\":\"I\",\"\\u012A\":\"I\",\"\\u012C\":\"I\",\"\\u0130\":\"I\",\"\\u00CF\":\"I\",\"\\u1E2E\":\"I\",\"\\u1EC8\":\"I\",\"\\u01CF\":\"I\",\"\\u0208\":\"I\",\"\\u020A\":\"I\",\"\\u1ECA\":\"I\",\"\\u012E\":\"I\",\"\\u1E2C\":\"I\",\"\\u0197\":\"I\",\"\\u24BF\":\"J\",\"\\uFF2A\":\"J\",\"\\u0134\":\"J\",\"\\u0248\":\"J\",\"\\u24C0\":\"K\",\"\\uFF2B\":\"K\",\"\\u1E30\":\"K\",\"\\u01E8\":\"K\",\"\\u1E32\":\"K\",\"\\u0136\":\"K\",\"\\u1E34\":\"K\",\"\\u0198\":\"K\",\"\\u2C69\":\"K\",\"\\uA740\":\"K\",\"\\uA742\":\"K\",\"\\uA744\":\"K\",\"\\uA7A2\":\"K\",\"\\u24C1\":\"L\",\"\\uFF2C\":\"L\",\"\\u013F\":\"L\",\"\\u0139\":\"L\",\"\\u013D\":\"L\",\"\\u1E36\":\"L\",\"\\u1E38\":\"L\",\"\\u013B\":\"L\",\"\\u1E3C\":\"L\",\"\\u1E3A\":\"L\",\"\\u0141\":\"L\",\"\\u023D\":\"L\",\"\\u2C62\":\"L\",\"\\u2C60\":\"L\",\"\\uA748\":\"L\",\"\\uA746\":\"L\",\"\\uA780\":\"L\",\"\\u01C7\":\"LJ\",\"\\u01C8\":\"Lj\",\"\\u24C2\":\"M\",\"\\uFF2D\":\"M\",\"\\u1E3E\":\"M\",\"\\u1E40\":\"M\",\"\\u1E42\":\"M\",\"\\u2C6E\":\"M\",\"\\u019C\":\"M\",\"\\u24C3\":\"N\",\"\\uFF2E\":\"N\",\"\\u01F8\":\"N\",\"\\u0143\":\"N\",\"\\u00D1\":\"N\",\"\\u1E44\":\"N\",\"\\u0147\":\"N\",\"\\u1E46\":\"N\",\"\\u0145\":\"N\",\"\\u1E4A\":\"N\",\"\\u1E48\":\"N\",\"\\u0220\":\"N\",\"\\u019D\":\"N\",\"\\uA790\":\"N\",\"\\uA7A4\":\"N\",\"\\u01CA\":\"NJ\",\"\\u01CB\":\"Nj\",\"\\u24C4\":\"O\",\"\\uFF2F\":\"O\",\"\\u00D2\":\"O\",\"\\u00D3\":\"O\",\"\\u00D4\":\"O\",\"\\u1ED2\":\"O\",\"\\u1ED0\":\"O\",\"\\u1ED6\":\"O\",\"\\u1ED4\":\"O\",\"\\u00D5\":\"O\",\"\\u1E4C\":\"O\",\"\\u022C\":\"O\",\"\\u1E4E\":\"O\",\"\\u014C\":\"O\",\"\\u1E50\":\"O\",\"\\u1E52\":\"O\",\"\\u014E\":\"O\",\"\\u022E\":\"O\",\"\\u0230\":\"O\",\"\\u00D6\":\"O\",\"\\u022A\":\"O\",\"\\u1ECE\":\"O\",\"\\u0150\":\"O\",\"\\u01D1\":\"O\",\"\\u020C\":\"O\",\"\\u020E\":\"O\",\"\\u01A0\":\"O\",\"\\u1EDC\":\"O\",\"\\u1EDA\":\"O\",\"\\u1EE0\":\"O\",\"\\u1EDE\":\"O\",\"\\u1EE2\":\"O\",\"\\u1ECC\":\"O\",\"\\u1ED8\":\"O\",\"\\u01EA\":\"O\",\"\\u01EC\":\"O\",\"\\u00D8\":\"O\",\"\\u01FE\":\"O\",\"\\u0186\":\"O\",\"\\u019F\":\"O\",\"\\uA74A\":\"O\",\"\\uA74C\":\"O\",\"\\u01A2\":\"OI\",\"\\uA74E\":\"OO\",\"\\u0222\":\"OU\",\"\\u24C5\":\"P\",\"\\uFF30\":\"P\",\"\\u1E54\":\"P\",\"\\u1E56\":\"P\",\"\\u01A4\":\"P\",\"\\u2C63\":\"P\",\"\\uA750\":\"P\",\"\\uA752\":\"P\",\"\\uA754\":\"P\",\"\\u24C6\":\"Q\",\"\\uFF31\":\"Q\",\"\\uA756\":\"Q\",\"\\uA758\":\"Q\",\"\\u024A\":\"Q\",\"\\u24C7\":\"R\",\"\\uFF32\":\"R\",\"\\u0154\":\"R\",\"\\u1E58\":\"R\",\"\\u0158\":\"R\",\"\\u0210\":\"R\",\"\\u0212\":\"R\",\"\\u1E5A\":\"R\",\"\\u1E5C\":\"R\",\"\\u0156\":\"R\",\"\\u1E5E\":\"R\",\"\\u024C\":\"R\",\"\\u2C64\":\"R\",\"\\uA75A\":\"R\",\"\\uA7A6\":\"R\",\"\\uA782\":\"R\",\"\\u24C8\":\"S\",\"\\uFF33\":\"S\",\"\\u1E9E\":\"S\",\"\\u015A\":\"S\",\"\\u1E64\":\"S\",\"\\u015C\":\"S\",\"\\u1E60\":\"S\",\"\\u0160\":\"S\",\"\\u1E66\":\"S\",\"\\u1E62\":\"S\",\"\\u1E68\":\"S\",\"\\u0218\":\"S\",\"\\u015E\":\"S\",\"\\u2C7E\":\"S\",\"\\uA7A8\":\"S\",\"\\uA784\":\"S\",\"\\u24C9\":\"T\",\"\\uFF34\":\"T\",\"\\u1E6A\":\"T\",\"\\u0164\":\"T\",\"\\u1E6C\":\"T\",\"\\u021A\":\"T\",\"\\u0162\":\"T\",\"\\u1E70\":\"T\",\"\\u1E6E\":\"T\",\"\\u0166\":\"T\",\"\\u01AC\":\"T\",\"\\u01AE\":\"T\",\"\\u023E\":\"T\",\"\\uA786\":\"T\",\"\\uA728\":\"TZ\",\"\\u24CA\":\"U\",\"\\uFF35\":\"U\",\"\\u00D9\":\"U\",\"\\u00DA\":\"U\",\"\\u00DB\":\"U\",\"\\u0168\":\"U\",\"\\u1E78\":\"U\",\"\\u016A\":\"U\",\"\\u1E7A\":\"U\",\"\\u016C\":\"U\",\"\\u00DC\":\"U\",\"\\u01DB\":\"U\",\"\\u01D7\":\"U\",\"\\u01D5\":\"U\",\"\\u01D9\":\"U\",\"\\u1EE6\":\"U\",\"\\u016E\":\"U\",\"\\u0170\":\"U\",\"\\u01D3\":\"U\",\"\\u0214\":\"U\",\"\\u0216\":\"U\",\"\\u01AF\":\"U\",\"\\u1EEA\":\"U\",\"\\u1EE8\":\"U\",\"\\u1EEE\":\"U\",\"\\u1EEC\":\"U\",\"\\u1EF0\":\"U\",\"\\u1EE4\":\"U\",\"\\u1E72\":\"U\",\"\\u0172\":\"U\",\"\\u1E76\":\"U\",\"\\u1E74\":\"U\",\"\\u0244\":\"U\",\"\\u24CB\":\"V\",\"\\uFF36\":\"V\",\"\\u1E7C\":\"V\",\"\\u1E7E\":\"V\",\"\\u01B2\":\"V\",\"\\uA75E\":\"V\",\"\\u0245\":\"V\",\"\\uA760\":\"VY\",\"\\u24CC\":\"W\",\"\\uFF37\":\"W\",\"\\u1E80\":\"W\",\"\\u1E82\":\"W\",\"\\u0174\":\"W\",\"\\u1E86\":\"W\",\"\\u1E84\":\"W\",\"\\u1E88\":\"W\",\"\\u2C72\":\"W\",\"\\u24CD\":\"X\",\"\\uFF38\":\"X\",\"\\u1E8A\":\"X\",\"\\u1E8C\":\"X\",\"\\u24CE\":\"Y\",\"\\uFF39\":\"Y\",\"\\u1EF2\":\"Y\",\"\\u00DD\":\"Y\",\"\\u0176\":\"Y\",\"\\u1EF8\":\"Y\",\"\\u0232\":\"Y\",\"\\u1E8E\":\"Y\",\"\\u0178\":\"Y\",\"\\u1EF6\":\"Y\",\"\\u1EF4\":\"Y\",\"\\u01B3\":\"Y\",\"\\u024E\":\"Y\",\"\\u1EFE\":\"Y\",\"\\u24CF\":\"Z\",\"\\uFF3A\":\"Z\",\"\\u0179\":\"Z\",\"\\u1E90\":\"Z\",\"\\u017B\":\"Z\",\"\\u017D\":\"Z\",\"\\u1E92\":\"Z\",\"\\u1E94\":\"Z\",\"\\u01B5\":\"Z\",\"\\u0224\":\"Z\",\"\\u2C7F\":\"Z\",\"\\u2C6B\":\"Z\",\"\\uA762\":\"Z\",\"\\u24D0\":\"a\",\"\\uFF41\":\"a\",\"\\u1E9A\":\"a\",\"\\u00E0\":\"a\",\"\\u00E1\":\"a\",\"\\u00E2\":\"a\",\"\\u1EA7\":\"a\",\"\\u1EA5\":\"a\",\"\\u1EAB\":\"a\",\"\\u1EA9\":\"a\",\"\\u00E3\":\"a\",\"\\u0101\":\"a\",\"\\u0103\":\"a\",\"\\u1EB1\":\"a\",\"\\u1EAF\":\"a\",\"\\u1EB5\":\"a\",\"\\u1EB3\":\"a\",\"\\u0227\":\"a\",\"\\u01E1\":\"a\",\"\\u00E4\":\"a\",\"\\u01DF\":\"a\",\"\\u1EA3\":\"a\",\"\\u00E5\":\"a\",\"\\u01FB\":\"a\",\"\\u01CE\":\"a\",\"\\u0201\":\"a\",\"\\u0203\":\"a\",\"\\u1EA1\":\"a\",\"\\u1EAD\":\"a\",\"\\u1EB7\":\"a\",\"\\u1E01\":\"a\",\"\\u0105\":\"a\",\"\\u2C65\":\"a\",\"\\u0250\":\"a\",\"\\uA733\":\"aa\",\"\\u00E6\":\"ae\",\"\\u01FD\":\"ae\",\"\\u01E3\":\"ae\",\"\\uA735\":\"ao\",\"\\uA737\":\"au\",\"\\uA739\":\"av\",\"\\uA73B\":\"av\",\"\\uA73D\":\"ay\",\"\\u24D1\":\"b\",\"\\uFF42\":\"b\",\"\\u1E03\":\"b\",\"\\u1E05\":\"b\",\"\\u1E07\":\"b\",\"\\u0180\":\"b\",\"\\u0183\":\"b\",\"\\u0253\":\"b\",\"\\u24D2\":\"c\",\"\\uFF43\":\"c\",\"\\u0107\":\"c\",\"\\u0109\":\"c\",\"\\u010B\":\"c\",\"\\u010D\":\"c\",\"\\u00E7\":\"c\",\"\\u1E09\":\"c\",\"\\u0188\":\"c\",\"\\u023C\":\"c\",\"\\uA73F\":\"c\",\"\\u2184\":\"c\",\"\\u24D3\":\"d\",\"\\uFF44\":\"d\",\"\\u1E0B\":\"d\",\"\\u010F\":\"d\",\"\\u1E0D\":\"d\",\"\\u1E11\":\"d\",\"\\u1E13\":\"d\",\"\\u1E0F\":\"d\",\"\\u0111\":\"d\",\"\\u018C\":\"d\",\"\\u0256\":\"d\",\"\\u0257\":\"d\",\"\\uA77A\":\"d\",\"\\u01F3\":\"dz\",\"\\u01C6\":\"dz\",\"\\u24D4\":\"e\",\"\\uFF45\":\"e\",\"\\u00E8\":\"e\",\"\\u00E9\":\"e\",\"\\u00EA\":\"e\",\"\\u1EC1\":\"e\",\"\\u1EBF\":\"e\",\"\\u1EC5\":\"e\",\"\\u1EC3\":\"e\",\"\\u1EBD\":\"e\",\"\\u0113\":\"e\",\"\\u1E15\":\"e\",\"\\u1E17\":\"e\",\"\\u0115\":\"e\",\"\\u0117\":\"e\",\"\\u00EB\":\"e\",\"\\u1EBB\":\"e\",\"\\u011B\":\"e\",\"\\u0205\":\"e\",\"\\u0207\":\"e\",\"\\u1EB9\":\"e\",\"\\u1EC7\":\"e\",\"\\u0229\":\"e\",\"\\u1E1D\":\"e\",\"\\u0119\":\"e\",\"\\u1E19\":\"e\",\"\\u1E1B\":\"e\",\"\\u0247\":\"e\",\"\\u025B\":\"e\",\"\\u01DD\":\"e\",\"\\u24D5\":\"f\",\"\\uFF46\":\"f\",\"\\u1E1F\":\"f\",\"\\u0192\":\"f\",\"\\uA77C\":\"f\",\"\\u24D6\":\"g\",\"\\uFF47\":\"g\",\"\\u01F5\":\"g\",\"\\u011D\":\"g\",\"\\u1E21\":\"g\",\"\\u011F\":\"g\",\"\\u0121\":\"g\",\"\\u01E7\":\"g\",\"\\u0123\":\"g\",\"\\u01E5\":\"g\",\"\\u0260\":\"g\",\"\\uA7A1\":\"g\",\"\\u1D79\":\"g\",\"\\uA77F\":\"g\",\"\\u24D7\":\"h\",\"\\uFF48\":\"h\",\"\\u0125\":\"h\",\"\\u1E23\":\"h\",\"\\u1E27\":\"h\",\"\\u021F\":\"h\",\"\\u1E25\":\"h\",\"\\u1E29\":\"h\",\"\\u1E2B\":\"h\",\"\\u1E96\":\"h\",\"\\u0127\":\"h\",\"\\u2C68\":\"h\",\"\\u2C76\":\"h\",\"\\u0265\":\"h\",\"\\u0195\":\"hv\",\"\\u24D8\":\"i\",\"\\uFF49\":\"i\",\"\\u00EC\":\"i\",\"\\u00ED\":\"i\",\"\\u00EE\":\"i\",\"\\u0129\":\"i\",\"\\u012B\":\"i\",\"\\u012D\":\"i\",\"\\u00EF\":\"i\",\"\\u1E2F\":\"i\",\"\\u1EC9\":\"i\",\"\\u01D0\":\"i\",\"\\u0209\":\"i\",\"\\u020B\":\"i\",\"\\u1ECB\":\"i\",\"\\u012F\":\"i\",\"\\u1E2D\":\"i\",\"\\u0268\":\"i\",\"\\u0131\":\"i\",\"\\u24D9\":\"j\",\"\\uFF4A\":\"j\",\"\\u0135\":\"j\",\"\\u01F0\":\"j\",\"\\u0249\":\"j\",\"\\u24DA\":\"k\",\"\\uFF4B\":\"k\",\"\\u1E31\":\"k\",\"\\u01E9\":\"k\",\"\\u1E33\":\"k\",\"\\u0137\":\"k\",\"\\u1E35\":\"k\",\"\\u0199\":\"k\",\"\\u2C6A\":\"k\",\"\\uA741\":\"k\",\"\\uA743\":\"k\",\"\\uA745\":\"k\",\"\\uA7A3\":\"k\",\"\\u24DB\":\"l\",\"\\uFF4C\":\"l\",\"\\u0140\":\"l\",\"\\u013A\":\"l\",\"\\u013E\":\"l\",\"\\u1E37\":\"l\",\"\\u1E39\":\"l\",\"\\u013C\":\"l\",\"\\u1E3D\":\"l\",\"\\u1E3B\":\"l\",\"\\u017F\":\"l\",\"\\u0142\":\"l\",\"\\u019A\":\"l\",\"\\u026B\":\"l\",\"\\u2C61\":\"l\",\"\\uA749\":\"l\",\"\\uA781\":\"l\",\"\\uA747\":\"l\",\"\\u01C9\":\"lj\",\"\\u24DC\":\"m\",\"\\uFF4D\":\"m\",\"\\u1E3F\":\"m\",\"\\u1E41\":\"m\",\"\\u1E43\":\"m\",\"\\u0271\":\"m\",\"\\u026F\":\"m\",\"\\u24DD\":\"n\",\"\\uFF4E\":\"n\",\"\\u01F9\":\"n\",\"\\u0144\":\"n\",\"\\u00F1\":\"n\",\"\\u1E45\":\"n\",\"\\u0148\":\"n\",\"\\u1E47\":\"n\",\"\\u0146\":\"n\",\"\\u1E4B\":\"n\",\"\\u1E49\":\"n\",\"\\u019E\":\"n\",\"\\u0272\":\"n\",\"\\u0149\":\"n\",\"\\uA791\":\"n\",\"\\uA7A5\":\"n\",\"\\u01CC\":\"nj\",\"\\u24DE\":\"o\",\"\\uFF4F\":\"o\",\"\\u00F2\":\"o\",\"\\u00F3\":\"o\",\"\\u00F4\":\"o\",\"\\u1ED3\":\"o\",\"\\u1ED1\":\"o\",\"\\u1ED7\":\"o\",\"\\u1ED5\":\"o\",\"\\u00F5\":\"o\",\"\\u1E4D\":\"o\",\"\\u022D\":\"o\",\"\\u1E4F\":\"o\",\"\\u014D\":\"o\",\"\\u1E51\":\"o\",\"\\u1E53\":\"o\",\"\\u014F\":\"o\",\"\\u022F\":\"o\",\"\\u0231\":\"o\",\"\\u00F6\":\"o\",\"\\u022B\":\"o\",\"\\u1ECF\":\"o\",\"\\u0151\":\"o\",\"\\u01D2\":\"o\",\"\\u020D\":\"o\",\"\\u020F\":\"o\",\"\\u01A1\":\"o\",\"\\u1EDD\":\"o\",\"\\u1EDB\":\"o\",\"\\u1EE1\":\"o\",\"\\u1EDF\":\"o\",\"\\u1EE3\":\"o\",\"\\u1ECD\":\"o\",\"\\u1ED9\":\"o\",\"\\u01EB\":\"o\",\"\\u01ED\":\"o\",\"\\u00F8\":\"o\",\"\\u01FF\":\"o\",\"\\u0254\":\"o\",\"\\uA74B\":\"o\",\"\\uA74D\":\"o\",\"\\u0275\":\"o\",\"\\u01A3\":\"oi\",\"\\u0223\":\"ou\",\"\\uA74F\":\"oo\",\"\\u24DF\":\"p\",\"\\uFF50\":\"p\",\"\\u1E55\":\"p\",\"\\u1E57\":\"p\",\"\\u01A5\":\"p\",\"\\u1D7D\":\"p\",\"\\uA751\":\"p\",\"\\uA753\":\"p\",\"\\uA755\":\"p\",\"\\u24E0\":\"q\",\"\\uFF51\":\"q\",\"\\u024B\":\"q\",\"\\uA757\":\"q\",\"\\uA759\":\"q\",\"\\u24E1\":\"r\",\"\\uFF52\":\"r\",\"\\u0155\":\"r\",\"\\u1E59\":\"r\",\"\\u0159\":\"r\",\"\\u0211\":\"r\",\"\\u0213\":\"r\",\"\\u1E5B\":\"r\",\"\\u1E5D\":\"r\",\"\\u0157\":\"r\",\"\\u1E5F\":\"r\",\"\\u024D\":\"r\",\"\\u027D\":\"r\",\"\\uA75B\":\"r\",\"\\uA7A7\":\"r\",\"\\uA783\":\"r\",\"\\u24E2\":\"s\",\"\\uFF53\":\"s\",\"\\u00DF\":\"s\",\"\\u015B\":\"s\",\"\\u1E65\":\"s\",\"\\u015D\":\"s\",\"\\u1E61\":\"s\",\"\\u0161\":\"s\",\"\\u1E67\":\"s\",\"\\u1E63\":\"s\",\"\\u1E69\":\"s\",\"\\u0219\":\"s\",\"\\u015F\":\"s\",\"\\u023F\":\"s\",\"\\uA7A9\":\"s\",\"\\uA785\":\"s\",\"\\u1E9B\":\"s\",\"\\u24E3\":\"t\",\"\\uFF54\":\"t\",\"\\u1E6B\":\"t\",\"\\u1E97\":\"t\",\"\\u0165\":\"t\",\"\\u1E6D\":\"t\",\"\\u021B\":\"t\",\"\\u0163\":\"t\",\"\\u1E71\":\"t\",\"\\u1E6F\":\"t\",\"\\u0167\":\"t\",\"\\u01AD\":\"t\",\"\\u0288\":\"t\",\"\\u2C66\":\"t\",\"\\uA787\":\"t\",\"\\uA729\":\"tz\",\"\\u24E4\":\"u\",\"\\uFF55\":\"u\",\"\\u00F9\":\"u\",\"\\u00FA\":\"u\",\"\\u00FB\":\"u\",\"\\u0169\":\"u\",\"\\u1E79\":\"u\",\"\\u016B\":\"u\",\"\\u1E7B\":\"u\",\"\\u016D\":\"u\",\"\\u00FC\":\"u\",\"\\u01DC\":\"u\",\"\\u01D8\":\"u\",\"\\u01D6\":\"u\",\"\\u01DA\":\"u\",\"\\u1EE7\":\"u\",\"\\u016F\":\"u\",\"\\u0171\":\"u\",\"\\u01D4\":\"u\",\"\\u0215\":\"u\",\"\\u0217\":\"u\",\"\\u01B0\":\"u\",\"\\u1EEB\":\"u\",\"\\u1EE9\":\"u\",\"\\u1EEF\":\"u\",\"\\u1EED\":\"u\",\"\\u1EF1\":\"u\",\"\\u1EE5\":\"u\",\"\\u1E73\":\"u\",\"\\u0173\":\"u\",\"\\u1E77\":\"u\",\"\\u1E75\":\"u\",\"\\u0289\":\"u\",\"\\u24E5\":\"v\",\"\\uFF56\":\"v\",\"\\u1E7D\":\"v\",\"\\u1E7F\":\"v\",\"\\u028B\":\"v\",\"\\uA75F\":\"v\",\"\\u028C\":\"v\",\"\\uA761\":\"vy\",\"\\u24E6\":\"w\",\"\\uFF57\":\"w\",\"\\u1E81\":\"w\",\"\\u1E83\":\"w\",\"\\u0175\":\"w\",\"\\u1E87\":\"w\",\"\\u1E85\":\"w\",\"\\u1E98\":\"w\",\"\\u1E89\":\"w\",\"\\u2C73\":\"w\",\"\\u24E7\":\"x\",\"\\uFF58\":\"x\",\"\\u1E8B\":\"x\",\"\\u1E8D\":\"x\",\"\\u24E8\":\"y\",\"\\uFF59\":\"y\",\"\\u1EF3\":\"y\",\"\\u00FD\":\"y\",\"\\u0177\":\"y\",\"\\u1EF9\":\"y\",\"\\u0233\":\"y\",\"\\u1E8F\":\"y\",\"\\u00FF\":\"y\",\"\\u1EF7\":\"y\",\"\\u1E99\":\"y\",\"\\u1EF5\":\"y\",\"\\u01B4\":\"y\",\"\\u024F\":\"y\",\"\\u1EFF\":\"y\",\"\\u24E9\":\"z\",\"\\uFF5A\":\"z\",\"\\u017A\":\"z\",\"\\u1E91\":\"z\",\"\\u017C\":\"z\",\"\\u017E\":\"z\",\"\\u1E93\":\"z\",\"\\u1E95\":\"z\",\"\\u01B6\":\"z\",\"\\u0225\":\"z\",\"\\u0240\":\"z\",\"\\u2C6C\":\"z\",\"\\uA763\":\"z\",\"\\u0386\":\"\\u0391\",\"\\u0388\":\"\\u0395\",\"\\u0389\":\"\\u0397\",\"\\u038A\":\"\\u0399\",\"\\u03AA\":\"\\u0399\",\"\\u038C\":\"\\u039F\",\"\\u038E\":\"\\u03A5\",\"\\u03AB\":\"\\u03A5\",\"\\u038F\":\"\\u03A9\",\"\\u03AC\":\"\\u03B1\",\"\\u03AD\":\"\\u03B5\",\"\\u03AE\":\"\\u03B7\",\"\\u03AF\":\"\\u03B9\",\"\\u03CA\":\"\\u03B9\",\"\\u0390\":\"\\u03B9\",\"\\u03CC\":\"\\u03BF\",\"\\u03CD\":\"\\u03C5\",\"\\u03CB\":\"\\u03C5\",\"\\u03B0\":\"\\u03C5\",\"\\u03C9\":\"\\u03C9\",\"\\u03C2\":\"\\u03C3\"};\n\n    $document = $(document);\n\n    nextUid=(function() { var counter=1; return function() { return counter++; }; }());\n\n\n    function reinsertElement(element) {\n        var placeholder = $(document.createTextNode(''));\n\n        element.before(placeholder);\n        placeholder.before(element);\n        placeholder.remove();\n    }\n\n    function stripDiacritics(str) {\n        // Used 'uni range + named function' from http://jsperf.com/diacritics/18\n        function match(a) {\n            return DIACRITICS[a] || a;\n        }\n\n        return str.replace(/[^\\u0000-\\u007E]/g, match);\n    }\n\n    function indexOf(value, array) {\n        var i = 0, l = array.length;\n        for (; i < l; i = i + 1) {\n            if (equal(value, array[i])) return i;\n        }\n        return -1;\n    }\n\n    function measureScrollbar () {\n        var $template = $( MEASURE_SCROLLBAR_TEMPLATE );\n        $template.appendTo(document.body);\n\n        var dim = {\n            width: $template.width() - $template[0].clientWidth,\n            height: $template.height() - $template[0].clientHeight\n        };\n        $template.remove();\n\n        return dim;\n    }\n\n    /**\n     * Compares equality of a and b\n     * @param a\n     * @param b\n     */\n    function equal(a, b) {\n        if (a === b) return true;\n        if (a === undefined || b === undefined) return false;\n        if (a === null || b === null) return false;\n        // Check whether 'a' or 'b' is a string (primitive or object).\n        // The concatenation of an empty string (+'') converts its argument to a string's primitive.\n        if (a.constructor === String) return a+'' === b+''; // a+'' - in case 'a' is a String object\n        if (b.constructor === String) return b+'' === a+''; // b+'' - in case 'b' is a String object\n        return false;\n    }\n\n    /**\n     * Splits the string into an array of values, transforming each value. An empty array is returned for nulls or empty\n     * strings\n     * @param string\n     * @param separator\n     */\n    function splitVal(string, separator, transform) {\n        var val, i, l;\n        if (string === null || string.length < 1) return [];\n        val = string.split(separator);\n        for (i = 0, l = val.length; i < l; i = i + 1) val[i] = transform(val[i]);\n        return val;\n    }\n\n    function getSideBorderPadding(element) {\n        return element.outerWidth(false) - element.width();\n    }\n\n    function installKeyUpChangeEvent(element) {\n        var key=\"keyup-change-value\";\n        element.on(\"keydown\", function () {\n            if ($.data(element, key) === undefined) {\n                $.data(element, key, element.val());\n            }\n        });\n        element.on(\"keyup\", function () {\n            var val= $.data(element, key);\n            if (val !== undefined && element.val() !== val) {\n                $.removeData(element, key);\n                element.trigger(\"keyup-change\");\n            }\n        });\n    }\n\n\n    /**\n     * filters mouse events so an event is fired only if the mouse moved.\n     *\n     * filters out mouse events that occur when mouse is stationary but\n     * the elements under the pointer are scrolled.\n     */\n    function installFilteredMouseMove(element) {\n        element.on(\"mousemove\", function (e) {\n            var lastpos = lastMousePosition;\n            if (lastpos === undefined || lastpos.x !== e.pageX || lastpos.y !== e.pageY) {\n                $(e.target).trigger(\"mousemove-filtered\", e);\n            }\n        });\n    }\n\n    /**\n     * Debounces a function. Returns a function that calls the original fn function only if no invocations have been made\n     * within the last quietMillis milliseconds.\n     *\n     * @param quietMillis number of milliseconds to wait before invoking fn\n     * @param fn function to be debounced\n     * @param ctx object to be used as this reference within fn\n     * @return debounced version of fn\n     */\n    function debounce(quietMillis, fn, ctx) {\n        ctx = ctx || undefined;\n        var timeout;\n        return function () {\n            var args = arguments;\n            window.clearTimeout(timeout);\n            timeout = window.setTimeout(function() {\n                fn.apply(ctx, args);\n            }, quietMillis);\n        };\n    }\n\n    function installDebouncedScroll(threshold, element) {\n        var notify = debounce(threshold, function (e) { element.trigger(\"scroll-debounced\", e);});\n        element.on(\"scroll\", function (e) {\n            if (indexOf(e.target, element.get()) >= 0) notify(e);\n        });\n    }\n\n    function focus($el) {\n        if ($el[0] === document.activeElement) return;\n\n        /* set the focus in a 0 timeout - that way the focus is set after the processing\n            of the current event has finished - which seems like the only reliable way\n            to set focus */\n        window.setTimeout(function() {\n            var el=$el[0], pos=$el.val().length, range;\n\n            $el.trigger(\"focus\");\n\n            /* make sure el received focus so we do not error out when trying to manipulate the caret.\n                sometimes modals or others listeners may steal it after its set */\n            var isVisible = (el.offsetWidth > 0 || el.offsetHeight > 0);\n            if (isVisible && el === document.activeElement) {\n\n                /* after the focus is set move the caret to the end, necessary when we val()\n                    just before setting focus */\n                if(el.setSelectionRange)\n                {\n                    el.setSelectionRange(pos, pos);\n                }\n                else if (el.createTextRange) {\n                    range = el.createTextRange();\n                    range.collapse(false);\n                    range.select();\n                }\n            }\n        }, 0);\n    }\n\n    function getCursorInfo(el) {\n        el = $(el)[0];\n        var offset = 0;\n        var length = 0;\n        if ('selectionStart' in el) {\n            offset = el.selectionStart;\n            length = el.selectionEnd - offset;\n        } else if ('selection' in document) {\n            el.focus();\n            var sel = document.selection.createRange();\n            length = document.selection.createRange().text.length;\n            sel.moveStart('character', -el.value.length);\n            offset = sel.text.length - length;\n        }\n        return { offset: offset, length: length };\n    }\n\n    function killEvent(event) {\n        event.preventDefault();\n        event.stopPropagation();\n    }\n    function killEventImmediately(event) {\n        event.preventDefault();\n        event.stopImmediatePropagation();\n    }\n\n    function measureTextWidth(e) {\n        if (!sizer){\n            var style = e[0].currentStyle || window.getComputedStyle(e[0], null);\n            sizer = $(document.createElement(\"div\")).css({\n                position: \"absolute\",\n                left: \"-10000px\",\n                top: \"-10000px\",\n                display: \"none\",\n                fontSize: style.fontSize,\n                fontFamily: style.fontFamily,\n                fontStyle: style.fontStyle,\n                fontWeight: style.fontWeight,\n                letterSpacing: style.letterSpacing,\n                textTransform: style.textTransform,\n                whiteSpace: \"nowrap\"\n            });\n            sizer.attr(\"class\",\"select2-sizer\");\n            $(document.body).append(sizer);\n        }\n        sizer.text(e.val());\n        return sizer.width();\n    }\n\n    function syncCssClasses(dest, src, adapter) {\n        var classes, replacements = [], adapted;\n\n        const destClassesAttr = dest.attr(\"class\");\n        classes = (destClassesAttr === undefined || destClassesAttr === null) ? \"\" : destClassesAttr.trim();\n\n        if (classes) {\n            classes = '' + classes; // for IE which returns object\n\n            $(classes.split(/\\s+/)).each2(function() {\n                if (this.indexOf(\"select2-\") === 0) {\n                    replacements.push(this);\n                }\n            });\n        }\n\n        const srcClassesAttr = src.attr(\"class\");\n        classes = (srcClassesAttr === undefined || srcClassesAttr === null) ? \"\" : srcClassesAttr.trim();\n\n        if (classes) {\n            classes = '' + classes; // for IE which returns object\n\n            $(classes.split(/\\s+/)).each2(function() {\n                if (this.indexOf(\"select2-\") !== 0) {\n                    adapted = adapter(this);\n\n                    if (adapted) {\n                        replacements.push(adapted);\n                    }\n                }\n            });\n        }\n\n        dest.attr(\"class\", replacements.join(\" \"));\n    }\n\n\n    function markMatch(text, term, markup, escapeMarkup) {\n        var match=stripDiacritics(text.toUpperCase()).indexOf(stripDiacritics(term.toUpperCase())),\n            tl=term.length;\n\n        if (match<0) {\n            markup.push(escapeMarkup(text));\n            return;\n        }\n\n        markup.push(escapeMarkup(text.substring(0, match)));\n        markup.push(\"<span class='select2-match'>\");\n        markup.push(escapeMarkup(text.substring(match, match + tl)));\n        markup.push(\"</span>\");\n        markup.push(escapeMarkup(text.substring(match + tl, text.length)));\n    }\n\n    function defaultEscapeMarkup(markup) {\n        var replace_map = {\n            '\\\\': '&#92;',\n            '&': '&amp;',\n            '<': '&lt;',\n            '>': '&gt;',\n            '\"': '&quot;',\n            \"'\": '&#39;',\n            \"/\": '&#47;'\n        };\n\n        return String(markup).replace(/[&<>\"'\\/\\\\]/g, function (match) {\n            return replace_map[match];\n        });\n    }\n\n    /**\n     * Produces an ajax-based query function\n     *\n     * @param options object containing configuration parameters\n     * @param options.params parameter map for the transport ajax call, can contain such options as cache, jsonpCallback, etc. see $.ajax\n     * @param options.transport function that will be used to execute the ajax request. must be compatible with parameters supported by $.ajax\n     * @param options.url url for the data\n     * @param options.data a function(searchTerm, pageNumber, context) that should return an object containing query string parameters for the above url.\n     * @param options.dataType request data type: ajax, jsonp, other datatypes supported by jQuery's $.ajax function or the transport function if specified\n     * @param options.quietMillis (optional) milliseconds to wait before making the ajaxRequest, helps debounce the ajax function if invoked too often\n     * @param options.results a function(remoteData, pageNumber, query) that converts data returned form the remote request to the format expected by Select2.\n     *      The expected format is an object containing the following keys:\n     *      results array of objects that will be used as choices\n     *      more (optional) boolean indicating whether there are more results available\n     *      Example: {results:[{id:1, text:'Red'},{id:2, text:'Blue'}], more:true}\n     */\n    function ajax(options) {\n        var timeout, // current scheduled but not yet executed request\n            handler = null,\n            quietMillis = options.quietMillis || 100,\n            ajaxUrl = options.url,\n            self = this;\n\n        return function (query) {\n            window.clearTimeout(timeout);\n            timeout = window.setTimeout(function () {\n                var data = options.data, // ajax data function\n                    url = ajaxUrl, // ajax url string or function\n                    transport = options.transport || $.fn.select2.ajaxDefaults.transport,\n                    // deprecated - to be removed in 4.0  - use params instead\n                    deprecated = {\n                        type: options.type || 'GET', // set type of request (GET or POST)\n                        cache: options.cache || false,\n                        jsonpCallback: options.jsonpCallback||undefined,\n                        dataType: options.dataType||\"json\"\n                    },\n                    params = $.extend({}, $.fn.select2.ajaxDefaults.params, deprecated);\n\n                data = data ? data.call(self, query.term, query.page, query.context) : null;\n                url = (typeof url === 'function') ? url.call(self, query.term, query.page, query.context) : url;\n\n                if (handler && typeof handler.abort === \"function\") { handler.abort(); }\n\n                if (options.params) {\n                    if (typeof options.params === 'function') {\n                        $.extend(params, options.params.call(self));\n                    } else {\n                        $.extend(params, options.params);\n                    }\n                }\n\n                $.extend(params, {\n                    url: url,\n                    dataType: options.dataType,\n                    data: data,\n                    success: function (data) {\n                        // TODO - replace query.page with query so users have access to term, page, etc.\n                        // added query as third paramter to keep backwards compatibility\n                        var results = options.results(data, query.page, query);\n                        query.callback(results);\n                    },\n                    error: function(jqXHR, textStatus, errorThrown){\n                        var results = {\n                            hasError: true,\n                            jqXHR: jqXHR,\n                            textStatus: textStatus,\n                            errorThrown: errorThrown\n                        };\n\n                        query.callback(results);\n                    }\n                });\n                handler = transport.call(self, params);\n            }, quietMillis);\n        };\n    }\n\n    /**\n     * Produces a query function that works with a local array\n     *\n     * @param options object containing configuration parameters. The options parameter can either be an array or an\n     * object.\n     *\n     * If the array form is used it is assumed that it contains objects with 'id' and 'text' keys.\n     *\n     * If the object form is used it is assumed that it contains 'data' and 'text' keys. The 'data' key should contain\n     * an array of objects that will be used as choices. These objects must contain at least an 'id' key. The 'text'\n     * key can either be a String in which case it is expected that each element in the 'data' array has a key with the\n     * value of 'text' which will be used to match choices. Alternatively, text can be a function(item) that can extract\n     * the text.\n     */\n    function local(options) {\n        var data = options, // data elements\n            dataText,\n            tmp,\n            text = function (item) { return \"\"+item.text; }; // function used to retrieve the text portion of a data item that is matched against the search\n\n         if (Array.isArray(data)) {\n            tmp = data;\n            data = { results: tmp };\n        }\n\n         if (typeof data !== 'function') {\n            tmp = data;\n            data = function() { return tmp; };\n        }\n\n        var dataItem = data();\n        if (dataItem.text) {\n            text = dataItem.text;\n            // if text is not a function we assume it to be a key name\n            if (typeof text !== 'function') {\n                dataText = dataItem.text; // we need to store this in a separate variable because in the next step data gets reset and data.text is no longer available\n                text = function (item) { return item[dataText]; };\n            }\n        }\n\n        return function (query) {\n            var t = query.term, filtered = { results: [] }, process;\n            if (t === \"\") {\n                query.callback(data());\n                return;\n            }\n\n            process = function(datum, collection) {\n                var group, attr;\n                datum = datum[0];\n                if (datum.children) {\n                    group = {};\n                    for (attr in datum) {\n                        if (datum.hasOwnProperty(attr)) group[attr]=datum[attr];\n                    }\n                    group.children=[];\n                    $(datum.children).each2(function(i, childDatum) { process(childDatum, group.children); });\n                    if (group.children.length || query.matcher(t, text(group), datum)) {\n                        collection.push(group);\n                    }\n                } else {\n                    if (query.matcher(t, text(datum), datum)) {\n                        collection.push(datum);\n                    }\n                }\n            };\n\n            $(data().results).each2(function(i, datum) { process(datum, filtered.results); });\n            query.callback(filtered);\n        };\n    }\n\n    // TODO javadoc\n    function tags(data) {\n        var isFunc = typeof data === 'function';\n        return function (query) {\n            var t = query.term, filtered = {results: []};\n            var result = isFunc ? data(query) : data;\n            if (Array.isArray(result)) {\n                result.forEach(function (item) {\n                    var isObject = item.text !== undefined,\n                        text = isObject ? item.text : item;\n                    if (t === \"\" || query.matcher(t, text)) {\n                        filtered.results.push(isObject ? item : {id: item, text: item});\n                    }\n                });\n                query.callback(filtered);\n            }\n        };\n    }\n\n    /**\n     * Checks if the formatter function should be used.\n     *\n     * Throws an error if it is not a function. Returns true if it should be used,\n     * false if no formatting should be performed.\n     *\n     * @param formatter\n     */\n    function checkFormatter(formatter, formatterName) {\n        if (typeof formatter === 'function') return true;\n        if (!formatter) return false;\n        if (typeof(formatter) === 'string') return true;\n        throw new Error(formatterName +\" must be a string, function, or falsy value\");\n    }\n\n  /**\n   * Returns a given value\n   * If given a function, returns its output\n   *\n   * @param val string|function\n   * @param context value of \"this\" to be passed to function\n   * @returns {*}\n   */\n    function evaluate(val, context) {\n        if (typeof val === 'function') {\n            var args = Array.prototype.slice.call(arguments, 2);\n            return val.apply(context, args);\n        }\n        return val;\n    }\n\n    function countResults(results) {\n        var count = 0;\n        $.each(results, function(i, item) {\n            if (item.children) {\n                count += countResults(item.children);\n            } else {\n                count++;\n            }\n        });\n        return count;\n    }\n\n    /**\n     * Default tokenizer. This function uses breaks the input on substring match of any string from the\n     * opts.tokenSeparators array and uses opts.createSearchChoice to create the choice object. Both of those\n     * two options have to be defined in order for the tokenizer to work.\n     *\n     * @param input text user has typed so far or pasted into the search field\n     * @param selection currently selected choices\n     * @param selectCallback function(choice) callback tho add the choice to selection\n     * @param opts select2's opts\n     * @return undefined/null to leave the current input unchanged, or a string to change the input to the returned value\n     */\n    function defaultTokenizer(input, selection, selectCallback, opts) {\n        var original = input, // store the original so we can compare and know if we need to tell the search to update its text\n            dupe = false, // check for whether a token we extracted represents a duplicate selected choice\n            token, // token\n            index, // position at which the separator was found\n            i, l, // looping variables\n            separator; // the matched separator\n\n        if (!opts.createSearchChoice || !opts.tokenSeparators || opts.tokenSeparators.length < 1) return undefined;\n\n        while (true) {\n            index = -1;\n\n            for (i = 0, l = opts.tokenSeparators.length; i < l; i++) {\n                separator = opts.tokenSeparators[i];\n                index = input.indexOf(separator);\n                if (index >= 0) break;\n            }\n\n            if (index < 0) break; // did not find any token separator in the input string, bail\n\n            token = input.substring(0, index);\n            input = input.substring(index + separator.length);\n\n            if (token.length > 0) {\n                token = opts.createSearchChoice.call(this, token, selection);\n                if (token !== undefined && token !== null && opts.id(token) !== undefined && opts.id(token) !== null) {\n                    dupe = false;\n                    for (i = 0, l = selection.length; i < l; i++) {\n                        if (equal(opts.id(token), opts.id(selection[i]))) {\n                            dupe = true; break;\n                        }\n                    }\n\n                    if (!dupe) selectCallback(token);\n                }\n            }\n        }\n\n        if (original!==input) return input;\n    }\n\n    function cleanupJQueryElements() {\n        var self = this;\n\n        $.each(arguments, function (i, element) {\n            self[element].remove();\n            self[element] = null;\n        });\n    }\n\n    /**\n     * Creates a new class\n     *\n     * @param superClass\n     * @param methods\n     */\n    function clazz(SuperClass, methods) {\n        var constructor = function () {};\n        constructor.prototype = new SuperClass;\n        constructor.prototype.constructor = constructor;\n        constructor.prototype.parent = SuperClass.prototype;\n        constructor.prototype = $.extend(constructor.prototype, methods);\n        return constructor;\n    }\n\n    AbstractSelect2 = clazz(Object, {\n\n        // abstract\n        bind: function (func) {\n            var self = this;\n            return function () {\n                func.apply(self, arguments);\n            };\n        },\n\n        // abstract\n        init: function (opts) {\n            var results, search, resultsSelector = \".select2-results\";\n\n            // prepare options\n            this.opts = opts = this.prepareOpts(opts);\n\n            this.id=opts.id;\n\n            // destroy if called on an existing component\n            if (opts.element.data(\"select2\") !== undefined &&\n                opts.element.data(\"select2\") !== null) {\n                opts.element.data(\"select2\").destroy();\n            }\n\n            this.container = this.createContainer();\n\n            this.liveRegion = $('.select2-hidden-accessible');\n            if (this.liveRegion.length == 0) {\n                this.liveRegion = $(\"<span>\", {\n                        role: \"status\",\n                        \"aria-live\": \"polite\"\n                    })\n                    .addClass(\"select2-hidden-accessible\")\n                    .appendTo(document.body);\n            }\n\n            this.containerId=\"s2id_\"+(opts.element.attr(\"id\") || \"autogen\"+nextUid());\n            this.containerEventName= this.containerId\n                .replace(/([.])/g, '_')\n                .replace(/([;&,\\-\\.\\+\\*\\~':\"\\!\\^#$%@\\[\\]\\(\\)=>\\|])/g, '\\\\$1');\n            this.container.attr(\"id\", this.containerId);\n\n            this.container.attr(\"title\", opts.element.attr(\"title\"));\n\n            this.body = $(document.body);\n\n            syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);\n\n            this.container.attr(\"style\", opts.element.attr(\"style\"));\n            this.container.css(evaluate(opts.containerCss, this.opts.element));\n            this.container.addClass(evaluate(opts.containerCssClass, this.opts.element));\n\n            this.elementTabIndex = this.opts.element.attr(\"tabindex\");\n\n            // swap container for the element\n            this.opts.element\n                .data(\"select2\", this)\n                .attr(\"tabindex\", \"-1\")\n                .before(this.container)\n                .on(\"click.select2\", killEvent); // do not leak click events\n\n            this.container.data(\"select2\", this);\n\n            this.dropdown = this.container.find(\".select2-drop\");\n\n            syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);\n\n            this.dropdown.addClass(evaluate(opts.dropdownCssClass, this.opts.element));\n            this.dropdown.data(\"select2\", this);\n            this.dropdown.on(\"click\", killEvent);\n\n            this.results = results = this.container.find(resultsSelector);\n            this.search = search = this.container.find(\"input.select2-input\");\n\n            this.queryCount = 0;\n            this.resultsPage = 0;\n            this.context = null;\n\n            // initialize the container\n            this.initContainer();\n\n            this.container.on(\"click\", killEvent);\n\n            installFilteredMouseMove(this.results);\n\n            this.dropdown.on(\"mousemove-filtered\", resultsSelector, this.bind(this.highlightUnderEvent));\n            this.dropdown.on(\"touchstart touchmove touchend\", resultsSelector, this.bind(function (event) {\n                this._touchEvent = true;\n                this.highlightUnderEvent(event);\n            }));\n            this.dropdown.on(\"touchmove\", resultsSelector, this.bind(this.touchMoved));\n            this.dropdown.on(\"touchstart touchend\", resultsSelector, this.bind(this.clearTouchMoved));\n\n            // Waiting for a click event on touch devices to select option and hide dropdown\n            // otherwise click will be triggered on an underlying element\n            this.dropdown.on('click', this.bind(function (event) {\n                if (this._touchEvent) {\n                    this._touchEvent = false;\n                    this.selectHighlighted();\n                }\n            }));\n\n            installDebouncedScroll(80, this.results);\n            this.dropdown.on(\"scroll-debounced\", resultsSelector, this.bind(this.loadMoreIfNeeded));\n\n            // do not propagate change event from the search field out of the component\n            $(this.container).on(\"change\", \".select2-input\", function(e) {e.stopPropagation();});\n            $(this.dropdown).on(\"change\", \".select2-input\", function(e) {e.stopPropagation();});\n\n            // if jquery.mousewheel plugin is installed we can prevent out-of-bounds scrolling of results via mousewheel\n            if ($.fn.mousewheel) {\n                results.mousewheel(function (e, delta, deltaX, deltaY) {\n                    var top = results.scrollTop();\n                    if (deltaY > 0 && top - deltaY <= 0) {\n                        results.scrollTop(0);\n                        killEvent(e);\n                    } else if (deltaY < 0 && results.get(0).scrollHeight - results.scrollTop() + deltaY <= results.height()) {\n                        results.scrollTop(results.get(0).scrollHeight - results.height());\n                        killEvent(e);\n                    }\n                });\n            }\n\n            installKeyUpChangeEvent(search);\n            search.on(\"keyup-change input paste\", this.bind(this.updateResults));\n            search.on(\"focus\", function () { search.addClass(\"select2-focused\"); });\n            search.on(\"blur\", function () { search.removeClass(\"select2-focused\");});\n\n            this.dropdown.on(\"mouseup\", resultsSelector, this.bind(function (e) {\n                if ($(e.target).closest(\".select2-result-selectable\").length > 0) {\n                    this.highlightUnderEvent(e);\n                    this.selectHighlighted(e);\n                }\n            }));\n\n            // trap all mouse events from leaving the dropdown. sometimes there may be a modal that is listening\n            // for mouse events outside of itself so it can close itself. since the dropdown is now outside the select2's\n            // dom it will trigger the popup close, which is not what we want\n            // focusin can cause focus wars between modals and select2 since the dropdown is outside the modal.\n            this.dropdown.on(\"click mouseup mousedown touchstart touchend focusin\", function (e) { e.stopPropagation(); });\n\n            this.lastSearchTerm = undefined;\n\n            if (typeof this.opts.initSelection === 'function') {\n                // initialize selection based on the current value of the source element\n                this.initSelection();\n\n                // if the user has provided a function that can set selection based on the value of the source element\n                // we monitor the change event on the element and trigger it, allowing for two way synchronization\n                this.monitorSource();\n            }\n\n            if (opts.maximumInputLength !== null) {\n                this.search.attr(\"maxlength\", opts.maximumInputLength);\n            }\n\n            var disabled = opts.element.prop(\"disabled\");\n            if (disabled === undefined) disabled = false;\n            this.enable(!disabled);\n\n            var readonly = opts.element.prop(\"readonly\");\n            if (readonly === undefined) readonly = false;\n            this.readonly(readonly);\n\n            // Calculate size of scrollbar\n            scrollBarDimensions = scrollBarDimensions || measureScrollbar();\n\n            this.autofocus = opts.element.prop(\"autofocus\");\n            opts.element.prop(\"autofocus\", false);\n            if (this.autofocus) this.focus();\n\n            this.search.attr(\"placeholder\", opts.searchInputPlaceholder);\n        },\n\n        // abstract\n        destroy: function () {\n            var element=this.opts.element, select2 = element.data(\"select2\"), self = this;\n\n            this.close();\n\n            if (element.length && element[0].detachEvent && self._sync) {\n                element.each(function () {\n                    if (self._sync) {\n                        this.detachEvent(\"onpropertychange\", self._sync);\n                    }\n                });\n            }\n            if (this.propertyObserver) {\n                this.propertyObserver.disconnect();\n                this.propertyObserver = null;\n            }\n            this._sync = null;\n\n            if (select2 !== undefined) {\n                select2.container.remove();\n                select2.liveRegion.remove();\n                select2.dropdown.remove();\n                element.removeData(\"select2\")\n                    .off(\".select2\");\n                if (!element.is(\"input[type='hidden']\")) {\n                    element\n                        .show()\n                        .prop(\"autofocus\", this.autofocus || false);\n                    if (this.elementTabIndex) {\n                        element.attr({tabindex: this.elementTabIndex});\n                    } else {\n                        element.removeAttr(\"tabindex\");\n                    }\n                    element.show();\n                } else {\n                    element.css(\"display\", \"\");\n                }\n            }\n\n            cleanupJQueryElements.call(this,\n                \"container\",\n                \"liveRegion\",\n                \"dropdown\",\n                \"results\",\n                \"search\"\n            );\n        },\n\n        // abstract\n        optionToData: function(element) {\n            if (element.is(\"option\")) {\n                return {\n                    id:element.prop(\"value\"),\n                    text:element.text(),\n                    element: element.get(),\n                    css: element.attr(\"class\"),\n                    disabled: element.prop(\"disabled\"),\n                    locked: equal(element.attr(\"locked\"), \"locked\") || equal(element.data(\"locked\"), true)\n                };\n            } else if (element.is(\"optgroup\")) {\n                return {\n                    text:element.attr(\"label\"),\n                    children:[],\n                    element: element.get(),\n                    css: element.attr(\"class\")\n                };\n            }\n        },\n\n        // abstract\n        prepareOpts: function (opts) {\n            var element, select, idKey, ajaxUrl, self = this;\n\n            element = opts.element;\n\n            if (element.get(0).tagName.toLowerCase() === \"select\") {\n                this.select = select = opts.element;\n            }\n\n            if (select) {\n                // these options are not allowed when attached to a select because they are picked up off the element itself\n                $.each([\"id\", \"multiple\", \"ajax\", \"query\", \"createSearchChoice\", \"initSelection\", \"data\", \"tags\"], function () {\n                    if (this in opts) {\n                        throw new Error(\"Option '\" + this + \"' is not allowed for Select2 when attached to a <select> element.\");\n                    }\n                });\n            }\n\n            opts.debug = opts.debug || $.fn.select2.defaults.debug;\n\n            // Warnings for options renamed/removed in Select2 4.0.0\n            // Only when it's enabled through debug mode\n            if (opts.debug && console && console.warn) {\n                // id was removed\n                if (opts.id != null) {\n                    console.warn(\n                        'Select2: The `id` option has been removed in Select2 4.0.0, ' +\n                        'consider renaming your `id` property or mapping the property before your data makes it to Select2. ' +\n                        'You can read more at https://select2.github.io/announcements-4.0.html#changed-id'\n                    );\n                }\n\n                // text was removed\n                if (opts.text != null) {\n                    console.warn(\n                        'Select2: The `text` option has been removed in Select2 4.0.0, ' +\n                        'consider renaming your `text` property or mapping the property before your data makes it to Select2. ' +\n                        'You can read more at https://select2.github.io/announcements-4.0.html#changed-id'\n                    );\n                }\n\n                // sortResults was renamed to results\n                if (opts.sortResults != null) {\n                    console.warn(\n                        'Select2: the `sortResults` option has been renamed to `sorter` in Select2 4.0.0. '\n                    );\n                }\n\n                // selectOnBlur was renamed to selectOnClose\n                if (opts.selectOnBlur != null) {\n                    console.warn(\n                        'Select2: The `selectOnBlur` option has been renamed to `selectOnClose` in Select2 4.0.0.'\n                    );\n                }\n\n                // ajax.results was renamed to ajax.processResults\n                if (opts.ajax != null && opts.ajax.results != null) {\n                    console.warn(\n                        'Select2: The `ajax.results` option has been renamed to `ajax.processResults` in Select2 4.0.0.'\n                    );\n                }\n\n                // format* options were renamed to language.*\n                if (opts.formatNoResults != null) {\n                    console.warn(\n                        'Select2: The `formatNoResults` option has been renamed to `language.noResults` in Select2 4.0.0.'\n                    );\n                }\n                if (opts.formatSearching != null) {\n                    console.warn(\n                        'Select2: The `formatSearching` option has been renamed to `language.searching` in Select2 4.0.0.'\n                    );\n                }\n                if (opts.formatInputTooShort != null) {\n                    console.warn(\n                        'Select2: The `formatInputTooShort` option has been renamed to `language.inputTooShort` in Select2 4.0.0.'\n                    );\n                }\n                if (opts.formatInputTooLong != null) {\n                    console.warn(\n                        'Select2: The `formatInputTooLong` option has been renamed to `language.inputTooLong` in Select2 4.0.0.'\n                    );\n                }\n                if (opts.formatLoading != null) {\n                    console.warn(\n                        'Select2: The `formatLoading` option has been renamed to `language.loadingMore` in Select2 4.0.0.'\n                    );\n                }\n                if (opts.formatSelectionTooBig != null) {\n                    console.warn(\n                        'Select2: The `formatSelectionTooBig` option has been renamed to `language.maximumSelected` in Select2 4.0.0.'\n                    );\n                }\n\n                if (opts.element.data('select2Tags')) {\n                    console.warn(\n                        'Select2: The `data-select2-tags` attribute has been renamed to `data-tags` in Select2 4.0.0.'\n                    );\n                }\n            }\n\n            // Aliasing options renamed in Select2 4.0.0\n\n            // data-select2-tags -> data-tags\n            if (opts.element.data('tags') != null) {\n                var elemTags = opts.element.data('tags');\n\n                // data-tags should actually be a boolean\n                if (!Array.isArray(elemTags)) {\n                    elemTags = [];\n                }\n\n                opts.element.data('select2Tags', elemTags);\n            }\n\n            // sortResults -> sorter\n            if (opts.sorter != null) {\n                opts.sortResults = opts.sorter;\n            }\n\n            // selectOnBlur -> selectOnClose\n            if (opts.selectOnClose != null) {\n                opts.selectOnBlur = opts.selectOnClose;\n            }\n\n            // ajax.results -> ajax.processResults\n            if (opts.ajax != null) {\n                if (typeof opts.ajax.processResults === 'function') {\n                    opts.ajax.results = opts.ajax.processResults;\n                }\n            }\n\n            // Formatters/language options\n            if (opts.language != null) {\n                var lang = opts.language;\n\n                // formatNoMatches -> language.noMatches\n                if (typeof lang.noMatches === 'function') {\n                    opts.formatNoMatches = lang.noMatches;\n                }\n\n                // formatSearching -> language.searching\n                if (typeof lang.searching === 'function') {\n                    opts.formatSearching = lang.searching;\n                }\n\n                // formatInputTooShort -> language.inputTooShort\n                if (typeof lang.inputTooShort === 'function') {\n                    opts.formatInputTooShort = lang.inputTooShort;\n                }\n\n                // formatInputTooLong -> language.inputTooLong\n                if (typeof lang.inputTooLong === 'function') {\n                    opts.formatInputTooLong = lang.inputTooLong;\n                }\n\n                // formatLoading -> language.loadingMore\n                if (typeof lang.loadingMore === 'function') {\n                    opts.formatLoading = lang.loadingMore;\n                }\n\n                // formatSelectionTooBig -> language.maximumSelected\n                if (typeof lang.maximumSelected === 'function') {\n                    opts.formatSelectionTooBig = lang.maximumSelected;\n                }\n            }\n\n            opts = $.extend({}, {\n                populateResults: function(container, results, query) {\n                    var populate, id=this.opts.id, liveRegion=this.liveRegion;\n\n                    populate=function(results, container, depth) {\n\n                        var i, l, result, selectable, disabled, compound, node, label, innerContainer, formatted;\n\n                        results = opts.sortResults(results, container, query);\n\n                        // collect the created nodes for bulk append\n                        var nodes = [];\n                        for (i = 0, l = results.length; i < l; i = i + 1) {\n\n                            result=results[i];\n\n                            disabled = (result.disabled === true);\n                            selectable = (!disabled) && (id(result) !== undefined);\n\n                            compound=result.children && result.children.length > 0;\n\n                            node=$(\"<li></li>\");\n                            node.addClass(\"select2-results-dept-\"+depth);\n                            node.addClass(\"select2-result\");\n                            node.addClass(selectable ? \"select2-result-selectable\" : \"select2-result-unselectable\");\n                            if (disabled) { node.addClass(\"select2-disabled\"); }\n                            if (compound) { node.addClass(\"select2-result-with-children\"); }\n                            node.addClass(self.opts.formatResultCssClass(result));\n                            node.attr(\"role\", \"presentation\");\n\n                            label=$(document.createElement(\"div\"));\n                            label.addClass(\"select2-result-label\");\n                            label.attr(\"id\", \"select2-result-label-\" + nextUid());\n                            label.attr(\"role\", \"option\");\n\n                            formatted=opts.formatResult(result, label, query, self.opts.escapeMarkup);\n                            if (formatted!==undefined) {\n                                label.html(formatted);\n                                node.append(label);\n                            }\n\n\n                            if (compound) {\n                                innerContainer=$(\"<ul></ul>\");\n                                innerContainer.addClass(\"select2-result-sub\");\n                                populate(result.children, innerContainer, depth+1);\n                                node.append(innerContainer);\n                            }\n\n                            node.data(\"select2-data\", result);\n                            nodes.push(node[0]);\n                        }\n\n                        // bulk append the created nodes\n                        container.append(nodes);\n                        liveRegion.text(opts.formatMatches(results.length));\n                    };\n\n                    populate(results, container, 0);\n                }\n            }, $.fn.select2.defaults, opts);\n\n            if (typeof(opts.id) !== \"function\") {\n                idKey = opts.id;\n                opts.id = function (e) { return e[idKey]; };\n            }\n\n            if (Array.isArray(opts.element.data(\"select2Tags\"))) {\n                if (\"tags\" in opts) {\n                    throw \"tags specified as both an attribute 'data-select2-tags' and in options of Select2 \" + opts.element.attr(\"id\");\n                }\n                opts.tags=opts.element.data(\"select2Tags\");\n            }\n\n            if (select) {\n                opts.query = this.bind(function (query) {\n                    var data = { results: [], more: false },\n                        term = query.term,\n                        children, placeholderOption, process;\n\n                    process=function(element, collection) {\n                        var group;\n                        if (element.is(\"option\")) {\n                            if (query.matcher(term, element.text(), element)) {\n                                collection.push(self.optionToData(element));\n                            }\n                        } else if (element.is(\"optgroup\")) {\n                            group=self.optionToData(element);\n                            element.children().each2(function(i, elm) { process(elm, group.children); });\n                            if (group.children.length>0) {\n                                collection.push(group);\n                            }\n                        }\n                    };\n\n                    children=element.children();\n\n                    // ignore the placeholder option if there is one\n                    if (this.getPlaceholder() !== undefined && children.length > 0) {\n                        placeholderOption = this.getPlaceholderOption();\n                        if (placeholderOption) {\n                            children=children.not(placeholderOption);\n                        }\n                    }\n\n                    children.each2(function(i, elm) { process(elm, data.results); });\n\n                    query.callback(data);\n                });\n                // this is needed because inside val() we construct choices from options and their id is hardcoded\n                opts.id=function(e) { return e.id; };\n            } else {\n                if (!(\"query\" in opts)) {\n                    if (\"ajax\" in opts) {\n                        ajaxUrl = opts.element.data(\"ajax-url\");\n                        if (ajaxUrl && ajaxUrl.length > 0) {\n                            opts.ajax.url = ajaxUrl;\n                        }\n                        opts.query = ajax.call(opts.element, opts.ajax);\n                    } else if (\"data\" in opts) {\n                        opts.query = local(opts.data);\n                    } else if (\"tags\" in opts) {\n                        opts.query = tags(opts.tags);\n                        if (opts.createSearchChoice === undefined) {\n                            opts.createSearchChoice = function (term) { return {id: (term === undefined || term === null) ? \"\" : term.trim(), text: (term === undefined || term === null) ? \"\" : term.trim()}; };\n                        }\n                        if (opts.initSelection === undefined) {\n                            opts.initSelection = function (element, callback) {\n                                var data = [];\n                                splitVal(element.val(), opts.separator, opts.transformVal).forEach(function (item) {\n                                    var obj = { id: item, text: item },\n                                        tags = opts.tags;\n                                    if (typeof tags === 'function') tags=tags();\n                                    $(tags).each(function() { if (equal(this.id, obj.id)) { obj = this; return false; } });\n                                    data.push(obj);\n                                });\n\n                                callback(data);\n                            };\n                        }\n                    }\n                }\n            }\n            if (typeof(opts.query) !== \"function\") {\n                throw \"query function not defined for Select2 \" + opts.element.attr(\"id\");\n            }\n\n            if (opts.createSearchChoicePosition === 'top') {\n                opts.createSearchChoicePosition = function(list, item) { list.unshift(item); };\n            }\n            else if (opts.createSearchChoicePosition === 'bottom') {\n                opts.createSearchChoicePosition = function(list, item) { list.push(item); };\n            }\n            else if (typeof(opts.createSearchChoicePosition) !== \"function\")  {\n                throw \"invalid createSearchChoicePosition option must be 'top', 'bottom' or a custom function\";\n            }\n\n            return opts;\n        },\n\n        /**\n         * Monitor the original element for changes and update select2 accordingly\n         */\n        // abstract\n        monitorSource: function () {\n            var el = this.opts.element, observer, self = this;\n\n            el.on(\"change.select2\", this.bind(function (e) {\n                if (this.opts.element.data(\"select2-change-triggered\") !== true) {\n                    this.initSelection();\n                }\n            }));\n\n            this._sync = this.bind(function () {\n\n                // sync enabled state\n                var disabled = el.prop(\"disabled\");\n                if (disabled === undefined) disabled = false;\n                this.enable(!disabled);\n\n                var readonly = el.prop(\"readonly\");\n                if (readonly === undefined) readonly = false;\n                this.readonly(readonly);\n\n                if (this.container) {\n                    syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);\n                    this.container.addClass(evaluate(this.opts.containerCssClass, this.opts.element));\n                }\n\n                if (this.dropdown) {\n                    syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);\n                    this.dropdown.addClass(evaluate(this.opts.dropdownCssClass, this.opts.element));\n                }\n\n            });\n\n            // IE8-10 (IE9/10 won't fire propertyChange via attachEventListener)\n            if (el.length && el[0].attachEvent) {\n                el.each(function() {\n                    this.attachEvent(\"onpropertychange\", self._sync);\n                });\n            }\n\n            // safari, chrome, firefox, IE11\n            observer = window.MutationObserver || window.WebKitMutationObserver|| window.MozMutationObserver;\n            if (observer !== undefined) {\n                if (this.propertyObserver) { delete this.propertyObserver; this.propertyObserver = null; }\n                this.propertyObserver = new observer(function (mutations) {\n                    $.each(mutations, self._sync);\n                });\n                this.propertyObserver.observe(el.get(0), { attributes:true, subtree:false });\n            }\n        },\n\n        // abstract\n        triggerSelect: function(data) {\n            var evt = $.Event(\"select2-selecting\", { val: this.id(data), object: data, choice: data });\n            this.opts.element.trigger(evt);\n            return !evt.isDefaultPrevented();\n        },\n\n        /**\n         * Triggers the change event on the source element\n         */\n        // abstract\n        triggerChange: function (details) {\n\n            details = details || {};\n            details= $.extend({}, details, { type: \"change\", val: this.val() });\n            // prevents recursive triggering\n            this.opts.element.data(\"select2-change-triggered\", true);\n            this.opts.element.trigger(details);\n            this.opts.element.data(\"select2-change-triggered\", false);\n\n            // some validation frameworks ignore the change event and listen instead to keyup, click for selects\n            // so here we trigger the click event manually\n            this.opts.element.trigger(\"click\");\n\n            // ValidationEngine ignores the change event and listens instead to blur\n            // so here we trigger the blur event manually if so desired\n            if (this.opts.blurOnChange)\n                this.opts.element.trigger(\"blur\");\n        },\n\n        //abstract\n        isInterfaceEnabled: function()\n        {\n            return this.enabledInterface === true;\n        },\n\n        // abstract\n        enableInterface: function() {\n            var enabled = this._enabled && !this._readonly,\n                disabled = !enabled;\n\n            if (enabled === this.enabledInterface) return false;\n\n            this.container.toggleClass(\"select2-container-disabled\", disabled);\n            this.close();\n            this.enabledInterface = enabled;\n\n            return true;\n        },\n\n        // abstract\n        enable: function(enabled) {\n            if (enabled === undefined) enabled = true;\n            if (this._enabled === enabled) return;\n            this._enabled = enabled;\n\n            this.opts.element.prop(\"disabled\", !enabled);\n            this.enableInterface();\n        },\n\n        // abstract\n        disable: function() {\n            this.enable(false);\n        },\n\n        // abstract\n        readonly: function(enabled) {\n            if (enabled === undefined) enabled = false;\n            if (this._readonly === enabled) return;\n            this._readonly = enabled;\n\n            this.opts.element.prop(\"readonly\", enabled);\n            this.enableInterface();\n        },\n\n        // abstract\n        opened: function () {\n            return (this.container) ? this.container.hasClass(\"select2-dropdown-open\") : false;\n        },\n\n        // abstract\n        positionDropdown: function() {\n            var $dropdown = this.dropdown,\n                container = this.container,\n                offset = container.offset(),\n                height = container.outerHeight(false),\n                width = container.outerWidth(false),\n                dropHeight = $dropdown.outerHeight(false),\n                $window = $(window),\n                windowWidth = $window.width(),\n                windowHeight = $window.height(),\n                viewPortRight = $window.scrollLeft() + windowWidth,\n                viewportBottom = $window.scrollTop() + windowHeight,\n                dropTop = offset.top + height,\n                dropLeft = offset.left,\n                enoughRoomBelow = dropTop + dropHeight <= viewportBottom,\n                enoughRoomAbove = (offset.top - dropHeight) >= $window.scrollTop(),\n                dropWidth = $dropdown.outerWidth(false),\n                enoughRoomOnRight = function() {\n                    return dropLeft + dropWidth <= viewPortRight;\n                },\n                enoughRoomOnLeft = function() {\n                    return offset.left + viewPortRight + container.outerWidth(false)  > dropWidth;\n                },\n                aboveNow = $dropdown.hasClass(\"select2-drop-above\"),\n                bodyOffset,\n                above,\n                changeDirection,\n                css,\n                resultsListNode;\n\n            // always prefer the current above/below alignment, unless there is not enough room\n            if (aboveNow) {\n                above = true;\n                if (!enoughRoomAbove && enoughRoomBelow) {\n                    changeDirection = true;\n                    above = false;\n                }\n            } else {\n                above = false;\n                if (!enoughRoomBelow && enoughRoomAbove) {\n                    changeDirection = true;\n                    above = true;\n                }\n            }\n\n            //if we are changing direction we need to get positions when dropdown is hidden;\n            if (changeDirection) {\n                $dropdown.hide();\n                offset = this.container.offset();\n                height = this.container.outerHeight(false);\n                width = this.container.outerWidth(false);\n                dropHeight = $dropdown.outerHeight(false);\n                viewPortRight = $window.scrollLeft() + windowWidth;\n                viewportBottom = $window.scrollTop() + windowHeight;\n                dropTop = offset.top + height;\n                dropLeft = offset.left;\n                dropWidth = $dropdown.outerWidth(false);\n                $dropdown.show();\n\n                // fix so the cursor does not move to the left within the search-textbox in IE\n                this.focusSearch();\n            }\n\n            if (this.opts.dropdownAutoWidth) {\n                resultsListNode = $('.select2-results', $dropdown)[0];\n                $dropdown.addClass('select2-drop-auto-width');\n                $dropdown.css('width', '');\n                // Add scrollbar width to dropdown if vertical scrollbar is present\n                dropWidth = $dropdown.outerWidth(false) + (resultsListNode.scrollHeight === resultsListNode.clientHeight ? 0 : scrollBarDimensions.width);\n                dropWidth > width ? width = dropWidth : dropWidth = width;\n                dropHeight = $dropdown.outerHeight(false);\n            }\n            else {\n                this.container.removeClass('select2-drop-auto-width');\n            }\n\n            //console.log(\"below/ droptop:\", dropTop, \"dropHeight\", dropHeight, \"sum\", (dropTop+dropHeight)+\" viewport bottom\", viewportBottom, \"enough?\", enoughRoomBelow);\n            //console.log(\"above/ offset.top\", offset.top, \"dropHeight\", dropHeight, \"top\", (offset.top-dropHeight), \"scrollTop\", this.body.scrollTop(), \"enough?\", enoughRoomAbove);\n\n            // fix positioning when body has an offset and is not position: static\n            if (this.body.css('position') !== 'static') {\n                bodyOffset = this.body.offset();\n                dropTop -= bodyOffset.top;\n                dropLeft -= bodyOffset.left;\n            }\n\n            if (!enoughRoomOnRight() && enoughRoomOnLeft()) {\n                dropLeft = offset.left + this.container.outerWidth(false) - dropWidth;\n            }\n\n            css =  {\n                left: dropLeft,\n                width: width\n            };\n\n            if (above) {\n                this.container.addClass(\"select2-drop-above\");\n                $dropdown.addClass(\"select2-drop-above\");\n                dropHeight = $dropdown.outerHeight(false);\n                css.top = offset.top - dropHeight;\n                css.bottom = 'auto';\n            }\n            else {\n                css.top = dropTop;\n                css.bottom = 'auto';\n                this.container.removeClass(\"select2-drop-above\");\n                $dropdown.removeClass(\"select2-drop-above\");\n            }\n            css = $.extend(css, evaluate(this.opts.dropdownCss, this.opts.element));\n\n            $dropdown.css(css);\n        },\n\n        // abstract\n        shouldOpen: function() {\n            var event;\n\n            if (this.opened()) return false;\n\n            if (this._enabled === false || this._readonly === true) return false;\n\n            event = $.Event(\"select2-opening\");\n            this.opts.element.trigger(event);\n            return !event.isDefaultPrevented();\n        },\n\n        // abstract\n        clearDropdownAlignmentPreference: function() {\n            // clear the classes used to figure out the preference of where the dropdown should be opened\n            this.container.removeClass(\"select2-drop-above\");\n            this.dropdown.removeClass(\"select2-drop-above\");\n        },\n\n        /**\n         * Opens the dropdown\n         *\n         * @return {Boolean} whether or not dropdown was opened. This method will return false if, for example,\n         * the dropdown is already open, or if the 'open' event listener on the element called preventDefault().\n         */\n        // abstract\n        open: function () {\n\n            if (!this.shouldOpen()) return false;\n\n            this.opening();\n\n            // Only bind the document mousemove when the dropdown is visible\n            $document.on(\"mousemove.select2Event\", function (e) {\n                lastMousePosition.x = e.pageX;\n                lastMousePosition.y = e.pageY;\n            });\n\n            return true;\n        },\n\n        /**\n         * Performs the opening of the dropdown\n         */\n        // abstract\n        opening: function() {\n            var cid = this.containerEventName,\n                scroll = \"scroll.\" + cid,\n                resize = \"resize.\"+cid,\n                orient = \"orientationchange.\"+cid,\n                mask;\n\n            this.container.addClass(\"select2-dropdown-open\").addClass(\"select2-container-active\");\n\n            this.clearDropdownAlignmentPreference();\n\n            if(this.dropdown[0] !== this.body.children().last()[0]) {\n                this.dropdown.detach().appendTo(this.body);\n            }\n\n            // create the dropdown mask if doesn't already exist\n            mask = $(\"#select2-drop-mask\");\n            if (mask.length === 0) {\n                mask = $(document.createElement(\"div\"));\n                mask.attr(\"id\",\"select2-drop-mask\").attr(\"class\",\"select2-drop-mask\");\n                mask.hide();\n                mask.appendTo(this.body);\n                mask.on(\"mousedown touchstart click\", function (e) {\n                    // Prevent IE from generating a click event on the body\n                    reinsertElement(mask);\n\n                    var dropdown = $(\"#select2-drop\"), self;\n                    if (dropdown.length > 0) {\n                        self=dropdown.data(\"select2\");\n                        if (self.opts.selectOnBlur) {\n                            self.selectHighlighted({noFocus: true});\n                        }\n                        self.close();\n                        e.preventDefault();\n                        e.stopPropagation();\n                    }\n                });\n            }\n\n            // ensure the mask is always right before the dropdown\n            if (this.dropdown.prev()[0] !== mask[0]) {\n                this.dropdown.before(mask);\n            }\n\n            // move the global id to the correct dropdown\n            $(\"#select2-drop\").removeAttr(\"id\");\n            this.dropdown.attr(\"id\", \"select2-drop\");\n\n            // show the elements\n            mask.show();\n\n            this.positionDropdown();\n            this.dropdown.show();\n            this.positionDropdown();\n\n            this.dropdown.addClass(\"select2-drop-active\");\n\n            // attach listeners to events that can change the position of the container and thus require\n            // the position of the dropdown to be updated as well so it does not come unglued from the container\n            var that = this;\n            this.container.parents().add(window).each(function () {\n                $(this).on(resize+\" \"+scroll+\" \"+orient, function (e) {\n                    if (that.opened()) that.positionDropdown();\n                });\n            });\n\n\n        },\n\n        // abstract\n        close: function () {\n            if (!this.opened()) return;\n\n            var cid = this.containerEventName,\n                scroll = \"scroll.\" + cid,\n                resize = \"resize.\"+cid,\n                orient = \"orientationchange.\"+cid;\n\n            // unbind event listeners\n            this.container.parents().add(window).each(function () { $(this).off(scroll).off(resize).off(orient); });\n\n            this.clearDropdownAlignmentPreference();\n\n            $(\"#select2-drop-mask\").hide();\n            this.dropdown.removeAttr(\"id\"); // only the active dropdown has the select2-drop id\n            this.dropdown.hide();\n            this.container.removeClass(\"select2-dropdown-open\").removeClass(\"select2-container-active\");\n            this.results.empty();\n\n            // Now that the dropdown is closed, unbind the global document mousemove event\n            $document.off(\"mousemove.select2Event\");\n\n            this.clearSearch();\n            this.search.removeClass(\"select2-active\");\n\n            // Remove the aria active descendant for highlighted element\n            this.search.removeAttr(\"aria-activedescendant\");\n            this.opts.element.trigger($.Event(\"select2-close\"));\n        },\n\n        /**\n         * Opens control, sets input value, and updates results.\n         */\n        // abstract\n        externalSearch: function (term) {\n            this.open();\n            this.search.val(term);\n            this.updateResults(false);\n        },\n\n        // abstract\n        clearSearch: function () {\n\n        },\n\n        /**\n         * @return {Boolean} Whether or not search value was changed.\n         * @private\n         */\n        prefillNextSearchTerm: function () {\n            // initializes search's value with nextSearchTerm (if defined by user)\n            // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter\n            if(this.search.val() !== \"\") {\n                return false;\n            }\n\n            var nextSearchTerm = this.opts.nextSearchTerm(this.data(), this.lastSearchTerm);\n            if(nextSearchTerm !== undefined){\n                this.search.val(nextSearchTerm);\n                this.search.trigger(\"select\");\n                return true;\n            }\n\n            return false;\n        },\n\n        //abstract\n        getMaximumSelectionSize: function() {\n            return evaluate(this.opts.maximumSelectionSize, this.opts.element);\n        },\n\n        // abstract\n        ensureHighlightVisible: function () {\n            var results = this.results, children, index, child, hb, rb, y, more, topOffset;\n\n            index = this.highlight();\n\n            if (index < 0) return;\n\n            if (index == 0) {\n\n                // if the first element is highlighted scroll all the way to the top,\n                // that way any unselectable headers above it will also be scrolled\n                // into view\n\n                results.scrollTop(0);\n                return;\n            }\n\n            children = this.findHighlightableChoices().find('.select2-result-label');\n\n            child = $(children[index]);\n\n            topOffset = (child.offset() || {}).top || 0;\n\n            hb = topOffset + child.outerHeight(true);\n\n            // if this is the last child lets also make sure select2-more-results is visible\n            if (index === children.length - 1) {\n                more = results.find(\"li.select2-more-results\");\n                if (more.length > 0) {\n                    hb = more.offset().top + more.outerHeight(true);\n                }\n            }\n\n            rb = results.offset().top + results.outerHeight(false);\n            if (hb > rb) {\n                results.scrollTop(results.scrollTop() + (hb - rb));\n            }\n            y = topOffset - results.offset().top;\n\n            // make sure the top of the element is visible\n            if (y < 0 && child.css('display') != 'none' ) {\n                results.scrollTop(results.scrollTop() + y); // y is negative\n            }\n        },\n\n        // abstract\n        findHighlightableChoices: function() {\n            return this.results.find(\".select2-result-selectable:not(.select2-disabled):not(.select2-selected)\");\n        },\n\n        // abstract\n        moveHighlight: function (delta) {\n            var choices = this.findHighlightableChoices(),\n                index = this.highlight();\n\n            while (index > -1 && index < choices.length) {\n                index += delta;\n                var choice = $(choices[index]);\n                if (choice.hasClass(\"select2-result-selectable\") && !choice.hasClass(\"select2-disabled\") && !choice.hasClass(\"select2-selected\")) {\n                    this.highlight(index);\n                    break;\n                }\n            }\n        },\n\n        // abstract\n        highlight: function (index) {\n            var choices = this.findHighlightableChoices(),\n                choice,\n                data;\n\n            if (arguments.length === 0) {\n                return indexOf(choices.filter(\".select2-highlighted\")[0], choices.get());\n            }\n\n            if (index >= choices.length) index = choices.length - 1;\n            if (index < 0) index = 0;\n\n            this.removeHighlight();\n\n            choice = $(choices[index]);\n            choice.addClass(\"select2-highlighted\");\n\n            // ensure assistive technology can determine the active choice\n            this.search.attr(\"aria-activedescendant\", choice.find(\".select2-result-label\").attr(\"id\"));\n\n            this.ensureHighlightVisible();\n\n            this.liveRegion.text(choice.text());\n\n            data = choice.data(\"select2-data\");\n            if (data) {\n                this.opts.element.trigger({ type: \"select2-highlight\", val: this.id(data), choice: data });\n            }\n        },\n\n        removeHighlight: function() {\n            this.results.find(\".select2-highlighted\").removeClass(\"select2-highlighted\");\n        },\n\n        touchMoved: function() {\n            this._touchMoved = true;\n        },\n\n        clearTouchMoved: function() {\n          this._touchMoved = false;\n        },\n\n        // abstract\n        countSelectableResults: function() {\n            return this.findHighlightableChoices().length;\n        },\n\n        // abstract\n        highlightUnderEvent: function (event) {\n            var el = $(event.target).closest(\".select2-result-selectable\");\n            if (el.length > 0 && !el.is(\".select2-highlighted\")) {\n                var choices = this.findHighlightableChoices();\n                this.highlight(choices.index(el));\n            } else if (el.length == 0) {\n                // if we are over an unselectable item remove all highlights\n                this.removeHighlight();\n            }\n        },\n\n        // abstract\n        loadMoreIfNeeded: function () {\n            var results = this.results,\n                more = results.find(\"li.select2-more-results\"),\n                below, // pixels the element is below the scroll fold, below==0 is when the element is starting to be visible\n                page = this.resultsPage + 1,\n                self=this,\n                term=this.search.val(),\n                context=this.context;\n\n            if (more.length === 0) return;\n            below = more.offset().top - results.offset().top - results.height();\n\n            if (below <= this.opts.loadMorePadding) {\n                more.addClass(\"select2-active\");\n                this.opts.query({\n                        element: this.opts.element,\n                        term: term,\n                        page: page,\n                        context: context,\n                        matcher: this.opts.matcher,\n                        callback: this.bind(function (data) {\n\n                    // ignore a response if the select2 has been closed before it was received\n                    if (!self.opened()) return;\n\n\n                    self.opts.populateResults.call(this, results, data.results, {term: term, page: page, context:context});\n                    self.postprocessResults(data, false, false);\n\n                    if (data.more===true) {\n                        more.detach().appendTo(results).html(self.opts.escapeMarkup(evaluate(self.opts.formatLoadMore, self.opts.element, page+1)));\n                        window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);\n                    } else {\n                        more.remove();\n                    }\n                    self.positionDropdown();\n                    self.resultsPage = page;\n                    self.context = data.context;\n                    this.opts.element.trigger({ type: \"select2-loaded\", items: data });\n                })});\n            }\n        },\n\n        /**\n         * Default tokenizer function which does nothing\n         */\n        tokenize: function() {\n\n        },\n\n        /**\n         * @param initial whether or not this is the call to this method right after the dropdown has been opened\n         */\n        // abstract\n        updateResults: function (initial) {\n            var search = this.search,\n                results = this.results,\n                opts = this.opts,\n                data,\n                self = this,\n                input,\n                term = search.val(),\n                lastTerm = $.data(this.container, \"select2-last-term\"),\n                // sequence number used to drop out-of-order responses\n                queryNumber;\n\n            // prevent duplicate queries against the same term\n            if (initial !== true && lastTerm && equal(term, lastTerm)) return;\n\n            $.data(this.container, \"select2-last-term\", term);\n\n            // if the search is currently hidden we do not alter the results\n            if (initial !== true && (this.showSearchInput === false || !this.opened())) {\n                return;\n            }\n\n            function postRender() {\n                search.removeClass(\"select2-active\");\n                self.positionDropdown();\n                if (results.find('.select2-no-results,.select2-selection-limit,.select2-searching').length) {\n                    self.liveRegion.text(results.text());\n                }\n                else {\n                    self.liveRegion.text(self.opts.formatMatches(results.find('.select2-result-selectable:not(\".select2-selected\")').length));\n                }\n            }\n\n            function render(html) {\n                results.html(html);\n                postRender();\n            }\n\n            queryNumber = ++this.queryCount;\n\n            var maxSelSize = this.getMaximumSelectionSize();\n            if (maxSelSize >=1) {\n                data = this.data();\n                if (Array.isArray(data) && data.length >= maxSelSize && checkFormatter(opts.formatSelectionTooBig, \"formatSelectionTooBig\")) {\n                    render(\"<li class='select2-selection-limit'>\" + evaluate(opts.formatSelectionTooBig, opts.element, maxSelSize) + \"</li>\");\n                    return;\n                }\n            }\n\n            if (search.val().length < opts.minimumInputLength) {\n                if (checkFormatter(opts.formatInputTooShort, \"formatInputTooShort\")) {\n                    render(\"<li class='select2-no-results'>\" + evaluate(opts.formatInputTooShort, opts.element, search.val(), opts.minimumInputLength) + \"</li>\");\n                } else {\n                    render(\"\");\n                }\n                if (initial && this.showSearch) this.showSearch(true);\n                return;\n            }\n\n            if (opts.maximumInputLength && search.val().length > opts.maximumInputLength) {\n                if (checkFormatter(opts.formatInputTooLong, \"formatInputTooLong\")) {\n                    render(\"<li class='select2-no-results'>\" + evaluate(opts.formatInputTooLong, opts.element, search.val(), opts.maximumInputLength) + \"</li>\");\n                } else {\n                    render(\"\");\n                }\n                return;\n            }\n\n            if (opts.formatSearching && this.findHighlightableChoices().length === 0) {\n                render(\"<li class='select2-searching'>\" + evaluate(opts.formatSearching, opts.element) + \"</li>\");\n            }\n\n            search.addClass(\"select2-active\");\n\n            this.removeHighlight();\n\n            // give the tokenizer a chance to pre-process the input\n            input = this.tokenize();\n            if (input != undefined && input != null) {\n                search.val(input);\n            }\n\n            this.resultsPage = 1;\n\n            opts.query({\n                element: opts.element,\n                    term: search.val(),\n                    page: this.resultsPage,\n                    context: null,\n                    matcher: opts.matcher,\n                    callback: this.bind(function (data) {\n                var def; // default choice\n\n                // ignore old responses\n                if (queryNumber != this.queryCount) {\n                  return;\n                }\n\n                // ignore a response if the select2 has been closed before it was received\n                if (!this.opened()) {\n                    this.search.removeClass(\"select2-active\");\n                    return;\n                }\n\n                // handle ajax error\n                if(data.hasError !== undefined && checkFormatter(opts.formatAjaxError, \"formatAjaxError\")) {\n                    render(\"<li class='select2-ajax-error'>\" + evaluate(opts.formatAjaxError, opts.element, data.jqXHR, data.textStatus, data.errorThrown) + \"</li>\");\n                    return;\n                }\n\n                // save context, if any\n                this.context = (data.context===undefined) ? null : data.context;\n                // create a default choice and prepend it to the list\n                if (this.opts.createSearchChoice && search.val() !== \"\") {\n                    def = this.opts.createSearchChoice.call(self, search.val(), data.results);\n                    if (def !== undefined && def !== null && self.id(def) !== undefined && self.id(def) !== null) {\n                        if ($(data.results).filter(\n                            function () {\n                                return equal(self.id(this), self.id(def));\n                            }).length === 0) {\n                            this.opts.createSearchChoicePosition(data.results, def);\n                        }\n                    }\n                }\n\n                if (data.results.length === 0 && checkFormatter(opts.formatNoMatches, \"formatNoMatches\")) {\n                    render(\"<li class='select2-no-results'>\" + evaluate(opts.formatNoMatches, opts.element, search.val()) + \"</li>\");\n                    if(this.showSearch){\n                        this.showSearch(search.val());\n                    }\n                    return;\n                }\n\n                results.empty();\n                self.opts.populateResults.call(this, results, data.results, {term: search.val(), page: this.resultsPage, context:null});\n\n                if (data.more === true && checkFormatter(opts.formatLoadMore, \"formatLoadMore\")) {\n                    results.append(\"<li class='select2-more-results'>\" + opts.escapeMarkup(evaluate(opts.formatLoadMore, opts.element, this.resultsPage)) + \"</li>\");\n                    window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);\n                }\n\n                this.postprocessResults(data, initial);\n\n                postRender();\n\n                this.opts.element.trigger({ type: \"select2-loaded\", items: data });\n            })});\n        },\n\n        // abstract\n        cancel: function () {\n            this.close();\n        },\n\n        // abstract\n        blur: function () {\n            // if selectOnBlur == true, select the currently highlighted option\n            if (this.opts.selectOnBlur)\n                this.selectHighlighted({noFocus: true});\n\n            this.close();\n            this.container.removeClass(\"select2-container-active\");\n            // synonymous to .is(':focus'), which is available in jquery >= 1.6\n            if (this.search[0] === document.activeElement) { this.search.trigger(\"blur\"); }\n            this.clearSearch();\n            this.selection.find(\".select2-search-choice-focus\").removeClass(\"select2-search-choice-focus\");\n        },\n\n        // abstract\n        focusSearch: function () {\n            focus(this.search);\n        },\n\n        // abstract\n        selectHighlighted: function (options) {\n            if (this._touchMoved) {\n              this.clearTouchMoved();\n              return;\n            }\n            var index=this.highlight(),\n                highlighted=this.results.find(\".select2-highlighted\"),\n                data = highlighted.closest('.select2-result').data(\"select2-data\");\n\n            if (data) {\n                this.highlight(index);\n                this.onSelect(data, options);\n            } else if (options && options.noFocus) {\n                this.close();\n            }\n        },\n\n        // abstract\n        getPlaceholder: function () {\n            var placeholderOption;\n            return this.opts.element.attr(\"placeholder\") ||\n                this.opts.element.attr(\"data-placeholder\") || // jquery 1.4 compat\n                this.opts.element.data(\"placeholder\") ||\n                this.opts.placeholder ||\n                ((placeholderOption = this.getPlaceholderOption()) !== undefined ? placeholderOption.text() : undefined);\n        },\n\n        // abstract\n        getPlaceholderOption: function() {\n            if (this.select) {\n                var firstOption = this.select.children('option').first();\n                if (this.opts.placeholderOption !== undefined ) {\n                    //Determine the placeholder option based on the specified placeholderOption setting\n                    return (this.opts.placeholderOption === \"first\" && firstOption) ||\n                           (typeof this.opts.placeholderOption === \"function\" && this.opts.placeholderOption(this.select));\n                } else if (firstOption.text() == null ? \"\" : firstOption.text().trim() === \"\" && firstOption.val() === \"\") {\n                    //No explicit placeholder option specified, use the first if it's blank\n                    return firstOption;\n                }\n            }\n        },\n\n        /**\n         * Get the desired width for the container element.  This is\n         * derived first from option `width` passed to select2, then\n         * the inline 'style' on the original element, and finally\n         * falls back to the jQuery calculated element width.\n         */\n        // abstract\n        initContainerWidth: function () {\n            function resolveContainerWidth() {\n                var style, attrs, matches, i, l, attr;\n\n                if (this.opts.width === \"off\") {\n                    return null;\n                } else if (this.opts.width === \"element\"){\n                    return this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px';\n                } else if (this.opts.width === \"copy\" || this.opts.width === \"resolve\") {\n                    // check if there is inline style on the element that contains width\n                    style = this.opts.element.attr('style');\n                    if (typeof(style) === \"string\") {\n                        attrs = style.split(';');\n                        for (i = 0, l = attrs.length; i < l; i = i + 1) {\n                            attr = attrs[i].replace(/\\s/g, '');\n                            matches = attr.match(/^width:(([-+]?([0-9]*\\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i);\n                            if (matches !== null && matches.length >= 1)\n                                return matches[1];\n                        }\n                    }\n\n                    if (this.opts.width === \"resolve\") {\n                        // next check if css('width') can resolve a width that is percent based, this is sometimes possible\n                        // when attached to input type=hidden or elements hidden via css\n                        style = this.opts.element.css('width');\n                        if (style.indexOf(\"%\") > 0) return style;\n\n                        // finally, fallback on the calculated width of the element\n                        return (this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px');\n                    }\n\n                    return null;\n                } else if (typeof this.opts.width === 'function') {\n                    return this.opts.width();\n                } else {\n                    return this.opts.width;\n               }\n            };\n\n            var width = resolveContainerWidth.call(this);\n            if (width !== null) {\n                this.container.css(\"width\", width);\n            }\n        }\n    });\n\n    SingleSelect2 = clazz(AbstractSelect2, {\n\n        // single\n\n        createContainer: function () {\n            var container = $(document.createElement(\"div\")).attr({\n                \"class\": \"select2-container\"\n            }).html([\n                \"<a role='button' class='select2-choice' tabindex='-1'>\",\n                \"   <span class='select2-chosen'>&#160;</span><abbr class='select2-search-choice-close'></abbr>\",\n                \"   <span class='select2-arrow' role='presentation'><b role='presentation'></b></span>\",\n                \"</a>\",\n                \"<label for='' class='select2-offscreen'></label>\",\n                \"<input class='select2-focusser select2-offscreen' type='text' aria-haspopup='true' role='button' />\",\n                \"<div class='select2-drop select2-display-none'>\",\n                \"   <div class='select2-search'>\",\n                \"       <label for='' class='select2-offscreen'></label>\",\n                \"       <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input' role='combobox' aria-expanded='true'\",\n                \"       aria-autocomplete='list' />\",\n                \"   </div>\",\n                \"   <ul class='select2-results' role='listbox'>\",\n                \"   </ul>\",\n                \"</div>\"].join(\"\"));\n            return container;\n        },\n\n        // single\n        enableInterface: function() {\n            if (this.parent.enableInterface.apply(this, arguments)) {\n                this.focusser.prop(\"disabled\", !this.isInterfaceEnabled());\n            }\n        },\n\n        // single\n        opening: function () {\n            var el, range, len;\n\n            if (this.opts.minimumResultsForSearch >= 0) {\n                this.showSearch(true);\n            }\n\n            this.parent.opening.apply(this, arguments);\n\n            if (this.showSearchInput !== false) {\n                // IE appends focusser.val() at the end of field :/ so we manually insert it at the beginning using a range\n                // all other browsers handle this just fine\n\n                this.search.val(this.focusser.val());\n            }\n            if (this.opts.shouldFocusInput(this)) {\n                this.search.trigger(\"focus\");\n                // move the cursor to the end after focussing, otherwise it will be at the beginning and\n                // new text will appear *before* focusser.val()\n                el = this.search.get(0);\n                if (el.createTextRange) {\n                    range = el.createTextRange();\n                    range.collapse(false);\n                    range.select();\n                } else if (el.setSelectionRange) {\n                    len = this.search.val().length;\n                    el.setSelectionRange(len, len);\n                }\n            }\n\n            this.prefillNextSearchTerm();\n\n            this.focusser.prop(\"disabled\", true).val(\"\");\n            this.updateResults(true);\n            this.opts.element.trigger($.Event(\"select2-open\"));\n        },\n\n        // single\n        close: function () {\n            if (!this.opened()) return;\n            this.parent.close.apply(this, arguments);\n\n            this.focusser.prop(\"disabled\", false);\n\n            if (this.opts.shouldFocusInput(this)) {\n                this.focusser.trigger(\"focus\");\n            }\n        },\n\n        // single\n        focus: function () {\n            if (this.opened()) {\n                this.close();\n            } else {\n                this.focusser.prop(\"disabled\", false);\n                if (this.opts.shouldFocusInput(this)) {\n                    this.focusser.trigger(\"focus\");\n                }\n            }\n        },\n\n        // single\n        isFocused: function () {\n            return this.container.hasClass(\"select2-container-active\");\n        },\n\n        // single\n        cancel: function () {\n            this.parent.cancel.apply(this, arguments);\n            this.focusser.prop(\"disabled\", false);\n\n            if (this.opts.shouldFocusInput(this)) {\n                this.focusser.trigger(\"focus\");\n            }\n        },\n\n        // single\n        destroy: function() {\n            $(\"label[for='\" + this.focusser.attr('id') + \"']\")\n                .attr('for', this.opts.element.attr(\"id\"));\n            this.parent.destroy.apply(this, arguments);\n\n            cleanupJQueryElements.call(this,\n                \"selection\",\n                \"focusser\"\n            );\n        },\n\n        // single\n        initContainer: function () {\n\n            var selection,\n                container = this.container,\n                dropdown = this.dropdown,\n                idSuffix = nextUid(),\n                elementLabel;\n\n            if (this.opts.minimumResultsForSearch < 0) {\n                this.showSearch(false);\n            } else {\n                this.showSearch(true);\n            }\n\n            this.selection = selection = container.find(\".select2-choice\");\n\n            this.focusser = container.find(\".select2-focusser\");\n\n            // add aria associations\n            selection.find(\".select2-chosen\").attr(\"id\", \"select2-chosen-\"+idSuffix);\n            this.focusser.attr(\"aria-labelledby\", \"select2-chosen-\"+idSuffix);\n            this.results.attr(\"id\", \"select2-results-\"+idSuffix);\n            this.search.attr(\"aria-owns\", \"select2-results-\"+idSuffix);\n\n            // rewrite labels from original element to focusser\n            this.focusser.attr(\"id\", \"s2id_autogen\"+idSuffix);\n\n            elementLabel = $(\"label[for='\" + this.opts.element.attr(\"id\") + \"']\");\n            this.opts.element.on('focus.select2', this.bind(function () { this.focus(); }));\n\n            this.focusser.prev()\n                .text(elementLabel.text())\n                .attr('for', this.focusser.attr('id'));\n\n            // Ensure the original element retains an accessible name\n            var originalTitle = this.opts.element.attr(\"title\");\n            this.opts.element.attr(\"title\", (originalTitle || elementLabel.text()));\n\n            this.focusser.attr(\"tabindex\", this.elementTabIndex);\n\n            // write label for search field using the label from the focusser element\n            this.search.attr(\"id\", this.focusser.attr('id') + '_search');\n\n            this.search.prev()\n                .text($(\"label[for='\" + this.focusser.attr('id') + \"']\").text())\n                .attr('for', this.search.attr('id'));\n\n            this.search.on(\"keydown\", this.bind(function (e) {\n                if (!this.isInterfaceEnabled()) return;\n\n                // filter 229 keyCodes (input method editor is processing key input)\n                if (229 == e.keyCode) return;\n\n                if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {\n                    // prevent the page from scrolling\n                    killEvent(e);\n                    return;\n                }\n\n                switch (e.which) {\n                    case KEY.UP:\n                    case KEY.DOWN:\n                        this.moveHighlight((e.which === KEY.UP) ? -1 : 1);\n                        killEvent(e);\n                        return;\n                    case KEY.ENTER:\n                        this.selectHighlighted();\n                        killEvent(e);\n                        return;\n                    case KEY.TAB:\n                        this.selectHighlighted({noFocus: true});\n                        return;\n                    case KEY.ESC:\n                        this.cancel(e);\n                        killEvent(e);\n                        return;\n                }\n            }));\n\n            this.search.on(\"blur\", this.bind(function(e) {\n                // a workaround for chrome to keep the search field focussed when the scroll bar is used to scroll the dropdown.\n                // without this the search field loses focus which is annoying\n                if (document.activeElement === this.body.get(0)) {\n                    window.setTimeout(this.bind(function() {\n                        if (this.opened() && this.results && this.results.length > 1) {\n                            this.search.trigger(\"focus\");\n                        }\n                    }), 0);\n                }\n            }));\n\n            this.focusser.on(\"keydown\", this.bind(function (e) {\n                if (!this.isInterfaceEnabled()) return;\n\n                if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC) {\n                    return;\n                }\n\n                if (this.opts.openOnEnter === false && e.which === KEY.ENTER) {\n                    killEvent(e);\n                    return;\n                }\n\n                if (e.which == KEY.DOWN || e.which == KEY.UP\n                    || (e.which == KEY.ENTER && this.opts.openOnEnter)) {\n\n                    if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) return;\n\n                    this.open();\n                    killEvent(e);\n                    return;\n                }\n\n                if (e.which == KEY.DELETE || e.which == KEY.BACKSPACE) {\n                    if (this.opts.allowClear) {\n                        this.clear();\n                    }\n                    killEvent(e);\n                    return;\n                }\n            }));\n\n\n            installKeyUpChangeEvent(this.focusser);\n            this.focusser.on(\"keyup-change input\", this.bind(function(e) {\n                if (this.opts.minimumResultsForSearch >= 0) {\n                    e.stopPropagation();\n                    if (this.opened()) return;\n                    this.open();\n                }\n            }));\n\n            selection.on(\"mousedown touchstart\", \"abbr\", this.bind(function (e) {\n                if (!this.isInterfaceEnabled()) {\n                    return;\n                }\n\n                this.clear();\n                killEventImmediately(e);\n                this.close();\n\n                if (this.selection) {\n                    this.selection.trigger(\"focus\");\n                }\n            }));\n\n            selection.on(\"mousedown touchstart\", this.bind(function (e) {\n                // Prevent IE from generating a click event on the body\n                reinsertElement(selection);\n\n                if (!this.container.hasClass(\"select2-container-active\")) {\n                    this.opts.element.trigger($.Event(\"select2-focus\"));\n                }\n\n                if (this.opened()) {\n                    this.close();\n                } else if (this.isInterfaceEnabled()) {\n                    this.open();\n                }\n\n                killEvent(e);\n            }));\n\n            dropdown.on(\"mousedown touchstart\", this.bind(function() {\n                if (this.opts.shouldFocusInput(this)) {\n                    this.search.trigger(\"focus\");\n                }\n            }));\n\n            selection.on(\"focus\", this.bind(function(e) {\n                killEvent(e);\n            }));\n\n            this.focusser.on(\"focus\", this.bind(function(){\n                if (!this.container.hasClass(\"select2-container-active\")) {\n                    this.opts.element.trigger($.Event(\"select2-focus\"));\n                }\n                this.container.addClass(\"select2-container-active\");\n            })).on(\"blur\", this.bind(function() {\n                if (!this.opened()) {\n                    this.container.removeClass(\"select2-container-active\");\n                    this.opts.element.trigger($.Event(\"select2-blur\"));\n                }\n            }));\n            this.search.on(\"focus\", this.bind(function(){\n                if (!this.container.hasClass(\"select2-container-active\")) {\n                    this.opts.element.trigger($.Event(\"select2-focus\"));\n                }\n                this.container.addClass(\"select2-container-active\");\n            }));\n\n            this.initContainerWidth();\n            this.opts.element.hide();\n            this.setPlaceholder();\n\n        },\n\n        // single\n        clear: function(triggerChange) {\n            var data=this.selection.data(\"select2-data\");\n            if (data) { // guard against queued quick consecutive clicks\n                var evt = $.Event(\"select2-clearing\");\n                this.opts.element.trigger(evt);\n                if (evt.isDefaultPrevented()) {\n                    return;\n                }\n                var placeholderOption = this.getPlaceholderOption();\n                this.opts.element.val(placeholderOption ? placeholderOption.val() : \"\");\n                this.selection.find(\".select2-chosen\").empty();\n                this.selection.removeData(\"select2-data\");\n                this.setPlaceholder();\n\n                if (triggerChange !== false){\n                    this.opts.element.trigger({ type: \"select2-removed\", val: this.id(data), choice: data });\n                    this.triggerChange({removed:data});\n                }\n            }\n        },\n\n        /**\n         * Sets selection based on source element's value\n         */\n        // single\n        initSelection: function () {\n            var selected;\n            if (this.isPlaceholderOptionSelected()) {\n                this.updateSelection(null);\n                this.close();\n                this.setPlaceholder();\n            } else {\n                var self = this;\n                this.opts.initSelection.call(null, this.opts.element, function(selected){\n                    if (selected !== undefined && selected !== null) {\n                        self.updateSelection(selected);\n                        self.close();\n                        self.setPlaceholder();\n                        self.lastSearchTerm = self.search.val();\n                    }\n                });\n            }\n        },\n\n        isPlaceholderOptionSelected: function() {\n            var placeholderOption;\n            if (this.getPlaceholder() === undefined) return false; // no placeholder specified so no option should be considered\n            return ((placeholderOption = this.getPlaceholderOption()) !== undefined && placeholderOption.prop(\"selected\"))\n                || (this.opts.element.val() === \"\")\n                || (this.opts.element.val() === undefined)\n                || (this.opts.element.val() === null);\n        },\n\n        // single\n        prepareOpts: function () {\n            var opts = this.parent.prepareOpts.apply(this, arguments),\n                self=this;\n\n            if (opts.element.get(0).tagName.toLowerCase() === \"select\") {\n                // install the selection initializer\n                opts.initSelection = function (element, callback) {\n                    var selected = element.find(\"option\").filter(function() { return this.selected && !this.disabled });\n                    // a single select box always has a value, no need to null check 'selected'\n                    callback(self.optionToData(selected));\n                };\n            } else if (\"data\" in opts) {\n                // install default initSelection when applied to hidden input and data is local\n                opts.initSelection = opts.initSelection || function (element, callback) {\n                    var id = element.val();\n                    //search in data by id, storing the actual matching item\n                    var match = null;\n                    opts.query({\n                        matcher: function(term, text, el){\n                            var is_match = equal(id, opts.id(el));\n                            if (is_match) {\n                                match = el;\n                            }\n                            return is_match;\n                        },\n                        callback: typeof callback !== 'function' ? $.noop : function() {\n                            callback(match);\n                        }\n                    });\n                };\n            }\n\n            return opts;\n        },\n\n        // single\n        getPlaceholder: function() {\n            // if a placeholder is specified on a single select without a valid placeholder option ignore it\n            if (this.select) {\n                if (this.getPlaceholderOption() === undefined) {\n                    return undefined;\n                }\n            }\n\n            return this.parent.getPlaceholder.apply(this, arguments);\n        },\n\n        // single\n        setPlaceholder: function () {\n            var placeholder = this.getPlaceholder();\n\n            if (this.isPlaceholderOptionSelected() && placeholder !== undefined) {\n\n                // check for a placeholder option if attached to a select\n                if (this.select && this.getPlaceholderOption() === undefined) return;\n\n                this.selection.find(\".select2-chosen\").html(this.opts.escapeMarkup(placeholder));\n\n                this.selection.addClass(\"select2-default\");\n\n                this.container.removeClass(\"select2-allowclear\");\n            }\n        },\n\n        // single\n        postprocessResults: function (data, initial, noHighlightUpdate) {\n            var selected = 0, self = this, showSearchInput = true;\n\n            // find the selected element in the result list\n\n            this.findHighlightableChoices().each2(function (i, elm) {\n                if (equal(self.id(elm.data(\"select2-data\")), self.opts.element.val())) {\n                    selected = i;\n                    return false;\n                }\n            });\n\n            // and highlight it\n            if (noHighlightUpdate !== false) {\n                if (initial === true && selected >= 0) {\n                    this.highlight(selected);\n                } else {\n                    this.highlight(0);\n                }\n            }\n\n            // hide the search box if this is the first we got the results and there are enough of them for search\n\n            if (initial === true) {\n                var min = this.opts.minimumResultsForSearch;\n                if (min >= 0) {\n                    this.showSearch(countResults(data.results) >= min);\n                }\n            }\n        },\n\n        // single\n        showSearch: function(showSearchInput) {\n            if (this.showSearchInput === showSearchInput) return;\n\n            this.showSearchInput = showSearchInput;\n\n            this.dropdown.find(\".select2-search\").toggleClass(\"select2-search-hidden\", !showSearchInput);\n            this.dropdown.find(\".select2-search\").toggleClass(\"select2-offscreen\", !showSearchInput);\n            //add \"select2-with-searchbox\" to the container if search box is shown\n            $(this.dropdown, this.container).toggleClass(\"select2-with-searchbox\", showSearchInput);\n        },\n\n        // single\n        onSelect: function (data, options) {\n\n            if (!this.triggerSelect(data)) { return; }\n\n            var old = this.opts.element.val(),\n                oldData = this.data();\n\n            this.opts.element.val(this.id(data));\n            this.updateSelection(data);\n\n            this.opts.element.trigger({ type: \"select2-selected\", val: this.id(data), choice: data });\n\n            this.lastSearchTerm = this.search.val();\n            this.close();\n\n            if ((!options || !options.noFocus) && this.opts.shouldFocusInput(this)) {\n                this.focusser.trigger(\"focus\");\n            }\n\n            if (!equal(old, this.id(data))) {\n                this.triggerChange({ added: data, removed: oldData });\n            }\n        },\n\n        // single\n        updateSelection: function (data) {\n\n            var container=this.selection.find(\".select2-chosen\"), formatted, cssClass;\n\n            this.selection.data(\"select2-data\", data);\n\n            container.empty();\n            if (data !== null) {\n                formatted=this.opts.formatSelection(data, container, this.opts.escapeMarkup);\n            }\n            if (formatted !== undefined) {\n                container.append(formatted);\n            }\n            cssClass=this.opts.formatSelectionCssClass(data, container);\n            if (cssClass !== undefined) {\n                container.addClass(cssClass);\n            }\n\n            this.selection.removeClass(\"select2-default\");\n\n            if (this.opts.allowClear && this.getPlaceholder() !== undefined) {\n                this.container.addClass(\"select2-allowclear\");\n            }\n        },\n\n        // single\n        val: function () {\n            var val,\n                triggerChange = false,\n                data = null,\n                self = this,\n                oldData = this.data();\n\n            if (arguments.length === 0) {\n                return this.opts.element.val();\n            }\n\n            val = arguments[0];\n\n            if (arguments.length > 1) {\n                triggerChange = arguments[1];\n\n                if (this.opts.debug && console && console.warn) {\n                    console.warn(\n                        'Select2: The second option to `select2(\"val\")` is not supported in Select2 4.0.0. ' +\n                        'The `change` event will always be triggered in 4.0.0.'\n                    );\n                }\n            }\n\n            if (this.select) {\n                if (this.opts.debug && console && console.warn) {\n                    console.warn(\n                        'Select2: Setting the value on a <select> using `select2(\"val\")` is no longer supported in 4.0.0. ' +\n                        'You can use the `.val(newValue).trigger(\"change\")` method provided by jQuery instead.'\n                    );\n                }\n\n                this.select\n                    .val(val)\n                    .find(\"option\").filter(function() { return this.selected }).each2(function (i, elm) {\n                        data = self.optionToData(elm);\n                        return false;\n                    });\n                this.updateSelection(data);\n                this.setPlaceholder();\n                if (triggerChange) {\n                    this.triggerChange({added: data, removed:oldData});\n                }\n            } else {\n                // val is an id. !val is true for [undefined,null,'',0] - 0 is legal\n                if (!val && val !== 0) {\n                    this.clear(triggerChange);\n                    return;\n                }\n                if (this.opts.initSelection === undefined) {\n                    throw new Error(\"cannot call val() if initSelection() is not defined\");\n                }\n                this.opts.element.val(val);\n                this.opts.initSelection(this.opts.element, function(data){\n                    self.opts.element.val(!data ? \"\" : self.id(data));\n                    self.updateSelection(data);\n                    self.setPlaceholder();\n                    if (triggerChange) {\n                        self.triggerChange({added: data, removed:oldData});\n                    }\n                });\n            }\n        },\n\n        // single\n        clearSearch: function () {\n            this.search.val(\"\");\n            this.focusser.val(\"\");\n        },\n\n        // single\n        data: function(value) {\n            var data,\n                triggerChange = false;\n\n            if (arguments.length === 0) {\n                data = this.selection.data(\"select2-data\");\n                if (data == undefined) data = null;\n                return data;\n            } else {\n                if (this.opts.debug && console && console.warn) {\n                    console.warn(\n                        'Select2: The `select2(\"data\")` method can no longer set selected values in 4.0.0, ' +\n                        'consider using the `.val()` method instead.'\n                    );\n                }\n\n                if (arguments.length > 1) {\n                    triggerChange = arguments[1];\n                }\n                if (!value) {\n                    this.clear(triggerChange);\n                } else {\n                    data = this.data();\n                    this.opts.element.val(!value ? \"\" : this.id(value));\n                    this.updateSelection(value);\n                    if (triggerChange) {\n                        this.triggerChange({added: value, removed:data});\n                    }\n                }\n            }\n        }\n    });\n\n    MultiSelect2 = clazz(AbstractSelect2, {\n\n        // multi\n        createContainer: function () {\n            var container = $(document.createElement(\"div\")).attr({\n                \"class\": \"select2-container select2-container-multi\"\n            }).html([\n                \"<ul class='select2-choices'>\",\n                \"  <li class='select2-search-field'>\",\n                \"    <label for='' class='select2-offscreen'></label>\",\n                \"    <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input'>\",\n                \"  </li>\",\n                \"</ul>\",\n                \"<div class='select2-drop select2-drop-multi select2-display-none'>\",\n                \"   <ul class='select2-results'>\",\n                \"   </ul>\",\n                \"</div>\"].join(\"\"));\n            return container;\n        },\n\n        // multi\n        prepareOpts: function () {\n            var opts = this.parent.prepareOpts.apply(this, arguments),\n                self=this;\n\n            // TODO validate placeholder is a string if specified\n            if (opts.element.get(0).tagName.toLowerCase() === \"select\") {\n                // install the selection initializer\n                opts.initSelection = function (element, callback) {\n\n                    var data = [];\n\n                    element.find(\"option\").filter(function() { return this.selected && !this.disabled }).each2(function (i, elm) {\n                        data.push(self.optionToData(elm));\n                    });\n                    callback(data);\n                };\n            } else if (\"data\" in opts) {\n                // install default initSelection when applied to hidden input and data is local\n                opts.initSelection = opts.initSelection || function (element, callback) {\n                    var ids = splitVal(element.val(), opts.separator, opts.transformVal);\n                    //search in data by array of ids, storing matching items in a list\n                    var matches = [];\n                    opts.query({\n                        matcher: function(term, text, el){\n                            var is_match = $.grep(ids, function(id) {\n                                return equal(id, opts.id(el));\n                            }).length;\n                            if (is_match) {\n                                matches.push(el);\n                            }\n                            return is_match;\n                        },\n                        callback: typeof callback !== 'function' ? $.noop : function() {\n                            // reorder matches based on the order they appear in the ids array because right now\n                            // they are in the order in which they appear in data array\n                            var ordered = [];\n                            for (var i = 0; i < ids.length; i++) {\n                                var id = ids[i];\n                                for (var j = 0; j < matches.length; j++) {\n                                    var match = matches[j];\n                                    if (equal(id, opts.id(match))) {\n                                        ordered.push(match);\n                                        matches.splice(j, 1);\n                                        break;\n                                    }\n                                }\n                            }\n                            callback(ordered);\n                        }\n                    });\n                };\n            }\n\n            return opts;\n        },\n\n        // multi\n        selectChoice: function (choice) {\n\n            var selected = this.container.find(\".select2-search-choice-focus\");\n            if (selected.length && choice && choice[0] == selected[0]) {\n\n            } else {\n                if (selected.length) {\n                    this.opts.element.trigger(\"choice-deselected\", selected);\n                }\n                selected.removeClass(\"select2-search-choice-focus\");\n                if (choice && choice.length) {\n                    this.close();\n                    choice.addClass(\"select2-search-choice-focus\");\n                    this.opts.element.trigger(\"choice-selected\", choice);\n                }\n            }\n        },\n\n        // multi\n        destroy: function() {\n            $(\"label[for='\" + this.search.attr('id') + \"']\")\n                .attr('for', this.opts.element.attr(\"id\"));\n            this.parent.destroy.apply(this, arguments);\n\n            cleanupJQueryElements.call(this,\n                \"searchContainer\",\n                \"selection\"\n            );\n        },\n\n        // multi\n        initContainer: function () {\n\n            var selector = \".select2-choices\", selection;\n\n            this.searchContainer = this.container.find(\".select2-search-field\");\n            this.selection = selection = this.container.find(selector);\n\n            var _this = this;\n            this.selection.on(\"click\", \".select2-container:not(.select2-container-disabled) .select2-search-choice:not(.select2-locked)\", function (e) {\n                _this.search[0].focus();\n                _this.selectChoice($(this));\n            });\n\n            // rewrite labels from original element to focusser\n            this.search.attr(\"id\", \"s2id_autogen\"+nextUid());\n\n            this.search.prev()\n                .text($(\"label[for='\" + this.opts.element.attr(\"id\") + \"']\").text())\n                .attr('for', this.search.attr('id'));\n            this.opts.element.on('focus.select2', this.bind(function () { this.focus(); }));\n\n            this.search.on(\"input paste\", this.bind(function() {\n                if (this.search.attr('placeholder') && this.search.val().length == 0) return;\n                if (!this.isInterfaceEnabled()) return;\n                if (!this.opened()) {\n                    this.open();\n                }\n            }));\n\n            this.search.attr(\"tabindex\", this.elementTabIndex);\n\n            this.keydowns = 0;\n            this.search.on(\"keydown\", this.bind(function (e) {\n                if (!this.isInterfaceEnabled()) return;\n\n                ++this.keydowns;\n                var selected = selection.find(\".select2-search-choice-focus\");\n                var prev = selected.prev(\".select2-search-choice:not(.select2-locked)\");\n                var next = selected.next(\".select2-search-choice:not(.select2-locked)\");\n                var pos = getCursorInfo(this.search);\n\n                if (selected.length &&\n                    (e.which == KEY.LEFT || e.which == KEY.RIGHT || e.which == KEY.BACKSPACE || e.which == KEY.DELETE || e.which == KEY.ENTER)) {\n                    var selectedChoice = selected;\n                    if (e.which == KEY.LEFT && prev.length) {\n                        selectedChoice = prev;\n                    }\n                    else if (e.which == KEY.RIGHT) {\n                        selectedChoice = next.length ? next : null;\n                    }\n                    else if (e.which === KEY.BACKSPACE) {\n                        if (this.unselect(selected.first())) {\n                            this.search.width(10);\n                            selectedChoice = prev.length ? prev : next;\n                        }\n                    } else if (e.which == KEY.DELETE) {\n                        if (this.unselect(selected.first())) {\n                            this.search.width(10);\n                            selectedChoice = next.length ? next : null;\n                        }\n                    } else if (e.which == KEY.ENTER) {\n                        selectedChoice = null;\n                    }\n\n                    this.selectChoice(selectedChoice);\n                    killEvent(e);\n                    if (!selectedChoice || !selectedChoice.length) {\n                        this.open();\n                    }\n                    return;\n                } else if (((e.which === KEY.BACKSPACE && this.keydowns == 1)\n                    || e.which == KEY.LEFT) && (pos.offset == 0 && !pos.length)) {\n\n                    this.selectChoice(selection.find(\".select2-search-choice:not(.select2-locked)\").last());\n                    killEvent(e);\n                    return;\n                } else {\n                    this.selectChoice(null);\n                }\n\n                if (this.opened()) {\n                    switch (e.which) {\n                    case KEY.UP:\n                    case KEY.DOWN:\n                        this.moveHighlight((e.which === KEY.UP) ? -1 : 1);\n                        killEvent(e);\n                        return;\n                    case KEY.ENTER:\n                        this.selectHighlighted();\n                        killEvent(e);\n                        return;\n                    case KEY.TAB:\n                        this.selectHighlighted({noFocus:true});\n                        this.close();\n                        return;\n                    case KEY.ESC:\n                        this.cancel(e);\n                        killEvent(e);\n                        return;\n                    }\n                }\n\n                if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e)\n                 || e.which === KEY.BACKSPACE || e.which === KEY.ESC) {\n                    return;\n                }\n\n                if (e.which === KEY.ENTER) {\n                    if (this.opts.openOnEnter === false) {\n                        return;\n                    } else if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) {\n                        return;\n                    }\n                }\n\n                this.open();\n\n                if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {\n                    // prevent the page from scrolling\n                    killEvent(e);\n                }\n\n                if (e.which === KEY.ENTER) {\n                    // prevent form from being submitted\n                    killEvent(e);\n                }\n\n            }));\n\n            this.search.on(\"keyup\", this.bind(function (e) {\n                this.keydowns = 0;\n                this.resizeSearch();\n            })\n            );\n\n            this.search.on(\"blur\", this.bind(function(e) {\n                this.container.removeClass(\"select2-container-active\");\n                this.search.removeClass(\"select2-focused\");\n                this.selectChoice(null);\n                if (!this.opened()) this.clearSearch();\n                e.stopImmediatePropagation();\n                this.opts.element.trigger($.Event(\"select2-blur\"));\n            }));\n\n            this.container.on(\"click\", selector, this.bind(function (e) {\n                if (!this.isInterfaceEnabled()) return;\n                if ($(e.target).closest(\".select2-search-choice\").length > 0) {\n                    // clicked inside a select2 search choice, do not open\n                    return;\n                }\n                this.selectChoice(null);\n                this.clearPlaceholder();\n                if (!this.container.hasClass(\"select2-container-active\")) {\n                    this.opts.element.trigger($.Event(\"select2-focus\"));\n                }\n                this.open();\n                this.focusSearch();\n                e.preventDefault();\n            }));\n\n            this.container.on(\"focus\", selector, this.bind(function () {\n                if (!this.isInterfaceEnabled()) return;\n                if (!this.container.hasClass(\"select2-container-active\")) {\n                    this.opts.element.trigger($.Event(\"select2-focus\"));\n                }\n                this.container.addClass(\"select2-container-active\");\n                this.dropdown.addClass(\"select2-drop-active\");\n                this.clearPlaceholder();\n            }));\n\n            this.initContainerWidth();\n            this.opts.element.hide();\n\n            // set the placeholder if necessary\n            this.clearSearch();\n        },\n\n        // multi\n        enableInterface: function() {\n            if (this.parent.enableInterface.apply(this, arguments)) {\n                this.search.prop(\"disabled\", !this.isInterfaceEnabled());\n            }\n        },\n\n        // multi\n        initSelection: function () {\n            var data;\n            if (this.opts.element.val() === \"\" && this.opts.element.text() === \"\") {\n                this.updateSelection([]);\n                this.close();\n                // set the placeholder if necessary\n                this.clearSearch();\n            }\n            if (this.select || this.opts.element.val() !== \"\") {\n                var self = this;\n                this.opts.initSelection.call(null, this.opts.element, function(data){\n                    if (data !== undefined && data !== null) {\n                        self.updateSelection(data);\n                        self.close();\n                        // set the placeholder if necessary\n                        self.clearSearch();\n                    }\n                });\n            }\n        },\n\n        // multi\n        clearSearch: function () {\n            var placeholder = this.getPlaceholder(),\n                maxWidth = this.getMaxSearchWidth();\n\n            if (placeholder !== undefined  && this.getVal().length === 0 && this.search.hasClass(\"select2-focused\") === false) {\n                this.search.val(placeholder).addClass(\"select2-default\");\n                // stretch the search box to full width of the container so as much of the placeholder is visible as possible\n                // we could call this.resizeSearch(), but we do not because that requires a sizer and we do not want to create one so early because of a firefox bug, see #944\n                this.search.width(maxWidth > 0 ? maxWidth : this.container.css(\"width\"));\n            } else {\n                this.search.val(\"\").width(10);\n            }\n        },\n\n        // multi\n        clearPlaceholder: function () {\n            if (this.search.hasClass(\"select2-default\")) {\n                this.search.val(\"\").removeClass(\"select2-default\");\n            }\n        },\n\n        // multi\n        opening: function () {\n            this.clearPlaceholder(); // should be done before super so placeholder is not used to search\n            this.resizeSearch();\n\n            this.parent.opening.apply(this, arguments);\n\n            this.focusSearch();\n\n            this.prefillNextSearchTerm();\n            this.updateResults(true);\n\n            if (this.opts.shouldFocusInput(this)) {\n                this.search.trigger(\"focus\");\n            }\n            this.opts.element.trigger($.Event(\"select2-open\"));\n        },\n\n        // multi\n        close: function () {\n            if (!this.opened()) return;\n            this.parent.close.apply(this, arguments);\n        },\n\n        // multi\n        focus: function () {\n            this.close();\n            this.search.trigger(\"focus\");\n        },\n\n        // multi\n        isFocused: function () {\n            return this.search.hasClass(\"select2-focused\");\n        },\n\n        // multi\n        updateSelection: function (data) {\n            var ids = {}, filtered = [], self = this;\n\n            // filter out duplicates\n            $(data).each(function () {\n                if (!(self.id(this) in ids)) {\n                    ids[self.id(this)] = 0;\n                    filtered.push(this);\n                }\n            });\n\n            this.selection.find(\".select2-search-choice\").remove();\n            this.addSelectedChoice(filtered);\n            self.postprocessResults();\n        },\n\n        // multi\n        tokenize: function() {\n            var input = this.search.val();\n            input = this.opts.tokenizer.call(this, input, this.data(), this.bind(this.onSelect), this.opts);\n            if (input != null && input != undefined) {\n                this.search.val(input);\n                if (input.length > 0) {\n                    this.open();\n                }\n            }\n\n        },\n\n        // multi\n        onSelect: function (data, options) {\n\n            if (!this.triggerSelect(data) || data.text === \"\") { return; }\n\n            this.addSelectedChoice(data);\n\n            this.opts.element.trigger({ type: \"selected\", val: this.id(data), choice: data });\n\n            // keep track of the search's value before it gets cleared\n            this.lastSearchTerm = this.search.val();\n\n            this.clearSearch();\n            this.updateResults();\n\n            if (this.select || !this.opts.closeOnSelect) this.postprocessResults(data, false, this.opts.closeOnSelect===true);\n\n            if (this.opts.closeOnSelect) {\n                this.close();\n                this.search.width(10);\n            } else {\n                if (this.countSelectableResults()>0) {\n                    this.search.width(10);\n                    this.resizeSearch();\n                    if (this.getMaximumSelectionSize() > 0 && this.val().length >= this.getMaximumSelectionSize()) {\n                        // if we reached max selection size repaint the results so choices\n                        // are replaced with the max selection reached message\n                        this.updateResults(true);\n                    } else {\n                        // initializes search's value with nextSearchTerm and update search result\n                        if (this.prefillNextSearchTerm()) {\n                            this.updateResults();\n                        }\n                    }\n                    this.positionDropdown();\n                } else {\n                    // if nothing left to select close\n                    this.close();\n                    this.search.width(10);\n                }\n            }\n\n            // since its not possible to select an element that has already been\n            // added we do not need to check if this is a new element before firing change\n            this.triggerChange({ added: data });\n\n            if (!options || !options.noFocus)\n                this.focusSearch();\n        },\n\n        // multi\n        cancel: function () {\n            this.close();\n            this.focusSearch();\n        },\n\n        addSelectedChoice: function (data) {\n            var val = this.getVal(), self = this;\n            $(data).each(function () {\n                val.push(self.createChoice(this));\n            });\n            this.setVal(val);\n        },\n\n        createChoice: function (data) {\n            var enableChoice = !data.locked,\n                enabledItem = $(\n                    \"<li class='select2-search-choice'>\" +\n                    \"    <div></div>\" +\n                    \"    <a href='#' class='select2-search-choice-close' tabindex='-1'></a>\" +\n                    \"</li>\"),\n                disabledItem = $(\n                    \"<li class='select2-search-choice select2-locked'>\" +\n                    \"<div></div>\" +\n                    \"</li>\");\n            var choice = enableChoice ? enabledItem : disabledItem,\n                id = this.id(data),\n                formatted,\n                cssClass;\n\n            formatted=this.opts.formatSelection(data, choice.find(\"div\"), this.opts.escapeMarkup);\n            if (formatted != undefined) {\n                choice.find(\"div\").replaceWith($(\"<div></div>\").html(formatted));\n            }\n            cssClass=this.opts.formatSelectionCssClass(data, choice.find(\"div\"));\n            if (cssClass != undefined) {\n                choice.addClass(cssClass);\n            }\n\n            if(enableChoice){\n              choice.find(\".select2-search-choice-close\")\n                  .on(\"mousedown\", killEvent)\n                  .on(\"click dblclick\", this.bind(function (e) {\n                  if (!this.isInterfaceEnabled()) return;\n\n                  this.unselect($(e.target));\n                  this.selection.find(\".select2-search-choice-focus\").removeClass(\"select2-search-choice-focus\");\n                  killEvent(e);\n                  this.close();\n                  this.focusSearch();\n              })).on(\"focus\", this.bind(function () {\n                  if (!this.isInterfaceEnabled()) return;\n                  this.container.addClass(\"select2-container-active\");\n                  this.dropdown.addClass(\"select2-drop-active\");\n              }));\n            }\n\n            choice.data(\"select2-data\", data);\n            choice.insertBefore(this.searchContainer);\n\n            return id;\n        },\n\n        // multi\n        unselect: function (selected) {\n            var val = this.getVal(),\n                data,\n                index;\n            selected = selected.closest(\".select2-search-choice\");\n\n            if (selected.length === 0) {\n                throw \"Invalid argument: \" + selected + \". Must be .select2-search-choice\";\n            }\n\n            data = selected.data(\"select2-data\");\n\n            if (!data) {\n                // prevent a race condition when the 'x' is clicked really fast repeatedly the event can be queued\n                // and invoked on an element already removed\n                return;\n            }\n\n            var evt = $.Event(\"select2-removing\");\n            evt.val = this.id(data);\n            evt.choice = data;\n            this.opts.element.trigger(evt);\n\n            if (evt.isDefaultPrevented()) {\n                return false;\n            }\n\n            while((index = indexOf(this.id(data), val)) >= 0) {\n                val.splice(index, 1);\n                this.setVal(val);\n                if (this.select) this.postprocessResults();\n            }\n\n            selected.remove();\n\n            this.opts.element.trigger({ type: \"select2-removed\", val: this.id(data), choice: data });\n            this.triggerChange({ removed: data });\n\n            return true;\n        },\n\n        // multi\n        postprocessResults: function (data, initial, noHighlightUpdate) {\n            var val = this.getVal(),\n                choices = this.results.find(\".select2-result\"),\n                compound = this.results.find(\".select2-result-with-children\"),\n                self = this;\n\n            choices.each2(function (i, choice) {\n                var id = self.id(choice.data(\"select2-data\"));\n                if (indexOf(id, val) >= 0) {\n                    choice.addClass(\"select2-selected\");\n                    // mark all children of the selected parent as selected\n                    choice.find(\".select2-result-selectable\").addClass(\"select2-selected\");\n                }\n            });\n\n            compound.each2(function(i, choice) {\n                // hide an optgroup if it doesn't have any selectable children\n                if (!choice.is('.select2-result-selectable')\n                    && choice.find(\".select2-result-selectable:not(.select2-selected)\").length === 0) {\n                    choice.addClass(\"select2-selected\");\n                }\n            });\n\n            if (this.highlight() == -1 && noHighlightUpdate !== false && this.opts.closeOnSelect === true){\n                self.highlight(0);\n            }\n\n            //If all results are chosen render formatNoMatches\n            if(!this.opts.createSearchChoice && !choices.filter('.select2-result:not(.select2-selected)').length > 0){\n                if(!data || data && !data.more && this.results.find(\".select2-no-results\").length === 0) {\n                    if (checkFormatter(self.opts.formatNoMatches, \"formatNoMatches\")) {\n                        this.results.append(\"<li class='select2-no-results'>\" + evaluate(self.opts.formatNoMatches, self.opts.element, self.search.val()) + \"</li>\");\n                    }\n                }\n            }\n\n        },\n\n        // multi\n        getMaxSearchWidth: function() {\n            return this.selection.width() - getSideBorderPadding(this.search);\n        },\n\n        // multi\n        resizeSearch: function () {\n            var minimumWidth, left, maxWidth, containerLeft, searchWidth,\n                sideBorderPadding = getSideBorderPadding(this.search);\n\n            minimumWidth = measureTextWidth(this.search) + 10;\n\n            left = this.search.offset().left;\n\n            maxWidth = this.selection.width();\n            containerLeft = this.selection.offset().left;\n\n            searchWidth = maxWidth - (left - containerLeft) - sideBorderPadding;\n\n            if (searchWidth < minimumWidth) {\n                searchWidth = maxWidth - sideBorderPadding;\n            }\n\n            if (searchWidth < 40) {\n                searchWidth = maxWidth - sideBorderPadding;\n            }\n\n            if (searchWidth <= 0) {\n              searchWidth = minimumWidth;\n            }\n\n            this.search.width(Math.floor(searchWidth));\n        },\n\n        // multi\n        getVal: function () {\n            var val;\n            if (this.select) {\n                val = this.select.val();\n                return val === null ? [] : val;\n            } else {\n                val = this.opts.element.val();\n                return splitVal(val, this.opts.separator, this.opts.transformVal);\n            }\n        },\n\n        // multi\n        setVal: function (val) {\n            if (this.select) {\n                this.select.val(val);\n            } else {\n                var unique = [], valMap = {};\n                // filter out duplicates\n                val.forEach(function (item) {\n                    if (!(item in valMap)) {\n                        unique.push(item);\n                        valMap[item] = 0;\n                    }\n                });\n                this.opts.element.val(unique.length === 0 ? \"\" : unique.join(this.opts.separator));\n            }\n        },\n\n        // multi\n        buildChangeDetails: function (old, current) {\n            var current = current.slice(0),\n                old = old.slice(0);\n\n            // remove intersection from each array\n            for (var i = 0; i < current.length; i++) {\n                for (var j = 0; j < old.length; j++) {\n                    if (equal(this.opts.id(current[i]), this.opts.id(old[j]))) {\n                        current.splice(i, 1);\n                        i--;\n                        old.splice(j, 1);\n                        break;\n                    }\n                }\n            }\n\n            return {added: current, removed: old};\n        },\n\n\n        // multi\n        val: function (val, triggerChange) {\n            var oldData, self=this;\n\n            if (arguments.length === 0) {\n                return this.getVal();\n            }\n\n            oldData=this.data();\n            if (!oldData.length) oldData=[];\n\n            // val is an id. !val is true for [undefined,null,'',0] - 0 is legal\n            if (!val && val !== 0) {\n                this.opts.element.val(\"\");\n                this.updateSelection([]);\n                this.clearSearch();\n                if (triggerChange) {\n                    this.triggerChange({added: this.data(), removed: oldData});\n                }\n                return;\n            }\n\n            // val is a list of ids\n            this.setVal(val);\n\n            if (this.select) {\n                this.opts.initSelection(this.select, this.bind(this.updateSelection));\n                if (triggerChange) {\n                    this.triggerChange(this.buildChangeDetails(oldData, this.data()));\n                }\n            } else {\n                if (this.opts.initSelection === undefined) {\n                    throw new Error(\"val() cannot be called if initSelection() is not defined\");\n                }\n\n                this.opts.initSelection(this.opts.element, function(data){\n                    var ids=$.map(data, self.id);\n                    self.setVal(ids);\n                    self.updateSelection(data);\n                    self.clearSearch();\n                    if (triggerChange) {\n                        self.triggerChange(self.buildChangeDetails(oldData, self.data()));\n                    }\n                });\n            }\n            this.clearSearch();\n        },\n\n        // multi\n        onSortStart: function() {\n            if (this.select) {\n                throw new Error(\"Sorting of elements is not supported when attached to <select>. Attach to <input type='hidden'/> instead.\");\n            }\n\n            // collapse search field into 0 width so its container can be collapsed as well\n            this.search.width(0);\n            // hide the container\n            this.searchContainer.hide();\n        },\n\n        // multi\n        onSortEnd:function() {\n\n            var val=[], self=this;\n\n            // show search and move it to the end of the list\n            this.searchContainer.show();\n            // make sure the search container is the last item in the list\n            this.searchContainer.appendTo(this.searchContainer.parent());\n            // since we collapsed the width in dragStarted, we resize it here\n            this.resizeSearch();\n\n            // update selection\n            this.selection.find(\".select2-search-choice\").each(function() {\n                val.push(self.opts.id($(this).data(\"select2-data\")));\n            });\n            this.setVal(val);\n            this.triggerChange();\n        },\n\n        // multi\n        data: function(values, triggerChange) {\n            var self=this, ids, old;\n            if (arguments.length === 0) {\n                 return this.selection\n                     .children(\".select2-search-choice\")\n                     .map(function() { return $(this).data(\"select2-data\"); })\n                     .get();\n            } else {\n                old = this.data();\n                if (!values) { values = []; }\n                ids = $.map(values, function(e) { return self.opts.id(e); });\n                this.setVal(ids);\n                this.updateSelection(values);\n                this.clearSearch();\n                if (triggerChange) {\n                    this.triggerChange(this.buildChangeDetails(old, this.data()));\n                }\n            }\n        }\n    });\n\n    $.fn.select2 = function () {\n\n        var args = Array.prototype.slice.call(arguments, 0),\n            opts,\n            select2,\n            method, value, multiple,\n            allowedMethods = [\"val\", \"destroy\", \"opened\", \"open\", \"close\", \"focus\", \"isFocused\", \"container\", \"dropdown\", \"onSortStart\", \"onSortEnd\", \"enable\", \"disable\", \"readonly\", \"positionDropdown\", \"data\", \"search\"],\n            valueMethods = [\"opened\", \"isFocused\", \"container\", \"dropdown\"],\n            propertyMethods = [\"val\", \"data\"],\n            methodsMap = { search: \"externalSearch\" };\n\n        this.each(function () {\n            if (args.length === 0 || typeof(args[0]) === \"object\") {\n                opts = args.length === 0 ? {} : $.extend({}, args[0]);\n                opts.element = $(this);\n\n                if (opts.element.get(0).tagName.toLowerCase() === \"select\") {\n                    multiple = opts.element.prop(\"multiple\");\n                } else {\n                    multiple = opts.multiple || false;\n                    if (\"tags\" in opts) {opts.multiple = multiple = true;}\n                }\n\n                select2 = multiple ? new window.Select2[\"class\"].multi() : new window.Select2[\"class\"].single();\n                select2.init(opts);\n            } else if (typeof(args[0]) === \"string\") {\n\n                if (indexOf(args[0], allowedMethods) < 0) {\n                    throw \"Unknown method: \" + args[0];\n                }\n\n                value = undefined;\n                select2 = $(this).data(\"select2\");\n                if (select2 === undefined) return;\n\n                method=args[0];\n\n                if (method === \"container\") {\n                    value = select2.container;\n                } else if (method === \"dropdown\") {\n                    value = select2.dropdown;\n                } else {\n                    if (methodsMap[method]) method = methodsMap[method];\n\n                    value = select2[method].apply(select2, args.slice(1));\n                }\n                if (indexOf(args[0], valueMethods) >= 0\n                    || (indexOf(args[0], propertyMethods) >= 0 && args.length == 1)) {\n                    return false; // abort the iteration, ready to return first matched value\n                }\n            } else {\n                throw \"Invalid arguments to select2 plugin: \" + args;\n            }\n        });\n        return (value === undefined) ? this : value;\n    };\n\n    // plugin defaults, accessible to users\n    $.fn.select2.defaults = {\n        debug: false,\n        width: \"copy\",\n        loadMorePadding: 0,\n        closeOnSelect: true,\n        openOnEnter: true,\n        containerCss: {},\n        dropdownCss: {},\n        containerCssClass: \"\",\n        dropdownCssClass: \"\",\n        formatResult: function(result, container, query, escapeMarkup) {\n            var markup=[];\n            markMatch(this.text(result), query.term, markup, escapeMarkup);\n            return markup.join(\"\");\n        },\n        transformVal: function(val) {\n            return (val === undefined || val === null) ? \"\" : val.trim();\n        },\n        formatSelection: function (data, container, escapeMarkup) {\n            return data ? escapeMarkup(this.text(data)) : undefined;\n        },\n        sortResults: function (results, container, query) {\n            return results;\n        },\n        formatResultCssClass: function(data) {return data.css;},\n        formatSelectionCssClass: function(data, container) {return undefined;},\n        minimumResultsForSearch: 0,\n        minimumInputLength: 0,\n        maximumInputLength: null,\n        maximumSelectionSize: 0,\n        id: function (e) { return e == undefined ? null : e.id; },\n        text: function (e) {\n          if (e && this.data && this.data.text) {\n            if (typeof this.data.text === 'function') {\n              return this.data.text(e);\n            } else {\n              return e[this.data.text];\n            }\n          } else {\n            return e.text;\n          }\n        },\n        matcher: function(term, text) {\n            return stripDiacritics(''+text).toUpperCase().indexOf(stripDiacritics(''+term).toUpperCase()) >= 0;\n        },\n        separator: \",\",\n        tokenSeparators: [],\n        tokenizer: defaultTokenizer,\n        escapeMarkup: defaultEscapeMarkup,\n        blurOnChange: false,\n        selectOnBlur: false,\n        adaptContainerCssClass: function(c) { return c; },\n        adaptDropdownCssClass: function(c) { return null; },\n        nextSearchTerm: function(selectedObject, currentSearchTerm) { return undefined; },\n        searchInputPlaceholder: '',\n        createSearchChoicePosition: 'top',\n        shouldFocusInput: function (instance) {\n            // Attempt to detect touch devices\n            var supportsTouchEvents = (('ontouchstart' in window) ||\n                                       (navigator.msMaxTouchPoints > 0));\n\n            // Only devices which support touch events should be special cased\n            if (!supportsTouchEvents) {\n                return true;\n            }\n\n            // Never focus the input if search is disabled\n            if (instance.opts.minimumResultsForSearch < 0) {\n                return false;\n            }\n\n            return true;\n        }\n    };\n\n    $.fn.select2.locales = [];\n\n    $.fn.select2.locales['en'] = {\n         formatMatches: function (matches) { if (matches === 1) { return \"One result is available, press enter to select it.\"; } return matches + \" results are available, use up and down arrow keys to navigate.\"; },\n         formatNoMatches: function () { return \"No matches found\"; },\n         formatAjaxError: function (jqXHR, textStatus, errorThrown) { return \"Loading failed\"; },\n         formatInputTooShort: function (input, min) { var n = min - input.length; return \"Please enter \" + n + \" or more character\" + (n == 1 ? \"\" : \"s\"); },\n         formatInputTooLong: function (input, max) { var n = input.length - max; return \"Please delete \" + n + \" character\" + (n == 1 ? \"\" : \"s\"); },\n         formatSelectionTooBig: function (limit) { return \"You can only select \" + limit + \" item\" + (limit == 1 ? \"\" : \"s\"); },\n         formatLoadMore: function (pageNumber) { return \"Loading more results…\"; },\n         formatSearching: function () { return \"Searching…\"; }\n    };\n\n    $.extend($.fn.select2.defaults, $.fn.select2.locales['en']);\n\n    $.fn.select2.ajaxDefaults = {\n        transport: $.ajax,\n        params: {\n            type: \"GET\",\n            cache: false,\n            dataType: \"json\"\n        }\n    };\n\n    // exports\n    window.Select2 = {\n        query: {\n            ajax: ajax,\n            local: local,\n            tags: tags\n        }, util: {\n            debounce: debounce,\n            markMatch: markMatch,\n            escapeMarkup: defaultEscapeMarkup,\n            stripDiacritics: stripDiacritics\n        }, \"class\": {\n            \"abstract\": AbstractSelect2,\n            \"single\": SingleSelect2,\n            \"multi\": MultiSelect2\n        }\n    };\n\n}(jQuery));\n","(function () {\n  'use strict';\n\n  var DocumentFragment = window.DocumentFragment;\n  var elProto = window.HTMLElement.prototype;\n  var matchesSelector = (\n    elProto.matches ||\n    elProto.msMatchesSelector ||\n    elProto.webkitMatchesSelector ||\n    elProto.mozMatchesSelector ||\n    elProto.oMatchesSelector\n  );\n\n  function getData (element, name) {\n    if (element.__SKATE_TEMPLATE_HTML_DATA) {\n      return element.__SKATE_TEMPLATE_HTML_DATA[name];\n    }\n  }\n\n  function setData (element, name, value) {\n    if (!element.__SKATE_TEMPLATE_HTML_DATA) {\n      element.__SKATE_TEMPLATE_HTML_DATA = {};\n    }\n\n    element.__SKATE_TEMPLATE_HTML_DATA[name] = value;\n\n    return element;\n  }\n\n  function createFragmentFromString (domString) {\n    var specialMap = {\n      caption: 'table',\n      dd: 'dl',\n      dt: 'dl',\n      li: 'ul',\n      tbody: 'table',\n      td: 'tr',\n      thead: 'table',\n      tr: 'tbody'\n    };\n\n    var tag = domString.match(/\\s*<([^\\s>]+)/);\n    var div = document.createElement(tag && specialMap[tag[1]] || 'div');\n\n    div.innerHTML = domString;\n\n    return createFragmentFromNodeList(div.childNodes);\n  }\n\n  function createFragmentFromNodeList (nodeList) {\n    var frag = document.createDocumentFragment();\n\n    while (nodeList && nodeList.length) {\n      frag.appendChild(nodeList[0]);\n    }\n\n    return frag;\n  }\n\n  function getNodesBetween (startNode, endNode) {\n    var nodes = [];\n    var nextNode = startNode.nextSibling;\n\n    while (nextNode !== endNode) {\n      nodes.push(nextNode);\n      nextNode = nextNode.nextSibling;\n    }\n\n    return nodes;\n  }\n\n  function findChildrenMatchingSelector (sourceNode, selector) {\n    if (selector) {\n      var found = sourceNode.querySelectorAll(selector);\n      var foundLength = found.length;\n      var filtered = [];\n\n      for (var a = 0; a < foundLength; a++) {\n        var node = found[a];\n\n        if (node.parentNode === sourceNode) {\n          filtered.push(node);\n        }\n      }\n\n      return filtered;\n    }\n\n    return [].slice.call(sourceNode.childNodes) || [];\n  }\n\n  function htmlTemplateParentWrapper (element) {\n    var contentNodes = getData(element, 'content');\n    var contentNodesLen = contentNodes.length;\n\n    return {\n      childNodes: {\n        get: function () {\n          var nodes = [];\n\n          for (var a = 0; a < contentNodesLen; a++) {\n            var contentNode = contentNodes[a];\n\n            if (contentNode.isDefault) {\n              continue;\n            }\n\n            nodes = nodes.concat(getNodesBetween(contentNode.startNode, contentNode.endNode));\n          }\n\n          return nodes;\n        }\n      },\n\n      firstChild: {\n        get: function () {\n          var childNodes = this.childNodes;\n          return childNodes.length && childNodes[0] || null;\n        }\n      },\n\n      innerHTML: {\n        get: function () {\n          var html = '';\n          var childNodes = this.childNodes;\n          var childNodesLen = childNodes.length;\n\n          for (var a = 0; a < childNodesLen; a++) {\n            var childNode = childNodes[a];\n            html += childNode.outerHTML || childNode.textContent;\n          }\n\n          return html;\n        },\n        set: function (html) {\n          var targetFragment = createFragmentFromString(html);\n\n          for (var a = 0; a < contentNodesLen; a++) {\n            var contentNode = contentNodes[a];\n            var childNodes = getNodesBetween(contentNode.startNode, contentNode.endNode);\n\n            // Remove all nodes (including default content).\n            for (var b = 0; b < childNodes.length; b++) {\n              var childNode = childNodes[b];\n              childNode.parentNode.removeChild(childNode);\n            }\n\n            var foundNodes = findChildrenMatchingSelector(targetFragment, contentNode.selector);\n\n            // Add any matched nodes from the given HTML.\n            for (var c = 0; c < foundNodes.length; c++) {\n              contentNode.container.insertBefore(foundNodes[c], contentNode.endNode);\n            }\n\n            // If no nodes were found, set the default content.\n            if (foundNodes.length) {\n              removeDefaultContent(contentNode);\n            } else {\n              addDefaultContent(contentNode);\n            }\n          }\n        }\n      },\n\n      lastChild: {\n        get: function () {\n          for (var a = contentNodesLen - 1; a > -1; a--) {\n            var contentNode = contentNodes[a];\n\n            if (contentNode.isDefault) {\n              continue;\n            }\n\n            var childNodes = this.childNodes;\n            var childNodesLen = childNodes.length;\n\n            return childNodes[childNodesLen - 1];\n          }\n\n          return null;\n        }\n      },\n\n      outerHTML: {\n        get: function () {\n          var name = this.tagName.toLowerCase();\n          var html = '<' + name;\n          var attrs = this.attributes;\n\n          if (attrs) {\n            var attrsLength = attrs.length;\n\n            for (var a = 0; a < attrsLength; a++) {\n              var attr = attrs[a];\n              html += ' ' + attr.nodeName + '=\"' + attr.nodeValue + '\"';\n            }\n          }\n\n          html += '>';\n          html += this.innerHTML;\n          html += '</' + name + '>';\n\n          return html;\n        }\n      },\n\n      textContent: {\n        get: function () {\n          var textContent = '';\n          var childNodes = this.childNodes;\n          var childNodesLength = this.childNodes.length;\n\n          for (var a = 0; a < childNodesLength; a++) {\n            textContent += childNodes[a].textContent;\n          }\n\n          return textContent;\n        },\n        set: function (textContent) {\n          var acceptsTextContent;\n\n          // Removes all nodes (including default content).\n          this.innerHTML = '';\n\n          // Find the first content node without a selector.\n          for (var a = 0; a < contentNodesLen; a++) {\n            var contentNode = contentNodes[a];\n\n            if (!contentNode.selector) {\n              acceptsTextContent = contentNode;\n              break;\n            }\n          }\n\n          // There may be no content nodes that accept text content.\n          if (acceptsTextContent) {\n            if (textContent) {\n              removeDefaultContent(acceptsTextContent);\n              acceptsTextContent.container.insertBefore(document.createTextNode(textContent), acceptsTextContent.endNode);\n            } else {\n              addDefaultContent(acceptsTextContent);\n            }\n          }\n        }\n      },\n\n      appendChild: {\n        value: function (node) {\n          if (node instanceof DocumentFragment) {\n            var fragChildNodes = node.childNodes;\n\n            [].slice.call(fragChildNodes).forEach(function (node) {\n              this.appendChild(node);\n            }.bind(this));\n\n            return this;\n          }\n\n          for (var b = 0; b < contentNodesLen; b++) {\n            var contentNode = contentNodes[b];\n            var contentSelector = contentNode.selector;\n\n            if (!contentSelector || node instanceof window.HTMLElement && matchesSelector.call(node, contentSelector)) {\n              removeDefaultContent(contentNode);\n              contentNode.endNode.parentNode.insertBefore(node, contentNode.endNode);\n              break;\n            }\n          }\n\n          return this;\n        }\n      },\n\n      insertAdjacentHTML: {\n        value: function (where, html) {\n          if (where === 'afterbegin') {\n            this.insertBefore(createFragmentFromString(html), this.childNodes[0]);\n          } else if (where === 'beforeend') {\n            this.appendChild(createFragmentFromString(html));\n          } else {\n            element.insertAdjacentHTML(where, html);\n          }\n\n          return this;\n        }\n      },\n\n      insertBefore: {\n        value: function (node, referenceNode) {\n          // If no reference node is supplied, we append. This also means that we\n          // don't need to add / remove any default content because either there\n          // aren't any nodes or appendChild will handle it.\n          if (!referenceNode) {\n            return this.appendChild(node);\n          }\n\n          // Handle document fragments.\n          if (node instanceof DocumentFragment) {\n            var fragChildNodes = node.childNodes;\n\n            if (fragChildNodes) {\n              var fragChildNodesLength = fragChildNodes.length;\n\n              for (var a = 0; a < fragChildNodesLength; a++) {\n                this.insertBefore(fragChildNodes[a], referenceNode);\n              }\n            }\n\n            return this;\n          }\n\n          var hasFoundReferenceNode = false;\n\n          // There's no reason to handle default content add / remove because:\n          // 1. If no reference node is supplied, appendChild handles it.\n          // 2. If a reference node is supplied, there already is content.\n          // 3. If a reference node is invalid, an exception is thrown, but also\n          //    it's state would not change even if it wasn't.\n          mainLoop:\n          for (var b = 0; b < contentNodesLen; b++) {\n            var contentNode = contentNodes[b];\n            var betweenNodes = getNodesBetween(contentNode.startNode, contentNode.endNode);\n            var betweenNodesLen = betweenNodes.length;\n\n            for (var c = 0; c < betweenNodesLen; c++) {\n              var betweenNode = betweenNodes[c];\n\n              if (betweenNode === referenceNode) {\n                hasFoundReferenceNode = true;\n              }\n\n              if (hasFoundReferenceNode) {\n                var selector = contentNode.selector;\n\n                if (!selector || matchesSelector.call(node, selector)) {\n                  betweenNode.parentNode.insertBefore(node, betweenNode);\n                  break mainLoop;\n                }\n              }\n            }\n          }\n\n          // If no reference node was found as a child node of the element we must\n          // throw an error. This works for both no child nodes, or if the\n          // reference wasn't found to be a child node.\n          if (!hasFoundReferenceNode) {\n            throw new Error('DOMException 8: The node before which the new node is to be inserted is not a child of this node.');\n          }\n\n          return node;\n        }\n      },\n\n      removeChild: {\n        value: function (childNode) {\n          var removed = false;\n\n          for (var a = 0; a < contentNodesLen; a++) {\n            var contentNode = contentNodes[a];\n\n            if (contentNode.container === childNode.parentNode) {\n              contentNode.container.removeChild(childNode);\n              removed = true;\n              break;\n            }\n\n            if (contentNode.startNode.nextSibling === contentNode.endNode) {\n              addDefaultContent(contentNode);\n            }\n          }\n\n          if (!removed) {\n            throw new Error('DOMException 8: The node in which you are trying to remove is not a child of this node.');\n          }\n\n          return childNode;\n        }\n      },\n\n      replaceChild: {\n        value: function (newChild, oldChild) {\n          for (var a = 0; a < contentNodesLen; a++) {\n            var contentNode = contentNodes[a];\n\n            if (contentNode.container === oldChild.parentNode) {\n              contentNode.container.replaceChild(newChild, oldChild);\n              break;\n            }\n          }\n\n          return this;\n        }\n      }\n    };\n  }\n\n  function addDefaultContent (content) {\n    var nodes = content.defaultNodes;\n    var nodesLen = nodes.length;\n\n    for (var a = 0; a < nodesLen; a++) {\n      content.container.insertBefore(nodes[a], content.endNode);\n    }\n\n    content.isDefault = true;\n  }\n\n  function removeDefaultContent (content) {\n    var nodes = content.defaultNodes;\n    var nodesLen = nodes.length;\n\n    for (var a = 0; a < nodesLen; a++) {\n      var node = nodes[a];\n      node.parentNode.removeChild(node);\n    }\n\n    content.isDefault = false;\n  }\n\n  function createProxyProperty (node, name) {\n    return {\n      get: function () {\n        var value = node[name];\n\n        if (typeof value === 'function') {\n          return value.bind(node);\n        }\n\n        return value;\n      },\n\n      set: function (value) {\n        node[name] = value;\n      }\n    };\n  }\n\n  function wrapNodeWith (node, wrapper) {\n    var wrapped = {};\n\n    for (var name in node) {\n      var inWrapper = name in wrapper;\n\n      if (inWrapper) {\n        Object.defineProperty(wrapped, name, wrapper[name]);\n      } else {\n        Object.defineProperty(wrapped, name, createProxyProperty(node, name));\n      }\n    }\n\n    return wrapped;\n  }\n\n  function cacheContentData (node) {\n    var contentNodes = node.getElementsByTagName('content');\n    var contentNodesLen = contentNodes && contentNodes.length;\n\n    if (contentNodesLen) {\n      var contentData = [];\n\n      while (contentNodes.length) {\n        var contentNode = contentNodes[0];\n        var parentNode = contentNode.parentNode;\n        var selector = contentNode.getAttribute('select');\n        var startNode = document.createComment(' content ');\n        var endNode = document.createComment(' /content ');\n\n        contentData.push({\n          container: parentNode,\n          contentNode: contentNode,\n          defaultNodes: [].slice.call(contentNode.childNodes),\n          endNode: endNode,\n          isDefault: true,\n          selector: selector,\n          startNode: startNode\n        });\n\n        parentNode.replaceChild(endNode, contentNode);\n        parentNode.insertBefore(startNode, endNode);\n\n        // Cache data in the comment that can be read if no content information\n        // is cached. This allows seamless server-side rendering.\n        startNode.textContent += JSON.stringify({\n          defaultContent: contentNode.innerHTML,\n          selector: selector\n        }) + ' ';\n      }\n\n      setData(node, 'content', contentData);\n    }\n  }\n\n\n\n  // Content Parser\n  // --------------\n\n  function parseCommentNode (node) {\n    var data;\n    var matches = node.textContent.match(/^ (\\/?)content (.*)/i);\n\n    if (matches) {\n      if (matches[2]) {\n        try {\n          data = JSON.parse(matches[2]);\n        } catch (e) {\n          throw new Error('Unable to parse content comment data: \"' + e + '\" in \"<!--' + node.textContent + '-->\".');\n        }\n      }\n\n      return {\n        data: data || {\n          defaultContent: undefined,\n          isDefault: undefined,\n          selector: undefined\n        },\n        type: matches[1] ? 'close' : 'open'\n      };\n    }\n  }\n\n  function parseNodeForContent (node) {\n    var a;\n    var childNodes = node.childNodes;\n    var childNodesLen = childNodes.length;\n    var contentDatas = [];\n    var lastContentNode;\n\n    for (a = 0; a < childNodesLen; a++) {\n      var childNode = childNodes[a];\n\n      if (childNode.nodeType === 8) {\n        var contentInfo = parseCommentNode(childNode);\n\n        if (contentInfo) {\n          if (contentInfo.type === 'open') {\n            if (lastContentNode) {\n              throw new Error('Cannot have an opening content placeholder after another content placeholder at the same level in the DOM tree: \"' + childNode.textContent + '\" in \"' + childNode.parentNode.innerHTML + '\".');\n            }\n\n            lastContentNode = {\n              container: childNode.parentNode,\n              contentNode: childNode,\n              defaultNodes: contentInfo.data.defaultContent && createFragmentFromString(contentInfo.data.defaultContent).childNodes || [],\n              isDefault: contentInfo.data.isDefault,\n              selector: contentInfo.data.selector,\n              startNode: childNode\n            };\n          } else if (contentInfo.type === 'close') {\n            if (!lastContentNode) {\n              throw new Error('Unmatched closing content placeholder: \"' + childNode.textContent + '\" in \"' + childNode.parentNode.innerHTML + '\".');\n            }\n\n            lastContentNode.endNode = childNode;\n            contentDatas.push(lastContentNode);\n            lastContentNode = undefined;\n          }\n        }\n      } else {\n        contentDatas = contentDatas.concat(parseNodeForContent(childNode));\n      }\n    }\n\n    return contentDatas;\n  }\n\n\n\n  // Public API\n  // ----------\n\n  function skateTemplateHtml () {\n    var template = [].slice.call(arguments).join('');\n\n    return function (target) {\n      var frag = createFragmentFromNodeList(target.childNodes);\n\n      target.innerHTML = template;\n      cacheContentData(target);\n\n      if (frag.childNodes.length) {\n        skateTemplateHtml.wrap(target).appendChild(frag);\n      }\n    };\n  }\n\n  skateTemplateHtml.wrap = function (node) {\n    if (!getData(node, 'content')) {\n      setData(node, 'content', parseNodeForContent(node));\n    }\n\n    return wrapNodeWith(node, htmlTemplateParentWrapper(node));\n  };\n\n\n\n  // Exporting\n  // ---------\n\n  // Global.\n  window.skateTemplateHtml = skateTemplateHtml;\n\n  // AMD.\n  if (typeof define === 'function') {\n    define(function () {\n      return skateTemplateHtml;\n    });\n  }\n\n  // CommonJS.\n  if (typeof module === 'object') {\n    module.exports = skateTemplateHtml;\n  }\n})();\n","(function (factory) {\n  if (typeof define === \"function\" && define.amd) {\n    define([\"exports\"], factory);\n  } else if (typeof exports !== \"undefined\") {\n    factory(exports);\n  }\n})(function (exports) {\n  \"use strict\";\n\n  Object.defineProperty(exports, \"__esModule\", {\n    value: true\n  });\n  \"use strict\";\n\n  var ATTR_IGNORE = \"data-skate-ignore\";\n  exports.ATTR_IGNORE = ATTR_IGNORE;\n  var TYPE_ATTRIBUTE = \"a\";\n  exports.TYPE_ATTRIBUTE = TYPE_ATTRIBUTE;\n  var TYPE_CLASSNAME = \"c\";\n  exports.TYPE_CLASSNAME = TYPE_CLASSNAME;\n  var TYPE_ELEMENT = \"t\";\n  exports.TYPE_ELEMENT = TYPE_ELEMENT;\n});","(function (factory) {\n  if (typeof define === \"function\" && define.amd) {\n    define([\"exports\", \"module\"], factory);\n  } else if (typeof exports !== \"undefined\" && typeof module !== \"undefined\") {\n    factory(exports, module);\n  }\n})(function (exports, module) {\n  \"use strict\";\n\n  module.exports = function (element) {\n    var namespace = arguments[1] === undefined ? \"\" : arguments[1];\n\n    var data = element.__SKATE_DATA || (element.__SKATE_DATA = {});\n    return namespace && (data[namespace] || (data[namespace] = {})) || data;\n  };\n});","(function (factory) {\n  if (typeof define === \"function\" && define.amd) {\n    define([\"exports\", \"module\", \"./globals\", \"./lifecycle\", \"./mutation-observer\", \"./fix-ie-innerhtml\", \"./utils\"], factory);\n  } else if (typeof exports !== \"undefined\" && typeof module !== \"undefined\") {\n    factory(exports, module, require(\"./globals\"), require(\"./lifecycle\"), require(\"./mutation-observer\"), require(\"./fix-ie-innerhtml\"), require(\"./utils\"));\n  }\n})(function (exports, module, _globals, _lifecycle, _mutationObserver, _fixIeInnerhtml, _utils) {\n  \"use strict\";\n\n  var _interopRequire = function (obj) { return obj && obj.__esModule ? obj[\"default\"] : obj; };\n\n  var globals = _interopRequire(_globals);\n\n  var initElements = _lifecycle.initElements;\n  var removeElements = _lifecycle.removeElements;\n  var getClosestIgnoredElement = _utils.getClosestIgnoredElement;\n\n  /**\n   * The document observer handler.\n   *\n   * @param {Array} mutations The mutations to handle.\n   *\n   * @returns {undefined}\n   */\n  function documentObserverHandler(mutations) {\n    var mutationsLen = mutations.length;\n\n    for (var a = 0; a < mutationsLen; a++) {\n      var mutation = mutations[a];\n      var addedNodes = mutation.addedNodes;\n      var removedNodes = mutation.removedNodes;\n\n      // Since siblings are batched together, we check the first node's parent\n      // node to see if it is ignored. If it is then we don't process any added\n      // nodes. This prevents having to check every node.\n      if (addedNodes && addedNodes.length && !getClosestIgnoredElement(addedNodes[0].parentNode)) {\n        initElements(addedNodes);\n      }\n\n      // We can't check batched nodes here because they won't have a parent node.\n      if (removedNodes && removedNodes.length) {\n        removeElements(removedNodes);\n      }\n    }\n  }\n\n  /**\n   * Creates a new mutation observer for listening to Skate definitions for the\n   * document.\n   *\n   * @param {Element} root The element to observe.\n   *\n   * @returns {MutationObserver}\n   */\n  function createDocumentObserver() {\n    var observer = new window.MutationObserver(documentObserverHandler);\n\n    // Observe after the DOM content has loaded.\n    observer.observe(document, {\n      childList: true,\n      subtree: true\n    });\n\n    return observer;\n  }\n\n  module.exports = {\n    register: function register(fixIe) {\n      // IE has issues with reporting removedNodes correctly. See the polyfill for\n      // details. If we fix IE, we must also re-define the document observer.\n      if (fixIe) {\n        this.unregister();\n      }\n\n      if (!globals.observer) {\n        globals.observer = createDocumentObserver();\n      }\n\n      return this;\n    },\n\n    unregister: function unregister() {\n      if (globals.observer) {\n        globals.observer.disconnect();\n        globals.observer = undefined;\n      }\n\n      return this;\n    }\n  };\n});","(function (factory) {\n  if (typeof define === \"function\" && define.amd) {\n    define([\"exports\"], factory);\n  } else if (typeof exports !== \"undefined\") {\n    factory(exports);\n  }\n})(function (exports) {\n  \"use strict\";\n\n  var isIeUntil10 = /MSIE/.test(navigator.userAgent);\n  var isIe11 = /Trident/.test(navigator.userAgent);\n  var isIe = isIeUntil10 || isIe11;\n  var elementPrototype = window.HTMLElement.prototype;\n\n  // ! This walkTree method differs from the implementation in ../../utils/walk-tree\n  // It invokes the callback only for the children, not the passed node and the second parameter to the callback is the parent node\n  function walkTree(node, cb) {\n    var childNodes = node.childNodes;\n\n    if (!childNodes) {\n      return;\n    }\n\n    var childNodesLen = childNodes.length;\n\n    for (var a = 0; a < childNodesLen; a++) {\n      var childNode = childNodes[a];\n      cb(childNode, node);\n      walkTree(childNode, cb);\n    }\n  }\n\n  function fixInnerHTML() {\n    var originalInnerHTML = Object.getOwnPropertyDescriptor(elementPrototype, \"innerHTML\");\n\n    var get = function get() {\n      return originalInnerHTML.get.call(this);\n    };\n    get._hasBeenEnhanced = true;\n\n    // This redefines the innerHTML property so that we can ensure that events\n    // are properly triggered.\n    Object.defineProperty(elementPrototype, \"innerHTML\", {\n      get: get,\n      set: function set(html) {\n        walkTree(this, function (node, parentNode) {\n          var mutationEvent = document.createEvent(\"MutationEvent\");\n          mutationEvent.initMutationEvent(\"DOMNodeRemoved\", true, false, parentNode, null, null, null, null);\n          node.dispatchEvent(mutationEvent);\n        });\n        originalInnerHTML.set.call(this, html);\n      }\n    });\n  }\n\n  if (isIe) {\n    // IE 9-11\n    var propertyDescriptor = Object.getOwnPropertyDescriptor(elementPrototype, \"innerHTML\");\n    var hasBeenEnhanced = !!propertyDescriptor && propertyDescriptor.get._hasBeenEnhanced;\n\n    if (!hasBeenEnhanced) {\n      if (isIe11) {\n        // IE11's native MutationObserver needs some help as well :()\n        window.MutationObserver = window.JsMutationObserver || window.MutationObserver;\n      }\n\n      fixInnerHTML();\n    }\n  }\n});","(function (factory) {\n  if (typeof define === \"function\" && define.amd) {\n    define([\"exports\", \"module\", \"./version\"], factory);\n  } else if (typeof exports !== \"undefined\" && typeof module !== \"undefined\") {\n    factory(exports, module, require(\"./version\"));\n  }\n})(function (exports, module, _version) {\n  \"use strict\";\n\n  var _interopRequire = function (obj) { return obj && obj.__esModule ? obj[\"default\"] : obj; };\n\n  var version = _interopRequire(_version);\n\n  var VERSION = \"__skate_\" + version.replace(/[^\\w]/g, \"_\");\n\n  if (!window[VERSION]) {\n    window[VERSION] = {\n      observer: undefined,\n      registry: {}\n    };\n  }\n\n  module.exports = window[VERSION];\n});","(function (factory) {\n  if (typeof define === \"function\" && define.amd) {\n    define([\"exports\", \"./constants\", \"./data\", \"./mutation-observer\", \"./registry\", \"./utils\"], factory);\n  } else if (typeof exports !== \"undefined\") {\n    factory(exports, require(\"./constants\"), require(\"./data\"), require(\"./mutation-observer\"), require(\"./registry\"), require(\"./utils\"));\n  }\n})(function (exports, _constants, _data, _mutationObserver, _registry, _utils) {\n  \"use strict\";\n\n  var _interopRequire = function (obj) { return obj && obj.__esModule ? obj[\"default\"] : obj; };\n\n  Object.defineProperty(exports, \"__esModule\", {\n    value: true\n  });\n  \"use strict\";\n\n  var ATTR_IGNORE = _constants.ATTR_IGNORE;\n\n  var data = _interopRequire(_data);\n\n  var registry = _interopRequire(_registry);\n\n  var camelCase = _utils.camelCase;\n  var elementContains = _utils.elementContains;\n  var hasOwn = _utils.hasOwn;\n  var inherit = _utils.inherit;\n  var objEach = _utils.objEach;\n  var Node = window.Node;\n  //jshint ignore:line\n  var elProto = window.HTMLElement.prototype;\n  var nativeMatchesSelector = elProto.matches || elProto.msMatchesSelector || elProto.webkitMatchesSelector || elProto.mozMatchesSelector || elProto.oMatchesSelector;\n  // Only IE9 has this msMatchesSelector bug, but best to detect it.\n  var hasNativeMatchesSelectorDetattachedBug = !nativeMatchesSelector.call(document.createElement(\"div\"), \"div\");\n  var matchesSelector = function matchesSelector(element, selector) {\n    if (hasNativeMatchesSelectorDetattachedBug) {\n      var clone = element.cloneNode();\n      document.createElement(\"div\").appendChild(clone);\n      return nativeMatchesSelector.call(clone, selector);\n    }\n    return nativeMatchesSelector.call(element, selector);\n  };\n\n  // Edge has a bug where oldValue is sent as null instead of the true oldValue\n  // when an element attribute is removed. Bug raised at\n  // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7711883/\n  var needsAttributeOldValueCaching = /Edge/.test(navigator.userAgent);\n\n  /**\n   * Parses an event definition and returns information about it.\n   *\n   * @param {String} e The event to parse.\n   *\n   * @returns {Object]}\n   */\n  function parseEvent(e) {\n    var parts = e.split(\" \");\n    return {\n      name: parts.shift(),\n      delegate: parts.join(\" \")\n    };\n  }\n\n  /**\n   * Sets the defined attributes to their default values, if specified.\n   *\n   * @param {Element} target The web component element.\n   * @param {Object} component The web component definition.\n   *\n   * @returns {undefined}\n   */\n  function initAttributes(target, component) {\n    var componentAttributes = component.attributes;\n\n    if (typeof componentAttributes !== \"object\") {\n      return;\n    }\n\n    for (var attribute in componentAttributes) {\n      if (hasOwn(componentAttributes, attribute) && hasOwn(componentAttributes[attribute], \"value\") && !target.hasAttribute(attribute)) {\n        var value = componentAttributes[attribute].value;\n        value = typeof value === \"function\" ? value(target) : value;\n        target.setAttribute(attribute, value);\n      }\n    }\n  }\n\n  /**\n   * Defines a property that proxies the specified attribute.\n   *\n   * @param {Element} target The web component element.\n   * @param {String} attribute The attribute name to proxy.\n   *\n   * @returns {undefined}\n   */\n  function defineAttributeProperty(target, attribute, property) {\n    Object.defineProperty(target, property, {\n      get: function get() {\n        return this.getAttribute(attribute);\n      },\n      set: function set(value) {\n        if (value === undefined) {\n          this.removeAttribute(attribute);\n        } else {\n          this.setAttribute(attribute, value);\n        }\n      }\n    });\n  }\n\n  /**\n   * Adds links from attributes to properties.\n   *\n   * @param {Element} target The web component element.\n   * @param {Object} component The web component definition.\n   *\n   * @returns {undefined}\n   */\n  function addAttributeToPropertyLinks(target, component) {\n    var componentAttributes = component.attributes;\n\n    if (typeof componentAttributes !== \"object\") {\n      return;\n    }\n\n    for (var attribute in componentAttributes) {\n      var property = camelCase(attribute);\n      if (hasOwn(componentAttributes, attribute) && !hasOwn(target, property)) {\n        defineAttributeProperty(target, attribute, property);\n      }\n    }\n  }\n\n  function triggerAttributeChanged(target, component, mutationData) {\n    var callback;\n    var type;\n    var name = mutationData.name;\n    var newValue = mutationData.newValue;\n\n    var cachedAttributeOldValues;\n    if (needsAttributeOldValueCaching) {\n      cachedAttributeOldValues = data(target, \"cachedAttributeOldValues\");\n    }\n\n    // Read the old attribute value from cache if needed, otherwise use native oldValue\n    var oldValue = needsAttributeOldValueCaching && hasOwn(cachedAttributeOldValues, name) ? cachedAttributeOldValues[name] : mutationData.oldValue;\n\n    var newValueIsString = typeof newValue === \"string\";\n    var oldValueIsString = typeof oldValue === \"string\";\n    var attrs = component.attributes;\n    var specific = attrs && attrs[name];\n\n    if (!oldValueIsString && newValueIsString) {\n      type = \"created\";\n    } else if (oldValueIsString && newValueIsString) {\n      type = \"updated\";\n    } else if (oldValueIsString && !newValueIsString) {\n      type = \"removed\";\n    }\n\n    if (needsAttributeOldValueCaching) {\n      if (type === \"removed\") {\n        delete cachedAttributeOldValues[name];\n      } else {\n        cachedAttributeOldValues[name] = newValue;\n      }\n    }\n\n    if (specific && typeof specific[type] === \"function\") {\n      callback = specific[type];\n    } else if (specific && typeof specific.fallback === \"function\") {\n      callback = specific.fallback;\n    } else if (typeof specific === \"function\") {\n      callback = specific;\n    } else if (typeof attrs === \"function\") {\n      callback = attrs;\n    }\n\n    // Ensure values are null if undefined.\n    newValue = newValue === undefined ? null : newValue;\n    oldValue = oldValue === undefined ? null : oldValue;\n\n    // There may still not be a callback.\n    if (callback) {\n      callback(target, {\n        type: type,\n        name: name,\n        newValue: newValue,\n        oldValue: oldValue\n      });\n    }\n  }\n\n  function triggerAttributesCreated(target, component) {\n    var a;\n    var attrs = target.attributes;\n    var attrsCopy = [];\n    var attrsLen = attrs.length;\n\n    for (a = 0; a < attrsLen; a++) {\n      attrsCopy.push(attrs[a]);\n    }\n\n    // In default web components, attribute changes aren't triggered for\n    // attributes that already exist on an element when it is bound. This sucks\n    // when you want to reuse and separate code for attributes away from your\n    // lifecycle callbacks. Skate will initialise each attribute by calling the\n    // created callback for the attributes that already exist on the element.\n    for (a = 0; a < attrsLen; a++) {\n      var attr = attrsCopy[a];\n      triggerAttributeChanged(target, component, {\n        name: attr.nodeName,\n        newValue: attr.value || attr.nodeValue\n      });\n    }\n  }\n\n  function addAttributeListeners(target, component) {\n    var attrs = target.attributes;\n\n    if (!component.attributes || registry.isNativeCustomElement(component.id)) {\n      return;\n    }\n\n    var observer = new window.MutationObserver(function (mutations) {\n      mutations.forEach(function (mutation) {\n        var name = mutation.attributeName;\n        var attr = attrs[name];\n\n        triggerAttributeChanged(target, component, {\n          name: name,\n          newValue: attr && (attr.value || attr.nodeValue),\n          oldValue: mutation.oldValue\n        });\n      });\n    });\n\n    observer.observe(target, {\n      attributes: true,\n      attributeOldValue: true\n    });\n  }\n\n  /**\n   * Binds event listeners for the specified event handlers.\n   *\n   * @param {Element} target The component element.\n   * @param {Object} component The component data.\n   *\n   * @returns {undefined}\n   */\n  function addEventListeners(target, component) {\n    if (typeof component.events !== \"object\") {\n      return;\n    }\n\n    function makeHandler(handler, delegate) {\n      return function (e) {\n        // If we're not delegating, trigger directly on the component element.\n        if (!delegate) {\n          return handler(target, e, target);\n        }\n\n        // If we're delegating, but the target doesn't match, then we've have\n        // to go up the tree until we find a matching ancestor or stop at the\n        // component element, or document. If a matching ancestor is found, the\n        // handler is triggered on it.\n        var current = e.target;\n\n        while (current && current !== document && current !== target.parentNode) {\n          if (matchesSelector(current, delegate)) {\n            return handler(target, e, current);\n          }\n\n          current = current.parentNode;\n        }\n      };\n    }\n\n    objEach(component.events, function (handler, name) {\n      var evt = parseEvent(name);\n      var useCapture = !!evt.delegate && (evt.name === \"blur\" || evt.name === \"focus\");\n      target.addEventListener(evt.name, makeHandler(handler, evt.delegate), useCapture);\n    });\n  }\n\n  /**\n   * Triggers the created lifecycle callback.\n   *\n   * @param {Element} target The component element.\n   * @param {Object} component The component data.\n   *\n   * @returns {undefined}\n   */\n  function triggerCreated(target, component) {\n    var targetData = data(target, component.id);\n\n    if (targetData.created) {\n      return;\n    }\n\n    targetData.created = true;\n\n    // TODO: This doesn't need to happen if using native.\n    inherit(target, component.prototype, true);\n\n    // We use the unresolved / resolved attributes to flag whether or not the\n    // element has been templated or not.\n    if (component.template && !target.hasAttribute(component.resolvedAttribute)) {\n      component.template(target);\n    }\n\n    target.removeAttribute(component.unresolvedAttribute);\n    target.setAttribute(component.resolvedAttribute, \"\");\n    addEventListeners(target, component);\n    addAttributeListeners(target, component);\n    addAttributeToPropertyLinks(target, component);\n    initAttributes(target, component);\n    triggerAttributesCreated(target, component);\n\n    if (component.created) {\n      component.created(target);\n    }\n  }\n\n  /**\n   * Triggers the attached lifecycle callback.\n   *\n   * @param {Element} target The component element.\n   * @param {Object} component The component data.\n   *\n   * @returns {undefined}\n   */\n  function triggerAttached(target, component) {\n    var targetData = data(target, component.id);\n\n    if (targetData.attached) {\n      return;\n    }\n\n    if (!elementContains(document, target)) {\n      return;\n    }\n\n    targetData.attached = true;\n\n    if (component.attached) {\n      component.attached(target);\n    }\n\n    targetData.detached = false;\n  }\n\n  /**\n   * Triggers the detached lifecycle callback.\n   *\n   * @param {Element} target The component element.\n   * @param {Object} component The component data.\n   *\n   * @returns {undefined}\n   */\n  function triggerDetached(target, component) {\n    var targetData = data(target, component.id);\n\n    if (targetData.detached) {\n      return;\n    }\n\n    targetData.detached = true;\n\n    if (component.detached) {\n      component.detached(target);\n    }\n\n    targetData.attached = false;\n  }\n\n  /**\n   * Triggers the entire element lifecycle if it's not being ignored.\n   *\n   * @param {Element} target The component element.\n   * @param {Object} component The component data.\n   *\n   * @returns {undefined}\n   */\n  function triggerLifecycle(target, component) {\n    triggerCreated(target, component);\n    triggerAttached(target, component);\n  }\n\n  /**\n   * Initialises a set of elements.\n   *\n   * @param {DOMNodeList | Array} elements A traversable set of elements.\n   *\n   * @returns {undefined}\n   */\n  function initElements(elements) {\n    // [CATION] Don't cache elements length! Components initialization could append nodes\n    // as siblings (see label's element behaviour for example) and this could lead to problems with\n    // components placed at the end of processing childNodes because they will change they index\n    // position and get out of cached value range.\n    for (var a = 0; a < elements.length; a++) {\n      var element = elements[a];\n\n      if (element.nodeType !== Node.ELEMENT_NODE || element.attributes[ATTR_IGNORE]) {\n        continue;\n      }\n\n      var currentNodeDefinitions = registry.getForElement(element);\n      var currentNodeDefinitionsLength = currentNodeDefinitions.length;\n\n      for (var b = 0; b < currentNodeDefinitionsLength; b++) {\n        triggerLifecycle(element, currentNodeDefinitions[b]);\n      }\n\n      // When <object> tag is used to expose NPAPI api to js may have different behaviour then other\n      // tags. One of those differences is that it's childNodes can be undefined.\n      var elementChildNodes = element.childNodes || [];\n      var elementChildNodesLen = elementChildNodes.length;\n\n      if (elementChildNodesLen) {\n        initElements(elementChildNodes);\n      }\n    }\n  }\n\n  /**\n   * Triggers the remove lifecycle callback on all of the elements.\n   *\n   * @param {DOMNodeList} elements The elements to trigger the remove lifecycle\n   * callback on.\n   *\n   * @returns {undefined}\n   */\n  function removeElements(elements) {\n    // Don't cache `childNodes` length. For more info see description in `initElements` function.\n    for (var a = 0; a < elements.length; a++) {\n      var element = elements[a];\n\n      if (element.nodeType !== Node.ELEMENT_NODE) {\n        continue;\n      }\n\n      removeElements(element.childNodes);\n\n      var definitions = registry.getForElement(element);\n      var definitionsLen = definitions.length;\n\n      for (var b = 0; b < definitionsLen; b++) {\n        triggerDetached(element, definitions[b]);\n      }\n    }\n  }\n\n  exports.initElements = initElements;\n  exports.removeElements = removeElements;\n  exports.triggerAttached = triggerAttached;\n  exports.triggerAttributeChanged = triggerAttributeChanged;\n  exports.triggerCreated = triggerCreated;\n  exports.triggerDetached = triggerDetached;\n});","(function (factory) {\n  if (typeof define === \"function\" && define.amd) {\n    define([\"exports\"], factory);\n  } else if (typeof exports !== \"undefined\") {\n    factory(exports);\n  }\n})(function (exports) {\n  \"use strict\";\n\n  (function (self) {\n    // Atlassian: added IIFE\n    /**\n     * @license\n     * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n     * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n     * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n     * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n     * Code distributed by Google as part of the polymer project is also\n     * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n     */\n    // @version 0.7.15\n    if (typeof WeakMap === \"undefined\") {\n      (function () {\n        var defineProperty = Object.defineProperty;\n        var counter = Date.now() % 1000000000;\n        var WeakMap = function WeakMap() {\n          this.name = \"__st\" + (Math.random() * 1000000000 >>> 0) + (counter++ + \"__\");\n        };\n        WeakMap.prototype = {\n          set: function set(key, value) {\n            var entry = key[this.name];\n            if (entry && entry[0] === key) entry[1] = value;else defineProperty(key, this.name, {\n              value: [key, value],\n              writable: true\n            });\n            return this;\n          },\n          get: function get(key) {\n            var entry;\n            return (entry = key[this.name]) && entry[0] === key ? entry[1] : undefined;\n          },\n          \"delete\": function _delete(key) {\n            var entry = key[this.name];\n            if (!entry || entry[0] !== key) {\n              return false;\n            }entry[0] = entry[1] = undefined;\n            return true;\n          },\n          has: function has(key) {\n            var entry = key[this.name];\n            if (!entry) {\n              return false;\n            }return entry[0] === key;\n          }\n        };\n        window.WeakMap = WeakMap;\n      })();\n    }\n\n    (function (global) {\n      if (global.JsMutationObserver) {\n        return;\n      }\n      var registrationsTable = new WeakMap();\n      var setImmediate;\n      if (/Trident|Edge/.test(navigator.userAgent)) {\n        setImmediate = setTimeout;\n      } else if (window.setImmediate) {\n        setImmediate = window.setImmediate;\n      } else {\n        var setImmediateQueue = [];\n        var sentinel = String(Math.random());\n        window.addEventListener(\"message\", function (e) {\n          if (e.data === sentinel) {\n            var queue = setImmediateQueue;\n            setImmediateQueue = [];\n            queue.forEach(function (func) {\n              func();\n            });\n          }\n        });\n        setImmediate = function (func) {\n          setImmediateQueue.push(func);\n          window.postMessage(sentinel, \"*\");\n        };\n      }\n      var isScheduled = false;\n      var scheduledObservers = [];\n      function scheduleCallback(observer) {\n        scheduledObservers.push(observer);\n        if (!isScheduled) {\n          isScheduled = true;\n          setImmediate(dispatchCallbacks);\n        }\n      }\n      function wrapIfNeeded(node) {\n        return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(node) || node;\n      }\n      function dispatchCallbacks() {\n        isScheduled = false;\n        var observers = scheduledObservers;\n        scheduledObservers = [];\n        observers.sort(function (o1, o2) {\n          return o1.uid_ - o2.uid_;\n        });\n        var anyNonEmpty = false;\n        observers.forEach(function (observer) {\n          var queue = observer.takeRecords();\n          removeTransientObserversFor(observer);\n          if (queue.length) {\n            observer.callback_(queue, observer);\n            anyNonEmpty = true;\n          }\n        });\n        if (anyNonEmpty) dispatchCallbacks();\n      }\n      function removeTransientObserversFor(observer) {\n        observer.nodes_.forEach(function (node) {\n          var registrations = registrationsTable.get(node);\n          if (!registrations) return;\n          registrations.forEach(function (registration) {\n            if (registration.observer === observer) registration.removeTransientObservers();\n          });\n        });\n      }\n      function forEachAncestorAndObserverEnqueueRecord(target, callback) {\n        for (var node = target; node; node = node.parentNode) {\n          var registrations = registrationsTable.get(node);\n          if (registrations) {\n            for (var j = 0; j < registrations.length; j++) {\n              var registration = registrations[j];\n              var options = registration.options;\n              if (node !== target && !options.subtree) continue;\n              var record = callback(options);\n              if (record) registration.enqueue(record);\n            }\n          }\n        }\n      }\n      var uidCounter = 0;\n      function JsMutationObserver(callback) {\n        this.callback_ = callback;\n        this.nodes_ = [];\n        this.records_ = [];\n        this.uid_ = ++uidCounter;\n      }\n      JsMutationObserver.prototype = {\n        observe: function observe(target, options) {\n          target = wrapIfNeeded(target);\n          if (!options.childList && !options.attributes && !options.characterData || options.attributeOldValue && !options.attributes || options.attributeFilter && options.attributeFilter.length && !options.attributes || options.characterDataOldValue && !options.characterData) {\n            throw new SyntaxError();\n          }\n          var registrations = registrationsTable.get(target);\n          if (!registrations) registrationsTable.set(target, registrations = []);\n          var registration;\n          for (var i = 0; i < registrations.length; i++) {\n            if (registrations[i].observer === this) {\n              registration = registrations[i];\n              registration.removeListeners();\n              registration.options = options;\n              break;\n            }\n          }\n          if (!registration) {\n            registration = new Registration(this, target, options);\n            registrations.push(registration);\n            this.nodes_.push(target);\n          }\n          registration.addListeners();\n        },\n        disconnect: function disconnect() {\n          this.nodes_.forEach(function (node) {\n            var registrations = registrationsTable.get(node);\n            for (var i = 0; i < registrations.length; i++) {\n              var registration = registrations[i];\n              if (registration.observer === this) {\n                registration.removeListeners();\n                registrations.splice(i, 1);\n                break;\n              }\n            }\n          }, this);\n          this.records_ = [];\n        },\n        takeRecords: function takeRecords() {\n          var copyOfRecords = this.records_;\n          this.records_ = [];\n          return copyOfRecords;\n        }\n      };\n      function MutationRecord(type, target) {\n        this.type = type;\n        this.target = target;\n        this.addedNodes = [];\n        this.removedNodes = [];\n        this.previousSibling = null;\n        this.nextSibling = null;\n        this.attributeName = null;\n        this.attributeNamespace = null;\n        this.oldValue = null;\n      }\n      function copyMutationRecord(original) {\n        var record = new MutationRecord(original.type, original.target);\n        record.addedNodes = original.addedNodes.slice();\n        record.removedNodes = original.removedNodes.slice();\n        record.previousSibling = original.previousSibling;\n        record.nextSibling = original.nextSibling;\n        record.attributeName = original.attributeName;\n        record.attributeNamespace = original.attributeNamespace;\n        record.oldValue = original.oldValue;\n        return record;\n      }\n      var currentRecord, recordWithOldValue;\n      function getRecord(type, target) {\n        return currentRecord = new MutationRecord(type, target);\n      }\n      function getRecordWithOldValue(oldValue) {\n        if (recordWithOldValue) {\n          return recordWithOldValue;\n        }recordWithOldValue = copyMutationRecord(currentRecord);\n        recordWithOldValue.oldValue = oldValue;\n        return recordWithOldValue;\n      }\n      function clearRecords() {\n        currentRecord = recordWithOldValue = undefined;\n      }\n      function recordRepresentsCurrentMutation(record) {\n        return record === recordWithOldValue || record === currentRecord;\n      }\n      function selectRecord(lastRecord, newRecord) {\n        if (lastRecord === newRecord) {\n          return lastRecord;\n        }if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord)) {\n          return recordWithOldValue;\n        }return null;\n      }\n      function Registration(observer, target, options) {\n        this.observer = observer;\n        this.target = target;\n        this.options = options;\n        this.transientObservedNodes = [];\n      }\n      Registration.prototype = {\n        enqueue: function enqueue(record) {\n          var records = this.observer.records_;\n          var length = records.length;\n          if (records.length > 0) {\n            var lastRecord = records[length - 1];\n            var recordToReplaceLast = selectRecord(lastRecord, record);\n            if (recordToReplaceLast) {\n              records[length - 1] = recordToReplaceLast;\n              return;\n            }\n          } else {\n            scheduleCallback(this.observer);\n          }\n          records[length] = record;\n        },\n        addListeners: function addListeners() {\n          this.addListeners_(this.target);\n        },\n        addListeners_: function addListeners_(node) {\n          var options = this.options;\n          if (options.attributes) node.addEventListener(\"DOMAttrModified\", this, true);\n          if (options.characterData) node.addEventListener(\"DOMCharacterDataModified\", this, true);\n          if (options.childList) node.addEventListener(\"DOMNodeInserted\", this, true);\n          if (options.childList || options.subtree) node.addEventListener(\"DOMNodeRemoved\", this, true);\n        },\n        removeListeners: function removeListeners() {\n          this.removeListeners_(this.target);\n        },\n        removeListeners_: function removeListeners_(node) {\n          var options = this.options;\n          if (options.attributes) node.removeEventListener(\"DOMAttrModified\", this, true);\n          if (options.characterData) node.removeEventListener(\"DOMCharacterDataModified\", this, true);\n          if (options.childList) node.removeEventListener(\"DOMNodeInserted\", this, true);\n          if (options.childList || options.subtree) node.removeEventListener(\"DOMNodeRemoved\", this, true);\n        },\n        addTransientObserver: function addTransientObserver(node) {\n          if (node === this.target) {\n            return;\n          }this.addListeners_(node);\n          this.transientObservedNodes.push(node);\n          var registrations = registrationsTable.get(node);\n          if (!registrations) registrationsTable.set(node, registrations = []);\n          registrations.push(this);\n        },\n        removeTransientObservers: function removeTransientObservers() {\n          var transientObservedNodes = this.transientObservedNodes;\n          this.transientObservedNodes = [];\n          transientObservedNodes.forEach(function (node) {\n            this.removeListeners_(node);\n            var registrations = registrationsTable.get(node);\n            for (var i = 0; i < registrations.length; i++) {\n              if (registrations[i] === this) {\n                registrations.splice(i, 1);\n                break;\n              }\n            }\n          }, this);\n        },\n        handleEvent: function handleEvent(e) {\n          e.stopImmediatePropagation();\n          switch (e.type) {\n            case \"DOMAttrModified\":\n              var name = e.attrName;\n              var namespace = e.relatedNode.namespaceURI;\n              var target = e.target;\n              var record = new getRecord(\"attributes\", target);\n              record.attributeName = name;\n              record.attributeNamespace = namespace;\n              var oldValue = e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\n              forEachAncestorAndObserverEnqueueRecord(target, function (options) {\n                if (!options.attributes) return;\n                if (options.attributeFilter && options.attributeFilter.length && options.attributeFilter.indexOf(name) === -1 && options.attributeFilter.indexOf(namespace) === -1) {\n                  return;\n                }\n                if (options.attributeOldValue) return getRecordWithOldValue(oldValue);\n                return record;\n              });\n              break;\n\n            case \"DOMCharacterDataModified\":\n              var target = e.target;\n              var record = getRecord(\"characterData\", target);\n              var oldValue = e.prevValue;\n              forEachAncestorAndObserverEnqueueRecord(target, function (options) {\n                if (!options.characterData) return;\n                if (options.characterDataOldValue) return getRecordWithOldValue(oldValue);\n                return record;\n              });\n              break;\n\n            case \"DOMNodeRemoved\":\n              this.addTransientObserver(e.target);\n\n            case \"DOMNodeInserted\":\n              var changedNode = e.target;\n              var addedNodes, removedNodes;\n              if (e.type === \"DOMNodeInserted\") {\n                addedNodes = [changedNode];\n                removedNodes = [];\n              } else {\n                addedNodes = [];\n                removedNodes = [changedNode];\n              }\n              var previousSibling = changedNode.previousSibling;\n              var nextSibling = changedNode.nextSibling;\n              var record = getRecord(\"childList\", e.target.parentNode);\n              record.addedNodes = addedNodes;\n              record.removedNodes = removedNodes;\n              record.previousSibling = previousSibling;\n              record.nextSibling = nextSibling;\n              forEachAncestorAndObserverEnqueueRecord(e.relatedNode, function (options) {\n                if (!options.childList) return;\n                return record;\n              });\n          }\n          clearRecords();\n        }\n      };\n      global.JsMutationObserver = JsMutationObserver;\n      if (!global.MutationObserver) {\n        global.MutationObserver = JsMutationObserver;\n        JsMutationObserver._isPolyfilled = true;\n      }\n    })(self);\n  })(window); // Atlassian: added IIFE\n});","(function (factory) {\n  if (typeof define === \"function\" && define.amd) {\n    define([\"exports\", \"module\", \"./constants\", \"./globals\", \"./utils\"], factory);\n  } else if (typeof exports !== \"undefined\" && typeof module !== \"undefined\") {\n    factory(exports, module, require(\"./constants\"), require(\"./globals\"), require(\"./utils\"));\n  }\n})(function (exports, module, _constants, _globals, _utils) {\n  \"use strict\";\n\n  var _interopRequire = function (obj) { return obj && obj.__esModule ? obj[\"default\"] : obj; };\n\n  var TYPE_ATTRIBUTE = _constants.TYPE_ATTRIBUTE;\n  var TYPE_CLASSNAME = _constants.TYPE_CLASSNAME;\n  var TYPE_ELEMENT = _constants.TYPE_ELEMENT;\n\n  var globals = _interopRequire(_globals);\n\n  var hasOwn = _utils.hasOwn;\n  var isValidNativeCustomElementName = _utils.isValidNativeCustomElementName;\n  var supportsNativeCustomElements = _utils.supportsNativeCustomElements;\n\n  /**\n   * Returns the class list for the specified element.\n   *\n   * @param {Element} element The element to get the class list for.\n   *\n   * @returns {ClassList | Array}\n   */\n  function getClassList(element) {\n    var classList = element.classList;\n\n    if (classList) {\n      return classList;\n    }\n\n    var attrs = element.attributes;\n\n    return attrs[\"class\"] && attrs[\"class\"].nodeValue.split(/\\s+/) || [];\n  }\n\n  module.exports = {\n    clear: function clear() {\n      globals.registry = {};\n      return this;\n    },\n\n    get: function get(id) {\n      return hasOwn(globals.registry, id) && globals.registry[id];\n    },\n\n    getForElement: function getForElement(element) {\n      var attrs = element.attributes;\n      var attrsLen = attrs.length;\n      var definitions = [];\n      var isAttr = attrs.is;\n      var isAttrValue = isAttr && (isAttr.value || isAttr.nodeValue);\n\n      // Using localName as fallback for edge cases when processing <object> tag that is used\n      // as inteface to NPAPI plugin.\n      var tag = (element.tagName || element.localName).toLowerCase();\n      var isAttrOrTag = isAttrValue || tag;\n      var definition;\n      var tagToExtend;\n\n      if (this.isType(isAttrOrTag, TYPE_ELEMENT)) {\n        definition = globals.registry[isAttrOrTag];\n        tagToExtend = definition[\"extends\"];\n\n        if (isAttrValue) {\n          if (tag === tagToExtend) {\n            definitions.push(definition);\n          }\n        } else if (!tagToExtend) {\n          definitions.push(definition);\n        }\n      }\n\n      for (var a = 0; a < attrsLen; a++) {\n        var attr = attrs[a].nodeName;\n\n        if (this.isType(attr, TYPE_ATTRIBUTE)) {\n          definition = globals.registry[attr];\n          tagToExtend = definition[\"extends\"];\n\n          if (!tagToExtend || tag === tagToExtend) {\n            definitions.push(definition);\n          }\n        }\n      }\n\n      var classList = getClassList(element);\n      var classListLen = classList.length;\n\n      for (var b = 0; b < classListLen; b++) {\n        var className = classList[b];\n\n        if (this.isType(className, TYPE_CLASSNAME)) {\n          definition = globals.registry[className];\n          tagToExtend = definition[\"extends\"];\n\n          if (!tagToExtend || tag === tagToExtend) {\n            definitions.push(definition);\n          }\n        }\n      }\n\n      return definitions;\n    },\n\n    isType: function isType(id, type) {\n      var def = this.get(id);\n      return def && def.type === type;\n    },\n\n    isNativeCustomElement: function isNativeCustomElement(id) {\n      return supportsNativeCustomElements() && this.isType(id, TYPE_ELEMENT) && isValidNativeCustomElementName(id);\n    },\n\n    set: function set(id, definition) {\n      if (hasOwn(globals.registry, id)) {\n        throw new Error(\"A component definition of type \\\"\" + definition.type + \"\\\" with the ID of \\\"\" + id + \"\\\" already exists.\");\n      }\n\n      globals.registry[id] = definition;\n\n      return this;\n    }\n  };\n});","(function (factory) {\n  if (typeof define === \"function\" && define.amd) {\n    define([\"exports\", \"module\", \"./constants\", \"./document-observer\", \"./lifecycle\", \"./registry\", \"./utils\", \"./version\"], factory);\n  } else if (typeof exports !== \"undefined\" && typeof module !== \"undefined\") {\n    factory(exports, module, require(\"./constants\"), require(\"./document-observer\"), require(\"./lifecycle\"), require(\"./registry\"), require(\"./utils\"), require(\"./version\"));\n  }\n})(function (exports, module, _constants, _documentObserver, _lifecycle, _registry, _utils, _version) {\n  \"use strict\";\n\n  var _interopRequire = function (obj) { return obj && obj.__esModule ? obj[\"default\"] : obj; };\n\n  var TYPE_ATTRIBUTE = _constants.TYPE_ATTRIBUTE;\n  var TYPE_CLASSNAME = _constants.TYPE_CLASSNAME;\n  var TYPE_ELEMENT = _constants.TYPE_ELEMENT;\n\n  var documentObserver = _interopRequire(_documentObserver);\n\n  var triggerCreated = _lifecycle.triggerCreated;\n  var triggerAttached = _lifecycle.triggerAttached;\n  var triggerDetached = _lifecycle.triggerDetached;\n  var triggerAttributeChanged = _lifecycle.triggerAttributeChanged;\n  var initElements = _lifecycle.initElements;\n\n  var registry = _interopRequire(_registry);\n\n  var debounce = _utils.debounce;\n  var inherit = _utils.inherit;\n\n  var version = _interopRequire(_version);\n\n  var HTMLElement = window.HTMLElement; //jshint ignore:line\n\n  // IE <= 10 can fire \"interactive\" too early (#243).\n  var isOldIE = !!document.attachEvent; // attachEvent was removed in IE11.\n\n  function isReady() {\n    if (isOldIE) {\n      return document.readyState === \"complete\";\n    } else {\n      return document.readyState === \"interactive\" || document.readyState === \"complete\";\n    }\n  }\n\n  /**\n   * Initialises all valid elements in the document. Ensures that it does not\n   * happen more than once in the same execution, and that it happens after the DOM is ready.\n   *\n   * @returns {undefined}\n   */\n  var initDocument = debounce(function () {\n    var initialiseSkateElementsOnDomLoad = function initialiseSkateElementsOnDomLoad() {\n      initElements(document.documentElement.childNodes);\n    };\n    if (isReady()) {\n      initialiseSkateElementsOnDomLoad();\n    } else {\n      if (isOldIE) {\n        window.addEventListener(\"load\", initialiseSkateElementsOnDomLoad);\n      } else {\n        document.addEventListener(\"DOMContentLoaded\", initialiseSkateElementsOnDomLoad);\n      }\n    }\n  });\n\n  /**\n   * Creates a constructor for the specified definition.\n   *\n   * @param {Object} definition The definition information to use for generating the constructor.\n   *\n   * @returns {Function} The element constructor.\n   */\n  function makeElementConstructor(definition) {\n    function CustomElement() {\n      var element;\n      var tagToExtend = definition[\"extends\"];\n      var definitionId = definition.id;\n\n      if (tagToExtend) {\n        element = document.createElement(tagToExtend);\n        element.setAttribute(\"is\", definitionId);\n      } else {\n        element = document.createElement(definitionId);\n      }\n\n      // Ensure the definition prototype is up to date with the element's\n      // prototype. This ensures that overwriting the element prototype still\n      // works.\n      definition.prototype = CustomElement.prototype;\n\n      // If they use the constructor we don't have to wait until it's attached.\n      triggerCreated(element, definition);\n\n      return element;\n    }\n\n    // This allows modifications to the element prototype propagate to the\n    // definition prototype.\n    CustomElement.prototype = definition.prototype;\n\n    return CustomElement;\n  }\n\n  // Public API\n  // ----------\n\n  /**\n   * Creates a listener for the specified definition.\n   *\n   * @param {String} id The ID of the definition.\n   * @param {Object | Function} definition The definition definition.\n   *\n   * @returns {Function} Constructor that returns a custom element.\n   */\n  function skate(id, definition) {\n    // Just in case the definition is shared, we duplicate it so that internal\n    // modifications to the original aren't shared.\n    definition = inherit({}, definition);\n    definition = inherit(definition, skate.defaults);\n    definition.id = id;\n\n    registry.set(id, definition);\n\n    if (registry.isNativeCustomElement(id)) {\n      var elementPrototype = definition[\"extends\"] ? document.createElement(definition[\"extends\"]).constructor.prototype : HTMLElement.prototype;\n\n      if (!elementPrototype.isPrototypeOf(definition.prototype)) {\n        definition.prototype = inherit(Object.create(elementPrototype), definition.prototype, true);\n      }\n\n      var options = {\n        prototype: inherit(definition.prototype, {\n          createdCallback: function createdCallback() {\n            triggerCreated(this, definition);\n          },\n          attachedCallback: function attachedCallback() {\n            triggerAttached(this, definition);\n          },\n          detachedCallback: function detachedCallback() {\n            triggerDetached(this, definition);\n          },\n          attributeChangedCallback: function attributeChangedCallback(name, oldValue, newValue) {\n            triggerAttributeChanged(this, definition, {\n              name: name,\n              oldValue: oldValue,\n              newValue: newValue\n            });\n          }\n        })\n      };\n\n      if (definition[\"extends\"]) {\n        options[\"extends\"] = definition[\"extends\"];\n      }\n\n      return document.registerElement(id, options);\n    }\n\n    initDocument();\n    documentObserver.register(!!definition.detached);\n\n    if (registry.isType(id, TYPE_ELEMENT)) {\n      return makeElementConstructor(definition);\n    }\n  }\n\n  /**\n   * Synchronously initialises the specified element or elements and descendants.\n   *\n   * @param {Mixed} nodes The node, or nodes to initialise. Can be anything:\n   *                      jQuery, DOMNodeList, DOMNode, selector etc.\n   *\n   * @returns {skate}\n   */\n  skate.init = function (nodes) {\n    var nodesToUse = nodes;\n\n    if (!nodes) {\n      return nodes;\n    }\n\n    if (typeof nodes === \"string\") {\n      nodesToUse = nodes = document.querySelectorAll(nodes);\n    } else if (nodes instanceof HTMLElement) {\n      nodesToUse = [nodes];\n    }\n\n    initElements(nodesToUse);\n\n    return nodes;\n  };\n\n  // Restriction type constants.\n  skate.type = {\n    ATTRIBUTE: TYPE_ATTRIBUTE,\n    CLASSNAME: TYPE_CLASSNAME,\n    ELEMENT: TYPE_ELEMENT\n  };\n\n  // Makes checking the version easy when debugging.\n  skate.version = version;\n\n  /**\n   * The default options for a definition.\n   *\n   * @var {Object}\n   */\n  skate.defaults = {\n    // Attribute lifecycle callback or callbacks.\n    attributes: undefined,\n\n    // The events to manage the binding and unbinding of during the definition's\n    // lifecycle.\n    events: undefined,\n\n    // Restricts a particular definition to binding explicitly to an element with\n    // a tag name that matches the specified value.\n    \"extends\": undefined,\n\n    // The ID of the definition. This is automatically set in the `skate()`\n    // function.\n    id: \"\",\n\n    // Properties and methods to add to each element.\n    prototype: {},\n\n    // The attribute name to add after calling the created() callback.\n    resolvedAttribute: \"resolved\",\n\n    // The template to replace the content of the element with.\n    template: undefined,\n\n    // The type of bindings to allow.\n    type: TYPE_ELEMENT,\n\n    // The attribute name to remove after calling the created() callback.\n    unresolvedAttribute: \"unresolved\"\n  };\n\n  // Exporting\n  // ---------\n\n  var previousSkate = window.skate;\n  skate.noConflict = function () {\n    window.skate = previousSkate;\n    return skate;\n  };\n\n  // Global\n  window.skate = skate;\n\n  // ES6\n  module.exports = skate;\n});","(function (factory) {\n  if (typeof define === \"function\" && define.amd) {\n    define([\"exports\", \"./constants\"], factory);\n  } else if (typeof exports !== \"undefined\") {\n    factory(exports, require(\"./constants\"));\n  }\n})(function (exports, _constants) {\n\n  /**\n   * Checks {}.hasOwnProperty in a safe way.\n   *\n   * @param {Object} obj The object the property is on.\n   * @param {String} key The object key to check.\n   *\n   * @returns {Boolean}\n   */\n  \"use strict\";\n\n  exports.hasOwn = hasOwn;\n\n  /**\n   * Camel-cases the specified string.\n   *\n   * @param {String} str The string to camel-case.\n   *\n   * @returns {String}\n   */\n  exports.camelCase = camelCase;\n\n  /**\n   * Returns whether or not the source element contains the target element.\n   * This is for browsers that don't support Element.prototype.contains on an\n   * HTMLUnknownElement.\n   *\n   * @param {HTMLElement} source The source element.\n   * @param {HTMLElement} target The target element.\n   *\n   * @returns {Boolean}\n   */\n  exports.elementContains = elementContains;\n\n  /**\n   * Returns a function that will prevent more than one call in a single clock\n   * tick.\n   *\n   * @param {Function} fn The function to call.\n   *\n   * @returns {Function}\n   */\n  exports.debounce = debounce;\n\n  /**\n   * Returns whether or not the specified element has been selectively ignored.\n   *\n   * @param {Element} element The element to check and traverse up from.\n   *\n   * @returns {Boolean}\n   */\n  exports.getClosestIgnoredElement = getClosestIgnoredElement;\n\n  /**\n   * Merges the second argument into the first.\n   *\n   * @param {Object} child The object to merge into.\n   * @param {Object} parent The object to merge from.\n   * @param {Boolean} overwrite Whether or not to overwrite properties on the child.\n   *\n   * @returns {Object} Returns the child object.\n   */\n  exports.inherit = inherit;\n\n  /**\n   * Traverses an object checking hasOwnProperty.\n   *\n   * @param {Object} obj The object to traverse.\n   * @param {Function} fn The function to call for each item in the object.\n   *\n   * @returns {undefined}\n   */\n  exports.objEach = objEach;\n  exports.supportsNativeCustomElements = supportsNativeCustomElements;\n  exports.isValidNativeCustomElementName = isValidNativeCustomElementName;\n  Object.defineProperty(exports, \"__esModule\", {\n    value: true\n  });\n  \"use strict\";\n\n  var ATTR_IGNORE = _constants.ATTR_IGNORE;\n  var elementPrototype = window.HTMLElement.prototype;\n  exports.elementPrototype = elementPrototype;\n  var elementPrototypeContains = elementPrototype.contains;\n  function hasOwn(obj, key) {\n    return Object.prototype.hasOwnProperty.call(obj, key);\n  }\n\n  function camelCase(str) {\n    return str.split(/-/g).map(function (str, index) {\n      return index === 0 ? str : str[0].toUpperCase() + str.substring(1);\n    }).join(\"\");\n  }\n\n  function elementContains(source, target) {\n    // The document element does not have the contains method in IE.\n    if (source === document && !source.contains) {\n      return document.head.contains(target) || document.body.contains(target);\n    }\n\n    return source.contains ? source.contains(target) : elementPrototypeContains.call(source, target);\n  }\n\n  function debounce(fn) {\n    var called = false;\n\n    return function () {\n      if (!called) {\n        called = true;\n        setTimeout(function () {\n          called = false;\n          fn();\n        }, 1);\n      }\n    };\n  }\n\n  function getClosestIgnoredElement(element) {\n    var parent = element;\n\n    // e.g. document doesn't have a function hasAttribute; no need to go further up\n    while (parent instanceof Element) {\n      if (parent.hasAttribute(ATTR_IGNORE)) {\n        return parent;\n      }\n\n      parent = parent.parentNode;\n    }\n  }\n\n  function inherit(child, parent, overwrite) {\n    var names = Object.getOwnPropertyNames(parent);\n    var namesLen = names.length;\n\n    for (var a = 0; a < namesLen; a++) {\n      var name = names[a];\n\n      if (overwrite || child[name] === undefined) {\n        var desc = Object.getOwnPropertyDescriptor(parent, name);\n        var shouldDefineProps = desc.get || desc.set || !desc.writable || !desc.enumerable || !desc.configurable;\n\n        if (shouldDefineProps) {\n          Object.defineProperty(child, name, desc);\n        } else {\n          child[name] = parent[name];\n        }\n      }\n    }\n\n    return child;\n  }\n\n  function objEach(obj, fn) {\n    for (var a in obj) {\n      if (hasOwn(obj, a)) {\n        fn(obj[a], a);\n      }\n    }\n  }\n\n  function supportsNativeCustomElements() {\n    return typeof document.registerElement === \"function\";\n  }\n\n  function isValidNativeCustomElementName(name) {\n    return name.indexOf(\"-\") > 0;\n  }\n});","(function (factory) {\n  if (typeof define === \"function\" && define.amd) {\n    define([\"exports\", \"module\"], factory);\n  } else if (typeof exports !== \"undefined\" && typeof module !== \"undefined\") {\n    factory(exports, module);\n  }\n})(function (exports, module) {\n  \"use strict\";\n\n  module.exports = \"0.13.17\";\n});","/**!\n* TableSorter 2.17.8 - Client-side table sorting with ease!\n* @requires jQuery v1.2.6+\n*\n* Copyright (c) 2007 Christian Bach\n* Examples and docs at: http://tablesorter.com\n* Dual licensed under the MIT and GPL licenses:\n* http://www.opensource.org/licenses/mit-license.php\n* http://www.gnu.org/licenses/gpl.html\n*\n* @type jQuery\n* @name tablesorter\n* @cat Plugins/Tablesorter\n* @author Christian Bach/christian.bach@polyester.se\n* @contributor Rob Garrison/https://github.com/Mottie/tablesorter\n*/\n/**!\n * Modified by Atlassian.\n */\n/*jshint browser:true, jquery:true, unused:false, expr: true */\n/*global console:false, alert:false */\n!(function($) {\n\t\"use strict\";\n\t$.extend({\n\t\t/*jshint supernew:true */\n\t\ttablesorter: new function() {\n\n\t\t\tvar ts = this;\n\n\t\t\tts.version = \"2.17.8\";\n\n\t\t\tts.parsers = [];\n\t\t\tts.widgets = [];\n\t\t\tts.defaults = {\n\n\t\t\t\t// *** appearance\n\t\t\t\ttheme            : 'default',  // adds tablesorter-{theme} to the table for styling\n\t\t\t\twidthFixed       : false,      // adds colgroup to fix widths of columns\n\t\t\t\tshowProcessing   : false,      // show an indeterminate timer icon in the header when the table is sorted or filtered.\n\n\t\t\t\theaderTemplate   : '{content}',// header layout template (HTML ok); {content} = innerHTML, {icon} = <i/> (class from cssIcon)\n\t\t\t\tonRenderTemplate : null,       // function(index, template){ return template; }, (template is a string)\n\t\t\t\tonRenderHeader   : null,       // function(index){}, (nothing to return)\n\n\t\t\t\t// *** functionality\n\t\t\t\tcancelSelection  : true,       // prevent text selection in the header\n\t\t\t\ttabIndex         : true,       // add tabindex to header for keyboard accessibility\n\t\t\t\tdateFormat       : 'mmddyyyy', // other options: \"ddmmyyy\" or \"yyyymmdd\"\n\t\t\t\tsortMultiSortKey : 'shiftKey', // key used to select additional columns\n\t\t\t\tsortResetKey     : 'ctrlKey',  // key used to remove sorting on a column\n\t\t\t\tusNumberFormat   : true,       // false for German \"1.234.567,89\" or French \"1 234 567,89\"\n\t\t\t\tdelayInit        : false,      // if false, the parsed table contents will not update until the first sort\n\t\t\t\tserverSideSorting: false,      // if true, server-side sorting should be performed because client-side sorting will be disabled, but the ui and events will still be used.\n\n\t\t\t\t// *** sort options\n\t\t\t\theaders          : {},         // set sorter, string, empty, locked order, sortInitialOrder, filter, etc.\n\t\t\t\tignoreCase       : true,       // ignore case while sorting\n\t\t\t\tsortForce        : null,       // column(s) first sorted; always applied\n\t\t\t\tsortList         : [],         // Initial sort order; applied initially; updated when manually sorted\n\t\t\t\tsortAppend       : null,       // column(s) sorted last; always applied\n\t\t\t\tsortStable       : false,      // when sorting two rows with exactly the same content, the original sort order is maintained\n\n\t\t\t\tsortInitialOrder : 'asc',      // sort direction on first click\n\t\t\t\tsortLocaleCompare: false,      // replace equivalent character (accented characters)\n\t\t\t\tsortReset        : false,      // third click on the header will reset column to default - unsorted\n\t\t\t\tsortRestart      : false,      // restart sort to \"sortInitialOrder\" when clicking on previously unsorted columns\n\n\t\t\t\temptyTo          : 'bottom',   // sort empty cell to bottom, top, none, zero\n\t\t\t\tstringTo         : 'max',      // sort strings in numerical column as max, min, top, bottom, zero\n\t\t\t\ttextExtraction   : 'basic',    // text extraction method/function - function(node, table, cellIndex){}\n\t\t\t\ttextAttribute    : 'data-text',// data-attribute that contains alternate cell text (used in textExtraction function)\n\t\t\t\ttextSorter       : null,       // choose overall or specific column sorter function(a, b, direction, table, columnIndex) [alt: ts.sortText]\n\t\t\t\tnumberSorter     : null,       // choose overall numeric sorter function(a, b, direction, maxColumnValue)\n\n\t\t\t\t// *** widget options\n\t\t\t\twidgets: [],                   // method to add widgets, e.g. widgets: ['zebra']\n\t\t\t\twidgetOptions    : {\n\t\t\t\t\tzebra : [ 'even', 'odd' ]    // zebra widget alternating row class names\n\t\t\t\t},\n\t\t\t\tinitWidgets      : true,       // apply widgets on tablesorter initialization\n\n\t\t\t\t// *** callbacks\n\t\t\t\tinitialized      : null,       // function(table){},\n\n\t\t\t\t// *** extra css class names\n\t\t\t\ttableClass       : '',\n\t\t\t\tcssAsc           : '',\n\t\t\t\tcssDesc          : '',\n\t\t\t\tcssNone          : '',\n\t\t\t\tcssHeader        : '',\n\t\t\t\tcssHeaderRow     : '',\n\t\t\t\tcssProcessing    : '', // processing icon applied to header during sort/filter\n\n\t\t\t\tcssChildRow      : 'tablesorter-childRow', // class name indiciating that a row is to be attached to the its parent \n\t\t\t\tcssIcon          : 'tablesorter-icon',     //  if this class exists, a <i> will be added to the header automatically\n\t\t\t\tcssInfoBlock     : 'tablesorter-infoOnly', // don't sort tbody with this class name (only one class name allowed here!)\n\n\t\t\t\t// *** selectors\n\t\t\t\tselectorHeaders  : '> thead th, > thead td',\n\t\t\t\tselectorSort     : 'th, td',   // jQuery selector of content within selectorHeaders that is clickable to trigger a sort\n\t\t\t\tselectorRemove   : '.remove-me',\n\n\t\t\t\t// *** advanced\n\t\t\t\tdebug            : false,\n\n\t\t\t\t// *** Internal variables\n\t\t\t\theaderList: [],\n\t\t\t\tempties: {},\n\t\t\t\tstrings: {},\n\t\t\t\tparsers: []\n\n\t\t\t\t// deprecated; but retained for backwards compatibility\n\t\t\t\t// widgetZebra: { css: [\"even\", \"odd\"] }\n\n\t\t\t};\n\n\t\t\t// internal css classes - these will ALWAYS be added to\n\t\t\t// the table and MUST only contain one class name - fixes #381\n\t\t\tts.css = {\n\t\t\t\ttable      : 'tablesorter',\n\t\t\t\tcssHasChild: 'tablesorter-hasChildRow',\n\t\t\t\tchildRow   : 'tablesorter-childRow',\n\t\t\t\theader     : 'tablesorter-header',\n\t\t\t\theaderRow  : 'tablesorter-headerRow',\n\t\t\t\theaderIn   : 'tablesorter-header-inner',\n\t\t\t\ticon       : 'tablesorter-icon',\n\t\t\t\tinfo       : 'tablesorter-infoOnly',\n\t\t\t\tprocessing : 'tablesorter-processing',\n\t\t\t\tsortAsc    : 'tablesorter-headerAsc',\n\t\t\t\tsortDesc   : 'tablesorter-headerDesc',\n\t\t\t\tsortNone   : 'tablesorter-headerUnSorted'\n\t\t\t};\n\n\t\t\t// labels applied to sortable headers for accessibility (aria) support\n\t\t\tts.language = {\n\t\t\t\tsortAsc  : 'Ascending sort applied, ',\n\t\t\t\tsortDesc : 'Descending sort applied, ',\n\t\t\t\tsortNone : 'No sort applied, ',\n\t\t\t\tnextAsc  : 'activate to apply an ascending sort',\n\t\t\t\tnextDesc : 'activate to apply a descending sort',\n\t\t\t\tnextNone : 'activate to remove the sort'\n\t\t\t};\n\n\t\t\t/* debuging utils */\n\t\t\tfunction log() {\n\t\t\t\tvar a = arguments[0],\n\t\t\t\t\ts = arguments.length > 1 ? Array.prototype.slice.call(arguments) : a;\n\t\t\t\tif (typeof console !== \"undefined\" && typeof console.log !== \"undefined\") {\n\t\t\t\t\tconsole[ /error/i.test(a) ? 'error' : /warn/i.test(a) ? 'warn' : 'log' ](s);\n\t\t\t\t} else {\n\t\t\t\t\talert(s);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction benchmark(s, d) {\n\t\t\t\tlog(s + \" (\" + (new Date().getTime() - d.getTime()) + \"ms)\");\n\t\t\t}\n\n\t\t\tts.log = log;\n\t\t\tts.benchmark = benchmark;\n\n\t\t\t// $.isEmptyObject from jQuery v1.4\n\t\t\tfunction isEmptyObject(obj) {\n\t\t\t\t/*jshint forin: false */\n\t\t\t\tfor (var name in obj) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tfunction getElementText(table, node, cellIndex) {\n\t\t\t\tif (!node) { return \"\"; }\n\t\t\t\tvar te, c = table.config,\n\t\t\t\t\tt = c.textExtraction || '',\n\t\t\t\t\ttext = \"\";\n\t\t\t\tif (t === \"basic\") {\n\t\t\t\t\t// check data-attribute first\n\t\t\t\t\ttext = $(node).attr(c.textAttribute) || node.textContent || node.innerText || $(node).text() || \"\";\n\t\t\t\t} else {\n\t\t\t\t\tif (typeof(t) === \"function\") {\n\t\t\t\t\t\ttext = t(node, table, cellIndex);\n\t\t\t\t\t} else if (typeof (te = ts.getColumnData( table, t, cellIndex )) === 'function') {\n\t\t\t\t\t\ttext = te(node, table, cellIndex);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// previous \"simple\" method\n\t\t\t\t\t\ttext = node.textContent || node.innerText || $(node).text() || \"\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn (text === undefined || text === null) ? \"\" : text.trim();\n\t\t\t}\n\n\t\t\tfunction detectParserForColumn(table, rows, rowIndex, cellIndex) {\n\t\t\t\tvar cur,\n\t\t\t\ti = ts.parsers.length,\n\t\t\t\tnode = false,\n\t\t\t\tnodeValue = '',\n\t\t\t\tkeepLooking = true;\n\t\t\t\twhile (nodeValue === '' && keepLooking) {\n\t\t\t\t\trowIndex++;\n\t\t\t\t\tif (rows[rowIndex]) {\n\t\t\t\t\t\tnode = rows[rowIndex].cells[cellIndex];\n\t\t\t\t\t\tnodeValue = getElementText(table, node, cellIndex);\n\t\t\t\t\t\tif (table.config.debug) {\n\t\t\t\t\t\t\tlog('Checking if value was empty on row ' + rowIndex + ', column: ' + cellIndex + ': \"' + nodeValue + '\"');\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tkeepLooking = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\twhile (--i >= 0) {\n\t\t\t\t\tcur = ts.parsers[i];\n\t\t\t\t\t// ignore the default text parser because it will always be true\n\t\t\t\t\tif (cur && cur.id !== 'text' && cur.is && cur.is(nodeValue, table, node)) {\n\t\t\t\t\t\treturn cur;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// nothing found, return the generic parser (text)\n\t\t\t\treturn ts.getParserById('text');\n\t\t\t}\n\n\t\t\tfunction buildParserCache(table) {\n\t\t\t\tvar c = table.config,\n\t\t\t\t\t// update table bodies in case we start with an empty table\n\t\t\t\t\ttb = c.$tbodies = c.$table.children('tbody:not(.' + c.cssInfoBlock + ')'),\n\t\t\t\t\trows, list, l, i, h, ch, np, p, e, time,\n\t\t\t\t\tj = 0,\n\t\t\t\t\tparsersDebug = \"\",\n\t\t\t\t\tlen = tb.length;\n\t\t\t\tif ( len === 0) {\n\t\t\t\t\treturn c.debug ? log('Warning: *Empty table!* Not building a parser cache') : '';\n\t\t\t\t} else if (c.debug) {\n\t\t\t\t\ttime = new Date();\n\t\t\t\t\tlog('Detecting parsers for each column');\n\t\t\t\t}\n\t\t\t\tlist = {\n\t\t\t\t\textractors: [],\n\t\t\t\t\tparsers: []\n\t\t\t\t};\n\t\t\t\twhile (j < len) {\n\t\t\t\t\trows = tb[j].rows;\n\t\t\t\t\tif (rows[j]) {\n\t\t\t\t\t\tl = c.columns; // rows[j].cells.length;\n\t\t\t\t\t\tfor (i = 0; i < l; i++) {\n\t\t\t\t\t\t\th = c.$headers.filter('[data-column=\"' + i + '\"]:last');\n\t\t\t\t\t\t\t// get column indexed table cell\n\t\t\t\t\t\t\tch = ts.getColumnData( table, c.headers, i );\n\t\t\t\t\t\t\t// get column parser/extractor\n\t\t\t\t\t\t\te = ts.getParserById( ts.getData(h, ch, 'extractor') );\n\t\t\t\t\t\t\tp = ts.getParserById( ts.getData(h, ch, 'sorter') );\n\t\t\t\t\t\t\tnp = ts.getData(h, ch, 'parser') === 'false';\n\t\t\t\t\t\t\t// empty cells behaviour - keeping emptyToBottom for backwards compatibility\n\t\t\t\t\t\t\tc.empties[i] = ( ts.getData(h, ch, 'empty') || c.emptyTo || (c.emptyToBottom ? 'bottom' : 'top' ) ).toLowerCase();\n\t\t\t\t\t\t\t// text strings behaviour in numerical sorts\n\t\t\t\t\t\t\tc.strings[i] = ( ts.getData(h, ch, 'string') || c.stringTo || 'max' ).toLowerCase();\n\t\t\t\t\t\t\tif (np) {\n\t\t\t\t\t\t\t\tp = ts.getParserById('no-parser');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!e) {\n\t\t\t\t\t\t\t\t// For now, maybe detect someday\n\t\t\t\t\t\t\t\te = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!p) {\n\t\t\t\t\t\t\t\tp = detectParserForColumn(table, rows, -1, i);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (c.debug) {\n\t\t\t\t\t\t\t\tparsersDebug += \"column:\" + i + \"; extractor:\" + e.id + \"; parser:\" + p.id + \"; string:\" + c.strings[i] + '; empty: ' + c.empties[i] + \"\\n\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlist.parsers[i] = p;\n\t\t\t\t\t\t\tlist.extractors[i] = e;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tj += (list.parsers.length) ? len : 1;\n\t\t\t\t}\n\t\t\t\tif (c.debug) {\n\t\t\t\t\tlog(parsersDebug ? parsersDebug : \"No parsers detected\");\n\t\t\t\t\tbenchmark(\"Completed detecting parsers\", time);\n\t\t\t\t}\n\t\t\t\tc.parsers = list.parsers;\n\t\t\t\tc.extractors = list.extractors;\n\t\t\t}\n\n\t\t\t/* utils */\n\t\t\tfunction buildCache(table) {\n\t\t\t\tvar cc, t, tx, v, i, j, k, $row, rows, cols, cacheTime,\n\t\t\t\t\ttotalRows, rowData, colMax,\n\t\t\t\t\tc = table.config,\n\t\t\t\t\t$tb = c.$table.children('tbody'),\n\t\t\t\t\textractors = c.extractors,\n\t\t\t\t\tparsers = c.parsers;\n\t\t\t\tc.cache = {};\n\t\t\t\tc.totalRows = 0;\n\t\t\t\t// if no parsers found, return - it's an empty table.\n\t\t\t\tif (!parsers) {\n\t\t\t\t\treturn c.debug ? log('Warning: *Empty table!* Not building a cache') : '';\n\t\t\t\t}\n\t\t\t\tif (c.debug) {\n\t\t\t\t\tcacheTime = new Date();\n\t\t\t\t}\n\t\t\t\t// processing icon\n\t\t\t\tif (c.showProcessing) {\n\t\t\t\t\tts.isProcessing(table, true);\n\t\t\t\t}\n\t\t\t\tfor (k = 0; k < $tb.length; k++) {\n\t\t\t\t\tcolMax = []; // column max value per tbody\n\t\t\t\t\tcc = c.cache[k] = {\n\t\t\t\t\t\tnormalized: [] // array of normalized row data; last entry contains \"rowData\" above\n\t\t\t\t\t\t// colMax: #   // added at the end\n\t\t\t\t\t};\n\n\t\t\t\t\t// ignore tbodies with class name from c.cssInfoBlock\n\t\t\t\t\tif (!$tb.eq(k).hasClass(c.cssInfoBlock)) {\n\t\t\t\t\t\ttotalRows = ($tb[k] && $tb[k].rows.length) || 0;\n\t\t\t\t\t\tfor (i = 0; i < totalRows; ++i) {\n\t\t\t\t\t\t\trowData = {\n\t\t\t\t\t\t\t\t// order: original row order #\n\t\t\t\t\t\t\t\t// $row : jQuery Object[]\n\t\t\t\t\t\t\t\tchild: [] // child row text (filter widget)\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t/** Add the table data to main data array */\n\t\t\t\t\t\t\t$row = $($tb[k].rows[i]);\n\t\t\t\t\t\t\trows = [ new Array(c.columns) ];\n\t\t\t\t\t\t\tcols = [];\n\t\t\t\t\t\t\t// if this is a child row, add it to the last row's children and continue to the next row\n\t\t\t\t\t\t\t// ignore child row class, if it is the first row\n\t\t\t\t\t\t\tif ($row.hasClass(c.cssChildRow) && i !== 0) {\n\t\t\t\t\t\t\t\tt = cc.normalized.length - 1;\n\t\t\t\t\t\t\t\tcc.normalized[t][c.columns].$row = cc.normalized[t][c.columns].$row.add($row);\n\t\t\t\t\t\t\t\t// add \"hasChild\" class name to parent row\n\t\t\t\t\t\t\t\tif (!$row.prev().hasClass(c.cssChildRow)) {\n\t\t\t\t\t\t\t\t\t$row.prev().addClass(ts.css.cssHasChild);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// save child row content (un-parsed!)\n\t\t\t\t\t\t\t\trowData.child[t] = ( $row[0].textContent || $row[0].innerText || $row.text() || \"\" ).trim();\n\t\t\t\t\t\t\t\t// go to the next for loop\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\trowData.$row = $row;\n\t\t\t\t\t\t\trowData.order = i; // add original row position to rowCache\n\t\t\t\t\t\t\tfor (j = 0; j < c.columns; ++j) {\n\t\t\t\t\t\t\t\tif (typeof parsers[j] === 'undefined') {\n\t\t\t\t\t\t\t\t\tif (c.debug) {\n\t\t\t\t\t\t\t\t\t\tlog('No parser found for cell:', $row[0].cells[j], 'does it have a header?');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tt = getElementText(table, $row[0].cells[j], j);\n\t\t\t\t\t\t\t\t// do extract before parsing if there is one\n\t\t\t\t\t\t\t\tif (typeof extractors[j].id === 'undefined') {\n\t\t\t\t\t\t\t\t\ttx = t;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\ttx = extractors[j].format(t, table, $row[0].cells[j], j);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// allow parsing if the string is empty, previously parsing would change it to zero,\n\t\t\t\t\t\t\t\t// in case the parser needs to extract data from the table cell attributes\n\t\t\t\t\t\t\t\tv = parsers[j].id === 'no-parser' ? '' : parsers[j].format(tx, table, $row[0].cells[j], j);\n\t\t\t\t\t\t\t\tcols.push( c.ignoreCase && typeof v === 'string' ? v.toLowerCase() : v );\n\t\t\t\t\t\t\t\tif ((parsers[j].type || '').toLowerCase() === \"numeric\") {\n\t\t\t\t\t\t\t\t\t// determine column max value (ignore sign)\n\t\t\t\t\t\t\t\t\tcolMax[j] = Math.max(Math.abs(v) || 0, colMax[j] || 0);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// ensure rowData is always in the same location (after the last column)\n\t\t\t\t\t\t\tcols[c.columns] = rowData;\n\t\t\t\t\t\t\tcc.normalized.push(cols);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcc.colMax = colMax;\n\t\t\t\t\t\t// total up rows, not including child rows\n\t\t\t\t\t\tc.totalRows += cc.normalized.length;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (c.showProcessing) {\n\t\t\t\t\tts.isProcessing(table); // remove processing icon\n\t\t\t\t}\n\t\t\t\tif (c.debug) {\n\t\t\t\t\tbenchmark(\"Building cache for \" + totalRows + \" rows\", cacheTime);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// init flag (true) used by pager plugin to prevent widget application\n\t\t\tfunction appendToTable(table, init) {\n\t\t\t\tvar c = table.config,\n\t\t\t\t\two = c.widgetOptions,\n\t\t\t\t\tb = table.tBodies,\n\t\t\t\t\trows = [],\n\t\t\t\t\tcc = c.cache,\n\t\t\t\t\tn, totalRows, $bk, $tb,\n\t\t\t\t\ti, k, appendTime;\n\t\t\t\t// empty table - fixes #206/#346\n\t\t\t\tif (isEmptyObject(cc)) {\n\t\t\t\t\t// run pager appender in case the table was just emptied\n\t\t\t\t\treturn c.appender ? c.appender(table, rows) :\n\t\t\t\t\t\ttable.isUpdating ? c.$table.trigger(\"updateComplete\", table) : ''; // Fixes #532\n\t\t\t\t}\n\t\t\t\tif (c.debug) {\n\t\t\t\t\tappendTime = new Date();\n\t\t\t\t}\n\t\t\t\tfor (k = 0; k < b.length; k++) {\n\t\t\t\t\t$bk = $(b[k]);\n\t\t\t\t\tif ($bk.length && !$bk.hasClass(c.cssInfoBlock)) {\n\t\t\t\t\t\t// get tbody\n\t\t\t\t\t\t$tb = ts.processTbody(table, $bk, true);\n\t\t\t\t\t\tn = cc[k].normalized;\n\t\t\t\t\t\ttotalRows = n.length;\n\t\t\t\t\t\tfor (i = 0; i < totalRows; i++) {\n\t\t\t\t\t\t\trows.push(n[i][c.columns].$row);\n\t\t\t\t\t\t\t// removeRows used by the pager plugin; don't render if using ajax - fixes #411\n\t\t\t\t\t\t\tif (!c.appender || (c.pager && (!c.pager.removeRows || !wo.pager_removeRows) && !c.pager.ajax)) {\n\t\t\t\t\t\t\t\t$tb.append(n[i][c.columns].$row);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// restore tbody\n\t\t\t\t\t\tts.processTbody(table, $tb, false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (c.appender) {\n\t\t\t\t\tc.appender(table, rows);\n\t\t\t\t}\n\t\t\t\tif (c.debug) {\n\t\t\t\t\tbenchmark(\"Rebuilt table\", appendTime);\n\t\t\t\t}\n\t\t\t\t// apply table widgets; but not before ajax completes\n\t\t\t\tif (!init && !c.appender) { ts.applyWidget(table); }\n\t\t\t\tif (table.isUpdating) {\n\t\t\t\t\tc.$table.trigger(\"updateComplete\", table);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction formatSortingOrder(v) {\n\t\t\t\t// look for \"d\" in \"desc\" order; return true\n\t\t\t\treturn (/^d/i.test(v) || v === 1);\n\t\t\t}\n\n\t\t\tfunction buildHeaders(table) {\n\t\t\t\tvar ch, $t,\n\t\t\t\t\th, i, t, lock, time,\n\t\t\t\t\tc = table.config;\n\t\t\t\tc.headerList = [];\n\t\t\t\tc.headerContent = [];\n\t\t\t\tif (c.debug) {\n\t\t\t\t\ttime = new Date();\n\t\t\t\t}\n\t\t\t\t// children tr in tfoot - see issue #196 & #547\n\t\t\t\tc.columns = ts.computeColumnIndex( c.$table.children('thead, tfoot').children('tr') );\n\t\t\t\t// add icon if cssIcon option exists\n\t\t\t\ti = c.cssIcon ? '<i class=\"' + ( c.cssIcon === ts.css.icon ? ts.css.icon : c.cssIcon + ' ' + ts.css.icon ) + '\"></i>' : '';\n\t\t\t\t// redefine c.$headers here in case of an updateAll that replaces or adds an entire header cell - see #683\n\t\t\t\tc.$headers = $(table).find(c.selectorHeaders).each(function(index) {\n\t\t\t\t\t$t = $(this);\n\t\t\t\t\t// make sure to get header cell & not column indexed cell\n\t\t\t\t\tch = ts.getColumnData( table, c.headers, index, true );\n\t\t\t\t\t// save original header content\n\t\t\t\t\tc.headerContent[index] = $(this).html();\n\t\t\t\t\t// if headerTemplate is empty, don't reformat the header cell\n\t\t\t\t\tif ( c.headerTemplate !== '' ) {\n\t\t\t\t\t\t// set up header template\n\t\t\t\t\t\t// Atlassian modification: if content has literal `{icon}`, preserve it.\n\t\t\t\t\t\tt = c.headerTemplate.replace(/\\{icon\\}/g, i).replace(/\\{content\\}/g, $(this).html());\n\t\t\t\t\t\tif (c.onRenderTemplate) {\n\t\t\t\t\t\t\th = c.onRenderTemplate.apply($t, [index, t]);\n\t\t\t\t\t\t\tif (h && typeof h === 'string') { t = h; } // only change t if something is returned\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$(this).html('<div class=\"' + ts.css.headerIn + '\">' + t + '</div>'); // faster than wrapInner\n\t\t\t\t\t}\n\t\t\t\t\tif (c.onRenderHeader) { c.onRenderHeader.apply($t, [index]); }\n\t\t\t\t\tthis.column = parseInt( $(this).attr('data-column'), 10);\n\t\t\t\t\tthis.order = formatSortingOrder( ts.getData($t, ch, 'sortInitialOrder') || c.sortInitialOrder ) ? [1,0,2] : [0,1,2];\n\t\t\t\t\tthis.count = -1; // set to -1 because clicking on the header automatically adds one\n\t\t\t\t\tthis.lockedOrder = false;\n\t\t\t\t\tlock = ts.getData($t, ch, 'lockedOrder') || false;\n\t\t\t\t\tif (typeof lock !== 'undefined' && lock !== false) {\n\t\t\t\t\t\tthis.order = this.lockedOrder = formatSortingOrder(lock) ? [1,1,1] : [0,0,0];\n\t\t\t\t\t}\n\t\t\t\t\t$t.addClass(ts.css.header + ' ' + c.cssHeader);\n\t\t\t\t\t// add cell to headerList\n\t\t\t\t\tc.headerList[index] = this;\n\t\t\t\t\t// add to parent in case there are multiple rows\n\t\t\t\t\t$t.parent().addClass(ts.css.headerRow + ' ' + c.cssHeaderRow);\n\t\t\t\t\t// allow keyboard cursor to focus on element\n\t\t\t\t\tif (c.tabIndex) { $t.attr(\"tabindex\", 0); }\n\t\t\t\t}).attr({\n\t\t\t\t\tscope: 'col'\n\t\t\t\t});\n\t\t\t\t// enable/disable sorting\n\t\t\t\tupdateHeader(table);\n\t\t\t\tif (c.debug) {\n\t\t\t\t\tbenchmark(\"Built headers:\", time);\n\t\t\t\t\tlog(c.$headers);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction commonUpdate(table, resort, callback) {\n\t\t\t\tvar c = table.config;\n\t\t\t\t// remove rows/elements before update\n\t\t\t\tc.$table.find(c.selectorRemove).remove();\n\t\t\t\t// rebuild parsers\n\t\t\t\tbuildParserCache(table);\n\t\t\t\t// rebuild the cache map\n\t\t\t\tbuildCache(table);\n\t\t\t\tcheckResort(c.$table, resort, callback);\n\t\t\t}\n\n\t\t\tfunction updateHeader(table) {\n\t\t\t\tvar s, $th, col,\n\t\t\t\t\tc = table.config;\n\t\t\t\tc.$headers.each(function(index, th){\n\t\t\t\t\t$th = $(th);\n\t\t\t\t\tcol = ts.getColumnData( table, c.headers, index, true );\n\t\t\t\t\t// add \"sorter-false\" class if \"parser-false\" is set\n\t\t\t\t\ts = ts.getData( th, col, 'sorter' ) === 'false' || ts.getData( th, col, 'parser' ) === 'false';\n\t\t\t\t\tth.sortDisabled = s;\n\t\t\t\t\t$th[ s ? 'addClass' : 'removeClass' ]('sorter-false').attr('aria-disabled', '' + s);\n\t\t\t\t\t// aria-controls - requires table ID\n\t\t\t\t\tif (table.id) {\n\t\t\t\t\t\tif (s) {\n\t\t\t\t\t\t\t$th.removeAttr('aria-controls');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$th.attr('aria-controls', table.id);\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\tfunction setHeadersCss(table) {\n\t\t\t\tvar f, i, j,\n\t\t\t\t\tc = table.config,\n\t\t\t\t\tlist = c.sortList,\n\t\t\t\t\tlen = list.length,\n\t\t\t\t\tnone = ts.css.sortNone + ' ' + c.cssNone,\n\t\t\t\t\tcss = [ts.css.sortAsc + ' ' + c.cssAsc, ts.css.sortDesc + ' ' + c.cssDesc],\n\t\t\t\t\taria = ['ascending', 'descending'],\n\t\t\t\t\t// find the footer\n\t\t\t\t\t$t = $(table).find('tfoot tr').children().add(c.$extraHeaders).removeClass(css.join(' '));\n\t\t\t\t// remove all header information\n\t\t\t\tc.$headers\n\t\t\t\t\t.removeClass(css.join(' '))\n\t\t\t\t\t.addClass(none).attr('aria-sort', 'none');\n\t\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\t\t// direction = 2 means reset!\n\t\t\t\t\tif (list[i][1] !== 2) {\n\t\t\t\t\t\t// multicolumn sorting updating - choose the :last in case there are nested columns\n\t\t\t\t\t\tf = c.$headers.not('.sorter-false').filter('[data-column=\"' + list[i][0] + '\"]' + (len === 1 ? ':last' : '') );\n\t\t\t\t\t\tif (f.length) {\n\t\t\t\t\t\t\tfor (j = 0; j < f.length; j++) {\n\t\t\t\t\t\t\t\tif (!f[j].sortDisabled) {\n\t\t\t\t\t\t\t\t\tf.eq(j).removeClass(none).addClass(css[list[i][1]]).attr('aria-sort', aria[list[i][1]]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// add sorted class to footer & extra headers, if they exist\n\t\t\t\t\t\t\tif ($t.length) {\n\t\t\t\t\t\t\t\t$t.filter('[data-column=\"' + list[i][0] + '\"]').removeClass(none).addClass(css[list[i][1]]);\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\t// add verbose aria labels\n\t\t\t\tc.$headers.not('.sorter-false').each(function(){\n\t\t\t\t\tvar $this = $(this),\n\t\t\t\t\t\tnextSort = this.order[(this.count + 1) % (c.sortReset ? 3 : 2)],\n\t\t\t\t\t\ttxt = $this.text() + ': ' +\n\t\t\t\t\t\t\tts.language[ $this.hasClass(ts.css.sortAsc) ? 'sortAsc' : $this.hasClass(ts.css.sortDesc) ? 'sortDesc' : 'sortNone' ] +\n\t\t\t\t\t\t\tts.language[ nextSort === 0 ? 'nextAsc' : nextSort === 1 ? 'nextDesc' : 'nextNone' ];\n\t\t\t\t\t$this.attr('aria-label', txt );\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// automatically add col group, and column sizes if set\n\t\t\tfunction fixColumnWidth(table) {\n\t\t\t\tvar colgroup, overallWidth,\n\t\t\t\t\tc = table.config;\n\t\t\t\tif (c.widthFixed && c.$table.find('colgroup').length === 0) {\n\t\t\t\t\tcolgroup = $('<colgroup>');\n\t\t\t\t\toverallWidth = $(table).width();\n\t\t\t\t\t// only add col for visible columns - fixes #371\n\t\t\t\t\t$(table.tBodies).not('.' + c.cssInfoBlock).find(\"tr:first\").children(\":visible\").each(function() {\n\t\t\t\t\t\tcolgroup.append($('<col>').css('width', parseInt(($(this).width()/overallWidth)*1000, 10)/10 + '%'));\n\t\t\t\t\t});\n\t\t\t\t\tc.$table.prepend(colgroup);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction updateHeaderSortCount(table, list) {\n\t\t\t\tvar s, t, o, col, primary,\n\t\t\t\t\tc = table.config,\n\t\t\t\t\tsl = list || c.sortList;\n\t\t\t\tc.sortList = [];\n\t\t\t\t$.each(sl, function(i,v){\n\t\t\t\t\t// ensure all sortList values are numeric - fixes #127\n\t\t\t\t\tcol = parseInt(v[0], 10);\n\t\t\t\t\t// make sure header exists\n\t\t\t\t\to = c.$headers.filter('[data-column=\"' + col + '\"]:last')[0];\n\t\t\t\t\tif (o) { // prevents error if sorton array is wrong\n\t\t\t\t\t\t// o.count = o.count + 1;\n\t\t\t\t\t\tt = ('' + v[1]).match(/^(1|d|s|o|n)/);\n\t\t\t\t\t\tt = t ? t[0] : '';\n\t\t\t\t\t\t// 0/(a)sc (default), 1/(d)esc, (s)ame, (o)pposite, (n)ext\n\t\t\t\t\t\tswitch(t) {\n\t\t\t\t\t\t\tcase '1': case 'd': // descending\n\t\t\t\t\t\t\t\tt = 1;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 's': // same direction (as primary column)\n\t\t\t\t\t\t\t\t// if primary sort is set to \"s\", make it ascending\n\t\t\t\t\t\t\t\tt = primary || 0;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'o':\n\t\t\t\t\t\t\t\ts = o.order[(primary || 0) % (c.sortReset ? 3 : 2)];\n\t\t\t\t\t\t\t\t// opposite of primary column; but resets if primary resets\n\t\t\t\t\t\t\t\tt = s === 0 ? 1 : s === 1 ? 0 : 2;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'n':\n\t\t\t\t\t\t\t\to.count = o.count + 1;\n\t\t\t\t\t\t\t\tt = o.order[(o.count) % (c.sortReset ? 3 : 2)];\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault: // ascending\n\t\t\t\t\t\t\t\tt = 0;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tprimary = i === 0 ? t : primary;\n\t\t\t\t\t\ts = [ col, parseInt(t, 10) || 0 ];\n\t\t\t\t\t\tc.sortList.push(s);\n\t\t\t\t\t\tt = $.inArray(s[1], o.order); // fixes issue #167\n\t\t\t\t\t\to.count = t >= 0 ? t : s[1] % (c.sortReset ? 3 : 2);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tfunction getCachedSortType(parsers, i) {\n\t\t\t\treturn (parsers && parsers[i]) ? parsers[i].type || '' : '';\n\t\t\t}\n\n\t\t\tfunction initSort(table, cell, event){\n\t\t\t\tif (table.isUpdating) {\n\t\t\t\t\t// let any updates complete before initializing a sort\n\t\t\t\t\treturn setTimeout(function(){ initSort(table, cell, event); }, 50);\n\t\t\t\t}\n\t\t\t\tvar arry, indx, col, order, s,\n\t\t\t\t\tc = table.config,\n\t\t\t\t\tkey = !event[c.sortMultiSortKey],\n\t\t\t\t\t$table = c.$table;\n\t\t\t\t// Only call sortStart if sorting is enabled\n\t\t\t\t$table.trigger(\"sortStart\", table);\n\t\t\t\t// get current column sort order\n\t\t\t\tcell.count = event[c.sortResetKey] ? 2 : (cell.count + 1) % (c.sortReset ? 3 : 2);\n\t\t\t\t// reset all sorts on non-current column - issue #30\n\t\t\t\tif (c.sortRestart) {\n\t\t\t\t\tindx = cell;\n\t\t\t\t\tc.$headers.each(function() {\n\t\t\t\t\t\t// only reset counts on columns that weren't just clicked on and if not included in a multisort\n\t\t\t\t\t\tif (this !== indx && (key || !$(this).is('.' + ts.css.sortDesc + ',.' + ts.css.sortAsc))) {\n\t\t\t\t\t\t\tthis.count = -1;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t// get current column index\n\t\t\t\tindx = cell.column;\n\t\t\t\t// user only wants to sort on one column\n\t\t\t\tif (key) {\n\t\t\t\t\t// flush the sort list\n\t\t\t\t\tc.sortList = [];\n\t\t\t\t\tif (c.sortForce !== null) {\n\t\t\t\t\t\tarry = c.sortForce;\n\t\t\t\t\t\tfor (col = 0; col < arry.length; col++) {\n\t\t\t\t\t\t\tif (arry[col][0] !== indx) {\n\t\t\t\t\t\t\t\tc.sortList.push(arry[col]);\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\t// add column to sort list\n\t\t\t\t\torder = cell.order[cell.count];\n\t\t\t\t\tif (order < 2) {\n\t\t\t\t\t\tc.sortList.push([indx, order]);\n\t\t\t\t\t\t// add other columns if header spans across multiple\n\t\t\t\t\t\tif (cell.colSpan > 1) {\n\t\t\t\t\t\t\tfor (col = 1; col < cell.colSpan; col++) {\n\t\t\t\t\t\t\t\tc.sortList.push([indx + col, order]);\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\t// multi column sorting\n\t\t\t\t} else {\n\t\t\t\t\t// get rid of the sortAppend before adding more - fixes issue #115 & #523\n\t\t\t\t\tif (c.sortAppend && c.sortList.length > 1) {\n\t\t\t\t\t\tfor (col = 0; col < c.sortAppend.length; col++) {\n\t\t\t\t\t\t\ts = ts.isValueInArray(c.sortAppend[col][0], c.sortList);\n\t\t\t\t\t\t\tif (s >= 0) {\n\t\t\t\t\t\t\t\tc.sortList.splice(s,1);\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\t// the user has clicked on an already sorted column\n\t\t\t\t\tif (ts.isValueInArray(indx, c.sortList) >= 0) {\n\t\t\t\t\t\t// reverse the sorting direction\n\t\t\t\t\t\tfor (col = 0; col < c.sortList.length; col++) {\n\t\t\t\t\t\t\ts = c.sortList[col];\n\t\t\t\t\t\t\torder = c.$headers.filter('[data-column=\"' + s[0] + '\"]:last')[0];\n\t\t\t\t\t\t\tif (s[0] === indx) {\n\t\t\t\t\t\t\t\t// order.count seems to be incorrect when compared to cell.count\n\t\t\t\t\t\t\t\ts[1] = order.order[cell.count];\n\t\t\t\t\t\t\t\tif (s[1] === 2) {\n\t\t\t\t\t\t\t\t\tc.sortList.splice(col,1);\n\t\t\t\t\t\t\t\t\torder.count = -1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// add column to sort list array\n\t\t\t\t\t\torder = cell.order[cell.count];\n\t\t\t\t\t\tif (order < 2) {\n\t\t\t\t\t\t\tc.sortList.push([indx, order]);\n\t\t\t\t\t\t\t// add other columns if header spans across multiple\n\t\t\t\t\t\t\tif (cell.colSpan > 1) {\n\t\t\t\t\t\t\t\tfor (col = 1; col < cell.colSpan; col++) {\n\t\t\t\t\t\t\t\t\tc.sortList.push([indx + col, order]);\n\t\t\t\t\t\t\t\t}\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\tif (c.sortAppend !== null) {\n\t\t\t\t\tarry = c.sortAppend;\n\t\t\t\t\tfor (col = 0; col < arry.length; col++) {\n\t\t\t\t\t\tif (arry[col][0] !== indx) {\n\t\t\t\t\t\t\tc.sortList.push(arry[col]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// sortBegin event triggered immediately before the sort\n\t\t\t\t$table.trigger(\"sortBegin\", table);\n\t\t\t\t// setTimeout needed so the processing icon shows up\n\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t// set css for headers\n\t\t\t\t\tsetHeadersCss(table);\n\t\t\t\t\tmultisort(table);\n\t\t\t\t\tappendToTable(table);\n\t\t\t\t\t$table.trigger(\"sortEnd\", table);\n\t\t\t\t}, 1);\n\t\t\t}\n\n\t\t\t// sort multiple columns\n\t\t\tfunction multisort(table) { /*jshint loopfunc:true */\n\t\t\t\tvar i, k, num, col, sortTime, colMax,\n\t\t\t\t\tcache, order, sort, x, y,\n\t\t\t\t\tdir = 0,\n\t\t\t\t\tc = table.config,\n\t\t\t\t\tcts = c.textSorter || '',\n\t\t\t\t\tsortList = c.sortList,\n\t\t\t\t\tl = sortList.length,\n\t\t\t\t\tbl = table.tBodies.length;\n\t\t\t\tif (c.serverSideSorting || isEmptyObject(c.cache)) { // empty table - fixes #206/#346\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (c.debug) { sortTime = new Date(); }\n\t\t\t\tfor (k = 0; k < bl; k++) {\n\t\t\t\t\tcolMax = c.cache[k].colMax;\n\t\t\t\t\tcache = c.cache[k].normalized;\n\n\t\t\t\t\tcache.sort(function(a, b) {\n\t\t\t\t\t\t// cache is undefined here in IE, so don't use it!\n\t\t\t\t\t\tfor (i = 0; i < l; i++) {\n\t\t\t\t\t\t\tcol = sortList[i][0];\n\t\t\t\t\t\t\torder = sortList[i][1];\n\t\t\t\t\t\t\t// sort direction, true = asc, false = desc\n\t\t\t\t\t\t\tdir = order === 0;\n\n\t\t\t\t\t\t\tif (c.sortStable && a[col] === b[col] && l === 1) {\n\t\t\t\t\t\t\t\treturn a[c.columns].order - b[c.columns].order;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// fallback to natural sort since it is more robust\n\t\t\t\t\t\t\tnum = /n/i.test(getCachedSortType(c.parsers, col));\n\t\t\t\t\t\t\tif (num && c.strings[col]) {\n\t\t\t\t\t\t\t\t// sort strings in numerical columns\n\t\t\t\t\t\t\t\tif (typeof (c.string[c.strings[col]]) === 'boolean') {\n\t\t\t\t\t\t\t\t\tnum = (dir ? 1 : -1) * (c.string[c.strings[col]] ? -1 : 1);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnum = (c.strings[col]) ? c.string[c.strings[col]] || 0 : 0;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// fall back to built-in numeric sort\n\t\t\t\t\t\t\t\t// var sort = $.tablesorter[\"sort\" + s](table, a[c], b[c], c, colMax[c], dir);\n\t\t\t\t\t\t\t\tsort = c.numberSorter ? c.numberSorter(a[col], b[col], dir, colMax[col], table) :\n\t\t\t\t\t\t\t\t\tts[ 'sortNumeric' + (dir ? 'Asc' : 'Desc') ](a[col], b[col], num, colMax[col], col, table);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// set a & b depending on sort direction\n\t\t\t\t\t\t\t\tx = dir ? a : b;\n\t\t\t\t\t\t\t\ty = dir ? b : a;\n\t\t\t\t\t\t\t\t// text sort function\n\t\t\t\t\t\t\t\tif (typeof(cts) === 'function') {\n\t\t\t\t\t\t\t\t\t// custom OVERALL text sorter\n\t\t\t\t\t\t\t\t\tsort = cts(x[col], y[col], dir, col, table);\n\t\t\t\t\t\t\t\t} else if (typeof(cts) === 'object' && cts.hasOwnProperty(col)) {\n\t\t\t\t\t\t\t\t\t// custom text sorter for a SPECIFIC COLUMN\n\t\t\t\t\t\t\t\t\tsort = cts[col](x[col], y[col], dir, col, table);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// fall back to natural sort\n\t\t\t\t\t\t\t\t\tsort = ts[ 'sortNatural' + (dir ? 'Asc' : 'Desc') ](a[col], b[col], col, table, c);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (sort) { return sort; }\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn a[c.columns].order - b[c.columns].order;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (c.debug) { benchmark(\"Sorting on \" + sortList.toString() + \" and dir \" + order + \" time\", sortTime); }\n\t\t\t}\n\n\t\t\tfunction resortComplete($table, callback){\n\t\t\t\tvar table = $table[0];\n\t\t\t\tif (table.isUpdating) {\n\t\t\t\t\t$table.trigger('updateComplete', table);\n\t\t\t\t}\n\t\t\t\tif (typeof callback === 'function') {\n\t\t\t\t\tcallback($table[0]);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction checkResort($table, flag, callback) {\n\t\t\t\tvar sl = $table[0].config.sortList;\n\t\t\t\t// don't try to resort if the table is still processing\n\t\t\t\t// this will catch spamming of the updateCell method\n\t\t\t\tif (flag !== false && !$table[0].isProcessing && sl.length) {\n\t\t\t\t\t$table.trigger(\"sorton\", [sl, function(){\n\t\t\t\t\t\tresortComplete($table, callback);\n\t\t\t\t\t}, true]);\n\t\t\t\t} else {\n\t\t\t\t\tresortComplete($table, callback);\n\t\t\t\t\tts.applyWidget($table[0], false);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfunction bindMethods(table){\n\t\t\t\tvar c = table.config,\n\t\t\t\t\t$table = c.$table;\n\t\t\t\t// apply easy methods that trigger bound events\n\t\t\t\t$table\n\t\t\t\t.off('sortReset update updateRows updateCell updateAll addRows updateComplete sorton appendCache updateCache applyWidgetId applyWidgets refreshWidgets destroy mouseup mouseleave '.split(' ').join(c.namespace + ' '))\n                    .on(\"sortReset\" + c.namespace, function(e, callback){\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tc.sortList = [];\n\t\t\t\t\tsetHeadersCss(table);\n\t\t\t\t\tmultisort(table);\n\t\t\t\t\tappendToTable(table);\n\t\t\t\t\tif (typeof callback === 'function') {\n\t\t\t\t\t\tcallback(table);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.on(\"updateAll\" + c.namespace, function(e, resort, callback){\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\ttable.isUpdating = true;\n\t\t\t\t\tts.refreshWidgets(table, true, true);\n\t\t\t\t\tts.restoreHeaders(table);\n\t\t\t\t\tbuildHeaders(table);\n\t\t\t\t\tts.bindEvents(table, c.$headers, true);\n\t\t\t\t\tbindMethods(table);\n\t\t\t\t\tcommonUpdate(table, resort, callback);\n\t\t\t\t})\n\t\t\t\t.on(\"update\" + c.namespace + \" updateRows\" + c.namespace, function(e, resort, callback) {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\ttable.isUpdating = true;\n\t\t\t\t\t// update sorting (if enabled/disabled)\n\t\t\t\t\tupdateHeader(table);\n\t\t\t\t\tcommonUpdate(table, resort, callback);\n\t\t\t\t})\n\t\t\t\t.on(\"updateCell\" + c.namespace, function(e, cell, resort, callback) {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\ttable.isUpdating = true;\n\t\t\t\t\t$table.find(c.selectorRemove).remove();\n\t\t\t\t\t// get position from the dom\n\t\t\t\t\tvar v, t, row, icell,\n\t\t\t\t\t$tb = $table.find('tbody'),\n\t\t\t\t\t$cell = $(cell),\n\t\t\t\t\t// update cache - format: function(s, table, cell, cellIndex)\n\t\t\t\t\t// no closest in jQuery v1.2.6 - tbdy = $tb.index( $(cell).closest('tbody') ),$row = $(cell).closest('tr');\n\t\t\t\t\ttbdy = $tb.index( $.fn.closest ? $cell.closest('tbody') : $cell.parents('tbody').filter(':first') ),\n\t\t\t\t\t$row = $.fn.closest ? $cell.closest('tr') : $cell.parents('tr').filter(':first');\n\t\t\t\t\tcell = $cell[0]; // in case cell is a jQuery object\n\t\t\t\t\t// tbody may not exist if update is initialized while tbody is removed for processing\n\t\t\t\t\tif ($tb.length && tbdy >= 0) {\n\t\t\t\t\t\trow = $tb.eq(tbdy).find('tr').index( $row );\n\t\t\t\t\t\ticell = $cell.index();\n\t\t\t\t\t\tc.cache[tbdy].normalized[row][c.columns].$row = $row;\n\t\t\t\t\t\tif (typeof c.extractors[icell].id === 'undefined') {\n\t\t\t\t\t\t\tt = getElementText(table, cell, icell);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tt = c.extractors[icell].format( getElementText(table, cell, icell), table, cell, icell );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tv = c.parsers[icell].id === 'no-parser' ? '' :\n\t\t\t\t\t\t\tc.parsers[icell].format( t, table, cell, icell );\n\t\t\t\t\t\tc.cache[tbdy].normalized[row][icell] = c.ignoreCase && typeof v === 'string' ? v.toLowerCase() : v;\n\t\t\t\t\t\tif ((c.parsers[icell].type || '').toLowerCase() === \"numeric\") {\n\t\t\t\t\t\t\t// update column max value (ignore sign)\n\t\t\t\t\t\t\tc.cache[tbdy].colMax[icell] = Math.max(Math.abs(v) || 0, c.cache[tbdy].colMax[icell] || 0);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcheckResort($table, resort, callback);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.on(\"addRows\" + c.namespace, function(e, $row, resort, callback) {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\ttable.isUpdating = true;\n\t\t\t\t\tif (isEmptyObject(c.cache)) {\n\t\t\t\t\t\t// empty table, do an update instead - fixes #450\n\t\t\t\t\t\tupdateHeader(table);\n\t\t\t\t\t\tcommonUpdate(table, resort, callback);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$row = $($row); // make sure we're using a jQuery object\n\t\t\t\t\t\tvar i, j, l, t, v, rowData, cells,\n\t\t\t\t\t\trows = $row.filter('tr').length,\n\t\t\t\t\t\ttbdy = $table.find('tbody').index( $row.parents('tbody').filter(':first') );\n\t\t\t\t\t\t// fixes adding rows to an empty table - see issue #179\n\t\t\t\t\t\tif (!(c.parsers && c.parsers.length)) {\n\t\t\t\t\t\t\tbuildParserCache(table);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// add each row\n\t\t\t\t\t\tfor (i = 0; i < rows; i++) {\n\t\t\t\t\t\t\tl = $row[i].cells.length;\n\t\t\t\t\t\t\tcells = [];\n\t\t\t\t\t\t\trowData = {\n\t\t\t\t\t\t\t\tchild: [],\n\t\t\t\t\t\t\t\t$row : $row.eq(i),\n\t\t\t\t\t\t\t\torder: c.cache[tbdy].normalized.length\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t// add each cell\n\t\t\t\t\t\t\tfor (j = 0; j < l; j++) {\n\t\t\t\t\t\t\t\tif (typeof c.extractors[j].id === 'undefined') {\n\t\t\t\t\t\t\t\t\tt = getElementText(table, $row[i].cells[j], j);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tt = c.extractors[j].format( getElementText(table, $row[i].cells[j], j), table, $row[i].cells[j], j );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tv = c.parsers[j].id === 'no-parser' ? '' :\n\t\t\t\t\t\t\t\t\tc.parsers[j].format( t, table, $row[i].cells[j], j );\n\t\t\t\t\t\t\t\tcells[j] = c.ignoreCase && typeof v === 'string' ? v.toLowerCase() : v;\n\t\t\t\t\t\t\t\tif ((c.parsers[j].type || '').toLowerCase() === \"numeric\") {\n\t\t\t\t\t\t\t\t\t// update column max value (ignore sign)\n\t\t\t\t\t\t\t\t\tc.cache[tbdy].colMax[j] = Math.max(Math.abs(cells[j]) || 0, c.cache[tbdy].colMax[j] || 0);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// add the row data to the end\n\t\t\t\t\t\t\tcells.push(rowData);\n\t\t\t\t\t\t\t// update cache\n\t\t\t\t\t\t\tc.cache[tbdy].normalized.push(cells);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// resort using current settings\n\t\t\t\t\t\tcheckResort($table, resort, callback);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.on(\"updateComplete\" + c.namespace, function(){\n\t\t\t\t\ttable.isUpdating = false;\n\t\t\t\t})\n\t\t\t\t.on(\"sorton\" + c.namespace, function(e, list, callback, init) {\n\t\t\t\t\tvar c = table.config;\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t$table.trigger(\"sortStart\", this);\n\t\t\t\t\t// update header count index\n\t\t\t\t\tupdateHeaderSortCount(table, list);\n\t\t\t\t\t// set css for headers\n\t\t\t\t\tsetHeadersCss(table);\n\t\t\t\t\t// fixes #346\n\t\t\t\t\tif (c.delayInit && isEmptyObject(c.cache)) { buildCache(table); }\n\t\t\t\t\t$table.trigger(\"sortBegin\", this);\n\t\t\t\t\t// sort the table and append it to the dom\n\t\t\t\t\tmultisort(table);\n\t\t\t\t\tappendToTable(table, init);\n\t\t\t\t\t$table.trigger(\"sortEnd\", this);\n\t\t\t\t\tts.applyWidget(table);\n\t\t\t\t\tif (typeof callback === 'function') {\n\t\t\t\t\t\tcallback(table);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.on(\"appendCache\" + c.namespace, function(e, callback, init) {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tappendToTable(table, init);\n\t\t\t\t\tif (typeof callback === 'function') {\n\t\t\t\t\t\tcallback(table);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.on(\"updateCache\" + c.namespace, function(e, callback){\n\t\t\t\t\t// rebuild parsers\n\t\t\t\t\tif (!(c.parsers && c.parsers.length)) {\n\t\t\t\t\t\tbuildParserCache(table);\n\t\t\t\t\t}\n\t\t\t\t\t// rebuild the cache map\n\t\t\t\t\tbuildCache(table);\n\t\t\t\t\tif (typeof callback === 'function') {\n\t\t\t\t\t\tcallback(table);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.on(\"applyWidgetId\" + c.namespace, function(e, id) {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tts.getWidgetById(id).format(table, c, c.widgetOptions);\n\t\t\t\t})\n\t\t\t\t.on(\"applyWidgets\" + c.namespace, function(e, init) {\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t// apply widgets\n\t\t\t\t\tts.applyWidget(table, init);\n\t\t\t\t})\n\t\t\t\t.on(\"refreshWidgets\" + c.namespace, function(e, all, dontapply){\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tts.refreshWidgets(table, all, dontapply);\n\t\t\t\t})\n\t\t\t\t.on(\"destroy\" + c.namespace, function(e, c, cb){\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t\tts.destroy(table, c, cb);\n\t\t\t\t})\n\t\t\t\t.on(\"resetToLoadState\" + c.namespace, function(){\n\t\t\t\t\t// remove all widgets\n\t\t\t\t\tts.refreshWidgets(table, true, true);\n\t\t\t\t\t// restore original settings; this clears out current settings, but does not clear\n\t\t\t\t\t// values saved to storage.\n\t\t\t\t\tc = $.extend(true, ts.defaults, c.originalSettings);\n\t\t\t\t\ttable.hasInitialized = false;\n\t\t\t\t\t// setup the entire table again\n\t\t\t\t\tts.setup( table, c );\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t/* public methods */\n\t\t\tts.construct = function(settings) {\n\t\t\t\treturn this.each(function() {\n\t\t\t\t\tvar table = this,\n\t\t\t\t\t\t// merge & extend config options\n\t\t\t\t\t\tc = $.extend(true, {}, ts.defaults, settings);\n\t\t\t\t\t\t// save initial settings\n\t\t\t\t\t\tc.originalSettings = settings;\n\t\t\t\t\t// create a table from data (build table widget)\n\t\t\t\t\tif (!table.hasInitialized && ts.buildTable && this.tagName !== 'TABLE') {\n\t\t\t\t\t\t// return the table (in case the original target is the table's container)\n\t\t\t\t\t\tts.buildTable(table, c);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tts.setup(table, c);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tts.setup = function(table, c) {\n\t\t\t\t// if no thead or tbody, or tablesorter is already present, quit\n\t\t\t\tif (!table || !table.tHead || table.tBodies.length === 0 || table.hasInitialized === true) {\n\t\t\t\t\treturn c.debug ? log('ERROR: stopping initialization! No table, thead, tbody or tablesorter has already been initialized') : '';\n\t\t\t\t}\n\t\t\t\t// Atlassian modification: validate class names that can be inserted into DOM as a line of defense against XSS\n\t\t\t\t// consumers may inadvertently pass UGC\n\t\t\t\tvar cssClassNameRegex = /-?[_a-zA-Z]+[_a-zA-Z0-9-]*/;\n\t\t\t\tvar multipleCssClassesRegex = new RegExp(`^(\\\\s*${cssClassNameRegex.source})*\\\\s*$`);\n\t\t\t\tfunction hasValidClassNames(string) {\n\t\t\t\t\treturn multipleCssClassesRegex.test(string);\n\t\t\t\t}\n\t\t\t\tvar checkedKeys = ['tableClass', 'cssAsc', 'cssDesc', 'cssNone', 'cssHeader', 'cssHeaderRow', 'cssProcessing', 'cssChildRow', 'cssIcon', 'cssInfoBlock'];\n\t\t\t\tvar invalidKeys = [];\n\t\t\t\tfor (var key of checkedKeys) {\n\t\t\t\t\tvar value = c[key];\n\t\t\t\t\tif (value && !hasValidClassNames(value)) {\n\t\t\t\t\t\tinvalidKeys.push(key);\n\t\t\t\t\t\tlog(`ERROR: ${key} must contain only valid CSS class names but is '${value}'`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (invalidKeys.length > 0) {\n\t\t\t\t\treturn c.debug ? log('ERROR: stopping initialization, see class name warnings above') : '';\n\t\t\t\t}\n\n\n\t\t\t\tvar k = '',\n\t\t\t\t\t$table = $(table),\n\t\t\t\t\tm = $.metadata;\n\t\t\t\t// initialization flag\n\t\t\t\ttable.hasInitialized = false;\n\t\t\t\t// table is being processed flag\n\t\t\t\ttable.isProcessing = true;\n\t\t\t\t// make sure to store the config object\n\t\t\t\ttable.config = c;\n\t\t\t\t// save the settings where they read\n\t\t\t\t$.data(table, \"tablesorter\", c);\n\t\t\t\tif (c.debug) { $.data( table, 'startoveralltimer', new Date()); }\n\n\t\t\t\t// removing this in version 3 (only supports jQuery 1.7+)\n\t\t\t\tc.supportsDataObject = (function(version) {\n\t\t\t\t\tversion[0] = parseInt(version[0], 10);\n\t\t\t\t\treturn (version[0] > 1) || (version[0] === 1 && parseInt(version[1], 10) >= 4);\n\t\t\t\t})($.fn.jquery.split(\".\"));\n\t\t\t\t// digit sort text location; keeping max+/- for backwards compatibility\n\t\t\t\tc.string = { 'max': 1, 'min': -1, 'emptymin': 1, 'emptymax': -1, 'zero': 0, 'none': 0, 'null': 0, 'top': true, 'bottom': false };\n\t\t\t\t// ensure case insensitivity\n\t\t\t\tc.emptyTo = c.emptyTo.toLowerCase();\n\t\t\t\tc.stringTo = c.stringTo.toLowerCase();\n\t\t\t\t// add table theme class only if there isn't already one there\n\t\t\t\tif (!/tablesorter\\-/.test($table.attr('class'))) {\n\t\t\t\t\tk = (c.theme !== '' ? ' tablesorter-' + c.theme : '');\n\t\t\t\t}\n\t\t\t\tc.table = table;\n\t\t\t\tc.$table = $table\n\t\t\t\t\t.addClass(ts.css.table + ' ' + c.tableClass + k);\n\t\t\t\tc.$headers = $table.find(c.selectorHeaders);\n\n\t\t\t\t// give the table a unique id, which will be used in namespace binding\n\t\t\t\tif (!c.namespace) {\n\t\t\t\t\tc.namespace = '.tablesorter' + Math.random().toString(16).slice(2);\n\t\t\t\t} else {\n\t\t\t\t\t// make sure namespace starts with a period & doesn't have weird characters\n\t\t\t\t\tc.namespace = '.' + c.namespace.replace(/\\W/g,'');\n\t\t\t\t}\n\n\t\t\t\tc.$table.children().children('tr');\n\t\t\t\tc.$tbodies = $table.children('tbody:not(.' + c.cssInfoBlock + ')').attr({\n\t\t\t\t\t'aria-live' : 'polite',\n\t\t\t\t\t'aria-relevant' : 'all'\n\t\t\t\t});\n\t\t\t\tif (c.$table.find('caption').length) {\n\t\t\t\t\tc.$table.attr('aria-labelledby', 'theCaption');\n\t\t\t\t}\n\t\t\t\tc.widgetInit = {}; // keep a list of initialized widgets\n\t\t\t\t// change textExtraction via data-attribute\n\t\t\t\tc.textExtraction = c.$table.attr('data-text-extraction') || c.textExtraction || 'basic';\n\t\t\t\t// build headers\n\t\t\t\tbuildHeaders(table);\n\t\t\t\t// fixate columns if the users supplies the fixedWidth option\n\t\t\t\t// do this after theme has been applied\n\t\t\t\tfixColumnWidth(table);\n\t\t\t\t// try to auto detect column type, and store in tables config\n\t\t\t\tbuildParserCache(table);\n\t\t\t\t// start total row count at zero\n\t\t\t\tc.totalRows = 0;\n\t\t\t\t// build the cache for the tbody cells\n\t\t\t\t// delayInit will delay building the cache until the user starts a sort\n\t\t\t\tif (!c.delayInit) { buildCache(table); }\n\t\t\t\t// bind all header events and methods\n\t\t\t\tts.bindEvents(table, c.$headers, true);\n\t\t\t\tbindMethods(table);\n\t\t\t\t// get sort list from jQuery data or metadata\n\t\t\t\t// in jQuery < 1.4, an error occurs when calling $table.data()\n\t\t\t\tif (c.supportsDataObject && typeof $table.data().sortlist !== 'undefined') {\n\t\t\t\t\tc.sortList = $table.data().sortlist;\n\t\t\t\t} else if (m && ($table.metadata() && $table.metadata().sortlist)) {\n\t\t\t\t\tc.sortList = $table.metadata().sortlist;\n\t\t\t\t}\n\t\t\t\t// apply widget init code\n\t\t\t\tts.applyWidget(table, true);\n\t\t\t\t// if user has supplied a sort list to constructor\n\t\t\t\tif (c.sortList.length > 0) {\n\t\t\t\t\t$table.trigger(\"sorton\", [c.sortList, {}, !c.initWidgets, true]);\n\t\t\t\t} else {\n\t\t\t\t\tsetHeadersCss(table);\n\t\t\t\t\tif (c.initWidgets) {\n\t\t\t\t\t\t// apply widget format\n\t\t\t\t\t\tts.applyWidget(table, false);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// show processesing icon\n\t\t\t\tif (c.showProcessing) {\n\t\t\t\t\t$table\n\t\t\t\t\t.off('sortBegin' + c.namespace + ' sortEnd' + c.namespace)\n\t\t\t\t\t.on('sortBegin' + c.namespace + ' sortEnd' + c.namespace, function(e) {\n\t\t\t\t\t\tclearTimeout(c.processTimer);\n\t\t\t\t\t\tts.isProcessing(table);\n\t\t\t\t\t\tif (e.type === 'sortBegin') {\n\t\t\t\t\t\t\tc.processTimer = setTimeout(function(){\n\t\t\t\t\t\t\t\tts.isProcessing(table, true);\n\t\t\t\t\t\t\t}, 500);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// initialized\n\t\t\t\ttable.hasInitialized = true;\n\t\t\t\ttable.isProcessing = false;\n\t\t\t\tif (c.debug) {\n\t\t\t\t\tts.benchmark(\"Overall initialization time\", $.data( table, 'startoveralltimer'));\n\t\t\t\t}\n\t\t\t\t$table.trigger('tablesorter-initialized', table);\n\t\t\t\tif (typeof c.initialized === 'function') { c.initialized(table); }\n\t\t\t};\n\n\t\t\tts.getColumnData = function(table, obj, indx, getCell){\n\t\t\t\tif (typeof obj === 'undefined' || obj === null) { return; }\n\t\t\t\ttable = $(table)[0];\n\t\t\t\tvar result, $h, k,\n\t\t\t\t\tc = table.config;\n\t\t\t\tif (obj[indx]) {\n\t\t\t\t\treturn getCell ? obj[indx] : obj[c.$headers.index( c.$headers.filter('[data-column=\"' + indx + '\"]:last') )];\n\t\t\t\t}\n\t\t\t\tfor (k in obj) {\n\t\t\t\t\tif (typeof k === 'string') {\n\t\t\t\t\t\tif (getCell) {\n\t\t\t\t\t\t\t// get header cell\n\t\t\t\t\t\t\t$h = c.$headers.eq(indx).filter(k);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// get column indexed cell\n\t\t\t\t\t\t\t$h = c.$headers.filter('[data-column=\"' + indx + '\"]:last').filter(k);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ($h.length) {\n\t\t\t\t\t\t\treturn obj[k];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t};\n\n\t\t\t// computeTableHeaderCellIndexes from:\n\t\t\t// http://www.javascripttoolbox.com/lib/table/examples.php\n\t\t\t// http://www.javascripttoolbox.com/temp/table_cellindex.html\n\t\t\tts.computeColumnIndex = function(trs) {\n\t\t\t\tvar matrix = [],\n\t\t\t\tlookup = {},\n\t\t\t\tcols = 0, // determine the number of columns\n\t\t\t\ti, j, k, l, $cell, cell, cells, rowIndex, cellId, rowSpan, colSpan, firstAvailCol, matrixrow;\n\t\t\t\tfor (i = 0; i < trs.length; i++) {\n\t\t\t\t\tcells = trs[i].cells;\n\t\t\t\t\tfor (j = 0; j < cells.length; j++) {\n\t\t\t\t\t\tcell = cells[j];\n\t\t\t\t\t\t$cell = $(cell);\n\t\t\t\t\t\trowIndex = cell.parentNode.rowIndex;\n\t\t\t\t\t\tcellId = rowIndex + \"-\" + $cell.index();\n\t\t\t\t\t\trowSpan = cell.rowSpan || 1;\n\t\t\t\t\t\tcolSpan = cell.colSpan || 1;\n\t\t\t\t\t\tif (typeof(matrix[rowIndex]) === \"undefined\") {\n\t\t\t\t\t\t\tmatrix[rowIndex] = [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Find first available column in the first row\n\t\t\t\t\t\tfor (k = 0; k < matrix[rowIndex].length + 1; k++) {\n\t\t\t\t\t\t\tif (typeof(matrix[rowIndex][k]) === \"undefined\") {\n\t\t\t\t\t\t\t\tfirstAvailCol = k;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlookup[cellId] = firstAvailCol;\n\t\t\t\t\t\tcols = Math.max(firstAvailCol, cols);\n\t\t\t\t\t\t// add data-column\n\t\t\t\t\t\t$cell.attr({ 'data-column' : firstAvailCol }); // 'data-row' : rowIndex\n\t\t\t\t\t\tfor (k = rowIndex; k < rowIndex + rowSpan; k++) {\n\t\t\t\t\t\t\tif (typeof(matrix[k]) === \"undefined\") {\n\t\t\t\t\t\t\t\tmatrix[k] = [];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tmatrixrow = matrix[k];\n\t\t\t\t\t\t\tfor (l = firstAvailCol; l < firstAvailCol + colSpan; l++) {\n\t\t\t\t\t\t\t\tmatrixrow[l] = \"x\";\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\t// may not be accurate if # header columns !== # tbody columns\n\t\t\t\treturn cols + 1; // add one because it's a zero-based index\n\t\t\t};\n\n\t\t\t// *** Process table ***\n\t\t\t// add processing indicator\n\t\t\tts.isProcessing = function(table, toggle, $ths) {\n\t\t\t\ttable = $(table);\n\t\t\t\tvar c = table[0].config,\n\t\t\t\t\t// default to all headers\n\t\t\t\t\t$h = $ths || table.find('.' + ts.css.header);\n\t\t\t\tif (toggle) {\n\t\t\t\t\t// don't use sortList if custom $ths used\n\t\t\t\t\tif (typeof $ths !== 'undefined' && c.sortList.length > 0) {\n\t\t\t\t\t\t// get headers from the sortList\n\t\t\t\t\t\t$h = $h.filter(function(){\n\t\t\t\t\t\t\t// get data-column from attr to keep  compatibility with jQuery 1.2.6\n\t\t\t\t\t\t\treturn this.sortDisabled ? false : ts.isValueInArray( parseFloat($(this).attr('data-column')), c.sortList) >= 0;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\ttable.add($h).addClass(ts.css.processing + ' ' + c.cssProcessing);\n\t\t\t\t} else {\n\t\t\t\t\ttable.add($h).removeClass(ts.css.processing + ' ' + c.cssProcessing);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// detach tbody but save the position\n\t\t\t// don't use tbody because there are portions that look for a tbody index (updateCell)\n\t\t\tts.processTbody = function(table, $tb, getIt){\n\t\t\t\ttable = $(table)[0];\n\t\t\t\tvar holdr;\n\t\t\t\tif (getIt) {\n\t\t\t\t\ttable.isProcessing = true;\n\t\t\t\t\t$tb.before('<span class=\"tablesorter-savemyplace\"/>');\n\t\t\t\t\tholdr = ($.fn.detach) ? $tb.detach() : $tb.remove();\n\t\t\t\t\treturn holdr;\n\t\t\t\t}\n\t\t\t\tholdr = $(table).find('span.tablesorter-savemyplace');\n\t\t\t\t$tb.insertAfter( holdr );\n\t\t\t\tholdr.remove();\n\t\t\t\ttable.isProcessing = false;\n\t\t\t};\n\n\t\t\tts.clearTableBody = function(table) {\n\t\t\t\t$(table)[0].config.$tbodies.children().detach();\n\t\t\t};\n\n\t\t\tts.bindEvents = function(table, $headers, core){\n\t\t\t\ttable = $(table)[0];\n\t\t\t\tvar downTime,\n\t\t\t\t\tc = table.config;\n\t\t\t\tif (core !== true) {\n\t\t\t\t\tc.$extraHeaders = c.$extraHeaders ? c.$extraHeaders.add($headers) : $headers;\n\t\t\t\t}\n\t\t\t\t// apply event handling to headers and/or additional headers (stickyheaders, scroller, etc)\n\t\t\t\t$headers\n\t\t\t\t// http://stackoverflow.com/questions/5312849/jquery-find-self;\n\t\t\t\t.find(c.selectorSort).add( $headers.filter(c.selectorSort) )\n\t\t\t\t.off('mousedown mouseup sort keyup '.split(' ').join(c.namespace + ' '))\n\t\t\t\t.on('mousedown mouseup sort keyup '.split(' ').join(c.namespace + ' '), function(e, external) {\n\t\t\t\t\tvar cell, type = e.type;\n\t\t\t\t\t// only recognize left clicks or enter\n\t\t\t\t\tif ( ((e.which || e.button) !== 1 && !/sort|keyup/.test(type)) || (type === 'keyup' && e.which !== 13) ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t// ignore long clicks (prevents resizable widget from initializing a sort)\n\t\t\t\t\tif (type === 'mouseup' && external !== true && (new Date().getTime() - downTime > 250)) { return; }\n\t\t\t\t\t// set timer on mousedown\n\t\t\t\t\tif (type === 'mousedown') {\n\t\t\t\t\t\tdownTime = new Date().getTime();\n\t\t\t\t\t\treturn /(input|select|button|textarea)/i.test(e.target.tagName) ? '' : !c.cancelSelection;\n\t\t\t\t\t}\n\t\t\t\t\tif (c.delayInit && isEmptyObject(c.cache)) { buildCache(table); }\n\t\t\t\t\t// jQuery v1.2.6 doesn't have closest()\n\t\t\t\t\tcell = $.fn.closest ? $(this).closest('th, td')[0] : /TH|TD/.test(this.tagName) ? this : $(this).parents('th, td')[0];\n\t\t\t\t\t// reference original table headers and find the same cell\n\t\t\t\t\tcell = c.$headers[ $headers.index( cell ) ];\n\t\t\t\t\tif (!cell.sortDisabled) {\n\t\t\t\t\t\tinitSort(table, cell, e);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif (c.cancelSelection) {\n\t\t\t\t\t// cancel selection\n\t\t\t\t\t$headers\n\t\t\t\t\t\t.attr('unselectable', 'on')\n\t\t\t\t\t\t.on('selectstart', false)\n\t\t\t\t\t\t.css({\n\t\t\t\t\t\t\t'user-select': 'none',\n\t\t\t\t\t\t\t'MozUserSelect': 'none' // not needed for jQuery 1.8+\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// restore headers\n\t\t\tts.restoreHeaders = function(table){\n\t\t\t\tvar c = $(table)[0].config;\n\t\t\t\t// don't use c.$headers here in case header cells were swapped\n\t\t\t\tc.$table.find(c.selectorHeaders).each(function(i){\n\t\t\t\t\t// only restore header cells if it is wrapped\n\t\t\t\t\t// because this is also used by the updateAll method\n\t\t\t\t\tif ($(this).find('.' + ts.css.headerIn).length){\n\t\t\t\t\t\t$(this).html( c.headerContent[i] );\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tts.destroy = function(table, removeClasses, callback){\n\t\t\t\ttable = $(table)[0];\n\t\t\t\tif (!table.hasInitialized) { return; }\n\t\t\t\t// remove all widgets\n\t\t\t\tts.refreshWidgets(table, true, true);\n\t\t\t\tvar $t = $(table), c = table.config,\n\t\t\t\t$h = $t.find('thead:first'),\n\t\t\t\t$r = $h.find('tr.' + ts.css.headerRow).removeClass(ts.css.headerRow + ' ' + c.cssHeaderRow),\n\t\t\t\t$f = $t.find('tfoot:first > tr').children('th, td');\n\t\t\t\tif (removeClasses === false && $.inArray('uitheme', c.widgets) >= 0) {\n\t\t\t\t\t// reapply uitheme classes, in case we want to maintain appearance\n\t\t\t\t\t$t.trigger('applyWidgetId', ['uitheme']);\n\t\t\t\t\t$t.trigger('applyWidgetId', ['zebra']);\n\t\t\t\t}\n\t\t\t\t// remove widget added rows, just in case\n\t\t\t\t$h.find('tr').not($r).remove();\n\t\t\t\t// disable tablesorter\n\t\t\t\t$t\n\t\t\t\t\t.removeData('tablesorter')\n\t\t\t\t\t.off('sortReset update updateAll updateRows updateCell addRows updateComplete sorton appendCache updateCache applyWidgetId applyWidgets refreshWidgets destroy mouseup mouseleave keypress sortBegin sortEnd resetToLoadState '.split(' ').join(c.namespace + ' '));\n\t\t\t\tc.$headers.add($f)\n\t\t\t\t\t.removeClass( [ts.css.header, c.cssHeader, c.cssAsc, c.cssDesc, ts.css.sortAsc, ts.css.sortDesc, ts.css.sortNone].join(' ') )\n\t\t\t\t\t.removeAttr('data-column')\n\t\t\t\t\t.removeAttr('aria-label')\n\t\t\t\t\t.attr('aria-disabled', 'true');\n\t\t\t\t$r.find(c.selectorSort).off('mousedown mouseup keypress '.split(' ').join(c.namespace + ' '));\n\t\t\t\tts.restoreHeaders(table);\n\t\t\t\t$t.toggleClass(ts.css.table + ' ' + c.tableClass + ' tablesorter-' + c.theme, removeClasses === false);\n\t\t\t\t// clear flag in case the plugin is initialized again\n\t\t\t\ttable.hasInitialized = false;\n\t\t\t\tdelete table.config.cache;\n\t\t\t\tif (typeof callback === 'function') {\n\t\t\t\t\tcallback(table);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// *** sort functions ***\n\t\t\t// regex used in natural sort\n\t\t\tts.regex = {\n\t\t\t\tchunk : /(^([+\\-]?(?:0|[1-9]\\d*)(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?)?$|^0x[0-9a-f]+$|\\d+)/gi, // chunk/tokenize numbers & letters\n\t\t\t\tchunks: /(^\\\\0|\\\\0$)/, // replace chunks @ ends\n\t\t\t\thex: /^0x[0-9a-f]+$/i // hex\n\t\t\t};\n\n\t\t\t// Natural sort - https://github.com/overset/javascript-natural-sort (date sorting removed)\n\t\t\t// this function will only accept strings, or you'll see \"TypeError: undefined is not a function\"\n\t\t\t// I could add a = a.toString(); b = b.toString(); but it'll slow down the sort overall\n\t\t\tts.sortNatural = function(a, b) {\n\t\t\t\tif (a === b) { return 0; }\n\t\t\t\tvar xN, xD, yN, yD, xF, yF, i, mx,\n\t\t\t\t\tr = ts.regex;\n\t\t\t\t// first try and sort Hex codes\n\t\t\t\tif (r.hex.test(b)) {\n\t\t\t\t\txD = parseInt(a.match(r.hex), 16);\n\t\t\t\t\tyD = parseInt(b.match(r.hex), 16);\n\t\t\t\t\tif ( xD < yD ) { return -1; }\n\t\t\t\t\tif ( xD > yD ) { return 1; }\n\t\t\t\t}\n\t\t\t\t// chunk/tokenize\n\t\t\t\txN = a.replace(r.chunk, '\\\\0$1\\\\0').replace(r.chunks, '').split('\\\\0');\n\t\t\t\tyN = b.replace(r.chunk, '\\\\0$1\\\\0').replace(r.chunks, '').split('\\\\0');\n\t\t\t\tmx = Math.max(xN.length, yN.length);\n\t\t\t\t// natural sorting through split numeric strings and default strings\n\t\t\t\tfor (i = 0; i < mx; i++) {\n\t\t\t\t\t// find floats not starting with '0', string or 0 if not defined\n\t\t\t\t\txF = isNaN(xN[i]) ? xN[i] || 0 : parseFloat(xN[i]) || 0;\n\t\t\t\t\tyF = isNaN(yN[i]) ? yN[i] || 0 : parseFloat(yN[i]) || 0;\n\t\t\t\t\t// handle numeric vs string comparison - number < string - (Kyle Adams)\n\t\t\t\t\tif (isNaN(xF) !== isNaN(yF)) { return (isNaN(xF)) ? 1 : -1; }\n\t\t\t\t\t// rely on string comparison if different types - i.e. '02' < 2 != '02' < '2'\n\t\t\t\t\tif (typeof xF !== typeof yF) {\n\t\t\t\t\t\txF += '';\n\t\t\t\t\t\tyF += '';\n\t\t\t\t\t}\n\t\t\t\t\tif (xF < yF) { return -1; }\n\t\t\t\t\tif (xF > yF) { return 1; }\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\n\t\t\tts.sortNaturalAsc = function(a, b, col, table, c) {\n\t\t\t\tif (a === b) { return 0; }\n\t\t\t\tvar e = c.string[ (c.empties[col] || c.emptyTo ) ];\n\t\t\t\tif (a === '' && e !== 0) { return typeof e === 'boolean' ? (e ? -1 : 1) : -e || -1; }\n\t\t\t\tif (b === '' && e !== 0) { return typeof e === 'boolean' ? (e ? 1 : -1) : e || 1; }\n\t\t\t\treturn ts.sortNatural(a, b);\n\t\t\t};\n\n\t\t\tts.sortNaturalDesc = function(a, b, col, table, c) {\n\t\t\t\tif (a === b) { return 0; }\n\t\t\t\tvar e = c.string[ (c.empties[col] || c.emptyTo ) ];\n\t\t\t\tif (a === '' && e !== 0) { return typeof e === 'boolean' ? (e ? -1 : 1) : e || 1; }\n\t\t\t\tif (b === '' && e !== 0) { return typeof e === 'boolean' ? (e ? 1 : -1) : -e || -1; }\n\t\t\t\treturn ts.sortNatural(b, a);\n\t\t\t};\n\n\t\t\t// basic alphabetical sort\n\t\t\tts.sortText = function(a, b) {\n\t\t\t\treturn a > b ? 1 : (a < b ? -1 : 0);\n\t\t\t};\n\n\t\t\t// return text string value by adding up ascii value\n\t\t\t// so the text is somewhat sorted when using a digital sort\n\t\t\t// this is NOT an alphanumeric sort\n\t\t\tts.getTextValue = function(a, num, mx) {\n\t\t\t\tif (mx) {\n\t\t\t\t\t// make sure the text value is greater than the max numerical value (mx)\n\t\t\t\t\tvar i, l = a ? a.length : 0, n = mx + num;\n\t\t\t\t\tfor (i = 0; i < l; i++) {\n\t\t\t\t\t\tn += a.charCodeAt(i);\n\t\t\t\t\t}\n\t\t\t\t\treturn num * n;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t};\n\n\t\t\tts.sortNumericAsc = function(a, b, num, mx, col, table) {\n\t\t\t\tif (a === b) { return 0; }\n\t\t\t\tvar c = table.config,\n\t\t\t\t\te = c.string[ (c.empties[col] || c.emptyTo ) ];\n\t\t\t\tif (a === '' && e !== 0) { return typeof e === 'boolean' ? (e ? -1 : 1) : -e || -1; }\n\t\t\t\tif (b === '' && e !== 0) { return typeof e === 'boolean' ? (e ? 1 : -1) : e || 1; }\n\t\t\t\tif (isNaN(a)) { a = ts.getTextValue(a, num, mx); }\n\t\t\t\tif (isNaN(b)) { b = ts.getTextValue(b, num, mx); }\n\t\t\t\treturn a - b;\n\t\t\t};\n\n\t\t\tts.sortNumericDesc = function(a, b, num, mx, col, table) {\n\t\t\t\tif (a === b) { return 0; }\n\t\t\t\tvar c = table.config,\n\t\t\t\t\te = c.string[ (c.empties[col] || c.emptyTo ) ];\n\t\t\t\tif (a === '' && e !== 0) { return typeof e === 'boolean' ? (e ? -1 : 1) : e || 1; }\n\t\t\t\tif (b === '' && e !== 0) { return typeof e === 'boolean' ? (e ? 1 : -1) : -e || -1; }\n\t\t\t\tif (isNaN(a)) { a = ts.getTextValue(a, num, mx); }\n\t\t\t\tif (isNaN(b)) { b = ts.getTextValue(b, num, mx); }\n\t\t\t\treturn b - a;\n\t\t\t};\n\n\t\t\tts.sortNumeric = function(a, b) {\n\t\t\t\treturn a - b;\n\t\t\t};\n\n\t\t\t// used when replacing accented characters during sorting\n\t\t\tts.characterEquivalents = {\n\t\t\t\t\"a\" : \"\\u00e1\\u00e0\\u00e2\\u00e3\\u00e4\\u0105\\u00e5\", // áàâãäąå\n\t\t\t\t\"A\" : \"\\u00c1\\u00c0\\u00c2\\u00c3\\u00c4\\u0104\\u00c5\", // ÁÀÂÃÄĄÅ\n\t\t\t\t\"c\" : \"\\u00e7\\u0107\\u010d\", // çćč\n\t\t\t\t\"C\" : \"\\u00c7\\u0106\\u010c\", // ÇĆČ\n\t\t\t\t\"e\" : \"\\u00e9\\u00e8\\u00ea\\u00eb\\u011b\\u0119\", // éèêëěę\n\t\t\t\t\"E\" : \"\\u00c9\\u00c8\\u00ca\\u00cb\\u011a\\u0118\", // ÉÈÊËĚĘ\n\t\t\t\t\"i\" : \"\\u00ed\\u00ec\\u0130\\u00ee\\u00ef\\u0131\", // íìİîïı\n\t\t\t\t\"I\" : \"\\u00cd\\u00cc\\u0130\\u00ce\\u00cf\", // ÍÌİÎÏ\n\t\t\t\t\"o\" : \"\\u00f3\\u00f2\\u00f4\\u00f5\\u00f6\", // óòôõö\n\t\t\t\t\"O\" : \"\\u00d3\\u00d2\\u00d4\\u00d5\\u00d6\", // ÓÒÔÕÖ\n\t\t\t\t\"ss\": \"\\u00df\", // ß (s sharp)\n\t\t\t\t\"SS\": \"\\u1e9e\", // ẞ (Capital sharp s)\n\t\t\t\t\"u\" : \"\\u00fa\\u00f9\\u00fb\\u00fc\\u016f\", // úùûüů\n\t\t\t\t\"U\" : \"\\u00da\\u00d9\\u00db\\u00dc\\u016e\" // ÚÙÛÜŮ\n\t\t\t};\n\t\t\tts.replaceAccents = function(s) {\n\t\t\t\tvar a, acc = '[', eq = ts.characterEquivalents;\n\t\t\t\tif (!ts.characterRegex) {\n\t\t\t\t\tts.characterRegexArray = {};\n\t\t\t\t\tfor (a in eq) {\n\t\t\t\t\t\tif (typeof a === 'string') {\n\t\t\t\t\t\t\tacc += eq[a];\n\t\t\t\t\t\t\tts.characterRegexArray[a] = new RegExp('[' + eq[a] + ']', 'g');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tts.characterRegex = new RegExp(acc + ']');\n\t\t\t\t}\n\t\t\t\tif (ts.characterRegex.test(s)) {\n\t\t\t\t\tfor (a in eq) {\n\t\t\t\t\t\tif (typeof a === 'string') {\n\t\t\t\t\t\t\ts = s.replace( ts.characterRegexArray[a], a );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn s;\n\t\t\t};\n\n\t\t\t// *** utilities ***\n\t\t\tts.isValueInArray = function(column, arry) {\n\t\t\t\tvar indx, len = arry.length;\n\t\t\t\tfor (indx = 0; indx < len; indx++) {\n\t\t\t\t\tif (arry[indx][0] === column) {\n\t\t\t\t\t\treturn indx;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn -1;\n\t\t\t};\n\n\t\t\tts.addParser = function(parser) {\n\t\t\t\tvar i, l = ts.parsers.length, a = true;\n\t\t\t\tfor (i = 0; i < l; i++) {\n\t\t\t\t\tif (ts.parsers[i].id.toLowerCase() === parser.id.toLowerCase()) {\n\t\t\t\t\t\ta = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (a) {\n\t\t\t\t\tts.parsers.push(parser);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tts.getParserById = function(name) {\n\t\t\t\t/*jshint eqeqeq:false */\n\t\t\t\tif (name == 'false') { return false; }\n\t\t\t\tvar i, l = ts.parsers.length;\n\t\t\t\tfor (i = 0; i < l; i++) {\n\t\t\t\t\tif (ts.parsers[i].id.toLowerCase() === (name.toString()).toLowerCase()) {\n\t\t\t\t\t\treturn ts.parsers[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t};\n\n\t\t\tts.addWidget = function(widget) {\n\t\t\t\tts.widgets.push(widget);\n\t\t\t};\n\n\t\t\tts.hasWidget = function(table, name){\n\t\t\t\ttable = $(table);\n\t\t\t\treturn table.length && table[0].config && table[0].config.widgetInit[name] || false;\n\t\t\t};\n\n\t\t\tts.getWidgetById = function(name) {\n\t\t\t\tvar i, w, l = ts.widgets.length;\n\t\t\t\tfor (i = 0; i < l; i++) {\n\t\t\t\t\tw = ts.widgets[i];\n\t\t\t\t\tif (w && w.hasOwnProperty('id') && w.id.toLowerCase() === name.toLowerCase()) {\n\t\t\t\t\t\treturn w;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tts.applyWidget = function(table, init) {\n\t\t\t\ttable = $(table)[0]; // in case this is called externally\n\t\t\t\tvar c = table.config,\n\t\t\t\t\two = c.widgetOptions,\n\t\t\t\t\twidgets = [],\n\t\t\t\t\ttime, w, wd;\n\t\t\t\t// prevent numerous consecutive widget applications\n\t\t\t\tif (init !== false && table.hasInitialized && (table.isApplyingWidgets || table.isUpdating)) { return; }\n\t\t\t\tif (c.debug) { time = new Date(); }\n\t\t\t\tif (c.widgets.length) {\n\t\t\t\t\ttable.isApplyingWidgets = true;\n\t\t\t\t\t// ensure unique widget ids\n\t\t\t\t\tc.widgets = $.grep(c.widgets, function(v, k){\n\t\t\t\t\t\treturn $.inArray(v, c.widgets) === k;\n\t\t\t\t\t});\n\t\t\t\t\t// build widget array & add priority as needed\n\t\t\t\t\t$.each(c.widgets || [], function(i,n){\n\t\t\t\t\t\twd = ts.getWidgetById(n);\n\t\t\t\t\t\tif (wd && wd.id) {\n\t\t\t\t\t\t\t// set priority to 10 if not defined\n\t\t\t\t\t\t\tif (!wd.priority) { wd.priority = 10; }\n\t\t\t\t\t\t\twidgets[i] = wd;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\t// sort widgets by priority\n\t\t\t\t\twidgets.sort(function(a, b){\n\t\t\t\t\t\treturn a.priority < b.priority ? -1 : a.priority === b.priority ? 0 : 1;\n\t\t\t\t\t});\n\t\t\t\t\t// add/update selected widgets\n\t\t\t\t\t$.each(widgets, function(i,w){\n\t\t\t\t\t\tif (w) {\n\t\t\t\t\t\t\tif (init || !(c.widgetInit[w.id])) {\n\t\t\t\t\t\t\t\t// set init flag first to prevent calling init more than once (e.g. pager)\n\t\t\t\t\t\t\t\tc.widgetInit[w.id] = true;\n\t\t\t\t\t\t\t\tif (w.hasOwnProperty('options')) {\n\t\t\t\t\t\t\t\t\two = table.config.widgetOptions = $.extend( true, {}, w.options, wo );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (w.hasOwnProperty('init')) {\n\t\t\t\t\t\t\t\t\tw.init(table, w, c, wo);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (!init && w.hasOwnProperty('format')) {\n\t\t\t\t\t\t\t\tw.format(table, c, wo, false);\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\tsetTimeout(function(){\n\t\t\t\t\ttable.isApplyingWidgets = false;\n\t\t\t\t}, 0);\n\t\t\t\tif (c.debug) {\n\t\t\t\t\tw = c.widgets.length;\n\t\t\t\t\tbenchmark(\"Completed \" + (init === true ? \"initializing \" : \"applying \") + w + \" widget\" + (w !== 1 ? \"s\" : \"\"), time);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tts.refreshWidgets = function(table, doAll, dontapply) {\n\t\t\t\ttable = $(table)[0]; // see issue #243\n\t\t\t\tvar i, c = table.config,\n\t\t\t\t\tcw = c.widgets,\n\t\t\t\t\tw = ts.widgets, l = w.length;\n\t\t\t\t// remove previous widgets\n\t\t\t\tfor (i = 0; i < l; i++){\n\t\t\t\t\tif ( w[i] && w[i].id && (doAll || $.inArray( w[i].id, cw ) < 0) ) {\n\t\t\t\t\t\tif (c.debug) { log( 'Refeshing widgets: Removing \"' + w[i].id + '\"' ); }\n\t\t\t\t\t\t// only remove widgets that have been initialized - fixes #442\n\t\t\t\t\t\tif (w[i].hasOwnProperty('remove') && c.widgetInit[w[i].id]) {\n\t\t\t\t\t\t\tw[i].remove(table, c, c.widgetOptions);\n\t\t\t\t\t\t\tc.widgetInit[w[i].id] = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (dontapply !== true) {\n\t\t\t\t\tts.applyWidget(table, doAll);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// get sorter, string, empty, etc options for each column from\n\t\t\t// jQuery data, metadata, header option or header class name (\"sorter-false\")\n\t\t\t// priority = jQuery data > meta > headers option > header class name\n\t\t\tts.getData = function(h, ch, key) {\n\t\t\t\tvar val = '', $h = $(h), m, cl;\n\t\t\t\tif (!$h.length) { return ''; }\n\t\t\t\tm = $.metadata ? $h.metadata() : false;\n\t\t\t\tcl = ' ' + ($h.attr('class') || '');\n\t\t\t\tif (typeof $h.data(key) !== 'undefined' || typeof $h.data(key.toLowerCase()) !== 'undefined'){\n\t\t\t\t\t// \"data-lockedOrder\" is assigned to \"lockedorder\"; but \"data-locked-order\" is assigned to \"lockedOrder\"\n\t\t\t\t\t// \"data-sort-initial-order\" is assigned to \"sortInitialOrder\"\n\t\t\t\t\tval += $h.data(key) || $h.data(key.toLowerCase());\n\t\t\t\t} else if (m && typeof m[key] !== 'undefined') {\n\t\t\t\t\tval += m[key];\n\t\t\t\t} else if (ch && typeof ch[key] !== 'undefined') {\n\t\t\t\t\tval += ch[key];\n\t\t\t\t} else if (cl !== ' ' && cl.match(' ' + key + '-')) {\n\t\t\t\t\t// include sorter class name \"sorter-text\", etc; now works with \"sorter-my-custom-parser\"\n\t\t\t\t\tval = cl.match( new RegExp('\\\\s' + key + '-([\\\\w-]+)') )[1] || '';\n\t\t\t\t}\n\t\t\t\treturn (val === undefined || val === null) ? \"\" : val.trim();\n\t\t\t};\n\n\t\t\tts.formatFloat = function(s, table) {\n\t\t\t\tif (typeof s !== 'string' || s === '') { return s; }\n\t\t\t\t// allow using formatFloat without a table; defaults to US number format\n\t\t\t\tvar i,\n\t\t\t\t\tt = table && table.config ? table.config.usNumberFormat !== false :\n\t\t\t\t\t\ttypeof table !== \"undefined\" ? table : true;\n\t\t\t\tif (t) {\n\t\t\t\t\t// US Format - 1,234,567.89 -> 1234567.89\n\t\t\t\t\ts = s.replace(/,/g,'');\n\t\t\t\t} else {\n\t\t\t\t\t// German Format = 1.234.567,89 -> 1234567.89\n\t\t\t\t\t// French Format = 1 234 567,89 -> 1234567.89\n\t\t\t\t\ts = s.replace(/[\\s|\\.]/g,'').replace(/,/g,'.');\n\t\t\t\t}\n\t\t\t\tif(/^\\s*\\([.\\d]+\\)/.test(s)) {\n\t\t\t\t\t// make (#) into a negative number -> (10) = -10\n\t\t\t\t\ts = s.replace(/^\\s*\\(([.\\d]+)\\)/, '-$1');\n\t\t\t\t}\n\t\t\t\ti = parseFloat(s);\n\t\t\t\t// return the text instead of zero\n\t\t\t\treturn isNaN(i) ? s.trim() : i;\n\t\t\t};\n\n\t\t\tts.isDigit = function(s) {\n\t\t\t\t// replace all unwanted chars and match\n\t\t\t\treturn isNaN(s) ? (/^[\\-+(]?\\d+[)]?$/).test(s.toString().replace(/[,.'\"\\s]/g, '')) : true;\n\t\t\t};\n\n\t\t}()\n\t});\n\n\t// make shortcut\n\tvar ts = $.tablesorter;\n\n\t// extend plugin scope\n\t$.fn.extend({\n\t\ttablesorter: ts.construct\n\t});\n\n\t// add default parsers\n\tts.addParser({\n\t\tid: 'no-parser',\n\t\tis: function() {\n\t\t\treturn false;\n\t\t},\n\t\tformat: function() {\n\t\t\treturn '';\n\t\t},\n\t\ttype: 'text'\n\t});\n\n\tts.addParser({\n\t\tid: \"text\",\n\t\tis: function() {\n\t\t\treturn true;\n\t\t},\n\t\tformat: function(s, table) {\n\t\t\tvar c = table.config;\n\t\t\tif (s) {\n\t\t\t\ts = ( c.ignoreCase ? s.toLocaleLowerCase() : s ).trim();\n\t\t\t\ts = c.sortLocaleCompare ? ts.replaceAccents(s) : s;\n\t\t\t}\n\t\t\treturn s;\n\t\t},\n\t\ttype: \"text\"\n\t});\n\n\tts.addParser({\n\t\tid: \"digit\",\n\t\tis: function(s) {\n\t\t\treturn ts.isDigit(s);\n\t\t},\n\t\tformat: function(s, table) {\n\t\t\tvar n = ts.formatFloat((s || '').replace(/[^\\w,. \\-()]/g, \"\"), table);\n\t\t\treturn s && typeof n === 'number' ? n : s ? ( s && table.config.ignoreCase ? s.toLocaleLowerCase() : s ).trim() : s;\n\t\t},\n\t\ttype: \"numeric\"\n\t});\n\n\tts.addParser({\n\t\tid: \"currency\",\n\t\tis: function(s) {\n\t\t\treturn (/^\\(?\\d+[\\u00a3$\\u20ac\\u00a4\\u00a5\\u00a2?.]|[\\u00a3$\\u20ac\\u00a4\\u00a5\\u00a2?.]\\d+\\)?$/).test((s || '').replace(/[+\\-,. ]/g,'')); // £$€¤¥¢\n\t\t},\n\t\tformat: function(s, table) {\n\t\t\tvar n = ts.formatFloat((s || '').replace(/[^\\w,. \\-()]/g, \"\"), table);\n\t\t\treturn s && typeof n === 'number' ? n : s ? ( s && table.config.ignoreCase ? s.toLocaleLowerCase() : s ).trim() : s;\n\t\t},\n\t\ttype: \"numeric\"\n\t});\n\n\tts.addParser({\n\t\tid: \"ipAddress\",\n\t\tis: function(s) {\n\t\t\treturn (/^\\d{1,3}[\\.]\\d{1,3}[\\.]\\d{1,3}[\\.]\\d{1,3}$/).test(s);\n\t\t},\n\t\tformat: function(s, table) {\n\t\t\tvar i, a = s ? s.split(\".\") : '',\n\t\t\tr = \"\",\n\t\t\tl = a.length;\n\t\t\tfor (i = 0; i < l; i++) {\n\t\t\t\tr += (\"00\" + a[i]).slice(-3);\n\t\t\t}\n\t\t\treturn s ? ts.formatFloat(r, table) : s;\n\t\t},\n\t\ttype: \"numeric\"\n\t});\n\n\tts.addParser({\n\t\tid: \"url\",\n\t\tis: function(s) {\n\t\t\treturn (/^(https?|ftp|file):\\/\\//).test(s);\n\t\t},\n\t\tformat: function(s) {\n\t\t\treturn s ? s.replace(/(https?|ftp|file):\\/\\//, '').trim() : s;\n\t\t},\n\t\tparsed : true, // filter widget flag\n\t\ttype: \"text\"\n\t});\n\n\tts.addParser({\n\t\tid: \"isoDate\",\n\t\tis: function(s) {\n\t\t\treturn (/^\\d{4}[\\/\\-]\\d{1,2}[\\/\\-]\\d{1,2}/).test(s);\n\t\t},\n\t\tformat: function(s, table) {\n\t\t\treturn s ? ts.formatFloat((s !== \"\") ? (new Date(s.replace(/-/g, \"/\")).getTime() || s) : \"\", table) : s;\n\t\t},\n\t\ttype: \"numeric\"\n\t});\n\n\tts.addParser({\n\t\tid: \"percent\",\n\t\tis: function(s) {\n\t\t\treturn (/(\\d\\s*?%|%\\s*?\\d)/).test(s) && s.length < 15;\n\t\t},\n\t\tformat: function(s, table) {\n\t\t\treturn s ? ts.formatFloat(s.replace(/%/g, \"\"), table) : s;\n\t\t},\n\t\ttype: \"numeric\"\n\t});\n\n\tts.addParser({\n\t\tid: \"usLongDate\",\n\t\tis: function(s) {\n\t\t\t// two digit years are not allowed cross-browser\n\t\t\t// Jan 01, 2013 12:34:56 PM or 01 Jan 2013\n\t\t\treturn (/^[A-Z]{3,10}\\.?\\s+\\d{1,2},?\\s+(\\d{4})(\\s+\\d{1,2}:\\d{2}(:\\d{2})?(\\s+[AP]M)?)?$/i).test(s) || (/^\\d{1,2}\\s+[A-Z]{3,10}\\s+\\d{4}/i).test(s);\n\t\t},\n\t\tformat: function(s, table) {\n\t\t\treturn s ? ts.formatFloat( (new Date(s.replace(/(\\S)([AP]M)$/i, \"$1 $2\")).getTime() || s), table) : s;\n\t\t},\n\t\ttype: \"numeric\"\n\t});\n\n\tts.addParser({\n\t\tid: \"shortDate\", // \"mmddyyyy\", \"ddmmyyyy\" or \"yyyymmdd\"\n\t\tis: function(s) {\n\t\t\t// testing for ##-##-#### or ####-##-##, so it's not perfect; time can be included\n\t\t\treturn (/(^\\d{1,2}[\\/\\s]\\d{1,2}[\\/\\s]\\d{4})|(^\\d{4}[\\/\\s]\\d{1,2}[\\/\\s]\\d{1,2})/).test((s || '').replace(/\\s+/g,\" \").replace(/[\\-.,]/g, \"/\"));\n\t\t},\n\t\tformat: function(s, table, cell, cellIndex) {\n\t\t\tif (s) {\n\t\t\t\tvar c = table.config,\n\t\t\t\t\tci = c.$headers.filter('[data-column=' + cellIndex + ']:last'),\n\t\t\t\t\tformat = ci.length && ci[0].dateFormat || ts.getData( ci, ts.getColumnData( table, c.headers, cellIndex ), 'dateFormat') || c.dateFormat;\n\t\t\t\ts = s.replace(/\\s+/g,\" \").replace(/[\\-.,]/g, \"/\"); // escaped - because JSHint in Firefox was showing it as an error\n\t\t\t\tif (format === \"mmddyyyy\") {\n\t\t\t\t\ts = s.replace(/(\\d{1,2})[\\/\\s](\\d{1,2})[\\/\\s](\\d{4})/, \"$3/$1/$2\");\n\t\t\t\t} else if (format === \"ddmmyyyy\") {\n\t\t\t\t\ts = s.replace(/(\\d{1,2})[\\/\\s](\\d{1,2})[\\/\\s](\\d{4})/, \"$3/$2/$1\");\n\t\t\t\t} else if (format === \"yyyymmdd\") {\n\t\t\t\t\ts = s.replace(/(\\d{4})[\\/\\s](\\d{1,2})[\\/\\s](\\d{1,2})/, \"$1/$2/$3\");\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn s ? ts.formatFloat( (new Date(s).getTime() || s), table) : s;\n\t\t},\n\t\ttype: \"numeric\"\n\t});\n\n\tts.addParser({\n\t\tid: \"time\",\n\t\tis: function(s) {\n\t\t\treturn (/^(([0-2]?\\d:[0-5]\\d)|([0-1]?\\d:[0-5]\\d\\s?([AP]M)))$/i).test(s);\n\t\t},\n\t\tformat: function(s, table) {\n\t\t\treturn s ? ts.formatFloat( (new Date(\"2000/01/01 \" + s.replace(/(\\S)([AP]M)$/i, \"$1 $2\")).getTime() || s), table) : s;\n\t\t},\n\t\ttype: \"numeric\"\n\t});\n\n\tts.addParser({\n\t\tid: \"metadata\",\n\t\tis: function() {\n\t\t\treturn false;\n\t\t},\n\t\tformat: function(s, table, cell) {\n\t\t\tvar c = table.config,\n\t\t\tp = (!c.parserMetadataName) ? 'sortValue' : c.parserMetadataName;\n\t\t\treturn $(cell).metadata()[p];\n\t\t},\n\t\ttype: \"numeric\"\n\t});\n\n\t// add default widgets\n\tts.addWidget({\n\t\tid: \"zebra\",\n\t\tpriority: 90,\n\t\tformat: function(table, c, wo) {\n\t\t\tvar $tb, $tv, $tr, row, even, time, k,\n\t\t\tchild = new RegExp(c.cssChildRow, 'i'),\n\t\t\tb = c.$tbodies;\n\t\t\tif (c.debug) {\n\t\t\t\ttime = new Date();\n\t\t\t}\n\t\t\tfor (k = 0; k < b.length; k++ ) {\n\t\t\t\t// loop through the visible rows\n\t\t\t\trow = 0;\n\t\t\t\t$tb = b.eq(k);\n\t\t\t\t$tv = $tb.children('tr:visible').not(c.selectorRemove);\n\t\t\t\t// revered back to using jQuery each - strangely it's the fastest method\n\t\t\t\t/*jshint loopfunc:true */\n\t\t\t\t$tv.each(function(){\n\t\t\t\t\t$tr = $(this);\n\t\t\t\t\t// style child rows the same way the parent row was styled\n\t\t\t\t\tif (!child.test(this.className)) { row++; }\n\t\t\t\t\teven = (row % 2 === 0);\n\t\t\t\t\t$tr.removeClass(wo.zebra[even ? 1 : 0]).addClass(wo.zebra[even ? 0 : 1]);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (c.debug) {\n\t\t\t\tts.benchmark(\"Applying Zebra widget\", time);\n\t\t\t}\n\t\t},\n\t\tremove: function(table, c, wo){\n\t\t\tvar k, $tb,\n\t\t\t\tb = c.$tbodies,\n\t\t\t\trmv = (wo.zebra || [ \"even\", \"odd\" ]).join(' ');\n\t\t\tfor (k = 0; k < b.length; k++ ){\n\t\t\t\t$tb = $.tablesorter.processTbody(table, b.eq(k), true); // remove tbody\n\t\t\t\t$tb.children().removeClass(rmv);\n\t\t\t\t$.tablesorter.processTbody(table, $tb, false); // restore tbody\n\t\t\t}\n\t\t}\n\t});\n\n})(jQuery);\n","/**\n * Serializes form fields within the given element to a JSON object\n *\n * {\n *    fieldName: \"fieldValue\"\n * }\n *\n * @returns {Object}\n */\njQuery.fn.serializeObject = function () {\n\n    var data = {};\n\n    this.find(\":input:not(:button):not(:submit):not(:radio):not('select[multiple]')\").each(function () {\n\n        if (this.name === \"\") {\n            return;\n        }\n\n        if (this.value === null) {\n            this.value = \"\";\n        }\n\n        data[this.name] = this.value.match(/^(tru|fals)e$/i) ?\n                            this.value.toLowerCase() == \"true\" : this.value;\n    });\n\n    this.find(\"input:radio:checked\").each(function(){\n        data[this.name] = this.value;\n    });\n\n    this.find(\"select[multiple]\").each(function(){\n\n        var $select = jQuery(this),\n            val = $select.val();\n\n        if ($select.data(\"aui-ss\")) {\n            if (val) {\n                data[this.name] = val[0];\n            } else {\n                data[this.name] = \"\";\n            }\n        } else {\n\n            if (val !== null) {\n                data[this.name] = val;\n            } else {\n                data[this.name] = [];\n            }\n        }\n    });\n\n    return data;\n};","//     Underscore.js 1.13.8\n//     https://underscorejs.org\n//     (c) 2009-2026 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors\n//     Underscore may be freely distributed under the MIT license.\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n// Current version.\nvar VERSION = '1.13.8';\n\n// Establish the root object, `window` (`self`) in the browser, `global`\n// on the server, or `this` in some virtual machines. We use `self`\n// instead of `window` for `WebWorker` support.\nvar root = (typeof self == 'object' && self.self === self && self) ||\n          (typeof global == 'object' && global.global === global && global) ||\n          Function('return this')() ||\n          {};\n\n// Save bytes in the minified (but not gzipped) version:\nvar ArrayProto = Array.prototype, ObjProto = Object.prototype;\nvar SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;\n\n// Create quick reference variables for speed access to core prototypes.\nvar push = ArrayProto.push,\n    slice = ArrayProto.slice,\n    toString = ObjProto.toString,\n    hasOwnProperty = ObjProto.hasOwnProperty;\n\n// Modern feature detection.\nvar supportsArrayBuffer = typeof ArrayBuffer !== 'undefined',\n    supportsDataView = typeof DataView !== 'undefined';\n\n// All **ECMAScript 5+** native function implementations that we hope to use\n// are declared here.\nvar nativeIsArray = Array.isArray,\n    nativeKeys = Object.keys,\n    nativeCreate = Object.create,\n    nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;\n\n// Create references to these builtin functions because we override them.\nvar _isNaN = isNaN,\n    _isFinite = isFinite;\n\n// Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.\nvar hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');\nvar nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',\n  'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n\n// The largest integer that can be represented exactly.\nvar MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;\n\n// Some functions take a variable number of arguments, or a few expected\n// arguments at the beginning and then a variable number of values to operate\n// on. This helper accumulates all remaining arguments past the function’s\n// argument length (or an explicit `startIndex`), into an array that becomes\n// the last argument. Similar to ES6’s \"rest parameter\".\nfunction restArguments(func, startIndex) {\n  startIndex = startIndex == null ? func.length - 1 : +startIndex;\n  return function() {\n    var length = Math.max(arguments.length - startIndex, 0),\n        rest = Array(length),\n        index = 0;\n    for (; index < length; index++) {\n      rest[index] = arguments[index + startIndex];\n    }\n    switch (startIndex) {\n      case 0: return func.call(this, rest);\n      case 1: return func.call(this, arguments[0], rest);\n      case 2: return func.call(this, arguments[0], arguments[1], rest);\n    }\n    var args = Array(startIndex + 1);\n    for (index = 0; index < startIndex; index++) {\n      args[index] = arguments[index];\n    }\n    args[startIndex] = rest;\n    return func.apply(this, args);\n  };\n}\n\n// Is a given variable an object?\nfunction isObject(obj) {\n  var type = typeof obj;\n  return type === 'function' || (type === 'object' && !!obj);\n}\n\n// Is a given value equal to null?\nfunction isNull(obj) {\n  return obj === null;\n}\n\n// Is a given variable undefined?\nfunction isUndefined(obj) {\n  return obj === void 0;\n}\n\n// Is a given value a boolean?\nfunction isBoolean(obj) {\n  return obj === true || obj === false || toString.call(obj) === '[object Boolean]';\n}\n\n// Is a given value a DOM element?\nfunction isElement(obj) {\n  return !!(obj && obj.nodeType === 1);\n}\n\n// Internal function for creating a `toString`-based type tester.\nfunction tagTester(name) {\n  var tag = '[object ' + name + ']';\n  return function(obj) {\n    return toString.call(obj) === tag;\n  };\n}\n\nvar isString = tagTester('String');\n\nvar isNumber = tagTester('Number');\n\nvar isDate = tagTester('Date');\n\nvar isRegExp = tagTester('RegExp');\n\nvar isError = tagTester('Error');\n\nvar isSymbol = tagTester('Symbol');\n\nvar isArrayBuffer = tagTester('ArrayBuffer');\n\nvar isFunction = tagTester('Function');\n\n// Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old\n// v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).\nvar nodelist = root.document && root.document.childNodes;\nif (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {\n  isFunction = function(obj) {\n    return typeof obj == 'function' || false;\n  };\n}\n\nvar isFunction$1 = isFunction;\n\nvar hasObjectTag = tagTester('Object');\n\n// In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`.\n// In IE 11, the most common among them, this problem also applies to\n// `Map`, `WeakMap` and `Set`.\n// Also, there are cases where an application can override the native\n// `DataView` object, in cases like that we can't use the constructor\n// safely and should just rely on alternate `DataView` checks\nvar hasDataViewBug = (\n      supportsDataView && (!/\\[native code\\]/.test(String(DataView)) || hasObjectTag(new DataView(new ArrayBuffer(8))))\n    ),\n    isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map));\n\nvar isDataView = tagTester('DataView');\n\n// In IE 10 - Edge 13, we need a different heuristic\n// to determine whether an object is a `DataView`.\n// Also, in cases where the native `DataView` is\n// overridden we can't rely on the tag itself.\nfunction alternateIsDataView(obj) {\n  return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer);\n}\n\nvar isDataView$1 = (hasDataViewBug ? alternateIsDataView : isDataView);\n\n// Is a given value an array?\n// Delegates to ECMA5's native `Array.isArray`.\nvar isArray = nativeIsArray || tagTester('Array');\n\n// Internal function to check whether `key` is an own property name of `obj`.\nfunction has$1(obj, key) {\n  return obj != null && hasOwnProperty.call(obj, key);\n}\n\nvar isArguments = tagTester('Arguments');\n\n// Define a fallback version of the method in browsers (ahem, IE < 9), where\n// there isn't any inspectable \"Arguments\" type.\n(function() {\n  if (!isArguments(arguments)) {\n    isArguments = function(obj) {\n      return has$1(obj, 'callee');\n    };\n  }\n}());\n\nvar isArguments$1 = isArguments;\n\n// Is a given object a finite number?\nfunction isFinite$1(obj) {\n  return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj));\n}\n\n// Is the given value `NaN`?\nfunction isNaN$1(obj) {\n  return isNumber(obj) && _isNaN(obj);\n}\n\n// Predicate-generating function. Often useful outside of Underscore.\nfunction constant(value) {\n  return function() {\n    return value;\n  };\n}\n\n// Common internal logic for `isArrayLike` and `isBufferLike`.\nfunction createSizePropertyCheck(getSizeProperty) {\n  return function(collection) {\n    var sizeProperty = getSizeProperty(collection);\n    return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX;\n  }\n}\n\n// Internal helper to generate a function to obtain property `key` from `obj`.\nfunction shallowProperty(key) {\n  return function(obj) {\n    return obj == null ? void 0 : obj[key];\n  };\n}\n\n// Internal helper to obtain the `byteLength` property of an object.\nvar getByteLength = shallowProperty('byteLength');\n\n// Internal helper to determine whether we should spend extensive checks against\n// `ArrayBuffer` et al.\nvar isBufferLike = createSizePropertyCheck(getByteLength);\n\n// Is a given value a typed array?\nvar typedArrayPattern = /\\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\\]/;\nfunction isTypedArray(obj) {\n  // `ArrayBuffer.isView` is the most future-proof, so use it when available.\n  // Otherwise, fall back on the above regular expression.\n  return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) :\n                isBufferLike(obj) && typedArrayPattern.test(toString.call(obj));\n}\n\nvar isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false);\n\n// Internal helper to obtain the `length` property of an object.\nvar getLength = shallowProperty('length');\n\n// Internal helper to create a simple lookup structure.\n// `collectNonEnumProps` used to depend on `_.contains`, but this led to\n// circular imports. `emulatedSet` is a one-off solution that only works for\n// arrays of strings.\nfunction emulatedSet(keys) {\n  var hash = {};\n  for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;\n  return {\n    contains: function(key) { return hash[key] === true; },\n    push: function(key) {\n      hash[key] = true;\n      return keys.push(key);\n    }\n  };\n}\n\n// Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't\n// be iterated by `for key in ...` and thus missed. Extends `keys` in place if\n// needed.\nfunction collectNonEnumProps(obj, keys) {\n  keys = emulatedSet(keys);\n  var nonEnumIdx = nonEnumerableProps.length;\n  var constructor = obj.constructor;\n  var proto = (isFunction$1(constructor) && constructor.prototype) || ObjProto;\n\n  // Constructor is a special case.\n  var prop = 'constructor';\n  if (has$1(obj, prop) && !keys.contains(prop)) keys.push(prop);\n\n  while (nonEnumIdx--) {\n    prop = nonEnumerableProps[nonEnumIdx];\n    if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {\n      keys.push(prop);\n    }\n  }\n}\n\n// Retrieve the names of an object's own properties.\n// Delegates to **ECMAScript 5**'s native `Object.keys`.\nfunction keys(obj) {\n  if (!isObject(obj)) return [];\n  if (nativeKeys) return nativeKeys(obj);\n  var keys = [];\n  for (var key in obj) if (has$1(obj, key)) keys.push(key);\n  // Ahem, IE < 9.\n  if (hasEnumBug) collectNonEnumProps(obj, keys);\n  return keys;\n}\n\n// Is a given array, string, or object empty?\n// An \"empty\" object has no enumerable own-properties.\nfunction isEmpty(obj) {\n  if (obj == null) return true;\n  // Skip the more expensive `toString`-based type checks if `obj` has no\n  // `.length`.\n  var length = getLength(obj);\n  if (typeof length == 'number' && (\n    isArray(obj) || isString(obj) || isArguments$1(obj)\n  )) return length === 0;\n  return getLength(keys(obj)) === 0;\n}\n\n// Returns whether an object has a given set of `key:value` pairs.\nfunction isMatch(object, attrs) {\n  var _keys = keys(attrs), length = _keys.length;\n  if (object == null) return !length;\n  var obj = Object(object);\n  for (var i = 0; i < length; i++) {\n    var key = _keys[i];\n    if (attrs[key] !== obj[key] || !(key in obj)) return false;\n  }\n  return true;\n}\n\n// If Underscore is called as a function, it returns a wrapped object that can\n// be used OO-style. This wrapper holds altered versions of all functions added\n// through `_.mixin`. Wrapped objects may be chained.\nfunction _$1(obj) {\n  if (obj instanceof _$1) return obj;\n  if (!(this instanceof _$1)) return new _$1(obj);\n  this._wrapped = obj;\n}\n\n_$1.VERSION = VERSION;\n\n// Extracts the result from a wrapped and chained object.\n_$1.prototype.value = function() {\n  return this._wrapped;\n};\n\n// Provide unwrapping proxies for some methods used in engine operations\n// such as arithmetic and JSON stringification.\n_$1.prototype.valueOf = _$1.prototype.toJSON = _$1.prototype.value;\n\n_$1.prototype.toString = function() {\n  return String(this._wrapped);\n};\n\n// Internal function to wrap or shallow-copy an ArrayBuffer,\n// typed array or DataView to a new view, reusing the buffer.\nfunction toBufferView(bufferSource) {\n  return new Uint8Array(\n    bufferSource.buffer || bufferSource,\n    bufferSource.byteOffset || 0,\n    getByteLength(bufferSource)\n  );\n}\n\n// We use this string twice, so give it a name for minification.\nvar tagDataView = '[object DataView]';\n\n// Perform a deep comparison to check if two objects are equal.\nfunction isEqual(a, b) {\n  var todo = [{a: a, b: b}];\n  // Initializing stacks of traversed objects for cycle detection.\n  var aStack = [], bStack = [];\n\n  while (todo.length) {\n    var frame = todo.pop();\n    if (frame === true) {\n      // Remove the first object from the stack of traversed objects.\n      aStack.pop();\n      bStack.pop();\n      continue;\n    }\n    a = frame.a;\n    b = frame.b;\n\n    // Identical objects are equal. `0 === -0`, but they aren't identical.\n    // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).\n    if (a === b) {\n      if (a !== 0 || 1 / a === 1 / b) continue;\n      return false;\n    }\n    // `null` or `undefined` only equal to itself (strict comparison).\n    if (a == null || b == null) return false;\n    // `NaN`s are equivalent, but non-reflexive.\n    if (a !== a) {\n      if (b !== b) continue;\n      return false;\n    }\n    // Exhaust primitive checks\n    var type = typeof a;\n    if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;\n\n// Internal recursive comparison function for `_.isEqual`.\n    // Unwrap any wrapped objects.\n    if (a instanceof _$1) a = a._wrapped;\n    if (b instanceof _$1) b = b._wrapped;\n    // Compare `[[Class]]` names.\n    var className = toString.call(a);\n    if (className !== toString.call(b)) return false;\n    // Work around a bug in IE 10 - Edge 13.\n    if (hasDataViewBug && className == '[object Object]' && isDataView$1(a)) {\n      if (!isDataView$1(b)) return false;\n      className = tagDataView;\n    }\n    switch (className) {\n      // These types are compared by value.\n    case '[object RegExp]':\n      // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')\n    case '[object String]':\n      // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n      // equivalent to `new String(\"5\")`.\n      if ('' + a === '' + b) continue;\n      return false;\n    case '[object Number]':\n      todo.push({a: +a, b: +b});\n      continue;\n    case '[object Date]':\n    case '[object Boolean]':\n      // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n      // millisecond representations. Note that invalid dates with millisecond representations\n      // of `NaN` are not equivalent.\n      if (+a === +b) continue;\n      return false;\n    case '[object Symbol]':\n      if (SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b)) continue;\n      return false;\n    case '[object ArrayBuffer]':\n    case tagDataView:\n      // Coerce to typed array so we can fall through.\n      todo.push({a: toBufferView(a), b: toBufferView(b)});\n      continue;\n    }\n\n    var areArrays = className === '[object Array]';\n    if (!areArrays && isTypedArray$1(a)) {\n      var byteLength = getByteLength(a);\n      if (byteLength !== getByteLength(b)) return false;\n      if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) continue;\n      areArrays = true;\n    }\n    if (!areArrays) {\n      if (typeof a != 'object' || typeof b != 'object') return false;\n\n      // Objects with different constructors are not equivalent, but `Object`s or `Array`s\n      // from different frames are.\n      var aCtor = a.constructor, bCtor = b.constructor;\n      if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor &&\n                               isFunction$1(bCtor) && bCtor instanceof bCtor)\n          && ('constructor' in a && 'constructor' in b)) {\n        return false;\n      }\n    }\n\n    // Assume equality for cyclic structures. The algorithm for detecting cyclic\n    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n\n    var length = aStack.length;\n    while (length--) {\n      // Linear search. Performance is inversely proportional to the number of\n      // unique nested structures.\n      if (aStack[length] === a) {\n        if (bStack[length] === b) break;\n        return false;\n      }\n    }\n    if (length >= 0) continue;\n\n    // Add the first object to the stack of traversed objects.\n    aStack.push(a);\n    bStack.push(b);\n    todo.push(true);\n\n    // Recursively compare objects and arrays.\n    if (areArrays) {\n      // Compare array lengths to determine if a deep comparison is necessary.\n      length = a.length;\n      if (length !== b.length) return false;\n      // Deep compare the contents, ignoring non-numeric properties.\n      while (length--) {\n        todo.push({a: a[length], b: b[length]});\n      }\n    } else {\n      // Deep compare objects.\n      var _keys = keys(a), key;\n      length = _keys.length;\n      // Ensure that both objects contain the same number of properties before comparing deep equality.\n      if (keys(b).length !== length) return false;\n      while (length--) {\n        // Deep compare each member\n        key = _keys[length];\n        if (!has$1(b, key)) return false;\n        todo.push({a: a[key], b: b[key]});\n      }\n    }\n  }\n  return true;\n}\n\n// Retrieve all the enumerable property names of an object.\nfunction allKeys(obj) {\n  if (!isObject(obj)) return [];\n  var keys = [];\n  for (var key in obj) keys.push(key);\n  // Ahem, IE < 9.\n  if (hasEnumBug) collectNonEnumProps(obj, keys);\n  return keys;\n}\n\n// Since the regular `Object.prototype.toString` type tests don't work for\n// some types in IE 11, we use a fingerprinting heuristic instead, based\n// on the methods. It's not great, but it's the best we got.\n// The fingerprint method lists are defined below.\nfunction ie11fingerprint(methods) {\n  var length = getLength(methods);\n  return function(obj) {\n    if (obj == null) return false;\n    // `Map`, `WeakMap` and `Set` have no enumerable keys.\n    var keys = allKeys(obj);\n    if (getLength(keys)) return false;\n    for (var i = 0; i < length; i++) {\n      if (!isFunction$1(obj[methods[i]])) return false;\n    }\n    // If we are testing against `WeakMap`, we need to ensure that\n    // `obj` doesn't have a `forEach` method in order to distinguish\n    // it from a regular `Map`.\n    return methods !== weakMapMethods || !isFunction$1(obj[forEachName]);\n  };\n}\n\n// In the interest of compact minification, we write\n// each string in the fingerprints only once.\nvar forEachName = 'forEach',\n    hasName = 'has',\n    commonInit = ['clear', 'delete'],\n    mapTail = ['get', hasName, 'set'];\n\n// `Map`, `WeakMap` and `Set` each have slightly different\n// combinations of the above sublists.\nvar mapMethods = commonInit.concat(forEachName, mapTail),\n    weakMapMethods = commonInit.concat(mapTail),\n    setMethods = ['add'].concat(commonInit, forEachName, hasName);\n\nvar isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map');\n\nvar isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap');\n\nvar isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set');\n\nvar isWeakSet = tagTester('WeakSet');\n\n// Retrieve the values of an object's properties.\nfunction values(obj) {\n  var _keys = keys(obj);\n  var length = _keys.length;\n  var values = Array(length);\n  for (var i = 0; i < length; i++) {\n    values[i] = obj[_keys[i]];\n  }\n  return values;\n}\n\n// Convert an object into a list of `[key, value]` pairs.\n// The opposite of `_.object` with one argument.\nfunction pairs(obj) {\n  var _keys = keys(obj);\n  var length = _keys.length;\n  var pairs = Array(length);\n  for (var i = 0; i < length; i++) {\n    pairs[i] = [_keys[i], obj[_keys[i]]];\n  }\n  return pairs;\n}\n\n// Invert the keys and values of an object. The values must be serializable.\nfunction invert(obj) {\n  var result = {};\n  var _keys = keys(obj);\n  for (var i = 0, length = _keys.length; i < length; i++) {\n    result[obj[_keys[i]]] = _keys[i];\n  }\n  return result;\n}\n\n// Return a sorted list of the function names available on the object.\nfunction functions(obj) {\n  var names = [];\n  for (var key in obj) {\n    if (isFunction$1(obj[key])) names.push(key);\n  }\n  return names.sort();\n}\n\n// An internal function for creating assigner functions.\nfunction createAssigner(keysFunc, defaults) {\n  return function(obj) {\n    var length = arguments.length;\n    if (defaults) obj = Object(obj);\n    if (length < 2 || obj == null) return obj;\n    for (var index = 1; index < length; index++) {\n      var source = arguments[index],\n          keys = keysFunc(source),\n          l = keys.length;\n      for (var i = 0; i < l; i++) {\n        var key = keys[i];\n        if (!defaults || obj[key] === void 0) obj[key] = source[key];\n      }\n    }\n    return obj;\n  };\n}\n\n// Extend a given object with all the properties in passed-in object(s).\nvar extend = createAssigner(allKeys);\n\n// Assigns a given object with all the own properties in the passed-in\n// object(s).\n// (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)\nvar extendOwn = createAssigner(keys);\n\n// Fill in a given object with default properties.\nvar defaults = createAssigner(allKeys, true);\n\n// Create a naked function reference for surrogate-prototype-swapping.\nfunction ctor() {\n  return function(){};\n}\n\n// An internal function for creating a new object that inherits from another.\nfunction baseCreate(prototype) {\n  if (!isObject(prototype)) return {};\n  if (nativeCreate) return nativeCreate(prototype);\n  var Ctor = ctor();\n  Ctor.prototype = prototype;\n  var result = new Ctor;\n  Ctor.prototype = null;\n  return result;\n}\n\n// Creates an object that inherits from the given prototype object.\n// If additional properties are provided then they will be added to the\n// created object.\nfunction create(prototype, props) {\n  var result = baseCreate(prototype);\n  if (props) extendOwn(result, props);\n  return result;\n}\n\n// Create a (shallow-cloned) duplicate of an object.\nfunction clone(obj) {\n  if (!isObject(obj)) return obj;\n  return isArray(obj) ? obj.slice() : extend({}, obj);\n}\n\n// Invokes `interceptor` with the `obj` and then returns `obj`.\n// The primary purpose of this method is to \"tap into\" a method chain, in\n// order to perform operations on intermediate results within the chain.\nfunction tap(obj, interceptor) {\n  interceptor(obj);\n  return obj;\n}\n\n// Normalize a (deep) property `path` to array.\n// Like `_.iteratee`, this function can be customized.\nfunction toPath$1(path) {\n  return isArray(path) ? path : [path];\n}\n_$1.toPath = toPath$1;\n\n// Internal wrapper for `_.toPath` to enable minification.\n// Similar to `cb` for `_.iteratee`.\nfunction toPath(path) {\n  return _$1.toPath(path);\n}\n\n// Internal function to obtain a nested property in `obj` along `path`.\nfunction deepGet(obj, path) {\n  var length = path.length;\n  for (var i = 0; i < length; i++) {\n    if (obj == null) return void 0;\n    obj = obj[path[i]];\n  }\n  return length ? obj : void 0;\n}\n\n// Get the value of the (deep) property on `path` from `object`.\n// If any property in `path` does not exist or if the value is\n// `undefined`, return `defaultValue` instead.\n// The `path` is normalized through `_.toPath`.\nfunction get(object, path, defaultValue) {\n  var value = deepGet(object, toPath(path));\n  return isUndefined(value) ? defaultValue : value;\n}\n\n// Shortcut function for checking if an object has a given property directly on\n// itself (in other words, not on a prototype). Unlike the internal `has`\n// function, this public version can also traverse nested properties.\nfunction has(obj, path) {\n  path = toPath(path);\n  var length = path.length;\n  for (var i = 0; i < length; i++) {\n    var key = path[i];\n    if (!has$1(obj, key)) return false;\n    obj = obj[key];\n  }\n  return !!length;\n}\n\n// Keep the identity function around for default iteratees.\nfunction identity(value) {\n  return value;\n}\n\n// Returns a predicate for checking whether an object has a given set of\n// `key:value` pairs.\nfunction matcher(attrs) {\n  attrs = extendOwn({}, attrs);\n  return function(obj) {\n    return isMatch(obj, attrs);\n  };\n}\n\n// Creates a function that, when passed an object, will traverse that object’s\n// properties down the given `path`, specified as an array of keys or indices.\nfunction property(path) {\n  path = toPath(path);\n  return function(obj) {\n    return deepGet(obj, path);\n  };\n}\n\n// Internal function that returns an efficient (for current engines) version\n// of the passed-in callback, to be repeatedly applied in other Underscore\n// functions.\nfunction optimizeCb(func, context, argCount) {\n  if (context === void 0) return func;\n  switch (argCount == null ? 3 : argCount) {\n    case 1: return function(value) {\n      return func.call(context, value);\n    };\n    // The 2-argument case is omitted because we’re not using it.\n    case 3: return function(value, index, collection) {\n      return func.call(context, value, index, collection);\n    };\n    case 4: return function(accumulator, value, index, collection) {\n      return func.call(context, accumulator, value, index, collection);\n    };\n  }\n  return function() {\n    return func.apply(context, arguments);\n  };\n}\n\n// An internal function to generate callbacks that can be applied to each\n// element in a collection, returning the desired result — either `_.identity`,\n// an arbitrary callback, a property matcher, or a property accessor.\nfunction baseIteratee(value, context, argCount) {\n  if (value == null) return identity;\n  if (isFunction$1(value)) return optimizeCb(value, context, argCount);\n  if (isObject(value) && !isArray(value)) return matcher(value);\n  return property(value);\n}\n\n// External wrapper for our callback generator. Users may customize\n// `_.iteratee` if they want additional predicate/iteratee shorthand styles.\n// This abstraction hides the internal-only `argCount` argument.\nfunction iteratee(value, context) {\n  return baseIteratee(value, context, Infinity);\n}\n_$1.iteratee = iteratee;\n\n// The function we call internally to generate a callback. It invokes\n// `_.iteratee` if overridden, otherwise `baseIteratee`.\nfunction cb(value, context, argCount) {\n  if (_$1.iteratee !== iteratee) return _$1.iteratee(value, context);\n  return baseIteratee(value, context, argCount);\n}\n\n// Returns the results of applying the `iteratee` to each element of `obj`.\n// In contrast to `_.map` it returns an object.\nfunction mapObject(obj, iteratee, context) {\n  iteratee = cb(iteratee, context);\n  var _keys = keys(obj),\n      length = _keys.length,\n      results = {};\n  for (var index = 0; index < length; index++) {\n    var currentKey = _keys[index];\n    results[currentKey] = iteratee(obj[currentKey], currentKey, obj);\n  }\n  return results;\n}\n\n// Predicate-generating function. Often useful outside of Underscore.\nfunction noop(){}\n\n// Generates a function for a given object that returns a given property.\nfunction propertyOf(obj) {\n  if (obj == null) return noop;\n  return function(path) {\n    return get(obj, path);\n  };\n}\n\n// Run a function **n** times.\nfunction times(n, iteratee, context) {\n  var accum = Array(Math.max(0, n));\n  iteratee = optimizeCb(iteratee, context, 1);\n  for (var i = 0; i < n; i++) accum[i] = iteratee(i);\n  return accum;\n}\n\n// Return a random integer between `min` and `max` (inclusive).\nfunction random(min, max) {\n  if (max == null) {\n    max = min;\n    min = 0;\n  }\n  return min + Math.floor(Math.random() * (max - min + 1));\n}\n\n// A (possibly faster) way to get the current timestamp as an integer.\nvar now = Date.now || function() {\n  return new Date().getTime();\n};\n\n// Internal helper to generate functions for escaping and unescaping strings\n// to/from HTML interpolation.\nfunction createEscaper(map) {\n  var escaper = function(match) {\n    return map[match];\n  };\n  // Regexes for identifying a key that needs to be escaped.\n  var source = '(?:' + keys(map).join('|') + ')';\n  var testRegexp = RegExp(source);\n  var replaceRegexp = RegExp(source, 'g');\n  return function(string) {\n    string = string == null ? '' : '' + string;\n    return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;\n  };\n}\n\n// Internal list of HTML entities for escaping.\nvar escapeMap = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  \"'\": '&#x27;',\n  '`': '&#x60;'\n};\n\n// Function for escaping strings to HTML interpolation.\nvar _escape = createEscaper(escapeMap);\n\n// Internal list of HTML entities for unescaping.\nvar unescapeMap = invert(escapeMap);\n\n// Function for unescaping strings from HTML interpolation.\nvar _unescape = createEscaper(unescapeMap);\n\n// By default, Underscore uses ERB-style template delimiters. Change the\n// following template settings to use alternative delimiters.\nvar templateSettings = _$1.templateSettings = {\n  evaluate: /<%([\\s\\S]+?)%>/g,\n  interpolate: /<%=([\\s\\S]+?)%>/g,\n  escape: /<%-([\\s\\S]+?)%>/g\n};\n\n// When customizing `_.templateSettings`, if you don't want to define an\n// interpolation, evaluation or escaping regex, we need one that is\n// guaranteed not to match.\nvar noMatch = /(.)^/;\n\n// Certain characters need to be escaped so that they can be put into a\n// string literal.\nvar escapes = {\n  \"'\": \"'\",\n  '\\\\': '\\\\',\n  '\\r': 'r',\n  '\\n': 'n',\n  '\\u2028': 'u2028',\n  '\\u2029': 'u2029'\n};\n\nvar escapeRegExp = /\\\\|'|\\r|\\n|\\u2028|\\u2029/g;\n\nfunction escapeChar(match) {\n  return '\\\\' + escapes[match];\n}\n\n// In order to prevent third-party code injection through\n// `_.templateSettings.variable`, we test it against the following regular\n// expression. It is intentionally a bit more liberal than just matching valid\n// identifiers, but still prevents possible loopholes through defaults or\n// destructuring assignment.\nvar bareIdentifier = /^\\s*(\\w|\\$)+\\s*$/;\n\n// JavaScript micro-templating, similar to John Resig's implementation.\n// Underscore templating handles arbitrary delimiters, preserves whitespace,\n// and correctly escapes quotes within interpolated code.\n// NB: `oldSettings` only exists for backwards compatibility.\nfunction template(text, settings, oldSettings) {\n  if (!settings && oldSettings) settings = oldSettings;\n  settings = defaults({}, settings, _$1.templateSettings);\n\n  // Combine delimiters into one regular expression via alternation.\n  var matcher = RegExp([\n    (settings.escape || noMatch).source,\n    (settings.interpolate || noMatch).source,\n    (settings.evaluate || noMatch).source\n  ].join('|') + '|$', 'g');\n\n  // Compile the template source, escaping string literals appropriately.\n  var index = 0;\n  var source = \"__p+='\";\n  text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {\n    source += text.slice(index, offset).replace(escapeRegExp, escapeChar);\n    index = offset + match.length;\n\n    if (escape) {\n      source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n    } else if (interpolate) {\n      source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n    } else if (evaluate) {\n      source += \"';\\n\" + evaluate + \"\\n__p+='\";\n    }\n\n    // Adobe VMs need the match returned to produce the correct offset.\n    return match;\n  });\n  source += \"';\\n\";\n\n  var argument = settings.variable;\n  if (argument) {\n    // Insure against third-party code injection. (CVE-2021-23358)\n    if (!bareIdentifier.test(argument)) throw new Error(\n      'variable is not a bare identifier: ' + argument\n    );\n  } else {\n    // If a variable is not specified, place data values in local scope.\n    source = 'with(obj||{}){\\n' + source + '}\\n';\n    argument = 'obj';\n  }\n\n  source = \"var __t,__p='',__j=Array.prototype.join,\" +\n    \"print=function(){__p+=__j.call(arguments,'');};\\n\" +\n    source + 'return __p;\\n';\n\n  var render;\n  try {\n    render = new Function(argument, '_', source);\n  } catch (e) {\n    e.source = source;\n    throw e;\n  }\n\n  var template = function(data) {\n    return render.call(this, data, _$1);\n  };\n\n  // Provide the compiled source as a convenience for precompilation.\n  template.source = 'function(' + argument + '){\\n' + source + '}';\n\n  return template;\n}\n\n// Traverses the children of `obj` along `path`. If a child is a function, it\n// is invoked with its parent as context. Returns the value of the final\n// child, or `fallback` if any child is undefined.\nfunction result(obj, path, fallback) {\n  path = toPath(path);\n  var length = path.length;\n  if (!length) {\n    return isFunction$1(fallback) ? fallback.call(obj) : fallback;\n  }\n  for (var i = 0; i < length; i++) {\n    var prop = obj == null ? void 0 : obj[path[i]];\n    if (prop === void 0) {\n      prop = fallback;\n      i = length; // Ensure we don't continue iterating.\n    }\n    obj = isFunction$1(prop) ? prop.call(obj) : prop;\n  }\n  return obj;\n}\n\n// Generate a unique integer id (unique within the entire client session).\n// Useful for temporary DOM ids.\nvar idCounter = 0;\nfunction uniqueId(prefix) {\n  var id = ++idCounter + '';\n  return prefix ? prefix + id : id;\n}\n\n// Start chaining a wrapped Underscore object.\nfunction chain(obj) {\n  var instance = _$1(obj);\n  instance._chain = true;\n  return instance;\n}\n\n// Internal function to execute `sourceFunc` bound to `context` with optional\n// `args`. Determines whether to execute a function as a constructor or as a\n// normal function.\nfunction executeBound(sourceFunc, boundFunc, context, callingContext, args) {\n  if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);\n  var self = baseCreate(sourceFunc.prototype);\n  var result = sourceFunc.apply(self, args);\n  if (isObject(result)) return result;\n  return self;\n}\n\n// Partially apply a function by creating a version that has had some of its\n// arguments pre-filled, without changing its dynamic `this` context. `_` acts\n// as a placeholder by default, allowing any combination of arguments to be\n// pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.\nvar partial = restArguments(function(func, boundArgs) {\n  var placeholder = partial.placeholder;\n  var bound = function() {\n    var position = 0, length = boundArgs.length;\n    var args = Array(length);\n    for (var i = 0; i < length; i++) {\n      args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];\n    }\n    while (position < arguments.length) args.push(arguments[position++]);\n    return executeBound(func, bound, this, this, args);\n  };\n  return bound;\n});\n\npartial.placeholder = _$1;\n\n// Create a function bound to a given object (assigning `this`, and arguments,\n// optionally).\nvar bind = restArguments(function(func, context, args) {\n  if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function');\n  var bound = restArguments(function(callArgs) {\n    return executeBound(func, bound, context, this, args.concat(callArgs));\n  });\n  return bound;\n});\n\n// Internal helper for collection methods to determine whether a collection\n// should be iterated as an array or as an object.\n// Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength\n// Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094\nvar isArrayLike = createSizePropertyCheck(getLength);\n\n// Internal implementation of a recursive `flatten` function.\nfunction flatten$1(input, depth, strict) {\n  if (!depth && depth !== 0) depth = Infinity;\n  var output = [], idx = 0, i = 0, length = getLength(input) || 0, stack = [];\n  while (true) {\n    if (i >= length) {\n      if (!stack.length) break;\n      var frame = stack.pop();\n      i = frame.i;\n      input = frame.v;\n      length = getLength(input);\n      continue;\n    }\n    var value = input[i++];\n    if (stack.length >= depth) {\n      output[idx++] = value;\n    } else if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) {\n      // Flatten current level of array or arguments object.\n      stack.push({i: i, v: input});\n      i = 0;\n      input = value;\n      length = getLength(input);\n    } else if (!strict) {\n      output[idx++] = value;\n    }\n  }\n  return output;\n}\n\n// Bind a number of an object's methods to that object. Remaining arguments\n// are the method names to be bound. Useful for ensuring that all callbacks\n// defined on an object belong to it.\nvar bindAll = restArguments(function(obj, keys) {\n  keys = flatten$1(keys, false, false);\n  var index = keys.length;\n  if (index < 1) throw new Error('bindAll must be passed function names');\n  while (index--) {\n    var key = keys[index];\n    obj[key] = bind(obj[key], obj);\n  }\n  return obj;\n});\n\n// Memoize an expensive function by storing its results.\nfunction memoize(func, hasher) {\n  var memoize = function(key) {\n    var cache = memoize.cache;\n    var address = '' + (hasher ? hasher.apply(this, arguments) : key);\n    if (!has$1(cache, address)) cache[address] = func.apply(this, arguments);\n    return cache[address];\n  };\n  memoize.cache = {};\n  return memoize;\n}\n\n// Delays a function for the given number of milliseconds, and then calls\n// it with the arguments supplied.\nvar delay = restArguments(function(func, wait, args) {\n  return setTimeout(function() {\n    return func.apply(null, args);\n  }, wait);\n});\n\n// Defers a function, scheduling it to run after the current call stack has\n// cleared.\nvar defer = partial(delay, _$1, 1);\n\n// Returns a function, that, when invoked, will only be triggered at most once\n// during a given window of time. Normally, the throttled function will run\n// as much as it can, without ever going more than once per `wait` duration;\n// but if you'd like to disable the execution on the leading edge, pass\n// `{leading: false}`. To disable execution on the trailing edge, ditto.\nfunction throttle(func, wait, options) {\n  var timeout, context, args, result;\n  var previous = 0;\n  if (!options) options = {};\n\n  var later = function() {\n    previous = options.leading === false ? 0 : now();\n    timeout = null;\n    result = func.apply(context, args);\n    if (!timeout) context = args = null;\n  };\n\n  var throttled = function() {\n    var _now = now();\n    if (!previous && options.leading === false) previous = _now;\n    var remaining = wait - (_now - previous);\n    context = this;\n    args = arguments;\n    if (remaining <= 0 || remaining > wait) {\n      if (timeout) {\n        clearTimeout(timeout);\n        timeout = null;\n      }\n      previous = _now;\n      result = func.apply(context, args);\n      if (!timeout) context = args = null;\n    } else if (!timeout && options.trailing !== false) {\n      timeout = setTimeout(later, remaining);\n    }\n    return result;\n  };\n\n  throttled.cancel = function() {\n    clearTimeout(timeout);\n    previous = 0;\n    timeout = context = args = null;\n  };\n\n  return throttled;\n}\n\n// When a sequence of calls of the returned function ends, the argument\n// function is triggered. The end of a sequence is defined by the `wait`\n// parameter. If `immediate` is passed, the argument function will be\n// triggered at the beginning of the sequence instead of at the end.\nfunction debounce(func, wait, immediate) {\n  var timeout, previous, args, result, context;\n\n  var later = function() {\n    var passed = now() - previous;\n    if (wait > passed) {\n      timeout = setTimeout(later, wait - passed);\n    } else {\n      timeout = null;\n      if (!immediate) result = func.apply(context, args);\n      // This check is needed because `func` can recursively invoke `debounced`.\n      if (!timeout) args = context = null;\n    }\n  };\n\n  var debounced = restArguments(function(_args) {\n    context = this;\n    args = _args;\n    previous = now();\n    if (!timeout) {\n      timeout = setTimeout(later, wait);\n      if (immediate) result = func.apply(context, args);\n    }\n    return result;\n  });\n\n  debounced.cancel = function() {\n    clearTimeout(timeout);\n    timeout = args = context = null;\n  };\n\n  return debounced;\n}\n\n// Returns the first function passed as an argument to the second,\n// allowing you to adjust arguments, run code before and after, and\n// conditionally execute the original function.\nfunction wrap(func, wrapper) {\n  return partial(wrapper, func);\n}\n\n// Returns a negated version of the passed-in predicate.\nfunction negate(predicate) {\n  return function() {\n    return !predicate.apply(this, arguments);\n  };\n}\n\n// Returns a function that is the composition of a list of functions, each\n// consuming the return value of the function that follows.\nfunction compose() {\n  var args = arguments;\n  var start = args.length - 1;\n  return function() {\n    var i = start;\n    var result = args[start].apply(this, arguments);\n    while (i--) result = args[i].call(this, result);\n    return result;\n  };\n}\n\n// Returns a function that will only be executed on and after the Nth call.\nfunction after(times, func) {\n  return function() {\n    if (--times < 1) {\n      return func.apply(this, arguments);\n    }\n  };\n}\n\n// Returns a function that will only be executed up to (but not including) the\n// Nth call.\nfunction before(times, func) {\n  var memo;\n  return function() {\n    if (--times > 0) {\n      memo = func.apply(this, arguments);\n    }\n    if (times <= 1) func = null;\n    return memo;\n  };\n}\n\n// Returns a function that will be executed at most one time, no matter how\n// often you call it. Useful for lazy initialization.\nvar once = partial(before, 2);\n\n// Returns the first key on an object that passes a truth test.\nfunction findKey(obj, predicate, context) {\n  predicate = cb(predicate, context);\n  var _keys = keys(obj), key;\n  for (var i = 0, length = _keys.length; i < length; i++) {\n    key = _keys[i];\n    if (predicate(obj[key], key, obj)) return key;\n  }\n}\n\n// Internal function to generate `_.findIndex` and `_.findLastIndex`.\nfunction createPredicateIndexFinder(dir) {\n  return function(array, predicate, context) {\n    predicate = cb(predicate, context);\n    var length = getLength(array);\n    var index = dir > 0 ? 0 : length - 1;\n    for (; index >= 0 && index < length; index += dir) {\n      if (predicate(array[index], index, array)) return index;\n    }\n    return -1;\n  };\n}\n\n// Returns the first index on an array-like that passes a truth test.\nvar findIndex = createPredicateIndexFinder(1);\n\n// Returns the last index on an array-like that passes a truth test.\nvar findLastIndex = createPredicateIndexFinder(-1);\n\n// Use a comparator function to figure out the smallest index at which\n// an object should be inserted so as to maintain order. Uses binary search.\nfunction sortedIndex(array, obj, iteratee, context) {\n  iteratee = cb(iteratee, context, 1);\n  var value = iteratee(obj);\n  var low = 0, high = getLength(array);\n  while (low < high) {\n    var mid = Math.floor((low + high) / 2);\n    if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;\n  }\n  return low;\n}\n\n// Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.\nfunction createIndexFinder(dir, predicateFind, sortedIndex) {\n  return function(array, item, idx) {\n    var i = 0, length = getLength(array);\n    if (typeof idx == 'number') {\n      if (dir > 0) {\n        i = idx >= 0 ? idx : Math.max(idx + length, i);\n      } else {\n        length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;\n      }\n    } else if (sortedIndex && idx && length) {\n      idx = sortedIndex(array, item);\n      return array[idx] === item ? idx : -1;\n    }\n    if (item !== item) {\n      idx = predicateFind(slice.call(array, i, length), isNaN$1);\n      return idx >= 0 ? idx + i : -1;\n    }\n    for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {\n      if (array[idx] === item) return idx;\n    }\n    return -1;\n  };\n}\n\n// Return the position of the first occurrence of an item in an array,\n// or -1 if the item is not included in the array.\n// If the array is large and already in sort order, pass `true`\n// for **isSorted** to use binary search.\nvar indexOf = createIndexFinder(1, findIndex, sortedIndex);\n\n// Return the position of the last occurrence of an item in an array,\n// or -1 if the item is not included in the array.\nvar lastIndexOf = createIndexFinder(-1, findLastIndex);\n\n// Return the first value which passes a truth test.\nfunction find(obj, predicate, context) {\n  var keyFinder = isArrayLike(obj) ? findIndex : findKey;\n  var key = keyFinder(obj, predicate, context);\n  if (key !== void 0 && key !== -1) return obj[key];\n}\n\n// Convenience version of a common use case of `_.find`: getting the first\n// object containing specific `key:value` pairs.\nfunction findWhere(obj, attrs) {\n  return find(obj, matcher(attrs));\n}\n\n// The cornerstone for collection functions, an `each`\n// implementation, aka `forEach`.\n// Handles raw objects in addition to array-likes. Treats all\n// sparse array-likes as if they were dense.\nfunction each(obj, iteratee, context) {\n  iteratee = optimizeCb(iteratee, context);\n  var i, length;\n  if (isArrayLike(obj)) {\n    for (i = 0, length = obj.length; i < length; i++) {\n      iteratee(obj[i], i, obj);\n    }\n  } else {\n    var _keys = keys(obj);\n    for (i = 0, length = _keys.length; i < length; i++) {\n      iteratee(obj[_keys[i]], _keys[i], obj);\n    }\n  }\n  return obj;\n}\n\n// Return the results of applying the iteratee to each element.\nfunction map(obj, iteratee, context) {\n  iteratee = cb(iteratee, context);\n  var _keys = !isArrayLike(obj) && keys(obj),\n      length = (_keys || obj).length,\n      results = Array(length);\n  for (var index = 0; index < length; index++) {\n    var currentKey = _keys ? _keys[index] : index;\n    results[index] = iteratee(obj[currentKey], currentKey, obj);\n  }\n  return results;\n}\n\n// Internal helper to create a reducing function, iterating left or right.\nfunction createReduce(dir) {\n  // Wrap code that reassigns argument variables in a separate function than\n  // the one that accesses `arguments.length` to avoid a perf hit. (#1991)\n  var reducer = function(obj, iteratee, memo, initial) {\n    var _keys = !isArrayLike(obj) && keys(obj),\n        length = (_keys || obj).length,\n        index = dir > 0 ? 0 : length - 1;\n    if (!initial) {\n      memo = obj[_keys ? _keys[index] : index];\n      index += dir;\n    }\n    for (; index >= 0 && index < length; index += dir) {\n      var currentKey = _keys ? _keys[index] : index;\n      memo = iteratee(memo, obj[currentKey], currentKey, obj);\n    }\n    return memo;\n  };\n\n  return function(obj, iteratee, memo, context) {\n    var initial = arguments.length >= 3;\n    return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);\n  };\n}\n\n// **Reduce** builds up a single result from a list of values, aka `inject`,\n// or `foldl`.\nvar reduce = createReduce(1);\n\n// The right-associative version of reduce, also known as `foldr`.\nvar reduceRight = createReduce(-1);\n\n// Return all the elements that pass a truth test.\nfunction filter(obj, predicate, context) {\n  var results = [];\n  predicate = cb(predicate, context);\n  each(obj, function(value, index, list) {\n    if (predicate(value, index, list)) results.push(value);\n  });\n  return results;\n}\n\n// Return all the elements for which a truth test fails.\nfunction reject(obj, predicate, context) {\n  return filter(obj, negate(cb(predicate)), context);\n}\n\n// Determine whether all of the elements pass a truth test.\nfunction every(obj, predicate, context) {\n  predicate = cb(predicate, context);\n  var _keys = !isArrayLike(obj) && keys(obj),\n      length = (_keys || obj).length;\n  for (var index = 0; index < length; index++) {\n    var currentKey = _keys ? _keys[index] : index;\n    if (!predicate(obj[currentKey], currentKey, obj)) return false;\n  }\n  return true;\n}\n\n// Determine if at least one element in the object passes a truth test.\nfunction some(obj, predicate, context) {\n  predicate = cb(predicate, context);\n  var _keys = !isArrayLike(obj) && keys(obj),\n      length = (_keys || obj).length;\n  for (var index = 0; index < length; index++) {\n    var currentKey = _keys ? _keys[index] : index;\n    if (predicate(obj[currentKey], currentKey, obj)) return true;\n  }\n  return false;\n}\n\n// Determine if the array or object contains a given item (using `===`).\nfunction contains(obj, item, fromIndex, guard) {\n  if (!isArrayLike(obj)) obj = values(obj);\n  if (typeof fromIndex != 'number' || guard) fromIndex = 0;\n  return indexOf(obj, item, fromIndex) >= 0;\n}\n\n// Invoke a method (with arguments) on every item in a collection.\nvar invoke = restArguments(function(obj, path, args) {\n  var contextPath, func;\n  if (isFunction$1(path)) {\n    func = path;\n  } else {\n    path = toPath(path);\n    contextPath = path.slice(0, -1);\n    path = path[path.length - 1];\n  }\n  return map(obj, function(context) {\n    var method = func;\n    if (!method) {\n      if (contextPath && contextPath.length) {\n        context = deepGet(context, contextPath);\n      }\n      if (context == null) return void 0;\n      method = context[path];\n    }\n    return method == null ? method : method.apply(context, args);\n  });\n});\n\n// Convenience version of a common use case of `_.map`: fetching a property.\nfunction pluck(obj, key) {\n  return map(obj, property(key));\n}\n\n// Convenience version of a common use case of `_.filter`: selecting only\n// objects containing specific `key:value` pairs.\nfunction where(obj, attrs) {\n  return filter(obj, matcher(attrs));\n}\n\n// Return the maximum element (or element-based computation).\nfunction max(obj, iteratee, context) {\n  var result = -Infinity, lastComputed = -Infinity,\n      value, computed;\n  if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) {\n    obj = isArrayLike(obj) ? obj : values(obj);\n    for (var i = 0, length = obj.length; i < length; i++) {\n      value = obj[i];\n      if (value != null && value > result) {\n        result = value;\n      }\n    }\n  } else {\n    iteratee = cb(iteratee, context);\n    each(obj, function(v, index, list) {\n      computed = iteratee(v, index, list);\n      if (computed > lastComputed || (computed === -Infinity && result === -Infinity)) {\n        result = v;\n        lastComputed = computed;\n      }\n    });\n  }\n  return result;\n}\n\n// Return the minimum element (or element-based computation).\nfunction min(obj, iteratee, context) {\n  var result = Infinity, lastComputed = Infinity,\n      value, computed;\n  if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) {\n    obj = isArrayLike(obj) ? obj : values(obj);\n    for (var i = 0, length = obj.length; i < length; i++) {\n      value = obj[i];\n      if (value != null && value < result) {\n        result = value;\n      }\n    }\n  } else {\n    iteratee = cb(iteratee, context);\n    each(obj, function(v, index, list) {\n      computed = iteratee(v, index, list);\n      if (computed < lastComputed || (computed === Infinity && result === Infinity)) {\n        result = v;\n        lastComputed = computed;\n      }\n    });\n  }\n  return result;\n}\n\n// Safely create a real, live array from anything iterable.\nvar reStrSymbol = /[^\\ud800-\\udfff]|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff]/g;\nfunction toArray(obj) {\n  if (!obj) return [];\n  if (isArray(obj)) return slice.call(obj);\n  if (isString(obj)) {\n    // Keep surrogate pair characters together.\n    return obj.match(reStrSymbol);\n  }\n  if (isArrayLike(obj)) return map(obj, identity);\n  return values(obj);\n}\n\n// Sample **n** random values from a collection using the modern version of the\n// [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).\n// If **n** is not specified, returns a single random element.\n// The internal `guard` argument allows it to work with `_.map`.\nfunction sample(obj, n, guard) {\n  if (n == null || guard) {\n    if (!isArrayLike(obj)) obj = values(obj);\n    return obj[random(obj.length - 1)];\n  }\n  var sample = toArray(obj);\n  var length = getLength(sample);\n  n = Math.max(Math.min(n, length), 0);\n  var last = length - 1;\n  for (var index = 0; index < n; index++) {\n    var rand = random(index, last);\n    var temp = sample[index];\n    sample[index] = sample[rand];\n    sample[rand] = temp;\n  }\n  return sample.slice(0, n);\n}\n\n// Shuffle a collection.\nfunction shuffle(obj) {\n  return sample(obj, Infinity);\n}\n\n// Sort the object's values by a criterion produced by an iteratee.\nfunction sortBy(obj, iteratee, context) {\n  var index = 0;\n  iteratee = cb(iteratee, context);\n  return pluck(map(obj, function(value, key, list) {\n    return {\n      value: value,\n      index: index++,\n      criteria: iteratee(value, key, list)\n    };\n  }).sort(function(left, right) {\n    var a = left.criteria;\n    var b = right.criteria;\n    if (a !== b) {\n      if (a > b || a === void 0) return 1;\n      if (a < b || b === void 0) return -1;\n    }\n    return left.index - right.index;\n  }), 'value');\n}\n\n// An internal function used for aggregate \"group by\" operations.\nfunction group(behavior, partition) {\n  return function(obj, iteratee, context) {\n    var result = partition ? [[], []] : {};\n    iteratee = cb(iteratee, context);\n    each(obj, function(value, index) {\n      var key = iteratee(value, index, obj);\n      behavior(result, value, key);\n    });\n    return result;\n  };\n}\n\n// Groups the object's values by a criterion. Pass either a string attribute\n// to group by, or a function that returns the criterion.\nvar groupBy = group(function(result, value, key) {\n  if (has$1(result, key)) result[key].push(value); else result[key] = [value];\n});\n\n// Indexes the object's values by a criterion, similar to `_.groupBy`, but for\n// when you know that your index values will be unique.\nvar indexBy = group(function(result, value, key) {\n  result[key] = value;\n});\n\n// Counts instances of an object that group by a certain criterion. Pass\n// either a string attribute to count by, or a function that returns the\n// criterion.\nvar countBy = group(function(result, value, key) {\n  if (has$1(result, key)) result[key]++; else result[key] = 1;\n});\n\n// Split a collection into two arrays: one whose elements all pass the given\n// truth test, and one whose elements all do not pass the truth test.\nvar partition = group(function(result, value, pass) {\n  result[pass ? 0 : 1].push(value);\n}, true);\n\n// Return the number of elements in a collection.\nfunction size(obj) {\n  if (obj == null) return 0;\n  return isArrayLike(obj) ? obj.length : keys(obj).length;\n}\n\n// Internal `_.pick` helper function to determine whether `key` is an enumerable\n// property name of `obj`.\nfunction keyInObj(value, key, obj) {\n  return key in obj;\n}\n\n// Return a copy of the object only containing the allowed properties.\nvar pick = restArguments(function(obj, keys) {\n  var result = {}, iteratee = keys[0];\n  if (obj == null) return result;\n  if (isFunction$1(iteratee)) {\n    if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);\n    keys = allKeys(obj);\n  } else {\n    iteratee = keyInObj;\n    keys = flatten$1(keys, false, false);\n    obj = Object(obj);\n  }\n  for (var i = 0, length = keys.length; i < length; i++) {\n    var key = keys[i];\n    var value = obj[key];\n    if (iteratee(value, key, obj)) result[key] = value;\n  }\n  return result;\n});\n\n// Return a copy of the object without the disallowed properties.\nvar omit = restArguments(function(obj, keys) {\n  var iteratee = keys[0], context;\n  if (isFunction$1(iteratee)) {\n    iteratee = negate(iteratee);\n    if (keys.length > 1) context = keys[1];\n  } else {\n    keys = map(flatten$1(keys, false, false), String);\n    iteratee = function(value, key) {\n      return !contains(keys, key);\n    };\n  }\n  return pick(obj, iteratee, context);\n});\n\n// Returns everything but the last entry of the array. Especially useful on\n// the arguments object. Passing **n** will return all the values in\n// the array, excluding the last N.\nfunction initial(array, n, guard) {\n  return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));\n}\n\n// Get the first element of an array. Passing **n** will return the first N\n// values in the array. The **guard** check allows it to work with `_.map`.\nfunction first(array, n, guard) {\n  if (array == null || array.length < 1) return n == null || guard ? void 0 : [];\n  if (n == null || guard) return array[0];\n  return initial(array, array.length - n);\n}\n\n// Returns everything but the first entry of the `array`. Especially useful on\n// the `arguments` object. Passing an **n** will return the rest N values in the\n// `array`.\nfunction rest(array, n, guard) {\n  return slice.call(array, n == null || guard ? 1 : n);\n}\n\n// Get the last element of an array. Passing **n** will return the last N\n// values in the array.\nfunction last(array, n, guard) {\n  if (array == null || array.length < 1) return n == null || guard ? void 0 : [];\n  if (n == null || guard) return array[array.length - 1];\n  return rest(array, Math.max(0, array.length - n));\n}\n\n// Trim out all falsy values from an array.\nfunction compact(array) {\n  return filter(array, Boolean);\n}\n\n// Flatten out an array, either recursively (by default), or up to `depth`.\n// Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.\nfunction flatten(array, depth) {\n  return flatten$1(array, depth, false);\n}\n\n// Take the difference between one array and a number of other arrays.\n// Only the elements present in just the first array will remain.\nvar difference = restArguments(function(array, rest) {\n  rest = flatten$1(rest, true, true);\n  return filter(array, function(value){\n    return !contains(rest, value);\n  });\n});\n\n// Return a version of the array that does not contain the specified value(s).\nvar without = restArguments(function(array, otherArrays) {\n  return difference(array, otherArrays);\n});\n\n// Produce a duplicate-free version of the array. If the array has already\n// been sorted, you have the option of using a faster algorithm.\n// The faster algorithm will not work with an iteratee if the iteratee\n// is not a one-to-one function, so providing an iteratee will disable\n// the faster algorithm.\nfunction uniq(array, isSorted, iteratee, context) {\n  if (!isBoolean(isSorted)) {\n    context = iteratee;\n    iteratee = isSorted;\n    isSorted = false;\n  }\n  if (iteratee != null) iteratee = cb(iteratee, context);\n  var result = [];\n  var seen = [];\n  for (var i = 0, length = getLength(array); i < length; i++) {\n    var value = array[i],\n        computed = iteratee ? iteratee(value, i, array) : value;\n    if (isSorted && !iteratee) {\n      if (!i || seen !== computed) result.push(value);\n      seen = computed;\n    } else if (iteratee) {\n      if (!contains(seen, computed)) {\n        seen.push(computed);\n        result.push(value);\n      }\n    } else if (!contains(result, value)) {\n      result.push(value);\n    }\n  }\n  return result;\n}\n\n// Produce an array that contains the union: each distinct element from all of\n// the passed-in arrays.\nvar union = restArguments(function(arrays) {\n  return uniq(flatten$1(arrays, true, true));\n});\n\n// Produce an array that contains every item shared between all the\n// passed-in arrays.\nfunction intersection(array) {\n  var result = [];\n  var argsLength = arguments.length;\n  for (var i = 0, length = getLength(array); i < length; i++) {\n    var item = array[i];\n    if (contains(result, item)) continue;\n    var j;\n    for (j = 1; j < argsLength; j++) {\n      if (!contains(arguments[j], item)) break;\n    }\n    if (j === argsLength) result.push(item);\n  }\n  return result;\n}\n\n// Complement of zip. Unzip accepts an array of arrays and groups\n// each array's elements on shared indices.\nfunction unzip(array) {\n  var length = (array && max(array, getLength).length) || 0;\n  var result = Array(length);\n\n  for (var index = 0; index < length; index++) {\n    result[index] = pluck(array, index);\n  }\n  return result;\n}\n\n// Zip together multiple lists into a single array -- elements that share\n// an index go together.\nvar zip = restArguments(unzip);\n\n// Converts lists into objects. Pass either a single array of `[key, value]`\n// pairs, or two parallel arrays of the same length -- one of keys, and one of\n// the corresponding values. Passing by pairs is the reverse of `_.pairs`.\nfunction object(list, values) {\n  var result = {};\n  for (var i = 0, length = getLength(list); i < length; i++) {\n    if (values) {\n      result[list[i]] = values[i];\n    } else {\n      result[list[i][0]] = list[i][1];\n    }\n  }\n  return result;\n}\n\n// Generate an integer Array containing an arithmetic progression. A port of\n// the native Python `range()` function. See\n// [the Python documentation](https://docs.python.org/library/functions.html#range).\nfunction range(start, stop, step) {\n  if (stop == null) {\n    stop = start || 0;\n    start = 0;\n  }\n  if (!step) {\n    step = stop < start ? -1 : 1;\n  }\n\n  var length = Math.max(Math.ceil((stop - start) / step), 0);\n  var range = Array(length);\n\n  for (var idx = 0; idx < length; idx++, start += step) {\n    range[idx] = start;\n  }\n\n  return range;\n}\n\n// Chunk a single array into multiple arrays, each containing `count` or fewer\n// items.\nfunction chunk(array, count) {\n  if (count == null || count < 1) return [];\n  var result = [];\n  var i = 0, length = array.length;\n  while (i < length) {\n    result.push(slice.call(array, i, i += count));\n  }\n  return result;\n}\n\n// Helper function to continue chaining intermediate results.\nfunction chainResult(instance, obj) {\n  return instance._chain ? _$1(obj).chain() : obj;\n}\n\n// Add your own custom functions to the Underscore object.\nfunction mixin(obj) {\n  each(functions(obj), function(name) {\n    var func = _$1[name] = obj[name];\n    _$1.prototype[name] = function() {\n      var args = [this._wrapped];\n      push.apply(args, arguments);\n      return chainResult(this, func.apply(_$1, args));\n    };\n  });\n  return _$1;\n}\n\n// Add all mutator `Array` functions to the wrapper.\neach(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n  var method = ArrayProto[name];\n  _$1.prototype[name] = function() {\n    var obj = this._wrapped;\n    if (obj != null) {\n      method.apply(obj, arguments);\n      if ((name === 'shift' || name === 'splice') && obj.length === 0) {\n        delete obj[0];\n      }\n    }\n    return chainResult(this, obj);\n  };\n});\n\n// Add all accessor `Array` functions to the wrapper.\neach(['concat', 'join', 'slice'], function(name) {\n  var method = ArrayProto[name];\n  _$1.prototype[name] = function() {\n    var obj = this._wrapped;\n    if (obj != null) obj = method.apply(obj, arguments);\n    return chainResult(this, obj);\n  };\n});\n\n// Named Exports\n\nvar allExports = {\n  __proto__: null,\n  VERSION: VERSION,\n  restArguments: restArguments,\n  isObject: isObject,\n  isNull: isNull,\n  isUndefined: isUndefined,\n  isBoolean: isBoolean,\n  isElement: isElement,\n  isString: isString,\n  isNumber: isNumber,\n  isDate: isDate,\n  isRegExp: isRegExp,\n  isError: isError,\n  isSymbol: isSymbol,\n  isArrayBuffer: isArrayBuffer,\n  isDataView: isDataView$1,\n  isArray: isArray,\n  isFunction: isFunction$1,\n  isArguments: isArguments$1,\n  isFinite: isFinite$1,\n  isNaN: isNaN$1,\n  isTypedArray: isTypedArray$1,\n  isEmpty: isEmpty,\n  isMatch: isMatch,\n  isEqual: isEqual,\n  isMap: isMap,\n  isWeakMap: isWeakMap,\n  isSet: isSet,\n  isWeakSet: isWeakSet,\n  keys: keys,\n  allKeys: allKeys,\n  values: values,\n  pairs: pairs,\n  invert: invert,\n  functions: functions,\n  methods: functions,\n  extend: extend,\n  extendOwn: extendOwn,\n  assign: extendOwn,\n  defaults: defaults,\n  create: create,\n  clone: clone,\n  tap: tap,\n  get: get,\n  has: has,\n  mapObject: mapObject,\n  identity: identity,\n  constant: constant,\n  noop: noop,\n  toPath: toPath$1,\n  property: property,\n  propertyOf: propertyOf,\n  matcher: matcher,\n  matches: matcher,\n  times: times,\n  random: random,\n  now: now,\n  escape: _escape,\n  unescape: _unescape,\n  templateSettings: templateSettings,\n  template: template,\n  result: result,\n  uniqueId: uniqueId,\n  chain: chain,\n  iteratee: iteratee,\n  partial: partial,\n  bind: bind,\n  bindAll: bindAll,\n  memoize: memoize,\n  delay: delay,\n  defer: defer,\n  throttle: throttle,\n  debounce: debounce,\n  wrap: wrap,\n  negate: negate,\n  compose: compose,\n  after: after,\n  before: before,\n  once: once,\n  findKey: findKey,\n  findIndex: findIndex,\n  findLastIndex: findLastIndex,\n  sortedIndex: sortedIndex,\n  indexOf: indexOf,\n  lastIndexOf: lastIndexOf,\n  find: find,\n  detect: find,\n  findWhere: findWhere,\n  each: each,\n  forEach: each,\n  map: map,\n  collect: map,\n  reduce: reduce,\n  foldl: reduce,\n  inject: reduce,\n  reduceRight: reduceRight,\n  foldr: reduceRight,\n  filter: filter,\n  select: filter,\n  reject: reject,\n  every: every,\n  all: every,\n  some: some,\n  any: some,\n  contains: contains,\n  includes: contains,\n  include: contains,\n  invoke: invoke,\n  pluck: pluck,\n  where: where,\n  max: max,\n  min: min,\n  shuffle: shuffle,\n  sample: sample,\n  sortBy: sortBy,\n  groupBy: groupBy,\n  indexBy: indexBy,\n  countBy: countBy,\n  partition: partition,\n  toArray: toArray,\n  size: size,\n  pick: pick,\n  omit: omit,\n  first: first,\n  head: first,\n  take: first,\n  initial: initial,\n  last: last,\n  rest: rest,\n  tail: rest,\n  drop: rest,\n  compact: compact,\n  flatten: flatten,\n  without: without,\n  uniq: uniq,\n  unique: uniq,\n  union: union,\n  intersection: intersection,\n  difference: difference,\n  unzip: unzip,\n  transpose: unzip,\n  zip: zip,\n  object: object,\n  range: range,\n  chunk: chunk,\n  mixin: mixin,\n  'default': _$1\n};\n\n// Default Export\n\n// Add all of the Underscore functions to the wrapper object.\nvar _ = mixin(allExports);\n// Legacy Node.js API.\n_._ = _;\n\nexports.VERSION = VERSION;\nexports._ = _;\nexports._escape = _escape;\nexports._unescape = _unescape;\nexports.after = after;\nexports.allKeys = allKeys;\nexports.before = before;\nexports.bind = bind;\nexports.bindAll = bindAll;\nexports.chain = chain;\nexports.chunk = chunk;\nexports.clone = clone;\nexports.compact = compact;\nexports.compose = compose;\nexports.constant = constant;\nexports.contains = contains;\nexports.countBy = countBy;\nexports.create = create;\nexports.debounce = debounce;\nexports.defaults = defaults;\nexports.defer = defer;\nexports.delay = delay;\nexports.difference = difference;\nexports.each = each;\nexports.every = every;\nexports.extend = extend;\nexports.extendOwn = extendOwn;\nexports.filter = filter;\nexports.find = find;\nexports.findIndex = findIndex;\nexports.findKey = findKey;\nexports.findLastIndex = findLastIndex;\nexports.findWhere = findWhere;\nexports.first = first;\nexports.flatten = flatten;\nexports.functions = functions;\nexports.get = get;\nexports.groupBy = groupBy;\nexports.has = has;\nexports.identity = identity;\nexports.indexBy = indexBy;\nexports.indexOf = indexOf;\nexports.initial = initial;\nexports.intersection = intersection;\nexports.invert = invert;\nexports.invoke = invoke;\nexports.isArguments = isArguments$1;\nexports.isArray = isArray;\nexports.isArrayBuffer = isArrayBuffer;\nexports.isBoolean = isBoolean;\nexports.isDataView = isDataView$1;\nexports.isDate = isDate;\nexports.isElement = isElement;\nexports.isEmpty = isEmpty;\nexports.isEqual = isEqual;\nexports.isError = isError;\nexports.isFinite = isFinite$1;\nexports.isFunction = isFunction$1;\nexports.isMap = isMap;\nexports.isMatch = isMatch;\nexports.isNaN = isNaN$1;\nexports.isNull = isNull;\nexports.isNumber = isNumber;\nexports.isObject = isObject;\nexports.isRegExp = isRegExp;\nexports.isSet = isSet;\nexports.isString = isString;\nexports.isSymbol = isSymbol;\nexports.isTypedArray = isTypedArray$1;\nexports.isUndefined = isUndefined;\nexports.isWeakMap = isWeakMap;\nexports.isWeakSet = isWeakSet;\nexports.iteratee = iteratee;\nexports.keys = keys;\nexports.last = last;\nexports.lastIndexOf = lastIndexOf;\nexports.map = map;\nexports.mapObject = mapObject;\nexports.matcher = matcher;\nexports.max = max;\nexports.memoize = memoize;\nexports.min = min;\nexports.mixin = mixin;\nexports.negate = negate;\nexports.noop = noop;\nexports.now = now;\nexports.object = object;\nexports.omit = omit;\nexports.once = once;\nexports.pairs = pairs;\nexports.partial = partial;\nexports.partition = partition;\nexports.pick = pick;\nexports.pluck = pluck;\nexports.property = property;\nexports.propertyOf = propertyOf;\nexports.random = random;\nexports.range = range;\nexports.reduce = reduce;\nexports.reduceRight = reduceRight;\nexports.reject = reject;\nexports.rest = rest;\nexports.restArguments = restArguments;\nexports.result = result;\nexports.sample = sample;\nexports.shuffle = shuffle;\nexports.size = size;\nexports.some = some;\nexports.sortBy = sortBy;\nexports.sortedIndex = sortedIndex;\nexports.tap = tap;\nexports.template = template;\nexports.templateSettings = templateSettings;\nexports.throttle = throttle;\nexports.times = times;\nexports.toArray = toArray;\nexports.toPath = toPath$1;\nexports.union = union;\nexports.uniq = uniq;\nexports.uniqueId = uniqueId;\nexports.unzip = unzip;\nexports.values = values;\nexports.where = where;\nexports.without = without;\nexports.wrap = wrap;\nexports.zip = zip;\n//# sourceMappingURL=underscore-node-f.cjs.map\n","//     Underscore.js 1.13.8\n//     https://underscorejs.org\n//     (c) 2009-2026 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors\n//     Underscore may be freely distributed under the MIT license.\n\nvar underscoreNodeF = require('./underscore-node-f.cjs');\n\n\n\nmodule.exports = underscoreNodeF._;\n//# sourceMappingURL=underscore-node.cjs.map\n","// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n        if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n            Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n        }\n    }\n};","__webpack_require__.g = (() => {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import $ from './jquery';\nimport globalize from './internal/globalize';\nimport keyCodes from './key-code';\nimport { getTrigger } from './trigger';\n\n(function initSelectors() {\n    /*\n    :tabbable and :focusable functions from jQuery UI v 1.10.4\n    renamed to :aui-tabbable and :aui-focusable to not clash with jquery-ui if it's included.\n    */\n\n    function visible(element) {\n        return $.css(element, 'visibility') === 'visible' && $(element).is(':visible');\n    }\n\n    function focusable(element, isTabIndexNotNaN) {\n        var nodeName = element.nodeName.toLowerCase();\n\n        if (nodeName === 'aui-select') {\n            return true;\n        }\n\n        if (nodeName === 'area') {\n            var map = element.parentNode;\n            var mapName = map.name;\n            var imageMap = $('img[usemap=#' + mapName + ']').get();\n\n            if (!element.href || !mapName || map.nodeName.toLowerCase() !== 'map') {\n                return false;\n            }\n            return imageMap && visible(imageMap);\n        }\n        var isFormElement = /input|select|textarea|button|object|iframe/.test(nodeName);\n        var isAnchor = nodeName === 'a';\n        var isAnchorTabbable = element.href || isTabIndexNotNaN;\n\n        return (\n            (isFormElement ? !element.disabled : isAnchor ? isAnchorTabbable : isTabIndexNotNaN) &&\n            visible(element)\n        );\n    }\n\n    function tabbable(element) {\n        var tabIndex = $.attr(element, 'tabindex');\n        var isTabIndexNaN = isNaN(tabIndex);\n        var hasTabIndex = isTabIndexNaN || tabIndex >= 0;\n\n        return hasTabIndex && focusable(element, !isTabIndexNaN);\n    }\n\n    $.extend($.expr.pseudos, {\n        'aui-focusable': (element) => focusable(element, !isNaN($.attr(element, 'tabindex'))),\n        'aui-tabbable': tabbable,\n    });\n})();\n\nvar RESTORE_FOCUS_DATA_KEY = '_aui-focus-restore';\n\n/**\n * Stores information about last focused element in el.data\n *\n * @param {HTMLElement} $el - element to store the data about focus\n * @param {Element} [lastFocussedEl=document.activeElement] - last focused element\n */\nfunction setLastFocus($el, lastFocussedEl = document.activeElement) {\n    $el.data(RESTORE_FOCUS_DATA_KEY, lastFocussedEl);\n}\n\nfunction getLastFocus($el) {\n    return $($el.data(RESTORE_FOCUS_DATA_KEY));\n}\n\nfunction elementTrapsFocus($el) {\n    return $el.is('.aui-dialog2') || $el.is('[aui-focus-trap=\"true\"]');\n}\n\nfunction FocusManager() {\n    this._focusTrapStack = [];\n    this._handler;\n}\nFocusManager.defaultFocusSelector = ':aui-tabbable';\n/**\n *\n * @param {HTMLElement} $el - element to move the focus onto\n * @param {Element} [$lastFocused] - last focused element\n */\nFocusManager.prototype.enter = function ($el, $lastFocused) {\n    setLastFocus($el, $lastFocused);\n\n    // focus on new selector\n    if ($el.attr('data-aui-focus') !== 'false') {\n        var focusSelector =\n            $el.attr('data-aui-focus-selector') || FocusManager.defaultFocusSelector;\n        var $focusEl = $el.is(focusSelector) ? $el : $el.find(focusSelector);\n        $focusEl.first().trigger('focus');\n    }\n\n    if (elementTrapsFocus($el)) {\n        this._focusTrapStack.push($el);\n        if (!this._handler) {\n            this._handler = focusTrapHandler.bind(undefined, this._focusTrapStack);\n            $(document).on('keydown.aui-focus-manager', this._handler);\n        }\n    }\n};\n\nFocusManager.prototype.exit = function ($el) {\n    if (elementTrapsFocus($el)) {\n        this._focusTrapStack.splice(this._focusTrapStack.indexOf($el), 1);\n        if (!this._focusTrapStack.length) {\n            $(document).off('.aui-focus-manager', this._handler);\n            delete this._handler;\n        }\n    }\n\n    // AUI-1059: remove focus from the active element when dialog is hidden\n    // AUI-5014 - if focus is already outside focus trap there is no need to restore it\n    var activeElement = document.activeElement;\n    if ($el[0] === activeElement || $el.has(activeElement).length) {\n        activeElement.blur();\n        var $restoreFocus = getLastFocus($el);\n        if ($restoreFocus.length) {\n            $el.removeData(RESTORE_FOCUS_DATA_KEY);\n            $restoreFocus.trigger('focus');\n        }\n    }\n};\n\nfunction findIndexOfNextTabbableElement(originElement, startingIndex, offset, $tabbableElements) {\n    function advance(index) {\n        return (index + offset) % $tabbableElements.length;\n    }\n\n    let nextIndex = advance(startingIndex);\n\n    if (originElement.type === 'radio' && originElement.name) {\n        // Advance to the element that's not another radio button of the same group.\n        while (\n            $tabbableElements.eq(nextIndex).attr('name') === originElement.name &&\n            // Stop at the start if we've wrapped around the whole list and everything is the same radio\n            // group.\n            nextIndex !== startingIndex\n        ) {\n            nextIndex = advance(nextIndex);\n        }\n    }\n\n    // Emulate the browser's behavior: jump to the selected radio of a group, or if none is selected, the\n    // first or last depending on the direction. Note: we assume the markup is sensible and doesn't\n    // interleave groups of radio buttons. Supporting that would complicate the code for a non-recommended\n    // use case.\n    if (nextIndex !== startingIndex && $tabbableElements.eq(nextIndex).attr('type') === 'radio') {\n        const name = $tabbableElements.eq(nextIndex).attr('name');\n        const $radiosOfGroup = $tabbableElements.filter(function () {\n            return this.type === 'radio' && this.name === name;\n        });\n        const $checkedElement = $radiosOfGroup.filter(':checked');\n\n        let $elementToFocus;\n        if ($checkedElement.length > 0) {\n            $elementToFocus = $checkedElement.first();\n        } else {\n            if (offset > 0) {\n                $elementToFocus = $radiosOfGroup.first();\n            } else {\n                $elementToFocus = $radiosOfGroup.last();\n            }\n        }\n        nextIndex = $tabbableElements.index($elementToFocus);\n    }\n    return nextIndex;\n}\n\nfunction focusTrapHandler(focusTrapStack, event) {\n    if (focusTrapStack.length === 0) {\n        return;\n    }\n\n    if (event.keyCode !== keyCodes.TAB) {\n        return;\n    }\n\n    const backwards = event.shiftKey;\n    const offset = backwards ? -1 : 1;\n\n    /**\n     * always the element where focus is about to be blurred\n     * @type {HTMLElement}\n     */\n    const focusOrigin = event.target;\n\n    const $focusTrapElement = focusTrapStack[focusTrapStack.length - 1];\n    const $tabbableElements = $focusTrapElement.find(':aui-tabbable');\n\n    // Try to focus the container if:\n    //  - it is with aui-focus-trap=true attribute\n    //  - there isn't any focusable element inside.\n    if (!$tabbableElements.length && elementTrapsFocus($focusTrapElement)) {\n        $focusTrapElement.trigger('focus');\n        event.preventDefault();\n    }\n\n    // it's not possible to trap focus inside something with no focusable elements!\n    if (!$tabbableElements.length) {\n        return;\n    }\n\n    const originIdx = $tabbableElements.index(focusOrigin);\n    let newFocusIdx = -1;\n\n    if (originIdx > -1) {\n        // the currently focussed element is inside our trap container.\n        // excellent! we'll work with this.\n        newFocusIdx = originIdx;\n    } else {\n        // the currently focussed element was outside our trap container.\n        // it might be okay to leave it there, though, since AUI has a few layer elements\n        // and the focussed element might be in one of those.\n        // let's see if the focus was in an element that AUI roughly \"controls\".\n        let $controlledElementWithFocus;\n\n        // look for a layer in the \"cheapest\" way possible first -- check if a parent is a layer.\n        $controlledElementWithFocus = $(focusOrigin).closest('.aui-layer');\n\n        if (!$controlledElementWithFocus.length) {\n            // look up the controlled layers in a different way -- by finding all controllers first,\n            // then their layers.\n            const $controllingElements = $focusTrapElement.find('[aria-controls]');\n            const $controlledElements = $controllingElements.map(function () {\n                return document.getElementById(this.getAttribute('aria-controls'));\n            });\n\n            // Find out whether the new focus target is inside a controlled element or not.\n            $controlledElementWithFocus = $controlledElements.has(focusOrigin);\n        }\n\n        if ($controlledElementWithFocus.length) {\n            // Find out whether we need to jump the focus out of the controlled element.\n            const $subTabbable = $controlledElementWithFocus.find(':aui-tabbable');\n            const subOriginIdx = $subTabbable.index(focusOrigin);\n            const subMove = subOriginIdx + offset;\n            if (subMove < 0 || subMove >= $subTabbable.length) {\n                // This element was on the edge of the list, so we'll pop focus out.\n                // We'll assume we can pop the focus to a controlled element.\n                const triggerEl = getTrigger($controlledElementWithFocus.get(0));\n                newFocusIdx = $tabbableElements.index(triggerEl);\n            } else {\n                // Focus will happen normally. Let it happen.\n                return;\n            }\n        }\n    }\n\n    if (newFocusIdx > -1) {\n        // wrap around the focus trap.\n        newFocusIdx = findIndexOfNextTabbableElement(\n            focusOrigin,\n            newFocusIdx,\n            offset,\n            $tabbableElements\n        );\n    } else {\n        // we will focus the first element in the trap.\n        newFocusIdx = 0;\n    }\n\n    if ($tabbableElements.get(newFocusIdx).nodeName !== 'IFRAME') {\n        $tabbableElements.eq(newFocusIdx).trigger('focus');\n        event.preventDefault();\n    }\n}\n\n// AUI-4403 - Previous maintainers pretended multiple FocusManager instances made sense.\n// However, the class is implemented in a way that would never play well with others,\n// so here I'm locking it down as a singleton.\nlet instance;\nfunction getFocusManager() {\n    if (!instance) {\n        instance = new FocusManager();\n    }\n    return instance;\n}\ngetFocusManager.global = getFocusManager();\n\nglobalize('FocusManager', getFocusManager);\n\nexport default getFocusManager;\n","import $ from './jquery';\nimport { createPopper } from '@popperjs/core';\nimport DOMPurify from 'dompurify';\n\nconst AUI_TOOLTIP_CLASS_NAME = 'aui-tooltip';\nconst AUI_TOOLTIP_ID = 'aui-tooltip';\nconst AUI_TOOLTIP_TIMEOUT = 300;\n\n/**\n * The purpose of this map is to make it possible to use old Tipsy tooltip positions\n * with Popper.\n *\n * @enum\n * @name GravityOptions\n * @type {{n: string, ne: string, e: string, se: string, s: string, sw: string, w: string, nw: string}}\n */\nconst GRAVITY_MAP = {\n    n: 'bottom',\n    ne: 'bottom-end',\n    e: 'left',\n    se: 'top-end',\n    s: 'top',\n    sw: 'top-start',\n    w: 'right',\n    nw: 'bottom-start',\n};\n\n// This key is used to differentiate events related to this particular plugin.\nconst pluginKey = 'aui-tooltip';\n\nconst defaultOptions = {\n    gravity: 'n',\n    html: false,\n    live: false,\n    enabled: true,\n    suppress: () => false,\n    aria: true,\n    sanitize: true,\n    maxWidth: 200,\n};\n\nlet $sharedTip;\n\nconst getTipNode = () => {\n    return $sharedTip && $sharedTip.get(0);\n};\n\nconst toggleTooltipVisibility = (shouldBeHidden = false) => {\n    const tipNode = getTipNode();\n    if (tipNode) {\n        tipNode.classList.toggle('hidden', shouldBeHidden);\n        tipNode.setAttribute('aria-hidden', shouldBeHidden);\n    }\n};\n\nclass Tooltip {\n    constructor(triggerElement, options) {\n        this.triggerElement = triggerElement;\n        this.$triggerElement = $(this.triggerElement);\n        this.options = { ...defaultOptions, ...options };\n        this.enabled = this.options.enabled;\n        this.moveTitleToTooltip();\n        this.initContainer();\n        this.observeTriggerRemoval();\n    }\n\n    destroy() {\n        this.unbindHandlers();\n        this.hide();\n        this.restoreOriginalAttributes();\n\n        tooltipsByDomNode.delete(this.triggerElement);\n    }\n\n    moveTitleToTooltip() {\n        const tooltip = this;\n        const $triggerElement = this.$triggerElement;\n\n        $triggerElement.attr('title', function (_, originalTitle) {\n            tooltip.originalTitle = originalTitle;\n            if (tooltip.options.aria) {\n                $triggerElement.attr('aria-describedby', AUI_TOOLTIP_ID);\n            }\n            return null;\n        });\n    }\n\n    restoreOriginalAttributes() {\n        const $triggerElement = this.$triggerElement;\n\n        if (this.originalTitle) {\n            $triggerElement.attr('title', this.originalTitle);\n        }\n\n        if ($triggerElement.attr('aria-describedby') === AUI_TOOLTIP_ID) {\n            $triggerElement.removeAttr('aria-describedby');\n        }\n    }\n\n    observeTriggerRemoval() {\n        const observedElements = [];\n\n        if (this.options.$delegationRoot && this.options.$delegationRoot.get(0)) {\n            observedElements.push(this.options.$delegationRoot.get(0));\n        }\n\n        if (this.triggerElement) {\n            observedElements.push(this.triggerElement);\n        }\n\n        this.triggerObservers = observedElements\n            .map((element) => {\n                const parent = element.parentElement;\n                if (parent) {\n                    const observer = new MutationObserver(() => {\n                        const isToDestroy = !parent.contains(element);\n                        if (isToDestroy) {\n                            this.destroy();\n                        }\n                    });\n                    observer.observe(parent, {\n                        childList: true,\n                        subtree: false, // We take trigger parent, so we only care about direct children\n                    });\n                    return observer;\n                }\n            })\n            .filter((observer) => !!observer);\n    }\n\n    unbindHandlers() {\n        const selector = this.options.live;\n\n        // Keep in mind that unbinding handlers from one tooltip\n        // managed by delegation will unbind handlers for the whole\n        // collection.\n        if (this.options.$delegationRoot && selector) {\n            this.options.$delegationRoot.off(`.${pluginKey}`, selector);\n            return;\n        }\n\n        if (this.triggerObservers.length > 0) {\n            this.triggerObservers.forEach((observer) => observer.disconnect());\n        }\n\n        // We only need to unbind event handlers from this particular element\n        this.$triggerElement.off(`.${pluginKey}`);\n    }\n\n    initContainer() {\n        if ($sharedTip === undefined || ($sharedTip.get(0) && !$sharedTip.get(0).isConnected)) {\n            $sharedTip = $(\n                `<div id=\"${AUI_TOOLTIP_ID}\" class=\"${AUI_TOOLTIP_CLASS_NAME} hidden\" role=\"tooltip\" aria-hidden=\"true\"><p class=\"aui-tooltip-content\"></p></div>`\n            );\n            $(document.body).append($sharedTip);\n        }\n    }\n\n    buildTip(title) {\n        const options = this.options;\n        const tooltipContentElement = $sharedTip.find('.aui-tooltip-content');\n\n        if (options.html) {\n            if (options.sanitize) {\n                title = DOMPurify.sanitize(title);\n            }\n            tooltipContentElement.html(title);\n        } else {\n            tooltipContentElement.text(title);\n        }\n\n        if (options.maxWidth) {\n            tooltipContentElement.css('max-width', options.maxWidth + 'px');\n        }\n\n        return $sharedTip;\n    }\n\n    getTipTitle() {\n        const options = this.options;\n\n        let title =\n            typeof options.title === 'function'\n                ? options.title\n                : typeof options.title === 'string'\n                  ? () => options.title\n                  : () => this.originalTitle || '';\n\n        let actualTitle = title.call(this.triggerElement);\n        return !actualTitle || !actualTitle.trim().length ? undefined : actualTitle;\n    }\n\n    show() {\n        const tipTitle = this.getTipTitle();\n        if (this.enabled === false || !tipTitle) {\n            return;\n        }\n\n        // In order to avoid flickering of the tooltip when we have the same content we need to skip hiding.\n        const isNewTooltip = $sharedTip && tipTitle !== $sharedTip.text();\n        if (isNewTooltip) {\n            this.hide();\n        }\n\n        const triggerElement = this.triggerElement;\n        const placement = GRAVITY_MAP[this.options.gravity];\n\n        if (typeof this.options.suppress === 'function') {\n            if (this.options.suppress.call(triggerElement) === true) {\n                return;\n            }\n        }\n\n        const tipNode = this.buildTip(tipTitle).get(0);\n\n        this.showTooltip();\n\n        this.popperInstance = createPopper(triggerElement, tipNode, {\n            placement,\n            modifiers: [\n                {\n                    name: 'offset',\n                    options: {\n                        offset: [0, 4],\n                    },\n                },\n            ],\n        });\n\n        $(window).on(`scroll.${pluginKey}`, () => this.hide());\n    }\n\n    hide() {\n        this.hideTooltip();\n\n        if (this.popperInstance) {\n            this.popperInstance.destroy();\n            delete this.popperInstance;\n        }\n\n        $(window).off(`scroll.${pluginKey}`);\n    }\n\n    showTooltip() {\n        toggleTooltipVisibility(false);\n    }\n\n    hideTooltip() {\n        toggleTooltipVisibility(true);\n    }\n\n    enable() {\n        this.enabled = true;\n    }\n\n    disable() {\n        this.hide();\n        this.enabled = false;\n    }\n}\n\nconst tooltipsByDomNode = new WeakMap();\n\nconst getTooltipInstance = (domNode, options) => {\n    // Options will be ignored if there is an existing tooltip instance\n    // assigned to given DOM node. To override it you need to first destroy\n    // the old tooltip.\n    let tooltip = tooltipsByDomNode.get(domNode);\n    if (tooltip === undefined) {\n        tooltip = new Tooltip(domNode, options);\n        if (typeof domNode === 'object') {\n            tooltipsByDomNode.set(domNode, tooltip);\n        }\n    }\n    return tooltip;\n};\n\nconst namespacify = (events) => events.map((event) => `${event}.${pluginKey}`).join(' ');\n\nconst activationEvents = namespacify(['mouseenter', 'focus']);\nconst deactivationEvents = namespacify(['click', 'mouseleave', 'blur']);\nlet showTimeoutId;\nlet hideTimeoutId;\n\n$.fn.tooltip = function (arg) {\n    // We have an actual jQuery collection available under `this`\n    const $collection = this;\n\n    // Get the tooltip instance assigned to the first element in the collection\n    if (arg === true) {\n        const firstDomNode = $collection.get(0);\n        return getTooltipInstance(firstDomNode);\n    }\n\n    // Call the particular method from the first tooltip instance\n    if (typeof arg === 'string') {\n        const tooltip = $collection.tooltip(true);\n        const commandName = arg;\n\n        if (typeof tooltip[commandName] !== 'function') {\n            throw new Error(`Method ${commandName} does not exist on tooltip.`);\n        }\n\n        tooltip[commandName]();\n\n        return $collection;\n    }\n\n    const options = arg || {};\n\n    const clearAllTimers = function () {\n        clearTimeout(hideTimeoutId);\n        clearTimeout(showTimeoutId);\n    };\n\n    const updateTooltipEvents = function () {\n        $sharedTip.off(`mouseenter.${pluginKey}`);\n        $sharedTip.off(`mouseleave.${pluginKey}`);\n\n        $sharedTip.on(`mouseenter.${pluginKey}`, () => {\n            clearAllTimers();\n        });\n        $sharedTip.on(`mouseleave.${pluginKey}`, () => {\n            clearAllTimers();\n            hide();\n        });\n    };\n\n    const show = function () {\n        // Stop all events that were triggered by different tooltip\n        clearAllTimers();\n\n        const tooltip = getTooltipInstance(this, options);\n        showTimeoutId = setTimeout(() => {\n            clearAllTimers();\n            tooltip.show();\n            $sharedTip && updateTooltipEvents();\n        }, AUI_TOOLTIP_TIMEOUT);\n    };\n\n    const hide = function () {\n        // Stop all events that were triggered by different tooltip\n        clearAllTimers();\n\n        const tooltip = getTooltipInstance(this, options);\n        hideTimeoutId = setTimeout(() => {\n            tooltip.hide();\n        }, AUI_TOOLTIP_TIMEOUT);\n    };\n\n    const hideOnEsc = function (e) {\n        if (e.code === 'Escape') {\n            hide();\n        }\n    };\n\n    const selector = options.live;\n    if (selector !== undefined) {\n        // We store it so that it's possible to kill the whole delegation later\n        options.$delegationRoot = $collection;\n\n        $collection.on(activationEvents, selector, show);\n        $collection.on(deactivationEvents, selector, hide);\n        $collection.on('keyup', selector, hideOnEsc);\n    } else {\n        $collection.on(activationEvents, show);\n        $collection.on(deactivationEvents, hide);\n        $collection.on('keyup', hideOnEsc);\n    }\n\n    return $collection;\n};\n\nexport default $;\n","import globalize from './globalize';\n\ntype ArbitraryFunction = () => unknown;\n\ntype SelectorMap = {\n    selector: string;\n    options?: DeprecationOptions;\n};\n\n/**\n * Purely to reflect the existing state of the code, not ideal.\n */\nexport type DeprecationOptions = {\n    /**\n     * the version this has been deprecated since\n     */\n    sinceVersion?: string;\n    /**\n     * the version this will be removed in\n     */\n    removeInVersion?: string;\n    /**\n     * the name of an alternative to use\n     */\n    alternativeName?: string;\n    /**\n     * extra information to be printed at the end of the deprecation log\n     */\n    extraInfo?: string;\n    /**\n     * an extra object that will be printed at the end\n     */\n    extraObject?: object | string;\n    /**\n     * a human-readable name to show in the deprecation message. If not provided, it is inferred from the function or object being deprecated.\n     */\n    displayName?: string;\n    /**\n     * type of the deprecation to append to the start of the deprecation message. e.g. JS or CSS\n     */\n    deprecationType?: string;\n};\n\n// eslint-disable-next-line @typescript-eslint/unbound-method -- Leaving behaviour identical for now\nconst has = Object.prototype.hasOwnProperty;\nconst deprecationCalls: (string | string[])[] = [];\n\nfunction toSentenceCase(name: string): string {\n    if (!name) {\n        return '';\n    }\n    name = '' + name; // eslint-disable-line @typescript-eslint/no-unnecessary-type-conversion\n\n    return name.charAt(0).toUpperCase() + name.substring(1);\n}\n\nfunction getDeprecatedLocation(printFrameOffset: number) {\n    const error = new Error();\n\n    let stacktraceString: string | undefined =\n        error.stack ??\n        // @ts-expect-error -- preserving the legacy, not sure what .stacktrace would exist on, guessing the type\n        (error.stacktrace as string | undefined);\n    stacktraceString = stacktraceString?.replace(/^Error\\n/, '') ?? '';\n\n    const stacktrace = stacktraceString.split('\\n');\n    return stacktrace[printFrameOffset + 2];\n}\n\nfunction logger(...args: unknown[]): void {\n    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- JS test DOM environments\n    if (typeof console !== 'undefined' && console.warn) {\n        Function.prototype.apply.call(console.warn, console, args);\n    }\n}\n\n/**\n * Return a function that logs a deprecation warning to the console the first time it is called from a certain location.\n * It will also print the stack frame of the calling function.\n *\n * @param {string} displayName the name of the thing being deprecated\n * @param {DeprecationOptions} options\n * @return {Function} that logs the warning and stack frame of the calling function. Takes in an optional parameter for the offset of\n * the stack frame to print, the default is 0. For example, 0 will log it for the line of the calling function,\n * -1 will print the location the logger was called from\n */\nconst getShowDeprecationMessagePublic = (\n    displayName: string,\n    options: DeprecationOptions\n): ArbitraryFunction => {\n    return getShowDeprecationMessageInternal(displayName, options);\n};\n\n/**\n * Return a function that logs a deprecation warning to the console the first time it is called from a certain location.\n * It will also print the stack frame of the calling function.\n *\n * @param {string | symbol | number | Function} displayName the name of the thing being deprecated\n * @param {DeprecationOptions} [options]\n * @return {Function} that logs the warning and stack frame of the calling function. Takes in an optional parameter for the offset of\n * the stack frame to print, the default is 0. For example, 0 will log it for the line of the calling function,\n * -1 will print the location the logger was called from\n */\nfunction getShowDeprecationMessageInternal(\n    displayName: string | ArbitraryFunction,\n    options?: DeprecationOptions\n): ArbitraryFunction {\n    // This can be used internally to pas in a showmessage fn\n    if (typeof displayName === 'function') {\n        return displayName;\n    }\n\n    let called = false;\n    options = options ?? {};\n\n    return function (printFrameOffset?: number): void {\n        let deprecatedLocation = getDeprecatedLocation(printFrameOffset ?? 1) ?? '';\n        // Only log once if the stack frame doesn't exist to avoid spamming the console/test output\n        if (!called || !deprecationCalls.includes(deprecatedLocation)) {\n            deprecationCalls.push(deprecatedLocation);\n\n            called = true;\n\n            const deprecationType = options.deprecationType ?? '';\n\n            let message =\n                'DEPRECATED ' +\n                deprecationType +\n                '- ' +\n                toSentenceCase(displayName) +\n                ' has been deprecated' +\n                (options.sinceVersion ? ' since ' + options.sinceVersion : '') +\n                ' and will be removed in ' +\n                (options.removeInVersion ?? 'a future release') +\n                '.';\n\n            if (options.alternativeName) {\n                message += ' Use ' + options.alternativeName + ' instead. ';\n            }\n\n            if (options.extraInfo) {\n                message += ' ' + options.extraInfo;\n            }\n\n            if (deprecatedLocation === '') {\n                deprecatedLocation =\n                    ' \\n ' +\n                    'No stack trace of the deprecated usage is available in your current browser.';\n            } else {\n                deprecatedLocation = ' \\n ' + deprecatedLocation;\n            }\n\n            if (options.extraObject) {\n                message += '\\n';\n                logger(message, options.extraObject, deprecatedLocation);\n            } else {\n                logger(message, deprecatedLocation);\n            }\n        }\n    };\n}\n\nfunction logCssDeprecation(selectorMap: SelectorMap, newNode: Node) {\n    let displayName = selectorMap.options?.displayName;\n    displayName = displayName ? ' (' + displayName + ')' : '';\n\n    const options: DeprecationOptions = Object.assign(\n        {\n            deprecationType: 'CSS',\n            extraObject: newNode,\n        },\n        selectorMap.options\n    );\n\n    getShowDeprecationMessageInternal(\n        \"'\" + selectorMap.selector + \"' pattern\" + displayName,\n        options\n    )();\n}\n\n/**\n * Returns a wrapped version of the function that logs a deprecation warning when the function is used.\n * @param {Function} fn the fn to wrap\n * @param {string} displayName the name of the fn to be displayed in the message\n * @param {DeprecationOptions} options\n * @return {Function} wrapping the original function\n */\nfunction deprecateFunctionExpression(\n    fn: ArbitraryFunction,\n    displayName: string,\n    options: DeprecationOptions\n): ArbitraryFunction {\n    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Just in case someone outside AUI is using it\n    options = options ?? {};\n    options.deprecationType = options.deprecationType ?? 'JS';\n\n    const showDeprecationMessage = getShowDeprecationMessageInternal(\n        displayName || fn.name || 'this function',\n        options\n    );\n    return function (...args: unknown[]) {\n        showDeprecationMessage();\n        // @ts-expect-error Sorry TS, don't want to change this behaviour just yet in case of side effects\n        return fn.apply(this, args);\n    };\n}\n\n/**\n * Returns a wrapped version of the constructor that logs a deprecation warning when the constructor is instantiated.\n * @param {Function} constructorFn the constructor function to wrap\n * @param {string} displayName the name of the fn to be displayed in the message\n * @param {DeprecationOptions} options\n * @return {Function} wrapping the original function\n */\nfunction deprecateConstructor(\n    constructorFn: ArbitraryFunction,\n    displayName: string,\n    options: DeprecationOptions\n): ArbitraryFunction {\n    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Just in case someone outside AUI is using it\n    options = options ?? {};\n    options.deprecationType = options.deprecationType ?? 'JS';\n\n    const deprecatedConstructor = deprecateFunctionExpression(constructorFn, displayName, options);\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n    deprecatedConstructor.prototype = constructorFn.prototype;\n    Object.assign(deprecatedConstructor, constructorFn); //copy static methods across;\n\n    return deprecatedConstructor;\n}\n\n/**\n * Wraps a \"value\" object property in a deprecation warning in browsers supporting Object.defineProperty\n * @param {Object} obj the object containing the property\n * @param {string} prop the name of the property to deprecate\n * @param {DeprecationOptions} [options]\n */\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- This is easier to read\nfunction deprecateValueProperty<T extends object, K extends keyof T & string>(\n    obj: T,\n    prop: K,\n    options?: DeprecationOptions\n) {\n    let oldVal = obj[prop];\n    options = options ?? {};\n    options.deprecationType = options.deprecationType ?? 'JS';\n\n    const displayNameOrShowMessageFn = options.displayName ?? prop;\n    const showDeprecationMessage = getShowDeprecationMessageInternal(\n        displayNameOrShowMessageFn,\n        options\n    );\n    Object.defineProperty(obj, prop, {\n        get: function (): T[K] {\n            showDeprecationMessage();\n            return oldVal;\n        },\n        set: function (val: T[K]): T[K] {\n            oldVal = val;\n            showDeprecationMessage();\n            return val;\n        },\n    });\n}\n\n/**\n * Wraps an object property in a deprecation warning, if possible. functions will always log warnings, but other\n * types of properties will only log in browsers supporting Object.defineProperty\n * @param {Object} object the object containing the property\n * @param {string} propertyKey the name of the property to deprecate\n * @param {DeprecationOptions} options\n */\nfunction deprecateObjectProperty<T extends object>(\n    object: T,\n    propertyKey: string & keyof T,\n    options: DeprecationOptions\n) {\n    if (typeof object[propertyKey] === 'function') {\n        // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Just in case someone outside AUI is using it\n        options = options ?? {};\n        options.deprecationType = options.deprecationType ?? 'JS';\n\n        const displayNameOrShowMessageFn = options.displayName ?? propertyKey;\n        // @ts-expect-error -- Maybe a TypeScript wizard can figure out something\n        // better than me so TS is happy. We only care it's a function.\n        object[propertyKey] = deprecateFunctionExpression(\n            object[propertyKey] as ArbitraryFunction,\n            displayNameOrShowMessageFn,\n            options\n        );\n    } else {\n        deprecateValueProperty(object, propertyKey, options);\n    }\n}\n\ntype DeprecationOptionsWithAltNamePrefix = DeprecationOptions & {\n    /**\n     * a prefix for the alternative property name. Used to generate alternativeName per property.\n     */\n    alternativeNamePrefix?: string;\n};\n\n/**\n * Wraps all an objects properties in a deprecation warning, if possible. functions will always log warnings, but other\n * types of properties will only log in browsers supporting Object.defineProperty\n * @param {Object} obj the object to be wrapped\n * @param {string} objDisplayPrefix the object's prefix to be used in logs\n * @param {DeprecationOptionsWithAltNamePrefix} options\n */\nfunction deprecateAllProperties(\n    obj: object,\n    objDisplayPrefix: string,\n    options: DeprecationOptionsWithAltNamePrefix\n) {\n    // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Just in case someone outside AUI is using it\n    options = options ?? {};\n    for (const attr in obj) {\n        if (has.call(obj, attr)) {\n            options.deprecationType = options.deprecationType ?? 'JS';\n            options.displayName = objDisplayPrefix + attr;\n            options.alternativeName =\n                options.alternativeNamePrefix && options.alternativeNamePrefix + attr;\n            deprecateObjectProperty(\n                obj,\n                // @ts-expect-error -- We're very safely checking this is actually an attribute on the object\n                attr,\n                Object.assign({}, options)\n            );\n        }\n    }\n}\n\nfunction matchesSelector(node: Node, selector: string) {\n    if (node instanceof Element) {\n        return node.matches(selector);\n    }\n    return false;\n}\n\nfunction handleAddingSelector(options?: DeprecationOptions) {\n    return function (selector: string) {\n        const selectorMap: SelectorMap = {\n            selector: selector,\n            options: options,\n        };\n\n        // Search if matches have already been added\n        const matches = document.querySelectorAll(selector);\n        for (const match of matches) {\n            logCssDeprecation(selectorMap, match);\n        }\n\n        observeFutureChange(selectorMap);\n    };\n}\n\n/**\n * Return a function that logs a deprecation warning to the console the first time it is called from a certain location.\n * It will also print the stack frame of the calling function.\n */\nfunction deprecateCSS(selectors: string | string[], options?: DeprecationOptions): void {\n    if (typeof selectors === 'string') {\n        selectors = [selectors];\n    }\n\n    selectors.forEach(handleAddingSelector(options));\n}\n\nfunction testAndHandleDeprecation(newNode: Node) {\n    return function (selectorMap: SelectorMap) {\n        if (matchesSelector(newNode, selectorMap.selector)) {\n            logCssDeprecation(selectorMap, newNode);\n        }\n    };\n}\n\nconst deprecatedSelectorMap: SelectorMap[] = [];\nlet observer: MutationObserver | undefined = undefined;\n\nfunction observeFutureChange(selectorMap: SelectorMap) {\n    deprecatedSelectorMap.push(selectorMap);\n\n    // Lazily instantiate a mutation observer because they're expensive.\n    if (observer === undefined) {\n        observer = new MutationObserver(function (mutations) {\n            mutations.forEach(function (mutation) {\n                // TODO - should this also look at class changes, if possible?\n                const addedNodes = mutation.addedNodes;\n\n                for (const newNode of addedNodes) {\n                    if (newNode.nodeType === 1) {\n                        deprecatedSelectorMap.forEach(testAndHandleDeprecation(newNode));\n                    }\n                }\n            });\n        });\n\n        const config = {\n            childList: true,\n            subtree: true,\n        };\n\n        observer.observe(document, config);\n    }\n}\n\nglobalize('deprecate', {\n    fn: deprecateFunctionExpression,\n    construct: deprecateConstructor,\n    css: deprecateCSS,\n    prop: deprecateObjectProperty,\n    obj: deprecateAllProperties,\n    getMessageLogger: getShowDeprecationMessagePublic,\n});\n\nexport {\n    deprecateFunctionExpression as fn,\n    deprecateConstructor as construct,\n    deprecateCSS as css,\n    deprecateObjectProperty as prop,\n    deprecateAllProperties as obj,\n    getShowDeprecationMessagePublic as getMessageLogger,\n};\n","import $ from './jquery';\nimport amdify from './internal/amdify';\nimport skate from './internal/skate';\nimport './spinner';\nimport { getMessageLogger } from './internal/deprecation';\n\nconst CLASS_NOTIFICATION_INITIALISED = '_aui-form-notification-initialised';\n\nconst ARIA_INFO_ATTRIBUTE = 'aria-describedby';\nconst ARIA_DESCRIPTION_POSTFIX = 'description';\nconst ARIA_ERROR_POSTFIX = 'errors';\n\nconst ATTRIBUTE_NOTIFICATION_PREFIX = 'data-aui-notification-';\nconst ATTRIBUTE_NOTIFICATION_WAIT = ATTRIBUTE_NOTIFICATION_PREFIX + 'wait';\nconst ATTRIBUTE_NOTIFICATION_INFO = ATTRIBUTE_NOTIFICATION_PREFIX + 'info';\nconst ATTRIBUTE_NOTIFICATION_ERROR = ATTRIBUTE_NOTIFICATION_PREFIX + 'error';\nconst ATTRIBUTE_NOTIFICATION_SUCCESS = ATTRIBUTE_NOTIFICATION_PREFIX + 'success';\n\nconst NOTIFICATION_PRIORITY = [\n    ATTRIBUTE_NOTIFICATION_ERROR,\n    ATTRIBUTE_NOTIFICATION_SUCCESS,\n    ATTRIBUTE_NOTIFICATION_WAIT,\n    ATTRIBUTE_NOTIFICATION_INFO,\n];\n\nfunction initialiseNotification($field) {\n    if (!isFieldInitialised($field)) {\n        prepareFieldMarkup($field);\n        synchroniseNotificationDisplay($field);\n    }\n}\n\nfunction isFieldInitialised($field) {\n    return $field.hasClass(CLASS_NOTIFICATION_INITIALISED);\n}\n\nfunction prepareFieldMarkup($field) {\n    $field.addClass(CLASS_NOTIFICATION_INITIALISED);\n    appendDescription($field);\n}\n\nfunction appendDescription($field, message) {\n    message = message ? message : getNotificationMessage($field);\n\n    if (getFieldNotificationType($field) === ATTRIBUTE_NOTIFICATION_INFO) {\n        const existingDescription = $field.parent().find('.description');\n\n        if (!existingDescription.length) {\n            $field.after(descriptionTemplate($field, message));\n        }\n    }\n\n    updateAriaInfo($field);\n}\n\nfunction getNotificationMessage($field) {\n    var notificationType = getFieldNotificationType($field);\n    var message = notificationType ? $field.attr(notificationType) : '';\n    return message === '' ? message : jsonToArray(message);\n}\n\nfunction jsonToArray(jsonOrString) {\n    var jsonArray;\n    try {\n        jsonArray = JSON.parse(jsonOrString);\n        // eslint-disable-next-line no-unused-vars\n    } catch (exception) {\n        jsonArray = [jsonOrString];\n    }\n    return jsonArray;\n}\n\nfunction getFieldNotificationType($field) {\n    let fieldNotificationType;\n    NOTIFICATION_PRIORITY.some(function (prioritisedNotification) {\n        if ($field.is('[' + prioritisedNotification + ']')) {\n            fieldNotificationType = prioritisedNotification;\n            return true;\n        }\n    });\n\n    return fieldNotificationType;\n}\n\nfunction synchroniseNotificationDisplay(field) {\n    const $field = $(field);\n\n    if (!isFieldInitialised($field)) {\n        return;\n    }\n    const type = getFieldNotificationType($field);\n    const showSpinner = type === ATTRIBUTE_NOTIFICATION_WAIT;\n\n    setFieldSpinner($field, showSpinner);\n\n    const message = getNotificationMessage($field);\n    if (message && type === ATTRIBUTE_NOTIFICATION_ERROR) {\n        appendErrorMessages($field, message);\n        return;\n    }\n\n    // the first call of this method is executed on init with jQuery wrapped object\n    // subsequent ones are the ones we care about and those are executed with DOM objects\n    if (!isJqueryObject(field) && !field.hasAttribute(ATTRIBUTE_NOTIFICATION_ERROR)) {\n        $field.parent().find('.error').remove();\n    }\n}\n\nfunction updateAriaInfo($field) {\n    const labels = [];\n    const id = $field.attr('id') || $field.attr('name');\n    const type = getFieldNotificationType($field);\n    const message = getNotificationMessage($field);\n\n    if (message && type === ATTRIBUTE_NOTIFICATION_ERROR) {\n        labels.push(`${id}-${ARIA_ERROR_POSTFIX}`);\n    }\n\n    if (getMessageContainer($field, 'description').length) {\n        labels.push(`${id}-${ARIA_DESCRIPTION_POSTFIX}`);\n    }\n\n    const $ariaTarget = conditionallyGetFieldTarget($field);\n\n    $ariaTarget.attr(ARIA_INFO_ATTRIBUTE, !!labels.length ? labels.join(' ') : null);\n}\n\n/**\n * During the process of improving A11Y in the project,\n * we discovered that for some form elements we need to\n * make a shift of the target where aria-* attributes\n * are to be applied.\n *\n * This function contains the mapping and returns\n * the desired target, if it was found.\n *\n * If not - the same $field is returned back.\n */\nfunction conditionallyGetFieldTarget($field) {\n    const modifiers = {\n        'aui-select': 'input[type=\"text\"][role=\"combobox\"]',\n    };\n\n    for (let [source, selector] of Object.entries(modifiers)) {\n        if ($field.is(source)) {\n            const $target = $field.find(selector);\n\n            if ($target.length) {\n                return $target;\n            }\n        }\n    }\n\n    return $field;\n}\n\nfunction isJqueryObject(el) {\n    return el.constructor.prototype.hasOwnProperty('jquery');\n}\n\nfunction errorMessageTemplate($field, messages) {\n    const id = $field.attr('id') || $field.attr('name');\n    const list = messages\n        .map(\n            (message) =>\n                `<li><span class=\"aui-icon aui-icon-small aui-iconfont-error aui-icon-notification\"></span>${message}</li>`\n        )\n        .join('');\n\n    return `<div class=\"error\" role=\"alert\" id=\"${id}-${ARIA_ERROR_POSTFIX}\"><ul>${list}</ul></div>`;\n}\n\nfunction descriptionTemplate($field, messages) {\n    const id = $field.attr('id') || $field.attr('name');\n\n    if (messages.length > 1) {\n        let list = messages.map((message) => `<li>${message}</li>`).join('');\n        return `<div class=\"description\" id=\"${id}-${ARIA_DESCRIPTION_POSTFIX}\"><ul>${list}</ul></div>`;\n    }\n    return `<div class=\"description\" id=\"${id}-${ARIA_DESCRIPTION_POSTFIX}\">${messages}</div>`;\n}\n\nfunction appendErrorMessages($field, messages) {\n    let previousErrors = getMessageContainer($field, 'error');\n    if (previousErrors.length > 0) {\n        previousErrors.remove();\n    }\n    $field.after(errorMessageTemplate($field, messages));\n    updateAriaInfo($field);\n}\n\nfunction getMessageContainer($field, type) {\n    return $field.parent().find(`.${type}`);\n}\n\nfunction isSpinnerForFieldAlreadyExisting($field) {\n    return $field.next('aui-spinner').length > 0;\n}\n\nfunction setFieldSpinner($field, isSpinnerVisible) {\n    if (isSpinnerVisible && !isSpinnerForFieldAlreadyExisting($field)) {\n        $field.after('<aui-spinner class=\"form-notification-spinner\" size=\"small\"></aui-spinner>');\n    } else {\n        $field.parent().find('aui-spinner').remove();\n    }\n}\n\nconst deprecationLogger = getMessageLogger('data-aui-notification-field attribute', {\n    deprecationType: 'ATTRIBUTE',\n    alternativeName: 'HTML markup',\n});\n\nskate('data-aui-notification-field', {\n    attached: function (element) {\n        deprecationLogger();\n        initialiseNotification($(element));\n    },\n    attributes: (function () {\n        const attrs = {};\n        NOTIFICATION_PRIORITY.forEach(function (type) {\n            attrs[type] = synchroniseNotificationDisplay;\n        });\n        return attrs;\n    })(),\n    type: skate.type.ATTRIBUTE,\n});\n\namdify('aui/form-notification');\n\nexport {\n    getMessageContainer,\n    appendErrorMessages,\n    appendDescription,\n    updateAriaInfo,\n    errorMessageTemplate,\n    setFieldSpinner,\n};\n","/*! @license DOMPurify 3.4.13 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.13/LICENSE */\n\nfunction _arrayLikeToArray(r, a) {\n  (null == a || a > r.length) && (a = r.length);\n  for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n  return n;\n}\nfunction _arrayWithHoles(r) {\n  if (Array.isArray(r)) return r;\n}\nfunction _iterableToArrayLimit(r, l) {\n  var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n  if (null != t) {\n    var e,\n      n,\n      i,\n      u,\n      a = [],\n      f = true,\n      o = false;\n    try {\n      if (i = (t = t.call(r)).next, 0 === l) ; else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n    } catch (r) {\n      o = true, n = r;\n    } finally {\n      try {\n        if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;\n      } finally {\n        if (o) throw n;\n      }\n    }\n    return a;\n  }\n}\nfunction _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _slicedToArray(r, e) {\n  return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();\n}\nfunction _unsupportedIterableToArray(r, a) {\n  if (r) {\n    if (\"string\" == typeof r) return _arrayLikeToArray(r, a);\n    var t = {}.toString.call(r).slice(8, -1);\n    return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;\n  }\n}\n\nconst entries = Object.entries,\n  setPrototypeOf = Object.setPrototypeOf,\n  isFrozen = Object.isFrozen,\n  getPrototypeOf = Object.getPrototypeOf,\n  getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nlet freeze = Object.freeze,\n  seal = Object.seal,\n  create = Object.create; // eslint-disable-line import/no-mutable-exports\nlet _ref = typeof Reflect !== 'undefined' && Reflect,\n  apply = _ref.apply,\n  construct = _ref.construct;\nif (!freeze) {\n  freeze = function freeze(x) {\n    return x;\n  };\n}\nif (!seal) {\n  seal = function seal(x) {\n    return x;\n  };\n}\nif (!apply) {\n  apply = function apply(func, thisArg) {\n    for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n      args[_key - 2] = arguments[_key];\n    }\n    return func.apply(thisArg, args);\n  };\n}\nif (!construct) {\n  construct = function construct(Func) {\n    for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n      args[_key2 - 1] = arguments[_key2];\n    }\n    return new Func(...args);\n  };\n}\nconst arrayForEach = unapply(Array.prototype.forEach);\nconst arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nconst arraySplice = unapply(Array.prototype.splice);\nconst arrayIsArray = Array.isArray;\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\nconst numberToString = unapply(Number.prototype.toString);\nconst booleanToString = unapply(Boolean.prototype.toString);\nconst bigintToString = typeof BigInt === 'undefined' ? null : unapply(BigInt.prototype.toString);\nconst symbolToString = typeof Symbol === 'undefined' ? null : unapply(Symbol.prototype.toString);\nconst objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\nconst objectToString = unapply(Object.prototype.toString);\nconst regExpTest = unapply(RegExp.prototype.test);\nconst typeErrorCreate = unconstruct(TypeError);\n/**\n * Creates a new function that calls the given function with a specified thisArg and arguments.\n *\n * @param func - The function to be wrapped and called.\n * @returns A new function that calls the given function with a specified thisArg and arguments.\n */\nfunction unapply(func) {\n  return function (thisArg) {\n    if (thisArg instanceof RegExp) {\n      thisArg.lastIndex = 0;\n    }\n    for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n      args[_key3 - 1] = arguments[_key3];\n    }\n    return apply(func, thisArg, args);\n  };\n}\n/**\n * Creates a new function that constructs an instance of the given constructor function with the provided arguments.\n *\n * @param func - The constructor function to be wrapped and called.\n * @returns A new function that constructs an instance of the given constructor function with the provided arguments.\n */\nfunction unconstruct(Func) {\n  return function () {\n    for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n      args[_key4] = arguments[_key4];\n    }\n    return construct(Func, args);\n  };\n}\n/**\n * Add properties to a lookup table\n *\n * @param set - The set to which elements will be added.\n * @param array - The array containing elements to be added to the set.\n * @param transformCaseFunc - An optional function to transform the case of each element before adding to the set.\n * @returns The modified set with added elements.\n */\nfunction addToSet(set, array) {\n  let transformCaseFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringToLowerCase;\n  if (setPrototypeOf) {\n    // Make 'in' and truthy checks like Boolean(set.constructor)\n    // independent of any properties defined on Object.prototype.\n    // Prevent prototype setters from intercepting set as a this value.\n    setPrototypeOf(set, null);\n  }\n  if (!arrayIsArray(array)) {\n    return set;\n  }\n  let l = array.length;\n  while (l--) {\n    let element = array[l];\n    if (typeof element === 'string') {\n      const lcElement = transformCaseFunc(element);\n      if (lcElement !== element) {\n        // Config presets (e.g. tags.js, attrs.js) are immutable.\n        if (!isFrozen(array)) {\n          array[l] = lcElement;\n        }\n        element = lcElement;\n      }\n    }\n    set[element] = true;\n  }\n  return set;\n}\n/**\n * Clean up an array to harden against CSPP\n *\n * @param array - The array to be cleaned.\n * @returns The cleaned version of the array\n */\nfunction cleanArray(array) {\n  for (let index = 0; index < array.length; index++) {\n    const isPropertyExist = objectHasOwnProperty(array, index);\n    if (!isPropertyExist) {\n      array[index] = null;\n    }\n  }\n  return array;\n}\n/**\n * Shallow clone an object\n *\n * @param object - The object to be cloned.\n * @returns A new object that copies the original.\n */\nfunction clone(object) {\n  const newObject = create(null);\n  for (const _ref2 of entries(object)) {\n    var _ref3 = _slicedToArray(_ref2, 2);\n    const property = _ref3[0];\n    const value = _ref3[1];\n    const isPropertyExist = objectHasOwnProperty(object, property);\n    if (isPropertyExist) {\n      if (arrayIsArray(value)) {\n        newObject[property] = cleanArray(value);\n      } else if (value && typeof value === 'object' && value.constructor === Object) {\n        newObject[property] = clone(value);\n      } else {\n        newObject[property] = value;\n      }\n    }\n  }\n  return newObject;\n}\n/**\n * Convert non-node values into strings without depending on direct property access.\n *\n * @param value - The value to stringify.\n * @returns A string representation of the provided value.\n */\nfunction stringifyValue(value) {\n  switch (typeof value) {\n    case 'string':\n      {\n        return value;\n      }\n    case 'number':\n      {\n        return numberToString(value);\n      }\n    case 'boolean':\n      {\n        return booleanToString(value);\n      }\n    case 'bigint':\n      {\n        return bigintToString ? bigintToString(value) : '0';\n      }\n    case 'symbol':\n      {\n        return symbolToString ? symbolToString(value) : 'Symbol()';\n      }\n    case 'undefined':\n      {\n        return objectToString(value);\n      }\n    case 'function':\n    case 'object':\n      {\n        if (value === null) {\n          return objectToString(value);\n        }\n        const valueAsRecord = value;\n        const valueToString = lookupGetter(valueAsRecord, 'toString');\n        if (typeof valueToString === 'function') {\n          const stringified = valueToString(valueAsRecord);\n          return typeof stringified === 'string' ? stringified : objectToString(stringified);\n        }\n        return objectToString(value);\n      }\n    default:\n      {\n        return objectToString(value);\n      }\n  }\n}\n/**\n * This method automatically checks if the prop is function or getter and behaves accordingly.\n *\n * @param object - The object to look up the getter function in its prototype chain.\n * @param prop - The property name for which to find the getter function.\n * @returns The getter function found in the prototype chain or a fallback function.\n */\nfunction lookupGetter(object, prop) {\n  while (object !== null) {\n    const desc = getOwnPropertyDescriptor(object, prop);\n    if (desc) {\n      if (desc.get) {\n        return unapply(desc.get);\n      }\n      if (typeof desc.value === 'function') {\n        return unapply(desc.value);\n      }\n    }\n    object = getPrototypeOf(object);\n  }\n  function fallbackValue() {\n    return null;\n  }\n  return fallbackValue;\n}\nfunction isRegex(value) {\n  try {\n    regExpTest(value, '');\n    return true;\n  } catch (_unused) {\n    return false;\n  }\n}\n\nconst html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'search', 'section', 'select', 'shadow', 'slot', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);\nconst svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'enterkeyhint', 'exportparts', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'inputmode', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'part', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);\nconst svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']);\n// List of SVG elements that are disallowed by default.\n// We still need to know them so that we can do namespace\n// checks properly in case one wants to add them to\n// allow-list.\nconst svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']);\nconst mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'mprescripts']);\n// Similarly to SVG, we want to know all MathML elements,\n// even those that we disallow by default.\nconst mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\nconst text = freeze(['#text']);\n\nconst html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'command', 'commandfor', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'exportparts', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inert', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'part', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'slot', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns']);\nconst svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'amplitude', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dominant-baseline', 'dur', 'edgemode', 'elevation', 'end', 'exponent', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'intercept', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'mask-type', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'slope', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'tablevalues', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-orientation', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);\nconst mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnalign', 'columnlines', 'columnspacing', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lquote', 'lspace', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);\nconst xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\n\nconst MUSTACHE_EXPR = seal(/{{[\\w\\W]*|^[\\w\\W]*}}/g);\nconst ERB_EXPR = seal(/<%[\\w\\W]*|^[\\w\\W]*%>/g);\nconst TMPLIT_EXPR = seal(/\\${[\\w\\W]*/g);\nconst DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/); // eslint-disable-line no-useless-escape\nconst ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\nconst IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n);\nconst IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nconst ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n);\nconst DOCTYPE_NAME = seal(/^html$/i);\nconst CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n// Markup-significant character probes used by _sanitizeElements.\n// Shared module-level instances are safe despite the sticky /g flags:\n// unapply() resets lastIndex for RegExp receivers before every call.\nconst ELEMENT_MARKUP_PROBE = seal(/<[/\\w!]/g);\nconst COMMENT_MARKUP_PROBE = seal(/<[/\\w]/g);\nconst FALLBACK_TAG_CLOSE = seal(/<\\/no(script|embed|frames)/i);\nconst SELF_CLOSING_TAG = seal(/\\/>/i);\n\n// https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst NODE_TYPE = {\n  element: 1,\n  attribute: 2,\n  text: 3,\n  cdataSection: 4,\n  entityReference: 5,\n  // Deprecated\n  entityNode: 6,\n  // Deprecated\n  processingInstruction: 7,\n  comment: 8,\n  document: 9,\n  documentType: 10,\n  documentFragment: 11,\n  notation: 12 // Deprecated\n};\nconst getGlobal = function getGlobal() {\n  return typeof window === 'undefined' ? null : window;\n};\n/**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param trustedTypes The policy factory.\n * @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\n * @return The policy created (or null, if Trusted Types\n * are not supported or creating the policy failed).\n */\nconst _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) {\n  if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n    return null;\n  }\n  // Allow the callers to control the unique policy name\n  // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n  // Policy creation with duplicate names throws in Trusted Types.\n  let suffix = null;\n  const ATTR_NAME = 'data-tt-policy-suffix';\n  if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {\n    suffix = purifyHostElement.getAttribute(ATTR_NAME);\n  }\n  const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n  try {\n    return trustedTypes.createPolicy(policyName, {\n      createHTML(html) {\n        return html;\n      },\n      createScriptURL(scriptUrl) {\n        return scriptUrl;\n      }\n    });\n  } catch (_) {\n    // Policy creation failed (most likely another DOMPurify script has\n    // already run). Skip creating the policy, as this will only cause errors\n    // if TT are enforced.\n    console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n    return null;\n  }\n};\nconst _createHooksMap = function _createHooksMap() {\n  return {\n    afterSanitizeAttributes: [],\n    afterSanitizeElements: [],\n    afterSanitizeShadowDOM: [],\n    beforeSanitizeAttributes: [],\n    beforeSanitizeElements: [],\n    beforeSanitizeShadowDOM: [],\n    uponSanitizeAttribute: [],\n    uponSanitizeElement: [],\n    uponSanitizeShadowNode: []\n  };\n};\n/**\n * Resolve a set-valued configuration option: a fresh set built from\n * cfg[key] when it is an own array property (seeded with a clone of\n * options.base when given, case-normalized via options.transform),\n * the fallback set otherwise.\n *\n * @param cfg the cloned, prototype-free configuration object\n * @param key the configuration property to read\n * @param fallback the set to use when the option is absent or not an array\n * @param options transform and optional base set to merge into\n * @returns the resolved set\n */\nconst _resolveSetOption = function _resolveSetOption(cfg, key, fallback, options) {\n  return objectHasOwnProperty(cfg, key) && arrayIsArray(cfg[key]) ? addToSet(options.base ? clone(options.base) : {}, cfg[key], options.transform) : fallback;\n};\nfunction createDOMPurify() {\n  let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n  const DOMPurify = root => createDOMPurify(root);\n  DOMPurify.version = '3.4.13';\n  DOMPurify.removed = [];\n  if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {\n    // Not running in a browser, provide a factory function\n    // so that you can pass your own Window\n    DOMPurify.isSupported = false;\n    return DOMPurify;\n  }\n  let document = window.document;\n  const originalDocument = document;\n  const currentScript = originalDocument.currentScript;\n  window.DocumentFragment;\n    const HTMLTemplateElement = window.HTMLTemplateElement,\n    Node = window.Node,\n    Element = window.Element,\n    NodeFilter = window.NodeFilter,\n    _window$NamedNodeMap = window.NamedNodeMap;\n    _window$NamedNodeMap === void 0 ? window.NamedNodeMap || window.MozNamedAttrMap : _window$NamedNodeMap;\n    window.HTMLFormElement;\n    const DOMParser = window.DOMParser,\n    trustedTypes = window.trustedTypes;\n  const ElementPrototype = Element.prototype;\n  const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n  const remove = lookupGetter(ElementPrototype, 'remove');\n  const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n  const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n  const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n  const getShadowRoot = lookupGetter(ElementPrototype, 'shadowRoot');\n  const getAttributes = lookupGetter(ElementPrototype, 'attributes');\n  const getNodeType = Node && Node.prototype ? lookupGetter(Node.prototype, 'nodeType') : null;\n  const getNodeName = Node && Node.prototype ? lookupGetter(Node.prototype, 'nodeName') : null;\n  const getOwnerDocument = Node && Node.prototype ? lookupGetter(Node.prototype, 'ownerDocument') : null;\n  // As per issue #47, the web-components registry is inherited by a\n  // new document created via createHTMLDocument. As per the spec\n  // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n  // a new empty registry is used when creating a template contents owner\n  // document, so we use that as our parent document to ensure nothing\n  // is inherited.\n  if (typeof HTMLTemplateElement === 'function') {\n    const template = document.createElement('template');\n    if (template.content && template.content.ownerDocument) {\n      document = template.content.ownerDocument;\n    }\n  }\n  let trustedTypesPolicy;\n  let emptyHTML = '';\n  // The instance's own internal Trusted Types policy. Unlike a caller-supplied\n  // `TRUSTED_TYPES_POLICY`, this is created at most once — Trusted Types throws\n  // on duplicate policy names — and is the only policy allowed to persist\n  // across configurations and survive `clearConfig()`.\n  let defaultTrustedTypesPolicy;\n  let defaultTrustedTypesPolicyResolved = false;\n  // Tracks whether we are already inside a call to the configured Trusted Types\n  // policy (`createHTML` or `createScriptURL`). If a supplied policy callback\n  // itself calls `DOMPurify.sanitize` (the cause of #1422), `sanitize` would\n  // re-enter the policy and recurse until the stack overflows. We detect that\n  // re-entry and throw a clear, actionable error instead. The guard is shared\n  // across both callbacks, because either one re-entering `sanitize` triggers\n  // the same unbounded recursion.\n  let IN_TRUSTED_TYPES_POLICY = 0;\n  const _assertNotInTrustedTypesPolicy = function _assertNotInTrustedTypesPolicy() {\n    if (IN_TRUSTED_TYPES_POLICY > 0) {\n      throw typeErrorCreate('A configured TRUSTED_TYPES_POLICY callback (createHTML or ' + 'createScriptURL) must not call DOMPurify.sanitize, as that causes ' + 'infinite recursion. Do not pass a policy whose callbacks wrap ' + 'DOMPurify as TRUSTED_TYPES_POLICY; see the \"DOMPurify and Trusted ' + 'Types\" section of the README.');\n    }\n  };\n  const _createTrustedHTML = function _createTrustedHTML(html) {\n    _assertNotInTrustedTypesPolicy();\n    IN_TRUSTED_TYPES_POLICY++;\n    try {\n      return trustedTypesPolicy.createHTML(html);\n    } finally {\n      IN_TRUSTED_TYPES_POLICY--;\n    }\n  };\n  const _createTrustedScriptURL = function _createTrustedScriptURL(scriptUrl) {\n    _assertNotInTrustedTypesPolicy();\n    IN_TRUSTED_TYPES_POLICY++;\n    try {\n      return trustedTypesPolicy.createScriptURL(scriptUrl);\n    } finally {\n      IN_TRUSTED_TYPES_POLICY--;\n    }\n  };\n  // Lazily resolve (and cache) the instance's internal default policy.\n  // Resolution is attempted at most once: a successful `createPolicy` cannot be\n  // repeated (Trusted Types throws on duplicate names), and a failed or\n  // unsupported attempt must not be retried on every parse.\n  const _getDefaultTrustedTypesPolicy = function _getDefaultTrustedTypesPolicy() {\n    if (!defaultTrustedTypesPolicyResolved) {\n      defaultTrustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);\n      defaultTrustedTypesPolicyResolved = true;\n    }\n    return defaultTrustedTypesPolicy;\n  };\n  const _document = document,\n    implementation = _document.implementation,\n    createNodeIterator = _document.createNodeIterator,\n    createDocumentFragment = _document.createDocumentFragment,\n    getElementsByTagName = _document.getElementsByTagName;\n  const importNode = originalDocument.importNode;\n  let hooks = _createHooksMap();\n  /**\n   * Expose whether this browser supports running the full DOMPurify.\n   */\n  DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && implementation.createHTMLDocument !== undefined;\n  const MUSTACHE_EXPR$1 = MUSTACHE_EXPR,\n    ERB_EXPR$1 = ERB_EXPR,\n    TMPLIT_EXPR$1 = TMPLIT_EXPR,\n    DATA_ATTR$1 = DATA_ATTR,\n    ARIA_ATTR$1 = ARIA_ATTR,\n    IS_SCRIPT_OR_DATA$1 = IS_SCRIPT_OR_DATA,\n    ATTR_WHITESPACE$1 = ATTR_WHITESPACE,\n    CUSTOM_ELEMENT$1 = CUSTOM_ELEMENT;\n  let IS_ALLOWED_URI$1 = IS_ALLOWED_URI;\n  /**\n   * We consider the elements and attributes below to be safe. Ideally\n   * don't add any new ones but feel free to remove unwanted ones.\n   */\n  /* allowed element names */\n  let ALLOWED_TAGS = null;\n  const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);\n  /* Allowed attribute names */\n  let ALLOWED_ATTR = null;\n  const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);\n  /*\n   * Configure how DOMPurify should handle custom elements and their attributes as well as customized built-in elements.\n   * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n   * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n   * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n   */\n  let CUSTOM_ELEMENT_HANDLING = Object.seal(create(null, {\n    tagNameCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    },\n    attributeNameCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    },\n    allowCustomizedBuiltInElements: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: false\n    }\n  }));\n  /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n  let FORBID_TAGS = null;\n  /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n  let FORBID_ATTR = null;\n  /* Config object to store ADD_TAGS/ADD_ATTR functions (when used as functions) */\n  const EXTRA_ELEMENT_HANDLING = Object.seal(create(null, {\n    tagCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    },\n    attributeCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    }\n  }));\n  /* Decide if ARIA attributes are okay */\n  let ALLOW_ARIA_ATTR = true;\n  /* Decide if custom data attributes are okay */\n  let ALLOW_DATA_ATTR = true;\n  /* Decide if unknown protocols are okay */\n  let ALLOW_UNKNOWN_PROTOCOLS = false;\n  /* Decide if self-closing tags in attributes are allowed.\n   * Usually removed due to a mXSS issue in jQuery 3.0 */\n  let ALLOW_SELF_CLOSE_IN_ATTR = true;\n  /* Output should be safe for common template engines.\n   * This means, DOMPurify removes data attributes, mustaches and ERB\n   */\n  let SAFE_FOR_TEMPLATES = false;\n  /* Output should be safe even for XML used within HTML and alike.\n   * This means, DOMPurify removes comments when containing risky content.\n   */\n  let SAFE_FOR_XML = true;\n  /* Decide if document with <html>... should be returned */\n  let WHOLE_DOCUMENT = false;\n  /* Track whether config is already set on this instance of DOMPurify. */\n  let SET_CONFIG = false;\n  /* Pristine allowlist bindings captured at setConfig() time. On the\n   * persistent-config path sanitize() restores the sets from these before\n   * the per-walk hook clone-guard, so a hook's in-call widening cannot\n   * carry across calls. Null until setConfig() is called; reset by\n   * clearConfig(). */\n  let SET_CONFIG_ALLOWED_TAGS = null;\n  let SET_CONFIG_ALLOWED_ATTR = null;\n  /* Decide if all elements (e.g. style, script) must be children of\n   * document.body. By default, browsers might move them to document.head */\n  let FORCE_BODY = false;\n  /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n   * string (or a TrustedHTML object if Trusted Types are supported).\n   * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n   */\n  let RETURN_DOM = false;\n  /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n   * string  (or a TrustedHTML object if Trusted Types are supported) */\n  let RETURN_DOM_FRAGMENT = false;\n  /* Try to return a Trusted Type object instead of a string, return a string in\n   * case Trusted Types are not supported  */\n  let RETURN_TRUSTED_TYPE = false;\n  /* Output should be free from DOM clobbering attacks?\n   * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n   */\n  let SANITIZE_DOM = true;\n  /* Achieve full DOM Clobbering protection by isolating the namespace of named\n   * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n   *\n   * HTML/DOM spec rules that enable DOM Clobbering:\n   *   - Named Access on Window (§7.3.3)\n   *   - DOM Tree Accessors (§3.1.5)\n   *   - Form Element Parent-Child Relations (§4.10.3)\n   *   - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n   *   - HTMLCollection (§4.2.10.2)\n   *\n   * Namespace isolation is implemented by prefixing `id` and `name` attributes\n   * with a constant string, i.e., `user-content-`\n   */\n  let SANITIZE_NAMED_PROPS = false;\n  const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n  /* Keep element content when removing element? */\n  let KEEP_CONTENT = true;\n  /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n   * of importing it into a new Document and returning a sanitized copy */\n  let IN_PLACE = false;\n  /* Allow usage of profiles like html, svg and mathMl */\n  let USE_PROFILES = {};\n  /* Tags to ignore content of when KEEP_CONTENT is true */\n  let FORBID_CONTENTS = null;\n  const DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script',\n  // <selectedcontent> mirrors the selected <option>'s subtree, cloned by\n  // the UA (customizable <select>) — including any on* handlers — and the\n  // engine re-mirrors synchronously whenever a removal changes which\n  // option/selectedcontent is current, even inside DOMPurify's inert\n  // DOMParser document. Hoisting its children on removal re-inserts a fresh\n  // mirror target ahead of the walk, which the engine refills, looping\n  // forever (DoS) and amplifying output. Dropping its content on removal\n  // (rather than hoisting) breaks that cascade; the content is a duplicate\n  // of the option, which is sanitized on its own. See campaign-3 F1/F6.\n  'selectedcontent', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']);\n  /* Tags that are safe for data: URIs */\n  let DATA_URI_TAGS = null;\n  const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);\n  /* Attributes safe for values like \"javascript:\" */\n  let URI_SAFE_ATTRIBUTES = null;\n  const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);\n  const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n  const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n  const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  /* Document namespace */\n  let NAMESPACE = HTML_NAMESPACE;\n  let IS_EMPTY_INPUT = false;\n  /* Allowed XHTML+XML namespaces */\n  let ALLOWED_NAMESPACES = null;\n  const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);\n  const DEFAULT_MATHML_TEXT_INTEGRATION_POINTS = freeze(['mi', 'mo', 'mn', 'ms', 'mtext']);\n  let MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, DEFAULT_MATHML_TEXT_INTEGRATION_POINTS);\n  const DEFAULT_HTML_INTEGRATION_POINTS = freeze(['annotation-xml']);\n  let HTML_INTEGRATION_POINTS = addToSet({}, DEFAULT_HTML_INTEGRATION_POINTS);\n  // Certain elements are allowed in both SVG and HTML\n  // namespace. We need to specify them explicitly\n  // so that they don't get erroneously deleted from\n  // HTML namespace.\n  const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);\n  /* Parsing of strict XHTML documents */\n  let PARSER_MEDIA_TYPE = null;\n  const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n  const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n  let transformCaseFunc = null;\n  /* Keep a reference to config to pass to hooks */\n  let CONFIG = null;\n  /* Ideally, do not touch anything below this line */\n  /* ______________________________________________ */\n  const formElement = document.createElement('form');\n  const isRegexOrFunction = function isRegexOrFunction(testValue) {\n    return testValue instanceof RegExp || testValue instanceof Function;\n  };\n  /**\n   * _parseConfig\n   *\n   * @param cfg optional config literal\n   */\n  // eslint-disable-next-line complexity\n  const _parseConfig = function _parseConfig() {\n    let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    if (CONFIG && CONFIG === cfg) {\n      return;\n    }\n    /* Shield configuration object from tampering */\n    if (!cfg || typeof cfg !== 'object') {\n      cfg = {};\n    }\n    /* Shield configuration object from prototype pollution */\n    cfg = clone(cfg);\n    PARSER_MEDIA_TYPE =\n    // eslint-disable-next-line unicorn/prefer-includes\n    SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE;\n    // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n    transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;\n    /* Set configuration parameters */\n    ALLOWED_TAGS = _resolveSetOption(cfg, 'ALLOWED_TAGS', DEFAULT_ALLOWED_TAGS, {\n      transform: transformCaseFunc\n    });\n    ALLOWED_ATTR = _resolveSetOption(cfg, 'ALLOWED_ATTR', DEFAULT_ALLOWED_ATTR, {\n      transform: transformCaseFunc\n    });\n    ALLOWED_NAMESPACES = _resolveSetOption(cfg, 'ALLOWED_NAMESPACES', DEFAULT_ALLOWED_NAMESPACES, {\n      transform: stringToString\n    });\n    URI_SAFE_ATTRIBUTES = _resolveSetOption(cfg, 'ADD_URI_SAFE_ATTR', DEFAULT_URI_SAFE_ATTRIBUTES, {\n      transform: transformCaseFunc,\n      base: DEFAULT_URI_SAFE_ATTRIBUTES\n    });\n    DATA_URI_TAGS = _resolveSetOption(cfg, 'ADD_DATA_URI_TAGS', DEFAULT_DATA_URI_TAGS, {\n      transform: transformCaseFunc,\n      base: DEFAULT_DATA_URI_TAGS\n    });\n    FORBID_CONTENTS = _resolveSetOption(cfg, 'FORBID_CONTENTS', DEFAULT_FORBID_CONTENTS, {\n      transform: transformCaseFunc\n    });\n    FORBID_TAGS = _resolveSetOption(cfg, 'FORBID_TAGS', clone({}), {\n      transform: transformCaseFunc\n    });\n    FORBID_ATTR = _resolveSetOption(cfg, 'FORBID_ATTR', clone({}), {\n      transform: transformCaseFunc\n    });\n    USE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES') ? cfg.USE_PROFILES && typeof cfg.USE_PROFILES === 'object' ? clone(cfg.USE_PROFILES) : cfg.USE_PROFILES : false;\n    ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n    ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n    ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n    ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\n    SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n    SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true\n    WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n    RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n    RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n    RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n    FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n    SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n    SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n    KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n    IN_PLACE = cfg.IN_PLACE || false; // Default false\n    IS_ALLOWED_URI$1 = isRegex(cfg.ALLOWED_URI_REGEXP) ? cfg.ALLOWED_URI_REGEXP : IS_ALLOWED_URI; // Default regexp\n    NAMESPACE = typeof cfg.NAMESPACE === 'string' ? cfg.NAMESPACE : HTML_NAMESPACE; // Default HTML namespace\n    MATHML_TEXT_INTEGRATION_POINTS = objectHasOwnProperty(cfg, 'MATHML_TEXT_INTEGRATION_POINTS') && cfg.MATHML_TEXT_INTEGRATION_POINTS && typeof cfg.MATHML_TEXT_INTEGRATION_POINTS === 'object' ? clone(cfg.MATHML_TEXT_INTEGRATION_POINTS) : addToSet({}, DEFAULT_MATHML_TEXT_INTEGRATION_POINTS); // Default built-in map\n    HTML_INTEGRATION_POINTS = objectHasOwnProperty(cfg, 'HTML_INTEGRATION_POINTS') && cfg.HTML_INTEGRATION_POINTS && typeof cfg.HTML_INTEGRATION_POINTS === 'object' ? clone(cfg.HTML_INTEGRATION_POINTS) : addToSet({}, DEFAULT_HTML_INTEGRATION_POINTS); // Default built-in map\n    const customElementHandling = objectHasOwnProperty(cfg, 'CUSTOM_ELEMENT_HANDLING') && cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING === 'object' ? clone(cfg.CUSTOM_ELEMENT_HANDLING) : create(null);\n    CUSTOM_ELEMENT_HANDLING = create(null);\n    if (objectHasOwnProperty(customElementHandling, 'tagNameCheck') && isRegexOrFunction(customElementHandling.tagNameCheck)) {\n      CUSTOM_ELEMENT_HANDLING.tagNameCheck = customElementHandling.tagNameCheck; // Default undefined\n    }\n    if (objectHasOwnProperty(customElementHandling, 'attributeNameCheck') && isRegexOrFunction(customElementHandling.attributeNameCheck)) {\n      CUSTOM_ELEMENT_HANDLING.attributeNameCheck = customElementHandling.attributeNameCheck; // Default undefined\n    }\n    if (objectHasOwnProperty(customElementHandling, 'allowCustomizedBuiltInElements') && typeof customElementHandling.allowCustomizedBuiltInElements === 'boolean') {\n      CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = customElementHandling.allowCustomizedBuiltInElements; // Default undefined\n    }\n    seal(CUSTOM_ELEMENT_HANDLING);\n    if (SAFE_FOR_TEMPLATES) {\n      ALLOW_DATA_ATTR = false;\n    }\n    if (RETURN_DOM_FRAGMENT) {\n      RETURN_DOM = true;\n    }\n    /* Parse profile info */\n    if (USE_PROFILES) {\n      ALLOWED_TAGS = addToSet({}, text);\n      ALLOWED_ATTR = create(null);\n      if (USE_PROFILES.html === true) {\n        addToSet(ALLOWED_TAGS, html$1);\n        addToSet(ALLOWED_ATTR, html);\n      }\n      if (USE_PROFILES.svg === true) {\n        addToSet(ALLOWED_TAGS, svg$1);\n        addToSet(ALLOWED_ATTR, svg);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n      if (USE_PROFILES.svgFilters === true) {\n        addToSet(ALLOWED_TAGS, svgFilters);\n        addToSet(ALLOWED_ATTR, svg);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n      if (USE_PROFILES.mathMl === true) {\n        addToSet(ALLOWED_TAGS, mathMl$1);\n        addToSet(ALLOWED_ATTR, mathMl);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n    }\n    /* Always reset function-based ADD_TAGS / ADD_ATTR checks to prevent\n     * leaking across calls when switching from function to array config */\n    EXTRA_ELEMENT_HANDLING.tagCheck = null;\n    EXTRA_ELEMENT_HANDLING.attributeCheck = null;\n    /* Merge configuration parameters */\n    if (objectHasOwnProperty(cfg, 'ADD_TAGS')) {\n      if (typeof cfg.ADD_TAGS === 'function') {\n        EXTRA_ELEMENT_HANDLING.tagCheck = cfg.ADD_TAGS;\n      } else if (arrayIsArray(cfg.ADD_TAGS)) {\n        if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n          ALLOWED_TAGS = clone(ALLOWED_TAGS);\n        }\n        addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n      }\n    }\n    if (objectHasOwnProperty(cfg, 'ADD_ATTR')) {\n      if (typeof cfg.ADD_ATTR === 'function') {\n        EXTRA_ELEMENT_HANDLING.attributeCheck = cfg.ADD_ATTR;\n      } else if (arrayIsArray(cfg.ADD_ATTR)) {\n        if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n          ALLOWED_ATTR = clone(ALLOWED_ATTR);\n        }\n        addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n      }\n    }\n    if (objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') && arrayIsArray(cfg.ADD_URI_SAFE_ATTR)) {\n      addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n    }\n    if (objectHasOwnProperty(cfg, 'FORBID_CONTENTS') && arrayIsArray(cfg.FORBID_CONTENTS)) {\n      if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n        FORBID_CONTENTS = clone(FORBID_CONTENTS);\n      }\n      addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n    }\n    if (objectHasOwnProperty(cfg, 'ADD_FORBID_CONTENTS') && arrayIsArray(cfg.ADD_FORBID_CONTENTS)) {\n      if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n        FORBID_CONTENTS = clone(FORBID_CONTENTS);\n      }\n      addToSet(FORBID_CONTENTS, cfg.ADD_FORBID_CONTENTS, transformCaseFunc);\n    }\n    /* Add #text in case KEEP_CONTENT is set to true */\n    if (KEEP_CONTENT) {\n      ALLOWED_TAGS['#text'] = true;\n    }\n    /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n    if (WHOLE_DOCUMENT) {\n      addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n    }\n    /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n    if (ALLOWED_TAGS.table) {\n      addToSet(ALLOWED_TAGS, ['tbody']);\n      delete FORBID_TAGS.tbody;\n    }\n    // Re-derive the active Trusted Types policy from this configuration on\n    // every parse. The active policy must never be sticky closure state that\n    // outlives the config that set it: a caller-supplied policy left in place\n    // after `clearConfig()` — or after a later call that supplied none, or\n    // `TRUSTED_TYPES_POLICY: null` — could sign a subsequent \"default\"\n    // `RETURN_TRUSTED_TYPE` result with a foreign, possibly unsafe policy.\n    // See GHSA-vxr8-fq34-vvx9.\n    if (cfg.TRUSTED_TYPES_POLICY) {\n      if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== 'function') {\n        throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.');\n      }\n      if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== 'function') {\n        throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.');\n      }\n      // A caller-supplied policy applies to this configuration only.\n      const previousTrustedTypesPolicy = trustedTypesPolicy;\n      trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;\n      // Sign local variables required by `sanitize`. If the supplied policy's\n      // `createHTML` is circular (i.e. it calls `DOMPurify.sanitize`), this\n      // throws via the re-entrancy guard. Restore the previous policy first so\n      // the instance is not left in a poisoned state. See #1422.\n      try {\n        emptyHTML = _createTrustedHTML('');\n      } catch (error) {\n        trustedTypesPolicy = previousTrustedTypesPolicy;\n        throw error;\n      }\n    } else if (cfg.TRUSTED_TYPES_POLICY === null) {\n      // Explicit opt-out for this call: perform no Trusted Types signing and\n      // create nothing (so a strict `trusted-types` CSP that disallows a\n      // `dompurify` policy can still call `sanitize` from inside its own\n      // policy — see #1422). Resetting to `undefined` rather than a sticky\n      // `null` also drops any previously retained caller policy, so it cannot\n      // resurface on a later call, while still allowing the next config-less\n      // call to restore the internal default policy. See GHSA-vxr8-fq34-vvx9.\n      trustedTypesPolicy = undefined;\n      emptyHTML = '';\n    } else {\n      // No policy supplied: keep the currently active policy if one is set — a\n      // previously supplied policy is intentionally sticky across config-less\n      // calls — otherwise fall back to the instance's own internal policy,\n      // created at most once. (A policy supplied for a *single* call still\n      // lingers by design; what must not linger is a policy whose configuration\n      // has been torn down via `clearConfig()`, which restores the default.)\n      if (trustedTypesPolicy === undefined) {\n        trustedTypesPolicy = _getDefaultTrustedTypesPolicy();\n      }\n      // Sign internal variables only when a policy is active. A falsy policy\n      // (Trusted Types unsupported, creation failed, or an explicit opt-out)\n      // leaves `emptyHTML` as a plain string, so we never call `.createHTML` on\n      // a non-policy and throw. See #1422.\n      if (trustedTypesPolicy && typeof emptyHTML === 'string') {\n        emptyHTML = _createTrustedHTML('');\n      }\n    }\n    // Prevent further manipulation of configuration.\n    // Not available in IE8, Safari 5, etc.\n    if (freeze) {\n      freeze(cfg);\n    }\n    CONFIG = cfg;\n  };\n  /* Keep track of all possible SVG and MathML tags\n   * so that we can perform the namespace checks\n   * correctly. */\n  const ALL_SVG_TAGS = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]);\n  const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);\n  /**\n   * Namespace rules for an element in the SVG namespace.\n   *\n   * @param tagName the element's lowercase tag name\n   * @param parent the (possibly simulated) parent node\n   * @param parentTagName the parent's lowercase tag name\n   * @returns true if a spec-compliant parser could produce this element\n   */\n  const _checkSvgNamespace = function _checkSvgNamespace(tagName, parent, parentTagName) {\n    // The only way to switch from HTML namespace to SVG\n    // is via <svg>. If it happens via any other tag, then\n    // it should be killed.\n    if (parent.namespaceURI === HTML_NAMESPACE) {\n      return tagName === 'svg';\n    }\n    // The only way to switch from MathML to SVG is via <svg>\n    // if the parent is either <annotation-xml> or a MathML\n    // text integration point.\n    if (parent.namespaceURI === MATHML_NAMESPACE) {\n      return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n    }\n    // We only allow elements that are defined in SVG\n    // spec. All others are disallowed in SVG namespace.\n    return Boolean(ALL_SVG_TAGS[tagName]);\n  };\n  /**\n   * Namespace rules for an element in the MathML namespace.\n   *\n   * @param tagName the element's lowercase tag name\n   * @param parent the (possibly simulated) parent node\n   * @param parentTagName the parent's lowercase tag name\n   * @returns true if a spec-compliant parser could produce this element\n   */\n  const _checkMathMlNamespace = function _checkMathMlNamespace(tagName, parent, parentTagName) {\n    // The only way to switch from HTML namespace to MathML\n    // is via <math>. If it happens via any other tag, then\n    // it should be killed.\n    if (parent.namespaceURI === HTML_NAMESPACE) {\n      return tagName === 'math';\n    }\n    // The only way to switch from SVG to MathML is via\n    // <math> and HTML integration points\n    if (parent.namespaceURI === SVG_NAMESPACE) {\n      return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n    }\n    // We only allow elements that are defined in MathML\n    // spec. All others are disallowed in MathML namespace.\n    return Boolean(ALL_MATHML_TAGS[tagName]);\n  };\n  /**\n   * Namespace rules for an element in the HTML namespace.\n   *\n   * @param tagName the element's lowercase tag name\n   * @param parent the (possibly simulated) parent node\n   * @param parentTagName the parent's lowercase tag name\n   * @returns true if a spec-compliant parser could produce this element\n   */\n  const _checkHtmlNamespace = function _checkHtmlNamespace(tagName, parent, parentTagName) {\n    // The only way to switch from SVG to HTML is via\n    // HTML integration points, and from MathML to HTML\n    // is via MathML text integration points\n    if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n      return false;\n    }\n    if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n      return false;\n    }\n    // We disallow tags that are specific for MathML\n    // or SVG and should never appear in HTML namespace\n    return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n  };\n  /**\n   * @param element a DOM element whose namespace is being checked\n   * @returns Return false if the element has a\n   *  namespace that a spec-compliant parser would never\n   *  return. Return true otherwise.\n   */\n  const _checkValidNamespace = function _checkValidNamespace(element) {\n    let parent = getParentNode(element);\n    // In JSDOM, if we're inside shadow DOM, then parentNode\n    // can be null. We just simulate parent in this case.\n    if (!parent || !parent.tagName) {\n      parent = {\n        namespaceURI: NAMESPACE,\n        tagName: 'template'\n      };\n    }\n    const tagName = stringToLowerCase(element.tagName);\n    const parentTagName = stringToLowerCase(parent.tagName);\n    if (!ALLOWED_NAMESPACES[element.namespaceURI]) {\n      return false;\n    }\n    if (element.namespaceURI === SVG_NAMESPACE) {\n      return _checkSvgNamespace(tagName, parent, parentTagName);\n    }\n    if (element.namespaceURI === MATHML_NAMESPACE) {\n      return _checkMathMlNamespace(tagName, parent, parentTagName);\n    }\n    if (element.namespaceURI === HTML_NAMESPACE) {\n      return _checkHtmlNamespace(tagName, parent, parentTagName);\n    }\n    // For XHTML and XML documents that support custom namespaces\n    if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {\n      return true;\n    }\n    // The code should never reach this place (this means\n    // that the element somehow got namespace that is not\n    // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\n    // Return false just in case.\n    return false;\n  };\n  /**\n   * _forceRemove\n   *\n   * @param node a DOM node\n   */\n  const _forceRemove = function _forceRemove(node) {\n    arrayPush(DOMPurify.removed, {\n      element: node\n    });\n    try {\n      // eslint-disable-next-line unicorn/prefer-dom-node-remove\n      getParentNode(node).removeChild(node);\n    } catch (_) {\n      /* The normal detach failed — this is reached for a parentless node\n         (getParentNode() is null, so .removeChild throws). Element.prototype\n         .remove() is itself a spec no-op on a parentless node, so a recorded\n         \"removal\" would otherwise hand the caller back an intact,\n         payload-bearing node (e.g. a detached IN_PLACE root the mXSS canary or\n         the style-with-element-child rule decided to kill). Fail closed by\n         throwing — exactly as a clobbered root does at the IN_PLACE entry —\n         rather than trying to \"neutralize\" the node via its own methods.\n         Neutralizing would mean calling getAttributeNames()/removeAttribute()\n         on the node, both of which a <form> root can clobber via a named child\n         (and _isClobbered does not even probe getAttributeNames), so the\n         neutralize step could itself be silently defeated, leaving the payload\n         intact. A throw touches only the cached, clobber-safe remove() and\n         getParentNode(). Generalizes GHSA-r47g-fvhr-h676 (clobbered-form root)\n         to every root-kill reason. REPORT-3.\n                This lives inside the catch, so it never fires for a normally-removed\n         in-tree node: those have a parent, removeChild() succeeds, and the\n         catch is not entered. Only a kept (parentless) root reaches here. */\n      remove(node);\n      if (!getParentNode(node)) {\n        throw typeErrorCreate('a node selected for removal could not be detached from its tree ' + 'and cannot be safely returned; refusing to sanitize in place');\n      }\n    }\n  };\n  /**\n   * _neutralizeRoot\n   *\n   * Fail-closed teardown of an in-place root after the sanitize walk aborts\n   * (campaign-3 F2). An internal throw mid-walk — e.g. a page-registered\n   * custom element's reaction detaches a node so `_forceRemove`'s deliberate\n   * parentless guard throws, or any other re-entrant engine mutation — would\n   * otherwise leave the caller's *live* tree half-sanitized, with everything\n   * after the abort point still carrying its handlers. There is no safe way\n   * to resume the walk (the tree mutated under us), so we strip the root bare:\n   * remove every child and every attribute, then let the caller's catch see\n   * the original error. Clobber-safe (cached `remove`/`childNodes`/`attributes`\n   * getters; the root was already clobber-pre-flighted at the IN_PLACE entry).\n   *\n   * @param root the in-place root to empty\n   */\n  const _neutralizeRoot = function _neutralizeRoot(root) {\n    /* Strip every disallowed attribute (on* handlers included) off the whole\n       subtree BEFORE detaching anything. Detaching first would hand back\n       handler-bearing originals (e.g. an already-loading `<img onerror>`)\n       whose queued resource event still fires in page scope after we throw.\n       Clobber-safe reads; a doomed clobbered node's own attributes are\n       irrelevant while its non-clobbered descendants are reached and scrubbed. */\n    _neutralizeSubtree(root);\n    const childNodes = getChildNodes(root);\n    if (childNodes) {\n      const snapshot = [];\n      arrayForEach(childNodes, child => {\n        arrayPush(snapshot, child);\n      });\n      arrayForEach(snapshot, child => {\n        try {\n          remove(child);\n        } catch (_) {\n          /* Best-effort teardown; a still-attached child is handled below */\n        }\n      });\n    }\n    const attributes = getAttributes(root);\n    if (attributes) {\n      for (let i = attributes.length - 1; i >= 0; --i) {\n        const attribute = attributes[i];\n        const name = attribute && attribute.name;\n        if (typeof name === 'string') {\n          try {\n            root.removeAttribute(name);\n          } catch (_) {\n            /* Clobbered removeAttribute — ignore (fail-closed best effort) */\n          }\n        }\n      }\n    }\n  };\n  /**\n   * _removeAttribute\n   *\n   * @param name an Attribute name\n   * @param element a DOM node\n   */\n  const _removeAttribute = function _removeAttribute(name, element) {\n    try {\n      arrayPush(DOMPurify.removed, {\n        attribute: element.getAttributeNode(name),\n        from: element\n      });\n    } catch (_) {\n      arrayPush(DOMPurify.removed, {\n        attribute: null,\n        from: element\n      });\n    }\n    element.removeAttribute(name);\n    // We void attribute values for unremovable \"is\" attributes\n    if (name === 'is') {\n      if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n        try {\n          _forceRemove(element);\n        } catch (_) {}\n      } else {\n        try {\n          element.setAttribute(name, '');\n        } catch (_) {}\n      }\n    }\n  };\n  /**\n   * _stripDisallowedAttributes\n   *\n   * Removes every attribute the active configuration does not allow from a\n   * single element, using the same allowlist as the main attribute pass (so\n   * `on*` handlers go, but no `/^on/` blocklist is introduced). Used only to\n   * neutralise nodes that are being discarded from an in-place tree.\n   *\n   * @param element the element to strip\n   */\n  const _stripDisallowedAttributes = function _stripDisallowedAttributes(element) {\n    const attributes = getAttributes(element);\n    if (!attributes) {\n      return;\n    }\n    for (let i = attributes.length - 1; i >= 0; --i) {\n      const attribute = attributes[i];\n      const name = attribute && attribute.name;\n      if (typeof name !== 'string' || ALLOWED_ATTR[transformCaseFunc(name)]) {\n        continue;\n      }\n      try {\n        element.removeAttribute(name);\n      } catch (_) {\n        /* Clobbered removeAttribute on a doomed node — ignore */\n      }\n    }\n  };\n  /**\n   * _neutralizeSubtree\n   *\n   * Completes the audit-5 F1 fix across every removal path. The KEEP_CONTENT\n   * move-hoist neutralises only disallowed-tag removals; clobber, mXSS-canary,\n   * namespace, comment, processing-instruction and KEEP_CONTENT:false removals\n   * all drop their subtree wholesale via `_forceRemove`. On the IN_PLACE path\n   * those dropped nodes are detached from the caller's LIVE tree but a\n   * handler-bearing original among them (an `<img onerror>`/`<video>` that was\n   * loading) keeps its queued resource event, which fires in page scope after\n   * sanitize returns. This walks a removed subtree and strips every attribute\n   * the active configuration does not allow — so `on*` handlers are cancelled\n   * through the SAME allowlist that governs kept nodes, not a separate `/^on/`\n   * blocklist. Run synchronously before sanitize returns, i.e. before any\n   * queued event can fire. Hook-free by design: these nodes leave the output,\n   * so firing attribute hooks for them would be surprising. Clobber-safe reads;\n   * a doomed clobbered node may shadow `removeAttribute` (its own attributes are\n   * irrelevant — it is discarded — while its non-clobbered descendants, e.g.\n   * the `<img>`, are reached and scrubbed).\n   *\n   * @param root the root of a removed subtree to neutralise\n   */\n  const _neutralizeSubtree = function _neutralizeSubtree(root) {\n    const stack = [root];\n    while (stack.length > 0) {\n      const node = stack.pop();\n      const nodeType = getNodeType ? getNodeType(node) : node.nodeType;\n      if (nodeType === NODE_TYPE.element) {\n        _stripDisallowedAttributes(node);\n      }\n      const childNodes = getChildNodes(node);\n      if (childNodes) {\n        for (let i = childNodes.length - 1; i >= 0; --i) {\n          stack.push(childNodes[i]);\n        }\n      }\n    }\n  };\n  /**\n   * _neutralizePatchLinkage\n   *\n   * IN_PLACE entry pre-pass (declarative-partial-updates / streaming\n   * hardening, https://github.com/WICG/declarative-partial-updates).\n   *\n   * The main walk strips patch linkage (`for`/`patchsrc`) and removes range\n   * markers (PIs / markup comments) node-by-node, in document order, AS it\n   * reaches each node. On a live in-place root that leaves a window: from the\n   * moment the root is connected until the walk arrives at a given node, that\n   * node's linkage is live. A patch applied on connection/stream can fire as\n   * a microtask during the walk and inject or teleport an unsanitized DOM\n   * range into a region the iterator has already passed and will not revisit,\n   * so the post-return \"tree is sanitized\" contract is violated. Sweep the\n   * whole tree once up front and sever every linkage before the walk begins,\n   * closing that window.\n   *\n   * This CANNOT undo a patch that already fired before sanitize ran — that is\n   * the irreducible \"do not IN_PLACE a live-connected attacker tree\" caveat —\n   * but it closes everything from sanitize-start onward. Gated on SAFE_FOR_XML\n   * to group with the rest of the declarative-partial-updates handling and\n   * stay overridable, consistent with the codebase.\n   *\n   * Clobber-safe traversal (cached childNodes getter); per-node try/catch so a\n   * clobbered root cannot defeat the sweep of its non-clobbered descendants.\n   *\n   * NOTE (pending real-Chrome confirmation, see test/declarative-patch-probe\n   * .html Q1): this mirrors the existing policy of keeping `for` on\n   * <label>/<output>. If the shipping feature can drive a patch through a\n   * surviving `for`-on-label/output + `id` pair, this pre-pass and the\n   * attribute check at _isBasicCustomElement's caller must additionally drop\n   * that pair on the IN_PLACE path. Left as-is until the taxonomy is verified.\n   *\n   * @param root the in-place root to sweep\n   */\n  const _neutralizePatchLinkage = function _neutralizePatchLinkage(root) {\n    if (!SAFE_FOR_XML) {\n      return;\n    }\n    const stack = [root];\n    while (stack.length > 0) {\n      const node = stack.pop();\n      const nodeType = getNodeType ? getNodeType(node) : node.nodeType;\n      /* Remove range markers (the target side of a patch linkage): every\n         processing instruction, and any markup-bearing comment. */\n      if (nodeType === NODE_TYPE.processingInstruction || nodeType === NODE_TYPE.comment && regExpTest(COMMENT_MARKUP_PROBE, node.data)) {\n        try {\n          remove(node);\n        } catch (_) {\n          /* Best-effort */\n        }\n        continue;\n      }\n      /* Strip patch-source attributes (the source side) off elements. */\n      if (nodeType === NODE_TYPE.element) {\n        const element = node;\n        const lcTag = transformCaseFunc(getNodeName ? getNodeName(node) : node.nodeName);\n        try {\n          if (element.hasAttribute && element.hasAttribute('patchsrc')) {\n            element.removeAttribute('patchsrc');\n          }\n          if (element.hasAttribute && element.hasAttribute('for') && lcTag !== 'label' && lcTag !== 'output') {\n            element.removeAttribute('for');\n          }\n        } catch (_) {\n          /* Clobbered removeAttribute/hasAttribute on a doomed node — ignore */\n        }\n      }\n      const childNodes = getChildNodes(node);\n      if (childNodes) {\n        for (let i = childNodes.length - 1; i >= 0; --i) {\n          stack.push(childNodes[i]);\n        }\n      }\n    }\n  };\n  /**\n   * _initDocument\n   *\n   * @param dirty - a string of dirty markup\n   * @return a DOM, filled with the dirty markup\n   */\n  const _initDocument = function _initDocument(dirty) {\n    /* Create a HTML document */\n    let doc = null;\n    let leadingWhitespace = null;\n    if (FORCE_BODY) {\n      dirty = '<remove></remove>' + dirty;\n    } else {\n      /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n      const matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n      leadingWhitespace = matches && matches[0];\n    }\n    if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {\n      // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n      dirty = '<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>' + dirty + '</body></html>';\n    }\n    const dirtyPayload = trustedTypesPolicy ? _createTrustedHTML(dirty) : dirty;\n    /*\n     * Use the DOMParser API by default, fallback later if needs be\n     * DOMParser not work for svg when has multiple root element.\n     */\n    if (NAMESPACE === HTML_NAMESPACE) {\n      try {\n        doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n      } catch (_) {}\n    }\n    /* Use createHTMLDocument in case DOMParser is not available */\n    if (!doc || !doc.documentElement) {\n      doc = implementation.createDocument(NAMESPACE, 'template', null);\n      try {\n        doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;\n      } catch (_) {\n        // Syntax error if dirtyPayload is invalid xml\n      }\n    }\n    const body = doc.body || doc.documentElement;\n    if (dirty && leadingWhitespace) {\n      body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n    }\n    /* Work on whole document or just its body */\n    if (NAMESPACE === HTML_NAMESPACE) {\n      return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\n    }\n    return WHOLE_DOCUMENT ? doc.documentElement : body;\n  };\n  /**\n   * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.\n   *\n   * @param root The root element or node to start traversing on.\n   * @return The created NodeIterator\n   */\n  const _createNodeIterator = function _createNodeIterator(root) {\n    /* Read ownerDocument through the cached Node.prototype getter, never the\n       direct property. HTMLFormElement has [LegacyOverrideBuiltIns], so a\n       clobbering child (<input name=\"ownerDocument\"> or a form-associated\n       external input) shadows the prototype getter and makes a direct read\n       return that <input>. createNodeIterator.call(<input>, ...) then throws\n       \"Illegal invocation\", and on the IN_PLACE path that throw lands before\n       the walk's fail-closed barrier - leaving the caller's live tree, with\n       any already-armed handler in it, un-neutralized. The cached getter\n       returns the real Document regardless of the clobber. */\n    const doc = getOwnerDocument ? getOwnerDocument(root) : root.ownerDocument;\n    return createNodeIterator.call(doc || root, root,\n    // eslint-disable-next-line no-bitwise\n    NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null);\n  };\n  /**\n   * Replace template expression syntax (mustache, ERB, template\n   * literal) with a space; shared by all SAFE_FOR_TEMPLATES scrub\n   * sites. Order matters: mustache, then ERB, then template literal.\n   *\n   * @param value the string to scrub\n   * @returns the scrubbed string\n   */\n  const _stripTemplateExpressions = function _stripTemplateExpressions(value) {\n    value = stringReplace(value, MUSTACHE_EXPR$1, ' ');\n    value = stringReplace(value, ERB_EXPR$1, ' ');\n    value = stringReplace(value, TMPLIT_EXPR$1, ' ');\n    return value;\n  };\n  /**\n   * Strip template-engine expressions ({{...}}, ${...}, <%...%>) from the\n   * character data of an element subtree. Used as the final safety net for\n   * SAFE_FOR_TEMPLATES on every DOM-returning code path so that expressions\n   * which only form after text-node normalization (e.g. fragments split across\n   * stripped elements) cannot survive into a template-evaluating framework.\n   *\n   * Walks text/comment/CDATA/processing-instruction nodes and mutates `.data`\n   * in place rather than round-tripping through innerHTML. This preserves\n   * descendant node references (important for IN_PLACE callers), avoids a\n   * serialize/reparse cycle, and reads literal character data — which means\n   * `<%...%>` in text content matches the ERB regex against its real bytes\n   * instead of the HTML-entity-escaped form innerHTML would produce.\n   *\n   * Attribute values are not visited here; SAFE_FOR_TEMPLATES handling for\n   * attributes is performed during the per-node `_sanitizeAttributes` pass.\n   *\n   * @param node The root element whose character data should be scrubbed.\n   */\n  const _scrubTemplateExpressions2 = function _scrubTemplateExpressions(node) {\n    var _node$querySelectorAl;\n    node.normalize();\n    /* Clobber-safe ownerDocument read, same reasoning as _createNodeIterator:\n       under SAFE_FOR_TEMPLATES this runs on the live IN_PLACE root, which may\n       carry a form-named-getter override of ownerDocument. */\n    const doc = getOwnerDocument ? getOwnerDocument(node) : node.ownerDocument;\n    const walker = createNodeIterator.call(doc || node, node,\n    // eslint-disable-next-line no-bitwise\n    NodeFilter.SHOW_TEXT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_CDATA_SECTION | NodeFilter.SHOW_PROCESSING_INSTRUCTION, null);\n    let currentNode = walker.nextNode();\n    while (currentNode) {\n      currentNode.data = _stripTemplateExpressions(currentNode.data);\n      currentNode = walker.nextNode();\n    }\n    // NodeIterator does not descend into <template>.content per the DOM spec,\n    // so we must explicitly recurse into each template's content fragment,\n    // mirroring the approach used by _sanitizeShadowDOM.\n    const templates = (_node$querySelectorAl = node.querySelectorAll) === null || _node$querySelectorAl === void 0 ? void 0 : _node$querySelectorAl.call(node, 'template');\n    if (templates) {\n      arrayForEach(templates, tmpl => {\n        if (_isDocumentFragment(tmpl.content)) {\n          _scrubTemplateExpressions2(tmpl.content);\n        }\n      });\n    }\n  };\n  /**\n   * _isClobbered\n   *\n   * Detect DOM-clobbering on HTMLFormElement nodes. Form is the only HTML\n   * interface with [LegacyOverrideBuiltIns]; a descendant element with a\n   * `name` attribute matching a prototype property shadows that property\n   * on direct reads. We use this check at the IN_PLACE entry-point and\n   * during attribute sanitization to refuse clobbered forms.\n   *\n   * @param element element to check for clobbering attacks\n   * @return true if clobbered, false if safe\n   */\n  const _isClobbered = function _isClobbered(element) {\n    // Realm-independent tag-name probe. If we can't determine the tag\n    // name at all, we can't reason about clobbering — return false\n    // (the caller's other defences still apply).\n    const realTagName = getNodeName ? getNodeName(element) : null;\n    if (typeof realTagName !== 'string') {\n      return false;\n    }\n    if (transformCaseFunc(realTagName) !== 'form') {\n      return false;\n    }\n    return typeof element.nodeName !== 'string' || typeof element.textContent !== 'string' || typeof element.removeChild !== 'function' ||\n    // Realm-safe NamedNodeMap detection: equality against the cached\n    // prototype getter. Clobbered .attributes (e.g. <input name=\"attributes\">)\n    // makes the direct read diverge from the cached read; a clean form\n    // (same-realm OR foreign-realm) has both reads pointing at the same\n    // canonical NamedNodeMap.\n    element.attributes !== getAttributes(element) || typeof element.removeAttribute !== 'function' || typeof element.setAttribute !== 'function' || typeof element.namespaceURI !== 'string' || typeof element.insertBefore !== 'function' || typeof element.hasChildNodes !== 'function' ||\n    // NodeType clobbering probe. Cached Node.prototype.nodeType getter\n    // returns the integer 1 for any Element regardless of realm; direct\n    // read on a clobbered form (e.g. <input name=\"nodeType\">) returns\n    // the named child element. Cheap addition — nodeType is read from\n    // an internal slot, no serialization cost — and removes a residual\n    // clobbering surface used by several mXSS / PI / comment branches\n    // in _sanitizeElements that compare currentNode.nodeType directly.\n    element.nodeType !== getNodeType(element) ||\n    // HTMLFormElement has [LegacyOverrideBuiltIns]: a descendant named\n    // \"childNodes\" shadows the prototype getter. Direct reads of\n    // form.childNodes from a clobbered form return the named child\n    // instead of the real NodeList, so any walk that reads it directly\n    // skips the form's real children. Compare the direct read to the\n    // cached Node.prototype getter — when the form's named-property\n    // getter intercepts the read, the two values differ and we flag\n    // the form. This catches every clobbering child type (input,\n    // select, etc.) regardless of whether the named child happens to\n    // carry a numeric .length, which a typeof-based probe would miss\n    // (e.g. HTMLSelectElement.length is a defined unsigned-long).\n    element.childNodes !== getChildNodes(element);\n  };\n  /**\n   * Checks whether the given value is a DocumentFragment from any realm.\n   *\n   * The realm-independent replacement reads `nodeType` through the cached\n   * Node.prototype getter and compares to the DOCUMENT_FRAGMENT_NODE\n   * constant (11). nodeType is a numeric value resolved from the node's\n   * internal slot, identical across realms for the same kind of node.\n   *\n   * @param value object to check\n   * @return true if value is a DocumentFragment-shaped node from any realm\n   */\n  const _isDocumentFragment = function _isDocumentFragment(value) {\n    if (!getNodeType || typeof value !== 'object' || value === null) {\n      return false;\n    }\n    try {\n      return getNodeType(value) === NODE_TYPE.documentFragment;\n    } catch (_) {\n      return false;\n    }\n  };\n  /**\n   * Checks whether the given object is a DOM node, including nodes that\n   * originate from a different window/realm (e.g. an iframe's\n   * contentDocument). The previous `value instanceof Node` check was\n   * realm-bound: nodes from a different window failed it, causing\n   * sanitize() to silently stringify them and reset IN_PLACE to false,\n   * returning the original node unsanitized. See GHSA-4w3q-35jp-p934.\n   *\n   * @param value object to check whether it's a DOM node\n   * @return true if value is a DOM node from any realm\n   */\n  const _isNode = function _isNode(value) {\n    if (!getNodeType || typeof value !== 'object' || value === null) {\n      return false;\n    }\n    try {\n      return typeof getNodeType(value) === 'number';\n    } catch (_) {\n      return false;\n    }\n  };\n  function _executeHooks(hooks, currentNode, data) {\n    if (hooks.length === 0) {\n      return;\n    }\n    arrayForEach(hooks, hook => {\n      hook.call(DOMPurify, currentNode, data, CONFIG);\n    });\n  }\n  /**\n   * Structural-threat checks that condemn a node regardless of the\n   * allowlists: mXSS via namespace confusion, risky CSS construction,\n   * processing instructions, markup-bearing comments. Pure predicate;\n   * the caller removes. Check order is load-bearing.\n   *\n   * @param currentNode the node to inspect\n   * @param tagName the node's transformCaseFunc'd tag name\n   * @return true if the node must be removed\n   */\n  const _isUnsafeNode = function _isUnsafeNode(currentNode, tagName) {\n    /* Detect mXSS attempts abusing namespace confusion */\n    if (SAFE_FOR_XML && currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(ELEMENT_MARKUP_PROBE, currentNode.textContent) && regExpTest(ELEMENT_MARKUP_PROBE, currentNode.innerHTML)) {\n      return true;\n    }\n    /* Remove risky CSS construction leading to mXSS */\n    if (SAFE_FOR_XML && currentNode.namespaceURI === HTML_NAMESPACE && tagName === 'style' && _isNode(currentNode.firstElementChild)) {\n      return true;\n    }\n    /* Remove any occurrence of processing instructions */\n    if (currentNode.nodeType === NODE_TYPE.processingInstruction) {\n      return true;\n    }\n    /* Remove any kind of possibly harmful comments */\n    if (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(COMMENT_MARKUP_PROBE, currentNode.data)) {\n      return true;\n    }\n    return false;\n  };\n  /**\n   * Handle a node whose tag is forbidden or not allowlisted: keep\n   * allowed custom elements (false return exits _sanitizeElements\n   * early - the namespace and fallback-tag removal checks are\n   * intentionally skipped for kept custom elements), else hoist\n   * content per KEEP_CONTENT and remove.\n   *\n   * A kept custom element is the ONLY case in which this function\n   * returns false, so the caller uses that return value to run the\n   * afterSanitizeElements hook on the kept element and keep the\n   * element-hook lifecycle consistent with normal allowlisted\n   * elements (GHSA-c2j3-45gr-mqc4).\n   *\n   * @param currentNode the disallowed node\n   * @param tagName the node's transformCaseFunc'd tag name\n   * @return true if the node was removed, false if kept\n   */\n  const _sanitizeDisallowedNode = function _sanitizeDisallowedNode(currentNode, tagName, root) {\n    /* Check if we have a custom element to handle */\n    if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) {\n      if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) {\n        return false;\n      }\n      if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) {\n        return false;\n      }\n    }\n    /* Keep content except for bad-listed elements.\n         Use the cached prototype getters exclusively — the previous code\n         had `|| currentNode.parentNode` / `|| currentNode.childNodes`\n         fallbacks, but the cached getters always return the canonical\n         value (or null for a real parent-less node), so the fallback\n         path was dead in safe cases and a clobbering surface in unsafe\n         ones. Falsy cached results stay falsy; the `if (childNodes &&\n         parentNode)` check already gates correctly. */\n    if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n      const parentNode = getParentNode(currentNode);\n      const childNodes = getChildNodes(currentNode);\n      if (childNodes && parentNode) {\n        const childCount = childNodes.length;\n        /* Hoist by moving each child up one level rather than deep-cloning\n             it. Moving transfers every descendant exactly once, so a chain of\n             nested disallowed elements costs O(n) instead of the O(n^2) that\n             re-cloning the shrinking subtree at each level produced; it also\n             empties the removed original, so `DOMPurify.removed` no longer\n             pins whole subtrees. Moving preserves the in-place guarantee too:\n             an original carrying already-queued resource events (`<img\n             onerror>`, `<video>`/`<audio>` error, lazy/`onload`, …) is\n             relocated and sanitised rather than left detached but still armed.\n                      The sole case that must clone is removing the walk root itself.\n             The result is serialised from the root's subtree, so a restrictive\n             ALLOWED_TAGS that strips the root (`body` on the string path) must\n             leave the content inside it, which only cloning does. In IN_PLACE\n             the root is pre-validated as an allowed tag and so is never removed\n             here, so that path always takes the move branch.\n                      `childNodes` is live; a tail-to-head walk keeps `childNodes[i]`\n             valid whether we move (drops the trailing entry) or clone (leaves\n             the list intact). */\n        for (let i = childCount - 1; i >= 0; --i) {\n          const hoisted = currentNode === root ? cloneNode(childNodes[i], true) : childNodes[i];\n          parentNode.insertBefore(hoisted, getNextSibling(currentNode));\n        }\n      }\n    }\n    _forceRemove(currentNode);\n    return true;\n  };\n  /**\n   * Fork a hook-mutable allowlist off its shared binding the first time a\n   * (possibly lazily-installed) uponSanitize* hook is about to see it, so the\n   * hook cannot widen the per-instance default or the setConfig binding by\n   * reference and leak past the call. Returns the set unchanged once it is\n   * already call-local, so repeated calls across elements are idempotent.\n   *\n   * @param hookList the uponSanitize* hook array for this event\n   * @param set the current ALLOWED_TAGS / ALLOWED_ATTR binding\n   * @param defaultSet the per-instance DEFAULT_ALLOWED_* constant\n   * @param setConfigSet the captured setConfig() binding, or null\n   * @return a call-local clone if a hook is present and set is still shared,\n   *   else set unchanged\n   */\n  const _forkSharedAllowlist = function _forkSharedAllowlist(hookList, set, defaultSet, setConfigSet) {\n    if (hookList.length === 0) {\n      return set;\n    }\n    return set === defaultSet || set === setConfigSet ? clone(set) : set;\n  };\n  /**\n   * _sanitizeElements\n   *\n   * @protect nodeName\n   * @protect textContent\n   * @protect removeChild\n   * @param currentNode to check for permission to exist\n   * @return true if node was killed, false if left alive\n   */\n  // eslint-disable-next-line complexity\n  const _sanitizeElements = function _sanitizeElements(currentNode, root) {\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeElements, currentNode, null);\n    /* A hook may have detached the node - treat it as removed (see the\n       detached-node comment after the uponSanitizeElement hook below). On\n       the IN_PLACE path, neutralize the detached subtree first so a queued\n       resource handler on it cannot fire in page scope after we return. */\n    if (currentNode !== root && getParentNode(currentNode) === null) {\n      if (IN_PLACE) {\n        _neutralizeSubtree(currentNode);\n      }\n      return true;\n    }\n    /* Check if element is clobbered or can clobber */\n    if (_isClobbered(currentNode)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Now let's check the element's type and name */\n    const tagName = transformCaseFunc(getNodeName ? getNodeName(currentNode) : currentNode.nodeName);\n    /* Close the pre-walk clone-guard's timing gap: an uponSanitizeElement\n       hook may have been installed after that guard sampled the hook arrays\n       (e.g. lazily from beforeSanitizeElements), leaving ALLOWED_TAGS still\n       aliasing a shared binding that a widening hook would mutate by\n       reference. Fork it before exposing it to the hook. */\n    ALLOWED_TAGS = _forkSharedAllowlist(hooks.uponSanitizeElement, ALLOWED_TAGS, DEFAULT_ALLOWED_TAGS, SET_CONFIG_ALLOWED_TAGS);\n    /* Execute a hook if present */\n    _executeHooks(hooks.uponSanitizeElement, currentNode, {\n      tagName,\n      allowedTags: ALLOWED_TAGS\n    });\n    /* A hook may have detached the node from the tree — a long-standing\n       user pattern (issue #469; draw.io-style foreignObject filtering).\n       Per the cached, unclobberable parentNode getter the node is\n       genuinely out of the tree, so it can reach neither the serialized\n       output nor an IN_PLACE live tree; treat it as removed and stop\n       processing it. Without this guard, the unsafe-node / namespace\n       checks below would call _forceRemove on a parentless node and hit\n       the REPORT-3 fail-closed throw — which exists for nodes DOMPurify\n       wants gone but *cannot* detach (clobbered / parentless roots), the\n       opposite of a node that is already safely gone. The walk root is\n       exempt: a detached IN_PLACE root is legitimate input and must still\n       be fully sanitized, and a kill-decision on it must keep hitting the\n       REPORT-3 throw. Nodes detached by hooks stay the hook's\n       responsibility for placement: they are not recorded in\n       DOMPurify.removed, so the post-walk IN_PLACE pass (which iterates\n       DOMPurify.removed) does not reach them. But a hook-detached subtree\n       can still hold a queued resource-event handler - e.g. an <img onload>\n       that began loading when the caller built the live tree - which fires\n       in page scope after sanitize returns even though the handler never\n       reached the returned tree. That is the audit-5 F1 hazard, and the\n       documented node.remove() hook pattern walks straight into it. So on\n       the IN_PLACE path we neutralize the detached subtree inline here,\n       stripping its non-allow-listed attributes before returning, exactly\n       as the post-walk pass does for _forceRemove'd subtrees. */\n    if (currentNode !== root && getParentNode(currentNode) === null) {\n      if (IN_PLACE) {\n        _neutralizeSubtree(currentNode);\n      }\n      return true;\n    }\n    /* Remove mXSS vectors, processing instructions and risky comments */\n    if (_isUnsafeNode(currentNode, tagName)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove element if anything forbids its presence */\n    if (FORBID_TAGS[tagName] || !(EXTRA_ELEMENT_HANDLING.tagCheck instanceof Function && EXTRA_ELEMENT_HANDLING.tagCheck(tagName)) && !ALLOWED_TAGS[tagName]) {\n      const removed = _sanitizeDisallowedNode(currentNode, tagName, root);\n      /* A false return means the node is a custom element kept via\n         CUSTOM_ELEMENT_HANDLING - the only keep path through\n         _sanitizeDisallowedNode. Run afterSanitizeElements on it so the\n         element-hook lifecycle matches normal allowlisted elements: a\n         security policy applied in this hook (e.g. stripping an attribute\n         from every surviving element) must not silently skip kept custom\n         elements (GHSA-c2j3-45gr-mqc4). This mirrors the normal-element\n         tail below - the hook runs, then the walker's subsequent\n         _sanitizeAttributes pass sanitizes the element's attributes. The\n         deliberately skipped namespace and fallback-tag removal checks stay\n         skipped; they are removal decisions, not the hook contract. */\n      if (removed === false) {\n        _executeHooks(hooks.afterSanitizeElements, currentNode, null);\n      }\n      return removed;\n    }\n    /* Check whether element has a valid namespace.\n       Realm-safe check (GHSA-hpcv-96wg-7vj8): use the cached Node.prototype\n       nodeType getter rather than `instanceof Element`, which is realm-\n       bound and short-circuits to false for any node minted in a different\n       realm — letting a foreign-realm element with a forbidden namespace\n       slip past the namespace check entirely. */\n    const nt = getNodeType ? getNodeType(currentNode) : currentNode.nodeType;\n    if (nt === NODE_TYPE.element && !_checkValidNamespace(currentNode)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Make sure that older browsers don't get fallback-tag mXSS */\n    if ((tagName === 'noscript' || tagName === 'noembed' || tagName === 'noframes') && regExpTest(FALLBACK_TAG_CLOSE, currentNode.innerHTML)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Sanitize element content to be template-safe */\n    if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {\n      /* Get the element's text content */\n      const content = _stripTemplateExpressions(currentNode.textContent);\n      if (currentNode.textContent !== content) {\n        arrayPush(DOMPurify.removed, {\n          element: currentNode.cloneNode()\n        });\n        currentNode.textContent = content;\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeElements, currentNode, null);\n    return false;\n  };\n  /**\n   * _isValidAttribute\n   *\n   * @param lcTag Lowercase tag name of containing element.\n   * @param lcName Lowercase attribute name.\n   * @param value Attribute value.\n   * @return Returns true if `value` is valid, otherwise false.\n   */\n  // eslint-disable-next-line complexity\n  const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n    /* FORBID_ATTR must always win, even if ADD_ATTR predicate would allow it */\n    if (FORBID_ATTR[lcName]) {\n      return false;\n    }\n    /* Reject declarative-partial-updates patch-linkage attributes\n       (https://github.com/WICG/declarative-partial-updates).\n            Empirical note (Chrome 150, verified — see\n       test/declarative-patch-probe-v3.html): expansion is NOT applied after\n       sanitization. For the string path it fires during sanitize()'s own\n       parse, so the walk sees and sanitizes the fully materialized expanded\n       tree — teleports into MathML/SVG integration points included; a\n       weaponized `<template for>`->`<img onerror>` comes back with the handler\n       stripped. For the IN_PLACE path it fires on connection, before the walk.\n       Either way DOMPurify is NOT blind to the patch.\n            This removal is therefore defense-in-depth rather than the sole barrier:\n       it prevents live linkage from surviving into the OUTPUT and re-expanding\n       in the caller's context, and keeps behaviour deterministic if a future\n       engine defers expansion. `for` is legitimate only on <label>/<output>;\n       anywhere else (notably <template for>) it links the element to a patch\n       target and teleports or removes an arbitrary DOM range by id/marker name.\n       `patchsrc` fetches remote markup and is treated as a script-loading\n       mechanism (CSP). Gated on SAFE_FOR_XML so the removal groups with the\n       other structural-threat checks and stays overridable, consistent with\n       the rest of the codebase. PI range markers are already removed by\n       _isUnsafeNode. */\n    if (SAFE_FOR_XML && lcName === 'patchsrc') {\n      return false;\n    }\n    if (SAFE_FOR_XML && lcName === 'for' && lcTag !== 'label' && lcTag !== 'output') {\n      return false;\n    }\n    /* Make sure attribute cannot clobber */\n    if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {\n      return false;\n    }\n    const nameIsPermitted = ALLOWED_ATTR[lcName] || EXTRA_ELEMENT_HANDLING.attributeCheck instanceof Function && EXTRA_ELEMENT_HANDLING.attributeCheck(lcName, lcTag);\n    /* Allow valid data-* attributes: At least one character after \"-\"\n        (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n        XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n        We don't need to check the value; it's always URI safe. */\n    if (ALLOW_DATA_ATTR && regExpTest(DATA_ATTR$1, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR$1, lcName)) ; else if (!nameIsPermitted) {\n      if (\n      // First condition does a very basic check if a) it's basically a valid custom element tagname AND\n      // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n      // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck\n      _isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName, lcTag)) ||\n      // Alternative, second condition checks if it's an `is`-attribute, AND\n      // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n      lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else {\n        return false;\n      }\n      /* Check value is safe. First, is attr inert? If so, is safe */\n    } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE$1, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA$1, stringReplace(value, ATTR_WHITESPACE$1, ''))) ; else if (value) {\n      return false;\n    } else ;\n    return true;\n  };\n  /* Names the HTML spec reserves from valid-custom-element-name; these must\n   * never be treated as basic custom elements even when a permissive\n   * CUSTOM_ELEMENT_HANDLING.tagNameCheck is configured. */\n  const RESERVED_CUSTOM_ELEMENT_NAMES = addToSet({}, ['annotation-xml', 'color-profile', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'missing-glyph']);\n  /**\n   * _isBasicCustomElement\n   * checks if at least one dash is included in tagName, and it's not the first char\n   * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n   *\n   * @param tagName name of the tag of the node to sanitize\n   * @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false.\n   */\n  const _isBasicCustomElement = function _isBasicCustomElement(tagName) {\n    return !RESERVED_CUSTOM_ELEMENT_NAMES[stringToLowerCase(tagName)] && regExpTest(CUSTOM_ELEMENT$1, tagName);\n  };\n  /**\n   * Wrap an attribute value in the matching Trusted Types object when\n   * the active policy requires it. Namespaced attributes pass through\n   * unchanged (no TT support yet, see\n   * https://bugs.chromium.org/p/chromium/issues/detail?id=1305293).\n   *\n   * @param lcTag lowercase tag name of the containing element\n   * @param lcName lowercase attribute name\n   * @param namespaceURI the attribute's namespace, if any\n   * @param value the attribute value to wrap\n   * @return the value, wrapped when Trusted Types demand it\n   */\n  const _applyTrustedTypesToAttribute = function _applyTrustedTypesToAttribute(lcTag, lcName, namespaceURI, value) {\n    if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function' && !namespaceURI) {\n      switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n        case 'TrustedHTML':\n          {\n            return _createTrustedHTML(value);\n          }\n        case 'TrustedScriptURL':\n          {\n            return _createTrustedScriptURL(value);\n          }\n      }\n    }\n    return value;\n  };\n  /**\n   * Write a modified attribute value back onto the element. On\n   * success, re-probe for clobbering introduced by the new value and\n   * remove the element when found; otherwise pop the removal entry\n   * recorded by the earlier _removeAttribute (long-standing pairing\n   * with the SANITIZE_NAMED_PROPS path - do not \"fix\" casually). On\n   * failure, remove the attribute instead.\n   *\n   * @param currentNode the element carrying the attribute\n   * @param name the attribute name as present on the element\n   * @param namespaceURI the attribute's namespace, if any\n   * @param value the new attribute value\n   */\n  const _setAttributeValue = function _setAttributeValue(currentNode, name, namespaceURI, value) {\n    try {\n      if (namespaceURI) {\n        currentNode.setAttributeNS(namespaceURI, name, value);\n      } else {\n        /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n        currentNode.setAttribute(name, value);\n      }\n      if (_isClobbered(currentNode)) {\n        _forceRemove(currentNode);\n      } else {\n        arrayPop(DOMPurify.removed);\n      }\n    } catch (_) {\n      _removeAttribute(name, currentNode);\n    }\n  };\n  /**\n   * _sanitizeAttributes\n   *\n   * @protect attributes\n   * @protect nodeName\n   * @protect removeAttribute\n   * @protect setAttribute\n   *\n   * @param currentNode to sanitize\n   */\n  const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);\n    const attributes = currentNode.attributes;\n    /* Check if we have attributes; if not we might have a text node */\n    if (!attributes || _isClobbered(currentNode)) {\n      return;\n    }\n    /* Same lazy-install guard as uponSanitizeElement (see there): fork the\n       attribute allowlist off its shared binding before a hook can see it. */\n    ALLOWED_ATTR = _forkSharedAllowlist(hooks.uponSanitizeAttribute, ALLOWED_ATTR, DEFAULT_ALLOWED_ATTR, SET_CONFIG_ALLOWED_ATTR);\n    const hookEvent = {\n      attrName: '',\n      attrValue: '',\n      keepAttr: true,\n      allowedAttributes: ALLOWED_ATTR,\n      forceKeepAttr: undefined\n    };\n    let l = attributes.length;\n    const lcTag = transformCaseFunc(currentNode.nodeName);\n    /* Go backwards over all attributes; safely remove bad ones */\n    while (l--) {\n      const attr = attributes[l];\n      const name = attr.name,\n        namespaceURI = attr.namespaceURI,\n        attrValue = attr.value;\n      const lcName = transformCaseFunc(name);\n      const initValue = attrValue;\n      let value = name === 'value' ? initValue : stringTrim(initValue);\n      /* Execute a hook if present */\n      hookEvent.attrName = lcName;\n      hookEvent.attrValue = value;\n      hookEvent.keepAttr = true;\n      hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n      _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);\n      value = hookEvent.attrValue;\n      /* Full DOM Clobbering protection via namespace isolation,\n       * Prefix id and name attributes with `user-content-`\n       */\n      if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name') && stringIndexOf(value, SANITIZE_NAMED_PROPS_PREFIX) !== 0) {\n        // Remove the attribute with this value\n        _removeAttribute(name, currentNode);\n        // Prefix the value and later re-create the attribute with the sanitized value\n        value = SANITIZE_NAMED_PROPS_PREFIX + value;\n      }\n      // Else: already prefixed, leave the attribute alone — the prefix is\n      // itself the clobbering protection, and re-applying it is incorrect.\n      /* Work around a security issue with comments inside attributes */\n      if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Make sure we cannot easily use animated hrefs, even if animations are allowed */\n      if (lcName === 'attributename' && stringMatch(value, 'href')) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Did the hooks force-keep the attribute? */\n      if (hookEvent.forceKeepAttr) {\n        continue;\n      }\n      /* Did the hooks approve of the attribute? */\n      if (!hookEvent.keepAttr) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Work around a security issue in jQuery 3.0 */\n      if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(SELF_CLOSING_TAG, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Sanitize attribute content to be template-safe */\n      if (SAFE_FOR_TEMPLATES) {\n        value = _stripTemplateExpressions(value);\n      }\n      /* Is `value` valid for this attribute? */\n      if (!_isValidAttribute(lcTag, lcName, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Handle attributes that require Trusted Types */\n      value = _applyTrustedTypesToAttribute(lcTag, lcName, namespaceURI, value);\n      /* Handle invalid data-* attribute set by try-catching it */\n      if (value !== initValue) {\n        _setAttributeValue(currentNode, name, namespaceURI, value);\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeAttributes, currentNode, null);\n  };\n  /**\n   * _sanitizeShadowDOM\n   *\n   * @param fragment to iterate over recursively\n   */\n  const _sanitizeShadowDOM2 = function _sanitizeShadowDOM(fragment) {\n    let shadowNode = null;\n    const shadowIterator = _createNodeIterator(fragment);\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);\n    while (shadowNode = shadowIterator.nextNode()) {\n      /* Execute a hook if present */\n      _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);\n      /* Sanitize tags and elements */\n      _sanitizeElements(shadowNode, fragment);\n      /* Check attributes next */\n      _sanitizeAttributes(shadowNode);\n      /* Deep shadow DOM detected.\n         Realm-safe check (GHSA-hpcv-96wg-7vj8): use nodeType against the\n         DOCUMENT_FRAGMENT_NODE constant rather than instanceof, so we\n         recurse into <template>.content from foreign realms too. */\n      if (_isDocumentFragment(shadowNode.content)) {\n        _sanitizeShadowDOM2(shadowNode.content);\n      }\n      /* An element iterated here may itself host an attached\n         shadow root. The default NodeIterator does not enter shadow\n         trees, so a shadow root nested inside template.content was\n         previously reached by no walk at all (the pre-pass at\n         _sanitizeAttachedShadowRoots descends via childNodes, which\n         doesn't enter template.content; the template-content recursion\n         above iterates the content but never inspected shadowRoot).\n         Walk it explicitly. The nodeType guard avoids reading\n         shadowRoot off text / comment / CDATA / PI nodes that the\n         iterator also surfaces. */\n      const shadowNodeType = getNodeType ? getNodeType(shadowNode) : shadowNode.nodeType;\n      if (shadowNodeType === NODE_TYPE.element) {\n        const innerSr = getShadowRoot(shadowNode);\n        if (_isDocumentFragment(innerSr)) {\n          _sanitizeAttachedShadowRoots(innerSr);\n          _sanitizeShadowDOM2(innerSr);\n        }\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);\n  };\n  /**\n   * _sanitizeAttachedShadowRoots\n   *\n   * Walks `root` and feeds every attached shadow root we encounter into\n   * the existing _sanitizeShadowDOM pipeline. The default node iterator\n   * does not descend into shadow trees, so nodes inside an attached\n   * shadow root would otherwise be skipped entirely.\n   *\n   * Two real input paths put attached shadow roots in front of us:\n   *   1. IN_PLACE on a DOM node that already has shadow roots attached.\n   *   2. DOM-node input where importNode(dirty, true) deep-clones the\n   *      shadow root because it was created with `clonable: true`.\n   *\n   * This pass runs once, up front, so the main iteration loop (and the\n   * existing _sanitizeShadowDOM template-content recursion) stay\n   * untouched — string-input paths are not affected.\n   *\n   * @param root the subtree root to walk for attached shadow roots\n   */\n  const _sanitizeAttachedShadowRoots = function _sanitizeAttachedShadowRoots(root) {\n    /* Iterative (explicit stack) rather than per-child recursion. DOM APIs\n       impose no depth cap, so an attacker-shaped tree (JSON/CRDT/editor data\n       built straight into the DOM — the IN_PLACE surface) deeper than the JS\n       call-stack budget would otherwise overflow native recursion here and\n       throw at the IN_PLACE entry pre-pass, before a single node is\n       sanitized, leaving the caller's live tree untouched (fail-open). See\n       campaign-3 F4. A heap stack keeps depth off the call stack.\n            Each work item is either a node to descend into, or a deferred\n       `_sanitizeShadowDOM` for an already-walked shadow root. The deferred\n       form preserves the original post-order discipline: a shadow root's\n       nested shadow roots are discovered before the outer shadow is\n       sanitized (which may remove hosts). Pushes are in reverse of the\n       desired processing order (LIFO): template content, then children, then\n       the shadow-sanitize, then the shadow walk — so the order matches the\n       previous recursion exactly. */\n    const stack = [{\n      node: root,\n      shadow: null\n    }];\n    while (stack.length > 0) {\n      const item = stack.pop();\n      /* Deferred shadow-DOM sanitisation: runs after its subtree was walked. */\n      if (item.shadow) {\n        _sanitizeShadowDOM2(item.shadow);\n        continue;\n      }\n      const node = item.node;\n      const nodeType = getNodeType ? getNodeType(node) : node.nodeType;\n      const isElement = nodeType === NODE_TYPE.element;\n      /* (pushed last → processed first) Children, snapshotted in reverse so\n         the first child is processed first. Snapshotting matters because a\n         hook may detach siblings mid-walk. */\n      const childNodes = getChildNodes(node);\n      if (childNodes) {\n        for (let i = childNodes.length - 1; i >= 0; --i) {\n          stack.push({\n            node: childNodes[i],\n            shadow: null\n          });\n        }\n      }\n      /* (pushed before children → processed after them, matching the old\n         \"template content last\" order) When the node is a <template>,\n         descend into its content. */\n      if (isElement) {\n        const rootName = getNodeName ? getNodeName(node) : null;\n        if (typeof rootName === 'string' && transformCaseFunc(rootName) === 'template') {\n          const content = node.content;\n          if (_isDocumentFragment(content)) {\n            stack.push({\n              node: content,\n              shadow: null\n            });\n          }\n        }\n      }\n      /* Shadow root (processed first): walk its subtree, then sanitise it.\n         Realm-safe check (GHSA-hpcv-96wg-7vj8): nodeType-based detection\n         rather than `instanceof DocumentFragment`, which is realm-bound and\n         silently skipped foreign-realm shadow roots (e.g.\n         iframe.contentDocument attachShadow). */\n      if (isElement) {\n        const sr = getShadowRoot(node);\n        if (_isDocumentFragment(sr)) {\n          /* Push the deferred sanitise first so it pops after the shadow\n             walk we push next, i.e. nested shadow roots are discovered\n             before this one is sanitised. */\n          stack.push({\n            node: null,\n            shadow: sr\n          }, {\n            node: sr,\n            shadow: null\n          });\n        }\n      }\n    }\n  };\n  // eslint-disable-next-line complexity\n  DOMPurify.sanitize = function (dirty) {\n    let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    let body = null;\n    let importedNode = null;\n    let currentNode = null;\n    let returnNode = null;\n    /* Make sure we have a string to sanitize.\n      DO NOT return early, as this will return the wrong type if\n      the user has requested a DOM object rather than a string */\n    IS_EMPTY_INPUT = !dirty;\n    if (IS_EMPTY_INPUT) {\n      dirty = '<!-->';\n    }\n    /* Stringify, in case dirty is an object */\n    if (typeof dirty !== 'string' && !_isNode(dirty)) {\n      dirty = stringifyValue(dirty);\n      if (typeof dirty !== 'string') {\n        throw typeErrorCreate('dirty is not a string, aborting');\n      }\n    }\n    /* Return dirty HTML if DOMPurify cannot run */\n    if (!DOMPurify.isSupported) {\n      return dirty;\n    }\n    /* Assign config vars */\n    if (SET_CONFIG) {\n      /* Persistent setConfig() path: _parseConfig is skipped, so the sets are\n       * not re-derived per call. Restore them from the pristine bindings\n       * captured at setConfig() time so a previous call's hook clone (mutated\n       * below) does not carry over. */\n      ALLOWED_TAGS = SET_CONFIG_ALLOWED_TAGS;\n      ALLOWED_ATTR = SET_CONFIG_ALLOWED_ATTR;\n    } else {\n      _parseConfig(cfg);\n    }\n    /* Clone the hook-mutable allowlists before the walk whenever an\n     * uponSanitize* hook is registered. The hook event exposes ALLOWED_TAGS\n     * and ALLOWED_ATTR by reference (as allowedTags / allowedAttributes), so\n     * a hook that widens them would otherwise mutate the shared set\n     * permanently: across later calls and across every element. Cloning per\n     * walk keeps documented in-call widening working while scoping it to the\n     * call. A single guard for both config paths - the per-call path rebinds\n     * the sets in _parseConfig each call, the persistent path restores them\n     * from the captured bindings just above - so the two cannot diverge. */\n    if (hooks.uponSanitizeElement.length > 0 || hooks.uponSanitizeAttribute.length > 0) {\n      ALLOWED_TAGS = clone(ALLOWED_TAGS);\n    }\n    if (hooks.uponSanitizeAttribute.length > 0) {\n      ALLOWED_ATTR = clone(ALLOWED_ATTR);\n    }\n    /* Clean up removed elements */\n    DOMPurify.removed = [];\n    /* Resolve IN_PLACE for this call without mutating persistent config.\n       Writing the IN_PLACE closure variable here leaks under setConfig(),\n       where _parseConfig is skipped on later calls: a single string call would\n       disable in-place mode for every subsequent node call, returning a\n       sanitized copy while leaving the caller's node — which in-place callers\n       keep using and whose return value they ignore — unsanitized. REPORT-2. */\n    const inPlace = IN_PLACE && typeof dirty !== 'string' && _isNode(dirty);\n    if (inPlace) {\n      /* Declarative-partial-updates / streaming pre-pass: sever every patch\n         linkage across the live tree BEFORE the walk, so no patch can fire\n         mid-walk and inject into an already-processed region. Runs first, so\n         it also covers the forbidden/clobbered roots that throw below. */\n      _neutralizePatchLinkage(dirty);\n      /* Do some early pre-sanitization to avoid unsafe root nodes.\n         Read nodeName through the cached prototype getter — a clobbering\n         child named \"nodeName\" on the form root would otherwise shadow\n         the property and let this check skip the root-allowlist\n         validation entirely. */\n      const nn = getNodeName ? getNodeName(dirty) : dirty.nodeName;\n      if (typeof nn === 'string') {\n        const tagName = transformCaseFunc(nn);\n        if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n          /* Fail closed on a live root: neutralize handlers/children before\n             throwing, exactly as the mid-walk abort path does. */\n          _neutralizeRoot(dirty);\n          throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');\n        }\n      }\n      /* Pre-flight the root through _isClobbered. The iterator-driven\n         removal path can not detach a parent-less root: _forceRemove\n         falls through to Element.prototype.remove(), which per spec\n         is a no-op on a node with no parent. A clobbered root would\n         then survive the main loop with its attributes uninspected,\n         because _sanitizeAttributes early-returns on _isClobbered. The\n         result would be an attacker-controlled form, complete with any\n         event-handler attributes the caller passed in, handed back to\n         the application unsanitized. Refuse to sanitize such a root\n         the same way we refuse a forbidden tag. GHSA-r47g-fvhr-h676. */\n      if (_isClobbered(dirty)) {\n        /* Fail closed on a live clobbered root before throwing.\n           _neutralizeRoot's reads are clobber-safe (cached getters); the\n           form's non-clobbered descendants, e.g. an armed <img>, are scrubbed. */\n        _neutralizeRoot(dirty);\n        throw typeErrorCreate('root node is clobbered and cannot be sanitized in-place');\n      }\n      /* Sanitize attached shadow roots before the main iterator runs.\n         The iterator does not descend into shadow trees. Same fail-closed\n         barrier as the main walk (campaign-3 F2): a custom-element reaction\n         inside a shadow root could abort this pre-pass before the walk runs,\n         which would otherwise leave the entire live tree unsanitized. */\n      try {\n        _sanitizeAttachedShadowRoots(dirty);\n      } catch (error) {\n        _neutralizeRoot(dirty);\n        throw error;\n      }\n    } else if (_isNode(dirty)) {\n      /* If dirty is a DOM element, append to an empty document to avoid\n         elements being stripped by the parser */\n      body = _initDocument('<!---->');\n      importedNode = body.ownerDocument.importNode(dirty, true);\n      if (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === 'BODY') {\n        /* Node is already a body, use as is */\n        body = importedNode;\n      } else if (importedNode.nodeName === 'HTML') {\n        body = importedNode;\n      } else {\n        // eslint-disable-next-line unicorn/prefer-dom-node-append\n        body.appendChild(importedNode);\n      }\n      /* Clonable shadow roots are deep-cloned by importNode(); sanitize\n         them before the main iterator runs, since the iterator does not\n         descend into shadow trees. The walk routes every read through a\n         cached prototype getter so clobbering descendants on a form root\n         cannot hide a shadow host from this pass. */\n      _sanitizeAttachedShadowRoots(importedNode);\n    } else {\n      /* Exit directly if we have nothing to do */\n      if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT &&\n      // eslint-disable-next-line unicorn/prefer-includes\n      dirty.indexOf('<') === -1) {\n        return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? _createTrustedHTML(dirty) : dirty;\n      }\n      /* Initialize the document to work on */\n      body = _initDocument(dirty);\n      /* Check we have a DOM node from the data */\n      if (!body) {\n        return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n      }\n    }\n    /* Remove first element node (ours) if FORCE_BODY is set */\n    if (body && FORCE_BODY) {\n      _forceRemove(body.firstChild);\n    }\n    /* Get node iterator */\n    const walkRoot = inPlace ? dirty : body;\n    /* Now start iterating over the created document.\n       The walk runs inside an exception barrier (campaign-3 F2): a re-entrant\n       engine/custom-element mutation can detach a node mid-walk so\n       `_forceRemove`'s parentless guard throws, aborting the loop. Without the\n       barrier the caller's in-place tree would be left half-sanitized with the\n       unvisited tail still armed. _createNodeIterator itself is inside the\n       barrier too: constructing the iterator dereferences the root's document,\n       and any failure there (e.g. an exotic/clobbered root) must still fail\n       closed rather than skip the neutralize. On any throw we fail closed -\n       strip the in-place root bare - then rethrow so the existing throw\n       contract is preserved. (String/DOM-copy paths never return the partial\n       body, so the propagating throw is already fail-closed there.) */\n    try {\n      const nodeIterator = _createNodeIterator(walkRoot);\n      while (currentNode = nodeIterator.nextNode()) {\n        /* Sanitize tags and elements */\n        _sanitizeElements(currentNode, walkRoot);\n        /* Check attributes next */\n        _sanitizeAttributes(currentNode);\n        /* Shadow DOM detected, sanitize it.\n           Realm-safe check (GHSA-hpcv-96wg-7vj8): nodeType-based detection\n           instead of instanceof, so foreign-realm <template>.content is\n           walked correctly. */\n        if (_isDocumentFragment(currentNode.content)) {\n          _sanitizeShadowDOM2(currentNode.content);\n        }\n      }\n    } catch (error) {\n      if (inPlace) {\n        _neutralizeRoot(dirty);\n        /* Nodes _forceRemove'd earlier in the aborted walk are already\n           detached from the root, so _neutralizeRoot's subtree pass does not\n           reach them. Defuse them too, mirroring the success-path loop below. */\n        arrayForEach(DOMPurify.removed, entry => {\n          if (entry.element) {\n            _neutralizeSubtree(entry.element);\n          }\n        });\n      }\n      throw error;\n    }\n    /* If we sanitized `dirty` in-place, return it. */\n    if (inPlace) {\n      /* Fail-closed completion of the audit-5 F1 fix: every node removed from\n         the caller's live tree is detached but may still hold a queued\n         resource-event handler that fires in page scope after we return. The\n         move-hoist covers only disallowed-tag KEEP_CONTENT removals; strip the\n         non-allow-listed attributes off every other removed subtree (clobber,\n         mXSS, namespace, comments, KEEP_CONTENT:false, …) so those handlers are\n         cancelled before any event can fire. Runs synchronously, pre-return. */\n      arrayForEach(DOMPurify.removed, entry => {\n        if (entry.element) {\n          _neutralizeSubtree(entry.element);\n        }\n      });\n      if (SAFE_FOR_TEMPLATES) {\n        _scrubTemplateExpressions2(dirty);\n      }\n      return dirty;\n    }\n    /* Return sanitized string or DOM */\n    if (RETURN_DOM) {\n      if (SAFE_FOR_TEMPLATES) {\n        _scrubTemplateExpressions2(body);\n      }\n      if (RETURN_DOM_FRAGMENT) {\n        returnNode = createDocumentFragment.call(body.ownerDocument);\n        while (body.firstChild) {\n          // eslint-disable-next-line unicorn/prefer-dom-node-append\n          returnNode.appendChild(body.firstChild);\n        }\n      } else {\n        returnNode = body;\n      }\n      if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) {\n        /*\n          AdoptNode() is not used because internal state is not reset\n          (e.g. the past names map of a HTMLFormElement), this is safe\n          in theory but we would rather not risk another attack vector.\n          The state that is cloned by importNode() is explicitly defined\n          by the specs.\n        */\n        returnNode = importNode.call(originalDocument, returnNode, true);\n      }\n      return returnNode;\n    }\n    let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n    /* Serialize doctype if allowed */\n    if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {\n      serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\\n' + serializedHTML;\n    }\n    /* Sanitize final string template-safe */\n    if (SAFE_FOR_TEMPLATES) {\n      serializedHTML = _stripTemplateExpressions(serializedHTML);\n    }\n    return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? _createTrustedHTML(serializedHTML) : serializedHTML;\n  };\n  DOMPurify.setConfig = function () {\n    let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    _parseConfig(cfg);\n    SET_CONFIG = true;\n    SET_CONFIG_ALLOWED_TAGS = ALLOWED_TAGS;\n    SET_CONFIG_ALLOWED_ATTR = ALLOWED_ATTR;\n  };\n  DOMPurify.clearConfig = function () {\n    CONFIG = null;\n    SET_CONFIG = false;\n    SET_CONFIG_ALLOWED_TAGS = null;\n    SET_CONFIG_ALLOWED_ATTR = null;\n    // Drop any caller-supplied Trusted Types policy so it cannot poison later\n    // `RETURN_TRUSTED_TYPE` output. The internal default policy (cached, and\n    // never recreated — Trusted Types throws on duplicate names) is restored by\n    // the next `_parseConfig`. See GHSA-vxr8-fq34-vvx9.\n    trustedTypesPolicy = defaultTrustedTypesPolicy;\n    emptyHTML = '';\n  };\n  DOMPurify.isValidAttribute = function (tag, attr, value) {\n    /* Initialize shared config vars if necessary. */\n    if (!CONFIG) {\n      _parseConfig({});\n    }\n    const lcTag = transformCaseFunc(tag);\n    const lcName = transformCaseFunc(attr);\n    return _isValidAttribute(lcTag, lcName, value);\n  };\n  DOMPurify.addHook = function (entryPoint, hookFunction) {\n    if (typeof hookFunction !== 'function') {\n      return;\n    }\n    /* Reject unknown entry points. Without this, a non-hook key (e.g.\n     * '__proto__') indexes off the prototype chain rather than a real\n     * hook array, and arrayPush then writes to Object.prototype. Guard\n     * with an own-property check against the known hook names. */\n    if (!objectHasOwnProperty(hooks, entryPoint)) {\n      return;\n    }\n    arrayPush(hooks[entryPoint], hookFunction);\n  };\n  DOMPurify.removeHook = function (entryPoint, hookFunction) {\n    if (!objectHasOwnProperty(hooks, entryPoint)) {\n      return undefined;\n    }\n    if (hookFunction !== undefined) {\n      const index = arrayLastIndexOf(hooks[entryPoint], hookFunction);\n      return index === -1 ? undefined : arraySplice(hooks[entryPoint], index, 1)[0];\n    }\n    return arrayPop(hooks[entryPoint]);\n  };\n  DOMPurify.removeHooks = function (entryPoint) {\n    if (!objectHasOwnProperty(hooks, entryPoint)) {\n      return;\n    }\n    hooks[entryPoint] = [];\n  };\n  DOMPurify.removeAllHooks = function () {\n    hooks = _createHooksMap();\n  };\n  return DOMPurify;\n}\nvar purify = createDOMPurify();\n\nexport { purify as default };\n//# sourceMappingURL=purify.es.mjs.map\n","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n  placement: 'bottom',\n  modifiers: [],\n  strategy: 'absolute'\n};\n\nfunction areValidElements() {\n  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n    args[_key] = arguments[_key];\n  }\n\n  return !args.some(function (element) {\n    return !(element && typeof element.getBoundingClientRect === 'function');\n  });\n}\n\nexport function popperGenerator(generatorOptions) {\n  if (generatorOptions === void 0) {\n    generatorOptions = {};\n  }\n\n  var _generatorOptions = generatorOptions,\n      _generatorOptions$def = _generatorOptions.defaultModifiers,\n      defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n      _generatorOptions$def2 = _generatorOptions.defaultOptions,\n      defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n  return function createPopper(reference, popper, options) {\n    if (options === void 0) {\n      options = defaultOptions;\n    }\n\n    var state = {\n      placement: 'bottom',\n      orderedModifiers: [],\n      options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n      modifiersData: {},\n      elements: {\n        reference: reference,\n        popper: popper\n      },\n      attributes: {},\n      styles: {}\n    };\n    var effectCleanupFns = [];\n    var isDestroyed = false;\n    var instance = {\n      state: state,\n      setOptions: function setOptions(setOptionsAction) {\n        var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n        cleanupModifierEffects();\n        state.options = Object.assign({}, defaultOptions, state.options, options);\n        state.scrollParents = {\n          reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n          popper: listScrollParents(popper)\n        }; // Orders the modifiers based on their dependencies and `phase`\n        // properties\n\n        var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n        state.orderedModifiers = orderedModifiers.filter(function (m) {\n          return m.enabled;\n        });\n        runModifierEffects();\n        return instance.update();\n      },\n      // Sync update – it will always be executed, even if not necessary. This\n      // is useful for low frequency updates where sync behavior simplifies the\n      // logic.\n      // For high frequency updates (e.g. `resize` and `scroll` events), always\n      // prefer the async Popper#update method\n      forceUpdate: function forceUpdate() {\n        if (isDestroyed) {\n          return;\n        }\n\n        var _state$elements = state.elements,\n            reference = _state$elements.reference,\n            popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n        // anymore\n\n        if (!areValidElements(reference, popper)) {\n          return;\n        } // Store the reference and popper rects to be read by modifiers\n\n\n        state.rects = {\n          reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n          popper: getLayoutRect(popper)\n        }; // Modifiers have the ability to reset the current update cycle. The\n        // most common use case for this is the `flip` modifier changing the\n        // placement, which then needs to re-run all the modifiers, because the\n        // logic was previously ran for the previous placement and is therefore\n        // stale/incorrect\n\n        state.reset = false;\n        state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n        // is filled with the initial data specified by the modifier. This means\n        // it doesn't persist and is fresh on each update.\n        // To ensure persistent data, use `${name}#persistent`\n\n        state.orderedModifiers.forEach(function (modifier) {\n          return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n        });\n\n        for (var index = 0; index < state.orderedModifiers.length; index++) {\n          if (state.reset === true) {\n            state.reset = false;\n            index = -1;\n            continue;\n          }\n\n          var _state$orderedModifie = state.orderedModifiers[index],\n              fn = _state$orderedModifie.fn,\n              _state$orderedModifie2 = _state$orderedModifie.options,\n              _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n              name = _state$orderedModifie.name;\n\n          if (typeof fn === 'function') {\n            state = fn({\n              state: state,\n              options: _options,\n              name: name,\n              instance: instance\n            }) || state;\n          }\n        }\n      },\n      // Async and optimistically optimized update – it will not be executed if\n      // not necessary (debounced to run at most once-per-tick)\n      update: debounce(function () {\n        return new Promise(function (resolve) {\n          instance.forceUpdate();\n          resolve(state);\n        });\n      }),\n      destroy: function destroy() {\n        cleanupModifierEffects();\n        isDestroyed = true;\n      }\n    };\n\n    if (!areValidElements(reference, popper)) {\n      return instance;\n    }\n\n    instance.setOptions(options).then(function (state) {\n      if (!isDestroyed && options.onFirstUpdate) {\n        options.onFirstUpdate(state);\n      }\n    }); // Modifiers have the ability to execute arbitrary code before the first\n    // update cycle runs. They will be executed in the same order as the update\n    // cycle. This is useful when a modifier adds some persistent data that\n    // other modifiers need to use, but the modifier is run after the dependent\n    // one.\n\n    function runModifierEffects() {\n      state.orderedModifiers.forEach(function (_ref) {\n        var name = _ref.name,\n            _ref$options = _ref.options,\n            options = _ref$options === void 0 ? {} : _ref$options,\n            effect = _ref.effect;\n\n        if (typeof effect === 'function') {\n          var cleanupFn = effect({\n            state: state,\n            name: name,\n            instance: instance,\n            options: options\n          });\n\n          var noopFn = function noopFn() {};\n\n          effectCleanupFns.push(cleanupFn || noopFn);\n        }\n      });\n    }\n\n    function cleanupModifierEffects() {\n      effectCleanupFns.forEach(function (fn) {\n        return fn();\n      });\n      effectCleanupFns = [];\n    }\n\n    return instance;\n  };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","import $ from './jquery';\nimport { getMessageLogger } from './internal/deprecation';\nimport { recomputeStyle } from './internal/animation';\nimport globalize from './internal/globalize';\n\nvar overflowEl;\n\n/**\n * Blanketing is pattern for hiding all page content from user when overlapping layer is open.\n *\n * This pattern is old and should be removed, but it has a lot of dependants:\n * - Layer, LayerManager\n * - Dialog2, Dialog1\n * - Dropdown2\n * - InlineDialog2\n *\n * Removal should be done as separate process with usage research and go through deprecation.\n */\n\n/**\n * Dims the screen using a blanket div\n * @param useShim deprecated, it is calculated by dim() now\n */\nfunction dim(useShim, zIndex) {\n    //if we're blanketing the page it means we want to hide the whatever is under the blanket from the screen readers as well\n    // eslint-disable-next-line no-unused-vars\n    function hasAriaHidden(element) {\n        return element.hasAttribute('aria-hidden');\n    }\n\n    // eslint-disable-next-line no-unused-vars\n    function isAuiLayer(element) {\n        return element.classList && element.classList.contains('aui-layer');\n    }\n\n    if (!overflowEl) {\n        overflowEl = document.body;\n    }\n\n    if (useShim === true) {\n        useShimDeprecationLogger();\n    }\n\n    const isBlanketShowing = !!dim.$dim && !dim.$dim[0].hasAttribute('hidden');\n\n    if (!!dim.$dim) {\n        dim.$dim.remove();\n        dim.$dim = null;\n    }\n\n    dim.$dim = $('<div aria-hidden=\"true\"></div>').addClass('aui-blanket');\n    dim.$dim.appendTo(document.body);\n\n    if (!isBlanketShowing) {\n        //recompute after insertion and before setting aria-hidden=false to ensure we calculate a difference in\n        //computed styles\n        recomputeStyle(dim.$dim);\n\n        dim.cachedOverflow = {\n            overflow: overflowEl.style.overflow,\n            overflowX: overflowEl.style.overflowX,\n            overflowY: overflowEl.style.overflowY,\n        };\n\n        overflowEl.style.overflowX = 'hidden';\n        overflowEl.style.overflowY = 'hidden';\n        overflowEl.style.overflow = 'hidden';\n    }\n\n    dim.$dim.prop('hidden', false);\n\n    if (zIndex) {\n        dim.$dim.css({ zIndex: zIndex });\n    }\n\n    return dim.$dim;\n}\n\n/**\n * Removes semitransparent DIV\n * @see dim\n */\nfunction undim() {\n    if (dim.$dim) {\n        dim.$dim[0].setAttribute('hidden', '');\n\n        if (overflowEl) {\n            overflowEl.style.overflow = dim.cachedOverflow.overflow;\n            overflowEl.style.overflowX = dim.cachedOverflow.overflowX;\n            overflowEl.style.overflowY = dim.cachedOverflow.overflowY;\n        }\n    }\n}\n\nconst useShimDeprecationLogger = getMessageLogger('useShim', {\n    extraInfo: 'useShim has no alternative as it is now calculated by dim().',\n});\n\nglobalize('dim', dim);\nglobalize('undim', undim);\n\nexport { dim, undim };\n","var ua = navigator.userAgent.toLowerCase();\nvar isIE = /msie/.test(ua);\nvar isWinXP = /windows nt 5.1/.test(ua);\nvar isWinVista = /windows nt 6.0/.test(ua);\nvar isWin7 = /windows nt 6.1/.test(ua);\nvar isMacOSX = /mac os x/.test(ua);\nvar doesSupportHtml5DateInput;\nvar doesSupportFocusWithin;\n\n/**\n * Layered elements can get obscured by <object>, <embed>, <select> or sometimes even <iframe>\n * on older versions of Windows + Internet Explorer.\n * From manual testing, all IE versions on Windows 7 appear to have the bug,\n * but no IE versions on Windows 8 have it.\n */\nexport function needsLayeringShim() {\n    return isIE && (isWinXP || isWinVista || isWin7);\n}\n\nexport function supportsVoiceOver() {\n    return isMacOSX;\n}\n\nexport function supportsDateField() {\n    if (typeof doesSupportHtml5DateInput === 'undefined') {\n        var el = document.createElement('input');\n        el.setAttribute('type', 'date');\n        doesSupportHtml5DateInput = el.type === 'date';\n    }\n    return doesSupportHtml5DateInput;\n}\n\nexport function supportsFocusWithin() {\n    if (typeof doesSupportFocusWithin === 'undefined') {\n        try {\n            document.querySelector(':focus-within');\n            doesSupportFocusWithin = true;\n            // eslint-disable-next-line no-unused-vars\n        } catch (e) {\n            doesSupportFocusWithin = false;\n        }\n    }\n    return doesSupportFocusWithin;\n}\n","import globalize from './internal/globalize';\n\nvar uniqueID;\nvar uniqueIDstring;\nvar uniqueIDcounter = 0;\n\n/**\n * Generate a unique ID string, checking the ID is not present in the DOM before\n * returning. Note uniqueID, uniqueIDstring, uniqueIDcounter = 0; set at top of\n * file.\n *\n * @param {String} [prefix] String to prepend to ID instead of default AUI prefix.\n *\n * @returns {String}\n */\nfunction generateUniqueId(prefix) {\n    uniqueID = uniqueIDcounter++ + '';\n    uniqueIDstring = prefix ? prefix + uniqueID : 'aui-uid-' + uniqueID;\n\n    if (!document.getElementById(uniqueIDstring)) {\n        return uniqueIDstring;\n    } else {\n        uniqueIDstring = uniqueIDstring + '-' + new Date().getTime();\n\n        if (!document.getElementById(uniqueIDstring)) {\n            return uniqueIDstring;\n        } else {\n            throw new Error('Timestamped fallback ID \"' + uniqueIDstring + '\" exists.');\n        }\n    }\n}\n\nglobalize('id', generateUniqueId);\n\nexport default generateUniqueId;\n","import $ from 'jquery';\n// We provide the value from the import statement last, just in case jQuery or Zepto have been called with noConflict previously.\nexport default window.jQuery || window.Zepto || $;\n","const NAMESPACE = 'AJS';\nconst I18N_OBJECT_NAME = 'I18n';\n\nfunction initNamespace() {\n    if (typeof window[NAMESPACE] !== 'object') {\n        window[NAMESPACE] = {};\n    }\n}\n\n/**\n * Makes given value available globally under window[NAMESPACE][name] attribute.\n * Keep in mind that this is needed for p2-plugin where chunks of AUI\n * can be loaded separately.\n *\n * In order for global namespace to work in `aui.prototyping.js` and\n * `aui.prototyping.nodeps.js` the proper exports need to be added to:\n * `packages/core/entry/aui.batch.prototyping.js`\n *\n * @param {string} name Name of the attribute\n * @param {any} value Value to expose globally\n * @returns exposed value\n */\nexport default function globalize(name, value) {\n    initNamespace();\n\n    return (window[NAMESPACE][name] = value);\n}\n\nexport function globalizeI18n(localI18n) {\n    initNamespace();\n\n    if (typeof window[NAMESPACE][I18N_OBJECT_NAME] !== 'object') {\n        window[NAMESPACE][I18N_OBJECT_NAME] = {};\n    }\n\n    const globalI18n = window[NAMESPACE][I18N_OBJECT_NAME];\n\n    for (const property in localI18n) {\n        // AUI-5431 Add to global namespace, but do not override what is set by the WRM\n        if (typeof globalI18n[property] === 'undefined') {\n            globalI18n[property] = localI18n[property];\n        }\n    }\n\n    return globalI18n;\n}\n","import skate from 'skatejs';\nimport { onChildrenChange } from '../internal/detect-children-change';\nimport jQuery from 'jquery';\n\nexport function createFormsComponentBody(type) {\n    let unsub;\n\n    return {\n        type: skate.type.CLASSNAME,\n        attached: function (el) {\n            onChildrenChange(el, (unsubscribe) => {\n                // Store function that stops subscription\n                unsub = unsubscribe;\n\n                const innerCheckboxList = jQuery(`input[type=${type}]`, el);\n\n                innerCheckboxList.each(function (i, radio) {\n                    jQuery('<span class=\"aui-form-glyph\"></span>').insertAfter(radio);\n                });\n\n                const isInsertedAfterChange = innerCheckboxList.length > 0;\n                if (isInsertedAfterChange) {\n                    unsub();\n                }\n            });\n        },\n        detached: function (el) {\n            jQuery('.aui-form-glyph', el).remove();\n            if (unsub) {\n                unsub();\n            }\n        },\n    };\n}\n","function isChildrenChanged(mutationList) {\n    for (const mutation of mutationList) {\n        if (mutation.type === 'childList') {\n            return true;\n        }\n    }\n    return false;\n}\n\n/***\n * Executes callback every time element children change. Called once initially.\n *\n * ***Make sure to use unsubscribe callback to free resources occupied for detection***\n *\n * @param element Element whose children should be monitored\n * @param callback Function to be called when children change happened. Gets unsubscribe function as argument.\n */\nexport function onChildrenChange(element, callback) {\n    let isCompleteOnInit = false;\n\n    callback(() => {\n        isCompleteOnInit = true;\n    });\n\n    if (isCompleteOnInit) {\n        return;\n    }\n\n    const observer = new MutationObserver((mutationList) => {\n        if (isChildrenChanged(mutationList)) {\n            callback(() => observer.disconnect());\n        }\n    });\n\n    observer.observe(element, { childList: true });\n}\n","import $ from './jquery';\nimport globalize from './internal/globalize';\nimport './forms/custom-checkbox';\nimport './forms/custom-radio';\n\n/**\n * Enables the specified form element.\n *\n * @param {Element} el The element to enable.\n * @param {Boolean} b The flag setting enabled / disabled.\n *\n * @returns {jQuery}\n */\nfunction enable(el, b) {\n    var $el = $(el);\n\n    if (typeof b === 'undefined') {\n        b = true;\n    }\n\n    return $el.each(function () {\n        this.disabled = !b;\n    });\n}\n\n/**\n * Forms: Inline Help - toggles visibility of inline help content.\n *\n * @method inlineHelp\n * @namespace AJS\n * @for AJS\n */\nfunction inlineHelp() {\n    $(document).on('click', '.icon-inline-help', function () {\n        var $t = $(this).siblings('.field-help');\n        if ($t.hasClass('hidden')) {\n            $t.removeClass('hidden');\n        } else {\n            $t.addClass('hidden');\n        }\n    });\n}\n\nglobalize('enable', enable);\nglobalize('inlineHelp', inlineHelp);\n\nexport { enable, inlineHelp };\n","import globalize from './globalize';\n\nfunction polyfillConsole(prop) {\n    return function () {\n        if (typeof console !== 'undefined' && console[prop]) {\n            Function.prototype.apply.call(console[prop], console, arguments);\n        }\n    };\n}\n\nvar log = polyfillConsole('log');\nvar warn = polyfillConsole('warn');\nvar error = polyfillConsole('error');\n\nglobalize('error', error);\nglobalize('log', log);\nglobalize('warn', warn);\n\nexport { log, warn, error };\n","import skate from 'skatejs';\nimport { createFormsComponentBody } from './create-forms-component-body';\n\n/**\n * Allows us to add a new DOM element for rendering ADG styled checkbox glyphs,\n * so we can get our desired aesthetic without having to rely on a specific markup pattern.\n */\nskate('checkbox', createFormsComponentBody('checkbox'));\n","import skate from 'skatejs';\nimport { createFormsComponentBody } from './create-forms-component-body';\n\n/**\n * Allows us to add a new DOM element for rendering ADG styled radio glyphs,\n * so we can get our desired aesthetic without having to rely on a specific markup pattern.\n */\nskate('radio', createFormsComponentBody('radio'));\n","import globalize from './internal/globalize';\nimport * as logger from './internal/log';\n\n/* eslint brace-style: off, complexity:off, eqeqeq:off, max-depth:off, no-cond-assign:off, no-unused-vars:off */\n\n/**\n * Replaces tokens in a string with arguments, similar to Java's MessageFormat.\n * Tokens are in the form {0}, {1}, {2}, etc.\n *\n * This version also provides support for simple choice formats (excluding floating point numbers) of the form\n * {0,choice,0#0 issues|1#1 issue|1<{0,number} issues}\n *\n * Number format is currently not implemented, tokens of the form {0,number} will simply be printed as {0}\n *\n * @method format\n * @param message the message to replace tokens in\n * @param arg (optional) replacement value for token {0}, with subsequent arguments being {1}, etc.\n * @return {String} the message with the tokens replaced\n * @usage formatString(\"This is a {0} test\", \"simple\");\n */\nfunction formatString(message) {\n    var apos = /'(?!')/g; // founds \"'\", but not \"''\" // TODO: does not work for floating point numbers!\n    var simpleFormat = /^\\d+$/;\n    var numberFormat = /^(\\d+),number$/; // TODO: incomplete, as doesn't support floating point numbers\n    var choiceFormat = /^(\\d+),choice,(.+)/;\n    var choicePart = /^(\\d+)([#<])(.+)/;\n    // we are caching RegExps, so will not spend time on recreating them on each call\n\n    // formats a value, currently choice and simple replacement are implemented, proper\n    var getParamValue = function (format, args) {\n        // simple substitute\n        var res = '';\n\n        var match;\n        if ((match = format.match(simpleFormat))) {\n            // TODO: heavy guns for checking whether format is a simple number...\n            res = args.length > ++format ? args[format] : ''; // use the argument as is, or use '' if not found\n        }\n\n        // number format\n        else if ((match = format.match(numberFormat))) {\n            // TODO: doesn't actually format the number...\n            res = args.length > ++match[1] ? args[match[1]] : '';\n        }\n\n        // choice format\n        else if ((match = format.match(choiceFormat))) {\n            // format: \"0,choice,0#0 issues|1#1 issue|1<{0,number} issues\"\n            // match[0]: \"0,choice,0#0 issues|1#1 issue|1<{0,number} issues\"\n            // match[1]: \"0\"\n            // match[2]: \"0#0 issues|1#1 issue|1<{0,number} issues\"\n\n            // get the argument value we base the choice on\n            var value = args.length > ++match[1] ? args[match[1]] : null;\n            if (value !== null) {\n                // go through all options, checking against the number, according to following formula,\n                // if X < the first entry then the first entry is returned, if X > last entry, the last entry is returned\n                //\n                //    X matches j if and only if limit[j] <= X < limit[j+1]\n                //\n                var options = match[2].split('|');\n                var isInvalidFormat = false;\n                var prevOptionValue = null; // holds last passed option\n\n                for (var i = 0; i < options.length; i++) {\n                    // option: \"0#0 issues\"\n                    // part[0]: \"0#0 issues\"\n                    // part[1]: \"0\"\n                    // part[2]: \"#\"\n                    // part[3]\" \"0 issues\";\n                    var parts = options[i].match(choicePart);\n\n                    if (parts == null) {\n                        isInvalidFormat = true;\n                        continue;\n                    }\n                    // if value is smaller, we take the previous value, or the current if no previous exists\n                    var argValue = parseInt(parts[1], 10);\n                    if (value < argValue) {\n                        if (prevOptionValue) {\n                            res = prevOptionValue;\n                            break;\n                        } else {\n                            res = parts[3];\n                            break;\n                        }\n                    }\n                    // if value is equal the condition, and the match is equality match we accept it\n                    if (value == argValue && parts[2] == '#') {\n                        res = parts[3];\n                        break;\n                    } else {\n                        // value is greater the condition, fall through to next iteration\n                    }\n\n                    // check whether we are the last option, in which case accept it even if the option does not match\n                    if (i == options.length - 1) {\n                        res = parts[3];\n                    }\n\n                    // retain current option\n                    prevOptionValue = parts[3];\n                }\n\n                if (isInvalidFormat) {\n                    logger.error(\n                        'The format \"' + format + '\" from message \"' + message + '\" is invalid.'\n                    );\n                }\n\n                // run result through format, as the parts might contain substitutes themselves\n                var formatArgs = [res].concat(Array.prototype.slice.call(args, 1));\n                res = formatString.apply(null, formatArgs);\n            }\n        }\n        return res;\n    };\n\n    // drop in replacement for the token regex\n    // splits the message to return the next accurance of a i18n placeholder.\n    // Does not use regexps as we need to support nested placeholders\n    // text between single ticks ' are ignored\n    var _performTokenRegex = function (message) {\n        var tick = false;\n        var openIndex = -1;\n        var openCount = 0;\n        for (var i = 0; i < message.length; i++) {\n            // handle ticks\n            var c = message.charAt(i);\n            if (c == \"'\") {\n                // toggle\n                tick = !tick;\n            }\n            // skip if we are between ticks\n            if (tick) {\n                continue;\n            }\n            // check open brackets\n            if (c === '{') {\n                if (openCount === 0) {\n                    openIndex = i;\n                }\n                openCount++;\n            } else if (c === '}') {\n                if (openCount > 0) {\n                    openCount--;\n                    if (openCount === 0) {\n                        // we found a bracket match - generate the result array (\n                        var match = [];\n                        match.push(message.substring(0, i + 1)); // from begin to match\n                        match.push(message.substring(0, openIndex)); // everything until match start\n                        match.push(message.substring(openIndex + 1, i)); // matched content\n                        return match;\n                    }\n                }\n            }\n        }\n        return null;\n    };\n\n    var _formatString = function (message) {\n        var args = arguments;\n        var res = '';\n\n        if (!message) {\n            return res;\n        }\n\n        var match = _performTokenRegex(message);\n\n        while (match) {\n            // reduce message to string after match\n            message = message.substring(match[0].length);\n\n            // add value before match to result\n            res += match[1].replace(apos, '');\n\n            // add formatted parameter\n            res += getParamValue(match[2], args);\n\n            // check for next match\n            match = _performTokenRegex(message); //message.match(token);\n        }\n        // add remaining message to result\n        res += message.replace(apos, '');\n        return res;\n    };\n\n    return _formatString.apply(null, arguments);\n}\n\nglobalize('format', formatString);\n\nexport default formatString;\n","import globalize from './internal/globalize';\n\n// @note: this value is set via webpack and gulp\n// eslint-disable-next-line\nvar version = AUI_VERSION;\n\nglobalize('version', version);\n\nexport default version;\n","import $ from './jquery';\nimport * as logger from './internal/log';\nimport globalize from './internal/globalize';\n\nconst EMPTY_SELECTOR = false;\nconst $target = $(window);\n\n/**\n * Binds events to the window object. See jQuery bind documentation for more\n * details. Exceptions are caught and logged.\n */\nfunction bind(eventType, eventData, handler) {\n    try {\n        if (typeof handler === 'function') {\n            return $target.on(eventType, EMPTY_SELECTOR, eventData, handler);\n        } else {\n            return $target.on(eventType, EMPTY_SELECTOR, eventData);\n        }\n    } catch (e) {\n        logger.log('error while binding: ', e.message);\n    }\n}\n\n/**\n * Unbinds event handlers from the window object. See jQuery unbind\n * documentation for more details. Exceptions are caught and logged.\n */\nfunction unbind(eventType, handler) {\n    try {\n        return $target.off(eventType, handler);\n    } catch (e) {\n        logger.log('error while unbinding: ', e.message);\n    }\n}\n\n/**\n * Triggers events on the window object. See jQuery trigger documentation for\n * more details. Exceptions are caught and logged.\n */\nfunction trigger(eventType, extraParameters) {\n    try {\n        return $target.trigger(eventType, extraParameters);\n    } catch (e) {\n        logger.log('error while triggering: ' + e.message);\n    }\n}\n\nglobalize('bind', bind);\nglobalize('trigger', trigger);\nglobalize('unbind', unbind);\n\nexport { bind, unbind, trigger };\n","import globalize from './internal/globalize';\n\nconst special = {\n    '<': '&lt;',\n    '>': '&gt;',\n    '&': '&amp;',\n    '\"': '&quot;',\n    \"'\": '&#39;',\n    '`': '&#96;',\n};\n\nconst expr = new RegExp(`[${Object.keys(special).join('')}]`, 'g');\n\nfunction escapeHtml(str) {\n    return str.replace(expr, (str) => special[str]);\n}\n\nglobalize('escapeHtml', escapeHtml);\n\nexport default escapeHtml;\n","/**\n * Force a re-compute of the style of an element.\n *\n * This is useful for CSS transitions and animations that need computed style changes to occur.\n * CSS transitions will fire when the computed value of the property they are transitioning changes.\n * This may not occur if the style changes get batched into one style change event by the browser.\n * We can force the browser to recognise the two different computed values by calling this function when we want it\n * to recompute the styles.\n *\n * For example, consider a transition on the opacity property.\n *\n * With recomputeStyle:\n * $parent.append($el); //opacity=0\n * recomputeStyle($el);\n * $el.addClass('visible'); //opacity=1\n * //Browser calculates value of opacity=0, and then transitions it to opacity=1\n *\n * Without recomputeStyle:\n * $parent.append($el); //opacity=0\n * $el.addClass('visible'); //opacity=1\n * //Browser calculates value of opacity=1 but no transition\n *\n * @param el The DOM or jQuery element for which style should be recomputed\n */\nfunction recomputeStyle(el) {\n    el = el.jquery ? el[0] : el;\n    window.getComputedStyle(el, null).getPropertyValue('left');\n}\n\nexport { recomputeStyle };\n","import globalize from './internal/globalize';\n\nvar keyCode = {\n    ALT: 18,\n    BACKSPACE: 8,\n    CAPS_LOCK: 20,\n    COMMA: 188,\n    COMMAND: 91,\n\n    // cmd\n    COMMAND_LEFT: 91,\n    COMMAND_RIGHT: 93,\n    LEFT_SQUARE_BRACKET: 91, //This is 91 for keypress and 219 for keydown/keyup\n    CONTROL: 17,\n    DELETE: 46,\n    DOWN: 40,\n    END: 35,\n    ENTER: 13,\n    ESCAPE: 27,\n    HOME: 36,\n    INSERT: 45,\n    LEFT: 37,\n\n    // right cmd\n    MENU: 93,\n    NUMPAD_ADD: 107,\n    NUMPAD_DECIMAL: 110,\n    NUMPAD_DIVIDE: 111,\n    NUMPAD_ENTER: 108,\n    NUMPAD_MULTIPLY: 106,\n    NUMPAD_SUBTRACT: 109,\n    PAGE_DOWN: 34,\n    PAGE_UP: 33,\n    PERIOD: 190,\n    RIGHT: 39,\n    SHIFT: 16,\n    SPACE: 32,\n    TAB: 9,\n    UP: 38,\n\n    // cmd\n    WINDOWS: 91,\n};\n\nglobalize('keyCode', keyCode);\n\nexport default keyCode;\n","export default function (name, fn) {\n    if (window.define) {\n        var alias = window.define;\n        alias(name, [], function () {\n            return fn;\n        });\n    }\n    return fn;\n}\n","import skate from 'skatejs';\n\nconst auiSkate = skate.noConflict();\n\nexport default auiSkate;\n","function state(element) {\n    return {\n        /**\n         * sets an internal state on a component element\n         * @param element the element to which the state will be added\n         * @param stateName the name of the state\n         * @param stateValue the value that the state will be changed to\n         */\n        set: function (stateName, stateValue) {\n            if (element._state === undefined) {\n                element._state = {};\n            }\n\n            element._state[stateName] = stateValue;\n        },\n\n        /**\n         * gets an internal state on a component element\n         * @param element the element to which the state will be added\n         * @param stateName the name of the state\n         */\n        get: function (stateName) {\n            if (element._state) {\n                return element._state[stateName];\n            }\n        },\n    };\n}\n\nexport default state;\n","import $ from './jquery';\nimport keyCode from './key-code';\nimport amdify from './internal/amdify';\nimport skate from './internal/skate';\nimport state from './internal/state';\nimport { warn } from './internal/log';\n\nexport function getTrigger(element) {\n    return state(element).get('last-trigger') || findControllers(element)[0];\n}\n\nexport function setTrigger(element, trigger) {\n    var validTrigger = trigger && trigger.nodeType && trigger.nodeType === 1;\n    return state(element).set('last-trigger', validTrigger ? trigger : false);\n}\n\nexport function hasTrigger(element) {\n    return !!getTrigger(element);\n}\n\nexport function doIfTrigger(element, callback) {\n    var trigger = getTrigger(element);\n\n    if (trigger) {\n        callback(trigger);\n    }\n}\n\nexport function forEachTrigger(element, callback) {\n    return Array.prototype.forEach.call(findControllers(element), callback);\n}\n\nfunction isNestedAnchor(trigger, target) {\n    var $closestAnchor = $(target).closest('a[href]', trigger);\n    return !!$closestAnchor.length && $closestAnchor[0] !== trigger;\n}\n\nfunction findControllers(element) {\n    const frames = window.frames;\n    const selector = `[aria-controls=\"${element.id}\"]`;\n\n    let controllers = [];\n    let someFramesAreCrossOrigin = false;\n    for (let i = 0; i < frames.length; i++) {\n        try {\n            let nodeList = frames[i].document.querySelectorAll(selector);\n            controllers = controllers.concat(Array.prototype.slice.apply(nodeList));\n            // eslint-disable-next-line no-unused-vars\n        } catch (e) {\n            // Silently catch DOM exceptions related to accessing cross-origin frames\n            someFramesAreCrossOrigin = true;\n        }\n    }\n    const currentDocumentControllers = document.querySelectorAll(selector);\n    const allControllers = Array.prototype.slice\n        .apply(currentDocumentControllers)\n        .concat(controllers);\n    if (allControllers.length === 0 && someFramesAreCrossOrigin === true) {\n        warn(\n            [\n                `No triggers found for element (${element.id}) in iframes from the same origin.`,\n                'However some iframes in this document are cross-origin.',\n                'The trigger-element relations crossing the origin boundary are not supported.',\n            ].join(' ')\n        );\n    }\n    return allControllers;\n}\n\nfunction findControlled(trigger) {\n    return document.getElementById(trigger.getAttribute('aria-controls'));\n}\n\nfunction isEnabled(element) {\n    return element.getAttribute('aria-disabled') !== 'true';\n}\n\nfunction triggerMessage(trigger, e) {\n    if (isEnabled(trigger)) {\n        var component = findControlled(trigger);\n        if (component && component.message) {\n            component.message(e);\n        }\n    }\n}\n\n/**\n * Converts native or jQuery events in to a \"message\" object.\n * Basically helps us keep message types consistent.\n */\nfunction msg(e, type) {\n    const { target, currentTarget, relatedTarget } = e;\n    const { keyCode, which } = e;\n    return {\n        type,\n        data: type === 'keydown' ? which || keyCode : undefined,\n        target,\n        currentTarget,\n        relatedTarget,\n        preventDefault: () => e.preventDefault(),\n    };\n}\n\nfunction focusingToControlledElement(trigger, e) {\n    let relatedTarget = e.relatedTarget;\n    // relatedTarget is always null in IE11 but activeElement is set to correct value\n    if (!relatedTarget) {\n        relatedTarget = document.activeElement;\n    }\n    const $component = $(findControlled(trigger));\n    return $component.find(relatedTarget).length > 0;\n}\n\nconst events = {\n    click(trigger, e) {\n        if (!isNestedAnchor(trigger, e.target)) {\n            triggerMessage(trigger, e);\n            e.preventDefault();\n        }\n    },\n    keydown(trigger, e) {\n        const key = e.data;\n        if (key === keyCode.ENTER || key === keyCode.SPACE) {\n            e.preventDefault();\n            e.type = 'click';\n            events.click(trigger, e);\n        }\n    },\n    mouseenter(trigger, e) {\n        triggerMessage(trigger, e);\n    },\n    mouseleave(trigger, e) {\n        triggerMessage(trigger, e);\n    },\n    focus(trigger, e) {\n        triggerMessage(trigger, e);\n    },\n    blur(trigger, e) {\n        if (focusingToControlledElement(trigger, e)) {\n            return;\n        }\n        triggerMessage(trigger, e);\n    },\n};\n\nObject.keys(events).forEach(function (name) {\n    const handler = events[name];\n    $(document).on(`${name}.aui-trigger`, '[data-aui-trigger]', function (e) {\n        handler(e.currentTarget, msg(e, name));\n    });\n});\n\nskate('data-aui-trigger', {\n    type: skate.type.ATTRIBUTE,\n    prototype: {\n        disable: function () {\n            this.setAttribute('aria-disabled', 'true');\n        },\n        enable: function () {\n            this.setAttribute('aria-disabled', 'false');\n        },\n        isEnabled: function () {\n            return isEnabled(this);\n        },\n    },\n});\n\namdify('aui/trigger');\n","import $ from '../jquery';\n\n/**\n * @param {string} name The name of the widget to use in any messaging.\n * @param {function(new:{ $el: jQuery }, ?jQuery, ?Object)} Ctor\n *     A constructor which will only ever be called with \"new\". It must take a JQuery object as the first\n *     parameter, or generate one if not provided. The second parameter will be a configuration object.\n *     The returned object must have an $el property and a setOptions function.\n * @constructor\n */\nexport default function (name, Ctor) {\n    var dataAttr = '_aui-widget-' + name;\n    return function (selectorOrOptions, maybeOptions) {\n        var selector;\n        var options;\n        if ($.isPlainObject(selectorOrOptions)) {\n            options = selectorOrOptions;\n        } else {\n            selector = selectorOrOptions;\n            options = maybeOptions;\n        }\n\n        var $el = selector && $(selector);\n\n        var widget;\n        if (!$el || !$el.data(dataAttr)) {\n            widget = new Ctor($el, options || {});\n            $el = widget.$el;\n            $el.data(dataAttr, widget);\n        } else {\n            widget = $el.data(dataAttr);\n            // options are discarded if $el has already been constructed\n        }\n\n        return widget;\n    };\n}\n","import $ from './jquery';\nimport { dim, undim } from './blanket';\nimport FocusManager from './focus-manager';\nimport { getTrigger, hasTrigger } from './trigger';\nimport globalize from './internal/globalize';\nimport keyCode from './key-code';\nimport widget from './internal/widget';\n\nexport const EVENT_PREFIX = '_aui-internal-layer-';\nconst GLOBAL_EVENT_PREFIX = '_aui-internal-layer-global-';\nconst LAYER_EVENT_PREFIX = 'aui-layer-';\nconst AUI_EVENT_PREFIX = 'aui-';\nconst ATTR_MODAL = 'modal';\nconst ATTR_DOM_CONTAINER = 'dom-container';\nconst ZINDEX_AUI_LAYER_MIN = 3000;\n\nvar $doc = $(document);\n\n// AUI-3708 - Abstracted to reflect code implemented upstream.\nfunction isTransitioning(el, prop) {\n    var transition = window.getComputedStyle(el).transitionProperty;\n    return transition ? transition.indexOf(prop) > -1 : false;\n}\n\nfunction onTransitionEnd(el, prop, func, once) {\n    function handler(e) {\n        if (prop !== e.propertyName) {\n            return;\n        }\n\n        func.call(el);\n\n        if (once) {\n            el.removeEventListener('transitionend', handler);\n        }\n    }\n\n    if (isTransitioning(el, prop)) {\n        el.addEventListener('transitionend', handler);\n    } else {\n        func.call(el);\n    }\n}\n\nfunction oneTransitionEnd(el, prop, func) {\n    onTransitionEnd(el, prop, func, true);\n}\n// end AUI-3708\n\n/**\n * @return {bool} Returns false if at least one of the event handlers called .preventDefault(). Returns true otherwise.\n */\nfunction triggerEvent($el, deprecatedName, newNativeName) {\n    var e1 = $.Event(EVENT_PREFIX + deprecatedName);\n    var e2 = $.Event(GLOBAL_EVENT_PREFIX + deprecatedName);\n    // TODO: Remove this 'aui-layer-' prefixed event once it is no longer used by inline dialog and dialog2.\n    var nativeEvent = new CustomEvent(LAYER_EVENT_PREFIX + newNativeName, {\n        bubbles: true,\n        cancelable: true,\n    });\n    var nativeEvent2 = new CustomEvent(AUI_EVENT_PREFIX + newNativeName, {\n        bubbles: true,\n        cancelable: true,\n    });\n\n    $el.trigger(e1);\n    $el.trigger(e2, [$el]);\n    $el[0].dispatchEvent(nativeEvent);\n    $el[0].dispatchEvent(nativeEvent2);\n\n    return (\n        !e1.isDefaultPrevented() &&\n        !e2.isDefaultPrevented() &&\n        !nativeEvent.defaultPrevented &&\n        !nativeEvent2.defaultPrevented\n    );\n}\n\nfunction Layer(selector) {\n    this.$el = $(selector || '<div class=\"aui-layer\"></div>');\n    this.el = this.$el[0];\n    this.$el.addClass('aui-layer');\n}\n\nfunction getAttribute(el, name) {\n    return el.getAttribute(name) || el.getAttribute('data-aui-' + name);\n}\n\nLayer.prototype = {\n    /**\n     * Returns the layer below the current layer if it exists.\n     *\n     * @returns {jQuery | undefined}\n     */\n    below: function () {\n        return LayerManager.global.item(LayerManager.global.indexOf(this.$el) - 1);\n    },\n\n    /**\n     * Returns the layer above the current layer if it exists.\n     *\n     * @returns {jQuery | undefined}\n     */\n    above: function () {\n        return LayerManager.global.item(LayerManager.global.indexOf(this.$el) + 1);\n    },\n\n    /**\n     * Sets the width and height of the layer.\n     *\n     * @param {number} width The width to set.\n     * @param {number} height The height to set.\n     *\n     * @returns {Layer}\n     */\n    changeSize: function (width, height) {\n        this.$el.css('width', width);\n        this.$el.css('height', height === 'content' ? '' : height);\n        return this;\n    },\n\n    /**\n     * Binds a layer event.\n     *\n     * @param {String} event The event name to listen to.\n     * @param {Function} fn The event handler.\n     *\n     * @returns {Layer}\n     */\n    on: function (event, fn) {\n        this.$el.on(EVENT_PREFIX + event, fn);\n        return this;\n    },\n\n    /**\n     * Unbinds a layer event.\n     *\n     * @param {String} event The event name to unbind=.\n     * @param {Function} fn Optional. The event handler.\n     *\n     * @returns {Layer}\n     */\n    off: function (event, fn) {\n        this.$el.off(EVENT_PREFIX + event, fn);\n        return this;\n    },\n\n    /**\n     * Shows the layer.\n     *\n     * The layer is added to LayerManager stack.\n     *\n     * @returns {Layer}\n     */\n    show: function () {\n        if (this.isVisible() || LayerManager.global.indexOf(this.$el) > -1) {\n            // do nothing if already shown\n            return this;\n        }\n\n        if (!triggerEvent(this.$el, 'beforeShow', 'show')) {\n            return this;\n        }\n\n        // AUI-3708\n        // Ensures that the display property is removed if it's been added\n        // during hiding.\n        if (this.$el.css('display') === 'none') {\n            this.$el.css('display', '');\n        }\n\n        LayerManager.global.push(this.$el);\n\n        return this;\n    },\n\n    /**\n     * Hides the layer.\n     *\n     * The layer is removed from LayerManager stack.\n     *\n     * @returns {Layer}\n     */\n    hide: function () {\n        if (!this.isVisible()) {\n            // do nothing if already hidden\n            return this;\n        }\n\n        // AUI-3708\n        const thisLayer = this;\n        oneTransitionEnd(this.$el.get(0), 'opacity', function () {\n            if (!thisLayer.isVisible()) {\n                this.style.display = 'none';\n            }\n        });\n\n        LayerManager.global.popUntil(this.$el, true);\n\n        return this;\n    },\n\n    /**\n     * Checks to see if the layer is visible.\n     *\n     * @returns {Boolean}\n     */\n    isVisible: function () {\n        return this.$el.data('_aui-layer-shown') === true;\n    },\n\n    /**\n     * Removes the layer and cleans up internal state.\n     *\n     * @returns {undefined}\n     */\n    remove: function () {\n        this.hide();\n        this.$el.remove();\n        this.$el = null;\n        this.el = null;\n    },\n\n    /**\n     * Returns whether or not the layer is blanketed.\n     *\n     * @returns {Boolean}\n     */\n    isBlanketed: function () {\n        return this.el.dataset.auiBlanketed === 'true';\n    },\n\n    /**\n     * Returns whether or not the layer is persistent.\n     *\n     * @returns {Boolean}\n     */\n    isPersistent: function () {\n        var modal = getAttribute(this.el, ATTR_MODAL);\n        var isPersistent = this.el.hasAttribute('persistent');\n\n        return modal === 'true' || isPersistent;\n    },\n    /**\n     * Returns element used to attach the component to onto render.\n     *\n     * Looks for a selector in specified attribute and returns Element matching that selector.\n     * If attribute is set but the selector matches multiple elements - it will default to first available match.\n     * If attribute is set but the selector does not match to any existing elements it will default to document.body\n     * If the attribute is not set it will return null\n     *\n     * @returns {(Element|null)}\n     */\n    getDOMContainer: function () {\n        let container = getAttribute(this.el, ATTR_DOM_CONTAINER);\n        if (container) {\n            container = document.querySelector(container) || document.body;\n        }\n        return container;\n    },\n\n    _hideLayer: function (triggerBeforeEvents) {\n        if (triggerBeforeEvents) {\n            if (!triggerEvent(this.$el, 'beforeHide', 'hide')) {\n                return false;\n            }\n        }\n\n        if (this.isPersistent() || this.isBlanketed()) {\n            FocusManager.global.exit(this.$el);\n        }\n\n        // don't remove via jquery; that would cause this method to get re-called once or twice more :\\\n        this.el.removeAttribute('open');\n        this.$el.removeData('_aui-layer-shown');\n        this.$el.css('z-index', this.$el.data('_aui-layer-cached-z-index') || '');\n        this.$el.data('_aui-layer-cached-z-index', '');\n        this.$el.trigger(EVENT_PREFIX + 'hide');\n        this.$el.trigger(GLOBAL_EVENT_PREFIX + 'hide', [this.$el]);\n        return true;\n    },\n\n    _showLayer: function (zIndex) {\n        let domContainer = this.getDOMContainer();\n        if (this.isBlanketed() || !!domContainer) {\n            let parent = domContainer || 'body';\n\n            if (!this.$el.parent().is(parent)) {\n                this.$el.appendTo(parent);\n            }\n        }\n\n        this.$el.data('_aui-layer-shown', true);\n        this.$el.data('_aui-layer-cached-z-index', this.$el.css('z-index'));\n        this.$el.css('z-index', zIndex);\n        this.el.removeAttribute('hidden');\n        this.el.setAttribute('open', '');\n\n        if (this.isBlanketed()) {\n            FocusManager.global.enter(this.$el);\n        }\n\n        this.$el.trigger(EVENT_PREFIX + 'show');\n        this.$el.trigger(GLOBAL_EVENT_PREFIX + 'show', [this.$el]);\n    },\n};\n\nvar createLayer = widget('layer', Layer);\n\ncreateLayer.on = function (eventName, selector, fn) {\n    $doc.on(GLOBAL_EVENT_PREFIX + eventName, selector, fn);\n    return this;\n};\n\ncreateLayer.off = function (eventName, selector, fn) {\n    $doc.off(GLOBAL_EVENT_PREFIX + eventName, selector, fn);\n    return this;\n};\n\n// Layer Manager\n// -------------\n\n/**\n * Manages layers.\n *\n * There is a single global layer manager.\n * Additional instances can be created however this should generally only be used in tests.\n *\n * Layers are added by the push($el) method. Layers are removed by the\n * popUntil($el) method.\n *\n * popUntil's contract is that it pops all layers above & including the given\n * layer. This is used to support popping multiple layers.\n * Say we were showing a dropdown inside an inline dialog inside a dialog - we\n * have a stack of dialog layer, inline dialog layer, then dropdown layer. Calling\n * popUntil(dialog.$el) would hide all layers above & including the dialog.\n */\n\nfunction topIndexWhere(layerArr, fn) {\n    var i = layerArr.length;\n\n    while (i--) {\n        if (fn(layerArr[i])) {\n            return i;\n        }\n    }\n\n    return -1;\n}\n\nfunction layerIndex(layerArr, $el) {\n    return topIndexWhere(layerArr, function ($layer) {\n        return $layer[0] === $el[0];\n    });\n}\n\nfunction topBlanketedIndex(layerArr) {\n    return topIndexWhere(layerArr, function ($layer) {\n        return createLayer($layer).isBlanketed();\n    });\n}\n\nfunction nextZIndex(layerArr) {\n    var _nextZIndex;\n\n    if (layerArr.length) {\n        var $topEl = layerArr[layerArr.length - 1];\n        var zIndex = parseInt($topEl.css('z-index'), 10);\n        _nextZIndex = (isNaN(zIndex) ? 0 : zIndex) + 100;\n    } else {\n        _nextZIndex = 0;\n    }\n\n    return Math.max(ZINDEX_AUI_LAYER_MIN, _nextZIndex);\n}\n\nfunction updateBlanket(stack, oldBlanketIndex) {\n    var newTopBlanketedIndex = topBlanketedIndex(stack);\n\n    if (oldBlanketIndex !== newTopBlanketedIndex) {\n        if (newTopBlanketedIndex > -1) {\n            dim(false, stack[newTopBlanketedIndex].css('z-index') - 20);\n        } else {\n            undim();\n        }\n    }\n}\n\nfunction popLayers(stack, stopIndex, forceClosePersistent, triggerBeforeEvents = true) {\n    if (stopIndex < 0) {\n        return [false, null];\n    }\n\n    var $layer;\n    for (var a = stack.length - 1; a >= stopIndex; a--) {\n        $layer = stack[a];\n        var layer = createLayer($layer);\n\n        if (forceClosePersistent || !layer.isPersistent()) {\n            if (!layer._hideLayer(triggerBeforeEvents)) {\n                return [false, $layer];\n            }\n            stack.splice(a, 1);\n        }\n    }\n    return [true, $layer];\n}\n\nfunction getParentLayer(layer) {\n    var trigger = getTrigger(layer);\n\n    if (trigger) {\n        return $(trigger).closest('.aui-layer').get(0);\n    }\n}\n\nfunction LayerManager() {\n    this._stack = [];\n}\n\nLayerManager.prototype = {\n    /**\n     * Pushes a layer onto the stack. The same element cannot be opened as a layer multiple times - if the given\n     * element is already an open layer, this method throws an exception.\n     *\n     * @param {HTMLElement | String | jQuery} element  The element to push onto the stack.\n     *\n     * @returns {LayerManager}\n     */\n    push: function (element) {\n        var $el = element instanceof $ ? element : $(element);\n        if (layerIndex(this._stack, $el) >= 0) {\n            throw new Error('The given element is already an active layer.');\n        }\n\n        this.popLayersBeside($el);\n\n        var layer = createLayer($el);\n        var zIndex = nextZIndex(this._stack);\n\n        layer._showLayer(zIndex);\n\n        if (layer.isBlanketed()) {\n            dim(false, zIndex - 20);\n        }\n\n        this._stack.push($el);\n\n        return this;\n    },\n\n    popLayersBeside: function (element) {\n        const layer = $(element).get(0);\n        if (!hasTrigger(layer)) {\n            // We can't find this layer's trigger, we will pop all non-persistent until a blanket or the document\n            var blanketedIndex = topBlanketedIndex(this._stack);\n            popLayers(this._stack, ++blanketedIndex, false);\n            return;\n        }\n\n        const parentLayer = getParentLayer(layer);\n        if (parentLayer) {\n            let parentIndex = this.indexOf(parentLayer);\n            popLayers(this._stack, ++parentIndex, false);\n        } else {\n            popLayers(this._stack, 0, false);\n        }\n    },\n\n    /**\n     * Returns the index of the specified layer in the layer stack.\n     *\n     * @param {HTMLElement | String | jQuery} element  The element to find in the stack.\n     *\n     * @returns {Number} the (zero-based) index of the element, or -1 if not in the stack.\n     */\n    indexOf: function (element) {\n        return layerIndex(this._stack, $(element));\n    },\n\n    /**\n     * Returns the item at the particular index or false.\n     *\n     * @param {Number} index The index of the element to get.\n     *\n     * @returns {jQuery | Boolean}\n     */\n    item: function (index) {\n        return this._stack[index];\n    },\n\n    /**\n     * Hides all layers in the stack.\n     *\n     * @returns {LayerManager}\n     */\n    hideAll: function () {\n        this._stack\n            .slice()\n            .reverse()\n            .forEach(function (element) {\n                let layer = createLayer(element);\n                if (layer.isBlanketed() || layer.isPersistent()) {\n                    return;\n                }\n                layer.hide();\n            });\n\n        return this;\n    },\n\n    /**\n     * Gets the previous layer below the given layer, which is non modal and non persistent. If it finds a blanketed layer on the way\n     * it returns it regardless if it is modal or not\n     *\n     * @param {HTMLElement | String | jQuery} element layer to start the search from.\n     *\n     * @returns {jQuery | null} the next matching layer or null if none found.\n     */\n    getNextLowerNonPersistentOrBlanketedLayer: function (element) {\n        var $el = element instanceof $ ? element : $(element);\n        var index = layerIndex(this._stack, $el);\n\n        if (index < 0) {\n            return null;\n        }\n\n        var $nextEl;\n        index--;\n        while (index >= 0) {\n            $nextEl = this._stack[index];\n            var layer = createLayer($nextEl);\n\n            if (!layer.isPersistent() || layer.isBlanketed()) {\n                return $nextEl;\n            }\n            index--;\n        }\n\n        return null;\n    },\n\n    /**\n     * Gets the next layer which is neither modal or blanketed, from the given layer.\n     *\n     * @param {HTMLElement | String | jQuery} element layer to start the search from.\n     *\n     * @returns {jQuery | null} the next non modal non blanketed layer or null if none found.\n     */\n    getNextHigherNonPeristentAndNonBlanketedLayer: function (element) {\n        var $el = element instanceof $ ? element : $(element);\n        var index = layerIndex(this._stack, $el);\n\n        if (index < 0) {\n            return null;\n        }\n\n        var $nextEl;\n        index++;\n        while (index < this._stack.length) {\n            $nextEl = this._stack[index];\n            var layer = createLayer($nextEl);\n\n            if (!(layer.isPersistent() || layer.isBlanketed())) {\n                return $nextEl;\n            }\n            index++;\n        }\n\n        return null;\n    },\n\n    /**\n     * Gets the top layer, if it exists.\n     *\n     * @returns The layer on top of the stack, if it exists, otherwise null.\n     */\n    getTopLayer: function () {\n        return this._stack[this._stack.length - 1] || null;\n    },\n\n    /**\n     * Get the top open layer, if it exists.\n     *\n     * @return The first open layer in the stack, if it exists, otherwise null.\n     */\n    getTopOpenLayer: function () {\n        return (\n            this._stack\n                .slice()\n                .reverse()\n                .find((layer) => layer.attr('open') !== undefined) || null\n        );\n    },\n\n    /**\n     * Removes all non-modal layers above & including the given element. If the given element is not an active layer, this method\n     * is a no-op. The given element will be removed regardless of whether or not it is modal.\n     *\n     * @param {HTMLElement | String | jQuery} element layer to pop.\n     * @param {boolean} [triggerBeforeEvents=false]\n     *\n     * @returns {jQuery} The last layer that was popped, or null if no layer matching the given $el was found.\n     */\n    popUntil: function (element, triggerBeforeEvents = false) {\n        var $el = element instanceof $ ? element : $(element);\n        var index = layerIndex(this._stack, $el);\n\n        if (index === -1) {\n            return null;\n        }\n\n        const oldTopBlanketedIndex = topBlanketedIndex(this._stack);\n\n        // Removes all layers above the current one.\n        const layer = createLayer($el);\n        const [success, $lastPopped] = popLayers(\n            this._stack,\n            index + 1,\n            layer.isBlanketed(),\n            triggerBeforeEvents\n        );\n        if (!success) {\n            return $lastPopped;\n        }\n\n        // Removes the current layer.\n        if (!layer._hideLayer(triggerBeforeEvents)) {\n            return $lastPopped;\n        }\n        this._stack.splice(index, 1);\n        updateBlanket(this._stack, oldTopBlanketedIndex);\n\n        return $el;\n    },\n\n    /**\n     * Pops the top layer, if it exists and it is non modal and non persistent.\n     *\n     * @returns The layer that was popped, if it was popped.\n     */\n    popTopIfNonPersistent: function (triggerBeforeEvents = false) {\n        var $topLayer = this.getTopLayer();\n        var layer = createLayer($topLayer);\n\n        if (!$topLayer || layer.isPersistent()) {\n            return null;\n        }\n\n        return this.popUntil($topLayer, triggerBeforeEvents);\n    },\n\n    /**\n     * Pops all layers above and including the top blanketed layer. If layers exist but none are blanketed, this method\n     * does nothing.\n     *\n     * @returns The blanketed layer that was popped, if it exists, otherwise null.\n     */\n    popUntilTopBlanketed: function (triggerBeforeEvents = false) {\n        var i = topBlanketedIndex(this._stack);\n\n        if (i < 0) {\n            return null;\n        }\n\n        var $topBlanketedLayer = this._stack[i];\n        var layer = createLayer($topBlanketedLayer);\n\n        if (layer.isPersistent()) {\n            // We can't pop the blanketed layer, only the things ontop\n            var $next = this.getNextHigherNonPeristentAndNonBlanketedLayer($topBlanketedLayer);\n            if ($next) {\n                var stopIndex = layerIndex(this._stack, $next);\n                popLayers(this._stack, stopIndex, true, triggerBeforeEvents);\n                return $next;\n            }\n            return null;\n        }\n\n        popLayers(this._stack, i, true);\n        updateBlanket(this._stack, i);\n        return $topBlanketedLayer;\n    },\n\n    /**\n     * Pops all layers above and including the top persistent layer. If layers exist but none are persistent, this method\n     * does nothing.\n     */\n    popUntilTopPersistent: function (triggerBeforeEvents = false) {\n        var $toPop = LayerManager.global.getTopLayer();\n        if (!$toPop) {\n            return;\n        }\n\n        var stopIndex;\n        var oldTopBlanketedIndex = topBlanketedIndex(this._stack);\n\n        var toPop = createLayer($toPop);\n        if (toPop.isPersistent()) {\n            if (toPop.isBlanketed()) {\n                return;\n            } else {\n                // Get the closest non modal layer below, stop at the first blanketed layer though, we don't want to pop below that\n                $toPop = LayerManager.global.getNextLowerNonPersistentOrBlanketedLayer($toPop);\n                toPop = createLayer($toPop);\n\n                if ($toPop && !toPop.isPersistent()) {\n                    stopIndex = layerIndex(this._stack, $toPop);\n                    popLayers(this._stack, stopIndex, true, triggerBeforeEvents);\n                    updateBlanket(this._stack, oldTopBlanketedIndex);\n                } else {\n                    // Here we have a blanketed persistent layer\n                    return;\n                }\n            }\n        } else {\n            stopIndex = layerIndex(this._stack, $toPop);\n            popLayers(this._stack, stopIndex, true, triggerBeforeEvents);\n            updateBlanket(this._stack, oldTopBlanketedIndex);\n        }\n    },\n};\n\n// LayerManager.global\n// -------------------\n\nfunction initCloseLayerOnEscPress() {\n    $doc.on('keydown', function (e) {\n        if (e.keyCode === keyCode.ESCAPE) {\n            LayerManager.global.popUntilTopPersistent(true);\n            e.preventDefault();\n        }\n    });\n}\n\nfunction initCloseLayerOnBlanketClick() {\n    $doc.on('click', '.aui-blanket', function (e) {\n        if (LayerManager.global.popUntilTopBlanketed(true)) {\n            e.preventDefault();\n        }\n    });\n}\n\nfunction hasLayer($trigger) {\n    if (!$trigger.length) {\n        return false;\n    }\n\n    var layer = document.getElementById($trigger.attr('aria-controls'));\n    return LayerManager.global.indexOf(layer) > -1;\n}\n\n// If it's a click on a trigger, do nothing.\n// If it's a click on a layer, close all layers above.\n// Otherwise, close all layers.\nfunction initCloseLayerOnOuterClick() {\n    $doc.on('click', function (e) {\n        var $target = $(e.target);\n        if ($target.closest('.aui-blanket').length) {\n            return;\n        }\n\n        var $trigger = $target.closest('[aria-controls]');\n        var $layer = $target.closest('.aui-layer');\n        if (!$layer.length && !hasLayer($trigger)) {\n            const customEvent = $.Event('aui-close-layers-on-outer-click');\n            $doc.trigger(customEvent);\n            if (customEvent.isDefaultPrevented()) {\n                e.preventDefault();\n                return;\n            }\n            LayerManager.global.hideAll();\n            return;\n        }\n\n        // Triggers take precedence over layers\n        if (hasLayer($trigger)) {\n            return;\n        }\n\n        if ($layer.length) {\n            // We dont want to explicitly call close on a modal dialog if it happens to be next.\n            // All blanketed layers should be below us, as otherwise the blanket should have caught the click.\n            // We make sure we dont close a blanketed one explicitly as a hack, this is to fix the problem arising\n            // from dialog2 triggers inside dialog2's having no aria controls, where the dialog2 that was just\n            // opened would be closed instantly\n            var $next = LayerManager.global.getNextHigherNonPeristentAndNonBlanketedLayer($layer);\n\n            if ($next) {\n                createLayer($next).hide();\n            }\n        }\n    });\n}\n\ninitCloseLayerOnEscPress();\ninitCloseLayerOnBlanketClick();\ninitCloseLayerOnOuterClick();\n\nLayerManager.global = new LayerManager();\ncreateLayer.Manager = LayerManager;\n\nglobalize('layer', createLayer);\n\nexport default createLayer;\n","import globalize from './internal/globalize';\nimport layer from './layer';\n\nglobalize('LayerManager', layer.Manager);\n\nexport default layer.Manager;\n","import globalize from './internal/globalize';\nimport { getMessageLogger } from './internal/deprecation';\n\nconst deprecation = {\n    sinceVersion: '9.0.0',\n    removeInVersion: '12.0.0',\n};\n\nconst proxy = new Proxy(\n    {},\n    {\n        get: function (obj, prop) {\n            getMessageLogger('AJS.params', deprecation)();\n            return obj[prop];\n        },\n    }\n);\n\nexport default globalize('params', proxy);\n","import $ from './jquery';\nimport globalize from './internal/globalize';\nimport { fn } from './internal/deprecation';\nimport params from './params';\n\nfunction populateParametersOrg(parameters) {\n    if (!parameters) {\n        parameters = params;\n    }\n\n    $('.parameters input').each(function () {\n        var value = this.value;\n        var id = this.title || this.id;\n\n        if ($(this).hasClass('list')) {\n            if (parameters[id]) {\n                parameters[id].push(value);\n            } else {\n                parameters[id] = [value];\n            }\n        } else {\n            parameters[id] = value.match(/^(tru|fals)e$/i) ? value.toLowerCase() === 'true' : value;\n        }\n    });\n}\n\nconst deprecation = {\n    sinceVersion: '9.0.0',\n    removeInVersion: '12.0.0',\n};\n\nconst populateParameters = fn(populateParametersOrg, 'populateParameters', deprecation);\nglobalize('populateParameters', populateParameters);\n\nexport default populateParameters;\n","// Global setup that used to be in the main AJS namespace file.\nimport $ from './jquery';\nimport globalize from './internal/globalize';\nimport populateParameters from './populate-parameters';\nimport version from './version';\n\n// Set the version.\n$(function () {\n    var $body = $('body');\n\n    if (!$body.data('auiVersion')) {\n        $body.attr('data-aui-version', version);\n    }\n\n    populateParameters();\n});\n\nglobalize('$', $);\nexport default $;\n","import $ from './jquery';\nimport * as logger from './internal/log';\nimport globalize from './internal/globalize';\n\n/**\n * Adds functions to the list of methods to be run asynchronously after DomContentLoaded.\n *\n * Wraps error handling around the provided function so its failure won't prevent\n * other init functions running.\n *\n * @param {Function} func Function to be called on initialisation.\n *\n * @return {Object}\n */\nfunction toInit(func) {\n    $.when($.ready).then(function () {\n        // Ensure that every function passed through toInit happens asynchronously after DomContentLoaded events,\n        // and will be executed in its own stack, meaning that the UI can be updated in-between expensive handlers.\n        setTimeout(function () {\n            try {\n                func.call(this, $);\n            } catch (ex) {\n                logger.error('Failed to run init function: ' + ex.message, func, ex, ex.stack);\n            }\n        }, 1);\n    });\n\n    return this;\n}\n\nglobalize('toInit', toInit);\n\nexport default toInit;\n","// Import the I18n system from the WRM, webpack handles this\nimport 'wrmI18n';\nimport format from './format';\nimport { globalizeI18n } from './internal/globalize';\nimport keys from './internal/i18n/aui';\n\n/**\n * Returns the value defined in AJS.I18n.keys for the given key. If AJS.I18n.keys does not exist, or if the given key does not exist,\n * the key is returned - this could occur in plugin mode if the I18n transform is not performed;\n * or in flatpack mode if the i18n JS file is not loaded.\n */\nconst auiI18n = {\n    keys: keys,\n    getText: function (key, ...params) {\n        if (Object.prototype.hasOwnProperty.call(this.keys, key)) {\n            return format.apply(null, [this.keys[key]].concat(params));\n        }\n\n        return key;\n    },\n};\n\n/**\n * Deprecated - do not use AJS.I18n.getText from global scope within AUI code. Use import { I18n } from '../i18n'\n * Also keep in mind that WRM is looking for patterns like \"I18n.getText\" so do not create\n * aliases for I18n or export it from here using 'default'. Webpack transforms it then to\n * 'd.default.getText' and it won't match.\n **/\nconst I18n = globalizeI18n(auiI18n);\n\nexport { I18n, format };\n","export default {\n    'aui.landmarks.site': 'Site',\n    'aui.landmarks.sidebar': 'Sidebar',\n    'aui.landmarks.page': 'Page',\n    'aui.landmarks.main': 'Main',\n    'aui.header.home.link': 'Go to home page',\n    'aui.dropdown.async.error': 'Error loading dropdown',\n    'aui.dropdown.async.loading': 'Loading dropdown',\n    'aui.words.expand': 'Expand',\n    'aui.words.collapse': 'Collapse',\n    'aui.words.add': 'Add',\n    'aui.words.update': 'Update',\n    'aui.words.delete': 'Delete',\n    'aui.words.remove': 'Remove',\n    'aui.words.cancel': 'Cancel',\n    'aui.words.loading': 'Loading',\n    'aui.words.close': 'Close',\n    'aui.enter.value': 'Enter value',\n    'aui.words.more': 'More',\n    'aui.words.moreitem': 'More…',\n    'aui.keyboard.shortcut.type.x': \"Type ''{0}''\",\n    'aui.keyboard.shortcut.then.x': \"then ''{0}''\",\n    'aui.keyboard.shortcut.or.x': \"OR ''{0}''\",\n    'aui.sidebar.expand.tooltip': 'Expand sidebar ( [ )',\n    'aui.sidebar.collapse.tooltip': 'Collapse sidebar ( [ )',\n    'aui.validation.message.maxlength': 'Must be fewer than or equal to {0} characters',\n    'aui.validation.message.minlength': 'Must be greater than or equal to {0} characters',\n    'aui.validation.message.exactlength': 'Must be exactly {0} characters',\n    'aui.validation.message.matchingfield': '{0} and {1} do not match.',\n    'aui.validation.message.matchingfield-novalue': 'These fields do not match.',\n    'aui.validation.message.doesnotcontain': 'Do not include the phrase {0} in this field',\n    'aui.validation.message.pattern': 'This field does not match the required format',\n    'aui.validation.message.required': 'This is a required field',\n    'aui.validation.message.validnumber': 'Please enter a valid number',\n    'aui.validation.message.min': 'Enter a value greater than or equal to  {0}',\n    'aui.validation.message.max': 'Enter a value less than or equal to {0}',\n    'aui.validation.message.dateformat': 'Enter a valid date',\n    'aui.validation.message.minchecked':\n        'Tick at least {0,choice,0#0 checkboxes|1#1 checkbox|1<{0,number} checkboxes}.',\n    'aui.validation.message.maxchecked':\n        'Tick at most {0,choice,0#0 checkboxes|1#1 checkbox|1<{0,number} checkboxes}.',\n    'aui.select.no.suggestions': 'No suggestions',\n    'aui.select.number.suggestions':\n        'Found {0,choice,0#0 options|1#1 option|1<{0,number} options}.',\n    'aui.select.new.suggestions':\n        'New suggestions added. Please use the up and down arrows to select.',\n    'aui.select.new.value': 'new value',\n    'aui.toggle.on': 'On',\n    'aui.toggle.off': 'Off',\n    'aui.messagecomponent.error.label': 'Error',\n    'aui.messagecomponent.warning.label': 'Warning',\n    'aui.messagecomponent.info.label': 'Information',\n    'aui.messagecomponent.confirmation.label': 'Confirmation',\n    'aui.messagecomponent.change.label': 'Change',\n    'ajs.datepicker.localisations.day-names.sunday': 'Sunday',\n    'ajs.datepicker.localisations.day-names.monday': 'Monday',\n    'ajs.datepicker.localisations.day-names.tuesday': 'Tuesday',\n    'ajs.datepicker.localisations.day-names.wednesday': 'Wednesday',\n    'ajs.datepicker.localisations.day-names.thursday': 'Thursday',\n    'ajs.datepicker.localisations.day-names.friday': 'Friday',\n    'ajs.datepicker.localisations.day-names.saturday': 'Saturday',\n    'ajs.datepicker.localisations.day-names-min.sunday': 'Sun',\n    'ajs.datepicker.localisations.day-names-min.monday': 'Mon',\n    'ajs.datepicker.localisations.day-names-min.tuesday': 'Tue',\n    'ajs.datepicker.localisations.day-names-min.wednesday': 'Wed',\n    'ajs.datepicker.localisations.day-names-min.thursday': 'Thu',\n    'ajs.datepicker.localisations.day-names-min.friday': 'Fri',\n    'ajs.datepicker.localisations.day-names-min.saturday': 'Sat',\n    'ajs.datepicker.localisations.first-day': 0,\n    'ajs.datepicker.localisations.is-RTL': false,\n    'ajs.datepicker.localisations.month-names.january': 'January',\n    'ajs.datepicker.localisations.month-names.february': 'February',\n    'ajs.datepicker.localisations.month-names.march': 'March',\n    'ajs.datepicker.localisations.month-names.april': 'April',\n    'ajs.datepicker.localisations.month-names.may': 'May',\n    'ajs.datepicker.localisations.month-names.june': 'June',\n    'ajs.datepicker.localisations.month-names.july': 'July',\n    'ajs.datepicker.localisations.month-names.august': 'August',\n    'ajs.datepicker.localisations.month-names.september': 'September',\n    'ajs.datepicker.localisations.month-names.october': 'October',\n    'ajs.datepicker.localisations.month-names.november': 'November',\n    'ajs.datepicker.localisations.month-names.december': 'December',\n    'ajs.datepicker.localisations.show-month-after-year': false,\n    'ajs.datepicker.localisations.year-suffix': '',\n    'aui.flag.default-aria-label.info': 'New information message',\n    'aui.flag.default-aria-label.success': 'New confirmation message',\n    'aui.flag.default-aria-label.warning': 'New warning message',\n    'aui.flag.default-aria-label.error': 'New error message',\n};\n","import skate from './internal/skate';\n\nconst DEFAULT_PLACEMENT_VALUE = 'bottom-end';\nconst PLACEMENT_OPTIONS = ['top-start', 'top-end', 'bottom-start', 'bottom-end'];\n\nconst setBadgedPlacement = (element, newValue, oldValue) => {\n    const newPlacement = PLACEMENT_OPTIONS.includes(newValue) ? newValue : DEFAULT_PLACEMENT_VALUE;\n\n    if (oldValue) {\n        element.classList.remove(`aui-avatar-badged-${oldValue}`);\n    }\n    element.classList.add(`aui-avatar-badged-${newPlacement}`);\n};\n\nconst AvatarBadged = skate('aui-avatar-badged', {\n    attributes: {\n        placement: {\n            value: DEFAULT_PLACEMENT_VALUE,\n            fallback(element, { newValue, oldValue }) {\n                setBadgedPlacement(element, newValue, oldValue);\n            },\n        },\n    },\n\n    created: function (element) {\n        element.classList.add('aui-avatar-badged');\n    },\n});\n\nexport { AvatarBadged };\n","import template from 'skatejs-template-html';\nimport skate from './internal/skate';\nimport personImage from '../../../../../packages/docs/src/docs/images/avatar-person.svg';\nimport projectImage from '../../../../../packages/docs/src/docs/images/avatar-project.svg';\n\nconst DEFAULT_AVATAR_IMAGES = new Map([\n    ['project', projectImage],\n    ['user', personImage],\n]);\n\nconst getElementWrapper = (element, elementFind) => element.querySelector(elementFind);\nconst containsBadge = (element) => element.querySelector('aui-avatar-badged') !== null;\n\nconst replaceClass = (element, newValue, oldValue) => {\n    const elementWrapper = getElementWrapper(element, '.aui-avatar');\n\n    elementWrapper.classList.remove(`aui-avatar-${oldValue}`);\n    elementWrapper.classList.add(`aui-avatar-${newValue}`);\n};\n\nconst getAvatarType = (element) =>\n    element.getAttribute('type') === 'project' ? 'project' : 'user';\n\nconst setDefaultAvatarImage = (element) => {\n    if (element.hasAttribute('src')) {\n        setImageSrc(element, element.getAttribute('src'));\n    } else {\n        const avatarType = getAvatarType(element);\n        const avatarSvg = DEFAULT_AVATAR_IMAGES.get(avatarType);\n        setImageSrc(element, avatarSvg);\n    }\n};\n\nconst setImageAttr = (element, name, value) =>\n    getElementWrapper(element, 'img').setAttribute(name, value);\nconst setImageSrc = (element, src) => setImageAttr(element, 'src', src);\nconst setImageAlt = (element, alt) => setImageAttr(element, 'alt', alt);\nconst setImageTitle = (element, title) => setImageAttr(element, 'title', title);\n\nconst AvatarEl = skate('aui-avatar', {\n    template: template(`\n      <span class='aui-avatar'>\n         <span class='aui-avatar-inner'>\n            <img />\n         </span>\n         <content></content>\n      </span>\n   `),\n\n    attributes: {\n        size(element, { newValue, oldValue }) {\n            replaceClass(element, newValue, oldValue);\n        },\n        type(element, { newValue, oldValue }) {\n            replaceClass(element, newValue, oldValue);\n            setDefaultAvatarImage(element);\n        },\n        src(element, { newValue: value }) {\n            setImageSrc(element, value);\n        },\n        alt: {\n            value: '',\n            fallback(element, { newValue: value }) {\n                setImageAlt(element, value);\n            },\n        },\n        title(element, { newValue: value }) {\n            setImageTitle(element, value);\n        },\n    },\n\n    created: function (element) {\n        element.className = 'aui-avatar';\n        setDefaultAvatarImage(element);\n\n        if (containsBadge(element)) {\n            element.setAttribute('role', 'img');\n        }\n    },\n});\n\nexport { AvatarEl };\n","import skate from './internal/skate';\n\nconst DEFAULT_SIZE = 'medium';\nconst VISIBLE_AVATAR_COUNT = 4;\nconst OVERLAP_FACTOR = 0.25;\nconst SIZES = {\n    xsmall: 16,\n    small: 24,\n    medium: 32,\n    large: 48,\n    xlarge: 64,\n    xxlarge: 96,\n    xxxlarge: 128,\n};\n\nconst setAvatarGroupSize = (element, newValue, oldValue) => {\n    if (oldValue) {\n        element.classList.remove(`aui-avatar-group-${oldValue}`);\n    }\n    element.classList.add(`aui-avatar-group-${newValue}`);\n};\n\nconst getAvatarGroupSize = (value) => {\n    return Object.keys(SIZES).includes(value) ? value : DEFAULT_SIZE;\n};\n\nconst updateAvatarGroup = (element, size) => {\n    const avatars = element.querySelectorAll('aui-avatar');\n    const hiddenAvatars = [...avatars].slice(VISIBLE_AVATAR_COUNT);\n\n    updateAvatarGroupItems(avatars, size);\n\n    const oldDropdown = element.querySelector('.aui-avatar-group-dropdown');\n    if (oldDropdown) {\n        oldDropdown.remove();\n    }\n\n    if (hiddenAvatars.length === 0) {\n        return;\n    }\n\n    const dropdown = createDropdown(size, hiddenAvatars);\n\n    element.appendChild(dropdown);\n};\n\nconst createDropdown = (size, hiddenAvatars) => {\n    const dropdown = document.createElement('div');\n    const button = createAvatarGroupDropdownButton(`+${hiddenAvatars.length}`);\n    const menu = createAvatarGroupDropdownMenu();\n\n    hiddenAvatars.forEach((hiddenAvatar) => {\n        menu.append(hiddenAvatar);\n    });\n    dropdown.classList.add('aui-avatar-group-dropdown');\n    dropdown.style.left = getLeftPosition(size, VISIBLE_AVATAR_COUNT + 0.2);\n    dropdown.appendChild(button);\n    dropdown.appendChild(menu);\n    return dropdown;\n};\n\nconst createAvatarGroupDropdownButton = (content) => {\n    const button = document.createElement('button');\n    button.classList.add('aui-avatar-group-dropdown-button', 'aui-avatar-inner');\n    button.innerText = content;\n    button.setAttribute('aria-expanded', false);\n    button.setAttribute('aria-haspopup', 'dialog');\n    return button;\n};\n\nconst createAvatarGroupDropdownMenu = () => {\n    const dropdown = document.createElement('div');\n    dropdown.classList.add('aui-avatar-group-dropdown-menu');\n    return dropdown;\n};\n\nconst updateAvatarGroupItems = (avatars, size) => {\n    avatars.forEach((avatar, index) => {\n        const isHidden = index >= VISIBLE_AVATAR_COUNT;\n        avatar.classList.add(\n            !isHidden ? 'aui-avatar-group-item' : 'aui-avatar-group-dropdown-item'\n        );\n\n        if (!isHidden) {\n            avatar.setAttribute('size', size);\n            avatar.style.left = getLeftPosition(size, index);\n            avatar.style.zIndex = `${VISIBLE_AVATAR_COUNT + 1 - index}`;\n        } else {\n            avatar.setAttribute('size', 'medium');\n        }\n    });\n};\n\nconst getLeftPosition = (size, index) => {\n    const avatarSize = SIZES[size];\n    const overlapFactor = avatarSize * OVERLAP_FACTOR;\n    const leftPosition = (avatarSize - overlapFactor) * index;\n    return `${leftPosition}px`;\n};\n\ndocument.addEventListener('click', (e) => {\n    const isDropdownButton = e.target.matches('.aui-avatar-group-dropdown-button');\n    const closestDropdown = e.target.closest('.aui-avatar-group-dropdown');\n\n    if (!isDropdownButton && closestDropdown !== null) {\n        return;\n    }\n\n    if (isDropdownButton) {\n        closestDropdown.classList.contains('aui-avatar-group-dropdown-show')\n            ? closeDropdown(closestDropdown)\n            : openDropdown(closestDropdown);\n    }\n\n    document.querySelectorAll('.aui-avatar-group-dropdown-show').forEach((dropdown) => {\n        if (dropdown === closestDropdown) {\n            return;\n        }\n\n        closeDropdown(dropdown);\n    });\n});\n\ndocument.addEventListener('keydown', (e) => {\n    if (e.key !== 'Escape') {\n        return;\n    }\n    const dropdown = document.querySelector('.aui-avatar-group-dropdown-show');\n    if (!dropdown) {\n        return;\n    }\n\n    closeDropdown(dropdown);\n});\n\nconst closeDropdown = (dropdown) => {\n    const button = dropdown.querySelector('.aui-avatar-group-dropdown-button');\n    dropdown.classList.remove('aui-avatar-group-dropdown-show');\n    button.setAttribute('aria-expanded', 'false');\n};\nconst openDropdown = (dropdown) => {\n    const button = dropdown.querySelector('.aui-avatar-group-dropdown-button');\n    dropdown.classList.add('aui-avatar-group-dropdown-show');\n    button.setAttribute('aria-expanded', 'true');\n};\n\nconst AvatarGroupEl = skate('aui-avatar-group', {\n    attributes: {\n        size: {\n            value: DEFAULT_SIZE,\n            fallback(element, { newValue, oldValue }) {\n                const size = getAvatarGroupSize(newValue);\n                setAvatarGroupSize(element, size, oldValue);\n\n                skate.init(element);\n\n                updateAvatarGroup(element, size);\n            },\n        },\n    },\n    created(element) {\n        element.classList.add('aui-avatar-group');\n    },\n});\n\nconst wasNodeRemoved = (mutation, target) => {\n    return (\n        mutation.removedNodes.length > 0 &&\n        target.classList.contains('aui-avatar-group') &&\n        mutation.removedNodes[0].classList.contains('aui-avatar-group-item')\n    );\n};\n\nconst wasNodeAdded = (mutation, target) => {\n    return (\n        mutation.addedNodes.length > 0 &&\n        target.classList.contains('aui-avatar-group') &&\n        mutation.addedNodes[0].classList.contains('aui-avatar')\n    );\n};\n\nconst mutationObserver = new MutationObserver(function (mutation) {\n    mutation.forEach(function (mutation) {\n        const target = mutation.target;\n\n        if (wasNodeRemoved(mutation, target)) {\n            updateAvatarGroup(target, target.getAttribute('size'));\n        }\n\n        if (wasNodeAdded(mutation, target)) {\n            setTimeout(() => {\n                updateAvatarGroup(target, target.getAttribute('size'));\n            }, 0);\n        }\n    });\n});\n\nmutationObserver.observe(document.documentElement, {\n    attributes: false,\n    characterData: true,\n    childList: true,\n    subtree: true,\n    attributeOldValue: false,\n    characterDataOldValue: false,\n});\n\nexport { AvatarGroupEl };\n","import { recomputeStyle } from './internal/animation';\nimport amdify from './internal/amdify';\nimport globalize from './internal/globalize';\nimport * as deprecate from './internal/deprecation';\n\nconst ID_BANNER_CONTAINER = 'header';\n\nconst getContainer = () => document.getElementById(ID_BANNER_CONTAINER);\n\nfunction banner(options) {\n    const bannerContainer = getContainer();\n    if (!bannerContainer) {\n        throw new Error(\n            'Unable to find the application header. Please ensure that an element with the ID \"header\" is present in the DOM'\n        );\n    }\n    const bannerElement = createBannerElement(options);\n\n    renderBannerElement(bannerElement, bannerContainer);\n    removeHiddenBanners(bannerContainer);\n    return bannerElement;\n}\n\nfunction createBannerElement({ body = '', type = 'error' }) {\n    const banner = document.createElement('div');\n    banner.className = `aui-banner aui-banner-${type}`;\n    banner.setAttribute('role', 'alert');\n    banner.innerHTML = body;\n\n    const screenReaderInfo = document.createElement('div');\n    screenReaderInfo.innerText = `${type}`;\n    screenReaderInfo.classList.add('assistive');\n    banner.prepend(screenReaderInfo);\n\n    return banner;\n}\n\nfunction removeHiddenBanners(bannerContainer) {\n    const hiddenBanners = bannerContainer.querySelectorAll('.aui-banner[hidden]');\n    const lazyDeprecate = deprecate.getMessageLogger('Banner [hidden] attribute', {\n        removeInVersion: '12.0.0',\n        sinceVersion: '9.8.0',\n        deprecationType: 'ATTRIBUTE',\n        extraInfo:\n            \"The hidden attribute on the banner is no longer effective. Future banner function calls won't remove banners with this attribute.\",\n    });\n\n    hiddenBanners.forEach(function (banner) {\n        lazyDeprecate();\n        banner.remove();\n    });\n}\n\nfunction renderBannerElement(bannerElement, bannerContainer) {\n    bannerContainer.prepend(bannerElement);\n    recomputeStyle(bannerElement);\n}\n\namdify('aui/banner', banner);\nglobalize('banner', banner);\nexport default banner;\n","import skate from './internal/skate';\nimport { getMessageLogger } from './internal/deprecation';\nimport { defaults, find } from 'underscore';\n\n/**\n * @typedef {\"small\"|\"medium\"|\"large\"} SpinnerSize\n */\n\n/**\n * @typedef {Object} SpinnerSizeConfig\n * @param {SpinnerSize} name\n * @param {number} px\n * @param {number} radius\n */\n\n/**\n * @enum {SpinnerSizeConfig}\n * @readonly\n */\nconst SIZE = {\n    SMALL: {\n        name: 'small',\n        px: 20,\n        radius: 9,\n    },\n    MEDIUM: {\n        name: 'medium',\n        px: 30,\n        radius: 13.5,\n    },\n    LARGE: {\n        name: 'large',\n        px: 50,\n        radius: 22.5,\n    },\n};\n\nconst DEFAULTS = {\n    filled: false,\n    size: SIZE.MEDIUM.name,\n};\n\nconst filledAttributeReplacementText = `Add CSS to the parent element of the <aui-spinner>.\nUse CSS flexbox or grid to vertically align it.\nSee https://css-tricks.com/centering-css-complete-guide/ for techniques.`;\n\nconst filledAttributeDeprecatedLogger = getMessageLogger('<aui-spinner> filled attribute', {\n    sinceVersion: '7.9.4',\n    removeInVersion: '12.0.0',\n    extraInfo: filledAttributeReplacementText,\n});\n\nconst filledPropDeprecatedLogger = getMessageLogger('<aui-spinner> filled property', {\n    sinceVersion: '7.9.4',\n    removeInVersion: '12.0.0',\n    extraInfo: filledAttributeReplacementText,\n});\n\n/** @deprecated */\nfunction setMiddleTop(element, height) {\n    const parent = element.parentNode;\n    // only operate on elements, not documentFragment or comment nodes, etc.\n    if (parent && parent.nodeType === 1) {\n        const selfDomRect = element.getBoundingClientRect();\n        const parentDomRect = parent.getBoundingClientRect();\n\n        const parentMiddleTop = parentDomRect.top + parentDomRect.height / 2;\n        const spinnerMiddleTop = selfDomRect.top + height / 2;\n\n        element.querySelector('svg').style.top = `${parentMiddleTop - spinnerMiddleTop}px`;\n    }\n}\n\n/** @deprecated */\nfunction removeMiddleTop(element) {\n    delete element.querySelector('svg').style.top;\n}\n\nfunction validateSize(size) {\n    let result = SIZE.MEDIUM.name;\n    if (typeof size === 'string') {\n        size = size.toLowerCase();\n        const possibleSizes = Object.keys(SIZE).map((key) => key.toLowerCase());\n\n        if (possibleSizes.indexOf(size) > -1) {\n            result = size;\n        }\n    }\n\n    return result;\n}\n\nfunction setSize(element, size, radius) {\n    const svg = element.querySelector('svg');\n    const circle = element.querySelector('circle');\n\n    svg.setAttribute('size', size);\n    svg.setAttribute('height', size);\n    svg.setAttribute('width', size);\n    svg.setAttribute('viewBox', `0 0 ${size} ${size}`);\n\n    const circleSize = size / 2;\n\n    circle.setAttribute('cx', circleSize);\n    circle.setAttribute('cy', circleSize);\n    circle.setAttribute('r', radius);\n}\n\nfunction refresh(element) {\n    const { px, radius } = find(SIZE, (s) => s.name === element._data.size) || SIZE.MEDIUM;\n    setSize(element, px, radius);\n\n    if (element._data.filled) {\n        setMiddleTop(element, px);\n    } else {\n        removeMiddleTop(element);\n    }\n}\n\nconst SpinnerEl = skate('aui-spinner', {\n    template(element) {\n        element.innerHTML =\n            '<div class=\"aui-spinner spinner\"><svg focusable=\"false\"><circle></circle></svg></div>';\n        refresh(element);\n    },\n    attached(element) {\n        refresh(element);\n    },\n    attributes: {\n        filled: {\n            /** @deprecated */\n            created: function (element) {\n                filledAttributeDeprecatedLogger();\n                element._data.filled = true;\n                refresh(element);\n            },\n            /** @deprecated */\n            removed: function (element) {\n                element._data.filled = false;\n                refresh(element);\n            },\n        },\n        size(element, data) {\n            element._data.size = validateSize(data.newValue);\n            refresh(element);\n        },\n    },\n    prototype: {\n        get _data() {\n            return this.__data || (this._data = defaults({}, DEFAULTS));\n        },\n        set _data(data) {\n            return (this.__data = data);\n        },\n        /** @deprecated */\n        set filled(isFilled) {\n            filledPropDeprecatedLogger();\n            !!isFilled ? this.setAttribute('filled', '') : this.removeAttribute('filled');\n        },\n        set size(newSize) {\n            const size = validateSize(newSize);\n            this.setAttribute('size', size);\n        },\n    },\n});\n\nexport default SpinnerEl;\nexport { SIZE };\n","import * as logger from './internal/log';\nimport amdify from './internal/amdify';\nimport skate from './internal/skate';\nimport SpinnerEl, { SIZE } from './spinner';\n\nfunction isBusy(button) {\n    return button.hasAttribute('aria-busy') && button.getAttribute('aria-busy') === 'true';\n}\n\nfunction isInputNode(button) {\n    return button.nodeName === 'INPUT';\n}\n\nskate('aui-button', {\n    type: skate.type.CLASSNAME,\n    created: function (element) {\n        element._spinner = new SpinnerEl();\n        element._spinner.setAttribute('size', SIZE.SMALL.name);\n    },\n    prototype: {\n        /**\n         * Adds a spinner to the button and hides the text\n         *\n         * @returns {HTMLElement}\n         */\n        busy: function () {\n            if (isInputNode(this) || isBusy(this)) {\n                logger.warn('It is not valid to call busy() on an input button.');\n                return this;\n            }\n\n            this.appendChild(this._spinner);\n            this.setAttribute('aria-busy', true);\n            this.setAttribute('busy', '');\n\n            return this;\n        },\n\n        /**\n         * Removes the spinner and shows the tick on the button\n         *\n         * @returns {HTMLElement}\n         */\n        idle: function () {\n            if (isInputNode(this) || !isBusy(this)) {\n                logger.warn('It is not valid to call idle() on an input button.');\n                return this;\n            }\n\n            this.removeChild(this._spinner);\n            this.removeAttribute('aria-busy');\n            this.removeAttribute('busy');\n\n            return this;\n        },\n\n        /**\n         * Removes the spinner and shows the tick on the button\n         *\n         * @returns {Boolean}\n         */\n        isBusy: function () {\n            if (isInputNode(this)) {\n                logger.warn('It is not valid to call isBusy() on an input button.');\n                return false;\n            }\n\n            return isBusy(this);\n        },\n    },\n});\n\namdify('aui/button');\n","import { I18n } from './i18n';\n\nconst CLOSE_BUTTON_CLASS = 'aui-close-button';\nconst CLOSE_BUTTON_CLASS_SELECTOR = `.${CLOSE_BUTTON_CLASS}`;\nconst CLOSE_BUTTON = `<button type=\"button\" class=\"${CLOSE_BUTTON_CLASS}\" aria-label=\"${I18n.getText('aui.words.close')}\">`;\n\nexport { CLOSE_BUTTON, CLOSE_BUTTON_CLASS, CLOSE_BUTTON_CLASS_SELECTOR };\n","import $ from './jquery';\nimport amdify from './internal/amdify';\nimport globalize from './internal/globalize';\nimport layerWidget from './layer';\nimport widget from './internal/widget';\nimport keyCode from './key-code';\nimport { CLOSE_BUTTON, CLOSE_BUTTON_CLASS, CLOSE_BUTTON_CLASS_SELECTOR } from './close-button';\nimport * as deprecate from './internal/deprecation';\n\nconst defaults = {\n    'aui-focus': 'false', // do not focus by default as it's overridden below\n    'aui-blanketed': 'true',\n};\n\nfunction applyDefaults($el) {\n    $.each(defaults, function (key, value) {\n        const dataKey = 'data-' + key;\n        if (!$el[0].hasAttribute(dataKey)) {\n            $el.attr(dataKey, value);\n        }\n    });\n}\n\n/**\n * Gets keyboard-focusable elements within a specified element\n * https://zellwk.com/blog/keyboard-focusable-elements/\n * @param {HTMLElement} [element=document] element\n * @returns {Array}\n */\nfunction getKeyboardFocusableElements(element) {\n    const focusableSelector =\n        'a[href], button, input, textarea, select, details,[tabindex]:not([tabindex=\"-1\"])';\n    const elementList = [...element.querySelectorAll(focusableSelector)];\n\n    return elementList.filter(\n        (el) => !el.hasAttribute('disabled') && !el.getAttribute('aria-hidden')\n    );\n}\n\nfunction handleInitialFocus(el) {\n    // prevent inability to focus the close button.\n    const closeButton = el.querySelector(CLOSE_BUTTON_CLASS_SELECTOR);\n\n    if (closeButton) {\n        const lazyDeprecate = deprecate.getMessageLogger(\n            `Dialog2 [${CLOSE_BUTTON_CLASS_SELECTOR}]`,\n            {\n                removeInVersion: '12.0.0',\n                sinceVersion: '9.6.0',\n                extraInfo:\n                    'Replace it with another actionable element inside your Dialog which will trigger closing of the modal.',\n                deprecationType: 'MARKUP',\n            }\n        );\n        lazyDeprecate();\n        closeButton.setAttribute('tabindex', '0');\n    }\n\n    el.setAttribute('tabindex', '-1');\n\n    // Print deprecation note for old custom focus selection if found\n    const deprecatedFocusSelector = el.hasAttribute('data-aui-focus-selector');\n    if (deprecatedFocusSelector) {\n        const lazyDeprecate = deprecate.getMessageLogger(\n            'Dialog2 [data-aui-focus-selector] attribute',\n            {\n                removeInVersion: '12.0.0',\n                alternativeName: 'initialisation on DOM insertion',\n                sinceVersion: '9.6.0',\n                extraInfo:\n                    'Replace [data-aui-focus-selector] attribute with HTML [autofocus] attribute',\n                deprecationType: 'ATTRIBUTE',\n            }\n        );\n        lazyDeprecate();\n    }\n\n    // Focus custom element user marked by autofocus if found\n    const autofocusEl = el.querySelector('[autofocus]');\n    if (autofocusEl) {\n        // Set timeout and blur are needed to avoid Chrome complaining about focus already set on an element\n        // Also helps to ensure focus will 100% work in every environment\n        document.activeElement.blur();\n        setTimeout(() => autofocusEl.focus(), 0);\n        return;\n    }\n\n    // Deprecated focus selection, if autofocus not found\n    if (deprecatedFocusSelector) {\n        const elementToFocus = el.querySelector(deprecatedFocusSelector);\n        if (elementToFocus) {\n            // Set timeout and blur are needed to avoid Chrome complaining about focus already set on an element\n            // Also helps to ensure focus will 100% work in every environment\n            elementToFocus.blur();\n            setTimeout(() => elementToFocus.focus(), 0);\n            return;\n        }\n    }\n\n    // If not custom focus target, focus first focusable element if possible\n    const focusableElementList = getKeyboardFocusableElements(el);\n    if (focusableElementList.length) {\n        let focusableElement = focusableElementList.shift();\n\n        // if the first focusable element is Dialog's close button\n        // then take another one from the list\n        if (focusableElement.classList.contains(CLOSE_BUTTON_CLASS)) {\n            focusableElement = focusableElementList.shift();\n        }\n\n        if (focusableElement) {\n            // Set timeout and blur are needed to avoid Chrome complaining about focus already set on an element\n            // Also helps to ensure focus will 100% work in every environment\n            focusableElement.blur();\n            setTimeout(() => focusableElement.focus(), 0);\n        }\n\n        return;\n    }\n\n    // If no focusable elements found, put focus on dialog container itself\n    el.focus();\n}\n\nfunction Dialog2(selector) {\n    this._handlers = new WeakMap();\n    if (selector) {\n        this.$el = $(selector);\n    } else {\n        this.$el = $(`\n        <section role=\"dialog\" aria-modal=\"true\" class=\"aui-layer aui-dialog2 aui-dialog2-medium\">\n            <header class=\"aui-dialog2-header\">\n                <h2 class=\"aui-dialog2-header-main\"></h2>\n                ${CLOSE_BUTTON}\n                </button>\n            </header>\n            <div class=\"aui-dialog2-content\"></div>\n            <footer class=\"aui-dialog2-footer\"></footer>\n        </section>`);\n    }\n    this.$header = this.$el.find('.aui-dialog2-header');\n    this.$content = this.$el.find('.aui-dialog2-content');\n    this.$footer = this.$el.find('.aui-dialog2-footer');\n    applyDefaults(this.$el);\n}\n\nDialog2.prototype.on = function (event, fn) {\n    const $el = this.$el;\n    if (!this._handlers.get(fn)) {\n        const handler = function (e) {\n            if (e.target === $el.get(0)) {\n                fn.apply(this, arguments);\n            }\n        };\n        layerWidget($el).on(event, handler);\n        this._handlers.set(fn, handler);\n    }\n    return this;\n};\n\nDialog2.prototype.off = function (event, fn) {\n    const $el = this.$el;\n    const handler = this._handlers.get(fn);\n    if (handler) {\n        layerWidget($el).off(event, handler);\n        this._handlers.delete(fn);\n    }\n    return this;\n};\n\nDialog2.prototype.show = function () {\n    layerWidget(this.$el).show();\n    return this;\n};\n\nDialog2.prototype.hide = function () {\n    layerWidget(this.$el).hide();\n    return this;\n};\n\nDialog2.prototype.remove = function () {\n    layerWidget(this.$el).remove();\n    return this;\n};\n\nDialog2.prototype.isVisible = function () {\n    return layerWidget(this.$el).isVisible();\n};\n\nvar dialog2Widget = widget('dialog2', Dialog2);\nvar dialog2GlobalHandlers = new Set();\n\ndialog2Widget.on = function (eventName, fn) {\n    if (!dialog2GlobalHandlers.has(fn)) {\n        layerWidget.on(eventName, '.aui-dialog2', fn);\n        dialog2GlobalHandlers.add(fn);\n    }\n    return this;\n};\n\ndialog2Widget.off = function (eventName, fn) {\n    if (dialog2GlobalHandlers.has(fn)) {\n        layerWidget.off(eventName, '.aui-dialog2', fn);\n        dialog2GlobalHandlers.delete(fn);\n    }\n    return this;\n};\n\n/* Live events */\n\n$(document).on('click keydown', `.aui-dialog2-header ${CLOSE_BUTTON_CLASS_SELECTOR}`, function (e) {\n    const shouldHandle =\n        e.type === 'click' || e.keyCode === keyCode.ENTER || e.keyCode === keyCode.SPACE;\n    if (shouldHandle) {\n        e.preventDefault();\n        dialog2Widget($(e.target).closest('.aui-dialog2')).hide();\n    }\n});\n\ndialog2Widget.on('show', function (e, $el) {\n    handleInitialFocus($el[0]);\n});\n\ndialog2Widget.on('hide', function (e, $el) {\n    const layer = layerWidget($el);\n\n    if ($el.data('aui-remove-on-hide')) {\n        layer.remove();\n    }\n});\n\namdify('aui/dialog2', dialog2Widget);\nglobalize('dialog2', dialog2Widget);\nexport default dialog2Widget;\n","export default function getWindow(node) {\n  if (node == null) {\n    return window;\n  }\n\n  if (node.toString() !== '[object Window]') {\n    var ownerDocument = node.ownerDocument;\n    return ownerDocument ? ownerDocument.defaultView || window : window;\n  }\n\n  return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n  var OwnElement = getWindow(node).Element;\n  return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n  var OwnElement = getWindow(node).HTMLElement;\n  return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n  // IE 11 has no ShadowRoot\n  if (typeof ShadowRoot === 'undefined') {\n    return false;\n  }\n\n  var OwnElement = getWindow(node).ShadowRoot;\n  return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n  var uaData = navigator.userAgentData;\n\n  if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n    return uaData.brands.map(function (item) {\n      return item.brand + \"/\" + item.version;\n    }).join(' ');\n  }\n\n  return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n  return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n  if (includeScale === void 0) {\n    includeScale = false;\n  }\n\n  if (isFixedStrategy === void 0) {\n    isFixedStrategy = false;\n  }\n\n  var clientRect = element.getBoundingClientRect();\n  var scaleX = 1;\n  var scaleY = 1;\n\n  if (includeScale && isHTMLElement(element)) {\n    scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n    scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n  }\n\n  var _ref = isElement(element) ? getWindow(element) : window,\n      visualViewport = _ref.visualViewport;\n\n  var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n  var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n  var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n  var width = clientRect.width / scaleX;\n  var height = clientRect.height / scaleY;\n  return {\n    width: width,\n    height: height,\n    top: y,\n    right: x + width,\n    bottom: y + height,\n    left: x,\n    x: x,\n    y: y\n  };\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n  var win = getWindow(node);\n  var scrollLeft = win.pageXOffset;\n  var scrollTop = win.pageYOffset;\n  return {\n    scrollLeft: scrollLeft,\n    scrollTop: scrollTop\n  };\n}","export default function getNodeName(element) {\n  return element ? (element.nodeName || '').toLowerCase() : null;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n  // $FlowFixMe[incompatible-return]: assume body is always available\n  return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n  element.document) || window.document).documentElement;\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n  // If <html> has a CSS width greater than the viewport, then this will be\n  // incorrect for RTL.\n  // Popper 1 is broken in this case and never had a bug report so let's assume\n  // it's not an issue. I don't think anyone ever specifies width on <html>\n  // anyway.\n  // Browsers where the left scrollbar doesn't cause an issue report `0` for\n  // this (e.g. Edge 2019, IE11, Safari)\n  return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n  return getWindow(element).getComputedStyle(element);\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n  // Firefox wants us to check `-x` and `-y` variations as well\n  var _getComputedStyle = getComputedStyle(element),\n      overflow = _getComputedStyle.overflow,\n      overflowX = _getComputedStyle.overflowX,\n      overflowY = _getComputedStyle.overflowY;\n\n  return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n  var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n  // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n  var width = element.offsetWidth;\n  var height = element.offsetHeight;\n\n  if (Math.abs(clientRect.width - width) <= 1) {\n    width = clientRect.width;\n  }\n\n  if (Math.abs(clientRect.height - height) <= 1) {\n    height = clientRect.height;\n  }\n\n  return {\n    x: element.offsetLeft,\n    y: element.offsetTop,\n    width: width,\n    height: height\n  };\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n  if (getNodeName(element) === 'html') {\n    return element;\n  }\n\n  return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n    // $FlowFixMe[incompatible-return]\n    // $FlowFixMe[prop-missing]\n    element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n    element.parentNode || ( // DOM Element detected\n    isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n    // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n    getDocumentElement(element) // fallback\n\n  );\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n  var _element$ownerDocumen;\n\n  if (list === void 0) {\n    list = [];\n  }\n\n  var scrollParent = getScrollParent(element);\n  var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n  var win = getWindow(scrollParent);\n  var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n  var updatedList = list.concat(target);\n  return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n  updatedList.concat(listScrollParents(getParentNode(target)));\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n  if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n    // $FlowFixMe[incompatible-return]: assume body is always available\n    return node.ownerDocument.body;\n  }\n\n  if (isHTMLElement(node) && isScrollParent(node)) {\n    return node;\n  }\n\n  return getScrollParent(getParentNode(node));\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n  if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n  getComputedStyle(element).position === 'fixed') {\n    return null;\n  }\n\n  return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n  var isFirefox = /firefox/i.test(getUAString());\n  var isIE = /Trident/i.test(getUAString());\n\n  if (isIE && isHTMLElement(element)) {\n    // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n    var elementCss = getComputedStyle(element);\n\n    if (elementCss.position === 'fixed') {\n      return null;\n    }\n  }\n\n  var currentNode = getParentNode(element);\n\n  if (isShadowRoot(currentNode)) {\n    currentNode = currentNode.host;\n  }\n\n  while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n    var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n    // create a containing block.\n    // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n    if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n      return currentNode;\n    } else {\n      currentNode = currentNode.parentNode;\n    }\n  }\n\n  return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n  var window = getWindow(element);\n  var offsetParent = getTrueOffsetParent(element);\n\n  while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n    offsetParent = getTrueOffsetParent(offsetParent);\n  }\n\n  if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n    return window;\n  }\n\n  return offsetParent || getContainingBlock(element) || window;\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n  return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n  return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n  return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n  passive: true\n};\n\nfunction effect(_ref) {\n  var state = _ref.state,\n      instance = _ref.instance,\n      options = _ref.options;\n  var _options$scroll = options.scroll,\n      scroll = _options$scroll === void 0 ? true : _options$scroll,\n      _options$resize = options.resize,\n      resize = _options$resize === void 0 ? true : _options$resize;\n  var window = getWindow(state.elements.popper);\n  var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n  if (scroll) {\n    scrollParents.forEach(function (scrollParent) {\n      scrollParent.addEventListener('scroll', instance.update, passive);\n    });\n  }\n\n  if (resize) {\n    window.addEventListener('resize', instance.update, passive);\n  }\n\n  return function () {\n    if (scroll) {\n      scrollParents.forEach(function (scrollParent) {\n        scrollParent.removeEventListener('scroll', instance.update, passive);\n      });\n    }\n\n    if (resize) {\n      window.removeEventListener('resize', instance.update, passive);\n    }\n  };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'eventListeners',\n  enabled: true,\n  phase: 'write',\n  fn: function fn() {},\n  effect: effect,\n  data: {}\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n  return placement.split('-')[0];\n}","export default function getVariation(placement) {\n  return placement.split('-')[1];\n}","export default function getMainAxisFromPlacement(placement) {\n  return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n  var reference = _ref.reference,\n      element = _ref.element,\n      placement = _ref.placement;\n  var basePlacement = placement ? getBasePlacement(placement) : null;\n  var variation = placement ? getVariation(placement) : null;\n  var commonX = reference.x + reference.width / 2 - element.width / 2;\n  var commonY = reference.y + reference.height / 2 - element.height / 2;\n  var offsets;\n\n  switch (basePlacement) {\n    case top:\n      offsets = {\n        x: commonX,\n        y: reference.y - element.height\n      };\n      break;\n\n    case bottom:\n      offsets = {\n        x: commonX,\n        y: reference.y + reference.height\n      };\n      break;\n\n    case right:\n      offsets = {\n        x: reference.x + reference.width,\n        y: commonY\n      };\n      break;\n\n    case left:\n      offsets = {\n        x: reference.x - element.width,\n        y: commonY\n      };\n      break;\n\n    default:\n      offsets = {\n        x: reference.x,\n        y: reference.y\n      };\n  }\n\n  var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n  if (mainAxis != null) {\n    var len = mainAxis === 'y' ? 'height' : 'width';\n\n    switch (variation) {\n      case start:\n        offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n        break;\n\n      case end:\n        offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n        break;\n\n      default:\n    }\n  }\n\n  return offsets;\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n  top: 'auto',\n  right: 'auto',\n  bottom: 'auto',\n  left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n  var x = _ref.x,\n      y = _ref.y;\n  var dpr = win.devicePixelRatio || 1;\n  return {\n    x: round(x * dpr) / dpr || 0,\n    y: round(y * dpr) / dpr || 0\n  };\n}\n\nexport function mapToStyles(_ref2) {\n  var _Object$assign2;\n\n  var popper = _ref2.popper,\n      popperRect = _ref2.popperRect,\n      placement = _ref2.placement,\n      variation = _ref2.variation,\n      offsets = _ref2.offsets,\n      position = _ref2.position,\n      gpuAcceleration = _ref2.gpuAcceleration,\n      adaptive = _ref2.adaptive,\n      roundOffsets = _ref2.roundOffsets,\n      isFixed = _ref2.isFixed;\n  var _offsets$x = offsets.x,\n      x = _offsets$x === void 0 ? 0 : _offsets$x,\n      _offsets$y = offsets.y,\n      y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n  var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n    x: x,\n    y: y\n  }) : {\n    x: x,\n    y: y\n  };\n\n  x = _ref3.x;\n  y = _ref3.y;\n  var hasX = offsets.hasOwnProperty('x');\n  var hasY = offsets.hasOwnProperty('y');\n  var sideX = left;\n  var sideY = top;\n  var win = window;\n\n  if (adaptive) {\n    var offsetParent = getOffsetParent(popper);\n    var heightProp = 'clientHeight';\n    var widthProp = 'clientWidth';\n\n    if (offsetParent === getWindow(popper)) {\n      offsetParent = getDocumentElement(popper);\n\n      if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n        heightProp = 'scrollHeight';\n        widthProp = 'scrollWidth';\n      }\n    } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n    offsetParent = offsetParent;\n\n    if (placement === top || (placement === left || placement === right) && variation === end) {\n      sideY = bottom;\n      var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n      offsetParent[heightProp];\n      y -= offsetY - popperRect.height;\n      y *= gpuAcceleration ? 1 : -1;\n    }\n\n    if (placement === left || (placement === top || placement === bottom) && variation === end) {\n      sideX = right;\n      var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n      offsetParent[widthProp];\n      x -= offsetX - popperRect.width;\n      x *= gpuAcceleration ? 1 : -1;\n    }\n  }\n\n  var commonStyles = Object.assign({\n    position: position\n  }, adaptive && unsetSides);\n\n  var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n    x: x,\n    y: y\n  }, getWindow(popper)) : {\n    x: x,\n    y: y\n  };\n\n  x = _ref4.x;\n  y = _ref4.y;\n\n  if (gpuAcceleration) {\n    var _Object$assign;\n\n    return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n  }\n\n  return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n  var state = _ref5.state,\n      options = _ref5.options;\n  var _options$gpuAccelerat = options.gpuAcceleration,\n      gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n      _options$adaptive = options.adaptive,\n      adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n      _options$roundOffsets = options.roundOffsets,\n      roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n  var commonStyles = {\n    placement: getBasePlacement(state.placement),\n    variation: getVariation(state.placement),\n    popper: state.elements.popper,\n    popperRect: state.rects.popper,\n    gpuAcceleration: gpuAcceleration,\n    isFixed: state.options.strategy === 'fixed'\n  };\n\n  if (state.modifiersData.popperOffsets != null) {\n    state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n      offsets: state.modifiersData.popperOffsets,\n      position: state.options.strategy,\n      adaptive: adaptive,\n      roundOffsets: roundOffsets\n    })));\n  }\n\n  if (state.modifiersData.arrow != null) {\n    state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n      offsets: state.modifiersData.arrow,\n      position: 'absolute',\n      adaptive: false,\n      roundOffsets: roundOffsets\n    })));\n  }\n\n  state.attributes.popper = Object.assign({}, state.attributes.popper, {\n    'data-popper-placement': state.placement\n  });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'computeStyles',\n  enabled: true,\n  phase: 'beforeWrite',\n  fn: computeStyles,\n  data: {}\n};","var hash = {\n  left: 'right',\n  right: 'left',\n  bottom: 'top',\n  top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n  return placement.replace(/left|right|bottom|top/g, function (matched) {\n    return hash[matched];\n  });\n}","var hash = {\n  start: 'end',\n  end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n  return placement.replace(/start|end/g, function (matched) {\n    return hash[matched];\n  });\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n  var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n  if (parent.contains(child)) {\n    return true;\n  } // then fallback to custom implementation with Shadow DOM support\n  else if (rootNode && isShadowRoot(rootNode)) {\n      var next = child;\n\n      do {\n        if (next && parent.isSameNode(next)) {\n          return true;\n        } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n        next = next.parentNode || next.host;\n      } while (next);\n    } // Give up, the result is false\n\n\n  return false;\n}","export default function rectToClientRect(rect) {\n  return Object.assign({}, rect, {\n    left: rect.x,\n    top: rect.y,\n    right: rect.x + rect.width,\n    bottom: rect.y + rect.height\n  });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n  var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n  rect.top = rect.top + element.clientTop;\n  rect.left = rect.left + element.clientLeft;\n  rect.bottom = rect.top + element.clientHeight;\n  rect.right = rect.left + element.clientWidth;\n  rect.width = element.clientWidth;\n  rect.height = element.clientHeight;\n  rect.x = rect.left;\n  rect.y = rect.top;\n  return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n  return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n  var clippingParents = listScrollParents(getParentNode(element));\n  var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n  var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n  if (!isElement(clipperElement)) {\n    return [];\n  } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n  return clippingParents.filter(function (clippingParent) {\n    return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n  });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n  var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n  var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n  var firstClippingParent = clippingParents[0];\n  var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n    var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n    accRect.top = max(rect.top, accRect.top);\n    accRect.right = min(rect.right, accRect.right);\n    accRect.bottom = min(rect.bottom, accRect.bottom);\n    accRect.left = max(rect.left, accRect.left);\n    return accRect;\n  }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n  clippingRect.width = clippingRect.right - clippingRect.left;\n  clippingRect.height = clippingRect.bottom - clippingRect.top;\n  clippingRect.x = clippingRect.left;\n  clippingRect.y = clippingRect.top;\n  return clippingRect;\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n  var _element$ownerDocumen;\n\n  var html = getDocumentElement(element);\n  var winScroll = getWindowScroll(element);\n  var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n  var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n  var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n  var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n  var y = -winScroll.scrollTop;\n\n  if (getComputedStyle(body || html).direction === 'rtl') {\n    x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n  }\n\n  return {\n    width: width,\n    height: height,\n    x: x,\n    y: y\n  };\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n  var win = getWindow(element);\n  var html = getDocumentElement(element);\n  var visualViewport = win.visualViewport;\n  var width = html.clientWidth;\n  var height = html.clientHeight;\n  var x = 0;\n  var y = 0;\n\n  if (visualViewport) {\n    width = visualViewport.width;\n    height = visualViewport.height;\n    var layoutViewport = isLayoutViewport();\n\n    if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n      x = visualViewport.offsetLeft;\n      y = visualViewport.offsetTop;\n    }\n  }\n\n  return {\n    width: width,\n    height: height,\n    x: x + getWindowScrollBarX(element),\n    y: y\n  };\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n  return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n  return {\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0\n  };\n}","export default function expandToHashMap(value, keys) {\n  return keys.reduce(function (hashMap, key) {\n    hashMap[key] = value;\n    return hashMap;\n  }, {});\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  var _options = options,\n      _options$placement = _options.placement,\n      placement = _options$placement === void 0 ? state.placement : _options$placement,\n      _options$strategy = _options.strategy,\n      strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n      _options$boundary = _options.boundary,\n      boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n      _options$rootBoundary = _options.rootBoundary,\n      rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n      _options$elementConte = _options.elementContext,\n      elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n      _options$altBoundary = _options.altBoundary,\n      altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n      _options$padding = _options.padding,\n      padding = _options$padding === void 0 ? 0 : _options$padding;\n  var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n  var altContext = elementContext === popper ? reference : popper;\n  var popperRect = state.rects.popper;\n  var element = state.elements[altBoundary ? altContext : elementContext];\n  var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n  var referenceClientRect = getBoundingClientRect(state.elements.reference);\n  var popperOffsets = computeOffsets({\n    reference: referenceClientRect,\n    element: popperRect,\n    strategy: 'absolute',\n    placement: placement\n  });\n  var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n  var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n  // 0 or negative = within the clipping rect\n\n  var overflowOffsets = {\n    top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n    bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n    left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n    right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n  };\n  var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n  if (elementContext === popper && offsetData) {\n    var offset = offsetData[placement];\n    Object.keys(overflowOffsets).forEach(function (key) {\n      var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n      var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n      overflowOffsets[key] += offset[axis] * multiply;\n    });\n  }\n\n  return overflowOffsets;\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n  return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n  var v = within(min, value, max);\n  return v > max ? max : v;\n}","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n  if (preventedOffsets === void 0) {\n    preventedOffsets = {\n      x: 0,\n      y: 0\n    };\n  }\n\n  return {\n    top: overflow.top - rect.height - preventedOffsets.y,\n    right: overflow.right - rect.width + preventedOffsets.x,\n    bottom: overflow.bottom - rect.height + preventedOffsets.y,\n    left: overflow.left - rect.width - preventedOffsets.x\n  };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n  return [top, right, bottom, left].some(function (side) {\n    return overflow[side] >= 0;\n  });\n}\n\nfunction hide(_ref) {\n  var state = _ref.state,\n      name = _ref.name;\n  var referenceRect = state.rects.reference;\n  var popperRect = state.rects.popper;\n  var preventedOffsets = state.modifiersData.preventOverflow;\n  var referenceOverflow = detectOverflow(state, {\n    elementContext: 'reference'\n  });\n  var popperAltOverflow = detectOverflow(state, {\n    altBoundary: true\n  });\n  var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n  var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n  var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n  var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n  state.modifiersData[name] = {\n    referenceClippingOffsets: referenceClippingOffsets,\n    popperEscapeOffsets: popperEscapeOffsets,\n    isReferenceHidden: isReferenceHidden,\n    hasPopperEscaped: hasPopperEscaped\n  };\n  state.attributes.popper = Object.assign({}, state.attributes.popper, {\n    'data-popper-reference-hidden': isReferenceHidden,\n    'data-popper-escaped': hasPopperEscaped\n  });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'hide',\n  enabled: true,\n  phase: 'main',\n  requiresIfExists: ['preventOverflow'],\n  fn: hide\n};","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n  defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n  var state = _ref.state,\n      name = _ref.name;\n  // Offsets are the actual position the popper needs to have to be\n  // properly positioned near its reference element\n  // This is the most basic placement, and will be adjusted by\n  // the modifiers in the next step\n  state.modifiersData[name] = computeOffsets({\n    reference: state.rects.reference,\n    element: state.rects.popper,\n    strategy: 'absolute',\n    placement: state.placement\n  });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'popperOffsets',\n  enabled: true,\n  phase: 'read',\n  fn: popperOffsets,\n  data: {}\n};","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n  var state = _ref.state;\n  Object.keys(state.elements).forEach(function (name) {\n    var style = state.styles[name] || {};\n    var attributes = state.attributes[name] || {};\n    var element = state.elements[name]; // arrow is optional + virtual elements\n\n    if (!isHTMLElement(element) || !getNodeName(element)) {\n      return;\n    } // Flow doesn't support to extend this property, but it's the most\n    // effective way to apply styles to an HTMLElement\n    // $FlowFixMe[cannot-write]\n\n\n    Object.assign(element.style, style);\n    Object.keys(attributes).forEach(function (name) {\n      var value = attributes[name];\n\n      if (value === false) {\n        element.removeAttribute(name);\n      } else {\n        element.setAttribute(name, value === true ? '' : value);\n      }\n    });\n  });\n}\n\nfunction effect(_ref2) {\n  var state = _ref2.state;\n  var initialStyles = {\n    popper: {\n      position: state.options.strategy,\n      left: '0',\n      top: '0',\n      margin: '0'\n    },\n    arrow: {\n      position: 'absolute'\n    },\n    reference: {}\n  };\n  Object.assign(state.elements.popper.style, initialStyles.popper);\n  state.styles = initialStyles;\n\n  if (state.elements.arrow) {\n    Object.assign(state.elements.arrow.style, initialStyles.arrow);\n  }\n\n  return function () {\n    Object.keys(state.elements).forEach(function (name) {\n      var element = state.elements[name];\n      var attributes = state.attributes[name] || {};\n      var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n      var style = styleProperties.reduce(function (style, property) {\n        style[property] = '';\n        return style;\n      }, {}); // arrow is optional + virtual elements\n\n      if (!isHTMLElement(element) || !getNodeName(element)) {\n        return;\n      }\n\n      Object.assign(element.style, style);\n      Object.keys(attributes).forEach(function (attribute) {\n        element.removeAttribute(attribute);\n      });\n    });\n  };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'applyStyles',\n  enabled: true,\n  phase: 'write',\n  fn: applyStyles,\n  effect: effect,\n  requires: ['computeStyles']\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n  var basePlacement = getBasePlacement(placement);\n  var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n  var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n    placement: placement\n  })) : offset,\n      skidding = _ref[0],\n      distance = _ref[1];\n\n  skidding = skidding || 0;\n  distance = (distance || 0) * invertDistance;\n  return [left, right].indexOf(basePlacement) >= 0 ? {\n    x: distance,\n    y: skidding\n  } : {\n    x: skidding,\n    y: distance\n  };\n}\n\nfunction offset(_ref2) {\n  var state = _ref2.state,\n      options = _ref2.options,\n      name = _ref2.name;\n  var _options$offset = options.offset,\n      offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n  var data = placements.reduce(function (acc, placement) {\n    acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n    return acc;\n  }, {});\n  var _data$state$placement = data[state.placement],\n      x = _data$state$placement.x,\n      y = _data$state$placement.y;\n\n  if (state.modifiersData.popperOffsets != null) {\n    state.modifiersData.popperOffsets.x += x;\n    state.modifiersData.popperOffsets.y += y;\n  }\n\n  state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'offset',\n  enabled: true,\n  phase: 'main',\n  requires: ['popperOffsets'],\n  fn: offset\n};","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n  if (getBasePlacement(placement) === auto) {\n    return [];\n  }\n\n  var oppositePlacement = getOppositePlacement(placement);\n  return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n  var state = _ref.state,\n      options = _ref.options,\n      name = _ref.name;\n\n  if (state.modifiersData[name]._skip) {\n    return;\n  }\n\n  var _options$mainAxis = options.mainAxis,\n      checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n      _options$altAxis = options.altAxis,\n      checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n      specifiedFallbackPlacements = options.fallbackPlacements,\n      padding = options.padding,\n      boundary = options.boundary,\n      rootBoundary = options.rootBoundary,\n      altBoundary = options.altBoundary,\n      _options$flipVariatio = options.flipVariations,\n      flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n      allowedAutoPlacements = options.allowedAutoPlacements;\n  var preferredPlacement = state.options.placement;\n  var basePlacement = getBasePlacement(preferredPlacement);\n  var isBasePlacement = basePlacement === preferredPlacement;\n  var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n  var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n    return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n      placement: placement,\n      boundary: boundary,\n      rootBoundary: rootBoundary,\n      padding: padding,\n      flipVariations: flipVariations,\n      allowedAutoPlacements: allowedAutoPlacements\n    }) : placement);\n  }, []);\n  var referenceRect = state.rects.reference;\n  var popperRect = state.rects.popper;\n  var checksMap = new Map();\n  var makeFallbackChecks = true;\n  var firstFittingPlacement = placements[0];\n\n  for (var i = 0; i < placements.length; i++) {\n    var placement = placements[i];\n\n    var _basePlacement = getBasePlacement(placement);\n\n    var isStartVariation = getVariation(placement) === start;\n    var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n    var len = isVertical ? 'width' : 'height';\n    var overflow = detectOverflow(state, {\n      placement: placement,\n      boundary: boundary,\n      rootBoundary: rootBoundary,\n      altBoundary: altBoundary,\n      padding: padding\n    });\n    var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n    if (referenceRect[len] > popperRect[len]) {\n      mainVariationSide = getOppositePlacement(mainVariationSide);\n    }\n\n    var altVariationSide = getOppositePlacement(mainVariationSide);\n    var checks = [];\n\n    if (checkMainAxis) {\n      checks.push(overflow[_basePlacement] <= 0);\n    }\n\n    if (checkAltAxis) {\n      checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n    }\n\n    if (checks.every(function (check) {\n      return check;\n    })) {\n      firstFittingPlacement = placement;\n      makeFallbackChecks = false;\n      break;\n    }\n\n    checksMap.set(placement, checks);\n  }\n\n  if (makeFallbackChecks) {\n    // `2` may be desired in some cases – research later\n    var numberOfChecks = flipVariations ? 3 : 1;\n\n    var _loop = function _loop(_i) {\n      var fittingPlacement = placements.find(function (placement) {\n        var checks = checksMap.get(placement);\n\n        if (checks) {\n          return checks.slice(0, _i).every(function (check) {\n            return check;\n          });\n        }\n      });\n\n      if (fittingPlacement) {\n        firstFittingPlacement = fittingPlacement;\n        return \"break\";\n      }\n    };\n\n    for (var _i = numberOfChecks; _i > 0; _i--) {\n      var _ret = _loop(_i);\n\n      if (_ret === \"break\") break;\n    }\n  }\n\n  if (state.placement !== firstFittingPlacement) {\n    state.modifiersData[name]._skip = true;\n    state.placement = firstFittingPlacement;\n    state.reset = true;\n  }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'flip',\n  enabled: true,\n  phase: 'main',\n  fn: flip,\n  requiresIfExists: ['offset'],\n  data: {\n    _skip: false\n  }\n};","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  var _options = options,\n      placement = _options.placement,\n      boundary = _options.boundary,\n      rootBoundary = _options.rootBoundary,\n      padding = _options.padding,\n      flipVariations = _options.flipVariations,\n      _options$allowedAutoP = _options.allowedAutoPlacements,\n      allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n  var variation = getVariation(placement);\n  var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n    return getVariation(placement) === variation;\n  }) : basePlacements;\n  var allowedPlacements = placements.filter(function (placement) {\n    return allowedAutoPlacements.indexOf(placement) >= 0;\n  });\n\n  if (allowedPlacements.length === 0) {\n    allowedPlacements = placements;\n  } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n  var overflows = allowedPlacements.reduce(function (acc, placement) {\n    acc[placement] = detectOverflow(state, {\n      placement: placement,\n      boundary: boundary,\n      rootBoundary: rootBoundary,\n      padding: padding\n    })[getBasePlacement(placement)];\n    return acc;\n  }, {});\n  return Object.keys(overflows).sort(function (a, b) {\n    return overflows[a] - overflows[b];\n  });\n}","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n  var state = _ref.state,\n      options = _ref.options,\n      name = _ref.name;\n  var _options$mainAxis = options.mainAxis,\n      checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n      _options$altAxis = options.altAxis,\n      checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n      boundary = options.boundary,\n      rootBoundary = options.rootBoundary,\n      altBoundary = options.altBoundary,\n      padding = options.padding,\n      _options$tether = options.tether,\n      tether = _options$tether === void 0 ? true : _options$tether,\n      _options$tetherOffset = options.tetherOffset,\n      tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n  var overflow = detectOverflow(state, {\n    boundary: boundary,\n    rootBoundary: rootBoundary,\n    padding: padding,\n    altBoundary: altBoundary\n  });\n  var basePlacement = getBasePlacement(state.placement);\n  var variation = getVariation(state.placement);\n  var isBasePlacement = !variation;\n  var mainAxis = getMainAxisFromPlacement(basePlacement);\n  var altAxis = getAltAxis(mainAxis);\n  var popperOffsets = state.modifiersData.popperOffsets;\n  var referenceRect = state.rects.reference;\n  var popperRect = state.rects.popper;\n  var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n    placement: state.placement\n  })) : tetherOffset;\n  var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n    mainAxis: tetherOffsetValue,\n    altAxis: tetherOffsetValue\n  } : Object.assign({\n    mainAxis: 0,\n    altAxis: 0\n  }, tetherOffsetValue);\n  var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n  var data = {\n    x: 0,\n    y: 0\n  };\n\n  if (!popperOffsets) {\n    return;\n  }\n\n  if (checkMainAxis) {\n    var _offsetModifierState$;\n\n    var mainSide = mainAxis === 'y' ? top : left;\n    var altSide = mainAxis === 'y' ? bottom : right;\n    var len = mainAxis === 'y' ? 'height' : 'width';\n    var offset = popperOffsets[mainAxis];\n    var min = offset + overflow[mainSide];\n    var max = offset - overflow[altSide];\n    var additive = tether ? -popperRect[len] / 2 : 0;\n    var minLen = variation === start ? referenceRect[len] : popperRect[len];\n    var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n    // outside the reference bounds\n\n    var arrowElement = state.elements.arrow;\n    var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n      width: 0,\n      height: 0\n    };\n    var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n    var arrowPaddingMin = arrowPaddingObject[mainSide];\n    var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n    // to include its full size in the calculation. If the reference is small\n    // and near the edge of a boundary, the popper can overflow even if the\n    // reference is not overflowing as well (e.g. virtual elements with no\n    // width or height)\n\n    var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n    var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n    var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n    var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n    var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n    var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n    var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n    var tetherMax = offset + maxOffset - offsetModifierValue;\n    var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n    popperOffsets[mainAxis] = preventedOffset;\n    data[mainAxis] = preventedOffset - offset;\n  }\n\n  if (checkAltAxis) {\n    var _offsetModifierState$2;\n\n    var _mainSide = mainAxis === 'x' ? top : left;\n\n    var _altSide = mainAxis === 'x' ? bottom : right;\n\n    var _offset = popperOffsets[altAxis];\n\n    var _len = altAxis === 'y' ? 'height' : 'width';\n\n    var _min = _offset + overflow[_mainSide];\n\n    var _max = _offset - overflow[_altSide];\n\n    var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n    var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n    var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n    var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n    var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n    popperOffsets[altAxis] = _preventedOffset;\n    data[altAxis] = _preventedOffset - _offset;\n  }\n\n  state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'preventOverflow',\n  enabled: true,\n  phase: 'main',\n  fn: preventOverflow,\n  requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n  return axis === 'x' ? 'y' : 'x';\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n  padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n    placement: state.placement\n  })) : padding;\n  return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n  var _state$modifiersData$;\n\n  var state = _ref.state,\n      name = _ref.name,\n      options = _ref.options;\n  var arrowElement = state.elements.arrow;\n  var popperOffsets = state.modifiersData.popperOffsets;\n  var basePlacement = getBasePlacement(state.placement);\n  var axis = getMainAxisFromPlacement(basePlacement);\n  var isVertical = [left, right].indexOf(basePlacement) >= 0;\n  var len = isVertical ? 'height' : 'width';\n\n  if (!arrowElement || !popperOffsets) {\n    return;\n  }\n\n  var paddingObject = toPaddingObject(options.padding, state);\n  var arrowRect = getLayoutRect(arrowElement);\n  var minProp = axis === 'y' ? top : left;\n  var maxProp = axis === 'y' ? bottom : right;\n  var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n  var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n  var arrowOffsetParent = getOffsetParent(arrowElement);\n  var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n  var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n  // outside of the popper bounds\n\n  var min = paddingObject[minProp];\n  var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n  var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n  var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n  var axisProp = axis;\n  state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n  var state = _ref2.state,\n      options = _ref2.options;\n  var _options$element = options.element,\n      arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n  if (arrowElement == null) {\n    return;\n  } // CSS selector\n\n\n  if (typeof arrowElement === 'string') {\n    arrowElement = state.elements.popper.querySelector(arrowElement);\n\n    if (!arrowElement) {\n      return;\n    }\n  }\n\n  if (!contains(state.elements.popper, arrowElement)) {\n    return;\n  }\n\n  state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'arrow',\n  enabled: true,\n  phase: 'main',\n  fn: arrow,\n  effect: effect,\n  requires: ['popperOffsets'],\n  requiresIfExists: ['preventOverflow']\n};","export default function debounce(fn) {\n  var pending;\n  return function () {\n    if (!pending) {\n      pending = new Promise(function (resolve) {\n        Promise.resolve().then(function () {\n          pending = undefined;\n          resolve(fn());\n        });\n      });\n    }\n\n    return pending;\n  };\n}","export default function mergeByName(modifiers) {\n  var merged = modifiers.reduce(function (merged, current) {\n    var existing = merged[current.name];\n    merged[current.name] = existing ? Object.assign({}, existing, current, {\n      options: Object.assign({}, existing.options, current.options),\n      data: Object.assign({}, existing.data, current.data)\n    }) : current;\n    return merged;\n  }, {}); // IE11 does not support Object.values\n\n  return Object.keys(merged).map(function (key) {\n    return merged[key];\n  });\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n  var map = new Map();\n  var visited = new Set();\n  var result = [];\n  modifiers.forEach(function (modifier) {\n    map.set(modifier.name, modifier);\n  }); // On visiting object, check for its dependencies and visit them recursively\n\n  function sort(modifier) {\n    visited.add(modifier.name);\n    var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n    requires.forEach(function (dep) {\n      if (!visited.has(dep)) {\n        var depModifier = map.get(dep);\n\n        if (depModifier) {\n          sort(depModifier);\n        }\n      }\n    });\n    result.push(modifier);\n  }\n\n  modifiers.forEach(function (modifier) {\n    if (!visited.has(modifier.name)) {\n      // check for visited object\n      sort(modifier);\n    }\n  });\n  return result;\n}\n\nexport default function orderModifiers(modifiers) {\n  // order based on dependencies\n  var orderedModifiers = order(modifiers); // order based on phase\n\n  return modifierPhases.reduce(function (acc, phase) {\n    return acc.concat(orderedModifiers.filter(function (modifier) {\n      return modifier.phase === phase;\n    }));\n  }, []);\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n  var rect = element.getBoundingClientRect();\n  var scaleX = round(rect.width) / element.offsetWidth || 1;\n  var scaleY = round(rect.height) / element.offsetHeight || 1;\n  return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n  if (isFixed === void 0) {\n    isFixed = false;\n  }\n\n  var isOffsetParentAnElement = isHTMLElement(offsetParent);\n  var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n  var documentElement = getDocumentElement(offsetParent);\n  var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n  var scroll = {\n    scrollLeft: 0,\n    scrollTop: 0\n  };\n  var offsets = {\n    x: 0,\n    y: 0\n  };\n\n  if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n    if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n    isScrollParent(documentElement)) {\n      scroll = getNodeScroll(offsetParent);\n    }\n\n    if (isHTMLElement(offsetParent)) {\n      offsets = getBoundingClientRect(offsetParent, true);\n      offsets.x += offsetParent.clientLeft;\n      offsets.y += offsetParent.clientTop;\n    } else if (documentElement) {\n      offsets.x = getWindowScrollBarX(documentElement);\n    }\n  }\n\n  return {\n    x: rect.left + scroll.scrollLeft - offsets.x,\n    y: rect.top + scroll.scrollTop - offsets.y,\n    width: rect.width,\n    height: rect.height\n  };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n  if (node === getWindow(node) || !isHTMLElement(node)) {\n    return getWindowScroll(node);\n  } else {\n    return getHTMLElementScroll(node);\n  }\n}","export default function getHTMLElementScroll(element) {\n  return {\n    scrollLeft: element.scrollLeft,\n    scrollTop: element.scrollTop\n  };\n}","import { createPopper } from '@popperjs/core';\n\nconst ATTR_ALIGNMENT = 'alignment';\nconst DEFAULT_ATTACHMENT = 'right middle';\nexport const ATTR_CONTAINER = 'alignment-container';\nconst CLASS_PREFIX_SIDE = 'aui-alignment-side-';\nconst CLASS_PREFIX_SNAP = 'aui-alignment-snap-';\nexport const GPU_ACCELERATION_FLAG = 'aui-alignment-use-gpu';\n\n/**\n * The \"side\" and \"snap\" that an element should use when aligning, where:\n * - \"side\" is the edge of the **target** that the aligned element should touch, and\n * - \"snap\" is the effective position that both the target and aligned element should share.\n * @enum {String}\n * @name AlignmentType\n */\nconst ALIGNMENT_MAP = {\n    'top left': 'top-start',\n    'top center': 'top',\n    'top right': 'top-end',\n    'right top': 'right-start',\n    'right middle': 'right',\n    'right bottom': 'right-end',\n    'bottom right': 'bottom-end',\n    'bottom center': 'bottom',\n    'bottom left': 'bottom-start',\n    'left bottom': 'left-end',\n    'left middle': 'left',\n    'left top': 'left-start',\n};\n\nfunction getAttribute(element, name) {\n    return element.getAttribute(name) || element.getAttribute('data-aui-' + name);\n}\n\nfunction getAlignmentAttribute(element) {\n    return getAttribute(element, ATTR_ALIGNMENT) || DEFAULT_ATTACHMENT;\n}\n\nfunction getPlacement(element) {\n    const attr = getAlignmentAttribute(element);\n    return ALIGNMENT_MAP[attr] || 'right';\n}\n\nfunction getAlignment(element) {\n    let [side, snap] = getAlignmentAttribute(element).split(' ');\n    return {\n        side,\n        snap,\n    };\n}\n\nfunction addAlignmentClasses(element, side, snap) {\n    const sideClass = CLASS_PREFIX_SIDE + side;\n    const snapClass = CLASS_PREFIX_SNAP + snap;\n\n    if (!element.classList.contains(sideClass)) {\n        element.classList.add(sideClass);\n    }\n\n    if (!element.classList.contains(snapClass)) {\n        element.classList.add(snapClass);\n    }\n}\n\nfunction getContainer(element) {\n    let container = getAttribute(element, ATTR_CONTAINER) || window;\n\n    if (typeof container === 'string') {\n        container = document.querySelector(container);\n    }\n\n    return container;\n}\n\nfunction calculateBestAlignmentSnap(target) {\n    let container = getContainer(target);\n    let snap = 'left';\n\n    if (!container || container === window || container === document) {\n        container = document.documentElement;\n    }\n\n    if (container && container.nodeType && container.nodeType === Node.ELEMENT_NODE) {\n        let containerBounds = container.getBoundingClientRect();\n        let targetBounds = target.getBoundingClientRect();\n\n        if (\n            targetBounds.left - containerBounds.left >\n            (containerBounds.right - containerBounds.left) / 2\n        ) {\n            snap = 'right';\n        }\n    }\n\n    return snap;\n}\n\nfunction calculatePlacement(element, target) {\n    const alignment = getAlignment(element);\n\n    let placement;\n\n    if (!alignment.snap || alignment.snap === 'auto') {\n        alignment.snap = calculateBestAlignmentSnap(target);\n\n        if (alignment.side === 'submenu') {\n            placement = ALIGNMENT_MAP[`${alignment.snap === 'right' ? 'left' : 'right'} top`];\n        } else {\n            placement = ALIGNMENT_MAP[`${alignment.side} ${alignment.snap}`];\n        }\n    } else {\n        placement = getPlacement(element);\n    }\n\n    return placement;\n}\n/*\n    this determines allowed flip placement e.g.\n    for top it will try to position itself at the top,\n    if there is no space try to flip to bottom\n*/\nconst allowedPlacement = {\n    auto: [],\n    top: ['top', 'bottom'],\n    right: ['right', 'left'],\n    bottom: ['bottom', 'top'],\n    left: ['left', 'right'],\n};\n\n/**\n * Visually positions an element adjacent to another one in the DOM.\n * Can also be told to keep the element aligned\n * when the user resizes the browser or scrolls around the page.\n * @constructor\n * @constructs Alignment\n * @param {HTMLElement} element - the element that will be repositioned. Should have an \"alignment\" attribute\n *   with a valid {@link AlignmentType} value.\n * @param {HTMLElement} target - the point in the DOM to visually position the {@param element} adjacent to.\n * @param {Object} [options]\n * @param {Array.<Number>} [options.offset] - array containing [skidding, distance]. if present, will cause\n *   the element to offset from the trigger; Defaults to [0,0] (no offset)\n *   skidding, displaces the popper along the reference element.\n *   distance, displaces the popper away from, or toward, the reference element in the direction of its placement\n * @param {boolean} [options.preventOverflow=true] - if true, will cause element to not overflow viewable area\n * @param {boolean} [options.flip=true] - if true, will cause the element to attempt to reposition itself within\n *   a viewable area as its {@param target} disappears from view.\n * @param {HTMLElement|'viewport'|'window'|'scrollContainer'} [options.flipContainer='viewport'] - the container\n *   in which the element should attempt to stay within the viewable area of.\n *   Used in conjunction with {@param options.flip}.\n * @param {HTMLElement|'viewport'|'window'|'scrollContainer'} [options.overflowContainer='window'] - the container\n *   in which the element should attempt to stay within the viewable area of.\n *   Used in conjunction with {@param options.preventOverflow}.\n * @param {Function} [options.onCreate] - called when the element is first positioned upon creation of the Alignment.\n * @param {Function} [options.onUpdate] - called whenever the element is positioned, except upon creation.\n * @param {Function} [options.onEvents]\n * @param {Function} [options.onEvents.enabled] - called when the scroll and resize events are added.\n * @param {Function} [options.onEvents.disabled] - called when the scroll and resize events are removed.\n * @param {boolean} [options.eventsEnabled=false] - if true, will cause the element to attempt to reposition itself on\n *   scroll and resize. Equivalent of calling .enable() after init but saves one update cycle.\n */\nfunction Alignment(element, target, options = {}) {\n    const alignment = getAlignment(element);\n    const placement = calculatePlacement(element, target);\n    const allowedAutoPlacements = allowedPlacement[placement.split('-')[0]];\n\n    const frame = target.ownerDocument.defaultView.frameElement;\n\n    this._eventListenersEnabled = options.hasOwnProperty('eventsEnabled')\n        ? options.eventsEnabled\n        : false;\n    this._triggerOnEvents = false;\n\n    const modifiers = [\n        {\n            name: 'flip',\n            enabled: options.hasOwnProperty('flip') ? options.flip : true,\n            options: {\n                allowedAutoPlacements,\n                boundary:\n                    frame ||\n                    (options.hasOwnProperty('flipContainer')\n                        ? options.flipContainer\n                        : 'clippingParents'), // clippingParents by default\n            },\n        },\n        {\n            name: 'preventOverflow',\n            enabled: options.hasOwnProperty('preventOverflow') ? options.preventOverflow : true,\n            options: {\n                padding: 0, // as of Popper 2.0 it's 0 by default, but explicitly specify in case of defaults change.\n                escapeWithReference: false,\n                rootBoundary: frame\n                    ? 'document'\n                    : options.hasOwnProperty('overflowContainer')\n                      ? options.overflowContainer\n                      : 'document', //viewport by default\n            },\n        },\n        {\n            name: 'offset',\n            enabled: options.hasOwnProperty('offset') && !!options.offset,\n            options: {\n                offset: options.offset,\n            },\n        },\n        {\n            name: 'hide',\n            enabled: false,\n        },\n        {\n            name: 'computeStyles',\n            options: {\n                gpuAcceleration: document.body.classList.contains(GPU_ACCELERATION_FLAG),\n                // adaptive: false, // true by default, breaks CSS transitions (do we need it?)\n            },\n        },\n        {\n            name: 'eventListeners',\n            enabled: this._eventListenersEnabled,\n        },\n        {\n            // left for backwards compatibility\n            name: 'x-placement',\n            enabled: true,\n            phase: 'write',\n            requires: ['computeStyles'],\n            fn: ({ state }) => {\n                if (state.elements.popper) {\n                    // popper-specific attributes are NOT contracted, public API of AUI layered element\n                    state.elements.popper.setAttribute('x-placement', state.placement);\n                }\n            },\n        },\n        {\n            name: 'onUpdate',\n            enabled: options.hasOwnProperty('onUpdate'),\n            phase: 'afterWrite',\n            effect: ({ state, name }) => {\n                // enable it after initial cycle\n                state.modifiersData[`${name}#persistent`] = {\n                    enabled: true,\n                    fn: options.onUpdate,\n                };\n            },\n\n            fn: ({ state, name }) => {\n                const o = state.modifiersData[`${name}#persistent`];\n\n                if (o.enabled) {\n                    o.fn();\n                }\n\n                return state;\n            },\n        },\n        {\n            name: 'onEvents',\n            enabled: options.hasOwnProperty('onEvents'),\n            phase: 'afterWrite',\n            effect: ({ state, name }) => {\n                // enable it after initial cycle\n                state.modifiersData[`${name}#persistent`] = {\n                    fn: options.onEvents,\n                };\n            },\n            fn: ({ state, name }) => {\n                const o = state.modifiersData[`${name}#persistent`];\n\n                if (this._triggerOnEvents) {\n                    if (this._eventListenersEnabled) {\n                        o.fn.enabled && o.fn.enabled();\n                    } else {\n                        o.fn.disabled && o.fn.disabled();\n                    }\n                    this._triggerOnEvents = false;\n                }\n                return state;\n            },\n        },\n    ];\n\n    // IE/Edge may throw a \"Permission denied\" error when strict-comparing two documents\n    // eslint-disable-next-line eqeqeq\n    if (frame && target.ownerDocument != element.ownerDocument) {\n        modifiers.push({\n            name: 'iframeOffset',\n            enabled: true,\n            fn(data) {\n                const rect = frame.getBoundingClientRect();\n                const style = window.getComputedStyle(frame);\n                const sum = (a, b) => a + b;\n                const getTotalValue = (values) =>\n                    values.map(parseFloat).filter(Boolean).reduce(sum, 0);\n\n                const top = getTotalValue([rect.top, style.paddingTop, style.borderTop]);\n\n                const left = getTotalValue([rect.left, style.paddingLeft, style.borderLeft]);\n\n                data.offsets.reference.left += left;\n                data.offsets.reference.top += top;\n\n                data.offsets.popper.left += left;\n                data.offsets.popper.top += top;\n\n                return data;\n            },\n        });\n    }\n\n    const popperConfig = {\n        placement, //controlled by the flip modifier\n        strategy:\n            options.hasOwnProperty('positionFixed') && !options.positionFixed\n                ? 'absolute'\n                : 'fixed',\n        modifiers,\n        onFirstUpdate: options.onCreate,\n    };\n\n    this.popper = createPopper(target, element, popperConfig);\n\n    addAlignmentClasses(element, alignment.side, alignment.snap);\n}\n\nAlignment.prototype = {\n    destroy() {\n        this.popper.destroy();\n        return this;\n    },\n\n    /**\n     * In extreme situations may cause element to be inaccessible. To be considered as 9.1.1 bugfix / 9.2.0 improvement?\n     *\n     * Changes what the aligned element is trying to align itself with.\n     * Will call {@link #scheduleUpdate} as needed to ensure the element will be aligned\n     * with whatever the new target is.\n     * @param {HTMLElement} newTarget - the new target DOM element to align the element with.\n     * @returns {Alignment}\n     */\n    changeTarget(newTarget) {\n        const referenceEl = newTarget.jquery ? newTarget[0] : newTarget;\n        if (referenceEl && referenceEl !== this.popper.state.elements.reference) {\n            this.popper.state.elements.reference = referenceEl;\n            this.popper.setOptions({}); // .options() re-instanciate all modifiers and updates the view\n        }\n        return this;\n    },\n\n    /**\n     * The position of the element will be updated on the next execution stack.\n     * Triggering a render this way will always be asynchronous.\n     * @returns {Alignment}\n     */\n    scheduleUpdate() {\n        this.popper.update();\n        return this;\n    },\n\n    /**\n     * Causes the position of the element to auto-update\n     * when the browser window resizes or scroll parent is scrolled.\n     * @returns {Alignment}\n     */\n    enable() {\n        this._eventListenersEnabled = true;\n        this._triggerOnEvents = true;\n\n        this.popper.setOptions({}); // setOptions will re-instanciate all modifiers.\n        return this;\n    },\n\n    /**\n     * Prevents the position of the element from auto-updating\n     * when the browser window resizes or scroll parent is scrolled.\n     * @returns {Alignment}\n     */\n    disable() {\n        this._eventListenersEnabled = false;\n        this._triggerOnEvents = true;\n\n        this.popper.setOptions({}); // setOptions will re-instanciate all modifiers.\n        return this;\n    },\n};\n\nexport default Alignment;\n","import $ from '../jquery';\n\nconst DELAY = 12;\n\n// an element can be detached and then attached multiple times\n// in some situations -- e.g., when re-appending an element to\n// another place in the DOM.\nfunction ifGone(element) {\n    let deferred = new $.Deferred();\n    if (element) {\n        setTimeout(() => {\n            if (!element.parentElement) {\n                deferred.resolve();\n            }\n        }, DELAY);\n    } else {\n        deferred.reject();\n    }\n    return deferred.promise();\n}\n\nexport { DELAY, ifGone };\n","import { I18n } from './i18n';\nimport './spinner';\nimport $ from './jquery';\nimport template from 'skatejs-template-html';\nimport * as deprecate from './internal/deprecation';\nimport * as logger from './internal/log';\nimport { debounce } from 'underscore';\nimport { supportsVoiceOver } from './internal/browser';\nimport Alignment from './internal/alignment';\nimport keyCode from './key-code';\nimport layer from './layer';\nimport state from './internal/state';\nimport skate from './internal/skate';\nimport escapeHtml from './escape-html';\nimport { ifGone } from './internal/elements';\nimport { doIfTrigger, setTrigger } from './trigger';\nimport generateUniqueId from './unique-id';\n\nfunction isHidden(el) {\n    return el.hasAttribute('hidden') || el.classList.contains('hidden');\n}\n\nfunction setDropdownTriggerActiveState(trigger, isActive) {\n    trigger.setAttribute('aria-expanded', !!isActive);\n    trigger.classList[isActive ? 'add' : 'remove']('active', 'aui-dropdown2-active');\n}\n\n/**\n * Focus the appropriate thing when a dropdown is shown.\n * The element focussed will vary depending on the type of dropdown and\n * the input modality.\n *\n * @param {HTMLElement} dropdown - the dropdown being shown\n * @param {Event} [e] - the event that triggered the dropdown being shown\n */\nfunction handleFocus(dropdown, e = {}) {\n    if (e && e.type && e.type.indexOf('mouse') === -1) {\n        const isKeyDownEvent = e.type.indexOf('key') > -1;\n        if (dropdown.isSubmenu) {\n            dropdown.focusItem(0);\n        } else if (isKeyDownEvent) {\n            const isUpArrow = e.keyCode === keyCode.UP;\n            // set focus to last item in the menu to navigate bottom -> up\n            if (isUpArrow) {\n                const visibleItems = getVisibleDropdownItems(dropdown);\n                if (visibleItems && visibleItems.length) {\n                    dropdown.focusItem(visibleItems.length - 1);\n                }\n            } else {\n                // if enter/space/downArrow than focus goes to the first item\n                dropdown.focusItem(0);\n            }\n        } else {\n            dropdown.focus();\n        }\n    }\n}\n\n// LOADING STATES\nvar UNLOADED = 'unloaded';\nvar LOADING = 'loading';\nvar ERROR = 'error';\nvar SUCCESS = 'success';\n\n// ASYNC DROPDOWN FUNCTIONS\n\nfunction makeAsyncDropdownContents(json) {\n    return json\n        .map(function makeSection(sectionData) {\n            var sectionItemsHtml = sectionData.items\n                .map(function makeSectionItem(itemData) {\n                    function makeBooleanAttribute(attr) {\n                        return itemData[attr] ? `${attr} =\"true\"` : '';\n                    }\n\n                    function makeItemAttribute(attr) {\n                        return itemData[attr] ? `${attr}=\"${itemData[attr]}\"` : '';\n                    }\n\n                    var tagName = 'aui-item-' + itemData.type;\n                    return `<${tagName} ${makeItemAttribute('for')} ${makeItemAttribute('href')} ${makeBooleanAttribute('interactive')}\n                        ${makeBooleanAttribute('checked')} ${makeBooleanAttribute('disabled')} ${makeBooleanAttribute('hidden')} ${makeItemAttribute('data-value')} ${makeItemAttribute('item-id')}>\n                        ${escapeHtml(itemData.content)}\n                    </${tagName}>`;\n                })\n                .join('');\n\n            function makeSectionAttribute(attr) {\n                return sectionData[attr] ? `${attr}=\"${sectionData[attr]}\"` : '';\n            }\n\n            return `<aui-section ${makeSectionAttribute('label')} ${makeSectionAttribute('aria-label')}>\n                ${sectionItemsHtml}\n            </aui-section>`;\n        })\n        .join('\\n');\n}\n\nfunction setDropdownContents(dropdown, json) {\n    state(dropdown).set('loading-state', SUCCESS);\n    dropdown.innerHTML = makeAsyncDropdownContents(json);\n    skate.init(dropdown);\n}\n\nfunction setDropdownErrorState(dropdown) {\n    state(dropdown).set('loading-state', ERROR);\n    state(dropdown).set('hasErrorBeenShown', dropdown.isVisible());\n    dropdown.innerHTML = `\n        <div class=\"aui-message aui-message-error aui-dropdown-error\">\n            <p>${I18n.getText('aui.dropdown.async.error')}</p>\n        </div>\n    `;\n}\n\nfunction setDropdownLoadingState(dropdown) {\n    state(dropdown).set('loading-state', LOADING);\n    state(dropdown).set('hasErrorBeenShown', false);\n\n    doIfTrigger(dropdown, function (trigger) {\n        trigger.setAttribute('aria-busy', 'true');\n    });\n\n    dropdown.innerHTML = `\n        <div class=\"aui-dropdown-loading\">\n            <aui-spinner size=\"small\"></aui-spinner> ${I18n.getText('aui.dropdown.async.loading')}\n        </div>\n    `;\n}\n\nfunction setDropdownLoaded(dropdown) {\n    doIfTrigger(dropdown, function (trigger) {\n        trigger.setAttribute('aria-busy', 'false');\n    });\n}\n\nfunction loadContentsIfAsync(dropdown) {\n    if (!dropdown.src || state(dropdown).get('loading-state') === LOADING) {\n        return;\n    }\n\n    setDropdownLoadingState(dropdown);\n\n    $.ajax(dropdown.src)\n        .done(function (json, status, xhr) {\n            var isValidStatus = xhr.status === 200;\n            if (isValidStatus) {\n                setDropdownContents(dropdown, json);\n            } else {\n                setDropdownErrorState(dropdown);\n            }\n        })\n        .fail(function () {\n            setDropdownErrorState(dropdown);\n        })\n        .always(function () {\n            setDropdownLoaded(dropdown);\n        });\n}\n\nfunction loadContentWhenMouseEnterTrigger(dropdown) {\n    var isDropdownUnloaded = state(dropdown).get('loading-state') === UNLOADED;\n    var hasCurrentErrorBeenShown = state(dropdown).get('hasErrorBeenShown');\n    if (isDropdownUnloaded || (hasCurrentErrorBeenShown && !dropdown.isVisible())) {\n        loadContentsIfAsync(dropdown);\n    }\n}\n\nfunction loadContentWhenMenuShown(dropdown) {\n    var isDropdownUnloaded = state(dropdown).get('loading-state') === UNLOADED;\n    var hasCurrentErrorBeenShown = state(dropdown).get('hasErrorBeenShown');\n    if (isDropdownUnloaded || hasCurrentErrorBeenShown) {\n        loadContentsIfAsync(dropdown);\n    }\n    if (state(dropdown).get('loading-state') === ERROR) {\n        state(dropdown).set('hasErrorBeenShown', true);\n    }\n}\n\n// The dropdown's trigger\n// ----------------------\n\nfunction triggerCreated(trigger) {\n    let dropdownID = trigger.getAttribute('aria-controls');\n\n    if (!dropdownID) {\n        dropdownID = trigger.getAttribute('aria-owns');\n\n        if (!dropdownID) {\n            logger.error(\n                'Dropdown triggers need either a \"aria-owns\" or \"aria-controls\" attribute'\n            );\n        } else {\n            trigger.removeAttribute('aria-owns');\n            trigger.setAttribute('aria-controls', dropdownID);\n        }\n    }\n\n    trigger.setAttribute('aria-haspopup', true);\n    trigger.setAttribute('aria-expanded', false);\n\n    const shouldSetHref = trigger.nodeName === 'A' && !trigger.href;\n    if (shouldSetHref) {\n        trigger.setAttribute('href', `#${dropdownID}`);\n    }\n\n    function handleIt(e, forceShow = false) {\n        if (e.currentTarget !== trigger) {\n            return;\n        }\n        e.preventDefault();\n\n        if (!trigger.isEnabled()) {\n            return;\n        }\n\n        const dropdown = document.getElementById(dropdownID);\n        if (!dropdown) {\n            logger.error('Could not find a dropdown with id \"' + dropdownID + '\" in the DOM.');\n            return;\n        }\n\n        // AUI-4271 - Maintains legacy integration with parent elements.\n        const $trigger = $(trigger);\n        if ($trigger.parent().hasClass('aui-buttons')) {\n            dropdown.classList.add('aui-dropdown2-in-buttons');\n        }\n        if ($trigger.parents().hasClass('aui-header')) {\n            dropdown.classList.add('aui-dropdown2-in-header');\n        }\n\n        if (forceShow) {\n            dropdown.show(e);\n        } else {\n            dropdown.toggle(e);\n        }\n        dropdown.isSubmenu = trigger.hasSubmenu();\n\n        return dropdown;\n    }\n\n    function handleMouseEnter(e) {\n        if (e.currentTarget !== trigger) {\n            return;\n        }\n        e.preventDefault();\n\n        if (!trigger.isEnabled()) {\n            return;\n        }\n\n        const dropdown = document.getElementById(dropdownID);\n        if (!dropdown) {\n            logger.error('Could not find a dropdown with id \"' + dropdownID + '\" in the DOM.');\n            return;\n        }\n\n        loadContentWhenMouseEnterTrigger(dropdown);\n\n        if (trigger.hasSubmenu()) {\n            dropdown.show(e);\n            dropdown.isSubmenu = trigger.hasSubmenu();\n        }\n\n        return dropdown;\n    }\n\n    function handleKeydown(e) {\n        if (e.currentTarget !== trigger) {\n            return;\n        }\n        const normalInvoke = e.keyCode === keyCode.ENTER || e.keyCode === keyCode.SPACE;\n        const submenuInvoke = e.keyCode === keyCode.RIGHT && trigger.hasSubmenu();\n        const rootMenuInvoke =\n            (e.keyCode === keyCode.UP || e.keyCode === keyCode.DOWN) && !trigger.hasSubmenu();\n\n        if (normalInvoke) {\n            handleIt(e);\n        } else if (rootMenuInvoke || submenuInvoke) {\n            // this could be the first keyboard event after using an AT shortcut to open the dropdown.\n            handleIt(e, document.activeElement === trigger);\n        }\n    }\n\n    $(trigger)\n        .on('aui-button-invoke', handleIt)\n        .on('click', handleIt)\n        .on('keydown', handleKeydown)\n        .on('mouseenter', handleMouseEnter);\n}\n\nvar triggerPrototype = {\n    disable: function () {\n        this.setAttribute('aria-disabled', 'true');\n        this.classList.add('disabled', 'aui-dropdown2-disabled');\n    },\n\n    enable: function () {\n        this.setAttribute('aria-disabled', 'false');\n        this.classList.remove('disabled', 'aui-dropdown2-disabled');\n    },\n\n    isEnabled: function () {\n        return (\n            this.getAttribute('aria-disabled') !== 'true' &&\n            this.classList.contains('aui-dropdown2-disabled') === false\n        );\n    },\n\n    hasSubmenu: function () {\n        return this.classList.contains('aui-dropdown2-sub-trigger');\n    },\n};\n\n//To remove at a later date. Some dropdown triggers initialise lazily, so we need to listen for mousedown\n//and synchronously init before the click event is fired.\n//TODO: delete in AUI 8.0.0, see AUI-2868\nfunction bindLazyTriggerInitialisation() {\n    $(document).on('mousedown', '.aui-dropdown2-trigger', function () {\n        var isElementSkated = this.hasAttribute('resolved');\n        if (!isElementSkated) {\n            skate.init(this);\n            var lazyDeprecate = deprecate.getMessageLogger('Dropdown2 lazy initialisation', {\n                removeInVersion: '12.0.0',\n                alternativeName: 'initialisation on DOM insertion',\n                sinceVersion: '5.8.0',\n                extraInfo:\n                    'Dropdown2 triggers should have all necessary attributes on DOM insertion',\n                deprecationType: 'JS',\n            });\n            lazyDeprecate();\n        }\n    });\n}\n\nbindLazyTriggerInitialisation();\n\n// Dropdown trigger groups\n// -----------------------\n\n$(document).on(\n    'mouseenter',\n    '.aui-dropdown2-trigger-group a, .aui-dropdown2-trigger-group button',\n    function (e) {\n        const $item = $(e.currentTarget);\n\n        if ($item.is('.aui-dropdown2-active')) {\n            return; // No point doing anything if we're hovering over the already-active item trigger.\n        }\n\n        if ($item.closest('.aui-dropdown2').length) {\n            return; // We don't want to deal with dropdown items, just the potential triggers in the group.\n        }\n\n        const $triggerGroup = $item.closest('.aui-dropdown2-trigger-group');\n\n        const $groupActiveTrigger = $triggerGroup.find('.aui-dropdown2-active');\n        if ($groupActiveTrigger.length && $item.is('.aui-dropdown2-trigger')) {\n            $groupActiveTrigger.trigger('blur'); // Remove focus from the previously opened menu.\n            $item.trigger('aui-button-invoke'); // Open this trigger's menu.\n            e.preventDefault();\n        }\n\n        const $groupFocusedTrigger = $triggerGroup.find(':focus');\n        if ($groupFocusedTrigger.length && $item.is('.aui-dropdown2-trigger')) {\n            $groupFocusedTrigger.trigger('blur');\n        }\n    }\n);\n\n// Dropdown items\n// --------------\n\nfunction getDropdownItems(dropdown, filter) {\n    return $(dropdown)\n        .find(\n            [\n                // Legacy markup.\n                '> ul > li',\n                '> .aui-dropdown2-section > ul > li',\n                '> .aui-dropdown2-section > div[role=\"group\"] > ul > li',\n                '> div > .aui-dropdown2-section > div[role=\"group\"] > ul > li',\n                // Web component.\n                'aui-item-link',\n                'aui-item-checkbox',\n                'aui-item-radio',\n            ].join(', ')\n        )\n        .filter(filter)\n        .children(\n            'a, button, [role=\"checkbox\"], [role=\"menuitemcheckbox\"], [role=\"radio\"], [role=\"menuitemradio\"]'\n        );\n}\n\nfunction getAllDropdownItems(dropdown) {\n    return getDropdownItems(dropdown, () => true);\n}\n\nfunction getVisibleDropdownItems(dropdown) {\n    return getDropdownItems(dropdown, (i, el) => !isHidden(el));\n}\n\nfunction amendDropdownItem(item) {\n    item.setAttribute('tabindex', '-1');\n\n    /**\n     * Honouring the documentation.\n     * @link https://aui.atlassian.com/aui/latest/docs/dropdown.html\n     */\n    if (item.classList.contains('aui-dropdown2-disabled') || isHidden(item.parentElement)) {\n        item.setAttribute('aria-disabled', 'true');\n    }\n}\n\nfunction amendDropdownContent(dropdown) {\n    // Add assistive semantics to each dropdown item\n    getAllDropdownItems(dropdown).each((i, el) => amendDropdownItem(el));\n}\n\n/**\n * Honours behaviour for code written using only the legacy class names.\n * To maintain old behaviour (i.e., remove the 'hidden' class and the item will become un-hidden)\n * whilst allowing our code to only depend on the new classes, we need to\n * keep the state of the DOM in sync with legacy classes.\n *\n * Calling this function will add the new namespaced classes to elements with legacy names.\n */\nfunction migrateAndSyncLegacyClassNames(dropdown) {\n    var $dropdown = $(dropdown);\n\n    // Migrate away from legacy, unprefixed class names\n    ['disabled', 'interactive', 'active', 'checked'].forEach((type) => {\n        $dropdown.find(`.${type}`).addClass(`aui-dropdown2-${type}`);\n    });\n}\n\n// The Dropdown itself\n// -------------------\n\nfunction destroyAlignment(dropdown) {\n    if (dropdown._auiAlignment) {\n        dropdown._auiAlignment.destroy();\n        delete dropdown._auiAlignment;\n    }\n}\n\nfunction setLayerAlignment(dropdown, trigger) {\n    var hasSubmenu = trigger && trigger.hasSubmenu && trigger.hasSubmenu();\n    var hasSubmenuAlignment = dropdown.getAttribute('data-aui-alignment') === 'submenu auto';\n\n    if (!hasSubmenu && hasSubmenuAlignment) {\n        restorePreviousAlignment(dropdown);\n    }\n    var hasAnyAlignment = dropdown.hasAttribute('data-aui-alignment');\n\n    if (hasSubmenu && !hasSubmenuAlignment) {\n        saveCurrentAlignment(dropdown);\n        dropdown.setAttribute('data-aui-alignment', 'submenu auto');\n        dropdown.setAttribute('data-aui-alignment-static', true);\n    } else if (!hasAnyAlignment) {\n        dropdown.setAttribute('data-aui-alignment', 'bottom auto');\n        dropdown.setAttribute('data-aui-alignment-static', true);\n    }\n\n    destroyAlignment(dropdown);\n    dropdown._auiAlignment = new Alignment(dropdown, trigger, {\n        flip: false,\n        positionFixed: false,\n        preventOverflow: false,\n        // space between a dropdown trigger and the dropdown itself, based on @aui-dropdown-trigger-offset\n        // only added for dropdowns which are not submenus\n        offset: trigger.hasSubmenu && trigger.hasSubmenu() ? [-3, 0] : [0, 3],\n    });\n\n    dropdown._auiAlignment.enable();\n}\n\nfunction saveCurrentAlignment(dropdown) {\n    var $dropdown = $(dropdown);\n    if (dropdown.hasAttribute('data-aui-alignment')) {\n        $dropdown.data('previous-data-aui-alignment', dropdown.getAttribute('data-aui-alignment'));\n    }\n    $dropdown.data(\n        'had-data-aui-alignment-static',\n        dropdown.hasAttribute('data-aui-alignment-static')\n    );\n}\n\nfunction restorePreviousAlignment(dropdown) {\n    var $dropdown = $(dropdown);\n\n    var previousAlignment = $dropdown.data('previous-data-aui-alignment');\n    if (previousAlignment) {\n        dropdown.setAttribute('data-aui-alignment', previousAlignment);\n    } else {\n        dropdown.removeAttribute('data-aui-alignment');\n    }\n    $dropdown.removeData('previous-data-aui-alignment');\n\n    if (!$dropdown.data('had-data-aui-alignment-static')) {\n        dropdown.removeAttribute('data-aui-alignment-static');\n    }\n    $dropdown.removeData('had-data-aui-alignment-static');\n}\n\nfunction getDropdownHideLocation(dropdown, trigger) {\n    var possibleHome = trigger.getAttribute('data-dropdown2-hide-location');\n    return document.getElementById(possibleHome) || dropdown.parentNode;\n}\n\nvar keyboardClose = false;\nfunction keyboardCloseDetected() {\n    keyboardClose = true;\n}\n\nfunction wasProbablyClosedViaKeyboard() {\n    var result = keyboardClose === true;\n    keyboardClose = false;\n    return result;\n}\n\nfunction bindDropdownBehaviourToLayer(dropdown) {\n    layer(dropdown);\n\n    dropdown.addEventListener('aui-layer-show', function (e) {\n        if (dropdown !== e.target) {\n            return;\n        }\n\n        // fix legacy markup patterns\n        migrateAndSyncLegacyClassNames(dropdown);\n        amendDropdownContent(dropdown);\n\n        // indicate the dropdown is open\n        $(dropdown).trigger('aui-dropdown2-show');\n\n        doIfTrigger(dropdown, function (trigger) {\n            setDropdownTriggerActiveState(trigger, true);\n            dropdown._returnTo = getDropdownHideLocation(dropdown, trigger);\n        });\n    });\n\n    dropdown.addEventListener('aui-layer-hide', function (e) {\n        if (dropdown !== e.target) {\n            return;\n        }\n\n        $(dropdown).trigger('aui-dropdown2-hide');\n\n        if (dropdown._auiAlignment) {\n            dropdown._auiAlignment.destroy();\n        }\n\n        if (dropdown._returnTo) {\n            if (dropdown.parentNode && dropdown.parentNode !== dropdown._returnTo) {\n                dropdown._returnTo.appendChild(dropdown);\n            }\n        }\n\n        dropdown.classList.remove('aui-dropdown2-in-header', 'aui-dropdown2-in-buttons');\n        getAllDropdownItems(dropdown).removeClass('active aui-dropdown2-active');\n\n        doIfTrigger(dropdown, function (trigger) {\n            setDropdownTriggerActiveState(trigger, false);\n\n            // Focus the submenu trigger when the submenu is closed\n            if (wasProbablyClosedViaKeyboard()) {\n                trigger.focus();\n            }\n        });\n\n        // Gets set by submenu trigger invocation. Bad coupling point?\n        delete dropdown.isSubmenu;\n    });\n}\n\nfunction bindItemInteractionBehaviourToDropdown(dropdown) {\n    var $dropdown = $(dropdown);\n\n    function belongsToDropdown(item) {\n        const $dd = $(item).closest('.aui-dropdown2, aui-dropdown-menu');\n        return $dd.get(0) === dropdown;\n    }\n\n    $dropdown.on('keydown', function (e) {\n        if (!belongsToDropdown(e.target)) {\n            return;\n        }\n        if (e.keyCode === keyCode.DOWN) {\n            dropdown.focusNext();\n            e.preventDefault();\n        } else if (e.keyCode === keyCode.UP) {\n            dropdown.focusPrevious();\n            e.preventDefault();\n        } else if (e.keyCode === keyCode.LEFT) {\n            if (dropdown.isSubmenu) {\n                keyboardCloseDetected();\n                dropdown.hide();\n                e.preventDefault();\n            }\n        } else if (e.keyCode === keyCode.ESCAPE) {\n            // The closing will be handled by the LayerManager!\n            keyboardCloseDetected();\n        } else if (e.keyCode === keyCode.TAB) {\n            keyboardCloseDetected();\n            // On TAB we should close the menu and all submenus.\n            dropdown.hideAll(false);\n        }\n    });\n\n    const hideIfNotSubmenuAndNotInteractive = function (e) {\n        const item = e.currentTarget;\n\n        if (item.getAttribute('aria-disabled') === 'true') {\n            e.preventDefault();\n            return;\n        }\n\n        const isSubmenuTrigger = e.currentTarget.hasSubmenu && e.currentTarget.hasSubmenu();\n        if (!isSubmenuTrigger && !item.classList.contains('aui-dropdown2-interactive')) {\n            dropdown.hideAll(true);\n        }\n    };\n\n    $dropdown.on(\n        'click keydown',\n        'a, button, [role=\"menuitem\"], [role=\"menuitemcheckbox\"], [role=\"checkbox\"], [role=\"menuitemradio\"], [role=\"radio\"]',\n        function (e) {\n            if (!belongsToDropdown(e.target)) {\n                return;\n            }\n            const item = e.currentTarget;\n            const eventKeyCode = e.keyCode;\n            const isEnter = eventKeyCode === keyCode.ENTER;\n            const isSpace = eventKeyCode === keyCode.SPACE;\n\n            // AUI-4283: Accessibility - need to ignore enter on links/buttons so\n            // that the dropdown remains visible to allow the click event to eventually fire.\n            const itemIgnoresEnter = isEnter && $(item).is('a[href], button');\n\n            if (!itemIgnoresEnter && (e.type === 'click' || isEnter || isSpace)) {\n                hideIfNotSubmenuAndNotInteractive(e);\n            }\n        }\n    );\n\n    // close all submenus when the mouse moves over items other than its trigger\n    $dropdown.on(\n        'mouseenter',\n        'a, button, [role=\"menuitem\"], [role=\"menuitemcheckbox\"], [role=\"checkbox\"], [role=\"menuitemradio\"], [role=\"radio\"]',\n        function (e) {\n            if (!belongsToDropdown(e.target)) {\n                return;\n            }\n\n            // Focus the current element to allow Screen Reader to announce a focused menuitem.\n            // disabled the focus in each mouse move since it makes dropdowns unsable in Safari & Firefox\n            // reference issue: https://jira.atlassian.com/browse/JRASERVER-78765\n            // details: https://hello.atlassian.net/wiki/spaces/~7120201281a7adebab4dd281f34ba58638925c/folder/5220871005\n            // e.currentTarget.focus();\n\n            // We should close all submenus above which are not related to the focused trigger.\n            // For example if we hover over the trigger for submenu for this trigger be shown, when we move\n            // focus/mouse on the another trigger the previous will be closed.\n            let layerAbove = $(layer(dropdown).above()).get(0);\n            while (layerAbove && layerAbove.isDropdown && layerAbove !== dropdown) {\n                const layerId = layerAbove.getAttribute('id');\n                const targetDropdownId = e.target.getAttribute('aria-controls');\n                const nextLayer = layer(layerAbove).above();\n\n                if (targetDropdownId !== layerId) {\n                    // We should .hide() only after we get nextLayer,\n                    // otherwise we will get the first visible layer.\n                    layer(layerAbove).hide();\n                }\n\n                layerAbove = $(nextLayer).get(0);\n            }\n        }\n    );\n}\n\n$(window).on(\n    'resize',\n    debounce(\n        function () {\n            $('.aui-dropdown2').each(function (index, dropdown) {\n                skate.init(dropdown);\n                if (dropdown.isVisible()) {\n                    dropdown.hide();\n                }\n            });\n        },\n        1000,\n        true\n    )\n);\n\n// Dropdowns\n// ---------\n\nfunction dropdownCreated(dropdown) {\n    dropdown.classList.add('aui-dropdown2');\n    dropdown.setAttribute('tabindex', '-1');\n\n    if (dropdown.hasAttribute('data-container')) {\n        dropdown.setAttribute(\n            'data-aui-alignment-container',\n            dropdown.getAttribute('data-container')\n        );\n        dropdown.removeAttribute('data-container');\n    }\n\n    bindDropdownBehaviourToLayer(dropdown);\n    bindItemInteractionBehaviourToDropdown(dropdown);\n\n    $(dropdown).on('click keydown', '.aui-dropdown2-checkbox', function (e) {\n        if (e.type === 'click' || e.keyCode === keyCode.ENTER || e.keyCode === keyCode.SPACE) {\n            let checkbox = this;\n            if (e.isDefaultPrevented()) {\n                return;\n            }\n            if (checkbox.isInteractive()) {\n                e.preventDefault();\n            }\n            if (checkbox.isEnabled()) {\n                // toggle the checked state\n                if (checkbox.isChecked()) {\n                    checkbox.uncheck();\n                } else {\n                    checkbox.check();\n                }\n            }\n        }\n    });\n\n    $(dropdown).on('click keydown', '.aui-dropdown2-radio', function (e) {\n        if (e.type === 'click' || e.keyCode === keyCode.ENTER || e.keyCode === keyCode.SPACE) {\n            let radio = this;\n            if (e.isDefaultPrevented()) {\n                return;\n            }\n            if (radio.isInteractive()) {\n                e.preventDefault();\n            }\n\n            if (this.isEnabled() && this.isChecked() === false) {\n                // toggle the checked state\n                $(radio)\n                    .closest('ul,[role=group]')\n                    .find('.aui-dropdown2-checked')\n                    .not(this)\n                    .each(function () {\n                        this.uncheck();\n                    });\n                radio.check();\n            }\n        }\n    });\n}\n\n/**\n * Given a dropdown, find the layer that contains the first dropdown in a\n * stack of nested dropdowns.\n *\n * If a dropdown is nested (`trigger -> dropdownA -> dropdownB`),\n * `f(dropdownB) = layer(dropdownA)`.\n *\n * If a dropdown is non-nested (`trigger -> dropdownA`),\n * `f(dropdownA) = layer(dropdownA)`.\n */\nfunction findBottomLayerInDropdownStack(dropdown) {\n    let currentLayer = layer(dropdown);\n    while (true) {\n        const itemInLayerBelow = currentLayer.below();\n        if (!itemInLayerBelow) {\n            break;\n        }\n\n        if (!itemInLayerBelow.get(0).isDropdown) {\n            break;\n        }\n\n        currentLayer = layer(itemInLayerBelow);\n    }\n    return currentLayer;\n}\n\nvar dropdownPrototype = {\n    /**\n     * Toggles the visibility of the dropdown menu\n     */\n    toggle: function (e) {\n        if (this.isVisible()) {\n            this.hide();\n        } else {\n            this.show(e);\n        }\n    },\n\n    /**\n     * Explicitly shows the menu\n     *\n     * @returns {HTMLElement}\n     */\n    show: function (e) {\n        const dropdown = this;\n\n        // In case we have 2 triggers for the same submenu\n        // we can have two active/expanded triggers at the same time.\n        // In order to avoid such behavior we need to reset current active trigger,\n        // before we update/replace it.\n        doIfTrigger(dropdown, (trigger) => {\n            setDropdownTriggerActiveState(trigger, false);\n        });\n\n        if (e && e.currentTarget && e.currentTarget.classList.contains('aui-dropdown2-trigger')) {\n            setTrigger(dropdown, e.currentTarget);\n        }\n\n        layer(dropdown).show();\n\n        doIfTrigger(dropdown, function (trigger) {\n            setDropdownTriggerActiveState(trigger, true);\n            setLayerAlignment(dropdown, trigger);\n        });\n\n        // Manage focus on the next tick.\n        // the setTimeout avoids a full page scroll caused by:\n        // 1) the layer code moving the element to the bottom of the DOM, and then\n        // 2) the alignment module asynchronously rendering the element further up the page\n        // this code should ideally listen and wait for both those things to be done... but\n        // this assumption is cheaper.\n        setTimeout(() => handleFocus(dropdown, e), 0);\n\n        return this;\n    },\n\n    /**\n     * Explicitly hides the menu\n     *\n     * @returns {HTMLElement}\n     */\n    hide: function () {\n        layer(this).hide();\n        return this;\n    },\n\n    /**\n     * Explicitly hides the whole menu with submenus and focus the initial triggers based on provided param.\n     *\n     * @param focusTrigger - Get focus back to the initial trigger when menu is closed. Default value is \"true\".\n     * @returns {HTMLElement}\n     */\n    hideAll: function (focusTrigger = true) {\n        const bottomLayer = findBottomLayerInDropdownStack(this);\n\n        // AUI-5474 when something else (e.g. a Dialog) has hidden the\n        // dropdown's layer, we don't need to do anything.\n        if (!bottomLayer.isVisible()) {\n            return this;\n        }\n\n        bottomLayer.hide();\n\n        // Get focus back to the dropdown's trigger after\n        // the dropdown is closed.\n        if (focusTrigger) {\n            doIfTrigger(bottomLayer.el, (trigger) => {\n                // Delay focusing to allow things to settle; otherwise\n                // Skatejs's MutationObserver kicks in and opens the dropdown\n                // again.\n                setTimeout(() => {\n                    trigger.focus();\n                }, 0);\n                setTrigger(bottomLayer.el, null);\n            });\n        }\n\n        return this;\n    },\n\n    /**\n     * Shifts explicit focus to the next available item in the menu\n     *\n     * @returns {undefined}\n     */\n    focusNext: function () {\n        var $items = getVisibleDropdownItems(this);\n        var selected = document.activeElement;\n        var idx;\n\n        if ($items.last()[0] !== selected) {\n            idx = $items.toArray().indexOf(selected);\n            this.focusItem($items.get(idx + 1));\n        } else {\n            this.focusItem(0);\n        }\n    },\n\n    /**\n     * Shifts explicit focus to the previous available item in the menu\n     *\n     * @returns {undefined}\n     */\n    focusPrevious: function () {\n        var $items = getVisibleDropdownItems(this);\n        var selected = document.activeElement;\n        var idx;\n\n        if ($items.first()[0] !== selected) {\n            idx = $items.toArray().indexOf(selected);\n            this.focusItem($items.get(idx - 1));\n        } else {\n            this.focusItem($items.length - 1);\n        }\n    },\n\n    /**\n     * Shifts explicit focus to the menu item matching the index param\n     */\n    focusItem: function (item) {\n        const $items = getVisibleDropdownItems(this);\n        if (typeof item === 'number') {\n            item = $items.get(item);\n        }\n        const $item = $(item);\n        $item.trigger('focus');\n        $items.removeClass('active aui-dropdown2-active');\n        $item.addClass('active aui-dropdown2-active');\n    },\n\n    /**\n     * Checks whether or not the menu is currently displayed\n     *\n     * @returns {Boolean}\n     */\n    isVisible: function () {\n        return layer(this).isVisible();\n    },\n\n    /**\n     * Shows that current element is a dropdown\n     */\n    isDropdown: true,\n};\n\n// Web component API for dropdowns\n// -------------------------------\n\nvar disabledAttributeHandler = {\n    created: function (element) {\n        var a = element.children[0];\n        a.setAttribute('aria-disabled', 'true');\n        a.classList.add('disabled', 'aui-dropdown2-disabled');\n    },\n    removed: function (element) {\n        var a = element.children[0];\n        a.setAttribute('aria-disabled', 'false');\n        a.classList.remove('disabled', 'aui-dropdown2-disabled');\n    },\n};\n\nvar interactiveAttributeHandler = {\n    created: function (element) {\n        var a = element.children[0];\n        a.classList.add('interactive', 'aui-dropdown2-interactive');\n    },\n    removed: function (element) {\n        var a = element.children[0];\n        a.classList.remove('interactive', 'aui-dropdown2-interactive');\n    },\n};\n\nvar checkedAttributeHandler = {\n    created: function (element) {\n        var a = element.children[0];\n        a.classList.add('checked', 'aui-dropdown2-checked');\n        a.setAttribute('aria-checked', true);\n        element.dispatchEvent(new CustomEvent('change', { bubbles: true }));\n    },\n    removed: function (element) {\n        var a = element.children[0];\n        a.classList.remove('checked', 'aui-dropdown2-checked');\n        a.setAttribute('aria-checked', false);\n        element.dispatchEvent(new CustomEvent('change', { bubbles: true }));\n    },\n};\n\nvar hiddenAttributeHandler = {\n    created: function (element) {\n        disabledAttributeHandler.created(element);\n    },\n    removed: function (element) {\n        disabledAttributeHandler.removed(element);\n    },\n};\n\nvar stringAttributeHandlerGenerator = function (attrName) {\n    return {\n        fallback: function (element, change) {\n            var a = element.children[0];\n            a.setAttribute(attrName, change.newValue);\n        },\n        removed: function (element) {\n            var a = element.children[0];\n            a.removeAttribute(attrName);\n        },\n    };\n};\n\nconst convertCssClassesToArray = function (spaceDelimitedClasses = '') {\n    return spaceDelimitedClasses\n        .split(' ')\n        .map((str) => str.trim())\n        .filter((x) => x);\n};\n\nconst ItemLinkEl = skate('aui-item-link', {\n    template: template('<a role=\"menuitem\" tabindex=\"-1\"><content></content></a>'),\n    attributes: {\n        'disabled': disabledAttributeHandler,\n        'interactive': interactiveAttributeHandler,\n        'hidden': hiddenAttributeHandler,\n        'href': stringAttributeHandlerGenerator('href'),\n        'item-id': stringAttributeHandlerGenerator('id'),\n        'for': {\n            created: function (element) {\n                var anchor = element.children[0];\n                anchor.setAttribute('aria-controls', element.getAttribute('for'));\n                $(anchor).addClass('aui-dropdown2-sub-trigger');\n            },\n            updated: function (element) {\n                var anchor = element.children[0];\n                anchor.setAttribute('aria-controls', element.getAttribute('for'));\n            },\n            removed: function (element) {\n                var anchor = element.children[0];\n                anchor.removeAttribute('aria-controls');\n                $(anchor).removeClass('aui-dropdown2-sub-trigger');\n            },\n        },\n        'extra-classes': function (element, change) {\n            const anchor = element.children[0];\n            if (change.oldValue) {\n                anchor.classList.remove(...convertCssClassesToArray(change.oldValue));\n            }\n            if (change.newValue) {\n                anchor.classList.add(...convertCssClassesToArray(change.newValue));\n            }\n        },\n        'data-value': stringAttributeHandlerGenerator('data-value'),\n    },\n});\n\nconst ItemButtonEl = skate('aui-item-button', {\n    template: template('<button class=\"aui-button\"><content></content></button>'),\n    attributes: {\n        'disabled': disabledAttributeHandler,\n        'item-id': stringAttributeHandlerGenerator('id'),\n        'extra-classes': function (element, change) {\n            const anchor = element.children[0];\n            if (change.oldValue) {\n                anchor.classList.remove(...convertCssClassesToArray(change.oldValue));\n            }\n            if (change.newValue) {\n                anchor.classList.add(...convertCssClassesToArray(change.newValue));\n            }\n        },\n        'data-value': stringAttributeHandlerGenerator('data-value'),\n    },\n});\n\nconst [ItemCheckboxEl, ItemRadioEl] = ['checkbox', 'radio'].map((type) => {\n    return skate(`aui-item-${type}`, {\n        template: template(\n            `<span role=\"menuitem${type}\" class=\"aui-dropdown2-${type}\" tabindex=\"-1\"><content></content></span>`\n        ),\n        attributes: {\n            'item-id': stringAttributeHandlerGenerator('id'),\n            'disabled': disabledAttributeHandler,\n            'interactive': interactiveAttributeHandler,\n            'checked': checkedAttributeHandler,\n            'hidden': hiddenAttributeHandler,\n            'data-value': stringAttributeHandlerGenerator('data-value'),\n        },\n    });\n});\n\nconst SectionEl = skate('aui-section', {\n    template: template(`\n        <span aria-hidden=\"true\" class=\"aui-dropdown2-heading\"></span>\n        <div class=\"aui-dropdown2-item-group\" role=\"group\">\n            <content></content>\n        </div>\n    `),\n    attributes: {\n        'label': function (element, data) {\n            const id = generateUniqueId();\n            var headingElement = element.children[0];\n            var groupElement = element.children[1];\n            headingElement.textContent = data.newValue;\n            headingElement.id = id;\n            groupElement.setAttribute('aria-labelledby', id);\n        },\n        'aria-label': {\n            fallback: function (element, change) {\n                var a = element.children[1];\n                a.setAttribute('aria-label', change.newValue);\n            },\n            removed: function (element) {\n                var a = element.children[1];\n                a.removeAttribute('aria-label');\n            },\n        },\n    },\n    created: function (element) {\n        element.classList.add('aui-dropdown2-section');\n    },\n});\n\nconst DropdownEl = skate('aui-dropdown-menu', {\n    created: function (dropdown) {\n        dropdown.setAttribute('role', 'menu');\n        dropdown.className = 'aui-dropdown2';\n        layer(dropdown);\n        state(dropdown).set('loading-state', UNLOADED);\n        // Now skate the .aui-dropdown2 behaviour.\n        skate.init(dropdown);\n    },\n    detached: function (dropdown) {\n        ifGone(dropdown).then(() => destroyAlignment(dropdown));\n    },\n    attributes: {\n        src: {},\n    },\n    prototype: dropdownPrototype,\n    events: {\n        'aui-layer-show': loadContentWhenMenuShown,\n    },\n});\n\n// Legacy dropdown inits\n// ---------------------\n\nskate('aui-dropdown2', {\n    type: skate.type.CLASSNAME,\n    created: dropdownCreated,\n    prototype: dropdownPrototype,\n});\n\nskate('data-aui-dropdown2', {\n    type: skate.type.ATTRIBUTE,\n    created: dropdownCreated,\n    prototype: dropdownPrototype,\n});\n\nskate('aui-dropdown2-trigger', {\n    type: skate.type.CLASSNAME,\n    created: triggerCreated,\n    prototype: triggerPrototype,\n});\n\nskate('aui-dropdown2-sub-trigger', {\n    type: skate.type.CLASSNAME,\n    created: function (trigger) {\n        trigger.classList.add('aui-dropdown2-trigger');\n        skate.init(trigger);\n    },\n});\n\n// Checkboxes and radios\n// ---------------------\n['checkbox', 'radio'].map((type) => {\n    return skate(`aui-dropdown2-${type}`, {\n        type: skate.type.CLASSNAME,\n\n        created: function (checkbox) {\n            // determine checked state based on any one of three attributes, then sync all of them.\n            const checked =\n                checkbox.getAttribute('aria-checked') === 'true' ||\n                checkbox.classList.contains('checked') ||\n                checkbox.classList.contains('aui-dropdown2-checked');\n            checkbox.classList[checked ? 'add' : 'remove']('checked', 'aui-dropdown2-checked');\n            checkbox.setAttribute('aria-checked', checked);\n\n            // make the element part of the natural tab order.\n            checkbox.setAttribute('tabindex', '0');\n\n            // swap from the \"menuitemX\" role to plain role for VoiceOver\n            if (supportsVoiceOver()) {\n                checkbox.setAttribute('role', `menuitem${type}`);\n            }\n        },\n\n        prototype: {\n            isEnabled: function () {\n                return this.getAttribute('aria-disabled') !== 'true';\n            },\n\n            isChecked: function () {\n                return this.getAttribute('aria-checked') === 'true';\n            },\n\n            isInteractive: function () {\n                return this.classList.contains('aui-dropdown2-interactive');\n            },\n\n            uncheck: function () {\n                if (this.parentNode.tagName.toLowerCase() === `aui-item-${type}`) {\n                    this.parentNode.removeAttribute('checked');\n                }\n                $(this)\n                    .attr('aria-checked', 'false')\n                    .removeClass('checked aui-dropdown2-checked')\n                    .trigger('aui-dropdown2-item-uncheck');\n            },\n\n            check: function () {\n                if (this.parentNode.tagName.toLowerCase() === `aui-item-${type}`) {\n                    this.parentNode.setAttribute('checked', '');\n                }\n                $(this)\n                    .attr('aria-checked', 'true')\n                    .addClass('checked aui-dropdown2-checked')\n                    .trigger('aui-dropdown2-item-check');\n            },\n        },\n    });\n});\n\nexport { DropdownEl, ItemLinkEl, ItemButtonEl, ItemRadioEl, ItemCheckboxEl, SectionEl };\n","import $ from './jquery';\n\nimport { getMessageLogger } from './internal/deprecation';\n\nconst deprecate = {\n    'aria-expanded': getMessageLogger('Expander [aria-expanded] attribute', {\n        removeInVersion: '12.0.0',\n        sinceVersion: '9.9.0',\n        deprecationType: 'ARIA ATTRIBUTE',\n        extraInfo:\n            'The \"aria-expanded\" attribute will no longer act as an indicator for the expander if it needs to be expanded. Please update the expander in accordance with AUI guidelines.',\n    }),\n    'replace-selector': getMessageLogger('Expander [data-replace-selector] attribute', {\n        removeInVersion: '12.0.0',\n        sinceVersion: '9.9.0',\n        deprecationType: 'DATA ATTRIBUTE',\n        extraInfo:\n            'The attribute \"data-replace-selector\" will no longer have any functionality. It is recommended to update the expander following AUI guidelines.',\n    }),\n    'short-content': getMessageLogger('Expander [.aui-expander-short-content]', {\n        removeInVersion: '12.0.0',\n        sinceVersion: '9.9.0',\n        deprecationType: 'EXPANDER CLASS (PATTERN)',\n    }),\n};\n\nconst getExpanderProperties = ($trigger) => {\n    const $content = $(`#${$trigger.attr('aria-controls')}`);\n    const isTriggerParent = $content.parent().is($trigger);\n\n    /**\n     * ! Deprecated since 9.9.0\n     * delete at version 10.0.0\n     */\n    const $shortContent = isTriggerParent ? $trigger.find('.aui-expander-short-content') : null;\n    if ($content.attr('aria-expanded')) {\n        deprecate['aria-expanded']();\n        if ($content.attr('aria-expanded') === 'true') {\n            $content.addClass('expanded');\n        }\n        $content.removeAttr('aria-expanded');\n    }\n    /* end of depraction */\n\n    return {\n        $content,\n        isTriggerParent,\n        $shortContent,\n        isExpanded: $content.hasClass('expanded'),\n        height: $content.css('min-height'),\n        isCollapsible: $trigger.data('collapsible') !== false,\n        textReplacement: $trigger.attr('data-replace-text'),\n    };\n};\n\nfunction expand($trigger) {\n    const { $content, isTriggerParent, $shortContent, textReplacement } =\n        getExpanderProperties($trigger);\n\n    $trigger.attr('aria-expanded', 'true');\n    $content.addClass('expanded');\n    $content.prop('hidden', false);\n    replaceText($trigger, textReplacement);\n\n    if (isTriggerParent) {\n        $shortContent.hide();\n    }\n\n    $trigger.trigger('aui-expander-expanded');\n}\n\nfunction collapse($trigger) {\n    const { $content, isTriggerParent, $shortContent, textReplacement } =\n        getExpanderProperties($trigger);\n\n    replaceText($trigger, textReplacement);\n    $trigger.attr('aria-expanded', 'false');\n    $content.removeClass('expanded');\n\n    if (isTriggerParent) {\n        $shortContent.show();\n    }\n\n    if ($content.outerHeight() === 0) {\n        $content.prop('hidden', true);\n    }\n\n    $trigger.trigger('aui-expander-collapsed');\n}\n\nfunction init($trigger) {\n    const { $content, isTriggerParent, isExpanded } = getExpanderProperties($trigger);\n\n    /**\n     * ! Deprecated since 9.9.0\n     * delete at version 10.0.0\n     */\n    const selector = $trigger.data('replace-selector');\n    if (selector) {\n        deprecate['replace-selector']();\n    }\n    if ($content.attr('aria-expanded')) {\n        deprecate['aria-expanded']();\n        if ($content.attr('aria-expanded') === 'true') {\n            $content.addClass('expanded');\n        }\n        $content.removeAttr('aria-expanded');\n    }\n\n    const $shortContent = isTriggerParent ? $trigger.find('.aui-expander-short-content') : null;\n    if ($shortContent) {\n        deprecate['short-content']();\n    }\n    /* end of depraction */\n\n    if ($content.outerHeight() === 0) {\n        !isExpanded && $content.prop('hidden', true);\n    }\n    $trigger.attr('aria-expanded', isExpanded ? 'true' : 'false');\n}\n\nconst replaceText = ($trigger, textReplacement) => {\n    if (!textReplacement) {\n        return;\n    }\n\n    /**\n     * ! Deprecated since 9.9.0\n     * delete at version 10.0.0\n     */\n    const selector = $trigger.data('replace-selector');\n    if (selector) {\n        deprecate['replace-selector']();\n        const $deprecatedReplaceElement = $trigger.find(selector);\n        $trigger.attr('data-replace-text', $deprecatedReplaceElement.text());\n        $deprecatedReplaceElement.text(textReplacement);\n        return;\n    }\n    /* end of depraction */\n\n    const $deepestChild = $trigger.find(':not(:has(*)):first');\n    const $replaceElement = $deepestChild.length ? $deepestChild : $trigger;\n    $trigger.attr('data-replace-text', $replaceElement.text());\n    $replaceElement.text(textReplacement);\n};\n\nconst EXPANDER_EVENTS = {\n    'aui-expander-invoke': function (event) {\n        const $trigger = $(event.currentTarget);\n        const { isCollapsible, isExpanded } = getExpanderProperties($trigger);\n\n        if (isExpanded && isCollapsible) {\n            $trigger.trigger('aui-expander-collapse');\n        } else {\n            $trigger.trigger('aui-expander-expand');\n        }\n    },\n\n    'aui-expander-expand': function (event) {\n        expand($(event.currentTarget));\n    },\n\n    'aui-expander-collapse': function (event) {\n        collapse($(event.currentTarget));\n    },\n\n    'click.aui-expander': function (event) {\n        const $target = $(event.currentTarget);\n        $target.trigger('aui-expander-invoke', event.currentTarget);\n    },\n};\n\n$(document).on(EXPANDER_EVENTS, '.aui-expander-trigger');\n$(function () {\n    $('.aui-expander-trigger').each(function () {\n        const $trigger = $(this);\n        init($trigger);\n    });\n});\n","import $ from './jquery';\nimport * as deprecate from './internal/deprecation';\nimport * as logger from './internal/log';\nimport globalize from './internal/globalize';\nimport escapeHtml from './escape-html';\nimport keyCode from './key-code';\nimport skate from './internal/skate';\nimport { CLOSE_BUTTON, CLOSE_BUTTON_CLASS_SELECTOR } from './close-button';\nimport { I18n } from './i18n';\n\nconst DEFAULT_FADEOUT_DURATION = 500;\nconst DEFAULT_FADEOUT_DELAY = 5000;\nconst FADEOUT_RESTORE_DURATION = 100;\n\nfunction createMessageConstructor(type) {\n    /**\n     *\n     * @param context\n     * @param {Object} obj - message configuration\n     * @param {String} [obj.id] - ID to add to the message.\n     * @param {String} [obj.title] - Plain-text title of the message. If provided, will appear above the message body.\n     * @param {String} [obj.a11yTypeLabel] - Accessibility label that will communicate type of message non-visually\n     * @param {String} obj.body - Content of the message. Can be HTML content.\n     * @param {boolean} [obj.closeable] - If true, the message can be manually closed by the end-user via the UI.\n     * @param {boolean} [obj.removeOnHide] - If true, the message will be removed from the DOM after hide.\n     * @param {boolean} [obj.fadeout]\n     * @param {boolean} [obj.duration]\n     * @param {boolean} [obj.delay]\n     * @returns {*|HTMLElement}\n     */\n    this[type] = function (context, obj) {\n        if (!obj) {\n            obj = context;\n            context = '#aui-message-bar';\n        }\n\n        // Set up our template options\n        obj.closeable = obj.closeable !== null && obj.closeable !== false;\n\n        // clean the title value\n        obj.title = (obj.title || '').toString().trim();\n\n        let $message = renderMessageElement(obj, type);\n        insertMessageIntoContext($message, obj.insert, context);\n\n        // Attach the optional extra behaviours\n        if (obj.removeOnHide) {\n            console.warn &&\n                console.warn(\n                    'Use of AUI Message `removeOnHide` is deprecated due to accessibility reasons and will be removed in AUI 12.0.0.'\n                );\n            makeRemoveOnHide($message, obj.delay, obj.duration);\n        }\n\n        if (obj.closeable) {\n            makeCloseable($message);\n        }\n\n        if (obj.fadeout) {\n            console.warn &&\n                console.warn(\n                    'Use of AUI Message `fadeout` is deprecated due to accessibility reasons and will be removed in AUI 12.0.0.'\n                );\n            makeFadeout($message, obj.delay, obj.duration);\n        }\n\n        return $message;\n    };\n}\n\nfunction makeRemoveOnHide(message, delay, duration) {\n    $(message || '.aui-message.aui-remove-on-hide').each(function () {\n        const $this = $(this);\n        makeFadeout($this, delay, duration);\n    });\n}\n\nfunction makeCloseable(message) {\n    $(message || 'div.aui-message.closeable').each(function () {\n        const $this = $(this);\n        const $closeIcons = $this.find(CLOSE_BUTTON_CLASS_SELECTOR);\n        const $icon = $closeIcons.length > 0 ? $closeIcons.first() : $(CLOSE_BUTTON);\n\n        $this.addClass('closeable');\n        $this.append($icon);\n\n        initCloseMessageBoxOnClickAndKeypress($this);\n    });\n}\n\nfunction makeFadeout(message, delay, duration) {\n    delay = typeof delay !== 'undefined' ? delay : DEFAULT_FADEOUT_DELAY;\n    duration = typeof duration !== 'undefined' ? duration : DEFAULT_FADEOUT_DURATION;\n\n    $(message || 'div.aui-message.fadeout').each(function () {\n        const $this = $(this);\n\n        //Store the component state to avoid collisions between animations\n        let hasFocus = false;\n        let isHover = false;\n\n        //Small functions to keep the code easier to read and avoid code duplication\n        function fadeOut() {\n            //Algorithm:\n            //1. Stop all running animations (first arg), including any fade animation and delay\n            //   Do not jump to the end of the animation (second arg). This prevents the message to abruptly\n            //   jump to opacity:0 or opacity:1\n            //2. Wait <delay> ms before starting the fadeout\n            //3. Start the fadeout with a duration of <duration> ms\n            //4. Close the message at the end of the animation\n            $this\n                .stop(true, false)\n                .delay(delay)\n                .fadeOut(duration, function () {\n                    $this.closeMessage();\n                });\n        }\n        function resetFadeOut() {\n            //Algorithm:\n            //1. Stop all running animations (first arg), including any fade animation and delay\n            //   Do not jump to the end of the animation (second arg). This prevents the message to abruptly\n            //   jump to opacity:0 or opacity:1\n            //2. Fast animation to opacity:1\n            $this.stop(true, false).fadeTo(FADEOUT_RESTORE_DURATION, 1);\n        }\n        function shouldStartFadeOut() {\n            return !hasFocus && !isHover;\n        }\n\n        //Attach handlers for user interactions (focus and hover)\n        $this\n            .on('focusin', function () {\n                hasFocus = true;\n                resetFadeOut();\n            })\n            .on('focusout', function () {\n                hasFocus = false;\n                if (shouldStartFadeOut()) {\n                    fadeOut();\n                }\n            })\n            .on('mouseenter', function () {\n                isHover = true;\n                resetFadeOut();\n            })\n            .on('mouseleave', function () {\n                isHover = false;\n                if (shouldStartFadeOut()) {\n                    fadeOut();\n                }\n            });\n\n        //Initial animation\n        fadeOut();\n    });\n}\n\nconst messageFunctions = {\n    setup: function () {\n        makeRemoveOnHide();\n        makeCloseable();\n        makeFadeout();\n    },\n    makeRemoveOnHide: makeRemoveOnHide,\n    makeCloseable: makeCloseable,\n    makeFadeout: makeFadeout,\n    createMessage: createMessageConstructor,\n};\n\nfunction initCloseMessageBoxOnClickAndKeypress($message) {\n    $message.off('click.aui-message').off('keydown.aui-message');\n\n    $message\n        .on('click.aui-message', CLOSE_BUTTON_CLASS_SELECTOR, function (e) {\n            $(e.target).closest('.aui-message').closeMessage();\n        })\n        .on('keydown.aui-message', CLOSE_BUTTON_CLASS_SELECTOR, function (e) {\n            if (e.which === keyCode.ENTER || e.which === keyCode.SPACE) {\n                $(e.target).closest('.aui-message').closeMessage();\n                e.preventDefault(); // this is especially important when handling the space bar, as we don't want to page down\n            }\n        });\n}\n\nfunction insertMessageIntoContext($message, insertWhere, context) {\n    if (insertWhere === 'prepend') {\n        $message.prependTo(context);\n    } else if (insertWhere === 'before') {\n        $message.insertBefore(context);\n    } else if (insertWhere === 'after') {\n        $message.insertAfter(context);\n    } else {\n        $message.appendTo(context);\n    }\n}\n\nfunction getMessageA11yTypeText(obj, type) {\n    const { a11yTypeLabel } = obj;\n\n    if (a11yTypeLabel === '') {\n        return '';\n    }\n\n    const isA11yTypeLabelNotEmpty = a11yTypeLabel != null;\n    if (isA11yTypeLabelNotEmpty) {\n        return a11yTypeLabel;\n    }\n\n    const isA11yTypeLabelNotPassed = a11yTypeLabel == null;\n    if (isA11yTypeLabelNotPassed) {\n        switch (type) {\n            case 'error':\n                return I18n.getText('aui.messagecomponent.error.label');\n            case 'warning':\n                return I18n.getText('aui.messagecomponent.warning.label');\n            case 'info':\n                return I18n.getText('aui.messagecomponent.info.label');\n            case 'confirmation':\n                return I18n.getText('aui.messagecomponent.confirmation.label');\n            case 'change':\n                return I18n.getText('aui.messagecomponent.change.label');\n            case 'generic':\n            case 'success':\n            case 'hint':\n                return '';\n            default:\n                throw Error(`Provide \\`a11yTypeLabel\\` for AUI message of custom type ${type}`);\n        }\n    }\n}\n\nfunction renderMessageElement(obj, type) {\n    const { id, closeable, removeOnHide, fadeout, title, body } = obj;\n\n    const messageTypeText = getMessageA11yTypeText(obj, type);\n    const messageTypeLabel = messageTypeText ? `<strong hidden>${messageTypeText}: </strong>` : '';\n\n    // Convert the options in to template values\n    const titleId = id ? `${id}-title` : '';\n    const titleHtml = title\n        ? `<p class=\"title\"  ${titleId ? `id=\"${titleId}\" aria-hidden=\"true\"` : ''}>${messageTypeLabel}<strong>${escapeHtml(title)}</strong></p>`\n        : '';\n    const html = `<div class=\"aui-message\" role=\"note\" ${titleId ? `aria-labelledby=\"${titleId}\"` : ''}>${titleHtml}</div>`;\n\n    // Construct the message element\n    const $message = $(html)\n        .append($.parseHTML(body || ''))\n        .addClass(removeOnHide ? 'aui-remove-on-hide' : '')\n        .addClass(closeable ? 'closeable' : '')\n        .addClass(fadeout ? 'fadeout' : '')\n        .addClass(`aui-message-${type}`);\n\n    // Add ID if supplied\n    if (id) {\n        if (/[#'\".\\s]/g.test(id)) {\n            // reject IDs that don't comply with style guide (ie. they'll break stuff)\n            logger.warn(\n                'Messages error: ID rejected, must not include spaces, hashes, dots or quotes.'\n            );\n        } else {\n            $message.attr('id', id);\n        }\n    }\n\n    return $message;\n}\n\n$.fn.closeMessage = function () {\n    const $message = $(this);\n    if (\n        $message.hasClass('aui-message') &&\n        ($message.hasClass('closeable') || $message.hasClass('aui-remove-on-hide'))\n    ) {\n        $message.stop(true); //Stop any running animation\n        $message.trigger('messageClose', [this]); //messageClose event Deprecated as of 5.3\n        $message.remove();\n        $(document).trigger('aui-message-close', [this]); //must trigger on document since the element has been removed\n    }\n};\n\n/**\n * Utility methods to display different message types to the user.\n * Usage:\n * <pre>\n * messages.info(\"#container\", {\n *   title: \"Info\",\n *   body: \"You can choose to have messages without Close functionality.\",\n *   closeable: false,\n * });\n * </pre>\n */\nmessageFunctions.createMessage('generic'); //Deprecated Oct 2017\nmessageFunctions.createMessage('error');\nmessageFunctions.createMessage('warning');\nmessageFunctions.createMessage('info');\nmessageFunctions.createMessage('confirmation');\nmessageFunctions.createMessage('change');\nmessageFunctions.createMessage('success'); //Deprecated Oct 2017\nmessageFunctions.createMessage('hint'); //Deprecated Oct 2017\n\nconst MessageEl = skate('aui-message', {\n    created: function (element) {\n        const body = element.innerHTML;\n        const type = element.getAttribute('type') || 'info';\n\n        element.innerHTML = '';\n        messageFunctions[type](element, {\n            body: body,\n            id: element.getAttribute('id'),\n            a11yTypeLabel: element.getAttribute('a11yTypeLabel'),\n            removeOnHide: element.getAttribute('removeOnHide'),\n            closeable: element.getAttribute('closeable'),\n            delay: element.getAttribute('delay'),\n            duration: element.getAttribute('duration'),\n            fadeout: element.getAttribute('fadeout'),\n            title: element.getAttribute('title'),\n        });\n        element.setAttribute('role', 'none');\n    },\n});\n\n$(function () {\n    messageFunctions.setup();\n});\n\ndeprecate.prop(messageFunctions, 'makeCloseable', {\n    extraInfo:\n        'Use the \"closeable\" option in the constructor instead. Docs: https://aui.atlassian.com/aui/latest/docs/messages.html',\n});\n\ndeprecate.prop(messageFunctions, 'createMessage', {\n    extraInfo:\n        'Use the provided convenience methods instead e.g. messages.info(). Docs: https://aui.atlassian.com/aui/latest/docs/messages.html',\n});\n\ndeprecate.prop(messageFunctions, 'makeRemoveOnHide', {\n    extraInfo:\n        'Use of the `makeRemoveOnHide` option is deprecated due to accessibility reasons. Docs: https://aui.atlassian.com/aui/latest/docs/messages.html',\n});\n\ndeprecate.prop(messageFunctions, 'makeFadeout', {\n    extraInfo:\n        'Use of the `fadeout` option is deprecated due to accessibility reasons. Docs: https://aui.atlassian.com/aui/latest/docs/messages.html',\n});\n\ndeprecate.prop(messageFunctions, 'generic', {\n    extraInfo:\n        'use the messages.info() method instead. Docs: https://aui.atlassian.com/aui/latest/docs/messages.html',\n});\n\ndeprecate.prop(messageFunctions, 'hint', {\n    extraInfo:\n        'use the messages.info() method instead. Docs: https://aui.atlassian.com/aui/latest/docs/messages.html',\n});\ndeprecate.prop(messageFunctions, 'success', {\n    extraInfo:\n        'use the messages.confirmation() method instead. Docs: https://aui.atlassian.com/aui/latest/docs/messages.html',\n});\n\n// Exporting\n// ---------\nglobalize('messages', messageFunctions);\n\nexport default messageFunctions;\nexport { MessageEl };\n","export const FOCUSABLE_QUERY =\n    'a[href], area[href], input:not([disabled]):not([type=\"hidden\"]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex=\"0\"], [contenteditable], audio[controls], video[controls], summary, [tabindex^=\"0\"], [tabindex^=\"1\"], [tabindex^=\"2\"], [tabindex^=\"3\"], [tabindex^=\"4\"], [tabindex^=\"5\"], [tabindex^=\"6\"], [tabindex^=\"7\"], [tabindex^=\"8\"], [tabindex^=\"9\"]';\n","import $ from './jquery';\nimport { defaults } from 'underscore';\nimport { recomputeStyle } from './internal/animation';\nimport amdify from './internal/amdify';\nimport globalize from './internal/globalize';\nimport keyCode from './key-code';\nimport escapeHtml from './escape-html';\nimport { CLOSE_BUTTON } from './close-button';\nimport { FOCUSABLE_QUERY } from './internal/a11y/focusable-query';\nimport getFocusManager from './focus-manager';\nimport { I18n } from './i18n';\n\nconst AUTO_CLOSE_TIME = 8000;\nconst ID_FLAG_CONTAINER = 'aui-flag-container';\nconst DEFAULT_OPTIONS = {\n    body: '',\n    close: 'manual',\n    title: '',\n    type: 'info',\n    duration: AUTO_CLOSE_TIME,\n    ariaLive: 'polite',\n};\n\nfunction flag(flagOptions) {\n    const options = defaults(flagOptions, DEFAULT_OPTIONS);\n    options.title = (options.title || '').toString().trim();\n    const $flag = renderFlagElement(options);\n    extendFlagElement($flag);\n\n    if (options.close === 'auto') {\n        makeCloseable($flag);\n\n        if ($flag.attr('role') === 'alert') {\n            makeAutoClosable($flag, options.duration);\n        }\n    } else if (options.close === 'manual') {\n        makeCloseable($flag);\n    }\n\n    handleFlagContainer();\n    insertFlag($flag);\n\n    setTimeout(function () {\n        if ($flag.attr('role') === 'alertdialog') {\n            getFocusManager.global.enter($flag);\n        }\n    }, 0);\n\n    return $flag.get(0);\n}\n\nfunction extendFlagElement($flag) {\n    const flag = $flag[0];\n\n    flag.close = function () {\n        closeFlag($flag);\n    };\n}\n\nfunction getDefaultAriaLabelForFlagType(type) {\n    switch (type) {\n        case 'success':\n            return I18n.getText('aui.flag.default-aria-label.success');\n        case 'warning':\n            return I18n.getText('aui.flag.default-aria-label.warning');\n        case 'error':\n            return I18n.getText('aui.flag.default-aria-label.error');\n        default:\n            return I18n.getText('aui.flag.default-aria-label.info');\n    }\n}\n\nfunction renderFlagElement({ body, title, close, type, ariaLive, ariaLabel, ariaDescription }) {\n    const titleHtml = title ? `<p class=\"title\"><strong>${escapeHtml(title)}</strong></p>` : '';\n    const html = `<div class=\"aui-message\">${titleHtml}</div>`;\n    if (!ariaLabel) {\n        ariaLabel = getDefaultAriaLabelForFlagType(type);\n    }\n    if (!ariaDescription) {\n        ariaDescription = '';\n    }\n\n    const $message = $(html)\n        .append($.parseHTML(body || ''))\n        .addClass(close === 'never' ? '' : 'closeable')\n        .addClass(`aui-message-${type}`);\n    const isFocusable = $message.find(FOCUSABLE_QUERY).length > 0;\n    const ariaRole = isFocusable ? 'alertdialog' : 'alert';\n\n    return $('<div class=\"aui-flag\"></div>')\n        .attr({\n            'aria-label': escapeHtml(ariaLabel),\n            'aria-hidden': 'false',\n            'aria-live': escapeHtml(ariaLive),\n            'role': ariaRole,\n            ...(isFocusable\n                ? {\n                      'data-aui-focus-selector': FOCUSABLE_QUERY.split(', ')\n                          .map((item) => `.aui-message ${item}`)\n                          .join(', '),\n                      'data-aui-focus': 'true',\n                  }\n                : {}),\n            ...(!!ariaDescription ? { 'aria-description': escapeHtml(ariaDescription) } : {}),\n        })\n        .append($message);\n}\n\nfunction makeCloseable($flag) {\n    const $icon = $(CLOSE_BUTTON);\n\n    $icon.on('click', function () {\n        closeFlag($flag);\n    });\n\n    $icon.on('keypress', function (e) {\n        if (e.which === keyCode.ENTER || e.which === keyCode.SPACE) {\n            closeFlag($flag);\n            e.preventDefault();\n        }\n    });\n\n    return $flag.find('.aui-message').append($icon)[0];\n}\n\nfunction makeAutoClosable($flag, duration) {\n    $flag.find('.aui-message').addClass('aui-will-close');\n    setTimeout(function () {\n        $flag[0].close();\n    }, duration);\n}\n\nfunction closeFlag($flagToClose) {\n    const flag = $flagToClose.get(0);\n\n    if ($flagToClose.attr('role') === 'alertdialog') {\n        getFocusManager.global.exit($flagToClose);\n    }\n\n    flag.removeAttribute('open');\n    flag.setAttribute('inert', '');\n    flag.setAttribute('aria-hidden', true);\n    flag.style.display = 'none';\n    flag.dispatchEvent(new CustomEvent('aui-flag-close', { bubbles: true }));\n\n    return flag;\n}\n\nfunction handleFlagContainer() {\n    const container = findContainer();\n\n    if (container) {\n        const closedFlags = container.querySelectorAll('.aui-flag:not([open])');\n\n        Array.from(closedFlags).map((flag) => flag.parentNode.removeChild(flag));\n    } else {\n        $('body').prepend('<div id=\"' + ID_FLAG_CONTAINER + '\"></div>');\n    }\n}\n\nfunction findContainer() {\n    return document.getElementById(ID_FLAG_CONTAINER);\n}\n\nfunction insertFlag($flag) {\n    const flagContainer = findContainer();\n\n    $flag.appendTo(flagContainer);\n    recomputeStyle($flag);\n\n    $flag.attr('aria-hidden', 'false').attr('open', 'open');\n}\n\namdify('aui/flag', flag);\nglobalize('flag', flag);\nexport default flag;\n","/* AUI-4199: This puts the FFI object on the jQuery global for backwards compatibility. */\nimport FancyFileInput from '@atlassian/fancy-file-input/dist/fancy-file-input';\n\nexport default FancyFileInput;\n","import * as logger from './log';\n\nfunction enforcer(element) {\n    function attributeExists(attributeName) {\n        var errorMessage = attributeName + \" wasn't defined\";\n\n        return satisfiesRules(function () {\n            return element.hasAttribute(attributeName);\n        }, errorMessage);\n    }\n\n    function refersTo(attributeName) {\n        if (!attributeExists(attributeName, element)) {\n            return false;\n        }\n\n        var desiredId = element.getAttribute(attributeName);\n        var errorMessage = 'an element with id set to \"' + desiredId + '\" was not found';\n\n        return satisfiesRules(function () {\n            return document.getElementById(desiredId);\n        }, errorMessage);\n    }\n\n    function ariaControls() {\n        return refersTo('aria-controls');\n    }\n\n    function ariaOwns() {\n        return refersTo('aria-owns');\n    }\n\n    function satisfiesRules(predicate, message) {\n        if (!predicate()) {\n            if (element) {\n                logger.error(message, element);\n            } else {\n                logger.error(message);\n            }\n            return false;\n        }\n        return true;\n    }\n\n    return {\n        attributeExists: attributeExists,\n        refersTo: refersTo,\n        satisfiesRules: satisfiesRules,\n        ariaControls: ariaControls,\n        ariaOwns: ariaOwns,\n    };\n}\n\nexport default enforcer;\n","const INPUT_SUFFIX = '-input';\n\nexport { INPUT_SUFFIX };\n","import skate from './internal/skate';\nimport skateTemplateHtml from 'skatejs-template-html';\nimport enforce from './internal/enforcer';\nimport { INPUT_SUFFIX } from './internal/constants';\n\nfunction getLabel(element) {\n    return element.querySelector('label');\n}\n\nfunction updateLabelFor(element, change) {\n    if (element.hasAttribute('for')) {\n        getLabel(element).setAttribute('for', `${change.newValue}${INPUT_SUFFIX}`);\n    } else {\n        getLabel(element).removeAttribute('for');\n    }\n}\n\nfunction updateLabelForm(element, change) {\n    if (element.hasAttribute('form')) {\n        getLabel(element).setAttribute('form', change.newValue);\n    } else {\n        getLabel(element).removeAttribute('form');\n    }\n}\n\nconst LabelEl = skate('aui-label', {\n    template: skateTemplateHtml('<label><content></content></label>'),\n    created: function (element) {\n        element._label = getLabel(element); // required for quick access from test\n    },\n    attached: function (element) {\n        enforce(element).attributeExists('for');\n    },\n    attributes: {\n        for: updateLabelFor,\n        form: updateLabelForm,\n    },\n    prototype: {\n        get disabled() {\n            return this.hasAttribute('disabled');\n        },\n        set disabled(value) {\n            if (value) {\n                this.setAttribute('disabled', '');\n            } else {\n                this.removeAttribute('disabled');\n            }\n        },\n    },\n    events: {\n        click: function (element, e) {\n            if (element.disabled) {\n                e.preventDefault();\n            }\n        },\n    },\n});\n\nexport default LabelEl;\n","import $ from './jquery';\nimport 'select2/select2';\nimport layer from './layer';\n\n/**\n * Wraps a vanilla Select2 with ADG _style_, as an auiSelect2 method on jQuery objects.\n *\n * @since 5.2\n */\n\n/**\n * We make a copy of the original select2 so that later we might re-specify $.fn.auiSelect2 as $.fn.select2. That\n * way, calling code will be able to call $thing.select2() as if they were calling the original library,\n * and ADG styling will just magically happen.\n */\nconst originalSelect2 = $.fn.select2;\n\n// AUI-specific classes\nconst auiContainer = 'aui-select2-container';\nconst auiDropdown = 'aui-select2-drop aui-dropdown2';\nconst auiHasAvatar = 'aui-has-avatar';\n\n// Other constants\nconst DROPDOWN_LAYER_KEY = 'aui.select2DropdownLayer';\n\n$.fn.auiSelect2 = function (first) {\n    let updatedArgs;\n\n    if ($.isPlainObject(first)) {\n        const auiOpts = $.extend({}, first);\n        const auiAvatarClass = auiOpts.hasAvatar ? ' ' + auiHasAvatar : '';\n        //add our classes in addition to those the caller specified\n        auiOpts.containerCssClass =\n            auiContainer +\n            auiAvatarClass +\n            (auiOpts.containerCssClass ? ' ' + auiOpts.containerCssClass : '');\n        auiOpts.dropdownCssClass =\n            auiDropdown +\n            auiAvatarClass +\n            (auiOpts.dropdownCssClass ? ' ' + auiOpts.dropdownCssClass : '');\n        updatedArgs = Array.prototype.slice.call(arguments, 1);\n        updatedArgs.unshift(auiOpts);\n    } else if (!arguments.length) {\n        updatedArgs = [\n            {\n                containerCssClass: auiContainer,\n                dropdownCssClass: auiDropdown,\n            },\n        ];\n    } else {\n        updatedArgs = arguments;\n    }\n\n    const options = updatedArgs[0];\n\n    /**\n     * AUI-5464: after the upgrade to select2 v3.5.4, custom error handling stopped\n     * working, as the `ajax.params.error` function is overriden by select2, and\n     * there is no alternative to this...\n     *\n     * This is a workaround for creating an array of ajax error handlers that will\n     * contain the default handler and the custom ones, which is supported starting\n     * from jQuery v1.5: http://api.jquery.com/jquery.ajax/\n     *\n     * Please note this issue is fixed starting from select2 v4, though the data format\n     * is different.\n     *\n     * @see https://atlassian.slack.com/archives/CFGN5350T/p1686741137056489\n     */\n    if (options.ajax && options.ajax.params && options.ajax.params.error) {\n        let customErrorHandlers = options.ajax.params.error;\n        if (!Array.isArray(customErrorHandlers)) {\n            customErrorHandlers = [customErrorHandlers];\n        }\n        let originalTransport = options.ajax.transport;\n        if (!originalTransport) {\n            originalTransport = originalSelect2.ajaxDefaults.transport;\n        }\n\n        const newTransport = function (...args) {\n            args[0].error = [args[0].error, ...customErrorHandlers];\n            return originalTransport(...args);\n        };\n\n        options.ajax.transport = newTransport;\n    }\n\n    const result = originalSelect2.apply(this, updatedArgs);\n    const select2Instance = this;\n    const searchLabel = options.searchLabel;\n\n    select2Instance.on('select2-open', function () {\n        const $selectInput = $(this);\n        const $selectDropdown = $selectInput.select2('dropdown');\n\n        let dropdownLayer = $selectInput.data(DROPDOWN_LAYER_KEY);\n\n        if (!dropdownLayer) {\n            dropdownLayer = layer();\n            $selectInput.data(DROPDOWN_LAYER_KEY, dropdownLayer);\n        }\n\n        dropdownLayer.show(); // add layer to layer manager to get top z-index\n\n        $selectDropdown.css('z-index', dropdownLayer.$el.css('z-index'));\n        // mask is created during opening event, before open\n        $('#select2-drop-mask').css('z-index', dropdownLayer.$el.css('z-index'));\n\n        if (options.multiple || $selectInput.prop('multiple')) {\n            // This is a multi-select, exiting\n            return;\n        }\n\n        if (searchLabel) {\n            $selectDropdown.find('.select2-search label').text(searchLabel);\n        }\n    });\n\n    select2Instance.on('select2-close', function () {\n        const $selectInput = $(this);\n        const dropdownLayer = $selectInput.data(DROPDOWN_LAYER_KEY);\n\n        if (dropdownLayer) {\n            dropdownLayer.hide();\n        } else {\n            AJS.warn(\n                'Warning! AUI: `select2-close` event handler could not discover the layer linked with the Select2 dropdown.',\n                'This may be happening when there are many instances of Select2 created on the same DOM element.',\n                'Consider checking your code as this can negatively affect performance.'\n            );\n        }\n\n        $selectInput.removeData('was-ariadescribedby-cleared');\n    });\n\n    select2Instance.on('select2-loaded', function () {\n        const $selectInput = $(this);\n        const wasAriaDescribedByCleared = $selectInput.data('was-ariadescribedby-cleared');\n\n        if (options.multiple || $selectInput.prop('multiple') || wasAriaDescribedByCleared) {\n            return;\n        }\n\n        const $selectDropdown = $selectInput.select2('dropdown');\n\n        // AUI-5461: when single select dropdown opens up, the first option is\n        // instantly focused, making SRs announce it, while skipping the search field\n        $selectDropdown.find('.select2-search .select2-input').attr('aria-activedescendant', '');\n        $selectInput.data('was-ariadescribedby-cleared', true);\n    });\n\n    select2Instance.on('select2-focus', function () {\n        const $selectInput = $(this);\n        const $container = $selectInput.parent().find('.select2-container');\n\n        if (options.multiple || $selectInput.prop('multiple')) {\n            if (searchLabel) {\n                $container.find('.select2-search-field label').text(searchLabel);\n            }\n\n            return;\n        }\n\n        const $focusserLabel = $container.find('label');\n        if ($focusserLabel.attr('id')) {\n            // The id is already assigned, exiting\n            return;\n        }\n\n        // AUI-5462: when single select is initialized, the selected option container is\n        // linked to the button via aria-labelledby, preventing SRs from reading its label\n        const $focusserInput = $container.find('.select2-focusser');\n        const labelId = $focusserInput.attr('id') + '-label';\n        const ariaLabelledby = $focusserInput.attr('aria-labelledby');\n        $focusserLabel.attr('id', labelId);\n        $focusserInput.attr('aria-labelledby', labelId + ' ' + ariaLabelledby);\n    });\n\n    return result;\n};\n","import $ from './jquery';\nimport './spinner';\nimport skate from './internal/skate';\nimport { fn } from './internal/deprecation';\n\n/**\n * @typedef {Object} jQuerySpinnerConfig\n * @property {SpinnerSize} size - the size of the spinner.\n */\n\n/**\n * @param {jQuerySpinnerConfig|String|Boolean} [firstArgs]\n * - when an object, it is a {jQuerySpinnerConfig}\n * - when a string, it represents the `size` the spinner should take.\n * - when boolean, the argument can take only FALSE, in this case, the spinner will be stopped.\n * @param {jQuerySpinnerConfig} [maybeArgs]\n * @deprecated since AUI 7.9.4. Use the `<aui-spinner>` web component directly.\n */\n$.fn.spin = fn(\n    function spinStart(firstArgs, maybeArgs) {\n        let args = { size: 'small' };\n        if (typeof maybeArgs === 'object') {\n            args = $.extend(args, maybeArgs);\n        }\n        if (typeof firstArgs === 'object') {\n            args = $.extend(args, firstArgs);\n        }\n        if (typeof firstArgs === 'string') {\n            args.size = firstArgs;\n        }\n        if (typeof firstArgs === 'boolean' && firstArgs === false) {\n            return this.spinStop();\n        }\n\n        return this.each(function () {\n            if (!this || !this.nodeType) {\n                return;\n            }\n            const $this = $(this);\n            const data = $this.data();\n            if (data) {\n                const $spinnerDom = $('<aui-spinner filled></aui-spinner>');\n                $spinnerDom.attr('size', args.size); // the web component handles validation\n                $spinnerDom.css('color', args.color);\n\n                $this.spinStop();\n                $this.append($spinnerDom);\n                // AUI-4819 - ensure web component is initialised synchronously.\n                skate.init(this);\n\n                data.spinner = $spinnerDom;\n            }\n        });\n    },\n    'jQuery.fn.spin',\n    {\n        sinceVersion: '7.9.4',\n        removeInVersion: '12.0.0',\n        alternativeName: '<aui-spinner>',\n    }\n);\n\n/**\n * @deprecated since AUI 7.9.4. Use the `<aui-spinner>` web component directly.\n */\n$.fn.spinStop = fn(\n    function spinStop() {\n        return this.each(function () {\n            if (!this || !this.nodeType) {\n                return;\n            }\n            const $this = $(this);\n            const data = $this.data();\n            if (data && data.spinner) {\n                data.spinner.remove();\n\n                delete data.spinner;\n            }\n        });\n    },\n    'jQuery.fn.spinStop',\n    {\n        sinceVersion: '7.9.4',\n        removeInVersion: '12.0.0',\n        alternativeName: '<aui-spinner>',\n    }\n);\n","import skate from '../skate';\nimport escapeHtml from '../../escape-html';\n\nexport default skate('aui-option', {\n    created: function (element) {\n        Object.defineProperty(element, 'value', {\n            get: function () {\n                return element.getAttribute('value') || escapeHtml(this.textContent);\n            },\n            set: function (value) {\n                element.setAttribute('value', value);\n            },\n        });\n    },\n    prototype: {\n        serialize: function () {\n            var json = {};\n            if (this.hasAttribute('img-src')) {\n                json['img-src'] = encodeURI(this.getAttribute('img-src'));\n            }\n            json.value = this.value;\n            json.label = escapeHtml(this.textContent);\n\n            return json;\n        },\n    },\n});\n","import { bindAll, extend, first, isFunction, pluck } from 'underscore';\nimport Backbone from 'backbone';\nimport globalize from './internal/globalize';\n\n/**\n * @fileOverview describes a ProgressiveDataSet object.\n *\n * This object serves as part of a series of components to handle the various aspects of autocomplete controls.\n */\nvar ProgressiveDataSet = Backbone.Collection.extend({\n    /**\n     * A queryable set of data that optimises the speed at which responses can be provided.\n     *\n     * ProgressiveDataSet should be given a matcher function so that it may filter results for queries locally.\n     *\n     * ProgressiveDataSet can be given a remote query endpoint to fetch data from. Should a remote endpoint\n     * be provided, ProgressiveDataSet will leverage both client-side matching and query caching to reduce\n     * the number of times the remote source need be queried.\n     *\n     * @example\n     * var source = new ProgressiveDataSet([], {\n     *     model: Backbone.Model.extend({ idAttribute: \"username\" }),\n     *     queryEndpoint: \"/jira/rest/latest/users\",\n     *     queryParamKey: \"username\",\n     *     matcher: function(model, query) {\n     *         return _.startsWith(model.get('username'), query);\n     *     }\n     * });\n     * source.on('respond', doStuffWithMatchingResults);\n     * source.query('john');\n     *\n     * @property {String} value the latest query for which the ProgressiveDataSet is responding to.\n     * @property {Number} activeQueryCount the number of queries being run remotely.\n     */\n    initialize: function (models, options) {\n        options || (options = {});\n        if (options.matcher) {\n            this.matcher = options.matcher;\n        }\n        if (options.model) {\n            this.model = options.model; // Fixed in backbone 0.9.2\n        }\n        this._idAttribute = new this.model().idAttribute;\n        this._maxResults = options.maxResults || 5;\n        this._queryData = options.queryData || {};\n        this._queryParamKey = options.queryParamKey || 'q';\n        this._queryEndpoint = options.queryEndpoint || '';\n        this.value = null;\n        this.queryCache = {};\n        this.activeQueryCount = 0;\n        bindAll(this, 'query', 'respond');\n    },\n\n    url: function () {\n        return this._queryEndpoint;\n    },\n\n    /**\n     * Sets and runs a query against the ProgressiveDataSet.\n     *\n     * Bind to ProgressiveDataSet's 'respond' event to receive the results that match the latest query.\n     *\n     * @param {String} query the query to run.\n     */\n    query: function (query) {\n        var remote;\n        var results;\n\n        this.value = query;\n        results = this.getFilteredResults(query);\n        this.respond(query, results);\n\n        if (\n            !query ||\n            !this._queryEndpoint ||\n            this.hasQueryCache(query) ||\n            !this.shouldGetMoreResults(results)\n        ) {\n            return;\n        }\n\n        remote = this.fetch(query);\n\n        this.activeQueryCount++;\n        this.trigger('activity', { activity: true });\n\n        remote.always(() => {\n            this.activeQueryCount--;\n            this.trigger('activity', { activity: !!this.activeQueryCount });\n        });\n\n        remote.done((resp, succ, xhr) => {\n            this.addQueryCache(query, resp, xhr);\n        });\n        remote.done(() => {\n            query = this.value;\n            results = this.getFilteredResults(query);\n            this.respond(query, results);\n        });\n    },\n\n    /**\n     * Gets all the data that should be sent in a remote request for data.\n     * @param {String} query the value of the query to be run.\n     * @return {Object} the data to to be sent to the remote when querying it.\n     * @private\n     */\n    getQueryData: function (query) {\n        var params = isFunction(this._queryData) ? this._queryData(query) : this._queryData;\n        var data = extend({}, params);\n        data[this._queryParamKey] = query;\n        return data;\n    },\n\n    /**\n     * Get data from a remote source that matches the query, and add it to this ProgressiveDataSet's set.\n     *\n     * @param {String} query the value of the query to be run.\n     * @return {jQuery.Deferred} a deferred object representing the remote request.\n     */\n    fetch: function (query) {\n        var data = this.getQueryData(query);\n        // {add: true} for Backbone <= 0.9.2\n        // {update: true, remove: false} for Backbone >= 0.9.9\n        var params = { add: true, update: true, remove: false, data: data };\n        var remote = Backbone.Collection.prototype.fetch.call(this, params);\n        return remote;\n    },\n\n    /**\n     * Triggers the 'respond' event on this ProgressiveDataSet for the given query and associated results.\n     *\n     * @param {String} query the query that was run\n     * @param {Array} results a set of results that matched the query.\n     * @return {Array} the results.\n     * @private\n     */\n    respond: function (query, results) {\n        this.trigger('respond', {\n            query: query,\n            results: results,\n        });\n        return results;\n    },\n\n    /**\n     * A hook-point to define a function that tests whether a model matches a query or not.\n     *\n     * This will be called by getFilteredResults in order to generate the list of results for a query.\n     *\n     * (For you java folks, it's essentially a predicate.)\n     *\n     * @param {Backbone.Model} item a model of the data to check for a match in.\n     * @param {String} query the value to test against the item.\n     * @returns {Boolean} true if the model matches the query, otherwise false.\n     * @function\n     */\n    matcher: function (item, query) {}, // eslint-disable-line no-unused-vars\n\n    /**\n     * Filters the set of data contained by the ProgressiveDataSet down to a smaller set of results.\n     *\n     * The set will only consist of Models that \"match\" the query -- i.e., only Models where\n     * a call to ProgressiveDataSet#matcher returns true.\n     *\n     * @param query {String} the value that results should match (according to the matcher function)\n     * @return {Array} A set of Backbone Models that match the query.\n     */\n    getFilteredResults: function (query) {\n        var results = [];\n        if (!query) {\n            return results;\n        }\n        results = this.filter(function (item) {\n            return !!this.matcher(item, query);\n        }, this);\n        if (this._maxResults) {\n            results = first(results, this._maxResults);\n        }\n        return results;\n    },\n\n    /**\n     * Store a response in the query cache for a given query.\n     *\n     * @param {String} query the value to cache a response for.\n     * @param {Object} response the data of the response from the server.\n     * @param {XMLHttpRequest} xhr\n     * @private\n     */\n    addQueryCache: function (query, response, xhr) {\n        var cache = this.queryCache;\n        var results = this.parse(response, xhr);\n        cache[query] = pluck(results, this._idAttribute);\n    },\n\n    /**\n     * Check if there is a query cache entry for a given query.\n     *\n     * @param query the value to check in the cache\n     * @return {Boolean} true if the cache contains a response for the query, false otherwise.\n     */\n    hasQueryCache: function (query) {\n        return this.queryCache.hasOwnProperty(query);\n    },\n\n    /**\n     * Get the query cache entry for a given query.\n     *\n     * @param query the value to check in the cache\n     * @return {Object[]} an array of values representing the IDs of the models the response for this query contained.\n     */\n    findQueryCache: function (query) {\n        return this.queryCache[query];\n    },\n\n    /**\n     *\n     * @param {Array} results the set of results we know about right now.\n     * @return {Boolean} true if the ProgressiveDataSet should look for more results.\n     * @private\n     */\n    shouldGetMoreResults: function (results) {\n        return results.length < this._maxResults;\n    },\n\n    /**\n     *\n     * @note Changing this value will trigger ProgressiveDataSet#event:respond if there is a query.\n     * @param {Number} number how many results should the ProgressiveDataSet aim to retrieve for a query.\n     */\n    setMaxResults: function (number) {\n        this._maxResults = number;\n        this.value && this.respond(this.value, this.getFilteredResults(this.value));\n    },\n});\n\nglobalize('ProgressiveDataSet', ProgressiveDataSet);\n\nexport default ProgressiveDataSet;\n","import Backbone from 'backbone';\n\nexport default Backbone.Model.extend({\n    idAttribute: 'value',\n    getLabel: function () {\n        return this.get('label') || this.get('value');\n    },\n});\n","/**\n * @typedef {Object} Suggestion\n * @property {string|number} id\n */\n\n/**\n * @typedef {Object} SuggestionsModelType\n * @property {(oldSuggestions: Suggestion[]) => void} onChange\n * @property {() => void} onHighlightChange\n * @property {(index: number) => Suggestion|undefined} get\n * @property {(suggestions?: Suggestion[]) => SuggestionsModelType} set\n * @property {() => number} getNumberOfResults\n * @property {(toHighlight?: Suggestion) => SuggestionsModelType} setHighlighted\n * @property {(index: number) => SuggestionsModelType} highlight\n * @property {() => SuggestionsModelType} highlightPrevious\n * @property {() => SuggestionsModelType} highlightNext\n * @property {() => Suggestion|undefined} highlighted\n * @property {() => number} highlightedIndex\n */\n\n/**\n * @returns {SuggestionsModelType}\n */\nfunction SuggestionsModel() {\n    return {\n        _suggestions: [],\n        _activeIndex: -1,\n\n        onChange: function () {},\n\n        onHighlightChange: function () {},\n\n        get: function (index) {\n            return this._suggestions[index];\n        },\n\n        set: function (suggestions) {\n            var oldSuggestions = this._suggestions;\n            this._suggestions = suggestions || [];\n            this.onChange(oldSuggestions);\n            return this;\n        },\n\n        getNumberOfResults: function () {\n            return this._suggestions.length;\n        },\n\n        setHighlighted: function (toHighlight) {\n            if (toHighlight) {\n                for (var i = 0; i < this._suggestions.length; i++) {\n                    if (this._suggestions[i].id === toHighlight.id) {\n                        this.highlight(i);\n                    }\n                }\n            }\n\n            return this;\n        },\n\n        highlight: function (index) {\n            this._activeIndex = index;\n            this.onHighlightChange();\n            return this;\n        },\n\n        highlightPrevious: function () {\n            const current = this._activeIndex;\n            const previousActiveIndex = current === 0 ? this._suggestions.length - 1 : current - 1;\n            this.highlight(previousActiveIndex);\n            return this;\n        },\n\n        highlightNext: function () {\n            const current = this._activeIndex;\n            const nextActiveIndex = current === this._suggestions.length - 1 ? 0 : current + 1;\n            this.highlight(nextActiveIndex);\n            return this;\n        },\n\n        highlighted: function () {\n            return this.get(this._activeIndex);\n        },\n\n        highlightedIndex: function () {\n            return this._activeIndex;\n        },\n    };\n}\n\nexport default SuggestionsModel;\n","import $ from '../../jquery';\nimport { I18n } from '../../i18n';\nimport Alignment from '../alignment';\nimport layer from '../../layer';\n\n/**\n * @param {string} listId\n * @param {number} index\n * @returns {string}\n */\nfunction generateListItemID(listId, index) {\n    return listId + '-' + index;\n}\n\n/**\n * @param {SuggestionsViewType} view\n */\nfunction enableAlignment(view) {\n    if (view.anchor && !view._auiAlignment) {\n        view._auiAlignment = new Alignment(view.el, view.anchor, {\n            flipContainer: 'scrollParent',\n            positionFixed: false,\n            preventOverflow: false,\n            flip: false,\n        });\n    }\n\n    if (view._auiAlignment) {\n        view._auiAlignment.enable();\n        view._auiAlignment.scheduleUpdate();\n    }\n}\n\n/**\n * @param {SuggestionsViewType} view\n */\nfunction disableAlignment(view) {\n    if (view._auiAlignment) {\n        view._auiAlignment.disable();\n    }\n}\n\n/**\n * @param {SuggestionsViewType} view\n */\nfunction destroyAlignment(view) {\n    if (view._auiAlignment) {\n        view._auiAlignment.destroy();\n        delete view._auiAlignment;\n    }\n}\n\n/**\n * @param {SuggestionsViewType} view\n */\nfunction matchWidth(view) {\n    $(view.el).css('min-width', $(view.anchor).outerWidth());\n}\n\n/**\n * @param {HTMLElement} element\n */\nfunction clearActive(element) {\n    $(element).find('.aui-select-active').removeClass('aui-select-active');\n}\n\n/**\n * @typedef {Object} Suggestion\n * @property {function(): string} getLabel\n * @property {function(string): string} get\n */\n\n/**\n * @typedef {Object} SuggestionsViewType\n * @property {HTMLElement} el\n * @property {HTMLElement} anchor\n * @property {Alignment} [_auiAlignment]\n * @property {string} [currListId]\n * @property {(suggestions: Suggestion[], currentLength: number, listId: string, selected: number) => SuggestionsViewType} render\n * @property {(active: number) => void} setActive\n * @property {() => HTMLElement|null} getActive\n * @property {() => void} show\n * @property {() => void} hide\n * @property {() => void} destroy\n * @property {() => boolean} isVisible\n */\n\n/**\n * @constructor\n * @param {HTMLElement} element\n * @param {HTMLElement} anchor\n * @returns {SuggestionsViewType}\n */\nfunction SuggestionsView(element, anchor) {\n    const view = {\n        el: element,\n        anchor: anchor,\n\n        render: function (suggestions, currentLength, listId, selected) {\n            this.currListId = listId;\n            let html = '';\n\n            // Do nothing if we have no new suggestions, otherwise append anything else we find.\n            if (suggestions.length) {\n                for (let i = 0; i < suggestions.length; i++) {\n                    const suggestion = suggestions[i];\n                    const currentIndex = i + currentLength;\n                    const label = suggestion.getLabel();\n                    const imageSrc = suggestion.get('img-src');\n                    const image = imageSrc ? `<img src=\"${encodeURI(imageSrc)}\"/>` : '';\n                    const newValueText = suggestion.get('new-value')\n                        ? ` (<em>${I18n.getText('aui.select.new.value')}</em>)`\n                        : '';\n                    html += `<li role=\"option\" class=\"aui-select-suggestion\" aria-selected=\"${selected === currentIndex}\" id=\"${generateListItemID(listId, currentIndex)}\">${image}${label}${newValueText}</li>`;\n                }\n\n                // If the old suggestions were empty, a <li> of 'No suggestions' will be appended, we need to remove it\n                if (currentLength) {\n                    this.el.querySelector('ul').innerHTML += html;\n                } else {\n                    this.el.querySelector('ul').innerHTML = html;\n                }\n            } else if (!currentLength) {\n                this.el.querySelector('ul').innerHTML =\n                    `<li role=\"option\" class=\"aui-select-no-suggestions\">${I18n.getText('aui.select.no.suggestions')}</li>`;\n            }\n\n            return this;\n        },\n        setActive: function (active) {\n            clearActive(this.el);\n            $(this.el)\n                .find('#' + generateListItemID(this.currListId, active))\n                .addClass('aui-select-active');\n        },\n        getActive: function () {\n            return this.el.querySelector('.aui-select-active');\n        },\n        show: function () {\n            matchWidth(this);\n            layer(this.el).show();\n            enableAlignment(this);\n        },\n        hide: function () {\n            clearActive(this.el);\n            layer(this.el).hide();\n            disableAlignment(this);\n        },\n        destroy: function () {\n            this.hide();\n            destroyAlignment(this);\n            delete this.currListId;\n        },\n        isVisible: function () {\n            return $(this.el).is(':visible');\n        },\n    };\n\n    return view;\n}\n\nexport default SuggestionsView;\n","import $ from './jquery';\nimport './button';\nimport { I18n } from './i18n';\nimport './spin';\nimport Option from './internal/select/option';\nimport amdify from './internal/amdify';\nimport globalize from './internal/globalize';\nimport keyCode from './key-code';\nimport ProgressiveDataSet from './progressive-data-set';\nimport skate from './internal/skate';\nimport state from './internal/state';\nimport SuggestionModel from './internal/select/suggestion-model';\nimport SuggestionsModel from './internal/select/suggestions-model';\nimport SuggestionsView from './internal/select/suggestions-view';\nimport template from './internal/select/template';\nimport uniqueId from './unique-id';\nimport { INPUT_SUFFIX } from './internal/constants';\nimport { ifGone } from './internal/elements';\n\nconst DESELECTED = -1;\nconst NO_HIGHLIGHT = -1;\nconst DEFAULT_SS_PDS_SIZE = 20;\nconst ASSISTIVE_STATUS_DELAY_MS = 50;\n\nfunction decodeHtmlEntities(input) {\n    var doc = new DOMParser().parseFromString(input, 'text/html');\n    return doc.documentElement.textContent;\n}\n\nfunction clearElementImage(element) {\n    element._input.removeAttribute('style');\n    $(element._input).removeClass('aui-select-has-inline-image');\n}\n\nfunction deselect(element) {\n    element._select.selectedIndex = DESELECTED;\n    clearElementImage(element);\n}\n\nfunction hasResults(element) {\n    return element._suggestionModel.getNumberOfResults();\n}\n\nfunction waitForAssistive(callback) {\n    setTimeout(callback, ASSISTIVE_STATUS_DELAY_MS);\n}\n\nfunction setBusyState(element) {\n    if (!element._button.isBusy()) {\n        element._button.busy();\n        element._input.setAttribute('aria-busy', 'true');\n        element._dropdown.setAttribute('aria-busy', 'true');\n    }\n}\n\nfunction setIdleState(element) {\n    element._button.idle();\n    element._input.setAttribute('aria-busy', 'false');\n    element._dropdown.setAttribute('aria-busy', 'false');\n}\n\nfunction matchPrefix(model, query) {\n    var value = model.get('label').toLowerCase();\n    return value.indexOf(query.toLowerCase()) === 0;\n}\n\nfunction resetDropdown(element) {\n    element._input.setAttribute('aria-expanded', 'false');\n    element._button.setAttribute('aria-expanded', 'false');\n    element._input.removeAttribute('aria-activedescendant');\n    updateAssistiveStatus(element, '');\n}\n\nfunction resetAndCloseDropdown(element) {\n    element._suggestionsView.hide();\n    resetDropdown(element);\n}\n\nfunction setInitialVisualState(element) {\n    var initialHighlightedItem = hasResults(element) ? 0 : NO_HIGHLIGHT;\n\n    element._suggestionModel.highlight(initialHighlightedItem);\n\n    resetAndCloseDropdown(element);\n}\n\nfunction setElementImage(element, imageSource) {\n    $(element._input).addClass('aui-select-has-inline-image');\n    element._input.setAttribute('style', 'background-image: url(' + encodeURI(imageSource) + ')');\n}\n\nfunction suggest(element, autoHighlight, query) {\n    element._autoHighlight = autoHighlight;\n\n    if (query === undefined) {\n        query = element._input.value;\n    }\n\n    element._progressiveDataSet.query(query);\n}\n\nfunction setInputImageToHighlightedSuggestion(element) {\n    var imageSource =\n        element._suggestionModel.highlighted() &&\n        element._suggestionModel.highlighted().get('img-src');\n    if (imageSource) {\n        setElementImage(element, imageSource);\n    }\n}\n\nfunction setValueAndDisplayFromModel(element, model) {\n    if (!model) {\n        return;\n    }\n\n    var option = document.createElement('option');\n    var select = element._select;\n    var value = model.get('value') || model.get('label');\n    var label = decodeHtmlEntities(model.getLabel());\n\n    option.setAttribute('selected', '');\n    option.setAttribute('value', value);\n    option.textContent = label;\n\n    // Sync element value.\n    element._input.value = label;\n\n    select.innerHTML = '';\n    select.options.add(option);\n    select.dispatchEvent(new CustomEvent('change', { bubbles: true }));\n}\n\nfunction clearValue(element) {\n    element._input.value = '';\n    element._select.innerHTML = '';\n}\n\nfunction selectHighlightedSuggestion(element) {\n    setValueAndDisplayFromModel(element, element._suggestionModel.highlighted());\n    setInputImageToHighlightedSuggestion(element);\n    resetAndCloseDropdown(element);\n}\n\nfunction convertOptionToModel(option) {\n    return new SuggestionModel(option.serialize());\n}\n\nfunction convertOptionsToModels(element) {\n    var models = [];\n\n    for (var i = 0; i < element._datalist.children.length; i++) {\n        var option = element._datalist.children[i];\n        models.push(convertOptionToModel(option));\n    }\n\n    return models;\n}\n\n/**\n * Replaces the suggestions with a new set.\n * @param element\n * @param data\n * @returns {boolean} true if the results are different from the previous set; false otherwise.\n */\nfunction clearAndSet(element, data) {\n    const before = element._suggestionModel.getNumberOfResults();\n    element._suggestionModel.set();\n    element._suggestionModel.set(data.results);\n    const after = element._suggestionModel.getNumberOfResults();\n    return before !== after;\n}\n\nfunction getActiveId(select) {\n    var active = select._dropdown.querySelector('.aui-select-active');\n    return active && active.id;\n}\n\nfunction getIndexInResults(id, results) {\n    var resultsIds = $.map(results, function (result) {\n        return result.id;\n    });\n\n    return resultsIds.indexOf(id);\n}\n\nfunction createNewValueModel(element) {\n    var option = new Option();\n    option.setAttribute('value', element._input.value);\n    var newValueSuggestionModel = convertOptionToModel(option);\n    newValueSuggestionModel.set('new-value', true);\n    return newValueSuggestionModel;\n}\n\nfunction initialiseProgressiveDataSet(element) {\n    element._progressiveDataSet = new ProgressiveDataSet(convertOptionsToModels(element), {\n        model: SuggestionModel,\n        matcher: matchPrefix,\n        queryEndpoint: element._queryEndpoint,\n        maxResults: DEFAULT_SS_PDS_SIZE,\n    });\n\n    element._isSync = !element._queryEndpoint;\n\n    // Progressive data set should indicate whether or not it is busy when processing any async requests.\n    // Check if there's any active queries left, if so: set spinner and state to busy, else set to idle and remove\n    // the spinner.\n    element._progressiveDataSet.on('activity', function () {\n        if (element._progressiveDataSet.activeQueryCount && !element._isSync) {\n            setBusyState(element);\n            state(element).set('should-flag-new-suggestions', false);\n        } else {\n            setIdleState(element);\n            state(element).set('should-flag-new-suggestions', true);\n        }\n    });\n\n    // Progressive data set doesn't do anything if the query is empty so we\n    // must manually convert all data list options into models.\n    //\n    // Otherwise progressive data set can do everything else for us:\n    // 1. Sync matching\n    // 2. Async fetching and matching\n    element._progressiveDataSet.on('respond', function (data) {\n        // This means that a query was made before the input was cleared and\n        // we should cancel the response.\n        if (data.query && !element._input.value) {\n            return;\n        }\n\n        if (state(element).get('should-cancel-response')) {\n            if (!element._progressiveDataSet.activeQueryCount) {\n                state(element).set('should-cancel-response', false);\n            }\n\n            return;\n        }\n\n        if (!data.query) {\n            data.results = convertOptionsToModels(element);\n        }\n\n        var isInputExactMatch = getIndexInResults(element._input.value, data.results) !== -1;\n        var isInputEmpty = !element._input.value;\n\n        if (element.hasAttribute('can-create-values') && !isInputExactMatch && !isInputEmpty) {\n            data.results.push(createNewValueModel(element));\n        }\n\n        let indexOfValueInResults = getIndexInResults(element.value, data.results);\n        indexOfValueInResults = indexOfValueInResults === -1 ? 0 : indexOfValueInResults;\n\n        const resultsChanged = clearAndSet(element, data);\n        const optionToHighlight = data.results[indexOfValueInResults];\n\n        if (element._autoHighlight) {\n            element._suggestionModel.setHighlighted(optionToHighlight);\n            waitForAssistive(function () {\n                const activeId = getActiveId(element);\n                if (activeId !== undefined && activeId !== null) {\n                    element._input.setAttribute('aria-activedescendant', activeId);\n                } else {\n                    element._input.removeAttribute('aria-activedescendant');\n                }\n            });\n        }\n\n        element._input.setAttribute('aria-expanded', 'true');\n        element._button.setAttribute('aria-expanded', 'true');\n\n        // If the response is async (append operation), has elements to append and has a highlighted element, we need to update the status.\n        if (\n            !element._isSync &&\n            resultsChanged &&\n            element._suggestionsView.getActive() &&\n            state(element).get('should-flag-new-suggestions')\n        ) {\n            element.querySelector('.aui-select-status').innerHTML = I18n.getText(\n                'aui.select.new.suggestions'\n            );\n        }\n\n        element._suggestionsView.show();\n    });\n}\n\nfunction associateDropdownAndTrigger(element) {\n    element._dropdown.id = element._listId;\n    element.querySelector('button').setAttribute('aria-controls', element._listId);\n}\n\nfunction bindHighlightMouseover(element) {\n    $(element._dropdown).on('mouseover', 'li', function (e) {\n        if (hasResults(element)) {\n            element._suggestionModel.highlight($(e.target).index());\n        }\n    });\n}\n\nexport function bindSelectMousedown(element) {\n    let preventClosingContainerLayer = false;\n\n    $(document).on('aui-close-layers-on-outer-click.single-select', (e) => {\n        if (preventClosingContainerLayer) {\n            e.preventDefault();\n            preventClosingContainerLayer = false;\n        }\n    });\n\n    $(element._dropdown).on('mousedown', 'li', function (e) {\n        if (hasResults(element)) {\n            element._suggestionModel.highlight($(e.target).index());\n            selectHighlightedSuggestion(element);\n\n            if ($(element).closest('.aui-layer').length > 0) {\n                preventClosingContainerLayer = true;\n            }\n        } else {\n            return false;\n        }\n    });\n}\n\nfunction updateAssistiveStatus(element, status) {\n    clearTimeout(element.assistiveStatusTimerId);\n    element.assistiveStatusTimerId = setTimeout(() => {\n        const assistiveStatusText = element._assistiveStatus.innerText;\n        if (status !== assistiveStatusText) {\n            element._assistiveStatus.innerText = status;\n        }\n    }, ASSISTIVE_STATUS_DELAY_MS);\n}\n\nfunction initialiseValue(element) {\n    var option = element._datalist.querySelector('aui-option[selected]');\n\n    if (option) {\n        setValueAndDisplayFromModel(element, convertOptionToModel(option));\n    }\n}\n\nfunction isQueryInProgress(element) {\n    return element._progressiveDataSet.activeQueryCount > 0;\n}\n\nfunction focusInHandler(element) {\n    //if there is a selected value the single select should do an empty\n    //search and return everything\n    const searchValue = element.value ? '' : element._input.value;\n    suggest(element, true, searchValue);\n}\n\nfunction cancelInProgressQueries(element) {\n    if (isQueryInProgress(element)) {\n        state(element).set('should-cancel-response', true);\n    }\n}\n\nfunction getSelectedLabel(element) {\n    if (element._select.selectedIndex >= 0) {\n        return element._select.options[element._select.selectedIndex].textContent;\n    }\n}\n\nfunction handleInvalidInputOnFocusOut(element) {\n    var selectCanBeEmpty = !element.hasAttribute('no-empty-values');\n    var selectionIsEmpty = !element._input.value;\n    var selectionNotExact = element._input.value !== getSelectedLabel(element);\n    var selectionNotValid = selectionIsEmpty || selectionNotExact;\n\n    if (selectionNotValid) {\n        if (selectCanBeEmpty) {\n            deselect(element);\n        } else {\n            var selection = getSelectedLabel(element);\n            if (typeof selection === 'undefined') {\n                deselect(element);\n            } else {\n                element._input.value = selection;\n            }\n        }\n    }\n}\n\nfunction handleHighlightOnFocusOut(element) {\n    // Forget the highlighted suggestion.\n    element._suggestionModel.highlight(NO_HIGHLIGHT);\n}\n\nfunction focusOutHandler(element) {\n    cancelInProgressQueries(element);\n    handleInvalidInputOnFocusOut(element);\n    handleHighlightOnFocusOut(element);\n    resetAndCloseDropdown(element);\n}\n\nconst SelectEl = skate('aui-select', {\n    template: template,\n    created: function (element) {\n        element._listId = uniqueId();\n        element._input = element.querySelector('input');\n        element._select = element.querySelector('select');\n        element._dropdown = element.querySelector('.aui-popover');\n        element._datalist = element.querySelector('datalist');\n        element._button = element.querySelector('button');\n        element._assistiveStatus = element.querySelector('.aui-select-status.assistive');\n        element._suggestionsView = new SuggestionsView(element._dropdown, element._input);\n        element._suggestionModel = new SuggestionsModel();\n\n        element._suggestionModel.onChange = function (oldSuggestions) {\n            const suggestionsToAdd = [];\n\n            element._suggestionModel._suggestions.forEach(function (newSuggestion) {\n                const inArray = oldSuggestions.some(\n                    (oldSuggestion) => newSuggestion.id === oldSuggestion.id\n                );\n                if (!inArray) {\n                    suggestionsToAdd.push(newSuggestion);\n                }\n            });\n            const results = convertOptionsToModels(element);\n            const indexOfValueInResults = getIndexInResults(element.value, results);\n            const numberOfItems = oldSuggestions.length + suggestionsToAdd.length;\n            const status = numberOfItems ? '' : `${I18n.getText('aui.select.no.suggestions')}`;\n\n            element._suggestionsView.render(\n                suggestionsToAdd,\n                oldSuggestions.length,\n                element._listId,\n                indexOfValueInResults\n            );\n            updateAssistiveStatus(element, status);\n        };\n\n        element._suggestionModel.onHighlightChange = function () {\n            const active = element._suggestionModel.highlightedIndex();\n            element._suggestionsView.setActive(active);\n\n            const activeId = getActiveId(element);\n            if (activeId !== undefined && activeId !== null) {\n                element._input.setAttribute('aria-activedescendant', activeId);\n            } else {\n                element._input.removeAttribute('aria-activedescendant');\n            }\n        };\n    },\n\n    attached: function (element) {\n        skate.init(element);\n        initialiseProgressiveDataSet(element);\n        associateDropdownAndTrigger(element);\n        element._input.setAttribute('aria-controls', element._listId);\n        bindHighlightMouseover(element);\n        bindSelectMousedown(element);\n        initialiseValue(element);\n        setInitialVisualState(element);\n        setInputImageToHighlightedSuggestion(element);\n    },\n\n    detached: function (element) {\n        $(document).off('aui-close-layers-on-outer-click');\n        ifGone(element).then(() => {\n            resetAndCloseDropdown(element);\n            element._suggestionsView.destroy();\n        });\n    },\n\n    attributes: {\n        id(element, data) {\n            if (element.id) {\n                element.querySelector('input').id = data.newValue + INPUT_SUFFIX;\n            }\n        },\n\n        name(element, data) {\n            element.querySelector('select').setAttribute('name', data.newValue);\n            element.querySelector('select').setAttribute('aria-label', `${data.newValue} list`);\n            element.querySelector('button').setAttribute('aria-label', `${data.newValue} list`);\n            element\n                .querySelector('ul[role=\"listbox\"]')\n                .setAttribute('aria-label', `${data.newValue} list`);\n        },\n\n        placeholder(element, data) {\n            element.querySelector('input').setAttribute('placeholder', data.newValue);\n        },\n\n        src(element, data) {\n            element._queryEndpoint = data.newValue;\n        },\n    },\n\n    events: {\n        'blur input': function (element) {\n            focusOutHandler(element);\n        },\n\n        'mousedown button': function (element) {\n            if (\n                document.activeElement === element._input &&\n                !element._dropdown.hasAttribute('hidden')\n            ) {\n                state(element).set('prevent-open-on-button-click', true);\n            }\n        },\n\n        'click input': function (element) {\n            focusInHandler(element);\n        },\n\n        'click button': function (element) {\n            var data = state(element);\n\n            if (data.get('prevent-open-on-button-click')) {\n                data.set('prevent-open-on-button-click', false);\n            } else {\n                state(element).set('button-clicked-prevent-dropdown-hide', true);\n                element.focus();\n            }\n        },\n\n        'input': function (element) {\n            if (!element._input.value) {\n                if (state(element).get('button-clicked-prevent-dropdown-hide')) {\n                    state(element).set('button-clicked-prevent-dropdown-hide', false);\n                } else {\n                    resetAndCloseDropdown(element);\n                }\n            } else {\n                suggest(element, true);\n            }\n        },\n\n        'keydown input': function (element, e) {\n            var currentValue = element._input.value;\n            var handled = false;\n\n            if (e.keyCode === keyCode.ESCAPE) {\n                cancelInProgressQueries(element);\n                // There is no need to hide layer manually here. It will be handled by layering system.\n                // Otherwise, it can fire ESC event to the next layer, so\n                // it will close the next ESCapable layer.\n                // The only what we need is clean the state of the component.\n                resetDropdown(element);\n                return;\n            }\n\n            var isSuggestionViewVisible = element._suggestionsView.isVisible();\n\n            if (isSuggestionViewVisible && hasResults(element)) {\n                if (e.keyCode === keyCode.ENTER) {\n                    cancelInProgressQueries(element);\n                    selectHighlightedSuggestion(element);\n                    e.preventDefault();\n                } else if (e.keyCode === keyCode.TAB) {\n                    selectHighlightedSuggestion(element);\n                    handled = true;\n                } else if (e.keyCode === keyCode.UP) {\n                    element._suggestionModel.highlightPrevious();\n                    e.preventDefault();\n                } else if (e.keyCode === keyCode.DOWN) {\n                    element._suggestionModel.highlightNext();\n                    e.preventDefault();\n                }\n            } else if (e.keyCode === keyCode.UP || e.keyCode === keyCode.DOWN) {\n                focusInHandler(element);\n                e.preventDefault();\n            }\n\n            handled = handled || e.defaultPrevented;\n            setTimeout(function emulateCrossBrowserInputEvent() {\n                if (element._input.value !== currentValue && !handled) {\n                    element.dispatchEvent(new CustomEvent('input', { bubbles: true }));\n                }\n            }, 0);\n        },\n    },\n\n    prototype: {\n        get value() {\n            var selected = this._select.options[this._select.selectedIndex];\n            return selected ? selected.value : '';\n        },\n\n        set value(value) {\n            if (value === '') {\n                clearValue(this);\n            } else if (value) {\n                var data = this._progressiveDataSet;\n                var model = data.findWhere({ value }) || data.findWhere({ label: value });\n\n                // Create a new value if allowed and the value doesn't exist.\n                if (!model && this.hasAttribute('can-create-values')) {\n                    model = new SuggestionModel({ value: value, label: value });\n                }\n\n                setValueAndDisplayFromModel(this, model);\n            }\n            return this;\n        },\n\n        get displayValue() {\n            return this._input.value;\n        },\n\n        blur: function () {\n            this._input.blur();\n            focusOutHandler(this);\n            return this;\n        },\n\n        focus: function () {\n            this._input.focus();\n            focusInHandler(this);\n            return this;\n        },\n    },\n});\n\namdify('aui/select', SelectEl);\nglobalize('select', SelectEl);\nexport default SelectEl;\n","import template from 'skatejs-template-html';\n\nexport default template(`\n    <input type=\"text\" class=\"text\" role=\"combobox\" aria-expanded=\"false\">\n    <select></select>\n    <datalist>\n        <content select=\"aui-option\"></content>\n    </datalist>\n    <button class=\"aui-button\" tabindex=\"-1\" type=\"button\"></button>\n    <div class=\"aui-popover\" data-aui-alignment=\"bottom left\" hidden>\n        <ul role=\"listbox\" class=\"aui-optionlist\"></ul>\n    </div>\n    <div class=\"aui-select-status assistive\" aria-live=\"polite\" role=\"status\"></div>\n`);\n","/**\n * Like el.hasAttribute(attr) but designed for use within a skate attribute\n * change handler where you only have access to change.oldValue.\n */\nexport function computeBooleanValue(attrValue) {\n    return attrValue !== null;\n}\n\nexport function setBooleanAttribute(el, attr, newValue) {\n    if (newValue) {\n        el.setAttribute(attr, '');\n    } else {\n        el.removeAttribute(attr);\n    }\n}\n\nexport function computeEnumValue(enumOptions, value) {\n    const matchesEnumValue = (enumValue) => enumValue.toLowerCase() === value.toLowerCase();\n\n    const isMissing = value === null;\n    const isInvalid = !isMissing && !enumOptions.values.filter(matchesEnumValue).length;\n\n    if (isMissing) {\n        if (enumOptions.hasOwnProperty('missingDefault')) {\n            return enumOptions.missingDefault;\n        }\n        return null;\n    }\n\n    if (isInvalid) {\n        if (enumOptions.hasOwnProperty('invalidDefault')) {\n            return enumOptions.invalidDefault;\n        } else if (enumOptions.hasOwnProperty('missingDefault')) {\n            return enumOptions.missingDefault;\n        }\n        return null;\n    }\n\n    return enumOptions.values.length ? enumOptions.values.filter(matchesEnumValue)[0] : null;\n}\n\nexport function setEnumAttribute(el, enumOptions, newValue) {\n    el.setAttribute(enumOptions.attribute, newValue);\n}\n\n/**\n * Helper functions useful for implementing reflected boolean and enumerated\n * attributes and properties.\n *\n * @see https://html.spec.whatwg.org/multipage/infrastructure.html#reflecting-content-attributes-in-idl-attributes\n * @see https://html.spec.whatwg.org/multipage/infrastructure.html#boolean-attribute\n * @see https://html.spec.whatwg.org/multipage/infrastructure.html#enumerated-attribute\n */\nexport default {\n    computeBooleanValue,\n    setBooleanAttribute,\n\n    computeEnumValue,\n    setEnumAttribute,\n};\n","import './spin';\nimport './tooltip';\nimport $ from './jquery';\nimport { setBooleanAttribute } from './internal/attributes';\nimport { supportsFocusWithin } from './internal/browser';\nimport enforce from './internal/enforcer';\nimport keyCode from './key-code';\nimport skateTemplateHtml from 'skatejs-template-html';\nimport skate from './internal/skate';\nimport { INPUT_SUFFIX } from './internal/constants';\nimport SpinnerEl, { SIZE } from './spinner';\nimport { I18n } from './i18n';\n\nfunction fireChangeEvent(element) {\n    if (element._canFireEventsNow) {\n        element.dispatchEvent(new CustomEvent('change', { bubbles: true }));\n    }\n}\n\nfunction getInput(element) {\n    return element._input || (element._input = element.querySelector('input'));\n}\n\nfunction getSpinner(element) {\n    return element._spinner || (element._spinner = new SpinnerEl());\n}\n\nfunction removedAttributeHandler(attributeName, element) {\n    getInput(element).removeAttribute(attributeName);\n}\n\nfunction fallbackAttributeHandler(attributeName, element, change) {\n    getInput(element).setAttribute(attributeName, change.newValue);\n}\n\nfunction getAttributeHandler(attributeName) {\n    return {\n        removed: removedAttributeHandler.bind(this, attributeName),\n        fallback: fallbackAttributeHandler.bind(this, attributeName),\n    };\n}\n\nconst formAttributeHandler = {\n    removed: function (element) {\n        removedAttributeHandler.call(this, 'form', element);\n        element._formId = null;\n    },\n    fallback: function (element, change) {\n        fallbackAttributeHandler.call(this, 'form', element, change);\n        element._formId = change.newValue;\n    },\n};\n\nconst idAttributeHandler = {\n    removed: removedAttributeHandler.bind(this, 'id'),\n    fallback: function (element, change) {\n        const val = `${change.newValue}${INPUT_SUFFIX}`;\n        getInput(element).setAttribute('id', val);\n    },\n};\n\nconst valueAttributeHandler = {\n    removed: function (element) {\n        removedAttributeHandler.call(this, 'value', element);\n        // Internet Explorer 11 has a bug where it doesn't clear out the previous value\n        // when the attribute is removed.\n        getInput(element).value = 'on';\n    },\n    fallback: function (element, change) {\n        fallbackAttributeHandler.call(this, 'value', element, change);\n    },\n};\n\nconst checkedAttributeHandler = {\n    removed: function (element) {\n        getInput(element).checked = false;\n    },\n    fallback: function (element) {\n        getInput(element).checked = true;\n    },\n};\n\nconst labelHandler = {\n    removed: function (element) {\n        getInput(element).removeAttribute('aria-label');\n    },\n    fallback: function (element, change) {\n        getInput(element).setAttribute('aria-label', change.newValue);\n    },\n};\n\nfunction clickHandler(element, e) {\n    const input = getInput(element);\n    if (!element.disabled && !element.busy && e.target !== input) {\n        input.checked = !input.checked;\n        fireChangeEvent(element);\n    }\n\n    setBooleanAttribute(element, 'checked', input.checked);\n}\n\nfunction setDisabledForLabels(element, disabled) {\n    if (!element.id) {\n        return;\n    }\n    Array.prototype.forEach.call(\n        document.querySelectorAll(`aui-label[for=\"${element.id}\"]`),\n        function (el) {\n            el.disabled = disabled;\n        }\n    );\n}\n\n/**\n * Workaround to prevent pressing SPACE on busy state.\n * Preventing click event still makes the toggle flip and revert back.\n * So on CSS side, the input has \"pointer-events: none\" on busy state.\n */\nfunction bindEventsToInput(element) {\n    getInput(element).addEventListener('keydown', function (e) {\n        if (element.busy && e.keyCode === keyCode.SPACE) {\n            e.preventDefault();\n        }\n    });\n    // prevent toggle can be trigger through SPACE key on Firefox\n    if (navigator.userAgent.toLowerCase().indexOf('firefox') > -1) {\n        getInput(element).addEventListener('click', function (e) {\n            if (element.busy) {\n                e.preventDefault();\n            }\n        });\n    }\n    // support focus-within manually when necessary\n    if (!supportsFocusWithin()) {\n        element._input.addEventListener('focus', () => element.classList.add('active'));\n        element._input.addEventListener('blur', () => element.classList.remove('active'));\n    }\n}\n\nconst ToggleEl = skate('aui-toggle', {\n    // \"assistive\" class avoids direct interaction with the <input> element\n    // (which prevents our click handler from being called),\n    // while allow the element to still participate in the form.\n    template: skateTemplateHtml(\n        '<input type=\"checkbox\" role=\"switch\" class=\"aui-toggle-input assistive\">',\n        '<span class=\"aui-toggle-view\">',\n        '<span class=\"aui-toggle-tick aui-icon aui-icon-small aui-iconfont-success\"></span>',\n        '<span class=\"aui-toggle-cross aui-icon aui-icon-small aui-iconfont-close-dialog\"></span>',\n        '</span>'\n    ),\n    created: function (element) {\n        getInput(element); // avoid using _input in attribute handlers\n        getSpinner(element).setAttribute('size', SIZE.SMALL.name);\n\n        $(getInput(element)).tooltip({\n            title: function () {\n                return this.checked\n                    ? this.getAttribute('tooltip-on')\n                    : this.getAttribute('tooltip-off');\n            },\n            gravity: 's',\n            hoverable: false,\n        });\n        bindEventsToInput(element);\n        if (element.hasAttribute('checked')) {\n            getInput(element).setAttribute('checked', '');\n        }\n        element._canFireEventsNow = true;\n    },\n    attached: function (element) {\n        enforce(element).attributeExists('label');\n    },\n    events: {\n        click: clickHandler,\n    },\n    attributes: {\n        'id': idAttributeHandler,\n        'checked': checkedAttributeHandler,\n        'disabled': getAttributeHandler('disabled'),\n        'form': formAttributeHandler,\n        'name': getAttributeHandler('name'),\n        'value': valueAttributeHandler,\n        'tooltip-on': {\n            value: I18n.getText('aui.toggle.on'),\n            fallback: function (element, change) {\n                getInput(element).setAttribute(\n                    'tooltip-on',\n                    change.newValue || I18n.getText('aui.toggle.on')\n                );\n            },\n        },\n        'tooltip-off': {\n            value: I18n.getText('aui.toggle.off'),\n            fallback: function (element, change) {\n                getInput(element).setAttribute(\n                    'tooltip-off',\n                    change.newValue || I18n.getText('aui.toggle.off')\n                );\n            },\n        },\n        'label': labelHandler,\n    },\n    prototype: {\n        focus: function () {\n            getInput(this).focus();\n            return this;\n        },\n        get checked() {\n            return getInput(this).checked;\n        },\n        set checked(value) {\n            // Need to explicitly set the property on the checkbox because the\n            // checkbox's property doesn't change with it's attribute after it\n            // is clicked.\n            if (getInput(this).checked !== value) {\n                getInput(this).checked = value;\n                setBooleanAttribute(this, 'checked', value);\n            }\n        },\n        get disabled() {\n            // AUI-4958 - this may be accessed by a jQuery event handler in response to\n            // a DOMNodeInserted event being fired. In this scenario, the `template`\n            // function has been called by skate, but the `created` callback has not.\n            return getInput(this).disabled;\n        },\n        set disabled(value) {\n            return setBooleanAttribute(this, 'disabled', value);\n        },\n        get form() {\n            return document.getElementById(this._formId);\n        },\n        set form(value) {\n            formAttributeHandler.fallback.call(this, this, { newValue: value || null });\n            return this.form;\n        },\n        get name() {\n            return getInput(this).name;\n        },\n        set name(value) {\n            this.setAttribute('name', value);\n            return value;\n        },\n        get value() {\n            return getInput(this).value;\n        },\n        set value(value) {\n            // Setting the value of an input to null sets it to empty string.\n            let newVal = value === null ? '' : value;\n            this.setAttribute('value', newVal);\n            return newVal;\n        },\n        get busy() {\n            return getInput(this).getAttribute('aria-busy') === 'true';\n        },\n        set busy(value) {\n            const input = getInput(this);\n            const spinner = getSpinner(this);\n\n            setBooleanAttribute(this, 'busy', value);\n\n            if (value) {\n                input.setAttribute('aria-busy', 'true');\n                input.indeterminate = true;\n                if (this.checked) {\n                    input.classList.add('indeterminate-checked');\n                    $(this.querySelector('.aui-toggle-tick')).append(spinner);\n                } else {\n                    $(this.querySelector('.aui-toggle-cross')).append(spinner);\n                }\n            } else {\n                input.classList.remove('indeterminate-checked');\n                input.indeterminate = false;\n                input.removeAttribute('aria-busy');\n                if (spinner.parentNode) {\n                    spinner.parentNode.removeChild(this._spinner);\n                }\n            }\n            setDisabledForLabels(this, !!value);\n            return value;\n        },\n    },\n});\n\nexport default ToggleEl;\n","import $ from './jquery';\nimport Alignment from './internal/alignment';\nimport amdify from './internal/amdify';\nimport attributes, { setBooleanAttribute } from './internal/attributes';\nimport enforce from './internal/enforcer';\nimport globalize from './internal/globalize';\nimport layer, { EVENT_PREFIX } from './layer';\nimport skate from './internal/skate';\nimport state from './internal/state';\nimport { doIfTrigger, forEachTrigger, getTrigger, setTrigger } from './trigger';\nimport { ifGone } from './internal/elements';\nimport getFocusManager from './focus-manager';\n\nconst DEFAULT_HOVEROUT_DELAY = 1000;\n\nfunction changeTrigger(element, newTrigger) {\n    if (isPopupMenu(element)) {\n        doIfTrigger(element, function (oldTrigger) {\n            oldTrigger.setAttribute('aria-expanded', 'false');\n            newTrigger.setAttribute('aria-expanded', element.open);\n        });\n    }\n\n    setTrigger(element, newTrigger);\n}\n\nfunction enableAlignment(element, trigger) {\n    if (element._auiAlignment) {\n        element._auiAlignment.changeTarget(trigger);\n        element._auiAlignment.enable();\n    } else {\n        let alignmentOptions = {\n            overflowContainer:\n                element.getAttribute('contained-by') === 'viewport' ? 'viewport' : 'window',\n            positionFixed: false,\n            eventsEnabled: true,\n        };\n\n        element._auiAlignment = new Alignment(element, trigger, alignmentOptions);\n    }\n}\n\nfunction disableAlignment(element) {\n    if (element._auiAlignment) {\n        element._auiAlignment.disable();\n    }\n}\n\nfunction destroyAlignment(element) {\n    if (element._auiAlignment) {\n        element._auiAlignment.destroy();\n        delete element._auiAlignment;\n    }\n}\n\nfunction userInteractingWith(element) {\n    return state(element).get('mouse-inside') || element.contains(document.activeElement);\n}\n\nfunction showOnEnter(element, e) {\n    var newTrigger = e.currentTarget;\n    if (newTrigger) {\n        changeTrigger(element, newTrigger);\n        enableAlignment(element, newTrigger);\n    }\n\n    if (!element.open) {\n        element.open = true;\n    }\n\n    clearTimeout(element._closingTimeout);\n}\n\nfunction closeAfter(delay = 0) {\n    return function closing(element) {\n        if (!element.open || layer(element).isPersistent()) {\n            return;\n        }\n\n        clearTimeout(element._closingTimeout);\n        element._closingTimeout = setTimeout(function () {\n            if (!userInteractingWith(element)) {\n                element.open = false;\n            }\n            element._closingTimeout = null;\n        }, delay);\n    };\n}\n\nconst messageHandler = {\n    click(element, e) {\n        if (element.open && !layer(element).isPersistent()) {\n            element.open = false;\n        } else {\n            changeTrigger(element, e.currentTarget);\n            element.open = true;\n        }\n\n        clearTimeout(element._closingTimeout);\n    },\n\n    mouseenter: showOnEnter,\n    mouseleave: closeAfter(DEFAULT_HOVEROUT_DELAY),\n\n    focus: showOnEnter,\n    blur: closeAfter(0),\n};\n\nfunction handleMessage(element, message) {\n    var messageTypeMap = {\n        toggle: ['click'],\n        hover: ['mouseenter', 'mouseleave', 'focus', 'blur'],\n    };\n\n    var messageList = messageTypeMap[element.respondsTo];\n    if (messageList && messageList.indexOf(message.type) > -1) {\n        messageHandler[message.type](element, message);\n    }\n}\n\nfunction onMouseEnter(e) {\n    var element = e.currentTarget;\n    state(element).set('mouse-inside', true);\n    element.message({\n        type: 'mouseenter',\n    });\n}\n\nfunction onMouseLeave(e) {\n    var element = e.currentTarget;\n    state(element).set('mouse-inside', false);\n    element.message({\n        type: 'mouseleave',\n    });\n}\n\nfunction onBlur(e) {\n    var element = e.currentTarget;\n    if (element.respondsTo === 'hover') {\n        closeAfter(DEFAULT_HOVEROUT_DELAY)(element);\n    }\n}\n\nfunction rebindMouseEvents(el) {\n    state(el).set('mouse-inside', undefined);\n    el.removeEventListener('mouseenter', onMouseEnter);\n    el.removeEventListener('mouseleave', onMouseLeave);\n    el.removeEventListener('blur', onBlur);\n\n    if (el.respondsTo === 'hover') {\n        state(el).set('mouse-inside', false);\n        el.addEventListener('mouseenter', onMouseEnter);\n        el.addEventListener('mouseleave', onMouseLeave);\n        el.addEventListener('blur', onBlur);\n    }\n}\n\nfunction namespaceEvent(eventName, elId) {\n    return `${eventName}.nested-layer-${elId}`;\n}\n\nfunction setupNestedLayerHandlers(el) {\n    let $el = $(el);\n    const elId = el.id;\n    const noNestedTriggers = (e) => {\n        return $el.find(getTrigger(e.target)).length < 1;\n    };\n    // Temporary timeout variable to resolve AUI-5025 issue\n    // as described in further detail below.\n    const selectCloseTimeout = 150;\n\n    $(document)\n        .on(namespaceEvent('aui-layer-show', elId), (e) => {\n            if (noNestedTriggers(e)) {\n                return;\n            }\n            $el.attr('persistent', '');\n        })\n        .on(namespaceEvent('aui-layer-hide', elId), (e) => {\n            if (noNestedTriggers(e)) {\n                return;\n            }\n            $el.removeAttr('persistent');\n        })\n        .on(namespaceEvent('select2-opening', elId), () => {\n            $el.attr('persistent', '');\n        })\n        // Relates to solving AUI-5025\n        // Temporary solution to race condition with select2,\n        // where this runs before select2's dropdown is closed.\n        .on(namespaceEvent('select2-close', elId), () => {\n            setTimeout(() => {\n                $el.removeAttr('persistent');\n            }, selectCloseTimeout);\n        });\n}\n\nfunction teardownNestedLayerHandlers(elId) {\n    $(document)\n        .off(namespaceEvent('aui-layer-hide', elId))\n        .off(namespaceEvent('aui-layer-show', elId))\n        .off(namespaceEvent('select2-opening', elId))\n        .off(namespaceEvent('select2-close', elId));\n}\n\n/**\n * @param element the inline dialog to show\n * @returns {boolean} true if the show was successful, false if it was prevented.\n */\nfunction maybeShow(element) {\n    layer(element).show();\n    return layer(element).isVisible() === true;\n}\n\n/**\n * @param element the inline dialog to hide\n * @returns {boolean} true if the hide was successful, false if it was prevented.\n */\nfunction maybeHide(element) {\n    layer(element).hide();\n    return layer(element).isVisible() === false;\n}\n\nfunction shouldFocus(element) {\n    return element.respondsTo !== 'hover';\n}\n\nfunction isPopupMenu(element) {\n    return element.getAttribute('role') !== 'dialog';\n}\n\n/**\n * Abstracted as skate fires custom attributes handlers before the component creation if they are pre-populated.\n *\n * @param element the inline dialog to initialise\n * @returns {undefined}\n */\n\nfunction maybeInitialise(element) {\n    // One to rule them all\n    if (element.__initialised) {\n        return;\n    }\n\n    layer(element);\n    $(element).on({\n        // fired only after the layer is shown\n        [`${EVENT_PREFIX}show`]: function (e) {\n            const el = this;\n            // This handler can be fired by nested layer/component.\n            // We need to be sure that the event was triggered by the inline dialog;\n            if (e.target !== el) {\n                // otherwise skip.\n                return;\n            }\n\n            setupNestedLayerHandlers(el);\n            doIfTrigger(el, function (trigger) {\n                if (shouldFocus(el)) {\n                    // Focus manager will focus the popup and link popup to the trigger.\n                    getFocusManager().enter($(el), $(trigger));\n                }\n\n                enableAlignment(el, trigger);\n\n                if (isPopupMenu(el)) {\n                    trigger.setAttribute('aria-expanded', 'true');\n                }\n            });\n        },\n        // fired only after the layer is hidden\n        [`${EVENT_PREFIX}hide`]: function (e) {\n            const el = this;\n            // This handler can be fired by nested layer/component.\n            // We need to be sure that the event was triggered by the inline dialog;\n            if (e.target !== el) {\n                // otherwise skip.\n                return;\n            }\n\n            teardownNestedLayerHandlers(el.id);\n            // in case the element has been removed from DOM already\n            // disablingAlignment may fail if trigger is an anchor due to Popper's logic\n            // wrongly recognising it as ShadowRoot\n            if (el.ownerDocument.body.contains(el)) {\n                disableAlignment(el);\n            } else {\n                destroyAlignment(el);\n            }\n            doIfTrigger(el, function (trigger) {\n                if (shouldFocus(el)) {\n                    // Focus manager will focus the trigger that is linked with the popup element.\n                    getFocusManager().exit($(el));\n                }\n                if (isPopupMenu(el)) {\n                    trigger.setAttribute('aria-expanded', 'false');\n                }\n            });\n            setTrigger(el, null);\n        },\n    });\n\n    element.__initialised = true;\n}\n\nconst RESPONDS_TO_ATTRIBUTE_ENUM = {\n    attribute: 'responds-to',\n    values: ['toggle', 'hover'],\n    missingDefault: 'toggle',\n    invalidDefault: 'toggle',\n};\n\nconst InlineDialogEl = skate('aui-inline-dialog', {\n    prototype: {\n        /**\n         * Returns whether the inline dialog is open.\n         */\n        get open() {\n            return layer(this).isVisible();\n        },\n\n        /**\n         * Opens or closes the inline dialog, returning whether the dialog is\n         * open or closed as a result (since event handlers can prevent either\n         * action).\n         *\n         * You should check the value of open after setting this\n         * value since the before show/hide events may have prevented it.\n         */\n        set open(value) {\n            // a flag to help avoid things getting called a second time via the attribute mutation handler\n            this.__propUpdate = true;\n            if (value) {\n                maybeShow(this);\n            } else {\n                maybeHide(this);\n            }\n        },\n\n        get persistent() {\n            return this.hasAttribute('persistent');\n        },\n\n        set persistent(value) {\n            attributes.setBooleanAttribute(this, 'persistent', value);\n        },\n\n        get respondsTo() {\n            var attr = RESPONDS_TO_ATTRIBUTE_ENUM.attribute;\n            return attributes.computeEnumValue(RESPONDS_TO_ATTRIBUTE_ENUM, this.getAttribute(attr));\n        },\n\n        set respondsTo(value) {\n            const oldComputedValue = this.respondsTo;\n            attributes.setEnumAttribute(this, RESPONDS_TO_ATTRIBUTE_ENUM, value);\n            if (oldComputedValue !== this.respondsTo) {\n                rebindMouseEvents(this);\n            }\n        },\n\n        /**\n         * Handles the receiving of a message from another component.\n         *\n         * @param {Object} msg The message to act on.\n         *\n         * @returns {HTMLElement}\n         */\n        message: function (msg) {\n            handleMessage(this, msg);\n            return this;\n        },\n    },\n    attributes: {\n        'open': function (element, change) {\n            maybeInitialise(element);\n\n            if (element.__propUpdate) {\n                // prevent property updates cascading in to sync or async attribute updates\n                delete element.__propUpdate;\n                return;\n            }\n            if (change.type === 'created') {\n                const success = maybeShow(element);\n                if (!success) {\n                    setBooleanAttribute(element, 'open', false);\n                }\n            }\n            if (change.type === 'removed') {\n                const success = maybeHide(element);\n                if (!success) {\n                    setBooleanAttribute(element, 'open', true);\n                }\n            }\n        },\n        'responds-to': function (element, change) {\n            const oldComputedValue = attributes.computeEnumValue(\n                RESPONDS_TO_ATTRIBUTE_ENUM,\n                change.oldValue\n            );\n            const newComputedValue = attributes.computeEnumValue(\n                RESPONDS_TO_ATTRIBUTE_ENUM,\n                change.newValue\n            );\n            if (oldComputedValue !== newComputedValue) {\n                rebindMouseEvents(element);\n            }\n        },\n    },\n\n    created: maybeInitialise,\n\n    attached: function (element) {\n        enforce(element).attributeExists('id');\n        element.setAttribute('tabindex', 0);\n        if (isPopupMenu(element)) {\n            element.setAttribute('role', 'group');\n            doIfTrigger(element, function (trigger) {\n                trigger.setAttribute('aria-expanded', element.open);\n            });\n            forEachTrigger(element, function (trigger) {\n                trigger.setAttribute('aria-haspopup', 'true');\n            });\n        }\n        rebindMouseEvents(element);\n    },\n\n    detached: function (element) {\n        ifGone(element).then(() => {\n            destroyAlignment(element);\n\n            if (isPopupMenu(element)) {\n                forEachTrigger(element, function (trigger) {\n                    trigger.removeAttribute('aria-haspopup');\n                    trigger.removeAttribute('aria-expanded');\n                });\n            }\n        });\n    },\n\n    template: function (element) {\n        $('<div class=\"aui-inline-dialog-contents\"></div>')\n            .append(element.childNodes)\n            .appendTo(element);\n    },\n});\n\namdify('aui/inline-dialog2', InlineDialogEl);\nglobalize('InlineDialog2', InlineDialogEl);\nexport default InlineDialogEl;\n","import { I18n } from './i18n';\nimport $ from './jquery';\nimport skate from './internal/skate';\nimport globalize from './internal/globalize';\nimport widget from './internal/widget';\n\n/**\n * Navigation (\".aui-nav\" elements).\n *\n * @param {(string|HtmlElement|jQuery)} selector - An expression\n *     representing a single .aui-nav element; you may also pass an expression\n *     for a descendent element, in which case the closest containing\n *     .aui-nav element is used.\n * @constructor\n */\nfunction Navigation(selector) {\n    this.$el = $(selector).closest('.aui-nav');\n\n    // If there are multiple objects, initialise them separately\n    if (this.$el.length > 1) {\n        return this.$el.map(function (idx, elm) {\n            return new Navigation(elm);\n        })[0];\n    }\n\n    // If already initialised, return existing object\n    if (this.$el.data('aui-navigation')) {\n        return this.$el.data('aui-navigation');\n    }\n\n    this.$el.data('aui-navigation', this);\n\n    this.$treeParent = this.$el.parent('li[aria-expanded]');\n    this.$subtreeToggleIcon = this.$treeParent\n        .children('.aui-nav-subtree-toggle')\n        .children('span.aui-icon');\n\n    // Add child-selected class to relevant attributes\n    this.$el.children('li:has(.aui-nav-selected)').addClass('aui-nav-child-selected');\n\n    // Auto-expand if child is selected\n    var $selected = this.$el.children('.aui-nav-selected');\n    $selected\n        .parents('.aui-nav > [aria-expanded=false]')\n        .add($selected.filter('[aria-expanded=false]'))\n        .each(function () {\n            var nav = navigationWidget($(this).children('.aui-nav'));\n            nav.expand();\n        });\n\n    // Toggle expand on click\n    var $togglers = this.$el.find('> li[aria-expanded] > .aui-nav-subtree-toggle');\n    $togglers.on('click', function () {\n        var nav = navigationWidget($(this).siblings('.aui-nav'));\n        nav.toggle();\n    });\n\n    // Make sure subtree togglers have proper a11y label\n    $togglers.each(function () {\n        var $parent = $(this).parent('li[aria-expanded]');\n        var $icon = $(this).find('.aui-icon');\n        var isListItemExpanded = $parent.attr('aria-expanded') === 'true';\n\n        $icon.text(\n            isListItemExpanded\n                ? I18n.getText('aui.words.collapse')\n                : I18n.getText('aui.words.expand')\n        );\n    });\n\n    return this;\n}\n\nNavigation.prototype.isNested = function () {\n    return this.$treeParent.length === 1;\n};\n\nNavigation.prototype.isCollapsed = function () {\n    return this.$treeParent.attr('aria-expanded') === 'false';\n};\n\nNavigation.prototype.expand = function () {\n    this.$treeParent.attr('aria-expanded', 'true');\n    this.$subtreeToggleIcon\n        .removeClass('aui-iconfont-collapsed')\n        .addClass('aui-iconfont-expanded')\n        .text(I18n.getText('aui.words.collapse'));\n    return this;\n};\n\nNavigation.prototype.collapse = function () {\n    this.$treeParent.attr('aria-expanded', 'false');\n    this.$subtreeToggleIcon\n        .removeClass('aui-iconfont-expanded')\n        .addClass('aui-iconfont-collapsed')\n        .text(I18n.getText('aui.words.expand'));\n    return this;\n};\n\nNavigation.prototype.toggle = function () {\n    if (this.isCollapsed()) {\n        this.expand();\n    } else {\n        this.collapse();\n    }\n    return this;\n};\n\nconst navigationWidget = widget('navigation', Navigation);\n\n// Initialise nav elements\nconst NavigationEl = skate('aui-nav', {\n    type: skate.type.CLASSNAME,\n    attached: function (element) {\n        new Navigation(element);\n    },\n    detached: function (element) {\n        $(element).removeData();\n    },\n});\n\nglobalize('navigation', navigationWidget);\n\nexport default navigationWidget;\nexport { NavigationEl };\n","import $ from './jquery';\nimport { defaults, isNumber, isFinite, isNaN } from 'underscore';\nimport skate from './internal/skate';\nimport { recomputeStyle } from './internal/animation';\nimport * as deprecate from './internal/deprecation';\nimport globalize from './internal/globalize';\n\nconst afterTransitionEvent = 'aui-progress-indicator-after-update';\nconst beforeTransitionEvent = 'aui-progress-indicator-before-update';\nconst transitionEnd = 'transitionend webkitTransitionEnd';\n\nfunction updateProgress($progressBar, $progressBarContainer, progressValue) {\n    recomputeStyle($progressBar);\n    $progressBar.css('width', progressValue * 100 + '%');\n    $progressBarContainer.attr('data-value', progressValue);\n}\n\nfunction updateProgressElement(element, value) {\n    if (typeof element === 'string') {\n        let el = document.getElementById(element);\n        if (el) {\n            element = el;\n        }\n    }\n    var $progressBarContainer = $(element).first();\n    var $progressBar = $progressBarContainer.children('.aui-progress-indicator-value');\n    var valueAttribute = $progressBarContainer.attr('data-value');\n    var isIndeterminate = !valueAttribute;\n    var currentProgress = parseFloat(valueAttribute) || 0;\n    var isProgressNotChanged = valueAttribute && currentProgress === value;\n\n    // AUI-4771 - check for mis-configured legacy progress bar HTML.\n    if (isProgressNotChanged) {\n        const currentDemonstratedValue = parseFloat($progressBar.get(0).style.width) || 0;\n        isProgressNotChanged = currentProgress === currentDemonstratedValue * 100;\n    }\n\n    if (isProgressNotChanged) {\n        return;\n    }\n\n    //if the progress bar is indeterminate switch it.\n    if (isIndeterminate) {\n        $progressBar.css('width', 0);\n    }\n\n    transitionProgress($progressBar, $progressBarContainer, { currentProgress, value });\n\n    return $progressBarContainer;\n}\n\nfunction transitionProgress(progressBar, progressBarContainer, { currentProgress, value }) {\n    const $progressBar = $(progressBar);\n    const $progressBarContainer = $(progressBarContainer);\n\n    if (typeof value === 'number' && value <= 1 && value >= 0) {\n        $progressBarContainer.trigger(beforeTransitionEvent, [currentProgress, value]);\n\n        //trigger the event after transition end if supported, otherwise just trigger it\n        $progressBar.one(transitionEnd, function () {\n            $progressBarContainer.trigger(afterTransitionEvent, [currentProgress, value]);\n        });\n        updateProgress($progressBar, $progressBarContainer, value);\n    }\n}\n\nfunction setIndeterminateOnProgressElement(element) {\n    var $progressBarContainer = $(element).first();\n    var $progressBar = $progressBarContainer.children('.aui-progress-indicator-value');\n\n    $progressBarContainer.removeAttr('data-value');\n    recomputeStyle($progressBarContainer);\n    $progressBar.css('width', '');\n}\n\nconst DEFAULTS = {\n    indeterminate: false,\n    max: 1,\n    val: 0,\n};\n\nfunction validNumeric(val) {\n    return isNumber(val) && isFinite(val) && !isNaN(val);\n}\n\nfunction parseNumeric(val, defaultVal = 1) {\n    const num = parseFloat(val);\n    return validNumeric(num) ? num : Number(defaultVal);\n}\n\nfunction parseDecimal(num, precision = 1) {\n    return Number(parseFloat(num).toFixed(precision));\n}\n\nfunction safeValue(val, max) {\n    return Math.max(0, Math.min(val, max));\n}\n\nfunction safeMax(max) {\n    return max > 0 ? max : DEFAULTS.max;\n}\n\n/**\n * @param data the state\n * @returns {{max: number, val: number, valAsFraction: number, valAsPercent: number}}\n */\nfunction calc(data) {\n    const { val, max } = data;\n    const parsedMax = safeMax(max);\n    const parsedVal = safeValue(val, parsedMax);\n    const valAsFraction = parseDecimal(parsedVal / parsedMax, 6);\n    const valAsPercent = parseDecimal(valAsFraction * 100, 2);\n    return { max: parsedMax, val: parsedVal, valAsFraction, valAsPercent };\n}\n\nfunction refresh(el) {\n    const { val, valAsFraction, max } = calc(el._data);\n    const bar = el.querySelector('.aui-progress-indicator');\n    const oldVal = bar.getAttribute('data-value');\n\n    if (el.indeterminate) {\n        bar.removeAttribute('aria-valuenow');\n        setIndeterminateOnProgressElement(bar);\n    } else {\n        bar.setAttribute('aria-valuenow', val);\n        bar.setAttribute('aria-valuemax', max);\n        transitionProgress(bar.querySelector('.aui-progress-indicator-value'), bar, {\n            currentProgress: oldVal,\n            value: valAsFraction,\n        });\n    }\n}\n\nfunction setValue(el, data) {\n    el._data.val = parseNumeric(data.newValue, data.oldValue || DEFAULTS.val);\n    refresh(el);\n}\n\nfunction setMax(el, data) {\n    el._data.max = parseNumeric(data.newValue, data.oldValue || DEFAULTS.max);\n    refresh(el);\n}\n\nconst ProgressBarEl = skate('aui-progressbar', {\n    template(el) {\n        // Ensure max is set before value upon element creation and before rendering.\n        // Why is this happening in 'template' and not 'created'? Because it gets called before 'created'!\n        el._data.max = parseNumeric(el.getAttribute('max'), DEFAULTS.max);\n        el._data.val = parseNumeric(el.getAttribute('value'), DEFAULTS.val);\n        el._data.indeterminate = el.hasAttribute('indeterminate');\n        const { val, max, valAsFraction, valAsPercent } = calc(el._data);\n\n        const legacyValue = el._data.indeterminate ? '' : `data-value=\"${valAsFraction}\"`;\n\n        el.innerHTML = `<div class=\"aui-progress-indicator\"\n         ${legacyValue}\n         role=\"progressbar\"\n         aria-valuemin=\"0\"\n         aria-valuenow=\"${val}\"\n         aria-valuemax=\"${max}\"\n         tabindex=\"0\"\n     >\n        <span class=\"aui-progress-indicator-value\" style=\"width: ${valAsPercent}%\"></span>\n    </div>`;\n    },\n\n    attached(el) {\n        refresh(el);\n    },\n\n    attributes: {\n        indeterminate: {\n            created: function (el) {\n                el.indeterminate = true;\n            },\n            removed: function (el) {\n                el.indeterminate = false;\n            },\n        },\n        value: {\n            value: DEFAULTS.val,\n            fallback: function (el, data) {\n                if (el._updating) {\n                    return false;\n                }\n                setValue(el, data);\n            },\n        },\n        max: {\n            value: DEFAULTS.max,\n            fallback: function (el, data) {\n                if (el._updating) {\n                    return false;\n                }\n                setMax(el, data);\n            },\n        },\n    },\n\n    prototype: {\n        get _data() {\n            return this.__data || (this._data = defaults({}, DEFAULTS));\n        },\n        set _data(d) {\n            return (this.__data = d);\n        },\n        get indeterminate() {\n            return this._data.indeterminate;\n        },\n        set indeterminate(val) {\n            this._data.indeterminate = !!val;\n            refresh(this);\n        },\n        get value() {\n            const { val } = calc(this._data);\n            return val;\n        },\n        set value(num) {\n            if (!validNumeric(num)) {\n                return false;\n            }\n            const data = { newValue: parseDecimal(num, 6) };\n            this._updating = true;\n            // Reflect whatever value is set in the attributes.\n            this.setAttribute('value', data.newValue);\n            this._updating = false;\n            setValue(this, data);\n        },\n        get max() {\n            const { max } = calc(this._data);\n            return max;\n        },\n        set max(num) {\n            if (!validNumeric(num)) {\n                return false;\n            }\n            const data = { newValue: parseDecimal(num, 6) };\n            this._updating = true;\n            // Reflect whatever value is set in the attributes.\n            this.setAttribute('max', data.newValue);\n            this._updating = false;\n            setMax(this, data);\n        },\n    },\n});\n\nconst progressBars = {\n    update: deprecate.fn(updateProgressElement, 'AJS.progressBars.update', {\n        sinceVersion: '7.7.0',\n        removeInVersion: '12.0.0',\n        extraInfo: 'Use the <aui-progressbar> web component instead',\n    }),\n    setIndeterminate: deprecate.fn(\n        setIndeterminateOnProgressElement,\n        'AJS.progressBars.setIndeterminate',\n        {\n            sinceVersion: '7.7.0',\n            removeInVersion: '12.0.0',\n            extraInfo: 'Use the <aui-progressbar> web component instead',\n        }\n    ),\n};\n\nglobalize('progressBars', progressBars);\n\nexport default progressBars;\nexport { ProgressBarEl };\n","import $ from './jquery';\nimport 'tablesorter/jquery.tablesorter';\nimport globalize from './internal/globalize';\n\nconst DEFAULT_SORT_OPTIONS = {\n    headerTemplate: '',\n    sortMultiSortKey: '',\n    headers: {},\n    debug: false,\n    tabIndex: false,\n};\n\n/**\n * @param {jQuery} $table - element to be sortable\n * @param {Object} [extraOptions] - tablesorter.js options\n */\nfunction sortTable($table, extraOptions) {\n    let options = Object.assign({}, DEFAULT_SORT_OPTIONS, extraOptions);\n    $table.find('th').each(function (index, header) {\n        const $header = $(header);\n        options.headers[index] = {};\n        if ($header.hasClass('aui-table-column-unsortable')) {\n            options.headers[index].sorter = false;\n        } else {\n            $header.attr('tabindex', '0');\n            $header.wrapInner(\"<span class='aui-table-header-content'/>\");\n            if ($header.hasClass('aui-table-column-issue-key')) {\n                options.headers[index].sorter = 'issue-key';\n            }\n        }\n    });\n    return $table.tablesorter(options);\n}\n\nlet tablessortable = {\n    setup: function () {\n        /*\n        This parser is used for issue keys in the format <PROJECT_KEY>-<ISSUE_NUMBER>, where <PROJECT_KEY> is a maximum\n        10 character string with characters(A-Z). Assumes that issue number is no larger than 999,999. e.g. not more\n        than a million issues.\n        This pads the issue key to allow for proper string sorting so that the project key is always 10 characters and the\n        issue number is always 6 digits. e.g. it appends the project key '.' until it is 10 characters long and prepends 0\n        so that the issue number is 6 digits long. e.g. CONF-102 == CONF......000102. This is to allow proper string sorting.\n        */\n        $.tablesorter.addParser({\n            id: 'issue-key',\n            is: function () {\n                return false;\n            },\n\n            format: function (s) {\n                const keyComponents = s.split('-');\n                const projectKey = keyComponents[0];\n                const issueNumber = keyComponents[1];\n\n                const PROJECT_KEY_TEMPLATE = '..........';\n                const ISSUE_NUMBER_TEMPLATE = '000000';\n                let stringRepresentation = (projectKey + PROJECT_KEY_TEMPLATE).slice(\n                    0,\n                    PROJECT_KEY_TEMPLATE.length\n                );\n                stringRepresentation += (ISSUE_NUMBER_TEMPLATE + issueNumber).slice(\n                    -ISSUE_NUMBER_TEMPLATE.length\n                );\n\n                return stringRepresentation;\n            },\n\n            type: 'text',\n        });\n\n        /*\n        Text parser that uses the data-sort-value attribute for sorting if it is set and data-sort-type is not set\n        or set to 'text'.\n        */\n        $.tablesorter.addParser({\n            id: 'textSortAttributeParser',\n            is: function (nodeValue, table, node) {\n                return (\n                    node.hasAttribute('data-sort-value') &&\n                    (!node.hasAttribute('data-sort-type') ||\n                        node.getAttribute('data-sort-type') === 'text')\n                );\n            },\n            format: function (nodeValue, table, node) {\n                return node.getAttribute('data-sort-value');\n            },\n            type: 'text',\n        });\n\n        /*\n        Numeric parser that uses the data-sort-value attribute for sorting if it is set and data-sort-type is set\n        to 'numeric'.\n        */\n        $.tablesorter.addParser({\n            id: 'numericSortAttributeParser',\n            is: function (nodeValue, table, node) {\n                return (\n                    node.getAttribute('data-sort-type') === 'numeric' &&\n                    node.hasAttribute('data-sort-value')\n                );\n            },\n            format: function (nodeValue, table, node) {\n                return node.getAttribute('data-sort-value');\n            },\n            type: 'numeric',\n        });\n\n        $('.aui-table-sortable').each(function () {\n            sortTable($(this));\n        });\n    },\n    /**\n     * @param {jQuery} $table - element to be sortable\n     * @param {Object} [options] - tablesorter.js options\n     */\n    setTableSortable: function ($table, options) {\n        return sortTable($table, options);\n    },\n};\n\n$(tablessortable.setup);\n\nglobalize('tablessortable', tablessortable);\n\nexport default tablessortable;\n","import $ from '../jquery';\nimport globalize from './globalize';\nimport uniqueId from '../unique-id';\n\n/**\n * Apply a unique ID to the element. Preserves ID if the element already has one.\n *\n * @param {Element} el Selector to find target element.\n * @param {string} [prefix] Optional. String to prepend to ID instead of default AUI prefix.\n *\n * @returns {undefined}\n */\nfunction addId(el, prefix = '') {\n    var element = $(el);\n    var addprefix = prefix || false;\n\n    element.each(function () {\n        var $el = $(this);\n\n        if (!$el.attr('id')) {\n            $el.attr('id', uniqueId(addprefix));\n        }\n    });\n}\n\nglobalize('_addID', addId);\n\nexport default addId;\n","import $ from './jquery';\nimport globalize from './internal/globalize';\n\n/**\n * Shortcut function to see if passed element is truncated/clipped, eg. with\n * text-overflow: ellipsis.\n *\n * @param {String | Element | jQuery} element The element to check.\n *\n * @returns {Boolean}\n */\nfunction isClipped(el) {\n    el = $(el);\n    return el.prop('scrollWidth') > el.prop('clientWidth');\n}\n\nglobalize('isClipped', isClipped);\n\nexport default isClipped;\n","import 'skatejs-template-html';\nimport * as logger from './internal/log';\nimport { debounce } from 'underscore';\nimport $ from './jquery';\nimport addId from './internal/add-id';\nimport globalize from './internal/globalize';\nimport isClipped from './is-clipped';\nimport skate from './internal/skate';\n\nvar template = window.skateTemplateHtml;\n\nvar STORAGE_PREFIX = '_internal-aui-tabs-';\nvar RESPONSIVE_OPT_IN_SELECTOR =\n    '.aui-tabs.horizontal-tabs[data-aui-responsive]:not([data-aui-responsive=\"false\"]), aui-tabs[responsive]:not([responsive=\"false\"])';\n\nfunction getPaneIdFromTabLink(el) {\n    let $el = $(el);\n    let maybeId = String($el.attr('href') || '').trim();\n    return maybeId.indexOf('#') === 0 ? maybeId.substr(1) : null;\n}\n\n/**\n * Locate what is assumed to be a tab panel within the DOM, based on the link element passed in\n * @param {HTMLElement} el a tab link element with an href attribute pointing to a tab panel\n * @returns {HTMLElement|null} the element with matching ID if it exists, otherwise null\n */\nfunction getPaneFromTabLink(el) {\n    let maybeId = getPaneIdFromTabLink(el);\n    return maybeId ? document.getElementById(maybeId) : null;\n}\n\nfunction enhanceTabLink(link) {\n    var $thisLink = $(link);\n    var targetPane = getPaneFromTabLink($thisLink);\n\n    if (!getPaneIdFromTabLink(link)) {\n        logger.error(\n            'A tab link must use an anchor link (e.g., <a href=\"#a-valid-id\"></a>) to work correctly.',\n            link\n        );\n    }\n\n    if (targetPane) {\n        addId($thisLink);\n        $thisLink.attr('role', 'tab');\n        $(targetPane).attr('aria-labelledby', $thisLink.attr('id'));\n\n        if ($thisLink.parent().hasClass('active-tab')) {\n            $thisLink.attr('aria-selected', 'true');\n        } else {\n            $thisLink.attr('aria-selected', 'false');\n        }\n    } else {\n        logger.warn(\n            \"A tab panel could not be found with the tab link's configured href.\" +\n                ' Check whether the tab link href is correct.',\n            link\n        );\n    }\n}\n\nvar ResponsiveAdapter = {\n    totalTabsWidth: function ($visibleTabs, $dropdown) {\n        var totalVisibleTabsWidth = this.totalVisibleTabWidth($visibleTabs);\n        var totalDropdownTabsWidth = 0;\n\n        $dropdown.find('li').each(function (index, tab) {\n            totalDropdownTabsWidth += parseInt(tab.getAttribute('data-aui-tab-width'));\n        });\n\n        return totalVisibleTabsWidth + totalDropdownTabsWidth;\n    },\n\n    totalVisibleTabWidth: function ($tabs) {\n        var totalWidth = 0;\n\n        $tabs.each(function (index, tab) {\n            totalWidth += $(tab).outerWidth();\n        });\n\n        return totalWidth;\n    },\n\n    removeResponsiveDropdown: function ($dropdown, $dropdownTriggerTab) {\n        $dropdown.remove();\n        $dropdownTriggerTab.remove();\n    },\n\n    createResponsiveDropdownTrigger: function ($tabsMenu, id) {\n        var triggerMarkup = `<li class=\"menu-item aui-tabs-responsive-trigger-item\">\n            <a\n                class=\"aui-dropdown2-trigger aui-tabs-responsive-trigger aui-dropdown2-trigger-arrowless\"\n                id=\"aui-tabs-responsive-trigger-${id}\"\n                aria-haspopup=\"true\"\n                aria-controls=\"aui-tabs-responsive-dropdown-${id}\"\n                href=\"#aui-tabs-responsive-dropdown-${id}\">...</a>\n            </li>`;\n        $tabsMenu.append(triggerMarkup);\n        return $tabsMenu.find('.aui-tabs-responsive-trigger-item');\n    },\n\n    createResponsiveDropdown: function ($tabsContainer, id) {\n        var dropdownMarkup =\n            '<div class=\"aui-dropdown2 aui-tabs-responsive-dropdown\" id=\"aui-tabs-responsive-dropdown-' +\n            id +\n            '\">' +\n            '<ul>' +\n            '</ul>' +\n            '</div>';\n        $tabsContainer.append(dropdownMarkup);\n        var $dropdown = $tabsContainer.find('#aui-tabs-responsive-dropdown-' + id);\n        return $dropdown;\n    },\n\n    findNewVisibleTabs: function (tabs, parentWidth, dropdownTriggerTabWidth) {\n        function hasMoreSpace(currentTotalTabWidth, dropdownTriggerTabWidth, parentWidth) {\n            return currentTotalTabWidth + dropdownTriggerTabWidth <= parentWidth;\n        }\n\n        var currentTotalTabWidth = 0;\n\n        for (\n            var i = 0;\n            hasMoreSpace(currentTotalTabWidth, dropdownTriggerTabWidth, parentWidth) &&\n            i < tabs.length;\n            i++\n        ) {\n            var $tab = $(tabs[i]);\n            var tabWidth = $tab.outerWidth(true);\n            currentTotalTabWidth += tabWidth;\n        }\n\n        // i should now be at the tab index after the last visible tab because of the loop so we minus 1 to get the new visible tabs\n        return tabs.slice(0, i - 1);\n    },\n\n    moveVisibleTabs: function (oldVisibleTabs, $tabsParent, $dropdownTriggerTab) {\n        var dropdownId = $dropdownTriggerTab.find('a').attr('aria-controls');\n        var $dropdown = $('#' + dropdownId);\n        var newVisibleTabs = this.findNewVisibleTabs(\n            oldVisibleTabs,\n            $tabsParent.outerWidth(),\n            $dropdownTriggerTab.parent().outerWidth(true)\n        );\n        var lastTabIndex = newVisibleTabs.length - 1;\n\n        for (var j = oldVisibleTabs.length - 1; j >= lastTabIndex; j--) {\n            var $tab = $(oldVisibleTabs[j]);\n            this.moveTabToResponsiveDropdown($tab, $dropdown, $dropdownTriggerTab);\n        }\n\n        return $(newVisibleTabs);\n    },\n\n    moveTabToResponsiveDropdown: function ($tab, $dropdown, $dropdownTriggerTab) {\n        var $tabLink = $tab.find('a');\n\n        $tab.attr('data-aui-tab-width', $tab.outerWidth(true));\n        $tabLink.addClass('aui-dropdown2-radio aui-tabs-responsive-item');\n\n        if ($tab.hasClass('active-tab')) {\n            $tabLink.addClass('aui-dropdown2-checked');\n            $dropdownTriggerTab.addClass('active-tab');\n        }\n\n        $dropdown.find('ul').prepend($tab);\n    },\n\n    moveInvisibleTabs: function (tabsInDropdown, remainingSpace, $dropdownTriggerTab) {\n        function hasMoreSpace(remainingSpace) {\n            return remainingSpace > 0;\n        }\n\n        for (var i = 0; hasMoreSpace(remainingSpace) && i < tabsInDropdown.length; i++) {\n            var $tab = $(tabsInDropdown[i]);\n            var tabInDropdownWidth = parseInt($tab.attr('data-aui-tab-width'), 10);\n            var shouldMoveTabOut = tabInDropdownWidth < remainingSpace;\n\n            if (shouldMoveTabOut) {\n                this.moveTabOutOfDropdown($tab, $dropdownTriggerTab);\n            }\n\n            remainingSpace -= tabInDropdownWidth;\n        }\n    },\n\n    moveTabOutOfDropdown: function ($tab, $dropdownTriggerTab) {\n        var isTabInDropdownActive = $tab.find('a').hasClass('aui-dropdown2-checked');\n\n        if (isTabInDropdownActive) {\n            $tab.addClass('active-tab');\n            $dropdownTriggerTab.removeClass('active-tab');\n        }\n\n        $tab.children('a').removeClass(\n            'aui-dropdown2-radio aui-tabs-responsive-item aui-dropdown2-checked'\n        );\n        $dropdownTriggerTab.before($tab);\n    },\n};\n\n// this function is run by jquery .each() where 'this' is the current tabs container\nfunction calculateResponsiveTabs(tabsContainer, index) {\n    var $tabsContainer = $(tabsContainer);\n    var $tabsMenu = $tabsContainer.find('.tabs-menu').first();\n    var $visibleTabs = $tabsMenu.find('li:not(.aui-tabs-responsive-trigger-item)');\n    var $dropdownTriggerTab = $tabsMenu.find('.aui-tabs-responsive-trigger').parent();\n    var $dropdownTrigger = $dropdownTriggerTab.find('a');\n    var dropdownId = $dropdownTrigger.attr('aria-controls');\n    var $dropdown = $(document.getElementById(dropdownId)).removeAttr('aria-checked');\n    var isResponsive = $dropdown.length > 0;\n    var totalTabsWidth = ResponsiveAdapter.totalTabsWidth($visibleTabs, $dropdown);\n    var needsResponsive = totalTabsWidth > $tabsContainer.outerWidth();\n\n    if (!isResponsive && needsResponsive) {\n        $dropdownTriggerTab = ResponsiveAdapter.createResponsiveDropdownTrigger($tabsMenu, index);\n        $dropdown = ResponsiveAdapter.createResponsiveDropdown($tabsContainer, index);\n    }\n\n    // reset id's in case tabs have changed DOM order\n    $dropdownTrigger.attr('aria-controls', 'aui-tabs-responsive-dropdown-' + index);\n    $dropdownTrigger.attr('id', 'aui-tabs-responsive-trigger-' + index);\n    $dropdownTrigger.attr('href', '#aui-tabs-responsive-trigger-' + index);\n    $dropdown.attr('id', 'aui-tabs-responsive-dropdown-' + index);\n\n    if (needsResponsive) {\n        var $newVisibleTabs = ResponsiveAdapter.moveVisibleTabs(\n            $visibleTabs.toArray(),\n            $tabsContainer,\n            $dropdownTriggerTab\n        );\n        var visibleTabWidth = ResponsiveAdapter.totalVisibleTabWidth($newVisibleTabs);\n        var remainingSpace =\n            $tabsContainer.outerWidth() - visibleTabWidth - $dropdownTriggerTab.outerWidth(true);\n        var hasSpace = remainingSpace > 0;\n\n        if (hasSpace) {\n            var $tabsInDropdown = $dropdown.find('li');\n            ResponsiveAdapter.moveInvisibleTabs(\n                $tabsInDropdown.toArray(),\n                remainingSpace,\n                $dropdownTriggerTab\n            );\n        }\n\n        if (!$tabsContainer.hasClass('aui-tabs-disabled')) {\n            $dropdown.on('click.aui-tabs', 'a', handleTabClick);\n        }\n\n        /* Workaround for bug in Edge where the dom is just not being re-rendered properly\n        It is only triggered for certain widths. Simply taking the element out of the DOM\n        and placing it back in causes the browser to re-render, hiding the issue.\n        added from AUI-4098 and to be revisited in AUI-4117*/\n        if ($tabsMenu.is(':visible')) {\n            $tabsMenu.hide().show();\n        }\n    }\n\n    if (isResponsive && !needsResponsive) {\n        $dropdown.find('li').each(function () {\n            ResponsiveAdapter.moveTabOutOfDropdown($(this), $dropdownTriggerTab);\n        });\n        ResponsiveAdapter.removeResponsiveDropdown($dropdown, $dropdownTriggerTab);\n    }\n}\n\nfunction switchToTab(tab) {\n    var $tab = $(tab);\n\n    // This probably isn't needed anymore. Remove once confirmed.\n    if ($tab.hasClass('aui-tabs-responsive-trigger')) {\n        return;\n    }\n\n    var pane = getPaneFromTabLink($tab);\n    if (!pane) {\n        logger.error(\n            'Cannot switch to tab panel because it does not exist.' +\n                ' Check whether the tab link href is correct.',\n            tab\n        );\n        return;\n    }\n\n    var $pane = $(pane);\n\n    $pane.addClass('active-pane').siblings('.tabs-pane').removeClass('active-pane');\n\n    var $dropdownTriggerTab = $tab.parents('.aui-tabs').find('.aui-tabs-responsive-trigger-item a');\n    var dropdownId = $dropdownTriggerTab.attr('aria-controls');\n    var $dropdown = $(document.getElementById(dropdownId));\n\n    $dropdown.find('li a').removeAttr('aria-checked').removeClass('checked aui-dropdown2-checked');\n    $dropdown.find('li').removeClass('active-tab');\n\n    $tab.parent('li.menu-item')\n        .addClass('active-tab')\n        .siblings('.menu-item')\n        .removeClass('active-tab');\n\n    if ($tab.hasClass('aui-tabs-responsive-item')) {\n        var $visibleTabs = $pane\n            .parent('.aui-tabs')\n            .find('li.menu-item:not(.aui-tabs-responsive-trigger-item)');\n\n        $visibleTabs.removeClass('active-tab');\n        $visibleTabs.find('a').removeClass('checked').removeAttr('aria-checked');\n    }\n\n    if ($tab.hasClass('aui-tabs-responsive-item')) {\n        $pane\n            .parent('.aui-tabs')\n            .find('li.menu-item.aui-tabs-responsive-trigger-item')\n            .addClass('active-tab');\n    }\n\n    $tab.closest('.tabs-menu').find('a').attr('aria-selected', 'false');\n    $tab.attr('aria-selected', 'true');\n    $tab.trigger('tabSelect', {\n        tab: $tab,\n        pane: $pane,\n    });\n}\n\nfunction isPersistentTabGroup($tabGroup) {\n    // Tab group persistent attribute exists and is not false\n    return (\n        $tabGroup.attr('data-aui-persist') !== undefined &&\n        $tabGroup.attr('data-aui-persist') !== 'false'\n    );\n}\n\nfunction createPersistentKey($tabGroup) {\n    var tabGroupId = $tabGroup.attr('id');\n    var value = $tabGroup.attr('data-aui-persist');\n\n    return (\n        STORAGE_PREFIX +\n        (tabGroupId ? tabGroupId : '') +\n        (value && value !== 'true' ? '-' + value : '')\n    );\n}\n\n/* eslint max-depth: 1 */\nfunction updateTabsFromLocalStorage($tabGroups) {\n    for (var i = 0, ii = $tabGroups.length; i < ii; i++) {\n        var $tabGroup = $tabGroups.eq(i);\n        var tabs = $tabGroups.get(i);\n\n        if (isPersistentTabGroup($tabGroup) && window.localStorage) {\n            var tabGroupId = $tabGroup.attr('id');\n\n            if (tabGroupId) {\n                var persistentTabId = window.localStorage.getItem(createPersistentKey($tabGroup));\n\n                if (persistentTabId) {\n                    var anchor = tabs.querySelector(`a[href$=\"${persistentTabId}\"]`);\n\n                    // eslint-disable-next-line max-depth\n                    if (anchor) {\n                        switchToTab(anchor);\n                    }\n                }\n            } else {\n                logger.warn(\n                    'A tab group must specify an id attribute if it specifies data-aui-persist.'\n                );\n            }\n        }\n    }\n}\n\nfunction updateLocalStorageEntry($tab) {\n    var $tabGroup = $tab.closest('.aui-tabs');\n    var tabGroupId = $tabGroup.attr('id');\n\n    if (tabGroupId) {\n        var tabId = getPaneIdFromTabLink($tab);\n\n        if (tabId) {\n            window.localStorage.setItem(createPersistentKey($tabGroup), '#' + tabId);\n        }\n    } else {\n        logger.warn('A tab group must specify an id attribute if it specifies data-aui-persist.');\n    }\n}\n\nfunction handleTabClick(e) {\n    tabs.change($(e.target).closest('a'));\n\n    if (e) {\n        e.preventDefault();\n    }\n}\n\nfunction responsiveResizeHandler(tabs) {\n    tabs.forEach(function (tab, index) {\n        calculateResponsiveTabs(tab, index);\n    });\n}\n\n// Initialisation\n// --------------\n\nfunction getTabs() {\n    return $('.aui-tabs:not(.aui-tabs-disabled)');\n}\n\nfunction getResponsiveTabs() {\n    return $(RESPONSIVE_OPT_IN_SELECTOR).toArray();\n}\n\nfunction initWindow() {\n    const handler = debounce(responsiveResizeHandler, 200);\n    handler(getResponsiveTabs());\n    $(window).on('resize.aui-tabs', () => handler(getResponsiveTabs()));\n}\n\nfunction initTab(tab) {\n    var $tab = $(tab);\n\n    tab.setAttribute('role', 'application');\n\n    if (!$tab.data('aui-tab-events-bound')) {\n        var $tabMenu = $tab.children('ul.tabs-menu');\n\n        // ARIA setup\n        $tabMenu.attr('role', 'tablist');\n\n        // ignore the LIs so tab count is announced correctly\n        $tabMenu.children('li').attr('role', 'presentation');\n        $tabMenu.find('> .menu-item a').each(function () {\n            enhanceTabLink(this);\n        });\n\n        // Set up click event for tabs\n        $tabMenu.on('click.aui-tabs', 'a', handleTabClick);\n        $tab.data('aui-tab-events-bound', true);\n\n        initPanes(tab);\n    }\n}\n\nfunction initTabs() {\n    var tabs = getTabs();\n\n    tabs.each(function () {\n        initTab(this);\n    });\n\n    updateTabsFromLocalStorage(tabs);\n}\n\nfunction initPane(pane) {\n    pane.setAttribute('role', 'tabpanel');\n}\n\nfunction initPanes(tab) {\n    [].slice.call(tab.querySelectorAll('.tabs-pane')).forEach(initPane);\n}\n\nfunction initVerticalTabs() {\n    // Vertical tab truncation setup (adds title if clipped)\n    $('.aui-tabs.vertical-tabs')\n        .find('a')\n        .each(function () {\n            var thisTab = $(this);\n\n            // don't override existing titles\n            if (!thisTab.attr('title')) {\n                // if text has been truncated, add title\n                if (isClipped(thisTab)) {\n                    thisTab.attr('title', thisTab.text());\n                }\n            }\n        });\n}\n\nvar tabs = {\n    setup: function () {\n        initWindow();\n        initTabs();\n        initVerticalTabs();\n    },\n\n    change: function (a) {\n        var collection = a instanceof HTMLElement || a instanceof $ ? a : document.querySelector(a);\n        var $a = $(collection).first();\n        var $tabGroup = $a.closest('.aui-tabs');\n\n        switchToTab($a);\n\n        if (isPersistentTabGroup($tabGroup) && window.localStorage) {\n            updateLocalStorageEntry($a);\n        }\n    },\n};\n\n$(tabs.setup);\n\n// Web Components\n// --------------\n\nfunction findComponent(element) {\n    return $(element).closest('aui-tabs').get(0);\n}\n\nfunction findPanes(tabs) {\n    return tabs.querySelectorAll('aui-tabs-pane');\n}\n\nfunction findTabs(tabs) {\n    return tabs.querySelectorAll('li[is=aui-tabs-tab]');\n}\n\nconst TabContainerEl = skate('aui-tabs', {\n    created: function (element) {\n        $(element).addClass('aui-tabs horizontal-tabs');\n\n        // We must initialise here so that the old code still works since\n        // the lifecycle of the sub-components setup the markup so that it\n        // can be processed by the old logic.\n        skate.init(element);\n\n        // Use the old logic to initialise the tabs.\n        initTab(element);\n    },\n    template: template(\n        '<ul class=\"tabs-menu\">',\n        '<content select=\"li[is=aui-tabs-tab]\"></content>',\n        '</ul>',\n        '<content select=\"aui-tabs-pane\"></content>'\n    ),\n    prototype: {\n        select: function (element) {\n            var index = $(findPanes(this)).index(element);\n\n            if (index > -1) {\n                tabs.change(findTabs(this)[index].children[0]);\n            }\n\n            return this;\n        },\n    },\n});\n\nconst TabItemEl = skate('aui-tabs-tab', {\n    extends: 'li',\n    created: function (element) {\n        $(element).addClass('menu-item');\n    },\n    template: template('<a href=\"#\">', '<strong>', '<content></content>', '</strong>', '</a>'),\n});\n\nconst TabPaneEl = skate('aui-tabs-pane', {\n    attached: function (element) {\n        var $component = $(findComponent(element));\n        var $element = $(element);\n        var index = $component.find('aui-tabs-pane').index($element);\n        var tab = new TabItemEl();\n        var $tab = $(tab);\n\n        $element.addClass('tabs-pane');\n        tab.firstChild.setAttribute('href', '#' + element.id);\n        template.wrap(tab).textContent = $element.attr('title');\n\n        if (index === 0) {\n            $element.addClass('active-pane');\n        }\n\n        if ($element.hasClass('active-pane')) {\n            $tab.addClass('active-tab');\n        }\n\n        $element.siblings('ul').append(tab);\n    },\n    template: template('<content></content>'),\n});\n\nglobalize('tabs', tabs);\n\nexport default tabs;\nexport { TabContainerEl, TabPaneEl, TabItemEl };\n","import $ from '../jquery';\nimport * as logger from '../internal/log';\nimport amdify from '../internal/amdify';\n\nvar ATTRIBUTE_RESERVED_ARGUMENTS = ['displayfield', 'watchfield', 'when', 'novalidate', 'state'];\nvar validators = [];\n\nfunction getReservedArgument(validatorArguments) {\n    var reservedArgument = false;\n\n    validatorArguments.some(function (arg) {\n        var isReserved = $.inArray(arg, ATTRIBUTE_RESERVED_ARGUMENTS) !== -1;\n\n        if (isReserved) {\n            reservedArgument = arg;\n        }\n\n        return isReserved;\n    });\n\n    return reservedArgument;\n}\n\n/**\n * Register a validator that can be used to validate fields. The main entry point for validator plugins.\n * @param trigger - when to run the validator. Can be an array of arguments, or a selector\n * @param validatorFunction - the function that will be called on the field to determine validation. Receives\n *      field - the field that is being validated\n *      args - the arguments that have been specified in HTML markup.\n */\nfunction registerValidator(trigger, validatorFunction) {\n    var triggerSelector;\n\n    if (typeof trigger === 'string') {\n        triggerSelector = trigger;\n    } else {\n        var reservedArgument = getReservedArgument(trigger);\n\n        if (reservedArgument) {\n            logger.warn(\n                'Validators cannot be registered with the argument \"' +\n                    reservedArgument +\n                    '\", as it is a reserved argument.'\n            );\n            return false;\n        }\n\n        triggerSelector = '[data-aui-validation-' + trigger.join('],[data-aui-validation-') + ']';\n    }\n\n    var validator = {\n        validatorFunction: validatorFunction,\n        validatorTrigger: triggerSelector,\n    };\n\n    validators.push(validator);\n\n    return validator;\n}\n\nvar validatorRegister = {\n    register: registerValidator,\n    validators: function () {\n        return validators;\n    },\n};\n\namdify('aui/form-validation/validator-register', validatorRegister);\n\nexport default validatorRegister;\n","import $ from '../jquery';\nimport amdify from '../internal/amdify';\nimport format from '../format'; // eslint-disable-line no-unused-vars\nimport { I18n } from '../i18n';\nimport validatorRegister from './validator-register';\n\n//Input length\nfunction minMaxLength(field) {\n    var fieldValueLength = field.el.value.length;\n    let fieldIsEmpty = fieldValueLength === 0;\n    var minlength = parseInt(field.args('minlength'), 10);\n    var maxlength = parseInt(field.args('maxlength'), 10);\n\n    if (\n        minlength &&\n        maxlength &&\n        minlength === maxlength &&\n        !fieldIsEmpty &&\n        fieldValueLength !== minlength\n    ) {\n        const exactlengthMessage = makeMessage('exactlength', field.args, [minlength]);\n        field.invalidate(exactlengthMessage);\n    } else if (minlength && fieldValueLength < minlength && !fieldIsEmpty) {\n        const minlengthMessage = makeMessage('minlength', field.args);\n        field.invalidate(minlengthMessage);\n    } else if (maxlength && fieldValueLength > maxlength) {\n        const maxlengthMessage = makeMessage('maxlength', field.args);\n        field.invalidate(maxlengthMessage);\n    } else {\n        field.validate();\n    }\n}\nvalidatorRegister.register(['maxlength', 'minlength'], minMaxLength); //AUI-prefixed attribute is deprecated as of 5.9.0\nvalidatorRegister.register('[maxlength],[minlength]', minMaxLength);\n\n//Field matching\nvalidatorRegister.register(['matchingfield'], function (field) {\n    var thisFieldValue = field.el.value;\n    var matchingField = document.getElementById(field.args('matchingfield'));\n    var matchingFieldValue = matchingField.value;\n\n    var matchingFieldMessage = makeMessage('matchingfield', field.args, [\n        thisFieldValue,\n        matchingFieldValue,\n    ]);\n\n    var shouldHidePasswords = isPasswordField(field.el) || isPasswordField(matchingField);\n    if (shouldHidePasswords) {\n        matchingFieldMessage = makeMessage('matchingfield-novalue', field.args);\n    }\n\n    if (!thisFieldValue || !matchingFieldValue) {\n        field.validate();\n    } else if (matchingFieldValue !== thisFieldValue) {\n        field.invalidate(matchingFieldMessage);\n    } else {\n        field.validate();\n    }\n});\n\nfunction isPasswordField(field) {\n    return field.getAttribute('type') === 'password';\n}\n\n//Banned words\nvalidatorRegister.register(['doesnotcontain'], function (field) {\n    var doesNotContainMessage = makeMessage('doesnotcontain', field.args);\n\n    if (field.el.value.indexOf(field.args('doesnotcontain')) === -1) {\n        field.validate();\n    } else {\n        field.invalidate(doesNotContainMessage);\n    }\n});\n\n//Matches regex\n\nfunction matchesRegex(val, regex) {\n    var matches = val.match(regex);\n    if (!matches) {\n        return false;\n    }\n    var isExactMatch = val === matches[0];\n    return isExactMatch;\n}\n\nfunction pattern(field) {\n    var patternMessage = makeMessage('pattern', field.args);\n\n    if (matchesRegex(field.el.value, new RegExp(field.args('pattern')))) {\n        field.validate();\n    } else {\n        field.invalidate(patternMessage);\n    }\n}\n\nvalidatorRegister.register(['pattern'], pattern); //AUI-prefixed attribute is deprecated as of 5.9.0\nvalidatorRegister.register('[pattern]', pattern);\n\n//Native Required\nfunction required(field) {\n    var requiredMessage = makeMessage('required', field.args);\n    if (field.el.value) {\n        field.validate();\n    } else {\n        field.invalidate(requiredMessage);\n    }\n}\nvalidatorRegister.register(['required'], required); //AUI-prefixed attribute is deprecated as of 5.9.0\nvalidatorRegister.register('[required]', required);\n\n//Field value range (between min and max)\n\nfunction minOrMax(field) {\n    var validNumberMessage = makeMessage('validnumber', field.args);\n\n    var fieldValue = parseInt(field.el.value, 10);\n    if (isNaN(fieldValue)) {\n        field.invalidate(validNumberMessage);\n        return;\n    }\n\n    var minValue = field.args('min');\n    var maxValue = field.args('max');\n\n    if (minValue && fieldValue < parseInt(minValue, 10)) {\n        field.invalidate(makeMessage('min', field.args));\n    } else if (maxValue && fieldValue > parseInt(maxValue, 10)) {\n        field.invalidate(makeMessage('max', field.args));\n    } else {\n        field.validate();\n    }\n}\nvalidatorRegister.register(['min', 'max'], minOrMax); //AUI-prefixed attribute is deprecated as of 5.9.0\nvalidatorRegister.register('[min],[max]', minOrMax);\n\n//Date format\nvalidatorRegister.register(['dateformat'], function (field) {\n    var dateFormatSymbolic = field.args('dateformat');\n    var dateFormatMessage = makeMessage('dateformat', field.args);\n\n    var symbolRegexMap = {\n        Y: '[0-9]{4}',\n        y: '[0-9]{2}',\n        m: '(0?[1-9]|10|11|12)',\n        M: '[Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec]',\n        D: '[Mon|Tue|Wed|Thu|Fri|Sat|Sun]',\n        d: '([0-2]?[1-9]|10|20|30|31)',\n    };\n\n    var dateFormatSymbolArray = dateFormatSymbolic.split('');\n    var dateFormatRegexString = '';\n\n    dateFormatSymbolArray.forEach(function (dateSymbol) {\n        var isRecognisedSymbol = symbolRegexMap.hasOwnProperty(dateSymbol);\n        if (isRecognisedSymbol) {\n            dateFormatRegexString += symbolRegexMap[dateSymbol];\n        } else {\n            dateFormatRegexString += dateSymbol;\n        }\n    });\n\n    var dateFormatRegex = new RegExp(dateFormatRegexString + '$', 'i');\n    var isValidDate = matchesRegex(field.el.value, dateFormatRegex);\n\n    if (isValidDate) {\n        field.validate();\n    } else {\n        field.invalidate(dateFormatMessage);\n    }\n});\n\n//Checkbox count\nvalidatorRegister.register(['minchecked', 'maxchecked'], function (field) {\n    var amountChecked = $(field.el).find(':checked').length;\n    var aboveMin = !field.args('minchecked') || amountChecked >= field.args('minchecked');\n    var belowMax = !field.args('maxchecked') || amountChecked <= field.args('maxchecked');\n\n    var belowMinMessage = makeMessage('minchecked', field.args);\n    var aboveMaxMessage = makeMessage('maxchecked', field.args);\n\n    if (aboveMin && belowMax) {\n        field.validate();\n    } else if (!aboveMin) {\n        field.invalidate(belowMinMessage);\n    } else if (!belowMax) {\n        field.invalidate(aboveMaxMessage);\n    }\n});\n\n/*\n     Retrieves a message for a plugin validator through the data attributes or the default (which is in the i18n file)\n */\nfunction makeMessage(key, accessorFunction, customTokens) {\n    var inFlatpackMode = I18n.keys !== undefined;\n    var defaultMessage;\n    if (inFlatpackMode) {\n        defaultMessage = I18n.keys['aui.validation.message.' + key];\n    } else {\n        defaultMessage = pluginI18nMessages[key];\n    }\n\n    var messageTokens = customTokens;\n    if (!customTokens) {\n        messageTokens = [accessorFunction(key)];\n    }\n\n    var customMessageUnformatted = accessorFunction(key + '-msg');\n    var formattingArguments;\n\n    if (customMessageUnformatted) {\n        formattingArguments = [customMessageUnformatted].concat(messageTokens);\n    } else {\n        formattingArguments = [defaultMessage].concat(messageTokens);\n    }\n\n    return AJS.format.apply(null, formattingArguments);\n}\n\n/*\n The value I18n.getText('aui.validation.message...') (defaultMessage) cannot be refactored as it\n must appear verbatim for the plugin I18n transformation to pick it up\n */\nvar pluginI18nMessages = {\n    'minlength': I18n.getText('aui.validation.message.minlength'),\n    'maxlength': I18n.getText('aui.validation.message.maxlength'),\n    'exactlength': I18n.getText('aui.validation.message.exactlength'),\n    'matchingfield': I18n.getText('aui.validation.message.matchingfield'),\n    'matchingfield-novalue': I18n.getText('aui.validation.message.matchingfield-novalue'),\n    'doesnotcontain': I18n.getText('aui.validation.message.doesnotcontain'),\n    'pattern': I18n.getText('aui.validation.message.pattern'),\n    'required': I18n.getText('aui.validation.message.required'),\n    'validnumber': I18n.getText('aui.validation.message.validnumber'),\n    'min': I18n.getText('aui.validation.message.min'),\n    'max': I18n.getText('aui.validation.message.max'),\n    'dateformat': I18n.getText('aui.validation.message.dateformat'),\n    'minchecked': I18n.getText('aui.validation.message.minchecked'),\n    'maxchecked': I18n.getText('aui.validation.message.maxchecked'),\n};\n\namdify('aui/form-validation/basic-validators');\n","import $ from './jquery';\nimport './form-notification';\nimport {\n    appendDescription,\n    appendErrorMessages,\n    getMessageContainer,\n    setFieldSpinner,\n    updateAriaInfo,\n} from './form-notification';\nimport './form-validation/basic-validators';\nimport amdify from './internal/amdify';\nimport * as deprecate from './internal/deprecation';\nimport globalize from './internal/globalize';\nimport skate from './internal/skate';\nimport validatorRegister from './form-validation/validator-register';\n\n//Attributes\nconst ATTRIBUTE_VALIDATION_OPTION_PREFIX = 'aui-validation-';\nconst ATTRIBUTE_NOTIFICATION_PREFIX = 'data-aui-notification-';\n\nconst ATTRIBUTE_FIELD_STATE = 'aui-validation-state';\nconst INVALID = 'invalid';\nconst VALID = 'valid';\nconst VALIDATING = 'validating';\nconst UNVALIDATED = 'unvalidated';\n\nconst ATTRIBUTE_VALIDATION_FIELD_COMPONENT = 'data-aui-validation-field';\n\n//Classes\nconst CLASS_VALIDATION_INITIALISED = '_aui-form-validation-initialised';\n\n//Events\nconst EVENT_FIELD_STATE_CHANGED = '_aui-internal-field-state-changed';\n\nfunction isFieldInitialised($field) {\n    return $field.hasClass(CLASS_VALIDATION_INITIALISED);\n}\n\nfunction initValidation($field) {\n    if (!isFieldInitialised($field)) {\n        prepareFieldMarkup($field);\n        bindFieldEvents($field);\n        changeFieldState($field, UNVALIDATED);\n    }\n}\n\nfunction prepareFieldMarkup($field) {\n    $field.addClass(CLASS_VALIDATION_INITIALISED);\n    appendDescription($field);\n}\n\nfunction bindFieldEvents($field) {\n    bindStopTypingEvent($field);\n    bindValidationEvent($field);\n}\n\nfunction bindStopTypingEvent($field) {\n    var keyUpTimer;\n\n    var triggerStopTypingEvent = function () {\n        $field.trigger('aui-stop-typing');\n    };\n\n    $field.on('keyup', function () {\n        clearTimeout(keyUpTimer);\n        keyUpTimer = setTimeout(triggerStopTypingEvent, 1500);\n    });\n}\n\nfunction bindValidationEvent($field) {\n    var validateWhen = getValidationOption($field, 'when');\n    var watchedFieldID = getValidationOption($field, 'watchfield');\n\n    var elementsToWatch = watchedFieldID ? $field.add('#' + watchedFieldID) : $field;\n\n    elementsToWatch.on(validateWhen, function startValidation() {\n        validationTriggeredHandler($field);\n    });\n}\n\nfunction validationTriggeredHandler($field) {\n    var noValidate = getValidationOption($field, 'novalidate');\n\n    if (noValidate) {\n        changeFieldState($field, VALID);\n        return;\n    }\n\n    return startValidating($field);\n}\n\nfunction getValidationOption($field, option) {\n    var defaults = {\n        when: 'change',\n    };\n    var optionValue = $field.attr('data-' + ATTRIBUTE_VALIDATION_OPTION_PREFIX + option);\n    if (!optionValue) {\n        optionValue = defaults[option];\n    }\n\n    return optionValue;\n}\n\nfunction startValidating($field) {\n    clearFieldMessages($field);\n\n    var validatorsToRun = getActivatedValidators($field);\n\n    changeFieldState($field, VALIDATING);\n    var deferreds = runValidatorsAndGetDeferred($field, validatorsToRun);\n    var fieldValidators = $.when.apply($, deferreds);\n    fieldValidators.done(function () {\n        changeFieldState($field, VALID);\n    });\n    return fieldValidators;\n}\n\nfunction clearFieldMessages($field) {\n    setFieldNotification(getDisplayField($field), 'none');\n}\n\nfunction getValidators() {\n    return validatorRegister.validators();\n}\n\nfunction getActivatedValidators($field) {\n    var callList = [];\n    getValidators().forEach(function (validator, index) {\n        var validatorTrigger = validator.validatorTrigger;\n        var runThisValidator = $field.is(validatorTrigger);\n        if (runThisValidator) {\n            callList.push(index);\n        }\n    });\n\n    return callList;\n}\n\nfunction runValidatorsAndGetDeferred($field, validatorsToRun) {\n    var allDeferreds = [];\n\n    validatorsToRun.forEach(function (validatorIndex) {\n        var validatorFunction = getValidators()[validatorIndex].validatorFunction;\n        var deferred = new $.Deferred();\n        var validatorContext = createValidatorContext($field, deferred);\n        validatorFunction(validatorContext);\n\n        allDeferreds.push(deferred);\n    });\n\n    return allDeferreds;\n}\n\nfunction createValidatorContext($field, validatorDeferred) {\n    var context = {\n        validate: function () {\n            validatorDeferred.resolve();\n        },\n        invalidate: function (message) {\n            changeFieldState($field, INVALID, message);\n            validatorDeferred.reject();\n        },\n        args: createArgumentAccessorFunction($field),\n        el: $field[0],\n        $el: $field,\n    };\n\n    deprecate.prop(context, '$el', {\n        sinceVersion: '5.9.0',\n        removeInVersion: '12.0.0',\n        alternativeName: 'el',\n        extraInfo: 'See https://ecosystem.atlassian.net/browse/AUI-3263.',\n    });\n\n    return context;\n}\n\nfunction createArgumentAccessorFunction($field) {\n    return function (arg) {\n        return $field.attr('data-' + ATTRIBUTE_VALIDATION_OPTION_PREFIX + arg) || $field.attr(arg);\n    };\n}\n\nfunction changeFieldState($field, state, message) {\n    $field.attr('data-' + ATTRIBUTE_FIELD_STATE, state);\n    $field.removeAttr('aria-invalid');\n\n    if (state === UNVALIDATED) {\n        return;\n    }\n\n    $field.trigger($.Event(EVENT_FIELD_STATE_CHANGED));\n\n    var $displayField = getDisplayField($field);\n\n    var stateToNotificationTypeMap = {};\n    stateToNotificationTypeMap[VALIDATING] = 'wait';\n    stateToNotificationTypeMap[INVALID] = 'error';\n    stateToNotificationTypeMap[VALID] = 'success';\n\n    var notificationType = stateToNotificationTypeMap[state];\n\n    if (state === VALIDATING) {\n        showSpinnerIfSlow($field);\n    } else {\n        setFieldNotification($displayField, notificationType, message);\n    }\n\n    if (state === INVALID) {\n        $field.attr('aria-invalid', true);\n    }\n}\n\nfunction showSpinnerIfSlow($field) {\n    setTimeout(function () {\n        let stillValidating = getFieldState($field) === VALIDATING;\n        if (stillValidating) {\n            setFieldNotification($field, 'wait');\n            setFieldSpinner($field, true);\n        }\n    }, 500);\n}\n\nfunction setFieldNotification($field, type, message) {\n    const spinnerWasVisible = isSpinnerVisible($field);\n    removeIconOnlyNotifications($field);\n    const skipShowingSuccessNotification = type === 'success' && !spinnerWasVisible;\n    if (skipShowingSuccessNotification) {\n        return;\n    }\n\n    if (type === 'none') {\n        removeFieldNotification($field, 'error');\n    } else {\n        const previousMessage = $field.attr(ATTRIBUTE_NOTIFICATION_PREFIX + type) || '[]';\n        const newMessages = message ? combineJSONMessages(message, previousMessage) : [];\n        $field.attr(ATTRIBUTE_NOTIFICATION_PREFIX + type, JSON.stringify(newMessages));\n        if (type === 'error') {\n            appendErrorMessages($field, newMessages);\n        }\n    }\n}\n\nfunction removeIconOnlyNotifications($field) {\n    removeFieldNotification($field, 'wait');\n    setFieldSpinner($field, false);\n    removeFieldNotification($field, 'success');\n}\n\nfunction removeFieldNotification($field, type) {\n    $field.removeAttr(ATTRIBUTE_NOTIFICATION_PREFIX + type);\n    if (type === 'error') {\n        getMessageContainer($field, type).remove();\n        updateAriaInfo($field);\n    }\n}\n\nfunction isSpinnerVisible($field) {\n    return $field.is('[' + ATTRIBUTE_NOTIFICATION_PREFIX + 'wait]');\n}\n\nfunction combineJSONMessages(newString, previousString) {\n    const previousStackedMessageList = JSON.parse(previousString);\n    return previousStackedMessageList.concat([newString]);\n}\n\nfunction getDisplayField($field) {\n    var displayFieldID = getValidationOption($field, 'displayfield');\n    var notifyOnSelf = displayFieldID === undefined;\n    return notifyOnSelf ? $field : $('#' + displayFieldID);\n}\n\nfunction getFieldState($field) {\n    return $field.attr('data-' + ATTRIBUTE_FIELD_STATE);\n}\n\n/**\n * Trigger validation on a field manually\n * @param $field the field that validation should be triggered for\n */\nfunction validateField($field) {\n    $field = $($field);\n    validationTriggeredHandler($field);\n}\n\n/**\n * Form scrolling and submission prevent based on validation state\n * -If the form is unvalidated, validate all fields\n * -If the form is invalid, go to the first invalid element\n * -If the form is validating, wait for them to validate and then try submitting again\n * -If the form is valid, allow form submission\n */\n$(document).on('submit', function (e) {\n    var form = e.target;\n    var $form = $(form);\n\n    var formState = getFormStateName($form);\n    if (formState === UNVALIDATED) {\n        delaySubmitUntilStateChange($form, e);\n        validateUnvalidatedFields($form);\n    } else if (formState === VALIDATING) {\n        delaySubmitUntilStateChange($form, e);\n    } else if (formState === INVALID) {\n        e.preventDefault();\n        selectFirstInvalid($form);\n    } else if (formState === VALID) {\n        var validSubmitEvent = $.Event('aui-valid-submit');\n        $form.trigger(validSubmitEvent);\n        var preventNormalSubmit = validSubmitEvent.isDefaultPrevented();\n        if (preventNormalSubmit) {\n            e.preventDefault(); //users can bind to aui-valid-submit for ajax forms\n        }\n    }\n});\n\nfunction delaySubmitUntilStateChange($form, event) {\n    event.preventDefault();\n    $form.one(EVENT_FIELD_STATE_CHANGED, function () {\n        $form.trigger('submit');\n    });\n}\n\nfunction getFormStateName($form) {\n    var $fieldCollection = $form.find('.' + CLASS_VALIDATION_INITIALISED);\n    var fieldStates = getFieldCollectionStateNames($fieldCollection);\n    var wholeFormState = mergeStates(fieldStates);\n    return wholeFormState;\n}\n\nfunction getFieldCollectionStateNames($fields) {\n    var states = $.map($fields, function (field) {\n        return getFieldState($(field));\n    });\n    return states;\n}\n\nfunction mergeStates(stateNames) {\n    var containsInvalidState = stateNames.indexOf(INVALID) !== -1;\n    var containsUnvalidatedState = stateNames.indexOf(UNVALIDATED) !== -1;\n    var containsValidatingState = stateNames.indexOf(VALIDATING) !== -1;\n\n    if (containsInvalidState) {\n        return INVALID;\n    } else if (containsUnvalidatedState) {\n        return UNVALIDATED;\n    } else if (containsValidatingState) {\n        return VALIDATING;\n    } else {\n        return VALID;\n    }\n}\n\nfunction validateUnvalidatedFields($form) {\n    var $unvalidatedElements = getFieldsInFormWithState($form, UNVALIDATED);\n    $unvalidatedElements.each(function (index, el) {\n        validator.validate($(el));\n    });\n}\n\nfunction selectFirstInvalid($form) {\n    var $firstInvalidField = getFieldsInFormWithState($form, INVALID).first();\n    $firstInvalidField.trigger('focus');\n}\n\nfunction getFieldsInFormWithState($form, state) {\n    var selector = '[data-' + ATTRIBUTE_FIELD_STATE + '=' + state + ']';\n    return $form.find(selector);\n}\n\nconst validator = {\n    register: validatorRegister.register,\n    validate: validateField,\n};\n\nskate(ATTRIBUTE_VALIDATION_FIELD_COMPONENT, {\n    attached: function (field) {\n        if (field.form) {\n            field.form.setAttribute('novalidate', 'novalidate');\n        }\n        var $field = $(field);\n        initValidation($field);\n        skate.init(field); //needed to kick off form notification skate initialisation\n    },\n    type: skate.type.ATTRIBUTE,\n});\n\namdify('aui/form-validation', validator);\nglobalize('formValidation', validator);\nexport default validator;\n","import globalize from './internal/globalize';\nimport * as deprecate from './internal/deprecation';\n\n/**\n * @deprecated Since 8.0.0 Use equivalent functions from libraries like lodash / underscore instead.\n */\nfunction debounce(func, wait) {\n    var timeout;\n    var result;\n\n    return function () {\n        var args = arguments;\n        var context = this;\n        var later = function () {\n            result = func.apply(context, args);\n            context = args = null;\n        };\n\n        clearTimeout(timeout);\n        timeout = setTimeout(later, wait);\n\n        return result;\n    };\n}\n\nvar deprecatedDebounce = deprecate.fn(debounce, 'AJS.debounce', {\n    removeInVersion: '12.0.0',\n    sinceVersion: '8.0.0',\n    extraInfo: 'Use equivalent functions from libraries like lodash / underscore instead',\n});\n\nexport default deprecatedDebounce;\n\nglobalize('debounce', deprecatedDebounce);\n\n/**\n * @deprecated Since 8.0.0 Use equivalent functions from libraries like lodash / underscore instead.\n */\nfunction debounceImmediate(func, wait) {\n    var timeout = null;\n    var result;\n\n    return function () {\n        var context = this;\n        var args = arguments;\n        var later = function () {\n            timeout = context = args = null;\n        };\n\n        if (timeout === null) {\n            result = func.apply(context, args);\n        }\n\n        clearTimeout(timeout);\n        timeout = setTimeout(later, wait);\n\n        return result;\n    };\n}\n\nvar deprecatedDebounceImmediate = deprecate.fn(debounceImmediate, 'AJS.debounceImmediate', {\n    removeInVersion: '12.0.0',\n    sinceVersion: '8.0.0',\n    extraInfo: 'Use equivalent functions from libraries like lodash / underscore instead',\n});\n\nexport { deprecatedDebounceImmediate as debounceImmediate };\n\nglobalize('debounceImmediate', deprecatedDebounceImmediate);\n","import $ from '../../jquery';\nimport debounce from '../../debounce';\nimport { I18n } from '../../i18n';\nimport skate from '../skate';\nimport template from 'skatejs-template-html';\n\nconst $window = $(window);\n\nfunction Header(element) {\n    var that = this;\n\n    this.element = element;\n    this.$element = $(element);\n    this.index = $('aui-header, .aui-header').index(element);\n    this.$secondaryNav = this.$element.find('.aui-header-secondary .aui-nav').first();\n    this.menuItems = [];\n    this.totalWidth = 0;\n    this.$moreMenu = undefined;\n    this.rightMostNavItemIndex = undefined;\n    this.$applicationLogo = this.$element.find('#logo');\n    this.moreMenuWidth = 0;\n    this.primaryButtonsWidth = 0;\n\n    // to cache the selector and give .find convenience\n    this.$headerFind = (function () {\n        var $header = $(that.$element[0].querySelector('.aui-header-primary'));\n\n        return function (selector) {\n            return $header.find(selector);\n        };\n    })();\n}\n\nHeader.prototype = {\n    init: function () {\n        var that = this;\n\n        this.element.setAttribute('data-aui-responsive', 'true');\n        this.$headerFind('.aui-button')\n            .parent()\n            .each(function () {\n                that.primaryButtonsWidth += $(this).outerWidth(true);\n            });\n\n        // remember the widths of all the menu items\n        this.$headerFind('.aui-nav > li > a:not(.aui-button)').each(function () {\n            var $this = $(this).parent();\n            var outerWidth = $this.outerWidth(true);\n\n            that.totalWidth += outerWidth;\n            that.menuItems.push({\n                $element: $this,\n                outerWidth: outerWidth,\n            });\n        });\n\n        /** The zero based index of the right-most visible nav menu item. */\n        this.rightMostNavItemIndex = this.menuItems.length - 1;\n\n        $window.on(\n            'resize',\n            (this._resizeHandler = debounce(function () {\n                that.constructResponsiveDropdown();\n            }, 100))\n        );\n\n        // So that the header logo doesn't mess things up. (size is unknown before the image loads)\n        var $logoImg = this.$applicationLogo.find('img');\n\n        if ($logoImg.length !== 0) {\n            $logoImg.attr('data-aui-responsive-header-index', this.index);\n            $logoImg.on('load', function () {\n                that.constructResponsiveDropdown();\n            });\n        }\n\n        this.constructResponsiveDropdown();\n\n        // show the aui nav (hidden via css on load)\n        this.$headerFind('.aui-nav').css('width', 'auto');\n    },\n\n    destroy: function () {\n        $window.off('resize', this._resizeHandler);\n    },\n\n    // calculate widths based on the current state of the page\n    calculateAvailableWidth: function () {\n        // if there is no secondary nav, use the right of the screen as the boundary instead\n        var rightMostBoundary = this.$secondaryNav.is(':visible')\n            ? this.$secondaryNav.offset().left\n            : this.$element.outerWidth();\n\n        // the right most side of the primary nav, this is assumed to exists if this code is running\n        var primaryNavRight =\n            this.$applicationLogo.offset().left +\n            this.$applicationLogo.outerWidth(true) +\n            this.primaryButtonsWidth;\n\n        return rightMostBoundary - primaryNavRight;\n    },\n\n    showResponsiveDropdown: function () {\n        if (this.$moreMenu === undefined) {\n            this.$moreMenu = this.createResponsiveDropdownTrigger();\n        }\n        this.$moreMenu.css('display', '');\n    },\n\n    hideResponsiveDropdown: function () {\n        if (this.$moreMenu !== undefined) {\n            this.$moreMenu.css('display', 'none');\n        }\n    },\n\n    constructResponsiveDropdown: function () {\n        if (!this.menuItems.length) {\n            return;\n        }\n\n        var remainingWidth;\n        var availableWidth = this.calculateAvailableWidth(this.$element, this.primaryButtonsWidth);\n\n        if (availableWidth > this.totalWidth) {\n            this.showAll();\n        } else {\n            this.showResponsiveDropdown();\n            remainingWidth = availableWidth - this.moreMenuWidth;\n\n            // Figure out how many nav menu items fit into the available space.\n            var newRightMostNavItemIndex = -1;\n            while (remainingWidth - this.menuItems[newRightMostNavItemIndex + 1].outerWidth >= 0) {\n                remainingWidth -= this.menuItems[newRightMostNavItemIndex + 1].outerWidth;\n                newRightMostNavItemIndex++;\n            }\n\n            if (newRightMostNavItemIndex < this.rightMostNavItemIndex) {\n                this.moveToResponsiveDropdown(\n                    this.rightMostNavItemIndex - newRightMostNavItemIndex\n                );\n            } else if (this.rightMostNavItemIndex < newRightMostNavItemIndex) {\n                this.moveOutOfResponsiveDropdown(\n                    newRightMostNavItemIndex - this.rightMostNavItemIndex\n                );\n            }\n        }\n    },\n\n    // creates the trigger and content elements for the show more dropdown\n    createResponsiveDropdownTrigger: function () {\n        var moreNavItemEl = document.createElement('li');\n        var dropdownEl = document.createElement('aui-dropdown-menu');\n        dropdownEl.id = `aui-responsive-header-dropdown-${this.index}`;\n        skate.init(dropdownEl);\n\n        var dropdownSectionEl = document.createElement('aui-section');\n        dropdownSectionEl.id = `aui-responsive-header-dropdown-list-${this.index}`;\n        skate.init(dropdownSectionEl);\n\n        dropdownEl.appendChild(dropdownSectionEl);\n\n        var triggerEl = createTriggerAndAssociate(dropdownEl);\n        moreNavItemEl.appendChild(triggerEl);\n        moreNavItemEl.appendChild(dropdownEl);\n\n        // Append the More menu before any primary buttons.\n        if (this.primaryButtonsWidth === 0) {\n            this.$headerFind('.aui-nav').append(moreNavItemEl);\n        } else {\n            this.$headerFind('.aui-nav > li > .aui-button:first').parent().before(moreNavItemEl);\n        }\n\n        this.moreMenuWidth = $(moreNavItemEl).outerWidth(true);\n        return $(moreNavItemEl);\n    },\n\n    // function that handles moving items out of the show more menu into the app header\n    moveOutOfResponsiveDropdown: function (numItems) {\n        if (numItems <= 0) {\n            return;\n        }\n\n        var $moreDropdown = $(`#aui-responsive-header-dropdown-${this.index}`);\n\n        // Move items (working top-to-bottom) from the more menu into the nav bar.\n        var leftMostIndexToMove = this.rightMostNavItemIndex + 1;\n        var rightMostIndexToMove = this.rightMostNavItemIndex + numItems;\n        for (var i = leftMostIndexToMove; i <= rightMostIndexToMove; i++) {\n            var $navItem = this.menuItems[i].$element;\n            var $navItemTrigger = $navItem.children('a');\n\n            if ($navItemTrigger.attr('aria-controls')) {\n                var $navItemDropdown = $(\n                    document.getElementById($navItemTrigger.attr('aria-controls'))\n                );\n                $navItemDropdown.removeClass('aui-dropdown2-sub-menu');\n                $navItem.append($navItemDropdown);\n            }\n\n            $moreDropdown.find('aui-item-link:first').remove();\n            $navItem.insertBefore(this.$moreMenu);\n        }\n\n        this.rightMostNavItemIndex += numItems;\n    },\n\n    // function that handles moving items into the show more menu\n    moveToResponsiveDropdown: function (numItems) {\n        if (numItems <= 0) {\n            return;\n        }\n\n        var moreDropdownSectionEl = template.wrap(this.$moreMenu[0].querySelector('aui-section'));\n\n        // Move items (working right-to-left) from the nav bar to the more menu.\n        var rightMostIndexToMove = this.rightMostNavItemIndex;\n        var leftMostIndexToMove = this.rightMostNavItemIndex - numItems + 1;\n        for (var i = rightMostIndexToMove; i >= leftMostIndexToMove; i--) {\n            var $navItem = this.menuItems[i].$element;\n            var $navItemTrigger = $navItem.children('a');\n            skate.init($navItemTrigger); // ensure all triggers have gone through their lifecycle before we check for submenus\n\n            var moreDropdownItemEl = document.createElement('aui-item-link');\n            moreDropdownItemEl.setAttribute('href', $navItemTrigger.attr('href'));\n            if ($navItemTrigger.attr('aria-controls')) {\n                var $navItemDropdown = $(\n                    document.getElementById($navItemTrigger.attr('aria-controls'))\n                );\n                moreDropdownItemEl.setAttribute('for', $navItemTrigger.attr('aria-controls'));\n                $navItemDropdown.addClass('aui-dropdown2-sub-menu');\n                $navItemDropdown.appendTo('body');\n            }\n            if ($navItemTrigger.get(0).hasAttribute('data-aui-extra-classes')) {\n                // an opt-in behaviour\n                const extraClasses = Array.from($navItemTrigger.get(0).classList).filter(\n                    (cls) => !cls.startsWith('aui-')\n                );\n                moreDropdownItemEl.setAttribute('extra-classes', extraClasses.join(' '));\n            }\n            skate.init(moreDropdownItemEl);\n            template.wrap(moreDropdownItemEl).textContent = $navItemTrigger.text();\n\n            $navItem.detach();\n            moreDropdownSectionEl.insertBefore(\n                moreDropdownItemEl,\n                moreDropdownSectionEl.firstChild\n            );\n            this.element.dispatchEvent(\n                new CustomEvent('aui-responsive-menu-item-created', {\n                    bubbles: true,\n                    detail: {\n                        originalItem: $navItem[0],\n                        newItem: moreDropdownItemEl,\n                    },\n                })\n            );\n        }\n\n        this.rightMostNavItemIndex -= numItems;\n    },\n\n    // function that handles show everything\n    showAll: function () {\n        this.moveOutOfResponsiveDropdown(this.menuItems.length - 1 - this.rightMostNavItemIndex);\n        this.hideResponsiveDropdown();\n    },\n};\n\nfunction createTriggerAndAssociate(dropdown) {\n    var trigger = document.createElement('a');\n    trigger.setAttribute('class', 'aui-dropdown2-trigger');\n    trigger.setAttribute('href', '#');\n    trigger.id = dropdown.id + '-trigger';\n    trigger.setAttribute('aria-controls', dropdown.id);\n    trigger.innerHTML = I18n.getText('aui.words.more');\n\n    return trigger;\n}\n\n/**\n * Initialise a Header, or return an existing Header for an element.\n */\nfunction createHeader(element) {\n    let header = element._header;\n    if (!(header instanceof Header)) {\n        header = new Header(element);\n        header.init();\n        element._header = header;\n    }\n    return header;\n}\n\nexport default createHeader;\n","import $ from './jquery';\nimport createHeader from './internal/header/create-header';\nimport * as deprecate from './internal/deprecation';\nimport globalize from './internal/globalize';\n\nfunction findAndCreateHeaders() {\n    $('.aui-header').each(function () {\n        createHeader(this);\n    });\n}\n\n$(findAndCreateHeaders);\n\nconst responsiveheader = {};\nresponsiveheader.setup = deprecate.fn(findAndCreateHeaders, 'responsiveheader.setup', {\n    removeInVersion: '12.0.0',\n    sinceVersion: '5.8.0',\n    extraInfo: 'No need to manually initialise anymore as this is now a web component.',\n});\n\nglobalize('responsiveheader', responsiveheader);\n\nexport default responsiveheader;\n","import createHeader from './internal/header/create-header';\nimport skate from './internal/skate';\n\nconst Header = skate('aui-header-end', {\n    type: skate.type.ELEMENT,\n    created: function (element) {\n        const auiHeader = element.parentElement;\n        if (auiHeader && auiHeader.classList.contains('aui-header')) {\n            createHeader(auiHeader);\n        } else {\n            console.log('Could not async. initialise aui-header');\n        }\n    },\n});\n\nexport default Header;\n","import $ from './jquery';\nimport datepickerUI from 'jquery-ui/ui/widgets/datepicker';\nimport * as logger from './internal/log';\nimport { supportsDateField } from './internal/browser';\nimport globalize from './internal/globalize';\nimport keyCode from './key-code';\nimport { I18n } from './i18n';\nimport InlineDialogEl from './inline-dialog2';\nimport generateUniqueId from './unique-id';\n\nconst makePopup = ({ horizontalAlignment, datePickerUUID }) => {\n    const popupInlineDialogElement = new InlineDialogEl();\n    popupInlineDialogElement.id = datePickerUUID;\n\n    const popup = $(popupInlineDialogElement);\n    popup.attr('persistent', '');\n    popup.attr('data-aui-focus', 'false');\n    popup.attr('alignment', `bottom ${horizontalAlignment}`);\n    popup.addClass('aui-datepicker-dialog');\n\n    return popup;\n};\n\nconst makeConfig = ({ minDate, maxDate, dateFormat, $field, onSelect, hide }) => ({\n    dateFormat,\n    defaultDate: $field.val(),\n    maxDate: maxDate || $field.attr('max'),\n    minDate: minDate || $field.attr('min'),\n    nextText: '>',\n    onSelect: function (dateText) {\n        $field.val(dateText);\n        $field.trigger('change');\n        hide();\n        // TODO make sure the docs are explicit about the fact that onSelect cannot be an arrow function\n        onSelect && onSelect.call(this, dateText);\n    },\n    prevText: '<',\n});\n\nconst initCalendar = ({ config, popupContents, getCalendarNode, hint }) => {\n    const calendar = $(getCalendarNode());\n\n    calendar.datepicker(config);\n\n    let $hint;\n    if (hint) {\n        $hint = $('<div></div>').addClass('aui-datepicker-hint');\n        $hint.append('<span></span>').text(hint);\n        popupContents.append($hint);\n    }\n\n    return calendar;\n};\n\nconst makeDefaultPopupController = ($field, datePickerUUID) => {\n    let popup;\n    let popupContents;\n    let parentPopup;\n    let isTrackingDatePickerFocus = false; // used to prevent multiple bindings of handleDatePickerFocus within handleFieldBlur\n\n    const $body = $('body');\n\n    const handleDatePickerFocus = (event) => {\n        let $eventTarget = $(event.target);\n        let isTargetInput = $eventTarget.closest(popupContents).length || $eventTarget.is($field);\n        let isTargetPopup = $eventTarget.closest('.ui-datepicker-header').length;\n\n        // Hide if we're clicking anywhere else but the input or popup OR if esc is pressed.\n        if ((!isTargetInput && !isTargetPopup) || event.keyCode === keyCode.ESCAPE) {\n            hideDatePicker();\n            isTrackingDatePickerFocus = false;\n            return;\n        }\n\n        if ($eventTarget.get(0) !== $field.get(0)) {\n            event.preventDefault();\n        }\n    };\n\n    const handleFieldBlur = () => {\n        // Trigger blur if event is keydown and esc OR is focusout.\n        if (!isTrackingDatePickerFocus) {\n            $body.on('focus blur click mousedown', '*', handleDatePickerFocus);\n            isTrackingDatePickerFocus = true;\n        }\n    };\n\n    const createPolyfill = function () {\n        // bind additional field processing events\n        $body.on('keydown', handleDatePickerFocus);\n        $field.on('focusout keydown', handleFieldBlur);\n    };\n\n    const getPopupContents = ({ $field }) => {\n        const calculateHorizontalAlignment = ($field) => {\n            let inLeftHalf = $field.offset().left < window.innerWidth / 2;\n            return inLeftHalf ? 'left' : 'right';\n        };\n\n        popup = makePopup({\n            horizontalAlignment: calculateHorizontalAlignment($field),\n            datePickerUUID,\n        });\n\n        parentPopup = $field.closest('aui-inline-dialog').get(0);\n        if (parentPopup) {\n            parentPopup._datePickerPopup = popup; // AUI-2696 - hackish coupling to control inline-dialog close behaviour.\n            $(parentPopup).on('aui-hide', (e) => {\n                if (isTrackingDatePickerFocus) {\n                    e.preventDefault();\n                }\n                $body.off('focus blur', '*', handleDatePickerFocus);\n                if (parentPopup && parentPopup._datePickerPopup) {\n                    delete parentPopup._datePickerPopup;\n                }\n            });\n        }\n\n        $body.append(popup);\n\n        popupContents = popup;\n\n        return popup;\n    };\n\n    const handleFieldFocus = () => {\n        if (!popup.get(0).open) {\n            showDatePicker();\n        }\n    };\n\n    const showDatePicker = () => {\n        popup.get(0).open = true;\n    };\n\n    const hideDatePicker = () => {\n        popup.get(0).open = false;\n    };\n\n    const getCalendarNode = () => popup.get(0).childNodes[0];\n\n    const destroyPolyfill = () => {\n        // goodbye, cruel world!\n        hideDatePicker();\n\n        $field.off('focus click', handleFieldFocus);\n        $field.off('focusout keydown', handleFieldBlur);\n\n        $body.off('keydown', handleFieldBlur);\n        $body.off('focus blur click mousedown keydown', handleDatePickerFocus);\n    };\n\n    return {\n        calendarContainerSelector: null,\n        getPopupContents,\n        handleFieldFocus,\n        showDatePicker,\n        hideDatePicker,\n        getCalendarNode,\n        destroyPolyfill,\n        createPolyfill,\n    };\n};\n\nconst initPolyfill = function (datePicker) {\n    const $field = datePicker.getField();\n    const options = datePicker.getOptions();\n    const datePickerUUID = datePicker.getUUID();\n\n    let calendar;\n\n    const {\n        getPopupContents,\n        handleFieldFocus,\n        showDatePicker,\n        hideDatePicker,\n        getCalendarNode,\n        destroyPolyfill,\n        createPolyfill,\n    } = makeDefaultPopupController($field, datePickerUUID);\n\n    const handleFieldUpdate = (event) => {\n        let val = $(event.currentTarget).val();\n        // IE10/11 fire the 'input' event when internally showing and hiding\n        // the placeholder of an input. This was cancelling the initial click\n        // event and preventing the selection of the first date. The val check here\n        // is a workaround to assure we have legitimate user input that should update\n        // the calendar\n        if (val) {\n            calendar.datepicker('setDate', $field.val());\n        }\n    };\n\n    // keep track of things we mutate within `initPolyfill`.\n    // these should all be restored in the `destroyPolyfill` function.\n    const originalPlaceholder = $field.attr('placeholder');\n    const originalType = $field.prop('type');\n    let attributeHandler;\n\n    // -----------------------------------------------------------------\n    // mutate datePicker public API\n    // -----------------------------------------------------------------\n    {\n        const withCalendar = (callback) => (value) => {\n            if (typeof calendar !== 'undefined') {\n                return callback(value);\n            }\n        };\n\n        const destroyCalendar = withCalendar(() => {\n            calendar.datepicker('destroy');\n        });\n\n        datePicker.show = showDatePicker;\n\n        datePicker.hide = hideDatePicker;\n\n        // un-does everything the `initPolyfill` function constructed or mutated.\n        datePicker.destroyPolyfill = () => {\n            destroyPolyfill();\n\n            $field.off('propertychange keyup input paste', handleFieldUpdate);\n\n            if (attributeHandler) {\n                attributeHandler.disconnect();\n                attributeHandler = null;\n            }\n\n            if (originalPlaceholder) {\n                $field.attr('placeholder', originalPlaceholder);\n            }\n\n            if (originalType) {\n                $field.prop('type', originalType);\n            }\n\n            $field.removeAttr('data-aui-dp-uuid');\n\n            destroyCalendar();\n\n            // TODO: figure out a way to tear down the popup (if necessary)\n\n            delete datePicker.destroyPolyfill;\n\n            delete datePicker.show;\n            delete datePicker.hide;\n        };\n\n        datePicker.setDate = withCalendar((value) => {\n            calendar.datepicker('setDate', value);\n        });\n\n        datePicker.getDate = withCalendar(() => calendar.datepicker('getDate'));\n\n        datePicker.setMin = withCalendar((value) =>\n            calendar.datepicker('option', 'minDate', value)\n        );\n\n        datePicker.setMax = withCalendar((value) =>\n            calendar.datepicker('option', 'maxDate', value)\n        );\n    }\n\n    // -----------------------------------------------------------------\n    // polyfill bootstrap ----------------------------------------------\n    // -----------------------------------------------------------------\n\n    if (!(options.languageCode in DatePicker.prototype.localisations)) {\n        options.languageCode = '';\n    }\n    const i18nConfig = DatePicker.prototype.localisations;\n\n    $field.attr('aria-controls', datePickerUUID);\n\n    if (typeof calendar === 'undefined') {\n        if (typeof $field.attr('step') !== 'undefined') {\n            logger.log(\n                'WARNING: The date picker polyfill currently does not support the step attribute!'\n            );\n        }\n        const baseConfig = makeConfig({\n            dateFormat: options.dateFormat,\n            minDate: options.minDate,\n            maxDate: options.maxDate,\n            $field,\n            onSelect: options.onSelect,\n            hide: datePicker.hide,\n        });\n        const config = $.extend(undefined, baseConfig, i18nConfig);\n\n        // If this is a string value, it will be coerced to numeric.\n        // Since nothing only numbers can be larger than a negative number, this works as a defense.\n        if (options.firstDay > -1) {\n            config.firstDay = options.firstDay;\n        }\n\n        calendar = initCalendar({\n            config,\n            popupContents: getPopupContents({ $field }),\n            getCalendarNode,\n            hint: options.hint,\n        });\n\n        createPolyfill();\n\n        $field.on('propertychange keyup input paste', handleFieldUpdate);\n\n        // bind attribute handlers to account for html5 attributes\n        attributeHandler = new MutationObserver(function (mutationsList) {\n            mutationsList.forEach(function (mutation) {\n                if (mutation.attributeName === 'min') {\n                    datePicker.setMin(mutation.target.getAttribute('min'));\n                } else if (mutation.attributeName === 'max') {\n                    datePicker.setMax(mutation.target.getAttribute('max'));\n                }\n            });\n        });\n        attributeHandler.observe($field.get(0), { attributes: true });\n    }\n\n    // bind what we need to start off with\n    $field.on('focus click', handleFieldFocus); // the click is for fucking opera... Y U NO FIRE FOCUS EVENTS PROPERLY???\n\n    // give users a hint that this is a date field; note that placeholder isn't technically a valid attribute\n    // according to the spec...\n    $field.attr('placeholder', options.placeholder);\n\n    if ($field.prop('type') !== 'text') {\n        // Override the browser's default date field implementation.\n        // There used to be a fix for AUI-3681 here, too, but my testing of Edge 15\n        // shows that changing the `type` of input does not erase its value.\n        // see https://codepen.io/chrisdarroch/pen/YzwgjyJ\n        $field.prop('type', 'text');\n        // Set default value on initialization to handle all date formats.\n        // It is possible, because of changing type to text on the line above.\n        const attrValue = $field.attr('value');\n        if (attrValue) {\n            $field.val(attrValue);\n        }\n    }\n\n    // Trigger change to update calendar popup value.\n    $field.trigger('propertychange');\n\n    // demonstrate the polyfill is initialised\n    $field.attr('data-aui-dp-uuid', datePickerUUID);\n};\n\nfunction DatePicker(field, baseOptions) {\n    let options = {};\n\n    const datePickerUUID = generateUniqueId('date-picker');\n\n    const $field = $(field);\n\n    const datePicker = {\n        getUUID: () => datePickerUUID,\n        getField: () => $field,\n        getOptions: () => options,\n        destroy: () => {\n            if (typeof datePicker.destroyPolyfill === 'function') {\n                datePicker.destroyPolyfill();\n            }\n        },\n        reset: () => {\n            datePicker.destroy();\n            const browserDoesNotSupportDateField = !DatePicker.prototype.browserSupportsDateField;\n            const shouldOverrideBrowserDefault = options.overrideBrowserDefault !== false;\n\n            if (browserDoesNotSupportDateField || shouldOverrideBrowserDefault) {\n                initPolyfill(datePicker);\n            }\n        },\n        reconfigure: (newOptions) => {\n            options = $.extend(undefined, DatePicker.prototype.defaultOptions, newOptions);\n            datePicker.reset();\n        },\n    };\n\n    datePicker.reconfigure(baseOptions);\n\n    return datePicker;\n}\n\n// -------------------------------------------------------------------------\n// things that should be common --------------------------------------------\n// -------------------------------------------------------------------------\n\nDatePicker.prototype.browserSupportsDateField = supportsDateField();\n\nDatePicker.prototype.defaultOptions = {\n    overrideBrowserDefault: false,\n    firstDay: -1,\n    languageCode: $('html').attr('lang') || 'en-AU',\n    dateFormat: datepickerUI.W3C, // same as $.datepicker.ISO_8601\n};\n\nfunction CalendarWidget(calendarNode, baseOptions) {\n    const options = $.extend(\n        {\n            nextText: '>',\n            prevText: '<',\n        },\n        baseOptions\n    );\n\n    const $calendarNode = $(calendarNode);\n\n    const $result = $calendarNode\n        .addClass('aui-datepicker-dialog')\n        .addClass('aui-calendar-widget')\n        .datepicker(options);\n\n    if (options.hint) {\n        const $hint = $('<div></div>').addClass('aui-datepicker-hint');\n        $hint.append('<span></span>').text(options.hint);\n        $result.append($hint);\n    }\n\n    $result.reconfigure = (options) => {\n        $result.datepicker('destroy');\n        $result.datepicker(options);\n    };\n\n    $result.destroy = () => {\n        $result.datepicker('destroy');\n    };\n\n    return $result;\n}\n\n// adapted from the jQuery UI Datepicker widget (v1.8.16), with the following changes:\n//   - dayNamesShort -> dayNamesMin\n//   - unnecessary attributes omitted\n/*\nCODE to extract codes out:\n\nvar langCode, langs, out;\nlangs = jQuery.datepicker.regional;\nout = {};\n\nfor (langCode in langs) {\n    if (langs.hasOwnProperty(langCode)) {\n        out[langCode] = {\n            'dayNames': langs[langCode].dayNames,\n            'dayNamesMin': langs[langCode].dayNamesShort, // this is deliberate\n            'firstDay': langs[langCode].firstDay,\n            'isRTL': langs[langCode].isRTL,\n            'monthNames': langs[langCode].monthNames,\n            'showMonthAfterYear': langs[langCode].showMonthAfterYear,\n            'yearSuffix': langs[langCode].yearSuffix\n        };\n    }\n}\n\n */\n\nDatePicker.prototype.localisations = {\n    dayNames: [\n        I18n.getText('ajs.datepicker.localisations.day-names.sunday'),\n        I18n.getText('ajs.datepicker.localisations.day-names.monday'),\n        I18n.getText('ajs.datepicker.localisations.day-names.tuesday'),\n        I18n.getText('ajs.datepicker.localisations.day-names.wednesday'),\n        I18n.getText('ajs.datepicker.localisations.day-names.thursday'),\n        I18n.getText('ajs.datepicker.localisations.day-names.friday'),\n        I18n.getText('ajs.datepicker.localisations.day-names.saturday'),\n    ],\n    dayNamesMin: [\n        I18n.getText('ajs.datepicker.localisations.day-names-min.sunday'),\n        I18n.getText('ajs.datepicker.localisations.day-names-min.monday'),\n        I18n.getText('ajs.datepicker.localisations.day-names-min.tuesday'),\n        I18n.getText('ajs.datepicker.localisations.day-names-min.wednesday'),\n        I18n.getText('ajs.datepicker.localisations.day-names-min.thursday'),\n        I18n.getText('ajs.datepicker.localisations.day-names-min.friday'),\n        I18n.getText('ajs.datepicker.localisations.day-names-min.saturday'),\n    ],\n    firstDay: I18n.getText('ajs.datepicker.localisations.first-day'),\n    isRTL: I18n.getText('ajs.datepicker.localisations.is-RTL') === 'true',\n    monthNames: [\n        I18n.getText('ajs.datepicker.localisations.month-names.january'),\n        I18n.getText('ajs.datepicker.localisations.month-names.february'),\n        I18n.getText('ajs.datepicker.localisations.month-names.march'),\n        I18n.getText('ajs.datepicker.localisations.month-names.april'),\n        I18n.getText('ajs.datepicker.localisations.month-names.may'),\n        I18n.getText('ajs.datepicker.localisations.month-names.june'),\n        I18n.getText('ajs.datepicker.localisations.month-names.july'),\n        I18n.getText('ajs.datepicker.localisations.month-names.august'),\n        I18n.getText('ajs.datepicker.localisations.month-names.september'),\n        I18n.getText('ajs.datepicker.localisations.month-names.october'),\n        I18n.getText('ajs.datepicker.localisations.month-names.november'),\n        I18n.getText('ajs.datepicker.localisations.month-names.december'),\n    ],\n    showMonthAfterYear:\n        I18n.getText('ajs.datepicker.localisations.show-month-after-year') === 'true',\n    yearSuffix: I18n.getText('ajs.datepicker.localisations.year-suffix'),\n};\n\n// TODO Workaround a localisation issue in WRM related to empty strings not being considered as valid localisation values\n// TODO Remove once this WRM PR is pulled in via platform (most probably) 8: https://bitbucket.org/atlassian/atlassian-plugins-webresource/pull-requests/1761/overview\nif (DatePicker.prototype.localisations.yearSuffix === 'ajs.datepicker.localisations.year-suffix') {\n    DatePicker.prototype.localisations.yearSuffix = '';\n}\n\n// -------------------------------------------------------------------------\n// finally, integrate with jQuery for convenience --------------------------\n// -------------------------------------------------------------------------\nconst key = 'aui-datepicker';\n\nconst makePlugin = (WidgetConstructor) =>\n    function (options) {\n        let picker = this.data(key);\n        if (!picker) {\n            picker = new WidgetConstructor(this, options);\n            this.data(key, picker);\n        } else if (typeof options === 'object') {\n            picker.reconfigure(options);\n        } else if (options === 'destroy') {\n            picker.destroy();\n        }\n        return picker;\n    };\n\n$.fn.datePicker = makePlugin(DatePicker);\nglobalize('DatePicker', DatePicker);\n\n$.fn.calendarWidget = makePlugin(CalendarWidget);\nglobalize('CalendarWidget', CalendarWidget);\n\nexport default DatePicker;\nexport { CalendarWidget };\n","export default {\n    NO_VALUE: 'aui-restfultable-editable-no-value',\n    NO_ENTRIES: 'aui-restfultable-no-entires',\n    RESTFUL_TABLE: 'aui-restfultable',\n    ROW: 'aui-restfultable-row',\n    READ_ONLY: 'aui-restfultable-readonly',\n    ACTIVE: 'aui-restfultable-active',\n    ALLOW_HOVER: 'aui-restfultable-allowhover',\n    FOCUSED: 'aui-restfultable-focused',\n    MOVEABLE: 'aui-restfultable-movable',\n    DISABLED: 'aui-restfultable-disabled',\n    SUBMIT: 'aui-restfultable-submit',\n    CANCEL: 'aui-restfultable-cancel',\n    EDIT_ROW: 'aui-restfultable-editrow',\n    CREATE: 'aui-restfultable-create',\n    DRAG_HANDLE: 'aui-restfultable-draghandle',\n    ORDER: 'aui-restfultable-order',\n    EDITABLE: 'aui-restfultable-editable',\n    ERROR: 'error',\n    DELETE: 'aui-restfultable-delete',\n    STATUS: 'aui-restfultable-status',\n};\n","import Backbone from 'backbone';\nexport default Backbone.View;\n","import Backbone from 'backbone';\nexport default Backbone.View;\n","import Backbone from 'backbone';\nexport default Backbone.View;\n","export default {\n    ENABLED_SUBMIT: 'enabledSubmit',\n    ROW_VIEW: 'RestfulTable_Row_View',\n};\n","export default {\n    // AJS\n    REORDER_SUCCESS: 'RestfulTable.reorderSuccess',\n    ROW_ADDED: 'RestfulTable.rowAdded',\n    ROW_REMOVED: 'RestfulTable.rowRemoved',\n    EDIT_ROW: 'RestfulTable.switchedToEditMode',\n    SERVER_ERROR: 'RestfulTable.serverError',\n\n    // Backbone\n    CREATED: 'created',\n    UPDATED: 'updated',\n    FOCUS: 'focus',\n    BLUR: 'blur',\n    SUBMIT: 'submit',\n    SAVE: 'save',\n    MODAL: 'modal',\n    MODELESS: 'modeless',\n    CANCEL: 'cancel',\n    CONTENT_REFRESHED: 'contentRefreshed',\n    RENDER: 'render',\n    FINISHED_EDITING: 'finishedEditing',\n    VALIDATION_ERROR: 'validationError',\n    SUBMIT_STARTED: 'submitStarted',\n    SUBMIT_FINISHED: 'submitFinished',\n    INITIALIZED: 'initialized',\n    ROW_INITIALIZED: 'rowInitialized',\n    ROW_EDIT: 'editRow',\n};\n","import './../spinner';\nimport classNames from './class-names';\n\nexport const spinner = '<aui-spinner size=\"small\"></aui-spinner>';\nconst SPINNER_SELECTOR = 'aui-spinner';\n\n/**\n * Appends spinner to .aui-restfultable-status container if not already present\n *\n * @param $el\n */\nexport function appendStatusSpinner($el) {\n    if ($el.find(SPINNER_SELECTOR).length === 0) {\n        $el.find(`.${classNames.STATUS}`).append(spinner);\n    }\n}\n\n/**\n * Removes spinner from .aui-restfultable-status container\n *\n * @param $el\n */\nexport function removeStatusSpinner($el) {\n    $el.find(`.${classNames.STATUS} ${SPINNER_SELECTOR}`).remove();\n}\n","import $ from '../jquery';\nimport '../../../js-vendor/jquery/serializetoobject';\nimport Backbone from 'backbone';\nimport classNames from './class-names';\nimport dataKeys from './data-keys';\nimport events from './event-names';\nimport { I18n } from '../i18n';\nimport { appendStatusSpinner, removeStatusSpinner } from './spinner';\n\nvar isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') !== -1;\n\n/**\n * An abstract class that gives the required behaviour for the creating and editing entries. Extend this class and pass\n * it as the {views.row} property of the options passed to RestfulTable in construction.\n */\nexport default Backbone.View.extend({\n    tagName: 'tr',\n\n    // delegate events\n    events: {\n        focusin: '_focus',\n        click: '_focus',\n        keyup: '_handleKeyUpEvent',\n    },\n\n    /**\n     * @constructor\n     * @param {Object} options\n     */\n    initialize: function (options) {\n        this.$el = $(this.el);\n\n        // faster lookup\n        this._event = events;\n        this.classNames = classNames;\n        this.dataKeys = dataKeys;\n        this.columns = options.columns;\n        this.isCreateRow = options.isCreateRow;\n        this.allowReorder = options.allowReorder;\n\n        // Allow cancelling an edit with support for setting a new element.\n        this.events['click .' + this.classNames.CANCEL] = '_cancel';\n        this.delegateEvents();\n\n        if (options.isUpdateMode) {\n            this.isUpdateMode = true;\n        } else {\n            this._modelClass = options.model;\n            this.model = new this._modelClass();\n        }\n\n        this.fieldFocusSelector = options.fieldFocusSelector;\n        this.on(this._event.CANCEL, () => {\n            if (!this.isCreateRow) {\n                this.disabled = true;\n            }\n        })\n            .on(this._event.SAVE, (focusUpdated) => !this.disabled && this.submit(focusUpdated))\n            .on(this._event.FOCUS, (name) => this.focus(name))\n            .on(this._event.BLUR, () => {\n                this.$el.removeClass(this.classNames.FOCUSED);\n                this.disable();\n            })\n            .on(this._event.SUBMIT_STARTED, () => this._submitStarted())\n            .on(this._event.SUBMIT_FINISHED, () => this._submitFinished());\n    },\n\n    /**\n     * Renders default cell contents\n     *\n     * @param data\n     */\n    defaultColumnRenderer: function (data) {\n        if (data.allowEdit !== false) {\n            return $(\"<input type='text' />\").addClass('text').attr({\n                'name': data.name,\n                'value': data.value,\n                'aria-label': data.ariaLabel,\n            });\n        } else if (data.value) {\n            return document.createTextNode(data.value);\n        }\n    },\n\n    /**\n     * Renders drag handle\n     * @return jQuery\n     */\n    renderDragHandle: function () {\n        return '<span class=\"' + this.classNames.DRAG_HANDLE + '\"></span></td>';\n    },\n\n    /**\n     * Executes cancel event if ESC is pressed\n     *\n     * @param {Event} e\n     */\n    _handleKeyUpEvent: function (e) {\n        if (e.keyCode === 27) {\n            this.trigger(this._event.CANCEL);\n        }\n    },\n\n    /**\n     * Fires cancel event\n     *\n     * @param {Event} e\n     *\n     * @return EditRow\n     */\n    _cancel: function (e) {\n        this.trigger(this._event.CANCEL);\n        e.preventDefault();\n        return this;\n    },\n\n    /**\n     * Disables events/fields and adds safe guard against double submitting\n     *\n     * @return EditRow\n     */\n    _submitStarted: function () {\n        this.submitting = true;\n        this.showLoading().disable().delegateEvents({});\n\n        return this;\n    },\n\n    /**\n     * Enables events & fields\n     *\n     * @return EditRow\n     */\n    _submitFinished: function () {\n        this.submitting = false;\n        this.hideLoading().enable().delegateEvents(this.events);\n\n        return this;\n    },\n\n    /**\n     * Handles dom focus event, by only focusing row if it isn't already\n     *\n     * @param {Event} e\n     *\n     * @return EditRow\n     */\n    _focus: function (e) {\n        if (!this.hasFocus()) {\n            this.trigger(this._event.FOCUS, e.target.name);\n        }\n        return this;\n    },\n\n    /**\n     * Returns true if row has focused class\n     *\n     * @return Boolean\n     */\n    hasFocus: function () {\n        return this.$el.hasClass(this.classNames.FOCUSED);\n    },\n\n    /**\n     * Focus specified field (by name or id - first argument), first field with an error or first field (DOM order)\n     *\n     * @param name\n     *\n     * @return EditRow\n     */\n    focus: function (name) {\n        var $focus;\n        var $error;\n\n        this.enable();\n\n        if (name) {\n            $focus = this.$el.find(this.fieldFocusSelector(name));\n        } else {\n            $error = this.$el.find(this.classNames.ERROR + ':first');\n\n            if ($error.length === 0) {\n                $focus = this.$el.find(':input:text:first');\n            } else {\n                $focus = $error.parent().find(':input');\n            }\n        }\n\n        this.$el.addClass(this.classNames.FOCUSED);\n        $focus.trigger('focus').trigger('select');\n\n        return this;\n    },\n\n    /**\n     * Disables all fields\n     *\n     * @return EditRow\n     */\n    disable: function () {\n        var $replacementSubmit;\n        var $submit;\n\n        // firefox does not allow you to submit a form if there are 2 or more submit buttons in a form, even if all but\n        // one is disabled. It also does not let you change the type=\"submit' to type=\"button\". Therfore he lies the hack.\n        if (isFirefox) {\n            $submit = this.$el.find(':submit');\n\n            if ($submit.length) {\n                $replacementSubmit = $(\n                    \"<input type='submit' class='\" + this.classNames.SUBMIT + \"' />\"\n                )\n                    .addClass($submit.attr('class'))\n                    .val($submit.val())\n                    .data(this.dataKeys.ENABLED_SUBMIT, $submit);\n\n                $submit.replaceWith($replacementSubmit);\n            }\n        }\n\n        this.$el.addClass(this.classNames.DISABLED).find(':submit').prop('disabled', true);\n\n        return this;\n    },\n\n    /**\n     * Enables all fields\n     *\n     * @return EditRow\n     */\n    enable: function () {\n        var $placeholderSubmit;\n        var $submit;\n\n        // firefox does not allow you to submit a form if there are 2 or more submit buttons in a form, even if all but\n        // one is disabled. It also does not let you change the type=\"submit' to type=\"button\". Therfore he lies the hack.\n        if (isFirefox) {\n            $placeholderSubmit = this.$el.find(this.classNames.SUBMIT);\n            $submit = $placeholderSubmit.data(this.dataKeys.ENABLED_SUBMIT);\n\n            if ($submit && $placeholderSubmit.length) {\n                $placeholderSubmit.replaceWith($submit);\n            }\n        }\n\n        this.$el.removeClass(this.classNames.DISABLED).find(':submit').prop('disabled', false);\n\n        return this;\n    },\n\n    /**\n     * Shows loading indicator\n     *\n     * @return EditRow\n     */\n    showLoading: function () {\n        appendStatusSpinner(this.$el);\n        return this;\n    },\n\n    /**\n     * Hides loading indicator\n     *\n     * @return EditRow\n     */\n    hideLoading: function () {\n        removeStatusSpinner(this.$el);\n        return this;\n    },\n\n    /**\n     * If any of the fields have changed\n     *\n     * @return {Boolean}\n     */\n    hasUpdates: function () {\n        return !!this.mapSubmitParams(this.serializeObject());\n    },\n\n    /**\n     * Serializes the view into model representation.\n     * Default implementation uses simple jQuery plugin to serialize form fields into object\n     *\n     * @return Object\n     */\n    serializeObject: function () {\n        var $el = this.$el;\n        return $el.serializeObject ? $el.serializeObject() : $el.serialize();\n    },\n\n    mapSubmitParams: function (params) {\n        return this.model.changedAttributes(params);\n    },\n\n    /**\n     * Handle submission of new entries and editing of old.\n     *\n     * @param {Boolean} focusUpdated - flag of whether to focus read-only view after succssful submission\n     *\n     * @return EditRow\n     */\n    submit: function (focusUpdated) {\n        var instance = this;\n        var values;\n\n        // IE doesnt like it when the focused element is removed\n        if (document.activeElement !== window) {\n            $(document.activeElement).trigger('blur');\n        }\n\n        if (this.isUpdateMode) {\n            values = this.mapSubmitParams(this.serializeObject()); // serialize form fields into JSON\n\n            if (!values) {\n                return instance.trigger(instance._event.CANCEL);\n            }\n        } else {\n            this.model.clear();\n            values = this.mapSubmitParams(this.serializeObject()); // serialize form fields into JSON\n        }\n\n        this.trigger(this._event.SUBMIT_STARTED);\n\n        /* Attempt to add to server model. If fail delegate to createView to render errors etc. Otherwise,\n         add a new model to this._models and render a row to represent it. */\n        this.model.save(values, {\n            success: function () {\n                if (instance.isUpdateMode) {\n                    instance.trigger(instance._event.UPDATED, instance.model, focusUpdated);\n                } else {\n                    instance.trigger(instance._event.CREATED, instance.model.toJSON());\n\n                    instance.model = new instance._modelClass(); // reset\n\n                    instance.render({ errors: {}, values: {} }); // pulls in instance's model for create row\n                    instance.trigger(instance._event.FOCUS);\n                }\n\n                instance.trigger(instance._event.SUBMIT_FINISHED);\n            },\n\n            error: function (model, data, xhr) {\n                if (xhr.status === 400) {\n                    instance.renderErrors(data.errors);\n                    instance.trigger(instance._event.VALIDATION_ERROR, data.errors);\n                }\n\n                instance.trigger(instance._event.SUBMIT_FINISHED);\n            },\n\n            silent: true,\n        });\n\n        return this;\n    },\n\n    /**\n     * Render an error message\n     *\n     * @param msg\n     *\n     * @return {jQuery}\n     */\n    renderError: function (name, msg) {\n        return $('<div></div>').attr('data-field', name).addClass(this.classNames.ERROR).text(msg);\n    },\n\n    /**\n     * Render and append error messages. The property name will be matched to the input name to determine which cell to\n     * append the error message to. If this does not meet your needs please extend this method.\n     *\n     * @param errors\n     */\n    renderErrors: function (errors) {\n        var instance = this;\n\n        this.$('.' + this.classNames.ERROR).remove(); // avoid duplicates\n\n        if (errors) {\n            $.each(errors, function (name, msg) {\n                instance.$el\n                    .find(\"[name='\" + name + \"']\")\n                    .closest('td')\n                    .append(instance.renderError(name, msg));\n            });\n        }\n\n        return this;\n    },\n\n    /**\n     * Handles rendering of row\n     *\n     * @param {Object} renderData\n     * ... {Object} vales - Values of fields\n     */\n    render: function (renderData) {\n        var instance = this;\n\n        this.$el.empty();\n\n        if (this.allowReorder) {\n            $('<td class=\"' + this.classNames.ORDER + '\"></td>')\n                .append(this.renderDragHandle())\n                .appendTo(instance.$el);\n        }\n\n        $.each(this.columns, function (i, column) {\n            var contents;\n            var $cell;\n            var value = renderData.values[column.id];\n            var args = [\n                {\n                    name: column.id,\n                    ariaLabel: column.inputAriaLabel ? column.inputAriaLabel : column.header,\n                    value: value,\n                    allowEdit: column.allowEdit,\n                },\n                renderData.values,\n                instance.model,\n            ];\n            if (value) {\n                instance.$el.attr('data-' + column.id, value); // helper for webdriver testing\n            }\n\n            if (instance.isCreateRow && column.createView) {\n                // TODO AUI-1058 - The row's model should be guaranteed to be in the correct state by this point.\n                contents = new column.createView({\n                    model: instance.model,\n                }).render(args[0]);\n            } else if (column.editView) {\n                contents = new column.editView({\n                    model: instance.model,\n                }).render(args[0]);\n            } else {\n                contents = instance.defaultColumnRenderer.apply(instance, args);\n            }\n\n            $cell = $('<td></td>');\n\n            if (typeof contents === 'object' && contents.done) {\n                contents.done(function (contents) {\n                    $cell.append(contents);\n                });\n            } else {\n                $cell.append(contents);\n            }\n\n            if (column.styleClass) {\n                $cell.addClass(column.styleClass);\n            }\n\n            $cell.appendTo(instance.$el);\n        });\n\n        this.$el\n            .append(this.renderOperations(renderData.update, renderData.values)) // add submit/cancel buttons\n            .addClass(this.classNames.ROW + ' ' + this.classNames.EDIT_ROW);\n\n        this.trigger(this._event.RENDER, this.$el, renderData.values);\n        this.$el.trigger(this._event.CONTENT_REFRESHED, [this.$el]);\n\n        return this;\n    },\n\n    /**\n     * Gets markup for add/update and cancel buttons\n     *\n     * @param {Boolean} update\n     */\n    renderOperations: function (update) {\n        var $operations = $('<td class=\"aui-restfultable-operations\"></td>');\n\n        if (update) {\n            $operations\n                .append(\n                    $('<input class=\"aui-button aui-button-primary\" type=\"submit\" />').attr({\n                        accesskey: this.submitAccessKey,\n                        value: I18n.getText('aui.words.update'),\n                    })\n                )\n                .append(\n                    $('<a class=\"aui-button aui-button-link\" href=\"#\"></a>')\n                        .addClass(this.classNames.CANCEL)\n                        .text(I18n.getText('aui.words.cancel'))\n                        .attr({\n                            accesskey: this.cancelAccessKey,\n                        })\n                );\n        } else {\n            $operations.append(\n                $('<input class=\"aui-button aui-button-primary\" type=\"submit\" />').attr({\n                    accesskey: this.submitAccessKey,\n                    value: I18n.getText('aui.words.add'),\n                })\n            );\n        }\n\n        return $operations.add($(`<td class=\"${this.classNames.STATUS}\"></td>`));\n    },\n});\n","import $ from '../jquery';\n\nconst eventRoot = document || {};\nconst $eventTarget = $(eventRoot);\n\n/**\n * Triggers a custom event on the AJS object\n *\n * @param {String} name - name of event\n * @param {Array} args - args for event handler\n */\nfunction triggerEvt(name, args) {\n    $eventTarget.trigger(name, args);\n}\n\n/**\n * Binds handler to the AJS object\n *\n * @param {String} name\n * @param {Function} func\n */\nfunction bindEvt(name, func) {\n    $eventTarget.on(name, func);\n}\n\n/**\n * Some generic error handling that fires event in multiple contexts\n * - on AJS object\n * - on Instance\n * - on AJS object with prefixed id.\n *\n * @param evt\n * @param inst\n * @param args\n */\nfunction triggerEvtForInst(evt, inst, args) {\n    $(inst).trigger(evt, args);\n    triggerEvt(evt, args);\n    if (inst.id) {\n        triggerEvt(inst.id + '-' + evt, args);\n    }\n}\n\nexport { bindEvt, triggerEvt, triggerEvtForInst };\n","const parseJSON = (data) => {\n    return JSON.parse(data || 'null');\n};\n\nexport default parseJSON;\n","import $ from '../jquery';\nimport { triggerEvtForInst } from './event-handlers';\nimport { isEmpty, isEqual } from 'underscore';\nimport Backbone from 'backbone';\nimport events from './event-names';\nimport parseJSON from '../internal/parse-json';\n\n/**\n * A class provided to fill some gaps with the out of the box Backbone.Model class. Most notiably the inability\n * to send ONLY modified attributes back to the server.\n */\nvar EntryModel = Backbone.Model.extend({\n    sync: function (method, model, options) {\n        var instance = this;\n        var oldError = options.error;\n\n        options.error = function (xhr) {\n            instance._serverErrorHandler(xhr, this);\n            if (oldError) {\n                oldError.apply(this, arguments);\n            }\n        };\n\n        return Backbone.sync.apply(Backbone, arguments);\n    },\n\n    /**\n     * Overrides default save handler to only save (send to server) attributes that have changed.\n     * Also provides some default error handling.\n     *\n     * @override\n     * @param attributes\n     * @param options\n     */\n    save: function (attributes, options) {\n        options = options || {};\n\n        var instance = this;\n        var Model;\n        var syncModel;\n        var error = options.error; // we override, so store original\n        var success = options.success;\n\n        // override error handler to provide some defaults\n        options.error = function (model, xhr) {\n            var data = parseJSON(xhr.responseText || xhr.data);\n\n            // call original error handler\n            if (error) {\n                error.call(instance, instance, data, xhr);\n            }\n        };\n\n        // if it is a new model, we don't have to worry about updating only changed attributes because they are all new\n        if (this.isNew()) {\n            // call super\n            Backbone.Model.prototype.save.call(this, attributes, options);\n\n            // only go to server if something has changed\n        } else if (attributes) {\n            // create temporary model\n            Model = EntryModel.extend({\n                url: this.url(),\n            });\n\n            syncModel = new Model({\n                id: this.id,\n            });\n\n            syncModel.save = Backbone.Model.prototype.save;\n\n            options.success = function (model, xhr) {\n                // update original model with saved attributes\n                instance.clear().set(model.toJSON());\n\n                // call original success handler\n                if (success) {\n                    success.call(instance, instance, xhr);\n                }\n            };\n\n            // update temporary model with the changed attributes\n            syncModel.save(attributes, options);\n        }\n    },\n\n    /**\n     * Destroys the model on the server. We need to override the default method as it does not support sending of\n     * query paramaters.\n     *\n     * @override\n     * @param {object} [options]\n     * @param {function} options.success - Server success callback\n     * @param {function} options.error - Server error callback\n     * @param {object} options.data\n     *\n     * @return EntryModel\n     */\n    destroy: function (options) {\n        options = options || {};\n\n        var instance = this;\n        var url = this.url();\n\n        $.ajax({\n            url: url,\n            type: 'DELETE',\n            dataType: 'json',\n            data: options.data || {},\n            contentType: 'application/json',\n            success(data) {\n                if (instance.collection) {\n                    instance.collection.remove(instance);\n                }\n                if (options.success) {\n                    options.success.call(instance, data);\n                }\n            },\n            error(xhr) {\n                instance._serverErrorHandler(xhr, this);\n                if (options.error) {\n                    options.error.call(instance, xhr);\n                }\n            },\n        });\n\n        return this;\n    },\n\n    /**\n     * A more complex lookup for changed attributes then default backbone one.\n     *\n     * @param attributes\n     */\n    changedAttributes: function (attributes) {\n        var changed = {};\n        var current = this.toJSON();\n\n        $.each(attributes, function (name, value) {\n            if (!current[name]) {\n                if (typeof value === 'string') {\n                    if (value.trim() !== '') {\n                        changed[name] = value;\n                    }\n                } else if (Array.isArray(value)) {\n                    if (value.length !== 0) {\n                        changed[name] = value;\n                    }\n                } else {\n                    changed[name] = value;\n                }\n            } else if (current[name] && current[name] !== value) {\n                if (typeof value === 'object') {\n                    if (!isEqual(value, current[name])) {\n                        changed[name] = value;\n                    }\n                } else {\n                    changed[name] = value;\n                }\n            }\n        });\n\n        if (!isEmpty(changed)) {\n            this.addExpand(changed);\n            return changed;\n        }\n    },\n\n    /**\n     * Useful point to override if you always want to add an expand to your rest calls.\n     *\n     * @param changed attributes that have already changed\n     */\n    addExpand: function (changed) {}, // eslint-disable-line no-unused-vars\n\n    /**\n     * Throws a server error event unless user input validation error (status 400)\n     *\n     * @param xhr\n     * @param ajaxOptions\n     */\n    _serverErrorHandler: function (xhr, ajaxOptions) {\n        var data;\n        if (xhr.status !== 400) {\n            data = parseJSON(xhr.responseText || xhr.data);\n            triggerEvtForInst(events.SERVER_ERROR, this, [data, xhr, ajaxOptions]);\n        }\n    },\n\n    /**\n     * Fetches values, with some generic error handling\n     *\n     * @override\n     * @param options\n     */\n    fetch: function (options) {\n        options = options || {};\n\n        // clear the model, so we do not merge the old with the new\n        this.clear();\n\n        // call super\n        Backbone.Model.prototype.fetch.call(this, options);\n    },\n});\n\nexport default EntryModel;\n","import $ from '../jquery';\nimport Backbone from 'backbone';\nimport { I18n } from '../i18n';\nimport classNames from './class-names';\nimport dataKeys from './data-keys';\nimport events from './event-names';\nimport { appendStatusSpinner, removeStatusSpinner } from './spinner';\n\n/**\n * An abstract class that gives the required behaviour for RestfulTable rows.\n * Extend this class and pass it as the {views.row} property of the options passed to RestfulTable in construction.\n */\nexport default Backbone.View.extend({\n    tagName: 'tr',\n\n    events: {\n        'click .aui-restfultable-editable': 'edit',\n    },\n\n    initialize: function (options) {\n        options = options || {};\n\n        this._event = events;\n        this.classNames = classNames;\n        this.dataKeys = dataKeys;\n        this.columns = options.columns;\n        this.allowEdit = options.allowEdit;\n        this.allowDelete = options.allowDelete;\n\n        if (!this.events['click .aui-restfultable-editable']) {\n            throw new Error(\n                'It appears you have overridden the events property. To add events you will need to use' +\n                    'a work around. https://github.com/documentcloud/backbone/issues/244'\n            );\n        }\n\n        this.index = options.index || 0;\n        this.deleteConfirmationCallback = options.deleteConfirmationCallback;\n        this.allowReorder = options.allowReorder;\n        this.$el = $(this.el);\n\n        this.on(this._event.CANCEL, () => (this.disabled = true))\n            .on(this._event.FOCUS, (field) => this.focus(field))\n            .on(this._event.BLUR, () => this.unfocus())\n            .on(this._event.MODAL, () => this.$el.addClass(this.classNames.ACTIVE))\n            .on(this._event.MODELESS, () => this.$el.removeClass(this.classNames.ACTIVE));\n    },\n\n    /**\n     * Renders drag handle\n     *\n     * @return jQuery\n     */\n    renderDragHandle: function () {\n        return '<span class=\"' + this.classNames.DRAG_HANDLE + '\"></span></td>';\n    },\n\n    /**\n     * Renders default cell contents\n     *\n     * @param data\n     *\n     * @return {undefiend, String}\n     */\n    defaultColumnRenderer: function (data) {\n        if (data.value) {\n            return document.createTextNode(data.value.toString());\n        }\n    },\n\n    /**\n     * Save changed attributes back to server and re-render\n     *\n     * @param attr\n     *\n     * @return {Row}\n     */\n    sync: function (attr) {\n        var instance = this;\n\n        this.model.addExpand(attr);\n        this.showLoading();\n        this.model.save(attr, {\n            success: function () {\n                instance.hideLoading().render();\n                instance.trigger(instance._event.UPDATED);\n            },\n            error: function () {\n                instance.hideLoading();\n            },\n        });\n\n        return this;\n    },\n\n    /**\n     * Get model from server and re-render\n     *\n     * @return {Row}\n     */\n    refresh: function (success, error) {\n        var instance = this;\n\n        this.showLoading();\n        this.model.fetch({\n            success: function () {\n                instance.hideLoading().render();\n                if (success) {\n                    success.apply(this, arguments);\n                }\n            },\n            error: function () {\n                instance.hideLoading();\n                if (error) {\n                    error.apply(this, arguments);\n                }\n            },\n        });\n\n        return this;\n    },\n\n    /**\n     * Returns true if row has focused class\n     *\n     * @return Boolean\n     */\n    hasFocus: function () {\n        return this.$el.hasClass(this.classNames.FOCUSED);\n    },\n\n    /**\n     * Adds focus class (Item has been recently updated)\n     *\n     * @return Row\n     */\n    focus: function () {\n        $(this.el).addClass(this.classNames.FOCUSED);\n        return this;\n    },\n\n    /**\n     * Removes focus class\n     *\n     * @return Row\n     */\n    unfocus: function () {\n        $(this.el).removeClass(this.classNames.FOCUSED);\n        return this;\n    },\n\n    /**\n     * Adds loading class (to show server activity)\n     *\n     * @return Row\n     */\n    showLoading: function () {\n        appendStatusSpinner(this.$el);\n        return this;\n    },\n\n    /**\n     * Hides loading class (to show server activity)\n     *\n     * @return Row\n     */\n    hideLoading: function () {\n        removeStatusSpinner(this.$el);\n        return this;\n    },\n\n    /**\n     * Switches row into edit mode\n     *\n     * @param e\n     */\n    edit: function (e) {\n        var field;\n        if ($(e.target).is('.' + this.classNames.EDITABLE)) {\n            field = $(e.target).attr('data-field-name');\n        } else {\n            field = $(e.target)\n                .closest('.' + this.classNames.EDITABLE)\n                .attr('data-field-name');\n        }\n        this.trigger(this._event.ROW_EDIT, field);\n        return this;\n    },\n\n    /**\n     * Can be overriden to add custom options.\n     *\n     * @returns {jQuery}\n     */\n    renderOperations: function () {\n        var instance = this;\n        if (this.allowDelete !== false) {\n            return $(\"<a href='#' class='aui-button'></a>\")\n                .addClass(this.classNames.DELETE)\n                .text(I18n.getText('aui.words.delete'))\n                .on('click', function (e) {\n                    e.preventDefault();\n                    instance.destroy();\n                });\n        }\n    },\n\n    /**\n     * Removes entry from table.\n     *\n     * @returns {undefined}\n     */\n    destroy: function () {\n        if (this.deleteConfirmationCallback) {\n            let promise = this.deleteConfirmationCallback(this.model.toJSON());\n            if (promise && promise.then) {\n                promise.then(\n                    () => this.model.destroy(),\n                    () => {}\n                );\n            } else {\n                throw new Error('deleteConfirmationCallback needs to return a Promise');\n            }\n        } else {\n            this.model.destroy();\n        }\n    },\n\n    /**\n     * Renders a generic edit row. You probably want to override this in a sub class.\n     *\n     * @return Row\n     */\n    render: function () {\n        var instance = this;\n        var renderData = this.model.toJSON();\n        var $opsCell = $(\"<td class='aui-restfultable-operations'></td>\").append(\n            this.renderOperations({}, renderData)\n        );\n        var $throbberCell = $(`<td class=\"${this.classNames.STATUS}\"></td>`);\n        // restore state\n        this.$el\n            .removeClass(\n                this.classNames.DISABLED +\n                    ' ' +\n                    this.classNames.FOCUSED +\n                    ' ' +\n                    this.classNames.EDIT_ROW\n            )\n            .addClass(this.classNames.READ_ONLY)\n            .empty();\n\n        if (this.allowReorder) {\n            $('<td  class=\"' + this.classNames.ORDER + '\"></td>')\n                .append(this.renderDragHandle())\n                .appendTo(instance.$el);\n        }\n\n        this.$el.attr('data-id', this.model.id); // helper for webdriver testing\n\n        $.each(this.columns, function (i, column) {\n            var contents;\n            var $cell = $('<td></td>');\n            var value = renderData[column.id];\n            var fieldName = column.fieldName || column.id;\n            var args = [\n                { name: fieldName, value: value, allowEdit: column.allowEdit },\n                renderData,\n                instance.model,\n            ];\n\n            if (value) {\n                instance.$el.attr('data-' + column.id, value); // helper for webdriver testing\n            }\n\n            if (column.readView) {\n                contents = new column.readView({\n                    model: instance.model,\n                }).render(args[0]);\n            } else {\n                contents = instance.defaultColumnRenderer.apply(instance, args);\n            }\n\n            if (instance.allowEdit !== false && column.allowEdit !== false) {\n                var $editableRegion = $('<span></span>')\n                    .addClass(instance.classNames.EDITABLE)\n                    .append('<span class=\"aui-icon aui-icon-small aui-iconfont-edit\"></span>')\n                    .append(contents)\n                    .attr('data-field-name', fieldName);\n\n                $cell = $('<td></td>').append($editableRegion).appendTo(instance.$el);\n\n                if (!contents || !String(contents).trim()) {\n                    $cell.addClass(instance.classNames.NO_VALUE);\n                    $editableRegion.html(\n                        $('<em></em>').text(this.emptyText || I18n.getText('aui.enter.value'))\n                    );\n                }\n            } else {\n                $cell.append(contents);\n            }\n\n            if (column.styleClass) {\n                $cell.addClass(column.styleClass);\n            }\n\n            $cell.appendTo(instance.$el);\n        });\n\n        this.$el\n            .append($opsCell)\n            .append($throbberCell)\n            .addClass(this.classNames.ROW + ' ' + this.classNames.READ_ONLY);\n\n        this.trigger(this._event.RENDER, this.$el, renderData);\n        this.$el.trigger(this._event.CONTENT_REFRESHED, [this.$el]);\n\n        return this;\n    },\n});\n","import $ from './jquery';\nimport 'jquery-ui/ui/widget';\nimport 'jquery-ui/ui/widgets/mouse';\nimport 'jquery-ui/ui/widgets/draggable';\nimport 'jquery-ui/ui/widgets/sortable';\nimport * as logger from './internal/log';\nimport Backbone from 'backbone';\nimport classNames from './restful-table/class-names';\nimport CustomCreateView from './restful-table/custom-create-view';\nimport CustomEditView from './restful-table/custom-edit-view';\nimport CustomReadView from './restful-table/custom-read-view';\nimport dataKeys from './restful-table/data-keys';\nimport EditRow from './restful-table/edit-row';\nimport EntryModel from './restful-table/entry-model';\nimport { triggerEvtForInst } from './restful-table/event-handlers';\nimport events from './restful-table/event-names';\nimport globalize from './internal/globalize';\nimport Row from './restful-table/row';\nimport { I18n } from './i18n';\nimport { spinner } from './restful-table/spinner';\nimport parseJSON from './internal/parse-json';\n\n/**\n * A table whose entries/rows can be retrieved, added and updated via REST (CRUD).\n * It uses backbone.js to sync the table's state back to the server, avoiding page refreshes.\n *\n * @class RestfulTable\n */\nvar RestfulTable = Backbone.View.extend({\n    /**\n     * @param {!Object} options\n     * ... {!Object} resources\n     * ... ... {(string|function(function(Array.<Object>)))} all - URL of REST resource OR function that retrieves all entities.\n     * ... ... {string} self - URL of REST resource to sync a single entities state (CRUD).\n     * ... {!(selector|Element|jQuery)} el - Table element or selector of the table element to populate.\n     * ... {!Array.<Object>} columns - Which properties of the entities to render. The id of a column maps to the property of an entity.\n     * ... {Object} views\n     * ... ... {RestfulTable.EditRow} editRow - Backbone view that renders the edit & create row. Your view MUST extend RestfulTable.EditRow.\n     * ... ... {RestfulTable.Row} row - Backbone view that renders the readonly row. Your view MUST extend RestfulTable.Row.\n     * ... {boolean} allowEdit - Is the table editable. If true, clicking row will switch it to edit state. Default true.\n     * ... {boolean} allowDelete - Can entries be removed from the table, default true.\n     * ... {boolean} allowCreate - Can new entries be added to the table, default true.\n     * ... {boolean} allowReorder - Can we drag rows to reorder them, default false.\n     * ... {boolean} autoFocus - Automatically set focus to first field on init, default false.\n     * ... {boolean} reverseOrder - Reverse the order of rows, default false.\n     * ... {boolean} silent - Do not trigger a \"refresh\" event on sort, default false.\n     * ... {String} id - The id for the table. This id will be used to fire events specific to this instance.\n     * ... {string} createPosition - If set to \"bottom\", place the create form at the bottom of the table instead of the top.\n     * ... {string} addPosition - If set to \"bottom\", add new rows at the bottom of the table instead of the top. If undefined, createPosition will be used to define where to add the new row.\n     * ... {string} noEntriesMsg - Text to display under the table header if it is empty, default empty.\n     * ... {string} loadingMsg - Text/HTML to display while loading, default \"Loading\".\n     * ... {string} submitAccessKey - Access key for submitting.\n     * ... {string} cancelAccessKey - Access key for canceling.\n     * ... @property {RestfulTable~deleteConfirmationCallback} deleteConfirmationCallback - function returning Promise determining if row should be deleted or not\n     * ... {function(string): (selector|jQuery|Element)} fieldFocusSelector - Element to focus on given a name.\n     * ... {EntryModel} model - Backbone model representing a row, default EntryModel.\n     * ... {Backbone.Collection} Collection - Backbone collection representing the entire table, default Backbone.Collection.\n     * @callback deleteConfirmationCallback\n     */\n    initialize: function (options) {\n        var instance = this;\n\n        // combine default and user options\n        instance.options = $.extend(true, instance._getDefaultOptions(options), options);\n\n        // Prefix events for this instance with this id.\n        instance.id = this.options.id;\n\n        // faster lookup\n        instance._event = events;\n        instance.classNames = classNames;\n        instance.dataKeys = dataKeys;\n\n        // shortcuts to popular elements\n        this.$table = $(options.el)\n            .addClass(this.classNames.RESTFUL_TABLE)\n            .addClass(this.classNames.ALLOW_HOVER)\n            .addClass('aui');\n\n        this.$table.wrapAll(\"<form class='aui' action='#'>\");\n\n        this.$thead = $('<thead>');\n        this.$theadRow = $('<tr>').appendTo(this.$thead);\n        this.$tbody = $('<tbody>');\n\n        if (!this.$table.length) {\n            throw new Error(\n                'RestfulTable: Init failed! The table you have specified [' +\n                    this.$table.selector +\n                    '] cannot be found.'\n            );\n        }\n\n        if (!this.options.columns) {\n            throw new Error(\n                \"RestfulTable: Init failed! You haven't provided any columns to render.\"\n            );\n        }\n\n        if (\n            this.options.deleteConfirmationCallback &&\n            !(this.options.deleteConfirmationCallback instanceof Function)\n        ) {\n            throw new Error(\n                'RestfulTable: Init failed! deleteConfirmationCallback is not a function'\n            );\n        }\n\n        // Let user know the table is loading\n        this.showGlobalLoading();\n        this.options.columns.forEach(function (column) {\n            var header = typeof column.header === 'function' ? column.header() : column.header;\n            if (typeof header === 'undefined') {\n                logger.warn(\n                    'You have not specified [header] for column [' +\n                        column.id +\n                        ']. Using id for now...'\n                );\n                header = column.id;\n            }\n\n            instance.$theadRow.append('<th>' + header + '</th>');\n        });\n\n        // columns for submit buttons and loading indicator used when editing\n        instance.$theadRow.append('<th></th><th></th>');\n\n        // create a new Backbone collection to represent rows (http://documentcloud.github.com/backbone/#Collection)\n        this._models = this._createCollection();\n\n        // shortcut to the class we use to create rows\n        this._rowClass = this.options.views.row;\n\n        this.editRows = []; // keep track of rows that are being edited concurrently\n\n        this.$table.closest('form').on('submit', function (e) {\n            if (instance.focusedRow) {\n                // Delegates saving of row. See EditRow.submit\n                instance.focusedRow.trigger(instance._event.SAVE);\n            }\n            e.preventDefault();\n        });\n\n        if (this.options.allowReorder) {\n            // Add allowance for another cell to the <thead>\n            this.$theadRow.prepend('<th>');\n\n            // Allow drag and drop reordering of rows\n            this.$tbody.sortable({\n                handle: '.' + this.classNames.DRAG_HANDLE,\n                helper: function (e, elt) {\n                    var helper = $('<div>')\n                        .attr('class', elt.attr('class'))\n                        .addClass(instance.classNames.MOVEABLE);\n                    elt.children().each(function () {\n                        var $td = $(this);\n\n                        // .offsetWidth/.outerWidth() is broken in webkit for tables, so we do .clientWidth + borders\n                        // Need to coerce the border-left-width to an in because IE - http://bugs.jquery.com/ticket/10855\n                        var borderLeft = parseInt(0 + $td.css('border-left-width'), 10);\n                        var borderRight = parseInt(0 + $td.css('border-right-width'), 10);\n                        var width = $td[0].clientWidth + borderLeft + borderRight;\n\n                        helper.append(\n                            $('<div>')\n                                .html($td.html())\n                                .attr('class', $td.attr('class'))\n                                .width(width)\n                        );\n                    });\n\n                    helper = $(\"<div class='aui-restfultable-readonly'>\").append(helper); // Basically just to get the styles.\n                    helper.css({ left: elt.offset().left }); // To align with the other table rows, since we've locked scrolling on x.\n                    helper.appendTo(document.body);\n\n                    return helper;\n                },\n                start: function (event, ui) {\n                    var cachedHeight = ui.helper[0].clientHeight;\n                    var $this = ui.placeholder.find('td');\n\n                    // Make sure that when we start dragging widths do not change\n                    ui.item\n                        .addClass(instance.classNames.MOVEABLE)\n                        .children()\n                        .each(function (i) {\n                            $(this).width($this.eq(i).width());\n                        });\n\n                    // Create a <td> to add to the placeholder <tr> to inherit CSS styles.\n                    var td = '<td colspan=\"' + instance.getColumnCount() + '\">&nbsp;</td>';\n\n                    ui.placeholder.html(td).css({\n                        height: cachedHeight,\n                        visibility: 'visible',\n                    });\n\n                    // Stop hover effects etc from occuring as we move the mouse (while dragging) over other rows\n                    instance.getRowFromElement(ui.item[0]).trigger(instance._event.MODAL);\n                },\n                stop: function (event, ui) {\n                    if ($(ui.item[0]).is(':visible')) {\n                        ui.item\n                            .removeClass(instance.classNames.MOVEABLE)\n                            .children()\n                            .attr('style', '');\n\n                        ui.placeholder.removeClass(instance.classNames.ROW);\n\n                        // Return table to a normal state\n                        instance.getRowFromElement(ui.item[0]).trigger(instance._event.MODELESS);\n                    }\n                },\n                update: function (event, ui) {\n                    var context = {\n                        row: instance.getRowFromElement(ui.item[0]),\n                        item: ui.item,\n                        nextItem: ui.item.next(),\n                        prevItem: ui.item.prev(),\n                    };\n\n                    instance.move(context);\n                },\n                axis: 'y',\n                delay: 0,\n                containment: 'document',\n                cursor: 'move',\n                scroll: true,\n                zIndex: 8000,\n            });\n\n            // Prevent text selection while reordering.\n            this.$tbody.on('selectstart mousedown', function (event) {\n                return !$(event.target).is('.' + instance.classNames.DRAG_HANDLE);\n            });\n        }\n\n        if (this.options.allowCreate !== false) {\n            // Create row responsible for adding new entries ...\n            this._createRow = new this.options.views.editRow({\n                columns: this.options.columns,\n                isCreateRow: true,\n                model: this.options.model.extend({\n                    url: function () {\n                        return instance.options.resources.self;\n                    },\n                }),\n                cancelAccessKey: this.options.cancelAccessKey,\n                submitAccessKey: this.options.submitAccessKey,\n                allowReorder: this.options.allowReorder,\n                fieldFocusSelector: this.options.fieldFocusSelector,\n            });\n            this._createRow.on(this._event.CREATED, function (values) {\n                if (\n                    (typeof instance.options.addPosition === 'undefined' &&\n                        instance.options.createPosition === 'bottom') ||\n                    instance.options.addPosition === 'bottom'\n                ) {\n                    instance.addRow(values);\n                } else {\n                    instance.addRow(values, 0);\n                }\n            });\n            this._createRow.on(this._event.VALIDATION_ERROR, function () {\n                this.trigger(instance._event.FOCUS);\n            });\n            this._createRow.render({\n                errors: {},\n                values: {},\n            });\n\n            // ... and appends it as the first row\n            this.$create = $('<tbody class=\"' + this.classNames.CREATE + '\">').append(\n                this._createRow.el\n            );\n\n            // Manage which row has focus\n            this._applyFocusCoordinator(this._createRow);\n\n            // focus create row\n            if (this.options.autoFocus) {\n                this._createRow.trigger(this._event.FOCUS);\n            }\n        }\n\n        // when a model is removed from the collection, remove it from the viewport also\n        this._models.on('remove', function (model) {\n            instance.getRows().forEach(function (row) {\n                if (row.model === model) {\n                    if (row.hasFocus() && instance._createRow) {\n                        instance._createRow.trigger(instance._event.FOCUS);\n                    }\n                    instance.removeRow(row);\n                }\n            });\n        });\n\n        this.fetchInitialResources();\n    },\n\n    fetchInitialResources: function () {\n        var instance = this;\n        if (typeof this.options.resources.all === 'function') {\n            this.options.resources.all(function (entries) {\n                instance.populate(entries);\n            });\n        } else {\n            $.get(this.options.resources.all, function (entries) {\n                instance.populate(entries);\n            });\n        }\n    },\n\n    move: function (context) {\n        var instance = this;\n\n        var createRequest = function (afterElement) {\n            if (!afterElement.length) {\n                return {\n                    position: 'First',\n                };\n            } else {\n                var afterModel = instance.getRowFromElement(afterElement).model;\n                return {\n                    after: afterModel.url(),\n                };\n            }\n        };\n\n        if (context.row) {\n            var data = instance.options.reverseOrder\n                ? createRequest(context.nextItem)\n                : createRequest(context.prevItem);\n\n            $.ajax({\n                url: context.row.model.url() + '/move',\n                type: 'POST',\n                dataType: 'json',\n                contentType: 'application/json',\n                data: JSON.stringify(data),\n                complete: function () {\n                    // hides loading indicator (spinner)\n                    context.row.hideLoading();\n                },\n                success: function (xhr) {\n                    triggerEvtForInst(instance._event.REORDER_SUCCESS, instance, [xhr]);\n                },\n                error: function (xhr) {\n                    var responseData = parseJSON(xhr.responseText || xhr.data);\n                    triggerEvtForInst(instance._event.SERVER_ERROR, instance, [\n                        responseData,\n                        xhr,\n                        this,\n                    ]);\n                },\n            });\n\n            // shows loading indicator (spinner)\n            context.row.showLoading();\n        }\n    },\n\n    _createCollection: function () {\n        var instance = this;\n\n        // create a new Backbone collection to represent rows (http://documentcloud.github.com/backbone/#Collection)\n        var RowsAwareCollection = this.options.Collection.extend({\n            // Force the collection to re-sort itself. You don't need to call this under normal\n            // circumstances, as the set will maintain sort order as each item is added.\n            sort: function (options) {\n                options || (options = {});\n                if (!this.comparator) {\n                    throw new Error('Cannot sort a set without a comparator');\n                }\n                this.tableRows = instance.getRows();\n                this.models = this.sortBy(this.comparator, this);\n                this.tableRows = undefined;\n                if (!options.silent) {\n                    this.trigger('refresh', this, options);\n                }\n                return this;\n            },\n            remove: function (...args) {\n                this.tableRows = instance.getRows();\n                Backbone.Collection.prototype.remove.apply(this, args);\n                this.tableRows = undefined;\n                return this;\n            },\n        });\n\n        return new RowsAwareCollection([], {\n            comparator: function (row) {\n                // sort models in collection based on dom ordering\n                var index;\n\n                var currentTableRows =\n                    this && this.tableRows !== undefined ? this.tableRows : instance.getRows();\n                currentTableRows.some(function (item, i) {\n                    if (item.model.id === row.id) {\n                        index = i;\n                        return true;\n                    }\n                });\n                return index;\n            },\n        });\n    },\n\n    /**\n     * Refreshes table with entries\n     *\n     * @param entries\n     */\n    populate: function (entries) {\n        if (this.options.reverseOrder) {\n            entries.reverse();\n        }\n\n        this.hideGlobalLoading();\n        if (entries && entries.length) {\n            // Empty the models collection\n            this._models.reset([], { silent: true });\n            // Add all the entries to collection and render them\n            this.renderRows(entries);\n            // show message to user if we have no entries\n            if (this.isEmpty()) {\n                this.showNoEntriesMsg();\n            }\n        } else {\n            this.showNoEntriesMsg();\n        }\n\n        // Ok, lets let everyone know that we are done...\n        this.$table.append(this.$thead);\n\n        if (this.options.createPosition === 'bottom') {\n            this.$table.append(this.$tbody).append(this.$create);\n        } else {\n            this.$table.append(this.$create).append(this.$tbody);\n        }\n\n        this.$table.trigger(this._event.INITIALIZED, [this]);\n\n        triggerEvtForInst(this._event.INITIALIZED, this, [this]);\n\n        if (this.options.autoFocus) {\n            this.$table.find(':input:text:first').trigger('focus'); // set focus to first field\n        }\n    },\n\n    /**\n     * Shows loading indicator and text\n     *\n     * @return {RestfulTable}\n     */\n    showGlobalLoading: function () {\n        if (!this.$loading) {\n            this.$loading = $(\n                '<div class=\"aui-restfultable-init\">' +\n                    '<span class=\"aui-restfultable-loading\">' +\n                    spinner +\n                    this.options.loadingMsg +\n                    '</span></div>'\n            );\n        }\n\n        if (!this.$loading.is(':visible')) {\n            this.$loading.insertAfter(this.$table);\n        }\n\n        return this;\n    },\n\n    /**\n     * Hides loading indicator and text\n     * @return {RestfulTable}\n     */\n    hideGlobalLoading: function () {\n        if (this.$loading) {\n            this.$loading.remove();\n        }\n        return this;\n    },\n\n    /**\n     * Adds row to collection and renders it\n     *\n     * @param {Object} values\n     * @param {number} index\n     * @return {RestfulTable}\n     */\n    addRow: function (values, index) {\n        var view;\n        var model;\n\n        if (!values.id) {\n            throw new Error(\n                'RestfulTable.addRow: to add a row values object must contain an id. ' +\n                    'Maybe you are not returning it from your restend point?' +\n                    'Recieved:' +\n                    JSON.stringify(values)\n            );\n        }\n\n        model = new this.options.model(values);\n\n        view = this._renderRow(model, index);\n\n        this._models.add(model);\n        this.removeNoEntriesMsg();\n\n        // Let everyone know we added a row\n        triggerEvtForInst(this._event.ROW_ADDED, this, [view, this]);\n        return this;\n    },\n\n    /**\n     * Provided a view, removes it from display and backbone collection\n     *\n     * @param row {Row} The row to remove.\n     */\n    removeRow: function (row) {\n        this._models.remove(row.model);\n        row.remove();\n\n        if (this.isEmpty()) {\n            this.showNoEntriesMsg();\n        }\n\n        // Let everyone know we removed a row\n        triggerEvtForInst(this._event.ROW_REMOVED, this, [row, this]);\n    },\n\n    /**\n     * Is there any entries in the table\n     *\n     * @return {Boolean}\n     */\n    isEmpty: function () {\n        return this._models.length === 0;\n    },\n\n    /**\n     * Gets all models\n     *\n     * @return {Backbone.Collection}\n     */\n    getModels: function () {\n        return this._models;\n    },\n\n    /**\n     * Gets table body\n     *\n     * @return {jQuery}\n     */\n    getTable: function () {\n        return this.$table;\n    },\n\n    /**\n     * Gets table body\n     *\n     * @return {jQuery}\n     */\n    getTableBody: function () {\n        return this.$tbody;\n    },\n\n    /**\n     * Gets create Row\n     *\n     * @return {EditRow}\n     */\n    getCreateRow: function () {\n        return this._createRow;\n    },\n\n    /**\n     * Gets the number of table columns, accounting for the number of\n     * additional columns added by RestfulTable itself\n     * (such as the drag handle column, buttons and actions columns)\n     *\n     * @return {Number}\n     */\n    getColumnCount: function () {\n        var staticFieldCount = 2; // accounts for the columns allocated to submit buttons and loading indicator\n        if (this.allowReorder) {\n            ++staticFieldCount;\n        }\n        return this.options.columns.length + staticFieldCount;\n    },\n\n    /**\n     * Get the Row that corresponds to the given <tr> element.\n     *\n     * @param {HTMLElement} tr\n     *\n     * @return {Row}\n     */\n    getRowFromElement: function (tr) {\n        return $(tr).data(this.dataKeys.ROW_VIEW);\n    },\n\n    /**\n     * Shows message {options.noEntriesMsg} to the user if there are no entries\n     *\n     * @return {RestfulTable}\n     */\n    showNoEntriesMsg: function () {\n        if (this.$noEntries) {\n            this.$noEntries.remove();\n        }\n\n        this.$noEntries = $('<tr>')\n            .addClass(this.classNames.NO_ENTRIES)\n            .append(\n                $('<td>').attr('colspan', this.getColumnCount()).text(this.options.noEntriesMsg)\n            )\n            .appendTo(this.$tbody);\n\n        return this;\n    },\n\n    /**\n     * Removes message {options.noEntriesMsg} to the user if there ARE entries\n     *\n     * @return {RestfulTable}\n     */\n    removeNoEntriesMsg: function () {\n        if (this.$noEntries && this._models.length > 0) {\n            this.$noEntries.remove();\n        }\n        return this;\n    },\n\n    /**\n     * Gets the Row from their associated <tr> elements\n     *\n     * @return {Array}\n     */\n    getRows: function () {\n        var instance = this;\n        var views = [];\n\n        this.$tbody.find('.' + this.classNames.READ_ONLY).each(function () {\n            var $row = $(this);\n            var view = $row.data(instance.dataKeys.ROW_VIEW);\n\n            if (view) {\n                views.push(view);\n            }\n        });\n\n        return views;\n    },\n\n    /**\n     * Appends entry to end or specified index of table\n     *\n     * @param {EntryModel} model\n     * @param index\n     *\n     * @return {jQuery}\n     */\n    _renderRow: function (model, index) {\n        var instance = this;\n        var $rows = this.$tbody.find('.' + this.classNames.READ_ONLY);\n        var $row;\n        var view;\n\n        view = new this._rowClass({\n            model: model,\n            columns: this.options.columns,\n            allowEdit: this.options.allowEdit,\n            allowDelete: this.options.allowDelete,\n            allowReorder: this.options.allowReorder,\n            deleteConfirmationCallback: this.options.deleteConfirmationCallback,\n        });\n\n        this.removeNoEntriesMsg();\n\n        view.on(this._event.ROW_EDIT, function (field) {\n            triggerEvtForInst(this._event.EDIT_ROW, {}, [this, instance]);\n            instance.edit(this, field);\n        });\n\n        $row = view.render().$el;\n\n        if (index !== -1) {\n            if (typeof index === 'number' && $rows.length !== 0) {\n                $row.insertBefore($rows[index]);\n            } else {\n                this.$tbody.append($row);\n            }\n        }\n\n        $row.data(this.dataKeys.ROW_VIEW, view);\n\n        // deactivate all rows - used in the cases, such as opening a dropdown where you do not want the table editable\n        // or any interactions\n        view.on(this._event.MODAL, function () {\n            instance.$table.removeClass(instance.classNames.ALLOW_HOVER);\n            instance.$tbody.sortable('disable');\n            instance.getRows().forEach(function (row) {\n                if (!instance.isRowBeingEdited(row)) {\n                    row.delegateEvents({}); // clear all events\n                }\n            });\n        });\n\n        // activate all rows - used in the cases, such as opening a dropdown where you do not want the table editable\n        // or any interactions\n        view.on(this._event.MODELESS, function () {\n            instance.$table.addClass(instance.classNames.ALLOW_HOVER);\n            instance.$tbody.sortable('enable');\n            instance.getRows().forEach(function (row) {\n                if (!instance.isRowBeingEdited(row)) {\n                    row.delegateEvents(); // rebind all events\n                }\n            });\n        });\n\n        // ensure that when this row is focused no other are\n        this._applyFocusCoordinator(view);\n\n        this.trigger(this._event.ROW_INITIALIZED, view);\n\n        return view;\n    },\n\n    /**\n     * Returns if the row is edit mode or note.\n     *\n     * @param {Row} row Read-only row to check if being edited.\n     *\n     * @return {Boolean}\n     */\n    isRowBeingEdited: function (row) {\n        var isBeingEdited = false;\n\n        this.editRows.some(function (editRow) {\n            if (editRow.el === row.el) {\n                isBeingEdited = true;\n                return true;\n            }\n        });\n\n        return isBeingEdited;\n    },\n\n    /**\n     * Ensures that when supplied view is focused no others are\n     *\n     * @param {Backbone.View} view\n     * @return {RestfulTable}\n     */\n    _applyFocusCoordinator: function (view) {\n        var instance = this;\n\n        if (!view.hasFocusBound) {\n            view.hasFocusBound = true;\n\n            view.on(this._event.FOCUS, function () {\n                if (instance.focusedRow && instance.focusedRow !== view) {\n                    instance.focusedRow.trigger(instance._event.BLUR);\n                }\n                instance.focusedRow = view;\n                if (view instanceof Row && instance._createRow) {\n                    instance._createRow.enable();\n                }\n            });\n        }\n\n        return this;\n    },\n\n    /**\n     * Remove specified row from collection holding rows being concurrently edited\n     *\n     * @param {EditRow} editView\n     *\n     * @return {RestfulTable}\n     */\n    _removeEditRow: function (editView) {\n        var index = $.inArray(editView, this.editRows);\n        this.editRows.splice(index, 1);\n        return this;\n    },\n\n    /**\n     * Focuses last row still being edited or create row (if it exists)\n     *\n     * @return {RestfulTable}\n     */\n    _shiftFocusAfterEdit: function () {\n        if (this.editRows.length > 0) {\n            this.editRows[this.editRows.length - 1].trigger(this._event.FOCUS);\n        } else if (this._createRow) {\n            this._createRow.trigger(this._event.FOCUS);\n        }\n\n        return this;\n    },\n\n    /**\n     * Evaluate if we save row when we blur. We can only do this when there is one row being edited at a time, otherwise\n     * it causes an infinite loop JRADEV-5325\n     *\n     * @return {boolean}\n     */\n    _saveEditRowOnBlur: function () {\n        return this.editRows.length <= 1;\n    },\n\n    /**\n     * Dismisses rows being edited concurrently that have no changes\n     */\n    dismissEditRows: function () {\n        this.editRows.forEach(function (editRow) {\n            if (!editRow.hasUpdates()) {\n                editRow.trigger(this._event.FINISHED_EDITING);\n            }\n        }, this);\n    },\n\n    /**\n     * Converts readonly row to editable view\n     *\n     * @param {Backbone.View} row\n     * @param {String} field - field name to focus\n     * @return {Backbone.View} editRow\n     */\n    edit: function (row, field) {\n        var instance = this;\n        var editRow = new this.options.views.editRow({\n            el: row.el,\n            columns: this.options.columns,\n            isUpdateMode: true,\n            allowReorder: this.options.allowReorder,\n            fieldFocusSelector: this.options.fieldFocusSelector,\n            model: row.model,\n            cancelAccessKey: this.options.cancelAccessKey,\n            submitAccessKey: this.options.submitAccessKey,\n        });\n        var values = row.model.toJSON();\n\n        values.update = true;\n        editRow\n            .render({\n                errors: {},\n                update: true,\n                values: values,\n            })\n            .on(instance._event.UPDATED, function (model, focusUpdated) {\n                instance._removeEditRow(this);\n                this.off();\n                row.render().delegateEvents(); // render and rebind events\n                row.trigger(instance._event.UPDATED); // trigger blur fade out\n                if (focusUpdated !== false) {\n                    instance._shiftFocusAfterEdit();\n                }\n            })\n            .on(instance._event.VALIDATION_ERROR, function () {\n                this.trigger(instance._event.FOCUS);\n            })\n            .on(instance._event.FINISHED_EDITING, function () {\n                instance._removeEditRow(this);\n                row.render().delegateEvents();\n                this.off(); // avoid any other updating, blurring, finished editing, cancel events being fired\n            })\n            .on(instance._event.CANCEL, function () {\n                instance._removeEditRow(this);\n                this.off(); // avoid any other updating, blurring, finished editing, cancel events being fired\n                row.render().delegateEvents(); // render and re` events\n                instance._shiftFocusAfterEdit();\n            })\n            .on(instance._event.BLUR, function () {\n                instance.dismissEditRows(); // dismiss edit rows that have no changes\n                if (instance._saveEditRowOnBlur()) {\n                    this.trigger(instance._event.SAVE, false); // save row, which if successful will call the updated event above\n                }\n            });\n\n        // Ensure that if focus is pulled to another row, we blur the edit row\n        this._applyFocusCoordinator(editRow);\n\n        // focus edit row, which has the flow on effect of blurring current focused row\n        editRow.trigger(instance._event.FOCUS, field);\n\n        // disables form fields\n        if (instance._createRow) {\n            instance._createRow.disable();\n        }\n\n        this.editRows.push(editRow);\n\n        return editRow;\n    },\n\n    /**\n     * Renders all specified rows\n     *\n     * @param rows {Array<Backbone.Model>} array of objects describing Backbone.Model's to render\n     * @return {RestfulTable}\n     */\n    renderRows: function (rows = []) {\n        var comparator = this._models.comparator;\n        var els = [];\n\n        this._models.comparator = undefined; // disable temporarily, assume rows are sorted\n\n        var models = rows.map((row) => {\n            var model = new this.options.model(row);\n            els.push(this._renderRow(model, -1).el);\n            return model;\n        });\n\n        this._models.add(models, { silent: true });\n        this._models.comparator = comparator;\n        this.removeNoEntriesMsg();\n        this.$tbody.append(els);\n\n        return this;\n    },\n\n    /**\n     * Gets default options\n     *\n     * @param {Object} options\n     */\n    _getDefaultOptions: function (options) {\n        return {\n            model: options.model || EntryModel,\n            allowEdit: true,\n            views: {\n                editRow: EditRow,\n                row: Row,\n            },\n            Collection: Backbone.Collection.extend({\n                url: options.resources.self,\n                model: options.model || EntryModel,\n            }),\n            allowReorder: false,\n            fieldFocusSelector: function (name) {\n                return ':input[name=' + name + '], #' + name;\n            },\n            loadingMsg: options.loadingMsg || I18n.getText('aui.words.loading'),\n        };\n    },\n});\n\nRestfulTable.ClassNames = classNames;\nRestfulTable.CustomCreateView = CustomCreateView;\nRestfulTable.CustomEditView = CustomEditView;\nRestfulTable.CustomReadView = CustomReadView;\nRestfulTable.DataKeys = dataKeys;\nRestfulTable.EditRow = EditRow;\nRestfulTable.EntryModel = EntryModel;\nRestfulTable.Events = events;\nRestfulTable.Row = Row;\n\nglobalize('RestfulTable', RestfulTable);\n\nexport default RestfulTable;\n","import $ from './jquery';\nimport globalize from './internal/globalize';\n\n/**\n * Clones the element specified by the selector and removes the id attribute.\n *\n * @param {String} selector A jQuery selector\n */\nfunction clone(selector) {\n    return $(selector).clone().removeAttr('id');\n}\n\nglobalize('clone', clone);\n\nexport default clone;\n","var DocumentTouch = window.DocumentTouch;\nvar hasTouch = 'ontouchstart' in window || (DocumentTouch && document instanceof DocumentTouch);\nexport default hasTouch;\n","import $ from '../jquery';\n\nfunction replaceAttributeForID($clone, id, value, attribute) {\n    $clone\n        .find(`[${attribute}]`)\n        .attr(attribute, (i, oldValue) => (id === oldValue ? value : undefined));\n}\n\nfunction setCorrespondingTriggersID($clone, id, uuid) {\n    replaceAttributeForID($clone, id, uuid, 'aria-controls');\n    replaceAttributeForID($clone, id, uuid, 'aria-owns');\n}\n\nexport default function deduplicateIDs($clone, uidFunction) {\n    let wrapper = $('<div></div>');\n    wrapper.append($clone);\n    wrapper.find('[id]').each((i, el) => {\n        const uuid = uidFunction(`${el.id}-`);\n        setCorrespondingTriggersID(wrapper, el.id, uuid);\n        el.id = uuid;\n    });\n}\n","import $ from './jquery';\nimport './tooltip';\nimport './navigation';\nimport { I18n } from './i18n';\nimport clone from './clone';\nimport * as deprecate from './internal/deprecation';\nimport globalize from './internal/globalize';\nimport hasTouch from './internal/has-touch';\nimport isInput from './internal/is-input';\nimport keyCode from './key-code';\nimport mediaQuery from './internal/mediaQuery';\nimport skate from './internal/skate';\nimport uid from './unique-id';\nimport widget from './internal/widget';\nimport deduplicateIDs from './internal/deduplicateIDs';\n\nfunction sidebarOffset(sidebar) {\n    return sidebar.offset().top;\n}\n\nfunction Sidebar(selector) {\n    this.$el = $(selector);\n    if (!this.$el.length) {\n        return;\n    }\n    this.$body = $('body');\n    this.$wrapper = this.$el.children('.aui-sidebar-wrapper');\n\n    // Sidebar users should add class=\"aui-page-sidebar\" to the\n    // <body> in the rendered markup (to prevent any potential flicker),\n    // so we add it just in case they forgot.\n    this.$body.addClass('aui-page-sidebar');\n\n    this._previousScrollTop = null;\n    this._previousViewportHeight = null;\n    this._previousViewportWidth = null;\n    this._previousOffsetTop = null;\n\n    this.submenus = new SubmenuManager();\n\n    initializeHandlers(this);\n    constructAllSubmenus(this);\n}\n\nvar FORCE_COLLAPSE_WIDTH = 1240;\nvar EVENT_PREFIX = '_aui-internal-sidebar-';\n\nfunction namespaceEvents(events) {\n    return $.map(events.split(' '), function (event) {\n        return EVENT_PREFIX + event;\n    }).join(' ');\n}\n\nSidebar.prototype.on = function () {\n    var events = arguments[0];\n    var args = Array.prototype.slice.call(arguments, 1);\n    var namespacedEvents = namespaceEvents(events);\n    this.$el.on.apply(this.$el, [namespacedEvents].concat(args));\n    return this;\n};\n\nSidebar.prototype.off = function () {\n    var events = arguments[0];\n    var args = Array.prototype.slice.call(arguments, 1);\n    var namespacedEvents = namespaceEvents(events);\n    this.$el.off.apply(this.$el, [namespacedEvents].concat(args));\n    return this;\n};\n\nSidebar.prototype.setHeight = function (scrollTop, viewportHeight, headerHeight) {\n    var visibleHeaderHeight = Math.max(0, headerHeight - scrollTop);\n    this.$wrapper.height(viewportHeight - visibleHeaderHeight);\n    return this;\n};\n\nSidebar.prototype.setTopPosition = function (scrollTop = window.pageYOffset) {\n    this.$wrapper.toggleClass('aui-is-docked', scrollTop > sidebarOffset(this.$el));\n    return this;\n};\n\nSidebar.prototype.setPosition = deprecate.fn(\n    Sidebar.prototype.setTopPosition,\n    'Sidebar.setPosition',\n    {\n        removeInVersion: '12.0.0',\n        sinceVersion: '7.6.1',\n        alternativeName: 'Sidebar.setTopPosition',\n    }\n);\n\nSidebar.prototype.setLeftPosition = function (scrollLeft = window.pageXOffset) {\n    if (this.$wrapper.hasClass('aui-is-docked')) {\n        this.$wrapper.css({ left: -scrollLeft });\n    }\n    return this;\n};\n\nSidebar.prototype.setCollapsedState = function (viewportWidth) {\n    // Reflow behaviour is implemented as a state machine (hence all\n    // state transitions are enumerated). The rest of the state machine,\n    // e.g., entering the expanded narrow (fly-out) state, is implemented\n    // by the toggle() method.\n    var transition = { collapsed: {}, expanded: {} };\n    transition.collapsed.narrow = {\n        narrow: $.noop,\n        wide: function (s) {\n            s._expand(viewportWidth, true);\n        },\n    };\n    transition.collapsed.wide = {\n        narrow: $.noop, // Becomes collapsed narrow (no visual change).\n        wide: $.noop,\n    };\n    transition.expanded.narrow = {\n        narrow: $.noop,\n        wide: function (s) {\n            s.$body.removeClass('aui-sidebar-collapsed');\n            s.$el.removeClass('aui-sidebar-fly-out');\n        },\n    };\n    transition.expanded.wide = {\n        narrow: function (s) {\n            s._collapse(true);\n        },\n        wide: $.noop,\n    };\n\n    var collapseState = this.isCollapsed() ? 'collapsed' : 'expanded';\n    var oldSize = this.isViewportNarrow(this._previousViewportWidth) ? 'narrow' : 'wide';\n    var newSize = this.isViewportNarrow(viewportWidth) ? 'narrow' : 'wide';\n    transition[collapseState][oldSize][newSize](this);\n    return this;\n};\n\nSidebar.prototype._collapse = function (isResponsive) {\n    if (this.isCollapsed()) {\n        return this;\n    }\n\n    var startEvent = $.Event(EVENT_PREFIX + 'collapse-start', { isResponsive: isResponsive });\n    this.$el.trigger(startEvent);\n    if (startEvent.isDefaultPrevented()) {\n        return this;\n    }\n\n    this.$body.addClass('aui-sidebar-collapsed');\n    this.$el.attr('aria-expanded', 'false');\n    this.$el.removeClass('aui-sidebar-fly-out');\n    this.$el.find(this.submenuTriggersSelector).attr('tabindex', 0);\n    $(this.inlineDialogSelector).attr('responds-to', 'hover');\n\n    if (!this.isAnimated()) {\n        this.$el.trigger($.Event(EVENT_PREFIX + 'collapse-end', { isResponsive: isResponsive }));\n    }\n    return this;\n};\n\nSidebar.prototype.collapse = function () {\n    return this._collapse(false);\n};\n\nSidebar.prototype._expand = function (viewportWidth, isResponsive) {\n    var startEvent = $.Event(EVENT_PREFIX + 'expand-start', { isResponsive: isResponsive });\n    this.$el.trigger(startEvent);\n    if (startEvent.isDefaultPrevented()) {\n        return this;\n    }\n\n    var isViewportNarrow = this.isViewportNarrow(viewportWidth);\n    this.$el.attr('aria-expanded', 'true');\n    this.$body.toggleClass('aui-sidebar-collapsed', isViewportNarrow);\n    this.$el.toggleClass('aui-sidebar-fly-out', isViewportNarrow);\n    this.$el.find(this.submenuTriggersSelector).removeAttr('tabindex');\n    $(this.inlineDialogSelector).removeAttr('responds-to');\n\n    if (!this.isAnimated()) {\n        this.$el.trigger($.Event(EVENT_PREFIX + 'expand-end', { isResponsive: isResponsive }));\n    }\n    return this;\n};\n\nSidebar.prototype.expand = function () {\n    if (this.isCollapsed()) {\n        this._expand(this._previousViewportWidth, false);\n    }\n    return this;\n};\n\nSidebar.prototype.isAnimated = function () {\n    return this.$el.hasClass('aui-is-animated');\n};\n\nSidebar.prototype.isCollapsed = function () {\n    return this.$el.attr('aria-expanded') === 'false';\n};\n\nSidebar.prototype.isViewportNarrow = function (viewportWidth) {\n    viewportWidth = viewportWidth === undefined ? this._previousViewportWidth : viewportWidth;\n    return viewportWidth < FORCE_COLLAPSE_WIDTH;\n};\n\nSidebar.prototype.responsiveReflow = function responsiveReflow(isInitialPageLoad, viewportWidth) {\n    if (isInitialPageLoad) {\n        if (!this.isCollapsed() && this.isViewportNarrow(viewportWidth)) {\n            var isAnimated = this.isAnimated();\n            if (isAnimated) {\n                this.$el.removeClass('aui-is-animated');\n            }\n            // This will trigger the \"collapse\" event before non-sidebar\n            // JS code has a chance to bind listeners; they'll need to\n            // check isCollapsed() if they care about the value at that\n            // time.\n            this.collapse();\n            if (isAnimated) {\n                // We must trigger a CSS reflow (by accessing\n                // offsetHeight) otherwise the transition still runs.\n                this.$el[0].offsetHeight;\n                this.$el.addClass('aui-is-animated');\n            }\n        }\n    } else if (viewportWidth !== this._previousViewportWidth) {\n        this.setCollapsedState(viewportWidth);\n    }\n};\n\n// eslint-disable-next-line complexity\nSidebar.prototype.reflow = function reflow(\n    scrollTop = window.pageYOffset,\n    viewportHeight = document.documentElement.clientHeight,\n    viewportWidth = window.innerWidth,\n    scrollHeight = document.documentElement.scrollHeight,\n    scrollLeft = window.pageXOffset\n) {\n    // Header height needs to be checked because in Stash it changes when the CSS \"transform: translate3d\" is changed.\n    // If you called reflow() after this change then nothing happened because the scrollTop and viewportHeight hadn't changed.\n    var offsetTop = sidebarOffset(this.$el);\n    var isInitialPageLoad = this._previousViewportWidth === null;\n\n    if (\n        !(\n            scrollTop === this._previousScrollTop &&\n            viewportHeight === this._previousViewportHeight &&\n            offsetTop === this._previousOffsetTop\n        )\n    ) {\n        var isTouch = this.$body.hasClass('aui-page-sidebar-touch');\n        var isTrackpadBounce =\n            scrollTop !== this._previousScrollTop &&\n            (scrollTop < 0 || scrollTop + viewportHeight > scrollHeight);\n        if (!isTouch && (isInitialPageLoad || !isTrackpadBounce)) {\n            this.setHeight(scrollTop, viewportHeight, offsetTop);\n            this.setTopPosition(scrollTop);\n        }\n    }\n\n    if (scrollLeft !== this._previousScrollLeft) {\n        this.setLeftPosition(scrollLeft);\n    }\n\n    var isResponsive = this.$el.attr('data-aui-responsive') !== 'false';\n    if (isResponsive) {\n        this.responsiveReflow(isInitialPageLoad, viewportWidth);\n    } else {\n        var isFlyOut = !this.isCollapsed() && this.isViewportNarrow(viewportWidth);\n        this.$el.toggleClass('aui-sidebar-fly-out', isFlyOut);\n    }\n\n    this._previousScrollTop = scrollTop;\n    this._previousViewportHeight = viewportHeight;\n    this._previousViewportWidth = viewportWidth;\n    this._previousOffsetTop = offsetTop;\n    this._previousScrollLeft = scrollLeft;\n    return this;\n};\n\nSidebar.prototype.toggle = function () {\n    if (this.isCollapsed()) {\n        this.expand();\n        this.$el\n            .find('.aui-sidebar-toggle')\n            .attr('aria-label', I18n.getText('aui.sidebar.collapse.tooltip'));\n    } else {\n        this.collapse();\n        this.$el\n            .find('.aui-sidebar-toggle')\n            .attr('aria-label', I18n.getText('aui.sidebar.expand.tooltip'));\n    }\n    return this;\n};\n\n/**\n * Returns a jQuery selector string for the trigger elements when the\n * sidebar is in a collapsed state, useful for delegated event binding.\n *\n * When using this selector in event handlers, the element (\"this\") will\n * either be an <a> (when the trigger was a tier-one menu item) or an\n * element with class \"aui-sidebar-group\" (for non-tier-one items).\n *\n * For delegated event binding you should bind to $el and check the value\n * of isCollapsed(), e.g.,\n *\n *     sidebar.$el.on('click', sidebar.collapsedTriggersSelector, function (e) {\n *         if (!sidebar.isCollapsed()) {\n *             return;\n *         }\n *     });\n *\n * @returns string\n */\nSidebar.prototype.submenuTriggersSelector = '.aui-sidebar-group:not(.aui-sidebar-group-tier-one)';\n\nSidebar.prototype.collapsedTriggersSelector = [\n    Sidebar.prototype.submenuTriggersSelector,\n    '.aui-sidebar-group.aui-sidebar-group-tier-one > .aui-nav > li > a',\n    '.aui-sidebar-footer > .aui-sidebar-settings-button',\n].join(', ');\n\nSidebar.prototype.toggleSelector = '.aui-sidebar-footer > .aui-sidebar-toggle';\n\nSidebar.prototype.tooltipClassName = 'aui-sidebar-section-tooltip';\n\nSidebar.prototype.inlineDialogClass = 'aui-sidebar-submenu-dialog';\nSidebar.prototype.inlineDialogSelector = '.' + Sidebar.prototype.inlineDialogClass;\n\nfunction getAllSubmenuDialogs() {\n    return document.querySelectorAll(Sidebar.prototype.inlineDialogSelector);\n}\n\nfunction SubmenuManager() {\n    this.inlineDialog = null;\n}\n\nSubmenuManager.prototype.submenu = function ($trigger) {\n    sidebarSubmenuDeprecationLogger();\n    return getSubmenu($trigger);\n};\n\nSubmenuManager.prototype.hasSubmenu = function ($trigger) {\n    sidebarSubmenuDeprecationLogger();\n    return hasSubmenu($trigger);\n};\n\nSubmenuManager.prototype.submenuHeadingHeight = function () {\n    sidebarSubmenuDeprecationLogger();\n    return 34;\n};\n\nSubmenuManager.prototype.isShowing = function () {\n    sidebarSubmenuDeprecationLogger();\n    return Sidebar.prototype.isSubmenuVisible();\n};\n\nSubmenuManager.prototype.show = function (e, trigger) {\n    sidebarSubmenuDeprecationLogger();\n    showSubmenu(trigger);\n};\n\nSubmenuManager.prototype.hide = function () {\n    sidebarSubmenuDeprecationLogger();\n    hideAllSubmenus();\n};\n\nSubmenuManager.prototype.inlineDialogShowHandler = function () {\n    sidebarSubmenuDeprecationLogger();\n};\nSubmenuManager.prototype.inlineDialogHideHandler = function () {\n    sidebarSubmenuDeprecationLogger();\n};\nSubmenuManager.prototype.moveSubmenuToInlineDialog = function () {\n    sidebarSubmenuDeprecationLogger();\n};\nSubmenuManager.prototype.restoreSubmenu = function () {\n    sidebarSubmenuDeprecationLogger();\n};\n\nSidebar.prototype.getVisibleSubmenus = function () {\n    return Array.prototype.filter.call(getAllSubmenuDialogs(), function (inlineDialog2) {\n        return inlineDialog2.open;\n    });\n};\n\nSidebar.prototype.isSubmenuVisible = function () {\n    return this.getVisibleSubmenus().length > 0;\n};\n\nfunction getSubmenu($trigger) {\n    return $trigger.is('a') ? $trigger.next('.aui-nav') : $trigger.children('.aui-nav, hr');\n}\n\nfunction getSubmenuInlineDialog(trigger) {\n    var inlineDialogId = trigger.getAttribute('aria-controls');\n    return document.getElementById(inlineDialogId);\n}\n\nfunction hasSubmenu($trigger) {\n    return getSubmenu($trigger).length !== 0;\n}\n\nfunction hideAllSubmenus() {\n    var allSubmenuDialogs = getAllSubmenuDialogs();\n    Array.prototype.forEach.call(allSubmenuDialogs, function (inlineDialog2) {\n        inlineDialog2.open = false;\n    });\n}\n\nfunction showSubmenu(trigger) {\n    getSubmenuInlineDialog(trigger).open = true;\n}\n\nfunction constructSubmenu(sidebar, $trigger) {\n    if ($trigger.data('_aui-sidebar-submenu-constructed')) {\n        return;\n    } else {\n        $trigger.data('_aui-sidebar-submenu-constructed', true);\n    }\n\n    if (!hasSubmenu($trigger)) {\n        return;\n    }\n\n    var submenuInlineDialog = document.createElement('aui-inline-dialog');\n\n    var uniqueId = uid('sidebar-submenu');\n\n    $trigger.attr('aria-controls', uniqueId);\n    $trigger.attr('data-aui-trigger', '');\n    skate.init($trigger); //Trigger doesn't listen to attribute modification\n\n    submenuInlineDialog.setAttribute('id', uniqueId);\n    submenuInlineDialog.setAttribute('alignment', 'right top');\n    submenuInlineDialog.setAttribute('hidden', '');\n    submenuInlineDialog.setAttribute('contained-by', 'viewport');\n    if (sidebar.isCollapsed()) {\n        submenuInlineDialog.setAttribute('responds-to', 'hover');\n    }\n\n    $(submenuInlineDialog).addClass(Sidebar.prototype.inlineDialogClass);\n\n    document.body.appendChild(submenuInlineDialog);\n    skate.init(submenuInlineDialog); //Needed so that sidebar.submenus.isShowing() will work on page load\n\n    addHandlersToSubmenuInlineDialog(sidebar, $trigger, submenuInlineDialog);\n\n    return submenuInlineDialog;\n}\n\nfunction didOtherLayerOpened(e) {\n    return e.target.tagName !== 'AUI-INLINE-DIALOG';\n}\n\nfunction didNestedInlineDialogOpened(e) {\n    return !e.target.classList.contains('aui-sidebar-submenu-dialog');\n}\n\nfunction addHandlersToSubmenuInlineDialog(sidebar, $trigger, submenuInlineDialog) {\n    submenuInlineDialog.addEventListener('aui-layer-show', function (e) {\n        if (!sidebar.isCollapsed()) {\n            e.preventDefault();\n            return;\n        }\n\n        // we only care if sidebars inline dialog is opening\n        if (didOtherLayerOpened(e) || didNestedInlineDialogOpened(e)) {\n            return;\n        }\n\n        /**\n         * trigger an event on inline dialog trigger and pass a reference to the inline dialog.\n         * this let's one perform actions and modify content before it is displayed, for example lazy load submenu content\n         */\n        var customEvent = $.Event('aui-sidebar-submenu-before-show');\n        $trigger.trigger(customEvent, submenuInlineDialog);\n        if (customEvent.isDefaultPrevented()) {\n            e.preventDefault();\n            return;\n        }\n        inlineDialogShowHandler($trigger, submenuInlineDialog);\n    });\n\n    submenuInlineDialog.addEventListener('aui-layer-hide', function () {\n        inlineDialogHideHandler($trigger);\n    });\n}\n\nfunction inlineDialogShowHandler($trigger, submenuInlineDialog) {\n    $trigger.addClass('active');\n    submenuInlineDialog.innerHTML = SUBMENU_INLINE_DIALOG_CONTENTS_HTML;\n    var title = $trigger.is('a') ? $trigger.text() : $trigger.children('.aui-nav-heading').text();\n\n    var $container = $(submenuInlineDialog).find('.aui-navgroup-inner');\n    $container.children('.aui-nav-heading').attr('title', title).children('strong').text(title);\n\n    var $submenu = getSubmenu($trigger);\n    cloneExpander($submenu).appendTo($container);\n\n    /**\n     * Workaround to show all contents in the expander.\n     * This function should come from the expander component.\n     */\n    function cloneExpander(element) {\n        const $clone = clone(element);\n        deduplicateIDs($clone, uid);\n\n        if ($clone.hasClass('aui-expander-content')) {\n            $clone.find('.aui-expander-cutoff').remove();\n            $clone.removeClass('aui-expander-content');\n        }\n        return $clone;\n    }\n}\n\nconst SUBMENU_INLINE_DIALOG_CONTENTS_HTML =\n    '<div class=\"aui-inline-dialog-contents\">' +\n    '<div class=\"aui-sidebar-submenu\" >' +\n    '<div class=\"aui-navgroup aui-navgroup-vertical\">' +\n    '<div class=\"aui-navgroup-inner\">' +\n    '<div class=\"aui-nav-heading\"><strong></strong></div>' +\n    '</div>' +\n    '</div>' +\n    '</div>' +\n    '</div>';\n\nfunction inlineDialogHideHandler($trigger) {\n    $trigger.removeClass('active');\n}\n\nfunction constructAllSubmenus(sidebar) {\n    $(sidebar.collapsedTriggersSelector).each(function () {\n        var $trigger = $(this);\n        constructSubmenu(sidebar, $trigger);\n    });\n}\n\nvar tooltipOptions = {\n    gravity: 'w',\n    title: function () {\n        var $item = $(this);\n        if ($item.is('a') || $item.is('button')) {\n            return (\n                $item.attr('title') ||\n                $item.find('.aui-nav-item-label').text() ||\n                $item.data('tooltip')\n            );\n        } else {\n            return (\n                $item.children('.aui-nav').attr('title') ||\n                $item.children('.aui-nav-heading').text()\n            );\n        }\n    },\n};\n\nfunction lazilyInitializeSubmenus(sidebar) {\n    sidebar.$el.on(\n        'mouseenter mouseleave click focus',\n        sidebar.collapsedTriggersSelector,\n        function (e) {\n            const $trigger = $(e.target);\n            constructSubmenu(sidebar, $trigger);\n        }\n    );\n}\n\nfunction initializeHandlers(sidebar) {\n    var $sidebar = $('.aui-sidebar');\n    if (!$sidebar.length) {\n        return;\n    }\n\n    lazilyInitializeSubmenus(sidebar);\n\n    // AUI-2542: only enter touch mode on small screen touchable devices\n    if (hasTouch && mediaQuery('only screen and (max-device-width:1024px)')) {\n        $('body').addClass('aui-page-sidebar-touch');\n    }\n\n    var pendingReflow = null;\n    var onScrollResizeReflow = function () {\n        if (pendingReflow === null) {\n            pendingReflow = requestAnimationFrame(function () {\n                sidebar.reflow();\n                pendingReflow = null;\n            });\n        }\n    };\n\n    $(window).on('scroll resize', onScrollResizeReflow);\n    onScrollResizeReflow();\n\n    if (sidebar.isAnimated()) {\n        sidebar.$el.on('transitionend webkitTransitionEnd', function () {\n            sidebar.$el.trigger(\n                $.Event(EVENT_PREFIX + (sidebar.isCollapsed() ? 'collapse-end' : 'expand-end'))\n            );\n        });\n    }\n\n    sidebar.$el.on('click', '.aui-sidebar-toggle', function (e) {\n        e.preventDefault();\n        sidebar.toggle();\n    });\n\n    $('.aui-page-panel').on('click', function () {\n        if (!sidebar.isCollapsed() && sidebar.isViewportNarrow()) {\n            sidebar.collapse();\n        }\n    });\n\n    var toggleShortcutHandler = function (e) {\n        if (isNormalSquareBracket(e)) {\n            sidebar.toggle();\n        }\n    };\n\n    //We use keypress because it captures the actual character that was typed and not the physical key that was pressed.\n    //This accounts for other keyboard layouts\n\n    $(document).on('keypress', toggleShortcutHandler);\n\n    sidebar._remove = function () {\n        $(this.inlineDialogSelector).remove();\n        this.$el.off();\n        this.$el.remove();\n        $(document).off('keypress', toggleShortcutHandler);\n        $(window).off('scroll resize', onScrollResizeReflow);\n    };\n\n    sidebar.$el.on('touchend', function (e) {\n        if (sidebar.isCollapsed()) {\n            sidebar.expand();\n            e.preventDefault();\n        }\n    });\n\n    sidebar.$el.tooltip({\n        ...tooltipOptions,\n        live: sidebar.collapsedTriggersSelector,\n        suppress: function () {\n            const $trigger = $(this);\n            const sidebarIsExpanded = sidebar.isCollapsed() === false;\n            const triggerHasSubmenu = hasSubmenu($trigger) === true;\n            return triggerHasSubmenu || sidebarIsExpanded;\n        },\n    });\n\n    sidebar.$el.tooltip({\n        ...tooltipOptions,\n        aria: false,\n        live: sidebar.toggleSelector,\n        title: function () {\n            return sidebar.isCollapsed()\n                ? I18n.getText('aui.sidebar.expand.tooltip')\n                : I18n.getText('aui.sidebar.collapse.tooltip');\n        },\n    });\n\n    function isNormalTab(e) {\n        return e.keyCode === keyCode.TAB && !e.shiftKey && !e.altKey;\n    }\n\n    function isNormalSquareBracket(e) {\n        return (\n            e.which === keyCode.LEFT_SQUARE_BRACKET &&\n            !e.shiftKey &&\n            !e.ctrlKey &&\n            !e.metaKey &&\n            !isInput(e.target)\n        );\n    }\n\n    function isShiftTab(e) {\n        return e.keyCode === keyCode.TAB && e.shiftKey;\n    }\n\n    function isFirstSubmenuItem(item, $submenuDialog) {\n        return item === $submenuDialog.find(':aui-tabbable')[0];\n    }\n\n    function isLastSubmenuItem(item, $submenuDialog) {\n        return item === $submenuDialog.find(':aui-tabbable').last()[0];\n    }\n\n    /**\n     * Force to focus on the first tabbable item in inline dialog.\n     * Reason: inline dialog will be hidden as soon as the trigger is out of focus (onBlur event)\n     * This function should come directly from inline dialog component.\n     */\n    function focusFirstItemOfInlineDialog($inlineDialog) {\n        $inlineDialog.attr('persistent', '');\n        // don't use :aui-tabbable:first as it will select the first tabbable item in EACH nav group\n        $inlineDialog.find(':aui-tabbable').first().trigger('focus');\n        // workaround on IE:\n        // delay the persistence of inline dialog to make sure onBlur event was triggered first\n        setTimeout(function () {\n            $inlineDialog.removeAttr('persistent');\n        }, 100);\n    }\n\n    sidebar.$el.on('keydown', sidebar.collapsedTriggersSelector, function (e) {\n        if (sidebar.isCollapsed()) {\n            var triggerEl = e.target;\n            var submenuInlineDialog = getSubmenuInlineDialog(triggerEl);\n            if (!submenuInlineDialog) {\n                return;\n            }\n\n            var $submenuInlineDialog = $(submenuInlineDialog);\n\n            if (isNormalTab(e) && submenuInlineDialog.open) {\n                e.preventDefault();\n                focusFirstItemOfInlineDialog($submenuInlineDialog);\n\n                $submenuInlineDialog.on('keydown', function (e) {\n                    if (\n                        (isShiftTab(e) && isFirstSubmenuItem(e.target, $submenuInlineDialog)) ||\n                        (isNormalTab(e) && isLastSubmenuItem(e.target, $submenuInlineDialog))\n                    ) {\n                        triggerEl.focus();\n                        // unbind event and close submenu as the focus is out of the submenu\n                        $(this).off('keydown');\n                        hideAllSubmenus();\n                    }\n                });\n            }\n        }\n    });\n}\n\nvar sidebar = widget('sidebar', Sidebar);\n\n$(function () {\n    sidebar('.aui-sidebar');\n});\n\nvar sidebarSubmenuDeprecationLogger = deprecate.getMessageLogger('Sidebar.submenus', {\n    removeInVersion: '12.0.0',\n    sinceVersion: '5.8.0',\n});\n\nglobalize('sidebar', sidebar);\n\nexport default sidebar;\n","/**\n * Inspired by matchMedia() polyfill\n * https://github.com/paulirish/matchMedia.js/blob/953faa1489284655ed9d6e03bf48d39df70612c4/matchMedia.js\n */\n\nexport default function mediaQuery(mq) {\n    if (window.matchMedia) {\n        return window.matchMedia(mq).matches;\n    }\n\n    // fallback support for <=IE9 (remove this code if we don't want to support IE9 anymore)\n    var style = document.createElement('style');\n    style.type = 'text/css';\n    style.id = 'testMedia';\n    style.innerText = `@media ${mq} { #testMedia { width: 1px; } }`;\n    document.head.appendChild(style);\n    var info = window.getComputedStyle(style, null);\n    var testMediaQuery = info.width === '1px';\n    style.parentNode.removeChild(style);\n    return testMediaQuery;\n}\n","export default function (el) {\n    return 'value' in el || el.isContentEditable;\n}\n","import $ from './jquery';\nimport keyCode from './key-code';\nimport * as logger from './internal/log';\nimport * as deprecate from './internal/deprecation';\nimport { trigger } from './event';\nimport { dim, undim } from './blanket';\nimport { enable } from './forms';\nimport globalize from './internal/globalize';\n\n/* eslint complexity:off, eqeqeq:off, max-depth:off, no-unused-vars:off, strict:off */\nconst ZINDEX_DIALOG_1 = 2600; // see also dialog.less\n\n/**\n * Creates a generic popup that will be displayed in the center of the screen with a\n * grey blanket in the background.\n * Usage:\n * <pre>\n * createPopup({\n *     width: 800,\n *     height: 400,\n *     id: \"my-dialog\"\n * });\n * </pre>\n * @param options {object} [optional] Permitted options and defaults are as follows:\n * width (800), height (600), keypressListener (closes dialog on ESC).\n * @returns {Popup}\n */\nfunction createPopup(options) {\n    var defaults = {\n        width: 800,\n        height: 600,\n        closeOnOutsideClick: false,\n        keypressListener: function (e) {\n            if (e.keyCode === keyCode.ESCAPE && popup.is(':visible')) {\n                res.hide();\n            }\n        },\n    };\n    // for backwards-compatibility\n    if (typeof options !== 'object') {\n        options = {\n            width: arguments[0],\n            height: arguments[1],\n            id: arguments[2],\n        };\n        options = $.extend({}, options, arguments[3]);\n    }\n    options = $.extend({}, defaults, options);\n    var popup = $('<div></div>').addClass('aui-popup');\n\n    if (options.id) {\n        popup.attr('id', options.id);\n    }\n    //find the highest z-index on the page to ensure any new popup that is shown is shown on top\n    var highestZIndex = ZINDEX_DIALOG_1;\n    $('.aui-dialog').each(function () {\n        var currentPopup = $(this);\n        highestZIndex =\n            currentPopup.css('z-index') > highestZIndex\n                ? currentPopup.css('z-index')\n                : highestZIndex;\n    });\n\n    var applySize = (function _applySize(width, height) {\n        options.width = width = width || options.width;\n        options.height = height = height || options.height;\n\n        popup.css({\n            'marginTop': -Math.round(height / 2) + 'px',\n            'marginLeft': -Math.round(width / 2) + 'px',\n            'width': width,\n            'height': height,\n            'z-index': parseInt(highestZIndex, 10) + 2, //+ 2 so that the shadow can be shown on +1 (underneath the popup but above everything else)\n        });\n        return _applySize;\n    })(options.width, options.height);\n\n    $('body').append(popup);\n\n    popup.hide();\n    enable(popup);\n\n    /**\n     * Popup object\n     * @class Popup\n     * @static\n     * @property {function(): void} enable\n     * @property {function(): void} disable\n     * @property {function(): void} remove\n     * @property {function(): void} show\n     */\n\n    //blanket for reference further down\n    var blanket = $('.aui-blanket');\n    var focusItem = function (selector, element) {\n        var item = $(selector, element);\n        if (item.length) {\n            item.trigger('focus');\n            return true;\n        }\n        return false;\n    };\n    // we try and place focus, in the configured element or by looking for the first input\n    // in page body, then button panel and finally page menu.\n    var focusDialog = function (element) {\n        if ($('.dialog-page-body', element).find(':focus').length !== 0) {\n            return;\n        }\n        if (options.focusSelector) {\n            return focusItem(options.focusSelector, element);\n        }\n        var defaultFocusSelector = ':input:visible:enabled:first';\n        if (focusItem(defaultFocusSelector, $('.dialog-page-body', element))) {\n            return;\n        }\n        if (focusItem(defaultFocusSelector, $('.dialog-button-panel', element))) {\n            return;\n        }\n\n        focusItem(defaultFocusSelector, $('.dialog-page-menu', element));\n    };\n\n    var res = {\n        changeSize: function (w, h) {\n            if ((w && w != options.width) || (h && h != options.height)) {\n                applySize(w, h);\n            }\n            this.show();\n        },\n\n        /**\n         * Shows the popup\n         * @method show\n         */\n        show: function () {\n            var show = function () {\n                $(document)\n                    .off('keydown', options.keypressListener)\n                    .on('keydown', options.keypressListener);\n                dim();\n                blanket = $('.aui-blanket');\n                if (blanket.length !== 0 && options.closeOnOutsideClick) {\n                    blanket.on('click', function () {\n                        if (popup.is(':visible')) {\n                            res.hide();\n                        }\n                    });\n                }\n                popup.show();\n\n                createPopup.current = this;\n                focusDialog(popup);\n                $(document).trigger('showLayer', ['popup', this]);\n            };\n            show.call(this);\n            this.show = show;\n        },\n        /**\n         * Hides the popup.\n         * @method hide\n         */\n        hide: function () {\n            $(document).off('keydown', options.keypressListener);\n            blanket.off();\n            this.element.hide();\n\n            //only undim if no other dialogs are visible\n            if ($('.aui-dialog:visible').length === 0) {\n                undim();\n            }\n\n            // AUI-1059: remove focus from the active element when dialog is hidden\n            var activeElement = document.activeElement;\n            if (this.element.has(activeElement).length) {\n                activeElement.blur();\n            }\n\n            $(document).trigger('hideLayer', ['popup', this]);\n            createPopup.current = null;\n            this.enable();\n        },\n        /**\n         * jQuery object, representing popup DOM element\n         * @property element\n         */\n        element: popup,\n        /**\n         * Removes popup elements from the DOM\n         * @method remove\n         */\n        remove: function () {\n            popup.remove();\n            this.element = null;\n        },\n        /**\n         * disables the popup\n         * @method disable\n         */\n        disable: function () {\n            if (!this.disabled) {\n                this.popupBlanket = $(\"<div class='dialog-blanket'> </div>\").css({\n                    height: popup.height(),\n                    width: popup.width(),\n                });\n                popup.append(this.popupBlanket);\n                this.disabled = true;\n            }\n        },\n        /**\n         * enables the popup if it is disabled\n         * @method enable\n         */\n        enable: function () {\n            if (this.disabled) {\n                this.disabled = false;\n                this.popupBlanket.remove();\n                this.popupBlanket = null;\n            }\n        },\n    };\n\n    return res;\n}\n\n/**\n * Scoping function\n * @type {(function(number, number, number): Dialog)|*}\n */\nvar Dialog = (function () {\n    /**\n     * @class Button\n     * @constructor Button\n     * @param page {number} page id\n     * @param label {string} button label\n     * @param onclick {function} [optional] click event handler\n     * @param className {string} [optional] class name\n     * @private\n     */\n    function Button(page, label, onclick, className) {\n        if (!page.buttonpanel) {\n            page.addButtonPanel();\n        }\n        this.page = page;\n        this.onclick = onclick;\n        this._onclick = function (e) {\n            return onclick.call(this, page.dialog, page, e) === true;\n        };\n        this.item = $('<button></button>').html(label).addClass('button-panel-button');\n        if (className) {\n            this.item.addClass(className);\n        }\n        if (typeof onclick === 'function') {\n            this.item.on('click', this._onclick);\n        }\n        page.buttonpanel.append(this.item);\n        this.id = page.button.length;\n        page.button[this.id] = this;\n    }\n\n    /**\n     * @class Link\n     * @constructor Link\n     * @param page {number} page id\n     * @param label {string} button label\n     * @param onclick {function} [optional] click event handler\n     * @param className {string} [optional] class name\n     * @private\n     */\n    function Link(page, label, onclick, className, url) {\n        if (!page.buttonpanel) {\n            page.addButtonPanel();\n        }\n\n        //if no url is given use # as default\n        if (!url) {\n            url = '#';\n        }\n\n        this.page = page;\n        this.onclick = onclick;\n        this._onclick = function (e) {\n            return onclick.call(this, page.dialog, page, e) === true;\n        };\n        this.item = $('<a></a>').html(label).attr('href', url).addClass('button-panel-link');\n        if (className) {\n            this.item.addClass(className);\n        }\n        if (typeof onclick === 'function') {\n            this.item.on('click', this._onclick);\n        }\n        page.buttonpanel.append(this.item);\n        this.id = page.button.length;\n        page.button[this.id] = this;\n    }\n\n    function itemMove(leftOrRight, target) {\n        var dir = leftOrRight == 'left' ? -1 : 1;\n        return function (step) {\n            var dtarget = this.page[target];\n            if (this.id != (dir == 1 ? dtarget.length - 1 : 0)) {\n                dir *= step || 1;\n                dtarget[this.id + dir].item[dir < 0 ? 'before' : 'after'](this.item);\n                dtarget.splice(this.id, 1);\n                dtarget.splice(this.id + dir, 0, this);\n                for (var i = 0, ii = dtarget.length; i < ii; i++) {\n                    if (target == 'panel' && this.page.curtab == dtarget[i].id) {\n                        this.page.curtab = i;\n                    }\n                    dtarget[i].id = i;\n                }\n            }\n            return this;\n        };\n    }\n    function itemRemove(target) {\n        return function () {\n            this.page[target].splice(this.id, 1);\n            for (var i = 0, ii = this.page[target].length; i < ii; i++) {\n                this.page[target][i].id = i;\n            }\n            this.item.remove();\n        };\n    }\n    /**\n     * Moves item left in the hierarchy\n     * @method moveUp\n     * @method moveLeft\n     * @param step {number} how many items to move, default is 1\n     * @return {object} button\n     */\n    Button.prototype.moveUp = Button.prototype.moveLeft = itemMove('left', 'button');\n    /**\n     * Moves item right in the hierarchy\n     * @method moveDown\n     * @method moveRight\n     * @param step {number} how many items to move, default is 1\n     * @return {object} button\n     */\n    Button.prototype.moveDown = Button.prototype.moveRight = itemMove('right', 'button');\n    /**\n     * Removes item\n     * @method remove\n     */\n    Button.prototype.remove = itemRemove('button');\n\n    /**\n     * Getter and setter for label\n     * @method label\n     * @param label {string} [optional] label of the button\n     * @return {string} label, if nothing is passed in\n     * @return {object} jQuery button object, if label is passed in\n     */\n    Button.prototype.html = function (label) {\n        return this.item.html(label);\n    };\n    /**\n     * Getter and setter of onclick event handler\n     * @method onclick\n     * @param onclick {function} [optional] new event handler, that is going to replace the old one\n     * @return {function} existing event handler if new one is undefined\n     */\n    Button.prototype.onclick = function (onclick) {\n        let self = this;\n        if (typeof onclick === 'undefined') {\n            return this.onclick;\n        } else {\n            this.item.off('click', this._onclick);\n            this._onclick = function (e) {\n                return onclick.call(this, self.page.dialog, self.page, e) === true;\n            };\n            if (typeof onclick === 'function') {\n                this.item.on('click', this._onclick);\n            }\n        }\n    };\n\n    var DEFAULT_PADDING = 20;\n\n    /**\n     * Class for panels\n     * @class Panel\n     * @constructor\n     * @param page {number} page id\n     * @param title {string} panel title\n     * @param reference {string} or {object} jQuery object or selector for the contents of the Panel\n     * @param className {string} [optional] HTML class name\n     * @param panelButtonId {string} the unique id that will be put on the button element for this panel.\n     * @private\n     */\n    var Panel = function (page, title, reference, className, panelButtonId) {\n        if (!(reference instanceof $)) {\n            reference = $(reference);\n        }\n\n        this.dialog = page.dialog;\n        this.page = page;\n        this.id = page.panel.length;\n        this.button = $('<button></button>').html(title).addClass('item-button');\n\n        if (panelButtonId) {\n            this.button[0].id = panelButtonId;\n        }\n\n        this.item = $('<li></li>').append(this.button).addClass('page-menu-item');\n        this.body = $('<div></div>')\n            .append(reference)\n            .addClass('dialog-panel-body')\n            .css('height', page.dialog.height + 'px');\n        this.padding = DEFAULT_PADDING;\n        if (className) {\n            this.body.addClass(className);\n        }\n        var i = page.panel.length;\n        var tab = this;\n        page.menu.append(this.item);\n        page.body.append(this.body);\n        page.panel[i] = this;\n        var onclick = function () {\n            var cur;\n            if (page.curtab + 1) {\n                cur = page.panel[page.curtab];\n                cur.body.hide();\n                cur.item.removeClass('selected');\n                typeof cur.onblur === 'function' && cur.onblur();\n            }\n            page.curtab = tab.id;\n            tab.body.show();\n            tab.item.addClass('selected');\n            typeof tab.onselect === 'function' && tab.onselect();\n            typeof page.ontabchange === 'function' && page.ontabchange(tab, cur);\n        };\n        if (!this.button.on) {\n            logger.log('atlassian-dialog:Panel:constructor - this.button.on false');\n            this.button.onclick = onclick;\n        } else {\n            this.button.on('click', onclick);\n        }\n        onclick();\n        if (i == 0) {\n            page.menu.css('display', 'none'); // don't use jQuery hide()\n        } else {\n            page.menu.show();\n        }\n    };\n    /**\n     * Selects current panel\n     * @method select\n     */\n    Panel.prototype.select = function () {\n        this.button.trigger('click');\n    };\n    /**\n     * Moves item left in the hierarchy\n     * @method moveUp\n     * @method moveLeft\n     * @param step {number} how many items to move, default is 1\n     * @return {object} panel\n     */\n    Panel.prototype.moveUp = Panel.prototype.moveLeft = itemMove('left', 'panel');\n    /**\n     * Moves item right in the hierarchy\n     * @method moveDown\n     * @method moveRight\n     * @param step {number} how many items to move, default is 1\n     * @return {object} panel\n     */\n    Panel.prototype.moveDown = Panel.prototype.moveRight = itemMove('right', 'panel');\n    /**\n     * Removes item\n     * @method remove\n     */\n    Panel.prototype.remove = itemRemove('panel');\n    /**\n     * Getter and setter of inner HTML of the panel\n     * @method html\n     * @param html {string} HTML source to set up\n     * @return {object} panel\n     * @return {string} current HTML source\n     */\n    Panel.prototype.html = function (html) {\n        if (html) {\n            this.body.html(html);\n            return this;\n        } else {\n            return this.body.html();\n        }\n    };\n    /**\n     * This method gives you ability to overwrite default padding value. Use it with caution.\n     * @method setPadding\n     * @param padding {number} padding in pixels\n     * @return {object} panel\n     * @see DEFAULT_PADDING\n     */\n    Panel.prototype.setPadding = function (padding) {\n        if (!isNaN(+padding)) {\n            this.body.css('padding', +padding);\n            this.padding = +padding;\n            this.page.recalcSize();\n        }\n        return this;\n    };\n\n    var HEADER_HEIGHT = 62;\n    var BUTTONS_HEIGHT = 52;\n    var MIN_DIALOG_VERTICAL_BUFFER = 50;\n\n    /**\n     * Class for pages\n     * @class Page\n     * @constructor\n     * @param dialog {object} dialog object\n     * @param className {string} [optional] HTML class name\n     * @private\n     */\n    var Page = function (dialog, className) {\n        this.dialog = dialog;\n        this.id = dialog.page.length;\n        this.element = $('<div></div>').addClass('dialog-components');\n        this.body = $('<div></div>').addClass('dialog-page-body');\n        this.menu = $('<ul></ul>')\n            .addClass('dialog-page-menu')\n            .css('height', dialog.height + 'px');\n        this.body.append(this.menu);\n        this.curtab;\n        this.panel = [];\n        this.button = [];\n        if (className) {\n            this.body.addClass(className);\n        }\n        dialog.popup.element.append(this.element.append(this.menu).append(this.body));\n        dialog.page[dialog.page.length] = this;\n    };\n\n    /**\n     * Size updater for contents of the page. For internal use\n     * @method recalcSize\n     */\n    Page.prototype.recalcSize = function () {\n        var headerHeight = this.header ? HEADER_HEIGHT : 0;\n        var buttonHeight = this.buttonpanel ? BUTTONS_HEIGHT : 0;\n        for (var i = this.panel.length; i--; ) {\n            var dialogComponentsHeight = this.dialog.height - headerHeight - buttonHeight;\n            this.panel[i].body.css('height', dialogComponentsHeight);\n            this.menu.css('height', dialogComponentsHeight);\n        }\n    };\n\n    /**\n     * Adds a button panel to the bottom of dialog\n     * @method addButtonPanel\n     */\n    Page.prototype.addButtonPanel = function () {\n        this.buttonpanel = $('<div></div>').addClass('dialog-button-panel');\n        this.element.append(this.buttonpanel);\n    };\n\n    /**\n     * Method for adding new panel to the page\n     * @method addPanel\n     * @param title {string} panel title\n     * @param reference {string} or {object} jQuery object or selector for the contents of the Panel\n     * @param className {string} [optional] HTML class name\n     * @param panelButtonId {string} [optional] The unique id for the panel's button.\n     * @return {object} the page\n     */\n    Page.prototype.addPanel = function (title, reference, className, panelButtonId) {\n        new Panel(this, title, reference, className, panelButtonId);\n        this.recalcSize();\n        return this;\n    };\n    /**\n     * Method for adding header to the page\n     * @method addHeader\n     * @param title {string} panel title\n     * @param className {string} [optional] CSS class name\n     * @return {object} the page\n     */\n    Page.prototype.addHeader = function (title, className) {\n        if (this.header) {\n            this.header.remove();\n        }\n        this.header = $('<h2></h2>')\n            .text(title || '')\n            .addClass('dialog-title');\n        className && this.header.addClass(className);\n        this.element.prepend(this.header);\n        this.recalcSize();\n        return this;\n    };\n    /**\n     * Method for adding new button to the page\n     * @method addButton\n     * @param label {string} button label\n     * @param onclick {function} [optional] click event handler\n     * @param className {string} [optional] class name\n     * @return {object} the page\n     */\n    Page.prototype.addButton = function (label, onclick, className) {\n        new Button(this, label, onclick, className);\n        this.recalcSize();\n        return this;\n    };\n    /**\n     * Method for adding new link to the page\n     * @method addLink\n     * @param label {string} button label\n     * @param onclick {function} [optional] click event handler\n     * @param className {string} [optional] class name\n     * @return {object} the page\n     */\n    Page.prototype.addLink = function (label, onclick, className, url) {\n        new Link(this, label, onclick, className, url);\n        this.recalcSize();\n        return this;\n    };\n\n    /**\n     * Selects corresponding panel\n     * @method gotoPanel\n     * @param panel {object} panel object\n     * @param panel {number} id of the panel\n     */\n    Page.prototype.gotoPanel = function (panel) {\n        this.panel[panel.id || panel].select();\n    };\n    /**\n     * Returns current panel on the page\n     * @method getCurrentPanel\n     * @return panel {object} the panel\n     */\n    Page.prototype.getCurrentPanel = function () {\n        return this.panel[this.curtab];\n    };\n    /**\n     * Hides the page\n     * @method hide\n     */\n    Page.prototype.hide = function () {\n        this.element.hide();\n    };\n    /**\n     * Shows the page, if it was hidden\n     * @method show\n     */\n    Page.prototype.show = function () {\n        this.element.show();\n    };\n    /**\n     * Removes the page\n     * @method remove\n     */\n    Page.prototype.remove = function () {\n        this.element.remove();\n    };\n\n    /**\n     * Constructor for a Dialog. A Dialog is a popup which consists of Pages, where each Page can consist of Panels,\n     * Buttons and a Header. The dialog must be constructed in page order as it has a current page state. For example,\n     * calling addButton() will add a button to the 'current' page.\n     * <p>\n     * By default, a new Dialog will have one page. If there are multiple Panels on a Page, a\n     * menu is displayed on the left side of the dialog.\n     * </p>\n     * Usage:\n     * <pre>\n     * var dialog = new Dialog(860, 530);\n     * dialog.addHeader(\"Insert Macro\")\n     * .addPanel(\"All\", \"&lt;p&gt;&lt;/p&gt;\")\n     * .addPanel(\"Some\", \"&lt;p&gt;&lt;/p&gt;\")\n     * .addButton(\"Next\", function (dialog) {dialog.nextPage();})\n     * .addButton(\"Cancel\", function (dialog) {dialog.hide();});\n     *\n     * dialog.addPage()\n     * .addButton(\"Cancel\", function (dialog) {dialog.hide();});\n     *\n     * somebutton.on('click', function () {dialog.show();});\n     * </pre>\n     * @class Dialog\n     * @constructor\n     * @param width {number} dialog width in pixels, or an object containing the Dialog parameters\n     * @param height {number} dialog height in pixels\n     * @param id {number} [optional] dialog id\n     */\n    function Dialog(width, height, id) {\n        var options = {};\n        if (!+width) {\n            options = Object(width);\n            width = options.width;\n            height = options.height;\n            id = options.id;\n        }\n        this.height = height || 480;\n        this.width = width || 640;\n        this.id = id;\n        options = $.extend({}, options, {\n            width: this.width,\n            height: this.height,\n            id: this.id,\n        });\n        this.popup = createPopup(options);\n\n        this.popup.element.addClass('aui-dialog');\n        this.page = [];\n        this.curpage = 0;\n\n        new Page(this);\n    }\n\n    /**\n     * Method for adding header to the current page\n     * @method addHeader\n     * @param title {string} panel title\n     * @param className {string} [optional] HTML class name\n     * @return {object} the dialog\n     */\n    Dialog.prototype.addHeader = function (title, className) {\n        this.page[this.curpage].addHeader(title, className);\n        return this;\n    };\n    /**\n     * Method for adding new button to the current page\n     * @method addButton\n     * @param label {string} button label\n     * @param onclick {function} [optional] click event handler\n     * @param className {string} [optional] class name\n     * @return {object} the dialog\n     */\n    Dialog.prototype.addButton = function (label, onclick, className) {\n        this.page[this.curpage].addButton(label, onclick, className);\n        return this;\n    };\n\n    /**\n     * Method for adding new link to the current page\n     * @method addButton\n     * @param label {string} link label\n     * @param onclick {function} [optional] click event handler\n     * @param className {string} [optional] class name\n     * @return {object} the dialog\n     */\n    Dialog.prototype.addLink = function (label, onclick, className, url) {\n        this.page[this.curpage].addLink(label, onclick, className, url);\n        return this;\n    };\n\n    /**\n     * Method for adding a submit button to the current page\n     * @method addSubmit\n     * @param label {string} link label\n     * @param onclick {function} [optional] click event handler\n     * @return {object} the dialog\n     */\n    Dialog.prototype.addSubmit = function (label, onclick) {\n        this.page[this.curpage].addButton(label, onclick, 'button-panel-submit-button');\n        return this;\n    };\n\n    /**\n     * Method for adding a cancel link to the current page\n     * @method addCancel\n     * @param label {string} link label\n     * @param onclick {function} [optional] click event handler\n     * @return {object} the dialog\n     */\n    Dialog.prototype.addCancel = function (label, onclick) {\n        this.page[this.curpage].addLink(label, onclick, 'button-panel-cancel-link');\n        return this;\n    };\n\n    /**\n     * Method for adding new button panel to the current page\n     * @return {object} the dialog\n     */\n    Dialog.prototype.addButtonPanel = function () {\n        this.page[this.curpage].addButtonPanel();\n        return this;\n    };\n\n    /**\n     * Method for adding new panel to the current page.\n     * @method addPanel\n     * @param title {string} panel title\n     * @param reference {string} or {object} jQuery object or selector for the contents of the Panel\n     * @param className {string} [optional] HTML class name\n     * @param panelButtonId {String} [optional] The unique id for the panel's button.\n     * @return {object} the dialog\n     */\n    Dialog.prototype.addPanel = function (title, reference, className, panelButtonId) {\n        this.page[this.curpage].addPanel(title, reference, className, panelButtonId);\n        return this;\n    };\n    /**\n     * Adds a new page to the dialog and sets the new page as the current page\n     * @method addPage\n     * @param className {string} [optional] HTML class name\n     * @return {object} the dialog\n     */\n    Dialog.prototype.addPage = function (className) {\n        new Page(this, className);\n        this.page[this.curpage].hide();\n        this.curpage = this.page.length - 1;\n        return this;\n    };\n    /**\n     * Making next page in hierarchy visible and active\n     * @method nextPage\n     * @return {object} the dialog\n     */\n    Dialog.prototype.nextPage = function () {\n        this.page[this.curpage++].hide();\n        if (this.curpage >= this.page.length) {\n            this.curpage = 0;\n        }\n        this.page[this.curpage].show();\n        return this;\n    };\n    /**\n     * Making previous page in hierarchy visible and active\n     * @method prevPage\n     * @return {object} the dialog\n     */\n    Dialog.prototype.prevPage = function () {\n        this.page[this.curpage--].hide();\n        if (this.curpage < 0) {\n            this.curpage = this.page.length - 1;\n        }\n        this.page[this.curpage].show();\n        return this;\n    };\n    /**\n     * Making specified page visible and active\n     * @method gotoPage\n     * @param num {number} page id\n     * @return {object} the dialog\n     */\n    Dialog.prototype.gotoPage = function (num) {\n        this.page[this.curpage].hide();\n        this.curpage = num;\n        if (this.curpage < 0) {\n            this.curpage = this.page.length - 1;\n        } else if (this.curpage >= this.page.length) {\n            this.curpage = 0;\n        }\n        this.page[this.curpage].show();\n        return this;\n    };\n    /**\n     * Returns specified panel at the current page\n     * @method getPanel\n     * @param pageorpanelId {number} page id or panel id\n     * @param panelId {number} panel id\n     * @return {object} the internal Panel object\n     */\n    Dialog.prototype.getPanel = function (pageorpanelId, panelId) {\n        var pageid = panelId == null ? this.curpage : pageorpanelId;\n        if (panelId == null) {\n            panelId = pageorpanelId;\n        }\n        return this.page[pageid].panel[panelId];\n    };\n    /**\n     * Returns specified page\n     * @method getPage\n     * @param pageid {number} page id\n     * @return {object} the internal Page Object\n     */\n    Dialog.prototype.getPage = function (pageid) {\n        return this.page[pageid];\n    };\n    /**\n     * Returns current panel at the current page\n     * @method getCurrentPanel\n     * @return {object} the internal Panel object\n     */\n    Dialog.prototype.getCurrentPanel = function () {\n        return this.page[this.curpage].getCurrentPanel();\n    };\n\n    /**\n     * Selects corresponding panel\n     * @method gotoPanel\n     * @param pageorpanel {object} panel object or page object\n     * @param panel {object} panel object\n     * @param panel {number} id of the panel\n     */\n    Dialog.prototype.gotoPanel = function (pageorpanel, panel) {\n        if (panel != null) {\n            var pageid = pageorpanel.id || pageorpanel;\n            this.gotoPage(pageid);\n        }\n        this.page[this.curpage].gotoPanel(typeof panel === 'undefined' ? pageorpanel : panel);\n    };\n\n    /**\n     * Shows the dialog, if it is not visible\n     * @method show\n     * @return {object} the dialog\n     */\n    Dialog.prototype.show = function () {\n        this.popup.show();\n        trigger('show.dialog', { dialog: this });\n        return this;\n    };\n    /**\n     * Hides the dialog, if it was visible\n     * @method hide\n     * @return {object} the dialog\n     */\n    Dialog.prototype.hide = function () {\n        this.popup.hide();\n        trigger('hide.dialog', { dialog: this });\n        return this;\n    };\n    /**\n     * Removes the dialog elements from the DOM\n     * @method remove\n     */\n    Dialog.prototype.remove = function () {\n        this.popup.hide();\n        this.popup.remove();\n        trigger('remove.dialog', { dialog: this });\n    };\n    /**\n     * Disables the dialog if enabled\n     * @method disable\n     */\n    Dialog.prototype.disable = function () {\n        this.popup.disable();\n        return this;\n    };\n    /**\n     * Enables the dialog if disabled\n     * @method disable\n     */\n    Dialog.prototype.enable = function () {\n        this.popup.enable();\n        return this;\n    };\n    /**\n     * Gets set of items depending on query\n     * @method get\n     * @param query {string} query to search for panels, pages, headers or buttons\n     * e.g.\n     *      '#Name' will find all dialog components with the given name such as panels and buttons, etc\n     *      'panel#Name' will find only panels with the given name\n     *      'panel#\"Foo bar\"' will find only panels with given name\n     *      'panel:3' will find the third panel\n     */\n    Dialog.prototype.get = function (query) {\n        var coll = [];\n        var dialog = this;\n        var nameExp = '#([^\"][^ ]*|\"[^\"]*\")'; // a name is a hash followed by either a bare word or quoted string\n        var indexExp = ':(\\\\d+)'; // an index is a colon followed by some digits\n        var typeExp = 'page|panel|button|header'; // one of the allowed types\n        var selectorExp =\n            '(?:' + // a selector is either ...\n            '(' +\n            typeExp +\n            ')(?:' +\n            nameExp +\n            '|' +\n            indexExp +\n            ')?' + // a type optionally followed by either #name or :index\n            '|' +\n            nameExp + // or just a #name\n            ')';\n        var queryRE = new RegExp(\n            '(?:^|,)' + // a comma or at the start of the line\n                '\\\\s*' +\n                selectorExp + // optional space and a selector\n                '(?:\\\\s+' +\n                selectorExp +\n                ')?' + // optionally, followed by some space and a second selector\n                '\\\\s*(?=,|$)',\n            'ig'\n        ); // followed by, but not including, a comma or the end of the string\n        (query + '').replace(\n            queryRE,\n            function (all, name, title, id, justtitle, name2, title2, id2, justtitle2) {\n                name = name && name.toLowerCase();\n                var pages = [];\n                if (name == 'page' && dialog.page[id]) {\n                    pages.push(dialog.page[id]);\n                    name = name2;\n                    name = name && name.toLowerCase();\n                    title = title2;\n                    id = id2;\n                    justtitle = justtitle2;\n                } else {\n                    pages = dialog.page;\n                }\n                title = title && (title + '').replace(/\"/g, '');\n                title2 = title2 && (title2 + '').replace(/\"/g, '');\n                justtitle = justtitle && (justtitle + '').replace(/\"/g, '');\n                justtitle2 = justtitle2 && (justtitle2 + '').replace(/\"/g, '');\n                if (name || justtitle) {\n                    for (var i = pages.length; i--; ) {\n                        if (justtitle || (name == 'panel' && (title || (!title && id == null)))) {\n                            for (var j = pages[i].panel.length; j--; ) {\n                                if (\n                                    pages[i].panel[j].button.html() == justtitle ||\n                                    pages[i].panel[j].button.html() == title ||\n                                    (name == 'panel' && !title && id == null)\n                                ) {\n                                    coll.push(pages[i].panel[j]);\n                                }\n                            }\n                        }\n                        if (justtitle || (name == 'button' && (title || (!title && id == null)))) {\n                            for (var j = pages[i].button.length; j--; ) {\n                                if (\n                                    pages[i].button[j].item.html() == justtitle ||\n                                    pages[i].button[j].item.html() == title ||\n                                    (name == 'button' && !title && id == null)\n                                ) {\n                                    coll.push(pages[i].button[j]);\n                                }\n                            }\n                        }\n                        if (pages[i][name] && pages[i][name][id]) {\n                            coll.push(pages[i][name][id]);\n                        }\n                        if (name == 'header' && pages[i].header) {\n                            coll.push(pages[i].header);\n                        }\n                    }\n                } else {\n                    coll = coll.concat(pages);\n                }\n            }\n        );\n        var res = {\n            length: coll.length,\n        };\n        for (var i = coll.length; i--; ) {\n            res[i] = coll[i];\n            for (var method in coll[i]) {\n                if (!(method in res)) {\n                    (function (m) {\n                        res[m] = function () {\n                            for (var j = this.length; j--; ) {\n                                if (typeof this[j][m] === 'function') {\n                                    this[j][m].apply(this[j], arguments);\n                                }\n                            }\n                        };\n                    })(method);\n                }\n            }\n        }\n        return res;\n    };\n\n    /**\n     * Updates height of panels, to contain content without the need for scroll bars.\n     *\n     * @method updateHeight\n     */\n    Dialog.prototype.updateHeight = function () {\n        var height = 0;\n        var maxDialogHeight =\n            $(window).height() - HEADER_HEIGHT - BUTTONS_HEIGHT - MIN_DIALOG_VERTICAL_BUFFER * 2;\n        for (var i = 0; this.getPanel(i); i++) {\n            if (\n                this.getPanel(i).body.css({ height: 'auto', display: 'block' }).outerHeight() >\n                height\n            ) {\n                height = Math.min(maxDialogHeight, this.getPanel(i).body.outerHeight());\n            }\n            if (i !== this.page[this.curpage].curtab) {\n                this.getPanel(i).body.css({ display: 'none' });\n            }\n        }\n        for (i = 0; this.getPanel(i); i++) {\n            this.getPanel(i).body.css({ height: height || this.height });\n        }\n        this.page[0].menu.height(height);\n        this.height = height + HEADER_HEIGHT + BUTTONS_HEIGHT + 1;\n        this.popup.changeSize(undefined, this.height);\n    };\n\n    /**\n     * Returns whether the dialog has been resized to it's maximum height (has been capped by the viewport height and vertical buffer).\n     *\n     * @method isMaximised\n     */\n    Dialog.prototype.isMaximised = function () {\n        return (\n            this.popup.element.outerHeight() >= $(window).height() - MIN_DIALOG_VERTICAL_BUFFER * 2\n        );\n    };\n\n    /**\n     * Returns the current panel.\n     * @deprecated Since 3.0.1 Use getCurrentPanel() instead.\n     */\n    Dialog.prototype.getCurPanel = function () {\n        return this.getPanel(this.page[this.curpage].curtab);\n    };\n\n    /**\n     * Returns the current button panel.\n     * @deprecated Since 3.0.1 Use get() instead.\n     */\n    Dialog.prototype.getCurPanelButton = function () {\n        return this.getCurPanel().button;\n    };\n\n    return Dialog;\n})();\n\nDialog = deprecate.construct(Dialog, 'Dialog constructor', {\n    alternativeName: 'Dialog2',\n});\n\ncreatePopup = deprecate.construct(createPopup, 'Dialog popup constructor', {\n    alternatveName: 'Dialog2',\n});\n\nglobalize('Dialog', Dialog);\nglobalize('popup', createPopup);\n\nexport { Dialog, createPopup as popup };\n","import $ from './jquery';\nimport 'jquery.hotkeys/jquery.hotkeys';\nimport '../jquery/jquery.moveto';\nimport * as logger from './internal/log';\nimport { I18n } from './i18n';\nimport { popup } from './dialog';\nimport globalize from './internal/globalize';\nimport keyCode from './key-code';\nimport { isEqual } from 'underscore';\n\nconst EMPTY_SELECTOR = false;\n\nvar isMac = navigator.platform.indexOf('Mac') !== -1;\nvar isSafari = navigator.userAgent.indexOf('Safari') !== -1;\nvar multiCharRegex =\n    /^(backspace|tab|r(ight|eturn)|s(hift|pace|croll)|c(trl|apslock)|alt|pa(use|ge(up|down))|e(sc|nd)|home|left|up|d(el|own)|insert|f\\d\\d?|numlock|meta)/i;\n\n/**\n * Trigger native click event.\n * @param $el\n */\nconst triggerClickEvent = ($el) => {\n    const element = $el[0];\n\n    if (element) {\n        // Native event bubbles are compatible with Synthetic Event from React\n        const bubbles = true;\n        const cancelable = true;\n        const event = document.createEvent('MouseEvent');\n        event.initMouseEvent(\n            'click',\n            bubbles,\n            cancelable,\n            window,\n            0,\n            0,\n            0,\n            0,\n            0,\n            false,\n            false,\n            false,\n            false,\n            0,\n            null\n        );\n        element.dispatchEvent(event);\n    }\n};\n\n/**\n * Keyboard commands with syntactic sugar.\n *\n * <strong>Usage:</strong>\n * <pre>\n * whenIType(\"gh\").or(\"gd\").goTo(\"/secure/Dashboard.jspa\");\n * whenIType(\"c\").click(\"#create_link\");\n * </pre>\n *\n * @param keys - Key combinations, modifier keys are \"+\" deliminated. e.g \"ctrl+b\"\n */\nfunction whenIType(keys) {\n    var boundKeyCombos = [];\n    var executor = $.Callbacks();\n\n    function keypressHandler(e) {\n        if (!popup.current && executor) {\n            executor.fire(e);\n        }\n    }\n\n    function defaultPreventionHandler(e) {\n        e.preventDefault();\n    }\n\n    // Bind an arbitrary set of keys by calling bindKeyCombo on each triggering key combo.\n    // A string like \"abc 123\" means (a then b then c) OR (1 then 2 then 3). abc is one key combo, 123 is another.\n    function bindKeys(keys) {\n        var keyCombos = keys && keys.split ? keys.trim().split(' ') : [keys];\n\n        keyCombos.forEach(function (keyCombo) {\n            bindKeyCombo(keyCombo);\n        });\n    }\n\n    function hasUnprintables(keysArr) {\n        // a bit of a heuristic, but works for everything we have. Only the unprintable characters are represented with > 1-character names.\n        var i = keysArr.length;\n        while (i--) {\n            if (keysArr[i].length > 1 && keysArr[i] !== 'space') {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    // bind a single key combo to this handler\n    // A string like \"abc 123\" means (a then b then c) OR (1 then 2 then 3). abc is one key combo, 123 is another.\n    function bindKeyCombo(keyCombo) {\n        var keysArr =\n            keyCombo instanceof Array ? keyCombo : keyComboArrayFromString(keyCombo.toString());\n        var eventType = hasUnprintables(keysArr) ? 'keydown' : 'keypress';\n\n        boundKeyCombos.push(keysArr);\n        $(document).on(eventType, EMPTY_SELECTOR, keysArr, keypressHandler);\n\n        // Override browser/plugins\n        $(document).on(eventType + ' keyup', EMPTY_SELECTOR, keysArr, defaultPreventionHandler);\n    }\n\n    // parse out an array of (modifier+key) presses from a single string\n    // e.g. \"12ctrl+3\" becomes [ \"1\", \"2\", \"ctrl+3\" ]\n    function keyComboArrayFromString(keyString) {\n        var keysArr = [];\n        var currModifiers = '';\n\n        while (keyString.length) {\n            var modifierMatch = keyString.match(/^(ctrl|meta|shift|alt)\\+/i);\n            var multiCharMatch = keyString.match(multiCharRegex);\n\n            if (modifierMatch) {\n                currModifiers += modifierMatch[0];\n                keyString = keyString.substring(modifierMatch[0].length);\n            } else if (multiCharMatch) {\n                keysArr.push(currModifiers + multiCharMatch[0]);\n                keyString = keyString.substring(multiCharMatch[0].length);\n                currModifiers = '';\n            } else {\n                keysArr.push(currModifiers + keyString[0]);\n                keyString = keyString.substring(1);\n                currModifiers = '';\n            }\n        }\n\n        return keysArr;\n    }\n\n    function addShortcutsToTitle(selector) {\n        var elem = $(selector);\n        var title = elem.attr('title') || '';\n        var keyCombos = boundKeyCombos.slice();\n        var existingCombos = elem.data('boundKeyCombos') || [];\n        var kbShortcutAppended = elem.data('kbShortcutAppended') || '';\n        var kbShortcutAppendedScreenReader = elem.data('kbShortcutAppendedScreenReader') || '';\n        var ariaLabel = elem.attr('aria-label');\n        var isFirstShortcut = !kbShortcutAppended;\n        var isFirstShortcutScreenReader = !kbShortcutAppendedScreenReader;\n        var originalTitle = isFirstShortcut\n            ? title\n            : title.substring(0, title.length - kbShortcutAppended.length);\n        var originalAriaLabel = isFirstShortcutScreenReader\n            ? title\n            : ariaLabel.substring(0, ariaLabel.length - kbShortcutAppendedScreenReader.length);\n\n        while (keyCombos.length) {\n            var keyCombo = keyCombos.shift();\n            var comboAlreadyExists = existingCombos.some(function (existingCombo) {\n                return isEqual(keyCombo, existingCombo);\n            });\n            if (!comboAlreadyExists) {\n                kbShortcutAppended = appendKeyComboInstructions(\n                    keyCombo.slice(),\n                    kbShortcutAppended,\n                    isFirstShortcut\n                );\n                kbShortcutAppendedScreenReader = appendKeyComboInstructions(\n                    keyCombo.slice(),\n                    kbShortcutAppendedScreenReader,\n                    isFirstShortcutScreenReader,\n                    { workaroundJaws: true }\n                );\n                isFirstShortcut = false;\n                isFirstShortcutScreenReader = false;\n            }\n        }\n\n        if (isMac) {\n            kbShortcutAppended = kbShortcutAppended\n                .replace(/Meta/gi, '\\u2318') //Apple cmd key\n                .replace(/Shift/gi, '\\u21E7'); //Apple Shift symbol\n            kbShortcutAppendedScreenReader = kbShortcutAppendedScreenReader\n                .replace(/Meta/gi, '\\u2318') //Apple cmd key\n                .replace(/Shift/gi, '\\u21E7'); //Apple Shift symbol\n        }\n\n        elem.attr('title', originalTitle + kbShortcutAppended);\n        elem.attr('aria-label', originalAriaLabel + kbShortcutAppendedScreenReader);\n        elem.data('kbShortcutAppended', kbShortcutAppended);\n        elem.data('kbShortcutAppendedScreenReader', kbShortcutAppendedScreenReader);\n        elem.data('boundKeyCombos', existingCombos.concat(boundKeyCombos));\n    }\n\n    function removeShortcutsFromTitle(selector) {\n        var elem = $(selector);\n        var shortcuts = elem.data('kbShortcutAppended');\n\n        if (!shortcuts) {\n            return;\n        }\n\n        var title = elem.attr('title');\n        elem.attr('title', title.replace(shortcuts, ''));\n        elem.attr('aria-label', title.replace(shortcuts, ''));\n        elem.removeData('kbShortcutAppended');\n        elem.removeData('kbShortcutAppendedScreenReader');\n        elem.removeData('boundKeyCombos');\n    }\n\n    function appendKeyComboInstructions(keyCombo, title, isFirst, options) {\n        var openParenthesis = '(';\n        var closeParenthesis = ')';\n\n        if (options && options.workaroundJaws) {\n            openParenthesis = '';\n            closeParenthesis = '';\n        }\n\n        if (isFirst) {\n            title +=\n                ' ' +\n                openParenthesis +\n                I18n.getText('aui.keyboard.shortcut.type.x', keyCombo.shift());\n        } else {\n            title = title.replace(/\\)$/, '');\n            title += ' ' + I18n.getText('aui.keyboard.shortcut.or.x', keyCombo.shift());\n        }\n\n        keyCombo.forEach(function (key) {\n            title += ' ' + I18n.getText('aui.keyboard.shortcut.then.x', key);\n        });\n        title += closeParenthesis;\n\n        return title;\n    }\n\n    bindKeys(keys);\n\n    return whenIType.makeShortcut({\n        executor: executor,\n        bindKeys: bindKeys,\n        addShortcutsToTitle: addShortcutsToTitle,\n        removeShortcutsFromTitle: removeShortcutsFromTitle,\n        keypressHandler: keypressHandler,\n        defaultPreventionHandler: defaultPreventionHandler,\n    });\n}\n\nwhenIType.makeShortcut = function (options) {\n    var executor = options.executor;\n    var bindKeys = options.bindKeys;\n    var addShortcutsToTitle = options.addShortcutsToTitle;\n    var removeShortcutsFromTitle = options.removeShortcutsFromTitle;\n    var keypressHandler = options.keypressHandler;\n    var defaultPreventionHandler = options.defaultPreventionHandler;\n\n    var selectorsWithTitlesModified = [];\n\n    function makeMoveToFunction(getNewFocus) {\n        return function (selector, options) {\n            options = options || {};\n            var focusedClass = options.focusedClass || 'focused';\n            var wrapAround = options.hasOwnProperty('wrapAround') ? options.wrapAround : true;\n            var escToCancel = options.hasOwnProperty('escToCancel') ? options.escToCancel : true;\n\n            executor.add(function () {\n                const $items = $(selector);\n                let $focusedElem = $items.filter('.' + focusedClass);\n                const moveToOptions = $focusedElem.length === 0 ? undefined : { transition: true };\n\n                if (escToCancel) {\n                    $(document).one('keydown', function (e) {\n                        if (e.keyCode === keyCode.ESCAPE && $focusedElem) {\n                            $focusedElem.removeClass(focusedClass);\n                        }\n                    });\n                }\n\n                if ($focusedElem.length) {\n                    $focusedElem.removeClass(focusedClass);\n                }\n\n                $focusedElem = getNewFocus($focusedElem, $items, wrapAround);\n\n                if ($focusedElem && $focusedElem.length > 0) {\n                    $focusedElem.addClass(focusedClass);\n                    $focusedElem.moveTo(moveToOptions);\n                    if ($focusedElem.is('a')) {\n                        $focusedElem.trigger('focus');\n                    } else {\n                        $focusedElem.find('a:first').trigger('focus');\n                    }\n                }\n            });\n            return this;\n        };\n    }\n\n    return {\n        /**\n         * Scrolls to and adds <em>focused</em> class to the next item in the jQuery collection\n         *\n         * @method moveToNextItem\n         * @param selector\n         * @param options\n         * @return {Object}\n         */\n        moveToNextItem: makeMoveToFunction(function ($focusedElem, $items, wrapAround) {\n            var index;\n\n            if (wrapAround && $focusedElem.length === 0) {\n                return $items.eq(0);\n            } else {\n                index = $.inArray($focusedElem.get(0), $items);\n                if (index < $items.length - 1) {\n                    index = index + 1;\n                    return $items.eq(index);\n                } else if (wrapAround) {\n                    return $items.eq(0);\n                }\n            }\n\n            return $focusedElem;\n        }),\n        /**\n         * Scrolls to and adds <em>focused</em> class to the previous item in the jQuery collection\n         *\n         * @method moveToPrevItem\n         * @param selector\n         * @param focusedClass\n         * @return {Object}\n         */\n        moveToPrevItem: makeMoveToFunction(function ($focusedElem, $items, wrapAround) {\n            var index;\n            if (wrapAround && $focusedElem.length === 0) {\n                return $items.filter(':last');\n            } else {\n                index = $.inArray($focusedElem.get(0), $items);\n                if (index > 0) {\n                    index = index - 1;\n                    return $items.eq(index);\n                } else if (wrapAround) {\n                    return $items.filter(':last');\n                }\n            }\n\n            return $focusedElem;\n        }),\n\n        /**\n         * Clicks the element specified by the <em>selector</em> argument.\n         *\n         * @method click\n         * @param selector - jQuery selector for element\n         * @return {Object}\n         */\n        click: function (selector) {\n            selectorsWithTitlesModified.push(selector);\n            addShortcutsToTitle(selector);\n\n            executor.add(function () {\n                const $el = $(selector);\n                triggerClickEvent($el);\n            });\n            return this;\n        },\n\n        /**\n         * Navigates to specified <em>location</em>\n         *\n         * @method goTo\n         * @param {String} location - http location\n         * @return {Object}\n         */\n        goTo: function (location) {\n            executor.add(function () {\n                window.location.href = location;\n            });\n            return this;\n        },\n\n        /**\n         * navigates browser window to link href\n         *\n         * @method followLink\n         * @param selector - jQuery selector for element\n         * @return {Object}\n         */\n        followLink: function (selector) {\n            selectorsWithTitlesModified.push(selector);\n            addShortcutsToTitle(selector);\n\n            executor.add(function () {\n                var elem = $(selector)[0];\n                if (elem && { a: true, link: true }[elem.nodeName.toLowerCase()]) {\n                    window.location.href = elem.href;\n                }\n            });\n            return this;\n        },\n\n        /**\n         * Executes function\n         *\n         * @method execute\n         * @param {function} func\n         * @return {Object}\n         */\n        execute: function (func) {\n            var self = this;\n            executor.add(function () {\n                func.apply(self, arguments);\n            });\n            return this;\n        },\n\n        /**\n         * @deprecated This implementation is uncool. Kept around to satisfy Confluence plugin devs in the short term.\n         *\n         * Executes the javascript provided by the shortcut plugin point _immediately_.\n         *\n         * @method evaluate\n         * @param {Function} command - the function provided by the shortcut key plugin point\n         */\n        evaluate: function (command) {\n            command.call(this);\n        },\n\n        /**\n         * Scrolls to element if out of view, then clicks it.\n         *\n         * @method moveToAndClick\n         * @param selector - jQuery selector for element\n         * @return {Object}\n         */\n        moveToAndClick: function (selector) {\n            selectorsWithTitlesModified.push(selector);\n            addShortcutsToTitle(selector);\n\n            executor.add(function () {\n                const $el = $(selector);\n                if ($el.length > 0) {\n                    triggerClickEvent($el);\n                    $el.moveTo();\n                }\n            });\n            return this;\n        },\n\n        /**\n         * Scrolls to element if out of view, then focuses it\n         *\n         * @method moveToAndFocus\n         * @param selector - jQuery selector for element\n         * @return {Object}\n         */\n        moveToAndFocus: function (selector) {\n            selectorsWithTitlesModified.push(selector);\n            addShortcutsToTitle(selector);\n\n            executor.add(function (e) {\n                var $elem = $(selector);\n                if ($elem.length > 0) {\n                    $elem.trigger('focus');\n                    if ($elem.moveTo) {\n                        $elem.moveTo();\n                    }\n                    if ($elem.is(':input')) {\n                        e.preventDefault();\n                    }\n                }\n            });\n            return this;\n        },\n\n        /**\n         * Binds additional keyboard controls\n         *\n         * @method or\n         * @param {String} keys - keys to bind\n         * @return {Object}\n         */\n        or: function (keys) {\n            bindKeys(keys);\n            return this;\n        },\n\n        /**\n         * Unbinds shortcut keys\n         *\n         * @method unbind\n         */\n        unbind: function () {\n            $(document)\n                .off('keydown keypress', keypressHandler)\n                .off('keydown keypress keyup', defaultPreventionHandler);\n\n            for (var i = 0, len = selectorsWithTitlesModified.length; i < len; i++) {\n                removeShortcutsFromTitle(selectorsWithTitlesModified[i]);\n            }\n            selectorsWithTitlesModified = [];\n        },\n    };\n};\n\n/**\n * Creates keyboard commands and their actions from json data. Format looks like:\n *\n * <pre>\n * [\n *   {\n *        \"keys\":[[\"g\", \"d\"]],\n *        \"context\":\"global\",\n *        \"op\":\"followLink\",\n *        \"param\":\"#home_link\"\n *    },\n *    {\n *        \"keys\":[[\"g\", \"i\"]],\n *        \"context\":\"global\",\n *        \"op\":\"followLink\",\n *        \"param\":\"#find_link\"\n *    },\n *    {\n *        \"keys\":[[\"/\"]],\n *        \"context\":\"global\",\n *        \"op\":\"moveToAndFocus\",\n *        \"param\":\"#quickSearchInput\"\n *    },\n *    {\n *        \"keys\":[[\"c\"]],\n *        \"context\":\"global\",\n *        \"op\":\"moveToAndClick\",\n *        \"param\":\"#create_link\"\n *    }\n * ]\n * </pre>\n *\n * @method fromJSON\n * @static\n * @param json\n */\nwhenIType.fromJSON = function (json, switchCtrlToMetaOnMac) {\n    var shortcuts = [];\n\n    if (json) {\n        $.each(json, function (i, item) {\n            const operation = item.op;\n            const param = item.param;\n            let params;\n\n            if (operation === 'execute' || operation === 'evaluate') {\n                // need to turn function string into function object\n                params = [new Function(param)];\n            } else if (/^\\[[^\\]\\[]*,[^\\]\\[]*\\]$/.test(param)) {\n                // pass in an array to send multiple params\n                try {\n                    params = JSON.parse(param);\n                    // eslint-disable-next-line no-unused-vars\n                } catch (e) {\n                    logger.error(\n                        'When using a parameter array, array must be in strict JSON format: ' +\n                            param\n                    );\n                }\n\n                if (!Array.isArray(params)) {\n                    logger.error(\n                        'Badly formatted shortcut parameter. String or JSON Array of parameters required: ' +\n                            param\n                    );\n                }\n            } else {\n                params = [param];\n            }\n\n            $.each(item.keys, function () {\n                var shortcutList = this;\n                if (switchCtrlToMetaOnMac && isMac) {\n                    shortcutList = $.map(shortcutList, function (shortcutString) {\n                        return shortcutString.replace(/ctrl/i, 'meta');\n                    });\n                }\n\n                var newShortcut = whenIType(shortcutList);\n                newShortcut[operation].apply(newShortcut, params);\n                shortcuts.push(newShortcut);\n            });\n        });\n    }\n\n    return shortcuts;\n};\n\n// Trigger this event on an iframe if you want its keypress events to be propagated (Events to work in iframes).\n$(document).on('iframeAppended', function (e, iframe) {\n    $(iframe).on('load', function () {\n        var $target = $(iframe).contents();\n\n        $target.on('keyup keydown keypress', function (e) {\n            // safari propagates keypress events from iframes\n            if (isSafari && e.type === 'keypress') {\n                return;\n            }\n\n            if (!$(e.target).is(':input')) {\n                $.event.trigger(\n                    e,\n                    arguments, // Preserve original event data.\n                    document, // Bubble this event from the iframe's document to its parent document.\n                    true // Use the capturing phase to preserve original event.target.\n                );\n            }\n        });\n    });\n});\n\nglobalize('whenIType', whenIType);\n\nexport default whenIType;\n","export * from './aui.side-effects';\nexport { log, error, warn } from './behaviours/aui.behaviour.logger';\nimport { i18n as I18n } from './behaviours/aui.behaviour.i18n';\nimport './aui.batch.page';\nimport './aui.batch.patterns';\nimport './aui.batch.iconography';\nexport * from './aui.batch.components';\n// Optional features\nimport './aui.component.form-notification';\nimport './aui.component.form-validation';\nimport { Header } from './aui.component.async-header';\nimport { DatePicker, CalendarWidget } from './aui.component.form.date-select';\nimport { RestfulTable } from './aui.component.restful-table';\nimport { sidebar } from './aui.component.sidebar';\nimport { whenIType } from './behaviours/aui.behaviour.keyboard-shortcuts';\n\nexport { I18n, Header, DatePicker, CalendarWidget, RestfulTable, sidebar, whenIType };\n\nexport const {\n    FocusManager,\n    InlineDialog2,\n    LayerManager,\n    ProgressiveDataSet,\n    clone,\n    debounce,\n    debounceImmediate,\n    dim,\n    escapeHtml,\n    formValidation,\n    id,\n    isClipped,\n    keyCode,\n    layer,\n    messages,\n    populateParameters,\n    params,\n    responsiveheader,\n    select,\n    tablessortable,\n    tabs,\n    undim,\n    _addID,\n} = window.AJS;\n\n// Fix AUI + WRM compatibility in a hacky way.\nexport const { contextPath } = window.AJS;\n"]}